From 01b1fa7e049a0a876192e99abd09ce2d0ec7ba4c Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Tue, 24 Sep 2024 15:05:28 +0800 Subject: [PATCH 001/737] [compute]: enhance get ipmi power status Resolves: ZSTAC-69929 Change-Id: I737370796562776f6f6a6c6e67686c726c636577 --- .../org/zstack/compute/host/HostManagerImpl.java | 16 ++++++++++------ conf/globalConfig/host.xml | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java b/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java index 7bb2bdf10c8..add71191c03 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java @@ -621,33 +621,37 @@ public String getName() { @Override public void run() { - List ipmis = Q.New(HostIpmiVO.class).list(); + List ipmis = Q.New(HostIpmiVO.class) + .list(); + + ipmis = ipmis.stream().filter(i -> destMaker.isManagedByUs(i.getUuid())).collect(Collectors.toList()); new While<>(ipmis).step((ipmi, comp) -> { refreshHostPowerStatus(ipmi); comp.done(); },10).run(new NopeWhileDoneCompletion()); } - @AsyncThread private void refreshHostPowerStatus(HostIpmiVO ipmi) { if (ipmi == null) { return; } HostPowerStatus status = HostIpmiPowerExecutor.getPowerStatus(ipmi); - if ( HostPowerStatus.POWER_BOOTING == ipmi.getIpmiPowerStatus() + if (HostPowerStatus.POWER_BOOTING == ipmi.getIpmiPowerStatus() && HostPowerStatus.POWER_OFF == status) { return; } - if ( HostPowerStatus.POWER_SHUTDOWN == ipmi.getIpmiPowerStatus() + if (HostPowerStatus.POWER_SHUTDOWN == ipmi.getIpmiPowerStatus() && HostPowerStatus.POWER_ON == status) { return; } if (ipmi.getIpmiPowerStatus() != status) { - ipmi.setIpmiPowerStatus(status); - dbf.update(ipmi); + SQL.New(HostIpmiVO.class) + .set(HostIpmiVO_.ipmiPowerStatus, status) + .eq(HostIpmiVO_.uuid, ipmi.getUuid()) + .update(); } } }); diff --git a/conf/globalConfig/host.xml b/conf/globalConfig/host.xml index 795d8535866..ac15a50e580 100755 --- a/conf/globalConfig/host.xml +++ b/conf/globalConfig/host.xml @@ -123,7 +123,7 @@ host host.power.refresh.interval The interval to refresh host power status, in seconds - 30 + 60 java.lang.Integer From 091b36faeec9dad514ed81532c87c973079401d3 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Sat, 12 Oct 2024 13:17:24 +0800 Subject: [PATCH 002/737] [host]: fix wrong diskStatus field in HostInventory's constructor - Enable org.zstack.zwatch.host trace log during test Resolves: ZSTAC-69028 Change-Id: I696971686d6978686a766678726e6f6b696c6e69 Signed-off-by: AlanJager --- header/src/main/java/org/zstack/header/host/HostInventory.java | 2 +- test/src/test/resources/log4j2.xml | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/header/src/main/java/org/zstack/header/host/HostInventory.java b/header/src/main/java/org/zstack/header/host/HostInventory.java index c4f51dca027..35958b05003 100755 --- a/header/src/main/java/org/zstack/header/host/HostInventory.java +++ b/header/src/main/java/org/zstack/header/host/HostInventory.java @@ -225,7 +225,7 @@ protected HostInventory(HostVO vo) { if (vo.getHwMonitorStatus() != null) { this.setCpuStatus(vo.getHwMonitorStatus().getCpuStatus()); this.setMemoryStatus(vo.getHwMonitorStatus().getMemoryStatus()); - this.setDiskStatus(vo.getHwMonitorStatus().getMemoryStatus()); + this.setDiskStatus(vo.getHwMonitorStatus().getDiskStatus()); this.setFanStatus(vo.getHwMonitorStatus().getFanStatus()); this.setPowerSupplyStatus(vo.getHwMonitorStatus().getPowerSupplyStatus()); this.setRaidStatus(vo.getHwMonitorStatus().getRaidStatus()); diff --git a/test/src/test/resources/log4j2.xml b/test/src/test/resources/log4j2.xml index 7b750838e8c..b2c4786637a 100755 --- a/test/src/test/resources/log4j2.xml +++ b/test/src/test/resources/log4j2.xml @@ -175,6 +175,8 @@ + + From 42c1c7644e2fab408400a2248a2a0ab927303c66 Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Mon, 14 Oct 2024 11:36:15 +0800 Subject: [PATCH 003/737] [kvm]: add reason setting for Ansible force run execution Introduced the ability to specify a reason when triggering an Ansible force run, providing clarity on why the force run is necessary. Resolves: ZSTAC-65206 Change-Id: I646365206a6776667067706e7a6e667a796f686d --- .../java/org/zstack/kvm/KVMHostDeployArguments.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostDeployArguments.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostDeployArguments.java index 9a8488b5157..d0056b2e7ef 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostDeployArguments.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostDeployArguments.java @@ -1,7 +1,11 @@ package org.zstack.kvm; import com.google.gson.annotations.SerializedName; +import org.apache.commons.lang.StringUtils; import org.zstack.core.ansible.SyncTimeRequestedDeployArguments; +import org.zstack.header.errorcode.OperationFailureException; + +import static org.zstack.core.Platform.operr; public class KVMHostDeployArguments extends SyncTimeRequestedDeployArguments { @SerializedName("pkg_kvmagent") @@ -161,4 +165,12 @@ public boolean isForceRun() { public void setForceRun(boolean forceRun) { this.forceRun = forceRun; } + + public void enableForceRunWithReason(String reason) { + this.forceRun = true; + if (StringUtils.isEmpty(reason)) { + throw new OperationFailureException(operr("the reason must be stated when setting force run")); + } + logger.info(String.format("set ansible to force run, because %s", reason)); + } } From ebdbdf966ab04e07429a2386a606be6532a86277 Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Fri, 11 Oct 2024 16:27:18 +0800 Subject: [PATCH 004/737] [kvm]: prevent kvmagent from redeploying on every reconnect Fixed the issue where `kvmagent` was redeployed on each reconnection when `SHUTDOWN_HOOK` was enabled. Resolves: ZSTAC-65206 Change-Id: I646365206a6776667067706e7a6e667a796f686d --- .../java/org/zstack/kvm/KVMAgentCommands.java | 11 ++- .../src/main/java/org/zstack/kvm/KVMHost.java | 5 +- .../zstack/kvm/KVMHostDeployArguments.java | 10 --- .../java/org/zstack/kvm/KVMHostFactory.java | 9 +-- .../kvm/host/ReconnectHostCase.groovy | 81 +++++++++++++++++-- 5 files changed, 89 insertions(+), 27 deletions(-) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index 73430bf3b3c..98527a7f975 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -269,8 +269,17 @@ public static class ConnectCmd extends AgentCommand { private boolean ignoreMsrs; private boolean pageTableExtensionDisabled; private int tcpServerPort; + private boolean isInstallHostShutdownHook; private String version; + public boolean isInstallHostShutdownHook() { + return isInstallHostShutdownHook; + } + + public void setInstallHostShutdownHook(boolean installHostShutdownHook) { + isInstallHostShutdownHook = installHostShutdownHook; + } + public boolean isIgnoreMsrs() { return ignoreMsrs; } @@ -4401,7 +4410,7 @@ public static class ReportVmCrashEventCmd { } public static class ReportHostStopEventCmd { - public String hostIp; + public String hostUuid; } public static class ShutdownHostCmd extends AgentCommand { diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 33b2ddc7da4..57d611e1b11 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -4809,6 +4809,7 @@ private ErrorCode connectToAgent() { cmd.setIgnoreMsrs(KVMGlobalConfig.KVM_IGNORE_MSRS.value(Boolean.class)); cmd.setTcpServerPort(KVMGlobalProperty.TCP_SERVER_PORT); cmd.setVersion(dbf.getDbVersion()); + cmd.setInstallHostShutdownHook(KVMGlobalConfig.INSTALL_HOST_SHUTDOWN_HOOK.value(Boolean.class)); if (HostSystemTags.PAGE_TABLE_EXTENSION_DISABLED.hasTag(self.getUuid(), HostVO.class) || !KVMSystemTags.EPT_CPU_FLAG.hasTag(self.getUuid())) { cmd.setPageTableExtensionDisabled(true); } @@ -5427,10 +5428,6 @@ public void run(final FlowTrigger trigger, Map data) { if ("baremetal2".equals(self.getHypervisorType())) { deployArguments.setIsBareMetal2Gateway("true"); } - if (KVMGlobalConfig.INSTALL_HOST_SHUTDOWN_HOOK.value(Boolean.class)) { - deployArguments.setIsInstallHostShutdownHook("true"); - runner.setForceRun(true); - } String enableKsm = rcf.getResourceConfigValue(KVMGlobalConfig.HOST_KSM, self.getUuid(), String.class); kvmHostConfigChecker.setRequireKsmCheck(enableKsm); diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostDeployArguments.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostDeployArguments.java index d0056b2e7ef..71abe7d690d 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostDeployArguments.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostDeployArguments.java @@ -26,8 +26,6 @@ public class KVMHostDeployArguments extends SyncTimeRequestedDeployArguments { private String updatePackages; @SerializedName("post_url") private String postUrl; - @SerializedName("isInstallHostShutdownHook") - private String isInstallHostShutdownHook; @SerializedName("isEnableKsm") private String isEnableKsm; @SerializedName("enable_spice_tls") @@ -105,14 +103,6 @@ public void setPostUrl(String postUrl) { this.postUrl = postUrl; } - public String getIsInstallHostShutdownHook() { - return isInstallHostShutdownHook; - } - - public void setIsInstallHostShutdownHook(String isInstallHostShutdownHook) { - this.isInstallHostShutdownHook = isInstallHostShutdownHook; - } - public String getIsEnableKsm() { return isEnableKsm; } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java index 80fcabd6d36..63ae932df44 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java @@ -549,13 +549,12 @@ public String handleSyncHttpCall(TransmitVmOperationToMnCmd cmd) { }); restf.registerSyncHttpCallHandler(KVMConstant.KVM_REPORT_HOST_STOP_EVENT, ReportHostStopEventCmd.class, cmd -> { - ChangeHostStatusMsg cmsg = new ChangeHostStatusMsg(); - HostVO hostVO = Q.New(HostVO.class).eq(HostVO_.managementIp, cmd.hostIp).find(); - - if (hostVO == null) { + if (StringUtils.isEmpty(cmd.hostUuid)) { return null; } - cmsg.setUuid(hostVO.getUuid()); + + ChangeHostStatusMsg cmsg = new ChangeHostStatusMsg(); + cmsg.setUuid(cmd.hostUuid); cmsg.setStatusEvent(HostStatusEvent.disconnected.toString()); bus.makeTargetServiceIdByResourceUuid(cmsg, HostConstant.SERVICE_ID, cmsg.getHostUuid()); bus.send(cmsg); diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/host/ReconnectHostCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/host/ReconnectHostCase.groovy index d03a1051f76..d07cf6df6db 100755 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/host/ReconnectHostCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/host/ReconnectHostCase.groovy @@ -1,22 +1,26 @@ package org.zstack.test.integration.kvm.host +import org.springframework.http.HttpEntity +import org.springframework.web.util.UriComponentsBuilder +import org.zstack.core.Platform import org.zstack.core.cloudbus.CloudBus import org.zstack.core.db.Q import org.zstack.core.db.SQL import org.zstack.header.host.* +import org.zstack.header.rest.RESTConstant +import org.zstack.header.rest.RESTFacade import org.zstack.header.vm.VmInstanceState -import org.zstack.kvm.KVMAgentCommands -import org.zstack.kvm.KVMConstant -import org.zstack.kvm.KVMHostVO -import org.zstack.kvm.KVMHostVO_ +import org.zstack.kvm.* import org.zstack.sdk.HostInventory import org.zstack.sdk.VmInstanceInventory import org.zstack.test.integration.kvm.Env import org.zstack.test.integration.kvm.KvmTest import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase -import org.zstack.utils.Utils -import org.zstack.utils.logging.CLogger +import org.zstack.utils.gson.JSONObjectUtil + +import static org.zstack.utils.CollectionDSL.e +import static org.zstack.utils.CollectionDSL.map /** * Created by MaJin on 2017-05-01. @@ -24,7 +28,7 @@ import org.zstack.utils.logging.CLogger class ReconnectHostCase extends SubCase { EnvSpec env HostInventory host - private final static CLogger logger = Utils.getLogger(ReconnectHostCase.class) + RESTFacade restf static RECONNECT_TIME = 10 @Override @@ -41,10 +45,12 @@ class ReconnectHostCase extends SubCase { void test() { env.create { host = env.inventoryByName("kvm") + restf = bean(RESTFacade.class) testReconnectHostVmState() testReconnectFailureHostVmState() testUpdateHostDuringConnecting() testChangeHostConnectionState() + testInstallHostShutdownHookCmd() } } @@ -53,6 +59,67 @@ class ReconnectHostCase extends SubCase { env.delete() } + void testInstallHostShutdownHookCmd() { + Boolean installHostShutdownHook = null + env.afterSimulator(KVMConstant.KVM_CONNECT_PATH) { KVMAgentCommands.AgentResponse rsp, HttpEntity e -> + def connectCmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.ConnectCmd.class) + if (connectCmd.hostUuid.equals(host.uuid)) { + installHostShutdownHook = connectCmd.installHostShutdownHook + } + return rsp + } + + reconnectHost { + uuid = host.uuid + } + + assert !installHostShutdownHook + + KVMGlobalConfig.INSTALL_HOST_SHUTDOWN_HOOK.updateValue(true) + + reconnectHost { + uuid = host.uuid + } + + assert installHostShutdownHook + + KVMGlobalConfig.INSTALL_HOST_SHUTDOWN_HOOK.updateValue(KVMGlobalConfig.INSTALL_HOST_SHUTDOWN_HOOK.getDefaultValue()) + + env.cleanAfterSimulatorHandlers() + + def isChangeStatus = false + KVMAgentCommands.ReportHostStopEventCmd cmd = new KVMAgentCommands.ReportHostStopEventCmd() + cmd.hostUuid = Platform.getUuid() + + env.message(ChangeHostStatusMsg.class) { ChangeHostStatusMsg msg, CloudBus bus -> + isChangeStatus = true + ChangeHostStatusReply r = new ChangeHostStatusReply() + bus.reply(msg, r) + } + + Map header = map(e(RESTConstant.COMMAND_PATH, KVMConstant.KVM_REPORT_HOST_STOP_EVENT)) + UriComponentsBuilder ub = UriComponentsBuilder.fromHttpUrl(restf.getBaseUrl()) + ub.path(RESTConstant.COMMAND_CHANNEL_PATH) + String url = ub.build().toUriString() + restf.syncJsonPost(url, JSONObjectUtil.toJsonString(cmd), header, String.class) + + retryInSecs { + assert isChangeStatus + } + + isChangeStatus = false + cmd.hostUuid = null + restf.syncJsonPost(url, JSONObjectUtil.toJsonString(cmd), header, String.class) + + expect(AssertionError.class) { + retryInSecs { + assert isChangeStatus + } + } + + env.cleanMessageHandlers() + } + void testUpdateHostDuringConnecting() { boolean called env.simulator(KVMConstant.KVM_CONNECT_PATH) { From 9e21bb04824e83d7b0a8d93c4aa74ac0733daf7a Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Wed, 16 Oct 2024 07:26:10 +0000 Subject: [PATCH 005/737] [README]: Update readme content Fix invalid hyperlinks Add community QQ group for communication Add compilation instructions and other content Resolves: ZSTAC-70421 Change-Id: I646768677767786c76776e6e7a70627677666274 --- README.zh-CN.md | 100 ++++++++++++++++-------------------------------- 1 file changed, 33 insertions(+), 67 deletions(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index fab094389f7..1559431bad6 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -87,91 +87,57 @@ ZStack采用与OSGi和Eclipse类似的插件系统方式作为核心架构基础 ZStack提供**3套全自动化的严密测试系统**,确保每个功能的代码质量。 -## 安装 +## 安装和使用 安装ZStack极为便捷。用户可按需选择不同的安装模式安装首套ZStack环境。 -* 如需快速尝试,请参阅[快速安装手册](http://en.zstack.io/installation/index.html)。 -* 如需部署生产环境,请参阅[手动安装手册](http://en.zstack.io/installation/manual.html)。 -* 如需部署多管理节点环境,请参阅[多管理节点安装手册](http://en.zstack.io/installation/multi-node.html)。 +* 如需快速尝试,请参阅[快速安装手册](https://www.zstack.io/help/tutorials/quick_install_guide/v5/)。 +* 如需部署生产环境,请参阅[手动安装手册](https://www.zstack.io/help/product_manuals/user_guide/v5/)。 +* 如需部署多管理节点环境,请参阅[多管理节点安装手册](https://www.zstack.io/help/tutorials/double_mn_ha_solution/v5/)。 -安装完成之后,可参考以下手册快速使用云平台: - -* [快速使用云平台(快速安装)](http://en.zstack.io/documentation/getstart-quick.html) -* [快速使用云平台(手动安装)](http://en.zstack.io/documentation/getstart-manual.html) -* [快速使用云平台(多管理节点安装)](http://en.zstack.io/documentation/getstart-multi.html) - -## 教程 - -对于首次使用All in One方式在单台Linux机器上搭建使用ZStack云平台的用户,ZStack提供以下6本教程可供参阅: - -#### Amazon EC2经典弹性IP域: - -* [UI界面](http://en.zstack.io/tutorials/ec2-ui.html) -* [命令行工具](http://en.zstack.io/tutorials/ec2-cli.html) - -#### 扁平网络: - -* [UI界面](http://en.zstack.io/tutorials/flat-network-ui.html) -* [命令行工具](http://en.zstack.io/tutorials/flat-network-cli.html) - -#### 三层网络: - -* [UI界面](http://en.zstack.io/tutorials/three-tiered-ui.html) -* [命令行工具](http://en.zstack.io/tutorials/three-tiered-cli.html) - -#### 安全组: - -* [UI界面](http://en.zstack.io/tutorials/security-group-ui.html) -* [命令行工具](http://en.zstack.io/tutorials/security-group-cli.html) - -#### 弹性端口转发: - -* [UI界面](http://en.zstack.io/tutorials/elastic-port-forwarding-ui.html) -* [命令行工具](http://en.zstack.io/tutorials/elastic-port-forwarding-cli.html) - -#### 快照: - -* [UI界面](http://en.zstack.io/tutorials/snapshot-ui.html) -* [命令行工具](http://en.zstack.io/tutorials/snapshot-cli.html) - -#### 更多 - -关于ZStack架构设计的更多解读,请参阅以下文章: +## ZStack架构设计 #### 伸缩性 -* [ZStack弹性架构揭秘 1:异构架构](http://en.zstack.io/blog/asynchronous-architecture.html) -* [ZStack弹性架构揭秘 2:无状态服务架构](http://en.zstack.io/blog/stateless-clustering.html) -* [ZStack弹性架构揭秘 3:无锁架构](http://en.zstack.io/blog/lock-free.html) +* [ZStack弹性架构揭秘](https://res.zstack.io/assets/pdf/08.pdf) + - 异构架构 + - 无状态服务架构 + - 无锁架构 #### 插件架构 -* [进程内微服务架构](http://en.zstack.io/blog/microservices.html) -* [通用插件系统](http://en.zstack.io/blog/plugin.html) -* [标签系统](http://en.zstack.io/blog/tag.html) -* [工作流引擎](http://en.zstack.io/blog/workflow.html) -* [瀑布流架构](http://en.zstack.io/blog/cascade.html) +* [ZStack插件架构](https://res.zstack.io/assets/pdf/09.pdf) + - 进程内微服务架构 + - 通用插件系统 + - 工作流引擎 -#### 查询API: +#### 资源操作框架 -* [查询API](http://en.zstack.io/blog/query.html) +* [标签系统/级联框架/查询API](https://res.zstack.io/assets/pdf/10.pdf) -#### 自动化: +#### 整体技术架构概述 +* [技术架构概述](https://www.zstack.io/help/product_manuals/white_paper/v5/) -* [全自动化Ansible部署](http://en.zstack.io/blog/ansible.html) +## 社区交流 +* 加入QQ群,共同探讨和分享对ZStack的建议、使用心得、发展方向等。QQ群号:一群(410185063)、二群(443027683)、三群(741300236)、四群(1046295840)、五群(1071894823)、六群(1012034825) -#### 存储与网络: +## 参与贡献 +#### 问题反馈 +1. 提交Issue或通过QQ群反馈问题 +2. 描述如何重现该问题(可选) +3. 可提供解决方案(可选) +4. 提交PR以解决问题(可选) -* [网络模型 1:二层网络和三层网络](http://en.zstack.io/blog/network-l2.html) -* [网络模型 2:云路由器网络服务提供商](http://en.zstack.io/blog/virtual-router.html) -* [存储模型:主存储与镜像服务器](http://en.zstack.io/blog/storage.html) +#### 功能需求 +1. 提交Issue或通过QQ群反馈新功能需求及原因 +2. 指出这个功能的实现方案(可选) +3. 提出PR实现这个新的功能(可选) -#### 测试 +#### 代码贡献 +1. 参考[快速编译手册](https://gitee.com/zstackio/zstack-utility/blob/master/zstackbuild/README.md) 准备一个开发环境 +2. 提交PR请求根据社区反馈进行完善 -* [自动化测试系统 1:综合测试](http://en.zstack.io/blog/integration-testing.html) -* [自动化测试系统2:系统测试](http://en.zstack.io/blog/system-testing.html) -* [自动化测试系统3:模型测试](http://en.zstack.io/blog/model-based-testing.html) +感谢以下小伙伴对本仓库的贡献和反馈[社区贡献榜](https://gitee.com/zstackio/zstack/blob/master/CONTRIBUTORS)! ## 许可证 From be724473eaf6576e5448f52a2dfe3a2255d7ca7d Mon Sep 17 00:00:00 2001 From: shenjin Date: Wed, 4 Sep 2024 17:45:58 +0800 Subject: [PATCH 006/737] [vm]: update scene default to Auto update scene default to Auto, and add scene auto to api start vm Resolves: ZSTAC-61684 Change-Id: I7475787365636f7a756769776f7579746c6f7a6c --- compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java | 1 + conf/globalConfig/vm.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java index 466e1d2ec0d..280a9a89e8b 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java @@ -7053,6 +7053,7 @@ protected void startVm(final Message msg, final Completion completion) { spec.setEnableRDP(VmSystemTags.RDP_ENABLE.getTokenByResourceUuid(self.getUuid(), VmSystemTags.RDP_ENABLE_TOKEN)); spec.setVDIMonitorNumber(VmSystemTags.VDI_MONITOR_NUMBER.getTokenByResourceUuid(self.getUuid(), VmSystemTags.VDI_MONITOR_NUMBER_TOKEN)); spec.setEnableSecurityElement(Boolean.parseBoolean(VmSystemTags.SECURITY_ELEMENT_ENABLE.getTokenByResourceUuid(self.getUuid(), VmSystemTags.SECURITY_ELEMENT_ENABLE_TOKEN))); + spec.setAllocationScene(AllocationScene.Auto); } if (msg instanceof HaStartVmInstanceMsg) { diff --git a/conf/globalConfig/vm.xml b/conf/globalConfig/vm.xml index 66535580dc3..0d4a1744e1d 100755 --- a/conf/globalConfig/vm.xml +++ b/conf/globalConfig/vm.xml @@ -233,7 +233,7 @@ resourceBinding.Scene Scenarios supported by resource binding - All + Auto vm java.lang.String From 6d51f11c3d79b5a67c6b2da844cc9329725b36f0 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Thu, 17 Oct 2024 05:36:00 +0000 Subject: [PATCH 007/737] [Doc]: Update repository contributors Update CONTRIBUTORS file Sort contributors by name Resolves: ZSTAC-70421 Change-Id: I68676369786670726b787473756a616f70797876 --- CONTRIBUTORS | 91 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 86 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 214cca6aae5..eeaaefdfb48 100755 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,9 +1,90 @@ -#Authors ordered by first contribution. +#Authors ordered by name. # # Names should be added to this file like: # Name -Frank Zhang -Yongkang You -Matt Yen -Nan Su +AlanJager ye.zou@zstack.io +anquan.wu anquan.wu@zstack.io +baijiewen 15364719037@163.com +boce.wang boce.wang@zstack.io +Chu Kun luchukun@sjtu.edu.cn +Cui,xingxing xingxing.cui@zstack.io +David Lee live4thee@gmail.com +dengsong.yang dengsong.yang@zstack.io +FuBang bang.fu@zstack.io +fuwei fuwei@sugon.com +fuyi fuyi@sugon.com +gantao tao.gan@zstack.io +Guo Yi yi.guo@zstack.io +haibiao.xiao haibiao.xiao@zstack.io +hanyu.liang hanyu.liang@zstack.io +jialong.dong jialong.dong@zstack.io +JianAZhang jianzhang_pro@foxmail.com +Jianfeng Wu jianfeng.wu@zstack.io +jianzhang jianzhang@zstack.io +jingjing.zhou jingjing.zhou@zstack.io +jin.ma jin.ma@zstack.io +jintao.chen jintao.chen@zstack.io +junfei.wang junfei.wang@zstack.io +kaicai.hu kaicai.hu@zstack.io +kefeng.wang kefeng.wang@zstack.io +Lei Liu lei.liu@zstack.io +le.jin le.jin@zstack.io +liangbo.zhou liangbo.zhou@zstack.io +lianghy hanyu.liang@zstack.io +lining 2313806311@qq.com +lining yaoning.li@zstack.io +lin.ma lin.ma@zstack.io +li.wang li.wang@zstack.io +mahaibin haibin_ma@qq.com +Mei Lei meilei007@gmail.com +miao.DengSheng xuexuemiao@yeah.net +mingjian.deng mingjian.deng@zstack.io +mingmin.wen mingmin.wen@zstack.io +Ning,GuoHui guohui.ning@zstack.io +pengchao.liu pengchao.liu@zstack.io +pengchao.zhang pengchao.zhang@zstack.io +Qi Le qi.le@zstack.io +Qilin.Wang qilin.wang@zstack.io +QiRaining 804470533@qq.com +qiuyu.zhang qiuyu.zhang@zstack.io +Rickylss xiaohaibiao331@outlook.com +Ruan Shixin shixin.ruan@zstack.io +shanshan.ning shanshan.ning@zstack.io +shan.wu shan.wu@zstack.io +Shaohui Liu liushaohui@xiaomi.com +shengyan.zhao shengyan.zhao@zstack.io +shenjin jin.shen@zstack.io +ShiXiao, Chen shixiao.chen@zstack.io +Shixin Ruan shixin.ruan@zstack.io +shuang.he shuang.he@zstack.io +siying.huang siying.huang@zstack.io +sulin.sheng sulin.sheng@zstack.io +Sun, Yu yu.sun@zstack.io +tao.gan tao.gan@zstack.io +tao.yang tao.yang@zstack.io +Tao Yang tao.yang@zstack.io +tianyang tianyang@fusionstack.com +ting.su ting.su@zstack.io +wangjie jie.wang@zstack.io +Wang Jing jing.wang@zstack.io +Wang,Qilin qilin.wang@zstack.io +Wei Wang wei.wang@zstack.io +Wenhao, Zhang wenhao.zhang@zstack.io +Wen, Yubo yubo.wen@zstack.io +Xingwei Yu xingwei.yu@zstack.io +xingxing.cui xingxing.cui@zstack.io +xinhao.huang xinhao.huang@zstack.io +yang.yu yang.yu@zstack.io +yaohua.wu pandawuu@163.com +ye.tian ye.tian@zstack.io +yingzhe.hu yingzhe.hu@zstack.io +zaifeng.wang zaifeng.wang@zstack.io +zhangjf zhangjunfeng@huayunwangji.com +zhangjianjun jianjun.zhang@zstack.io +zhangjunfeng zhangjunfeng@huayunwangji.com +Zhang Wenhao wenhao.zhang@zstack.io +zhanyong.miao zhanyong.miao@zstack.io +Zhou Jingjing jingjing.zhou@zstack.io +zhutianhao zhutianhao75@hotmail.com +zxwing xing5820@gmail.com From 006e58d52f9867b36a560f0d9b277bb91901765d Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Mon, 21 Oct 2024 11:13:28 +0800 Subject: [PATCH 008/737] [compute]: validate root volume size with diskoffering Resolves: ZSTAC-70551 Change-Id: I696e696e6f6b6467616f616c70707a7477626473 --- .../java/org/zstack/compute/vm/VmInstanceManagerImpl.java | 6 +++++- .../main/java/org/zstack/compute/vm/VmQuotaOperator.java | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java index 0adf9ad8bc5..7a1737642cc 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java @@ -2285,7 +2285,11 @@ public List reportQuota() { diskOfferingUuids.addAll(msg.getDataDiskOfferingUuids()); } if (imgType == ImageConstant.ImageMediaType.RootVolumeTemplate) { - allVolumeSizeAsked += imgSize; + if (msg.getRootDiskOfferingUuid() != null) { + diskOfferingUuids.add(msg.getRootDiskOfferingUuid()); + } else { + allVolumeSizeAsked += imgSize; + } } else if (imgType == ImageConstant.ImageMediaType.ISO) { if (msg.getRootDiskOfferingUuid() != null) { diskOfferingUuids.add(msg.getRootDiskOfferingUuid()); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmQuotaOperator.java b/compute/src/main/java/org/zstack/compute/vm/VmQuotaOperator.java index d4f6676a70c..52e10ec6cfd 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmQuotaOperator.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmQuotaOperator.java @@ -523,7 +523,11 @@ private void check(APICreateVmInstanceMsg msg, Map pair diskOfferingUuids.addAll(msg.getDataDiskOfferingUuids()); } if (imgType == ImageConstant.ImageMediaType.RootVolumeTemplate) { - allVolumeSizeAsked += imgSize; + if (msg.getRootDiskOfferingUuid() != null) { + diskOfferingUuids.add(msg.getRootDiskOfferingUuid()); + } else { + allVolumeSizeAsked += imgSize; + } } else if (imgType == ImageConstant.ImageMediaType.ISO) { if (msg.getRootDiskOfferingUuid() != null) { diskOfferingUuids.add(msg.getRootDiskOfferingUuid()); From a4e59548752442325dff1378cc82c21f9209e0a6 Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Mon, 11 Mar 2024 15:19:10 +0800 Subject: [PATCH 009/737] [localstorage]: fix abnormal alarm due to connection reset by peer Fix abnormal alarm due to connection reset by peer Resolves: ZSTAC-63928 Change-Id: I636174617579656566756b6865746c757a747588 (cherry picked from commit 0e95a98304ad3edb143d7458a80698c7eeae05af) (cherry picked from commit 4b52652dd459e589790949d4ff08e5fc4a33907c) --- .../zstack/storage/primary/local/LocalStorageBase.java | 8 +++++--- .../primary/local/LocalStorageHypervisorBackend.java | 2 +- .../storage/primary/local/LocalStorageKvmBackend.java | 7 +++---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java index 9a6464bac28..1ec8926d1dc 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java @@ -2984,15 +2984,17 @@ private void checkLocalStoragePrimaryStorageInitilized(LocalStorageInitParam par if (hostHasInitializedTag(host.getUuid())) { LocalStorageHypervisorFactory f = getHypervisorBackendFactory(host.getHypervisorType()); LocalStorageHypervisorBackend bkd = f.getHypervisorBackend(self); - bkd.checkHostAttachedPSMountPath(host.getUuid(), new Completion(com) { + bkd.checkHostAttachedPSMountPath(host.getUuid(), new ReturnValueCompletion(com) { @Override - public void success() { + public void success(LocalStorageKvmBackend.CheckInitializedFileRsp rsp) { + if (!rsp.existed) { + sendWarnning(host.getUuid(), rsp.getError(), getSelfInventory()); + } com.done(); } @Override public void fail(ErrorCode errorCode) { - sendWarnning(host.getUuid(), errorCode.getDetails(), getSelfInventory()); com.done(); } }); diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageHypervisorBackend.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageHypervisorBackend.java index 838c1285d47..bd1d3e5cd2b 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageHypervisorBackend.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageHypervisorBackend.java @@ -110,7 +110,7 @@ public LocalStorageHypervisorBackend(PrimaryStorageVO self) { abstract void createEmptyVolumeWithBackingFile(VolumeInventory volume, String hostUuid, String backingFile, ReturnValueCompletion completion); - abstract void checkHostAttachedPSMountPath(String hostUuid, Completion completion); + abstract void checkHostAttachedPSMountPath(String hostUuid, ReturnValueCompletion completion); abstract void initializeHostAttachedPSMountPath(String hostUuid, Completion completion); diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java index 6e1839c887a..b26c23e1f6c 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java @@ -3774,7 +3774,7 @@ public void fail(ErrorCode errorCode) { } @Override - void checkHostAttachedPSMountPath(String hostUuid, Completion completion) { + void checkHostAttachedPSMountPath(String hostUuid, ReturnValueCompletion completion) { CheckInitializedFileCmd cmd = new CheckInitializedFileCmd(); cmd.uuid = self.getUuid(); cmd.filePath = makeInitializedFilePath(); @@ -3785,10 +3785,9 @@ void checkHostAttachedPSMountPath(String hostUuid, Completion completion) { @Override public void success(CheckInitializedFileRsp rsp) { if (!rsp.existed) { - completion.fail(operr("cannot find flag file [%s] on host [%s], it might not mount correct path", makeInitializedFilePath(), hostUuid)); - } else { - completion.success(); + rsp.setError(String.format("cannot find flag file [%s] on host [%s], it might not mount correct path", makeInitializedFilePath(), hostUuid)); } + completion.success(rsp); } @Override From c83662767007aac41e394d4ed70857303068383f Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Tue, 29 Oct 2024 15:35:14 +0800 Subject: [PATCH 010/737] [vxlan]: add igmp snooping config GlobalConfigImpact Resolves: ZSTAC-70191 Change-Id: I6b7766777a61726569776d6f64636e7776766877 --- conf/globalConfig/l2Network.xml | 14 ++++++++++ .../network/l2/L2NetworkGlobalConfig.java | 6 ++++ .../java/org/zstack/kvm/KVMAgentCommands.java | 20 +++++++++++++ .../kvm/KVMRealizeL2NoVlanNetworkBackend.java | 3 ++ .../KVMRealizeL2VxlanNetworkBackend.java | 3 ++ .../KVMRealizeL2VxlanNetworkPoolBackend.java | 3 ++ .../VxlanKvmAgentCommands.java | 28 +++++++++++++++++++ 7 files changed, 77 insertions(+) diff --git a/conf/globalConfig/l2Network.xml b/conf/globalConfig/l2Network.xml index c7b50ecd470..f6032411257 100644 --- a/conf/globalConfig/l2Network.xml +++ b/conf/globalConfig/l2Network.xml @@ -14,4 +14,18 @@ l2Network java.lang.Boolean + + igmp.version + igmp version used for linux bridge igmp snooping, 0 means does not change host OS value + 0 + l2Network + java.lang.Integer + + + mld.version + mld version used for linux bridge igmp snooping, 0 means does not change host OS value + 0 + l2Network + java.lang.Integer + \ No newline at end of file diff --git a/network/src/main/java/org/zstack/network/l2/L2NetworkGlobalConfig.java b/network/src/main/java/org/zstack/network/l2/L2NetworkGlobalConfig.java index 0c712ec3d87..953219f6a30 100755 --- a/network/src/main/java/org/zstack/network/l2/L2NetworkGlobalConfig.java +++ b/network/src/main/java/org/zstack/network/l2/L2NetworkGlobalConfig.java @@ -15,4 +15,10 @@ public class L2NetworkGlobalConfig { @GlobalConfigValidation public static GlobalConfig L2IsolatedWithPhysicalSwitch = new GlobalConfig(CATEGORY, "l2.isolated"); + + @GlobalConfigValidation + public static GlobalConfig IGMPVersion = new GlobalConfig(CATEGORY, "igmp.version"); + + @GlobalConfigValidation + public static GlobalConfig MLDVersion = new GlobalConfig(CATEGORY, "mld.version"); } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index 98527a7f975..d32253991c0 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -880,6 +880,10 @@ public static class CreateBridgeCmd extends AgentCommand { private Boolean isolated; @GrayVersion(value = "5.0.0") private String pvlan; + @GrayVersion(value = "5.3.0") + private Integer igmpVersion; + @GrayVersion(value = "5.3.0") + private Integer mldVersion; public String getL2NetworkUuid() { return l2NetworkUuid; @@ -936,6 +940,22 @@ public String getPvlan() { public void setPvlan(String pvlan) { this.pvlan = pvlan; } + + public Integer getIgmpVersion() { + return igmpVersion; + } + + public void setIgmpVersion(Integer igmpVersion) { + this.igmpVersion = igmpVersion; + } + + public Integer getMldVersion() { + return mldVersion; + } + + public void setMldVersion(Integer mldVersion) { + this.mldVersion = mldVersion; + } } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2NoVlanNetworkBackend.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2NoVlanNetworkBackend.java index 5c4ee9c1693..57f988fefe2 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2NoVlanNetworkBackend.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2NoVlanNetworkBackend.java @@ -23,6 +23,7 @@ import org.zstack.kvm.KVMAgentCommands.DeleteBridgeCmd; import org.zstack.kvm.KVMAgentCommands.DeleteBridgeResponse; import org.zstack.kvm.KVMAgentCommands.NicTO; +import org.zstack.network.l2.L2NetworkGlobalConfig; import org.zstack.network.l3.NetworkGlobalProperty; import org.zstack.network.service.MtuGetter; import org.zstack.tag.SystemTagCreator; @@ -56,6 +57,8 @@ public void realize(final L2NetworkInventory l2Network, final String hostUuid, b cmd.setDisableIptables(NetworkGlobalProperty.BRIDGE_DISABLE_IPTABLES); cmd.setMtu(new MtuGetter().getL2Mtu(l2Network)); cmd.setIsolated(l2Network.getIsolated()); + cmd.setIgmpVersion(L2NetworkGlobalConfig.IGMPVersion.value(Integer.class)); + cmd.setMldVersion(L2NetworkGlobalConfig.MLDVersion.value(Integer.class)); KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); msg.setCommand(cmd); diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkBackend.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkBackend.java index e7e5ab78351..b06b6200919 100755 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkBackend.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkBackend.java @@ -1,5 +1,6 @@ package org.zstack.network.l2.vxlan.vxlanNetworkPool; +import org.zstack.network.l2.L2NetworkGlobalConfig; import org.zstack.network.l2.vxlan.vtep.RemoteVtepVO; import org.zstack.network.l2.vxlan.vtep.RemoteVtepVO_; import org.springframework.beans.factory.annotation.Autowired; @@ -124,6 +125,8 @@ public void realize(final L2NetworkInventory l2Network, final String hostUuid, b cmd.setPeers(peers); cmd.setDstport(dstport); cmd.setMtu(new MtuGetter().getL2Mtu(l2Network)); + cmd.setIgmpVersion(L2NetworkGlobalConfig.IGMPVersion.value(Integer.class)); + cmd.setMldVersion(L2NetworkGlobalConfig.MLDVersion.value(Integer.class)); KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); msg.setHostUuid(hostUuid); diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkPoolBackend.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkPoolBackend.java index 9ba3f41fac9..de4f2427330 100755 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkPoolBackend.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkPoolBackend.java @@ -20,6 +20,7 @@ import org.zstack.header.network.l3.L3NetworkInventory; import org.zstack.header.vm.VmNicInventory; import org.zstack.kvm.*; +import org.zstack.network.l2.L2NetworkGlobalConfig; import org.zstack.network.l2.vxlan.vtep.CreateVtepMsg; import org.zstack.network.l2.vxlan.vtep.VtepVO; import org.zstack.network.l2.vxlan.vtep.VtepVO_; @@ -239,6 +240,8 @@ public void run(FlowTrigger trigger, Map data) { bridgeCmd.setDstport(dstport); bridgeCmd.setL2NetworkUuid(vo.getUuid()); bridgeCmd.setMtu(new MtuGetter().getL2Mtu(L2VxlanNetworkInventory.valueOf(vo))); + bridgeCmd.setIgmpVersion(L2NetworkGlobalConfig.IGMPVersion.value(Integer.class)); + bridgeCmd.setMldVersion(L2NetworkGlobalConfig.MLDVersion.value(Integer.class)); cmd.getBridgeCmds().add(bridgeCmd); } diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanKvmAgentCommands.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanKvmAgentCommands.java index fdd6910f9d0..00d623a0e2d 100644 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanKvmAgentCommands.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanKvmAgentCommands.java @@ -1,5 +1,6 @@ package org.zstack.network.l2.vxlan.vxlanNetworkPool; +import org.zstack.core.upgrade.GrayVersion; import org.zstack.core.validation.ConditionalValidation; import org.zstack.kvm.KVMAgentCommands; @@ -103,13 +104,24 @@ public static class DeleteVxlanBridgesResponse extends AgentResponse { public static class CreateVxlanBridgeCmd extends AgentCommand { + @GrayVersion(value = "5.3.0") private String bridgeName; + @GrayVersion(value = "5.3.0") private String vtepIp; + @GrayVersion(value = "5.3.0") private Integer vni; + @GrayVersion(value = "5.3.0") private Integer dstport; + @GrayVersion(value = "5.3.0") private String l2NetworkUuid; + @GrayVersion(value = "5.3.0") private List peers; + @GrayVersion(value = "5.3.0") private Integer mtu; + @GrayVersion(value = "5.3.0") + private Integer igmpVersion; + @GrayVersion(value = "5.3.0") + private Integer mldVersion; public Integer getDstport() { return dstport; @@ -166,6 +178,22 @@ public Integer getMtu() { public void setMtu(Integer mtu) { this.mtu = mtu; } + + public Integer getIgmpVersion() { + return igmpVersion; + } + + public void setIgmpVersion(Integer igmpVersion) { + this.igmpVersion = igmpVersion; + } + + public Integer getMldVersion() { + return mldVersion; + } + + public void setMldVersion(Integer mldVersion) { + this.mldVersion = mldVersion; + } } public static class CreateVxlanBridgeResponse extends CreateBridgeResponse { From d80924f6a6c922e4cdee957c1dd63b4ca24678de Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Mon, 9 Sep 2024 15:53:25 +0800 Subject: [PATCH 011/737] [conf]: define the prefer bs type for zbs ps Resolves: ZSTAC-69690 Change-Id: I6e786f616c6478656165776c6c62756d656e7a68 --- conf/springConfigXml/zbs.xml | 6 ++++++ .../zstack/storage/zbs/ZbsStorageFactory.java | 21 +++++++++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/conf/springConfigXml/zbs.xml b/conf/springConfigXml/zbs.xml index 921d444c18d..2e0234ddc1d 100644 --- a/conf/springConfigXml/zbs.xml +++ b/conf/springConfigXml/zbs.xml @@ -13,8 +13,14 @@ default-init-method="init" default-destroy-method="destroy"> + + + ImageStoreBackupStorage + + + diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java index 5f0421053c4..b16a1758014 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java @@ -1,23 +1,23 @@ package org.zstack.storage.zbs; -import org.zstack.cbd.CbdConstants; import org.zstack.externalStorage.primary.ExternalStorageFencerType; import org.zstack.header.core.ReturnValueCompletion; -import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageSvcBuilder; -import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO; -import org.zstack.header.storage.addon.primary.PrimaryStorageControllerSvc; -import org.zstack.header.storage.addon.primary.PrimaryStorageNodeSvc; +import org.zstack.header.storage.addon.primary.*; import org.zstack.header.volume.VolumeProtocol; import java.util.LinkedHashMap; +import java.util.List; /** * @author Xingwei Yu * @date 2024/3/21 11:56 */ -public class ZbsStorageFactory implements ExternalPrimaryStorageSvcBuilder { +public class ZbsStorageFactory implements ExternalPrimaryStorageSvcBuilder, BackupStorageSelector { public static final ExternalStorageFencerType fencerType = new ExternalStorageFencerType(ZbsConstants.IDENTITY, VolumeProtocol.CBD.toString()); + private List preferBackupStorageTypes; + + @Override public PrimaryStorageControllerSvc buildControllerSvc(ExternalPrimaryStorageVO vo) { return new ZbsStorageController(vo); @@ -33,6 +33,15 @@ public void discover(String url, String config, ReturnValueCompletion preferBackupStorageTypes) { + this.preferBackupStorageTypes = preferBackupStorageTypes; + } + + @Override + public List getPreferBackupStorageTypes() { + return preferBackupStorageTypes; + } + @Override public String getIdentity() { return ZbsConstants.IDENTITY; From b371fc9a1c67ab432faed89df54d469ef67e5df9 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Tue, 24 Sep 2024 16:23:21 +0800 Subject: [PATCH 012/737] [storage]: update handle when volume is null Resolves: ZSTAC-69973 Change-Id: I677a6f7a6f677479666d656263617071716a6969 --- .../storage/addon/primary/ExternalPrimaryStorage.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index 837dfa74ce5..115524fb5ae 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -1352,8 +1352,10 @@ protected void handle(DeleteVolumeBitsOnPrimaryStorageMsg msg) { boolean force = false; if (VolumeVO.class.getSimpleName().equals(msg.getBitsType()) && msg.getBitsUuid() != null) { VolumeVO volume = Q.New(VolumeVO.class).eq(VolumeVO_.uuid, msg.getBitsUuid()).find(); - protocol = volume.getProtocol(); - if (VolumeType.Root.equals(volume.getType()) && VolumeProtocol.iSCSI.toString().equals(protocol)) { + if (volume != null) { + protocol = volume.getProtocol(); + } + if (volume != null && VolumeType.Root.equals(volume.getType()) && VolumeProtocol.iSCSI.toString().equals(protocol)) { force = true; } } From dbc8401799d2aed4adae5f83246c97e3fd05f403 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Sun, 29 Sep 2024 16:17:06 +0800 Subject: [PATCH 013/737] [storage]: update protocol of target volume during live migratation Resolves: ZSTAC-69987 Change-Id: I6870726b78796a6b756970676e636f74676d6f64 --- storage/src/main/java/org/zstack/storage/volume/VolumeBase.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java b/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java index 390e79c54fd..2a67b21654a 100755 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java @@ -1427,6 +1427,7 @@ protected void scripts() { .set(VolumeVO_.rootImageUuid, volume.getRootImageUuid()) .set(VolumeVO_.primaryStorageUuid, volume.getPrimaryStorageUuid()) .set(VolumeVO_.actualSize, volume.getActualSize()) + .set(VolumeVO_.protocol, volume.getProtocol()) .update(); sql(VolumeVO.class) @@ -1436,6 +1437,7 @@ protected void scripts() { .set(VolumeVO_.rootImageUuid, transientVolume.getRootImageUuid()) .set(VolumeVO_.primaryStorageUuid, transientVolume.getPrimaryStorageUuid()) .set(VolumeVO_.actualSize, transientVolume.getActualSize()) + .set(VolumeVO_.protocol, transientVolume.getProtocol()) .update(); pluginRgty.getExtensionList(OverwriteVolumeExtensionPoint.class).forEach(it -> From 6e61b45659d3c1eb5c595491f02cffe51e07f016 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Mon, 30 Sep 2024 13:21:26 +0800 Subject: [PATCH 014/737] [plugin]: not supported flatten with zbs ps Resolves: ZSTAC-69834 Change-Id: I64766575796677657075776f7372787765786e61 --- .../main/java/org/zstack/storage/zbs/ZbsStorageController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index f223755fb6d..2950a5ee524 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -572,7 +572,7 @@ public void fail(ErrorCode errorCode) { @Override public void flattenVolume(String installPath, ReturnValueCompletion comp) { - + comp.fail(operr("not supported flatten volume with zbs primary storage.")); } @Override From aabd9027d6b43468998b65eb855debe87bb3b425 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Wed, 9 Oct 2024 13:47:31 +0800 Subject: [PATCH 015/737] [plugin]: get mds external address Resolves: ZSTAC-69112 Change-Id: I787a776f68647262696e656966627462616c7275 --- .../main/java/org/zstack/cbd/AddonInfo.java | 2 +- .../src/main/java/org/zstack/cbd/MdsInfo.java | 45 +++++------ .../org/zstack/cbd/kvm/KvmCbdCommands.java | 2 +- .../org/zstack/cbd/kvm/KvmCbdNodeServer.java | 3 +- .../storage/zbs/ZbsPrimaryStorageMdsBase.java | 27 ++++++- .../storage/zbs/ZbsStorageController.java | 40 +++++----- .../addon/primary/ExternalPrimaryStorage.java | 5 -- .../addon/zbs/ZbsPrimaryStorageCase.groovy | 77 ++++++++++++++++++- .../testlib/ExternalPrimaryStorageSpec.groovy | 14 +++- 9 files changed, 156 insertions(+), 59 deletions(-) diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/AddonInfo.java b/plugin/cbd/src/main/java/org/zstack/cbd/AddonInfo.java index 7e44395645f..40b140c7afc 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/AddonInfo.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/AddonInfo.java @@ -7,7 +7,7 @@ * @date 2024/4/1 18:12 */ public class AddonInfo { - public List mdsInfos; + private List mdsInfos; public List getMdsInfos() { return mdsInfos; diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java b/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java index d35182c76c9..d0f793747cf 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java @@ -5,13 +5,12 @@ * @date 2024/4/10 23:18 */ public class MdsInfo { - public String sshUsername; - public String sshPassword; - public int sshPort = 22; - public String mdsAddr; - public int mdsPort = 6666; - public MdsStatus mdsStatus; - public String mdsVersion; + private String sshUsername; + private String sshPassword; + private int sshPort = 22; + private String mdsAddr; + private String mdsExternalAddr; + private MdsStatus mdsStatus; public String getSshUsername() { return sshUsername; @@ -29,14 +28,6 @@ public void setSshPassword(String sshPassword) { this.sshPassword = sshPassword; } - public String getMdsAddr() { - return mdsAddr; - } - - public void setMdsAddr(String mdsAddr) { - this.mdsAddr = mdsAddr; - } - public int getSshPort() { return sshPort; } @@ -45,12 +36,20 @@ public void setSshPort(int sshPort) { this.sshPort = sshPort; } - public int getMdsPort() { - return mdsPort; + public String getMdsAddr() { + return mdsAddr; + } + + public void setMdsAddr(String mdsAddr) { + this.mdsAddr = mdsAddr; + } + + public String getMdsExternalAddr() { + return mdsExternalAddr; } - public void setMdsPort(int mdsPort) { - this.mdsPort = mdsPort; + public void setMdsExternalAddr(String mdsExternalAddr) { + this.mdsExternalAddr = mdsExternalAddr; } public MdsStatus getMdsStatus() { @@ -60,12 +59,4 @@ public MdsStatus getMdsStatus() { public void setMdsStatus(MdsStatus mdsStatus) { this.mdsStatus = mdsStatus; } - - public String getMdsVersion() { - return mdsVersion; - } - - public void setMdsVersion(String mdsVersion) { - this.mdsVersion = mdsVersion; - } } diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java index 22d9cdbd38d..dfaf6e0c89d 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java @@ -19,7 +19,7 @@ public static class AgentRsp { } public static class KvmUpdateClientConfCmd extends AgentCmd { - public List mdsInfos; + private List mdsInfos; public List getMdsInfos() { return mdsInfos; diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java index 3b431ab3774..e931525f0a3 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java @@ -99,8 +99,7 @@ public void run(FlowTrigger trigger, Map data) { List mdsInfos = new ArrayList<>(); for (MdsInfo mdsInfo : addonInfo.getMdsInfos()) { MdsInfo info = new MdsInfo(); - info.mdsAddr = mdsInfo.mdsAddr; - info.mdsPort = mdsInfo.mdsPort; + info.setMdsExternalAddr(mdsInfo.getMdsExternalAddr()); mdsInfos.add(info); } cmd.setMdsInfos(mdsInfos); diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java index 08917b1659e..a81031c8093 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java @@ -282,18 +282,30 @@ private void pingMds(final Completion completion) { new While<>(stepCount).each((step, comp) -> { PingCmd cmd = new PingCmd(); - cmd.setMdsAddr(getSelf().getMdsAddr()); + cmd.setMdsExternalAddr(getSelf().getMdsExternalAddr()); restf.asyncJsonPost(ZbsAgentUrl.primaryStorageUrl(getSelf().getMdsAddr(), PING_PATH), cmd, new JsonAsyncRESTCallback(completion) { @Override public void success(PingRsp rsp) { - comp.allDone(); + if (rsp.isSuccess()){ + comp.allDone(); + return; + } + + comp.addError(operr("%s", rsp.getError())); + + if (step.equals(MAX_PING_CNT)) { + comp.allDone(); + return; + } + + comp.done(); } @Override public void fail(ErrorCode errorCode) { - logger.warn(String.format("ping zbs primary storage mds[%s] failed (%d/%d): %s", getSelf().getMdsAddr(), step, MAX_PING_CNT, errorCode.toString())); + logger.warn(String.format("ping zbs primary storage mds[%s] failed (%d/%d): %s", getSelf().getMdsExternalAddr(), step, MAX_PING_CNT, errorCode.toString())); comp.addError(errorCode); if (step.equals(MAX_PING_CNT)) { @@ -325,6 +337,15 @@ public static class PingRsp extends ZbsMdsBase.AgentResponse { } public static class PingCmd extends ZbsMdsBase.AgentCommand { + private String mdsExternalAddr; + + public String getMdsExternalAddr() { + return mdsExternalAddr; + } + + public void setMdsExternalAddr(String mdsExternalAddr) { + this.mdsExternalAddr = mdsExternalAddr; + } } @Override diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 2950a5ee524..04df73b12ea 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -80,6 +80,7 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar public static final String ROLLBACK_SNAPSHOT_PATH = "/zbs/primarystorage/snapshot/rollback"; private static final String ZBS_CBD_LUN_PATH_FORMAT = "cbd:%s/%s/%s"; + private static final Integer SUPPORT_MINIMUM_MDS_NUMBER = 2; private static final StorageCapabilities capabilities = new StorageCapabilities(); @@ -203,7 +204,6 @@ public void connect(String cfg, String url, ReturnValueCompletion mdsInfo.setSshPassword(uri.getSshPassword()); mdsInfo.setSshPort(uri.getSshPort()); mdsInfo.setMdsAddr(uri.getHostname()); - mdsInfo.setMdsPort(uri.getMdsPort()); mdsInfos.add(mdsInfo); } @@ -274,17 +274,15 @@ public void run(FlowTrigger trigger, Map data) { @Override public void run(FlowTrigger trigger, Map data) { - String mdsListenAddr = mds.stream().map(m -> m.getSelf().getMdsAddr() + ":" + m.getSelf().getMdsPort()).collect(Collectors.joining(",")); List errors = new ArrayList<>(); new While<>(mds).each((m, comp) -> { GetFactsCmd cmd = new GetFactsCmd(); cmd.setUuid(self.getUuid()); cmd.setMdsAddr(m.getSelf().getMdsAddr()); - cmd.setMdsListenAddr(mdsListenAddr); m.httpCall(GET_FACTS_PATH, cmd, GetFactsRsp.class, new ReturnValueCompletion(comp) { @Override public void success(GetFactsRsp returnValue) { - m.getSelf().setMdsVersion(returnValue.version); + m.getSelf().setMdsExternalAddr(returnValue.getMdsExternalAddr()); comp.done(); } @@ -354,6 +352,21 @@ public void done(ErrorCodeList errorCodeList) { SQL.New(ExternalPrimaryStorageVO.class).eq(ExternalPrimaryStorageVO_.uuid, self.getUuid()) .set(ExternalPrimaryStorageVO_.addonInfo, JSONObjectUtil.toJsonString(addonInfo)) .update(); + + boolean isConnected = addonInfo.getMdsInfos().stream() + .filter(mdsInfo -> MdsStatus.Connected.equals(mdsInfo.getMdsStatus())) + .count() >= SUPPORT_MINIMUM_MDS_NUMBER; + + if (!isConnected) { + String notConnectedIps = addonInfo.getMdsInfos().stream() + .filter(mdsInfo -> !MdsStatus.Connected.equals(mdsInfo.getMdsStatus())) + .map(MdsInfo::getMdsAddr) + .collect(Collectors.joining(", ")); + + completion.fail(operr("at least %d of the MDS nodes exist in the Connected state, " + + "the following MDS nodes[%s] are not Connected.", SUPPORT_MINIMUM_MDS_NUMBER, notConnectedIps)); + return; + } completion.success(); } }); @@ -1213,14 +1226,14 @@ public void setUsedSize(long usedSize) { } public static class GetFactsRsp extends AgentResponse { - private String version; + private String mdsExternalAddr; - public String getVersion() { - return version; + public String getMdsExternalAddr() { + return mdsExternalAddr; } - public void setVersion(String version) { - this.version = version; + public void setMdsExternalAddr(String mdsExternalAddr) { + this.mdsExternalAddr = mdsExternalAddr; } } @@ -1585,15 +1598,6 @@ public void setLogicalPoolName(String logicalPoolName) { } public static class GetFactsCmd extends AgentCommand { - private String mdsListenAddr; - - public String getMdsListenAddr() { - return mdsListenAddr; - } - - public void setMdsListenAddr(String mdsListenAddr) { - this.mdsListenAddr = mdsListenAddr; - } } public static class AgentResponse extends ZbsMdsBase.AgentResponse { diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index 115524fb5ae..aecdb55b08b 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -1779,11 +1779,6 @@ public void setup() { flow(new NoRollbackFlow() { final String __name__ = "ping-storage"; - @Override - public boolean skip(Map data) { - return CoreGlobalProperty.UNIT_TEST_ON; - } - @Override public void run(FlowTrigger trigger, Map data) { controller.ping(new Completion(trigger) { diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index 9694b353c26..4aecfbea46c 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -1,7 +1,12 @@ package org.zstack.test.integration.storage.primary.addon.zbs import org.springframework.http.HttpEntity +import org.zstack.core.db.Q +import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO +import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO_ +import org.zstack.header.storage.primary.PrimaryStorageStatus import org.zstack.sdk.* +import org.zstack.storage.primary.PrimaryStorageGlobalConfig import org.zstack.storage.zbs.ZbsPrimaryStorageMdsBase import org.zstack.storage.zbs.ZbsStorageController import org.zstack.test.integration.storage.StorageTest @@ -9,6 +14,7 @@ import org.zstack.testlib.EnvSpec import org.zstack.testlib.HttpError import org.zstack.testlib.SubCase import org.zstack.utils.data.SizeUnit +import org.zstack.utils.gson.JSONObjectUtil /** * @author Xingwei Yu @@ -126,6 +132,9 @@ class ZbsPrimaryStorageCase extends SubCase { testZbsStorageLifecycle() testDataVolumeLifecycle() + PrimaryStorageGlobalConfig.PING_INTERVAL.updateValue(1) + testZbsPrimaryStorageMdsPing() + PrimaryStorageGlobalConfig.PING_INTERVAL.updateValue(60) testZbsStorageNegativeScenario() testDataVolumeNegativeScenario() } @@ -155,6 +164,63 @@ class ZbsPrimaryStorageCase extends SubCase { } } + void testZbsPrimaryStorageMdsPing() { + Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Connected + + def addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() + + assert addonInfo == "{\"mdsInfos\":[{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.1\",\"mdsExternalAddr\":\"1.1.1.1:6666\",\"mdsStatus\":\"Connected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.2\",\"mdsExternalAddr\":\"1.1.1.2:6666\",\"mdsStatus\":\"Connected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.3\",\"mdsExternalAddr\":\"1.1.1.3:6666\",\"mdsStatus\":\"Connected\"}]}" + + env.afterSimulator(ZbsPrimaryStorageMdsBase.PING_PATH) { rsp, HttpEntity e -> + def cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) + ZbsPrimaryStorageMdsBase.PingRsp pingRsp = new ZbsPrimaryStorageMdsBase.PingRsp() + if (cmd.mdsExternalAddr.equals("1.1.1.1:6666")) { + pingRsp.success = false + pingRsp.error = "on purpose" + } + + return pingRsp + } + + sleep(2000) + + addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() + + assert addonInfo == "{\"mdsInfos\":[{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.1\",\"mdsExternalAddr\":\"1.1.1.1:6666\",\"mdsStatus\":\"Disconnected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.2\",\"mdsExternalAddr\":\"1.1.1.2:6666\",\"mdsStatus\":\"Connected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.3\",\"mdsExternalAddr\":\"1.1.1.3:6666\",\"mdsStatus\":\"Connected\"}]}" + + assert Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Connected + + env.afterSimulator(ZbsPrimaryStorageMdsBase.PING_PATH) { rsp, HttpEntity e -> + def cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) + ZbsPrimaryStorageMdsBase.PingRsp pingRsp = new ZbsPrimaryStorageMdsBase.PingRsp() + if (cmd.mdsExternalAddr.equals("1.1.1.1:6666")) { + pingRsp.success = false + pingRsp.error = "on purpose" + } else if (cmd.mdsExternalAddr.equals("1.1.1.2:6666")) { + pingRsp.success = false + pingRsp.error = "on purpose" + } + + return pingRsp + } + + sleep(1000) + + addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() + + assert addonInfo == "{\"mdsInfos\":[{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.1\",\"mdsExternalAddr\":\"1.1.1.1:6666\",\"mdsStatus\":\"Disconnected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.2\",\"mdsExternalAddr\":\"1.1.1.2:6666\",\"mdsStatus\":\"Disconnected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.3\",\"mdsExternalAddr\":\"1.1.1.3:6666\",\"mdsStatus\":\"Connected\"}]}" + + assert Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Disconnected + + env.cleanAfterSimulatorHandlers() + + reconnectPrimaryStorage { + uuid = ps.uuid + } + + Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Connected + } + void testDataVolumeLifecycle() { vol = createDataVolume { name = "test" @@ -219,8 +285,17 @@ class ZbsPrimaryStorageCase extends SubCase { } env.simulator(ZbsStorageController.GET_FACTS_PATH) { HttpEntity e, EnvSpec spec -> + ZbsStorageController.GetFactsCmd cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.GetFactsCmd.class) + def rsp = new ZbsStorageController.GetFactsRsp() - rsp.version = "1.4.0+6e9353ad+release" + if (cmd.getMdsAddr().equals("127.0.2.1")) { + rsp.setMdsExternalAddr("1.1.2.1:6666") + } else if (cmd.mdsAddr.equals("127.0.2.2")) { + rsp.setMdsExternalAddr("1.1.2.2:6666") + } else if (cmd.mdsAddr.equals("127.0.2.3")) { + rsp.setMdsExternalAddr("1.1.2.3:6666") + } + return rsp } diff --git a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy index 38a1ab13775..9dcd26d458b 100644 --- a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy @@ -44,13 +44,25 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { return [:] } + simulator(ZbsPrimaryStorageMdsBase.PING_PATH) { + ZbsPrimaryStorageMdsBase.PingRsp rsp = new ZbsPrimaryStorageMdsBase.PingRsp() + rsp.success = true + return rsp + } + simulator(ZbsStorageController.GET_FACTS_PATH) { HttpEntity e, EnvSpec spec -> ZbsStorageController.GetFactsCmd cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.GetFactsCmd.class) ExternalPrimaryStorageSpec zspec = spec.specByUuid(cmd.uuid) assert zspec != null: "cannot found zbs primary storage[uuid:${cmd.uuid}], check your environment()." def rsp = new ZbsStorageController.GetFactsRsp() - rsp.setVersion("1.4.0+6e9353ad+release") + if (cmd.mdsAddr.equals("127.0.1.1")) { + rsp.setMdsExternalAddr("1.1.1.1:6666") + } else if (cmd.mdsAddr.equals("127.0.1.2")) { + rsp.setMdsExternalAddr("1.1.1.2:6666") + } else if (cmd.mdsAddr.equals("127.0.1.3")) { + rsp.setMdsExternalAddr("1.1.1.3:6666") + } return rsp } From 82952a26fd811fdf64df41e07141df140cfa8d2a Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Tue, 15 Oct 2024 14:45:39 +0800 Subject: [PATCH 016/737] [plugin]: abstract node server deployment client implementation Resolves: ZSTAC-69016 Change-Id: I6b63786d6176706575626d6277616d65786a7072 --- .../addon/primary/PrimaryStorageNodeSvc.java | 2 + .../org/zstack/cbd/kvm/KvmCbdCommands.java | 1 - .../org/zstack/cbd/kvm/KvmCbdNodeServer.java | 22 +--- .../zstack/expon/ExponStorageController.java | 5 + .../kvm/ExternalPrimaryStorageKvmFactory.java | 80 ++++++++++-- .../xinfini/XInfiniStorageController.java | 5 + .../storage/zbs/ZbsStorageController.java | 119 ++++++++++++++++++ .../addon/zbs/ZbsPrimaryStorageCase.groovy | 46 ++++++- .../testlib/ExternalPrimaryStorageSpec.groovy | 11 ++ 9 files changed, 259 insertions(+), 32 deletions(-) diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageNodeSvc.java b/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageNodeSvc.java index e36f2ca6956..f292e694183 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageNodeSvc.java +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageNodeSvc.java @@ -23,6 +23,8 @@ public interface PrimaryStorageNodeSvc { List getActiveVolumesLocation(HostInventory h); + void deployClient(HostInventory h, Completion comp); + void activateHeartbeatVolume(HostInventory h, ReturnValueCompletion comp); void deactivateHeartbeatVolume(HostInventory h, Completion comp); diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java index dfaf6e0c89d..218fefe3095 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java @@ -10,7 +10,6 @@ * @date 2024/4/10 15:40 */ public class KvmCbdCommands { - public static final String CBD_CONFIGURE_CLIENT_PATH = "/cbd/configure/client"; public static final String CBD_SETUP_SELF_FENCER_PATH = "/ha/cbd/setupselffencer"; public static class AgentRsp { diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java index e931525f0a3..9c7eb4e7acc 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java @@ -84,29 +84,13 @@ public void kvmSetupSelfFencer(KvmSetupSelfFencerParam param, Completion complet @Override public void setup() { flow(new NoRollbackFlow() { - final String __name__ = "configure-cbd-client-on-kvm"; + final String __name__ = "deploy-client"; @Override public void run(FlowTrigger trigger, Map data) { - ExternalPrimaryStorageVO vo = dbf.findByUuid(param.getPrimaryStorage().getUuid(), ExternalPrimaryStorageVO.class); - if (vo == null) { - trigger.fail(operr("not found primary storage[uuid:%s].", param.getPrimaryStorage().getUuid())); - return; - } - - KvmUpdateClientConfCmd cmd = new KvmUpdateClientConfCmd(); - AddonInfo addonInfo = StringUtils.isEmpty(vo.getAddonInfo()) ? new AddonInfo() : JSONObjectUtil.toObject(vo.getAddonInfo(), AddonInfo.class); - List mdsInfos = new ArrayList<>(); - for (MdsInfo mdsInfo : addonInfo.getMdsInfos()) { - MdsInfo info = new MdsInfo(); - info.setMdsExternalAddr(mdsInfo.getMdsExternalAddr()); - mdsInfos.add(info); - } - cmd.setMdsInfos(mdsInfos); - - httpCall(KvmCbdCommands.CBD_CONFIGURE_CLIENT_PATH, param.getHostUuid(), cmd, true, AgentRsp.class, new ReturnValueCompletion(trigger) { + nodeSvc.deployClient(host, new Completion(trigger) { @Override - public void success(AgentRsp returnValue) { + public void success() { trigger.next(); } diff --git a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java index 31d1d2f9567..9d1b89ea9b4 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java +++ b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java @@ -492,6 +492,11 @@ public List getActiveVolumesLocation(HostInventory h) { return Collections.singletonList("file://" + PathUtil.join(vhostSocketDir, "volume-*")); } + @Override + public void deployClient(HostInventory h, Completion comp) { + comp.success(); + } + @Override public List getActiveClients(String installPath, String protocol) { if (VolumeProtocol.Vhost.toString().equals(protocol)) { diff --git a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/kvm/ExternalPrimaryStorageKvmFactory.java b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/kvm/ExternalPrimaryStorageKvmFactory.java index 99ace139e8b..8675d0a501e 100644 --- a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/kvm/ExternalPrimaryStorageKvmFactory.java +++ b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/kvm/ExternalPrimaryStorageKvmFactory.java @@ -9,11 +9,9 @@ import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.core.db.SQL; +import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.header.core.*; -import org.zstack.header.core.workflow.Flow; -import org.zstack.header.core.workflow.FlowTrigger; -import org.zstack.header.core.workflow.NoRollbackFlow; -import org.zstack.header.core.workflow.NopeFlow; +import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.host.HostInventory; @@ -86,18 +84,21 @@ public Flow createKvmHostConnectingFlow(KVMHostConnectedContext context) { } return new NoRollbackFlow() { - final String __name__ = "external-primary-storage-kvm-host-connecting-flow"; + final String __name__ = "prepare-external-primary-storage"; @Override public void run(FlowTrigger trigger, Map data) { - checkHostStatus(context.getInventory(), extPss, new WhileDoneCompletion(trigger) { + doPrepareExternalPrimaryStorage(context, extPss, new Completion(trigger) { @Override - public void done(ErrorCodeList errList) { - data.put(KVMConstant.CONNECT_HOST_PRIMARYSTORAGE_ERROR, errList); + public void success() { trigger.next(); } - }); + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); } }; } @@ -118,8 +119,67 @@ public void done(ErrorCodeList errList) { }); } - private void checkHostStatus(KVMHostInventory host, List extPss, WhileDoneCompletion completion) { + private void doPrepareExternalPrimaryStorage(final KVMHostConnectedContext context, List extPss, Completion completion) { + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName("do-prepare-external-primary-storage"); + chain.then(new NoRollbackFlow() { + String __name__ = "deploy-client"; + + @Override + public void run(FlowTrigger trigger, Map data) { + deployClient(context, extPss, new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + trigger.next(); + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = "check-host-status"; + + @Override + public void run(FlowTrigger trigger, Map data) { + checkHostStatus(context.getInventory(), extPss, new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errList) { + data.put(KVMConstant.CONNECT_HOST_PRIMARYSTORAGE_ERROR, errList); + trigger.next(); + } + }); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).start(); + } + private void deployClient(final KVMHostConnectedContext context, List extPss, WhileDoneCompletion completion) { + new While<>(extPss).each((extPs, compl) -> { + logger.debug(String.format("deploying client for external primary storage[uuid:%s, name:%s] on KVM host[uuid:%s, name:%s]", + extPs.getUuid(), extPs.getName(), context.getInventory().getUuid(), context.getInventory().getName())); + extPsFactory.getNodeSvc(extPs.getUuid()).deployClient(context.getInventory(), new Completion(compl) { + @Override + public void success() { + compl.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + compl.addError(errorCode); + compl.done(); + } + }); + }).run(completion); + } + + private void checkHostStatus(KVMHostInventory host, List extPss, WhileDoneCompletion completion) { Map hostStatus = getHostStatus(extPss); new While<>(extPss).each((extPs, compl) -> { logger.debug(String.format("checking host status for external primary storage[uuid:%s, name:%s] on KVM host[uuid:%s, name:%s]", diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index cb4eabe942a..522eeff22e0 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -385,6 +385,11 @@ public List getActiveVolumesLocation(HostInventory h) { return Collections.singletonList("file://" + PathUtil.join(vhostSocketDir, "volume-*")); } + @Override + public void deployClient(HostInventory h, Completion comp) { + comp.success(); + } + @Override public synchronized void activateHeartbeatVolume(HostInventory h, ReturnValueCompletion comp) { String clientIqn = IscsiUtils.getHostInitiatorName(h.getUuid()); diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 04df73b12ea..143e716673d 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -10,6 +10,7 @@ import org.zstack.core.CoreGlobalProperty; import org.zstack.core.asyncbatch.While; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; import org.zstack.core.db.SQL; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; @@ -23,17 +24,23 @@ import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.errorcode.SysErrors; import org.zstack.header.exception.CloudRuntimeException; +import org.zstack.header.host.HostAO_; import org.zstack.header.host.HostInventory; +import org.zstack.header.host.HostVO; import org.zstack.header.image.ImageConstant; import org.zstack.header.rest.RESTFacade; import org.zstack.header.storage.addon.*; import org.zstack.header.storage.addon.primary.*; +import org.zstack.header.storage.primary.PrimaryStorageClusterRefVO; +import org.zstack.header.storage.primary.PrimaryStorageClusterRefVO_; import org.zstack.header.storage.primary.PrimaryStorageStatus; import org.zstack.header.storage.primary.VolumeSnapshotCapability; import org.zstack.header.storage.snapshot.VolumeSnapshotStats; import org.zstack.header.volume.VolumeConstant; import org.zstack.header.volume.VolumeProtocol; import org.zstack.header.volume.VolumeStats; +import org.zstack.kvm.KVMHostVO; +import org.zstack.kvm.KVMHostVO_; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.data.SizeUnit; @@ -65,6 +72,7 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar private AddonInfo addonInfo; private Config config; + public static final String DEPLOY_CLIENT_PATH = "/zbs/primarystorage/client/deploy"; public static final String GET_FACTS_PATH = "/zbs/primarystorage/facts"; public static final String GET_CAPACITY_PATH = "/zbs/primarystorage/capacity"; public static final String COPY_PATH = "/zbs/primarystorage/copy"; @@ -147,6 +155,30 @@ public List getActiveVolumesLocation(HostInventory h) { return null; } + @Override + public void deployClient(HostInventory h, Completion comp) { + String clientPassword = Q.New(KVMHostVO.class).select(KVMHostVO_.password).eq(KVMHostVO_.uuid, h.getUuid()).findValue(); + if (clientPassword == null) { + comp.fail(operr("failed to get client[uuid:%s] password", h.getUuid())); + } + + DeployClientCmd cmd = new DeployClientCmd(); + cmd.setClientIp(h.getManagementIp()); + cmd.setClientPassword(clientPassword); + + httpCall(DEPLOY_CLIENT_PATH, cmd, DeployClientRsp.class, new ReturnValueCompletion(comp) { + @Override + public void success(DeployClientRsp returnValue) { + comp.success(); + } + + @Override + public void fail(ErrorCode errorCode) { + comp.fail(errorCode); + } + }); + } + @Override public synchronized void activateHeartbeatVolume(HostInventory h, ReturnValueCompletion comp) { reloadDbInfo(); @@ -306,6 +338,68 @@ public void done(ErrorCodeList errorCodeList) { } }); + flow(new NoRollbackFlow() { + String __name__ = "deploy-client"; + + List refs = Q.New(PrimaryStorageClusterRefVO.class) + .eq(PrimaryStorageClusterRefVO_.primaryStorageUuid, self.getUuid()) + .list(); + + @Override + public boolean skip(Map data) { + return refs.isEmpty(); + } + + @Override + public void run(FlowTrigger trigger, Map data) { + List clusterUuids = refs.stream() + .map(PrimaryStorageClusterRefVO::getClusterUuid) + .collect(Collectors.toList()); + + List hosts = Q.New(HostVO.class) + .in(HostAO_.clusterUuid, clusterUuids) + .list(); + + new While<>(hosts).each((h, comp) -> { + String clientPassword = Q.New(KVMHostVO.class) + .select(KVMHostVO_.password) + .eq(KVMHostVO_.uuid, h.getUuid()) + .findValue(); + + if (clientPassword == null) { + comp.addError(operr("failed to get client[uuid:%s] password.", h.getUuid())); + } + + DeployClientCmd cmd = new DeployClientCmd(); + cmd.setClientIp(h.getManagementIp()); + cmd.setClientPassword(clientPassword); + + httpCall(DEPLOY_CLIENT_PATH, cmd, DeployClientRsp.class, new ReturnValueCompletion(comp) { + @Override + public void success(DeployClientRsp returnValue) { + comp.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + comp.addError(errorCode); + comp.done(); + } + }); + }).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + trigger.fail(errorCodeList.getCauses().get(0)); + return; + } + + trigger.next(); + } + }); + } + }); + done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { @@ -1225,6 +1319,10 @@ public void setUsedSize(long usedSize) { } } + public static class DeployClientRsp extends AgentResponse { + + } + public static class GetFactsRsp extends AgentResponse { private String mdsExternalAddr; @@ -1597,6 +1695,27 @@ public void setLogicalPoolName(String logicalPoolName) { } } + public static class DeployClientCmd extends AgentCommand { + private String clientIp; + private String clientPassword; + + public String getClientIp() { + return clientIp; + } + + public void setClientIp(String clientIp) { + this.clientIp = clientIp; + } + + public String getClientPassword() { + return clientPassword; + } + + public void setClientPassword(String clientPassword) { + this.clientPassword = clientPassword; + } + } + public static class GetFactsCmd extends AgentCommand { } diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index 4aecfbea46c..fb49df16014 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -84,8 +84,22 @@ class ZbsPrimaryStorageCase extends SubCase { hypervisorType = "KVM" kvm { - name = "kvm" - managementIp = "localhost" + name = "kvm-1" + managementIp = "127.0.0.1" + username = "root" + password = "password" + } + + kvm { + name = "kvm-2" + managementIp = "127.0.0.2" + username = "root" + password = "password" + } + + kvm { + name = "kvm-3" + managementIp = "127.0.0.3" username = "root" password = "password" } @@ -158,6 +172,34 @@ class ZbsPrimaryStorageCase extends SubCase { clusterUuid = cluster.uuid } + reconnectPrimaryStorage { + uuid = ps.uuid + } + + env.afterSimulator(ZbsStorageController.DEPLOY_CLIENT_PATH) { rsp, HttpEntity e -> + def cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.DeployClientCmd) + + ZbsStorageController.DeployClientRsp deployClientRsp = new ZbsStorageController.DeployClientRsp() + if (cmd.clientIp.equals("127.0.0.1")) { + deployClientRsp.success = false + deployClientRsp.error = "on purpose" + } + + return deployClientRsp + } + + expect(AssertionError.class) { + reconnectPrimaryStorage { + uuid = ps.uuid + } + } + + env.cleanAfterSimulatorHandlers() + + reconnectPrimaryStorage { + uuid = ps.uuid + } + detachPrimaryStorageFromCluster { primaryStorageUuid = ps.uuid clusterUuid = cluster.uuid diff --git a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy index 9dcd26d458b..6ed8fe4f33b 100644 --- a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy @@ -50,6 +50,17 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { return rsp } + simulator(ZbsStorageController.DEPLOY_CLIENT_PATH) { HttpEntity e, EnvSpec spec -> + ZbsStorageController.DeployClientCmd cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.DeployClientCmd.class) + ExternalPrimaryStorageSpec zspec = spec.specByUuid(cmd.uuid) + assert zspec != null: "cannot found zbs primary storage[uuid:${cmd.uuid}], check your environment()." + + def rsp = new ZbsStorageController.DeployClientRsp() + rsp.success = true + + return rsp + } + simulator(ZbsStorageController.GET_FACTS_PATH) { HttpEntity e, EnvSpec spec -> ZbsStorageController.GetFactsCmd cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.GetFactsCmd.class) ExternalPrimaryStorageSpec zspec = spec.specByUuid(cmd.uuid) From ba224334ba074412161a99a3fe8a476ac8d1e8d1 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Wed, 23 Oct 2024 16:28:55 +0800 Subject: [PATCH 017/737] [conf]: add change volume processing method in ext ps Resolves: ZSTAC-68429 Change-Id: I6975646f6162647070787a6e7373746870746962 --- .../ExternalPrimaryStorage.xml | 5 ++ conf/springConfigXml/zbs.xml | 1 + .../org/zstack/storage/zbs/ZbsNameHelper.java | 34 ++++++++++ .../storage/zbs/ZbsStorageController.java | 24 +------ .../zstack/storage/zbs/ZbsStorageFactory.java | 68 ++++++++++++++++++- ...ChangeVolumeProcessingMethodExtension.java | 31 +++++++++ 6 files changed, 138 insertions(+), 25 deletions(-) create mode 100644 plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsNameHelper.java create mode 100644 storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageChangeVolumeProcessingMethodExtension.java diff --git a/conf/springConfigXml/ExternalPrimaryStorage.xml b/conf/springConfigXml/ExternalPrimaryStorage.xml index bcae2574039..b5638c24bcb 100644 --- a/conf/springConfigXml/ExternalPrimaryStorage.xml +++ b/conf/springConfigXml/ExternalPrimaryStorage.xml @@ -51,4 +51,9 @@ + + + + + diff --git a/conf/springConfigXml/zbs.xml b/conf/springConfigXml/zbs.xml index 2e0234ddc1d..4ef20cc35c2 100644 --- a/conf/springConfigXml/zbs.xml +++ b/conf/springConfigXml/zbs.xml @@ -21,6 +21,7 @@ + diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsNameHelper.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsNameHelper.java new file mode 100644 index 00000000000..79fa30e2337 --- /dev/null +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsNameHelper.java @@ -0,0 +1,34 @@ +package org.zstack.storage.zbs; + +/** + * @author Xingwei Yu + * @date 2024/10/28 14:17 + */ +public class ZbsNameHelper { + private static final String ZBS_CBD_LUN_PATH_FORMAT = "cbd:%s/%s/%s"; + + public static String buildVolumePath(String physicalPoolName, String logicalPoolName, String volId) { + String base = volId.replace("-", ""); + return String.format(ZBS_CBD_LUN_PATH_FORMAT, physicalPoolName, logicalPoolName, base); + } + + public static String getLogicalPoolNameFromPath(String url) { + return url.split("/")[1]; + } + + public static String getPhysicalPoolNameFromPath(String url) { + return url.split("/")[0].split(":")[1]; + } + + public static String getLunNameFromPath(String url) { + return url.split("/")[2].split("@")[0]; + } + + public static String getSnapshotNameFromPath(String url) { + return url.split("/")[2].split("@")[1]; + } + + public static String getVolumeInstallPathFromSnapshot(String snapshotInstallPath) { + return snapshotInstallPath.split("@")[0]; + } +} diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 143e716673d..9939d4ae44a 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -54,6 +54,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.storage.zbs.ZbsNameHelper.*; /** * @author Xingwei Yu @@ -87,7 +88,6 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar public static final String DELETE_SNAPSHOT_PATH = "/zbs/primarystorage/snapshot/delete"; public static final String ROLLBACK_SNAPSHOT_PATH = "/zbs/primarystorage/snapshot/rollback"; - private static final String ZBS_CBD_LUN_PATH_FORMAT = "cbd:%s/%s/%s"; private static final Integer SUPPORT_MINIMUM_MDS_NUMBER = 2; private static final StorageCapabilities capabilities = new StorageCapabilities(); @@ -517,7 +517,6 @@ public StorageCapabilities reportCapabilities() { @Override public String allocateSpace(AllocateSpaceSpec aspec) { reloadDbInfo(); - return buildVolumePath("", config.getLogicalPoolName(), ""); } @@ -902,22 +901,6 @@ public void setTrashExpireTime(int timeInSeconds, Completion completion) { } - public String getLogicalPoolNameFromPath(String url) { - return url.split("/")[1]; - } - - public String getPhysicalPoolNameFromPath(String url) { - return url.split("/")[0].split(":")[1]; - } - - public String getLunNameFromPath(String url) { - return url.split("/")[2].split("@")[0]; - } - - public String getSnapshotNameFromPath(String url) { - return url.split("/")[2].split("@")[1]; - } - public void doDeleteVolume(String installPath, Boolean force, Completion comp) { DeleteVolumeCmd cmd = new DeleteVolumeCmd(); cmd.setLogicalPoolName(getLogicalPoolNameFromPath(installPath)); @@ -937,11 +920,6 @@ public void fail(ErrorCode errorCode) { }); } - public static String buildVolumePath(String physicalPoolName, String logicalPoolName, String volId) { - String base = volId.replace("-", ""); - return String.format(ZBS_CBD_LUN_PATH_FORMAT, physicalPoolName, logicalPoolName, base); - } - private void reloadDbInfo() { self = dbf.reload(self); addonInfo = StringUtils.isEmpty(self.getAddonInfo()) ? new AddonInfo() : JSONObjectUtil.toObject(self.getAddonInfo(), AddonInfo.class); diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java index b16a1758014..3d5419e73d1 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java @@ -1,22 +1,46 @@ package org.zstack.storage.zbs; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.db.Q; +import org.zstack.core.trash.StorageTrash; import org.zstack.externalStorage.primary.ExternalStorageFencerType; +import org.zstack.header.core.Completion; import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.storage.addon.primary.*; +import org.zstack.header.storage.primary.DeleteVolumeBitsOnPrimaryStorageMsg; +import org.zstack.header.storage.primary.PrimaryStorageConstant; +import org.zstack.header.storage.snapshot.VolumeSnapshotAfterDeleteExtensionPoint; +import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; import org.zstack.header.volume.VolumeProtocol; +import org.zstack.header.volume.VolumeVO; +import org.zstack.header.volume.VolumeVO_; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; import java.util.LinkedHashMap; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import static org.zstack.storage.zbs.ZbsNameHelper.*; /** * @author Xingwei Yu * @date 2024/3/21 11:56 */ -public class ZbsStorageFactory implements ExternalPrimaryStorageSvcBuilder, BackupStorageSelector { +public class ZbsStorageFactory implements ExternalPrimaryStorageSvcBuilder, BackupStorageSelector, VolumeSnapshotAfterDeleteExtensionPoint { + private static CLogger logger = Utils.getLogger(ZbsStorageFactory.class); public static final ExternalStorageFencerType fencerType = new ExternalStorageFencerType(ZbsConstants.IDENTITY, VolumeProtocol.CBD.toString()); - private List preferBackupStorageTypes; + @Autowired + private CloudBus bus; + @Autowired + private StorageTrash trash; + private List preferBackupStorageTypes; @Override public PrimaryStorageControllerSvc buildControllerSvc(ExternalPrimaryStorageVO vo) { @@ -46,4 +70,44 @@ public List getPreferBackupStorageTypes() { public String getIdentity() { return ZbsConstants.IDENTITY; } + + @Override + public void volumeSnapshotAfterDeleteExtensionPoint(VolumeSnapshotInventory snapshot, Completion completion) { + completion.success(); + } + + @Override + public void volumeSnapshotAfterFailedDeleteExtensionPoint(VolumeSnapshotInventory snapshot) { + + } + + private boolean isCbdProtocol(String volumeUuid) { + return VolumeProtocol.CBD.toString().equals(Q.New(VolumeVO.class).select(VolumeVO_.protocol).eq(VolumeVO_.uuid, volumeUuid).find()); + } + + @Override + public void volumeSnapshotAfterCleanUpExtensionPoint(String volumeUuid, List snapshots) { + if (CollectionUtils.isEmpty(snapshots) || !isCbdProtocol(volumeUuid)) { + return; + } + + Set volumeInstallPaths = snapshots.stream().map(s -> getVolumeInstallPathFromSnapshot(s.getPrimaryStorageInstallPath())) + .collect(Collectors.toSet()); + if (volumeInstallPaths.isEmpty()) { + return; + } + + volumeInstallPaths.forEach(volumeInstallPath -> { + String details = trash.makeSureInstallPathNotUsed(volumeInstallPath, VolumeVO.class.getSimpleName()); + + if (StringUtils.isBlank(details)) { + logger.debug(String.format("delete volume[InstallPath:%s] after cleaning up snapshots", volumeInstallPath)); + DeleteVolumeBitsOnPrimaryStorageMsg msg = new DeleteVolumeBitsOnPrimaryStorageMsg(); + msg.setPrimaryStorageUuid(snapshots.get(0).getPrimaryStorageUuid()); + msg.setInstallPath(volumeInstallPath); + bus.makeTargetServiceIdByResourceUuid(msg, PrimaryStorageConstant.SERVICE_ID, snapshots.get(0).getPrimaryStorageUuid()); + bus.send(msg); + } + }); + } } diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageChangeVolumeProcessingMethodExtension.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageChangeVolumeProcessingMethodExtension.java new file mode 100644 index 00000000000..09dbccb01b1 --- /dev/null +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageChangeVolumeProcessingMethodExtension.java @@ -0,0 +1,31 @@ +package org.zstack.storage.addon.primary; + +import org.zstack.core.db.Q; +import org.zstack.header.storage.primary.PrimaryStorageConstant; +import org.zstack.header.storage.primary.PrimaryStorageVO; +import org.zstack.header.storage.primary.PrimaryStorageVO_; +import org.zstack.header.storage.snapshot.VolumeSnapshotVO; +import org.zstack.header.storage.snapshot.VolumeSnapshotVO_; +import org.zstack.header.volume.VolumeDeletionPolicyManager; +import org.zstack.header.volume.VolumeInventory; +import org.zstack.storage.volume.ChangeVolumeProcessingMethodExtensionPoint; + +/** + * @author Xingwei Yu + * @date 2024/10/23 16:07 + */ +public class ExternalPrimaryStorageChangeVolumeProcessingMethodExtension implements ChangeVolumeProcessingMethodExtensionPoint { + @Override + public VolumeDeletionPolicyManager.VolumeDeletionPolicy getTransientVolumeDeletionPolicy(VolumeInventory transientVolume) { + String psType = Q.New(PrimaryStorageVO.class).eq(PrimaryStorageVO_.uuid, transientVolume.getPrimaryStorageUuid()).select(PrimaryStorageVO_.type).findValue(); + if (!psType.equals(PrimaryStorageConstant.EXTERNAL_PRIMARY_STORAGE_TYPE)) { + return null; + } + boolean hasSnapshots = Q.New(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.primaryStorageUuid, transientVolume.getPrimaryStorageUuid()) + .like(VolumeSnapshotVO_.primaryStorageInstallPath, String.format("%s@%%", transientVolume.getInstallPath())).isExists(); + if (!hasSnapshots) { + return VolumeDeletionPolicyManager.VolumeDeletionPolicy.Direct; + } + return VolumeDeletionPolicyManager.VolumeDeletionPolicy.DBOnly; + } +} From 7cb0b34b95f4d11ece1279c2efcafaf34672c328 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Thu, 31 Oct 2024 15:45:17 +0800 Subject: [PATCH 018/737] [zbs]: correct xinfini discover Resolves: ZSTAC-70871 Change-Id: I786a72766d6e6678647273786b61797a6d756e6f --- .../main/java/org/zstack/xinfini/XInfiniStorageFactory.java | 4 +++- .../main/java/org/zstack/storage/zbs/ZbsStorageFactory.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageFactory.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageFactory.java index 38f22f52837..730d8b88851 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageFactory.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageFactory.java @@ -13,6 +13,8 @@ import java.util.LinkedHashMap; import java.util.List; +import static org.zstack.core.Platform.operr; + public class XInfiniStorageFactory implements ExternalPrimaryStorageSvcBuilder, BackupStorageSelector, VolumeAfterExpungeExtensionPoint { private List preferBackupStorageTypes; @@ -34,7 +36,7 @@ public PrimaryStorageNodeSvc buildNodeSvc(ExternalPrimaryStorageVO vo) { public void discover(String url, String config, ReturnValueCompletion completion) { // xinfini must set config if (StringUtils.isEmpty(config)) { - completion.success(Maps.newLinkedHashMap()); + completion.fail(operr("empty config, cannot discover xinfini")); return; } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java index 5f0421053c4..6123d46385b 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java @@ -11,6 +11,8 @@ import java.util.LinkedHashMap; +import static org.zstack.core.Platform.operr; + /** * @author Xingwei Yu * @date 2024/3/21 11:56 @@ -30,7 +32,7 @@ public PrimaryStorageNodeSvc buildNodeSvc(ExternalPrimaryStorageVO vo) { @Override public void discover(String url, String config, ReturnValueCompletion completion) { - + completion.fail(operr("zbs not support discover yet")); } @Override From eded4b6d84390ac4cdcda7299373328f8c937869 Mon Sep 17 00:00:00 2001 From: "qiuyu.zhang" Date: Thu, 19 Sep 2024 15:58:06 +0800 Subject: [PATCH 019/737] [conf]: adapt to hba adapt to hba, and add hba alarm Resolves: ZSTAC-69782 Change-Id: I7968756d78626e75786c646a776f6a696b686c6f --- conf/db/upgrade/V5.3.0__schema.sql | 23 ++++++ .../header/host/HostCanonicalEvents.java | 49 ++++++++++++ .../java/org/zstack/kvm/KVMAgentCommands.java | 7 ++ .../main/java/org/zstack/kvm/KVMConstant.java | 1 + sdk/src/main/java/SourceClassMap.java | 4 + .../org/zstack/sdk/FcHbaDeviceInventory.java | 63 ++++++++++++++++ .../org/zstack/sdk/HbaDeviceInventory.java | 55 ++++++++++++++ .../zstack/sdk/QueryFcHbaDeviceAction.java | 75 +++++++++++++++++++ .../zstack/sdk/QueryFcHbaDeviceResult.java | 22 ++++++ 9 files changed, 299 insertions(+) create mode 100644 conf/db/upgrade/V5.3.0__schema.sql create mode 100644 sdk/src/main/java/org/zstack/sdk/FcHbaDeviceInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/HbaDeviceInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryFcHbaDeviceAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryFcHbaDeviceResult.java diff --git a/conf/db/upgrade/V5.3.0__schema.sql b/conf/db/upgrade/V5.3.0__schema.sql new file mode 100644 index 00000000000..6fef67d781d --- /dev/null +++ b/conf/db/upgrade/V5.3.0__schema.sql @@ -0,0 +1,23 @@ +CREATE TABLE IF NOT EXISTS `zstack`.`HbaDeviceVO` ( + `uuid` varchar(32) not null unique, + `hostUuid` varchar(32) default null, + `name` varchar(255) default null, + `hbaType` varchar(64) default null, + `createDate` timestamp not null default '0000-00-00 00:00:00', + `lastOpDate` timestamp not null default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + CONSTRAINT fkHBADeviceVOHostVO FOREIGN KEY (hostUuid) REFERENCES HostEO (uuid) ON DELETE CASCADE, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`FcHbaDeviceVO` ( + `uuid` varchar(32) not null unique, + `portName` varchar(255) default null, + `portState` varchar(64) default null, + `supportedSpeeds` varchar(255) default null, + `speed` varchar(255) default null, + `symbolicName` varchar(255) default null, + `supportedClasses` varchar(255) default null, + `nodeName` varchar(255) default null, + CONSTRAINT fkFcHbaDeviceVO FOREIGN KEY (uuid) REFERENCES HbaDeviceVO (uuid) ON DELETE CASCADE, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java b/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java index 0a6ba8f2a70..8f177ed791e 100755 --- a/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java +++ b/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java @@ -31,7 +31,56 @@ public class HostCanonicalEvents { public static final String HOST_PHYSICAL_GPU_STATUS_ABNORMAL = "/host/physicalGpu/status/abnormal"; public static final String HOST_PHYSICAL_VGPU_STATUS_ABNORMAL = "/host/physicalVGpu/status/abnormal"; public static final String HOST_PHYSICAL_RAID_STATUS_ABNORMAL = "/host/physicalRaid/status/abnormal"; + public static final String HOST_PHYSICAL_HBA_STATE_ABNORMAL = "/host/physicalHBA/state/abnormal"; + @NeedJsonSchema + public static class HostPhysicalHbaPortStateAbnormalData { + private String hostUuid; + private String name; + private String portName; + private String newPortState; + private String oldPortState; + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getPortName() { + return portName; + } + + public void setPortName(String portName) { + this.portName = portName; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getNewPortState() { + return newPortState; + } + + public void setNewPortState(String newPortState) { + this.newPortState = newPortState; + } + + public String getOldPortState() { + return oldPortState; + } + + public void setOldPortState(String oldPortState) { + this.oldPortState = oldPortState; + } + } @NeedJsonSchema public static class HostPhysicalGpuRemoveTriggeredData { diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index d32253991c0..0da4fac18c0 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -4733,6 +4733,13 @@ public static class PhysicalGpuRemoveAlarmEventCmd { public String pcideviceAddress; } + public static class HostStorageDeviceHbaStateEventCmd { + public String host; + public String portName; + public String portState; + public String name; + } + public static class HostPhysicalDeviceStatusAlarmEventCmd { private String host; private String type; diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java index 694aa68fbfd..4dee07ddc3b 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java @@ -125,6 +125,7 @@ public interface KVMConstant { String HOST_PHYSICAL_DISK_REMOVE_ALARM_EVENT = "/host/physical/disk/remove/alarm"; String HOST_PHYSICAL_MEMORY_ECC_ERROR_ALARM_EVENT = "/host/physical/memory/ecc/error/alarm"; String HOST_PHYSICAL_GPU_REMOVE_ALARM_EVENT = "/host/physical/gpu/remove/alarm"; + String HOST_STORAGEDEVICE_HBA_STATE_EVENT = "/storagedevice/hba/state/alarm"; String KVM_AGENT_OWNER = "kvm"; String ALI_REPO = "ali"; diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 703c2b14eb8..5b7d7f416d8 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -597,6 +597,8 @@ public class SourceClassMap { put("org.zstack.storage.ceph.primary.CephPrimaryStoragePoolInventory", "org.zstack.sdk.CephPrimaryStoragePoolInventory"); put("org.zstack.storage.device.fibreChannel.FiberChannelLunInventory", "org.zstack.sdk.FiberChannelLunInventory"); put("org.zstack.storage.device.fibreChannel.FiberChannelStorageInventory", "org.zstack.sdk.FiberChannelStorageInventory"); + put("org.zstack.storage.device.hba.FcHbaDeviceInventory", "org.zstack.sdk.FcHbaDeviceInventory"); + put("org.zstack.storage.device.hba.HbaDeviceInventory", "org.zstack.sdk.HbaDeviceInventory"); put("org.zstack.storage.device.iscsi.IscsiLunInventory", "org.zstack.sdk.IscsiLunInventory"); put("org.zstack.storage.device.iscsi.IscsiServerClusterRefInventory", "org.zstack.sdk.IscsiServerClusterRefInventory"); put("org.zstack.storage.device.iscsi.IscsiServerInventory", "org.zstack.sdk.IscsiServerInventory"); @@ -915,6 +917,7 @@ public class SourceClassMap { put("org.zstack.sdk.ExternalServiceCapabilitiesBuilder", "org.zstack.core.externalservice.ExternalServiceCapabilitiesBuilder"); put("org.zstack.sdk.ExternalServiceInventory", "org.zstack.header.core.external.service.ExternalServiceInventory"); put("org.zstack.sdk.FaultToleranceVmGroupInventory", "org.zstack.faulttolerance.entity.FaultToleranceVmGroupInventory"); + put("org.zstack.sdk.FcHbaDeviceInventory", "org.zstack.storage.device.hba.FcHbaDeviceInventory"); put("org.zstack.sdk.FiSecSecretResourcePoolInventory", "org.zstack.crypto.securitymachine.thirdparty.fiSec.FiSecSecretResourcePoolInventory"); put("org.zstack.sdk.FiSecSecurityMachineInventory", "org.zstack.crypto.securitymachine.thirdparty.fiSec.FiSecSecurityMachineInventory"); put("org.zstack.sdk.FiberChannelLunInventory", "org.zstack.storage.device.fibreChannel.FiberChannelLunInventory"); @@ -940,6 +943,7 @@ public class SourceClassMap { put("org.zstack.sdk.HaStrategyConditionInventory", "org.zstack.ha.HaStrategyConditionInventory"); put("org.zstack.sdk.HaiTaiSecretResourcePoolInventory", "org.zstack.crypto.securitymachine.thirdparty.haitai.HaiTaiSecretResourcePoolInventory"); put("org.zstack.sdk.HardwareL2VxlanNetworkPoolInventory", "org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory"); + put("org.zstack.sdk.HbaDeviceInventory", "org.zstack.storage.device.hba.HbaDeviceInventory"); put("org.zstack.sdk.HostConnectedStatus", "org.zstack.zops.HostConnectedStatus"); put("org.zstack.sdk.HostDiskCapacity", "org.zstack.storage.primary.local.APIGetLocalStorageHostDiskCapacityReply$HostDiskCapacity"); put("org.zstack.sdk.HostInventory", "org.zstack.header.host.HostInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/FcHbaDeviceInventory.java b/sdk/src/main/java/org/zstack/sdk/FcHbaDeviceInventory.java new file mode 100644 index 00000000000..2f67d57b3f8 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/FcHbaDeviceInventory.java @@ -0,0 +1,63 @@ +package org.zstack.sdk; + + + +public class FcHbaDeviceInventory extends org.zstack.sdk.HbaDeviceInventory { + + public java.lang.String portName; + public void setPortName(java.lang.String portName) { + this.portName = portName; + } + public java.lang.String getPortName() { + return this.portName; + } + + public java.lang.String portState; + public void setPortState(java.lang.String portState) { + this.portState = portState; + } + public java.lang.String getPortState() { + return this.portState; + } + + public java.lang.String speed; + public void setSpeed(java.lang.String speed) { + this.speed = speed; + } + public java.lang.String getSpeed() { + return this.speed; + } + + public java.lang.String supportedSpeeds; + public void setSupportedSpeeds(java.lang.String supportedSpeeds) { + this.supportedSpeeds = supportedSpeeds; + } + public java.lang.String getSupportedSpeeds() { + return this.supportedSpeeds; + } + + public java.lang.String symbolicName; + public void setSymbolicName(java.lang.String symbolicName) { + this.symbolicName = symbolicName; + } + public java.lang.String getSymbolicName() { + return this.symbolicName; + } + + public java.lang.String supportedClasses; + public void setSupportedClasses(java.lang.String supportedClasses) { + this.supportedClasses = supportedClasses; + } + public java.lang.String getSupportedClasses() { + return this.supportedClasses; + } + + public java.lang.String nodeName; + public void setNodeName(java.lang.String nodeName) { + this.nodeName = nodeName; + } + public java.lang.String getNodeName() { + return this.nodeName; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/HbaDeviceInventory.java b/sdk/src/main/java/org/zstack/sdk/HbaDeviceInventory.java new file mode 100644 index 00000000000..8eb7142775a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/HbaDeviceInventory.java @@ -0,0 +1,55 @@ +package org.zstack.sdk; + + + +public class HbaDeviceInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String hostUuid; + public void setHostUuid(java.lang.String hostUuid) { + this.hostUuid = hostUuid; + } + public java.lang.String getHostUuid() { + return this.hostUuid; + } + + public java.lang.String hbaType; + public void setHbaType(java.lang.String hbaType) { + this.hbaType = hbaType; + } + public java.lang.String getHbaType() { + return this.hbaType; + } + + public java.lang.String createDate; + public void setCreateDate(java.lang.String createDate) { + this.createDate = createDate; + } + public java.lang.String getCreateDate() { + return this.createDate; + } + + public java.lang.String lastOpDate; + public void setLastOpDate(java.lang.String lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.lang.String getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryFcHbaDeviceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryFcHbaDeviceAction.java new file mode 100644 index 00000000000..0d1335eaaab --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryFcHbaDeviceAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryFcHbaDeviceAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryFcHbaDeviceResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryFcHbaDeviceResult value = res.getResult(org.zstack.sdk.QueryFcHbaDeviceResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryFcHbaDeviceResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/storage-devices/hba"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryFcHbaDeviceResult.java b/sdk/src/main/java/org/zstack/sdk/QueryFcHbaDeviceResult.java new file mode 100644 index 00000000000..08aedde3a23 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryFcHbaDeviceResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryFcHbaDeviceResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} From e26a8c5658877bc8c475d50126f969cb303772a0 Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Sun, 29 Sep 2024 11:27:39 +0800 Subject: [PATCH 020/737] [vpc]: vpc support sriov and hot migrate Resolves: ZSTAC-70073 Change-Id: I6868776c85e28bdec1334354b5696c4788471f55 --- .../org/zstack/compute/vm/VmInstanceBase.java | 2 +- .../org/zstack/compute/vm/VmSystemTags.java | 4 + conf/db/upgrade/V5.3.0__schema.sql | 9 + conf/guestOs/guestOsCategory.xml | 12 ++ conf/guestOs/guestOsCharacter.xml | 10 + conf/springConfigXml/VirtualRouter.xml | 3 + .../zstack/header/vm/VmInstanceConstant.java | 1 + .../appliancevm/ApplianceVmConstant.java | 1 + .../appliancevm/ApplianceVmKvmBackend.java | 10 + .../service/eip/EipApiInterceptor.java | 10 - .../service/flat/FlatEipApiInterceptor.java | 3 +- .../main/java/org/zstack/kvm/KVMAddons.java | 1 + .../virtualrouter/VirtualRouterConstant.java | 2 + .../VirtualRouterManagerImpl.java | 176 +++++++++++++++++- .../service/virtualrouter/eip/EipTO.java | 10 + .../eip/VirtualRouterEipBackend.java | 16 +- .../eip/VirtualRouterSyncEipOnStartFlow.java | 22 +-- .../testlib/VirtualRouterOfferingSpec.groovy | 4 + .../utils/network/IPv6NetworkUtils.java | 25 +++ 19 files changed, 289 insertions(+), 32 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java index 280a9a89e8b..558adde5b1f 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java @@ -3213,7 +3213,7 @@ protected List getImageCandidatesForVm(ImageMediaType type) { } q.setParameter("state", ImageState.Enabled); q.setParameter("status", ImageStatus.Ready); - q.setParameter("system", false); + q.setParameter("system", Objects.equals(self.getType(), VmInstanceConstant.APPLIANCE_VM_TYPE)); q.setParameter("arch", architecture); q.setParameter("bsUuids", bsUuids); List candidates = ImageInventory.valueOf(q.getResultList()); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java b/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java index d48265f56cb..ba8faf9ba56 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java @@ -195,6 +195,10 @@ public class VmSystemTags { public static PatternedSystemTag VM_GUEST_TOOLS = new PatternedSystemTag(String.format("GuestTools::{%s}", VM_GUEST_TOOLS_VERSION_TOKEN), VmInstanceVO.class); + public static String VM_GUEST_TOOLS_PREVIEW_STATE_TOKEN = "guestToolsPreviewState"; + public static PatternedSystemTag VM_GUEST_TOOLS_PREVIEW_STATE = + new PatternedSystemTag(String.format("GuestToolsPreviewState::{%s}", VM_GUEST_TOOLS_PREVIEW_STATE_TOKEN), VmInstanceVO.class); + public static String VM_RESOURCE_BINGDING_TOKEN = "resourceUUids"; public static PatternedSystemTag VM_RESOURCE_BINGDING = new PatternedSystemTag(String.format("resourceBindings::{%s}", VM_RESOURCE_BINGDING_TOKEN), VmInstanceVO.class); diff --git a/conf/db/upgrade/V5.3.0__schema.sql b/conf/db/upgrade/V5.3.0__schema.sql index 6fef67d781d..13eed51c357 100644 --- a/conf/db/upgrade/V5.3.0__schema.sql +++ b/conf/db/upgrade/V5.3.0__schema.sql @@ -21,3 +21,12 @@ CREATE TABLE IF NOT EXISTS `zstack`.`FcHbaDeviceVO` ( CONSTRAINT fkFcHbaDeviceVO FOREIGN KEY (uuid) REFERENCES HbaDeviceVO (uuid) ON DELETE CASCADE, PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +UPDATE `zstack`.`ImageEO` SET guestOsType = 'VyOS 1.1.7' WHERE architecture = 'x86_64' and guestOsType = 'Linux' and system = TRUE; +UPDATE `zstack`.`ImageEO` SET guestOsType = 'VyOS 1.2.0' WHERE architecture = 'aarch64' and guestOsType = 'Linux' and system = TRUE; +UPDATE `zstack`.`ImageEO` SET guestOsType = 'Kylin 10' WHERE architecture = 'loongarch64' and guestOsType = 'Linux' and system = TRUE; + +UPDATE `zstack`.`VmInstanceEO` SET guestOsType = 'VyOS 1.1.7' WHERE architecture = 'x86_64' and guestOsType = 'Linux' and type = 'ApplianceVm'; +UPDATE `zstack`.`VmInstanceEO` SET guestOsType = 'VyOS 1.2.0' WHERE architecture = 'aarch64' and guestOsType = 'Linux' and type = 'ApplianceVm'; +UPDATE `zstack`.`VmInstanceEO` SET guestOsType = 'Kylin 10' WHERE architecture = 'loongarch64' and guestOsType = 'Linux' and type = 'ApplianceVm'; + diff --git a/conf/guestOs/guestOsCategory.xml b/conf/guestOs/guestOsCategory.xml index 704bd58f523..f852ba950ec 100644 --- a/conf/guestOs/guestOsCategory.xml +++ b/conf/guestOs/guestOsCategory.xml @@ -144,6 +144,18 @@ 22.03 openEuler 22.03 + + Linux + VyOS + 1.1.7 + VyOS 1.1.7 + + + Linux + VyOS + 1.2.0 + VyOS 1.2.0 + Linux SUSE diff --git a/conf/guestOs/guestOsCharacter.xml b/conf/guestOs/guestOsCharacter.xml index db657bed244..4f9f672bae9 100644 --- a/conf/guestOs/guestOsCharacter.xml +++ b/conf/guestOs/guestOsCharacter.xml @@ -143,6 +143,16 @@ Linux openEuler 22.03 + + x86_64 + Linux + VyOS 1.1.7 + + + x86_64 + Linux + VyOS 1.2.0 + x86_64 Linux diff --git a/conf/springConfigXml/VirtualRouter.xml b/conf/springConfigXml/VirtualRouter.xml index c2c1a44facb..2ddb8e25467 100755 --- a/conf/springConfigXml/VirtualRouter.xml +++ b/conf/springConfigXml/VirtualRouter.xml @@ -124,6 +124,9 @@ + + + diff --git a/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java b/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java index bf807146deb..47572db0fb3 100755 --- a/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java +++ b/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java @@ -8,6 +8,7 @@ public interface VmInstanceConstant { String ACTION_CATEGORY = "instance"; @PythonClass String USER_VM_TYPE = "UserVm"; + String APPLIANCE_VM_TYPE = "ApplianceVm"; Integer VM_MONITOR_NUMBER = 1; // System limit diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmConstant.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmConstant.java index 1e23cf2e014..e85cd00855b 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmConstant.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmConstant.java @@ -11,6 +11,7 @@ public class ApplianceVmConstant { public static final String SERVICE_ID = "applianceVm"; public static final String KVM_CHANNEL_AGENT_PATH = "/var/lib/zstack/kvm/agentSocket"; + public static final String KVM_CHANNEL_QEMU_GA_PATH = "/var/lib/libvirt/qemu"; public static final String ANSIBLE_PLAYBOOK_NAME = "appliancevm.py"; diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmKvmBackend.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmKvmBackend.java index de36360860d..35deb659c11 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmKvmBackend.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmKvmBackend.java @@ -27,14 +27,24 @@ public void addAddon(KVMHostInventory host, VmInstanceSpec spec, KVMAgentCommand } KVMAddons.Channel chan = new KVMAddons.Channel(); + KVMAddons.Channel chan_vr = new KVMAddons.Channel(); cmd.setEmulateHyperV(false); + chan.setSocketPath(makeChannelSocketPath(spec.getVmInventory().getUuid())); chan.setTargetName("applianceVm.vport"); cmd.getAddons().put(KVMAddons.Channel.NAME, chan); logger.debug(String.format("make kvm channel device[path:%s, target:%s]", chan.getSocketPath(), chan.getTargetName())); + + chan_vr.setSocketPath(makeChannelVRSocketPath(spec.getVmInventory().getUuid())); + chan_vr.setTargetName("org.qemu.guest_agent.0"); // this channel name must keep org.qemu.guest_agent to use qemu-ga + cmd.getAddons().put(KVMAddons.Channel.VR_NAME, chan_vr); + logger.debug(String.format("make kvm channel device[path:%s, target:%s]", chan_vr.getSocketPath(), chan_vr.getTargetName())); } public String makeChannelSocketPath(String apvmuuid) { return PathUtil.join(ApplianceVmConstant.KVM_CHANNEL_AGENT_PATH, String.format("applianceVm.%s", apvmuuid)); } + private String makeChannelVRSocketPath(String apvmuuid) { + return PathUtil.join(ApplianceVmConstant.KVM_CHANNEL_QEMU_GA_PATH, apvmuuid); + } } diff --git a/plugin/eip/src/main/java/org/zstack/network/service/eip/EipApiInterceptor.java b/plugin/eip/src/main/java/org/zstack/network/service/eip/EipApiInterceptor.java index da4a2d5f799..b1cad7414a2 100755 --- a/plugin/eip/src/main/java/org/zstack/network/service/eip/EipApiInterceptor.java +++ b/plugin/eip/src/main/java/org/zstack/network/service/eip/EipApiInterceptor.java @@ -101,26 +101,16 @@ private void validate(APIGetEipAttachableVmNicsMsg msg) { } boolean isAddressPool = false; - boolean isIpv6 = false; if (msg.getVipUuid() != null) { VipVO vip = dbf.findByUuid(msg.getVipUuid(), VipVO.class); isAddressPool = Q.New(AddressPoolVO.class).eq(AddressPoolVO_.uuid, vip.getIpRangeUuid()).isExists(); - if (IPv6NetworkUtils.isIpv6Address(vip.getIp())) { - isIpv6 = true; - } } else if (msg.getEipUuid() != null) { EipVO eipVO = dbf.findByUuid(msg.getEipUuid(), EipVO.class); VipVO vip = dbf.findByUuid(eipVO.getVipUuid(), VipVO.class); isAddressPool = Q.New(AddressPoolVO.class).eq(AddressPoolVO_.uuid, vip.getIpRangeUuid()).isExists(); - if (IPv6NetworkUtils.isIpv6Address(vip.getIp())) { - isIpv6 = true; - } } if (isAddressPool) { msg.setNetworkServiceProvider("vrouter"); - } else if (isIpv6) { - /* TODO, temp hard code */ - msg.setNetworkServiceProvider("Flat"); } } diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipApiInterceptor.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipApiInterceptor.java index fd568a9b797..834ded414e6 100644 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipApiInterceptor.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipApiInterceptor.java @@ -106,7 +106,8 @@ protected void validate(APIAttachEipMsg msg) { /* TODO: this is temp limitation, ipv6 eip can be only attached to flat eip */ EipVO eip = Q.New(EipVO.class).eq(EipVO_.uuid, msg.getEipUuid()).find(); if (IPv6NetworkUtils.isIpv6Address(eip.getVipIp()) && !providerType.toString().equals(FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING)) { - throw new ApiMessageInterceptionException(argerr("could not attach eip because ipv6 eip can ONLY be attached to flat network")); +// throw new ApiMessageInterceptionException(argerr("could not attach eip because ipv6 eip can ONLY be attached to flat network")); + return; } if (!providerType.toString().equals(FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING)) { diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAddons.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAddons.java index 073c8d77b6a..5f4647a7f0d 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAddons.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAddons.java @@ -5,6 +5,7 @@ public interface KVMAddons { public static class Channel { public static final String NAME = "channel"; + public static final String VR_NAME = "channel_vr"; private String socketPath; private String targetName; diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterConstant.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterConstant.java index 904ad7cb5d4..b5280abd536 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterConstant.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterConstant.java @@ -72,6 +72,8 @@ public interface VirtualRouterConstant { public static final String VR_KERNEL_VERSION = "5.4.80"; public static final String VR_OLD_KERNEL_VERSION = "3.13.11"; + public static final String VR_HA_MASTER_DEMOTE = "/keepalived/demote"; + public static enum Param { VR, VR_UUID, diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java index d7f3e0bd169..de297a504ab 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java @@ -29,9 +29,7 @@ import org.zstack.header.configuration.InstanceOfferingState; import org.zstack.header.configuration.InstanceOfferingVO; import org.zstack.header.core.*; -import org.zstack.header.core.workflow.Flow; -import org.zstack.header.core.workflow.FlowChain; -import org.zstack.header.core.workflow.FlowException; +import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.errorcode.OperationFailureException; @@ -77,6 +75,7 @@ import org.zstack.network.service.virtualrouter.vyos.VyosConstants; import org.zstack.network.service.virtualrouter.vyos.VyosVersionCheckResult; import org.zstack.network.service.virtualrouter.vyos.VyosVersionManager; +import org.zstack.network.service.virtualrouter.VirtualRouterCommands.*; import org.zstack.tag.SystemTagCreator; import org.zstack.tag.TagManager; import org.zstack.utils.*; @@ -110,7 +109,8 @@ public class VirtualRouterManagerImpl extends AbstractService implements Virtual PrepareDbInitialValueExtensionPoint, L2NetworkCreateExtensionPoint, GlobalApiMessageInterceptor, AddExpandedQueryExtensionPoint, GetCandidateVmNicsForLoadBalancerExtensionPoint, GetPeerL3NetworksForLoadBalancerExtensionPoint, FilterVmNicsForEipInVirtualRouterExtensionPoint, ApvmCascadeFilterExtensionPoint, ManagementNodeReadyExtensionPoint, - VipCleanupExtensionPoint, GetL3NetworkForEipInVirtualRouterExtensionPoint, VirtualRouterHaGetCallbackExtensionPoint, AfterAddIpRangeExtensionPoint, QueryBelongFilter { + VipCleanupExtensionPoint, GetL3NetworkForEipInVirtualRouterExtensionPoint, VirtualRouterHaGetCallbackExtensionPoint, AfterAddIpRangeExtensionPoint, QueryBelongFilter, + VmInstanceMigrateExtensionPoint, VmPreMigrationExtensionPoint { private final static CLogger logger = Utils.getLogger(VirtualRouterManagerImpl.class); private final static List supportedL2NetworkTypes = new ArrayList(); @@ -2630,4 +2630,172 @@ public List getPublicL3UuidsOfPrivateL3(L3NetworkVO privateL3) { .in(VmNicVO_.metaData, VirtualRouterNicMetaData.ALL_PUBLIC_NIC_MASK_STRING_LIST).listValues(); return l3Uuids; } + + @Override + public void beforeMigrateVm(VmInstanceInventory inv, String destHostUuid) { + + } + + @Override + public void afterMigrateVm(VmInstanceInventory inv, String srcHostUuid, NoErrorCompletion completion) { + if (inv == null || srcHostUuid == null) { + completion.done(); + return; + } + if (VmInstanceConstant.USER_VM_TYPE.equals(inv.getType())) { + completion.done(); + return; + } + List vfNics = inv.getVmNics().stream() + .filter(nic -> !Objects.equals(nic.getType(), VmInstanceConstant.VIRTUAL_NIC_TYPE)) + .collect(Collectors.toList()); + logger.debug(String.format("virtual router[uuid:%s] has %s vf nics need to sync vip after hot migrate", + inv.getUuid(), vfNics.size())); + if (vfNics.isEmpty()) { + completion.done(); + return; + } + List vips = findVipsOnVirtualRouter(vfNics, inv.getUuid()); + if (vips.isEmpty()) { + completion.done(); + return; + } + + CreateVipCmd cmd = new CreateVipCmd(); + cmd.setSyncVip(false); + cmd.setVips(vips); + + VirtualRouterAsyncHttpCallMsg msg = new VirtualRouterAsyncHttpCallMsg(); + msg.setVmInstanceUuid(inv.getUuid()); + msg.setCommand(cmd); + msg.setPath(VirtualRouterConstant.VR_CREATE_VIP); + bus.makeTargetServiceIdByResourceUuid(msg, VmInstanceConstant.SERVICE_ID, inv.getUuid()); + bus.send(msg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.warn(String.format("failed to sync vips on virtual router[uuid:%s] due to %s", + inv.getUuid(), reply.getError())); + completion.done(); + return; + } + + VirtualRouterAsyncHttpCallReply re = reply.castReply(); + CreateVipRsp ret = re.toResponse(CreateVipRsp.class); + if (!ret.isSuccess()) { + ErrorCode err = operr("failed to sync vips[ips: %s] on virtual router[uuid:%s]" + + " for vr hot mirage, because %s", + vips.stream().map(VipTO::getIp).collect(Collectors.toList()), + inv.getUuid(), ret.getError()); + logger.warn(err.toString()); + completion.done(); + } else { + List vipUuids = vips.stream().map(VipTO::getVipUuid).distinct().collect(Collectors.toList()); + vipProxy.attachNetworkService(inv.getUuid(), VipVO.class.getSimpleName(), vipUuids); + List vips = Q.New(VipVO.class).in(VipVO_.uuid, vipUuids).list(); + CollectionUtils.safeForEach(pluginRgty.getExtensionList(AfterAcquireVipExtensionPoint.class), ext -> { + logger.debug(String.format("execute after acquire vip extension point %s", ext)); + ext.afterAcquireVip(VipInventory.valueOf(vips)); + }); + completion.done(); + } + } + }); + } + + private List findVipsOnVirtualRouter(List vfNics, String vrUuid) { + List vipUuids = SQL.New("select vip.uuid from VipVO vip, VipPeerL3NetworkRefVO ref " + + "where ref.vipUuid = vip.uuid and vip.system = false " + + "and ref.l3NetworkUuid in (:l3NetworkUuids)") + .param("l3NetworkUuids", vfNics.stream().map(VmNicInventory::getL3NetworkUuid).collect(Collectors.toList())) + .list(); + + vipUuids = getVirtualRouterVips(vrUuid, vipUuids); + if (vipUuids == null || vipUuids.isEmpty()) { + return new ArrayList<>(); + } + + List vips = Q.New(VipVO.class).in(VipVO_.uuid, vipUuids).list(); + VirtualRouterVmInventory vr = VirtualRouterVmInventory.valueOf((VirtualRouterVmVO) + Q.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, vrUuid).find()); + + List systemVip = vips.stream().filter(VipVO::isSystem).collect(Collectors.toList()); + List notSystemVip = vips.stream().filter(v -> !v.isSystem()).collect(Collectors.toList()); + List vipss = new ArrayList<>(); + vipss.addAll(systemVip); + vipss.addAll(notSystemVip); + + List vipTOS = new ArrayList<>(); + for (VipVO vip : vipss) { + if (vipTOS.stream().anyMatch(v -> v.getIp().equals(vip.getIp()))) { + logger.warn(String.format( + "found duplicate vip ip[uuid; %s, uuids: %s] for vr[uuid: %s]", + vip.getIp(), + vips.stream(). + filter(v -> v.getIp().equals(vip.getIp())) + .map(VipVO::getUuid) + .collect(Collectors.toSet()), + vrUuid)); + continue; + } + + VipTO to = new VipTO(); + to.setIp(vip.getIp()); + to.setGateway(vip.getGateway()); + to.setNetmask(vip.getNetmask()); + Optional pubNic = vr.getVmNics().stream() + .filter(n -> n.getL3NetworkUuid().equals(vip.getL3NetworkUuid())) + .findFirst(); + if (!pubNic.isPresent()) { + continue; + } + to.setOwnerEthernetMac(pubNic.get().getMac()); + to.setVipUuid(vip.getUuid()); + to.setSystem(vip.isSystem()); + vipTOS.add(to); + } + + return vipTOS; + } + + @Override + public void preVmMigration(VmInstanceInventory vm, VmMigrationType type, String dstHostUuid, Completion completion) { + if (ApplianceVmConstant.APPLIANCE_VM_TYPE.equals(vm.getType())) { + VirtualRouterVmVO vrVo = Q.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, vm.getUuid()).find(); + if (vrVo != null && vrVo.isHaEnabled()) { + List exps = pluginRgty.getExtensionList(VirtualRouterHaGroupExtensionPoint.class); + if (exps.isEmpty()) { + completion.success(); + return; + } + String peerUuid = exps.get(0).getPeerUuid(vrVo.getUuid()); + if (peerUuid == null) { + completion.success(); + return; + } + if (ApplianceVmHaStatus.Master.equals(vrVo.getHaStatus()) && + ApplianceVmStatus.Connected.equals(vrVo.getStatus()) && + Q.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.status, ApplianceVmStatus.Connected) + .eq(VirtualRouterVmVO_.uuid, peerUuid).isExists()) { + logger.debug(String.format("demote ha master before migrate, virtual router[uuid:%s]", vrVo.getUuid())); + VirtualRouterAsyncHttpCallMsg msg = new VirtualRouterAsyncHttpCallMsg(); + msg.setVmInstanceUuid(vrVo.getUuid()); + msg.setCommand(new VirtualRouterCommands.AgentCommand()); + msg.setCheckStatus(true); + msg.setPath(VirtualRouterConstant.VR_HA_MASTER_DEMOTE); + bus.makeTargetServiceIdByResourceUuid(msg, VmInstanceConstant.SERVICE_ID, vrVo.getUuid()); + bus.send(msg, new CloudBusCallBack(null) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.warn(reply.getError().toString()); + } + completion.success(); + } + }); + } + } + } + completion.success(); + } } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/EipTO.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/EipTO.java index 47f8b19b1ea..18294f8f401 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/EipTO.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/EipTO.java @@ -11,6 +11,7 @@ public class EipTO implements Serializable { private String guestIp; private boolean snatInboundTraffic; private boolean needCleanGuestIp; + private String ipVersion; public boolean isNeedCleanGuestIp() { return needCleanGuestIp; @@ -59,4 +60,13 @@ public String getPublicMac() { public void setPublicMac(String publicMac) { this.publicMac = publicMac; } + + public String getIpVersion() { + return ipVersion; + } + + public void setIpVersion(String ipVersion) { + this.ipVersion = ipVersion; + } + } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterEipBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterEipBackend.java index 13afecdb820..9c789ca1501 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterEipBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterEipBackend.java @@ -19,10 +19,10 @@ import org.zstack.header.message.MessageReply; import org.zstack.header.network.l3.L3NetworkInventory; import org.zstack.header.network.l3.L3NetworkVO; +import org.zstack.header.network.l3.UsedIpInventory; +import org.zstack.header.network.l3.UsedIpVO; import org.zstack.header.network.service.*; -import org.zstack.header.vm.VmInstanceConstant; -import org.zstack.header.vm.VmInstanceState; -import org.zstack.header.vm.VmNicInventory; +import org.zstack.header.vm.*; import org.zstack.network.service.NetworkServiceManager; import org.zstack.network.service.eip.*; import org.zstack.network.service.virtualrouter.*; @@ -35,6 +35,7 @@ import org.zstack.utils.function.Function; import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; +import org.zstack.utils.network.IPv6NetworkUtils; import javax.persistence.Tuple; import java.util.*; @@ -140,8 +141,10 @@ public String call(VmNicInventory arg) { .map(VmNicInventory::getMac) .orElse(null)); to.setVipIp(struct.getVip().getIp()); - to.setGuestIp(struct.getNic().getIp()); to.setSnatInboundTraffic(struct.isSnatInboundTraffic()); + to.setIpVersion(IPv6NetworkUtils.getIpVersion(to.getVipIp())); + to.setGuestIp(IPv6NetworkUtils.getIpByIpVersion(to.getIpVersion(), + struct.getNic().getUsedIps().stream().map(UsedIpInventory::getIp).collect(Collectors.toList()))); VirtualRouterCommands.CreateEipCmd cmd = new VirtualRouterCommands.CreateEipCmd(); cmd.setEip(to); @@ -292,12 +295,14 @@ public String call(VmNicInventory arg) { to.setPrivateMac(priMac); to.setSnatInboundTraffic(struct.isSnatInboundTraffic()); to.setVipIp(struct.getVip().getIp()); - to.setGuestIp(struct.getNic().getIp()); to.setNeedCleanGuestIp(!Q.New(EipVO.class) .eq(EipVO_.guestIp, struct.getEip().getGuestIp()) .eq(EipVO_.vmNicUuid, struct.getEip().getVmNicUuid()) .notEq(EipVO_.vipIp, struct.getEip().getVipIp()) .isExists()); + to.setIpVersion(IPv6NetworkUtils.getIpVersion(to.getVipIp())); + to.setGuestIp(IPv6NetworkUtils.getIpByIpVersion(to.getIpVersion(), + struct.getNic().getUsedIps().stream().map(UsedIpInventory::getIp).collect(Collectors.toList()))); cmd.setEip(to); VirtualRouterAsyncHttpCallMsg msg = new VirtualRouterAsyncHttpCallMsg(); @@ -559,6 +564,7 @@ private List findEipsOnVirtualRouter(VmNicInventory nic, boolean attach) continue; } to.setPublicMac(pubNic.get().getMac()); + to.setIpVersion(IPv6NetworkUtils.getIpVersion(to.getVipIp())); ret.add(to); } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterSyncEipOnStartFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterSyncEipOnStartFlow.java index 2700139a648..7b3c4525b54 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterSyncEipOnStartFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterSyncEipOnStartFlow.java @@ -7,6 +7,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.core.timeout.ApiTimeoutManager; import org.zstack.header.core.workflow.Flow; @@ -15,9 +16,8 @@ import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.message.MessageReply; -import org.zstack.header.vm.VmInstanceConstant; -import org.zstack.header.vm.VmInstanceState; -import org.zstack.header.vm.VmNicInventory; +import org.zstack.header.network.l3.UsedIpVO; +import org.zstack.header.vm.*; import org.zstack.network.service.eip.EipConstant; import org.zstack.network.service.eip.EipGlobalConfig; import org.zstack.network.service.eip.EipVO; @@ -30,13 +30,11 @@ import org.zstack.utils.Utils; import org.zstack.utils.function.Function; import org.zstack.utils.logging.CLogger; +import org.zstack.utils.network.IPv6NetworkUtils; import javax.persistence.Tuple; import javax.persistence.TypedQuery; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.Callable; import java.util.stream.Collectors; @@ -63,7 +61,7 @@ public class VirtualRouterSyncEipOnStartFlow implements Flow { @Transactional(readOnly = true) private List findEipOnThisRouter(VirtualRouterVmInventory vr, List eipUuids) { - String sql = "select vip.ip, nic.l3NetworkUuid, nic.ip, vip.l3NetworkUuid from EipVO eip, VipVO vip, VmNicVO nic " + + String sql = "select vip.ip, nic.l3NetworkUuid, nic.uuid, vip.l3NetworkUuid from EipVO eip, VipVO vip, VmNicVO nic " + " where eip.vipUuid = vip.uuid and vip.serviceProvider in (:providers) "+ " and eip.vmNicUuid = nic.uuid and eip.uuid in (:euuids)"; TypedQuery q = dbf.getEntityManager().createQuery(sql, Tuple.class); @@ -75,7 +73,7 @@ private List findEipOnThisRouter(VirtualRouterVmInventory vr, List() { @Override @@ -96,15 +94,17 @@ public String call(VmNicInventory arg) { return null; } }); - + VmNicVO guestNicVo = Q.New(VmNicVO.class).eq(VmNicVO_.uuid, guestNicUuid).find(); + Set usedIps = guestNicVo.getUsedIps(); DebugUtils.Assert(privMac!=null, String.format("cannot find private nic[l3NetworkUuid:%s] on virtual router[uuid:%s]", l3Uuid, vr.getUuid())); EipTO to = new EipTO(); to.setVipIp(vipIp); to.setPublicMac(publicMac); - to.setGuestIp(guestIp); to.setPrivateMac(privMac); to.setSnatInboundTraffic(EipGlobalConfig.SNAT_INBOUND_TRAFFIC.value(Boolean.class)); + to.setIpVersion(IPv6NetworkUtils.getIpVersion(to.getVipIp())); + to.setGuestIp(IPv6NetworkUtils.getIpByIpVersion(to.getIpVersion(), usedIps.stream().map(UsedIpVO::getIp).collect(Collectors.toList()))); ret.add(to); } diff --git a/testlib/src/main/java/org/zstack/testlib/VirtualRouterOfferingSpec.groovy b/testlib/src/main/java/org/zstack/testlib/VirtualRouterOfferingSpec.groovy index 9fdc572b6d1..4fdf960c792 100755 --- a/testlib/src/main/java/org/zstack/testlib/VirtualRouterOfferingSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/VirtualRouterOfferingSpec.groovy @@ -176,6 +176,10 @@ class VirtualRouterOfferingSpec extends InstanceOfferingSpec { simulator(VirtualRouterConstant.VR_CHANGE_DEFAULT_ROUTE_NETWORK) { return new VirtualRouterCommands.ChangeDefaultNicRsp() } + + simulator(VirtualRouterConstant.VR_HA_MASTER_DEMOTE) { + return new VirtualRouterCommands.AgentResponse() + } } } diff --git a/utils/src/main/java/org/zstack/utils/network/IPv6NetworkUtils.java b/utils/src/main/java/org/zstack/utils/network/IPv6NetworkUtils.java index b8b7998ea17..03b47d0d7a3 100644 --- a/utils/src/main/java/org/zstack/utils/network/IPv6NetworkUtils.java +++ b/utils/src/main/java/org/zstack/utils/network/IPv6NetworkUtils.java @@ -9,6 +9,7 @@ import java.math.BigInteger; import java.util.Arrays; +import java.util.List; public class IPv6NetworkUtils { private final static CLogger logger = Utils.getLogger(IPv6NetworkUtils.class); @@ -18,6 +19,9 @@ public class IPv6NetworkUtils { // MAC 地址正则表达式 private static String macRegex = "^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$"; + private static String IP_VERSION_4 = "ipv4"; + private static String IP_VERSION_6 = "ipv6"; + private static boolean isConsecutiveRange(BigInteger[] allocatedIps) { BigInteger first = allocatedIps[0]; BigInteger last = allocatedIps[allocatedIps.length - 1]; @@ -471,4 +475,25 @@ public static int getPrefixLengthFromNetmask(String mask) { return 0; } + + public static String getIpVersion(String ip) { + if (isValidIpv4(ip)) { + return IP_VERSION_4; + } else if (isValidIpv6(ip)) { + return IP_VERSION_6; + } + throw new IllegalArgumentException("Invalid IP address: " + ip); + } + + public static String getIpByIpVersion(String ipVersion, List ipList) { + if (ipList == null || ipList.isEmpty()) { + throw new IllegalArgumentException("The provided IP list cannot be null or empty."); + } + for (String ip : ipList) { + if (getIpVersion(ip).equals(ipVersion)) { + return ip; + } + } + throw new IllegalArgumentException("No IP address in the list matches the provided IP version: " + ipVersion); + } } From f12e8288d78aa32b325abddb4dba192b00dc45c9 Mon Sep 17 00:00:00 2001 From: gitlab Date: Fri, 1 Nov 2024 08:29:12 +0000 Subject: [PATCH 021/737] Merge branch 'ZSTAC-70539' into '4.8.22' [utils]: modify IP6MASK ff800 to ff00 See merge request zstackio/zstack!7160 (cherry picked from commit e057506d0cce85d505bd5382d9902b2035fd01c8) 9db4a5d9 [utils]: modify IP6MASK ff800 to ff00 --- .../main/java/org/zstack/utils/network/IPv6NetworkUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/src/main/java/org/zstack/utils/network/IPv6NetworkUtils.java b/utils/src/main/java/org/zstack/utils/network/IPv6NetworkUtils.java index b8b7998ea17..429834ed02f 100644 --- a/utils/src/main/java/org/zstack/utils/network/IPv6NetworkUtils.java +++ b/utils/src/main/java/org/zstack/utils/network/IPv6NetworkUtils.java @@ -278,7 +278,7 @@ public static String getFormalCidrOfNetworkCidr(String cidr) { private static final String[] IP6MASK = new String[] { "8000", "c000", "e000", "f000", - "f800", "fc00", "fe00", "ff800", + "f800", "fc00", "fe00", "ff00", "ff80", "ffc0", "ffe0", "fff0", "fff8", "fffc", "fffe", "ffff" }; From f8dfbfa44729a150332d049eebaf1871f58d1f7b Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Mon, 4 Nov 2024 18:53:23 +0800 Subject: [PATCH 022/737] [search]: Compatible Mysql group by returns all columns Compatible Mysql group by returns all columns Resolves: ZSTAC-70909 Change-Id: I676563686a6764687270676e667a6d68766e6163 --- .../zql/ast/visitors/plugin/AbstractQueryVisitorPlugin.java | 2 +- .../java/org/zstack/zql/ast/visitors/plugin/QueryPlugin.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/search/src/main/java/org/zstack/zql/ast/visitors/plugin/AbstractQueryVisitorPlugin.java b/search/src/main/java/org/zstack/zql/ast/visitors/plugin/AbstractQueryVisitorPlugin.java index 05c25a618cf..3445f1a32d5 100755 --- a/search/src/main/java/org/zstack/zql/ast/visitors/plugin/AbstractQueryVisitorPlugin.java +++ b/search/src/main/java/org/zstack/zql/ast/visitors/plugin/AbstractQueryVisitorPlugin.java @@ -28,7 +28,7 @@ public AbstractQueryVisitorPlugin(ASTNode.Query node) { public List targetFields() { ZQLMetadata.InventoryMetadata inventory = ZQLMetadata.findInventoryMetadata(node.getTarget().getEntity()); List fieldNames = new ArrayList<>(); - if (node.getGroupBy() != null) { + if (node.getGroupBy() != null && node.getTarget().getFunction() != null) { fieldNames.addAll(node.getGroupBy().getFields()); } if (node.getTarget().getFields() != null) { diff --git a/search/src/main/java/org/zstack/zql/ast/visitors/plugin/QueryPlugin.java b/search/src/main/java/org/zstack/zql/ast/visitors/plugin/QueryPlugin.java index 0168d070c35..911dc2896f1 100755 --- a/search/src/main/java/org/zstack/zql/ast/visitors/plugin/QueryPlugin.java +++ b/search/src/main/java/org/zstack/zql/ast/visitors/plugin/QueryPlugin.java @@ -61,8 +61,10 @@ public String selectTarget() { if (StringUtils.isNotBlank(queryTarget)) { if (isDistinct(function)) { return queryTarget.concat(",").concat(groupByTarget); - } else { + } else if (function != null) { return groupByTarget.concat(",").concat(queryTarget); + } else { + return queryTarget; } } else { return groupByTarget; From ca32858b3ba53bc11db883834e8565b8f6dec3bf Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 31 Oct 2024 22:19:28 +0900 Subject: [PATCH 023/737] [expon]: deactivate volume before adding volume to blacklist Resolves: ZSTAC-67083 Change-Id: I656f6e6e6b6476776766626b726f777472736a61 --- .../src/main/java/org/zstack/expon/ExponStorageController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java index 9d1b89ea9b4..4750f03faf5 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java +++ b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java @@ -203,7 +203,6 @@ private ActiveVolumeTO activeVhostVolume(HostInventory h, BaseVolumeInfo vol) { // TODO not remove every time apiHelper.removeVolumePathFromBlacklist(buildExponVolumeBoundPath(uss, exponVol.getVolumeName()), exponVol.getId(), getSelfPools()); - VhostVolumeTO to = new VhostVolumeTO(); to.setInstallPath(vhost.getPath()); return to; From 351f3592cc9b1db702a5cc79147d06cd90e1b68d Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 31 Oct 2024 22:20:00 +0900 Subject: [PATCH 024/737] [expon]: support get volume blacklist Resolves: ZSTAC-67083 Change-Id: I62746d69786879637a7775686477796867736d66 --- .../src/main/java/org/zstack/expon/ExponStorageController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java index 4750f03faf5..9d1b89ea9b4 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java +++ b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java @@ -203,6 +203,7 @@ private ActiveVolumeTO activeVhostVolume(HostInventory h, BaseVolumeInfo vol) { // TODO not remove every time apiHelper.removeVolumePathFromBlacklist(buildExponVolumeBoundPath(uss, exponVol.getVolumeName()), exponVol.getId(), getSelfPools()); + VhostVolumeTO to = new VhostVolumeTO(); to.setInstallPath(vhost.getPath()); return to; From 3010c89ccd6f82e5c00bcb2d7b7024b56cde514d Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 31 Oct 2024 22:20:28 +0900 Subject: [PATCH 025/737] bump version to 5.1.19 DBImpact Change-Id: I63776b6c65656568676561766d77637978686666 --- conf/db/upgrade/V5.1.19__schema.sql | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 conf/db/upgrade/V5.1.19__schema.sql diff --git a/conf/db/upgrade/V5.1.19__schema.sql b/conf/db/upgrade/V5.1.19__schema.sql new file mode 100644 index 00000000000..e69de29bb2d From a23bd4a211ddc071380576f7ff718071e7a2b508 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 31 Oct 2024 22:21:00 +0900 Subject: [PATCH 026/737] [sso]: support sso server Resolves: ZSTAC-66623 Change-Id: I6467666238676e6d666175747477786a71677963 (cherry picked from commit 0d582b8815de9fa822ce92282a817633e327f42e) --- conf/db/upgrade/V5.1.19__schema.sql | 10 ++++++++++ .../src/main/java/org/zstack/testlib/EnvSpec.groovy | 1 - 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.1.19__schema.sql b/conf/db/upgrade/V5.1.19__schema.sql index e69de29bb2d..44a1030ae40 100644 --- a/conf/db/upgrade/V5.1.19__schema.sql +++ b/conf/db/upgrade/V5.1.19__schema.sql @@ -0,0 +1,10 @@ +CREATE TABLE IF NOT EXISTS `zstack`.`SSOServerTokenVO`( + `uuid` varchar(32) not null unique, + `accessToken` text DEFAULT NULL, + `idToken` text DEFAULT NULL, + `refreshToken` text DEFAULT NULL, + `userUuid` varchar(32) DEFAULT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/testlib/src/main/java/org/zstack/testlib/EnvSpec.groovy b/testlib/src/main/java/org/zstack/testlib/EnvSpec.groovy index 68c1cafe297..6308fb85707 100755 --- a/testlib/src/main/java/org/zstack/testlib/EnvSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/EnvSpec.groovy @@ -707,7 +707,6 @@ class EnvSpec extends ApiHelper implements Node { "EventRecordsVO", "AuditsVO", "AlarmRecordsVO", "VmCrashHistoryVO", "EncryptionIntegrityVO", "FileIntegrityVerificationVO", "EncryptEntityMetadataVO", "VmInstanceDeviceAddressGroupVO", "HostOsCategoryVO", "KvmHostHypervisorMetadataVO", "HaStrategyConditionVO", "SystemTagVO", "ConsoleProxyAgentVO", "ConsoleProxyVO", "XmlHookVO", "SSOServerTokenVO"]) { - // those tables will continue having entries during running a test suite return } From 6afd547f7fa446907123f29867dde021b2795001 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 31 Oct 2024 22:21:29 +0900 Subject: [PATCH 027/737] [externalservice]: marketplace Resolves: ZHCI-2514 Change-Id: I6773796b76736d6b64777a786c787a787a637371 (cherry picked from commit 4b82f3f99ab36c4305056d86747c839bc0c7282f) (cherry picked from commit 35b0fbfebd7d86bc59fd3433afe15e8e06b1906a) --- .../src/main/java/org/zstack/compute/vm/VmSystemTags.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java b/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java index d48265f56cb..9a5c90b115c 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java @@ -240,6 +240,12 @@ public class VmSystemTags { MARKET_PLACE_TOKEN, VmInstanceVO.class ); + public static final String MARKET_PLACE_TOKEN = "marketplace::true"; + + public static PatternedSystemTag CREATED_BY_MARKETPLACE = new PatternedSystemTag( + MARKET_PLACE_TOKEN, VmInstanceVO.class + ); + public static class UserdataTagOutputHandler implements SensitiveTagOutputHandler { private final String chpasswd = "chpasswd"; private final String list = "list"; From c979f11ca4586d6d8cb48bfc627d633475d60e0d Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Thu, 13 Jun 2024 15:07:22 +0800 Subject: [PATCH 028/737] [conf]: Add new table DBImpact Change-Id: I7066627367796a78626576716164696e71696772 --- conf/db/upgrade/V5.1.8.1__schema.sql | 48 ++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 conf/db/upgrade/V5.1.8.1__schema.sql diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql new file mode 100644 index 00000000000..a497208a3dc --- /dev/null +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -0,0 +1,48 @@ +CREATE TABLE IF NOT EXISTS `zstack`.`ModelCenterVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(128) DEFAULT NULL, + `description` varchar(2048) DEFAULT NULL, + `url` varchar(2048) DEFAULT NULL, + `parameters` varchar(128) DEFAULT NULL, + PRIMARY KEY (`uuid`), +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) DEFAULT NULL, + `description` varchar(2048) DEFAULT NULL, + `modelCenterUuid` varchar(32) NOT NULL, + `parameters` mediumtext DEFAULT NULL, + `installPath` varchar(2048) DEFAULT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT fkModelVOModelCenterVO FOREIGN KEY (uuid) REFERENCES ModelCenterVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) DEFAULT NULL, + `description` varchar(2048) DEFAULT NULL, + `yaml` mediumtext NOT NULL, + `requestCpu` int(10) NOT NULL, + `requestMem` bigint(20) NOT NULL, + PRIMARY KEY (`uuid`), +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceInstanceVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `description` varchar(2048) DEFAULT NULL, + `yaml` mediumtext NOT NULL, + `status` varchar(255) NOT NULL, + `url` varchar(2048) NOT NULL, + `modelServiceUuid` varchar(32) NOT NULL, + PRIMARY KEY (`uuid`), +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceRefVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `modelUuid` varchar(32) NOT NULL, + `modelServiceUuid` varchar(32) NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT fkModelRefVO FOREIGN KEY (modelUuid) REFERENCES ModelVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE + CONSTRAINT fkModelServiceRefVO FOREIGN KEY (modelServiceUuid) REFERENCES ModelServiceVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; From 3c05efe63aea2ba6725f2e93293fe6b3eaef2ae8 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Thu, 13 Jun 2024 17:50:36 +0800 Subject: [PATCH 029/737] [sdk]: Add sdk Change-Id: I797a7771746c736a7066706c7872666a78706b69 --- sdk/src/main/java/SourceClassMap.java | 6 + .../java/org/zstack/sdk/AddModelAction.java | 113 ++++++++ .../org/zstack/sdk/AddModelCenterAction.java | 110 ++++++++ .../org/zstack/sdk/AddModelCenterResult.java | 14 + .../java/org/zstack/sdk/AddModelResult.java | 14 + .../org/zstack/sdk/AddModelServiceAction.java | 119 +++++++++ .../org/zstack/sdk/AddModelServiceResult.java | 14 + .../zstack/sdk/BindModelToServiceAction.java | 104 ++++++++ .../zstack/sdk/BindModelToServiceResult.java | 14 + .../org/zstack/sdk/DeleteModelAction.java | 104 ++++++++ .../org/zstack/sdk/DeleteModelResult.java | 7 + .../zstack/sdk/DeleteModelServiceAction.java | 104 ++++++++ .../zstack/sdk/DeleteModelServiceResult.java | 7 + .../org/zstack/sdk/ModelCenterInventory.java | 47 ++++ .../java/org/zstack/sdk/ModelInventory.java | 55 ++++ .../org/zstack/sdk/ModelServiceInventory.java | 55 ++++ .../java/org/zstack/sdk/QueryModelAction.java | 75 ++++++ .../zstack/sdk/QueryModelCenterAction.java | 75 ++++++ .../zstack/sdk/QueryModelCenterResult.java | 22 ++ .../java/org/zstack/sdk/QueryModelResult.java | 22 ++ .../zstack/sdk/QueryModelServiceAction.java | 75 ++++++ .../zstack/sdk/QueryModelServiceResult.java | 22 ++ .../java/org/zstack/testlib/ApiHelper.groovy | 249 ++++++++++++++++++ 23 files changed, 1427 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/AddModelAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/AddModelCenterResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/AddModelResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/AddModelServiceResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/BindModelToServiceAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/BindModelToServiceResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteModelAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteModelResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteModelServiceAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteModelServiceResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ModelInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryModelAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryModelCenterAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryModelCenterResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryModelResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryModelServiceAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryModelServiceResult.java diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 5b7d7f416d8..e8eb93706a2 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -7,6 +7,9 @@ public class SourceClassMap { { put("org.zstack.accessKey.AccessKeyInventory", "org.zstack.sdk.AccessKeyInventory"); put("org.zstack.accessKey.AccessKeyState", "org.zstack.sdk.AccessKeyState"); + put("org.zstack.ai.ModelCenterInventory", "org.zstack.sdk.ModelCenterInventory"); + put("org.zstack.ai.ModelInventory", "org.zstack.sdk.ModelInventory"); + put("org.zstack.ai.ModelServiceInventory", "org.zstack.sdk.ModelServiceInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessGroupInventory", "org.zstack.sdk.AliyunNasAccessGroupInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessRuleInventory", "org.zstack.sdk.AliyunNasAccessRuleInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasFileSystemInventory", "org.zstack.sdk.AliyunNasFileSystemInventory"); @@ -1053,6 +1056,9 @@ public class SourceClassMap { put("org.zstack.sdk.MiniStorageResourceReplicationInventory", "org.zstack.storage.primary.ministorage.MiniStorageResourceReplicationInventory"); put("org.zstack.sdk.MiniStorageType", "org.zstack.storage.primary.ministorage.MiniStorageType"); put("org.zstack.sdk.MirrorNetworkUsedIpInventory", "org.zstack.header.portMirror.MirrorNetworkUsedIpInventory"); + put("org.zstack.sdk.ModelCenterInventory", "org.zstack.ai.ModelCenterInventory"); + put("org.zstack.sdk.ModelInventory", "org.zstack.ai.ModelInventory"); + put("org.zstack.sdk.ModelServiceInventory", "org.zstack.ai.ModelServiceInventory"); put("org.zstack.sdk.MonitorTriggerActionInventory", "org.zstack.monitoring.actions.MonitorTriggerActionInventory"); put("org.zstack.sdk.MonitorTriggerInventory", "org.zstack.monitoring.MonitorTriggerInventory"); put("org.zstack.sdk.MttyDeviceInventory", "org.zstack.mttyDevice.MttyDeviceInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelAction.java new file mode 100644 index 00000000000..fe57815fcfb --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddModelAction.java @@ -0,0 +1,113 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class AddModelAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.AddModelResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String installPath; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String parameters; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelCenterUuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.AddModelResult value = res.getResult(org.zstack.sdk.AddModelResult.class); + ret.value = value == null ? new org.zstack.sdk.AddModelResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/ai/models"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "param"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java new file mode 100644 index 00000000000..970605605af --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java @@ -0,0 +1,110 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class AddModelCenterAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.AddModelCenterResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String url; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false) + public java.lang.String parameters; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.AddModelCenterResult value = res.getResult(org.zstack.sdk.AddModelCenterResult.class); + ret.value = value == null ? new org.zstack.sdk.AddModelCenterResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/ai/model-centers"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "param"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelCenterResult.java b/sdk/src/main/java/org/zstack/sdk/AddModelCenterResult.java new file mode 100644 index 00000000000..864cbd4013b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddModelCenterResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelCenterInventory; + +public class AddModelCenterResult { + public ModelCenterInventory inventory; + public void setInventory(ModelCenterInventory inventory) { + this.inventory = inventory; + } + public ModelCenterInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelResult.java b/sdk/src/main/java/org/zstack/sdk/AddModelResult.java new file mode 100644 index 00000000000..2529872515c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddModelResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelInventory; + +public class AddModelResult { + public ModelInventory inventory; + public void setInventory(ModelInventory inventory) { + this.inventory = inventory; + } + public ModelInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java new file mode 100644 index 00000000000..3f318f2f100 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -0,0 +1,119 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class AddModelServiceAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.AddModelServiceResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String dockerImageName; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String yaml; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmInstanceImageUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer requestCpu; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long requestMemory; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.AddModelServiceResult value = res.getResult(org.zstack.sdk.AddModelServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.AddModelServiceResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/ai/model-service"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "param"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceResult.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceResult.java new file mode 100644 index 00000000000..497746b4cdd --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceInventory; + +public class AddModelServiceResult { + public ModelServiceInventory inventory; + public void setInventory(ModelServiceInventory inventory) { + this.inventory = inventory; + } + public ModelServiceInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/BindModelToServiceAction.java b/sdk/src/main/java/org/zstack/sdk/BindModelToServiceAction.java new file mode 100644 index 00000000000..bead77e8f0a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/BindModelToServiceAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class BindModelToServiceAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.BindModelToServiceResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelServiceUuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.BindModelToServiceResult value = res.getResult(org.zstack.sdk.BindModelToServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.BindModelToServiceResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/ai/models/{modelUuid}/model-services/{modelServiceUuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "param"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/BindModelToServiceResult.java b/sdk/src/main/java/org/zstack/sdk/BindModelToServiceResult.java new file mode 100644 index 00000000000..7f317c25703 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/BindModelToServiceResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceInventory; + +public class BindModelToServiceResult { + public ModelServiceInventory inventory; + public void setInventory(ModelServiceInventory inventory) { + this.inventory = inventory; + } + public ModelServiceInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelAction.java new file mode 100644 index 00000000000..1780cbfbd32 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteModelAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeleteModelResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeleteModelResult value = res.getResult(org.zstack.sdk.DeleteModelResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteModelResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/ai/models/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelResult.java new file mode 100644 index 00000000000..6c11a38d71f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteModelResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceAction.java new file mode 100644 index 00000000000..1126bcc2fad --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteModelServiceAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeleteModelServiceResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeleteModelServiceResult value = res.getResult(org.zstack.sdk.DeleteModelServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteModelServiceResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/ai/model-services/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceResult.java new file mode 100644 index 00000000000..cff27f53825 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteModelServiceResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java new file mode 100644 index 00000000000..411c0d60aad --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java @@ -0,0 +1,47 @@ +package org.zstack.sdk; + + + +public class ModelCenterInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public java.lang.String url; + public void setUrl(java.lang.String url) { + this.url = url; + } + public java.lang.String getUrl() { + return this.url; + } + + public java.lang.String parameters; + public void setParameters(java.lang.String parameters) { + this.parameters = parameters; + } + public java.lang.String getParameters() { + return this.parameters; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java new file mode 100644 index 00000000000..b62f718b0bf --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java @@ -0,0 +1,55 @@ +package org.zstack.sdk; + + + +public class ModelInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public java.lang.String installPath; + public void setInstallPath(java.lang.String installPath) { + this.installPath = installPath; + } + public java.lang.String getInstallPath() { + return this.installPath; + } + + public java.lang.String parameters; + public void setParameters(java.lang.String parameters) { + this.parameters = parameters; + } + public java.lang.String getParameters() { + return this.parameters; + } + + public java.lang.String modelCenterUuid; + public void setModelCenterUuid(java.lang.String modelCenterUuid) { + this.modelCenterUuid = modelCenterUuid; + } + public java.lang.String getModelCenterUuid() { + return this.modelCenterUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java new file mode 100644 index 00000000000..d6ab5eeaea7 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java @@ -0,0 +1,55 @@ +package org.zstack.sdk; + + + +public class ModelServiceInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public java.lang.String yaml; + public void setYaml(java.lang.String yaml) { + this.yaml = yaml; + } + public java.lang.String getYaml() { + return this.yaml; + } + + public java.lang.Integer requestCpu; + public void setRequestCpu(java.lang.Integer requestCpu) { + this.requestCpu = requestCpu; + } + public java.lang.Integer getRequestCpu() { + return this.requestCpu; + } + + public java.lang.Long requestMemory; + public void setRequestMemory(java.lang.Long requestMemory) { + this.requestMemory = requestMemory; + } + public java.lang.Long getRequestMemory() { + return this.requestMemory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelAction.java b/sdk/src/main/java/org/zstack/sdk/QueryModelAction.java new file mode 100644 index 00000000000..e93b4f4a03a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryModelAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryModelResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryModelResult value = res.getResult(org.zstack.sdk.QueryModelResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryModelResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/ai/models"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/QueryModelCenterAction.java new file mode 100644 index 00000000000..dd08be13bb9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelCenterAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryModelCenterAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryModelCenterResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryModelCenterResult value = res.getResult(org.zstack.sdk.QueryModelCenterResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryModelCenterResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/ai/model-centers"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelCenterResult.java b/sdk/src/main/java/org/zstack/sdk/QueryModelCenterResult.java new file mode 100644 index 00000000000..3196f0a0e5e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelCenterResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryModelCenterResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelResult.java b/sdk/src/main/java/org/zstack/sdk/QueryModelResult.java new file mode 100644 index 00000000000..2546d91e798 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryModelResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryModelServiceAction.java new file mode 100644 index 00000000000..362ca8d1d80 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelServiceAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryModelServiceAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryModelServiceResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryModelServiceResult value = res.getResult(org.zstack.sdk.QueryModelServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryModelServiceResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/ai/model-services"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelServiceResult.java b/sdk/src/main/java/org/zstack/sdk/QueryModelServiceResult.java new file mode 100644 index 00000000000..214d364a141 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelServiceResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryModelServiceResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index f04007cdbd8..c2137c2b45c 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -1961,6 +1961,87 @@ abstract class ApiHelper { } + def addModel(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddModelAction.class) Closure c) { + def a = new org.zstack.sdk.AddModelAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def addModelCenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddModelCenterAction.class) Closure c) { + def a = new org.zstack.sdk.AddModelCenterAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def addModelService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddModelServiceAction.class) Closure c) { + def a = new org.zstack.sdk.AddModelServiceAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def addMonToCephBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddMonToCephBackupStorageAction.class) Closure c) { def a = new org.zstack.sdk.AddMonToCephBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -4607,6 +4688,33 @@ abstract class ApiHelper { } + def bindModelToService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.BindModelToServiceAction.class) Closure c) { + def a = new org.zstack.sdk.BindModelToServiceAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def bootstrapMiniHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.BootstrapMiniHostAction.class) Closure c) { def a = new org.zstack.sdk.BootstrapMiniHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -14435,6 +14543,60 @@ abstract class ApiHelper { } + def deleteModel(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteModelAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def deleteModelService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelServiceAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteModelServiceAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def deleteMonitorTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteMonitorTriggerAction.class) Closure c) { def a = new org.zstack.sdk.DeleteMonitorTriggerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -30410,6 +30572,93 @@ abstract class ApiHelper { } + def queryModel(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryModelAction.class) Closure c) { + def a = new org.zstack.sdk.QueryModelAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def queryModelCenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryModelCenterAction.class) Closure c) { + def a = new org.zstack.sdk.QueryModelCenterAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def queryModelService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryModelServiceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryModelServiceAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryMonitorTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMonitorTriggerAction.class) Closure c) { def a = new org.zstack.sdk.QueryMonitorTriggerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From ceed0f26776b97ed5b4e2b74ffd7d9266fd99907 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Fri, 14 Jun 2024 10:23:55 +0800 Subject: [PATCH 030/737] [build]: fix bug DBImpact Change-Id: I626f646867746f6e62636973767970637a637361 --- build/pom.xml | 5 +++++ conf/db/upgrade/V5.1.8.1__schema.sql | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/build/pom.xml b/build/pom.xml index 2d4d59a8ae6..59818f94fa0 100755 --- a/build/pom.xml +++ b/build/pom.xml @@ -892,6 +892,11 @@ sshKeyPair ${project.version} + + org.zstack + ai + ${project.version} + org.zstack snmp diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index a497208a3dc..6f28b6ff73f 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -4,7 +4,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelCenterVO` ( `description` varchar(2048) DEFAULT NULL, `url` varchar(2048) DEFAULT NULL, `parameters` varchar(128) DEFAULT NULL, - PRIMARY KEY (`uuid`), + PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `zstack`.`ModelVO` ( @@ -25,7 +25,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceVO` ( `yaml` mediumtext NOT NULL, `requestCpu` int(10) NOT NULL, `requestMem` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`), + PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceInstanceVO` ( @@ -35,7 +35,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceInstanceVO` ( `status` varchar(255) NOT NULL, `url` varchar(2048) NOT NULL, `modelServiceUuid` varchar(32) NOT NULL, - PRIMARY KEY (`uuid`), + PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceRefVO` ( @@ -43,6 +43,6 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceRefVO` ( `modelUuid` varchar(32) NOT NULL, `modelServiceUuid` varchar(32) NOT NULL, PRIMARY KEY (`uuid`), - CONSTRAINT fkModelRefVO FOREIGN KEY (modelUuid) REFERENCES ModelVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE + CONSTRAINT fkModelRefVO FOREIGN KEY (modelUuid) REFERENCES ModelVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE, CONSTRAINT fkModelServiceRefVO FOREIGN KEY (modelServiceUuid) REFERENCES ModelServiceVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; From 696a1a0213fb3940c96d5b3748f87078792e41f0 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 14 Jun 2024 11:54:45 +0800 Subject: [PATCH 031/737] [conf]: fix ModelServiceVO schema DBImpact Resolves: ZSTAC-65138 Change-Id: I7a7a6c6979616661616a63616f797a63647a6a76 --- conf/db/upgrade/V5.1.8.1__schema.sql | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 6f28b6ff73f..89274abbcf4 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -25,7 +25,9 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceVO` ( `yaml` mediumtext NOT NULL, `requestCpu` int(10) NOT NULL, `requestMem` bigint(20) NOT NULL, - PRIMARY KEY (`uuid`) + `modelUuid` varchar(32) NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT fkModelServiceVOModelVO FOREIGN KEY (uuid) REFERENCES ModelVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceInstanceVO` ( From 3f83dbae47db3d43437c09b6646623345cd44cae Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 14 Jun 2024 12:27:45 +0800 Subject: [PATCH 032/737] [testlib]: fix code generator Resolves: ZSTAC-66285 Change-Id: I6d716b6e616a6e766175656369676a6479697675 Signed-off-by: AlanJager --- .../main/java/org/zstack/testlib/tool/CodeGenerator.groovy | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/testlib/src/main/java/org/zstack/testlib/tool/CodeGenerator.groovy b/testlib/src/main/java/org/zstack/testlib/tool/CodeGenerator.groovy index 91fdc39f4e0..6b4d96ce38e 100644 --- a/testlib/src/main/java/org/zstack/testlib/tool/CodeGenerator.groovy +++ b/testlib/src/main/java/org/zstack/testlib/tool/CodeGenerator.groovy @@ -1,5 +1,7 @@ package org.zstack.testlib.tool +import org.reflections.Reflections +import org.zstack.utils.BeanUtils import org.zstack.utils.StringTemplateUtils import javax.persistence.* @@ -25,7 +27,8 @@ class CodeGenerator { * * @param entityClass the jpa vo entity class */ - static void generateCodeFromJpaEntity(Class entityClass) { + static void generateCodeFromJpaEntity(String entity) { + Class entityClass = BeanUtils.reflections.forClass(entity) if (!entityClass.isAnnotationPresent(Entity.class) && !entityClass.isAnnotationPresent(MappedSuperclass.class)) { System.out.printf("%s is not a JPA entity class", entityClass.getName()) return From 29dc5593ec38f79f847834d4cd0927101db67991 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 14 Jun 2024 13:16:03 +0800 Subject: [PATCH 033/737] [sdk]: update sdk and apihelper Resolves: ZSTAC-66285 Change-Id: I6563697966706d61636f736e7070656467776a6b Signed-off-by: AlanJager --- sdk/src/main/java/SourceClassMap.java | 12 +- .../org/zstack/sdk/AddModelCenterAction.java | 2 +- .../org/zstack/sdk/AddModelServiceAction.java | 2 +- .../zstack/sdk/DeleteModelCenterAction.java | 101 +++++++++++++++ .../zstack/sdk/DeleteModelCenterResult.java | 7 ++ .../org/zstack/sdk/ModelServiceInventory.java | 8 ++ .../org/zstack/sdk/UpdateModelAction.java | 116 +++++++++++++++++ .../zstack/sdk/UpdateModelCenterAction.java | 113 +++++++++++++++++ .../zstack/sdk/UpdateModelCenterResult.java | 14 +++ .../org/zstack/sdk/UpdateModelResult.java | 14 +++ .../zstack/sdk/UpdateModelServiceAction.java | 119 ++++++++++++++++++ .../zstack/sdk/UpdateModelServiceResult.java | 14 +++ .../java/org/zstack/testlib/ApiHelper.groovy | 108 ++++++++++++++++ 13 files changed, 622 insertions(+), 8 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteModelCenterAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteModelCenterResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateModelCenterResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateModelResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateModelServiceResult.java diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index e8eb93706a2..a3a7c6dfed6 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -7,9 +7,9 @@ public class SourceClassMap { { put("org.zstack.accessKey.AccessKeyInventory", "org.zstack.sdk.AccessKeyInventory"); put("org.zstack.accessKey.AccessKeyState", "org.zstack.sdk.AccessKeyState"); - put("org.zstack.ai.ModelCenterInventory", "org.zstack.sdk.ModelCenterInventory"); - put("org.zstack.ai.ModelInventory", "org.zstack.sdk.ModelInventory"); - put("org.zstack.ai.ModelServiceInventory", "org.zstack.sdk.ModelServiceInventory"); + put("org.zstack.ai.entity.ModelCenterInventory", "org.zstack.sdk.ModelCenterInventory"); + put("org.zstack.ai.entity.ModelInventory", "org.zstack.sdk.ModelInventory"); + put("org.zstack.ai.entity.ModelServiceInventory", "org.zstack.sdk.ModelServiceInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessGroupInventory", "org.zstack.sdk.AliyunNasAccessGroupInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessRuleInventory", "org.zstack.sdk.AliyunNasAccessRuleInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasFileSystemInventory", "org.zstack.sdk.AliyunNasFileSystemInventory"); @@ -1056,9 +1056,9 @@ public class SourceClassMap { put("org.zstack.sdk.MiniStorageResourceReplicationInventory", "org.zstack.storage.primary.ministorage.MiniStorageResourceReplicationInventory"); put("org.zstack.sdk.MiniStorageType", "org.zstack.storage.primary.ministorage.MiniStorageType"); put("org.zstack.sdk.MirrorNetworkUsedIpInventory", "org.zstack.header.portMirror.MirrorNetworkUsedIpInventory"); - put("org.zstack.sdk.ModelCenterInventory", "org.zstack.ai.ModelCenterInventory"); - put("org.zstack.sdk.ModelInventory", "org.zstack.ai.ModelInventory"); - put("org.zstack.sdk.ModelServiceInventory", "org.zstack.ai.ModelServiceInventory"); + put("org.zstack.sdk.ModelCenterInventory", "org.zstack.ai.entity.ModelCenterInventory"); + put("org.zstack.sdk.ModelInventory", "org.zstack.ai.entity.ModelInventory"); + put("org.zstack.sdk.ModelServiceInventory", "org.zstack.ai.entity.ModelServiceInventory"); put("org.zstack.sdk.MonitorTriggerActionInventory", "org.zstack.monitoring.actions.MonitorTriggerActionInventory"); put("org.zstack.sdk.MonitorTriggerInventory", "org.zstack.monitoring.MonitorTriggerInventory"); put("org.zstack.sdk.MttyDeviceInventory", "org.zstack.mttyDevice.MttyDeviceInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java index 970605605af..91a0e2c00a3 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java @@ -34,7 +34,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; - @Param(required = false) + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String parameters; @Param(required = false) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index 3f318f2f100..8098c651108 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -109,7 +109,7 @@ protected Map getNonAPIParameterMap() { protected RestInfo getRestInfo() { RestInfo info = new RestInfo(); info.httpMethod = "POST"; - info.path = "/ai/model-service"; + info.path = "/ai/model-services"; info.needSession = true; info.needPoll = true; info.parameterName = "param"; diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelCenterAction.java new file mode 100644 index 00000000000..ab2631f2d0d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelCenterAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteModelCenterAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeleteModelCenterResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeleteModelCenterResult value = res.getResult(org.zstack.sdk.DeleteModelCenterResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteModelCenterResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/ai/model-centers/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelCenterResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelCenterResult.java new file mode 100644 index 00000000000..8cbcde8746d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelCenterResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteModelCenterResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java index d6ab5eeaea7..1754eba00bf 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java @@ -52,4 +52,12 @@ public java.lang.Long getRequestMemory() { return this.requestMemory; } + public java.lang.String modelUuid; + public void setModelUuid(java.lang.String modelUuid) { + this.modelUuid = modelUuid; + } + public java.lang.String getModelUuid() { + return this.modelUuid; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java new file mode 100644 index 00000000000..a0839accc36 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java @@ -0,0 +1,116 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateModelAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UpdateModelResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String installPath; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String parameters; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelCenterUuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UpdateModelResult value = res.getResult(org.zstack.sdk.UpdateModelResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateModelResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/ai/models/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateModel"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java new file mode 100644 index 00000000000..210b877eb88 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java @@ -0,0 +1,113 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateModelCenterAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UpdateModelCenterResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String url; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String parameters; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UpdateModelCenterResult value = res.getResult(org.zstack.sdk.UpdateModelCenterResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateModelCenterResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/ai/model-centers/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateModelCenter"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterResult.java new file mode 100644 index 00000000000..e640183f83f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelCenterInventory; + +public class UpdateModelCenterResult { + public ModelCenterInventory inventory; + public void setInventory(ModelCenterInventory inventory) { + this.inventory = inventory; + } + public ModelCenterInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelResult.java new file mode 100644 index 00000000000..92299721529 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelInventory; + +public class UpdateModelResult { + public ModelInventory inventory; + public void setInventory(ModelInventory inventory) { + this.inventory = inventory; + } + public ModelInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java new file mode 100644 index 00000000000..3d013c2f324 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java @@ -0,0 +1,119 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateModelServiceAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UpdateModelServiceResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String yaml; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer requestCpu; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long requestMemory; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelUuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UpdateModelServiceResult value = res.getResult(org.zstack.sdk.UpdateModelServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateModelServiceResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/ai/model-services/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateModelService"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceResult.java new file mode 100644 index 00000000000..a4b24fd8a78 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceInventory; + +public class UpdateModelServiceResult { + public ModelServiceInventory inventory; + public void setInventory(ModelServiceInventory inventory) { + this.inventory = inventory; + } + public ModelServiceInventory getInventory() { + return this.inventory; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index c2137c2b45c..e9f468ee4ce 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -14570,6 +14570,33 @@ abstract class ApiHelper { } + def deleteModelCenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelCenterAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteModelCenterAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def deleteModelService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelServiceAction.class) Closure c) { def a = new org.zstack.sdk.DeleteModelServiceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -42079,6 +42106,87 @@ abstract class ApiHelper { } + def updateModel(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateModelAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateModelAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def updateModelCenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateModelCenterAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateModelCenterAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def updateModelService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateModelServiceAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateModelServiceAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def updateMonitorTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateMonitorTriggerAction.class) Closure c) { def a = new org.zstack.sdk.UpdateMonitorTriggerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 5581bc960f12a320d6553ae3a36dbd810e311345 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 14 Jun 2024 14:37:18 +0800 Subject: [PATCH 034/737] [conf]: fix schema DBImpact Resolves: ZSTAC-12345 Change-Id: I62776362796a7a73746469796266637a7867676c Signed-off-by: AlanJager --- conf/db/upgrade/V5.1.8.1__schema.sql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 89274abbcf4..5663daf66b7 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -15,7 +15,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelVO` ( `parameters` mediumtext DEFAULT NULL, `installPath` varchar(2048) DEFAULT NULL, PRIMARY KEY (`uuid`), - CONSTRAINT fkModelVOModelCenterVO FOREIGN KEY (uuid) REFERENCES ModelCenterVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE + CONSTRAINT fkModelVOModelCenterVO FOREIGN KEY (modelCenterUuid) REFERENCES ModelCenterVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceVO` ( @@ -24,10 +24,10 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceVO` ( `description` varchar(2048) DEFAULT NULL, `yaml` mediumtext NOT NULL, `requestCpu` int(10) NOT NULL, - `requestMem` bigint(20) NOT NULL, - `modelUuid` varchar(32) NOT NULL, + `requestMemory` bigint(20) NOT NULL, + `modelUuid` varchar(32) DEFAULT NULL, PRIMARY KEY (`uuid`), - CONSTRAINT fkModelServiceVOModelVO FOREIGN KEY (uuid) REFERENCES ModelVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE + CONSTRAINT fkModelServiceVOModelVO FOREIGN KEY (modelUuid) REFERENCES ModelVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceInstanceVO` ( From b200a12245fc80e069691d3b878be7021261f525 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 14 Jun 2024 16:24:08 +0800 Subject: [PATCH 035/737] [sdk]: update sdk Change-Id: I656e73646c7462666672716a65617763676f6570 Signed-off-by: AlanJager --- .../main/java/org/zstack/sdk/AddModelServiceAction.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index 8098c651108..29b74843559 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -28,7 +28,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String dockerImageName; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) @@ -46,6 +46,12 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Long requestMemory; + @Param(required = false, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.util.List l3NetworkUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + @Param(required = false) public java.util.List systemTags; From e8b67e7f2086bb4790ae401a4b052b9b7241fd59 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Sat, 15 Jun 2024 12:27:45 +0800 Subject: [PATCH 036/737] [sdk]: update sdk Change-Id: I6a6673667a76676a7265646e656a726770756862 --- conf/db/upgrade/V5.1.8.1__schema.sql | 31 +++-- sdk/src/main/java/SourceClassMap.java | 4 + .../org/zstack/sdk/AddModelServiceAction.java | 2 +- .../zstack/sdk/DeployModelServiceAction.java | 107 ++++++++++++++++++ .../zstack/sdk/DeployModelServiceResult.java | 14 +++ .../ModelServiceInstanceGroupInventory.java | 31 +++++ .../sdk/ModelServiceInstanceInventory.java | 55 +++++++++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ 8 files changed, 261 insertions(+), 10 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeployModelServiceResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 5663daf66b7..dbe322bc15d 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -30,21 +30,34 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceVO` ( CONSTRAINT fkModelServiceVOModelVO FOREIGN KEY (modelUuid) REFERENCES ModelVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceRefVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `modelUuid` varchar(32) NOT NULL, + `modelServiceUuid` varchar(32) NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT fkModelRefVO FOREIGN KEY (modelUuid) REFERENCES ModelVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE, + CONSTRAINT fkModelServiceRefVO FOREIGN KEY (modelServiceUuid) REFERENCES ModelServiceVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `zstack`.`ModelServiceInstanceGroupVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `modelServiceUuid` varchar(32) NOT NULL, + CONSTRAINT fkModelServiceInstanceGroupVOModelServiceModelServiceVO FOREIGN KEY (modelServiceUuid) REFERENCES ModelServiceVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceInstanceVO` ( `uuid` varchar(32) NOT NULL UNIQUE, `description` varchar(2048) DEFAULT NULL, `yaml` mediumtext NOT NULL, `status` varchar(255) NOT NULL, `url` varchar(2048) NOT NULL, - `modelServiceUuid` varchar(32) NOT NULL, + `modelServiceGroupUuid` varchar(32) NOT NULL, PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceRefVO` ( - `uuid` varchar(32) NOT NULL UNIQUE, - `modelUuid` varchar(32) NOT NULL, - `modelServiceUuid` varchar(32) NOT NULL, - PRIMARY KEY (`uuid`), - CONSTRAINT fkModelRefVO FOREIGN KEY (modelUuid) REFERENCES ModelVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE, - CONSTRAINT fkModelServiceRefVO FOREIGN KEY (modelServiceUuid) REFERENCES ModelServiceVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +--CREATE TABLE `zstack`.`VmModelServiceInstanceVO` ( +-- `uuid` varchar(32) NOT NULL UNIQUE, +-- `modelServiceInstanceGroupUuid` varchar(32) DEFAULT NULL, +-- PRIMARY KEY (`uuid`) +--) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index a3a7c6dfed6..8ac8a6941cd 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -9,6 +9,8 @@ public class SourceClassMap { put("org.zstack.accessKey.AccessKeyState", "org.zstack.sdk.AccessKeyState"); put("org.zstack.ai.entity.ModelCenterInventory", "org.zstack.sdk.ModelCenterInventory"); put("org.zstack.ai.entity.ModelInventory", "org.zstack.sdk.ModelInventory"); + put("org.zstack.ai.entity.ModelServiceInstanceGroupInventory", "org.zstack.sdk.ModelServiceInstanceGroupInventory"); + put("org.zstack.ai.entity.ModelServiceInstanceInventory", "org.zstack.sdk.ModelServiceInstanceInventory"); put("org.zstack.ai.entity.ModelServiceInventory", "org.zstack.sdk.ModelServiceInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessGroupInventory", "org.zstack.sdk.AliyunNasAccessGroupInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessRuleInventory", "org.zstack.sdk.AliyunNasAccessRuleInventory"); @@ -1058,6 +1060,8 @@ public class SourceClassMap { put("org.zstack.sdk.MirrorNetworkUsedIpInventory", "org.zstack.header.portMirror.MirrorNetworkUsedIpInventory"); put("org.zstack.sdk.ModelCenterInventory", "org.zstack.ai.entity.ModelCenterInventory"); put("org.zstack.sdk.ModelInventory", "org.zstack.ai.entity.ModelInventory"); + put("org.zstack.sdk.ModelServiceInstanceGroupInventory", "org.zstack.ai.entity.ModelServiceInstanceGroupInventory"); + put("org.zstack.sdk.ModelServiceInstanceInventory", "org.zstack.ai.entity.ModelServiceInstanceInventory"); put("org.zstack.sdk.ModelServiceInventory", "org.zstack.ai.entity.ModelServiceInventory"); put("org.zstack.sdk.MonitorTriggerActionInventory", "org.zstack.monitoring.actions.MonitorTriggerActionInventory"); put("org.zstack.sdk.MonitorTriggerInventory", "org.zstack.monitoring.MonitorTriggerInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index 29b74843559..fe4be63437d 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -37,7 +37,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String yaml; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vmInstanceImageUuid; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java new file mode 100644 index 00000000000..f375ce7b323 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeployModelServiceAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeployModelServiceResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String imageUuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeployModelServiceResult value = res.getResult(org.zstack.sdk.DeployModelServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.DeployModelServiceResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/ai/model-services/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "deployModelService"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceResult.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceResult.java new file mode 100644 index 00000000000..732adf29722 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceInstanceGroupInventory; + +public class DeployModelServiceResult { + public ModelServiceInstanceGroupInventory inventory; + public void setInventory(ModelServiceInstanceGroupInventory inventory) { + this.inventory = inventory; + } + public ModelServiceInstanceGroupInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java new file mode 100644 index 00000000000..a61d6b1bf78 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + + + +public class ModelServiceInstanceGroupInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String modelServiceUuid; + public void setModelServiceUuid(java.lang.String modelServiceUuid) { + this.modelServiceUuid = modelServiceUuid; + } + public java.lang.String getModelServiceUuid() { + return this.modelServiceUuid; + } + + public java.util.List instances; + public void setInstances(java.util.List instances) { + this.instances = instances; + } + public java.util.List getInstances() { + return this.instances; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java new file mode 100644 index 00000000000..a30ec61537e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java @@ -0,0 +1,55 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VmInstanceInventory; + +public class ModelServiceInstanceInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String modelServiceGroupUuid; + public void setModelServiceGroupUuid(java.lang.String modelServiceGroupUuid) { + this.modelServiceGroupUuid = modelServiceGroupUuid; + } + public java.lang.String getModelServiceGroupUuid() { + return this.modelServiceGroupUuid; + } + + public java.lang.String yaml; + public void setYaml(java.lang.String yaml) { + this.yaml = yaml; + } + public java.lang.String getYaml() { + return this.yaml; + } + + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + + public java.lang.String url; + public void setUrl(java.lang.String url) { + this.url = url; + } + public java.lang.String getUrl() { + return this.url; + } + + public VmInstanceInventory vm; + public void setVm(VmInstanceInventory vm) { + this.vm = vm; + } + public VmInstanceInventory getVm() { + return this.vm; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index e9f468ee4ce..4988dff258c 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -16838,6 +16838,33 @@ abstract class ApiHelper { } + def deployModelService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeployModelServiceAction.class) Closure c) { + def a = new org.zstack.sdk.DeployModelServiceAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def describeVmInstanceRecoveryPoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DescribeVmInstanceRecoveryPointAction.class) Closure c) { def a = new org.zstack.sdk.DescribeVmInstanceRecoveryPointAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From d59a76610d444b5664ed8ef7018e4a76cc4950df Mon Sep 17 00:00:00 2001 From: AlanJager Date: Sun, 16 Jun 2024 20:17:54 +0800 Subject: [PATCH 037/737] [sdk]: udpate sdk Change-Id: I696969676a75766e777a6d66646c79796d786c6f --- ...DeleteModelServiceInstanceGroupAction.java | 104 ++++++++++++++++++ ...DeleteModelServiceInstanceGroupResult.java | 7 ++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ 3 files changed, 138 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupResult.java diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupAction.java new file mode 100644 index 00000000000..43041e4356c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteModelServiceInstanceGroupAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeleteModelResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeleteModelResult value = res.getResult(org.zstack.sdk.DeleteModelResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteModelResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/ai/model-services/instances/groups/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupResult.java new file mode 100644 index 00000000000..cc1cd6e757d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteModelServiceInstanceGroupResult { + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 4988dff258c..16b4c14dc3a 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -14624,6 +14624,33 @@ abstract class ApiHelper { } + def deleteModelServiceInstanceGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelServiceInstanceGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteModelServiceInstanceGroupAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def deleteMonitorTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteMonitorTriggerAction.class) Closure c) { def a = new org.zstack.sdk.DeleteMonitorTriggerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From f4f6c77c4b01d975eed352527954086dedec2208 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Mon, 17 Jun 2024 22:59:36 +0800 Subject: [PATCH 038/737] [sdk]: Update sdk Change-Id: I6d726b736a696b6a686571716274666675616971 --- .../java/org/zstack/sdk/AddModelAction.java | 15 +++++++ ...DeleteModelServiceInstanceGroupAction.java | 6 +-- .../java/org/zstack/sdk/ModelInventory.java | 40 +++++++++++++++++++ 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelAction.java index fe57815fcfb..ca528290ca9 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelAction.java @@ -40,6 +40,21 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String modelCenterUuid; + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String logo; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vendor; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String introduction; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long size; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String version; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupAction.java index 43041e4356c..91655983c29 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupAction.java @@ -12,7 +12,7 @@ public class DeleteModelServiceInstanceGroupAction extends AbstractAction { public static class Result { public ErrorCode error; - public org.zstack.sdk.DeleteModelResult value; + public org.zstack.sdk.DeleteModelServiceInstanceGroupResult value; public Result throwExceptionIfError() { if (error != null) { @@ -63,8 +63,8 @@ private Result makeResult(ApiResult res) { return ret; } - org.zstack.sdk.DeleteModelResult value = res.getResult(org.zstack.sdk.DeleteModelResult.class); - ret.value = value == null ? new org.zstack.sdk.DeleteModelResult() : value; + org.zstack.sdk.DeleteModelServiceInstanceGroupResult value = res.getResult(org.zstack.sdk.DeleteModelServiceInstanceGroupResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteModelServiceInstanceGroupResult() : value; return ret; } diff --git a/sdk/src/main/java/org/zstack/sdk/ModelInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java index b62f718b0bf..45416aa662c 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java @@ -52,4 +52,44 @@ public java.lang.String getModelCenterUuid() { return this.modelCenterUuid; } + public java.lang.String logo; + public void setLogo(java.lang.String logo) { + this.logo = logo; + } + public java.lang.String getLogo() { + return this.logo; + } + + public java.lang.String vendor; + public void setVendor(java.lang.String vendor) { + this.vendor = vendor; + } + public java.lang.String getVendor() { + return this.vendor; + } + + public java.lang.String introduction; + public void setIntroduction(java.lang.String introduction) { + this.introduction = introduction; + } + public java.lang.String getIntroduction() { + return this.introduction; + } + + public java.lang.Long size; + public void setSize(java.lang.Long size) { + this.size = size; + } + public java.lang.Long getSize() { + return this.size; + } + + public java.lang.String version; + public void setVersion(java.lang.String version) { + this.version = version; + } + public java.lang.String getVersion() { + return this.version; + } + } From 1bd5041486b4fcd87c1e721c0bc90e197654033e Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Mon, 17 Jun 2024 23:54:23 +0800 Subject: [PATCH 039/737] [conf]: Add more column for modelVO DBImpact Change-Id: I7a716b626171746d67636671796f6b64646a7769 --- conf/db/upgrade/V5.1.8.1__schema.sql | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index dbe322bc15d..66f449edd43 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -14,6 +14,11 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelVO` ( `modelCenterUuid` varchar(32) NOT NULL, `parameters` mediumtext DEFAULT NULL, `installPath` varchar(2048) DEFAULT NULL, + `introduction` mediumtext DEFAULT NULL, + `logo` mediumtext DEFAULT NULL, + `version` varchar(255) DEFAULT NULL, + `vendor` varchar(255) DEFAULT NULL, + `size` bigint(20) NOT NULL, PRIMARY KEY (`uuid`), CONSTRAINT fkModelVOModelCenterVO FOREIGN KEY (modelCenterUuid) REFERENCES ModelCenterVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; From 95b9ff3f8a71615375421664521b2fb2f8db61f3 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 18 Jun 2024 13:33:57 +0800 Subject: [PATCH 040/737] [conf]: introduce management ip and port to model center DBImpact Resolves: ZSTAC-66285 Change-Id: I77647a757a6f656a68637765636870747868656b Signed-off-by: AlanJager --- conf/db/upgrade/V5.1.8.1__schema.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 66f449edd43..aa7332f37f6 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -4,6 +4,8 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelCenterVO` ( `description` varchar(2048) DEFAULT NULL, `url` varchar(2048) DEFAULT NULL, `parameters` varchar(128) DEFAULT NULL, + `managementIp` varchar(128) NOT NULL, + `managementPort` int(16) not NULL, PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; From b5b6b639d5fe2001571abd27d27a8571acad23a4 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 18 Jun 2024 14:15:17 +0800 Subject: [PATCH 041/737] [sdk]: update sdk Change-Id: I627070706b7978686d657573756f7266736f7476 Signed-off-by: AlanJager --- .../org/zstack/sdk/AddModelCenterAction.java | 6 ++++++ .../org/zstack/sdk/ModelCenterInventory.java | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java index 91a0e2c00a3..dcb64b22920 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java @@ -34,6 +34,12 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String managementIp; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer managementPort; + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String parameters; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java index 411c0d60aad..b452c51e0ee 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java @@ -44,4 +44,20 @@ public java.lang.String getParameters() { return this.parameters; } + public java.lang.String managementIp; + public void setManagementIp(java.lang.String managementIp) { + this.managementIp = managementIp; + } + public java.lang.String getManagementIp() { + return this.managementIp; + } + + public int managementPort; + public void setManagementPort(int managementPort) { + this.managementPort = managementPort; + } + public int getManagementPort() { + return this.managementPort; + } + } From 4d42c46a38c51376e8cd67c7cfb5478ff7bea92e Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 18 Jun 2024 16:34:45 +0800 Subject: [PATCH 042/737] [sdk]: update sdk Resolves: ZSTAC-66285 Change-Id: I7470686a726f726a796674726575666b6e6a7067 --- .../org/zstack/sdk/UpdateModelServiceAction.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java index 3d013c2f324..7fe9c51d193 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java @@ -28,22 +28,22 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; - @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; - @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; - @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String yaml; - @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer requestCpu; - @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Long requestMemory; - @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String modelUuid; @Param(required = false) From d033e9cfb82344724c3d85b8813528db3fd0a17b Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Wed, 19 Jun 2024 00:00:43 +0800 Subject: [PATCH 043/737] [sdk]: update sdk Change-Id: I756773677573777361797366656d637579727a75 --- .../main/java/org/zstack/sdk/AddModelAction.java | 14 +++++++------- .../java/org/zstack/sdk/AddModelCenterAction.java | 4 ++-- .../java/org/zstack/sdk/AddModelServiceAction.java | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelAction.java index ca528290ca9..b8b3d05f9f3 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelAction.java @@ -31,28 +31,28 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String installPath; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String parameters; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String modelCenterUuid; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String logo; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vendor; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String introduction; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Long size; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String version; @Param(required = false) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java index dcb64b22920..dc8c36d5f87 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java @@ -31,7 +31,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String url; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) @@ -40,7 +40,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer managementPort; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String parameters; @Param(required = false) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index fe4be63437d..254ae5e41fc 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -31,7 +31,7 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String dockerImageName; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) From a99c244f63ccc88b76716e91c92d24f9067bfa72 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 18 Jun 2024 17:58:29 +0800 Subject: [PATCH 044/737] [conf]: predefine tag patterns for ai platform DBImpact Resolves: ZSTAC-66285 Change-Id: I6c6f61666e6e79666d75736373786f776d736a76 Signed-off-by: AlanJager --- conf/db/upgrade/V5.1.8.1__schema.sql | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index aa7332f37f6..c8ed004596d 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -68,3 +68,10 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceInstanceVO` ( -- `modelServiceInstanceGroupUuid` varchar(32) DEFAULT NULL, -- PRIMARY KEY (`uuid`) --) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO `TagPatternVO` VALUES +('3e88dfda748f4706a497143ff0c9d8bc','AI::Others','AI::Others','System Defined tag',"#9A3BE4",'simple','2024-06-18 09:52:59','2024-06-18 09:52:59'), +('402ce2d5dc614bd5a583254768369682','AI::Image-Generation','AI::Image-Generation','System Defined tag',"#DFFCC6",'simple','2024-06-18 09:51:45','2024-06-18 09:51:45'), +('730bbcd2e7a44d1687a56d518313c726','AI::Text-Generation','AI::Text-Generation','System Defined tag',"#CEEFFF",'simple','2024-06-18 09:51:05','2024-06-18 09:51:05'), +('7396ea323f9f474dace9b634bc634e76','AI::Text-to-Video','AI::Text-to-Video','System Defined tag',"#FFE4D8",'simple','2024-06-18 09:52:18','2024-06-18 09:52:18'), +('c093252e47794e428e634c084c45b19b','AI::Text-to-Audio','AI::Text-to-Audio','System Defined tag',"#F3FCB0",'simple','2024-06-18 09:52:40','2024-06-18 09:52:40'); \ No newline at end of file From e5629834df2a5cf7f6946efc344cf5c1fdb8e8ad Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 18 Jun 2024 19:38:36 +0800 Subject: [PATCH 045/737] [conf]: introduce more fields for ai platform tables DBImpact Resolves: ZSTAC-66285 Change-Id: I6c71616d78686876736e6d6c7562796f71666370 --- conf/db/upgrade/V5.1.8.1__schema.sql | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index c8ed004596d..4a99087226e 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -6,6 +6,8 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelCenterVO` ( `parameters` varchar(128) DEFAULT NULL, `managementIp` varchar(128) NOT NULL, `managementPort` int(16) not NULL, + `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; @@ -21,6 +23,8 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelVO` ( `version` varchar(255) DEFAULT NULL, `vendor` varchar(255) DEFAULT NULL, `size` bigint(20) NOT NULL, + `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`), CONSTRAINT fkModelVOModelCenterVO FOREIGN KEY (modelCenterUuid) REFERENCES ModelCenterVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; @@ -33,6 +37,8 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceVO` ( `requestCpu` int(10) NOT NULL, `requestMemory` bigint(20) NOT NULL, `modelUuid` varchar(32) DEFAULT NULL, + `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`), CONSTRAINT fkModelServiceVOModelVO FOREIGN KEY (modelUuid) REFERENCES ModelVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; @@ -49,6 +55,9 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceRefVO` ( CREATE TABLE `zstack`.`ModelServiceInstanceGroupVO` ( `uuid` varchar(32) NOT NULL UNIQUE, `modelServiceUuid` varchar(32) NOT NULL, + `status` varchar(255) NOT NULL, + `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', CONSTRAINT fkModelServiceInstanceGroupVOModelServiceModelServiceVO FOREIGN KEY (modelServiceUuid) REFERENCES ModelServiceVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE, PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; @@ -60,6 +69,8 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceInstanceVO` ( `status` varchar(255) NOT NULL, `url` varchar(2048) NOT NULL, `modelServiceGroupUuid` varchar(32) NOT NULL, + `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; From ea5b4dd74a20eb43dc52fbfb5d6d560a6975879b Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 18 Jun 2024 20:11:03 +0800 Subject: [PATCH 046/737] [conf]: remove model uuid from model service DBImpact Resolves: ZSTAC-66285 Change-Id: I6277686a6c737a67636f676c686878756d756171 Signed-off-by: AlanJager --- conf/db/upgrade/V5.1.8.1__schema.sql | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 4a99087226e..312ae109038 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -36,11 +36,9 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceVO` ( `yaml` mediumtext NOT NULL, `requestCpu` int(10) NOT NULL, `requestMemory` bigint(20) NOT NULL, - `modelUuid` varchar(32) DEFAULT NULL, `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', - PRIMARY KEY (`uuid`), - CONSTRAINT fkModelServiceVOModelVO FOREIGN KEY (modelUuid) REFERENCES ModelVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE + PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceRefVO` ( @@ -69,6 +67,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceInstanceVO` ( `status` varchar(255) NOT NULL, `url` varchar(2048) NOT NULL, `modelServiceGroupUuid` varchar(32) NOT NULL, + `vmInstanceUuid` varchar(32) DEFAULT NULL, `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`) From 9760be66c0abb9cb9cb8d4a80547eaeb0ca78ad8 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 18 Jun 2024 23:59:33 +0800 Subject: [PATCH 047/737] [sdk]: update sdk Resolves: ZSTAC-66285 Change-Id: I766363686175746e73617a72666a766d6e757374 --- sdk/src/main/java/SourceClassMap.java | 2 ++ .../org/zstack/sdk/ModelCenterInventory.java | 16 ++++++++++ .../java/org/zstack/sdk/ModelInventory.java | 8 +++++ .../ModelServiceInstanceGroupInventory.java | 16 ++++++++++ .../sdk/ModelServiceInstanceInventory.java | 16 ++++++++++ .../org/zstack/sdk/ModelServiceInventory.java | 26 +++++++++++++--- .../zstack/sdk/ModelServiceRefInventory.java | 31 +++++++++++++++++++ 7 files changed, 110 insertions(+), 5 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/ModelServiceRefInventory.java diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 8ac8a6941cd..8f0d2f520e2 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -12,6 +12,7 @@ public class SourceClassMap { put("org.zstack.ai.entity.ModelServiceInstanceGroupInventory", "org.zstack.sdk.ModelServiceInstanceGroupInventory"); put("org.zstack.ai.entity.ModelServiceInstanceInventory", "org.zstack.sdk.ModelServiceInstanceInventory"); put("org.zstack.ai.entity.ModelServiceInventory", "org.zstack.sdk.ModelServiceInventory"); + put("org.zstack.ai.entity.ModelServiceRefInventory", "org.zstack.sdk.ModelServiceRefInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessGroupInventory", "org.zstack.sdk.AliyunNasAccessGroupInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessRuleInventory", "org.zstack.sdk.AliyunNasAccessRuleInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasFileSystemInventory", "org.zstack.sdk.AliyunNasFileSystemInventory"); @@ -1063,6 +1064,7 @@ public class SourceClassMap { put("org.zstack.sdk.ModelServiceInstanceGroupInventory", "org.zstack.ai.entity.ModelServiceInstanceGroupInventory"); put("org.zstack.sdk.ModelServiceInstanceInventory", "org.zstack.ai.entity.ModelServiceInstanceInventory"); put("org.zstack.sdk.ModelServiceInventory", "org.zstack.ai.entity.ModelServiceInventory"); + put("org.zstack.sdk.ModelServiceRefInventory", "org.zstack.ai.entity.ModelServiceRefInventory"); put("org.zstack.sdk.MonitorTriggerActionInventory", "org.zstack.monitoring.actions.MonitorTriggerActionInventory"); put("org.zstack.sdk.MonitorTriggerInventory", "org.zstack.monitoring.MonitorTriggerInventory"); put("org.zstack.sdk.MttyDeviceInventory", "org.zstack.mttyDevice.MttyDeviceInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java index b452c51e0ee..2447a6b2faf 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java @@ -60,4 +60,20 @@ public int getManagementPort() { return this.managementPort; } + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/ModelInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java index 45416aa662c..bdf1b132a66 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java @@ -92,4 +92,12 @@ public java.lang.String getVersion() { return this.version; } + public java.util.List modelServiceRefs; + public void setModelServiceRefs(java.util.List modelServiceRefs) { + this.modelServiceRefs = modelServiceRefs; + } + public java.util.List getModelServiceRefs() { + return this.modelServiceRefs; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java index a61d6b1bf78..06cf6a592f7 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java @@ -28,4 +28,20 @@ public java.util.List getInstances() { return this.instances; } + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java index a30ec61537e..5fcbe378d53 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java @@ -52,4 +52,20 @@ public VmInstanceInventory getVm() { return this.vm; } + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java index 1754eba00bf..41218f996cf 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java @@ -52,12 +52,28 @@ public java.lang.Long getRequestMemory() { return this.requestMemory; } - public java.lang.String modelUuid; - public void setModelUuid(java.lang.String modelUuid) { - this.modelUuid = modelUuid; + public java.util.List modelServiceRefs; + public void setModelServiceRefs(java.util.List modelServiceRefs) { + this.modelServiceRefs = modelServiceRefs; } - public java.lang.String getModelUuid() { - return this.modelUuid; + public java.util.List getModelServiceRefs() { + return this.modelServiceRefs; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; } } diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceRefInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceRefInventory.java new file mode 100644 index 00000000000..93f3f18ea78 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceRefInventory.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + + + +public class ModelServiceRefInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String modelUuid; + public void setModelUuid(java.lang.String modelUuid) { + this.modelUuid = modelUuid; + } + public java.lang.String getModelUuid() { + return this.modelUuid; + } + + public java.lang.String modelServiceUuid; + public void setModelServiceUuid(java.lang.String modelServiceUuid) { + this.modelServiceUuid = modelServiceUuid; + } + public java.lang.String getModelServiceUuid() { + return this.modelServiceUuid; + } + +} From d65a87610b5d4a0865d8e979441120335ffe5430 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 19 Jun 2024 00:10:29 +0800 Subject: [PATCH 048/737] [sdk]: update sdk Resolves: ZSTAC-66285 Change-Id: I677a73796d7679666a74696d6c6b6a63776a7875 --- .../org/zstack/sdk/ModelServiceInstanceInventory.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java index 5fcbe378d53..314d72a8b4d 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java @@ -44,6 +44,14 @@ public java.lang.String getUrl() { return this.url; } + public java.lang.String vmInstanceUuid; + public void setVmInstanceUuid(java.lang.String vmInstanceUuid) { + this.vmInstanceUuid = vmInstanceUuid; + } + public java.lang.String getVmInstanceUuid() { + return this.vmInstanceUuid; + } + public VmInstanceInventory vm; public void setVm(VmInstanceInventory vm) { this.vm = vm; From 1ec14e11594e83dc094521358c0382a48b6d51d1 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 19 Jun 2024 12:10:56 +0800 Subject: [PATCH 049/737] [sdk]: update sdk Resolves: ZSTAC-66285 Change-Id: I75736a65777464726f7769686578727263656e71 --- sdk/src/main/java/org/zstack/sdk/AddModelAction.java | 6 ++++++ sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java | 6 ++++++ sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelAction.java index b8b3d05f9f3..2d85aa25e52 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelAction.java @@ -55,6 +55,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String version; + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java index dc8c36d5f87..38c0bbec6c9 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java @@ -43,6 +43,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String parameters; + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index 254ae5e41fc..5cef749b79a 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -52,6 +52,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String zoneUuid; + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + @Param(required = false) public java.util.List systemTags; From 9307d8763f2199e10a2eb654760346a8b3b63694 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 19 Jun 2024 12:54:19 +0800 Subject: [PATCH 050/737] [conf]: fix tag pattern schema DBImpact Resolves: ZSTAC-66285 Change-Id: I666471766663737565796870696f796e7462776c --- conf/db/upgrade/V5.1.8.1__schema.sql | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 312ae109038..2525441e065 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -84,4 +84,11 @@ INSERT INTO `TagPatternVO` VALUES ('402ce2d5dc614bd5a583254768369682','AI::Image-Generation','AI::Image-Generation','System Defined tag',"#DFFCC6",'simple','2024-06-18 09:51:45','2024-06-18 09:51:45'), ('730bbcd2e7a44d1687a56d518313c726','AI::Text-Generation','AI::Text-Generation','System Defined tag',"#CEEFFF",'simple','2024-06-18 09:51:05','2024-06-18 09:51:05'), ('7396ea323f9f474dace9b634bc634e76','AI::Text-to-Video','AI::Text-to-Video','System Defined tag',"#FFE4D8",'simple','2024-06-18 09:52:18','2024-06-18 09:52:18'), -('c093252e47794e428e634c084c45b19b','AI::Text-to-Audio','AI::Text-to-Audio','System Defined tag',"#F3FCB0",'simple','2024-06-18 09:52:40','2024-06-18 09:52:40'); \ No newline at end of file +('c093252e47794e428e634c084c45b19b','AI::Text-to-Audio','AI::Text-to-Audio','System Defined tag',"#F3FCB0",'simple','2024-06-18 09:52:40','2024-06-18 09:52:40'); + +INSERT INTO ResourceVO (`uuid`, `resourceName`, `resourceType`, `concreteResourceType`) VALUES + ('3e88dfda748f4706a497143ff0c9d8bc', 'AI::Others', 'TagPatternVO', 'org.zstack.header.tag.TagPatternVO'), + ('402ce2d5dc614bd5a583254768369682', 'AI::Image-Generation', 'TagPatternVO', 'org.zstack.header.tag.TagPatternVO'), + ('730bbcd2e7a44d1687a56d518313c726', 'AI::Text-Generation', 'TagPatternVO', 'org.zstack.header.tag.TagPatternVO'), + ('7396ea323f9f474dace9b634bc634e76', 'AI::Text-to-Video', 'TagPatternVO', 'org.zstack.header.tag.TagPatternVO'), + ('c093252e47794e428e634c084c45b19b', 'AI::Text-to-Audio', 'TagPatternVO', 'org.zstack.header.tag.TagPatternVO'); \ No newline at end of file From 9c3925769c1df989fd294c95f46e1ddd21802efd Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Wed, 19 Jun 2024 13:03:00 +0800 Subject: [PATCH 051/737] [sdk]: updata sdk Change-Id: I6b7a72646c7a71646e63797a6f75766d75646b72 --- sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java index f375ce7b323..39b7612f58a 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java @@ -28,6 +28,9 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelUuid; + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String zoneUuid; From 335dca1a56d3310419f087434ddf6073415d3983 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 19 Jun 2024 14:42:20 +0800 Subject: [PATCH 052/737] [sdk]: udpate sdk Resolves: ZSTAC-66285 Change-Id: I7269756c63696e747368686c64786e6672717a6a --- .../ModelServiceInstanceGroupInventory.java | 8 ++ .../QueryModelServiceInstanceGroupAction.java | 75 +++++++++++++++++++ .../QueryModelServiceInstanceGroupResult.java | 22 ++++++ 3 files changed, 105 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryModelServiceInstanceGroupAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryModelServiceInstanceGroupResult.java diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java index 06cf6a592f7..404021eb571 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java @@ -28,6 +28,14 @@ public java.util.List getInstances() { return this.instances; } + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelServiceInstanceGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryModelServiceInstanceGroupAction.java new file mode 100644 index 00000000000..e49163d2a00 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelServiceInstanceGroupAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryModelServiceInstanceGroupAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryModelServiceInstanceGroupResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryModelServiceInstanceGroupResult value = res.getResult(org.zstack.sdk.QueryModelServiceInstanceGroupResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryModelServiceInstanceGroupResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/ai/model-services/instances/groups/"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelServiceInstanceGroupResult.java b/sdk/src/main/java/org/zstack/sdk/QueryModelServiceInstanceGroupResult.java new file mode 100644 index 00000000000..4c0156d2870 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelServiceInstanceGroupResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryModelServiceInstanceGroupResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} From 16f0440971255f097f2eebb0b19922c78c852639 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 19 Jun 2024 14:47:05 +0800 Subject: [PATCH 053/737] [testlib]: api helper Change-Id: I7a69727a63756d76716269767864766f79746677 --- .../java/org/zstack/testlib/ApiHelper.groovy | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 16b4c14dc3a..45d09785da7 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -30740,6 +30740,35 @@ abstract class ApiHelper { } + def queryModelServiceInstanceGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryModelServiceInstanceGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryModelServiceInstanceGroupAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryMonitorTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMonitorTriggerAction.class) Closure c) { def a = new org.zstack.sdk.QueryMonitorTriggerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 383bb82614d84c8a53580ae31f70e468d2a55232 Mon Sep 17 00:00:00 2001 From: lianghy Date: Wed, 12 Jun 2024 15:46:43 +0800 Subject: [PATCH 054/737] [sso]: support sso server Resolves: ZSTAC-66623 Change-Id: I6467666238676e6d666175747477786a71677963 --- conf/db/upgrade/V5.1.8.1__schema.sql | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 2525441e065..c831a299f55 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -79,6 +79,17 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceInstanceVO` ( -- PRIMARY KEY (`uuid`) --) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE IF NOT EXISTS `zstack`.`SSOServerTokenVO`( + `uuid` varchar(32) not null unique, + `accessToken` text DEFAULT NULL, + `idToken` text DEFAULT NULL, + `refreshToken` text DEFAULT NULL, + `userUuid` varchar(32) DEFAULT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + INSERT INTO `TagPatternVO` VALUES ('3e88dfda748f4706a497143ff0c9d8bc','AI::Others','AI::Others','System Defined tag',"#9A3BE4",'simple','2024-06-18 09:52:59','2024-06-18 09:52:59'), ('402ce2d5dc614bd5a583254768369682','AI::Image-Generation','AI::Image-Generation','System Defined tag',"#DFFCC6",'simple','2024-06-18 09:51:45','2024-06-18 09:51:45'), From b43c8b18250859b8dc9ff1bc6a81ec6e603fe7f2 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 19 Jun 2024 22:37:52 +0800 Subject: [PATCH 055/737] [rest]: add timeout to ut rest facade Resolves: ZSTAC-66285 Change-Id: I61766d64716c636f6d646f686a61686b6c776a6f Signed-off-by: AlanJager From e28d77171aef0cb38a7fd6e28b2b7ee815bc925c Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 19 Jun 2024 23:17:47 +0800 Subject: [PATCH 056/737] [sdk]: update sdk Resolves: ZSTAC-66285 Change-Id: I6f666d68796e6f73677a6772666e686767777571 --- .../java/org/zstack/sdk/DeployModelServiceAction.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java index 39b7612f58a..fe6cacb2314 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java @@ -37,6 +37,15 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String imageUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer cpuNum; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long memorySize; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List l3NetworkUuids; + @Param(required = false) public java.util.List systemTags; From bd24290f57386728759e9aa7b231aa6360de864c Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 20 Jun 2024 13:37:04 +0800 Subject: [PATCH 057/737] [conf]: update schema to support tag theme DBImpact Resolves: ZSTAC-66285 Change-Id: I79736d756f776c6c726f6c756f667773706f6e72 --- conf/db/upgrade/V5.1.8.1__schema.sql | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index c831a299f55..ea46d3df240 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -91,11 +91,11 @@ CREATE TABLE IF NOT EXISTS `zstack`.`SSOServerTokenVO`( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `TagPatternVO` VALUES -('3e88dfda748f4706a497143ff0c9d8bc','AI::Others','AI::Others','System Defined tag',"#9A3BE4",'simple','2024-06-18 09:52:59','2024-06-18 09:52:59'), -('402ce2d5dc614bd5a583254768369682','AI::Image-Generation','AI::Image-Generation','System Defined tag',"#DFFCC6",'simple','2024-06-18 09:51:45','2024-06-18 09:51:45'), -('730bbcd2e7a44d1687a56d518313c726','AI::Text-Generation','AI::Text-Generation','System Defined tag',"#CEEFFF",'simple','2024-06-18 09:51:05','2024-06-18 09:51:05'), -('7396ea323f9f474dace9b634bc634e76','AI::Text-to-Video','AI::Text-to-Video','System Defined tag',"#FFE4D8",'simple','2024-06-18 09:52:18','2024-06-18 09:52:18'), -('c093252e47794e428e634c084c45b19b','AI::Text-to-Audio','AI::Text-to-Audio','System Defined tag',"#F3FCB0",'simple','2024-06-18 09:52:40','2024-06-18 09:52:40'); +('3e88dfda748f4706a497143ff0c9d8bc','AI::Others','AI::Others','System Defined tag',"red",'simple','2024-06-18 09:52:59','2024-06-18 09:52:59'), +('402ce2d5dc614bd5a583254768369682','AI::Image-Generation','AI::Image-Generation','System Defined tag',"green",'simple','2024-06-18 09:51:45','2024-06-18 09:51:45'), +('730bbcd2e7a44d1687a56d518313c726','AI::Text-Generation','AI::Text-Generation','System Defined tag',"blue",'simple','2024-06-18 09:51:05','2024-06-18 09:51:05'), +('7396ea323f9f474dace9b634bc634e76','AI::Text-to-Video','AI::Text-to-Video','System Defined tag',"purple",'simple','2024-06-18 09:52:18','2024-06-18 09:52:18'), +('c093252e47794e428e634c084c45b19b','AI::Text-to-Audio','AI::Text-to-Audio','System Defined tag',"yellow-green",'simple','2024-06-18 09:52:40','2024-06-18 09:52:40'); INSERT INTO ResourceVO (`uuid`, `resourceName`, `resourceType`, `concreteResourceType`) VALUES ('3e88dfda748f4706a497143ff0c9d8bc', 'AI::Others', 'TagPatternVO', 'org.zstack.header.tag.TagPatternVO'), From de06912aa4149fde3cd6b4fa8c55e59f5fc51095 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 21 Jun 2024 12:30:17 +0800 Subject: [PATCH 058/737] [sdk]: update sdk Resolves: ZSTAC-66285 Change-Id: I656a6a75766467746e656d796f7a797a6e686f77 --- sdk/src/main/java/org/zstack/sdk/ModelInventory.java | 8 ++++++++ .../main/java/org/zstack/sdk/ModelServiceInventory.java | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/ModelInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java index bdf1b132a66..33fa6f595a7 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java @@ -92,6 +92,14 @@ public java.lang.String getVersion() { return this.version; } + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + public java.util.List modelServiceRefs; public void setModelServiceRefs(java.util.List modelServiceRefs) { this.modelServiceRefs = modelServiceRefs; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java index 41218f996cf..f4b007b4c5d 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java @@ -52,6 +52,14 @@ public java.lang.Long getRequestMemory() { return this.requestMemory; } + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + public java.util.List modelServiceRefs; public void setModelServiceRefs(java.util.List modelServiceRefs) { this.modelServiceRefs = modelServiceRefs; From bc2cbbdc8f8bb461451cb6d6c6c6efbe7a9397d5 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 21 Jun 2024 12:36:59 +0800 Subject: [PATCH 059/737] [sdk]: update sdk Resolves: ZSTAC-66285 Change-Id: I636379746a7268786e6b7473636a70786b6c6f79 --- sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index 5cef749b79a..a8e9d41a566 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -52,6 +52,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String zoneUuid; + @Param(required = false, validValues = {"Endpoint","FineTune"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type = "Endpoint"; + @Param(required = false) public java.lang.String resourceUuid; From fe9a8a1af65a713a7e9bd330681f8fa8fa7fb735 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 21 Jun 2024 12:57:53 +0800 Subject: [PATCH 060/737] [conf]: update sql DBImpact Resolves: ZSTAC-66285 Change-Id: I756a706a6e6c70767a67706b787a7979706e6c6e --- conf/db/upgrade/V5.1.8.1__schema.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index ea46d3df240..83193d225f0 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -22,6 +22,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelVO` ( `logo` mediumtext DEFAULT NULL, `version` varchar(255) DEFAULT NULL, `vendor` varchar(255) DEFAULT NULL, + `type` varchar(32) NOT NULL, `size` bigint(20) NOT NULL, `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', @@ -33,6 +34,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceVO` ( `uuid` varchar(32) NOT NULL UNIQUE, `name` varchar(255) DEFAULT NULL, `description` varchar(2048) DEFAULT NULL, + `type` varchar(32) NOT NULL, `yaml` mediumtext NOT NULL, `requestCpu` int(10) NOT NULL, `requestMemory` bigint(20) NOT NULL, From 3e1a830b93f6f38357759ce0aec6caf220702d8c Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 21 Jun 2024 13:05:48 +0800 Subject: [PATCH 061/737] [sdk]: update sdk Resolves: ZSTAC-66285 Change-Id: I78626b79727971726561646b617765696f667177 --- .../zstack/sdk/ModelServiceInstanceGroupInventory.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java index 404021eb571..4fc6aca87b7 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java @@ -20,6 +20,14 @@ public java.lang.String getModelServiceUuid() { return this.modelServiceUuid; } + public java.lang.String modelUuid; + public void setModelUuid(java.lang.String modelUuid) { + this.modelUuid = modelUuid; + } + public java.lang.String getModelUuid() { + return this.modelUuid; + } + public java.util.List instances; public void setInstances(java.util.List instances) { this.instances = instances; From 30c9cd868c1db60138bc46cf34707045d0244f02 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 21 Jun 2024 13:22:08 +0800 Subject: [PATCH 062/737] [conf]: update sql schema DBImpact Resolves: ZSTAC-66285 Change-Id: I6579666273757073726e65666c696a6c6e78776b --- conf/db/upgrade/V5.1.8.1__schema.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 83193d225f0..c21856d024b 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -55,6 +55,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceRefVO` ( CREATE TABLE `zstack`.`ModelServiceInstanceGroupVO` ( `uuid` varchar(32) NOT NULL UNIQUE, `modelServiceUuid` varchar(32) NOT NULL, + `modelUuid` varchar(32) NOT NULL, `status` varchar(255) NOT NULL, `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', From 1a71dacb45c82057de7585d320a47e8542f3f405 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 21 Jun 2024 18:22:12 +0800 Subject: [PATCH 063/737] [conf]: add account resournce ref DBImpact Resolves: ZSTAC-66285 Change-Id: I6472716a6b686b6878706b7a796c686867786f64 --- conf/db/upgrade/V5.1.8.1__schema.sql | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index c21856d024b..258c7e6c59e 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -105,4 +105,11 @@ INSERT INTO ResourceVO (`uuid`, `resourceName`, `resourceType`, `concreteResourc ('402ce2d5dc614bd5a583254768369682', 'AI::Image-Generation', 'TagPatternVO', 'org.zstack.header.tag.TagPatternVO'), ('730bbcd2e7a44d1687a56d518313c726', 'AI::Text-Generation', 'TagPatternVO', 'org.zstack.header.tag.TagPatternVO'), ('7396ea323f9f474dace9b634bc634e76', 'AI::Text-to-Video', 'TagPatternVO', 'org.zstack.header.tag.TagPatternVO'), - ('c093252e47794e428e634c084c45b19b', 'AI::Text-to-Audio', 'TagPatternVO', 'org.zstack.header.tag.TagPatternVO'); \ No newline at end of file + ('c093252e47794e428e634c084c45b19b', 'AI::Text-to-Audio', 'TagPatternVO', 'org.zstack.header.tag.TagPatternVO'); + + INSERT INTO `AccountResourceRefVO` (accountUuid,ownerAccountUuid,resourceUuid,resourceType,permission,isShared,concreteResourceType) VALUES + ('36c27e8ff05c4780bf6d2fa65700f22e','36c27e8ff05c4780bf6d2fa65700f22e','3e88dfda748f4706a497143ff0c9d8bc','TagPatternVO',2,0,"org.zstack.header.tag.TagPatternVO"), + ('36c27e8ff05c4780bf6d2fa65700f22e','36c27e8ff05c4780bf6d2fa65700f22e','402ce2d5dc614bd5a583254768369682','TagPatternVO',2,0,"org.zstack.header.tag.TagPatternVO"), + ('36c27e8ff05c4780bf6d2fa65700f22e','36c27e8ff05c4780bf6d2fa65700f22e','730bbcd2e7a44d1687a56d518313c726','TagPatternVO',2,0,"org.zstack.header.tag.TagPatternVO"), + ('36c27e8ff05c4780bf6d2fa65700f22e','36c27e8ff05c4780bf6d2fa65700f22e','7396ea323f9f474dace9b634bc634e76','TagPatternVO',2,0,"org.zstack.header.tag.TagPatternVO"), + ('36c27e8ff05c4780bf6d2fa65700f22e','36c27e8ff05c4780bf6d2fa65700f22e','c093252e47794e428e634c084c45b19b','TagPatternVO',2,0,"org.zstack.header.tag.TagPatternVO"); \ No newline at end of file From 81ba253334070a504d9bb45ac1ed6201bea8e18d Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 21 Jun 2024 18:53:45 +0800 Subject: [PATCH 064/737] [conf]: persist tag from java code instead of sql DBImpact Resolves: ZSTAC-66285 Change-Id: I7a61746b70716e6d68767a786968786e626e746a Signed-off-by: AlanJager --- conf/db/upgrade/V5.1.8.1__schema.sql | 26 +++----------------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 258c7e6c59e..91c58f56ca6 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -70,10 +70,11 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceInstanceVO` ( `status` varchar(255) NOT NULL, `url` varchar(2048) NOT NULL, `modelServiceGroupUuid` varchar(32) NOT NULL, - `vmInstanceUuid` varchar(32) DEFAULT NULL, + `vmInstanceUuid` varchar(32) NOT NULL, `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', - PRIMARY KEY (`uuid`) + PRIMARY KEY (`uuid`), + CONSTRAINT fkModelServiceInstanceVOVmInstanceVO FOREIGN KEY (vmInstanceUuid) REFERENCES VmInstanceEO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; --CREATE TABLE `zstack`.`VmModelServiceInstanceVO` ( @@ -92,24 +93,3 @@ CREATE TABLE IF NOT EXISTS `zstack`.`SSOServerTokenVO`( `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -INSERT INTO `TagPatternVO` VALUES -('3e88dfda748f4706a497143ff0c9d8bc','AI::Others','AI::Others','System Defined tag',"red",'simple','2024-06-18 09:52:59','2024-06-18 09:52:59'), -('402ce2d5dc614bd5a583254768369682','AI::Image-Generation','AI::Image-Generation','System Defined tag',"green",'simple','2024-06-18 09:51:45','2024-06-18 09:51:45'), -('730bbcd2e7a44d1687a56d518313c726','AI::Text-Generation','AI::Text-Generation','System Defined tag',"blue",'simple','2024-06-18 09:51:05','2024-06-18 09:51:05'), -('7396ea323f9f474dace9b634bc634e76','AI::Text-to-Video','AI::Text-to-Video','System Defined tag',"purple",'simple','2024-06-18 09:52:18','2024-06-18 09:52:18'), -('c093252e47794e428e634c084c45b19b','AI::Text-to-Audio','AI::Text-to-Audio','System Defined tag',"yellow-green",'simple','2024-06-18 09:52:40','2024-06-18 09:52:40'); - -INSERT INTO ResourceVO (`uuid`, `resourceName`, `resourceType`, `concreteResourceType`) VALUES - ('3e88dfda748f4706a497143ff0c9d8bc', 'AI::Others', 'TagPatternVO', 'org.zstack.header.tag.TagPatternVO'), - ('402ce2d5dc614bd5a583254768369682', 'AI::Image-Generation', 'TagPatternVO', 'org.zstack.header.tag.TagPatternVO'), - ('730bbcd2e7a44d1687a56d518313c726', 'AI::Text-Generation', 'TagPatternVO', 'org.zstack.header.tag.TagPatternVO'), - ('7396ea323f9f474dace9b634bc634e76', 'AI::Text-to-Video', 'TagPatternVO', 'org.zstack.header.tag.TagPatternVO'), - ('c093252e47794e428e634c084c45b19b', 'AI::Text-to-Audio', 'TagPatternVO', 'org.zstack.header.tag.TagPatternVO'); - - INSERT INTO `AccountResourceRefVO` (accountUuid,ownerAccountUuid,resourceUuid,resourceType,permission,isShared,concreteResourceType) VALUES - ('36c27e8ff05c4780bf6d2fa65700f22e','36c27e8ff05c4780bf6d2fa65700f22e','3e88dfda748f4706a497143ff0c9d8bc','TagPatternVO',2,0,"org.zstack.header.tag.TagPatternVO"), - ('36c27e8ff05c4780bf6d2fa65700f22e','36c27e8ff05c4780bf6d2fa65700f22e','402ce2d5dc614bd5a583254768369682','TagPatternVO',2,0,"org.zstack.header.tag.TagPatternVO"), - ('36c27e8ff05c4780bf6d2fa65700f22e','36c27e8ff05c4780bf6d2fa65700f22e','730bbcd2e7a44d1687a56d518313c726','TagPatternVO',2,0,"org.zstack.header.tag.TagPatternVO"), - ('36c27e8ff05c4780bf6d2fa65700f22e','36c27e8ff05c4780bf6d2fa65700f22e','7396ea323f9f474dace9b634bc634e76','TagPatternVO',2,0,"org.zstack.header.tag.TagPatternVO"), - ('36c27e8ff05c4780bf6d2fa65700f22e','36c27e8ff05c4780bf6d2fa65700f22e','c093252e47794e428e634c084c45b19b','TagPatternVO',2,0,"org.zstack.header.tag.TagPatternVO"); \ No newline at end of file From 223395d70dcab9f698543f81180e378a1b816f37 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Fri, 28 Jun 2024 11:33:03 +0800 Subject: [PATCH 065/737] [conf]: Support modify name DBImpact Change-Id: I6877796c6f73756c6b7a717a6a7467796666686e --- conf/db/upgrade/V5.1.8.1__schema.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 91c58f56ca6..98a4d928b0f 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -56,6 +56,7 @@ CREATE TABLE `zstack`.`ModelServiceInstanceGroupVO` ( `uuid` varchar(32) NOT NULL UNIQUE, `modelServiceUuid` varchar(32) NOT NULL, `modelUuid` varchar(32) NOT NULL, + `name` varchar(255) DEFAULT NULL, `status` varchar(255) NOT NULL, `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', From 40dbb65453ed4794191482973d2594c5f81b441c Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Mon, 1 Jul 2024 10:08:57 +0800 Subject: [PATCH 066/737] [conf]: Update sql set vmUuid default null DBImpact Change-Id: I67617768766a7165697061636e69666f6264746e --- conf/db/upgrade/V5.1.8.1__schema.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 98a4d928b0f..3e49a1336e9 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -67,11 +67,11 @@ CREATE TABLE `zstack`.`ModelServiceInstanceGroupVO` ( CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceInstanceVO` ( `uuid` varchar(32) NOT NULL UNIQUE, `description` varchar(2048) DEFAULT NULL, - `yaml` mediumtext NOT NULL, + `yaml` mediumtext DEFAULT NULL, `status` varchar(255) NOT NULL, `url` varchar(2048) NOT NULL, `modelServiceGroupUuid` varchar(32) NOT NULL, - `vmInstanceUuid` varchar(32) NOT NULL, + `vmInstanceUuid` varchar(32) DEFAULT NULL, `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`), From 80c5fe5ffdadb38d325aa84fa86db4485fb20d29 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 1 Jul 2024 16:29:41 +0800 Subject: [PATCH 067/737] [sdk]: update sdk Resolves: ZSTAC-66285 Change-Id: I686b66696375717979626f696670707774677870 --- .../java/org/zstack/sdk/DeployModelServiceAction.java | 3 +++ .../zstack/sdk/ModelServiceInstanceGroupInventory.java | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java index fe6cacb2314..fe126b584d2 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java @@ -40,6 +40,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer cpuNum; + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Long memorySize; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java index 4fc6aca87b7..afde410afba 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java @@ -44,6 +44,14 @@ public java.lang.String getStatus() { return this.status; } + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; From a2cdebe8b0b8dada3688e9a8cd11c61afe7fad3f Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Wed, 3 Jul 2024 16:34:08 +0800 Subject: [PATCH 068/737] [sdk]: Update sdk Change-Id: I6e746f637676796863656166796c6b667573787a --- .../main/java/org/zstack/sdk/AddModelServiceAction.java | 2 +- sdk/src/main/java/org/zstack/sdk/ModelInventory.java | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index a8e9d41a566..cfbc6d316ff 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -34,7 +34,7 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String yaml; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/ModelInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java index 33fa6f595a7..deff9c55f98 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java @@ -100,6 +100,14 @@ public java.lang.String getType() { return this.type; } + public java.lang.Long minGpuMemory; + public void setMinGpuMemory(java.lang.Long minGpuMemory) { + this.minGpuMemory = minGpuMemory; + } + public java.lang.Long getMinGpuMemory() { + return this.minGpuMemory; + } + public java.util.List modelServiceRefs; public void setModelServiceRefs(java.util.List modelServiceRefs) { this.modelServiceRefs = modelServiceRefs; From 6ee5da9168a7908ac6e4477b366f53f05a04c3ab Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Sun, 7 Jul 2024 23:17:14 +0800 Subject: [PATCH 069/737] [conf]: Update sdk DBImpact Change-Id: I6e796c756e706c646b72786f6a756c6362696566 --- conf/db/upgrade/V5.1.8.1__schema.sql | 3 +++ .../org/zstack/sdk/AddModelCenterAction.java | 9 +++++++ .../org/zstack/sdk/ModelCenterInventory.java | 24 +++++++++++++++++++ .../zstack/sdk/UpdateModelCenterAction.java | 9 +++++++ 4 files changed, 45 insertions(+) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 3e49a1336e9..9ed63ec101e 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -6,6 +6,9 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelCenterVO` ( `parameters` varchar(128) DEFAULT NULL, `managementIp` varchar(128) NOT NULL, `managementPort` int(16) not NULL, + `storageNetworkUuid` varchar(32) DEFAULT NULL, + `serviceNetworkUuid` varchar(32) DEFAULT NULL, + `containerRegistry` varchar(2048) DEFAULT NULL, `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java index 38c0bbec6c9..f5e0936d681 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java @@ -43,6 +43,15 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String parameters; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String storageNetworkUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceNetworkUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerRegistry; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java index 2447a6b2faf..241b47c2618 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java @@ -60,6 +60,30 @@ public int getManagementPort() { return this.managementPort; } + public java.lang.String storageNetworkUuid; + public void setStorageNetworkUuid(java.lang.String storageNetworkUuid) { + this.storageNetworkUuid = storageNetworkUuid; + } + public java.lang.String getStorageNetworkUuid() { + return this.storageNetworkUuid; + } + + public java.lang.String serviceNetworkUuid; + public void setServiceNetworkUuid(java.lang.String serviceNetworkUuid) { + this.serviceNetworkUuid = serviceNetworkUuid; + } + public java.lang.String getServiceNetworkUuid() { + return this.serviceNetworkUuid; + } + + public java.lang.String containerRegistry; + public void setContainerRegistry(java.lang.String containerRegistry) { + this.containerRegistry = containerRegistry; + } + public java.lang.String getContainerRegistry() { + return this.containerRegistry; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java index 210b877eb88..232ecefc07a 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java @@ -40,6 +40,15 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String parameters; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String storageNetworkUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceNetworkUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerRegistry; + @Param(required = false) public java.util.List systemTags; From eeba06314d49de191216acc2a0d0c108fd61aa73 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 8 Jul 2024 18:00:06 +0800 Subject: [PATCH 070/737] [sdk]: update sdk Resolves: ZSTAC-66285 Change-Id: I636c7a6e707778766f786a62656d6a6263617977 --- .../org/zstack/sdk/AddModelCenterAction.java | 9 ------- .../org/zstack/sdk/ModelCenterInventory.java | 24 ------------------- .../java/org/zstack/sdk/ModelInventory.java | 16 +++++++++++++ .../zstack/sdk/UpdateModelCenterAction.java | 9 ------- 4 files changed, 16 insertions(+), 42 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java index f5e0936d681..38c0bbec6c9 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java @@ -43,15 +43,6 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String parameters; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String storageNetworkUuid; - - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String serviceNetworkUuid; - - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String containerRegistry; - @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java index 241b47c2618..2447a6b2faf 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java @@ -60,30 +60,6 @@ public int getManagementPort() { return this.managementPort; } - public java.lang.String storageNetworkUuid; - public void setStorageNetworkUuid(java.lang.String storageNetworkUuid) { - this.storageNetworkUuid = storageNetworkUuid; - } - public java.lang.String getStorageNetworkUuid() { - return this.storageNetworkUuid; - } - - public java.lang.String serviceNetworkUuid; - public void setServiceNetworkUuid(java.lang.String serviceNetworkUuid) { - this.serviceNetworkUuid = serviceNetworkUuid; - } - public java.lang.String getServiceNetworkUuid() { - return this.serviceNetworkUuid; - } - - public java.lang.String containerRegistry; - public void setContainerRegistry(java.lang.String containerRegistry) { - this.containerRegistry = containerRegistry; - } - public java.lang.String getContainerRegistry() { - return this.containerRegistry; - } - public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java index deff9c55f98..e8e5a3a9e98 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java @@ -116,4 +116,20 @@ public java.util.List getModelServiceRefs() { return this.modelServiceRefs; } + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java index 232ecefc07a..210b877eb88 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java @@ -40,15 +40,6 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String parameters; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String storageNetworkUuid; - - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String serviceNetworkUuid; - - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String containerRegistry; - @Param(required = false) public java.util.List systemTags; From e8e1b96f3cdce9cb1d6953cb501b141057463a6e Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 9 Jul 2024 21:09:05 +0800 Subject: [PATCH 071/737] [sdk]: update sdk Resolves: ZSTAC-66285 Change-Id: I646f7371677872646b777a6179646e6d63657168 --- .../org/zstack/sdk/AddModelCenterAction.java | 9 +++++++ .../zstack/sdk/DeployModelServiceAction.java | 3 +++ .../org/zstack/sdk/ModelCenterInventory.java | 24 +++++++++++++++++++ .../ModelServiceInstanceGroupInventory.java | 8 +++++++ .../zstack/sdk/UpdateModelCenterAction.java | 9 +++++++ 5 files changed, 53 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java index 38c0bbec6c9..f5e0936d681 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java @@ -43,6 +43,15 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String parameters; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String storageNetworkUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceNetworkUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerRegistry; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java index fe126b584d2..f0ba91e700e 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java @@ -43,6 +43,9 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; + @Param(required = true, validValues = {"VirtualMachine","Container"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Long memorySize; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java index 2447a6b2faf..241b47c2618 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java @@ -60,6 +60,30 @@ public int getManagementPort() { return this.managementPort; } + public java.lang.String storageNetworkUuid; + public void setStorageNetworkUuid(java.lang.String storageNetworkUuid) { + this.storageNetworkUuid = storageNetworkUuid; + } + public java.lang.String getStorageNetworkUuid() { + return this.storageNetworkUuid; + } + + public java.lang.String serviceNetworkUuid; + public void setServiceNetworkUuid(java.lang.String serviceNetworkUuid) { + this.serviceNetworkUuid = serviceNetworkUuid; + } + public java.lang.String getServiceNetworkUuid() { + return this.serviceNetworkUuid; + } + + public java.lang.String containerRegistry; + public void setContainerRegistry(java.lang.String containerRegistry) { + this.containerRegistry = containerRegistry; + } + public java.lang.String getContainerRegistry() { + return this.containerRegistry; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java index afde410afba..560271d8bf4 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java @@ -44,6 +44,14 @@ public java.lang.String getStatus() { return this.status; } + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + public java.lang.String name; public void setName(java.lang.String name) { this.name = name; diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java index 210b877eb88..232ecefc07a 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java @@ -40,6 +40,15 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String parameters; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String storageNetworkUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceNetworkUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerRegistry; + @Param(required = false) public java.util.List systemTags; From 2a514c6632eb4dff8a2b0711aa441a6bc06756c2 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 9 Jul 2024 21:32:24 +0800 Subject: [PATCH 072/737] [conf]: add type to ModelServiceInstanceGroupVO DBImpact Resolves: ZSTAC-66285 Change-Id: I666b7471626d6b78626d7a7663636568776e7569 --- conf/db/upgrade/V5.1.8.1__schema.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 9ed63ec101e..4089cccf3fe 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -61,6 +61,7 @@ CREATE TABLE `zstack`.`ModelServiceInstanceGroupVO` ( `modelUuid` varchar(32) NOT NULL, `name` varchar(255) DEFAULT NULL, `status` varchar(255) NOT NULL, + `type` varchar(128) NOT NULL, `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', CONSTRAINT fkModelServiceInstanceGroupVOModelServiceModelServiceVO FOREIGN KEY (modelServiceUuid) REFERENCES ModelServiceVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE, From 74b362d24822b866ef9872979c822aa418852ee4 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 12 Jul 2024 13:17:47 +0800 Subject: [PATCH 073/737] [sdk]: update sdk Resolves: ZSTAC-66285 Change-Id: I75716f697a6275776273796c6d74777265696f66 --- sdk/src/main/java/org/zstack/sdk/AddModelAction.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelAction.java index 2d85aa25e52..ac50b8c07a3 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelAction.java @@ -37,6 +37,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String parameters; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String token; + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String modelCenterUuid; From bd0267928abac0cc3d12636b4815d45bb513fb38 Mon Sep 17 00:00:00 2001 From: lock-files Date: Fri, 12 Jul 2024 14:53:13 +0800 Subject: [PATCH 074/737] [sdk]: Update sdk Change-Id: I766e65747678647a747479657a656c626563696e --- .../sdk/UnbindModelFromServiceAction.java | 104 ++++++++++++++++++ .../sdk/UnbindModelFromServiceResult.java | 14 +++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ 3 files changed, 145 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/UnbindModelFromServiceAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UnbindModelFromServiceResult.java diff --git a/sdk/src/main/java/org/zstack/sdk/UnbindModelFromServiceAction.java b/sdk/src/main/java/org/zstack/sdk/UnbindModelFromServiceAction.java new file mode 100644 index 00000000000..7aad0614cae --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UnbindModelFromServiceAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UnbindModelFromServiceAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.BindModelToServiceResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelServiceUuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.BindModelToServiceResult value = res.getResult(org.zstack.sdk.BindModelToServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.BindModelToServiceResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/ai/models/{modelUuid}/model-services/{modelServiceUuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UnbindModelFromServiceResult.java b/sdk/src/main/java/org/zstack/sdk/UnbindModelFromServiceResult.java new file mode 100644 index 00000000000..2be1c139186 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UnbindModelFromServiceResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceInventory; + +public class UnbindModelFromServiceResult { + public ModelServiceInventory inventory; + public void setInventory(ModelServiceInventory inventory) { + this.inventory = inventory; + } + public ModelServiceInventory getInventory() { + return this.inventory; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 45d09785da7..b81c18d5d00 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -39057,6 +39057,33 @@ abstract class ApiHelper { } + def unbindModelFromService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UnbindModelFromServiceAction.class) Closure c) { + def a = new org.zstack.sdk.UnbindModelFromServiceAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def undoSnapshotCreation(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UndoSnapshotCreationAction.class) Closure c) { def a = new org.zstack.sdk.UndoSnapshotCreationAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From c000e01b0ff51a328b81f9f8977a812e9f1abc75 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Tue, 16 Jul 2024 14:42:20 +0800 Subject: [PATCH 075/737] [sdk]: Update unbind sdk Change-Id: I707873667a6a6365647068616964796a6f68716e --- .../java/org/zstack/sdk/UnbindModelFromServiceAction.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/UnbindModelFromServiceAction.java b/sdk/src/main/java/org/zstack/sdk/UnbindModelFromServiceAction.java index 7aad0614cae..45c136ae210 100644 --- a/sdk/src/main/java/org/zstack/sdk/UnbindModelFromServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UnbindModelFromServiceAction.java @@ -12,7 +12,7 @@ public class UnbindModelFromServiceAction extends AbstractAction { public static class Result { public ErrorCode error; - public org.zstack.sdk.BindModelToServiceResult value; + public org.zstack.sdk.UnbindModelFromServiceResult value; public Result throwExceptionIfError() { if (error != null) { @@ -63,8 +63,8 @@ private Result makeResult(ApiResult res) { return ret; } - org.zstack.sdk.BindModelToServiceResult value = res.getResult(org.zstack.sdk.BindModelToServiceResult.class); - ret.value = value == null ? new org.zstack.sdk.BindModelToServiceResult() : value; + org.zstack.sdk.UnbindModelFromServiceResult value = res.getResult(org.zstack.sdk.UnbindModelFromServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.UnbindModelFromServiceResult() : value; return ret; } From 84e38706dd5d505c802e32f791042ceb24da510a Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 17 Jul 2024 15:33:38 +0800 Subject: [PATCH 076/737] [storage]: add trace for primary storage capacity check Resolves: ZSTAC-66285 Change-Id: I6970686572756c636c6d756171777977756b6163 --- .../primary/PrimaryStorageCapacityChecker.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageCapacityChecker.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageCapacityChecker.java index efaeca67a15..280e902fb4e 100644 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageCapacityChecker.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageCapacityChecker.java @@ -8,6 +8,8 @@ import org.zstack.header.storage.primary.PrimaryStorageCapacityVO_; import org.zstack.header.storage.primary.PrimaryStorageOverProvisioningManager; import org.zstack.utils.SizeUtils; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; /** * Created by MaJin on 2021/7/21. @@ -15,6 +17,8 @@ @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class PrimaryStorageCapacityChecker { + private CLogger logger = Utils.getLogger(PrimaryStorageCapacityChecker.class); + @Autowired protected PrimaryStorageOverProvisioningManager psRatioMgr; @Autowired @@ -69,6 +73,17 @@ public boolean checkIncreasedAndTotalRequiredSize(long increasedRequiredSize, lo boolean physicalCapacityMeetTotalRequiredSizeByRatio = physicalCapacityMgr .checkRequiredCapacityByRatio(primaryStorageUuid, totalPhysicalCapacity, totalRequiredSize); + if (logger.isTraceEnabled()) { + logger.trace(String.format("Check required size result:" + + " availableCapacityMeetIncreaseSizeByRatio: %s," + + " physicalCapacityHasFreeSpaceByRatio: %s," + + " physicalCapacityMeetTotalRequiredSizeByRatio: %s", + availableCapacityMeetIncreaseSizeByRatio, + physicalCapacityHasFreeSpaceByRatio, + physicalCapacityMeetTotalRequiredSizeByRatio) + ); + } + return availableCapacityMeetIncreaseSizeByRatio && physicalCapacityHasFreeSpaceByRatio && physicalCapacityMeetTotalRequiredSizeByRatio; From 38a405f3a9211c26dea0c7e4e64bf30158a0cd9f Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 19 Jul 2024 11:00:59 +0800 Subject: [PATCH 077/737] [build]: add container module to build.xml Resolves: ZSTAC-66285 Change-Id: I62796e6e68786f746e636c68706a6d6d6d696275 Signed-off-by: AlanJager --- build/pom.xml | 10 ++ conf/db/upgrade/V5.1.8.1__schema.sql | 11 ++ sdk/src/main/java/SourceClassMap.java | 2 + .../sdk/AddContainerManagementVmAction.java | 116 ++++++++++++++++++ .../sdk/AddContainerManagementVmResult.java | 14 +++ .../sdk/ContainerManagementVmInventory.java | 63 ++++++++++ .../DeleteContainerManagementVmAction.java | 104 ++++++++++++++++ .../DeleteContainerManagementVmResult.java | 7 ++ .../sdk/QueryContainerManagementVmAction.java | 75 +++++++++++ .../sdk/QueryContainerManagementVmResult.java | 22 ++++ .../UpdateContainerManagementVmAction.java | 110 +++++++++++++++++ .../UpdateContainerManagementVmResult.java | 14 +++ .../java/org/zstack/testlib/ApiHelper.groovy | 110 +++++++++++++++++ .../zstack/testlib/tool/CodeGenerator.groovy | 14 ++- 14 files changed, 671 insertions(+), 1 deletion(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/AddContainerManagementVmAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/AddContainerManagementVmResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ContainerManagementVmInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementVmAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementVmResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryContainerManagementVmAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryContainerManagementVmResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementVmAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementVmResult.java diff --git a/build/pom.xml b/build/pom.xml index 59818f94fa0..ca57d16177d 100755 --- a/build/pom.xml +++ b/build/pom.xml @@ -897,6 +897,16 @@ ai ${project.version} + + org.zstack + container + ${project.version} + + + org.zstack + iam2-container + ${project.version} + org.zstack snmp diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 4089cccf3fe..bfa73447e9c 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -98,3 +98,14 @@ CREATE TABLE IF NOT EXISTS `zstack`.`SSOServerTokenVO`( `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ContainerManagementVmVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `managementIp` varchar(255) DEFAULT NULL, + `vendor` varchar(64) DEFAULT NULL, + `managementPort` int unsigned DEFAULT NULL, + `vmInstanceUuid` varchar(32) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 8f0d2f520e2..95e990fa25e 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -94,6 +94,7 @@ public class SourceClassMap { put("org.zstack.cloudformation.template.struct.ActionStruct", "org.zstack.sdk.ActionStruct"); put("org.zstack.cloudformation.template.struct.ResourceStruct", "org.zstack.sdk.ResourceStruct"); put("org.zstack.cloudformation.template.struct.ResourceType", "org.zstack.sdk.ResourceType"); + put("org.zstack.container.entity.ContainerManagementVmInventory", "org.zstack.sdk.ContainerManagementVmInventory"); put("org.zstack.core.config.GlobalConfigInventory", "org.zstack.sdk.GlobalConfigInventory"); put("org.zstack.core.config.GlobalConfigOptions", "org.zstack.sdk.GlobalConfigOptions"); put("org.zstack.core.config.GuestOsCharacterInventory", "org.zstack.sdk.GuestOsCharacterInventory"); @@ -881,6 +882,7 @@ public class SourceClassMap { put("org.zstack.sdk.ConnectionRelationShipProperty", "org.zstack.header.aliyun.network.connection.ConnectionRelationShipProperty"); put("org.zstack.sdk.ConsoleInventory", "org.zstack.header.console.ConsoleInventory"); put("org.zstack.sdk.ConsoleProxyAgentInventory", "org.zstack.header.console.ConsoleProxyAgentInventory"); + put("org.zstack.sdk.ContainerManagementVmInventory", "org.zstack.container.entity.ContainerManagementVmInventory"); put("org.zstack.sdk.ControlStrategy", "org.zstack.loginControl.entity.ControlStrategy"); put("org.zstack.sdk.CpuMemoryCapacityData", "org.zstack.header.allocator.datatypes.CpuMemoryCapacityData"); put("org.zstack.sdk.CreateDataVolumeTemplateFromVolumeSnapshotFailure", "org.zstack.header.image.APICreateDataVolumeTemplateFromVolumeSnapshotEvent$Failure"); diff --git a/sdk/src/main/java/org/zstack/sdk/AddContainerManagementVmAction.java b/sdk/src/main/java/org/zstack/sdk/AddContainerManagementVmAction.java new file mode 100644 index 00000000000..2fdecc641a9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddContainerManagementVmAction.java @@ -0,0 +1,116 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class AddContainerManagementVmAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.AddContainerManagementVmResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String managementIp; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vendor; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer managementPort; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.AddContainerManagementVmResult value = res.getResult(org.zstack.sdk.AddContainerManagementVmResult.class); + ret.value = value == null ? new org.zstack.sdk.AddContainerManagementVmResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/container/management/vm"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AddContainerManagementVmResult.java b/sdk/src/main/java/org/zstack/sdk/AddContainerManagementVmResult.java new file mode 100644 index 00000000000..bbf8002bfdb --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddContainerManagementVmResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ContainerManagementVmInventory; + +public class AddContainerManagementVmResult { + public ContainerManagementVmInventory inventory; + public void setInventory(ContainerManagementVmInventory inventory) { + this.inventory = inventory; + } + public ContainerManagementVmInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ContainerManagementVmInventory.java b/sdk/src/main/java/org/zstack/sdk/ContainerManagementVmInventory.java new file mode 100644 index 00000000000..278d405ba8f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ContainerManagementVmInventory.java @@ -0,0 +1,63 @@ +package org.zstack.sdk; + + + +public class ContainerManagementVmInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String managementIp; + public void setManagementIp(java.lang.String managementIp) { + this.managementIp = managementIp; + } + public java.lang.String getManagementIp() { + return this.managementIp; + } + + public java.lang.Integer managementPort; + public void setManagementPort(java.lang.Integer managementPort) { + this.managementPort = managementPort; + } + public java.lang.Integer getManagementPort() { + return this.managementPort; + } + + public java.lang.String vendor; + public void setVendor(java.lang.String vendor) { + this.vendor = vendor; + } + public java.lang.String getVendor() { + return this.vendor; + } + + public java.lang.String vmInstanceUuid; + public void setVmInstanceUuid(java.lang.String vmInstanceUuid) { + this.vmInstanceUuid = vmInstanceUuid; + } + public java.lang.String getVmInstanceUuid() { + return this.vmInstanceUuid; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementVmAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementVmAction.java new file mode 100644 index 00000000000..b35a3a75ce7 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementVmAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteContainerManagementVmAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.AddContainerManagementVmResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.AddContainerManagementVmResult value = res.getResult(org.zstack.sdk.AddContainerManagementVmResult.class); + ret.value = value == null ? new org.zstack.sdk.AddContainerManagementVmResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/container/management/vm/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementVmResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementVmResult.java new file mode 100644 index 00000000000..cc985b4de56 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementVmResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteContainerManagementVmResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementVmAction.java b/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementVmAction.java new file mode 100644 index 00000000000..f09c2a6292a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementVmAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryContainerManagementVmAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryVmInstanceResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryVmInstanceResult value = res.getResult(org.zstack.sdk.QueryVmInstanceResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryVmInstanceResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/container/management/vm"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementVmResult.java b/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementVmResult.java new file mode 100644 index 00000000000..e5ab5ec418c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementVmResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryContainerManagementVmResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementVmAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementVmAction.java new file mode 100644 index 00000000000..a502cb7bb59 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementVmAction.java @@ -0,0 +1,110 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateContainerManagementVmAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UpdateContainerManagementVmResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String managementIp; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer managementPort; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vendor; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UpdateContainerManagementVmResult value = res.getResult(org.zstack.sdk.UpdateContainerManagementVmResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateContainerManagementVmResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/container/management/vm/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateContainerManagementVm"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementVmResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementVmResult.java new file mode 100644 index 00000000000..31039de8872 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementVmResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ContainerManagementVmInventory; + +public class UpdateContainerManagementVmResult { + public ContainerManagementVmInventory inventory; + public void setInventory(ContainerManagementVmInventory inventory) { + this.inventory = inventory; + } + public ContainerManagementVmInventory getInventory() { + return this.inventory; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index b81c18d5d00..06056d80ec4 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -1178,6 +1178,33 @@ abstract class ApiHelper { } + def addContainerManagementVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddContainerManagementVmAction.class) Closure c) { + def a = new org.zstack.sdk.AddContainerManagementVmAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def addDataCenterFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddDataCenterFromRemoteAction.class) Closure c) { def a = new org.zstack.sdk.AddDataCenterFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -13085,6 +13112,33 @@ abstract class ApiHelper { } + def deleteContainerManagementVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteContainerManagementVmAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteContainerManagementVmAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def deleteDataCenterInLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteDataCenterInLocalAction.class) Closure c) { def a = new org.zstack.sdk.DeleteDataCenterInLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -28246,6 +28300,35 @@ abstract class ApiHelper { } + def queryContainerManagementVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryContainerManagementVmAction.class) Closure c) { + def a = new org.zstack.sdk.QueryContainerManagementVmAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryDRSAdvice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryDRSAdviceAction.class) Closure c) { def a = new org.zstack.sdk.QueryDRSAdviceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -40704,6 +40787,33 @@ abstract class ApiHelper { } + def updateContainerManagementVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateContainerManagementVmAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateContainerManagementVmAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def updateDirectory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateDirectoryAction.class) Closure c) { def a = new org.zstack.sdk.UpdateDirectoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid diff --git a/testlib/src/main/java/org/zstack/testlib/tool/CodeGenerator.groovy b/testlib/src/main/java/org/zstack/testlib/tool/CodeGenerator.groovy index 6b4d96ce38e..9ca6436cb0c 100644 --- a/testlib/src/main/java/org/zstack/testlib/tool/CodeGenerator.groovy +++ b/testlib/src/main/java/org/zstack/testlib/tool/CodeGenerator.groovy @@ -1,6 +1,10 @@ package org.zstack.testlib.tool import org.reflections.Reflections +import org.reflections.scanners.Scanners +import org.reflections.util.ClasspathHelper +import org.reflections.util.ConfigurationBuilder +import org.reflections.util.FilterBuilder import org.zstack.utils.BeanUtils import org.zstack.utils.StringTemplateUtils @@ -28,6 +32,14 @@ class CodeGenerator { * @param entityClass the jpa vo entity class */ static void generateCodeFromJpaEntity(String entity) { + ConfigurationBuilder builder = ConfigurationBuilder.build() + .setUrls(ClasspathHelper.forPackage("org.zstack")) + .setScanners(Scanners.SubTypes, Scanners.MethodsAnnotated, + Scanners.FieldsAnnotated, Scanners.TypesAnnotated, + Scanners.MethodsParameter) + .setExpandSuperTypes(false) + .filterInputsBy(new FilterBuilder().includePackage("org.zstack")); + BeanUtils.reflections = new Reflections(builder) Class entityClass = BeanUtils.reflections.forClass(entity) if (!entityClass.isAnnotationPresent(Entity.class) && !entityClass.isAnnotationPresent(MappedSuperclass.class)) { System.out.printf("%s is not a JPA entity class", entityClass.getName()) @@ -657,4 +669,4 @@ public class ${INVENTORY_NAME} implements Serializable, Cloneable { static final String API_PARAM_TEMPLATE = ''' @APIParam(maxLength = %s) private %s %s;''' -} \ No newline at end of file +} From 4e5e97a1687658b47a25288ad1bb74e5cf7cf74d Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Sun, 21 Jul 2024 15:31:26 +0800 Subject: [PATCH 078/737] [conf]: Add model service DBImpact Change-Id: I717268796e7a74757968636e75617976786f756f --- conf/db/upgrade/V5.1.8.1__schema.sql | 10 +++ .../org/zstack/sdk/AddModelServiceAction.java | 29 ++++++- .../org/zstack/sdk/ModelServiceInventory.java | 80 +++++++++++++++++++ 3 files changed, 115 insertions(+), 4 deletions(-) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index bfa73447e9c..1b0da8f1aa4 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -41,6 +41,16 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceVO` ( `yaml` mediumtext NOT NULL, `requestCpu` int(10) NOT NULL, `requestMemory` bigint(20) NOT NULL, + `framework` varchar(255) DEFAULT 'Other', + `condaVersion` varchar(32) DEFAULT NULL, + `dockerImage` varchar(255) NOT NULL, + `gpuComputeCapability` varchar(32) DEFAULT NULL, + `system` tinyint(1) DEFAULT 0, + `modelCenterUuid` varchar(32) NOT NULL, + `vmImageUuid` varchar(32) NOT NULL, + `installPath` varchar(512) NOT NULL, + `startCommand` varchar(1024) NOT NULL, + `pythonVersion` varchar(32) DEFAULT NULL, `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index cfbc6d316ff..02ea4792bbc 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -29,7 +29,7 @@ public Result throwExceptionIfError() { public java.lang.String name; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String dockerImageName; + public java.lang.String dockerImage; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; @@ -37,8 +37,11 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String yaml; + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelCenterUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String vmInstanceImageUuid; + public java.lang.String vmImageUuid; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer requestCpu; @@ -46,8 +49,23 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Long requestMemory; - @Param(required = false, nonempty = true, nullElements = false, emptyString = true, noTrim = false) - public java.util.List l3NetworkUuids; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String gpuComputeCapability; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String installPath; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean system; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String startCommand; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String pythonVersion; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String condaVersion; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String zoneUuid; @@ -55,6 +73,9 @@ public Result throwExceptionIfError() { @Param(required = false, validValues = {"Endpoint","FineTune"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type = "Endpoint"; + @Param(required = false, validValues = {"Other","Bentoml","HuggingFace"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String framework = "Other"; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java index f4b007b4c5d..e9fc74c29d4 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java @@ -52,6 +52,14 @@ public java.lang.Long getRequestMemory() { return this.requestMemory; } + public java.lang.String modelCenterUuid; + public void setModelCenterUuid(java.lang.String modelCenterUuid) { + this.modelCenterUuid = modelCenterUuid; + } + public java.lang.String getModelCenterUuid() { + return this.modelCenterUuid; + } + public java.lang.String type; public void setType(java.lang.String type) { this.type = type; @@ -60,6 +68,78 @@ public java.lang.String getType() { return this.type; } + public java.lang.String framework; + public void setFramework(java.lang.String framework) { + this.framework = framework; + } + public java.lang.String getFramework() { + return this.framework; + } + + public java.lang.String dockerImage; + public void setDockerImage(java.lang.String dockerImage) { + this.dockerImage = dockerImage; + } + public java.lang.String getDockerImage() { + return this.dockerImage; + } + + public java.lang.Boolean system; + public void setSystem(java.lang.Boolean system) { + this.system = system; + } + public java.lang.Boolean getSystem() { + return this.system; + } + + public java.lang.String vmImageUuid; + public void setVmImageUuid(java.lang.String vmImageUuid) { + this.vmImageUuid = vmImageUuid; + } + public java.lang.String getVmImageUuid() { + return this.vmImageUuid; + } + + public java.lang.String gpuComputeCapability; + public void setGpuComputeCapability(java.lang.String gpuComputeCapability) { + this.gpuComputeCapability = gpuComputeCapability; + } + public java.lang.String getGpuComputeCapability() { + return this.gpuComputeCapability; + } + + public java.lang.String installPath; + public void setInstallPath(java.lang.String installPath) { + this.installPath = installPath; + } + public java.lang.String getInstallPath() { + return this.installPath; + } + + public java.lang.String pythonVersion; + public void setPythonVersion(java.lang.String pythonVersion) { + this.pythonVersion = pythonVersion; + } + public java.lang.String getPythonVersion() { + return this.pythonVersion; + } + + public java.lang.String condaVersion; + public void setCondaVersion(java.lang.String condaVersion) { + this.condaVersion = condaVersion; + } + public java.lang.String getCondaVersion() { + return this.condaVersion; + } + + public java.lang.String startCommand; + public void setStartCommand(java.lang.String startCommand) { + this.startCommand = startCommand; + } + public java.lang.String getStartCommand() { + return this.startCommand; + } + public java.util.List modelServiceRefs; public void setModelServiceRefs(java.util.List modelServiceRefs) { this.modelServiceRefs = modelServiceRefs; From dada557e508ccf6e6f368756fc719bbd087dd934 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Thu, 25 Jul 2024 17:26:21 +0800 Subject: [PATCH 079/737] [conf]: update sdk DBImpact Change-Id: I616a636371737464617761776e7774736c717373 --- conf/db/upgrade/V5.1.8.1__schema.sql | 4 ++-- sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java | 4 ++-- .../org/zstack/sdk/DeleteContainerManagementVmAction.java | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 1b0da8f1aa4..10204e40899 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -43,11 +43,11 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceVO` ( `requestMemory` bigint(20) NOT NULL, `framework` varchar(255) DEFAULT 'Other', `condaVersion` varchar(32) DEFAULT NULL, - `dockerImage` varchar(255) NOT NULL, + `dockerImage` varchar(255) DEFAULT NULL, `gpuComputeCapability` varchar(32) DEFAULT NULL, `system` tinyint(1) DEFAULT 0, `modelCenterUuid` varchar(32) NOT NULL, - `vmImageUuid` varchar(32) NOT NULL, + `vmImageUuid` varchar(32) DEFAULT NULL, `installPath` varchar(512) NOT NULL, `startCommand` varchar(1024) NOT NULL, `pythonVersion` varchar(32) DEFAULT NULL, diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index 02ea4792bbc..a497b7c19ad 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -34,7 +34,7 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String yaml; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) @@ -52,7 +52,7 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String gpuComputeCapability; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String installPath; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementVmAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementVmAction.java index b35a3a75ce7..92453669300 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementVmAction.java @@ -12,7 +12,7 @@ public class DeleteContainerManagementVmAction extends AbstractAction { public static class Result { public ErrorCode error; - public org.zstack.sdk.AddContainerManagementVmResult value; + public org.zstack.sdk.DeleteContainerManagementVmResult value; public Result throwExceptionIfError() { if (error != null) { @@ -63,8 +63,8 @@ private Result makeResult(ApiResult res) { return ret; } - org.zstack.sdk.AddContainerManagementVmResult value = res.getResult(org.zstack.sdk.AddContainerManagementVmResult.class); - ret.value = value == null ? new org.zstack.sdk.AddContainerManagementVmResult() : value; + org.zstack.sdk.DeleteContainerManagementVmResult value = res.getResult(org.zstack.sdk.DeleteContainerManagementVmResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteContainerManagementVmResult() : value; return ret; } From ae681e17df4838c4b656797bc99c454fdfdae384 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 25 Jul 2024 10:41:16 +0800 Subject: [PATCH 080/737] [conf]: introduce dataset DBImpact Resolves: ZSTAC-66285 Change-Id: I74686262727375737876716862766f756c6c7a78 Signed-off-by: AlanJager --- conf/db/upgrade/V5.1.8.1__schema.sql | 14 +++ sdk/src/main/java/SourceClassMap.java | 2 + .../org/zstack/sdk/AddModelServiceAction.java | 4 +- .../org/zstack/sdk/CreateDatasetAction.java | 116 ++++++++++++++++++ .../org/zstack/sdk/CreateDatasetResult.java | 14 +++ .../java/org/zstack/sdk/DatasetInventory.java | 79 ++++++++++++ .../org/zstack/sdk/DeleteDatasetAction.java | 101 +++++++++++++++ .../org/zstack/sdk/DeleteDatasetResult.java | 7 ++ .../org/zstack/sdk/QueryDatasetAction.java | 75 +++++++++++ .../org/zstack/sdk/QueryDatasetResult.java | 22 ++++ .../org/zstack/sdk/UpdateDatasetAction.java | 107 ++++++++++++++++ .../org/zstack/sdk/UpdateDatasetResult.java | 14 +++ .../java/org/zstack/testlib/ApiHelper.groovy | 110 +++++++++++++++++ .../zstack/testlib/tool/CodeGenerator.groovy | 6 +- 14 files changed, 668 insertions(+), 3 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateDatasetAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateDatasetResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DatasetInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteDatasetAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteDatasetResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryDatasetAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryDatasetResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateDatasetResult.java diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 10204e40899..efaa4e183bc 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -119,3 +119,17 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ContainerManagementVmVO` ( `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`DatasetVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) NULL, + `url` varchar(2048) NULL, + `installPath` varchar(2048) NULL, + `description` varchar(2048) NULL, + `modelCenterUuid` varchar(32) NOT NULL, + `size` bigint NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`), + CONSTRAINT fkDatasetVOModelCenterVO FOREIGN KEY (modelCenterUuid) REFERENCES ModelCenterVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 95e990fa25e..a83574542e9 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -7,6 +7,7 @@ public class SourceClassMap { { put("org.zstack.accessKey.AccessKeyInventory", "org.zstack.sdk.AccessKeyInventory"); put("org.zstack.accessKey.AccessKeyState", "org.zstack.sdk.AccessKeyState"); + put("org.zstack.ai.entity.DatasetInventory", "org.zstack.sdk.DatasetInventory"); put("org.zstack.ai.entity.ModelCenterInventory", "org.zstack.sdk.ModelCenterInventory"); put("org.zstack.ai.entity.ModelInventory", "org.zstack.sdk.ModelInventory"); put("org.zstack.ai.entity.ModelServiceInstanceGroupInventory", "org.zstack.sdk.ModelServiceInstanceGroupInventory"); @@ -894,6 +895,7 @@ public class SourceClassMap { put("org.zstack.sdk.DataVolumeBillingInventory", "org.zstack.billing.generator.volume.data.DataVolumeBillingInventory"); put("org.zstack.sdk.DataVolumeSpending", "org.zstack.billing.spendingcalculator.volume.data.DataVolumeSpending"); put("org.zstack.sdk.DataVolumeSpendingInventory", "org.zstack.billing.spendingcalculator.volume.data.DataVolumeSpendingInventory"); + put("org.zstack.sdk.DatasetInventory", "org.zstack.ai.entity.DatasetInventory"); put("org.zstack.sdk.DeleteSnapshotGroupResult", "org.zstack.header.storage.snapshot.group.DeleteSnapshotGroupResult"); put("org.zstack.sdk.DirectoryInventory", "org.zstack.directory.DirectoryInventory"); put("org.zstack.sdk.DiskOfferingInventory", "org.zstack.header.configuration.DiskOfferingInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index a497b7c19ad..109796025a0 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -28,7 +28,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String dockerImage; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) @@ -40,7 +40,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String modelCenterUuid; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vmImageUuid; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateDatasetAction.java b/sdk/src/main/java/org/zstack/sdk/CreateDatasetAction.java new file mode 100644 index 00000000000..e8ab749a9d8 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateDatasetAction.java @@ -0,0 +1,116 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateDatasetAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.CreateDatasetResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = true, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String url; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelCenterUuid; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.CreateDatasetResult value = res.getResult(org.zstack.sdk.CreateDatasetResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateDatasetResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/ai/datasets"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateDatasetResult.java b/sdk/src/main/java/org/zstack/sdk/CreateDatasetResult.java new file mode 100644 index 00000000000..c7606e63f59 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateDatasetResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.DatasetInventory; + +public class CreateDatasetResult { + public DatasetInventory inventory; + public void setInventory(DatasetInventory inventory) { + this.inventory = inventory; + } + public DatasetInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DatasetInventory.java b/sdk/src/main/java/org/zstack/sdk/DatasetInventory.java new file mode 100644 index 00000000000..b94f9c346c8 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DatasetInventory.java @@ -0,0 +1,79 @@ +package org.zstack.sdk; + + + +public class DatasetInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public java.lang.String url; + public void setUrl(java.lang.String url) { + this.url = url; + } + public java.lang.String getUrl() { + return this.url; + } + + public java.lang.String installPath; + public void setInstallPath(java.lang.String installPath) { + this.installPath = installPath; + } + public java.lang.String getInstallPath() { + return this.installPath; + } + + public java.lang.String modelCenterUuid; + public void setModelCenterUuid(java.lang.String modelCenterUuid) { + this.modelCenterUuid = modelCenterUuid; + } + public java.lang.String getModelCenterUuid() { + return this.modelCenterUuid; + } + + public java.lang.Long size; + public void setSize(java.lang.Long size) { + this.size = size; + } + public java.lang.Long getSize() { + return this.size; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteDatasetAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteDatasetAction.java new file mode 100644 index 00000000000..e7882d00fbf --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteDatasetAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteDatasetAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeleteDatasetResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeleteDatasetResult value = res.getResult(org.zstack.sdk.DeleteDatasetResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteDatasetResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/ai/datasets/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteDatasetResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteDatasetResult.java new file mode 100644 index 00000000000..7fe3e10efb2 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteDatasetResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteDatasetResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryDatasetAction.java b/sdk/src/main/java/org/zstack/sdk/QueryDatasetAction.java new file mode 100644 index 00000000000..54a94e20af7 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryDatasetAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryDatasetAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryDatasetResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryDatasetResult value = res.getResult(org.zstack.sdk.QueryDatasetResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryDatasetResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/ai/datasets"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryDatasetResult.java b/sdk/src/main/java/org/zstack/sdk/QueryDatasetResult.java new file mode 100644 index 00000000000..5b6df199b9c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryDatasetResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryDatasetResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java new file mode 100644 index 00000000000..79c928ac646 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateDatasetAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UpdateDatasetResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UpdateDatasetResult value = res.getResult(org.zstack.sdk.UpdateDatasetResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateDatasetResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/ai/datasets/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateDatasetResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetResult.java new file mode 100644 index 00000000000..7c63bcfb858 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.DatasetInventory; + +public class UpdateDatasetResult { + public DatasetInventory inventory; + public void setInventory(DatasetInventory inventory) { + this.inventory = inventory; + } + public DatasetInventory getInventory() { + return this.inventory; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 06056d80ec4..013477f8a6c 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -8630,6 +8630,33 @@ abstract class ApiHelper { } + def createDataset(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateDatasetAction.class) Closure c) { + def a = new org.zstack.sdk.CreateDatasetAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def createDirectory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateDirectoryAction.class) Closure c) { def a = new org.zstack.sdk.CreateDirectoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -13193,6 +13220,33 @@ abstract class ApiHelper { } + def deleteDataset(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteDatasetAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteDatasetAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def deleteDirectory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteDirectoryAction.class) Closure c) { def a = new org.zstack.sdk.DeleteDirectoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -28416,6 +28470,35 @@ abstract class ApiHelper { } + def queryDataset(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryDatasetAction.class) Closure c) { + def a = new org.zstack.sdk.QueryDatasetAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryDirectory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryDirectoryAction.class) Closure c) { def a = new org.zstack.sdk.QueryDirectoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -40814,6 +40897,33 @@ abstract class ApiHelper { } + def updateDataset(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateDatasetAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateDatasetAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def updateDirectory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateDirectoryAction.class) Closure c) { def a = new org.zstack.sdk.UpdateDirectoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid diff --git a/testlib/src/main/java/org/zstack/testlib/tool/CodeGenerator.groovy b/testlib/src/main/java/org/zstack/testlib/tool/CodeGenerator.groovy index 9ca6436cb0c..049487a4eb8 100644 --- a/testlib/src/main/java/org/zstack/testlib/tool/CodeGenerator.groovy +++ b/testlib/src/main/java/org/zstack/testlib/tool/CodeGenerator.groovy @@ -558,7 +558,7 @@ import org.zstack.header.rest.RestRequest; path = "/${LOWER_CASE_RESOURCE_NAME}s/{uuid}", method = HttpMethod.PUT, responseClass = APIUpdate${RESOURCE_NAME}Event.class, - parameterName = "params" + isAction = true ) public class APIUpdate${RESOURCE_NAME}Msg extends APIMessage { @APIParam(resourceType = ${RESOURCE_NAME}VO.class, checkAccount = true, operationTarget = true) @@ -599,6 +599,10 @@ public class APIUpdate${RESOURCE_NAME}Event extends APIEvent { return inventory; } + public void setInventory(${RESOURCE_NAME}Inventory inventory) { + this.inventory = inventory; + } + public static APIUpdate${RESOURCE_NAME}Event __example__() { APIUpdate${RESOURCE_NAME}Event event = new APIUpdate${RESOURCE_NAME}Event(); return event; From 358d4e2a5e7b57db43b9bdd6aef1294b6705d529 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Thu, 25 Jul 2024 13:47:44 +0000 Subject: [PATCH 081/737] [sdk]: update sdk set imageUuid, dockerImage as not required Change-Id: I65636470756d7471796a676c6c64647877736e6f --- sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java | 4 ++-- sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index 109796025a0..a497b7c19ad 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -28,7 +28,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String dockerImage; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) @@ -40,7 +40,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String modelCenterUuid; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vmImageUuid; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java index 79c928ac646..5158ea55486 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java @@ -100,7 +100,7 @@ protected RestInfo getRestInfo() { info.path = "/ai/datasets/{uuid}"; info.needSession = true; info.needPoll = true; - info.parameterName = "params"; + info.parameterName = "updateDataset"; return info; } From 183f5646ae3422b09d6aacd0f1e55a6071635c93 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Thu, 25 Jul 2024 16:00:03 +0000 Subject: [PATCH 082/737] [sdk]: Update sdk support config docker image when deploy Change-Id: I6e787470686b6169716f70636b7279766662636e --- .../main/java/org/zstack/sdk/DeployModelServiceAction.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java index f0ba91e700e..c9c5017d958 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java @@ -35,7 +35,10 @@ public Result throwExceptionIfError() { public java.lang.String zoneUuid; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String imageUuid; + public java.lang.String vmImageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String dockerImage; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer cpuNum; From 54bfbe9a85cea302aca5d6cec1c8c6cedf771ef4 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Fri, 26 Jul 2024 03:54:36 +0000 Subject: [PATCH 083/737] [sdk]: Update sdk support UpdateModelServiceInstanceGroup Change-Id: I636575687561626463697874777062726167717a --- ...UpdateModelServiceInstanceGroupAction.java | 104 ++++++++++++++++++ ...UpdateModelServiceInstanceGroupResult.java | 14 +++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ 3 files changed, 145 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupResult.java diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java new file mode 100644 index 00000000000..66b6453478d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateModelServiceInstanceGroupAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UpdateModelServiceInstanceGroupResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UpdateModelServiceInstanceGroupResult value = res.getResult(org.zstack.sdk.UpdateModelServiceInstanceGroupResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateModelServiceInstanceGroupResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/model-service-instance-groups/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateModelServiceInstanceGroup"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupResult.java new file mode 100644 index 00000000000..b7a9c6b6d40 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceInstanceGroupInventory; + +public class UpdateModelServiceInstanceGroupResult { + public ModelServiceInstanceGroupInventory inventory; + public void setInventory(ModelServiceInstanceGroupInventory inventory) { + this.inventory = inventory; + } + public ModelServiceInstanceGroupInventory getInventory() { + return this.inventory; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 013477f8a6c..4b0a0766bad 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -42517,6 +42517,33 @@ abstract class ApiHelper { } + def updateModelServiceInstanceGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateModelServiceInstanceGroupAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateModelServiceInstanceGroupAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def updateMonitorTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateMonitorTriggerAction.class) Closure c) { def a = new org.zstack.sdk.UpdateMonitorTriggerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 6decfb5c334af0abd40ad43ba9eaf5ba78a246d2 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Fri, 26 Jul 2024 07:01:58 +0000 Subject: [PATCH 084/737] [sdk]: Update sdk to support update model service Change-Id: I77637873717664646f6f6866696f666d78726a68 --- .../zstack/sdk/UpdateModelServiceAction.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java index 7fe9c51d193..0b91cb4003d 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java @@ -31,12 +31,18 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String dockerImage; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String yaml; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmImageUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer requestCpu; @@ -44,7 +50,19 @@ public Result throwExceptionIfError() { public java.lang.Long requestMemory; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String modelUuid; + public java.lang.String gpuComputeCapability; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String startCommand; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String pythonVersion; + + @Param(required = false, validValues = {"Endpoint","FineTune"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @Param(required = false, validValues = {"Other","Bentoml","HuggingFace"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String framework; @Param(required = false) public java.util.List systemTags; From a88172a17b18d6dceddcea0edae2492d985e708b Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 25 Jul 2024 22:00:52 +0800 Subject: [PATCH 085/737] [iam2]: introduce ak utils and update sdk Resolves: ZSTAC-66285 Change-Id: I636c75717575727a6b6a6e756d6d686e75687a72 Signed-off-by: AlanJager --- conf/db/upgrade/V5.1.8.1__schema.sql | 4 + .../java/org/zstack/identity/AccountBase.java | 16 +++- .../zstack/identity/QuotaExtensionPoint.java | 7 ++ sdk/src/main/java/SourceClassMap.java | 2 + .../sdk/AddContainerManagementVmAction.java | 12 +++ .../sdk/ContainerManagementVmInventory.java | 24 +++++ .../container/ContainerClusterInventory.java | 55 +++++++++++ ...ojectContainerClusterCandidatesAction.java | 92 +++++++++++++++++++ ...ojectContainerClusterCandidatesResult.java | 14 +++ test/src/test/resources/log4j2.xml | 2 + .../java/org/zstack/testlib/ApiHelper.groovy | 27 ++++++ .../org/zstack/utils/ak/AccessKeyUtils.java | 61 ++++++++++++ .../org/zstack/utils/gson/JSONObjectUtil.java | 4 + 13 files changed, 318 insertions(+), 2 deletions(-) create mode 100644 identity/src/main/java/org/zstack/identity/QuotaExtensionPoint.java create mode 100644 sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerClusterInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerClusterCandidatesAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerClusterCandidatesResult.java create mode 100644 utils/src/main/java/org/zstack/utils/ak/AccessKeyUtils.java diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index efaa4e183bc..f030a95293a 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -111,10 +111,14 @@ CREATE TABLE IF NOT EXISTS `zstack`.`SSOServerTokenVO`( CREATE TABLE IF NOT EXISTS `zstack`.`ContainerManagementVmVO` ( `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) DEFAULT NULL, + `description` varchar(2048) DEFAULT NULL, `managementIp` varchar(255) DEFAULT NULL, `vendor` varchar(64) DEFAULT NULL, `managementPort` int unsigned DEFAULT NULL, `vmInstanceUuid` varchar(32) NOT NULL, + `accessKeyId` VARCHAR(128) NOT NULL, + `accessKeySecret` VARCHAR(128) NOT NULL, `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`) diff --git a/identity/src/main/java/org/zstack/identity/AccountBase.java b/identity/src/main/java/org/zstack/identity/AccountBase.java index a62c0ad5418..3bac2051ee4 100755 --- a/identity/src/main/java/org/zstack/identity/AccountBase.java +++ b/identity/src/main/java/org/zstack/identity/AccountBase.java @@ -12,13 +12,21 @@ import org.zstack.core.cloudbus.EventFacade; import org.zstack.core.cloudbus.MessageSafe; import org.zstack.core.componentloader.PluginRegistry; -import org.zstack.core.db.*; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; +import org.zstack.core.db.SQLBatch; +import org.zstack.core.db.SQLBatchWithReturn; +import org.zstack.core.db.SimpleQuery; import org.zstack.core.db.SimpleQuery.Op; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; import org.zstack.header.core.Completion; -import org.zstack.header.core.workflow.*; +import org.zstack.header.core.workflow.FlowChain; +import org.zstack.header.core.workflow.FlowDoneHandler; +import org.zstack.header.core.workflow.FlowErrorHandler; +import org.zstack.header.core.workflow.FlowTrigger; +import org.zstack.header.core.workflow.NoRollbackFlow; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.identity.*; @@ -435,6 +443,10 @@ private void handle(APIGetAccountQuotaUsageMsg msg) { } private void handle(APIUpdateQuotaMsg msg) { + for (QuotaExtensionPoint ext : pluginRgty.getExtensionList(QuotaExtensionPoint.class)) { + ext.beforeUpdateQuota(msg.getQuotaVO(), msg.getAccountUuid()); + } + QuotaVO quota = msg.getQuotaVO(); quota.setValue(msg.getValue()); quota = dbf.updateAndRefresh(quota); diff --git a/identity/src/main/java/org/zstack/identity/QuotaExtensionPoint.java b/identity/src/main/java/org/zstack/identity/QuotaExtensionPoint.java new file mode 100644 index 00000000000..d6d4657e4b2 --- /dev/null +++ b/identity/src/main/java/org/zstack/identity/QuotaExtensionPoint.java @@ -0,0 +1,7 @@ +package org.zstack.identity; + +import org.zstack.header.identity.QuotaVO; + +public interface QuotaExtensionPoint { + void beforeUpdateQuota(QuotaVO newQuotaVO, String accountUuid); +} diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index a83574542e9..28408cb9fcd 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -398,6 +398,7 @@ public class SourceClassMap { put("org.zstack.iam2.api.APIGetIAM2VirtualIDAPIPermissionReply$Permission", "org.zstack.sdk.iam2.api.Permission"); put("org.zstack.iam2.api.Attribute", "org.zstack.sdk.iam2.api.Attribute"); put("org.zstack.iam2.api.ErrorResult", "org.zstack.sdk.iam2.api.ErrorResult"); + put("org.zstack.iam2.container.ContainerClusterInventory", "org.zstack.sdk.iam2.container.ContainerClusterInventory"); put("org.zstack.iam2.entity.AttributeType", "org.zstack.sdk.iam2.entity.AttributeType"); put("org.zstack.iam2.entity.IAM2AttributeInventory", "org.zstack.sdk.iam2.entity.IAM2AttributeInventory"); put("org.zstack.iam2.entity.IAM2OrganizationAttributeInventory", "org.zstack.sdk.iam2.entity.IAM2OrganizationAttributeInventory"); @@ -1395,6 +1396,7 @@ public class SourceClassMap { put("org.zstack.sdk.iam2.api.Attribute", "org.zstack.iam2.api.Attribute"); put("org.zstack.sdk.iam2.api.ErrorResult", "org.zstack.iam2.api.ErrorResult"); put("org.zstack.sdk.iam2.api.Permission", "org.zstack.iam2.api.APIGetIAM2VirtualIDAPIPermissionReply$Permission"); + put("org.zstack.sdk.iam2.container.ContainerClusterInventory", "org.zstack.iam2.container.ContainerClusterInventory"); put("org.zstack.sdk.iam2.entity.AttributeType", "org.zstack.iam2.entity.AttributeType"); put("org.zstack.sdk.iam2.entity.IAM2AttributeInventory", "org.zstack.iam2.entity.IAM2AttributeInventory"); put("org.zstack.sdk.iam2.entity.IAM2OrganizationAttributeInventory", "org.zstack.iam2.entity.IAM2OrganizationAttributeInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/AddContainerManagementVmAction.java b/sdk/src/main/java/org/zstack/sdk/AddContainerManagementVmAction.java index 2fdecc641a9..42dff8c03f1 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddContainerManagementVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddContainerManagementVmAction.java @@ -28,6 +28,12 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String managementIp; @@ -37,6 +43,12 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer managementPort; + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerAccessKeyId; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerAccessKeySecret; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/ContainerManagementVmInventory.java b/sdk/src/main/java/org/zstack/sdk/ContainerManagementVmInventory.java index 278d405ba8f..3323dde3d12 100644 --- a/sdk/src/main/java/org/zstack/sdk/ContainerManagementVmInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ContainerManagementVmInventory.java @@ -12,6 +12,30 @@ public java.lang.String getUuid() { return this.uuid; } + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public java.lang.String accessKeyId; + public void setAccessKeyId(java.lang.String accessKeyId) { + this.accessKeyId = accessKeyId; + } + public java.lang.String getAccessKeyId() { + return this.accessKeyId; + } + public java.lang.String managementIp; public void setManagementIp(java.lang.String managementIp) { this.managementIp = managementIp; diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerClusterInventory.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerClusterInventory.java new file mode 100644 index 00000000000..543f4f4d4f2 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerClusterInventory.java @@ -0,0 +1,55 @@ +package org.zstack.sdk.iam2.container; + + + +public class ContainerClusterInventory { + + public java.lang.String containerUuid; + public void setContainerUuid(java.lang.String containerUuid) { + this.containerUuid = containerUuid; + } + public java.lang.String getContainerUuid() { + return this.containerUuid; + } + + public long clusterId; + public void setClusterId(long clusterId) { + this.clusterId = clusterId; + } + public long getClusterId() { + return this.clusterId; + } + + public java.lang.String clusterName; + public void setClusterName(java.lang.String clusterName) { + this.clusterName = clusterName; + } + public java.lang.String getClusterName() { + return this.clusterName; + } + + public java.lang.String containerName; + public void setContainerName(java.lang.String containerName) { + this.containerName = containerName; + } + public java.lang.String getContainerName() { + return this.containerName; + } + + public java.lang.String containerDescription; + public void setContainerDescription(java.lang.String containerDescription) { + this.containerDescription = containerDescription; + } + public java.lang.String getContainerDescription() { + return this.containerDescription; + } + + public java.lang.String projectTag; + public void setProjectTag(java.lang.String projectTag) { + this.projectTag = projectTag; + } + public java.lang.String getProjectTag() { + return this.projectTag; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerClusterCandidatesAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerClusterCandidatesAction.java new file mode 100644 index 00000000000..c8b4ba46056 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerClusterCandidatesAction.java @@ -0,0 +1,92 @@ +package org.zstack.sdk.iam2.container; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetIAM2ProjectContainerClusterCandidatesAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.iam2.container.GetIAM2ProjectContainerClusterCandidatesResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.iam2.container.GetIAM2ProjectContainerClusterCandidatesResult value = res.getResult(org.zstack.sdk.iam2.container.GetIAM2ProjectContainerClusterCandidatesResult.class); + ret.value = value == null ? new org.zstack.sdk.iam2.container.GetIAM2ProjectContainerClusterCandidatesResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/iam2/projects/container/cluster/candidates"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerClusterCandidatesResult.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerClusterCandidatesResult.java new file mode 100644 index 00000000000..69449b586a3 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerClusterCandidatesResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.iam2.container; + + + +public class GetIAM2ProjectContainerClusterCandidatesResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + +} diff --git a/test/src/test/resources/log4j2.xml b/test/src/test/resources/log4j2.xml index b2c4786637a..3f0b9f3d6a0 100755 --- a/test/src/test/resources/log4j2.xml +++ b/test/src/test/resources/log4j2.xml @@ -160,6 +160,8 @@ + + diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 4b0a0766bad..c6c3224dd4e 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -47484,6 +47484,33 @@ abstract class ApiHelper { } + def getIAM2ProjectContainerClusterCandidates(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.container.GetIAM2ProjectContainerClusterCandidatesAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.container.GetIAM2ProjectContainerClusterCandidatesAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def addPolicyStatementsToRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.AddPolicyStatementsToRoleAction.class) Closure c) { def a = new org.zstack.sdk.identity.role.api.AddPolicyStatementsToRoleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid diff --git a/utils/src/main/java/org/zstack/utils/ak/AccessKeyUtils.java b/utils/src/main/java/org/zstack/utils/ak/AccessKeyUtils.java new file mode 100644 index 00000000000..c2bbe5482d5 --- /dev/null +++ b/utils/src/main/java/org/zstack/utils/ak/AccessKeyUtils.java @@ -0,0 +1,61 @@ +package org.zstack.utils.ak; + +import javax.crypto.Cipher; +import javax.crypto.Mac; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Base64; +import java.util.Locale; + +public class AccessKeyUtils { + + public static String generateDate() { + ZonedDateTime now = ZonedDateTime.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss Z", Locale.ENGLISH); + return now.format(formatter); + } + + public static String generateAuthorization(String accessKeyId, String accessKeySecret, String method, String date, String uri) throws Exception { + String stringToSign = method + "\n" + date + "\n" + uri; + + SecretKeySpec signingKey = new SecretKeySpec(accessKeySecret.getBytes(StandardCharsets.UTF_8), "HmacSHA1"); + Mac mac = Mac.getInstance("HmacSHA1"); + mac.init(signingKey); + + byte[] rawHmac = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8)); + String signature = Base64.getEncoder().encodeToString(rawHmac); + + return "ZStack " + accessKeyId + ":" + signature; + } + + public static String encryptPassword(String password, String sk) throws Exception { + String md5KeyIv = md5Hash(sk); + byte[] key = md5KeyIv.getBytes(StandardCharsets.UTF_8); + byte[] iv = md5KeyIv.substring(0, 16).getBytes(StandardCharsets.UTF_8); + + SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); + IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); + + byte[] encryptedBytes = cipher.doFinal(password.getBytes(StandardCharsets.UTF_8)); + return Base64.getEncoder().encodeToString(encryptedBytes); + } + + private static String md5Hash(String text) throws Exception { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] hashBytes = md.digest(text.getBytes(StandardCharsets.UTF_8)); + + StringBuilder sb = new StringBuilder(); + for (byte b : hashBytes) { + sb.append(String.format("%02x", b)); + } + return sb.toString(); + } +} + diff --git a/utils/src/main/java/org/zstack/utils/gson/JSONObjectUtil.java b/utils/src/main/java/org/zstack/utils/gson/JSONObjectUtil.java index fffd3fdc29f..a6451ce35e4 100755 --- a/utils/src/main/java/org/zstack/utils/gson/JSONObjectUtil.java +++ b/utils/src/main/java/org/zstack/utils/gson/JSONObjectUtil.java @@ -57,6 +57,10 @@ public static T toObject(String content, Class clazz){ return gson.fromJson(content, clazz); } + public static T toObject(JsonElement content, Class clazz) { + return gson.fromJson(content, clazz); + } + // Only supports converting content to List, for example: new TypeToken>() {}.getType() public static List toList(String content, Type type){ return gson.fromJson(content, type); From 84fe7159684dc5b8eb968e68abd553e1c93ea571 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 30 Jul 2024 10:54:10 +0800 Subject: [PATCH 086/737] [identity]: introduce quota def builder Resolves: ZSTAC-66285 Change-Id: I796478637269757061776865717a687268626661 --- .../identity/quota/QuotaDefBuilder.java | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 header/src/main/java/org/zstack/header/identity/quota/QuotaDefBuilder.java diff --git a/header/src/main/java/org/zstack/header/identity/quota/QuotaDefBuilder.java b/header/src/main/java/org/zstack/header/identity/quota/QuotaDefBuilder.java new file mode 100644 index 00000000000..16bedc49654 --- /dev/null +++ b/header/src/main/java/org/zstack/header/identity/quota/QuotaDefBuilder.java @@ -0,0 +1,81 @@ +package org.zstack.header.identity.quota; + +import org.zstack.utils.DebugUtils; + +public class QuotaDefBuilder { + private String name; + private Long defaultValue; + private GetQuotaUsage getUsage; + + public static QuotaDefBuilder newBuilder() { + return new QuotaDefBuilder(); + } + + public QuotaDefBuilder name(String name) { + this.name = name; + return this; + } + + public QuotaDefBuilder defaultValue(Long defaultValue) { + this.defaultValue = defaultValue; + return this; + } + + public QuotaDefBuilder getUsage(GetQuotaUsage usage) { + this.getUsage = usage; + return this; + } + + public interface GetQuotaUsage { + Long apply(String accountUuid, String name); + } + + static class QuotaDefinitionImpl implements QuotaDefinition { + private String name; + private Long defaultValue; + private GetQuotaUsage getUsage; + + @Override + public String getName() { + return this.name; + } + + @Override + public Long getDefaultValue() { + return this.defaultValue; + } + + @Override + public Long getQuotaUsage(String accountUuid) { + return getUsage.apply(accountUuid, name); + } + + public void setName(String name) { + this.name = name; + } + + public void setDefaultValue(Long defaultValue) { + this.defaultValue = defaultValue; + } + + public GetQuotaUsage getGetUsage() { + return getUsage; + } + + public void setGetUsage(GetQuotaUsage getUsage) { + this.getUsage = getUsage; + } + } + + public QuotaDefinition build() { + DebugUtils.Assert(this.name != null, "quota name is required"); + DebugUtils.Assert(this.defaultValue != null, "quota defaultValue is required"); + DebugUtils.Assert(this.getUsage != null, "quota getUsage is required"); + + QuotaDefinitionImpl quota = new QuotaDefinitionImpl(); + quota.name = this.name; + quota.defaultValue = this.defaultValue; + quota.getUsage = this.getUsage; + return quota; + } +} From 272165e116173af45c407bcca65943ae472e8c75 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 30 Jul 2024 12:55:22 +0800 Subject: [PATCH 087/737] [conf]: change fk constrain to ON DELETE SET NULL DBImpact Resolves: ZSTAC-66285 Change-Id: I676e777570676367647a696e66796e766f686572 Signed-off-by: AlanJager --- conf/db/upgrade/V5.1.8.1__schema.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index f030a95293a..2405aea395f 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -67,14 +67,14 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceRefVO` ( CREATE TABLE `zstack`.`ModelServiceInstanceGroupVO` ( `uuid` varchar(32) NOT NULL UNIQUE, - `modelServiceUuid` varchar(32) NOT NULL, + `modelServiceUuid` varchar(32) DEFAULT NULL, `modelUuid` varchar(32) NOT NULL, `name` varchar(255) DEFAULT NULL, `status` varchar(255) NOT NULL, `type` varchar(128) NOT NULL, `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', - CONSTRAINT fkModelServiceInstanceGroupVOModelServiceModelServiceVO FOREIGN KEY (modelServiceUuid) REFERENCES ModelServiceVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE, + CONSTRAINT fkModelServiceInstanceGroupVOModelServiceModelServiceVO FOREIGN KEY (modelServiceUuid) REFERENCES ModelServiceVO (uuid) ON DELETE SET NULL, PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; From e6070df3aa352daba0e9cff7bb26a5af55dc25f4 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 30 Jul 2024 15:19:39 +0800 Subject: [PATCH 088/737] =?UTF-8?q?[identity]:=20use=20identity=20uui?= =?UTF-8?q?d=20in=C2=A0QuotaExtensionPoint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolves: ZSTAC-66285 Change-Id: I6c6a75776b79656364746b697a79646871657172 --- identity/src/main/java/org/zstack/identity/AccountBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/identity/src/main/java/org/zstack/identity/AccountBase.java b/identity/src/main/java/org/zstack/identity/AccountBase.java index 3bac2051ee4..ea34cb45d5c 100755 --- a/identity/src/main/java/org/zstack/identity/AccountBase.java +++ b/identity/src/main/java/org/zstack/identity/AccountBase.java @@ -444,7 +444,7 @@ private void handle(APIGetAccountQuotaUsageMsg msg) { private void handle(APIUpdateQuotaMsg msg) { for (QuotaExtensionPoint ext : pluginRgty.getExtensionList(QuotaExtensionPoint.class)) { - ext.beforeUpdateQuota(msg.getQuotaVO(), msg.getAccountUuid()); + ext.beforeUpdateQuota(msg.getQuotaVO(), msg.getIdentityUuid()); } QuotaVO quota = msg.getQuotaVO(); From 6e3d59e6123f32af4308f2219110d2db5b9572b1 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Wed, 31 Jul 2024 18:56:56 +0800 Subject: [PATCH 089/737] [conf]: update sql & sdk DBImpact Change-Id: I6469666968696f656b666168707262766a6c6a6e --- conf/db/upgrade/V5.1.8.1__schema.sql | 9 ++++++ sdk/src/main/java/SourceClassMap.java | 2 ++ .../zstack/sdk/DeployModelServiceAction.java | 6 ++++ .../ModelServiceGroupDatasetRefInventory.java | 31 +++++++++++++++++++ .../ModelServiceInstanceGroupInventory.java | 8 +++++ 5 files changed, 56 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/ModelServiceGroupDatasetRefInventory.java diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 2405aea395f..6620e30cde8 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -137,3 +137,12 @@ CREATE TABLE IF NOT EXISTS `zstack`.`DatasetVO` ( PRIMARY KEY (`uuid`), CONSTRAINT fkDatasetVOModelCenterVO FOREIGN KEY (modelCenterUuid) REFERENCES ModelCenterVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceGroupDatasetRefVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `datasetUuid` varchar(32) NOT NULL, + `modelServiceInstanceGroupUuid` varchar(32) NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT fkDatasetRefVO FOREIGN KEY (datasetUuid) REFERENCES DatasetVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE, + CONSTRAINT fkModelServiceInstanceGroupVORefVO FOREIGN KEY (modelServiceInstanceGroupUuid) REFERENCES ModelServiceInstanceGroupVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 28408cb9fcd..7f6348489e1 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -10,6 +10,7 @@ public class SourceClassMap { put("org.zstack.ai.entity.DatasetInventory", "org.zstack.sdk.DatasetInventory"); put("org.zstack.ai.entity.ModelCenterInventory", "org.zstack.sdk.ModelCenterInventory"); put("org.zstack.ai.entity.ModelInventory", "org.zstack.sdk.ModelInventory"); + put("org.zstack.ai.entity.ModelServiceGroupDatasetRefInventory", "org.zstack.sdk.ModelServiceGroupDatasetRefInventory"); put("org.zstack.ai.entity.ModelServiceInstanceGroupInventory", "org.zstack.sdk.ModelServiceInstanceGroupInventory"); put("org.zstack.ai.entity.ModelServiceInstanceInventory", "org.zstack.sdk.ModelServiceInstanceInventory"); put("org.zstack.ai.entity.ModelServiceInventory", "org.zstack.sdk.ModelServiceInventory"); @@ -1066,6 +1067,7 @@ public class SourceClassMap { put("org.zstack.sdk.MirrorNetworkUsedIpInventory", "org.zstack.header.portMirror.MirrorNetworkUsedIpInventory"); put("org.zstack.sdk.ModelCenterInventory", "org.zstack.ai.entity.ModelCenterInventory"); put("org.zstack.sdk.ModelInventory", "org.zstack.ai.entity.ModelInventory"); + put("org.zstack.sdk.ModelServiceGroupDatasetRefInventory", "org.zstack.ai.entity.ModelServiceGroupDatasetRefInventory"); put("org.zstack.sdk.ModelServiceInstanceGroupInventory", "org.zstack.ai.entity.ModelServiceInstanceGroupInventory"); put("org.zstack.sdk.ModelServiceInstanceInventory", "org.zstack.ai.entity.ModelServiceInstanceInventory"); put("org.zstack.sdk.ModelServiceInventory", "org.zstack.ai.entity.ModelServiceInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java index c9c5017d958..6e487f4fae5 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java @@ -37,6 +37,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vmImageUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String primaryStorageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List datasetUuids; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String dockerImage; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceGroupDatasetRefInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceGroupDatasetRefInventory.java new file mode 100644 index 00000000000..aeb4b907767 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceGroupDatasetRefInventory.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + + + +public class ModelServiceGroupDatasetRefInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String datasetUuid; + public void setDatasetUuid(java.lang.String datasetUuid) { + this.datasetUuid = datasetUuid; + } + public java.lang.String getDatasetUuid() { + return this.datasetUuid; + } + + public java.lang.String modelServiceInstanceGroupUuid; + public void setModelServiceInstanceGroupUuid(java.lang.String modelServiceInstanceGroupUuid) { + this.modelServiceInstanceGroupUuid = modelServiceInstanceGroupUuid; + } + public java.lang.String getModelServiceInstanceGroupUuid() { + return this.modelServiceInstanceGroupUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java index 560271d8bf4..01a31273f55 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java @@ -36,6 +36,14 @@ public java.util.List getInstances() { return this.instances; } + public java.util.List datasetRefInventories; + public void setDatasetRefInventories(java.util.List datasetRefInventories) { + this.datasetRefInventories = datasetRefInventories; + } + public java.util.List getDatasetRefInventories() { + return this.datasetRefInventories; + } + public java.lang.String status; public void setStatus(java.lang.String status) { this.status = status; From 9d04cf7ababf3942602c014fee7e5b8b50294c57 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Thu, 1 Aug 2024 04:07:02 +0000 Subject: [PATCH 090/737] [sdk]: update sdk Change-Id: I72776a79686b7a7469797379737876796c74656b --- sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java | 2 +- sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index a497b7c19ad..911eb480e01 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -70,7 +70,7 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String zoneUuid; - @Param(required = false, validValues = {"Endpoint","FineTune"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"Endpoint","FineTune","App"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type = "Endpoint"; @Param(required = false, validValues = {"Other","Bentoml","HuggingFace"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java index 0b91cb4003d..8fa70924531 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java @@ -58,7 +58,7 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String pythonVersion; - @Param(required = false, validValues = {"Endpoint","FineTune"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"Endpoint","FineTune","App"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = false, validValues = {"Other","Bentoml","HuggingFace"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) From 9879d93f2f4e3e58ecae16fb3a3499135cee48d0 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 1 Aug 2024 17:29:22 +0800 Subject: [PATCH 091/737] [sdk]: update sdk Resolves: ZSTAC-66285 Change-Id: I7a70746263686c746d616176727472716e6c7476 --- .../main/java/org/zstack/sdk/GetOAuth2TokenResult.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/GetOAuth2TokenResult.java b/sdk/src/main/java/org/zstack/sdk/GetOAuth2TokenResult.java index 5f04dea83ad..e11cd917eb5 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetOAuth2TokenResult.java +++ b/sdk/src/main/java/org/zstack/sdk/GetOAuth2TokenResult.java @@ -20,4 +20,12 @@ public SSOServerTokenInventory getServerTokenInventory() { return this.serverTokenInventory; } + public java.util.Map additionalTokenInventory; + public void setAdditionalTokenInventory(java.util.Map additionalTokenInventory) { + this.additionalTokenInventory = additionalTokenInventory; + } + public java.util.Map getAdditionalTokenInventory() { + return this.additionalTokenInventory; + } + } From c8ec125559f3f27a6c5241e4149e64e88c859628 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Thu, 1 Aug 2024 20:42:06 +0800 Subject: [PATCH 092/737] [identoty]: fix extension point of update quota Resolves: ZSTAC-66285 Change-Id: I62716b727069766d6865626d6c6b78656475786b Signed-off-by: AlanJager --- identity/src/main/java/org/zstack/identity/AccountBase.java | 2 +- .../src/main/java/org/zstack/identity/QuotaExtensionPoint.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/identity/src/main/java/org/zstack/identity/AccountBase.java b/identity/src/main/java/org/zstack/identity/AccountBase.java index ea34cb45d5c..ca4d7c59ed0 100755 --- a/identity/src/main/java/org/zstack/identity/AccountBase.java +++ b/identity/src/main/java/org/zstack/identity/AccountBase.java @@ -444,7 +444,7 @@ private void handle(APIGetAccountQuotaUsageMsg msg) { private void handle(APIUpdateQuotaMsg msg) { for (QuotaExtensionPoint ext : pluginRgty.getExtensionList(QuotaExtensionPoint.class)) { - ext.beforeUpdateQuota(msg.getQuotaVO(), msg.getIdentityUuid()); + ext.beforeUpdateQuota(msg.getQuotaVO().getName(), msg.getValue(), msg.getIdentityUuid()); } QuotaVO quota = msg.getQuotaVO(); diff --git a/identity/src/main/java/org/zstack/identity/QuotaExtensionPoint.java b/identity/src/main/java/org/zstack/identity/QuotaExtensionPoint.java index d6d4657e4b2..b49a39ce967 100644 --- a/identity/src/main/java/org/zstack/identity/QuotaExtensionPoint.java +++ b/identity/src/main/java/org/zstack/identity/QuotaExtensionPoint.java @@ -3,5 +3,5 @@ import org.zstack.header.identity.QuotaVO; public interface QuotaExtensionPoint { - void beforeUpdateQuota(QuotaVO newQuotaVO, String accountUuid); + void beforeUpdateQuota(String quotaName, long newValue, String accountUuid); } From f72863603e62cad36592486ff227dbf926a9ed00 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Thu, 1 Aug 2024 08:13:44 +0000 Subject: [PATCH 093/737] [sdk]: update sdk to set modeluuid as optional Change-Id: I6965667077636f656869636b63626c6c72766a63 --- sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java index 6e487f4fae5..c9defef6a14 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java @@ -28,7 +28,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String modelUuid; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) From 75f96d3b34ba8b5e384a8d992fac5f9aada51390 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 2 Aug 2024 11:42:13 +0800 Subject: [PATCH 094/737] [conf]: support model service size update sdk DBImpact Resolves: ZSTAC-66285 Change-Id: I6f65696976726e796e706961757372777366746f Signed-off-by: AlanJager --- conf/db/upgrade/V5.1.8.1__schema.sql | 1 + .../main/java/org/zstack/sdk/ModelServiceInventory.java | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 6620e30cde8..c3b43a3ff9f 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -44,6 +44,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceVO` ( `framework` varchar(255) DEFAULT 'Other', `condaVersion` varchar(32) DEFAULT NULL, `dockerImage` varchar(255) DEFAULT NULL, + `size` bigint(20) DEFAULT 0, `gpuComputeCapability` varchar(32) DEFAULT NULL, `system` tinyint(1) DEFAULT 0, `modelCenterUuid` varchar(32) NOT NULL, diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java index e9fc74c29d4..f97487afd4d 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java @@ -84,6 +84,14 @@ public java.lang.String getDockerImage() { return this.dockerImage; } + public java.lang.Long size; + public void setSize(java.lang.Long size) { + this.size = size; + } + public java.lang.Long getSize() { + return this.size; + } + public java.lang.Boolean system; public void setSystem(java.lang.Boolean system) { this.system = system; From 7f247fb02d8edbdb830cf2e64b047ccc021d8a74 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Fri, 2 Aug 2024 08:29:30 +0000 Subject: [PATCH 095/737] [iam2]: Update sdk to support to query zaku image Change-Id: I6e6f6a64756c6d78646a62716a68766b6c6b7a6c --- sdk/src/main/java/SourceClassMap.java | 6 + .../container/ContainerImageInventory.java | 47 ++++++++ .../container/ContainerImageTagInventory.java | 63 +++++++++++ ...etIAM2ProjectContainerImageTagsAction.java | 107 ++++++++++++++++++ ...etIAM2ProjectContainerImageTagsResult.java | 14 +++ .../GetIAM2ProjectContainerImagesAction.java | 104 +++++++++++++++++ .../GetIAM2ProjectContainerImagesResult.java | 14 +++ .../GetIAM2ProjectRepositoryAction.java | 98 ++++++++++++++++ .../GetIAM2ProjectRepositoryResult.java | 14 +++ .../container/ProjectRepositoryInventory.java | 79 +++++++++++++ .../java/org/zstack/testlib/ApiHelper.groovy | 81 +++++++++++++ 11 files changed, 627 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerImageInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerImageTagInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectRepositoryAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectRepositoryResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/iam2/container/ProjectRepositoryInventory.java diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 7f6348489e1..e4b33d30183 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -400,6 +400,9 @@ public class SourceClassMap { put("org.zstack.iam2.api.Attribute", "org.zstack.sdk.iam2.api.Attribute"); put("org.zstack.iam2.api.ErrorResult", "org.zstack.sdk.iam2.api.ErrorResult"); put("org.zstack.iam2.container.ContainerClusterInventory", "org.zstack.sdk.iam2.container.ContainerClusterInventory"); + put("org.zstack.iam2.container.ContainerImageInventory", "org.zstack.sdk.iam2.container.ContainerImageInventory"); + put("org.zstack.iam2.container.ContainerImageTagInventory", "org.zstack.sdk.iam2.container.ContainerImageTagInventory"); + put("org.zstack.iam2.container.ProjectRepositoryInventory", "org.zstack.sdk.iam2.container.ProjectRepositoryInventory"); put("org.zstack.iam2.entity.AttributeType", "org.zstack.sdk.iam2.entity.AttributeType"); put("org.zstack.iam2.entity.IAM2AttributeInventory", "org.zstack.sdk.iam2.entity.IAM2AttributeInventory"); put("org.zstack.iam2.entity.IAM2OrganizationAttributeInventory", "org.zstack.sdk.iam2.entity.IAM2OrganizationAttributeInventory"); @@ -1399,6 +1402,9 @@ public class SourceClassMap { put("org.zstack.sdk.iam2.api.ErrorResult", "org.zstack.iam2.api.ErrorResult"); put("org.zstack.sdk.iam2.api.Permission", "org.zstack.iam2.api.APIGetIAM2VirtualIDAPIPermissionReply$Permission"); put("org.zstack.sdk.iam2.container.ContainerClusterInventory", "org.zstack.iam2.container.ContainerClusterInventory"); + put("org.zstack.sdk.iam2.container.ContainerImageInventory", "org.zstack.iam2.container.ContainerImageInventory"); + put("org.zstack.sdk.iam2.container.ContainerImageTagInventory", "org.zstack.iam2.container.ContainerImageTagInventory"); + put("org.zstack.sdk.iam2.container.ProjectRepositoryInventory", "org.zstack.iam2.container.ProjectRepositoryInventory"); put("org.zstack.sdk.iam2.entity.AttributeType", "org.zstack.iam2.entity.AttributeType"); put("org.zstack.sdk.iam2.entity.IAM2AttributeInventory", "org.zstack.iam2.entity.IAM2AttributeInventory"); put("org.zstack.sdk.iam2.entity.IAM2OrganizationAttributeInventory", "org.zstack.iam2.entity.IAM2OrganizationAttributeInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerImageInventory.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerImageInventory.java new file mode 100644 index 00000000000..68d21c35d51 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerImageInventory.java @@ -0,0 +1,47 @@ +package org.zstack.sdk.iam2.container; + + + +public class ContainerImageInventory { + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.Integer tagCount; + public void setTagCount(java.lang.Integer tagCount) { + this.tagCount = tagCount; + } + public java.lang.Integer getTagCount() { + return this.tagCount; + } + + public java.lang.Integer pullCount; + public void setPullCount(java.lang.Integer pullCount) { + this.pullCount = pullCount; + } + public java.lang.Integer getPullCount() { + return this.pullCount; + } + + public java.lang.String createTime; + public void setCreateTime(java.lang.String createTime) { + this.createTime = createTime; + } + public java.lang.String getCreateTime() { + return this.createTime; + } + + public java.lang.String updateTime; + public void setUpdateTime(java.lang.String updateTime) { + this.updateTime = updateTime; + } + public java.lang.String getUpdateTime() { + return this.updateTime; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerImageTagInventory.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerImageTagInventory.java new file mode 100644 index 00000000000..63df39efcdf --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerImageTagInventory.java @@ -0,0 +1,63 @@ +package org.zstack.sdk.iam2.container; + + + +public class ContainerImageTagInventory { + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.Integer size; + public void setSize(java.lang.Integer size) { + this.size = size; + } + public java.lang.Integer getSize() { + return this.size; + } + + public java.lang.String sizeStr; + public void setSizeStr(java.lang.String sizeStr) { + this.sizeStr = sizeStr; + } + public java.lang.String getSizeStr() { + return this.sizeStr; + } + + public java.lang.String digest; + public void setDigest(java.lang.String digest) { + this.digest = digest; + } + public java.lang.String getDigest() { + return this.digest; + } + + public java.lang.String createTime; + public void setCreateTime(java.lang.String createTime) { + this.createTime = createTime; + } + public java.lang.String getCreateTime() { + return this.createTime; + } + + public java.lang.String address; + public void setAddress(java.lang.String address) { + this.address = address; + } + public java.lang.String getAddress() { + return this.address; + } + + public java.lang.String pullCommand; + public void setPullCommand(java.lang.String pullCommand) { + this.pullCommand = pullCommand; + } + public java.lang.String getPullCommand() { + return this.pullCommand; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsAction.java new file mode 100644 index 00000000000..07f4dd84749 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk.iam2.container; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetIAM2ProjectContainerImageTagsAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.iam2.container.GetIAM2ProjectContainerImageTagsResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String projectId; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String repositoryId; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String imageName; + + @Param(required = false) + public java.lang.Integer limit = 1000; + + @Param(required = false) + public java.lang.Integer start = 0; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.iam2.container.GetIAM2ProjectContainerImageTagsResult value = res.getResult(org.zstack.sdk.iam2.container.GetIAM2ProjectContainerImageTagsResult.class); + ret.value = value == null ? new org.zstack.sdk.iam2.container.GetIAM2ProjectContainerImageTagsResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/iam2/project/{projectId}/repository/{repositoryId}/image/{imageName}/tag"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsResult.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsResult.java new file mode 100644 index 00000000000..7dcb3631887 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.iam2.container; + + + +public class GetIAM2ProjectContainerImageTagsResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesAction.java new file mode 100644 index 00000000000..8bd4638d381 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk.iam2.container; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetIAM2ProjectContainerImagesAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.iam2.container.GetIAM2ProjectContainerImagesResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String projectId; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String repositoryId; + + @Param(required = false) + public java.lang.Integer limit = 1000; + + @Param(required = false) + public java.lang.Integer start = 0; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.iam2.container.GetIAM2ProjectContainerImagesResult value = res.getResult(org.zstack.sdk.iam2.container.GetIAM2ProjectContainerImagesResult.class); + ret.value = value == null ? new org.zstack.sdk.iam2.container.GetIAM2ProjectContainerImagesResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/iam2/project/{projectId}/repository/{repositoryId}/image"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesResult.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesResult.java new file mode 100644 index 00000000000..d63ec0093ad --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.iam2.container; + + + +public class GetIAM2ProjectContainerImagesResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectRepositoryAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectRepositoryAction.java new file mode 100644 index 00000000000..cba3da80379 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectRepositoryAction.java @@ -0,0 +1,98 @@ +package org.zstack.sdk.iam2.container; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetIAM2ProjectRepositoryAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.iam2.container.GetIAM2ProjectRepositoryResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false) + public java.lang.Integer limit = 1000; + + @Param(required = false) + public java.lang.Integer start = 0; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.iam2.container.GetIAM2ProjectRepositoryResult value = res.getResult(org.zstack.sdk.iam2.container.GetIAM2ProjectRepositoryResult.class); + ret.value = value == null ? new org.zstack.sdk.iam2.container.GetIAM2ProjectRepositoryResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/iam2/projects/repositories"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectRepositoryResult.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectRepositoryResult.java new file mode 100644 index 00000000000..16bf045d036 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectRepositoryResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.iam2.container; + + + +public class GetIAM2ProjectRepositoryResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/ProjectRepositoryInventory.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/ProjectRepositoryInventory.java new file mode 100644 index 00000000000..77b1b7162ae --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/ProjectRepositoryInventory.java @@ -0,0 +1,79 @@ +package org.zstack.sdk.iam2.container; + + + +public class ProjectRepositoryInventory { + + public java.lang.Long zeProjectID; + public void setZeProjectID(java.lang.Long zeProjectID) { + this.zeProjectID = zeProjectID; + } + public java.lang.Long getZeProjectID() { + return this.zeProjectID; + } + + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.lang.Boolean readonly; + public void setReadonly(java.lang.Boolean readonly) { + this.readonly = readonly; + } + public java.lang.Boolean getReadonly() { + return this.readonly; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.Integer imageCount; + public void setImageCount(java.lang.Integer imageCount) { + this.imageCount = imageCount; + } + public java.lang.Integer getImageCount() { + return this.imageCount; + } + + public java.lang.Long ID; + public void setID(java.lang.Long ID) { + this.ID = ID; + } + public java.lang.Long getID() { + return this.ID; + } + + public java.lang.String desc; + public void setDesc(java.lang.String desc) { + this.desc = desc; + } + public java.lang.String getDesc() { + return this.desc; + } + + public java.lang.String createTime; + public void setCreateTime(java.lang.String createTime) { + this.createTime = createTime; + } + public java.lang.String getCreateTime() { + return this.createTime; + } + + public java.lang.Integer chartCount; + public void setChartCount(java.lang.Integer chartCount) { + this.chartCount = chartCount; + } + public java.lang.Integer getChartCount() { + return this.chartCount; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index c6c3224dd4e..8fe4bc533ea 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -47511,6 +47511,87 @@ abstract class ApiHelper { } + def getIAM2ProjectContainerImageTags(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.container.GetIAM2ProjectContainerImageTagsAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.container.GetIAM2ProjectContainerImageTagsAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def getIAM2ProjectContainerImages(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.container.GetIAM2ProjectContainerImagesAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.container.GetIAM2ProjectContainerImagesAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def getIAM2ProjectRepository(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.container.GetIAM2ProjectRepositoryAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.container.GetIAM2ProjectRepositoryAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def addPolicyStatementsToRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.AddPolicyStatementsToRoleAction.class) Closure c) { def a = new org.zstack.sdk.identity.role.api.AddPolicyStatementsToRoleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 7aadd097b046deb4c5a4a5b657c0292d58aeaf4c Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 2 Aug 2024 16:07:43 +0800 Subject: [PATCH 096/737] [build]: introduce proxy Resolves: ZSTAC-66285 Change-Id: I656e6e6169766f78646f666a62706b64636c7269 --- build/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/build/pom.xml b/build/pom.xml index ca57d16177d..100af6e0975 100755 --- a/build/pom.xml +++ b/build/pom.xml @@ -372,6 +372,11 @@ sanyuan ${project.version} + + org.zstack + proxy + ${project.version} + org.zstack zstack-ticket From b2ee2048e84f4e41b07b8008c93741c4eac6bc63 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 2 Aug 2024 17:22:29 +0800 Subject: [PATCH 097/737] [conf]: introduce proxy module update sql schema DBImpact Resolves: ZSTAC-66285 Change-Id: I6163637a6c726a68796c70696e79686d6b647a62 --- conf/db/upgrade/V5.1.8.1__schema.sql | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index c3b43a3ff9f..51cac52df17 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -147,3 +147,19 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceGroupDatasetRefVO` ( CONSTRAINT fkDatasetRefVO FOREIGN KEY (datasetUuid) REFERENCES DatasetVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE, CONSTRAINT fkModelServiceInstanceGroupVORefVO FOREIGN KEY (modelServiceInstanceGroupUuid) REFERENCES ModelServiceInstanceGroupVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`UserProxyConfigVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `proxyType` varchar(255) NULL, + `proxyHost` varchar(255) NULL, + `proxyPort` int NULL, + `proxyUsername` varchar(255) NULL, + `proxyPassword` varchar(255) NULL, + `isEnabled` boolean NULL, + `proxyProtocolVersion` varchar(255) NULL, + `useSsl` boolean NULL, + `noProxy` varchar(255) NULL, + `createDate` timestamp NULL, + `lastOpDate` timestamp NULL, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file From 19642dda139eafab3fe5e30c6b871a9a92204c82 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Sun, 4 Aug 2024 22:59:20 +0800 Subject: [PATCH 098/737] [sdk]: update sdk Resolves: ZSTAC-66285 Change-Id: I626f6f76706d74686b7872706c6d747766726d6d --- conf/db/upgrade/V5.1.8.1__schema.sql | 14 ++ sdk/src/main/java/SourceClassMap.java | 4 + .../zstack/sdk/AddProxyToResourceAction.java | 104 +++++++++++++ .../zstack/sdk/AddProxyToResourceResult.java | 14 ++ .../sdk/CreateUserProxyConfigAction.java | 131 +++++++++++++++++ .../sdk/CreateUserProxyConfigResult.java | 14 ++ .../sdk/DeleteUserProxyConfigAction.java | 101 +++++++++++++ .../sdk/DeleteUserProxyConfigResult.java | 7 + .../sdk/QueryUserProxyConfigAction.java | 75 ++++++++++ .../sdk/QueryUserProxyConfigResult.java | 22 +++ .../sdk/UpdateUserProxyConfigAction.java | 128 ++++++++++++++++ .../sdk/UpdateUserProxyConfigResult.java | 14 ++ .../zstack/sdk/UserProxyConfigInventory.java | 103 +++++++++++++ .../UserProxyConfigResourceRefInventory.java | 47 ++++++ .../java/org/zstack/testlib/ApiHelper.groovy | 137 ++++++++++++++++++ 15 files changed, 915 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/AddProxyToResourceAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/AddProxyToResourceResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateUserProxyConfigAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateUserProxyConfigResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteUserProxyConfigAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteUserProxyConfigResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryUserProxyConfigAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryUserProxyConfigResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateUserProxyConfigAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateUserProxyConfigResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UserProxyConfigInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UserProxyConfigResourceRefInventory.java diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 51cac52df17..06ab9a1f9da 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -162,4 +162,18 @@ CREATE TABLE IF NOT EXISTS `zstack`.`UserProxyConfigVO` ( `createDate` timestamp NULL, `lastOpDate` timestamp NULL, PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`UserProxyConfigResourceRefVO` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `resourceUuid` varchar(32) NOT NULL, + `proxyUuid` varchar(32) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + UNIQUE KEY `id` (`id`), + KEY `fkUserProxyConfigResourceRefVOResourceVO` (`resourceUuid`), + KEY `fkUserProxyConfigResourceRefVOUserProxyConfigVO` (`proxyUuid`), + CONSTRAINT `fUserProxyConfigResourceRefVO` FOREIGN KEY (`resourceUuid`) REFERENCES `ResourceVO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkUserProxyConfigResourceRefVO1` FOREIGN KEY (`proxyUuid`) REFERENCES `UserProxyConfigVO` (`uuid`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index e4b33d30183..cc7fa3d5f55 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -561,6 +561,8 @@ public class SourceClassMap { put("org.zstack.policyRoute.PolicyRouteTableInventory", "org.zstack.sdk.PolicyRouteTableInventory"); put("org.zstack.policyRoute.PolicyRouteTableRouteEntryInventory", "org.zstack.sdk.PolicyRouteTableRouteEntryInventory"); put("org.zstack.policyRoute.PolicyRouteTableVRouterRefInventory", "org.zstack.sdk.PolicyRouteTableVRouterRefInventory"); + put("org.zstack.proxy.UserProxyConfigInventory", "org.zstack.sdk.UserProxyConfigInventory"); + put("org.zstack.proxy.UserProxyConfigResourceRefInventory", "org.zstack.sdk.UserProxyConfigResourceRefInventory"); put("org.zstack.resourceconfig.APIGetResourceBindableConfigReply$ResourceBindableConfigStruct", "org.zstack.sdk.ResourceBindableConfigStruct"); put("org.zstack.resourceconfig.ResourceConfigInventory", "org.zstack.sdk.ResourceConfigInventory"); put("org.zstack.resourceconfig.ResourceConfigStruct", "org.zstack.sdk.ResourceConfigStruct"); @@ -1286,6 +1288,8 @@ public class SourceClassMap { put("org.zstack.sdk.UsedIpInventory", "org.zstack.header.network.l3.UsedIpInventory"); put("org.zstack.sdk.UserGroupInventory", "org.zstack.header.identity.UserGroupInventory"); put("org.zstack.sdk.UserInventory", "org.zstack.header.identity.UserInventory"); + put("org.zstack.sdk.UserProxyConfigInventory", "org.zstack.proxy.UserProxyConfigInventory"); + put("org.zstack.sdk.UserProxyConfigResourceRefInventory", "org.zstack.proxy.UserProxyConfigResourceRefInventory"); put("org.zstack.sdk.UserTagInventory", "org.zstack.header.tag.UserTagInventory"); put("org.zstack.sdk.V2VConversionHostInventory", "org.zstack.v2v.V2VConversionHostInventory"); put("org.zstack.sdk.VCenterBackupStorageInventory", "org.zstack.vmware.VCenterBackupStorageInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/AddProxyToResourceAction.java b/sdk/src/main/java/org/zstack/sdk/AddProxyToResourceAction.java new file mode 100644 index 00000000000..81fe1172958 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddProxyToResourceAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class AddProxyToResourceAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.AddProxyToResourceResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String proxyUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String resourceUuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.AddProxyToResourceResult value = res.getResult(org.zstack.sdk.AddProxyToResourceResult.class); + ret.value = value == null ? new org.zstack.sdk.AddProxyToResourceResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/proxy/{proxyUuid}/resource/{resourceUuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AddProxyToResourceResult.java b/sdk/src/main/java/org/zstack/sdk/AddProxyToResourceResult.java new file mode 100644 index 00000000000..f9953be3428 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddProxyToResourceResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.UserProxyConfigResourceRefInventory; + +public class AddProxyToResourceResult { + public UserProxyConfigResourceRefInventory inventory; + public void setInventory(UserProxyConfigResourceRefInventory inventory) { + this.inventory = inventory; + } + public UserProxyConfigResourceRefInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateUserProxyConfigAction.java b/sdk/src/main/java/org/zstack/sdk/CreateUserProxyConfigAction.java new file mode 100644 index 00000000000..bdebdbba383 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateUserProxyConfigAction.java @@ -0,0 +1,131 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateUserProxyConfigAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.CreateUserProxyConfigResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String proxyType; + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String proxyHost; + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer proxyPort; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String proxyUsername; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String proxyPassword; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean isEnabled; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String proxyProtocolVersion; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean useSsl; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String noProxy; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.CreateUserProxyConfigResult value = res.getResult(org.zstack.sdk.CreateUserProxyConfigResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateUserProxyConfigResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/user-proxy-configs"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateUserProxyConfigResult.java b/sdk/src/main/java/org/zstack/sdk/CreateUserProxyConfigResult.java new file mode 100644 index 00000000000..2ca36748694 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateUserProxyConfigResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.UserProxyConfigInventory; + +public class CreateUserProxyConfigResult { + public UserProxyConfigInventory inventory; + public void setInventory(UserProxyConfigInventory inventory) { + this.inventory = inventory; + } + public UserProxyConfigInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteUserProxyConfigAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteUserProxyConfigAction.java new file mode 100644 index 00000000000..1d3f4d29657 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteUserProxyConfigAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteUserProxyConfigAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeleteUserProxyConfigResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeleteUserProxyConfigResult value = res.getResult(org.zstack.sdk.DeleteUserProxyConfigResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteUserProxyConfigResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/user-proxy-configs/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteUserProxyConfigResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteUserProxyConfigResult.java new file mode 100644 index 00000000000..3408c80b6df --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteUserProxyConfigResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteUserProxyConfigResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryUserProxyConfigAction.java b/sdk/src/main/java/org/zstack/sdk/QueryUserProxyConfigAction.java new file mode 100644 index 00000000000..e53372d80e1 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryUserProxyConfigAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryUserProxyConfigAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryUserProxyConfigResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryUserProxyConfigResult value = res.getResult(org.zstack.sdk.QueryUserProxyConfigResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryUserProxyConfigResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/user-proxy-configs"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryUserProxyConfigResult.java b/sdk/src/main/java/org/zstack/sdk/QueryUserProxyConfigResult.java new file mode 100644 index 00000000000..7cae15cc6d0 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryUserProxyConfigResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryUserProxyConfigResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateUserProxyConfigAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateUserProxyConfigAction.java new file mode 100644 index 00000000000..a5fda8afd1a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateUserProxyConfigAction.java @@ -0,0 +1,128 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateUserProxyConfigAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UpdateUserProxyConfigResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String proxyType; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String proxyHost; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer proxyPort; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String proxyUsername; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String proxyPassword; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean isEnabled; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String proxyProtocolVersion; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean useSsl; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String noProxy; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UpdateUserProxyConfigResult value = res.getResult(org.zstack.sdk.UpdateUserProxyConfigResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateUserProxyConfigResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/user-proxy-configs/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateUserProxyConfig"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateUserProxyConfigResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateUserProxyConfigResult.java new file mode 100644 index 00000000000..4141aad8449 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateUserProxyConfigResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.UserProxyConfigInventory; + +public class UpdateUserProxyConfigResult { + public UserProxyConfigInventory inventory; + public void setInventory(UserProxyConfigInventory inventory) { + this.inventory = inventory; + } + public UserProxyConfigInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UserProxyConfigInventory.java b/sdk/src/main/java/org/zstack/sdk/UserProxyConfigInventory.java new file mode 100644 index 00000000000..91515dd171e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UserProxyConfigInventory.java @@ -0,0 +1,103 @@ +package org.zstack.sdk; + + + +public class UserProxyConfigInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String proxyType; + public void setProxyType(java.lang.String proxyType) { + this.proxyType = proxyType; + } + public java.lang.String getProxyType() { + return this.proxyType; + } + + public java.lang.String proxyHost; + public void setProxyHost(java.lang.String proxyHost) { + this.proxyHost = proxyHost; + } + public java.lang.String getProxyHost() { + return this.proxyHost; + } + + public java.lang.Integer proxyPort; + public void setProxyPort(java.lang.Integer proxyPort) { + this.proxyPort = proxyPort; + } + public java.lang.Integer getProxyPort() { + return this.proxyPort; + } + + public java.lang.String proxyUsername; + public void setProxyUsername(java.lang.String proxyUsername) { + this.proxyUsername = proxyUsername; + } + public java.lang.String getProxyUsername() { + return this.proxyUsername; + } + + public java.lang.String proxyPassword; + public void setProxyPassword(java.lang.String proxyPassword) { + this.proxyPassword = proxyPassword; + } + public java.lang.String getProxyPassword() { + return this.proxyPassword; + } + + public java.lang.Boolean isEnabled; + public void setIsEnabled(java.lang.Boolean isEnabled) { + this.isEnabled = isEnabled; + } + public java.lang.Boolean getIsEnabled() { + return this.isEnabled; + } + + public java.lang.String proxyProtocolVersion; + public void setProxyProtocolVersion(java.lang.String proxyProtocolVersion) { + this.proxyProtocolVersion = proxyProtocolVersion; + } + public java.lang.String getProxyProtocolVersion() { + return this.proxyProtocolVersion; + } + + public java.lang.Boolean useSsl; + public void setUseSsl(java.lang.Boolean useSsl) { + this.useSsl = useSsl; + } + public java.lang.Boolean getUseSsl() { + return this.useSsl; + } + + public java.lang.String noProxy; + public void setNoProxy(java.lang.String noProxy) { + this.noProxy = noProxy; + } + public java.lang.String getNoProxy() { + return this.noProxy; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UserProxyConfigResourceRefInventory.java b/sdk/src/main/java/org/zstack/sdk/UserProxyConfigResourceRefInventory.java new file mode 100644 index 00000000000..a6e548fc9f2 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UserProxyConfigResourceRefInventory.java @@ -0,0 +1,47 @@ +package org.zstack.sdk; + + + +public class UserProxyConfigResourceRefInventory { + + public java.lang.Long id; + public void setId(java.lang.Long id) { + this.id = id; + } + public java.lang.Long getId() { + return this.id; + } + + public java.lang.String resourceUuid; + public void setResourceUuid(java.lang.String resourceUuid) { + this.resourceUuid = resourceUuid; + } + public java.lang.String getResourceUuid() { + return this.resourceUuid; + } + + public java.lang.String proxyUuid; + public void setProxyUuid(java.lang.String proxyUuid) { + this.proxyUuid = proxyUuid; + } + public java.lang.String getProxyUuid() { + return this.proxyUuid; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 8fe4bc533ea..40d29f7fb14 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -2258,6 +2258,33 @@ abstract class ApiHelper { } + def addProxyToResource(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddProxyToResourceAction.class) Closure c) { + def a = new org.zstack.sdk.AddProxyToResourceAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def addRemoteCidrsToIPsecConnection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddRemoteCidrsToIPsecConnectionAction.class) Closure c) { def a = new org.zstack.sdk.AddRemoteCidrsToIPsecConnectionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -10925,6 +10952,33 @@ abstract class ApiHelper { } + def createUserProxyConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateUserProxyConfigAction.class) Closure c) { + def a = new org.zstack.sdk.CreateUserProxyConfigAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def createUserTag(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateUserTagAction.class) Closure c) { def a = new org.zstack.sdk.CreateUserTagAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -15947,6 +16001,33 @@ abstract class ApiHelper { } + def deleteUserProxyConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteUserProxyConfigAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteUserProxyConfigAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def deleteV2VConversionHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteV2VConversionHostAction.class) Closure c) { def a = new org.zstack.sdk.DeleteV2VConversionHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -32849,6 +32930,35 @@ abstract class ApiHelper { } + def queryUserProxyConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryUserProxyConfigAction.class) Closure c) { + def a = new org.zstack.sdk.QueryUserProxyConfigAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryUserTag(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryUserTagAction.class) Closure c) { def a = new org.zstack.sdk.QueryUserTagAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -43732,6 +43842,33 @@ abstract class ApiHelper { } + def updateUserProxyConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateUserProxyConfigAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateUserProxyConfigAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def updateV2VConversionHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateV2VConversionHostAction.class) Closure c) { def a = new org.zstack.sdk.UpdateV2VConversionHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 4457b72099c5791bbfe59747a141bc007fe69b0b Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Mon, 5 Aug 2024 23:04:48 +0800 Subject: [PATCH 099/737] [conf]: Update sdk to support save container network DBImpact Change-Id: I747a716b647964757466726870746a7270686d68 --- conf/db/upgrade/V5.1.8.1__schema.sql | 1 + .../main/java/org/zstack/sdk/AddModelCenterAction.java | 3 +++ .../main/java/org/zstack/sdk/ModelCenterInventory.java | 8 ++++++++ .../main/java/org/zstack/sdk/UpdateModelCenterAction.java | 3 +++ .../sdk/iam2/container/ContainerImageTagInventory.java | 6 +++--- .../sdk/iam2/container/ProjectRepositoryInventory.java | 6 +++--- 6 files changed, 21 insertions(+), 6 deletions(-) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 06ab9a1f9da..1948765bfab 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -9,6 +9,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelCenterVO` ( `storageNetworkUuid` varchar(32) DEFAULT NULL, `serviceNetworkUuid` varchar(32) DEFAULT NULL, `containerRegistry` varchar(2048) DEFAULT NULL, + `containerNetwork` varchar(2048) DEFAULT NULL, `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java index f5e0936d681..f78243fd9f3 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java @@ -52,6 +52,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String containerRegistry; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerNetwork; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java index 241b47c2618..e899757708e 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java @@ -84,6 +84,14 @@ public java.lang.String getContainerRegistry() { return this.containerRegistry; } + public java.lang.String containerNetwork; + public void setContainerNetwork(java.lang.String containerNetwork) { + this.containerNetwork = containerNetwork; + } + public java.lang.String getContainerNetwork() { + return this.containerNetwork; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java index 232ecefc07a..4d2dde9d6d6 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java @@ -49,6 +49,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String containerRegistry; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerNetwork; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerImageTagInventory.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerImageTagInventory.java index 63df39efcdf..d743b8f3048 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerImageTagInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerImageTagInventory.java @@ -12,11 +12,11 @@ public java.lang.String getName() { return this.name; } - public java.lang.Integer size; - public void setSize(java.lang.Integer size) { + public java.lang.Long size; + public void setSize(java.lang.Long size) { this.size = size; } - public java.lang.Integer getSize() { + public java.lang.Long getSize() { return this.size; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/ProjectRepositoryInventory.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/ProjectRepositoryInventory.java index 77b1b7162ae..31c765f4dde 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/container/ProjectRepositoryInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/ProjectRepositoryInventory.java @@ -4,11 +4,11 @@ public class ProjectRepositoryInventory { - public java.lang.Long zeProjectID; - public void setZeProjectID(java.lang.Long zeProjectID) { + public java.lang.Integer zeProjectID; + public void setZeProjectID(java.lang.Integer zeProjectID) { this.zeProjectID = zeProjectID; } - public java.lang.Long getZeProjectID() { + public java.lang.Integer getZeProjectID() { return this.zeProjectID; } From 2b75caeb7bc143b265ca0bc58a4c588d0cb63734 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Tue, 6 Aug 2024 09:36:53 +0800 Subject: [PATCH 100/737] [conf]: Allow modelUuid as null in ModelServiceInstanceGroupVO DBImpact Change-Id: I68796e757a7875787577766d726969666d70776b --- conf/db/upgrade/V5.1.8.1__schema.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 1948765bfab..56d5cdcd774 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -70,7 +70,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceRefVO` ( CREATE TABLE `zstack`.`ModelServiceInstanceGroupVO` ( `uuid` varchar(32) NOT NULL UNIQUE, `modelServiceUuid` varchar(32) DEFAULT NULL, - `modelUuid` varchar(32) NOT NULL, + `modelUuid` varchar(32) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `status` varchar(255) NOT NULL, `type` varchar(128) NOT NULL, From 192e5564265eea6cf26b20e5c240bd604484daf7 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Tue, 6 Aug 2024 11:26:07 +0800 Subject: [PATCH 101/737] [utls]: Fix signature uri issue Change-Id: I7a79756f70687861626f7965686a70786f7a6f6b --- .../src/main/java/org/zstack/utils/ak/AccessKeyUtils.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/utils/src/main/java/org/zstack/utils/ak/AccessKeyUtils.java b/utils/src/main/java/org/zstack/utils/ak/AccessKeyUtils.java index c2bbe5482d5..7851873e666 100644 --- a/utils/src/main/java/org/zstack/utils/ak/AccessKeyUtils.java +++ b/utils/src/main/java/org/zstack/utils/ak/AccessKeyUtils.java @@ -19,8 +19,11 @@ public static String generateDate() { return now.format(formatter); } - public static String generateAuthorization(String accessKeyId, String accessKeySecret, String method, String date, String uri) throws Exception { - String stringToSign = method + "\n" + date + "\n" + uri; + public static String generateAuthorization(String accessKeyId, String accessKeySecret, String method, String date, String uriString) throws Exception { + int questionMarkIndex = uriString.indexOf('?'); + String path = (questionMarkIndex != -1) ? uriString.substring(0, questionMarkIndex) : uriString; + + String stringToSign = method + "\n" + date + "\n" + path; SecretKeySpec signingKey = new SecretKeySpec(accessKeySecret.getBytes(StandardCharsets.UTF_8), "HmacSHA1"); Mac mac = Mac.getInstance("HmacSHA1"); From c07fac1e5b4b8fc098b4675948c168962a88609c Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 6 Aug 2024 01:18:36 +0800 Subject: [PATCH 102/737] [sdk]: update sdk Resolves: ZSTAC-66285 Change-Id: I717276786e787162646b6f6963646f616f687572 --- .../main/java/org/zstack/sdk/DeployModelServiceAction.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java index c9defef6a14..a3127519806 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java @@ -43,6 +43,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List datasetUuids; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelServiceGroupUuids; + + @Param(required = true, validValues = {"ModelEval","ModelService"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceType = "ModelService"; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String dockerImage; From 3f18ad817f98f880fa409d922d4ca58e8ecac067 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 6 Aug 2024 10:55:00 +0800 Subject: [PATCH 103/737] [conf]: introduce service refs to model servies update V5.1.8.1__schema.sql and sdk DBImpact Resolves: ZSTAC-66285 Change-Id: I746c7779646b736c696f636a6e72726674696766 Signed-off-by: AlanJager --- conf/db/upgrade/V5.1.8.1__schema.sql | 36 ++++ sdk/src/main/java/SourceClassMap.java | 2 + .../org/zstack/sdk/AddModelServiceAction.java | 2 +- .../sdk/DeployModelEvalServiceAction.java | 158 ++++++++++++++++++ .../sdk/DeployModelEvalServiceResult.java | 14 ++ .../zstack/sdk/DeployModelServiceAction.java | 3 - ...odelEvalServiceInstanceGroupInventory.java | 63 +++++++ .../ModelServiceInstanceGroupInventory.java | 8 + .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++ 9 files changed, 309 insertions(+), 4 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ModelEvalServiceInstanceGroupInventory.java diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 56d5cdcd774..e9286086011 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -73,6 +73,7 @@ CREATE TABLE `zstack`.`ModelServiceInstanceGroupVO` ( `modelUuid` varchar(32) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `status` varchar(255) NOT NULL, + `modelServiceType` varchar(62) NOT NULL, `type` varchar(128) NOT NULL, `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', @@ -149,6 +150,27 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceGroupDatasetRefVO` ( CONSTRAINT fkModelServiceInstanceGroupVORefVO FOREIGN KEY (modelServiceInstanceGroupUuid) REFERENCES ModelServiceInstanceGroupVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceGroupModelServiceRefVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `modelServiceInstanceGroupUuid` varchar(32) NOT NULL, + `dependModelServiceInstanceGroupUuid` varchar(32) NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT fkModelServiceGroupModelServiceRefVOModelServicePrimary FOREIGN KEY (dependModelServiceInstanceGroupUuid) REFERENCES ModelServiceInstanceGroupVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE, + CONSTRAINT fkModelServiceGroupModelServiceRefVOModelServiceDepend FOREIGN KEY (modelServiceInstanceGroupUuid) REFERENCES ModelServiceInstanceGroupVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelEvalServiceInstanceGroupVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `temperature` FLOAT NULL, + `topK` INT NULL, + `topP` FLOAT NULL, + `maxLength` INT NULL, + `maxNewTokens` INT NULL, + `repetitionPenalty` FLOAT NULL, + `limits` INT, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + CREATE TABLE IF NOT EXISTS `zstack`.`UserProxyConfigVO` ( `uuid` varchar(32) NOT NULL UNIQUE, `proxyType` varchar(255) NULL, @@ -177,4 +199,18 @@ CREATE TABLE IF NOT EXISTS `zstack`.`UserProxyConfigResourceRefVO` ( KEY `fkUserProxyConfigResourceRefVOUserProxyConfigVO` (`proxyUuid`), CONSTRAINT `fUserProxyConfigResourceRefVO` FOREIGN KEY (`resourceUuid`) REFERENCES `ResourceVO` (`uuid`) ON DELETE CASCADE, CONSTRAINT `fkUserProxyConfigResourceRefVO1` FOREIGN KEY (`proxyUuid`) REFERENCES `UserProxyConfigVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelEvaluationTaskVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) DEFAULT NULL, + `description` varchar(2048) DEFAULT NULL, + `percentage` int(3) DEFAULT 0, + `status` varchar(64) NOT NULL, + `modelServiceGroupUuid` varchar(32) NOT NULL, + `datasetUuid` varchar(32) NOT NULL, + `opaque` varchar(2048) DEFAULT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index cc7fa3d5f55..ce9d6b83e82 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -9,6 +9,7 @@ public class SourceClassMap { put("org.zstack.accessKey.AccessKeyState", "org.zstack.sdk.AccessKeyState"); put("org.zstack.ai.entity.DatasetInventory", "org.zstack.sdk.DatasetInventory"); put("org.zstack.ai.entity.ModelCenterInventory", "org.zstack.sdk.ModelCenterInventory"); + put("org.zstack.ai.entity.ModelEvalServiceInstanceGroupInventory", "org.zstack.sdk.ModelEvalServiceInstanceGroupInventory"); put("org.zstack.ai.entity.ModelInventory", "org.zstack.sdk.ModelInventory"); put("org.zstack.ai.entity.ModelServiceGroupDatasetRefInventory", "org.zstack.sdk.ModelServiceGroupDatasetRefInventory"); put("org.zstack.ai.entity.ModelServiceInstanceGroupInventory", "org.zstack.sdk.ModelServiceInstanceGroupInventory"); @@ -1071,6 +1072,7 @@ public class SourceClassMap { put("org.zstack.sdk.MiniStorageType", "org.zstack.storage.primary.ministorage.MiniStorageType"); put("org.zstack.sdk.MirrorNetworkUsedIpInventory", "org.zstack.header.portMirror.MirrorNetworkUsedIpInventory"); put("org.zstack.sdk.ModelCenterInventory", "org.zstack.ai.entity.ModelCenterInventory"); + put("org.zstack.sdk.ModelEvalServiceInstanceGroupInventory", "org.zstack.ai.entity.ModelEvalServiceInstanceGroupInventory"); put("org.zstack.sdk.ModelInventory", "org.zstack.ai.entity.ModelInventory"); put("org.zstack.sdk.ModelServiceGroupDatasetRefInventory", "org.zstack.ai.entity.ModelServiceGroupDatasetRefInventory"); put("org.zstack.sdk.ModelServiceInstanceGroupInventory", "org.zstack.ai.entity.ModelServiceInstanceGroupInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index 911eb480e01..ff1f2fbdcdf 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -70,7 +70,7 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String zoneUuid; - @Param(required = false, validValues = {"Endpoint","FineTune","App"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"Endpoint","FineTune","ModelEval","App"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type = "Endpoint"; @Param(required = false, validValues = {"Other","Bentoml","HuggingFace"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java new file mode 100644 index 00000000000..1ca77593a89 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java @@ -0,0 +1,158 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeployModelEvalServiceAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeployModelEvalServiceResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer limits; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Float temperature; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer topK; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Float topP; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer maxLength; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer maxNewTokens; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Float repetitionPenalty; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmImageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String primaryStorageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List datasetUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelServiceGroupUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String dockerImage; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer cpuNum; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = true, validValues = {"VirtualMachine","Container"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long memorySize; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List l3NetworkUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeployModelEvalServiceResult value = res.getResult(org.zstack.sdk.DeployModelEvalServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.DeployModelEvalServiceResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/ai/model-services/eval/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "deployModelEvalService"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceResult.java b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceResult.java new file mode 100644 index 00000000000..cbab70aa52f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelEvalServiceInstanceGroupInventory; + +public class DeployModelEvalServiceResult { + public ModelEvalServiceInstanceGroupInventory inventory; + public void setInventory(ModelEvalServiceInstanceGroupInventory inventory) { + this.inventory = inventory; + } + public ModelEvalServiceInstanceGroupInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java index a3127519806..a93be545b10 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java @@ -46,9 +46,6 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List modelServiceGroupUuids; - @Param(required = true, validValues = {"ModelEval","ModelService"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String serviceType = "ModelService"; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String dockerImage; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelEvalServiceInstanceGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelEvalServiceInstanceGroupInventory.java new file mode 100644 index 00000000000..1ac865f4c6e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelEvalServiceInstanceGroupInventory.java @@ -0,0 +1,63 @@ +package org.zstack.sdk; + + + +public class ModelEvalServiceInstanceGroupInventory extends org.zstack.sdk.ModelServiceInstanceGroupInventory { + + public java.lang.Integer limits; + public void setLimits(java.lang.Integer limits) { + this.limits = limits; + } + public java.lang.Integer getLimits() { + return this.limits; + } + + public java.lang.Float temperature; + public void setTemperature(java.lang.Float temperature) { + this.temperature = temperature; + } + public java.lang.Float getTemperature() { + return this.temperature; + } + + public java.lang.Integer topK; + public void setTopK(java.lang.Integer topK) { + this.topK = topK; + } + public java.lang.Integer getTopK() { + return this.topK; + } + + public java.lang.Float topP; + public void setTopP(java.lang.Float topP) { + this.topP = topP; + } + public java.lang.Float getTopP() { + return this.topP; + } + + public java.lang.Integer maxLength; + public void setMaxLength(java.lang.Integer maxLength) { + this.maxLength = maxLength; + } + public java.lang.Integer getMaxLength() { + return this.maxLength; + } + + public java.lang.Integer maxNewTokens; + public void setMaxNewTokens(java.lang.Integer maxNewTokens) { + this.maxNewTokens = maxNewTokens; + } + public java.lang.Integer getMaxNewTokens() { + return this.maxNewTokens; + } + + public java.lang.Float repetitionPenalty; + public void setRepetitionPenalty(java.lang.Float repetitionPenalty) { + this.repetitionPenalty = repetitionPenalty; + } + public java.lang.Float getRepetitionPenalty() { + return this.repetitionPenalty; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java index 01a31273f55..b222f886986 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java @@ -52,6 +52,14 @@ public java.lang.String getStatus() { return this.status; } + public java.lang.String modelServiceType; + public void setModelServiceType(java.lang.String modelServiceType) { + this.modelServiceType = modelServiceType; + } + public java.lang.String getModelServiceType() { + return this.modelServiceType; + } + public java.lang.String type; public void setType(java.lang.String type) { this.type = type; diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 40d29f7fb14..0cb260603c4 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -17054,6 +17054,33 @@ abstract class ApiHelper { } + def deployModelEvalService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeployModelEvalServiceAction.class) Closure c) { + def a = new org.zstack.sdk.DeployModelEvalServiceAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def deployModelService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeployModelServiceAction.class) Closure c) { def a = new org.zstack.sdk.DeployModelServiceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From af6676c1ea887669928832ce2428addd197b0fa0 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Wed, 7 Aug 2024 05:27:18 +0000 Subject: [PATCH 104/737] [iam2]: Update sdk to support get zaku image total number Change-Id: I7a6a67666f67616a7376706b6574727065667274 --- .../container/GetIAM2ProjectContainerImageTagsResult.java | 8 ++++++++ .../container/GetIAM2ProjectContainerImagesResult.java | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsResult.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsResult.java index 7dcb3631887..d3860dd50ad 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsResult.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsResult.java @@ -11,4 +11,12 @@ public java.util.List getInventories() { return this.inventories; } + public java.lang.Integer total; + public void setTotal(java.lang.Integer total) { + this.total = total; + } + public java.lang.Integer getTotal() { + return this.total; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesResult.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesResult.java index d63ec0093ad..4ac2bd8c566 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesResult.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesResult.java @@ -11,4 +11,12 @@ public java.util.List getInventories() { return this.inventories; } + public java.lang.Integer total; + public void setTotal(java.lang.Integer total) { + this.total = total; + } + public java.lang.Integer getTotal() { + return this.total; + } + } From aaa6161cee76a7cdb3df04f4a70b558766e58f01 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 31 Oct 2024 22:22:14 +0900 Subject: [PATCH 105/737] [externalservice]: marketplace Resolves: ZHCI-2514 Change-Id: I6773796b76736d6b64777a786c787a787a637371 (cherry picked from commit 4b82f3f99ab36c4305056d86747c839bc0c7282f) (cherry picked from commit 35b0fbfebd7d86bc59fd3433afe15e8e06b1906a) --- .../src/main/java/org/zstack/compute/vm/VmSystemTags.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java b/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java index 9a5c90b115c..1308a6cfe1d 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java @@ -246,6 +246,12 @@ public class VmSystemTags { MARKET_PLACE_TOKEN, VmInstanceVO.class ); + public static final String MARKET_PLACE_TOKEN = "marketplace::true"; + + public static PatternedSystemTag CREATED_BY_MARKETPLACE = new PatternedSystemTag( + MARKET_PLACE_TOKEN, VmInstanceVO.class + ); + public static class UserdataTagOutputHandler implements SensitiveTagOutputHandler { private final String chpasswd = "chpasswd"; private final String list = "list"; From 7389ce591f1b5bafd2fce359f7ec75301c916122 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Wed, 7 Aug 2024 14:23:49 +0000 Subject: [PATCH 106/737] [sdk]: Updata sdk to support update modelcenter Change-Id: I7662756a6e796e716c677579766a656d7a6e7769 --- .../main/java/org/zstack/sdk/UpdateModelCenterAction.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java index 4d2dde9d6d6..53205462c03 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java @@ -40,6 +40,12 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String parameters; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String managementIp; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer managementPort; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String storageNetworkUuid; From 9296356687014bfe65ab65f34bf73f1c95637176 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 8 Aug 2024 10:16:36 +0800 Subject: [PATCH 107/737] [testlib]: fix CodeGenerator Resolves: ZSTAC-66285 Change-Id: I656777656871796d7170756275646b656c76657a --- .../zstack/testlib/tool/CodeGenerator.groovy | 55 +++++++++++++++++-- 1 file changed, 50 insertions(+), 5 deletions(-) diff --git a/testlib/src/main/java/org/zstack/testlib/tool/CodeGenerator.groovy b/testlib/src/main/java/org/zstack/testlib/tool/CodeGenerator.groovy index 049487a4eb8..02833fe6480 100644 --- a/testlib/src/main/java/org/zstack/testlib/tool/CodeGenerator.groovy +++ b/testlib/src/main/java/org/zstack/testlib/tool/CodeGenerator.groovy @@ -23,6 +23,7 @@ class CodeGenerator { private static String LOWER_CASE_RESOURCE_NAME = "LOWER_CASE_RESOURCE_NAME" private static String PRIVATE_FIELDS = "PRIVATE_FIELDS" private static String GETTER_SETTER = "GETTER_SETTER" + private static String INVENTORY_CONSTRUCTOR = "INVENTORY_CONSTRUCTOR" private static String IMPORT_PACKAGE = "IMPORT_PACKAGE" private static String INVENTORY_NAME = "INVENTORY_NAME" private static String ENTITY_CLASS = "ENTITY_CLASS" @@ -62,7 +63,7 @@ class CodeGenerator { PojoField pojoField = new PojoField() pojoField.fieldName = field.getName() pojoField.fieldType = getJavaTypeFromFieldType(field.getType()) - pojoField.columnName = convert(field.getType()) + pojoField.columnName = convert(pojoField.fieldName, field.getType()) pojoField.field = field pojoFields.add(pojoField) } @@ -77,6 +78,12 @@ class CodeGenerator { return String.format("import %s;", packageName) } + private static String generateInventoryConstructor(PojoField field) { + String methodName = field.fieldName.substring(0, 1).toUpperCase() + field.fieldName.substring(1) + String getterName = String.format("get%s", methodName) + return String.format(" this.%s = vo.%s();", field.fieldName, getterName) + } + private static String generateGetterAndSetter(PojoField field) { String methodName = field.fieldName.substring(0, 1).toUpperCase() + field.fieldName.substring(1) String getterName = String.format("get%s", methodName) @@ -119,6 +126,9 @@ class CodeGenerator { // fields for rest api and inventory List gettersAndSetters = new ArrayList<>() + + // constructor from vo for inventory + List constructorOfFieldsFromVO = new ArrayList<>() } private static PojoClass createInventory(List fields, Class entityClass) { @@ -135,6 +145,7 @@ class CodeGenerator { " public void setUuid(String uuid) {\n" + " this.uuid = uuid;\n" + " }") + pojoClass.constructorOfFieldsFromVO.add(" this.uuid = vo.getUuid();") } pojoClass.importPackages.add("import java.io.Serializable;") @@ -148,6 +159,7 @@ class CodeGenerator { pojoClass.importPackages.add(generateImportPackage(field.field.getClass().getCanonicalName())) } pojoClass.gettersAndSetters.add(generateGetterAndSetter(field)) + pojoClass.constructorOfFieldsFromVO.add(generateInventoryConstructor(field)) pojoClass.privateFields.add(String.format(" private %s %s;", field.fieldType, field.fieldName)) } @@ -166,6 +178,7 @@ class CodeGenerator { bindings.put(IMPORT_PACKAGE, pojoClass.importPackages.join("\n")) bindings.put(INVENTORY_NAME, pojoClass.inventoryClassName) bindings.put(ENTITY_CLASS, entityClass.getSimpleName()) + bindings.put(INVENTORY_CONSTRUCTOR, pojoClass.constructorOfFieldsFromVO.join("\n")) writeToFile(String.format("%s.java", pojoClass.inventoryClassName), StringTemplateUtils.createStringFromTemplate(INVENTORY_TEMPLATE, bindings)) @@ -188,11 +201,17 @@ class CodeGenerator { } } - private static String convert(Class fieldType) { + private static String convert(String fieldName, Class fieldType) { String javaType = getJavaTypeFromFieldType(fieldType) if (javaType == "String") { - return "varchar(255)" + if (fieldName.toLowerCase().contains("uuid")) { + return "varchar(32)" + } else if (fieldName.toLowerCase().contains("description")) { + return "varchar(2048)" + } else { + return "varchar(255)" + } } else if (javaType == "Integer" || javaType == "int") { return "int" } else if (javaType == "Long" || javaType == "long") { @@ -249,7 +268,7 @@ class CodeGenerator { ColumnDefinition columnDefinition = new ColumnDefinition() columnDefinition.columnName = columnName - columnDefinition.columnType = convert(field.getType()) + columnDefinition.columnType = convert(columnName, field.getType()) columnDefinition.isPrimaryKey = isPrimaryKey columnDefinition.needIndex = needIndex columnDefinitions.add(columnDefinition) @@ -453,7 +472,6 @@ import java.util.List; @RestResponse(allTo = "inventories") public class APIQuery${RESOURCE_NAME}Reply extends APIQueryReply { - private List<${RESOURCE_NAME}Inventory> inventories; public List<${RESOURCE_NAME}Inventory> getInventories() { @@ -626,6 +644,14 @@ public class APIDelete${RESOURCE_NAME}Msg extends APIMessage { @APIParam(resourceType = ${RESOURCE_NAME}VO.class, checkAccount = true, operationTarget = true) private String uuid; + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + public static APIDelete${RESOURCE_NAME}Msg __example__() { APIDelete${RESOURCE_NAME}Msg msg = new APIDelete${RESOURCE_NAME}Msg(); msg.setUuid(uuid()); @@ -667,6 +693,25 @@ public class ${INVENTORY_NAME} implements Serializable, Cloneable { ${PRIVATE_FIELDS} ${GETTER_SETTER} + + public ${INVENTORY_NAME}() {} + + public ${INVENTORY_NAME}(${ENTITY_CLASS} vo) { +${INVENTORY_CONSTRUCTOR} + } + + public static ${INVENTORY_NAME} valueOf(${ENTITY_CLASS} vo) { + return new ${INVENTORY_NAME}(vo); + } + + public static List<${INVENTORY_NAME}> valueOf(Collection<${ENTITY_CLASS}> vos) { + List<${INVENTORY_NAME}> invs = new ArrayList<>(); + for (${ENTITY_CLASS} vo : vos) { + invs.add(valueOf(vo)); + } + + return invs; + } } ''' From 7e56f047b8390ec7eec174b4ef98fac8925380da Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 8 Aug 2024 11:04:40 +0800 Subject: [PATCH 108/737] [sdk]: update sdk Resolves: ZSTAC-66285 Change-Id: I66766d7769647874687274757a78626d71746972 --- sdk/src/main/java/SourceClassMap.java | 2 + .../sdk/DeleteModelEvaluationTaskAction.java | 101 ++++++++++++++++++ .../sdk/DeleteModelEvaluationTaskResult.java | 7 ++ .../sdk/DeployModelEvalServiceAction.java | 15 +-- .../zstack/sdk/DeployModelServiceAction.java | 3 + .../sdk/ModelEvaluationTaskInventory.java | 87 +++++++++++++++ ...ryModelEvalServiceInstanceGroupAction.java | 75 +++++++++++++ ...ryModelEvalServiceInstanceGroupResult.java | 22 ++++ .../sdk/QueryModelEvaluationTaskAction.java | 75 +++++++++++++ .../sdk/QueryModelEvaluationTaskResult.java | 22 ++++ .../zstack/sdk/UpdateModelServiceAction.java | 2 +- 11 files changed, 404 insertions(+), 7 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTaskAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTaskResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryModelEvalServiceInstanceGroupAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryModelEvalServiceInstanceGroupResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryModelEvaluationTaskAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryModelEvaluationTaskResult.java diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index ce9d6b83e82..5530e1f9be5 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -10,6 +10,7 @@ public class SourceClassMap { put("org.zstack.ai.entity.DatasetInventory", "org.zstack.sdk.DatasetInventory"); put("org.zstack.ai.entity.ModelCenterInventory", "org.zstack.sdk.ModelCenterInventory"); put("org.zstack.ai.entity.ModelEvalServiceInstanceGroupInventory", "org.zstack.sdk.ModelEvalServiceInstanceGroupInventory"); + put("org.zstack.ai.entity.ModelEvaluationTaskInventory", "org.zstack.sdk.ModelEvaluationTaskInventory"); put("org.zstack.ai.entity.ModelInventory", "org.zstack.sdk.ModelInventory"); put("org.zstack.ai.entity.ModelServiceGroupDatasetRefInventory", "org.zstack.sdk.ModelServiceGroupDatasetRefInventory"); put("org.zstack.ai.entity.ModelServiceInstanceGroupInventory", "org.zstack.sdk.ModelServiceInstanceGroupInventory"); @@ -1073,6 +1074,7 @@ public class SourceClassMap { put("org.zstack.sdk.MirrorNetworkUsedIpInventory", "org.zstack.header.portMirror.MirrorNetworkUsedIpInventory"); put("org.zstack.sdk.ModelCenterInventory", "org.zstack.ai.entity.ModelCenterInventory"); put("org.zstack.sdk.ModelEvalServiceInstanceGroupInventory", "org.zstack.ai.entity.ModelEvalServiceInstanceGroupInventory"); + put("org.zstack.sdk.ModelEvaluationTaskInventory", "org.zstack.ai.entity.ModelEvaluationTaskInventory"); put("org.zstack.sdk.ModelInventory", "org.zstack.ai.entity.ModelInventory"); put("org.zstack.sdk.ModelServiceGroupDatasetRefInventory", "org.zstack.ai.entity.ModelServiceGroupDatasetRefInventory"); put("org.zstack.sdk.ModelServiceInstanceGroupInventory", "org.zstack.ai.entity.ModelServiceInstanceGroupInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTaskAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTaskAction.java new file mode 100644 index 00000000000..bc292a0fbce --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTaskAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteModelEvaluationTaskAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeleteModelEvaluationTaskResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeleteModelEvaluationTaskResult value = res.getResult(org.zstack.sdk.DeleteModelEvaluationTaskResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteModelEvaluationTaskResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/model-evaluation-tasks/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTaskResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTaskResult.java new file mode 100644 index 00000000000..8f3eac1a71a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTaskResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteModelEvaluationTaskResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java index 1ca77593a89..27c6e76122f 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java @@ -28,27 +28,30 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer limits; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Float temperature; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer topK; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Float topP; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer maxLength; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer maxNewTokens; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Float repetitionPenalty; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String modelUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java index a93be545b10..d8fb2c974b0 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java @@ -28,6 +28,9 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String modelUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java new file mode 100644 index 00000000000..0f0cd127d81 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java @@ -0,0 +1,87 @@ +package org.zstack.sdk; + + + +public class ModelEvaluationTaskInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public int percentage; + public void setPercentage(int percentage) { + this.percentage = percentage; + } + public int getPercentage() { + return this.percentage; + } + + public java.lang.String opaque; + public void setOpaque(java.lang.String opaque) { + this.opaque = opaque; + } + public java.lang.String getOpaque() { + return this.opaque; + } + + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + + public java.lang.String modelServiceGroupUuid; + public void setModelServiceGroupUuid(java.lang.String modelServiceGroupUuid) { + this.modelServiceGroupUuid = modelServiceGroupUuid; + } + public java.lang.String getModelServiceGroupUuid() { + return this.modelServiceGroupUuid; + } + + public java.lang.String datasetUuid; + public void setDatasetUuid(java.lang.String datasetUuid) { + this.datasetUuid = datasetUuid; + } + public java.lang.String getDatasetUuid() { + return this.datasetUuid; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelEvalServiceInstanceGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryModelEvalServiceInstanceGroupAction.java new file mode 100644 index 00000000000..303ffd940e9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelEvalServiceInstanceGroupAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryModelEvalServiceInstanceGroupAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryModelServiceInstanceGroupResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryModelServiceInstanceGroupResult value = res.getResult(org.zstack.sdk.QueryModelServiceInstanceGroupResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryModelServiceInstanceGroupResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/ai/model-eval-services/instances/groups/"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelEvalServiceInstanceGroupResult.java b/sdk/src/main/java/org/zstack/sdk/QueryModelEvalServiceInstanceGroupResult.java new file mode 100644 index 00000000000..aa64249c0fd --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelEvalServiceInstanceGroupResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryModelEvalServiceInstanceGroupResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelEvaluationTaskAction.java b/sdk/src/main/java/org/zstack/sdk/QueryModelEvaluationTaskAction.java new file mode 100644 index 00000000000..54aca235a7d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelEvaluationTaskAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryModelEvaluationTaskAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryModelEvaluationTaskResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryModelEvaluationTaskResult value = res.getResult(org.zstack.sdk.QueryModelEvaluationTaskResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryModelEvaluationTaskResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/model-evaluation-tasks"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelEvaluationTaskResult.java b/sdk/src/main/java/org/zstack/sdk/QueryModelEvaluationTaskResult.java new file mode 100644 index 00000000000..c0f09c14817 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelEvaluationTaskResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryModelEvaluationTaskResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java index 8fa70924531..fe7f42fab6e 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java @@ -58,7 +58,7 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String pythonVersion; - @Param(required = false, validValues = {"Endpoint","FineTune","App"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"Endpoint","FineTune","App","ModelEval"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = false, validValues = {"Other","Bentoml","HuggingFace"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) From ac58f7202b9a2ae0d6a2992de75892b607adf163 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 8 Aug 2024 11:08:53 +0800 Subject: [PATCH 109/737] [testlib]: update api helper Resolves: ZSTAC-66285 Change-Id: I656c6570797a64636164716867746e657a627065 --- .../java/org/zstack/testlib/ApiHelper.groovy | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 0cb260603c4..917e4628127 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -14759,6 +14759,33 @@ abstract class ApiHelper { } + def deleteModelEvaluationTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelEvaluationTaskAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteModelEvaluationTaskAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def deleteModelService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelServiceAction.class) Closure c) { def a = new org.zstack.sdk.DeleteModelServiceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -30985,6 +31012,64 @@ abstract class ApiHelper { } + def queryModelEvalServiceInstanceGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryModelEvalServiceInstanceGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryModelEvalServiceInstanceGroupAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def queryModelEvaluationTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryModelEvaluationTaskAction.class) Closure c) { + def a = new org.zstack.sdk.QueryModelEvaluationTaskAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryModelService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryModelServiceAction.class) Closure c) { def a = new org.zstack.sdk.QueryModelServiceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 94dc523cddb6733552dc5466db57ffabc35a4305 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Thu, 8 Aug 2024 23:43:59 +0800 Subject: [PATCH 110/737] [conf]: Add new table to save trained model record DBImpact Change-Id: I677871696b6e6e666a636f7574777a766d777573 --- conf/db/upgrade/V5.1.8.1__schema.sql | 12 ++- sdk/src/main/java/SourceClassMap.java | 2 + .../sdk/QueryTrainedModelRecordAction.java | 75 +++++++++++++++++++ .../sdk/QueryTrainedModelRecordResult.java | 22 ++++++ .../sdk/TrainedModelRecordInventory.java | 55 ++++++++++++++ .../java/org/zstack/testlib/ApiHelper.groovy | 29 +++++++ 6 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryTrainedModelRecordAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryTrainedModelRecordResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/TrainedModelRecordInventory.java diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index e9286086011..c0b25d228cc 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -213,4 +213,14 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelEvaluationTaskVO` ( `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`TrainedModelRecordVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `modelUuid` varchar(32) NOT NULL, + `modelServiceInstanceGroupUuid` varchar(32) NOT NULL, + `datasetUuid` varchar(32) DEFAULT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 5530e1f9be5..2ee275d2fdd 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -17,6 +17,7 @@ public class SourceClassMap { put("org.zstack.ai.entity.ModelServiceInstanceInventory", "org.zstack.sdk.ModelServiceInstanceInventory"); put("org.zstack.ai.entity.ModelServiceInventory", "org.zstack.sdk.ModelServiceInventory"); put("org.zstack.ai.entity.ModelServiceRefInventory", "org.zstack.sdk.ModelServiceRefInventory"); + put("org.zstack.ai.entity.TrainedModelRecordInventory", "org.zstack.sdk.TrainedModelRecordInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessGroupInventory", "org.zstack.sdk.AliyunNasAccessGroupInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessRuleInventory", "org.zstack.sdk.AliyunNasAccessRuleInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasFileSystemInventory", "org.zstack.sdk.AliyunNasFileSystemInventory"); @@ -1280,6 +1281,7 @@ public class SourceClassMap { put("org.zstack.sdk.TaskProgressInventory", "org.zstack.header.core.progress.TaskProgressInventory"); put("org.zstack.sdk.TemplateConfigInventory", "org.zstack.templateConfig.TemplateConfigInventory"); put("org.zstack.sdk.Threshold", "org.zstack.drs.api.Threshold"); + put("org.zstack.sdk.TrainedModelRecordInventory", "org.zstack.ai.entity.TrainedModelRecordInventory"); put("org.zstack.sdk.TrashCleanupResult", "org.zstack.header.core.trash.TrashCleanupResult"); put("org.zstack.sdk.TwoFactorAuthenticationInventory", "org.zstack.twoFactorAuthentication.TwoFactorAuthenticationInventory"); put("org.zstack.sdk.TwoFactorAuthenticationSecretInventory", "org.zstack.twoFactorAuthentication.TwoFactorAuthenticationSecretInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/QueryTrainedModelRecordAction.java b/sdk/src/main/java/org/zstack/sdk/QueryTrainedModelRecordAction.java new file mode 100644 index 00000000000..97c03cc82c5 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryTrainedModelRecordAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryTrainedModelRecordAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryTrainedModelRecordResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryTrainedModelRecordResult value = res.getResult(org.zstack.sdk.QueryTrainedModelRecordResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryTrainedModelRecordResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/ai/trained-model/records"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryTrainedModelRecordResult.java b/sdk/src/main/java/org/zstack/sdk/QueryTrainedModelRecordResult.java new file mode 100644 index 00000000000..6e742e426b7 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryTrainedModelRecordResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryTrainedModelRecordResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/TrainedModelRecordInventory.java b/sdk/src/main/java/org/zstack/sdk/TrainedModelRecordInventory.java new file mode 100644 index 00000000000..60f6e924e95 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/TrainedModelRecordInventory.java @@ -0,0 +1,55 @@ +package org.zstack.sdk; + + + +public class TrainedModelRecordInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String modelUuid; + public void setModelUuid(java.lang.String modelUuid) { + this.modelUuid = modelUuid; + } + public java.lang.String getModelUuid() { + return this.modelUuid; + } + + public java.lang.String modelServiceInstanceGroupUuid; + public void setModelServiceInstanceGroupUuid(java.lang.String modelServiceInstanceGroupUuid) { + this.modelServiceInstanceGroupUuid = modelServiceInstanceGroupUuid; + } + public java.lang.String getModelServiceInstanceGroupUuid() { + return this.modelServiceInstanceGroupUuid; + } + + public java.lang.String datasetUuid; + public void setDatasetUuid(java.lang.String datasetUuid) { + this.datasetUuid = datasetUuid; + } + public java.lang.String getDatasetUuid() { + return this.datasetUuid; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 917e4628127..e697c47bd83 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -32926,6 +32926,35 @@ abstract class ApiHelper { } + def queryTrainedModelRecord(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryTrainedModelRecordAction.class) Closure c) { + def a = new org.zstack.sdk.QueryTrainedModelRecordAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryTwoFactorAuthentication(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryTwoFactorAuthenticationAction.class) Closure c) { def a = new org.zstack.sdk.QueryTwoFactorAuthenticationAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From f6890067cfde8291d089bb43d02e907155d932e2 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 9 Aug 2024 15:43:10 +0800 Subject: [PATCH 111/737] [sdk]: update create dataset sdk Resolves: ZSTAC-66285 Change-Id: I716766717873616771696e6975697a72766b6963 --- sdk/src/main/java/org/zstack/sdk/CreateDatasetAction.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateDatasetAction.java b/sdk/src/main/java/org/zstack/sdk/CreateDatasetAction.java index e8ab749a9d8..ed68a36aebd 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateDatasetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateDatasetAction.java @@ -37,6 +37,9 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String modelCenterUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String token; + @Param(required = false) public java.lang.String resourceUuid; From 7ac1f58d175d620002d52da2ac7d2b07da249739 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 9 Aug 2024 18:28:04 +0800 Subject: [PATCH 112/737] [longjob]: if submit long job failed skip cast reply Resolves: ZSTAC-68574 Change-Id: I74636e6b72787270786e636a677a6b7276686d77 --- .../java/org/zstack/longjob/LongJobManagerImpl.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java b/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java index 1752bdf16e1..a755a0b9270 100755 --- a/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java +++ b/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java @@ -476,9 +476,14 @@ private void handle(APISubmitLongJobMsg msg) { bus.send(smsg, new CloudBusCallBack(msg) { @Override public void run(MessageReply rly) { - SubmitLongJobReply reply = rly.castReply(); - evt.setInventory(reply.getInventory()); - evt.setNeedAudit(reply.isNeedAudit()); + if (rly.isSuccess()) { + SubmitLongJobReply reply = rly.castReply(); + evt.setInventory(reply.getInventory()); + evt.setNeedAudit(reply.isNeedAudit()); + } else { + evt.setError(rly.getError()); + } + bus.publish(evt); } }); From a7762c24dd77f19653f2940e5232c73f25e80370 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 12 Aug 2024 11:04:28 +0800 Subject: [PATCH 113/737] [conf]: add new column to schema DBImpact Resolves: ZSTAC-66285 Change-Id: I646f616c75737a7974787a6762627463796b6576 --- conf/db/upgrade/V5.1.8.1__schema.sql | 1 + .../java/org/zstack/sdk/ModelEvaluationTaskInventory.java | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index c0b25d228cc..050075782a9 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -208,6 +208,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelEvaluationTaskVO` ( `percentage` int(3) DEFAULT 0, `status` varchar(64) NOT NULL, `modelServiceGroupUuid` varchar(32) NOT NULL, + `evaluatedServiceGroupUuid` varchar(32) NOT NULL, `datasetUuid` varchar(32) NOT NULL, `opaque` varchar(2048) DEFAULT NULL, `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, diff --git a/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java index 0f0cd127d81..38f445ade3a 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java @@ -60,6 +60,14 @@ public java.lang.String getModelServiceGroupUuid() { return this.modelServiceGroupUuid; } + public java.lang.String evaluatedServiceGroupUuid; + public void setEvaluatedServiceGroupUuid(java.lang.String evaluatedServiceGroupUuid) { + this.evaluatedServiceGroupUuid = evaluatedServiceGroupUuid; + } + public java.lang.String getEvaluatedServiceGroupUuid() { + return this.evaluatedServiceGroupUuid; + } + public java.lang.String datasetUuid; public void setDatasetUuid(java.lang.String datasetUuid) { this.datasetUuid = datasetUuid; From db9ffcd2bd67bbc505837efa32b4b4e9c8a88f23 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Mon, 12 Aug 2024 11:17:28 +0800 Subject: [PATCH 114/737] [conf]: add source model info in record DBImpact Change-Id: I726367616c686b676b77736f6c7a786574756578 --- conf/db/upgrade/V5.1.8.1__schema.sql | 1 + .../java/org/zstack/sdk/TrainedModelRecordInventory.java | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 050075782a9..82672871f2d 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -219,6 +219,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelEvaluationTaskVO` ( CREATE TABLE IF NOT EXISTS `zstack`.`TrainedModelRecordVO` ( `uuid` varchar(32) NOT NULL UNIQUE, `modelUuid` varchar(32) NOT NULL, + `sourceModelUuid` varchar(32) DEFAULT NULL, `modelServiceInstanceGroupUuid` varchar(32) NOT NULL, `datasetUuid` varchar(32) DEFAULT NULL, `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, diff --git a/sdk/src/main/java/org/zstack/sdk/TrainedModelRecordInventory.java b/sdk/src/main/java/org/zstack/sdk/TrainedModelRecordInventory.java index 60f6e924e95..ccd4034f3b5 100644 --- a/sdk/src/main/java/org/zstack/sdk/TrainedModelRecordInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/TrainedModelRecordInventory.java @@ -20,6 +20,14 @@ public java.lang.String getModelUuid() { return this.modelUuid; } + public java.lang.String sourceModelUuid; + public void setSourceModelUuid(java.lang.String sourceModelUuid) { + this.sourceModelUuid = sourceModelUuid; + } + public java.lang.String getSourceModelUuid() { + return this.sourceModelUuid; + } + public java.lang.String modelServiceInstanceGroupUuid; public void setModelServiceInstanceGroupUuid(java.lang.String modelServiceInstanceGroupUuid) { this.modelServiceInstanceGroupUuid = modelServiceInstanceGroupUuid; From cbd331bfad7f026c429ef031be0b62535fdea2e7 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 12 Aug 2024 16:37:50 +0800 Subject: [PATCH 115/737] [conf]: update schema and sdk DBImpact Resolves: ZSTAC-66285 Change-Id: I6d776d7465667766776f62757579786f72717565 Signed-off-by: AlanJager --- conf/db/upgrade/V5.1.8.1__schema.sql | 2 ++ sdk/src/main/java/org/zstack/sdk/DatasetInventory.java | 8 ++++++++ .../java/org/zstack/sdk/ModelEvaluationTaskInventory.java | 8 ++++++++ 3 files changed, 18 insertions(+) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 82672871f2d..31dcf0afb6a 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -134,6 +134,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`DatasetVO` ( `installPath` varchar(2048) NULL, `description` varchar(2048) NULL, `modelCenterUuid` varchar(32) NOT NULL, + `system` tinyint(1) DEFAULT 0, `size` bigint NULL, `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', @@ -210,6 +211,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelEvaluationTaskVO` ( `modelServiceGroupUuid` varchar(32) NOT NULL, `evaluatedServiceGroupUuid` varchar(32) NOT NULL, `datasetUuid` varchar(32) NOT NULL, + `limits` int(3) DEFAULT 0, `opaque` varchar(2048) DEFAULT NULL, `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', diff --git a/sdk/src/main/java/org/zstack/sdk/DatasetInventory.java b/sdk/src/main/java/org/zstack/sdk/DatasetInventory.java index b94f9c346c8..69706e35dad 100644 --- a/sdk/src/main/java/org/zstack/sdk/DatasetInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/DatasetInventory.java @@ -60,6 +60,14 @@ public java.lang.Long getSize() { return this.size; } + public java.lang.Boolean system; + public void setSystem(java.lang.Boolean system) { + this.system = system; + } + public java.lang.Boolean getSystem() { + return this.system; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java index 38f445ade3a..c4927323f96 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java @@ -76,6 +76,14 @@ public java.lang.String getDatasetUuid() { return this.datasetUuid; } + public java.lang.Integer limits; + public void setLimits(java.lang.Integer limits) { + this.limits = limits; + } + public java.lang.Integer getLimits() { + return this.limits; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; From 095cb640250976b4951f255569123e975e1f40cb Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 12 Aug 2024 17:05:50 +0800 Subject: [PATCH 116/737] [sdk]: update sdk Resolves: ZSTAC-68625 Change-Id: I6b6d787a63686f79707175637763666769756f6c Signed-off-by: AlanJager --- .../java/org/zstack/sdk/DeployModelEvalServiceResult.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceResult.java b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceResult.java index cbab70aa52f..501486c9f89 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceResult.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceResult.java @@ -11,4 +11,12 @@ public ModelEvalServiceInstanceGroupInventory getInventory() { return this.inventory; } + public java.util.List tasks; + public void setTasks(java.util.List tasks) { + this.tasks = tasks; + } + public java.util.List getTasks() { + return this.tasks; + } + } From 781352a5e9c0676f575be48e248b3bbf4f644a45 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 13 Aug 2024 09:42:42 +0800 Subject: [PATCH 117/737] [conf]: change ModelEvaluationTaskVO opaque to mediumtext DBImpact Resolves: ZSTAC-66285 Change-Id: I626368686871647a6e6b6f777a777077626b646a --- conf/db/upgrade/V5.1.8.1__schema.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 31dcf0afb6a..2acccb2552c 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -212,7 +212,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelEvaluationTaskVO` ( `evaluatedServiceGroupUuid` varchar(32) NOT NULL, `datasetUuid` varchar(32) NOT NULL, `limits` int(3) DEFAULT 0, - `opaque` varchar(2048) DEFAULT NULL, + `opaque` mediumtext DEFAULT NULL, `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`) From 1a961df712f6d80d1525263d49e3f00b9aa10e17 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 14 Aug 2024 11:41:02 +0800 Subject: [PATCH 118/737] [conf]: change fk of ModelServiceInstanceVO to set null not deletion DBImpact Resolves: ZSTAC-66285 Change-Id: I637473686c7265696269756b726a79776f746a65 Signed-off-by: AlanJager --- conf/db/upgrade/V5.1.8.1__schema.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 2acccb2552c..660442be7dd 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -92,7 +92,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceInstanceVO` ( `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`), - CONSTRAINT fkModelServiceInstanceVOVmInstanceVO FOREIGN KEY (vmInstanceUuid) REFERENCES VmInstanceEO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE + CONSTRAINT fkModelServiceInstanceVOVmInstanceVO FOREIGN KEY (vmInstanceUuid) REFERENCES VmInstanceEO (uuid) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; --CREATE TABLE `zstack`.`VmModelServiceInstanceVO` ( From d40c3cd2dbd244aa3b90168ac954d9f37f523b78 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Sun, 18 Aug 2024 20:55:10 +0800 Subject: [PATCH 119/737] [sso]: support sso server Resolves: ZSTAC-66623 Change-Id: I6467666238676e6d666175747477786a71677963 --- conf/db/upgrade/V5.1.8.1__schema.sql | 2 +- .../org/zstack/sdk/GetOAuth2TokenResult.java | 1 - .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 660442be7dd..23d5c81cd36 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -227,4 +227,4 @@ CREATE TABLE IF NOT EXISTS `zstack`.`TrainedModelRecordVO` ( `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/sdk/src/main/java/org/zstack/sdk/GetOAuth2TokenResult.java b/sdk/src/main/java/org/zstack/sdk/GetOAuth2TokenResult.java index e11cd917eb5..27126e0f99d 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetOAuth2TokenResult.java +++ b/sdk/src/main/java/org/zstack/sdk/GetOAuth2TokenResult.java @@ -27,5 +27,4 @@ public void setAdditionalTokenInventory(java.util.Map additionalTokenInventory) public java.util.Map getAdditionalTokenInventory() { return this.additionalTokenInventory; } - } diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index e697c47bd83..1e859a0178b 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -39422,7 +39422,34 @@ abstract class ApiHelper { def tokenIntrospection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.TokenIntrospectionAction.class) Closure c) { def a = new org.zstack.sdk.TokenIntrospectionAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def triggerGCJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.TriggerGCJobAction.class) Closure c) { + def a = new org.zstack.sdk.TriggerGCJobAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() From 43a0a52e87fd46520d1d9a29929951663daacd3e Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 19 Jun 2024 22:37:52 +0800 Subject: [PATCH 120/737] [rest]: add timeout to ut rest facade Resolves: ZSTAC-66285 Change-Id: I61766d64716c636f6d646f686a61686b6c776a6f Signed-off-by: AlanJager From 7c0faa7a47190489ed0917b42bef6c8370f300f4 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Sun, 18 Aug 2024 20:56:37 +0800 Subject: [PATCH 121/737] [conf]: introduce dataset DBImpact Resolves: ZSTAC-66285 Change-Id: I74686262727375737876716862766f756c6c7a78 Signed-off-by: AlanJager --- conf/db/upgrade/V5.1.8.1__schema.sql | 2 +- sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 23d5c81cd36..660442be7dd 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -227,4 +227,4 @@ CREATE TABLE IF NOT EXISTS `zstack`.`TrainedModelRecordVO` ( `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index ff1f2fbdcdf..39486905bd7 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -28,7 +28,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String dockerImage; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) @@ -40,7 +40,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String modelCenterUuid; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vmImageUuid; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) From fca3d8e55f4714c1d3c79491d9b6f2ef56bd32ae Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Fri, 16 Aug 2024 07:17:23 +0000 Subject: [PATCH 122/737] [sdk]: Update sdk to support system dataset Change-Id: I7677756e71676d6979637161767a6f676f6e6d6e --- sdk/src/main/java/org/zstack/sdk/CreateDatasetAction.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateDatasetAction.java b/sdk/src/main/java/org/zstack/sdk/CreateDatasetAction.java index ed68a36aebd..25f3d108230 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateDatasetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateDatasetAction.java @@ -40,6 +40,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String token; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean system; + @Param(required = false) public java.lang.String resourceUuid; From 13aaa8e1348c3b86050a5c18efca889a6bde89e1 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 16 Aug 2024 18:28:10 +0800 Subject: [PATCH 123/737] [conf]: add code to dataset vo DBImpact Resolves: ZSTAC-66285 Change-Id: I6a6b6a6e6164726d617376656a696f756b787361 --- conf/db/upgrade/V5.1.8.1__schema.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 660442be7dd..4a83d0eb9ea 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -131,6 +131,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`DatasetVO` ( `uuid` varchar(32) NOT NULL UNIQUE, `name` varchar(255) NULL, `url` varchar(2048) NULL, + `code` varchar(255) DEFAULT NULL, `installPath` varchar(2048) NULL, `description` varchar(2048) NULL, `modelCenterUuid` varchar(32) NOT NULL, From 4a2e2c61af2e675f4e532af6714ca39f2cfe7338 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Sat, 17 Aug 2024 16:18:23 +0800 Subject: [PATCH 124/737] [sdk]: update sdk and schema Resolves: ZSTAC-68976 Change-Id: I6b68797474766c72666d747162676c7a6d696862 Signed-off-by: AlanJager --- conf/db/upgrade/V5.1.8.1__schema.sql | 1 + .../main/java/org/zstack/sdk/ModelCenterInventory.java | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index 4a83d0eb9ea..a8d89896108 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -4,6 +4,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelCenterVO` ( `description` varchar(2048) DEFAULT NULL, `url` varchar(2048) DEFAULT NULL, `parameters` varchar(128) DEFAULT NULL, + `status` varchar(255) NOT NULL, `managementIp` varchar(128) NOT NULL, `managementPort` int(16) not NULL, `storageNetworkUuid` varchar(32) DEFAULT NULL, diff --git a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java index e899757708e..9a63d797169 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java @@ -36,6 +36,14 @@ public java.lang.String getUrl() { return this.url; } + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + public java.lang.String parameters; public void setParameters(java.lang.String parameters) { this.parameters = parameters; From d83ec80200b8803ed0f116ad2998e3bbc5f5035b Mon Sep 17 00:00:00 2001 From: AlanJager Date: Sun, 18 Aug 2024 19:07:17 +0800 Subject: [PATCH 125/737] [conf]: change dataset value default to NULL DBImpact Resolves: ZSTAC-66285 Change-Id: I7a726776636d786f6c6c6e776b7765767362757a Signed-off-by: AlanJager --- conf/db/upgrade/V5.1.8.1__schema.sql | 2 +- .../org/zstack/sdk/AddModelServiceAction.java | 2 +- test3 | 1 + .../java/org/zstack/testlib/ApiHelper.groovy | 28 ------------------- 4 files changed, 3 insertions(+), 30 deletions(-) create mode 100644 test3 diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql index a8d89896108..175e60beae7 100644 --- a/conf/db/upgrade/V5.1.8.1__schema.sql +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -137,7 +137,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`DatasetVO` ( `description` varchar(2048) NULL, `modelCenterUuid` varchar(32) NOT NULL, `system` tinyint(1) DEFAULT 0, - `size` bigint NULL, + `size` bigint(20) DEFAULT 0, `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`), diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index 39486905bd7..7d55338a4a1 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -40,7 +40,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String modelCenterUuid; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vmImageUuid; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/test3 b/test3 new file mode 100644 index 00000000000..964480f63e4 --- /dev/null +++ b/test3 @@ -0,0 +1 @@ +213 diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 1e859a0178b..44f77c9e1a6 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -39422,34 +39422,6 @@ abstract class ApiHelper { def tokenIntrospection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.TokenIntrospectionAction.class) Closure c) { def a = new org.zstack.sdk.TokenIntrospectionAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() - - - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } - - - def triggerGCJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.TriggerGCJobAction.class) Closure c) { - def a = new org.zstack.sdk.TriggerGCJobAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() From 2d0ccad36f63c88c706af678aa7844aa6a4eeade Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 19 Aug 2024 21:31:50 +0800 Subject: [PATCH 126/737] [ai]: update sdk Resolves: ZSTAC-66285 Change-Id: I6f636b627664777a616b6d6c64686a6c6a786463 --- sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java | 2 +- sdk/src/main/java/org/zstack/sdk/GetOAuth2TokenResult.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index 7d55338a4a1..ff1f2fbdcdf 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -28,7 +28,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String dockerImage; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/GetOAuth2TokenResult.java b/sdk/src/main/java/org/zstack/sdk/GetOAuth2TokenResult.java index 27126e0f99d..e11cd917eb5 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetOAuth2TokenResult.java +++ b/sdk/src/main/java/org/zstack/sdk/GetOAuth2TokenResult.java @@ -27,4 +27,5 @@ public void setAdditionalTokenInventory(java.util.Map additionalTokenInventory) public java.util.Map getAdditionalTokenInventory() { return this.additionalTokenInventory; } + } From 19e56344e4636366c794b1a93b37bebe786f7278 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 21 Aug 2024 11:31:10 +0800 Subject: [PATCH 127/737] [header]: introduce aios api package permission Resolves: ZSTAC-69092 Change-Id: I627666786a69636473766a77757a676c67797766 --- header/src/main/java/org/zstack/header/PackageAPIInfo.java | 1 + 1 file changed, 1 insertion(+) diff --git a/header/src/main/java/org/zstack/header/PackageAPIInfo.java b/header/src/main/java/org/zstack/header/PackageAPIInfo.java index 7bf7b25894b..00ab5f6db71 100755 --- a/header/src/main/java/org/zstack/header/PackageAPIInfo.java +++ b/header/src/main/java/org/zstack/header/PackageAPIInfo.java @@ -17,6 +17,7 @@ */ public static String PERMISSION_ZSV_BASIC_AVAILABLE = "zsv_basic_available"; public static String PERMISSION_ZSV_ADVANCED_AVAILABLE = "zsv_advanced_available"; + public static String PERMISSION_CLOUD_AIOS_AVAILABLE = "cloud_aios_available"; String APICategoryName() default ""; From 3c98aca618ba629eb07d6120eefab3e1f12223ab Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Wed, 21 Aug 2024 21:51:38 +0800 Subject: [PATCH 128/737] [gpu]: move gpu related hardware event from kvm to mevoco Add KvmHardwareStatusHandlerExtensionPoint for http event handling Resolves: ZSTAC-69092 Change-Id: I6f62716e6c7876737878696b626978666c756a6b Signed-off-by: ye.zou --- .../java/org/zstack/kvm/KVMHostFactory.java | 20 +++---------------- ...vmHardwareStatusHandlerExtensionPoint.java | 7 +++++++ 2 files changed, 10 insertions(+), 17 deletions(-) create mode 100644 plugin/kvm/src/main/java/org/zstack/kvm/KvmHardwareStatusHandlerExtensionPoint.java diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java index 63ae932df44..6947b3a6d31 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java @@ -372,14 +372,6 @@ void physicalMemoryStatusAlarmEvent(HostPhysicalDeviceStatusAlarmEventCmd cmd) { evf.fire(HostCanonicalEvents.HOST_PHYSICAL_MEMORY_STATUS_ABNORMAL, cdata); } - void physicalGpuStatusAlarmEvent(HostPhysicalDeviceStatusAlarmEventCmd cmd) { - HostCanonicalEvents.HostPhysicalGpuStatusAbnormalData cdata = new HostCanonicalEvents.HostPhysicalGpuStatusAbnormalData(); - cdata.setHostUuid(cmd.getHost()); - cdata.setPcideviceAddress(cmd.getAdditionalProperties().get(KVMConstant.PCI_DEVICE_ADDRESS).toString()); - cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHSICAL_DEVICE_STATUS_NAME).toString()); - evf.fire(HostCanonicalEvents.HOST_PHYSICAL_GPU_STATUS_ABNORMAL, cdata); - } - void physicalPowerSupplyStatusAlarmEvent(HostPhysicalDeviceStatusAlarmEventCmd cmd) { HostCanonicalEvents.HostPhysicalPowerSupplyStatusAbnormalData cdata = new HostCanonicalEvents.HostPhysicalPowerSupplyStatusAbnormalData(); cdata.setHostUuid(cmd.getHost()); @@ -591,7 +583,9 @@ public String handleSyncHttpCall(TransmitVmOperationToMnCmd cmd) { physicalMemoryStatusAlarmEvent(cmd); break; case GPU: - physicalGpuStatusAlarmEvent(cmd); + for (KvmHardwareStatusHandlerExtensionPoint ext : pluginRgty.getExtensionList(KvmHardwareStatusHandlerExtensionPoint.class)) { + ext.handleKvmHardwareStatus(HostHardware.GPU, cmd); + } break; case POWERSUPPLY: physicalPowerSupplyStatusAlarmEvent(cmd); @@ -641,14 +635,6 @@ public String handleSyncHttpCall(TransmitVmOperationToMnCmd cmd) { return null; }); - restf.registerSyncHttpCallHandler(KVMConstant.HOST_PHYSICAL_GPU_REMOVE_ALARM_EVENT, PhysicalGpuRemoveAlarmEventCmd.class, cmd -> { - HostCanonicalEvents.HostPhysicalGpuRemoveTriggeredData cdata = new HostCanonicalEvents.HostPhysicalGpuRemoveTriggeredData(); - cdata.setHostUuid(cmd.host); - cdata.setPcideviceAddress(cmd.pcideviceAddress); - evf.fire(HostCanonicalEvents.HOST_PHYSICAL_GPU_REMOVE_TRIGGERED, cdata); - return null; - }); - KVMSystemTags.CHECK_CLUSTER_CPU_MODEL.installValidator(((resourceUuid, resourceType, systemTag) -> { String check = KVMSystemTags.CHECK_CLUSTER_CPU_MODEL.getTokenByTag(systemTag, KVMSystemTags.CHECK_CLUSTER_CPU_MODEL_TOKEN); diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KvmHardwareStatusHandlerExtensionPoint.java b/plugin/kvm/src/main/java/org/zstack/kvm/KvmHardwareStatusHandlerExtensionPoint.java new file mode 100644 index 00000000000..ced5d78edb5 --- /dev/null +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KvmHardwareStatusHandlerExtensionPoint.java @@ -0,0 +1,7 @@ +package org.zstack.kvm; + +import org.zstack.header.host.HostHardware; + +public interface KvmHardwareStatusHandlerExtensionPoint { + void handleKvmHardwareStatus(HostHardware hostHardwareType, KVMAgentCommands.HostPhysicalDeviceStatusAlarmEventCmd cmd); +} From 1a1c622c5a60573904defb0c06447652c66388cb Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 2 Sep 2024 14:13:21 +0800 Subject: [PATCH 129/737] [identity]: Improve quota repair to support agent's quota When the management node starts, the identity module checks for any missing quotas and creates them for accounts that lack them. However, in some situations, quotas need to be set or unset on the agent side, and using the default value to repair the quota is not appropriate. This commit enhances the quota repair mechanism to support returning a repair value if needed, instead of setting a default value in the database. - Added support to return a repair value for quotas that need agent-side settings. - Ensured that the repair mechanism does not set default values in the database for such quotas. - Updated the relevant methods to handle the new repair value logic. This change ensures that quotas requiring agent-side settings are handled correctly without defaulting to inappropriate values. Resolves: ZSTAC-69284 Change-Id: I747663746565627a646a71646e7a64726373756a Signed-off-by: AlanJager --- .../zstack/header/identity/quota/QuotaDefinition.java | 9 +++++++++ .../java/org/zstack/identity/AccountManagerImpl.java | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/header/src/main/java/org/zstack/header/identity/quota/QuotaDefinition.java b/header/src/main/java/org/zstack/header/identity/quota/QuotaDefinition.java index 2fb11031d74..2cdefa2a24b 100644 --- a/header/src/main/java/org/zstack/header/identity/quota/QuotaDefinition.java +++ b/header/src/main/java/org/zstack/header/identity/quota/QuotaDefinition.java @@ -18,4 +18,13 @@ public interface QuotaDefinition { * no usage supported */ Long getQuotaUsage(String accountUuid); + + /** + * Gets the repair value for the quota. + * + * @return the repair value as a Long. If the value is null, it indicates that the repair value is unavailable or not supported. + */ + default Long getRepairValue() { + return null; + } } diff --git a/identity/src/main/java/org/zstack/identity/AccountManagerImpl.java b/identity/src/main/java/org/zstack/identity/AccountManagerImpl.java index 99fefbb48c6..881acd76834 100755 --- a/identity/src/main/java/org/zstack/identity/AccountManagerImpl.java +++ b/identity/src/main/java/org/zstack/identity/AccountManagerImpl.java @@ -873,7 +873,8 @@ protected void scripts() { List existingQuota = q(QuotaVO.class).select(QuotaVO_.name).eq(QuotaVO_.identityUuid, nA).listValues(); for (Map.Entry e : quotaDefinitionMap.entrySet()) { String rtype = e.getKey(); - Long value = e.getValue().getDefaultValue(); + Long value = e.getValue().getRepairValue() != null ? + e.getValue().getRepairValue() : e.getValue().getDefaultValue(); if (existingQuota.contains(rtype)) { continue; } From 42177cd7aff606b792ebc67838f262ae0b643179 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 3 Sep 2024 11:57:37 +0800 Subject: [PATCH 130/737] [identity]: introduce repairValue to quota builder Resolves: ZSTAC-69284 Change-Id: I6f686a746e74786e68726b626e6a6b686b616267 --- .../header/identity/quota/QuotaDefBuilder.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/header/src/main/java/org/zstack/header/identity/quota/QuotaDefBuilder.java b/header/src/main/java/org/zstack/header/identity/quota/QuotaDefBuilder.java index 16bedc49654..96cf2ba6852 100644 --- a/header/src/main/java/org/zstack/header/identity/quota/QuotaDefBuilder.java +++ b/header/src/main/java/org/zstack/header/identity/quota/QuotaDefBuilder.java @@ -5,6 +5,7 @@ public class QuotaDefBuilder { private String name; private Long defaultValue; + private Long repairValue; private GetQuotaUsage getUsage; public static QuotaDefBuilder newBuilder() { @@ -21,6 +22,11 @@ public QuotaDefBuilder defaultValue(Long defaultValue) { return this; } + public QuotaDefBuilder repairValue(Long repairValue) { + this.repairValue = repairValue; + return this; + } + public QuotaDefBuilder getUsage(GetQuotaUsage usage) { this.getUsage = usage; return this; @@ -34,6 +40,7 @@ static class QuotaDefinitionImpl implements QuotaDefinition { private String name; private Long defaultValue; private GetQuotaUsage getUsage; + private Long repairValue; @Override public String getName() { @@ -65,17 +72,28 @@ public GetQuotaUsage getGetUsage() { public void setGetUsage(GetQuotaUsage getUsage) { this.getUsage = getUsage; } + + @Override + public Long getRepairValue() { + return repairValue; + } + + public void setRepairValue(Long repairValue) { + this.repairValue = repairValue; + } } public QuotaDefinition build() { DebugUtils.Assert(this.name != null, "quota name is required"); DebugUtils.Assert(this.defaultValue != null, "quota defaultValue is required"); DebugUtils.Assert(this.getUsage != null, "quota getUsage is required"); + DebugUtils.Assert(this.repairValue != null, "quota repairValue is required"); QuotaDefinitionImpl quota = new QuotaDefinitionImpl(); quota.name = this.name; quota.defaultValue = this.defaultValue; quota.getUsage = this.getUsage; + quota.repairValue = this.repairValue; return quota; } } From 9e0415e25b673585c56cb00ac7608860da5f0a55 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 6 Sep 2024 11:47:09 +0800 Subject: [PATCH 131/737] [sdk]: update sdk Resolves: ZSTAC-69415 Change-Id: I6f6d696d6e7270746e73716a696b6b6c6c73716c Signed-off-by: AlanJager --- .../main/java/org/zstack/sdk/DeployModelEvalServiceAction.java | 3 +++ sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java | 3 +++ test3 | 1 - 3 files changed, 6 insertions(+), 1 deletion(-) delete mode 100644 test3 diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java index 27c6e76122f..2e2bbbda7b7 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java @@ -88,6 +88,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List l3NetworkUuids; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer serviceBootUptime; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java index d8fb2c974b0..0c1eed32bf4 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java @@ -67,6 +67,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List l3NetworkUuids; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer serviceBootUptime; + @Param(required = false) public java.util.List systemTags; diff --git a/test3 b/test3 deleted file mode 100644 index 964480f63e4..00000000000 --- a/test3 +++ /dev/null @@ -1 +0,0 @@ -213 From 5858dbb25148801c12fb6615117edd83ad0e3eca Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Fri, 6 Sep 2024 15:52:28 +0800 Subject: [PATCH 132/737] [conf]: Add new column for ModelCenter DBImpact Resolves: ZSTAC-69523 Change-Id: I6a6166786a636377727268726175687063686a75 --- conf/db/upgrade/V5.1.20__schema.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 conf/db/upgrade/V5.1.20__schema.sql diff --git a/conf/db/upgrade/V5.1.20__schema.sql b/conf/db/upgrade/V5.1.20__schema.sql new file mode 100644 index 00000000000..eb9eccc1cee --- /dev/null +++ b/conf/db/upgrade/V5.1.20__schema.sql @@ -0,0 +1,2 @@ +ALTER TABLE `zstack`.`ModelCenterVO` ADD COLUMN containerStorageNetwork varchar(2048) DEFAULT NULL; +ALTER TABLE `zstack`.`ModelServiceInstanceVO` ADD COLUMN internalUrl varchar(2048) DEFAULT NULL; From da2ce9d1b5b2ef353cd34f55cbcd531ddd860ccf Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Fri, 6 Sep 2024 08:40:12 +0000 Subject: [PATCH 133/737] [sdk]: Update sdk Resolves: ZSTAC-69523 Change-Id: I7a62726f77707578736377756973746c73697768 --- .../main/java/org/zstack/sdk/AddModelCenterAction.java | 3 +++ .../main/java/org/zstack/sdk/ModelCenterInventory.java | 8 ++++++++ .../org/zstack/sdk/ModelServiceInstanceInventory.java | 8 ++++++++ .../main/java/org/zstack/sdk/UpdateModelCenterAction.java | 3 +++ 4 files changed, 22 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java index f78243fd9f3..38122fb2b2d 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java @@ -55,6 +55,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String containerNetwork; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerStorageNetwork; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java index 9a63d797169..d6d882ed85d 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java @@ -92,6 +92,14 @@ public java.lang.String getContainerRegistry() { return this.containerRegistry; } + public java.lang.String containerStorageNetwork; + public void setContainerStorageNetwork(java.lang.String containerStorageNetwork) { + this.containerStorageNetwork = containerStorageNetwork; + } + public java.lang.String getContainerStorageNetwork() { + return this.containerStorageNetwork; + } + public java.lang.String containerNetwork; public void setContainerNetwork(java.lang.String containerNetwork) { this.containerNetwork = containerNetwork; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java index 314d72a8b4d..6a16a1302d9 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java @@ -44,6 +44,14 @@ public java.lang.String getUrl() { return this.url; } + public java.lang.String internalUrl; + public void setInternalUrl(java.lang.String internalUrl) { + this.internalUrl = internalUrl; + } + public java.lang.String getInternalUrl() { + return this.internalUrl; + } + public java.lang.String vmInstanceUuid; public void setVmInstanceUuid(java.lang.String vmInstanceUuid) { this.vmInstanceUuid = vmInstanceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java index 53205462c03..9bc5590ef92 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java @@ -58,6 +58,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String containerNetwork; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerStorageNetwork; + @Param(required = false) public java.util.List systemTags; From 52cc16cc76b78674bb68aa341a925d8529fba4b3 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Tue, 10 Sep 2024 16:14:46 +0000 Subject: [PATCH 134/737] [sdk]: Update sdk Resolves: ZSTAC-69385 Change-Id: I6a6a75706776616c6d6279686d636e7777797066 --- sdk/src/main/java/SourceClassMap.java | 2 + .../org/zstack/sdk/NginxRedirectRule.java | 31 +++++ .../sdk/SyncAINginxConfigurationAction.java | 110 ++++++++++++++++++ .../sdk/SyncAINginxConfigurationResult.java | 14 +++ .../java/org/zstack/testlib/ApiHelper.groovy | 28 +++++ 5 files changed, 185 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/NginxRedirectRule.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationResult.java diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 2ee275d2fdd..a526a810b40 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -7,6 +7,7 @@ public class SourceClassMap { { put("org.zstack.accessKey.AccessKeyInventory", "org.zstack.sdk.AccessKeyInventory"); put("org.zstack.accessKey.AccessKeyState", "org.zstack.sdk.AccessKeyState"); + put("org.zstack.ai.NginxRedirectRule", "org.zstack.sdk.NginxRedirectRule"); put("org.zstack.ai.entity.DatasetInventory", "org.zstack.sdk.DatasetInventory"); put("org.zstack.ai.entity.ModelCenterInventory", "org.zstack.sdk.ModelCenterInventory"); put("org.zstack.ai.entity.ModelEvalServiceInstanceGroupInventory", "org.zstack.sdk.ModelEvalServiceInstanceGroupInventory"); @@ -1101,6 +1102,7 @@ public class SourceClassMap { put("org.zstack.sdk.NetworkRouterFlowMeterRefInventory", "org.zstack.header.flowMeter.NetworkRouterFlowMeterRefInventory"); put("org.zstack.sdk.NetworkServiceL3NetworkRefInventory", "org.zstack.header.network.service.NetworkServiceL3NetworkRefInventory"); put("org.zstack.sdk.NetworkServiceProviderInventory", "org.zstack.header.network.service.NetworkServiceProviderInventory"); + put("org.zstack.sdk.NginxRedirectRule", "org.zstack.ai.NginxRedirectRule"); put("org.zstack.sdk.NormalIpRangeInventory", "org.zstack.header.network.l3.NormalIpRangeInventory"); put("org.zstack.sdk.NvmeLunHostRefInventory", "org.zstack.storage.device.nvme.NvmeLunHostRefInventory"); put("org.zstack.sdk.NvmeLunInventory", "org.zstack.storage.device.nvme.NvmeLunInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/NginxRedirectRule.java b/sdk/src/main/java/org/zstack/sdk/NginxRedirectRule.java new file mode 100644 index 00000000000..edafa411d8a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/NginxRedirectRule.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + + + +public class NginxRedirectRule { + + public java.lang.String destUrl; + public void setDestUrl(java.lang.String destUrl) { + this.destUrl = destUrl; + } + public java.lang.String getDestUrl() { + return this.destUrl; + } + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String currentUrl; + public void setCurrentUrl(java.lang.String currentUrl) { + this.currentUrl = currentUrl; + } + public java.lang.String getCurrentUrl() { + return this.currentUrl; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java b/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java new file mode 100644 index 00000000000..45d144fb590 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java @@ -0,0 +1,110 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class SyncAINginxConfigurationAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.SyncAINginxConfigurationResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List instanceUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean dryRun; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.SyncAINginxConfigurationResult value = res.getResult(org.zstack.sdk.SyncAINginxConfigurationResult.class); + ret.value = value == null ? new org.zstack.sdk.SyncAINginxConfigurationResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/ai/nginx/sync"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "param"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationResult.java b/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationResult.java new file mode 100644 index 00000000000..3257b6fa952 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class SyncAINginxConfigurationResult { + public java.util.List unSyncedRules; + public void setUnSyncedRules(java.util.List unSyncedRules) { + this.unSyncedRules = unSyncedRules; + } + public java.util.List getUnSyncedRules() { + return this.unSyncedRules; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 44f77c9e1a6..f98b67ccc96 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -38583,6 +38583,33 @@ abstract class ApiHelper { } + def syncAINginxConfiguration(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncAINginxConfigurationAction.class) Closure c) { + def a = new org.zstack.sdk.SyncAINginxConfigurationAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def syncAliyunRouteEntryFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncAliyunRouteEntryFromRemoteAction.class) Closure c) { def a = new org.zstack.sdk.SyncAliyunRouteEntryFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -39422,6 +39449,7 @@ abstract class ApiHelper { def tokenIntrospection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.TokenIntrospectionAction.class) Closure c) { def a = new org.zstack.sdk.TokenIntrospectionAction() + c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() From 925c88d8612435ef4ed5c0bb70937ebf7a3fc97f Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Wed, 18 Sep 2024 11:11:03 +0800 Subject: [PATCH 135/737] [conf]: Save k8s resource in another column DBImpact Resolves: ZSTAC-69792 Change-Id: I6668687870647765626f63737074666165667069 --- conf/db/upgrade/V5.1.20__schema.sql | 1 + .../zstack/sdk/ModelServiceInstanceInventory.java | 8 ++++++++ .../zstack/sdk/SyncAINginxConfigurationAction.java | 14 +------------- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/conf/db/upgrade/V5.1.20__schema.sql b/conf/db/upgrade/V5.1.20__schema.sql index eb9eccc1cee..dcdcb1914fe 100644 --- a/conf/db/upgrade/V5.1.20__schema.sql +++ b/conf/db/upgrade/V5.1.20__schema.sql @@ -1,2 +1,3 @@ ALTER TABLE `zstack`.`ModelCenterVO` ADD COLUMN containerStorageNetwork varchar(2048) DEFAULT NULL; ALTER TABLE `zstack`.`ModelServiceInstanceVO` ADD COLUMN internalUrl varchar(2048) DEFAULT NULL; +ALTER TABLE `zstack`.`ModelServiceInstanceVO` ADD COLUMN k8sResourceYaml mediumtext DEFAULT NULL; \ No newline at end of file diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java index 6a16a1302d9..6829b1c23f8 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java @@ -28,6 +28,14 @@ public java.lang.String getYaml() { return this.yaml; } + public java.lang.String k8sResourceYaml; + public void setK8sResourceYaml(java.lang.String k8sResourceYaml) { + this.k8sResourceYaml = k8sResourceYaml; + } + public java.lang.String getK8sResourceYaml() { + return this.k8sResourceYaml; + } + public java.lang.String status; public void setStatus(java.lang.String status) { this.status = status; diff --git a/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java b/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java index 45d144fb590..b445108457c 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java @@ -31,12 +31,6 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Boolean dryRun; - @Param(required = false) - public java.lang.String resourceUuid; - - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.util.List tagUuids; - @Param(required = false) public java.util.List systemTags; @@ -55,12 +49,6 @@ public Result throwExceptionIfError() { @Param(required = false) public String requestIp; - @NonAPIParam - public long timeout = -1; - - @NonAPIParam - public long pollingInterval = -1; - private Result makeResult(ApiResult res) { Result ret = new Result(); @@ -102,7 +90,7 @@ protected RestInfo getRestInfo() { info.httpMethod = "POST"; info.path = "/ai/nginx/sync"; info.needSession = true; - info.needPoll = true; + info.needPoll = false; info.parameterName = "param"; return info; } From 8e259f59c334b2b60d20467d8c3a0de84695100d Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Thu, 19 Sep 2024 13:21:38 +0800 Subject: [PATCH 136/737] [conf]: Restore k8s info to new column DBImpact Change-Id: I6f75636969746a797a637361746966636d74636a --- conf/db/upgrade/V5.1.20__schema.sql | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.1.20__schema.sql b/conf/db/upgrade/V5.1.20__schema.sql index dcdcb1914fe..0dcae4a7da1 100644 --- a/conf/db/upgrade/V5.1.20__schema.sql +++ b/conf/db/upgrade/V5.1.20__schema.sql @@ -1,3 +1,20 @@ ALTER TABLE `zstack`.`ModelCenterVO` ADD COLUMN containerStorageNetwork varchar(2048) DEFAULT NULL; ALTER TABLE `zstack`.`ModelServiceInstanceVO` ADD COLUMN internalUrl varchar(2048) DEFAULT NULL; -ALTER TABLE `zstack`.`ModelServiceInstanceVO` ADD COLUMN k8sResourceYaml mediumtext DEFAULT NULL; \ No newline at end of file +ALTER TABLE `zstack`.`ModelServiceInstanceVO` ADD COLUMN k8sResourceYaml mediumtext DEFAULT NULL; + +DROP PROCEDURE IF EXISTS UpdateK8sResourceYaml; +DELIMITER // +CREATE PROCEDURE UpdateK8sResourceYaml() +BEGIN + -- 开始事务 + START TRANSACTION; + + UPDATE ModelServiceInstanceVO + SET k8sResourceYaml = yaml + WHERE vmInstanceUuid IS NULL; + + -- 提交事务 + COMMIT; +END // +DELIMITER ; +CALL UpdateK8sResourceYaml(); \ No newline at end of file From b77a56514737ec41ce1c8a4fdf59d403cfc2ea24 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Sat, 21 Sep 2024 12:53:12 +0000 Subject: [PATCH 137/737] [sdk]: Update sdk Resolves: ZSTAC-69385 Change-Id: I72616f6267706d796b6961787179627974746774 --- .../sdk/ModelServiceInstanceInventory.java | 8 ++++++++ .../java/org/zstack/sdk/NginxRedirectRule.java | 16 ++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java index 6829b1c23f8..0fe8a9847d9 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java @@ -60,6 +60,14 @@ public java.lang.String getInternalUrl() { return this.internalUrl; } + public java.lang.String jupyterUrl; + public void setJupyterUrl(java.lang.String jupyterUrl) { + this.jupyterUrl = jupyterUrl; + } + public java.lang.String getJupyterUrl() { + return this.jupyterUrl; + } + public java.lang.String vmInstanceUuid; public void setVmInstanceUuid(java.lang.String vmInstanceUuid) { this.vmInstanceUuid = vmInstanceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/NginxRedirectRule.java b/sdk/src/main/java/org/zstack/sdk/NginxRedirectRule.java index edafa411d8a..8878b46441a 100644 --- a/sdk/src/main/java/org/zstack/sdk/NginxRedirectRule.java +++ b/sdk/src/main/java/org/zstack/sdk/NginxRedirectRule.java @@ -20,6 +20,14 @@ public java.lang.String getUuid() { return this.uuid; } + public java.lang.String jupyterUrl; + public void setJupyterUrl(java.lang.String jupyterUrl) { + this.jupyterUrl = jupyterUrl; + } + public java.lang.String getJupyterUrl() { + return this.jupyterUrl; + } + public java.lang.String currentUrl; public void setCurrentUrl(java.lang.String currentUrl) { this.currentUrl = currentUrl; @@ -28,4 +36,12 @@ public java.lang.String getCurrentUrl() { return this.currentUrl; } + public java.lang.String currentJupyterUrl; + public void setCurrentJupyterUrl(java.lang.String currentJupyterUrl) { + this.currentJupyterUrl = currentJupyterUrl; + } + public java.lang.String getCurrentJupyterUrl() { + return this.currentJupyterUrl; + } + } From 37e4021d34afc3ab16910520fcb544cca9a9e453 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 23 Sep 2024 19:02:41 +0800 Subject: [PATCH 138/737] [tracker]: introduce batch tracker Resolves: ZSTAC-66285 Change-Id: I637364756b6f7476727075646b7762626a697273 --- .../org/zstack/core/tracker/BatchTracker.java | 159 ++++++++++++++++++ .../core/{tacker => tracker}/PingTracker.java | 0 2 files changed, 159 insertions(+) create mode 100644 core/src/main/java/org/zstack/core/tracker/BatchTracker.java rename core/src/main/java/org/zstack/core/{tacker => tracker}/PingTracker.java (100%) diff --git a/core/src/main/java/org/zstack/core/tracker/BatchTracker.java b/core/src/main/java/org/zstack/core/tracker/BatchTracker.java new file mode 100644 index 00000000000..4b01935e7f9 --- /dev/null +++ b/core/src/main/java/org/zstack/core/tracker/BatchTracker.java @@ -0,0 +1,159 @@ +package org.zstack.core.tracker; + +import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.CoreGlobalProperty; +import org.zstack.core.Platform; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.thread.PeriodicTask; +import org.zstack.core.thread.ThreadFacade; +import org.zstack.header.Component; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.function.Predicate; + +/** + */ +public abstract class BatchTracker implements Component { + public abstract String getResourceName(); + + public abstract long getTaskInterval(); + public abstract void executeTask(List resourceUuids); + public abstract void rescan(); + + private final static CLogger logger = Utils.getLogger(PingTracker.class); + + private final List resourceUuids = Collections.synchronizedList(new ArrayList<>()); + private Future trackerThread = null; + + @Autowired + protected CloudBus bus; + @Autowired + protected ThreadFacade thdf; + + private class Tracker implements PeriodicTask { + @Override + public TimeUnit getTimeUnit() { + return TimeUnit.SECONDS; + } + + @Override + public long getInterval() { + return getTaskInterval(); + } + + @Override + public String getName() { + return String.format("pingTracker-for-%s-managementNode-%s", getResourceName(), Platform.getManagementServerId()); + } + + @Override + public void run() { + try { + synchronized (resourceUuids) { + executeTask(resourceUuids); + } + } catch (Throwable t) { + logger.warn("unhandled throwable", t); + } + } + } + + protected void trackHook(String resourceUuid) { + } + + protected void untrackHook(String resourceUuid) { + } + + protected void startHook() { + } + + protected void pingIntervalChanged() { + startTracker(); + } + + public void track(String resUuid) { + synchronized (resourceUuids) { + if (!resourceUuids.contains(resUuid)) { + resourceUuids.add(resUuid); + trackHook(resUuid); + logger.debug(String.format("start tracking %s[uuid:%s]", getResourceName(), resUuid)); + } + } + } + + public void untrackIf(Predicate predicate) { + synchronized (resourceUuids) { + resourceUuids.removeIf(predicate); + } + } + + public void untrackAll() { + synchronized (resourceUuids) { + resourceUuids.clear(); + logger.debug(String.format("untrack all %s", getResourceName())); + } + } + + public void untrack(String resUuid) { + synchronized (resourceUuids) { + resourceUuids.remove(resUuid); + untrackHook(resUuid); + logger.debug(String.format("stop tracking %s[uuid:%s]", getResourceName(), resUuid)); + } + } + + public void track(Collection resUuids) { + synchronized (resourceUuids) { + for (String resUuid : resUuids) { + if (!resourceUuids.contains(resUuid)) { + resourceUuids.add(resUuid); + trackHook(resUuid); + logger.debug(String.format("start tracking %s[uuid:%s]", getResourceName(), resUuid)); + } + } + } + } + + public void untrack(Collection resUuids) { + synchronized (resourceUuids) { + for (String resUuid : resUuids) { + resourceUuids.remove(resUuid); + untrackHook(resUuid); + logger.debug(String.format("stop tracking %s[uuid:%s]", getResourceName(), resUuid)); + } + } + } + + protected synchronized void startTracker() { + if (trackerThread != null) { + trackerThread.cancel(true); + } + + if (CoreGlobalProperty.UNIT_TEST_ON) { + trackerThread = thdf.submitPeriodicTask(new Tracker(), getTaskInterval()); + } else { + trackerThread = thdf.submitPeriodicTask(new Tracker(), (long) getTaskInterval() + new Random().nextInt(30)); + } + } + + @Override + public boolean start() { + startTracker(); + startHook(); + return true; + } + + @Override + public boolean stop() { + trackerThread.cancel(true); + return true; + } +} diff --git a/core/src/main/java/org/zstack/core/tacker/PingTracker.java b/core/src/main/java/org/zstack/core/tracker/PingTracker.java similarity index 100% rename from core/src/main/java/org/zstack/core/tacker/PingTracker.java rename to core/src/main/java/org/zstack/core/tracker/PingTracker.java From 503c010bd6456f3f9593851e389d0ca714a4030a Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 23 Sep 2024 19:02:59 +0800 Subject: [PATCH 139/737] [storage]: fix typo, change 'tacker' to 'tracker' Resolves: ZSTAC-66285 Change-Id: I6e697470626f727569737564766b6961776c6168 --- .../main/java/org/zstack/console/ConsoleProxyAgentTracker.java | 2 +- core/src/main/java/org/zstack/core/tracker/PingTracker.java | 2 +- .../network/service/virtualrouter/VirtualRouterPingTracker.java | 2 +- .../org/zstack/storage/backup/BackupStoragePingTracker.java | 2 +- .../org/zstack/storage/primary/PrimaryStoragePingTracker.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/console/src/main/java/org/zstack/console/ConsoleProxyAgentTracker.java b/console/src/main/java/org/zstack/console/ConsoleProxyAgentTracker.java index 36b20f540d4..a7b989662a5 100755 --- a/console/src/main/java/org/zstack/console/ConsoleProxyAgentTracker.java +++ b/console/src/main/java/org/zstack/console/ConsoleProxyAgentTracker.java @@ -4,7 +4,7 @@ import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.config.GlobalConfig; import org.zstack.core.config.GlobalConfigUpdateExtensionPoint; -import org.zstack.core.tacker.PingTracker; +import org.zstack.core.tracker.PingTracker; import org.zstack.header.console.ConsoleBackend; import org.zstack.header.console.PingConsoleProxyAgentMsg; import org.zstack.header.console.PingConsoleProxyAgentReply; diff --git a/core/src/main/java/org/zstack/core/tracker/PingTracker.java b/core/src/main/java/org/zstack/core/tracker/PingTracker.java index e8dac988066..5f0ec83b2ed 100755 --- a/core/src/main/java/org/zstack/core/tracker/PingTracker.java +++ b/core/src/main/java/org/zstack/core/tracker/PingTracker.java @@ -1,4 +1,4 @@ -package org.zstack.core.tacker; +package org.zstack.core.tracker; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.CoreGlobalProperty; diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterPingTracker.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterPingTracker.java index 03a1586d81e..1cde54cbce6 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterPingTracker.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterPingTracker.java @@ -10,7 +10,7 @@ import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.core.db.SimpleQuery; -import org.zstack.core.tacker.PingTracker; +import org.zstack.core.tracker.PingTracker; import org.zstack.core.thread.AsyncThread; import org.zstack.header.managementnode.ManagementNodeChangeListener; import org.zstack.header.managementnode.ManagementNodeInventory; diff --git a/storage/src/main/java/org/zstack/storage/backup/BackupStoragePingTracker.java b/storage/src/main/java/org/zstack/storage/backup/BackupStoragePingTracker.java index d338026429e..c4e35a38ca2 100755 --- a/storage/src/main/java/org/zstack/storage/backup/BackupStoragePingTracker.java +++ b/storage/src/main/java/org/zstack/storage/backup/BackupStoragePingTracker.java @@ -9,7 +9,7 @@ import org.zstack.core.config.GlobalConfigUpdateExtensionPoint; import org.zstack.core.db.Q; import org.zstack.core.db.SQLBatch; -import org.zstack.core.tacker.PingTracker; +import org.zstack.core.tracker.PingTracker; import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.managementnode.ManagementNodeChangeListener; diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStoragePingTracker.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStoragePingTracker.java index f5464f71e48..697c94319c7 100755 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStoragePingTracker.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStoragePingTracker.java @@ -6,7 +6,7 @@ import org.zstack.core.config.GlobalConfig; import org.zstack.core.config.GlobalConfigUpdateExtensionPoint; import org.zstack.core.db.SQLBatch; -import org.zstack.core.tacker.PingTracker; +import org.zstack.core.tracker.PingTracker; import org.zstack.header.managementnode.ManagementNodeChangeListener; import org.zstack.header.managementnode.ManagementNodeInventory; import org.zstack.header.managementnode.ManagementNodeReadyExtensionPoint; From 9b974c7ff637d6c0d1a6c22b66c2eaec73dead39 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 24 Sep 2024 10:13:09 +0800 Subject: [PATCH 140/737] [utils]: ai module related code optimizing - simplify SizeUtils - introduce BatchTracker Related: ZSTAC-66285 Change-Id: I6b636d6d67616b71687a746d6c74717168726a6c [tracker]: fix BatchTracker Change-Id: I736469666b69766b7661686d6978746f7a637374 Signed-off-by: AlanJager --- conf/db/upgrade/V5.1.20__schema.sql | 11 ++++++- .../org/zstack/core/tracker/BatchTracker.java | 16 ++++++++-- .../main/java/org/zstack/utils/SizeUtils.java | 30 +++++++++++++++++-- .../org/zstack/utils/data/NumberUtils.java | 10 +++++++ .../org/zstack/utils/data/UnitNumber.java | 27 +++++++++++++++-- 5 files changed, 85 insertions(+), 9 deletions(-) diff --git a/conf/db/upgrade/V5.1.20__schema.sql b/conf/db/upgrade/V5.1.20__schema.sql index 0dcae4a7da1..248186273ec 100644 --- a/conf/db/upgrade/V5.1.20__schema.sql +++ b/conf/db/upgrade/V5.1.20__schema.sql @@ -17,4 +17,13 @@ BEGIN COMMIT; END // DELIMITER ; -CALL UpdateK8sResourceYaml(); \ No newline at end of file +CALL UpdateK8sResourceYaml(); + +CREATE TABLE IF NOT EXISTS `zstack`.`ApplicationDevelopmentServiceVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) NULL, + `modelServiceGroupUuid` varchar(32) NULL, + `modelServiceUuid` varchar(32) NULL, + `deploymentStatus` varchar(255) NULL, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/core/src/main/java/org/zstack/core/tracker/BatchTracker.java b/core/src/main/java/org/zstack/core/tracker/BatchTracker.java index 4b01935e7f9..51242251514 100644 --- a/core/src/main/java/org/zstack/core/tracker/BatchTracker.java +++ b/core/src/main/java/org/zstack/core/tracker/BatchTracker.java @@ -57,6 +57,7 @@ public String getName() { @Override public void run() { try { + executionHook(); synchronized (resourceUuids) { executeTask(resourceUuids); } @@ -66,6 +67,10 @@ public void run() { } } + protected void executionHook() { + + } + protected void trackHook(String resourceUuid) { } @@ -75,7 +80,7 @@ protected void untrackHook(String resourceUuid) { protected void startHook() { } - protected void pingIntervalChanged() { + protected void taskIntervalChanged() { startTracker(); } @@ -153,7 +158,14 @@ public boolean start() { @Override public boolean stop() { - trackerThread.cancel(true); + if (trackerThread != null) { + trackerThread.cancel(true); + } + return true; } + + public List getResourceUuids() { + return resourceUuids; + } } diff --git a/utils/src/main/java/org/zstack/utils/SizeUtils.java b/utils/src/main/java/org/zstack/utils/SizeUtils.java index d2c06577fb2..c160102cd37 100755 --- a/utils/src/main/java/org/zstack/utils/SizeUtils.java +++ b/utils/src/main/java/org/zstack/utils/SizeUtils.java @@ -53,7 +53,7 @@ public static boolean isPositive(Number i){ */ public static boolean isSizeString2(String str) { final UnitNumber numeric = NumberUtils.ofUnitNumber(str); - return numeric == null ? false : isSize2(numeric); + return numeric != null && isSize2(numeric); } /** @@ -79,7 +79,7 @@ public static boolean isSizeString2(String str) { */ public static boolean isSizeString(String str) { final UnitNumber numeric = NumberUtils.ofUnitNumber(str); - return numeric == null ? false : isSize(numeric); + return numeric != null && isSize(numeric); } public static boolean isSize2(UnitNumber numeric) { @@ -98,11 +98,35 @@ public static boolean isSize(UnitNumber numeric, Collection matchedUnits return matchedUnits.contains(numeric.units); } + public static double sizeStringToBytes2(String str) { + final UnitNumber numeric = NumberUtils.ofUnitNumberOrThrow2(str); + String suffix = numeric.units; + double size = numeric.doubleFormatNumber; + if (suffix.isEmpty()) { + return size; + } + + switch (suffix) { + case T_SUFFIX: case t_SUFFIX: case TB_SUFFIX: case TIB_SUFFIX: + return SizeUnit.TERABYTE.toByte(size); + case G_SUFFIX: case g_SUFFIX: case GB_SUFFIX: case GIB_SUFFIX: + return SizeUnit.GIGABYTE.toByte(size); + case M_SUFFIX: case m_SUFFIX: case MB_SUFFIX: case MIB_SUFFIX: + return SizeUnit.MEGABYTE.toByte(size); + case K_SUFFIX: case k_SUFFIX: case KB_SUFFIX: case KIB_SUFFIX: + return SizeUnit.KILOBYTE.toByte(size); + case B_SUFFIX: case b_SUFFIX: + return SizeUnit.BYTE.toByte(size); + } + + throw new RuntimeException(String.format("should not be here, input size string: %s, parsed size: %s, parsed unit: %s", str, size, suffix)); + } + public static long sizeStringToBytes(String str) { final UnitNumber numeric = NumberUtils.ofUnitNumberOrThrow(str); String suffix = numeric.units; long size = numeric.number; - if (suffix.length() == 0) { + if (suffix.isEmpty()) { return size; } diff --git a/utils/src/main/java/org/zstack/utils/data/NumberUtils.java b/utils/src/main/java/org/zstack/utils/data/NumberUtils.java index 380fd623153..a730517182e 100644 --- a/utils/src/main/java/org/zstack/utils/data/NumberUtils.java +++ b/utils/src/main/java/org/zstack/utils/data/NumberUtils.java @@ -21,4 +21,14 @@ public static boolean isPositive(Number i){ public static UnitNumber ofUnitNumberOrThrow(String text) throws NumberFormatException { return UnitNumber.valueOf(text); } + + /** + * support float type size string like: 12.39 GiB + * @param text size string + * @return UnitNumber instance + * @throws NumberFormatException + */ + public static UnitNumber ofUnitNumberOrThrow2(String text) throws NumberFormatException { + return UnitNumber.valueOfWithFloatResultOrNull(text); + } } diff --git a/utils/src/main/java/org/zstack/utils/data/UnitNumber.java b/utils/src/main/java/org/zstack/utils/data/UnitNumber.java index 124345fb598..ed528313c5a 100644 --- a/utils/src/main/java/org/zstack/utils/data/UnitNumber.java +++ b/utils/src/main/java/org/zstack/utils/data/UnitNumber.java @@ -9,10 +9,18 @@ */ public class UnitNumber { public final long number; + public final Double doubleFormatNumber; public final String units; public UnitNumber(long number, String units) { this.number = number; + this.doubleFormatNumber = null; + this.units = units; + } + + public UnitNumber(double doubleFormatNumber, String units) { + this.number = 0L; + this.doubleFormatNumber = doubleFormatNumber; this.units = units; } @@ -27,11 +35,19 @@ public static UnitNumber valueOf(String text) throws NumberFormatException { return numeric; } + public static UnitNumber valueOfWithFloatResultOrNull(String text) { + return valueOfOrNull(text, true); + } + /** * @param text example: 50G / -60TB ... */ public static UnitNumber valueOfOrNull(String text) { - if (text.length() == 0) { + return valueOfOrNull(text, false); + } + + public static UnitNumber valueOfOrNull(String text, boolean withFloat) { + if (text.isEmpty()) { return null; } @@ -43,7 +59,7 @@ public static UnitNumber valueOfOrNull(String text) { for (; i < chars.length; i++) { char ch = chars[i]; - if (!Character.isDigit(ch)) { + if (!Character.isDigit(ch) && ch != '.') { break; } } @@ -51,7 +67,12 @@ public static UnitNumber valueOfOrNull(String text) { if (i == 0 || chars[0] == '-' && i == 1) { return null; } - return new UnitNumber(Long.parseLong(text.substring(0, i)), text.substring(i).trim()); + + if (withFloat) { + return new UnitNumber(Double.parseDouble(text.substring(0, i)), text.substring(i).trim()); + } else { + return new UnitNumber(Long.parseLong(text.substring(0, i)), text.substring(i).trim()); + } } public UnitNumber setNumber(long number) { From 28283f53f110073f96ea3a95fdb60f509ad36979 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 25 Sep 2024 12:12:01 +0800 Subject: [PATCH 141/737] [conf]: introduce application deployment service add fk set null for undeployed application DBImpact Change-Id: I776c6b6d77697978786c676e6b646173626b7a6b Signed-off-by: AlanJager --- conf/db/upgrade/V5.1.20__schema.sql | 3 +- sdk/src/main/java/SourceClassMap.java | 2 + ...pplicationDevelopmentServiceInventory.java | 47 ++++++ .../DeployAppDevelopmentServiceAction.java | 146 ++++++++++++++++++ .../DeployAppDevelopmentServiceResult.java | 23 +++ .../sdk/DeployModelEvalServiceAction.java | 2 +- .../zstack/sdk/DeployModelServiceAction.java | 2 +- ...ryApplicationDevelopmentServiceAction.java | 75 +++++++++ ...ryApplicationDevelopmentServiceResult.java | 14 ++ .../java/org/zstack/testlib/ApiHelper.groovy | 56 +++++++ 10 files changed, 367 insertions(+), 3 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/ApplicationDevelopmentServiceInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceResult.java diff --git a/conf/db/upgrade/V5.1.20__schema.sql b/conf/db/upgrade/V5.1.20__schema.sql index 248186273ec..b3c2b48824c 100644 --- a/conf/db/upgrade/V5.1.20__schema.sql +++ b/conf/db/upgrade/V5.1.20__schema.sql @@ -24,6 +24,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ApplicationDevelopmentServiceVO` ( `name` varchar(255) NULL, `modelServiceGroupUuid` varchar(32) NULL, `modelServiceUuid` varchar(32) NULL, - `deploymentStatus` varchar(255) NULL, + `deploymentStatus` varchar(255) NOT NULL, + CONSTRAINT fkApplicationDevelopmentServiceVOModelServiceGroupVO FOREIGN KEY (modelServiceGroupUuid) REFERENCES ModelServiceInstanceGroupVO (uuid) ON DELETE SET NULL, PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index a526a810b40..ac179f2f663 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -8,6 +8,7 @@ public class SourceClassMap { put("org.zstack.accessKey.AccessKeyInventory", "org.zstack.sdk.AccessKeyInventory"); put("org.zstack.accessKey.AccessKeyState", "org.zstack.sdk.AccessKeyState"); put("org.zstack.ai.NginxRedirectRule", "org.zstack.sdk.NginxRedirectRule"); + put("org.zstack.ai.entity.ApplicationDevelopmentServiceInventory", "org.zstack.sdk.ApplicationDevelopmentServiceInventory"); put("org.zstack.ai.entity.DatasetInventory", "org.zstack.sdk.DatasetInventory"); put("org.zstack.ai.entity.ModelCenterInventory", "org.zstack.sdk.ModelCenterInventory"); put("org.zstack.ai.entity.ModelEvalServiceInstanceGroupInventory", "org.zstack.sdk.ModelEvalServiceInstanceGroupInventory"); @@ -813,6 +814,7 @@ public class SourceClassMap { put("org.zstack.sdk.AppBuildSystemInventory", "org.zstack.header.buildsystem.AppBuildSystemInventory"); put("org.zstack.sdk.AppBuildSystemZoneRefInventory", "org.zstack.header.buildsystem.AppBuildSystemZoneRefInventory"); put("org.zstack.sdk.ApplianceVmInventory", "org.zstack.appliancevm.ApplianceVmInventory"); + put("org.zstack.sdk.ApplicationDevelopmentServiceInventory", "org.zstack.ai.entity.ApplicationDevelopmentServiceInventory"); put("org.zstack.sdk.AttachTagResult", "org.zstack.tag2.AttachTagResult"); put("org.zstack.sdk.AutoScalingGroupActivityInventory", "org.zstack.autoscaling.group.activity.AutoScalingGroupActivityInventory"); put("org.zstack.sdk.AutoScalingGroupInstanceInventory", "org.zstack.autoscaling.group.instance.AutoScalingGroupInstanceInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/ApplicationDevelopmentServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ApplicationDevelopmentServiceInventory.java new file mode 100644 index 00000000000..3e335bb48ef --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ApplicationDevelopmentServiceInventory.java @@ -0,0 +1,47 @@ +package org.zstack.sdk; + + + +public class ApplicationDevelopmentServiceInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String modelServiceGroupUuid; + public void setModelServiceGroupUuid(java.lang.String modelServiceGroupUuid) { + this.modelServiceGroupUuid = modelServiceGroupUuid; + } + public java.lang.String getModelServiceGroupUuid() { + return this.modelServiceGroupUuid; + } + + public java.lang.String modelServiceUuid; + public void setModelServiceUuid(java.lang.String modelServiceUuid) { + this.modelServiceUuid = modelServiceUuid; + } + public java.lang.String getModelServiceUuid() { + return this.modelServiceUuid; + } + + public java.lang.String deploymentStatus; + public void setDeploymentStatus(java.lang.String deploymentStatus) { + this.deploymentStatus = deploymentStatus; + } + public java.lang.String getDeploymentStatus() { + return this.deploymentStatus; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java new file mode 100644 index 00000000000..a5f25e52dab --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java @@ -0,0 +1,146 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeployAppDevelopmentServiceAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeployAppDevelopmentServiceResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String appServiceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmImageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String primaryStorageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List datasetUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelServiceGroupUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String dockerImage; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer cpuNum; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = true, validValues = {"VirtualMachine","Container"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long memorySize; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List l3NetworkUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer serviceBootUptime; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeployAppDevelopmentServiceResult value = res.getResult(org.zstack.sdk.DeployAppDevelopmentServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.DeployAppDevelopmentServiceResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/ai/model-services/app/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "deployAppDevelopmentService"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceResult.java b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceResult.java new file mode 100644 index 00000000000..6ca470937a2 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceResult.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceInstanceGroupInventory; +import org.zstack.sdk.ApplicationDevelopmentServiceInventory; + +public class DeployAppDevelopmentServiceResult { + public ModelServiceInstanceGroupInventory inventory; + public void setInventory(ModelServiceInstanceGroupInventory inventory) { + this.inventory = inventory; + } + public ModelServiceInstanceGroupInventory getInventory() { + return this.inventory; + } + + public ApplicationDevelopmentServiceInventory app; + public void setApp(ApplicationDevelopmentServiceInventory app) { + this.app = app; + } + public ApplicationDevelopmentServiceInventory getApp() { + return this.app; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java index 2e2bbbda7b7..6be9d50e5eb 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java @@ -46,7 +46,7 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Float repetitionPenalty; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java index 0c1eed32bf4..2cdd64afb28 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java @@ -25,7 +25,7 @@ public Result throwExceptionIfError() { } } - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceAction.java new file mode 100644 index 00000000000..f6248226fc0 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryApplicationDevelopmentServiceAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryApplicationDevelopmentServiceResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryApplicationDevelopmentServiceResult value = res.getResult(org.zstack.sdk.QueryApplicationDevelopmentServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryApplicationDevelopmentServiceResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/ai/model-services/app/"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceResult.java b/sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceResult.java new file mode 100644 index 00000000000..3393e7b390d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class QueryApplicationDevelopmentServiceResult { + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index f98b67ccc96..a3067e6aa8b 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -17081,6 +17081,33 @@ abstract class ApiHelper { } + def deployAppDevelopmentService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeployAppDevelopmentServiceAction.class) Closure c) { + def a = new org.zstack.sdk.DeployAppDevelopmentServiceAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def deployModelEvalService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeployModelEvalServiceAction.class) Closure c) { def a = new org.zstack.sdk.DeployModelEvalServiceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -27416,6 +27443,35 @@ abstract class ApiHelper { } + def queryApplicationDevelopmentService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryApplicationDevelopmentServiceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryApplicationDevelopmentServiceAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryAutoScalingGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAutoScalingGroupAction.class) Closure c) { def a = new org.zstack.sdk.QueryAutoScalingGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From ab0a4ee023389ce49d4f5bda05fc2dd48436de0b Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 26 Sep 2024 14:24:15 +0800 Subject: [PATCH 142/737] [sdk]: update sdk Resolves: ZSTAC-69417 Change-Id: I68696a7176707a7a6d6e6b72666a7461636d656b Signed-off-by: AlanJager --- sdk/src/main/java/org/zstack/sdk/AddModelAction.java | 3 +++ .../main/java/org/zstack/sdk/AddModelServiceAction.java | 3 +++ .../sdk/QueryApplicationDevelopmentServiceResult.java | 8 ++++++++ 3 files changed, 14 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelAction.java index ac50b8c07a3..2dc39539fb1 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelAction.java @@ -58,6 +58,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String version; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelServiceUuids; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index ff1f2fbdcdf..d5e09214c9b 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -76,6 +76,9 @@ public Result throwExceptionIfError() { @Param(required = false, validValues = {"Other","Bentoml","HuggingFace"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String framework = "Other"; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelUuids; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceResult.java b/sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceResult.java index 3393e7b390d..6437b47dd52 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceResult.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceResult.java @@ -3,6 +3,14 @@ public class QueryApplicationDevelopmentServiceResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + public java.lang.Long total; public void setTotal(java.lang.Long total) { this.total = total; From a2a773659a8fa302317998dc270628deb4c953fe Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 27 Sep 2024 13:14:07 +0800 Subject: [PATCH 143/737] [sdk]: update sdk Resolves: ZSTAC-69417 Change-Id: I68696a7176707a7a6d6e6b72666a7461636d656b Signed-off-by: AlanJager --- .../java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java index a5f25e52dab..2b5fe05e8fd 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java @@ -136,7 +136,7 @@ protected Map getNonAPIParameterMap() { protected RestInfo getRestInfo() { RestInfo info = new RestInfo(); info.httpMethod = "PUT"; - info.path = "/ai/model-services/app/{uuid}"; + info.path = "/ai/model-services/app/"; info.needSession = true; info.needPoll = true; info.parameterName = "deployAppDevelopmentService"; From 18274c73a526da2d5916a080952ce62d6d68b4cb Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Tue, 8 Oct 2024 13:22:41 +0800 Subject: [PATCH 144/737] [conf]: Do not upgrade k8s yaml if column is not null DBImpact Resolves: ZSTAC-70156 Change-Id: I74726f656b6369747675617a666b69626e76766a --- conf/db/upgrade/V5.1.20__schema.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.1.20__schema.sql b/conf/db/upgrade/V5.1.20__schema.sql index b3c2b48824c..48d4335b6f8 100644 --- a/conf/db/upgrade/V5.1.20__schema.sql +++ b/conf/db/upgrade/V5.1.20__schema.sql @@ -11,7 +11,7 @@ BEGIN UPDATE ModelServiceInstanceVO SET k8sResourceYaml = yaml - WHERE vmInstanceUuid IS NULL; + WHERE vmInstanceUuid IS NULL AND k8sResourceYaml IS NULL AND yaml IS NOT NULL; -- 提交事务 COMMIT; From c0815a82e1f837667e14c0cb17f80de244b36cdd Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 10 Oct 2024 11:38:01 +0800 Subject: [PATCH 145/737] [message]: introduce BatchOperationResult to APIBatchRequest - Add a generic BatchOperationResult to simplify the implementation of batch API operations - Update sdk and api helper - Check collectResult of APIBatchRequest's return Resolves: ZSTAC-70210 Change-Id: I6563717367767870637a7863626c7774637a706c Signed-off-by: AlanJager --- .../header/message/APIBatchRequest.java | 32 ++++++ .../main/java/org/zstack/rest/RestServer.java | 1 + sdk/src/main/java/SourceClassMap.java | 2 + .../org/zstack/sdk/BatchOperationResult.java | 31 ++++++ .../org/zstack/sdk/DeleteModelsAction.java | 104 ++++++++++++++++++ .../org/zstack/sdk/DeleteModelsResult.java | 14 +++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ 7 files changed, 211 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/BatchOperationResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteModelsAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteModelsResult.java diff --git a/header/src/main/java/org/zstack/header/message/APIBatchRequest.java b/header/src/main/java/org/zstack/header/message/APIBatchRequest.java index 7759b97746a..41125608868 100644 --- a/header/src/main/java/org/zstack/header/message/APIBatchRequest.java +++ b/header/src/main/java/org/zstack/header/message/APIBatchRequest.java @@ -1,6 +1,38 @@ package org.zstack.header.message; +import org.zstack.header.errorcode.ErrorCode; + public interface APIBatchRequest { + class BatchOperationResult { + private String uuid; + private boolean success; + private ErrorCode error; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public ErrorCode getError() { + return error; + } + + public void setError(ErrorCode error) { + this.error = error; + } + } + class Result { private int totalCount; private int successCount; diff --git a/rest/src/main/java/org/zstack/rest/RestServer.java b/rest/src/main/java/org/zstack/rest/RestServer.java index 8d4558b7b8c..04d1c838488 100755 --- a/rest/src/main/java/org/zstack/rest/RestServer.java +++ b/rest/src/main/java/org/zstack/rest/RestServer.java @@ -349,6 +349,7 @@ private void callWebHook(RequestData d) throws IllegalAccessException, NoSuchMet if (evt.isSuccess()) { APIBatchRequest.Result batchResult = ((APIBatchRequest) d.apiMessage).collectResult(d.apiMessage, evt); + DebugUtils.Assert(batchResult != null, "APIBatchRequest.collectResult should not return null"); RestConstants.Batch result; if (batchResult.getSuccessCount() == 0) { result = RestConstants.Batch.FAIL; diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index ac179f2f663..9ca6d398cbb 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -277,6 +277,7 @@ public class SourceClassMap { put("org.zstack.header.longjob.LongJobInventory", "org.zstack.sdk.LongJobInventory"); put("org.zstack.header.longjob.LongJobState", "org.zstack.sdk.LongJobState"); put("org.zstack.header.managementnode.ManagementNodeInventory", "org.zstack.sdk.ManagementNodeInventory"); + put("org.zstack.header.message.APIBatchRequest$BatchOperationResult", "org.zstack.sdk.BatchOperationResult"); put("org.zstack.header.network.l2.L2NetworkData", "org.zstack.sdk.L2NetworkData"); put("org.zstack.header.network.l2.L2NetworkInventory", "org.zstack.sdk.L2NetworkInventory"); put("org.zstack.header.network.l2.L2VlanNetworkInventory", "org.zstack.sdk.L2VlanNetworkInventory"); @@ -857,6 +858,7 @@ public class SourceClassMap { put("org.zstack.sdk.BaremetalPxeServerInventory", "org.zstack.header.baremetal.pxeserver.BaremetalPxeServerInventory"); put("org.zstack.sdk.BaremetalVlanNicInventory", "org.zstack.header.baremetal.network.BaremetalVlanNicInventory"); put("org.zstack.sdk.BatchDeleteVolumeSnapshotStruct", "org.zstack.header.storage.snapshot.BatchDeleteVolumeSnapshotStruct"); + put("org.zstack.sdk.BatchOperationResult", "org.zstack.header.message.APIBatchRequest$BatchOperationResult"); put("org.zstack.sdk.BillingInventory", "org.zstack.billing.generator.BillingInventory"); put("org.zstack.sdk.BlockPrimaryStorageInventory", "org.zstack.storage.primary.block.BlockPrimaryStorageInventory"); put("org.zstack.sdk.BlockVolumeInventory", "org.zstack.header.volume.block.BlockVolumeInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/BatchOperationResult.java b/sdk/src/main/java/org/zstack/sdk/BatchOperationResult.java new file mode 100644 index 00000000000..95510649f31 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/BatchOperationResult.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ErrorCode; + +public class BatchOperationResult { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public boolean success; + public void setSuccess(boolean success) { + this.success = success; + } + public boolean getSuccess() { + return this.success; + } + + public ErrorCode error; + public void setError(ErrorCode error) { + this.error = error; + } + public ErrorCode getError() { + return this.error; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelsAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelsAction.java new file mode 100644 index 00000000000..7a97a4c55ee --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelsAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteModelsAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeleteModelsResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List uuids; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeleteModelsResult value = res.getResult(org.zstack.sdk.DeleteModelsResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteModelsResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/ai/models"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelsResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelsResult.java new file mode 100644 index 00000000000..dda7c271701 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelsResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class DeleteModelsResult { + public java.util.List results; + public void setResults(java.util.List results) { + this.results = results; + } + public java.util.List getResults() { + return this.results; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index a3067e6aa8b..233fdc4b4ff 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -14840,6 +14840,33 @@ abstract class ApiHelper { } + def deleteModels(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelsAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteModelsAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def deleteMonitorTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteMonitorTriggerAction.class) Closure c) { def a = new org.zstack.sdk.DeleteMonitorTriggerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 1b51ef9d86ce87c1d74ef6fdc9eb9bff92bf71a0 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 14 Oct 2024 11:42:05 +0800 Subject: [PATCH 146/737] [sdk]: update sdk Resolves: ZSTAC-70224 Change-Id: I7771776274657772757a6c6e7a656763666b7069 Signed-off-by: AlanJager --- .../sdk/ApplicationDevelopmentServiceInventory.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/sdk/src/main/java/org/zstack/sdk/ApplicationDevelopmentServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ApplicationDevelopmentServiceInventory.java index 3e335bb48ef..afa98d81a41 100644 --- a/sdk/src/main/java/org/zstack/sdk/ApplicationDevelopmentServiceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ApplicationDevelopmentServiceInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk; - +import org.zstack.sdk.ModelServiceInventory; public class ApplicationDevelopmentServiceInventory { @@ -44,4 +44,12 @@ public java.lang.String getDeploymentStatus() { return this.deploymentStatus; } + public ModelServiceInventory service; + public void setService(ModelServiceInventory service) { + this.service = service; + } + public ModelServiceInventory getService() { + return this.service; + } + } From 2f5c5c11af604ea0fdb29147068e458374540070 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Mon, 14 Oct 2024 08:37:01 +0000 Subject: [PATCH 147/737] [sdk]: Update sdk & add new column Resolves: ZSTAC-69914 Change-Id: I6d707476796c70646b74727874657078676c6677 --- conf/db/upgrade/V5.1.20__schema.sql | 3 ++- .../org/zstack/sdk/ModelServiceInstanceInventory.java | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.1.20__schema.sql b/conf/db/upgrade/V5.1.20__schema.sql index 48d4335b6f8..489f21cc4be 100644 --- a/conf/db/upgrade/V5.1.20__schema.sql +++ b/conf/db/upgrade/V5.1.20__schema.sql @@ -1,6 +1,7 @@ ALTER TABLE `zstack`.`ModelCenterVO` ADD COLUMN containerStorageNetwork varchar(2048) DEFAULT NULL; ALTER TABLE `zstack`.`ModelServiceInstanceVO` ADD COLUMN internalUrl varchar(2048) DEFAULT NULL; ALTER TABLE `zstack`.`ModelServiceInstanceVO` ADD COLUMN k8sResourceYaml mediumtext DEFAULT NULL; +ALTER TABLE `zstack`.`ModelServiceInstanceVO` ADD COLUMN urlMaps mediumtext DEFAULT NULL; DROP PROCEDURE IF EXISTS UpdateK8sResourceYaml; DELIMITER // @@ -27,4 +28,4 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ApplicationDevelopmentServiceVO` ( `deploymentStatus` varchar(255) NOT NULL, CONSTRAINT fkApplicationDevelopmentServiceVOModelServiceGroupVO FOREIGN KEY (modelServiceGroupUuid) REFERENCES ModelServiceInstanceGroupVO (uuid) ON DELETE SET NULL, PRIMARY KEY (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java index 0fe8a9847d9..84cabea7bb8 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java @@ -52,6 +52,14 @@ public java.lang.String getUrl() { return this.url; } + public java.util.Map urlMaps; + public void setUrlMaps(java.util.Map urlMaps) { + this.urlMaps = urlMaps; + } + public java.util.Map getUrlMaps() { + return this.urlMaps; + } + public java.lang.String internalUrl; public void setInternalUrl(java.lang.String internalUrl) { this.internalUrl = internalUrl; From a9888684dbdd280857c389c3e8a15e4519b01851 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 17 Oct 2024 17:14:56 +0800 Subject: [PATCH 148/737] [conf]: Introduce ModelCenterCapacityVO Add ModelCenterCapacityVO sql schema and update sdk DBImpact Resolves: ZSTAC-70465 Change-Id: I6b6c746b6b6f6d756464756b77756f797a79636b Signed-off-by: AlanJager --- conf/db/upgrade/V5.1.20__schema.sql | 14 +++- sdk/src/main/java/SourceClassMap.java | 2 + .../sdk/ModelCenterCapacityInventory.java | 71 +++++++++++++++++++ .../org/zstack/sdk/ModelCenterInventory.java | 10 ++- 4 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/ModelCenterCapacityInventory.java diff --git a/conf/db/upgrade/V5.1.20__schema.sql b/conf/db/upgrade/V5.1.20__schema.sql index 489f21cc4be..6b7611058f8 100644 --- a/conf/db/upgrade/V5.1.20__schema.sql +++ b/conf/db/upgrade/V5.1.20__schema.sql @@ -27,5 +27,17 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ApplicationDevelopmentServiceVO` ( `modelServiceUuid` varchar(32) NULL, `deploymentStatus` varchar(255) NOT NULL, CONSTRAINT fkApplicationDevelopmentServiceVOModelServiceGroupVO FOREIGN KEY (modelServiceGroupUuid) REFERENCES ModelServiceInstanceGroupVO (uuid) ON DELETE SET NULL, - PRIMARY KEY (`uuid`) + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelCenterCapacityVO` ( + `uuid` varchar(32) NOT NULL, + `modelUsedCapacity` bigint NULL, + `modelServiceUsedCapacity` bigint NULL, + `datasetUsedCapacity` bigint NULL, + `fineTuneUsedCapacity` bigint NULL, + `modelEvaluationUsedCapacity` bigint NULL, + `installationUsedCapacity` bigint NULL, + `temporaryUsedCapacity` bigint NULL, + PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 9ca6d398cbb..85279f0ed0a 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -10,6 +10,7 @@ public class SourceClassMap { put("org.zstack.ai.NginxRedirectRule", "org.zstack.sdk.NginxRedirectRule"); put("org.zstack.ai.entity.ApplicationDevelopmentServiceInventory", "org.zstack.sdk.ApplicationDevelopmentServiceInventory"); put("org.zstack.ai.entity.DatasetInventory", "org.zstack.sdk.DatasetInventory"); + put("org.zstack.ai.entity.ModelCenterCapacityInventory", "org.zstack.sdk.ModelCenterCapacityInventory"); put("org.zstack.ai.entity.ModelCenterInventory", "org.zstack.sdk.ModelCenterInventory"); put("org.zstack.ai.entity.ModelEvalServiceInstanceGroupInventory", "org.zstack.sdk.ModelEvalServiceInstanceGroupInventory"); put("org.zstack.ai.entity.ModelEvaluationTaskInventory", "org.zstack.sdk.ModelEvaluationTaskInventory"); @@ -1078,6 +1079,7 @@ public class SourceClassMap { put("org.zstack.sdk.MiniStorageResourceReplicationInventory", "org.zstack.storage.primary.ministorage.MiniStorageResourceReplicationInventory"); put("org.zstack.sdk.MiniStorageType", "org.zstack.storage.primary.ministorage.MiniStorageType"); put("org.zstack.sdk.MirrorNetworkUsedIpInventory", "org.zstack.header.portMirror.MirrorNetworkUsedIpInventory"); + put("org.zstack.sdk.ModelCenterCapacityInventory", "org.zstack.ai.entity.ModelCenterCapacityInventory"); put("org.zstack.sdk.ModelCenterInventory", "org.zstack.ai.entity.ModelCenterInventory"); put("org.zstack.sdk.ModelEvalServiceInstanceGroupInventory", "org.zstack.ai.entity.ModelEvalServiceInstanceGroupInventory"); put("org.zstack.sdk.ModelEvaluationTaskInventory", "org.zstack.ai.entity.ModelEvaluationTaskInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/ModelCenterCapacityInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelCenterCapacityInventory.java new file mode 100644 index 00000000000..0a335161b92 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelCenterCapacityInventory.java @@ -0,0 +1,71 @@ +package org.zstack.sdk; + + + +public class ModelCenterCapacityInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public long modelUsedCapacity; + public void setModelUsedCapacity(long modelUsedCapacity) { + this.modelUsedCapacity = modelUsedCapacity; + } + public long getModelUsedCapacity() { + return this.modelUsedCapacity; + } + + public long modelServiceUsedCapacity; + public void setModelServiceUsedCapacity(long modelServiceUsedCapacity) { + this.modelServiceUsedCapacity = modelServiceUsedCapacity; + } + public long getModelServiceUsedCapacity() { + return this.modelServiceUsedCapacity; + } + + public long datasetUsedCapacity; + public void setDatasetUsedCapacity(long datasetUsedCapacity) { + this.datasetUsedCapacity = datasetUsedCapacity; + } + public long getDatasetUsedCapacity() { + return this.datasetUsedCapacity; + } + + public long fineTuneUsedCapacity; + public void setFineTuneUsedCapacity(long fineTuneUsedCapacity) { + this.fineTuneUsedCapacity = fineTuneUsedCapacity; + } + public long getFineTuneUsedCapacity() { + return this.fineTuneUsedCapacity; + } + + public long modelEvaluationUsedCapacity; + public void setModelEvaluationUsedCapacity(long modelEvaluationUsedCapacity) { + this.modelEvaluationUsedCapacity = modelEvaluationUsedCapacity; + } + public long getModelEvaluationUsedCapacity() { + return this.modelEvaluationUsedCapacity; + } + + public long installationUsedCapacity; + public void setInstallationUsedCapacity(long installationUsedCapacity) { + this.installationUsedCapacity = installationUsedCapacity; + } + public long getInstallationUsedCapacity() { + return this.installationUsedCapacity; + } + + public long temporaryUsedCapacity; + public void setTemporaryUsedCapacity(long temporaryUsedCapacity) { + this.temporaryUsedCapacity = temporaryUsedCapacity; + } + public long getTemporaryUsedCapacity() { + return this.temporaryUsedCapacity; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java index d6d882ed85d..3f61596c5b6 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk; - +import org.zstack.sdk.ModelCenterCapacityInventory; public class ModelCenterInventory { @@ -108,6 +108,14 @@ public java.lang.String getContainerNetwork() { return this.containerNetwork; } + public ModelCenterCapacityInventory capacity; + public void setCapacity(ModelCenterCapacityInventory capacity) { + this.capacity = capacity; + } + public ModelCenterCapacityInventory getCapacity() { + return this.capacity; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; From b5a61de0131fc64eb83b71482481efc4dba47db3 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 25 Oct 2024 17:05:32 +0800 Subject: [PATCH 149/737] [sdk]: Update sdk Resolves: ZSTAC-70703 Change-Id: I6b69696b656b6b637a736b6c7470706d74666372 Signed-off-by: AlanJager --- sdk/src/main/java/SourceClassMap.java | 2 + .../java/org/zstack/sdk/ContainerUsage.java | 23 +++++ .../zstack/sdk/GetContainerUsageAction.java | 92 +++++++++++++++++++ .../zstack/sdk/GetContainerUsageResult.java | 14 +++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 ++++++ 5 files changed, 158 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/ContainerUsage.java create mode 100644 sdk/src/main/java/org/zstack/sdk/GetContainerUsageAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/GetContainerUsageResult.java diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 85279f0ed0a..b814bb76485 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -102,6 +102,7 @@ public class SourceClassMap { put("org.zstack.cloudformation.template.struct.ActionStruct", "org.zstack.sdk.ActionStruct"); put("org.zstack.cloudformation.template.struct.ResourceStruct", "org.zstack.sdk.ResourceStruct"); put("org.zstack.cloudformation.template.struct.ResourceType", "org.zstack.sdk.ResourceType"); + put("org.zstack.container.ContainerUsage", "org.zstack.sdk.ContainerUsage"); put("org.zstack.container.entity.ContainerManagementVmInventory", "org.zstack.sdk.ContainerManagementVmInventory"); put("org.zstack.core.config.GlobalConfigInventory", "org.zstack.sdk.GlobalConfigInventory"); put("org.zstack.core.config.GlobalConfigOptions", "org.zstack.sdk.GlobalConfigOptions"); @@ -900,6 +901,7 @@ public class SourceClassMap { put("org.zstack.sdk.ConsoleInventory", "org.zstack.header.console.ConsoleInventory"); put("org.zstack.sdk.ConsoleProxyAgentInventory", "org.zstack.header.console.ConsoleProxyAgentInventory"); put("org.zstack.sdk.ContainerManagementVmInventory", "org.zstack.container.entity.ContainerManagementVmInventory"); + put("org.zstack.sdk.ContainerUsage", "org.zstack.container.ContainerUsage"); put("org.zstack.sdk.ControlStrategy", "org.zstack.loginControl.entity.ControlStrategy"); put("org.zstack.sdk.CpuMemoryCapacityData", "org.zstack.header.allocator.datatypes.CpuMemoryCapacityData"); put("org.zstack.sdk.CreateDataVolumeTemplateFromVolumeSnapshotFailure", "org.zstack.header.image.APICreateDataVolumeTemplateFromVolumeSnapshotEvent$Failure"); diff --git a/sdk/src/main/java/org/zstack/sdk/ContainerUsage.java b/sdk/src/main/java/org/zstack/sdk/ContainerUsage.java new file mode 100644 index 00000000000..6bc567e2af8 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ContainerUsage.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class ContainerUsage { + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.Long value; + public void setValue(java.lang.Long value) { + this.value = value; + } + public java.lang.Long getValue() { + return this.value; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetContainerUsageAction.java b/sdk/src/main/java/org/zstack/sdk/GetContainerUsageAction.java new file mode 100644 index 00000000000..e5bfe629b9b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetContainerUsageAction.java @@ -0,0 +1,92 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetContainerUsageAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.GetContainerUsageResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.GetContainerUsageResult value = res.getResult(org.zstack.sdk.GetContainerUsageResult.class); + ret.value = value == null ? new org.zstack.sdk.GetContainerUsageResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/container/usage"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetContainerUsageResult.java b/sdk/src/main/java/org/zstack/sdk/GetContainerUsageResult.java new file mode 100644 index 00000000000..6652d332003 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetContainerUsageResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class GetContainerUsageResult { + public java.util.List usages; + public void setUsages(java.util.List usages) { + this.usages = usages; + } + public java.util.List getUsages() { + return this.usages; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 233fdc4b4ff..3fff844b93e 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -20618,6 +20618,33 @@ abstract class ApiHelper { } + def getContainerUsage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetContainerUsageAction.class) Closure c) { + def a = new org.zstack.sdk.GetContainerUsageAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def getCpuMemoryCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCpuMemoryCapacityAction.class) Closure c) { def a = new org.zstack.sdk.GetCpuMemoryCapacityAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From d3247f581537c0b623b66d6373b5f62797a88c22 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 28 Oct 2024 16:57:42 +0800 Subject: [PATCH 150/737] [sdk]: update sdk Resolves: ZSTAC-69542 Change-Id: I6c65627778766b6d78636c696b6876746775636c Signed-off-by: AlanJager --- .../SetIAM2ProjectContainerClusterAction.java | 107 ++++++++++++++++++ .../SetIAM2ProjectContainerClusterResult.java | 7 ++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ 3 files changed, 141 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/iam2/container/SetIAM2ProjectContainerClusterAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/iam2/container/SetIAM2ProjectContainerClusterResult.java diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/SetIAM2ProjectContainerClusterAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/SetIAM2ProjectContainerClusterAction.java new file mode 100644 index 00000000000..10ea4c31d00 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/SetIAM2ProjectContainerClusterAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk.iam2.container; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class SetIAM2ProjectContainerClusterAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.iam2.container.SetIAM2ProjectContainerClusterResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long clusterId; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.iam2.container.SetIAM2ProjectContainerClusterResult value = res.getResult(org.zstack.sdk.iam2.container.SetIAM2ProjectContainerClusterResult.class); + ret.value = value == null ? new org.zstack.sdk.iam2.container.SetIAM2ProjectContainerClusterResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/iam2/projects/{uuid}/container/cluster/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "setIAM2ProjectContainerCluster"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/SetIAM2ProjectContainerClusterResult.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/SetIAM2ProjectContainerClusterResult.java new file mode 100644 index 00000000000..b4adb3df7c0 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/SetIAM2ProjectContainerClusterResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.iam2.container; + + + +public class SetIAM2ProjectContainerClusterResult { + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 3fff844b93e..8614b3d9768 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -48007,6 +48007,33 @@ abstract class ApiHelper { } + def setIAM2ProjectContainerCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.container.SetIAM2ProjectContainerClusterAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.container.SetIAM2ProjectContainerClusterAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def addPolicyStatementsToRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.AddPolicyStatementsToRoleAction.class) Closure c) { def a = new org.zstack.sdk.identity.role.api.AddPolicyStatementsToRoleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From eb8d5777a29401ac68a5f7f1fb3478c76b7b5680 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 30 Oct 2024 14:39:34 +0900 Subject: [PATCH 151/737] [sdk]: update sdk Resolves: ZSTAC-70801 Change-Id: I707a6f6b64677667676a636c6465776d7978616a --- sdk/src/main/java/SourceClassMap.java | 2 + .../org/zstack/sdk/GetMaaSUsageAction.java | 92 +++++++++++++++++++ .../org/zstack/sdk/GetMaaSUsageResult.java | 14 +++ .../main/java/org/zstack/sdk/MaaSUsage.java | 23 +++++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 ++++++ 5 files changed, 158 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/GetMaaSUsageAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/GetMaaSUsageResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/MaaSUsage.java diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index b814bb76485..83153859732 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -21,6 +21,7 @@ public class SourceClassMap { put("org.zstack.ai.entity.ModelServiceInventory", "org.zstack.sdk.ModelServiceInventory"); put("org.zstack.ai.entity.ModelServiceRefInventory", "org.zstack.sdk.ModelServiceRefInventory"); put("org.zstack.ai.entity.TrainedModelRecordInventory", "org.zstack.sdk.TrainedModelRecordInventory"); + put("org.zstack.ai.message.MaaSUsage", "org.zstack.sdk.MaaSUsage"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessGroupInventory", "org.zstack.sdk.AliyunNasAccessGroupInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessRuleInventory", "org.zstack.sdk.AliyunNasAccessRuleInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasFileSystemInventory", "org.zstack.sdk.AliyunNasFileSystemInventory"); @@ -1064,6 +1065,7 @@ public class SourceClassMap { put("org.zstack.sdk.LongJobInventory", "org.zstack.header.longjob.LongJobInventory"); put("org.zstack.sdk.LongJobState", "org.zstack.header.longjob.LongJobState"); put("org.zstack.sdk.LunInventory", "org.zstack.header.storageDevice.LunInventory"); + put("org.zstack.sdk.MaaSUsage", "org.zstack.ai.message.MaaSUsage"); put("org.zstack.sdk.ManagementNodeInventory", "org.zstack.header.managementnode.ManagementNodeInventory"); put("org.zstack.sdk.MdevDeviceChooser", "org.zstack.pciDevice.virtual.vfio_mdev.MdevDeviceChooser"); put("org.zstack.sdk.MdevDeviceInventory", "org.zstack.pciDevice.virtual.vfio_mdev.MdevDeviceInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/GetMaaSUsageAction.java b/sdk/src/main/java/org/zstack/sdk/GetMaaSUsageAction.java new file mode 100644 index 00000000000..ddc180ee9dd --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetMaaSUsageAction.java @@ -0,0 +1,92 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetMaaSUsageAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.GetMaaSUsageResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.GetMaaSUsageResult value = res.getResult(org.zstack.sdk.GetMaaSUsageResult.class); + ret.value = value == null ? new org.zstack.sdk.GetMaaSUsageResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/maas/usage"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetMaaSUsageResult.java b/sdk/src/main/java/org/zstack/sdk/GetMaaSUsageResult.java new file mode 100644 index 00000000000..66e2ddd381d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetMaaSUsageResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class GetMaaSUsageResult { + public java.util.List usages; + public void setUsages(java.util.List usages) { + this.usages = usages; + } + public java.util.List getUsages() { + return this.usages; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/MaaSUsage.java b/sdk/src/main/java/org/zstack/sdk/MaaSUsage.java new file mode 100644 index 00000000000..b01e7c89a92 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/MaaSUsage.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class MaaSUsage { + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.Long value; + public void setValue(java.lang.Long value) { + this.value = value; + } + public java.lang.Long getValue() { + return this.value; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 8614b3d9768..608b5713264 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -22346,6 +22346,33 @@ abstract class ApiHelper { } + def getMaaSUsage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetMaaSUsageAction.class) Closure c) { + def a = new org.zstack.sdk.GetMaaSUsageAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def getManagementNodeArch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetManagementNodeArchAction.class) Closure c) { def a = new org.zstack.sdk.GetManagementNodeArchAction() From 30c775d4c2b3c2c491e003dc1bead4a406f3fd06 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 31 Oct 2024 15:18:48 +0800 Subject: [PATCH 152/737] [conf]: Introduce cacheUsedCapacity to ModelCenterCapacityVO - Update sdk DBImpact Resolves: ZSTAC-70700 Change-Id: I7975686e716f766b6a64766b787172726b64696c Signed-off-by: AlanJager --- conf/db/upgrade/V5.1.20__schema.sql | 1 + sdk/src/main/java/org/zstack/sdk/GetMaaSUsageAction.java | 6 +++--- .../java/org/zstack/sdk/ModelCenterCapacityInventory.java | 8 ++++++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/conf/db/upgrade/V5.1.20__schema.sql b/conf/db/upgrade/V5.1.20__schema.sql index 6b7611058f8..a4a9aa3c531 100644 --- a/conf/db/upgrade/V5.1.20__schema.sql +++ b/conf/db/upgrade/V5.1.20__schema.sql @@ -39,5 +39,6 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelCenterCapacityVO` ( `modelEvaluationUsedCapacity` bigint NULL, `installationUsedCapacity` bigint NULL, `temporaryUsedCapacity` bigint NULL, + `cacheUsedCapacity` bigint NULL, PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/sdk/src/main/java/org/zstack/sdk/GetMaaSUsageAction.java b/sdk/src/main/java/org/zstack/sdk/GetMaaSUsageAction.java index ddc180ee9dd..013282deab6 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetMaaSUsageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetMaaSUsageAction.java @@ -20,7 +20,7 @@ public Result throwExceptionIfError() { String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) ); } - + return this; } } @@ -50,9 +50,9 @@ private Result makeResult(ApiResult res) { ret.error = res.error; return ret; } - + org.zstack.sdk.GetMaaSUsageResult value = res.getResult(org.zstack.sdk.GetMaaSUsageResult.class); - ret.value = value == null ? new org.zstack.sdk.GetMaaSUsageResult() : value; + ret.value = value == null ? new org.zstack.sdk.GetMaaSUsageResult() : value; return ret; } diff --git a/sdk/src/main/java/org/zstack/sdk/ModelCenterCapacityInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelCenterCapacityInventory.java index 0a335161b92..fe9fe635372 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelCenterCapacityInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelCenterCapacityInventory.java @@ -68,4 +68,12 @@ public long getTemporaryUsedCapacity() { return this.temporaryUsedCapacity; } + public long cacheUsedCapacity; + public void setCacheUsedCapacity(long cacheUsedCapacity) { + this.cacheUsedCapacity = cacheUsedCapacity; + } + public long getCacheUsedCapacity() { + return this.cacheUsedCapacity; + } + } From 33f1f10134d69f20d0545a6db284b8a8cb0d14d2 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 31 Oct 2024 22:57:58 +0900 Subject: [PATCH 153/737] [compute]: Fix duplicate system tags Resolves: ZSTAC-66285 Change-Id: I63706f7761676a77726a676173736e68616c7169 --- .../java/org/zstack/compute/vm/VmSystemTags.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java b/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java index 1308a6cfe1d..660fd24adcf 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java @@ -235,19 +235,6 @@ public class VmSystemTags { public static PatternedSystemTag XML_HOOK = new PatternedSystemTag(String.format("xmlHook::{%s}", XML_HOOK_TOKEN), VmInstanceVO.class); public static final String MARKET_PLACE_TOKEN = "marketplace::true"; - - public static PatternedSystemTag CREATED_BY_MARKETPLACE = new PatternedSystemTag( - MARKET_PLACE_TOKEN, VmInstanceVO.class - ); - - public static final String MARKET_PLACE_TOKEN = "marketplace::true"; - - public static PatternedSystemTag CREATED_BY_MARKETPLACE = new PatternedSystemTag( - MARKET_PLACE_TOKEN, VmInstanceVO.class - ); - - public static final String MARKET_PLACE_TOKEN = "marketplace::true"; - public static PatternedSystemTag CREATED_BY_MARKETPLACE = new PatternedSystemTag( MARKET_PLACE_TOKEN, VmInstanceVO.class ); From 5282bf8fb77abe750398113f25582a28e1fe9759 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 31 Oct 2024 23:30:28 +0900 Subject: [PATCH 154/737] [rest]: Add byte[].class to PRIMITIVE_TYPES Resolves: ZSTAC-66285 Change-Id: I786b7877686e6964626a756f70626b6a7a7a6865 --- .../src/main/resources/scripts/RestDocumentationGenerator.groovy | 1 + 1 file changed, 1 insertion(+) diff --git a/rest/src/main/resources/scripts/RestDocumentationGenerator.groovy b/rest/src/main/resources/scripts/RestDocumentationGenerator.groovy index 59828ba3b9b..3ff34227edc 100755 --- a/rest/src/main/resources/scripts/RestDocumentationGenerator.groovy +++ b/rest/src/main/resources/scripts/RestDocumentationGenerator.groovy @@ -1989,6 +1989,7 @@ ${txt} char.class, String.class, Enum.class, + byte[].class ] class ApiResponseDocTemplate { From 7a1722db4d4b77d33a0d15276a65d6fab3c280da Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 31 Oct 2024 22:34:36 +0800 Subject: [PATCH 155/737] [doc]: Update api docs Resolves: ZSTAC-66285 Change-Id: I7a6566757667767562656761736d7178726f7376 Signed-off-by: AlanJager --- ...quest_BatchOperationResultDoc_zh_cn.groovy | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 header/src/main/java/org/zstack/header/message/APIBatchRequest_BatchOperationResultDoc_zh_cn.groovy diff --git a/header/src/main/java/org/zstack/header/message/APIBatchRequest_BatchOperationResultDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/message/APIBatchRequest_BatchOperationResultDoc_zh_cn.groovy new file mode 100644 index 00000000000..93c2e57faa6 --- /dev/null +++ b/header/src/main/java/org/zstack/header/message/APIBatchRequest_BatchOperationResultDoc_zh_cn.groovy @@ -0,0 +1,29 @@ +package org.zstack.header.message + +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "批量操作接口的结果" + + field { + name "uuid" + desc "资源的UUID,唯一标示该资源" + type "String" + since "5.2.1" + } + field { + name "success" + desc "" + type "boolean" + since "5.2.1" + } + ref { + name "error" + path "org.zstack.header.message.APIBatchRequest.BatchOperationResult.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.2.1" + clz ErrorCode.class + } +} From 3684d5bd3a1748ff3af2444f6361b87ec1833c5f Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 5 Nov 2024 14:29:21 +0900 Subject: [PATCH 156/737] [dependencies]: Bump version to 5.3.0 GlobalPropertyImpact Resolves: ZSTAC-69314 Change-Id: I736d7478696f63796a707374776c6f7176656a76 Signed-off-by: AlanJager --- VERSION | 4 +- build/bump_version.py | 112 ++++++++++++++++++ build/pom.xml | 2 +- compute/pom.xml | 2 +- configuration/pom.xml | 2 +- console/pom.xml | 2 +- .../zstack/console/ConsoleGlobalProperty.java | 2 +- core/pom.xml | 2 +- .../core/ansible/AnsibleGlobalProperty.java | 2 +- externalservice/pom.xml | 2 +- header/pom.xml | 2 +- identity/pom.xml | 2 +- image/pom.xml | 2 +- longjob/pom.xml | 2 +- network/pom.xml | 2 +- plugin/acl/pom.xml | 2 +- plugin/applianceVm/pom.xml | 2 +- .../ApplianceVmGlobalProperty.java | 2 +- plugin/cbd/pom.xml | 2 +- plugin/ceph/pom.xml | 2 +- .../storage/ceph/CephGlobalProperty.java | 4 +- plugin/directory/pom.xml | 2 +- plugin/eip/pom.xml | 2 +- plugin/expon/pom.xml | 2 +- plugin/externalStorage/pom.xml | 2 +- plugin/flatNetworkProvider/pom.xml | 2 +- plugin/hostNetworkInterface/pom.xml | 2 +- plugin/iscsi/pom.xml | 2 +- plugin/kvm/pom.xml | 2 +- .../org/zstack/kvm/KVMGlobalProperty.java | 2 +- plugin/ldap/pom.xml | 2 +- plugin/loadBalancer/pom.xml | 2 +- plugin/localstorage/pom.xml | 2 +- plugin/loginPlugin/pom.xml | 2 +- plugin/mediator/pom.xml | 2 +- plugin/nfsPrimaryStorage/pom.xml | 2 +- plugin/pom.xml | 2 +- plugin/portForwarding/pom.xml | 2 +- plugin/sdnController/pom.xml | 2 +- plugin/securityGroup/pom.xml | 2 +- plugin/sftpBackupStorage/pom.xml | 2 +- .../sftp/SftpBackupStorageGlobalProperty.java | 2 +- plugin/sharedMountPointPrimaryStorage/pom.xml | 2 +- plugin/sshKeyPair/pom.xml | 2 +- plugin/sugonSdnController/pom.xml | 2 +- plugin/vhost/pom.xml | 2 +- plugin/vip/pom.xml | 2 +- plugin/virtualRouterProvider/pom.xml | 2 +- .../VirtualRouterGlobalProperty.java | 2 +- plugin/vxlan/pom.xml | 2 +- plugin/xinfini/pom.xml | 2 +- plugin/zbs/pom.xml | 2 +- pom.xml | 2 +- portal/pom.xml | 2 +- resourceconfig/pom.xml | 2 +- rest/pom.xml | 2 +- sdk/pom.xml | 2 +- search/pom.xml | 2 +- simulator/pom.xml | 2 +- simulator/simulatorHeader/pom.xml | 2 +- simulator/simulatorImpl/pom.xml | 2 +- storage/pom.xml | 2 +- tag/pom.xml | 2 +- test/pom.xml | 2 +- testlib/pom.xml | 2 +- utils/pom.xml | 2 +- 66 files changed, 179 insertions(+), 67 deletions(-) create mode 100644 build/bump_version.py diff --git a/VERSION b/VERSION index 93ac0f51e8d..e7bc5164cb7 100755 --- a/VERSION +++ b/VERSION @@ -1,3 +1,3 @@ MAJOR=5 -MINOR=2 -UPDATE=1 +MINOR=3 +UPDATE=0 diff --git a/build/bump_version.py b/build/bump_version.py new file mode 100644 index 00000000000..5b4ffec093b --- /dev/null +++ b/build/bump_version.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +import subprocess +import sys +import re +import os + + +def get_files(paths=['.', 'premium']): + all_files = [] + for path in paths: + if os.path.exists(path): + result = subprocess.run(['git', 'ls-files'], + cwd=path, + capture_output=True, + text=True) + files = result.stdout.splitlines() + path_files = [(os.path.join(path, f), + 'pom' if 'pom.xml' in f else 'global') + for f in files + if 'pom.xml' in f or 'GlobalProperty' in f] + all_files.extend(path_files) + return all_files + + +def update_version_in_pom(file_path, new_version): + try: + # 使用 'rb' 模式读取,保留原始字节 + with open(file_path, 'rb') as f: + content = f.read() + + # 将字节转换为字符串进行处理 + str_content = content.decode('utf-8') + pattern = r'(.*?)(.*?)(.*?)' + regex = re.compile(pattern, re.DOTALL) + + if not regex.search(str_content): + print(f"Skipped {file_path} - no matching parent version found") + return + + def replace_version(match): + old_version = match.group(2) + print(f"In {file_path}: Changing version from { + old_version} to {new_version}") + return f'{match.group(1)}{new_version}{match.group(3)}' + + new_content = regex.sub(replace_version, str_content) + + if new_content != str_content: + # 使用 'wb' 模式写入,确保字节级别的一致性 + with open(file_path, 'wb') as f: + f.write(new_content.encode('utf-8')) + print(f"Updated {file_path}") + + except Exception as e: + print(f"Error processing {file_path}: {str(e)}") + + +def update_version_in_global_property(file_path, old_version, new_version): + try: + # 使用 'rb' 模式读取,保留原始字节 + with open(file_path, 'rb') as f: + content = f.read() + + # 将字节转换为字符串进行处理 + str_content = content.decode('utf-8') + pattern = r'(@GlobalProperty\s*\([^)]*defaultValue\s*=\s*"[^"]*?)' + \ + re.escape(old_version) + r'(\.tar\.gz"[^)]*\))' + regex = re.compile(pattern) + + if not regex.search(str_content): + print( + f"Skipped {file_path} - no matching version in GlobalProperty") + return + + def replace_version(match): + print(f"In {file_path}: Changing version from { + old_version} to {new_version}") + return f'{match.group(1)}{new_version}{match.group(2)}' + + new_content = regex.sub(replace_version, str_content) + + if new_content != str_content: + # 使用 'wb' 模式写入,确保字节级别的一致性 + with open(file_path, 'wb') as f: + f.write(new_content.encode('utf-8')) + print(f"Updated {file_path}") + + except Exception as e: + print(f"Error processing {file_path}: {str(e)}") + + +def main(): + if len(sys.argv) != 3: + print("Usage: python script.py ") + print("Example: python script.py 5.2.0 5.3.0") + sys.exit(1) + + old_version = sys.argv[1] + new_version = sys.argv[2] + files = get_files() + + print(f"Found {len(files)} files to process") + for file_path, file_type in files: + if file_type == 'pom': + update_version_in_pom(file_path, new_version) + else: + update_version_in_global_property( + file_path, old_version, new_version) + + +if __name__ == "__main__": + main() diff --git a/build/pom.xml b/build/pom.xml index 100af6e0975..dc78cabfbe6 100755 --- a/build/pom.xml +++ b/build/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 .. build diff --git a/compute/pom.xml b/compute/pom.xml index ae7e85340e7..dc289db0f6d 100755 --- a/compute/pom.xml +++ b/compute/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 .. compute diff --git a/configuration/pom.xml b/configuration/pom.xml index fe3b81a9412..7b430de96d4 100755 --- a/configuration/pom.xml +++ b/configuration/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 .. configuration diff --git a/console/pom.xml b/console/pom.xml index 1774eddca65..0212104dbf9 100755 --- a/console/pom.xml +++ b/console/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java b/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java index f9aa476e31f..5101eecc77f 100644 --- a/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java +++ b/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java @@ -9,7 +9,7 @@ */ @GlobalPropertyDefinition public class ConsoleGlobalProperty { - @GlobalProperty(name="ConsoleProxy.agentPackageName", defaultValue = "consoleproxy-5.2.0.tar.gz") + @GlobalProperty(name="ConsoleProxy.agentPackageName", defaultValue = "consoleproxy-5.3.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="MN.network.", defaultValue = "") public static List MN_NETWORKS; diff --git a/core/pom.xml b/core/pom.xml index f2dd73b2205..aab291866b6 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.zstack - 5.2.0 + 5.3.0 .. zstack diff --git a/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java b/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java index 365b556c9ab..635d7fca2bf 100755 --- a/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java +++ b/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java @@ -9,7 +9,7 @@ public class AnsibleGlobalProperty { @GlobalProperty(name = "Ansible.executable", defaultValue = "python") public static String EXECUTABLE; - @GlobalProperty(name = "Ansible.zstacklibPackageName", defaultValue = "zstacklib-5.2.0.tar.gz") + @GlobalProperty(name = "Ansible.zstacklibPackageName", defaultValue = "zstacklib-5.3.0.tar.gz") public static String ZSTACKLIB_PACKAGE_NAME; @GlobalProperty(name = "Ansible.zstackRoot", defaultValue = "/var/lib/zstack") public static String ZSTACK_ROOT; diff --git a/externalservice/pom.xml b/externalservice/pom.xml index bd85f726a4f..92e4c0073c2 100755 --- a/externalservice/pom.xml +++ b/externalservice/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/header/pom.xml b/header/pom.xml index 0dbee719340..c5c249ef09b 100755 --- a/header/pom.xml +++ b/header/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 .. header diff --git a/identity/pom.xml b/identity/pom.xml index a46c9397b39..9daa1aab9e2 100755 --- a/identity/pom.xml +++ b/identity/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 .. identity diff --git a/image/pom.xml b/image/pom.xml index b595568f6ea..7174263e909 100755 --- a/image/pom.xml +++ b/image/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 .. image diff --git a/longjob/pom.xml b/longjob/pom.xml index e1c3a70ea3d..f446a1b482e 100755 --- a/longjob/pom.xml +++ b/longjob/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 .. longjob diff --git a/network/pom.xml b/network/pom.xml index 167dc077619..11e601b2f59 100755 --- a/network/pom.xml +++ b/network/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 .. network diff --git a/plugin/acl/pom.xml b/plugin/acl/pom.xml index c64059720b8..c129127c8c4 100644 --- a/plugin/acl/pom.xml +++ b/plugin/acl/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/plugin/applianceVm/pom.xml b/plugin/applianceVm/pom.xml index cc95d84ab98..54800dafa67 100755 --- a/plugin/applianceVm/pom.xml +++ b/plugin/applianceVm/pom.xml @@ -6,7 +6,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 .. applianceVm diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java index 536ff50dcf7..c346a2c7578 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java @@ -11,7 +11,7 @@ public class ApplianceVmGlobalProperty { public static boolean NO_ROLLBACK_ON_POST_FAILURE; @GlobalProperty(name = "ApplianceVm.connectVerbose", defaultValue = "false") public static boolean CONNECT_VERBOSE; - @GlobalProperty(name="ApplianceVm.agentPackageName", defaultValue = "appliancevm-5.2.0.tar.gz") + @GlobalProperty(name="ApplianceVm.agentPackageName", defaultValue = "appliancevm-5.3.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="ApplianceVm.agentPort", defaultValue = "7759") public static int AGENT_PORT; diff --git a/plugin/cbd/pom.xml b/plugin/cbd/pom.xml index fba1a93b15c..3320d7ee874 100644 --- a/plugin/cbd/pom.xml +++ b/plugin/cbd/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.2.0 + 5.3.0 cbd diff --git a/plugin/ceph/pom.xml b/plugin/ceph/pom.xml index 28729b1e5de..3df78c8a5f3 100755 --- a/plugin/ceph/pom.xml +++ b/plugin/ceph/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java index 5c74a79266f..94555a56fd4 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java @@ -18,13 +18,13 @@ public class CephGlobalProperty { public static String PRIMARY_STORAGE_AGENT_URL_ROOT_PATH; @GlobalProperty(name="Ceph.primaryStorageAgent.port", defaultValue = "7762") public static int PRIMARY_STORAGE_AGENT_PORT; - @GlobalProperty(name="Ceph.backupStorage.agentPackageName", defaultValue = "cephbackupstorage-5.2.0.tar.gz") + @GlobalProperty(name="Ceph.backupStorage.agentPackageName", defaultValue = "cephbackupstorage-5.3.0.tar.gz") public static String BACKUP_STORAGE_PACKAGE_NAME; @GlobalProperty(name="Ceph.backupStorage.ansiblePlaybook", defaultValue = "cephb.py") public static String BACKUP_STORAGE_PLAYBOOK_NAME; @GlobalProperty(name="Ceph.backupStorage.ansibleModulePath", defaultValue = "ansible/cephb") public static String BACKUP_STORAGE_MODULE_PATH; - @GlobalProperty(name="Ceph.primaryStorage.agentPackageName", defaultValue = "cephprimarystorage-5.2.0.tar.gz") + @GlobalProperty(name="Ceph.primaryStorage.agentPackageName", defaultValue = "cephprimarystorage-5.3.0.tar.gz") public static String PRIMARY_STORAGE_PACKAGE_NAME; @GlobalProperty(name="Ceph.primaryStorage.ansiblePlaybook", defaultValue = "cephp.py") public static String PRIMARY_STORAGE_PLAYBOOK_NAME; diff --git a/plugin/directory/pom.xml b/plugin/directory/pom.xml index 1d17e27b2e5..d282f417e1c 100644 --- a/plugin/directory/pom.xml +++ b/plugin/directory/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/plugin/eip/pom.xml b/plugin/eip/pom.xml index 46c6b7f79d6..9849e0b04b3 100755 --- a/plugin/eip/pom.xml +++ b/plugin/eip/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/plugin/expon/pom.xml b/plugin/expon/pom.xml index f1348e51de4..5474e1877ae 100644 --- a/plugin/expon/pom.xml +++ b/plugin/expon/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/plugin/externalStorage/pom.xml b/plugin/externalStorage/pom.xml index e021b5df7d7..ea6e0b03f69 100644 --- a/plugin/externalStorage/pom.xml +++ b/plugin/externalStorage/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 .. diff --git a/plugin/flatNetworkProvider/pom.xml b/plugin/flatNetworkProvider/pom.xml index 657c6c448bb..b1305b84d75 100755 --- a/plugin/flatNetworkProvider/pom.xml +++ b/plugin/flatNetworkProvider/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/plugin/hostNetworkInterface/pom.xml b/plugin/hostNetworkInterface/pom.xml index 0b391b48fb0..d80bf49afbe 100644 --- a/plugin/hostNetworkInterface/pom.xml +++ b/plugin/hostNetworkInterface/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.2.0 + 5.3.0 hostNetworkInterface diff --git a/plugin/iscsi/pom.xml b/plugin/iscsi/pom.xml index 62f2c884a6b..b08238b12e5 100644 --- a/plugin/iscsi/pom.xml +++ b/plugin/iscsi/pom.xml @@ -6,7 +6,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 .. diff --git a/plugin/kvm/pom.xml b/plugin/kvm/pom.xml index 832fbb6d4bc..77efc0bfbe7 100755 --- a/plugin/kvm/pom.xml +++ b/plugin/kvm/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 .. kvm diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java index db726386ae3..a590baf73da 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java @@ -10,7 +10,7 @@ */ @GlobalPropertyDefinition public class KVMGlobalProperty { - @GlobalProperty(name="KvmAgent.agentPackageName", defaultValue = "kvmagent-5.2.0.tar.gz") + @GlobalProperty(name="KvmAgent.agentPackageName", defaultValue = "kvmagent-5.3.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="KvmAgent.agentUrlRootPath", defaultValue = "") public static String AGENT_URL_ROOT_PATH; diff --git a/plugin/ldap/pom.xml b/plugin/ldap/pom.xml index e5197ffb530..b2fa4977464 100755 --- a/plugin/ldap/pom.xml +++ b/plugin/ldap/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/plugin/loadBalancer/pom.xml b/plugin/loadBalancer/pom.xml index 82337a50f16..c3603ebe8d4 100755 --- a/plugin/loadBalancer/pom.xml +++ b/plugin/loadBalancer/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/plugin/localstorage/pom.xml b/plugin/localstorage/pom.xml index 3efba793dc1..aed148455b3 100755 --- a/plugin/localstorage/pom.xml +++ b/plugin/localstorage/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/plugin/loginPlugin/pom.xml b/plugin/loginPlugin/pom.xml index c478235a3e2..e698ce03816 100644 --- a/plugin/loginPlugin/pom.xml +++ b/plugin/loginPlugin/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 4.4.0 + 5.3.0 .. loginPlugin diff --git a/plugin/mediator/pom.xml b/plugin/mediator/pom.xml index bdc770ebfa1..44867a048ba 100755 --- a/plugin/mediator/pom.xml +++ b/plugin/mediator/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/plugin/nfsPrimaryStorage/pom.xml b/plugin/nfsPrimaryStorage/pom.xml index ae905394278..2e06cbe92bc 100755 --- a/plugin/nfsPrimaryStorage/pom.xml +++ b/plugin/nfsPrimaryStorage/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 .. nfsPrimaryStorage diff --git a/plugin/pom.xml b/plugin/pom.xml index a42784d6e11..1a96be7bffc 100755 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 .. plugin diff --git a/plugin/portForwarding/pom.xml b/plugin/portForwarding/pom.xml index 69ae62dac1f..bdcade2aa7e 100755 --- a/plugin/portForwarding/pom.xml +++ b/plugin/portForwarding/pom.xml @@ -4,7 +4,7 @@ org.zstack plugin - 5.2.0 + 5.3.0 portForwarding diff --git a/plugin/sdnController/pom.xml b/plugin/sdnController/pom.xml index 391e227c820..ebd31ef11e2 100644 --- a/plugin/sdnController/pom.xml +++ b/plugin/sdnController/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/plugin/securityGroup/pom.xml b/plugin/securityGroup/pom.xml index 1080cc0ef11..f8983f1db39 100755 --- a/plugin/securityGroup/pom.xml +++ b/plugin/securityGroup/pom.xml @@ -4,7 +4,7 @@ org.zstack plugin - 5.2.0 + 5.3.0 securityGroup diff --git a/plugin/sftpBackupStorage/pom.xml b/plugin/sftpBackupStorage/pom.xml index f65632f2ffa..7f6b567a3f6 100755 --- a/plugin/sftpBackupStorage/pom.xml +++ b/plugin/sftpBackupStorage/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 .. sftpBackupStorage diff --git a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java index 9f9f3f16005..1c81f5ea44c 100755 --- a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java +++ b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java @@ -10,7 +10,7 @@ @GlobalPropertyDefinition public class SftpBackupStorageGlobalProperty { - @GlobalProperty(name="SftpBackupStorage.agentPackageName", defaultValue = "sftpbackupstorage-5.2.0.tar.gz") + @GlobalProperty(name="SftpBackupStorage.agentPackageName", defaultValue = "sftpbackupstorage-5.3.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="SftpBackupStorage.agentPort", defaultValue = "7171") public static int AGENT_PORT; diff --git a/plugin/sharedMountPointPrimaryStorage/pom.xml b/plugin/sharedMountPointPrimaryStorage/pom.xml index caeff34f1b8..a24b156f89b 100755 --- a/plugin/sharedMountPointPrimaryStorage/pom.xml +++ b/plugin/sharedMountPointPrimaryStorage/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/plugin/sshKeyPair/pom.xml b/plugin/sshKeyPair/pom.xml index b296da499a0..05fade1110a 100644 --- a/plugin/sshKeyPair/pom.xml +++ b/plugin/sshKeyPair/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.2.0 + 5.3.0 sshKeyPair diff --git a/plugin/sugonSdnController/pom.xml b/plugin/sugonSdnController/pom.xml index d7aef709bca..9bc556f7980 100644 --- a/plugin/sugonSdnController/pom.xml +++ b/plugin/sugonSdnController/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/plugin/vhost/pom.xml b/plugin/vhost/pom.xml index 60294c33795..322ebf27c65 100644 --- a/plugin/vhost/pom.xml +++ b/plugin/vhost/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/plugin/vip/pom.xml b/plugin/vip/pom.xml index 863dbf37725..1ebfea74c84 100755 --- a/plugin/vip/pom.xml +++ b/plugin/vip/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/plugin/virtualRouterProvider/pom.xml b/plugin/virtualRouterProvider/pom.xml index 41653474ff6..44d52384795 100755 --- a/plugin/virtualRouterProvider/pom.xml +++ b/plugin/virtualRouterProvider/pom.xml @@ -4,7 +4,7 @@ org.zstack plugin - 5.2.0 + 5.3.0 virtualRouterProvider diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java index bc4dc9662c0..6e1cd42166b 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java @@ -9,7 +9,7 @@ */ @GlobalPropertyDefinition public class VirtualRouterGlobalProperty { - @GlobalProperty(name="VirtualRouter.agentPackageName", defaultValue = "virtualrouter-5.2.0.tar.gz") + @GlobalProperty(name="VirtualRouter.agentPackageName", defaultValue = "virtualrouter-5.3.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="VirtualRouter.agentPort", defaultValue = "7272") public static int AGENT_PORT; diff --git a/plugin/vxlan/pom.xml b/plugin/vxlan/pom.xml index 03331a5a734..cf98a1e8a48 100755 --- a/plugin/vxlan/pom.xml +++ b/plugin/vxlan/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/plugin/xinfini/pom.xml b/plugin/xinfini/pom.xml index ea5905c91e1..75068fd3c67 100644 --- a/plugin/xinfini/pom.xml +++ b/plugin/xinfini/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/plugin/zbs/pom.xml b/plugin/zbs/pom.xml index bbd31a083ed..6304721bc9c 100644 --- a/plugin/zbs/pom.xml +++ b/plugin/zbs/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.2.0 + 5.3.0 zbs diff --git a/pom.xml b/pom.xml index fdd9ff9a347..89e87c84db3 100755 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ 4.0.0 org.zstack zstack - 5.2.0 + 5.3.0 pom zstack diff --git a/portal/pom.xml b/portal/pom.xml index 39b84c0e824..494552aa75f 100755 --- a/portal/pom.xml +++ b/portal/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 .. portal diff --git a/resourceconfig/pom.xml b/resourceconfig/pom.xml index 9639e09778e..ad0a4287330 100644 --- a/resourceconfig/pom.xml +++ b/resourceconfig/pom.xml @@ -6,7 +6,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 .. resourceconfig diff --git a/rest/pom.xml b/rest/pom.xml index b9422f415ac..5cbedf16490 100755 --- a/rest/pom.xml +++ b/rest/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/sdk/pom.xml b/sdk/pom.xml index af1a3d2ec04..cc00f0a8d47 100755 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/search/pom.xml b/search/pom.xml index a9b03626e36..cba6792904f 100755 --- a/search/pom.xml +++ b/search/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 .. search diff --git a/simulator/pom.xml b/simulator/pom.xml index d9d75651e23..7a6cfe8709f 100755 --- a/simulator/pom.xml +++ b/simulator/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 .. simulator diff --git a/simulator/simulatorHeader/pom.xml b/simulator/simulatorHeader/pom.xml index 51d7e0d2ce1..024ec5904de 100755 --- a/simulator/simulatorHeader/pom.xml +++ b/simulator/simulatorHeader/pom.xml @@ -4,7 +4,7 @@ simulator org.zstack - 5.2.0 + 5.3.0 .. simulatorHeader diff --git a/simulator/simulatorImpl/pom.xml b/simulator/simulatorImpl/pom.xml index e7d6ff803ba..570b2c87e53 100755 --- a/simulator/simulatorImpl/pom.xml +++ b/simulator/simulatorImpl/pom.xml @@ -4,7 +4,7 @@ simulator org.zstack - 5.2.0 + 5.3.0 .. simulatorImpl diff --git a/storage/pom.xml b/storage/pom.xml index c45fa73c3c7..68360e375ef 100755 --- a/storage/pom.xml +++ b/storage/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 .. storage diff --git a/tag/pom.xml b/tag/pom.xml index 6fcb961de9e..991729e3689 100755 --- a/tag/pom.xml +++ b/tag/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/test/pom.xml b/test/pom.xml index d1881f18656..9c04be4ae9b 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -9,7 +9,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 .. test diff --git a/testlib/pom.xml b/testlib/pom.xml index 582f1457b94..5e3a6f4ae41 100644 --- a/testlib/pom.xml +++ b/testlib/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 4.0.0 diff --git a/utils/pom.xml b/utils/pom.xml index edc3ae00556..c28be564e13 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.2.0 + 5.3.0 .. utils From c701c6a09c1688279a26be95a50e021d93a6cd64 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 21 Mar 2024 20:44:35 +0800 Subject: [PATCH 157/737] [kvm]: introduce package version system tag Resolves: ZSTAC-64271 Change-Id: I616d62716c6f7672656665686e79796b776c7a74 (cherry picked from commit 807d6b688076b2b3e97b3ecde23b9debd549bf85) --- .../src/main/java/org/zstack/kvm/KVMAgentCommands.java | 10 ++++++++++ plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java | 4 ++++ .../src/main/java/org/zstack/kvm/KVMSystemTags.java | 3 +++ 3 files changed, 17 insertions(+) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index 0da4fac18c0..d9f2a95a173 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -466,6 +466,8 @@ public static class HostFactResponse extends AgentResponse { @GrayVersion(value = "5.0.0") private String libvirtVersion; @GrayVersion(value = "5.0.0") + private String libvirtPackageVersion; + @GrayVersion(value = "5.0.0") private String hvmCpuFlag; @GrayVersion(value = "5.0.0") private String eptFlag; @@ -761,6 +763,14 @@ public String getIscsiInitiatorName() { public void setIscsiInitiatorName(String iscsiInitiatorName) { this.iscsiInitiatorName = iscsiInitiatorName; } + + public String getLibvirtPackageVersion() { + return libvirtPackageVersion; + } + + public void setLibvirtPackageVersion(String libvirtPackageVersion) { + this.libvirtPackageVersion = libvirtPackageVersion; + } } public static class HostCapacityCmd extends AgentCommand { diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 57d611e1b11..18f7d65918d 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -5827,6 +5827,10 @@ private boolean checkVirtualizationEnabled(HostFactResponse response) { private void saveKvmHostRelatedFacts(HostFactResponse ret) { updateHostOsInformation(ret.getOsDistribution(), ret.getOsRelease(), ret.getOsVersion()); + if (ret.getLibvirtPackageVersion() != null) { + createTagWithoutNonValue(KVMSystemTags.LIBVIRT_PACKAGE_VERSION, KVMSystemTags.LIBVIRT_PACKAGE_VERSION_TOKEN, ret.getLibvirtPackageVersion().trim(), false); + } + createTagWithoutNonValue(KVMSystemTags.QEMU_IMG_VERSION, KVMSystemTags.QEMU_IMG_VERSION_TOKEN, ret.getQemuImgVersion(), false); createTagWithoutNonValue(KVMSystemTags.LIBVIRT_VERSION, KVMSystemTags.LIBVIRT_VERSION_TOKEN, ret.getLibvirtVersion(), false); createTagWithoutNonValue(KVMSystemTags.HVM_CPU_FLAG, KVMSystemTags.HVM_CPU_FLAG_TOKEN, ret.getHvmCpuFlag(), false); diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMSystemTags.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMSystemTags.java index df7190362a8..1cdeaf18dd3 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMSystemTags.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMSystemTags.java @@ -21,6 +21,9 @@ public class KVMSystemTags { public static final String LIBVIRT_VERSION_TOKEN = "version"; public static PatternedSystemTag LIBVIRT_VERSION = new PatternedSystemTag(String.format("libvirt::version::{%s}", LIBVIRT_VERSION_TOKEN), HostVO.class); + public static final String LIBVIRT_PACKAGE_VERSION_TOKEN = "version"; + public static PatternedSystemTag LIBVIRT_PACKAGE_VERSION = new PatternedSystemTag(String.format("libvirt::package::version::{%s}", LIBVIRT_PACKAGE_VERSION_TOKEN), HostVO.class); + public static final String HVM_CPU_FLAG_TOKEN = "flag"; public static PatternedSystemTag HVM_CPU_FLAG = new PatternedSystemTag(String.format("hvm::{%s}", HVM_CPU_FLAG_TOKEN), HostVO.class); From c4b134fd28eb76fd321296712e27201a9bc8046f Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 21 Mar 2024 21:11:34 +0800 Subject: [PATCH 158/737] [kvm]: introduce force deploy kvmagent Resolves: ZSTAC-64271 Change-Id: I6d6e61797879756a79786b68786f6778676e6379 Signed-off-by: AlanJager (cherry picked from commit 1916fe323e60dab3e53ddc6c9f3b67f530aa79cb) --- plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java | 1 - plugin/kvm/src/main/java/org/zstack/kvm/KVMSystemTags.java | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 18f7d65918d..504436d8ea7 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -5543,7 +5543,6 @@ public void fail(ErrorCode errorCode) { runner.setUsername(getSelf().getUsername()); runner.setPassword(getSelf().getPassword()); runner.setSshPort(getSelf().getPort()); - runner.restartAgent(AnsibleConstant.KVM_AGENT_NAME, new Completion(trigger) { @Override public void success() { diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMSystemTags.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMSystemTags.java index 1cdeaf18dd3..d1dc3a495e8 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMSystemTags.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMSystemTags.java @@ -24,6 +24,8 @@ public class KVMSystemTags { public static final String LIBVIRT_PACKAGE_VERSION_TOKEN = "version"; public static PatternedSystemTag LIBVIRT_PACKAGE_VERSION = new PatternedSystemTag(String.format("libvirt::package::version::{%s}", LIBVIRT_PACKAGE_VERSION_TOKEN), HostVO.class); + public static SystemTag FORCE_DEPLOYMENT_ONCE = new SystemTag("force::deployment::once", HostVO.class); + public static final String HVM_CPU_FLAG_TOKEN = "flag"; public static PatternedSystemTag HVM_CPU_FLAG = new PatternedSystemTag(String.format("hvm::{%s}", HVM_CPU_FLAG_TOKEN), HostVO.class); From 5a91ef99739b4a435f8dd55baf9a72717d8d17a3 Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Thu, 24 Oct 2024 16:44:33 +0800 Subject: [PATCH 159/737] [host]: support custom host network label add host network label and support custom host network service type and persist Resolves: ZSTAC-70705 Change-Id: I6868776cac728ea063834ff0bda656ca48eae362 --- .../compute/host/HostApiInterceptor.java | 26 ++ .../zstack/compute/host/HostManagerImpl.java | 108 +++++ conf/db/upgrade/V5.3.0__schema.sql | 19 + conf/persistence.xml | 1 + conf/serviceConfig/host.xml | 12 + .../APICreateHostNetworkServiceTypeEvent.java | 34 ++ ...ostNetworkServiceTypeEventDoc_zh_cn.groovy | 32 ++ .../APICreateHostNetworkServiceTypeMsg.java | 63 +++ ...eHostNetworkServiceTypeMsgDoc_zh_cn.groovy | 85 ++++ .../APIDeleteHostNetworkServiceTypeEvent.java | 23 ++ ...ostNetworkServiceTypeEventDoc_zh_cn.groovy | 23 ++ .../APIDeleteHostNetworkServiceTypeMsg.java | 35 ++ ...eHostNetworkServiceTypeMsgDoc_zh_cn.groovy | 67 +++ .../APIUpdateHostNetworkServiceTypeEvent.java | 35 ++ ...ostNetworkServiceTypeEventDoc_zh_cn.groovy | 32 ++ .../APIUpdateHostNetworkServiceTypeMsg.java | 60 +++ ...eHostNetworkServiceTypeMsgDoc_zh_cn.groovy | 76 ++++ .../host/HostNetworkLabelExtensionPoint.java | 12 + .../host/HostNetworkLabelInventory.java | 96 +++++ .../HostNetworkLabelInventoryDoc_zh_cn.groovy | 40 ++ .../header/host/HostNetworkLabelVO.java | 68 +++ .../header/host/HostNetworkLabelVO_.java | 16 + sdk/src/main/java/SourceClassMap.java | 4 +- .../CreateHostNetworkServiceTypeAction.java | 110 +++++ .../CreateHostNetworkServiceTypeResult.java | 14 + .../DeleteHostNetworkServiceTypeAction.java | 104 +++++ .../DeleteHostNetworkServiceTypeResult.java | 7 + ...HostNetworkBondingServiceRefInventory.java | 8 +- ...stNetworkInterfaceServiceRefInventory.java | 8 +- .../sdk/HostNetworkInterfaceServiceType.java | 9 - .../zstack/sdk/HostNetworkLabelInventory.java | 47 +++ ...ServiceTypeOnHostNetworkBondingAction.java | 2 +- ...rviceTypeOnHostNetworkInterfaceAction.java | 2 +- .../UpdateHostNetworkServiceTypeAction.java | 107 +++++ .../UpdateHostNetworkServiceTypeResult.java | 14 + .../java/org/zstack/testlib/ApiHelper.groovy | 387 +++++++++++------- .../java/org/zstack/testlib/EnvSpec.groovy | 3 +- 37 files changed, 1614 insertions(+), 175 deletions(-) create mode 100644 header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeEvent.java create mode 100644 header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeEventDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeMsg.java create mode 100644 header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeMsgDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeEvent.java create mode 100644 header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeEventDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeMsg.java create mode 100644 header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeMsgDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeEvent.java create mode 100644 header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeEventDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeMsg.java create mode 100644 header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeMsgDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/host/HostNetworkLabelExtensionPoint.java create mode 100644 header/src/main/java/org/zstack/header/host/HostNetworkLabelInventory.java create mode 100644 header/src/main/java/org/zstack/header/host/HostNetworkLabelInventoryDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/host/HostNetworkLabelVO.java create mode 100644 header/src/main/java/org/zstack/header/host/HostNetworkLabelVO_.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateHostNetworkServiceTypeAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateHostNetworkServiceTypeResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteHostNetworkServiceTypeAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteHostNetworkServiceTypeResult.java delete mode 100644 sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceServiceType.java create mode 100644 sdk/src/main/java/org/zstack/sdk/HostNetworkLabelInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkServiceTypeAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkServiceTypeResult.java diff --git a/compute/src/main/java/org/zstack/compute/host/HostApiInterceptor.java b/compute/src/main/java/org/zstack/compute/host/HostApiInterceptor.java index ecad4823e90..cc21cfb257a 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostApiInterceptor.java +++ b/compute/src/main/java/org/zstack/compute/host/HostApiInterceptor.java @@ -55,11 +55,37 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti validate((APIChangeHostStateMsg) msg); } else if (msg instanceof APIGetHostWebSshUrlMsg) { validate((APIGetHostWebSshUrlMsg) msg); + } else if (msg instanceof APICreateHostNetworkServiceTypeMsg) { + validate((APICreateHostNetworkServiceTypeMsg) msg); + } else if (msg instanceof APIDeleteHostNetworkServiceTypeMsg) { + validate((APIDeleteHostNetworkServiceTypeMsg) msg); + } else if (msg instanceof APIUpdateHostNetworkServiceTypeMsg) { + validate((APIUpdateHostNetworkServiceTypeMsg) msg); } return msg; } + private void validate(APIDeleteHostNetworkServiceTypeMsg msg) { + if (Q.New(HostNetworkLabelVO.class).eq(HostNetworkLabelVO_.uuid, msg.getUuid()) + .eq(HostNetworkLabelVO_.system, Boolean.TRUE).isExists()) { + throw new ApiMessageInterceptionException(argerr("system host network service type[%s] cannot be deleted", msg.getUuid())); + } + } + + private void validate(APIUpdateHostNetworkServiceTypeMsg msg) { + if (Q.New(HostNetworkLabelVO.class).eq(HostNetworkLabelVO_.uuid, msg.getUuid()) + .eq(HostNetworkLabelVO_.system, Boolean.TRUE).isExists()) { + throw new ApiMessageInterceptionException(argerr("system host network service type[%s] cannot be updated", msg.getUuid())); + } + } + + private void validate(APICreateHostNetworkServiceTypeMsg msg) { + if (Q.New(HostNetworkLabelVO.class).eq(HostNetworkLabelVO_.serviceType, msg.getServiceType()).isExists()) { + throw new ApiMessageInterceptionException(argerr("there has been a host network service type[%s]", msg.getServiceType())); + } + } + private void validate(APIGetHostWebSshUrlMsg msg) { String ZOPS_CONTAINER_NAME = "zops-controller"; ShellResult ret; diff --git a/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java b/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java index add71191c03..30bcd10460e 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java @@ -115,11 +115,119 @@ private void handleApiMessage(APIMessage msg) { } else if (msg instanceof HostMessage) { HostMessage hmsg = (HostMessage) msg; passThrough(hmsg); + } else if (msg instanceof APICreateHostNetworkServiceTypeMsg) { + handle((APICreateHostNetworkServiceTypeMsg) msg); + } else if (msg instanceof APIUpdateHostNetworkServiceTypeMsg) { + handle((APIUpdateHostNetworkServiceTypeMsg) msg); + } else if (msg instanceof APIDeleteHostNetworkServiceTypeMsg) { + handle((APIDeleteHostNetworkServiceTypeMsg) msg); } else { bus.dealWithUnknownMessage(msg); } } + + private void handle(APIDeleteHostNetworkServiceTypeMsg msg) { + APIDeleteHostNetworkServiceTypeEvent event = new APIDeleteHostNetworkServiceTypeEvent(msg.getId()); + thdf.chainSubmit(new ChainTask(msg) { + @Override + public void run(SyncTaskChain chain) { + deleteHostNetworkLabel(msg, new Completion(msg, chain){ + @Override + public void success() { + HostNetworkLabelVO vo = dbf.findByUuid(msg.getUuid(), HostNetworkLabelVO.class); + dbf.remove(vo); + logger.debug(String.format("delete host network service type[uuid:%s]", vo.getUuid())); + bus.publish(event); + chain.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + event.setError(errorCode); + bus.publish(event); + chain.next(); + } + }); + } + + @Override + public String getSyncSignature() { + return String.format("delete-host-network-label[uuid:%s]", msg.getUuid()); + } + + @Override + public String getName() { + return "delete-host-network-label"; + } + }); + } + + private void handle(APIUpdateHostNetworkServiceTypeMsg msg) { + APIUpdateHostNetworkServiceTypeEvent event = new APIUpdateHostNetworkServiceTypeEvent(msg.getId()); + thdf.chainSubmit(new ChainTask(msg) { + @Override + public void run(SyncTaskChain chain) { + updateHostNetworkLabel(msg, new Completion(msg, chain){ + @Override + public void success() { + HostNetworkLabelVO vo = dbf.findByUuid(msg.getUuid(), HostNetworkLabelVO.class); + vo.setServiceType(msg.getServiceType()); + vo.setSystem(msg.isSystem()); + dbf.updateAndRefresh(vo); + logger.debug(String.format("update host network service type[uuid:%s, serviceType:%s, system:%s]", + vo.getUuid(), vo.getServiceType(), vo.getSystem())); + event.setInventory(HostNetworkLabelInventory.valueOf(vo)); + bus.publish(event); + chain.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + event.setError(errorCode); + bus.publish(event); + chain.next(); + } + }); + } + + @Override + public String getSyncSignature() { + return String.format("update-host-network-label[uuid:%s]", msg.getUuid()); + } + + @Override + public String getName() { + return "update-host-network-label"; + } + }); + } + + private void handle(APICreateHostNetworkServiceTypeMsg msg) { + HostNetworkLabelVO vo = new HostNetworkLabelVO(); + vo.setUuid(Platform.getUuid()); + vo.setServiceType(msg.getServiceType()); + vo.setSystem(msg.isSystem()); + dbf.persist(vo); + logger.debug(String.format("create host network service type[uuid:%s, serviceType:%s, system:%s]", + vo.getUuid(), vo.getServiceType(), vo.getSystem())); + APICreateHostNetworkServiceTypeEvent event = new APICreateHostNetworkServiceTypeEvent(msg.getId()); + event.setInventory(HostNetworkLabelInventory.valueOf(vo)); + bus.publish(event); + } + + private void deleteHostNetworkLabel(APIDeleteHostNetworkServiceTypeMsg msg, Completion completion) { + HostNetworkLabelVO vo = dbf.findByUuid(msg.getUuid(), HostNetworkLabelVO.class); + CollectionUtils.safeForEach(pluginRgty.getExtensionList(HostNetworkLabelExtensionPoint.class), + arg -> arg.deleteHostNetworkLabel(vo.toInventory(), completion)); + } + + private void updateHostNetworkLabel(APIUpdateHostNetworkServiceTypeMsg msg, Completion completion) { + HostNetworkLabelVO vo = dbf.findByUuid(msg.getUuid(), HostNetworkLabelVO.class); + CollectionUtils.safeForEach(pluginRgty.getExtensionList(HostNetworkLabelExtensionPoint.class), + arg -> arg.updateHostNetworkLabel(vo.toInventory(), msg.getServiceType(), completion)); + } + private void handle(APIGetHostWebSshUrlMsg msg) { APIGetHostWebSshUrlEvent event = new APIGetHostWebSshUrlEvent(msg.getId()); GetHostWebSshUrlMsg getHostWebSshUrlMsg = new GetHostWebSshUrlMsg(); diff --git a/conf/db/upgrade/V5.3.0__schema.sql b/conf/db/upgrade/V5.3.0__schema.sql index 13eed51c357..704c835d777 100644 --- a/conf/db/upgrade/V5.3.0__schema.sql +++ b/conf/db/upgrade/V5.3.0__schema.sql @@ -30,3 +30,22 @@ UPDATE `zstack`.`VmInstanceEO` SET guestOsType = 'VyOS 1.1.7' WHERE architecture UPDATE `zstack`.`VmInstanceEO` SET guestOsType = 'VyOS 1.2.0' WHERE architecture = 'aarch64' and guestOsType = 'Linux' and type = 'ApplianceVm'; UPDATE `zstack`.`VmInstanceEO` SET guestOsType = 'Kylin 10' WHERE architecture = 'loongarch64' and guestOsType = 'Linux' and type = 'ApplianceVm'; +CREATE TABLE IF NOT EXISTS `zstack`.`HostNetworkLabelVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `serviceType` varchar(255) NOT NULL, + `system` boolean NOT NULL DEFAULT TRUE, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT IGNORE INTO `zstack`.`HostNetworkLabelVO` (`uuid`, `serviceType`, `system`, `createDate`, `lastOpDate`) + VALUES (REPLACE(UUID(),'-',''),'ManagementNetwork', TRUE, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP()); +INSERT IGNORE INTO `zstack`.`HostNetworkLabelVO` (`uuid`, `serviceType`, `system`, `createDate`, `lastOpDate`) + VALUES (REPLACE(UUID(),'-',''),'StorageNetwork', TRUE, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP()); +INSERT IGNORE INTO `zstack`.`HostNetworkLabelVO` (`uuid`, `serviceType`, `system`, `createDate`, `lastOpDate`) + VALUES (REPLACE(UUID(),'-',''),'TenantNetwork', TRUE, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP()); +INSERT IGNORE INTO `zstack`.`HostNetworkLabelVO` (`uuid`, `serviceType`, `system`, `createDate`, `lastOpDate`) + VALUES (REPLACE(UUID(),'-',''),'BackupNetwork', TRUE, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP()); +INSERT IGNORE INTO `zstack`.`HostNetworkLabelVO` (`uuid`, `serviceType`, `system`, `createDate`, `lastOpDate`) + VALUES (REPLACE(UUID(),'-',''),'MigrationNetwork', TRUE, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP()); diff --git a/conf/persistence.xml b/conf/persistence.xml index f7ab2d1d00c..e7a299c4fd3 100755 --- a/conf/persistence.xml +++ b/conf/persistence.xml @@ -23,6 +23,7 @@ org.zstack.header.cluster.ClusterEO org.zstack.header.host.HostVO org.zstack.header.host.HostEO + org.zstack.header.host.HostNetworkLabelVO org.zstack.header.host.CpuFeaturesHistoryVO org.zstack.header.storage.primary.PrimaryStorageVO org.zstack.header.storage.primary.PrimaryStorageEO diff --git a/conf/serviceConfig/host.xml b/conf/serviceConfig/host.xml index dc7ab269c8f..bb076932f7e 100755 --- a/conf/serviceConfig/host.xml +++ b/conf/serviceConfig/host.xml @@ -60,4 +60,16 @@ org.zstack.header.host.APIGetHostPowerStatusMsg + + + org.zstack.header.host.APICreateHostNetworkServiceTypeMsg + + + + org.zstack.header.host.APIDeleteHostNetworkServiceTypeMsg + + + + org.zstack.header.host.APIUpdateHostNetworkServiceTypeMsg + diff --git a/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeEvent.java b/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeEvent.java new file mode 100644 index 00000000000..c75b21c4ed2 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeEvent.java @@ -0,0 +1,34 @@ +package org.zstack.header.host; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +/** + * Created by boce.wang on 10/24/2024. + */ +@RestResponse(allTo = "inventory") +public class APICreateHostNetworkServiceTypeEvent extends APIEvent { + private HostNetworkLabelInventory inventory; + + public APICreateHostNetworkServiceTypeEvent(String apiId) { + super(apiId); + } + + public APICreateHostNetworkServiceTypeEvent() { + super(null); + } + + public HostNetworkLabelInventory getInventory() { + return inventory; + } + + public void setInventory(HostNetworkLabelInventory inventory) { + this.inventory = inventory; + } + + public static APICreateHostNetworkServiceTypeEvent __example__() { + APICreateHostNetworkServiceTypeEvent event = new APICreateHostNetworkServiceTypeEvent(); + event.setInventory(new HostNetworkLabelInventory()); + return event; + } +} diff --git a/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..783f174058c --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.host + +import org.zstack.header.host.HostNetworkLabelInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "在这里输入结构的名称" + + ref { + name "inventory" + path "org.zstack.header.host.APICreateHostNetworkServiceTypeEvent.inventory" + desc "null" + type "HostNetworkLabelInventory" + since "5.2.1" + clz HostNetworkLabelInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.2.1" + } + ref { + name "error" + path "org.zstack.header.host.APICreateHostNetworkServiceTypeEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.2.1" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeMsg.java b/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeMsg.java new file mode 100644 index 00000000000..fc903f548f6 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeMsg.java @@ -0,0 +1,63 @@ +package org.zstack.header.host; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APICreateMessage; +import org.zstack.header.message.APIEvent; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.other.APIAuditor; +import org.zstack.header.rest.RestRequest; +import org.zstack.header.tag.TagResourceType; + +/** + * Created by boce.wang on 10/24/2024. + */ +@TagResourceType(HostNetworkLabelVO.class) +@Action(category = HostConstant.ACTION_CATEGORY) +@RestRequest( + path = "/hosts/service-types", + method = HttpMethod.POST, + responseClass = APICreateHostNetworkServiceTypeEvent.class, + parameterName = "params" +) +public class APICreateHostNetworkServiceTypeMsg extends APICreateMessage implements APIAuditor { + @APIParam(maxLength = 128, nonempty = true, noTrim = true) + private String serviceType; + + @APIParam(required = false, nonempty = true) + private boolean system = false; + + public String getServiceType() { + return serviceType; + } + + public void setServiceType(String serviceType) { + this.serviceType = serviceType; + } + + public boolean isSystem() { + return system; + } + + public void setSystem(boolean system) { + this.system = system; + } + + public static APICreateHostNetworkServiceTypeMsg __example__() { + APICreateHostNetworkServiceTypeMsg msg = new APICreateHostNetworkServiceTypeMsg(); + msg.setServiceType("ManagementNetwork"); + msg.setSystem(true); + return msg; + } + + @Override + public Result audit(APIMessage msg, APIEvent rsp) { + String resUuid = ""; + if (rsp.isSuccess()) { + APICreateHostNetworkServiceTypeEvent evt = (APICreateHostNetworkServiceTypeEvent) rsp; + resUuid = evt.getInventory().getUuid(); + } + return new Result(resUuid, HostNetworkLabelVO.class); + } +} diff --git a/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..91795b2339d --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeMsgDoc_zh_cn.groovy @@ -0,0 +1,85 @@ +package org.zstack.header.host + +import org.zstack.header.host.APICreateHostNetworkServiceTypeEvent + +doc { + title "CreateHostNetworkServiceType" + + category "host" + + desc """在这里填写API描述""" + + rest { + request { + url "POST /v1/hosts/service-types" + + header (Authorization: 'OAuth the-session-uuid') + + clz APICreateHostNetworkServiceTypeMsg.class + + desc """""" + + params { + + column { + name "serviceType" + enclosedIn "params" + desc "" + location "body" + type "String" + optional false + since "5.2.1" + } + column { + name "system" + enclosedIn "params" + desc "" + location "body" + type "boolean" + optional true + since "5.2.1" + } + column { + name "resourceUuid" + enclosedIn "params" + desc "资源UUID" + location "body" + type "String" + optional true + since "5.2.1" + } + column { + name "tagUuids" + enclosedIn "params" + desc "标签UUID列表" + location "body" + type "List" + optional true + since "5.2.1" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.2.1" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.2.1" + } + } + } + + response { + clz APICreateHostNetworkServiceTypeEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeEvent.java b/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeEvent.java new file mode 100644 index 00000000000..c402bd45b62 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeEvent.java @@ -0,0 +1,23 @@ +package org.zstack.header.host; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +/** + * Created by boce.wang on 10/25/2024. + */ +@RestResponse +public class APIDeleteHostNetworkServiceTypeEvent extends APIEvent { + + public APIDeleteHostNetworkServiceTypeEvent() { + } + + public APIDeleteHostNetworkServiceTypeEvent(String apiId) { + super(apiId); + } + public static APIDeleteHostNetworkServiceTypeEvent __example__() { + APIDeleteHostNetworkServiceTypeEvent event = new APIDeleteHostNetworkServiceTypeEvent(); + event.setSuccess(true); + return event; + } +} diff --git a/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..5a1598bd7a4 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeEventDoc_zh_cn.groovy @@ -0,0 +1,23 @@ +package org.zstack.header.host + +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "在这里输入结构的名称" + + field { + name "success" + desc "" + type "boolean" + since "5.2.1" + } + ref { + name "error" + path "org.zstack.header.host.APIDeleteHostNetworkServiceTypeEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.2.1" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeMsg.java b/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeMsg.java new file mode 100644 index 00000000000..896222cf1f3 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeMsg.java @@ -0,0 +1,35 @@ +package org.zstack.header.host; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APIDeleteMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; + +/** + * Created by boce.wang on 10/25/2024. + */ +@Action(category = HostConstant.ACTION_CATEGORY) +@RestRequest( + path = "/hosts/service-types/{uuid}", + method = HttpMethod.DELETE, + responseClass = APIDeleteHostNetworkServiceTypeEvent.class +) +public class APIDeleteHostNetworkServiceTypeMsg extends APIDeleteMessage { + @APIParam(resourceType = HostNetworkLabelVO.class, successIfResourceNotExisting = true, operationTarget = true) + private String uuid; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public static APIDeleteHostNetworkServiceTypeMsg __example__() { + APIDeleteHostNetworkServiceTypeMsg msg = new APIDeleteHostNetworkServiceTypeMsg(); + msg.setUuid(uuid()); + return msg; + } +} diff --git a/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..715f9294c35 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeMsgDoc_zh_cn.groovy @@ -0,0 +1,67 @@ +package org.zstack.header.host + +import org.zstack.header.host.APIDeleteHostNetworkServiceTypeEvent + +doc { + title "DeleteHostNetworkServiceType" + + category "host" + + desc """在这里填写API描述""" + + rest { + request { + url "DELETE /v1/hosts/service-types/{uuid}" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIDeleteHostNetworkServiceTypeMsg.class + + desc """""" + + params { + + column { + name "uuid" + enclosedIn "" + desc "资源的UUID,唯一标示该资源" + location "url" + type "String" + optional false + since "5.2.1" + } + column { + name "deleteMode" + enclosedIn "" + desc "删除模式(Permissive / Enforcing,Permissive)" + location "body" + type "String" + optional true + since "5.2.1" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.2.1" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.2.1" + } + } + } + + response { + clz APIDeleteHostNetworkServiceTypeEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeEvent.java b/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeEvent.java new file mode 100644 index 00000000000..1d9adb75607 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeEvent.java @@ -0,0 +1,35 @@ +package org.zstack.header.host; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +/** + * Created by boce.wang on 10/25/2024. + */ +@RestResponse(allTo = "inventory") +public class APIUpdateHostNetworkServiceTypeEvent extends APIEvent { + private HostNetworkLabelInventory inventory; + + public APIUpdateHostNetworkServiceTypeEvent() { + + } + + public APIUpdateHostNetworkServiceTypeEvent(String apiId) { + super(apiId); + } + + public HostNetworkLabelInventory getInventory() { + return inventory; + } + + public void setInventory(HostNetworkLabelInventory inventory) { + this.inventory = inventory; + } + + public static APIUpdateHostNetworkServiceTypeEvent __example__() { + APIUpdateHostNetworkServiceTypeEvent event = new APIUpdateHostNetworkServiceTypeEvent(); + event.setInventory(new HostNetworkLabelInventory()); + event.setSuccess(true); + return event; + } +} diff --git a/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..f445f88f073 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.host + +import org.zstack.header.host.HostNetworkLabelInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "在这里输入结构的名称" + + ref { + name "inventory" + path "org.zstack.header.host.APIUpdateHostNetworkServiceTypeEvent.inventory" + desc "null" + type "HostNetworkLabelInventory" + since "5.2.1" + clz HostNetworkLabelInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.2.1" + } + ref { + name "error" + path "org.zstack.header.host.APIUpdateHostNetworkServiceTypeEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.2.1" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeMsg.java b/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeMsg.java new file mode 100644 index 00000000000..973d51961a6 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeMsg.java @@ -0,0 +1,60 @@ +package org.zstack.header.host; + +import org.springframework.http.HttpMethod; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; + +/** + * Created by boce.wang on 10/25/2024. + */ +@RestRequest( + path = "/hosts/service-types/{uuid}/actions", + method = HttpMethod.PUT, + isAction = true, + responseClass = APIUpdateHostNetworkServiceTypeEvent.class + +) +public class APIUpdateHostNetworkServiceTypeMsg extends APIMessage { + + @APIParam(resourceType = HostNetworkLabelVO.class) + private String uuid; + + @APIParam(maxLength = 128, nonempty = true, noTrim = true) + private String serviceType; + + @APIParam(required = false, nonempty = true) + private boolean system = false; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getServiceType() { + return serviceType; + } + + public void setServiceType(String serviceType) { + this.serviceType = serviceType; + } + + public boolean isSystem() { + return system; + } + + public void setSystem(boolean system) { + this.system = system; + } + + public static APIUpdateHostNetworkServiceTypeMsg __example__() { + APIUpdateHostNetworkServiceTypeMsg msg = new APIUpdateHostNetworkServiceTypeMsg(); + msg.setUuid(uuid()); + msg.setServiceType("ManagementNetwork"); + msg.setSystem(true); + return msg; + } +} diff --git a/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..35c3c9e091c --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeMsgDoc_zh_cn.groovy @@ -0,0 +1,76 @@ +package org.zstack.header.host + +import org.zstack.header.host.APIUpdateHostNetworkServiceTypeEvent + +doc { + title "UpdateHostNetworkServiceType" + + category "host" + + desc """在这里填写API描述""" + + rest { + request { + url "PUT /v1/hosts/service-types/{uuid}/actions" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIUpdateHostNetworkServiceTypeMsg.class + + desc """""" + + params { + + column { + name "uuid" + enclosedIn "updateHostNetworkServiceType" + desc "资源的UUID,唯一标示该资源" + location "url" + type "String" + optional false + since "5.2.1" + } + column { + name "serviceType" + enclosedIn "updateHostNetworkServiceType" + desc "" + location "body" + type "String" + optional false + since "5.2.1" + } + column { + name "system" + enclosedIn "updateHostNetworkServiceType" + desc "" + location "body" + type "boolean" + optional true + since "5.2.1" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.2.1" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.2.1" + } + } + } + + response { + clz APIUpdateHostNetworkServiceTypeEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/host/HostNetworkLabelExtensionPoint.java b/header/src/main/java/org/zstack/header/host/HostNetworkLabelExtensionPoint.java new file mode 100644 index 00000000000..90f4d45184c --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/HostNetworkLabelExtensionPoint.java @@ -0,0 +1,12 @@ +package org.zstack.header.host; + +import org.zstack.header.core.Completion; + +/** + * Created by boce.wang on 10/25/2024. + */ +public interface HostNetworkLabelExtensionPoint { + void deleteHostNetworkLabel(HostNetworkLabelInventory hostNetworkLabel, Completion completion); + + void updateHostNetworkLabel(HostNetworkLabelInventory hostNetworkLabel, String newLabel, Completion completion); +} diff --git a/header/src/main/java/org/zstack/header/host/HostNetworkLabelInventory.java b/header/src/main/java/org/zstack/header/host/HostNetworkLabelInventory.java new file mode 100644 index 00000000000..d00fd7bee33 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/HostNetworkLabelInventory.java @@ -0,0 +1,96 @@ +package org.zstack.header.host; + +import org.zstack.header.configuration.PythonClassInventory; +import org.zstack.header.search.Inventory; +import org.zstack.header.vo.ToInventory; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Created by boce.wang on 10/24/2024. + */ +@PythonClassInventory +@Inventory(mappingVOClass = HostNetworkLabelVO.class) +public class HostNetworkLabelInventory implements Serializable { + + private String uuid; + + private String serviceType; + + private Boolean system; + + private Timestamp createDate; + + private Timestamp lastOpDate; + + protected HostNetworkLabelInventory(HostNetworkLabelVO vo) { + this.setUuid(vo.getUuid()); + this.setServiceType(vo.getServiceType()); + this.setSystem(vo.getSystem()); + this.setCreateDate(vo.getCreateDate()); + this.setLastOpDate(vo.getLastOpDate()); + } + + public HostNetworkLabelInventory() { + } + + public static HostNetworkLabelInventory valueOf(HostNetworkLabelVO vo) { + return new HostNetworkLabelInventory(vo); + } + + public static List valueOf(Collection vos) { + List invs = new ArrayList<>(vos.size()); + for (HostNetworkLabelVO vo : vos) { + invs.add(HostNetworkLabelInventory.valueOf(vo)); + } + return invs; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getServiceType() { + return serviceType; + } + + public void setServiceType(String serviceType) { + this.serviceType = serviceType; + } + + public Boolean getSystem() { + return system; + } + + public void setSystem(Boolean system) { + this.system = system; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } +} diff --git a/header/src/main/java/org/zstack/header/host/HostNetworkLabelInventoryDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/host/HostNetworkLabelInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..99dc14838e5 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/HostNetworkLabelInventoryDoc_zh_cn.groovy @@ -0,0 +1,40 @@ +package org.zstack.header.host + +import java.lang.Boolean +import java.sql.Timestamp + +doc { + + title "在这里输入结构的名称" + + field { + name "uuid" + desc "资源的UUID,唯一标示该资源" + type "String" + since "5.2.1" + } + field { + name "serviceType" + desc "" + type "String" + since "5.2.1" + } + field { + name "system" + desc "" + type "Boolean" + since "5.2.1" + } + field { + name "createDate" + desc "创建时间" + type "Timestamp" + since "5.2.1" + } + field { + name "lastOpDate" + desc "最后一次修改时间" + type "Timestamp" + since "5.2.1" + } +} diff --git a/header/src/main/java/org/zstack/header/host/HostNetworkLabelVO.java b/header/src/main/java/org/zstack/header/host/HostNetworkLabelVO.java new file mode 100644 index 00000000000..068a594196c --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/HostNetworkLabelVO.java @@ -0,0 +1,68 @@ +package org.zstack.header.host; + +import org.zstack.header.vo.ToInventory; + +import javax.persistence.*; +import java.sql.Timestamp; + +/** + * Created by boce.wang on 10/24/2024. + */ +@Entity +@Table +public class HostNetworkLabelVO implements ToInventory { + @Id + @Column + private String uuid; + + @Column + private String serviceType; + + @Column + private Boolean system; + + @Column + private Timestamp createDate; + @Column + private Timestamp lastOpDate; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getServiceType() { + return serviceType; + } + + public void setServiceType(String serviceType) { + this.serviceType = serviceType; + } + + public Boolean getSystem() { + return system; + } + + public void setSystem(Boolean system) { + this.system = system; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } +} diff --git a/header/src/main/java/org/zstack/header/host/HostNetworkLabelVO_.java b/header/src/main/java/org/zstack/header/host/HostNetworkLabelVO_.java new file mode 100644 index 00000000000..3220ddc26e5 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/HostNetworkLabelVO_.java @@ -0,0 +1,16 @@ +package org.zstack.header.host; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; +import java.sql.Timestamp; +/** + * Created by boce.wang on 10/24/2024. + */ +@StaticMetamodel(HostNetworkLabelVO.class) +public class HostNetworkLabelVO_ { + public static volatile SingularAttribute uuid; + public static volatile SingularAttribute serviceType; + public static volatile SingularAttribute system; + public static volatile SingularAttribute createDate; + public static volatile SingularAttribute lastOpDate; +} diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 83153859732..95afa93860d 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -239,7 +239,7 @@ public class SourceClassMap { put("org.zstack.header.host.HostNUMANode", "org.zstack.sdk.HostNUMANode"); put("org.zstack.header.host.HostNetworkBondingServiceRefInventory", "org.zstack.sdk.HostNetworkBondingServiceRefInventory"); put("org.zstack.header.host.HostNetworkInterfaceServiceRefInventory", "org.zstack.sdk.HostNetworkInterfaceServiceRefInventory"); - put("org.zstack.header.host.HostNetworkInterfaceServiceType", "org.zstack.sdk.HostNetworkInterfaceServiceType"); + put("org.zstack.header.host.HostNetworkLabelInventory", "org.zstack.sdk.HostNetworkLabelInventory"); put("org.zstack.header.host.HostPhysicalMemoryInventory", "org.zstack.sdk.HostPhysicalMemoryInventory"); put("org.zstack.header.host.HwMonitorStatus", "org.zstack.sdk.HwMonitorStatus"); put("org.zstack.header.host.ServiceTypeStatisticData", "org.zstack.sdk.ServiceTypeStatisticData"); @@ -987,7 +987,7 @@ public class SourceClassMap { put("org.zstack.sdk.HostNetworkInterfaceLldpInventory", "org.zstack.network.hostNetworkInterface.lldp.entity.HostNetworkInterfaceLldpInventory"); put("org.zstack.sdk.HostNetworkInterfaceLldpRefInventory", "org.zstack.network.hostNetworkInterface.lldp.entity.HostNetworkInterfaceLldpRefInventory"); put("org.zstack.sdk.HostNetworkInterfaceServiceRefInventory", "org.zstack.header.host.HostNetworkInterfaceServiceRefInventory"); - put("org.zstack.sdk.HostNetworkInterfaceServiceType", "org.zstack.header.host.HostNetworkInterfaceServiceType"); + put("org.zstack.sdk.HostNetworkLabelInventory", "org.zstack.header.host.HostNetworkLabelInventory"); put("org.zstack.sdk.HostOsCategoryInventory", "org.zstack.kvm.hypervisor.datatype.HostOsCategoryInventory"); put("org.zstack.sdk.HostPhysicalMemoryInventory", "org.zstack.header.host.HostPhysicalMemoryInventory"); put("org.zstack.sdk.HostSchedulingRuleGroupInventory", "org.zstack.header.vmscheduling.HostSchedulingRuleGroupInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/CreateHostNetworkServiceTypeAction.java b/sdk/src/main/java/org/zstack/sdk/CreateHostNetworkServiceTypeAction.java new file mode 100644 index 00000000000..83211eb4a06 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateHostNetworkServiceTypeAction.java @@ -0,0 +1,110 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateHostNetworkServiceTypeAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.CreateHostNetworkServiceTypeResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, maxLength = 128, nonempty = true, nullElements = false, emptyString = true, noTrim = true) + public java.lang.String serviceType; + + @Param(required = false, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public boolean system = false; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.CreateHostNetworkServiceTypeResult value = res.getResult(org.zstack.sdk.CreateHostNetworkServiceTypeResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateHostNetworkServiceTypeResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/hosts/service-types"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateHostNetworkServiceTypeResult.java b/sdk/src/main/java/org/zstack/sdk/CreateHostNetworkServiceTypeResult.java new file mode 100644 index 00000000000..eb7ea596c98 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateHostNetworkServiceTypeResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.HostNetworkLabelInventory; + +public class CreateHostNetworkServiceTypeResult { + public HostNetworkLabelInventory inventory; + public void setInventory(HostNetworkLabelInventory inventory) { + this.inventory = inventory; + } + public HostNetworkLabelInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteHostNetworkServiceTypeAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteHostNetworkServiceTypeAction.java new file mode 100644 index 00000000000..63244fb2abf --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteHostNetworkServiceTypeAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteHostNetworkServiceTypeAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeleteHostNetworkServiceTypeResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeleteHostNetworkServiceTypeResult value = res.getResult(org.zstack.sdk.DeleteHostNetworkServiceTypeResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteHostNetworkServiceTypeResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/hosts/service-types/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteHostNetworkServiceTypeResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteHostNetworkServiceTypeResult.java new file mode 100644 index 00000000000..5261696a940 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteHostNetworkServiceTypeResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteHostNetworkServiceTypeResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/HostNetworkBondingServiceRefInventory.java b/sdk/src/main/java/org/zstack/sdk/HostNetworkBondingServiceRefInventory.java index 7944ebf3018..2849c11e6d0 100644 --- a/sdk/src/main/java/org/zstack/sdk/HostNetworkBondingServiceRefInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/HostNetworkBondingServiceRefInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk; -import org.zstack.sdk.HostNetworkInterfaceServiceType; + public class HostNetworkBondingServiceRefInventory { @@ -20,11 +20,11 @@ public java.lang.Integer getVlanId() { return this.vlanId; } - public HostNetworkInterfaceServiceType serviceType; - public void setServiceType(HostNetworkInterfaceServiceType serviceType) { + public java.lang.String serviceType; + public void setServiceType(java.lang.String serviceType) { this.serviceType = serviceType; } - public HostNetworkInterfaceServiceType getServiceType() { + public java.lang.String getServiceType() { return this.serviceType; } diff --git a/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceServiceRefInventory.java b/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceServiceRefInventory.java index 8a3264bb43d..aec8183adcd 100644 --- a/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceServiceRefInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceServiceRefInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk; -import org.zstack.sdk.HostNetworkInterfaceServiceType; + public class HostNetworkInterfaceServiceRefInventory { @@ -20,11 +20,11 @@ public java.lang.Integer getVlanId() { return this.vlanId; } - public HostNetworkInterfaceServiceType serviceType; - public void setServiceType(HostNetworkInterfaceServiceType serviceType) { + public java.lang.String serviceType; + public void setServiceType(java.lang.String serviceType) { this.serviceType = serviceType; } - public HostNetworkInterfaceServiceType getServiceType() { + public java.lang.String getServiceType() { return this.serviceType; } diff --git a/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceServiceType.java b/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceServiceType.java deleted file mode 100644 index 6acd83e4257..00000000000 --- a/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceServiceType.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.zstack.sdk; - -public enum HostNetworkInterfaceServiceType { - ManagementNetwork, - TenantNetwork, - StorageNetwork, - BackupNetwork, - MigrationNetwork, -} diff --git a/sdk/src/main/java/org/zstack/sdk/HostNetworkLabelInventory.java b/sdk/src/main/java/org/zstack/sdk/HostNetworkLabelInventory.java new file mode 100644 index 00000000000..d722925e8ee --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/HostNetworkLabelInventory.java @@ -0,0 +1,47 @@ +package org.zstack.sdk; + + + +public class HostNetworkLabelInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String serviceType; + public void setServiceType(java.lang.String serviceType) { + this.serviceType = serviceType; + } + public java.lang.String getServiceType() { + return this.serviceType; + } + + public java.lang.Boolean system; + public void setSystem(java.lang.Boolean system) { + this.system = system; + } + public java.lang.Boolean getSystem() { + return this.system; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkBondingAction.java b/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkBondingAction.java index ce3ecf30074..10006e8719d 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkBondingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkBondingAction.java @@ -31,7 +31,7 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List vlanIds; - @Param(required = false, validValues = {"ManagementNetwork","TenantNetwork","StorageNetwork","BackupNetwork","MigrationNetwork"}, maxLength = 128, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, maxLength = 128, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List serviceTypes; @Param(required = false) diff --git a/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkInterfaceAction.java b/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkInterfaceAction.java index 9410d86643f..1866d621f36 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkInterfaceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkInterfaceAction.java @@ -31,7 +31,7 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List vlanIds; - @Param(required = false, validValues = {"ManagementNetwork","TenantNetwork","StorageNetwork","BackupNetwork","MigrationNetwork"}, maxLength = 128, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, maxLength = 128, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List serviceTypes; @Param(required = false) diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkServiceTypeAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkServiceTypeAction.java new file mode 100644 index 00000000000..7842f4d353f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkServiceTypeAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateHostNetworkServiceTypeAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UpdateHostNetworkServiceTypeResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = true, maxLength = 128, nonempty = true, nullElements = false, emptyString = true, noTrim = true) + public java.lang.String serviceType; + + @Param(required = false, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public boolean system = false; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UpdateHostNetworkServiceTypeResult value = res.getResult(org.zstack.sdk.UpdateHostNetworkServiceTypeResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateHostNetworkServiceTypeResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/hosts/service-types/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateHostNetworkServiceType"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkServiceTypeResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkServiceTypeResult.java new file mode 100644 index 00000000000..3dcaf4ee0f8 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkServiceTypeResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.HostNetworkLabelInventory; + +public class UpdateHostNetworkServiceTypeResult { + public HostNetworkLabelInventory inventory; + public void setInventory(HostNetworkLabelInventory inventory) { + this.inventory = inventory; + } + public HostNetworkLabelInventory getInventory() { + return this.inventory; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 608b5713264..2d725d26b6d 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -1184,20 +1184,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -1994,20 +1994,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -2021,20 +2021,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -2048,20 +2048,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -2237,20 +2237,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -2264,7 +2264,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -4721,20 +4721,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -4748,7 +4748,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -8663,20 +8663,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -9332,6 +9332,33 @@ abstract class ApiHelper { } + def createHostNetworkServiceType(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateHostNetworkServiceTypeAction.class) Closure c) { + def a = new org.zstack.sdk.CreateHostNetworkServiceTypeAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def createHostSchedulingRuleGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateHostSchedulingRuleGroupAction.class) Closure c) { def a = new org.zstack.sdk.CreateHostSchedulingRuleGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -10931,20 +10958,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -10958,7 +10985,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -13172,20 +13199,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -13199,7 +13226,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -13280,20 +13307,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -13988,14 +14015,41 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + + return out + } else { + return errorOut(a.call()) + } + } + + + def deleteHostNetworkServiceType(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteHostNetworkServiceTypeAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteHostNetworkServiceTypeAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + return out } else { return errorOut(a.call()) @@ -14711,20 +14765,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -14738,20 +14792,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -14765,20 +14819,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -14792,20 +14846,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -14819,20 +14873,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -14846,20 +14900,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -16034,20 +16088,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -16061,7 +16115,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -17114,20 +17168,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -17141,20 +17195,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -17168,20 +17222,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -20624,20 +20678,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -22352,20 +22406,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -27530,7 +27584,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -27538,14 +27592,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -28632,7 +28686,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -28640,14 +28694,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -28748,7 +28802,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -28756,14 +28810,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -31097,7 +31151,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -31105,14 +31159,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -31126,7 +31180,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -31134,14 +31188,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -31155,7 +31209,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -31163,14 +31217,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -31184,7 +31238,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -31192,14 +31246,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -31213,7 +31267,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -31221,14 +31275,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -31242,7 +31296,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -31250,14 +31304,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -33069,7 +33123,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -33077,14 +33131,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -33214,7 +33268,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -33222,14 +33276,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -38726,20 +38780,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -39617,20 +39671,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -39644,7 +39698,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -41264,20 +41318,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -41291,20 +41345,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -41318,7 +41372,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -42161,14 +42215,41 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + + return out + } else { + return errorOut(a.call()) + } + } + + + def updateHostNetworkServiceType(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateHostNetworkServiceTypeAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateHostNetworkServiceTypeAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + return out } else { return errorOut(a.call()) @@ -42857,20 +42938,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -42884,20 +42965,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -42911,20 +42992,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -42938,20 +43019,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -44153,20 +44234,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -47905,20 +47986,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -47932,20 +48013,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -47959,20 +48040,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -47986,20 +48067,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -48013,20 +48094,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -48040,7 +48121,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { diff --git a/testlib/src/main/java/org/zstack/testlib/EnvSpec.groovy b/testlib/src/main/java/org/zstack/testlib/EnvSpec.groovy index 6308fb85707..66c73314585 100755 --- a/testlib/src/main/java/org/zstack/testlib/EnvSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/EnvSpec.groovy @@ -706,7 +706,8 @@ class EnvSpec extends ApiHelper implements Node { "PortMirrorSessionSequenceNumberVO", "LicenseHistoryVO", "EventLogVO", "VmSchedHistoryVO", "EventRecordsVO", "AuditsVO", "AlarmRecordsVO", "VmCrashHistoryVO", "EncryptionIntegrityVO", "FileIntegrityVerificationVO", "EncryptEntityMetadataVO", "VmInstanceDeviceAddressGroupVO", "HostOsCategoryVO", "KvmHostHypervisorMetadataVO", - "HaStrategyConditionVO", "SystemTagVO", "ConsoleProxyAgentVO", "ConsoleProxyVO", "XmlHookVO", "SSOServerTokenVO"]) { + "HaStrategyConditionVO", "SystemTagVO", "ConsoleProxyAgentVO", "ConsoleProxyVO", "XmlHookVO", "SSOServerTokenVO", + "HostNetworkLabelVO"]) { return } From 60c9bf38bc645953bedb0338640d032007709b75 Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Thu, 7 Nov 2024 13:07:26 +0800 Subject: [PATCH 160/737] [virtualRouterProvider]: reset qos after vpc hot migrate with vf nic fix vpc hot migrate with vf nic losing vip and qos config Resolves: ZSTAC-70375 Change-Id: I6868776ca0e45a1abb74482d827d72373ce5d6c1 --- .../virtualrouter/VirtualRouterCommands.java | 10 ++++++++++ .../virtualrouter/VirtualRouterManagerImpl.java | 14 +++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterCommands.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterCommands.java index 372ccf9a888..51dfcfd76f3 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterCommands.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterCommands.java @@ -1050,6 +1050,8 @@ public static class CreateVipCmd extends AgentCommand { /* sync all vips to virtual router together with nic ips*/ @GrayVersion(value = "5.0.0") private List nicIps; + @GrayVersion(value = "5.3.0") + private Boolean resetQosRules; public Boolean getSyncVip() { return syncVip; @@ -1074,6 +1076,14 @@ public List getNicIps() { public void setNicIps(List nicIps) { this.nicIps = nicIps; } + + public Boolean getResetQosRules() { + return resetQosRules; + } + + public void setResetQosRules(Boolean resetQosRules) { + this.resetQosRules = resetQosRules; + } } public static class RemoveVipCmd extends AgentCommand { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java index de297a504ab..b5ad6e50f9d 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java @@ -2660,10 +2660,17 @@ public void afterMigrateVm(VmInstanceInventory inv, String srcHostUuid, NoErrorC completion.done(); return; } + List nicIps = new ArrayList<>(); + for (VmNicInventory nic : inv.getVmNics()) { + nicIps.add(NicIpTO.valueOf(nic)); + } + CreateVipCmd cmd = new CreateVipCmd(); - cmd.setSyncVip(false); + cmd.setSyncVip(true); cmd.setVips(vips); + cmd.setNicIps(nicIps); + cmd.setResetQosRules(true); VirtualRouterAsyncHttpCallMsg msg = new VirtualRouterAsyncHttpCallMsg(); msg.setVmInstanceUuid(inv.getUuid()); @@ -2705,8 +2712,9 @@ public void run(MessageReply reply) { private List findVipsOnVirtualRouter(List vfNics, String vrUuid) { List vipUuids = SQL.New("select vip.uuid from VipVO vip, VipPeerL3NetworkRefVO ref " + - "where ref.vipUuid = vip.uuid and vip.system = false " + - "and ref.l3NetworkUuid in (:l3NetworkUuids)") + "where ref.vipUuid = vip.uuid " + + "and (ref.l3NetworkUuid in (:l3NetworkUuids) " + + "or vip.l3NetworkUuid in (:l3NetworkUuids))") .param("l3NetworkUuids", vfNics.stream().map(VmNicInventory::getL3NetworkUuid).collect(Collectors.toList())) .list(); From 05dba669e3103d5b71ee1595a67f55a8fde68e17 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Thu, 24 Oct 2024 20:49:17 +0800 Subject: [PATCH 161/737] [loadBalancer]: euler vrouter phase 2 Resolves: ZSTAC-69572 Change-Id: I70716f6471646a66696870756362766871646969 --- .../ApplianceVmSyncConfigToHaGroupFlow.java | 5 +++ .../lb/LoadBalancerApiInterceptor.java | 41 +++++++++++++++++++ .../virtualrouter/VirtualRouterConstant.java | 1 + 3 files changed, 47 insertions(+) diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmSyncConfigToHaGroupFlow.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmSyncConfigToHaGroupFlow.java index b2efff75d25..f6433296b5e 100644 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmSyncConfigToHaGroupFlow.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmSyncConfigToHaGroupFlow.java @@ -42,6 +42,7 @@ public void run(final FlowTrigger chain, Map data) { List exps = pluginRgty.getExtensionList(ApplianceVmSyncConfigToHaGroupExtensionPoint.class); if (exps == null || exps.isEmpty()) { + logger.debug(String.format("there is no exp for ApplianceVmSyncConfigToHaGroupExtensionPoint")); chain.next(); return; } @@ -50,11 +51,13 @@ public void run(final FlowTrigger chain, Map data) { if (spec.getMessage() instanceof APIStartVmInstanceMsg) { systemTags = ((APIStartVmInstanceMsg)spec.getMessage()).getSystemTags(); } else { + logger.debug("msg is not APIStartVmInstanceMsg"); chain.next(); return; } if (systemTags == null || systemTags.isEmpty()) { + logger.debug("there is no systemTags"); chain.next(); return; } @@ -63,6 +66,7 @@ public void run(final FlowTrigger chain, Map data) { ApplianceVmVO applianceVmVO = dbf.findByUuid(inv.getUuid(), ApplianceVmVO.class); /* only handle first join ha group */ if (applianceVmVO.isHaEnabled()) { + logger.debug(String.format("applianceVm[uuid:%s] is in hastatus", inv.getUuid())); chain.next(); return; } @@ -77,6 +81,7 @@ public void run(final FlowTrigger chain, Map data) { haUuid = token.get(ApplianceVmSystemTags.APPLIANCEVM_HA_UUID_TOKEN); } if (haUuid == null) { + logger.debug(String.format("there is not ha group uuid")); chain.next(); return; } diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerApiInterceptor.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerApiInterceptor.java index dda0b0dc910..6a5a55291a4 100755 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerApiInterceptor.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerApiInterceptor.java @@ -675,12 +675,22 @@ private Boolean verifyHttpCode(String httpCode) { } private void validate(APICreateLoadBalancerListenerMsg msg) { + LoadBalancerVO lbVO = dbf.findByUuid(msg.getLoadBalancerUuid(), LoadBalancerVO.class); + if (msg.getInstancePort() == null) { msg.setInstancePort(msg.getLoadBalancerPort()); } if (msg.getProtocol() == null) { msg.setProtocol(LoadBalancerConstants.LB_PROTOCOL_TCP); } + + if (msg.getProtocol().equals(LB_PROTOCOL_UDP)) { + if (!StringUtils.isEmpty(lbVO.getVipUuid()) && !StringUtils.isEmpty(lbVO.getIpv6VipUuid())) { + throw new ApiMessageInterceptionException( + operr("can not create listener because udp listener can not have both ipv4 and ipv6 vip", + msg.getProtocol(), msg.getHealthCheckProtocol())); + } + } if (msg.getHealthCheckProtocol() == null) { if (LoadBalancerConstants.LB_PROTOCOL_UDP.equals(msg.getProtocol())) { msg.setHealthCheckProtocol(LoadBalancerConstants.HEALTH_CHECK_TARGET_PROTOCL_UDP); @@ -1725,6 +1735,37 @@ private void validate(APIAddServerGroupToLoadBalancerListenerMsg msg){ .eq(LoadBalancerServerGroupVO_.uuid,msg.getServerGroupUuid()) .findValue(); msg.setLoadBalancerUuid(loadBalancerUuid); + + /* until 5.3.0, udp lb only has 2 use case: ipv4 vip --> ipv4 backend + + * ipv6 vip --> ipv6 backend */ + LoadBalancerListenerVO listenerVO = dbf.findByUuid(msg.getlistenerUuid(), + LoadBalancerListenerVO.class); + LoadBalancerVO lbVO = dbf.findByUuid(loadBalancerUuid, LoadBalancerVO.class); + LoadBalancerServerGroupVO groupVO = dbf.findByUuid(msg.getServerGroupUuid(), LoadBalancerServerGroupVO.class); + if (listenerVO.getProtocol().equals(LB_PROTOCOL_UDP)) { + if (!StringUtils.isEmpty(lbVO.getVipUuid()) && + !StringUtils.isEmpty(lbVO.getIpv6VipUuid())) { + throw new ApiMessageInterceptionException(operr( + "could not add server group[uuid:%s} to listener [uuid:%s], " + + "because udp listener can not has both ipv4 and ipv6 vip", + msg.getServerGroupUuid(),msg.getlistenerUuid())); + } + + if (groupVO.getIpVersion() == IPv6Constants.IPv4 && !StringUtils.isEmpty(lbVO.getIpv6VipUuid())) { + throw new ApiMessageInterceptionException(operr( + "could not add server group[uuid:%s} to listener [uuid:%s], " + + "because udp listener can not map ipv6 to ipv4 backend", + msg.getServerGroupUuid(),msg.getlistenerUuid())); + } + + if (groupVO.getIpVersion() == IPv6Constants.IPv6 && !StringUtils.isEmpty(lbVO.getVipUuid())) { + throw new ApiMessageInterceptionException(operr( + "could not add server group[uuid:%s} to listener [uuid:%s], " + + "because udp listener can not map ipv4 to ipv6 backend", + msg.getServerGroupUuid(),msg.getlistenerUuid())); + } + } + } private void validate(APIRemoveServerGroupFromLoadBalancerListenerMsg msg){ diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterConstant.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterConstant.java index b5280abd536..3c1506748d3 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterConstant.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterConstant.java @@ -60,6 +60,7 @@ public interface VirtualRouterConstant { public static final String SNAT_NETWORK_SERVICE_TYPE = "SNAT"; public static final String IPSEC_NETWORK_SERVICE_TYPE = "IPsec"; public static final String IPSEC_NETWORK_SERVICE_LATEST_VERSION = "5.9.4"; + public static final String IPSEC_NETWORK_SERVICE_EULER_2203 = "5.9.7"; public static final String IPSEC_NETWORK_SERVICE_OLD_VERSION = "4.5.2"; public static final String VR_CHANGE_DEFAULT_ROUTE_JOB = "changeDefaultNic"; From 6625fe95bcc36cef2fc27419753bef3278b5fbaf Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Fri, 8 Dec 2023 13:22:30 +0800 Subject: [PATCH 162/737] [storage-device]: get lun multipath info MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit support obtaining multipath information for lun, including: path、status、name、target, state Resolves: ZSTAC-69663 Change-Id: I6b686f67746967616e61716d70697877676e6562 --- sdk/src/main/java/SourceClassMap.java | 4 + .../main/java/org/zstack/sdk/DeviceTO.java | 47 +++++++++ .../sdk/GetHostMultipathTopologyAction.java | 98 +++++++++++++++++++ .../sdk/GetHostMultipathTopologyResult.java | 14 +++ .../zstack/sdk/MultipathTopologyStruct.java | 23 +++++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ 6 files changed, 213 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/DeviceTO.java create mode 100644 sdk/src/main/java/org/zstack/sdk/GetHostMultipathTopologyAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/GetHostMultipathTopologyResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/MultipathTopologyStruct.java diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 95afa93860d..316385353fe 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -633,6 +633,8 @@ public class SourceClassMap { put("org.zstack.storage.device.localRaid.RaidPhysicalDriveInventory", "org.zstack.sdk.RaidPhysicalDriveInventory"); put("org.zstack.storage.device.localRaid.RunningState", "org.zstack.sdk.RunningState"); put("org.zstack.storage.device.localRaid.SmartDataStruct", "org.zstack.sdk.SmartDataStruct"); + put("org.zstack.storage.device.multipath.DeviceTO", "org.zstack.sdk.DeviceTO"); + put("org.zstack.storage.device.multipath.MultipathTopologyStruct", "org.zstack.sdk.MultipathTopologyStruct"); put("org.zstack.storage.device.nvme.NvmeLunHostRefInventory", "org.zstack.sdk.NvmeLunHostRefInventory"); put("org.zstack.storage.device.nvme.NvmeLunInventory", "org.zstack.sdk.NvmeLunInventory"); put("org.zstack.storage.device.nvme.NvmeServerClusterRefInventory", "org.zstack.sdk.NvmeServerClusterRefInventory"); @@ -916,6 +918,7 @@ public class SourceClassMap { put("org.zstack.sdk.DataVolumeSpendingInventory", "org.zstack.billing.spendingcalculator.volume.data.DataVolumeSpendingInventory"); put("org.zstack.sdk.DatasetInventory", "org.zstack.ai.entity.DatasetInventory"); put("org.zstack.sdk.DeleteSnapshotGroupResult", "org.zstack.header.storage.snapshot.group.DeleteSnapshotGroupResult"); + put("org.zstack.sdk.DeviceTO", "org.zstack.storage.device.multipath.DeviceTO"); put("org.zstack.sdk.DirectoryInventory", "org.zstack.directory.DirectoryInventory"); put("org.zstack.sdk.DiskOfferingInventory", "org.zstack.header.configuration.DiskOfferingInventory"); put("org.zstack.sdk.ESXHostInventory", "org.zstack.vmware.ESXHostInventory"); @@ -1103,6 +1106,7 @@ public class SourceClassMap { put("org.zstack.sdk.MulticastRouterInventory", "org.zstack.multicast.router.header.MulticastRouterInventory"); put("org.zstack.sdk.MulticastRouterRendezvousPointInventory", "org.zstack.multicast.router.header.MulticastRouterRendezvousPointInventory"); put("org.zstack.sdk.MulticastRouterVpcVRouterRefInventory", "org.zstack.multicast.router.header.MulticastRouterVpcVRouterRefInventory"); + put("org.zstack.sdk.MultipathTopologyStruct", "org.zstack.storage.device.multipath.MultipathTopologyStruct"); put("org.zstack.sdk.NasFileSystemInventory", "org.zstack.nas.NasFileSystemInventory"); put("org.zstack.sdk.NasMountTargetInventory", "org.zstack.nas.NasMountTargetInventory"); put("org.zstack.sdk.NasProtocolType", "org.zstack.nas.NasProtocolType"); diff --git a/sdk/src/main/java/org/zstack/sdk/DeviceTO.java b/sdk/src/main/java/org/zstack/sdk/DeviceTO.java new file mode 100644 index 00000000000..47f7908474f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeviceTO.java @@ -0,0 +1,47 @@ +package org.zstack.sdk; + + + +public class DeviceTO { + + public java.lang.String disk; + public void setDisk(java.lang.String disk) { + this.disk = disk; + } + public java.lang.String getDisk() { + return this.disk; + } + + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + + public java.lang.String state; + public void setState(java.lang.String state) { + this.state = state; + } + public java.lang.String getState() { + return this.state; + } + + public java.lang.String target; + public void setTarget(java.lang.String target) { + this.target = target; + } + public java.lang.String getTarget() { + return this.target; + } + + public java.lang.String targetType; + public void setTargetType(java.lang.String targetType) { + this.targetType = targetType; + } + public java.lang.String getTargetType() { + return this.targetType; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetHostMultipathTopologyAction.java b/sdk/src/main/java/org/zstack/sdk/GetHostMultipathTopologyAction.java new file mode 100644 index 00000000000..f4dbe5bbe3a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetHostMultipathTopologyAction.java @@ -0,0 +1,98 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetHostMultipathTopologyAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.GetHostMultipathTopologyResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @Param(required = true, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.util.List diskUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.GetHostMultipathTopologyResult value = res.getResult(org.zstack.sdk.GetHostMultipathTopologyResult.class); + ret.value = value == null ? new org.zstack.sdk.GetHostMultipathTopologyResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/storage-devices/multipath/topology"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetHostMultipathTopologyResult.java b/sdk/src/main/java/org/zstack/sdk/GetHostMultipathTopologyResult.java new file mode 100644 index 00000000000..f9e53a6b39e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetHostMultipathTopologyResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class GetHostMultipathTopologyResult { + public java.util.List results; + public void setResults(java.util.List results) { + this.results = results; + } + public java.util.List getResults() { + return this.results; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/MultipathTopologyStruct.java b/sdk/src/main/java/org/zstack/sdk/MultipathTopologyStruct.java new file mode 100644 index 00000000000..18b8bb8977b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/MultipathTopologyStruct.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class MultipathTopologyStruct { + + public java.lang.String diskUuid; + public void setDiskUuid(java.lang.String diskUuid) { + this.diskUuid = diskUuid; + } + public java.lang.String getDiskUuid() { + return this.diskUuid; + } + + public java.util.List devices; + public void setDevices(java.util.List devices) { + this.devices = devices; + } + public java.util.List getDevices() { + return this.devices; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 2d725d26b6d..0c4987e67f4 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -23507,6 +23507,33 @@ abstract class ApiHelper { } + def getHostMultipathTopology(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostMultipathTopologyAction.class) Closure c) { + def a = new org.zstack.sdk.GetHostMultipathTopologyAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def getSignatureServerEncryptPublicKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetSignatureServerEncryptPublicKeyAction.class) Closure c) { def a = new org.zstack.sdk.GetSignatureServerEncryptPublicKeyAction() From 9653ac2a2eb703cdedbc5421929f405d18b66aae Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Mon, 21 Oct 2024 13:50:07 +0800 Subject: [PATCH 163/737] [sharedblock]: add sblk storage performance monitoring and physical volume path state alarm add sblk storage performance monitoring and physical volume path state alarm Resolves/Related: ZSTAC-69663 Change-Id: I6672776a697874766f72626d6f6d70626d78707a --- .../header/host/HostCanonicalEvents.java | 53 +++++++++++++++++-- .../org/zstack/header/host/HostHardware.java | 1 + .../main/java/org/zstack/kvm/KVMConstant.java | 3 ++ .../java/org/zstack/kvm/KVMHostFactory.java | 19 ++++--- 4 files changed, 67 insertions(+), 9 deletions(-) diff --git a/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java b/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java index 8f177ed791e..553f1753eaa 100755 --- a/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java +++ b/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java @@ -4,9 +4,6 @@ import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.message.NeedJsonSchema; -import java.util.HashMap; -import java.util.Map; - /** * Created by xing5 on 2016/3/22. */ @@ -32,6 +29,7 @@ public class HostCanonicalEvents { public static final String HOST_PHYSICAL_VGPU_STATUS_ABNORMAL = "/host/physicalVGpu/status/abnormal"; public static final String HOST_PHYSICAL_RAID_STATUS_ABNORMAL = "/host/physicalRaid/status/abnormal"; public static final String HOST_PHYSICAL_HBA_STATE_ABNORMAL = "/host/physicalHBA/state/abnormal"; + public static final String HOST_PHYSICAL_VOLUME_STATE_ABNORMAL = "/host/physicalVolume/state/abnormal"; @NeedJsonSchema public static class HostPhysicalHbaPortStateAbnormalData { @@ -420,6 +418,55 @@ public void setSlotNumber(String slotNumber) { } } + @NeedJsonSchema + public static class HostPhysicalVolumeStateAbnormalData { + private String hostUuid; + private String diskName; + private String diskUuids; // example: scsi-360014058e50754920324473a4c85c767;wwn-0x60014058e50754920324473a4c85c767 + private String state; + private String vgName; + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getDiskName() { + return diskName; + } + + public void setDiskName(String diskName) { + this.diskName = diskName; + } + + public String getDiskUuids() { + return diskUuids; + } + + public void setDiskUuids(String diskUuids) { + this.diskUuids = diskUuids; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getVgName() { + return vgName; + } + + public void setVgName(String vgName) { + this.vgName = vgName; + } + } + @NeedJsonSchema public static class HostPhysicalMemoryEccErrorData { private String hostUuid; diff --git a/header/src/main/java/org/zstack/header/host/HostHardware.java b/header/src/main/java/org/zstack/header/host/HostHardware.java index 2ed54c8c575..7b5464eb26a 100644 --- a/header/src/main/java/org/zstack/header/host/HostHardware.java +++ b/header/src/main/java/org/zstack/header/host/HostHardware.java @@ -12,6 +12,7 @@ public enum HostHardware { POWERSUPPLY, FAN, RAID, + PHYSICAL_VOLUME, UNKNOWN; public static HostHardware fromString(String name) { diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java index 4dee07ddc3b..bc8483cec60 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java @@ -155,9 +155,12 @@ public interface KVMConstant { String MEMORY_LOCATOR_NAME = "locator"; String PHSICAL_DEVICE_STATUS_NAME = "status"; + String PHYSICAL_DEVICE_STATE_NAME = "state"; + String PHYSICAL_DEVICE_DISK_UUIDS = "diskUuids"; String CPU_NAME = "cpuName"; String PCI_DEVICE_ADDRESS = "pcideviceAddress"; String DEVICE_NAME = "name"; + String VOLUME_GROUP_NAME = "volumeGroup"; String DEVICE_SERIAL_NUMBER = "serial_number"; String ENCLOSURE_DEVICE_ID = "enclosure_device_id"; String SLOT_NUMBER = "slot_number"; diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java index 6947b3a6d31..24bc2c8b25e 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java @@ -11,16 +11,11 @@ import org.zstack.core.config.schema.GuestOsCharacter; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.network.l2.*; -import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.tag.SystemTagInventory; import org.zstack.header.tag.SystemTagLifeCycleListener; import org.zstack.header.tag.SystemTagValidator; import org.zstack.header.vm.devices.VmInstanceDeviceManager; import org.zstack.network.l3.ServiceTypeExtensionPoint; -import org.zstack.kvm.xmlhook.APICreateVmUserDefinedXmlHookScriptMsg; -import org.zstack.kvm.xmlhook.XmlHookBase; -import org.zstack.kvm.xmlhook.XmlHookMessage; -import org.zstack.kvm.xmlhook.XmlHookVO; import org.zstack.resourceconfig.ResourceConfig; import org.zstack.resourceconfig.ResourceConfigFacade; import org.zstack.core.CoreGlobalProperty; @@ -87,7 +82,6 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; import static org.zstack.kvm.KVMAgentCommands.*; -import static org.zstack.core.Platform.*; import static org.zstack.kvm.KVMConstant.CPU_MODE_NONE; public class KVMHostFactory extends AbstractService implements HypervisorFactory, @@ -406,6 +400,16 @@ void physicalRaidStatusAlarmEvent(HostPhysicalDeviceStatusAlarmEventCmd cmd) { evf.fire(HostCanonicalEvents.HOST_PHYSICAL_RAID_STATUS_ABNORMAL, cdata); } + void physicalVolumeStateAlarmEvent(HostPhysicalDeviceStatusAlarmEventCmd cmd) { + HostCanonicalEvents.HostPhysicalVolumeStateAbnormalData cdata = new HostCanonicalEvents.HostPhysicalVolumeStateAbnormalData(); + cdata.setHostUuid(cmd.getHost()); + cdata.setState(cmd.getAdditionalProperties().get(KVMConstant.PHYSICAL_DEVICE_STATE_NAME).toString()); + cdata.setDiskUuids(cmd.getAdditionalProperties().get(KVMConstant.PHYSICAL_DEVICE_DISK_UUIDS).toString()); + cdata.setDiskName(cmd.getAdditionalProperties().get(KVMConstant.DEVICE_NAME).toString()); + cdata.setVgName(cmd.getAdditionalProperties().get(KVMConstant.VOLUME_GROUP_NAME).toString()); + evf.fire(HostCanonicalEvents.HOST_PHYSICAL_VOLUME_STATE_ABNORMAL, cdata); + } + @Override public boolean start() { deployAnsibleModule(); @@ -599,6 +603,9 @@ public String handleSyncHttpCall(TransmitVmOperationToMnCmd cmd) { case RAID: physicalRaidStatusAlarmEvent(cmd); break; + case PHYSICAL_VOLUME: + physicalVolumeStateAlarmEvent(cmd); + break; default: logger.debug(String.format("unknown physical device type[%s] in host[uuid:%s]", cmd.getType(), cmd.getHost())); From 2fc15c6f6e3c55b50f3c88562a2c6dddb5a5dfaa Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Wed, 13 Nov 2024 10:46:12 +0800 Subject: [PATCH 164/737] [conf]: VmSchedHistoryVO add index VmSchedHistoryVO add index Resolves: ZSTAC-63102 Change-Id: I6a78686d63616d716a71636d6368787161636b70 --- conf/db/upgrade/V5.3.0__schema.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/db/upgrade/V5.3.0__schema.sql b/conf/db/upgrade/V5.3.0__schema.sql index 704c835d777..1f290fcece6 100644 --- a/conf/db/upgrade/V5.3.0__schema.sql +++ b/conf/db/upgrade/V5.3.0__schema.sql @@ -49,3 +49,5 @@ INSERT IGNORE INTO `zstack`.`HostNetworkLabelVO` (`uuid`, `serviceType`, `system VALUES (REPLACE(UUID(),'-',''),'BackupNetwork', TRUE, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP()); INSERT IGNORE INTO `zstack`.`HostNetworkLabelVO` (`uuid`, `serviceType`, `system`, `createDate`, `lastOpDate`) VALUES (REPLACE(UUID(),'-',''),'MigrationNetwork', TRUE, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP()); + +CREATE INDEX idx_schedType_createDate ON `zstack`.`VmSchedHistoryVO` (schedType, createDate); \ No newline at end of file From 4e9368390a24690b2cc76d5a314cab5c62ae9244 Mon Sep 17 00:00:00 2001 From: shenjin Date: Wed, 13 Nov 2024 11:37:00 +0800 Subject: [PATCH 165/737] [core]: remove message_cn when locale is en_us remove message_cn in ErrorCodeElaorationEnglish where locale is en_us Resolves: ZSTAC-71194 Change-Id: I6e61736662656d74797a716c617065697a6e6f6b --- .../main/java/org/zstack/core/Platform.java | 4 ++-- .../integration/core/ElaborationCase.groovy | 4 ++++ .../utils/string/ErrorCodeElaboration.java | 20 ++++++++++++++++--- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/org/zstack/core/Platform.java b/core/src/main/java/org/zstack/core/Platform.java index 2645bb75b09..b1b4963c265 100755 --- a/core/src/main/java/org/zstack/core/Platform.java +++ b/core/src/main/java/org/zstack/core/Platform.java @@ -1018,11 +1018,11 @@ private static void generateElaboration(Enum errCode, ErrorCode result, String f // error from other component directly, so we need to check if the args is // matched with the regex at first if (args != null && args.length == 1 && StringSimilarity.isRegexMatched(ela.getRegex(), String.valueOf(args[0]))) { - result.setMessages(new ErrorCodeElaboration(ela)); + result.setMessages(new ErrorCodeElaboration(ela, locale)); String formatError = String.format(prefix, args[0]); result.setElaboration(StringSimilarity.formatElaboration(formatError)); } else { - result.setMessages(new ErrorCodeElaboration(ela, args)); + result.setMessages(new ErrorCodeElaboration(ela, locale, args)); result.setElaboration(StringSimilarity.formatElaboration(String.format(prefix, msg), args)); } diff --git a/test/src/test/groovy/org/zstack/test/integration/core/ElaborationCase.groovy b/test/src/test/groovy/org/zstack/test/integration/core/ElaborationCase.groovy index 4b19fab9251..a15b6ca72f0 100644 --- a/test/src/test/groovy/org/zstack/test/integration/core/ElaborationCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/ElaborationCase.groovy @@ -86,10 +86,14 @@ class ElaborationCase extends SubCase { def err = operr("certificate has expired or is not yet valid") as ErrorCode assert err.elaboration != null assert err.elaboration.trim() == "Error message: The current system time has expired for ImageStore certificate. Possible reason: ImageStore server system time or certificate is modified." + assert err.messages.message_en != null + assert err.messages.message_cn == null err = operr("The state of vm[uuid:%s] is %s. Only these state[Running,Stopped] is allowed to update cpu or memory.", Platform.uuid, "Rebooting") as ErrorCode assert err.elaboration != null assert err.elaboration.trim() == "Error message: Only VMs with the status [Running, Stopped] support CPU/memory update. Current status: Rebooting." + assert err.messages.message_en != null + assert err.messages.message_cn == null err = operr("test for missed error") as ErrorCode assert err.elaboration == null diff --git a/utils/src/main/java/org/zstack/utils/string/ErrorCodeElaboration.java b/utils/src/main/java/org/zstack/utils/string/ErrorCodeElaboration.java index 1e45ed081bd..f48df1e370c 100644 --- a/utils/src/main/java/org/zstack/utils/string/ErrorCodeElaboration.java +++ b/utils/src/main/java/org/zstack/utils/string/ErrorCodeElaboration.java @@ -1,5 +1,7 @@ package org.zstack.utils.string; +import java.util.Locale; + /** * Created by mingjian.deng on 2018/11/28. */ @@ -17,19 +19,31 @@ public class ErrorCodeElaboration { public ErrorCodeElaboration() { } - public ErrorCodeElaboration(ErrorCodeElaboration other, Object...args) { + public ErrorCodeElaboration(ErrorCodeElaboration other, Locale locale, Object...args) { if (args != null) { this.message_en = String.format(other.message_en, args); - this.message_cn = String.format(other.message_cn, args); + this.message_cn = Locale.SIMPLIFIED_CHINESE.equals(locale) ? String.format(other.message_cn, args) : null; } else { this.message_en = other.message_en; - this.message_cn = other.message_cn; + this.message_cn = Locale.SIMPLIFIED_CHINESE.equals(locale) ? other.message_cn : null; } this.distance = other.distance; this.method = other.method; this.code = other.code; } + public ErrorCodeElaboration(ErrorCodeElaboration other, Locale locale) { + category = other.category; + code = other.code; + regex = other.regex; + message_en = other.message_en; + message_cn = Locale.SIMPLIFIED_CHINESE.equals(locale) ? other.message_cn : null; + source = other.source; + distance = other.distance; + formatSrcError = other.formatSrcError; + method = other.method; + } + public ErrorCodeElaboration(ErrorCodeElaboration other) { category = other.category; code = other.code; From 38940bffe6b27ba7919c16e0097c96b9576e3ba1 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Wed, 13 Nov 2024 06:19:03 +0000 Subject: [PATCH 166/737] [sdk]: Update sdk Resolves: ZSTAC-71032 Change-Id: I7471666a686f6c647078747367796c7367646f6c --- .../java/org/zstack/sdk/SyncAINginxConfigurationAction.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java b/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java index b445108457c..07483f18775 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java @@ -31,6 +31,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Boolean dryRun; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean syncAll = false; + @Param(required = false) public java.util.List systemTags; From f9a748102e7f611173aaf96fb141a7db01e64b39 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Thu, 14 Nov 2024 11:27:04 +0800 Subject: [PATCH 167/737] [virtualRouterProvider]: set guest os type after vr bootup Resolves: ZSTAC-70864 Change-Id: I69766674696e796b766b6c616b73677663777978 --- .../virtualrouter/VirtualRouterConstant.java | 7 +++++ .../virtualrouter/vyos/VyosConnectFlow.java | 30 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterConstant.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterConstant.java index 3c1506748d3..df19315cc73 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterConstant.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterConstant.java @@ -89,4 +89,11 @@ public static enum Param { IS_HA_ROUTER, APPLY_TO_VIRTUALROUTER, } + + public static final String X86_VPC_EULER_GUEST_OS_TYPE = "openEuler 22.03"; + public static final String X86_VPC_EULER_GUEST_OS_USER = "zstack"; + public static final String X86_VPC_VYOS_GUEST_OS_TYPE = "VyOS 1.1.7"; + public static final String X86_VPC_VYOS_GUEST_OS_USER = "vyos"; + public static final String ARM_VPC_VYOS_GUEST_OS_TYPE = "VyOS 1.2.0"; + public static final String ARM_VPC_VYOS_GUEST_OS_USER = "vyos"; } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConnectFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConnectFlow.java index c845f6d5b77..a946edf1591 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConnectFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConnectFlow.java @@ -10,6 +10,7 @@ import org.zstack.core.asyncbatch.While; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; +import org.zstack.core.db.SQL; import org.zstack.core.thread.ThreadFacade; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; @@ -29,6 +30,7 @@ import org.zstack.network.service.virtualrouter.lb.VirtualRouterLoadBalancerRefVO; import org.zstack.network.service.virtualrouter.lb.VirtualRouterLoadBalancerRefVO_; import org.zstack.resourceconfig.ResourceConfigFacade; +import org.zstack.tag.SystemTagCreator; import org.zstack.utils.DebugUtils; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; @@ -43,6 +45,8 @@ import java.util.concurrent.TimeUnit; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.CollectionDSL.e; +import static org.zstack.utils.CollectionDSL.map; /** * Created by xing5 on 2016/10/31. @@ -206,6 +210,32 @@ public void success(InitRsp ret) { versionStruct.setSoftwareName("IPsec"); versionStruct.setCurrentVersion(ret.getIpsecCurrentVersion()); versionStruct.setLatestVersion(ret.getIpsecLatestVersion()); + if (ret.getVyosVersion() != null) { + String userName = null; + if (ret.getVyosVersion().equalsIgnoreCase(VirtualRouterConstant.X86_VPC_EULER_GUEST_OS_TYPE)) { + SQL.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, vrUuid) + .set(VirtualRouterVmVO_.guestOsType, VirtualRouterConstant.X86_VPC_EULER_GUEST_OS_TYPE).update(); + userName = VirtualRouterConstant.X86_VPC_EULER_GUEST_OS_USER; + } else if (ret.getVyosVersion().equalsIgnoreCase(VirtualRouterConstant.X86_VPC_VYOS_GUEST_OS_TYPE)) { + SQL.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, vrUuid) + .set(VirtualRouterVmVO_.guestOsType, VirtualRouterConstant.X86_VPC_VYOS_GUEST_OS_TYPE).update(); + userName = VirtualRouterConstant.X86_VPC_VYOS_GUEST_OS_USER; + } + if (ret.getVyosVersion().equalsIgnoreCase(VirtualRouterConstant.ARM_VPC_VYOS_GUEST_OS_TYPE)) { + SQL.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, vrUuid) + .set(VirtualRouterVmVO_.guestOsType, VirtualRouterConstant.ARM_VPC_VYOS_GUEST_OS_TYPE).update(); + userName = VirtualRouterConstant.ARM_VPC_VYOS_GUEST_OS_USER; + } + if(userName != null) { + SystemTagCreator creator = VirtualRouterSystemTags.VIRTUAL_ROUTER_LOGIN_USER.newSystemTagCreator(vrUuid); + creator.setTagByTokens(map( + e(VirtualRouterSystemTags.VIRTUAL_ROUTER_LOGIN_USER_TOKEN, userName) + )); + creator.inherent = true; + creator.recreate = true; + creator.create(); + } + } new VirtualRouterMetadataOperator().updateVirtualRouterMetadata(metadataStruct); new VirtualRouterSoftwareVersionOperator().updateVirtualRouterSoftwareVersion(versionStruct); errs.clear(); From e61eb90f49d9a01bb39ad10efbea5eb38df24b28 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Thu, 14 Nov 2024 17:25:56 +0800 Subject: [PATCH 168/737] [vyos]: enable vrouter ha when provision vpc Resolves: ZSTAC-70864 Change-Id: I746f7a77696a79716e67766d646f7374746a6371 --- conf/springConfigXml/vyos.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/springConfigXml/vyos.xml b/conf/springConfigXml/vyos.xml index 07446e0e701..30a2ecbf077 100755 --- a/conf/springConfigXml/vyos.xml +++ b/conf/springConfigXml/vyos.xml @@ -106,6 +106,7 @@ org.zstack.network.service.virtualrouter.vyos.VyosDeployAgentFlow org.zstack.network.service.virtualrouter.vyos.VyosConnectFlow org.zstack.network.service.virtualrouter.vyos.VyosConfigSshFlow + org.zstack.network.service.virtualrouter.ha.VirtualRouterHaSyncConfigToBackendFlow org.zstack.network.service.virtualrouter.vyos.VyosChangePrivateL3FirewallDefaultActionFlow org.zstack.network.service.virtualrouter.dns.VirtualRouterSyncDnsOnStartFlow org.zstack.network.service.virtualrouter.vyos.VyosRefreshDchpServerFlow From c52648c59ba36741d5f2e256696b82845ad95b7a Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Fri, 1 Nov 2024 14:58:50 +0800 Subject: [PATCH 169/737] [header]: Add support for zs_service_exporter and process_exporter Resolves: ZSTAC-70843 Change-Id: I6677708431776374726568796c797870706d6b69 --- .../external/service/ExporterConstant.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 header/src/main/java/org/zstack/header/core/external/service/ExporterConstant.java diff --git a/header/src/main/java/org/zstack/header/core/external/service/ExporterConstant.java b/header/src/main/java/org/zstack/header/core/external/service/ExporterConstant.java new file mode 100644 index 00000000000..b9268425c9c --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/service/ExporterConstant.java @@ -0,0 +1,64 @@ +package org.zstack.header.core.external.service; + +import org.zstack.utils.path.PathUtil; + +import java.io.File; +import java.util.Optional; + +/** + * @author hanyu.liang + * @date 2024/10/30 17:07 + */ +public class ExporterConstant { + public static final String SYSTEMD_SERVICE_DIR = "/lib/systemd/system/"; + public static final String LOG_DIR = "/var/log/zstack/"; + public static final String PROCESS_EXPORTER_BIN_PATH = Optional + .ofNullable(PathUtil.findFileOnClassPath("tools/process_exporter")) + .map(File::getAbsolutePath) + .orElse(null); + + public static final String ZS_EXPORTER_BIN_PATH = Optional + .ofNullable(PathUtil.findFileOnClassPath("tools/zstack_service_exporter")) + .map(File::getAbsolutePath) + .orElse(null); + + public static final String PROCESS_EXPORTER_SERVICE_PATH = SYSTEMD_SERVICE_DIR + "process_exporter.service"; + public static final String ZS_EXPORTER_SERVICE_PATH = SYSTEMD_SERVICE_DIR + "zstack_service_exporter.service"; + public static final String PROCESS_EXPORTER_LOG_PATH = LOG_DIR + "process_exporter.log"; + public static final String ZS_EXPORTER_LOG_PATH = LOG_DIR + "zstack_service_exporter.log"; + public static final String PROCESS_EXPORTER_CONFIG_PATH = getProcessExporterYamlPath(); + public static final String ZS_EXPORTER_CONFIG_PATH = Optional + .ofNullable(PathUtil.findFileOnClassPath("zsExporter/zs_exporter_config.yaml")) + .map(File::getAbsolutePath) + .orElse(null); + public static final String ZS_HOST_EXPORTER_CONFIG_PATH = Optional + .ofNullable(PathUtil.findFileOnClassPath("zsExporter/zs_host_exporter_config.yaml")) + .map(File::getAbsolutePath) + .orElse(null); + + private static String getProcessExporterYamlPath() { + String arch = System.getProperty("os.arch"); + switch (arch) { + case "aarch64": + return Optional + .ofNullable(PathUtil.findFileOnClassPath("zsExporter/process_exporter_config_aarch64.yaml")) + .map(File::getAbsolutePath) + .orElse(null); + default: + return Optional + .ofNullable(PathUtil.findFileOnClassPath("zsExporter/process_exporter_config.yaml")) + .map(File::getAbsolutePath) + .orElse(null); + } + } + + public static boolean isZSExporterInstalled() { + return ExporterConstant.ZS_EXPORTER_BIN_PATH != null + && ExporterConstant.ZS_EXPORTER_CONFIG_PATH != null; + } + + public static boolean isProcessExporterInstalled() { + return ExporterConstant.PROCESS_EXPORTER_BIN_PATH != null + && ExporterConstant.PROCESS_EXPORTER_CONFIG_PATH != null; + } +} From 47410f7e7c8b482178e624ea23a902c4bf27d76c Mon Sep 17 00:00:00 2001 From: J M Date: Fri, 1 Nov 2024 16:47:12 +0800 Subject: [PATCH 170/737] [storage]: split snap ref tree by ps and host volume snapshot reference tree can only locate in same storage space. DBImpact Resolves: ZSTAC-66054 Change-Id: I6f6a657475727a737a7a656e73646667766e676f (cherry picked from commit 99d16793485853a119e9cae65157dcc7b026c2c7) --- .../VolumeSnapshotReferenceTreeVO_.java | 3 +++ .../reference/VolumeSnapshotReferenceUtils.java | 17 +++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceTreeVO_.java b/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceTreeVO_.java index b553ade6380..0020210791c 100644 --- a/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceTreeVO_.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceTreeVO_.java @@ -13,4 +13,7 @@ public class VolumeSnapshotReferenceTreeVO_ extends ResourceVO_ { public static volatile SingularAttribute rootVolumeUuid; public static volatile SingularAttribute rootVolumeSnapshotTreeUuid; public static volatile SingularAttribute rootVolumeSnapshotInstallUrl; + + public static volatile SingularAttribute primaryStorageUuid; + public static volatile SingularAttribute hostUuid; } diff --git a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java index fec4632715e..fa1289b6e12 100644 --- a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java @@ -28,8 +28,9 @@ public class VolumeSnapshotReferenceUtils { private static final CLogger logger = Utils.getLogger(VolumeSnapshotReferenceUtils.class); - private static Function getResourceLocateHostUuidGetter; + private static Function getResourceLocateHostUuidGetter = resourceUuid -> null; + // FIXME: replace it with location url public static void setGetResourceLocateHostUuidGetter(Function getter) { VolumeSnapshotReferenceUtils.getResourceLocateHostUuidGetter = getter; } @@ -234,6 +235,7 @@ protected VolumeSnapshotReferenceTreeVO scripts() { VolumeVO vol = databaseFacade.getEntityManager().find(VolumeVO.class, baseSnapshot.getVolumeUuid(), LockModeType.PESSIMISTIC_WRITE); VolumeSnapshotReferenceTreeVO tree = Q.New(VolumeSnapshotReferenceTreeVO.class) .eq(VolumeSnapshotReferenceTreeVO_.rootVolumeUuid, baseSnapshot.getVolumeUuid()) + .eq(VolumeSnapshotReferenceTreeVO_.primaryStorageUuid, baseSnapshot.getPrimaryStorageUuid()) .find(); if (tree != null) { return tree; @@ -251,13 +253,20 @@ protected VolumeSnapshotReferenceTreeVO scripts() { } private static VolumeSnapshotReferenceTreeVO getOrBuildChainSnapshotRefTree(VolumeSnapshotVO baseSnapshot, String baseImageUuid) { + String hostUuid = getResourceLocateHostUuidGetter.call(baseSnapshot.getVolumeUuid()); return new SQLBatchWithReturn() { @Override protected VolumeSnapshotReferenceTreeVO scripts() { databaseFacade.getEntityManager().find(VolumeSnapshotTreeVO.class, baseSnapshot.getTreeUuid(), LockModeType.PESSIMISTIC_WRITE); - VolumeSnapshotReferenceTreeVO tree = Q.New(VolumeSnapshotReferenceTreeVO.class) + Q q = Q.New(VolumeSnapshotReferenceTreeVO.class) .eq(VolumeSnapshotReferenceTreeVO_.rootVolumeSnapshotTreeUuid, baseSnapshot.getTreeUuid()) - .find(); + .eq(VolumeSnapshotReferenceTreeVO_.primaryStorageUuid, baseSnapshot.getPrimaryStorageUuid()); + + if (hostUuid != null) { + q.eq(VolumeSnapshotReferenceTreeVO_.hostUuid, hostUuid); + } + + VolumeSnapshotReferenceTreeVO tree = q.find(); if (tree != null) { return tree; } @@ -273,7 +282,7 @@ protected VolumeSnapshotReferenceTreeVO scripts() { tree.setRootVolumeSnapshotUuid(t.get(0, String.class)); tree.setRootInstallUrl(t.get(1, String.class)); tree.setPrimaryStorageUuid(baseSnapshot.getPrimaryStorageUuid()); - tree.setHostUuid(getResourceLocateHostUuidGetter.call(baseSnapshot.getVolumeUuid())); + tree.setHostUuid(hostUuid); return persist(tree); } }.execute(); From 45a94ba3e5e331cfb3c2ef988a2603d6d3e6851f Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Fri, 15 Nov 2024 17:36:30 +0800 Subject: [PATCH 171/737] [build]: Excludes jar WEB-INF/lib/bcpkix-jdk18on-1.72.jar, WEB-INF/lib/bcprov-jdk18on-1.72.jar, WEB-INF/lib/bcutil-jdk18on-1.72.jar Resolves: ZSTAC-71242 Change-Id: I6d706973747763787965746b70656a646561756a --- build/pom.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build/pom.xml b/build/pom.xml index dc78cabfbe6..c0e9d59617f 100755 --- a/build/pom.xml +++ b/build/pom.xml @@ -34,6 +34,9 @@ WEB-INF/lib/groovy-2.4.7.jar, WEB-INF/lib/sisu-guava-0.9.9.jar, WEB-INF/lib/groovy-sandbox-1.19.jar, + WEB-INF/lib/bcpkix-jdk18on-1.72.jar, + WEB-INF/lib/bcprov-jdk18on-1.72.jar, + WEB-INF/lib/bcutil-jdk18on-1.72.jar, From 48c75386b3858b30c720b7cad2d1b208dcd6c833 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Mon, 18 Nov 2024 11:58:53 +0800 Subject: [PATCH 172/737] [securityGroup]: 0.0.0.0/0 and ::/0 is not allow in sg rules Resolves: ZSTAC-70213 Change-Id: I67647a766f716877766368766e69796b766f6370 --- .../network/securitygroup/SecurityGroupApiInterceptor.java | 7 ++++++- .../java/org/zstack/utils/network/IPv6NetworkUtils.java | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java index 55520f344f1..f3cc8005afc 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java @@ -755,7 +755,7 @@ private void validateIps(String ips, Integer ipVersion) { } if (ipVersion == IPv6Constants.IPv6) { List ipv6List = Stream.of(ipArray).filter(ip -> ip.contains(SecurityGroupConstant.RANGE_SPLIT)).collect(Collectors.toList()); - if (ipv6List.size() > 0) { + if (!ipv6List.isEmpty()) { throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ips[%s], ip range cannot be used when specifying multiple ipv6 addresses", ips)); } } @@ -771,6 +771,11 @@ private void validateIps(String ips, Integer ipVersion) { if (!NetworkUtils.isCidr(ip, ipVersion)) { throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid cidr[%s], ipVersion[%d]", ip, ipVersion)); } + if (ipVersion == IPv6Constants.IPv4 && NetworkUtils.isFullCidr(ip)) { + throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "ipv4 cidr can not be 0.0.0.0/0")); + } if (ipVersion == IPv6Constants.IPv6 && IPv6NetworkUtils.isFullCidr(ip)) { + throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "ipv6 cidr can not be ::/0")); + } continue; } if (ip.contains(SecurityGroupConstant.RANGE_SPLIT)) { diff --git a/utils/src/main/java/org/zstack/utils/network/IPv6NetworkUtils.java b/utils/src/main/java/org/zstack/utils/network/IPv6NetworkUtils.java index de891620ee2..50bbe6f195b 100644 --- a/utils/src/main/java/org/zstack/utils/network/IPv6NetworkUtils.java +++ b/utils/src/main/java/org/zstack/utils/network/IPv6NetworkUtils.java @@ -496,4 +496,8 @@ public static String getIpByIpVersion(String ipVersion, List ipList) { } throw new IllegalArgumentException("No IP address in the list matches the provided IP version: " + ipVersion); } + + public static boolean isFullCidr(String cidr) { + return cidr.equals("::/0"); + } } From 5dff2bf933037494b2f15f789cd5b1394359ed30 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Mon, 18 Nov 2024 11:19:25 +0800 Subject: [PATCH 173/737] [loadBalancer]: don't inactive slb backend if vm shutdown Resolves: ZSTAC-69665 Change-Id: I7767736d7a6d7563747765656e6f726d686f756a --- .../service/lb/LoadBalancerExtension.java | 15 +++---- .../LoadBalancerServerGroupVmCycleCase.groovy | 40 ++++--------------- .../RefreshLoadBalancerCase.groovy | 20 +++++----- 3 files changed, 24 insertions(+), 51 deletions(-) diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerExtension.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerExtension.java index 4f246812763..e20e57ce05a 100755 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerExtension.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerExtension.java @@ -77,11 +77,7 @@ public String call(VmNicInventory arg) { } private boolean isLbShouldBeAttachedToBackend(String vmUuid, String l3Uuid) { - boolean ipChanged = new StaticIpOperator().isIpChange(vmUuid, l3Uuid); - - L3NetworkVO l3Vo = dbf.findByUuid(l3Uuid, L3NetworkVO.class); - boolean l3Need = l3Mgr.applyNetworkServiceWhenVmStateChange(l3Vo.getType()); - return ipChanged || l3Need; + return !new StaticIpOperator().isIpChange(vmUuid, l3Uuid); } @Override @@ -105,7 +101,7 @@ public void applyNetworkService(final VmInstanceSpec servedVm, Map arg) { })); } + if (msgs.isEmpty()) { + completion.done(); + return; + } + bus.send(msgs, new CloudBusListCallBack(completion) { @Override public void run(List replies) { diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/LoadBalancerServerGroupVmCycleCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/LoadBalancerServerGroupVmCycleCase.groovy index 2dfa0991753..1b606f4fa09 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/LoadBalancerServerGroupVmCycleCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/LoadBalancerServerGroupVmCycleCase.groovy @@ -246,49 +246,23 @@ class LoadBalancerServerGroupVmCycleCase extends SubCase{ return rsp } - /* stop vm will refresh lb backedn */ + /* stop vm will not refresh lb backedn */ stopVmInstance { uuid = vm2.uuid } - assert refreshLbCmd != null - assert refreshLbCmd.lbs.size() == 2 - for (VirtualRouterLoadBalancerBackend.LbTO t : refreshLbCmd.lbs) { - if (t.listenerUuid == lb22.uuid) { - assert t.nicIps.size() == 1 - assert t.nicIps.get(0) == nic1.ip - } else { - assert t.nicIps.size() == 1 - assert t.nicIps.get(0) == nic3.ip - } - } + assert refreshLbCmd == null - /* start vm will refresh lb backend */ + /* start vm will not refresh lb backend */ startVmInstance { uuid = vm2.uuid } - assert refreshLbCmd != null - assert refreshLbCmd.lbs.size() == 2 - for (VirtualRouterLoadBalancerBackend.LbTO t : refreshLbCmd.lbs) { - if (t.listenerUuid == lb22.uuid) { - assert t.nicIps.size() == 2 - } else { - assert t.nicIps.size() == 2 - } - } + assert refreshLbCmd == null - /* start vm will refresh lb backend */ + /* start vm will not refresh lb backend */ rebootVmInstance { uuid = vm2.uuid } - assert refreshLbCmd != null - assert refreshLbCmd.lbs.size() == 2 - for (VirtualRouterLoadBalancerBackend.LbTO t : refreshLbCmd.lbs) { - if (t.listenerUuid == lb22.uuid) { - assert t.nicIps.size() == 2 - } else { - assert t.nicIps.size() == 2 - } - } + assert refreshLbCmd == null /* destroy vm will refresh lb backend */ destroyVmInstance { @@ -332,7 +306,7 @@ class LoadBalancerServerGroupVmCycleCase extends SubCase{ } assert refreshLbCmd == null - /* start will refrevrsh lb backend */ + /* start will refresh lb backend */ startVmInstance { uuid = vr.uuid } diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/RefreshLoadBalancerCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/RefreshLoadBalancerCase.groovy index 55e7b5bd66f..92d8714625b 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/RefreshLoadBalancerCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/RefreshLoadBalancerCase.groovy @@ -214,13 +214,12 @@ class RefreshLoadBalancerCase extends SubCase { return rsp } + // stop vm will not refresh lb stopVmInstance { uuid = vm.uuid } - // listeners with same nic on same load balance only refresh rules one time - assert count == 1 - assert cmd.lbs.size() == 3 + assert count == 0 def vm2 = env.inventoryByName("vm2") as VmInstanceInventory @@ -236,8 +235,7 @@ class RefreshLoadBalancerCase extends SubCase { uuid = vm2.uuid } - assert count == 1 - assert cmd.lbs.size() == 3 + assert count == 0 // one lb doesn't have nic removeVmNicFromLoadBalancer { @@ -253,12 +251,13 @@ class RefreshLoadBalancerCase extends SubCase { cmd = null count = 0 + // start vm will not refresh lb either startVmInstance { uuid = vm.uuid } - assert count == 1 - assert cmd.lbs.size() == 3 + assert count == 0 + // no load balancer rules won't refresh rules removeVmNicFromLoadBalancer { @@ -273,8 +272,8 @@ class RefreshLoadBalancerCase extends SubCase { uuid = vm.uuid } - assert count == 1 - assert cmd.lbs.size() == 3 + assert count == 0 + VipInventory vip2 = createVip { @@ -316,7 +315,6 @@ class RefreshLoadBalancerCase extends SubCase { uuid = vm.uuid } - assert countInvoked == 2 - assert rulesSize == 4 + assert countInvoked == 0 } } From 9af505a76eec5f5098b24bfe2b30d63ea23fd2ee Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Mon, 18 Nov 2024 10:01:02 +0800 Subject: [PATCH 174/737] [kvm]: rename global property: skip.ipv6 to disable.ip6tables GlobalPropertyImpact Resolves: ZSTAC-71202 Change-Id: I71626269747462746d766f6b66697678696a726a --- .../org/zstack/network/l3/NetworkGlobalProperty.java | 3 +++ .../src/main/java/org/zstack/kvm/KVMAgentCommands.java | 6 ++++-- plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java | 4 ++-- .../java/org/zstack/kvm/KVMHostDeployArguments.java | 10 ++++++++++ .../java/org/zstack/kvm/KVMSecurityGroupBackend.java | 9 ++------- 5 files changed, 21 insertions(+), 11 deletions(-) diff --git a/network/src/main/java/org/zstack/network/l3/NetworkGlobalProperty.java b/network/src/main/java/org/zstack/network/l3/NetworkGlobalProperty.java index 0c62383e3e1..4cf7cd892de 100644 --- a/network/src/main/java/org/zstack/network/l3/NetworkGlobalProperty.java +++ b/network/src/main/java/org/zstack/network/l3/NetworkGlobalProperty.java @@ -15,4 +15,7 @@ public class NetworkGlobalProperty { @GlobalProperty(name = "bridge.disable.iptables", defaultValue = "false") public static boolean BRIDGE_DISABLE_IPTABLES; + + @GlobalProperty(name = "bridge.disable.ip6tables", defaultValue = "false") + public static boolean BRIDGE_DISABLE_IP6TABLES; } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index d9f2a95a173..9aa9d12bb0b 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -15,9 +15,7 @@ import org.zstack.header.vm.devices.VirtualDeviceInfo; import org.zstack.network.securitygroup.RuleTO; import org.zstack.network.securitygroup.SecurityGroupMembersTO; -import org.zstack.network.securitygroup.SecurityGroupRuleTO; import org.zstack.network.securitygroup.VmNicSecurityTO; -import org.zstack.network.service.MtuGetter; import java.io.Serializable; import java.util.*; @@ -3603,6 +3601,8 @@ public static class RefreshAllRulesOnHostResponse extends AgentResponse { public static class CheckDefaultSecurityGroupCmd extends AgentCommand { @GrayVersion(value = "5.0.0") Boolean skipIpv6; + @GrayVersion(value = "5.3.0") + Boolean disableIp6Tables; } public static class CheckDefaultSecurityGroupResponse extends AgentResponse { @@ -3628,6 +3628,8 @@ public static class UpdateGroupMemberResponse extends AgentResponse { public static class CleanupUnusedRulesOnHostCmd extends AgentCommand { @GrayVersion(value = "5.0.0") Boolean skipIpv6; + @GrayVersion(value = "5.3.0") + Boolean disableIp6Tables; } public static class CleanupUnusedRulesOnHostResponse extends AgentResponse { diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 504436d8ea7..6e37f362e9c 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -5401,8 +5401,8 @@ public void run(final FlowTrigger trigger, Map data) { deployArguments.setInit("true"); runner.setFullDeploy(true); } - if (NetworkGlobalProperty.SKIP_IPV6) { - deployArguments.setSkipIpv6("true"); + if (NetworkGlobalProperty.SKIP_IPV6 || NetworkGlobalProperty.BRIDGE_DISABLE_IP6TABLES) { + deployArguments.setDisableIp6Tables("true"); } for (KvmHostAgentDeploymentExtensionPoint ext : pluginRegistry.getExtensionList(KvmHostAgentDeploymentExtensionPoint.class)) { diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostDeployArguments.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostDeployArguments.java index 71abe7d690d..13e929c1d5d 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostDeployArguments.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostDeployArguments.java @@ -14,6 +14,8 @@ public class KVMHostDeployArguments extends SyncTimeRequestedDeployArguments { private String init; @SerializedName("skipIpv6") private String skipIpv6; + @SerializedName("disableIp6Tables") + private String disableIp6Tables; @SerializedName("isBareMetal2Gateway") private String isBareMetal2Gateway; @SerializedName("bridgeDisableIptables") @@ -55,6 +57,14 @@ public void setSkipIpv6(String skipIpv6) { this.skipIpv6 = skipIpv6; } + public String getDisableIp6Tables() { + return disableIp6Tables; + } + + public void setDisableIp6Tables(String disableIp6Tables) { + this.disableIp6Tables = disableIp6Tables; + } + public String getIsBareMetal2Gateway() { return isBareMetal2Gateway; } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMSecurityGroupBackend.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMSecurityGroupBackend.java index 2edc3a92f80..410c23dbc7b 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMSecurityGroupBackend.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMSecurityGroupBackend.java @@ -6,9 +6,6 @@ import org.zstack.core.errorcode.ErrorFacade; import org.zstack.core.timeout.ApiTimeoutManager; import org.zstack.header.core.Completion; -import org.zstack.header.core.workflow.Flow; -import org.zstack.header.core.workflow.FlowTrigger; -import org.zstack.header.core.workflow.NoRollbackFlow; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.host.*; import org.zstack.header.message.MessageReply; @@ -26,8 +23,6 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.operr; -import java.util.Map; - public class KVMSecurityGroupBackend implements SecurityGroupHypervisorBackend, HostAfterConnectedExtensionPoint { private static CLogger logger = Utils.getLogger(KVMSecurityGroupBackend.class); @@ -129,7 +124,7 @@ public void applyRules(final HostRuleTO hto, final Completion complete) { @Override public void checkDefaultRules(String hostUuid, Completion completion) { CheckDefaultSecurityGroupCmd cmd = new CheckDefaultSecurityGroupCmd(); - cmd.skipIpv6 = NetworkGlobalProperty.SKIP_IPV6; + cmd.disableIp6Tables = NetworkGlobalProperty.SKIP_IPV6 || NetworkGlobalProperty.BRIDGE_DISABLE_IP6TABLES; KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); msg.setHostUuid(hostUuid); @@ -193,7 +188,7 @@ public void run(MessageReply reply) { @Override public void cleanUpUnusedRuleOnHost(String hostUuid, final Completion completion) { KVMAgentCommands.CleanupUnusedRulesOnHostCmd cmd = new KVMAgentCommands.CleanupUnusedRulesOnHostCmd(); - cmd.skipIpv6 = NetworkGlobalProperty.SKIP_IPV6; + cmd.disableIp6Tables = NetworkGlobalProperty.SKIP_IPV6 || NetworkGlobalProperty.BRIDGE_DISABLE_IP6TABLES; KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); msg.setHostUuid(hostUuid); msg.setCommand(cmd); From 0c7cf841a2a8910780de9220dbe52632884a87a2 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Mon, 18 Nov 2024 15:47:18 +0800 Subject: [PATCH 175/737] [kvm]: fix typo string Resolves: ZSTAC-71254 Change-Id: I787365687a6b706b64746f6363786f7163736863 --- .../kvm/src/main/java/org/zstack/kvm/KVMConstant.java | 2 +- .../src/main/java/org/zstack/kvm/KVMHostFactory.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java index bc8483cec60..9d1e90b0344 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java @@ -154,7 +154,7 @@ public interface KVMConstant { String KVM_HOST_SKIP_PING_NO_FAILURE_EXTENSIONS = "kvm.host.skip.ping.no.failure.extensions"; String MEMORY_LOCATOR_NAME = "locator"; - String PHSICAL_DEVICE_STATUS_NAME = "status"; + String PHYSICAL_DEVICE_STATUS_NAME = "status"; String PHYSICAL_DEVICE_STATE_NAME = "state"; String PHYSICAL_DEVICE_DISK_UUIDS = "diskUuids"; String CPU_NAME = "cpuName"; diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java index 24bc2c8b25e..af42c4316a8 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java @@ -354,7 +354,7 @@ void physicalCpuStatusAlarmEvent(HostPhysicalDeviceStatusAlarmEventCmd cmd) { HostCanonicalEvents.HostPhysicalCpuStatusAbnormalData cdata = new HostCanonicalEvents.HostPhysicalCpuStatusAbnormalData(); cdata.setCpuName(cmd.getAdditionalProperties().get(KVMConstant.CPU_NAME).toString()); cdata.setHostUuid(cmd.getHost()); - cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHSICAL_DEVICE_STATUS_NAME).toString()); + cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHYSICAL_DEVICE_STATUS_NAME).toString()); evf.fire(HostCanonicalEvents.HOST_PHYSICAL_CPU_STATUS_ABNORMAL, cdata); } @@ -362,14 +362,14 @@ void physicalMemoryStatusAlarmEvent(HostPhysicalDeviceStatusAlarmEventCmd cmd) { HostCanonicalEvents.HostPhysicalMemoryStatusAbnormalData cdata = new HostCanonicalEvents.HostPhysicalMemoryStatusAbnormalData(); cdata.setHostUuid(cmd.getHost()); cdata.setLocator(cmd.getAdditionalProperties().get(KVMConstant.MEMORY_LOCATOR_NAME).toString()); - cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHSICAL_DEVICE_STATUS_NAME).toString()); + cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHYSICAL_DEVICE_STATUS_NAME).toString()); evf.fire(HostCanonicalEvents.HOST_PHYSICAL_MEMORY_STATUS_ABNORMAL, cdata); } void physicalPowerSupplyStatusAlarmEvent(HostPhysicalDeviceStatusAlarmEventCmd cmd) { HostCanonicalEvents.HostPhysicalPowerSupplyStatusAbnormalData cdata = new HostCanonicalEvents.HostPhysicalPowerSupplyStatusAbnormalData(); cdata.setHostUuid(cmd.getHost()); - cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHSICAL_DEVICE_STATUS_NAME).toString()); + cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHYSICAL_DEVICE_STATUS_NAME).toString()); cdata.setName(cmd.getAdditionalProperties().get(KVMConstant.DEVICE_NAME).toString()); evf.fire(HostCanonicalEvents.HOST_PHYSICAL_POWER_SUPPLY_STATUS_ABNORMAL, cdata); } @@ -378,7 +378,7 @@ void physicalFanStatusAlarmEvent(HostPhysicalDeviceStatusAlarmEventCmd cmd) { HostCanonicalEvents.HostPhysicalFanStatusAbnormalData cdata = new HostCanonicalEvents.HostPhysicalFanStatusAbnormalData(); cdata.setHostUuid(cmd.getHost()); cdata.setFanName(cmd.getAdditionalProperties().get(KVMConstant.DEVICE_NAME).toString()); - cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHSICAL_DEVICE_STATUS_NAME).toString()); + cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHYSICAL_DEVICE_STATUS_NAME).toString()); evf.fire(HostCanonicalEvents.HOST_PHYSICAL_FAN_STATUS_ABNORMAL, cdata); } @@ -395,7 +395,7 @@ void physicalDiskStatusAlarmEvent(HostPhysicalDeviceStatusAlarmEventCmd cmd) { void physicalRaidStatusAlarmEvent(HostPhysicalDeviceStatusAlarmEventCmd cmd) { HostCanonicalEvents.HostPhysicalRaidStatusAbnormalData cdata = new HostCanonicalEvents.HostPhysicalRaidStatusAbnormalData(); cdata.setHostUuid(cmd.getHost()); - cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHSICAL_DEVICE_STATUS_NAME).toString()); + cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHYSICAL_DEVICE_STATUS_NAME).toString()); cdata.setTargetId(cmd.getAdditionalProperties().get(KVMConstant.TARGET_ID).toString()); evf.fire(HostCanonicalEvents.HOST_PHYSICAL_RAID_STATUS_ABNORMAL, cdata); } From e4048cdc0a2f91b445faf7626748a9ad06f67457 Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Tue, 19 Nov 2024 11:46:59 +0800 Subject: [PATCH 176/737] [eip]: fix attach eip handle usedIp automatically automatically choose vm nic usedIp by ip version when attach eip msg not set usedIp Resolves: ZSTAC-71311 Change-Id: I6868776c882bcdf112ac4b2b99e5733676f287ef --- .../service/eip/EipApiInterceptor.java | 26 ++++++++++++------- .../network/l3network/ipv6/IPv6EipCase.groovy | 2 +- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/plugin/eip/src/main/java/org/zstack/network/service/eip/EipApiInterceptor.java b/plugin/eip/src/main/java/org/zstack/network/service/eip/EipApiInterceptor.java index b1cad7414a2..9fc0614c5d0 100755 --- a/plugin/eip/src/main/java/org/zstack/network/service/eip/EipApiInterceptor.java +++ b/plugin/eip/src/main/java/org/zstack/network/service/eip/EipApiInterceptor.java @@ -32,6 +32,7 @@ import org.zstack.utils.logging.CLogger; import org.zstack.utils.network.IPv6Constants; import org.zstack.utils.network.IPv6NetworkUtils; +import org.zstack.utils.network.NetworkUtils; import javax.persistence.Tuple; import javax.persistence.TypedQuery; @@ -145,16 +146,6 @@ private void validate(final APIAttachEipMsg msg) { msg.getEipUuid(), EipState.Enabled, state)); } - if (msg.getUsedIpUuid() == null) { - VmNicVO nic = dbf.findByUuid(msg.getVmNicUuid(), VmNicVO.class); - msg.setUsedIpUuid(nic.getUsedIpUuid()); - } else { - validateEipGuestIpUuid(msg.getVmNicUuid(), msg.getUsedIpUuid()); - } - - String vipUuid = t.get(2, String.class); - isVipInVmNicSubnet(vipUuid, msg.getUsedIpUuid()); - VipVO vip = new Callable() { @Override @Transactional(readOnly = true) @@ -169,6 +160,21 @@ public VipVO call() { } }.call(); + if (msg.getUsedIpUuid() == null) { + VmNicVO nic = dbf.findByUuid(msg.getVmNicUuid(), VmNicVO.class); + UsedIpVO usedIp = nic.getUsedIps().stream() + .filter(usedIpVO -> usedIpVO.getIpVersion().equals(NetworkUtils.getIpversion(vip.getIp()))) + .findFirst() + .orElseThrow(() -> new ApiMessageInterceptionException(argerr("vm nic[uuid:%s] does not have a compatible usedIp for eip[uuid:%s]", + msg.getVmNicUuid(), msg.getEipUuid()))); + msg.setUsedIpUuid(usedIp.getUuid()); + } else { + validateEipGuestIpUuid(msg.getVmNicUuid(), msg.getUsedIpUuid()); + } + + String vipUuid = t.get(2, String.class); + isVipInVmNicSubnet(vipUuid, msg.getUsedIpUuid()); + VmNicVO nic = dbf.findByUuid(msg.getVmNicUuid(), VmNicVO.class); if (VmNicHelper.getL3Uuids(nic).contains(vip.getL3NetworkUuid())){ throw new ApiMessageInterceptionException(argerr("guest l3Network of vm nic[uuid:%s] and vip l3Network of EIP[uuid:%s] are the same network", diff --git a/test/src/test/groovy/org/zstack/test/integration/network/l3network/ipv6/IPv6EipCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/l3network/ipv6/IPv6EipCase.groovy index 8da469adb97..638be7b693d 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/l3network/ipv6/IPv6EipCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/l3network/ipv6/IPv6EipCase.groovy @@ -143,10 +143,10 @@ class IPv6EipCase extends SubCase { assert cmd.eip.vmBridgeName == "br_eth0" cmd = null + // usedIpUuid will detect automatically eip6 = attachEip { eipUuid = eip6.uuid vmNicUuid = nic.uuid - usedIpUuid = ipv6.uuid } assert cmd.eip.vmBridgeName == "br_eth0" assert eip6.guestIp == ipv6.ip From 8ef387cbf119f8bb022a65a75f036be72242cc7d Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Tue, 19 Nov 2024 14:24:18 +0800 Subject: [PATCH 177/737] [test]: fix MigrateVmSetDefaultRuleCase assert cmd Resolves: ZSTAC-71202 Change-Id: I6868776c486155624999466691921fd17193560e --- .../integration/kvm/nic/MigrateVmSetDefaultRuleCase.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/nic/MigrateVmSetDefaultRuleCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/nic/MigrateVmSetDefaultRuleCase.groovy index 1728b728419..b3280d60ce8 100644 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/nic/MigrateVmSetDefaultRuleCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/nic/MigrateVmSetDefaultRuleCase.groovy @@ -196,9 +196,9 @@ class MigrateVmSetDefaultRuleCase extends SubCase { retryInSecs { assert cmd != null - assert cmd.skipIpv6 == false + assert cmd.disableIp6Tables == false assert ccmd != null - assert ccmd.skipIpv6 == false + assert ccmd.disableIp6Tables == false } } } From 06af53558719e8833ca46dc811028aa69fc9b4bb Mon Sep 17 00:00:00 2001 From: shenjin Date: Tue, 19 Nov 2024 22:48:34 +0800 Subject: [PATCH 178/737] [compute]: set vm bind with current cluster uuid when vm migrate to other cluster, set vm bind with current cluster uuid, and remove the bind cluster uuid from system tag, and update system tag value Resolves: ZSTAC-66476 Change-Id: I617a776b726161746c686f696e68637565676c72 --- .../allocator/ResourceBindingAllocatorFlow.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/compute/src/main/java/org/zstack/compute/allocator/ResourceBindingAllocatorFlow.java b/compute/src/main/java/org/zstack/compute/allocator/ResourceBindingAllocatorFlow.java index d82e3e69b23..5cb565683f4 100644 --- a/compute/src/main/java/org/zstack/compute/allocator/ResourceBindingAllocatorFlow.java +++ b/compute/src/main/java/org/zstack/compute/allocator/ResourceBindingAllocatorFlow.java @@ -90,6 +90,17 @@ public void allocate() { // get bind resources from config ResourceBindingClusterCollector clusterCollector = new ResourceBindingClusterCollector(); if (!resourceConfig) { + //remove bind cluster uuid from system tag, use current cluster uuid from config + if (resources.containsKey(clusterCollector.getType())) { + List uuids = resources.get(clusterCollector.getType()); + if (!uuids.contains(spec.getVmInstance().getClusterUuid())) { + String tag = String.format("Cluster:%s", spec.getVmInstance().getClusterUuid()); + VmSystemTags.VM_RESOURCE_BINGDING.updateTagByToken(spec.getVmInstance().getUuid(), + VmSystemTags.VM_RESOURCE_BINGDING_TOKEN, tag); + } + resources.remove(clusterCollector.getType()); + } + resources.computeIfAbsent(clusterCollector.getType(), k -> new ArrayList<>()).add(spec.getVmInstance().getClusterUuid()); } From 71c1a50468a5dd730eb0e120f1f80f4cbe6a39a5 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Thu, 21 Nov 2024 11:07:55 +0800 Subject: [PATCH 179/737] [ceph]: check result before cast reply Resolves: ZSTAC-71358 Change-Id: I7376797264706e6b6c61716d70756b7675766675 --- .../ceph/primary/CephPrimaryStorageBase.java | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java index 8ef87175bbe..08189587b9e 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java @@ -4953,23 +4953,27 @@ private void checkHostStorageConnection(List hostUuids, final Completion new While<>(msgs).each((msg, wc) -> bus.send(msg, new CloudBusCallBack(wc) { @Override public void run(MessageReply reply) { - KVMHostAsyncHttpCallReply kr = reply.castReply(); - CheckHostStorageConnectionRsp rsp = kr.toResponse(CheckHostStorageConnectionRsp.class); - UpdatePrimaryStorageHostStatusMsg umsg = new UpdatePrimaryStorageHostStatusMsg(); umsg.setHostUuid(msg.getHostUuid()); umsg.setPrimaryStorageUuid(self.getUuid()); - - if (rsp == null) { - wc.addError(operr("operation error, because: failed to get response")); + if (!reply.isSuccess()) { + wc.addError(reply.getError()); umsg.setStatus(PrimaryStorageHostStatus.Disconnected); } else { - ErrorCode errorCode = rsp.buildErrorCode(); - if (errorCode != null) { - wc.addError(operr("operation error, because:%s", errorCode)); + KVMHostAsyncHttpCallReply kr = reply.castReply(); + CheckHostStorageConnectionRsp rsp = kr.toResponse(CheckHostStorageConnectionRsp.class); + + if (rsp == null) { + wc.addError(operr("operation error, because: failed to get response")); umsg.setStatus(PrimaryStorageHostStatus.Disconnected); } else { - umsg.setStatus(PrimaryStorageHostStatus.Connected); + ErrorCode errorCode = rsp.buildErrorCode(); + if (errorCode != null) { + wc.addError(operr("operation error, because:%s", errorCode)); + umsg.setStatus(PrimaryStorageHostStatus.Disconnected); + } else { + umsg.setStatus(PrimaryStorageHostStatus.Connected); + } } } From b8b1009f3b03f47646042ba2476980974f863a89 Mon Sep 17 00:00:00 2001 From: J M Date: Tue, 10 Dec 2024 17:27:50 +0800 Subject: [PATCH 180/737] [portal]: enhance MN hb failed exiting. add pre check when start MN. so hb failure will stop MN correctly while MN starting. Resolves: ZSTAC-70194 Change-Id: I617872746a66666b786774626b67736867627274 --- .../portal/managementnode/ManagementNodeManagerImpl.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java b/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java index 87e9cd3316a..fb59c563f50 100755 --- a/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java +++ b/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java @@ -40,6 +40,7 @@ import org.zstack.header.core.workflow.FlowTrigger; import org.zstack.header.core.workflow.NoRollbackFlow; import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.SysErrors; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.managementnode.IsManagementNodeReadyMsg; import org.zstack.header.managementnode.IsManagementNodeReadyReply; @@ -417,6 +418,10 @@ class Result { final ManagementNodeManagerImpl self = this; FlowChain bootstrap = FlowChainBuilder.newSimpleFlowChain(); bootstrap.setName("management-node-bootstrap"); + bootstrap.preCheck(data -> { + return Platform.IS_RUNNING ? null : new ErrorCode(SysErrors.INTERNAL.toString(), + "the management node is not running for some reason while starting"); + }); bootstrap.then(new Flow() { String __name__ = "bootstrap-cloudbus"; @@ -596,7 +601,7 @@ public void handle(ErrorCode errCode, Map data) { lock.unlock(); } - if (!ret.success) { + if (!ret.success || !Platform.IS_RUNNING) { logger.warn(String.format("management node[%s] failed to start for some reason", Platform.getUuid())); stopped = true; From 0084833ea99e222bb11079d6ec77845622550944 Mon Sep 17 00:00:00 2001 From: J M Date: Tue, 10 Dec 2024 15:04:39 +0800 Subject: [PATCH 181/737] [kvm]: fix agent deploy args revert to space split Resolves: ZSTAC-71802 Change-Id: I6f7a6d6d706f616374696b666b626a7561626c79 --- plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 6e37f362e9c..27f3c94ada7 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -5413,9 +5413,9 @@ public void run(final FlowTrigger trigger, Map data) { List extraPackagesFromExt = ext.appendExtraPackages(getSelfInventory()); if (extraPackagesFromExt != null && !extraPackagesFromExt.isEmpty()) { if (deployArguments.getExtraPackages() != null) - deployArguments.setExtraPackages(deployArguments.getExtraPackages() + "," + String.join(",", extraPackagesFromExt)); + deployArguments.setExtraPackages(deployArguments.getExtraPackages() + " " + String.join(" ", extraPackagesFromExt)); else - deployArguments.setExtraPackages(String.join(",", extraPackagesFromExt)); + deployArguments.setExtraPackages(String.join(" ", extraPackagesFromExt)); } ext.modifyDeploymentArguments(getSelfInventory(), deployArguments); From 9199341975b317d69b22ff2ffd380ec13e22eb28 Mon Sep 17 00:00:00 2001 From: "kaicai.hu" Date: Thu, 1 Jun 2023 13:22:39 +0800 Subject: [PATCH 182/737] [sdk]: reload zstone license for cube Resolves: ZHCI-1859 Change-Id: I7a6e626c636f7963786e6d6a6b65697774677067 --- sdk/src/main/java/org/zstack/sdk/ReloadLicenseAction.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/ReloadLicenseAction.java b/sdk/src/main/java/org/zstack/sdk/ReloadLicenseAction.java index 33603c88987..df61af7f926 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReloadLicenseAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReloadLicenseAction.java @@ -28,6 +28,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = true, nullElements = false, emptyString = true, noTrim = false) public java.util.List managementNodeUuids; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String additionSession; + @Param(required = false) public java.util.List systemTags; @@ -53,9 +56,9 @@ private Result makeResult(ApiResult res) { ret.error = res.error; return ret; } - + org.zstack.sdk.ReloadLicenseResult value = res.getResult(org.zstack.sdk.ReloadLicenseResult.class); - ret.value = value == null ? new org.zstack.sdk.ReloadLicenseResult() : value; + ret.value = value == null ? new org.zstack.sdk.ReloadLicenseResult() : value; return ret; } From 2ca99d6d3a55ced5ae773e15c96879a2d6c9a350 Mon Sep 17 00:00:00 2001 From: "Wang,Qilin" Date: Tue, 23 May 2023 18:41:31 +0800 Subject: [PATCH 183/737] [conf]: add support for zstone UKeyLicense add support for zstone UKeyLicense DBImpact Resolves: ZSTAC-56149 Change-Id: I7278616d6a6a69686f796d65687368676d707779 (cherry picked from commit 2dea9c7a1d0a063b4db1ff6dbf0f4b38790825ef) --- conf/db/upgrade/V4.6.21.1__schema.sql | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 conf/db/upgrade/V4.6.21.1__schema.sql diff --git a/conf/db/upgrade/V4.6.21.1__schema.sql b/conf/db/upgrade/V4.6.21.1__schema.sql new file mode 100644 index 00000000000..65ec27379f2 --- /dev/null +++ b/conf/db/upgrade/V4.6.21.1__schema.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS `zstack`.`LicenseAppIdRefVO` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `licenseId` varchar(32) NOT NULL, + `appId` varchar(32) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file From 260be7a3cd1501ecb15b82978fc7ead6c3c2612d Mon Sep 17 00:00:00 2001 From: "xinhao.huang" Date: Wed, 4 Dec 2024 10:24:34 +0800 Subject: [PATCH 184/737] [kvm]: add cube tag for cube deployed host Resolves: ZHCI-2334 Change-Id: I6672706e636671756a7a6d61727475706f67626c --- .../java/org/zstack/compute/host/HostSystemTags.java | 3 +++ .../src/main/java/org/zstack/kvm/KVMAgentCommands.java | 10 ++++++++++ plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java | 3 ++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/compute/src/main/java/org/zstack/compute/host/HostSystemTags.java b/compute/src/main/java/org/zstack/compute/host/HostSystemTags.java index caf94d1ad87..8de3693633c 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostSystemTags.java +++ b/compute/src/main/java/org/zstack/compute/host/HostSystemTags.java @@ -106,4 +106,7 @@ public class HostSystemTags { public static String MEMORY_SLOTS_MAXIMUM_TOKEN = "memorySlotsMaximum"; public static PatternedSystemTag MEMORY_SLOTS_MAXIMUM = new PatternedSystemTag(String.format("memorySlotsMaximum::{%s}", MEMORY_SLOTS_MAXIMUM_TOKEN), HostVO.class); + + public static String DEPLOY_MODE_TOKEN = "deployMode"; + public static PatternedSystemTag DEPLOY_MODE = new PatternedSystemTag(String.format("deployMode::{%s}", DEPLOY_MODE_TOKEN), HostVO.class); } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index 9aa9d12bb0b..3efb666947a 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -510,6 +510,8 @@ public static class HostFactResponse extends AgentResponse { @GrayVersion(value = "5.0.0") private String cpuCache; @GrayVersion(value = "5.0.0") + private String deployMode; + @GrayVersion(value = "5.0.0") private List ipAddresses; @GrayVersion(value = "5.0.0") private List libvirtCapabilities; @@ -769,6 +771,14 @@ public String getLibvirtPackageVersion() { public void setLibvirtPackageVersion(String libvirtPackageVersion) { this.libvirtPackageVersion = libvirtPackageVersion; } + + public String getDeployMode() { + return deployMode; + } + + public void setDeployMode(String deployMode) { + this.deployMode = deployMode; + } } public static class HostCapacityCmd extends AgentCommand { diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 27f3c94ada7..5099d2c983d 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -5768,7 +5768,6 @@ private void saveGeneralHostHardwareFacts(HostFactResponse ret) { recordHardwareChangesAndCreateTag(HostSystemTags.SYSTEM_MANUFACTURER, HostSystemTags.SYSTEM_MANUFACTURER_TOKEN, ret.getSystemManufacturer(), errorCodeList); recordHardwareChangesAndCreateTag(HostSystemTags.SYSTEM_UUID, HostSystemTags.SYSTEM_UUID_TOKEN, ret.getSystemUUID(), errorCodeList); recordHardwareChangesAndCreateTag(HostSystemTags.MEMORY_SLOTS_MAXIMUM, HostSystemTags.MEMORY_SLOTS_MAXIMUM_TOKEN, ret.getMemorySlotsMaximum(), errorCodeList); - createTagWithoutNonValue(HostSystemTags.POWER_SUPPLY_MODEL_NAME, HostSystemTags.POWER_SUPPLY_MODEL_NAME_TOKEN, ret.getPowerSupplyModelName(), true); createTagWithoutNonValue(HostSystemTags.POWER_SUPPLY_MANUFACTURER, HostSystemTags.POWER_SUPPLY_MANUFACTURER_TOKEN, ret.getPowerSupplyManufacturer(), true); createTagWithoutNonValue(HostSystemTags.IPMI_ADDRESS, HostSystemTags.IPMI_ADDRESS_TOKEN, ret.getIpmiAddress(), true); @@ -5779,6 +5778,8 @@ private void saveGeneralHostHardwareFacts(HostFactResponse ret) { createTagWithoutNonValue(HostSystemTags.BMC_VERSION, HostSystemTags.BMC_VERSION_TOKEN, ret.getBmcVersion(), true); createTagWithoutNonValue(HostSystemTags.UPTIME, HostSystemTags.UPTIME_TOKEN, ret.getUptime(), true); createTagWithoutNonValue(HostSystemTags.ISCSI_INITIATOR_NAME, HostSystemTags.ISCSI_INITIATOR_NAME_TOKEN, ret.getIscsiInitiatorName(), true); + createTagWithoutNonValue(HostSystemTags.DEPLOY_MODE, HostSystemTags.DEPLOY_MODE_TOKEN, ret.getDeployMode(), true); + saveHostExtraIps(ret); From c36e814eb8d7c2fbebdc12731cb648555c98e21d Mon Sep 17 00:00:00 2001 From: "xinhao.huang" Date: Wed, 25 Sep 2024 09:56:56 +0800 Subject: [PATCH 185/737] [sdk]: adapt to cube 2.5.0 Resolves: ZHCI-2763 Change-Id: I796d676d636b6365757a726d756f766772707361 --- sdk/src/main/java/org/zstack/sdk/ReloadLicenseAction.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/ReloadLicenseAction.java b/sdk/src/main/java/org/zstack/sdk/ReloadLicenseAction.java index df61af7f926..050873aae34 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReloadLicenseAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReloadLicenseAction.java @@ -56,9 +56,9 @@ private Result makeResult(ApiResult res) { ret.error = res.error; return ret; } - + org.zstack.sdk.ReloadLicenseResult value = res.getResult(org.zstack.sdk.ReloadLicenseResult.class); - ret.value = value == null ? new org.zstack.sdk.ReloadLicenseResult() : value; + ret.value = value == null ? new org.zstack.sdk.ReloadLicenseResult() : value; return ret; } From e7e698cea562a8455b29bff669cea94cc707eb32 Mon Sep 17 00:00:00 2001 From: "tao.gan" Date: Thu, 10 Oct 2024 13:23:32 +0800 Subject: [PATCH 186/737] [storage]: ceph volume creates snapshots to allocate excess space Before creating a snapshot, pre-allocating primary storage capacity may result in the following scenarios: Pre-allocated capacity = snapshot size, no further capacity allocation (only applicable to xsky ps) Pre-allocated capacity > snapshot size, return the difference (pre-allocated capacity - snapshot size) to the primary storage Pre-allocated capacity < snapshot size, deduct the difference (snapshot size - pre-allocated capacity) from the primary storage Resolves: ZSV-7144 Change-Id: I667a656965707875727a7a707a697262756b6968 (cherry picked from commit f544229a6ed3ff990cb723cb60eb04d1a37f7a50) --- .../snapshot/VolumeSnapshotManagerImpl.java | 81 ++++++++++--------- 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java index c75a6545025..e62b0433f3a 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java @@ -774,9 +774,10 @@ private void handle(final CreateVolumeSnapshotMsg msg) { String volumeNewInstallPath; VolumeSnapshotStruct struct; long volumeSize; + String allocatedInstall; + long allocatedSize; VolumeVO volumeVO = dbf.findByUuid(msg.getVolumeUuid(), VolumeVO.class); - PrimaryStorageVO storageVO = dbf.findByUuid(volumeVO.getPrimaryStorageUuid(), PrimaryStorageVO.class); @Override public void setup() { @@ -826,7 +827,6 @@ public void run(MessageReply reply) { flow(new Flow() { String __name__ = "pre-allocate-primary-storage-capacity"; - String allocatedInstall; @Override public boolean skip(Map data) { @@ -839,6 +839,7 @@ public void run(FlowTrigger trigger, Map data) { amsg.setRequiredPrimaryStorageUuid(vol.getPrimaryStorageUuid()); amsg.setSize(volumeSize); amsg.setRequiredInstallUri(String.format("volume://%s", msg.getVolumeUuid())); + amsg.setNoOverProvisioning(true); bus.makeTargetServiceIdByResourceUuid(amsg, PrimaryStorageConstant.SERVICE_ID, vol.getPrimaryStorageUuid()); bus.send(amsg, new CloudBusCallBack(trigger) { @@ -848,6 +849,7 @@ public void run(MessageReply reply) { trigger.fail(reply.getError()); return; } + allocatedSize = volumeSize; allocatedInstall = ((AllocatePrimaryStorageSpaceReply) reply).getAllocatedInstallUrl(); trigger.next(); } @@ -860,7 +862,8 @@ public void rollback(FlowRollback trigger, Map data) { if (snapshot == null && allocatedInstall != null) { ReleasePrimaryStorageSpaceMsg rmsg = new ReleasePrimaryStorageSpaceMsg(); rmsg.setPrimaryStorageUuid(vol.getPrimaryStorageUuid()); - rmsg.setDiskSize(snapshot.getSize()); + rmsg.setDiskSize(allocatedSize); + rmsg.setNoOverProvisioning(true); rmsg.setAllocatedInstallUrl(allocatedInstall); bus.makeTargetServiceIdByResourceUuid(rmsg, PrimaryStorageConstant.SERVICE_ID, vol.getPrimaryStorageUuid()); bus.send(rmsg); @@ -869,7 +872,6 @@ public void rollback(FlowRollback trigger, Map data) { } }); - flow(new NoRollbackFlow() { String __name__ = "take-volume-snapshot"; @@ -931,54 +933,55 @@ public void done(ErrorCodeList errorCodeList) { } }); - flow(new Flow() { - - String __name__ = "reserve-snapshot-size-on-primary-storage"; - - boolean success; - String allocatedInstall; - - @Override - public boolean skip(Map data) { - return volumeSize >= snapshot.getSize(); - } + flow(new NoRollbackFlow() { + String __name__ = "adjust-snapshot-capacity-on-primary-storage"; @Override public void run(FlowTrigger trigger, Map data) { - AllocatePrimaryStorageSpaceMsg amsg = new AllocatePrimaryStorageSpaceMsg(); - amsg.setRequiredPrimaryStorageUuid(vol.getPrimaryStorageUuid()); - amsg.setSize(snapshot.getSize() - volumeSize); - amsg.setRequiredInstallUri(String.format("volume://%s", snapshot.getVolumeUuid())); - amsg.setForce(true); - amsg.setNoOverProvisioning(true); + if (snapshot.getSize() == volumeSize) { + trigger.next(); + return; + } - bus.makeTargetServiceIdByResourceUuid(amsg, PrimaryStorageConstant.SERVICE_ID, vol.getPrimaryStorageUuid()); - bus.send(amsg, new CloudBusCallBack(trigger) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { + if (snapshot.getSize() - volumeSize > 0) { + logger.debug(String.format("reserving primary storage capacity: " + + "snapshot[uuid:%s, size:%s] is larger than Volume[uuid:%s, size:%s]", + snapshot.getUuid(), snapshot.getSize(), vol.getUuid(), volumeSize)); + AllocatePrimaryStorageSpaceMsg amsg = new AllocatePrimaryStorageSpaceMsg(); + amsg.setRequiredPrimaryStorageUuid(vol.getPrimaryStorageUuid()); + amsg.setRequiredInstallUri(String.format("volume://%s", snapshot.getVolumeUuid())); + amsg.setSize(snapshot.getSize() - volumeSize); + amsg.setForce(true); + amsg.setNoOverProvisioning(true); + bus.makeTargetServiceIdByResourceUuid(amsg, PrimaryStorageConstant.SERVICE_ID, vol.getPrimaryStorageUuid()); + bus.send(amsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.next(); + return; + } + allocatedSize = snapshot.getSize(); trigger.next(); - return; } - AllocatePrimaryStorageSpaceReply ar = (AllocatePrimaryStorageSpaceReply) reply; - allocatedInstall = ar.getAllocatedInstallUrl(); - success = true; - trigger.next(); - } - }); - } + }); + return; + } - @Override - public void rollback(FlowRollback trigger, Map data) { - if (success) { + if (volumeSize - snapshot.getSize() > 0) { + logger.debug(String.format("releasing primary storage capacity: " + + "snapshot[uuid:%s, size:%s] is smaller than Volume[uuid:%s, size:%s]", + snapshot.getUuid(), snapshot.getSize(), vol.getUuid(), volumeSize)); ReleasePrimaryStorageSpaceMsg rmsg = new ReleasePrimaryStorageSpaceMsg(); rmsg.setPrimaryStorageUuid(vol.getPrimaryStorageUuid()); - rmsg.setDiskSize(snapshot.getSize()); + rmsg.setDiskSize(volumeSize - snapshot.getSize()); + rmsg.setNoOverProvisioning(true); rmsg.setAllocatedInstallUrl(allocatedInstall); bus.makeTargetServiceIdByResourceUuid(rmsg, PrimaryStorageConstant.SERVICE_ID, vol.getPrimaryStorageUuid()); bus.send(rmsg); + allocatedSize = snapshot.getSize(); + trigger.next(); } - trigger.rollback(); } }); From ed621bfe88af2a64253beed9ee3a69baf25f709a Mon Sep 17 00:00:00 2001 From: "xinhao.huang" Date: Mon, 1 Jul 2024 17:49:45 +0800 Subject: [PATCH 187/737] [ceph]: fix add ceph mon failed when password cotains special character Resolves: ZHCI-2645 Change-Id: I676d776c6c6d6f746f6f7777647571616f687974 --- .../java/org/zstack/storage/ceph/MonUri.java | 12 +++++++---- .../storage/ceph/CephOperationCase.groovy | 21 +++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/MonUri.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/MonUri.java index c15efe2cc76..e962ccb618e 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/MonUri.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/MonUri.java @@ -72,10 +72,14 @@ public MonUri(String url) { " in format of %s", url, MON_URL_FORMAT))); } - String rest = url.substring(at+1, url.length()); - String[] ssh = userInfo.split(":"); - sshUsername = ssh[0]; - sshPassword = ssh[1]; + String rest = url.substring(at+1); + int colon = url.indexOf(":"); + if (colon <= 0 || colon > url.length() - 1) { + throw new OperationFailureException(errorCode(String.format("invalid monUrl[%s], sshUsername and sshPassword must be separated by ':' and cannot be empty. A valid monUrl is" + + " in format of %s", url, MON_URL_FORMAT))); + } + sshUsername = userInfo.substring(0, colon); + sshPassword = userInfo.substring(colon+1); URI uri = new URI(String.format("ssh://%s", rest)); hostname = uri.getHost(); diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/ceph/CephOperationCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/ceph/CephOperationCase.groovy index 3be03f0332a..eb6ddc82962 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/ceph/CephOperationCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/ceph/CephOperationCase.groovy @@ -3,6 +3,7 @@ package org.zstack.test.integration.storage.ceph import org.springframework.http.HttpEntity import org.zstack.core.config.GlobalConfigVO import org.zstack.core.config.GlobalConfigVO_ +import org.zstack.core.db.DatabaseFacade import org.zstack.core.db.Q import org.zstack.header.storage.primary.PrimaryStorageVO import org.zstack.header.storage.primary.PrimaryStorageVO_ @@ -13,6 +14,8 @@ import org.zstack.header.storage.snapshot.VolumeSnapshotTreeVO_ import org.zstack.sdk.* import org.zstack.storage.ceph.CephGlobalConfig import org.zstack.storage.ceph.DataSecurityPolicy +import org.zstack.storage.ceph.backup.CephBackupStorageMonVO +import org.zstack.storage.ceph.backup.CephBackupStorageVO import org.zstack.storage.ceph.primary.CephPrimaryStorageMonBase import org.zstack.test.integration.storage.StorageTest import org.zstack.testlib.EnvSpec @@ -25,6 +28,7 @@ class CephOperationCase extends SubCase { EnvSpec env PrimaryStorageInventory ps BackupStorageInventory bs + DatabaseFacade dbf @Override void setup() { @@ -123,6 +127,7 @@ class CephOperationCase extends SubCase { @Override void test() { + dbf = bean(DatabaseFacade.class) env.create { prepare() testAddPrimaryReplaceMon() @@ -130,6 +135,7 @@ class CephOperationCase extends SubCase { testAddBackupReplaceMon() testAddBackupSameMon() + testAddBackupMonWithSpecialPassword() testCephSnapshotTree() @@ -273,6 +279,21 @@ class CephOperationCase extends SubCase { .findValue() == "PWD" } + void testAddBackupMonWithSpecialPassword() { + def specialPassword = "password123-`=[];,./~!@#\$%^&*()_+|{}:<>?" + def hostname = "127.0.0.3" + def action = new AddMonToCephBackupStorageAction() + action.uuid = bs.uuid + action.sessionId = adminSession() + action.monUrls = ["root:${specialPassword}@${hostname}/?monPort=7777".toString()] + + AddMonToCephBackupStorageAction.Result result = action.call() + assert result.error == null + CephBackupStorageVO cvo = dbf.findByUuid(result.value.inventory.uuid, CephBackupStorageVO.class) + def addMonSuccess = cvo.mons.find { it.hostname == hostname && it.sshPassword == specialPassword } != null + assert addMonSuccess + } + @Override void clean() { env.delete() From 2453b72eacba3270e4a0ce8ece5265c2073bdd37 Mon Sep 17 00:00:00 2001 From: "xinhao.huang" Date: Fri, 25 Oct 2024 15:22:43 +0800 Subject: [PATCH 188/737] Revert "[ceph]: fix add ceph mon failed when password cotains special character" This reverts commit 16fa7e6405e090bc58749e2fc6a2551e3917dc29. --- .../java/org/zstack/storage/ceph/MonUri.java | 12 ++++------- .../storage/ceph/CephOperationCase.groovy | 21 ------------------- 2 files changed, 4 insertions(+), 29 deletions(-) diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/MonUri.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/MonUri.java index e962ccb618e..c15efe2cc76 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/MonUri.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/MonUri.java @@ -72,14 +72,10 @@ public MonUri(String url) { " in format of %s", url, MON_URL_FORMAT))); } - String rest = url.substring(at+1); - int colon = url.indexOf(":"); - if (colon <= 0 || colon > url.length() - 1) { - throw new OperationFailureException(errorCode(String.format("invalid monUrl[%s], sshUsername and sshPassword must be separated by ':' and cannot be empty. A valid monUrl is" + - " in format of %s", url, MON_URL_FORMAT))); - } - sshUsername = userInfo.substring(0, colon); - sshPassword = userInfo.substring(colon+1); + String rest = url.substring(at+1, url.length()); + String[] ssh = userInfo.split(":"); + sshUsername = ssh[0]; + sshPassword = ssh[1]; URI uri = new URI(String.format("ssh://%s", rest)); hostname = uri.getHost(); diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/ceph/CephOperationCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/ceph/CephOperationCase.groovy index eb6ddc82962..3be03f0332a 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/ceph/CephOperationCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/ceph/CephOperationCase.groovy @@ -3,7 +3,6 @@ package org.zstack.test.integration.storage.ceph import org.springframework.http.HttpEntity import org.zstack.core.config.GlobalConfigVO import org.zstack.core.config.GlobalConfigVO_ -import org.zstack.core.db.DatabaseFacade import org.zstack.core.db.Q import org.zstack.header.storage.primary.PrimaryStorageVO import org.zstack.header.storage.primary.PrimaryStorageVO_ @@ -14,8 +13,6 @@ import org.zstack.header.storage.snapshot.VolumeSnapshotTreeVO_ import org.zstack.sdk.* import org.zstack.storage.ceph.CephGlobalConfig import org.zstack.storage.ceph.DataSecurityPolicy -import org.zstack.storage.ceph.backup.CephBackupStorageMonVO -import org.zstack.storage.ceph.backup.CephBackupStorageVO import org.zstack.storage.ceph.primary.CephPrimaryStorageMonBase import org.zstack.test.integration.storage.StorageTest import org.zstack.testlib.EnvSpec @@ -28,7 +25,6 @@ class CephOperationCase extends SubCase { EnvSpec env PrimaryStorageInventory ps BackupStorageInventory bs - DatabaseFacade dbf @Override void setup() { @@ -127,7 +123,6 @@ class CephOperationCase extends SubCase { @Override void test() { - dbf = bean(DatabaseFacade.class) env.create { prepare() testAddPrimaryReplaceMon() @@ -135,7 +130,6 @@ class CephOperationCase extends SubCase { testAddBackupReplaceMon() testAddBackupSameMon() - testAddBackupMonWithSpecialPassword() testCephSnapshotTree() @@ -279,21 +273,6 @@ class CephOperationCase extends SubCase { .findValue() == "PWD" } - void testAddBackupMonWithSpecialPassword() { - def specialPassword = "password123-`=[];,./~!@#\$%^&*()_+|{}:<>?" - def hostname = "127.0.0.3" - def action = new AddMonToCephBackupStorageAction() - action.uuid = bs.uuid - action.sessionId = adminSession() - action.monUrls = ["root:${specialPassword}@${hostname}/?monPort=7777".toString()] - - AddMonToCephBackupStorageAction.Result result = action.call() - assert result.error == null - CephBackupStorageVO cvo = dbf.findByUuid(result.value.inventory.uuid, CephBackupStorageVO.class) - def addMonSuccess = cvo.mons.find { it.hostname == hostname && it.sshPassword == specialPassword } != null - assert addMonSuccess - } - @Override void clean() { env.delete() From 308a7b15e3522a929c48067d989a22259f794754 Mon Sep 17 00:00:00 2001 From: "xinhao.huang" Date: Fri, 25 Oct 2024 15:24:10 +0800 Subject: [PATCH 189/737] [ceph]: fix add ceph mon failed when password cotains special character Resolves: ZHCI-2645 Change-Id: I6871666663646f6b756170706264766578727067 --- .../java/org/zstack/storage/ceph/MonUri.java | 27 ++++++++++--------- .../storage/ceph/CephOperationCase.groovy | 21 +++++++++++++++ 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/MonUri.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/MonUri.java index c15efe2cc76..b60166d657c 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/MonUri.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/MonUri.java @@ -11,6 +11,7 @@ import java.util.List; import static org.zstack.core.Platform.argerr; +import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.list; /** @@ -62,36 +63,38 @@ public MonUri(String url) { try { int at = url.lastIndexOf("@"); if (at == -1) { - throw new OperationFailureException(errorCode(String.format("invalid monUrl[%s], the sshUsername:sshPassword part is invalid. A valid monUrl is" + - " in format of %s", url, MON_URL_FORMAT))); + throw new OperationFailureException(operr("invalid monUrl[%s], the sshUsername:sshPassword part is invalid. A valid monUrl is" + + " in format of %s", url, MON_URL_FORMAT)); } String userInfo = url.substring(0, at); if (!userInfo.contains(":")) { - throw new OperationFailureException(errorCode(String.format("invalid monUrl[%s], the sshUsername:sshPassword part is invalid. A valid monUrl is" + - " in format of %s", url, MON_URL_FORMAT))); + throw new OperationFailureException(operr("invalid monUrl[%s], the sshUsername:sshPassword part is invalid. A valid monUrl is" + + " in format of %s", url, MON_URL_FORMAT)); + } + + String rest = url.substring(at+1); + String[] ssh = userInfo.split(":", 2); + if (ssh.length != 2 || ssh[0].isEmpty() || ssh[1].isEmpty()) { + throw new OperationFailureException(operr("invalid monUrl[%s]. SSH username and password must be separated by ':' and cannot be empty. A valid monUrl format is %s", url, MON_URL_FORMAT)); } - String rest = url.substring(at+1, url.length()); - String[] ssh = userInfo.split(":"); sshUsername = ssh[0]; sshPassword = ssh[1]; URI uri = new URI(String.format("ssh://%s", rest)); hostname = uri.getHost(); if (hostname == null) { - throw new OperationFailureException(errorCode( - String.format("invalid monUrl[%s], hostname cannot be null. A valid monUrl is" + + throw new OperationFailureException(operr("invalid monUrl[%s], hostname cannot be null. A valid monUrl is" + " in format of %s", url, MON_URL_FORMAT) - )); + ); } sshPort = uri.getPort() == -1 ? sshPort : uri.getPort(); if (sshPort < 1 || sshPort > 65535) { - throw new OperationFailureException(errorCode( - String.format("invalid monUrl[%s], the ssh port is greater than 65535 or smaller than 1. A valid monUrl is" + + throw new OperationFailureException(operr("invalid monUrl[%s], the ssh port is greater than 65535 or smaller than 1. A valid monUrl is" + " in format of %s", url, MON_URL_FORMAT) - )); + ); } String v = getQueryValue(uri, CephConstants.MON_PARAM_MON_PORT); monPort = v == null ? monPort : Integer.parseInt(v); diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/ceph/CephOperationCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/ceph/CephOperationCase.groovy index 3be03f0332a..eb6ddc82962 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/ceph/CephOperationCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/ceph/CephOperationCase.groovy @@ -3,6 +3,7 @@ package org.zstack.test.integration.storage.ceph import org.springframework.http.HttpEntity import org.zstack.core.config.GlobalConfigVO import org.zstack.core.config.GlobalConfigVO_ +import org.zstack.core.db.DatabaseFacade import org.zstack.core.db.Q import org.zstack.header.storage.primary.PrimaryStorageVO import org.zstack.header.storage.primary.PrimaryStorageVO_ @@ -13,6 +14,8 @@ import org.zstack.header.storage.snapshot.VolumeSnapshotTreeVO_ import org.zstack.sdk.* import org.zstack.storage.ceph.CephGlobalConfig import org.zstack.storage.ceph.DataSecurityPolicy +import org.zstack.storage.ceph.backup.CephBackupStorageMonVO +import org.zstack.storage.ceph.backup.CephBackupStorageVO import org.zstack.storage.ceph.primary.CephPrimaryStorageMonBase import org.zstack.test.integration.storage.StorageTest import org.zstack.testlib.EnvSpec @@ -25,6 +28,7 @@ class CephOperationCase extends SubCase { EnvSpec env PrimaryStorageInventory ps BackupStorageInventory bs + DatabaseFacade dbf @Override void setup() { @@ -123,6 +127,7 @@ class CephOperationCase extends SubCase { @Override void test() { + dbf = bean(DatabaseFacade.class) env.create { prepare() testAddPrimaryReplaceMon() @@ -130,6 +135,7 @@ class CephOperationCase extends SubCase { testAddBackupReplaceMon() testAddBackupSameMon() + testAddBackupMonWithSpecialPassword() testCephSnapshotTree() @@ -273,6 +279,21 @@ class CephOperationCase extends SubCase { .findValue() == "PWD" } + void testAddBackupMonWithSpecialPassword() { + def specialPassword = "password123-`=[];,./~!@#\$%^&*()_+|{}:<>?" + def hostname = "127.0.0.3" + def action = new AddMonToCephBackupStorageAction() + action.uuid = bs.uuid + action.sessionId = adminSession() + action.monUrls = ["root:${specialPassword}@${hostname}/?monPort=7777".toString()] + + AddMonToCephBackupStorageAction.Result result = action.call() + assert result.error == null + CephBackupStorageVO cvo = dbf.findByUuid(result.value.inventory.uuid, CephBackupStorageVO.class) + def addMonSuccess = cvo.mons.find { it.hostname == hostname && it.sshPassword == specialPassword } != null + assert addMonSuccess + } + @Override void clean() { env.delete() From e2405a8129f68cc2d1774f6c1fe9b79b44e82d8e Mon Sep 17 00:00:00 2001 From: "xinhao.huang" Date: Wed, 4 Dec 2024 10:26:21 +0800 Subject: [PATCH 190/737] [zbs]: fix add zbs mds failed when password cotains special character Resolves: ZHCI-2911 Change-Id: I7869757269756a626f726d746c6a6b6872746277 --- .../src/main/java/org/zstack/cbd/MdsUri.java | 27 ++++++++++--------- .../addon/zbs/ZbsPrimaryStorageCase.groovy | 10 +++++++ 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/MdsUri.java b/plugin/cbd/src/main/java/org/zstack/cbd/MdsUri.java index 11141eabcb5..714f9cf8e4d 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/MdsUri.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/MdsUri.java @@ -11,6 +11,7 @@ import java.util.List; import static org.zstack.core.Platform.argerr; +import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.list; /** @@ -56,36 +57,38 @@ public MdsUri(String url) { try { int at = url.lastIndexOf("@"); if (at == -1) { - throw new OperationFailureException(errorCode(String.format("invalid mdsUrl[%s], the sshUsername:sshPassword part is invalid. A valid mdsUrl is" + - " in format of %s", url, MDS_URL_FORMAT))); + throw new OperationFailureException(operr("invalid mdsUrl[%s], the sshUsername:sshPassword part is invalid. A valid mdsUrl is" + + " in format of %s", url, MDS_URL_FORMAT)); } String userInfo = url.substring(0, at); if (!userInfo.contains(":")) { - throw new OperationFailureException(errorCode(String.format("invalid mdsUrl[%s], the sshUsername:sshPassword part is invalid. A valid mdsUrl is" + - " in format of %s", url, MDS_URL_FORMAT))); + throw new OperationFailureException(operr("invalid mdsUrl[%s], the sshUsername:sshPassword part is invalid. A valid mdsUrl is" + + " in format of %s", url, MDS_URL_FORMAT)); + } + + String rest = url.substring(at+1); + String[] ssh = userInfo.split(":", 2); + if (ssh.length != 2 || ssh[0].isEmpty() || ssh[1].isEmpty()) { + throw new OperationFailureException(operr("invalid mdsUrl[%s]. SSH username and password must be separated by ':' and cannot be empty. A valid monUrl format is %s", url, MDS_URL_FORMAT)); } - String rest = url.substring(at+1, url.length()); - String[] ssh = userInfo.split(":"); sshUsername = ssh[0]; sshPassword = ssh[1]; URI uri = new URI(String.format("ssh://%s", rest)); hostname = uri.getHost(); if (hostname == null) { - throw new OperationFailureException(errorCode( - String.format("invalid mdsUrl[%s], hostname cannot be null. A valid mdsUrl is" + + throw new OperationFailureException(operr("invalid mdsUrl[%s], hostname cannot be null. A valid mdsUrl is" + " in format of %s", url, MDS_URL_FORMAT) - )); + ); } sshPort = uri.getPort() == -1 ? sshPort : uri.getPort(); if (sshPort < 1 || sshPort > 65535) { - throw new OperationFailureException(errorCode( - String.format("invalid mdsUrl[%s], the ssh port is greater than 65535 or smaller than 1. A valid mdsUrl is" + + throw new OperationFailureException(operr("invalid mdsUrl[%s], the ssh port is greater than 65535 or smaller than 1. A valid mdsUrl is" + " in format of %s", url, MDS_URL_FORMAT) - )); + ); } String v = getQueryValue(uri, CbdConstants.MDS_PARAM_MDS_PORT); mdsPort = v == null ? mdsPort : Integer.parseInt(v); diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index fb49df16014..b0df00946b1 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -5,6 +5,7 @@ import org.zstack.core.db.Q import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO_ import org.zstack.header.storage.primary.PrimaryStorageStatus +import org.zstack.cbd.MdsUri import org.zstack.sdk.* import org.zstack.storage.primary.PrimaryStorageGlobalConfig import org.zstack.storage.zbs.ZbsPrimaryStorageMdsBase @@ -151,6 +152,7 @@ class ZbsPrimaryStorageCase extends SubCase { PrimaryStorageGlobalConfig.PING_INTERVAL.updateValue(60) testZbsStorageNegativeScenario() testDataVolumeNegativeScenario() + testDecodeMdsUriWithSpecialPassword() } } @@ -404,6 +406,14 @@ class ZbsPrimaryStorageCase extends SubCase { } } + static void testDecodeMdsUriWithSpecialPassword() { + def specialPassword = "password123-`=[];,./~!@#\$%^&*()_+|{}:<>?" + def mdsUri = "root:${specialPassword}@127.0.2.1" + MdsUri uri = new MdsUri(mdsUri); + assert uri.sshPassword == specialPassword + } + + void deleteVolume(String volUuid) { deleteDataVolume { uuid = volUuid From b9ee8604f1dc282bb2965e3531537035f076baae Mon Sep 17 00:00:00 2001 From: "xinhao.huang" Date: Wed, 4 Dec 2024 10:30:47 +0800 Subject: [PATCH 191/737] [conf]: fix unstable case AutoScalingSchedulerJobCase - Added cascade behavior to foreign keys in `AutoScalingRuleSchedulerJobTriggerVO` and `SchedulerJobVO` to ensure referential integrity and simplify cleanup operations. DBImpact Resolves: ZHCI-2914 Change-Id: I6a6b61706766627377617a69706e777471656863 --- conf/db/upgrade/V5.4.0__schema.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 conf/db/upgrade/V5.4.0__schema.sql diff --git a/conf/db/upgrade/V5.4.0__schema.sql b/conf/db/upgrade/V5.4.0__schema.sql new file mode 100644 index 00000000000..6f300358283 --- /dev/null +++ b/conf/db/upgrade/V5.4.0__schema.sql @@ -0,0 +1,2 @@ +ALTER TABLE AutoScalingRuleSchedulerJobTriggerVO DROP FOREIGN KEY fkAutoScalingRuleSchedulerJobTriggerVO; +CALL ADD_CONSTRAINT('AutoScalingRuleSchedulerJobTriggerVO', 'fkAutoScalingRuleSchedulerJobTriggerVO', 'schedulerJobUuid', 'SchedulerJobVO', 'uuid', 'CASCADE'); \ No newline at end of file From 8fc06b886599961ea131906dd121ca70bb7a398f Mon Sep 17 00:00:00 2001 From: "xinhao.huang" Date: Mon, 2 Dec 2024 16:34:37 +0800 Subject: [PATCH 192/737] [zbs]: alter ExternalPrimaryStorageVO config column to text type DBImpact Resolves: ZHCI-2911 Change-Id: I7167737a736b6578707872706b7a6d7461746c70 --- conf/db/upgrade/V5.4.0__schema.sql | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.4.0__schema.sql b/conf/db/upgrade/V5.4.0__schema.sql index 6f300358283..cf793bbb45c 100644 --- a/conf/db/upgrade/V5.4.0__schema.sql +++ b/conf/db/upgrade/V5.4.0__schema.sql @@ -1,2 +1,4 @@ ALTER TABLE AutoScalingRuleSchedulerJobTriggerVO DROP FOREIGN KEY fkAutoScalingRuleSchedulerJobTriggerVO; -CALL ADD_CONSTRAINT('AutoScalingRuleSchedulerJobTriggerVO', 'fkAutoScalingRuleSchedulerJobTriggerVO', 'schedulerJobUuid', 'SchedulerJobVO', 'uuid', 'CASCADE'); \ No newline at end of file +CALL ADD_CONSTRAINT('AutoScalingRuleSchedulerJobTriggerVO', 'fkAutoScalingRuleSchedulerJobTriggerVO', 'schedulerJobUuid', 'SchedulerJobVO', 'uuid', 'CASCADE'); + +ALTER TABLE `zstack`.`ExternalPrimaryStorageVO` MODIFY COLUMN `config` TEXT DEFAULT NULL; \ No newline at end of file From b8f528fba17232054f917b021130eae7db6e0167 Mon Sep 17 00:00:00 2001 From: "xinhao.huang" Date: Tue, 10 Dec 2024 11:27:07 +0800 Subject: [PATCH 193/737] [dependencies]: bump version to 5.4.0 GlobalPropertyImpact Resolves: ZSTAC-71734 Change-Id: I6272706462767a6977657675716e7573787a6e67 --- VERSION | 2 +- build/pom.xml | 2 +- compute/pom.xml | 2 +- configuration/pom.xml | 2 +- console/pom.xml | 2 +- .../main/java/org/zstack/console/ConsoleGlobalProperty.java | 2 +- core/pom.xml | 2 +- .../java/org/zstack/core/ansible/AnsibleGlobalProperty.java | 2 +- externalservice/pom.xml | 2 +- header/pom.xml | 2 +- identity/pom.xml | 2 +- image/pom.xml | 2 +- longjob/pom.xml | 2 +- network/pom.xml | 2 +- plugin/acl/pom.xml | 2 +- plugin/applianceVm/pom.xml | 2 +- .../org/zstack/appliancevm/ApplianceVmGlobalProperty.java | 2 +- plugin/cbd/pom.xml | 2 +- plugin/ceph/pom.xml | 2 +- .../main/java/org/zstack/storage/ceph/CephGlobalProperty.java | 4 ++-- plugin/directory/pom.xml | 2 +- plugin/eip/pom.xml | 2 +- plugin/expon/pom.xml | 2 +- plugin/externalStorage/pom.xml | 2 +- plugin/flatNetworkProvider/pom.xml | 2 +- plugin/hostNetworkInterface/pom.xml | 2 +- plugin/iscsi/pom.xml | 2 +- plugin/kvm/pom.xml | 2 +- .../kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java | 2 +- plugin/ldap/pom.xml | 2 +- plugin/loadBalancer/pom.xml | 2 +- plugin/localstorage/pom.xml | 2 +- plugin/loginPlugin/pom.xml | 2 +- plugin/mediator/pom.xml | 2 +- plugin/nfsPrimaryStorage/pom.xml | 2 +- plugin/pom.xml | 2 +- plugin/portForwarding/pom.xml | 2 +- plugin/sdnController/pom.xml | 2 +- plugin/securityGroup/pom.xml | 2 +- plugin/sftpBackupStorage/pom.xml | 2 +- .../storage/backup/sftp/SftpBackupStorageGlobalProperty.java | 2 +- plugin/sharedMountPointPrimaryStorage/pom.xml | 2 +- plugin/sshKeyPair/pom.xml | 2 +- plugin/sugonSdnController/pom.xml | 2 +- plugin/vhost/pom.xml | 2 +- plugin/vip/pom.xml | 2 +- plugin/virtualRouterProvider/pom.xml | 2 +- .../service/virtualrouter/VirtualRouterGlobalProperty.java | 2 +- plugin/vxlan/pom.xml | 2 +- plugin/xinfini/pom.xml | 2 +- plugin/zbs/pom.xml | 2 +- pom.xml | 2 +- portal/pom.xml | 2 +- resourceconfig/pom.xml | 2 +- rest/pom.xml | 2 +- sdk/pom.xml | 2 +- search/pom.xml | 2 +- simulator/pom.xml | 2 +- simulator/simulatorHeader/pom.xml | 2 +- simulator/simulatorImpl/pom.xml | 2 +- storage/pom.xml | 2 +- tag/pom.xml | 2 +- test/pom.xml | 2 +- testlib/pom.xml | 2 +- utils/pom.xml | 2 +- 65 files changed, 66 insertions(+), 66 deletions(-) diff --git a/VERSION b/VERSION index e7bc5164cb7..0d1081b0fe6 100755 --- a/VERSION +++ b/VERSION @@ -1,3 +1,3 @@ MAJOR=5 -MINOR=3 +MINOR=4 UPDATE=0 diff --git a/build/pom.xml b/build/pom.xml index c0e9d59617f..eac8b156f04 100755 --- a/build/pom.xml +++ b/build/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. build diff --git a/compute/pom.xml b/compute/pom.xml index dc289db0f6d..f0f9de03f5e 100755 --- a/compute/pom.xml +++ b/compute/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. compute diff --git a/configuration/pom.xml b/configuration/pom.xml index 7b430de96d4..8ce34186f80 100755 --- a/configuration/pom.xml +++ b/configuration/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. configuration diff --git a/console/pom.xml b/console/pom.xml index 0212104dbf9..47806cb4219 100755 --- a/console/pom.xml +++ b/console/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java b/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java index 5101eecc77f..418f30ba433 100644 --- a/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java +++ b/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java @@ -9,7 +9,7 @@ */ @GlobalPropertyDefinition public class ConsoleGlobalProperty { - @GlobalProperty(name="ConsoleProxy.agentPackageName", defaultValue = "consoleproxy-5.3.0.tar.gz") + @GlobalProperty(name="ConsoleProxy.agentPackageName", defaultValue = "consoleproxy-5.4.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="MN.network.", defaultValue = "") public static List MN_NETWORKS; diff --git a/core/pom.xml b/core/pom.xml index aab291866b6..fbe13125a5a 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.zstack - 5.3.0 + 5.4.0 .. zstack diff --git a/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java b/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java index 635d7fca2bf..0dfc6c0d2da 100755 --- a/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java +++ b/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java @@ -9,7 +9,7 @@ public class AnsibleGlobalProperty { @GlobalProperty(name = "Ansible.executable", defaultValue = "python") public static String EXECUTABLE; - @GlobalProperty(name = "Ansible.zstacklibPackageName", defaultValue = "zstacklib-5.3.0.tar.gz") + @GlobalProperty(name = "Ansible.zstacklibPackageName", defaultValue = "zstacklib-5.4.0.tar.gz") public static String ZSTACKLIB_PACKAGE_NAME; @GlobalProperty(name = "Ansible.zstackRoot", defaultValue = "/var/lib/zstack") public static String ZSTACK_ROOT; diff --git a/externalservice/pom.xml b/externalservice/pom.xml index 92e4c0073c2..5059f579ce7 100755 --- a/externalservice/pom.xml +++ b/externalservice/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/header/pom.xml b/header/pom.xml index c5c249ef09b..2de1fda4839 100755 --- a/header/pom.xml +++ b/header/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. header diff --git a/identity/pom.xml b/identity/pom.xml index 9daa1aab9e2..2f06a0008cb 100755 --- a/identity/pom.xml +++ b/identity/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. identity diff --git a/image/pom.xml b/image/pom.xml index 7174263e909..917fbc74fac 100755 --- a/image/pom.xml +++ b/image/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. image diff --git a/longjob/pom.xml b/longjob/pom.xml index f446a1b482e..867476237b4 100755 --- a/longjob/pom.xml +++ b/longjob/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. longjob diff --git a/network/pom.xml b/network/pom.xml index 11e601b2f59..009efab142c 100755 --- a/network/pom.xml +++ b/network/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. network diff --git a/plugin/acl/pom.xml b/plugin/acl/pom.xml index c129127c8c4..1af18880f15 100644 --- a/plugin/acl/pom.xml +++ b/plugin/acl/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/applianceVm/pom.xml b/plugin/applianceVm/pom.xml index 54800dafa67..d6529929856 100755 --- a/plugin/applianceVm/pom.xml +++ b/plugin/applianceVm/pom.xml @@ -6,7 +6,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 .. applianceVm diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java index c346a2c7578..6658e2608fe 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java @@ -11,7 +11,7 @@ public class ApplianceVmGlobalProperty { public static boolean NO_ROLLBACK_ON_POST_FAILURE; @GlobalProperty(name = "ApplianceVm.connectVerbose", defaultValue = "false") public static boolean CONNECT_VERBOSE; - @GlobalProperty(name="ApplianceVm.agentPackageName", defaultValue = "appliancevm-5.3.0.tar.gz") + @GlobalProperty(name="ApplianceVm.agentPackageName", defaultValue = "appliancevm-5.4.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="ApplianceVm.agentPort", defaultValue = "7759") public static int AGENT_PORT; diff --git a/plugin/cbd/pom.xml b/plugin/cbd/pom.xml index 3320d7ee874..cdd77c86b4b 100644 --- a/plugin/cbd/pom.xml +++ b/plugin/cbd/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.3.0 + 5.4.0 cbd diff --git a/plugin/ceph/pom.xml b/plugin/ceph/pom.xml index 3df78c8a5f3..4bf8fde202f 100755 --- a/plugin/ceph/pom.xml +++ b/plugin/ceph/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java index 94555a56fd4..4219f67cc33 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java @@ -18,13 +18,13 @@ public class CephGlobalProperty { public static String PRIMARY_STORAGE_AGENT_URL_ROOT_PATH; @GlobalProperty(name="Ceph.primaryStorageAgent.port", defaultValue = "7762") public static int PRIMARY_STORAGE_AGENT_PORT; - @GlobalProperty(name="Ceph.backupStorage.agentPackageName", defaultValue = "cephbackupstorage-5.3.0.tar.gz") + @GlobalProperty(name="Ceph.backupStorage.agentPackageName", defaultValue = "cephbackupstorage-5.4.0.tar.gz") public static String BACKUP_STORAGE_PACKAGE_NAME; @GlobalProperty(name="Ceph.backupStorage.ansiblePlaybook", defaultValue = "cephb.py") public static String BACKUP_STORAGE_PLAYBOOK_NAME; @GlobalProperty(name="Ceph.backupStorage.ansibleModulePath", defaultValue = "ansible/cephb") public static String BACKUP_STORAGE_MODULE_PATH; - @GlobalProperty(name="Ceph.primaryStorage.agentPackageName", defaultValue = "cephprimarystorage-5.3.0.tar.gz") + @GlobalProperty(name="Ceph.primaryStorage.agentPackageName", defaultValue = "cephprimarystorage-5.4.0.tar.gz") public static String PRIMARY_STORAGE_PACKAGE_NAME; @GlobalProperty(name="Ceph.primaryStorage.ansiblePlaybook", defaultValue = "cephp.py") public static String PRIMARY_STORAGE_PLAYBOOK_NAME; diff --git a/plugin/directory/pom.xml b/plugin/directory/pom.xml index d282f417e1c..17d8f511076 100644 --- a/plugin/directory/pom.xml +++ b/plugin/directory/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/eip/pom.xml b/plugin/eip/pom.xml index 9849e0b04b3..08aa87feb87 100755 --- a/plugin/eip/pom.xml +++ b/plugin/eip/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/expon/pom.xml b/plugin/expon/pom.xml index 5474e1877ae..48c98522980 100644 --- a/plugin/expon/pom.xml +++ b/plugin/expon/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/externalStorage/pom.xml b/plugin/externalStorage/pom.xml index ea6e0b03f69..76c238c9c2b 100644 --- a/plugin/externalStorage/pom.xml +++ b/plugin/externalStorage/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 .. diff --git a/plugin/flatNetworkProvider/pom.xml b/plugin/flatNetworkProvider/pom.xml index b1305b84d75..ef09fb9d946 100755 --- a/plugin/flatNetworkProvider/pom.xml +++ b/plugin/flatNetworkProvider/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/hostNetworkInterface/pom.xml b/plugin/hostNetworkInterface/pom.xml index d80bf49afbe..bb0d6ab3596 100644 --- a/plugin/hostNetworkInterface/pom.xml +++ b/plugin/hostNetworkInterface/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.3.0 + 5.4.0 hostNetworkInterface diff --git a/plugin/iscsi/pom.xml b/plugin/iscsi/pom.xml index b08238b12e5..bb7bacea0e7 100644 --- a/plugin/iscsi/pom.xml +++ b/plugin/iscsi/pom.xml @@ -6,7 +6,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 .. diff --git a/plugin/kvm/pom.xml b/plugin/kvm/pom.xml index 77efc0bfbe7..12ca68055a9 100755 --- a/plugin/kvm/pom.xml +++ b/plugin/kvm/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 .. kvm diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java index a590baf73da..7ee841b5051 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java @@ -10,7 +10,7 @@ */ @GlobalPropertyDefinition public class KVMGlobalProperty { - @GlobalProperty(name="KvmAgent.agentPackageName", defaultValue = "kvmagent-5.3.0.tar.gz") + @GlobalProperty(name="KvmAgent.agentPackageName", defaultValue = "kvmagent-5.4.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="KvmAgent.agentUrlRootPath", defaultValue = "") public static String AGENT_URL_ROOT_PATH; diff --git a/plugin/ldap/pom.xml b/plugin/ldap/pom.xml index b2fa4977464..9f4b2ebc1a1 100755 --- a/plugin/ldap/pom.xml +++ b/plugin/ldap/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/loadBalancer/pom.xml b/plugin/loadBalancer/pom.xml index c3603ebe8d4..65f09eeb277 100755 --- a/plugin/loadBalancer/pom.xml +++ b/plugin/loadBalancer/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/localstorage/pom.xml b/plugin/localstorage/pom.xml index aed148455b3..2fa49de85a0 100755 --- a/plugin/localstorage/pom.xml +++ b/plugin/localstorage/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/loginPlugin/pom.xml b/plugin/loginPlugin/pom.xml index e698ce03816..3be14fc3082 100644 --- a/plugin/loginPlugin/pom.xml +++ b/plugin/loginPlugin/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 .. loginPlugin diff --git a/plugin/mediator/pom.xml b/plugin/mediator/pom.xml index 44867a048ba..c98247a956f 100755 --- a/plugin/mediator/pom.xml +++ b/plugin/mediator/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/nfsPrimaryStorage/pom.xml b/plugin/nfsPrimaryStorage/pom.xml index 2e06cbe92bc..2d63182f8e1 100755 --- a/plugin/nfsPrimaryStorage/pom.xml +++ b/plugin/nfsPrimaryStorage/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 .. nfsPrimaryStorage diff --git a/plugin/pom.xml b/plugin/pom.xml index 1a96be7bffc..c46db44e621 100755 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. plugin diff --git a/plugin/portForwarding/pom.xml b/plugin/portForwarding/pom.xml index bdcade2aa7e..051e60a74e7 100755 --- a/plugin/portForwarding/pom.xml +++ b/plugin/portForwarding/pom.xml @@ -4,7 +4,7 @@ org.zstack plugin - 5.3.0 + 5.4.0 portForwarding diff --git a/plugin/sdnController/pom.xml b/plugin/sdnController/pom.xml index ebd31ef11e2..89cbb608044 100644 --- a/plugin/sdnController/pom.xml +++ b/plugin/sdnController/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/securityGroup/pom.xml b/plugin/securityGroup/pom.xml index f8983f1db39..f3651c37eba 100755 --- a/plugin/securityGroup/pom.xml +++ b/plugin/securityGroup/pom.xml @@ -4,7 +4,7 @@ org.zstack plugin - 5.3.0 + 5.4.0 securityGroup diff --git a/plugin/sftpBackupStorage/pom.xml b/plugin/sftpBackupStorage/pom.xml index 7f6b567a3f6..94f4a9a2b3a 100755 --- a/plugin/sftpBackupStorage/pom.xml +++ b/plugin/sftpBackupStorage/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 .. sftpBackupStorage diff --git a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java index 1c81f5ea44c..ec01923a4fd 100755 --- a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java +++ b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java @@ -10,7 +10,7 @@ @GlobalPropertyDefinition public class SftpBackupStorageGlobalProperty { - @GlobalProperty(name="SftpBackupStorage.agentPackageName", defaultValue = "sftpbackupstorage-5.3.0.tar.gz") + @GlobalProperty(name="SftpBackupStorage.agentPackageName", defaultValue = "sftpbackupstorage-5.4.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="SftpBackupStorage.agentPort", defaultValue = "7171") public static int AGENT_PORT; diff --git a/plugin/sharedMountPointPrimaryStorage/pom.xml b/plugin/sharedMountPointPrimaryStorage/pom.xml index a24b156f89b..20695c58859 100755 --- a/plugin/sharedMountPointPrimaryStorage/pom.xml +++ b/plugin/sharedMountPointPrimaryStorage/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/sshKeyPair/pom.xml b/plugin/sshKeyPair/pom.xml index 05fade1110a..51e8e74c9a0 100644 --- a/plugin/sshKeyPair/pom.xml +++ b/plugin/sshKeyPair/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.3.0 + 5.4.0 sshKeyPair diff --git a/plugin/sugonSdnController/pom.xml b/plugin/sugonSdnController/pom.xml index 9bc556f7980..a45fbb7638f 100644 --- a/plugin/sugonSdnController/pom.xml +++ b/plugin/sugonSdnController/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/vhost/pom.xml b/plugin/vhost/pom.xml index 322ebf27c65..a132e6b2567 100644 --- a/plugin/vhost/pom.xml +++ b/plugin/vhost/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/vip/pom.xml b/plugin/vip/pom.xml index 1ebfea74c84..ec953869f29 100755 --- a/plugin/vip/pom.xml +++ b/plugin/vip/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/virtualRouterProvider/pom.xml b/plugin/virtualRouterProvider/pom.xml index 44d52384795..a8eb705f54f 100755 --- a/plugin/virtualRouterProvider/pom.xml +++ b/plugin/virtualRouterProvider/pom.xml @@ -4,7 +4,7 @@ org.zstack plugin - 5.3.0 + 5.4.0 virtualRouterProvider diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java index 6e1cd42166b..7dad8ffaf39 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java @@ -9,7 +9,7 @@ */ @GlobalPropertyDefinition public class VirtualRouterGlobalProperty { - @GlobalProperty(name="VirtualRouter.agentPackageName", defaultValue = "virtualrouter-5.3.0.tar.gz") + @GlobalProperty(name="VirtualRouter.agentPackageName", defaultValue = "virtualrouter-5.4.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="VirtualRouter.agentPort", defaultValue = "7272") public static int AGENT_PORT; diff --git a/plugin/vxlan/pom.xml b/plugin/vxlan/pom.xml index cf98a1e8a48..8d601d112a6 100755 --- a/plugin/vxlan/pom.xml +++ b/plugin/vxlan/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/xinfini/pom.xml b/plugin/xinfini/pom.xml index 75068fd3c67..ae8dd2713b4 100644 --- a/plugin/xinfini/pom.xml +++ b/plugin/xinfini/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/zbs/pom.xml b/plugin/zbs/pom.xml index 6304721bc9c..611473553b8 100644 --- a/plugin/zbs/pom.xml +++ b/plugin/zbs/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.3.0 + 5.4.0 zbs diff --git a/pom.xml b/pom.xml index 89e87c84db3..06ff35e7d98 100755 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ 4.0.0 org.zstack zstack - 5.3.0 + 5.4.0 pom zstack diff --git a/portal/pom.xml b/portal/pom.xml index 494552aa75f..8a8775d4c5c 100755 --- a/portal/pom.xml +++ b/portal/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. portal diff --git a/resourceconfig/pom.xml b/resourceconfig/pom.xml index ad0a4287330..52e0a5ec525 100644 --- a/resourceconfig/pom.xml +++ b/resourceconfig/pom.xml @@ -6,7 +6,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. resourceconfig diff --git a/rest/pom.xml b/rest/pom.xml index 5cbedf16490..1a79e191c0f 100755 --- a/rest/pom.xml +++ b/rest/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/sdk/pom.xml b/sdk/pom.xml index cc00f0a8d47..72ed68dd8ab 100755 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/search/pom.xml b/search/pom.xml index cba6792904f..b765e61e0f1 100755 --- a/search/pom.xml +++ b/search/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. search diff --git a/simulator/pom.xml b/simulator/pom.xml index 7a6cfe8709f..d2e22ea6592 100755 --- a/simulator/pom.xml +++ b/simulator/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. simulator diff --git a/simulator/simulatorHeader/pom.xml b/simulator/simulatorHeader/pom.xml index 024ec5904de..8ed6ccc130d 100755 --- a/simulator/simulatorHeader/pom.xml +++ b/simulator/simulatorHeader/pom.xml @@ -4,7 +4,7 @@ simulator org.zstack - 5.3.0 + 5.4.0 .. simulatorHeader diff --git a/simulator/simulatorImpl/pom.xml b/simulator/simulatorImpl/pom.xml index 570b2c87e53..488fb34922d 100755 --- a/simulator/simulatorImpl/pom.xml +++ b/simulator/simulatorImpl/pom.xml @@ -4,7 +4,7 @@ simulator org.zstack - 5.3.0 + 5.4.0 .. simulatorImpl diff --git a/storage/pom.xml b/storage/pom.xml index 68360e375ef..d5fe306aec3 100755 --- a/storage/pom.xml +++ b/storage/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. storage diff --git a/tag/pom.xml b/tag/pom.xml index 991729e3689..1ea0b24c986 100755 --- a/tag/pom.xml +++ b/tag/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/test/pom.xml b/test/pom.xml index 9c04be4ae9b..f21c42f9fee 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -9,7 +9,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. test diff --git a/testlib/pom.xml b/testlib/pom.xml index 5e3a6f4ae41..2c8e374fce4 100644 --- a/testlib/pom.xml +++ b/testlib/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/utils/pom.xml b/utils/pom.xml index c28be564e13..55be08113bb 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. utils From f4f9c5ce87217a7dc9896ca02611964dfe987255 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Thu, 12 Dec 2024 11:08:46 +0800 Subject: [PATCH 194/737] [sdk]: baremetal support autoinstall template Resolves: ZSTAC-71795 Change-Id: I71737a756b70737462737869656c7171696f7371 --- .../java/org/zstack/sdk/AddPreconfigurationTemplateAction.java | 2 +- .../org/zstack/sdk/UpdatePreconfigurationTemplateAction.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/AddPreconfigurationTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/AddPreconfigurationTemplateAction.java index 07f59d47055..65513ccadaa 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddPreconfigurationTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddPreconfigurationTemplateAction.java @@ -34,7 +34,7 @@ public Result throwExceptionIfError() { @Param(required = true, maxLength = 64, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String distribution; - @Param(required = true, validValues = {"kickstart","preseed","autoyast"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"kickstart","preseed","autoyast","autoinstall"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, maxLength = 16777215, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/UpdatePreconfigurationTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/UpdatePreconfigurationTemplateAction.java index 1326b0b0c6f..1fd613de5d2 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdatePreconfigurationTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdatePreconfigurationTemplateAction.java @@ -37,7 +37,7 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 64, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String distribution; - @Param(required = false, validValues = {"kickstart","preseed","autoyast"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"kickstart","preseed","autoyast","autoinstall"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = false, maxLength = 16777215, nonempty = false, nullElements = false, emptyString = true, noTrim = false) From 1dda8f8ea2735dabcb9c814df21cc6ac0d72271b Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Thu, 5 Dec 2024 10:10:37 +0800 Subject: [PATCH 195/737] [conf]: update the length of the `systemName` column Resolves: ZSTAC-71739 Change-Id: I79626c796a6c656a62627565646b757175786e65 --- conf/db/upgrade/V5.4.0__schema.sql | 3 ++- .../integration/network/hostNetwork/GetLldpInfoCase.groovy | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/conf/db/upgrade/V5.4.0__schema.sql b/conf/db/upgrade/V5.4.0__schema.sql index cf793bbb45c..59b0fd4bbaf 100644 --- a/conf/db/upgrade/V5.4.0__schema.sql +++ b/conf/db/upgrade/V5.4.0__schema.sql @@ -1,4 +1,5 @@ ALTER TABLE AutoScalingRuleSchedulerJobTriggerVO DROP FOREIGN KEY fkAutoScalingRuleSchedulerJobTriggerVO; CALL ADD_CONSTRAINT('AutoScalingRuleSchedulerJobTriggerVO', 'fkAutoScalingRuleSchedulerJobTriggerVO', 'schedulerJobUuid', 'SchedulerJobVO', 'uuid', 'CASCADE'); -ALTER TABLE `zstack`.`ExternalPrimaryStorageVO` MODIFY COLUMN `config` TEXT DEFAULT NULL; \ No newline at end of file +ALTER TABLE `zstack`.`ExternalPrimaryStorageVO` MODIFY COLUMN `config` TEXT DEFAULT NULL; +ALTER TABLE `zstack`.`HostNetworkInterfaceLldpRefVO` MODIFY COLUMN `systemName` VARCHAR(255) NOT NULL; diff --git a/test/src/test/groovy/org/zstack/test/integration/network/hostNetwork/GetLldpInfoCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/hostNetwork/GetLldpInfoCase.groovy index 9cd7f36ad50..aec27dd7fe1 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/hostNetwork/GetLldpInfoCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/hostNetwork/GetLldpInfoCase.groovy @@ -3,11 +3,13 @@ package org.zstack.test.integration.network.hostNetwork import org.springframework.http.HttpEntity import org.zstack.core.Platform import org.zstack.core.db.DatabaseFacade +import org.zstack.core.db.Q import org.zstack.core.db.SQL import org.zstack.network.hostNetworkInterface.HostNetworkInterfaceVO import org.zstack.network.hostNetworkInterface.lldp.LldpConstant import org.zstack.network.hostNetworkInterface.lldp.LldpInfoStruct import org.zstack.network.hostNetworkInterface.lldp.LldpKvmAgentCommands +import org.zstack.network.hostNetworkInterface.lldp.entity.HostNetworkInterfaceLldpRefVO_ import org.zstack.network.hostNetworkInterface.lldp.entity.HostNetworkInterfaceLldpVO import org.zstack.network.hostNetworkInterface.lldp.entity.HostNetworkInterfaceLldpVO_ import org.zstack.network.hostNetworkInterface.lldp.entity.HostNetworkInterfaceLldpRefVO @@ -130,7 +132,7 @@ class GetLldpInfoCase extends SubCase { reply.lldpInfo.chassisId = "mac 00:1e:08:1d:05:ba" reply.lldpInfo.timeToLive = 120 reply.lldpInfo.managementAddress = "172.25.2.4" - reply.lldpInfo.systemName = "BM-MN-3" + reply.lldpInfo.systemName = "JBM1-1F-11-34U-DC0FF-CESHI-93180-S01.vivo.xyz" reply.lldpInfo.systemDescription = "CentecOS software, E530, Version 7.4.7 Copyright (C) 2004-2021 Centec Networks Inc. All Rights Reserved." reply.lldpInfo.systemCapabilities = "Bridge, on Router, on" reply.lldpInfo.portId = "ifname eth-0-5" @@ -145,8 +147,11 @@ class GetLldpInfoCase extends SubCase { interfaceUuid = TEST_UUID } as GetHostNetworkInterfaceLldpResult + assert ms.lldp.systemName == "JBM1-1F-11-34U-DC0FF-CESHI-93180-S01.vivo.xyz" assert ms.lldp.portId == "ifname eth-0-5" + assert Q.New(HostNetworkInterfaceLldpRefVO.class).eq(HostNetworkInterfaceLldpRefVO_.systemName, "JBM1-1F-11-34U-DC0FF-CESHI-93180-S01.vivo.xyz").isExists() + HostNetworkInterfaceVO vo1 = new HostNetworkInterfaceVO(); vo1.setUuid(TEST_UUID_2) vo1.setHostUuid(host2.getUuid()) From ecd5fb3a63c1c878c6f34f42ace1f38fdddac714 Mon Sep 17 00:00:00 2001 From: "xinhao.huang" Date: Wed, 18 Dec 2024 12:53:48 +0800 Subject: [PATCH 196/737] [dependencies]: bump version to 5.3.20 DBImpact GlobalPropertyImpact Resolves: ZSTAC-71979 Change-Id: I79616e6a77627576786362667a74756c7a6a7872 --- VERSION | 4 ++-- build/pom.xml | 2 +- compute/pom.xml | 2 +- conf/db/upgrade/{V5.4.0__schema.sql => V5.3.20__schema.sql} | 0 configuration/pom.xml | 2 +- console/pom.xml | 2 +- .../main/java/org/zstack/console/ConsoleGlobalProperty.java | 2 +- core/pom.xml | 2 +- .../java/org/zstack/core/ansible/AnsibleGlobalProperty.java | 2 +- externalservice/pom.xml | 2 +- header/pom.xml | 2 +- identity/pom.xml | 2 +- image/pom.xml | 2 +- longjob/pom.xml | 2 +- network/pom.xml | 2 +- plugin/acl/pom.xml | 2 +- plugin/applianceVm/pom.xml | 2 +- .../org/zstack/appliancevm/ApplianceVmGlobalProperty.java | 2 +- plugin/cbd/pom.xml | 2 +- plugin/ceph/pom.xml | 2 +- .../main/java/org/zstack/storage/ceph/CephGlobalProperty.java | 4 ++-- plugin/directory/pom.xml | 2 +- plugin/eip/pom.xml | 2 +- plugin/expon/pom.xml | 2 +- plugin/externalStorage/pom.xml | 2 +- plugin/flatNetworkProvider/pom.xml | 2 +- plugin/hostNetworkInterface/pom.xml | 2 +- plugin/iscsi/pom.xml | 2 +- plugin/kvm/pom.xml | 2 +- .../kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java | 2 +- plugin/ldap/pom.xml | 2 +- plugin/loadBalancer/pom.xml | 2 +- plugin/localstorage/pom.xml | 2 +- plugin/loginPlugin/pom.xml | 2 +- plugin/mediator/pom.xml | 2 +- plugin/nfsPrimaryStorage/pom.xml | 2 +- plugin/pom.xml | 2 +- plugin/portForwarding/pom.xml | 2 +- plugin/sdnController/pom.xml | 2 +- plugin/securityGroup/pom.xml | 2 +- plugin/sftpBackupStorage/pom.xml | 2 +- .../storage/backup/sftp/SftpBackupStorageGlobalProperty.java | 2 +- plugin/sharedMountPointPrimaryStorage/pom.xml | 2 +- plugin/sshKeyPair/pom.xml | 2 +- plugin/sugonSdnController/pom.xml | 2 +- plugin/vhost/pom.xml | 2 +- plugin/vip/pom.xml | 2 +- plugin/virtualRouterProvider/pom.xml | 2 +- .../service/virtualrouter/VirtualRouterGlobalProperty.java | 2 +- plugin/vxlan/pom.xml | 2 +- plugin/xinfini/pom.xml | 2 +- plugin/zbs/pom.xml | 2 +- pom.xml | 2 +- portal/pom.xml | 2 +- resourceconfig/pom.xml | 2 +- rest/pom.xml | 2 +- sdk/pom.xml | 2 +- search/pom.xml | 2 +- simulator/pom.xml | 2 +- simulator/simulatorHeader/pom.xml | 2 +- simulator/simulatorImpl/pom.xml | 2 +- storage/pom.xml | 2 +- tag/pom.xml | 2 +- test/pom.xml | 2 +- testlib/pom.xml | 2 +- utils/pom.xml | 2 +- 66 files changed, 67 insertions(+), 67 deletions(-) rename conf/db/upgrade/{V5.4.0__schema.sql => V5.3.20__schema.sql} (100%) diff --git a/VERSION b/VERSION index 0d1081b0fe6..328ed5f6bec 100755 --- a/VERSION +++ b/VERSION @@ -1,3 +1,3 @@ MAJOR=5 -MINOR=4 -UPDATE=0 +MINOR=3 +UPDATE=20 diff --git a/build/pom.xml b/build/pom.xml index eac8b156f04..c0e9d59617f 100755 --- a/build/pom.xml +++ b/build/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 .. build diff --git a/compute/pom.xml b/compute/pom.xml index f0f9de03f5e..dc289db0f6d 100755 --- a/compute/pom.xml +++ b/compute/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 .. compute diff --git a/conf/db/upgrade/V5.4.0__schema.sql b/conf/db/upgrade/V5.3.20__schema.sql similarity index 100% rename from conf/db/upgrade/V5.4.0__schema.sql rename to conf/db/upgrade/V5.3.20__schema.sql diff --git a/configuration/pom.xml b/configuration/pom.xml index 8ce34186f80..7b430de96d4 100755 --- a/configuration/pom.xml +++ b/configuration/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 .. configuration diff --git a/console/pom.xml b/console/pom.xml index 47806cb4219..0212104dbf9 100755 --- a/console/pom.xml +++ b/console/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java b/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java index 418f30ba433..5101eecc77f 100644 --- a/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java +++ b/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java @@ -9,7 +9,7 @@ */ @GlobalPropertyDefinition public class ConsoleGlobalProperty { - @GlobalProperty(name="ConsoleProxy.agentPackageName", defaultValue = "consoleproxy-5.4.0.tar.gz") + @GlobalProperty(name="ConsoleProxy.agentPackageName", defaultValue = "consoleproxy-5.3.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="MN.network.", defaultValue = "") public static List MN_NETWORKS; diff --git a/core/pom.xml b/core/pom.xml index fbe13125a5a..aab291866b6 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.zstack - 5.4.0 + 5.3.0 .. zstack diff --git a/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java b/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java index 0dfc6c0d2da..635d7fca2bf 100755 --- a/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java +++ b/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java @@ -9,7 +9,7 @@ public class AnsibleGlobalProperty { @GlobalProperty(name = "Ansible.executable", defaultValue = "python") public static String EXECUTABLE; - @GlobalProperty(name = "Ansible.zstacklibPackageName", defaultValue = "zstacklib-5.4.0.tar.gz") + @GlobalProperty(name = "Ansible.zstacklibPackageName", defaultValue = "zstacklib-5.3.0.tar.gz") public static String ZSTACKLIB_PACKAGE_NAME; @GlobalProperty(name = "Ansible.zstackRoot", defaultValue = "/var/lib/zstack") public static String ZSTACK_ROOT; diff --git a/externalservice/pom.xml b/externalservice/pom.xml index 5059f579ce7..92e4c0073c2 100755 --- a/externalservice/pom.xml +++ b/externalservice/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/header/pom.xml b/header/pom.xml index 2de1fda4839..c5c249ef09b 100755 --- a/header/pom.xml +++ b/header/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 .. header diff --git a/identity/pom.xml b/identity/pom.xml index 2f06a0008cb..9daa1aab9e2 100755 --- a/identity/pom.xml +++ b/identity/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 .. identity diff --git a/image/pom.xml b/image/pom.xml index 917fbc74fac..7174263e909 100755 --- a/image/pom.xml +++ b/image/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 .. image diff --git a/longjob/pom.xml b/longjob/pom.xml index 867476237b4..f446a1b482e 100755 --- a/longjob/pom.xml +++ b/longjob/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 .. longjob diff --git a/network/pom.xml b/network/pom.xml index 009efab142c..11e601b2f59 100755 --- a/network/pom.xml +++ b/network/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 .. network diff --git a/plugin/acl/pom.xml b/plugin/acl/pom.xml index 1af18880f15..c129127c8c4 100644 --- a/plugin/acl/pom.xml +++ b/plugin/acl/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/plugin/applianceVm/pom.xml b/plugin/applianceVm/pom.xml index d6529929856..54800dafa67 100755 --- a/plugin/applianceVm/pom.xml +++ b/plugin/applianceVm/pom.xml @@ -6,7 +6,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 .. applianceVm diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java index 6658e2608fe..c346a2c7578 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java @@ -11,7 +11,7 @@ public class ApplianceVmGlobalProperty { public static boolean NO_ROLLBACK_ON_POST_FAILURE; @GlobalProperty(name = "ApplianceVm.connectVerbose", defaultValue = "false") public static boolean CONNECT_VERBOSE; - @GlobalProperty(name="ApplianceVm.agentPackageName", defaultValue = "appliancevm-5.4.0.tar.gz") + @GlobalProperty(name="ApplianceVm.agentPackageName", defaultValue = "appliancevm-5.3.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="ApplianceVm.agentPort", defaultValue = "7759") public static int AGENT_PORT; diff --git a/plugin/cbd/pom.xml b/plugin/cbd/pom.xml index cdd77c86b4b..3320d7ee874 100644 --- a/plugin/cbd/pom.xml +++ b/plugin/cbd/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.4.0 + 5.3.0 cbd diff --git a/plugin/ceph/pom.xml b/plugin/ceph/pom.xml index 4bf8fde202f..3df78c8a5f3 100755 --- a/plugin/ceph/pom.xml +++ b/plugin/ceph/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java index 4219f67cc33..94555a56fd4 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java @@ -18,13 +18,13 @@ public class CephGlobalProperty { public static String PRIMARY_STORAGE_AGENT_URL_ROOT_PATH; @GlobalProperty(name="Ceph.primaryStorageAgent.port", defaultValue = "7762") public static int PRIMARY_STORAGE_AGENT_PORT; - @GlobalProperty(name="Ceph.backupStorage.agentPackageName", defaultValue = "cephbackupstorage-5.4.0.tar.gz") + @GlobalProperty(name="Ceph.backupStorage.agentPackageName", defaultValue = "cephbackupstorage-5.3.0.tar.gz") public static String BACKUP_STORAGE_PACKAGE_NAME; @GlobalProperty(name="Ceph.backupStorage.ansiblePlaybook", defaultValue = "cephb.py") public static String BACKUP_STORAGE_PLAYBOOK_NAME; @GlobalProperty(name="Ceph.backupStorage.ansibleModulePath", defaultValue = "ansible/cephb") public static String BACKUP_STORAGE_MODULE_PATH; - @GlobalProperty(name="Ceph.primaryStorage.agentPackageName", defaultValue = "cephprimarystorage-5.4.0.tar.gz") + @GlobalProperty(name="Ceph.primaryStorage.agentPackageName", defaultValue = "cephprimarystorage-5.3.0.tar.gz") public static String PRIMARY_STORAGE_PACKAGE_NAME; @GlobalProperty(name="Ceph.primaryStorage.ansiblePlaybook", defaultValue = "cephp.py") public static String PRIMARY_STORAGE_PLAYBOOK_NAME; diff --git a/plugin/directory/pom.xml b/plugin/directory/pom.xml index 17d8f511076..d282f417e1c 100644 --- a/plugin/directory/pom.xml +++ b/plugin/directory/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/plugin/eip/pom.xml b/plugin/eip/pom.xml index 08aa87feb87..9849e0b04b3 100755 --- a/plugin/eip/pom.xml +++ b/plugin/eip/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/plugin/expon/pom.xml b/plugin/expon/pom.xml index 48c98522980..5474e1877ae 100644 --- a/plugin/expon/pom.xml +++ b/plugin/expon/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/plugin/externalStorage/pom.xml b/plugin/externalStorage/pom.xml index 76c238c9c2b..ea6e0b03f69 100644 --- a/plugin/externalStorage/pom.xml +++ b/plugin/externalStorage/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 .. diff --git a/plugin/flatNetworkProvider/pom.xml b/plugin/flatNetworkProvider/pom.xml index ef09fb9d946..b1305b84d75 100755 --- a/plugin/flatNetworkProvider/pom.xml +++ b/plugin/flatNetworkProvider/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/plugin/hostNetworkInterface/pom.xml b/plugin/hostNetworkInterface/pom.xml index bb0d6ab3596..d80bf49afbe 100644 --- a/plugin/hostNetworkInterface/pom.xml +++ b/plugin/hostNetworkInterface/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.4.0 + 5.3.0 hostNetworkInterface diff --git a/plugin/iscsi/pom.xml b/plugin/iscsi/pom.xml index bb7bacea0e7..b08238b12e5 100644 --- a/plugin/iscsi/pom.xml +++ b/plugin/iscsi/pom.xml @@ -6,7 +6,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 .. diff --git a/plugin/kvm/pom.xml b/plugin/kvm/pom.xml index 12ca68055a9..77efc0bfbe7 100755 --- a/plugin/kvm/pom.xml +++ b/plugin/kvm/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 .. kvm diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java index 7ee841b5051..a590baf73da 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java @@ -10,7 +10,7 @@ */ @GlobalPropertyDefinition public class KVMGlobalProperty { - @GlobalProperty(name="KvmAgent.agentPackageName", defaultValue = "kvmagent-5.4.0.tar.gz") + @GlobalProperty(name="KvmAgent.agentPackageName", defaultValue = "kvmagent-5.3.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="KvmAgent.agentUrlRootPath", defaultValue = "") public static String AGENT_URL_ROOT_PATH; diff --git a/plugin/ldap/pom.xml b/plugin/ldap/pom.xml index 9f4b2ebc1a1..b2fa4977464 100755 --- a/plugin/ldap/pom.xml +++ b/plugin/ldap/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/plugin/loadBalancer/pom.xml b/plugin/loadBalancer/pom.xml index 65f09eeb277..c3603ebe8d4 100755 --- a/plugin/loadBalancer/pom.xml +++ b/plugin/loadBalancer/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/plugin/localstorage/pom.xml b/plugin/localstorage/pom.xml index 2fa49de85a0..aed148455b3 100755 --- a/plugin/localstorage/pom.xml +++ b/plugin/localstorage/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/plugin/loginPlugin/pom.xml b/plugin/loginPlugin/pom.xml index 3be14fc3082..e698ce03816 100644 --- a/plugin/loginPlugin/pom.xml +++ b/plugin/loginPlugin/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 .. loginPlugin diff --git a/plugin/mediator/pom.xml b/plugin/mediator/pom.xml index c98247a956f..44867a048ba 100755 --- a/plugin/mediator/pom.xml +++ b/plugin/mediator/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/plugin/nfsPrimaryStorage/pom.xml b/plugin/nfsPrimaryStorage/pom.xml index 2d63182f8e1..2e06cbe92bc 100755 --- a/plugin/nfsPrimaryStorage/pom.xml +++ b/plugin/nfsPrimaryStorage/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 .. nfsPrimaryStorage diff --git a/plugin/pom.xml b/plugin/pom.xml index c46db44e621..1a96be7bffc 100755 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 .. plugin diff --git a/plugin/portForwarding/pom.xml b/plugin/portForwarding/pom.xml index 051e60a74e7..bdcade2aa7e 100755 --- a/plugin/portForwarding/pom.xml +++ b/plugin/portForwarding/pom.xml @@ -4,7 +4,7 @@ org.zstack plugin - 5.4.0 + 5.3.0 portForwarding diff --git a/plugin/sdnController/pom.xml b/plugin/sdnController/pom.xml index 89cbb608044..ebd31ef11e2 100644 --- a/plugin/sdnController/pom.xml +++ b/plugin/sdnController/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/plugin/securityGroup/pom.xml b/plugin/securityGroup/pom.xml index f3651c37eba..f8983f1db39 100755 --- a/plugin/securityGroup/pom.xml +++ b/plugin/securityGroup/pom.xml @@ -4,7 +4,7 @@ org.zstack plugin - 5.4.0 + 5.3.0 securityGroup diff --git a/plugin/sftpBackupStorage/pom.xml b/plugin/sftpBackupStorage/pom.xml index 94f4a9a2b3a..7f6b567a3f6 100755 --- a/plugin/sftpBackupStorage/pom.xml +++ b/plugin/sftpBackupStorage/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 .. sftpBackupStorage diff --git a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java index ec01923a4fd..1c81f5ea44c 100755 --- a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java +++ b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java @@ -10,7 +10,7 @@ @GlobalPropertyDefinition public class SftpBackupStorageGlobalProperty { - @GlobalProperty(name="SftpBackupStorage.agentPackageName", defaultValue = "sftpbackupstorage-5.4.0.tar.gz") + @GlobalProperty(name="SftpBackupStorage.agentPackageName", defaultValue = "sftpbackupstorage-5.3.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="SftpBackupStorage.agentPort", defaultValue = "7171") public static int AGENT_PORT; diff --git a/plugin/sharedMountPointPrimaryStorage/pom.xml b/plugin/sharedMountPointPrimaryStorage/pom.xml index 20695c58859..a24b156f89b 100755 --- a/plugin/sharedMountPointPrimaryStorage/pom.xml +++ b/plugin/sharedMountPointPrimaryStorage/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/plugin/sshKeyPair/pom.xml b/plugin/sshKeyPair/pom.xml index 51e8e74c9a0..05fade1110a 100644 --- a/plugin/sshKeyPair/pom.xml +++ b/plugin/sshKeyPair/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.4.0 + 5.3.0 sshKeyPair diff --git a/plugin/sugonSdnController/pom.xml b/plugin/sugonSdnController/pom.xml index a45fbb7638f..9bc556f7980 100644 --- a/plugin/sugonSdnController/pom.xml +++ b/plugin/sugonSdnController/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/plugin/vhost/pom.xml b/plugin/vhost/pom.xml index a132e6b2567..322ebf27c65 100644 --- a/plugin/vhost/pom.xml +++ b/plugin/vhost/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/plugin/vip/pom.xml b/plugin/vip/pom.xml index ec953869f29..1ebfea74c84 100755 --- a/plugin/vip/pom.xml +++ b/plugin/vip/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/plugin/virtualRouterProvider/pom.xml b/plugin/virtualRouterProvider/pom.xml index a8eb705f54f..44d52384795 100755 --- a/plugin/virtualRouterProvider/pom.xml +++ b/plugin/virtualRouterProvider/pom.xml @@ -4,7 +4,7 @@ org.zstack plugin - 5.4.0 + 5.3.0 virtualRouterProvider diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java index 7dad8ffaf39..6e1cd42166b 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java @@ -9,7 +9,7 @@ */ @GlobalPropertyDefinition public class VirtualRouterGlobalProperty { - @GlobalProperty(name="VirtualRouter.agentPackageName", defaultValue = "virtualrouter-5.4.0.tar.gz") + @GlobalProperty(name="VirtualRouter.agentPackageName", defaultValue = "virtualrouter-5.3.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="VirtualRouter.agentPort", defaultValue = "7272") public static int AGENT_PORT; diff --git a/plugin/vxlan/pom.xml b/plugin/vxlan/pom.xml index 8d601d112a6..cf98a1e8a48 100755 --- a/plugin/vxlan/pom.xml +++ b/plugin/vxlan/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/plugin/xinfini/pom.xml b/plugin/xinfini/pom.xml index ae8dd2713b4..75068fd3c67 100644 --- a/plugin/xinfini/pom.xml +++ b/plugin/xinfini/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/plugin/zbs/pom.xml b/plugin/zbs/pom.xml index 611473553b8..6304721bc9c 100644 --- a/plugin/zbs/pom.xml +++ b/plugin/zbs/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.4.0 + 5.3.0 zbs diff --git a/pom.xml b/pom.xml index 06ff35e7d98..89e87c84db3 100755 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ 4.0.0 org.zstack zstack - 5.4.0 + 5.3.0 pom zstack diff --git a/portal/pom.xml b/portal/pom.xml index 8a8775d4c5c..494552aa75f 100755 --- a/portal/pom.xml +++ b/portal/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 .. portal diff --git a/resourceconfig/pom.xml b/resourceconfig/pom.xml index 52e0a5ec525..ad0a4287330 100644 --- a/resourceconfig/pom.xml +++ b/resourceconfig/pom.xml @@ -6,7 +6,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 .. resourceconfig diff --git a/rest/pom.xml b/rest/pom.xml index 1a79e191c0f..5cbedf16490 100755 --- a/rest/pom.xml +++ b/rest/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/sdk/pom.xml b/sdk/pom.xml index 72ed68dd8ab..cc00f0a8d47 100755 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/search/pom.xml b/search/pom.xml index b765e61e0f1..cba6792904f 100755 --- a/search/pom.xml +++ b/search/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 .. search diff --git a/simulator/pom.xml b/simulator/pom.xml index d2e22ea6592..7a6cfe8709f 100755 --- a/simulator/pom.xml +++ b/simulator/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 .. simulator diff --git a/simulator/simulatorHeader/pom.xml b/simulator/simulatorHeader/pom.xml index 8ed6ccc130d..024ec5904de 100755 --- a/simulator/simulatorHeader/pom.xml +++ b/simulator/simulatorHeader/pom.xml @@ -4,7 +4,7 @@ simulator org.zstack - 5.4.0 + 5.3.0 .. simulatorHeader diff --git a/simulator/simulatorImpl/pom.xml b/simulator/simulatorImpl/pom.xml index 488fb34922d..570b2c87e53 100755 --- a/simulator/simulatorImpl/pom.xml +++ b/simulator/simulatorImpl/pom.xml @@ -4,7 +4,7 @@ simulator org.zstack - 5.4.0 + 5.3.0 .. simulatorImpl diff --git a/storage/pom.xml b/storage/pom.xml index d5fe306aec3..68360e375ef 100755 --- a/storage/pom.xml +++ b/storage/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 .. storage diff --git a/tag/pom.xml b/tag/pom.xml index 1ea0b24c986..991729e3689 100755 --- a/tag/pom.xml +++ b/tag/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/test/pom.xml b/test/pom.xml index f21c42f9fee..9c04be4ae9b 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -9,7 +9,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 .. test diff --git a/testlib/pom.xml b/testlib/pom.xml index 2c8e374fce4..5e3a6f4ae41 100644 --- a/testlib/pom.xml +++ b/testlib/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 4.0.0 diff --git a/utils/pom.xml b/utils/pom.xml index 55be08113bb..c28be564e13 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.4.0 + 5.3.0 .. utils From 0214439332d2d7cd79b148cccf5947fb1fd16d2a Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Wed, 18 Dec 2024 17:57:15 +0800 Subject: [PATCH 197/737] [kvm]: sync VM status after timeout failure during startup Resolves: ZSTAC-71933 Change-Id: I76726a6a6266766a7168676675737466706e6b67 --- .../src/main/java/org/zstack/kvm/KVMHost.java | 29 ++++++----- .../kvm/vm/VmDestroyingCase.groovy | 49 +++++++++++++++++++ 2 files changed, 63 insertions(+), 15 deletions(-) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 5099d2c983d..7f31002948d 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -12,11 +12,6 @@ import org.zstack.compute.cluster.arch.ClusterResourceConfigInitializer; import org.zstack.compute.host.*; import org.zstack.compute.vm.*; -import org.zstack.core.config.GuestOsHelper; -import org.zstack.core.config.schema.GuestOsCharacter; -import org.zstack.core.timeout.TimeHelper; -import org.zstack.header.vm.devices.VirtualDeviceInfo; -import org.zstack.header.vm.devices.VmInstanceDeviceManager; import org.zstack.core.CoreGlobalProperty; import org.zstack.core.MessageCommandRecorder; import org.zstack.core.Platform; @@ -25,6 +20,8 @@ import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.cloudbus.CloudBusGlobalProperty; import org.zstack.core.componentloader.PluginRegistry; +import org.zstack.core.config.GuestOsHelper; +import org.zstack.core.config.schema.GuestOsCharacter; import org.zstack.core.db.Q; import org.zstack.core.db.SQL; import org.zstack.core.db.SQLBatch; @@ -32,6 +29,7 @@ import org.zstack.core.db.SimpleQuery.Op; import org.zstack.core.thread.*; import org.zstack.core.timeout.ApiTimeoutManager; +import org.zstack.core.timeout.TimeHelper; import org.zstack.core.upgrade.UpgradeChecker; import org.zstack.core.upgrade.UpgradeGlobalConfig; import org.zstack.core.workflow.FlowChainBuilder; @@ -43,7 +41,10 @@ import org.zstack.header.cluster.ClusterInventory; import org.zstack.header.cluster.ClusterVO; import org.zstack.header.cluster.ReportHostCapacityMessage; -import org.zstack.header.core.*; +import org.zstack.header.core.AsyncLatch; +import org.zstack.header.core.Completion; +import org.zstack.header.core.NoErrorCompletion; +import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.core.progress.TaskProgressRange; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; @@ -53,11 +54,7 @@ import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.host.*; import org.zstack.header.host.MigrateVmOnHypervisorMsg.StorageMigrationPolicy; -import org.zstack.header.image.ImageArchitecture; -import org.zstack.header.image.ImageBootMode; -import org.zstack.header.image.ImageInventory; -import org.zstack.header.image.ImagePlatform; -import org.zstack.header.image.ImageVO; +import org.zstack.header.image.*; import org.zstack.header.message.APIMessage; import org.zstack.header.message.Message; import org.zstack.header.message.MessageReply; @@ -71,6 +68,8 @@ import org.zstack.header.tag.SystemTagInventory; import org.zstack.header.vm.*; import org.zstack.header.vm.devices.DeviceAddress; +import org.zstack.header.vm.devices.VirtualDeviceInfo; +import org.zstack.header.vm.devices.VmInstanceDeviceManager; import org.zstack.header.volume.*; import org.zstack.identity.AccountManager; import org.zstack.kvm.KVMAgentCommands.*; @@ -80,12 +79,12 @@ import org.zstack.network.l3.NetworkGlobalProperty; import org.zstack.resourceconfig.ResourceConfig; import org.zstack.resourceconfig.ResourceConfigFacade; +import org.zstack.resourceconfig.ResourceConfigVO; +import org.zstack.resourceconfig.ResourceConfigVO_; import org.zstack.tag.PatternedSystemTag; import org.zstack.tag.SystemTag; import org.zstack.tag.SystemTagCreator; import org.zstack.tag.TagManager; -import org.zstack.resourceconfig.ResourceConfigVO; -import org.zstack.resourceconfig.ResourceConfigVO_; import org.zstack.utils.*; import org.zstack.utils.data.SizeUnit; import org.zstack.utils.gson.JSONObjectUtil; @@ -4279,8 +4278,8 @@ public void success(StartVmResponse ret) { @Override public void fail(ErrorCode err) { StartVmOnHypervisorReply reply = new StartVmOnHypervisorReply(); - reply.setError(err); - reply.setSuccess(false); + reply.setError(err(HostErrors.FAILED_TO_START_VM_ON_HYPERVISOR, "failed to start vm[uuid: %s] on kvm host[uuid: %s], because %s", + spec.getVmInventory().getUuid(), self.getUuid(), err)); extEmitter.startVmOnKvmFailed(KVMHostInventory.valueOf(getSelf()), spec, err); bus.reply(msg, reply); completion.done(); diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmDestroyingCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmDestroyingCase.groovy index e911baa1588..1a2d55ce57c 100755 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmDestroyingCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmDestroyingCase.groovy @@ -3,6 +3,7 @@ package org.zstack.test.integration.kvm.vm import org.springframework.http.HttpEntity import org.zstack.core.cloudbus.CloudBus import org.zstack.core.db.Q +import org.zstack.core.db.SQL import org.zstack.core.errorcode.ErrorFacade import org.zstack.header.host.CheckVmStateOnHypervisorMsg import org.zstack.header.host.CheckVmStateOnHypervisorReply @@ -21,6 +22,7 @@ import org.zstack.sdk.DestroyVmInstanceAction import org.zstack.sdk.VmInstanceInventory import org.zstack.test.integration.kvm.KvmTest import org.zstack.testlib.EnvSpec +import org.zstack.testlib.HttpError import org.zstack.testlib.SubCase import org.zstack.utils.data.SizeUnit import org.zstack.utils.gson.JSONObjectUtil @@ -165,6 +167,7 @@ class VmDestroyingCase extends SubCase { simulatorEnv() testDestroyingVmWillBeSetToDestroyedIfDestroyingFailButVmSyncMsgReturnStopped() testRecover() + testStartFail() testDestroyingVmWillBeSetToDestroyedIfDestroyingFailButVmSyncMsgReturnStopped() testExpunge() } @@ -232,6 +235,52 @@ class VmDestroyingCase extends SubCase { env.cleanSimulatorAndMessageHandlers() } + void testStartFail() { + stopVmInstance { + uuid = vm.uuid + } + + VmInstanceVO vo = dbFindByUuid(vm.uuid, VmInstanceVO.class) + assert vo.state == VmInstanceState.Stopped + + env.message(CheckVmStateOnHypervisorMsg.class) { CheckVmStateOnHypervisorMsg msg, CloudBus bus -> + def reply = new CheckVmStateOnHypervisorReply() + def list = new HashMap() + list.put(vm.uuid, VmInstanceState.Paused.toString()) + reply.setStates(list) + reply.success = true + bus.reply(msg, reply) + } + + env.afterSimulator(KVMConstant.KVM_START_VM_PATH) { KVMAgentCommands.StartVmResponse rsp, HttpEntity e -> + throw new HttpError(403, "on purpose") + } + + expect(AssertionError.class) { + startVmInstance { + uuid = vm.uuid + } + } + + retryInSecs { + vo = dbFindByUuid(vm.uuid, VmInstanceVO.class) + assert vo.state == VmInstanceState.Paused + } + + env.cleanSimulatorAndMessageHandlers() + + SQL.New(VmInstanceVO).eq(VmInstanceVO_.uuid, vm.uuid).set(VmInstanceVO_.state, VmInstanceState.Stopped).update() + + startVmInstance { + uuid = vm.uuid + } + + retryInSecs { + vo = dbFindByUuid(vm.uuid, VmInstanceVO.class) + assert vo.state == VmInstanceState.Running + } + } + void testExpunge() { assert Q.New(VolumeVO.class).eq(VolumeVO_.uuid, vm.rootVolumeUuid) .select(VolumeVO_.status) From 30d3d1faec5ffb7884159dd7cd9b19ed8cb69516 Mon Sep 17 00:00:00 2001 From: J M Date: Wed, 18 Dec 2024 18:39:52 +0800 Subject: [PATCH 198/737] [storage]: add host id into ext ps host ref add cbd ha checker DBImpact Resolves: ZSTAC-71966 Change-Id: I79626d6c72697a73737573727363766a7a777271 --- conf/db/upgrade/V5.3.20__schema.sql | 17 ++ conf/persistence.xml | 1 + .../ExternalPrimaryStorageHostRefVO.java | 15 +- .../ExternalPrimaryStorageHostRefVO_.java | 12 + .../primary/ExternalPrimaryStorageVO_.java | 1 + .../org/zstack/cbd/kvm/KvmCbdCommands.java | 2 + .../org/zstack/cbd/kvm/KvmCbdNodeServer.java | 22 +- .../storage/zbs/ZbsStorageController.java | 10 +- .../addon/primary/ExternalHostIdGetter.java | 234 ++++++++++++++++++ .../addon/primary/ExternalPrimaryStorage.java | 19 ++ 10 files changed, 325 insertions(+), 8 deletions(-) rename header/src/main/java/org/zstack/header/storage/{ => addon}/primary/ExternalPrimaryStorageHostRefVO.java (63%) create mode 100644 header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageHostRefVO_.java create mode 100644 storage/src/main/java/org/zstack/storage/addon/primary/ExternalHostIdGetter.java diff --git a/conf/db/upgrade/V5.3.20__schema.sql b/conf/db/upgrade/V5.3.20__schema.sql index 59b0fd4bbaf..27bd4953e80 100644 --- a/conf/db/upgrade/V5.3.20__schema.sql +++ b/conf/db/upgrade/V5.3.20__schema.sql @@ -3,3 +3,20 @@ CALL ADD_CONSTRAINT('AutoScalingRuleSchedulerJobTriggerVO', 'fkAutoScalingRuleSc ALTER TABLE `zstack`.`ExternalPrimaryStorageVO` MODIFY COLUMN `config` TEXT DEFAULT NULL; ALTER TABLE `zstack`.`HostNetworkInterfaceLldpRefVO` MODIFY COLUMN `systemName` VARCHAR(255) NOT NULL; + +CREATE TABLE IF NOT EXISTS `zstack`.`ExternalPrimaryStorageHostRefVO` ( + `id` BIGINT UNSIGNED UNIQUE, + `hostId` INT DEFAULT NULL, + `protocol` varchar(128) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8; + +SET @row_number = 0; +INSERT INTO ExternalPrimaryStorageHostRefVO (id, hostId, protocol) +SELECT + p.id, + (@row_number := @row_number + 1) as hostId, + e.defaultProtocol as protocol +FROM PrimaryStorageHostRefVO p LEFT JOIN ExternalPrimaryStorageVO e ON p.primaryStorageUuid = e.uuid +ORDER BY p.id; \ No newline at end of file diff --git a/conf/persistence.xml b/conf/persistence.xml index e7a299c4fd3..3fac3285b8c 100755 --- a/conf/persistence.xml +++ b/conf/persistence.xml @@ -137,6 +137,7 @@ org.zstack.storage.primary.local.LocalStorageHostRefVO org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO org.zstack.header.storage.addon.primary.PrimaryStorageOutputProtocolRefVO + org.zstack.header.storage.addon.primary.ExternalPrimaryStorageHostRefVO org.zstack.storage.ceph.backup.CephBackupStorageVO org.zstack.storage.ceph.backup.CephBackupStorageMonVO org.zstack.storage.ceph.primary.CephPrimaryStorageMonVO diff --git a/header/src/main/java/org/zstack/header/storage/primary/ExternalPrimaryStorageHostRefVO.java b/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageHostRefVO.java similarity index 63% rename from header/src/main/java/org/zstack/header/storage/primary/ExternalPrimaryStorageHostRefVO.java rename to header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageHostRefVO.java index 7bffdb23960..035f89b1ff2 100644 --- a/header/src/main/java/org/zstack/header/storage/primary/ExternalPrimaryStorageHostRefVO.java +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageHostRefVO.java @@ -1,4 +1,6 @@ -package org.zstack.header.storage.primary; +package org.zstack.header.storage.addon.primary; + +import org.zstack.header.storage.primary.PrimaryStorageHostRefVO; import javax.persistence.Column; import javax.persistence.Entity; @@ -12,6 +14,9 @@ public class ExternalPrimaryStorageHostRefVO extends PrimaryStorageHostRefVO { @Column private String protocol; + @Column + private int hostId; + public String getProtocol() { return protocol; } @@ -19,4 +24,12 @@ public String getProtocol() { public void setProtocol(String protocol) { this.protocol = protocol; } + + public int getHostId() { + return hostId; + } + + public void setHostId(int hostId) { + this.hostId = hostId; + } } diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageHostRefVO_.java b/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageHostRefVO_.java new file mode 100644 index 00000000000..0701135df99 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageHostRefVO_.java @@ -0,0 +1,12 @@ +package org.zstack.header.storage.addon.primary; + +import org.zstack.header.storage.primary.PrimaryStorageHostRefVO_; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; + +@StaticMetamodel(ExternalPrimaryStorageHostRefVO.class) +public class ExternalPrimaryStorageHostRefVO_ extends PrimaryStorageHostRefVO_ { + public static volatile SingularAttribute hostId; + public static volatile SingularAttribute protocol; +} diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageVO_.java b/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageVO_.java index 269cb483bb4..52b1946405c 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageVO_.java +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageVO_.java @@ -10,4 +10,5 @@ public class ExternalPrimaryStorageVO_ extends PrimaryStorageVO_ { public static volatile SingularAttribute identity; public static volatile SingularAttribute config; public static volatile SingularAttribute addonInfo; + public static volatile SingularAttribute defaultProtocol; } diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java index 218fefe3095..8505e9b6b85 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java @@ -11,6 +11,8 @@ */ public class KvmCbdCommands { public static final String CBD_SETUP_SELF_FENCER_PATH = "/ha/cbd/setupselffencer"; + public static final String CANCEL_CBD_SELF_FENCER_PATH = "/ha/cbd/cancelselffencer"; + public static final String CBD_CHECK_VMSTATE_PATH = "/cbd/check/vmstate"; public static class AgentRsp { public boolean success = true; diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java index 9c7eb4e7acc..e9921905913 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java @@ -3,14 +3,16 @@ import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.cbd.AddonInfo; -import org.zstack.cbd.CbdConstants; import org.zstack.cbd.MdsInfo; +import org.zstack.cbd.kvm.KvmCbdCommands.AgentRsp; +import org.zstack.cbd.kvm.KvmCbdCommands.KvmSetupSelfFencerCmd; +import org.zstack.cbd.kvm.KvmCbdCommands.KvmUpdateClientConfCmd; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; -import org.zstack.externalStorage.primary.ExternalStorageConstant; import org.zstack.header.Component; import org.zstack.header.core.Completion; import org.zstack.header.core.ReturnValueCompletion; @@ -23,15 +25,14 @@ import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO; import org.zstack.header.storage.addon.primary.HeartbeatVolumeTO; import org.zstack.header.storage.addon.primary.PrimaryStorageNodeSvc; +import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageHostRefVO; +import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageHostRefVO_; import org.zstack.header.volume.VolumeProtocol; import org.zstack.kvm.KVMAgentCommands; import org.zstack.kvm.KVMHostAsyncHttpCallMsg; import org.zstack.kvm.KVMHostAsyncHttpCallReply; import org.zstack.kvm.KvmSetupSelfFencerExtensionPoint; import org.zstack.storage.addon.primary.ExternalPrimaryStorageFactory; -import org.zstack.cbd.kvm.KvmCbdCommands.AgentRsp; -import org.zstack.cbd.kvm.KvmCbdCommands.KvmSetupSelfFencerCmd; -import org.zstack.cbd.kvm.KvmCbdCommands.KvmUpdateClientConfCmd; import org.zstack.utils.DebugUtils; import org.zstack.utils.Utils; import org.zstack.utils.gson.JSONObjectUtil; @@ -127,6 +128,16 @@ public void fail(ErrorCode errorCode) { @Override public void run(FlowTrigger trigger, Map data) { + Integer hostId = Q.New(ExternalPrimaryStorageHostRefVO.class).select(ExternalPrimaryStorageHostRefVO_.hostId) + .eq(ExternalPrimaryStorageHostRefVO_.hostUuid, param.getHostUuid()) + .eq(ExternalPrimaryStorageHostRefVO_.primaryStorageUuid, param.getPrimaryStorage().getUuid()) + .findValue(); + + if (hostId == null) { + trigger.fail(operr("not found hostId for hostUuid[%s] and primaryStorageUuid[%s]", param.getHostUuid(), param.getPrimaryStorage().getUuid())); + return; + } + KvmSetupSelfFencerCmd cmd = new KvmSetupSelfFencerCmd(); cmd.interval = param.getInterval(); cmd.maxAttempts = param.getMaxAttempts(); @@ -135,6 +146,7 @@ public void run(FlowTrigger trigger, Map data) { cmd.storageCheckerTimeout = param.getStorageCheckerTimeout(); cmd.heartbeatRequiredSpace = heartbeatVol.getHeartbeatRequiredSpace(); cmd.hostUuid = param.getHostUuid(); + cmd.hostId = hostId; cmd.strategy = param.getStrategy(); cmd.uuid = param.getPrimaryStorage().getUuid(); cmd.fencers = param.getFencers(); diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 9939d4ae44a..3086c0c79b2 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -193,7 +193,8 @@ public synchronized void activateHeartbeatVolume(HostInventory h, ReturnValueCom public void success(CreateVolumeRsp returnValue) { CbdHeartbeatVolumeTO to = new CbdHeartbeatVolumeTO(); to.setInstallPath(returnValue.installPath); - to.setHeartbeatRequiredSpace(SizeUnit.GIGABYTE.toByte(1)); + to.setHeartbeatRequiredSpace(SizeUnit.MEGABYTE.toByte(1)); + to.setCoveringPaths(Collections.singletonList(config.getLogicalPoolName())); comp.success(to); } @@ -211,7 +212,12 @@ public void deactivateHeartbeatVolume(HostInventory h, Completion comp) { @Override public HeartbeatVolumeTO getHeartbeatVolumeActiveInfo(HostInventory h) { - return null; + // FIXME: hard code for install path + CbdHeartbeatVolumeTO to = new CbdHeartbeatVolumeTO(); + to.setInstallPath(String.format("cbd:%s_physical/%s/%s", config.getLogicalPoolName(), config.getLogicalPoolName(), ZbsHelper.zbsHeartbeatVolumeName)); + to.setHeartbeatRequiredSpace(SizeUnit.MEGABYTE.toByte(1)); + to.setCoveringPaths(Collections.singletonList(config.getLogicalPoolName())); + return to; } @Override diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalHostIdGetter.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalHostIdGetter.java new file mode 100644 index 00000000000..278675e3502 --- /dev/null +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalHostIdGetter.java @@ -0,0 +1,234 @@ +package org.zstack.storage.addon.primary; + +import org.hibernate.exception.ConstraintViolationException; +import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Configurable; +import org.springframework.transaction.annotation.Transactional; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; +import org.zstack.core.thread.SyncTask; +import org.zstack.core.thread.ThreadFacade; +import org.zstack.header.exception.CloudRuntimeException; +import org.zstack.header.host.HostVO; +import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO; +import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageHostRefVO; +import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageHostRefVO_; +import org.zstack.header.storage.primary.PrimaryStorageHostStatus; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import javax.persistence.LockModeType; +import java.sql.Timestamp; +import java.util.BitSet; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) +public class ExternalHostIdGetter { + private static final CLogger logger = Utils.getLogger(ExternalHostIdGetter.class); + private static final Random random = new Random(); + + @Autowired + protected DatabaseFacade dbf; + @Autowired + private ThreadFacade thdf; + + private final int maxHostId; + + public ExternalHostIdGetter(int maxHostId) { + this.maxHostId = maxHostId; + } + + public ExternalPrimaryStorageHostRefVO getOrAllocateHostIdRef(String hostUuid, String psUuid) { + if (!dbf.isExist(psUuid, ExternalPrimaryStorageVO.class)) { + throw new CloudRuntimeException(String.format( + "can not find external primary storage[uuid: %s]", psUuid)); + } + + if (!dbf.isExist(hostUuid, HostVO.class)) { + throw new CloudRuntimeException(String.format( + "can not find host[uuid: %s] for external primary storage[uuid: %s]", hostUuid, psUuid)); + } + + ExternalPrimaryStorageHostRefVO refVO = findRef(hostUuid, psUuid); + if (refVO != null) { + return refVO; + } + + if (allocateAndSetHostId(hostUuid, psUuid) == null) { + throw new CloudRuntimeException(String.format("cannot allocate host id for primary storage[uuid:%s]", psUuid)); + } + + return Q.New(ExternalPrimaryStorageHostRefVO.class) + .eq(ExternalPrimaryStorageHostRefVO_.hostUuid, hostUuid) + .eq(ExternalPrimaryStorageHostRefVO_.primaryStorageUuid, psUuid) + .find(); + } + + private ExternalPrimaryStorageHostRefVO findRef(String hostUuid, String psUuid) { + return Q.New(ExternalPrimaryStorageHostRefVO.class) + .eq(ExternalPrimaryStorageHostRefVO_.hostUuid, hostUuid) + .eq(ExternalPrimaryStorageHostRefVO_.primaryStorageUuid, psUuid) + .find(); + } + + private Integer allocateAndSetHostId(String hostUuid, String psUuid) { + Future f = thdf.syncSubmit(new SyncTask() { + @Override + public String getSyncSignature() { + return "allocate-and-set-host-id-for-" + psUuid; + } + + @Override + public int getSyncLevel() { + return 0; + } + + @Override + public String getName() { + return String.format("allocate-and-set-host-id-for-host-%s-ps-%s", hostUuid, psUuid); + } + + @Override + public Integer call() throws Exception { + return doAllocateAndSetHostId(hostUuid, psUuid); + } + }); + + try { + return f.get(1, TimeUnit.MINUTES); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + throw new RuntimeException(e); + } + } + + @Transactional + protected Integer doAllocateAndSetHostId(String hostUuid, String psUuid) { + dbf.getEntityManager().find(ExternalPrimaryStorageVO.class, psUuid, LockModeType.PESSIMISTIC_WRITE); + + ExternalPrimaryStorageHostRefVO vo = findRef(hostUuid, psUuid); + if (vo != null && vo.getHostId() > 0) { + return vo.getHostId(); + } + + int hostId = allocateHostId(psUuid); + + try { + if (vo == null) { + vo = new ExternalPrimaryStorageHostRefVO(); + vo.setHostId(hostId); + vo.setCreateDate(new Timestamp(System.currentTimeMillis())); + vo.setHostUuid(hostUuid); + vo.setPrimaryStorageUuid(psUuid); + vo.setStatus(PrimaryStorageHostStatus.Disconnected); + dbf.getEntityManager().persist(vo); + logger.debug(String.format( + "new sharedblock group primary storage[%s] host[%s] ref created, allocated host id[%s]", psUuid, hostUuid, vo.getHostId())); + return hostId; + } else if (vo.getHostId() != hostId) { + boolean exists = Q.New(ExternalPrimaryStorageHostRefVO.class) + .eq(ExternalPrimaryStorageHostRefVO_.hostId, hostId) + .eq(ExternalPrimaryStorageHostRefVO_.primaryStorageUuid, psUuid) + .isExists(); + if (!exists) { + vo.setHostId(hostId); + dbf.getEntityManager().merge(vo); + return hostId; + } else { + logger.warn(String.format("found abnormal duplicate entry for ExternalPrimaryStorageHostRefVO[hostUuid: %s, hostId: %s]", hostUuid, hostId)); + return null; + } + } + } catch (ConstraintViolationException e) { + logger.error(String.format("found duplicate entry for hostUuid: %s, hostId: %s", + hostUuid, hostId)); + return null; + } + return null; + } + + private int allocateHostId(String psUuid) { + int total = this.maxHostId; + Integer s = 1; + Integer e = total; + Integer ret = steppingAllocate(s, e, total, psUuid); + if (ret != null) { + return ret; + } + + ret = steppingAllocate(s, e, total, psUuid); + if (ret != null) { + return ret; + } + + throw new CloudRuntimeException(String.format("no available host id for external primary storage[uuid:%s]", psUuid)); + } + + private Integer steppingAllocate(Integer s, Integer e, int total, String psUuid) { + int step = 100; + int failureCount = 0; + int failureCheckPoint = 10; + + while (s < e) { + if (failureCheckPoint == failureCount++) { + long count = Q.New(ExternalPrimaryStorageHostRefVO.class) + .eq(ExternalPrimaryStorageHostRefVO_.primaryStorageUuid, psUuid) + .gte(ExternalPrimaryStorageHostRefVO_.hostId, s) + .lte(ExternalPrimaryStorageHostRefVO_.hostId, e) + .count(); + if (count == total) { + logger.debug(String.format("host id range[s: %d, e: %d] has no vni available, try next one", s, e)); + return null; + } else { + failureCount = 0; + } + } + + int te = s + step; + te = te > e ? e : te; + List used = Q.New(ExternalPrimaryStorageHostRefVO.class).select(ExternalPrimaryStorageHostRefVO_.hostId) + .eq(ExternalPrimaryStorageHostRefVO_.primaryStorageUuid, psUuid) + .gte(ExternalPrimaryStorageHostRefVO_.hostId, s) + .lte(ExternalPrimaryStorageHostRefVO_.hostId, te) + .listValues(); + + if (te - s + 1 == used.size()) { + s += step; + continue; + } + + Collections.sort(used); + + return randomAllocateHostId(s, te, used); + } + + return null; + } + + private static Integer randomAllocateHostId(Integer start, Integer end, List allocated) { + int total = (end - start + 1); + if (total == allocated.size()) { + return null; + } + + BitSet full = new BitSet(total); + for (Integer alloc : allocated) { + full.set(alloc - start); + } + + int next = random.nextInt(total); + int a = full.nextClearBit(next); + + if (a >= total) { + a = full.nextClearBit(0); + } + + return a + start; + } +} diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index aecdb55b08b..520d556866d 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -137,6 +137,8 @@ protected void handleLocalMessage(Message msg) { handle((SetTrashExpirationTimeMsg) msg); } else if (msg instanceof GetAccessPathMsg) { handle((GetAccessPathMsg) msg); + } else if (msg instanceof UpdatePrimaryStorageHostStatusMsg) { + handle((UpdatePrimaryStorageHostStatusMsg) msg); } else { super.handleLocalMessage(msg); } @@ -193,6 +195,23 @@ protected void handle(APICleanUpImageCacheOnPrimaryStorageMsg msg) { bus.publish(evt); } + @Override + protected void handle(UpdatePrimaryStorageHostStatusMsg msg) { + ExternalPrimaryStorageHostRefVO ref = Q.New(ExternalPrimaryStorageHostRefVO.class) + .eq(ExternalPrimaryStorageHostRefVO_.hostUuid, msg.getHostUuid()) + .eq(ExternalPrimaryStorageHostRefVO_.primaryStorageUuid, msg.getPrimaryStorageUuid()) + .find(); + + if (ref == null || ref.getHostId() == 0) { + // FIXME: different primary storage may have different max host id + ref = new ExternalHostIdGetter(999).getOrAllocateHostIdRef(msg.getHostUuid(), msg.getPrimaryStorageUuid()); + } + + updatePrimaryStorageHostStatus(msg.getPrimaryStorageUuid(), msg.getHostUuid(), msg.getStatus(), msg.getReason()); + UpdatePrimaryStorageHostStatusReply reply = new UpdatePrimaryStorageHostStatusReply(); + bus.reply(msg, reply); + } + @Override protected void handle(InstantiateVolumeOnPrimaryStorageMsg msg) { VolumeInventory volume = msg.getVolume(); From 097c772841cc6e1567c7712a603c40989210e09e Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Mon, 30 Dec 2024 16:26:59 +0800 Subject: [PATCH 199/737] [xinfini]: support expand volume 1. support live expand volume 2. add creator on query param Resolves: ZSTAC-71515 Change-Id: I7269746d75747a717a726d687374646a77686b73 --- .../org/zstack/xinfini/XInfiniApiHelper.java | 5 ++-- .../xinfini/XInfiniStorageController.java | 5 ---- .../org/zstack/xinfini/sdk/XInfiniClient.java | 8 ++++++ ...eRequest.java => UpdateVolumeRequest.java} | 26 +++++++++++++++++-- ...esponse.java => UpdateVolumeResponse.java} | 2 +- 5 files changed, 36 insertions(+), 10 deletions(-) rename plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/{ExpandVolumeRequest.java => UpdateVolumeRequest.java} (68%) rename plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/{ExpandVolumeResponse.java => UpdateVolumeResponse.java} (94%) diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java index db99097d32a..2ec3ac41e0b 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java @@ -257,10 +257,11 @@ public VolumeModule cloneVolume(int snapId, String name, String desc, boolean fl } public VolumeModule expandVolume(int volId, long size) { - ExpandVolumeRequest req = new ExpandVolumeRequest(); + UpdateVolumeRequest req = new UpdateVolumeRequest(); + req.setCreator(XInfiniConstants.DEFAULT_CREATOR); req.setId(volId); req.setSizeMb(size); - callErrorOut(req, ExpandVolumeResponse.class); + callErrorOut(req, UpdateVolumeResponse.class); GetVolumeRequest gReq = new GetVolumeRequest(); gReq.setId(volId); return retryUtilStateActive(gReq, GetVolumeResponse.class, diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index 522eeff22e0..32ddac899eb 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -771,11 +771,6 @@ public void batchStats(Collection installPath, ReturnValueCompletion comp) { int id = getVolIdFromPath(installPath); - List bdcBdevs = apiHelper.queryBdcBdevByVolumeId(id); - if (!bdcBdevs.isEmpty()) { - comp.fail(operr("volume has related bdevs, not support live expand yet")); - return; - } VolumeModule vol = apiHelper.expandVolume(id, convertBytesToMegaBytes(size)); VolumeStats stats = new VolumeStats(); diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java index 3fc72aaa776..fe58f4234f1 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java @@ -91,6 +91,7 @@ class Api { final String taskIdForLog = Platform.getUuid(); String reqBody; // for log + final String CREATOR_PARAM = "creator"; Api(XInfiniRequest action) { this.action = action; @@ -280,6 +281,13 @@ private void fillNonQueryApiRequestBuilder(Request.Builder reqBuilder, XInfiniCo } else if (restInfo.method().equals(HttpMethod.DELETE) && !restInfo.hasBody()) { params.forEach((k, v) -> builder.addQueryParameter(k, v.toString())); reqBuilder.url(builder.build()).delete(); + } else if (restInfo.method().equals(HttpMethod.PATCH)) { + if (params.containsKey(CREATOR_PARAM)) { + builder.addQueryParameter(CREATOR_PARAM, params.get(CREATOR_PARAM).toString()); + params.remove(CREATOR_PARAM); + } + reqBody = gson.toJson(new WrappedRequest(params)); + reqBuilder.url(builder.build()).method(restInfo.method().toString(), RequestBody.create(XInfiniConstants.JSON, reqBody)); } else { reqBody = gson.toJson(new WrappedRequest(params)); reqBuilder.url(builder.build()).method(restInfo.method().toString(), RequestBody.create(XInfiniConstants.JSON, reqBody)); diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/ExpandVolumeRequest.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/UpdateVolumeRequest.java similarity index 68% rename from plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/ExpandVolumeRequest.java rename to plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/UpdateVolumeRequest.java index 2d1274d7ff0..ef10b78186a 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/ExpandVolumeRequest.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/UpdateVolumeRequest.java @@ -19,13 +19,35 @@ responseClass = GetVolumeResponse.class, category = XInfiniApiCategory.AFA ) -public class ExpandVolumeRequest extends XInfiniRequest { +public class UpdateVolumeRequest extends XInfiniRequest { + @Param(required = false) + private String creator; + @Param private int id; - @Param + @Param(required = false) private long sizeMb; + @Param(required = false) + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCreator() { + return creator; + } + + public void setCreator(String creator) { + this.creator = creator; + } + public long getSizeMb() { return sizeMb; } diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/ExpandVolumeResponse.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/UpdateVolumeResponse.java similarity index 94% rename from plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/ExpandVolumeResponse.java rename to plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/UpdateVolumeResponse.java index a6ba8853adc..3f57e56aee0 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/ExpandVolumeResponse.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/UpdateVolumeResponse.java @@ -7,7 +7,7 @@ * @ Author : yh.w * @ Date : Created in 11:51 2024/5/28 */ -public class ExpandVolumeResponse extends XInfiniResponse { +public class UpdateVolumeResponse extends XInfiniResponse { private BaseResource.Metadata metadata; private VolumeModule.VolumeSpec spec; private VolumeModule.VolumeStatus status; From 61446d621231109e55018287de4eb66987d9531c Mon Sep 17 00:00:00 2001 From: lianghy Date: Thu, 28 Nov 2024 13:26:07 +0800 Subject: [PATCH 200/737] [crypto]: supprot KoAl secretResourcePool update sdk Resolves: ZSTAC-71449 Change-Id: I6c61714492686c6c777273686673666c7a6b7169 --- conf/db/upgrade/V5.3.6__schema.sql | 8 ++ sdk/src/main/java/SourceClassMap.java | 2 + .../CreateKoAlSecretResourcePoolAction.java | 131 ++++++++++++++++++ .../sdk/KoAlSecretResourcePoolInventory.java | 31 +++++ .../UpdateKoAlSecretResourcePoolAction.java | 122 ++++++++++++++++ .../java/org/zstack/testlib/ApiHelper.groovy | 54 ++++++++ 6 files changed, 348 insertions(+) create mode 100644 conf/db/upgrade/V5.3.6__schema.sql create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateKoAlSecretResourcePoolAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/KoAlSecretResourcePoolInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateKoAlSecretResourcePoolAction.java diff --git a/conf/db/upgrade/V5.3.6__schema.sql b/conf/db/upgrade/V5.3.6__schema.sql new file mode 100644 index 00000000000..fbfc5c0d634 --- /dev/null +++ b/conf/db/upgrade/V5.3.6__schema.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS `zstack`.`KoAlSecretResourcePoolVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `managementIp` varchar(32) NOT NULL, + `port` int unsigned NOT NULL, + `secretKey` varchar(255) NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT fkKoAlSecretResourcePoolVOSecretResourcePoolVO FOREIGN KEY (uuid) REFERENCES SecretResourcePoolVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 316385353fe..563e7aa27ad 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -129,6 +129,7 @@ public class SourceClassMap { put("org.zstack.crypto.securitymachine.thirdparty.infoSec.InfoSecSecretResourcePoolInventory", "org.zstack.sdk.InfoSecSecretResourcePoolInventory"); put("org.zstack.crypto.securitymachine.thirdparty.infoSec.InfoSecSecurityMachineInventory", "org.zstack.sdk.InfoSecSecurityMachineInventory"); put("org.zstack.crypto.securitymachine.thirdparty.jit.JitSecurityMachineInventory", "org.zstack.sdk.JitSecurityMachineInventory"); + put("org.zstack.crypto.securitymachine.thirdparty.koal.KoAlSecretResourcePoolInventory", "org.zstack.sdk.KoAlSecretResourcePoolInventory"); put("org.zstack.crypto.securitymachine.thirdparty.sansec.SanSecSecretResourcePoolInventory", "org.zstack.sdk.SanSecSecretResourcePoolInventory"); put("org.zstack.crypto.securitymachine.thirdparty.sansec.SanSecSecurityMachineInventory", "org.zstack.sdk.SanSecSecurityMachineInventory"); put("org.zstack.directory.DirectoryInventory", "org.zstack.sdk.DirectoryInventory"); @@ -1035,6 +1036,7 @@ public class SourceClassMap { put("org.zstack.sdk.JsonLabelInventory", "org.zstack.core.jsonlabel.JsonLabelInventory"); put("org.zstack.sdk.KVMHostInventory", "org.zstack.kvm.KVMHostInventory"); put("org.zstack.sdk.KVMIsoTO", "org.zstack.kvm.KVMIsoTO"); + put("org.zstack.sdk.KoAlSecretResourcePoolInventory", "org.zstack.crypto.securitymachine.thirdparty.koal.KoAlSecretResourcePoolInventory"); put("org.zstack.sdk.KvmHostHypervisorMetadataInventory", "org.zstack.kvm.hypervisor.datatype.KvmHostHypervisorMetadataInventory"); put("org.zstack.sdk.KvmHypervisorInfoInventory", "org.zstack.kvm.hypervisor.datatype.KvmHypervisorInfoInventory"); put("org.zstack.sdk.L2NetworkData", "org.zstack.header.network.l2.L2NetworkData"); diff --git a/sdk/src/main/java/org/zstack/sdk/CreateKoAlSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateKoAlSecretResourcePoolAction.java new file mode 100644 index 00000000000..2c2b0daf3c6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateKoAlSecretResourcePoolAction.java @@ -0,0 +1,131 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateKoAlSecretResourcePoolAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.CreateSecretResourcePoolResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false) + public java.lang.String managementIp; + + @Param(required = false) + public java.lang.Integer port; + + @Param(required = false) + public java.lang.String secretKey; + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String model; + + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) + public java.lang.Integer heartbeatInterval; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.CreateSecretResourcePoolResult value = res.getResult(org.zstack.sdk.CreateSecretResourcePoolResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateSecretResourcePoolResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/secret-resource-pool/koal"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/KoAlSecretResourcePoolInventory.java b/sdk/src/main/java/org/zstack/sdk/KoAlSecretResourcePoolInventory.java new file mode 100644 index 00000000000..41385108a1d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/KoAlSecretResourcePoolInventory.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + + + +public class KoAlSecretResourcePoolInventory extends org.zstack.sdk.SecretResourcePoolInventory { + + public java.lang.String managementIp; + public void setManagementIp(java.lang.String managementIp) { + this.managementIp = managementIp; + } + public java.lang.String getManagementIp() { + return this.managementIp; + } + + public java.lang.Integer port; + public void setPort(java.lang.Integer port) { + this.port = port; + } + public java.lang.Integer getPort() { + return this.port; + } + + public java.lang.String secretKey; + public void setSecretKey(java.lang.String secretKey) { + this.secretKey = secretKey; + } + public java.lang.String getSecretKey() { + return this.secretKey; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateKoAlSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateKoAlSecretResourcePoolAction.java new file mode 100644 index 00000000000..e7f36e3ea42 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateKoAlSecretResourcePoolAction.java @@ -0,0 +1,122 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateKoAlSecretResourcePoolAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UpdateSecretResourcePoolResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String managementIp; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer port; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String secretKey; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String model; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) + public java.lang.Integer heartbeatInterval; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UpdateSecretResourcePoolResult value = res.getResult(org.zstack.sdk.UpdateSecretResourcePoolResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateSecretResourcePoolResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/secret-resource-pools/koal/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateKoAlSecretResourcePool"; + return info; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 0c4987e67f4..2bf5820aae8 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -9602,6 +9602,33 @@ abstract class ApiHelper { } + def createKoAlSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateKoAlSecretResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.CreateKoAlSecretResourcePoolAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def createL2HardwareVxlanNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateL2HardwareVxlanNetworkAction.class) Closure c) { def a = new org.zstack.sdk.CreateL2HardwareVxlanNetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -42662,6 +42689,33 @@ abstract class ApiHelper { } + def updateKoAlSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateKoAlSecretResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateKoAlSecretResourcePoolAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def updateL2Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateL2NetworkAction.class) Closure c) { def a = new org.zstack.sdk.UpdateL2NetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 78fe7247fbcd85fa97fe7ada5e62154478b6d805 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 15 Nov 2024 12:55:13 +0900 Subject: [PATCH 201/737] [conf]: Introduce LLM performance evaluation task - Update deploy model evaluation task's related sdks - Change schema to make evaluated model service cloud be empty to support customized url and model performance testing DBImpact Resolves: ZSTAC-70817 Change-Id: I7077766e627169726e787a677376697a6778656c --- conf/db/upgrade/V5.3.6__schema.sql | 4 + .../zstack/identity/AccountManagerImpl.java | 2 +- .../sdk/DeployModelEvalServiceAction.java | 34 ++++- .../sdk/ModelEvaluationTaskInventory.java | 120 ++++++++++++++++++ 4 files changed, 157 insertions(+), 3 deletions(-) diff --git a/conf/db/upgrade/V5.3.6__schema.sql b/conf/db/upgrade/V5.3.6__schema.sql index fbfc5c0d634..3f101522953 100644 --- a/conf/db/upgrade/V5.3.6__schema.sql +++ b/conf/db/upgrade/V5.3.6__schema.sql @@ -6,3 +6,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`KoAlSecretResourcePoolVO` ( PRIMARY KEY (`uuid`), CONSTRAINT fkKoAlSecretResourcePoolVOSecretResourcePoolVO FOREIGN KEY (uuid) REFERENCES SecretResourcePoolVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE `zstack`.`ModelEvaluationTaskVO` ADD taskRequestInJson VARCHAR(8192) DEFAULT NULL; +ALTER TABLE `zstack`.`ModelEvaluationTaskVO` ADD type VARCHAR(32) DEFAULT NULL; +ALTER TABLE `zstack`.`ModelEvaluationTaskVO` MODIFY `evaluatedServiceGroupUuid` varchar(32) DEFAULT NULL; diff --git a/identity/src/main/java/org/zstack/identity/AccountManagerImpl.java b/identity/src/main/java/org/zstack/identity/AccountManagerImpl.java index 881acd76834..7d111d33185 100755 --- a/identity/src/main/java/org/zstack/identity/AccountManagerImpl.java +++ b/identity/src/main/java/org/zstack/identity/AccountManagerImpl.java @@ -815,7 +815,7 @@ private void collectDefaultQuota() { } } - repairAccountQuota(); + // repairAccountQuota(); } private void collectQuotaMessageCheckers(Quota quota) { diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java index 6be9d50e5eb..d273db78f53 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java @@ -25,6 +25,9 @@ public Result throwExceptionIfError() { } } + @Param(required = true, validValues = {"Performance","Capability"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String taskType; + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer limits; @@ -37,14 +40,41 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Float topP; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer maxNewTokens; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Float repetitionPenalty; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer maxLength; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.Integer maxNewTokens; + public java.lang.String prompt; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.Float repetitionPenalty; + public java.lang.String model; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String url; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer parallel; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer logEveryQuery; + + @Param(required = false, validValues = {"openai","dashscope"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String api; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map requestHeaders; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer connectTimeout; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer readTimeout; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java index c4927323f96..3d6f19ebeaf 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java @@ -100,4 +100,124 @@ public java.sql.Timestamp getLastOpDate() { return this.lastOpDate; } + public java.lang.Integer maxNewTokens; + public void setMaxNewTokens(java.lang.Integer maxNewTokens) { + this.maxNewTokens = maxNewTokens; + } + public java.lang.Integer getMaxNewTokens() { + return this.maxNewTokens; + } + + public java.lang.Integer topK; + public void setTopK(java.lang.Integer topK) { + this.topK = topK; + } + public java.lang.Integer getTopK() { + return this.topK; + } + + public java.lang.Float temperature; + public void setTemperature(java.lang.Float temperature) { + this.temperature = temperature; + } + public java.lang.Float getTemperature() { + return this.temperature; + } + + public java.lang.Float topP; + public void setTopP(java.lang.Float topP) { + this.topP = topP; + } + public java.lang.Float getTopP() { + return this.topP; + } + + public java.lang.String prompt; + public void setPrompt(java.lang.String prompt) { + this.prompt = prompt; + } + public java.lang.String getPrompt() { + return this.prompt; + } + + public java.lang.Float repetitionPenalty; + public void setRepetitionPenalty(java.lang.Float repetitionPenalty) { + this.repetitionPenalty = repetitionPenalty; + } + public java.lang.Float getRepetitionPenalty() { + return this.repetitionPenalty; + } + + public java.lang.Integer maxLength; + public void setMaxLength(java.lang.Integer maxLength) { + this.maxLength = maxLength; + } + public java.lang.Integer getMaxLength() { + return this.maxLength; + } + + public java.lang.String model; + public void setModel(java.lang.String model) { + this.model = model; + } + public java.lang.String getModel() { + return this.model; + } + + public java.lang.String url; + public void setUrl(java.lang.String url) { + this.url = url; + } + public java.lang.String getUrl() { + return this.url; + } + + public java.lang.Integer parallel; + public void setParallel(java.lang.Integer parallel) { + this.parallel = parallel; + } + public java.lang.Integer getParallel() { + return this.parallel; + } + + public java.lang.Integer logEveryQuery; + public void setLogEveryQuery(java.lang.Integer logEveryQuery) { + this.logEveryQuery = logEveryQuery; + } + public java.lang.Integer getLogEveryQuery() { + return this.logEveryQuery; + } + + public java.lang.String api; + public void setApi(java.lang.String api) { + this.api = api; + } + public java.lang.String getApi() { + return this.api; + } + + public java.util.Map requestHeaders; + public void setRequestHeaders(java.util.Map requestHeaders) { + this.requestHeaders = requestHeaders; + } + public java.util.Map getRequestHeaders() { + return this.requestHeaders; + } + + public java.lang.Integer connectTimeout; + public void setConnectTimeout(java.lang.Integer connectTimeout) { + this.connectTimeout = connectTimeout; + } + public java.lang.Integer getConnectTimeout() { + return this.connectTimeout; + } + + public java.lang.Integer readTimeout; + public void setReadTimeout(java.lang.Integer readTimeout) { + this.readTimeout = readTimeout; + } + public java.lang.Integer getReadTimeout() { + return this.readTimeout; + } + } From 63dc7a586b3e4d01b0fd32362696bc0263cc7ad8 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Wed, 13 Nov 2024 06:19:03 +0000 Subject: [PATCH 202/737] [sdk]: Update sdk Resolves: ZSTAC-71032 Change-Id: I7471666a686f6c647078747367796c7367646f6c --- .../org/zstack/sdk/DeployModelEvalServiceAction.java | 10 +++++----- .../org/zstack/sdk/ModelEvaluationTaskInventory.java | 8 ++++++++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java index d273db78f53..e38b4a7e235 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java @@ -46,7 +46,7 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Float repetitionPenalty; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {128L,128000L}, noTrim = false) public java.lang.Integer maxLength; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) @@ -58,10 +58,10 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String url; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {0L,1024L}, noTrim = false) public java.lang.Integer parallel; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {5L,300L}, noTrim = false) public java.lang.Integer logEveryQuery; @Param(required = false, validValues = {"openai","dashscope"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) @@ -70,10 +70,10 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.Map requestHeaders; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {5L,120L}, noTrim = false) public java.lang.Integer connectTimeout; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {5L,120L}, noTrim = false) public java.lang.Integer readTimeout; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java index 3d6f19ebeaf..7695a4c3ace 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java @@ -20,6 +20,14 @@ public java.lang.String getName() { return this.name; } + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + public java.lang.String description; public void setDescription(java.lang.String description) { this.description = description; From 95ca91651de802069229f64458ddca16092856c3 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 18 Nov 2024 15:03:38 +0900 Subject: [PATCH 203/737] [message]: Introduce flow range check to @APIParam Resolves: ZSTAC-70817 Change-Id: I67736c666f726f6b64656f7962686965696f6b61 --- conf/db/upgrade/V5.3.6__schema.sql | 1 + .../org/zstack/header/message/APIParam.java | 2 ++ .../message/ApiMessageParamValidator.java | 17 +++++++++++++++++ 3 files changed, 20 insertions(+) diff --git a/conf/db/upgrade/V5.3.6__schema.sql b/conf/db/upgrade/V5.3.6__schema.sql index 3f101522953..aebb0eb958e 100644 --- a/conf/db/upgrade/V5.3.6__schema.sql +++ b/conf/db/upgrade/V5.3.6__schema.sql @@ -10,3 +10,4 @@ CREATE TABLE IF NOT EXISTS `zstack`.`KoAlSecretResourcePoolVO` ( ALTER TABLE `zstack`.`ModelEvaluationTaskVO` ADD taskRequestInJson VARCHAR(8192) DEFAULT NULL; ALTER TABLE `zstack`.`ModelEvaluationTaskVO` ADD type VARCHAR(32) DEFAULT NULL; ALTER TABLE `zstack`.`ModelEvaluationTaskVO` MODIFY `evaluatedServiceGroupUuid` varchar(32) DEFAULT NULL; +ALTER TABLE `zstack`.`ModelEvaluationTaskVO` MODIFY datasetUuid VARCHAR(32) DEFAULT NULL; diff --git a/header/src/main/java/org/zstack/header/message/APIParam.java b/header/src/main/java/org/zstack/header/message/APIParam.java index 322a9b382b0..be4c81fd275 100755 --- a/header/src/main/java/org/zstack/header/message/APIParam.java +++ b/header/src/main/java/org/zstack/header/message/APIParam.java @@ -28,6 +28,8 @@ long[] numberRange() default {}; + double[] floatNumberRange() default {}; + String[] numberRangeUnit() default {}; boolean checkAccount() default false; diff --git a/header/src/main/java/org/zstack/header/message/ApiMessageParamValidator.java b/header/src/main/java/org/zstack/header/message/ApiMessageParamValidator.java index ec0e2c4a4f6..e8ee995a2f1 100644 --- a/header/src/main/java/org/zstack/header/message/ApiMessageParamValidator.java +++ b/header/src/main/java/org/zstack/header/message/ApiMessageParamValidator.java @@ -106,6 +106,23 @@ private void validateNonNullValue(APIMessage msg, Field f, Object value, APIPara } } } + + if (at.floatNumberRange().length > 0 && TypeUtils.isTypeOf(value, Float.TYPE, Float.class, Double.TYPE, Double.class)) { + DebugUtils.Assert(at.floatNumberRange().length == 2, String.format("invalid field[%s], APIParam.floatNumberRange must have and only have 2 items", f.getName())); + double low = at.floatNumberRange()[0]; + double high = at.floatNumberRange()[1]; + double val = ((Number) value).doubleValue(); + if (val < low || val > high) { + if (at.numberRangeUnit().length > 0) { + DebugUtils.Assert(at.numberRangeUnit().length == 2, String.format("invalid field[%s], APIParam.floatNumberRangeUnit must have and only have 2 items", f.getName())); + String lowUnit = at.numberRangeUnit()[0]; + String highUnit = at.numberRangeUnit()[1]; + throw new InvalidApiMessageException("field[%s] must be in range of [%s %s, %s %s]", f.getName(), low, lowUnit, high, highUnit); + } else { + throw new InvalidApiMessageException("field[%s] must be in range of [%s, %s]", f.getName(), low, high); + } + } + } } private void validateValue(String[] validValues, String value, String fieldName, String msgName) { From 38f55b09685959a82199a5a1baa47d3a40367115 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 26 Nov 2024 14:11:18 +0800 Subject: [PATCH 204/737] [message]: Introduce batch update datasets api - Add generic type to batch request result - Update sdk Resolves: ZSTAC-70828 Change-Id: I776b6b6d61797576776a696d716f70776674696e --- .../header/message/APIBatchRequest.java | 11 +- sdk/src/main/java/SourceClassMap.java | 2 - .../org/zstack/sdk/UpdateDatasetAction.java | 6 + .../org/zstack/sdk/UpdateDatasetsAction.java | 101 ++++ .../org/zstack/sdk/UpdateDatasetsResult.java | 14 + .../java/org/zstack/testlib/ApiHelper.groovy | 432 ++++++++++-------- 6 files changed, 375 insertions(+), 191 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateDatasetsAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateDatasetsResult.java diff --git a/header/src/main/java/org/zstack/header/message/APIBatchRequest.java b/header/src/main/java/org/zstack/header/message/APIBatchRequest.java index 41125608868..a8b1be45c1d 100644 --- a/header/src/main/java/org/zstack/header/message/APIBatchRequest.java +++ b/header/src/main/java/org/zstack/header/message/APIBatchRequest.java @@ -3,7 +3,8 @@ import org.zstack.header.errorcode.ErrorCode; public interface APIBatchRequest { - class BatchOperationResult { + class BatchOperationResult { + private T inventory; private String uuid; private boolean success; private ErrorCode error; @@ -31,6 +32,14 @@ public ErrorCode getError() { public void setError(ErrorCode error) { this.error = error; } + + public T getInventory() { + return inventory; + } + + public void setInventory(T inventory) { + this.inventory = inventory; + } } class Result { diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 563e7aa27ad..7fde1f391e3 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -281,7 +281,6 @@ public class SourceClassMap { put("org.zstack.header.longjob.LongJobInventory", "org.zstack.sdk.LongJobInventory"); put("org.zstack.header.longjob.LongJobState", "org.zstack.sdk.LongJobState"); put("org.zstack.header.managementnode.ManagementNodeInventory", "org.zstack.sdk.ManagementNodeInventory"); - put("org.zstack.header.message.APIBatchRequest$BatchOperationResult", "org.zstack.sdk.BatchOperationResult"); put("org.zstack.header.network.l2.L2NetworkData", "org.zstack.sdk.L2NetworkData"); put("org.zstack.header.network.l2.L2NetworkInventory", "org.zstack.sdk.L2NetworkInventory"); put("org.zstack.header.network.l2.L2VlanNetworkInventory", "org.zstack.sdk.L2VlanNetworkInventory"); @@ -864,7 +863,6 @@ public class SourceClassMap { put("org.zstack.sdk.BaremetalPxeServerInventory", "org.zstack.header.baremetal.pxeserver.BaremetalPxeServerInventory"); put("org.zstack.sdk.BaremetalVlanNicInventory", "org.zstack.header.baremetal.network.BaremetalVlanNicInventory"); put("org.zstack.sdk.BatchDeleteVolumeSnapshotStruct", "org.zstack.header.storage.snapshot.BatchDeleteVolumeSnapshotStruct"); - put("org.zstack.sdk.BatchOperationResult", "org.zstack.header.message.APIBatchRequest$BatchOperationResult"); put("org.zstack.sdk.BillingInventory", "org.zstack.billing.generator.BillingInventory"); put("org.zstack.sdk.BlockPrimaryStorageInventory", "org.zstack.storage.primary.block.BlockPrimaryStorageInventory"); put("org.zstack.sdk.BlockVolumeInventory", "org.zstack.header.volume.block.BlockVolumeInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java index 5158ea55486..39be4f310a8 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java @@ -34,6 +34,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; + @Param(required = false, validValues = {"FineTune","Endpoint","App","ModelEval"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List usageScenarios; + + @Param(required = false, validValues = {"Text","Audio","Image","Video","Tabular","Geospatial","TimeSeries"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String dataType; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateDatasetsAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetsAction.java new file mode 100644 index 00000000000..7cae036b324 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetsAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateDatasetsAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UpdateDatasetsResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List updateDatasetStructs; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UpdateDatasetsResult value = res.getResult(org.zstack.sdk.UpdateDatasetsResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateDatasetsResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/ai/datasets"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateDatasets"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateDatasetsResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetsResult.java new file mode 100644 index 00000000000..9e9ac659d9f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetsResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class UpdateDatasetsResult { + public java.util.List results; + public void setResults(java.util.List results) { + this.results = results; + } + public java.util.List getResults() { + return this.results; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 2bf5820aae8..91ec947cc18 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -1184,20 +1184,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -1994,20 +1994,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -2021,20 +2021,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -2048,20 +2048,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -2237,20 +2237,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -2264,7 +2264,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -4721,20 +4721,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -4748,7 +4748,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -8663,20 +8663,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -9338,20 +9338,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -10985,20 +10985,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -11012,7 +11012,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -13226,20 +13226,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -13253,7 +13253,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -13334,20 +13334,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -14042,14 +14042,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -14063,20 +14063,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -14792,20 +14792,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -14819,20 +14819,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -14846,20 +14846,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -14873,20 +14873,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -14900,20 +14900,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -14927,20 +14927,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -16115,20 +16115,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -16142,7 +16142,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -17195,20 +17195,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -17222,20 +17222,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -17249,20 +17249,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -20705,20 +20705,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -21401,6 +21401,33 @@ abstract class ApiHelper { } + def getHostMultipathTopology(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostMultipathTopologyAction.class) Closure c) { + def a = new org.zstack.sdk.GetHostMultipathTopologyAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def getHostNUMATopology(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostNUMATopologyAction.class) Closure c) { def a = new org.zstack.sdk.GetHostNUMATopologyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -22433,20 +22460,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -23534,33 +23561,6 @@ abstract class ApiHelper { } - def getHostMultipathTopology(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostMultipathTopologyAction.class) Closure c) { - def a = new org.zstack.sdk.GetHostMultipathTopologyAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() - - - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } - - def getSignatureServerEncryptPublicKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetSignatureServerEncryptPublicKeyAction.class) Closure c) { def a = new org.zstack.sdk.GetSignatureServerEncryptPublicKeyAction() @@ -27638,7 +27638,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -27646,14 +27646,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -28740,7 +28740,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -28748,14 +28748,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -28856,7 +28856,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -28864,14 +28864,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -29372,6 +29372,35 @@ abstract class ApiHelper { } + def queryFcHbaDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFcHbaDeviceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryFcHbaDeviceAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryFiberChannelLun(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFiberChannelLunAction.class) Closure c) { def a = new org.zstack.sdk.QueryFiberChannelLunAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -31205,7 +31234,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -31213,14 +31242,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -31234,7 +31263,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -31242,14 +31271,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -31263,7 +31292,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -31271,14 +31300,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -31292,7 +31321,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -31300,14 +31329,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -31321,7 +31350,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -31329,14 +31358,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -31350,7 +31379,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -31358,14 +31387,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -33177,7 +33206,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -33185,14 +33214,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -33322,7 +33351,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -33330,14 +33359,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -38834,20 +38863,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -39725,20 +39754,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -39752,7 +39781,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -41372,20 +41401,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -41399,20 +41428,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -41426,8 +41455,35 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + def updateDatasets(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateDatasetsAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateDatasetsAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid @@ -42269,14 +42325,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -42290,20 +42346,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -43019,20 +43075,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -43046,20 +43102,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -43073,20 +43129,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -43100,20 +43156,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -44315,20 +44371,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -48067,20 +48123,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -48094,20 +48150,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -48121,20 +48177,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -48148,20 +48204,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -48175,20 +48231,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -48202,7 +48258,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { From b9eafc1a1f79fa867183dee1adaf377e2e294de4 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 23 Dec 2024 09:39:55 +0800 Subject: [PATCH 205/737] [conf]: Add default system tags for system datasets - Update sdk and api helper - Update schema to support upgrade DBImpact Resolves: ZSTAC-70828 Change-Id: I7164697774646a6d71616e61797a6b636868726f --- conf/db/upgrade/V5.3.6__schema.sql | 28 +++++ .../org/zstack/sdk/DeleteDatasetsAction.java | 104 ++++++++++++++++++ .../org/zstack/sdk/DeleteDatasetsResult.java | 14 +++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ 4 files changed, 173 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteDatasetsAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteDatasetsResult.java diff --git a/conf/db/upgrade/V5.3.6__schema.sql b/conf/db/upgrade/V5.3.6__schema.sql index aebb0eb958e..2a29c6800d8 100644 --- a/conf/db/upgrade/V5.3.6__schema.sql +++ b/conf/db/upgrade/V5.3.6__schema.sql @@ -11,3 +11,31 @@ ALTER TABLE `zstack`.`ModelEvaluationTaskVO` ADD taskRequestInJson VARCHAR(8192) ALTER TABLE `zstack`.`ModelEvaluationTaskVO` ADD type VARCHAR(32) DEFAULT NULL; ALTER TABLE `zstack`.`ModelEvaluationTaskVO` MODIFY `evaluatedServiceGroupUuid` varchar(32) DEFAULT NULL; ALTER TABLE `zstack`.`ModelEvaluationTaskVO` MODIFY datasetUuid VARCHAR(32) DEFAULT NULL; + +INSERT INTO SystemTagVO +(`uuid`, `resourceUuid`, `resourceType`, `inherent`, `type`, `tag`, `createDate`, `lastOpDate`) +SELECT + REPLACE(UUID(), '-', ''), -- 生成不含连字符的uuid + uuid, -- 使用DatasetVO的uuid作为resourceUuid + 'DatasetVO', -- resourceType + 1, -- inherent + 'System', -- type + 'dataset::usage::scenarios::ModelEval', -- tag + CURRENT_TIMESTAMP(), -- createDate + CURRENT_TIMESTAMP() -- lastOpDate +FROM DatasetVO +WHERE system = true; + +INSERT INTO SystemTagVO +(`uuid`, `resourceUuid`, `resourceType`, `inherent`, `type`, `tag`, `createDate`, `lastOpDate`) +SELECT + REPLACE(UUID(), '-', ''), -- 生成不含连字符的uuid + uuid, -- 使用DatasetVO的uuid作为resourceUuid + 'DatasetVO', -- resourceType + 1, -- inherent + 'System', -- type + 'dataset::datatype::Text', -- tag + CURRENT_TIMESTAMP(), -- createDate + CURRENT_TIMESTAMP() -- lastOpDate +FROM DatasetVO +WHERE system = true; diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteDatasetsAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteDatasetsAction.java new file mode 100644 index 00000000000..f17d73b43a2 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteDatasetsAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteDatasetsAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeleteDatasetsResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List uuids; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeleteDatasetsResult value = res.getResult(org.zstack.sdk.DeleteDatasetsResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteDatasetsResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/ai/datasets"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteDatasetsResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteDatasetsResult.java new file mode 100644 index 00000000000..5220fc742ba --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteDatasetsResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class DeleteDatasetsResult { + public java.util.List results; + public void setResults(java.util.List results) { + this.results = results; + } + public java.util.List getResults() { + return this.results; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 91ec947cc18..7e0e0fa69b2 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -13355,6 +13355,33 @@ abstract class ApiHelper { } + def deleteDatasets(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteDatasetsAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteDatasetsAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def deleteDirectory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteDirectoryAction.class) Closure c) { def a = new org.zstack.sdk.DeleteDirectoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 01cfdb874ee85a0f520903165098deb4d525e3a4 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 27 Nov 2024 13:44:07 +0800 Subject: [PATCH 206/737] [conf]: Update schema for container endpoint DBImpact Resolves: ZSTAC-71188 Change-Id: I6979646b756b6279756e6c6c6e61796565746161 --- conf/db/upgrade/V5.3.6__schema.sql | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/conf/db/upgrade/V5.3.6__schema.sql b/conf/db/upgrade/V5.3.6__schema.sql index 2a29c6800d8..a6d4eb2d298 100644 --- a/conf/db/upgrade/V5.3.6__schema.sql +++ b/conf/db/upgrade/V5.3.6__schema.sql @@ -39,3 +39,11 @@ SELECT CURRENT_TIMESTAMP() -- lastOpDate FROM DatasetVO WHERE system = true; + +-- 重命名表 +RENAME TABLE `zstack`.`ContainerManagementVmVO` TO `zstack`.`ContainerManagementEndpointVO`; + +-- 删除列 +ALTER TABLE `zstack`.`ContainerManagementEndpointVO` +DROP COLUMN `vmInstanceUuid`; + From 4b057739fd7fb7bb1c3fb7152706e520c6158d7e Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 28 Nov 2024 17:00:50 +0800 Subject: [PATCH 207/737] [conf]: Introduce native cluster and host schema DBImpact Resolves: ZSTAC-71188 Change-Id: I666a756c6d6271647976636a63646f6368676e68 --- conf/db/upgrade/V5.3.6__schema.sql | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/conf/db/upgrade/V5.3.6__schema.sql b/conf/db/upgrade/V5.3.6__schema.sql index a6d4eb2d298..f89c5beba86 100644 --- a/conf/db/upgrade/V5.3.6__schema.sql +++ b/conf/db/upgrade/V5.3.6__schema.sql @@ -47,3 +47,23 @@ RENAME TABLE `zstack`.`ContainerManagementVmVO` TO `zstack`.`ContainerManagement ALTER TABLE `zstack`.`ContainerManagementEndpointVO` DROP COLUMN `vmInstanceUuid`; +CREATE TABLE `zstack`.`NativeClusterVO` ( + `uuid` varchar(32) NOT NULL UNIQUE COMMENT 'native cluster uuid', + `endpointUuid` varchar(32) NOT NULL COMMENT 'container endpoint uuid', + `bizUrl` varchar(255) DEFAULT NULL COMMENT 'business network url', + `masterUrl` varchar(255) DEFAULT NULL COMMENT 'management network url', + `kubeConfig` text COMMENT 'kubernetes configuration', + `id` bigint(20) DEFAULT NULL COMMENT 'kubernetes cluster id', + `prometheusURL` varchar(255) DEFAULT NULL COMMENT 'prometheus monitoring url', + `version` varchar(64) DEFAULT NULL COMMENT 'kubernetes version', + `nodeCount` int DEFAULT NULL COMMENT 'number of nodes', + `createType` varchar(32) DEFAULT NULL COMMENT 'cluster creation type', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `zstack`.`NativeHostVO` ( + `uuid` varchar(32) NOT NULL UNIQUE COMMENT 'host uuid', + `endpointUuid` varchar(32) NOT NULL COMMENT 'container endpoint uuid', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; From 63a5465f1e7184c72b14307cae4867f32afd3c5d Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 27 Nov 2024 14:14:44 +0800 Subject: [PATCH 208/737] [sdk]: Update sdk and api helper Resolves: ZSTAC-71188 Change-Id: I7969797562646c666c64716d75717168666e6f69 --- sdk/src/main/java/SourceClassMap.java | 8 +- ...AddContainerManagementEndpointAction.java} | 13 +-- .../AddContainerManagementEndpointResult.java | 14 +++ .../sdk/AddContainerManagementVmResult.java | 14 --- .../org/zstack/sdk/BatchOperationResult.java | 31 ------ ...ContainerManagementEndpointInventory.java} | 10 +- ...eteContainerManagementEndpointAction.java} | 10 +- ...leteContainerManagementEndpointResult.java | 7 ++ .../zstack/sdk/NativeClusterInventory.java | 63 +++++++++++ .../org/zstack/sdk/NativeHostInventory.java | 15 +++ ...ueryContainerManagementEndpointAction.java | 75 +++++++++++++ ...ueryContainerManagementEndpointResult.java | 22 ++++ .../zstack/sdk/QueryNativeClusterAction.java | 75 +++++++++++++ ...ult.java => QueryNativeClusterResult.java} | 2 +- ...Action.java => QueryNativeHostAction.java} | 10 +- .../org/zstack/sdk/QueryNativeHostResult.java | 22 ++++ ...SyncContainerManagementEndpointAction.java | 101 ++++++++++++++++++ ...SyncContainerManagementEndpointResult.java | 14 +++ ...ateContainerManagementEndpointAction.java} | 12 +-- ...dateContainerManagementEndpointResult.java | 14 +++ .../UpdateContainerManagementVmResult.java | 14 --- .../java/org/zstack/testlib/ApiHelper.groovy | 101 ++++++++++++++++-- 22 files changed, 544 insertions(+), 103 deletions(-) rename sdk/src/main/java/org/zstack/sdk/{AddContainerManagementVmAction.java => AddContainerManagementEndpointAction.java} (87%) create mode 100644 sdk/src/main/java/org/zstack/sdk/AddContainerManagementEndpointResult.java delete mode 100644 sdk/src/main/java/org/zstack/sdk/AddContainerManagementVmResult.java delete mode 100644 sdk/src/main/java/org/zstack/sdk/BatchOperationResult.java rename sdk/src/main/java/org/zstack/sdk/{ContainerManagementVmInventory.java => ContainerManagementEndpointInventory.java} (87%) rename sdk/src/main/java/org/zstack/sdk/{DeleteContainerManagementVmAction.java => DeleteContainerManagementEndpointAction.java} (85%) create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementEndpointResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/NativeClusterInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/NativeHostInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryContainerManagementEndpointAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryContainerManagementEndpointResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryNativeClusterAction.java rename sdk/src/main/java/org/zstack/sdk/{QueryContainerManagementVmResult.java => QueryNativeClusterResult.java} (90%) rename sdk/src/main/java/org/zstack/sdk/{QueryContainerManagementVmAction.java => QueryNativeHostAction.java} (82%) create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryNativeHostResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointResult.java rename sdk/src/main/java/org/zstack/sdk/{UpdateContainerManagementVmAction.java => UpdateContainerManagementEndpointAction.java} (85%) create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementEndpointResult.java delete mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementVmResult.java diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 7fde1f391e3..0afab377d0f 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -104,7 +104,9 @@ public class SourceClassMap { put("org.zstack.cloudformation.template.struct.ResourceStruct", "org.zstack.sdk.ResourceStruct"); put("org.zstack.cloudformation.template.struct.ResourceType", "org.zstack.sdk.ResourceType"); put("org.zstack.container.ContainerUsage", "org.zstack.sdk.ContainerUsage"); - put("org.zstack.container.entity.ContainerManagementVmInventory", "org.zstack.sdk.ContainerManagementVmInventory"); + put("org.zstack.container.entity.ContainerManagementEndpointInventory", "org.zstack.sdk.ContainerManagementEndpointInventory"); + put("org.zstack.container.entity.NativeClusterInventory", "org.zstack.sdk.NativeClusterInventory"); + put("org.zstack.container.entity.NativeHostInventory", "org.zstack.sdk.NativeHostInventory"); put("org.zstack.core.config.GlobalConfigInventory", "org.zstack.sdk.GlobalConfigInventory"); put("org.zstack.core.config.GlobalConfigOptions", "org.zstack.sdk.GlobalConfigOptions"); put("org.zstack.core.config.GuestOsCharacterInventory", "org.zstack.sdk.GuestOsCharacterInventory"); @@ -902,7 +904,7 @@ public class SourceClassMap { put("org.zstack.sdk.ConnectionRelationShipProperty", "org.zstack.header.aliyun.network.connection.ConnectionRelationShipProperty"); put("org.zstack.sdk.ConsoleInventory", "org.zstack.header.console.ConsoleInventory"); put("org.zstack.sdk.ConsoleProxyAgentInventory", "org.zstack.header.console.ConsoleProxyAgentInventory"); - put("org.zstack.sdk.ContainerManagementVmInventory", "org.zstack.container.entity.ContainerManagementVmInventory"); + put("org.zstack.sdk.ContainerManagementEndpointInventory", "org.zstack.container.entity.ContainerManagementEndpointInventory"); put("org.zstack.sdk.ContainerUsage", "org.zstack.container.ContainerUsage"); put("org.zstack.sdk.ControlStrategy", "org.zstack.loginControl.entity.ControlStrategy"); put("org.zstack.sdk.CpuMemoryCapacityData", "org.zstack.header.allocator.datatypes.CpuMemoryCapacityData"); @@ -1110,6 +1112,8 @@ public class SourceClassMap { put("org.zstack.sdk.NasFileSystemInventory", "org.zstack.nas.NasFileSystemInventory"); put("org.zstack.sdk.NasMountTargetInventory", "org.zstack.nas.NasMountTargetInventory"); put("org.zstack.sdk.NasProtocolType", "org.zstack.nas.NasProtocolType"); + put("org.zstack.sdk.NativeClusterInventory", "org.zstack.container.entity.NativeClusterInventory"); + put("org.zstack.sdk.NativeHostInventory", "org.zstack.container.entity.NativeHostInventory"); put("org.zstack.sdk.Neighbor", "org.zstack.header.protocol.Neighbor"); put("org.zstack.sdk.NetworkReachablePair", "org.zstack.zops.NetworkReachablePair"); put("org.zstack.sdk.NetworkRouterAreaRefInventory", "org.zstack.header.protocol.NetworkRouterAreaRefInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/AddContainerManagementVmAction.java b/sdk/src/main/java/org/zstack/sdk/AddContainerManagementEndpointAction.java similarity index 87% rename from sdk/src/main/java/org/zstack/sdk/AddContainerManagementVmAction.java rename to sdk/src/main/java/org/zstack/sdk/AddContainerManagementEndpointAction.java index 42dff8c03f1..08e28d31657 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddContainerManagementVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddContainerManagementEndpointAction.java @@ -4,7 +4,7 @@ import java.util.Map; import org.zstack.sdk.*; -public class AddContainerManagementVmAction extends AbstractAction { +public class AddContainerManagementEndpointAction extends AbstractAction { private static final HashMap parameterMap = new HashMap<>(); @@ -12,7 +12,7 @@ public class AddContainerManagementVmAction extends AbstractAction { public static class Result { public ErrorCode error; - public org.zstack.sdk.AddContainerManagementVmResult value; + public org.zstack.sdk.AddContainerManagementEndpointResult value; public Result throwExceptionIfError() { if (error != null) { @@ -25,9 +25,6 @@ public Result throwExceptionIfError() { } } - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String uuid; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; @@ -87,8 +84,8 @@ private Result makeResult(ApiResult res) { return ret; } - org.zstack.sdk.AddContainerManagementVmResult value = res.getResult(org.zstack.sdk.AddContainerManagementVmResult.class); - ret.value = value == null ? new org.zstack.sdk.AddContainerManagementVmResult() : value; + org.zstack.sdk.AddContainerManagementEndpointResult value = res.getResult(org.zstack.sdk.AddContainerManagementEndpointResult.class); + ret.value = value == null ? new org.zstack.sdk.AddContainerManagementEndpointResult() : value; return ret; } @@ -118,7 +115,7 @@ protected Map getNonAPIParameterMap() { protected RestInfo getRestInfo() { RestInfo info = new RestInfo(); info.httpMethod = "POST"; - info.path = "/container/management/vm"; + info.path = "/container/management/endpoint"; info.needSession = true; info.needPoll = true; info.parameterName = "params"; diff --git a/sdk/src/main/java/org/zstack/sdk/AddContainerManagementEndpointResult.java b/sdk/src/main/java/org/zstack/sdk/AddContainerManagementEndpointResult.java new file mode 100644 index 00000000000..3169461d14b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddContainerManagementEndpointResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ContainerManagementEndpointInventory; + +public class AddContainerManagementEndpointResult { + public ContainerManagementEndpointInventory inventory; + public void setInventory(ContainerManagementEndpointInventory inventory) { + this.inventory = inventory; + } + public ContainerManagementEndpointInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AddContainerManagementVmResult.java b/sdk/src/main/java/org/zstack/sdk/AddContainerManagementVmResult.java deleted file mode 100644 index bbf8002bfdb..00000000000 --- a/sdk/src/main/java/org/zstack/sdk/AddContainerManagementVmResult.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.zstack.sdk; - -import org.zstack.sdk.ContainerManagementVmInventory; - -public class AddContainerManagementVmResult { - public ContainerManagementVmInventory inventory; - public void setInventory(ContainerManagementVmInventory inventory) { - this.inventory = inventory; - } - public ContainerManagementVmInventory getInventory() { - return this.inventory; - } - -} diff --git a/sdk/src/main/java/org/zstack/sdk/BatchOperationResult.java b/sdk/src/main/java/org/zstack/sdk/BatchOperationResult.java deleted file mode 100644 index 95510649f31..00000000000 --- a/sdk/src/main/java/org/zstack/sdk/BatchOperationResult.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.zstack.sdk; - -import org.zstack.sdk.ErrorCode; - -public class BatchOperationResult { - - public java.lang.String uuid; - public void setUuid(java.lang.String uuid) { - this.uuid = uuid; - } - public java.lang.String getUuid() { - return this.uuid; - } - - public boolean success; - public void setSuccess(boolean success) { - this.success = success; - } - public boolean getSuccess() { - return this.success; - } - - public ErrorCode error; - public void setError(ErrorCode error) { - this.error = error; - } - public ErrorCode getError() { - return this.error; - } - -} diff --git a/sdk/src/main/java/org/zstack/sdk/ContainerManagementVmInventory.java b/sdk/src/main/java/org/zstack/sdk/ContainerManagementEndpointInventory.java similarity index 87% rename from sdk/src/main/java/org/zstack/sdk/ContainerManagementVmInventory.java rename to sdk/src/main/java/org/zstack/sdk/ContainerManagementEndpointInventory.java index 3323dde3d12..b28bc973dfb 100644 --- a/sdk/src/main/java/org/zstack/sdk/ContainerManagementVmInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ContainerManagementEndpointInventory.java @@ -2,7 +2,7 @@ -public class ContainerManagementVmInventory { +public class ContainerManagementEndpointInventory { public java.lang.String uuid; public void setUuid(java.lang.String uuid) { @@ -60,14 +60,6 @@ public java.lang.String getVendor() { return this.vendor; } - public java.lang.String vmInstanceUuid; - public void setVmInstanceUuid(java.lang.String vmInstanceUuid) { - this.vmInstanceUuid = vmInstanceUuid; - } - public java.lang.String getVmInstanceUuid() { - return this.vmInstanceUuid; - } - public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementVmAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementEndpointAction.java similarity index 85% rename from sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementVmAction.java rename to sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementEndpointAction.java index 92453669300..1029c2aae8b 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementEndpointAction.java @@ -4,7 +4,7 @@ import java.util.Map; import org.zstack.sdk.*; -public class DeleteContainerManagementVmAction extends AbstractAction { +public class DeleteContainerManagementEndpointAction extends AbstractAction { private static final HashMap parameterMap = new HashMap<>(); @@ -12,7 +12,7 @@ public class DeleteContainerManagementVmAction extends AbstractAction { public static class Result { public ErrorCode error; - public org.zstack.sdk.DeleteContainerManagementVmResult value; + public org.zstack.sdk.DeleteContainerManagementEndpointResult value; public Result throwExceptionIfError() { if (error != null) { @@ -63,8 +63,8 @@ private Result makeResult(ApiResult res) { return ret; } - org.zstack.sdk.DeleteContainerManagementVmResult value = res.getResult(org.zstack.sdk.DeleteContainerManagementVmResult.class); - ret.value = value == null ? new org.zstack.sdk.DeleteContainerManagementVmResult() : value; + org.zstack.sdk.DeleteContainerManagementEndpointResult value = res.getResult(org.zstack.sdk.DeleteContainerManagementEndpointResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteContainerManagementEndpointResult() : value; return ret; } @@ -94,7 +94,7 @@ protected Map getNonAPIParameterMap() { protected RestInfo getRestInfo() { RestInfo info = new RestInfo(); info.httpMethod = "DELETE"; - info.path = "/container/management/vm/{uuid}"; + info.path = "/container/management/endpoint/{uuid}"; info.needSession = true; info.needPoll = true; info.parameterName = ""; diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementEndpointResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementEndpointResult.java new file mode 100644 index 00000000000..b3efa9b8344 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementEndpointResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteContainerManagementEndpointResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/NativeClusterInventory.java b/sdk/src/main/java/org/zstack/sdk/NativeClusterInventory.java new file mode 100644 index 00000000000..0b4aaa9d1ad --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/NativeClusterInventory.java @@ -0,0 +1,63 @@ +package org.zstack.sdk; + + + +public class NativeClusterInventory extends org.zstack.sdk.ClusterInventory { + + public java.lang.String bizUrl; + public void setBizUrl(java.lang.String bizUrl) { + this.bizUrl = bizUrl; + } + public java.lang.String getBizUrl() { + return this.bizUrl; + } + + public java.lang.String masterUrl; + public void setMasterUrl(java.lang.String masterUrl) { + this.masterUrl = masterUrl; + } + public java.lang.String getMasterUrl() { + return this.masterUrl; + } + + public java.lang.String kubeConfig; + public void setKubeConfig(java.lang.String kubeConfig) { + this.kubeConfig = kubeConfig; + } + public java.lang.String getKubeConfig() { + return this.kubeConfig; + } + + public java.lang.String prometheusURL; + public void setPrometheusURL(java.lang.String prometheusURL) { + this.prometheusURL = prometheusURL; + } + public java.lang.String getPrometheusURL() { + return this.prometheusURL; + } + + public java.lang.String version; + public void setVersion(java.lang.String version) { + this.version = version; + } + public java.lang.String getVersion() { + return this.version; + } + + public java.lang.Integer nodeCount; + public void setNodeCount(java.lang.Integer nodeCount) { + this.nodeCount = nodeCount; + } + public java.lang.Integer getNodeCount() { + return this.nodeCount; + } + + public java.lang.String createType; + public void setCreateType(java.lang.String createType) { + this.createType = createType; + } + public java.lang.String getCreateType() { + return this.createType; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/NativeHostInventory.java b/sdk/src/main/java/org/zstack/sdk/NativeHostInventory.java new file mode 100644 index 00000000000..243e1d9dc92 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/NativeHostInventory.java @@ -0,0 +1,15 @@ +package org.zstack.sdk; + + + +public class NativeHostInventory extends org.zstack.sdk.HostInventory { + + public java.lang.String endpointUuid; + public void setEndpointUuid(java.lang.String endpointUuid) { + this.endpointUuid = endpointUuid; + } + public java.lang.String getEndpointUuid() { + return this.endpointUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementEndpointAction.java new file mode 100644 index 00000000000..21ad927e2b6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementEndpointAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryContainerManagementEndpointAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryContainerManagementEndpointResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryContainerManagementEndpointResult value = res.getResult(org.zstack.sdk.QueryContainerManagementEndpointResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryContainerManagementEndpointResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/container/management/endpoint"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementEndpointResult.java b/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementEndpointResult.java new file mode 100644 index 00000000000..5e7621c2221 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementEndpointResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryContainerManagementEndpointResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNativeClusterAction.java b/sdk/src/main/java/org/zstack/sdk/QueryNativeClusterAction.java new file mode 100644 index 00000000000..36c955da9ff --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryNativeClusterAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryNativeClusterAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryNativeClusterResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryNativeClusterResult value = res.getResult(org.zstack.sdk.QueryNativeClusterResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryNativeClusterResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/container/native/cluster"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementVmResult.java b/sdk/src/main/java/org/zstack/sdk/QueryNativeClusterResult.java similarity index 90% rename from sdk/src/main/java/org/zstack/sdk/QueryContainerManagementVmResult.java rename to sdk/src/main/java/org/zstack/sdk/QueryNativeClusterResult.java index e5ab5ec418c..596c2e681ac 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementVmResult.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryNativeClusterResult.java @@ -2,7 +2,7 @@ -public class QueryContainerManagementVmResult { +public class QueryNativeClusterResult { public java.util.List inventories; public void setInventories(java.util.List inventories) { this.inventories = inventories; diff --git a/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementVmAction.java b/sdk/src/main/java/org/zstack/sdk/QueryNativeHostAction.java similarity index 82% rename from sdk/src/main/java/org/zstack/sdk/QueryContainerManagementVmAction.java rename to sdk/src/main/java/org/zstack/sdk/QueryNativeHostAction.java index f09c2a6292a..59f4c4141f8 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryNativeHostAction.java @@ -4,7 +4,7 @@ import java.util.Map; import org.zstack.sdk.*; -public class QueryContainerManagementVmAction extends QueryAction { +public class QueryNativeHostAction extends QueryAction { private static final HashMap parameterMap = new HashMap<>(); @@ -12,7 +12,7 @@ public class QueryContainerManagementVmAction extends QueryAction { public static class Result { public ErrorCode error; - public org.zstack.sdk.QueryVmInstanceResult value; + public org.zstack.sdk.QueryNativeHostResult value; public Result throwExceptionIfError() { if (error != null) { @@ -34,8 +34,8 @@ private Result makeResult(ApiResult res) { return ret; } - org.zstack.sdk.QueryVmInstanceResult value = res.getResult(org.zstack.sdk.QueryVmInstanceResult.class); - ret.value = value == null ? new org.zstack.sdk.QueryVmInstanceResult() : value; + org.zstack.sdk.QueryNativeHostResult value = res.getResult(org.zstack.sdk.QueryNativeHostResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryNativeHostResult() : value; return ret; } @@ -65,7 +65,7 @@ protected Map getNonAPIParameterMap() { protected RestInfo getRestInfo() { RestInfo info = new RestInfo(); info.httpMethod = "GET"; - info.path = "/container/management/vm"; + info.path = "/container/native/host"; info.needSession = true; info.needPoll = false; info.parameterName = ""; diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNativeHostResult.java b/sdk/src/main/java/org/zstack/sdk/QueryNativeHostResult.java new file mode 100644 index 00000000000..47f05f56130 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryNativeHostResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryNativeHostResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointAction.java new file mode 100644 index 00000000000..117bea04a1d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class SyncContainerManagementEndpointAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.SyncContainerManagementEndpointResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.SyncContainerManagementEndpointResult value = res.getResult(org.zstack.sdk.SyncContainerManagementEndpointResult.class); + ret.value = value == null ? new org.zstack.sdk.SyncContainerManagementEndpointResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/container/management/endpoint/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "syncContainerManagementEndpoint"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointResult.java b/sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointResult.java new file mode 100644 index 00000000000..f1e0139d01a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ContainerManagementEndpointInventory; + +public class SyncContainerManagementEndpointResult { + public ContainerManagementEndpointInventory inventory; + public void setInventory(ContainerManagementEndpointInventory inventory) { + this.inventory = inventory; + } + public ContainerManagementEndpointInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementVmAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementEndpointAction.java similarity index 85% rename from sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementVmAction.java rename to sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementEndpointAction.java index a502cb7bb59..d2675c1a78f 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementEndpointAction.java @@ -4,7 +4,7 @@ import java.util.Map; import org.zstack.sdk.*; -public class UpdateContainerManagementVmAction extends AbstractAction { +public class UpdateContainerManagementEndpointAction extends AbstractAction { private static final HashMap parameterMap = new HashMap<>(); @@ -12,7 +12,7 @@ public class UpdateContainerManagementVmAction extends AbstractAction { public static class Result { public ErrorCode error; - public org.zstack.sdk.UpdateContainerManagementVmResult value; + public org.zstack.sdk.UpdateContainerManagementEndpointResult value; public Result throwExceptionIfError() { if (error != null) { @@ -69,8 +69,8 @@ private Result makeResult(ApiResult res) { return ret; } - org.zstack.sdk.UpdateContainerManagementVmResult value = res.getResult(org.zstack.sdk.UpdateContainerManagementVmResult.class); - ret.value = value == null ? new org.zstack.sdk.UpdateContainerManagementVmResult() : value; + org.zstack.sdk.UpdateContainerManagementEndpointResult value = res.getResult(org.zstack.sdk.UpdateContainerManagementEndpointResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateContainerManagementEndpointResult() : value; return ret; } @@ -100,10 +100,10 @@ protected Map getNonAPIParameterMap() { protected RestInfo getRestInfo() { RestInfo info = new RestInfo(); info.httpMethod = "PUT"; - info.path = "/container/management/vm/{uuid}/actions"; + info.path = "/container/management/endpoint/{uuid}/actions"; info.needSession = true; info.needPoll = true; - info.parameterName = "updateContainerManagementVm"; + info.parameterName = "updateContainerManagementEndpoint"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementEndpointResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementEndpointResult.java new file mode 100644 index 00000000000..3218418600a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementEndpointResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ContainerManagementEndpointInventory; + +public class UpdateContainerManagementEndpointResult { + public ContainerManagementEndpointInventory inventory; + public void setInventory(ContainerManagementEndpointInventory inventory) { + this.inventory = inventory; + } + public ContainerManagementEndpointInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementVmResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementVmResult.java deleted file mode 100644 index 31039de8872..00000000000 --- a/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementVmResult.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.zstack.sdk; - -import org.zstack.sdk.ContainerManagementVmInventory; - -public class UpdateContainerManagementVmResult { - public ContainerManagementVmInventory inventory; - public void setInventory(ContainerManagementVmInventory inventory) { - this.inventory = inventory; - } - public ContainerManagementVmInventory getInventory() { - return this.inventory; - } - -} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 7e0e0fa69b2..da4bf3cab21 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -1178,8 +1178,8 @@ abstract class ApiHelper { } - def addContainerManagementVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddContainerManagementVmAction.class) Closure c) { - def a = new org.zstack.sdk.AddContainerManagementVmAction() + def addContainerManagementEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddContainerManagementEndpointAction.class) Closure c) { + def a = new org.zstack.sdk.AddContainerManagementEndpointAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13247,8 +13247,8 @@ abstract class ApiHelper { } - def deleteContainerManagementVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteContainerManagementVmAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteContainerManagementVmAction() + def deleteContainerManagementEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteContainerManagementEndpointAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteContainerManagementEndpointAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28761,8 +28761,8 @@ abstract class ApiHelper { } - def queryContainerManagementVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryContainerManagementVmAction.class) Closure c) { - def a = new org.zstack.sdk.QueryContainerManagementVmAction() + def queryContainerManagementEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryContainerManagementEndpointAction.class) Closure c) { + def a = new org.zstack.sdk.QueryContainerManagementEndpointAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31603,6 +31603,64 @@ abstract class ApiHelper { } + def queryNativeCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNativeClusterAction.class) Closure c) { + def a = new org.zstack.sdk.QueryNativeClusterAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def queryNativeHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNativeHostAction.class) Closure c) { + def a = new org.zstack.sdk.QueryNativeHostAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryNetworkServiceL3NetworkRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNetworkServiceL3NetworkRefAction.class) Closure c) { def a = new org.zstack.sdk.QueryNetworkServiceL3NetworkRefAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -39073,6 +39131,33 @@ abstract class ApiHelper { } + def syncContainerManagementEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncContainerManagementEndpointAction.class) Closure c) { + def a = new org.zstack.sdk.SyncContainerManagementEndpointAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def syncDataCenterFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncDataCenterFromRemoteAction.class) Closure c) { def a = new org.zstack.sdk.SyncDataCenterFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -41449,8 +41534,8 @@ abstract class ApiHelper { } - def updateContainerManagementVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateContainerManagementVmAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateContainerManagementVmAction() + def updateContainerManagementEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateContainerManagementEndpointAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateContainerManagementEndpointAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a From 1e2b0e05cc46f85c191c05c31c5d14c0f6675d49 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 3 Dec 2024 13:27:29 +0800 Subject: [PATCH 209/737] [conf]: Fix V5.3.5__schema.sql to support re-execute - Add RENAME_TABLE procedure to check if table already renamed - Use DROP_COLUMN procedure instead of alter directly - Check if table exists before create NativeClusterVO and NativeHostVO DBImpact Resolves: ZSTAC-71188 Change-Id: I6e6b6363796879716e7a62746c77746475726967 --- conf/db/upgrade/V5.3.6__schema.sql | 14 +++++--------- conf/db/upgrade/beforeMigrate.sql | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/conf/db/upgrade/V5.3.6__schema.sql b/conf/db/upgrade/V5.3.6__schema.sql index f89c5beba86..09492fe3160 100644 --- a/conf/db/upgrade/V5.3.6__schema.sql +++ b/conf/db/upgrade/V5.3.6__schema.sql @@ -40,14 +40,11 @@ SELECT FROM DatasetVO WHERE system = true; --- 重命名表 -RENAME TABLE `zstack`.`ContainerManagementVmVO` TO `zstack`.`ContainerManagementEndpointVO`; +CALL RENAME_TABLE('ContainerManagementVmVO', 'ContainerManagementEndpointVO'); --- 删除列 -ALTER TABLE `zstack`.`ContainerManagementEndpointVO` -DROP COLUMN `vmInstanceUuid`; +CALL DROP_COLUMN('ContainerManagementEndpointVO', 'vmInstanceUuid'); -CREATE TABLE `zstack`.`NativeClusterVO` ( +CREATE TABLE IF NOT EXISTS `zstack`.`NativeClusterVO` ( `uuid` varchar(32) NOT NULL UNIQUE COMMENT 'native cluster uuid', `endpointUuid` varchar(32) NOT NULL COMMENT 'container endpoint uuid', `bizUrl` varchar(255) DEFAULT NULL COMMENT 'business network url', @@ -61,9 +58,8 @@ CREATE TABLE `zstack`.`NativeClusterVO` ( PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `zstack`.`NativeHostVO` ( +CREATE TABLE IF NOT EXISTS `zstack`.`NativeHostVO` ( `uuid` varchar(32) NOT NULL UNIQUE COMMENT 'host uuid', `endpointUuid` varchar(32) NOT NULL COMMENT 'container endpoint uuid', - PRIMARY KEY (`uuid`) + PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/conf/db/upgrade/beforeMigrate.sql b/conf/db/upgrade/beforeMigrate.sql index b032eeab203..d53d98d8646 100755 --- a/conf/db/upgrade/beforeMigrate.sql +++ b/conf/db/upgrade/beforeMigrate.sql @@ -235,3 +235,26 @@ BEGIN SELECT CURTIME(); END$$ DELIMITER ; + +DROP PROCEDURE IF EXISTS `RENAME_TABLE`; +DELIMITER $$ +CREATE PROCEDURE `RENAME_TABLE`( + IN old_name VARCHAR(64), + IN new_name VARCHAR(64) +) +BEGIN + DECLARE alter_sql VARCHAR(1000); + IF EXISTS( SELECT NULL + FROM INFORMATION_SCHEMA.TABLES + WHERE table_name = old_name + AND table_schema = 'zstack') THEN + SET @alter_sql = CONCAT('RENAME TABLE zstack.', old_name, ' TO ', new_name); + SELECT @alter_sql; + PREPARE stmt FROM @alter_sql; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + END IF; + + SELECT CURTIME(); +END$$ +DELIMITER ; \ No newline at end of file From f26b5357dc80cf79e8912009632ca6514a6d98de Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 6 Dec 2024 18:49:15 +0800 Subject: [PATCH 210/737] [sdk]: Update sdk Resolves: ZSTAC-71188 Change-Id: I6368696f75726e696c7a72796d676370696d6872 --- sdk/src/main/java/org/zstack/sdk/ApiResult.java | 4 ++++ sdk/src/main/java/org/zstack/sdk/PciDeviceVirtStatus.java | 1 + 2 files changed, 5 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/ApiResult.java b/sdk/src/main/java/org/zstack/sdk/ApiResult.java index 4fc044da405..6a814e76148 100755 --- a/sdk/src/main/java/org/zstack/sdk/ApiResult.java +++ b/sdk/src/main/java/org/zstack/sdk/ApiResult.java @@ -115,6 +115,10 @@ public T getResult(Class clz) { } Object bean = getProperty(ret, path); + if (bean == null) { + throw new ApiException(String.format("cannot find property[%s] in the result. src class[%s], dst class[%s]", path, src, dst)); + } + if (bean.getClass().getName().equals(dst)) { // not an inherent object continue; diff --git a/sdk/src/main/java/org/zstack/sdk/PciDeviceVirtStatus.java b/sdk/src/main/java/org/zstack/sdk/PciDeviceVirtStatus.java index cc97f300b50..e59f4237d25 100644 --- a/sdk/src/main/java/org/zstack/sdk/PciDeviceVirtStatus.java +++ b/sdk/src/main/java/org/zstack/sdk/PciDeviceVirtStatus.java @@ -8,5 +8,6 @@ public enum PciDeviceVirtStatus { VFIO_MDEV_VIRTUALIZED, SRIOV_VIRTUAL, VIRTUALIZED_BYPASS_ZSTACK, + HAMI_VIRTUALIZED, UNKNOWN, } From dfa2168eca2d70c185b5df6897025f4ab8423ca5 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 10 Dec 2024 18:33:59 +0800 Subject: [PATCH 211/737] [sdk]: Update sdk Resolves: ZSTAC-71804 Change-Id: I7968657468666d6868746a7663717a786b70656f --- .../org/zstack/sdk/SyncContainerManagementEndpointAction.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointAction.java index 117bea04a1d..abb9dace419 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointAction.java @@ -28,6 +28,9 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + @Param(required = false) public java.util.List systemTags; From ab0453ad03085b3cdcd05cc0c1b56cc713f85449 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 13 Dec 2024 18:57:12 +0800 Subject: [PATCH 212/737] [sdk]: Update sdk Resolves: ZSTAC-71880 Change-Id: I656770716166616c6a637863636779696d687269 --- ...teContainerResourceFromEndpointAction.java | 101 ++++++++++++++++++ ...teContainerResourceFromEndpointResult.java | 7 ++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ 3 files changed, 135 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteContainerResourceFromEndpointAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteContainerResourceFromEndpointResult.java diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteContainerResourceFromEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteContainerResourceFromEndpointAction.java new file mode 100644 index 00000000000..c1ec0b8112e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteContainerResourceFromEndpointAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteContainerResourceFromEndpointAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeleteContainerResourceFromEndpointResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeleteContainerResourceFromEndpointResult value = res.getResult(org.zstack.sdk.DeleteContainerResourceFromEndpointResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteContainerResourceFromEndpointResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/container/management/endpoint/{uuid}/resources/delete"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteContainerResourceFromEndpointResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteContainerResourceFromEndpointResult.java new file mode 100644 index 00000000000..fbbbde268be --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteContainerResourceFromEndpointResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteContainerResourceFromEndpointResult { + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index da4bf3cab21..a9e7ad2f150 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -13274,6 +13274,33 @@ abstract class ApiHelper { } + def deleteContainerResourceFromEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteContainerResourceFromEndpointAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteContainerResourceFromEndpointAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def deleteDataCenterInLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteDataCenterInLocalAction.class) Closure c) { def a = new org.zstack.sdk.DeleteDataCenterInLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 980ce65d1d53696cb12b6c2b4da0bdef5eb14850 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 16 Dec 2024 18:43:43 +0800 Subject: [PATCH 213/737] [sdk]: Update sdk Resolves: ZSTAC-71930 Change-Id: I6b76766675716a64776f62746e79737076757367 --- sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java index 39be4f310a8..5a2b0988f43 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java @@ -34,7 +34,7 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; - @Param(required = false, validValues = {"FineTune","Endpoint","App","ModelEval"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"FineTune","Endpoint","App","ModelEval","ModelPerf"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List usageScenarios; @Param(required = false, validValues = {"Text","Audio","Image","Video","Tabular","Geospatial","TimeSeries"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) From 585e8334ad29d4f980864d52e7c679778479103b Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 19 Dec 2024 17:05:10 +0800 Subject: [PATCH 214/737] [aspect]: Extend message deadline if timeout will happen within 1s Refer to ZSTAC-17849, message's timeout is calculated from message deadline and message current time. But current time from TimeHelper may have at least 1 seconds delay with actual System.currentTimeMillis(). As a result message may have more 2 seconds timeout. So when extend message timeout ZSTAC-40416 for rollback message's, deadline < System.currentTimeMillis(), deadline may passed but message's timeout is not meet due to the delay from ZSTAC-17849. In order to fix this issue, try to extend deadline earlier if no more than 1 seconds is remained. Resolves: ZSTAC-71756 Change-Id: I6f666f74776368796575756a6b6a6362777a7570 --- core/src/main/java/org/zstack/core/aspect/BackAspect.aj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/zstack/core/aspect/BackAspect.aj b/core/src/main/java/org/zstack/core/aspect/BackAspect.aj index 2f6cf54e83c..bf5d05d4b21 100644 --- a/core/src/main/java/org/zstack/core/aspect/BackAspect.aj +++ b/core/src/main/java/org/zstack/core/aspect/BackAspect.aj @@ -21,7 +21,7 @@ public aspect BackAspect { private void setMsgDeadline() { if (TaskContext.containsTaskContext("__messagedeadline__")) { long deadline = Long.parseLong((String) TaskContext.getTaskContext().get("__messagedeadline__")); - if (deadline < System.currentTimeMillis()) { + if (deadline < System.currentTimeMillis() + 1000) { TaskContext.getTaskContext().put("__messagedeadline__", String.valueOf(deadline + TimeUtils.parseTimeInMillis("30m"))); TaskContext.getTaskContext().put("__messagetimeout__", String.valueOf(TimeUtils.parseTimeInMillis("30m"))); } From 85b7e974e6f9d51e1a60ae69070db4ba2024fc9e Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 5 Dec 2024 11:34:58 +0800 Subject: [PATCH 215/737] [doc]: Add HwMonitorStatus groovy doc - Throw exception if no example fields found - Fix groovy doc file not found issue - Fix rest doc generator - Fix sshkey api example - Add role state groovy doc - Add role ref inventory groovy doc - Fix missing example in APICleanUpStorageTrashOnPrimaryStorageMsg - Fix L2NetworkData doc - Fix vm capabilities - Fix missing field in example - Fix acl missing example methods - Fix zbox example Resolves: ZSTAC-71188 Change-Id: I616862627461797976696e76636b6e6766776b73 --- .../JsonLabelInventoryDoc_zh_cn.groovy | 46 +++++++++++++++++++ .../org/zstack/header/host/HostNUMANode.java | 13 ++++++ .../host/HwMonitorStatusDoc_zh_cn.groovy | 27 +++++++++++ .../RolePolicyRefInventoryDoc_zh_cn.groovy | 31 +++++++++++++ .../identity/role/RoleStateDoc_zh_cn.groovy | 19 ++++++++ ...n.groovy => L2NetworkDataDoc_zh_cn.groovy} | 3 -- ...IDetachNetworkServiceFromL3NetworkMsg.java | 2 +- ...ICleanUpImageCacheOnPrimaryStorageMsg.java | 2 - ...anUpStorageTrashOnPrimaryStorageEvent.java | 6 +++ ...leanUpStorageTrashOnPrimaryStorageMsg.java | 6 +++ .../header/vm/VmCapabilitiesDoc_zh_cn.groovy | 33 +++++++++++++ ...hangeAccessControlListRedirectRuleMsg.java | 7 +++ .../sshkeypair/APIUpdateSshKeyPairMsg.java | 1 + .../scripts/RestDocumentationGenerator.groovy | 40 ++++++++++++++-- 14 files changed, 226 insertions(+), 10 deletions(-) create mode 100644 core/src/main/java/org/zstack/core/jsonlabel/JsonLabelInventoryDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/host/HwMonitorStatusDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/identity/role/RolePolicyRefInventoryDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/identity/role/RoleStateDoc_zh_cn.groovy rename header/src/main/java/org/zstack/header/network/l2/{L2NetworkDateDoc_zh_cn.groovy => L2NetworkDataDoc_zh_cn.groovy} (95%) create mode 100644 header/src/main/java/org/zstack/header/vm/VmCapabilitiesDoc_zh_cn.groovy diff --git a/core/src/main/java/org/zstack/core/jsonlabel/JsonLabelInventoryDoc_zh_cn.groovy b/core/src/main/java/org/zstack/core/jsonlabel/JsonLabelInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..a8758699511 --- /dev/null +++ b/core/src/main/java/org/zstack/core/jsonlabel/JsonLabelInventoryDoc_zh_cn.groovy @@ -0,0 +1,46 @@ +package org.zstack.core.jsonlabel + +import java.sql.Timestamp + +doc { + + title "JsonLabelInventory的数据结构" + + field { + name "id" + desc "唯一标识符" + type "long" + since "4.2.0" + } + field { + name "labelKey" + desc "标签键" + type "String" + since "4.2.0" + } + field { + name "labelValue" + desc "标签值" + type "String" + since "4.2.0" + } + field { + name "resourceUuid" + desc "资源UUID" + type "String" + since "4.2.0" + } + field { + name "createDate" + desc "创建时间" + type "Timestamp" + since "4.2.0" + } + field { + name "lastOpDate" + desc "最后操作时间" + type "Timestamp" + since "4.2.0" + } +} + diff --git a/header/src/main/java/org/zstack/header/host/HostNUMANode.java b/header/src/main/java/org/zstack/header/host/HostNUMANode.java index 58d484538bd..733a90cc828 100644 --- a/header/src/main/java/org/zstack/header/host/HostNUMANode.java +++ b/header/src/main/java/org/zstack/header/host/HostNUMANode.java @@ -2,6 +2,8 @@ import java.util.List; +import static org.zstack.utils.CollectionDSL.list; + public class HostNUMANode { public List distance; public List cpus; @@ -57,4 +59,15 @@ public List getVMsUuid() { public void setVMsUuid(List VMsUuid) { this.VMsUuid = VMsUuid; } + + public static HostNUMANode __example__() { + HostNUMANode node = new HostNUMANode(); + node.setNodeID("1"); + node.setDistance(list("0", "1")); + node.setCpus(list("0", "1")); + node.setFree(1L); + node.setSize(2L); + node.setVMsUuid(list("vm-1", "vm-2")); + return node; + } } diff --git a/header/src/main/java/org/zstack/header/host/HwMonitorStatusDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/host/HwMonitorStatusDoc_zh_cn.groovy new file mode 100644 index 00000000000..b31e5718c9f --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/HwMonitorStatusDoc_zh_cn.groovy @@ -0,0 +1,27 @@ +package org.zstack.header.host + + + +doc { + + title "硬件监控状态" + + field { + name "Normal" + desc "正常状态" + type "HwMonitorStatus" + since "5.3.6" + } + field { + name "Error" + desc "错误状态" + type "HwMonitorStatus" + since "5.3.6" + } + field { + name "Unknown" + desc "未知状态" + type "HwMonitorStatus" + since "5.3.6" + } +} diff --git a/header/src/main/java/org/zstack/header/identity/role/RolePolicyRefInventoryDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/identity/role/RolePolicyRefInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..3e4a7b81078 --- /dev/null +++ b/header/src/main/java/org/zstack/header/identity/role/RolePolicyRefInventoryDoc_zh_cn.groovy @@ -0,0 +1,31 @@ +package org.zstack.header.identity.role + +doc { + + title "角色策略引用清单" + + field { + name "roleUuid" + desc "角色的UUID" + type "String" + since "2.4.0" + } + field { + name "policyUuid" + desc "策略的UUID" + type "String" + since "2.4.0" + } + field { + name "createDate" + desc "创建日期" + type "Timestamp" + since "2.4.0" + } + field { + name "lastOpDate" + desc "最后操作日期" + type "Timestamp" + since "2.4.0" + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/identity/role/RoleStateDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/identity/role/RoleStateDoc_zh_cn.groovy new file mode 100644 index 00000000000..88d0e15d4bb --- /dev/null +++ b/header/src/main/java/org/zstack/header/identity/role/RoleStateDoc_zh_cn.groovy @@ -0,0 +1,19 @@ +package org.zstack.header.identity.role + +doc { + + title "角色状态" + + field { + name "name" + desc "角色启用状态" + type "String" + since "2.4.0" + } + field { + name "ordinal" + desc "" + type "int" + since "2.4.0" + } +} diff --git a/header/src/main/java/org/zstack/header/network/l2/L2NetworkDateDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/network/l2/L2NetworkDataDoc_zh_cn.groovy similarity index 95% rename from header/src/main/java/org/zstack/header/network/l2/L2NetworkDateDoc_zh_cn.groovy rename to header/src/main/java/org/zstack/header/network/l2/L2NetworkDataDoc_zh_cn.groovy index e802c717665..b2a1214b032 100644 --- a/header/src/main/java/org/zstack/header/network/l2/L2NetworkDateDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/network/l2/L2NetworkDataDoc_zh_cn.groovy @@ -1,8 +1,5 @@ package org.zstack.header.network.l2 -import java.sql.Timestamp -import java.sql.Timestamp - doc { title "二层网络结构" diff --git a/header/src/main/java/org/zstack/header/network/service/APIDetachNetworkServiceFromL3NetworkMsg.java b/header/src/main/java/org/zstack/header/network/service/APIDetachNetworkServiceFromL3NetworkMsg.java index ce54ba424e7..00f2b148e2e 100755 --- a/header/src/main/java/org/zstack/header/network/service/APIDetachNetworkServiceFromL3NetworkMsg.java +++ b/header/src/main/java/org/zstack/header/network/service/APIDetachNetworkServiceFromL3NetworkMsg.java @@ -72,7 +72,7 @@ public static APIDetachNetworkServiceFromL3NetworkMsg __example__() { msg.setL3NetworkUuid(uuid()); msg.setNetworkServices(m); - + msg.setService("PortForwarding"); return msg; } diff --git a/header/src/main/java/org/zstack/header/storage/primary/APICleanUpImageCacheOnPrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/primary/APICleanUpImageCacheOnPrimaryStorageMsg.java index 0604aa016c3..981f6ad1943 100755 --- a/header/src/main/java/org/zstack/header/storage/primary/APICleanUpImageCacheOnPrimaryStorageMsg.java +++ b/header/src/main/java/org/zstack/header/storage/primary/APICleanUpImageCacheOnPrimaryStorageMsg.java @@ -41,8 +41,6 @@ public String getPrimaryStorageUuid() { return uuid; } - - public static APICleanUpImageCacheOnPrimaryStorageMsg __example__() { APICleanUpImageCacheOnPrimaryStorageMsg msg = new APICleanUpImageCacheOnPrimaryStorageMsg(); msg.setUuid(uuid()); diff --git a/header/src/main/java/org/zstack/header/storage/primary/APICleanUpStorageTrashOnPrimaryStorageEvent.java b/header/src/main/java/org/zstack/header/storage/primary/APICleanUpStorageTrashOnPrimaryStorageEvent.java index b7aaa80a30b..547b9da04ea 100644 --- a/header/src/main/java/org/zstack/header/storage/primary/APICleanUpStorageTrashOnPrimaryStorageEvent.java +++ b/header/src/main/java/org/zstack/header/storage/primary/APICleanUpStorageTrashOnPrimaryStorageEvent.java @@ -33,4 +33,10 @@ public APICleanUpStorageTrashOnPrimaryStorageEvent(String apiId) { public APICleanUpStorageTrashOnPrimaryStorageEvent() { } + + public static APICleanUpStorageTrashOnPrimaryStorageEvent __example__() { + APICleanUpStorageTrashOnPrimaryStorageEvent event = new APICleanUpStorageTrashOnPrimaryStorageEvent(); + event.setTotal(1); + return event; + } } diff --git a/header/src/main/java/org/zstack/header/storage/primary/APICleanUpStorageTrashOnPrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/primary/APICleanUpStorageTrashOnPrimaryStorageMsg.java index 19c910314e5..4d2b219d76b 100644 --- a/header/src/main/java/org/zstack/header/storage/primary/APICleanUpStorageTrashOnPrimaryStorageMsg.java +++ b/header/src/main/java/org/zstack/header/storage/primary/APICleanUpStorageTrashOnPrimaryStorageMsg.java @@ -37,4 +37,10 @@ public boolean isForce() { public void setForce(boolean force) { this.force = force; } + + public static APICleanUpStorageTrashOnPrimaryStorageMsg __example__() { + APICleanUpStorageTrashOnPrimaryStorageMsg msg = new APICleanUpStorageTrashOnPrimaryStorageMsg(); + msg.setUuid(uuid()); + return msg; + } } diff --git a/header/src/main/java/org/zstack/header/vm/VmCapabilitiesDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/vm/VmCapabilitiesDoc_zh_cn.groovy new file mode 100644 index 00000000000..a6d208d5d32 --- /dev/null +++ b/header/src/main/java/org/zstack/header/vm/VmCapabilitiesDoc_zh_cn.groovy @@ -0,0 +1,33 @@ +package org.zstack.header.vm + +import org.zstack.header.vm.VmCapabilities + +doc { + + title "云主机能力" + + field { + name "supportLiveMigration" + desc "是否支持热迁移" + type "boolean" + since "3.1.0" + } + field { + name "supportVolumeMigration" + desc "是否支持卷迁移" + type "boolean" + since "3.1.0" + } + field { + name "supportReimage" + desc "是否支持重装" + type "boolean" + since "3.1.0" + } + field { + name "supportMemorySnapshot" + desc "是否支持内存快照" + type "boolean" + since "3.1.0" + } +} diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/APIChangeAccessControlListRedirectRuleMsg.java b/plugin/acl/src/main/java/org/zstack/header/acl/APIChangeAccessControlListRedirectRuleMsg.java index f84f4e7e9ae..eab75961dfd 100644 --- a/plugin/acl/src/main/java/org/zstack/header/acl/APIChangeAccessControlListRedirectRuleMsg.java +++ b/plugin/acl/src/main/java/org/zstack/header/acl/APIChangeAccessControlListRedirectRuleMsg.java @@ -41,4 +41,11 @@ public void setName(String name) { public Result audit(APIMessage msg, APIEvent rsp) { return null; } + + public static APIChangeAccessControlListRedirectRuleMsg __example__() { + APIChangeAccessControlListRedirectRuleMsg msg = new APIChangeAccessControlListRedirectRuleMsg(); + msg.setUuid(uuid()); + msg.setName("redirectRule"); + return msg; + } } diff --git a/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIUpdateSshKeyPairMsg.java b/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIUpdateSshKeyPairMsg.java index d2d4881b576..a5c9c4607bb 100644 --- a/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIUpdateSshKeyPairMsg.java +++ b/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIUpdateSshKeyPairMsg.java @@ -53,6 +53,7 @@ public static APIUpdateSshKeyPairMsg __example__() { APIUpdateSshKeyPairMsg ret = new APIUpdateSshKeyPairMsg(); ret.name = "ssh-key-pair"; ret.description = "description"; + ret.uuid = uuid(); return ret; } diff --git a/rest/src/main/resources/scripts/RestDocumentationGenerator.groovy b/rest/src/main/resources/scripts/RestDocumentationGenerator.groovy index 3ff34227edc..4f8d5e81fc7 100755 --- a/rest/src/main/resources/scripts/RestDocumentationGenerator.groovy +++ b/rest/src/main/resources/scripts/RestDocumentationGenerator.groovy @@ -42,6 +42,7 @@ import javax.xml.bind.JAXBContext import javax.xml.bind.JAXBException import javax.xml.bind.Unmarshaller import java.lang.reflect.Field +import java.lang.reflect.InvocationTargetException import java.lang.reflect.Method import java.lang.reflect.Modifier import java.nio.file.Paths @@ -1242,7 +1243,13 @@ ${category(err)} } Doc createDoc(String docTemplatePath) { - Script script = new GroovyShell().parse(new File(docTemplatePath)) + Script script + try { + script = new GroovyShell().parse(new File(docTemplatePath)) + } catch (FileNotFoundException e) { + throw new CloudRuntimeException("cannot find doc template file[path:${docTemplatePath}]", e) + } + return createDocFromGroobyScript(script) } @@ -1543,7 +1550,13 @@ ${table.join("\n")} throw new CloudRuntimeException("__example__() of ${clz.name} must be declared as a static method") } - def example = m.invoke(null) + def example + try { + example = m.invoke(null) + } catch (InvocationTargetException e) { + throw new CloudRuntimeException("cannot generate the markdown document for the class[${clz.name}], the __example__() method has an error: ${e.getTargetException().printStackTrace()}") + } + DocUtils.removeApiUuidMap(example.class.name) @@ -1551,7 +1564,12 @@ ${table.join("\n")} example.validate() } - LinkedHashMap map = JSONObjectUtil.rehashObject(example, LinkedHashMap.class) + LinkedHashMap map + try { + map = JSONObjectUtil.rehashObject(example, LinkedHashMap.class) + } catch (IllegalStateException e) { + throw new CloudRuntimeException("cannot generate the markdown document for the class[${clz.name}], the __example__() method has an error: ${e.getMessage()}") + } List apiFields = getApiFieldsOfClass(clz) @@ -1572,6 +1590,7 @@ ${table.join("\n")} } catch (NoSuchMethodException e) { //throw new CloudRuntimeException("class[${clz.name}] doesn't have static __example__ method", e) logger.warn("class[${clz.name}] doesn't have static __example__ method") + return null } } @@ -1601,7 +1620,13 @@ ${table.join("\n")} Map allFields = getApiExampleOfTheClass(clz) - String urlPath = substituteUrl("${RestConstants.API_VERSION}${it}", allFields) + String urlPath + try { + urlPath = substituteUrl("${RestConstants.API_VERSION}${it}", allFields) + } catch (CloudRuntimeException e) { + logger.warn("Failed to substituteUrl for class ${clz.name} url ${it}, ${e.getMessage()}") + throw e + } if (!queryString) { def apiFields = getRequestBody() @@ -1679,6 +1704,9 @@ ${examples.join("\n")} // the API has a body Map apiFields = getApiExampleOfTheClass(clz) + if (apiFields == null) { + throw new CloudRuntimeException("cannot find the example of the class[${clz.name}]") + } List urlVars = getVarNamesFromUrl(at.path()) apiFields = apiFields.findAll { k, v -> !urlVars.contains(k) } return [(paramName): apiFields] @@ -1950,6 +1978,10 @@ ${pythonSdk()} String txt = resolvedRefs[it._clz] if (txt == null) { + if (it._clz == null) { + throw new CloudRuntimeException("cannot find the class[${it._name}]") + } + String path = getDocTemplatePathFromClass(it._clz) Doc refDoc = createDoc(path) def dmd = new DataStructMarkDown(it._clz, refDoc) From 4b2223ca39ad1b3535523696e58698372f78de31 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 31 Dec 2024 16:25:57 +0800 Subject: [PATCH 216/737] [compute]: Throw exception if init any system tag failed Resolves: ZSTAC-71989 Change-Id: I71786d736167617a6d686174737566736d71786a --- .../zstack/compute/vm/VmInstanceManagerImpl.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java index 7a1737642cc..6ac43654d15 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java @@ -1195,12 +1195,21 @@ public void setup() { } flow(new Flow() { - List errorCodes = Collections.emptyList(); + List errorCodes = new ArrayList<>(); String __name__ = String.format("instantiate-systemTag-for-vm-%s", finalVo.getUuid()); @Override public void run(FlowTrigger trigger, Map data) { - instantiateTagsForCreateMessage(msg, cmsg, finalVo); + try { + instantiateTagsForCreateMessage(msg, cmsg, finalVo); + } catch (Exception e) { + errorCodes.add(operr("instantiate system tag for vm failed because %s", e.getMessage())); + } + if (!errorCodes.isEmpty()) { + trigger.fail(errorCodes.get(0)); + return; + } + errorCodes = extEmitterHandleSystemTag(msg, cmsg, finalVo); if (!errorCodes.isEmpty()) { trigger.fail(operr("handle system tag fail when creating vm because [%s]", From ef36a2b992a58270f81ffc23dd8584f977ad5385 Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Mon, 23 Dec 2024 14:17:31 +0800 Subject: [PATCH 217/737] [agent]: support agent memory monitoring and alarm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、support agent memory monitoring and alarm 2、support automatic dump of thread stack and tracking of objects when the memory continues to increase 3、automatically restart the process when the memory exceeds the threshold Resolves/Related: ZSTAC-71000 Change-Id: I676f656f6f6d6b6565656e737677666667767170 --- conf/globalConfig/kvm.xml | 16 ++ .../java/org/zstack/core/CoreManagerImpl.java | 4 + .../zstack/header/core/GetLocalTaskMsg.java | 9 + .../header/host/HostCanonicalEvents.java | 41 ++++ .../java/org/zstack/kvm/KVMAgentCommands.java | 50 +++++ .../main/java/org/zstack/kvm/KVMConstant.java | 3 +- .../java/org/zstack/kvm/KVMGlobalConfig.java | 8 +- .../src/main/java/org/zstack/kvm/KVMHost.java | 189 +++++++++++++++++- .../java/org/zstack/kvm/KVMHostFactory.java | 51 ++++- .../org/zstack/kvm/RestartKvmAgentMsg.java | 26 +++ .../org/zstack/kvm/RestartKvmAgentReply.java | 6 + .../integration/kvm/host/KVMPingCase.groovy | 6 + test/src/test/resources/globalConfig/kvm.xml | 16 ++ 13 files changed, 411 insertions(+), 14 deletions(-) create mode 100644 plugin/kvm/src/main/java/org/zstack/kvm/RestartKvmAgentMsg.java create mode 100644 plugin/kvm/src/main/java/org/zstack/kvm/RestartKvmAgentReply.java diff --git a/conf/globalConfig/kvm.xml b/conf/globalConfig/kvm.xml index 771709113ce..f600dbb12bc 100755 --- a/conf/globalConfig/kvm.xml +++ b/conf/globalConfig/kvm.xml @@ -257,4 +257,20 @@ 1800 java.lang.Integer + + + kvm + kvmagent.physicalmemory.usage.alarm.threshold + The threshold for the physical memory usage of the kvmagent process, exceeding which an alarm will be triggered. + 2147483648 + java.lang.Long + + + + kvm + kvmagent.physicalmemory.usage.hardlimit + The hard limit for the physical memory usage of the kvmagent process, exceeding this value will trigger a kvmagent restart. + 10737418240 + java.lang.Long + diff --git a/core/src/main/java/org/zstack/core/CoreManagerImpl.java b/core/src/main/java/org/zstack/core/CoreManagerImpl.java index 25a4c050298..dd8fd8a394d 100644 --- a/core/src/main/java/org/zstack/core/CoreManagerImpl.java +++ b/core/src/main/java/org/zstack/core/CoreManagerImpl.java @@ -22,6 +22,7 @@ import org.zstack.utils.logging.CLogger; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.function.Function; @@ -136,6 +137,9 @@ private void handle(GetLocalTaskMsg msg) { GetLocalTaskReply reply = new GetLocalTaskReply(); Map results = msg.getSyncSignatures().stream() .collect(Collectors.toMap(Function.identity(), thdf::getChainTaskInfo)); + if (msg.isOnlyRunningTask()) { + results.values().forEach(c -> c.getPendingTask().clear()); + } reply.setResults(results); bus.reply(msg, reply); } diff --git a/header/src/main/java/org/zstack/header/core/GetLocalTaskMsg.java b/header/src/main/java/org/zstack/header/core/GetLocalTaskMsg.java index 9e41fd36b3b..6a7675b52ac 100644 --- a/header/src/main/java/org/zstack/header/core/GetLocalTaskMsg.java +++ b/header/src/main/java/org/zstack/header/core/GetLocalTaskMsg.java @@ -6,6 +6,15 @@ public class GetLocalTaskMsg extends NeedReplyMessage { private List syncSignatures; + private boolean onlyRunningTask; + + public boolean isOnlyRunningTask() { + return onlyRunningTask; + } + + public void setOnlyRunningTask(boolean onlyRunningTask) { + this.onlyRunningTask = onlyRunningTask; + } public void setSyncSignatures(List syncSignatures) { this.syncSignatures = syncSignatures; diff --git a/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java b/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java index 553f1753eaa..96006cf1185 100755 --- a/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java +++ b/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java @@ -30,6 +30,7 @@ public class HostCanonicalEvents { public static final String HOST_PHYSICAL_RAID_STATUS_ABNORMAL = "/host/physicalRaid/status/abnormal"; public static final String HOST_PHYSICAL_HBA_STATE_ABNORMAL = "/host/physicalHBA/state/abnormal"; public static final String HOST_PHYSICAL_VOLUME_STATE_ABNORMAL = "/host/physicalVolume/state/abnormal"; + public static final String HOST_PROCESS_PHYSICAL_MEMORY_USAGE_ABNORMAL = "/host/process/physicalMemory/usage/abnormal"; @NeedJsonSchema public static class HostPhysicalHbaPortStateAbnormalData { @@ -660,4 +661,44 @@ public void setInterfaceStatus(String interfaceStatus) { this.interfaceStatus = interfaceStatus; } } + + @NeedJsonSchema + public static class HostProcessPhysicalMemoryUsageAlarmData { + private String hostUuid; + private String pid; + private String processName; + private String memoryUsage; + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getProcessName() { + return processName; + } + + public void setProcessName(String processName) { + this.processName = processName; + } + + public String getMemoryUsage() { + return memoryUsage; + } + + public void setMemoryUsage(String memoryUsage) { + this.memoryUsage = memoryUsage; + } + } } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index 3efb666947a..dbcaaeddea2 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -358,6 +358,8 @@ public void setQemuVersion(String qemuVersion) { public static class PingCmd extends AgentCommand { public String hostUuid; + public long kvmagentPhysicalMemoryUsageAlarmThreshold; + public long kvmagentPhysicalMemoryUsageHardLimit; } public static class PingResponse extends AgentResponse { @@ -4793,4 +4795,52 @@ public void setAdditionalProperties(Map additionalProperties) { } } + public static class HostProcessPhysicalMemoryUsageAlarmCmd { + private String hostUuid; + private String pid; + private String processName; + private long memoryUsage; + private Map additionalProperties = new HashMap<>(); + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getProcessName() { + return processName; + } + + public void setProcessName(String processName) { + this.processName = processName; + } + + public long getMemoryUsage() { + return memoryUsage; + } + + public void setMemoryUsage(long memoryUsage) { + this.memoryUsage = memoryUsage; + } + + public Map getAdditionalProperties() { + return additionalProperties; + } + + public void setAdditionalProperties(Map additionalProperties) { + this.additionalProperties = additionalProperties; + } + } + } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java index 9d1e90b0344..be6c09fad83 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java @@ -125,7 +125,8 @@ public interface KVMConstant { String HOST_PHYSICAL_DISK_REMOVE_ALARM_EVENT = "/host/physical/disk/remove/alarm"; String HOST_PHYSICAL_MEMORY_ECC_ERROR_ALARM_EVENT = "/host/physical/memory/ecc/error/alarm"; String HOST_PHYSICAL_GPU_REMOVE_ALARM_EVENT = "/host/physical/gpu/remove/alarm"; - String HOST_STORAGEDEVICE_HBA_STATE_EVENT = "/storagedevice/hba/state/alarm"; + String HOST_STORAGEDEVICE_HBA_STATE_EVENT = "/storagedevice/hba/state/alarm"; + String HOST_PROCESS_PHYSICAL_MEMORY_USAGE_ALARM_PATH = "/host/process/physicalMemory/usage/alarm"; String KVM_AGENT_OWNER = "kvm"; String ALI_REPO = "ali"; diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalConfig.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalConfig.java index cae4ea25bdc..933c3b7b384 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalConfig.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalConfig.java @@ -1,11 +1,9 @@ package org.zstack.kvm; -import org.zstack.core.GlobalProperty; import org.zstack.core.config.GlobalConfig; import org.zstack.core.config.GlobalConfigDef; import org.zstack.core.config.GlobalConfigDefinition; import org.zstack.core.config.GlobalConfigValidation; -import org.zstack.header.host.Host; import org.zstack.header.vm.VmInstanceVO; import org.zstack.header.volume.VolumeVO; import org.zstack.resourceconfig.BindResourceConfig; @@ -136,4 +134,10 @@ public class KVMGlobalConfig { @GlobalConfigDef(defaultValue = "false", description = "restart kvm host libvirtd service or not") @BindResourceConfig({HostVO.class, ClusterVO.class}) public static GlobalConfig RECONNECT_HOST_RESTART_LIBVIRTD_SERVICE = new GlobalConfig(CATEGORY, "reconnect.host.restart.libvirtd.service"); + + @GlobalConfigValidation + public static GlobalConfig KVMAGENT_PHYSICAL_MEMORY_USAGE_ALARM_THRESHOLD = new GlobalConfig(CATEGORY, "kvmagent.physicalmemory.usage.alarm.threshold"); + + @GlobalConfigValidation + public static GlobalConfig KVMAGENT_PHYSICAL_MEMORY_USAGE_HARD_LIMIT = new GlobalConfig(CATEGORY, "kvmagent.physicalmemory.usage.hardlimit"); } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 7f31002948d..d58cf3bd08f 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -17,8 +17,10 @@ import org.zstack.core.Platform; import org.zstack.core.agent.AgentConstant; import org.zstack.core.ansible.*; +import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.cloudbus.CloudBusGlobalProperty; +import org.zstack.core.cloudbus.ResourceDestinationMaker; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.config.GuestOsHelper; import org.zstack.core.config.schema.GuestOsCharacter; @@ -34,6 +36,7 @@ import org.zstack.core.upgrade.UpgradeGlobalConfig; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; +import org.zstack.core.workflow.SimpleFlowChain; import org.zstack.header.Constants; import org.zstack.header.allocator.DesignatedAllocateHostMsg; import org.zstack.header.allocator.HostAllocatorConstant; @@ -41,10 +44,9 @@ import org.zstack.header.cluster.ClusterInventory; import org.zstack.header.cluster.ClusterVO; import org.zstack.header.cluster.ReportHostCapacityMessage; -import org.zstack.header.core.AsyncLatch; -import org.zstack.header.core.Completion; -import org.zstack.header.core.NoErrorCompletion; -import org.zstack.header.core.ReturnValueCompletion; +import org.zstack.header.core.*; +import org.zstack.header.core.progress.ChainInfo; +import org.zstack.header.core.progress.TaskInfo; import org.zstack.header.core.progress.TaskProgressRange; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; @@ -102,6 +104,7 @@ import java.io.IOException; import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; import java.util.stream.Collectors; @@ -155,6 +158,8 @@ public class KVMHost extends HostBase implements Host { private AccountManager accountMgr; @Autowired private UpgradeChecker upgradeChecker; + @Autowired + private ResourceDestinationMaker destMaker; private KVMHostContext context; @@ -685,11 +690,185 @@ protected void handleLocalMessage(Message msg) { handle((CommitVolumeOnHypervisorMsg) msg); } else if (msg instanceof TakeVmConsoleScreenshotMsg) { handle((TakeVmConsoleScreenshotMsg) msg); + } else if (msg instanceof RestartKvmAgentMsg) { + handle((RestartKvmAgentMsg) msg); } else { super.handleLocalMessage(msg); } } + private void handle(RestartKvmAgentMsg msg) { + RestartKvmAgentReply reply = new RestartKvmAgentReply(); + thdf.singleFlightSubmit(new SingleFlightTask(msg) + .setSyncSignature(String.format("restart-kvmagent-on-host-%s", msg.getHostUuid())) + .run(completion -> { + if (!destMaker.isManagedByUs(msg.getHostUuid())) { + completion.fail(operr("host %s is not managed by current mn node", msg.getHostUuid())); + return; + } + + restartKvmAgentOnHost(msg.isForce(), new Completion(completion) { + @Override + public void success() { + completion.success(null); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + }).done(result -> { + if (!result.isSuccess()) { + reply.setError(result.getErrorCode()); + } + bus.reply(msg, reply); + }) + ); + } + + private void noRunningTaskOnHost(ReturnValueCompletion completion) { + String syncSignature = Host.buildId(self.getUuid()); + List nodeUuids = destMaker.getAllNodeInfo().stream().map(ResourceDestinationMaker.NodeInfo::getNodeUuid) + .collect(Collectors.toList()); + + AtomicBoolean queueIsEmpty = new AtomicBoolean(true); + new While<>(nodeUuids).step((mnId, compl) -> { + GetLocalTaskMsg gmsg = new GetLocalTaskMsg(); + gmsg.setOnlyRunningTask(true); + gmsg.setSyncSignatures(Collections.singletonList(syncSignature)); + bus.makeServiceIdByManagementNodeId(gmsg, CoreConstant.SERVICE_ID, mnId); + bus.send(gmsg, new CloudBusCallBack(compl) { + private String buildTaskInfo(List tasks) { + return tasks.stream().map(TaskInfo::getContext).collect(Collectors.joining("\n")); + } + + @Override + public void run(MessageReply r) { + if (!r.isSuccess()) { + compl.addError(r.getError()); + compl.allDone(); + return; + } + GetLocalTaskReply gr = r.castReply(); + ChainInfo chainInfo = gr.getResults().get(syncSignature); + if (!chainInfo.getRunningTask().isEmpty()) { + logger.debug(String.format("%s tasks exist on the running task of host %s, mnNodeId %s: %s...", chainInfo.getRunningTask().size(), + self.getUuid(), mnId, buildTaskInfo(chainInfo.getRunningTask()))); + queueIsEmpty.set(false); + compl.allDone(); + return; + } + compl.done(); + } + }); + }, 2).run(new WhileDoneCompletion(completion) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + completion.fail(errorCodeList); + return; + } + completion.success(queueIsEmpty.get()); + } + }); + } + + private void restartKvmAgentOnHost(boolean force, Completion completion) { + SimpleFlowChain chain = new SimpleFlowChain(); + chain.setChainName("try-restart-kvmagent-on-host-" + self.getUuid()); + chain.then(new Flow() { + // changing the host connection status to 'Connecting' is to prevent sending HTTP requests to the kvmagent, + // which needs to be done before checking the host task queue + String __name__ = "change host state to connecting"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (self.getStatus() != HostStatus.Connected) { + trigger.fail(operr("host %s is not connected, skip to restart kvmagent", self.getUuid())); + return; + } + changeConnectionState(HostStatusEvent.connecting); + trigger.next(); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + if (self.getStatus() == HostStatus.Connecting) { + changeConnectionState(HostStatusEvent.connected); + } + trigger.rollback(); + } + }).then(new NoRollbackFlow() { + String __name__ = "check if the host task queue is empty"; + @Override + public boolean skip(Map data) { + return force; + } + + @Override + public void run(FlowTrigger trigger, Map data) { + noRunningTaskOnHost(new ReturnValueCompletion(trigger) { + @Override + public void success(Boolean noTask) { + if (noTask) { + trigger.next(); + } else { + trigger.fail(operr("running task exists on host %s", self.getUuid())); + } + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = "restart kvmagent on host " + self.getUuid(); + @Override + public boolean skip(Map data) { + return CoreGlobalProperty.UNIT_TEST_ON; + } + + @Override + public void run(FlowTrigger trigger, Map data) { + SshShell sshShell = new SshShell(); + sshShell.setHostname(getSelf().getManagementIp()); + sshShell.setUsername(getSelf().getUsername()); + sshShell.setPassword(getSelf().getPassword()); + sshShell.setPort(getSelf().getPort()); + SshResult ret = sshShell.runCommand("sudo service zstack-kvmagent restart"); + + if (ret.isSshFailure() || ret.getReturnCode() != 0) { + trigger.fail(operr(ret.getExitErrorMessage())); + } else { + trigger.next(); + } + } + }).then(new NoRollbackFlow() { + String __name__ = String.format("reconnect host %s after restart kvmagent", self.getUuid()); + + public void run(FlowTrigger trigger, Map data) { + ReconnectHostMsg rmsg = new ReconnectHostMsg(); + rmsg.setHostUuid(self.getUuid()); + bus.makeTargetServiceIdByResourceUuid(rmsg, HostConstant.SERVICE_ID, self.getUuid()); + bus.send(rmsg); + trigger.next(); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); + } + private void handle(TakeVmConsoleScreenshotMsg msg) { TakeVmConsoleScreenshotReply reply = new TakeVmConsoleScreenshotReply(); thdf.singleFlightSubmit(new SingleFlightTask(msg) @@ -4644,6 +4823,8 @@ public void setup() { public void run(FlowTrigger trigger, Map data) { PingCmd cmd = new PingCmd(); cmd.hostUuid = self.getUuid(); + cmd.kvmagentPhysicalMemoryUsageAlarmThreshold = gcf.getConfigValue(KVMGlobalConfig.CATEGORY, KVMGlobalConfig.KVMAGENT_PHYSICAL_MEMORY_USAGE_ALARM_THRESHOLD.getName(), Long.class); + cmd.kvmagentPhysicalMemoryUsageHardLimit = gcf.getConfigValue(KVMGlobalConfig.CATEGORY, KVMGlobalConfig.KVMAGENT_PHYSICAL_MEMORY_USAGE_HARD_LIMIT.getName(), Long.class); restf.asyncJsonPost(pingPath, cmd, new JsonAsyncRESTCallback(trigger) { @Override public void fail(ErrorCode err) { diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java index af42c4316a8..d4299a83470 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java @@ -7,9 +7,14 @@ import org.zstack.compute.vm.CrashStrategy; import org.zstack.compute.vm.VmGlobalConfig; import org.zstack.compute.vm.VmNicManager; -import org.zstack.core.config.GuestOsExtensionPoint; +import org.zstack.core.asyncbatch.While; +import org.zstack.core.config.*; import org.zstack.core.config.schema.GuestOsCharacter; +import org.zstack.header.core.*; +import org.zstack.header.core.progress.ChainInfo; +import org.zstack.header.core.progress.TaskInfo; import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.network.l2.*; import org.zstack.header.tag.SystemTagInventory; import org.zstack.header.tag.SystemTagLifeCycleListener; @@ -22,10 +27,6 @@ import org.zstack.core.ansible.AnsibleFacade; import org.zstack.core.cloudbus.*; import org.zstack.core.componentloader.PluginRegistry; -import org.zstack.core.config.GlobalConfig; -import org.zstack.core.config.GlobalConfigException; -import org.zstack.core.config.GlobalConfigUpdateExtensionPoint; -import org.zstack.core.config.GlobalConfigValidatorExtensionPoint; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.core.db.SQL; @@ -76,6 +77,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -132,7 +134,8 @@ public class KVMHostFactory extends AbstractService implements HypervisorFactory private VmInstanceDeviceManager vidm; @Autowired private VmNicManager vmNicManager; - + @Autowired + private GlobalConfigFacade gcf; private Future checkSocketChannelTimeoutThread; @Override @@ -410,6 +413,20 @@ void physicalVolumeStateAlarmEvent(HostPhysicalDeviceStatusAlarmEventCmd cmd) { evf.fire(HostCanonicalEvents.HOST_PHYSICAL_VOLUME_STATE_ABNORMAL, cdata); } + private void processKvmagentPhysicalMemUsageAbnormal(HostProcessPhysicalMemoryUsageAlarmCmd cmd) { + if (cmd.getMemoryUsage() <= gcf.getConfigValue(KVMGlobalConfig.CATEGORY, + KVMGlobalConfig.KVMAGENT_PHYSICAL_MEMORY_USAGE_HARD_LIMIT.getName(), Long.class)) { + return; + } + + logger.debug("The zstack-kvmagent service has exceeded the hard limit for physical memory usage, " + + "and we will try restart it later"); + RestartKvmAgentMsg restartKvmAgentMsg = new RestartKvmAgentMsg(); + restartKvmAgentMsg.setHostUuid(cmd.getHostUuid()); + bus.makeTargetServiceIdByResourceUuid(restartKvmAgentMsg, HostConstant.SERVICE_ID, restartKvmAgentMsg.getHostUuid()); + bus.send(restartKvmAgentMsg); + } + @Override public boolean start() { deployAnsibleModule(); @@ -614,7 +631,27 @@ public String handleSyncHttpCall(TransmitVmOperationToMnCmd cmd) { return null; }); - restf.registerSyncHttpCallHandler(KVMConstant.HOST_PHYSICAL_DISK_INSERT_ALARM_EVENT, HostPhysicalDiskInsertAlarmEventCmd.class, cmd -> { + + restf.registerSyncHttpCallHandler(KVMConstant.HOST_PROCESS_PHYSICAL_MEMORY_USAGE_ALARM_PATH, HostProcessPhysicalMemoryUsageAlarmCmd.class, cmd -> { + HostCanonicalEvents.HostProcessPhysicalMemoryUsageAlarmData data = new HostCanonicalEvents.HostProcessPhysicalMemoryUsageAlarmData(); + data.setHostUuid(cmd.getHostUuid()); + data.setPid(cmd.getPid()); + data.setMemoryUsage(String.format("%s MB", cmd.getMemoryUsage() / 1048576)); + data.setProcessName(cmd.getProcessName()); + evf.fire(HostCanonicalEvents.HOST_PROCESS_PHYSICAL_MEMORY_USAGE_ABNORMAL, data); + + switch (data.getProcessName()) { + case "zstack-kvmagent": + processKvmagentPhysicalMemUsageAbnormal(cmd); + break; + default: + logger.debug(String.format("unknown process name[%s] in host[uuid:%s]", cmd.getProcessName(), cmd.getHostUuid())); + } + + return null; + }); + + restf.registerSyncHttpCallHandler(KVMConstant.HOST_PHYSICAL_DISK_INSERT_ALARM_EVENT, HostPhysicalDiskInsertAlarmEventCmd.class, cmd -> { HostCanonicalEvents.HostPhysicalDiskData cdata = new HostCanonicalEvents.HostPhysicalDiskData(); cdata.setHostUuid(cmd.host); cdata.setSerialNumber(cmd.additionalProperties.get(KVMConstant.DEVICE_SERIAL_NUMBER).toString()); diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/RestartKvmAgentMsg.java b/plugin/kvm/src/main/java/org/zstack/kvm/RestartKvmAgentMsg.java new file mode 100644 index 00000000000..008b653af7f --- /dev/null +++ b/plugin/kvm/src/main/java/org/zstack/kvm/RestartKvmAgentMsg.java @@ -0,0 +1,26 @@ +package org.zstack.kvm; + +import org.zstack.header.host.HostMessage; +import org.zstack.header.message.NeedReplyMessage; + +public class RestartKvmAgentMsg extends NeedReplyMessage implements HostMessage { + String hostUuid; + boolean force; + + public boolean isForce() { + return force; + } + + public void setForce(boolean force) { + this.force = force; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + @Override + public String getHostUuid() { + return hostUuid; + } +} diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/RestartKvmAgentReply.java b/plugin/kvm/src/main/java/org/zstack/kvm/RestartKvmAgentReply.java new file mode 100644 index 00000000000..e26f22981e0 --- /dev/null +++ b/plugin/kvm/src/main/java/org/zstack/kvm/RestartKvmAgentReply.java @@ -0,0 +1,6 @@ +package org.zstack.kvm; + +import org.zstack.header.message.MessageReply; + +public class RestartKvmAgentReply extends MessageReply { +} diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/host/KVMPingCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/host/KVMPingCase.groovy index 25697e33f4d..1709790ab08 100755 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/host/KVMPingCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/host/KVMPingCase.groovy @@ -6,6 +6,7 @@ import org.zstack.compute.host.HostManagerImpl import org.zstack.compute.host.HostReconnectTask import org.zstack.compute.host.HostTrackImpl import org.zstack.core.cloudbus.CloudBus +import org.zstack.core.config.GlobalConfigFacadeImpl import org.zstack.core.db.Q import org.zstack.core.db.SQL import org.zstack.header.core.NoErrorCompletion @@ -13,6 +14,7 @@ import org.zstack.header.errorcode.SysErrors import org.zstack.header.host.* import org.zstack.kvm.KVMAgentCommands import org.zstack.kvm.KVMConstant +import org.zstack.kvm.KVMGlobalConfig import org.zstack.kvm.KVMReconnectHostTask import org.zstack.sdk.ClusterInventory import org.zstack.sdk.HostInventory @@ -27,6 +29,7 @@ import java.util.concurrent.TimeUnit class KVMPingCase extends SubCase { EnvSpec env CloudBus bus + GlobalConfigFacadeImpl gcf @Override void clean() { @@ -100,6 +103,8 @@ class KVMPingCase extends SubCase { env.afterSimulator(KVMConstant.KVM_PING_PATH) { KVMAgentCommands.PingResponse rsp, HttpEntity e -> KVMAgentCommands.PingCmd cmd = JSONObjectUtil.toObject(e.getBody(), KVMAgentCommands.PingCmd.class) + assert cmd.kvmagentPhysicalMemoryUsageAlarmThreshold == gcf.getConfigValue(KVMGlobalConfig.CATEGORY, KVMGlobalConfig.KVMAGENT_PHYSICAL_MEMORY_USAGE_ALARM_THRESHOLD.getName(), Long.class); + assert cmd.kvmagentPhysicalMemoryUsageHardLimit == gcf.getConfigValue(KVMGlobalConfig.CATEGORY, KVMGlobalConfig.KVMAGENT_PHYSICAL_MEMORY_USAGE_HARD_LIMIT.getName(), Long.class); if (cmd.hostUuid == kvm1.uuid && !pingSuccess) { throw new RuntimeException("failure on purpose") @@ -458,6 +463,7 @@ class KVMPingCase extends SubCase { @Override void test() { bus = bean(CloudBus.class) + gcf = bean(GlobalConfigFacadeImpl.class) env.create { HostGlobalConfig.PING_HOST_INTERVAL.updateValue(1) diff --git a/test/src/test/resources/globalConfig/kvm.xml b/test/src/test/resources/globalConfig/kvm.xml index 5e20aefbe0f..6fb42631828 100755 --- a/test/src/test/resources/globalConfig/kvm.xml +++ b/test/src/test/resources/globalConfig/kvm.xml @@ -256,4 +256,20 @@ 3600 java.lang.Integer + + + kvm + kvmagent.physicalmemory.usage.alarm.threshold + The threshold for the physical memory usage of the kvmagent process, exceeding which an alarm will be triggered. + 2147483648 + java.lang.Long + + + + kvm + kvmagent.physicalmemory.usage.hardlimit + The hard limit for the physical memory usage of the kvmagent process, exceeding this value will trigger a kvmagent restart. + 10737418240 + java.lang.Long + From c3475ebae974b20597149bd1e17e2ef1e154e4e5 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Thu, 2 Jan 2025 17:44:18 +0800 Subject: [PATCH 218/737] [compute]: add vm mac schema: random or ip GlobalPropertyImpact Resolves: ZSTAC-72279 Change-Id: I6c717673656a79646e7877737966676e796a6970 --- .../org/zstack/compute/vm/MacOperator.java | 84 ++++++++++++++++++- .../zstack/compute/vm/VmAllocateNicFlow.java | 2 +- ...balProperty.java => VmGlobalProperty.java} | 4 +- .../compute/vm/VmInstanceManagerImpl.java | 4 +- .../compute/vm/VmMacAddressSchemaType.java | 16 ++++ .../org/zstack/compute/vm/VmNicFactory.java | 2 +- .../vm/VmPriorityUpgradeExtension.java | 4 +- .../ApplianceVmAllocateNicFlow.java | 3 +- ...VmPriorityUpgradeConfigExtensionPoint.java | 5 +- .../zstack/utils/network/NetworkUtils.java | 24 ------ 10 files changed, 111 insertions(+), 37 deletions(-) rename compute/src/main/java/org/zstack/compute/vm/{VmPriorityGlobalProperty.java => VmGlobalProperty.java} (76%) create mode 100644 compute/src/main/java/org/zstack/compute/vm/VmMacAddressSchemaType.java diff --git a/compute/src/main/java/org/zstack/compute/vm/MacOperator.java b/compute/src/main/java/org/zstack/compute/vm/MacOperator.java index 15bf4c1cf73..95d96c6fb41 100644 --- a/compute/src/main/java/org/zstack/compute/vm/MacOperator.java +++ b/compute/src/main/java/org/zstack/compute/vm/MacOperator.java @@ -3,18 +3,20 @@ import com.google.common.collect.Lists; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.Platform; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.header.errorcode.OperationFailureException; -import org.zstack.header.network.l3.*; import org.zstack.header.vm.*; import org.zstack.tag.PatternedSystemTag; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; +import org.zstack.utils.network.NetworkUtils; import java.math.BigInteger; import java.util.List; import java.util.Map; +import java.util.Random; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -28,6 +30,7 @@ public class MacOperator { private static final CLogger logger = Utils.getLogger(MacOperator.class); private static final Pattern pattern = Pattern.compile("([a-f0-9]{2}:){5}[a-f0-9]{2}"); + private static final Random random = new Random(); class VmMacStruct { private String l3Uuid; @@ -105,4 +108,83 @@ public boolean checkDuplicateMac(String hypervisorType, String mac) { .notEq(VmNicVO_.state, VmNicState.disable) .isExists(); } + + public static String generateMacWithDeviceId(short deviceId) { + VmMacAddressSchemaType type; + try { + type = VmMacAddressSchemaType.valueOf(VmGlobalProperty.vmMacAddressSchema.toLowerCase()); + } catch (Exception e) { + type = VmMacAddressSchemaType.Random; + } + + switch (type) { + case Ip: + return generateMacWithDeviceIdIp(deviceId); + case Random: + default: + return generateMacWithDeviceIdRandom(deviceId); + } + } + + public static String generateMacWithDeviceIdIp(short deviceId) { + String mgtIp = Platform.getManagementServerIp(); + if (!NetworkUtils.isIpv4Address(mgtIp)) { + return generateMacWithDeviceIdRandom(deviceId); + } + + /* encode mgt ip address into mac address: for example, + * mgt ip is: 172.24.0.81, its hex string: AC 18 0 51, + * so mac address will look like: 18:00:51:xx:xx:yy + * xx:xx are random. yy is device ID */ + int mgtIpL = (int)NetworkUtils.ipv4StringToLong(mgtIp); + String mgtIpStr = Integer.toHexString(mgtIpL); + if (mgtIpStr.length() < 8) { + String compensate = StringUtils.repeat("0", 8 - mgtIpStr.length()); + mgtIpStr = compensate + mgtIpStr; + } + + StringBuilder sb = new StringBuilder(mgtIpStr.substring(2, 4)).append(":"); + sb.append(mgtIpStr, 4, 6).append(":"); + sb.append(mgtIpStr, 6, 8).append(":"); + + int seed = random.nextInt(); + String seedStr = Integer.toHexString(seed); + if (seedStr.length() < 4) { + String compensate = StringUtils.repeat("0", 4 - seedStr.length()); + seedStr = compensate + seedStr; + } + + sb.append(seedStr, 0, 2).append(":"); + sb.append(seedStr, 2, 4).append(":"); + String deviceIdStr = Integer.toHexString(deviceId); + if (deviceIdStr.length() < 2) { + deviceIdStr = "0" + deviceIdStr; + } + sb.append(deviceIdStr); + return sb.toString(); + } + + public static String generateMacWithDeviceIdRandom(short deviceId) { + int seed = random.nextInt(); + String seedStr = Integer.toHexString(seed); + if (seedStr.length() < 8) { + String compensate = StringUtils.repeat("0", 8 - seedStr.length()); + seedStr = compensate + seedStr; + } + String octet2 = seedStr.substring(0, 2); + String octet3 = seedStr.substring(2, 4); + String octet4 = seedStr.substring(4, 6); + String octet5 = seedStr.substring(6, 8); + StringBuilder sb = new StringBuilder("fa").append(":"); + sb.append(octet2).append(":"); + sb.append(octet3).append(":"); + sb.append(octet4).append(":"); + sb.append(octet5).append(":"); + String deviceIdStr = Integer.toHexString(deviceId); + if (deviceIdStr.length() < 2) { + deviceIdStr = "0" + deviceIdStr; + } + sb.append(deviceIdStr); + return sb.toString(); + } } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java index 365e6d6d13f..bafd101280a 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java @@ -101,7 +101,7 @@ public void run(final FlowTrigger trigger, final Map data) { mo.deleteCustomMacSystemTag(spec.getVmInventory().getUuid(), nw.getUuid(), customMac); customMac = customMac.toLowerCase(); } else { - customMac = NetworkUtils.generateMacWithDeviceId((short) deviceId); + customMac = MacOperator.generateMacWithDeviceId((short) deviceId); } final String mac = customMac; CustomNicOperator nicOperator = new CustomNicOperator(spec.getVmInventory().getUuid(),nw.getUuid()); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmPriorityGlobalProperty.java b/compute/src/main/java/org/zstack/compute/vm/VmGlobalProperty.java similarity index 76% rename from compute/src/main/java/org/zstack/compute/vm/VmPriorityGlobalProperty.java rename to compute/src/main/java/org/zstack/compute/vm/VmGlobalProperty.java index 1e1ce074c68..0aace3b05b1 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmPriorityGlobalProperty.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmGlobalProperty.java @@ -8,10 +8,12 @@ * @ Date : Created in 14:22 2019/9/24 */ @GlobalPropertyDefinition -public class VmPriorityGlobalProperty { +public class VmGlobalProperty { @GlobalProperty(name="initRunningVmPriority", defaultValue = "false") public static boolean initRunningVmPriority; @GlobalProperty(name="initRunningApplianceVmPriority", defaultValue = "false") public static boolean initRunningApplianceVmPriority; + @GlobalProperty(name="vmMacAddressSchema", defaultValue = "random") + public static String vmMacAddressSchema; } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java index 7a1737642cc..77176432ea9 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java @@ -897,7 +897,7 @@ private void handle(APICreateVmNicMsg msg) { @Override public void run(FlowTrigger trigger, Map data) { int deviceId = 1; - String mac = NetworkUtils.generateMacWithDeviceId((short) deviceId); + String mac = MacOperator.generateMacWithDeviceId((short) deviceId); nic.setUuid(Platform.getUuid()); nic.setMac(mac); nic.setDeviceId(deviceId); @@ -928,7 +928,7 @@ protected void scripts() { "The error[Duplicate entry] printed by jdbc.spi.SqlExceptionHelper is no harm, " + "we will try finding another mac", nicVO.getMac())); logger.trace("", e); - nicVO.setMac(NetworkUtils.generateMacWithDeviceId((short) nicVO.getDeviceId())); + nicVO.setMac(MacOperator.generateMacWithDeviceId((short) nicVO.getDeviceId())); } else { throw e; } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmMacAddressSchemaType.java b/compute/src/main/java/org/zstack/compute/vm/VmMacAddressSchemaType.java new file mode 100644 index 00000000000..e8d72a94c7a --- /dev/null +++ b/compute/src/main/java/org/zstack/compute/vm/VmMacAddressSchemaType.java @@ -0,0 +1,16 @@ +package org.zstack.compute.vm; + +public enum VmMacAddressSchemaType { + Random("random"), + Ip("ip"); + + private VmMacAddressSchemaType(String type) { + this.type = type; + } + + private final String type; + + public String getType() { + return type; + } +} diff --git a/compute/src/main/java/org/zstack/compute/vm/VmNicFactory.java b/compute/src/main/java/org/zstack/compute/vm/VmNicFactory.java index 9c48f66c0f9..cdf14d1e068 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmNicFactory.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmNicFactory.java @@ -66,7 +66,7 @@ public VmNicVO persistAndRetryIfMacCollision(VmNicVO vo) { "The error[Duplicate entry] printed by jdbc.spi.SqlExceptionHelper is no harm, " + "we will try finding another mac", vo.getMac())); logger.trace("", e); - vo.setMac(NetworkUtils.generateMacWithDeviceId((short) vo.getDeviceId())); + vo.setMac(MacOperator.generateMacWithDeviceId((short) vo.getDeviceId())); } else { throw e; } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmPriorityUpgradeExtension.java b/compute/src/main/java/org/zstack/compute/vm/VmPriorityUpgradeExtension.java index 11f1253b0db..f182c443925 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmPriorityUpgradeExtension.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmPriorityUpgradeExtension.java @@ -9,14 +9,12 @@ import org.zstack.header.tag.SystemTagVO; import org.zstack.header.tag.SystemTagVO_; import org.zstack.header.vm.*; -import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; /** * @ Author : yh.w @@ -96,7 +94,7 @@ public void run(MessageReply reply) { } private void initRunningVmPriority() { - if (!VmPriorityGlobalProperty.initRunningVmPriority) { + if (!VmGlobalProperty.initRunningVmPriority) { return; } diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmAllocateNicFlow.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmAllocateNicFlow.java index f9ce38942e8..452e27c222d 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmAllocateNicFlow.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmAllocateNicFlow.java @@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; import org.springframework.transaction.annotation.Transactional; +import org.zstack.compute.vm.MacOperator; import org.zstack.compute.vm.VmInstanceManager; import org.zstack.compute.vm.VmNicManager; import org.zstack.core.Platform; @@ -86,7 +87,7 @@ private VmNicInventory makeNicInventory(VmInstanceSpec vmSpec, ApplianceVmNicSpe inv.setDeviceId(deviceId[0]); inv.setMetaData(nicSpec.getMetaData()); inv.setInternalName(VmNicVO.generateNicInternalName(vmSpec.getVmInventory().getInternalId(), inv.getDeviceId())); - inv.setMac(NetworkUtils.generateMacWithDeviceId((short) inv.getDeviceId())); + inv.setMac(MacOperator.generateMacWithDeviceId((short) inv.getDeviceId())); inv.setHypervisorType(vmSpec.getVmInventory().getHypervisorType()); inv.setDriverType(ImagePlatform.valueOf(vmSpec.getVmInventory().getPlatform()).isParaVirtualization() ? nicManager.getDefaultPVNicDriver() : nicManager.getDefaultNicDriver()); diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmPriorityUpgradeConfigExtensionPoint.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmPriorityUpgradeConfigExtensionPoint.java index ea511d8cb56..354a68e340c 100644 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmPriorityUpgradeConfigExtensionPoint.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmPriorityUpgradeConfigExtensionPoint.java @@ -1,13 +1,12 @@ package org.zstack.appliancevm; import org.springframework.beans.factory.annotation.Autowired; -import org.zstack.compute.vm.VmPriorityGlobalProperty; +import org.zstack.compute.vm.VmGlobalProperty; import org.zstack.compute.vm.VmPriorityOperator; import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.*; import org.zstack.core.db.Q; import org.zstack.header.Component; -import org.zstack.header.core.NopeNoErrorCompletion; import org.zstack.header.core.NopeWhileDoneCompletion; import org.zstack.header.core.WhileCompletion; import org.zstack.header.errorcode.ErrorCode; @@ -103,7 +102,7 @@ public void run(MessageReply reply) { } private void initRunningApplianceVmPriority() { - if (!VmPriorityGlobalProperty.initRunningApplianceVmPriority) { + if (!VmGlobalProperty.initRunningApplianceVmPriority) { return; } diff --git a/utils/src/main/java/org/zstack/utils/network/NetworkUtils.java b/utils/src/main/java/org/zstack/utils/network/NetworkUtils.java index 50986c603e8..8ebb2f754d8 100755 --- a/utils/src/main/java/org/zstack/utils/network/NetworkUtils.java +++ b/utils/src/main/java/org/zstack/utils/network/NetworkUtils.java @@ -387,30 +387,6 @@ public static String getIpAddressByName(String hostName) throws UnknownHostExcep return ia.getHostAddress(); } - public static String generateMacWithDeviceId(short deviceId) { - int seed = random.nextInt(); - String seedStr = Integer.toHexString(seed); - if (seedStr.length() < 8) { - String compensate = StringUtils.repeat("0", 8 - seedStr.length()); - seedStr = compensate + seedStr; - } - String octet2 = seedStr.substring(0, 2); - String octet3 = seedStr.substring(2, 4); - String octet4 = seedStr.substring(4, 6); - String octet5 = seedStr.substring(6, 8); - StringBuilder sb = new StringBuilder("fa").append(":"); - sb.append(octet2).append(":"); - sb.append(octet3).append(":"); - sb.append(octet4).append(":"); - sb.append(octet5).append(":"); - String deviceIdStr = Integer.toHexString(deviceId); - if (deviceIdStr.length() < 2) { - deviceIdStr = "0" + deviceIdStr; - } - sb.append(deviceIdStr); - return sb.toString(); - } - public static List> findConsecutiveIpRange(Collection ips) { List> ret = new ArrayList>(); if (ips.isEmpty()) { From 55f3d74b8d9ad85da8b8cb45aeb5a4b7765db1f5 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 3 Jan 2025 14:48:41 +0800 Subject: [PATCH 219/737] [conf]: Fix Yolo duplicate AI:: model tags DBImpact Resolves: ZSTAC-70110 Change-Id: I7372787a6b757467646c76667279706f796b6677 --- conf/db/upgrade/V5.3.20__schema.sql | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.3.20__schema.sql b/conf/db/upgrade/V5.3.20__schema.sql index 27bd4953e80..7f7aea3591b 100644 --- a/conf/db/upgrade/V5.3.20__schema.sql +++ b/conf/db/upgrade/V5.3.20__schema.sql @@ -19,4 +19,7 @@ SELECT (@row_number := @row_number + 1) as hostId, e.defaultProtocol as protocol FROM PrimaryStorageHostRefVO p LEFT JOIN ExternalPrimaryStorageVO e ON p.primaryStorageUuid = e.uuid -ORDER BY p.id; \ No newline at end of file +ORDER BY p.id; + +-- Delete old UserTagVO of AI::Image-Generation +DELETE FROM UserTagVO WHERE uuid = 'a7ec68923efe447d9119ba7b6df2b54c'; From d118e7d5b83b73db8df0465f50f795e40c24621a Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 6 Jan 2025 15:40:14 +0800 Subject: [PATCH 220/737] [sdk]: Update sdk Resolves: ZSTAC-72314 Change-Id: I776c656865657673726d6e73746a6b726675776a --- .../sdk/DeleteModelEvaluationTasksAction.java | 101 ++++++++++++++++++ .../sdk/DeleteModelEvaluationTasksResult.java | 7 ++ .../java/org/zstack/testlib/ApiHelper.groovy | 29 ++++- 3 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksResult.java diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksAction.java new file mode 100644 index 00000000000..37deb38410a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteModelEvaluationTasksAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeleteModelEvaluationTasksResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List uuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeleteModelEvaluationTasksResult value = res.getResult(org.zstack.sdk.DeleteModelEvaluationTasksResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteModelEvaluationTasksResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/model-evaluation-tasks"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksResult.java new file mode 100644 index 00000000000..5d1619bb4e1 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteModelEvaluationTasksResult { + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index a9e7ad2f150..706808b538f 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -14921,6 +14921,33 @@ abstract class ApiHelper { } + def deleteModelEvaluationTasks(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelEvaluationTasksAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteModelEvaluationTasksAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def deleteModelService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelServiceAction.class) Closure c) { def a = new org.zstack.sdk.DeleteModelServiceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -42890,7 +42917,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { From d14526f160de9067ab5cbd290cc415913023e313 Mon Sep 17 00:00:00 2001 From: J M Date: Wed, 11 Dec 2024 18:33:02 +0800 Subject: [PATCH 221/737] [storage]: handle volume installUrl changed 1. change volume snapshot reference after volume path changed 2. remove left volume snapshot reference record after overwrite volume. DBImpact Resolves: ZSTAC-66501 Change-Id: I6e6f706a66637873646a727a687667666e736467 --- conf/db/upgrade/V5.3.20__schema.sql | 7 ++ .../snapshot/VolumeSnapshotManagerImpl.java | 14 +--- .../VolumeSnapshotReferenceUtils.java | 65 +++++++++++++++++++ .../org/zstack/storage/volume/VolumeBase.java | 46 +++++++++++-- .../zstack/testlib/LocalStorageSpec.groovy | 9 +++ 5 files changed, 123 insertions(+), 18 deletions(-) diff --git a/conf/db/upgrade/V5.3.20__schema.sql b/conf/db/upgrade/V5.3.20__schema.sql index 7f7aea3591b..50bf5def2c6 100644 --- a/conf/db/upgrade/V5.3.20__schema.sql +++ b/conf/db/upgrade/V5.3.20__schema.sql @@ -23,3 +23,10 @@ ORDER BY p.id; -- Delete old UserTagVO of AI::Image-Generation DELETE FROM UserTagVO WHERE uuid = 'a7ec68923efe447d9119ba7b6df2b54c'; + +DELETE ref FROM `zstack`.`VolumeSnapshotReferenceVO` ref + INNER JOIN `zstack`.`VolumeEO` vol ON vol.uuid = ref.referenceVolumeUuid +WHERE ref.referenceType = 'VolumeVO' + AND ref.referenceVolumeUuid = ref.referenceUuid + AND ref.referenceInstallUrl NOT LIKE CONCAT('%', SUBSTRING_INDEX(vol.installPath, '/', -1), '%'); + diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java index e62b0433f3a..006ec27251b 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java @@ -1404,18 +1404,8 @@ public void innerOverwriteVolume(VolumeInventory originVolume, VolumeInventory t if (originVolumeDeletionPolicy != VolumeDeletionPolicyManager.VolumeDeletionPolicy.Direct) { return; } - boolean hasDirectBackingRef = Q.New(VolumeSnapshotReferenceVO.class) - .eq(VolumeSnapshotReferenceVO_.referenceVolumeUuid, originVolume.getUuid()) - .eq(VolumeSnapshotReferenceVO_.referenceType, VolumeVO.class.getSimpleName()) - .eq(VolumeSnapshotReferenceVO_.referenceInstallUrl, originVolume.getInstallPath()) - .eq(VolumeSnapshotReferenceVO_.referenceUuid, originVolume.getUuid()) - .isExists(); - - if (hasDirectBackingRef) { - SQL.New(VolumeSnapshotReferenceVO.class).eq(VolumeSnapshotReferenceVO_.referenceVolumeUuid, originVolume.getUuid()) - .set(VolumeSnapshotReferenceVO_.referenceVolumeUuid, transientVolume.getUuid()) - .update(); - } + + VolumeSnapshotReferenceUtils.handleVolumeOverwrite(originVolume, transientVolume.getUuid()); } @Override diff --git a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java index fa1289b6e12..ee69b3922d5 100644 --- a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java @@ -1,9 +1,13 @@ package org.zstack.storage.snapshot.reference; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.MapUtils; +import org.springframework.transaction.support.TransactionSynchronizationManager; import org.zstack.core.Platform; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.db.*; +import org.zstack.header.errorcode.OperationFailureException; +import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.image.ImageConstant; import org.zstack.header.image.ImageInventory; import org.zstack.header.storage.primary.ImageCacheVO; @@ -25,6 +29,8 @@ import java.util.*; import java.util.stream.Collectors; +import static org.zstack.core.Platform.operr; + public class VolumeSnapshotReferenceUtils { private static final CLogger logger = Utils.getLogger(VolumeSnapshotReferenceUtils.class); @@ -379,6 +385,65 @@ public static void handleVolumeDeletion(VolumeInventory volume) { } } + /*** + * handle volume or snapshot install path change, it MUST BE called in a TRANSACTION context, and the caller should + * ensure the volume or snapshot install path will be changed in this transaction. the whole API process MUST BE + * idempotent and safely interrupted without adverse effects. + * @param volumeUuid the volume install url changed, contains volume and snapshot + * @param oldAndNewPaths key is old path, value is new path + */ + public static void handleVolumeInstallUrlChange(String volumeUuid, Map oldAndNewPaths) { + if (!TransactionSynchronizationManager.isActualTransactionActive()) { + throw new CloudRuntimeException("handleVolumeInstallUrlChange must be called in a transaction context, " + + "and you should ensure the volume or snapshot install path will be changed in this transaction." + + "the whole API process MUST BE idempotent and safely interrupted without adverse effects."); + } + + if (MapUtils.isEmpty(oldAndNewPaths)) { + return; + } + + List refVols = getReferenceVolume(volumeUuid); + if (!refVols.isEmpty()) { + List infos = refVols.stream().map(v -> String.format("uuid:%s, name:%s", v.getUuid(), v.getName())).collect(Collectors.toList()); + throw new OperationFailureException(operr(" volume[uuid: %s] has been referenced by other volumes [%s], " + + "can not change install path before flatten them and their descendants ", volumeUuid, infos.toString())); + } + + VolumeSnapshotReferenceVO ref = getVolumeBackingRef(volumeUuid); + if (ref == null) { + return; + } + if (oldAndNewPaths.containsKey(ref.getReferenceInstallUrl())) { + SQL.New(VolumeSnapshotReferenceVO.class).eq(VolumeSnapshotReferenceVO_.id, ref.getId()) + .set(VolumeSnapshotReferenceVO_.referenceInstallUrl, oldAndNewPaths.get(ref.getReferenceInstallUrl())) + .update(); + + logger.debug(String.format("update volume snapshot reference[referUuid:%s, referVolumeUuid:%s] install path from %s to %s", + ref.getReferenceUuid(), ref.getReferenceVolumeUuid(), ref.getReferenceInstallUrl(), oldAndNewPaths.get(ref.getReferenceInstallUrl()))); + } else { + logger.warn(String.format("volume snapshot reference[referUuid:%s, referVolumeUuid:%s] install path %s not in oldAndNewPaths", + ref.getReferenceUuid(), ref.getReferenceVolumeUuid(), ref.getReferenceInstallUrl())); + } + } + + public static void handleVolumeOverwrite(VolumeInventory originVolume, String newVolumeUuid) { + if (!TransactionSynchronizationManager.isActualTransactionActive()) { + throw new CloudRuntimeException("handleVolumeUuidChange must be called in a transaction context, " + + "and you should ensure the volume or snapshot install path will be changed in this transaction." + + "the whole API process MUST BE idempotent and safely interrupted without adverse effects."); + } + + VolumeSnapshotReferenceVO ref = getVolumeBackingRef(originVolume.getUuid()); + if (ref != null && ref.getReferenceUuid().equals(originVolume.getUuid()) + && ref.getReferenceInstallUrl().equals(originVolume.getInstallPath()) + && ref.getReferenceType().equals(VolumeVO.class.getSimpleName())) { + SQL.New(VolumeSnapshotReferenceVO.class).eq(VolumeSnapshotReferenceVO_.id, ref.getId()) + .set(VolumeSnapshotReferenceVO_.referenceVolumeUuid, newVolumeUuid) + .update(); + } + } + private static void deleteAndRedirectSnapshotRef(VolumeSnapshotReferenceVO ref) { new SQLBatch() { @Override diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java b/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java index 2a67b21654a..d62b09766fd 100755 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java @@ -16,7 +16,9 @@ import org.zstack.core.db.SimpleQuery.Op; import org.zstack.core.defer.Defer; import org.zstack.core.defer.Deferred; -import org.zstack.core.thread.*; +import org.zstack.core.thread.ChainTask; +import org.zstack.core.thread.SyncTaskChain; +import org.zstack.core.thread.ThreadFacade; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; import org.zstack.core.workflow.SimpleFlowChain; @@ -33,9 +35,6 @@ import org.zstack.header.message.*; import org.zstack.header.storage.primary.*; import org.zstack.header.storage.snapshot.*; -import org.zstack.header.storage.snapshot.group.VolumeSnapshotGroupInventory; -import org.zstack.header.storage.snapshot.group.VolumeSnapshotGroupRefVO; -import org.zstack.header.storage.snapshot.group.VolumeSnapshotGroupVO; import org.zstack.header.storage.snapshot.group.*; import org.zstack.header.tag.SystemTagVO; import org.zstack.header.tag.SystemTagVO_; @@ -1796,7 +1795,9 @@ public void run(MessageReply reply) { ChangeVolumeTypeOnPrimaryStorageReply cr = reply.castReply(); newRootSnapshots.addAll(cr.getSnapshots()); newRootVol = cr.getVolume(); - installPathsToGc.put(newRootVol, cr.getInstallPathToGc()); + if (cr.getInstallPathToGc() != null) { + installPathsToGc.put(newRootVol, cr.getInstallPathToGc()); + } trigger.next(); } }); @@ -1826,7 +1827,9 @@ public void run(MessageReply reply) { ChangeVolumeTypeOnPrimaryStorageReply cr = reply.castReply(); oldRootSnapshots.addAll(cr.getSnapshots()); oldRootVol = cr.getVolume(); - installPathsToGc.put(oldRootVol, cr.getInstallPathToGc()); + if (cr.getInstallPathToGc() != null) { + installPathsToGc.put(oldRootVol, cr.getInstallPathToGc()); + } trigger.next(); } }); @@ -1842,6 +1845,8 @@ public void run(FlowTrigger trigger, Map data) { @Override protected void scripts() { VmInstanceVO vm = findByUuid(msg.getVmInstanceUuid(), VmInstanceVO.class); + Map oldRootVolOldAndNewInstallPaths = new HashMap<>(); + Map newRootVolOldAndNewInstallPaths = new HashMap<>(); VolumeVO oldRootVolumeVO = vm.getRootVolume(); VolumeVO newRootVolumeVO = vm.getAllVolumes().stream().filter(it -> it.getUuid().equals(msg.getVolumeUuid())) @@ -1849,11 +1854,13 @@ protected void scripts() { operr("volume[uuid%s] should be attached.") )); + oldRootVolOldAndNewInstallPaths.put(oldRootVolumeVO.getInstallPath(), oldRootVol.getInstallPath()); oldRootVolumeVO.setType(VolumeType.Data); oldRootVolumeVO.setInstallPath(oldRootVol.getInstallPath()); oldRootVolumeVO.setDeviceId(newRootVolumeVO.getDeviceId()); merge(oldRootVolumeVO); + newRootVolOldAndNewInstallPaths.put(newRootVolumeVO.getInstallPath(), newRootVol.getInstallPath()); newRootVolumeVO.setType(VolumeType.Root); newRootVolumeVO.setInstallPath(newRootVol.getInstallPath()); newRootVolumeVO.setDeviceId(0); @@ -1861,6 +1868,7 @@ protected void scripts() { for (VolumeSnapshotInventory newRootSnapshot : newRootSnapshots) { VolumeSnapshotVO snapshot = findByUuid(newRootSnapshot.getUuid(), VolumeSnapshotVO.class); + newRootVolOldAndNewInstallPaths.put(newRootSnapshot.getPrimaryStorageInstallPath(), newRootSnapshot.getPrimaryStorageInstallPath()); snapshot.setVolumeType(VolumeType.Root.toString()); snapshot.setPrimaryStorageInstallPath(newRootSnapshot.getPrimaryStorageInstallPath()); merge(snapshot); @@ -1868,11 +1876,20 @@ protected void scripts() { for (VolumeSnapshotInventory oldRootSnapshot : oldRootSnapshots) { VolumeSnapshotVO snapshot = findByUuid(oldRootSnapshot.getUuid(), VolumeSnapshotVO.class); + oldRootVolOldAndNewInstallPaths.put(oldRootSnapshot.getPrimaryStorageInstallPath(), oldRootSnapshot.getPrimaryStorageInstallPath()); snapshot.setVolumeType(VolumeType.Data.toString()); snapshot.setPrimaryStorageInstallPath(oldRootSnapshot.getPrimaryStorageInstallPath()); merge(snapshot); } + // TODO use extension + oldRootVolOldAndNewInstallPaths.entrySet().removeIf(entry -> entry.getKey().equals(entry.getValue())); + newRootVolOldAndNewInstallPaths.entrySet().removeIf(entry -> entry.getKey().equals(entry.getValue())); + VolumeSnapshotReferenceUtils.handleVolumeInstallUrlChange(oldRootVolumeVO.getUuid(), + oldRootVolOldAndNewInstallPaths); + VolumeSnapshotReferenceUtils.handleVolumeInstallUrlChange(newRootVolumeVO.getUuid(), + newRootVolOldAndNewInstallPaths); + vm.setRootVolumeUuid(newRootVolumeVO.getUuid()); merge(vm); } @@ -1884,6 +1901,11 @@ protected void scripts() { flow(new NoRollbackFlow() { String __name__ = "unlink-volumes-old-install-path"; + @Override + public boolean skip(Map data) { + return installPathsToGc.isEmpty(); + } + @Override public void run(FlowTrigger trigger, Map data) { new While<>(installPathsToGc.entrySet()).each((entry, compl) -> { @@ -2016,16 +2038,23 @@ public void run(FlowTrigger trigger, Map data) { new SQLBatch() { @Override protected void scripts() { + Map oldAndNewInstallPaths = new HashMap<>(); + oldAndNewInstallPaths.put(self.getInstallPath(), changedVolume.getInstallPath()); self.setType(msg.getType()); self.setInstallPath(changedVolume.getInstallPath()); merge(self); for (VolumeSnapshotInventory changedSnapshot : changedSnapshots) { VolumeSnapshotVO snapshot = findByUuid(changedSnapshot.getUuid(), VolumeSnapshotVO.class); + oldAndNewInstallPaths.put(snapshot.getPrimaryStorageInstallPath(), changedSnapshot.getPrimaryStorageInstallPath()); snapshot.setVolumeType(msg.getType().toString()); snapshot.setPrimaryStorageInstallPath(changedSnapshot.getPrimaryStorageInstallPath()); merge(snapshot); } + + // TODO use extension + oldAndNewInstallPaths.entrySet().removeIf(entry -> entry.getKey().equals(entry.getValue())); + VolumeSnapshotReferenceUtils.handleVolumeInstallUrlChange(self.getUuid(), oldAndNewInstallPaths); } }.execute(); trigger.next(); @@ -2035,6 +2064,11 @@ protected void scripts() { flow(new NoRollbackFlow() { String __name__ = "unlink-volume-old-install-path"; + @Override + public boolean skip(Map data) { + return installPathToGc == null; + } + @Override public void run(FlowTrigger trigger, Map data) { UnlinkBitsOnPrimaryStorageMsg umsg = new UnlinkBitsOnPrimaryStorageMsg(); diff --git a/testlib/src/main/java/org/zstack/testlib/LocalStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/LocalStorageSpec.groovy index 2adeabafea8..c9c8e432ba3 100755 --- a/testlib/src/main/java/org/zstack/testlib/LocalStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/LocalStorageSpec.groovy @@ -294,6 +294,15 @@ class LocalStorageSpec extends PrimaryStorageSpec { return new LocalStorageKvmBackend.CreateVolumeWithBackingRsp() } + VFS.vfsHook(LocalStorageKvmBackend.CREATE_VOLUME_WITH_BACKING_PATH, espec) { rsp, HttpEntity e, EnvSpec spec -> + def cmd = JSONObjectUtil.toObject(e.body, LocalStorageKvmBackend.CreateVolumeWithBackingCmd.class) + VFS vfs = vfs(e, cmd, spec) + + Volume image = vfs.getFile(cmd.templatePathInCache, true) + vfs.createQcow2(cmd.installPath, image.actualSize, image.virtualSize, cmd.templatePathInCache) + return rsp + } + simulator(LocalStorageKvmBackend.CREATE_EMPTY_VOLUME_PATH) { HttpEntity e, EnvSpec spec -> return new LocalStorageKvmBackend.CreateEmptyVolumeRsp() } From 50a68c06191d04dd4465292f9cdb3590abb05cf8 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Tue, 7 Jan 2025 13:28:02 +0800 Subject: [PATCH 222/737] [plugin]: add logical pool info metadata Resolves: ZSTAC-72290 Change-Id: I69766d70727065626e70657364666e626b716267 --- .../main/java/org/zstack/cbd/AddonInfo.java | 12 +- .../java/org/zstack/cbd/LogicalPoolInfo.java | 173 ++++++++++++++++++ .../storage/zbs/ZbsStorageController.java | 54 ++++-- .../addon/zbs/ZbsPrimaryStorageCase.groovy | 8 +- .../testlib/ExternalPrimaryStorageSpec.groovy | 29 ++- 5 files changed, 251 insertions(+), 25 deletions(-) create mode 100644 plugin/cbd/src/main/java/org/zstack/cbd/LogicalPoolInfo.java diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/AddonInfo.java b/plugin/cbd/src/main/java/org/zstack/cbd/AddonInfo.java index 40b140c7afc..dab817ba94d 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/AddonInfo.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/AddonInfo.java @@ -1,5 +1,6 @@ package org.zstack.cbd; +import java.util.ArrayList; import java.util.List; /** @@ -7,7 +8,8 @@ * @date 2024/4/1 18:12 */ public class AddonInfo { - private List mdsInfos; + private List mdsInfos = new ArrayList<>(); + private List logicalPoolInfos = new ArrayList<>(); public List getMdsInfos() { return mdsInfos; @@ -16,4 +18,12 @@ public List getMdsInfos() { public void setMdsInfos(List mdsInfos) { this.mdsInfos = mdsInfos; } + + public List getLogicalPoolInfos() { + return logicalPoolInfos; + } + + public void setLogicalPoolInfos(List logicalPoolInfos) { + this.logicalPoolInfos = logicalPoolInfos; + } } diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/LogicalPoolInfo.java b/plugin/cbd/src/main/java/org/zstack/cbd/LogicalPoolInfo.java new file mode 100644 index 00000000000..8725ca0aaa3 --- /dev/null +++ b/plugin/cbd/src/main/java/org/zstack/cbd/LogicalPoolInfo.java @@ -0,0 +1,173 @@ +package org.zstack.cbd; + +/** + * @author Xingwei Yu + * @date 2025/1/7 13:17 + */ +public class LogicalPoolInfo { + private long physicalPoolID; + private RedundanceAndPlaceMentPolicy redundanceAndPlaceMentPolicy; + private long logicalPoolID; + private long usedSize; + private long quota; + private long createTime; + private int type; + private long rawWalUsedSize; + private int allocateStatus; + private long rawUsedSize; + private String physicalPoolName; + private long capacity; + private String logicalPoolName; + private String userPolicy; + private long allocatedSize; + + public long getPhysicalPoolID() { + return physicalPoolID; + } + + public void setPhysicalPoolID(long physicalPoolID) { + this.physicalPoolID = physicalPoolID; + } + + public RedundanceAndPlaceMentPolicy getRedundanceAndPlaceMentPolicy() { + return redundanceAndPlaceMentPolicy; + } + + public void setRedundanceAndPlaceMentPolicy(RedundanceAndPlaceMentPolicy redundanceAndPlaceMentPolicy) { + this.redundanceAndPlaceMentPolicy = redundanceAndPlaceMentPolicy; + } + + public long getLogicalPoolID() { + return logicalPoolID; + } + + public void setLogicalPoolID(long logicalPoolID) { + this.logicalPoolID = logicalPoolID; + } + + public long getUsedSize() { + return usedSize; + } + + public void setUsedSize(long usedSize) { + this.usedSize = usedSize; + } + + public long getQuota() { + return quota; + } + + public void setQuota(long quota) { + this.quota = quota; + } + + public long getCreateTime() { + return createTime; + } + + public void setCreateTime(long createTime) { + this.createTime = createTime; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public long getRawWalUsedSize() { + return rawWalUsedSize; + } + + public void setRawWalUsedSize(long rawWalUsedSize) { + this.rawWalUsedSize = rawWalUsedSize; + } + + public int getAllocateStatus() { + return allocateStatus; + } + + public void setAllocateStatus(int allocateStatus) { + this.allocateStatus = allocateStatus; + } + + public long getRawUsedSize() { + return rawUsedSize; + } + + public void setRawUsedSize(long rawUsedSize) { + this.rawUsedSize = rawUsedSize; + } + + public String getPhysicalPoolName() { + return physicalPoolName; + } + + public void setPhysicalPoolName(String physicalPoolName) { + this.physicalPoolName = physicalPoolName; + } + + public long getCapacity() { + return capacity; + } + + public void setCapacity(long capacity) { + this.capacity = capacity; + } + + public String getLogicalPoolName() { + return logicalPoolName; + } + + public void setLogicalPoolName(String logicalPoolName) { + this.logicalPoolName = logicalPoolName; + } + + public String getUserPolicy() { + return userPolicy; + } + + public void setUserPolicy(String userPolicy) { + this.userPolicy = userPolicy; + } + + public long getAllocatedSize() { + return allocatedSize; + } + + public void setAllocatedSize(long allocatedSize) { + this.allocatedSize = allocatedSize; + } + + public static class RedundanceAndPlaceMentPolicy { + private int copysetNum; + private int replicaNum; + private int zoneNum; + + public int getCopysetNum() { + return copysetNum; + } + + public void setCopysetNum(int copysetNum) { + this.copysetNum = copysetNum; + } + + public int getReplicaNum() { + return replicaNum; + } + + public void setReplicaNum(int replicaNum) { + this.replicaNum = replicaNum; + } + + public int getZoneNum() { + return zoneNum; + } + + public void setZoneNum(int zoneNum) { + this.zoneNum = zoneNum; + } + } +} diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 3086c0c79b2..e6e27bab936 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -482,12 +482,20 @@ public void reportCapacity(ReturnValueCompletion comp) { httpCall(GET_CAPACITY_PATH, cmd, GetCapacityRsp.class, new ReturnValueCompletion(comp) { @Override public void success(GetCapacityRsp returnValue) { + addonInfo.setLogicalPoolInfos(returnValue.getLogicalPoolInfos()); + SQL.New(ExternalPrimaryStorageVO.class).eq(ExternalPrimaryStorageVO_.uuid, self.getUuid()) + .set(ExternalPrimaryStorageVO_.addonInfo, JSONObjectUtil.toJsonString(addonInfo)) + .update(); + + List logicalPoolInfos = getSelfPools(); + long total = logicalPoolInfos.stream().mapToLong(LogicalPoolInfo::getCapacity).sum(); + long used = logicalPoolInfos.stream().mapToLong(LogicalPoolInfo::getUsedSize).sum(); + long avail = total != 0 ? total - used : 0; + StorageCapacity cap = new StorageCapacity(); - long total = returnValue.getCapacity(); - long avail = total != 0 ? total - returnValue.getUsedSize() : 0; - cap.setHealthy(StorageHealthy.Ok); cap.setTotalCapacity(total); cap.setAvailableCapacity(avail); + cap.setHealthy(StorageHealthy.Ok); comp.success(cap); } @@ -522,10 +530,29 @@ public StorageCapabilities reportCapabilities() { @Override public String allocateSpace(AllocateSpaceSpec aspec) { - reloadDbInfo(); + // TODO allocate pool + LogicalPoolInfo logicalPoolInfo = allocateFreePool(aspec.getSize()); + if (logicalPoolInfo == null) { + throw new OperationFailureException(operr("no available logical pool with enough space[%d]", aspec.getSize())); + } + return buildVolumePath("", config.getLogicalPoolName(), ""); } + private LogicalPoolInfo allocateFreePool(long size) { + List logicalPoolInfos = getSelfPools(); + return logicalPoolInfos.stream().filter(it -> it.getCapacity() - it.getUsedSize() > size) + .max(Comparator.comparingLong(it -> it.getCapacity() - it.getUsedSize())) + .orElse(null); + } + + private List getSelfPools() { + String configLogicalPoolName = config.getLogicalPoolName(); + List logicalPoolInfos = addonInfo.getLogicalPoolInfos(); + logicalPoolInfos.removeIf(it -> !configLogicalPoolName.equals(it.getLogicalPoolName())); + return logicalPoolInfos; + } + @Override public void createVolume(CreateVolumeSpec v, ReturnValueCompletion comp) { reloadDbInfo(); @@ -1283,23 +1310,14 @@ public void setActualSize(long actualSize) { } public static class GetCapacityRsp extends AgentResponse { - private long capacity; - private long usedSize; - - public long getCapacity() { - return capacity; - } - - public void setCapacity(long capacity) { - this.capacity = capacity; - } + private List logicalPoolInfos; - public long getUsedSize() { - return usedSize; + public List getLogicalPoolInfos() { + return logicalPoolInfos; } - public void setUsedSize(long usedSize) { - this.usedSize = usedSize; + public void setLogicalPoolInfos(List logicalPoolInfos) { + this.logicalPoolInfos = logicalPoolInfos; } } diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index b0df00946b1..6972b1e001c 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -213,7 +213,7 @@ class ZbsPrimaryStorageCase extends SubCase { def addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() - assert addonInfo == "{\"mdsInfos\":[{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.1\",\"mdsExternalAddr\":\"1.1.1.1:6666\",\"mdsStatus\":\"Connected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.2\",\"mdsExternalAddr\":\"1.1.1.2:6666\",\"mdsStatus\":\"Connected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.3\",\"mdsExternalAddr\":\"1.1.1.3:6666\",\"mdsStatus\":\"Connected\"}]}" + assert addonInfo == "{\"mdsInfos\":[{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.1\",\"mdsExternalAddr\":\"1.1.1.1:6666\",\"mdsStatus\":\"Connected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.2\",\"mdsExternalAddr\":\"1.1.1.2:6666\",\"mdsStatus\":\"Connected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.3\",\"mdsExternalAddr\":\"1.1.1.3:6666\",\"mdsStatus\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" env.afterSimulator(ZbsPrimaryStorageMdsBase.PING_PATH) { rsp, HttpEntity e -> def cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) @@ -230,7 +230,7 @@ class ZbsPrimaryStorageCase extends SubCase { addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() - assert addonInfo == "{\"mdsInfos\":[{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.1\",\"mdsExternalAddr\":\"1.1.1.1:6666\",\"mdsStatus\":\"Disconnected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.2\",\"mdsExternalAddr\":\"1.1.1.2:6666\",\"mdsStatus\":\"Connected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.3\",\"mdsExternalAddr\":\"1.1.1.3:6666\",\"mdsStatus\":\"Connected\"}]}" + assert addonInfo == "{\"mdsInfos\":[{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.1\",\"mdsExternalAddr\":\"1.1.1.1:6666\",\"mdsStatus\":\"Disconnected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.2\",\"mdsExternalAddr\":\"1.1.1.2:6666\",\"mdsStatus\":\"Connected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.3\",\"mdsExternalAddr\":\"1.1.1.3:6666\",\"mdsStatus\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" assert Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Connected @@ -248,11 +248,11 @@ class ZbsPrimaryStorageCase extends SubCase { return pingRsp } - sleep(1000) + sleep(2000) addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() - assert addonInfo == "{\"mdsInfos\":[{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.1\",\"mdsExternalAddr\":\"1.1.1.1:6666\",\"mdsStatus\":\"Disconnected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.2\",\"mdsExternalAddr\":\"1.1.1.2:6666\",\"mdsStatus\":\"Disconnected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.3\",\"mdsExternalAddr\":\"1.1.1.3:6666\",\"mdsStatus\":\"Connected\"}]}" + assert addonInfo == "{\"mdsInfos\":[{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.1\",\"mdsExternalAddr\":\"1.1.1.1:6666\",\"mdsStatus\":\"Disconnected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.2\",\"mdsExternalAddr\":\"1.1.1.2:6666\",\"mdsStatus\":\"Disconnected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.3\",\"mdsExternalAddr\":\"1.1.1.3:6666\",\"mdsStatus\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" assert Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Disconnected diff --git a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy index 6ed8fe4f33b..f40ae2b6ef7 100644 --- a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy @@ -1,6 +1,7 @@ package org.zstack.testlib import org.springframework.http.HttpEntity +import org.zstack.cbd.LogicalPoolInfo import org.zstack.sdk.PrimaryStorageInventory import org.zstack.storage.zbs.ZbsPrimaryStorageMdsBase import org.zstack.storage.zbs.ZbsStorageController @@ -83,9 +84,33 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { ExternalPrimaryStorageSpec zspec = spec.specByUuid(cmd.uuid) assert zspec != null: "cannot found zbs primary storage[uuid:${cmd.uuid}], check your environment()." + LogicalPoolInfo.RedundanceAndPlaceMentPolicy redundanceAndPlaceMentPolicy = new LogicalPoolInfo.RedundanceAndPlaceMentPolicy() + redundanceAndPlaceMentPolicy.setCopysetNum(300) + redundanceAndPlaceMentPolicy.setReplicaNum(3) + redundanceAndPlaceMentPolicy.setZoneNum(3) + + LogicalPoolInfo logicalPoolInfo = new LogicalPoolInfo() + logicalPoolInfo.setPhysicalPoolID(1); + logicalPoolInfo.setRedundanceAndPlaceMentPolicy(redundanceAndPlaceMentPolicy); + logicalPoolInfo.setLogicalPoolID(1); + logicalPoolInfo.setUsedSize(322961408); + logicalPoolInfo.setQuota(0); + logicalPoolInfo.setCreateTime(1735875794); + logicalPoolInfo.setType(0); + logicalPoolInfo.setRawWalUsedSize(0); + logicalPoolInfo.setAllocateStatus(0); + logicalPoolInfo.setRawUsedSize(968884224); + logicalPoolInfo.setPhysicalPoolName("pool1"); + logicalPoolInfo.setCapacity(579933831168); + logicalPoolInfo.setLogicalPoolName(cmd.logicalPoolName); + logicalPoolInfo.setUserPolicy("eyJwb2xpY3kiIDogMX0="); + logicalPoolInfo.setAllocatedSize(3221225472); + + List logicalPoolInfos = new ArrayList<>() + logicalPoolInfos.add(logicalPoolInfo) + def rsp = new ZbsStorageController.GetCapacityRsp() - rsp.setCapacity(536870912000) - rsp.setUsedSize(4194304) + rsp.setLogicalPoolInfos(logicalPoolInfos) return rsp } From 2f912af5401283d90f96fe39cbba2fe59ee40c3c Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Thu, 9 Jan 2025 17:23:23 +0800 Subject: [PATCH 223/737] [plugin]: remove mds get facts Resolves: ZSTAC-71766 Change-Id: I6d71746f6c706e737a786e6a71706c6a68756471 --- .../src/main/java/org/zstack/cbd/MdsInfo.java | 9 ---- .../storage/zbs/ZbsPrimaryStorageMdsBase.java | 14 +----- .../storage/zbs/ZbsStorageController.java | 50 +------------------ .../addon/zbs/ZbsPrimaryStorageCase.groovy | 37 ++++---------- .../testlib/ExternalPrimaryStorageSpec.groovy | 17 ------- 5 files changed, 13 insertions(+), 114 deletions(-) diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java b/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java index d0f793747cf..4ab8fe44313 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java @@ -9,7 +9,6 @@ public class MdsInfo { private String sshPassword; private int sshPort = 22; private String mdsAddr; - private String mdsExternalAddr; private MdsStatus mdsStatus; public String getSshUsername() { @@ -44,14 +43,6 @@ public void setMdsAddr(String mdsAddr) { this.mdsAddr = mdsAddr; } - public String getMdsExternalAddr() { - return mdsExternalAddr; - } - - public void setMdsExternalAddr(String mdsExternalAddr) { - this.mdsExternalAddr = mdsExternalAddr; - } - public MdsStatus getMdsStatus() { return mdsStatus; } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java index a81031c8093..49645209a0d 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java @@ -282,8 +282,7 @@ private void pingMds(final Completion completion) { new While<>(stepCount).each((step, comp) -> { PingCmd cmd = new PingCmd(); - cmd.setMdsExternalAddr(getSelf().getMdsExternalAddr()); - + cmd.setMdsAddr(getSelf().getMdsAddr()); restf.asyncJsonPost(ZbsAgentUrl.primaryStorageUrl(getSelf().getMdsAddr(), PING_PATH), cmd, new JsonAsyncRESTCallback(completion) { @Override @@ -305,7 +304,7 @@ public void success(PingRsp rsp) { @Override public void fail(ErrorCode errorCode) { - logger.warn(String.format("ping zbs primary storage mds[%s] failed (%d/%d): %s", getSelf().getMdsExternalAddr(), step, MAX_PING_CNT, errorCode.toString())); + logger.warn(String.format("ping zbs primary storage mds[%s] failed (%d/%d): %s", getSelf().getMdsAddr(), step, MAX_PING_CNT, errorCode.toString())); comp.addError(errorCode); if (step.equals(MAX_PING_CNT)) { @@ -337,15 +336,6 @@ public static class PingRsp extends ZbsMdsBase.AgentResponse { } public static class PingCmd extends ZbsMdsBase.AgentCommand { - private String mdsExternalAddr; - - public String getMdsExternalAddr() { - return mdsExternalAddr; - } - - public void setMdsExternalAddr(String mdsExternalAddr) { - this.mdsExternalAddr = mdsExternalAddr; - } } @Override diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index e6e27bab936..16d38605931 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -74,7 +74,6 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar private Config config; public static final String DEPLOY_CLIENT_PATH = "/zbs/primarystorage/client/deploy"; - public static final String GET_FACTS_PATH = "/zbs/primarystorage/facts"; public static final String GET_CAPACITY_PATH = "/zbs/primarystorage/capacity"; public static final String COPY_PATH = "/zbs/primarystorage/copy"; public static final String CREATE_VOLUME_PATH = "/zbs/primarystorage/volume/create"; @@ -88,8 +87,6 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar public static final String DELETE_SNAPSHOT_PATH = "/zbs/primarystorage/snapshot/delete"; public static final String ROLLBACK_SNAPSHOT_PATH = "/zbs/primarystorage/snapshot/rollback"; - private static final Integer SUPPORT_MINIMUM_MDS_NUMBER = 2; - private static final StorageCapabilities capabilities = new StorageCapabilities(); static { @@ -307,43 +304,6 @@ public void run(FlowTrigger trigger, Map data) { } }); - flow(new NoRollbackFlow() { - String __name__ = "get-facts"; - - @Override - public void run(FlowTrigger trigger, Map data) { - List errors = new ArrayList<>(); - new While<>(mds).each((m, comp) -> { - GetFactsCmd cmd = new GetFactsCmd(); - cmd.setUuid(self.getUuid()); - cmd.setMdsAddr(m.getSelf().getMdsAddr()); - m.httpCall(GET_FACTS_PATH, cmd, GetFactsRsp.class, new ReturnValueCompletion(comp) { - @Override - public void success(GetFactsRsp returnValue) { - m.getSelf().setMdsExternalAddr(returnValue.getMdsExternalAddr()); - comp.done(); - } - - @Override - public void fail(ErrorCode errorCode) { - errors.add(errorCode); - comp.done(); - } - }); - }).run(new WhileDoneCompletion(trigger) { - @Override - public void done(ErrorCodeList errorCodeList) { - if (!errors.isEmpty()) { - trigger.fail(errors.get(0)); - return; - } - - trigger.next(); - } - }); - } - }); - flow(new NoRollbackFlow() { String __name__ = "deploy-client"; @@ -429,9 +389,7 @@ public void handle(ErrorCode errCode, Map data) { @Override public void ping(Completion completion) { reloadDbInfo(); - final List mds = CollectionUtils.transformToList(addonInfo.getMdsInfos(), ZbsPrimaryStorageMdsBase::new); - new While<>(mds).each((m, comp) -> { m.ping(new Completion(comp) { @Override @@ -453,18 +411,14 @@ public void done(ErrorCodeList errorCodeList) { .set(ExternalPrimaryStorageVO_.addonInfo, JSONObjectUtil.toJsonString(addonInfo)) .update(); - boolean isConnected = addonInfo.getMdsInfos().stream() - .filter(mdsInfo -> MdsStatus.Connected.equals(mdsInfo.getMdsStatus())) - .count() >= SUPPORT_MINIMUM_MDS_NUMBER; - + boolean isConnected = addonInfo.getMdsInfos().stream().anyMatch(mdsInfo -> MdsStatus.Connected.equals(mdsInfo.getMdsStatus())); if (!isConnected) { String notConnectedIps = addonInfo.getMdsInfos().stream() .filter(mdsInfo -> !MdsStatus.Connected.equals(mdsInfo.getMdsStatus())) .map(MdsInfo::getMdsAddr) .collect(Collectors.joining(", ")); - completion.fail(operr("at least %d of the MDS nodes exist in the Connected state, " + - "the following MDS nodes[%s] are not Connected.", SUPPORT_MINIMUM_MDS_NUMBER, notConnectedIps)); + completion.fail(operr("no MDS node is Connected, the following MDS nodes[%s] are not Connected.", notConnectedIps)); return; } completion.success(); diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index 6972b1e001c..366d6d518ce 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -213,12 +213,12 @@ class ZbsPrimaryStorageCase extends SubCase { def addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() - assert addonInfo == "{\"mdsInfos\":[{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.1\",\"mdsExternalAddr\":\"1.1.1.1:6666\",\"mdsStatus\":\"Connected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.2\",\"mdsExternalAddr\":\"1.1.1.2:6666\",\"mdsStatus\":\"Connected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.3\",\"mdsExternalAddr\":\"1.1.1.3:6666\",\"mdsStatus\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" + assert addonInfo == "{\"mdsInfos\":[{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.1\",\"mdsStatus\":\"Connected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.2\",\"mdsStatus\":\"Connected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.3\",\"mdsStatus\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" env.afterSimulator(ZbsPrimaryStorageMdsBase.PING_PATH) { rsp, HttpEntity e -> def cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) ZbsPrimaryStorageMdsBase.PingRsp pingRsp = new ZbsPrimaryStorageMdsBase.PingRsp() - if (cmd.mdsExternalAddr.equals("1.1.1.1:6666")) { + if (cmd.mdsAddr.equals("127.0.1.1")) { pingRsp.success = false pingRsp.error = "on purpose" } @@ -230,17 +230,20 @@ class ZbsPrimaryStorageCase extends SubCase { addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() - assert addonInfo == "{\"mdsInfos\":[{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.1\",\"mdsExternalAddr\":\"1.1.1.1:6666\",\"mdsStatus\":\"Disconnected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.2\",\"mdsExternalAddr\":\"1.1.1.2:6666\",\"mdsStatus\":\"Connected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.3\",\"mdsExternalAddr\":\"1.1.1.3:6666\",\"mdsStatus\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" + assert addonInfo == "{\"mdsInfos\":[{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.1\",\"mdsStatus\":\"Disconnected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.2\",\"mdsStatus\":\"Connected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.3\",\"mdsStatus\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" assert Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Connected env.afterSimulator(ZbsPrimaryStorageMdsBase.PING_PATH) { rsp, HttpEntity e -> def cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) ZbsPrimaryStorageMdsBase.PingRsp pingRsp = new ZbsPrimaryStorageMdsBase.PingRsp() - if (cmd.mdsExternalAddr.equals("1.1.1.1:6666")) { + if (cmd.mdsAddr.equals("127.0.1.1")) { pingRsp.success = false pingRsp.error = "on purpose" - } else if (cmd.mdsExternalAddr.equals("1.1.1.2:6666")) { + } else if (cmd.mdsAddr.equals("127.0.1.2")) { + pingRsp.success = false + pingRsp.error = "on purpose" + } else if (cmd.mdsAddr.equals("127.0.1.3")) { pingRsp.success = false pingRsp.error = "on purpose" } @@ -252,7 +255,7 @@ class ZbsPrimaryStorageCase extends SubCase { addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() - assert addonInfo == "{\"mdsInfos\":[{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.1\",\"mdsExternalAddr\":\"1.1.1.1:6666\",\"mdsStatus\":\"Disconnected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.2\",\"mdsExternalAddr\":\"1.1.1.2:6666\",\"mdsStatus\":\"Disconnected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.3\",\"mdsExternalAddr\":\"1.1.1.3:6666\",\"mdsStatus\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" + assert addonInfo == "{\"mdsInfos\":[{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.1\",\"mdsStatus\":\"Disconnected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.2\",\"mdsStatus\":\"Disconnected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.3\",\"mdsStatus\":\"Disconnected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" assert Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Disconnected @@ -306,13 +309,6 @@ class ZbsPrimaryStorageCase extends SubCase { return [:] } - env.simulator(ZbsStorageController.GET_FACTS_PATH) { HttpEntity e, EnvSpec spec -> - def rsp = new ZbsStorageController.GetFactsRsp() - rsp.setSuccess(false) - rsp.setError("failed to GET_FACTS on purpose") - return rsp - } - expect(AssertionError.class) { addExternalPrimaryStorage { zoneUuid = zone.uuid @@ -328,21 +324,6 @@ class ZbsPrimaryStorageCase extends SubCase { return [:] } - env.simulator(ZbsStorageController.GET_FACTS_PATH) { HttpEntity e, EnvSpec spec -> - ZbsStorageController.GetFactsCmd cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.GetFactsCmd.class) - - def rsp = new ZbsStorageController.GetFactsRsp() - if (cmd.getMdsAddr().equals("127.0.2.1")) { - rsp.setMdsExternalAddr("1.1.2.1:6666") - } else if (cmd.mdsAddr.equals("127.0.2.2")) { - rsp.setMdsExternalAddr("1.1.2.2:6666") - } else if (cmd.mdsAddr.equals("127.0.2.3")) { - rsp.setMdsExternalAddr("1.1.2.3:6666") - } - - return rsp - } - env.simulator(ZbsStorageController.GET_CAPACITY_PATH) { HttpEntity e, EnvSpec spec -> def rsp = new ZbsStorageController.GetCapacityRsp() rsp.setSuccess(false) diff --git a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy index f40ae2b6ef7..b7f2ecf095a 100644 --- a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy @@ -62,23 +62,6 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { return rsp } - simulator(ZbsStorageController.GET_FACTS_PATH) { HttpEntity e, EnvSpec spec -> - ZbsStorageController.GetFactsCmd cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.GetFactsCmd.class) - ExternalPrimaryStorageSpec zspec = spec.specByUuid(cmd.uuid) - assert zspec != null: "cannot found zbs primary storage[uuid:${cmd.uuid}], check your environment()." - - def rsp = new ZbsStorageController.GetFactsRsp() - if (cmd.mdsAddr.equals("127.0.1.1")) { - rsp.setMdsExternalAddr("1.1.1.1:6666") - } else if (cmd.mdsAddr.equals("127.0.1.2")) { - rsp.setMdsExternalAddr("1.1.1.2:6666") - } else if (cmd.mdsAddr.equals("127.0.1.3")) { - rsp.setMdsExternalAddr("1.1.1.3:6666") - } - - return rsp - } - simulator(ZbsStorageController.GET_CAPACITY_PATH) { HttpEntity e, EnvSpec spec -> ZbsStorageController.GetCapacityCmd cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.GetCapacityCmd.class) ExternalPrimaryStorageSpec zspec = spec.specByUuid(cmd.uuid) From c4dd84e0d0e984c058fe8162049de167852f56f3 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 13 Jan 2025 16:23:19 +0800 Subject: [PATCH 224/737] [conf]: Upgrade ApplicationDevelopmentServiceVO - Update sdk DBImpact Resolves: ZSTAC-71939 Change-Id: I666a6977676f63706d6f636b68706a6b70677167 Signed-off-by: ye.zou --- conf/db/upgrade/V5.3.20__schema.sql | 29 ++++++++++++++++ ...pplicationDevelopmentServiceInventory.java | 34 +------------------ .../DeployAppDevelopmentServiceAction.java | 3 -- 3 files changed, 30 insertions(+), 36 deletions(-) diff --git a/conf/db/upgrade/V5.3.20__schema.sql b/conf/db/upgrade/V5.3.20__schema.sql index 50bf5def2c6..57fd799d44c 100644 --- a/conf/db/upgrade/V5.3.20__schema.sql +++ b/conf/db/upgrade/V5.3.20__schema.sql @@ -30,3 +30,32 @@ WHERE ref.referenceType = 'VolumeVO' AND ref.referenceVolumeUuid = ref.referenceUuid AND ref.referenceInstallUrl NOT LIKE CONCAT('%', SUBSTRING_INDEX(vol.installPath, '/', -1), '%'); +DROP PROCEDURE IF EXISTS ModifyApplicationDevelopmentServiceVO; +DELIMITER $$ + +CREATE PROCEDURE ModifyApplicationDevelopmentServiceVO() +BEGIN + START TRANSACTION; + + CREATE TABLE IF NOT EXISTS `zstack`.`ApplicationDevelopmentServiceVO_temp` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `deploymentStatus` varchar(255) NOT NULL, + PRIMARY KEY (`uuid`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + INSERT INTO `zstack`.`ApplicationDevelopmentServiceVO_temp` (uuid, deploymentStatus) + SELECT modelServiceGroupUuid, deploymentStatus + FROM `zstack`.`ApplicationDevelopmentServiceVO` + WHERE modelServiceGroupUuid IS NOT NULL; + + DROP TABLE `zstack`.`ApplicationDevelopmentServiceVO`; + + RENAME TABLE `zstack`.`ApplicationDevelopmentServiceVO_temp` TO `zstack`.`ApplicationDevelopmentServiceVO`; + + COMMIT; +END $$ + +DELIMITER ; + +CALL ModifyApplicationDevelopmentServiceVO(); + diff --git a/sdk/src/main/java/org/zstack/sdk/ApplicationDevelopmentServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ApplicationDevelopmentServiceInventory.java index afa98d81a41..2bf4b9169a5 100644 --- a/sdk/src/main/java/org/zstack/sdk/ApplicationDevelopmentServiceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ApplicationDevelopmentServiceInventory.java @@ -2,39 +2,7 @@ import org.zstack.sdk.ModelServiceInventory; -public class ApplicationDevelopmentServiceInventory { - - public java.lang.String uuid; - public void setUuid(java.lang.String uuid) { - this.uuid = uuid; - } - public java.lang.String getUuid() { - return this.uuid; - } - - public java.lang.String name; - public void setName(java.lang.String name) { - this.name = name; - } - public java.lang.String getName() { - return this.name; - } - - public java.lang.String modelServiceGroupUuid; - public void setModelServiceGroupUuid(java.lang.String modelServiceGroupUuid) { - this.modelServiceGroupUuid = modelServiceGroupUuid; - } - public java.lang.String getModelServiceGroupUuid() { - return this.modelServiceGroupUuid; - } - - public java.lang.String modelServiceUuid; - public void setModelServiceUuid(java.lang.String modelServiceUuid) { - this.modelServiceUuid = modelServiceUuid; - } - public java.lang.String getModelServiceUuid() { - return this.modelServiceUuid; - } +public class ApplicationDevelopmentServiceInventory extends org.zstack.sdk.ModelServiceInstanceGroupInventory { public java.lang.String deploymentStatus; public void setDeploymentStatus(java.lang.String deploymentStatus) { diff --git a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java index 2b5fe05e8fd..b57327c41fa 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java @@ -25,9 +25,6 @@ public Result throwExceptionIfError() { } } - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String appServiceUuid; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; From ae52074745afbbee4d4cad52f77a6ea016e1275f Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Fri, 10 Jan 2025 16:21:49 +0800 Subject: [PATCH 225/737] [plugin]: config url of zbs Resolves: ZSTAC-71766 Change-Id: I79627a6e6e796d6f657a7675726973646c717961 --- .../org/zstack/storage/zbs/ZbsConstants.java | 3 ++ .../org/zstack/storage/zbs/ZbsHelper.java | 38 ++++++++++++++++++- .../org/zstack/storage/zbs/ZbsNameHelper.java | 34 ----------------- .../storage/zbs/ZbsStorageController.java | 12 +++--- .../zstack/storage/zbs/ZbsStorageFactory.java | 2 +- .../addon/zbs/ZbsPrimaryStorageCase.groovy | 10 +++-- 6 files changed, 53 insertions(+), 46 deletions(-) delete mode 100644 plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsNameHelper.java diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java index 58654afe4f1..e060b3fa60b 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java @@ -11,5 +11,8 @@ public interface ZbsConstants { String IDENTITY = "zbs"; String ZBS_PS_IPTABLES_COMMENTS = "Zbsp.allow.port"; String ZBS_PS_ALLOW_PORTS = "7763"; + String ZBS_HEARTBEAT_VOLUME_NAME = "zbs_zstack_heartbeat"; + String ZBS_CBD_LUN_PATH_FORMAT = "cbd:%s/%s/%s"; + String ZBS_CBD_PREFIX_SCHEME = "cbd://"; Integer PRIMARY_STORAGE_MDS_MAXIMUM_PING_FAILURE = 3; } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java index e51471cbf8b..9dfc8b119d0 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java @@ -1,9 +1,45 @@ package org.zstack.storage.zbs; +import org.apache.commons.lang.StringUtils; +import org.zstack.core.db.Q; +import org.zstack.core.db.SQL; +import org.zstack.header.storage.primary.PrimaryStorageVO; +import org.zstack.header.storage.primary.PrimaryStorageVO_; + /** * @author Xingwei Yu * @date 2024/4/9 17:50 */ public class ZbsHelper { - static String zbsHeartbeatVolumeName = "zbs_zstack_heartbeat"; + public static void configUrl(String psUuid) { + String url = Q.New(PrimaryStorageVO.class).select(PrimaryStorageVO_.url).eq(PrimaryStorageVO_.uuid, psUuid).findValue(); + if (StringUtils.isEmpty(url)) { + SQL.New(PrimaryStorageVO.class).eq(PrimaryStorageVO_.uuid, psUuid).set(PrimaryStorageVO_.url, ZbsConstants.ZBS_CBD_PREFIX_SCHEME + psUuid).update(); + } + } + + public static String buildVolumePath(String physicalPoolName, String logicalPoolName, String volId) { + String base = volId.replace("-", ""); + return String.format(ZbsConstants.ZBS_CBD_LUN_PATH_FORMAT, physicalPoolName, logicalPoolName, base); + } + + public static String getLogicalPoolNameFromPath(String url) { + return url.split("/")[1]; + } + + public static String getPhysicalPoolNameFromPath(String url) { + return url.split("/")[0].split(":")[1]; + } + + public static String getLunNameFromPath(String url) { + return url.split("/")[2].split("@")[0]; + } + + public static String getSnapshotNameFromPath(String url) { + return url.split("/")[2].split("@")[1]; + } + + public static String getVolumeInstallPathFromSnapshot(String snapshotInstallPath) { + return snapshotInstallPath.split("@")[0]; + } } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsNameHelper.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsNameHelper.java deleted file mode 100644 index 79fa30e2337..00000000000 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsNameHelper.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.zstack.storage.zbs; - -/** - * @author Xingwei Yu - * @date 2024/10/28 14:17 - */ -public class ZbsNameHelper { - private static final String ZBS_CBD_LUN_PATH_FORMAT = "cbd:%s/%s/%s"; - - public static String buildVolumePath(String physicalPoolName, String logicalPoolName, String volId) { - String base = volId.replace("-", ""); - return String.format(ZBS_CBD_LUN_PATH_FORMAT, physicalPoolName, logicalPoolName, base); - } - - public static String getLogicalPoolNameFromPath(String url) { - return url.split("/")[1]; - } - - public static String getPhysicalPoolNameFromPath(String url) { - return url.split("/")[0].split(":")[1]; - } - - public static String getLunNameFromPath(String url) { - return url.split("/")[2].split("@")[0]; - } - - public static String getSnapshotNameFromPath(String url) { - return url.split("/")[2].split("@")[1]; - } - - public static String getVolumeInstallPathFromSnapshot(String snapshotInstallPath) { - return snapshotInstallPath.split("@")[0]; - } -} diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 16d38605931..a18806de546 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -31,10 +31,7 @@ import org.zstack.header.rest.RESTFacade; import org.zstack.header.storage.addon.*; import org.zstack.header.storage.addon.primary.*; -import org.zstack.header.storage.primary.PrimaryStorageClusterRefVO; -import org.zstack.header.storage.primary.PrimaryStorageClusterRefVO_; -import org.zstack.header.storage.primary.PrimaryStorageStatus; -import org.zstack.header.storage.primary.VolumeSnapshotCapability; +import org.zstack.header.storage.primary.*; import org.zstack.header.storage.snapshot.VolumeSnapshotStats; import org.zstack.header.volume.VolumeConstant; import org.zstack.header.volume.VolumeProtocol; @@ -54,7 +51,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; -import static org.zstack.storage.zbs.ZbsNameHelper.*; +import static org.zstack.storage.zbs.ZbsHelper.*; /** * @author Xingwei Yu @@ -182,7 +179,7 @@ public synchronized void activateHeartbeatVolume(HostInventory h, ReturnValueCom CreateVolumeCmd cmd = new CreateVolumeCmd(); cmd.setLogicalPoolName(config.getLogicalPoolName()); - cmd.setLunName(ZbsHelper.zbsHeartbeatVolumeName); + cmd.setLunName(ZbsConstants.ZBS_HEARTBEAT_VOLUME_NAME); cmd.setSkipIfExisting(true); httpCall(CREATE_VOLUME_PATH, cmd, CreateVolumeRsp.class, new ReturnValueCompletion(comp) { @@ -211,7 +208,7 @@ public void deactivateHeartbeatVolume(HostInventory h, Completion comp) { public HeartbeatVolumeTO getHeartbeatVolumeActiveInfo(HostInventory h) { // FIXME: hard code for install path CbdHeartbeatVolumeTO to = new CbdHeartbeatVolumeTO(); - to.setInstallPath(String.format("cbd:%s_physical/%s/%s", config.getLogicalPoolName(), config.getLogicalPoolName(), ZbsHelper.zbsHeartbeatVolumeName)); + to.setInstallPath(String.format("cbd:%s_physical/%s/%s", config.getLogicalPoolName(), config.getLogicalPoolName(), ZbsConstants.ZBS_HEARTBEAT_VOLUME_NAME)); to.setHeartbeatRequiredSpace(SizeUnit.MEGABYTE.toByte(1)); to.setCoveringPaths(Collections.singletonList(config.getLogicalPoolName())); return to; @@ -370,6 +367,7 @@ public void done(ErrorCodeList errorCodeList) { @Override public void handle(Map data) { changeStatus(PrimaryStorageStatus.Connected); + configUrl(self.getUuid()); addonInfo = info; completion.success(JSONObjectUtil.rehashObject(info, LinkedHashMap.class)); } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java index 7d7b929daa1..95b73d955f1 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java @@ -25,7 +25,7 @@ import java.util.Set; import java.util.stream.Collectors; -import static org.zstack.storage.zbs.ZbsNameHelper.*; +import static org.zstack.storage.zbs.ZbsHelper.*; import static org.zstack.core.Platform.operr; diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index 366d6d518ce..7c3dc4f1737 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -8,6 +8,7 @@ import org.zstack.header.storage.primary.PrimaryStorageStatus import org.zstack.cbd.MdsUri import org.zstack.sdk.* import org.zstack.storage.primary.PrimaryStorageGlobalConfig +import org.zstack.storage.zbs.ZbsConstants import org.zstack.storage.zbs.ZbsPrimaryStorageMdsBase import org.zstack.storage.zbs.ZbsStorageController import org.zstack.test.integration.storage.StorageTest @@ -147,9 +148,7 @@ class ZbsPrimaryStorageCase extends SubCase { testZbsStorageLifecycle() testDataVolumeLifecycle() - PrimaryStorageGlobalConfig.PING_INTERVAL.updateValue(1) testZbsPrimaryStorageMdsPing() - PrimaryStorageGlobalConfig.PING_INTERVAL.updateValue(60) testZbsStorageNegativeScenario() testDataVolumeNegativeScenario() testDecodeMdsUriWithSpecialPassword() @@ -164,6 +163,7 @@ class ZbsPrimaryStorageCase extends SubCase { ps = queryPrimaryStorage {}[0] as ExternalPrimaryStorageInventory assert ps.name == "test-zbs-new-name" + assert ps.url == ZbsConstants.ZBS_CBD_PREFIX_SCHEME + ps.uuid reconnectPrimaryStorage { uuid = ps.uuid @@ -209,6 +209,8 @@ class ZbsPrimaryStorageCase extends SubCase { } void testZbsPrimaryStorageMdsPing() { + PrimaryStorageGlobalConfig.PING_INTERVAL.updateValue(1) + Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Connected def addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() @@ -266,6 +268,8 @@ class ZbsPrimaryStorageCase extends SubCase { } Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Connected + + PrimaryStorageGlobalConfig.PING_INTERVAL.resetValue() } void testDataVolumeLifecycle() { @@ -387,7 +391,7 @@ class ZbsPrimaryStorageCase extends SubCase { } } - static void testDecodeMdsUriWithSpecialPassword() { + void testDecodeMdsUriWithSpecialPassword() { def specialPassword = "password123-`=[];,./~!@#\$%^&*()_+|{}:<>?" def mdsUri = "root:${specialPassword}@127.0.2.1" MdsUri uri = new MdsUri(mdsUri); From a8a9ce67d30b1fd65f1f68f9e71a6c6a3528df78 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Wed, 15 Jan 2025 10:21:16 +0800 Subject: [PATCH 226/737] [db]: Introduce new column modelId to ModelVO DBImpact Resolves: ZSTAC-72402 Change-Id: I7878696765646877726f68656c74687378666469 --- conf/db/upgrade/V5.3.20__schema.sql | 1 + sdk/src/main/java/org/zstack/sdk/ModelInventory.java | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/conf/db/upgrade/V5.3.20__schema.sql b/conf/db/upgrade/V5.3.20__schema.sql index 57fd799d44c..60f1cc77e58 100644 --- a/conf/db/upgrade/V5.3.20__schema.sql +++ b/conf/db/upgrade/V5.3.20__schema.sql @@ -59,3 +59,4 @@ DELIMITER ; CALL ModifyApplicationDevelopmentServiceVO(); +CALL ADD_COLUMN('ModelVO', 'modelId', 'VARCHAR(255)', 1, NULL); diff --git a/sdk/src/main/java/org/zstack/sdk/ModelInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java index e8e5a3a9e98..f6235db4af1 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java @@ -68,6 +68,14 @@ public java.lang.String getVendor() { return this.vendor; } + public java.lang.String modelId; + public void setModelId(java.lang.String modelId) { + this.modelId = modelId; + } + public java.lang.String getModelId() { + return this.modelId; + } + public java.lang.String introduction; public void setIntroduction(java.lang.String introduction) { this.introduction = introduction; From a9ee3d3d45e79829dea3ec0b0ddd3bc3994b565d Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Wed, 15 Jan 2025 15:49:57 +0800 Subject: [PATCH 227/737] [utils]: Add getShortDateFormat() Resolves: ZSTAC-71938 Change-Id: I78776f71706275616f616b68786e786578686974 --- utils/src/main/java/org/zstack/utils/TimeUtils.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/utils/src/main/java/org/zstack/utils/TimeUtils.java b/utils/src/main/java/org/zstack/utils/TimeUtils.java index 0440c54c6e0..0f2ee1e7b15 100755 --- a/utils/src/main/java/org/zstack/utils/TimeUtils.java +++ b/utils/src/main/java/org/zstack/utils/TimeUtils.java @@ -13,6 +13,7 @@ import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Calendar; +import java.util.Date; import java.util.TimeZone; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; @@ -111,6 +112,11 @@ public static long parseTimeToMillis(String time){ } private static final String DEFAULT_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; + private static final String SHORT_TIME_FORMAT = "yyMMdd"; + + public static String getShortDateFormat() { + return new SimpleDateFormat(SHORT_TIME_FORMAT).format(Date.from(Instant.now())); + } public static boolean isValidTimestampFormat(String timestamp) { try { From 0900d52f29746dcb3b83f3c21a72d9c9cbbcc7ba Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Wed, 15 Jan 2025 16:34:32 +0800 Subject: [PATCH 228/737] [network]: fix update l2 network rollback Resolves: ZSTAC-72284 Change-Id: I6868776cc17dbee8ef0b463aa68c96815c1de66d --- .../zstack/network/l2/L2NoVlanNetwork.java | 30 +++++++++++++---- .../l2/vxlan/vxlanNetwork/VxlanNetwork.java | 33 +++++++++++++++---- 2 files changed, 49 insertions(+), 14 deletions(-) diff --git a/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java b/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java index 4e8ff5b35f8..755683d446a 100755 --- a/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java +++ b/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java @@ -43,6 +43,7 @@ import javax.transaction.Transactional; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import static java.util.Arrays.asList; @@ -537,7 +538,7 @@ private void changeL2NetworkVlanId(final APIChangeL2NetworkVlanIdMsg msg, final chain.then(new ShareFlow() { @Override public void setup() { - final List updatedHosts = new ArrayList<>(); + final Map updatedHosts = new ConcurrentHashMap<>(); L2NetworkInventory oldInv = self.toInventory(); L2NetworkInventory newInv = self.toInventory(); if (msg.getType() != null) { @@ -556,18 +557,20 @@ public void run(final FlowTrigger trigger, Map data) { updateVlanNetwork(oldInv, newInv, host.getUuid(), host.getHypervisorType(), new Completion(whileCompletion) { @Override public void success() { - updatedHosts.add(host); + logger.debug(String.format("successfully updated l2 network vlan on host[uuid:%s]", host.getUuid())); + updatedHosts.put(host, true); whileCompletion.done(); } @Override public void fail(ErrorCode errorCode) { logger.error(String.format("update l2 network in host:[%s] failed", host.getUuid())); + updatedHosts.put(host, false); whileCompletion.addError(errorCode); - whileCompletion.allDone(); + whileCompletion.done(); } }); - }, 10).run(new WhileDoneCompletion(trigger) { + }, 5).run(new WhileDoneCompletion(trigger) { @Override public void done(ErrorCodeList errorCodeList) { if (!errorCodeList.getCauses().isEmpty()) { @@ -581,22 +584,35 @@ public void done(ErrorCodeList errorCodeList) { @Override public void rollback(FlowRollback trigger, Map data) { - new While<>(updatedHosts).step((host, whileCompletion) -> { + List successfulHosts = updatedHosts.entrySet().stream() + .filter(Map.Entry::getValue) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + if(successfulHosts.isEmpty()) { + trigger.rollback(); + return; + } + logger.debug(String.format("rollback l2 network vlan changes on %d hosts", successfulHosts.size())); + new While<>(successfulHosts).step((host, whileCompletion) -> { + logger.debug(String.format("rolling back l2 network vlan on host[uuid:%s]", host.getUuid())); updateVlanNetwork(newInv, oldInv, host.getUuid(), host.getHypervisorType(), new Completion(whileCompletion) { @Override public void success() { + logger.debug(String.format("successfully rolled back l2 network vlan on host[uuid:%s]", host.getUuid())); whileCompletion.done(); } @Override public void fail(ErrorCode errorCode) { - logger.error(String.format("rollback l2 network in host:[%s] failed", host.getUuid())); + logger.error(String.format("failed to rollback l2 network vlan on host[uuid:%s], because %s", + host.getUuid(), errorCode.toString())); whileCompletion.done(); } }); - }, updatedHosts.size()).run(new WhileDoneCompletion(trigger) { + }, 5).run(new WhileDoneCompletion(trigger) { @Override public void done(ErrorCodeList errorCodeList) { + logger.debug("finished rolling back l2 network vlan changes"); trigger.rollback(); } }); diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetwork.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetwork.java index c4a2eab1020..5c233074ca1 100755 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetwork.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetwork.java @@ -34,6 +34,7 @@ import javax.transaction.Transactional; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import static java.util.Arrays.asList; @@ -165,7 +166,7 @@ private void changeL2NetworkVni(final APIChangeL2NetworkVlanIdMsg msg, final Com chain.then(new ShareFlow() { @Override public void setup() { - final List updatedHosts = new ArrayList<>(); + final Map updatedHosts = new ConcurrentHashMap<>(); L2NetworkInventory oldInv = self.toInventory(); L2NetworkInventory newInv = self.toInventory(); if (msg.getVlan() != null) { @@ -181,18 +182,20 @@ public void run(final FlowTrigger trigger, Map data) { updateVxlanNetwork(oldInv, newInv, host.getUuid(), host.getHypervisorType(), new Completion(whileCompletion) { @Override public void success() { - updatedHosts.add(host); + logger.debug(String.format("Successfully updated VXLAN network on host[uuid:%s]", host.getUuid())); + updatedHosts.put(host, true); whileCompletion.done(); } @Override public void fail(ErrorCode errorCode) { - logger.error(String.format("update VXLAN network in host:[%s] failed", host.getUuid())); + logger.error(String.format("Failed to update VXLAN network on host[uuid:%s], error: %s", host.getUuid(), errorCode)); + updatedHosts.put(host, false); whileCompletion.addError(errorCode); - whileCompletion.allDone(); + whileCompletion.done(); } }); - }, 10).run(new WhileDoneCompletion(trigger) { + }, 5).run(new WhileDoneCompletion(trigger) { @Override public void done(ErrorCodeList errorCodeList) { if (!errorCodeList.getCauses().isEmpty()) { @@ -206,22 +209,38 @@ public void done(ErrorCodeList errorCodeList) { @Override public void rollback(FlowRollback trigger, Map data) { - new While<>(updatedHosts).step((host, whileCompletion) -> { + List successfulHosts = updatedHosts.entrySet().stream() + .filter(Map.Entry::getValue) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + + if (successfulHosts.isEmpty()) { + logger.debug("No successful hosts to rollback, skipping rollback step."); + trigger.rollback(); + return; + } + + logger.debug(String.format("Rolling back VXLAN network changes on %d hosts", successfulHosts.size())); + new While<>(successfulHosts).step((host, whileCompletion) -> { + logger.debug(String.format("Rolling back VXLAN network on host[uuid:%s]", host.getUuid())); updateVxlanNetwork(newInv, oldInv, host.getUuid(), host.getHypervisorType(), new Completion(whileCompletion) { @Override public void success() { + logger.debug(String.format("Successfully rolled back VXLAN network on host[uuid:%s]", host.getUuid())); whileCompletion.done(); } @Override public void fail(ErrorCode errorCode) { - logger.error(String.format("rollback VXLAN network in host:[%s] failed", host.getUuid())); + logger.error(String.format("failed to rollback VXLAN network on host[uuid:%s], because %s", + host.getUuid(), errorCode.toString())); whileCompletion.done(); } }); }, updatedHosts.size()).run(new WhileDoneCompletion(trigger) { @Override public void done(ErrorCodeList errorCodeList) { + logger.debug("finished rolling back l2 network vni changes"); trigger.rollback(); } }); From fcebed3c0748ee94892f7bce4e59023f251068ff Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Thu, 16 Jan 2025 15:55:59 +0800 Subject: [PATCH 229/737] [plugin]: update config url Resolves: ZSTAC-72500 Change-Id: I6f7870736c616d65676472686c666b72626e7469 --- .../src/main/java/org/zstack/storage/zbs/ZbsHelper.java | 7 +++---- .../storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java index 9dfc8b119d0..af0ce889d9c 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java @@ -1,6 +1,5 @@ package org.zstack.storage.zbs; -import org.apache.commons.lang.StringUtils; import org.zstack.core.db.Q; import org.zstack.core.db.SQL; import org.zstack.header.storage.primary.PrimaryStorageVO; @@ -12,9 +11,9 @@ */ public class ZbsHelper { public static void configUrl(String psUuid) { - String url = Q.New(PrimaryStorageVO.class).select(PrimaryStorageVO_.url).eq(PrimaryStorageVO_.uuid, psUuid).findValue(); - if (StringUtils.isEmpty(url)) { - SQL.New(PrimaryStorageVO.class).eq(PrimaryStorageVO_.uuid, psUuid).set(PrimaryStorageVO_.url, ZbsConstants.ZBS_CBD_PREFIX_SCHEME + psUuid).update(); + String psUrl = ZbsConstants.ZBS_CBD_PREFIX_SCHEME + psUuid; + if (!psUrl.equals(Q.New(PrimaryStorageVO.class).select(PrimaryStorageVO_.url).eq(PrimaryStorageVO_.uuid, psUuid).findValue())) { + SQL.New(PrimaryStorageVO.class).set(PrimaryStorageVO_.url, psUrl).eq(PrimaryStorageVO_.uuid, psUuid).update(); } } diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index 7c3dc4f1737..c477e61cbd7 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -130,7 +130,7 @@ class ZbsPrimaryStorageCase extends SubCase { identity = "zbs" defaultOutputProtocol = "CBD" config = "{\"mdsUrls\":[\"root:password@127.0.1.1\",\"root:password@127.0.1.2\",\"root:password@127.0.1.3\"],\"logicalPoolName\":\"lpool1\"}" - url = "" + url = "fake url" } attachBackupStorage("sftp") From cb50b8f4a93f0d062f2e5b2ddbe2941524a43eac Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 20 Jan 2025 15:17:35 +0800 Subject: [PATCH 230/737] [sdk]: Update sdk Resolves: ZSTAC-72751 Change-Id: I636b696e6879666f787078676668786c6c726879 Signed-off-by: AlanJager --- ...eleteModelServiceInstanceGroupsAction.java | 104 ++++++++++++++++++ ...eleteModelServiceInstanceGroupsResult.java | 14 +++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ 3 files changed, 145 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupsAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupsResult.java diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupsAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupsAction.java new file mode 100644 index 00000000000..ffaf6fb2630 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupsAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteModelServiceInstanceGroupsAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeleteModelServiceInstanceGroupsResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List uuids; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeleteModelServiceInstanceGroupsResult value = res.getResult(org.zstack.sdk.DeleteModelServiceInstanceGroupsResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteModelServiceInstanceGroupsResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/ai/model-services/instances/groups"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupsResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupsResult.java new file mode 100644 index 00000000000..0c3800e5a4e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupsResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class DeleteModelServiceInstanceGroupsResult { + public java.util.List results; + public void setResults(java.util.List results) { + this.results = results; + } + public java.util.List getResults() { + return this.results; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 706808b538f..372f09b4c05 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -15002,6 +15002,33 @@ abstract class ApiHelper { } + def deleteModelServiceInstanceGroups(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelServiceInstanceGroupsAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteModelServiceInstanceGroupsAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def deleteModels(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelsAction.class) Closure c) { def a = new org.zstack.sdk.DeleteModelsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 17960261c91765bf23129ebd35950a226524f6fb Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Tue, 21 Jan 2025 15:22:06 +0800 Subject: [PATCH 231/737] [header]: prevent record creation for empty fields in BatchCreateIAM2VirtualIDFromConfigFileMsg Resolves: ZSTAC-72117 Change-Id: I7a6d72117a707062636c716c657669776c670469 --- .../main/java/org/zstack/header/identity/AccountConstant.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/header/src/main/java/org/zstack/header/identity/AccountConstant.java b/header/src/main/java/org/zstack/header/identity/AccountConstant.java index 4da247d1651..7e376a915e9 100755 --- a/header/src/main/java/org/zstack/header/identity/AccountConstant.java +++ b/header/src/main/java/org/zstack/header/identity/AccountConstant.java @@ -39,6 +39,9 @@ public interface AccountConstant { String PREFERRED_USERNAME = "preferred_username"; String FULL_NAME = "fullname"; + String Phone_NAME = "phone"; + String Mail_NAME = "mail"; + String Identifier_NAME = "identifier"; String LOGIN_TYPE_NAME = "loginType"; String GROUPS_NAME = "groups"; String PROJECTS_NAME = "projects"; From 237a7de1cb94dd61f1843ca3d9018e7af74c7208 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Tue, 21 Jan 2025 15:07:23 +0800 Subject: [PATCH 232/737] [xinfini]: use QueryVolumeById to get active clients Resolves: ZSTAC-72836 Change-Id: I6e736c7875797a656775636b66726e6778686e64 --- .../org/zstack/xinfini/XInfiniApiHelper.java | 30 ++++++++++- .../xinfini/XInfiniStorageController.java | 6 +-- .../org/zstack/xinfini/sdk/XInfiniClient.java | 51 ++++++++++++++----- 3 files changed, 69 insertions(+), 18 deletions(-) diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java index 2ec3ac41e0b..7fc25cdbfee 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java @@ -32,6 +32,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; @@ -61,6 +62,22 @@ public T callErrorOut(XInfiniRequest req, Class c return rsp; } + public T callErrorOutWithRetry(XInfiniRequest req, Class clz, int retryTimes) { + while (retryTimes-- > 0) { + T rsp = client.call(req, clz); + if (!rsp.isSuccess()) { + try { + TimeUnit.SECONDS.sleep(3); + } catch (InterruptedException ignore) {} + } else { + return rsp; + } + } + + throw new OperationFailureException(operr("xinfini request failed, message: %s.", + req.getClass().getSimpleName())); + } + public T call(XInfiniRequest req, Class clz) { return client.call(req, clz); } @@ -208,6 +225,17 @@ public VolumeModule queryVolumeByName(String name) { return rsp.getItems().get(0); } + public VolumeModule queryVolumeById(int id) { + QueryVolumeRequest req = new QueryVolumeRequest(); + req.q = String.format("spec.id:%s", id); + QueryVolumeResponse rsp = queryErrorOut(req, QueryVolumeResponse.class); + if (rsp.getMetadata().getPagination().getCount() == 0) { + return null; + } + + return rsp.getItems().get(0); + } + public VolumeModule getVolume(int id) { GetVolumeRequest req = new GetVolumeRequest(); req.setId(id); @@ -312,7 +340,7 @@ public BdcBdevModule createBdcBdev(int bdcId, int volumeId, String name) { req.setName(name); req.setBdcId(bdcId); req.setBsVolumeId(volumeId); - CreateBdcBdevResponse rsp = callErrorOut(req, CreateBdcBdevResponse.class); + CreateBdcBdevResponse rsp = callErrorOutWithRetry(req, CreateBdcBdevResponse.class, 3); GetBdcBdevRequest gReq = new GetBdcBdevRequest(); gReq.setId(rsp.getSpec().getId()); return retryUtilStateActive(gReq, GetBdcBdevResponse.class, diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index 32ddac899eb..76eb9c6b9de 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -158,7 +158,7 @@ private ActiveVolumeTO activeVhostVolume(HostInventory h, BaseVolumeInfo vol) { VhostVolumeTO to = new VhostVolumeTO(); BdcBdevModule bdev = apiHelper.queryBdcBdevByVolumeIdAndBdcId(volModule.getSpec().getId(), bdc.getSpec().getId()); - if (bdev != null) { + if (bdev != null && MetadataState.active.toString().equals(bdev.getMetadata().getState().getState())) { logger.info("dest bdc bdev has been created, skip active"); to.setInstallPath(bdev.getSpec().getSocketPath()); return to; @@ -335,7 +335,7 @@ public BaseVolumeInfo getActiveVolumeInfo(String activePath, HostInventory h, bo @Override public List getActiveClients(String installPath, String protocol) { if (VolumeProtocol.Vhost.toString().equals(protocol)) { - VolumeModule vol = apiHelper.getVolume(getVolIdFromPath(installPath)); + VolumeModule vol = apiHelper.queryVolumeById(getVolIdFromPath(installPath)); if (vol == null) { return Collections.emptyList(); } @@ -351,7 +351,7 @@ public List getActiveClients(String installPath, String prot return c; }).collect(Collectors.toList()); } else if (VolumeProtocol.iSCSI.toString().equals(protocol)) { - VolumeModule vol = apiHelper.getVolume(getVolIdFromPath(installPath)); + VolumeModule vol = apiHelper.queryVolumeById(getVolIdFromPath(installPath)); if (vol == null) { return Collections.emptyList(); } diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java index fe58f4234f1..89eb1b9f80f 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java @@ -16,6 +16,7 @@ import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.X509TrustManager; +import java.io.EOFException; import java.io.IOException; import java.util.*; import java.util.concurrent.TimeUnit; @@ -159,26 +160,48 @@ XinfiniApiResult doCallWithNode(XInfiniConfig.Node withNode) { logger.debug(String.format("call request[%s: %s]: %s, body: %s", action.getClass().getSimpleName(), taskIdForLog, request, reqBody)); + int retryCount = 0; + while (retryCount <= 2) { + try { + try (Response response = http.newCall(request).execute()) { + if (!response.isSuccessful()) { + if (response.body() == null) { + return httpError(response.code(), null); + } else { + return httpError(response.code(), response.body().string()); + } + } - try { - try (Response response = http.newCall(request).execute()) { - if (!response.isSuccessful()) { - if (response.body() == null) { - return httpError(response.code(), null); - } else { - return httpError(response.code(), response.body().string()); + if (!validHttpStatus.contains(response.code())) { + throw new XInfiniApiException(String.format("[Internal Error] the server returns an unknown status code[%s]", response.code())); } - } - if (!validHttpStatus.contains(response.code())) { - throw new XInfiniApiException(String.format("[Internal Error] the server returns an unknown status code[%s]", response.code())); + return writeApiResult(response); } - - return writeApiResult(response); + } catch (IOException e) { + if (isEOFException(e) && retryCount < 1) { + retryCount++; + try { + TimeUnit.SECONDS.sleep(3); + } catch (InterruptedException ex) { + logger.warn("EOFException sleep failed"); + } + continue; + } + throw new XInfiniApiException(e); } - } catch (IOException e) { - throw new XInfiniApiException(e); } + throw new XInfiniApiException("Max retry attempts reached"); + } + + private boolean isEOFException(IOException e) { + // only retry on query api + if (!(action instanceof XInfiniQueryRequest)) { + return false; + } + + return e instanceof EOFException || + (e.getMessage() != null && e.getMessage().contains("EOF")); } private void fillQueryApiRequestBuilder(Request.Builder reqBuilder, XInfiniConfig.Node node) throws Exception { From ad765b78ed479c443061a67c13f07dd4c423668a Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Wed, 22 Jan 2025 14:56:59 +0800 Subject: [PATCH 233/737] [conf]: Add new description column to schema - Update sdk DBImpact Resolves: ZSTAC-72802 Change-Id: I6c6a6471616d746366756a61736d756877796b6a Signed-off-by: ye.zou --- conf/db/upgrade/V5.3.20__schema.sql | 1 + .../zstack/sdk/ModelServiceInstanceGroupInventory.java | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/conf/db/upgrade/V5.3.20__schema.sql b/conf/db/upgrade/V5.3.20__schema.sql index 60f1cc77e58..f67eac1796d 100644 --- a/conf/db/upgrade/V5.3.20__schema.sql +++ b/conf/db/upgrade/V5.3.20__schema.sql @@ -60,3 +60,4 @@ DELIMITER ; CALL ModifyApplicationDevelopmentServiceVO(); CALL ADD_COLUMN('ModelVO', 'modelId', 'VARCHAR(255)', 1, NULL); +CALL ADD_COLUMN('ModelServiceInstanceGroupVO', 'description', 'VARCHAR(2048)', 1, NULL); diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java index b222f886986..16301cd317e 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java @@ -76,6 +76,14 @@ public java.lang.String getName() { return this.name; } + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; From ed20e4bd72e197ae98bca5893b0f3ea0089cd2a3 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Thu, 23 Jan 2025 10:55:58 +0800 Subject: [PATCH 234/737] [conf]: Update schema for new source column DBImpact Resolves: ZSTAC-72402 Change-Id: I6e727a6161697a7971666b646875676f65627865 --- conf/db/upgrade/V5.3.20__schema.sql | 1 + .../main/java/org/zstack/sdk/AddModelServiceAction.java | 5 ++++- .../main/java/org/zstack/sdk/ModelServiceInventory.java | 8 ++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.3.20__schema.sql b/conf/db/upgrade/V5.3.20__schema.sql index f67eac1796d..cb4c1ba3744 100644 --- a/conf/db/upgrade/V5.3.20__schema.sql +++ b/conf/db/upgrade/V5.3.20__schema.sql @@ -61,3 +61,4 @@ CALL ModifyApplicationDevelopmentServiceVO(); CALL ADD_COLUMN('ModelVO', 'modelId', 'VARCHAR(255)', 1, NULL); CALL ADD_COLUMN('ModelServiceInstanceGroupVO', 'description', 'VARCHAR(2048)', 1, NULL); +CALL ADD_COLUMN('ModelServiceVO', 'source', 'VARCHAR(32)', 1, NULL); diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index d5e09214c9b..3c225ef845f 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -74,7 +74,10 @@ public Result throwExceptionIfError() { public java.lang.String type = "Endpoint"; @Param(required = false, validValues = {"Other","Bentoml","HuggingFace"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String framework = "Other"; + public java.lang.String source = "Other"; + + @Param(required = false, validValues = {"vLLM","Diffusers","Transformers","sentence_transformers","llama.cpp","Ollama"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String framework; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List modelUuids; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java index f97487afd4d..17d36ca0b6e 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java @@ -76,6 +76,14 @@ public java.lang.String getFramework() { return this.framework; } + public java.lang.String source; + public void setSource(java.lang.String source) { + this.source = source; + } + public java.lang.String getSource() { + return this.source; + } + public java.lang.String dockerImage; public void setDockerImage(java.lang.String dockerImage) { this.dockerImage = dockerImage; From 914853d45722c07c9626d1a85534141cdbf692ed Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Mon, 20 Jan 2025 11:00:05 +0800 Subject: [PATCH 235/737] [agent]: skip host ping when dumping kvmagent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、skip host ping when dumping kvmagent 2、Wait for the kvmagent service to fully start before reconnecting to the host to avoid restarting twice. Resolves/Related: ZSTAC-72552 Change-Id: I676f656f6f6d6b6565656e737677666667767176 --- .../zstack/compute/host/HostTrackImpl.java | 28 ++++++++++++ .../header/host/HostCanonicalEvents.java | 24 ++++++++++ .../java/org/zstack/kvm/KVMAgentCommands.java | 30 +++++++++++++ .../main/java/org/zstack/kvm/KVMConstant.java | 2 + .../src/main/java/org/zstack/kvm/KVMHost.java | 44 +++++++++++++++++++ .../java/org/zstack/kvm/KVMHostFactory.java | 25 ++++++++--- 6 files changed, 147 insertions(+), 6 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/host/HostTrackImpl.java b/compute/src/main/java/org/zstack/compute/host/HostTrackImpl.java index 3d5684914b0..49394e88b78 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostTrackImpl.java +++ b/compute/src/main/java/org/zstack/compute/host/HostTrackImpl.java @@ -1,5 +1,7 @@ package org.zstack.compute.host; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.CoreGlobalProperty; import org.zstack.core.cloudbus.*; @@ -35,6 +37,7 @@ public class HostTrackImpl implements HostTracker, ManagementNodeChangeListener, private Map trackers = new ConcurrentHashMap<>(); private static boolean alwaysStartRightNow = false; + private static final Cache skippedPingHostDeadline = CacheBuilder.newBuilder().expireAfterWrite(1, TimeUnit.HOURS).build(); @Autowired private DatabaseFacade dbf; @@ -124,6 +127,12 @@ private void track() { return; } + if (skippedPingHostDeadline.getIfPresent(uuid) != null && System.currentTimeMillis() / 1000 <= skippedPingHostDeadline.getIfPresent(uuid)) { + logger.debug(String.format("skip tracking host[uuid:%s] this time, deadline %s", uuid, skippedPingHostDeadline.getIfPresent(uuid))); + continueToRunThisTimer(); + return; + } + PingHostMsg msg = new PingHostMsg(); msg.setHostUuid(uuid); bus.makeLocalServiceId(msg, HostConstant.SERVICE_ID); @@ -341,6 +350,7 @@ private HostReconnectTaskFactory getHostReconnectTaskFactory(String hvType) { public boolean start() { populateExtensions(); onHostStatusChange(); + onHostPingSkip(); HostGlobalConfig.PING_HOST_INTERVAL.installUpdateExtension((oldConfig, newConfig) -> { logger.debug(String.format("%s change from %s to %s, restart host trackers", @@ -386,6 +396,24 @@ protected void run(Map tokens, Object data) { }); } + private void onHostPingSkip() { + evtf.on(HostCanonicalEvents.HOST_PING_SKIP, new EventCallback() { + @Override + protected void run(Map tokens, Object data) { + HostCanonicalEvents.HostPingSkipData d = (HostCanonicalEvents.HostPingSkipData) data; + Long deadline = System.currentTimeMillis() / 1000 + d.getSkipTimeInSec(); + skippedPingHostDeadline.put(d.getHostUuid(), deadline); + } + }); + evtf.on(HostCanonicalEvents.HOST_PING_CANCEL_SKIP, new EventCallback() { + @Override + protected void run(Map tokens, Object data) { + HostCanonicalEvents.HostPingSkipData d = (HostCanonicalEvents.HostPingSkipData) data; + skippedPingHostDeadline.invalidate(d.getHostUuid()); + } + }); + } + @Override public boolean stop() { return true; diff --git a/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java b/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java index 96006cf1185..46001b9f1ce 100755 --- a/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java +++ b/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java @@ -31,6 +31,8 @@ public class HostCanonicalEvents { public static final String HOST_PHYSICAL_HBA_STATE_ABNORMAL = "/host/physicalHBA/state/abnormal"; public static final String HOST_PHYSICAL_VOLUME_STATE_ABNORMAL = "/host/physicalVolume/state/abnormal"; public static final String HOST_PROCESS_PHYSICAL_MEMORY_USAGE_ABNORMAL = "/host/process/physicalMemory/usage/abnormal"; + public static final String HOST_PING_SKIP = "/host/ping/skip"; + public static final String HOST_PING_CANCEL_SKIP = "/host/ping/cancel/skip"; @NeedJsonSchema public static class HostPhysicalHbaPortStateAbnormalData { @@ -701,4 +703,26 @@ public void setMemoryUsage(String memoryUsage) { this.memoryUsage = memoryUsage; } } + + @NeedJsonSchema + public static class HostPingSkipData { + private String hostUuid; + private int skipTimeInSec; + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public int getSkipTimeInSec() { + return skipTimeInSec; + } + + public void setSkipTimeInSec(int skipTimeInSec) { + this.skipTimeInSec = skipTimeInSec; + } + } } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index dbcaaeddea2..4fb4d1e5779 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -4843,4 +4843,34 @@ public void setAdditionalProperties(Map additionalProperties) { } } + public static class HostKvmagentStatusCmd { + private String status; + private String hostUuid; + private long memoryUsage; + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public long getMemoryUsage() { + return memoryUsage; + } + + public void setMemoryUsage(long memoryUsage) { + this.memoryUsage = memoryUsage; + } + } + } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java index be6c09fad83..7f5b17075d6 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java @@ -127,6 +127,8 @@ public interface KVMConstant { String HOST_PHYSICAL_GPU_REMOVE_ALARM_EVENT = "/host/physical/gpu/remove/alarm"; String HOST_STORAGEDEVICE_HBA_STATE_EVENT = "/storagedevice/hba/state/alarm"; String HOST_PROCESS_PHYSICAL_MEMORY_USAGE_ALARM_PATH = "/host/process/physicalMemory/usage/alarm"; + String HOST_KVMAGENT_STATUS_PATH = "/host/kvmagent/status"; + String KVM_AGENT_OWNER = "kvm"; String ALI_REPO = "ali"; diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index d58cf3bd08f..832c1b6d691 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -846,6 +846,50 @@ public void run(FlowTrigger trigger, Map data) { trigger.next(); } } + }).then(new NoRollbackFlow() { + String __name__ = "wait for kvmagent to be ready"; + + @Override + public void run(FlowTrigger trigger, Map data) { + int retryCount = 60; + While.makeRetryWhile(retryCount).each((currentStep, compl) -> { + PingCmd cmd = new PingCmd(); + cmd.hostUuid = self.getUuid(); + restf.asyncJsonPost(pingPath, cmd, new JsonAsyncRESTCallback(compl) { + @Override + public void fail(ErrorCode err) { + try { + if (currentStep < retryCount) { + TimeUnit.SECONDS.sleep(1); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } finally { + compl.addError(err); + compl.done(); + } + } + + @Override + public void success(PingResponse ret) { + compl.allDone(); + } + + @Override + public Class getReturnClass() { + return PingResponse.class; + } + }, TimeUnit.SECONDS, HostGlobalConfig.PING_HOST_TIMEOUT.value(Long.class)); + }).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().size() == retryCount) { + logger.debug("waiting for kvmagent to start timeout: " + errorCodeList.getCauses().get(0).getDetails()); + } + trigger.next(); + } + }); + } }).then(new NoRollbackFlow() { String __name__ = String.format("reconnect host %s after restart kvmagent", self.getUuid()); diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java index d4299a83470..38130e12f41 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java @@ -7,14 +7,9 @@ import org.zstack.compute.vm.CrashStrategy; import org.zstack.compute.vm.VmGlobalConfig; import org.zstack.compute.vm.VmNicManager; -import org.zstack.core.asyncbatch.While; import org.zstack.core.config.*; import org.zstack.core.config.schema.GuestOsCharacter; -import org.zstack.header.core.*; -import org.zstack.header.core.progress.ChainInfo; -import org.zstack.header.core.progress.TaskInfo; import org.zstack.header.errorcode.ErrorCode; -import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.network.l2.*; import org.zstack.header.tag.SystemTagInventory; import org.zstack.header.tag.SystemTagLifeCycleListener; @@ -57,6 +52,7 @@ import org.zstack.utils.IpRangeSet; import org.zstack.utils.SizeUtils; import org.zstack.utils.Utils; +import org.zstack.utils.data.SizeUnit; import org.zstack.utils.form.Form; import org.zstack.utils.function.Function; import org.zstack.utils.function.ValidateFunction; @@ -77,7 +73,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -137,6 +132,7 @@ public class KVMHostFactory extends AbstractService implements HypervisorFactory @Autowired private GlobalConfigFacade gcf; private Future checkSocketChannelTimeoutThread; + public static int skipHostPingTimeWhenKvmagentBusy = 300; @Override public HostVO createHost(HostVO vo, AddHostMessage msg) { @@ -651,6 +647,23 @@ public String handleSyncHttpCall(TransmitVmOperationToMnCmd cmd) { return null; }); + restf.registerSyncHttpCallHandler(KVMConstant.HOST_KVMAGENT_STATUS_PATH, HostKvmagentStatusCmd.class, cmd -> { + if ("busy".equals(cmd.getStatus())) { + HostCanonicalEvents.HostPingSkipData data = new HostCanonicalEvents.HostPingSkipData(); + data.setHostUuid(cmd.getHostUuid()); + // this will skip host ping sometime if kvmagent busy + data.setSkipTimeInSec(skipHostPingTimeWhenKvmagentBusy * (int)(cmd.getMemoryUsage() / SizeUnit.GIGABYTE.toByte(4) + 1)); + evf.fire(HostCanonicalEvents.HOST_PING_SKIP, data); + } else if ("available".equals(cmd.getStatus())) { + HostCanonicalEvents.HostPingSkipData data = new HostCanonicalEvents.HostPingSkipData(); + data.setHostUuid(cmd.getHostUuid()); + evf.fire(HostCanonicalEvents.HOST_PING_CANCEL_SKIP, data); + } else { + logger.debug("unknown kvmagent status: " + cmd.getStatus()); + } + return null; + }); + restf.registerSyncHttpCallHandler(KVMConstant.HOST_PHYSICAL_DISK_INSERT_ALARM_EVENT, HostPhysicalDiskInsertAlarmEventCmd.class, cmd -> { HostCanonicalEvents.HostPhysicalDiskData cdata = new HostCanonicalEvents.HostPhysicalDiskData(); cdata.setHostUuid(cmd.host); From 5457132940c6ac58e28f15ffb0372e756ed01aaf Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Fri, 24 Jan 2025 12:04:42 +0800 Subject: [PATCH 236/737] [upgrade]: Upgrade ModelService's source fields with sql DBImpact Resolves: ZSTAC-72402 Change-Id: I78626a697271656d7a756672697a666367646874 Signed-off-by: ye.zou --- conf/db/upgrade/V5.3.20__schema.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/db/upgrade/V5.3.20__schema.sql b/conf/db/upgrade/V5.3.20__schema.sql index cb4c1ba3744..b4ffe241276 100644 --- a/conf/db/upgrade/V5.3.20__schema.sql +++ b/conf/db/upgrade/V5.3.20__schema.sql @@ -53,6 +53,7 @@ BEGIN RENAME TABLE `zstack`.`ApplicationDevelopmentServiceVO_temp` TO `zstack`.`ApplicationDevelopmentServiceVO`; COMMIT; + SELECT CURTIME(); END $$ DELIMITER ; @@ -62,3 +63,4 @@ CALL ModifyApplicationDevelopmentServiceVO(); CALL ADD_COLUMN('ModelVO', 'modelId', 'VARCHAR(255)', 1, NULL); CALL ADD_COLUMN('ModelServiceInstanceGroupVO', 'description', 'VARCHAR(2048)', 1, NULL); CALL ADD_COLUMN('ModelServiceVO', 'source', 'VARCHAR(32)', 1, NULL); + From 094cdb5385156023d3ab8e28962624fff755db7b Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Fri, 24 Jan 2025 17:10:02 +0800 Subject: [PATCH 237/737] [conf]: Delete out of date model services from db DBImpact Resolves: ZSTAC-72402 Change-Id: I656f7971716f6d706965756e6577626a76686f71 Signed-off-by: ye.zou --- conf/db/upgrade/V5.3.20__schema.sql | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/conf/db/upgrade/V5.3.20__schema.sql b/conf/db/upgrade/V5.3.20__schema.sql index b4ffe241276..e73efd73af7 100644 --- a/conf/db/upgrade/V5.3.20__schema.sql +++ b/conf/db/upgrade/V5.3.20__schema.sql @@ -64,3 +64,17 @@ CALL ADD_COLUMN('ModelVO', 'modelId', 'VARCHAR(255)', 1, NULL); CALL ADD_COLUMN('ModelServiceInstanceGroupVO', 'description', 'VARCHAR(2048)', 1, NULL); CALL ADD_COLUMN('ModelServiceVO', 'source', 'VARCHAR(32)', 1, NULL); +# Delete ZStack-default-inference-template +DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = '97e66447fa4246649dcc41b72b412407'; +# Delete qwen chat +DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = '0446d8fd9487403cc12e7645f5r68d04'; +# Delete xtts +DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = 'e944c98c4a154f53a86f34eb0fcd093c'; +# Delete sdxl +DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = '80fab6f2f3d444e1a0b39702dcc62bac'; +# Delete blip image +DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = '2ad69dc6cebf405f9e0d750bb50e120c'; +# Delete stable video +DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = 'c65d3019cb3f400f80e5e2a10dcaf861'; +# Delete yolo +DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = '0b714f4d8c5c43ca86c3a6caa58358a7'; \ No newline at end of file From 7661738f80d0fdd18a8d734fc1d5a82de9f634f4 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Wed, 5 Feb 2025 11:49:34 +0800 Subject: [PATCH 238/737] [xinfini]: support set volume queue num Resolves: ZSTAC-72901 Change-Id: I6c677276667a6769726c6a70686365686c6d626d --- .../zstack/header/volume/VolumeConfigs.java | 17 +++++++++ .../volume/VolumeConfigsExtensionPoint.java | 5 +++ .../org/zstack/xinfini/XInfiniApiHelper.java | 8 +++-- .../xinfini/XInfiniStorageController.java | 16 +++++---- .../sdk/vhost/CreateBdcBdevRequest.java | 11 ++++++ .../storage/volume/VolumeConfigsGetter.java | 35 +++++++++++++++++++ 6 files changed, 83 insertions(+), 9 deletions(-) create mode 100644 header/src/main/java/org/zstack/header/volume/VolumeConfigs.java create mode 100644 header/src/main/java/org/zstack/header/volume/VolumeConfigsExtensionPoint.java create mode 100644 storage/src/main/java/org/zstack/storage/volume/VolumeConfigsGetter.java diff --git a/header/src/main/java/org/zstack/header/volume/VolumeConfigs.java b/header/src/main/java/org/zstack/header/volume/VolumeConfigs.java new file mode 100644 index 00000000000..0693125b54f --- /dev/null +++ b/header/src/main/java/org/zstack/header/volume/VolumeConfigs.java @@ -0,0 +1,17 @@ +package org.zstack.header.volume; + +/** + * @ Author : yh.w + * @ Date : Created in 16:38 2025/1/24 + */ +public class VolumeConfigs { + private int queueNum = 1; + + public int getQueueNum() { + return queueNum; + } + + public void setQueueNum(int queueNum) { + this.queueNum = queueNum; + } +} diff --git a/header/src/main/java/org/zstack/header/volume/VolumeConfigsExtensionPoint.java b/header/src/main/java/org/zstack/header/volume/VolumeConfigsExtensionPoint.java new file mode 100644 index 00000000000..961515ab198 --- /dev/null +++ b/header/src/main/java/org/zstack/header/volume/VolumeConfigsExtensionPoint.java @@ -0,0 +1,5 @@ +package org.zstack.header.volume; + +public interface VolumeConfigsExtensionPoint { + void setVolumeConfigs(VolumeConfigs vcs, String volUuid); +} diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java index 7fc25cdbfee..ff092060958 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java @@ -9,6 +9,7 @@ import org.zstack.core.retry.RetryCondition; import org.zstack.header.core.Completion; import org.zstack.header.errorcode.OperationFailureException; +import org.zstack.header.volume.VolumeConfigs; import org.zstack.header.volume.VolumeVO; import org.zstack.header.volume.VolumeVO_; import org.zstack.header.xinfini.XInfiniConstants; @@ -335,11 +336,12 @@ protected T call() { }.run(); } - public BdcBdevModule createBdcBdev(int bdcId, int volumeId, String name) { + public BdcBdevModule createBdcBdev(int bdcId, int volumeId, String name, VolumeConfigs vcfs) { CreateBdcBdevRequest req = new CreateBdcBdevRequest(); req.setName(name); req.setBdcId(bdcId); req.setBsVolumeId(volumeId); + req.setQueueNum(vcfs.getQueueNum()); CreateBdcBdevResponse rsp = callErrorOutWithRetry(req, CreateBdcBdevResponse.class, 3); GetBdcBdevRequest gReq = new GetBdcBdevRequest(); gReq.setId(rsp.getSpec().getId()); @@ -358,12 +360,12 @@ public BdcBdevModule queryBdcBdevByVolumeIdAndBdcId(int volId, int bdcId) { return rsp.getItems().get(0); } - public BdcBdevModule getOrCreateBdcBdevByVolumeIdAndBdcId(int volId, int bdcId, String bdevName) { + public BdcBdevModule getOrCreateBdcBdevByVolumeIdAndBdcId(int volId, int bdcId, String bdevName, VolumeConfigs vcfs) { QueryBdcBdevRequest req = new QueryBdcBdevRequest(); req.q = String.format("((spec.bdc_id:%s) AND (spec.bs_volume_id:%s))", bdcId, volId); QueryBdcBdevResponse rsp = queryErrorOut(req, QueryBdcBdevResponse.class); if (rsp.getMetadata().getPagination().getCount() == 0) { - return createBdcBdev(bdcId, volId, bdevName); + return createBdcBdev(bdcId, volId, bdevName, vcfs); } return rsp.getItems().get(0); diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index 76eb9c6b9de..c6b018d91a9 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -19,15 +19,14 @@ import org.zstack.header.storage.addon.primary.*; import org.zstack.header.storage.primary.VolumeSnapshotCapability; import org.zstack.header.storage.snapshot.VolumeSnapshotStats; -import org.zstack.header.volume.VolumeConstant; -import org.zstack.header.volume.VolumeInventory; -import org.zstack.header.volume.VolumeProtocol; -import org.zstack.header.volume.VolumeStats; +import org.zstack.header.volume.*; import org.zstack.header.xinfini.XInfiniConstants; import org.zstack.iscsi.IscsiUtils; import org.zstack.iscsi.kvm.IscsiHeartbeatVolumeTO; import org.zstack.iscsi.kvm.IscsiVolumeTO; +import org.zstack.resourceconfig.ResourceConfigFacade; import org.zstack.storage.addon.primary.ExternalPrimaryStorageFactory; +import org.zstack.storage.volume.VolumeConfigsGetter; import org.zstack.utils.CollectionUtils; import org.zstack.utils.DebugUtils; import org.zstack.utils.Utils; @@ -75,6 +74,8 @@ public class XInfiniStorageController implements PrimaryStorageControllerSvc, Pr private final XInfiniApiHelper apiHelper; @Autowired private ExternalPrimaryStorageFactory extPsFactory; + @Autowired + private ResourceConfigFacade rcf; private final String vhostSocketDir; @@ -164,7 +165,8 @@ private ActiveVolumeTO activeVhostVolume(HostInventory h, BaseVolumeInfo vol) { return to; } - bdev = apiHelper.createBdcBdev(bdc.getSpec().getId(), volModule.getSpec().getId(), vhostName); + VolumeConfigs vcfs = new VolumeConfigsGetter().getConfigs(vol.getUuid()); + bdev = apiHelper.createBdcBdev(bdc.getSpec().getId(), volModule.getSpec().getId(), vhostName, vcfs); to.setInstallPath(bdev.getSpec().getSocketPath()); return to; } @@ -268,7 +270,9 @@ public String getActivePath(BaseVolumeInfo v, HostInventory h, boolean shareable String bdevName = buildBdevName(v.getUuid()); BdcModule bdc = apiHelper.queryBdcByIp(h.getManagementIp()); VolumeModule volModule = getVolumeModule(v); - BdcBdevModule bdev = apiHelper.getOrCreateBdcBdevByVolumeIdAndBdcId(volModule.getSpec().getId(), bdc.getSpec().getId(), bdevName); + VolumeConfigs vcfs = new VolumeConfigsGetter().getConfigs(v.getUuid()); + BdcBdevModule bdev = apiHelper.getOrCreateBdcBdevByVolumeIdAndBdcId(volModule.getSpec().getId(), + bdc.getSpec().getId(), bdevName, vcfs); return bdev.getSpec().getSocketPath(); } else if (VolumeProtocol.iSCSI.toString().equals(v.getProtocol())) { if (v.getInstallPath().contains("@")) { diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/vhost/CreateBdcBdevRequest.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/vhost/CreateBdcBdevRequest.java index 3b64bebf83a..520cb9f15df 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/vhost/CreateBdcBdevRequest.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/vhost/CreateBdcBdevRequest.java @@ -26,9 +26,20 @@ public class CreateBdcBdevRequest extends XInfiniRequest { @Param private int bsVolumeId; + @Param + private int queueNum = 1; + @Param private String name; + public int getQueueNum() { + return queueNum; + } + + public void setQueueNum(int queueNum) { + this.queueNum = queueNum; + } + public String getName() { return name; } diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeConfigsGetter.java b/storage/src/main/java/org/zstack/storage/volume/VolumeConfigsGetter.java new file mode 100644 index 00000000000..0821d2c41b7 --- /dev/null +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeConfigsGetter.java @@ -0,0 +1,35 @@ +package org.zstack.storage.volume; + +import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Configurable; +import org.zstack.core.componentloader.PluginRegistry; +import org.zstack.header.volume.VolumeConfigs; +import org.zstack.header.volume.VolumeConfigsExtensionPoint; + +import java.util.List; + +/** + * @ Author : yh.w + * @ Date : Created in 11:00 2025/2/5 + */ +@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) +public class VolumeConfigsGetter { + + @Autowired + private PluginRegistry pluginRgty; + + public VolumeConfigs getConfigs(String volUuid) { + VolumeConfigs cfs = new VolumeConfigs(); + List exts = pluginRgty.getExtensionList(VolumeConfigsExtensionPoint.class); + if (exts.isEmpty()) { + return cfs; + } + + for (VolumeConfigsExtensionPoint ext : exts) { + ext.setVolumeConfigs(cfs, volUuid); + } + + return cfs; + } +} From cfefad0d9f81a90494a00ead9e32de85d2389e16 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Wed, 5 Feb 2025 18:35:36 +0800 Subject: [PATCH 239/737] [conf]: expand mac limit length DBImpact Resolves: ZSTAC-72446 Change-Id: I636d776f6662716563646d6c6864696c62687076 --- conf/db/upgrade/V5.3.20__schema.sql | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.3.20__schema.sql b/conf/db/upgrade/V5.3.20__schema.sql index e73efd73af7..c41e395d234 100644 --- a/conf/db/upgrade/V5.3.20__schema.sql +++ b/conf/db/upgrade/V5.3.20__schema.sql @@ -77,4 +77,6 @@ DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = '2ad69dc6cebf405f9e0d750bb5 # Delete stable video DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = 'c65d3019cb3f400f80e5e2a10dcaf861'; # Delete yolo -DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = '0b714f4d8c5c43ca86c3a6caa58358a7'; \ No newline at end of file +DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = '0b714f4d8c5c43ca86c3a6caa58358a7'; + +ALTER TABLE `zstack`.`BaremetalNicVO` modify column mac varchar(255) DEFAULT NULL; \ No newline at end of file From 5e1137f2a82f2485513fdad914017eb78f1af2bf Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Fri, 7 Feb 2025 13:48:14 +0800 Subject: [PATCH 240/737] [conf]: update Bentoml to BentoML DBImpact Resolves: ZSTAC-72957 Change-Id: I6864696b6a7764676c6b6b6b6e6e747363726e73 --- conf/db/upgrade/V5.3.20__schema.sql | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.3.20__schema.sql b/conf/db/upgrade/V5.3.20__schema.sql index c41e395d234..50fbe10b6eb 100644 --- a/conf/db/upgrade/V5.3.20__schema.sql +++ b/conf/db/upgrade/V5.3.20__schema.sql @@ -79,4 +79,6 @@ DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = 'c65d3019cb3f400f80e5e2a10d # Delete yolo DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = '0b714f4d8c5c43ca86c3a6caa58358a7'; -ALTER TABLE `zstack`.`BaremetalNicVO` modify column mac varchar(255) DEFAULT NULL; \ No newline at end of file +ALTER TABLE `zstack`.`BaremetalNicVO` modify column mac varchar(255) DEFAULT NULL; + +UPDATE `zstack`.`ModelServiceVO` SET `framework`='BentoML' WHERE `framework`='Bentoml'; \ No newline at end of file From d418ec4dbd68c795717176b4b45cf0a9e5f2ca4e Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Tue, 23 Jul 2024 18:21:04 +0800 Subject: [PATCH 241/737] [migration]: fix offline migration trash incorrect MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、fix trash incorrect caused by concurrent volume migration 2、Add final modifier to some fields in Flow and add case Resolves/Related: ZSTAC-67719 Change-Id: I333e6f687468706d74787267616279626999019b --- ...nstantiateVolumeInAttachingVolumeFlow.java | 9 +- ...atePrimaryStorageForAttachingDiskFlow.java | 8 +- ...VmAssignDeviceIdToAttachingVolumeFlow.java | 2 +- .../compute/vm/VmCreateOnHypervisorFlow.java | 6 +- ...InstantiateResourceForChangeImageFlow.java | 9 +- .../vm/VmInstantiateResourcePostFlow.java | 7 +- .../vm/VmInstantiateResourcePreFlow.java | 9 +- .../compute/vm/VmReleaseResourceFlow.java | 8 +- .../compute/vm/VmStartOnHypervisorFlow.java | 8 +- .../eip/VirtualRouterSyncEipOnStartFlow.java | 2 +- .../VirtualRouterCleanupHaOnDestroyFlow.java | 2 +- ...outerCleanupLoadBalancerOnDestroyFlow.java | 2 +- .../VirtualRouterDeployAgentFlow.java | 2 +- ...terSyncPortForwardingRulesOnStartFlow.java | 2 +- .../VirtualRouterCleanupVipOnDestroyFlow.java | 2 +- .../vyos/VyosDeployAgentFlow.java | 91 ++++++++++++------- .../PrimaryStorageMainAllocatorFlow.java | 2 +- ...geSortByAvailablePhysicalCapacityFlow.java | 2 +- .../primary/PrimaryStorageSortFlow.java | 2 +- .../PrimaryStorageTagAllocatorFlow.java | 7 +- 20 files changed, 88 insertions(+), 94 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAfterInstantiateVolumeInAttachingVolumeFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAfterInstantiateVolumeInAttachingVolumeFlow.java index a614bd0fb1d..b463cca81b0 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmAfterInstantiateVolumeInAttachingVolumeFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAfterInstantiateVolumeInAttachingVolumeFlow.java @@ -4,6 +4,8 @@ import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; +import org.zstack.core.componentloader.PluginRegistry; +import org.zstack.core.db.DatabaseFacade; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.core.workflow.FlowTrigger; @@ -18,8 +20,11 @@ @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VmAfterInstantiateVolumeInAttachingVolumeFlow extends NoRollbackFlow { - CLogger logger = Utils.getLogger(VmAfterInstantiateVolumeInAttachingVolumeFlow.class); - + private static final CLogger logger = Utils.getLogger(VmAfterInstantiateVolumeInAttachingVolumeFlow.class); + @Autowired + private DatabaseFacade dbf; + @Autowired + private PluginRegistry pluginRegistry; @Autowired ErrorFacade errf; @Autowired diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAllocatePrimaryStorageForAttachingDiskFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAllocatePrimaryStorageForAttachingDiskFlow.java index 9a05509d53e..aa9c1e34b50 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmAllocatePrimaryStorageForAttachingDiskFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAllocatePrimaryStorageForAttachingDiskFlow.java @@ -38,7 +38,7 @@ public class VmAllocatePrimaryStorageForAttachingDiskFlow implements Flow { @Autowired protected ErrorFacade errf; - private String allocatedInstallUrl; + private final String ALLOCATED_INSTALL_URL = "allocated_install_url"; @Override public void run(final FlowTrigger chain, final Map data) { @@ -91,9 +91,9 @@ public void run(final FlowTrigger chain, final Map data) { public void run(MessageReply reply) { if (reply.isSuccess()) { AllocatePrimaryStorageSpaceReply ar = (AllocatePrimaryStorageSpaceReply) reply; - allocatedInstallUrl = ar.getAllocatedInstallUrl(); + data.put(ALLOCATED_INSTALL_URL, ar.getAllocatedInstallUrl()); data.put(VmInstanceConstant.Params.DestPrimaryStorageInventoryForAttachingVolume.toString(), ar.getPrimaryStorageInventory()); - data.put(VmInstanceConstant.Params.AllocatedUrlForAttachingVolume.toString(), allocatedInstallUrl); + data.put(VmInstanceConstant.Params.AllocatedUrlForAttachingVolume.toString(), ar.getAllocatedInstallUrl()); data.put(VmAllocatePrimaryStorageForAttachingDiskFlow.class, ar.getSize()); chain.next(); } else { @@ -109,7 +109,7 @@ public void rollback(FlowRollback chain, Map data) { if (size != null) { PrimaryStorageInventory pri = (PrimaryStorageInventory) data.get(VmInstanceConstant.Params.DestPrimaryStorageInventoryForAttachingVolume.toString()); ReleasePrimaryStorageSpaceMsg rmsg = new ReleasePrimaryStorageSpaceMsg(); - rmsg.setAllocatedInstallUrl(allocatedInstallUrl); + rmsg.setAllocatedInstallUrl((String)data.get(ALLOCATED_INSTALL_URL)); rmsg.setPrimaryStorageUuid(pri.getUuid()); rmsg.setDiskSize(size); bus.makeTargetServiceIdByResourceUuid(rmsg, PrimaryStorageConstant.SERVICE_ID, pri.getUuid()); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAssignDeviceIdToAttachingVolumeFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAssignDeviceIdToAttachingVolumeFlow.java index cdc5010a804..28fd645f421 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmAssignDeviceIdToAttachingVolumeFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAssignDeviceIdToAttachingVolumeFlow.java @@ -31,7 +31,7 @@ @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VmAssignDeviceIdToAttachingVolumeFlow implements Flow { - CLogger logger = Utils.getLogger(VmAssignDeviceIdToAttachingVolumeFlow.class); + private static final CLogger logger = Utils.getLogger(VmAssignDeviceIdToAttachingVolumeFlow.class); @Autowired private DatabaseFacade dbf; @Autowired diff --git a/compute/src/main/java/org/zstack/compute/vm/VmCreateOnHypervisorFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmCreateOnHypervisorFlow.java index 51668d6dc0b..5b054dede75 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmCreateOnHypervisorFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmCreateOnHypervisorFlow.java @@ -33,11 +33,7 @@ public class VmCreateOnHypervisorFlow implements Flow { @Autowired private EventFacade evtf; - private List exts; - - public VmCreateOnHypervisorFlow() { - exts = pluginRgty.getExtensionList(VmBeforeCreateOnHypervisorExtensionPoint.class); - } + private final List exts = pluginRgty.getExtensionList(VmBeforeCreateOnHypervisorExtensionPoint.class); private void fireExtensions(VmInstanceSpec spec) { for (VmBeforeCreateOnHypervisorExtensionPoint ext : exts) { diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourceForChangeImageFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourceForChangeImageFlow.java index f84c0c59577..bbdb2978036 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourceForChangeImageFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourceForChangeImageFlow.java @@ -25,14 +25,9 @@ public class VmInstantiateResourceForChangeImageFlow implements Flow { @Autowired private PluginRegistry pluginRgty; - private static List extensions = null; + private final List extensions = pluginRgty.getExtensionList(ChangeVmImageExtensionPoint.class); + - public VmInstantiateResourceForChangeImageFlow() { - if (extensions == null) { - extensions = pluginRgty.getExtensionList(ChangeVmImageExtensionPoint.class); - } - } - private void runExtensions(final Iterator it, final VmInstanceSpec spec, final FlowTrigger chain) { if (!it.hasNext()) { chain.next(); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourcePostFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourcePostFlow.java index 07914db1903..e6a7f14c34d 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourcePostFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourcePostFlow.java @@ -28,13 +28,8 @@ public class VmInstantiateResourcePostFlow implements Flow { @Autowired private PluginRegistry pluginRgty; - private static List extensions; + private final List extensions = pluginRgty.getExtensionList(PostVmInstantiateResourceExtensionPoint.class); - public VmInstantiateResourcePostFlow() { - if (extensions == null) { - extensions = pluginRgty.getExtensionList(PostVmInstantiateResourceExtensionPoint.class); - } - } public void run(FlowTrigger trigger, Map data) { VmInstanceSpec spec = (VmInstanceSpec) data.get(VmInstanceConstant.Params.VmInstanceSpec.toString()); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourcePreFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourcePreFlow.java index 6f71c6ac970..4c7b6eee38f 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourcePreFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourcePreFlow.java @@ -29,14 +29,9 @@ public class VmInstantiateResourcePreFlow implements Flow { @Autowired private PluginRegistry pluginRgty; - private static List extensions = null; - - public VmInstantiateResourcePreFlow() { - if (extensions == null) { - extensions = pluginRgty.getExtensionList(PreVmInstantiateResourceExtensionPoint.class); - } - } + private final List extensions = pluginRgty.getExtensionList(PreVmInstantiateResourceExtensionPoint.class); + private void runExtensions(final Iterator it, final VmInstanceSpec spec, final FlowTrigger chain) { if (!it.hasNext()) { spec.setInstantiateResourcesSuccess(true); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmReleaseResourceFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmReleaseResourceFlow.java index 56fe116c3ca..a57b93acde1 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmReleaseResourceFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmReleaseResourceFlow.java @@ -27,13 +27,7 @@ public class VmReleaseResourceFlow implements Flow { @Autowired private PluginRegistry pluginRgty; - private static List extensions = null; - - public VmReleaseResourceFlow() { - if (extensions == null) { - extensions = pluginRgty.getExtensionList(VmReleaseResourceExtensionPoint.class); - } - } + private final List extensions = pluginRgty.getExtensionList(VmReleaseResourceExtensionPoint.class); private void fireExtensions(final Iterator it, final VmInstanceSpec spec, final Map ctx, final FlowTrigger chain) { diff --git a/compute/src/main/java/org/zstack/compute/vm/VmStartOnHypervisorFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmStartOnHypervisorFlow.java index f2ced4d90da..20965f61655 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmStartOnHypervisorFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmStartOnHypervisorFlow.java @@ -19,18 +19,14 @@ import java.util.Map; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VmStartOnHypervisorFlow implements Flow { - private static CLogger logger = Utils.getLogger(VmStartOnHypervisorFlow.class); + private static final CLogger logger = Utils.getLogger(VmStartOnHypervisorFlow.class); @Autowired private CloudBus bus; @Autowired private PluginRegistry pluginRgty; - private List exts; - - public VmStartOnHypervisorFlow() { - exts = pluginRgty.getExtensionList(VmBeforeStartOnHypervisorExtensionPoint.class); - } + private final List exts = pluginRgty.getExtensionList(VmBeforeStartOnHypervisorExtensionPoint.class);; private void fireExtensions(VmInstanceSpec spec) { for (VmBeforeStartOnHypervisorExtensionPoint ext : exts) { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterSyncEipOnStartFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterSyncEipOnStartFlow.java index 7b3c4525b54..64e4558f95e 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterSyncEipOnStartFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterSyncEipOnStartFlow.java @@ -44,7 +44,7 @@ */ @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VirtualRouterSyncEipOnStartFlow implements Flow { - private static CLogger logger = Utils.getLogger(VirtualRouterSyncEipOnStartFlow.class); + private static final CLogger logger = Utils.getLogger(VirtualRouterSyncEipOnStartFlow.class); @Autowired private DatabaseFacade dbf; diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/ha/VirtualRouterCleanupHaOnDestroyFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/ha/VirtualRouterCleanupHaOnDestroyFlow.java index e67b6b1dc4c..c2bdfb28eb5 100644 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/ha/VirtualRouterCleanupHaOnDestroyFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/ha/VirtualRouterCleanupHaOnDestroyFlow.java @@ -31,7 +31,7 @@ public class VirtualRouterCleanupHaOnDestroyFlow extends NoRollbackFlow { @Autowired protected VirtualRouterHaBackend haBackend; - private static CLogger logger = Utils.getLogger(VirtualRouterCleanupHaOnDestroyFlow.class); + private static final CLogger logger = Utils.getLogger(VirtualRouterCleanupHaOnDestroyFlow.class); @Override public void run(final FlowTrigger trigger, Map data) { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterCleanupLoadBalancerOnDestroyFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterCleanupLoadBalancerOnDestroyFlow.java index 9f65907275d..1ef8e3143b6 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterCleanupLoadBalancerOnDestroyFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterCleanupLoadBalancerOnDestroyFlow.java @@ -20,7 +20,7 @@ public class VirtualRouterCleanupLoadBalancerOnDestroyFlow extends NoRollbackFlow { @Autowired private DatabaseFacade dbf; - private static CLogger logger = Utils.getLogger(VirtualRouterCleanupLoadBalancerOnDestroyFlow.class); + private static final CLogger logger = Utils.getLogger(VirtualRouterCleanupLoadBalancerOnDestroyFlow.class); @Override public void run(FlowTrigger trigger, Map data) { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lifecycle/VirtualRouterDeployAgentFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lifecycle/VirtualRouterDeployAgentFlow.java index d33c22b7c83..8d9f6b176ee 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lifecycle/VirtualRouterDeployAgentFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lifecycle/VirtualRouterDeployAgentFlow.java @@ -54,7 +54,7 @@ public class VirtualRouterDeployAgentFlow extends NoRollbackFlow { @Autowired private UpgradeChecker upgradeChecker; - private String agentPackageName = VirtualRouterGlobalProperty.AGENT_PACKAGE_NAME; + private final String agentPackageName = VirtualRouterGlobalProperty.AGENT_PACKAGE_NAME; private void continueConnect(final VmNicInventory mgmtNic, final Map data, final FlowTrigger completion) { final VirtualRouterVmInventory vr = (VirtualRouterVmInventory) data.get(VirtualRouterConstant.Param.VR.toString()); diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterSyncPortForwardingRulesOnStartFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterSyncPortForwardingRulesOnStartFlow.java index ed913350047..535fab9814b 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterSyncPortForwardingRulesOnStartFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterSyncPortForwardingRulesOnStartFlow.java @@ -34,7 +34,7 @@ @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VirtualRouterSyncPortForwardingRulesOnStartFlow implements Flow { - private static CLogger logger = Utils.getLogger(VirtualRouterSyncPortForwardingRulesOnStartFlow.class); + private static final CLogger logger = Utils.getLogger(VirtualRouterSyncPortForwardingRulesOnStartFlow.class); @Autowired private DatabaseFacade dbf; diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterCleanupVipOnDestroyFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterCleanupVipOnDestroyFlow.java index f96d36ff948..cf54d466037 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterCleanupVipOnDestroyFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterCleanupVipOnDestroyFlow.java @@ -33,7 +33,7 @@ public class VirtualRouterCleanupVipOnDestroyFlow extends NoRollbackFlow { @Autowired protected VipConfigProxy vipConfigProxy; - private static CLogger logger = Utils.getLogger(VirtualRouterCleanupVipOnDestroyFlow.class); + private static final CLogger logger = Utils.getLogger(VirtualRouterCleanupVipOnDestroyFlow.class); @Override public void run(final FlowTrigger trigger, Map data) { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosDeployAgentFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosDeployAgentFlow.java index 967d1086312..3aa35766d86 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosDeployAgentFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosDeployAgentFlow.java @@ -52,13 +52,36 @@ public class VyosDeployAgentFlow extends NoRollbackFlow { private UpgradeChecker upgradeChecker; - private String REMOTE_USER; - private String REMOTE_PASS = VirtualRouterGlobalConfig.VYOS_PASSWORD.value(); - private int REMOTE_PORT = VirtualRouterGlobalConfig.SSH_PORT.value(Integer.class); + private final String REMOTE_USER = "REMOTE_USER"; + private final String REMOTE_PASS = VirtualRouterGlobalConfig.VYOS_PASSWORD.value(); + private final int REMOTE_PORT = VirtualRouterGlobalConfig.SSH_PORT.value(Integer.class); + + private final String REMOTE_ZVR_DIR = "REMOTE_ZVR_DIR"; + private final String REMOTE_ZVR_BIN_PATH = "REMOTE_ZVR_BIN_PATH"; + private final String REMOTE_ZVRBOOT_BIN_PATH = "REMOTE_ZVRBOOT_BIN_PATH"; + + private String storeDataToMap(Map map, String key, String value) { + map.put(key, value); + return value; + } + + private String getRemoteUser(Map data) { + return (String) data.get(REMOTE_USER); + } + + private String getRemoteZvrDir(Map data) { + return (String) data.get(REMOTE_ZVR_DIR); + } + + private String getRemoteZvrBinPath(Map data) { + return (String) data.get(REMOTE_ZVR_BIN_PATH); + } + + private String getRemoteZvrbootBinPath(Map data) { + return (String) data.get(REMOTE_ZVRBOOT_BIN_PATH); + } + - private String REMOTE_ZVR_DIR; - private String REMOTE_ZVR_BIN_PATH; - private String REMOTE_ZVRBOOT_BIN_PATH; @Override public void run(FlowTrigger trigger, Map data) { @@ -79,10 +102,10 @@ public void run(FlowTrigger trigger, Map data) { String vrUserTag = VirtualRouterSystemTags.VIRTUAL_ROUTER_LOGIN_USER.getTokenByResourceUuid( vrUuid, VirtualRouterVmVO.class, VirtualRouterSystemTags.VIRTUAL_ROUTER_LOGIN_USER_TOKEN); - REMOTE_USER = vrUserTag != null ? vrUserTag : "vyos"; //old vpc vrouter has no tag, that's vyos. - REMOTE_ZVR_DIR = String.format("/home/%s/zvr", REMOTE_USER); - REMOTE_ZVR_BIN_PATH = String.format("/home/%s/zvr.bin", REMOTE_USER); - REMOTE_ZVRBOOT_BIN_PATH = String.format("/home/%s/zvrboot.bin", REMOTE_USER); + String remoteUser = storeDataToMap(data, REMOTE_USER, vrUserTag != null ? vrUserTag : "vyos"); //old vpc vrouter has no tag, that's vyos. + String remoteZvrDir = storeDataToMap(data, REMOTE_ZVR_DIR, String.format("/home/%s/zvr", remoteUser)); + String remoteZvrBinPath = storeDataToMap(data, REMOTE_ZVR_BIN_PATH, String.format("/home/%s/zvr.bin", remoteUser)); + String remoteZvrBootBinPath = storeDataToMap(data, REMOTE_ZVRBOOT_BIN_PATH, String.format("/home/%s/zvrboot.bin", remoteUser)); if (!isReconnect && !ApplianceVmGlobalConfig.DEPLOY_AGENT_ON_START.value(Boolean.class)) { @@ -130,8 +153,8 @@ public boolean run() { } if (NetworkUtils.isRemotePortOpen(mgmtNicIp, REMOTE_PORT, 2000)) { - if(isZvrMd5Changed(mgmtNicIp, REMOTE_PORT)){ - logger.debug(String.format("will deploy virtual router agent by remote user[%s] from management", REMOTE_USER)); + if(isZvrMd5Changed(mgmtNicIp, REMOTE_PORT, data)){ + logger.debug(String.format("will deploy virtual router agent by remote user[%s] from management", remoteUser)); deployAgent(REMOTE_PORT); forceReboot = true; } @@ -153,14 +176,14 @@ private void deployAgent(int port) { try { new Ssh().setTimeout(300).scpUpload( PathUtil.findFileOnClassPath("ansible/zvr/zvr.bin", true).getAbsolutePath(), - REMOTE_ZVR_BIN_PATH + remoteZvrBinPath ).scpUpload( PathUtil.findFileOnClassPath("ansible/zvr/zvrboot.bin", true).getAbsolutePath(), - REMOTE_ZVRBOOT_BIN_PATH + remoteZvrBootBinPath ).scpUpload( PathUtil.findFileOnClassPath("ansible/zvr/version", true).getAbsolutePath(), - String.format("%s/mn_zvr_version", REMOTE_ZVR_DIR) - ).setPrivateKey(asf.getPrivateKey()).setUsername(REMOTE_USER).setHostname(mgmtNicIp).setPort(port).runErrorByExceptionAndClose(); + String.format("%s/mn_zvr_version", remoteZvrDir) + ).setPrivateKey(asf.getPrivateKey()).setUsername(remoteUser).setHostname(mgmtNicIp).setPort(port).runErrorByExceptionAndClose(); } catch (SshException e ) { /* @@ -168,14 +191,14 @@ private void deployAgent(int port) { */ new Ssh().setTimeout(300).scpUpload( PathUtil.findFileOnClassPath("ansible/zvr/zvr.bin", true).getAbsolutePath(), - REMOTE_ZVR_BIN_PATH + remoteZvrBinPath ).scpUpload( PathUtil.findFileOnClassPath("ansible/zvr/zvrboot.bin", true).getAbsolutePath(), - REMOTE_ZVRBOOT_BIN_PATH + remoteZvrBootBinPath ).scpUpload( PathUtil.findFileOnClassPath("ansible/zvr/version", true).getAbsolutePath(), - String.format("%s/mn_zvr_version", REMOTE_ZVR_DIR) - ).setPassword(REMOTE_PASS).setUsername(REMOTE_USER).setHostname(mgmtNicIp).setPort(port).runErrorByExceptionAndClose(); + String.format("%s/mn_zvr_version", remoteZvrDir) + ).setPassword(REMOTE_PASS).setUsername(remoteUser).setHostname(mgmtNicIp).setPort(port).runErrorByExceptionAndClose(); } // update vyos agent version when open grayScaleUpgrade @@ -186,17 +209,17 @@ private void rebootAgent(int port, boolean forceReboot) { String script = String.format("sudo bash %s\n" + "sudo bash %s\n" + "sudo bash %s/ssh/zvr-reboot.sh %s\n", - REMOTE_ZVRBOOT_BIN_PATH, REMOTE_ZVR_BIN_PATH, REMOTE_ZVR_DIR, forceReboot); + remoteZvrBootBinPath, remoteZvrBinPath, remoteZvrDir, forceReboot); try { new Ssh().shell(script - ).setTimeout(300).setPrivateKey(asf.getPrivateKey()).setUsername(REMOTE_USER).setHostname(mgmtNicIp).setPort(port).runErrorByExceptionAndClose(); + ).setTimeout(300).setPrivateKey(asf.getPrivateKey()).setUsername(remoteUser).setHostname(mgmtNicIp).setPort(port).runErrorByExceptionAndClose(); } catch (SshException e ) { /* ZSTAC-18352, try again with password when key fail */ new Ssh().shell(script - ).setTimeout(300).setPassword(REMOTE_PASS).setUsername(REMOTE_USER).setHostname(mgmtNicIp).setPort(port).runErrorByExceptionAndClose(); + ).setTimeout(300).setPassword(REMOTE_PASS).setUsername(remoteUser).setHostname(mgmtNicIp).setPort(port).runErrorByExceptionAndClose(); } } @@ -218,10 +241,10 @@ public String getName() { }); } - private boolean isZvrMd5Changed(String ip, int port){ + private boolean isZvrMd5Changed(String ip, int port, Map data){ int interval = 30 ; Ssh ssh = new Ssh(); - ssh.setUsername(REMOTE_USER) + ssh.setUsername(getRemoteUser(data)) .setPrivateKey(asf.getPrivateKey()) .setPort(port) .setHostname(ip) @@ -235,7 +258,7 @@ private boolean isZvrMd5Changed(String ip, int port){ try { - ssh.command(String.format("sudo -S md5sum %s 2>/dev/null", REMOTE_ZVR_BIN_PATH)); + ssh.command(String.format("sudo -S md5sum %s 2>/dev/null", getRemoteZvrBinPath(data))); SshResult ret = ssh.run(); if (ret.getReturnCode() == 0) { remoteZvrMd5 = ret.getStdout().split(" ")[0]; @@ -248,11 +271,11 @@ private boolean isZvrMd5Changed(String ip, int port){ if (!remoteZvrMd5.equals(localZvrMd5)) { logger.debug(String.format("file MD5 changed, local[%s, md5:%s] remote[%s, md5: %s]", localZvrPath, - localZvrMd5, REMOTE_ZVR_BIN_PATH, remoteZvrMd5)); + localZvrMd5, getRemoteZvrBinPath(data), remoteZvrMd5)); return true; } - ssh.command(String.format("sudo -S md5sum %s", REMOTE_ZVRBOOT_BIN_PATH)); + ssh.command(String.format("sudo -S md5sum %s", getRemoteZvrbootBinPath(data))); ret = ssh.run(); if (ret.getReturnCode() == 0) { remoteZvrbootMd5 = ret.getStdout().split(" ")[0]; @@ -265,7 +288,7 @@ private boolean isZvrMd5Changed(String ip, int port){ if (!remoteZvrbootMd5.equals(localZvrbootMd5)) { logger.debug(String.format("file MD5 changed, local[%s, md5:%s] remote[%s, md5: %s]", localZvrBootPath, - localZvrbootMd5, REMOTE_ZVRBOOT_BIN_PATH, remoteZvrbootMd5)); + localZvrbootMd5, getRemoteZvrbootBinPath(data), remoteZvrbootMd5)); return true; } @@ -304,20 +327,20 @@ public VmNicInventory call(VmNicInventory arg) { mgmtNicIp = (String) data.get(Params.managementNicIp.toString()); } - debug(mgmtNicIp, 30); + debug(mgmtNicIp, 30, data); trigger.rollback(); } - private void debug (String vrMgtIp, int timeout) { + private void debug (String vrMgtIp, int timeout, Map data) { if (!NetworkUtils.isRemotePortOpen(vrMgtIp, REMOTE_PORT, timeout)) { logger.debug(String.format("virtual router agent port %s is not opened on managment nic %s", REMOTE_PORT, vrMgtIp)); return; } Ssh ssh1 = new Ssh(); - ssh1.setUsername(REMOTE_USER).setPrivateKey(asf.getPrivateKey()).setPort(REMOTE_PORT) + ssh1.setUsername(getRemoteUser(data)).setPrivateKey(asf.getPrivateKey()).setPort(REMOTE_PORT) .setHostname(vrMgtIp).setTimeout(timeout); - SshResult ret1 = ssh1.command(String.format("sudo tail -n 300 %s/zvrReboot.log", REMOTE_ZVR_DIR)).runAndClose(); + SshResult ret1 = ssh1.command(String.format("sudo tail -n 300 %s/zvrReboot.log", getRemoteZvrDir(data))).runAndClose(); if (ret1.getReturnCode() == 0) { logger.debug(String.format("virtual router reboot log %s", ret1.getStdout())); } else { @@ -325,7 +348,7 @@ private void debug (String vrMgtIp, int timeout) { } Ssh ssh2 = new Ssh(); - ssh2.setUsername(REMOTE_USER).setPrivateKey(asf.getPrivateKey()).setPort(REMOTE_PORT) + ssh2.setUsername(getRemoteUser(data)).setPrivateKey(asf.getPrivateKey()).setPort(REMOTE_PORT) .setHostname(vrMgtIp).setTimeout(timeout); SshResult ret2 = ssh2.command("sudo tail -n 300 /tmp/agentRestart.log").runAndClose(); if (ret2.getReturnCode() == 0) { diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageMainAllocatorFlow.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageMainAllocatorFlow.java index a5c4c6242ef..074a12b3193 100755 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageMainAllocatorFlow.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageMainAllocatorFlow.java @@ -32,7 +32,7 @@ */ @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class PrimaryStorageMainAllocatorFlow extends NoRollbackFlow { - private static CLogger logger = Utils.getLogger(PrimaryStorageMainAllocatorFlow.class); + private static final CLogger logger = Utils.getLogger(PrimaryStorageMainAllocatorFlow.class); @Autowired protected DatabaseFacade dbf; diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageSortByAvailablePhysicalCapacityFlow.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageSortByAvailablePhysicalCapacityFlow.java index 529d9fbb3c2..01a316be593 100644 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageSortByAvailablePhysicalCapacityFlow.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageSortByAvailablePhysicalCapacityFlow.java @@ -22,7 +22,7 @@ @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class PrimaryStorageSortByAvailablePhysicalCapacityFlow extends NoRollbackFlow { - private static CLogger logger = Utils.getLogger(PrimaryStorageSortByAvailablePhysicalCapacityFlow.class); + private static final CLogger logger = Utils.getLogger(PrimaryStorageSortByAvailablePhysicalCapacityFlow.class); @Override diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageSortFlow.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageSortFlow.java index 127c29a6aba..be1b234202c 100644 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageSortFlow.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageSortFlow.java @@ -23,7 +23,7 @@ @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class PrimaryStorageSortFlow extends NoRollbackFlow { - private static CLogger logger = Utils.getLogger(PrimaryStorageSortFlow.class); + private static final CLogger logger = Utils.getLogger(PrimaryStorageSortFlow.class); @Autowired protected PrimaryStoragePriorityGetter priorityGetter; diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageTagAllocatorFlow.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageTagAllocatorFlow.java index c708dbc66de..26595c4b199 100755 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageTagAllocatorFlow.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageTagAllocatorFlow.java @@ -38,13 +38,8 @@ public class PrimaryStorageTagAllocatorFlow extends NoRollbackFlow { @Autowired private PluginRegistry pluginRgty; - protected static List tagExtensions; + protected final List tagExtensions = pluginRgty.getExtensionList(PrimaryStorageTagAllocatorExtensionPoint.class);; - public PrimaryStorageTagAllocatorFlow() { - if (tagExtensions == null) { - tagExtensions = pluginRgty.getExtensionList(PrimaryStorageTagAllocatorExtensionPoint.class); - } - } @Override public void run(FlowTrigger trigger, Map data) { From f7033390b87b1c55e7a2861d26237ec24f799c6d Mon Sep 17 00:00:00 2001 From: shenjin Date: Sat, 8 Feb 2025 16:19:12 +0800 Subject: [PATCH 242/737] [conf]: set vm resource config when upgrade set vm resource config with resource binding systemtag when upgrade Resolves: ZSTAC-65564 Change-Id: I66696e7376777277717361656a7470636c6c7964 --- conf/db/upgrade/V5.3.20__schema.sql | 45 ++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.3.20__schema.sql b/conf/db/upgrade/V5.3.20__schema.sql index 50fbe10b6eb..ca1ad57c1d8 100644 --- a/conf/db/upgrade/V5.3.20__schema.sql +++ b/conf/db/upgrade/V5.3.20__schema.sql @@ -81,4 +81,47 @@ DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = '0b714f4d8c5c43ca86c3a6caa5 ALTER TABLE `zstack`.`BaremetalNicVO` modify column mac varchar(255) DEFAULT NULL; -UPDATE `zstack`.`ModelServiceVO` SET `framework`='BentoML' WHERE `framework`='Bentoml'; \ No newline at end of file +UPDATE `zstack`.`ModelServiceVO` SET `framework`='BentoML' WHERE `framework`='Bentoml'; + +DROP PROCEDURE IF EXISTS CreateResourceConfigForBindingVms; +DELIMITER $$ +CREATE PROCEDURE CreateResourceConfigForBindingVms() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE vmUuid VARCHAR(128); + + DECLARE vmCursor CURSOR FOR + SELECT resourceUuid + FROM SystemTagVO + WHERE resourceType = 'VmInstanceVO' + AND tag LIKE 'resourceBindings::Cluster:%'; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + OPEN vmCursor; + + read_loop: LOOP + FETCH vmCursor INTO vmUuid; + + IF done THEN + LEAVE read_loop; + END IF; + + IF NOT EXISTS ( + SELECT 1 + FROM ResourceConfigVO + WHERE resourceType = 'VmInstanceVO' + AND resourceUuid = vmUuid + AND category = 'vm' + AND name = 'vm.ha.across.clusters' + ) THEN + INSERT INTO ResourceConfigVO (uuid, name, category, value, resourceUuid, resourceType, lastOpDate, createDate) + VALUES (REPLACE(UUID(),'-',''), 'vm.ha.across.clusters', 'vm', 'false', vmUuid, 'VmInstanceVO', NOW(), NOW()); + END IF; + END LOOP; + + CLOSE vmCursor; +END $$ +DELIMITER ; +call CreateResourceConfigForBindingVms(); +DROP PROCEDURE IF EXISTS CreateResourceConfigForBindingVms; From 5ad2533c40f24c3992226928a7a3f5bc4d9806b5 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Tue, 11 Feb 2025 11:39:04 +0800 Subject: [PATCH 243/737] [sdk]: Update sdk Resolves: ZSTAC-72402 Change-Id: I6e7363656a64636a726861616f69706f62707572 --- sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java | 2 +- sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index 3c225ef845f..c358878ddca 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -76,7 +76,7 @@ public Result throwExceptionIfError() { @Param(required = false, validValues = {"Other","Bentoml","HuggingFace"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String source = "Other"; - @Param(required = false, validValues = {"vLLM","Diffusers","Transformers","sentence_transformers","llama.cpp","Ollama"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"vLLM","Diffusers","Transformers","sentence_transformers","llama.cpp","Ollama","Other"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String framework; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java index fe7f42fab6e..88c7d66ad96 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java @@ -62,6 +62,9 @@ public Result throwExceptionIfError() { public java.lang.String type; @Param(required = false, validValues = {"Other","Bentoml","HuggingFace"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String source; + + @Param(required = false, validValues = {"vLLM","Diffusers","Transformers","sentence_transformers","llama.cpp","Ollama","Other"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String framework; @Param(required = false) From 0eebdbff9e477a39333fc1e2ced1ba5e9b1bd485 Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Tue, 10 Dec 2024 10:59:44 +0800 Subject: [PATCH 244/737] [host]: fix host reconnect failed When there are identical HostOsCategorizeVO records in the database, it may lead to SQL execution errors and host disconnection Resolves/Related: ZSTAC-68036 Change-Id: I62908b776c6d6270617063757366626d78637772 --- .../hypervisor/KvmHypervisorInfoHelper.java | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/hypervisor/KvmHypervisorInfoHelper.java b/plugin/kvm/src/main/java/org/zstack/kvm/hypervisor/KvmHypervisorInfoHelper.java index d39fb35e922..4c0b3613024 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/hypervisor/KvmHypervisorInfoHelper.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/hypervisor/KvmHypervisorInfoHelper.java @@ -1,5 +1,7 @@ package org.zstack.kvm.hypervisor; +import org.zstack.core.Platform; +import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.header.host.HostVO_; import org.zstack.header.host.HostOperationSystem; @@ -42,6 +44,7 @@ public static Map collectExpectedHypervisorInfoForHost final Map, HostOsCategoryVO> caches = new HashMap<>(); final Map results = new HashMap<>(); + DatabaseFacade dbf = Platform.getComponentLoader().getComponent(DatabaseFacade.class); for (String hostUuid : hostUuidList) { String architecture = hostArchMap.get(hostUuid); if (architecture == null) { @@ -59,10 +62,22 @@ public static Map collectExpectedHypervisorInfoForHost continue; } - vo = Q.New(HostOsCategoryVO.class) - .eq(HostOsCategoryVO_.architecture, architecture) - .eq(HostOsCategoryVO_.osReleaseVersion, osReleaseVersion) - .find(); + String sql = " select h from HostOsCategoryVO h, KvmHostHypervisorMetadataVO k where k.categoryUuid = h.uuid " + + "and k.managementNodeUuid = :mnId " + + "and h.architecture = :arch " + + "and h.osReleaseVersion = :os " + + "order by k.createDate desc"; + + List resultList = dbf.getEntityManager().createQuery(sql, HostOsCategoryVO.class) + .setParameter("arch", architecture) + .setParameter("os", osReleaseVersion) + .setParameter("mnId", Platform.getManagementServerId()) + .setMaxResults(1) + .getResultList(); + if (!resultList.isEmpty()) { + vo = resultList.get(0); + } + caches.put(key, vo); results.put(hostUuid, vo); } From 0917718458bd63e1d1ff8f63e5ccd4821ea87f1d Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 11 Feb 2025 19:09:57 +0800 Subject: [PATCH 245/737] [sdk]: Update sdk Resolves: ZSTAC-72802 Change-Id: I676a6b716d756a63636a6171786d766c796a6275 Signed-off-by: ye.zou --- .../zstack/sdk/UpdateModelServiceInstanceGroupAction.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java index 66b6453478d..4b9290bdc24 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java @@ -28,9 +28,12 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; - @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + @Param(required = false) public java.util.List systemTags; From 385724ac9f5ac06d634811457e06374df235000f Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 1 Nov 2024 17:53:48 +0900 Subject: [PATCH 246/737] [rest]: Introduce rest server per IP rate limits - Add global property RestServer.rateLimits to set limits of rest server - Add RateLimiter.java for common usages GlobalPropertyImpact Resolves: ZSTAC-70518 Change-Id: I796b696a667962767473677975706768617a697a Signed-off-by: AlanJager (cherry picked from commit 87c63d8bd56fd7b4bfad2095292e706cb4367bf9) --- .../java/org/zstack/rest/RateLimiter.java | 65 +++++++++++++++++++ .../org/zstack/rest/RestGlobalProperty.java | 3 + .../main/java/org/zstack/rest/RestServer.java | 28 +++++++- 3 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 rest/src/main/java/org/zstack/rest/RateLimiter.java diff --git a/rest/src/main/java/org/zstack/rest/RateLimiter.java b/rest/src/main/java/org/zstack/rest/RateLimiter.java new file mode 100644 index 00000000000..9bd579b3d48 --- /dev/null +++ b/rest/src/main/java/org/zstack/rest/RateLimiter.java @@ -0,0 +1,65 @@ +package org.zstack.rest; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; + +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; + +public class RateLimiter { + private final LoadingCache requestCache; + private final int maxRequestsPerMinute; + + public RateLimiter(int maxRequestsPerMinute) { + this.maxRequestsPerMinute = maxRequestsPerMinute; + this.requestCache = CacheBuilder.newBuilder() + .expireAfterWrite(1, TimeUnit.MINUTES) + .build(new CacheLoader() { + @Override + public TokenBucket load(String key) { + return new TokenBucket(maxRequestsPerMinute); + } + }); + } + + public boolean isRateLimitExceeded(String clientIp) { + try { + TokenBucket bucket = requestCache.get(clientIp); + return !bucket.tryConsume(); + } catch (ExecutionException e) { + // 处理异常 + return false; + } + } + + private static class TokenBucket { + private final Queue timestamps = new ConcurrentLinkedQueue<>(); + private final int capacity; + + public TokenBucket(int capacity) { + this.capacity = capacity; + } + + public synchronized boolean tryConsume() { + long now = System.currentTimeMillis(); + long boundary = now - TimeUnit.MINUTES.toMillis(1); + + // remove time stamps over boundary + while (!timestamps.isEmpty() && timestamps.peek() <= boundary) { + timestamps.poll(); + } + + // check requests limitation + if (timestamps.size() >= capacity) { + return false; + } + + // add latest request timestamp + timestamps.offer(now); + return true; + } + } +} diff --git a/rest/src/main/java/org/zstack/rest/RestGlobalProperty.java b/rest/src/main/java/org/zstack/rest/RestGlobalProperty.java index 0c95c86ae21..60f8e015e80 100755 --- a/rest/src/main/java/org/zstack/rest/RestGlobalProperty.java +++ b/rest/src/main/java/org/zstack/rest/RestGlobalProperty.java @@ -10,4 +10,7 @@ public class RestGlobalProperty { @GlobalProperty(name="RestServer.maxCachedApiResults", defaultValue = "2000") public static int MAX_CACHED_API_RESULTS; + + @GlobalProperty(name="RestServer.rateLimits", defaultValue = "12000") + public static int REST_RATE_LIMITS; } diff --git a/rest/src/main/java/org/zstack/rest/RestServer.java b/rest/src/main/java/org/zstack/rest/RestServer.java index 04d1c838488..3d702b211fa 100755 --- a/rest/src/main/java/org/zstack/rest/RestServer.java +++ b/rest/src/main/java/org/zstack/rest/RestServer.java @@ -41,6 +41,12 @@ import org.zstack.header.identity.SuppressCredentialCheck; import org.zstack.header.log.MaskSensitiveInfo; import org.zstack.header.message.*; +import org.zstack.header.message.APIEvent; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APISyncCallMessage; +import org.zstack.header.message.Event; +import org.zstack.header.message.JsonSchemaBuilder; +import org.zstack.header.message.MessageReply; import org.zstack.header.query.APIQueryMessage; import org.zstack.header.query.APIQueryReply; import org.zstack.header.query.QueryCondition; @@ -60,7 +66,12 @@ import org.zstack.rest.sdk.DocumentGenerator; import org.zstack.rest.sdk.SdkFile; import org.zstack.rest.sdk.SdkTemplate; -import org.zstack.utils.*; +import org.zstack.utils.DebugUtils; +import org.zstack.utils.FieldUtils; +import org.zstack.utils.GroovyUtils; +import org.zstack.utils.HttpServletRequestUtils; +import org.zstack.utils.TypeUtils; +import org.zstack.utils.Utils; import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; import org.zstack.utils.path.PathUtil; @@ -129,6 +140,8 @@ public class RestServer implements Component, CloudBusEventListener { @Autowired private PluginRegistry pluginRgty; + RateLimiter rateLimiter = new RateLimiter(RestGlobalProperty.REST_RATE_LIMITS); + private Map restAuthBackends = new HashMap(); private List interceptors = new ArrayList<>(); @@ -168,8 +181,13 @@ static class RequestInfo { public RequestInfo(HttpServletRequest req) { session = req.getSession(); remoteHost = req.getRemoteHost(); - clientIp = HttpServletRequestUtils.getClientIP(req); clientBrowser = HttpServletRequestUtils.getClientBrowser(req); + String ipFromRequest = HttpServletRequestUtils.getClientIP(req); + if (ipFromRequest == null) { + clientIp = "Unknown"; + } else { + clientIp = ipFromRequest; + } for (Enumeration e = req.getHeaderNames(); e.hasMoreElements() ;) { String name = e.nextElement().toString(); @@ -638,6 +656,12 @@ private String getMatchPath(String path) { void handle(HttpServletRequest req, HttpServletResponse rsp) throws IOException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { RequestInfo info = new RequestInfo(req); + + if (rateLimiter.isRateLimitExceeded(info.clientIp)) { + sendResponse(HttpStatus.TOO_MANY_REQUESTS.value(), "Rate limit exceeded", rsp); + return; + } + requestInfo.set(info); rsp.setCharacterEncoding("utf-8"); String path = getDecodedUrl(req); From 34640505fddd980ebd9f6eeaa9751410712ecd37 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 4 Nov 2024 13:57:16 +0900 Subject: [PATCH 247/737] [thread]: Introduce separate thread pools - Use ConcurrentHashMap and ThreadPoolRegisterExtensionPoint to support register component's related thread pools - Add extension point checking to make sure at least 10 threads could be used by internal thread pools Resolves: ZSTAC-70518 Change-Id: I626a79777571756f74756a6f677a7671766d6167 (cherry picked from commit be6544a2b3cb1191cf28d5ced2bb4b05692ba321) --- .../zstack/core/thread/DispatchQueueImpl.java | 4 +- .../org/zstack/core/thread/ThreadFacade.java | 3 + .../zstack/core/thread/ThreadFacadeImpl.java | 56 ++++++++++++++++++- .../org/zstack/core/thread/ThreadPool.java | 22 ++++++++ .../ThreadPoolRegisterExtensionPoint.java | 5 ++ 5 files changed, 85 insertions(+), 5 deletions(-) create mode 100644 core/src/main/java/org/zstack/core/thread/ThreadPool.java create mode 100644 core/src/main/java/org/zstack/core/thread/ThreadPoolRegisterExtensionPoint.java diff --git a/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java b/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java index 1601c47a73d..356844c7dc6 100755 --- a/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java +++ b/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java @@ -415,7 +415,7 @@ void startThreadIfNeeded() { resetPendingQueueThreshold(); counter.incrementAndGet(); - _threadFacade.submitSyncPool(new Task() { + _threadFacade.submitTargetPool(new Task() { @Override public String getName() { return syncSignature; @@ -446,7 +446,7 @@ public Void call() { run(); return null; } - }); + }, syncSignature); } @Override diff --git a/core/src/main/java/org/zstack/core/thread/ThreadFacade.java b/core/src/main/java/org/zstack/core/thread/ThreadFacade.java index 76663e4b2de..9eca11fa0f4 100755 --- a/core/src/main/java/org/zstack/core/thread/ThreadFacade.java +++ b/core/src/main/java/org/zstack/core/thread/ThreadFacade.java @@ -13,6 +13,8 @@ public interface ThreadFacade extends Component { Future submitSyncPool(Task task); + Future submitTargetPool(Task task, String signature); + Future syncSubmit(SyncTask task); Future chainSubmit(ChainTask task); @@ -46,5 +48,6 @@ public interface ThreadFacade extends Component { Runnable submitTimerTask(TimerTask task, TimeUnit unit, long delay); int getSyncThreadNum(int totalThreadNum); + void printThreadsAndTasks(); } diff --git a/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java b/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java index 2d591b36888..48bb6d0045f 100755 --- a/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java @@ -1,6 +1,7 @@ package org.zstack.core.thread; import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.jmx.JmxFacade; import org.zstack.header.core.progress.ChainInfo; import org.zstack.header.core.progress.SingleFlightChainInfo; @@ -21,11 +22,14 @@ public class ThreadFacadeImpl implements ThreadFacade, ThreadFactory, RejectedEx private static final AtomicInteger seqNum = new AtomicInteger(0); private ScheduledThreadPoolExecutorExt _pool; private ScheduledThreadPoolExecutorExt _syncpool; // for sync tasks + private ConcurrentHashMap pools = new ConcurrentHashMap<>(); private DispatchQueue dpq; private final TimerPool timerPool = new TimerPool(5); @Autowired private JmxFacade jmxf; + @Autowired + private PluginRegistry pluginRegistry; private static class TimerWrapper extends Timer { private int cancelledTimerTaskCount = 0; @@ -129,21 +133,61 @@ public int getSyncThreadNum(int totalThreadNum) { public void init() { int totalThreadNum = ThreadGlobalProperty.MAX_THREAD_NUM; - if (totalThreadNum < 10) { - _logger.warn(String.format("ThreadFacade.maxThreadNum is configured to %s, which is too small for running zstack. Change it to 10", ThreadGlobalProperty.MAX_THREAD_NUM)); - totalThreadNum = 10; + + List poolList = new ArrayList<>(); + for (ThreadPoolRegisterExtensionPoint ext : pluginRegistry.getExtensionList(ThreadPoolRegisterExtensionPoint.class)) { + ThreadPool threadPool = ext.registerThreadPool(); + if (threadPool == null) { + throw new CloudRuntimeException("Empty thread pool registration is not supported"); + } + + if (threadPool.getSyncSignature() == null) { + throw new CloudRuntimeException("Thread pool registration do not allow empty syncSignature"); + } + + if (poolList.stream().anyMatch(pool -> pool.getSyncSignature().equals(threadPool.getSyncSignature()))) { + throw new CloudRuntimeException(String.format("Duplicate sync signature %s", threadPool.getSyncSignature())); + } + poolList.add(threadPool); } + + int separatedThreadNum = poolList.stream().mapToInt(ThreadPool::getThreadNum).sum(); + int internalThreadNum = totalThreadNum - separatedThreadNum; + if (internalThreadNum < 10) { + _logger.warn(String.format("ThreadFacade.maxThreadNum is configured to %s." + + " Remaining thread number for internal pools is %d, which is too" + + " small for running zstack. Change it to 10", + internalThreadNum, + ThreadGlobalProperty.MAX_THREAD_NUM)); + internalThreadNum = 10; + totalThreadNum = separatedThreadNum + internalThreadNum; + } + + _logger.debug(String.format("Total thread num: %s, registered thread num %s," + + " internal thread num %s", totalThreadNum, + separatedThreadNum, + internalThreadNum)); _pool = new ScheduledThreadPoolExecutorExt(totalThreadNum, this, this); _syncpool = new ScheduledThreadPoolExecutorExt(getSyncThreadNum(totalThreadNum), this, this); + poolList.forEach(this::initThreadPool); _logger.debug(String.format("create ThreadFacade with max thread number:%s", totalThreadNum)); dpq = new DispatchQueueImpl(); jmxf.registerBean("ThreadFacade", this); } + private void initThreadPool(ThreadPool pool) { + ScheduledThreadPoolExecutorExt threadExt = new ScheduledThreadPoolExecutorExt(pool.getThreadNum(), this, this); + pools.put(pool.getSyncSignature(), threadExt); + } + public void destroy() { _pool.shutdownNow(); _syncpool.shutdown(); + pools.forEach((queueName, pool) -> { + _logger.debug(String.format("shutdown thread pool: %s", queueName)); + pool.shutdown(); + }); } @Override @@ -155,6 +199,12 @@ public Future submitSyncPool(Task task) { return _syncpool.submit(new Worker(task)); } + @Override + public Future submitTargetPool(Task task, String signature) { + ScheduledThreadPoolExecutorExt executorExt = pools.getOrDefault(signature, _syncpool); + return executorExt.submit(new Worker<>(task)); + } + @Override public Thread newThread(@Nonnull Runnable arg0) { return new Thread(arg0, "zs-thread-" + seqNum.getAndIncrement()); diff --git a/core/src/main/java/org/zstack/core/thread/ThreadPool.java b/core/src/main/java/org/zstack/core/thread/ThreadPool.java new file mode 100644 index 00000000000..f68e86f92e0 --- /dev/null +++ b/core/src/main/java/org/zstack/core/thread/ThreadPool.java @@ -0,0 +1,22 @@ +package org.zstack.core.thread; + +public class ThreadPool { + private String syncSignature; + private int threadNum; + + public String getSyncSignature() { + return syncSignature; + } + + public void setSyncSignature(String syncSignature) { + this.syncSignature = syncSignature; + } + + public int getThreadNum() { + return threadNum; + } + + public void setThreadNum(int threadNum) { + this.threadNum = threadNum; + } +} diff --git a/core/src/main/java/org/zstack/core/thread/ThreadPoolRegisterExtensionPoint.java b/core/src/main/java/org/zstack/core/thread/ThreadPoolRegisterExtensionPoint.java new file mode 100644 index 00000000000..e054f76ed57 --- /dev/null +++ b/core/src/main/java/org/zstack/core/thread/ThreadPoolRegisterExtensionPoint.java @@ -0,0 +1,5 @@ +package org.zstack.core.thread; + +public interface ThreadPoolRegisterExtensionPoint { + ThreadPool registerThreadPool(); +} From cc025165eb413f6efd71d8bcf64b712e4685b751 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 4 Nov 2024 19:03:17 +0900 Subject: [PATCH 248/737] [thread]: Introduce separate thread pools - Use ConcurrentHashMap and ThreadPoolRegisterExtensionPoint to support register component's related thread pools - Add extension point checking to make sure at least 10 threads could be used by internal thread pools Resolves: ZSTAC-70518 Change-Id: I626a79777571756f74756a6f677a7671766d6167 (cherry picked from commit 7dba99f9664428c6d7943093123f530acbfef3c1) --- .../zstack/core/thread/ThreadFacadeImpl.java | 89 ++++++++++++------- .../ThreadPoolRegisterExtensionPoint.java | 4 +- 2 files changed, 58 insertions(+), 35 deletions(-) diff --git a/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java b/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java index 48bb6d0045f..e8e54abbeb0 100755 --- a/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java @@ -6,6 +6,7 @@ import org.zstack.header.core.progress.ChainInfo; import org.zstack.header.core.progress.SingleFlightChainInfo; import org.zstack.header.exception.CloudRuntimeException; +import org.zstack.utils.CollectionUtils; import org.zstack.utils.logging.CLogger; import org.zstack.utils.logging.CLoggerImpl; @@ -13,6 +14,7 @@ import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; public class ThreadFacadeImpl implements ThreadFacade, ThreadFactory, RejectedExecutionHandler, ThreadFacadeMXBean { private static final CLogger _logger = CLoggerImpl.getLogger(ThreadFacadeImpl.class); @@ -133,43 +135,12 @@ public int getSyncThreadNum(int totalThreadNum) { public void init() { int totalThreadNum = ThreadGlobalProperty.MAX_THREAD_NUM; - - List poolList = new ArrayList<>(); - for (ThreadPoolRegisterExtensionPoint ext : pluginRegistry.getExtensionList(ThreadPoolRegisterExtensionPoint.class)) { - ThreadPool threadPool = ext.registerThreadPool(); - if (threadPool == null) { - throw new CloudRuntimeException("Empty thread pool registration is not supported"); - } - - if (threadPool.getSyncSignature() == null) { - throw new CloudRuntimeException("Thread pool registration do not allow empty syncSignature"); - } - - if (poolList.stream().anyMatch(pool -> pool.getSyncSignature().equals(threadPool.getSyncSignature()))) { - throw new CloudRuntimeException(String.format("Duplicate sync signature %s", threadPool.getSyncSignature())); - } - poolList.add(threadPool); + if (totalThreadNum < 10) { + _logger.warn(String.format("ThreadFacade.maxThreadNum is configured to %s, which is too small for running zstack. Change it to 10", ThreadGlobalProperty.MAX_THREAD_NUM)); + totalThreadNum = 10; } - - int separatedThreadNum = poolList.stream().mapToInt(ThreadPool::getThreadNum).sum(); - int internalThreadNum = totalThreadNum - separatedThreadNum; - if (internalThreadNum < 10) { - _logger.warn(String.format("ThreadFacade.maxThreadNum is configured to %s." + - " Remaining thread number for internal pools is %d, which is too" + - " small for running zstack. Change it to 10", - internalThreadNum, - ThreadGlobalProperty.MAX_THREAD_NUM)); - internalThreadNum = 10; - totalThreadNum = separatedThreadNum + internalThreadNum; - } - - _logger.debug(String.format("Total thread num: %s, registered thread num %s," + - " internal thread num %s", totalThreadNum, - separatedThreadNum, - internalThreadNum)); _pool = new ScheduledThreadPoolExecutorExt(totalThreadNum, this, this); _syncpool = new ScheduledThreadPoolExecutorExt(getSyncThreadNum(totalThreadNum), this, this); - poolList.forEach(this::initThreadPool); _logger.debug(String.format("create ThreadFacade with max thread number:%s", totalThreadNum)); dpq = new DispatchQueueImpl(); @@ -360,13 +331,63 @@ public void run() { @Override public boolean start() { + int totalThreadNum = ThreadGlobalProperty.MAX_THREAD_NUM; + + List poolList = new ArrayList<>(); + for (ThreadPoolRegisterExtensionPoint ext : pluginRegistry.getExtensionList(ThreadPoolRegisterExtensionPoint.class)) { + List threadPools = ext.registerThreadPool(); + if (CollectionUtils.isEmpty(threadPools)) { + throw new CloudRuntimeException("Empty thread pool registration is not supported"); + } + + List noSignaturePools = threadPools.stream().filter(pool -> pool.getSyncSignature() == null).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(noSignaturePools)) { + throw new CloudRuntimeException("Thread pool registration do not allow empty syncSignature"); + } + + List distinctPoolNames = threadPools.stream().map(ThreadPool::getSyncSignature).distinct().collect(Collectors.toList()); + if (distinctPoolNames.size() < threadPools.size()) { + throw new CloudRuntimeException(String.format("Duplicate thread pool name detected %s", threadPools.stream().map(ThreadPool::getSyncSignature).collect(Collectors.toList()))); + } + + List nameDuplicatePool = poolList.stream().filter(pool -> threadPools.stream().anyMatch(newPool -> pool.getSyncSignature().equals(newPool.getSyncSignature()))).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(nameDuplicatePool)) { + throw new CloudRuntimeException(String.format("Duplicate thread pool name with existing pool %s", nameDuplicatePool.stream().map(ThreadPool::getSyncSignature).collect(Collectors.toList()))); + } + poolList.addAll(threadPools); + } + + _logger.debug(String.format("Load separate thread pool: %d", poolList.size())); + int separatedThreadNum = poolList.stream().mapToInt(ThreadPool::getThreadNum).sum(); + int internalThreadNum = totalThreadNum - separatedThreadNum; + if (internalThreadNum < 10) { + _logger.warn(String.format("ThreadFacade.maxThreadNum is configured to %s." + + " Remaining thread number for internal pools is %d, which is too" + + " small for running zstack. Change it to 10", + internalThreadNum, + ThreadGlobalProperty.MAX_THREAD_NUM)); + internalThreadNum = 10; + totalThreadNum = separatedThreadNum + internalThreadNum; + } + + _logger.debug(String.format("Total thread num: %s, registered thread num %s," + + " internal thread num %s", totalThreadNum, + separatedThreadNum, + internalThreadNum)); + poolList.forEach(this::initThreadPool); + return true; } @Override public boolean stop() { _pool.shutdown(); + _syncpool.shutdown(); timerPool.stop(); + pools.forEach((queueName, pool) -> { + _logger.debug(String.format("shutdown thread pool: %s", queueName)); + pool.shutdown(); + }); return true; } diff --git a/core/src/main/java/org/zstack/core/thread/ThreadPoolRegisterExtensionPoint.java b/core/src/main/java/org/zstack/core/thread/ThreadPoolRegisterExtensionPoint.java index e054f76ed57..88ccf644aa8 100644 --- a/core/src/main/java/org/zstack/core/thread/ThreadPoolRegisterExtensionPoint.java +++ b/core/src/main/java/org/zstack/core/thread/ThreadPoolRegisterExtensionPoint.java @@ -1,5 +1,7 @@ package org.zstack.core.thread; +import java.util.List; + public interface ThreadPoolRegisterExtensionPoint { - ThreadPool registerThreadPool(); + List registerThreadPool(); } From 44bb8732fa00f81b882a699ae9f17f9570955af1 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 4 Nov 2024 19:03:54 +0900 Subject: [PATCH 249/737] [portal]: Submit api.worker to separte thread pool Resolves: ZSTAC-70518 Change-Id: I6a7363756f6a6c6f7277716c6577626f73626266 Signed-off-by: AlanJager (cherry picked from commit d3027120ae318ec4adf87aa52770a4c389aa5de9) --- conf/springConfigXml/ApiMediator.xml | 1 + .../main/java/org/zstack/core/Platform.java | 6 + .../portal/apimediator/ApiMediatorImpl.java | 141 ++++++++++++++---- 3 files changed, 123 insertions(+), 25 deletions(-) diff --git a/conf/springConfigXml/ApiMediator.xml b/conf/springConfigXml/ApiMediator.xml index 65490622818..ff215a5a0ae 100755 --- a/conf/springConfigXml/ApiMediator.xml +++ b/conf/springConfigXml/ApiMediator.xml @@ -15,6 +15,7 @@ + diff --git a/core/src/main/java/org/zstack/core/Platform.java b/core/src/main/java/org/zstack/core/Platform.java index b1b4963c265..4093b47846f 100755 --- a/core/src/main/java/org/zstack/core/Platform.java +++ b/core/src/main/java/org/zstack/core/Platform.java @@ -20,6 +20,7 @@ import org.zstack.core.search.SearchGlobalProperty; import org.zstack.core.statemachine.StateMachine; import org.zstack.core.statemachine.StateMachineImpl; +import org.zstack.core.thread.ThreadFacade; import org.zstack.header.Component; import org.zstack.header.core.StaticInit; import org.zstack.header.core.encrypt.ENCRYPT; @@ -665,6 +666,11 @@ public static ComponentLoader createComponentLoaderFromWebApplicationContext(Web ((Component)gcf).start(); } + ThreadFacade thdf = loader.getComponent(ThreadFacade.class); + if (thdf != null) { + thdf.start(); + } + bus = loader.getComponentNoExceptionWhenNotExisting(CloudBus.class); if (bus != null) { bus.start(); diff --git a/portal/src/main/java/org/zstack/portal/apimediator/ApiMediatorImpl.java b/portal/src/main/java/org/zstack/portal/apimediator/ApiMediatorImpl.java index b7addac8b80..b02ed07565f 100755 --- a/portal/src/main/java/org/zstack/portal/apimediator/ApiMediatorImpl.java +++ b/portal/src/main/java/org/zstack/portal/apimediator/ApiMediatorImpl.java @@ -9,12 +9,40 @@ import org.zstack.core.db.DatabaseFacade; import org.zstack.core.thread.SyncTask; import org.zstack.core.thread.ThreadFacade; +import org.zstack.core.thread.ThreadPool; +import org.zstack.core.thread.ThreadPoolRegisterExtensionPoint; import org.zstack.header.AbstractService; -import org.zstack.header.apimediator.*; +import org.zstack.header.apimediator.APIIsReadyToGoMsg; +import org.zstack.header.apimediator.APIIsReadyToGoReply; +import org.zstack.header.apimediator.ApiMediatorConstant; +import org.zstack.header.apimediator.ApiMessageInterceptionException; +import org.zstack.header.apimediator.GlobalApiMessageInterceptor; +import org.zstack.header.apimediator.PortalErrors; +import org.zstack.header.apimediator.StopRoutingException; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.SysErrors; -import org.zstack.header.managementnode.*; -import org.zstack.header.message.*; +import org.zstack.header.managementnode.APIGetCurrentTimeMsg; +import org.zstack.header.managementnode.APIGetCurrentTimeReply; +import org.zstack.header.managementnode.APIGetManagementNodeArchMsg; +import org.zstack.header.managementnode.APIGetManagementNodeArchReply; +import org.zstack.header.managementnode.APIGetManagementNodeOSMsg; +import org.zstack.header.managementnode.APIGetManagementNodeOSReply; +import org.zstack.header.managementnode.APIGetPlatformTimeZoneMsg; +import org.zstack.header.managementnode.APIGetPlatformTimeZoneReply; +import org.zstack.header.managementnode.APIGetSupportAPIsMsg; +import org.zstack.header.managementnode.APIGetSupportAPIsReply; +import org.zstack.header.managementnode.APIGetVersionMsg; +import org.zstack.header.managementnode.APIGetVersionReply; +import org.zstack.header.managementnode.IsManagementNodeReadyMsg; +import org.zstack.header.managementnode.IsManagementNodeReadyReply; +import org.zstack.header.managementnode.ManagementNodeConstant; +import org.zstack.header.message.APICreateMessage; +import org.zstack.header.message.APIEvent; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIReply; +import org.zstack.header.message.APISyncCallMessage; +import org.zstack.header.message.Message; +import org.zstack.header.message.MessageReply; import org.zstack.header.rest.RestAPIExtensionPoint; import org.zstack.utils.StringDSL; import org.zstack.utils.Utils; @@ -23,6 +51,7 @@ import java.time.ZonedDateTime; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -32,7 +61,10 @@ import static org.zstack.utils.CollectionDSL.map; -public class ApiMediatorImpl extends AbstractService implements ApiMediator, GlobalApiMessageInterceptor { +public class ApiMediatorImpl extends AbstractService implements + ApiMediator, + ThreadPoolRegisterExtensionPoint, + GlobalApiMessageInterceptor { private static final CLogger logger = Utils.getLogger(ApiMediator.class); @Autowired @@ -45,6 +77,9 @@ public class ApiMediatorImpl extends AbstractService implements ApiMediator, Glo private PluginRegistry pluginRgty; private List apiExts = new ArrayList<>(); + private final String API_WORKER_SYNC_SIGNATURE = "api.worker"; + + private final String ASYNC_API_WORKER_SYNC_SIGNATURE = "async.api.worker"; private ApiMessageProcessor processor; @@ -103,10 +138,41 @@ private void dispatchMessage(APIMessage msg) { @Override public void handleMessage(final Message msg) { apiExts.forEach(e -> e.afterAPIRequest(msg)); + + if (msg instanceof APISyncCallMessage) { + syncCallMessageHandle(msg); + } else { + asyncCallMessageHandle(msg); + } + } + + private void doHandleMessage(final Message msg) { + if (msg instanceof APIIsReadyToGoMsg) { + handle((APIIsReadyToGoMsg) msg); + } else if (msg instanceof APIGetVersionMsg) { + handle((APIGetVersionMsg) msg); + }else if (msg instanceof APIGetSupportAPIsMsg) { + handle((APIGetSupportAPIsMsg) msg); + } else if (msg instanceof APIGetCurrentTimeMsg) { + handle((APIGetCurrentTimeMsg) msg); + } else if (msg instanceof APIGetPlatformTimeZoneMsg) { + handle((APIGetPlatformTimeZoneMsg) msg); + } else if (msg instanceof APIGetManagementNodeArchMsg) { + handle((APIGetManagementNodeArchMsg) msg); + } else if (msg instanceof APIGetManagementNodeOSMsg) { + handle((APIGetManagementNodeOSMsg) msg); + } else if (msg instanceof APIMessage) { + dispatchMessage((APIMessage) msg); + } else { + logger.debug("Not an APIMessage.Message ID is " + msg.getId()); + } + } + + private void asyncCallMessageHandle(final Message msg) { thdf.syncSubmit(new SyncTask() { @Override public String getSyncSignature() { - return "api.worker"; + return ASYNC_API_WORKER_SYNC_SIGNATURE; } @Override @@ -116,30 +182,42 @@ public int getSyncLevel() { @Override public String getName() { - return "api.worker"; + return ASYNC_API_WORKER_SYNC_SIGNATURE; } @MessageSafe void handleMessage(Message msg) { - if (msg instanceof APIIsReadyToGoMsg) { - handle((APIIsReadyToGoMsg) msg); - } else if (msg instanceof APIGetVersionMsg) { - handle((APIGetVersionMsg) msg); - }else if (msg instanceof APIGetSupportAPIsMsg) { - handle((APIGetSupportAPIsMsg) msg); - } else if (msg instanceof APIGetCurrentTimeMsg) { - handle((APIGetCurrentTimeMsg) msg); - } else if (msg instanceof APIGetPlatformTimeZoneMsg) { - handle((APIGetPlatformTimeZoneMsg) msg); - } else if (msg instanceof APIGetManagementNodeArchMsg) { - handle((APIGetManagementNodeArchMsg) msg); - } else if (msg instanceof APIGetManagementNodeOSMsg) { - handle((APIGetManagementNodeOSMsg) msg); - } else if (msg instanceof APIMessage) { - dispatchMessage((APIMessage) msg); - } else { - logger.debug("Not an APIMessage.Message ID is " + msg.getId()); - } + doHandleMessage(msg); + } + + @Override + public Object call() { + handleMessage(msg); + return null; + } + }); + } + + private void syncCallMessageHandle(final Message msg) { + thdf.syncSubmit(new SyncTask() { + @Override + public String getSyncSignature() { + return API_WORKER_SYNC_SIGNATURE; + } + + @Override + public int getSyncLevel() { + return apiWorkerNum; + } + + @Override + public String getName() { + return API_WORKER_SYNC_SIGNATURE; + } + + @MessageSafe + void handleMessage(Message msg) { + doHandleMessage(msg); } @Override @@ -286,4 +364,17 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti public ApiMessageProcessor getProcesser() { return processor; } + + @Override + public List registerThreadPool() { + ThreadPool pool = new ThreadPool(); + pool.setSyncSignature(API_WORKER_SYNC_SIGNATURE); + pool.setThreadNum(5); + + ThreadPool asyncPool = new ThreadPool(); + asyncPool.setSyncSignature(ASYNC_API_WORKER_SYNC_SIGNATURE); + asyncPool.setThreadNum(5); + + return Arrays.asList(pool, asyncPool); + } } From 7b66e4b1f84ab6d62ef2b4911ee6e58bc72d9257 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 7 Nov 2024 16:48:26 +0900 Subject: [PATCH 250/737] [managementnode]: Introduce more thread pool changes - Serve management node apis in isolated thread pools to avoid fake death status - Make sync/async/management apis threads number configurable - Keep the shared thread pool api handling code snippets, because the isolated thread pools usage is a new feature, still support user to change back to the old mechanism APIImpact Resolves: ZSTAC-57941 Change-Id: I74636678646f69636b6b63767a62636a6a646976 (cherry picked from commit a18fb9f78480e4538540ea9856767b6f817da983) --- conf/springConfigXml/ApiMediator.xml | 27 +-- .../header/apimediator/APIIsReadyToGoMsg.java | 3 +- .../ApiWorkerThreadPoolStrategy.java | 6 + .../managementnode/APIGetCurrentTimeMsg.java | 2 +- .../APIGetManagementNodeArchMsg.java | 2 +- .../APIGetManagementNodeOSMsg.java | 2 +- .../APIGetPlatformTimeZoneMsg.java | 2 +- .../managementnode/APIGetSupportAPIsMsg.java | 2 +- .../managementnode/APIGetVersionMsg.java | 2 +- .../APIManagementNodeMessage.java | 4 + .../portal/apimediator/ApiMediatorImpl.java | 163 +++++++++++++++++- 11 files changed, 188 insertions(+), 27 deletions(-) create mode 100644 header/src/main/java/org/zstack/header/apimediator/ApiWorkerThreadPoolStrategy.java create mode 100644 header/src/main/java/org/zstack/header/managementnode/APIManagementNodeMessage.java diff --git a/conf/springConfigXml/ApiMediator.xml b/conf/springConfigXml/ApiMediator.xml index ff215a5a0ae..1a4d1b1e6ee 100755 --- a/conf/springConfigXml/ApiMediator.xml +++ b/conf/springConfigXml/ApiMediator.xml @@ -1,8 +1,8 @@ - + default-init-method="init" default-destroy-method="destroy"> + - - + + - - + + + + + serviceConfig - + - + - + diff --git a/header/src/main/java/org/zstack/header/apimediator/APIIsReadyToGoMsg.java b/header/src/main/java/org/zstack/header/apimediator/APIIsReadyToGoMsg.java index 3003c0bf7c7..9aee1c4edde 100755 --- a/header/src/main/java/org/zstack/header/apimediator/APIIsReadyToGoMsg.java +++ b/header/src/main/java/org/zstack/header/apimediator/APIIsReadyToGoMsg.java @@ -2,6 +2,7 @@ import org.springframework.http.HttpMethod; import org.zstack.header.identity.SuppressCredentialCheck; +import org.zstack.header.managementnode.APIManagementNodeMessage; import org.zstack.header.message.APISyncCallMessage; import org.zstack.header.rest.RestRequest; @@ -12,7 +13,7 @@ responseClass = APIIsReadyToGoReply.class, category = "other" ) -public class APIIsReadyToGoMsg extends APISyncCallMessage { +public class APIIsReadyToGoMsg extends APISyncCallMessage implements APIManagementNodeMessage { private String managementNodeId; public String getManagementNodeId() { diff --git a/header/src/main/java/org/zstack/header/apimediator/ApiWorkerThreadPoolStrategy.java b/header/src/main/java/org/zstack/header/apimediator/ApiWorkerThreadPoolStrategy.java new file mode 100644 index 00000000000..d45589ea08e --- /dev/null +++ b/header/src/main/java/org/zstack/header/apimediator/ApiWorkerThreadPoolStrategy.java @@ -0,0 +1,6 @@ +package org.zstack.header.apimediator; + +public enum ApiWorkerThreadPoolStrategy { + SHARED, + ISOLATED +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/managementnode/APIGetCurrentTimeMsg.java b/header/src/main/java/org/zstack/header/managementnode/APIGetCurrentTimeMsg.java index b234ca862cc..ec569b5d0ba 100755 --- a/header/src/main/java/org/zstack/header/managementnode/APIGetCurrentTimeMsg.java +++ b/header/src/main/java/org/zstack/header/managementnode/APIGetCurrentTimeMsg.java @@ -15,7 +15,7 @@ method = HttpMethod.PUT, responseClass = APIGetCurrentTimeReply.class ) -public class APIGetCurrentTimeMsg extends APISyncCallMessage { +public class APIGetCurrentTimeMsg extends APISyncCallMessage implements APIManagementNodeMessage { public static APIGetCurrentTimeMsg __example__() { APIGetCurrentTimeMsg msg = new APIGetCurrentTimeMsg(); diff --git a/header/src/main/java/org/zstack/header/managementnode/APIGetManagementNodeArchMsg.java b/header/src/main/java/org/zstack/header/managementnode/APIGetManagementNodeArchMsg.java index f56eca7063f..2a928050d64 100644 --- a/header/src/main/java/org/zstack/header/managementnode/APIGetManagementNodeArchMsg.java +++ b/header/src/main/java/org/zstack/header/managementnode/APIGetManagementNodeArchMsg.java @@ -17,7 +17,7 @@ responseClass = APIGetManagementNodeArchReply.class ) @SuppressCredentialCheck -public class APIGetManagementNodeArchMsg extends APISyncCallMessage { +public class APIGetManagementNodeArchMsg extends APISyncCallMessage implements APIManagementNodeMessage { public static APIGetManagementNodeArchMsg __example__() { APIGetManagementNodeArchMsg msg = new APIGetManagementNodeArchMsg(); diff --git a/header/src/main/java/org/zstack/header/managementnode/APIGetManagementNodeOSMsg.java b/header/src/main/java/org/zstack/header/managementnode/APIGetManagementNodeOSMsg.java index 22179bb6e94..407d63b3de6 100644 --- a/header/src/main/java/org/zstack/header/managementnode/APIGetManagementNodeOSMsg.java +++ b/header/src/main/java/org/zstack/header/managementnode/APIGetManagementNodeOSMsg.java @@ -16,7 +16,7 @@ responseClass = APIGetManagementNodeOSReply.class ) @SuppressCredentialCheck -public class APIGetManagementNodeOSMsg extends APISyncCallMessage { +public class APIGetManagementNodeOSMsg extends APISyncCallMessage implements APIManagementNodeMessage { public static APIGetManagementNodeOSMsg __example__() { APIGetManagementNodeOSMsg msg = new APIGetManagementNodeOSMsg(); diff --git a/header/src/main/java/org/zstack/header/managementnode/APIGetPlatformTimeZoneMsg.java b/header/src/main/java/org/zstack/header/managementnode/APIGetPlatformTimeZoneMsg.java index 79dabf86811..8e93957d06f 100644 --- a/header/src/main/java/org/zstack/header/managementnode/APIGetPlatformTimeZoneMsg.java +++ b/header/src/main/java/org/zstack/header/managementnode/APIGetPlatformTimeZoneMsg.java @@ -12,7 +12,7 @@ method = HttpMethod.GET, responseClass = APIGetPlatformTimeZoneReply.class ) -public class APIGetPlatformTimeZoneMsg extends APISyncCallMessage { +public class APIGetPlatformTimeZoneMsg extends APISyncCallMessage implements APIManagementNodeMessage { public static APIGetPlatformTimeZoneMsg __example__() { APIGetPlatformTimeZoneMsg msg = new APIGetPlatformTimeZoneMsg(); return msg; diff --git a/header/src/main/java/org/zstack/header/managementnode/APIGetSupportAPIsMsg.java b/header/src/main/java/org/zstack/header/managementnode/APIGetSupportAPIsMsg.java index 2a0be05290c..7ff8adb7870 100644 --- a/header/src/main/java/org/zstack/header/managementnode/APIGetSupportAPIsMsg.java +++ b/header/src/main/java/org/zstack/header/managementnode/APIGetSupportAPIsMsg.java @@ -12,7 +12,7 @@ method = HttpMethod.PUT, responseClass = APIGetSupportAPIsReply.class ) -public class APIGetSupportAPIsMsg extends APISyncCallMessage { +public class APIGetSupportAPIsMsg extends APISyncCallMessage implements APIManagementNodeMessage { public static APIGetSupportAPIsMsg __example__() { return new APIGetSupportAPIsMsg(); diff --git a/header/src/main/java/org/zstack/header/managementnode/APIGetVersionMsg.java b/header/src/main/java/org/zstack/header/managementnode/APIGetVersionMsg.java index 2693b109954..f9a9f3209d6 100755 --- a/header/src/main/java/org/zstack/header/managementnode/APIGetVersionMsg.java +++ b/header/src/main/java/org/zstack/header/managementnode/APIGetVersionMsg.java @@ -15,7 +15,7 @@ responseClass = APIGetVersionReply.class, method = HttpMethod.PUT ) -public class APIGetVersionMsg extends APISyncCallMessage { +public class APIGetVersionMsg extends APISyncCallMessage implements APIManagementNodeMessage { public static APIGetVersionMsg __example__() { APIGetVersionMsg msg = new APIGetVersionMsg(); diff --git a/header/src/main/java/org/zstack/header/managementnode/APIManagementNodeMessage.java b/header/src/main/java/org/zstack/header/managementnode/APIManagementNodeMessage.java new file mode 100644 index 00000000000..3f006f2eafe --- /dev/null +++ b/header/src/main/java/org/zstack/header/managementnode/APIManagementNodeMessage.java @@ -0,0 +1,4 @@ +package org.zstack.header.managementnode; + +public interface APIManagementNodeMessage { +} diff --git a/portal/src/main/java/org/zstack/portal/apimediator/ApiMediatorImpl.java b/portal/src/main/java/org/zstack/portal/apimediator/ApiMediatorImpl.java index b02ed07565f..7409fbc5df1 100755 --- a/portal/src/main/java/org/zstack/portal/apimediator/ApiMediatorImpl.java +++ b/portal/src/main/java/org/zstack/portal/apimediator/ApiMediatorImpl.java @@ -16,6 +16,7 @@ import org.zstack.header.apimediator.APIIsReadyToGoReply; import org.zstack.header.apimediator.ApiMediatorConstant; import org.zstack.header.apimediator.ApiMessageInterceptionException; +import org.zstack.header.apimediator.ApiWorkerThreadPoolStrategy; import org.zstack.header.apimediator.GlobalApiMessageInterceptor; import org.zstack.header.apimediator.PortalErrors; import org.zstack.header.apimediator.StopRoutingException; @@ -33,6 +34,7 @@ import org.zstack.header.managementnode.APIGetSupportAPIsReply; import org.zstack.header.managementnode.APIGetVersionMsg; import org.zstack.header.managementnode.APIGetVersionReply; +import org.zstack.header.managementnode.APIManagementNodeMessage; import org.zstack.header.managementnode.IsManagementNodeReadyMsg; import org.zstack.header.managementnode.IsManagementNodeReadyReply; import org.zstack.header.managementnode.ManagementNodeConstant; @@ -81,10 +83,15 @@ public class ApiMediatorImpl extends AbstractService implements private final String ASYNC_API_WORKER_SYNC_SIGNATURE = "async.api.worker"; + private final String MANAGEMENT_API_WORKER_SYNC_SIGNATURE = "management.api.worker"; + private ApiMessageProcessor processor; private List serviceConfigFolders; private int apiWorkerNum = 5; + private int asyncApiWorkerNum = 5; + private int managementApiWorkerNum = 5; + private ApiWorkerThreadPoolStrategy threadPoolStrategy = ApiWorkerThreadPoolStrategy.ISOLATED; private void dispatchMessage(APIMessage msg) { ApiMessageDescriptor desc = processor.getApiMessageDescriptor(msg); @@ -139,14 +146,58 @@ private void dispatchMessage(APIMessage msg) { public void handleMessage(final Message msg) { apiExts.forEach(e -> e.afterAPIRequest(msg)); - if (msg instanceof APISyncCallMessage) { - syncCallMessageHandle(msg); + if (threadPoolStrategy == ApiWorkerThreadPoolStrategy.ISOLATED) { + if (msg instanceof APIManagementNodeMessage) { + managementCallMessageHandle(msg); + } else if (msg instanceof APISyncCallMessage) { + syncCallMessageHandle(msg); + } else { + asyncCallMessageHandle(msg); + } } else { - asyncCallMessageHandle(msg); + handleMessageInSharedStrategy(msg); } } - private void doHandleMessage(final Message msg) { + /** + * Handle message using legacy shared thread pool strategy. + * In shared mode, all API calls (management, sync, async) share the same thread pool, + * which is controlled by single parameter 'apiWorkerNum'. + * This mode is kept for backwards compatibility. + * + * @param msg The message to be handled + */ + private void handleMessageInSharedStrategy(final Message msg) { + thdf.syncSubmit(new SyncTask() { + @Override + public String getSyncSignature() { + return API_WORKER_SYNC_SIGNATURE; + } + + @Override + public int getSyncLevel() { + return apiWorkerNum; + } + + @Override + public String getName() { + return API_WORKER_SYNC_SIGNATURE; + } + + @MessageSafe + void handleMessage(Message msg) { + doHandleAllMessages(msg); + } + + @Override + public Object call() { + handleMessage(msg); + return null; + } + }); + } + + private void doHandleAllMessages(final Message msg) { if (msg instanceof APIIsReadyToGoMsg) { handle((APIIsReadyToGoMsg) msg); } else if (msg instanceof APIGetVersionMsg) { @@ -168,6 +219,64 @@ private void doHandleMessage(final Message msg) { } } + private void managementCallMessageHandle(final Message msg) { + thdf.syncSubmit(new SyncTask() { + @Override + public String getSyncSignature() { + return MANAGEMENT_API_WORKER_SYNC_SIGNATURE; + } + + @Override + public int getSyncLevel() { + return managementApiWorkerNum; + } + + @Override + public String getName() { + return MANAGEMENT_API_WORKER_SYNC_SIGNATURE; + } + + @MessageSafe + void handleMessage(Message msg) { + doHandleManagementMessage(msg); + } + + @Override + public Object call() { + handleMessage(msg); + return null; + } + }); + } + + private void doHandleManagementMessage(final Message msg) { + if (msg instanceof APIIsReadyToGoMsg) { + handle((APIIsReadyToGoMsg) msg); + } else if (msg instanceof APIGetVersionMsg) { + handle((APIGetVersionMsg) msg); + }else if (msg instanceof APIGetSupportAPIsMsg) { + handle((APIGetSupportAPIsMsg) msg); + } else if (msg instanceof APIGetCurrentTimeMsg) { + handle((APIGetCurrentTimeMsg) msg); + } else if (msg instanceof APIGetPlatformTimeZoneMsg) { + handle((APIGetPlatformTimeZoneMsg) msg); + } else if (msg instanceof APIGetManagementNodeArchMsg) { + handle((APIGetManagementNodeArchMsg) msg); + } else if (msg instanceof APIGetManagementNodeOSMsg) { + handle((APIGetManagementNodeOSMsg) msg); + } else { + logger.debug("Not an APIMessage.Message ID is " + msg.getId()); + } + } + + private void doHandleMessage(final Message msg) { + if (msg instanceof APIMessage) { + dispatchMessage((APIMessage) msg); + } else { + logger.debug("Not an APIMessage.Message ID is " + msg.getId()); + } + } + private void asyncCallMessageHandle(final Message msg) { thdf.syncSubmit(new SyncTask() { @Override @@ -177,7 +286,7 @@ public String getSyncSignature() { @Override public int getSyncLevel() { - return apiWorkerNum; + return asyncApiWorkerNum; } @Override @@ -316,9 +425,27 @@ public boolean start() { bus.registerService(this); apiExts = pluginRgty.getExtensionList(RestAPIExtensionPoint.class); + logThreadPoolConfiguration(); return true; } + private void logThreadPoolConfiguration() { + if (threadPoolStrategy == ApiWorkerThreadPoolStrategy.SHARED) { + logger.info("API Worker running in SHARED thread pool mode:"); + logger.info("- All API calls share same thread pool"); + logger.info("- Available parameters:"); + logger.info(String.format(" * apiWorkerNum: %d (thread pool size for all API calls)", apiWorkerNum)); + } else { + logger.info("API Worker running in ISOLATED thread pool mode:"); + logger.info("- Using separate thread pools for different API types"); + logger.info("- Available parameters:"); + logger.info(String.format(" * managementApiWorkerNum: %d (thread pool size for management APIs)", managementApiWorkerNum)); + logger.info(String.format(" * apiWorkerNum: %d (thread pool size for sync APIs)", apiWorkerNum)); + logger.info(String.format(" * asyncApiWorkerNum: %d (thread pool size for async APIs)", asyncApiWorkerNum)); + logger.info(String.format(" * threadPoolStrategy: %s (SHARED/ISOLATED)", threadPoolStrategy)); + } + } + @Override public boolean stop() { bus.unregisterService(this); @@ -333,6 +460,18 @@ public void setApiWorkerNum(int apiWorkerNum) { this.apiWorkerNum = apiWorkerNum; } + public void setAsyncApiWorkerNum(int asyncApiWorkerNum) { + this.asyncApiWorkerNum = asyncApiWorkerNum; + } + + public void setManagementApiWorkerNum(int managementApiWorkerNum) { + this.managementApiWorkerNum = managementApiWorkerNum; + } + + public void setThreadPoolStrategy(ApiWorkerThreadPoolStrategy threadPoolStrategy) { + this.threadPoolStrategy = threadPoolStrategy; + } + @Override public List getMessageClassToIntercept() { List lst = new ArrayList<>(); @@ -367,14 +506,22 @@ public ApiMessageProcessor getProcesser() { @Override public List registerThreadPool() { + if (threadPoolStrategy == ApiWorkerThreadPoolStrategy.SHARED) { + return null; + } + ThreadPool pool = new ThreadPool(); pool.setSyncSignature(API_WORKER_SYNC_SIGNATURE); - pool.setThreadNum(5); + pool.setThreadNum(apiWorkerNum); ThreadPool asyncPool = new ThreadPool(); asyncPool.setSyncSignature(ASYNC_API_WORKER_SYNC_SIGNATURE); - asyncPool.setThreadNum(5); + asyncPool.setThreadNum(asyncApiWorkerNum); + + ThreadPool managementPool = new ThreadPool(); + managementPool.setSyncSignature(MANAGEMENT_API_WORKER_SYNC_SIGNATURE); + managementPool.setThreadNum(managementApiWorkerNum); - return Arrays.asList(pool, asyncPool); + return Arrays.asList(pool, asyncPool, managementPool); } } From 4c259cf220b47be94afe233d10a84fcd374e6b91 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Thu, 13 Feb 2025 10:59:53 +0800 Subject: [PATCH 251/737] [conf]: Fix ModelServiceVO's new schema - Add readme TEXT field to ModelServiceVO - Upgrade source of ModelServiceVO if the field is NULL - Modify framework field if Bentoml used - Change framework to other during upgrade DBImpact Resolves: ZSTAC-73148 Change-Id: I7271716870676c6e75686361667962787362716c Signed-off-by: ye.zou --- conf/db/upgrade/V5.3.20__schema.sql | 14 +++++++++++++- .../java/org/zstack/sdk/ModelServiceInventory.java | 8 ++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.3.20__schema.sql b/conf/db/upgrade/V5.3.20__schema.sql index ca1ad57c1d8..b6bbea92982 100644 --- a/conf/db/upgrade/V5.3.20__schema.sql +++ b/conf/db/upgrade/V5.3.20__schema.sql @@ -63,6 +63,7 @@ CALL ModifyApplicationDevelopmentServiceVO(); CALL ADD_COLUMN('ModelVO', 'modelId', 'VARCHAR(255)', 1, NULL); CALL ADD_COLUMN('ModelServiceInstanceGroupVO', 'description', 'VARCHAR(2048)', 1, NULL); CALL ADD_COLUMN('ModelServiceVO', 'source', 'VARCHAR(32)', 1, NULL); +CALL ADD_COLUMN('ModelServiceVO', 'readme', 'TEXT', 1, NULL); # Delete ZStack-default-inference-template DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = '97e66447fa4246649dcc41b72b412407'; @@ -81,7 +82,18 @@ DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = '0b714f4d8c5c43ca86c3a6caa5 ALTER TABLE `zstack`.`BaremetalNicVO` modify column mac varchar(255) DEFAULT NULL; -UPDATE `zstack`.`ModelServiceVO` SET `framework`='BentoML' WHERE `framework`='Bentoml'; +# framework field changed to LLM frameworks not service sources +# 1. Change the origin framework value to source field +# 2. If source is Bentoml change framework to BentoML +# 3. Else change framework to Other + +UPDATE `zstack`.`ModelServiceVO` SET source = framework WHERE source IS NULL; + +UPDATE `zstack`.`ModelServiceVO` SET framework = 'BentoML' WHERE source = 'Bentoml'; + +Update ModelServiceVO set framework = 'Other' where framework not in + ('vLLM', 'Diffusers', 'Transformers', 'sentence_transformers', 'llama.cpp', 'BentoML', 'Other', 'Ollama') + AND source != 'Bentoml'; DROP PROCEDURE IF EXISTS CreateResourceConfigForBindingVms; DELIMITER $$ diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java index 17d36ca0b6e..542632293c1 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java @@ -28,6 +28,14 @@ public java.lang.String getDescription() { return this.description; } + public java.lang.String readme; + public void setReadme(java.lang.String readme) { + this.readme = readme; + } + public java.lang.String getReadme() { + return this.readme; + } + public java.lang.String yaml; public void setYaml(java.lang.String yaml) { this.yaml = yaml; From 83f00365d0821179cb2d96465682cc50295658c3 Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Thu, 13 Feb 2025 10:49:42 +0800 Subject: [PATCH 252/737] [applianceVm]: applianceVm will deploy agent after change image Resolves: ZSTAC-72645 Change-Id: I6868776cb956e3affc4844a799f6f55632c6c5ae --- .../java/org/zstack/appliancevm/ApplianceVmSystemTags.java | 4 ++++ .../service/virtualrouter/vyos/VyosDeployAgentFlow.java | 7 ++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmSystemTags.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmSystemTags.java index d04a9eb52c8..4dafb10c8ba 100644 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmSystemTags.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmSystemTags.java @@ -2,6 +2,7 @@ import org.zstack.header.tag.TagDefinition; import org.zstack.tag.PatternedSystemTag; +import org.zstack.tag.SystemTag; /** * Created by shixin on 2019/06/11 @@ -22,4 +23,7 @@ public class ApplianceVmSystemTags { public static String APPLIANCEVM_STATIC_IP_L3_TOKEN = "l3Uuid"; public static PatternedSystemTag APPLIANCEVM_STATIC_IP = new PatternedSystemTag(String.format( "staticIp::{%s}::{%s}", APPLIANCEVM_STATIC_IP_L3_TOKEN, APPLIANCEVM_STATIC_IP_TOKEN), ApplianceVmVO.class); + + public static SystemTag APPLIANCEVM_DEPLOY_AGENT_ON_START = + new SystemTag("needDeployAgentOnStart", ApplianceVmVO.class); } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosDeployAgentFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosDeployAgentFlow.java index 3aa35766d86..7437e6728ab 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosDeployAgentFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosDeployAgentFlow.java @@ -108,7 +108,9 @@ public void run(FlowTrigger trigger, Map data) { String remoteZvrBootBinPath = storeDataToMap(data, REMOTE_ZVRBOOT_BIN_PATH, String.format("/home/%s/zvrboot.bin", remoteUser)); - if (!isReconnect && !ApplianceVmGlobalConfig.DEPLOY_AGENT_ON_START.value(Boolean.class)) { + if (!isReconnect && + !ApplianceVmGlobalConfig.DEPLOY_AGENT_ON_START.value(Boolean.class) && + !ApplianceVmSystemTags.APPLIANCEVM_DEPLOY_AGENT_ON_START.hasTag(vrUuid)) { // no need to deploy agent trigger.next(); return; @@ -159,6 +161,9 @@ public boolean run() { forceReboot = true; } rebootAgent(REMOTE_PORT, forceReboot); + if (ApplianceVmSystemTags.APPLIANCEVM_DEPLOY_AGENT_ON_START.hasTag(vrUuid)) { + ApplianceVmSystemTags.APPLIANCEVM_DEPLOY_AGENT_ON_START.deleteInherentTag(vrUuid); + } trigger.next(); return true; } else { From 5380d3e7237d9b3e70f03b2ba99a26745aac54d1 Mon Sep 17 00:00:00 2001 From: littleya Date: Thu, 7 Nov 2024 14:57:40 +0800 Subject: [PATCH 253/737] [root]: upgrade spring security to 5.7.13 Resolves: ZSTAC-66709 Change-Id: I6e65727673676f7369756b626f6a6270736e7777 --- plugin/ldap/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin/ldap/pom.xml b/plugin/ldap/pom.xml index b2fa4977464..ce88514ae42 100755 --- a/plugin/ldap/pom.xml +++ b/plugin/ldap/pom.xml @@ -77,7 +77,7 @@ org.springframework.security spring-security-ldap - 5.7.11 + 5.7.13 org.zstack diff --git a/pom.xml b/pom.xml index 89e87c84db3..3f4b49c0442 100755 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ 3.6.1 1.8 5.2.25.RELEASE - 5.7.11 + 5.7.13 5.3.26.Final 1.8.9 1.10 From 9940e7ced35d2ba582594ad994bd751f6494a986 Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Fri, 14 Feb 2025 10:19:19 +0800 Subject: [PATCH 254/737] [kvm]: fix nic driver type complete after vm reboot Resolves: ZSTAC-73090 Change-Id: I6868776c8d3c9b90bf7a4192a835588dcebfb58a --- plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 832c1b6d691..e0f994483b7 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -4080,6 +4080,10 @@ private NicTO completeNicInfo(VmNicInventory nic) { if (to.getUseVirtio() == null) { to.setUseVirtio(VmSystemTags.VIRTIO.hasTag(nic.getVmInstanceUuid())); to.setIps(getCleanTrafficIp(nic)); + if (to.getUseVirtio() && Q.New(VmNicVO.class) + .eq(VmNicVO_.uuid, nic.getUuid()).eq(VmNicVO_.driverType, VmNicDriverType.VIRTIO.toString()).isExists()) { + to.setDriverType(VmNicDriverType.VIRTIO.toString()); + } } String tagValue = VmSystemTags.CLEAN_TRAFFIC.getTokenByResourceUuid(nic.getVmInstanceUuid(), VmSystemTags.CLEAN_TRAFFIC_TOKEN); From 62bb2e0d5b4252a15cd74636889d1ab83b1947ad Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Wed, 4 Dec 2024 13:54:45 +0800 Subject: [PATCH 255/737] [sdnController]: add ovs dpdk APIImpact DBImpact Resolves: ZSTAC-71713 Change-Id: I7a6d65786b757a706863686379706469766a696f --- build/pom.xml | 5 + ...achedL2NetworkAllocatorExtensionPoint.java | 7 + .../AttachedL2NetworkAllocatorFlow.java | 20 +- .../org/zstack/compute/vm/TfVmNicFactory.java | 7 + .../compute/vm/VmInstanceApiInterceptor.java | 20 +- .../VmMigrationCheckL2NetworkOnHostFlow.java | 11 +- .../org/zstack/compute/vm/VmNicFactory.java | 14 +- .../zstack/compute/vm/VmNicManagerImpl.java | 17 +- conf/db/upgrade/V5.3.20__schema.sql | 37 + conf/persistence.xml | 1 + conf/serviceConfig/sdnController.xml | 16 + conf/springConfigXml/sdnController.xml | 6 + .../org/zstack/core/rest/RESTFacadeImpl.java | 3 +- .../zstack/core/upgrade/UpgradeChecker.java | 2 + .../host/HostHugepageExtensionPoint.java | 8 + .../network/l2/APICreateL2NetworkMsg.java | 2 +- .../l2/APICreateL2NoVlanNetworkMsg.java | 7 + .../network/l2/APICreateL2VlanNetworkMsg.java | 6 + .../header/network/l2/L2NetworkConstant.java | 13 + .../l2/L2NetworkCreateExtensionPoint.java | 2 + .../l2/L2NetworkDeleteExtensionPoint.java | 5 + .../header/network/l2/VSwitchManager.java | 4 - .../network/l2/VSwitchOvsConfigStruct.java | 124 +++ .../l2/VSwitchOvsHypervisorFactory.java | 15 + .../header/network/l2/VSwitchOvsManager.java | 7 + .../zstack/header/network/l2/VSwitchType.java | 97 ++- .../org/zstack/header/rest/RESTFacade.java | 2 + .../zstack/header/vm/VmInstanceConstant.java | 1 + .../header/vm/VmInstanceNicFactory.java | 1 - .../java/org/zstack/header/vm/VmNicType.java | 28 +- .../network/l2/L2NetworkApiInterceptor.java | 28 +- .../network/l2/L2NoVlanL2NetworkFactory.java | 74 +- .../zstack/network/l2/L2NoVlanNetwork.java | 99 ++- .../network/l2/L2VlanNetworkFactory.java | 84 +- .../service/NetworkServiceManager.java | 3 + .../service/NetworkServiceManagerImpl.java | 8 +- .../ApplianceVmAllocateNicFlow.java | 17 +- .../appliancevm/ApplianceVmConstant.java | 2 + .../appliancevm/CreateApplianceVmJob.java | 6 + .../HostNetworkInterfaceConstant.java | 5 + .../HostNetworkInterfaceInventory.java | 10 + .../HostNetworkInterfaceVO.java | 11 + .../HostNetworkInterfaceVO_.java | 2 + ...stractKVMConnectExtensionForL2Network.java | 6 +- .../java/org/zstack/kvm/KVMAgentCommands.java | 86 ++ .../main/java/org/zstack/kvm/KVMConstant.java | 6 + .../src/main/java/org/zstack/kvm/KVMHost.java | 7 +- .../kvm/KVMRealizeL2NoVlanNetworkBackend.java | 3 + .../kvm/KVMRealizeL2VlanNetworkBackend.java | 3 + plugin/sdnController/pom.xml | 5 + .../zstack/sdnController/SdnController.java | 24 +- .../SdnControllerApiInterceptor.java | 80 ++ .../SdnControllerCascadeExtension.java | 58 +- .../sdnController/SdnControllerFactory.java | 7 + .../SdnControllerManagerImpl.java | 802 +++++++++++++++++- .../sdnController/SdnControllerReply.java | 7 + .../SdnControllerSystemTags.java | 11 + .../h3cVcfc/H3cVcfcSdnController.java | 34 +- .../hardwareVxlan/HardwareVxlanNetwork.java | 4 +- .../header/APIAddSdnControllerMsg.java | 5 +- .../APIAddSdnControllerMsgDoc_zh_cn.groovy | 13 +- .../APIReconnectSdnControllerEvent.java | 44 + ...econnectSdnControllerEventDoc_zh_cn.groovy | 32 + .../header/APIReconnectSdnControllerMsg.java | 38 + ...IReconnectSdnControllerMsgDoc_zh_cn.groovy | 58 ++ .../header/APISdnControllerAddHostEvent.java | 44 + ...ISdnControllerAddHostEventDoc_zh_cn.groovy | 32 + .../header/APISdnControllerAddHostMsg.java | 151 ++++ ...APISdnControllerAddHostMsgDoc_zh_cn.groovy | 122 +++ .../APISdnControllerChangeHostEvent.java | 44 + ...nControllerChangeHostEventDoc_zh_cn.groovy | 32 + .../header/APISdnControllerChangeHostMsg.java | 146 ++++ ...SdnControllerChangeHostMsgDoc_zh_cn.groovy | 122 +++ .../APISdnControllerRemoveHostEvent.java | 44 + ...nControllerRemoveHostEventDoc_zh_cn.groovy | 32 + ...trollerRemoveHostHostEventDoc_zh_cn.groovy | 32 + ...ontrollerRemoveHostHostMsgDoc_zh_cn.groovy | 75 ++ .../header/APISdnControllerRemoveHostMsg.java | 67 ++ ...SdnControllerRemoveHostMsgDoc_zh_cn.groovy | 77 ++ .../APISyncSdnControllerEventDoc_zh_cn.groovy | 32 + .../APISyncSdnControllerMsgDoc_zh_cn.groovy | 56 ++ ...2VxlanNetworkPoolInventoryDoc_zh_cn.groovy | 76 +- .../header/SdnControllerFlowDataParam.java | 5 + .../header/SdnControllerHostRefInventory.java | 126 +++ ...ControllerHostRefInventoryDoc_zh_cn.groovy | 63 ++ .../header/SdnControllerHostRefVO.java | 164 ++++ .../header/SdnControllerHostRefVO_.java | 18 + .../header/SdnControllerInventory.java | 24 +- .../SdnControllerInventoryDoc_zh_cn.groovy | 46 +- .../header/SdnControllerRemoveHostMsg.java | 42 + .../header/SdnControllerRemoveHostReply.java | 6 + .../header/SdnControllerStatus.java | 7 + .../SdnControllerStatusDoc_zh_cn.groovy | 27 + .../sdnController/header/SdnControllerVO.java | 27 + .../header/SdnControllerVO_.java | 1 + .../header/SdnVniRangeDoc_zh_cn.groovy | 7 +- .../controller/SugonSdnController.java | 20 +- .../vtep/RemoteVtepInventoryDoc_zh_cn.groovy | 30 +- .../vxlan/vtep/VtepInventoryDoc_zh_cn.groovy | 33 +- .../L2VxlanNetworkInventoryDoc_zh_cn.groovy | 60 +- .../l2/vxlan/vxlanNetwork/VxlanNetwork.java | 3 +- .../VniRangeInventoryDoc_zh_cn.groovy | 24 +- .../scripts/RestDocumentationGenerator.groovy | 9 +- sdk/src/main/java/SourceClassMap.java | 8 + .../zstack/sdk/AddSdnControllerAction.java | 4 +- .../CreateL2HardwareVxlanNetworkAction.java | 2 +- ...reateL2HardwareVxlanNetworkPoolAction.java | 2 +- .../sdk/CreateL2NoVlanNetworkAction.java | 4 +- .../zstack/sdk/CreateL2PortGroupAction.java | 2 +- .../zstack/sdk/CreateL2TfNetworkAction.java | 2 +- .../sdk/CreateL2VirtualSwitchAction.java | 2 +- .../zstack/sdk/CreateL2VlanNetworkAction.java | 4 +- .../sdk/CreateL2VxlanNetworkAction.java | 2 +- .../sdk/CreateL2VxlanNetworkPoolAction.java | 2 +- .../CreateOvnControllerOfferingAction.java | 137 +++ .../sdk/CreateOvnControllerVmAction.java | 191 +++++ .../sdk/CreateOvnControllerVmResult.java | 14 + ...VfPciDeviceAvailableInL2NetworkAction.java | 95 +++ ...VfPciDeviceAvailableInL2NetworkResult.java | 14 + .../sdk/HostNetworkInterfaceInventory.java | 8 + .../sdk/OvnControllerVmInstanceInventory.java | 8 + .../sdk/OvnControllerVmOfferingInventory.java | 31 + .../sdk/ReconnectSdnControllerAction.java | 101 +++ .../sdk/ReconnectSdnControllerResult.java | 14 + .../sdk/SdnControllerAddHostAction.java | 122 +++ .../sdk/SdnControllerAddHostResult.java | 14 + .../sdk/SdnControllerChangeHostAction.java | 122 +++ .../sdk/SdnControllerChangeHostResult.java | 14 + .../sdk/SdnControllerHostRefInventory.java | 79 ++ .../zstack/sdk/SdnControllerInventory.java | 18 +- .../sdk/SdnControllerRemoveHostAction.java | 107 +++ .../sdk/SdnControllerRemoveHostResult.java | 14 + .../org/zstack/sdk/SdnControllerStatus.java | 7 + .../sdnController/SdnControllerCase.groovy | 16 +- .../sdnController/SdnControllerEnv.groovy | 2 +- .../SugonSdnControllerEnv.groovy | 2 +- .../java/org/zstack/testlib/ApiHelper.groovy | 205 ++++- .../org/zstack/testlib/KVMSimulator.groovy | 24 + 138 files changed, 5148 insertions(+), 341 deletions(-) create mode 100644 compute/src/main/java/org/zstack/compute/allocator/AttachedL2NetworkAllocatorExtensionPoint.java mode change 100755 => 100644 compute/src/main/java/org/zstack/compute/allocator/AttachedL2NetworkAllocatorFlow.java create mode 100644 header/src/main/java/org/zstack/header/host/HostHugepageExtensionPoint.java delete mode 100644 header/src/main/java/org/zstack/header/network/l2/VSwitchManager.java create mode 100644 header/src/main/java/org/zstack/header/network/l2/VSwitchOvsConfigStruct.java create mode 100644 header/src/main/java/org/zstack/header/network/l2/VSwitchOvsHypervisorFactory.java create mode 100644 header/src/main/java/org/zstack/header/network/l2/VSwitchOvsManager.java create mode 100644 plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceConstant.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerReply.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerSystemTags.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEvent.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEventDoc_zh_cn.groovy create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsg.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsgDoc_zh_cn.groovy create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEvent.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEventDoc_zh_cn.groovy create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsg.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsgDoc_zh_cn.groovy create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEvent.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEventDoc_zh_cn.groovy create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsg.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsgDoc_zh_cn.groovy create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEvent.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEventDoc_zh_cn.groovy create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostHostEventDoc_zh_cn.groovy create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostHostMsgDoc_zh_cn.groovy create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsgDoc_zh_cn.groovy create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISyncSdnControllerEventDoc_zh_cn.groovy create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISyncSdnControllerMsgDoc_zh_cn.groovy create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerFlowDataParam.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefInventory.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefInventoryDoc_zh_cn.groovy create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefVO.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefVO_.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerRemoveHostMsg.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerRemoveHostReply.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerStatus.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerStatusDoc_zh_cn.groovy create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateOvnControllerOfferingAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/GetVfPciDeviceAvailableInL2NetworkAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/GetVfPciDeviceAvailableInL2NetworkResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/OvnControllerVmInstanceInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/OvnControllerVmOfferingInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ReconnectSdnControllerAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ReconnectSdnControllerResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SdnControllerAddHostAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SdnControllerAddHostResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SdnControllerChangeHostAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SdnControllerChangeHostResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SdnControllerHostRefInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SdnControllerRemoveHostAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SdnControllerRemoveHostResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SdnControllerStatus.java diff --git a/build/pom.xml b/build/pom.xml index c0e9d59617f..b782143e80a 100755 --- a/build/pom.xml +++ b/build/pom.xml @@ -621,6 +621,11 @@ hostNetworkInterface ${project.version} + + org.zstack + ovn + ${project.version} + diff --git a/compute/src/main/java/org/zstack/compute/allocator/AttachedL2NetworkAllocatorExtensionPoint.java b/compute/src/main/java/org/zstack/compute/allocator/AttachedL2NetworkAllocatorExtensionPoint.java new file mode 100644 index 00000000000..28e89c931c7 --- /dev/null +++ b/compute/src/main/java/org/zstack/compute/allocator/AttachedL2NetworkAllocatorExtensionPoint.java @@ -0,0 +1,7 @@ +package org.zstack.compute.allocator; + +import java.util.List; + +public interface AttachedL2NetworkAllocatorExtensionPoint { + List filter(List hostUuids, List l2Uuids); +} diff --git a/compute/src/main/java/org/zstack/compute/allocator/AttachedL2NetworkAllocatorFlow.java b/compute/src/main/java/org/zstack/compute/allocator/AttachedL2NetworkAllocatorFlow.java old mode 100755 new mode 100644 index 0d70b40e0fe..cd986023bd1 --- a/compute/src/main/java/org/zstack/compute/allocator/AttachedL2NetworkAllocatorFlow.java +++ b/compute/src/main/java/org/zstack/compute/allocator/AttachedL2NetworkAllocatorFlow.java @@ -4,19 +4,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; import org.springframework.transaction.annotation.Transactional; -import org.zstack.core.CoreGlobalProperty; import org.zstack.core.Platform; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.header.allocator.AbstractHostAllocatorFlow; -import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.host.HostVO; import org.zstack.header.host.HostVO_; -import org.zstack.header.network.l2.L2NetworkAttachStatus; -import org.zstack.header.network.l2.L2NetworkClusterRefVO; -import org.zstack.header.network.l2.L2NetworkHostRefVO; -import org.zstack.header.network.l2.L2NetworkHostRefVO_; +import org.zstack.header.network.l2.*; import org.zstack.header.network.l3.L3NetworkInventory; import javax.persistence.Tuple; @@ -25,12 +20,7 @@ import java.util.stream.Collectors; import org.zstack.utils.logging.CLogger; -import org.zstack.header.host.HostVO; -import org.zstack.header.host.HostVO_; -import org.zstack.core.db.Q; import org.zstack.utils.Utils; -import org.zstack.core.db.SimpleQuery; -import org.zstack.header.host.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) @@ -100,6 +90,14 @@ private List allocate(Collection l3NetworkUuids, Collection(); } + for (AttachedL2NetworkAllocatorExtensionPoint extp : pluginRgty.getExtensionList(AttachedL2NetworkAllocatorExtensionPoint.class)) { + retHostUuids = extp.filter(retHostUuids, l2uuids); + } + + if (retHostUuids.isEmpty()){ + return new ArrayList<>(); + } + sql = "select h from HostVO h where h.uuid in (:huuids)"; TypedQuery hq = dbf.getEntityManager().createQuery(sql, HostVO.class); hq.setParameter("huuids", retHostUuids); diff --git a/compute/src/main/java/org/zstack/compute/vm/TfVmNicFactory.java b/compute/src/main/java/org/zstack/compute/vm/TfVmNicFactory.java index b316305a6b6..89631335ea4 100644 --- a/compute/src/main/java/org/zstack/compute/vm/TfVmNicFactory.java +++ b/compute/src/main/java/org/zstack/compute/vm/TfVmNicFactory.java @@ -4,6 +4,8 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.db.DatabaseFacade; import org.zstack.header.core.workflow.FlowException; +import org.zstack.header.network.l2.L2NetworkConstant; +import org.zstack.header.network.l2.VSwitchType; import org.zstack.header.vm.*; import org.zstack.identity.Account; import org.zstack.utils.Utils; @@ -15,7 +17,9 @@ public class TfVmNicFactory extends VmNicFactory { private static final CLogger logger = Utils.getLogger(TfVmNicFactory.class); + private static final VSwitchType vSwitchType = new VSwitchType(VmInstanceConstant.L2_TF_VSWITCH_TYPE); private static final VmNicType type = new VmNicType(VmInstanceConstant.TF_VIRTUAL_NIC_TYPE); + @Autowired private CloudBus bus; @Autowired @@ -23,6 +27,9 @@ public class TfVmNicFactory extends VmNicFactory { @Override public VmNicType getType() { + type.setHasAddon(true); + vSwitchType.addVmNicType(VmNicType.VmNicSubType.NONE, type); + return type; } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceApiInterceptor.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceApiInterceptor.java index 2ef9bc7aba3..d1aa104a594 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceApiInterceptor.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceApiInterceptor.java @@ -26,8 +26,7 @@ import org.zstack.header.image.ImageConstant.ImageMediaType; import org.zstack.header.image.*; import org.zstack.header.message.APIMessage; -import org.zstack.header.network.l2.L2NetworkClusterRefVO; -import org.zstack.header.network.l2.L2NetworkClusterRefVO_; +import org.zstack.header.network.l2.*; import org.zstack.header.network.l3.*; import org.zstack.header.storage.primary.PrimaryStorageClusterRefVO; import org.zstack.header.storage.primary.PrimaryStorageClusterRefVO_; @@ -879,11 +878,18 @@ private void validate(APIAttachL3NetworkToVmMsg msg) { newAddedL3Uuids, l2Uuids)); } - List clusterUuids = Q.New(L2NetworkClusterRefVO.class).eq(L2NetworkClusterRefVO_.l2NetworkUuid, l2Uuids.get(0)) - .select(L2NetworkClusterRefVO_.clusterUuid).listValues(); - if (clusterUuids.isEmpty()) { - throw new ApiMessageInterceptionException(operr("unable to attach a L3 network. The L3 network[uuid:%s] are belonged to l2 networks [uuids:%s] that have not been attached to any cluster", - newAddedL3Uuids, l2Uuids)); + List l2NetworkVOS = Q.New(L2NetworkVO.class).in(L2NetworkVO_.uuid, l2Uuids).list(); + List ovnL2Networks = l2NetworkVOS.stream().filter(vo -> + vo.getvSwitchType().equals(L2NetworkConstant.VSWITCH_TYPE_OVN_DPDK)).collect(Collectors.toList()); + l2NetworkVOS = l2NetworkVOS.stream().filter(vo -> + !vo.getvSwitchType().equals(L2NetworkConstant.VSWITCH_TYPE_OVN_DPDK)).collect(Collectors.toList()); + if (!l2NetworkVOS.isEmpty()) { + List clusterUuids = Q.New(L2NetworkClusterRefVO.class).eq(L2NetworkClusterRefVO_.l2NetworkUuid, l2Uuids.get(0)) + .select(L2NetworkClusterRefVO_.clusterUuid).listValues(); + if (clusterUuids.isEmpty()) { + throw new ApiMessageInterceptionException(operr("unable to attach a L3 network. The L3 network[uuid:%s] are belonged to l2 networks [uuids:%s] that have not been attached to any cluster", + newAddedL3Uuids, l2Uuids)); + } } String sql = "select nic.l3NetworkUuid from VmNicVO nic where nic.vmInstanceUuid = :vmUuid and nic.l3NetworkUuid in (:l3Uuids)"; diff --git a/compute/src/main/java/org/zstack/compute/vm/VmMigrationCheckL2NetworkOnHostFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmMigrationCheckL2NetworkOnHostFlow.java index a0ad92e81d6..98a343691a6 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmMigrationCheckL2NetworkOnHostFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmMigrationCheckL2NetworkOnHostFlow.java @@ -5,19 +5,21 @@ import org.springframework.beans.factory.annotation.Configurable; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusListCallBack; +import org.zstack.core.db.DatabaseFacade; import org.zstack.header.core.workflow.Flow; import org.zstack.header.core.workflow.FlowRollback; import org.zstack.header.core.workflow.FlowTrigger; import org.zstack.header.message.MessageReply; import org.zstack.header.network.l2.CheckL2NetworkOnHostMsg; import org.zstack.header.network.l2.L2NetworkConstant; +import org.zstack.header.network.l2.L2NetworkVO; +import org.zstack.header.network.l2.VSwitchType; import org.zstack.header.network.l3.L3NetworkInventory; import org.zstack.header.vm.*; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; /** */ @@ -25,6 +27,8 @@ public class VmMigrationCheckL2NetworkOnHostFlow implements Flow { @Autowired private CloudBus bus; + @Autowired + private DatabaseFacade dbf; @Override public void run(final FlowTrigger trigger, Map data) { @@ -34,6 +38,11 @@ public void run(final FlowTrigger trigger, Map data) { List cmsgs = new ArrayList(); for (L3NetworkInventory l3 : VmNicSpec.getL3NetworkInventoryOfSpec(spec.getL3Networks())) { CheckL2NetworkOnHostMsg msg = new CheckL2NetworkOnHostMsg(); + L2NetworkVO l2NetworkVO = dbf.findByUuid(l3.getL2NetworkUuid(), L2NetworkVO.class); + VSwitchType switchType = VSwitchType.valueOf(l2NetworkVO.getvSwitchType()); + if (!switchType.isAttachToCluster()) { + continue; + } msg.setL2NetworkUuid(l3.getL2NetworkUuid()); msg.setHostUuid(spec.getDestHost().getUuid()); bus.makeTargetServiceIdByResourceUuid(msg, L2NetworkConstant.SERVICE_ID, l3.getL2NetworkUuid()); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmNicFactory.java b/compute/src/main/java/org/zstack/compute/vm/VmNicFactory.java index cdf14d1e068..73193da3c37 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmNicFactory.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmNicFactory.java @@ -5,8 +5,6 @@ import org.zstack.header.core.workflow.FlowException; import org.zstack.header.network.l2.L2NetworkConstant; import org.zstack.header.network.l2.VSwitchType; -import org.zstack.header.network.l3.UsedIpInventory; -import org.zstack.header.network.l3.UsedIpVO; import org.zstack.header.vm.*; import org.zstack.identity.Account; import org.zstack.utils.ExceptionDSL; @@ -16,27 +14,23 @@ import javax.persistence.PersistenceException; import java.sql.SQLIntegrityConstraintViolationException; -import java.util.ArrayList; -import java.util.List; import static org.zstack.core.Platform.err; public class VmNicFactory implements VmInstanceNicFactory { private static final CLogger logger = Utils.getLogger(VmNicFactory.class); + private static final VSwitchType vSwitchType = new VSwitchType(L2NetworkConstant.VSWITCH_TYPE_LINUX_BRIDGE); private static final VmNicType type = new VmNicType(VmInstanceConstant.VIRTUAL_NIC_TYPE); - private static final VSwitchType vSwitchType = new VSwitchType(L2NetworkConstant.VSWITCH_TYPE_LINUX_BRIDGE, type); @Autowired private DatabaseFacade dbf; @Override public VmNicType getType() { - return type; - } + type.setHasAddon(true); + vSwitchType.addVmNicType(VmNicType.VmNicSubType.NONE, type); - @Override - public VSwitchType getVSwitchType() { - return vSwitchType; + return type; } @Override diff --git a/compute/src/main/java/org/zstack/compute/vm/VmNicManagerImpl.java b/compute/src/main/java/org/zstack/compute/vm/VmNicManagerImpl.java index 14a21f15d50..47f05b466b5 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmNicManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmNicManagerImpl.java @@ -286,17 +286,16 @@ public VmNicType getVmNicType(String vmUuid, L3NetworkInventory l3nw) { logger.debug(String.format("create %s on l3 network[uuid:%s] inside VmAllocateNicFlow", enableSriov ? "vf nic" : "vnic", l3nw.getUuid())); boolean enableVhostUser = NetworkServiceGlobalConfig.ENABLE_VHOSTUSER.value(Boolean.class); - - L2NetworkVO l2nw = dbf.findByUuid(l3nw.getL2NetworkUuid(), L2NetworkVO.class); - VmNicType type; - if (l2nw.getType().equals(L2NetworkConstant.L2_TF_NETWORK_TYPE)) { - type = VmNicType.valueOf(VmInstanceConstant.TF_VIRTUAL_NIC_TYPE); - } else { - VSwitchType vSwitchType = VSwitchType.valueOf(l2nw.getvSwitchType()); - type = vSwitchType.getVmNicTypeWithCondition(enableSriov, enableVhostUser); + VmNicType.VmNicSubType subType = VmNicType.VmNicSubType.NONE; + if (enableSriov) { + subType = VmNicType.VmNicSubType.SRIOV; + } else if (enableVhostUser) { + subType = VmNicType.VmNicSubType.VHOSTUSER; } + L2NetworkVO l2nw = dbf.findByUuid(l3nw.getL2NetworkUuid(), L2NetworkVO.class); + VSwitchType vSwitchType = VSwitchType.valueOf(l2nw.getvSwitchType()); - return type; + return vSwitchType.getVmNicType(subType); } @Override diff --git a/conf/db/upgrade/V5.3.20__schema.sql b/conf/db/upgrade/V5.3.20__schema.sql index b6bbea92982..6b4dc610c35 100644 --- a/conf/db/upgrade/V5.3.20__schema.sql +++ b/conf/db/upgrade/V5.3.20__schema.sql @@ -137,3 +137,40 @@ END $$ DELIMITER ; call CreateResourceConfigForBindingVms(); DROP PROCEDURE IF EXISTS CreateResourceConfigForBindingVms; + + +CALL ADD_COLUMN('SdnControllerVO', 'status', 'VARCHAR(32)', 0, 'Connected'); +CALL ADD_COLUMN('HostNetworkInterfaceVO', 'driverType', 'VARCHAR(32)', 1, NULL); + +CREATE TABLE IF NOT EXISTS `zstack`.`SdnControllerHostRefVO` ( + `id` BIGINT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT, + `sdnControllerUuid` varchar(32) NOT NULL, + `hostUuid` varchar(32) NOT NULL, + `vSwitchType` varchar(255) NOT NULL, + `vtepIp` varchar(128) DEFAULT NULL, + `netmask` varchar(128) DEFAULT NULL, + `nicPciAddresses` varchar(1024) DEFAULT NULL, + `nicDrivers` varchar(1024) DEFAULT NULL, + `bondMode` varchar(64) DEFAULT NULL, + `lacpMode` varchar(64) DEFAULT NULL, + CONSTRAINT fkSdnControllerHostRefVOSdnControllerVO FOREIGN KEY (sdnControllerUuid) REFERENCES SdnControllerVO (uuid) ON DELETE CASCADE, + CONSTRAINT fkSdnControllerHostRefVOHostEO FOREIGN KEY (hostUuid) REFERENCES HostEO (uuid) ON DELETE CASCADE, + CONSTRAINT ukSdnControllerHostRefVO UNIQUE (`sdnControllerUuid`,`hostUuid`, `vSwitchType`), + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`OvnControllerVmOfferingVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `managementNetworkUuid` varchar(32) NOT NULL, + `imageUuid` varchar(32) NOT NULL, + `zoneUuid` varchar(32) NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT fkOvnControllerVmOfferingVOL3NetworkEO FOREIGN KEY (managementNetworkUuid) REFERENCES `zstack`.`L3NetworkEO` (uuid) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`OvnControllerVmInstanceVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +UPDATE `zstack`.`L2NetworkVO` set vSwitchType='TfL2Network' where type='TfL2Network'; diff --git a/conf/persistence.xml b/conf/persistence.xml index 3fac3285b8c..cce1d301577 100755 --- a/conf/persistence.xml +++ b/conf/persistence.xml @@ -195,6 +195,7 @@ org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolVO org.zstack.sdnController.header.VxlanHostMappingVO org.zstack.sdnController.header.VxlanClusterMappingVO + org.zstack.sdnController.header.SdnControllerHostRefVO org.zstack.header.volume.VolumeHostRefVO org.zstack.directory.DirectoryVO org.zstack.directory.ResourceDirectoryRefVO diff --git a/conf/serviceConfig/sdnController.xml b/conf/serviceConfig/sdnController.xml index 3aa5bc13998..7710a022210 100644 --- a/conf/serviceConfig/sdnController.xml +++ b/conf/serviceConfig/sdnController.xml @@ -15,6 +15,22 @@ org.zstack.sdnController.header.APIUpdateSdnControllerMsg + + org.zstack.sdnController.header.APISdnControllerAddHostMsg + + + + org.zstack.sdnController.header.APISdnControllerChangeHostMsg + + + + org.zstack.sdnController.header.APISdnControllerRemoveHostMsg + + + + org.zstack.sdnController.header.APIReconnectSdnControllerMsg + + org.zstack.sdnController.header.APIQuerySdnControllerMsg query diff --git a/conf/springConfigXml/sdnController.xml b/conf/springConfigXml/sdnController.xml index 260fd1dbe67..7d354f415bd 100644 --- a/conf/springConfigXml/sdnController.xml +++ b/conf/springConfigXml/sdnController.xml @@ -24,6 +24,12 @@ + + + + + + diff --git a/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java b/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java index e715e2ee41f..a6598eb7569 100755 --- a/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java @@ -300,7 +300,8 @@ public void asyncJsonGet(final String url, final String body, Map headers, HttpMethod method, final AsyncRESTCallback callback, final TimeUnit unit, final long timeout) { + @Override + public void asyncJson(final String url, final String body, Map headers, HttpMethod method, final AsyncRESTCallback callback, final TimeUnit unit, final long timeout) { synchronized (interceptors) { for (BeforeAsyncJsonPostInterceptor ic : interceptors) { ic.beforeAsyncJsonPost(url, body, unit, timeout); diff --git a/core/src/main/java/org/zstack/core/upgrade/UpgradeChecker.java b/core/src/main/java/org/zstack/core/upgrade/UpgradeChecker.java index d7daaadaafe..7bed38dcb4f 100644 --- a/core/src/main/java/org/zstack/core/upgrade/UpgradeChecker.java +++ b/core/src/main/java/org/zstack/core/upgrade/UpgradeChecker.java @@ -229,8 +229,10 @@ public ErrorCode checkAgentHttpParamChanges(String agentUuid, String commandName commandObj = cmd; } + logger.debug("grayscale compare agentVersionVO " + JSONObjectUtil.toJsonString(agentVersionVO)); for (Map fields : relatedFieldsVersionMap) { // check if current command has unexpected versions + logger.debug("grayscale compare fields " + JSONObjectUtil.toJsonString(fields)); VersionComparator currentVersion = new VersionComparator(agentVersionVO.getCurrentVersion()); Set> entries = fields.entrySet() .stream() diff --git a/header/src/main/java/org/zstack/header/host/HostHugepageExtensionPoint.java b/header/src/main/java/org/zstack/header/host/HostHugepageExtensionPoint.java new file mode 100644 index 00000000000..c39ab6bffae --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/HostHugepageExtensionPoint.java @@ -0,0 +1,8 @@ +package org.zstack.header.host; + +/** + * Created by boce.wang on 01/24/2025. + */ +public interface HostHugepageExtensionPoint { + boolean checkHugepageSupport(HostInventory host); +} diff --git a/header/src/main/java/org/zstack/header/network/l2/APICreateL2NetworkMsg.java b/header/src/main/java/org/zstack/header/network/l2/APICreateL2NetworkMsg.java index a22b4e7f0fd..b91f322a823 100755 --- a/header/src/main/java/org/zstack/header/network/l2/APICreateL2NetworkMsg.java +++ b/header/src/main/java/org/zstack/header/network/l2/APICreateL2NetworkMsg.java @@ -71,7 +71,7 @@ public abstract class APICreateL2NetworkMsg extends APICreateMessage implements /** * @desc vSwitch type */ - @APIParam(required = false, maxLength = 1024, validValues = {"LinuxBridge", "OvsDpdk", "MacVlan"}) + @APIParam(required = false, maxLength = 1024, validValues = {"LinuxBridge", "OvsDpdk", "MacVlan", "OvnDpdk"}) private String vSwitchType = "LinuxBridge"; @APIParam(required = false) diff --git a/header/src/main/java/org/zstack/header/network/l2/APICreateL2NoVlanNetworkMsg.java b/header/src/main/java/org/zstack/header/network/l2/APICreateL2NoVlanNetworkMsg.java index 1da72c4ef51..6f42e0c3a3d 100755 --- a/header/src/main/java/org/zstack/header/network/l2/APICreateL2NoVlanNetworkMsg.java +++ b/header/src/main/java/org/zstack/header/network/l2/APICreateL2NoVlanNetworkMsg.java @@ -1,12 +1,19 @@ package org.zstack.header.network.l2; import org.springframework.http.HttpMethod; +import org.zstack.header.message.APIParam; +import org.zstack.header.message.OverriddenApiParam; +import org.zstack.header.message.OverriddenApiParams; import org.zstack.header.rest.RestRequest; import org.zstack.header.tag.TagResourceType; +import org.zstack.header.zone.ZoneVO; /** */ @TagResourceType(L2NetworkVO.class) +@OverriddenApiParams({ + @OverriddenApiParam(field = "physicalInterface", param = @APIParam(maxLength = 1024, required = false)) +}) @RestRequest( path = "/l2-networks/no-vlan", method = HttpMethod.POST, diff --git a/header/src/main/java/org/zstack/header/network/l2/APICreateL2VlanNetworkMsg.java b/header/src/main/java/org/zstack/header/network/l2/APICreateL2VlanNetworkMsg.java index 7439ac800df..58ce39044f5 100755 --- a/header/src/main/java/org/zstack/header/network/l2/APICreateL2VlanNetworkMsg.java +++ b/header/src/main/java/org/zstack/header/network/l2/APICreateL2VlanNetworkMsg.java @@ -2,8 +2,11 @@ import org.springframework.http.HttpMethod; import org.zstack.header.message.APIParam; +import org.zstack.header.message.OverriddenApiParam; +import org.zstack.header.message.OverriddenApiParams; import org.zstack.header.rest.RestRequest; import org.zstack.header.tag.TagResourceType; +import org.zstack.header.zone.ZoneVO; /** * @api create a l2VlanNetwork @@ -42,6 +45,9 @@ * @since 0.1.0 */ @TagResourceType(L2NetworkVO.class) +@OverriddenApiParams({ + @OverriddenApiParam(field = "physicalInterface", param = @APIParam(maxLength = 1024, required = false)) +}) @RestRequest( path = "/l2-networks/vlan", method = HttpMethod.POST, diff --git a/header/src/main/java/org/zstack/header/network/l2/L2NetworkConstant.java b/header/src/main/java/org/zstack/header/network/l2/L2NetworkConstant.java index ccdbc4e918f..23cfdf462cb 100755 --- a/header/src/main/java/org/zstack/header/network/l2/L2NetworkConstant.java +++ b/header/src/main/java/org/zstack/header/network/l2/L2NetworkConstant.java @@ -35,6 +35,10 @@ public interface L2NetworkConstant { @PythonClass public static final String VSWITCH_TYPE_OVS_KERNEL = "OvsKernel"; + @PythonClass + public static final String VSWITCH_TYPE_OVN_DPDK = "OvnDpdk"; + public static final String OVN_DPDK_VNIC_SRC_PATH = "/var/run/openvswitch/"; + public static final String DETACH_L2NETWORK_CODE = "l2Network.detach"; // https://elixir.bootlin.com/linux/v5.6/source/include/uapi/linux/if.h#L33 @@ -43,4 +47,13 @@ public interface L2NetworkConstant { public static final int VIRTUAL_NETWORK_ID_DEFAULT_VALUE = 0; public static final String KVM_HYPERVISOR_TYPE = "KVM"; + + public static final String BONDING_MODE_LACP = "802.3ad"; + public static final String BONDING_MODE_AB = "active-backup"; + public static final String BONDING_MODE_SLB = "balance-slb"; + public static final String BONDING_MODE_TCP = "balance-tcp"; + + public static final String LACP_MODE_OFF = "off"; + public static final String LACP_MODE_ACTIVE = "active"; + public static final String LACP_MODE_PASSIVE = "passive"; } diff --git a/header/src/main/java/org/zstack/header/network/l2/L2NetworkCreateExtensionPoint.java b/header/src/main/java/org/zstack/header/network/l2/L2NetworkCreateExtensionPoint.java index 84fd74ceedc..d50559128d9 100755 --- a/header/src/main/java/org/zstack/header/network/l2/L2NetworkCreateExtensionPoint.java +++ b/header/src/main/java/org/zstack/header/network/l2/L2NetworkCreateExtensionPoint.java @@ -1,9 +1,11 @@ package org.zstack.header.network.l2; +import org.zstack.header.core.Completion; import org.zstack.header.network.NetworkException; public interface L2NetworkCreateExtensionPoint { void beforeCreateL2Network(APICreateL2NetworkMsg msg) throws NetworkException; + default void postCreateL2Network(L2NetworkInventory l2Network, APICreateL2NetworkMsg msg, Completion completion) {completion.success();} void afterCreateL2Network(L2NetworkInventory l2Network); } diff --git a/header/src/main/java/org/zstack/header/network/l2/L2NetworkDeleteExtensionPoint.java b/header/src/main/java/org/zstack/header/network/l2/L2NetworkDeleteExtensionPoint.java index a780c4e9910..3e46f74b1e7 100755 --- a/header/src/main/java/org/zstack/header/network/l2/L2NetworkDeleteExtensionPoint.java +++ b/header/src/main/java/org/zstack/header/network/l2/L2NetworkDeleteExtensionPoint.java @@ -1,9 +1,14 @@ package org.zstack.header.network.l2; +import org.zstack.header.core.Completion; +import org.zstack.header.core.NoErrorCompletion; + public interface L2NetworkDeleteExtensionPoint { void preDeleteL2Network(L2NetworkInventory inventory) throws L2NetworkException; void beforeDeleteL2Network(L2NetworkInventory inventory); + default void deleteL2Network(L2NetworkInventory inv, NoErrorCompletion completion) {completion.done();} + void afterDeleteL2Network(L2NetworkInventory inventory); } diff --git a/header/src/main/java/org/zstack/header/network/l2/VSwitchManager.java b/header/src/main/java/org/zstack/header/network/l2/VSwitchManager.java deleted file mode 100644 index 593edc3f436..00000000000 --- a/header/src/main/java/org/zstack/header/network/l2/VSwitchManager.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.zstack.header.network.l2; - -public interface VSwitchManager { -} diff --git a/header/src/main/java/org/zstack/header/network/l2/VSwitchOvsConfigStruct.java b/header/src/main/java/org/zstack/header/network/l2/VSwitchOvsConfigStruct.java new file mode 100644 index 00000000000..4697c069ac9 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/l2/VSwitchOvsConfigStruct.java @@ -0,0 +1,124 @@ +package org.zstack.header.network.l2; + +import java.util.Map; + +public class VSwitchOvsConfigStruct { + private boolean hostStatusCheck = true; + + private String ovnControllerIp; + private String vSwitchType; + private String brExName; + private Map nicNamePciMap; + private Map nicNameDriverMap; + private String ovnEncapIP; + private String ovnEncapNetmask; + private String ovnRemoteConnection; + private String ovnEncapType; + private int hugePageNumber; + private String bondMode; + private String lacpMode; + + public String getvSwitchType() { + return vSwitchType; + } + + public void setvSwitchType(String vSwitchType) { + this.vSwitchType = vSwitchType; + } + + public String getOvnControllerIp() { + return ovnControllerIp; + } + + public void setOvnControllerIp(String ovnControllerIp) { + this.ovnControllerIp = ovnControllerIp; + } + + public String getBrExName() { + return brExName; + } + + public void setBrExName(String brExName) { + this.brExName = brExName; + } + + public Map getNicNamePciMap() { + return nicNamePciMap; + } + + public void setNicNamePciMap(Map nicNamePciMap) { + this.nicNamePciMap = nicNamePciMap; + } + + public String getOvnEncapIP() { + return ovnEncapIP; + } + + public void setOvnEncapIP(String ovnEncapIP) { + this.ovnEncapIP = ovnEncapIP; + } + + public String getOvnRemoteConnection() { + return ovnRemoteConnection; + } + + public void setOvnRemoteConnection(String ovnRemoteConnection) { + this.ovnRemoteConnection = ovnRemoteConnection; + } + + public String getOvnEncapType() { + return ovnEncapType; + } + + public void setOvnEncapType(String ovnEncapType) { + this.ovnEncapType = ovnEncapType; + } + + public int getHugePageNumber() { + return hugePageNumber; + } + + public void setHugePageNumber(int hugePageNumber) { + this.hugePageNumber = hugePageNumber; + } + + public Map getNicNameDriverMap() { + return nicNameDriverMap; + } + + public void setNicNameDriverMap(Map nicNameDriverMap) { + this.nicNameDriverMap = nicNameDriverMap; + } + + public boolean isHostStatusCheck() { + return hostStatusCheck; + } + + public void setHostStatusCheck(boolean hostStatusCheck) { + this.hostStatusCheck = hostStatusCheck; + } + + public String getBondMode() { + return bondMode; + } + + public void setBondMode(String bondMode) { + this.bondMode = bondMode; + } + + public String getLacpMode() { + return lacpMode; + } + + public void setLacpMode(String lacpMode) { + this.lacpMode = lacpMode; + } + + public String getOvnEncapNetmask() { + return ovnEncapNetmask; + } + + public void setOvnEncapNetmask(String ovnEncapNetmask) { + this.ovnEncapNetmask = ovnEncapNetmask; + } +} diff --git a/header/src/main/java/org/zstack/header/network/l2/VSwitchOvsHypervisorFactory.java b/header/src/main/java/org/zstack/header/network/l2/VSwitchOvsHypervisorFactory.java new file mode 100644 index 00000000000..126be146d57 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/l2/VSwitchOvsHypervisorFactory.java @@ -0,0 +1,15 @@ +package org.zstack.header.network.l2; + +import org.zstack.header.core.Completion; +import org.zstack.header.core.NoErrorCompletion; +import org.zstack.header.host.HypervisorType; + +public interface VSwitchOvsHypervisorFactory { + HypervisorType getHypervisorType(); + + void installPackages(String hostUuid, VSwitchOvsConfigStruct struct, Completion completion); + void startService(String hostUuid, VSwitchOvsConfigStruct struct, Completion completion); + + void unInstallPackages(String hostUuid, VSwitchOvsConfigStruct struct, NoErrorCompletion completion); + void stopService(String hostUuid, VSwitchOvsConfigStruct struct, NoErrorCompletion completion); +} diff --git a/header/src/main/java/org/zstack/header/network/l2/VSwitchOvsManager.java b/header/src/main/java/org/zstack/header/network/l2/VSwitchOvsManager.java new file mode 100644 index 00000000000..25deaa79176 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/l2/VSwitchOvsManager.java @@ -0,0 +1,7 @@ +package org.zstack.header.network.l2; + +import org.zstack.header.host.HypervisorType; + +public interface VSwitchOvsManager { + public VSwitchOvsHypervisorFactory getHyerVisorFactory(HypervisorType type); +} diff --git a/header/src/main/java/org/zstack/header/network/l2/VSwitchType.java b/header/src/main/java/org/zstack/header/network/l2/VSwitchType.java index f00d4b3153b..530d926cbfd 100644 --- a/header/src/main/java/org/zstack/header/network/l2/VSwitchType.java +++ b/header/src/main/java/org/zstack/header/network/l2/VSwitchType.java @@ -1,35 +1,34 @@ package org.zstack.header.network.l2; -import org.zstack.header.vm.VmMacVlanNicConstant; import org.zstack.header.vm.VmNicType; -import org.zstack.header.vm.VmOvsNicConstant; +import org.zstack.utils.Utils; +import org.zstack.utils.gson.JSONObjectUtil; +import org.zstack.utils.logging.CLogger; import java.util.*; public class VSwitchType { + private static final CLogger logger = Utils.getLogger(VSwitchType.class); private static Map types = Collections.synchronizedMap(new HashMap()); private final String typeName; - private static Map> vSwitchSupportNicTypesMap = Collections.synchronizedMap(new HashMap>()); private boolean exposed = true; - - public static boolean hasType(String typeName) { - return types.containsKey(typeName); - } + private boolean attachToCluster = true; + private String sdnControllerType = null; + private boolean useDpdk = false; + private Map nicTypes = Collections.synchronizedMap(new HashMap<>()); public VSwitchType(String typeName) { this.typeName = typeName; - types.put(typeName, this); + if (!types.containsKey(typeName)) { + types.put(typeName, this); + } } public VSwitchType(String typeName, boolean exposed) { this(typeName); - this.exposed = exposed; - } - - public VSwitchType(String typeName, VmNicType nicType) { - this.typeName = typeName; - types.put(typeName, this); - vSwitchSupportNicTypesMap.computeIfAbsent(typeName, k -> new ArrayList()).add(nicType); + if (!types.containsKey(typeName)) { + types.put(typeName, this); + } } public boolean isExposed() { @@ -40,34 +39,62 @@ public void setExposed(boolean exposed) { this.exposed = exposed; } - public List getSupVmNicTypes() { - return vSwitchSupportNicTypesMap.get(typeName); + + public boolean isAttachToCluster() { + return attachToCluster; } - public VmNicType getVmNicTypeWithCondition(boolean enableSRIOV, boolean enableVhostUser) { - List types = getSupVmNicTypes(); + public void setAttachToCluster(boolean attachToCluster) { + this.attachToCluster = attachToCluster; + } - if (typeName.equals(L2NetworkConstant.VSWITCH_TYPE_OVS_DPDK)) { - if (enableVhostUser && types.contains(VmNicType.valueOf(VmOvsNicConstant.ACCEL_TYPE_VHOST_USER_SPACE))) { - return VmNicType.valueOf(VmOvsNicConstant.ACCEL_TYPE_VHOST_USER_SPACE); - } else if (types.contains(VmNicType.valueOf(VmOvsNicConstant.ACCEL_TYPE_VDPA))){ - return VmNicType.valueOf(VmOvsNicConstant.ACCEL_TYPE_VDPA); - } - } else if (typeName.equals(L2NetworkConstant.VSWITCH_TYPE_LINUX_BRIDGE)){ - for (VmNicType type : types) { - if (type.isUseSRIOV() == enableSRIOV) { - return type; - } + public String getSdnControllerType() { + return sdnControllerType; + } + + public void setSdnControllerType(String sdnControllerType) { + this.sdnControllerType = sdnControllerType; + } + + public boolean isUseDpdk() { + return useDpdk; + } + + public void setUseDpdk(boolean useDpdk) { + this.useDpdk = useDpdk; + } + + public void addVmNicType(VmNicType.VmNicSubType subType, VmNicType nicType) { + VmNicType oldNicType = nicTypes.get(subType); + if (oldNicType != null) { + if (!oldNicType.toString().equals(nicType.toString())) { + throw new IllegalArgumentException("duplicated nic type: " + nicType + + " subtype " + subType + " for vSwitchType " + typeName + " " + + JSONObjectUtil.toJsonString(nicTypes)); + } else { + /* call addVmNicType duplicated */ + return; } - } else if (typeName.equals(L2NetworkConstant.VSWITCH_TYPE_MACVLAN)) { - if (types.contains(VmNicType.valueOf(VmMacVlanNicConstant.MACVLAN_NIC_TYPE))) { - return VmNicType.valueOf(VmMacVlanNicConstant.MACVLAN_NIC_TYPE); + } + logger.debug("addVmNicType nic type: " + nicType + + " subtype " + subType + " for vSwitchType " + typeName); + nicTypes.put(subType, nicType); + } + + public VmNicType getVmNicType(VmNicType.VmNicSubType subType) { + VmNicType nicType = nicTypes.get(subType); + if (nicType == null) { + /* for case, enableVHostUser is enabled, but vswitch type is linux bridge */ + nicType = nicTypes.get(VmNicType.VmNicSubType.NONE); + if (nicType == null) { + throw new IllegalArgumentException("unsupported nicSubType " + subType + " for vswitch type " + typeName); } } - return null; + return nicType; } + public static VSwitchType valueOf(String typeName) { VSwitchType type = types.get(typeName); if (type == null) { @@ -83,7 +110,7 @@ public String toString() { @Override public boolean equals(Object t) { - if (t == null || !(t instanceof VSwitchType)) { + if (!(t instanceof VSwitchType)) { return false; } diff --git a/header/src/main/java/org/zstack/header/rest/RESTFacade.java b/header/src/main/java/org/zstack/header/rest/RESTFacade.java index 9fcdedbd545..6dca102465d 100755 --- a/header/src/main/java/org/zstack/header/rest/RESTFacade.java +++ b/header/src/main/java/org/zstack/header/rest/RESTFacade.java @@ -36,6 +36,8 @@ public interface RESTFacade { void asyncJsonDelete(String url, String body, Map headers, AsyncRESTCallback callback, TimeUnit unit, long timeout); void asyncJsonGet(String url, String body, Map headers, AsyncRESTCallback callback, TimeUnit unit, long timeout); + void asyncJson(final String url, final String body, Map headers, HttpMethod method, final AsyncRESTCallback callback, final TimeUnit unit, final long timeout); + T syncJsonPost(String url, Object body, Class returnClass); T syncJsonPost(String url, Object body, Class returnClass, TimeUnit unit, long timeout); diff --git a/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java b/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java index 47572db0fb3..e452dfb712c 100755 --- a/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java +++ b/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java @@ -20,6 +20,7 @@ public interface VmInstanceConstant { String VM_SYNC_SIGNATURE_PREFIX = "Vm-"; + String L2_TF_VSWITCH_TYPE = "TfL2Network"; String TF_VIRTUAL_NIC_TYPE = "TFVNIC"; enum Params { diff --git a/header/src/main/java/org/zstack/header/vm/VmInstanceNicFactory.java b/header/src/main/java/org/zstack/header/vm/VmInstanceNicFactory.java index 481c8affd26..44ce4a8831e 100755 --- a/header/src/main/java/org/zstack/header/vm/VmInstanceNicFactory.java +++ b/header/src/main/java/org/zstack/header/vm/VmInstanceNicFactory.java @@ -7,7 +7,6 @@ public interface VmInstanceNicFactory { VmNicType getType(); - VSwitchType getVSwitchType(); VmNicVO createVmNic(VmNicInventory inv, VmInstanceSpec spec); static VmNicVO createVmNic(VmNicInventory nic) { diff --git a/header/src/main/java/org/zstack/header/vm/VmNicType.java b/header/src/main/java/org/zstack/header/vm/VmNicType.java index 184fa74239c..3fd9612742a 100755 --- a/header/src/main/java/org/zstack/header/vm/VmNicType.java +++ b/header/src/main/java/org/zstack/header/vm/VmNicType.java @@ -1,13 +1,17 @@ package org.zstack.header.vm; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; +import java.util.*; public class VmNicType { + public enum VmNicSubType { + NONE, + SRIOV, + VHOSTUSER, + } private static Map types = Collections.synchronizedMap(new HashMap<>()); private final String typeName; + private boolean hasAddon = false; private boolean useSRIOV = false; public VmNicType(String typeName) { @@ -15,12 +19,6 @@ public VmNicType(String typeName) { types.put(typeName, this); } - public VmNicType(String typeName, Boolean useSRIOV) { - this.typeName = typeName; - this.useSRIOV = useSRIOV; - types.put(typeName, this); - } - public static VmNicType valueOf(String typeName) { VmNicType type = types.get(typeName); if (type == null) { @@ -29,10 +27,22 @@ public static VmNicType valueOf(String typeName) { return type; } + public boolean isHasAddon() { + return hasAddon; + } + + public void setHasAddon(boolean hasAddon) { + this.hasAddon = hasAddon; + } + public boolean isUseSRIOV() { return useSRIOV; } + public void setUseSRIOV(boolean useSRIOV) { + this.useSRIOV = useSRIOV; + } + @Override public String toString() { return typeName; diff --git a/network/src/main/java/org/zstack/network/l2/L2NetworkApiInterceptor.java b/network/src/main/java/org/zstack/network/l2/L2NetworkApiInterceptor.java index dcdde3cef17..b67aea2b6ef 100755 --- a/network/src/main/java/org/zstack/network/l2/L2NetworkApiInterceptor.java +++ b/network/src/main/java/org/zstack/network/l2/L2NetworkApiInterceptor.java @@ -1,5 +1,7 @@ package org.zstack.network.l2; +import org.apache.commons.lang.StringUtils; +import org.apache.poi.util.StringUtil; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.db.DatabaseFacade; @@ -75,16 +77,18 @@ private void validate(final APIAttachL2NetworkToClusterMsg msg) { /* current ovs only support vlan, vxlan*/ L2NetworkVO l2 = dbf.findByUuid(msg.getL2NetworkUuid(), L2NetworkVO.class); - /* find l2 network with same physical interface, but different vswitch Type */ - List otherL2s = Q.New(L2NetworkVO.class).select(L2NetworkVO_.uuid) - .eq(L2NetworkVO_.physicalInterface, l2.getPhysicalInterface()) - .notEq(L2NetworkVO_.vSwitchType, l2.getvSwitchType()).listValues(); - if (!otherL2s.isEmpty()) { - if (Q.New(L2NetworkClusterRefVO.class).eq(L2NetworkClusterRefVO_.clusterUuid, msg.getClusterUuid()) - .in(L2NetworkClusterRefVO_.l2NetworkUuid, otherL2s).isExists()) { - throw new ApiMessageInterceptionException(argerr("could not attach l2 network, because there "+ - "is another network [uuid:%s] on physical interface [%s] with different vswitch type", - otherL2s.get(0), l2.getPhysicalInterface())); + if (!StringUtils.isEmpty(l2.getPhysicalInterface())) { + /* find l2 network with same physical interface, but different vswitch Type */ + List otherL2s = Q.New(L2NetworkVO.class).select(L2NetworkVO_.uuid) + .eq(L2NetworkVO_.physicalInterface, l2.getPhysicalInterface()) + .notEq(L2NetworkVO_.vSwitchType, l2.getvSwitchType()).listValues(); + if (!otherL2s.isEmpty()) { + if (Q.New(L2NetworkClusterRefVO.class).eq(L2NetworkClusterRefVO_.clusterUuid, msg.getClusterUuid()) + .in(L2NetworkClusterRefVO_.l2NetworkUuid, otherL2s).isExists()) { + throw new ApiMessageInterceptionException(argerr("could not attach l2 network, because there " + + "is another network [uuid:%s] on physical interface [%s] with different vswitch type", + otherL2s.get(0), l2.getPhysicalInterface())); + } } } } @@ -111,7 +115,9 @@ private void validate(APICreateL2NetworkMsg msg) { throw new ApiMessageInterceptionException(argerr("unsupported l2Network type[%s]", msg.getType())); } - if (!VSwitchType.hasType(msg.getvSwitchType())) { + try { + VSwitchType.valueOf(msg.getvSwitchType()); + } catch (Exception e) { throw new ApiMessageInterceptionException(argerr("unsupported vSwitch type[%s]", msg.getvSwitchType())); } } diff --git a/network/src/main/java/org/zstack/network/l2/L2NoVlanL2NetworkFactory.java b/network/src/main/java/org/zstack/network/l2/L2NoVlanL2NetworkFactory.java index b35f08bbd3c..3d5720ccd26 100755 --- a/network/src/main/java/org/zstack/network/l2/L2NoVlanL2NetworkFactory.java +++ b/network/src/main/java/org/zstack/network/l2/L2NoVlanL2NetworkFactory.java @@ -1,10 +1,18 @@ package org.zstack.network.l2; import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.workflow.SimpleFlowChain; import org.zstack.header.Component; +import org.zstack.header.core.Completion; import org.zstack.header.core.ReturnValueCompletion; +import org.zstack.header.core.WhileDoneCompletion; +import org.zstack.header.core.workflow.*; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.network.l2.*; import org.zstack.network.service.NetworkServiceGlobalConfig; import org.zstack.resourceconfig.ResourceConfigFacade; @@ -12,6 +20,8 @@ import org.zstack.utils.data.FieldPrinter; import org.zstack.utils.logging.CLogger; +import java.util.Map; + public class L2NoVlanL2NetworkFactory implements L2NetworkFactory, Component, L2NetworkDefaultMtu, L2NetworkGetVniExtensionPoint { private static L2NetworkType type = new L2NetworkType(L2NetworkConstant.L2_NO_VLAN_NETWORK_TYPE); private static CLogger logger = Utils.getLogger(L2NoVlanL2NetworkFactory.class); @@ -23,6 +33,8 @@ public class L2NoVlanL2NetworkFactory implements L2NetworkFactory, Component, L2 private DatabaseFacade dbf; @Autowired private ResourceConfigFacade rcf; + @Autowired + protected PluginRegistry pluginRgty; @Override public L2NetworkType getType() { @@ -31,10 +43,64 @@ public L2NetworkType getType() { @Override public void createL2Network(L2NetworkVO vo, APICreateL2NetworkMsg msg, ReturnValueCompletion completion) { - vo = dbf.persistAndRefresh(vo); - L2NetworkInventory inv = L2NetworkInventory.valueOf(vo); - logger.debug("Successfully created NoVlanL2Network: " + printer.print(inv)); - completion.success(inv); + + FlowChain chain = new SimpleFlowChain(); + chain.setName("create-no-vlan-network"); + chain.then(new Flow() { + String __name__ = "write-db"; + @Override + public void run(FlowTrigger trigger, Map data) { + dbf.persist(vo); + trigger.next(); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + dbf.removeByPrimaryKey(vo.getUuid(), L2NetworkVO.class); + trigger.rollback(); + } + }).then(new NoRollbackFlow() { + String __name__ = "create-l2-network-extension"; + + @Override + public void run(FlowTrigger trigger, Map data) { + new While<>(pluginRgty.getExtensionList(L2NetworkCreateExtensionPoint.class)) + .each((exp, wcompl) -> exp.postCreateL2Network(L2NetworkInventory.valueOf(vo), msg, new Completion(trigger) { + @Override + public void success() { + wcompl.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + wcompl.addError(errorCode); + wcompl.allDone(); + } + })).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().isEmpty()) { + trigger.next(); + } else { + trigger.fail(errorCodeList.getCauses().get(0)); + } + } + }); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + L2NetworkInventory inv = L2NetworkInventory.valueOf( + dbf.findByUuid(vo.getUuid(), L2NetworkVO.class)); + logger.debug("Successfully created NoVlanL2Network: " + printer.print(inv)); + completion.success(inv); + } + }).start(); } @Override diff --git a/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java b/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java index 755683d446a..892ff3b50aa 100755 --- a/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java +++ b/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java @@ -18,8 +18,10 @@ import org.zstack.core.thread.ThreadFacade; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; +import org.zstack.core.workflow.SimpleFlowChain; import org.zstack.header.apimediator.ApiMessageInterceptionException; import org.zstack.header.core.Completion; +import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.core.NopeCompletion; import org.zstack.header.core.WhileDoneCompletion; import org.zstack.header.core.workflow.*; @@ -84,6 +86,10 @@ protected L2NetworkInventory getSelfInventory() { return L2NetworkInventory.valueOf(self); } + public VSwitchType getVSwitchType() { + return VSwitchType.valueOf(self.getvSwitchType()); + } + @Override public void handleMessage(Message msg) { try { @@ -143,15 +149,6 @@ public void fail(ErrorCode errorCode) { }); } - protected boolean checkPhysicalInterfaceForAttach() { - return true; - } - - protected boolean realizeDataPlaneForAttach() { - return true; - } - - private void handle(DeleteL2NetworkMsg msg) { DeleteL2NetworkReply reply = new DeleteL2NetworkReply(); final String issuer = L2NetworkVO.class.getSimpleName(); @@ -243,7 +240,8 @@ private void syncManagementServiceType(ServiceTypeExtensionPoint ext, L2NetworkV } private void handle(DetachL2NetworkFromClusterMsg msg) { - if (!L2NetworkGlobalConfig.DeleteL2BridgePhysically.value(Boolean.class)) { + if (!L2NetworkGlobalConfig.DeleteL2BridgePhysically.value(Boolean.class) || + !getVSwitchType().isAttachToCluster()) { SQL.New(L2NetworkClusterRefVO.class) .eq(L2NetworkClusterRefVO_.clusterUuid, msg.getClusterUuid()) .eq(L2NetworkClusterRefVO_.l2NetworkUuid, msg.getL2NetworkUuid()) @@ -314,7 +312,6 @@ private void handle(final CheckL2NetworkOnHostMsg msg) { String htype = q.findValue(); final HypervisorType hvType = HypervisorType.valueOf(htype); final L2NetworkType l2Type = L2NetworkType.valueOf(self.getType()); - final VSwitchType vSwitchType = VSwitchType.valueOf(self.getvSwitchType()); L2NetworkHostRefInventory hostRef = l2NetworkHostHelper.getL2NetworkHostRef(msg.getL2NetworkUuid(), msg.getHostUuid()); String providerType = null; @@ -324,7 +321,7 @@ private void handle(final CheckL2NetworkOnHostMsg msg) { final CheckL2NetworkOnHostReply reply = new CheckL2NetworkOnHostReply(); // TODO: this should be fixed - L2NetworkRealizationExtensionPoint ext = l2Mgr.getRealizationExtension(l2Type, vSwitchType, hvType); + L2NetworkRealizationExtensionPoint ext = l2Mgr.getRealizationExtension(l2Type, getVSwitchType(), hvType); ext.check(getSelfInventory(), msg.getHostUuid(), new Completion(msg) { @Override public void success() { @@ -343,19 +340,63 @@ private void handle(L2NetworkDeletionMsg msg) { L2NetworkInventory inv = L2NetworkInventory.valueOf(self); extpEmitter.beforeDelete(inv); L2NetworkDeletionReply reply = new L2NetworkDeletionReply(); - deleteHook(new Completion(msg) { + + FlowChain chain = new SimpleFlowChain(); + chain.setName("delete-l2-network-" + inv.getUuid()); + chain.then(new NoRollbackFlow() { + String __name__ = "delete-l2-network-extension"; + @Override - public void success() { - extpEmitter.afterDelete(inv); - bus.reply(msg, reply); + public void run(FlowTrigger trigger, Map data) { + new While<>(pluginRgty.getExtensionList(L2NetworkDeleteExtensionPoint.class)) + .each((exp, wcompl) -> exp.deleteL2Network(inv, new NoErrorCompletion(trigger) { + @Override + public void done() { + wcompl.done(); + } + })).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().isEmpty()) { + trigger.next(); + } else { + trigger.fail(errorCodeList.getCauses().get(0)); + } + } + }); } + }).then(new NoRollbackFlow() { + String __name__ = "delete-l2-network"; @Override - public void fail(ErrorCode errorCode) { - reply.setError(errorCode); + public void run(FlowTrigger trigger, Map data) { + deleteHook(new Completion(msg) { + @Override + public void success() { + extpEmitter.afterDelete(inv); + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + trigger.fail(errorCode); + } + }); + } + }).error(new FlowErrorHandler(msg) { + @Override + public void handle(ErrorCode errCode, Map data) { + reply.setError(errCode); bus.reply(msg, reply); } - }); + }).done(new FlowDoneHandler(msg) { + @Override + public void handle(Map data) { + bus.reply(msg, reply); + } + }).start(); } private void handleApiMessage(APIMessage msg) { @@ -473,15 +514,13 @@ public void fail(ErrorCode errorCode) { protected void updateVlanNetwork(L2NetworkInventory oldl2, L2NetworkInventory newl2, String hostUuid, String htype, Completion completion) { final HypervisorType hvType = HypervisorType.valueOf(htype); final L2NetworkType l2Type = L2NetworkType.valueOf(self.getType()); - final VSwitchType vSwitchType = VSwitchType.valueOf(self.getvSwitchType()); - L2NetworkRealizationExtensionPoint ext = l2Mgr.getRealizationExtension(l2Type, vSwitchType, hvType); + L2NetworkRealizationExtensionPoint ext = l2Mgr.getRealizationExtension(l2Type, getVSwitchType(), hvType); ext.update(oldl2, newl2, hostUuid, completion); } protected void realizeNetwork(String hostUuid, String htype, String providerType, Completion completion) { final HypervisorType hvType = HypervisorType.valueOf(htype); final L2NetworkType l2Type = L2NetworkType.valueOf(self.getType()); - final VSwitchType vSwitchType = VSwitchType.valueOf(self.getvSwitchType()); - L2NetworkRealizationExtensionPoint ext = l2Mgr.getRealizationExtension(l2Type, vSwitchType, hvType); + L2NetworkRealizationExtensionPoint ext = l2Mgr.getRealizationExtension(l2Type, getVSwitchType(), hvType); ext.realize(getSelfInventory(), hostUuid, completion); } @@ -642,7 +681,7 @@ private void prepareL2NetworkOnHosts(final List hosts, String pro chain.then(new NoRollbackFlow() { @Override public boolean skip(Map data) { - return !checkPhysicalInterfaceForAttach(); + return !getVSwitchType().isAttachToCluster(); } @Override @@ -679,7 +718,7 @@ public void run(List replies) { @Override public boolean skip(Map data) { - return !realizeDataPlaneForAttach(); + return !getVSwitchType().isAttachToCluster(); } @Override @@ -978,7 +1017,8 @@ public void fail(ErrorCode errorCode) { @Override public void deleteHook(Completion completion) { - if (L2NetworkGlobalConfig.DeleteL2BridgePhysically.value(Boolean.class)) { + if (L2NetworkGlobalConfig.DeleteL2BridgePhysically.value(Boolean.class) + && getVSwitchType().isAttachToCluster()) { deleteL2Bridge(completion); } else { completion.success(); @@ -1010,13 +1050,9 @@ private void deleteL2Bridge(List clusterUuids, Completion completion) { } List hostss = new ArrayList<>(); - Map hostL2ProviderMap = new HashMap<>(); for (Map.Entry> e : providerClusterMap.entrySet()) { List hosts = Q.New(HostVO.class) .in(HostVO_.clusterUuid, e.getValue()).list(); - for (HostVO h: hosts) { - hostL2ProviderMap.put(h.getUuid(), e.getKey()); - } hostss.addAll(hosts); } @@ -1024,8 +1060,7 @@ private void deleteL2Bridge(List clusterUuids, Completion completion) { new While<>(hostss).step((host,compl) -> { HypervisorType hvType = HypervisorType.valueOf(host.getHypervisorType()); L2NetworkType l2Type = L2NetworkType.valueOf(self.getType()); - VSwitchType vSwitchType = VSwitchType.valueOf(self.getvSwitchType()); - L2NetworkRealizationExtensionPoint ext = l2Mgr.getRealizationExtension(l2Type, vSwitchType, hvType); + L2NetworkRealizationExtensionPoint ext = l2Mgr.getRealizationExtension(l2Type, getVSwitchType(), hvType); ext.delete(getSelfInventory(), host.getUuid(), new Completion(compl){ @Override public void success() { diff --git a/network/src/main/java/org/zstack/network/l2/L2VlanNetworkFactory.java b/network/src/main/java/org/zstack/network/l2/L2VlanNetworkFactory.java index 6b52dcff070..35c34f1799a 100755 --- a/network/src/main/java/org/zstack/network/l2/L2VlanNetworkFactory.java +++ b/network/src/main/java/org/zstack/network/l2/L2VlanNetworkFactory.java @@ -1,13 +1,20 @@ package org.zstack.network.l2; import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.MessageSafe; +import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; +import org.zstack.core.workflow.SimpleFlowChain; import org.zstack.header.AbstractService; import org.zstack.header.core.Completion; import org.zstack.header.core.ReturnValueCompletion; +import org.zstack.header.core.WhileDoneCompletion; +import org.zstack.header.core.workflow.*; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.message.APIMessage; import org.zstack.header.message.Message; import org.zstack.header.network.l2.*; @@ -20,6 +27,7 @@ import org.zstack.utils.logging.CLogger; import java.util.List; +import java.util.Map; public class L2VlanNetworkFactory extends AbstractService implements L2NetworkFactory, L2NetworkDefaultMtu, L2NetworkGetVniExtensionPoint { private static CLogger logger = Utils.getLogger(L2VlanNetworkFactory.class); @@ -33,6 +41,8 @@ public class L2VlanNetworkFactory extends AbstractService implements L2NetworkFa private QueryFacade qf; @Autowired private ResourceConfigFacade rcf; + @Autowired + protected PluginRegistry pluginRgty; @Override public L2NetworkType getType() { @@ -41,15 +51,71 @@ public L2NetworkType getType() { @Override public void createL2Network(L2NetworkVO ovo, APICreateL2NetworkMsg msg, ReturnValueCompletion completion) { - APICreateL2VlanNetworkMsg amsg = (APICreateL2VlanNetworkMsg) msg; - L2VlanNetworkVO vo = new L2VlanNetworkVO(ovo); - vo.setVlan(amsg.getVlan()); - vo.setVirtualNetworkId(vo.getVlan()); - vo = dbf.persistAndRefresh(vo); - L2VlanNetworkInventory inv = L2VlanNetworkInventory.valueOf(vo); - String info = String.format("successfully create L2VlanNetwork, %s", JSONObjectUtil.toJsonString(inv)); - logger.debug(info); - completion.success(inv); + FlowChain chain = new SimpleFlowChain(); + chain.setName("create-no-vlan-network"); + chain.then(new Flow() { + String __name__ = "write-db"; + @Override + public void run(FlowTrigger trigger, Map data) { + APICreateL2VlanNetworkMsg amsg = (APICreateL2VlanNetworkMsg) msg; + L2VlanNetworkVO vo = new L2VlanNetworkVO(ovo); + vo.setVlan(amsg.getVlan()); + vo.setVirtualNetworkId(vo.getVlan()); + dbf.persist(vo); + trigger.next(); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + dbf.removeByPrimaryKey(ovo.getUuid(), L2VlanNetworkVO.class); + trigger.rollback(); + } + }).then(new NoRollbackFlow() { + String __name__ = "create-l2-network-extension"; + + @Override + public void run(FlowTrigger trigger, Map data) { + L2VlanNetworkInventory inv = L2VlanNetworkInventory.valueOf( + dbf.findByUuid(ovo.getUuid(), L2VlanNetworkVO.class)); + new While<>(pluginRgty.getExtensionList(L2NetworkCreateExtensionPoint.class)) + .each((exp, wcompl) -> exp.postCreateL2Network(inv, msg, new Completion(trigger) { + @Override + public void success() { + wcompl.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + wcompl.addError(errorCode); + wcompl.allDone(); + } + })).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().isEmpty()) { + trigger.next(); + } else { + trigger.fail(errorCodeList.getCauses().get(0)); + } + } + }); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + L2VlanNetworkInventory inv = L2VlanNetworkInventory.valueOf( + dbf.findByUuid(ovo.getUuid(), L2VlanNetworkVO.class)); + logger.debug(String.format("Successfully created VlanL2Network[uuid:%s, name:%s]", + inv.getUuid(), inv.getName())); + completion.success(inv); + } + }).start(); + } @Override diff --git a/network/src/main/java/org/zstack/network/service/NetworkServiceManager.java b/network/src/main/java/org/zstack/network/service/NetworkServiceManager.java index c6f7e14dd81..cd80c9b184f 100755 --- a/network/src/main/java/org/zstack/network/service/NetworkServiceManager.java +++ b/network/src/main/java/org/zstack/network/service/NetworkServiceManager.java @@ -8,6 +8,7 @@ import org.zstack.header.vm.VmInstanceSpec; import java.util.List; +import java.util.Set; public interface NetworkServiceManager { NetworkServiceProviderType getTypeOfNetworkServiceProviderForService(String l3NetworkUuid, NetworkServiceType serviceType); @@ -21,4 +22,6 @@ void enableNetworkService(L3NetworkVO l3VO, NetworkServiceProviderType providerT NetworkServiceType nsType, List systemTags, Completion completion); void disableNetworkService(L3NetworkVO l3VO, NetworkServiceProviderType providerType, NetworkServiceType nsType, Completion completion); + + Set getSupportedVmTypes(); } diff --git a/network/src/main/java/org/zstack/network/service/NetworkServiceManagerImpl.java b/network/src/main/java/org/zstack/network/service/NetworkServiceManagerImpl.java index eac256b19cd..787ee313cd6 100755 --- a/network/src/main/java/org/zstack/network/service/NetworkServiceManagerImpl.java +++ b/network/src/main/java/org/zstack/network/service/NetworkServiceManagerImpl.java @@ -53,8 +53,7 @@ public class NetworkServiceManagerImpl extends AbstractService implements Networ private Set supportedVmTypes = new HashSet<>(); private List nsExts = new ArrayList(); - - private void populateExtensions() { + private void populateExtensions() { for (NetworkServiceProviderFactory extp : pluginRgty.getExtensionList(NetworkServiceProviderFactory.class)) { NetworkServiceProviderFactory old = providerFactories.get(extp.getType().toString()); if (old != null) { @@ -536,4 +535,9 @@ public void disableNetworkService(L3NetworkVO l3VO, NetworkServiceProviderType p logger.debug(String.format("there is no backend[provideType:%s, serviceType:%S] to disable service", providerType.toString(), nsType.toString())); completion.success(); } + + @Override + public Set getSupportedVmTypes() { + return supportedVmTypes; + } } diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmAllocateNicFlow.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmAllocateNicFlow.java index 452e27c222d..5f2b1e29088 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmAllocateNicFlow.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmAllocateNicFlow.java @@ -94,21 +94,8 @@ private VmNicInventory makeNicInventory(VmInstanceSpec vmSpec, ApplianceVmNicSpe inv.setState(VmNicState.enable.toString()); L3NetworkVO l3NetworkVO = dbf.findByUuid(nicSpec.getL3NetworkUuid(), L3NetworkVO.class); - L2NetworkVO l2NetworkVO = dbf.findByUuid(l3NetworkVO.getL2NetworkUuid(), L2NetworkVO.class); - - // set vnic type based on enableSRIOV system tag & enableVhostUser globalConfig - boolean enableSriov = Q.New(SystemTagVO.class) - .eq(SystemTagVO_.resourceType, VmInstanceVO.class.getSimpleName()) - .eq(SystemTagVO_.resourceUuid, vmSpec.getVmInventory().getUuid()) - .eq(SystemTagVO_.tag, String.format("enableSRIOV::%s", nicSpec.getL3NetworkUuid())) - .isExists(); - boolean enableVhostUser = NetworkServiceGlobalConfig.ENABLE_VHOSTUSER.value(Boolean.class); - - VSwitchType vSwitchType = VSwitchType.valueOf(l2NetworkVO.getvSwitchType()); - VmNicType vmNicType = vSwitchType.getVmNicTypeWithCondition(enableSriov, enableVhostUser); - if (vmNicType == null) { - throw new OperationFailureException(Platform.operr("there is no available nicType on L2 network [%s]", l2NetworkVO.getUuid())); - } + VmNicType vmNicType = nicManager.getVmNicType(vmSpec.getVmInventory().getUuid(), + L3NetworkInventory.valueOf(l3NetworkVO)); inv.setType(vmNicType.toString()); inv.setUsedIps(new ArrayList<>()); diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmConstant.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmConstant.java index e85cd00855b..7aaa282d77d 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmConstant.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmConstant.java @@ -20,6 +20,8 @@ public class ApplianceVmConstant { public static final String APPLIANCE_VM_ABNORMAL_FILE_REPORT = "/appliancevm/abnormalfiles/report"; public static final String ABNORMAL_FILE_MAX_SIZE = "abnormalFileMaxSize"; + public static final String APPLIANCE_VM_CPUMODE = "cpuMode"; + public enum BootstrapParams { managementNic, additionalNics, diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/CreateApplianceVmJob.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/CreateApplianceVmJob.java index db42d420500..f25d80f4818 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/CreateApplianceVmJob.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/CreateApplianceVmJob.java @@ -145,6 +145,12 @@ protected ApplianceVmVO scripts() { rc.updateValue(finalAvo1.getUuid(), Boolean.TRUE.toString()); } + String cpuMode = spec.getExtensionData(ApplianceVmConstant.APPLIANCE_VM_CPUMODE, String.class); + if (cpuMode != null) { + ResourceConfig rc = rcf.getResourceConfig(KVMGlobalConfig.NESTED_VIRTUALIZATION.getIdentity()); + rc.updateValue(finalAvo1.getUuid(), cpuMode); + } + return reload(vo); } }.execute(); diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceConstant.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceConstant.java new file mode 100644 index 00000000000..15ee3d8732a --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceConstant.java @@ -0,0 +1,5 @@ +package org.zstack.network.hostNetworkInterface; + +public interface HostNetworkInterfaceConstant { + String NIC_DRIVER_TYPE_VFIO_PCI = "vfio-pci"; +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceInventory.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceInventory.java index 9583c88a5c9..5ad59b9d668 100644 --- a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceInventory.java +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceInventory.java @@ -40,6 +40,7 @@ public class HostNetworkInterfaceInventory implements Serializable { private String mac; private String callBackIp; private String pciDeviceAddress; + private String driverType; private String offloadStatus; private String virtStatus; private String description; @@ -247,6 +248,7 @@ public HostNetworkInterfaceInventory(HostNetworkInterfaceVO vo) { this.interfaceType = vo.getInterfaceType(); this.mac = vo.getMac(); this.pciDeviceAddress = vo.getPciDeviceAddress(); + this.driverType = vo.getDriverType(); if (vo.getIpAddresses() != null) { this.ipAddresses = Arrays.asList(vo.getIpAddresses().split(",")); } @@ -269,4 +271,12 @@ public static HostNetworkInterfaceInventory valueOf(HostNetworkInterfaceVO vo) { public static List valueOf(Collection vos) { return vos.stream().map(HostNetworkInterfaceInventory::valueOf).collect(Collectors.toList()); } + + public String getDriverType() { + return driverType; + } + + public void setDriverType(String driverType) { + this.driverType = driverType; + } } diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceVO.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceVO.java index dc56e726288..18a4c1e3269 100644 --- a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceVO.java +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceVO.java @@ -73,6 +73,9 @@ public class HostNetworkInterfaceVO extends ResourceVO implements ToInventory, O @Column private String pciDeviceAddress; + @Column + private String driverType; + @Column private String offloadStatus; @@ -267,6 +270,14 @@ public void setLastOpDate(Timestamp lastOpDate) { this.lastOpDate = lastOpDate; } + public String getDriverType() { + return driverType; + } + + public void setDriverType(String driverType) { + this.driverType = driverType; + } + @Override public String getAccountUuid() { return accountUuid; diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceVO_.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceVO_.java index 717cc645bfc..d9980b06cdb 100644 --- a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceVO_.java +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceVO_.java @@ -25,7 +25,9 @@ public class HostNetworkInterfaceVO_ extends ResourceVO_ { public static volatile SingularAttribute gateway; public static volatile SingularAttribute callBackIp; public static volatile SingularAttribute pciDeviceAddress; + public static volatile SingularAttribute driverType; public static volatile SingularAttribute offloadStatus; + public static volatile SingularAttribute virtStatus; public static volatile SingularAttribute speed; public static volatile SingularAttribute slaveActive; public static volatile SingularAttribute carrierActive; diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/AbstractKVMConnectExtensionForL2Network.java b/plugin/kvm/src/main/java/org/zstack/kvm/AbstractKVMConnectExtensionForL2Network.java index 2aa7e4fe4d6..0bec0e09099 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/AbstractKVMConnectExtensionForL2Network.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/AbstractKVMConnectExtensionForL2Network.java @@ -48,6 +48,10 @@ protected List getL2Networks(String clusterUuid) { List ret = new ArrayList(vos.size()); List noVlanL2Networks = new ArrayList<>(); for (L2NetworkVO vo : vos) { + VSwitchType vSwitchType = VSwitchType.valueOf(vo.getvSwitchType()); + if (!vSwitchType.isAttachToCluster()) { + continue; + } if (L2NetworkConstant.L2_NO_VLAN_NETWORK_TYPE.equals(vo.getType())) { noVlanL2Networks.add(L2NetworkInventory.valueOf(vo)); } else if (L2NetworkConstant.L2_VLAN_NETWORK_TYPE.equals(vo.getType())) { @@ -100,7 +104,7 @@ public void run(final FlowTrigger trigger, Map data) { } for (int i = 0; i < count; i++) { - int end = (i + 1) * step - 1; + int end = (i + 1) * step; List interfaces = l2NetworksCheckList.subList(i * step, Math.min(end, l2NetworksCheckList.size())) .stream() .map(L2NetworkInventory::getPhysicalInterface) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index 4fb4d1e5779..5ad95e7dffa 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -4696,6 +4696,92 @@ public static class SyncIpsetCmd extends AgentCommand { public static class SyncIpsetRsp extends AgentResponse { } + public static class InstallOvsPackageCmd extends AgentCommand { + @GrayVersion(value = "5.4.0") + public String ovnControllerIp; + + public String getOvnControllerIp() { + return ovnControllerIp; + } + + public void setOvnControllerIp(String ovnControllerIp) { + this.ovnControllerIp = ovnControllerIp; + } + } + + public static class InstallOvsPackageRsp extends AgentResponse { + } + + public static class UnInstallOvsPackageCmd extends AgentCommand { + @GrayVersion(value = "5.4.0") + public String ovnControllerIp; + + public String getOvnControllerIp() { + return ovnControllerIp; + } + + public void setOvnControllerIp(String ovnControllerIp) { + this.ovnControllerIp = ovnControllerIp; + } + } + + public static class UnInstallOvsPackageRsp extends AgentResponse { + } + + public static class StartOvsServiceCmd extends AgentCommand { + @GrayVersion(value = "5.4.0") + public String vSwitchType; + @GrayVersion(value = "5.4.0") + public String hostIp; + @GrayVersion(value = "5.4.0") + public Map nicNamePciAddressMap; + @GrayVersion(value = "5.4.0") + public Map nicNameDriverMap; + @GrayVersion(value = "5.4.0") + public String brExName; + @GrayVersion(value = "5.4.0") + public String ovnRemoteConnection; + @GrayVersion(value = "5.4.0") + public String ovnEncapIP; + @GrayVersion(value = "5.4.0") + public String ovnEncapNetmask; + @GrayVersion(value = "5.4.0") + public String ovnEncapType; + @GrayVersion(value = "5.4.0") + public Integer hugePageNumber; + @GrayVersion(value = "5.4.0") + public String bondingMode; + @GrayVersion(value = "5.4.0") + public String lacpMode; + } + + public static class StartOvsServiceRsp extends AgentResponse { + } + + public static class OvsAddPortCmd extends AgentCommand { + @GrayVersion(value = "5.4.0") + public String vSwitchType; + @GrayVersion(value = "5.4.0") + public Boolean sync; + @GrayVersion(value = "5.4.0") + public Boolean reInstall; + @GrayVersion(value = "5.4.0") + public Map nicMap = new HashMap<>(); + } + + public static class OvsAddPortRsp extends AgentResponse { + } + + public static class OvsDelPortCmd extends AgentCommand { + @GrayVersion(value = "5.4.0") + public String vswitchType; + @GrayVersion(value = "5.4.0") + public Map nicMap = new HashMap<>(); + } + + public static class OvsDelPortRsp extends AgentResponse { + } + public static class HardwareMonitorCmd extends KVMAgentCommands.AgentCommand { } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java index 7f5b17075d6..334f4d6b767 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java @@ -36,6 +36,12 @@ public interface KVMConstant { String KVM_DELETE_VDPA_PATH = "/network/ovsdpdk/deletevdpa"; String KVM_GENERATE_VHOST_USER_CLIENT_PATH = "/network/ovsdpdk/addvhostuserclient"; String KVM_DELETE_VHOST_USER_CLIENT_PATH = "/network/ovsdpdk/deletevhostuserclient"; + String KVM_INSTALL_OVS_PACKAGE_PATH = "/network/ovn/install"; + String KVM_UNINSTALL_OVS_PACKAGE_PATH = "/network/ovn/uninstall"; + String KVM_START_OVS_SERVICE_PATH = "/network/ovn/start"; + String KVM_STOP_OVS_SERVICE_PATH = "/network/ovn/stop"; + String KVM_OVS_ADD_PORT_PATH = "/network/ovn/addport"; + String KVM_OVS_DEL_PORT_PATH = "/network/ovn/delport"; String KVM_ATTACH_ISO_PATH = "/vm/iso/attach"; String KVM_DETACH_ISO_PATH = "/vm/iso/detach"; String KVM_SYNC_VM_DEVICEINFO_PATH = "/sync/vm/deviceinfo"; diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 832c1b6d691..02a8ecfe764 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -4085,11 +4085,8 @@ private NicTO completeNicInfo(VmNicInventory nic) { String tagValue = VmSystemTags.CLEAN_TRAFFIC.getTokenByResourceUuid(nic.getVmInstanceUuid(), VmSystemTags.CLEAN_TRAFFIC_TOKEN); to.setCleanTraffic(tagValue == null ? Boolean.FALSE : Boolean.parseBoolean(tagValue)); - String nicType = nic.getType(); - if (!nicType.equals(VmInstanceConstant.VIRTUAL_NIC_TYPE) && - !nicType.equals(VmOvsNicConstant.ACCEL_TYPE_VDPA) && - !nicType.equals(VmOvsNicConstant.ACCEL_TYPE_VHOST_USER_SPACE) && - !nic.getType().equals(VmInstanceConstant.TF_VIRTUAL_NIC_TYPE)) { + VmNicType nicType = VmNicType.valueOf(nic.getType()); + if (!nicType.isHasAddon()) { return to; } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2NoVlanNetworkBackend.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2NoVlanNetworkBackend.java index 57f988fefe2..9ec57078f6e 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2NoVlanNetworkBackend.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2NoVlanNetworkBackend.java @@ -235,6 +235,9 @@ public NicTO completeNicInformation(L2NetworkInventory l2Network, L3NetworkInven to.setBridgeName(makeBridgeName(l2Network.getUuid())); to.setPhysicalInterface(l2Network.getPhysicalInterface()); to.setMtu(new MtuGetter().getMtu(l3Network.getUuid())); + if (l2Network.getvSwitchType().equals(L2NetworkConstant.VSWITCH_TYPE_OVN_DPDK)) { + to.setSrcPath(L2NetworkConstant.OVN_DPDK_VNIC_SRC_PATH + nic.getInternalName()); + } return to; } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2VlanNetworkBackend.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2VlanNetworkBackend.java index cc9e8332237..15c0214c538 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2VlanNetworkBackend.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2VlanNetworkBackend.java @@ -248,6 +248,9 @@ public NicTO completeNicInformation(L2NetworkInventory l2Network, L3NetworkInven to.setMetaData(String.valueOf(vlanId)); to.setMtu(new MtuGetter().getMtu(l3Network.getUuid())); to.setVlanId(String.valueOf(vlanId)); + if (l2Network.getvSwitchType().equals(L2NetworkConstant.VSWITCH_TYPE_OVN_DPDK)) { + to.setSrcPath(L2NetworkConstant.OVN_DPDK_VNIC_SRC_PATH + nic.getInternalName()); + } return to; } diff --git a/plugin/sdnController/pom.xml b/plugin/sdnController/pom.xml index ebd31ef11e2..3d1a88f9e6d 100644 --- a/plugin/sdnController/pom.xml +++ b/plugin/sdnController/pom.xml @@ -42,6 +42,11 @@ vxlan ${project.version} + + org.zstack + hostNetworkInterface + ${project.version} + diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java index c4e4aac4494..4200ce867d1 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java @@ -1,15 +1,17 @@ package org.zstack.sdnController; import org.zstack.header.core.Completion; -import org.zstack.header.identity.AccountInventory; -import org.zstack.header.network.l2.L2NetworkVO; -import org.zstack.header.network.l3.*; +import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.vm.VmNicInventory; import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; import org.zstack.sdnController.header.*; +import java.util.ArrayList; import java.util.List; public interface SdnController { + + void handleMessage(SdnControllerMessage msg); /* 有关sdn控制器的前置检查: pre-event 对sdn控制器的控制: event @@ -17,10 +19,10 @@ public interface SdnController { */ void preInitSdnController(APIAddSdnControllerMsg msg, Completion completion); void initSdnController(APIAddSdnControllerMsg msg, Completion completion); - void postInitSdnController(APIAddSdnControllerMsg msg, Completion completion); + void postInitSdnController(SdnControllerVO vo, Completion completion); void preCreateVxlanNetwork(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); - void createVxlanNetwork(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); + void createL2Network(L2NetworkInventory inv, List systemTags, Completion completion); void postCreateVxlanNetwork(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); void preAttachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); @@ -29,8 +31,18 @@ public interface SdnController { void deleteSdnController(SdnControllerDeletionMsg msg, SdnControllerInventory sdn, Completion completion); void detachL2NetworkFromCluster(L2VxlanNetworkInventory vxlan, String clusterUuid, Completion completion); - void deleteVxlanNetwork(L2VxlanNetworkInventory vxlan, Completion completion); + void deleteL2Network(L2NetworkInventory inv, Completion completion); List getVniRange(SdnControllerInventory controller); List getVlanRange(SdnControllerInventory controller); + + default List getL2NetworkOfSdnController() { return new ArrayList<>();}; + + default void addHost(APISdnControllerAddHostMsg msg, Completion completion) {completion.success();}; + default void removeHost(SdnControllerRemoveHostMsg msg, Completion completion) {completion.success();}; + + default void changeHost(SdnControllerHostRefVO oldRef, SdnControllerHostRefVO newRef, Completion completion) {completion.success();}; + + default void addLogicalPorts(List nics, Completion completion) {completion.success();}; + default void removeLogicalPorts(List nics, Completion completion) {completion.success();}; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java index d39399a97df..975d96074e4 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java @@ -1,20 +1,27 @@ package org.zstack.sdnController; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; import org.zstack.header.apimediator.ApiMessageInterceptionException; import org.zstack.header.apimediator.ApiMessageInterceptor; import org.zstack.header.apimediator.GlobalApiMessageInterceptor; import org.zstack.header.message.APIMessage; import org.zstack.header.network.l2.APIAttachL2NetworkToClusterMsg; +import org.zstack.header.network.l2.L2NetworkConstant; import org.zstack.network.l2.vxlan.vxlanNetwork.APICreateL2VxlanNetworkMsg; import org.zstack.sdnController.header.*; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; +import org.zstack.utils.network.NetworkUtils; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; +import java.util.Map; import static org.zstack.core.Platform.argerr; @@ -57,6 +64,12 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti validate((APIAttachL2NetworkToClusterMsg)msg); } else if (msg instanceof APIAddSdnControllerMsg) { validate((APIAddSdnControllerMsg)msg); + } else if (msg instanceof APISdnControllerAddHostMsg) { + validate((APISdnControllerAddHostMsg)msg); + } else if (msg instanceof APISdnControllerRemoveHostMsg) { + validate((APISdnControllerRemoveHostMsg)msg); + } else if (msg instanceof APISdnControllerChangeHostMsg) { + validate((APISdnControllerChangeHostMsg)msg); } setServiceId(msg); @@ -74,5 +87,72 @@ private void validate(APIAddSdnControllerMsg msg) { if (!SdnControllerType.getAllTypeNames().contains(msg.getVendorType())) { throw new ApiMessageInterceptionException(argerr("Sdn controller type: %s in not in the supported list: %s ", msg.getVendorType(), SdnControllerType.getAllTypeNames())); } + + if (!NetworkUtils.isUnicastIPAddress(msg.getIp())) { + throw new ApiMessageInterceptionException(argerr("Sdn controller ip[%s] is not an unicast address ", msg.getIp())); + } + + boolean existed = Q.New(SdnControllerVO.class).eq(SdnControllerVO_.ip, msg.getIp()).isExists(); + if (existed) { + throw new ApiMessageInterceptionException(argerr("Sdn controller with ip [%s] is already added ", msg.getIp())); + } + } + + private void validate(APISdnControllerAddHostMsg msg) { + if (Q.New(SdnControllerHostRefVO.class) + .eq(SdnControllerHostRefVO_.vSwitchType, msg.getvSwitchType()) + .eq(SdnControllerHostRefVO_.hostUuid, msg.getHostUuid()).isExists()) { + throw new ApiMessageInterceptionException(argerr("could not add host[uuid:%s] to sdn controller[uuid:%s], " + + " because host already add to sdn controller", msg.getHostUuid(), msg.getSdnControllerUuid())); + } + + if (msg.getVtepIp() != null && msg.getNetmask() == null) { + throw new ApiMessageInterceptionException(argerr("could not add host[uuid:%s] to sdn controller[uuid:%s], " + + " because netmask is specified", msg.getHostUuid(), msg.getSdnControllerUuid())); + } + + if (msg.getNicNames().size() > 1 && msg.getBondMode() == null) { + msg.setBondMode(L2NetworkConstant.BONDING_MODE_AB); + } + + if (msg.getBondMode() != null && msg.getLacpMode() == null) { + msg.setLacpMode(L2NetworkConstant.LACP_MODE_OFF); + } } + + private void validate(APISdnControllerRemoveHostMsg msg) { + if (!Q.New(SdnControllerHostRefVO.class) + .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .eq(SdnControllerHostRefVO_.hostUuid, msg.getHostUuid()).isExists()) { + throw new ApiMessageInterceptionException(argerr("could not remove host[uuid:%s] from sdn controller[uuid:%s], " + + " because host has not been added to sdn controller", msg.getHostUuid(), msg.getSdnControllerUuid())); + } + } + + private void validate(APISdnControllerChangeHostMsg msg) { + SdnControllerHostRefVO refVO = Q.New(SdnControllerHostRefVO.class) + .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .eq(SdnControllerHostRefVO_.hostUuid, msg.getHostUuid()).find(); + if (refVO == null) { + throw new ApiMessageInterceptionException(argerr("could not change host[uuid:%s] of sdn controller[uuid:%s], " + + " because host has not been added to sdn controller", msg.getHostUuid(), msg.getSdnControllerUuid())); + } + + if (msg.getVtepIp() != null && msg.getNetmask() == null) { + throw new ApiMessageInterceptionException(argerr("could not change host[uuid:%s] of sdn controller[uuid:%s], " + + " because netmask is specified", msg.getHostUuid(), msg.getSdnControllerUuid())); + } + + if (msg.getNicNames() == null) { + Gson gson = new Gson(); + Type type = new TypeToken>(){}.getType(); + Map nicNamePciAddressMap = gson.fromJson(refVO.getNicPciAddresses(), type); + msg.setNicNames(new ArrayList<>(nicNamePciAddressMap.keySet())); + } + + if (msg.getNicNames().size() > 1 && msg.getBondMode() == null) { + msg.setBondMode(refVO.getBondMode()); + } + } + } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerCascadeExtension.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerCascadeExtension.java index 265cae7f79e..571d1b52f69 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerCascadeExtension.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerCascadeExtension.java @@ -9,16 +9,16 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; import org.zstack.header.core.Completion; import org.zstack.header.core.WhileDoneCompletion; import org.zstack.header.errorcode.ErrorCodeList; +import org.zstack.header.host.HostInventory; +import org.zstack.header.host.HostVO; import org.zstack.header.identity.AccountInventory; import org.zstack.header.identity.AccountVO; import org.zstack.header.message.MessageReply; -import org.zstack.sdnController.header.SdnControllerConstant; -import org.zstack.sdnController.header.SdnControllerDeletionMsg; -import org.zstack.sdnController.header.SdnControllerInventory; -import org.zstack.sdnController.header.SdnControllerVO; +import org.zstack.sdnController.header.*; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.function.Function; @@ -59,6 +59,51 @@ private void handleDeletionCleanup(CascadeAction action, Completion completion) } private void handleDeletion(final CascadeAction action, final Completion completion) { + if (HostVO.class.getSimpleName().equals(action.getParentIssuer())) { + List hosts = action.getParentIssuerContext(); + List hostUuids = hosts.stream().map(HostInventory::getUuid).collect(Collectors.toList()); + List refVOS = Q.New(SdnControllerHostRefVO.class) + .in(SdnControllerHostRefVO_.hostUuid, hostUuids).list(); + if (refVOS.isEmpty()) { + completion.success(); + return; + } + + List msgs = new ArrayList<>(); + for (SdnControllerHostRefVO ref : refVOS) { + SdnControllerRemoveHostMsg msg = new SdnControllerRemoveHostMsg(); + msg.setSdnControllerUuid(ref.getSdnControllerUuid()); + msg.setHostUuid(ref.getHostUuid()); + msg.setvSwitchType(ref.getvSwitchType()); + bus.makeTargetServiceIdByResourceUuid(msg, SdnControllerConstant.SERVICE_ID, ref.getSdnControllerUuid()); + msgs.add(msg); + } + + new While<>(msgs).each((msg, wcomp) -> { + bus.send(msg, new CloudBusCallBack(wcomp) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.debug(String.format("delete host [uuid:%s] from sdn controller[uuid:%s] failed, error:%s", + msg.getHostUuid(), msg.getSdnControllerUuid(), reply.getError().getDetails())); + } + wcomp.done(); + } + }); + }).run(new WhileDoneCompletion(completion) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().isEmpty()) { + completion.success(); + } else { + completion.fail(errorCodeList.getCauses().get(0)); + } + } + }); + + return; + } + final List sdnControllers = sdnControllerFromAction(action); if (sdnControllers == null) { completion.success(); @@ -100,7 +145,10 @@ private void handleDeletionCheck(CascadeAction action, Completion completion) { @Override public List getEdgeNames() { - return Arrays.asList(AccountVO.class.getSimpleName()); + List ret = new ArrayList<>(); + ret.add(AccountVO.class.getSimpleName()); + ret.add(HostVO.class.getSimpleName()); + return ret; } @Override diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerFactory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerFactory.java index a6771f22749..65ce236dfbb 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerFactory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerFactory.java @@ -1,9 +1,16 @@ package org.zstack.sdnController; +import org.zstack.core.workflow.FlowChainBuilder; +import org.zstack.header.core.workflow.FlowChain; +import org.zstack.header.network.l2.L2NetworkInventory; import org.zstack.sdnController.header.SdnControllerVO; public interface SdnControllerFactory { SdnControllerType getVendorType(); SdnController getSdnController(SdnControllerVO vo); + + default SdnController getSdnController(String l2NetworkUuid) {return null;}; + + default FlowChain getSyncChain() {return FlowChainBuilder.newSimpleFlowChain();}; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java index 059e781ecb4..ed6a14bef5f 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java @@ -1,5 +1,7 @@ package org.zstack.sdnController; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.Platform; import org.zstack.core.asyncbatch.While; @@ -10,6 +12,7 @@ import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; +import org.zstack.core.db.SQL; import org.zstack.core.thread.ChainTask; import org.zstack.core.thread.SyncTaskChain; import org.zstack.core.thread.ThreadFacade; @@ -17,6 +20,7 @@ import org.zstack.core.workflow.ShareFlow; import org.zstack.header.AbstractService; import org.zstack.header.core.Completion; +import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.core.WhileDoneCompletion; import org.zstack.header.core.NopeCompletion; import org.zstack.header.core.workflow.*; @@ -26,20 +30,31 @@ import org.zstack.header.message.APIDeleteMessage; import org.zstack.header.message.Message; import org.zstack.header.message.MessageReply; +import org.zstack.header.network.NetworkException; import org.zstack.header.network.l2.*; +import org.zstack.header.network.l3.L3NetworkInventory; +import org.zstack.header.network.l3.L3NetworkVO; +import org.zstack.header.vm.*; +import org.zstack.network.hostNetworkInterface.HostNetworkInterfaceVO; +import org.zstack.network.hostNetworkInterface.HostNetworkInterfaceVO_; import org.zstack.sdnController.header.*; import org.zstack.tag.TagManager; import org.zstack.utils.Utils; +import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import javax.persistence.Tuple; +import java.lang.reflect.Type; +import java.util.*; import static java.util.Arrays.asList; +import static org.zstack.core.Platform.operr; +import static org.zstack.sdnController.header.SdnControllerFlowDataParam.*; -public class SdnControllerManagerImpl extends AbstractService implements SdnControllerManager { +public class SdnControllerManagerImpl extends AbstractService implements SdnControllerManager, + L2NetworkCreateExtensionPoint, L2NetworkDeleteExtensionPoint, InstantiateResourceOnAttachingNicExtensionPoint, + PreVmInstantiateResourceExtensionPoint, VmReleaseResourceExtensionPoint, + ReleaseNetworkServiceOnDetachingNicExtensionPoint { private static final CLogger logger = Utils.getLogger(SdnControllerManagerImpl.class); @Autowired @@ -77,9 +92,276 @@ public void handleMessage(Message msg) { handle((APIUpdateSdnControllerMsg) msg); } else if (msg instanceof SdnControllerDeletionMsg) { handle((SdnControllerDeletionMsg) msg); + } else if (msg instanceof APISdnControllerAddHostMsg) { + handle((APISdnControllerAddHostMsg) msg); + } else if (msg instanceof APISdnControllerRemoveHostMsg) { + handle((APISdnControllerRemoveHostMsg) msg); + } else if (msg instanceof APIReconnectSdnControllerMsg) { + handle((APIReconnectSdnControllerMsg) msg); + } else if (msg instanceof APISdnControllerChangeHostMsg) { + handle((APISdnControllerChangeHostMsg) msg); + } else if (msg instanceof SdnControllerRemoveHostMsg) { + handle((SdnControllerRemoveHostMsg) msg); } } + private void handle(APIReconnectSdnControllerMsg msg) { + APIReconnectSdnControllerEvent event = new APIReconnectSdnControllerEvent(msg.getId()); + sdnControllerSync(msg, new Completion(msg) { + @Override + public void success() { + event.setInventory(SdnControllerInventory.valueOf(dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class))); + bus.publish(event); + } + + @Override + public void fail(ErrorCode errorCode) { + event.setError(errorCode); + bus.publish(event); + } + }); + } + + private void sdnControllerSync(APIReconnectSdnControllerMsg msg, Completion completion) { + SdnControllerVO controllerVO = dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class); + SdnControllerFactory factory = getSdnControllerFactory(controllerVO.getVendorType()); + + FlowChain chain = factory.getSyncChain(); + chain.getData().put(SDN_CONTROLLER_INV, SdnControllerInventory.valueOf(controllerVO)); + chain.setName(String.format("sync-sdn-controller-%s-%s", controllerVO.getUuid(), controllerVO.getName())); + chain.insert(new Flow() { + String __name__ = "change-sdn-controller-status-to-connecting"; + + @Override + public void run(FlowTrigger trigger, Map data) { + controllerVO.setStatus(SdnControllerStatus.Connecting); + trigger.next(); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + controllerVO.setStatus(SdnControllerStatus.Disconnected); + trigger.rollback(); + } + }).then(new NoRollbackFlow() { + String __name__ = "change-sdn-controller-status-to-connected"; + + @Override + public void run(FlowTrigger trigger, Map data) { + controllerVO.setStatus(SdnControllerStatus.Connected); + trigger.next(); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); + } + + private void handle(APISdnControllerAddHostMsg msg) { + APISdnControllerAddHostEvent event = new APISdnControllerAddHostEvent(msg.getId()); + + sdnControllerAddHost(msg, new Completion(msg) { + @Override + public void success() { + SdnControllerHostRefVO ref = new SdnControllerHostRefVO(); + ref.setSdnControllerUuid(msg.getSdnControllerUuid()); + ref.setHostUuid(msg.getHostUuid()); + ref.setvSwitchType(msg.getvSwitchType()); + + Map nicNameDriverMap = new HashMap<>(); + Map nicNamePciAddressMap = new HashMap<>(); + List nicTuples = Q.New(HostNetworkInterfaceVO.class) + .eq(HostNetworkInterfaceVO_.hostUuid, msg.getHostUuid()) + .in(HostNetworkInterfaceVO_.interfaceName, msg.getNicNames()) + .select(HostNetworkInterfaceVO_.interfaceName, + HostNetworkInterfaceVO_.driverType, + HostNetworkInterfaceVO_.pciDeviceAddress) + .listTuple(); + for (Tuple t : nicTuples) { + nicNameDriverMap.put(t.get(0, String.class), t.get(1, String.class)); + nicNamePciAddressMap.put(t.get(0, String.class), t.get(2, String.class)); + } + ref.setNicDrivers(JSONObjectUtil.toJsonString(nicNameDriverMap)); + ref.setNicPciAddresses(JSONObjectUtil.toJsonString(nicNamePciAddressMap)); + if (msg.getVtepIp() != null) { + ref.setVtepIp(msg.getVtepIp()); + } + if (msg.getNetmask() != null) { + ref.setNetmask(msg.getNetmask()); + } + if (msg.getBondMode() != null) { + ref.setBondMode(msg.getBondMode()); + } + if (msg.getLacpMode() != null) { + ref.setLacpMode(msg.getLacpMode()); + } + dbf.persist(ref); + + event.setInventory(SdnControllerInventory.valueOf(dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class))); + bus.publish(event); + } + + @Override + public void fail(ErrorCode errorCode) { + event.setError(errorCode); + bus.publish(event); + } + }); + } + + private void handle(APISdnControllerRemoveHostMsg amsg) { + APISdnControllerRemoveHostEvent event = new APISdnControllerRemoveHostEvent(amsg.getId()); + + SdnControllerRemoveHostMsg msg = SdnControllerRemoveHostMsg.fromApi(amsg); + sdnControllerRemoveHost(msg, new Completion(msg) { + @Override + public void success() { + SQL.New(SdnControllerHostRefVO.class) + .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .eq(SdnControllerHostRefVO_.hostUuid, msg.getHostUuid()) + .eq(SdnControllerHostRefVO_.vSwitchType, msg.getvSwitchType()).delete(); + + event.setInventory(SdnControllerInventory.valueOf(dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class))); + bus.publish(event); + } + + @Override + public void fail(ErrorCode errorCode) { + event.setError(errorCode); + bus.publish(event); + } + }); + } + + private void handle(SdnControllerRemoveHostMsg msg) { + SdnControllerRemoveHostReply reply = new SdnControllerRemoveHostReply(); + + sdnControllerRemoveHost(msg, new Completion(msg) { + @Override + public void success() { + SQL.New(SdnControllerHostRefVO.class) + .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .eq(SdnControllerHostRefVO_.hostUuid, msg.getHostUuid()) + .eq(SdnControllerHostRefVO_.vSwitchType, msg.getvSwitchType()).delete(); + + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } + + private void handle(APISdnControllerChangeHostMsg msg) { + APISdnControllerChangeHostEvent event = new APISdnControllerChangeHostEvent(msg.getId()); + + SdnControllerHostRefVO newRef = Q.New(SdnControllerHostRefVO.class) + .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .eq(SdnControllerHostRefVO_.hostUuid, msg.getHostUuid()).find(); + SdnControllerHostRefVO oldRef = SdnControllerHostRefVO.fromOther(newRef); + + boolean changed = false; + Gson gson = new Gson(); + Type type = new TypeToken>(){}.getType(); + Map nicNamePciAddressMap = gson.fromJson(newRef.getNicPciAddresses(), type); + List oldNicNames = new ArrayList<>(nicNamePciAddressMap.keySet()); + Collections.sort(oldNicNames); + Collections.sort(msg.getNicNames()); + if (!oldNicNames.equals(msg.getNicNames())) { + changed = true; + Map nicNameDriverMap = new HashMap<>(); + nicNamePciAddressMap = new HashMap<>(); + List nicTuples = Q.New(HostNetworkInterfaceVO.class) + .eq(HostNetworkInterfaceVO_.hostUuid, msg.getHostUuid()) + .in(HostNetworkInterfaceVO_.interfaceName, msg.getNicNames()) + .select(HostNetworkInterfaceVO_.interfaceName, + HostNetworkInterfaceVO_.driverType, + HostNetworkInterfaceVO_.pciDeviceAddress) + .listTuple(); + for (Tuple t : nicTuples) { + nicNameDriverMap.put(t.get(0, String.class), t.get(1, String.class)); + nicNamePciAddressMap.put(t.get(0, String.class), t.get(2, String.class)); + } + newRef.setNicDrivers(JSONObjectUtil.toJsonString(nicNameDriverMap)); + newRef.setNicPciAddresses(JSONObjectUtil.toJsonString(nicNamePciAddressMap)); + } + + if (msg.getVtepIp() != null && !msg.getVtepIp().equals(newRef.getVtepIp())) { + changed = true; + newRef.setVtepIp(msg.getVtepIp()); + } + + if (msg.getNetmask() != null && !msg.getNetmask().equals(newRef.getNetmask())) { + changed = true; + newRef.setNetmask(msg.getNetmask()); + } + + if (msg.getBondMode() != null && !msg.getBondMode().equals(newRef.getBondMode())) { + changed = true; + newRef.setBondMode(msg.getBondMode()); + } + + if (msg.getLacpMode() != null && !msg.getLacpMode().equals(newRef.getLacpMode())) { + changed = true; + newRef.setLacpMode(msg.getLacpMode()); + } + + if (!changed) { + event.setInventory(SdnControllerInventory.valueOf(dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class))); + bus.publish(event); + return; + } + + sdnControllerChangeHost(oldRef, newRef, new Completion(msg) { + @Override + public void success() { + dbf.update(newRef); + event.setInventory(SdnControllerInventory.valueOf(dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class))); + bus.publish(event); + } + + @Override + public void fail(ErrorCode errorCode) { + event.setError(errorCode); + bus.publish(event); + } + }); + } + + private void sdnControllerAddHost(APISdnControllerAddHostMsg msg, Completion completion) { + SdnControllerVO controllerVO = dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class); + SdnControllerFactory factory = getSdnControllerFactory(controllerVO.getVendorType()); + SdnController controller = factory.getSdnController(controllerVO); + + controller.addHost(msg, completion); + } + + private void sdnControllerChangeHost(SdnControllerHostRefVO oldref, SdnControllerHostRefVO newRef, Completion completion) { + SdnControllerVO controllerVO = dbf.findByUuid(oldref.getSdnControllerUuid(), SdnControllerVO.class); + SdnControllerFactory factory = getSdnControllerFactory(controllerVO.getVendorType()); + SdnController controller = factory.getSdnController(controllerVO); + + controller.changeHost(oldref, newRef, completion); + } + + private void sdnControllerRemoveHost(SdnControllerRemoveHostMsg msg, Completion completion) { + SdnControllerVO controllerVO = dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class); + SdnControllerFactory factory = getSdnControllerFactory(controllerVO.getVendorType()); + SdnController controller = factory.getSdnController(controllerVO); + + controller.removeHost(msg, completion); + } + private void doDeletionSdnController(SdnControllerDeletionMsg msg, Completion completion) { SdnControllerVO vo = dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class); SdnControllerInventory sdn = SdnControllerInventory.valueOf(vo); @@ -96,7 +378,7 @@ private void doDeletionSdnController(SdnControllerDeletionMsg msg, Completion co public void run(FlowTrigger trigger, Map data) { List poolVos = Q.New(HardwareL2VxlanNetworkPoolVO.class) .eq(HardwareL2VxlanNetworkPoolVO_.sdnControllerUuid, msg.getSdnControllerUuid()).list(); - new While<>(poolVos).all((pool, wcomp) -> { + new While<>(poolVos).each((pool, wcomp) -> { DeleteL2NetworkMsg msg = new DeleteL2NetworkMsg(); msg.setUuid(pool.getUuid()); bus.makeTargetServiceIdByResourceUuid(msg, L2NetworkConstant.SERVICE_ID, pool.getUuid()); @@ -116,6 +398,80 @@ public void done(ErrorCodeList errorCodeList) { } }); } + }).then(new NoRollbackFlow() { + String __name__ = "delete-sdn-network"; + + @Override + public void run(FlowTrigger trigger, Map data) { + List l2Uuids = controller.getL2NetworkOfSdnController(); + if (l2Uuids.isEmpty()) { + trigger.next(); + return; + } + + new While<>(l2Uuids).step((uuid, wcomp) -> { + DeleteL2NetworkMsg msg = new DeleteL2NetworkMsg(); + msg.setUuid(uuid); + bus.makeTargetServiceIdByResourceUuid(msg, L2NetworkConstant.SERVICE_ID, uuid); + bus.send(msg, new CloudBusCallBack(wcomp) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.info(String.format("delete sdn l2 network[uuid:%s] failed, reason:%s", uuid, reply.getError().getDetails())); + } + wcomp.done(); + } + }); + }, 5).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().isEmpty()) { + trigger.next(); + } else { + trigger.fail(errorCodeList.getCauses().get(0)); + } + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = "remove-host-from-sdn-controller"; + @Override + public void run(FlowTrigger trigger, Map data) { + List refVOS = Q.New(SdnControllerHostRefVO.class) + .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .list(); + if (refVOS.isEmpty()) { + trigger.next(); + return; + } + + new While<>(refVOS).step((ref, wcomp) -> { + SdnControllerRemoveHostMsg msg = new SdnControllerRemoveHostMsg(); + msg.setSdnControllerUuid(ref.getSdnControllerUuid()); + msg.setHostUuid(ref.getHostUuid()); + msg.setvSwitchType(ref.getvSwitchType()); + bus.makeTargetServiceIdByResourceUuid(msg, SdnControllerConstant.SERVICE_ID, ref.getSdnControllerUuid()); + bus.send(msg, new CloudBusCallBack(wcomp) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.debug(String.format("delete host [uuid:%s] from sdn controller[uuid:%s] failed, error:%s", + msg.getHostUuid(), msg.getSdnControllerUuid(), reply.getError().getDetails())); + } + wcomp.done(); + } + }); + }, 5).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().isEmpty()) { + trigger.next(); + } else { + trigger.fail(errorCodeList.getCauses().get(0)); + } + } + }); + } }).then(new NoRollbackFlow() { String __name__ = String.format("delete-sdn-controller-%s", vo.getName()); @@ -181,7 +537,7 @@ public void fail(ErrorCode errorCode) { @Override public String getName() { - return String.format("attach-sdn-controller-%s", msg.getSdnControllerUuid()); + return String.format("delete-sdn-controller-%s", msg.getSdnControllerUuid()); } }); } @@ -235,16 +591,16 @@ public void rollback(FlowRollback trigger, Map data) { @Override public void run(FlowTrigger trigger, Map data) { - controller.initSdnController(msg, new Completion(completion) { + controller.initSdnController(msg, new Completion(trigger) { @Override public void success() { - completion.success(); + trigger.next(); } @Override public void fail(ErrorCode errorCode) { dbf.removeByPrimaryKey(vo.getUuid(), SdnControllerVO.class); - completion.fail(errorCode); + trigger.fail(errorCode); } }); } @@ -259,7 +615,7 @@ public void rollback(FlowRollback trigger, Map data) { @Override public void run(FlowTrigger trigger, Map data) { - controller.postInitSdnController(msg, new Completion(trigger) { + controller.postInitSdnController(vo, new Completion(trigger) { @Override public void success() { trigger.next(); @@ -305,6 +661,7 @@ private void handle(APIAddSdnControllerMsg msg) { vo.setUsername(msg.getUserName()); vo.setPassword(msg.getPassword()); vo.setAccountUuid(msg.getSession().getAccountUuid()); + vo.setStatus(SdnControllerStatus.Connected); doCreateSdnController(vo, msg, new Completion(msg) { @Override @@ -419,6 +776,429 @@ private void handle(APIUpdateSdnControllerMsg msg) { bus.publish(event); } + @Override + public void beforeCreateL2Network(APICreateL2NetworkMsg msg) throws NetworkException { + + } + + @Override + public void postCreateL2Network(L2NetworkInventory l2Network, APICreateL2NetworkMsg msg, Completion completion) { + VSwitchType vSwitchType = VSwitchType.valueOf(l2Network.getvSwitchType()); + if (vSwitchType.getSdnControllerType() == null) { + completion.success(); + return; + } + + String sdnControllerUuid = null; + for (String systag : msg.getSystemTags()) { + if (SdnControllerSystemTags.L2_NETWORK_OVN_UUID.isMatch(systag)) { + sdnControllerUuid = SdnControllerSystemTags.L2_NETWORK_OVN_UUID.getTokenByTag( + systag, SdnControllerSystemTags.L2_NETWORK_OVN_UUID_TOKEN); + } + } + + if (sdnControllerUuid == null) { + completion.fail(operr("can not create sdn l2 network because there is not sdn controller uuid in api message")); + return; + } + + SdnControllerVO vo = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); + if (vo == null) { + completion.fail(operr("can not found sdn controller for l2 network[uuid:%s, vswitchType:%s]", + l2Network.getUuid(), l2Network.getvSwitchType())); + return; + } + + SdnControllerFactory factory = getSdnControllerFactory(vo.getVendorType()); + SdnController controller = factory.getSdnController(vo); + controller.createL2Network(l2Network, msg.getSystemTags(), completion); + } + + @Override + public void afterCreateL2Network(L2NetworkInventory l2Network) { + + } + + @Override + public void preDeleteL2Network(L2NetworkInventory inventory) throws L2NetworkException { + + } + + @Override + public void beforeDeleteL2Network(L2NetworkInventory inventory) { + + } + + @Override + public void deleteL2Network(L2NetworkInventory inv, NoErrorCompletion completion) { + VSwitchType vSwitchType = VSwitchType.valueOf(inv.getvSwitchType()); + if (vSwitchType.getSdnControllerType() == null) { + completion.done(); + return; + } + + /* vswitch type: OvnDpdk will go here */ + SdnControllerFactory factory = getSdnControllerFactory(vSwitchType.getSdnControllerType()); + SdnController controller = factory.getSdnController(inv.getUuid()); + if (controller == null) { + logger.warn(String.format("can not found sdn controller for l2 network[uuid:%s, vswitchType:%s]", + inv.getUuid(), inv.getvSwitchType())); + completion.done(); + return; + } + + controller.deleteL2Network(inv, new Completion(completion) { + @Override + public void success() { + completion.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + logger.warn(String.format("can not found sdn controller for l2 network[uuid:%s, vswitchType:%s]", + inv.getUuid(), inv.getvSwitchType())); + completion.done(); + } + }); + } + + @Override + public void afterDeleteL2Network(L2NetworkInventory inventory) { + + } + + void addOvnLogicalPorts(String sdnControllerUuid, List nics, Completion completion) { + SdnControllerVO vo = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); + SdnControllerFactory factory = getSdnControllerFactory(vo.getVendorType()); + if (factory == null) { + completion.fail(operr("there is no sdn controller factory for sdn controller type:%s", vo.getVendorType())); + return; + } + + SdnController controller = factory.getSdnController(vo); + controller.addLogicalPorts(nics, completion); + } + + void addOvnLogicalPort(Map> nicMaps, Completion completion) { + new While<>(nicMaps.entrySet()).each((e, wcomp) -> { + addOvnLogicalPorts(e.getKey(), e.getValue(), new Completion(wcomp) { + @Override + public void success() { + wcomp.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + wcomp.addError(errorCode); + wcomp.allDone(); + } + }); + }).run(new WhileDoneCompletion(completion) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().isEmpty()) { + completion.success(); + } else { + completion.fail(errorCodeList.getCauses().get(0)); + } + } + }); + } + + void removeOvnLogicalPorts(String controllerUuid, List nics, Completion completion) { + SdnControllerVO vo = dbf.findByUuid(controllerUuid, SdnControllerVO.class); + SdnControllerFactory factory = getSdnControllerFactory(vo.getVendorType()); + if (factory == null) { + completion.fail(operr("there is no sdn controller factory for sdn controller type:%s", vo.getVendorType())); + return; + } + + SdnController controller = factory.getSdnController(vo); + controller.removeLogicalPorts(nics, completion); + } + + void removeLogicalPort(Map> nicMaps, Completion completion) { + new While<>(nicMaps.entrySet()).each((e, wcomp) -> { + removeOvnLogicalPorts(e.getKey(), e.getValue(), new Completion(wcomp) { + @Override + public void success() { + wcomp.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + wcomp.addError(errorCode); + wcomp.allDone(); + } + }); + }).run(new WhileDoneCompletion(completion) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().isEmpty()) { + completion.success(); + } else { + completion.fail(errorCodeList.getCauses().get(0)); + } + } + }); + } + + @Override + public void releaseVmResource(VmInstanceSpec spec, Completion completion) { + if (VmInstanceConstant.VmOperation.DetachNic != spec.getCurrentVmOperation() && + VmInstanceConstant.VmOperation.Destroy != spec.getCurrentVmOperation()) { + completion.success(); + return; + } + + if (spec.getL3Networks() == null || spec.getL3Networks().isEmpty()) { + completion.success(); + return; + } + + // we run into this situation when VM nics are all detached and the + // VM is being rebooted + if (spec.getDestNics().isEmpty()) { + completion.success(); + return; + } + + Map> nicMaps = new HashMap<>(); + for (VmNicInventory nic : spec.getDestNics()) { + L3NetworkVO l3Vo = dbf.findByUuid(nic.getL3NetworkUuid(), L3NetworkVO.class); + if (l3Vo == null) { + continue; + } + + L2NetworkVO l2VO = dbf.findByUuid(l3Vo.getL2NetworkUuid(), L2NetworkVO.class); + if (l2VO == null) { + continue; + } + + VSwitchType vSwitchType = VSwitchType.valueOf(l2VO.getvSwitchType()); + if (vSwitchType.getSdnControllerType() == null) { + continue; + } + + String controllerUuid = SdnControllerSystemTags.L2_NETWORK_OVN_UUID.getTokenByResourceUuid( + l2VO.getUuid(), SdnControllerSystemTags.L2_NETWORK_OVN_UUID_TOKEN); + if (controllerUuid == null) { + completion.fail(operr("sdn l2 network[uuid:%s] is not attached controller", l2VO.getUuid())); + return; + } + + nicMaps.computeIfAbsent(controllerUuid, k -> new ArrayList<>()).add(nic); + } + + if (nicMaps.isEmpty()) { + completion.success(); + return; + } + + removeLogicalPort(nicMaps, completion); + } + + @Override + public void instantiateResourceOnAttachingNic(VmInstanceSpec spec, L3NetworkInventory l3, Completion completion) { + L2NetworkVO l2NetworkVO = dbf.findByUuid(l3.getL2NetworkUuid(), L2NetworkVO.class); + VSwitchType vSwitchType = VSwitchType.valueOf(l2NetworkVO.getvSwitchType()); + if (vSwitchType.getSdnControllerType() == null) { + completion.success(); + return; + } + + String controllerUuid = SdnControllerSystemTags.L2_NETWORK_OVN_UUID.getTokenByResourceUuid( + l2NetworkVO.getUuid(), SdnControllerSystemTags.L2_NETWORK_OVN_UUID_TOKEN); + if (controllerUuid == null) { + completion.fail(operr("sdn l2 network[uuid:%s] is not attached controller", l2NetworkVO.getUuid())); + return; + } + + Map> nicMaps = new HashMap<>(); + List nics = new ArrayList<>(); + nics.add(spec.getDestNics().get(0)); + nicMaps.put(controllerUuid, nics); + addOvnLogicalPort(nicMaps, completion); + } + + @Override + public void releaseResourceOnAttachingNic(VmInstanceSpec spec, L3NetworkInventory l3, NoErrorCompletion completion) { + L2NetworkVO l2NetworkVO = dbf.findByUuid(l3.getL2NetworkUuid(), L2NetworkVO.class); + VSwitchType vSwitchType = VSwitchType.valueOf(l2NetworkVO.getvSwitchType()); + if (vSwitchType.getSdnControllerType() == null) { + completion.done(); + return; + } + + String controllerUuid = SdnControllerSystemTags.L2_NETWORK_OVN_UUID.getTokenByResourceUuid( + l2NetworkVO.getUuid(), SdnControllerSystemTags.L2_NETWORK_OVN_UUID_TOKEN); + if (controllerUuid == null) { + logger.warn(String.format("sdn l2 network[uuid:%s] is not attached controller", l2NetworkVO.getUuid())); + completion.done(); + return; + } + + Map> nicMaps = new HashMap<>(); + List nics = new ArrayList<>(); + nics.add(spec.getDestNics().get(0)); + nicMaps.put(controllerUuid, nics); + + removeLogicalPort(nicMaps, new Completion(completion) { + @Override + public void success() { + completion.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + logger.info(String.format("failed to remove logical port for vm[uuid:%s] nic[internalName:%s], because: %s", + spec.getVmInventory().getUuid(), spec.getDestNics().get(0).getInternalName(), errorCode.getDetails())); + completion.done(); + } + }); + } + + @Override + public void releaseResourceOnDetachingNic(VmInstanceSpec spec, VmNicInventory nic, NoErrorCompletion completion) { + L3NetworkVO l3Vo = dbf.findByUuid(nic.getL3NetworkUuid(), L3NetworkVO.class); + L2NetworkVO l2NetworkVO = dbf.findByUuid(l3Vo.getL2NetworkUuid(), L2NetworkVO.class); + VSwitchType vSwitchType = VSwitchType.valueOf(l2NetworkVO.getvSwitchType()); + if (vSwitchType.getSdnControllerType() == null) { + completion.done(); + return; + } + + String controllerUuid = SdnControllerSystemTags.L2_NETWORK_OVN_UUID.getTokenByResourceUuid( + l2NetworkVO.getUuid(), SdnControllerSystemTags.L2_NETWORK_OVN_UUID_TOKEN); + if (controllerUuid == null) { + logger.warn(String.format("sdn l2 network[uuid:%s] is not attached controller", l2NetworkVO.getUuid())); + completion.done(); + return; + } + + Map> nicMaps = new HashMap<>(); + List nics = new ArrayList<>(); + nics.add(spec.getDestNics().get(0)); + nicMaps.put(controllerUuid, nics); + + removeLogicalPort(nicMaps, new Completion(completion) { + @Override + public void success() { + completion.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + logger.info(String.format("failed to remove logical port for vm[uuid:%s] nic[internalName:%s], because: %s", + spec.getVmInventory().getUuid(), spec.getDestNics().get(0).getInternalName(), errorCode.getDetails())); + completion.done(); + } + }); + } + + @Override + public void preBeforeInstantiateVmResource(VmInstanceSpec spec) throws VmInstantiateResourceException { + + } + + @Override + public void preInstantiateVmResource(VmInstanceSpec spec, Completion completion) { + if (spec.getL3Networks() == null || spec.getL3Networks().isEmpty()) { + completion.success(); + return; + } + + // we run into this situation when VM nics are all detached and the + // VM is being rebooted + if (spec.getDestNics().isEmpty()) { + completion.success(); + return; + } + + Map> nicMaps = new HashMap<>(); + for (VmNicInventory nic : spec.getDestNics()) { + L3NetworkVO l3Vo = dbf.findByUuid(nic.getL3NetworkUuid(), L3NetworkVO.class); + if (l3Vo == null) { + continue; + } + + L2NetworkVO l2VO = dbf.findByUuid(l3Vo.getL2NetworkUuid(), L2NetworkVO.class); + if (l2VO == null) { + continue; + } + + VSwitchType vSwitchType = VSwitchType.valueOf(l2VO.getvSwitchType()); + if (vSwitchType.getSdnControllerType() ==null) { + continue; + } + + String controllerUuid = SdnControllerSystemTags.L2_NETWORK_OVN_UUID.getTokenByResourceUuid( + l2VO.getUuid(), SdnControllerSystemTags.L2_NETWORK_OVN_UUID_TOKEN); + if (controllerUuid == null) { + completion.fail(operr("sdn l2 network[uuid:%s] is not attached controller", l2VO.getUuid())); + return; + } + + nicMaps.computeIfAbsent(controllerUuid, k -> new ArrayList<>()).add(nic); + } + + if (nicMaps.isEmpty()) { + completion.success(); + return; + } + + addOvnLogicalPort(nicMaps, completion); + } + + @Override + public void preReleaseVmResource(VmInstanceSpec spec, Completion completion) { + if (spec.getL3Networks() == null || spec.getL3Networks().isEmpty()) { + completion.success(); + return; + } + + // we run into this situation when VM nics are all detached and the + // VM is being rebooted + if (spec.getDestNics().isEmpty()) { + completion.success(); + return; + } + + Map> nicMaps = new HashMap<>(); + for (VmNicInventory nic : spec.getDestNics()) { + L3NetworkVO l3Vo = dbf.findByUuid(nic.getL3NetworkUuid(), L3NetworkVO.class); + if (l3Vo == null) { + continue; + } + + L2NetworkVO l2VO = dbf.findByUuid(l3Vo.getL2NetworkUuid(), L2NetworkVO.class); + if (l2VO == null) { + continue; + } + + VSwitchType vSwitchType = VSwitchType.valueOf(l2VO.getvSwitchType()); + if (vSwitchType.getSdnControllerType() ==null) { + continue; + } + + String controllerUuid = SdnControllerSystemTags.L2_NETWORK_OVN_UUID.getTokenByResourceUuid( + l2VO.getUuid(), SdnControllerSystemTags.L2_NETWORK_OVN_UUID_TOKEN); + if (controllerUuid == null) { + completion.fail(operr("sdn l2 network[uuid:%s] is not attached controller", l2VO.getUuid())); + return; + } + + nicMaps.computeIfAbsent(controllerUuid, k -> new ArrayList<>()).add(nic); + } + + if (nicMaps.isEmpty()) { + completion.success(); + return; + } + + removeLogicalPort(nicMaps, completion); + } + @Override public SdnControllerFactory getSdnControllerFactory(String type) { SdnControllerFactory factory = sdnControllerFactories.get(type); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerReply.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerReply.java new file mode 100644 index 00000000000..9caf040fd75 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerReply.java @@ -0,0 +1,7 @@ +package org.zstack.sdnController; + +import org.zstack.header.message.MessageReply; + +public class SdnControllerReply extends MessageReply { + +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerSystemTags.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerSystemTags.java new file mode 100644 index 00000000000..9ef502bb8eb --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerSystemTags.java @@ -0,0 +1,11 @@ +package org.zstack.sdnController; + +import org.zstack.header.network.l2.L2NetworkVO; +import org.zstack.header.tag.TagDefinition; +import org.zstack.tag.PatternedSystemTag; + +@TagDefinition +public class SdnControllerSystemTags { + public static String L2_NETWORK_OVN_UUID_TOKEN = "OvnControllerUuid"; + public static PatternedSystemTag L2_NETWORK_OVN_UUID = new PatternedSystemTag(String.format("OvnControllerUuid::{%s}", L2_NETWORK_OVN_UUID_TOKEN), L2NetworkVO.class); +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java index 1130969da38..dd4fa14a31c 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java @@ -5,16 +5,17 @@ import org.springframework.beans.factory.annotation.Configurable; import org.springframework.web.util.UriComponentsBuilder; import org.zstack.core.CoreGlobalProperty; +import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.header.core.Completion; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; -import org.zstack.header.identity.AccountInventory; -import org.zstack.header.network.l2.L2NetworkVO; -import org.zstack.header.network.l3.*; +import org.zstack.header.message.Message; +import org.zstack.header.network.l2.L2NetworkInventory; import org.zstack.header.rest.RESTFacade; import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; +import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; import org.zstack.sdnController.SdnController; import org.zstack.sdnController.header.*; import org.zstack.sdnController.SdnControllerLog; @@ -34,7 +35,8 @@ public class H3cVcfcSdnController implements SdnController { @Autowired private DatabaseFacade dbf; - + @Autowired + CloudBus bus; @Autowired protected RESTFacade restf; @@ -215,6 +217,11 @@ public void handle(ErrorCode errCode, Map data) { }).start(); } + @Override + public void handleMessage(SdnControllerMessage msg) { + bus.dealWithUnknownMessage((Message) msg); + } + @Override @SdnControllerLog public void preInitSdnController(APIAddSdnControllerMsg msg, Completion completion) { @@ -239,7 +246,7 @@ public void fail(ErrorCode errorCode) { @Override @SdnControllerLog - public void postInitSdnController(APIAddSdnControllerMsg msg, Completion completion) { + public void postInitSdnController(SdnControllerVO vo, Completion completion) { completion.success(); } @@ -249,7 +256,7 @@ public void preCreateVxlanNetwork(L2VxlanNetworkInventory vxlan, List sy completion.success(); } - private void createVxlanNetworkOnController(L2VxlanNetworkInventory vxlan, Completion completion) { + private void createVxlanNetworkOnController(L2NetworkInventory vxlan, Completion completion) { getH3cControllerLeaderIp(new Completion(completion) { @Override public void success() { @@ -264,7 +271,8 @@ public void fail(ErrorCode errorCode) { } /* H3C VCFC backup node can not handle the create command */ - private void doCreateVxlanNetworkOnController(L2VxlanNetworkInventory vxlan, Completion completion) { + private void doCreateVxlanNetworkOnController(L2NetworkInventory vxlan, Completion completion) { + VxlanNetworkVO vo = dbf.findByUuid(vxlan.getUuid(), VxlanNetworkVO.class); String tenantUuid = H3cVcfcSdnControllerSystemTags.H3C_TENANT_UUID.getTokenByResourceUuid(self.getUuid(), H3cVcfcSdnControllerSystemTags.H3C_TENANT_UUID_TOKEN); String vdsUuid = H3cVcfcSdnControllerSystemTags.H3C_VDS_UUID.getTokenByResourceUuid(self.getUuid(), H3cVcfcSdnControllerSystemTags.H3C_VDS_TOKEN); H3cVcfcCommands.CreateH3cNetworksCmd cmd = new H3cVcfcCommands.CreateH3cNetworksCmd(); @@ -275,7 +283,7 @@ private void doCreateVxlanNetworkOnController(L2VxlanNetworkInventory vxlan, Com networkCmd.network_type = "VXLAN"; networkCmd.original_network_type = "VXLAN"; networkCmd.domain = vdsUuid; - networkCmd.segmentation_id = vxlan.getVni(); + networkCmd.segmentation_id = vo.getVni(); networkCmd.external = false; networkCmd.force_flat = false; @@ -305,12 +313,12 @@ private void doCreateVxlanNetworkOnController(L2VxlanNetworkInventory vxlan, Com @Override @SdnControllerLog - public void createVxlanNetwork(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion) { + public void createL2Network(L2NetworkInventory inv, List systemTags, Completion completion) { /* initSdnController get the token */ getH3cControllerToken(new Completion(completion) { @Override public void success() { - createVxlanNetworkOnController(vxlan, completion); + createVxlanNetworkOnController(inv, completion); } @Override @@ -357,7 +365,7 @@ public void detachL2NetworkFromCluster(L2VxlanNetworkInventory vxlan, String clu completion.success(); } - private void deleteVxlanNetworkOnController(L2VxlanNetworkInventory vxlan, Completion completion) { + private void deleteVxlanNetworkOnController(L2NetworkInventory vxlan, Completion completion) { getH3cControllerLeaderIp(new Completion(completion) { @Override public void success() { @@ -371,7 +379,7 @@ public void fail(ErrorCode errorCode) { }); } - private void doDeleteVxlanNetworkOnController(L2VxlanNetworkInventory vxlan, Completion completion) { + private void doDeleteVxlanNetworkOnController(L2NetworkInventory vxlan, Completion completion) { H3cVcfcCommands.DeleteH3cNetworksCmd cmd = new H3cVcfcCommands.DeleteH3cNetworksCmd(); try { String h3cL2NetworkUuid = H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID.getTokenByResourceUuid(vxlan.getUuid(), H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID_TOKEN); @@ -389,7 +397,7 @@ private void doDeleteVxlanNetworkOnController(L2VxlanNetworkInventory vxlan, Com @Override @SdnControllerLog - public void deleteVxlanNetwork(L2VxlanNetworkInventory vxlan, Completion completion) { + public void deleteL2Network(L2NetworkInventory vxlan, Completion completion) { /* initSdnController get the token */ getH3cControllerToken(new Completion(completion) { @Override diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java index f57d06b0a67..bdb8397ca60 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java @@ -41,7 +41,7 @@ public void createVxlanNetworkOnSdnController(L2VxlanNetworkInventory vxlan, Lis HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(vxlan.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); SdnController sdnController = sdnControllerManager.getSdnController(sdn); - sdnController.createVxlanNetwork(vxlan, systemTags, completion); + sdnController.createL2Network(vxlan, systemTags, completion); } @Override @@ -54,7 +54,7 @@ public void deleteVxlanNetworkOnSdnController(VxlanNetworkVO vo, Completion comp SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); SdnController sdnController = sdnControllerManager.getSdnController(sdn); - sdnController.deleteVxlanNetwork(L2VxlanNetworkInventory.valueOf(vo), completion); + sdnController.deleteL2Network(L2VxlanNetworkInventory.valueOf(vo), completion); } private void realizeNetwork(String hostUuid, String htype, L2VxlanNetworkInventory inv , Completion completion) { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsg.java index 7346df37dff..33af6807901 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsg.java @@ -7,6 +7,7 @@ import org.zstack.header.other.APIAuditor; import org.zstack.header.rest.RestRequest; import org.zstack.header.tag.TagResourceType; +import org.zstack.header.zone.ZoneVO; @TagResourceType(SdnControllerVO.class) @Action(category = SdnControllerConstant.ACTION_CATEGORY) @@ -29,10 +30,10 @@ public class APIAddSdnControllerMsg extends APICreateMessage implements APIAudit @APIParam(maxLength = 255) private String ip; - @APIParam(maxLength = 255) + @APIParam(required = false, maxLength = 255) private String userName; - @APIParam(maxLength = 255) + @APIParam(required = false, maxLength = 255) @NoLogging private String password; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsgDoc_zh_cn.groovy index 0b010c4d087..8c2c6af8e7c 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsgDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsgDoc_zh_cn.groovy @@ -63,7 +63,7 @@ doc { desc "" location "body" type "String" - optional false + optional true since "3.7" } column { @@ -72,7 +72,7 @@ doc { desc "" location "body" type "String" - optional false + optional true since "3.7" } column { @@ -111,6 +111,15 @@ doc { optional true since "3.7" } + column { + name "zoneUuid" + enclosedIn "params" + desc "区域UUID" + location "body" + type "String" + optional true + since "5.3.0" + } } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEvent.java new file mode 100644 index 00000000000..fbf0c036504 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEvent.java @@ -0,0 +1,44 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +/** + * Created by shixin.ruan on 09/19/2019. + */ +@RestResponse(allTo = "inventory") +public class APIReconnectSdnControllerEvent extends APIEvent { + private SdnControllerInventory inventory; + + public SdnControllerInventory getInventory() { + return inventory; + } + + public void setInventory(SdnControllerInventory inventory) { + this.inventory = inventory; + } + + public APIReconnectSdnControllerEvent() { + } + + public APIReconnectSdnControllerEvent(String apiId) { + super(apiId); + } + + public static APIReconnectSdnControllerEvent __example__() { + APIReconnectSdnControllerEvent event = new APIReconnectSdnControllerEvent(); + SdnControllerInventory inventory = new SdnControllerInventory(); + + inventory.setUuid(uuid()); + inventory.setVendorType(SdnControllerConstant.H3C_VCFC_CONTROLLER); + inventory.setName("sdn-1"); + inventory.setDescription("sdn controller from vendor"); + inventory.setIp("192.168.1.1"); + inventory.setUsername("admin"); + inventory.setPassword("password"); + + event.setInventory(inventory); + return event; + } + +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..47be2a91d73 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.sdnController.header + +import org.zstack.sdnController.header.SdnControllerInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "在这里输入结构的名称" + + ref { + name "inventory" + path "org.zstack.sdnController.header.APIReconnectSdnControllerEvent.inventory" + desc "null" + type "SdnControllerInventory" + since "5.3.0" + clz SdnControllerInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.0" + } + ref { + name "error" + path "org.zstack.sdnController.header.APIReconnectSdnControllerEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.0" + clz ErrorCode.class + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsg.java new file mode 100644 index 00000000000..d6f452cbedc --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsg.java @@ -0,0 +1,38 @@ +package org.zstack.sdnController.header; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; + +/** + * Created by shixin.ruan on 01/04/2024. + */ +@RestRequest( + path = "/sdn-controllers/{sdnControllerUuid}/actions", + method = HttpMethod.PUT, + responseClass = APIReconnectSdnControllerEvent.class, + isAction = true +) +@Action(category = SdnControllerConstant.ACTION_CATEGORY) +public class APIReconnectSdnControllerMsg extends APIMessage implements SdnControllerMessage { + @APIParam(resourceType = SdnControllerVO.class, checkAccount = true, operationTarget = true) + private String sdnControllerUuid; + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + @Override + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public static APIReconnectSdnControllerMsg __example__() { + APIReconnectSdnControllerMsg msg = new APIReconnectSdnControllerMsg(); + msg.setSdnControllerUuid(uuid()); + + return msg; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..e2128fed45b --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsgDoc_zh_cn.groovy @@ -0,0 +1,58 @@ +package org.zstack.sdnController.header + +import org.zstack.sdnController.header.APIReconnectSdnControllerEvent + +doc { + title "ReconnectSdnController" + + category "SdnController" + + desc """在这里填写API描述""" + + rest { + request { + url "PUT /v1/sdn-controllers/{sdnControllerUuid}/actions" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIReconnectSdnControllerMsg.class + + desc """""" + + params { + + column { + name "sdnControllerUuid" + enclosedIn "reconnectSdnController" + desc "" + location "url" + type "String" + optional false + since "5.3.0" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.0" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.0" + } + } + } + + response { + clz APIReconnectSdnControllerEvent.class + } + } +} \ No newline at end of file diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEvent.java new file mode 100644 index 00000000000..1b9542bf1de --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEvent.java @@ -0,0 +1,44 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +@RestResponse(allTo = "inventory") +public class APISdnControllerAddHostEvent extends APIEvent { + /** + * @desc see :ref:`SdnControllerInventory` + */ + private SdnControllerInventory inventory; + + public APISdnControllerAddHostEvent(String apiId) { + super(apiId); + } + + public SdnControllerInventory getInventory() { + return inventory; + } + + public APISdnControllerAddHostEvent() { + super(null); + } + + public void setInventory(SdnControllerInventory inventory) { + this.inventory = inventory; + } + + public static APISdnControllerAddHostEvent __example__() { + APISdnControllerAddHostEvent event = new APISdnControllerAddHostEvent(); + SdnControllerInventory inventory = new SdnControllerInventory(); + + inventory.setUuid(uuid()); + inventory.setVendorType(SdnControllerConstant.H3C_VCFC_CONTROLLER); + inventory.setName("sdn-1"); + inventory.setDescription("sdn controller from vendor"); + inventory.setIp("192.168.1.1"); + inventory.setUsername("admin"); + inventory.setPassword("password"); + + event.setInventory(inventory); + return event; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..a7b1dc331ff --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.sdnController.header + +import org.zstack.sdnController.header.SdnControllerInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "在这里输入结构的名称" + + ref { + name "inventory" + path "org.zstack.sdnController.header.APISdnControllerAddHostEvent.inventory" + desc "null" + type "SdnControllerInventory" + since "5.3.0" + clz SdnControllerInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.0" + } + ref { + name "error" + path "org.zstack.sdnController.header.APISdnControllerAddHostEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.0" + clz ErrorCode.class + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsg.java new file mode 100644 index 00000000000..0ac68423827 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsg.java @@ -0,0 +1,151 @@ +package org.zstack.sdnController.header; + +import org.springframework.http.HttpMethod; +import org.zstack.header.cluster.ClusterVO; +import org.zstack.header.host.HostVO; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.network.l2.L2NetworkConstant; +import org.zstack.header.rest.APINoSee; +import org.zstack.header.rest.RestRequest; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Action(category = SdnControllerConstant.ACTION_CATEGORY) +@RestRequest( + path = "/sdn-controllers/{sdnControllerUuid}/hosts/{hostUuid}", + method = HttpMethod.POST, + responseClass = APISdnControllerAddHostEvent.class, + parameterName = "null" +) +public class APISdnControllerAddHostMsg extends APIMessage { + /** + * @desc l2Network uuid + */ + @APIParam(resourceType = SdnControllerVO.class, checkAccount = true, operationTarget = true) + private String sdnControllerUuid; + /** + * @desc cluster uuid. See :ref:`ClusterInventory` + */ + @APIParam(resourceType = HostVO.class) + private String hostUuid; + + /** + * @desc vSwitch type + */ + @APIParam(required = false, validValues = {"OvnDpdk", "OvnKernel"}) + private String vSwitchType = "OvnDpdk"; + + /** + * @desc physical nics used by vSwitchType + */ + @APIParam(nonempty = true) + private List nicNames; + + /** + * @desc physical nics used by vSwitchType + */ + @APIParam(required = false) + private String vtepIp; + + /** + * @desc physical nics used by vSwitchType + */ + @APIParam(required = false) + private String netmask; + + /** + * @desc bonding mode + */ + @APIParam(required = false) + private String bondMode; + + /** + * @desc lacp mode + */ + @APIParam(required = false) + private String lacpMode; + + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getvSwitchType() { + return vSwitchType; + } + + public void setvSwitchType(String vSwitchType) { + this.vSwitchType = vSwitchType; + } + + public List getNicNames() { + return nicNames; + } + + public void setNicNames(List nicNames) { + this.nicNames = nicNames; + } + + public String getVtepIp() { + return vtepIp; + } + + public void setVtepIp(String vtepIp) { + this.vtepIp = vtepIp; + } + + public String getBondMode() { + return bondMode; + } + + public void setBondMode(String bondMode) { + this.bondMode = bondMode; + } + + public String getNetmask() { + return netmask; + } + + public void setNetmask(String netmask) { + this.netmask = netmask; + } + + public String getLacpMode() { + return lacpMode; + } + + public void setLacpMode(String lacpMode) { + this.lacpMode = lacpMode; + } + + public static APISdnControllerAddHostMsg __example__() { + APISdnControllerAddHostMsg msg = new APISdnControllerAddHostMsg(); + + msg.setSdnControllerUuid(uuid()); + msg.setHostUuid(uuid()); + msg.setvSwitchType(SdnControllerConstant.H3C_VCFC_CONTROLLER); + msg.setVtepIp("192.168.1.101"); + msg.setNetmask("255.255.255.0"); + msg.setNetmask("ens1 ens2"); + msg.setBondMode(L2NetworkConstant.BONDING_MODE_AB); + msg.setLacpMode(L2NetworkConstant.LACP_MODE_OFF); + + return msg; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..d3fe03c6beb --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsgDoc_zh_cn.groovy @@ -0,0 +1,122 @@ +package org.zstack.sdnController.header + +import org.zstack.sdnController.header.APISdnControllerAddHostEvent + +doc { + title "SdnControllerAddHost" + + category "未知类别" + + desc """在这里填写API描述""" + + rest { + request { + url "POST /v1/sdn-controllers/{sdnControllerUuid}/hosts/{hostUuid}" + + header (Authorization: 'OAuth the-session-uuid') + + clz APISdnControllerAddHostMsg.class + + desc """""" + + params { + + column { + name "sdnControllerUuid" + enclosedIn "" + desc "" + location "url" + type "String" + optional false + since "5.3.0" + } + column { + name "hostUuid" + enclosedIn "" + desc "物理机UUID" + location "url" + type "String" + optional false + since "5.3.0" + } + column { + name "vSwitchType" + enclosedIn "" + desc "" + location "body" + type "String" + optional true + since "5.3.0" + values ("OvsKernel","OvsDpdk","sriov") + } + column { + name "nicNames" + enclosedIn "" + desc "" + location "body" + type "List" + optional false + since "5.3.0" + } + column { + name "vtepIp" + enclosedIn "" + desc "" + location "body" + type "String" + optional true + since "5.3.0" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.0" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.0" + } + column { + name "netmask" + enclosedIn "" + desc "" + location "body" + type "String" + optional true + since "5.3.0" + } + column { + name "bondMode" + enclosedIn "" + desc "" + location "body" + type "String" + optional true + since "5.3.0" + } + column { + name "lacpMode" + enclosedIn "" + desc "" + location "body" + type "String" + optional true + since "5.3.0" + } + } + } + + response { + clz APISdnControllerAddHostEvent.class + } + } +} \ No newline at end of file diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEvent.java new file mode 100644 index 00000000000..9a58419f0c2 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEvent.java @@ -0,0 +1,44 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +@RestResponse(allTo = "inventory") +public class APISdnControllerChangeHostEvent extends APIEvent { + /** + * @desc see :ref:`SdnControllerInventory` + */ + private SdnControllerInventory inventory; + + public APISdnControllerChangeHostEvent(String apiId) { + super(apiId); + } + + public SdnControllerInventory getInventory() { + return inventory; + } + + public APISdnControllerChangeHostEvent() { + super(null); + } + + public void setInventory(SdnControllerInventory inventory) { + this.inventory = inventory; + } + + public static APISdnControllerChangeHostEvent __example__() { + APISdnControllerChangeHostEvent event = new APISdnControllerChangeHostEvent(); + SdnControllerInventory inventory = new SdnControllerInventory(); + + inventory.setUuid(uuid()); + inventory.setVendorType(SdnControllerConstant.H3C_VCFC_CONTROLLER); + inventory.setName("sdn-1"); + inventory.setDescription("sdn controller from vendor"); + inventory.setIp("192.168.1.1"); + inventory.setUsername("admin"); + inventory.setPassword("password"); + + event.setInventory(inventory); + return event; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..304d4f9dd3f --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.sdnController.header + +import org.zstack.sdnController.header.SdnControllerInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "在这里输入结构的名称" + + ref { + name "inventory" + path "org.zstack.sdnController.header.APISdnControllerChangeHostEvent.inventory" + desc "null" + type "SdnControllerInventory" + since "5.3.0" + clz SdnControllerInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.0" + } + ref { + name "error" + path "org.zstack.sdnController.header.APISdnControllerChangeHostEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.0" + clz ErrorCode.class + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsg.java new file mode 100644 index 00000000000..365f0851a68 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsg.java @@ -0,0 +1,146 @@ +package org.zstack.sdnController.header; + +import org.springframework.http.HttpMethod; +import org.zstack.header.host.HostVO; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.network.l2.L2NetworkConstant; +import org.zstack.header.rest.RestRequest; + +import java.util.List; + +@Action(category = SdnControllerConstant.ACTION_CATEGORY) +@RestRequest( + path = "/sdn-controllers/{sdnControllerUuid}/hosts/{hostUuid}/actions", + method = HttpMethod.PUT, + responseClass = APISdnControllerChangeHostEvent.class, + isAction = true +) +public class APISdnControllerChangeHostMsg extends APIMessage { + /** + * @desc l2Network uuid + */ + @APIParam(resourceType = SdnControllerVO.class, checkAccount = true, operationTarget = true) + private String sdnControllerUuid; + /** + * @desc cluster uuid. See :ref:`ClusterInventory` + */ + @APIParam(resourceType = HostVO.class) + private String hostUuid; + + /** + * @desc vSwitch type + */ + @APIParam(required = false, validValues = {"OvnDpdk", "OvnKernel"}) + private String vSwitchType = "OvnDpdk"; + + /** + * @desc physical nics used by vSwitchType + */ + @APIParam(nonempty = true, required = false) + private List nicNames; + + /** + * @desc physical nics used by vSwitchType + */ + @APIParam(required = false) + private String vtepIp; + + /** + * @desc physical nics used by vSwitchType + */ + @APIParam(required = false) + private String netmask; + + /** + * @desc bonding mode + */ + @APIParam(required = false) + private String bondMode; + + /** + * @desc lacp mode + */ + @APIParam(required = false) + private String lacpMode; + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getvSwitchType() { + return vSwitchType; + } + + public void setvSwitchType(String vSwitchType) { + this.vSwitchType = vSwitchType; + } + + public List getNicNames() { + return nicNames; + } + + public void setNicNames(List nicNames) { + this.nicNames = nicNames; + } + + public String getVtepIp() { + return vtepIp; + } + + public void setVtepIp(String vtepIp) { + this.vtepIp = vtepIp; + } + + public String getBondMode() { + return bondMode; + } + + public void setBondMode(String bondMode) { + this.bondMode = bondMode; + } + + public String getNetmask() { + return netmask; + } + + public void setNetmask(String netmask) { + this.netmask = netmask; + } + + public String getLacpMode() { + return lacpMode; + } + + public void setLacpMode(String lacpMode) { + this.lacpMode = lacpMode; + } + + public static APISdnControllerChangeHostMsg __example__() { + APISdnControllerChangeHostMsg msg = new APISdnControllerChangeHostMsg(); + + msg.setSdnControllerUuid(uuid()); + msg.setHostUuid(uuid()); + msg.setvSwitchType(SdnControllerConstant.H3C_VCFC_CONTROLLER); + msg.setVtepIp("192.168.1.101"); + msg.setNetmask("255.255.255.0"); + msg.setNetmask("ens1 ens2"); + msg.setBondMode(L2NetworkConstant.BONDING_MODE_AB); + msg.setLacpMode(L2NetworkConstant.LACP_MODE_OFF); + + return msg; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..dac87e60d85 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsgDoc_zh_cn.groovy @@ -0,0 +1,122 @@ +package org.zstack.sdnController.header + +import org.zstack.sdnController.header.APISdnControllerChangeHostEvent + +doc { + title "SdnControllerChangeHost" + + category "SdnController" + + desc """在这里填写API描述""" + + rest { + request { + url "PUT /v1/sdn-controllers/{sdnControllerUuid}/hosts/{hostUuid}/actions" + + header (Authorization: 'OAuth the-session-uuid') + + clz APISdnControllerChangeHostMsg.class + + desc """""" + + params { + + column { + name "sdnControllerUuid" + enclosedIn "sdnControllerChangeHost" + desc "" + location "url" + type "String" + optional false + since "5.3.0" + } + column { + name "hostUuid" + enclosedIn "sdnControllerChangeHost" + desc "物理机UUID" + location "url" + type "String" + optional false + since "5.3.0" + } + column { + name "vSwitchType" + enclosedIn "sdnControllerChangeHost" + desc "" + location "body" + type "String" + optional true + since "5.3.0" + values ("OvnDpdk","OvnKernel") + } + column { + name "nicNames" + enclosedIn "sdnControllerChangeHost" + desc "" + location "body" + type "List" + optional true + since "5.3.0" + } + column { + name "vtepIp" + enclosedIn "sdnControllerChangeHost" + desc "" + location "body" + type "String" + optional true + since "5.3.0" + } + column { + name "netmask" + enclosedIn "sdnControllerChangeHost" + desc "" + location "body" + type "String" + optional true + since "5.3.0" + } + column { + name "bondMode" + enclosedIn "sdnControllerChangeHost" + desc "" + location "body" + type "String" + optional true + since "5.3.0" + } + column { + name "lacpMode" + enclosedIn "sdnControllerChangeHost" + desc "" + location "body" + type "String" + optional true + since "5.3.0" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.0" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.0" + } + } + } + + response { + clz APISdnControllerChangeHostEvent.class + } + } +} \ No newline at end of file diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEvent.java new file mode 100644 index 00000000000..6d01aaa2674 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEvent.java @@ -0,0 +1,44 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +@RestResponse(allTo = "inventory") +public class APISdnControllerRemoveHostEvent extends APIEvent { + /** + * @desc see :ref:`SdnControllerInventory` + */ + private SdnControllerInventory inventory; + + public APISdnControllerRemoveHostEvent(String apiId) { + super(apiId); + } + + public SdnControllerInventory getInventory() { + return inventory; + } + + public APISdnControllerRemoveHostEvent() { + super(null); + } + + public void setInventory(SdnControllerInventory inventory) { + this.inventory = inventory; + } + + public static APISdnControllerRemoveHostEvent __example__() { + APISdnControllerRemoveHostEvent event = new APISdnControllerRemoveHostEvent(); + SdnControllerInventory inventory = new SdnControllerInventory(); + + inventory.setUuid(uuid()); + inventory.setVendorType(SdnControllerConstant.H3C_VCFC_CONTROLLER); + inventory.setName("sdn-1"); + inventory.setDescription("sdn controller from vendor"); + inventory.setIp("192.168.1.1"); + inventory.setUsername("admin"); + inventory.setPassword("password"); + + event.setInventory(inventory); + return event; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..ec30dadf5eb --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.sdnController.header + +import org.zstack.sdnController.header.SdnControllerInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "在这里输入结构的名称" + + ref { + name "inventory" + path "org.zstack.sdnController.header.APISdnControllerRemoveHostEvent.inventory" + desc "null" + type "SdnControllerInventory" + since "5.3.0" + clz SdnControllerInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.0" + } + ref { + name "error" + path "org.zstack.sdnController.header.APISdnControllerRemoveHostEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.0" + clz ErrorCode.class + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostHostEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostHostEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..473a427c3a6 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostHostEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.sdnController.header + +import org.zstack.sdnController.header.SdnControllerInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "在这里输入结构的名称" + + ref { + name "inventory" + path "org.zstack.sdnController.header.APISdnControllerRemoveHostHostEvent.inventory" + desc "null" + type "SdnControllerInventory" + since "5.3.0" + clz SdnControllerInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.0" + } + ref { + name "error" + path "org.zstack.sdnController.header.APISdnControllerRemoveHostHostEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.0" + clz ErrorCode.class + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostHostMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostHostMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..e58620d7f5d --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostHostMsgDoc_zh_cn.groovy @@ -0,0 +1,75 @@ +package org.zstack.sdnController.header + +doc { + title "SdnControllerRemoveHostHost" + + category "未知类别" + + desc """在这里填写API描述""" + + rest { + request { + url "DELETE /v1/sdn-controllers/{sdnControllerUuid}/hosts/{hostUuid}" + + header (Authorization: 'OAuth the-session-uuid') + + clz APISdnControllerRemoveHostMsg.class + + desc """""" + + params { + + column { + name "sdnControllerUuid" + enclosedIn "" + desc "" + location "url" + type "String" + optional false + since "5.3.0" + } + column { + name "hostUuid" + enclosedIn "" + desc "物理机UUID" + location "url" + type "String" + optional false + since "5.3.0" + } + column { + name "vSwitchType" + enclosedIn "" + desc "" + location "body" + type "String" + optional true + since "5.3.0" + values ("OvsKernel","OvsDpdk","sriov") + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.0" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.0" + } + } + } + + response { + clz APISdnControllerRemoveHostEvent.class + } + } +} \ No newline at end of file diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java new file mode 100644 index 00000000000..de7641c30ed --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java @@ -0,0 +1,67 @@ +package org.zstack.sdnController.header; + +import org.springframework.http.HttpMethod; +import org.zstack.header.host.HostVO; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; + + +@Action(category = SdnControllerConstant.ACTION_CATEGORY) +@RestRequest( + path = "/sdn-controllers/{sdnControllerUuid}/hosts/{hostUuid}", + method = HttpMethod.DELETE, + responseClass = APISdnControllerRemoveHostEvent.class +) +public class APISdnControllerRemoveHostMsg extends APIMessage { + /** + * @desc l2Network uuid + */ + @APIParam(resourceType = SdnControllerVO.class, checkAccount = true, operationTarget = true) + private String sdnControllerUuid; + /** + * @desc cluster uuid. See :ref:`ClusterInventory` + */ + @APIParam(resourceType = HostVO.class) + private String hostUuid; + + /** + * @desc vSwitch type + */ + @APIParam(required = false, validValues = {"OvnDpdk", "OvnKernel"}) + private String vSwitchType = "OvnDpdk"; + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getvSwitchType() { + return vSwitchType; + } + + public void setvSwitchType(String vSwitchType) { + this.vSwitchType = vSwitchType; + } + + public static APISdnControllerRemoveHostMsg __example__() { + APISdnControllerRemoveHostMsg msg = new APISdnControllerRemoveHostMsg(); + + msg.setSdnControllerUuid(uuid()); + msg.setSdnControllerUuid(uuid()); + + return msg; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..818681d8fb7 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsgDoc_zh_cn.groovy @@ -0,0 +1,77 @@ +package org.zstack.sdnController.header + +import org.zstack.sdnController.header.APISdnControllerRemoveHostEvent + +doc { + title "SdnControllerRemoveHost" + + category "SdnController" + + desc """在这里填写API描述""" + + rest { + request { + url "DELETE /v1/sdn-controllers/{sdnControllerUuid}/hosts/{hostUuid}" + + header (Authorization: 'OAuth the-session-uuid') + + clz APISdnControllerRemoveHostMsg.class + + desc """""" + + params { + + column { + name "sdnControllerUuid" + enclosedIn "" + desc "" + location "url" + type "String" + optional false + since "5.3.0" + } + column { + name "hostUuid" + enclosedIn "" + desc "物理机UUID" + location "url" + type "String" + optional false + since "5.3.0" + } + column { + name "vSwitchType" + enclosedIn "" + desc "" + location "body" + type "String" + optional true + since "5.3.0" + values ("OvnDpdk","OvnKernel") + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.0" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.0" + } + } + } + + response { + clz APISdnControllerRemoveHostEvent.class + } + } +} \ No newline at end of file diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISyncSdnControllerEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISyncSdnControllerEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..29acf4e9ebe --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISyncSdnControllerEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.sdnController.header + +import org.zstack.sdnController.header.SdnControllerInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "在这里输入结构的名称" + + ref { + name "inventory" + path "org.zstack.sdnController.header.APISyncSdnControllerEvent.inventory" + desc "null" + type "SdnControllerInventory" + since "5.3.0" + clz SdnControllerInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.0" + } + ref { + name "error" + path "org.zstack.sdnController.header.APISyncSdnControllerEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.0" + clz ErrorCode.class + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISyncSdnControllerMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISyncSdnControllerMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..8bb3812aa34 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISyncSdnControllerMsgDoc_zh_cn.groovy @@ -0,0 +1,56 @@ +package org.zstack.sdnController.header + +doc { + title "SyncSdnController" + + category "SdnController" + + desc """在这里填写API描述""" + + rest { + request { + url "PUT /v1/sdn-controllers/{sdnControllerUuid}/actions" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIReconnectSdnControllerMsg.class + + desc """""" + + params { + + column { + name "sdnControllerUuid" + enclosedIn "syncSdnController" + desc "" + location "url" + type "String" + optional false + since "5.3.0" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.0" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.0" + } + } + } + + response { + clz APIReconnectSdnControllerEvent.class + } + } +} \ No newline at end of file diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventoryDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventoryDoc_zh_cn.groovy index ff27c417693..088aeffbb2d 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventoryDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventoryDoc_zh_cn.groovy @@ -1,35 +1,45 @@ package org.zstack.sdnController.header import org.zstack.network.l2.vxlan.vtep.VtepInventory +import org.zstack.network.l2.vxlan.vtep.RemoteVtepInventory import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory import org.zstack.network.l2.vxlan.vxlanNetworkPool.VniRangeInventory -import java.sql.Timestamp +import java.lang.Integer +import java.lang.Boolean import java.sql.Timestamp doc { - title "硬件VXLAN资源池器清单" + title "在这里输入结构的名称" field { name "sdnControllerUuid" - desc "SDN控制器UUID" + desc "" type "String" - since "3.7" + since "5.3.0" } ref { name "attachedVtepRefs" path "org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory.attachedVtepRefs" desc "null" type "List" - since "3.7" + since "5.3.0" clz VtepInventory.class } + ref { + name "remoteVteps" + path "org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory.remoteVteps" + desc "null" + type "List" + since "5.3.0" + clz RemoteVtepInventory.class + } ref { name "attachedVxlanNetworkRefs" path "org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory.attachedVxlanNetworkRefs" desc "null" type "List" - since "3.7" + since "5.3.0" clz L2VxlanNetworkInventory.class } ref { @@ -37,67 +47,91 @@ doc { path "org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory.attachedVniRanges" desc "null" type "List" - since "3.7" + since "5.3.0" clz VniRangeInventory.class } field { name "attachedCidrs" - desc "已加载CIDR映射表" + desc "" type "Map" - since "3.7" + since "5.3.0" } field { name "uuid" desc "资源的UUID,唯一标示该资源" type "String" - since "3.7" + since "5.3.0" } field { name "name" desc "资源名称" type "String" - since "3.7" + since "5.3.0" } field { name "description" desc "资源的详细描述" type "String" - since "3.7" + since "5.3.0" } field { name "zoneUuid" desc "区域UUID" type "String" - since "3.7" + since "5.3.0" } field { name "physicalInterface" - desc "物理网卡" + desc "" type "String" - since "3.7" + since "5.3.0" } field { name "type" - desc "二层网络类型" + desc "" + type "String" + since "5.3.0" + } + field { + name "vSwitchType" + desc "" + type "String" + since "5.3.0" + } + field { + name "virtualNetworkId" + desc "" + type "Integer" + since "5.3.0" + } + field { + name "isolated" + desc "" + type "Boolean" + since "5.3.0" + } + field { + name "pvlan" + desc "" type "String" - since "3.7" + since "5.3.0" } field { name "createDate" desc "创建时间" type "Timestamp" - since "3.7" + since "5.3.0" } field { name "lastOpDate" desc "最后一次修改时间" type "Timestamp" - since "3.7" + since "5.3.0" } field { name "attachedClusterUuids" - desc "挂载集群的UUID列表" + desc "" type "List" - since "3.7" + since "5.3.0" } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerFlowDataParam.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerFlowDataParam.java new file mode 100644 index 00000000000..64cf7344de2 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerFlowDataParam.java @@ -0,0 +1,5 @@ +package org.zstack.sdnController.header; + +public enum SdnControllerFlowDataParam { + SDN_CONTROLLER_INV, +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefInventory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefInventory.java new file mode 100644 index 00000000000..4789a1a11fb --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefInventory.java @@ -0,0 +1,126 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.configuration.PythonClassInventory; +import org.zstack.header.host.HostInventory; +import org.zstack.header.query.ExpandedQueries; +import org.zstack.header.query.ExpandedQuery; +import org.zstack.header.search.Inventory; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@PythonClassInventory +@Inventory(mappingVOClass = SdnControllerHostRefVO.class) +@ExpandedQueries({ + @ExpandedQuery(expandedField = "host", inventoryClass = HostInventory.class, + foreignKey = "uuid", expandedInventoryKey = "hostUuid"), + @ExpandedQuery(expandedField = "sdnController", inventoryClass = SdnControllerInventory.class, + foreignKey = "sdnControllerUuid", expandedInventoryKey = "uuid"), +}) +public class SdnControllerHostRefInventory implements Serializable { + private String sdnControllerUuid; + private String hostUuid; + private String vSwitchType; + private String vtepIp; + private String nicPciAddresses; + private String nicDrivers; + private String netmask; + private String bondMode; + private String lacpMode; + + public static SdnControllerHostRefInventory valueOf(SdnControllerHostRefVO vo) { + SdnControllerHostRefInventory inv = new SdnControllerHostRefInventory(); + inv.setSdnControllerUuid(vo.getSdnControllerUuid()); + inv.setHostUuid(vo.getHostUuid()); + inv.setvSwitchType(vo.getvSwitchType()); + inv.setVtepIp(vo.getVtepIp()); + inv.setNetmask(vo.getNetmask()); + inv.setNicPciAddresses(vo.getNicPciAddresses()); + inv.setNicDrivers(vo.getNicDrivers()); + inv.setBondMode(vo.getBondMode()); + inv.setLacpMode(vo.getLacpMode()); + return inv; + } + + public static List valueOf(Collection vos) { + List lst = new ArrayList(vos.size()); + for (SdnControllerHostRefVO vo : vos) { + lst.add(SdnControllerHostRefInventory.valueOf(vo)); + } + return lst; + } + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getvSwitchType() { + return vSwitchType; + } + + public void setvSwitchType(String vSwitchType) { + this.vSwitchType = vSwitchType; + } + + public String getVtepIp() { + return vtepIp; + } + + public void setVtepIp(String vtepIp) { + this.vtepIp = vtepIp; + } + + public String getNicPciAddresses() { + return nicPciAddresses; + } + + public void setNicPciAddresses(String nicPciAddresses) { + this.nicPciAddresses = nicPciAddresses; + } + + public String getNicDrivers() { + return nicDrivers; + } + + public void setNicDrivers(String nicDrivers) { + this.nicDrivers = nicDrivers; + } + + public String getNetmask() { + return netmask; + } + + public void setNetmask(String netmask) { + this.netmask = netmask; + } + + public String getBondMode() { + return bondMode; + } + + public void setBondMode(String bondMode) { + this.bondMode = bondMode; + } + + public String getLacpMode() { + return lacpMode; + } + + public void setLacpMode(String lacpMode) { + this.lacpMode = lacpMode; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefInventoryDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..bb52319c3a7 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefInventoryDoc_zh_cn.groovy @@ -0,0 +1,63 @@ +package org.zstack.sdnController.header + + + +doc { + + title "在这里输入结构的名称" + + field { + name "sdnControllerUuid" + desc "" + type "String" + since "5.3.0" + } + field { + name "hostUuid" + desc "物理机UUID" + type "String" + since "5.3.0" + } + field { + name "vSwitchType" + desc "" + type "String" + since "5.3.0" + } + field { + name "vtepIp" + desc "" + type "String" + since "5.3.0" + } + field { + name "nicPciAddresses" + desc "" + type "String" + since "5.3.0" + } + field { + name "nicDrivers" + desc "" + type "String" + since "5.3.0" + } + field { + name "netmask" + desc "" + type "String" + since "5.3.0" + } + field { + name "bondMode" + desc "" + type "String" + since "5.3.0" + } + field { + name "lacpMode" + desc "" + type "String" + since "5.3.0" + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefVO.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefVO.java new file mode 100644 index 00000000000..949fee347e1 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefVO.java @@ -0,0 +1,164 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.host.HostEO; +import org.zstack.header.search.SqlTrigger; +import org.zstack.header.search.TriggerIndex; +import org.zstack.header.vo.EntityGraph; +import org.zstack.header.vo.ForeignKey; +import org.zstack.header.vo.SoftDeletionCascade; +import org.zstack.header.vo.SoftDeletionCascades; + +import javax.persistence.*; +import java.util.HashMap; + +/** + * Created by shixin.ruan on 09/30/2019. + */ +@Entity +@Table +@TriggerIndex +@SqlTrigger(foreignVOClass = SdnControllerVO.class, foreignVOJoinColumn = "sdnControllerUuid") +@SoftDeletionCascades({ + @SoftDeletionCascade(parent = SdnControllerVO.class, joinColumn = "sdnControllerUuid"), + @SoftDeletionCascade(parent = HostEO.class, joinColumn = "hostUuid") +}) +@EntityGraph( + friends = { + @EntityGraph.Neighbour(type = SdnControllerVO.class, myField = "sdnControllerUuid", targetField = "uuid"), + @EntityGraph.Neighbour(type = HostEO.class, myField = "hostUuid", targetField = "uuid"), + } +) +public class SdnControllerHostRefVO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column + private long id; + + @Column + @ForeignKey(parentEntityClass = SdnControllerVO.class, onDeleteAction = ForeignKey.ReferenceOption.RESTRICT) + private String sdnControllerUuid; + + @Column + @ForeignKey(parentEntityClass = HostEO.class, onDeleteAction = ForeignKey.ReferenceOption.CASCADE) + private String hostUuid; + + @Column + private String vSwitchType; + + @Column + private String vtepIp; + + @Column + private String netmask; + + @Column + private String nicPciAddresses; + + @Column + private String nicDrivers; + + @Column + private String bondMode; + + @Column + private String lacpMode; + + + public SdnControllerHostRefVO() { + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getvSwitchType() { + return vSwitchType; + } + + public void setvSwitchType(String vSwitchType) { + this.vSwitchType = vSwitchType; + } + + public String getVtepIp() { + return vtepIp; + } + + public void setVtepIp(String vtepIp) { + this.vtepIp = vtepIp; + } + + public String getNicPciAddresses() { + return nicPciAddresses; + } + + public void setNicPciAddresses(String nicPciAddresses) { + this.nicPciAddresses = nicPciAddresses; + } + + public String getNicDrivers() { + return nicDrivers; + } + + public void setNicDrivers(String nicDrivers) { + this.nicDrivers = nicDrivers; + } + + public String getNetmask() { + return netmask; + } + + public void setNetmask(String netmask) { + this.netmask = netmask; + } + + public String getBondMode() { + return bondMode; + } + + public void setBondMode(String bondMode) { + this.bondMode = bondMode; + } + + public String getLacpMode() { + return lacpMode; + } + + public void setLacpMode(String lacpMode) { + this.lacpMode = lacpMode; + } + + public static SdnControllerHostRefVO fromOther(SdnControllerHostRefVO vo) { + SdnControllerHostRefVO newRef = new SdnControllerHostRefVO(); + newRef.sdnControllerUuid = vo.getSdnControllerUuid(); + newRef.hostUuid = vo.getHostUuid(); + newRef.vSwitchType = vo.getvSwitchType(); + newRef.vtepIp = vo.getVtepIp(); + newRef.netmask = vo.getNetmask(); + newRef.bondMode = vo.getBondMode(); + newRef.nicPciAddresses = vo.nicPciAddresses; + newRef.nicDrivers = vo.getNicDrivers(); + newRef.lacpMode = vo.getLacpMode(); + + return newRef; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefVO_.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefVO_.java new file mode 100644 index 00000000000..625d965cb63 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefVO_.java @@ -0,0 +1,18 @@ +package org.zstack.sdnController.header; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; + +@StaticMetamodel(SdnControllerHostRefVO.class) +public class SdnControllerHostRefVO_ { + public static volatile SingularAttribute id; + public static volatile SingularAttribute hostUuid; + public static volatile SingularAttribute sdnControllerUuid; + public static volatile SingularAttribute vSwitchType; + public static volatile SingularAttribute vtepIp; + public static volatile SingularAttribute netmask; + public static volatile SingularAttribute nicPciAddresses; + public static volatile SingularAttribute nicDrivers; + public static volatile SingularAttribute bondMode; + public static volatile SingularAttribute lacpMode; +} \ No newline at end of file diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventory.java index 7c3fbfe25d2..c79c9f373ef 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventory.java @@ -15,10 +15,6 @@ import java.util.Map; @Inventory(mappingVOClass = SdnControllerVO.class) -@ExpandedQueries({ - @ExpandedQuery(expandedField = "vxlanPool", inventoryClass = HardwareL2VxlanNetworkPoolInventory.class, - foreignKey = "uuid", expandedInventoryKey = "sdnControllerUuid"), -}) @PythonClassInventory public class SdnControllerInventory implements Serializable { private String uuid; @@ -29,10 +25,12 @@ public class SdnControllerInventory implements Serializable { private String username; @NoLogging private String password; + private SdnControllerStatus status; private Timestamp createDate; private Timestamp lastOpDate; private List vniRanges; private List vxlanPools; + private List hostRefs; public static SdnControllerInventory valueOf(SdnControllerVO vo) { SdnControllerInventory inv = new SdnControllerInventory(); @@ -43,6 +41,7 @@ public static SdnControllerInventory valueOf(SdnControllerVO vo) { inv.setIp(vo.getIp()); inv.setUsername(vo.getUsername()); inv.setPassword(vo.getPassword()); + inv.setStatus(vo.getStatus()); inv.setCreateDate(vo.getCreateDate()); inv.setLastOpDate(vo.getLastOpDate()); inv.vniRanges = new ArrayList<>(); @@ -56,6 +55,7 @@ public static SdnControllerInventory valueOf(SdnControllerVO vo) { } } inv.setVxlanPools(HardwareL2VxlanNetworkPoolInventory.valueOf2(vo.getVxlanPools())); + inv.setHostRefs(SdnControllerHostRefInventory.valueOf(vo.getHostRefVOS())); return inv; } @@ -154,4 +154,20 @@ public List getVxlanPools() { public void setVxlanPools(List vxlanPools) { this.vxlanPools = vxlanPools; } + + public SdnControllerStatus getStatus() { + return status; + } + + public void setStatus(SdnControllerStatus status) { + this.status = status; + } + + public List getHostRefs() { + return hostRefs; + } + + public void setHostRefs(List hostRefs) { + this.hostRefs = hostRefs; + } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventoryDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventoryDoc_zh_cn.groovy index a2e193fb1ef..fd5d9473e0f 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventoryDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventoryDoc_zh_cn.groovy @@ -1,69 +1,83 @@ package org.zstack.sdnController.header +import org.zstack.sdnController.header.SdnControllerStatus +import java.sql.Timestamp +import org.zstack.sdnController.header.SdnVniRange +import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory +import org.zstack.sdnController.header.SdnControllerHostRefInventory + doc { - title "SDN控制器清单" + title "在这里输入结构的名称" field { name "uuid" desc "资源的UUID,唯一标示该资源" type "String" - since "3.7" + since "5.3.0" } field { name "vendorType" desc "" type "String" - since "3.7" + since "5.3.0" } field { name "name" desc "资源名称" type "String" - since "3.7" + since "5.3.0" } field { name "description" desc "资源的详细描述" type "String" - since "3.7" + since "5.3.0" } field { name "ip" desc "" type "String" - since "3.7" + since "5.3.0" } field { name "username" desc "" type "String" - since "3.7" + since "5.3.0" } field { name "password" desc "" type "String" - since "3.7" + since "5.3.0" + } + ref { + name "status" + path "org.zstack.sdnController.header.SdnControllerInventory.status" + desc "null" + type "SdnControllerStatus" + since "5.3.0" + clz SdnControllerStatus.class } field { name "createDate" desc "创建时间" type "Timestamp" - since "3.7" + since "5.3.0" } field { name "lastOpDate" desc "最后一次修改时间" type "Timestamp" - since "3.7" + since "5.3.0" } ref { name "vniRanges" path "org.zstack.sdnController.header.SdnControllerInventory.vniRanges" desc "null" type "List" - since "3.7" + since "5.3.0" clz SdnVniRange.class } ref { @@ -71,7 +85,15 @@ doc { path "org.zstack.sdnController.header.SdnControllerInventory.vxlanPools" desc "null" type "List" - since "3.7" + since "5.3.0" clz HardwareL2VxlanNetworkPoolInventory.class } + ref { + name "hostRefs" + path "org.zstack.sdnController.header.SdnControllerInventory.hostRefs" + desc "null" + type "List" + since "5.3.0" + clz SdnControllerHostRefInventory.class + } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerRemoveHostMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerRemoveHostMsg.java new file mode 100644 index 00000000000..416611e6ccc --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerRemoveHostMsg.java @@ -0,0 +1,42 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.NeedReplyMessage; + +public class SdnControllerRemoveHostMsg extends NeedReplyMessage implements SdnControllerMessage { + private String sdnControllerUuid; + private String hostUuid; + private String vSwitchType; + + public static SdnControllerRemoveHostMsg fromApi(APISdnControllerRemoveHostMsg amsg) { + SdnControllerRemoveHostMsg msg = new SdnControllerRemoveHostMsg(); + msg.setSdnControllerUuid(amsg.getSdnControllerUuid()); + msg.setHostUuid(amsg.getHostUuid()); + msg.setvSwitchType(amsg.getvSwitchType()); + return msg; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getvSwitchType() { + return vSwitchType; + } + + public void setvSwitchType(String vSwitchType) { + this.vSwitchType = vSwitchType; + } + + @Override + public String getSdnControllerUuid() { + return sdnControllerUuid; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerRemoveHostReply.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerRemoveHostReply.java new file mode 100644 index 00000000000..964a48d8697 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerRemoveHostReply.java @@ -0,0 +1,6 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.MessageReply; + +public class SdnControllerRemoveHostReply extends MessageReply { +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerStatus.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerStatus.java new file mode 100644 index 00000000000..27b27040278 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerStatus.java @@ -0,0 +1,7 @@ +package org.zstack.sdnController.header; + +public enum SdnControllerStatus { + Connecting, + Connected, + Disconnected +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerStatusDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerStatusDoc_zh_cn.groovy new file mode 100644 index 00000000000..60e90effd7d --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerStatusDoc_zh_cn.groovy @@ -0,0 +1,27 @@ +package org.zstack.sdnController.header + + + +doc { + + title "在这里输入结构的名称" + + field { + name "Connecting" + desc "" + type "SdnControllerStatus" + since "5.3.0" + } + field { + name "Connected" + desc "" + type "SdnControllerStatus" + since "5.3.0" + } + field { + name "Disconnected" + desc "" + type "SdnControllerStatus" + since "5.3.0" + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO.java index 64da98622e7..060884551f7 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO.java @@ -2,9 +2,11 @@ import org.zstack.header.identity.OwnedByAccount; import org.zstack.header.vo.BaseResource; +import org.zstack.header.vo.ForeignKey; import org.zstack.header.vo.NoView; import org.zstack.header.vo.ResourceVO; import org.zstack.header.vo.ToInventory; +import org.zstack.header.zone.ZoneEO; import javax.persistence.*; import java.sql.Timestamp; @@ -44,6 +46,15 @@ public class SdnControllerVO extends ResourceVO implements OwnedByAccount, ToInv @NoView private Set vxlanPools = new HashSet(); + @OneToMany(fetch=FetchType.EAGER) + @JoinColumn(name="sdnControllerUuid", insertable=false, updatable=false) + @NoView + private Set hostRefVOS = new HashSet(); + + @Column + @Enumerated(EnumType.STRING) + private SdnControllerStatus status; + @Column private Timestamp createDate; @@ -139,4 +150,20 @@ public String getAccountUuid() { public void setAccountUuid(String accountUuid) { this.accountUuid = accountUuid; } + + public SdnControllerStatus getStatus() { + return status; + } + + public void setStatus(SdnControllerStatus status) { + this.status = status; + } + + public Set getHostRefVOS() { + return hostRefVOS; + } + + public void setHostRefVOS(Set hostRefVOS) { + this.hostRefVOS = hostRefVOS; + } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO_.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO_.java index 033ed41e921..57d476a37b0 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO_.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO_.java @@ -14,6 +14,7 @@ public class SdnControllerVO_ extends ResourceVO_ { public static volatile SingularAttribute ip; public static volatile SingularAttribute username; public static volatile SingularAttribute password; + public static volatile SingularAttribute status; public static volatile SingularAttribute createDate; public static volatile SingularAttribute lastOpDate; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnVniRangeDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnVniRangeDoc_zh_cn.groovy index d110b4a83fe..6d7b8e26416 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnVniRangeDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnVniRangeDoc_zh_cn.groovy @@ -1,22 +1,21 @@ package org.zstack.sdnController.header -import java.lang.Integer import java.lang.Integer doc { - title "SDN控制Vni范围" + title "在这里输入结构的名称" field { name "startVni" desc "" type "Integer" - since "3.7" + since "5.3.0" } field { name "endVni" desc "" type "Integer" - since "3.7" + since "5.3.0" } } diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java index f8c66d4cd41..f4b415c6c8c 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java @@ -3,13 +3,17 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.net.util.SubnetUtils; import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; +import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.db.Q; import org.zstack.header.core.Completion; import org.zstack.header.identity.AccountInventory; import org.zstack.header.identity.AccountVO; import org.zstack.header.identity.AccountVO_; +import org.zstack.header.message.Message; import org.zstack.header.network.l2.APICreateL2NetworkMsg; +import org.zstack.header.network.l2.L2NetworkInventory; import org.zstack.header.network.l2.L2NetworkVO; import org.zstack.header.network.l3.*; import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; @@ -33,15 +37,23 @@ public class SugonSdnController implements TfSdnController, SdnController { private static final CLogger logger = Utils.getLogger(SugonSdnController.class); - private SdnControllerVO sdnControllerVO; + @Autowired + CloudBus bus; + private SdnControllerVO sdnControllerVO; private TfHttpClient client; + public SugonSdnController(SdnControllerVO vo) { sdnControllerVO = vo; client = new TfHttpClient(vo.getIp()); } + @Override + public void handleMessage(SdnControllerMessage msg) { + bus.dealWithUnknownMessage((Message) msg); + } + @Override public void preInitSdnController(APIAddSdnControllerMsg msg, Completion completion) { try { @@ -93,7 +105,7 @@ public void initSdnController(APIAddSdnControllerMsg msg, Completion completion) } @Override - public void postInitSdnController(APIAddSdnControllerMsg msg, Completion completion){ + public void postInitSdnController(SdnControllerVO vo, Completion completion){ completion.success(); } @@ -103,7 +115,7 @@ public void preCreateVxlanNetwork(L2VxlanNetworkInventory vxlan, List sy } @Override - public void createVxlanNetwork(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion) { + public void createL2Network(L2NetworkInventory inv, List systemTags, Completion completion) { completion.success(); } @@ -216,7 +228,7 @@ public void detachL2NetworkFromCluster(L2VxlanNetworkInventory vxlan, String clu } @Override - public void deleteVxlanNetwork(L2VxlanNetworkInventory vxlan, Completion completion) { + public void deleteL2Network(L2NetworkInventory vxlan, Completion completion) { completion.success(); } diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/RemoteVtepInventoryDoc_zh_cn.groovy b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/RemoteVtepInventoryDoc_zh_cn.groovy index 543c38170ba..d6861749481 100644 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/RemoteVtepInventoryDoc_zh_cn.groovy +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/RemoteVtepInventoryDoc_zh_cn.groovy @@ -5,48 +5,54 @@ import java.sql.Timestamp doc { - title "远端VXLAN隧道端点清单" + title "在这里输入结构的名称" field { name "uuid" desc "资源的UUID,唯一标示该资源" type "String" - since "4.7.11" + since "5.3.0" + } + field { + name "clusterUuid" + desc "集群UUID" + type "String" + since "5.3.0" } field { name "vtepIp" - desc "隧道端点IP地址" + desc "" type "String" - since "4.7.11" + since "5.3.0" } field { name "port" - desc "端口" + desc "" type "Integer" - since "4.7.11" + since "5.3.0" } field { name "type" - desc "类型" + desc "" type "String" - since "4.7.11" + since "5.3.0" } field { name "createDate" desc "创建时间" type "Timestamp" - since "4.7.11" + since "5.3.0" } field { name "lastOpDate" desc "最后一次修改时间" type "Timestamp" - since "4.7.11" + since "5.3.0" } field { name "poolUuid" - desc "VXLAN资源池UUID" + desc "" type "String" - since "4.7.11" + since "5.3.0" } } diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/VtepInventoryDoc_zh_cn.groovy b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/VtepInventoryDoc_zh_cn.groovy index f315f9f4aec..8aca6410900 100644 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/VtepInventoryDoc_zh_cn.groovy +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/VtepInventoryDoc_zh_cn.groovy @@ -2,58 +2,63 @@ package org.zstack.network.l2.vxlan.vtep import java.lang.Integer import java.sql.Timestamp -import java.sql.Timestamp doc { - title "VXLAN隧道端点清单" + title "在这里输入结构的名称" field { name "uuid" desc "资源的UUID,唯一标示该资源" type "String" - since "0.6" + since "5.3.0" } field { name "hostUuid" desc "物理机UUID" type "String" - since "0.6" + since "5.3.0" } field { name "vtepIp" - desc "隧道端点IP地址" + desc "" type "String" - since "0.6" + since "5.3.0" } field { name "port" - desc "端口" + desc "" type "Integer" - since "0.6" + since "5.3.0" } field { name "type" - desc "类型" + desc "" + type "String" + since "5.3.0" + } + field { + name "physicalInterface" + desc "" type "String" - since "0.6" + since "5.3.0" } field { name "createDate" desc "创建时间" type "Timestamp" - since "0.6" + since "5.3.0" } field { name "lastOpDate" desc "最后一次修改时间" type "Timestamp" - since "0.6" + since "5.3.0" } field { name "poolUuid" - desc "VXLAN资源池UUID" + desc "" type "String" - since "0.6" + since "5.3.0" } } diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/L2VxlanNetworkInventoryDoc_zh_cn.groovy b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/L2VxlanNetworkInventoryDoc_zh_cn.groovy index 0937786427c..6b7197330d6 100644 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/L2VxlanNetworkInventoryDoc_zh_cn.groovy +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/L2VxlanNetworkInventoryDoc_zh_cn.groovy @@ -1,77 +1,101 @@ package org.zstack.network.l2.vxlan.vxlanNetwork import java.lang.Integer -import java.sql.Timestamp +import java.lang.Boolean import java.sql.Timestamp doc { - title "二层VXLAN网络清单" + title "在这里输入结构的名称" field { name "vni" - desc "Vni号" + desc "" type "Integer" - since "0.6" + since "5.3.0" } field { name "poolUuid" - desc "VXLAN资源池UUID" + desc "" type "String" - since "0.6" + since "5.3.0" } field { name "uuid" desc "资源的UUID,唯一标示该资源" type "String" - since "0.6" + since "5.3.0" } field { name "name" desc "资源名称" type "String" - since "0.6" + since "5.3.0" } field { name "description" desc "资源的详细描述" type "String" - since "0.6" + since "5.3.0" } field { name "zoneUuid" desc "区域UUID" type "String" - since "0.6" + since "5.3.0" } field { name "physicalInterface" - desc "物理网卡" + desc "" type "String" - since "0.6" + since "5.3.0" } field { name "type" - desc "二层网络类型" + desc "" + type "String" + since "5.3.0" + } + field { + name "vSwitchType" + desc "" + type "String" + since "5.3.0" + } + field { + name "virtualNetworkId" + desc "" + type "Integer" + since "5.3.0" + } + field { + name "isolated" + desc "" + type "Boolean" + since "5.3.0" + } + field { + name "pvlan" + desc "" type "String" - since "0.6" + since "5.3.0" } field { name "createDate" desc "创建时间" type "Timestamp" - since "0.6" + since "5.3.0" } field { name "lastOpDate" desc "最后一次修改时间" type "Timestamp" - since "0.6" + since "5.3.0" } field { name "attachedClusterUuids" - desc "挂载集群的UUID列表" + desc "" type "List" - since "0.6" + since "5.3.0" } } diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetwork.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetwork.java index 5c233074ca1..e7cd24f1cf2 100755 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetwork.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetwork.java @@ -74,7 +74,8 @@ private VxlanNetworkVO getSelf() { @Override public void deleteHook(Completion completion) { - if (L2NetworkGlobalConfig.DeleteL2BridgePhysically.value(Boolean.class)) { + if (L2NetworkGlobalConfig.DeleteL2BridgePhysically.value(Boolean.class) + && getVSwitchType().isAttachToCluster()) { deleteL2Bridge(completion); } else { completion.success(); diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VniRangeInventoryDoc_zh_cn.groovy b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VniRangeInventoryDoc_zh_cn.groovy index 7362248055d..d9da8fd3aaf 100644 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VniRangeInventoryDoc_zh_cn.groovy +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VniRangeInventoryDoc_zh_cn.groovy @@ -1,60 +1,58 @@ package org.zstack.network.l2.vxlan.vxlanNetworkPool import java.lang.Integer -import java.lang.Integer -import java.sql.Timestamp import java.sql.Timestamp doc { - title "vni范围清单" + title "在这里输入结构的名称" field { name "uuid" desc "资源的UUID,唯一标示该资源" type "String" - since "0.6" + since "5.3.0" } field { name "name" desc "资源名称" type "String" - since "0.6" + since "5.3.0" } field { name "description" desc "资源的详细描述" type "String" - since "0.6" + since "5.3.0" } field { name "startVni" - desc "起始VNI" + desc "" type "Integer" - since "0.6" + since "5.3.0" } field { name "endVni" - desc "结束VNI" + desc "" type "Integer" - since "0.6" + since "5.3.0" } field { name "createDate" desc "创建时间" type "Timestamp" - since "0.6" + since "5.3.0" } field { name "lastOpDate" desc "最后一次修改时间" type "Timestamp" - since "0.6" + since "5.3.0" } field { name "l2NetworkUuid" desc "二层网络UUID" type "String" - since "0.6" + since "5.3.0" } } diff --git a/rest/src/main/resources/scripts/RestDocumentationGenerator.groovy b/rest/src/main/resources/scripts/RestDocumentationGenerator.groovy index 4f8d5e81fc7..3bad534aa29 100755 --- a/rest/src/main/resources/scripts/RestDocumentationGenerator.groovy +++ b/rest/src/main/resources/scripts/RestDocumentationGenerator.groovy @@ -529,7 +529,7 @@ class RestDocumentationGenerator implements DocumentGenerator { Set apiClasses = getRequestRequestApiSet() apiClasses.each { - println("generating doc template for class ${it}") + logger.info("generating doc template for class ${it}") def tmp = new ApiRequestDocTemplate(it) tmp.generateDocFile(mode) } @@ -550,6 +550,9 @@ class RestDocumentationGenerator implements DocumentGenerator { String specifiedClasses = System.getProperty("classes") + apiClasses.forEach {it -> + logger.info("apiClasses 1: ${it}".toString()) + } if (specifiedClasses != null) { def classes = specifiedClasses.split(",") as List apiClasses = apiClasses.findAll { @@ -563,6 +566,10 @@ class RestDocumentationGenerator implements DocumentGenerator { } } + apiClasses.forEach {it -> + logger.info("apiClasses 2: ${it}".toString()) + } + return apiClasses } diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 0afab377d0f..0700d46718c 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -490,6 +490,8 @@ public class SourceClassMap { put("org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory", "org.zstack.sdk.L2VxlanNetworkInventory"); put("org.zstack.network.l2.vxlan.vxlanNetworkPool.L2VxlanNetworkPoolInventory", "org.zstack.sdk.L2VxlanNetworkPoolInventory"); put("org.zstack.network.l2.vxlan.vxlanNetworkPool.VniRangeInventory", "org.zstack.sdk.VniRangeInventory"); + put("org.zstack.network.ovn.OvnControllerVmInstanceInventory", "org.zstack.sdk.OvnControllerVmInstanceInventory"); + put("org.zstack.network.ovn.OvnControllerVmOfferingInventory", "org.zstack.sdk.OvnControllerVmOfferingInventory"); put("org.zstack.network.securitygroup.SecurityGroupIngressRuleTO", "org.zstack.sdk.SecurityGroupIngressRuleTO"); put("org.zstack.network.securitygroup.SecurityGroupInventory", "org.zstack.sdk.SecurityGroupInventory"); put("org.zstack.network.securitygroup.SecurityGroupRuleInventory", "org.zstack.sdk.SecurityGroupRuleInventory"); @@ -578,7 +580,9 @@ public class SourceClassMap { put("org.zstack.resourceconfig.ResourceConfigInventory", "org.zstack.sdk.ResourceConfigInventory"); put("org.zstack.resourceconfig.ResourceConfigStruct", "org.zstack.sdk.ResourceConfigStruct"); put("org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory", "org.zstack.sdk.HardwareL2VxlanNetworkPoolInventory"); + put("org.zstack.sdnController.header.SdnControllerHostRefInventory", "org.zstack.sdk.SdnControllerHostRefInventory"); put("org.zstack.sdnController.header.SdnControllerInventory", "org.zstack.sdk.SdnControllerInventory"); + put("org.zstack.sdnController.header.SdnControllerStatus", "org.zstack.sdk.SdnControllerStatus"); put("org.zstack.sdnController.header.SdnVniRange", "org.zstack.sdk.SdnVniRange"); put("org.zstack.snmp.agent.SnmpAgentInventory", "org.zstack.sdk.SnmpAgentInventory"); put("org.zstack.sns.SNSAliyunSmsEndpointInventory", "org.zstack.sdk.sns.SNSAliyunSmsEndpointInventory"); @@ -1141,6 +1145,8 @@ public class SourceClassMap { put("org.zstack.sdk.OvfOSInfo", "org.zstack.ovf.datatype.OvfOSInfo"); put("org.zstack.sdk.OvfSystemInfo", "org.zstack.ovf.datatype.OvfSystemInfo"); put("org.zstack.sdk.OvfVolumeInfo", "org.zstack.ovf.datatype.OvfVolumeInfo"); + put("org.zstack.sdk.OvnControllerVmInstanceInventory", "org.zstack.network.ovn.OvnControllerVmInstanceInventory"); + put("org.zstack.sdk.OvnControllerVmOfferingInventory", "org.zstack.network.ovn.OvnControllerVmOfferingInventory"); put("org.zstack.sdk.PacketsForwardType", "org.zstack.vpcfirewall.entity.PacketsForwardType"); put("org.zstack.sdk.Pagination", "org.zstack.billing.Pagination"); put("org.zstack.sdk.PciDeviceBillingInventory", "org.zstack.billing.generator.pcidevice.PciDeviceBillingInventory"); @@ -1247,7 +1253,9 @@ public class SourceClassMap { put("org.zstack.sdk.ScsiLunHostRefInventory", "org.zstack.header.storageDevice.ScsiLunHostRefInventory"); put("org.zstack.sdk.ScsiLunInventory", "org.zstack.header.storageDevice.ScsiLunInventory"); put("org.zstack.sdk.ScsiLunVmInstanceRefInventory", "org.zstack.header.storageDevice.ScsiLunVmInstanceRefInventory"); + put("org.zstack.sdk.SdnControllerHostRefInventory", "org.zstack.sdnController.header.SdnControllerHostRefInventory"); put("org.zstack.sdk.SdnControllerInventory", "org.zstack.sdnController.header.SdnControllerInventory"); + put("org.zstack.sdk.SdnControllerStatus", "org.zstack.sdnController.header.SdnControllerStatus"); put("org.zstack.sdk.SdnVniRange", "org.zstack.sdnController.header.SdnVniRange"); put("org.zstack.sdk.SecretResourcePoolInventory", "org.zstack.header.securitymachine.SecretResourcePoolInventory"); put("org.zstack.sdk.SecurityGroupIngressRuleTO", "org.zstack.network.securitygroup.SecurityGroupIngressRuleTO"); diff --git a/sdk/src/main/java/org/zstack/sdk/AddSdnControllerAction.java b/sdk/src/main/java/org/zstack/sdk/AddSdnControllerAction.java index dd215c32e2c..b0b11f2877c 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddSdnControllerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddSdnControllerAction.java @@ -37,10 +37,10 @@ public Result throwExceptionIfError() { @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String ip; - @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String userName; - @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String password; @Param(required = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkAction.java index 603d3506380..75b58922b3f 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkAction.java @@ -46,7 +46,7 @@ public Result throwExceptionIfError() { @Param(required = false) public java.lang.String type; - @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan","OvnDpdk"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vSwitchType = "LinuxBridge"; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkPoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkPoolAction.java index 269c0b19dde..0f7fa343e3b 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkPoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkPoolAction.java @@ -43,7 +43,7 @@ public Result throwExceptionIfError() { @Param(required = false) public java.lang.String type; - @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan","OvnDpdk"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vSwitchType = "LinuxBridge"; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2NoVlanNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2NoVlanNetworkAction.java index 355c0cfd0d9..2ac4abbb515 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2NoVlanNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2NoVlanNetworkAction.java @@ -34,13 +34,13 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String zoneUuid; - @Param(required = true, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String physicalInterface; @Param(required = false) public java.lang.String type; - @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan","OvnDpdk"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vSwitchType = "LinuxBridge"; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2PortGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2PortGroupAction.java index 981ee60bd47..981e1585b7d 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2PortGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2PortGroupAction.java @@ -52,7 +52,7 @@ public Result throwExceptionIfError() { @Param(required = false) public java.lang.String type; - @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan","OvnDpdk"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vSwitchType = "LinuxBridge"; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2TfNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2TfNetworkAction.java index 3af1ada4724..7a6c60d0147 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2TfNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2TfNetworkAction.java @@ -46,7 +46,7 @@ public Result throwExceptionIfError() { @Param(required = false) public java.lang.String type; - @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan","OvnDpdk"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vSwitchType = "LinuxBridge"; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2VirtualSwitchAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2VirtualSwitchAction.java index 3a0451b2d81..9bf1c6db389 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2VirtualSwitchAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2VirtualSwitchAction.java @@ -43,7 +43,7 @@ public Result throwExceptionIfError() { @Param(required = false) public java.lang.String type; - @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan","OvnDpdk"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vSwitchType = "LinuxBridge"; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2VlanNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2VlanNetworkAction.java index e98b837f6ce..76d3bed2ec6 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2VlanNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2VlanNetworkAction.java @@ -37,13 +37,13 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String zoneUuid; - @Param(required = true, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String physicalInterface; @Param(required = false) public java.lang.String type; - @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan","OvnDpdk"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vSwitchType = "LinuxBridge"; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkAction.java index 31f561ad2eb..638c8256942 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkAction.java @@ -46,7 +46,7 @@ public Result throwExceptionIfError() { @Param(required = false) public java.lang.String type; - @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan","OvnDpdk"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vSwitchType = "LinuxBridge"; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkPoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkPoolAction.java index 3fe9b6746ec..b6af5df6ebc 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkPoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkPoolAction.java @@ -40,7 +40,7 @@ public Result throwExceptionIfError() { @Param(required = false) public java.lang.String type; - @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan","OvnDpdk"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vSwitchType = "LinuxBridge"; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerOfferingAction.java new file mode 100644 index 00000000000..2df361d1b18 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerOfferingAction.java @@ -0,0 +1,137 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateOvnControllerOfferingAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.CreateInstanceOfferingResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String managementNetworkUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String imageUuid; + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {1L,1024L}, noTrim = false) + public int cpuNum = 0; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {1L,9223372036854775807L}, numberRangeUnit = {"byte", "bytes"}, noTrim = false) + public long memorySize = 0L; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {0L,9223372036854775807L}, numberRangeUnit = {"byte", "bytes"}, noTrim = false) + public long reservedMemorySize = 0L; + + @Param(required = false) + public java.lang.String allocatorStrategy; + + @Param(required = false) + public int sortKey = 0; + + @Param(required = false) + public java.lang.String type; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.CreateInstanceOfferingResult value = res.getResult(org.zstack.sdk.CreateInstanceOfferingResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateInstanceOfferingResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/instance-offerings/ovn"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmAction.java b/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmAction.java new file mode 100644 index 00000000000..a7980599395 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmAction.java @@ -0,0 +1,191 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateOvnControllerVmAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.CreateOvnControllerVmResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String instanceOfferingUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer cpuNum; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long memorySize; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {0L,9223372036854775807L}, noTrim = false) + public java.lang.Long reservedMemorySize; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = false, noTrim = false) + public java.lang.String imageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List l3NetworkUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmNicParams; + + @Param(required = false, validValues = {"UserVm","ApplianceVm"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String rootDiskOfferingUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long rootDiskSize; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List dataDiskSizes; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List dataDiskOfferingUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clusterUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String primaryStorageUuidForRootVolume; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false) + public java.lang.String defaultL3NetworkUuid; + + @Param(required = false, validValues = {"InstantStart","JustCreate","CreateStopped"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String strategy = "InstantStart"; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List rootVolumeSystemTags; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List dataVolumeSystemTags; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map dataVolumeSystemTagsOnIndex; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List sshKeyPairUuids; + + @Param(required = false, validValues = {"Linux","Windows","Other","Paravirtualization","WindowsVirtio"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String platform; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String guestOsType; + + @Param(required = false, validValues = {"x86_64","aarch64","mips64el","loongarch64"}, maxLength = 32, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String architecture; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean virtio; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List diskAOs; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.CreateOvnControllerVmResult value = res.getResult(org.zstack.sdk.CreateOvnControllerVmResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateOvnControllerVmResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/ovn/instances"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmResult.java b/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmResult.java new file mode 100644 index 00000000000..0626381448e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ApplianceVmInventory; + +public class CreateOvnControllerVmResult { + public ApplianceVmInventory inventory; + public void setInventory(ApplianceVmInventory inventory) { + this.inventory = inventory; + } + public ApplianceVmInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetVfPciDeviceAvailableInL2NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/GetVfPciDeviceAvailableInL2NetworkAction.java new file mode 100644 index 00000000000..1425944c4a4 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetVfPciDeviceAvailableInL2NetworkAction.java @@ -0,0 +1,95 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetVfPciDeviceAvailableInL2NetworkAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.GetVfPciDeviceAvailableInL2NetworkResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.util.List l2NetworkUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.GetVfPciDeviceAvailableInL2NetworkResult value = res.getResult(org.zstack.sdk.GetVfPciDeviceAvailableInL2NetworkResult.class); + ret.value = value == null ? new org.zstack.sdk.GetVfPciDeviceAvailableInL2NetworkResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/l2-networks/vf-pci-devices-available"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetVfPciDeviceAvailableInL2NetworkResult.java b/sdk/src/main/java/org/zstack/sdk/GetVfPciDeviceAvailableInL2NetworkResult.java new file mode 100644 index 00000000000..bab64b886fe --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetVfPciDeviceAvailableInL2NetworkResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class GetVfPciDeviceAvailableInL2NetworkResult { + public java.util.Map l2VfAvailableClusters; + public void setL2VfAvailableClusters(java.util.Map l2VfAvailableClusters) { + this.l2VfAvailableClusters = l2VfAvailableClusters; + } + public java.util.Map getL2VfAvailableClusters() { + return this.l2VfAvailableClusters; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceInventory.java b/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceInventory.java index 4b03e11912f..67af57c5a75 100644 --- a/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceInventory.java @@ -148,6 +148,14 @@ public java.lang.String getPciDeviceAddress() { return this.pciDeviceAddress; } + public java.lang.String driverType; + public void setDriverType(java.lang.String driverType) { + this.driverType = driverType; + } + public java.lang.String getDriverType() { + return this.driverType; + } + public java.lang.String offloadStatus; public void setOffloadStatus(java.lang.String offloadStatus) { this.offloadStatus = offloadStatus; diff --git a/sdk/src/main/java/org/zstack/sdk/OvnControllerVmInstanceInventory.java b/sdk/src/main/java/org/zstack/sdk/OvnControllerVmInstanceInventory.java new file mode 100644 index 00000000000..3a68e782b29 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/OvnControllerVmInstanceInventory.java @@ -0,0 +1,8 @@ +package org.zstack.sdk; + + + +public class OvnControllerVmInstanceInventory extends org.zstack.sdk.ApplianceVmInventory { + + +} diff --git a/sdk/src/main/java/org/zstack/sdk/OvnControllerVmOfferingInventory.java b/sdk/src/main/java/org/zstack/sdk/OvnControllerVmOfferingInventory.java new file mode 100644 index 00000000000..49e6a80e53b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/OvnControllerVmOfferingInventory.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + + + +public class OvnControllerVmOfferingInventory extends org.zstack.sdk.InstanceOfferingInventory { + + public java.lang.String managementNetworkUuid; + public void setManagementNetworkUuid(java.lang.String managementNetworkUuid) { + this.managementNetworkUuid = managementNetworkUuid; + } + public java.lang.String getManagementNetworkUuid() { + return this.managementNetworkUuid; + } + + public java.lang.String zoneUuid; + public void setZoneUuid(java.lang.String zoneUuid) { + this.zoneUuid = zoneUuid; + } + public java.lang.String getZoneUuid() { + return this.zoneUuid; + } + + public java.lang.String imageUuid; + public void setImageUuid(java.lang.String imageUuid) { + this.imageUuid = imageUuid; + } + public java.lang.String getImageUuid() { + return this.imageUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectSdnControllerAction.java b/sdk/src/main/java/org/zstack/sdk/ReconnectSdnControllerAction.java new file mode 100644 index 00000000000..f0e74e26df5 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectSdnControllerAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class ReconnectSdnControllerAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.ReconnectSdnControllerResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String sdnControllerUuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.ReconnectSdnControllerResult value = res.getResult(org.zstack.sdk.ReconnectSdnControllerResult.class); + ret.value = value == null ? new org.zstack.sdk.ReconnectSdnControllerResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/sdn-controllers/{sdnControllerUuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "reconnectSdnController"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectSdnControllerResult.java b/sdk/src/main/java/org/zstack/sdk/ReconnectSdnControllerResult.java new file mode 100644 index 00000000000..875ea6bd980 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectSdnControllerResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SdnControllerInventory; + +public class ReconnectSdnControllerResult { + public SdnControllerInventory inventory; + public void setInventory(SdnControllerInventory inventory) { + this.inventory = inventory; + } + public SdnControllerInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerAddHostAction.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerAddHostAction.java new file mode 100644 index 00000000000..f38a2a2e586 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerAddHostAction.java @@ -0,0 +1,122 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class SdnControllerAddHostAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.SdnControllerAddHostResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String sdnControllerUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @Param(required = false, validValues = {"OvnDpdk","OvnKernel"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vSwitchType = "OvnDpdk"; + + @Param(required = true, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.util.List nicNames; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vtepIp; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String netmask; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String bondMode; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String lacpMode; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.SdnControllerAddHostResult value = res.getResult(org.zstack.sdk.SdnControllerAddHostResult.class); + ret.value = value == null ? new org.zstack.sdk.SdnControllerAddHostResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/sdn-controllers/{sdnControllerUuid}/hosts/{hostUuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "null"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerAddHostResult.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerAddHostResult.java new file mode 100644 index 00000000000..1fce8c1b26e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerAddHostResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SdnControllerInventory; + +public class SdnControllerAddHostResult { + public SdnControllerInventory inventory; + public void setInventory(SdnControllerInventory inventory) { + this.inventory = inventory; + } + public SdnControllerInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerChangeHostAction.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerChangeHostAction.java new file mode 100644 index 00000000000..2a79c889b76 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerChangeHostAction.java @@ -0,0 +1,122 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class SdnControllerChangeHostAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.SdnControllerChangeHostResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String sdnControllerUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @Param(required = false, validValues = {"OvnDpdk","OvnKernel"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vSwitchType = "OvnDpdk"; + + @Param(required = false, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.util.List nicNames; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vtepIp; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String netmask; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String bondMode; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String lacpMode; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.SdnControllerChangeHostResult value = res.getResult(org.zstack.sdk.SdnControllerChangeHostResult.class); + ret.value = value == null ? new org.zstack.sdk.SdnControllerChangeHostResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/sdn-controllers/{sdnControllerUuid}/hosts/{hostUuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "sdnControllerChangeHost"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerChangeHostResult.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerChangeHostResult.java new file mode 100644 index 00000000000..eac4f6da547 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerChangeHostResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SdnControllerInventory; + +public class SdnControllerChangeHostResult { + public SdnControllerInventory inventory; + public void setInventory(SdnControllerInventory inventory) { + this.inventory = inventory; + } + public SdnControllerInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerHostRefInventory.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerHostRefInventory.java new file mode 100644 index 00000000000..0d7dda066b9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerHostRefInventory.java @@ -0,0 +1,79 @@ +package org.zstack.sdk; + + + +public class SdnControllerHostRefInventory { + + public java.lang.String sdnControllerUuid; + public void setSdnControllerUuid(java.lang.String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + public java.lang.String getSdnControllerUuid() { + return this.sdnControllerUuid; + } + + public java.lang.String hostUuid; + public void setHostUuid(java.lang.String hostUuid) { + this.hostUuid = hostUuid; + } + public java.lang.String getHostUuid() { + return this.hostUuid; + } + + public java.lang.String vSwitchType; + public void setVSwitchType(java.lang.String vSwitchType) { + this.vSwitchType = vSwitchType; + } + public java.lang.String getVSwitchType() { + return this.vSwitchType; + } + + public java.lang.String vtepIp; + public void setVtepIp(java.lang.String vtepIp) { + this.vtepIp = vtepIp; + } + public java.lang.String getVtepIp() { + return this.vtepIp; + } + + public java.lang.String nicPciAddresses; + public void setNicPciAddresses(java.lang.String nicPciAddresses) { + this.nicPciAddresses = nicPciAddresses; + } + public java.lang.String getNicPciAddresses() { + return this.nicPciAddresses; + } + + public java.lang.String nicDrivers; + public void setNicDrivers(java.lang.String nicDrivers) { + this.nicDrivers = nicDrivers; + } + public java.lang.String getNicDrivers() { + return this.nicDrivers; + } + + public java.lang.String netmask; + public void setNetmask(java.lang.String netmask) { + this.netmask = netmask; + } + public java.lang.String getNetmask() { + return this.netmask; + } + + public java.lang.String bondMode; + public void setBondMode(java.lang.String bondMode) { + this.bondMode = bondMode; + } + public java.lang.String getBondMode() { + return this.bondMode; + } + + public java.lang.String lacpMode; + public void setLacpMode(java.lang.String lacpMode) { + this.lacpMode = lacpMode; + } + public java.lang.String getLacpMode() { + return this.lacpMode; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerInventory.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerInventory.java index 68878cedec1..9ee1e373677 100644 --- a/sdk/src/main/java/org/zstack/sdk/SdnControllerInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk; - +import org.zstack.sdk.SdnControllerStatus; public class SdnControllerInventory { @@ -60,6 +60,14 @@ public java.lang.String getPassword() { return this.password; } + public SdnControllerStatus status; + public void setStatus(SdnControllerStatus status) { + this.status = status; + } + public SdnControllerStatus getStatus() { + return this.status; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; @@ -92,4 +100,12 @@ public java.util.List getVxlanPools() { return this.vxlanPools; } + public java.util.List hostRefs; + public void setHostRefs(java.util.List hostRefs) { + this.hostRefs = hostRefs; + } + public java.util.List getHostRefs() { + return this.hostRefs; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerRemoveHostAction.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerRemoveHostAction.java new file mode 100644 index 00000000000..44fb47d5a2e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerRemoveHostAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class SdnControllerRemoveHostAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.SdnControllerRemoveHostResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String sdnControllerUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @Param(required = false, validValues = {"OvnDpdk","OvnKernel"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vSwitchType = "OvnDpdk"; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.SdnControllerRemoveHostResult value = res.getResult(org.zstack.sdk.SdnControllerRemoveHostResult.class); + ret.value = value == null ? new org.zstack.sdk.SdnControllerRemoveHostResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/sdn-controllers/{sdnControllerUuid}/hosts/{hostUuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerRemoveHostResult.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerRemoveHostResult.java new file mode 100644 index 00000000000..35798792306 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerRemoveHostResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SdnControllerInventory; + +public class SdnControllerRemoveHostResult { + public SdnControllerInventory inventory; + public void setInventory(SdnControllerInventory inventory) { + this.inventory = inventory; + } + public SdnControllerInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerStatus.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerStatus.java new file mode 100644 index 00000000000..1e9e6f92289 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerStatus.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + +public enum SdnControllerStatus { + Connecting, + Connected, + Disconnected, +} diff --git a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy index 0bc371e5434..36072291389 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy @@ -54,7 +54,7 @@ class SdnControllerCase extends SubCase { addSdnController { vendorType = SdnControllerConstant.H3C_VCFC_CONTROLLER name = "sdn2" - ip = "127.1.1.1" + ip = "192.168.1.1" userName = "user" password = "password" } @@ -63,7 +63,7 @@ class SdnControllerCase extends SubCase { SdnControllerInventory sdn2 = addSdnController { vendorType = SdnControllerConstant.H3C_VCFC_CONTROLLER name = "sdn1" - ip = "127.1.1.1" + ip = "192.168.1.1" userName = "user" password = "password" systemTags = [String.format("vdsUuid::%s", h3cVdsUuid), String.format("tenantUuid::%s", inputTenantUuid), String.format("startVni::%s::endVni::%s", sVni, eVni)] @@ -80,6 +80,18 @@ class SdnControllerCase extends SubCase { /* this result depends on the simulator */ assert sdn2.vniRanges.size() == 3 + /* can not add controller with same ip again */ + expectError { + addSdnController { + vendorType = SdnControllerConstant.H3C_VCFC_CONTROLLER + name = "sdn2" + ip = "192.168.1.1" + userName = "user" + password = "password" + systemTags = [String.format("vdsUuid::%s", h3cVdsUuid), String.format("tenantUuid::%s", inputTenantUuid), String.format("startVni::%s::endVni::%s", sVni, eVni)] + } + } + updateSdnController { uuid = sdn2.uuid name = "sdn2" diff --git a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerEnv.groovy b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerEnv.groovy index c7e47480afa..725e997d374 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerEnv.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerEnv.groovy @@ -80,7 +80,7 @@ class SdnControllerEnv { sdnController { vendorType = "H3C VCFC" name = "h3c" - ip = "127.0.0.1" + ip = "192.168.0.1" userName = "user" password = "password" systemTags = ["vdsUuid::234567"] diff --git a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SugonSdnControllerEnv.groovy b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SugonSdnControllerEnv.groovy index 00623ff866b..57c9ff3dcb8 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SugonSdnControllerEnv.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SugonSdnControllerEnv.groovy @@ -84,7 +84,7 @@ class SugonSdnControllerEnv { sdnController { vendorType = "TF" name = "tf" - ip = "127.0.0.1" + ip = "192.168.0.1" userName = "user" password = "password" } diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 372f09b4c05..b3df22e1b94 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -10169,6 +10169,60 @@ abstract class ApiHelper { } + def createOvnControllerOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateOvnControllerOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.CreateOvnControllerOfferingAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def createOvnControllerVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateOvnControllerVmAction.class) Closure c) { + def a = new org.zstack.sdk.CreateOvnControllerVmAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def createPciDeviceOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePciDeviceOfferingAction.class) Closure c) { def a = new org.zstack.sdk.CreatePciDeviceOfferingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -13253,7 +13307,6 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -13280,7 +13333,6 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -13374,7 +13426,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -13401,7 +13453,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -14913,7 +14965,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -14940,7 +14992,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -14994,7 +15046,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -15021,7 +15073,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -24155,6 +24207,33 @@ abstract class ApiHelper { } + def getVfPciDeviceAvailableInL2Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVfPciDeviceAvailableInL2NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.GetVfPciDeviceAvailableInL2NetworkAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def getVipAvailablePort(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVipAvailablePortAction.class) Closure c) { def a = new org.zstack.sdk.GetVipAvailablePortAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -35513,6 +35592,33 @@ abstract class ApiHelper { } + def reconnectSdnController(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectSdnControllerAction.class) Closure c) { + def a = new org.zstack.sdk.ReconnectSdnControllerAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def reconnectSftpBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectSftpBackupStorageAction.class) Closure c) { def a = new org.zstack.sdk.ReconnectSftpBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -37322,6 +37428,87 @@ abstract class ApiHelper { } + def sdnControllerAddHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SdnControllerAddHostAction.class) Closure c) { + def a = new org.zstack.sdk.SdnControllerAddHostAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def sdnControllerChangeHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SdnControllerChangeHostAction.class) Closure c) { + def a = new org.zstack.sdk.SdnControllerChangeHostAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def sdnControllerRemoveHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SdnControllerRemoveHostAction.class) Closure c) { + def a = new org.zstack.sdk.SdnControllerRemoveHostAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def securityMachineDetectSync(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SecurityMachineDetectSyncAction.class) Closure c) { def a = new org.zstack.sdk.SecurityMachineDetectSyncAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -41648,7 +41835,6 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -41675,7 +41861,6 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - if (System.getProperty("apipath") != null) { if (a.apiId == null) { diff --git a/testlib/src/main/java/org/zstack/testlib/KVMSimulator.groovy b/testlib/src/main/java/org/zstack/testlib/KVMSimulator.groovy index 839662037c9..183de054f91 100755 --- a/testlib/src/main/java/org/zstack/testlib/KVMSimulator.groovy +++ b/testlib/src/main/java/org/zstack/testlib/KVMSimulator.groovy @@ -438,6 +438,30 @@ class KVMSimulator implements Simulator { return new KVMAgentCommands.AgentResponse() } + spec.simulator(KVMConstant.KVM_INSTALL_OVS_PACKAGE_PATH) { + return new KVMAgentCommands.AgentResponse() + } + + spec.simulator(KVMConstant.KVM_UNINSTALL_OVS_PACKAGE_PATH) { + return new KVMAgentCommands.AgentResponse() + } + + spec.simulator(KVMConstant.KVM_START_OVS_SERVICE_PATH) { + return new KVMAgentCommands.AgentResponse() + } + + spec.simulator(KVMConstant.KVM_STOP_OVS_SERVICE_PATH) { + return new KVMAgentCommands.AgentResponse() + } + + spec.simulator(KVMConstant.KVM_OVS_ADD_PORT_PATH) { + return new KVMAgentCommands.AgentResponse() + } + + spec.simulator(KVMConstant.KVM_OVS_DEL_PORT_PATH) { + return new KVMAgentCommands.AgentResponse() + } + spec.simulator(KVMConstant.KVM_SYNC_VM_DEVICEINFO_PATH) { HttpEntity e -> SyncVmDeviceInfoCmd cmd = JSONObjectUtil.toObject(e.body, SyncVmDeviceInfoCmd.class) def rsp = new SyncVmDeviceInfoResponse() From 40b76aa26fc8b3010eab621d2ebc6cf080db89f8 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Fri, 14 Feb 2025 18:53:12 +0800 Subject: [PATCH 256/737] [conf]: Fix model service schema upgrade - If framework is old format value, upgrade to source - If framework is in upgraded format and no source is set just update source field to Other DBImpact Resolves: ZSTAC-72967 Change-Id: I7475647a62656b6267716d656a7475706263776a Signed-off-by: ye.zou --- conf/db/upgrade/V5.3.20__schema.sql | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.3.20__schema.sql b/conf/db/upgrade/V5.3.20__schema.sql index b6bbea92982..c8a21b505e4 100644 --- a/conf/db/upgrade/V5.3.20__schema.sql +++ b/conf/db/upgrade/V5.3.20__schema.sql @@ -87,7 +87,11 @@ ALTER TABLE `zstack`.`BaremetalNicVO` modify column mac varchar(255) DEFAULT NUL # 2. If source is Bentoml change framework to BentoML # 3. Else change framework to Other -UPDATE `zstack`.`ModelServiceVO` SET source = framework WHERE source IS NULL; +UPDATE `zstack`.`ModelServiceVO` SET source = framework WHERE source is NULL + AND framework in ('HuggingFace', 'Bentoml', 'Other'); + +UPDATE `zstack`.`ModelServiceVO` SET source = 'Other' WHERE source is NULL + AND framework not in ('HuggingFace', 'Bentoml', 'Other'); UPDATE `zstack`.`ModelServiceVO` SET framework = 'BentoML' WHERE source = 'Bentoml'; From 8a01d49ce6501696f23d8a28d9fb20c7cde936a2 Mon Sep 17 00:00:00 2001 From: littleya Date: Fri, 20 Dec 2024 18:16:34 +0800 Subject: [PATCH 257/737] [ceph]: fix that no fencer was setup when add ceph pool setup ceph fencer during add or delete ceph pools(which used by root volume) Resolves: ZSTAC-71651 Change-Id: I7a697a7169697579736178656c6e7a71616a7771 --- .../storage/ceph/primary/CephPrimaryStorageBase.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java index 08189587b9e..0228bcb7fce 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java @@ -4137,6 +4137,11 @@ private void handle(APIDeleteCephPrimaryStoragePoolMsg msg) { CephPrimaryStoragePoolVO vo = dbf.findByUuid(msg.getUuid(), CephPrimaryStoragePoolVO.class); dbf.remove(vo); osdHelper.recalculateAvailableCapacity(); + + for(CephPrimaryStorageMonAfterModifiedExtensionPoint ext : pluginRgty.getExtensionList(CephPrimaryStorageMonAfterModifiedExtensionPoint.class)) { + ext.afterModified(getSelf()); + } + bus.publish(evt); } @@ -4176,6 +4181,11 @@ private void addCephPrimaryStoragePool(APIAddCephPrimaryStoragePoolMsg msg, fina @Override public void success(AddPoolRsp rsp) { osdHelper.recalculateAvailableCapacity(); + + for(CephPrimaryStorageMonAfterModifiedExtensionPoint ext : pluginRgty.getExtensionList(CephPrimaryStorageMonAfterModifiedExtensionPoint.class)) { + ext.afterModified(getSelf()); + } + evt.setInventory(CephPrimaryStoragePoolInventory.valueOf(finalVo)); bus.publish(evt); completion.done(); From 1bd5b88219311ff7bec14990b68da160a86bb7ae Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Thu, 23 Jan 2025 18:12:18 +0800 Subject: [PATCH 258/737] [sdk]: support refresh sso server token APIImpact Resolves: ZSTAC-72662 Change-Id: I7a6d72662a707062636c716c657669776c670469 --- .../sdk/RefreshSSOServerTokenAction.java | 104 ++++++++++++++++++ .../sdk/RefreshSSOServerTokenResult.java | 14 +++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ 3 files changed, 145 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/RefreshSSOServerTokenAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/RefreshSSOServerTokenResult.java diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshSSOServerTokenAction.java b/sdk/src/main/java/org/zstack/sdk/RefreshSSOServerTokenAction.java new file mode 100644 index 00000000000..e9bafeb0065 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/RefreshSSOServerTokenAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class RefreshSSOServerTokenAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.RefreshSSOServerTokenResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String token; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {60L,31536000L}, noTrim = false) + public java.lang.Long duration; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.RefreshSSOServerTokenResult value = res.getResult(org.zstack.sdk.RefreshSSOServerTokenResult.class); + ret.value = value == null ? new org.zstack.sdk.RefreshSSOServerTokenResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/sso/server/token/refresh"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "refreshSSOServerToken"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshSSOServerTokenResult.java b/sdk/src/main/java/org/zstack/sdk/RefreshSSOServerTokenResult.java new file mode 100644 index 00000000000..2ab2a219149 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/RefreshSSOServerTokenResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SSOServerTokenInventory; + +public class RefreshSSOServerTokenResult { + public SSOServerTokenInventory inventory; + public void setInventory(SSOServerTokenInventory inventory) { + this.inventory = inventory; + } + public SSOServerTokenInventory getInventory() { + return this.inventory; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index b3df22e1b94..dbca0348e73 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -36078,6 +36078,33 @@ abstract class ApiHelper { } + def refreshSSOServerToken(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshSSOServerTokenAction.class) Closure c) { + def a = new org.zstack.sdk.RefreshSSOServerTokenAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def refreshSearchIndexes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshSearchIndexesAction.class) Closure c) { def a = new org.zstack.sdk.RefreshSearchIndexesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From efc12524e27c9a03e715a8e5c74af26e09f49be2 Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Thu, 6 Feb 2025 17:02:17 +0800 Subject: [PATCH 259/737] [sdk]: change token mechanism from user-based to session-based binding APIImpact Resolves: ZSTAC-72662 Change-Id: I7a6d72662a707062636c716c657669776c670469 --- conf/db/upgrade/V5.3.20__schema.sql | 3 +++ .../zstack/header/identity/login/LoginAuthConstant.java | 1 + .../java/org/zstack/identity/login/LoginManagerImpl.java | 2 +- .../main/java/org/zstack/sdk/SSOServerTokenInventory.java | 8 ++++++++ 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.3.20__schema.sql b/conf/db/upgrade/V5.3.20__schema.sql index 67f1ec95951..f600496bc96 100644 --- a/conf/db/upgrade/V5.3.20__schema.sql +++ b/conf/db/upgrade/V5.3.20__schema.sql @@ -142,6 +142,9 @@ DELIMITER ; call CreateResourceConfigForBindingVms(); DROP PROCEDURE IF EXISTS CreateResourceConfigForBindingVms; +DELETE FROM `SSOServerTokenVO`; +ALTER TABLE `zstack`.`SSOServerTokenVO` ADD sessionUuid VARCHAR(32) DEFAULT NULL; +ALTER TABLE `zstack`.`SSOServerTokenVO` ADD CONSTRAINT `fkSSOServerTokenVOSessionVO` FOREIGN KEY (`sessionUuid`) REFERENCES `SessionVO` (`uuid`) ON DELETE CASCADE; CALL ADD_COLUMN('SdnControllerVO', 'status', 'VARCHAR(32)', 0, 'Connected'); CALL ADD_COLUMN('HostNetworkInterfaceVO', 'driverType', 'VARCHAR(32)', 1, NULL); diff --git a/header/src/main/java/org/zstack/header/identity/login/LoginAuthConstant.java b/header/src/main/java/org/zstack/header/identity/login/LoginAuthConstant.java index 2e8fafae90f..94526e17c45 100644 --- a/header/src/main/java/org/zstack/header/identity/login/LoginAuthConstant.java +++ b/header/src/main/java/org/zstack/header/identity/login/LoginAuthConstant.java @@ -12,4 +12,5 @@ public interface LoginAuthConstant { String LOGIN_SESSION_INVENTORY = "LOGIN_SESSION_INVENTORY"; String LOGIN_SESSION_INFO = "LOGIN_SESSION_INFO"; + String LOGIN_SESSION_UUID = "LOGIN_SESSION_UUID"; } diff --git a/identity/src/main/java/org/zstack/identity/login/LoginManagerImpl.java b/identity/src/main/java/org/zstack/identity/login/LoginManagerImpl.java index 8b003d6da85..42b127de4cd 100644 --- a/identity/src/main/java/org/zstack/identity/login/LoginManagerImpl.java +++ b/identity/src/main/java/org/zstack/identity/login/LoginManagerImpl.java @@ -225,7 +225,7 @@ public void success(LoginSessionInfo info) { SessionInventory session = processSession(info); data.put(LoginAuthConstant.LOGIN_SESSION_INVENTORY, session); - + loginContext.getProperties().put(LoginAuthConstant.LOGIN_SESSION_UUID, session.getUuid()); for (LoginAuthExtensionPoint ext : matchedAuthExtensions) { ext.afterLoginSuccess(loginContext, info); } diff --git a/sdk/src/main/java/org/zstack/sdk/SSOServerTokenInventory.java b/sdk/src/main/java/org/zstack/sdk/SSOServerTokenInventory.java index 81f31b71f77..44701abb855 100644 --- a/sdk/src/main/java/org/zstack/sdk/SSOServerTokenInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/SSOServerTokenInventory.java @@ -44,6 +44,14 @@ public java.lang.String getUserUuid() { return this.userUuid; } + public java.lang.String sessionUuid; + public void setSessionUuid(java.lang.String sessionUuid) { + this.sessionUuid = sessionUuid; + } + public java.lang.String getSessionUuid() { + return this.sessionUuid; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; From 39c430387e4e1bd2637391fcb8fe782548f63e64 Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Wed, 12 Feb 2025 09:48:49 +0800 Subject: [PATCH 260/737] [identity]: add token generation support for login project Resolves: ZSTAC-72662 Change-Id: I7a6d72662a707062636c716c657669776c670469 --- .../src/main/java/org/zstack/identity/AccountLoginBackend.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/identity/src/main/java/org/zstack/identity/AccountLoginBackend.java b/identity/src/main/java/org/zstack/identity/AccountLoginBackend.java index 88d1d837130..10b0ca08bf0 100644 --- a/identity/src/main/java/org/zstack/identity/AccountLoginBackend.java +++ b/identity/src/main/java/org/zstack/identity/AccountLoginBackend.java @@ -153,6 +153,6 @@ public void collectUserInfoIntoContext(LoginContext loginContext) { @Override public List getRequiredAdditionalAuthFeature() { - return Arrays.asList(LoginAuthConstant.basicLoginControl, LoginAuthConstant.twoFactor); + return Arrays.asList(LoginAuthConstant.basicLoginControl, LoginAuthConstant.twoFactor, LoginAuthConstant.ssoServerLoginControl); } } From feb3e4ce36ad28542549c4b86888367c80b4dd98 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Thu, 13 Feb 2025 10:52:27 +0800 Subject: [PATCH 261/737] [sdnController]: refactor sdn controller Resolves: ZSTAC-73126 Change-Id: I7674646267786e78616c636d6b6f73706f717278 --- .../org/zstack/core/tracker/PingTracker.java | 4 + ...sorFactory.java => OvsVSwitchBackend.java} | 9 +- .../header/network/l2/VSwitchOvsManager.java | 2 +- .../zstack/sdnController/SdnController.java | 23 - .../SdnControllerApiInterceptor.java | 18 +- .../sdnController/SdnControllerBase.java | 799 ++++++++++++++++++ .../sdnController/SdnControllerFactory.java | 5 +- .../zstack/sdnController/SdnControllerL2.java | 35 + .../sdnController/SdnControllerManager.java | 3 + .../SdnControllerManagerImpl.java | 612 +------------- .../h3cVcfc/H3cVcfcApiInterceptor.java | 5 +- .../h3cVcfc/H3cVcfcSdnController.java | 3 +- .../h3cVcfc/H3cVcfcSdnControllerFactory.java | 6 + .../hardwareVxlan/HardwareVxlanNetwork.java | 5 +- .../HardwareVxlanNetworkFactory.java | 11 +- .../header/APIRemoveSdnControllerMsg.java | 8 +- .../header/APISdnControllerAddHostMsg.java | 8 +- .../header/APISdnControllerChangeHostMsg.java | 3 +- .../header/APISdnControllerRemoveHostMsg.java | 3 +- .../header/APIUpdateSdnControllerMsg.java | 6 +- .../header/ReconnectSdnControllerMsg.java | 20 + .../header/ReconnectSdnControllerReply.java | 6 + .../header/SdnControllerCanonicalEvents.java | 58 ++ .../header/SdnControllerFlowDataParam.java | 2 +- .../SdnControllerInventoryDoc_zh_cn.groovy | 24 +- .../header/SdnControllerRemoveHostMsg.java | 9 + .../account/AccountSync.java | 2 +- .../controller/SugonSdnController.java | 3 +- .../controller/SugonSdnControllerFactory.java | 6 + .../network/TfL2Network.java | 4 +- .../L2VxlanNetworkInventoryDoc_zh_cn.groovy | 34 +- 31 files changed, 1062 insertions(+), 674 deletions(-) rename header/src/main/java/org/zstack/header/network/l2/{VSwitchOvsHypervisorFactory.java => OvsVSwitchBackend.java} (62%) create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerMsg.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerReply.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerCanonicalEvents.java diff --git a/core/src/main/java/org/zstack/core/tracker/PingTracker.java b/core/src/main/java/org/zstack/core/tracker/PingTracker.java index 5f0ec83b2ed..ffb0ec22268 100755 --- a/core/src/main/java/org/zstack/core/tracker/PingTracker.java +++ b/core/src/main/java/org/zstack/core/tracker/PingTracker.java @@ -67,6 +67,10 @@ public void run() { } NeedReplyMessage msg = getPingMessage(resUuid); + if (msg == null) { + continue; + } + msgs.add(msg); resourceInTracking.add(resUuid); tmp.put(msg, resUuid); diff --git a/header/src/main/java/org/zstack/header/network/l2/VSwitchOvsHypervisorFactory.java b/header/src/main/java/org/zstack/header/network/l2/OvsVSwitchBackend.java similarity index 62% rename from header/src/main/java/org/zstack/header/network/l2/VSwitchOvsHypervisorFactory.java rename to header/src/main/java/org/zstack/header/network/l2/OvsVSwitchBackend.java index 126be146d57..a5a553f0809 100644 --- a/header/src/main/java/org/zstack/header/network/l2/VSwitchOvsHypervisorFactory.java +++ b/header/src/main/java/org/zstack/header/network/l2/OvsVSwitchBackend.java @@ -3,8 +3,11 @@ import org.zstack.header.core.Completion; import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.host.HypervisorType; +import org.zstack.header.vm.VmNicInventory; -public interface VSwitchOvsHypervisorFactory { +import java.util.List; + +public interface OvsVSwitchBackend { HypervisorType getHypervisorType(); void installPackages(String hostUuid, VSwitchOvsConfigStruct struct, Completion completion); @@ -12,4 +15,8 @@ public interface VSwitchOvsHypervisorFactory { void unInstallPackages(String hostUuid, VSwitchOvsConfigStruct struct, NoErrorCompletion completion); void stopService(String hostUuid, VSwitchOvsConfigStruct struct, NoErrorCompletion completion); + + void addOvsPort(String hostUuid, String vswitchType, boolean sync, boolean reinstall, + List nics, Completion completion); + void delOvsPort(String hostUuid, String vswitchType, List nics, Completion completion); } diff --git a/header/src/main/java/org/zstack/header/network/l2/VSwitchOvsManager.java b/header/src/main/java/org/zstack/header/network/l2/VSwitchOvsManager.java index 25deaa79176..580ba862d17 100644 --- a/header/src/main/java/org/zstack/header/network/l2/VSwitchOvsManager.java +++ b/header/src/main/java/org/zstack/header/network/l2/VSwitchOvsManager.java @@ -3,5 +3,5 @@ import org.zstack.header.host.HypervisorType; public interface VSwitchOvsManager { - public VSwitchOvsHypervisorFactory getHyerVisorFactory(HypervisorType type); + public OvsVSwitchBackend getOvsVSwitchBackend(HypervisorType type); } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java index 4200ce867d1..a27a42161be 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java @@ -1,13 +1,8 @@ package org.zstack.sdnController; import org.zstack.header.core.Completion; -import org.zstack.header.network.l2.L2NetworkInventory; -import org.zstack.header.vm.VmNicInventory; -import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; import org.zstack.sdnController.header.*; -import java.util.ArrayList; -import java.util.List; public interface SdnController { @@ -21,28 +16,10 @@ public interface SdnController { void initSdnController(APIAddSdnControllerMsg msg, Completion completion); void postInitSdnController(SdnControllerVO vo, Completion completion); - void preCreateVxlanNetwork(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); - void createL2Network(L2NetworkInventory inv, List systemTags, Completion completion); - void postCreateVxlanNetwork(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); - - void preAttachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); - void attachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); - void postAttachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); - void deleteSdnController(SdnControllerDeletionMsg msg, SdnControllerInventory sdn, Completion completion); - void detachL2NetworkFromCluster(L2VxlanNetworkInventory vxlan, String clusterUuid, Completion completion); - void deleteL2Network(L2NetworkInventory inv, Completion completion); - - List getVniRange(SdnControllerInventory controller); - List getVlanRange(SdnControllerInventory controller); - - default List getL2NetworkOfSdnController() { return new ArrayList<>();}; default void addHost(APISdnControllerAddHostMsg msg, Completion completion) {completion.success();}; default void removeHost(SdnControllerRemoveHostMsg msg, Completion completion) {completion.success();}; default void changeHost(SdnControllerHostRefVO oldRef, SdnControllerHostRefVO newRef, Completion completion) {completion.success();}; - - default void addLogicalPorts(List nics, Completion completion) {completion.success();}; - default void removeLogicalPorts(List nics, Completion completion) {completion.success();}; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java index 975d96074e4..c03cf99404d 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java @@ -11,6 +11,8 @@ import org.zstack.header.apimediator.GlobalApiMessageInterceptor; import org.zstack.header.message.APIMessage; import org.zstack.header.network.l2.APIAttachL2NetworkToClusterMsg; +import org.zstack.header.network.l2.APICreateL2NoVlanNetworkMsg; +import org.zstack.header.network.l2.APICreateL2VlanNetworkMsg; import org.zstack.header.network.l2.L2NetworkConstant; import org.zstack.network.l2.vxlan.vxlanNetwork.APICreateL2VxlanNetworkMsg; import org.zstack.sdnController.header.*; @@ -45,8 +47,6 @@ private void setServiceId(APIMessage msg) { public List getMessageClassToIntercept() { List ret = new ArrayList<>(); - ret.add(APICreateL2VxlanNetworkMsg.class); - ret.add(APIAttachL2NetworkToClusterMsg.class); ret.add(APIAddSdnControllerMsg.class); ret.add(APIRemoveSdnControllerMsg.class); @@ -58,11 +58,7 @@ public InterceptorPosition getPosition() { } public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionException { - if (msg instanceof APICreateL2VxlanNetworkMsg) { - validate((APICreateL2VxlanNetworkMsg)msg); - } else if (msg instanceof APIAttachL2NetworkToClusterMsg){ - validate((APIAttachL2NetworkToClusterMsg)msg); - } else if (msg instanceof APIAddSdnControllerMsg) { + if (msg instanceof APIAddSdnControllerMsg) { validate((APIAddSdnControllerMsg)msg); } else if (msg instanceof APISdnControllerAddHostMsg) { validate((APISdnControllerAddHostMsg)msg); @@ -77,12 +73,6 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti return msg; } - private void validate(APICreateL2VxlanNetworkMsg msg) { - } - - private void validate(APIAttachL2NetworkToClusterMsg msg) { - } - private void validate(APIAddSdnControllerMsg msg) { if (!SdnControllerType.getAllTypeNames().contains(msg.getVendorType())) { throw new ApiMessageInterceptionException(argerr("Sdn controller type: %s in not in the supported list: %s ", msg.getVendorType(), SdnControllerType.getAllTypeNames())); @@ -103,7 +93,7 @@ private void validate(APISdnControllerAddHostMsg msg) { .eq(SdnControllerHostRefVO_.vSwitchType, msg.getvSwitchType()) .eq(SdnControllerHostRefVO_.hostUuid, msg.getHostUuid()).isExists()) { throw new ApiMessageInterceptionException(argerr("could not add host[uuid:%s] to sdn controller[uuid:%s], " + - " because host already add to sdn controller", msg.getHostUuid(), msg.getSdnControllerUuid())); + " because host already attached to sdn controller", msg.getHostUuid(), msg.getSdnControllerUuid())); } if (msg.getVtepIp() != null && msg.getNetmask() == null) { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java new file mode 100644 index 00000000000..660ad7e605f --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java @@ -0,0 +1,799 @@ +package org.zstack.sdnController; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Configurable; +import org.zstack.core.asyncbatch.While; +import org.zstack.core.cascade.CascadeConstant; +import org.zstack.core.cascade.CascadeFacade; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.cloudbus.CloudBusCallBack; +import org.zstack.core.cloudbus.EventFacade; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; +import org.zstack.core.db.SQL; +import org.zstack.core.thread.ChainTask; +import org.zstack.core.thread.SyncTaskChain; +import org.zstack.core.thread.ThreadFacade; +import org.zstack.core.workflow.FlowChainBuilder; +import org.zstack.header.core.Completion; +import org.zstack.header.core.NopeCompletion; +import org.zstack.header.core.WhileDoneCompletion; +import org.zstack.header.core.workflow.*; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.ErrorCodeList; +import org.zstack.header.message.APIDeleteMessage; +import org.zstack.header.message.MessageReply; +import org.zstack.header.network.l2.DeleteL2NetworkMsg; +import org.zstack.header.network.l2.L2NetworkConstant; +import org.zstack.network.hostNetworkInterface.HostNetworkInterfaceVO; +import org.zstack.network.hostNetworkInterface.HostNetworkInterfaceVO_; +import org.zstack.sdnController.header.*; +import org.zstack.utils.Utils; +import org.zstack.utils.gson.JSONObjectUtil; +import org.zstack.utils.logging.CLogger; + +import javax.persistence.Tuple; +import java.lang.reflect.Type; +import java.util.*; + +import static java.util.Arrays.asList; +import static org.zstack.sdnController.header.SdnControllerFlowDataParam.SDN_CONTROLLER_UUID; + +@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) +public class SdnControllerBase { + private static final CLogger logger = Utils.getLogger(SdnControllerBase.class); + @Autowired + CloudBus bus; + @Autowired + DatabaseFacade dbf; + @Autowired + private CascadeFacade casf; + @Autowired + private ThreadFacade thdf; + @Autowired + private EventFacade evtf; + @Autowired + SdnControllerManager sdnMgr; + + public SdnControllerVO self; + + public SdnControllerBase(SdnControllerVO self) { + this.self = self; + } + + public String getSdnControllerSignature() { + return "sdn-controller-" + self.getUuid(); + } + + protected SdnController getSdnController() { + SdnControllerFactory factory = sdnMgr.getSdnControllerFactory(self.getVendorType()); + return factory.getSdnController(self); + } + + protected SdnControllerL2 getSdnControllerL2() { + SdnControllerFactory factory = sdnMgr.getSdnControllerFactory(self.getVendorType()); + return factory.getSdnControllerL2(self); + } + + public void handleMessage(SdnControllerMessage msg) { + if (msg instanceof APIRemoveSdnControllerMsg) { + handle((APIRemoveSdnControllerMsg) msg); + } else if (msg instanceof APIUpdateSdnControllerMsg) { + handle((APIUpdateSdnControllerMsg) msg); + } else if (msg instanceof SdnControllerDeletionMsg) { + handle((SdnControllerDeletionMsg) msg); + } else if (msg instanceof APISdnControllerAddHostMsg) { + handle((APISdnControllerAddHostMsg) msg); + } else if (msg instanceof APISdnControllerRemoveHostMsg) { + handle((APISdnControllerRemoveHostMsg) msg); + } else if (msg instanceof APIReconnectSdnControllerMsg) { + handle((APIReconnectSdnControllerMsg) msg); + } else if (msg instanceof APISdnControllerChangeHostMsg) { + handle((APISdnControllerChangeHostMsg) msg); + } else if (msg instanceof SdnControllerRemoveHostMsg) { + handle((SdnControllerRemoveHostMsg) msg); + } else if (msg instanceof ReconnectSdnControllerMsg) { + handle((ReconnectSdnControllerMsg) msg); + } else { + SdnController controller = getSdnController(); + controller.handleMessage(msg); + } + } + + public void changeSdnControllerStatus(SdnControllerStatus status) { + if (status == self.getStatus()) { + return; + } + + SdnControllerStatus oldStatus = self.getStatus(); + logger.debug(String.format("sdn controller [%s] changed status, old status: [%s], new status: [%s]", + self.getUuid(), oldStatus, status.toString())); + self.setStatus(status); + self = dbf.updateAndRefresh(self); + + SdnControllerCanonicalEvents.SdnControllerStatusChangedData d = new SdnControllerCanonicalEvents.SdnControllerStatusChangedData(); + d.setSdnControllerUuid(self.getUuid()); + d.setSdnControllerType(self.getVendorType()); + d.setOldStatus(oldStatus.toString()); + d.setNewStatus(status.toString()); + d.setInv(SdnControllerInventory.valueOf(self)); + evtf.fire(SdnControllerCanonicalEvents.SDNCONTROLLER_STATUS_CHANGED_PATH, d); + } + + private void handle(APIReconnectSdnControllerMsg msg) { + APIReconnectSdnControllerEvent event = new APIReconnectSdnControllerEvent(msg.getId()); + reconnectSdnController(new Completion(msg) { + @Override + public void success() { + event.setInventory(SdnControllerInventory.valueOf(dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class))); + bus.publish(event); + } + + @Override + public void fail(ErrorCode errorCode) { + event.setError(errorCode); + bus.publish(event); + } + }); + } + + private void handle(ReconnectSdnControllerMsg msg) { + ReconnectSdnControllerReply reply = new ReconnectSdnControllerReply(); + reconnectSdnController(new Completion(msg) { + @Override + public void success() { + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } + + private void reconnectSdnController(Completion completion) { + thdf.chainSubmit(new ChainTask(completion) { + @Override + public String getSyncSignature() { + return getSdnControllerSignature(); + } + + @Override + public void run(SyncTaskChain chain) { + doReconnectSdnController(new Completion(completion) { + @Override + public void success() { + completion.success(); + chain.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + chain.next(); + } + }); + } + + @Override + public String getName() { + return String.format("reconnect-sdn-controller-%s", self.getUuid()); + } + }); + } + + private void doReconnectSdnController(Completion completion) { + FlowChain chain = sdnMgr.getSyncChain(self); + chain.getData().put(SDN_CONTROLLER_UUID, self.getUuid()); + chain.setName(String.format("sync-sdn-controller-%s-%s", self.getUuid(), self.getName())); + chain.insert(new Flow() { + String __name__ = "change-sdn-controller-status-to-connecting"; + + @Override + public void run(FlowTrigger trigger, Map data) { + changeSdnControllerStatus(SdnControllerStatus.Connecting); + trigger.next(); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + changeSdnControllerStatus(SdnControllerStatus.Disconnected); + trigger.rollback(); + } + }).then(new NoRollbackFlow() { + String __name__ = "change-sdn-controller-status-to-connected"; + + @Override + public void run(FlowTrigger trigger, Map data) { + changeSdnControllerStatus(SdnControllerStatus.Connected); + trigger.next(); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); + } + + private void sdnControllerAddHost(APISdnControllerAddHostMsg msg, Completion completion) { + thdf.chainSubmit(new ChainTask(completion) { + @Override + public String getSyncSignature() { + return getSdnControllerSignature(); + } + + @Override + public void run(SyncTaskChain chain) { + SdnController controller = getSdnController(); + controller.addHost(msg, new Completion(completion) { + @Override + public void success() { + SdnControllerHostRefVO ref = new SdnControllerHostRefVO(); + ref.setSdnControllerUuid(msg.getSdnControllerUuid()); + ref.setHostUuid(msg.getHostUuid()); + ref.setvSwitchType(msg.getvSwitchType()); + + Map nicNameDriverMap = new HashMap<>(); + Map nicNamePciAddressMap = new HashMap<>(); + List nicTuples = Q.New(HostNetworkInterfaceVO.class) + .eq(HostNetworkInterfaceVO_.hostUuid, msg.getHostUuid()) + .in(HostNetworkInterfaceVO_.interfaceName, msg.getNicNames()) + .select(HostNetworkInterfaceVO_.interfaceName, + HostNetworkInterfaceVO_.driverType, + HostNetworkInterfaceVO_.pciDeviceAddress) + .listTuple(); + for (Tuple t : nicTuples) { + nicNameDriverMap.put(t.get(0, String.class), t.get(1, String.class)); + nicNamePciAddressMap.put(t.get(0, String.class), t.get(2, String.class)); + } + ref.setNicDrivers(JSONObjectUtil.toJsonString(nicNameDriverMap)); + ref.setNicPciAddresses(JSONObjectUtil.toJsonString(nicNamePciAddressMap)); + if (msg.getVtepIp() != null) { + ref.setVtepIp(msg.getVtepIp()); + } + if (msg.getNetmask() != null) { + ref.setNetmask(msg.getNetmask()); + } + if (msg.getBondMode() != null) { + ref.setBondMode(msg.getBondMode()); + } + if (msg.getLacpMode() != null) { + ref.setLacpMode(msg.getLacpMode()); + } + dbf.persist(ref); + + completion.success(); + chain.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + chain.next(); + } + }); + } + + @Override + public String getName() { + return String.format("sdn-controller-%s-add-host-%s", + self.getUuid(), msg.getHostUuid()); + } + }); + } + + private void handle(APISdnControllerAddHostMsg msg) { + APISdnControllerAddHostEvent event = new APISdnControllerAddHostEvent(msg.getId()); + sdnControllerAddHost(msg, new Completion(msg) { + @Override + public void success() { + event.setInventory(SdnControllerInventory.valueOf(dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class))); + bus.publish(event); + } + + @Override + public void fail(ErrorCode errorCode) { + event.setError(errorCode); + bus.publish(event); + } + }); + } + + private void sdnControllerRemoveHost(SdnControllerRemoveHostMsg msg, Completion completion) { + SdnController controller = getSdnController(); + controller.removeHost(msg, new Completion(completion) { + @Override + public void success() { + SQL.New(SdnControllerHostRefVO.class) + .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .eq(SdnControllerHostRefVO_.hostUuid, msg.getHostUuid()) + .eq(SdnControllerHostRefVO_.vSwitchType, msg.getvSwitchType()).delete(); + self = dbf.reload(self); + completion.success(); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + private void sdnControllerRemoveHostInQueue(SdnControllerRemoveHostMsg msg, Completion completion) { + thdf.chainSubmit(new ChainTask(completion) { + @Override + public String getSyncSignature() { + return getSdnControllerSignature(); + } + + @Override + public void run(SyncTaskChain chain) { + sdnControllerRemoveHost(msg, new Completion(completion) { + @Override + public void success() { + completion.success(); + chain.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + chain.next(); + } + }); + } + + @Override + public String getName() { + return String.format("sdn-controller-%s-remove-host-%s", + self.getUuid(), msg.getHostUuid()); + } + }); + } + + private void handle(APISdnControllerRemoveHostMsg amsg) { + APISdnControllerRemoveHostEvent event = new APISdnControllerRemoveHostEvent(amsg.getId()); + + SdnControllerRemoveHostMsg msg = SdnControllerRemoveHostMsg.fromApi(amsg); + sdnControllerRemoveHostInQueue(msg, new Completion(msg) { + @Override + public void success() { + event.setInventory(SdnControllerInventory.valueOf(dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class))); + bus.publish(event); + } + + @Override + public void fail(ErrorCode errorCode) { + event.setError(errorCode); + bus.publish(event); + } + }); + } + + private void handle(SdnControllerRemoveHostMsg msg) { + SdnControllerRemoveHostReply reply = new SdnControllerRemoveHostReply(); + + if (msg.isCreateChain()) { + sdnControllerRemoveHostInQueue(msg, new Completion(msg) { + @Override + public void success() { + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } else { + sdnControllerRemoveHost(msg, new Completion(msg) { + @Override + public void success() { + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } + } + + private void doControllerChangeHost(APISdnControllerChangeHostMsg msg, Completion completion) { + thdf.chainSubmit(new ChainTask(completion) { + @Override + public String getSyncSignature() { + return getSdnControllerSignature(); + } + + @Override + public void run(SyncTaskChain chain) { + SdnControllerHostRefVO newRef = Q.New(SdnControllerHostRefVO.class) + .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .eq(SdnControllerHostRefVO_.hostUuid, msg.getHostUuid()).find(); + SdnControllerHostRefVO oldRef = SdnControllerHostRefVO.fromOther(newRef); + + boolean changed = false; + Gson gson = new Gson(); + Type type = new TypeToken>(){}.getType(); + Map nicNamePciAddressMap = gson.fromJson(newRef.getNicPciAddresses(), type); + List oldNicNames = new ArrayList<>(nicNamePciAddressMap.keySet()); + Collections.sort(oldNicNames); + Collections.sort(msg.getNicNames()); + if (!oldNicNames.equals(msg.getNicNames())) { + changed = true; + Map nicNameDriverMap = new HashMap<>(); + nicNamePciAddressMap = new HashMap<>(); + List nicTuples = Q.New(HostNetworkInterfaceVO.class) + .eq(HostNetworkInterfaceVO_.hostUuid, msg.getHostUuid()) + .in(HostNetworkInterfaceVO_.interfaceName, msg.getNicNames()) + .select(HostNetworkInterfaceVO_.interfaceName, + HostNetworkInterfaceVO_.driverType, + HostNetworkInterfaceVO_.pciDeviceAddress) + .listTuple(); + for (Tuple t : nicTuples) { + nicNameDriverMap.put(t.get(0, String.class), t.get(1, String.class)); + nicNamePciAddressMap.put(t.get(0, String.class), t.get(2, String.class)); + } + newRef.setNicDrivers(JSONObjectUtil.toJsonString(nicNameDriverMap)); + newRef.setNicPciAddresses(JSONObjectUtil.toJsonString(nicNamePciAddressMap)); + } + + if (msg.getVtepIp() != null && !msg.getVtepIp().equals(newRef.getVtepIp())) { + changed = true; + newRef.setVtepIp(msg.getVtepIp()); + } + + if (msg.getNetmask() != null && !msg.getNetmask().equals(newRef.getNetmask())) { + changed = true; + newRef.setNetmask(msg.getNetmask()); + } + + if (msg.getBondMode() != null && !msg.getBondMode().equals(newRef.getBondMode())) { + changed = true; + newRef.setBondMode(msg.getBondMode()); + } + + if (msg.getLacpMode() != null && !msg.getLacpMode().equals(newRef.getLacpMode())) { + changed = true; + newRef.setLacpMode(msg.getLacpMode()); + } + + if (!changed) { + completion.success(); + chain.next(); + return; + } + + SdnController controller = getSdnController(); + controller.changeHost(oldRef, newRef, new Completion(msg) { + @Override + public void success() { + dbf.update(newRef); + completion.success(); + chain.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + chain.next(); + } + }); + } + + @Override + public String getName() { + return String.format("sdn-controller-%s-change-host-%s", + self.getUuid(), msg.getHostUuid()); + } + }); + } + + private void handle(APISdnControllerChangeHostMsg msg) { + APISdnControllerChangeHostEvent event = new APISdnControllerChangeHostEvent(msg.getId()); + doControllerChangeHost(msg, new Completion(msg) { + @Override + public void success() { + self = dbf.reload(self); + event.setInventory(SdnControllerInventory.valueOf(self)); + bus.publish(event); + } + + @Override + public void fail(ErrorCode errorCode) { + event.setError(errorCode); + bus.publish(event); + } + }); + } + + private void doDeletionSdnController(SdnControllerDeletionMsg msg, Completion completion) { + SdnController controller = getSdnController(); + + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("sdn-controller-deletion-%s", msg.getSdnControllerUuid())); + chain.then(new NoRollbackFlow() { + String __name__ = String.format("detach-hardvxlan-network-of-sdn-controller-%s", self.getName()); + + @Override + public void run(FlowTrigger trigger, Map data) { + List poolVos = Q.New(HardwareL2VxlanNetworkPoolVO.class) + .eq(HardwareL2VxlanNetworkPoolVO_.sdnControllerUuid, msg.getSdnControllerUuid()).list(); + new While<>(poolVos).each((pool, wcomp) -> { + DeleteL2NetworkMsg msg = new DeleteL2NetworkMsg(); + msg.setUuid(pool.getUuid()); + bus.makeTargetServiceIdByResourceUuid(msg, L2NetworkConstant.SERVICE_ID, pool.getUuid()); + bus.send(msg, new CloudBusCallBack(wcomp) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.info(String.format("delete hardware vxpool[uuid:%s] failed, reason:%s", pool.getUuid(), reply.getError().getDetails())); + } + wcomp.done(); + } + }); + }).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + trigger.next(); + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = "delete-sdn-network"; + + @Override + public void run(FlowTrigger trigger, Map data) { + SdnControllerL2 sdnControllerL2 = getSdnControllerL2(); + List l2Uuids = sdnControllerL2.getL2NetworkOfSdnController(); + if (l2Uuids.isEmpty()) { + trigger.next(); + return; + } + + new While<>(l2Uuids).step((uuid, wcomp) -> { + DeleteL2NetworkMsg msg = new DeleteL2NetworkMsg(); + msg.setUuid(uuid); + bus.makeTargetServiceIdByResourceUuid(msg, L2NetworkConstant.SERVICE_ID, uuid); + bus.send(msg, new CloudBusCallBack(wcomp) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.info(String.format("delete sdn l2 network[uuid:%s] failed, reason:%s", uuid, reply.getError().getDetails())); + } + wcomp.done(); + } + }); + }, 5).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().isEmpty()) { + trigger.next(); + } else { + trigger.fail(errorCodeList.getCauses().get(0)); + } + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = "remove-host-from-sdn-controller"; + @Override + public void run(FlowTrigger trigger, Map data) { + List refVOS = Q.New(SdnControllerHostRefVO.class) + .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .list(); + if (refVOS.isEmpty()) { + trigger.next(); + return; + } + + new While<>(refVOS).step((ref, wcomp) -> { + SdnControllerRemoveHostMsg msg = new SdnControllerRemoveHostMsg(); + msg.setSdnControllerUuid(ref.getSdnControllerUuid()); + msg.setHostUuid(ref.getHostUuid()); + msg.setvSwitchType(ref.getvSwitchType()); + msg.setCreateChain(false); + bus.makeTargetServiceIdByResourceUuid(msg, SdnControllerConstant.SERVICE_ID, ref.getSdnControllerUuid()); + bus.send(msg, new CloudBusCallBack(wcomp) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.debug(String.format("delete host [uuid:%s] from sdn controller[uuid:%s] failed, error:%s", + msg.getHostUuid(), msg.getSdnControllerUuid(), reply.getError().getDetails())); + } + wcomp.done(); + } + }); + }, 5).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().isEmpty()) { + trigger.next(); + } else { + trigger.fail(errorCodeList.getCauses().get(0)); + } + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = String.format("delete-sdn-controller-%s", self.getName()); + + @Override + public void run(FlowTrigger trigger, Map data) { + controller.deleteSdnController(msg, SdnControllerInventory.valueOf(self), new Completion(completion) { + @Override + public void success() { + completion.success(); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = "delete-sdn-controller-on-db"; + @Override + public void run(FlowTrigger trigger, Map data) { + dbf.removeByPrimaryKey(msg.getSdnControllerUuid(), SdnControllerVO.class); + trigger.next(); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); + } + + private void handle(SdnControllerDeletionMsg msg) { + SdnControllerDeletionReply reply = new SdnControllerDeletionReply(); + thdf.chainSubmit(new ChainTask(msg) { + @Override + public String getSyncSignature() { + return String.format("sdn-controller-%s", msg.getSdnControllerUuid()); + } + + @Override + public void run(SyncTaskChain chain) { + doDeletionSdnController(msg, new Completion(msg) { + @Override + public void success() { + bus.reply(msg, reply); + chain.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + chain.next(); + } + }); + } + + @Override + public String getName() { + return String.format("delete-sdn-controller-%s", msg.getSdnControllerUuid()); + } + }); + } + + private void handle(APIRemoveSdnControllerMsg msg) { + APIRemoveSdnControllerEvent event = new APIRemoveSdnControllerEvent(msg.getId()); + + final String issuer = SdnControllerVO.class.getSimpleName(); + SdnControllerVO vo = dbf.findByUuid(msg.getUuid(), SdnControllerVO.class); + final List ctx = asList(SdnControllerInventory.valueOf(vo)); + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("delete-sdn-controller-%s-name-%s", msg.getUuid(), vo.getName())); + if (msg.getDeletionMode() == APIDeleteMessage.DeletionMode.Permissive) { + chain.then(new NoRollbackFlow() { + @Override + public void run(final FlowTrigger trigger, Map data) { + casf.asyncCascade(CascadeConstant.DELETION_CHECK_CODE, issuer, ctx, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }).then(new NoRollbackFlow() { + @Override + public void run(final FlowTrigger trigger, Map data) { + casf.asyncCascade(CascadeConstant.DELETION_DELETE_CODE, issuer, ctx, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + } else { + chain.then(new NoRollbackFlow() { + @Override + public void run(final FlowTrigger trigger, Map data) { + casf.asyncCascade(CascadeConstant.DELETION_FORCE_DELETE_CODE, issuer, ctx, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + } + + chain.done(new FlowDoneHandler(msg) { + @Override + public void handle(Map data) { + casf.asyncCascadeFull(CascadeConstant.DELETION_CLEANUP_CODE, issuer, ctx, new NopeCompletion()); + bus.publish(event); + } + }).error(new FlowErrorHandler(msg) { + @Override + public void handle(ErrorCode errCode, Map data) { + event.setError(errCode); + bus.publish(event); + } + }).start(); + } + + private void handle(APIUpdateSdnControllerMsg msg) { + APIUpdateSdnControllerEvent event = new APIUpdateSdnControllerEvent(msg.getId()); + SdnControllerVO vo = dbf.findByUuid(msg.getUuid(), SdnControllerVO.class); + Boolean changed = false; + + if (msg.getName() != null && !msg.getName().equals(vo.getName())) { + vo.setName(msg.getName()); + changed = true; + } + + if (msg.getDescription() != null && !msg.getDescription().equals(vo.getDescription())) { + vo.setDescription(msg.getDescription()); + changed = true; + } + + if (changed) { + vo = dbf.updateAndRefresh(vo); + } + + event.setInventory(SdnControllerInventory.valueOf(vo)); + bus.publish(event); + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerFactory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerFactory.java index 65ce236dfbb..55cf6e8e760 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerFactory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerFactory.java @@ -2,7 +2,6 @@ import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.header.core.workflow.FlowChain; -import org.zstack.header.network.l2.L2NetworkInventory; import org.zstack.sdnController.header.SdnControllerVO; public interface SdnControllerFactory { @@ -12,5 +11,9 @@ public interface SdnControllerFactory { default SdnController getSdnController(String l2NetworkUuid) {return null;}; + SdnControllerL2 getSdnControllerL2(SdnControllerVO vo); + + default SdnControllerL2 getSdnControllerL2(String l2NetworkUuid) {return null;}; + default FlowChain getSyncChain() {return FlowChainBuilder.newSimpleFlowChain();}; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java new file mode 100644 index 00000000000..020492fde7d --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java @@ -0,0 +1,35 @@ +package org.zstack.sdnController; + +import org.zstack.header.core.Completion; +import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.vm.VmNicInventory; +import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; +import org.zstack.sdnController.header.SdnControllerDeletionMsg; +import org.zstack.sdnController.header.SdnControllerInventory; +import org.zstack.sdnController.header.SdnVlanRange; +import org.zstack.sdnController.header.SdnVniRange; + +import java.util.ArrayList; +import java.util.List; + +public interface SdnControllerL2 { + void preCreateVxlanNetwork(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); + void createL2Network(L2NetworkInventory inv, List systemTags, Completion completion); + void postCreateVxlanNetwork(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); + + void preAttachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); + void attachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); + void postAttachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); + + void deleteSdnController(SdnControllerDeletionMsg msg, SdnControllerInventory sdn, Completion completion); + void detachL2NetworkFromCluster(L2VxlanNetworkInventory vxlan, String clusterUuid, Completion completion); + void deleteL2Network(L2NetworkInventory inv, Completion completion); + + List getVniRange(SdnControllerInventory controller); + List getVlanRange(SdnControllerInventory controller); + + default List getL2NetworkOfSdnController() { return new ArrayList<>();}; + + default void addLogicalPorts(List nics, Completion completion) {completion.success();}; + default void removeLogicalPorts(List nics, Completion completion) {completion.success();}; +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManager.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManager.java index 2c99c296cdd..7dfeaa6920b 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManager.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManager.java @@ -1,9 +1,12 @@ package org.zstack.sdnController; +import org.zstack.header.core.workflow.FlowChain; import org.zstack.sdnController.header.SdnControllerVO; public interface SdnControllerManager { SdnControllerFactory getSdnControllerFactory(String type); SdnController getSdnController(SdnControllerVO sdnControllerVO); + SdnControllerL2 getSdnControllerL2(SdnControllerVO sdnControllerVO); + FlowChain getSyncChain(SdnControllerVO sdnControllerVO); } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java index ed6a14bef5f..8de1ffede4d 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java @@ -1,55 +1,35 @@ package org.zstack.sdnController; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.Platform; import org.zstack.core.asyncbatch.While; -import org.zstack.core.cascade.CascadeConstant; -import org.zstack.core.cascade.CascadeFacade; import org.zstack.core.cloudbus.CloudBus; -import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; -import org.zstack.core.db.Q; -import org.zstack.core.db.SQL; -import org.zstack.core.thread.ChainTask; -import org.zstack.core.thread.SyncTaskChain; -import org.zstack.core.thread.ThreadFacade; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; import org.zstack.header.AbstractService; import org.zstack.header.core.Completion; import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.core.WhileDoneCompletion; -import org.zstack.header.core.NopeCompletion; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.exception.CloudRuntimeException; -import org.zstack.header.message.APIDeleteMessage; import org.zstack.header.message.Message; -import org.zstack.header.message.MessageReply; import org.zstack.header.network.NetworkException; import org.zstack.header.network.l2.*; import org.zstack.header.network.l3.L3NetworkInventory; import org.zstack.header.network.l3.L3NetworkVO; import org.zstack.header.vm.*; -import org.zstack.network.hostNetworkInterface.HostNetworkInterfaceVO; -import org.zstack.network.hostNetworkInterface.HostNetworkInterfaceVO_; import org.zstack.sdnController.header.*; import org.zstack.tag.TagManager; import org.zstack.utils.Utils; -import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; -import javax.persistence.Tuple; -import java.lang.reflect.Type; import java.util.*; -import static java.util.Arrays.asList; import static org.zstack.core.Platform.operr; -import static org.zstack.sdnController.header.SdnControllerFlowDataParam.*; public class SdnControllerManagerImpl extends AbstractService implements SdnControllerManager, L2NetworkCreateExtensionPoint, L2NetworkDeleteExtensionPoint, InstantiateResourceOnAttachingNicExtensionPoint, @@ -65,10 +45,6 @@ public class SdnControllerManagerImpl extends AbstractService implements SdnCont private PluginRegistry pluginRgty; @Autowired private TagManager tagMgr; - @Autowired - private CascadeFacade casf; - @Autowired - private ThreadFacade thdf; private Map sdnControllerFactories = Collections.synchronizedMap(new HashMap()); @@ -86,460 +62,23 @@ public List getAliasIds() { public void handleMessage(Message msg) { if (msg instanceof APIAddSdnControllerMsg) { handle((APIAddSdnControllerMsg) msg); - } else if (msg instanceof APIRemoveSdnControllerMsg) { - handle((APIRemoveSdnControllerMsg) msg); - } else if (msg instanceof APIUpdateSdnControllerMsg) { - handle((APIUpdateSdnControllerMsg) msg); - } else if (msg instanceof SdnControllerDeletionMsg) { - handle((SdnControllerDeletionMsg) msg); - } else if (msg instanceof APISdnControllerAddHostMsg) { - handle((APISdnControllerAddHostMsg) msg); - } else if (msg instanceof APISdnControllerRemoveHostMsg) { - handle((APISdnControllerRemoveHostMsg) msg); - } else if (msg instanceof APIReconnectSdnControllerMsg) { - handle((APIReconnectSdnControllerMsg) msg); - } else if (msg instanceof APISdnControllerChangeHostMsg) { - handle((APISdnControllerChangeHostMsg) msg); - } else if (msg instanceof SdnControllerRemoveHostMsg) { - handle((SdnControllerRemoveHostMsg) msg); + } else if (msg instanceof SdnControllerMessage) { + handleSdnControllerMessage((SdnControllerMessage) msg); + } else { + bus.dealWithUnknownMessage(msg); } } - private void handle(APIReconnectSdnControllerMsg msg) { - APIReconnectSdnControllerEvent event = new APIReconnectSdnControllerEvent(msg.getId()); - sdnControllerSync(msg, new Completion(msg) { - @Override - public void success() { - event.setInventory(SdnControllerInventory.valueOf(dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class))); - bus.publish(event); - } - - @Override - public void fail(ErrorCode errorCode) { - event.setError(errorCode); - bus.publish(event); - } - }); - } - - private void sdnControllerSync(APIReconnectSdnControllerMsg msg, Completion completion) { - SdnControllerVO controllerVO = dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class); - SdnControllerFactory factory = getSdnControllerFactory(controllerVO.getVendorType()); - - FlowChain chain = factory.getSyncChain(); - chain.getData().put(SDN_CONTROLLER_INV, SdnControllerInventory.valueOf(controllerVO)); - chain.setName(String.format("sync-sdn-controller-%s-%s", controllerVO.getUuid(), controllerVO.getName())); - chain.insert(new Flow() { - String __name__ = "change-sdn-controller-status-to-connecting"; - - @Override - public void run(FlowTrigger trigger, Map data) { - controllerVO.setStatus(SdnControllerStatus.Connecting); - trigger.next(); - } - - @Override - public void rollback(FlowRollback trigger, Map data) { - controllerVO.setStatus(SdnControllerStatus.Disconnected); - trigger.rollback(); - } - }).then(new NoRollbackFlow() { - String __name__ = "change-sdn-controller-status-to-connected"; - - @Override - public void run(FlowTrigger trigger, Map data) { - controllerVO.setStatus(SdnControllerStatus.Connected); - trigger.next(); - } - }).done(new FlowDoneHandler(completion) { - @Override - public void handle(Map data) { - completion.success(); - } - }).error(new FlowErrorHandler(completion) { - @Override - public void handle(ErrorCode errCode, Map data) { - completion.fail(errCode); - } - }).start(); - } - - private void handle(APISdnControllerAddHostMsg msg) { - APISdnControllerAddHostEvent event = new APISdnControllerAddHostEvent(msg.getId()); - - sdnControllerAddHost(msg, new Completion(msg) { - @Override - public void success() { - SdnControllerHostRefVO ref = new SdnControllerHostRefVO(); - ref.setSdnControllerUuid(msg.getSdnControllerUuid()); - ref.setHostUuid(msg.getHostUuid()); - ref.setvSwitchType(msg.getvSwitchType()); - - Map nicNameDriverMap = new HashMap<>(); - Map nicNamePciAddressMap = new HashMap<>(); - List nicTuples = Q.New(HostNetworkInterfaceVO.class) - .eq(HostNetworkInterfaceVO_.hostUuid, msg.getHostUuid()) - .in(HostNetworkInterfaceVO_.interfaceName, msg.getNicNames()) - .select(HostNetworkInterfaceVO_.interfaceName, - HostNetworkInterfaceVO_.driverType, - HostNetworkInterfaceVO_.pciDeviceAddress) - .listTuple(); - for (Tuple t : nicTuples) { - nicNameDriverMap.put(t.get(0, String.class), t.get(1, String.class)); - nicNamePciAddressMap.put(t.get(0, String.class), t.get(2, String.class)); - } - ref.setNicDrivers(JSONObjectUtil.toJsonString(nicNameDriverMap)); - ref.setNicPciAddresses(JSONObjectUtil.toJsonString(nicNamePciAddressMap)); - if (msg.getVtepIp() != null) { - ref.setVtepIp(msg.getVtepIp()); - } - if (msg.getNetmask() != null) { - ref.setNetmask(msg.getNetmask()); - } - if (msg.getBondMode() != null) { - ref.setBondMode(msg.getBondMode()); - } - if (msg.getLacpMode() != null) { - ref.setLacpMode(msg.getLacpMode()); - } - dbf.persist(ref); - - event.setInventory(SdnControllerInventory.valueOf(dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class))); - bus.publish(event); - } - - @Override - public void fail(ErrorCode errorCode) { - event.setError(errorCode); - bus.publish(event); - } - }); - } - - private void handle(APISdnControllerRemoveHostMsg amsg) { - APISdnControllerRemoveHostEvent event = new APISdnControllerRemoveHostEvent(amsg.getId()); - - SdnControllerRemoveHostMsg msg = SdnControllerRemoveHostMsg.fromApi(amsg); - sdnControllerRemoveHost(msg, new Completion(msg) { - @Override - public void success() { - SQL.New(SdnControllerHostRefVO.class) - .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) - .eq(SdnControllerHostRefVO_.hostUuid, msg.getHostUuid()) - .eq(SdnControllerHostRefVO_.vSwitchType, msg.getvSwitchType()).delete(); - - event.setInventory(SdnControllerInventory.valueOf(dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class))); - bus.publish(event); - } - - @Override - public void fail(ErrorCode errorCode) { - event.setError(errorCode); - bus.publish(event); - } - }); - } - - private void handle(SdnControllerRemoveHostMsg msg) { - SdnControllerRemoveHostReply reply = new SdnControllerRemoveHostReply(); - - sdnControllerRemoveHost(msg, new Completion(msg) { - @Override - public void success() { - SQL.New(SdnControllerHostRefVO.class) - .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) - .eq(SdnControllerHostRefVO_.hostUuid, msg.getHostUuid()) - .eq(SdnControllerHostRefVO_.vSwitchType, msg.getvSwitchType()).delete(); - - bus.reply(msg, reply); - } - - @Override - public void fail(ErrorCode errorCode) { - reply.setError(errorCode); - bus.reply(msg, reply); - } - }); - } - - private void handle(APISdnControllerChangeHostMsg msg) { - APISdnControllerChangeHostEvent event = new APISdnControllerChangeHostEvent(msg.getId()); - - SdnControllerHostRefVO newRef = Q.New(SdnControllerHostRefVO.class) - .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) - .eq(SdnControllerHostRefVO_.hostUuid, msg.getHostUuid()).find(); - SdnControllerHostRefVO oldRef = SdnControllerHostRefVO.fromOther(newRef); - - boolean changed = false; - Gson gson = new Gson(); - Type type = new TypeToken>(){}.getType(); - Map nicNamePciAddressMap = gson.fromJson(newRef.getNicPciAddresses(), type); - List oldNicNames = new ArrayList<>(nicNamePciAddressMap.keySet()); - Collections.sort(oldNicNames); - Collections.sort(msg.getNicNames()); - if (!oldNicNames.equals(msg.getNicNames())) { - changed = true; - Map nicNameDriverMap = new HashMap<>(); - nicNamePciAddressMap = new HashMap<>(); - List nicTuples = Q.New(HostNetworkInterfaceVO.class) - .eq(HostNetworkInterfaceVO_.hostUuid, msg.getHostUuid()) - .in(HostNetworkInterfaceVO_.interfaceName, msg.getNicNames()) - .select(HostNetworkInterfaceVO_.interfaceName, - HostNetworkInterfaceVO_.driverType, - HostNetworkInterfaceVO_.pciDeviceAddress) - .listTuple(); - for (Tuple t : nicTuples) { - nicNameDriverMap.put(t.get(0, String.class), t.get(1, String.class)); - nicNamePciAddressMap.put(t.get(0, String.class), t.get(2, String.class)); - } - newRef.setNicDrivers(JSONObjectUtil.toJsonString(nicNameDriverMap)); - newRef.setNicPciAddresses(JSONObjectUtil.toJsonString(nicNamePciAddressMap)); - } - - if (msg.getVtepIp() != null && !msg.getVtepIp().equals(newRef.getVtepIp())) { - changed = true; - newRef.setVtepIp(msg.getVtepIp()); - } - - if (msg.getNetmask() != null && !msg.getNetmask().equals(newRef.getNetmask())) { - changed = true; - newRef.setNetmask(msg.getNetmask()); - } - - if (msg.getBondMode() != null && !msg.getBondMode().equals(newRef.getBondMode())) { - changed = true; - newRef.setBondMode(msg.getBondMode()); - } - - if (msg.getLacpMode() != null && !msg.getLacpMode().equals(newRef.getLacpMode())) { - changed = true; - newRef.setLacpMode(msg.getLacpMode()); - } - - if (!changed) { - event.setInventory(SdnControllerInventory.valueOf(dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class))); - bus.publish(event); + private void handleSdnControllerMessage(SdnControllerMessage msg) { + SdnControllerVO vo = dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class); + if (vo == null) { + String err = String.format("Cannot find Sdn controller[uuid:%s], it may have been deleted", msg.getSdnControllerUuid()); + bus.replyErrorByMessageType((Message) msg, err); return; } - sdnControllerChangeHost(oldRef, newRef, new Completion(msg) { - @Override - public void success() { - dbf.update(newRef); - event.setInventory(SdnControllerInventory.valueOf(dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class))); - bus.publish(event); - } - - @Override - public void fail(ErrorCode errorCode) { - event.setError(errorCode); - bus.publish(event); - } - }); - } - - private void sdnControllerAddHost(APISdnControllerAddHostMsg msg, Completion completion) { - SdnControllerVO controllerVO = dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class); - SdnControllerFactory factory = getSdnControllerFactory(controllerVO.getVendorType()); - SdnController controller = factory.getSdnController(controllerVO); - - controller.addHost(msg, completion); - } - - private void sdnControllerChangeHost(SdnControllerHostRefVO oldref, SdnControllerHostRefVO newRef, Completion completion) { - SdnControllerVO controllerVO = dbf.findByUuid(oldref.getSdnControllerUuid(), SdnControllerVO.class); - SdnControllerFactory factory = getSdnControllerFactory(controllerVO.getVendorType()); - SdnController controller = factory.getSdnController(controllerVO); - - controller.changeHost(oldref, newRef, completion); - } - - private void sdnControllerRemoveHost(SdnControllerRemoveHostMsg msg, Completion completion) { - SdnControllerVO controllerVO = dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class); - SdnControllerFactory factory = getSdnControllerFactory(controllerVO.getVendorType()); - SdnController controller = factory.getSdnController(controllerVO); - - controller.removeHost(msg, completion); - } - - private void doDeletionSdnController(SdnControllerDeletionMsg msg, Completion completion) { - SdnControllerVO vo = dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class); - SdnControllerInventory sdn = SdnControllerInventory.valueOf(vo); - - SdnControllerFactory factory = getSdnControllerFactory(vo.getVendorType()); - SdnController controller = factory.getSdnController(vo); - - FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); - chain.setName(String.format("sdn-controller-deletion-%s", msg.getSdnControllerUuid())); - chain.then(new NoRollbackFlow() { - String __name__ = String.format("detach-hardvxlan-network-of-sdn-controller-%s", vo.getName()); - - @Override - public void run(FlowTrigger trigger, Map data) { - List poolVos = Q.New(HardwareL2VxlanNetworkPoolVO.class) - .eq(HardwareL2VxlanNetworkPoolVO_.sdnControllerUuid, msg.getSdnControllerUuid()).list(); - new While<>(poolVos).each((pool, wcomp) -> { - DeleteL2NetworkMsg msg = new DeleteL2NetworkMsg(); - msg.setUuid(pool.getUuid()); - bus.makeTargetServiceIdByResourceUuid(msg, L2NetworkConstant.SERVICE_ID, pool.getUuid()); - bus.send(msg, new CloudBusCallBack(wcomp) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - logger.info(String.format("delete hardware vxpool[uuid:%s] failed, reason:%s", pool.getUuid(), reply.getError().getDetails())); - } - wcomp.done(); - } - }); - }).run(new WhileDoneCompletion(trigger) { - @Override - public void done(ErrorCodeList errorCodeList) { - trigger.next(); - } - }); - } - }).then(new NoRollbackFlow() { - String __name__ = "delete-sdn-network"; - - @Override - public void run(FlowTrigger trigger, Map data) { - List l2Uuids = controller.getL2NetworkOfSdnController(); - if (l2Uuids.isEmpty()) { - trigger.next(); - return; - } - - new While<>(l2Uuids).step((uuid, wcomp) -> { - DeleteL2NetworkMsg msg = new DeleteL2NetworkMsg(); - msg.setUuid(uuid); - bus.makeTargetServiceIdByResourceUuid(msg, L2NetworkConstant.SERVICE_ID, uuid); - bus.send(msg, new CloudBusCallBack(wcomp) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - logger.info(String.format("delete sdn l2 network[uuid:%s] failed, reason:%s", uuid, reply.getError().getDetails())); - } - wcomp.done(); - } - }); - }, 5).run(new WhileDoneCompletion(trigger) { - @Override - public void done(ErrorCodeList errorCodeList) { - if (errorCodeList.getCauses().isEmpty()) { - trigger.next(); - } else { - trigger.fail(errorCodeList.getCauses().get(0)); - } - } - }); - } - }).then(new NoRollbackFlow() { - String __name__ = "remove-host-from-sdn-controller"; - @Override - public void run(FlowTrigger trigger, Map data) { - List refVOS = Q.New(SdnControllerHostRefVO.class) - .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) - .list(); - if (refVOS.isEmpty()) { - trigger.next(); - return; - } - - new While<>(refVOS).step((ref, wcomp) -> { - SdnControllerRemoveHostMsg msg = new SdnControllerRemoveHostMsg(); - msg.setSdnControllerUuid(ref.getSdnControllerUuid()); - msg.setHostUuid(ref.getHostUuid()); - msg.setvSwitchType(ref.getvSwitchType()); - bus.makeTargetServiceIdByResourceUuid(msg, SdnControllerConstant.SERVICE_ID, ref.getSdnControllerUuid()); - bus.send(msg, new CloudBusCallBack(wcomp) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - logger.debug(String.format("delete host [uuid:%s] from sdn controller[uuid:%s] failed, error:%s", - msg.getHostUuid(), msg.getSdnControllerUuid(), reply.getError().getDetails())); - } - wcomp.done(); - } - }); - }, 5).run(new WhileDoneCompletion(trigger) { - @Override - public void done(ErrorCodeList errorCodeList) { - if (errorCodeList.getCauses().isEmpty()) { - trigger.next(); - } else { - trigger.fail(errorCodeList.getCauses().get(0)); - } - } - }); - } - }).then(new NoRollbackFlow() { - String __name__ = String.format("delete-sdn-controller-%s", vo.getName()); - - @Override - public void run(FlowTrigger trigger, Map data) { - controller.deleteSdnController(msg, sdn, new Completion(completion) { - @Override - public void success() { - completion.success(); - } - - @Override - public void fail(ErrorCode errorCode) { - completion.fail(errorCode); - } - }); - } - }).then(new NoRollbackFlow() { - String __name__ = "delete-sdn-controller-on-db"; - @Override - public void run(FlowTrigger trigger, Map data) { - dbf.removeByPrimaryKey(msg.getSdnControllerUuid(), SdnControllerVO.class); - trigger.next(); - } - }).done(new FlowDoneHandler(completion) { - @Override - public void handle(Map data) { - completion.success(); - } - }).error(new FlowErrorHandler(completion) { - @Override - public void handle(ErrorCode errCode, Map data) { - completion.fail(errCode); - } - }).start(); - } - - private void handle(SdnControllerDeletionMsg msg) { - SdnControllerDeletionReply reply = new SdnControllerDeletionReply(); - thdf.chainSubmit(new ChainTask(msg) { - @Override - public String getSyncSignature() { - return String.format("sdn-controller-%s", msg.getSdnControllerUuid()); - } - - @Override - public void run(SyncTaskChain chain) { - doDeletionSdnController(msg, new Completion(msg) { - @Override - public void success() { - bus.reply(msg, reply); - chain.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - reply.setError(errorCode); - bus.reply(msg, reply); - chain.next(); - } - }); - } - - @Override - public String getName() { - return String.format("delete-sdn-controller-%s", msg.getSdnControllerUuid()); - } - }); + SdnControllerBase sdnController = new SdnControllerBase(vo); + sdnController.handleMessage(msg); } private void doCreateSdnController(SdnControllerVO vo, APIAddSdnControllerMsg msg, Completion completion) { @@ -679,103 +218,6 @@ public void fail(ErrorCode errorCode) { }); } - private void handle(APIRemoveSdnControllerMsg msg) { - APIRemoveSdnControllerEvent event = new APIRemoveSdnControllerEvent(msg.getId()); - - final String issuer = SdnControllerVO.class.getSimpleName(); - SdnControllerVO vo = dbf.findByUuid(msg.getUuid(), SdnControllerVO.class); - final List ctx = asList(SdnControllerInventory.valueOf(vo)); - FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); - chain.setName(String.format("delete-sdn-controller-%s-name-%s", msg.getUuid(), vo.getName())); - if (msg.getDeletionMode() == APIDeleteMessage.DeletionMode.Permissive) { - chain.then(new NoRollbackFlow() { - @Override - public void run(final FlowTrigger trigger, Map data) { - casf.asyncCascade(CascadeConstant.DELETION_CHECK_CODE, issuer, ctx, new Completion(trigger) { - @Override - public void success() { - trigger.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - trigger.fail(errorCode); - } - }); - } - }).then(new NoRollbackFlow() { - @Override - public void run(final FlowTrigger trigger, Map data) { - casf.asyncCascade(CascadeConstant.DELETION_DELETE_CODE, issuer, ctx, new Completion(trigger) { - @Override - public void success() { - trigger.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - trigger.fail(errorCode); - } - }); - } - }); - } else { - chain.then(new NoRollbackFlow() { - @Override - public void run(final FlowTrigger trigger, Map data) { - casf.asyncCascade(CascadeConstant.DELETION_FORCE_DELETE_CODE, issuer, ctx, new Completion(trigger) { - @Override - public void success() { - trigger.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - trigger.fail(errorCode); - } - }); - } - }); - } - - chain.done(new FlowDoneHandler(msg) { - @Override - public void handle(Map data) { - casf.asyncCascadeFull(CascadeConstant.DELETION_CLEANUP_CODE, issuer, ctx, new NopeCompletion()); - bus.publish(event); - } - }).error(new FlowErrorHandler(msg) { - @Override - public void handle(ErrorCode errCode, Map data) { - event.setError(errCode); - bus.publish(event); - } - }).start(); - } - - private void handle(APIUpdateSdnControllerMsg msg) { - APIUpdateSdnControllerEvent event = new APIUpdateSdnControllerEvent(msg.getId()); - SdnControllerVO vo = dbf.findByUuid(msg.getUuid(), SdnControllerVO.class); - Boolean changed = false; - - if (msg.getName() != null && !msg.getName().equals(vo.getName())) { - vo.setName(msg.getName()); - changed = true; - } - - if (msg.getDescription() != null && !msg.getDescription().equals(vo.getDescription())) { - vo.setDescription(msg.getDescription()); - changed = true; - } - - if (changed) { - vo = dbf.updateAndRefresh(vo); - } - - event.setInventory(SdnControllerInventory.valueOf(vo)); - bus.publish(event); - } - @Override public void beforeCreateL2Network(APICreateL2NetworkMsg msg) throws NetworkException { @@ -810,7 +252,7 @@ public void postCreateL2Network(L2NetworkInventory l2Network, APICreateL2Network } SdnControllerFactory factory = getSdnControllerFactory(vo.getVendorType()); - SdnController controller = factory.getSdnController(vo); + SdnControllerL2 controller = factory.getSdnControllerL2(vo); controller.createL2Network(l2Network, msg.getSystemTags(), completion); } @@ -839,15 +281,15 @@ public void deleteL2Network(L2NetworkInventory inv, NoErrorCompletion completion /* vswitch type: OvnDpdk will go here */ SdnControllerFactory factory = getSdnControllerFactory(vSwitchType.getSdnControllerType()); - SdnController controller = factory.getSdnController(inv.getUuid()); - if (controller == null) { + SdnControllerL2 controllerL2 = factory.getSdnControllerL2(inv.getUuid()); + if (controllerL2 == null) { logger.warn(String.format("can not found sdn controller for l2 network[uuid:%s, vswitchType:%s]", inv.getUuid(), inv.getvSwitchType())); completion.done(); return; } - controller.deleteL2Network(inv, new Completion(completion) { + controllerL2.deleteL2Network(inv, new Completion(completion) { @Override public void success() { completion.done(); @@ -867,7 +309,7 @@ public void afterDeleteL2Network(L2NetworkInventory inventory) { } - void addOvnLogicalPorts(String sdnControllerUuid, List nics, Completion completion) { + private void addOvnLogicalPorts(String sdnControllerUuid, List nics, Completion completion) { SdnControllerVO vo = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); SdnControllerFactory factory = getSdnControllerFactory(vo.getVendorType()); if (factory == null) { @@ -875,11 +317,11 @@ void addOvnLogicalPorts(String sdnControllerUuid, List nics, Com return; } - SdnController controller = factory.getSdnController(vo); + SdnControllerL2 controller = factory.getSdnControllerL2(vo); controller.addLogicalPorts(nics, completion); } - void addOvnLogicalPort(Map> nicMaps, Completion completion) { + private void addOvnLogicalPort(Map> nicMaps, Completion completion) { new While<>(nicMaps.entrySet()).each((e, wcomp) -> { addOvnLogicalPorts(e.getKey(), e.getValue(), new Completion(wcomp) { @Override @@ -905,7 +347,7 @@ public void done(ErrorCodeList errorCodeList) { }); } - void removeOvnLogicalPorts(String controllerUuid, List nics, Completion completion) { + private void removeOvnLogicalPorts(String controllerUuid, List nics, Completion completion) { SdnControllerVO vo = dbf.findByUuid(controllerUuid, SdnControllerVO.class); SdnControllerFactory factory = getSdnControllerFactory(vo.getVendorType()); if (factory == null) { @@ -913,11 +355,11 @@ void removeOvnLogicalPorts(String controllerUuid, List nics, Com return; } - SdnController controller = factory.getSdnController(vo); + SdnControllerL2 controller = factory.getSdnControllerL2(vo); controller.removeLogicalPorts(nics, completion); } - void removeLogicalPort(Map> nicMaps, Completion completion) { + private void removeLogicalPort(Map> nicMaps, Completion completion) { new While<>(nicMaps.entrySet()).each((e, wcomp) -> { removeOvnLogicalPorts(e.getKey(), e.getValue(), new Completion(wcomp) { @Override @@ -1215,6 +657,18 @@ public SdnController getSdnController(SdnControllerVO sdnControllerVO) { return factory.getSdnController(sdnControllerVO); } + @Override + public SdnControllerL2 getSdnControllerL2(SdnControllerVO sdnControllerVO) { + SdnControllerFactory factory = getSdnControllerFactory(sdnControllerVO.getVendorType()); + return factory.getSdnControllerL2(sdnControllerVO); + } + + @Override + public FlowChain getSyncChain(SdnControllerVO sdnControllerVO) { + SdnControllerFactory f = getSdnControllerFactory(sdnControllerVO.getVendorType()); + return f.getSyncChain(); + } + @Override public String getId() { return bus.makeLocalServiceId(SdnControllerConstant.SERVICE_ID); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java index 4a0c1e39839..49575b07281 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java @@ -15,6 +15,7 @@ import org.zstack.network.l2.vxlan.vxlanNetworkPool.APICreateVniRangeMsg; import org.zstack.network.l2.vxlan.vxlanNetworkPool.VxlanNetworkPoolVO; import org.zstack.sdnController.SdnController; +import org.zstack.sdnController.SdnControllerL2; import org.zstack.sdnController.SdnControllerManager; import org.zstack.sdnController.header.*; import org.zstack.utils.Utils; @@ -116,8 +117,8 @@ private void validate(APICreateVniRangeMsg msg) { if (msg.getStartVni() > 4094 || msg.getEndVni() > 4094) { throw new ApiMessageInterceptionException(argerr("the vni range:[%s.%s} is illegal, because h3c's controller uses vni as vlan id", msg.getStartVni(), msg.getEndVni())); } - - SdnController sdnController = sdnControllerManager.getSdnController(vo); + + SdnControllerL2 sdnController = sdnControllerManager.getSdnControllerL2(vo); SdnVniRange userVniRange = new SdnVniRange(); userVniRange.startVni = msg.getStartVni(); userVniRange.endVni = msg.getEndVni(); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java index dd4fa14a31c..de3068b85bf 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java @@ -17,6 +17,7 @@ import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; import org.zstack.sdnController.SdnController; +import org.zstack.sdnController.SdnControllerL2; import org.zstack.sdnController.header.*; import org.zstack.sdnController.SdnControllerLog; import org.zstack.tag.SystemTagCreator; @@ -30,7 +31,7 @@ import static org.zstack.utils.CollectionDSL.map; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) -public class H3cVcfcSdnController implements SdnController { +public class H3cVcfcSdnController implements SdnController, SdnControllerL2 { private static final CLogger logger = Utils.getLogger(H3cVcfcSdnController.class); @Autowired diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java index 83b36f12f96..8bff30df158 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java @@ -2,6 +2,7 @@ import org.zstack.sdnController.SdnController; import org.zstack.sdnController.SdnControllerFactory; +import org.zstack.sdnController.SdnControllerL2; import org.zstack.sdnController.SdnControllerType; import org.zstack.sdnController.header.*; @@ -17,4 +18,9 @@ public SdnControllerType getVendorType() { public SdnController getSdnController(SdnControllerVO vo) { return new H3cVcfcSdnController(vo); } + + @Override + public SdnControllerL2 getSdnControllerL2(SdnControllerVO vo) { + return new H3cVcfcSdnController(vo); + } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java index bdb8397ca60..93983b2e89f 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java @@ -12,6 +12,7 @@ import org.zstack.header.network.l2.*; import org.zstack.network.l2.vxlan.vxlanNetwork.*; import org.zstack.sdnController.SdnController; +import org.zstack.sdnController.SdnControllerL2; import org.zstack.sdnController.SdnControllerManager; import org.zstack.sdnController.header.*; import org.zstack.utils.Utils; @@ -40,7 +41,7 @@ public HardwareVxlanNetwork(L2NetworkVO self) { public void createVxlanNetworkOnSdnController(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion) { HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(vxlan.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); - SdnController sdnController = sdnControllerManager.getSdnController(sdn); + SdnControllerL2 sdnController = sdnControllerManager.getSdnControllerL2(sdn); sdnController.createL2Network(vxlan, systemTags, completion); } @@ -53,7 +54,7 @@ public void deleteVxlanNetworkOnSdnController(VxlanNetworkVO vo, Completion comp } SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); - SdnController sdnController = sdnControllerManager.getSdnController(sdn); + SdnControllerL2 sdnController = sdnControllerManager.getSdnControllerL2(sdn); sdnController.deleteL2Network(L2VxlanNetworkInventory.valueOf(vo), completion); } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java index 811b390e434..0456d5ab760 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java @@ -38,6 +38,7 @@ import org.zstack.network.service.NetworkServiceGlobalConfig; import org.zstack.resourceconfig.ResourceConfigFacade; import org.zstack.sdnController.SdnController; +import org.zstack.sdnController.SdnControllerL2; import org.zstack.sdnController.SdnControllerManager; import org.zstack.sdnController.header.*; import org.zstack.utils.Utils; @@ -106,7 +107,7 @@ public void run(FlowTrigger trigger, Map data) { return; } SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); - SdnController controller = sdnControllerManager.getSdnController(sdn); + SdnControllerL2 controller = sdnControllerManager.getSdnControllerL2(sdn); controller.preCreateVxlanNetwork(vxlan, msg.getSystemTags(), new Completion(trigger) { @Override @@ -201,7 +202,7 @@ public void run(FlowTrigger trigger, Map data) { HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(vxlan.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); - SdnController controller = sdnControllerManager.getSdnController(sdn); + SdnControllerL2 controller = sdnControllerManager.getSdnControllerL2(sdn); controller.postCreateVxlanNetwork(vxlan, msg.getSystemTags(), new Completion(trigger) { @Override public void success() { @@ -225,7 +226,7 @@ public void run(FlowTrigger trigger, Map data) { HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(vxlan.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); - SdnController controller = sdnControllerManager.getSdnController(sdn); + SdnControllerL2 controller = sdnControllerManager.getSdnControllerL2(sdn); controller.preAttachL2NetworkToCluster(vxlan, msg.getSystemTags(), new Completion(trigger) { @Override public void success() { @@ -275,7 +276,7 @@ public void run(FlowTrigger trigger, Map data) { HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(vxlan.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); - SdnController controller = sdnControllerManager.getSdnController(sdn); + SdnControllerL2 controller = sdnControllerManager.getSdnControllerL2(sdn); controller.attachL2NetworkToCluster(vxlan, msg.getSystemTags(), new Completion(trigger) { @Override public void success() { @@ -304,7 +305,7 @@ public void run(FlowTrigger trigger, Map data) { HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(vxlan.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); - SdnController controller = sdnControllerManager.getSdnController(sdn); + SdnControllerL2 controller = sdnControllerManager.getSdnControllerL2(sdn); controller.postAttachL2NetworkToCluster(vxlan, msg.getSystemTags(), new Completion(trigger) { @Override public void success() { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIRemoveSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIRemoveSdnControllerMsg.java index b354db57361..60381eb8a88 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIRemoveSdnControllerMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIRemoveSdnControllerMsg.java @@ -12,7 +12,7 @@ method = HttpMethod.DELETE, responseClass = APIRemoveSdnControllerEvent.class ) -public class APIRemoveSdnControllerMsg extends APIDeleteMessage { +public class APIRemoveSdnControllerMsg extends APIDeleteMessage implements SdnControllerMessage { @APIParam(checkAccount = true, operationTarget = true, successIfResourceNotExisting = true, resourceType = SdnControllerVO.class) private String uuid; @@ -24,7 +24,11 @@ public void setUuid(String uuid) { this.uuid = uuid; } - + @Override + public String getSdnControllerUuid() { + return uuid; + } + public static APIRemoveSdnControllerMsg __example__() { APIRemoveSdnControllerMsg msg = new APIRemoveSdnControllerMsg(); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsg.java index 0ac68423827..50a891d57b3 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsg.java @@ -21,7 +21,7 @@ responseClass = APISdnControllerAddHostEvent.class, parameterName = "null" ) -public class APISdnControllerAddHostMsg extends APIMessage { +public class APISdnControllerAddHostMsg extends APIMessage implements SdnControllerMessage { /** * @desc l2Network uuid */ @@ -46,13 +46,13 @@ public class APISdnControllerAddHostMsg extends APIMessage { private List nicNames; /** - * @desc physical nics used by vSwitchType + * @desc VTEP (VXLAN Tunnel End Point) IP address */ @APIParam(required = false) private String vtepIp; /** - * @desc physical nics used by vSwitchType + * @desc Netmask for the VTEP IP address */ @APIParam(required = false) private String netmask; @@ -70,6 +70,7 @@ public class APISdnControllerAddHostMsg extends APIMessage { private String lacpMode; + @Override public String getSdnControllerUuid() { return sdnControllerUuid; } @@ -134,6 +135,7 @@ public void setLacpMode(String lacpMode) { this.lacpMode = lacpMode; } + public static APISdnControllerAddHostMsg __example__() { APISdnControllerAddHostMsg msg = new APISdnControllerAddHostMsg(); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsg.java index 365f0851a68..54a3de0bd69 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsg.java @@ -17,7 +17,7 @@ responseClass = APISdnControllerChangeHostEvent.class, isAction = true ) -public class APISdnControllerChangeHostMsg extends APIMessage { +public class APISdnControllerChangeHostMsg extends APIMessage implements SdnControllerMessage { /** * @desc l2Network uuid */ @@ -65,6 +65,7 @@ public class APISdnControllerChangeHostMsg extends APIMessage { @APIParam(required = false) private String lacpMode; + @Override public String getSdnControllerUuid() { return sdnControllerUuid; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java index de7641c30ed..f352ae1cdaa 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java @@ -14,7 +14,7 @@ method = HttpMethod.DELETE, responseClass = APISdnControllerRemoveHostEvent.class ) -public class APISdnControllerRemoveHostMsg extends APIMessage { +public class APISdnControllerRemoveHostMsg extends APIMessage implements SdnControllerMessage { /** * @desc l2Network uuid */ @@ -32,6 +32,7 @@ public class APISdnControllerRemoveHostMsg extends APIMessage { @APIParam(required = false, validValues = {"OvnDpdk", "OvnKernel"}) private String vSwitchType = "OvnDpdk"; + @Override public String getSdnControllerUuid() { return sdnControllerUuid; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerMsg.java index d6f94e18bed..2ceda3f1a5c 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerMsg.java @@ -17,7 +17,7 @@ isAction = true ) @Action(category = SdnControllerConstant.ACTION_CATEGORY) -public class APIUpdateSdnControllerMsg extends APIMessage implements L2NetworkMessage { +public class APIUpdateSdnControllerMsg extends APIMessage implements SdnControllerMessage { @APIParam(resourceType = SdnControllerVO.class, checkAccount = true, operationTarget = true) private String uuid; @APIParam(maxLength = 255, required = false) @@ -50,10 +50,10 @@ public void setDescription(String description) { } @Override - public String getL2NetworkUuid() { + public String getSdnControllerUuid() { return uuid; } - + public static APIUpdateSdnControllerMsg __example__() { APIUpdateSdnControllerMsg msg = new APIUpdateSdnControllerMsg(); msg.setUuid(uuid()); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerMsg.java new file mode 100644 index 00000000000..8a088840326 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerMsg.java @@ -0,0 +1,20 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.NeedReplyMessage; + +public class ReconnectSdnControllerMsg extends NeedReplyMessage implements SdnControllerMessage { + String controllerUUid; + + public String getControllerUUid() { + return controllerUUid; + } + + public void setControllerUUid(String controllerUUid) { + this.controllerUUid = controllerUUid; + } + + @Override + public String getSdnControllerUuid() { + return controllerUUid; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerReply.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerReply.java new file mode 100644 index 00000000000..0d980fa8632 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerReply.java @@ -0,0 +1,6 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.MessageReply; + +public class ReconnectSdnControllerReply extends MessageReply { +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerCanonicalEvents.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerCanonicalEvents.java new file mode 100644 index 00000000000..545db346521 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerCanonicalEvents.java @@ -0,0 +1,58 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.NeedJsonSchema; + +public class SdnControllerCanonicalEvents { + public static final String SDNCONTROLLER_STATE_CHANGED_PATH = "/sdnController/state/change"; + public static final String SDNCONTROLLER_STATUS_CHANGED_PATH = "/sdnController/status/change"; + + @NeedJsonSchema + public static class SdnControllerStatusChangedData { + private String sdnControllerUuid; + private String sdnControllerType; + private String oldStatus; + private String newStatus; + private SdnControllerInventory inv; + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getSdnControllerType() { + return sdnControllerType; + } + + public void setSdnControllerType(String sdnControllerType) { + this.sdnControllerType = sdnControllerType; + } + + public String getOldStatus() { + return oldStatus; + } + + public void setOldStatus(String oldStatus) { + this.oldStatus = oldStatus; + } + + public String getNewStatus() { + return newStatus; + } + + public void setNewStatus(String newStatus) { + this.newStatus = newStatus; + } + + public SdnControllerInventory getInv() { + return inv; + } + + public void setInv(SdnControllerInventory inv) { + this.inv = inv; + } + } + +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerFlowDataParam.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerFlowDataParam.java index 64cf7344de2..9266b61442a 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerFlowDataParam.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerFlowDataParam.java @@ -1,5 +1,5 @@ package org.zstack.sdnController.header; public enum SdnControllerFlowDataParam { - SDN_CONTROLLER_INV, + SDN_CONTROLLER_UUID, } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventoryDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventoryDoc_zh_cn.groovy index fd5d9473e0f..5930ad05ed6 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventoryDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventoryDoc_zh_cn.groovy @@ -8,49 +8,49 @@ import org.zstack.sdnController.header.SdnControllerHostRefInventory doc { - title "在这里输入结构的名称" + title "SDN控制器清单" field { name "uuid" desc "资源的UUID,唯一标示该资源" type "String" - since "5.3.0" + since "3.7" } field { name "vendorType" desc "" type "String" - since "5.3.0" + since "3.7" } field { name "name" desc "资源名称" type "String" - since "5.3.0" + since "3.7" } field { name "description" desc "资源的详细描述" type "String" - since "5.3.0" + since "3.7" } field { name "ip" desc "" type "String" - since "5.3.0" + since "3.7" } field { name "username" desc "" type "String" - since "5.3.0" + since "3.7" } field { name "password" desc "" type "String" - since "5.3.0" + since "3.7" } ref { name "status" @@ -64,20 +64,20 @@ doc { name "createDate" desc "创建时间" type "Timestamp" - since "5.3.0" + since "3.7" } field { name "lastOpDate" desc "最后一次修改时间" type "Timestamp" - since "5.3.0" + since "3.7" } ref { name "vniRanges" path "org.zstack.sdnController.header.SdnControllerInventory.vniRanges" desc "null" type "List" - since "5.3.0" + since "3.7" clz SdnVniRange.class } ref { @@ -85,7 +85,7 @@ doc { path "org.zstack.sdnController.header.SdnControllerInventory.vxlanPools" desc "null" type "List" - since "5.3.0" + since "3.7" clz HardwareL2VxlanNetworkPoolInventory.class } ref { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerRemoveHostMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerRemoveHostMsg.java index 416611e6ccc..abb39e94f6f 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerRemoveHostMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerRemoveHostMsg.java @@ -6,6 +6,7 @@ public class SdnControllerRemoveHostMsg extends NeedReplyMessage implements SdnC private String sdnControllerUuid; private String hostUuid; private String vSwitchType; + private boolean createChain = true; public static SdnControllerRemoveHostMsg fromApi(APISdnControllerRemoveHostMsg amsg) { SdnControllerRemoveHostMsg msg = new SdnControllerRemoveHostMsg(); @@ -39,4 +40,12 @@ public void setvSwitchType(String vSwitchType) { public String getSdnControllerUuid() { return sdnControllerUuid; } + + public boolean isCreateChain() { + return createChain; + } + + public void setCreateChain(boolean createChain) { + this.createChain = createChain; + } } diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/account/AccountSync.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/account/AccountSync.java index d48af64991a..e311e5ddeb5 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/account/AccountSync.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/account/AccountSync.java @@ -1,6 +1,7 @@ package org.zstack.sugonSdnController.account; import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.sdnController.SdnController; import org.zstack.sugonSdnController.controller.SugonSdnController; import org.zstack.sugonSdnController.controller.SugonSdnControllerConstant; import org.zstack.core.db.Q; @@ -8,7 +9,6 @@ import org.zstack.header.identity.BeforeCreateAccountExtensionPoint; import org.zstack.header.identity.BeforeDeleteAccountExtensionPoint; import org.zstack.header.identity.BeforeUpdateAccountExtensionPoint; -import org.zstack.sdnController.SdnController; import org.zstack.sdnController.SdnControllerManager; import org.zstack.sdnController.header.SdnControllerVO; import org.zstack.sdnController.header.SdnControllerVO_; diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java index f4b415c6c8c..9abd1dcf556 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java @@ -19,6 +19,7 @@ import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; import org.zstack.network.l3.L3NetworkSystemTags; import org.zstack.sdnController.SdnController; +import org.zstack.sdnController.SdnControllerL2; import org.zstack.sdnController.header.*; import org.zstack.sugonSdnController.controller.api.*; import org.zstack.sugonSdnController.controller.api.types.*; @@ -34,7 +35,7 @@ import static org.zstack.utils.network.NetworkUtils.getSubnetInfo; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) -public class SugonSdnController implements TfSdnController, SdnController { +public class SugonSdnController implements TfSdnController, SdnController, SdnControllerL2 { private static final CLogger logger = Utils.getLogger(SugonSdnController.class); @Autowired diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnControllerFactory.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnControllerFactory.java index caa7c614a68..2a8d6cc9a93 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnControllerFactory.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnControllerFactory.java @@ -2,6 +2,7 @@ import org.zstack.sdnController.SdnController; import org.zstack.sdnController.SdnControllerFactory; +import org.zstack.sdnController.SdnControllerL2; import org.zstack.sdnController.SdnControllerType; import org.zstack.sdnController.header.SdnControllerVO; @@ -17,4 +18,9 @@ public SdnControllerType getVendorType() { public SdnController getSdnController(SdnControllerVO vo) { return new SugonSdnController(vo); } + + @Override + public SdnControllerL2 getSdnControllerL2(SdnControllerVO vo) { + return new SugonSdnController(vo); + } } diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL2Network.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL2Network.java index 06520d030a7..091b5c946c4 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL2Network.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL2Network.java @@ -1,8 +1,7 @@ package org.zstack.sugonSdnController.network; import org.springframework.beans.factory.annotation.Autowired; -import org.zstack.header.network.l3.L3NetworkVO; -import org.zstack.header.network.l3.L3NetworkVO_; +import org.zstack.sdnController.SdnController; import org.zstack.sugonSdnController.controller.SugonSdnController; import org.zstack.sugonSdnController.controller.SugonSdnControllerConstant; import org.zstack.core.db.Q; @@ -14,7 +13,6 @@ import org.zstack.header.message.Message; import org.zstack.header.network.l2.*; import org.zstack.network.l2.L2NoVlanNetwork; -import org.zstack.sdnController.SdnController; import org.zstack.sdnController.SdnControllerManager; import org.zstack.sdnController.header.SdnControllerVO; import org.zstack.sdnController.header.SdnControllerVO_; diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/L2VxlanNetworkInventoryDoc_zh_cn.groovy b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/L2VxlanNetworkInventoryDoc_zh_cn.groovy index 6b7197330d6..4ba1679e22a 100644 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/L2VxlanNetworkInventoryDoc_zh_cn.groovy +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/L2VxlanNetworkInventoryDoc_zh_cn.groovy @@ -6,55 +6,55 @@ import java.sql.Timestamp doc { - title "在这里输入结构的名称" + title "二层VXLAN网络清单" field { name "vni" - desc "" + desc "Vni号" type "Integer" - since "5.3.0" + since "0.6" } field { name "poolUuid" - desc "" + desc "VXLAN资源池UUID" type "String" - since "5.3.0" + since "0.6" } field { name "uuid" desc "资源的UUID,唯一标示该资源" type "String" - since "5.3.0" + since "0.6" } field { name "name" desc "资源名称" type "String" - since "5.3.0" + since "0.6" } field { name "description" desc "资源的详细描述" type "String" - since "5.3.0" + since "0.6" } field { name "zoneUuid" desc "区域UUID" type "String" - since "5.3.0" + since "0.6" } field { name "physicalInterface" - desc "" + desc "物理网卡" type "String" - since "5.3.0" + since "0.6" } field { name "type" - desc "" + desc "二层网络类型" type "String" - since "5.3.0" + since "0.6" } field { name "vSwitchType" @@ -84,18 +84,18 @@ doc { name "createDate" desc "创建时间" type "Timestamp" - since "5.3.0" + since "0.6" } field { name "lastOpDate" desc "最后一次修改时间" type "Timestamp" - since "5.3.0" + since "0.6" } field { name "attachedClusterUuids" - desc "" + desc "挂载集群的UUID列表" type "List" - since "5.3.0" + since "0.6" } } From c476b96dab3a835c33b3266da69cedd291deb11c Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Mon, 17 Feb 2025 13:06:35 +0800 Subject: [PATCH 262/737] [conf]: Fix schema when upgrade model service - Fix BentoML and Bentoml's typo - Only update framework to bentoml if invalid framework is used to avoid mistakely update all framework of model services to bentoml - If source is empty, set framework to other DBImpact Resolves: ZSTAC-72967 Change-Id: I7873787672786d6165627477757979657572777a Signed-off-by: ye.zou --- conf/db/upgrade/V5.3.20__schema.sql | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.3.20__schema.sql b/conf/db/upgrade/V5.3.20__schema.sql index 67f1ec95951..2e2e92786a7 100644 --- a/conf/db/upgrade/V5.3.20__schema.sql +++ b/conf/db/upgrade/V5.3.20__schema.sql @@ -93,11 +93,14 @@ UPDATE `zstack`.`ModelServiceVO` SET source = framework WHERE source is NULL UPDATE `zstack`.`ModelServiceVO` SET source = 'Other' WHERE source is NULL AND framework not in ('HuggingFace', 'Bentoml', 'Other'); -UPDATE `zstack`.`ModelServiceVO` SET framework = 'BentoML' WHERE source = 'Bentoml'; +UPDATE `zstack`.`ModelServiceVO` SET source = 'Bentoml' WHERE source = 'BentoML'; +UPDATE `zstack`.`ModelServiceVO` SET framework = 'BentoML' WHERE source = 'Bentoml' + AND framework not in ('vLLM', 'Diffusers', 'Transformers', 'sentence_transformers', 'llama.cpp', 'BentoML', 'Other', 'Ollama'); Update ModelServiceVO set framework = 'Other' where framework not in ('vLLM', 'Diffusers', 'Transformers', 'sentence_transformers', 'llama.cpp', 'BentoML', 'Other', 'Ollama') AND source != 'Bentoml'; +Update ModelServiceVO set framework = 'Other' where framework is NULL; DROP PROCEDURE IF EXISTS CreateResourceConfigForBindingVms; DELIMITER $$ From b1584052a46e4bd289eec0c92fc99fbeb5826e56 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Mon, 17 Feb 2025 16:32:40 +0800 Subject: [PATCH 263/737] [sdnController]: fix sdn controller doc Resolves: ZSTAC-73126 Change-Id: I6f63696c7a696572786b6b7670726e746469796e --- ...econnectSdnControllerEventDoc_zh_cn.groovy | 2 +- ...IReconnectSdnControllerMsgDoc_zh_cn.groovy | 2 +- ...ISdnControllerAddHostEventDoc_zh_cn.groovy | 2 +- ...APISdnControllerAddHostMsgDoc_zh_cn.groovy | 20 ++--- ...nControllerChangeHostEventDoc_zh_cn.groovy | 2 +- ...SdnControllerChangeHostMsgDoc_zh_cn.groovy | 16 ++-- ...nControllerRemoveHostEventDoc_zh_cn.groovy | 2 +- ...trollerRemoveHostHostEventDoc_zh_cn.groovy | 32 -------- ...ontrollerRemoveHostHostMsgDoc_zh_cn.groovy | 75 ------------------- ...SdnControllerRemoveHostMsgDoc_zh_cn.groovy | 6 +- .../APISyncSdnControllerEventDoc_zh_cn.groovy | 32 -------- .../APISyncSdnControllerMsgDoc_zh_cn.groovy | 56 -------------- ...ControllerHostRefInventoryDoc_zh_cn.groovy | 18 ++--- .../SdnControllerStatusDoc_zh_cn.groovy | 8 +- .../header/SdnVniRangeDoc_zh_cn.groovy | 6 +- .../vtep/RemoteVtepInventoryDoc_zh_cn.groovy | 24 +++--- .../vxlan/vtep/VtepInventoryDoc_zh_cn.groovy | 32 ++++---- .../VniRangeInventoryDoc_zh_cn.groovy | 24 +++--- 18 files changed, 80 insertions(+), 279 deletions(-) delete mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostHostEventDoc_zh_cn.groovy delete mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostHostMsgDoc_zh_cn.groovy delete mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISyncSdnControllerEventDoc_zh_cn.groovy delete mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISyncSdnControllerMsgDoc_zh_cn.groovy diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEventDoc_zh_cn.groovy index 47be2a91d73..aa592daeb88 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEventDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEventDoc_zh_cn.groovy @@ -5,7 +5,7 @@ import org.zstack.header.errorcode.ErrorCode doc { - title "在这里输入结构的名称" + title "重连SDN控制器清单" ref { name "inventory" diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsgDoc_zh_cn.groovy index e2128fed45b..4343981688d 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsgDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsgDoc_zh_cn.groovy @@ -7,7 +7,7 @@ doc { category "SdnController" - desc """在这里填写API描述""" + desc """重连SDN控制器""" rest { request { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEventDoc_zh_cn.groovy index a7b1dc331ff..4963f1da915 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEventDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEventDoc_zh_cn.groovy @@ -5,7 +5,7 @@ import org.zstack.header.errorcode.ErrorCode doc { - title "在这里输入结构的名称" + title "SDN控制器添加物理机清单" ref { name "inventory" diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsgDoc_zh_cn.groovy index d3fe03c6beb..f6b7d17b8c7 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsgDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsgDoc_zh_cn.groovy @@ -5,9 +5,9 @@ import org.zstack.sdnController.header.APISdnControllerAddHostEvent doc { title "SdnControllerAddHost" - category "未知类别" + category "SDN" - desc """在这里填写API描述""" + desc """SDN控制器添加物理机""" rest { request { @@ -24,7 +24,7 @@ doc { column { name "sdnControllerUuid" enclosedIn "" - desc "" + desc "SDN控制器Uuid" location "url" type "String" optional false @@ -42,17 +42,17 @@ doc { column { name "vSwitchType" enclosedIn "" - desc "" + desc "虚拟交换机类型" location "body" type "String" optional true since "5.3.0" - values ("OvsKernel","OvsDpdk","sriov") + values ("OvsKernel","OvsDpdk","SRIOV") } column { name "nicNames" enclosedIn "" - desc "" + desc "物理机网卡名称列表" location "body" type "List" optional false @@ -61,7 +61,7 @@ doc { column { name "vtepIp" enclosedIn "" - desc "" + desc "物理机VTEP IP" location "body" type "String" optional true @@ -88,7 +88,7 @@ doc { column { name "netmask" enclosedIn "" - desc "" + desc "物理机VTEP IP掩码" location "body" type "String" optional true @@ -97,7 +97,7 @@ doc { column { name "bondMode" enclosedIn "" - desc "" + desc "物理机网卡bond模式" location "body" type "String" optional true @@ -106,7 +106,7 @@ doc { column { name "lacpMode" enclosedIn "" - desc "" + desc "物理机网卡LACP模式" location "body" type "String" optional true diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEventDoc_zh_cn.groovy index 304d4f9dd3f..83e1e8c7c75 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEventDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEventDoc_zh_cn.groovy @@ -5,7 +5,7 @@ import org.zstack.header.errorcode.ErrorCode doc { - title "在这里输入结构的名称" + title "SDN控制器修改物理机清单" ref { name "inventory" diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsgDoc_zh_cn.groovy index dac87e60d85..829c5465372 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsgDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsgDoc_zh_cn.groovy @@ -7,7 +7,7 @@ doc { category "SdnController" - desc """在这里填写API描述""" + desc """SDN控制器修改物理机""" rest { request { @@ -24,7 +24,7 @@ doc { column { name "sdnControllerUuid" enclosedIn "sdnControllerChangeHost" - desc "" + desc "SDN控制器Uuid" location "url" type "String" optional false @@ -42,7 +42,7 @@ doc { column { name "vSwitchType" enclosedIn "sdnControllerChangeHost" - desc "" + desc "虚拟交换机类型" location "body" type "String" optional true @@ -52,7 +52,7 @@ doc { column { name "nicNames" enclosedIn "sdnControllerChangeHost" - desc "" + desc "物理机网卡名称列表" location "body" type "List" optional true @@ -61,7 +61,7 @@ doc { column { name "vtepIp" enclosedIn "sdnControllerChangeHost" - desc "" + desc "物理机VTEP IP" location "body" type "String" optional true @@ -70,7 +70,7 @@ doc { column { name "netmask" enclosedIn "sdnControllerChangeHost" - desc "" + desc "物理机VTEP IP掩码" location "body" type "String" optional true @@ -79,7 +79,7 @@ doc { column { name "bondMode" enclosedIn "sdnControllerChangeHost" - desc "" + desc "物理机网卡bond模式" location "body" type "String" optional true @@ -88,7 +88,7 @@ doc { column { name "lacpMode" enclosedIn "sdnControllerChangeHost" - desc "" + desc "物理机网卡LACP模式" location "body" type "String" optional true diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEventDoc_zh_cn.groovy index ec30dadf5eb..816e1c58ebf 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEventDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEventDoc_zh_cn.groovy @@ -5,7 +5,7 @@ import org.zstack.header.errorcode.ErrorCode doc { - title "在这里输入结构的名称" + title "SDN控制器删除物理机清单" ref { name "inventory" diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostHostEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostHostEventDoc_zh_cn.groovy deleted file mode 100644 index 473a427c3a6..00000000000 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostHostEventDoc_zh_cn.groovy +++ /dev/null @@ -1,32 +0,0 @@ -package org.zstack.sdnController.header - -import org.zstack.sdnController.header.SdnControllerInventory -import org.zstack.header.errorcode.ErrorCode - -doc { - - title "在这里输入结构的名称" - - ref { - name "inventory" - path "org.zstack.sdnController.header.APISdnControllerRemoveHostHostEvent.inventory" - desc "null" - type "SdnControllerInventory" - since "5.3.0" - clz SdnControllerInventory.class - } - field { - name "success" - desc "" - type "boolean" - since "5.3.0" - } - ref { - name "error" - path "org.zstack.sdnController.header.APISdnControllerRemoveHostHostEvent.error" - desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false - type "ErrorCode" - since "5.3.0" - clz ErrorCode.class - } -} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostHostMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostHostMsgDoc_zh_cn.groovy deleted file mode 100644 index e58620d7f5d..00000000000 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostHostMsgDoc_zh_cn.groovy +++ /dev/null @@ -1,75 +0,0 @@ -package org.zstack.sdnController.header - -doc { - title "SdnControllerRemoveHostHost" - - category "未知类别" - - desc """在这里填写API描述""" - - rest { - request { - url "DELETE /v1/sdn-controllers/{sdnControllerUuid}/hosts/{hostUuid}" - - header (Authorization: 'OAuth the-session-uuid') - - clz APISdnControllerRemoveHostMsg.class - - desc """""" - - params { - - column { - name "sdnControllerUuid" - enclosedIn "" - desc "" - location "url" - type "String" - optional false - since "5.3.0" - } - column { - name "hostUuid" - enclosedIn "" - desc "物理机UUID" - location "url" - type "String" - optional false - since "5.3.0" - } - column { - name "vSwitchType" - enclosedIn "" - desc "" - location "body" - type "String" - optional true - since "5.3.0" - values ("OvsKernel","OvsDpdk","sriov") - } - column { - name "systemTags" - enclosedIn "" - desc "系统标签" - location "body" - type "List" - optional true - since "5.3.0" - } - column { - name "userTags" - enclosedIn "" - desc "用户标签" - location "body" - type "List" - optional true - since "5.3.0" - } - } - } - - response { - clz APISdnControllerRemoveHostEvent.class - } - } -} \ No newline at end of file diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsgDoc_zh_cn.groovy index 818681d8fb7..6e52d34edad 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsgDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsgDoc_zh_cn.groovy @@ -7,7 +7,7 @@ doc { category "SdnController" - desc """在这里填写API描述""" + desc """SDN控制器移除物理机""" rest { request { @@ -24,7 +24,7 @@ doc { column { name "sdnControllerUuid" enclosedIn "" - desc "" + desc "SDN控制器Uuid" location "url" type "String" optional false @@ -42,7 +42,7 @@ doc { column { name "vSwitchType" enclosedIn "" - desc "" + desc "虚拟交换机类型" location "body" type "String" optional true diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISyncSdnControllerEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISyncSdnControllerEventDoc_zh_cn.groovy deleted file mode 100644 index 29acf4e9ebe..00000000000 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISyncSdnControllerEventDoc_zh_cn.groovy +++ /dev/null @@ -1,32 +0,0 @@ -package org.zstack.sdnController.header - -import org.zstack.sdnController.header.SdnControllerInventory -import org.zstack.header.errorcode.ErrorCode - -doc { - - title "在这里输入结构的名称" - - ref { - name "inventory" - path "org.zstack.sdnController.header.APISyncSdnControllerEvent.inventory" - desc "null" - type "SdnControllerInventory" - since "5.3.0" - clz SdnControllerInventory.class - } - field { - name "success" - desc "" - type "boolean" - since "5.3.0" - } - ref { - name "error" - path "org.zstack.sdnController.header.APISyncSdnControllerEvent.error" - desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false - type "ErrorCode" - since "5.3.0" - clz ErrorCode.class - } -} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISyncSdnControllerMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISyncSdnControllerMsgDoc_zh_cn.groovy deleted file mode 100644 index 8bb3812aa34..00000000000 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISyncSdnControllerMsgDoc_zh_cn.groovy +++ /dev/null @@ -1,56 +0,0 @@ -package org.zstack.sdnController.header - -doc { - title "SyncSdnController" - - category "SdnController" - - desc """在这里填写API描述""" - - rest { - request { - url "PUT /v1/sdn-controllers/{sdnControllerUuid}/actions" - - header (Authorization: 'OAuth the-session-uuid') - - clz APIReconnectSdnControllerMsg.class - - desc """""" - - params { - - column { - name "sdnControllerUuid" - enclosedIn "syncSdnController" - desc "" - location "url" - type "String" - optional false - since "5.3.0" - } - column { - name "systemTags" - enclosedIn "" - desc "系统标签" - location "body" - type "List" - optional true - since "5.3.0" - } - column { - name "userTags" - enclosedIn "" - desc "用户标签" - location "body" - type "List" - optional true - since "5.3.0" - } - } - } - - response { - clz APIReconnectSdnControllerEvent.class - } - } -} \ No newline at end of file diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefInventoryDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefInventoryDoc_zh_cn.groovy index bb52319c3a7..0eb0f0ed773 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefInventoryDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefInventoryDoc_zh_cn.groovy @@ -4,11 +4,11 @@ package org.zstack.sdnController.header doc { - title "在这里输入结构的名称" + title "SDN控制器物理机清单" field { name "sdnControllerUuid" - desc "" + desc "SDN控制器Uuid" type "String" since "5.3.0" } @@ -20,43 +20,43 @@ doc { } field { name "vSwitchType" - desc "" + desc "虚拟交换机类型" type "String" since "5.3.0" } field { name "vtepIp" - desc "" + desc "物理机VTEP IP" type "String" since "5.3.0" } field { name "nicPciAddresses" - desc "" + desc "物理机网卡和PCI地址映射" type "String" since "5.3.0" } field { name "nicDrivers" - desc "" + desc "物理机网卡和驱动类型映射" type "String" since "5.3.0" } field { name "netmask" - desc "" + desc "物理机VTEP IP掩码" type "String" since "5.3.0" } field { name "bondMode" - desc "" + desc "物理机网卡bond模式" type "String" since "5.3.0" } field { name "lacpMode" - desc "" + desc "物理机网卡LACP模式" type "String" since "5.3.0" } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerStatusDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerStatusDoc_zh_cn.groovy index 60e90effd7d..604ae4193b3 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerStatusDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerStatusDoc_zh_cn.groovy @@ -4,23 +4,23 @@ package org.zstack.sdnController.header doc { - title "在这里输入结构的名称" + title "SDN控制器状态清单" field { name "Connecting" - desc "" + desc "连接中" type "SdnControllerStatus" since "5.3.0" } field { name "Connected" - desc "" + desc "已连接" type "SdnControllerStatus" since "5.3.0" } field { name "Disconnected" - desc "" + desc "已失联" type "SdnControllerStatus" since "5.3.0" } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnVniRangeDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnVniRangeDoc_zh_cn.groovy index 6d7b8e26416..8f7beb9ab16 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnVniRangeDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnVniRangeDoc_zh_cn.groovy @@ -4,18 +4,18 @@ import java.lang.Integer doc { - title "在这里输入结构的名称" + title "SDN控制Vni范围" field { name "startVni" desc "" type "Integer" - since "5.3.0" + since "3.7" } field { name "endVni" desc "" type "Integer" - since "5.3.0" + since "3.7" } } diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/RemoteVtepInventoryDoc_zh_cn.groovy b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/RemoteVtepInventoryDoc_zh_cn.groovy index d6861749481..76251ae7493 100644 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/RemoteVtepInventoryDoc_zh_cn.groovy +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/RemoteVtepInventoryDoc_zh_cn.groovy @@ -5,13 +5,13 @@ import java.sql.Timestamp doc { - title "在这里输入结构的名称" + title "远端VXLAN隧道端点清单" field { name "uuid" desc "资源的UUID,唯一标示该资源" type "String" - since "5.3.0" + since "4.7.11" } field { name "clusterUuid" @@ -21,38 +21,38 @@ doc { } field { name "vtepIp" - desc "" + desc "隧道端点IP地址" type "String" - since "5.3.0" + since "4.7.11" } field { name "port" - desc "" + desc "端口" type "Integer" - since "5.3.0" + since "4.7.11" } field { name "type" - desc "" + desc "类型" type "String" - since "5.3.0" + since "4.7.11" } field { name "createDate" desc "创建时间" type "Timestamp" - since "5.3.0" + since "4.7.11" } field { name "lastOpDate" desc "最后一次修改时间" type "Timestamp" - since "5.3.0" + since "4.7.11" } field { name "poolUuid" - desc "" + desc "VXLAN资源池UUID" type "String" - since "5.3.0" + since "4.7.11" } } diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/VtepInventoryDoc_zh_cn.groovy b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/VtepInventoryDoc_zh_cn.groovy index 8aca6410900..035a90ae789 100644 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/VtepInventoryDoc_zh_cn.groovy +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/VtepInventoryDoc_zh_cn.groovy @@ -5,60 +5,54 @@ import java.sql.Timestamp doc { - title "在这里输入结构的名称" + title "VXLAN隧道端点清单" field { name "uuid" desc "资源的UUID,唯一标示该资源" type "String" - since "5.3.0" + since "0.6" } field { name "hostUuid" desc "物理机UUID" type "String" - since "5.3.0" + since "0.6" } field { name "vtepIp" - desc "" + desc "隧道端点IP地址" type "String" - since "5.3.0" + since "0.6" } field { name "port" - desc "" + desc "端口" type "Integer" - since "5.3.0" + since "0.6" } field { name "type" - desc "" + desc "类型" type "String" - since "5.3.0" - } - field { - name "physicalInterface" - desc "" - type "String" - since "5.3.0" + since "0.6" } field { name "createDate" desc "创建时间" type "Timestamp" - since "5.3.0" + since "0.6" } field { name "lastOpDate" desc "最后一次修改时间" type "Timestamp" - since "5.3.0" + since "0.6" } field { name "poolUuid" - desc "" + desc "VXLAN资源池UUID" type "String" - since "5.3.0" + since "0.6" } } diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VniRangeInventoryDoc_zh_cn.groovy b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VniRangeInventoryDoc_zh_cn.groovy index d9da8fd3aaf..7362248055d 100644 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VniRangeInventoryDoc_zh_cn.groovy +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VniRangeInventoryDoc_zh_cn.groovy @@ -1,58 +1,60 @@ package org.zstack.network.l2.vxlan.vxlanNetworkPool import java.lang.Integer +import java.lang.Integer +import java.sql.Timestamp import java.sql.Timestamp doc { - title "在这里输入结构的名称" + title "vni范围清单" field { name "uuid" desc "资源的UUID,唯一标示该资源" type "String" - since "5.3.0" + since "0.6" } field { name "name" desc "资源名称" type "String" - since "5.3.0" + since "0.6" } field { name "description" desc "资源的详细描述" type "String" - since "5.3.0" + since "0.6" } field { name "startVni" - desc "" + desc "起始VNI" type "Integer" - since "5.3.0" + since "0.6" } field { name "endVni" - desc "" + desc "结束VNI" type "Integer" - since "5.3.0" + since "0.6" } field { name "createDate" desc "创建时间" type "Timestamp" - since "5.3.0" + since "0.6" } field { name "lastOpDate" desc "最后一次修改时间" type "Timestamp" - since "5.3.0" + since "0.6" } field { name "l2NetworkUuid" desc "二层网络UUID" type "String" - since "5.3.0" + since "0.6" } } From 2cbe0e372334893a7bf6b48fbb57098d9568835b Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Mon, 24 Feb 2025 17:10:59 +0800 Subject: [PATCH 264/737] [test]: Trace ai module during ut Resolves: ZSTAC-73285 Change-Id: I787a716b7861677678666a616b72726b7961617a --- test/src/test/resources/log4j2.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/src/test/resources/log4j2.xml b/test/src/test/resources/log4j2.xml index 3f0b9f3d6a0..6668adfdb94 100755 --- a/test/src/test/resources/log4j2.xml +++ b/test/src/test/resources/log4j2.xml @@ -179,6 +179,8 @@ + + From 22cd9376c49ee068096d74891f7df78243a38ec5 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 6 Mar 2025 17:02:15 +0800 Subject: [PATCH 265/737] [sdk]: Update sdk Resolves: ZSTAC-73547 Change-Id: I736c7070717962716d787179736569686665716b --- .../DeployAppDevelopmentServiceAction.java | 6 +++++ .../sdk/DeployModelEvalServiceAction.java | 6 +++++ .../zstack/sdk/DeployModelServiceAction.java | 6 +++++ .../java/org/zstack/testlib/ApiHelper.groovy | 22 +++++++++++-------- 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java index b57327c41fa..1cd5c85591f 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java @@ -58,6 +58,12 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map environmentVariables; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map startupParameters; + @Param(required = true, validValues = {"VirtualMachine","Container"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java index e38b4a7e235..b263f506f37 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java @@ -109,6 +109,12 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map environmentVariables; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map startupParameters; + @Param(required = true, validValues = {"VirtualMachine","Container"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java index 2cdd64afb28..e7535cec1f3 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java @@ -58,6 +58,12 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map environmentVariables; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map startupParameters; + @Param(required = true, validValues = {"VirtualMachine","Container"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index dbca0348e73..b5a7a1b7226 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -13307,6 +13307,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -13333,6 +13334,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -13426,7 +13428,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -13453,7 +13455,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -14965,7 +14967,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -14992,7 +14994,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -15046,7 +15048,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -15073,7 +15075,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -36084,20 +36086,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -41862,6 +41864,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -41888,6 +41891,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + if (System.getProperty("apipath") != null) { if (a.apiId == null) { From e623e17849c6c48decb98632a8aa205963c472e1 Mon Sep 17 00:00:00 2001 From: "yingzhe.hu" Date: Wed, 12 Mar 2025 11:25:52 +0800 Subject: [PATCH 266/737] [root]: bump version to 5.3.28 DBImpact Resolves: ZSTAC-73619 Change-Id: I6b6f69676d75626d706f7a697a6c666779746f64 --- VERSION | 2 +- conf/db/upgrade/V5.3.28__schema.sql | 0 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 conf/db/upgrade/V5.3.28__schema.sql diff --git a/VERSION b/VERSION index 328ed5f6bec..7287a5bd8d0 100755 --- a/VERSION +++ b/VERSION @@ -1,3 +1,3 @@ MAJOR=5 MINOR=3 -UPDATE=20 +UPDATE=28 diff --git a/conf/db/upgrade/V5.3.28__schema.sql b/conf/db/upgrade/V5.3.28__schema.sql new file mode 100644 index 00000000000..e69de29bb2d From 42d18505f99636303292b975270ddf46eb4a306c Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Thu, 13 Mar 2025 17:32:45 +0800 Subject: [PATCH 267/737] [kvm]: resolve inaccurate host takeover check due to clock drift Resolves: ZSTAC-65135 Change-Id: I796f65135b6a71676e796269636d616777756e68 --- plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 25596bc479e..ceb08e2da1b 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -5454,8 +5454,14 @@ public void run(FlowTrigger trigger, Map data) { return; } String timestampOutput = timeRet.getStdout().replaceAll("\r|\n",""); + long currentTimeSeconds = new Date().getTime() / 1000; + long timestampSeconds = Long.parseLong(timestampOutput); - long diff = (new Date().getTime() / 1000) - Long.parseLong(timestampOutput); + if (currentTimeSeconds < timestampSeconds) { + logger.warn(String.format("Current time is earlier than the timestamp. Possible clock synchronization issue. Current: %d, Timestamp: %d", currentTimeSeconds, timestampSeconds)); + } + + long diff = Math.abs(currentTimeSeconds - timestampSeconds); logger.debug(String.format("hostOutput is %s ,The time difference is %d(s) ", hostOutput, diff)); if (diff < HostGlobalConfig.PING_HOST_INTERVAL.value(int.class)) { From b6354ae51befb8faaeae685e66cbe6031fcdb65e Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Tue, 26 Nov 2024 15:52:16 +0800 Subject: [PATCH 268/737] [observabilityServer]: add applianceVm ObservabilityServer for slb log add ObservabilityServer and support custom log service and handle load balance log and metrics Resolves: ZSTAC-71340 Change-Id: I6868776c166888134b344e4298348b44146984f7 --- build/pom.xml | 10 ++ conf/db/upgrade/V5.3.28__schema.sql | 38 +++++ conf/globalConfig/vyos.xml | 7 + ...rtualRouterLoadBalancerExtensionPoint.java | 10 ++ .../ObservabilityServerConstant.java | 17 +++ .../virtualrouter/VirtualRouterCommands.java | 24 +++ .../virtualrouter/VirtualRouterConstant.java | 2 + .../lb/VirtualRouterLoadBalancerBackend.java | 51 ++++++- .../virtualrouter/vyos/VyosGlobalConfig.java | 4 + sdk/src/main/java/SourceClassMap.java | 8 + ...achServiceToObservabilityServerAction.java | 107 +++++++++++++ ...achServiceToObservabilityServerResult.java | 14 ++ .../sdk/CreateObservabilityServerAction.java | 128 ++++++++++++++++ ...eateObservabilityServerOfferingAction.java | 143 ++++++++++++++++++ .../sdk/CreateObservabilityServerResult.java | 14 ++ ...hServiceFromObservabilityServerAction.java | 107 +++++++++++++ ...hServiceFromObservabilityServerResult.java | 14 ++ ...tObservabilityServerServiceDataAction.java | 116 ++++++++++++++ ...tObservabilityServerServiceDataResult.java | 22 +++ .../zstack/sdk/LoadBalancerDataInventory.java | 119 +++++++++++++++ .../ObservabilityServerOfferingInventory.java | 47 ++++++ ...servabilityServerServiceDataInventory.java | 23 +++ .../sdk/ObservabilityServerVmInventory.java | 15 ++ .../java/org/zstack/testlib/ApiHelper.groovy | 135 +++++++++++++++++ .../testlib/VirtualRouterOfferingSpec.groovy | 4 + 25 files changed, 1178 insertions(+), 1 deletion(-) create mode 100644 header/src/main/java/org/zstack/header/network/service/VirtualRouterLoadBalancerExtensionPoint.java create mode 100644 header/src/main/java/org/zstack/header/observabilityServer/ObservabilityServerConstant.java create mode 100644 sdk/src/main/java/org/zstack/sdk/AttachServiceToObservabilityServerAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/AttachServiceToObservabilityServerResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerOfferingAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DetachServiceFromObservabilityServerAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DetachServiceFromObservabilityServerResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/GetObservabilityServerServiceDataAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/GetObservabilityServerServiceDataResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/LoadBalancerDataInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ObservabilityServerOfferingInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ObservabilityServerServiceDataInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ObservabilityServerVmInventory.java diff --git a/build/pom.xml b/build/pom.xml index b782143e80a..96170f5c51e 100755 --- a/build/pom.xml +++ b/build/pom.xml @@ -626,6 +626,11 @@ ovn ${project.version} + + org.zstack + observabilityServer + ${project.version} + @@ -930,5 +935,10 @@ hostNetworkInterface ${project.version} + + org.zstack + observabilityServer + ${project.version} + diff --git a/conf/db/upgrade/V5.3.28__schema.sql b/conf/db/upgrade/V5.3.28__schema.sql index e69de29bb2d..f96c39a778e 100644 --- a/conf/db/upgrade/V5.3.28__schema.sql +++ b/conf/db/upgrade/V5.3.28__schema.sql @@ -0,0 +1,38 @@ +CREATE TABLE `zstack`.`ObservabilityServerOfferingVO`( + `uuid` varchar(32) NOT NULL UNIQUE, + `managementNetworkUuid` varchar(32) DEFAULT NULL, + `publicNetworkUuid` varchar(32) DEFAULT NULL, + `imageUuid` varchar(32) NOT NULL, + `zoneUuid` varchar(32) NOT NULL, + `isDefault` tinyint(1) unsigned DEFAULT 0, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE ObservabilityServerOfferingVO ADD CONSTRAINT fkObservabilityServerOfferingVOImageEO FOREIGN KEY (imageUuid) REFERENCES ImageEO (uuid) ON DELETE CASCADE; +ALTER TABLE ObservabilityServerOfferingVO ADD CONSTRAINT fkObservabilityServerOfferingVOInstanceOfferingEO FOREIGN KEY (uuid) REFERENCES InstanceOfferingEO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE; +ALTER TABLE ObservabilityServerOfferingVO ADD CONSTRAINT fkObservabilityServerOfferingVOL3NetworkEO FOREIGN KEY (managementNetworkUuid) REFERENCES L3NetworkEO (uuid) ON DELETE CASCADE; +ALTER TABLE ObservabilityServerOfferingVO ADD CONSTRAINT fkObservabilityServerOfferingVOL3NetworkEO1 FOREIGN KEY (publicNetworkUuid) REFERENCES L3NetworkEO (uuid) ON DELETE CASCADE; +ALTER TABLE ObservabilityServerOfferingVO ADD CONSTRAINT fkObservabilityServerOfferingVOZoneEO FOREIGN KEY (zoneUuid) REFERENCES ZoneEO (uuid) ON DELETE CASCADE; + +CREATE TABLE `zstack`.`ObservabilityServerVmVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `publicNetworkUuid` varchar(32) DEFAULT NULL, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE ObservabilityServerVmVO ADD CONSTRAINT fkObservabilityServerVmVOVmInstanceEO FOREIGN KEY (uuid) REFERENCES VmInstanceEO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE; + +CREATE TABLE `zstack`.`ObservabilityServerServiceRefVO`( + `id` BIGINT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT, + `observabilityServerOfferingUuid` varchar(32) DEFAULT NULL, + `observabilityServerUuid` varchar(32) NOT NULL, + `serviceUuid` varchar(32) NOT NULL, + `serviceType` varchar(32) NOT NULL, + `observabilityServerPublicIp` varchar(32) DEFAULT NULL, + `servicePublicIp` varchar(32) DEFAULT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', +PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE ObservabilityServerServiceRefVO ADD CONSTRAINT fkObservabilityServerServiceRefVOResourceVO FOREIGN KEY (serviceUuid) REFERENCES ResourceVO (uuid) ON DELETE CASCADE; diff --git a/conf/globalConfig/vyos.xml b/conf/globalConfig/vyos.xml index e6345177f14..6d341d58a50 100755 --- a/conf/globalConfig/vyos.xml +++ b/conf/globalConfig/vyos.xml @@ -35,6 +35,13 @@ java.lang.Boolean false + + vyos + enable.loadbalancer.stats.log + open haproxy stats log + java.lang.Boolean + false + vyos enable.vyos.cmd diff --git a/header/src/main/java/org/zstack/header/network/service/VirtualRouterLoadBalancerExtensionPoint.java b/header/src/main/java/org/zstack/header/network/service/VirtualRouterLoadBalancerExtensionPoint.java new file mode 100644 index 00000000000..d3840068954 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/service/VirtualRouterLoadBalancerExtensionPoint.java @@ -0,0 +1,10 @@ +package org.zstack.header.network.service; + +import org.zstack.header.core.Completion; + +/** + * Created by boce.wang on 11/25/2024. + */ +public interface VirtualRouterLoadBalancerExtensionPoint { + void afterRefreshLoadBalancerListener(String vrUuid, Completion completion); +} diff --git a/header/src/main/java/org/zstack/header/observabilityServer/ObservabilityServerConstant.java b/header/src/main/java/org/zstack/header/observabilityServer/ObservabilityServerConstant.java new file mode 100644 index 00000000000..76ff8dfa432 --- /dev/null +++ b/header/src/main/java/org/zstack/header/observabilityServer/ObservabilityServerConstant.java @@ -0,0 +1,17 @@ +package org.zstack.header.observabilityServer; + +import org.zstack.header.configuration.PythonClass; + +/** + * Created by boce.wang on 11/25/2024. + */ +public interface ObservabilityServerConstant { + @PythonClass + public static final String OBSERVABILITY_SERVER_VM_TYPE = "ObservabilityServer"; + @PythonClass + public static final String OBSERVABILITY_SERVER_OFFERING_TYPE = "ObservabilityServer"; + @PythonClass + public static final String SERVICE_ID = "observabilityServer"; + public static final String ACTION_CATEGORY = "observabilityServer"; + +} diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterCommands.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterCommands.java index 51dfcfd76f3..3d9f9636058 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterCommands.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterCommands.java @@ -1264,4 +1264,28 @@ public void setTimeServers(List timeServers) { public static class ConfigureNtpRsp extends AgentResponse { } + + public static class ConfigPromtailCmd extends AgentCommand { + @GrayVersion(value = "5.3.28") + private boolean enable; + + @GrayVersion(value = "5.3.28") + private String logTarget; + + public boolean isEnable() { + return enable; + } + + public void setEnable(boolean enable) { + this.enable = enable; + } + + public String getLogTarget() { + return logTarget; + } + + public void setLogTarget(String logTarget) { + this.logTarget = logTarget; + } + } } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterConstant.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterConstant.java index df19315cc73..01a7899fecc 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterConstant.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterConstant.java @@ -49,6 +49,8 @@ public interface VirtualRouterConstant { public static final String VR_CREATE_VIP = "/createvip"; public static final String VR_REMOVE_VIP = "/removevip"; + public static final String VR_CONFIG_PROMTAIL = "/promtail/config"; + public static final String VR_KVM_CREATE_BOOTSTRAP_ISO_PATH = "/virtualrouter/createbootstrapiso"; public static final String VR_KVM_DELETE_BOOTSTRAP_ISO_PATH = "/virtualrouter/deletebootstrapiso"; diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterLoadBalancerBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterLoadBalancerBackend.java index 527dfdd8a16..c08db611610 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterLoadBalancerBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterLoadBalancerBackend.java @@ -53,6 +53,7 @@ import org.zstack.network.service.virtualrouter.ha.VirtualRouterHaBackend; import org.zstack.network.service.virtualrouter.vip.VipConfigProxy; import org.zstack.network.service.virtualrouter.vip.VirtualRouterVipBackend; +import org.zstack.resourceconfig.ResourceConfig; import org.zstack.resourceconfig.ResourceConfigFacade; import org.zstack.resourceconfig.ResourceConfigVO; import org.zstack.resourceconfig.ResourceConfigVO_; @@ -274,6 +275,8 @@ public static class LbTO { boolean enableFullLog; + boolean enableStatsLog; + public static class ServerGroup { private String name; private String serverGroupUuid; @@ -498,6 +501,14 @@ public void setEnableFullLog(boolean enableFullLog) { this.enableFullLog = enableFullLog; } + public boolean isEnableStatsLog() { + return enableStatsLog; + } + + public void setEnableStatsLog(boolean enableStatsLog) { + this.enableStatsLog = enableStatsLog; + } + public String getVipL3Uuid() { return vipL3Uuid; } @@ -610,7 +621,6 @@ private String getListenerLogFlagValue(String resourceUuid) { .eq(ResourceConfigVO_.resourceUuid, resourceUuid) .findValue(); return value; - } public boolean enableFullLog(LbTO to, VirtualRouterVmInventory vr) { @@ -632,6 +642,15 @@ public boolean enableFullLog(LbTO to, VirtualRouterVmInventory vr) { } } + public boolean enableStatsLog(LbTO to) { + ResourceConfig rc = rcf.getResourceConfig(VyosGlobalConfig.ENABLE_LOADBALANCER_STATS_LOG.getIdentity()); + if (rc != null) { + return rc.getResourceConfigValue(to.getLbUuid(), boolean.class); + } else { + return false; + } + } + public List makeCommonLbTOs(final LoadBalancerStruct struct) { return makeLbTOs(struct, null); } @@ -982,6 +1001,7 @@ public String call(String arg) { to.setParameters(params); if (vr != null) { to.setEnableFullLog(enableFullLog(to, vr)); + to.setEnableStatsLog(enableStatsLog(to)); } return to; } @@ -1294,6 +1314,7 @@ public void run(FlowTrigger trigger, Map data) { msg.setCheckStatus(statusCheck); for (VirtualRouterLoadBalancerBackend.LbTO to: listeners) { to.setEnableFullLog(enableFullLog(to, vr)); + to.setEnableStatsLog(enableStatsLog(to)); } cmd.setLbs(listeners); cmd.enableHaproxyLog = rcf.getResourceConfigValue(VyosGlobalConfig.ENABLE_HAPROXY_LOG, vr.getUuid(), Boolean.class); @@ -1316,6 +1337,34 @@ public void run(MessageReply reply) { } }); } + }).then(new NoRollbackFlow() { + String __name__ = "after-refresh-lb-listeners"; + + @Override + public void run(FlowTrigger trigger, Map data) { + new While<>(pluginRgty.getExtensionList(VirtualRouterLoadBalancerExtensionPoint.class)).each((ext, whileCompletion) -> { + ext.afterRefreshLoadBalancerListener(vr.getUuid(), new Completion(whileCompletion) { + @Override + public void success() { + whileCompletion.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + whileCompletion.addError(errorCode); + whileCompletion.allDone(); + } + }); + }).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + logger.warn(String.format("after refresh load balancer listener failed, because:%s", errorCodeList.getCauses().get(0))); + } + trigger.next(); + } + }); + } }).done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosGlobalConfig.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosGlobalConfig.java index 5d99f357396..8d91aab7231 100644 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosGlobalConfig.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosGlobalConfig.java @@ -36,6 +36,10 @@ public class VyosGlobalConfig { @BindResourceConfig({VmInstanceVO.class, LoadBalancerVO.class, LoadBalancerListenerVO.class}) public static GlobalConfig ENABLE_LOADBALANCER_FULL_LOG = new GlobalConfig(CATEGORY, "enable.loadbalancer.full.log"); + @GlobalConfigValidation + @BindResourceConfig({LoadBalancerVO.class}) + public static GlobalConfig ENABLE_LOADBALANCER_STATS_LOG = new GlobalConfig(CATEGORY, "enable.loadbalancer.stats.log"); + @GlobalConfigValidation @BindResourceConfig({VmInstanceVO.class}) public static GlobalConfig ENABLE_VYOS_CMD = new GlobalConfig(CATEGORY, "enable.vyos.cmd"); diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 0700d46718c..d7f6c2ffe2e 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -525,6 +525,10 @@ public class SourceClassMap { put("org.zstack.network.service.virtualrouter.VirtualRouterOfferingInventory", "org.zstack.sdk.VirtualRouterOfferingInventory"); put("org.zstack.network.service.virtualrouter.VirtualRouterSoftwareVersionInventory", "org.zstack.sdk.VirtualRouterSoftwareVersionInventory"); put("org.zstack.network.service.virtualrouter.VirtualRouterVmInventory", "org.zstack.sdk.VirtualRouterVmInventory"); + put("org.zstack.observabilityServer.ObservabilityServerOfferingInventory", "org.zstack.sdk.ObservabilityServerOfferingInventory"); + put("org.zstack.observabilityServer.ObservabilityServerVmInventory", "org.zstack.sdk.ObservabilityServerVmInventory"); + put("org.zstack.observabilityServer.service.ObservabilityServerServiceDataInventory", "org.zstack.sdk.ObservabilityServerServiceDataInventory"); + put("org.zstack.observabilityServer.service.loadBalancer.LoadBalancerDataInventory", "org.zstack.sdk.LoadBalancerDataInventory"); put("org.zstack.ovf.datatype.ImagePackageInventory", "org.zstack.sdk.ImagePackageInventory"); put("org.zstack.ovf.datatype.ImagePackageState", "org.zstack.sdk.ImagePackageState"); put("org.zstack.ovf.datatype.OvfCdDriverInfo", "org.zstack.sdk.OvfCdDriverInfo"); @@ -1058,6 +1062,7 @@ public class SourceClassMap { put("org.zstack.sdk.LdapServerInventory", "org.zstack.ldap.LdapServerInventory"); put("org.zstack.sdk.LicenseAddOnInventory", "org.zstack.license.LicenseAddOnInventory"); put("org.zstack.sdk.LicenseInventory", "org.zstack.license.LicenseInventory"); + put("org.zstack.sdk.LoadBalancerDataInventory", "org.zstack.observabilityServer.service.loadBalancer.LoadBalancerDataInventory"); put("org.zstack.sdk.LoadBalancerInventory", "org.zstack.network.service.lb.LoadBalancerInventory"); put("org.zstack.sdk.LoadBalancerListenerACLRefInventory", "org.zstack.network.service.lb.LoadBalancerListenerACLRefInventory"); put("org.zstack.sdk.LoadBalancerListenerCertificateRefInventory", "org.zstack.network.service.lb.LoadBalancerListenerCertificateRefInventory"); @@ -1133,6 +1138,9 @@ public class SourceClassMap { put("org.zstack.sdk.NvmeTargetInventory", "org.zstack.storage.device.nvme.NvmeTargetInventory"); put("org.zstack.sdk.OAuth2ClientInventory", "org.zstack.sso.header.OAuth2ClientInventory"); put("org.zstack.sdk.OAuth2TokenInventory", "org.zstack.sso.header.OAuth2TokenInventory"); + put("org.zstack.sdk.ObservabilityServerOfferingInventory", "org.zstack.observabilityServer.ObservabilityServerOfferingInventory"); + put("org.zstack.sdk.ObservabilityServerServiceDataInventory", "org.zstack.observabilityServer.service.ObservabilityServerServiceDataInventory"); + put("org.zstack.sdk.ObservabilityServerVmInventory", "org.zstack.observabilityServer.ObservabilityServerVmInventory"); put("org.zstack.sdk.OssBucketInventory", "org.zstack.header.aliyun.oss.OssBucketInventory"); put("org.zstack.sdk.OssBucketProperty", "org.zstack.header.aliyun.oss.OssBucketProperty"); put("org.zstack.sdk.OvfCdDriverInfo", "org.zstack.ovf.datatype.OvfCdDriverInfo"); diff --git a/sdk/src/main/java/org/zstack/sdk/AttachServiceToObservabilityServerAction.java b/sdk/src/main/java/org/zstack/sdk/AttachServiceToObservabilityServerAction.java new file mode 100644 index 00000000000..55aef430174 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AttachServiceToObservabilityServerAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class AttachServiceToObservabilityServerAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.AttachServiceToObservabilityServerResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String observabilityServerUuid; + + @Param(required = true, validValues = {"loadBalancer"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceType; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceUuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.AttachServiceToObservabilityServerResult value = res.getResult(org.zstack.sdk.AttachServiceToObservabilityServerResult.class); + ret.value = value == null ? new org.zstack.sdk.AttachServiceToObservabilityServerResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/observability-server/{observabilityServerUuid}/service"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AttachServiceToObservabilityServerResult.java b/sdk/src/main/java/org/zstack/sdk/AttachServiceToObservabilityServerResult.java new file mode 100644 index 00000000000..e44bb9be0bb --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AttachServiceToObservabilityServerResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ObservabilityServerVmInventory; + +public class AttachServiceToObservabilityServerResult { + public ObservabilityServerVmInventory inventory; + public void setInventory(ObservabilityServerVmInventory inventory) { + this.inventory = inventory; + } + public ObservabilityServerVmInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerAction.java b/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerAction.java new file mode 100644 index 00000000000..1718256febd --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerAction.java @@ -0,0 +1,128 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateObservabilityServerAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.CreateObservabilityServerResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String observabilityServerOfferingUuid; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clusterUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String primaryStorageUuidForRootVolume; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List rootVolumeSystemTags; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.CreateObservabilityServerResult value = res.getResult(org.zstack.sdk.CreateObservabilityServerResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateObservabilityServerResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/observability-servers"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerOfferingAction.java new file mode 100644 index 00000000000..4c8ac995430 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerOfferingAction.java @@ -0,0 +1,143 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateObservabilityServerOfferingAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.CreateInstanceOfferingResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String managementNetworkUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String imageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String publicNetworkUuid; + + @Param(required = false) + public java.lang.Boolean isDefault; + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {1L,1024L}, noTrim = false) + public int cpuNum = 0; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {1L,9223372036854775807L}, numberRangeUnit = {"byte", "bytes"}, noTrim = false) + public long memorySize = 0L; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {0L,9223372036854775807L}, numberRangeUnit = {"byte", "bytes"}, noTrim = false) + public long reservedMemorySize = 0L; + + @Param(required = false) + public java.lang.String allocatorStrategy; + + @Param(required = false) + public int sortKey = 0; + + @Param(required = false) + public java.lang.String type; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.CreateInstanceOfferingResult value = res.getResult(org.zstack.sdk.CreateInstanceOfferingResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateInstanceOfferingResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/instance-offerings/observability-servers"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerResult.java b/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerResult.java new file mode 100644 index 00000000000..f222f70a45e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VmInstanceInventory; + +public class CreateObservabilityServerResult { + public VmInstanceInventory inventory; + public void setInventory(VmInstanceInventory inventory) { + this.inventory = inventory; + } + public VmInstanceInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DetachServiceFromObservabilityServerAction.java b/sdk/src/main/java/org/zstack/sdk/DetachServiceFromObservabilityServerAction.java new file mode 100644 index 00000000000..7e4761f8d5e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DetachServiceFromObservabilityServerAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DetachServiceFromObservabilityServerAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DetachServiceFromObservabilityServerResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String observabilityServerUuid; + + @Param(required = true, validValues = {"loadBalancer"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceType; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceUuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DetachServiceFromObservabilityServerResult value = res.getResult(org.zstack.sdk.DetachServiceFromObservabilityServerResult.class); + ret.value = value == null ? new org.zstack.sdk.DetachServiceFromObservabilityServerResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/observability-server/{observabilityServerUuid}/service"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DetachServiceFromObservabilityServerResult.java b/sdk/src/main/java/org/zstack/sdk/DetachServiceFromObservabilityServerResult.java new file mode 100644 index 00000000000..81d7ee6a439 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DetachServiceFromObservabilityServerResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ObservabilityServerVmInventory; + +public class DetachServiceFromObservabilityServerResult { + public ObservabilityServerVmInventory inventory; + public void setInventory(ObservabilityServerVmInventory inventory) { + this.inventory = inventory; + } + public ObservabilityServerVmInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetObservabilityServerServiceDataAction.java b/sdk/src/main/java/org/zstack/sdk/GetObservabilityServerServiceDataAction.java new file mode 100644 index 00000000000..78366a1748e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetObservabilityServerServiceDataAction.java @@ -0,0 +1,116 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetObservabilityServerServiceDataAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.GetObservabilityServerServiceDataResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String observabilityServerUuid; + + @Param(required = true, validValues = {"loadBalancer"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceType; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {0L,1000L}, noTrim = false) + public java.lang.Integer limit; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String startTime; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String endTime; + + @Param(required = false, validValues = {"asc","desc"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String sortDirection = "desc"; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map labelFilters; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.GetObservabilityServerServiceDataResult value = res.getResult(org.zstack.sdk.GetObservabilityServerServiceDataResult.class); + ret.value = value == null ? new org.zstack.sdk.GetObservabilityServerServiceDataResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/observability-server/{observabilityServerUuid}/service-data"; + info.needSession = true; + info.needPoll = false; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetObservabilityServerServiceDataResult.java b/sdk/src/main/java/org/zstack/sdk/GetObservabilityServerServiceDataResult.java new file mode 100644 index 00000000000..d846432322c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetObservabilityServerServiceDataResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class GetObservabilityServerServiceDataResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Integer total; + public void setTotal(java.lang.Integer total) { + this.total = total; + } + public java.lang.Integer getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/LoadBalancerDataInventory.java b/sdk/src/main/java/org/zstack/sdk/LoadBalancerDataInventory.java new file mode 100644 index 00000000000..a8fc46e337b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/LoadBalancerDataInventory.java @@ -0,0 +1,119 @@ +package org.zstack.sdk; + + + +public class LoadBalancerDataInventory extends org.zstack.sdk.ObservabilityServerServiceDataInventory { + + public java.lang.String listenerUuid; + public void setListenerUuid(java.lang.String listenerUuid) { + this.listenerUuid = listenerUuid; + } + public java.lang.String getListenerUuid() { + return this.listenerUuid; + } + + public java.lang.String clientIp; + public void setClientIp(java.lang.String clientIp) { + this.clientIp = clientIp; + } + public java.lang.String getClientIp() { + return this.clientIp; + } + + public java.lang.String frontendIp; + public void setFrontendIp(java.lang.String frontendIp) { + this.frontendIp = frontendIp; + } + public java.lang.String getFrontendIp() { + return this.frontendIp; + } + + public java.lang.String backendIp; + public void setBackendIp(java.lang.String backendIp) { + this.backendIp = backendIp; + } + public java.lang.String getBackendIp() { + return this.backendIp; + } + + public java.lang.String statusCode; + public void setStatusCode(java.lang.String statusCode) { + this.statusCode = statusCode; + } + public java.lang.String getStatusCode() { + return this.statusCode; + } + + public java.lang.String inBytes; + public void setInBytes(java.lang.String inBytes) { + this.inBytes = inBytes; + } + public java.lang.String getInBytes() { + return this.inBytes; + } + + public java.lang.String outBytes; + public void setOutBytes(java.lang.String outBytes) { + this.outBytes = outBytes; + } + public java.lang.String getOutBytes() { + return this.outBytes; + } + + public java.lang.String activeConnections; + public void setActiveConnections(java.lang.String activeConnections) { + this.activeConnections = activeConnections; + } + public java.lang.String getActiveConnections() { + return this.activeConnections; + } + + public java.lang.String backendConnections; + public void setBackendConnections(java.lang.String backendConnections) { + this.backendConnections = backendConnections; + } + public java.lang.String getBackendConnections() { + return this.backendConnections; + } + + public java.lang.String httpTime; + public void setHttpTime(java.lang.String httpTime) { + this.httpTime = httpTime; + } + public java.lang.String getHttpTime() { + return this.httpTime; + } + + public java.lang.String retriesCount; + public void setRetriesCount(java.lang.String retriesCount) { + this.retriesCount = retriesCount; + } + public java.lang.String getRetriesCount() { + return this.retriesCount; + } + + public java.lang.String serviceName; + public void setServiceName(java.lang.String serviceName) { + this.serviceName = serviceName; + } + public java.lang.String getServiceName() { + return this.serviceName; + } + + public java.lang.String logTimestamp; + public void setLogTimestamp(java.lang.String logTimestamp) { + this.logTimestamp = logTimestamp; + } + public java.lang.String getLogTimestamp() { + return this.logTimestamp; + } + + public java.lang.String logCount; + public void setLogCount(java.lang.String logCount) { + this.logCount = logCount; + } + public java.lang.String getLogCount() { + return this.logCount; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ObservabilityServerOfferingInventory.java b/sdk/src/main/java/org/zstack/sdk/ObservabilityServerOfferingInventory.java new file mode 100644 index 00000000000..5bbc2517b70 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ObservabilityServerOfferingInventory.java @@ -0,0 +1,47 @@ +package org.zstack.sdk; + + + +public class ObservabilityServerOfferingInventory extends org.zstack.sdk.InstanceOfferingInventory { + + public java.lang.String managementNetworkUuid; + public void setManagementNetworkUuid(java.lang.String managementNetworkUuid) { + this.managementNetworkUuid = managementNetworkUuid; + } + public java.lang.String getManagementNetworkUuid() { + return this.managementNetworkUuid; + } + + public java.lang.String publicNetworkUuid; + public void setPublicNetworkUuid(java.lang.String publicNetworkUuid) { + this.publicNetworkUuid = publicNetworkUuid; + } + public java.lang.String getPublicNetworkUuid() { + return this.publicNetworkUuid; + } + + public java.lang.String zoneUuid; + public void setZoneUuid(java.lang.String zoneUuid) { + this.zoneUuid = zoneUuid; + } + public java.lang.String getZoneUuid() { + return this.zoneUuid; + } + + public java.lang.Boolean isDefault; + public void setIsDefault(java.lang.Boolean isDefault) { + this.isDefault = isDefault; + } + public java.lang.Boolean getIsDefault() { + return this.isDefault; + } + + public java.lang.String imageUuid; + public void setImageUuid(java.lang.String imageUuid) { + this.imageUuid = imageUuid; + } + public java.lang.String getImageUuid() { + return this.imageUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ObservabilityServerServiceDataInventory.java b/sdk/src/main/java/org/zstack/sdk/ObservabilityServerServiceDataInventory.java new file mode 100644 index 00000000000..be26a28052e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ObservabilityServerServiceDataInventory.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class ObservabilityServerServiceDataInventory { + + public java.lang.String job; + public void setJob(java.lang.String job) { + this.job = job; + } + public java.lang.String getJob() { + return this.job; + } + + public java.lang.String fileName; + public void setFileName(java.lang.String fileName) { + this.fileName = fileName; + } + public java.lang.String getFileName() { + return this.fileName; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ObservabilityServerVmInventory.java b/sdk/src/main/java/org/zstack/sdk/ObservabilityServerVmInventory.java new file mode 100644 index 00000000000..a21959e5ed1 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ObservabilityServerVmInventory.java @@ -0,0 +1,15 @@ +package org.zstack.sdk; + + + +public class ObservabilityServerVmInventory extends org.zstack.sdk.ApplianceVmInventory { + + public java.lang.String publicNetworkUuid; + public void setPublicNetworkUuid(java.lang.String publicNetworkUuid) { + this.publicNetworkUuid = publicNetworkUuid; + } + public java.lang.String getPublicNetworkUuid() { + return this.publicNetworkUuid; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index b5a7a1b7226..3cc7e2afb19 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -4337,6 +4337,33 @@ abstract class ApiHelper { } + def attachServiceToObservabilityServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AttachServiceToObservabilityServerAction.class) Closure c) { + def a = new org.zstack.sdk.AttachServiceToObservabilityServerAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def attachSshKeyPairToVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AttachSshKeyPairToVmInstanceAction.class) Closure c) { def a = new org.zstack.sdk.AttachSshKeyPairToVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -10115,6 +10142,60 @@ abstract class ApiHelper { } + def createObservabilityServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateObservabilityServerAction.class) Closure c) { + def a = new org.zstack.sdk.CreateObservabilityServerAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def createObservabilityServerOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateObservabilityServerOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.CreateObservabilityServerOfferingAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def createOssBackupBucketRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateOssBackupBucketRemoteAction.class) Closure c) { def a = new org.zstack.sdk.CreateOssBackupBucketRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -18566,6 +18647,33 @@ abstract class ApiHelper { } + def detachServiceFromObservabilityServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachServiceFromObservabilityServerAction.class) Closure c) { + def a = new org.zstack.sdk.DetachServiceFromObservabilityServerAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def detachSshKeyPairFromVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachSshKeyPairFromVmInstanceAction.class) Closure c) { def a = new org.zstack.sdk.DetachSshKeyPairFromVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -22913,6 +23021,33 @@ abstract class ApiHelper { } + def getObservabilityServerServiceData(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetObservabilityServerServiceDataAction.class) Closure c) { + def a = new org.zstack.sdk.GetObservabilityServerServiceDataAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def getOssBackupBucketFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetOssBackupBucketFromRemoteAction.class) Closure c) { def a = new org.zstack.sdk.GetOssBackupBucketFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid diff --git a/testlib/src/main/java/org/zstack/testlib/VirtualRouterOfferingSpec.groovy b/testlib/src/main/java/org/zstack/testlib/VirtualRouterOfferingSpec.groovy index 4fdf960c792..1279c3a47df 100755 --- a/testlib/src/main/java/org/zstack/testlib/VirtualRouterOfferingSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/VirtualRouterOfferingSpec.groovy @@ -180,6 +180,10 @@ class VirtualRouterOfferingSpec extends InstanceOfferingSpec { simulator(VirtualRouterConstant.VR_HA_MASTER_DEMOTE) { return new VirtualRouterCommands.AgentResponse() } + + simulator(VirtualRouterConstant.VR_CONFIG_PROMTAIL) { + return new VirtualRouterCommands.AgentResponse() + } } } From 1b2e96d590bca16dabd510e7cd9e29bdfc1d01af Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Fri, 14 Mar 2025 13:24:55 +0800 Subject: [PATCH 269/737] [plugin]: reload db on construct Resolves: ZSTAC-73695 Change-Id: I7179697068696e787761666a6f6c707075717279 (cherry picked from commit 30c68447ec8364a8afd50bfcbcb987cf2d8188f6) --- .../java/org/zstack/storage/zbs/ZbsStorageController.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index a18806de546..8572b86ac40 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -206,6 +206,8 @@ public void deactivateHeartbeatVolume(HostInventory h, Completion comp) { @Override public HeartbeatVolumeTO getHeartbeatVolumeActiveInfo(HostInventory h) { + reloadDbInfo(); + // FIXME: hard code for install path CbdHeartbeatVolumeTO to = new CbdHeartbeatVolumeTO(); to.setInstallPath(String.format("cbd:%s_physical/%s/%s", config.getLogicalPoolName(), config.getLogicalPoolName(), ZbsConstants.ZBS_HEARTBEAT_VOLUME_NAME)); @@ -482,6 +484,8 @@ public StorageCapabilities reportCapabilities() { @Override public String allocateSpace(AllocateSpaceSpec aspec) { + reloadDbInfo(); + // TODO allocate pool LogicalPoolInfo logicalPoolInfo = allocateFreePool(aspec.getSize()); if (logicalPoolInfo == null) { @@ -1681,5 +1685,6 @@ public static class AgentCommand extends ZbsMdsBase.AgentCommand { public ZbsStorageController(ExternalPrimaryStorageVO self) { this.self = self; + this.reloadDbInfo(); } } From 79b5b8db1bec564dab559cd755b7d7880d8640b7 Mon Sep 17 00:00:00 2001 From: shenjin Date: Tue, 18 Mar 2025 10:42:57 +0800 Subject: [PATCH 270/737] [conf]: support platform operation log to logServer add new resource LogServerVO, support real-time synchronization of platform operation log to the log server with fluent-bit Resolves: ZSTAC-71192 Change-Id: I6a7868686e767a6a7766687a6d7876757671746f --- conf/db/upgrade/V5.3.28__schema.sql | 13 ++ conf/errorElaborations/Elaboration.json | 8 ++ conf/persistence.xml | 1 + sdk/src/main/java/SourceClassMap.java | 8 ++ .../org/zstack/sdk/AddLogServerAction.java | 122 ++++++++++++++++++ .../org/zstack/sdk/AddLogServerResult.java | 14 ++ .../org/zstack/sdk/DeleteLogServerAction.java | 101 +++++++++++++++ .../org/zstack/sdk/DeleteLogServerResult.java | 7 + .../main/java/org/zstack/sdk/LogCategory.java | 6 + .../main/java/org/zstack/sdk/LogLevel.java | 12 ++ .../org/zstack/sdk/LogServerInventory.java | 81 ++++++++++++ sdk/src/main/java/org/zstack/sdk/LogType.java | 6 + .../org/zstack/sdk/QueryLogServerAction.java | 75 +++++++++++ .../org/zstack/sdk/QueryLogServerResult.java | 22 ++++ .../org/zstack/sdk/UpdateLogServerAction.java | 107 +++++++++++++++ .../org/zstack/sdk/UpdateLogServerResult.java | 14 ++ .../java/org/zstack/testlib/ApiHelper.groovy | 101 +++++++++++++++ 17 files changed, 698 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/AddLogServerAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/AddLogServerResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteLogServerAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteLogServerResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/LogCategory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/LogLevel.java create mode 100644 sdk/src/main/java/org/zstack/sdk/LogServerInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/LogType.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryLogServerAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryLogServerResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateLogServerAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateLogServerResult.java diff --git a/conf/db/upgrade/V5.3.28__schema.sql b/conf/db/upgrade/V5.3.28__schema.sql index f96c39a778e..3d2c5efbedb 100644 --- a/conf/db/upgrade/V5.3.28__schema.sql +++ b/conf/db/upgrade/V5.3.28__schema.sql @@ -36,3 +36,16 @@ PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE ObservabilityServerServiceRefVO ADD CONSTRAINT fkObservabilityServerServiceRefVOResourceVO FOREIGN KEY (serviceUuid) REFERENCES ResourceVO (uuid) ON DELETE CASCADE; + +CREATE TABLE IF NOT EXISTS `zstack`.`LogServerVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) NOT NULL, + `description` varchar(2048) NULL, + `category` varchar(255) NOT NULL, + `type` varchar(255) NOT NULL, + `level` varchar(255) NULL, + `configuration` text NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/conf/errorElaborations/Elaboration.json b/conf/errorElaborations/Elaboration.json index ad3a89fd84c..ec236629bbe 100644 --- a/conf/errorElaborations/Elaboration.json +++ b/conf/errorElaborations/Elaboration.json @@ -1710,5 +1710,13 @@ "regex": "the vm scheduling group has already had a vms antiaffinity from hosts scheduling rule attached. the number of hosts available for the vm in the scheduling group to run is less than that of the vm in the group. you cannot attach a vm antiaffinity from Each Other scheduling rule to the group", "message_cn": "该云主机调度组已绑定云主机互斥物理机调度策略,若再绑定互斥云主机调度策略,当前可供组内云主机运行的物理机数量将少于云主机数量,导致部分云主机无法分配物理机。请按需调整物理机/云主机数量后重试。", "message_en": "The VM scheduling group has already had a VMs Exclusive from Hosts scheduling policy attached. The number of hosts available for the VM instances in the scheduling group to run is less than that of the VM instances in the group. You cannot attach a VM Exclusive from Each Other scheduling policy to the group." + }, + { + "category": "logServer", + "code": "1001", + "method": "regex", + "regex": "The creation of the log server failed, incorrect newly passed configuration parameters may have caused the Fluent Bit service to be in an inactive state. Please double-check the configuration for accuracy", + "message_cn": "创建日志服务器失败,新传入配置参数有误会导致fluent-bit服务处于非活跃状态,请再次检查配置是否正确。", + "message_en": "The creation of the log server failed, incorrect newly passed configuration parameters may have caused the Fluent Bit service to be in an inactive state. Please double-check the configuration for accuracy" } ] diff --git a/conf/persistence.xml b/conf/persistence.xml index cce1d301577..518c6dfcd7d 100755 --- a/conf/persistence.xml +++ b/conf/persistence.xml @@ -212,5 +212,6 @@ org.zstack.header.host.HostHwMonitorStatusVO org.zstack.kvm.xmlhook.XmlHookVO org.zstack.kvm.xmlhook.XmlHookVmInstanceRefVO + org.zstack.log.server.LogServerVO diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index d7f6c2ffe2e..2dbfde7cd85 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -456,6 +456,10 @@ public class SourceClassMap { put("org.zstack.license.LicenseInventory", "org.zstack.sdk.LicenseInventory"); put("org.zstack.license.UKeyInventory", "org.zstack.sdk.UKeyInventory"); put("org.zstack.license.UKeyStatus", "org.zstack.sdk.UKeyStatus"); + put("org.zstack.log.server.LogCategory", "org.zstack.sdk.LogCategory"); + put("org.zstack.log.server.LogLevel", "org.zstack.sdk.LogLevel"); + put("org.zstack.log.server.LogServerInventory", "org.zstack.sdk.LogServerInventory"); + put("org.zstack.log.server.LogType", "org.zstack.sdk.LogType"); put("org.zstack.login.entity.LdapResourceRefInventory", "org.zstack.sdk.LdapResourceRefInventory"); put("org.zstack.loginControl.entity.AccessControlRuleInventory", "org.zstack.sdk.AccessControlRuleInventory"); put("org.zstack.loginControl.entity.ControlStrategy", "org.zstack.sdk.ControlStrategy"); @@ -1075,6 +1079,10 @@ public class SourceClassMap { put("org.zstack.sdk.LoadBalancerServerGroupVmNicRefInventory", "org.zstack.network.service.lb.LoadBalancerServerGroupVmNicRefInventory"); put("org.zstack.sdk.LocalStorageResourceRefInventory", "org.zstack.storage.primary.local.LocalStorageResourceRefInventory"); put("org.zstack.sdk.LocateStatus", "org.zstack.storage.device.localRaid.LocateStatus"); + put("org.zstack.sdk.LogCategory", "org.zstack.log.server.LogCategory"); + put("org.zstack.sdk.LogLevel", "org.zstack.log.server.LogLevel"); + put("org.zstack.sdk.LogServerInventory", "org.zstack.log.server.LogServerInventory"); + put("org.zstack.sdk.LogType", "org.zstack.log.server.LogType"); put("org.zstack.sdk.LoginAuthenticationProcedureDesc", "org.zstack.header.identity.login.LoginAuthenticationProcedureDesc"); put("org.zstack.sdk.LongJobInventory", "org.zstack.header.longjob.LongJobInventory"); put("org.zstack.sdk.LongJobState", "org.zstack.header.longjob.LongJobState"); diff --git a/sdk/src/main/java/org/zstack/sdk/AddLogServerAction.java b/sdk/src/main/java/org/zstack/sdk/AddLogServerAction.java new file mode 100644 index 00000000000..f938f7534db --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddLogServerAction.java @@ -0,0 +1,122 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class AddLogServerAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.AddLogServerResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = true, validValues = {"ManagementNodeLog","PlatformOperationLog"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String category; + + @Param(required = true, validValues = {"Log4j2","FluentBit"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @Param(required = false, validValues = {"OFF","FATAL","ERROR","WARN","INFO","DEBUG","TRACE","ALL"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String level; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String configuration; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.AddLogServerResult value = res.getResult(org.zstack.sdk.AddLogServerResult.class); + ret.value = value == null ? new org.zstack.sdk.AddLogServerResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/log/servers"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AddLogServerResult.java b/sdk/src/main/java/org/zstack/sdk/AddLogServerResult.java new file mode 100644 index 00000000000..fe40b3b9c2c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddLogServerResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.LogServerInventory; + +public class AddLogServerResult { + public LogServerInventory inventory; + public void setInventory(LogServerInventory inventory) { + this.inventory = inventory; + } + public LogServerInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteLogServerAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteLogServerAction.java new file mode 100644 index 00000000000..57fbf96daad --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteLogServerAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteLogServerAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeleteLogServerResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeleteLogServerResult value = res.getResult(org.zstack.sdk.DeleteLogServerResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteLogServerResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/log/servers"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteLogServerResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteLogServerResult.java new file mode 100644 index 00000000000..87a8349b0b0 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteLogServerResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteLogServerResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/LogCategory.java b/sdk/src/main/java/org/zstack/sdk/LogCategory.java new file mode 100644 index 00000000000..96662c4bfb3 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/LogCategory.java @@ -0,0 +1,6 @@ +package org.zstack.sdk; + +public enum LogCategory { + ManagementNodeLog, + PlatformOperationLog, +} diff --git a/sdk/src/main/java/org/zstack/sdk/LogLevel.java b/sdk/src/main/java/org/zstack/sdk/LogLevel.java new file mode 100644 index 00000000000..3c184fb2820 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/LogLevel.java @@ -0,0 +1,12 @@ +package org.zstack.sdk; + +public enum LogLevel { + OFF, + FATAL, + ERROR, + WARN, + INFO, + DEBUG, + TRACE, + ALL, +} diff --git a/sdk/src/main/java/org/zstack/sdk/LogServerInventory.java b/sdk/src/main/java/org/zstack/sdk/LogServerInventory.java new file mode 100644 index 00000000000..99f5280c8a9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/LogServerInventory.java @@ -0,0 +1,81 @@ +package org.zstack.sdk; + +import org.zstack.sdk.LogCategory; +import org.zstack.sdk.LogType; +import org.zstack.sdk.LogLevel; + +public class LogServerInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public LogCategory category; + public void setCategory(LogCategory category) { + this.category = category; + } + public LogCategory getCategory() { + return this.category; + } + + public LogType type; + public void setType(LogType type) { + this.type = type; + } + public LogType getType() { + return this.type; + } + + public LogLevel level; + public void setLevel(LogLevel level) { + this.level = level; + } + public LogLevel getLevel() { + return this.level; + } + + public java.lang.String configuration; + public void setConfiguration(java.lang.String configuration) { + this.configuration = configuration; + } + public java.lang.String getConfiguration() { + return this.configuration; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/LogType.java b/sdk/src/main/java/org/zstack/sdk/LogType.java new file mode 100644 index 00000000000..9ab0dd45333 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/LogType.java @@ -0,0 +1,6 @@ +package org.zstack.sdk; + +public enum LogType { + Log4j2, + FluentBit, +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryLogServerAction.java b/sdk/src/main/java/org/zstack/sdk/QueryLogServerAction.java new file mode 100644 index 00000000000..7c0b3dc9563 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryLogServerAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryLogServerAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryLogServerResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryLogServerResult value = res.getResult(org.zstack.sdk.QueryLogServerResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryLogServerResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/log/servers"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryLogServerResult.java b/sdk/src/main/java/org/zstack/sdk/QueryLogServerResult.java new file mode 100644 index 00000000000..957fadbefd6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryLogServerResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryLogServerResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateLogServerAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateLogServerAction.java new file mode 100644 index 00000000000..e2853cb1f16 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateLogServerAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateLogServerAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UpdateLogServerResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UpdateLogServerResult value = res.getResult(org.zstack.sdk.UpdateLogServerResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateLogServerResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/log/servers"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateLogServer"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateLogServerResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateLogServerResult.java new file mode 100644 index 00000000000..d32b9f98f2e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateLogServerResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.LogServerInventory; + +public class UpdateLogServerResult { + public LogServerInventory inventory; + public void setInventory(LogServerInventory inventory) { + this.inventory = inventory; + } + public LogServerInventory getInventory() { + return this.inventory; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 3cc7e2afb19..016f1644ec1 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -1933,6 +1933,31 @@ abstract class ApiHelper { } } + def addLogServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddLogServerAction.class) Closure c) { + def a = new org.zstack.sdk.AddLogServerAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + def addMdevDeviceSpecToVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddMdevDeviceSpecToVmInstanceAction.class) Closure c) { def a = new org.zstack.sdk.AddMdevDeviceSpecToVmInstanceAction() @@ -14893,6 +14918,31 @@ abstract class ApiHelper { } } + def deleteLogServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteLogServerAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteLogServerAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + def deleteLongJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteLongJobAction.class) Closure c) { def a = new org.zstack.sdk.DeleteLongJobAction() @@ -29753,6 +29803,32 @@ abstract class ApiHelper { } } + def queryLogServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLogServerAction.class) Closure c) { + def a = new org.zstack.sdk.QueryLogServerAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + def queryFiberChannelStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFiberChannelStorageAction.class) Closure c) { def a = new org.zstack.sdk.QueryFiberChannelStorageAction() @@ -43531,6 +43607,31 @@ abstract class ApiHelper { } } + def updateLogServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateLogServerAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateLogServerAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + def updateLongJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateLongJobAction.class) Closure c) { def a = new org.zstack.sdk.UpdateLongJobAction() From 279262755803b62da575cd787f607bf863fed1aa Mon Sep 17 00:00:00 2001 From: shenjin Date: Tue, 25 Mar 2025 11:55:24 +0800 Subject: [PATCH 271/737] [sdk]: add new PciDeviceType Co-Processor add new PciDeviceType Co-Processor Resolves: ZSTAC-73907 Change-Id: I79736361756a757569737a67637972656875617a --- sdk/src/main/java/org/zstack/sdk/MdevDeviceType.java | 1 + sdk/src/main/java/org/zstack/sdk/PciDeviceType.java | 1 + 2 files changed, 2 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/MdevDeviceType.java b/sdk/src/main/java/org/zstack/sdk/MdevDeviceType.java index 466b4e4eac8..a2ff1befcc4 100644 --- a/sdk/src/main/java/org/zstack/sdk/MdevDeviceType.java +++ b/sdk/src/main/java/org/zstack/sdk/MdevDeviceType.java @@ -4,5 +4,6 @@ public enum MdevDeviceType { SE_Controller, GPU_Video_Controller, GPU_Processing_Accelerators, + GPU_Co_Processor, GPU_3D_Controller, } diff --git a/sdk/src/main/java/org/zstack/sdk/PciDeviceType.java b/sdk/src/main/java/org/zstack/sdk/PciDeviceType.java index 4143a18f8b8..2d6cc7a4bac 100644 --- a/sdk/src/main/java/org/zstack/sdk/PciDeviceType.java +++ b/sdk/src/main/java/org/zstack/sdk/PciDeviceType.java @@ -7,6 +7,7 @@ public enum PciDeviceType { GPU_Serial_Controller, GPU_3D_Controller, GPU_Processing_Accelerators, + GPU_Co_Processor, Ethernet_Controller, Audio_Controller, USB_Controller, From dff351119cd3fba07c62b2c6c697d2797e90ad14 Mon Sep 17 00:00:00 2001 From: littleya Date: Wed, 26 Mar 2025 16:30:54 +0800 Subject: [PATCH 272/737] [dependencies]: update avro version to 1.11.4 update avro version to 1.11.4 to fix CVEs of compile dependency commons-compress. Resolves: ZSTAC-72937 Change-Id: I6164666b73736c6f6b6a666b7462726e73747475 --- header/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/header/pom.xml b/header/pom.xml index c5c249ef09b..3a9ae6cab92 100755 --- a/header/pom.xml +++ b/header/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.3.0 + 5.3.0 .. header @@ -77,7 +77,7 @@ org.apache.avro avro - 1.11.3 + 1.11.4 org.hibernate From 332badb015a5896e7233bf43c1ae0cda874c183c Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Fri, 29 Nov 2024 10:57:39 +0800 Subject: [PATCH 273/737] [db]: Replace Greate database 1. grant grammar (deploydb.sh) 2. Database keyword backtick modification (*_schema.sql) 3. update flyway `checksum` (beforeValidate.sql) 4. Controller Layer database keyword backtick modification (DatabaseFacade.xml) 5. get_lock() length limit (SlbGroupBase,SlbManagerImpl,vpcHaGroupApplianceVmImpl) Resolves: ZSTAC-71628 Change-Id: I736773707268786c62786f6d636c6269666b727a --- build/deploydb.sh | 43 +++++++--- conf/db/V0.6__schema.sql | 4 +- conf/db/upgrade/V1.3__schema.sql | 2 +- conf/db/upgrade/V1.7__schema.sql | 2 +- conf/db/upgrade/V2.1.0__schema.sql | 2 +- conf/db/upgrade/V2.2.0__schema.sql | 6 +- conf/db/upgrade/V3.1.0__schema.sql | 2 +- conf/db/upgrade/V4.6.21__schema.sql | 2 +- conf/db/upgrade/V4.8.0.6__schema.sql | 2 +- conf/db/upgrade/V5.3.0__schema.sql | 6 +- conf/db/upgrade/V5.3.6__schema.sql | 4 +- conf/db/upgrade/beforeValidate.sql | 10 +++ conf/deploydb.sh | 108 ++++++++++++++++-------- conf/deployuidb.sh | 102 ++++++++++++++++------ conf/springConfigXml/DatabaseFacade.xml | 1 + 15 files changed, 210 insertions(+), 86 deletions(-) diff --git a/build/deploydb.sh b/build/deploydb.sh index 49964c58754..b0d922475bc 100755 --- a/build/deploydb.sh +++ b/build/deploydb.sh @@ -12,6 +12,13 @@ if [[ `id -u` -ne 0 ]] && [[ x"$user" = x"root" ]]; then MYSQL='sudo mysql' fi +if command -v greatdb &> /dev/null; then + MYSQL='greatdb' + if [[ `id -u` -ne 0 ]] && [[ x"$user" = x"root" ]]; then + MYSQL='sudo greatdb' + fi +fi + base=`dirname $0` if [[ ! -n $host ]] || [[ ! -n $port ]];then @@ -20,17 +27,33 @@ else loginCmd="--user=$user --password=$password --host=$host --port=$port" fi -${MYSQL} ${loginCmd} << EOF -set global log_bin_trust_function_creators=1; -DROP DATABASE IF EXISTS zstack; -CREATE DATABASE zstack; -DROP DATABASE IF EXISTS zstack_rest; -CREATE DATABASE zstack_rest; -grant all privileges on zstack.* to root@'%' identified by "${password}"; -grant all privileges on zstack_rest.* to root@'%' identified by "${password}"; -grant all privileges on zstack.* to root@'127.0.0.1' identified by "${password}"; -grant all privileges on zstack_rest.* to root@'127.0.0.1' identified by "${password}"; +if command -v greatdb &> /dev/null; then + ${MYSQL} ${loginCmd} << EOF + set global log_bin_trust_function_creators=1; + DROP DATABASE IF EXISTS zstack; + CREATE DATABASE zstack; + DROP DATABASE IF EXISTS zstack_rest; + CREATE DATABASE zstack_rest; + CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY "${password}"; + CREATE USER IF NOT EXISTS 'root'@'127.0.0.1' IDENTIFIED BY "${password}"; + grant all privileges on zstack.* to root@'%'; + grant all privileges on zstack_rest.* to root@'%'; + grant all privileges on zstack.* to root@'127.0.0.1'; + grant all privileges on zstack_rest.* to root@'127.0.0.1'; EOF +else + ${MYSQL} ${loginCmd} << EOF + set global log_bin_trust_function_creators=1; + DROP DATABASE IF EXISTS zstack; + CREATE DATABASE zstack; + DROP DATABASE IF EXISTS zstack_rest; + CREATE DATABASE zstack_rest; + grant all privileges on zstack.* to root@'%' identified by "${password}"; + grant all privileges on zstack_rest.* to root@'%' identified by "${password}"; + grant all privileges on zstack.* to root@'127.0.0.1' identified by "${password}"; + grant all privileges on zstack_rest.* to root@'127.0.0.1' identified by "${password}"; +EOF +fi # assign flyway version if not defined : "${flywayver:=3.2.1}" diff --git a/conf/db/V0.6__schema.sql b/conf/db/V0.6__schema.sql index 87d0461af1e..7e956f3d195 100755 --- a/conf/db/V0.6__schema.sql +++ b/conf/db/V0.6__schema.sql @@ -1327,7 +1327,7 @@ CREATE INDEX idxZoneEOname ON ZoneEO (name); CREATE VIEW `zstack`.`VmInstanceVO` AS SELECT uuid, name, description, zoneUuid, clusterUuid, imageUuid, hostUuid, internalId, lastHostUuid, instanceOfferingUuid, rootVolumeUuid, defaultL3NetworkUuid, type, hypervisorType, cpuNum, cpuSpeed, memorySize, allocatorStrategy, createDate, lastOpDate, state FROM `zstack`.`VmInstanceEO` WHERE deleted IS NULL; -CREATE VIEW `zstack`.`ImageVO` AS SELECT uuid, name, description, status, state, size, md5Sum, platform, type, format, url, system, mediaType, createDate, lastOpDate, guestOsType FROM `zstack`.`ImageEO` WHERE deleted IS NULL; +CREATE VIEW `zstack`.`ImageVO` AS SELECT uuid, name, description, status, state, size, md5Sum, platform, type, format, url, `system`, mediaType, createDate, lastOpDate, guestOsType FROM `zstack`.`ImageEO` WHERE deleted IS NULL; CREATE VIEW `zstack`.`VolumeVO` AS SELECT uuid, name, description, primaryStorageUuid, vmInstanceUuid, diskOfferingUuid, rootImageUuid, installPath, type, status, size, deviceId, format, state, createDate, lastOpDate FROM `zstack`.`VolumeEO` WHERE deleted IS NULL; @@ -1343,7 +1343,7 @@ CREATE VIEW `zstack`.`VolumeSnapshotTreeVO` AS SELECT uuid, volumeUuid, current, CREATE VIEW `zstack`.`BackupStorageVO` AS SELECT uuid, name, url, description, totalCapacity, availableCapacity, type, state, status, createDate, lastOpDate FROM `zstack`.`BackupStorageEO` WHERE deleted IS NULL; -CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, description, state, type, zoneUuid, l2NetworkUuid, system, dnsDomain, createDate, lastOpDate FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; +CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, description, state, type, zoneUuid, l2NetworkUuid, `system`, dnsDomain, createDate, lastOpDate FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; CREATE VIEW `zstack`.`IpRangeVO` AS SELECT uuid, l3NetworkUuid, name, description, startIp, endIp, netmask, gateway, networkCidr, createDate, lastOpDate FROM `zstack`.`IpRangeEO` WHERE deleted IS NULL; diff --git a/conf/db/upgrade/V1.3__schema.sql b/conf/db/upgrade/V1.3__schema.sql index 33bb3a47ce2..54afa7d0b55 100755 --- a/conf/db/upgrade/V1.3__schema.sql +++ b/conf/db/upgrade/V1.3__schema.sql @@ -70,7 +70,7 @@ ALTER TABLE FusionstorPrimaryStorageVO ADD CONSTRAINT fkFusionstorPrimaryStorage ALTER TABLE ImageEO ADD actualSize bigint unsigned DEFAULT NULL; DROP VIEW IF EXISTS `zstack`.`ImageVO`; -CREATE VIEW `zstack`.`ImageVO` AS SELECT uuid, name, description, status, state, size, actualSize, md5Sum, platform, type, format, url, system, mediaType, createDate, lastOpDate, guestOsType FROM `zstack`.`ImageEO` WHERE deleted IS NULL; +CREATE VIEW `zstack`.`ImageVO` AS SELECT uuid, name, description, status, state, size, actualSize, md5Sum, platform, type, format, url, `system`, mediaType, createDate, lastOpDate, guestOsType FROM `zstack`.`ImageEO` WHERE deleted IS NULL; UPDATE ImageEO set actualSize = size; ALTER TABLE VolumeEO ADD actualSize bigint unsigned DEFAULT NULL; diff --git a/conf/db/upgrade/V1.7__schema.sql b/conf/db/upgrade/V1.7__schema.sql index 2eadc6e4b7d..a6fc8b56c0f 100644 --- a/conf/db/upgrade/V1.7__schema.sql +++ b/conf/db/upgrade/V1.7__schema.sql @@ -5,7 +5,7 @@ ALTER TABLE `zstack`.`ImageEO` modify column description varchar(2048) DEFAULT N ALTER TABLE `zstack`.`ImageEO` add column exportUrl varchar(2048) DEFAULT NULL COMMENT 'exported image URL'; DROP VIEW IF EXISTS `zstack`.`ImageVO`; -CREATE VIEW `zstack`.`ImageVO` AS SELECT uuid, name, description, status, state, size, actualSize, md5Sum, platform, type, format, url, system, mediaType, createDate, lastOpDate, guestOsType, exportUrl FROM `zstack`.`ImageEO` WHERE deleted IS NULL; +CREATE VIEW `zstack`.`ImageVO` AS SELECT uuid, name, description, status, state, size, actualSize, md5Sum, platform, type, format, url, `system`, mediaType, createDate, lastOpDate, guestOsType, exportUrl FROM `zstack`.`ImageEO` WHERE deleted IS NULL; ALTER TABLE `zstack`.`InstanceOfferingEO` modify column description varchar(2048) DEFAULT NULL COMMENT 'instance offering description'; ALTER TABLE `zstack`.`DiskOfferingEO` modify column description varchar(2048) DEFAULT NULL COMMENT 'disk offering description'; diff --git a/conf/db/upgrade/V2.1.0__schema.sql b/conf/db/upgrade/V2.1.0__schema.sql index edb0e637067..4938319b066 100755 --- a/conf/db/upgrade/V2.1.0__schema.sql +++ b/conf/db/upgrade/V2.1.0__schema.sql @@ -395,7 +395,7 @@ SET FOREIGN_KEY_CHECKS = 1; ALTER TABLE `zstack`.`ImageEO` ADD COLUMN exportMd5Sum varchar(255) DEFAULT NULL; DROP VIEW IF EXISTS `zstack`.`ImageVO`; -CREATE VIEW `zstack`.`ImageVO` AS SELECT uuid, name, description, status, state, size, actualSize, md5Sum, exportMd5Sum, platform, type, format, url, system, mediaType, createDate, lastOpDate, guestOsType, exportUrl FROM `zstack`.`ImageEO` WHERE deleted IS NULL; +CREATE VIEW `zstack`.`ImageVO` AS SELECT uuid, name, description, status, state, size, actualSize, md5Sum, exportMd5Sum, platform, type, format, url, `system`, mediaType, createDate, lastOpDate, guestOsType, exportUrl FROM `zstack`.`ImageEO` WHERE deleted IS NULL; ALTER TABLE HostCapacityVO MODIFY availableCpu bigint(20) NOT NULL COMMENT 'used cpu of host in HZ'; diff --git a/conf/db/upgrade/V2.2.0__schema.sql b/conf/db/upgrade/V2.2.0__schema.sql index 624caf6dbc0..15238f7bdf9 100644 --- a/conf/db/upgrade/V2.2.0__schema.sql +++ b/conf/db/upgrade/V2.2.0__schema.sql @@ -1,7 +1,7 @@ ALTER TABLE `L3NetworkEO` ADD COLUMN `category` varchar(255) NOT NULL DEFAULT 'Private' COMMENT 'the type network used for'; DROP VIEW IF EXISTS `zstack`.`L3NetworkVO`; -CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, description, state, type, zoneUuid, l2NetworkUuid, system, dnsDomain, createDate, lastOpDate, category FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; +CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, description, state, type, zoneUuid, l2NetworkUuid, `system`, dnsDomain, createDate, lastOpDate, category FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; # add network category for ZSTAC-6844 DELIMITER $$ @@ -10,7 +10,7 @@ CREATE PROCEDURE generateNetworkCategory() DECLARE l3Uuid varchar(32); DECLARE l3System tinyint(3) unsigned; DECLARE done INT DEFAULT FALSE; - DECLARE cur CURSOR FOR SELECT uuid, system FROM zstack.L3NetworkEO; + DECLARE cur CURSOR FOR SELECT uuid, `system` FROM zstack.L3NetworkEO; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; read_loop: LOOP @@ -21,7 +21,7 @@ CREATE PROCEDURE generateNetworkCategory() IF l3System = 1 THEN - UPDATE zstack.L3NetworkEO SET system = 0 WHERE uuid = l3Uuid; + UPDATE zstack.L3NetworkEO SET `system` = 0 WHERE uuid = l3Uuid; UPDATE zstack.L3NetworkEO SET category = 'Public' WHERE uuid = l3Uuid; ELSE UPDATE zstack.L3NetworkEO SET category = 'Private' WHERE uuid = l3Uuid; diff --git a/conf/db/upgrade/V3.1.0__schema.sql b/conf/db/upgrade/V3.1.0__schema.sql index 40311d767f4..26df49be25c 100644 --- a/conf/db/upgrade/V3.1.0__schema.sql +++ b/conf/db/upgrade/V3.1.0__schema.sql @@ -208,7 +208,7 @@ ALTER TABLE `zstack`.`UsedIpVO` ADD CONSTRAINT fkUsedIpVOVmNicVO FOREIGN KEY (vm ALTER TABLE `zstack`.`L3NetworkEO` ADD COLUMN `ipVersion` int(10) unsigned DEFAULT 4; DROP VIEW IF EXISTS `zstack`.`L3NetworkVO`; -CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, description, state, type, zoneUuid, l2NetworkUuid, system, dnsDomain, createDate, lastOpDate, category, ipVersion FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; +CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, description, state, type, zoneUuid, l2NetworkUuid, `system`, dnsDomain, createDate, lastOpDate, category, ipVersion FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; ALTER TABLE `zstack`.`VmNicVO` ADD COLUMN `ipVersion` int(10) unsigned DEFAULT 4; diff --git a/conf/db/upgrade/V4.6.21__schema.sql b/conf/db/upgrade/V4.6.21__schema.sql index ad913515b63..b8fc01611a1 100644 --- a/conf/db/upgrade/V4.6.21__schema.sql +++ b/conf/db/upgrade/V4.6.21__schema.sql @@ -39,7 +39,7 @@ ALTER TABLE `zstack`.`UsedIpVO` MODIFY COLUMN `ipRangeUuid` varchar(32) DEFAULT ALTER TABLE `zstack`.`L3NetworkEO` ADD COLUMN `enableIPAM` boolean NOT NULL DEFAULT TRUE; DROP VIEW IF EXISTS `zstack`.`L3NetworkVO`; -CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, description, state, type, zoneUuid, l2NetworkUuid, system, dnsDomain, createDate, lastOpDate, category, ipVersion, enableIPAM FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; +CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, description, state, type, zoneUuid, l2NetworkUuid, `system`, dnsDomain, createDate, lastOpDate, category, ipVersion, enableIPAM FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; ALTER TABLE `zstack`.`UsedIpVO` DROP FOREIGN KEY fkUsedIpVOVmNicVO; ALTER TABLE `zstack`.`UsedIpVO` ADD CONSTRAINT fkUsedIpVOVmNicVO FOREIGN KEY (vmNicUuid) REFERENCES VmNicVO (uuid) ON DELETE CASCADE; diff --git a/conf/db/upgrade/V4.8.0.6__schema.sql b/conf/db/upgrade/V4.8.0.6__schema.sql index 0eaeff1c46f..5546e3de871 100644 --- a/conf/db/upgrade/V4.8.0.6__schema.sql +++ b/conf/db/upgrade/V4.8.0.6__schema.sql @@ -5,4 +5,4 @@ CREATE VIEW `zstack`.`L2NetworkVO` AS SELECT uuid, name, description, type, vSwi ALTER TABLE `zstack`.`L3NetworkEO` ADD COLUMN `isolated` boolean NOT NULL DEFAULT FALSE AFTER `enableIPAM`; DROP VIEW IF EXISTS `zstack`.`L3NetworkVO`; -CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, description, state, type, zoneUuid, l2NetworkUuid, system, dnsDomain, createDate, lastOpDate, category, ipVersion, enableIPAM, isolated FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; \ No newline at end of file +CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, description, state, type, zoneUuid, l2NetworkUuid, `system`, dnsDomain, createDate, lastOpDate, category, ipVersion, enableIPAM, isolated FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; \ No newline at end of file diff --git a/conf/db/upgrade/V5.3.0__schema.sql b/conf/db/upgrade/V5.3.0__schema.sql index 1f290fcece6..6877d9cca7f 100644 --- a/conf/db/upgrade/V5.3.0__schema.sql +++ b/conf/db/upgrade/V5.3.0__schema.sql @@ -22,9 +22,9 @@ CREATE TABLE IF NOT EXISTS `zstack`.`FcHbaDeviceVO` ( PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -UPDATE `zstack`.`ImageEO` SET guestOsType = 'VyOS 1.1.7' WHERE architecture = 'x86_64' and guestOsType = 'Linux' and system = TRUE; -UPDATE `zstack`.`ImageEO` SET guestOsType = 'VyOS 1.2.0' WHERE architecture = 'aarch64' and guestOsType = 'Linux' and system = TRUE; -UPDATE `zstack`.`ImageEO` SET guestOsType = 'Kylin 10' WHERE architecture = 'loongarch64' and guestOsType = 'Linux' and system = TRUE; +UPDATE `zstack`.`ImageEO` SET guestOsType = 'VyOS 1.1.7' WHERE architecture = 'x86_64' and guestOsType = 'Linux' and `system` = TRUE; +UPDATE `zstack`.`ImageEO` SET guestOsType = 'VyOS 1.2.0' WHERE architecture = 'aarch64' and guestOsType = 'Linux' and `system` = TRUE; +UPDATE `zstack`.`ImageEO` SET guestOsType = 'Kylin 10' WHERE architecture = 'loongarch64' and guestOsType = 'Linux' and `system` = TRUE; UPDATE `zstack`.`VmInstanceEO` SET guestOsType = 'VyOS 1.1.7' WHERE architecture = 'x86_64' and guestOsType = 'Linux' and type = 'ApplianceVm'; UPDATE `zstack`.`VmInstanceEO` SET guestOsType = 'VyOS 1.2.0' WHERE architecture = 'aarch64' and guestOsType = 'Linux' and type = 'ApplianceVm'; diff --git a/conf/db/upgrade/V5.3.6__schema.sql b/conf/db/upgrade/V5.3.6__schema.sql index 09492fe3160..4f19bb82cda 100644 --- a/conf/db/upgrade/V5.3.6__schema.sql +++ b/conf/db/upgrade/V5.3.6__schema.sql @@ -24,7 +24,7 @@ SELECT CURRENT_TIMESTAMP(), -- createDate CURRENT_TIMESTAMP() -- lastOpDate FROM DatasetVO -WHERE system = true; +WHERE `system` = true; INSERT INTO SystemTagVO (`uuid`, `resourceUuid`, `resourceType`, `inherent`, `type`, `tag`, `createDate`, `lastOpDate`) @@ -38,7 +38,7 @@ SELECT CURRENT_TIMESTAMP(), -- createDate CURRENT_TIMESTAMP() -- lastOpDate FROM DatasetVO -WHERE system = true; +WHERE `system` = true; CALL RENAME_TABLE('ContainerManagementVmVO', 'ContainerManagementEndpointVO'); diff --git a/conf/db/upgrade/beforeValidate.sql b/conf/db/upgrade/beforeValidate.sql index 020abd278e3..054cd0e211e 100644 --- a/conf/db/upgrade/beforeValidate.sql +++ b/conf/db/upgrade/beforeValidate.sql @@ -27,6 +27,16 @@ BEGIN update `zstack`.`schema_version` set `checksum`=-540021638 where `script`='V4.4.6__schema.sql' and `checksum` <> -540021638; update `zstack`.`schema_version` set `checksum`=-698734653 where `script`='V4.5.11__schema.sql' and `checksum` <> -698734653; update `zstack`.`schema_version` set `checksum`=-2137714083 where `script`='V4.7.0__schema.sql' and `checksum` <> -2137714083; + update `zstack`.`schema_version` set `checksum`=-1493191986 where `script`='V0.6__schema.sql' and `checksum` <> -1493191986; + update `zstack`.`schema_version` set `checksum`=286222955 where `script`='V1.3__schema.sql' and `checksum` <> 286222955; + update `zstack`.`schema_version` set `checksum`=390362109 where `script`='V1.7__schema.sql' and `checksum` <> 390362109; + update `zstack`.`schema_version` set `checksum`=-1453565511 where `script`='V2.1.0__schema.sql' and `checksum` <> -1453565511; + update `zstack`.`schema_version` set `checksum`=672814727 where `script`='V2.2.0__schema.sql' and `checksum` <> 672814727; + update `zstack`.`schema_version` set `checksum`=271601676 where `script`='V3.1.0__schema.sql' and `checksum` <> 271601676; + update `zstack`.`schema_version` set `checksum`=-294520100 where `script`='V4.6.21__schema.sql' and `checksum` <> -294520100; + update `zstack`.`schema_version` set `checksum`=1170348213 where `script`='V4.8.0.6__schema.sql' and `checksum` <> 1170348213; + update `zstack`.`schema_version` set `checksum`=1298863127 where `script`='V5.3.0__schema.sql' and `checksum` <> 1298863127; + update `zstack`.`schema_version` set `checksum`=613548663 where `script`='V5.3.6__schema.sql' and `checksum` <> 613548663; END IF; END $$ diff --git a/conf/deploydb.sh b/conf/deploydb.sh index a9f8dd90673..033da079954 100755 --- a/conf/deploydb.sh +++ b/conf/deploydb.sh @@ -22,20 +22,44 @@ if [[ `id -u` -ne 0 ]] && [[ x"$user" = x"root" ]]; then MYSQL='sudo mysql' fi +if command -v greatdb &> /dev/null; then + MYSQL='greatdb' + if [[ `id -u` -ne 0 ]] && [[ x"$user" = x"root" ]]; then + MYSQL='sudo greatdb' + fi +fi + mysql_run() { $MYSQL --user=$user --password=$password --host=$host --port=$port "$@" } -mysql_run << EOF -DROP DATABASE IF EXISTS zstack; -CREATE DATABASE zstack; -DROP DATABASE IF EXISTS zstack_rest; -CREATE DATABASE zstack_rest; -grant all privileges on zstack.* to root@'%' identified by "$password"; -grant all privileges on zstack_rest.* to root@'%' identified by "$password"; -grant all privileges on zstack.* to root@'localhost' identified by "$password"; -grant all privileges on zstack_rest.* to root@'localhost' identified by "$password"; +if command -v greatdb &> /dev/null; then + mysql_run << EOF + set global log_bin_trust_function_creators=1; + DROP DATABASE IF EXISTS zstack; + CREATE DATABASE zstack; + DROP DATABASE IF EXISTS zstack_rest; + CREATE DATABASE zstack_rest; + CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY "${password}"; + CREATE USER IF NOT EXISTS 'root'@'127.0.0.1' IDENTIFIED BY "${password}"; + grant all privileges on zstack.* to root@'%'; + grant all privileges on zstack_rest.* to root@'%'; + grant all privileges on zstack.* to root@'127.0.0.1'; + grant all privileges on zstack_rest.* to root@'127.0.0.1'; +EOF +else + mysql_run << EOF + set global log_bin_trust_function_creators=1; + DROP DATABASE IF EXISTS zstack; + CREATE DATABASE zstack; + DROP DATABASE IF EXISTS zstack_rest; + CREATE DATABASE zstack_rest; + grant all privileges on zstack.* to root@'%' identified by "${password}"; + grant all privileges on zstack_rest.* to root@'%' identified by "${password}"; + grant all privileges on zstack.* to root@'127.0.0.1' identified by "${password}"; + grant all privileges on zstack_rest.* to root@'127.0.0.1' identified by "${password}"; EOF +fi rm -rf $flyway_sql mkdir -p $flyway_sql @@ -67,32 +91,50 @@ hostname=`hostname` [ -z $zstack_user_password ] && zstack_user_password='' -db_version=`mysql --version | awk '/Distrib/{print $5}' |awk -F'.' '{print $1}'` -if [ $db_version -ge 10 ];then - mysql --user=$user --password=$password --host=$host --port=$port << EOF -drop user if exists zstack; -drop user if exists zstack_rest; -create user 'zstack' identified by "$zstack_user_password"; -create user 'zstack_rest' identified by "$zstack_user_password"; -grant all privileges on zstack.* to zstack@'localhost' identified by "$zstack_user_password"; -grant all privileges on zstack.* to zstack@'%' identified by "$zstack_user_password"; -grant all privileges on zstack_rest.* to zstack@'localhost' identified by "$zstack_user_password"; -grant all privileges on zstack_rest.* to zstack@'%' identified by "$zstack_user_password"; -flush privileges; +if command -v greatdb &> /dev/null; then + $MYSQL --user=$user --password=$password --host=$host --port=$port << EOF + drop user if exists zstack; + drop user if exists zstack_rest; + create user if not exists 'zstack'@'localhost' identified by "$zstack_user_password"; + create user if not exists 'zstack'@'%' identified by "$zstack_user_password"; + create user if not exists 'zstack_rest'@'localhost' identified by "$zstack_user_password"; + create user if not exists 'zstack_rest'@'%' identified by "$zstack_user_password"; + grant all privileges on zstack.* to zstack@'localhost'; + grant all privileges on zstack.* to zstack@'%'; + grant system_user on *.* to zstack@'localhost'; + grant system_user on *.* to zstack@'%'; + grant all privileges on zstack_rest.* to zstack@'localhost'; + grant all privileges on zstack_rest.* to zstack@'%'; + flush privileges; EOF else - mysql --user=$user --password=$password --host=$host --port=$port << EOF -grant usage on *.* to 'zstack'@'localhost'; -grant usage on *.* to 'zstack'@'%'; -drop user zstack; -create user 'zstack' identified by "$zstack_user_password"; -grant all privileges on zstack.* to zstack@'localhost' identified by "$zstack_user_password"; -grant all privileges on zstack.* to zstack@'%' identified by "$zstack_user_password"; -grant all privileges on zstack.* to zstack@"$hostname" identified by "$zstack_user_password"; -grant all privileges on zstack_rest.* to zstack@'localhost' identified by "$zstack_user_password"; -grant all privileges on zstack_rest.* to zstack@"$hostname" identified by "$zstack_user_password"; -grant all privileges on zstack_rest.* to zstack@'%' identified by "$zstack_user_password"; -flush privileges; + db_version=`$MYSQL --version | awk '/Distrib/{print $5}' |awk -F'.' '{print $1}'` + if [ $db_version -ge 10 ];then + $MYSQL --user=$user --password=$password --host=$host --port=$port << EOF + drop user if exists zstack; + drop user if exists zstack_rest; + create user 'zstack' identified by "$zstack_user_password"; + create user 'zstack_rest' identified by "$zstack_user_password"; + grant all privileges on zstack.* to zstack@'localhost' identified by "$zstack_user_password"; + grant all privileges on zstack.* to zstack@'%' identified by "$zstack_user_password"; + grant all privileges on zstack_rest.* to zstack@'localhost' identified by "$zstack_user_password"; + grant all privileges on zstack_rest.* to zstack@'%' identified by "$zstack_user_password"; + flush privileges; +EOF + else + $MYSQL --user=$user --password=$password --host=$host --port=$port << EOF + grant usage on *.* to 'zstack'@'localhost'; + grant usage on *.* to 'zstack'@'%'; + drop user zstack; + create user 'zstack' identified by "$zstack_user_password"; + grant all privileges on zstack.* to zstack@'localhost' identified by "$zstack_user_password"; + grant all privileges on zstack.* to zstack@'%' identified by "$zstack_user_password"; + grant all privileges on zstack.* to zstack@"$hostname" identified by "$zstack_user_password"; + grant all privileges on zstack_rest.* to zstack@'localhost' identified by "$zstack_user_password"; + grant all privileges on zstack_rest.* to zstack@"$hostname" identified by "$zstack_user_password"; + grant all privileges on zstack_rest.* to zstack@'%' identified by "$zstack_user_password"; + flush privileges; EOF + fi fi diff --git a/conf/deployuidb.sh b/conf/deployuidb.sh index 0c7862bab5c..16a7e659576 100755 --- a/conf/deployuidb.sh +++ b/conf/deployuidb.sh @@ -7,24 +7,59 @@ host="$3" port="$4" zstack_ui_db_password="$5" +MYSQL='mysql' + +if [[ `id -u` -ne 0 ]] && [[ x"$user" = x"root" ]]; then + MYSQL='sudo mysql' +fi + +if command -v greatdb &> /dev/null; then + MYSQL='greatdb' + if [[ `id -u` -ne 0 ]] && [[ x"$user" = x"root" ]]; then + MYSQL='sudo greatdb' + fi +fi + base=`dirname $0` flyway="$base/tools/flyway-3.2.1/flyway" flyway_sql="$base/tools/flyway-3.2.1/sql/" # give grant option to the new management ip after `zstack-ctl change_ip` -mysql --user=$user --password=$password --port=$port << EOF -grant all privileges on *.* to root@"$host" identified by "$password" with grant option; +if command -v greatdb &> /dev/null; then + $MYSQL --user=$user --password=$password --port=$port << EOF + grant all privileges on *.* to 'root'@"$host" with grant option; + FLUSH PRIVILEGES; +EOF +else + $MYSQL --user=$user --password=$password --port=$port << EOF + grant all privileges on *.* to 'root'@"$host" identified by "$password" with grant option; + FLUSH PRIVILEGES; EOF +fi -mysql --user=$user --password=$password --host=$host --port=$port << EOF -grant usage on *.* to 'root'@'localhost'; -grant usage on *.* to 'root'@'%'; -DROP DATABASE IF EXISTS zstack_ui; -CREATE DATABASE zstack_ui; -grant all privileges on zstack_ui.* to root@'%' identified by "$password"; -grant all privileges on zstack_ui.* to root@'localhost' identified by "$password"; -flush privileges; +if command -v greatdb &> /dev/null; then + $MYSQL --user=$user --password=$password --host=$host --port=$port << EOF + grant usage on *.* to 'root'@'localhost'; + grant usage on *.* to 'root'@'%'; + DROP DATABASE IF EXISTS zstack_ui; + CREATE DATABASE zstack_ui; + create user if not exists 'root'@'%' identified by "$password"; + create user if not exists 'root'@'localhost' identified by "$password"; + grant all privileges on zstack_ui.* to 'root'@'%'; + grant all privileges on zstack_ui.* to 'root'@'localhost'; + flush privileges; +EOF +else + $MYSQL --user=$user --password=$password --host=$host --port=$port << EOF + grant usage on *.* to 'root'@'localhost'; + grant usage on *.* to 'root'@'%'; + DROP DATABASE IF EXISTS zstack_ui; + CREATE DATABASE zstack_ui; + grant all privileges on zstack_ui.* to 'root'@'%' identified by "$password"; + grant all privileges on zstack_ui.* to 'root'@'localhost' identified by "$password"; + flush privileges; EOF +fi rm -rf $flyway_sql mkdir -p $flyway_sql @@ -39,24 +74,37 @@ if [ -d $ui_schema_path ]; then fi hostname=`hostname` -db_version=`mysql --version | awk '/Distrib/{print $5}' |awk -F'.' '{print $1}'` -if [ $db_version -ge 10 ];then - mysql --user=$user --password=$password --host=$host --port=$port << EOF -drop user if exists zstack_ui; -create user 'zstack_ui' identified by "$zstack_ui_db_password"; -grant all privileges on zstack_ui.* to zstack_ui@'localhost' identified by "$zstack_ui_db_password"; -grant all privileges on zstack_ui.* to zstack_ui@'%' identified by "$zstack_ui_db_password"; -flush privileges; + +if command -v greatdb &> /dev/null; then + $MYSQL --user=$user --password=$password --host=$host --port=$port << EOF + drop user if exists zstack_ui; + create user 'zstack_ui' identified by "$zstack_ui_db_password"; + create user if not exists 'zstack_ui'@'localhost' identified by "$zstack_ui_db_password"; + create user if not exists 'zstack_ui'@'%' identified by "$zstack_ui_db_password"; + grant all privileges on zstack_ui.* to zstack_ui@'localhost'; + grant all privileges on zstack_ui.* to zstack_ui@'%'; + flush privileges; EOF else - mysql --user=$user --password=$password --host=$host --port=$port << EOF -grant usage on *.* to 'zstack_ui'@'localhost'; -grant usage on *.* to 'zstack_ui'@'%'; -drop user zstack_ui; -create user 'zstack_ui' identified by "$zstack_ui_db_password"; -grant all privileges on zstack_ui.* to zstack_ui@'localhost' identified by "$zstack_ui_db_password"; -grant all privileges on zstack_ui.* to zstack_ui@'%' identified by "$zstack_ui_db_password"; -grant all privileges on zstack_ui.* to zstack_ui@"$hostname" identified by "$zstack_ui_db_password"; -flush privileges; + db_version=`$MYSQL --version | awk '/Distrib/{print $5}' |awk -F'.' '{print $1}'` + if [ $db_version -ge 10 ];then + $MYSQL --user=$user --password=$password --host=$host --port=$port << EOF + drop user if exists zstack_ui; + create user 'zstack_ui' identified by "$zstack_ui_db_password"; + grant all privileges on zstack_ui.* to zstack_ui@'localhost' identified by "$zstack_ui_db_password"; + grant all privileges on zstack_ui.* to zstack_ui@'%' identified by "$zstack_ui_db_password"; + flush privileges; +EOF + else + $MYSQL --user=$user --password=$password --host=$host --port=$port << EOF + grant usage on *.* to 'zstack_ui'@'localhost'; + grant usage on *.* to 'zstack_ui'@'%'; + drop user zstack_ui; + create user 'zstack_ui' identified by "$zstack_ui_db_password"; + grant all privileges on zstack_ui.* to zstack_ui@'localhost' identified by "$zstack_ui_db_password"; + grant all privileges on zstack_ui.* to zstack_ui@'%' identified by "$zstack_ui_db_password"; + grant all privileges on zstack_ui.* to zstack_ui@"$hostname" identified by "$zstack_ui_db_password"; + flush privileges; EOF + fi fi diff --git a/conf/springConfigXml/DatabaseFacade.xml b/conf/springConfigXml/DatabaseFacade.xml index 108ba0fdfd0..0e32b390993 100755 --- a/conf/springConfigXml/DatabaseFacade.xml +++ b/conf/springConfigXml/DatabaseFacade.xml @@ -87,6 +87,7 @@ sync + true From eafaf4e8ed7aac5c1e7d3efb1c1b0b7a7be1dc82 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 10 Mar 2025 11:20:25 +0800 Subject: [PATCH 274/737] [sdk]: Update sdk Resolves: ZSTAC-73544 Change-Id: I6a6b6c7074687576747070666179636767737079 Signed-off-by: ye.zou --- .../sdk/UpdateModelEvaluationTaskAction.java | 107 ++++++++++++++++++ .../sdk/UpdateModelEvaluationTaskResult.java | 14 +++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ 3 files changed, 148 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateModelEvaluationTaskAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateModelEvaluationTaskResult.java diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelEvaluationTaskAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelEvaluationTaskAction.java new file mode 100644 index 00000000000..98f1015d91a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelEvaluationTaskAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateModelEvaluationTaskAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UpdateModelEvaluationTaskResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UpdateModelEvaluationTaskResult value = res.getResult(org.zstack.sdk.UpdateModelEvaluationTaskResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateModelEvaluationTaskResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/model-evaluation-tasks/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateModelEvaluationTask"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelEvaluationTaskResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelEvaluationTaskResult.java new file mode 100644 index 00000000000..e8e5ab53513 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelEvaluationTaskResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelEvaluationTaskInventory; + +public class UpdateModelEvaluationTaskResult { + public ModelEvaluationTaskInventory inventory; + public void setInventory(ModelEvaluationTaskInventory inventory) { + this.inventory = inventory; + } + public ModelEvaluationTaskInventory getInventory() { + return this.inventory; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 016f1644ec1..00be4d59473 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -43768,6 +43768,33 @@ abstract class ApiHelper { } + def updateModelEvaluationTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateModelEvaluationTaskAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateModelEvaluationTaskAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def updateModelService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateModelServiceAction.class) Closure c) { def a = new org.zstack.sdk.UpdateModelServiceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From c8719d3e533d88513895761bc2948985a7841489 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 11 Mar 2025 16:59:23 +0800 Subject: [PATCH 275/737] [sdk]: Update sdk Resolves: ZSTAC-73440 Change-Id: I6869796363736a657263736e757a626379706873 --- sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java | 2 +- sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index c358878ddca..3001cc7c3bd 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -76,7 +76,7 @@ public Result throwExceptionIfError() { @Param(required = false, validValues = {"Other","Bentoml","HuggingFace"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String source = "Other"; - @Param(required = false, validValues = {"vLLM","Diffusers","Transformers","sentence_transformers","llama.cpp","Ollama","Other"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"vLLM","Diffusers","Transformers","sentence_transformers","MindIE","llama.cpp","Ollama","Other"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String framework; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java index 88c7d66ad96..ed333248c08 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java @@ -64,7 +64,7 @@ public Result throwExceptionIfError() { @Param(required = false, validValues = {"Other","Bentoml","HuggingFace"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String source; - @Param(required = false, validValues = {"vLLM","Diffusers","Transformers","sentence_transformers","llama.cpp","Ollama","Other"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"vLLM","Diffusers","Transformers","sentence_transformers","MindIE","llama.cpp","Ollama","Other"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String framework; @Param(required = false) From 9729aed33b42f5e6e6b9f2c6a35f2814e461dc95 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Wed, 12 Mar 2025 15:14:24 +0800 Subject: [PATCH 276/737] [sdk]: Update sdk Resolves: ZSTAC-73601 Change-Id: I7363626e6b716562656e64796e656766726e6664 --- sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java | 2 +- sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index 3001cc7c3bd..825c9aaa8dc 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -76,7 +76,7 @@ public Result throwExceptionIfError() { @Param(required = false, validValues = {"Other","Bentoml","HuggingFace"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String source = "Other"; - @Param(required = false, validValues = {"vLLM","Diffusers","Transformers","sentence_transformers","MindIE","llama.cpp","Ollama","Other"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String framework; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java index ed333248c08..3d580c21e78 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java @@ -64,7 +64,7 @@ public Result throwExceptionIfError() { @Param(required = false, validValues = {"Other","Bentoml","HuggingFace"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String source; - @Param(required = false, validValues = {"vLLM","Diffusers","Transformers","sentence_transformers","MindIE","llama.cpp","Ollama","Other"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String framework; @Param(required = false) From 6a4b08feb347cef0d8796ca8608328b98f2ef2d9 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 11 Mar 2025 17:21:19 +0800 Subject: [PATCH 277/737] [sdk]: Update sdk Resolves: ZSTAC-73600 Change-Id: I787566616865626f7467676273727a6b677a6b6a --- sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java index a0839accc36..599faa790f3 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java @@ -43,6 +43,9 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String modelCenterUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List types; + @Param(required = false) public java.util.List systemTags; From 452d17906c78abbd9cfb431d61e12c0d48ffed3a Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 12 Mar 2025 11:31:41 +0800 Subject: [PATCH 278/737] [sdk]: Update sdk Resolves: ZSTAC-73602 Change-Id: I647a776c6e617978616c736f766a6e64776c6864 Signed-off-by: AlanJager --- .../zstack/sdk/CloneModelServiceAction.java | 161 ++++++++++++++++++ .../zstack/sdk/CloneModelServiceResult.java | 7 + .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++ 3 files changed, 195 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CloneModelServiceResult.java diff --git a/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java new file mode 100644 index 00000000000..a3dbaf0f1f1 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java @@ -0,0 +1,161 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CloneModelServiceAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.CloneModelServiceResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String readme; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmImageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String dockerImage; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public long size = 0L; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String gpuComputeCapability; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String installPath; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String startCommand; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String pythonVersion; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String condaVersion; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean system = false; + + @Param(required = false, validValues = {"Endpoint","FineTune","App","ModelEval"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String yaml; + + @Param(required = false, validValues = {"Other","Bentoml","HuggingFace"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String source; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String framework; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer requestCpu; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long requestMemory; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.CloneModelServiceResult value = res.getResult(org.zstack.sdk.CloneModelServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.CloneModelServiceResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/ai/model-services/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CloneModelServiceResult.java b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceResult.java new file mode 100644 index 00000000000..58f0932754a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class CloneModelServiceResult { + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 00be4d59473..8e4470f0439 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -7440,6 +7440,33 @@ abstract class ApiHelper { } + def cloneModelService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CloneModelServiceAction.class) Closure c) { + def a = new org.zstack.sdk.CloneModelServiceAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def cloneVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CloneVmInstanceAction.class) Closure c) { def a = new org.zstack.sdk.CloneVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 29b2927d202db84d5f838f8d51e909f616a795ac Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Fri, 28 Mar 2025 12:57:47 +0800 Subject: [PATCH 279/737] [sdk]: Update sdk Resolves: ZSTAC-72695 Change-Id: I6e67786463677a797968696f6f61767a6f6d747a Signed-off-by: ye.zou Signed-off-by: AlanJager --- conf/db/upgrade/V5.3.22__schema.sql | 1 + .../java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java | 3 +++ .../main/java/org/zstack/sdk/DeployModelEvalServiceAction.java | 3 +++ sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java | 3 +++ 4 files changed, 10 insertions(+) create mode 100644 conf/db/upgrade/V5.3.22__schema.sql diff --git a/conf/db/upgrade/V5.3.22__schema.sql b/conf/db/upgrade/V5.3.22__schema.sql new file mode 100644 index 00000000000..4998bcd05bc --- /dev/null +++ b/conf/db/upgrade/V5.3.22__schema.sql @@ -0,0 +1 @@ +CALL ADD_COLUMN('ModelServiceInstanceVO', 'clusterId', 'INT', 1, NULL); \ No newline at end of file diff --git a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java index 1cd5c85591f..9b244fd1787 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java @@ -67,6 +67,9 @@ public Result throwExceptionIfError() { @Param(required = true, validValues = {"VirtualMachine","Container"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clusterUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Long memorySize; diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java index b263f506f37..06b844f7a6d 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java @@ -118,6 +118,9 @@ public Result throwExceptionIfError() { @Param(required = true, validValues = {"VirtualMachine","Container"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clusterUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Long memorySize; diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java index e7535cec1f3..6f8ab25e307 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java @@ -67,6 +67,9 @@ public Result throwExceptionIfError() { @Param(required = true, validValues = {"VirtualMachine","Container"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clusterUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Long memorySize; From cacd51e5070916346ce3608cfd222e567b3c2d40 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 13 Mar 2025 16:23:27 +0800 Subject: [PATCH 280/737] [sdk]: Update sdk Resolves: ZSTAC-73602 Change-Id: I6777696c706b63736170786870777a6770636569 --- sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java index 599faa790f3..057e11a49a7 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java @@ -44,7 +44,7 @@ public Result throwExceptionIfError() { public java.lang.String modelCenterUuid; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.util.List types; + public java.util.List modelClassifications; @Param(required = false) public java.util.List systemTags; From 45c0eb57672e9778fcf6a1045f65fbefaee4dc26 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 17 Mar 2025 09:35:52 +0800 Subject: [PATCH 281/737] [sdk]: Update sdk Resolves: ZSTAC-73602 Change-Id: I7663696b776e7974656578717578766a67767774 --- .../java/org/zstack/sdk/CloneModelServiceResult.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/sdk/src/main/java/org/zstack/sdk/CloneModelServiceResult.java b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceResult.java index 58f0932754a..9a2f2b0692c 100644 --- a/sdk/src/main/java/org/zstack/sdk/CloneModelServiceResult.java +++ b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceResult.java @@ -1,7 +1,14 @@ package org.zstack.sdk; - +import org.zstack.sdk.ModelServiceInventory; public class CloneModelServiceResult { + public ModelServiceInventory inventory; + public void setInventory(ModelServiceInventory inventory) { + this.inventory = inventory; + } + public ModelServiceInventory getInventory() { + return this.inventory; + } } From 63e2bbe7275b160afdd42d5cd75da37458a386e4 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 17 Mar 2025 13:23:00 +0800 Subject: [PATCH 282/737] [sdk]: Update sdk Resolves: ZSTAC-73439 Change-Id: I75696e756572716b6c67677a706d79666e6f7778 --- sdk/src/main/java/SourceClassMap.java | 2 ++ sdk/src/main/java/org/zstack/sdk/GpuVendor.java | 11 +++++++++++ 2 files changed, 13 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/GpuVendor.java diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 2dbfde7cd85..16c3e2d6c68 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -560,6 +560,7 @@ public class SourceClassMap { put("org.zstack.pciDevice.PciDeviceStatus", "org.zstack.sdk.PciDeviceStatus"); put("org.zstack.pciDevice.PciDeviceType", "org.zstack.sdk.PciDeviceType"); put("org.zstack.pciDevice.gpu.GpuDeviceInventory", "org.zstack.sdk.GpuDeviceInventory"); + put("org.zstack.pciDevice.gpu.GpuVendor", "org.zstack.sdk.GpuVendor"); put("org.zstack.pciDevice.specification.mdev.MdevDeviceSpecInventory", "org.zstack.sdk.MdevDeviceSpecInventory"); put("org.zstack.pciDevice.specification.mdev.MdevDeviceSpecState", "org.zstack.sdk.MdevDeviceSpecState"); put("org.zstack.pciDevice.specification.mdev.PciDeviceMdevSpecRefInventory", "org.zstack.sdk.PciDeviceMdevSpecRefInventory"); @@ -979,6 +980,7 @@ public class SourceClassMap { put("org.zstack.sdk.GlobalConfigOptions", "org.zstack.core.config.GlobalConfigOptions"); put("org.zstack.sdk.GlobalConfigTemplateInventory", "org.zstack.templateConfig.GlobalConfigTemplateInventory"); put("org.zstack.sdk.GpuDeviceInventory", "org.zstack.pciDevice.gpu.GpuDeviceInventory"); + put("org.zstack.sdk.GpuVendor", "org.zstack.pciDevice.gpu.GpuVendor"); put("org.zstack.sdk.GuestOsCharacterInventory", "org.zstack.core.config.GuestOsCharacterInventory"); put("org.zstack.sdk.GuestToolsInventory", "org.zstack.guesttools.GuestToolsInventory"); put("org.zstack.sdk.GuestToolsStateInventory", "org.zstack.guesttools.GuestToolsStateInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/GpuVendor.java b/sdk/src/main/java/org/zstack/sdk/GpuVendor.java new file mode 100644 index 00000000000..ef072743742 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GpuVendor.java @@ -0,0 +1,11 @@ +package org.zstack.sdk; + +public enum GpuVendor { + INTEL, + AMD, + NVIDIA, + HAIGUANG, + HUAWEI, + TIANSHU, + OTHER, +} From 8c5307b6eebf495f09579015d949ba9186a21191 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 14 Mar 2025 14:09:02 +0800 Subject: [PATCH 283/737] [sdk]: Update sdk Resolves: ZSTAC-73439 Change-Id: I6b73727674796f737876677967767a786c6d6d6f --- .../DeployDistributedModelServiceAction.java | 110 ++++++++++++++++++ .../DeployDistributedModelServiceResult.java | 14 +++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ 3 files changed, 151 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceResult.java diff --git a/sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceAction.java new file mode 100644 index 00000000000..9639a38d5ca --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceAction.java @@ -0,0 +1,110 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeployDistributedModelServiceAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeployDistributedModelServiceResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelServices; + + @Param(required = true, validValues = {"parallel","sequential"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceCreationStrategy; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeployDistributedModelServiceResult value = res.getResult(org.zstack.sdk.DeployDistributedModelServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.DeployDistributedModelServiceResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/ai/model-services"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "deployDistributedModelService"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceResult.java b/sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceResult.java new file mode 100644 index 00000000000..cbfea19a3f5 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceInstanceGroupInventory; + +public class DeployDistributedModelServiceResult { + public ModelServiceInstanceGroupInventory inventory; + public void setInventory(ModelServiceInstanceGroupInventory inventory) { + this.inventory = inventory; + } + public ModelServiceInstanceGroupInventory getInventory() { + return this.inventory; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 8e4470f0439..da40c6c3bf7 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -17536,6 +17536,33 @@ abstract class ApiHelper { } + def deployDistributedModelService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeployDistributedModelServiceAction.class) Closure c) { + def a = new org.zstack.sdk.DeployDistributedModelServiceAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def deployModelEvalService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeployModelEvalServiceAction.class) Closure c) { def a = new org.zstack.sdk.DeployModelEvalServiceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 2982ee72b9e8ca92b99025b1b343d7b6ae8a084c Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 17 Mar 2025 14:04:30 +0800 Subject: [PATCH 284/737] [sdk]: Update sdk Resolves: ZSTAC-73439 Change-Id: I617562746378686e776c656968746f6274647665 --- .../zstack/sdk/UpdateModelServiceInstanceGroupAction.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java index 4b9290bdc24..0862c561bf0 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java @@ -34,6 +34,12 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map environmentVariables; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map startupParameters; + @Param(required = false) public java.util.List systemTags; From 091c1c9c2770dc4780f96ec5eb12872182019b6d Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 18 Mar 2025 16:58:36 +0800 Subject: [PATCH 285/737] [sdk]: Update sdk Resolves: ZSTAC-73439 Change-Id: I70746a6d78686a6d6672627a6a6278636a707666 Signed-off-by: AlanJager --- sdk/src/main/java/SourceClassMap.java | 2 + .../java/org/zstack/sdk/ModelService.java | 199 ++++++++++++++++++ 2 files changed, 201 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/ModelService.java diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 16c3e2d6c68..4d67a8ff5af 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -22,6 +22,7 @@ public class SourceClassMap { put("org.zstack.ai.entity.ModelServiceRefInventory", "org.zstack.sdk.ModelServiceRefInventory"); put("org.zstack.ai.entity.TrainedModelRecordInventory", "org.zstack.sdk.TrainedModelRecordInventory"); put("org.zstack.ai.message.MaaSUsage", "org.zstack.sdk.MaaSUsage"); + put("org.zstack.ai.message.ModelService", "org.zstack.sdk.ModelService"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessGroupInventory", "org.zstack.sdk.AliyunNasAccessGroupInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessRuleInventory", "org.zstack.sdk.AliyunNasAccessRuleInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasFileSystemInventory", "org.zstack.sdk.AliyunNasFileSystemInventory"); @@ -1112,6 +1113,7 @@ public class SourceClassMap { put("org.zstack.sdk.ModelEvalServiceInstanceGroupInventory", "org.zstack.ai.entity.ModelEvalServiceInstanceGroupInventory"); put("org.zstack.sdk.ModelEvaluationTaskInventory", "org.zstack.ai.entity.ModelEvaluationTaskInventory"); put("org.zstack.sdk.ModelInventory", "org.zstack.ai.entity.ModelInventory"); + put("org.zstack.sdk.ModelService", "org.zstack.ai.message.ModelService"); put("org.zstack.sdk.ModelServiceGroupDatasetRefInventory", "org.zstack.ai.entity.ModelServiceGroupDatasetRefInventory"); put("org.zstack.sdk.ModelServiceInstanceGroupInventory", "org.zstack.ai.entity.ModelServiceInstanceGroupInventory"); put("org.zstack.sdk.ModelServiceInstanceInventory", "org.zstack.ai.entity.ModelServiceInstanceInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/ModelService.java b/sdk/src/main/java/org/zstack/sdk/ModelService.java new file mode 100644 index 00000000000..55ae0ebab39 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelService.java @@ -0,0 +1,199 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SessionInventory; + +public class ModelService { + + public java.lang.Integer nodeRank; + public void setNodeRank(java.lang.Integer nodeRank) { + this.nodeRank = nodeRank; + } + public java.lang.Integer getNodeRank() { + return this.nodeRank; + } + + public java.lang.Integer tensorParallelSize; + public void setTensorParallelSize(java.lang.Integer tensorParallelSize) { + this.tensorParallelSize = tensorParallelSize; + } + public java.lang.Integer getTensorParallelSize() { + return this.tensorParallelSize; + } + + public boolean isInitialNode; + public void setIsInitialNode(boolean isInitialNode) { + this.isInitialNode = isInitialNode; + } + public boolean getIsInitialNode() { + return this.isInitialNode; + } + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public java.lang.String modelUuid; + public void setModelUuid(java.lang.String modelUuid) { + this.modelUuid = modelUuid; + } + public java.lang.String getModelUuid() { + return this.modelUuid; + } + + public java.lang.String zoneUuid; + public void setZoneUuid(java.lang.String zoneUuid) { + this.zoneUuid = zoneUuid; + } + public java.lang.String getZoneUuid() { + return this.zoneUuid; + } + + public java.lang.String vmImageUuid; + public void setVmImageUuid(java.lang.String vmImageUuid) { + this.vmImageUuid = vmImageUuid; + } + public java.lang.String getVmImageUuid() { + return this.vmImageUuid; + } + + public java.lang.String primaryStorageUuid; + public void setPrimaryStorageUuid(java.lang.String primaryStorageUuid) { + this.primaryStorageUuid = primaryStorageUuid; + } + public java.lang.String getPrimaryStorageUuid() { + return this.primaryStorageUuid; + } + + public java.util.List datasetUuids; + public void setDatasetUuids(java.util.List datasetUuids) { + this.datasetUuids = datasetUuids; + } + public java.util.List getDatasetUuids() { + return this.datasetUuids; + } + + public java.util.List modelServiceGroupUuids; + public void setModelServiceGroupUuids(java.util.List modelServiceGroupUuids) { + this.modelServiceGroupUuids = modelServiceGroupUuids; + } + public java.util.List getModelServiceGroupUuids() { + return this.modelServiceGroupUuids; + } + + public java.lang.String dockerImage; + public void setDockerImage(java.lang.String dockerImage) { + this.dockerImage = dockerImage; + } + public java.lang.String getDockerImage() { + return this.dockerImage; + } + + public java.lang.Integer cpuNum; + public void setCpuNum(java.lang.Integer cpuNum) { + this.cpuNum = cpuNum; + } + public java.lang.Integer getCpuNum() { + return this.cpuNum; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.util.Map environmentVariables; + public void setEnvironmentVariables(java.util.Map environmentVariables) { + this.environmentVariables = environmentVariables; + } + public java.util.Map getEnvironmentVariables() { + return this.environmentVariables; + } + + public java.util.Map startupParameters; + public void setStartupParameters(java.util.Map startupParameters) { + this.startupParameters = startupParameters; + } + public java.util.Map getStartupParameters() { + return this.startupParameters; + } + + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.lang.String clusterUuid; + public void setClusterUuid(java.lang.String clusterUuid) { + this.clusterUuid = clusterUuid; + } + public java.lang.String getClusterUuid() { + return this.clusterUuid; + } + + public java.lang.Long memorySize; + public void setMemorySize(java.lang.Long memorySize) { + this.memorySize = memorySize; + } + public java.lang.Long getMemorySize() { + return this.memorySize; + } + + public java.util.List l3NetworkUuids; + public void setL3NetworkUuids(java.util.List l3NetworkUuids) { + this.l3NetworkUuids = l3NetworkUuids; + } + public java.util.List getL3NetworkUuids() { + return this.l3NetworkUuids; + } + + public java.lang.Integer serviceBootUptime; + public void setServiceBootUptime(java.lang.Integer serviceBootUptime) { + this.serviceBootUptime = serviceBootUptime; + } + public java.lang.Integer getServiceBootUptime() { + return this.serviceBootUptime; + } + + public SessionInventory session; + public void setSession(SessionInventory session) { + this.session = session; + } + public SessionInventory getSession() { + return this.session; + } + + public java.util.List systemTags; + public void setSystemTags(java.util.List systemTags) { + this.systemTags = systemTags; + } + public java.util.List getSystemTags() { + return this.systemTags; + } + + public long timeout; + public void setTimeout(long timeout) { + this.timeout = timeout; + } + public long getTimeout() { + return this.timeout; + } + +} From 646199a0ca108187d8f7ba4d542a1a49ee44c664 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 19 Mar 2025 10:46:32 +0800 Subject: [PATCH 286/737] [sdk]: Update sdk Resolves: ZSTAC-73439 Change-Id: I76666264776e6876776f70647074757565776774 --- .../zstack/sdk/ModelServiceInstanceGroupInventory.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java index 16301cd317e..8720f3ff254 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java @@ -100,4 +100,12 @@ public java.sql.Timestamp getLastOpDate() { return this.lastOpDate; } + public java.lang.String yaml; + public void setYaml(java.lang.String yaml) { + this.yaml = yaml; + } + public java.lang.String getYaml() { + return this.yaml; + } + } From ef502d6c18f8eb8ac23fda2da6167bbb57c9b44b Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 20 Mar 2025 11:12:52 +0800 Subject: [PATCH 287/737] [sdk]: Update sdk Resolves: ZSTAC-73849 Change-Id: I776f756867696b7963696a7173766f6b707a6b75 --- .../sdk/RestartModelServiceGroupsAction.java | 101 ++++++++++++++++++ .../sdk/RestartModelServiceGroupsResult.java | 14 +++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ 3 files changed, 142 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/RestartModelServiceGroupsAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/RestartModelServiceGroupsResult.java diff --git a/sdk/src/main/java/org/zstack/sdk/RestartModelServiceGroupsAction.java b/sdk/src/main/java/org/zstack/sdk/RestartModelServiceGroupsAction.java new file mode 100644 index 00000000000..44c882a6a5f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/RestartModelServiceGroupsAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class RestartModelServiceGroupsAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.RestartModelServiceGroupsResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.util.List uuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.RestartModelServiceGroupsResult value = res.getResult(org.zstack.sdk.RestartModelServiceGroupsResult.class); + ret.value = value == null ? new org.zstack.sdk.RestartModelServiceGroupsResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/model-service-instance-groups"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "restartModelServiceGroups"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/RestartModelServiceGroupsResult.java b/sdk/src/main/java/org/zstack/sdk/RestartModelServiceGroupsResult.java new file mode 100644 index 00000000000..b360f3532f3 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/RestartModelServiceGroupsResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class RestartModelServiceGroupsResult { + public java.util.List results; + public void setResults(java.util.List results) { + this.results = results; + } + public java.util.List getResults() { + return this.results; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index da40c6c3bf7..5c17459a9a5 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -37452,6 +37452,33 @@ abstract class ApiHelper { } + def restartModelServiceGroups(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RestartModelServiceGroupsAction.class) Closure c) { + def a = new org.zstack.sdk.RestartModelServiceGroupsAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def restartResourceStack(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RestartResourceStackAction.class) Closure c) { def a = new org.zstack.sdk.RestartResourceStackAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 8d4eb600e51bdd2fc8963f8da1da3aff75f87415 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Tue, 25 Mar 2025 14:33:56 +0800 Subject: [PATCH 288/737] [conf]: Upgrade yaml config to group not instance DBImpact Resolves: ZSTAC-73947 Change-Id: I6b7263687461686e736770707171776b766b6973 --- conf/db/upgrade/V5.3.22__schema.sql | 56 ++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.3.22__schema.sql b/conf/db/upgrade/V5.3.22__schema.sql index 4998bcd05bc..32cfe5ee867 100644 --- a/conf/db/upgrade/V5.3.22__schema.sql +++ b/conf/db/upgrade/V5.3.22__schema.sql @@ -1 +1,55 @@ -CALL ADD_COLUMN('ModelServiceInstanceVO', 'clusterId', 'INT', 1, NULL); \ No newline at end of file +CALL ADD_COLUMN('ModelServiceInstanceVO', 'clusterId', 'INT', 1, NULL); + +CALL ADD_COLUMN('ModelServiceInstanceGroupVO', 'yaml', 'mediumtext', 1, NULL); + +DROP PROCEDURE IF EXISTS update_instance_group_yaml; + +DELIMITER $$ + +CREATE PROCEDURE update_instance_group_yaml() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE group_uuid VARCHAR(255); + DECLARE group_yaml TEXT; + DECLARE instance_yaml TEXT; + + DECLARE group_cursor CURSOR FOR + SELECT uuid, yaml FROM ModelServiceInstanceGroupVO; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + OPEN group_cursor; + + group_loop: LOOP + FETCH group_cursor INTO group_uuid, group_yaml; + + IF done THEN + LEAVE group_loop; + END IF; + + IF group_yaml IS NULL OR group_yaml = '' THEN + SELECT yaml INTO instance_yaml + FROM ModelServiceInstanceVO + WHERE modelServiceGroupUuid = group_uuid + LIMIT 1; + + IF instance_yaml IS NOT NULL AND instance_yaml != '' THEN + UPDATE ModelServiceInstanceGroupVO + SET yaml = instance_yaml + WHERE id = group_uuid; + + SELECT CONCAT('updated group_uuid: ', group_uuid, ' yaml'); + END IF; + ELSE + SELECT CONCAT('group_uuid: ', group_uuid, ' yaml is not null, skip'); + END IF; + END LOOP; + + CLOSE group_cursor; + + SELECT 'update_instance_group_yaml done'; +END$$ + +DELIMITER ; + +CALL update_instance_group_yaml(); \ No newline at end of file From 5554312f757d7f135fcc43656451cf18b7143537 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Fri, 28 Mar 2025 14:20:02 +0800 Subject: [PATCH 289/737] [plugin]: add cancel cbd self fencer Resolves: ZSTAC-73856 Change-Id: I707a7268796f636d697970676d767762686e7171 --- .../org/zstack/cbd/kvm/KvmCbdCommands.java | 5 +++- .../org/zstack/cbd/kvm/KvmCbdNodeServer.java | 23 +++++++++++-------- .../testlib/ExternalPrimaryStorageSpec.groovy | 9 ++++++++ 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java index 8505e9b6b85..52653a0bc40 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java @@ -10,7 +10,7 @@ * @date 2024/4/10 15:40 */ public class KvmCbdCommands { - public static final String CBD_SETUP_SELF_FENCER_PATH = "/ha/cbd/setupselffencer"; + public static final String SETUP_CBD_SELF_FENCER_PATH = "/ha/cbd/setupselffencer"; public static final String CANCEL_CBD_SELF_FENCER_PATH = "/ha/cbd/cancelselffencer"; public static final String CBD_CHECK_VMSTATE_PATH = "/cbd/check/vmstate"; @@ -44,6 +44,9 @@ public static class KvmSetupSelfFencerCmd extends AgentCmd { public List fencers; } + public static class KvmCancelSelfFencerCmd extends AgentCmd { + } + public static class AgentCmd extends KVMAgentCommands.AgentCommand { public String uuid; } diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java index e9921905913..326c51d33ce 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java @@ -1,12 +1,9 @@ package org.zstack.cbd.kvm; -import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.zstack.cbd.AddonInfo; -import org.zstack.cbd.MdsInfo; import org.zstack.cbd.kvm.KvmCbdCommands.AgentRsp; import org.zstack.cbd.kvm.KvmCbdCommands.KvmSetupSelfFencerCmd; -import org.zstack.cbd.kvm.KvmCbdCommands.KvmUpdateClientConfCmd; +import org.zstack.cbd.kvm.KvmCbdCommands.KvmCancelSelfFencerCmd; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.db.DatabaseFacade; @@ -22,7 +19,6 @@ import org.zstack.header.host.HostInventory; import org.zstack.header.host.HostVO; import org.zstack.header.message.MessageReply; -import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO; import org.zstack.header.storage.addon.primary.HeartbeatVolumeTO; import org.zstack.header.storage.addon.primary.PrimaryStorageNodeSvc; import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageHostRefVO; @@ -35,11 +31,8 @@ import org.zstack.storage.addon.primary.ExternalPrimaryStorageFactory; import org.zstack.utils.DebugUtils; import org.zstack.utils.Utils; -import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; -import java.util.ArrayList; -import java.util.List; import java.util.Map; import static org.zstack.core.Platform.operr; @@ -151,7 +144,7 @@ public void run(FlowTrigger trigger, Map data) { cmd.uuid = param.getPrimaryStorage().getUuid(); cmd.fencers = param.getFencers(); - httpCall(KvmCbdCommands.CBD_SETUP_SELF_FENCER_PATH, param.getHostUuid(), cmd, true, AgentRsp.class, new ReturnValueCompletion(trigger) { + httpCall(KvmCbdCommands.SETUP_CBD_SELF_FENCER_PATH, param.getHostUuid(), cmd, true, AgentRsp.class, new ReturnValueCompletion(trigger) { @Override public void success(AgentRsp returnValue) { trigger.next(); @@ -184,7 +177,19 @@ public void handle(ErrorCode errCode, Map data) { @Override public void kvmCancelSelfFencer(KvmCancelSelfFencerParam param, Completion completion) { + KvmCancelSelfFencerCmd cmd = new KvmCancelSelfFencerCmd(); + cmd.uuid = param.getPrimaryStorage().getUuid(); + httpCall(KvmCbdCommands.CANCEL_CBD_SELF_FENCER_PATH, param.getHostUuid(), cmd, true, AgentRsp.class, new ReturnValueCompletion(completion) { + @Override + public void success(AgentRsp rsp) { + completion.success(); + } + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); } protected void httpCall(String path, final String hostUuid, KVMAgentCommands.AgentCommand cmd, final Class respType, final ReturnValueCompletion completion) { diff --git a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy index b7f2ecf095a..51042670bed 100644 --- a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy @@ -2,6 +2,7 @@ package org.zstack.testlib import org.springframework.http.HttpEntity import org.zstack.cbd.LogicalPoolInfo +import org.zstack.cbd.kvm.KvmCbdCommands import org.zstack.sdk.PrimaryStorageInventory import org.zstack.storage.zbs.ZbsPrimaryStorageMdsBase import org.zstack.storage.zbs.ZbsStorageController @@ -176,6 +177,14 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { return rsp } + + simulator(KvmCbdCommands.SETUP_CBD_SELF_FENCER_PATH) { + return new KvmCbdCommands.AgentRsp() + } + + simulator(KvmCbdCommands.CANCEL_CBD_SELF_FENCER_PATH) { + return new KvmCbdCommands.AgentRsp() + } } } From eb59cc61105f2b918fbb8c307d8177871e141586 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Tue, 1 Apr 2025 14:33:03 +0800 Subject: [PATCH 290/737] [plugin]: set default physical block size for zbs primary storage Resolves: ZSTAC-72259 Change-Id: I616666756e6974676b6e696a637a796563676f68 --- .../primary/PrimaryStorageControllerSvc.java | 1 + .../zstack/expon/ExponStorageController.java | 5 ++++ .../xinfini/XInfiniStorageController.java | 5 ++++ .../org/zstack/storage/zbs/ZbsConstants.java | 1 + .../storage/zbs/ZbsStorageController.java | 12 ++++++++++ .../addon/primary/ExternalPrimaryStorage.java | 3 +++ .../addon/zbs/ZbsPrimaryStorageCase.groovy | 23 ++++++++++++++----- 7 files changed, 44 insertions(+), 6 deletions(-) diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java b/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java index 4a25a811c85..88f32c1dc79 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java @@ -50,4 +50,5 @@ public interface PrimaryStorageControllerSvc { void validateConfig(String config); void setTrashExpireTime(int timeInSeconds, Completion completion); + void onFirstAdditionConfigure(Completion completion); } diff --git a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java index 9d1b89ea9b4..6624857ac89 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java +++ b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java @@ -1315,6 +1315,11 @@ public void setTrashExpireTime(int timeInSeconds, Completion completion) { completion.success(); } + @Override + public void onFirstAdditionConfigure(Completion completion) { + completion.success(); + } + private void retry(Runnable r) { retry(r, 3); } diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index c6b018d91a9..50a43284df6 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -928,6 +928,11 @@ public void setTrashExpireTime(int timeInSeconds, Completion completion) { //TODO } + @Override + public void onFirstAdditionConfigure(Completion completion) { + completion.success(); + } + public void cleanActiveRecord(VolumeInventory vol) { } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java index e060b3fa60b..3e04e2bd924 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java @@ -15,4 +15,5 @@ public interface ZbsConstants { String ZBS_CBD_LUN_PATH_FORMAT = "cbd:%s/%s/%s"; String ZBS_CBD_PREFIX_SCHEME = "cbd://"; Integer PRIMARY_STORAGE_MDS_MAXIMUM_PING_FAILURE = 3; + String VOLUME_PHYSICAL_BLOCK_SIZE = "4096"; } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 8572b86ac40..5fa90a41940 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -38,6 +38,9 @@ import org.zstack.header.volume.VolumeStats; import org.zstack.kvm.KVMHostVO; import org.zstack.kvm.KVMHostVO_; +import org.zstack.resourceconfig.ResourceConfig; +import org.zstack.resourceconfig.ResourceConfigFacade; +import org.zstack.storage.volume.VolumeGlobalConfig; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.data.SizeUnit; @@ -65,6 +68,8 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar private DatabaseFacade dbf; @Autowired protected RESTFacade restf; + @Autowired + private ResourceConfigFacade rcf; private ExternalPrimaryStorageVO self; private AddonInfo addonInfo; @@ -890,6 +895,13 @@ public void setTrashExpireTime(int timeInSeconds, Completion completion) { } + @Override + public void onFirstAdditionConfigure(Completion completion) { + ResourceConfig rc = rcf.getResourceConfig(VolumeGlobalConfig.VOLUME_PHYSICAL_BLOCK_SIZE.getIdentity()); + rc.updateValue(self.getUuid(), ZbsConstants.VOLUME_PHYSICAL_BLOCK_SIZE); + completion.success(); + } + public void doDeleteVolume(String installPath, Boolean force, Completion comp) { DeleteVolumeCmd cmd = new DeleteVolumeCmd(); cmd.setLogicalPoolName(getLogicalPoolNameFromPath(installPath)); diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index 520d556866d..ea3bd38e192 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -1774,6 +1774,9 @@ protected void connectHook(ConnectParam param, Completion completion) { controller.connect(externalVO.getConfig(), self.getUrl(), new ReturnValueCompletion(completion) { @Override public void success(LinkedHashMap addonInfo) { + if (param.isNewAdded()) { + controller.onFirstAdditionConfigure(new NopeCompletion()); + } SQL.New(ExternalPrimaryStorageVO.class).eq(ExternalPrimaryStorageVO_.uuid, self.getUuid()) .set(ExternalPrimaryStorageVO_.addonInfo, JSONObjectUtil.toJsonString(addonInfo)) .update(); diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index c477e61cbd7..6f095a93ad6 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -8,6 +8,7 @@ import org.zstack.header.storage.primary.PrimaryStorageStatus import org.zstack.cbd.MdsUri import org.zstack.sdk.* import org.zstack.storage.primary.PrimaryStorageGlobalConfig +import org.zstack.storage.volume.VolumeGlobalConfig import org.zstack.storage.zbs.ZbsConstants import org.zstack.storage.zbs.ZbsPrimaryStorageMdsBase import org.zstack.storage.zbs.ZbsStorageController @@ -146,16 +147,26 @@ class ZbsPrimaryStorageCase extends SubCase { ps = env.inventoryByName("zbs-1") as PrimaryStorageInventory diskOffering = env.inventoryByName("diskOffering") as DiskOfferingInventory - testZbsStorageLifecycle() + testDefaultConfig() + testLifecycle() testDataVolumeLifecycle() - testZbsPrimaryStorageMdsPing() - testZbsStorageNegativeScenario() + testMdsPing() + testNegativeScenario() testDataVolumeNegativeScenario() testDecodeMdsUriWithSpecialPassword() } } - void testZbsStorageLifecycle() { + void testDefaultConfig() { + def rc = getResourceConfig { + category = VolumeGlobalConfig.CATEGORY + name = VolumeGlobalConfig.VOLUME_PHYSICAL_BLOCK_SIZE.getName() + resourceUuid = ps.uuid + } as GetResourceConfigResult + assert rc.value == ZbsConstants.VOLUME_PHYSICAL_BLOCK_SIZE + } + + void testLifecycle() { updateExternalPrimaryStorage { uuid = ps.uuid name = "test-zbs-new-name" @@ -208,7 +219,7 @@ class ZbsPrimaryStorageCase extends SubCase { } } - void testZbsPrimaryStorageMdsPing() { + void testMdsPing() { PrimaryStorageGlobalConfig.PING_INTERVAL.updateValue(1) Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Connected @@ -282,7 +293,7 @@ class ZbsPrimaryStorageCase extends SubCase { deleteVolume(vol.uuid) } - void testZbsStorageNegativeScenario() { + void testNegativeScenario() { expect(AssertionError.class) { addExternalPrimaryStorage { zoneUuid = zone.uuid From 9124437730ff923b19c807056f8319911d2689ef Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Tue, 1 Apr 2025 10:23:50 +0800 Subject: [PATCH 291/737] [utils]: Introduce yaml loadAs by class Resolves: ZSTAC-74096 Change-Id: I7079766d636b616a7076666b6666747a7a70657a Signed-off-by: ye.zou --- .../main/java/org/zstack/utils/YamlUtils.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/utils/src/main/java/org/zstack/utils/YamlUtils.java b/utils/src/main/java/org/zstack/utils/YamlUtils.java index 3c9b1c0667f..c955402be39 100644 --- a/utils/src/main/java/org/zstack/utils/YamlUtils.java +++ b/utils/src/main/java/org/zstack/utils/YamlUtils.java @@ -2,6 +2,8 @@ import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.nodes.Tag; + /** * @Author: qiuyu.zhang * @Date: 2024/4/8 14:17 @@ -16,8 +18,22 @@ public static String dump(Object obj) { return yaml.dump(obj); } + public static String dumpAs(Object obj, Tag tag) { + DumperOptions options = new DumperOptions(); + options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + options.setDefaultScalarStyle(DumperOptions.ScalarStyle.PLAIN); + Yaml yaml = new Yaml(options); + return yaml.dumpAs(obj, tag, null); + } + public static Object load(String str) { Yaml yaml = new Yaml(); return yaml.load(str); } + + public static T load(String str, Class clazz) { + Yaml yaml = new Yaml(); + return yaml.loadAs(str, clazz); + } + } From b10bff8ffc12576b8d13cb2a05199cecf24d91ce Mon Sep 17 00:00:00 2001 From: "weiqiang.xu" Date: Wed, 2 Apr 2025 16:45:02 +0800 Subject: [PATCH 292/737] [sdk]: generate sdk and fix db generate sdk for APICreateGuestVmScript and APIUpdateGuestVmScript DBImpact: add column contenEncode Resolves: ZSTAC-73503 Change-Id: I6462777365786a79777878666f6e746b766e6867 --- conf/db/upgrade/V5.3.28__schema.sql | 5 + .../zstack/sdk/CreateGuestVmScriptAction.java | 3 + .../sdk/ExecuteGuestVmScriptAction.java | 3 + .../GuestVmScriptExecutedRecordInventory.java | 8 ++ .../zstack/sdk/GuestVmScriptInventory.java | 8 ++ .../zstack/sdk/UpdateGuestVmScriptAction.java | 3 + .../java/org/zstack/testlib/ApiHelper.groovy | 103 ++++++++++-------- 7 files changed, 86 insertions(+), 47 deletions(-) diff --git a/conf/db/upgrade/V5.3.28__schema.sql b/conf/db/upgrade/V5.3.28__schema.sql index 3d2c5efbedb..6ccee3796da 100644 --- a/conf/db/upgrade/V5.3.28__schema.sql +++ b/conf/db/upgrade/V5.3.28__schema.sql @@ -49,3 +49,8 @@ CREATE TABLE IF NOT EXISTS `zstack`.`LogServerVO` ( `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CALL ADD_COLUMN('GuestVmScriptEO', 'encodingType', 'VARCHAR(32)', 1, 'PlainText'); +CALL ADD_COLUMN('GuestVmScriptExecutedRecordVO', 'encodingType', 'VARCHAR(32)', 1, 'PlainText'); +DROP VIEW IF EXISTS `zstack`.`GuestVmScriptVO`; +CREATE VIEW `zstack`.`GuestVmScriptVO` AS SELECT uuid, name, description, platform, encodingType, scriptContent, renderParams, scriptType, scriptTimeout, version, createDate, lastOpDate FROM `zstack`.`GuestVmScriptEO` WHERE deleted IS NULL; \ No newline at end of file diff --git a/sdk/src/main/java/org/zstack/sdk/CreateGuestVmScriptAction.java b/sdk/src/main/java/org/zstack/sdk/CreateGuestVmScriptAction.java index 399308a004a..fbc8c74c75e 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateGuestVmScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateGuestVmScriptAction.java @@ -31,6 +31,9 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 256, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; + @Param(required = true, validValues = {"Base64","PlainText"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String encodingType = "Base64"; + @Param(required = true, maxLength = 65536, minLength = 1, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String scriptContent; diff --git a/sdk/src/main/java/org/zstack/sdk/ExecuteGuestVmScriptAction.java b/sdk/src/main/java/org/zstack/sdk/ExecuteGuestVmScriptAction.java index 27d371c75f7..0902980b9b1 100644 --- a/sdk/src/main/java/org/zstack/sdk/ExecuteGuestVmScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ExecuteGuestVmScriptAction.java @@ -37,6 +37,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String logPath; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String recordUuid; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/GuestVmScriptExecutedRecordInventory.java b/sdk/src/main/java/org/zstack/sdk/GuestVmScriptExecutedRecordInventory.java index 50fca0eac79..53aff8d7a1d 100644 --- a/sdk/src/main/java/org/zstack/sdk/GuestVmScriptExecutedRecordInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/GuestVmScriptExecutedRecordInventory.java @@ -68,6 +68,14 @@ public java.lang.Integer getVersion() { return this.version; } + public java.lang.String encodingType; + public void setEncodingType(java.lang.String encodingType) { + this.encodingType = encodingType; + } + public java.lang.String getEncodingType() { + return this.encodingType; + } + public java.lang.String scriptContent; public void setScriptContent(java.lang.String scriptContent) { this.scriptContent = scriptContent; diff --git a/sdk/src/main/java/org/zstack/sdk/GuestVmScriptInventory.java b/sdk/src/main/java/org/zstack/sdk/GuestVmScriptInventory.java index 8d46aba4587..b1ca010f860 100644 --- a/sdk/src/main/java/org/zstack/sdk/GuestVmScriptInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/GuestVmScriptInventory.java @@ -28,6 +28,14 @@ public java.lang.String getDescription() { return this.description; } + public java.lang.String encodingType; + public void setEncodingType(java.lang.String encodingType) { + this.encodingType = encodingType; + } + public java.lang.String getEncodingType() { + return this.encodingType; + } + public java.lang.String scriptContent; public void setScriptContent(java.lang.String scriptContent) { this.scriptContent = scriptContent; diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateGuestVmScriptAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateGuestVmScriptAction.java index 2862daab4c7..081fa212daa 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateGuestVmScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateGuestVmScriptAction.java @@ -34,6 +34,9 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 256, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; + @Param(required = true, validValues = {"Base64","PlainText"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String encodingType = "Base64"; + @Param(required = false, maxLength = 65536, minLength = 1, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String scriptContent; diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 016f1644ec1..327be81b079 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -1933,25 +1933,27 @@ abstract class ApiHelper { } } + def addLogServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddLogServerAction.class) Closure c) { def a = new org.zstack.sdk.AddLogServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -4368,20 +4370,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -10173,20 +10175,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -10200,20 +10202,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -14918,25 +14920,27 @@ abstract class ApiHelper { } } + def deleteLogServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteLogServerAction.class) Closure c) { def a = new org.zstack.sdk.DeleteLogServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -18703,20 +18707,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -23077,20 +23081,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -29803,32 +29807,6 @@ abstract class ApiHelper { } } - def queryLogServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLogServerAction.class) Closure c) { - def a = new org.zstack.sdk.QueryLogServerAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() - - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } - def queryFiberChannelStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFiberChannelStorageAction.class) Closure c) { def a = new org.zstack.sdk.QueryFiberChannelStorageAction() @@ -31396,6 +31374,35 @@ abstract class ApiHelper { } + def queryLogServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLogServerAction.class) Closure c) { + def a = new org.zstack.sdk.QueryLogServerAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryLongJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLongJobAction.class) Closure c) { def a = new org.zstack.sdk.QueryLongJobAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -43607,25 +43614,27 @@ abstract class ApiHelper { } } + def updateLogServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateLogServerAction.class) Closure c) { def a = new org.zstack.sdk.UpdateLogServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) From af54c9ac81817ed3a80cb22d68b587766377053b Mon Sep 17 00:00:00 2001 From: "yingzhe.hu" Date: Tue, 11 Mar 2025 15:46:04 +0800 Subject: [PATCH 293/737] [sdk]: support data volume live storage migration sdk Resolves: ZSTAC-73538 Change-Id: I61777962787a77777478776f6574616663776a6d --- .../java/org/zstack/sdk/PrimaryStorageMigrateVmAction.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVmAction.java b/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVmAction.java index 1d1884789aa..c54de853b69 100644 --- a/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVmAction.java @@ -37,6 +37,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public boolean withDataVolumes = true; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List dataVolumeUuids; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public boolean withSnapshots = true; From 17175ab5262fc092ee8c5649b4275852eb7f037c Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Wed, 5 Mar 2025 15:05:09 +0800 Subject: [PATCH 294/737] [storage]: default shareblock memory volumes to thick provisioning Resolves: ZSTAC-73165 Change-Id: I6b686731650478436d676e4665196c7478427661 (cherry picked from commit 7420d1850f08db1e8f91f6846bb0d0a4fa003ea8) --- conf/db/upgrade/V5.3.28__schema.sql | 49 +++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/conf/db/upgrade/V5.3.28__schema.sql b/conf/db/upgrade/V5.3.28__schema.sql index 3d2c5efbedb..5d6614cfbc8 100644 --- a/conf/db/upgrade/V5.3.28__schema.sql +++ b/conf/db/upgrade/V5.3.28__schema.sql @@ -1,3 +1,52 @@ +DROP PROCEDURE IF EXISTS createThickProvisionVolumeTag; +DELIMITER $$ +CREATE PROCEDURE createThickProvisionVolumeTag() +BEGIN + DECLARE volUuid VARCHAR(32); + DECLARE newTagUuid VARCHAR(32); + DECLARE done INT DEFAULT FALSE; + + DECLARE volCursor CURSOR FOR + SELECT uuid + FROM zstack.VolumeVO + WHERE type = 'Memory' + AND primaryStorageUuid IN ( + SELECT uuid + FROM zstack.PrimaryStorageVO + WHERE type = 'SharedBlock' + ) + AND uuid NOT IN ( + SELECT resourceUuid + FROM zstack.SystemTagVO + WHERE resourceType = 'VolumeVO' + AND tag = 'volumeProvisioningStrategy::ThickProvisioning' + ); + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + OPEN volCursor; + + read_loop: + LOOP + FETCH volCursor INTO volUuid; + IF done THEN + LEAVE read_loop; + END IF; + + SET newTagUuid = REPLACE(UUID(), '-', ''); + + INSERT INTO zstack.SystemTagVO (uuid, resourceUuid, resourceType, inherent, type, tag, createDate, lastOpDate) + VALUES (newTagUuid, volUuid, 'VolumeVO', 0, 'System', 'volumeProvisioningStrategy::ThickProvisioning', CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP()); + END LOOP; + + CLOSE volCursor; + SELECT CURTIME() AS finishTime; +END $$ +DELIMITER ; + +CALL createThickProvisionVolumeTag(); +DROP PROCEDURE IF EXISTS createThickProvisionVolumeTag; + CREATE TABLE `zstack`.`ObservabilityServerOfferingVO`( `uuid` varchar(32) NOT NULL UNIQUE, `managementNetworkUuid` varchar(32) DEFAULT NULL, From 561740451f6673b2eb3c5d2c56b5c2be3b214670 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Thu, 3 Apr 2025 17:40:46 +0800 Subject: [PATCH 295/737] [conf]: fix upgrade script typo DBImpact Resolves: ZSTAC-74246 Change-Id: I66686d6c746f70636874786c6f6d76707075646e (cherry picked from commit cc6f0eec0f0115e8162c57d3606dc5f7a86d811f) --- conf/db/upgrade/V5.3.22__schema.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.3.22__schema.sql b/conf/db/upgrade/V5.3.22__schema.sql index 32cfe5ee867..9e8012b8158 100644 --- a/conf/db/upgrade/V5.3.22__schema.sql +++ b/conf/db/upgrade/V5.3.22__schema.sql @@ -36,7 +36,7 @@ BEGIN IF instance_yaml IS NOT NULL AND instance_yaml != '' THEN UPDATE ModelServiceInstanceGroupVO SET yaml = instance_yaml - WHERE id = group_uuid; + WHERE uuid = group_uuid; SELECT CONCAT('updated group_uuid: ', group_uuid, ' yaml'); END IF; From a7b947221b5371d08079e8fe83bc352f1d412d57 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Mon, 7 Apr 2025 09:19:48 +0800 Subject: [PATCH 296/737] [conf]: update 5.3.22 schema sum DBImpact Resolves: ZSTAC-74246 Change-Id: I656c666878697762756766757964616577616962 --- conf/db/upgrade/beforeValidate.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/db/upgrade/beforeValidate.sql b/conf/db/upgrade/beforeValidate.sql index 054cd0e211e..ccca45f0fd4 100644 --- a/conf/db/upgrade/beforeValidate.sql +++ b/conf/db/upgrade/beforeValidate.sql @@ -37,6 +37,7 @@ BEGIN update `zstack`.`schema_version` set `checksum`=1170348213 where `script`='V4.8.0.6__schema.sql' and `checksum` <> 1170348213; update `zstack`.`schema_version` set `checksum`=1298863127 where `script`='V5.3.0__schema.sql' and `checksum` <> 1298863127; update `zstack`.`schema_version` set `checksum`=613548663 where `script`='V5.3.6__schema.sql' and `checksum` <> 613548663; + update `zstack`.`schema_version` set `checksum`=1489363540 where `script`='V5.3.22__schema.sql' and `checksum` <> 1489363540; END IF; END $$ From f28bc6e6fa3cd07a7c7800e7df1a60eb02f08ba1 Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Wed, 5 Mar 2025 11:29:27 +0800 Subject: [PATCH 297/737] [ceph]: adding GC for some cases where ceph cannot delete images If children are still stored in the trash, it will prevent the parent from being completely deleted. At this time, add GC to continuously delete the parent. When child are deleted from the trash, the parent will also be deleted by GC. Resolves/Related: ZSTAC-73269 Change-Id: I900f6570657a65767978646d6d6e7365796e7990 --- .../DeleteVolumeChainOnPrimaryStorageMsg.java | 17 ++ ...eleteVolumeChainOnPrimaryStorageReply.java | 12 + .../ceph/primary/CephDeleteVolumeChainGC.java | 61 +++++ .../primary/CephDeleteVolumeSnapshotGC.java | 49 ++++ .../ceph/primary/CephPrimaryStorageBase.java | 34 ++- .../storage/primary/ceph/CephGCCase.groovy | 218 ++++++++++++++++++ .../testlib/CephPrimaryStorageSpec.groovy | 11 +- 7 files changed, 392 insertions(+), 10 deletions(-) create mode 100644 plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeChainGC.java create mode 100644 plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeSnapshotGC.java diff --git a/header/src/main/java/org/zstack/header/storage/primary/DeleteVolumeChainOnPrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/primary/DeleteVolumeChainOnPrimaryStorageMsg.java index e481e4bf75f..6faaa5e56b4 100644 --- a/header/src/main/java/org/zstack/header/storage/primary/DeleteVolumeChainOnPrimaryStorageMsg.java +++ b/header/src/main/java/org/zstack/header/storage/primary/DeleteVolumeChainOnPrimaryStorageMsg.java @@ -1,6 +1,7 @@ package org.zstack.header.storage.primary; import org.zstack.header.message.NeedReplyMessage; +import org.zstack.utils.CollectionUtils; import java.util.List; @@ -13,6 +14,9 @@ public class DeleteVolumeChainOnPrimaryStorageMsg extends NeedReplyMessage imple private String volumeFormat; + // for gc, used to deduplicate GC + private String chainTop; + @Override public String getPrimaryStorageUuid() { return primaryStorageUuid; @@ -45,4 +49,17 @@ public String getVolumeFormat() { public void setVolumeFormat(String volumeFormat) { this.volumeFormat = volumeFormat; } + + public String getChainTop() { + if (chainTop != null) { + return chainTop; + } else if (!CollectionUtils.isEmpty(installPaths)) { + return installPaths.get(0); + } + return null; + } + + public void setChainTop(String chainTop) { + this.chainTop = chainTop; + } } diff --git a/header/src/main/java/org/zstack/header/storage/primary/DeleteVolumeChainOnPrimaryStorageReply.java b/header/src/main/java/org/zstack/header/storage/primary/DeleteVolumeChainOnPrimaryStorageReply.java index 2f2fc268ed1..3602f203e85 100644 --- a/header/src/main/java/org/zstack/header/storage/primary/DeleteVolumeChainOnPrimaryStorageReply.java +++ b/header/src/main/java/org/zstack/header/storage/primary/DeleteVolumeChainOnPrimaryStorageReply.java @@ -2,5 +2,17 @@ import org.zstack.header.message.MessageReply; +import java.util.ArrayList; +import java.util.List; + public class DeleteVolumeChainOnPrimaryStorageReply extends MessageReply { + private List undeletedInstallPaths = new ArrayList<>(); + + public List getUndeletedInstallPaths() { + return undeletedInstallPaths; + } + + public void setUndeletedInstallPaths(List undeletedInstallPaths) { + this.undeletedInstallPaths = undeletedInstallPaths; + } } diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeChainGC.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeChainGC.java new file mode 100644 index 00000000000..4d09485cd95 --- /dev/null +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeChainGC.java @@ -0,0 +1,61 @@ +package org.zstack.storage.ceph.primary; + +import org.zstack.core.Platform; +import org.zstack.core.cloudbus.CloudBusCallBack; +import org.zstack.core.gc.GC; +import org.zstack.core.gc.GCCompletion; +import org.zstack.core.gc.TimeBasedGarbageCollector; +import org.zstack.header.message.MessageReply; +import org.zstack.header.storage.primary.DeleteVolumeChainOnPrimaryStorageMsg; +import org.zstack.header.storage.primary.DeleteVolumeChainOnPrimaryStorageReply; +import org.zstack.header.storage.primary.PrimaryStorageConstant; +import org.zstack.header.storage.primary.PrimaryStorageVO; +import org.zstack.utils.CollectionUtils; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import java.util.List; + +public class CephDeleteVolumeChainGC extends TimeBasedGarbageCollector { + @GC + public String primaryStorageUuid; + @GC + public List installPaths; + @GC + public String chainTop; + + private static final CLogger logger = Utils.getLogger(CephDeleteVolumeChainGC.class); + + @Override + protected void triggerNow(GCCompletion completion) { + if (!dbf.isExist(primaryStorageUuid, PrimaryStorageVO.class) || CollectionUtils.isEmpty(installPaths)) { + completion.cancel(); + return; + } + + DeleteVolumeChainOnPrimaryStorageMsg msg = new DeleteVolumeChainOnPrimaryStorageMsg(); + msg.setPrimaryStorageUuid(primaryStorageUuid); + msg.setChainTop(chainTop); + msg.setInstallPaths(installPaths); + bus.makeTargetServiceIdByResourceUuid(msg, PrimaryStorageConstant.SERVICE_ID, primaryStorageUuid); + bus.send(msg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + completion.fail(reply.getError()); + return; + } + + DeleteVolumeChainOnPrimaryStorageReply r = reply.castReply(); + if (CollectionUtils.isEmpty(r.getUndeletedInstallPaths())) { + completion.success(); + } else { + installPaths = r.getUndeletedInstallPaths(); + updateContext(); + completion.fail(Platform.operr("delete volume chain error, continue to delete")); + } + } + }); + } +} + diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeSnapshotGC.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeSnapshotGC.java new file mode 100644 index 00000000000..d7cdf706aa3 --- /dev/null +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeSnapshotGC.java @@ -0,0 +1,49 @@ +package org.zstack.storage.ceph.primary; + +import org.zstack.core.cloudbus.CloudBusCallBack; +import org.zstack.core.gc.GC; +import org.zstack.core.gc.GCCompletion; +import org.zstack.core.gc.TimeBasedGarbageCollector; +import org.zstack.header.message.MessageReply; +import org.zstack.header.storage.primary.DeleteSnapshotOnPrimaryStorageMsg; +import org.zstack.header.storage.primary.DeleteVolumeBitsOnPrimaryStorageMsg; +import org.zstack.header.storage.primary.PrimaryStorageConstant; +import org.zstack.header.storage.primary.PrimaryStorageVO; +import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; +import org.zstack.header.volume.VolumeInventory; +import org.zstack.storage.volume.VolumeErrors; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +public class CephDeleteVolumeSnapshotGC extends TimeBasedGarbageCollector { + @GC + public String primaryStorageUuid; + @GC + public VolumeSnapshotInventory volumeSnapshot; + + private static final CLogger logger = Utils.getLogger(CephDeleteVolumeSnapshotGC.class); + + @Override + protected void triggerNow(GCCompletion completion) { + if (!dbf.isExist(primaryStorageUuid, PrimaryStorageVO.class)) { + completion.cancel(); + return; + } + + DeleteSnapshotOnPrimaryStorageMsg msg = new DeleteSnapshotOnPrimaryStorageMsg(); + msg.setSnapshot(volumeSnapshot); + bus.makeTargetServiceIdByResourceUuid(msg, PrimaryStorageConstant.SERVICE_ID, primaryStorageUuid); + bus.send(msg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + completion.fail(reply.getError()); + return; + } + + completion.success(); + } + }); + } +} + diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java index 0228bcb7fce..da17fc8a2e5 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java @@ -76,10 +76,7 @@ import org.zstack.storage.volume.VolumeSystemTags; import org.zstack.tag.SystemTag; import org.zstack.tag.SystemTagCreator; -import org.zstack.utils.CollectionDSL; -import org.zstack.utils.CollectionUtils; -import org.zstack.utils.DebugUtils; -import org.zstack.utils.Utils; +import org.zstack.utils.*; import org.zstack.utils.function.Function; import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; @@ -1017,6 +1014,7 @@ public static class DeleteVolumeChainCmd extends AgentCommand { } public static class DeleteVolumeChainRsp extends AgentResponse { + public List undeletedInstallPaths; } public static class CleanTrashCmd extends AgentCommand { @@ -1747,7 +1745,7 @@ private void createEmptyVolume(final InstantiateVolumeOnPrimaryStorageMsg msg) { cmd.skipIfExisting = msg.isSkipIfExisting(); final InstantiateVolumeOnPrimaryStorageReply reply = new InstantiateVolumeOnPrimaryStorageReply(); - + httpCall(CREATE_VOLUME_PATH, cmd, CreateEmptyVolumeRsp.class, new ReturnValueCompletion(msg) { @Override public void fail(ErrorCode err) { @@ -5374,6 +5372,11 @@ public void success(DeleteSnapshotRsp returnValue) { @Override public void fail(ErrorCode errorCode) { + CephDeleteVolumeSnapshotGC snapshotGC = new CephDeleteVolumeSnapshotGC(); + snapshotGC.NAME = String.format("gc-ceph-%s-volumesnapshot-path-%s", self.getUuid(), cmd.snapshotPath); + snapshotGC.primaryStorageUuid = self.getUuid(); + snapshotGC.volumeSnapshot = msg.getSnapshot(); + snapshotGC.deduplicateSubmit(CephGlobalConfig.GC_INTERVAL.value(Long.class), TimeUnit.SECONDS); reply.setError(errorCode); bus.reply(msg, reply); completion.done(); @@ -5956,14 +5959,31 @@ protected void handle(DeleteVolumeChainOnPrimaryStorageMsg msg) { DeleteVolumeChainOnPrimaryStorageReply reply = new DeleteVolumeChainOnPrimaryStorageReply(); DeleteVolumeChainCmd cmd = new DeleteVolumeChainCmd(); cmd.installPaths = msg.getInstallPaths(); - new HttpCaller<>(DELETE_VOLUME_CHAIN_PATH, cmd, AgentResponse.class, new ReturnValueCompletion(msg) { + new HttpCaller<>(DELETE_VOLUME_CHAIN_PATH, cmd, DeleteVolumeChainRsp.class, new ReturnValueCompletion(msg) { + private void submitGcForUndeletedInstallPaths(List undeletedInstallPaths) { + CephDeleteVolumeChainGC volumeChainGC = new CephDeleteVolumeChainGC(); + volumeChainGC.primaryStorageUuid = self.getUuid(); + volumeChainGC.installPaths = undeletedInstallPaths; + volumeChainGC.NAME = String.format("gc-ceph-%s-volume-chain-%s", self.getUuid(), msg.getChainTop()); + volumeChainGC.chainTop = msg.getChainTop(); + volumeChainGC.deduplicateSubmit(CephGlobalConfig.GC_INTERVAL.value(Long.class), TimeUnit.SECONDS); + logger.debug(String.format("unable to delete installPaths %s, now add GC to delete", undeletedInstallPaths)); + } + @Override - public void success(AgentResponse rsp) { + public void success(DeleteVolumeChainRsp rsp) { + if (CollectionUtils.isEmpty(rsp.undeletedInstallPaths)) { + bus.reply(msg, reply); + return; + } + submitGcForUndeletedInstallPaths(rsp.undeletedInstallPaths); + reply.setUndeletedInstallPaths(rsp.undeletedInstallPaths); bus.reply(msg, reply); } @Override public void fail(ErrorCode errorCode) { + submitGcForUndeletedInstallPaths(cmd.installPaths); reply.setError(errorCode); bus.reply(msg, reply); } diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephGCCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephGCCase.groovy index 8670413c4a6..6d34f4d96fa 100755 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephGCCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephGCCase.groovy @@ -1,15 +1,23 @@ package org.zstack.test.integration.storage.primary.ceph +import org.springframework.http.HttpEntity +import org.zstack.core.db.SQL import org.zstack.core.gc.GCStatus +import org.zstack.core.gc.GarbageCollectorVO +import org.zstack.core.gc.GarbageCollectorVO_ import org.zstack.header.volume.VolumeDeletionPolicyManager import org.zstack.sdk.DiskOfferingInventory import org.zstack.sdk.GarbageCollectorInventory import org.zstack.sdk.PrimaryStorageInventory import org.zstack.sdk.VolumeInventory +import org.zstack.sdk.VolumeSnapshotInventory import org.zstack.storage.ceph.CephGlobalConfig +import org.zstack.storage.ceph.primary.CephDeleteVolumeChainGC import org.zstack.storage.ceph.primary.CephDeleteVolumeGC +import org.zstack.storage.ceph.primary.CephDeleteVolumeSnapshotGC import org.zstack.storage.ceph.primary.CephPrimaryStorageBase import org.zstack.storage.volume.VolumeGlobalConfig +import org.zstack.storage.volume.VolumeSystemTags import org.zstack.test.integration.storage.CephEnv import org.zstack.test.integration.storage.StorageTest import org.zstack.testlib.ClusterSpec @@ -18,6 +26,8 @@ import org.zstack.testlib.EnvSpec import org.zstack.testlib.HttpError import org.zstack.testlib.PrimaryStorageSpec import org.zstack.testlib.SubCase +import org.zstack.testlib.vfs.VFS +import org.zstack.utils.gson.JSONObjectUtil import java.util.concurrent.TimeUnit @@ -137,6 +147,213 @@ class CephGCCase extends SubCase { } } + void testVolumeSnapshotGC() { + env.cleanSimulatorAndMessageHandlers() + VolumeInventory vol = createDataVolume { + name = "data" + diskOfferingUuid = diskOffering.uuid + primaryStorageUuid = ceph.uuid + } + + def sp = createVolumeSnapshot { + name = "test-gc" + volumeUuid = vol.uuid + } as VolumeSnapshotInventory + + def deleteFailed = true + def deleteSucVol = [] + env.simulator(CephPrimaryStorageBase.DELETE_SNAPSHOT_PATH) { HttpEntity e, EnvSpec spec -> + def rsp = new CephPrimaryStorageBase.DeleteSnapshotRsp() + if (deleteFailed) { + rsp.setError("it's children in trash, cannot delete") + } + return rsp + } + env.simulator(CephPrimaryStorageBase.DELETE_PATH) { HttpEntity e, EnvSpec spec -> + def rsp = new CephPrimaryStorageBase.DeleteRsp() + def cmd = JSONObjectUtil.toObject(e.body, CephPrimaryStorageBase.DeleteCmd.class) + if (deleteSucVol.contains(cmd.installPath)) { + return rsp + } + if (deleteFailed) { + rsp.setError("snapshot exists") + } + return rsp + } + def callGc = false + def undeletedInstallPaths = [] + env.hijackSimulator(CephPrimaryStorageBase.DELETE_VOLUME_CHAIN_PATH) { CephPrimaryStorageBase.DeleteVolumeChainRsp rsp, HttpEntity e -> + def cmd = JSONObjectUtil.toObject(e.body, CephPrimaryStorageBase.DeleteVolumeChainCmd.class) + // mock install path not clean + rsp.undeletedInstallPaths = cmd.installPaths + + if (callGc) { + rsp.undeletedInstallPaths = undeletedInstallPaths + } + return rsp + } + def backingChain = [] + env.hijackSimulator(CephPrimaryStorageBase.GET_BACKING_CHAIN_PATH) { CephPrimaryStorageBase.GetBackingChainRsp rsp, HttpEntity e -> + rsp.backingChain = backingChain + return rsp + } + + deleteDataVolume { + uuid = vol.uuid + } + expungeDataVolume { + uuid = vol.uuid + } + + def spGC = queryGCJob { + conditions = ["runnerClass=${CephDeleteVolumeSnapshotGC.class.name}".toString(), "context~=%${sp.primaryStorageInstallPath}%".toString()] + } as List + assert spGC.size() == 1 + assert spGC[0].status != GCStatus.Done.toString() + + def volGC = queryGCJob { + conditions = ["runnerClass=${CephDeleteVolumeGC.class.name}".toString(), "context~=%${vol.installPath}%".toString()] + } as List + assert volGC.size() == 1 + assert volGC[0].status != GCStatus.Done.toString() + + deleteFailed = false + triggerGCJob { + uuid = spGC[0].uuid + } + + triggerGCJob { + uuid = volGC[0].uuid + } + + retryInSecs { + assert queryGCJob { + conditions = ["runnerClass=${CephDeleteVolumeSnapshotGC.class.name}".toString(), "context~=%${sp.primaryStorageInstallPath}%".toString()] + }[0].status == GCStatus.Done.toString() + assert queryGCJob { + conditions = ["runnerClass=${CephDeleteVolumeGC.class.name}".toString(), "context~=%${vol.installPath}%".toString()] + }[0].status == GCStatus.Done.toString() + } + SQL.New(GarbageCollectorVO.class).in(GarbageCollectorVO_.uuid, [volGC[0].uuid, spGC[0].uuid]).hardDelete() + vol = createDataVolume { + name = "data" + diskOfferingUuid = diskOffering.uuid + primaryStorageUuid = ceph.uuid + } + + sp = createVolumeSnapshot { + name = "test-gc" + volumeUuid = vol.uuid + } as VolumeSnapshotInventory + + VolumeInventory incVol = createDataVolumeFromVolumeSnapshot { + volumeSnapshotUuid = sp.uuid + name = "incVol" + systemTags = [VolumeSystemTags.FAST_CREATE.tagFormat] + } + + def sp2 = createVolumeSnapshot { + name = "test-gc2" + volumeUuid = incVol.uuid + } as VolumeSnapshotInventory + + VolumeInventory incVol2 = createDataVolumeFromVolumeSnapshot { + volumeSnapshotUuid = sp2.uuid + name = "incVol2" + systemTags = [VolumeSystemTags.FAST_CREATE.tagFormat] + } + + deleteFailed = true + deleteSucVol = [incVol2.installPath] + backingChain = [sp.primaryStorageInstallPath] + deleteDataVolume { + uuid = vol.uuid + } + expungeDataVolume { + uuid = vol.uuid + } + deleteDataVolume { + uuid = incVol.uuid + } + expungeDataVolume { + uuid = incVol.uuid + } + deleteDataVolume { + uuid = incVol2.uuid + } + expungeDataVolume { + uuid = incVol2.uuid + } + + retryInSecs { + spGC = queryGCJob { + conditions = ["runnerClass=${CephDeleteVolumeChainGC.class.name}".toString()] + } as List + assert spGC.size() == 1 + assert spGC[0].status != GCStatus.Done.toString() + assert spGC[0].context.contains(sp2.primaryStorageInstallPath) + assert spGC[0].context.contains(sp.primaryStorageInstallPath) + } + + deleteFailed = false + callGc = true + undeletedInstallPaths = [sp2.primaryStorageInstallPath, sp.primaryStorageInstallPath] + triggerGCJob { + uuid = spGC[0].uuid + } + triggerGCJob { + uuid = spGC[0].uuid + } + + assert !retryInSecs(2) { + def jobs = queryGCJob { + conditions = ["runnerClass=${CephDeleteVolumeChainGC.class.name}".toString()] + } as List + // no duplicate gc + return jobs.size() != 1 || jobs[0].uuid != spGC[0].uuid || jobs[0].context != spGC[0].context + } + + env.cleanSimulatorAndMessageHandlers() + + SQL.New(GarbageCollectorVO.class).in(GarbageCollectorVO_.uuid, [spGC[0].uuid]).hardDelete() + vol = createDataVolume { + name = "data" + diskOfferingUuid = diskOffering.uuid + primaryStorageUuid = ceph.uuid + } + + sp = createVolumeSnapshot { + name = "test-gc" + volumeUuid = vol.uuid + } as VolumeSnapshotInventory + + incVol = createDataVolumeFromVolumeSnapshot { + volumeSnapshotUuid = sp.uuid + name = "incVol" + systemTags = [VolumeSystemTags.FAST_CREATE.tagFormat] + } + + deleteDataVolume { + uuid = vol.uuid + } + expungeDataVolume { + uuid = vol.uuid + } + deleteDataVolume { + uuid = incVol.uuid + } + expungeDataVolume { + uuid = incVol.uuid + } + + assert !retryInSecs(2) { + spGC = queryGCJob { + conditions = ["runnerClass=${CephDeleteVolumeChainGC.class.name}".toString(), "context~=%${sp.primaryStorageInstallPath}%".toString()] + } as List + return spGC.size() > 0 + } + } + void prepareEnv() { env.preSimulator(CephPrimaryStorageBase.DELETE_PATH) { if (deleteFail) { @@ -157,6 +374,7 @@ class CephGCCase extends SubCase { CephGlobalConfig.GC_INTERVAL.updateValue(TimeUnit.DAYS.toSeconds(1)) VolumeGlobalConfig.VOLUME_DELETION_POLICY.updateValue(VolumeDeletionPolicyManager.VolumeDeletionPolicy.Direct.toString()) + testVolumeSnapshotGC() prepareEnv() testVolumeGCSuccess() testVolumeGCCancelledAfterPrimaryStorageDeleted() diff --git a/testlib/src/main/java/org/zstack/testlib/CephPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/CephPrimaryStorageSpec.groovy index d4b460d53be..88d79ad7a2c 100755 --- a/testlib/src/main/java/org/zstack/testlib/CephPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/CephPrimaryStorageSpec.groovy @@ -566,7 +566,7 @@ class CephPrimaryStorageSpec extends PrimaryStorageSpec { return } - if (f.parent?.pathString() == snapshotPath) { + if (f.parent?.setVolumeChainInstallPaths() == snapshotPath) { children.add(f.pathString()) } } @@ -737,12 +737,17 @@ class CephPrimaryStorageSpec extends PrimaryStorageSpec { } simulator(CephPrimaryStorageBase.DELETE_VOLUME_CHAIN_PATH) { HttpEntity e, EnvSpec spec -> - return new CephPrimaryStorageBase.GetBackingChainRsp() + def cmd = JSONObjectUtil.toObject(e.body, CephPrimaryStorageBase.DeleteVolumeChainCmd.class) + def rsp = new CephPrimaryStorageBase.DeleteVolumeChainRsp() + rsp.undeletedInstallPaths = [] + return rsp } - VFS.vfsHook(CephPrimaryStorageBase.DELETE_VOLUME_CHAIN_PATH, espec) { CephPrimaryStorageBase.AgentResponse rsp, HttpEntity e, EnvSpec spec -> + // TODO Need to implement ceph trash in VFS + VFS.vfsHook(CephPrimaryStorageBase.DELETE_VOLUME_CHAIN_PATH, espec) { CephPrimaryStorageBase.DeleteVolumeChainRsp rsp, HttpEntity e, EnvSpec spec -> def cmd = JSONObjectUtil.toObject(e.body, CephPrimaryStorageBase.DeleteVolumeChainCmd.class) VFS vfs = vfs(cmd, spec) + rsp.undeletedInstallPaths = [] for (String path : cmd.installPaths) { String vfsPath = cephPathToVFSPath(path) From 487d3f3358f26fd1b8ef3924abee54a5ed6a77d8 Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Tue, 1 Apr 2025 20:00:25 +0800 Subject: [PATCH 298/737] [volumeSnapshot]: fix flatten volume failed on sblk fix flatten volume failed on sblk because cannot getting backing file of top. Resolves/Related: ZSTAC-74092 Change-Id: I656c63786e6a766b676964686e6e61636661617a --- plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 25596bc479e..6f34d89f3a5 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -2676,10 +2676,10 @@ private void mergeVolumeSnapshot(final MergeVolumeSnapshotOnKvmMsg msg, final No MergeSnapshotCmd cmd = new MergeSnapshotCmd(); cmd.setFullRebase(msg.isFullRebase()); - cmd.setDestPath(volume.getInstallPath()); cmd.setSrcPath(msg.getFrom() != null ? msg.getFrom().getPrimaryStorageInstallPath() : null); cmd.setVmUuid(volume.getVmInstanceUuid()); cmd.setVolume(VolumeTO.valueOf(volume, (KVMHostInventory) getSelfInventory())); + cmd.setDestPath(cmd.getVolume().getInstallPath()); extEmitter.beforeMergeSnapshot((KVMHostInventory) getSelfInventory(), msg, cmd); new Http<>(mergeSnapshotPath, cmd, MergeSnapshotRsp.class) From 93384db313f63763ff7072cb526abd20c4ac0bb3 Mon Sep 17 00:00:00 2001 From: "weiqiang.xu" Date: Mon, 7 Apr 2025 10:10:15 +0800 Subject: [PATCH 299/737] [sdk]: generate UpdataGuestVmScriptMsg sdk Resolves: ZSTAC-73503 Change-Id: I7371636c6e686a6a66776473677574666c6f7a61 --- .../main/java/org/zstack/sdk/UpdateGuestVmScriptAction.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateGuestVmScriptAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateGuestVmScriptAction.java index 081fa212daa..ad9a2c9e625 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateGuestVmScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateGuestVmScriptAction.java @@ -34,8 +34,8 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 256, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; - @Param(required = true, validValues = {"Base64","PlainText"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String encodingType = "Base64"; + @Param(required = false, validValues = {"Base64","PlainText"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String encodingType; @Param(required = false, maxLength = 65536, minLength = 1, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String scriptContent; From a379e80bb572ce1444d3ee5af29237ac0dbe7bab Mon Sep 17 00:00:00 2001 From: shenjin Date: Tue, 8 Apr 2025 13:21:03 +0800 Subject: [PATCH 300/737] [conf]: update Department Manager role description update Department Manager role description Resolves: ZSTAC-74298 Change-Id: I6978667a736a7265756c6367736573697672646d --- conf/roleDefinitions/roleDefinition.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/roleDefinitions/roleDefinition.json b/conf/roleDefinitions/roleDefinition.json index 095e783d66e..e4be8f0c369 100644 --- a/conf/roleDefinitions/roleDefinition.json +++ b/conf/roleDefinitions/roleDefinition.json @@ -2,7 +2,7 @@ { "name": "ORGANIZATION_OPERATOR_ROLE", "uuid": "ff46f380a9b745f490f7edbe0f2c72b9", - "description": "\u90e8\u95e8\u8fd0\u8425\u7ba1\u7406\u5458", + "description": "ORGANIZATION_OPERATOR_ROLE", "statements": [ { From f0cf6d4ba8acf79075df964b206061cf0bcd0d2e Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 10 Apr 2024 11:19:29 +0800 Subject: [PATCH 301/737] [sns]: add interface for sns Resolves: ZSTAC-71363 Change-Id: I726173636c776c7679646a6462756a6762706a65 Signed-off-by: AlanJager --- abstraction/pom.xml | 39 ++++ .../InvalidPluginDefinitionException.java | 4 + .../abstraction/PluginCapabilityState.java | 13 ++ .../zstack/abstraction/PluginRegister.java | 36 ++++ .../zstack/abstraction/PluginValidator.java | 11 ++ .../abstraction/sns/PluginEndpointData.java | 36 ++++ .../abstraction/sns/PluginEndpointSender.java | 17 ++ .../sns/PluginEndpointValidator.java | 40 ++++ conf/db/upgrade/V4.5.1__schema.sql | 10 + conf/springConfigXml/plugin.xml | 17 ++ core/pom.xml | 5 + .../core/plugin/PluginGlobalConfig.java | 20 ++ .../org/zstack/core/plugin/PluginManager.java | 20 ++ .../zstack/core/plugin/PluginManagerImpl.java | 176 ++++++++++++++++++ pom.xml | 10 +- sdk/src/main/java/SourceClassMap.java | 2 + .../java/org/zstack/sdk/ScsiLunInventory.java | 104 +++++++++++ .../plugin/CreateSNSPluginEndpointAction.java | 122 ++++++++++++ .../plugin/CreateSNSPluginEndpointResult.java | 14 ++ .../plugin/QuerySNSPluginEndpointAction.java | 75 ++++++++ .../plugin/QuerySNSPluginEndpointResult.java | 22 +++ .../plugin/SNSPluginEndpointInventory.java | 31 +++ .../java/org/zstack/testlib/ApiHelper.groovy | 137 +++++++++++++- 23 files changed, 958 insertions(+), 3 deletions(-) create mode 100644 abstraction/pom.xml create mode 100644 abstraction/src/main/java/org/zstack/abstraction/InvalidPluginDefinitionException.java create mode 100644 abstraction/src/main/java/org/zstack/abstraction/PluginCapabilityState.java create mode 100644 abstraction/src/main/java/org/zstack/abstraction/PluginRegister.java create mode 100644 abstraction/src/main/java/org/zstack/abstraction/PluginValidator.java create mode 100755 abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointData.java create mode 100644 abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointSender.java create mode 100644 abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointValidator.java create mode 100644 conf/db/upgrade/V4.5.1__schema.sql create mode 100644 conf/springConfigXml/plugin.xml create mode 100644 core/src/main/java/org/zstack/core/plugin/PluginGlobalConfig.java create mode 100644 core/src/main/java/org/zstack/core/plugin/PluginManager.java create mode 100644 core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java create mode 100644 sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/QuerySNSPluginEndpointAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/QuerySNSPluginEndpointResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/SNSPluginEndpointInventory.java diff --git a/abstraction/pom.xml b/abstraction/pom.xml new file mode 100644 index 00000000000..deaa02cf89c --- /dev/null +++ b/abstraction/pom.xml @@ -0,0 +1,39 @@ + + + zstack + org.zstack + 4.5.0 + .. + + 4.0.0 + abstraction + + + + org.apache.maven.plugins + maven-compiler-plugin + ${project.compiler.version} + + groovy-eclipse-compiler + ${project.java.version} + ${project.java.version} + lines,vars,source + true + + + + org.codehaus.groovy + groovy-eclipse-compiler + ${groovy.eclipse.compiler} + + + org.codehaus.groovy + groovy-eclipse-batch + ${groovy.eclipse.batch} + + + + + + diff --git a/abstraction/src/main/java/org/zstack/abstraction/InvalidPluginDefinitionException.java b/abstraction/src/main/java/org/zstack/abstraction/InvalidPluginDefinitionException.java new file mode 100644 index 00000000000..4f83b5629da --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/InvalidPluginDefinitionException.java @@ -0,0 +1,4 @@ +package org.zstack.abstraction; + +public class InvalidPluginDefinitionException extends RuntimeException { +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/PluginCapabilityState.java b/abstraction/src/main/java/org/zstack/abstraction/PluginCapabilityState.java new file mode 100644 index 00000000000..49b3846c29f --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/PluginCapabilityState.java @@ -0,0 +1,13 @@ +package org.zstack.abstraction; + +/** + * PluginCapabilityState offers two states of plugin capabilities. + *

+ * SUPPORTED: means plugin support the capability + * UNSUPPORTED: means plugin do not support the capability + *

+ */ +public enum PluginCapabilityState { + SUPPORTED, + UNSUPPORTED +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/PluginRegister.java b/abstraction/src/main/java/org/zstack/abstraction/PluginRegister.java new file mode 100644 index 00000000000..4716e5bbb33 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/PluginRegister.java @@ -0,0 +1,36 @@ +package org.zstack.abstraction; + +import java.util.Map; + +/** + * PluginRegister defines the specific requirements for plugin. + *

+ * by PluginRegister we should get all metadata of the plugin. + *

+ */ +public interface PluginRegister { + /** + * product name of your plugin + * @return a String of name + */ + String productName(); + + /** + * unique product key from distribution + * @return the key of current environment + */ + String productKey(); + + /** + * plugin version + * @return version of current plugin + */ + String version(); + + /** + * capabilities map describe current plugin's whole + * capabilities + * @return map of capabilities + */ + Map capabilities(); +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/PluginValidator.java b/abstraction/src/main/java/org/zstack/abstraction/PluginValidator.java new file mode 100644 index 00000000000..d743a0f0983 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/PluginValidator.java @@ -0,0 +1,11 @@ +package org.zstack.abstraction; + +import java.util.List; + +public interface PluginValidator { + Class pluginClass(); + + void validate(PluginRegister register); + + void validateAllPlugins(List pluginRegisterList); +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointData.java b/abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointData.java new file mode 100755 index 00000000000..b3e523e473a --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointData.java @@ -0,0 +1,36 @@ +package org.zstack.abstraction.sns; + +import java.util.Map; + +/** + * PluginEndpointData used to copy sns message data for plugin. + */ +public class PluginEndpointData { + private Map metadata; + private String message; + private Map properties; + + public Map getMetadata() { + return metadata; + } + + public void setMetadata(Map metadata) { + this.metadata = metadata; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Map getProperties() { + return properties; + } + + public void setProperties(Map properties) { + this.properties = properties; + } +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointSender.java b/abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointSender.java new file mode 100644 index 00000000000..66300f2a0f0 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointSender.java @@ -0,0 +1,17 @@ +package org.zstack.abstraction.sns; + +import org.zstack.abstraction.PluginRegister; + +/** + * PluginEndpointSender extends PluginRegister and contains sender + * of sns endpoint. + */ +public interface PluginEndpointSender extends PluginRegister { + boolean send(PluginEndpointData message); + + /** + * endpoint type for API and UI usage + * @return string of display type + */ + String endpointType(); +} \ No newline at end of file diff --git a/abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointValidator.java b/abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointValidator.java new file mode 100644 index 00000000000..951c4abd968 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointValidator.java @@ -0,0 +1,40 @@ +package org.zstack.abstraction.sns; + +import org.zstack.abstraction.InvalidPluginDefinitionException; +import org.zstack.abstraction.PluginRegister; +import org.zstack.abstraction.PluginValidator; + +import java.util.List; +import java.util.stream.Collectors; + +public class PluginEndpointValidator implements PluginValidator { + @Override + public Class pluginClass() { + return PluginEndpointSender.class; + } + + @Override + public void validate(PluginRegister register) { + PluginEndpointSender sender = (PluginEndpointSender) register; + + if (sender.endpointType() == null) { + throw new InvalidPluginDefinitionException(); + } + } + + @Override + public void validateAllPlugins(List pluginRegisterList) { + int pluginNumber = pluginRegisterList.size(); + + int distinctPluginByEndpointTypeNumber = pluginRegisterList + .stream() + .map(plugin -> ((PluginEndpointSender) plugin).endpointType()) + .collect(Collectors.toSet()).size(); + + if (pluginNumber == distinctPluginByEndpointTypeNumber) { + return; + } + + throw new InvalidPluginDefinitionException(); + } +} diff --git a/conf/db/upgrade/V4.5.1__schema.sql b/conf/db/upgrade/V4.5.1__schema.sql new file mode 100644 index 00000000000..6858ca58c93 --- /dev/null +++ b/conf/db/upgrade/V4.5.1__schema.sql @@ -0,0 +1,10 @@ +CREATE TABLE IF NOT EXISTS `zstack`.`SNSPluginEndpointVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `pluginType` varchar(64) NOT NULL, + `pluginProductName` varchar(64) NOT NULL, + `pluginProductKey` varchar(64) NOT NULL, + `timeoutInSeconds` int NOT NULL, + `properties` varchar(1024) NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT fkPluginEndpointVOSNSApplicationEndpointVO FOREIGN KEY (uuid) REFERENCES SNSApplicationEndpointVO (uuid) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/conf/springConfigXml/plugin.xml b/conf/springConfigXml/plugin.xml new file mode 100644 index 00000000000..1f87cdd38f8 --- /dev/null +++ b/conf/springConfigXml/plugin.xml @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/core/pom.xml b/core/pom.xml index aab291866b6..1dc2f4c399e 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -21,6 +21,11 @@ header ${project.version}
+ + org.zstack + abstraction + ${project.version} + org.quartz-scheduler quartz diff --git a/core/src/main/java/org/zstack/core/plugin/PluginGlobalConfig.java b/core/src/main/java/org/zstack/core/plugin/PluginGlobalConfig.java new file mode 100644 index 00000000000..e5114f2a9fe --- /dev/null +++ b/core/src/main/java/org/zstack/core/plugin/PluginGlobalConfig.java @@ -0,0 +1,20 @@ +package org.zstack.core.plugin; + +import org.zstack.core.config.GlobalConfig; +import org.zstack.core.config.GlobalConfigDef; +import org.zstack.core.config.GlobalConfigDefinition; +import org.zstack.core.config.GlobalConfigValidation; + +/** + * PluginGlobalConfig implementation. + */ +@GlobalConfigDefinition +public class PluginGlobalConfig { + public static final String CATEGORY = "plugin"; + + @GlobalConfigValidation + @GlobalConfigDef(type = Boolean.class, defaultValue = "true") + public static GlobalConfig ALLOW_UNKNOWN_PRODUCT_PLUGIN = + new GlobalConfig(CATEGORY, "allow.unknown.product.plugin"); + +} diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManager.java b/core/src/main/java/org/zstack/core/plugin/PluginManager.java new file mode 100644 index 00000000000..bc5067715a8 --- /dev/null +++ b/core/src/main/java/org/zstack/core/plugin/PluginManager.java @@ -0,0 +1,20 @@ +package org.zstack.core.plugin; + +import org.zstack.abstraction.PluginRegister; + +import java.util.List; + +/** + * PluginManager interface for plugin related operations. + *

+ * isCapabilitySupported used for plugin capability check. + * getPlugin used for get plugin singleton. + *

+ */ +public interface PluginManager { + boolean isCapabilitySupported(String pluginProductKey, String capability); + + T getPlugin(String pluginProductKey); + + List getPluginList(Class pluginClass); +} diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java new file mode 100644 index 00000000000..77f3d52fad6 --- /dev/null +++ b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java @@ -0,0 +1,176 @@ +package org.zstack.core.plugin; + +import org.apache.commons.codec.digest.DigestUtils; +import org.zstack.abstraction.PluginCapabilityState; +import org.zstack.abstraction.PluginRegister; +import org.zstack.abstraction.PluginValidator; +import org.zstack.core.Platform; +import org.zstack.header.Component; +import org.zstack.header.errorcode.OperationFailureException; +import org.zstack.header.exception.CloudRuntimeException; +import org.zstack.utils.Utils; +import org.zstack.utils.gson.JSONObjectUtil; +import org.zstack.utils.logging.CLogger; + +import java.lang.reflect.Method; +import java.util.*; + +import static org.zstack.core.Platform.operr; + +/** + * PluginManagerImpl implementation of PluginManager. + */ +public class PluginManagerImpl implements PluginManager, Component { + private static final CLogger logger = Utils.getLogger(PluginManagerImpl.class); + + private final Set> pluginMetadata = new HashSet<>(); + private final Map pluginInstances = new HashMap<>(); + private final Map, List> + pluginRegisterMap = new HashMap<>(); + private final Map, PluginValidator> + pluginValidatorMap = new HashMap<>(); + + private void collectPluginProtocolMetadata() { + Platform.getReflections().getSubTypesOf(PluginRegister.class).forEach(clz -> { + if (!clz.getCanonicalName().contains("org.zstack.abstraction") + || !clz.isInterface()) { + return; + } + + if (pluginMetadata.contains(clz)) { + throw new CloudRuntimeException( + String.format("duplicate PluginProtocol[name: %s]", clz)); + } + + pluginMetadata.add(clz); + }); + } + + private void registerPluginAsSingleton( + Class pluginRegisterClz) { + try { + PluginRegister pluginRegister = pluginRegisterClz + .getConstructor() + .newInstance(); + if (pluginInstances.containsKey(pluginRegister.productKey())) { + throw new CloudRuntimeException( + String.format("duplicate plugin[class: %s]", pluginRegisterClz)); + } + + if (pluginValidatorMap.containsKey(pluginRegisterClz)) { + pluginValidatorMap.get(pluginRegisterClz).validate(pluginRegister); + } + + logger.debug( + String.format("detect plugin class: %s, name: %s, version: %s," + + " capabilities: \n %s", + pluginRegisterClz.getCanonicalName(), + pluginRegister.version(), + pluginRegister.productName(), + JSONObjectUtil.toJsonString(pluginRegister.capabilities()))); + + verifyPluginProduct(pluginRegister); + pluginInstances.put(pluginRegister.productKey(), pluginRegister); + pluginRegisterMap.computeIfAbsent(pluginRegisterClz, k -> new ArrayList<>()); + pluginRegisterMap.get(pluginRegisterClz).add(pluginRegister); + } catch (Exception e) { + throw new CloudRuntimeException(e); + } + } + + private void getPluginInterfaceSingletons(Class clz) { + Platform.getReflections() + .getSubTypesOf(clz) + .forEach(this::registerPluginAsSingleton); + } + + private void loadPluginsFromMetadata() { + pluginMetadata.forEach(this::getPluginInterfaceSingletons); + + pluginRegisterMap.forEach((pluginClazz, instanceList) -> { + PluginValidator validator = pluginValidatorMap.get(pluginClazz); + if (validator == null) { + return; + } + + validator.validateAllPlugins(instanceList); + }); + } + + private void verifyPluginProduct(PluginRegister pluginRegister) { + if (!PluginGlobalConfig.ALLOW_UNKNOWN_PRODUCT_PLUGIN.value(Boolean.class) + && pluginRegister.productKey() == null) { + throw new OperationFailureException(operr("unknown product plugin name: %s", + pluginRegister.productName())); + } + + doVerification(pluginRegister.productName(), pluginRegister.productKey()); + } + + private void doVerification(String productName, String productKey) { + if (!DigestUtils.md5Hex(productName).equals(productKey)) { + throw new OperationFailureException(operr("failed to verify product: %s", + productName)); + } + } + + private void collectPluginValidators() { + Platform.getReflections().getSubTypesOf(PluginValidator.class).forEach(clz -> { + if (!clz.getCanonicalName().contains("org.zstack.abstraction") + || !clz.isInterface()) { + return; + } + + if (pluginMetadata.contains(clz)) { + throw new CloudRuntimeException( + String.format("duplicate PluginValidator[name: %s]", clz)); + } + + try { + PluginValidator pluginValidator = clz + .getConstructor() + .newInstance(); + + pluginValidatorMap.put(pluginValidator.pluginClass(), pluginValidator); + } catch (Exception e) { + throw new CloudRuntimeException(e); + } + }); + } + + @Override + public boolean start() { + collectPluginProtocolMetadata(); + collectPluginValidators(); + loadPluginsFromMetadata(); + return true; + } + + @Override + public boolean stop() { + return true; + } + + @Override + public boolean isCapabilitySupported(String pluginProductKey, + String capability) { + return pluginInstances.get(pluginProductKey) + .capabilities() + .get(capability) == PluginCapabilityState.SUPPORTED; + } + + @Override + public T getPlugin(String pluginProductKey) { + if (!pluginInstances.containsKey(pluginProductKey)) { + throw new CloudRuntimeException(String.format("Unsupported plugin %s", + pluginProductKey)); + } + + return (T) pluginInstances.get(pluginProductKey); + } + + @Override + public List getPluginList(Class pluginClass) { + return (List) pluginRegisterMap.get(pluginClass); + } +} diff --git a/pom.xml b/pom.xml index 3f4b49c0442..60c7a9afdc5 100755 --- a/pom.xml +++ b/pom.xml @@ -50,6 +50,7 @@ longjob resourceconfig plugin/iscsi + abstraction @@ -474,7 +475,7 @@ org.projectlombok lombok - 1.16.6 + 1.18.24 net.bytebuddy @@ -541,6 +542,13 @@
+ + + maven-releases + http://172.20.93.29:8081/repository/maven-releases/ + + + premium diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 4d67a8ff5af..f58408bb394 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -616,6 +616,7 @@ public class SourceClassMap { put("org.zstack.sns.platform.universalsms.supplier.emay.SNSEmaySmsEndpointInventory", "org.zstack.sdk.sns.platform.universalsms.supplier.emay.SNSEmaySmsEndpointInventory"); put("org.zstack.sns.platform.wecom.SNSWeComAtPersonInventory", "org.zstack.sdk.sns.platform.wecom.SNSWeComAtPersonInventory"); put("org.zstack.sns.platform.wecom.SNSWeComEndpointInventory", "org.zstack.sdk.sns.platform.wecom.SNSWeComEndpointInventory"); + put("org.zstack.sns.platform.plugin.SNSPluginEndpointInventory", "org.zstack.sdk.sns.platform.plugin.SNSPluginEndpointInventory"); put("org.zstack.sso.header.CasClientInventory", "org.zstack.sdk.CasClientInventory"); put("org.zstack.sso.header.CasState", "org.zstack.sdk.CasState"); put("org.zstack.sso.header.OAuth2ClientInventory", "org.zstack.sdk.OAuth2ClientInventory"); @@ -1509,6 +1510,7 @@ public class SourceClassMap { put("org.zstack.sdk.sns.platform.universalsms.supplier.emay.SNSEmaySmsEndpointInventory", "org.zstack.sns.platform.universalsms.supplier.emay.SNSEmaySmsEndpointInventory"); put("org.zstack.sdk.sns.platform.wecom.SNSWeComAtPersonInventory", "org.zstack.sns.platform.wecom.SNSWeComAtPersonInventory"); put("org.zstack.sdk.sns.platform.wecom.SNSWeComEndpointInventory", "org.zstack.sns.platform.wecom.SNSWeComEndpointInventory"); + put("org.zstack.sdk.sns.platform.plugin.SNSPluginEndpointInventory", "org.zstack.sns.platform.plugin.SNSPluginEndpointInventory"); put("org.zstack.sdk.ticket.entity.ArchiveTicketInventory", "org.zstack.ticket.entity.ArchiveTicketInventory"); put("org.zstack.sdk.ticket.entity.ArchiveTicketStatusHistoryInventory", "org.zstack.ticket.entity.ArchiveTicketStatusHistoryInventory"); put("org.zstack.sdk.ticket.entity.TicketFlowCollectionInventory", "org.zstack.ticket.entity.TicketFlowCollectionInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/ScsiLunInventory.java b/sdk/src/main/java/org/zstack/sdk/ScsiLunInventory.java index d0dd23c1be2..40ae4b72311 100644 --- a/sdk/src/main/java/org/zstack/sdk/ScsiLunInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ScsiLunInventory.java @@ -4,6 +4,110 @@ public class ScsiLunInventory extends org.zstack.sdk.LunInventory { + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String wwid; + public void setWwid(java.lang.String wwid) { + this.wwid = wwid; + } + public java.lang.String getWwid() { + return this.wwid; + } + + public java.lang.String vendor; + public void setVendor(java.lang.String vendor) { + this.vendor = vendor; + } + public java.lang.String getVendor() { + return this.vendor; + } + + public java.lang.String model; + public void setModel(java.lang.String model) { + this.model = model; + } + public java.lang.String getModel() { + return this.model; + } + + public java.lang.String wwn; + public void setWwn(java.lang.String wwn) { + this.wwn = wwn; + } + public java.lang.String getWwn() { + return this.wwn; + } + + public java.lang.String serial; + public void setSerial(java.lang.String serial) { + this.serial = serial; + } + public java.lang.String getSerial() { + return this.serial; + } + + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.lang.String hctl; + public void setHctl(java.lang.String hctl) { + this.hctl = hctl; + } + public java.lang.String getHctl() { + return this.hctl; + } + + public java.lang.String path; + public void setPath(java.lang.String path) { + this.path = path; + } + public java.lang.String getPath() { + return this.path; + } + + public java.lang.String state; + public void setState(java.lang.String state) { + this.state = state; + } + public java.lang.String getState() { + return this.state; + } + + public java.lang.Long size; + public void setSize(java.lang.Long size) { + this.size = size; + } + public java.lang.Long getSize() { + return this.size; + } + + public java.lang.String multipathDeviceUuid; + public void setMultipathDeviceUuid(java.lang.String multipathDeviceUuid) { + this.multipathDeviceUuid = multipathDeviceUuid; + } + public java.lang.String getMultipathDeviceUuid() { + return this.multipathDeviceUuid; + } + public java.util.List scsiLunHostRefs; public void setScsiLunHostRefs(java.util.List scsiLunHostRefs) { this.scsiLunHostRefs = scsiLunHostRefs; diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointAction.java new file mode 100644 index 00000000000..686f0ea490a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointAction.java @@ -0,0 +1,122 @@ +package org.zstack.sdk.sns.platform.plugin; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateSNSPluginEndpointAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.sns.platform.plugin.CreateSNSPluginEndpointResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, maxLength = 64, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String endpointType; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public long timeoutInSeconds = 0L; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map properties; + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String platformUuid; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.sns.platform.plugin.CreateSNSPluginEndpointResult value = res.getResult(org.zstack.sdk.sns.platform.plugin.CreateSNSPluginEndpointResult.class); + ret.value = value == null ? new org.zstack.sdk.sns.platform.plugin.CreateSNSPluginEndpointResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/sns/application-endpoints/plugin"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointResult.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointResult.java new file mode 100644 index 00000000000..5440b617541 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.sns.platform.plugin; + +import org.zstack.sdk.sns.platform.plugin.SNSPluginEndpointInventory; + +public class CreateSNSPluginEndpointResult { + public SNSPluginEndpointInventory inventory; + public void setInventory(SNSPluginEndpointInventory inventory) { + this.inventory = inventory; + } + public SNSPluginEndpointInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/QuerySNSPluginEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/QuerySNSPluginEndpointAction.java new file mode 100644 index 00000000000..296635f110b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/QuerySNSPluginEndpointAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk.sns.platform.plugin; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QuerySNSPluginEndpointAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.sns.platform.plugin.QuerySNSPluginEndpointResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.sns.platform.plugin.QuerySNSPluginEndpointResult value = res.getResult(org.zstack.sdk.sns.platform.plugin.QuerySNSPluginEndpointResult.class); + ret.value = value == null ? new org.zstack.sdk.sns.platform.plugin.QuerySNSPluginEndpointResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/sns/application-endpoints/plugin"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/QuerySNSPluginEndpointResult.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/QuerySNSPluginEndpointResult.java new file mode 100644 index 00000000000..0d1ca7411de --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/QuerySNSPluginEndpointResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk.sns.platform.plugin; + + + +public class QuerySNSPluginEndpointResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/SNSPluginEndpointInventory.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/SNSPluginEndpointInventory.java new file mode 100644 index 00000000000..162e6515eaf --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/SNSPluginEndpointInventory.java @@ -0,0 +1,31 @@ +package org.zstack.sdk.sns.platform.plugin; + + + +public class SNSPluginEndpointInventory extends org.zstack.sdk.sns.SNSApplicationEndpointInventory { + + public java.lang.String endpointType; + public void setEndpointType(java.lang.String endpointType) { + this.endpointType = endpointType; + } + public java.lang.String getEndpointType() { + return this.endpointType; + } + + public long timeoutInSeconds; + public void setTimeoutInSeconds(long timeoutInSeconds) { + this.timeoutInSeconds = timeoutInSeconds; + } + public long getTimeoutInSeconds() { + return this.timeoutInSeconds; + } + + public java.util.Map properties; + public void setProperties(java.util.Map properties) { + this.properties = properties; + } + public java.util.Map getProperties() { + return this.properties; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index d679ba525cc..3bb1fa4e6e6 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -22163,6 +22163,32 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def getSupportAPIs(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetSupportAPIsAction.class) Closure c) { + def a = new org.zstack.sdk.GetSupportAPIsAction() + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() if (System.getProperty("apipath") != null) { @@ -32507,9 +32533,8 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - - a.conditions = a.conditions.collect { it.toString() } + a.conditions = a.conditions.collect { it.toString() } if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -45943,6 +45968,89 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def createSNSPluginEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.sns.platform.plugin.CreateSNSPluginEndpointAction.class) Closure c) { + def a = new org.zstack.sdk.sns.platform.plugin.CreateSNSPluginEndpointAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def querySNSPluginEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.sns.platform.plugin.QuerySNSPluginEndpointAction.class) Closure c) { + def a = new org.zstack.sdk.sns.platform.plugin.QuerySNSPluginEndpointAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def addTicketTypesToTicketFlowCollection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ticket.api.AddTicketTypesToTicketFlowCollectionAction.class) Closure c) { + def a = new org.zstack.sdk.ticket.api.AddTicketTypesToTicketFlowCollectionAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() if (System.getProperty("apipath") != null) { @@ -54377,4 +54485,29 @@ abstract class ApiHelper { } + def syncImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncImageAction.class) Closure c) { + def a = new org.zstack.sdk.SyncImageAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } } From 8049ff3922de9d9d3ca36d487961d2c04f5d9974 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 16 Dec 2024 10:46:11 +0800 Subject: [PATCH 302/737] [encrypt]: crypto plugin support Resolves: ZSTAC-71363 Change-Id: I74626e76716a74736d6c6b646279716d62677868 Signed-off-by: AlanJager --- abstraction/pom.xml | 2 +- ...{PluginRegister.java => PluginDriver.java} | 36 ++- .../abstraction/PluginEndpointValidator.java | 36 +++ .../org/zstack/abstraction/PluginMethod.java | 5 + .../zstack/abstraction/PluginValidator.java | 6 +- .../crypto/CryptoClientDriver.java | 56 ++++ .../abstraction/sns/EndpointDriver.java | 11 + .../abstraction/sns/PluginEndpointSender.java | 17 -- .../sns/PluginEndpointValidator.java | 40 --- .../abstraction/storage/StorageDriver.java | 63 ++++ .../abstraction/storage/VolumeBackupData.java | 4 + .../abstraction/storage/VolumeData.java | 4 + .../storage/VolumeSnapshotData.java | 4 + conf/db/upgrade/V4.5.1__schema.sql | 25 +- conf/persistence.xml | 1 + .../zstack/core/encrypt/EncryptDriver.java | 6 + .../core/encrypt/EncryptFacadeImpl.java | 8 +- .../zstack/core/encrypt/EncryptResult.java | 38 +++ .../zstack/core/plugin/PluginDriverVO.java | 78 +++++ .../zstack/core/plugin/PluginDriverVO_.java | 12 + .../org/zstack/core/plugin/PluginManager.java | 16 +- .../zstack/core/plugin/PluginManagerImpl.java | 176 +++++++---- sdk/src/main/java/SourceClassMap.java | 2 + .../CreateAiSiNoSecretResourcePoolAction.java | 2 +- .../CreateFlkSecSecretResourcePoolAction.java | 2 +- .../CreateHaiTaiSecretResourcePoolAction.java | 2 +- ...CreateInfoSecSecretResourcePoolAction.java | 2 +- .../CreatePluginSecretResourcePoolAction.java | 128 ++++++++ .../PluginSecretResourcePoolInventory.java | 15 + .../java/org/zstack/sdk/ScsiLunInventory.java | 104 ------- .../plugin/CreateSNSPluginEndpointAction.java | 2 +- .../plugin/SNSPluginEndpointInventory.java | 10 +- test/src/test/resources/log4j2.xml | 4 +- .../java/org/zstack/testlib/ApiHelper.groovy | 273 ++++++++++++++---- 34 files changed, 897 insertions(+), 293 deletions(-) rename abstraction/src/main/java/org/zstack/abstraction/{PluginRegister.java => PluginDriver.java} (51%) create mode 100644 abstraction/src/main/java/org/zstack/abstraction/PluginEndpointValidator.java create mode 100644 abstraction/src/main/java/org/zstack/abstraction/PluginMethod.java create mode 100644 abstraction/src/main/java/org/zstack/abstraction/crypto/CryptoClientDriver.java create mode 100644 abstraction/src/main/java/org/zstack/abstraction/sns/EndpointDriver.java delete mode 100644 abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointSender.java delete mode 100644 abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointValidator.java create mode 100644 abstraction/src/main/java/org/zstack/abstraction/storage/StorageDriver.java create mode 100644 abstraction/src/main/java/org/zstack/abstraction/storage/VolumeBackupData.java create mode 100644 abstraction/src/main/java/org/zstack/abstraction/storage/VolumeData.java create mode 100644 abstraction/src/main/java/org/zstack/abstraction/storage/VolumeSnapshotData.java create mode 100644 core/src/main/java/org/zstack/core/encrypt/EncryptResult.java create mode 100644 core/src/main/java/org/zstack/core/plugin/PluginDriverVO.java create mode 100644 core/src/main/java/org/zstack/core/plugin/PluginDriverVO_.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreatePluginSecretResourcePoolAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/PluginSecretResourcePoolInventory.java diff --git a/abstraction/pom.xml b/abstraction/pom.xml index deaa02cf89c..aef3bd97024 100644 --- a/abstraction/pom.xml +++ b/abstraction/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 4.5.0 + 4.7.0 .. 4.0.0 diff --git a/abstraction/src/main/java/org/zstack/abstraction/PluginRegister.java b/abstraction/src/main/java/org/zstack/abstraction/PluginDriver.java similarity index 51% rename from abstraction/src/main/java/org/zstack/abstraction/PluginRegister.java rename to abstraction/src/main/java/org/zstack/abstraction/PluginDriver.java index 4716e5bbb33..25212f7d801 100644 --- a/abstraction/src/main/java/org/zstack/abstraction/PluginRegister.java +++ b/abstraction/src/main/java/org/zstack/abstraction/PluginDriver.java @@ -8,18 +8,20 @@ * by PluginRegister we should get all metadata of the plugin. *

*/ -public interface PluginRegister { +public interface PluginDriver { + String type(); + /** * product name of your plugin * @return a String of name */ - String productName(); + String name(); /** * unique product key from distribution * @return the key of current environment */ - String productKey(); + String uuid(); /** * plugin version @@ -30,7 +32,31 @@ public interface PluginRegister { /** * capabilities map describe current plugin's whole * capabilities - * @return map of capabilities + * @return map of feature + */ + Map features(); + + /** + * plugin's description + * @return description of current plugin + */ + String description(); + + /** + * plugin's vendor + * @return vendor of current plugin + */ + String vendor(); + + /** + * plugin's url + * @return url of current plugin + */ + String url(); + + /** + * plugin's license + * @return license of current plugin */ - Map capabilities(); + String license(); } diff --git a/abstraction/src/main/java/org/zstack/abstraction/PluginEndpointValidator.java b/abstraction/src/main/java/org/zstack/abstraction/PluginEndpointValidator.java new file mode 100644 index 00000000000..b76d8e6c382 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/PluginEndpointValidator.java @@ -0,0 +1,36 @@ +package org.zstack.abstraction; + +import org.zstack.abstraction.sns.EndpointDriver; + +import java.util.List; +import java.util.stream.Collectors; + +public class PluginEndpointValidator implements PluginValidator { + @Override + public Class pluginClass() { + return EndpointDriver.class; + } + + @Override + public void validate(PluginDriver register) { + if (register.type() == null) { + throw new InvalidPluginDefinitionException(); + } + } + + @Override + public void validateAllPlugins(List pluginDriverList) { + int pluginNumber = pluginDriverList.size(); + + int distinctPluginByEndpointTypeNumber = pluginDriverList + .stream() + .map(PluginDriver::type) + .collect(Collectors.toSet()).size(); + + if (pluginNumber == distinctPluginByEndpointTypeNumber) { + return; + } + + throw new InvalidPluginDefinitionException(); + } +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/PluginMethod.java b/abstraction/src/main/java/org/zstack/abstraction/PluginMethod.java new file mode 100644 index 00000000000..cd371c05499 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/PluginMethod.java @@ -0,0 +1,5 @@ +package org.zstack.abstraction; + +public @interface PluginMethod { + boolean required() default true; +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/PluginValidator.java b/abstraction/src/main/java/org/zstack/abstraction/PluginValidator.java index d743a0f0983..ac41e00705e 100644 --- a/abstraction/src/main/java/org/zstack/abstraction/PluginValidator.java +++ b/abstraction/src/main/java/org/zstack/abstraction/PluginValidator.java @@ -3,9 +3,9 @@ import java.util.List; public interface PluginValidator { - Class pluginClass(); + Class pluginClass(); - void validate(PluginRegister register); + void validate(PluginDriver register); - void validateAllPlugins(List pluginRegisterList); + void validateAllPlugins(List pluginRegisterList); } diff --git a/abstraction/src/main/java/org/zstack/abstraction/crypto/CryptoClientDriver.java b/abstraction/src/main/java/org/zstack/abstraction/crypto/CryptoClientDriver.java new file mode 100644 index 00000000000..e496a40f8b0 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/crypto/CryptoClientDriver.java @@ -0,0 +1,56 @@ +package org.zstack.abstraction.crypto; + +import org.zstack.abstraction.PluginDriver; + +import java.security.cert.X509Certificate; +import java.util.Map; + +public interface CryptoClientDriver extends PluginDriver { + boolean initialize(Map properties); + /** + * Test client connectivity + * + * @return true means test connection succeed else false + */ + boolean connect(Map properties); + + /** + * Parse certificate + * + * @param cert Certificate byte[] + * @return X509Certificate instance + */ + X509Certificate genericCertificate(byte[] cert); + + /** + * Return SM3 encrypted cipher text + * + * @param plain the original text + * @return encrypt result + */ + String sm3Encrypt(String plain); + + /** + * SM4 encryption of the string + * + * @param plain the original text + * @return SM4 encrypted text + */ + String sm4Encrypt(String plain); + + /** + * SM4 decryption of the string + * + * @param plain the encrypted text + * @return sSM4 decrypted text + */ + String sm4Decrypt(String plain); + + /** + * Encrypt the string with hmac + * + * @param plain the original text + * @return hmac encrypted text + */ + String hmac(String plain); +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/sns/EndpointDriver.java b/abstraction/src/main/java/org/zstack/abstraction/sns/EndpointDriver.java new file mode 100644 index 00000000000..ce8e54c4070 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/sns/EndpointDriver.java @@ -0,0 +1,11 @@ +package org.zstack.abstraction.sns; + +import org.zstack.abstraction.PluginDriver; + +/** + * PluginEndpointSender extends PluginRegister and contains sender + * of sns endpoint. + */ +public interface EndpointDriver extends PluginDriver { + boolean send(PluginEndpointData message); +} \ No newline at end of file diff --git a/abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointSender.java b/abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointSender.java deleted file mode 100644 index 66300f2a0f0..00000000000 --- a/abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointSender.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.zstack.abstraction.sns; - -import org.zstack.abstraction.PluginRegister; - -/** - * PluginEndpointSender extends PluginRegister and contains sender - * of sns endpoint. - */ -public interface PluginEndpointSender extends PluginRegister { - boolean send(PluginEndpointData message); - - /** - * endpoint type for API and UI usage - * @return string of display type - */ - String endpointType(); -} \ No newline at end of file diff --git a/abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointValidator.java b/abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointValidator.java deleted file mode 100644 index 951c4abd968..00000000000 --- a/abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointValidator.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.zstack.abstraction.sns; - -import org.zstack.abstraction.InvalidPluginDefinitionException; -import org.zstack.abstraction.PluginRegister; -import org.zstack.abstraction.PluginValidator; - -import java.util.List; -import java.util.stream.Collectors; - -public class PluginEndpointValidator implements PluginValidator { - @Override - public Class pluginClass() { - return PluginEndpointSender.class; - } - - @Override - public void validate(PluginRegister register) { - PluginEndpointSender sender = (PluginEndpointSender) register; - - if (sender.endpointType() == null) { - throw new InvalidPluginDefinitionException(); - } - } - - @Override - public void validateAllPlugins(List pluginRegisterList) { - int pluginNumber = pluginRegisterList.size(); - - int distinctPluginByEndpointTypeNumber = pluginRegisterList - .stream() - .map(plugin -> ((PluginEndpointSender) plugin).endpointType()) - .collect(Collectors.toSet()).size(); - - if (pluginNumber == distinctPluginByEndpointTypeNumber) { - return; - } - - throw new InvalidPluginDefinitionException(); - } -} diff --git a/abstraction/src/main/java/org/zstack/abstraction/storage/StorageDriver.java b/abstraction/src/main/java/org/zstack/abstraction/storage/StorageDriver.java new file mode 100644 index 00000000000..6da58597067 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/storage/StorageDriver.java @@ -0,0 +1,63 @@ +package org.zstack.abstraction.storage; + +import org.zstack.abstraction.PluginDriver; + +import java.util.Map; + +// storage sdk should support +// volume creation +// volume update +// volume deletion +// volume resize +// volume migration +// volume attach +// volume detach +// volume snapshot creation +// volume snapshot deletion +// volume snapshot update +// volume snapshot rollback +// volume snapshot backup +// volume backup creation +// volume backup deletion +// volume backup update +// volume backup restore +// volume backup sync to remote +// volume backup sync from remote to local +// ping should be supported +public interface StorageDriver extends PluginDriver { + boolean initialize(Map properties); + + boolean connect(Map properties); + + boolean ping(Map properties); + + boolean createVolume(VolumeData volume); + + boolean deleteVolume(VolumeData volume); + + boolean resizeVolume(VolumeData volume); + + boolean migrateVolume(VolumeData volume); + + boolean createVolumeSnapshot(VolumeSnapshotData volumeSnapshot); + + boolean deleteVolumeSnapshot(VolumeSnapshotData volumeSnapshot); + + boolean updateVolumeSnapshot(VolumeSnapshotData volumeSnapshot); + + boolean rollbackVolumeSnapshot(VolumeSnapshotData volumeSnapshot); + + boolean backupVolumeSnapshot(VolumeSnapshotData volumeSnapshot); + + boolean createVolumeBackup(VolumeBackupData volumeBackup); + + boolean deleteVolumeBackup(VolumeBackupData volumeBackup); + + boolean updateVolumeBackup(VolumeBackupData volumeBackup); + + boolean restoreVolumeBackup(VolumeBackupData volumeBackup); + + boolean syncVolumeBackupToRemote(VolumeBackupData volumeBackup); + + boolean syncVolumeBackupFromRemoteToLocal(VolumeBackupData volumeBackup); +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/storage/VolumeBackupData.java b/abstraction/src/main/java/org/zstack/abstraction/storage/VolumeBackupData.java new file mode 100644 index 00000000000..8b2cde9c52f --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/storage/VolumeBackupData.java @@ -0,0 +1,4 @@ +package org.zstack.abstraction.storage; + +public interface VolumeBackupData { +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/storage/VolumeData.java b/abstraction/src/main/java/org/zstack/abstraction/storage/VolumeData.java new file mode 100644 index 00000000000..4f28a719413 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/storage/VolumeData.java @@ -0,0 +1,4 @@ +package org.zstack.abstraction.storage; + +public interface VolumeData { +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/storage/VolumeSnapshotData.java b/abstraction/src/main/java/org/zstack/abstraction/storage/VolumeSnapshotData.java new file mode 100644 index 00000000000..a1e09b57c70 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/storage/VolumeSnapshotData.java @@ -0,0 +1,4 @@ +package org.zstack.abstraction.storage; + +public interface VolumeSnapshotData { +} diff --git a/conf/db/upgrade/V4.5.1__schema.sql b/conf/db/upgrade/V4.5.1__schema.sql index 6858ca58c93..cf13f63598a 100644 --- a/conf/db/upgrade/V4.5.1__schema.sql +++ b/conf/db/upgrade/V4.5.1__schema.sql @@ -1,10 +1,27 @@ +CREATE TABLE IF NOT EXISTS `zstack`.`PluginDriverVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(64) NOT NULL, + `type` varchar(64) NOT NULL, + `vendor` varchar(64) NOT NULL, + `features` varchar(1024) NOT NULL, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + CREATE TABLE IF NOT EXISTS `zstack`.`SNSPluginEndpointVO` ( `uuid` varchar(32) NOT NULL UNIQUE, - `pluginType` varchar(64) NOT NULL, - `pluginProductName` varchar(64) NOT NULL, - `pluginProductKey` varchar(64) NOT NULL, `timeoutInSeconds` int NOT NULL, `properties` varchar(1024) NOT NULL, + `pluginDriverUuid` varchar(32) NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT fkPluginEndpointVOSNSApplicationEndpointVO FOREIGN KEY (uuid) REFERENCES SNSApplicationEndpointVO (uuid) ON DELETE CASCADE, + CONSTRAINT fkPluginEndpointVOPluginDriverVO FOREIGN KEY (pluginDriverUuid) REFERENCES PluginDriverVO (uuid) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`PluginSecretResourcePoolVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `properties` varchar(1024) NOT NULL, + `pluginDriverUuid` varchar(32) NOT NULL, PRIMARY KEY (`uuid`), - CONSTRAINT fkPluginEndpointVOSNSApplicationEndpointVO FOREIGN KEY (uuid) REFERENCES SNSApplicationEndpointVO (uuid) ON DELETE CASCADE + CONSTRAINT fkPluginSecretResourcePoolVOSecretResourcePoolVO FOREIGN KEY (uuid) REFERENCES SecretResourcePoolVO (uuid) ON DELETE CASCADE, + CONSTRAINT fkPluginSecretResourcePoolVOPluginDriverVO FOREIGN KEY (pluginDriverUuid) REFERENCES PluginDriverVO (uuid) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/conf/persistence.xml b/conf/persistence.xml index 518c6dfcd7d..8cefd20ca32 100755 --- a/conf/persistence.xml +++ b/conf/persistence.xml @@ -14,6 +14,7 @@ org.zstack.core.job.JobQueueEntryVO org.zstack.core.config.GlobalConfigVO org.zstack.core.eventlog.EventLogVO + org.zstack.core.plugin.PluginDriverVO org.zstack.resourceconfig.ResourceConfigVO org.zstack.header.managementnode.ManagementNodeVO org.zstack.header.managementnode.ManagementNodeContextVO diff --git a/core/src/main/java/org/zstack/core/encrypt/EncryptDriver.java b/core/src/main/java/org/zstack/core/encrypt/EncryptDriver.java index f9a301d3edb..674121ca978 100644 --- a/core/src/main/java/org/zstack/core/encrypt/EncryptDriver.java +++ b/core/src/main/java/org/zstack/core/encrypt/EncryptDriver.java @@ -1,6 +1,7 @@ package org.zstack.core.encrypt; import org.zstack.header.errorcode.ErrorableValue; +import java.util.List; public interface EncryptDriver { String encryptError = "%s encrypt failed"; @@ -8,6 +9,11 @@ public interface EncryptDriver { EncryptDriverType getDriverType(); + default List getDriverTypes() { + return null; + } + + String encrypt(String data); String decrypt(String data); diff --git a/core/src/main/java/org/zstack/core/encrypt/EncryptFacadeImpl.java b/core/src/main/java/org/zstack/core/encrypt/EncryptFacadeImpl.java index 2766b0961a6..b9d6fd5e95f 100644 --- a/core/src/main/java/org/zstack/core/encrypt/EncryptFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/encrypt/EncryptFacadeImpl.java @@ -250,7 +250,9 @@ private void collectAllEncryptPassword() { private void initEncryptDriver() { String driverType = EncryptGlobalConfig.ENCRYPT_DRIVER.value(); for (EncryptDriver driver : pluginRegistry.getExtensionList(EncryptDriver.class)) { - if (!driverType.equals(driver.getDriverType().toString())) { + if (!driverType.equals(driver.getDriverType().toString()) + && (driver.getDriverTypes() != null + && !driver.getDriverTypes().contains(driverType))) { continue; } @@ -268,7 +270,9 @@ public void installGlobalConfigUpdateHooks() { @Override public void updateGlobalConfig(GlobalConfig oldConfig, GlobalConfig newConfig) { for (EncryptDriver driver : pluginRegistry.getExtensionList(EncryptDriver.class)) { - if (!newConfig.value().equals(driver.getDriverType().toString())) { + if (!newConfig.value().equals(driver.getDriverType().toString()) + && (driver.getDriverTypes() != null + && !driver.getDriverTypes().contains(driver.getDriverType().toString()))) { continue; } diff --git a/core/src/main/java/org/zstack/core/encrypt/EncryptResult.java b/core/src/main/java/org/zstack/core/encrypt/EncryptResult.java new file mode 100644 index 00000000000..56bb2c38dac --- /dev/null +++ b/core/src/main/java/org/zstack/core/encrypt/EncryptResult.java @@ -0,0 +1,38 @@ +package org.zstack.core.encrypt; + +import org.zstack.header.errorcode.ErrorCode; + +/** + * Created by LiangHanYu on 2021/11/14 19:16 + */ +public class EncryptResult { + T result; + ErrorCode error = null; + + public EncryptResult() { + } + + public EncryptResult(T result) { + this.result = result; + } + + public EncryptResult(ErrorCode error) { + this.error = error; + } + + public T getResult() { + return result; + } + + public void setResult(T result) { + this.result = result; + } + + public ErrorCode getError() { + return error; + } + + public void setError(ErrorCode error) { + this.error = error; + } +} \ No newline at end of file diff --git a/core/src/main/java/org/zstack/core/plugin/PluginDriverVO.java b/core/src/main/java/org/zstack/core/plugin/PluginDriverVO.java new file mode 100644 index 00000000000..c1e057d8e6e --- /dev/null +++ b/core/src/main/java/org/zstack/core/plugin/PluginDriverVO.java @@ -0,0 +1,78 @@ +package org.zstack.core.plugin; + +import org.zstack.header.vo.BaseResource; +import org.zstack.header.vo.ResourceVO; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; + +@Entity +@Table +@BaseResource +public class PluginDriverVO extends ResourceVO { + @Column + private String name; + + @Column + private String type; + + @Column + private String vendor; + + @Column + private String features; + + public PluginDriverVO() { + } + + public PluginDriverVO(PluginDriverVO other) { + this.uuid = other.uuid; + this.name = other.name; + this.vendor = other.vendor; + this.features = other.features; + this.type = other.type; + } + + @Override + public String getUuid() { + return uuid; + } + + @Override + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getVendor() { + return vendor; + } + + public void setVendor(String vendor) { + this.vendor = vendor; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getFeatures() { + return features; + } + + public void setFeatures(String features) { + this.features = features; + } +} diff --git a/core/src/main/java/org/zstack/core/plugin/PluginDriverVO_.java b/core/src/main/java/org/zstack/core/plugin/PluginDriverVO_.java new file mode 100644 index 00000000000..b96ba16376e --- /dev/null +++ b/core/src/main/java/org/zstack/core/plugin/PluginDriverVO_.java @@ -0,0 +1,12 @@ +package org.zstack.core.plugin; + +import org.zstack.header.vo.ResourceVO_; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; + +@StaticMetamodel(PluginDriverVO.class) +public class PluginDriverVO_ extends ResourceVO_ { + public static volatile SingularAttribute uuid; + public static volatile SingularAttribute name; +} diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManager.java b/core/src/main/java/org/zstack/core/plugin/PluginManager.java index bc5067715a8..739268eb62b 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginManager.java +++ b/core/src/main/java/org/zstack/core/plugin/PluginManager.java @@ -1,20 +1,26 @@ package org.zstack.core.plugin; -import org.zstack.abstraction.PluginRegister; +import org.zstack.abstraction.PluginDriver; import java.util.List; /** * PluginManager interface for plugin related operations. *

- * isCapabilitySupported used for plugin capability check. + * isFeatureSupported used for plugin capability check. * getPlugin used for get plugin singleton. *

*/ public interface PluginManager { - boolean isCapabilitySupported(String pluginProductKey, String capability); + boolean isFeatureSupported(String pluginUuid, String capability); - T getPlugin(String pluginProductKey); + T getPlugin(String pluginUuid); - List getPluginList(Class pluginClass); + List getPluginList(Class pluginClass); + + // check if a sub plugin class with a type exists + boolean isPluginTypeExist(Class pluginClass, String type); + + // get plugin class with type + T getPlugin(Class pluginClass, String type); } diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java index 77f3d52fad6..13fd7b24029 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java +++ b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java @@ -1,10 +1,10 @@ package org.zstack.core.plugin; -import org.apache.commons.codec.digest.DigestUtils; -import org.zstack.abstraction.PluginCapabilityState; -import org.zstack.abstraction.PluginRegister; +import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.abstraction.PluginDriver; import org.zstack.abstraction.PluginValidator; import org.zstack.core.Platform; +import org.zstack.core.db.DatabaseFacade; import org.zstack.header.Component; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.exception.CloudRuntimeException; @@ -12,8 +12,12 @@ import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; -import java.lang.reflect.Method; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import static org.zstack.core.Platform.operr; @@ -23,15 +27,18 @@ public class PluginManagerImpl implements PluginManager, Component { private static final CLogger logger = Utils.getLogger(PluginManagerImpl.class); - private final Set> pluginMetadata = new HashSet<>(); - private final Map pluginInstances = new HashMap<>(); - private final Map, List> - pluginRegisterMap = new HashMap<>(); - private final Map, PluginValidator> - pluginValidatorMap = new HashMap<>(); + @Autowired + private DatabaseFacade dbf; + + private final Set> pluginMetadata = new HashSet<>(); + private final Map pluginInstances = new HashMap<>(); + private final Map, List> + pluginRegisters = new HashMap<>(); + private final Map, PluginValidator> + pluginValidators = new HashMap<>(); private void collectPluginProtocolMetadata() { - Platform.getReflections().getSubTypesOf(PluginRegister.class).forEach(clz -> { + Platform.getReflections().getSubTypesOf(PluginDriver.class).forEach(clz -> { if (!clz.getCanonicalName().contains("org.zstack.abstraction") || !clz.isInterface()) { return; @@ -47,48 +54,78 @@ private void collectPluginProtocolMetadata() { } private void registerPluginAsSingleton( - Class pluginRegisterClz) { + Class pluginRegisterClz, + Class pluginDriverClz) { try { - PluginRegister pluginRegister = pluginRegisterClz + PluginDriver pluginDriver = pluginRegisterClz .getConstructor() .newInstance(); - if (pluginInstances.containsKey(pluginRegister.productKey())) { + if (pluginInstances.containsKey(pluginDriver.uuid())) { throw new CloudRuntimeException( String.format("duplicate plugin[class: %s]", pluginRegisterClz)); } - if (pluginValidatorMap.containsKey(pluginRegisterClz)) { - pluginValidatorMap.get(pluginRegisterClz).validate(pluginRegister); + if (pluginValidators.containsKey(pluginRegisterClz)) { + pluginValidators.get(pluginRegisterClz).validate(pluginDriver); } - logger.debug( - String.format("detect plugin class: %s, name: %s, version: %s," + - " capabilities: \n %s", - pluginRegisterClz.getCanonicalName(), - pluginRegister.version(), - pluginRegister.productName(), - JSONObjectUtil.toJsonString(pluginRegister.capabilities()))); - - verifyPluginProduct(pluginRegister); - pluginInstances.put(pluginRegister.productKey(), pluginRegister); - pluginRegisterMap.computeIfAbsent(pluginRegisterClz, k -> new ArrayList<>()); - pluginRegisterMap.get(pluginRegisterClz).add(pluginRegister); + // String format all String methods of plugin from pluginRegister to logger.debug + logger.debug(String.format("register plugin[class: %s, productKey: %s, version: %s," + + " capabilities: %s, description: %s, vendor: %s, url: %s," + + " license: %s]", + pluginRegisterClz, + pluginDriver.uuid(), + pluginDriver.version(), + JSONObjectUtil.toJsonString(pluginDriver.features()), + pluginDriver.description(), + pluginDriver.vendor(), + pluginDriver.url(), + pluginDriver.license())); + + verifyPluginProduct(pluginDriver); + + pluginInstances.put(pluginDriver.uuid(), pluginDriver); + pluginRegisters.computeIfAbsent(pluginDriverClz, k -> new ArrayList<>()); + pluginRegisters.get(pluginDriverClz).add(pluginDriver); + + PluginDriverVO vo = dbf.findByUuid(pluginDriver.uuid(), PluginDriverVO.class); + if (vo == null) { + vo = new PluginDriverVO(); + vo.setUuid(pluginDriver.uuid()); + vo.setName(pluginDriver.name()); + vo.setVendor(pluginDriver.vendor()); + vo.setFeatures(JSONObjectUtil.toJsonString(pluginDriver.features())); + vo.setType(pluginDriver.type()); + dbf.persist(vo); + } else { + vo.setName(pluginDriver.name()); + vo.setVendor(pluginDriver.vendor()); + vo.setFeatures(JSONObjectUtil.toJsonString(pluginDriver.features())); + vo.setType(pluginDriver.type()); + dbf.update(vo); + } } catch (Exception e) { throw new CloudRuntimeException(e); } } - private void getPluginInterfaceSingletons(Class clz) { + private void getPluginInterfaceSingletons(Class abstractPluginClz) { Platform.getReflections() - .getSubTypesOf(clz) - .forEach(this::registerPluginAsSingleton); + .getSubTypesOf(abstractPluginClz) + .forEach(pluginDriverClz -> { + if (pluginDriverClz.isInterface()) { + return; + } + + registerPluginAsSingleton(pluginDriverClz, abstractPluginClz); + }); } private void loadPluginsFromMetadata() { pluginMetadata.forEach(this::getPluginInterfaceSingletons); - pluginRegisterMap.forEach((pluginClazz, instanceList) -> { - PluginValidator validator = pluginValidatorMap.get(pluginClazz); + pluginRegisters.forEach((pluginClazz, instanceList) -> { + PluginValidator validator = pluginValidators.get(pluginClazz); if (validator == null) { return; } @@ -97,21 +134,26 @@ private void loadPluginsFromMetadata() { }); } - private void verifyPluginProduct(PluginRegister pluginRegister) { + private void verifyPluginProduct(PluginDriver pluginDriver) { if (!PluginGlobalConfig.ALLOW_UNKNOWN_PRODUCT_PLUGIN.value(Boolean.class) - && pluginRegister.productKey() == null) { + && pluginDriver.uuid() == null) { throw new OperationFailureException(operr("unknown product plugin name: %s", - pluginRegister.productName())); + pluginDriver.name())); + } + + if (pluginDriver.name() == null + || pluginDriver.uuid() == null + || pluginDriver.vendor() == null) { + throw new OperationFailureException(operr("plugin[%s] name," + + " productKey and vendor cannot be null", + pluginDriver.getClass())); } - doVerification(pluginRegister.productName(), pluginRegister.productKey()); + doVerification(pluginDriver.name(), pluginDriver.uuid()); } private void doVerification(String productName, String productKey) { - if (!DigestUtils.md5Hex(productName).equals(productKey)) { - throw new OperationFailureException(operr("failed to verify product: %s", - productName)); - } + // TODO: verify plugin driver } private void collectPluginValidators() { @@ -131,7 +173,7 @@ private void collectPluginValidators() { .getConstructor() .newInstance(); - pluginValidatorMap.put(pluginValidator.pluginClass(), pluginValidator); + pluginValidators.put(pluginValidator.pluginClass(), pluginValidator); } catch (Exception e) { throw new CloudRuntimeException(e); } @@ -152,15 +194,28 @@ public boolean stop() { } @Override - public boolean isCapabilitySupported(String pluginProductKey, + public boolean isFeatureSupported(String pluginProductKey, String capability) { + if (logger.isTraceEnabled()) { + logger.trace(String.format("check plugin[%s] capability[%s]", + pluginProductKey, capability)); + logger.trace(String.format("plugin features %s", + JSONObjectUtil.toJsonString(pluginInstances + .get(pluginProductKey) + .features()))); + logger.trace(String.format("plugin feature state: %s", + JSONObjectUtil.toJsonString(pluginInstances + .get(pluginProductKey) + .features().get(capability) == Boolean.TRUE))); + } + return pluginInstances.get(pluginProductKey) - .capabilities() - .get(capability) == PluginCapabilityState.SUPPORTED; + .features() + .get(capability) == Boolean.TRUE; } @Override - public T getPlugin(String pluginProductKey) { + public T getPlugin(String pluginProductKey) { if (!pluginInstances.containsKey(pluginProductKey)) { throw new CloudRuntimeException(String.format("Unsupported plugin %s", pluginProductKey)); @@ -170,7 +225,30 @@ public T getPlugin(String pluginProductKey) { } @Override - public List getPluginList(Class pluginClass) { - return (List) pluginRegisterMap.get(pluginClass); + public List getPluginList(Class pluginClass) { + return (List) pluginRegisters.get(pluginClass); + } + + @Override + public boolean isPluginTypeExist(Class pluginClass, String type) { + return pluginRegisters.get(pluginClass) + .stream() + .anyMatch(plugin -> plugin.type().equals(type)); + } + + @Override + public T getPlugin(Class pluginClass, String type) { + if (pluginRegisters.get(pluginClass) + .stream() + .filter(plugin -> plugin.type().equals(type)) + .count() > 1) { + throw new CloudRuntimeException(String.format("multi plugin with same type %s", type)); + } + + return (T) pluginRegisters.get(pluginClass) + .stream() + .filter(plugin -> plugin.type().equals(type)) + .findFirst() + .orElse(null); } } diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index f58408bb394..c67f98f95ad 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -135,6 +135,7 @@ public class SourceClassMap { put("org.zstack.crypto.securitymachine.thirdparty.koal.KoAlSecretResourcePoolInventory", "org.zstack.sdk.KoAlSecretResourcePoolInventory"); put("org.zstack.crypto.securitymachine.thirdparty.sansec.SanSecSecretResourcePoolInventory", "org.zstack.sdk.SanSecSecretResourcePoolInventory"); put("org.zstack.crypto.securitymachine.thirdparty.sansec.SanSecSecurityMachineInventory", "org.zstack.sdk.SanSecSecurityMachineInventory"); + put("org.zstack.crypto.securitymachine.thirdparty.plugin.PluginSecretResourcePoolInventory", "org.zstack.sdk.PluginSecretResourcePoolInventory"); put("org.zstack.directory.DirectoryInventory", "org.zstack.sdk.DirectoryInventory"); put("org.zstack.drs.api.HostLoad", "org.zstack.sdk.HostLoad"); put("org.zstack.drs.api.Threshold", "org.zstack.sdk.Threshold"); @@ -1191,6 +1192,7 @@ public class SourceClassMap { put("org.zstack.sdk.PciDeviceVirtStatus", "org.zstack.pciDevice.virtual.PciDeviceVirtStatus"); put("org.zstack.sdk.PendingTaskInfo", "org.zstack.header.core.progress.PendingTaskInfo"); put("org.zstack.sdk.PhysicalDriveSmartSelfTestHistoryInventory", "org.zstack.storage.device.localRaid.PhysicalDriveSmartSelfTestHistoryInventory"); + put("org.zstack.sdk.PluginSecretResourcePoolInventory", "org.zstack.crypto.securitymachine.thirdparty.plugin.PluginSecretResourcePoolInventory"); put("org.zstack.sdk.PolicyInventory", "org.zstack.header.identity.PolicyInventory"); put("org.zstack.sdk.PolicyRouteRuleInventory", "org.zstack.policyRoute.PolicyRouteRuleInventory"); put("org.zstack.sdk.PolicyRouteRuleProtocol", "org.zstack.policyRoute.PolicyRouteRuleProtocol"); diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAiSiNoSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAiSiNoSecretResourcePoolAction.java index 4c7a76b7c13..8d33f4ce9a1 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAiSiNoSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAiSiNoSecretResourcePoolAction.java @@ -58,7 +58,7 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; - @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateFlkSecSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateFlkSecSecretResourcePoolAction.java index bbda5175ef9..e542f454d1c 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateFlkSecSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateFlkSecSecretResourcePoolAction.java @@ -49,7 +49,7 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; - @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateHaiTaiSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateHaiTaiSecretResourcePoolAction.java index 441bd4c8829..6e71af6450b 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateHaiTaiSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateHaiTaiSecretResourcePoolAction.java @@ -43,7 +43,7 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; - @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateInfoSecSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateInfoSecSecretResourcePoolAction.java index 3d5c96a2717..2718c8cd155 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateInfoSecSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateInfoSecSecretResourcePoolAction.java @@ -37,7 +37,7 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; - @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreatePluginSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreatePluginSecretResourcePoolAction.java new file mode 100644 index 00000000000..aab6d093219 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreatePluginSecretResourcePoolAction.java @@ -0,0 +1,128 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreatePluginSecretResourcePoolAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.CreateSecretResourcePoolResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String resourcePoolType; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map properties; + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String model; + + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) + public java.lang.Integer heartbeatInterval; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.CreateSecretResourcePoolResult value = res.getResult(org.zstack.sdk.CreateSecretResourcePoolResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateSecretResourcePoolResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/secret-resource-pool/plugin"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/PluginSecretResourcePoolInventory.java b/sdk/src/main/java/org/zstack/sdk/PluginSecretResourcePoolInventory.java new file mode 100644 index 00000000000..94cce27e48c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/PluginSecretResourcePoolInventory.java @@ -0,0 +1,15 @@ +package org.zstack.sdk; + + + +public class PluginSecretResourcePoolInventory extends org.zstack.sdk.SecretResourcePoolInventory { + + public java.lang.String properties; + public void setProperties(java.lang.String properties) { + this.properties = properties; + } + public java.lang.String getProperties() { + return this.properties; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ScsiLunInventory.java b/sdk/src/main/java/org/zstack/sdk/ScsiLunInventory.java index 40ae4b72311..d0dd23c1be2 100644 --- a/sdk/src/main/java/org/zstack/sdk/ScsiLunInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ScsiLunInventory.java @@ -4,110 +4,6 @@ public class ScsiLunInventory extends org.zstack.sdk.LunInventory { - public java.lang.String name; - public void setName(java.lang.String name) { - this.name = name; - } - public java.lang.String getName() { - return this.name; - } - - public java.lang.String uuid; - public void setUuid(java.lang.String uuid) { - this.uuid = uuid; - } - public java.lang.String getUuid() { - return this.uuid; - } - - public java.lang.String wwid; - public void setWwid(java.lang.String wwid) { - this.wwid = wwid; - } - public java.lang.String getWwid() { - return this.wwid; - } - - public java.lang.String vendor; - public void setVendor(java.lang.String vendor) { - this.vendor = vendor; - } - public java.lang.String getVendor() { - return this.vendor; - } - - public java.lang.String model; - public void setModel(java.lang.String model) { - this.model = model; - } - public java.lang.String getModel() { - return this.model; - } - - public java.lang.String wwn; - public void setWwn(java.lang.String wwn) { - this.wwn = wwn; - } - public java.lang.String getWwn() { - return this.wwn; - } - - public java.lang.String serial; - public void setSerial(java.lang.String serial) { - this.serial = serial; - } - public java.lang.String getSerial() { - return this.serial; - } - - public java.lang.String type; - public void setType(java.lang.String type) { - this.type = type; - } - public java.lang.String getType() { - return this.type; - } - - public java.lang.String hctl; - public void setHctl(java.lang.String hctl) { - this.hctl = hctl; - } - public java.lang.String getHctl() { - return this.hctl; - } - - public java.lang.String path; - public void setPath(java.lang.String path) { - this.path = path; - } - public java.lang.String getPath() { - return this.path; - } - - public java.lang.String state; - public void setState(java.lang.String state) { - this.state = state; - } - public java.lang.String getState() { - return this.state; - } - - public java.lang.Long size; - public void setSize(java.lang.Long size) { - this.size = size; - } - public java.lang.Long getSize() { - return this.size; - } - - public java.lang.String multipathDeviceUuid; - public void setMultipathDeviceUuid(java.lang.String multipathDeviceUuid) { - this.multipathDeviceUuid = multipathDeviceUuid; - } - public java.lang.String getMultipathDeviceUuid() { - return this.multipathDeviceUuid; - } - public java.util.List scsiLunHostRefs; public void setScsiLunHostRefs(java.util.List scsiLunHostRefs) { this.scsiLunHostRefs = scsiLunHostRefs; diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointAction.java index 686f0ea490a..88c0b681aff 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointAction.java @@ -26,7 +26,7 @@ public Result throwExceptionIfError() { } @Param(required = true, maxLength = 64, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String endpointType; + public java.lang.String type; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public long timeoutInSeconds = 0L; diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/SNSPluginEndpointInventory.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/SNSPluginEndpointInventory.java index 162e6515eaf..616bed5804e 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/SNSPluginEndpointInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/SNSPluginEndpointInventory.java @@ -4,12 +4,12 @@ public class SNSPluginEndpointInventory extends org.zstack.sdk.sns.SNSApplicationEndpointInventory { - public java.lang.String endpointType; - public void setEndpointType(java.lang.String endpointType) { - this.endpointType = endpointType; + public java.lang.String pluginDriverUuid; + public void setPluginDriverUuid(java.lang.String pluginDriverUuid) { + this.pluginDriverUuid = pluginDriverUuid; } - public java.lang.String getEndpointType() { - return this.endpointType; + public java.lang.String getPluginDriverUuid() { + return this.pluginDriverUuid; } public long timeoutInSeconds; diff --git a/test/src/test/resources/log4j2.xml b/test/src/test/resources/log4j2.xml index 6668adfdb94..93fa1ab6301 100755 --- a/test/src/test/resources/log4j2.xml +++ b/test/src/test/resources/log4j2.xml @@ -120,7 +120,9 @@ - + + + diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 3bb1fa4e6e6..964e9c8c424 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -9986,6 +9986,60 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def createPluginSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePluginSecretResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.CreatePluginSecretResourcePoolAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def createPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePolicyAction.class) Closure c) { + def a = new org.zstack.sdk.CreatePolicyAction() +>>>>>>> 3d33102458 ([encrypt]: crypto plugin support) + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() if (System.getProperty("apipath") != null) { @@ -22163,32 +22217,6 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - - - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } - - - def getSupportAPIs(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetSupportAPIsAction.class) Closure c) { - def a = new org.zstack.sdk.GetSupportAPIsAction() - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() if (System.getProperty("apipath") != null) { @@ -37544,6 +37572,60 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def syncImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncImageAction.class) Closure c) { + def a = new org.zstack.sdk.SyncImageAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def syncImageFromImageStoreBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncImageFromImageStoreBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.SyncImageFromImageStoreBackupStorageAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() if (System.getProperty("apipath") != null) { @@ -45860,6 +45942,35 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def updateIAM2VirtualID(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.UpdateIAM2VirtualIDAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.UpdateIAM2VirtualIDAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() if (System.getProperty("apipath") != null) { @@ -46001,7 +46112,7 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() @@ -47241,6 +47352,89 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def createSNSPluginEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.sns.platform.plugin.CreateSNSPluginEndpointAction.class) Closure c) { + def a = new org.zstack.sdk.sns.platform.plugin.CreateSNSPluginEndpointAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def querySNSPluginEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.sns.platform.plugin.QuerySNSPluginEndpointAction.class) Closure c) { + def a = new org.zstack.sdk.sns.platform.plugin.QuerySNSPluginEndpointAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def addTicketTypesToTicketFlowCollection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ticket.api.AddTicketTypesToTicketFlowCollectionAction.class) Closure c) { + def a = new org.zstack.sdk.ticket.api.AddTicketTypesToTicketFlowCollectionAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() if (System.getProperty("apipath") != null) { @@ -54485,29 +54679,4 @@ abstract class ApiHelper { } - def syncImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncImageAction.class) Closure c) { - def a = new org.zstack.sdk.SyncImageAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() - - - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } } From 868342f5be92200b478405dc288e53b3ab3b796f Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 10 Apr 2024 11:55:20 +0800 Subject: [PATCH 303/737] [abstraction]: bump version to 5.3.0 Resolves: ZSTAC-71363 Change-Id: I6c68736f617a75626277646b6e766c6779627965 --- abstraction/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/abstraction/pom.xml b/abstraction/pom.xml index aef3bd97024..e96183b0d4f 100644 --- a/abstraction/pom.xml +++ b/abstraction/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 4.7.0 + 5.3.0 .. 4.0.0 From 40c200f06c5e7ad997b389e83ad8de5e7c2b5f6d Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 10 Apr 2024 15:50:12 +0800 Subject: [PATCH 304/737] [abstraction]: delete storage resource abstraction Resolves: ZSTAC-71363 Change-Id: I7378766f77696271626e6a666168637672707975 --- .../abstraction/storage/StorageDriver.java | 63 ------------------- .../abstraction/storage/VolumeBackupData.java | 4 -- .../abstraction/storage/VolumeData.java | 4 -- .../storage/VolumeSnapshotData.java | 4 -- 4 files changed, 75 deletions(-) delete mode 100644 abstraction/src/main/java/org/zstack/abstraction/storage/StorageDriver.java delete mode 100644 abstraction/src/main/java/org/zstack/abstraction/storage/VolumeBackupData.java delete mode 100644 abstraction/src/main/java/org/zstack/abstraction/storage/VolumeData.java delete mode 100644 abstraction/src/main/java/org/zstack/abstraction/storage/VolumeSnapshotData.java diff --git a/abstraction/src/main/java/org/zstack/abstraction/storage/StorageDriver.java b/abstraction/src/main/java/org/zstack/abstraction/storage/StorageDriver.java deleted file mode 100644 index 6da58597067..00000000000 --- a/abstraction/src/main/java/org/zstack/abstraction/storage/StorageDriver.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.zstack.abstraction.storage; - -import org.zstack.abstraction.PluginDriver; - -import java.util.Map; - -// storage sdk should support -// volume creation -// volume update -// volume deletion -// volume resize -// volume migration -// volume attach -// volume detach -// volume snapshot creation -// volume snapshot deletion -// volume snapshot update -// volume snapshot rollback -// volume snapshot backup -// volume backup creation -// volume backup deletion -// volume backup update -// volume backup restore -// volume backup sync to remote -// volume backup sync from remote to local -// ping should be supported -public interface StorageDriver extends PluginDriver { - boolean initialize(Map properties); - - boolean connect(Map properties); - - boolean ping(Map properties); - - boolean createVolume(VolumeData volume); - - boolean deleteVolume(VolumeData volume); - - boolean resizeVolume(VolumeData volume); - - boolean migrateVolume(VolumeData volume); - - boolean createVolumeSnapshot(VolumeSnapshotData volumeSnapshot); - - boolean deleteVolumeSnapshot(VolumeSnapshotData volumeSnapshot); - - boolean updateVolumeSnapshot(VolumeSnapshotData volumeSnapshot); - - boolean rollbackVolumeSnapshot(VolumeSnapshotData volumeSnapshot); - - boolean backupVolumeSnapshot(VolumeSnapshotData volumeSnapshot); - - boolean createVolumeBackup(VolumeBackupData volumeBackup); - - boolean deleteVolumeBackup(VolumeBackupData volumeBackup); - - boolean updateVolumeBackup(VolumeBackupData volumeBackup); - - boolean restoreVolumeBackup(VolumeBackupData volumeBackup); - - boolean syncVolumeBackupToRemote(VolumeBackupData volumeBackup); - - boolean syncVolumeBackupFromRemoteToLocal(VolumeBackupData volumeBackup); -} diff --git a/abstraction/src/main/java/org/zstack/abstraction/storage/VolumeBackupData.java b/abstraction/src/main/java/org/zstack/abstraction/storage/VolumeBackupData.java deleted file mode 100644 index 8b2cde9c52f..00000000000 --- a/abstraction/src/main/java/org/zstack/abstraction/storage/VolumeBackupData.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.zstack.abstraction.storage; - -public interface VolumeBackupData { -} diff --git a/abstraction/src/main/java/org/zstack/abstraction/storage/VolumeData.java b/abstraction/src/main/java/org/zstack/abstraction/storage/VolumeData.java deleted file mode 100644 index 4f28a719413..00000000000 --- a/abstraction/src/main/java/org/zstack/abstraction/storage/VolumeData.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.zstack.abstraction.storage; - -public interface VolumeData { -} diff --git a/abstraction/src/main/java/org/zstack/abstraction/storage/VolumeSnapshotData.java b/abstraction/src/main/java/org/zstack/abstraction/storage/VolumeSnapshotData.java deleted file mode 100644 index a1e09b57c70..00000000000 --- a/abstraction/src/main/java/org/zstack/abstraction/storage/VolumeSnapshotData.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.zstack.abstraction.storage; - -public interface VolumeSnapshotData { -} From 5368fac9d463b01c20d879b30e4d7f0fe0b28608 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 11 Apr 2024 10:25:33 +0800 Subject: [PATCH 305/737] [core]: introduce plugin drivers apis DBImpact APIImpact Resolves: ZSTAC-71363 Change-Id: I727a6e706362666979627775617a796d71687064 --- .../org/zstack/core/plugin/PluginManager.java | 2 + .../zstack/core/plugin/PluginManagerImpl.java | 19 +++++- .../plugin/APIQueryPluginDriversMsg.java | 22 +++++++ .../plugin/APIQueryPluginDriversReply.java | 27 ++++++++ .../plugin/APIRefreshPluginDriversMsg.java | 32 ++++++++++ .../plugin/APIRefreshPluginDrviersEvent.java | 17 +++++ .../plugin/PluginDriverInventory.java | 64 +++++++++++++++++++ .../core/external}/plugin/PluginDriverVO.java | 2 +- .../external}/plugin/PluginDriverVO_.java | 2 +- .../header/core/external/plugin/RBACInfo.java | 34 ++++++++++ 10 files changed, 217 insertions(+), 4 deletions(-) create mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversMsg.java create mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversReply.java create mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsg.java create mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDrviersEvent.java create mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventory.java rename {core/src/main/java/org/zstack/core => header/src/main/java/org/zstack/header/core/external}/plugin/PluginDriverVO.java (96%) rename {core/src/main/java/org/zstack/core => header/src/main/java/org/zstack/header/core/external}/plugin/PluginDriverVO_.java (89%) create mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/RBACInfo.java diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManager.java b/core/src/main/java/org/zstack/core/plugin/PluginManager.java index 739268eb62b..4e1b78c33d2 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginManager.java +++ b/core/src/main/java/org/zstack/core/plugin/PluginManager.java @@ -12,6 +12,8 @@ *

*/ public interface PluginManager { + String SERVICE_ID = "external.plugin"; + boolean isFeatureSupported(String pluginUuid, String capability); T getPlugin(String pluginUuid); diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java index 13fd7b24029..fe80a5e2a75 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java +++ b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java @@ -4,10 +4,13 @@ import org.zstack.abstraction.PluginDriver; import org.zstack.abstraction.PluginValidator; import org.zstack.core.Platform; +import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.db.DatabaseFacade; -import org.zstack.header.Component; +import org.zstack.header.AbstractService; +import org.zstack.header.core.external.plugin.PluginDriverVO; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.exception.CloudRuntimeException; +import org.zstack.header.message.Message; import org.zstack.utils.Utils; import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; @@ -24,11 +27,13 @@ /** * PluginManagerImpl implementation of PluginManager. */ -public class PluginManagerImpl implements PluginManager, Component { +public class PluginManagerImpl extends AbstractService implements PluginManager { private static final CLogger logger = Utils.getLogger(PluginManagerImpl.class); @Autowired private DatabaseFacade dbf; + @Autowired + private CloudBus bus; private final Set> pluginMetadata = new HashSet<>(); private final Map pluginInstances = new HashMap<>(); @@ -251,4 +256,14 @@ public T getPlugin(Class plugin .findFirst() .orElse(null); } + + @Override + public void handleMessage(Message msg) { + + } + + @Override + public String getId() { + return bus.makeLocalServiceId(SERVICE_ID); + } } diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversMsg.java b/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversMsg.java new file mode 100644 index 00000000000..11754d4fa3a --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversMsg.java @@ -0,0 +1,22 @@ +package org.zstack.header.core.external.plugin; + +import org.springframework.http.HttpMethod; +import org.zstack.header.query.APIQueryMessage; +import org.zstack.header.query.AutoQuery; +import org.zstack.header.rest.RestRequest; + +import java.util.List; + +import static java.util.Arrays.asList; + +@AutoQuery(replyClass = APIQueryPluginDriversReply.class, inventoryClass = PluginDriverInventory.class) +@RestRequest( + path = "/external/plugins", + method = HttpMethod.GET, + responseClass = APIQueryPluginDriversReply.class +) +public class APIQueryPluginDriversMsg extends APIQueryMessage { + public static List __example__() { + return asList("name=test"); + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversReply.java b/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversReply.java new file mode 100644 index 00000000000..2510cec6906 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversReply.java @@ -0,0 +1,27 @@ +package org.zstack.header.core.external.plugin; + +import org.zstack.header.message.APIReply; +import org.zstack.header.rest.RestResponse; + +import java.util.Collections; +import java.util.List; + +@RestResponse(allTo = "inventories") +public class APIQueryPluginDriversReply extends APIReply { + private List inventories; + + public List getInventories() { + return inventories; + } + + public void setInventories(List inventories) { + this.inventories = inventories; + } + + public static APIQueryPluginDriversReply __example__() { + APIQueryPluginDriversReply reply = new APIQueryPluginDriversReply(); + PluginDriverInventory inv = new PluginDriverInventory(); + reply.setInventories(Collections.singletonList(inv)); + return reply; + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsg.java b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsg.java new file mode 100644 index 00000000000..58af686cba7 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsg.java @@ -0,0 +1,32 @@ +package org.zstack.header.core.external.plugin; + +import org.springframework.http.HttpMethod; +import org.zstack.header.core.external.service.APIReloadExternalServiceMsg; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; + +@RestRequest( + path = "/external/plugins", + isAction = true, + responseClass = APIRefreshPluginDrviersEvent.class, + method = HttpMethod.PUT +) +public class APIRefreshPluginDriversMsg extends APIMessage { + @APIParam + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public static APIReloadExternalServiceMsg __example__() { + APIReloadExternalServiceMsg msg = new APIReloadExternalServiceMsg(); + msg.setName("prometheus"); + return msg; + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDrviersEvent.java b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDrviersEvent.java new file mode 100644 index 00000000000..2c490947229 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDrviersEvent.java @@ -0,0 +1,17 @@ +package org.zstack.header.core.external.plugin; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +@RestResponse +public class APIRefreshPluginDrviersEvent extends APIEvent { + public APIRefreshPluginDrviersEvent() { } + + public APIRefreshPluginDrviersEvent(String apiId) { + super(apiId); + } + + public static APIRefreshPluginDrviersEvent __example__() { + return new APIRefreshPluginDrviersEvent(); + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventory.java b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventory.java new file mode 100644 index 00000000000..4f04d5a6453 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventory.java @@ -0,0 +1,64 @@ +package org.zstack.header.core.external.plugin; + +import org.zstack.header.search.Inventory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@Inventory(mappingVOClass = PluginDriverVO.class) +public class PluginDriverInventory { + private String name; + private String type; + private String vendor; + private String features; + + public static PluginDriverInventory valueOf(PluginDriverVO vo) { + PluginDriverInventory inv = new PluginDriverInventory(); + inv.setName(vo.getName()); + inv.setVendor(vo.getVendor()); + inv.setFeatures(vo.getFeatures()); + inv.setType(vo.getType()); + return inv; + } + + public static List valueOf(Collection vos) { + List invs = new ArrayList<>(); + for (PluginDriverVO vo : vos) { + invs.add(valueOf(vo)); + } + return invs; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getVendor() { + return vendor; + } + + public void setVendor(String vendor) { + this.vendor = vendor; + } + + public String getFeatures() { + return features; + } + + public void setFeatures(String features) { + this.features = features; + } +} diff --git a/core/src/main/java/org/zstack/core/plugin/PluginDriverVO.java b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO.java similarity index 96% rename from core/src/main/java/org/zstack/core/plugin/PluginDriverVO.java rename to header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO.java index c1e057d8e6e..fae29f290c8 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginDriverVO.java +++ b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO.java @@ -1,4 +1,4 @@ -package org.zstack.core.plugin; +package org.zstack.header.core.external.plugin; import org.zstack.header.vo.BaseResource; import org.zstack.header.vo.ResourceVO; diff --git a/core/src/main/java/org/zstack/core/plugin/PluginDriverVO_.java b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO_.java similarity index 89% rename from core/src/main/java/org/zstack/core/plugin/PluginDriverVO_.java rename to header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO_.java index b96ba16376e..53ed3139756 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginDriverVO_.java +++ b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO_.java @@ -1,4 +1,4 @@ -package org.zstack.core.plugin; +package org.zstack.header.core.external.plugin; import org.zstack.header.vo.ResourceVO_; diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/RBACInfo.java b/header/src/main/java/org/zstack/header/core/external/plugin/RBACInfo.java new file mode 100644 index 00000000000..eb5bc7f24a6 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/RBACInfo.java @@ -0,0 +1,34 @@ +package org.zstack.header.core.external.plugin; + +import org.zstack.header.identity.rbac.RBACDescription; + +public class RBACInfo implements RBACDescription { + + @Override + public void permissions() { + permissionBuilder() + .name("external-plugin") + .adminOnlyAPIs( + APIQueryPluginDriversMsg.class, + APIRefreshPluginDriversMsg.class + ).build(); + } + + @Override + public void contributeToRoles() { + roleContributorBuilder() + .roleName("other") + .actionsByPermissionName("external-plugin") + .build(); + } + + @Override + public void roles() { + + } + + @Override + public void globalReadableResources() { + + } +} From 22bf9386d17a2fbba274686230287172a0078dba Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 11 Apr 2024 10:30:24 +0800 Subject: [PATCH 306/737] [plugin]: implements handling of APIRefreshPluginDriversMsg Resolves: ZSTAC-71363 Change-Id: I78767270676271727364766b646d726375626973 --- .../org/zstack/core/plugin/PluginManagerImpl.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java index fe80a5e2a75..3a96a815b51 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java +++ b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java @@ -7,6 +7,8 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.db.DatabaseFacade; import org.zstack.header.AbstractService; +import org.zstack.header.core.external.plugin.APIRefreshPluginDriversMsg; +import org.zstack.header.core.external.plugin.APIRefreshPluginDrviersEvent; import org.zstack.header.core.external.plugin.PluginDriverVO; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.exception.CloudRuntimeException; @@ -259,7 +261,17 @@ public T getPlugin(Class plugin @Override public void handleMessage(Message msg) { + if (msg instanceof APIRefreshPluginDriversMsg) { + handle((APIRefreshPluginDriversMsg) msg); + } + } + private void handle(APIRefreshPluginDriversMsg msg) { + APIRefreshPluginDrviersEvent event = new APIRefreshPluginDrviersEvent(msg.getId()); + collectPluginProtocolMetadata(); + collectPluginValidators(); + loadPluginsFromMetadata(); + bus.publish(event); } @Override From c3f739e74a0041f1ff7c530be37270e82a57d020 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 11 Apr 2024 10:37:28 +0800 Subject: [PATCH 307/737] [plugin]: introduce external.plugin api service Resolves: ZSTAC-71363 Change-Id: I797663756e706e6274636d7875687a6975787569 --- conf/serviceConfig/plugin.xml | 12 ++++++++++++ conf/springConfigXml/plugin.xml | 1 + 2 files changed, 13 insertions(+) create mode 100644 conf/serviceConfig/plugin.xml diff --git a/conf/serviceConfig/plugin.xml b/conf/serviceConfig/plugin.xml new file mode 100644 index 00000000000..e6be185d06f --- /dev/null +++ b/conf/serviceConfig/plugin.xml @@ -0,0 +1,12 @@ + + + external.plugin + + org.zstack.header.core.external.plugin.APIQueryPluginDriversMsg + query + + + + org.zstack.header.core.external.plugin.APIRefreshPluginDriversMsg + + \ No newline at end of file diff --git a/conf/springConfigXml/plugin.xml b/conf/springConfigXml/plugin.xml index 1f87cdd38f8..dd04d349e81 100644 --- a/conf/springConfigXml/plugin.xml +++ b/conf/springConfigXml/plugin.xml @@ -12,6 +12,7 @@ + From 98c97cc32ff2999edfe626875c8a6002d0e4db17 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 11 Apr 2024 11:08:41 +0800 Subject: [PATCH 308/737] [testlib]: update api helper Resolves: ZSTAC-71363 Change-Id: I6f6162637a6672667762736d696f7575706c746a --- .../java/org/zstack/testlib/ApiHelper.groovy | 386 ++++-------------- 1 file changed, 83 insertions(+), 303 deletions(-) diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 964e9c8c424..e9b2dfad149 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -9986,60 +9986,6 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - - - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } - - def createPluginSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePluginSecretResourcePoolAction.class) Closure c) { - def a = new org.zstack.sdk.CreatePluginSecretResourcePoolAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() - - - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } - - - def createPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePolicyAction.class) Closure c) { - def a = new org.zstack.sdk.CreatePolicyAction() ->>>>>>> 3d33102458 ([encrypt]: crypto plugin support) - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() if (System.getProperty("apipath") != null) { @@ -10439,6 +10385,33 @@ abstract class ApiHelper { } + def createPluginSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePluginSecretResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.CreatePluginSecretResourcePoolAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def createPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePolicyAction.class) Closure c) { def a = new org.zstack.sdk.CreatePolicyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -37572,60 +37545,6 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - - - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } - - - def syncImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncImageAction.class) Closure c) { - def a = new org.zstack.sdk.SyncImageAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() - - - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } - - - def syncImageFromImageStoreBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncImageFromImageStoreBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.SyncImageFromImageStoreBackupStorageAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() if (System.getProperty("apipath") != null) { @@ -45942,35 +45861,6 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - - a.conditions = a.conditions.collect { it.toString() } - - - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } - - - def updateIAM2VirtualID(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.UpdateIAM2VirtualIDAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.UpdateIAM2VirtualIDAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() if (System.getProperty("apipath") != null) { @@ -46079,89 +45969,6 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - - - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } - - - def createSNSPluginEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.sns.platform.plugin.CreateSNSPluginEndpointAction.class) Closure c) { - def a = new org.zstack.sdk.sns.platform.plugin.CreateSNSPluginEndpointAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() - - - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } - - - def querySNSPluginEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.sns.platform.plugin.QuerySNSPluginEndpointAction.class) Closure c) { - def a = new org.zstack.sdk.sns.platform.plugin.QuerySNSPluginEndpointAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() - - a.conditions = a.conditions.collect { it.toString() } - - - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } - - - def addTicketTypesToTicketFlowCollection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ticket.api.AddTicketTypesToTicketFlowCollectionAction.class) Closure c) { - def a = new org.zstack.sdk.ticket.api.AddTicketTypesToTicketFlowCollectionAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() if (System.getProperty("apipath") != null) { @@ -47352,89 +47159,6 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - - - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } - - - def createSNSPluginEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.sns.platform.plugin.CreateSNSPluginEndpointAction.class) Closure c) { - def a = new org.zstack.sdk.sns.platform.plugin.CreateSNSPluginEndpointAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() - - - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } - - - def querySNSPluginEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.sns.platform.plugin.QuerySNSPluginEndpointAction.class) Closure c) { - def a = new org.zstack.sdk.sns.platform.plugin.QuerySNSPluginEndpointAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() - - a.conditions = a.conditions.collect { it.toString() } - - - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } - - - def addTicketTypesToTicketFlowCollection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ticket.api.AddTicketTypesToTicketFlowCollectionAction.class) Closure c) { - def a = new org.zstack.sdk.ticket.api.AddTicketTypesToTicketFlowCollectionAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() if (System.getProperty("apipath") != null) { @@ -51155,6 +50879,62 @@ abstract class ApiHelper { } + def createSNSPluginEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.sns.platform.plugin.CreateSNSPluginEndpointAction.class) Closure c) { + def a = new org.zstack.sdk.sns.platform.plugin.CreateSNSPluginEndpointAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def querySNSPluginEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.sns.platform.plugin.QuerySNSPluginEndpointAction.class) Closure c) { + def a = new org.zstack.sdk.sns.platform.plugin.QuerySNSPluginEndpointAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def createSNSSnmpEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.sns.platform.snmp.CreateSNSSnmpEndpointAction.class) Closure c) { def a = new org.zstack.sdk.sns.platform.snmp.CreateSNSSnmpEndpointAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 2d0128b6b4b9c77dac616559d694a8354dc59864 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 16 Dec 2024 10:48:26 +0800 Subject: [PATCH 309/737] [sdk]: update sdk Resolves: ZSTAC-71363 Change-Id: I766b666c727061726163787464706b6c646f6f69 --- sdk/src/main/java/SourceClassMap.java | 6 +- .../CreateJitSecretResourcePoolAction.java | 2 +- .../org/zstack/sdk/PluginDriverInventory.java | 39 ++++++ .../zstack/sdk/QueryPluginDriversAction.java | 75 ++++++++++++ .../zstack/sdk/QueryPluginDriversResult.java | 14 +++ .../sdk/RefreshPluginDriversAction.java | 101 ++++++++++++++++ .../sdk/RefreshPluginDrviersResult.java | 7 ++ .../java/org/zstack/testlib/ApiHelper.groovy | 111 ++++++++++++++++++ 8 files changed, 352 insertions(+), 3 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/PluginDriverInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryPluginDriversAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryPluginDriversResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/RefreshPluginDrviersResult.java diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index c67f98f95ad..743eaba2e29 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -219,6 +219,7 @@ public class SourceClassMap { put("org.zstack.header.configuration.InstanceOfferingInventory", "org.zstack.sdk.InstanceOfferingInventory"); put("org.zstack.header.console.ConsoleInventory", "org.zstack.sdk.ConsoleInventory"); put("org.zstack.header.console.ConsoleProxyAgentInventory", "org.zstack.sdk.ConsoleProxyAgentInventory"); + put("org.zstack.header.core.external.plugin.PluginDriverInventory", "org.zstack.sdk.PluginDriverInventory"); put("org.zstack.header.core.external.service.ExternalServiceCapabilities", "org.zstack.sdk.ExternalServiceCapabilities"); put("org.zstack.header.core.external.service.ExternalServiceInventory", "org.zstack.sdk.ExternalServiceInventory"); put("org.zstack.header.core.progress.ChainInfo", "org.zstack.sdk.ChainInfo"); @@ -612,12 +613,12 @@ public class SourceClassMap { put("org.zstack.sns.platform.feishu.SNSFeiShuEndpointInventory", "org.zstack.sdk.sns.platform.feishu.SNSFeiShuEndpointInventory"); put("org.zstack.sns.platform.http.SNSHttpEndpointInventory", "org.zstack.sdk.sns.platform.http.SNSHttpEndpointInventory"); put("org.zstack.sns.platform.microsoftteams.SNSMicrosoftTeamsEndpointInventory", "org.zstack.sdk.sns.platform.microsoftteams.SNSMicrosoftTeamsEndpointInventory"); + put("org.zstack.sns.platform.plugin.SNSPluginEndpointInventory", "org.zstack.sdk.sns.platform.plugin.SNSPluginEndpointInventory"); put("org.zstack.sns.platform.snmp.SNSSnmpPlatformInventory", "org.zstack.sdk.sns.platform.snmp.SNSSnmpPlatformInventory"); put("org.zstack.sns.platform.universalsms.SNSUniversalSmsEndpointInventory", "org.zstack.sdk.sns.platform.universalsms.SNSUniversalSmsEndpointInventory"); put("org.zstack.sns.platform.universalsms.supplier.emay.SNSEmaySmsEndpointInventory", "org.zstack.sdk.sns.platform.universalsms.supplier.emay.SNSEmaySmsEndpointInventory"); put("org.zstack.sns.platform.wecom.SNSWeComAtPersonInventory", "org.zstack.sdk.sns.platform.wecom.SNSWeComAtPersonInventory"); put("org.zstack.sns.platform.wecom.SNSWeComEndpointInventory", "org.zstack.sdk.sns.platform.wecom.SNSWeComEndpointInventory"); - put("org.zstack.sns.platform.plugin.SNSPluginEndpointInventory", "org.zstack.sdk.sns.platform.plugin.SNSPluginEndpointInventory"); put("org.zstack.sso.header.CasClientInventory", "org.zstack.sdk.CasClientInventory"); put("org.zstack.sso.header.CasState", "org.zstack.sdk.CasState"); put("org.zstack.sso.header.OAuth2ClientInventory", "org.zstack.sdk.OAuth2ClientInventory"); @@ -1192,6 +1193,7 @@ public class SourceClassMap { put("org.zstack.sdk.PciDeviceVirtStatus", "org.zstack.pciDevice.virtual.PciDeviceVirtStatus"); put("org.zstack.sdk.PendingTaskInfo", "org.zstack.header.core.progress.PendingTaskInfo"); put("org.zstack.sdk.PhysicalDriveSmartSelfTestHistoryInventory", "org.zstack.storage.device.localRaid.PhysicalDriveSmartSelfTestHistoryInventory"); + put("org.zstack.sdk.PluginDriverInventory", "org.zstack.header.core.external.plugin.PluginDriverInventory"); put("org.zstack.sdk.PluginSecretResourcePoolInventory", "org.zstack.crypto.securitymachine.thirdparty.plugin.PluginSecretResourcePoolInventory"); put("org.zstack.sdk.PolicyInventory", "org.zstack.header.identity.PolicyInventory"); put("org.zstack.sdk.PolicyRouteRuleInventory", "org.zstack.policyRoute.PolicyRouteRuleInventory"); @@ -1507,12 +1509,12 @@ public class SourceClassMap { put("org.zstack.sdk.sns.platform.feishu.SNSFeiShuEndpointInventory", "org.zstack.sns.platform.feishu.SNSFeiShuEndpointInventory"); put("org.zstack.sdk.sns.platform.http.SNSHttpEndpointInventory", "org.zstack.sns.platform.http.SNSHttpEndpointInventory"); put("org.zstack.sdk.sns.platform.microsoftteams.SNSMicrosoftTeamsEndpointInventory", "org.zstack.sns.platform.microsoftteams.SNSMicrosoftTeamsEndpointInventory"); + put("org.zstack.sdk.sns.platform.plugin.SNSPluginEndpointInventory", "org.zstack.sns.platform.plugin.SNSPluginEndpointInventory"); put("org.zstack.sdk.sns.platform.snmp.SNSSnmpPlatformInventory", "org.zstack.sns.platform.snmp.SNSSnmpPlatformInventory"); put("org.zstack.sdk.sns.platform.universalsms.SNSUniversalSmsEndpointInventory", "org.zstack.sns.platform.universalsms.SNSUniversalSmsEndpointInventory"); put("org.zstack.sdk.sns.platform.universalsms.supplier.emay.SNSEmaySmsEndpointInventory", "org.zstack.sns.platform.universalsms.supplier.emay.SNSEmaySmsEndpointInventory"); put("org.zstack.sdk.sns.platform.wecom.SNSWeComAtPersonInventory", "org.zstack.sns.platform.wecom.SNSWeComAtPersonInventory"); put("org.zstack.sdk.sns.platform.wecom.SNSWeComEndpointInventory", "org.zstack.sns.platform.wecom.SNSWeComEndpointInventory"); - put("org.zstack.sdk.sns.platform.plugin.SNSPluginEndpointInventory", "org.zstack.sns.platform.plugin.SNSPluginEndpointInventory"); put("org.zstack.sdk.ticket.entity.ArchiveTicketInventory", "org.zstack.ticket.entity.ArchiveTicketInventory"); put("org.zstack.sdk.ticket.entity.ArchiveTicketStatusHistoryInventory", "org.zstack.ticket.entity.ArchiveTicketStatusHistoryInventory"); put("org.zstack.sdk.ticket.entity.TicketFlowCollectionInventory", "org.zstack.ticket.entity.TicketFlowCollectionInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/CreateJitSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateJitSecretResourcePoolAction.java index 3a1c1c5e01c..efc9bc29f46 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateJitSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateJitSecretResourcePoolAction.java @@ -34,7 +34,7 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; - @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/PluginDriverInventory.java b/sdk/src/main/java/org/zstack/sdk/PluginDriverInventory.java new file mode 100644 index 00000000000..9edd20fa33e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/PluginDriverInventory.java @@ -0,0 +1,39 @@ +package org.zstack.sdk; + + + +public class PluginDriverInventory { + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.lang.String vendor; + public void setVendor(java.lang.String vendor) { + this.vendor = vendor; + } + public java.lang.String getVendor() { + return this.vendor; + } + + public java.lang.String features; + public void setFeatures(java.lang.String features) { + this.features = features; + } + public java.lang.String getFeatures() { + return this.features; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPluginDriversAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPluginDriversAction.java new file mode 100644 index 00000000000..6625e97f9e7 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryPluginDriversAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryPluginDriversAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryPluginDriversResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryPluginDriversResult value = res.getResult(org.zstack.sdk.QueryPluginDriversResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryPluginDriversResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/external/plugins"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPluginDriversResult.java b/sdk/src/main/java/org/zstack/sdk/QueryPluginDriversResult.java new file mode 100644 index 00000000000..fa85ecc86ca --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryPluginDriversResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class QueryPluginDriversResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversAction.java b/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversAction.java new file mode 100644 index 00000000000..9eaf00ee92a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class RefreshPluginDriversAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.RefreshPluginDrviersResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.RefreshPluginDrviersResult value = res.getResult(org.zstack.sdk.RefreshPluginDrviersResult.class); + ret.value = value == null ? new org.zstack.sdk.RefreshPluginDrviersResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/external/plugins"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "refreshPluginDrivers"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshPluginDrviersResult.java b/sdk/src/main/java/org/zstack/sdk/RefreshPluginDrviersResult.java new file mode 100644 index 00000000000..7861cd8716c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/RefreshPluginDrviersResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class RefreshPluginDrviersResult { + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index e9b2dfad149..8df808d9402 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -30794,6 +30794,63 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryPluginDrivers(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPluginDriversAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPluginDriversAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def queryPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPolicyAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() a.conditions = a.conditions.collect { it.toString() } @@ -34708,6 +34765,60 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def refreshPluginDrivers(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshPluginDriversAction.class) Closure c) { + def a = new org.zstack.sdk.RefreshPluginDriversAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def refreshSearchIndexes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshSearchIndexesAction.class) Closure c) { + def a = new org.zstack.sdk.RefreshSearchIndexesAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() a.conditions = a.conditions.collect { it.toString() } From ed35f8ebb24a798e8a856be0857c9557af9f9add Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 11 Apr 2024 11:59:35 +0800 Subject: [PATCH 310/737] [core]: fix plugin query api Resolves: ZSTAC-71363 Change-Id: I6e697a6167636d6c627578757562716a66707a73 --- .../core/external/plugin/APIQueryPluginDriversReply.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversReply.java b/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversReply.java index 2510cec6906..043abb2e16a 100644 --- a/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversReply.java +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversReply.java @@ -1,13 +1,13 @@ package org.zstack.header.core.external.plugin; -import org.zstack.header.message.APIReply; +import org.zstack.header.query.APIQueryReply; import org.zstack.header.rest.RestResponse; import java.util.Collections; import java.util.List; @RestResponse(allTo = "inventories") -public class APIQueryPluginDriversReply extends APIReply { +public class APIQueryPluginDriversReply extends APIQueryReply { private List inventories; public List getInventories() { From 9c585be70f766676ac1271d7de9a0443bce132d4 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 11 Apr 2024 12:59:42 +0800 Subject: [PATCH 311/737] [conf]: add plugin to product config Resolves: ZSTAC-71363 Change-Id: I7366767a7a6c69636370667070766369656d6b77 --- conf/zstack.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/zstack.xml b/conf/zstack.xml index 906279c8e8f..ed752bf46ba 100755 --- a/conf/zstack.xml +++ b/conf/zstack.xml @@ -119,4 +119,5 @@ + From 56759b08ae171d9ec68811da7b4386e48186fa37 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 22 Apr 2024 15:23:17 +0800 Subject: [PATCH 312/737] [plugin]: seperate plugin init and refresh APIImpact Resolves: ZSTAC-71363 Change-Id: I78687771766b6a666c64686467736267646e6369 Signed-off-by: AlanJager --- .../java/org/zstack/core/plugin/PluginManagerImpl.java | 8 ++++++++ .../core/external/plugin/APIRefreshPluginDriversMsg.java | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java index 3a96a815b51..ae5fd13119f 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java +++ b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java @@ -266,8 +266,16 @@ public void handleMessage(Message msg) { } } + private void cleanUp() { + pluginMetadata.clear(); + pluginInstances.clear(); + pluginRegisters.clear(); + pluginValidators.clear(); + } + private void handle(APIRefreshPluginDriversMsg msg) { APIRefreshPluginDrviersEvent event = new APIRefreshPluginDrviersEvent(msg.getId()); + cleanUp(); collectPluginProtocolMetadata(); collectPluginValidators(); loadPluginsFromMetadata(); diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsg.java b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsg.java index 58af686cba7..4fda75492b3 100644 --- a/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsg.java +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsg.java @@ -13,7 +13,7 @@ method = HttpMethod.PUT ) public class APIRefreshPluginDriversMsg extends APIMessage { - @APIParam + @APIParam(required = false) private String name; public String getName() { From c49ba0a0a17e522cf6136a5d141286a4ab651af9 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 25 Apr 2024 15:35:03 +0800 Subject: [PATCH 313/737] [plugin]: fix demo Resolves: ZSTAC-71363 Change-Id: I7174766278707072636b7463706a7a75686b6772 --- .../main/java/org/zstack/core/plugin/PluginManagerImpl.java | 5 +++++ pom.xml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java index ae5fd13119f..5ab8fd4860d 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java +++ b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java @@ -216,6 +216,11 @@ public boolean isFeatureSupported(String pluginProductKey, .features().get(capability) == Boolean.TRUE))); } + if (pluginInstances.get(pluginProductKey) + .features() == null) { + return true; + } + return pluginInstances.get(pluginProductKey) .features() .get(capability) == Boolean.TRUE; diff --git a/pom.xml b/pom.xml index 60c7a9afdc5..fd503a17da3 100755 --- a/pom.xml +++ b/pom.xml @@ -545,7 +545,7 @@ maven-releases - http://172.20.93.29:8081/repository/maven-releases/ + http://maven.nexus.zstack.io/repository/maven-zstack-open-source/ From 3a83acb946de61afe1ab96a054f81ef8429ebabf Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 25 Apr 2024 16:03:12 +0800 Subject: [PATCH 314/737] [plugin]: fix plugin reload Resolves: ZSTAC-71363 Change-Id: I66727a69756a69706e78716e61747176786d6a62 --- .../org/zstack/core/plugin/PluginManagerImpl.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java index 5ab8fd4860d..21a6da26619 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java +++ b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java @@ -1,5 +1,10 @@ package org.zstack.core.plugin; +import org.reflections.Reflections; +import org.reflections.scanners.Scanners; +import org.reflections.util.ClasspathHelper; +import org.reflections.util.ConfigurationBuilder; +import org.reflections.util.FilterBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.abstraction.PluginDriver; import org.zstack.abstraction.PluginValidator; @@ -45,7 +50,15 @@ public class PluginManagerImpl extends AbstractService implements PluginManager pluginValidators = new HashMap<>(); private void collectPluginProtocolMetadata() { - Platform.getReflections().getSubTypesOf(PluginDriver.class).forEach(clz -> { + ConfigurationBuilder builder = ConfigurationBuilder.build() + .setUrls(ClasspathHelper.forPackage("org.zstack")) + .setScanners(Scanners.SubTypes, Scanners.MethodsAnnotated, + Scanners.FieldsAnnotated, Scanners.TypesAnnotated, + Scanners.MethodsParameter) + .setExpandSuperTypes(false) + .filterInputsBy(new FilterBuilder().includePackage("org.zstack")); + Reflections reflections = new Reflections(builder); + reflections.getSubTypesOf(PluginDriver.class).forEach(clz -> { if (!clz.getCanonicalName().contains("org.zstack.abstraction") || !clz.isInterface()) { return; From 92afe433b24287b850f7663d601cd4df968d095c Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 25 Apr 2024 16:09:21 +0800 Subject: [PATCH 315/737] [conf]: add more details to plugin vo DBImpact Resolves: ZSTAC-71363 Change-Id: I7462656167756e6f6e706477666361616978727a Signed-off-by: AlanJager --- conf/db/upgrade/V4.5.1__schema.sql | 3 ++ .../zstack/core/plugin/PluginManagerImpl.java | 6 ++++ .../plugin/PluginDriverInventory.java | 30 ++++++++++++++++ .../core/external/plugin/PluginDriverVO.java | 36 +++++++++++++++++++ 4 files changed, 75 insertions(+) diff --git a/conf/db/upgrade/V4.5.1__schema.sql b/conf/db/upgrade/V4.5.1__schema.sql index cf13f63598a..62652e1202c 100644 --- a/conf/db/upgrade/V4.5.1__schema.sql +++ b/conf/db/upgrade/V4.5.1__schema.sql @@ -4,6 +4,9 @@ CREATE TABLE IF NOT EXISTS `zstack`.`PluginDriverVO` ( `type` varchar(64) NOT NULL, `vendor` varchar(64) NOT NULL, `features` varchar(1024) NOT NULL, + `description` varchar(1024) DEFAULT NULL, + `license` varchar(1024) DEFAULT NULL, + `version` varchar(1024) DEFAULT NULL, PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java index 21a6da26619..8e181f5ee00 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java +++ b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java @@ -116,12 +116,18 @@ private void registerPluginAsSingleton( vo.setVendor(pluginDriver.vendor()); vo.setFeatures(JSONObjectUtil.toJsonString(pluginDriver.features())); vo.setType(pluginDriver.type()); + vo.setDescription(pluginDriver.description()); + vo.setVersion(pluginDriver.version()); + vo.setLicense(pluginDriver.license()); dbf.persist(vo); } else { vo.setName(pluginDriver.name()); vo.setVendor(pluginDriver.vendor()); vo.setFeatures(JSONObjectUtil.toJsonString(pluginDriver.features())); vo.setType(pluginDriver.type()); + vo.setDescription(pluginDriver.description()); + vo.setVersion(pluginDriver.version()); + vo.setLicense(pluginDriver.license()); dbf.update(vo); } } catch (Exception e) { diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventory.java b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventory.java index 4f04d5a6453..9d732c26f85 100644 --- a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventory.java +++ b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventory.java @@ -12,6 +12,9 @@ public class PluginDriverInventory { private String type; private String vendor; private String features; + private String license; + private String version; + private String description; public static PluginDriverInventory valueOf(PluginDriverVO vo) { PluginDriverInventory inv = new PluginDriverInventory(); @@ -19,6 +22,9 @@ public static PluginDriverInventory valueOf(PluginDriverVO vo) { inv.setVendor(vo.getVendor()); inv.setFeatures(vo.getFeatures()); inv.setType(vo.getType()); + inv.setLicense(vo.getLicense()); + inv.setVersion(vo.getVersion()); + inv.setDescription(vo.getDescription()); return inv; } @@ -61,4 +67,28 @@ public String getFeatures() { public void setFeatures(String features) { this.features = features; } + + public String getLicense() { + return license; + } + + public void setLicense(String license) { + this.license = license; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } } diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO.java b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO.java index fae29f290c8..0e11251df7c 100644 --- a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO.java +++ b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO.java @@ -20,6 +20,15 @@ public class PluginDriverVO extends ResourceVO { @Column private String vendor; + @Column + private String license; + + @Column + private String version; + + @Column + private String description; + @Column private String features; @@ -31,6 +40,9 @@ public PluginDriverVO(PluginDriverVO other) { this.name = other.name; this.vendor = other.vendor; this.features = other.features; + this.license = other.license; + this.version = other.version; + this.description = other.description; this.type = other.type; } @@ -75,4 +87,28 @@ public String getFeatures() { public void setFeatures(String features) { this.features = features; } + + public String getLicense() { + return license; + } + + public void setLicense(String license) { + this.license = license; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } } From 8e24d421f47cedc74e541c224e1a262ac62b0df1 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 16 Dec 2024 15:46:44 +0800 Subject: [PATCH 316/737] [testlib]: Fix sdk Resolves: ZSTAC-12345 Change-Id: I666c737a776c616b67666872686c6d626f657970 --- .../java/org/zstack/testlib/ApiHelper.groovy | 58 ------------------- 1 file changed, 58 deletions(-) diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 8df808d9402..f6eea6b087d 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -32498,35 +32498,6 @@ abstract class ApiHelper { } - def queryPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPolicyAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() - - a.conditions = a.conditions.collect { it.toString() } - - - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } - - def queryPolicyRouteRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyRouteRuleAction.class) Closure c) { def a = new org.zstack.sdk.QueryPolicyRouteRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -34813,35 +34784,6 @@ abstract class ApiHelper { } - def refreshSearchIndexes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshSearchIndexesAction.class) Closure c) { - def a = new org.zstack.sdk.RefreshSearchIndexesAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() - - a.conditions = a.conditions.collect { it.toString() } - - - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } - - def queryVmSchedHistory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmSchedHistoryAction.class) Closure c) { def a = new org.zstack.sdk.QueryVmSchedHistoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 2871d639e148ee62895b8b64b598313bf9fc267a Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 18 Dec 2024 11:51:18 +0800 Subject: [PATCH 317/737] [sdk]: Fix npe if map is empty Resolves: ZSTAC-71363 Change-Id: I6d6a6c79616a797970796f6364616564716b7573 --- sdk/src/main/java/org/zstack/sdk/ApiResult.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/ApiResult.java b/sdk/src/main/java/org/zstack/sdk/ApiResult.java index 6a814e76148..f41aefa474d 100755 --- a/sdk/src/main/java/org/zstack/sdk/ApiResult.java +++ b/sdk/src/main/java/org/zstack/sdk/ApiResult.java @@ -115,11 +115,7 @@ public T getResult(Class clz) { } Object bean = getProperty(ret, path); - if (bean == null) { - throw new ApiException(String.format("cannot find property[%s] in the result. src class[%s], dst class[%s]", path, src, dst)); - } - - if (bean.getClass().getName().equals(dst)) { + if (bean == null || bean.getClass().getName().equals(dst)) { // not an inherent object continue; } @@ -132,6 +128,7 @@ public T getResult(Class clz) { return ret; } catch (Exception e) { + logger.log(Level.WARNING, "Warning: Exception occurred. Details: %s, Stack trace: %s", new Object[]{e.getMessage(), e.getStackTrace()}); throw new ApiException(e); } } From 372f3fb235866651b180a01a10f00301331efa37 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 18 Dec 2024 12:57:42 +0800 Subject: [PATCH 318/737] [doc]: Update plugin api templates Resolves: ZSTAC-71363 Change-Id: I70666b6c63676878636a77697869756663777268 --- .../APIQueryPluginDriversMsgDoc_zh_cn.groovy | 30 ++++++++++ ...APIQueryPluginDriversReplyDoc_zh_cn.groovy | 32 ++++++++++ ...APIRefreshPluginDriversMsgDoc_zh_cn.groovy | 58 +++++++++++++++++++ ...IRefreshPluginDrviersEventDoc_zh_cn.groovy | 23 ++++++++ .../PluginDriverInventoryDoc_zh_cn.groovy | 51 ++++++++++++++++ 5 files changed, 194 insertions(+) create mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversMsgDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversReplyDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsgDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDrviersEventDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventoryDoc_zh_cn.groovy diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..0d77668f5f5 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversMsgDoc_zh_cn.groovy @@ -0,0 +1,30 @@ +package org.zstack.header.core.external.plugin + +import org.zstack.header.core.external.plugin.APIQueryPluginDriversReply +import org.zstack.header.query.APIQueryMessage + +doc { + title "QueryPluginDrivers" + + category "external.plugin" + + desc """查询插件驱动器""" + + rest { + request { + url "GET /v1/external/plugins" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIQueryPluginDriversMsg.class + + desc """""" + + params APIQueryMessage.class + } + + response { + clz APIQueryPluginDriversReply.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversReplyDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversReplyDoc_zh_cn.groovy new file mode 100644 index 00000000000..967fa11bcb7 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversReplyDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.core.external.plugin + +import org.zstack.header.core.external.plugin.PluginDriverInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "查询插件驱动器" + + ref { + name "inventories" + path "org.zstack.header.core.external.plugin.APIQueryPluginDriversReply.inventories" + desc "插件驱动器列表" + type "List" + since "5.3.0" + clz PluginDriverInventory.class + } + field { + name "success" + desc "操作是否成功" + type "boolean" + since "5.3.0" + } + ref { + name "error" + path "org.zstack.header.core.external.plugin.APIQueryPluginDriversReply.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.0" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..ceef56bd2b4 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsgDoc_zh_cn.groovy @@ -0,0 +1,58 @@ +package org.zstack.header.core.external.plugin + +import org.zstack.header.core.external.plugin.APIRefreshPluginDrviersEvent + +doc { + title "RefreshPluginDrivers" + + category "external.plugin" + + desc """刷新插件驱动器""" + + rest { + request { + url "PUT /v1/external/plugins" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIRefreshPluginDriversMsg.class + + desc """""" + + params { + + column { + name "name" + enclosedIn "refreshPluginDrivers" + desc "资源名称" + location "body" + type "String" + optional true + since "5.3.0" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.0" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.0" + } + } + } + + response { + clz APIRefreshPluginDrviersEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDrviersEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDrviersEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..81f6901df38 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDrviersEventDoc_zh_cn.groovy @@ -0,0 +1,23 @@ +package org.zstack.header.core.external.plugin + +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "刷新插件驱动器" + + field { + name "success" + desc "操作是否成功" + type "boolean" + since "5.3.0" + } + ref { + name "error" + path "org.zstack.header.core.external.plugin.APIRefreshPluginDrviersEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.0" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventoryDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..f46f532b274 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventoryDoc_zh_cn.groovy @@ -0,0 +1,51 @@ +package org.zstack.header.core.external.plugin + + + +doc { + + title "插件驱动器" + + field { + name "name" + desc "资源名称" + type "String" + since "5.3.0" + } + field { + name "type" + desc "资源类型" + type "String" + since "5.3.0" + } + field { + name "vendor" + desc "插件供应商" + type "String" + since "5.3.0" + } + field { + name "features" + desc "插件特性" + type "String" + since "5.3.0" + } + field { + name "license" + desc "插件许可证" + type "String" + since "5.3.0" + } + field { + name "version" + desc "插件版本" + type "String" + since "5.3.0" + } + field { + name "description" + desc "资源的详细描述" + type "String" + since "5.3.0" + } +} From e65a74ffe5aa7ae66068e92f7cfc8e5617b6bb87 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 18 Dec 2024 13:10:42 +0800 Subject: [PATCH 319/737] [sdk]: Update sdk Resolves: ZSTAC-71363 Change-Id: I7366766c687070626367686d747365776575646e --- .../CreateCSPSecretResourcePoolAction.java | 2 +- .../CreateFiSecSecretResourcePoolAction.java | 2 +- .../CreatePluginSecretResourcePoolAction.java | 2 +- .../CreateSanSecSecretResourcePoolAction.java | 2 +- .../org/zstack/sdk/PluginDriverInventory.java | 24 +++++++++++++++++++ .../zstack/sdk/QueryPluginDriversResult.java | 8 +++++++ .../sdk/RefreshPluginDriversAction.java | 2 +- .../plugin/SNSPluginEndpointInventory.java | 10 +++++++- 8 files changed, 46 insertions(+), 6 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateCSPSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateCSPSecretResourcePoolAction.java index 7c199b0d15e..6de8f1206b7 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateCSPSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateCSPSecretResourcePoolAction.java @@ -55,7 +55,7 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; - @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateFiSecSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateFiSecSecretResourcePoolAction.java index a8a51c5fd42..576f0cd8017 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateFiSecSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateFiSecSecretResourcePoolAction.java @@ -37,7 +37,7 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; - @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreatePluginSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreatePluginSecretResourcePoolAction.java index aab6d093219..38d0ce2c491 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreatePluginSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreatePluginSecretResourcePoolAction.java @@ -40,7 +40,7 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; - @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSanSecSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSanSecSecretResourcePoolAction.java index c670de70dd4..67a86561609 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSanSecSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSanSecSecretResourcePoolAction.java @@ -55,7 +55,7 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; - @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/PluginDriverInventory.java b/sdk/src/main/java/org/zstack/sdk/PluginDriverInventory.java index 9edd20fa33e..50a895a670d 100644 --- a/sdk/src/main/java/org/zstack/sdk/PluginDriverInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/PluginDriverInventory.java @@ -36,4 +36,28 @@ public java.lang.String getFeatures() { return this.features; } + public java.lang.String license; + public void setLicense(java.lang.String license) { + this.license = license; + } + public java.lang.String getLicense() { + return this.license; + } + + public java.lang.String version; + public void setVersion(java.lang.String version) { + this.version = version; + } + public java.lang.String getVersion() { + return this.version; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPluginDriversResult.java b/sdk/src/main/java/org/zstack/sdk/QueryPluginDriversResult.java index fa85ecc86ca..c0661884e78 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPluginDriversResult.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPluginDriversResult.java @@ -11,4 +11,12 @@ public java.util.List getInventories() { return this.inventories; } + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversAction.java b/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversAction.java index 9eaf00ee92a..b412b01a93d 100644 --- a/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversAction.java @@ -25,7 +25,7 @@ public Result throwExceptionIfError() { } } - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; @Param(required = false) diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/SNSPluginEndpointInventory.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/SNSPluginEndpointInventory.java index 616bed5804e..fd491e80393 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/SNSPluginEndpointInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/SNSPluginEndpointInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk.sns.platform.plugin; - +import org.zstack.sdk.PluginDriverInventory; public class SNSPluginEndpointInventory extends org.zstack.sdk.sns.SNSApplicationEndpointInventory { @@ -28,4 +28,12 @@ public java.util.Map getProperties() { return this.properties; } + public PluginDriverInventory driver; + public void setDriver(PluginDriverInventory driver) { + this.driver = driver; + } + public PluginDriverInventory getDriver() { + return this.driver; + } + } From 5ef675b57c8f4307c26116c0699c59f349961434 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 26 Dec 2024 17:58:34 +0800 Subject: [PATCH 320/737] [encrypt]: Fix driver load logic Resolves: ZSTAC-12345 Change-Id: I7071616279657a69617676696d78686977677467 --- .../core/encrypt/EncryptFacadeImpl.java | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/core/src/main/java/org/zstack/core/encrypt/EncryptFacadeImpl.java b/core/src/main/java/org/zstack/core/encrypt/EncryptFacadeImpl.java index b9d6fd5e95f..9580f9bebb3 100644 --- a/core/src/main/java/org/zstack/core/encrypt/EncryptFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/encrypt/EncryptFacadeImpl.java @@ -17,6 +17,7 @@ import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.utils.BeanUtils; +import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; @@ -249,36 +250,36 @@ private void collectAllEncryptPassword() { private void initEncryptDriver() { String driverType = EncryptGlobalConfig.ENCRYPT_DRIVER.value(); - for (EncryptDriver driver : pluginRegistry.getExtensionList(EncryptDriver.class)) { - if (!driverType.equals(driver.getDriverType().toString()) - && (driver.getDriverTypes() != null - && !driver.getDriverTypes().contains(driverType))) { - continue; - } - - encryptDriver = driver; - break; + EncryptDriver encryptDriver = findEncryptDriver(driverType); + if (encryptDriver != null) { + this.encryptDriver = encryptDriver; + logger.debug(String.format("New encrypt driver: %s is included by driver class: %s", driverType, encryptDriver.getClass().getCanonicalName())); + return; } - if (encryptDriver == null) { - throw new CloudRuntimeException(String.format("no matched encrypt driver[type:%s] can be found", driverType)); - } + throw new CloudRuntimeException(String.format("No matched encrypt driver[type:%s] can be found", driverType)); } - public void installGlobalConfigUpdateHooks() { - EncryptGlobalConfig.ENCRYPT_DRIVER.installUpdateExtension(new GlobalConfigUpdateExtensionPoint() { - @Override - public void updateGlobalConfig(GlobalConfig oldConfig, GlobalConfig newConfig) { - for (EncryptDriver driver : pluginRegistry.getExtensionList(EncryptDriver.class)) { - if (!newConfig.value().equals(driver.getDriverType().toString()) - && (driver.getDriverTypes() != null - && !driver.getDriverTypes().contains(driver.getDriverType().toString()))) { - continue; - } + private EncryptDriver findEncryptDriver(String driverType) { + return pluginRegistry.getExtensionList(EncryptDriver.class).stream() + .filter(driver -> driverType.equals(driver.getDriverType().toString()) || + (driver.getDriverTypes() != null && driver.getDriverTypes().contains(driverType))) + .findFirst() + .orElseGet(() -> { + logger.error(String.format("No matched encrypt driver[type:%s] can be found", driverType)); + return null; + }); + } - encryptDriver = driver; - break; - } + public void installGlobalConfigUpdateHooks() { + EncryptGlobalConfig.ENCRYPT_DRIVER.installUpdateExtension((oldConfig, newConfig) -> { + String updatedToDriverType = newConfig.value(); + EncryptDriver encryptDriver = findEncryptDriver(updatedToDriverType); + if (encryptDriver != null) { + logger.debug(String.format("New encrypt driver: %s is included by driver class: %s", updatedToDriverType, encryptDriver.getClass().getCanonicalName())); + this.encryptDriver = encryptDriver; + } else { + logger.error(String.format("No matched encrypt driver[type:%s] can be found", updatedToDriverType)); } }); From 42d137a8740293e718b2939d8580aab89ead3022 Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Tue, 8 Apr 2025 22:02:02 -0400 Subject: [PATCH 321/737] [sdk]: Update the SDK to resolve the conflict Resolves: ZSTAC-71363 Change-Id: I7366766c687070626367686d747365776575646e --- sdk/src/main/java/SourceClassMap.java | 2 +- .../java/org/zstack/sdk/CreateKoAlSecretResourcePoolAction.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 743eaba2e29..7163f66477f 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -133,9 +133,9 @@ public class SourceClassMap { put("org.zstack.crypto.securitymachine.thirdparty.infoSec.InfoSecSecurityMachineInventory", "org.zstack.sdk.InfoSecSecurityMachineInventory"); put("org.zstack.crypto.securitymachine.thirdparty.jit.JitSecurityMachineInventory", "org.zstack.sdk.JitSecurityMachineInventory"); put("org.zstack.crypto.securitymachine.thirdparty.koal.KoAlSecretResourcePoolInventory", "org.zstack.sdk.KoAlSecretResourcePoolInventory"); + put("org.zstack.crypto.securitymachine.thirdparty.plugin.PluginSecretResourcePoolInventory", "org.zstack.sdk.PluginSecretResourcePoolInventory"); put("org.zstack.crypto.securitymachine.thirdparty.sansec.SanSecSecretResourcePoolInventory", "org.zstack.sdk.SanSecSecretResourcePoolInventory"); put("org.zstack.crypto.securitymachine.thirdparty.sansec.SanSecSecurityMachineInventory", "org.zstack.sdk.SanSecSecurityMachineInventory"); - put("org.zstack.crypto.securitymachine.thirdparty.plugin.PluginSecretResourcePoolInventory", "org.zstack.sdk.PluginSecretResourcePoolInventory"); put("org.zstack.directory.DirectoryInventory", "org.zstack.sdk.DirectoryInventory"); put("org.zstack.drs.api.HostLoad", "org.zstack.sdk.HostLoad"); put("org.zstack.drs.api.Threshold", "org.zstack.sdk.Threshold"); diff --git a/sdk/src/main/java/org/zstack/sdk/CreateKoAlSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateKoAlSecretResourcePoolAction.java index 2c2b0daf3c6..46a67de4a8d 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateKoAlSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateKoAlSecretResourcePoolAction.java @@ -43,7 +43,7 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; - @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) From 9a87c6fec45f2f1c90e06f476a2ba853026ec2ee Mon Sep 17 00:00:00 2001 From: "wei.wang" Date: Wed, 9 Apr 2025 14:59:29 +0800 Subject: [PATCH 322/737] [root]: Add ai code review configuration Add ai code review configuration, see more at http://gitlab.zstack.io/zstackio/code-reviews Change-Id: I6573686c6270767966656b7a766c696c6b626770 --- .coderabbit.yaml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .coderabbit.yaml diff --git a/.coderabbit.yaml b/.coderabbit.yaml new file mode 100644 index 00000000000..816d95814b3 --- /dev/null +++ b/.coderabbit.yaml @@ -0,0 +1,3 @@ +# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json +remote_config: + url: "http://open.zstack.ai:20001/code-reviews/zstack-cloud.yaml" From 43c5d3cbeecf4df4015f9be2d232bdfa307f302c Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 9 Apr 2025 17:10:23 +0800 Subject: [PATCH 323/737] [sdk]: Update sdk Resolves: ZSTAC-73483 Change-Id: I7766626d6c65776268696d746f626b796d6a756d --- .../sdk/DeployAppDevelopmentServiceAction.java | 6 ++++++ .../zstack/sdk/DeployModelEvalServiceAction.java | 6 ++++++ .../org/zstack/sdk/DeployModelServiceAction.java | 6 ++++++ .../main/java/org/zstack/sdk/ModelService.java | 16 ++++++++++++++++ 4 files changed, 34 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java index 9b244fd1787..f5c1909699d 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java @@ -79,6 +79,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer serviceBootUptime; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String rootDiskOfferingUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long rootDiskSize; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java index 06b844f7a6d..7c754df39b1 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java @@ -130,6 +130,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer serviceBootUptime; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String rootDiskOfferingUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long rootDiskSize; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java index 6f8ab25e307..16779f12584 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java @@ -79,6 +79,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer serviceBootUptime; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String rootDiskOfferingUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long rootDiskSize; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelService.java b/sdk/src/main/java/org/zstack/sdk/ModelService.java index 55ae0ebab39..60c82ea6840 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelService.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelService.java @@ -172,6 +172,22 @@ public java.lang.Integer getServiceBootUptime() { return this.serviceBootUptime; } + public java.lang.String rootDiskOfferingUuid; + public void setRootDiskOfferingUuid(java.lang.String rootDiskOfferingUuid) { + this.rootDiskOfferingUuid = rootDiskOfferingUuid; + } + public java.lang.String getRootDiskOfferingUuid() { + return this.rootDiskOfferingUuid; + } + + public java.lang.Long rootDiskSize; + public void setRootDiskSize(java.lang.Long rootDiskSize) { + this.rootDiskSize = rootDiskSize; + } + public java.lang.Long getRootDiskSize() { + return this.rootDiskSize; + } + public SessionInventory session; public void setSession(SessionInventory session) { this.session = session; From 2741a92bd97d7e931e2a005829eced16471ea0a4 Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Thu, 19 Dec 2024 17:46:40 +0800 Subject: [PATCH 324/737] [crypto]: add support for crypto clinet modularization APIImpact DBImpact Resolves: ZSTAC-71363 Change-Id: I7767136369666f666d727279726c66736b736b62 --- .../org/zstack/abstraction/OptionType.java | 689 ++++++++++++++++++ .../org/zstack/abstraction/PluginDriver.java | 10 + .../crypto/CryptoClientDriver.java | 13 +- conf/db/upgrade/V4.5.1__schema.sql | 3 + conf/serviceConfig/plugin.xml | 4 + core/pom.xml | 5 - .../org/zstack/core/plugin/PluginManager.java | 2 + .../zstack/core/plugin/PluginManagerImpl.java | 231 ++++-- header/pom.xml | 5 + .../plugin/APIDeletePluginDriversEvent.java | 17 + .../plugin/APIDeletePluginDriversMsg.java | 30 + .../APIDeletePluginDriversMsgDoc_zh_cn.groovy | 58 ++ .../plugin/APIRefreshPluginDriversEvent.java | 17 + ...RefreshPluginDriversEventDoc_zh_cn.groovy} | 2 +- .../plugin/APIRefreshPluginDriversMsg.java | 2 +- ...APIRefreshPluginDriversMsgDoc_zh_cn.groovy | 4 +- .../plugin/APIRefreshPluginDrviersEvent.java | 17 - .../plugin/PluginDriverInventory.java | 44 ++ .../core/external/plugin/PluginDriverVO.java | 37 + .../core/external/plugin/PluginDriverVO_.java | 8 + .../header/core/external/plugin/RBACInfo.java | 3 +- .../plugin/RefreshPluginDriversMsg.java | 15 + .../plugin/RefreshPluginDriversReply.java | 6 + sdk/src/main/java/SourceClassMap.java | 4 + .../CreateAiSiNoSecretResourcePoolAction.java | 3 + .../CreateCSPSecretResourcePoolAction.java | 3 + .../CreateFiSecSecretResourcePoolAction.java | 3 + .../CreateFlkSecSecretResourcePoolAction.java | 3 + .../CreateHaiTaiSecretResourcePoolAction.java | 3 + ...CreateInfoSecSecretResourcePoolAction.java | 3 + .../CreateJitSecretResourcePoolAction.java | 3 + .../CreatePluginSecretResourcePoolAction.java | 9 +- .../CreateSanSecSecretResourcePoolAction.java | 3 + .../zstack/sdk/DeletePluginDriversAction.java | 101 +++ .../zstack/sdk/DeletePluginDriversResult.java | 7 + .../main/java/org/zstack/sdk/InputType.java | 17 + .../main/java/org/zstack/sdk/OptionType.java | 311 ++++++++ .../org/zstack/sdk/PluginDriverInventory.java | 32 + .../PluginSecretResourcePoolInventory.java | 8 + .../sdk/RefreshPluginDriversAction.java | 6 +- .../sdk/RefreshPluginDriversResult.java | 7 + .../sdk/RefreshPluginDrviersResult.java | 7 - .../UpdatePluginSecretResourcePoolAction.java | 116 +++ .../java/org/zstack/testlib/ApiHelper.groovy | 55 ++ 44 files changed, 1831 insertions(+), 95 deletions(-) create mode 100644 abstraction/src/main/java/org/zstack/abstraction/OptionType.java create mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversEvent.java create mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsg.java create mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsgDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversEvent.java rename header/src/main/java/org/zstack/header/core/external/plugin/{APIRefreshPluginDrviersEventDoc_zh_cn.groovy => APIRefreshPluginDriversEventDoc_zh_cn.groovy} (96%) delete mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDrviersEvent.java create mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/RefreshPluginDriversMsg.java create mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/RefreshPluginDriversReply.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeletePluginDriversAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeletePluginDriversResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/InputType.java create mode 100644 sdk/src/main/java/org/zstack/sdk/OptionType.java create mode 100644 sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversResult.java delete mode 100644 sdk/src/main/java/org/zstack/sdk/RefreshPluginDrviersResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdatePluginSecretResourcePoolAction.java diff --git a/abstraction/src/main/java/org/zstack/abstraction/OptionType.java b/abstraction/src/main/java/org/zstack/abstraction/OptionType.java new file mode 100644 index 00000000000..019fe354b98 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/OptionType.java @@ -0,0 +1,689 @@ +package org.zstack.abstraction; +/** + * A Model representation of an input / option that is represented either in a UI or CLI. + * This allows an Integration to specify custom inputs for various configuration screens where custom data may need to be provided. + * This could include provisioning options. + * There are several input types as well as display orders. + * this must be provided by the relevant provider interface. + */ +public class OptionType { + protected String uuid; + protected String name; + protected String code; + protected String category; + protected Boolean required = false; // Indicates if the field is mandatory + protected Boolean editable = true; // Indicates if the field is editable + protected Boolean enabled = true; // Indicates if the field is enabled + protected Integer displayOrder; // Specifies the display order of the field + protected InputType inputType = InputType.TEXT; // Input type, refer to the InputType enum for possible values + protected String placeHolderText; // Placeholder text, displayed as a hint + protected String defaultValue; // Default value for the field + protected String noSelection; // Indicates if no selection is allowed by default + protected Boolean noBlank = false; // Indicates if the field can have an empty value + protected Boolean secretField = false; // Indicates if the field contains sensitive information + protected Long minVal; // Minimum allowed value + protected Long maxVal; // Maximum allowed value + protected Long minLength; // Minimum allowed length for input + protected Long maxLength; // Maximum allowed length for input + + protected String fieldContext = "config"; + protected String fieldClass; // CSS class for styling the field + protected String fieldLabel; // Label for the field, displayed in the UI + protected String fieldCode; // Internationalization (i18n) code for the field + protected String fieldName; // The key used by the backend to identify this field + protected String fieldGetName; // Key for retrieving the value from a different property + protected String fieldSetName; // Key for setting the value from a different property + protected String fieldGetContext; // Context for retrieving the field's value + protected String fieldSetContext; // Context for setting the field's value + + protected String fieldGroup; // Specifies the group to which the field belongs + protected String fieldGroupI18nCode; // i18n code for the field group heading + + protected String helpText; // Help text providing guidance to users + protected String helpTextI18nCode; // i18n code for the help text + + protected String optionSourceType; // Source type for dynamic options (e.g., database or API) + protected String optionSource; // Source for dynamic options, such as a method name + protected String dependsOn; // Fields this field depends on; updates when dependent field values change + + protected Boolean showOnEdit = true; // Indicates if the field is displayed during editing + protected Boolean displayValueOnDetails = false; // Indicates if the field value is displayed on details page + protected Boolean showOnCreate = true; // Indicates if the field is displayed during creation + protected String verifyPattern; // Validation pattern for input value, specified as a regular expression + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + /** + * Gets the Unique code representation of the option type. This is used for tracking changes and should be globally unique. It also + * allows for multiple provider types to reuse the same input field if they share the same option set. + * + * @return unique String code identifier for this particular Option Type + */ + public String getCode() { + return code; + } + + /** + * Sets the Unique code representation of the option type. This is used for tracking changes and should be globally unique. It also + * allows for multiple provider types to reuse the same input field if they share the same option set. + * + * @param code unique String code identifier for this particular Option Type + */ + public void setCode(String code) { + this.code = code; + } + + /** + * Gets the field label of the current Option Type. The Field Label is the human readable label that is typically displayed left of the + * input prompt in most UI representations. + * + * @return Human readable Field Label + */ + public String getFieldLabel() { + return fieldLabel; + } + + /** + * Sets the field label of the current Option Type. The Field Label is the human readable label that is typically displayed left of the + * input prompt in most UI representations. + * + * @param fieldLabel Human readable Field Label + */ + public void setFieldLabel(String fieldLabel) { + this.fieldLabel = fieldLabel; + } + + /** + * Gets the field name of the current option type. The Field Name is typically the actual property name the field correlates to. + * It can be period seperated for referencing nested objects and is typically combined with the fieldContext. + * (example: config.provider.name). + * + * @return the field name of the property being saved + */ + public String getFieldName() { + return fieldName; + } + + /** + * Sets the field name of the current option type. The Field Name is typically the actual property name the field correlates to. + * It can be period seperated for referencing nested objects and is typically combined with the fieldContext. + * (example: config.provider.name). + * + * @param fieldName the field name of the property being saved + */ + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + /** + * Gets the field context which is the primary object the field is being saved onto. This could be something like + * 'instance' or 'config'. It typically gets combined with field names such as a fieldName of 'name' with a context + * of 'instance' would get combined to save onto 'instance.name' within Morpheus data model. + * + * @return the field context to be used for determining where the value is saved + */ + public String getFieldContext() { + return fieldContext; + } + + /** + * Sets the field context which is the primary object the field is being saved onto. This could be something like + * 'instance' or 'config'. It typically gets combined with field names such as a fieldName of 'name' with a context + * of 'instance' would get combined to save onto 'instance.name' within Morpheus data model. + * + * @param fieldContext the field context to be used for determining where the value is saved + */ + public void setFieldContext(String fieldContext) { + this.fieldContext = fieldContext; + } + + /** + * Gets the field group which is the name that is used to group fields together in the user interface. + * To have all fields at the same level, do not specify a field group. + * + * @return the field group to be used for grouping fields together + */ + public String getFieldGroup() { + return fieldGroup; + } + + /** + * Sets the field group which is the name that is used to group fields together in the user interface. + * To have all fields at the same level, do not specify a field group. + * + * @param fieldGroup the field group to be used for grouping fields together + */ + public void setFieldGroup(String fieldGroup) { + this.fieldGroup = fieldGroup; + } + + /** + * Gets the type of Input this option type represents. This could range in type and be anything from a free form + * text field to a dropdown with remote loaded data from an {@link #getOptionSource()}. + * + * @return the type of input this option type correlates to. + */ + public InputType getInputType() { + return inputType; + } + + /** + * Sets the type of Input this option type represents. This could range in type and be anything from a free form + * text field to a dropdown with remote loaded data from an {@link #getOptionSource()}. + * + * @param inputType the type of input this option type correlates to. + */ + public void setInputType(InputType inputType) { + this.inputType = inputType; + } + + /** + * Gets the display order position of the following Option Type. The Display order is sorted ascending numerically. Sometimes + * it may be advised to use multiples when incrementing the display order to allow for injection points between them. + * + * @return the Numerical display order (typically starting at 0) of the input. + */ + public Integer getDisplayOrder() { + return displayOrder; + } + + /** + * Sets the display order position of the following Option Type. The Display order is sorted ascending numerically. Sometimes + * it may be advised to use multiples when incrementing the display order to allow for injection points between them. + * + * @param displayOrder the Numerical display order (typically starting at 0) of the input. + */ + public void setDisplayOrder(Integer displayOrder) { + this.displayOrder = displayOrder; + + } + + /** + * Gets an inputs placeholder text for helpful display when awaiting input on a field. A placeholder text can be + * helpful hint to the user as to what type of input should go in the associated field. + * + * @return the place holder input text + */ + public String getPlaceHolderText() { + return placeHolderText; + } + + /** + * Convenience method for binding data, see {@link #getPlaceHolderText() getPlaceHolderText} + */ + public String getPlaceHolder() { + return getPlaceHolderText(); + } + + /** + * Sets an inputs placeholder text for helpful display when awaiting input on a field. A placeholder text can be + * helpful hint to the user as to what type of input should go in the associated field. + * + * @param placeHolderText the place holder input text + */ + public void setPlaceHolderText(String placeHolderText) { + this.placeHolderText = placeHolderText; + + } + + /** + * Convenience method for binding data, see {@link #setPlaceHolderText(String) setPlaceHolderText} + */ + public void setPlaceHolder(String placeHolderText) { + setPlaceHolderText(placeHolderText); + } + + /** + * Returns a String representation of the default value for the current Input. When a user first is prompted for input + * if no input is given by the user, this default value is used. + * + * @return the default value of the following input option + */ + public String getDefaultValue() { + return defaultValue; + } + + /** + * Sets a String representation of the default value for the current Input. When a user first is prompted for input + * if no input is given by the user, this default value is used. + * + * @param defaultValue the default value of the following input option + */ + public void setDefaultValue(String defaultValue) { + this.defaultValue = defaultValue; + } + + /** + * Gets the required flag off of the option type. This determines if an input is user required or not. The CLI and UI will use + * this flag as an initial validation step to ensure a user has at least entered a value. + * + * @return the required flag to determine if an input requires a value or not + */ + public Boolean getRequired() { + return required; + } + + /** + * Sets the required flag off of the option type. This determines if an input is user required or not. The CLI and UI will use + * this flag as an initial validation step to ensure a user has at least entered a value. + * + * @param required the required flag to determine if an input requires a value or not + */ + public void setRequired(Boolean required) { + this.required = required; + } + + /** + * Gets the help text pertaining to an input. Some inputs have help text that display below them to give better + * context for the user when determining what value to enter. This data is optional. + * + * @return the descriptive help block of text for an input + */ + public String getHelpText() { + return helpText; + } + + public String getHelpBlock() { + return helpText; + } + + /** + * Gets the help text pertaining to an input. Some inputs have help text that display below them to give better + * context for the user when determining what value to enter. This data is optional. + * + * @param helpText the descriptive help block of text for an input + */ + public void setHelpText(String helpText) { + this.helpText = helpText; + + } + + public void setHelpBlock(String helpText) { + this.helpText = helpText; + + } + + /** + * Gets the option source api method endpoint to hit when using the {@link InputType#SELECT} option. This allows a remote + * data source query to be queried for loading dynamic data. It also can take a POST request with the values of previously entered + * inputs to use as a way to filter the available options. This should be globally unique. + * + * @return option source api method for loading dynamic options + */ + public String getOptionSource() { + return optionSource; + } + + /** + * Sets the option source api method endpoint to hit when using the {@link InputType#SELECT} option. This allows a remote + * data source query to be queried for loading dynamic data. It also can take a POST request with the values of previously entered + * inputs to use as a way to filter the available options. This should be globally unique. + * + * @param optionSource option source api method for loading dynamic options + */ + public void setOptionSource(String optionSource) { + this.optionSource = optionSource; + + } + + /** + * Gets the code of an option type that this option type depends on. Some option types depend on input from previous option types. By placing the code or fieldName representation of that field into this + * input, this field will refresh upon changes made to that previous input + * + * @return the code of the parent option type + */ + public String getDependsOn() { + return dependsOn; + } + + /** + * Convenience method for binding data, see {@link #getDependsOn() getDependsOn} + */ + public String getDependsOnCode() { + return getDependsOn(); + } + + /** + * Sets the code of an option type that this option type depends on. Some option types depend on input from previous option types. By placing the code or fieldName representation of that field into this + * input, this field will refresh upon changes made to that previous input + * + * @param dependsOn the code of the parent option type + */ + public void setDependsOn(String dependsOn) { + this.dependsOn = dependsOn; + + } + + /** + * Convenience method for binding data, see {@link #setDependsOn(String) setDependsOn} + */ + public void setDependsOnCode(String dependsOn) { + setDependsOn(dependsOn); + } + + /** + * Specifies whether this option type is editable on edit. This sometimes is the case where a field can be set on create + * but not changed later + * + * @return whether or not this option type value is editable + */ + public Boolean getEditable() { + return editable; + } + + /** + * Sets whether or not this option type is editable. This sometimes is the case where a field can be set on create + * but not changed later + * + * @param editable whether or not this field is editable upon edit and not just create + */ + public void setEditable(Boolean editable) { + this.editable = editable; + } + + /** + * Specifies whether this option type is visible on create forms. This sometimes is the case where a field can be set on create + * but not changed later nor does it make sense to display it after create. + * + * @return whether or not this option type is visible upon create + */ + public Boolean getShowOnCreate() { + return showOnCreate; + } + + /** + * Sets whether or not this option type is visible on create forms. This sometimes is the case where a field can be set on create + * but not changed later, nor does it make sense to display it after create. + * + * @param showOnCreate whether or not this option type is visible upon create + */ + public void setShowOnCreate(Boolean showOnCreate) { + this.showOnCreate = showOnCreate; + + } + + /** + * Specifies if this option type is visible on edit forms. This sometimes is the case where a field can be set on create + * but not changed later nor does it make sense to display it after create. + * + * @return determines if this option type is visible upon edit + */ + public Boolean getShowOnEdit() { + return showOnEdit; + } + + /** + * Sets if this option type is visible on edit forms. This sometimes is the case where a field can be set on create + * but not changed later, nor does it make sense to display it after create. + * + * @param showOnEdit determines if this option type is visible upon edit + */ + public void setShowOnEdit(Boolean showOnEdit) { + this.showOnEdit = showOnEdit; + } + + public String getFieldClass() { + return fieldClass; + } + + public void setFieldClass(String fieldClass) { + this.fieldClass = fieldClass; + } + + /** + * Specifies if this option type is visible on resource detail views. + * + * @return determines if this option type is visible upon edit + */ + public Boolean getDisplayValueOnDetails() { + return displayValueOnDetails; + } + + /** + * Sets if this option type is visible on resource detail views. + * + * @param displayValueOnDetails determines if this option type is visible on resource detail views + */ + public void setDisplayValueOnDetails(Boolean displayValueOnDetails) { + this.displayValueOnDetails = displayValueOnDetails; + + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + + } + + public Boolean getEnabled() { + return enabled; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + + } + + /** + * returns the uuid + * + * @return the uuid of the current record + */ + public String getUuid() { + return uuid; + } + + /** + * Sets the uuid. In this class this should not be called directly + * + * @param uuid the uuid of the current record + */ + public void setUuid(String uuid) { + this.uuid = uuid; + + } + + public String getNoSelection() { + return noSelection; + } + + public void setNoSelection(String noSelection) { + this.noSelection = noSelection; + + } + + public Long getMinVal() { + return minVal; + } + + public void setMinVal(Long minVal) { + this.minVal = minVal; + + } + + public Long getMaxVal() { + return maxVal; + } + + public void setMaxVal(Long maxVal) { + this.maxVal = maxVal; + + } + + public Long getMinLength() { + return minLength; + } + + public void setMinLength(Long minLength) { + this.minLength = minLength; + + } + + public Long getMaxLength() { + return maxLength; + } + + public void setMaxLength(Long maxLength) { + this.maxLength = maxLength; + + } + + public String getFieldCode() { + return fieldCode; + } + + public void setFieldCode(String fieldCode) { + this.fieldCode = fieldCode; + + } + + public String getFieldGetName() { + return fieldGetName; + } + + public void setFieldGetName(String fieldGetName) { + this.fieldGetName = fieldGetName; + + } + + public String getFieldSetName() { + return fieldSetName; + } + + public void setFieldSetName(String fieldSetName) { + this.fieldSetName = fieldSetName; + + } + + public String getFieldGetContext() { + return fieldGetContext; + } + + public void setFieldGetContext(String fieldGetContext) { + this.fieldGetContext = fieldGetContext; + + } + + public String getFieldSetContext() { + return fieldSetContext; + } + + public void setFieldSetContext(String fieldSetContext) { + this.fieldSetContext = fieldSetContext; + + } + + public String getFieldGroupI18nCode() { + return fieldGroupI18nCode; + } + + /** + * Convenience method for binding data, see {@link #getFieldGroupI18nCode() getFieldGroupI18nCode} + */ + public String getFieldGroupCode() { + return getFieldGroupI18nCode(); + } + + public void setFieldGroupI18nCode(String fieldGroupI18nCode) { + this.fieldGroupI18nCode = fieldGroupI18nCode; + + } + + /** + * Convenience method for binding data, see {@link #setFieldGroupI18nCode(String) setFieldGroupI18nCode} + */ + public void setFieldGroupCode(String fieldGroupI18nCode) { + setFieldGroupI18nCode(fieldGroupI18nCode); + } + + public String getHelpTextI18nCode() { + return helpTextI18nCode; + } + + /** + * Convenience method for binding data, see {@link #getHelpTextI18nCode() getHelpTextI18nCode} + */ + public String getHelpBlockCode() { + return getHelpTextI18nCode(); + } + + public void setHelpTextI18nCode(String helpTextI18nCode) { + this.helpTextI18nCode = helpTextI18nCode; + + } + + /** + * Convenience method for binding data, see {@link #setHelpTextI18nCode(String) setHelpTextI18nCode} + */ + public void setHelpBlockCode(String helpTextI18nCode) { + setHelpTextI18nCode(helpTextI18nCode); + } + + public String getOptionSourceType() { + return optionSourceType; + } + + public void setOptionSourceType(String optionSourceType) { + this.optionSourceType = optionSourceType; + + } + + public Boolean getNoBlank() { + return noBlank; + } + + public void setNoBlank(Boolean noBlank) { + this.noBlank = noBlank; + } + + public Boolean getSecretField() { + return secretField; + } + + public void setSecretField(Boolean secretField) { + this.secretField = secretField; + } + + public String getVerifyPattern() { + return verifyPattern; + } + + public void setVerifyPattern(String verifyPattern) { + this.verifyPattern = verifyPattern; + } + + public enum InputType { + TEXT("text"), + PASSWORD("password"), + NUMBER("number"), + TEXTAREA("textarea"), + SELECT("select"), + MULTI_SELECT("multiSelect"), + CHECKBOX("checkbox"), + RADIO("radio"), + CREDENTIAL("credential"), + TYPEAHEAD("typeahead"), + MULTI_TYPEAHEAD("multiTypeahead"), + CODE_EDITOR("code-editor"), + HIDDEN("hidden"); + + private final String value; + + InputType(String value) { + this.value = value; + } + + public String toString() { + return this.value; + } + } +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/PluginDriver.java b/abstraction/src/main/java/org/zstack/abstraction/PluginDriver.java index 25212f7d801..e89037b65bb 100644 --- a/abstraction/src/main/java/org/zstack/abstraction/PluginDriver.java +++ b/abstraction/src/main/java/org/zstack/abstraction/PluginDriver.java @@ -1,5 +1,6 @@ package org.zstack.abstraction; +import java.util.Collection; import java.util.Map; /** @@ -59,4 +60,13 @@ public interface PluginDriver { * @return license of current plugin */ String license(); + + /** + * Provides a Collection of OptionType inputs that define the required input fields for defining a plugin integration + * + * @return Collection of OptionType + */ + default Collection optionTypes() { + return null; + } } diff --git a/abstraction/src/main/java/org/zstack/abstraction/crypto/CryptoClientDriver.java b/abstraction/src/main/java/org/zstack/abstraction/crypto/CryptoClientDriver.java index e496a40f8b0..0b0f888f91d 100644 --- a/abstraction/src/main/java/org/zstack/abstraction/crypto/CryptoClientDriver.java +++ b/abstraction/src/main/java/org/zstack/abstraction/crypto/CryptoClientDriver.java @@ -1,8 +1,9 @@ package org.zstack.abstraction.crypto; +import org.zstack.abstraction.OptionType; import org.zstack.abstraction.PluginDriver; -import java.security.cert.X509Certificate; +import java.util.Collection; import java.util.Map; public interface CryptoClientDriver extends PluginDriver { @@ -15,12 +16,12 @@ public interface CryptoClientDriver extends PluginDriver { boolean connect(Map properties); /** - * Parse certificate + * Parse original text and certificate base64 string * - * @param cert Certificate byte[] - * @return X509Certificate instance + * @param input Signature string representation + * @return A 2D byte array where Result[0] contains the original text and Result[1] contains the certificate base64 string */ - X509Certificate genericCertificate(byte[] cert); + byte[][] attachedVerify(String input); /** * Return SM3 encrypted cipher text @@ -53,4 +54,6 @@ public interface CryptoClientDriver extends PluginDriver { * @return hmac encrypted text */ String hmac(String plain); + + Collection optionTypes(); } diff --git a/conf/db/upgrade/V4.5.1__schema.sql b/conf/db/upgrade/V4.5.1__schema.sql index 62652e1202c..b3e05712a9f 100644 --- a/conf/db/upgrade/V4.5.1__schema.sql +++ b/conf/db/upgrade/V4.5.1__schema.sql @@ -4,9 +4,12 @@ CREATE TABLE IF NOT EXISTS `zstack`.`PluginDriverVO` ( `type` varchar(64) NOT NULL, `vendor` varchar(64) NOT NULL, `features` varchar(1024) NOT NULL, + `optionTypes` text DEFAULT NULL, `description` varchar(1024) DEFAULT NULL, `license` varchar(1024) DEFAULT NULL, `version` varchar(1024) DEFAULT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/conf/serviceConfig/plugin.xml b/conf/serviceConfig/plugin.xml index e6be185d06f..74c849aba8a 100644 --- a/conf/serviceConfig/plugin.xml +++ b/conf/serviceConfig/plugin.xml @@ -9,4 +9,8 @@ org.zstack.header.core.external.plugin.APIRefreshPluginDriversMsg + + + org.zstack.header.core.external.plugin.APIDeletePluginDriversMsg + \ No newline at end of file diff --git a/core/pom.xml b/core/pom.xml index 1dc2f4c399e..aab291866b6 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -21,11 +21,6 @@ header ${project.version} - - org.zstack - abstraction - ${project.version} - org.quartz-scheduler quartz diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManager.java b/core/src/main/java/org/zstack/core/plugin/PluginManager.java index 4e1b78c33d2..caa2b103d42 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginManager.java +++ b/core/src/main/java/org/zstack/core/plugin/PluginManager.java @@ -1,6 +1,8 @@ package org.zstack.core.plugin; import org.zstack.abstraction.PluginDriver; +import org.zstack.core.CoreGlobalProperty; +import org.zstack.utils.path.PathUtil; import java.util.List; diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java index 8e181f5ee00..7da45768810 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java +++ b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java @@ -8,26 +8,40 @@ import org.springframework.beans.factory.annotation.Autowired; import org.zstack.abstraction.PluginDriver; import org.zstack.abstraction.PluginValidator; +import org.zstack.core.CoreGlobalProperty; import org.zstack.core.Platform; +import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; +import org.zstack.core.thread.ChainTask; +import org.zstack.core.thread.SyncTaskChain; +import org.zstack.core.thread.ThreadFacade; import org.zstack.header.AbstractService; -import org.zstack.header.core.external.plugin.APIRefreshPluginDriversMsg; -import org.zstack.header.core.external.plugin.APIRefreshPluginDrviersEvent; -import org.zstack.header.core.external.plugin.PluginDriverVO; +import org.zstack.header.core.WhileDoneCompletion; +import org.zstack.header.core.external.plugin.*; +import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.exception.CloudRuntimeException; +import org.zstack.header.managementnode.ManagementNodeVO; +import org.zstack.header.managementnode.ManagementNodeVO_; import org.zstack.header.message.Message; +import org.zstack.header.message.MessageReply; +import org.zstack.utils.Bash; import org.zstack.utils.Utils; import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; +import org.zstack.utils.path.PathUtil; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.*; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; import static org.zstack.core.Platform.operr; @@ -41,6 +55,8 @@ public class PluginManagerImpl extends AbstractService implements PluginManager private DatabaseFacade dbf; @Autowired private CloudBus bus; + @Autowired + private ThreadFacade thdf; private final Set> pluginMetadata = new HashSet<>(); private final Map pluginInstances = new HashMap<>(); @@ -48,6 +64,15 @@ public class PluginManagerImpl extends AbstractService implements PluginManager pluginRegisters = new HashMap<>(); private final Map, PluginValidator> pluginValidators = new HashMap<>(); + private String fileDirPath = PathUtil.join(CoreGlobalProperty.DATA_DIR, "/plugins/"); + + public String getFileDirPath() { + return fileDirPath; + } + + public void setFileDirPath(String fileDirPath) { + this.fileDirPath = fileDirPath; + } private void collectPluginProtocolMetadata() { ConfigurationBuilder builder = ConfigurationBuilder.build() @@ -80,19 +105,16 @@ private void registerPluginAsSingleton( PluginDriver pluginDriver = pluginRegisterClz .getConstructor() .newInstance(); - if (pluginInstances.containsKey(pluginDriver.uuid())) { - throw new CloudRuntimeException( - String.format("duplicate plugin[class: %s]", pluginRegisterClz)); - } if (pluginValidators.containsKey(pluginRegisterClz)) { pluginValidators.get(pluginRegisterClz).validate(pluginDriver); } // String format all String methods of plugin from pluginRegister to logger.debug - logger.debug(String.format("register plugin[class: %s, productKey: %s, version: %s," + + logger.debug(String.format("%s[class: %s, productKey: %s, version: %s," + " capabilities: %s, description: %s, vendor: %s, url: %s," + " license: %s]", + pluginInstances.containsKey(pluginDriver.uuid()) ? "reload plugin" : "register plugin", pluginRegisterClz, pluginDriver.uuid(), pluginDriver.version(), @@ -119,6 +141,7 @@ private void registerPluginAsSingleton( vo.setDescription(pluginDriver.description()); vo.setVersion(pluginDriver.version()); vo.setLicense(pluginDriver.license()); + vo.setOptionTypes(JSONObjectUtil.toJsonString(pluginDriver.optionTypes())); dbf.persist(vo); } else { vo.setName(pluginDriver.name()); @@ -128,6 +151,7 @@ private void registerPluginAsSingleton( vo.setDescription(pluginDriver.description()); vo.setVersion(pluginDriver.version()); vo.setLicense(pluginDriver.license()); + vo.setOptionTypes(JSONObjectUtil.toJsonString(pluginDriver.optionTypes())); dbf.update(vo); } } catch (Exception e) { @@ -182,35 +206,23 @@ private void doVerification(String productName, String productKey) { // TODO: verify plugin driver } - private void collectPluginValidators() { - Platform.getReflections().getSubTypesOf(PluginValidator.class).forEach(clz -> { - if (!clz.getCanonicalName().contains("org.zstack.abstraction") - || !clz.isInterface()) { - return; - } - - if (pluginMetadata.contains(clz)) { - throw new CloudRuntimeException( - String.format("duplicate PluginValidator[name: %s]", clz)); - } - - try { - PluginValidator pluginValidator = clz - .getConstructor() - .newInstance(); - - pluginValidators.put(pluginValidator.pluginClass(), pluginValidator); - } catch (Exception e) { - throw new CloudRuntimeException(e); - } - }); + private void collectPluginValidators(Class validatorClazz) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { + PluginValidator pluginValidator = ((Class) validatorClazz).getConstructor().newInstance(); + pluginValidators.put(pluginValidator.pluginClass(), pluginValidator); } @Override public boolean start() { - collectPluginProtocolMetadata(); - collectPluginValidators(); - loadPluginsFromMetadata(); + if (CoreGlobalProperty.UNIT_TEST_ON) { + return true; + } + new Bash() { + @Override + protected void scripts() { + mkdirs(fileDirPath); + } + }.execute(); + scanAndLoadPlugins(fileDirPath); return true; } @@ -287,25 +299,144 @@ public T getPlugin(Class plugin public void handleMessage(Message msg) { if (msg instanceof APIRefreshPluginDriversMsg) { handle((APIRefreshPluginDriversMsg) msg); + } else if (msg instanceof APIDeletePluginDriversMsg) { + handle((APIDeletePluginDriversMsg) msg); + } else { + handleLocalMessage(msg); } } - private void cleanUp() { - pluginMetadata.clear(); - pluginInstances.clear(); - pluginRegisters.clear(); - pluginValidators.clear(); + private void handleLocalMessage(Message msg) { + if (msg instanceof RefreshPluginDriversMsg) { + handle((RefreshPluginDriversMsg) msg); + } else { + bus.dealWithUnknownMessage(msg); + } } - private void handle(APIRefreshPluginDriversMsg msg) { - APIRefreshPluginDrviersEvent event = new APIRefreshPluginDrviersEvent(msg.getId()); - cleanUp(); - collectPluginProtocolMetadata(); - collectPluginValidators(); - loadPluginsFromMetadata(); + protected List getJarFiles(String dirPath) { + File dir = new File(dirPath); + List jarFiles = new ArrayList<>(); + + if (!dir.exists() || !dir.isDirectory()) { + return jarFiles; + } + + File[] files = dir.listFiles((file) -> file.isFile() && file.getName().endsWith(".jar")); + if (files != null) { + for (File file : files) { + jarFiles.add(file); + } + } + return jarFiles; + } + + protected void loadPluginsFromJar(File jarFile) { + URL jarUrl = null; + try { + jarUrl = jarFile.toURI().toURL(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + try (URLClassLoader classLoader = new URLClassLoader(new URL[]{jarUrl}, getClass().getClassLoader())) { + try (JarFile jar = new JarFile(jarFile)) { + Enumeration entries = jar.entries(); + while (entries.hasMoreElements()) { + JarEntry entry = entries.nextElement(); + String entryName = entry.getName(); + if (!entryName.endsWith(".class")) { + continue; + } + + if (entryName.contains("$")) { + continue; + } + + if (entryName.contains("Test")) { + continue; + } + + String className = entryName.replace('/', '.').substring(0, entryName.length() - 6); + Class tempClazz = classLoader.loadClass(className); + if (className.contains("Validator")) { + collectPluginValidators(tempClazz); + continue; + } + + registerPluginAsSingleton((Class) tempClazz, (Class) tempClazz.getInterfaces()[0]); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + protected void scanAndLoadPlugins(String directoryPath) { + List jarFiles = getJarFiles(directoryPath); + for (File jarFile : jarFiles) { + loadPluginsFromJar(jarFile); + } + } + + private void handle(RefreshPluginDriversMsg msg) { + RefreshPluginDriversReply reply = new RefreshPluginDriversReply(); + thdf.chainSubmit(new ChainTask(msg) { + @Override + public String getSyncSignature() { + return getName(); + } + + @Override + public void run(SyncTaskChain chain) { + scanAndLoadPlugins(fileDirPath); + bus.reply(msg, reply); + chain.next(); + } + + @Override + public String getName() { + return String.format("refresh-%s-plugin-drivers", fileDirPath); + } + }); + } + + private void handle(APIDeletePluginDriversMsg msg) { + APIDeletePluginDriversEvent event = new APIDeletePluginDriversEvent(msg.getId()); + // TODO send msg to local and remote mn to delete plugin driver + pluginInstances.remove(msg.getUuid()); + dbf.removeByPrimaryKey(msg.getUuid(), PluginDriverVO.class); bus.publish(event); } + private void handle(APIRefreshPluginDriversMsg msg) { + APIRefreshPluginDriversEvent event = new APIRefreshPluginDriversEvent(msg.getId()); + new While<>(Q.New(ManagementNodeVO.class).select(ManagementNodeVO_.uuid).listValues()).step((mnUuid, com) -> { + RefreshPluginDriversMsg rmsg = new RefreshPluginDriversMsg(); + bus.makeServiceIdByManagementNodeId(rmsg, SERVICE_ID, (String) mnUuid); + bus.send(rmsg, new CloudBusCallBack(com) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + com.addError(reply.getError()); + com.allDone(); + return; + } + + com.done(); + } + }); + }, 2).run(new WhileDoneCompletion(msg) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + event.setError(errorCodeList.getCauses().get(0)); + } + + bus.publish(event); + } + }); + } + @Override public String getId() { return bus.makeLocalServiceId(SERVICE_ID); diff --git a/header/pom.xml b/header/pom.xml index 3a9ae6cab92..5272e42ef5a 100755 --- a/header/pom.xml +++ b/header/pom.xml @@ -147,5 +147,10 @@ org.apache.httpcomponents httpclient + + org.zstack + abstraction + 5.3.0 + diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversEvent.java b/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversEvent.java new file mode 100644 index 00000000000..f41883cc381 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversEvent.java @@ -0,0 +1,17 @@ +package org.zstack.header.core.external.plugin; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +@RestResponse +public class APIDeletePluginDriversEvent extends APIEvent { + public APIDeletePluginDriversEvent() { } + + public APIDeletePluginDriversEvent(String apiId) { + super(apiId); + } + + public static APIDeletePluginDriversEvent __example__() { + return new APIDeletePluginDriversEvent(); + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsg.java b/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsg.java new file mode 100644 index 00000000000..c7082f2932f --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsg.java @@ -0,0 +1,30 @@ +package org.zstack.header.core.external.plugin; + +import org.springframework.http.HttpMethod; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; + +@RestRequest( + path = "/external/plugins/{uuid}", + responseClass = APIRefreshPluginDriversEvent.class, + method = HttpMethod.DELETE +) +public class APIDeletePluginDriversMsg extends APIMessage { + @APIParam(resourceType = PluginDriverVO.class, successIfResourceNotExisting = true) + private String uuid; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public static APIDeletePluginDriversMsg __example__() { + APIDeletePluginDriversMsg msg = new APIDeletePluginDriversMsg(); + msg.setUuid(uuid()); + return msg; + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..f67578c0f39 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsgDoc_zh_cn.groovy @@ -0,0 +1,58 @@ +package org.zstack.header.core.external.plugin + +import org.zstack.header.core.external.plugin.APIRefreshPluginDriversEvent + +doc { + title "DeletePluginDrivers" + + category "external.plugin" + + desc """删除插件驱动器""" + + rest { + request { + url "DELETE /v1/external/plugins/{uuid}" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIDeletePluginDriversMsg.class + + desc """""" + + params { + + column { + name "uuid" + enclosedIn "" + desc "资源的UUID,唯一标示该资源" + location "url" + type "String" + optional false + since "5.3.0" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.0" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.0" + } + } + } + + response { + clz APIRefreshPluginDriversEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversEvent.java b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversEvent.java new file mode 100644 index 00000000000..f3d7970e087 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversEvent.java @@ -0,0 +1,17 @@ +package org.zstack.header.core.external.plugin; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +@RestResponse +public class APIRefreshPluginDriversEvent extends APIEvent { + public APIRefreshPluginDriversEvent() { } + + public APIRefreshPluginDriversEvent(String apiId) { + super(apiId); + } + + public static APIRefreshPluginDriversEvent __example__() { + return new APIRefreshPluginDriversEvent(); + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDrviersEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversEventDoc_zh_cn.groovy similarity index 96% rename from header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDrviersEventDoc_zh_cn.groovy rename to header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversEventDoc_zh_cn.groovy index 81f6901df38..784a83bace5 100644 --- a/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDrviersEventDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversEventDoc_zh_cn.groovy @@ -14,7 +14,7 @@ doc { } ref { name "error" - path "org.zstack.header.core.external.plugin.APIRefreshPluginDrviersEvent.error" + path "org.zstack.header.core.external.plugin.APIRefreshPluginDriversEvent.error" desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false type "ErrorCode" since "5.3.0" diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsg.java b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsg.java index 4fda75492b3..101acd50963 100644 --- a/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsg.java +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsg.java @@ -9,7 +9,7 @@ @RestRequest( path = "/external/plugins", isAction = true, - responseClass = APIRefreshPluginDrviersEvent.class, + responseClass = APIRefreshPluginDriversEvent.class, method = HttpMethod.PUT ) public class APIRefreshPluginDriversMsg extends APIMessage { diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsgDoc_zh_cn.groovy index ceef56bd2b4..35e4fff9888 100644 --- a/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsgDoc_zh_cn.groovy @@ -1,6 +1,6 @@ package org.zstack.header.core.external.plugin -import org.zstack.header.core.external.plugin.APIRefreshPluginDrviersEvent +import org.zstack.header.core.external.plugin.APIRefreshPluginDriversEvent doc { title "RefreshPluginDrivers" @@ -52,7 +52,7 @@ doc { } response { - clz APIRefreshPluginDrviersEvent.class + clz APIRefreshPluginDriversEvent.class } } } \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDrviersEvent.java b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDrviersEvent.java deleted file mode 100644 index 2c490947229..00000000000 --- a/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDrviersEvent.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.zstack.header.core.external.plugin; - -import org.zstack.header.message.APIEvent; -import org.zstack.header.rest.RestResponse; - -@RestResponse -public class APIRefreshPluginDrviersEvent extends APIEvent { - public APIRefreshPluginDrviersEvent() { } - - public APIRefreshPluginDrviersEvent(String apiId) { - super(apiId); - } - - public static APIRefreshPluginDrviersEvent __example__() { - return new APIRefreshPluginDrviersEvent(); - } -} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventory.java b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventory.java index 9d732c26f85..b1f04a89d4e 100644 --- a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventory.java +++ b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventory.java @@ -1,23 +1,32 @@ package org.zstack.header.core.external.plugin; +import org.zstack.abstraction.OptionType; import org.zstack.header.search.Inventory; +import org.zstack.utils.gson.JSONObjectUtil; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Set; @Inventory(mappingVOClass = PluginDriverVO.class) public class PluginDriverInventory { + private String uuid; private String name; private String type; private String vendor; private String features; + private Collection optionTypes; private String license; private String version; private String description; + private Timestamp createDate; + private Timestamp lastOpDate; public static PluginDriverInventory valueOf(PluginDriverVO vo) { PluginDriverInventory inv = new PluginDriverInventory(); + inv.setUuid(vo.getUuid()); inv.setName(vo.getName()); inv.setVendor(vo.getVendor()); inv.setFeatures(vo.getFeatures()); @@ -25,6 +34,9 @@ public static PluginDriverInventory valueOf(PluginDriverVO vo) { inv.setLicense(vo.getLicense()); inv.setVersion(vo.getVersion()); inv.setDescription(vo.getDescription()); + inv.setOptionTypes(JSONObjectUtil.toCollection(vo.getOptionTypes(), ArrayList.class, OptionType.class)); + inv.setCreateDate(vo.getCreateDate()); + inv.setLastOpDate(vo.getLastOpDate()); return inv; } @@ -36,6 +48,14 @@ public static List valueOf(Collection vos return invs; } + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + public String getName() { return name; } @@ -91,4 +111,28 @@ public String getDescription() { public void setDescription(String description) { this.description = description; } + + public Collection getOptionTypes() { + return optionTypes; + } + + public void setOptionTypes(Collection optionTypes) { + this.optionTypes = optionTypes; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } } diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO.java b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO.java index 0e11251df7c..922f6d465e6 100644 --- a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO.java +++ b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO.java @@ -6,6 +6,7 @@ import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Table; +import java.sql.Timestamp; @Entity @Table @@ -32,6 +33,15 @@ public class PluginDriverVO extends ResourceVO { @Column private String features; + @Column + private String optionTypes; + + @Column + private Timestamp createDate; + + @Column + private Timestamp lastOpDate; + public PluginDriverVO() { } @@ -44,6 +54,9 @@ public PluginDriverVO(PluginDriverVO other) { this.version = other.version; this.description = other.description; this.type = other.type; + this.optionTypes = other.optionTypes; + this.createDate = other.createDate; + this.lastOpDate = other.lastOpDate; } @Override @@ -111,4 +124,28 @@ public String getDescription() { public void setDescription(String description) { this.description = description; } + + public String getOptionTypes() { + return optionTypes; + } + + public void setOptionTypes(String optionTypes) { + this.optionTypes = optionTypes; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } } diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO_.java b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO_.java index 53ed3139756..1e3646f36ce 100644 --- a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO_.java +++ b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO_.java @@ -4,9 +4,17 @@ import javax.persistence.metamodel.SingularAttribute; import javax.persistence.metamodel.StaticMetamodel; +import java.sql.Timestamp; @StaticMetamodel(PluginDriverVO.class) public class PluginDriverVO_ extends ResourceVO_ { public static volatile SingularAttribute uuid; public static volatile SingularAttribute name; + public static volatile SingularAttribute vendor; + public static volatile SingularAttribute version; + public static volatile SingularAttribute type; + public static volatile SingularAttribute features; + public static volatile SingularAttribute optionTypes; + public static volatile SingularAttribute createDate; + public static volatile SingularAttribute lastOpDate; } diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/RBACInfo.java b/header/src/main/java/org/zstack/header/core/external/plugin/RBACInfo.java index eb5bc7f24a6..117a8ae28e1 100644 --- a/header/src/main/java/org/zstack/header/core/external/plugin/RBACInfo.java +++ b/header/src/main/java/org/zstack/header/core/external/plugin/RBACInfo.java @@ -10,7 +10,8 @@ public void permissions() { .name("external-plugin") .adminOnlyAPIs( APIQueryPluginDriversMsg.class, - APIRefreshPluginDriversMsg.class + APIRefreshPluginDriversMsg.class, + APIDeletePluginDriversMsg.class ).build(); } diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/RefreshPluginDriversMsg.java b/header/src/main/java/org/zstack/header/core/external/plugin/RefreshPluginDriversMsg.java new file mode 100644 index 00000000000..d5e3b892a23 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/RefreshPluginDriversMsg.java @@ -0,0 +1,15 @@ +package org.zstack.header.core.external.plugin; + +import org.zstack.header.message.NeedReplyMessage; + +public class RefreshPluginDriversMsg extends NeedReplyMessage { + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/RefreshPluginDriversReply.java b/header/src/main/java/org/zstack/header/core/external/plugin/RefreshPluginDriversReply.java new file mode 100644 index 00000000000..eb02a336d0e --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/RefreshPluginDriversReply.java @@ -0,0 +1,6 @@ +package org.zstack.header.core.external.plugin; + +import org.zstack.header.message.MessageReply; + +public class RefreshPluginDriversReply extends MessageReply { +} diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 7163f66477f..f580dd456ac 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -5,6 +5,8 @@ public class SourceClassMap { public final static HashMap srcToDstMapping = new HashMap() { { + put("org.zstack.abstraction.OptionType", "org.zstack.sdk.OptionType"); + put("org.zstack.abstraction.OptionType$InputType", "org.zstack.sdk.InputType"); put("org.zstack.accessKey.AccessKeyInventory", "org.zstack.sdk.AccessKeyInventory"); put("org.zstack.accessKey.AccessKeyState", "org.zstack.sdk.AccessKeyState"); put("org.zstack.ai.NginxRedirectRule", "org.zstack.sdk.NginxRedirectRule"); @@ -1037,6 +1039,7 @@ public class SourceClassMap { put("org.zstack.sdk.ImageStoreImageStruct", "org.zstack.storage.backup.imagestore.ImageStoreImageStruct"); put("org.zstack.sdk.InfoSecSecretResourcePoolInventory", "org.zstack.crypto.securitymachine.thirdparty.infoSec.InfoSecSecretResourcePoolInventory"); put("org.zstack.sdk.InfoSecSecurityMachineInventory", "org.zstack.crypto.securitymachine.thirdparty.infoSec.InfoSecSecurityMachineInventory"); + put("org.zstack.sdk.InputType", "org.zstack.abstraction.OptionType$InputType"); put("org.zstack.sdk.InstallPathRecycleInventory", "org.zstack.header.core.trash.InstallPathRecycleInventory"); put("org.zstack.sdk.InstanceOfferingInventory", "org.zstack.header.configuration.InstanceOfferingInventory"); put("org.zstack.sdk.IpCapacityData", "org.zstack.header.network.l3.datatypes.IpCapacityData"); @@ -1156,6 +1159,7 @@ public class SourceClassMap { put("org.zstack.sdk.ObservabilityServerOfferingInventory", "org.zstack.observabilityServer.ObservabilityServerOfferingInventory"); put("org.zstack.sdk.ObservabilityServerServiceDataInventory", "org.zstack.observabilityServer.service.ObservabilityServerServiceDataInventory"); put("org.zstack.sdk.ObservabilityServerVmInventory", "org.zstack.observabilityServer.ObservabilityServerVmInventory"); + put("org.zstack.sdk.OptionType", "org.zstack.abstraction.OptionType"); put("org.zstack.sdk.OssBucketInventory", "org.zstack.header.aliyun.oss.OssBucketInventory"); put("org.zstack.sdk.OssBucketProperty", "org.zstack.header.aliyun.oss.OssBucketProperty"); put("org.zstack.sdk.OvfCdDriverInfo", "org.zstack.ovf.datatype.OvfCdDriverInfo"); diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAiSiNoSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAiSiNoSecretResourcePoolAction.java index 8d33f4ce9a1..ddbea965e89 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAiSiNoSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAiSiNoSecretResourcePoolAction.java @@ -58,6 +58,9 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; + @Param(required = false, validValues = {"All","DataCrypto","Auth"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ability; + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; diff --git a/sdk/src/main/java/org/zstack/sdk/CreateCSPSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateCSPSecretResourcePoolAction.java index 6de8f1206b7..9e35e8f2243 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateCSPSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateCSPSecretResourcePoolAction.java @@ -55,6 +55,9 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; + @Param(required = false, validValues = {"All","DataCrypto","Auth"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ability; + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; diff --git a/sdk/src/main/java/org/zstack/sdk/CreateFiSecSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateFiSecSecretResourcePoolAction.java index 576f0cd8017..c9b526ce64b 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateFiSecSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateFiSecSecretResourcePoolAction.java @@ -37,6 +37,9 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; + @Param(required = false, validValues = {"All","DataCrypto","Auth"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ability; + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; diff --git a/sdk/src/main/java/org/zstack/sdk/CreateFlkSecSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateFlkSecSecretResourcePoolAction.java index e542f454d1c..32fea8d96e5 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateFlkSecSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateFlkSecSecretResourcePoolAction.java @@ -49,6 +49,9 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; + @Param(required = false, validValues = {"All","DataCrypto","Auth"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ability; + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; diff --git a/sdk/src/main/java/org/zstack/sdk/CreateHaiTaiSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateHaiTaiSecretResourcePoolAction.java index 6e71af6450b..328f7318e51 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateHaiTaiSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateHaiTaiSecretResourcePoolAction.java @@ -43,6 +43,9 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; + @Param(required = false, validValues = {"All","DataCrypto","Auth"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ability; + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; diff --git a/sdk/src/main/java/org/zstack/sdk/CreateInfoSecSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateInfoSecSecretResourcePoolAction.java index 2718c8cd155..fc2c435101a 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateInfoSecSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateInfoSecSecretResourcePoolAction.java @@ -37,6 +37,9 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; + @Param(required = false, validValues = {"All","DataCrypto","Auth"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ability; + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; diff --git a/sdk/src/main/java/org/zstack/sdk/CreateJitSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateJitSecretResourcePoolAction.java index efc9bc29f46..75a4e95b3b3 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateJitSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateJitSecretResourcePoolAction.java @@ -34,6 +34,9 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; + @Param(required = false, validValues = {"All","DataCrypto","Auth"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ability; + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; diff --git a/sdk/src/main/java/org/zstack/sdk/CreatePluginSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreatePluginSecretResourcePoolAction.java index 38d0ce2c491..1f16a69d019 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreatePluginSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreatePluginSecretResourcePoolAction.java @@ -25,12 +25,12 @@ public Result throwExceptionIfError() { } } - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String resourcePoolType; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.Map properties; + @Param(required = false, maxLength = 32, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String pluginDriverUuid; + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; @@ -40,6 +40,9 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; + @Param(required = false, validValues = {"All","DataCrypto","Auth"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ability; + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSanSecSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSanSecSecretResourcePoolAction.java index 67a86561609..6ccfbcdd68c 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSanSecSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSanSecSecretResourcePoolAction.java @@ -55,6 +55,9 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; + @Param(required = false, validValues = {"All","DataCrypto","Auth"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ability; + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePluginDriversAction.java b/sdk/src/main/java/org/zstack/sdk/DeletePluginDriversAction.java new file mode 100644 index 00000000000..c2de19f04ff --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeletePluginDriversAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeletePluginDriversAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.RefreshPluginDriversResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.RefreshPluginDriversResult value = res.getResult(org.zstack.sdk.RefreshPluginDriversResult.class); + ret.value = value == null ? new org.zstack.sdk.RefreshPluginDriversResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/external/plugins/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePluginDriversResult.java b/sdk/src/main/java/org/zstack/sdk/DeletePluginDriversResult.java new file mode 100644 index 00000000000..c7038dbde86 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeletePluginDriversResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeletePluginDriversResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/InputType.java b/sdk/src/main/java/org/zstack/sdk/InputType.java new file mode 100644 index 00000000000..ab1f0d2b570 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/InputType.java @@ -0,0 +1,17 @@ +package org.zstack.sdk; + +public enum InputType { + TEXT, + PASSWORD, + NUMBER, + TEXTAREA, + SELECT, + MULTI_SELECT, + CHECKBOX, + RADIO, + CREDENTIAL, + TYPEAHEAD, + MULTI_TYPEAHEAD, + CODE_EDITOR, + HIDDEN, +} diff --git a/sdk/src/main/java/org/zstack/sdk/OptionType.java b/sdk/src/main/java/org/zstack/sdk/OptionType.java new file mode 100644 index 00000000000..c3650c82054 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/OptionType.java @@ -0,0 +1,311 @@ +package org.zstack.sdk; + +import org.zstack.sdk.InputType; + +public class OptionType { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String code; + public void setCode(java.lang.String code) { + this.code = code; + } + public java.lang.String getCode() { + return this.code; + } + + public java.lang.String category; + public void setCategory(java.lang.String category) { + this.category = category; + } + public java.lang.String getCategory() { + return this.category; + } + + public java.lang.Boolean required; + public void setRequired(java.lang.Boolean required) { + this.required = required; + } + public java.lang.Boolean getRequired() { + return this.required; + } + + public java.lang.Boolean editable; + public void setEditable(java.lang.Boolean editable) { + this.editable = editable; + } + public java.lang.Boolean getEditable() { + return this.editable; + } + + public java.lang.Boolean enabled; + public void setEnabled(java.lang.Boolean enabled) { + this.enabled = enabled; + } + public java.lang.Boolean getEnabled() { + return this.enabled; + } + + public java.lang.Integer displayOrder; + public void setDisplayOrder(java.lang.Integer displayOrder) { + this.displayOrder = displayOrder; + } + public java.lang.Integer getDisplayOrder() { + return this.displayOrder; + } + + public InputType inputType; + public void setInputType(InputType inputType) { + this.inputType = inputType; + } + public InputType getInputType() { + return this.inputType; + } + + public java.lang.String placeHolderText; + public void setPlaceHolderText(java.lang.String placeHolderText) { + this.placeHolderText = placeHolderText; + } + public java.lang.String getPlaceHolderText() { + return this.placeHolderText; + } + + public java.lang.String defaultValue; + public void setDefaultValue(java.lang.String defaultValue) { + this.defaultValue = defaultValue; + } + public java.lang.String getDefaultValue() { + return this.defaultValue; + } + + public java.lang.String noSelection; + public void setNoSelection(java.lang.String noSelection) { + this.noSelection = noSelection; + } + public java.lang.String getNoSelection() { + return this.noSelection; + } + + public java.lang.Boolean noBlank; + public void setNoBlank(java.lang.Boolean noBlank) { + this.noBlank = noBlank; + } + public java.lang.Boolean getNoBlank() { + return this.noBlank; + } + + public java.lang.Boolean secretField; + public void setSecretField(java.lang.Boolean secretField) { + this.secretField = secretField; + } + public java.lang.Boolean getSecretField() { + return this.secretField; + } + + public java.lang.Long minVal; + public void setMinVal(java.lang.Long minVal) { + this.minVal = minVal; + } + public java.lang.Long getMinVal() { + return this.minVal; + } + + public java.lang.Long maxVal; + public void setMaxVal(java.lang.Long maxVal) { + this.maxVal = maxVal; + } + public java.lang.Long getMaxVal() { + return this.maxVal; + } + + public java.lang.Long minLength; + public void setMinLength(java.lang.Long minLength) { + this.minLength = minLength; + } + public java.lang.Long getMinLength() { + return this.minLength; + } + + public java.lang.Long maxLength; + public void setMaxLength(java.lang.Long maxLength) { + this.maxLength = maxLength; + } + public java.lang.Long getMaxLength() { + return this.maxLength; + } + + public java.lang.String fieldContext; + public void setFieldContext(java.lang.String fieldContext) { + this.fieldContext = fieldContext; + } + public java.lang.String getFieldContext() { + return this.fieldContext; + } + + public java.lang.String fieldClass; + public void setFieldClass(java.lang.String fieldClass) { + this.fieldClass = fieldClass; + } + public java.lang.String getFieldClass() { + return this.fieldClass; + } + + public java.lang.String fieldLabel; + public void setFieldLabel(java.lang.String fieldLabel) { + this.fieldLabel = fieldLabel; + } + public java.lang.String getFieldLabel() { + return this.fieldLabel; + } + + public java.lang.String fieldCode; + public void setFieldCode(java.lang.String fieldCode) { + this.fieldCode = fieldCode; + } + public java.lang.String getFieldCode() { + return this.fieldCode; + } + + public java.lang.String fieldName; + public void setFieldName(java.lang.String fieldName) { + this.fieldName = fieldName; + } + public java.lang.String getFieldName() { + return this.fieldName; + } + + public java.lang.String fieldGetName; + public void setFieldGetName(java.lang.String fieldGetName) { + this.fieldGetName = fieldGetName; + } + public java.lang.String getFieldGetName() { + return this.fieldGetName; + } + + public java.lang.String fieldSetName; + public void setFieldSetName(java.lang.String fieldSetName) { + this.fieldSetName = fieldSetName; + } + public java.lang.String getFieldSetName() { + return this.fieldSetName; + } + + public java.lang.String fieldGetContext; + public void setFieldGetContext(java.lang.String fieldGetContext) { + this.fieldGetContext = fieldGetContext; + } + public java.lang.String getFieldGetContext() { + return this.fieldGetContext; + } + + public java.lang.String fieldSetContext; + public void setFieldSetContext(java.lang.String fieldSetContext) { + this.fieldSetContext = fieldSetContext; + } + public java.lang.String getFieldSetContext() { + return this.fieldSetContext; + } + + public java.lang.String fieldGroup; + public void setFieldGroup(java.lang.String fieldGroup) { + this.fieldGroup = fieldGroup; + } + public java.lang.String getFieldGroup() { + return this.fieldGroup; + } + + public java.lang.String fieldGroupI18nCode; + public void setFieldGroupI18nCode(java.lang.String fieldGroupI18nCode) { + this.fieldGroupI18nCode = fieldGroupI18nCode; + } + public java.lang.String getFieldGroupI18nCode() { + return this.fieldGroupI18nCode; + } + + public java.lang.String helpText; + public void setHelpText(java.lang.String helpText) { + this.helpText = helpText; + } + public java.lang.String getHelpText() { + return this.helpText; + } + + public java.lang.String helpTextI18nCode; + public void setHelpTextI18nCode(java.lang.String helpTextI18nCode) { + this.helpTextI18nCode = helpTextI18nCode; + } + public java.lang.String getHelpTextI18nCode() { + return this.helpTextI18nCode; + } + + public java.lang.String optionSourceType; + public void setOptionSourceType(java.lang.String optionSourceType) { + this.optionSourceType = optionSourceType; + } + public java.lang.String getOptionSourceType() { + return this.optionSourceType; + } + + public java.lang.String optionSource; + public void setOptionSource(java.lang.String optionSource) { + this.optionSource = optionSource; + } + public java.lang.String getOptionSource() { + return this.optionSource; + } + + public java.lang.String dependsOn; + public void setDependsOn(java.lang.String dependsOn) { + this.dependsOn = dependsOn; + } + public java.lang.String getDependsOn() { + return this.dependsOn; + } + + public java.lang.Boolean showOnEdit; + public void setShowOnEdit(java.lang.Boolean showOnEdit) { + this.showOnEdit = showOnEdit; + } + public java.lang.Boolean getShowOnEdit() { + return this.showOnEdit; + } + + public java.lang.Boolean displayValueOnDetails; + public void setDisplayValueOnDetails(java.lang.Boolean displayValueOnDetails) { + this.displayValueOnDetails = displayValueOnDetails; + } + public java.lang.Boolean getDisplayValueOnDetails() { + return this.displayValueOnDetails; + } + + public java.lang.Boolean showOnCreate; + public void setShowOnCreate(java.lang.Boolean showOnCreate) { + this.showOnCreate = showOnCreate; + } + public java.lang.Boolean getShowOnCreate() { + return this.showOnCreate; + } + + public java.lang.String verifyPattern; + public void setVerifyPattern(java.lang.String verifyPattern) { + this.verifyPattern = verifyPattern; + } + public java.lang.String getVerifyPattern() { + return this.verifyPattern; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/PluginDriverInventory.java b/sdk/src/main/java/org/zstack/sdk/PluginDriverInventory.java index 50a895a670d..b987cc6fa13 100644 --- a/sdk/src/main/java/org/zstack/sdk/PluginDriverInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/PluginDriverInventory.java @@ -4,6 +4,14 @@ public class PluginDriverInventory { + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + public java.lang.String name; public void setName(java.lang.String name) { this.name = name; @@ -36,6 +44,14 @@ public java.lang.String getFeatures() { return this.features; } + public java.util.Collection optionTypes; + public void setOptionTypes(java.util.Collection optionTypes) { + this.optionTypes = optionTypes; + } + public java.util.Collection getOptionTypes() { + return this.optionTypes; + } + public java.lang.String license; public void setLicense(java.lang.String license) { this.license = license; @@ -60,4 +76,20 @@ public java.lang.String getDescription() { return this.description; } + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/PluginSecretResourcePoolInventory.java b/sdk/src/main/java/org/zstack/sdk/PluginSecretResourcePoolInventory.java index 94cce27e48c..a8a5cd8feb1 100644 --- a/sdk/src/main/java/org/zstack/sdk/PluginSecretResourcePoolInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/PluginSecretResourcePoolInventory.java @@ -12,4 +12,12 @@ public java.lang.String getProperties() { return this.properties; } + public java.lang.String pluginDriverUuid; + public void setPluginDriverUuid(java.lang.String pluginDriverUuid) { + this.pluginDriverUuid = pluginDriverUuid; + } + public java.lang.String getPluginDriverUuid() { + return this.pluginDriverUuid; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversAction.java b/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversAction.java index b412b01a93d..c68eb5f9909 100644 --- a/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversAction.java @@ -12,7 +12,7 @@ public class RefreshPluginDriversAction extends AbstractAction { public static class Result { public ErrorCode error; - public org.zstack.sdk.RefreshPluginDrviersResult value; + public org.zstack.sdk.RefreshPluginDriversResult value; public Result throwExceptionIfError() { if (error != null) { @@ -60,8 +60,8 @@ private Result makeResult(ApiResult res) { return ret; } - org.zstack.sdk.RefreshPluginDrviersResult value = res.getResult(org.zstack.sdk.RefreshPluginDrviersResult.class); - ret.value = value == null ? new org.zstack.sdk.RefreshPluginDrviersResult() : value; + org.zstack.sdk.RefreshPluginDriversResult value = res.getResult(org.zstack.sdk.RefreshPluginDriversResult.class); + ret.value = value == null ? new org.zstack.sdk.RefreshPluginDriversResult() : value; return ret; } diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversResult.java b/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversResult.java new file mode 100644 index 00000000000..84bda1da810 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class RefreshPluginDriversResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshPluginDrviersResult.java b/sdk/src/main/java/org/zstack/sdk/RefreshPluginDrviersResult.java deleted file mode 100644 index 7861cd8716c..00000000000 --- a/sdk/src/main/java/org/zstack/sdk/RefreshPluginDrviersResult.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.zstack.sdk; - - - -public class RefreshPluginDrviersResult { - -} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdatePluginSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/UpdatePluginSecretResourcePoolAction.java new file mode 100644 index 00000000000..f90210e0adc --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdatePluginSecretResourcePoolAction.java @@ -0,0 +1,116 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdatePluginSecretResourcePoolAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UpdateSecretResourcePoolResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map properties; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String model; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) + public java.lang.Integer heartbeatInterval; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UpdateSecretResourcePoolResult value = res.getResult(org.zstack.sdk.UpdateSecretResourcePoolResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateSecretResourcePoolResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/secret-resource-pool/plugin/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updatePluginSecretResourcePool"; + return info; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index f6eea6b087d..a8c2d1a8401 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -15623,6 +15623,33 @@ abstract class ApiHelper { } + def deletePluginDrivers(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePluginDriversAction.class) Closure c) { + def a = new org.zstack.sdk.DeletePluginDriversAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def deletePolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePolicyAction.class) Closure c) { def a = new org.zstack.sdk.DeletePolicyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -23399,6 +23426,7 @@ abstract class ApiHelper { } + def getPortForwardingAttachableVmNics(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPortForwardingAttachableVmNicsAction.class) Closure c) { def a = new org.zstack.sdk.GetPortForwardingAttachableVmNicsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -44207,6 +44235,33 @@ abstract class ApiHelper { } + def updatePluginSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePluginSecretResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.UpdatePluginSecretResourcePoolAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def updatePolicyRouteRuleSet(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePolicyRouteRuleSetAction.class) Closure c) { def a = new org.zstack.sdk.UpdatePolicyRouteRuleSetAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 1ccb6cadd4d9a93a6518577ceb53c6a1e6c96bd0 Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Tue, 14 Jan 2025 16:51:56 +0800 Subject: [PATCH 325/737] [conf]: support IAM2VirtualIDRoleRef Integrity Resolves: ZSTAC-71605 Change-Id: I7663716056776e69676171777467616e766c6e64 --- conf/db/upgrade/V5.3.28__schema.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/db/upgrade/V5.3.28__schema.sql b/conf/db/upgrade/V5.3.28__schema.sql index 9952f0ffd7f..0a400f5e1d1 100644 --- a/conf/db/upgrade/V5.3.28__schema.sql +++ b/conf/db/upgrade/V5.3.28__schema.sql @@ -47,6 +47,8 @@ DELIMITER ; CALL createThickProvisionVolumeTag(); DROP PROCEDURE IF EXISTS createThickProvisionVolumeTag; +ALTER TABLE `zstack`.`EncryptionIntegrityVO` MODIFY COLUMN `resourceUuid` varchar(128) NOT NULL; + CREATE TABLE `zstack`.`ObservabilityServerOfferingVO`( `uuid` varchar(32) NOT NULL UNIQUE, `managementNetworkUuid` varchar(32) DEFAULT NULL, From 00a6b00f5e07ee9cf62bcc119eaad0f52ef1deb7 Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Fri, 17 Jan 2025 15:04:06 +0800 Subject: [PATCH 326/737] [crypto]: implement soft delete for plugins Resolves: ZSTAC-72668 Change-Id: I7a6d72668a707062636c716c657669776c6d6379 --- conf/db/upgrade/V4.5.1__schema.sql | 1 + conf/serviceConfig/plugin.xml | 2 + conf/springConfigXml/plugin.xml | 6 +++ .../core/plugin/PluginApiInterceptor.java | 33 +++++++++++++ .../zstack/core/plugin/PluginManagerImpl.java | 49 +++++++++++++++++-- ...PIDeletePluginDriversEventDoc_zh_cn.groovy | 23 +++++++++ .../plugin/APIDeletePluginDriversMsg.java | 5 +- .../APIDeletePluginDriversMsgDoc_zh_cn.groovy | 13 ++++- .../plugin/DeletePluginDriversMsg.java | 34 +++++++++++++ .../plugin/DeletePluginDriversReply.java | 6 +++ .../plugin/PluginDriverInventory.java | 11 ++++- .../core/external/plugin/PluginDriverVO.java | 12 +++++ .../core/external/plugin/PluginDriverVO_.java | 2 +- .../plugin/PluginDriversExtensionPoint.java | 7 +++ .../zstack/sdk/DeletePluginDriversAction.java | 9 ++-- .../org/zstack/sdk/PluginDriverInventory.java | 8 +++ 16 files changed, 207 insertions(+), 14 deletions(-) create mode 100644 core/src/main/java/org/zstack/core/plugin/PluginApiInterceptor.java create mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversEventDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/DeletePluginDriversMsg.java create mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/DeletePluginDriversReply.java create mode 100644 header/src/main/java/org/zstack/header/core/external/plugin/PluginDriversExtensionPoint.java diff --git a/conf/db/upgrade/V4.5.1__schema.sql b/conf/db/upgrade/V4.5.1__schema.sql index b3e05712a9f..c1f2d2ab05c 100644 --- a/conf/db/upgrade/V4.5.1__schema.sql +++ b/conf/db/upgrade/V4.5.1__schema.sql @@ -6,6 +6,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`PluginDriverVO` ( `features` varchar(1024) NOT NULL, `optionTypes` text DEFAULT NULL, `description` varchar(1024) DEFAULT NULL, + `deleted` BOOLEAN NOT NULL, `license` varchar(1024) DEFAULT NULL, `version` varchar(1024) DEFAULT NULL, `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, diff --git a/conf/serviceConfig/plugin.xml b/conf/serviceConfig/plugin.xml index 74c849aba8a..366d4d10b1b 100644 --- a/conf/serviceConfig/plugin.xml +++ b/conf/serviceConfig/plugin.xml @@ -1,6 +1,8 @@ external.plugin + PluginApiInterceptor + org.zstack.header.core.external.plugin.APIQueryPluginDriversMsg query diff --git a/conf/springConfigXml/plugin.xml b/conf/springConfigXml/plugin.xml index dd04d349e81..743bca51ec0 100644 --- a/conf/springConfigXml/plugin.xml +++ b/conf/springConfigXml/plugin.xml @@ -15,4 +15,10 @@ + + + + + + diff --git a/core/src/main/java/org/zstack/core/plugin/PluginApiInterceptor.java b/core/src/main/java/org/zstack/core/plugin/PluginApiInterceptor.java new file mode 100644 index 00000000000..41769af5596 --- /dev/null +++ b/core/src/main/java/org/zstack/core/plugin/PluginApiInterceptor.java @@ -0,0 +1,33 @@ +package org.zstack.core.plugin; + +import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.componentloader.PluginRegistry; +import org.zstack.header.apimediator.ApiMessageInterceptionException; +import org.zstack.header.apimediator.ApiMessageInterceptor; +import org.zstack.header.core.external.plugin.APIDeletePluginDriversMsg; +import org.zstack.header.core.external.plugin.PluginDriversExtensionPoint; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.message.APIMessage; + +class PluginApiInterceptor implements ApiMessageInterceptor { + @Autowired + protected PluginRegistry pluginRgty; + + @Override + public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionException { + if (msg instanceof APIDeletePluginDriversMsg) { + validate((APIDeletePluginDriversMsg) msg); + } + + return msg; + } + + private void validate(APIDeletePluginDriversMsg msg) { + for (PluginDriversExtensionPoint ext : pluginRgty.getExtensionList(PluginDriversExtensionPoint.class)) { + ErrorCode result = ext.validateDeletePluginDrivers(msg.getUuid()); + if (result != null) { + throw new ApiMessageInterceptionException(result); + } + } + } +} diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java index 7da45768810..46099e107eb 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java +++ b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java @@ -15,6 +15,7 @@ import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; +import org.zstack.core.db.SQL; import org.zstack.core.thread.ChainTask; import org.zstack.core.thread.SyncTaskChain; import org.zstack.core.thread.ThreadFacade; @@ -26,6 +27,7 @@ import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.managementnode.ManagementNodeVO; import org.zstack.header.managementnode.ManagementNodeVO_; +import org.zstack.header.message.APIDeleteMessage; import org.zstack.header.message.Message; import org.zstack.header.message.MessageReply; import org.zstack.utils.Bash; @@ -40,6 +42,7 @@ import java.net.URL; import java.net.URLClassLoader; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.jar.JarEntry; import java.util.jar.JarFile; @@ -59,7 +62,7 @@ public class PluginManagerImpl extends AbstractService implements PluginManager private ThreadFacade thdf; private final Set> pluginMetadata = new HashSet<>(); - private final Map pluginInstances = new HashMap<>(); + private final Map pluginInstances = new ConcurrentHashMap<>(); private final Map, List> pluginRegisters = new HashMap<>(); private final Map, PluginValidator> @@ -309,6 +312,8 @@ public void handleMessage(Message msg) { private void handleLocalMessage(Message msg) { if (msg instanceof RefreshPluginDriversMsg) { handle((RefreshPluginDriversMsg) msg); + } else if (msg instanceof DeletePluginDriversMsg) { + handle((DeletePluginDriversMsg) msg); } else { bus.dealWithUnknownMessage(msg); } @@ -400,12 +405,46 @@ public String getName() { }); } + private void handle(DeletePluginDriversMsg msg) { + DeletePluginDriversReply reply = new DeletePluginDriversReply(); + pluginInstances.remove(msg.getUuid()); + if (msg.getDeletionMode() == APIDeleteMessage.DeletionMode.Permissive) { + SQL.New(PluginDriverVO.class).eq(PluginDriverVO_.uuid, msg.getUuid()).set(PluginDriverVO_.deleted, true).update(); + } else { + SQL.New(PluginDriverVO.class).eq(PluginDriverVO_.uuid, msg.getUuid()).hardDelete(); + } + bus.reply(msg, reply); + } + private void handle(APIDeletePluginDriversMsg msg) { APIDeletePluginDriversEvent event = new APIDeletePluginDriversEvent(msg.getId()); - // TODO send msg to local and remote mn to delete plugin driver - pluginInstances.remove(msg.getUuid()); - dbf.removeByPrimaryKey(msg.getUuid(), PluginDriverVO.class); - bus.publish(event); + new While<>(Q.New(ManagementNodeVO.class).select(ManagementNodeVO_.uuid).listValues()).step((mnUuid, com) -> { + DeletePluginDriversMsg rmsg = new DeletePluginDriversMsg(); + rmsg.setUuid(msg.getUuid()); + rmsg.setDeletionMode(msg.getDeletionMode()); + bus.makeServiceIdByManagementNodeId(rmsg, SERVICE_ID, (String) mnUuid); + bus.send(rmsg, new CloudBusCallBack(com) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + com.addError(reply.getError()); + com.allDone(); + return; + } + + com.done(); + } + }); + }, 2).run(new WhileDoneCompletion(msg) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + event.setError(errorCodeList.getCauses().get(0)); + } + + bus.publish(event); + } + }); } private void handle(APIRefreshPluginDriversMsg msg) { diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..c3d54078b5c --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversEventDoc_zh_cn.groovy @@ -0,0 +1,23 @@ +package org.zstack.header.core.external.plugin + +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "删除插件驱动器" + + field { + name "success" + desc "删除结果" + type "boolean" + since "5.3.20" + } + ref { + name "error" + path "org.zstack.header.core.external.plugin.APIDeletePluginDriversEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.20" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsg.java b/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsg.java index c7082f2932f..4393f927f72 100644 --- a/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsg.java +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsg.java @@ -1,16 +1,17 @@ package org.zstack.header.core.external.plugin; import org.springframework.http.HttpMethod; +import org.zstack.header.message.APIDeleteMessage; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; import org.zstack.header.rest.RestRequest; @RestRequest( path = "/external/plugins/{uuid}", - responseClass = APIRefreshPluginDriversEvent.class, + responseClass = APIDeletePluginDriversEvent.class, method = HttpMethod.DELETE ) -public class APIDeletePluginDriversMsg extends APIMessage { +public class APIDeletePluginDriversMsg extends APIDeleteMessage { @APIParam(resourceType = PluginDriverVO.class, successIfResourceNotExisting = true) private String uuid; diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsgDoc_zh_cn.groovy index f67578c0f39..9066b39da17 100644 --- a/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsgDoc_zh_cn.groovy @@ -1,6 +1,6 @@ package org.zstack.header.core.external.plugin -import org.zstack.header.core.external.plugin.APIRefreshPluginDriversEvent +import org.zstack.header.core.external.plugin.APIDeletePluginDriversEvent doc { title "DeletePluginDrivers" @@ -48,11 +48,20 @@ doc { optional true since "5.3.0" } + column { + name "deleteMode" + enclosedIn "" + desc "删除模式(Permissive / Enforcing,Permissive)" + location "body" + type "String" + optional true + since "5.3.20" + } } } response { - clz APIRefreshPluginDriversEvent.class + clz APIDeletePluginDriversEvent.class } } } \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/DeletePluginDriversMsg.java b/header/src/main/java/org/zstack/header/core/external/plugin/DeletePluginDriversMsg.java new file mode 100644 index 00000000000..2873496cfda --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/DeletePluginDriversMsg.java @@ -0,0 +1,34 @@ +package org.zstack.header.core.external.plugin; + +import org.apache.commons.lang.StringUtils; +import org.zstack.header.message.APIDeleteMessage; +import org.zstack.header.message.NeedReplyMessage; + +public class DeletePluginDriversMsg extends NeedReplyMessage { + private String uuid; + private String deletionMode; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public void setDeletionMode(APIDeleteMessage.DeletionMode deletionMode) { + this.deletionMode = deletionMode.toString(); + } + + public APIDeleteMessage.DeletionMode getDeletionMode() { + return StringUtils.isEmpty(deletionMode) ? APIDeleteMessage.DeletionMode.Permissive : APIDeleteMessage.DeletionMode.valueOf(deletionMode); + } + + public String getDeletionModeString() { + return StringUtils.isEmpty(deletionMode) ? APIDeleteMessage.DeletionMode.Permissive.toString() : deletionMode; + } + + public void setDeletionMode(String deletionMode) { + this.deletionMode = deletionMode; + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/DeletePluginDriversReply.java b/header/src/main/java/org/zstack/header/core/external/plugin/DeletePluginDriversReply.java new file mode 100644 index 00000000000..780fac1b165 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/DeletePluginDriversReply.java @@ -0,0 +1,6 @@ +package org.zstack.header.core.external.plugin; + +import org.zstack.header.message.MessageReply; + +public class DeletePluginDriversReply extends MessageReply { +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventory.java b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventory.java index b1f04a89d4e..4cfd3f89c9f 100644 --- a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventory.java +++ b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventory.java @@ -8,7 +8,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Set; @Inventory(mappingVOClass = PluginDriverVO.class) public class PluginDriverInventory { @@ -18,6 +17,7 @@ public class PluginDriverInventory { private String vendor; private String features; private Collection optionTypes; + private boolean deleted; private String license; private String version; private String description; @@ -37,6 +37,7 @@ public static PluginDriverInventory valueOf(PluginDriverVO vo) { inv.setOptionTypes(JSONObjectUtil.toCollection(vo.getOptionTypes(), ArrayList.class, OptionType.class)); inv.setCreateDate(vo.getCreateDate()); inv.setLastOpDate(vo.getLastOpDate()); + inv.setDeleted(vo.isDeleted()); return inv; } @@ -48,6 +49,14 @@ public static List valueOf(Collection vos return invs; } + public boolean isDeleted() { + return deleted; + } + + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } + public String getUuid() { return uuid; } diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO.java b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO.java index 922f6d465e6..f1586aca36c 100644 --- a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO.java +++ b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO.java @@ -42,6 +42,9 @@ public class PluginDriverVO extends ResourceVO { @Column private Timestamp lastOpDate; + @Column + private boolean deleted = false; + public PluginDriverVO() { } @@ -57,6 +60,15 @@ public PluginDriverVO(PluginDriverVO other) { this.optionTypes = other.optionTypes; this.createDate = other.createDate; this.lastOpDate = other.lastOpDate; + this.deleted = other.deleted; + } + + public boolean isDeleted() { + return deleted; + } + + public void setDeleted(boolean deleted) { + this.deleted = deleted; } @Override diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO_.java b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO_.java index 1e3646f36ce..c79ce6ff7d2 100644 --- a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO_.java +++ b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO_.java @@ -8,13 +8,13 @@ @StaticMetamodel(PluginDriverVO.class) public class PluginDriverVO_ extends ResourceVO_ { - public static volatile SingularAttribute uuid; public static volatile SingularAttribute name; public static volatile SingularAttribute vendor; public static volatile SingularAttribute version; public static volatile SingularAttribute type; public static volatile SingularAttribute features; public static volatile SingularAttribute optionTypes; + public static volatile SingularAttribute deleted; public static volatile SingularAttribute createDate; public static volatile SingularAttribute lastOpDate; } diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriversExtensionPoint.java b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriversExtensionPoint.java new file mode 100644 index 00000000000..0d31571c267 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriversExtensionPoint.java @@ -0,0 +1,7 @@ +package org.zstack.header.core.external.plugin; + +import org.zstack.header.errorcode.ErrorCode; + +public interface PluginDriversExtensionPoint { + ErrorCode validateDeletePluginDrivers(String pluginUuid); +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePluginDriversAction.java b/sdk/src/main/java/org/zstack/sdk/DeletePluginDriversAction.java index c2de19f04ff..82c84c6b842 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeletePluginDriversAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeletePluginDriversAction.java @@ -12,7 +12,7 @@ public class DeletePluginDriversAction extends AbstractAction { public static class Result { public ErrorCode error; - public org.zstack.sdk.RefreshPluginDriversResult value; + public org.zstack.sdk.DeletePluginDriversResult value; public Result throwExceptionIfError() { if (error != null) { @@ -28,6 +28,9 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + @Param(required = false) public java.util.List systemTags; @@ -60,8 +63,8 @@ private Result makeResult(ApiResult res) { return ret; } - org.zstack.sdk.RefreshPluginDriversResult value = res.getResult(org.zstack.sdk.RefreshPluginDriversResult.class); - ret.value = value == null ? new org.zstack.sdk.RefreshPluginDriversResult() : value; + org.zstack.sdk.DeletePluginDriversResult value = res.getResult(org.zstack.sdk.DeletePluginDriversResult.class); + ret.value = value == null ? new org.zstack.sdk.DeletePluginDriversResult() : value; return ret; } diff --git a/sdk/src/main/java/org/zstack/sdk/PluginDriverInventory.java b/sdk/src/main/java/org/zstack/sdk/PluginDriverInventory.java index b987cc6fa13..f3a2b687134 100644 --- a/sdk/src/main/java/org/zstack/sdk/PluginDriverInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/PluginDriverInventory.java @@ -52,6 +52,14 @@ public java.util.Collection getOptionTypes() { return this.optionTypes; } + public boolean deleted; + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } + public boolean getDeleted() { + return this.deleted; + } + public java.lang.String license; public void setLicense(java.lang.String license) { this.license = license; From 972cff502b34ad782159527fe4699ea4f2247494 Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Sat, 8 Feb 2025 15:37:33 +0800 Subject: [PATCH 327/737] [crypto]: add original text field for auth signing Resolves: ZSTAC-71412 Change-Id: I6a6171412e726e726e6a726d6c73686f67757766 --- .../zstack/abstraction/crypto/CryptoClientDriver.java | 11 +++++++++++ .../org/zstack/core/plugin/PluginManagerImpl.java | 9 ++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/abstraction/src/main/java/org/zstack/abstraction/crypto/CryptoClientDriver.java b/abstraction/src/main/java/org/zstack/abstraction/crypto/CryptoClientDriver.java index 0b0f888f91d..7602905bb85 100644 --- a/abstraction/src/main/java/org/zstack/abstraction/crypto/CryptoClientDriver.java +++ b/abstraction/src/main/java/org/zstack/abstraction/crypto/CryptoClientDriver.java @@ -4,6 +4,7 @@ import org.zstack.abstraction.PluginDriver; import java.util.Collection; +import java.util.HashMap; import java.util.Map; public interface CryptoClientDriver extends PluginDriver { @@ -23,6 +24,16 @@ public interface CryptoClientDriver extends PluginDriver { */ byte[][] attachedVerify(String input); + /** + * Retrieves additional signature properties. + * + * @return A map containing additional signature properties, + * where each key-value pair represents a signature-related configuration or metadata. + */ + default Map additionSignatureProperties(){ + return new HashMap<>(); + }; + /** * Return SM3 encrypted cipher text * diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java index 46099e107eb..8b00c79fa7e 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java +++ b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java @@ -353,7 +353,8 @@ protected void loadPluginsFromJar(File jarFile) { continue; } - if (entryName.contains("$")) { + if (entryName.matches(".*\\d.*")) { + // eg: org.zstack.CipherOnCloudCryptoPlugin$1.class continue; } @@ -368,6 +369,12 @@ protected void loadPluginsFromJar(File jarFile) { continue; } + // Skip anonymous classes or inner classes (which are named with $) + // Anonymous classes or inner classes are typically not needed for plugin registration + if (entryName.contains("$")) { + continue; + } + registerPluginAsSingleton((Class) tempClazz, (Class) tempClazz.getInterfaces()[0]); } } From 5006013fa405b94e51c79262aef3e41a1eea3c6b Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Wed, 26 Mar 2025 11:31:52 +0800 Subject: [PATCH 328/737] [conf]: update resource pool event alarm information Resolves: ZSTAC-73798 Change-Id: I71717379856f6f69697865796d7a7867786d6f77 --- conf/db/upgrade/V4.5.1__schema.sql | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V4.5.1__schema.sql b/conf/db/upgrade/V4.5.1__schema.sql index c1f2d2ab05c..dd000f18e5c 100644 --- a/conf/db/upgrade/V4.5.1__schema.sql +++ b/conf/db/upgrade/V4.5.1__schema.sql @@ -31,4 +31,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`PluginSecretResourcePoolVO` ( PRIMARY KEY (`uuid`), CONSTRAINT fkPluginSecretResourcePoolVOSecretResourcePoolVO FOREIGN KEY (uuid) REFERENCES SecretResourcePoolVO (uuid) ON DELETE CASCADE, CONSTRAINT fkPluginSecretResourcePoolVOPluginDriverVO FOREIGN KEY (pluginDriverUuid) REFERENCES PluginDriverVO (uuid) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +update EventSubscriptionVO set name='Cryptographic Resource Status Abnormal' where uuid='eecc7b576c05391bb01fd956964d3ba4'; +update SystemTagVO set tag='name::cn::密码资源状态异常' where resourceUuid='eecc7b576c05391bb01fd956964d3ba4'; \ No newline at end of file From e1ad2f73bf7a7336a6f255c963b944aba0e0f9c4 Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Fri, 28 Mar 2025 17:16:12 +0800 Subject: [PATCH 329/737] [core]: resolve queue blocking issue after plugin upload failure Resolves: ZSTAC-74106 Change-Id: I726b7410666c667274647473786b6179767a736b --- .../main/java/org/zstack/core/plugin/PluginManagerImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java index 8b00c79fa7e..fbd646d0fa8 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java +++ b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java @@ -378,8 +378,8 @@ protected void loadPluginsFromJar(File jarFile) { registerPluginAsSingleton((Class) tempClazz, (Class) tempClazz.getInterfaces()[0]); } } - } catch (Exception e) { - e.printStackTrace(); + } catch (Throwable t) { + logger.error(String.format("Error occurred while scanning and loading plugins from: %s", jarFile.getAbsolutePath()), t); } } From 0b755a7e14631f9e796bc73dd726fc778d7497bf Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Thu, 10 Apr 2025 01:56:47 -0400 Subject: [PATCH 330/737] [sdk]: Update the SDK to resolve the conflict Resolves: ZSTAC-71363 Change-Id: I7767136369666f666d727279726c66736b736b62 --- conf/db/upgrade/V4.5.1__schema.sql | 2 +- core/src/main/java/org/zstack/core/plugin/PluginManager.java | 2 -- .../org/zstack/sdk/CreateKoAlSecretResourcePoolAction.java | 3 +++ 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/conf/db/upgrade/V4.5.1__schema.sql b/conf/db/upgrade/V4.5.1__schema.sql index dd000f18e5c..19c73e40162 100644 --- a/conf/db/upgrade/V4.5.1__schema.sql +++ b/conf/db/upgrade/V4.5.1__schema.sql @@ -34,4 +34,4 @@ CREATE TABLE IF NOT EXISTS `zstack`.`PluginSecretResourcePoolVO` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; update EventSubscriptionVO set name='Cryptographic Resource Status Abnormal' where uuid='eecc7b576c05391bb01fd956964d3ba4'; -update SystemTagVO set tag='name::cn::密码资源状态异常' where resourceUuid='eecc7b576c05391bb01fd956964d3ba4'; \ No newline at end of file +update SystemTagVO set tag='name::cn::密码资源状态异常' where resourceUuid='eecc7b576c05391bb01fd956964d3ba4'; diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManager.java b/core/src/main/java/org/zstack/core/plugin/PluginManager.java index caa2b103d42..4e1b78c33d2 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginManager.java +++ b/core/src/main/java/org/zstack/core/plugin/PluginManager.java @@ -1,8 +1,6 @@ package org.zstack.core.plugin; import org.zstack.abstraction.PluginDriver; -import org.zstack.core.CoreGlobalProperty; -import org.zstack.utils.path.PathUtil; import java.util.List; diff --git a/sdk/src/main/java/org/zstack/sdk/CreateKoAlSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateKoAlSecretResourcePoolAction.java index 46a67de4a8d..2a9614a5347 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateKoAlSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateKoAlSecretResourcePoolAction.java @@ -43,6 +43,9 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; + @Param(required = false, validValues = {"All","DataCrypto","Auth"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ability; + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; From dbe0e8aca84f35c5eb1c0525bd47e187d9feaaa6 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Fri, 11 Apr 2025 10:07:25 +0800 Subject: [PATCH 331/737] [kvm]: Use ping task recorded vm state to skip api ops - Libvirt event should be ignored during api ops from control plane when the api required skip vm trace. Control plane is required to finish all changes but not based on agent event - Add more checks to libvirt guest shutdown event and skip if current vm is during api ops from control plane which do not need vm state sync based on @SkipVmTracer Test: - Add not called assert to message notifier in testlib Resolves: ZSTAC-73509 Change-Id: I787162786a696b73796f7a6d74747a7362767469 Signed-off-by: ye.zou --- .../java/org/zstack/kvm/KVMHostFactory.java | 81 ++++++++++++++----- .../org/zstack/kvm/KvmVmSyncPingTask.java | 4 + .../main/java/org/zstack/testlib/Test.groovy | 4 + 3 files changed, 71 insertions(+), 18 deletions(-) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java index 38130e12f41..1f68d830713 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java @@ -7,21 +7,22 @@ import org.zstack.compute.vm.CrashStrategy; import org.zstack.compute.vm.VmGlobalConfig; import org.zstack.compute.vm.VmNicManager; -import org.zstack.core.config.*; -import org.zstack.core.config.schema.GuestOsCharacter; -import org.zstack.header.errorcode.ErrorCode; -import org.zstack.header.network.l2.*; -import org.zstack.header.tag.SystemTagInventory; -import org.zstack.header.tag.SystemTagLifeCycleListener; -import org.zstack.header.tag.SystemTagValidator; -import org.zstack.header.vm.devices.VmInstanceDeviceManager; -import org.zstack.network.l3.ServiceTypeExtensionPoint; -import org.zstack.resourceconfig.ResourceConfig; -import org.zstack.resourceconfig.ResourceConfigFacade; import org.zstack.core.CoreGlobalProperty; import org.zstack.core.ansible.AnsibleFacade; -import org.zstack.core.cloudbus.*; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.cloudbus.CloudBusListCallBack; +import org.zstack.core.cloudbus.CloudBusSteppingCallback; +import org.zstack.core.cloudbus.EventFacade; +import org.zstack.core.cloudbus.MessageSafe; +import org.zstack.core.cloudbus.ResourceDestinationMaker; import org.zstack.core.componentloader.PluginRegistry; +import org.zstack.core.config.GlobalConfig; +import org.zstack.core.config.GlobalConfigException; +import org.zstack.core.config.GlobalConfigFacade; +import org.zstack.core.config.GlobalConfigUpdateExtensionPoint; +import org.zstack.core.config.GlobalConfigValidatorExtensionPoint; +import org.zstack.core.config.GuestOsExtensionPoint; +import org.zstack.core.config.schema.GuestOsCharacter; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.core.db.SQL; @@ -33,6 +34,7 @@ import org.zstack.header.AbstractService; import org.zstack.header.Component; import org.zstack.header.apimediator.ApiMessageInterceptionException; +import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.host.*; @@ -40,14 +42,37 @@ import org.zstack.header.message.Message; import org.zstack.header.message.MessageReply; import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.network.l2.L2NetworkClusterRefVO; +import org.zstack.header.network.l2.L2NetworkClusterRefVO_; +import org.zstack.header.network.l2.L2NetworkType; +import org.zstack.header.network.l2.L2NetworkVO; +import org.zstack.header.network.l2.L2NetworkVO_; import org.zstack.header.rest.RESTFacade; import org.zstack.header.rest.SyncHttpCallHandler; import org.zstack.header.tag.FormTagExtensionPoint; -import org.zstack.header.vm.*; -import org.zstack.header.volume.*; -import org.zstack.kvm.KVMAgentCommands.ReconnectMeCmd; -import org.zstack.kvm.KVMAgentCommands.TransmitVmOperationToMnCmd; -import org.zstack.header.host.HostNetworkInterfaceServiceType; +import org.zstack.header.tag.SystemTagInventory; +import org.zstack.header.tag.SystemTagLifeCycleListener; +import org.zstack.header.tag.SystemTagValidator; +import org.zstack.header.vm.KvmReportVmShutdownEventMsg; +import org.zstack.header.vm.KvmReportVmShutdownFromGuestEventMsg; +import org.zstack.header.vm.RebootVmInstanceMsg; +import org.zstack.header.vm.StartVmInstanceMsg; +import org.zstack.header.vm.StopVmInstanceMsg; +import org.zstack.header.vm.VmCanonicalEvents; +import org.zstack.header.vm.VmInstanceConstant; +import org.zstack.header.vm.VmInstanceState; +import org.zstack.header.vm.VmInstanceVO; +import org.zstack.header.vm.VmInstanceVO_; +import org.zstack.header.vm.devices.VmInstanceDeviceManager; +import org.zstack.header.volume.MaxDataVolumeNumberExtensionPoint; +import org.zstack.header.volume.VolumeConstant; +import org.zstack.header.volume.VolumeFormat; +import org.zstack.header.volume.VolumeInventory; +import org.zstack.header.volume.VolumeVO; +import org.zstack.kvm.KVMAgentCommands.*; +import org.zstack.network.l3.ServiceTypeExtensionPoint; +import org.zstack.resourceconfig.ResourceConfig; +import org.zstack.resourceconfig.ResourceConfigFacade; import org.zstack.utils.CollectionUtils; import org.zstack.utils.IpRangeSet; import org.zstack.utils.SizeUtils; @@ -69,7 +94,14 @@ import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; @@ -131,6 +163,8 @@ public class KVMHostFactory extends AbstractService implements HypervisorFactory private VmNicManager vmNicManager; @Autowired private GlobalConfigFacade gcf; + @Autowired + KvmVmSyncPingTask pingTask; private Future checkSocketChannelTimeoutThread; public static int skipHostPingTimeWhenKvmagentBusy = 300; @@ -526,6 +560,17 @@ public String handleSyncHttpCall(TransmitVmOperationToMnCmd cmd) { }); restf.registerSyncHttpCallHandler(KVMConstant.KVM_REPORT_VM_SHUTDOWN_EVENT, ReportVmShutdownEventCmd.class, cmd -> { + if (cmd.vmUuid == null || !Q.New(VmInstanceVO.class) + .eq(VmInstanceVO_.uuid, cmd.vmUuid) + .isExists()) { + logger.debug(String.format("vm[uuid:%s] not found, skip report vm shutdown event", cmd.vmUuid)); + } + + if (pingTask.isVmDoNotNeedToTrace(cmd.vmUuid)) { + logger.debug(String.format("vm[uuid:%s] is not in the list of vm that need to be traced, skip report vm shutdown event", cmd.vmUuid)); + return null; + } + KvmReportVmShutdownEventMsg msg = new KvmReportVmShutdownEventMsg(); msg.setVmInstanceUuid(cmd.vmUuid); bus.makeTargetServiceIdByResourceUuid(msg, VmInstanceConstant.SERVICE_ID, cmd.vmUuid); diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KvmVmSyncPingTask.java b/plugin/kvm/src/main/java/org/zstack/kvm/KvmVmSyncPingTask.java index 487c0664af8..af1a8718800 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KvmVmSyncPingTask.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KvmVmSyncPingTask.java @@ -457,4 +457,8 @@ public void iJoin(ManagementNodeInventory inv) { vmApis.putIfAbsent(inv.getUuid(), new ConcurrentHashMap<>()); vmsToSkip.putIfAbsent(inv.getUuid(), ConcurrentHashMap.newKeySet()); } + + public boolean isVmDoNotNeedToTrace(String vmUuid) { + return vmsToSkip.values().stream().anyMatch(vmsToSkipSet -> vmsToSkipSet.contains(vmUuid)); + } } diff --git a/testlib/src/main/java/org/zstack/testlib/Test.groovy b/testlib/src/main/java/org/zstack/testlib/Test.groovy index 9003da73d3f..de15b0e2e64 100755 --- a/testlib/src/main/java/org/zstack/testlib/Test.groovy +++ b/testlib/src/main/java/org/zstack/testlib/Test.groovy @@ -514,6 +514,10 @@ abstract class Test extends ApiHelper implements Retry { assert counter.get() > 0 } + void assertNotCalled() { + assert counter.get() == 0 + } + void assertCalledOnce() { assert counter.get() == 1 } From 7ed8f00a33db131e71d7f0b9fc41bcc73ac1d77a Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Thu, 10 Apr 2025 15:20:15 +0800 Subject: [PATCH 332/737] [plugin]: clean snap before cleaning volume during image cache GC Resolves: ZSTAC-73493 Change-Id: I6d6c6574707773756668776b6c7570716e787478 --- .../java/org/zstack/expon/ExponApiHelper.java | 24 ++++++++++++++++++- .../zstack/expon/ExponStorageController.java | 3 +-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/plugin/expon/src/main/java/org/zstack/expon/ExponApiHelper.java b/plugin/expon/src/main/java/org/zstack/expon/ExponApiHelper.java index 84dfcf4ffb4..a75fb54f7fc 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/ExponApiHelper.java +++ b/plugin/expon/src/main/java/org/zstack/expon/ExponApiHelper.java @@ -328,7 +328,19 @@ public void deleteVolume(String volId, boolean force) { req.setForce(force); callErrorOut(req, DeleteVolumeResponse.class); } - + + public void deleteVolumeAndSnapshots(String volId, boolean force) { + List snaps = queryVolumeSnapshots(volId); + snaps.forEach(snap -> { + String addedIscsiClientId = getSnapshotAttachedIscsiClientGroups(snap.getId()).stream().findFirst().orElse(null); + if (addedIscsiClientId != null) { + removeSnapshotFromIscsiClientGroup(snap.getId(), addedIscsiClientId); + } + deleteVolumeSnapshot(snap.getId(), true); + }); + deleteVolume(volId, force); + } + public VolumeModule cloneVolume(String snapId, String name, ExponVolumeQos qos) { CloneVolumeRequest req = new CloneVolumeRequest(); req.setSnapshotId(snapId); @@ -420,6 +432,16 @@ public void deleteVolumeSnapshot(String snapId, boolean force) { callIgnoringSpecificErrors(req, DeleteVolumeSnapshotResponse.class, ExponError.SNAPSHOT_NOT_FOUND); } + public List queryVolumeSnapshots(String volId) { + QueryVolumeSnapshotRequest req = new QueryVolumeSnapshotRequest(); + req.addCond("volume_id", volId); + QueryVolumeSnapshotResponse rsp = queryErrorOut(req, QueryVolumeSnapshotResponse.class); + if (rsp.getTotal() == 0) { + return new ArrayList<>(); + } + return rsp.getSnaps().stream().filter(it -> it.getVolumeId().equals(volId)).collect(Collectors.toList()); + } + public VolumeSnapshotModule queryVolumeSnapshot(String name) { QueryVolumeSnapshotRequest req = new QueryVolumeSnapshotRequest(); req.addCond("name", name); diff --git a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java index 6624857ac89..0b7ee6f86f8 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java +++ b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java @@ -21,7 +21,6 @@ import org.zstack.expon.sdk.uss.UssGatewayModule; import org.zstack.expon.sdk.vhost.VhostControllerModule; import org.zstack.expon.sdk.volume.ExponVolumeQos; -import org.zstack.expon.sdk.volume.GetVolumeBoundPathResponse; import org.zstack.expon.sdk.volume.VolumeModule; import org.zstack.expon.sdk.volume.VolumeSnapshotModule; import org.zstack.header.core.Completion; @@ -1039,7 +1038,7 @@ public void deleteVolume(String installPath, Completion comp) { @Override public void deleteVolumeAndSnapshot(String installPath, Completion comp) { String volId = getVolIdFromPath(installPath); - apiHelper.deleteVolume(volId, true); + apiHelper.deleteVolumeAndSnapshots(volId, true); comp.success(); } From ff9bf211259d26a2d8898d089f2abc1b339b6f50 Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Fri, 11 Apr 2025 13:17:33 +0800 Subject: [PATCH 333/737] [imagecache]: fix unable to clear image cache If fast cloning is performed on the data volume, it will result in image cache filtering error, further causing the image cache to be unable to be cleared Resolves/Related: ZSTAC-71233 Change-Id: I6d716679646d74726e69726b7968636667746b6f --- .../VolumeSnapshotReferenceUtils.java | 3 +- ...CleanImageCacheOnPrimaryStorageCase.groovy | 35 ++++++++++++++++--- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java index ee69b3922d5..2c534aac1b1 100644 --- a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java @@ -355,7 +355,8 @@ public static List filterStaleImageCache(List ids) { return SQL.New("select c.id from ImageCacheVO c" + " where c.id in (:ids)" + - " and c.imageUuid not in (select tree.rootImageUuid from VolumeSnapshotReferenceTreeVO tree)", Long.class) + " and c.imageUuid not in (select tree.rootImageUuid from VolumeSnapshotReferenceTreeVO tree" + + " where tree.rootImageUuid is not null)", Long.class) .param("ids", ids) .list(); } diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/nfs/imagecleaner/imagecache/CleanImageCacheOnPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/nfs/imagecleaner/imagecache/CleanImageCacheOnPrimaryStorageCase.groovy index bd4746aee79..113d78caa8a 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/nfs/imagecleaner/imagecache/CleanImageCacheOnPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/nfs/imagecleaner/imagecache/CleanImageCacheOnPrimaryStorageCase.groovy @@ -3,28 +3,28 @@ package org.zstack.test.integration.storage.primary.nfs.imagecleaner.imagecache import org.springframework.http.HttpEntity import org.zstack.compute.vm.VmGlobalConfig import org.zstack.core.db.DatabaseFacade +import org.zstack.core.db.Q import org.zstack.core.db.SimpleQuery import org.zstack.header.image.ImageDeletionPolicyManager import org.zstack.header.network.service.NetworkServiceType import org.zstack.header.storage.primary.ImageCacheVO import org.zstack.header.storage.primary.ImageCacheVO_ +import org.zstack.header.storage.snapshot.reference.VolumeSnapshotReferenceTreeVO +import org.zstack.header.storage.snapshot.reference.VolumeSnapshotReferenceTreeVO_ import org.zstack.header.vm.VmInstanceDeletionPolicyManager import org.zstack.image.ImageGlobalConfig import org.zstack.network.securitygroup.SecurityGroupConstant import org.zstack.network.service.virtualrouter.VirtualRouterConstant -import org.zstack.sdk.ImageInventory -import org.zstack.sdk.PrimaryStorageInventory -import org.zstack.sdk.VmInstanceInventory +import org.zstack.sdk.* import org.zstack.storage.primary.nfs.NfsPrimaryStorageKVMBackend import org.zstack.storage.primary.nfs.NfsPrimaryStorageKVMBackendCommands +import org.zstack.storage.volume.VolumeSystemTags import org.zstack.test.integration.storage.StorageTest import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase import org.zstack.utils.data.SizeUnit import org.zstack.utils.gson.JSONObjectUtil import org.zstack.utils.path.PathUtil -import java.util.concurrent.TimeUnit - /** * 1. two NFS storage running two VMs with the same image * 2. delete the image and two VMs @@ -207,7 +207,31 @@ class CleanImageCacheOnPrimaryStorageCase extends SubCase{ } } + void fastCloneVmBeforeDeletingImageCache() { + def volume = createDataVolume { + name = "test fast clone" + diskOfferingUuid = env.inventoryByName("diskOffering").uuid + primaryStorageUuid = env.inventoryByName("nfs").uuid + } as VolumeInventory + + def sp = createVolumeSnapshot { + name = "sp" + volumeUuid = volume.uuid + } as VolumeSnapshotInventory + + createDataVolumeFromVolumeSnapshot { + name = "data-vol-from-sp" + volumeSnapshotUuid = sp.uuid + systemTags = [VolumeSystemTags.FAST_CREATE.tagFormat] + primaryStorageUuid = env.inventoryByName("nfs").uuid + } + + assert Q.New(VolumeSnapshotReferenceTreeVO.class).isNull(VolumeSnapshotReferenceTreeVO_.rootImageUuid).isExists() + } + void testDelete(){ + fastCloneVmBeforeDeletingImageCache() + dbf = bean(DatabaseFacade.class) PrimaryStorageInventory nfs = env.inventoryByName("nfs") @@ -264,6 +288,7 @@ class CleanImageCacheOnPrimaryStorageCase extends SubCase{ c = q.find() assert null != c + q = dbf.createQuery(ImageCacheVO.class) q.add(ImageCacheVO_.imageUuid, SimpleQuery.Op.EQ, image1.getUuid()) q.add(ImageCacheVO_.primaryStorageUuid, SimpleQuery.Op.EQ, nfs.getUuid()) c = q.find() From 1a91aa7f0e984c635a79f3024d57b91f72ea0c64 Mon Sep 17 00:00:00 2001 From: J M Date: Mon, 3 Mar 2025 16:53:15 +0800 Subject: [PATCH 334/737] [storage]: relate root image uuid to snapshot chain do not delete image cache which only volume snapshot chain base. add snapshot tree missing rootImageUuid if current is True, treat snapshot tree root image as volume root image DBImpact Resolves: ZSTAC-66608 Change-Id: I62796975706d706378756164617773627a61786c Change-Id: I6f6871747864676966706761646b69716a68717a --- conf/db/upgrade/V5.3.28__schema.sql | 8 +- .../local/LocalStorageImageCleaner.java | 86 +++++++++++++++--- .../storage/primary/ImageCacheCleaner.java | 89 +++++++------------ .../snapshot/VolumeSnapshotManagerImpl.java | 10 ++- 4 files changed, 123 insertions(+), 70 deletions(-) diff --git a/conf/db/upgrade/V5.3.28__schema.sql b/conf/db/upgrade/V5.3.28__schema.sql index 0a400f5e1d1..74495fc0896 100644 --- a/conf/db/upgrade/V5.3.28__schema.sql +++ b/conf/db/upgrade/V5.3.28__schema.sql @@ -104,4 +104,10 @@ CREATE TABLE IF NOT EXISTS `zstack`.`LogServerVO` ( CALL ADD_COLUMN('GuestVmScriptEO', 'encodingType', 'VARCHAR(32)', 1, 'PlainText'); CALL ADD_COLUMN('GuestVmScriptExecutedRecordVO', 'encodingType', 'VARCHAR(32)', 1, 'PlainText'); DROP VIEW IF EXISTS `zstack`.`GuestVmScriptVO`; -CREATE VIEW `zstack`.`GuestVmScriptVO` AS SELECT uuid, name, description, platform, encodingType, scriptContent, renderParams, scriptType, scriptTimeout, version, createDate, lastOpDate FROM `zstack`.`GuestVmScriptEO` WHERE deleted IS NULL; \ No newline at end of file +CREATE VIEW `zstack`.`GuestVmScriptVO` AS SELECT uuid, name, description, platform, encodingType, scriptContent, renderParams, scriptType, scriptTimeout, version, createDate, lastOpDate FROM `zstack`.`GuestVmScriptEO` WHERE deleted IS NULL; + +UPDATE `zstack`.`VolumeSnapshotTreeVO` t JOIN `zstack`.`VolumeVO` v ON t.volumeUuid = v.uuid +SET t.rootImageUuid = v.rootImageUuid +WHERE t.current = true + AND v.rootImageUuid IS NOT NULL + AND t.rootImageUuid IS NULL; diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageImageCleaner.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageImageCleaner.java index 0ff5b51fa4a..5a042a0b3c3 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageImageCleaner.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageImageCleaner.java @@ -37,6 +37,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * Created by xing5 on 2016/7/20. @@ -67,17 +68,33 @@ public void setForce(boolean force) { @Transactional protected List createShadowImageCacheVOsForNewDeletedAndOld(String psUUid) { - List staleImageCacheIds; + // 1. images has been deleted + List staleImageCacheIds = new ArrayList<>(); + List imageDeletedCacheIds = getStaleImageCacheIds(psUUid); + if (!CollectionUtils.isEmpty(imageDeletedCacheIds)) { + staleImageCacheIds.addAll(imageDeletedCacheIds); + } + if (force){ - staleImageCacheIds = getStaleImageCacheIdsForLocalStorage(psUUid); - } else { - staleImageCacheIds = getStaleImageCacheIds(psUUid); + // 2. no vm used but image is not deleted + // FIXME: it means nothing. think about host ref. + String sql; + if (psUUid == null) { + sql = "select c.id from ImageCacheVO c, PrimaryStorageVO pri where c.imageUuid not in (select vm.imageUuid from VmInstanceVO vm) and" + + " c.primaryStorageUuid = pri.uuid and pri.type = :psType"; + staleImageCacheIds.addAll(SQL.New(sql).param("psType", getPrimaryStorageType()).list()); + } else { + sql = "select c.id from ImageCacheVO c, PrimaryStorageVO pri where c.imageUuid not in (select vm.imageUuid from VmInstanceVO vm) and" + + " c.primaryStorageUuid = pri.uuid and pri.type = :psType and pri.uuid = :psUuid"; + staleImageCacheIds.addAll(SQL.New(sql).param("psType", getPrimaryStorageType()).param("psUuid", psUUid).list()); + } } - if (staleImageCacheIds == null || staleImageCacheIds.isEmpty()) { + if (staleImageCacheIds.isEmpty()) { return null; } + staleImageCacheIds = staleImageCacheIds.stream().distinct().collect(Collectors.toList()); String sql = "select c from ImageCacheVO c where c.id in (:ids)"; TypedQuery cq = dbf.getEntityManager().createQuery(sql, ImageCacheVO.class); cq.setParameter("ids", staleImageCacheIds); @@ -102,17 +119,64 @@ protected List createShadowImageCacheVOsForNewDeletedAndOld( sql = "select vol.rootImageUuid from VolumeVO vol where vol.rootImageUuid is not null and vol.status = :status"; TypedQuery query = dbf.getEntityManager().createQuery(sql, String.class); - query = dbf.getEntityManager().createQuery(sql, String.class); query.setParameter("status", VolumeStatus.NotInstantiated); List filterIds = query.getResultList(); + // 3. no volume reference + if (psUUid == null) { + sql = "select c.id from ImageCacheVO c" + + " where c.imageUuid not in" + + " (select vol.rootImageUuid from VolumeVO vol, LocalStorageResourceRefVO ref" + + " where vol.uuid = ref.resourceUuid" + + " and ref.resourceType = :rtype" + + " and ref.hostUuid = :huuid" + + " and vol.rootImageUuid is not null)" + + " and c.id in (:ids)"; + } else { + sql = "select c.id from ImageCacheVO c" + + " where c.imageUuid not in" + + " (select vol.rootImageUuid from VolumeVO vol, LocalStorageResourceRefVO ref" + + " where vol.uuid = ref.resourceUuid" + + " and ref.resourceType = :rtype" + + " and ref.hostUuid = :huuid" + + " and ref.primaryStorageUuid = :psUuid" + + " and vol.rootImageUuid is not null)" + + " and c.id in (:ids)"; + } + TypedQuery iq = dbf.getEntityManager().createQuery(sql, Long.class); + iq.setParameter("rtype", VolumeVO.class.getSimpleName()); + iq.setParameter("huuid", hostUuid); + if (psUUid != null) { + iq.setParameter("psUuid", psUUid); + } + iq.setParameter("ids", cacheIds); + cacheIds = iq.getResultList(); + if (cacheIds.isEmpty()) { + continue; + } + + // 4. no volume snapshot tree reference if (psUUid == null) { - sql = "select c from ImageCacheVO c where c.imageUuid not in (select vol.rootImageUuid from VolumeVO vol, LocalStorageResourceRefVO ref" + - " where vol.uuid = ref.resourceUuid and ref.resourceType = :rtype and ref.hostUuid = :huuid and vol.rootImageUuid is not null) and c.id in (:ids)"; + sql = "select c from ImageCacheVO c" + + " where c.imageUuid not in" + + " (select tree.rootImageUuid from VolumeSnapshotTreeVO tree, LocalStorageResourceRefVO ref" + + " where tree.volumeUuid = ref.resourceUuid" + + " and ref.resourceType = :rtype" + + " and ref.hostUuid = :huuid" + + " and tree.rootImageUuid is not null)" + + " and c.id in (:ids)"; } else { - sql = "select c from ImageCacheVO c where c.imageUuid not in (select vol.rootImageUuid from VolumeVO vol, LocalStorageResourceRefVO ref" + - " where vol.uuid = ref.resourceUuid and ref.resourceType = :rtype and ref.hostUuid = :huuid and ref.primaryStorageUuid = :psUuid and vol.rootImageUuid is not null) and c.id in (:ids)"; + sql = "select c from ImageCacheVO c" + + " where c.imageUuid not in" + + " (select tree.rootImageUuid from VolumeSnapshotTreeVO tree, LocalStorageResourceRefVO ref" + + " where tree.volumeUuid = ref.resourceUuid" + + " and ref.resourceType = :rtype" + + " and ref.hostUuid = :huuid" + + " and ref.primaryStorageUuid = :psUuid" + + " and tree.rootImageUuid is not null)" + + " and c.id in (:ids)"; } + cq = dbf.getEntityManager().createQuery(sql, ImageCacheVO.class); cq.setParameter("rtype", VolumeVO.class.getSimpleName()); cq.setParameter("huuid", hostUuid); @@ -120,8 +184,8 @@ protected List createShadowImageCacheVOsForNewDeletedAndOld( cq.setParameter("psUuid", psUUid); } cq.setParameter("ids", cacheIds); - List results = cq.getResultList(); + List results = cq.getResultList(); results.removeIf(c -> filterIds.contains(c.getImageUuid())); stale.addAll(results); diff --git a/storage/src/main/java/org/zstack/storage/primary/ImageCacheCleaner.java b/storage/src/main/java/org/zstack/storage/primary/ImageCacheCleaner.java index 98f22742abf..4a83b78c6f1 100755 --- a/storage/src/main/java/org/zstack/storage/primary/ImageCacheCleaner.java +++ b/storage/src/main/java/org/zstack/storage/primary/ImageCacheCleaner.java @@ -289,7 +289,7 @@ public void run() { } @Transactional - protected List getStaleImageCacheIds(String psUuid) { + protected boolean volumeFindMissingImageUuid(String psUuid) { String sql; if (psUuid == null) { sql = "select count(*) from VolumeVO vol, PrimaryStorageVO pri where vol.primaryStorageUuid = pri.uuid" + @@ -312,9 +312,24 @@ protected List getStaleImageCacheIds(String psUuid) { "1. zstack-ctl stop_node\n" + "2. zstack-ctl start_node -DfixImageCacheUuid=true -DrootVolumeFindMissingImageUuid=true\n" + "to fix the problem. For the data safety, we won't clean the image cache of the primary storage", count, getPrimaryStorageType())); + return true; + } + + return false; + } + + /*** + * + * @param psUuid image cache to be cleaned up on the primary storage, if null, clean up same type of primary storage + * @return image cache ids whose image is expunged + */ + @Transactional + protected List getStaleImageCacheIds(String psUuid) { + if (volumeFindMissingImageUuid(psUuid)) { return null; } + String sql; if (psUuid == null) { sql = "select c.id from ImageCacheVO c, PrimaryStorageVO pri, ImageEO i where c.primaryStorageUuid = pri.uuid and i.uuid = c.imageUuid and i.deleted is not null and pri.type = :ptype"; } else { @@ -350,75 +365,39 @@ protected List getStaleImageCacheIds(String psUuid) { return VolumeSnapshotReferenceUtils.filterStaleImageCache(deleted); } - @Transactional - protected List getStaleImageCacheIdsForLocalStorage(String psUuid) { - String sql; - Long count; - if (psUuid == null) { - sql = "select count(*) from VolumeVO vol, PrimaryStorageVO pri where vol.primaryStorageUuid = pri.uuid" + - " and vol.type = :volType and vol.rootImageUuid is null and pri.type = :psType"; - count = SQL.New(sql).param("volType", VolumeType.Root).param("psType", getPrimaryStorageType()).find(); - - } else { - sql = "select count(*) from VolumeVO vol, PrimaryStorageVO pri where vol.primaryStorageUuid = pri.uuid" + - " and vol.type = :volType and vol.rootImageUuid is null and pri.type = :psType and pri.uuid = :psUuid"; - count = SQL.New(sql).param("volType", VolumeType.Root).param("psType", getPrimaryStorageType()).param("psUuid", psUuid).find(); - } - - if (count != 0) { - logger.warn(String.format("found %s volumes on the primary storage[type:%s] has NULL rootImageUuid. Please do following:\n" + - "1. zstack-ctl stop_node\n" + - "2. zstack-ctl start_node -DfixImageCacheUuid=true -DrootVolumeFindMissingImageUuid=true\n" + - "to fix the problem. For the data safety, we won't clean the image cache of the primary storage", count, getPrimaryStorageType())); - return null; - } - - List deleted; - if (psUuid == null) { - sql = "select c.id from ImageCacheVO c, PrimaryStorageVO pri, ImageEO i where c.primaryStorageUuid = pri.uuid and i.uuid = c.imageUuid and i.deleted is not null and pri.type = :ptype"; - deleted=SQL.New(sql).param("ptype", getPrimaryStorageType()).list(); - } else { - sql = "select c.id from ImageCacheVO c, PrimaryStorageVO pri, ImageEO i where c.primaryStorageUuid = pri.uuid and i.uuid = c.imageUuid and i.deleted is not null and pri.type = :ptype and pri.uuid = :psUuid"; - deleted=SQL.New(sql).param("ptype", getPrimaryStorageType()).param("psUuid", psUuid).list(); - } - - if (psUuid == null) { - sql = "select c.id from ImageCacheVO c, PrimaryStorageVO pri where c.imageUuid not in (select vm.imageUuid from VmInstanceVO vm) and" + - " c.primaryStorageUuid = pri.uuid and pri.type = :psType"; - deleted.addAll(SQL.New(sql).param("psType", getPrimaryStorageType()).list()); - } else { - sql = "select c.id from ImageCacheVO c, PrimaryStorageVO pri where c.imageUuid not in (select vm.imageUuid from VmInstanceVO vm) and" + - " c.primaryStorageUuid = pri.uuid and pri.type = :psType and pri.uuid = :psUuid"; - deleted.addAll(SQL.New(sql).param("psType", getPrimaryStorageType()).param("psUuid", psUuid).list()); - } - - if (deleted.isEmpty()) { - return null; - } - - return VolumeSnapshotReferenceUtils.filterStaleImageCache(deleted); - } @Transactional protected List createShadowImageCacheVOsForNewDeletedAndOld(String psUuid) { + // 1. image has been deleted List staleImageCacheIds = getStaleImageCacheIds(psUuid); if (staleImageCacheIds == null || staleImageCacheIds.isEmpty()) { return null; } - String sql = "select c from ImageCacheVO c where c.imageUuid not in (select vol.rootImageUuid from VolumeVO vol where vol.rootImageUuid is not null) and c.id in (:ids)"; - TypedQuery cq = dbf.getEntityManager().createQuery(sql, ImageCacheVO.class); + // 2. no volume refers to the image + String sql = "select c.id from ImageCacheVO c" + + " where c.imageUuid not in (select vol.rootImageUuid from VolumeVO vol where vol.rootImageUuid is not null)" + + " and c.id in (:ids)"; + TypedQuery cq = dbf.getEntityManager().createQuery(sql, Long.class); cq.setParameter("ids", staleImageCacheIds); - List stale = cq.getResultList(); + staleImageCacheIds = cq.getResultList(); - if (stale.isEmpty()) { + if (staleImageCacheIds.isEmpty()) { return null; } + // 3. no volume snapshot tree refers to the image + sql = "select c from ImageCacheVO c" + + " where c.imageUuid not in (select tree.rootImageUuid from VolumeSnapshotTreeVO tree where tree.rootImageUuid is not null)" + + " and c.id in (:ids)"; + TypedQuery tq = dbf.getEntityManager().createQuery(sql, ImageCacheVO.class); + tq.setParameter("ids", staleImageCacheIds); + List stales = tq.getResultList(); + logger.debug(String.format("found %s stale images in cache on the primary storage[type:%s], they are about to be cleaned up", - stale.size(), getPrimaryStorageType())); + stales.size(), getPrimaryStorageType())); - for (ImageCacheVO vo : stale) { + for (ImageCacheVO vo : stales) { dbf.getEntityManager().persist(new ImageCacheShadowVO(vo)); dbf.getEntityManager().remove(vo); } diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java index 006ec27251b..4285ec348c8 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java @@ -36,8 +36,6 @@ import org.zstack.header.storage.snapshot.*; import org.zstack.header.storage.snapshot.group.*; import org.zstack.header.storage.snapshot.reference.VolumeSnapshotReferenceMessage; -import org.zstack.header.storage.snapshot.reference.VolumeSnapshotReferenceVO; -import org.zstack.header.storage.snapshot.reference.VolumeSnapshotReferenceVO_; import org.zstack.header.vm.*; import org.zstack.header.vm.devices.VmInstanceDeviceManager; import org.zstack.header.volume.*; @@ -536,7 +534,6 @@ private void handle(APIGetVolumeSnapshotTreeMsg msg) { } */ - @Transactional private VolumeSnapshotStruct newChain(VolumeSnapshotVO vo, boolean fullsnapshot) { new SQLBatch() { @Override @@ -546,6 +543,13 @@ protected void scripts() { chain.setVolumeUuid(vo.getVolumeUuid()); chain.setUuid(Platform.getUuid()); chain.setStatus(VolumeSnapshotTreeStatus.Creating); + if (!fullsnapshot) { + String rootImageUuid = Q.New(VolumeVO.class).eq(VolumeVO_.uuid, vo.getVolumeUuid()) + .select(VolumeVO_.rootImageUuid) + .findValue(); + chain.setRootImageUuid(rootImageUuid); + } + chain = dbf.getEntityManager().merge(chain); logger.debug(String.format("created new volume snapshot tree[tree uuid:%s, volume uuid:%s, full snapshot uuid:%s]", From 2725bc2233d930414e80b0fce2de6985bcaeff1e Mon Sep 17 00:00:00 2001 From: "yingzhe.hu" Date: Mon, 23 Sep 2024 11:25:20 +0800 Subject: [PATCH 335/737] [sdk]: support cbt DBImpact Resolves: ZSTAC-69311 Change-Id: I696a647a716a6a646264766e6b67766663777968 --- .../zstack/compute/host/HostGlobalConfig.java | 3 + conf/db/upgrade/V5.3.28__schema.sql | 22 ++ .../header/volume/CreateDataVolumeMsg.java | 78 +++++++ .../ceph/primary/CephPrimaryStorageBase.java | 10 + .../src/main/java/org/zstack/kvm/KVMHost.java | 5 +- .../storage/zbs/ZbsPrimaryStorageMdsBase.java | 6 +- .../storage/zbs/ZbsStorageController.java | 12 + sdk/src/main/java/SourceClassMap.java | 34 +++ .../org/zstack/sdk/BaseVirtualDeviceTO.java | 23 ++ .../java/org/zstack/sdk/CbtTaskInventory.java | 63 ++++++ .../sdk/CbtTaskResourceRefInventory.java | 55 +++++ .../java/org/zstack/sdk/CbtTaskStatus.java | 8 + sdk/src/main/java/org/zstack/sdk/CdRomTO.java | 23 ++ .../org/zstack/sdk/CreateCbtTaskAction.java | 113 ++++++++++ .../org/zstack/sdk/CreateCbtTaskResult.java | 14 ++ .../org/zstack/sdk/DeleteCbtTaskAction.java | 107 +++++++++ .../org/zstack/sdk/DeleteCbtTaskResult.java | 7 + .../java/org/zstack/sdk/DeviceAddress.java | 71 ++++++ .../org/zstack/sdk/DisableCbtTaskAction.java | 104 +++++++++ .../org/zstack/sdk/DisableCbtTaskResult.java | 14 ++ .../org/zstack/sdk/EnableCbtTaskAction.java | 104 +++++++++ .../org/zstack/sdk/EnableCbtTaskResult.java | 14 ++ .../zstack/sdk/ExportNbdVolumesAction.java | 107 +++++++++ .../zstack/sdk/ExportNbdVolumesResult.java | 14 ++ sdk/src/main/java/org/zstack/sdk/IsoTO.java | 47 ++++ .../java/org/zstack/sdk/KVMCephVolumeTO.java | 23 ++ .../java/org/zstack/sdk/KvmCephCdRomTO.java | 23 ++ .../java/org/zstack/sdk/KvmCephIsoTO.java | 23 ++ sdk/src/main/java/org/zstack/sdk/MonInfo.java | 23 ++ sdk/src/main/java/org/zstack/sdk/NicTO.java | 192 ++++++++++++++++ .../org/zstack/sdk/QueryCbtTaskAction.java | 75 +++++++ .../org/zstack/sdk/QueryCbtTaskResult.java | 22 ++ .../zstack/sdk/UnexportNbdVolumesAction.java | 104 +++++++++ .../zstack/sdk/UnexportNbdVolumesResult.java | 7 + .../main/java/org/zstack/sdk/VHostAddOn.java | 31 +++ .../org/zstack/sdk/VolumeCbtBackupInfo.java | 79 +++++++ .../main/java/org/zstack/sdk/VolumeTO.java | 159 +++++++++++++ .../storage/volume/VolumeManagerImpl.java | 49 +++- .../storage/volume/VolumeSystemTags.java | 4 +- .../java/org/zstack/testlib/ApiHelper.groovy | 211 +++++++++++++++++- 40 files changed, 2059 insertions(+), 24 deletions(-) create mode 100644 header/src/main/java/org/zstack/header/volume/CreateDataVolumeMsg.java create mode 100644 sdk/src/main/java/org/zstack/sdk/BaseVirtualDeviceTO.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CbtTaskInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CbtTaskResourceRefInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CbtTaskStatus.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CdRomTO.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateCbtTaskAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateCbtTaskResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteCbtTaskAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteCbtTaskResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeviceAddress.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DisableCbtTaskAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DisableCbtTaskResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/EnableCbtTaskAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/EnableCbtTaskResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ExportNbdVolumesAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ExportNbdVolumesResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/IsoTO.java create mode 100644 sdk/src/main/java/org/zstack/sdk/KVMCephVolumeTO.java create mode 100644 sdk/src/main/java/org/zstack/sdk/KvmCephCdRomTO.java create mode 100644 sdk/src/main/java/org/zstack/sdk/KvmCephIsoTO.java create mode 100644 sdk/src/main/java/org/zstack/sdk/MonInfo.java create mode 100644 sdk/src/main/java/org/zstack/sdk/NicTO.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryCbtTaskAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryCbtTaskResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UnexportNbdVolumesAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UnexportNbdVolumesResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/VHostAddOn.java create mode 100644 sdk/src/main/java/org/zstack/sdk/VolumeCbtBackupInfo.java create mode 100644 sdk/src/main/java/org/zstack/sdk/VolumeTO.java diff --git a/compute/src/main/java/org/zstack/compute/host/HostGlobalConfig.java b/compute/src/main/java/org/zstack/compute/host/HostGlobalConfig.java index 349e9a54948..b13f95673c7 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostGlobalConfig.java +++ b/compute/src/main/java/org/zstack/compute/host/HostGlobalConfig.java @@ -56,4 +56,7 @@ public class HostGlobalConfig { @GlobalConfigValidation(numberGreaterThan = 1) public static GlobalConfig SYNC_HOST_HW_MONITOR_INTERVAL = new GlobalConfig(CATEGORY, "sync.host.hw.monitor.interval"); + @GlobalConfigValidation + @GlobalConfigDef(type = String.class, defaultValue = "10501:10999", description = "nbd port range") + public static GlobalConfig NBD_PORT_RANGE = new GlobalConfig(CATEGORY, "nbd.port.range"); } diff --git a/conf/db/upgrade/V5.3.28__schema.sql b/conf/db/upgrade/V5.3.28__schema.sql index 9952f0ffd7f..3d492211697 100644 --- a/conf/db/upgrade/V5.3.28__schema.sql +++ b/conf/db/upgrade/V5.3.28__schema.sql @@ -86,6 +86,28 @@ PRIMARY KEY (`id`) ALTER TABLE ObservabilityServerServiceRefVO ADD CONSTRAINT fkObservabilityServerServiceRefVOResourceVO FOREIGN KEY (serviceUuid) REFERENCES ResourceVO (uuid) ON DELETE CASCADE; +CREATE TABLE IF NOT EXISTS `zstack`.`CbtTaskVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) NOT NULL, + `description` varchar(2048) DEFAULT NULL, + `status` varchar(32) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`CbtTaskResourceRefVO` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `taskUuid` varchar(32) NOT NULL, + `resourceUuid` varchar(32) NOT NULL, + `resourceType` varchar(255) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + INDEX `idxCbtTaskResourceRefVOtaskUuid` (`taskUuid`), + INDEX `idxCbtTaskResourceRefVOresourceUuid` (`resourceUuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + CREATE TABLE IF NOT EXISTS `zstack`.`LogServerVO` ( `uuid` varchar(32) NOT NULL UNIQUE, `name` varchar(255) NOT NULL, diff --git a/header/src/main/java/org/zstack/header/volume/CreateDataVolumeMsg.java b/header/src/main/java/org/zstack/header/volume/CreateDataVolumeMsg.java new file mode 100644 index 00000000000..833df491428 --- /dev/null +++ b/header/src/main/java/org/zstack/header/volume/CreateDataVolumeMsg.java @@ -0,0 +1,78 @@ +package org.zstack.header.volume; + +import org.zstack.header.message.NeedReplyMessage; + +public class CreateDataVolumeMsg extends NeedReplyMessage implements VolumeCreateMessage { + private String name; + private String description; + private String diskOfferingUuid; + private long diskSize; + private String primaryStorageUuid; + private String accountUuid; + private String resourceUuid; + private APICreateDataVolumeMsg apiMsg; + + public String getPrimaryStorageUuid() { + return primaryStorageUuid; + } + + public void setPrimaryStorageUuid(String primaryStorageUuid) { + this.primaryStorageUuid = primaryStorageUuid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getDiskOfferingUuid() { + return diskOfferingUuid; + } + + public void setDiskOfferingUuid(String diskOfferingUuid) { + this.diskOfferingUuid = diskOfferingUuid; + } + + public long getDiskSize() { + return diskSize; + } + + public void setDiskSize(long diskSize) { + this.diskSize = diskSize; + } + + public String getAccountUuid() { + return accountUuid; + } + + public void setAccountUuid(String accountUuid) { + this.accountUuid = accountUuid; + } + + public String getResourceUuid() { + return resourceUuid; + } + + public void setResourceUuid(String resourceUuid) { + this.resourceUuid = resourceUuid; + } + + public APICreateDataVolumeMsg getApiMsg() { + return apiMsg; + } + + public void setApiMsg(APICreateDataVolumeMsg apiMsg) { + this.apiMsg = apiMsg; + } +} diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java index da17fc8a2e5..17a6a013412 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java @@ -367,6 +367,7 @@ public static class CreateEmptyVolumeCmd extends AgentCommand { long size; boolean shareable; boolean skipIfExisting; + String format = VolumeConstant.VOLUME_FORMAT_RAW; public boolean isShareable() { return shareable; @@ -399,6 +400,14 @@ public void setSkipIfExisting(boolean skipIfExisting) { public boolean isSkipIfExisting() { return skipIfExisting; } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } } public static class CreateEmptyVolumeRsp extends AgentResponse { @@ -1743,6 +1752,7 @@ private void createEmptyVolume(final InstantiateVolumeOnPrimaryStorageMsg msg) { cmd.size = msg.getVolume().getSize(); cmd.setShareable(msg.getVolume().isShareable()); cmd.skipIfExisting = msg.isSkipIfExisting(); + cmd.format = msg.hasSystemTag(VolumeSystemTags.FORMAT_QCOW2.getTagFormat()) ? VolumeConstant.VOLUME_FORMAT_QCOW2 : VolumeConstant.VOLUME_FORMAT_RAW ; final InstantiateVolumeOnPrimaryStorageReply reply = new InstantiateVolumeOnPrimaryStorageReply(); diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 1d42dc107d2..68e9b6fae14 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -5714,19 +5714,20 @@ public boolean skip(Map data) { @Override public void run(FlowTrigger trigger, Map data) { + String allowPorts = KVMGlobalConfig.KVMAGENT_ALLOW_PORTS_LIST.value(String.class) + ',' + HostGlobalConfig.NBD_PORT_RANGE.value(String.class); StringBuilder builder = new StringBuilder(); if (!KVMGlobalProperty.MN_NETWORKS.isEmpty()) { builder.append(String.format("bash %s -m %s -p %s -s %s -c %s", "/var/lib/zstack/kvm/kvmagent-iptables", KVMConstant.IPTABLES_COMMENTS, - KVMGlobalConfig.KVMAGENT_ALLOW_PORTS_LIST.value(String.class), + allowPorts, KVMGlobalProperty.AGENT_PORT, String.join(",", KVMGlobalProperty.MN_NETWORKS))); } else { builder.append(String.format("bash %s -m %s -p %s -s %s", "/var/lib/zstack/kvm/kvmagent-iptables", KVMConstant.IPTABLES_COMMENTS, - KVMGlobalConfig.KVMAGENT_ALLOW_PORTS_LIST.value(String.class), + allowPorts, KVMGlobalProperty.AGENT_PORT)); } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java index 49645209a0d..47a26c0cfc4 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java @@ -3,6 +3,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.zstack.cbd.MdsInfo; import org.zstack.cbd.MdsStatus; +import org.zstack.compute.host.HostGlobalConfig; import org.zstack.core.CoreGlobalProperty; import org.zstack.core.Platform; import org.zstack.core.ansible.*; @@ -143,17 +144,18 @@ public void fail(ErrorCode errorCode) { @Autowired public void run(FlowTrigger trigger, Map data) { StringBuilder builder = new StringBuilder(); + String allowPorts = ZbsConstants.ZBS_PS_ALLOW_PORTS + ',' + HostGlobalConfig.NBD_PORT_RANGE.value(String.class); if (!ZbsGlobalProperty.MN_NETWORKS.isEmpty()) { builder.append(String.format("sudo bash %s -m %s -p %s -c %s", "/var/lib/zstack/zbsp/package/zbsps-iptables", ZbsConstants.ZBS_PS_IPTABLES_COMMENTS, - ZbsConstants.ZBS_PS_ALLOW_PORTS, + allowPorts, String.join(",", ZbsGlobalProperty.MN_NETWORKS))); } else { builder.append(String.format("sudo bash %s -m %s -p %s", "/var/lib/zstack/zbsp/package/zbsps-iptables", ZbsConstants.ZBS_PS_IPTABLES_COMMENTS, - ZbsConstants.ZBS_PS_ALLOW_PORTS)); + allowPorts)); } try { diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 5fa90a41940..aa15cd8cb45 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -7,6 +7,7 @@ import org.zstack.cbd.*; import org.zstack.cbd.kvm.CbdHeartbeatVolumeTO; import org.zstack.cbd.kvm.CbdVolumeTo; +import org.zstack.compute.host.HostGlobalConfig; import org.zstack.core.CoreGlobalProperty; import org.zstack.core.asyncbatch.While; import org.zstack.core.db.DatabaseFacade; @@ -36,6 +37,7 @@ import org.zstack.header.volume.VolumeConstant; import org.zstack.header.volume.VolumeProtocol; import org.zstack.header.volume.VolumeStats; +import org.zstack.kvm.KVMGlobalConfig; import org.zstack.kvm.KVMHostVO; import org.zstack.kvm.KVMHostVO_; import org.zstack.resourceconfig.ResourceConfig; @@ -754,6 +756,7 @@ public void export(ExportSpec espec, VolumeProtocol protocol, ReturnValueComplet CbdToNbdCmd cmd = new CbdToNbdCmd(); cmd.setInstallPath(espec.getInstallPath()); + cmd.setPortRange(HostGlobalConfig.NBD_PORT_RANGE.value(String.class)); httpCall(CBD_TO_NBD_PATH, cmd, CbdToNbdRsp.class, new ReturnValueCompletion(comp) { @Override @@ -1496,6 +1499,7 @@ public void setPort(int port) { public static class CbdToNbdCmd extends AgentCommand { private String installPath; + private String portRange; public String getInstallPath() { return installPath; @@ -1504,6 +1508,14 @@ public String getInstallPath() { public void setInstallPath(String installPath) { this.installPath = installPath; } + + public String getPortRange() { + return portRange; + } + + public void setPortRange(String portRange) { + this.portRange = portRange; + } } public static class CloneVolumeCmd extends AgentCommand { diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 7163f66477f..c3d324f5422 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -207,6 +207,10 @@ public class SourceClassMap { put("org.zstack.header.buildapp.BuildApplicationInventory", "org.zstack.sdk.BuildApplicationInventory"); put("org.zstack.header.buildsystem.AppBuildSystemInventory", "org.zstack.sdk.AppBuildSystemInventory"); put("org.zstack.header.buildsystem.AppBuildSystemZoneRefInventory", "org.zstack.sdk.AppBuildSystemZoneRefInventory"); + put("org.zstack.header.cbt.CbtTaskInventory", "org.zstack.sdk.CbtTaskInventory"); + put("org.zstack.header.cbt.CbtTaskResourceRefInventory", "org.zstack.sdk.CbtTaskResourceRefInventory"); + put("org.zstack.header.cbt.CbtTaskStatus", "org.zstack.sdk.CbtTaskStatus"); + put("org.zstack.header.cbt.VolumeCbtBackupInfo", "org.zstack.sdk.VolumeCbtBackupInfo"); put("org.zstack.header.cloudformation.CloudFormationStackEventInventory", "org.zstack.sdk.CloudFormationStackEventInventory"); put("org.zstack.header.cloudformation.PreviewResourceStruct", "org.zstack.sdk.PreviewResourceStruct"); put("org.zstack.header.cloudformation.ResourceStackInventory", "org.zstack.sdk.ResourceStackInventory"); @@ -385,6 +389,7 @@ public class SourceClassMap { put("org.zstack.header.vm.VmPriorityLevel", "org.zstack.sdk.VmPriorityLevel"); put("org.zstack.header.vm.VmSchedHistoryInventory", "org.zstack.sdk.VmSchedHistoryInventory"); put("org.zstack.header.vm.cdrom.VmCdRomInventory", "org.zstack.sdk.VmCdRomInventory"); + put("org.zstack.header.vm.devices.DeviceAddress", "org.zstack.sdk.DeviceAddress"); put("org.zstack.header.vm.devices.VmInstanceDeviceAddressArchiveInventory", "org.zstack.sdk.VmInstanceDeviceAddressArchiveInventory"); put("org.zstack.header.vm.devices.VmInstanceDeviceAddressGroupInventory", "org.zstack.sdk.VmInstanceDeviceAddressGroupInventory"); put("org.zstack.header.vmscheduling.HostSchedulingRuleGroupInventory", "org.zstack.sdk.HostSchedulingRuleGroupInventory"); @@ -443,8 +448,14 @@ public class SourceClassMap { put("org.zstack.ipsec.IPsecL3NetworkRefInventory", "org.zstack.sdk.IPsecL3NetworkRefInventory"); put("org.zstack.ipsec.IPsecPeerCidrInventory", "org.zstack.sdk.IPsecPeerCidrInventory"); put("org.zstack.kvm.APIKvmRunShellEvent$ShellResult", "org.zstack.sdk.ShellResult"); + put("org.zstack.kvm.BaseVirtualDeviceTO", "org.zstack.sdk.BaseVirtualDeviceTO"); + put("org.zstack.kvm.KVMAgentCommands$CdRomTO", "org.zstack.sdk.CdRomTO"); + put("org.zstack.kvm.KVMAgentCommands$IsoTO", "org.zstack.sdk.IsoTO"); + put("org.zstack.kvm.KVMAgentCommands$NicTO", "org.zstack.sdk.NicTO"); + put("org.zstack.kvm.KVMAgentCommands$VHostAddOn", "org.zstack.sdk.VHostAddOn"); put("org.zstack.kvm.KVMHostInventory", "org.zstack.sdk.KVMHostInventory"); put("org.zstack.kvm.KVMIsoTO", "org.zstack.sdk.KVMIsoTO"); + put("org.zstack.kvm.VolumeTO", "org.zstack.sdk.VolumeTO"); put("org.zstack.kvm.hypervisor.datatype.HostOsCategoryInventory", "org.zstack.sdk.HostOsCategoryInventory"); put("org.zstack.kvm.hypervisor.datatype.HypervisorVersionState", "org.zstack.sdk.HypervisorVersionState"); put("org.zstack.kvm.hypervisor.datatype.KvmHostHypervisorMetadataInventory", "org.zstack.sdk.KvmHostHypervisorMetadataInventory"); @@ -638,6 +649,12 @@ public class SourceClassMap { put("org.zstack.storage.ceph.primary.CephPrimaryStorageInventory", "org.zstack.sdk.CephPrimaryStorageInventory"); put("org.zstack.storage.ceph.primary.CephPrimaryStorageMonInventory", "org.zstack.sdk.CephPrimaryStorageMonInventory"); put("org.zstack.storage.ceph.primary.CephPrimaryStoragePoolInventory", "org.zstack.sdk.CephPrimaryStoragePoolInventory"); + put("org.zstack.storage.ceph.primary.KVMCephVolumeTO", "org.zstack.sdk.KVMCephVolumeTO"); + put("org.zstack.storage.ceph.primary.KVMCephVolumeTO$MonInfo", "org.zstack.sdk.MonInfo"); + put("org.zstack.storage.ceph.primary.KvmCephCdRomTO", "org.zstack.sdk.KvmCephCdRomTO"); + put("org.zstack.storage.ceph.primary.KvmCephCdRomTO$MonInfo", "org.zstack.sdk.MonInfo"); + put("org.zstack.storage.ceph.primary.KvmCephIsoTO", "org.zstack.sdk.KvmCephIsoTO"); + put("org.zstack.storage.ceph.primary.KvmCephIsoTO$MonInfo", "org.zstack.sdk.MonInfo"); put("org.zstack.storage.device.fibreChannel.FiberChannelLunInventory", "org.zstack.sdk.FiberChannelLunInventory"); put("org.zstack.storage.device.fibreChannel.FiberChannelStorageInventory", "org.zstack.sdk.FiberChannelStorageInventory"); put("org.zstack.storage.device.hba.FcHbaDeviceInventory", "org.zstack.sdk.FcHbaDeviceInventory"); @@ -881,6 +898,7 @@ public class SourceClassMap { put("org.zstack.sdk.BaremetalNicInventory", "org.zstack.header.baremetal.network.BaremetalNicInventory"); put("org.zstack.sdk.BaremetalPxeServerInventory", "org.zstack.header.baremetal.pxeserver.BaremetalPxeServerInventory"); put("org.zstack.sdk.BaremetalVlanNicInventory", "org.zstack.header.baremetal.network.BaremetalVlanNicInventory"); + put("org.zstack.sdk.BaseVirtualDeviceTO", "org.zstack.kvm.BaseVirtualDeviceTO"); put("org.zstack.sdk.BatchDeleteVolumeSnapshotStruct", "org.zstack.header.storage.snapshot.BatchDeleteVolumeSnapshotStruct"); put("org.zstack.sdk.BillingInventory", "org.zstack.billing.generator.BillingInventory"); put("org.zstack.sdk.BlockPrimaryStorageInventory", "org.zstack.storage.primary.block.BlockPrimaryStorageInventory"); @@ -893,6 +911,10 @@ public class SourceClassMap { put("org.zstack.sdk.CSPSecretResourcePoolInventory", "org.zstack.crypto.securitymachine.thirdparty.csp.CSPSecretResourcePoolInventory"); put("org.zstack.sdk.CasClientInventory", "org.zstack.sso.header.CasClientInventory"); put("org.zstack.sdk.CasState", "org.zstack.sso.header.CasState"); + put("org.zstack.sdk.CbtTaskInventory", "org.zstack.header.cbt.CbtTaskInventory"); + put("org.zstack.sdk.CbtTaskResourceRefInventory", "org.zstack.header.cbt.CbtTaskResourceRefInventory"); + put("org.zstack.sdk.CbtTaskStatus", "org.zstack.header.cbt.CbtTaskStatus"); + put("org.zstack.sdk.CdRomTO", "org.zstack.kvm.KVMAgentCommands$CdRomTO"); put("org.zstack.sdk.CdpPolicyInventory", "org.zstack.header.storage.cdp.CdpPolicyInventory"); put("org.zstack.sdk.CdpPolicyState", "org.zstack.header.storage.cdp.CdpPolicyState"); put("org.zstack.sdk.CdpTaskInventory", "org.zstack.header.storage.cdp.CdpTaskInventory"); @@ -936,6 +958,7 @@ public class SourceClassMap { put("org.zstack.sdk.DataVolumeSpendingInventory", "org.zstack.billing.spendingcalculator.volume.data.DataVolumeSpendingInventory"); put("org.zstack.sdk.DatasetInventory", "org.zstack.ai.entity.DatasetInventory"); put("org.zstack.sdk.DeleteSnapshotGroupResult", "org.zstack.header.storage.snapshot.group.DeleteSnapshotGroupResult"); + put("org.zstack.sdk.DeviceAddress", "org.zstack.header.vm.devices.DeviceAddress"); put("org.zstack.sdk.DeviceTO", "org.zstack.storage.device.multipath.DeviceTO"); put("org.zstack.sdk.DirectoryInventory", "org.zstack.directory.DirectoryInventory"); put("org.zstack.sdk.DiskOfferingInventory", "org.zstack.header.configuration.DiskOfferingInventory"); @@ -1048,13 +1071,17 @@ public class SourceClassMap { put("org.zstack.sdk.IscsiServerClusterRefInventory", "org.zstack.storage.device.iscsi.IscsiServerClusterRefInventory"); put("org.zstack.sdk.IscsiServerInventory", "org.zstack.storage.device.iscsi.IscsiServerInventory"); put("org.zstack.sdk.IscsiTargetInventory", "org.zstack.storage.device.iscsi.IscsiTargetInventory"); + put("org.zstack.sdk.IsoTO", "org.zstack.kvm.KVMAgentCommands$IsoTO"); put("org.zstack.sdk.ItemInventory", "org.zstack.monitoring.items.ItemInventory"); put("org.zstack.sdk.JitSecurityMachineInventory", "org.zstack.crypto.securitymachine.thirdparty.jit.JitSecurityMachineInventory"); put("org.zstack.sdk.JobDetails", "org.zstack.header.image.APIGetUploadImageJobDetailsReply$JobDetails"); put("org.zstack.sdk.JsonLabelInventory", "org.zstack.core.jsonlabel.JsonLabelInventory"); + put("org.zstack.sdk.KVMCephVolumeTO", "org.zstack.storage.ceph.primary.KVMCephVolumeTO"); put("org.zstack.sdk.KVMHostInventory", "org.zstack.kvm.KVMHostInventory"); put("org.zstack.sdk.KVMIsoTO", "org.zstack.kvm.KVMIsoTO"); put("org.zstack.sdk.KoAlSecretResourcePoolInventory", "org.zstack.crypto.securitymachine.thirdparty.koal.KoAlSecretResourcePoolInventory"); + put("org.zstack.sdk.KvmCephCdRomTO", "org.zstack.storage.ceph.primary.KvmCephCdRomTO"); + put("org.zstack.sdk.KvmCephIsoTO", "org.zstack.storage.ceph.primary.KvmCephIsoTO"); put("org.zstack.sdk.KvmHostHypervisorMetadataInventory", "org.zstack.kvm.hypervisor.datatype.KvmHostHypervisorMetadataInventory"); put("org.zstack.sdk.KvmHypervisorInfoInventory", "org.zstack.kvm.hypervisor.datatype.KvmHypervisorInfoInventory"); put("org.zstack.sdk.L2NetworkData", "org.zstack.header.network.l2.L2NetworkData"); @@ -1122,6 +1149,9 @@ public class SourceClassMap { put("org.zstack.sdk.ModelServiceInstanceInventory", "org.zstack.ai.entity.ModelServiceInstanceInventory"); put("org.zstack.sdk.ModelServiceInventory", "org.zstack.ai.entity.ModelServiceInventory"); put("org.zstack.sdk.ModelServiceRefInventory", "org.zstack.ai.entity.ModelServiceRefInventory"); + put("org.zstack.sdk.MonInfo", "org.zstack.storage.ceph.primary.KVMCephVolumeTO$MonInfo"); + put("org.zstack.sdk.MonInfo", "org.zstack.storage.ceph.primary.KvmCephCdRomTO$MonInfo"); + put("org.zstack.sdk.MonInfo", "org.zstack.storage.ceph.primary.KvmCephIsoTO$MonInfo"); put("org.zstack.sdk.MonitorTriggerActionInventory", "org.zstack.monitoring.actions.MonitorTriggerActionInventory"); put("org.zstack.sdk.MonitorTriggerInventory", "org.zstack.monitoring.MonitorTriggerInventory"); put("org.zstack.sdk.MttyDeviceInventory", "org.zstack.mttyDevice.MttyDeviceInventory"); @@ -1145,6 +1175,7 @@ public class SourceClassMap { put("org.zstack.sdk.NetworkServiceL3NetworkRefInventory", "org.zstack.header.network.service.NetworkServiceL3NetworkRefInventory"); put("org.zstack.sdk.NetworkServiceProviderInventory", "org.zstack.header.network.service.NetworkServiceProviderInventory"); put("org.zstack.sdk.NginxRedirectRule", "org.zstack.ai.NginxRedirectRule"); + put("org.zstack.sdk.NicTO", "org.zstack.kvm.KVMAgentCommands$NicTO"); put("org.zstack.sdk.NormalIpRangeInventory", "org.zstack.header.network.l3.NormalIpRangeInventory"); put("org.zstack.sdk.NvmeLunHostRefInventory", "org.zstack.storage.device.nvme.NvmeLunHostRefInventory"); put("org.zstack.sdk.NvmeLunInventory", "org.zstack.storage.device.nvme.NvmeLunInventory"); @@ -1358,6 +1389,7 @@ public class SourceClassMap { put("org.zstack.sdk.VCenterPrimaryStorageInventory", "org.zstack.vmware.VCenterPrimaryStorageInventory"); put("org.zstack.sdk.VCenterResourcePoolInventory", "org.zstack.vmware.VCenterResourcePoolInventory"); put("org.zstack.sdk.VCenterResourcePoolUsageInventory", "org.zstack.vmware.VCenterResourcePoolUsageInventory"); + put("org.zstack.sdk.VHostAddOn", "org.zstack.kvm.KVMAgentCommands$VHostAddOn"); put("org.zstack.sdk.VRouterRouteEntryAO", "org.zstack.vrouterRoute.VRouterRouteEntryAO"); put("org.zstack.sdk.VRouterRouteEntryInventory", "org.zstack.vrouterRoute.VRouterRouteEntryInventory"); put("org.zstack.sdk.VRouterRouteEntryType", "org.zstack.vrouterRoute.VRouterRouteEntryType"); @@ -1404,6 +1436,7 @@ public class SourceClassMap { put("org.zstack.sdk.VniRangeInventory", "org.zstack.network.l2.vxlan.vxlanNetworkPool.VniRangeInventory"); put("org.zstack.sdk.VolumeBackupInventory", "org.zstack.header.storage.backup.VolumeBackupInventory"); put("org.zstack.sdk.VolumeBackupStorageRefInventory", "org.zstack.header.storage.backup.VolumeBackupStorageRefInventory"); + put("org.zstack.sdk.VolumeCbtBackupInfo", "org.zstack.header.cbt.VolumeCbtBackupInfo"); put("org.zstack.sdk.VolumeExternalBackupInfo", "org.zstack.externalbackup.VolumeExternalBackupInfo"); put("org.zstack.sdk.VolumeFormatReplyStruct", "org.zstack.header.volume.APIGetVolumeFormatReply$VolumeFormatReplyStruct"); put("org.zstack.sdk.VolumeInventory", "org.zstack.header.volume.VolumeInventory"); @@ -1414,6 +1447,7 @@ public class SourceClassMap { put("org.zstack.sdk.VolumeSnapshotInventory", "org.zstack.header.storage.snapshot.VolumeSnapshotInventory"); put("org.zstack.sdk.VolumeSnapshotReferenceTreeInventory", "org.zstack.header.storage.snapshot.reference.VolumeSnapshotReferenceTreeInventory"); put("org.zstack.sdk.VolumeSnapshotTreeInventory", "org.zstack.header.storage.snapshot.VolumeSnapshotTreeInventory"); + put("org.zstack.sdk.VolumeTO", "org.zstack.kvm.VolumeTO"); put("org.zstack.sdk.VpcFirewallInventory", "org.zstack.vpcfirewall.entity.VpcFirewallInventory"); put("org.zstack.sdk.VpcFirewallIpSetTemplateInventory", "org.zstack.vpcfirewall.entity.VpcFirewallIpSetTemplateInventory"); put("org.zstack.sdk.VpcFirewallRuleInventory", "org.zstack.vpcfirewall.entity.VpcFirewallRuleInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/BaseVirtualDeviceTO.java b/sdk/src/main/java/org/zstack/sdk/BaseVirtualDeviceTO.java new file mode 100644 index 00000000000..1b31a7c50d1 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/BaseVirtualDeviceTO.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + +import org.zstack.sdk.DeviceAddress; + +public class BaseVirtualDeviceTO { + + public java.lang.String resourceUuid; + public void setResourceUuid(java.lang.String resourceUuid) { + this.resourceUuid = resourceUuid; + } + public java.lang.String getResourceUuid() { + return this.resourceUuid; + } + + public DeviceAddress deviceAddress; + public void setDeviceAddress(DeviceAddress deviceAddress) { + this.deviceAddress = deviceAddress; + } + public DeviceAddress getDeviceAddress() { + return this.deviceAddress; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CbtTaskInventory.java b/sdk/src/main/java/org/zstack/sdk/CbtTaskInventory.java new file mode 100644 index 00000000000..6450fb1c861 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CbtTaskInventory.java @@ -0,0 +1,63 @@ +package org.zstack.sdk; + +import org.zstack.sdk.CbtTaskStatus; + +public class CbtTaskInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public CbtTaskStatus status; + public void setStatus(CbtTaskStatus status) { + this.status = status; + } + public CbtTaskStatus getStatus() { + return this.status; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + + public java.util.List resourceRefs; + public void setResourceRefs(java.util.List resourceRefs) { + this.resourceRefs = resourceRefs; + } + public java.util.List getResourceRefs() { + return this.resourceRefs; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CbtTaskResourceRefInventory.java b/sdk/src/main/java/org/zstack/sdk/CbtTaskResourceRefInventory.java new file mode 100644 index 00000000000..dd136193a56 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CbtTaskResourceRefInventory.java @@ -0,0 +1,55 @@ +package org.zstack.sdk; + + + +public class CbtTaskResourceRefInventory { + + public long id; + public void setId(long id) { + this.id = id; + } + public long getId() { + return this.id; + } + + public java.lang.String taskUuid; + public void setTaskUuid(java.lang.String taskUuid) { + this.taskUuid = taskUuid; + } + public java.lang.String getTaskUuid() { + return this.taskUuid; + } + + public java.lang.String resourceUuid; + public void setResourceUuid(java.lang.String resourceUuid) { + this.resourceUuid = resourceUuid; + } + public java.lang.String getResourceUuid() { + return this.resourceUuid; + } + + public java.lang.String resourceType; + public void setResourceType(java.lang.String resourceType) { + this.resourceType = resourceType; + } + public java.lang.String getResourceType() { + return this.resourceType; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CbtTaskStatus.java b/sdk/src/main/java/org/zstack/sdk/CbtTaskStatus.java new file mode 100644 index 00000000000..429d3017da9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CbtTaskStatus.java @@ -0,0 +1,8 @@ +package org.zstack.sdk; + +public enum CbtTaskStatus { + Created, + Running, + Stopped, + Failed, +} diff --git a/sdk/src/main/java/org/zstack/sdk/CdRomTO.java b/sdk/src/main/java/org/zstack/sdk/CdRomTO.java new file mode 100644 index 00000000000..f1bbe4b664e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CdRomTO.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class CdRomTO extends org.zstack.sdk.IsoTO { + + public boolean isEmpty; + public void setIsEmpty(boolean isEmpty) { + this.isEmpty = isEmpty; + } + public boolean getIsEmpty() { + return this.isEmpty; + } + + public int bootOrder; + public void setBootOrder(int bootOrder) { + this.bootOrder = bootOrder; + } + public int getBootOrder() { + return this.bootOrder; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateCbtTaskAction.java b/sdk/src/main/java/org/zstack/sdk/CreateCbtTaskAction.java new file mode 100644 index 00000000000..c9249b92997 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateCbtTaskAction.java @@ -0,0 +1,113 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateCbtTaskAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.CreateCbtTaskResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = true, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmInstanceUuid; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.CreateCbtTaskResult value = res.getResult(org.zstack.sdk.CreateCbtTaskResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateCbtTaskResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/cbt-task/create"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateCbtTaskResult.java b/sdk/src/main/java/org/zstack/sdk/CreateCbtTaskResult.java new file mode 100644 index 00000000000..875cd38aec7 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateCbtTaskResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.CbtTaskInventory; + +public class CreateCbtTaskResult { + public CbtTaskInventory inventory; + public void setInventory(CbtTaskInventory inventory) { + this.inventory = inventory; + } + public CbtTaskInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteCbtTaskAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteCbtTaskAction.java new file mode 100644 index 00000000000..d0c3b70c57b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteCbtTaskAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteCbtTaskAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeleteCbtTaskResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public boolean force = false; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeleteCbtTaskResult value = res.getResult(org.zstack.sdk.DeleteCbtTaskResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteCbtTaskResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/cbt-task/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteCbtTaskResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteCbtTaskResult.java new file mode 100644 index 00000000000..78337efbde6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteCbtTaskResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteCbtTaskResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeviceAddress.java b/sdk/src/main/java/org/zstack/sdk/DeviceAddress.java new file mode 100644 index 00000000000..f4e9fa74e0d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeviceAddress.java @@ -0,0 +1,71 @@ +package org.zstack.sdk; + + + +public class DeviceAddress { + + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.lang.String bus; + public void setBus(java.lang.String bus) { + this.bus = bus; + } + public java.lang.String getBus() { + return this.bus; + } + + public java.lang.String domain; + public void setDomain(java.lang.String domain) { + this.domain = domain; + } + public java.lang.String getDomain() { + return this.domain; + } + + public java.lang.String slot; + public void setSlot(java.lang.String slot) { + this.slot = slot; + } + public java.lang.String getSlot() { + return this.slot; + } + + public java.lang.String function; + public void setFunction(java.lang.String function) { + this.function = function; + } + public java.lang.String getFunction() { + return this.function; + } + + public java.lang.String controller; + public void setController(java.lang.String controller) { + this.controller = controller; + } + public java.lang.String getController() { + return this.controller; + } + + public java.lang.String target; + public void setTarget(java.lang.String target) { + this.target = target; + } + public java.lang.String getTarget() { + return this.target; + } + + public java.lang.String unit; + public void setUnit(java.lang.String unit) { + this.unit = unit; + } + public java.lang.String getUnit() { + return this.unit; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DisableCbtTaskAction.java b/sdk/src/main/java/org/zstack/sdk/DisableCbtTaskAction.java new file mode 100644 index 00000000000..dd9ed92dddc --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DisableCbtTaskAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DisableCbtTaskAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DisableCbtTaskResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = false, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public boolean force = false; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DisableCbtTaskResult value = res.getResult(org.zstack.sdk.DisableCbtTaskResult.class); + ret.value = value == null ? new org.zstack.sdk.DisableCbtTaskResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/cbt-task/disable/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DisableCbtTaskResult.java b/sdk/src/main/java/org/zstack/sdk/DisableCbtTaskResult.java new file mode 100644 index 00000000000..2f8c8826ee3 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DisableCbtTaskResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.CbtTaskInventory; + +public class DisableCbtTaskResult { + public CbtTaskInventory inventory; + public void setInventory(CbtTaskInventory inventory) { + this.inventory = inventory; + } + public CbtTaskInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/EnableCbtTaskAction.java b/sdk/src/main/java/org/zstack/sdk/EnableCbtTaskAction.java new file mode 100644 index 00000000000..c49c3fc39b8 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/EnableCbtTaskAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class EnableCbtTaskAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.EnableCbtTaskResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = false, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String bitmapName; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.EnableCbtTaskResult value = res.getResult(org.zstack.sdk.EnableCbtTaskResult.class); + ret.value = value == null ? new org.zstack.sdk.EnableCbtTaskResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/cbt-task/enable/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/EnableCbtTaskResult.java b/sdk/src/main/java/org/zstack/sdk/EnableCbtTaskResult.java new file mode 100644 index 00000000000..5a892823bc5 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/EnableCbtTaskResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class EnableCbtTaskResult { + public java.util.List volumeCbtBackupInfos; + public void setVolumeCbtBackupInfos(java.util.List volumeCbtBackupInfos) { + this.volumeCbtBackupInfos = volumeCbtBackupInfos; + } + public java.util.List getVolumeCbtBackupInfos() { + return this.volumeCbtBackupInfos; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ExportNbdVolumesAction.java b/sdk/src/main/java/org/zstack/sdk/ExportNbdVolumesAction.java new file mode 100644 index 00000000000..271065e4312 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ExportNbdVolumesAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class ExportNbdVolumesAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.ExportNbdVolumesResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List volumeUuids; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmInstanceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public boolean force = false; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.ExportNbdVolumesResult value = res.getResult(org.zstack.sdk.ExportNbdVolumesResult.class); + ret.value = value == null ? new org.zstack.sdk.ExportNbdVolumesResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/cbt-task/exportvolume"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ExportNbdVolumesResult.java b/sdk/src/main/java/org/zstack/sdk/ExportNbdVolumesResult.java new file mode 100644 index 00000000000..fb21b7f2645 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ExportNbdVolumesResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class ExportNbdVolumesResult { + public java.util.List volumeInfos; + public void setVolumeInfos(java.util.List volumeInfos) { + this.volumeInfos = volumeInfos; + } + public java.util.List getVolumeInfos() { + return this.volumeInfos; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/IsoTO.java b/sdk/src/main/java/org/zstack/sdk/IsoTO.java new file mode 100644 index 00000000000..5ab3afc3d50 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/IsoTO.java @@ -0,0 +1,47 @@ +package org.zstack.sdk; + + + +public class IsoTO extends org.zstack.sdk.BaseVirtualDeviceTO { + + public java.lang.String path; + public void setPath(java.lang.String path) { + this.path = path; + } + public java.lang.String getPath() { + return this.path; + } + + public java.lang.String imageUuid; + public void setImageUuid(java.lang.String imageUuid) { + this.imageUuid = imageUuid; + } + public java.lang.String getImageUuid() { + return this.imageUuid; + } + + public java.lang.String primaryStorageUuid; + public void setPrimaryStorageUuid(java.lang.String primaryStorageUuid) { + this.primaryStorageUuid = primaryStorageUuid; + } + public java.lang.String getPrimaryStorageUuid() { + return this.primaryStorageUuid; + } + + public java.lang.String protocol; + public void setProtocol(java.lang.String protocol) { + this.protocol = protocol; + } + public java.lang.String getProtocol() { + return this.protocol; + } + + public int deviceId; + public void setDeviceId(int deviceId) { + this.deviceId = deviceId; + } + public int getDeviceId() { + return this.deviceId; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/KVMCephVolumeTO.java b/sdk/src/main/java/org/zstack/sdk/KVMCephVolumeTO.java new file mode 100644 index 00000000000..9a805a4eda9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/KVMCephVolumeTO.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class KVMCephVolumeTO extends org.zstack.sdk.VolumeTO { + + public java.util.List monInfo; + public void setMonInfo(java.util.List monInfo) { + this.monInfo = monInfo; + } + public java.util.List getMonInfo() { + return this.monInfo; + } + + public java.lang.String secretUuid; + public void setSecretUuid(java.lang.String secretUuid) { + this.secretUuid = secretUuid; + } + public java.lang.String getSecretUuid() { + return this.secretUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/KvmCephCdRomTO.java b/sdk/src/main/java/org/zstack/sdk/KvmCephCdRomTO.java new file mode 100644 index 00000000000..2882ede1b3f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/KvmCephCdRomTO.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class KvmCephCdRomTO extends org.zstack.sdk.CdRomTO { + + public java.util.List monInfo; + public void setMonInfo(java.util.List monInfo) { + this.monInfo = monInfo; + } + public java.util.List getMonInfo() { + return this.monInfo; + } + + public java.lang.String secretUuid; + public void setSecretUuid(java.lang.String secretUuid) { + this.secretUuid = secretUuid; + } + public java.lang.String getSecretUuid() { + return this.secretUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/KvmCephIsoTO.java b/sdk/src/main/java/org/zstack/sdk/KvmCephIsoTO.java new file mode 100644 index 00000000000..4cde4e84989 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/KvmCephIsoTO.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class KvmCephIsoTO extends org.zstack.sdk.IsoTO { + + public java.util.List monInfo; + public void setMonInfo(java.util.List monInfo) { + this.monInfo = monInfo; + } + public java.util.List getMonInfo() { + return this.monInfo; + } + + public java.lang.String secretUuid; + public void setSecretUuid(java.lang.String secretUuid) { + this.secretUuid = secretUuid; + } + public java.lang.String getSecretUuid() { + return this.secretUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/MonInfo.java b/sdk/src/main/java/org/zstack/sdk/MonInfo.java new file mode 100644 index 00000000000..7daeec71f88 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/MonInfo.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class MonInfo { + + public java.lang.String hostname; + public void setHostname(java.lang.String hostname) { + this.hostname = hostname; + } + public java.lang.String getHostname() { + return this.hostname; + } + + public int port; + public void setPort(int port) { + this.port = port; + } + public int getPort() { + return this.port; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/NicTO.java b/sdk/src/main/java/org/zstack/sdk/NicTO.java new file mode 100644 index 00000000000..2dc95ea8529 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/NicTO.java @@ -0,0 +1,192 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VHostAddOn; +import org.zstack.sdk.DeviceAddress; + +public class NicTO extends org.zstack.sdk.BaseVirtualDeviceTO { + + public java.lang.String mac; + public void setMac(java.lang.String mac) { + this.mac = mac; + } + public java.lang.String getMac() { + return this.mac; + } + + public java.util.List ips; + public void setIps(java.util.List ips) { + this.ips = ips; + } + public java.util.List getIps() { + return this.ips; + } + + public java.lang.String bridgeName; + public void setBridgeName(java.lang.String bridgeName) { + this.bridgeName = bridgeName; + } + public java.lang.String getBridgeName() { + return this.bridgeName; + } + + public java.lang.String physicalInterface; + public void setPhysicalInterface(java.lang.String physicalInterface) { + this.physicalInterface = physicalInterface; + } + public java.lang.String getPhysicalInterface() { + return this.physicalInterface; + } + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String nicInternalName; + public void setNicInternalName(java.lang.String nicInternalName) { + this.nicInternalName = nicInternalName; + } + public java.lang.String getNicInternalName() { + return this.nicInternalName; + } + + public int deviceId; + public void setDeviceId(int deviceId) { + this.deviceId = deviceId; + } + public int getDeviceId() { + return this.deviceId; + } + + public java.lang.String metaData; + public void setMetaData(java.lang.String metaData) { + this.metaData = metaData; + } + public java.lang.String getMetaData() { + return this.metaData; + } + + public java.lang.Boolean useVirtio; + public void setUseVirtio(java.lang.Boolean useVirtio) { + this.useVirtio = useVirtio; + } + public java.lang.Boolean getUseVirtio() { + return this.useVirtio; + } + + public int bootOrder; + public void setBootOrder(int bootOrder) { + this.bootOrder = bootOrder; + } + public int getBootOrder() { + return this.bootOrder; + } + + public java.lang.Integer mtu; + public void setMtu(java.lang.Integer mtu) { + this.mtu = mtu; + } + public java.lang.Integer getMtu() { + return this.mtu; + } + + public java.lang.String driverType; + public void setDriverType(java.lang.String driverType) { + this.driverType = driverType; + } + public java.lang.String getDriverType() { + return this.driverType; + } + + public VHostAddOn vHostAddOn; + public void setVHostAddOn(VHostAddOn vHostAddOn) { + this.vHostAddOn = vHostAddOn; + } + public VHostAddOn getVHostAddOn() { + return this.vHostAddOn; + } + + public DeviceAddress pci; + public void setPci(DeviceAddress pci) { + this.pci = pci; + } + public DeviceAddress getPci() { + return this.pci; + } + + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.lang.String state; + public void setState(java.lang.String state) { + this.state = state; + } + public java.lang.String getState() { + return this.state; + } + + public java.lang.String vlanId; + public void setVlanId(java.lang.String vlanId) { + this.vlanId = vlanId; + } + public java.lang.String getVlanId() { + return this.vlanId; + } + + public java.lang.String pciDeviceAddress; + public void setPciDeviceAddress(java.lang.String pciDeviceAddress) { + this.pciDeviceAddress = pciDeviceAddress; + } + public java.lang.String getPciDeviceAddress() { + return this.pciDeviceAddress; + } + + public java.lang.String ipForTf; + public void setIpForTf(java.lang.String ipForTf) { + this.ipForTf = ipForTf; + } + public java.lang.String getIpForTf() { + return this.ipForTf; + } + + public java.lang.String l2NetworkUuid; + public void setL2NetworkUuid(java.lang.String l2NetworkUuid) { + this.l2NetworkUuid = l2NetworkUuid; + } + public java.lang.String getL2NetworkUuid() { + return this.l2NetworkUuid; + } + + public java.lang.String srcPath; + public void setSrcPath(java.lang.String srcPath) { + this.srcPath = srcPath; + } + public java.lang.String getSrcPath() { + return this.srcPath; + } + + public java.lang.Boolean cleanTraffic; + public void setCleanTraffic(java.lang.Boolean cleanTraffic) { + this.cleanTraffic = cleanTraffic; + } + public java.lang.Boolean getCleanTraffic() { + return this.cleanTraffic; + } + + public java.lang.Boolean isolated; + public void setIsolated(java.lang.Boolean isolated) { + this.isolated = isolated; + } + public java.lang.Boolean getIsolated() { + return this.isolated; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryCbtTaskAction.java b/sdk/src/main/java/org/zstack/sdk/QueryCbtTaskAction.java new file mode 100644 index 00000000000..7ba3a86c7f4 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryCbtTaskAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryCbtTaskAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryCbtTaskResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryCbtTaskResult value = res.getResult(org.zstack.sdk.QueryCbtTaskResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryCbtTaskResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/cbt-task"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryCbtTaskResult.java b/sdk/src/main/java/org/zstack/sdk/QueryCbtTaskResult.java new file mode 100644 index 00000000000..470267e3742 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryCbtTaskResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryCbtTaskResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UnexportNbdVolumesAction.java b/sdk/src/main/java/org/zstack/sdk/UnexportNbdVolumesAction.java new file mode 100644 index 00000000000..d73e1c0dbc9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UnexportNbdVolumesAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UnexportNbdVolumesAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UnexportNbdVolumesResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List volumeUuids; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmInstanceUuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UnexportNbdVolumesResult value = res.getResult(org.zstack.sdk.UnexportNbdVolumesResult.class); + ret.value = value == null ? new org.zstack.sdk.UnexportNbdVolumesResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/cbt-task/unexportvolume"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UnexportNbdVolumesResult.java b/sdk/src/main/java/org/zstack/sdk/UnexportNbdVolumesResult.java new file mode 100644 index 00000000000..ba206af82c2 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UnexportNbdVolumesResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class UnexportNbdVolumesResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/VHostAddOn.java b/sdk/src/main/java/org/zstack/sdk/VHostAddOn.java new file mode 100644 index 00000000000..b4af44bcb32 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/VHostAddOn.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + + + +public class VHostAddOn { + + public int queueNum; + public void setQueueNum(int queueNum) { + this.queueNum = queueNum; + } + public int getQueueNum() { + return this.queueNum; + } + + public java.lang.String rxBufferSize; + public void setRxBufferSize(java.lang.String rxBufferSize) { + this.rxBufferSize = rxBufferSize; + } + public java.lang.String getRxBufferSize() { + return this.rxBufferSize; + } + + public java.lang.String txBufferSize; + public void setTxBufferSize(java.lang.String txBufferSize) { + this.txBufferSize = txBufferSize; + } + public java.lang.String getTxBufferSize() { + return this.txBufferSize; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/VolumeCbtBackupInfo.java b/sdk/src/main/java/org/zstack/sdk/VolumeCbtBackupInfo.java new file mode 100644 index 00000000000..7d34acd4502 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/VolumeCbtBackupInfo.java @@ -0,0 +1,79 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VolumeTO; + +public class VolumeCbtBackupInfo { + + public VolumeTO volume; + public void setVolume(VolumeTO volume) { + this.volume = volume; + } + public VolumeTO getVolume() { + return this.volume; + } + + public java.lang.String bitmapBase64; + public void setBitmapBase64(java.lang.String bitmapBase64) { + this.bitmapBase64 = bitmapBase64; + } + public java.lang.String getBitmapBase64() { + return this.bitmapBase64; + } + + public java.lang.String target; + public void setTarget(java.lang.String target) { + this.target = target; + } + public java.lang.String getTarget() { + return this.target; + } + + public java.lang.String scratchNodeName; + public void setScratchNodeName(java.lang.String scratchNodeName) { + this.scratchNodeName = scratchNodeName; + } + public java.lang.String getScratchNodeName() { + return this.scratchNodeName; + } + + public java.lang.String metadata; + public void setMetadata(java.lang.String metadata) { + this.metadata = metadata; + } + public java.lang.String getMetadata() { + return this.metadata; + } + + public java.lang.String nbdPort; + public void setNbdPort(java.lang.String nbdPort) { + this.nbdPort = nbdPort; + } + public java.lang.String getNbdPort() { + return this.nbdPort; + } + + public java.lang.String nbdServer; + public void setNbdServer(java.lang.String nbdServer) { + this.nbdServer = nbdServer; + } + public java.lang.String getNbdServer() { + return this.nbdServer; + } + + public java.lang.String mode; + public void setMode(java.lang.String mode) { + this.mode = mode; + } + public java.lang.String getMode() { + return this.mode; + } + + public java.lang.String bitmapName; + public void setBitmapName(java.lang.String bitmapName) { + this.bitmapName = bitmapName; + } + public java.lang.String getBitmapName() { + return this.bitmapName; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/VolumeTO.java b/sdk/src/main/java/org/zstack/sdk/VolumeTO.java new file mode 100644 index 00000000000..84eb1d8518f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/VolumeTO.java @@ -0,0 +1,159 @@ +package org.zstack.sdk; + + + +public class VolumeTO extends org.zstack.sdk.BaseVirtualDeviceTO { + + public java.lang.String installPath; + public void setInstallPath(java.lang.String installPath) { + this.installPath = installPath; + } + public java.lang.String getInstallPath() { + return this.installPath; + } + + public int deviceId; + public void setDeviceId(int deviceId) { + this.deviceId = deviceId; + } + public int getDeviceId() { + return this.deviceId; + } + + public java.lang.String deviceType; + public void setDeviceType(java.lang.String deviceType) { + this.deviceType = deviceType; + } + public java.lang.String getDeviceType() { + return this.deviceType; + } + + public java.lang.String volumeUuid; + public void setVolumeUuid(java.lang.String volumeUuid) { + this.volumeUuid = volumeUuid; + } + public java.lang.String getVolumeUuid() { + return this.volumeUuid; + } + + public boolean useVirtio; + public void setUseVirtio(boolean useVirtio) { + this.useVirtio = useVirtio; + } + public boolean getUseVirtio() { + return this.useVirtio; + } + + public boolean useVirtioSCSI; + public void setUseVirtioSCSI(boolean useVirtioSCSI) { + this.useVirtioSCSI = useVirtioSCSI; + } + public boolean getUseVirtioSCSI() { + return this.useVirtioSCSI; + } + + public boolean shareable; + public void setShareable(boolean shareable) { + this.shareable = shareable; + } + public boolean getShareable() { + return this.shareable; + } + + public java.lang.String cacheMode; + public void setCacheMode(java.lang.String cacheMode) { + this.cacheMode = cacheMode; + } + public java.lang.String getCacheMode() { + return this.cacheMode; + } + + public boolean aioNative; + public void setAioNative(boolean aioNative) { + this.aioNative = aioNative; + } + public boolean getAioNative() { + return this.aioNative; + } + + public java.lang.String wwn; + public void setWwn(java.lang.String wwn) { + this.wwn = wwn; + } + public java.lang.String getWwn() { + return this.wwn; + } + + public int bootOrder; + public void setBootOrder(int bootOrder) { + this.bootOrder = bootOrder; + } + public int getBootOrder() { + return this.bootOrder; + } + + public int physicalBlockSize; + public void setPhysicalBlockSize(int physicalBlockSize) { + this.physicalBlockSize = physicalBlockSize; + } + public int getPhysicalBlockSize() { + return this.physicalBlockSize; + } + + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.lang.String format; + public void setFormat(java.lang.String format) { + this.format = format; + } + public java.lang.String getFormat() { + return this.format; + } + + public java.lang.String primaryStorageType; + public void setPrimaryStorageType(java.lang.String primaryStorageType) { + this.primaryStorageType = primaryStorageType; + } + public java.lang.String getPrimaryStorageType() { + return this.primaryStorageType; + } + + public java.lang.String multiQueues; + public void setMultiQueues(java.lang.String multiQueues) { + this.multiQueues = multiQueues; + } + public java.lang.String getMultiQueues() { + return this.multiQueues; + } + + public int ioThreadId; + public void setIoThreadId(int ioThreadId) { + this.ioThreadId = ioThreadId; + } + public int getIoThreadId() { + return this.ioThreadId; + } + + public java.lang.String ioThreadPin; + public void setIoThreadPin(java.lang.String ioThreadPin) { + this.ioThreadPin = ioThreadPin; + } + public java.lang.String getIoThreadPin() { + return this.ioThreadPin; + } + + public int controllerIndex; + public void setControllerIndex(int controllerIndex) { + this.controllerIndex = controllerIndex; + } + public int getControllerIndex() { + return this.controllerIndex; + } + +} diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java b/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java index fe0a7dc4187..8f2da2c5449 100755 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java @@ -143,6 +143,8 @@ private void handleLocalMessage(Message msg) { handle((BatchSyncManagedActiveVolumeSizeMsg) msg); } else if (msg instanceof BatchSyncActiveVolumeSizeOnHostMsg) { handle((BatchSyncActiveVolumeSizeOnHostMsg) msg); + } else if (msg instanceof CreateDataVolumeMsg) { + handle((CreateDataVolumeMsg) msg); } else { bus.dealWithUnknownMessage(msg); } @@ -1008,8 +1010,8 @@ public void run(MessageReply reply) { }); } - private void handle(APICreateDataVolumeMsg msg) { - APICreateDataVolumeEvent evt = new APICreateDataVolumeEvent(msg.getId()); + private void handle(CreateDataVolumeMsg msg) { + CreateVolumeReply reply = new CreateVolumeReply(); pluginRgty.getExtensionList(CreateDataVolumeExtensionPoint.class).forEach(extensionPoint -> { extensionPoint.preCreateVolume(msg); }); @@ -1027,7 +1029,7 @@ private void handle(APICreateDataVolumeMsg msg) { vo.setActualSize(0L); vo.setType(VolumeType.Data); vo.setStatus(VolumeStatus.NotInstantiated); - vo.setAccountUuid(msg.getSession().getAccountUuid()); + vo.setAccountUuid(msg.getAccountUuid()); if (msg.getSystemTags() != null) { Iterator iterators = msg.getSystemTags().iterator(); @@ -1060,7 +1062,10 @@ protected VolumeVO scripts() { } }.execute(); - tagMgr.createTagsFromAPICreateMessage(msg, finalVo1.getUuid(), VolumeVO.class.getSimpleName()); + if (msg.getApiMsg() != null) { + tagMgr.createTagsFromAPICreateMessage(msg.getApiMsg(), finalVo1.getUuid(), VolumeVO.class.getSimpleName()); + } + for (CreateDataVolumeExtensionPoint ext : exts) { ext.afterCreateVolume(vo); } @@ -1079,9 +1084,9 @@ protected VolumeVO scripts() { new FireVolumeCanonicalEvent().fireVolumeStatusChangedEvent(null, VolumeInventory.valueOf(vo)); VolumeInventory inv = VolumeInventory.valueOf(vo); - evt.setInventory(inv); + reply.setInventory(inv); logger.debug(String.format("Successfully created data volume[name:%s, uuid:%s, size:%s]", inv.getName(), inv.getUuid(), inv.getSize())); - bus.publish(evt); + bus.reply(msg, reply); return; } @@ -1093,15 +1098,41 @@ protected VolumeVO scripts() { bus.makeTargetServiceIdByResourceUuid(imsg, VolumeConstant.SERVICE_ID, vo.getUuid()); VolumeVO finalVo = vo; bus.send(imsg, new CloudBusCallBack(msg) { + @Override + public void run(MessageReply r) { + InstantiateVolumeReply cr = r.castReply(); + if (!cr.isSuccess()) { + dbf.remove(finalVo); + reply.setError(cr.getError()); + } else { + reply.setInventory(cr.getVolume()); + } + bus.reply(msg, reply); + } + }); + } + + private void handle(APICreateDataVolumeMsg msg) { + APICreateDataVolumeEvent evt = new APICreateDataVolumeEvent(msg.getId()); + CreateDataVolumeMsg cmsg = new CreateDataVolumeMsg(); + cmsg.setAccountUuid(msg.getSession().getAccountUuid()); + cmsg.setDiskSize(msg.getDiskSize()); + cmsg.setName(msg.getName()); + cmsg.setSystemTags(msg.getSystemTags()); + cmsg.setDiskOfferingUuid(msg.getDiskOfferingUuid()); + cmsg.setPrimaryStorageUuid(msg.getPrimaryStorageUuid()); + cmsg.setDescription(msg.getDescription()); + cmsg.setApiMsg(msg); + bus.makeLocalServiceId(cmsg, VolumeConstant.SERVICE_ID); + bus.send(cmsg, new CloudBusCallBack(msg) { @Override public void run(MessageReply reply) { + CreateVolumeReply cr = reply.castReply(); if (!reply.isSuccess()) { - dbf.remove(finalVo); evt.setError(reply.getError()); } else { - evt.setInventory(((InstantiateVolumeReply) reply).getVolume()); + evt.setInventory(cr.getInventory()); } - bus.publish(evt); } }); diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeSystemTags.java b/storage/src/main/java/org/zstack/storage/volume/VolumeSystemTags.java index 5903931018b..b6772555b89 100644 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeSystemTags.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeSystemTags.java @@ -21,7 +21,6 @@ public class VolumeSystemTags { public static String VOLUME_PROVISIONING_STRATEGY_TOKEN = "volumeProvisioningStrategy"; public static PatternedSystemTag VOLUME_PROVISIONING_STRATEGY = new PatternedSystemTag(String.format("volumeProvisioningStrategy::{%s}", VOLUME_PROVISIONING_STRATEGY_TOKEN), VolumeVO.class); - public static String PRIMARY_STORAGE_VOLUME_PROVISIONING_STRATEGY_TOKEN = "primaryStorageVolumeProvisioningStrategy"; public static PatternedSystemTag PRIMARY_STORAGE_VOLUME_PROVISIONING_STRATEGY = new PatternedSystemTag(String.format("primaryStorageVolumeProvisioningStrategy::{%s}", PRIMARY_STORAGE_VOLUME_PROVISIONING_STRATEGY_TOKEN), PrimaryStorageVO.class); @@ -43,6 +42,9 @@ public class VolumeSystemTags { @NonCloneable public static EphemeralSystemTag FLATTEN = new EphemeralSystemTag("volume::flatten"); + @NonCloneable + public static EphemeralSystemTag FORMAT_QCOW2 = new EphemeralSystemTag("volume::format::qcow2"); + public static String VOLUME_QOS_TOKEN = "qos"; public static PatternedSystemTag VOLUME_QOS = new PatternedSystemTag(String.format("%s::{%s}", VOLUME_QOS_TOKEN, VOLUME_QOS_TOKEN), VolumeVO.class); } diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index f6eea6b087d..1f573fb2dd1 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -8441,6 +8441,33 @@ abstract class ApiHelper { } + def createCbtTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateCbtTaskAction.class) Closure c) { + def a = new org.zstack.sdk.CreateCbtTaskAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def createCdpPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateCdpPolicyAction.class) Closure c) { def a = new org.zstack.sdk.CreateCdpPolicyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -13220,6 +13247,33 @@ abstract class ApiHelper { } + def deleteCbtTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteCbtTaskAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteCbtTaskAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def deleteCdpPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteCdpPolicyAction.class) Closure c) { def a = new org.zstack.sdk.DeleteCdpPolicyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -13442,7 +13496,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -15156,7 +15210,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -15183,7 +15237,8 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + + return out } else { return errorOut(a.call()) @@ -15264,7 +15319,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -17559,7 +17614,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -17586,7 +17641,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -18998,6 +19053,33 @@ abstract class ApiHelper { } + def disableCbtTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DisableCbtTaskAction.class) Closure c) { + def a = new org.zstack.sdk.DisableCbtTaskAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def disableCdpTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DisableCdpTaskAction.class) Closure c) { def a = new org.zstack.sdk.DisableCdpTaskAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -19106,6 +19188,33 @@ abstract class ApiHelper { } + def enableCbtTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.EnableCbtTaskAction.class) Closure c) { + def a = new org.zstack.sdk.EnableCbtTaskAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def enableCdpTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.EnableCdpTaskAction.class) Closure c) { def a = new org.zstack.sdk.EnableCdpTaskAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -19274,6 +19383,32 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def exportNbdVolumes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExportNbdVolumesAction.class) Closure c) { + def a = new org.zstack.sdk.ExportNbdVolumesAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() if (System.getProperty("apipath") != null) { @@ -28845,6 +28980,35 @@ abstract class ApiHelper { } + def queryCbtTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryCbtTaskAction.class) Closure c) { + def a = new org.zstack.sdk.QueryCbtTaskAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryCdpPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryCdpPolicyAction.class) Closure c) { def a = new org.zstack.sdk.QueryCdpPolicyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -40616,6 +40780,33 @@ abstract class ApiHelper { } + def unexportNbdVolumes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UnexportNbdVolumesAction.class) Closure c) { + def a = new org.zstack.sdk.UnexportNbdVolumesAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def ungenerateMdevDevices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UngenerateMdevDevicesAction.class) Closure c) { def a = new org.zstack.sdk.UngenerateMdevDevicesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -42242,7 +42433,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -42269,7 +42460,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -43929,7 +44120,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -43956,7 +44147,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) From 2074f7ab25d5c698fba53b52fc5ac03f1bb14e10 Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Mon, 14 Apr 2025 10:28:29 +0800 Subject: [PATCH 336/737] [conf]: update schema version from 4.5.1 to 4.5.1.2 DBImpact Resolves: ZSTAC-74457 Change-Id: I656c744578697762756766757964616577616962 --- conf/db/upgrade/{V4.5.1__schema.sql => V4.5.1.2__schema.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename conf/db/upgrade/{V4.5.1__schema.sql => V4.5.1.2__schema.sql} (100%) diff --git a/conf/db/upgrade/V4.5.1__schema.sql b/conf/db/upgrade/V4.5.1.2__schema.sql similarity index 100% rename from conf/db/upgrade/V4.5.1__schema.sql rename to conf/db/upgrade/V4.5.1.2__schema.sql From 4ab2cc1eb399c78a3019a9f7ac56887cfc7c2350 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Wed, 26 Feb 2025 16:31:38 +0800 Subject: [PATCH 337/737] [network]: add ovn dhcp DBImpact Resolves: ZSTAC-73229 Change-Id: I766b666b7262756f676378696f656c6675726966 --- .../compute/vm/VmAllocateNicIpFlow.java | 2 +- .../org/zstack/compute/vm/VmNicQosStruct.java | 1 + .../org/zstack/compute/vm/VmSystemTags.java | 2 + conf/db/upgrade/V5.3.28__schema.sql | 2 + conf/springConfigXml/SecurityGroupManager.xml | 1 + conf/springConfigXml/sdnController.xml | 7 +- .../zstack/core/upgrade/UpgradeChecker.java | 3 +- .../header/network/l2/OvsVSwitchBackend.java | 22 - .../l2/SdnControllerDeleteExtensionPoint.java | 7 + .../network/l2/VSwitchOvsConfigStruct.java | 124 -- .../header/network/l2/VSwitchOvsManager.java | 7 - .../header/network/l3/IpRangeFactory.java | 5 +- .../l3/L3NetworkUpdateExtensionPoint.java | 5 + .../GetSdnControllerDhcpExtensionPoint.java | 5 + .../service/NetworkServiceProviderType.java | 20 +- .../network/service/SdnControllerDhcp.java | 42 + .../zstack/header/vm/VmInstanceConstant.java | 3 + .../network/l2/L2NetworkSystemTags.java | 11 + .../network/l3/AddressPoolIpRangeFactory.java | 79 +- .../network/l3/IpRangeCascadeExtension.java | 2 +- .../org/zstack/network/l3/IpRangeHelper.java | 19 + .../org/zstack/network/l3/L3BasicNetwork.java | 367 +++-- .../zstack/network/l3/L3NetworkHelper.java | 35 + .../zstack/network/l3/L3NetworkManager.java | 3 + .../network/l3/L3NetworkManagerImpl.java | 75 +- .../network/l3/NormalIpRangeFactory.java | 164 ++- .../zstack/network/service/DhcpExtension.java | 36 +- plugin/flatNetworkProvider/pom.xml | 5 + .../network/service/flat/FlatDhcpBackend.java | 96 +- .../service/flat/FlatProviderFactory.java | 9 + .../SdnControllerApiInterceptor.java | 150 +- .../sdnController/SdnControllerBase.java | 32 +- .../sdnController/SdnControllerFactory.java | 10 +- .../zstack/sdnController/SdnControllerL2.java | 4 +- .../sdnController/SdnControllerManager.java | 3 + .../SdnControllerManagerImpl.java | 84 +- .../SdnControllerSystemTags.java | 11 - .../h3cVcfc/H3cVcfcSdnControllerFactory.java | 6 + ...APISdnControllerAddHostMsgDoc_zh_cn.groovy | 2 +- .../header/APISdnControllerRemoveHostMsg.java | 3 +- .../APICreateSecurityGroupMsg.java | 17 + .../APICreateSecurityGroupMsgDoc_zh_cn.groovy | 10 + .../securitygroup/CreateSecurityGroupMsg.java | 18 + .../RefreshSecurityGroupRulesOnVmMsg.java | 18 + .../zstack/network/securitygroup/RuleTO.java | 16 +- .../SecurityGroupCascadeExtension.java | 163 +-- .../securitygroup/SecurityGroupConstant.java | 2 +- ...urityGroupGetSdnBackendExtensionPoint.java | 5 + .../SecurityGroupGlobalConfig.java | 8 + .../securitygroup/SecurityGroupHelper.java | 23 + .../securitygroup/SecurityGroupInventory.java | 12 + .../SecurityGroupManagerImpl.java | 1267 +++++++++++++++-- .../SecurityGroupNetworkServiceExtension.java | 3 + .../securitygroup/SecurityGroupOwner.java | 12 + .../SecurityGroupProviderFactory.java | 6 + .../SecurityGroupSdnBackend.java | 14 + .../SecurityGroupSystemTags.java | 11 + .../securitygroup/SecurityGroupTo.java | 63 + .../securitygroup/SecurityGroupVO.java | 12 +- .../securitygroup/SecurityGroupVO_.java | 1 + .../securitygroup/VmNicSecurityGroupTo.java | 25 + .../securitygroup/VmNicSecurityTO.java | 9 + .../controller/SugonSdnControllerFactory.java | 6 + .../VirtualRouterManagerImpl.java | 12 +- .../virtualrouter/vip/VirtualRouterVipVO.java | 2 + .../virtualrouter/vyos/VyosVmBaseFactory.java | 10 +- .../zstack/sdk/CreateSecurityGroupAction.java | 3 + .../zstack/sdk/SecurityGroupInventory.java | 8 + .../ChangeSecurityGroupRuleStateCase.groovy | 6 +- .../SecurityGroupAccountCase.groovy | 145 ++ 70 files changed, 2687 insertions(+), 684 deletions(-) delete mode 100644 header/src/main/java/org/zstack/header/network/l2/OvsVSwitchBackend.java create mode 100644 header/src/main/java/org/zstack/header/network/l2/SdnControllerDeleteExtensionPoint.java delete mode 100644 header/src/main/java/org/zstack/header/network/l2/VSwitchOvsConfigStruct.java delete mode 100644 header/src/main/java/org/zstack/header/network/l2/VSwitchOvsManager.java create mode 100644 header/src/main/java/org/zstack/header/network/l3/L3NetworkUpdateExtensionPoint.java create mode 100644 header/src/main/java/org/zstack/header/network/service/GetSdnControllerDhcpExtensionPoint.java create mode 100644 header/src/main/java/org/zstack/header/network/service/SdnControllerDhcp.java create mode 100644 network/src/main/java/org/zstack/network/l2/L2NetworkSystemTags.java create mode 100644 network/src/main/java/org/zstack/network/l3/L3NetworkHelper.java delete mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerSystemTags.java create mode 100644 plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGetSdnBackendExtensionPoint.java create mode 100644 plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupHelper.java create mode 100644 plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupOwner.java create mode 100644 plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupSdnBackend.java create mode 100644 plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupSystemTags.java create mode 100644 plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupTo.java create mode 100644 plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/VmNicSecurityGroupTo.java create mode 100644 test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/SecurityGroupAccountCase.groovy diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicIpFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicIpFlow.java index 007f5b71a5e..bb0fdafcb01 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicIpFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicIpFlow.java @@ -168,8 +168,8 @@ public void done(ErrorCodeList errorCodeList) { UsedIpVO ipVO = Q.New(UsedIpVO.class).eq(UsedIpVO_.uuid, usedIp.getUuid()).find(); ipVO.setVmNicUuid(nic.getUuid()); ipVOS.add(ipVO); + nic.getUsedIps().add(ipVO); } - nic.setUsedIps(ipVOS); nicsWithIp.add(nic); spec.getDestNics().removeIf(inv -> nic.getUuid().equals(inv.getUuid())); spec.getDestNics().add(VmNicInventory.valueOf(nic)); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmNicQosStruct.java b/compute/src/main/java/org/zstack/compute/vm/VmNicQosStruct.java index b2fc09d36f5..20dc50c7f7f 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmNicQosStruct.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmNicQosStruct.java @@ -4,6 +4,7 @@ public class VmNicQosStruct { public String hostUuid; public String vmUuid; public String vmNicUuid; + public String l2Uuid; public String internalName; public Long outboundBandwidth; public Long inboundBandwidth; diff --git a/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java b/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java index da80e9c6ebf..21c9668175a 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java @@ -308,4 +308,6 @@ public String desensitizeTag(SystemTag systemTag, String tag) { } public static PatternedSystemTag VM_STATE_PAUSED_AFTER_MIGRATE = new PatternedSystemTag(("vmPausedAfterMigrate"), VmInstanceVO.class); + + public static PatternedSystemTag VM_MEMORY_ACCESS_MODE_SHARED = new PatternedSystemTag(("vmMemoryAccessModeShared"), VmInstanceVO.class); } diff --git a/conf/db/upgrade/V5.3.28__schema.sql b/conf/db/upgrade/V5.3.28__schema.sql index 74495fc0896..856a9ea1206 100644 --- a/conf/db/upgrade/V5.3.28__schema.sql +++ b/conf/db/upgrade/V5.3.28__schema.sql @@ -111,3 +111,5 @@ SET t.rootImageUuid = v.rootImageUuid WHERE t.current = true AND v.rootImageUuid IS NOT NULL AND t.rootImageUuid IS NULL; + +CALL ADD_COLUMN('SecurityGroupVO', 'vSwitchType', 'VARCHAR(32)', 0, 'LinuxBridge'); diff --git a/conf/springConfigXml/SecurityGroupManager.xml b/conf/springConfigXml/SecurityGroupManager.xml index 6cbc6bab713..923a01f5d3e 100755 --- a/conf/springConfigXml/SecurityGroupManager.xml +++ b/conf/springConfigXml/SecurityGroupManager.xml @@ -21,6 +21,7 @@ + diff --git a/conf/springConfigXml/sdnController.xml b/conf/springConfigXml/sdnController.xml index 7d354f415bd..068e846cffc 100644 --- a/conf/springConfigXml/sdnController.xml +++ b/conf/springConfigXml/sdnController.xml @@ -27,9 +27,11 @@ - + - + + + @@ -89,4 +91,5 @@ + diff --git a/core/src/main/java/org/zstack/core/upgrade/UpgradeChecker.java b/core/src/main/java/org/zstack/core/upgrade/UpgradeChecker.java index 7bed38dcb4f..f62c65bc03e 100644 --- a/core/src/main/java/org/zstack/core/upgrade/UpgradeChecker.java +++ b/core/src/main/java/org/zstack/core/upgrade/UpgradeChecker.java @@ -236,7 +236,8 @@ public ErrorCode checkAgentHttpParamChanges(String agentUuid, String commandName VersionComparator currentVersion = new VersionComparator(agentVersionVO.getCurrentVersion()); Set> entries = fields.entrySet() .stream() - .filter(entry -> currentVersion.lessThan(entry.getValue())) + .filter(entry -> {//logger.debug(String.format("entry key: %s, value:%s", entry.getKey(), entry.getValue())); + return currentVersion.lessThan(entry.getValue());}) .collect(Collectors.toSet()); // do not have new version changes diff --git a/header/src/main/java/org/zstack/header/network/l2/OvsVSwitchBackend.java b/header/src/main/java/org/zstack/header/network/l2/OvsVSwitchBackend.java deleted file mode 100644 index a5a553f0809..00000000000 --- a/header/src/main/java/org/zstack/header/network/l2/OvsVSwitchBackend.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.zstack.header.network.l2; - -import org.zstack.header.core.Completion; -import org.zstack.header.core.NoErrorCompletion; -import org.zstack.header.host.HypervisorType; -import org.zstack.header.vm.VmNicInventory; - -import java.util.List; - -public interface OvsVSwitchBackend { - HypervisorType getHypervisorType(); - - void installPackages(String hostUuid, VSwitchOvsConfigStruct struct, Completion completion); - void startService(String hostUuid, VSwitchOvsConfigStruct struct, Completion completion); - - void unInstallPackages(String hostUuid, VSwitchOvsConfigStruct struct, NoErrorCompletion completion); - void stopService(String hostUuid, VSwitchOvsConfigStruct struct, NoErrorCompletion completion); - - void addOvsPort(String hostUuid, String vswitchType, boolean sync, boolean reinstall, - List nics, Completion completion); - void delOvsPort(String hostUuid, String vswitchType, List nics, Completion completion); -} diff --git a/header/src/main/java/org/zstack/header/network/l2/SdnControllerDeleteExtensionPoint.java b/header/src/main/java/org/zstack/header/network/l2/SdnControllerDeleteExtensionPoint.java new file mode 100644 index 00000000000..c443878b0a3 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/l2/SdnControllerDeleteExtensionPoint.java @@ -0,0 +1,7 @@ +package org.zstack.header.network.l2; + +import org.zstack.header.core.Completion; + +public interface SdnControllerDeleteExtensionPoint { + void deleteNetworkServiceOfSdnController(String sdnControllerUuid, Completion completion); +} diff --git a/header/src/main/java/org/zstack/header/network/l2/VSwitchOvsConfigStruct.java b/header/src/main/java/org/zstack/header/network/l2/VSwitchOvsConfigStruct.java deleted file mode 100644 index 4697c069ac9..00000000000 --- a/header/src/main/java/org/zstack/header/network/l2/VSwitchOvsConfigStruct.java +++ /dev/null @@ -1,124 +0,0 @@ -package org.zstack.header.network.l2; - -import java.util.Map; - -public class VSwitchOvsConfigStruct { - private boolean hostStatusCheck = true; - - private String ovnControllerIp; - private String vSwitchType; - private String brExName; - private Map nicNamePciMap; - private Map nicNameDriverMap; - private String ovnEncapIP; - private String ovnEncapNetmask; - private String ovnRemoteConnection; - private String ovnEncapType; - private int hugePageNumber; - private String bondMode; - private String lacpMode; - - public String getvSwitchType() { - return vSwitchType; - } - - public void setvSwitchType(String vSwitchType) { - this.vSwitchType = vSwitchType; - } - - public String getOvnControllerIp() { - return ovnControllerIp; - } - - public void setOvnControllerIp(String ovnControllerIp) { - this.ovnControllerIp = ovnControllerIp; - } - - public String getBrExName() { - return brExName; - } - - public void setBrExName(String brExName) { - this.brExName = brExName; - } - - public Map getNicNamePciMap() { - return nicNamePciMap; - } - - public void setNicNamePciMap(Map nicNamePciMap) { - this.nicNamePciMap = nicNamePciMap; - } - - public String getOvnEncapIP() { - return ovnEncapIP; - } - - public void setOvnEncapIP(String ovnEncapIP) { - this.ovnEncapIP = ovnEncapIP; - } - - public String getOvnRemoteConnection() { - return ovnRemoteConnection; - } - - public void setOvnRemoteConnection(String ovnRemoteConnection) { - this.ovnRemoteConnection = ovnRemoteConnection; - } - - public String getOvnEncapType() { - return ovnEncapType; - } - - public void setOvnEncapType(String ovnEncapType) { - this.ovnEncapType = ovnEncapType; - } - - public int getHugePageNumber() { - return hugePageNumber; - } - - public void setHugePageNumber(int hugePageNumber) { - this.hugePageNumber = hugePageNumber; - } - - public Map getNicNameDriverMap() { - return nicNameDriverMap; - } - - public void setNicNameDriverMap(Map nicNameDriverMap) { - this.nicNameDriverMap = nicNameDriverMap; - } - - public boolean isHostStatusCheck() { - return hostStatusCheck; - } - - public void setHostStatusCheck(boolean hostStatusCheck) { - this.hostStatusCheck = hostStatusCheck; - } - - public String getBondMode() { - return bondMode; - } - - public void setBondMode(String bondMode) { - this.bondMode = bondMode; - } - - public String getLacpMode() { - return lacpMode; - } - - public void setLacpMode(String lacpMode) { - this.lacpMode = lacpMode; - } - - public String getOvnEncapNetmask() { - return ovnEncapNetmask; - } - - public void setOvnEncapNetmask(String ovnEncapNetmask) { - this.ovnEncapNetmask = ovnEncapNetmask; - } -} diff --git a/header/src/main/java/org/zstack/header/network/l2/VSwitchOvsManager.java b/header/src/main/java/org/zstack/header/network/l2/VSwitchOvsManager.java deleted file mode 100644 index 580ba862d17..00000000000 --- a/header/src/main/java/org/zstack/header/network/l2/VSwitchOvsManager.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.zstack.header.network.l2; - -import org.zstack.header.host.HypervisorType; - -public interface VSwitchOvsManager { - public OvsVSwitchBackend getOvsVSwitchBackend(HypervisorType type); -} diff --git a/header/src/main/java/org/zstack/header/network/l3/IpRangeFactory.java b/header/src/main/java/org/zstack/header/network/l3/IpRangeFactory.java index ed6537164fd..6ad1a5507b7 100644 --- a/header/src/main/java/org/zstack/header/network/l3/IpRangeFactory.java +++ b/header/src/main/java/org/zstack/header/network/l3/IpRangeFactory.java @@ -1,9 +1,12 @@ package org.zstack.header.network.l3; +import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.message.APICreateMessage; +import java.util.List; + public interface IpRangeFactory { IpRangeType getType(); - IpRangeInventory createIpRange(IpRangeInventory ipr, APICreateMessage msg); + void createIpRange(List iprs, APICreateMessage msg, ReturnValueCompletion> completion); } diff --git a/header/src/main/java/org/zstack/header/network/l3/L3NetworkUpdateExtensionPoint.java b/header/src/main/java/org/zstack/header/network/l3/L3NetworkUpdateExtensionPoint.java new file mode 100644 index 00000000000..6699c0b0021 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/l3/L3NetworkUpdateExtensionPoint.java @@ -0,0 +1,5 @@ +package org.zstack.header.network.l3; + +public interface L3NetworkUpdateExtensionPoint { + void updateL3NetworkMtu(L3NetworkInventory inventory); +} diff --git a/header/src/main/java/org/zstack/header/network/service/GetSdnControllerDhcpExtensionPoint.java b/header/src/main/java/org/zstack/header/network/service/GetSdnControllerDhcpExtensionPoint.java new file mode 100644 index 00000000000..468d46f4ae8 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/service/GetSdnControllerDhcpExtensionPoint.java @@ -0,0 +1,5 @@ +package org.zstack.header.network.service; + +public interface GetSdnControllerDhcpExtensionPoint { + SdnControllerDhcp getSdnControllerDhcp(String l3Uuid); +} diff --git a/header/src/main/java/org/zstack/header/network/service/NetworkServiceProviderType.java b/header/src/main/java/org/zstack/header/network/service/NetworkServiceProviderType.java index 1512ba53865..852bd09c401 100755 --- a/header/src/main/java/org/zstack/header/network/service/NetworkServiceProviderType.java +++ b/header/src/main/java/org/zstack/header/network/service/NetworkServiceProviderType.java @@ -8,6 +8,8 @@ public class NetworkServiceProviderType { private static Map types = Collections.synchronizedMap(new HashMap()); private final String typeName; + private boolean createDhcpNameSpace = true; + private boolean allocateDhcpServerIp = true; public NetworkServiceProviderType(String typeName) { this.typeName = typeName; @@ -29,7 +31,7 @@ public String toString() { @Override public boolean equals(Object t) { - if (t == null || !(t instanceof NetworkServiceProviderType)) { + if (!(t instanceof NetworkServiceProviderType)) { return false; } @@ -37,6 +39,22 @@ public boolean equals(Object t) { return type.toString().equals(typeName); } + public boolean isCreateDhcpNameSpace() { + return createDhcpNameSpace; + } + + public void setCreateDhcpNameSpace(boolean createDhcpNameSpace) { + this.createDhcpNameSpace = createDhcpNameSpace; + } + + public boolean isAllocateDhcpServerIp() { + return allocateDhcpServerIp; + } + + public void setAllocateDhcpServerIp(boolean allocateDhcpServerIp) { + this.allocateDhcpServerIp = allocateDhcpServerIp; + } + @Override public int hashCode() { return typeName.hashCode(); diff --git a/header/src/main/java/org/zstack/header/network/service/SdnControllerDhcp.java b/header/src/main/java/org/zstack/header/network/service/SdnControllerDhcp.java new file mode 100644 index 00000000000..1a14f3f6b68 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/service/SdnControllerDhcp.java @@ -0,0 +1,42 @@ +package org.zstack.header.network.service; + +import org.zstack.header.core.Completion; +import org.zstack.header.network.l3.IpRangeInventory; +import org.zstack.header.network.l3.L3NetworkInventory; +import org.zstack.header.network.l3.L3NetworkVO; + +import java.util.List; + +/** + * 该接口定义了 SDN 控制器处理 DHCP 服务的方法。 + * 实现该接口的类负责在 SDN 环境中分配、启用和禁用 DHCP 服务。 + + */ +public interface SdnControllerDhcp { + + /** + * 为 L3 网络分配 DHCP 服务并启用 + * @param vo L3 网络 VO 对象 + * @param systemTags 系统标签列表 + * @param completion 操作完成后的回调 + * */ + + void allocateDhcpAndEnableDhcp(L3NetworkVO vo, List systemTags, Completion completion); + + /** + * 启用指定 L3 网络的 DHCP 服务 + * @param invs L3 网络清单列表 + * @param sync 是否同步操作 + * @param completion 操作完成后的回调 + * */ + + void enableDhcp(List invs, boolean sync, Completion completion); + + /** + * 禁用指定 L3 网络的 DHCP 服务 + * @param invs L3 网络清单列表 + * @param ipversion IP 版本 + * @param completion 操作完成后的回调 + * */ + + void disableDhcp(List invs, int ipversion, Completion completion); +} diff --git a/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java b/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java index e452dfb712c..6c76c9809a5 100755 --- a/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java +++ b/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java @@ -87,4 +87,7 @@ enum Capability { String EMPTY_CDROM = "empty"; String NONE_CDROM = "none"; + + String MEMORY_ACCESS_MODE_SHARED = "shared"; + String MEMORY_ACCESS_MODE_PRIVATE = "private"; } diff --git a/network/src/main/java/org/zstack/network/l2/L2NetworkSystemTags.java b/network/src/main/java/org/zstack/network/l2/L2NetworkSystemTags.java new file mode 100644 index 00000000000..77d38d03e69 --- /dev/null +++ b/network/src/main/java/org/zstack/network/l2/L2NetworkSystemTags.java @@ -0,0 +1,11 @@ +package org.zstack.network.l2; + +import org.zstack.header.network.l2.L2NetworkVO; +import org.zstack.header.tag.TagDefinition; +import org.zstack.tag.PatternedSystemTag; + +@TagDefinition +public class L2NetworkSystemTags { + public static String L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN = "SdnControllerUuid"; + public static PatternedSystemTag L2_NETWORK_SDN_CONTROLLER_UUID = new PatternedSystemTag(String.format("SdnControllerUuid::{%s}", L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN), L2NetworkVO.class); +} diff --git a/network/src/main/java/org/zstack/network/l3/AddressPoolIpRangeFactory.java b/network/src/main/java/org/zstack/network/l3/AddressPoolIpRangeFactory.java index 1ae22e7a71c..aae2711248b 100644 --- a/network/src/main/java/org/zstack/network/l3/AddressPoolIpRangeFactory.java +++ b/network/src/main/java/org/zstack/network/l3/AddressPoolIpRangeFactory.java @@ -5,11 +5,15 @@ import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.SQLBatchWithReturn; +import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.message.APICreateMessage; import org.zstack.header.network.l3.*; import org.zstack.utils.CollectionUtils; import org.zstack.utils.function.ForEachFunction; +import java.util.ArrayList; +import java.util.List; + public class AddressPoolIpRangeFactory implements IpRangeFactory { @Autowired DatabaseFacade dbf; @@ -22,40 +26,45 @@ public IpRangeType getType() { } @Override - public IpRangeInventory createIpRange(IpRangeInventory ipr, APICreateMessage msg) { - AddressPoolVO vo = new SQLBatchWithReturn() { - @Override - protected AddressPoolVO scripts() { - AddressPoolVO vo = new AddressPoolVO(); - vo.setUuid(ipr.getUuid() == null ? Platform.getUuid() : ipr.getUuid()); - vo.setDescription(ipr.getDescription()); - vo.setEndIp(ipr.getEndIp()); - vo.setGateway(ipr.getStartIp()); - vo.setL3NetworkUuid(ipr.getL3NetworkUuid()); - vo.setName(ipr.getName()); - vo.setNetmask(ipr.getNetmask()); - vo.setStartIp(ipr.getStartIp()); - vo.setNetworkCidr(ipr.getNetworkCidr()); - vo.setAccountUuid(msg.getSession().getAccountUuid()); - vo.setIpVersion(ipr.getIpVersion()); - vo.setAddressMode(ipr.getAddressMode()); - vo.setPrefixLen(ipr.getPrefixLen()); - dbf.getEntityManager().persist(vo); - dbf.getEntityManager().flush(); - dbf.getEntityManager().refresh(vo); - - return vo; - } - }.execute(); - - final IpRangeInventory finalIpr = AddressPoolInventory.valueOf1(vo); - CollectionUtils.safeForEach(pluginRgty.getExtensionList(AfterAddIpRangeExtensionPoint.class), new ForEachFunction() { - @Override - public void run(AfterAddIpRangeExtensionPoint ext) { - ext.afterAddIpRange(finalIpr, msg.getSystemTags()); - } - }); - - return finalIpr; + public void createIpRange(List iprs, APICreateMessage msg, ReturnValueCompletion> completion) { + List vos = new ArrayList<>(); + for (IpRangeInventory ipr : iprs) { + AddressPoolVO vo = new SQLBatchWithReturn() { + @Override + protected AddressPoolVO scripts() { + AddressPoolVO vo = new AddressPoolVO(); + vo.setUuid(ipr.getUuid() == null ? Platform.getUuid() : ipr.getUuid()); + vo.setDescription(ipr.getDescription()); + vo.setEndIp(ipr.getEndIp()); + vo.setGateway(ipr.getStartIp()); + vo.setL3NetworkUuid(ipr.getL3NetworkUuid()); + vo.setName(ipr.getName()); + vo.setNetmask(ipr.getNetmask()); + vo.setStartIp(ipr.getStartIp()); + vo.setNetworkCidr(ipr.getNetworkCidr()); + vo.setAccountUuid(msg.getSession().getAccountUuid()); + vo.setIpVersion(ipr.getIpVersion()); + vo.setAddressMode(ipr.getAddressMode()); + vo.setPrefixLen(ipr.getPrefixLen()); + dbf.getEntityManager().persist(vo); + dbf.getEntityManager().flush(); + dbf.getEntityManager().refresh(vo); + + return vo; + } + }.execute(); + + vos.add(vo); + + final IpRangeInventory finalIpr = AddressPoolInventory.valueOf1(vo); + CollectionUtils.safeForEach(pluginRgty.getExtensionList(AfterAddIpRangeExtensionPoint.class), new ForEachFunction() { + @Override + public void run(AfterAddIpRangeExtensionPoint ext) { + ext.afterAddIpRange(finalIpr, msg.getSystemTags()); + } + }); + } + + completion.success(IpRangeInventory.valueOf(vos)); } } diff --git a/network/src/main/java/org/zstack/network/l3/IpRangeCascadeExtension.java b/network/src/main/java/org/zstack/network/l3/IpRangeCascadeExtension.java index a44521582f0..115dea698ee 100755 --- a/network/src/main/java/org/zstack/network/l3/IpRangeCascadeExtension.java +++ b/network/src/main/java/org/zstack/network/l3/IpRangeCascadeExtension.java @@ -66,7 +66,7 @@ private void deleteIpRanges(final CascadeAction action,List ip msgs.add(msg); } - new While<>(msgs).all((msg, compl) -> { + new While<>(msgs).each((msg, compl) -> { bus.send(msg, new CloudBusCallBack(compl) { @Override public void run(MessageReply reply) { diff --git a/network/src/main/java/org/zstack/network/l3/IpRangeHelper.java b/network/src/main/java/org/zstack/network/l3/IpRangeHelper.java index 7d428c0f73e..fffbff32665 100644 --- a/network/src/main/java/org/zstack/network/l3/IpRangeHelper.java +++ b/network/src/main/java/org/zstack/network/l3/IpRangeHelper.java @@ -1,4 +1,5 @@ package org.zstack.network.l3; +import org.zstack.core.Platform; import org.zstack.header.exception.CloudRuntimeException; import javax.persistence.Tuple; @@ -262,4 +263,22 @@ public static boolean isIpAddressAllocationEnableOnL3(String l3Uuid) { } return l3NetworkVO.enableIpAddressAllocation(); } + + public static IpRangeVO fromIpRangeInventory(IpRangeInventory ipr, String accountUuid) { + NormalIpRangeVO vo = new NormalIpRangeVO(); + vo.setUuid(ipr.getUuid() == null ? Platform.getUuid() : ipr.getUuid()); + vo.setDescription(ipr.getDescription()); + vo.setEndIp(ipr.getEndIp()); + vo.setGateway(ipr.getGateway()); + vo.setL3NetworkUuid(ipr.getL3NetworkUuid()); + vo.setName(ipr.getName()); + vo.setNetmask(ipr.getNetmask()); + vo.setStartIp(ipr.getStartIp()); + vo.setNetworkCidr(ipr.getNetworkCidr()); + vo.setAccountUuid(accountUuid); + vo.setIpVersion(ipr.getIpVersion()); + vo.setAddressMode(ipr.getAddressMode()); + vo.setPrefixLen(ipr.getPrefixLen()); + return vo; + } } diff --git a/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java b/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java index 6d3fbdf92aa..d1bc69cfd9a 100755 --- a/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java +++ b/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java @@ -13,6 +13,8 @@ import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.*; import org.zstack.core.db.SimpleQuery.Op; +import org.zstack.core.defer.Defer; +import org.zstack.core.defer.Deferred; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.core.retry.Retry; import org.zstack.core.retry.RetryCondition; @@ -60,8 +62,10 @@ import javax.persistence.Tuple; import java.math.BigInteger; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +import static org.codehaus.groovy.runtime.InvokerHelper.asList; import static org.zstack.core.Platform.err; import static org.zstack.utils.CollectionDSL.*; @@ -154,17 +158,25 @@ private void setIpRangeSharedResource(String L3NetworkUuid, String IpRangeUuid) private void handle(APIAddIpRangeMsg msg) { IpRangeInventory ipr = IpRangeInventory.fromMessage(msg); + APIAddIpRangeEvent evt = new APIAddIpRangeEvent(msg.getId()); IpRangeFactory factory = l3NwMgr.getIpRangeFactory(ipr.getIpRangeType()); - IpRangeInventory inv = factory.createIpRange(ipr, msg); - - tagMgr.createTagsFromAPICreateMessage(msg, inv.getL3NetworkUuid(), L3NetworkVO.class.getSimpleName()); - - setIpRangeSharedResource(msg.getL3NetworkUuid(), inv.getUuid()); + factory.createIpRange(Collections.singletonList(ipr), msg, new ReturnValueCompletion>(msg) { + @Override + public void success(List invs) { + IpRangeInventory inv = invs.get(0); + tagMgr.createTagsFromAPICreateMessage(msg, inv.getL3NetworkUuid(), L3NetworkVO.class.getSimpleName()); + setIpRangeSharedResource(msg.getL3NetworkUuid(), inv.getUuid()); + evt.setInventory(inv); + bus.publish(evt); + } - APIAddIpRangeEvent evt = new APIAddIpRangeEvent(msg.getId()); - evt.setInventory(inv); - bus.publish(evt); + @Override + public void fail(ErrorCode errorCode) { + evt.setError(errorCode); + bus.publish(evt); + } + }); } private void handleLocalMessage(Message msg) { @@ -213,55 +225,130 @@ public void run(IpRangeDeletionExtensionPoint arg) { } }); + FlowChain chain = new SimpleFlowChain(); + chain.setName(String.format("del-ip-range-%s", inv.getUuid())); + chain.then(new NoRollbackFlow() { + String __name__ = "disable-sdn-dhcp"; - dbf.remove(iprvo); - IpRangeHelper.updateL3NetworkIpversion(iprvo); - - CollectionUtils.safeForEach(exts, new ForEachFunction() { @Override - public void run(IpRangeDeletionExtensionPoint arg) { - arg.afterDeleteIpRange(inv); + @Deferred + public void run(FlowTrigger trigger, Map data) { + if (!self.enableIpAddressAllocation()) { + trigger.next(); + return; + } + + SdnControllerDhcp sdnDhcp = l3NwMgr.getSdnControllerDhcp(self.getUuid()); + if (sdnDhcp == null) { + trigger.next(); + return; + } + + GLock lock = new GLock(String.format("delete-ip-range-from-l3-%s", self.getUuid()), TimeUnit.MINUTES.toSeconds(5)); + lock.lock(); + Defer.defer(lock::unlock); + + self = dbf.reload(self); + List normalIpRanges = IpRangeHelper.getNormalIpRanges(self); + normalIpRanges = normalIpRanges.stream().filter(r -> r.getIpVersion() == inv.getIpVersion()).collect(Collectors.toList()); + if (normalIpRanges.size() == 1 && normalIpRanges.get(0).getUuid().equals(msg.getIpRangeUuid())) { + sdnDhcp.disableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(self)), inv.getIpVersion(), + new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } else { + trigger.next(); + } } - }); + }).then(new NoRollbackFlow() { + String __name__ = "remove-db"; - bus.reply(msg, reply); + @Override + public void run(FlowTrigger trigger, Map data) { + dbf.remove(iprvo); + IpRangeHelper.updateL3NetworkIpversion(iprvo); + CollectionUtils.safeForEach(exts, new ForEachFunction() { + @Override + public void run(IpRangeDeletionExtensionPoint arg) { + arg.afterDeleteIpRange(inv); + } + }); + trigger.next(); + } + }).error(new FlowErrorHandler(msg) { + @Override + public void handle(ErrorCode errCode, Map data) { + reply.setError(errCode); + bus.reply(msg, reply); + } + }).done(new FlowDoneHandler(msg) { + @Override + public void handle(Map data) { + bus.reply(msg, reply); + } + }).start(); } private void handle(L3NetworkDeletionMsg msg) { - L3NetworkVO l3NetworkVO = dbf.findByUuid(msg.getL3NetworkUuid(), L3NetworkVO.class); - L2NetworkVO l2NetworkVO = dbf.findByUuid(l3NetworkVO.getL2NetworkUuid(), L2NetworkVO.class); - boolean isExistSystemL3 = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.system, true) - .eq(L3NetworkVO_.l2NetworkUuid, l2NetworkVO.getUuid()).isExists(); - List clusterUuids = Q.New(L2NetworkClusterRefVO.class).select(L2NetworkClusterRefVO_.clusterUuid) - .eq(L2NetworkClusterRefVO_.l2NetworkUuid, l2NetworkVO.getUuid()).listValues(); - if (isExistSystemL3) { - if (clusterUuids != null && !clusterUuids.isEmpty()) { - for (ServiceTypeExtensionPoint ext : pluginRgty.getExtensionList(ServiceTypeExtensionPoint.class)) { - List hostUuids = Q.New(HostVO.class).select(HostVO_.uuid).in(HostVO_.clusterUuid, clusterUuids).listValues(); - if (l2NetworkVO.getType().equals(L2NetworkConstant.VXLAN_NETWORK_TYPE) || l2NetworkVO.getType().equals(L2NetworkConstant.HARDWARE_VXLAN_NETWORK_TYPE)) { - ext.syncManagementServiceTypeExtensionPoint(hostUuids, "vxlan" + l2NetworkVO.getVirtualNetworkId(), null, true); - } - if (l2NetworkVO.getType().equals(L2NetworkConstant.L2_NO_VLAN_NETWORK_TYPE) || l2NetworkVO.getType().equals(L2NetworkConstant.L2_VLAN_NETWORK_TYPE)) { - ext.syncManagementServiceTypeExtensionPoint(hostUuids, l2NetworkVO.getPhysicalInterface(), l2NetworkVO.getVirtualNetworkId(), true); + thdf.chainSubmit(new ChainTask(msg) { + @Override + public void run(SyncTaskChain chain) { + L3NetworkVO l3NetworkVO = dbf.findByUuid(msg.getL3NetworkUuid(), L3NetworkVO.class); + L2NetworkVO l2NetworkVO = dbf.findByUuid(l3NetworkVO.getL2NetworkUuid(), L2NetworkVO.class); + boolean isExistSystemL3 = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.system, true) + .eq(L3NetworkVO_.l2NetworkUuid, l2NetworkVO.getUuid()).isExists(); + List clusterUuids = Q.New(L2NetworkClusterRefVO.class).select(L2NetworkClusterRefVO_.clusterUuid) + .eq(L2NetworkClusterRefVO_.l2NetworkUuid, l2NetworkVO.getUuid()).listValues(); + if (isExistSystemL3) { + if (clusterUuids != null && !clusterUuids.isEmpty()) { + for (ServiceTypeExtensionPoint ext : pluginRgty.getExtensionList(ServiceTypeExtensionPoint.class)) { + List hostUuids = Q.New(HostVO.class).select(HostVO_.uuid).in(HostVO_.clusterUuid, clusterUuids).listValues(); + if (l2NetworkVO.getType().equals(L2NetworkConstant.VXLAN_NETWORK_TYPE) || l2NetworkVO.getType().equals(L2NetworkConstant.HARDWARE_VXLAN_NETWORK_TYPE)) { + ext.syncManagementServiceTypeExtensionPoint(hostUuids, "vxlan" + l2NetworkVO.getVirtualNetworkId(), null, true); + } + if (l2NetworkVO.getType().equals(L2NetworkConstant.L2_NO_VLAN_NETWORK_TYPE) || l2NetworkVO.getType().equals(L2NetworkConstant.L2_VLAN_NETWORK_TYPE)) { + ext.syncManagementServiceTypeExtensionPoint(hostUuids, l2NetworkVO.getPhysicalInterface(), l2NetworkVO.getVirtualNetworkId(), true); + } + } } } + + if (!self.getReservedIpRanges().isEmpty()) { + SQL.New(ReservedIpRangeVO.class) + .in(ReservedIpRangeVO_.uuid, self.getReservedIpRanges().stream().map(ReservedIpRangeVO::getUuid).collect(Collectors.toList())) + .delete(); + } + + L3NetworkInventory inv = L3NetworkInventory.valueOf(self); + extpEmitter.beforeDelete(inv); + deleteHook(); + extpEmitter.afterDelete(inv); + + L3NetworkDeletionReply reply = new L3NetworkDeletionReply(); + bus.reply(msg, reply); + chain.next(); } - } - if (!self.getReservedIpRanges().isEmpty()) { - SQL.New(ReservedIpRangeVO.class) - .in(ReservedIpRangeVO_.uuid, self.getReservedIpRanges().stream().map(ReservedIpRangeVO::getUuid).collect(Collectors.toList())) - .delete(); - } + @Override + public String getSyncSignature() { + return getSyncId(); + } - L3NetworkInventory inv = L3NetworkInventory.valueOf(self); - extpEmitter.beforeDelete(inv); - deleteHook(); - extpEmitter.afterDelete(inv); + @Override + public String getName() { + return "delete-l3-network-" + msg.getL3NetworkUuid(); + } + }); - L3NetworkDeletionReply reply = new L3NetworkDeletionReply(); - bus.reply(msg, reply); } private void handle(ReturnIpMsg msg) { @@ -906,47 +993,72 @@ private void handle(APIUpdateL3NetworkMsg msg) { private void handle(APIAddIpRangeByNetworkCidrMsg msg) { List iprs = IpRangeInventory.fromMessage(msg); - List ret = new ArrayList<>(); - for (IpRangeInventory ipr : iprs) { - IpRangeFactory factory = l3NwMgr.getIpRangeFactory(ipr.getIpRangeType()); - IpRangeInventory inv = factory.createIpRange(ipr, msg); - setIpRangeSharedResource(msg.getL3NetworkUuid(), inv.getUuid()); - ret.add(inv); - } - tagMgr.createTagsFromAPICreateMessage(msg, iprs.get(0).getL3NetworkUuid(), L3NetworkVO.class.getSimpleName()); APIAddIpRangeByNetworkCidrEvent evt = new APIAddIpRangeByNetworkCidrEvent(msg.getId()); - evt.setInventory(ret.get(0)); - evt.setInventories(ret); - bus.publish(evt); + + IpRangeFactory factory = l3NwMgr.getIpRangeFactory(iprs.get(0).getIpRangeType()); + factory.createIpRange(iprs, msg, new ReturnValueCompletion>(msg) { + @Override + public void success(List invs) { + IpRangeInventory inv = invs.get(0); + tagMgr.createTagsFromAPICreateMessage(msg, inv.getL3NetworkUuid(), L3NetworkVO.class.getSimpleName()); + setIpRangeSharedResource(msg.getL3NetworkUuid(), inv.getUuid()); + evt.setInventory(inv); + evt.setInventories(invs); + bus.publish(evt); + } + + @Override + public void fail(ErrorCode errorCode) { + evt.setError(errorCode); + bus.publish(evt); + } + }); } private void handle(APIAddIpv6RangeByNetworkCidrMsg msg) { IpRangeInventory ipr = IpRangeInventory.fromMessage(msg); - IpRangeFactory factory = l3NwMgr.getIpRangeFactory(ipr.getIpRangeType()); - IpRangeInventory inv = factory.createIpRange(ipr, msg); - - tagMgr.createTagsFromAPICreateMessage(msg, inv.getL3NetworkUuid(), L3NetworkVO.class.getSimpleName());; + APIAddIpRangeByNetworkCidrEvent evt = new APIAddIpRangeByNetworkCidrEvent(msg.getId()); - setIpRangeSharedResource(msg.getL3NetworkUuid(), inv.getUuid()); + IpRangeFactory factory = l3NwMgr.getIpRangeFactory(ipr.getIpRangeType()); + factory.createIpRange(Collections.singletonList(ipr), msg, new ReturnValueCompletion>(msg) { + @Override + public void success(List invs) { + IpRangeInventory inv = invs.get(0); + tagMgr.createTagsFromAPICreateMessage(msg, inv.getL3NetworkUuid(), L3NetworkVO.class.getSimpleName()); + setIpRangeSharedResource(msg.getL3NetworkUuid(), inv.getUuid()); + evt.setInventory(inv); + bus.publish(evt); + } - APIAddIpRangeByNetworkCidrEvent evt = new APIAddIpRangeByNetworkCidrEvent(msg.getId()); - evt.setInventory(inv); - evt.setInventories(Collections.singletonList(inv)); - bus.publish(evt); + @Override + public void fail(ErrorCode errorCode) { + evt.setError(errorCode); + bus.publish(evt); + } + }); } private void handle(APIAddIpv6RangeMsg msg) { IpRangeInventory ipr = IpRangeInventory.fromMessage(msg); - IpRangeFactory factory = l3NwMgr.getIpRangeFactory(ipr.getIpRangeType()); - IpRangeInventory inv = factory.createIpRange(ipr, msg); - - tagMgr.createTagsFromAPICreateMessage(msg, inv.getL3NetworkUuid(), L3NetworkVO.class.getSimpleName()); + APIAddIpRangeEvent evt = new APIAddIpRangeEvent(msg.getId()); - setIpRangeSharedResource(msg.getL3NetworkUuid(), inv.getUuid()); + IpRangeFactory factory = l3NwMgr.getIpRangeFactory(ipr.getIpRangeType()); + factory.createIpRange(Collections.singletonList(ipr), msg, new ReturnValueCompletion>(msg) { + @Override + public void success(List invs) { + IpRangeInventory inv = invs.get(0); + tagMgr.createTagsFromAPICreateMessage(msg, inv.getL3NetworkUuid(), L3NetworkVO.class.getSimpleName()); + setIpRangeSharedResource(msg.getL3NetworkUuid(), inv.getUuid()); + evt.setInventory(inv); + bus.publish(evt); + } - APIAddIpRangeEvent evt = new APIAddIpRangeEvent(msg.getId()); - evt.setInventory(inv); - bus.publish(evt); + @Override + public void fail(ErrorCode errorCode) { + evt.setError(errorCode); + bus.publish(evt); + } + }); } @@ -969,6 +1081,8 @@ private void handle(APIChangeL3NetworkStateMsg msg) { private void handle(final APIRemoveDnsFromL3NetworkMsg msg) { final APIRemoveDnsFromL3NetworkEvent evt = new APIRemoveDnsFromL3NetworkEvent(msg.getId()); + SdnControllerDhcp sdnDhcp = l3NwMgr.getSdnControllerDhcp(msg.getL3NetworkUuid()); + FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setName(String.format("remove-dns-%s-from-l3-%s", msg.getDns(), msg.getL3NetworkUuid())); chain.then(new ShareFlow() { @@ -991,10 +1105,50 @@ public void run(FlowTrigger trigger, Map data) { } }); + flow(new NoRollbackFlow() { + String __name__ = "remove-dns-from-sdn"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (!self.enableIpAddressAllocation()) { + trigger.next(); + return; + } + + if (sdnDhcp == null) { + trigger.next(); + return; + } + + List iprs = IpRangeHelper.getNormalIpRanges(self); + if (iprs.isEmpty()) { + trigger.next(); + return; + } + + sdnDhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(self)), false, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + if (L3NetworkConstant.L3_BASIC_NETWORK_TYPE.equals(self.getType()) && !self.getNetworkServices().isEmpty()) { flow(new NoRollbackFlow() { String __name__ = "remove-dns-from-backend"; + @Override + public boolean skip(Map data) { + return sdnDhcp != null; + } + @Override public void run(final FlowTrigger trigger, Map data) { RemoveDnsMsg rmsg = new RemoveDnsMsg(); @@ -1037,6 +1191,8 @@ public void handle(ErrorCode errCode, Map data) { private void handle(final APIAddDnsToL3NetworkMsg msg) { final APIAddDnsToL3NetworkEvent evt = new APIAddDnsToL3NetworkEvent(msg.getId()); + SdnControllerDhcp sdnDhcp = l3NwMgr.getSdnControllerDhcp(msg.getL3NetworkUuid()); + FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setName(String.format("add-dns-%s-to-l3-%s", msg.getDns(), msg.getL3NetworkUuid())); chain.then(new ShareFlow() { @@ -1067,10 +1223,50 @@ public void rollback(FlowRollback trigger, Map data) { } }); + flow(new NoRollbackFlow() { + String __name__ = "apply-to-sdn"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (!self.enableIpAddressAllocation()) { + trigger.next(); + return; + } + + if (sdnDhcp == null) { + trigger.next(); + return; + } + + List iprs = IpRangeHelper.getNormalIpRanges(self); + if (iprs.isEmpty()) { + trigger.next(); + return; + } + + sdnDhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(self)), false, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + if (L3NetworkConstant.L3_BASIC_NETWORK_TYPE.equals(self.getType()) && !self.getNetworkServices().isEmpty()) { flow(new NoRollbackFlow() { String __name__ = "apply-to-backend"; + @Override + public boolean skip(Map data) { + return sdnDhcp != null; + } + @Override public void run(final FlowTrigger trigger, Map data) { AddDnsMsg amsg = new AddDnsMsg(); @@ -1418,33 +1614,16 @@ public void handle(ErrorCode errCode, Map data) { private void handle(APIDeleteL3NetworkMsg msg) { final APIDeleteL3NetworkEvent evt = new APIDeleteL3NetworkEvent(msg.getId()); - thdf.chainSubmit(new ChainTask(msg) { + doDeleteL3Network(msg, new Completion(msg) { @Override - public void run(SyncTaskChain chain) { - doDeleteL3Network(msg, new Completion(msg) { - @Override - public void success() { - bus.publish(evt); - chain.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - evt.setError(errorCode); - bus.publish(evt); - chain.next(); - } - }); - } - - @Override - public String getSyncSignature() { - return getSyncId(); + public void success() { + bus.publish(evt); } @Override - public String getName() { - return "delete-l3-network-" + msg.getL3NetworkUuid(); + public void fail(ErrorCode errorCode) { + evt.setError(errorCode); + bus.publish(evt); } }); } diff --git a/network/src/main/java/org/zstack/network/l3/L3NetworkHelper.java b/network/src/main/java/org/zstack/network/l3/L3NetworkHelper.java new file mode 100644 index 00000000000..3863c0bb4d6 --- /dev/null +++ b/network/src/main/java/org/zstack/network/l3/L3NetworkHelper.java @@ -0,0 +1,35 @@ +package org.zstack.network.l3; + +import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.annotation.Configurable; +import org.zstack.core.db.Q; +import org.zstack.header.network.l2.L2NetworkVO; +import org.zstack.header.network.l2.L2NetworkVO_; +import org.zstack.header.network.l3.L3NetworkVO; +import org.zstack.header.network.l3.L3NetworkVO_; +import org.zstack.network.l2.L2NetworkSystemTags; + +@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) +public class L3NetworkHelper { + + public static String getL3networkVSwitchType(String l3Uuid) { + String l2Uuid = Q.New(L3NetworkVO.class) + .select(L3NetworkVO_.l2NetworkUuid) + .eq(L3NetworkVO_.uuid, l3Uuid).findValue(); + return Q.New(L2NetworkVO.class) + .select(L2NetworkVO_.vSwitchType) + .eq(L2NetworkVO_.uuid, l2Uuid).findValue(); + } + + public static String getSdnControllerUuidFromL2Uuid(String l2Uuid) { + return L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByResourceUuid( + l2Uuid, L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); + } + + public static String getSdnControllerUuidFromL3Uuid(String l3Uuid) { + String l2Uuid = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.uuid, l3Uuid) + .select(L3NetworkVO_.l2NetworkUuid).findValue(); + + return getSdnControllerUuidFromL2Uuid(l2Uuid); + } +} diff --git a/network/src/main/java/org/zstack/network/l3/L3NetworkManager.java b/network/src/main/java/org/zstack/network/l3/L3NetworkManager.java index 5cbb69ad604..67127864c25 100755 --- a/network/src/main/java/org/zstack/network/l3/L3NetworkManager.java +++ b/network/src/main/java/org/zstack/network/l3/L3NetworkManager.java @@ -2,6 +2,7 @@ import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.network.l3.*; +import org.zstack.header.network.service.SdnControllerDhcp; import org.zstack.header.vm.VmNicInventory; import org.zstack.header.vm.VmNicVO; @@ -30,4 +31,6 @@ public interface L3NetworkManager { List filterVmNicByIpVersion(List vmNics, int ipVersion); boolean applyNetworkServiceWhenVmStateChange(String type); + + SdnControllerDhcp getSdnControllerDhcp(String l3Uuid); } diff --git a/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java b/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java index f4b72057b40..2e6625f7ea6 100755 --- a/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java +++ b/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java @@ -11,8 +11,10 @@ import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.*; import org.zstack.core.errorcode.ErrorFacade; +import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.SimpleFlowChain; import org.zstack.header.AbstractService; +import org.zstack.header.core.Completion; import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.core.WhileDoneCompletion; import org.zstack.header.core.workflow.*; @@ -31,6 +33,8 @@ import org.zstack.header.network.l2.*; import org.zstack.header.network.l3.*; import org.zstack.header.network.l3.datatypes.IpCapacityData; +import org.zstack.header.network.service.GetSdnControllerDhcpExtensionPoint; +import org.zstack.header.network.service.SdnControllerDhcp; import org.zstack.header.vm.VmNicInventory; import org.zstack.header.vm.VmNicVO; import org.zstack.header.vm.VmNicVO_; @@ -137,6 +141,7 @@ private void handleApiMessage(APIMessage msg) { private void handle(final APISetL3NetworkMtuMsg msg) { final APISetL3NetworkMtuEvent evt = new APISetL3NetworkMtuEvent(msg.getId()); + String oldmtu = NetworkServiceSystemTag.L3_MTU.getTokenByResourceUuid(msg.getL3NetworkUuid(), NetworkServiceSystemTag.MTU_TOKEN); NetworkServiceSystemTag.L3_MTU.delete(msg.getL3NetworkUuid()); SystemTagCreator creator = NetworkServiceSystemTag.L3_MTU.newSystemTagCreator(msg.getL3NetworkUuid()); creator.ignoreIfExisting = true; @@ -149,7 +154,66 @@ private void handle(final APISetL3NetworkMtuMsg msg) { ); creator.create(); - bus.publish(evt); + L3NetworkVO l3Vo = dbf.findByUuid(msg.getL3NetworkUuid(), L3NetworkVO.class); + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName("change-l3-network-mtu"); + chain.then(new NoRollbackFlow() { + @Override + public void run(FlowTrigger trigger, Map data) { + if (!l3Vo.enableIpAddressAllocation()) { + trigger.next(); + return; + } + + SdnControllerDhcp dhcp = getSdnControllerDhcp(msg.getL3NetworkUuid()); + if (dhcp == null) { + trigger.next(); + return; + } + + List iprs = IpRangeHelper.getNormalIpRanges(l3Vo); + if (iprs.isEmpty()) { + trigger.next(); + return; + } + + dhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(l3Vo)), false, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }).done(new FlowDoneHandler(msg) { + @Override + public void handle(Map data) { + bus.publish(evt); + } + }).error(new FlowErrorHandler(msg) { + @Override + public void handle(ErrorCode errCode, Map data) { + if (oldmtu != null) { + NetworkServiceSystemTag.L3_MTU.delete(msg.getL3NetworkUuid()); + SystemTagCreator creator = NetworkServiceSystemTag.L3_MTU.newSystemTagCreator(msg.getL3NetworkUuid()); + creator.recreate = true; + creator.inherent = false; + creator.setTagByTokens( + map( + e(NetworkServiceSystemTag.MTU_TOKEN, oldmtu), + e(NetworkServiceSystemTag.L3_UUID_TOKEN, msg.getL3NetworkUuid()) + ) + ); + creator.create(); + } + evt.setError(errCode); + bus.publish(evt); + } + }).start(); } private void handle(final APIGetL3NetworkMtuMsg msg) { @@ -916,4 +980,13 @@ public void check(CheckIpAvailabilityMsg msg, ReturnValueCompletion() { + public void createIpRange(List iprs, APICreateMessage msg, ReturnValueCompletion> completion) { + FlowChain chain = new SimpleFlowChain(); + chain.setName(String.format("add-iprange-to-l3-%s", iprs.get(0).getL3NetworkUuid())); + chain.then(new Flow() { + String __name__ = "save-db"; @Override - protected NormalIpRangeVO scripts() { - NormalIpRangeVO vo = new NormalIpRangeVO(); - vo.setUuid(ipr.getUuid() == null ? Platform.getUuid() : ipr.getUuid()); - vo.setDescription(ipr.getDescription()); - vo.setEndIp(ipr.getEndIp()); - vo.setGateway(ipr.getGateway()); - vo.setL3NetworkUuid(ipr.getL3NetworkUuid()); - vo.setName(ipr.getName()); - vo.setNetmask(ipr.getNetmask()); - vo.setStartIp(ipr.getStartIp()); - vo.setNetworkCidr(ipr.getNetworkCidr()); - vo.setAccountUuid(msg.getSession().getAccountUuid()); - vo.setIpVersion(ipr.getIpVersion()); - vo.setAddressMode(ipr.getAddressMode()); - vo.setPrefixLen(ipr.getPrefixLen()); - dbf.getEntityManager().persist(vo); - dbf.getEntityManager().flush(); - dbf.getEntityManager().refresh(vo); - - return vo; - } - }.execute(); + public void run(FlowTrigger trigger, Map data) { + List vos = new ArrayList<>(); + for (IpRangeInventory ipr : iprs) { + NormalIpRangeVO vo = new SQLBatchWithReturn() { + @Override + protected NormalIpRangeVO scripts() { + NormalIpRangeVO vo = (NormalIpRangeVO) IpRangeHelper + .fromIpRangeInventory(ipr, msg.getSession().getAccountUuid()); + dbf.getEntityManager().persist(vo); + dbf.getEntityManager().flush(); + dbf.getEntityManager().refresh(vo); + + return vo; + } + }.execute(); + + IpRangeHelper.updateL3NetworkIpversion(vo); + + List usedIpVos = Q.New(UsedIpVO.class) + .eq(UsedIpVO_.l3NetworkUuid, vo.getL3NetworkUuid()) + .eq(UsedIpVO_.ipVersion, vo.getIpVersion()).list(); + List updateVos = new ArrayList<>(); + for (UsedIpVO ipvo : usedIpVos) { + if (ipvo.getIpVersion() == IPv6Constants.IPv4) { + if (NetworkUtils.isInRange(ipvo.getIp(), vo.getStartIp(), vo.getEndIp())) { + ipvo.setIpRangeUuid(vo.getUuid()); + updateVos.add(ipvo); + } + } else { + if (IPv6NetworkUtils.isIpv6InRange(ipvo.getIp(), vo.getStartIp(), vo.getEndIp())) { + ipvo.setIpRangeUuid(vo.getUuid()); + updateVos.add(ipvo); + } + } + } - IpRangeHelper.updateL3NetworkIpversion(ipr); + if (!updateVos.isEmpty()) { + dbf.updateCollection(updateVos); + } + + CollectionUtils.safeForEach(pluginRgty.getExtensionList(AfterAddIpRangeExtensionPoint.class), new ForEachFunction() { + @Override + public void run(AfterAddIpRangeExtensionPoint ext) { + ext.afterAddIpRange(IpRangeInventory.valueOf(vo), msg.getSystemTags()); + } + }); + + vos.add(vo); + } + + data.put("IpRangeVO", vos); + trigger.next(); + } - final IpRangeInventory finalIpr = NormalIpRangeInventory.valueOf1(vo); - CollectionUtils.safeForEach(pluginRgty.getExtensionList(AfterAddIpRangeExtensionPoint.class), new ForEachFunction() { @Override - public void run(AfterAddIpRangeExtensionPoint ext) { - ext.afterAddIpRange(finalIpr, msg.getSystemTags()); + public void rollback(FlowRollback trigger, Map data) { + List vos = (List) data.get("IpRangeVO"); + dbf.removeCollection(vos, IpRangeVO.class); + trigger.rollback(); } - }); - - List usedIpVos = Q.New(UsedIpVO.class) - .eq(UsedIpVO_.l3NetworkUuid, finalIpr.getL3NetworkUuid()) - .eq(UsedIpVO_.ipVersion, finalIpr.getIpVersion()).list(); - List updateVos = new ArrayList<>(); - for (UsedIpVO ipvo : usedIpVos) { - if (ipvo.getIpVersion() == IPv6Constants.IPv4) { - if (NetworkUtils.isInRange(ipvo.getIp(), finalIpr.getStartIp(), finalIpr.getEndIp())) { - ipvo.setIpRangeUuid(finalIpr.getUuid()); - updateVos.add(ipvo); + }).then(new NoRollbackFlow() { + String __name__ = "enable-sdn-dhcp"; + + @Override + public void run(FlowTrigger trigger, Map data) { + L3NetworkVO l3vo = dbf.findByUuid(iprs.get(0).getL3NetworkUuid(), L3NetworkVO.class); + if (!l3vo.enableIpAddressAllocation()) { + trigger.next(); + return; } - } else { - if (IPv6NetworkUtils.isIpv6InRange(ipvo.getIp(), finalIpr.getStartIp(), finalIpr.getEndIp())) { - ipvo.setIpRangeUuid(finalIpr.getUuid()); - updateVos.add(ipvo); + + SdnControllerDhcp sdnDhcp = l3Mgr.getSdnControllerDhcp(l3vo.getUuid()); + if (sdnDhcp == null) { + trigger.next(); + return; } - } - } - if (!updateVos.isEmpty()) { - dbf.updateCollection(updateVos); - } + sdnDhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(l3vo)), false, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } - return finalIpr; + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + List vos = (List) data.get("IpRangeVO"); + completion.success(IpRangeInventory.valueOf(vos)); + } + }).start(); } } diff --git a/network/src/main/java/org/zstack/network/service/DhcpExtension.java b/network/src/main/java/org/zstack/network/service/DhcpExtension.java index a1239db4f99..0dfbb39c1a5 100755 --- a/network/src/main/java/org/zstack/network/service/DhcpExtension.java +++ b/network/src/main/java/org/zstack/network/service/DhcpExtension.java @@ -12,14 +12,12 @@ import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.network.l3.*; -import org.zstack.header.network.service.DhcpStruct; -import org.zstack.header.network.service.NetworkServiceDhcpBackend; -import org.zstack.header.network.service.NetworkServiceProviderType; -import org.zstack.header.network.service.NetworkServiceType; +import org.zstack.header.network.service.*; import org.zstack.header.vm.*; import org.zstack.header.vm.VmInstanceSpec.HostName; import org.zstack.network.l3.IpRangeHelper; import org.zstack.network.l3.L3NetworkGlobalConfig; +import org.zstack.network.l3.L3NetworkManager; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.function.Function; @@ -43,6 +41,8 @@ public class DhcpExtension extends AbstractNetworkServiceExtension implements Co @Autowired private PluginRegistry pluginRgty; + @Autowired + private L3NetworkManager l3Mgr; private final Map dhcpBackends = new HashMap(); @@ -297,6 +297,10 @@ private Map> workoutDhcp(VmInstanceS for (Map.Entry> e : providerMap.entrySet()) { NetworkServiceProviderType ptype = e.getKey(); + if (!ptype.isCreateDhcpNameSpace()) { + continue; + } + List lst = new ArrayList(); List nics = new ArrayList<>(); @@ -391,6 +395,18 @@ public void fail(ErrorCode errorCode) { @Override public void enableNetworkService(L3NetworkVO l3VO, NetworkServiceProviderType providerType, List systemTags, Completion completion) { + SdnControllerDhcp sdnDhcp = l3Mgr.getSdnControllerDhcp(l3VO.getUuid()); + if (sdnDhcp != null) { + List normalIpRange = IpRangeHelper.getNormalIpRanges(l3VO); + if (normalIpRange.isEmpty()) { + completion.success(); + return; + } + + sdnDhcp.allocateDhcpAndEnableDhcp(l3VO, systemTags, completion); + return; + } + NetworkServiceDhcpBackend bkd = dhcpBackends.get(providerType); if (bkd == null) { completion.fail(operr("unable to find NetworkServiceDhcpBackend[provider type: %s]", providerType)); @@ -402,6 +418,18 @@ public void enableNetworkService(L3NetworkVO l3VO, NetworkServiceProviderType pr @Override public void disableNetworkService(L3NetworkVO l3VO, NetworkServiceProviderType providerType, Completion completion) { + SdnControllerDhcp sdnDhcp = l3Mgr.getSdnControllerDhcp(l3VO.getUuid()); + if (sdnDhcp != null) { + List normalIpRange = IpRangeHelper.getNormalIpRanges(l3VO); + if (normalIpRange.isEmpty()) { + completion.success(); + return; + } + + sdnDhcp.disableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(l3VO)), IPv6Constants.DUAL_STACK, completion); + return; + } + NetworkServiceDhcpBackend bkd = dhcpBackends.get(providerType); if (bkd == null) { completion.fail(operr("unable to find NetworkServiceDhcpBackend[provider type: %s]", providerType)); diff --git a/plugin/flatNetworkProvider/pom.xml b/plugin/flatNetworkProvider/pom.xml index b1305b84d75..a209c6d4001 100755 --- a/plugin/flatNetworkProvider/pom.xml +++ b/plugin/flatNetworkProvider/pom.xml @@ -26,6 +26,11 @@ kvm ${project.version} + + org.zstack + sdnController + ${project.version} + diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java index 68ba35ee0ab..d49e7a3b27a 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java @@ -54,6 +54,8 @@ import org.zstack.network.service.NetworkServiceProviderLookup; import org.zstack.network.service.flat.IpStatisticConstants.VmType; import org.zstack.network.service.vip.VipVO; +import org.zstack.header.network.service.SdnControllerDhcp; +import org.zstack.sdnController.SdnControllerManager; import org.zstack.tag.SystemTagCreator; import org.zstack.utils.CollectionUtils; import org.zstack.utils.DebugUtils; @@ -109,6 +111,8 @@ public class FlatDhcpBackend extends AbstractService implements NetworkServiceDh private NetworkServiceManager nwServiceMgr; @Autowired protected L3NetworkManager l3NwMgr; + @Autowired + protected SdnControllerManager sdnMgr; private Map getIpStatisticExts = new HashMap<>(); @@ -213,6 +217,8 @@ private void handle(APIChangeL3NetworkDhcpIpAddressMsg msg) { ipr -> ipr.getIpVersion() == IPv6Constants.IPv6 && !ipr.getAddressMode().equals(IPv6Constants.SLAAC)) .collect(Collectors.toList()); + SdnControllerDhcp sdnDhcp = sdnMgr.getSdnControllerDhcp(msg.getL3NetworkUuid()); + /* * step #1, delete old dhcp server ip * step #2, allocate new dhcp server ip @@ -333,6 +339,11 @@ public void rollback(FlowRollback trigger, Map data) { }).then(new NoRollbackFlow() { String __name__ = "refresh-dhcp-server-on-hosts"; + @Override + public boolean skip(Map data) { + return sdnDhcp != null; + } + @Override public void run(FlowTrigger trigger, Map data) { refreshDhcpInfoToHosts(l3VO, new Completion(trigger) { @@ -341,6 +352,29 @@ public void success() { trigger.next(); } + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = "refresh-dhcp-server-on-sdn-controller"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (sdnDhcp == null) { + trigger.next(); + return; + } + + sdnDhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(l3VO)), + false, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + @Override public void fail(ErrorCode errorCode) { trigger.fail(errorCode); @@ -869,7 +903,7 @@ private void handle(APIGetL3NetworkDhcpIpAddressMsg msg) { reply.setIp6(ip); int l3IpVersion = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.uuid, msg.getL3NetworkUuid()).select(L3NetworkVO_.ipVersion).findValue(); if (l3IpVersion == IPv6Constants.IPv6) { - /* to be compitable with old version, dhcp server address of ipv6 only l3 network is filled in this field */ + /* to be compatible with old version, dhcp server address of ipv6 only l3 network is filled in this field */ reply.setIp(ip); } } @@ -886,7 +920,7 @@ String allocateDhcpIp(String l3Uuid, int ipVersion, String excludedIp) { return allocateDhcpIp(l3Uuid, ipVersion, true, null, excludedIp); } - private static Map getExistingDhcpServerIp(String l3Uuid, int ipVersion) { + public static Map getExistingDhcpServerIp(String l3Uuid, int ipVersion) { Map ret = new HashMap<>(); List tags = FlatNetworkSystemTags.L3_NETWORK_DHCP_IP.getTags(l3Uuid); if (tags != null) { @@ -913,7 +947,7 @@ private static Map getExistingDhcpServerIp(String l3Uuid, int ip @Deferred private String allocateDhcpIp(String l3Uuid, int ipVersion, boolean allocate_ip, String requiredIp, String excludedIp) { - if (!isProvidedByMe(l3Uuid)) { + if (!isAllocateDhcpServerIp(l3Uuid)) { return null; } @@ -1183,27 +1217,42 @@ public String preDeleteL3Network(L3NetworkInventory inventory) { public void beforeDeleteL3Network(L3NetworkInventory inventory) { } - private boolean isProvidedByMe(String l3Uuid) { + private boolean isAllocateDhcpServerIp(String l3Uuid) { + String providerType = new NetworkProviderFinder().getNetworkProviderTypeByNetworkServiceType(l3Uuid, NetworkServiceType.DHCP.toString()); + if (providerType == null) { + return false; + } + + NetworkServiceProviderType type = NetworkServiceProviderType.valueOf(providerType); + return type.isAllocateDhcpServerIp(); + } + + private boolean isCreateDhcpNameSpace(String l3Uuid) { String providerType = new NetworkProviderFinder().getNetworkProviderTypeByNetworkServiceType(l3Uuid, NetworkServiceType.DHCP.toString()); - return FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING.equals(providerType); + if (providerType == null) { + return false; + } + + NetworkServiceProviderType type = NetworkServiceProviderType.valueOf(providerType); + return type.isCreateDhcpNameSpace(); } @Override public void afterDeleteL3Network(L3NetworkInventory inventory) { - if (!isProvidedByMe(inventory.getUuid())) { - return; + if (isAllocateDhcpServerIp(inventory.getUuid())) { + Map dhcpMap = getExistingDhcpServerIp(inventory.getUuid(), IPv6Constants.DUAL_STACK); + for (Map.Entry entry : dhcpMap.entrySet()) { + String dhcpIp = entry.getKey(); + String dhcpIpUuid = entry.getValue(); + deleteDhcpServerIp(inventory.getUuid(), dhcpIp, dhcpIpUuid); + logger.debug(String.format("delete DHCP server ip[%s] of the flat network[uuid:%s] as the L3 network is deleted", + dhcpIp, inventory.getUuid())); + } } - Map dhcpMap = getExistingDhcpServerIp(inventory.getUuid(), IPv6Constants.DUAL_STACK); - for (Map.Entry entry : dhcpMap.entrySet()) { - String dhcpIp = entry.getKey(); - String dhcpIpUuid = entry.getValue(); - deleteDhcpServerIp(inventory.getUuid(), dhcpIp, dhcpIpUuid); - logger.debug(String.format("delete DHCP server ip[%s] of the flat network[uuid:%s] as the L3 network is deleted", - dhcpIp, inventory.getUuid())); + if (isCreateDhcpNameSpace(inventory.getUuid())) { + deleteNameSpace(inventory, new NopeCompletion()); } - - deleteNameSpace(inventory, new NopeCompletion()); } private void deleteNameSpace(L3NetworkInventory inventory, Completion completion) { @@ -1977,7 +2026,7 @@ private void applyDhcpToHosts(List dhcpInfo, final String hostUuid, fi final Map> l3DhcpMap = new HashMap<>(); for (DhcpInfo d : dhcpInfo) { - if (!isProvidedByMe(d.l3NetworkUuid)) { + if (!isCreateDhcpNameSpace(d.l3NetworkUuid)) { /* there are vm in this l3, but dhcp is disabled */ continue; } @@ -2390,7 +2439,7 @@ private void validate(APIDetachNetworkServiceFromL3NetworkMsg msg) { } private void validate(APIChangeL3NetworkDhcpIpAddressMsg msg) { - if (!isProvidedByMe(msg.getL3NetworkUuid())) { + if (!isAllocateDhcpServerIp(msg.getL3NetworkUuid())) { throw new ApiMessageInterceptionException(argerr("could change dhcp server ip, because flat dhcp is not enabled")); } @@ -2531,10 +2580,6 @@ public void afterAddIpRange(IpRangeInventory ipr, List systemTags) { } } - if (ipr.getIpRangeType() != IpRangeType.Normal) { - return; - } - if (!Q.New(NormalIpRangeVO.class).eq(NormalIpRangeVO_.uuid, ipr.getUuid()).isExists()) { return; } @@ -2721,6 +2766,11 @@ public void enableNetworkService(L3NetworkVO l3VO, List systemTags, Comp } } + if (!isCreateDhcpNameSpace(l3VO.getUuid())) { + completion.success(); + return; + } + refreshDhcpInfoToHosts(l3VO, new Completion(completion) { @Override public void success() { @@ -2792,7 +2842,7 @@ public void done(ErrorCodeList errorCodeList) { @Override public void disableNetworkService(L3NetworkVO l3VO, Completion completion) { - if (!isProvidedByMe(l3VO.getUuid())) { + if (!isCreateDhcpNameSpace(l3VO.getUuid())) { completion.success(); return; } diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatProviderFactory.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatProviderFactory.java index c1a05abf60a..dacc2d2a985 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatProviderFactory.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatProviderFactory.java @@ -10,6 +10,7 @@ import org.zstack.header.network.l2.APICreateL2NetworkMsg; import org.zstack.header.network.l2.L2NetworkCreateExtensionPoint; import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.network.l2.VSwitchType; import org.zstack.header.network.service.*; import org.zstack.network.service.eip.EipConstant; import org.zstack.network.service.userdata.UserdataConstant; @@ -49,6 +50,9 @@ public NetworkServiceProvider getNetworkServiceProvider(NetworkServiceProviderVO @Override public void prepareDbInitialValue() { + FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE.setCreateDhcpNameSpace(true); + FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE.setAllocateDhcpServerIp(true); + SimpleQuery query = dbf.createQuery(NetworkServiceProviderVO.class); query.add(NetworkServiceProviderVO_.type, Op.EQ, FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING); NetworkServiceProviderVO rpvo = query.find(); @@ -112,6 +116,11 @@ public void beforeCreateL2Network(APICreateL2NetworkMsg msg) throws NetworkExcep @Override public void afterCreateL2Network(L2NetworkInventory l2Network) { + VSwitchType vSwitchType = VSwitchType.valueOf(l2Network.getvSwitchType()); + if (vSwitchType.getSdnControllerType() != null) { + return; + } + NetworkServiceProviderL2NetworkRefVO ref = new NetworkServiceProviderL2NetworkRefVO(); ref.setL2NetworkUuid(l2Network.getUuid()); ref.setNetworkServiceProviderUuid(flatProvider.getUuid()); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java index c03cf99404d..77b621119dc 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java @@ -2,6 +2,7 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; +import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.db.DatabaseFacade; @@ -14,8 +15,15 @@ import org.zstack.header.network.l2.APICreateL2NoVlanNetworkMsg; import org.zstack.header.network.l2.APICreateL2VlanNetworkMsg; import org.zstack.header.network.l2.L2NetworkConstant; +import org.zstack.header.vm.APIAttachL3NetworkToVmMsg; +import org.zstack.header.vm.APIChangeVmNicNetworkMsg; +import org.zstack.header.vm.VmInstanceVO; +import org.zstack.header.vm.VmNicVO; import org.zstack.network.l2.vxlan.vxlanNetwork.APICreateL2VxlanNetworkMsg; +import org.zstack.network.l3.L3NetworkHelper; +import org.zstack.network.securitygroup.*; import org.zstack.sdnController.header.*; +import org.zstack.utils.ObjectUtils; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; import org.zstack.utils.network.NetworkUtils; @@ -47,8 +55,12 @@ private void setServiceId(APIMessage msg) { public List getMessageClassToIntercept() { List ret = new ArrayList<>(); - ret.add(APIAddSdnControllerMsg.class); - ret.add(APIRemoveSdnControllerMsg.class); + ret.add(APIAttachSecurityGroupToL3NetworkMsg.class); + ret.add(APIAddVmNicToSecurityGroupMsg.class); + ret.add(APISetVmNicSecurityGroupMsg.class); + ret.add(APIAddSecurityGroupRuleMsg.class); + ret.add(APIAttachL3NetworkToVmMsg.class); + ret.add(APIChangeVmNicNetworkMsg.class); return ret; } @@ -66,6 +78,18 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti validate((APISdnControllerRemoveHostMsg)msg); } else if (msg instanceof APISdnControllerChangeHostMsg) { validate((APISdnControllerChangeHostMsg)msg); + } else if (msg instanceof APIAttachSecurityGroupToL3NetworkMsg) { + validate((APIAttachSecurityGroupToL3NetworkMsg)msg); + } else if (msg instanceof APIAddVmNicToSecurityGroupMsg) { + validate((APIAddVmNicToSecurityGroupMsg) msg); + } else if (msg instanceof APISetVmNicSecurityGroupMsg) { + validate((APISetVmNicSecurityGroupMsg) msg); + } else if (msg instanceof APIAddSecurityGroupRuleMsg) { + validate((APIAddSecurityGroupRuleMsg) msg); + } else if (msg instanceof APIAttachL3NetworkToVmMsg) { + validate((APIAttachL3NetworkToVmMsg) msg); + } else if (msg instanceof APIChangeVmNicNetworkMsg) { + validate((APIChangeVmNicNetworkMsg) msg); } setServiceId(msg); @@ -73,6 +97,112 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti return msg; } + private void validate(APIAttachL3NetworkToVmMsg msg) { + String sdnControlerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(msg.getL3NetworkUuid()); + if (sdnControlerUuid == null) { + return; + } + + SdnControllerVO controllerVO = dbf.findByUuid(sdnControlerUuid, SdnControllerVO.class); + if (controllerVO == null) { + throw new ApiMessageInterceptionException(argerr("could not attach l3network to vm, " + + "because sdn controller[uuid:%s] is not find", sdnControlerUuid)); + } + + VmInstanceVO vmVo = dbf.findByUuid(msg.getVmInstanceUuid(), VmInstanceVO.class); + boolean found = false; + for (SdnControllerHostRefVO ref : controllerVO.getHostRefVOS()) { + if (ref.getHostUuid().equals(vmVo.getHostUuid())) { + found = true; + break; + } + } + if (!found) { + throw new ApiMessageInterceptionException(argerr("could not attach l3network to vm, " + + "because host[uuid:%s] of vm is not attached to sdn controller[uuid:%s]", + vmVo.getHostUuid(), sdnControlerUuid)); + } + } + + private void validate(APIChangeVmNicNetworkMsg msg) { + String sdnControlerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(msg.getDestL3NetworkUuid()); + if (sdnControlerUuid == null) { + return; + } + + SdnControllerVO controllerVO = dbf.findByUuid(sdnControlerUuid, SdnControllerVO.class); + if (controllerVO == null) { + throw new ApiMessageInterceptionException(argerr("could not change vmnic to l3network[uuid:%s], " + + "because sdn controller[uuid:%s] is not find", msg.getDestL3NetworkUuid(), sdnControlerUuid)); + } + + VmInstanceVO vmVo = dbf.findByUuid(msg.getVmInstanceUuid(), VmInstanceVO.class); + boolean found = false; + for (SdnControllerHostRefVO ref : controllerVO.getHostRefVOS()) { + if (ref.getHostUuid().equals(vmVo.getHostUuid())) { + found = true; + break; + } + } + if (!found) { + throw new ApiMessageInterceptionException(argerr("could not change vmnic to l3network[uuid:%s], " + + "because host[uuid:%s] of vm is not attached to sdn controller[uuid:%s]", + msg.getDestL3NetworkUuid(), vmVo.getHostUuid(), sdnControlerUuid)); + } + } + + private void validate(APISetVmNicSecurityGroupMsg msg) { + VmNicVO nicVO = dbf.findByUuid(msg.getVmNicUuid(), VmNicVO.class); + String nicControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(nicVO.getL3NetworkUuid()); + for (APISetVmNicSecurityGroupMsg.VmNicSecurityGroupRefAO ref : msg.getRefs()) { + String sgControllerUuid = SecurityGroupHelper.getSdnControllerUuid(ref.getSecurityGroupUuid()); + if (!StringUtils.equals(sgControllerUuid, nicControllerUuid)) { + throw new ApiMessageInterceptionException(argerr("could not add vmnic to securityGroup, " + + "because they have different sdn controller[nic controller uuid:%s, security group controller uuid:%s]", + nicControllerUuid, sgControllerUuid)); + } + } + } + + private void validate(APIAddSecurityGroupRuleMsg msg) { + String sgControllerUuid = SecurityGroupHelper.getSdnControllerUuid(msg.getSecurityGroupUuid()); + for (APIAddSecurityGroupRuleMsg.SecurityGroupRuleAO rule : msg.getRules()) { + if (rule.getRemoteSecurityGroupUuid() == null) { + continue; + } + String remoteControllerUuid = SecurityGroupHelper.getSdnControllerUuid(rule.getRemoteSecurityGroupUuid()); + if (!StringUtils.equals(sgControllerUuid, remoteControllerUuid)) { + throw new ApiMessageInterceptionException(argerr("could not add securityGroup rule, " + + "because rule remote security group sdn controller uuid[:%s] is different from security group controller uuid[:%s]", + remoteControllerUuid, sgControllerUuid)); + } + } + } + + private void validate(APIAddVmNicToSecurityGroupMsg msg) { + String sgControllerUuid = SecurityGroupHelper.getSdnControllerUuid(msg.getSecurityGroupUuid()); + for (String uuid : msg.getVmNicUuids()) { + VmNicVO nicVO = dbf.findByUuid(uuid, VmNicVO.class); + String nicControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(nicVO.getL3NetworkUuid()); + if (!StringUtils.equals(sgControllerUuid, nicControllerUuid)) { + throw new ApiMessageInterceptionException(argerr("could not add vmnic to securityGroup, " + + "because they have different sdn controller[nic controller uuid:%s, security group controller uuid:%s]", + nicControllerUuid, sgControllerUuid)); + } + } + } + + + private void validate(APIAttachSecurityGroupToL3NetworkMsg msg) { + String l3SdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(msg.getL3NetworkUuid()); + String sgSdnControllerUuid = SecurityGroupHelper.getSdnControllerUuid(msg.getSecurityGroupUuid()); + if (!StringUtils.equals(l3SdnControllerUuid, sgSdnControllerUuid)) { + throw new ApiMessageInterceptionException(argerr("could not attach l3 network to securityGroup, " + + "because they have different sdn controller[l3 controller uuid:%s, security group controller uuid:%s]", + l3SdnControllerUuid, sgSdnControllerUuid)); + } + } + private void validate(APIAddSdnControllerMsg msg) { if (!SdnControllerType.getAllTypeNames().contains(msg.getVendorType())) { throw new ApiMessageInterceptionException(argerr("Sdn controller type: %s in not in the supported list: %s ", msg.getVendorType(), SdnControllerType.getAllTypeNames())); @@ -98,7 +228,19 @@ private void validate(APISdnControllerAddHostMsg msg) { if (msg.getVtepIp() != null && msg.getNetmask() == null) { throw new ApiMessageInterceptionException(argerr("could not add host[uuid:%s] to sdn controller[uuid:%s], " + - " because netmask is specified", msg.getHostUuid(), msg.getSdnControllerUuid())); + " because netmask is not specified", msg.getHostUuid(), msg.getSdnControllerUuid())); + } + + if (msg.getVtepIp() != null) { + SdnControllerHostRefVO refvo = Q.New(SdnControllerHostRefVO.class) + .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .eq(SdnControllerHostRefVO_.vSwitchType, msg.getvSwitchType()) + .eq(SdnControllerHostRefVO_.vtepIp, msg.getVtepIp()).find(); + if (refvo != null) { + throw new ApiMessageInterceptionException(argerr("could not add host[uuid:%s] to sdn controller[uuid:%s], " + + " because vtepip is used by host[uuid:%s]", msg.getHostUuid(), + msg.getSdnControllerUuid(), refvo.getHostUuid())); + } } if (msg.getNicNames().size() > 1 && msg.getBondMode() == null) { @@ -106,7 +248,7 @@ private void validate(APISdnControllerAddHostMsg msg) { } if (msg.getBondMode() != null && msg.getLacpMode() == null) { - msg.setLacpMode(L2NetworkConstant.LACP_MODE_OFF); + msg.setLacpMode(L2NetworkConstant.LACP_MODE_ACTIVE); } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java index 660ad7e605f..f3958b933f6 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java @@ -11,6 +11,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.cloudbus.EventFacade; +import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.core.db.SQL; @@ -28,6 +29,7 @@ import org.zstack.header.message.MessageReply; import org.zstack.header.network.l2.DeleteL2NetworkMsg; import org.zstack.header.network.l2.L2NetworkConstant; +import org.zstack.header.network.l2.SdnControllerDeleteExtensionPoint; import org.zstack.network.hostNetworkInterface.HostNetworkInterfaceVO; import org.zstack.network.hostNetworkInterface.HostNetworkInterfaceVO_; import org.zstack.sdnController.header.*; @@ -57,6 +59,8 @@ public class SdnControllerBase { private EventFacade evtf; @Autowired SdnControllerManager sdnMgr; + @Autowired + private PluginRegistry pluginRgty; public SdnControllerVO self; @@ -631,7 +635,33 @@ public void done(ErrorCodeList errorCodeList) { }); } }).then(new NoRollbackFlow() { - String __name__ = String.format("delete-sdn-controller-%s", self.getName()); + String __name__ = String.format("delete-network-service"); + + @Override + public void run(FlowTrigger trigger, Map data) { + List exps = pluginRgty.getExtensionList(SdnControllerDeleteExtensionPoint.class); + new While<>(exps).each((exp, wcomp) -> { + exp.deleteNetworkServiceOfSdnController(msg.getSdnControllerUuid(), new Completion(wcomp) { + @Override + public void success() { + wcomp.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + logger.warn(String.format("delete network service failed, error: %s", errorCode.getDetails())); + wcomp.done(); + } + }); + }).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + trigger.next(); + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = String.format("delete-from-sdn-controller"); @Override public void run(FlowTrigger trigger, Map data) { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerFactory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerFactory.java index 55cf6e8e760..f9166c6cde8 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerFactory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerFactory.java @@ -2,6 +2,8 @@ import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.header.core.workflow.FlowChain; +import org.zstack.header.network.service.SdnControllerDhcp; +import org.zstack.network.securitygroup.SecurityGroupSdnBackend; import org.zstack.sdnController.header.SdnControllerVO; public interface SdnControllerFactory { @@ -12,8 +14,14 @@ public interface SdnControllerFactory { default SdnController getSdnController(String l2NetworkUuid) {return null;}; SdnControllerL2 getSdnControllerL2(SdnControllerVO vo); - default SdnControllerL2 getSdnControllerL2(String l2NetworkUuid) {return null;}; + + SecurityGroupSdnBackend getSdnControllerSecurityGroup(SdnControllerVO vo); + + + default SdnControllerDhcp getSdnControllerDhcp(SdnControllerVO vo) {return null;}; + default SdnControllerDhcp getSdnControllerDhcp(String l2NetworkUuid) {return null;}; + default FlowChain getSyncChain() {return FlowChainBuilder.newSimpleFlowChain();}; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java index 020492fde7d..79bbdb1ecaf 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java @@ -30,6 +30,6 @@ public interface SdnControllerL2 { default List getL2NetworkOfSdnController() { return new ArrayList<>();}; - default void addLogicalPorts(List nics, Completion completion) {completion.success();}; - default void removeLogicalPorts(List nics, Completion completion) {completion.success();}; + default void addVmNics(List nics, Completion completion) {completion.success();}; + default void removeVmNics(List nics, Completion completion) {completion.success();}; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManager.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManager.java index 7dfeaa6920b..57dc76508f9 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManager.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManager.java @@ -1,6 +1,7 @@ package org.zstack.sdnController; import org.zstack.header.core.workflow.FlowChain; +import org.zstack.header.network.service.SdnControllerDhcp; import org.zstack.sdnController.header.SdnControllerVO; public interface SdnControllerManager { @@ -8,5 +9,7 @@ public interface SdnControllerManager { SdnController getSdnController(SdnControllerVO sdnControllerVO); SdnControllerL2 getSdnControllerL2(SdnControllerVO sdnControllerVO); + SdnControllerDhcp getSdnControllerDhcp(String l3Uuid); + FlowChain getSyncChain(SdnControllerVO sdnControllerVO); } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java index 8de1ffede4d..2d512196647 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java @@ -21,7 +21,14 @@ import org.zstack.header.network.l2.*; import org.zstack.header.network.l3.L3NetworkInventory; import org.zstack.header.network.l3.L3NetworkVO; +import org.zstack.header.network.service.GetSdnControllerDhcpExtensionPoint; +import org.zstack.header.network.service.SdnControllerDhcp; import org.zstack.header.vm.*; +import org.zstack.network.l2.L2NetworkSystemTags; +import org.zstack.network.l3.L3NetworkHelper; +import org.zstack.network.securitygroup.SecurityGroupGetSdnBackendExtensionPoint; +import org.zstack.network.securitygroup.SecurityGroupManager; +import org.zstack.network.securitygroup.SecurityGroupSdnBackend; import org.zstack.sdnController.header.*; import org.zstack.tag.TagManager; import org.zstack.utils.Utils; @@ -34,7 +41,8 @@ public class SdnControllerManagerImpl extends AbstractService implements SdnControllerManager, L2NetworkCreateExtensionPoint, L2NetworkDeleteExtensionPoint, InstantiateResourceOnAttachingNicExtensionPoint, PreVmInstantiateResourceExtensionPoint, VmReleaseResourceExtensionPoint, - ReleaseNetworkServiceOnDetachingNicExtensionPoint { + ReleaseNetworkServiceOnDetachingNicExtensionPoint, SecurityGroupGetSdnBackendExtensionPoint, + GetSdnControllerDhcpExtensionPoint { private static final CLogger logger = Utils.getLogger(SdnControllerManagerImpl.class); @Autowired @@ -45,6 +53,8 @@ public class SdnControllerManagerImpl extends AbstractService implements SdnCont private PluginRegistry pluginRgty; @Autowired private TagManager tagMgr; + @Autowired + private SecurityGroupManager sgMgr; private Map sdnControllerFactories = Collections.synchronizedMap(new HashMap()); @@ -233,9 +243,9 @@ public void postCreateL2Network(L2NetworkInventory l2Network, APICreateL2Network String sdnControllerUuid = null; for (String systag : msg.getSystemTags()) { - if (SdnControllerSystemTags.L2_NETWORK_OVN_UUID.isMatch(systag)) { - sdnControllerUuid = SdnControllerSystemTags.L2_NETWORK_OVN_UUID.getTokenByTag( - systag, SdnControllerSystemTags.L2_NETWORK_OVN_UUID_TOKEN); + if (L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.isMatch(systag)) { + sdnControllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByTag( + systag, L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); } } @@ -309,7 +319,7 @@ public void afterDeleteL2Network(L2NetworkInventory inventory) { } - private void addOvnLogicalPorts(String sdnControllerUuid, List nics, Completion completion) { + private void sdnAddVmNic(String sdnControllerUuid, List nics, Completion completion) { SdnControllerVO vo = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); SdnControllerFactory factory = getSdnControllerFactory(vo.getVendorType()); if (factory == null) { @@ -318,12 +328,12 @@ private void addOvnLogicalPorts(String sdnControllerUuid, List n } SdnControllerL2 controller = factory.getSdnControllerL2(vo); - controller.addLogicalPorts(nics, completion); + controller.addVmNics(nics, completion); } - private void addOvnLogicalPort(Map> nicMaps, Completion completion) { + private void sdnAddVmNics(Map> nicMaps, Completion completion) { new While<>(nicMaps.entrySet()).each((e, wcomp) -> { - addOvnLogicalPorts(e.getKey(), e.getValue(), new Completion(wcomp) { + sdnAddVmNic(e.getKey(), e.getValue(), new Completion(wcomp) { @Override public void success() { wcomp.done(); @@ -356,7 +366,7 @@ private void removeOvnLogicalPorts(String controllerUuid, List n } SdnControllerL2 controller = factory.getSdnControllerL2(vo); - controller.removeLogicalPorts(nics, completion); + controller.removeVmNics(nics, completion); } private void removeLogicalPort(Map> nicMaps, Completion completion) { @@ -422,8 +432,8 @@ public void releaseVmResource(VmInstanceSpec spec, Completion completion) { continue; } - String controllerUuid = SdnControllerSystemTags.L2_NETWORK_OVN_UUID.getTokenByResourceUuid( - l2VO.getUuid(), SdnControllerSystemTags.L2_NETWORK_OVN_UUID_TOKEN); + String controllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByResourceUuid( + l2VO.getUuid(), L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); if (controllerUuid == null) { completion.fail(operr("sdn l2 network[uuid:%s] is not attached controller", l2VO.getUuid())); return; @@ -449,8 +459,8 @@ public void instantiateResourceOnAttachingNic(VmInstanceSpec spec, L3NetworkInve return; } - String controllerUuid = SdnControllerSystemTags.L2_NETWORK_OVN_UUID.getTokenByResourceUuid( - l2NetworkVO.getUuid(), SdnControllerSystemTags.L2_NETWORK_OVN_UUID_TOKEN); + String controllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByResourceUuid( + l2NetworkVO.getUuid(), L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); if (controllerUuid == null) { completion.fail(operr("sdn l2 network[uuid:%s] is not attached controller", l2NetworkVO.getUuid())); return; @@ -460,7 +470,7 @@ public void instantiateResourceOnAttachingNic(VmInstanceSpec spec, L3NetworkInve List nics = new ArrayList<>(); nics.add(spec.getDestNics().get(0)); nicMaps.put(controllerUuid, nics); - addOvnLogicalPort(nicMaps, completion); + sdnAddVmNics(nicMaps, completion); } @Override @@ -472,8 +482,8 @@ public void releaseResourceOnAttachingNic(VmInstanceSpec spec, L3NetworkInventor return; } - String controllerUuid = SdnControllerSystemTags.L2_NETWORK_OVN_UUID.getTokenByResourceUuid( - l2NetworkVO.getUuid(), SdnControllerSystemTags.L2_NETWORK_OVN_UUID_TOKEN); + String controllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByResourceUuid( + l2NetworkVO.getUuid(), L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); if (controllerUuid == null) { logger.warn(String.format("sdn l2 network[uuid:%s] is not attached controller", l2NetworkVO.getUuid())); completion.done(); @@ -510,8 +520,8 @@ public void releaseResourceOnDetachingNic(VmInstanceSpec spec, VmNicInventory ni return; } - String controllerUuid = SdnControllerSystemTags.L2_NETWORK_OVN_UUID.getTokenByResourceUuid( - l2NetworkVO.getUuid(), SdnControllerSystemTags.L2_NETWORK_OVN_UUID_TOKEN); + String controllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByResourceUuid( + l2NetworkVO.getUuid(), L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); if (controllerUuid == null) { logger.warn(String.format("sdn l2 network[uuid:%s] is not attached controller", l2NetworkVO.getUuid())); completion.done(); @@ -574,8 +584,8 @@ public void preInstantiateVmResource(VmInstanceSpec spec, Completion completion) continue; } - String controllerUuid = SdnControllerSystemTags.L2_NETWORK_OVN_UUID.getTokenByResourceUuid( - l2VO.getUuid(), SdnControllerSystemTags.L2_NETWORK_OVN_UUID_TOKEN); + String controllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByResourceUuid( + l2VO.getUuid(), L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); if (controllerUuid == null) { completion.fail(operr("sdn l2 network[uuid:%s] is not attached controller", l2VO.getUuid())); return; @@ -589,7 +599,7 @@ public void preInstantiateVmResource(VmInstanceSpec spec, Completion completion) return; } - addOvnLogicalPort(nicMaps, completion); + sdnAddVmNics(nicMaps, completion); } @Override @@ -623,8 +633,8 @@ public void preReleaseVmResource(VmInstanceSpec spec, Completion completion) { continue; } - String controllerUuid = SdnControllerSystemTags.L2_NETWORK_OVN_UUID.getTokenByResourceUuid( - l2VO.getUuid(), SdnControllerSystemTags.L2_NETWORK_OVN_UUID_TOKEN); + String controllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByResourceUuid( + l2VO.getUuid(), L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); if (controllerUuid == null) { completion.fail(operr("sdn l2 network[uuid:%s] is not attached controller", l2VO.getUuid())); return; @@ -663,6 +673,32 @@ public SdnControllerL2 getSdnControllerL2(SdnControllerVO sdnControllerVO) { return factory.getSdnControllerL2(sdnControllerVO); } + @Override + public SecurityGroupSdnBackend getSecurityGroupSdnBackend(String sdnControllerUuid) { + SdnControllerVO vo = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); + if (vo == null) { + return null; + } + SdnControllerFactory factory = getSdnControllerFactory(vo.getVendorType()); + return factory.getSdnControllerSecurityGroup(vo); + } + + @Override + public SdnControllerDhcp getSdnControllerDhcp(String l3Uuid) { + String controllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(l3Uuid); + if (controllerUuid == null) { + return null; + } + + SdnControllerVO vo = dbf.findByUuid(controllerUuid, SdnControllerVO.class); + if (vo == null) { + throw new CloudRuntimeException(String.format("can not find sdn controller[uuid:%s] for l3 network[uuid:%s]", + controllerUuid, l3Uuid)); + } + SdnControllerFactory factory = getSdnControllerFactory(vo.getVendorType()); + return factory.getSdnControllerDhcp(vo); + } + @Override public FlowChain getSyncChain(SdnControllerVO sdnControllerVO) { SdnControllerFactory f = getSdnControllerFactory(sdnControllerVO.getVendorType()); @@ -692,4 +728,6 @@ public boolean start() { public boolean stop() { return true; } + + } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerSystemTags.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerSystemTags.java deleted file mode 100644 index 9ef502bb8eb..00000000000 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerSystemTags.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.zstack.sdnController; - -import org.zstack.header.network.l2.L2NetworkVO; -import org.zstack.header.tag.TagDefinition; -import org.zstack.tag.PatternedSystemTag; - -@TagDefinition -public class SdnControllerSystemTags { - public static String L2_NETWORK_OVN_UUID_TOKEN = "OvnControllerUuid"; - public static PatternedSystemTag L2_NETWORK_OVN_UUID = new PatternedSystemTag(String.format("OvnControllerUuid::{%s}", L2_NETWORK_OVN_UUID_TOKEN), L2NetworkVO.class); -} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java index 8bff30df158..41d847bb876 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java @@ -1,5 +1,6 @@ package org.zstack.sdnController.h3cVcfc; +import org.zstack.network.securitygroup.SecurityGroupSdnBackend; import org.zstack.sdnController.SdnController; import org.zstack.sdnController.SdnControllerFactory; import org.zstack.sdnController.SdnControllerL2; @@ -23,4 +24,9 @@ public SdnController getSdnController(SdnControllerVO vo) { public SdnControllerL2 getSdnControllerL2(SdnControllerVO vo) { return new H3cVcfcSdnController(vo); } + + @Override + public SecurityGroupSdnBackend getSdnControllerSecurityGroup(SdnControllerVO vo) { + return null; + } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsgDoc_zh_cn.groovy index f6b7d17b8c7..1183e68acac 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsgDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsgDoc_zh_cn.groovy @@ -5,7 +5,7 @@ import org.zstack.sdnController.header.APISdnControllerAddHostEvent doc { title "SdnControllerAddHost" - category "SDN" + category "SdnController" desc """SDN控制器添加物理机""" diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java index f352ae1cdaa..87e53c82a53 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java @@ -61,7 +61,8 @@ public static APISdnControllerRemoveHostMsg __example__() { APISdnControllerRemoveHostMsg msg = new APISdnControllerRemoveHostMsg(); msg.setSdnControllerUuid(uuid()); - msg.setSdnControllerUuid(uuid()); + msg.setHostUuid(uuid()); + msg.setvSwitchType("OvnDpdk"); return msg; } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APICreateSecurityGroupMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APICreateSecurityGroupMsg.java index dfade9fe4de..aec49c60391 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APICreateSecurityGroupMsg.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APICreateSecurityGroupMsg.java @@ -6,8 +6,10 @@ import org.zstack.header.message.APIEvent; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; +import org.zstack.header.network.l2.L2NetworkVO; import org.zstack.header.other.APIAuditor; import org.zstack.header.rest.RestRequest; +import org.zstack.header.tag.TagResourceType; /** * @api @@ -45,6 +47,7 @@ * * see :ref:`APICreateSecurityGroupEvent` */ +@TagResourceType(SecurityGroupVO.class) @Action(category = SecurityGroupConstant.ACTION_CATEGORY) @RestRequest( path = "/security-groups", @@ -68,6 +71,20 @@ public class APICreateSecurityGroupMsg extends APICreateMessage implements APIAu @APIParam(required = false, validValues = {"4", "6"}) private Integer ipVersion; + /** + * @desc vSwitch type + */ + @APIParam(required = false, maxLength = 1024, validValues = {"LinuxBridge", "OvnDpdk"}) + private String vSwitchType = "LinuxBridge"; + + public String getvSwitchType() { + return vSwitchType; + } + + public void setvSwitchType(String vSwitchType) { + this.vSwitchType = vSwitchType; + } + public String getName() { return name; } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APICreateSecurityGroupMsgDoc_zh_cn.groovy b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APICreateSecurityGroupMsgDoc_zh_cn.groovy index 2b30f299f07..556af7a2f0f 100644 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APICreateSecurityGroupMsgDoc_zh_cn.groovy +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APICreateSecurityGroupMsgDoc_zh_cn.groovy @@ -85,6 +85,16 @@ doc { optional true since "3.4.0" } + column { + name "vSwitchType" + enclosedIn "params" + desc "虚拟交换机类型,用于指定安全组所使用的网络虚拟化技术" + location "body" + type "String" + optional true + since "5.3.20" + values ("LinuxBridge","OvnDpdk") + } } } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/CreateSecurityGroupMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/CreateSecurityGroupMsg.java index 09288b5b55b..9d40e197548 100644 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/CreateSecurityGroupMsg.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/CreateSecurityGroupMsg.java @@ -9,6 +9,8 @@ public class CreateSecurityGroupMsg extends NeedReplyMessage { private String name; private String description; private String accountUuid; + private String vSwitchType = "LinuxBridge"; + private String sdnControllerUuid; public String getName() { return name; @@ -33,4 +35,20 @@ public String getAccountUuid() { public void setAccountUuid(String accountUuid) { this.accountUuid = accountUuid; } + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getvSwitchType() { + return vSwitchType; + } + + public void setvSwitchType(String vSwitchType) { + this.vSwitchType = vSwitchType; + } } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/RefreshSecurityGroupRulesOnVmMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/RefreshSecurityGroupRulesOnVmMsg.java index e395bb82b10..506eed44bea 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/RefreshSecurityGroupRulesOnVmMsg.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/RefreshSecurityGroupRulesOnVmMsg.java @@ -1,6 +1,7 @@ package org.zstack.network.securitygroup; import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.vm.VmInstanceConstant; import java.util.List; @@ -10,6 +11,7 @@ public class RefreshSecurityGroupRulesOnVmMsg extends NeedReplyMessage { private boolean deleteAllRules; private List vNicUuids; private List sgUuids; + private VmInstanceConstant.VmOperation operation; public List getNicUuids() { return vNicUuids; } public void setNicUuids(List uuids) { this.vNicUuids = uuids; } @@ -45,4 +47,20 @@ public List getSgUuids() { public void setSgUuids(List sgUuids) { this.sgUuids = sgUuids; } + + public VmInstanceConstant.VmOperation getOperation() { + return operation; + } + + public void setOperation(VmInstanceConstant.VmOperation operation) { + this.operation = operation; + } + + public List getvNicUuids() { + return vNicUuids; + } + + public void setvNicUuids(List vNicUuids) { + this.vNicUuids = vNicUuids; + } } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/RuleTO.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/RuleTO.java index ad565d44577..fed6b2a770b 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/RuleTO.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/RuleTO.java @@ -5,7 +5,7 @@ public class RuleTO { private int ipVersion; private int priority; - private String type; + private String ruleType; private String remoteGroupUuid; private List remoteGroupVmIps; private String state; @@ -84,11 +84,13 @@ public String getProtocol() { public void setProtocol(String protocol) { this.protocol = protocol; } - public String getType() { - return type; + + public String getRuleType() { + return ruleType; } - public void setType(String type) { - this.type = type; + + public void setRuleType(String ruleType) { + this.ruleType = ruleType; } public void setRemoteGroupVmIps(List remoteGroupVmIps) { @@ -136,7 +138,7 @@ public void setAllowedCidr(String allowedCidr) { public String toString() { StringBuilder sb = new StringBuilder(); sb.append(String.format("ipVersion: %s,", this.ipVersion)); - sb.append(String.format("type: %s,", this.type)); + sb.append(String.format("type: %s,", this.ruleType)); sb.append(String.format("state: %s,", this.state)); sb.append(String.format("priority: %s,", this.priority)); sb.append(String.format("action: %s,", this.action)); @@ -152,7 +154,7 @@ public String toString() { public String toFullString() { StringBuilder sb = new StringBuilder(); sb.append(String.format("ipVersion: %s,", this.ipVersion)); - sb.append(String.format("type: %s,", this.type)); + sb.append(String.format("type: %s,", this.ruleType)); sb.append(String.format("state: %s,", this.state)); sb.append(String.format("priority: %s", this.priority)); sb.append(String.format("action: %s,", this.action)); diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupCascadeExtension.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupCascadeExtension.java index 1a6cb823c5a..b21fe374a7a 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupCascadeExtension.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupCascadeExtension.java @@ -9,6 +9,7 @@ import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.cloudbus.CloudBusListCallBack; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; import org.zstack.core.db.SQLBatchWithReturn; import org.zstack.core.db.SimpleQuery; import org.zstack.header.core.Completion; @@ -40,7 +41,7 @@ public class SecurityGroupCascadeExtension extends AbstractAsyncCascadeExtension @Autowired private CloudBus bus; - private static String NAME = VmNicSecurityGroupRefVO.class.getSimpleName(); + private static String NAME = SecurityGroupVO.class.getSimpleName(); @Override public void asyncCascade(CascadeAction action, Completion completion) { @@ -64,103 +65,57 @@ private void handleDeletionCheck(CascadeAction action, Completion completion) { completion.success(); } - private void handleSecurityGroupRefDeletion(CascadeAction action, final Completion completion) { - List refs = refFromAction(action); - if (refs.isEmpty()) { + private void handleDeletion(CascadeAction action, final Completion completion) { + List sgInv = securityGroupUuidsFromAction(action); + if (sgInv == null || sgInv.isEmpty()) { completion.success(); return; } - Map> map = new HashMap>(); - for (VmNicSecurityGroupRefInventory ref : refs) { - List nicUuids = map.get(ref.getSecurityGroupUuid()); - if (nicUuids == null) { - nicUuids = new ArrayList(); - map.put(ref.getSecurityGroupUuid(), nicUuids); - } - nicUuids.add(ref.getVmNicUuid()); - } - - List msgs = new ArrayList(); - for (Map.Entry> e : map.entrySet()) { - RemoveVmNicFromSecurityGroupMsg msg = new RemoveVmNicFromSecurityGroupMsg(); - msg.setSecurityGroupUuid(e.getKey()); - msg.setVmNicUuids(e.getValue()); - bus.makeTargetServiceIdByResourceUuid(msg, SecurityGroupConstant.SERVICE_ID, e.getKey()); - msgs.add(msg); - } - - bus.send(msgs, new CloudBusListCallBack(completion) { - @Override - public void run(List replies) { - for (MessageReply reply : replies) { + new While<>(sgInv).each((inv, wcomp) -> { + SecurityGroupDeletionMsg msg = new SecurityGroupDeletionMsg(); + msg.setUuid(inv.getUuid()); + bus.makeTargetServiceIdByResourceUuid(msg, SecurityGroupConstant.SERVICE_ID, inv.getUuid()); + bus.send(msg, new CloudBusCallBack(wcomp) { + @Override + public void run(MessageReply reply) { if (!reply.isSuccess()) { - logger.warn(String.format("failed to remove vm nic from some security group for some destroyed vm," + - "no worry, security group will catch it up later. %s", reply.getError())); + logger.warn(String.format("failed to delete security group[uuid:%s], %s", msg.getUuid(), reply.getError())); } - } + wcomp.done(); + } + }); + }).run(new WhileDoneCompletion(completion) { + @Override + public void done(ErrorCodeList errorCodeList) { completion.success(); } }); } - private void handleDeletion(CascadeAction action, final Completion completion) { - if (VmInstanceVO.class.getSimpleName().equals(action.getParentIssuer())) { - handleSecurityGroupRefDeletion(action, completion); - } else { - handleSecurityGroupDeletion(action, completion); - } - - } - - private void handleSecurityGroupDeletion(CascadeAction action, final Completion completion) { - List accounts = action.getParentIssuerContext(); - List accountUuids = accounts.stream().map(AccountInventory::getUuid).collect(Collectors.toList()); - - List msgs = new SQLBatchWithReturn>() { - @Override - protected List scripts() { - List uuids = q(AccountResourceRefVO.class) - .select(AccountResourceRefVO_.resourceUuid) - .eq(AccountResourceRefVO_.resourceType, SecurityGroupVO.class.getSimpleName()) - .in(AccountResourceRefVO_.ownerAccountUuid, accountUuids) - .listValues(); - - if (uuids.isEmpty()) { - return null; - } - - return uuids.stream().map(auuid -> { - SecurityGroupDeletionMsg msg = new SecurityGroupDeletionMsg(); - msg.setUuid(auuid); - bus.makeTargetServiceIdByResourceUuid(msg, SecurityGroupConstant.SERVICE_ID, auuid); - return msg; - }).collect(Collectors.toList()); + private List securityGroupUuidsFromAction(CascadeAction action) { + List ret = null; + if (NAME.equals(action.getParentIssuer())) { + ret = action.getParentIssuerContext(); + } else if (AccountVO.class.getSimpleName().equals(action.getParentIssuer())) { + List accounts = action.getParentIssuerContext(); + List accountUuids = accounts.stream().map(AccountInventory::getUuid).collect(Collectors.toList()); + + List sgUuids= Q.New(AccountResourceRefVO.class) + .select(AccountResourceRefVO_.resourceUuid) + .eq(AccountResourceRefVO_.resourceType, SecurityGroupVO.class.getSimpleName()) + .in(AccountResourceRefVO_.ownerAccountUuid, accountUuids) + .listValues(); + if (sgUuids.isEmpty()) { + return null; } - }.execute(); - - if (msgs == null) { - completion.success(); - return; + List sgVos = Q.New(SecurityGroupVO.class) + .in(SecurityGroupVO_.uuid, sgUuids).list(); + ret = SecurityGroupInventory.valueOf(sgVos); } - - new While<>(msgs).all((msg, com) -> bus.send(msg, new CloudBusCallBack(com) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - logger.warn(String.format("failed to delete scheduler[uuid:%s], %s", msg.getUuid(), reply.getError())); - } - - com.done(); - } - })).run(new WhileDoneCompletion(completion) { - @Override - public void done(ErrorCodeList errorCodeList) { - completion.success(); - } - }); + return ret; } @Override @@ -173,44 +128,16 @@ public String getCascadeResourceName() { return NAME; } - private List refFromAction(CascadeAction action) { - List vms = action.getParentIssuerContext(); - List nicUuids = new ArrayList(); - for (VmDeletionStruct vm : vms) { - nicUuids.addAll(CollectionUtils.transformToList(vm.getInventory().getVmNics(), new Function() { - @Override - public String call(VmNicInventory arg) { - return arg.getUuid(); - } - })); - } - - - if (nicUuids.isEmpty()) { - return new ArrayList(); - } - - SimpleQuery q = dbf.createQuery(VmNicSecurityGroupRefVO.class); - q.add(VmNicSecurityGroupRefVO_.vmNicUuid, SimpleQuery.Op.IN, nicUuids); - List vos = q.list(); - return VmNicSecurityGroupRefInventory.valueOf(vos); - } - @Override public CascadeAction createActionForChildResource(CascadeAction action) { - if (CascadeConstant.DELETION_CLEANUP_CODE.equals(action.getActionCode())) { - return null; - } - - if (!action.getParentIssuer().equals(VmInstanceVO.class.getSimpleName())) { - return null; - } - - List refs = refFromAction(action); - if (refs.isEmpty()) { - return null; + if (CascadeConstant.DELETION_CODES.contains(action.getActionCode())) { + List sgInvs = securityGroupUuidsFromAction(action); + if (sgInvs != null && !sgInvs.isEmpty()) { + return action.copy().setParentIssuer(NAME).setParentIssuerContext(sgInvs); + } + return action; } - return action.copy().setParentIssuer(NAME).setParentIssuerContext(refs); + return null; } } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupConstant.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupConstant.java index 4b96f7f7acc..9d306000580 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupConstant.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupConstant.java @@ -26,7 +26,7 @@ public static enum Param { SECURITY_GROUP_RULE_VO, SECURITY_GROUP_VO, SECURITY_GROUP_UUIDS, + SECURITY_GROUP_REFS, VM_NIC_UUIDS, - HOST_SECURITY_GROUP_MEMBERS_TO } } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGetSdnBackendExtensionPoint.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGetSdnBackendExtensionPoint.java new file mode 100644 index 00000000000..9a1ef0524d0 --- /dev/null +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGetSdnBackendExtensionPoint.java @@ -0,0 +1,5 @@ +package org.zstack.network.securitygroup; + +public interface SecurityGroupGetSdnBackendExtensionPoint { + SecurityGroupSdnBackend getSecurityGroupSdnBackend(String sdnControllerUuid); +} diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalConfig.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalConfig.java index db97996b0c7..c0cf749bc73 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalConfig.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalConfig.java @@ -25,4 +25,12 @@ public class SecurityGroupGlobalConfig { @GlobalConfigValidation(inNumberRange = {100, 1000}) @GlobalConfigDef(defaultValue = "100", type = Integer.class, description = "security group rules num limit") public static GlobalConfig SECURITY_GROUP_RULES_NUM_LIMIT = new GlobalConfig(CATEGORY, "rules.num.limit"); + + @GlobalConfigValidation(inNumberRange = {10, 20}) + @GlobalConfigDef(defaultValue = "10", type = Integer.class, description = "security groups attached to vmnic num limit") + public static GlobalConfig VMNIC_SECURITY_GROUP_NUM_LIMIT = new GlobalConfig(CATEGORY, "vnic.sg.num.limit"); + + @GlobalConfigValidation(inNumberRange = {25000, 30000}) + @GlobalConfigDef(defaultValue = "30000", type = Integer.class, description = "security group rule max priority in ovn") + public static GlobalConfig OVN_ACL_MAX_PRIORITY = new GlobalConfig(CATEGORY, "ovn.max.priority"); } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupHelper.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupHelper.java new file mode 100644 index 00000000000..88b010dc382 --- /dev/null +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupHelper.java @@ -0,0 +1,23 @@ +package org.zstack.network.securitygroup; + +import java.util.List; + +public class SecurityGroupHelper { + public static String getSdnControllerUuid(List systemTags) { + if (systemTags == null) { + return null; + } + + for (String tag : systemTags) { + if (SecurityGroupSystemTags.SDN_CONTROLLER_UUID.isMatch(tag)) { + return SecurityGroupSystemTags.SDN_CONTROLLER_UUID.getTokenByTag(tag, SecurityGroupSystemTags.SDN_CONTROLLER_UUID_TOKEN); + } + } + + return null; + } + + public static String getSdnControllerUuid(String sgUuid) { + return SecurityGroupSystemTags.SDN_CONTROLLER_UUID.getTokenByResourceUuid(sgUuid, SecurityGroupSystemTags.SDN_CONTROLLER_UUID_TOKEN); + } +} diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupInventory.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupInventory.java index ec460dcb910..8671f0c9ef2 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupInventory.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupInventory.java @@ -5,6 +5,7 @@ import org.zstack.header.rest.APINoSee; import org.zstack.header.search.Inventory; +import javax.persistence.Column; import javax.persistence.JoinColumn; import java.sql.Timestamp; import java.util.*; @@ -91,6 +92,8 @@ public class SecurityGroupInventory { @Deprecated private Integer ipVersion; + private String vSwitchType; + /** * @desc the time this resource gets created */ @@ -131,6 +134,7 @@ protected SecurityGroupInventory(SecurityGroupVO vo) { this.setLastOpDate(vo.getLastOpDate()); this.setRules(SecurityGroupRuleInventory.valueOf(vo.getRules())); this.setState(vo.getState().toString()); + this.setvSwitchType(vo.getvSwitchType()); Set l3Uuids= new HashSet(vo.getAttachedL3NetworkRefs().size()); for (SecurityGroupL3NetworkRefVO ref : vo.getAttachedL3NetworkRefs()) { l3Uuids.add(ref.getL3NetworkUuid()); @@ -231,4 +235,12 @@ public Integer getIpVersion() { public void setIpVersion(Integer ipVersion) { this.ipVersion = ipVersion; } + + public String getvSwitchType() { + return vSwitchType; + } + + public void setvSwitchType(String vSwitchType) { + this.vSwitchType = vSwitchType; + } } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java index b45ad810137..cee18bd8eb6 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java @@ -7,6 +7,10 @@ import org.springframework.transaction.annotation.Transactional; import org.zstack.core.Platform; import static org.zstack.core.Platform.operr; + +import org.zstack.core.asyncbatch.While; +import org.zstack.core.cascade.CascadeConstant; +import org.zstack.core.cascade.CascadeFacade; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.cloudbus.MessageSafe; @@ -15,6 +19,8 @@ import org.zstack.core.config.GlobalConfigUpdateExtensionPoint; import org.zstack.core.db.*; import org.zstack.core.db.SimpleQuery.Op; +import org.zstack.core.defer.Defer; +import org.zstack.core.defer.Deferred; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.core.thread.AsyncThread; import org.zstack.core.thread.ChainTask; @@ -26,13 +32,11 @@ import org.zstack.header.AbstractService; import org.zstack.header.apimediator.ApiMessageInterceptionException; import org.zstack.header.core.Completion; -import org.zstack.header.core.workflow.Flow; -import org.zstack.header.core.workflow.FlowChain; -import org.zstack.header.core.workflow.FlowDoneHandler; -import org.zstack.header.core.workflow.FlowErrorHandler; -import org.zstack.header.core.workflow.FlowTrigger; -import org.zstack.header.core.workflow.NoRollbackFlow; +import org.zstack.header.core.NopeCompletion; +import org.zstack.header.core.WhileDoneCompletion; +import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.errorcode.SysErrors; import org.zstack.header.exception.CloudRuntimeException; @@ -45,14 +49,14 @@ import org.zstack.header.identity.ReportQuotaExtensionPoint; import org.zstack.header.identity.quota.QuotaMessageHandler; import org.zstack.header.managementnode.ManagementNodeReadyExtensionPoint; +import org.zstack.header.message.APIDeleteMessage; import org.zstack.header.message.APIMessage; import org.zstack.header.message.Message; import org.zstack.header.message.MessageReply; -import org.zstack.header.network.l3.IpRangeInventory; -import org.zstack.header.network.l3.L3NetworkInventory; -import org.zstack.header.network.l3.L3NetworkVO; -import org.zstack.header.network.l3.UsedIpVO; -import org.zstack.header.network.l3.UsedIpVO_; +import org.zstack.header.network.l2.L2NetworkConstant; +import org.zstack.header.network.l2.SdnControllerDeleteExtensionPoint; +import org.zstack.header.network.l2.VSwitchType; +import org.zstack.header.network.l3.*; import org.zstack.header.network.service.NetworkServiceL3NetworkRefVO; import org.zstack.header.network.service.NetworkServiceL3NetworkRefVO_; import org.zstack.header.query.AddExpandedQueryExtensionPoint; @@ -62,10 +66,12 @@ import org.zstack.identity.AccountManager; import org.zstack.identity.QuotaUtil; import org.zstack.network.l3.IpRangeHelper; +import org.zstack.network.l3.L3NetworkHelper; import org.zstack.network.securitygroup.APIUpdateSecurityGroupRulePriorityMsg.SecurityGroupRulePriorityAO; import org.zstack.network.securitygroup.APIAddSecurityGroupRuleMsg.SecurityGroupRuleAO; import org.zstack.network.securitygroup.APISetVmNicSecurityGroupMsg.VmNicSecurityGroupRefAO; import org.zstack.query.QueryFacade; +import org.zstack.tag.SystemTagCreator; import org.zstack.tag.TagManager; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; @@ -85,14 +91,15 @@ import java.util.stream.Stream; import static java.util.Arrays.asList; -import static org.zstack.core.Platform.i18n; import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.err; +import static org.zstack.network.securitygroup.SecurityGroupConstant.Param.*; import static org.zstack.network.securitygroup.SecurityGroupMembersTO.ACTION_CODE_DELETE_GROUP; -import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.CollectionDSL.*; public class SecurityGroupManagerImpl extends AbstractService implements SecurityGroupManager, ManagementNodeReadyExtensionPoint, - VmInstanceMigrateExtensionPoint, AddExpandedQueryExtensionPoint, ReportQuotaExtensionPoint, ValidateL3SecurityGroupExtensionPoint { + VmInstanceMigrateExtensionPoint, AddExpandedQueryExtensionPoint, ReportQuotaExtensionPoint, ValidateL3SecurityGroupExtensionPoint, + SdnControllerDeleteExtensionPoint { private static CLogger logger = Utils.getLogger(SecurityGroupManagerImpl.class); @Autowired @@ -113,6 +120,8 @@ public class SecurityGroupManagerImpl extends AbstractService implements Securit private TagManager tagMgr; @Autowired private ErrorFacade errf; + @Autowired + protected CascadeFacade casf; protected Map hypervisorBackends; private int failureHostWorkerInterval; @@ -156,6 +165,50 @@ public void validateSystemtagL3SecurityGroup(String l3Uuid, List securit } } + private List getVmIpsBySecurityGroup(String sgUuid, int ipVersion){ + List ret = new ArrayList<>(); + String sql = "select ip.ip" + + " from VmNicVO nic, VmNicSecurityGroupRefVO ref, SecurityGroupVO sg, UsedIpVO ip" + + " where sg.uuid = ref.securityGroupUuid and ref.vmNicUuid = nic.uuid" + + " and ref.securityGroupUuid = :sgUuid" + + " and nic.uuid = ip.vmNicUuid and ip.ipVersion = :ipVersion"; + TypedQuery internalIpQuery = dbf.getEntityManager().createQuery(sql, String.class); + internalIpQuery.setParameter("sgUuid", sgUuid); + internalIpQuery.setParameter("ipVersion", ipVersion); + + List ips = internalIpQuery.getResultList(); + if (ips != null) { + ret.addAll(ips); + } + + /* add gateway address to group list */ + List attachedL3Uuids = Q.New(SecurityGroupL3NetworkRefVO.class).select(SecurityGroupL3NetworkRefVO_.l3NetworkUuid) + .eq(SecurityGroupL3NetworkRefVO_.securityGroupUuid, sgUuid).listValues(); + + List nicL3Uuids = SQL.New("select distinct l3.uuid from VmNicVO nic, VmNicSecurityGroupRefVO ref, L3NetworkVO l3" + + " where ref.securityGroupUuid = :sgUuid" + + " and ref.vmNicUuid = nic.uuid" + + " and l3.uuid = nic.l3NetworkUuid", String.class) + .param("sgUuid", sgUuid) + .list(); + + List resultL3Uuids = Stream.concat(attachedL3Uuids.stream(), nicL3Uuids.stream()).distinct().collect(Collectors.toList()); + + for (String uuid: resultL3Uuids) { + L3NetworkInventory inv = L3NetworkInventory.valueOf(dbf.findByUuid(uuid, L3NetworkVO.class)); + List iprs = IpRangeHelper.getNormalIpRanges(inv, ipVersion); + if (!iprs.isEmpty()) { + ret.add(iprs.get(0).getGateway()); + } + } + + for (SecurityGroupGetDefaultRuleExtensionPoint exp : pluginRgty.getExtensionList(SecurityGroupGetDefaultRuleExtensionPoint.class)) { + ret.addAll(exp.getGroupMembers(sgUuid, ipVersion)); + } + + return ret.stream().distinct().collect(Collectors.toList()); + } + private class RuleCalculator { private List vmNicUuids; private List l3NetworkUuids; @@ -222,11 +275,13 @@ private List calculateByHost() { String sql = "select nic.uuid from VmNicVO nic, VmInstanceVO vm, VmNicSecurityGroupRefVO ref, SecurityGroupVO sg" + " where nic.uuid = ref.vmNicUuid and nic.vmInstanceUuid = vm.uuid"+ " and ref.securityGroupUuid = sg.uuid and sg.state in (:sgState)" + + " and sg.vSwitchType = :vSwitchType" + " and vm.hostUuid in (:hostUuids) and vm.state in (:vmStates)"; TypedQuery insgQuery = dbf.getEntityManager().createQuery(sql, String.class); insgQuery.setParameter("hostUuids", hostUuids); insgQuery.setParameter("vmStates", vmStates); insgQuery.setParameter("sgState", sgStates); + insgQuery.setParameter("vSwitchType", L2NetworkConstant.VSWITCH_TYPE_LINUX_BRIDGE); List nicsInSg = insgQuery.getResultList(); sql = "select nic.uuid from VmNicVO nic, VmInstanceVO vm where nic.vmInstanceUuid = vm.uuid" + @@ -295,7 +350,7 @@ private List calculateRuleTOBySecurityGroup(String sgUuid, String l3Uuid RuleTO rto = new RuleTO(); rto.setIpVersion(r.getIpVersion()); rto.setPriority(r.getPriority()); - rto.setType(r.getType().toString()); + rto.setRuleType(r.getType().toString()); rto.setState(r.getState().toString()); rto.setRemoteGroupUuid(r.getRemoteSecurityGroupUuid()); rto.setRemoteGroupVmIps(getVmIpsBySecurityGroup(r.getRemoteSecurityGroupUuid(), r.getIpVersion())); @@ -303,7 +358,7 @@ private List calculateRuleTOBySecurityGroup(String sgUuid, String l3Uuid rto.setSrcIpRange(r.getSrcIpRange()); rto.setDstIpRange(r.getDstIpRange()); rto.setDstPortRange(r.getDstPortRange()); - rto.setAction(r.getAction().toString()); + rto.setAction(r.getAction()); ret.add(rto); } @@ -319,49 +374,121 @@ private List calculateRuleTOBySecurityGroup(String sgUuid, String l3Uuid return ret; } - private List getVmIpsBySecurityGroup(String sgUuid, int ipVersion){ - List ret = new ArrayList<>(); - // TODO: if two L3 network which have same ip segment attached same sg, it might has a problem - String sql = "select ip.ip" + - " from VmNicVO nic, VmNicSecurityGroupRefVO ref, SecurityGroupVO sg, UsedIpVO ip" + - " where sg.uuid = ref.securityGroupUuid and ref.vmNicUuid = nic.uuid" + - " and ref.securityGroupUuid = :sgUuid" + - " and nic.uuid = ip.vmNicUuid and ip.ipVersion = :ipVersion"; - TypedQuery internalIpQuery = dbf.getEntityManager().createQuery(sql, String.class); - internalIpQuery.setParameter("sgUuid", sgUuid); - internalIpQuery.setParameter("ipVersion", ipVersion); - - List ips = internalIpQuery.getResultList(); - if (ips != null) { - ret.addAll(ips); + @Transactional(readOnly = true) + public VmNicSecurityGroupTo calculateVmNicSecurityGroupTO() { + if (sgStates == null) { + sgStates = asList(SecurityGroupState.Enabled); } - /* add gateway address to group list */ - List attachedL3Uuids = Q.New(SecurityGroupL3NetworkRefVO.class).select(SecurityGroupL3NetworkRefVO_.l3NetworkUuid) - .eq(SecurityGroupL3NetworkRefVO_.securityGroupUuid, sgUuid).listValues(); + VmNicSecurityGroupTo to = new VmNicSecurityGroupTo(); + if (vmNicUuids != null && !vmNicUuids.isEmpty()) { + // calculate nic security group priority + List ts = SQL.New("select nic.uuid, nic.internalName, nic.mac" + + " from VmInstanceVO vm, VmNicVO nic" + + " where nic.uuid in (:vmNicUuids) and nic.vmInstanceUuid = vm.uuid", Tuple.class) + .param("vmNicUuids", vmNicUuids) + .list(); + if (ts.isEmpty()) { + logger.debug(String.format("security group calculateVmNicSecurityGroupTO: no match nics[%s] ", vmNicUuids)); + return to; + } - List nicL3Uuids = SQL.New("select distinct l3.uuid from VmNicVO nic, VmNicSecurityGroupRefVO ref, L3NetworkVO l3" + - " where ref.securityGroupUuid = :sgUuid" + - " and ref.vmNicUuid = nic.uuid" + - " and l3.uuid = nic.l3NetworkUuid", String.class) - .param("sgUuid", sgUuid) - .list(); + List usedIps = Q.New(UsedIpVO.class).in(UsedIpVO_.vmNicUuid, vmNicUuids).list(); + List policies = Q.New(VmNicSecurityPolicyVO.class).in(VmNicSecurityPolicyVO_.vmNicUuid, vmNicUuids).list(); + List refs = SQL.New("select ref.vmNicUuid, ref.priority, sg.uuid, sg.state" + + " from VmNicSecurityGroupRefVO ref, SecurityGroupVO sg" + + " where ref.vmNicUuid in (:vmNicUuids)" + + " and ref.securityGroupUuid = sg.uuid" + + " and sg.state in (:sgStates)", Tuple.class) + .param("vmNicUuids", vmNicUuids) + .param("sgStates", sgStates) + .list(); + ; + + for (Tuple t : ts) { + String nicUuid = t.get(0, String.class); + String nicName = t.get(1, String.class); + String mac = t.get(2, String.class); + + VmNicSecurityPolicyVO policy = policies.stream().filter(p -> p.getVmNicUuid().equals(nicUuid)).findFirst().orElse(null); + if (policy == null) { + continue; + } - List resultL3Uuids = Stream.concat(attachedL3Uuids.stream(), nicL3Uuids.stream()).distinct().collect(Collectors.toList()); + VmNicSecurityTO nicTo = new VmNicSecurityTO(); + nicTo.setVmNicUuid(nicUuid); + nicTo.setInternalName(nicName); + nicTo.setMac(mac); + nicTo.setIngressPolicy(policy.getIngressPolicy()); + nicTo.setEgressPolicy(policy.getEgressPolicy()); - for (String uuid: resultL3Uuids) { - L3NetworkInventory inv = L3NetworkInventory.valueOf(dbf.findByUuid(uuid, L3NetworkVO.class)); - List iprs = IpRangeHelper.getNormalIpRanges(inv, ipVersion); - if (!iprs.isEmpty()) { - ret.add(iprs.get(0).getGateway()); + List ips = usedIps.stream().filter(i -> i.getVmNicUuid().equals(nicUuid)).collect(Collectors.toList()); + for (UsedIpVO ip : ips) { + String ipAddr = ip.getIp(); + nicTo.getVmNicIps().add(ipAddr); + } + List sgRefs = refs.stream() + .filter(r -> r.get(0, String.class).equals(nicUuid) && + r.get(3, SecurityGroupState.class) == SecurityGroupState.Enabled) + .collect(Collectors.toList()); + if (sgRefs.isEmpty()) { + nicTo.setActionCode(VmNicSecurityTO.ACTION_CODE_DELETE_CHAIN); + } + for (Tuple sgRef : sgRefs) { + int priority = sgRef.get(1, Integer.class); + String sgUuid = sgRef.get(2, String.class); + if (securityGroupUuids != null && securityGroupUuids.contains(sgUuid)) { + nicTo.getSecurityGroupRefs().put(sgUuid, priority); + } + } + + to.getVmNics().add(nicTo); } } - for (SecurityGroupGetDefaultRuleExtensionPoint exp : pluginRgty.getExtensionList(SecurityGroupGetDefaultRuleExtensionPoint.class)) { - ret.addAll(exp.getGroupMembers(sgUuid, ipVersion)); + // calculate security group rules + if (securityGroupUuids != null && !securityGroupUuids.isEmpty()) { + for (String uuid : securityGroupUuids) { + SecurityGroupTo group = new SecurityGroupTo(); + + SecurityGroupVO vo = dbf.findByUuid(uuid, SecurityGroupVO.class); + group.setSecurityGroupUuid(uuid); + group.setSecurityGroupName(vo.getName()); + group.setSecurityGroupVmIps(getVmIpsBySecurityGroup(uuid, IPv6Constants.IPv4)); + group.setSecurityGroupVmIp6s(getVmIpsBySecurityGroup(uuid, IPv6Constants.IPv6)); + + List rules = vo.getRules().stream() + .filter(r -> r.getState() == SecurityGroupRuleState.Enabled) + .collect(Collectors.toList()); + for (SecurityGroupRuleVO r : rules) { + RuleTO rto = new RuleTO(); + rto.setIpVersion(r.getIpVersion()); + rto.setPriority(r.getPriority()); + rto.setRuleType(r.getType().toString()); + rto.setState(r.getState().toString()); + rto.setRemoteGroupUuid(r.getRemoteSecurityGroupUuid()); + rto.setProtocol(r.getProtocol().toString()); + rto.setSrcIpRange(r.getSrcIpRange()); + rto.setDstIpRange(r.getDstIpRange()); + rto.setDstPortRange(r.getDstPortRange()); + rto.setAction(r.getAction()); + group.getRules().add(rto); + } + + to.getGroups().add(group); + } } - return ret.stream().distinct().collect(Collectors.toList()); + if (logger.isTraceEnabled()) { + StringBuilder sb = new StringBuilder(); + sb.append(String.format("\n=================== begin calculateVmNicSecurityGroupTO ======================")); + sb.append(String.format("\ninput vmNic uuids: %s", vmNicUuids)); + sb.append(String.format("\nresult: %s", JSONObjectUtil.toJsonString(to))); + sb.append(String.format("\n=================== end calculateVmNicSecurityGroupTO ========================")); + logger.trace(sb.toString()); + } + + return to; } @Transactional(readOnly = true) @@ -369,7 +496,7 @@ private List calculateByVmNic() { Map htoMap = new HashMap(); if (vmNicUuids == null || vmNicUuids.isEmpty()) { - return htoMap.values().stream().collect(Collectors.toList()); + return new ArrayList<>(htoMap.values()); } List ts = SQL.New("select vm.hostUuid, vm.hypervisorType, nic.uuid, nic.internalName, nic.mac" + @@ -381,7 +508,7 @@ private List calculateByVmNic() { if (ts.isEmpty()) { logger.debug(String.format("security group calcuateByVmNic: no match nics[%s] ", vmNicUuids)); - return htoMap.values().stream().collect(Collectors.toList()); + return new ArrayList<>(htoMap.values()); } List usedIps = Q.New(UsedIpVO.class).in(UsedIpVO_.vmNicUuid, vmNicUuids).list(); @@ -502,6 +629,111 @@ private void handleLocalMessage(Message msg) { } } + private void sdnRefreshVmNicsDefaultRule(SecurityGroupSdnBackend sdnBackend, List vmNicUuids, Completion completion) { + RuleCalculator cal = new RuleCalculator(); + cal.vmNicUuids = vmNicUuids; + + VmNicSecurityGroupTo nicTo = cal.calculateVmNicSecurityGroupTO(); + sdnBackend.updateSecurityGroup(nicTo, completion); + } + + private void sdnRefreshVmNics(SecurityGroupSdnBackend sdnBackend, List vmNicUuids, Completion completion) { + RuleCalculator cal = new RuleCalculator(); + cal.sgStates = Collections.singletonList(SecurityGroupState.Enabled);; + cal.securityGroupUuids = Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.securityGroupUuid) + .in(VmNicSecurityGroupRefVO_.vmNicUuid, vmNicUuids) + .listValues(); + if (cal.securityGroupUuids.isEmpty()) { + completion.success(); + return; + } + cal.securityGroupUuids = cal.securityGroupUuids.stream().distinct().collect(Collectors.toList()); + cal.vmNicUuids = vmNicUuids; + + VmNicSecurityGroupTo nicTo = cal.calculateVmNicSecurityGroupTO(); + for (VmNicSecurityTO to : nicTo.vmNics) { + to.setSync(true); + } + + sdnBackend.updateSecurityGroup(nicTo, completion); + } + + private void sdnRemoveSecurityGroupFromVmNic(SecurityGroupSdnBackend sdnBackend, + List sgUuids, List vmNicUuids, Completion completion) { + RuleCalculator cal = new RuleCalculator(); + cal.securityGroupUuids = Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.securityGroupUuid) + .in(VmNicSecurityGroupRefVO_.vmNicUuid, vmNicUuids) + .listValues(); + cal.securityGroupUuids.addAll(sgUuids); + cal.securityGroupUuids = cal.securityGroupUuids.stream().distinct().collect(Collectors.toList()); + cal.vmNicUuids = vmNicUuids; + + VmNicSecurityGroupTo nicTo = cal.calculateVmNicSecurityGroupTO(); + for (VmNicSecurityTO to : nicTo.vmNics) { + to.setSync(true); + } + sdnBackend.updateSecurityGroup(nicTo, completion); + } + + private void sdnDeleteSecurityGroup(SecurityGroupSdnBackend sdnBackend, List vmNicUuids, + String sgUuid,Completion completion) { + RuleCalculator cal = new RuleCalculator(); + if (!vmNicUuids.isEmpty()) { + cal.securityGroupUuids = Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.securityGroupUuid) + .in(VmNicSecurityGroupRefVO_.vmNicUuid, vmNicUuids) + .listValues(); + } else { + cal.securityGroupUuids = new ArrayList<>(); + } + cal.securityGroupUuids.add(sgUuid); + cal.securityGroupUuids = cal.securityGroupUuids.stream().distinct().collect(Collectors.toList()); + cal.vmNicUuids = vmNicUuids; + + VmNicSecurityGroupTo nicTo = cal.calculateVmNicSecurityGroupTO(); + for (SecurityGroupTo group : nicTo.groups) { + if (group.getSecurityGroupUuid().equals(sgUuid)) { + group.setActionCode(SecurityGroupTo.ACTION_CODE_DELETE_CHAIN); + } + } + for (VmNicSecurityTO nic : nicTo.vmNics) { + nic.setSync(true); + } + sdnBackend.updateSecurityGroup(nicTo, completion); + } + + private void sdnRefreshSecurityGroup(SecurityGroupSdnBackend sdnBackend, String sgUuid,Completion completion) { + SecurityGroupVO groupVO = dbf.findByUuid(sgUuid, SecurityGroupVO.class); + if (groupVO.getState() == SecurityGroupState.Disabled) { + completion.success(); + return; + } + + List vmNicUuids = Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.vmNicUuid) + .eq(VmNicSecurityGroupRefVO_.securityGroupUuid, sgUuid) + .listValues(); + if (vmNicUuids.isEmpty()) { + completion.success(); + return; + } + + RuleCalculator cal = new RuleCalculator(); + cal.securityGroupUuids = Collections.singletonList(sgUuid); + cal.vmNicUuids = vmNicUuids; + + VmNicSecurityGroupTo nicTo = cal.calculateVmNicSecurityGroupTO(); + //security group is not attached to vm + if (nicTo.getVmNics().isEmpty()) { + completion.success(); + return; + } + + sdnBackend.updateSecurityGroup(nicTo, completion); + } + private void handle(CreateSecurityGroupMsg msg) { CreateSecurityGroupReply reply = new CreateSecurityGroupReply(); SecurityGroupVO vo = new SecurityGroupVO(); @@ -509,6 +741,7 @@ private void handle(CreateSecurityGroupMsg msg) { vo.setName(msg.getName()); vo.setDescription(msg.getDescription()); vo.setState(SecurityGroupState.Enabled); + vo.setvSwitchType(msg.getvSwitchType()); vo.setInternalId(dbf.generateSequenceNumber(SecurityGroupSequenceNumberVO.class)); vo.setAccountUuid(msg.getAccountUuid()); vo = dbf.persistAndRefresh(vo); @@ -516,8 +749,28 @@ private void handle(CreateSecurityGroupMsg msg) { createDefaultRule(vo.getUuid(), IPv6Constants.IPv4); createDefaultRule(vo.getUuid(), IPv6Constants.IPv6); - reply.setInventory(SecurityGroupInventory.valueOf(vo)); - bus.reply(msg, reply); + SecurityGroupSdnBackend sdnBackend = getSdnBackend(msg.getSdnControllerUuid()); + if (sdnBackend == null) { + reply.setInventory(SecurityGroupInventory.valueOf(vo)); + bus.reply(msg, reply); + return; + } + + final SecurityGroupInventory inv = SecurityGroupInventory.valueOf(vo); + sdnBackend.createSecurityGroup(inv, new Completion(msg) { + @Override + public void success() { + reply.setInventory(SecurityGroupInventory.valueOf( + dbf.findByUuid(inv.getUuid(), SecurityGroupVO.class))); + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); } private void handle(AddSecurityGroupRuleMsg msg) { @@ -581,8 +834,36 @@ public String getName() { private void handle(SecurityGroupDeletionMsg msg) { SecurityGroupDeletionReply reply = new SecurityGroupDeletionReply(); - dbf.removeByPrimaryKey(msg.getUuid(), SecurityGroupVO.class); - bus.reply(msg, reply); + + thdf.chainSubmit(new ChainTask(msg) { + @Override + public String getSyncSignature() { + return getSecurityGroupSyncThreadName(msg.getUuid()); + } + + @Override + public void run(SyncTaskChain chain) { + deleteSecurityGroup(msg.getUuid(), new Completion(msg, chain) { + @Override + public void success() { + bus.reply(msg, reply); + chain.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + chain.next(); + } + }); + } + + @Override + public String getName() { + return String.format("delete-security-group-%s", msg.getUuid()); + } + }); } private void handle(RemoveVmNicFromSecurityGroupMsg msg) { @@ -617,23 +898,79 @@ public String getName() { }); } - private void handle(RefreshSecurityGroupRulesOnVmMsg msg) { - RefreshSecurityGroupRulesOnVmReply reply = new RefreshSecurityGroupRulesOnVmReply(); - List nicUuids = msg.getNicUuids(); - if (nicUuids == null || nicUuids.isEmpty()) { - SimpleQuery q = dbf.createQuery(VmNicSecurityGroupRefVO.class); - q.select(VmNicSecurityGroupRefVO_.vmNicUuid); - q.add(VmNicSecurityGroupRefVO_.vmInstanceUuid, Op.EQ, msg.getVmInstanceUuid()); - nicUuids = q.listValue(); - } - - if (nicUuids.isEmpty()) { - checkDefaultRulesOnHost(msg.getHostUuid()); - logger.debug(String.format("no nic of vm[uuid:%s] needs to refresh security group rule", msg.getVmInstanceUuid())); - bus.reply(msg, reply); + private void refreshVmSecurityGroupRulesBySdn(Map> sdnNicUuidsMap, + RefreshSecurityGroupRulesOnVmMsg msg, Completion completion) { + if (msg.getOperation() != VmInstanceConstant.VmOperation.NewCreate + && msg.getOperation() != VmInstanceConstant.VmOperation.Destroy + && msg.getOperation() != VmInstanceConstant.VmOperation.AttachNic + && msg.getOperation() != VmInstanceConstant.VmOperation.DetachNic + && msg.getOperation() != VmInstanceConstant.VmOperation.ChangeNicNetwork) { + completion.success(); return; } + new While<>(sdnNicUuidsMap.entrySet()).each((entry, wcomp) -> { + SecurityGroupSdnBackend backend = entry.getKey(); + List vmNicUuids = entry.getValue(); + if (vmNicUuids.isEmpty()) { + wcomp.done(); + return; + } + + vmNicUuids = Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.vmNicUuid) + .in(VmNicSecurityGroupRefVO_.vmNicUuid, vmNicUuids) + .listValues(); + if (vmNicUuids.isEmpty()) { + wcomp.done(); + return; + } + + if (msg.isDeleteAllRules()) { + List sgUuids = Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.securityGroupUuid) + .in(VmNicSecurityGroupRefVO_.vmNicUuid, vmNicUuids) + .listValues(); + SQL.New(VmNicSecurityGroupRefVO.class).in(VmNicSecurityGroupRefVO_.vmNicUuid, vmNicUuids).delete(); + sdnRemoveSecurityGroupFromVmNic(backend, sgUuids,vmNicUuids, new Completion(wcomp) { + @Override + public void success() { + wcomp.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + wcomp.addError(errorCode); + wcomp.allDone(); + } + }); + } else { + sdnRefreshVmNics(backend, vmNicUuids, new Completion(wcomp) { + @Override + public void success() { + wcomp.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + wcomp.addError(errorCode); + wcomp.allDone(); + } + }); + } + }).run(new WhileDoneCompletion(new NopeCompletion()) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + completion.fail(errorCodeList); + } else { + completion.success(); + } + } + }); + } + + private void refreshVmSecurityGroupRules(List nicUuids, RefreshSecurityGroupRulesOnVmMsg msg) { nicUuids = nicUuids.stream().distinct().collect(Collectors.toList()); Collection htos; RuleCalculator cal = new RuleCalculator(); @@ -641,18 +978,21 @@ private void handle(RefreshSecurityGroupRulesOnVmMsg msg) { cal.vmStates = asList(VmInstanceState.values()); cal.isDelete = msg.isDeleteAllRules(); htos = cal.calculate(); - + applyRules(htos); if (msg.getSgUuids() != null && !msg.getSgUuids().isEmpty()) { Q.New(SecurityGroupVO.class) - .select(SecurityGroupVO_.uuid).in(SecurityGroupVO_.uuid, msg.getSgUuids()) - .eq(SecurityGroupVO_.state, SecurityGroupState.Enabled).listValues().forEach(sgUuid -> { - HostSecurityGroupMembersTO groupMemberTO = cal.returnHostSecurityGroupMember((String) sgUuid); - if (!groupMemberTO.getHostUuids().isEmpty()) { - updateGroupMembers(groupMemberTO); - } - }); + .select(SecurityGroupVO_.uuid) + .eq(SecurityGroupVO_.vSwitchType, L2NetworkConstant.VSWITCH_TYPE_LINUX_BRIDGE) + .in(SecurityGroupVO_.uuid, msg.getSgUuids()) + .eq(SecurityGroupVO_.state, SecurityGroupState.Enabled) + .listValues().forEach(sgUuid -> { + HostSecurityGroupMembersTO groupMemberTO = cal.returnHostSecurityGroupMember((String) sgUuid); + if (!groupMemberTO.getHostUuids().isEmpty()) { + updateGroupMembers(groupMemberTO); + } + }); } if (htos.isEmpty()) { @@ -661,7 +1001,51 @@ private void handle(RefreshSecurityGroupRulesOnVmMsg msg) { logger.debug(String.format("refreshed security group rule for vm[uuid:%s] vNicuuids[%s]", msg.getVmInstanceUuid(), Joiner.on(",").join(nicUuids))); - bus.reply(msg, reply); + } + + private void handle(RefreshSecurityGroupRulesOnVmMsg msg) { + RefreshSecurityGroupRulesOnVmReply reply = new RefreshSecurityGroupRulesOnVmReply(); + List nicUuids = msg.getNicUuids(); + if (nicUuids == null || nicUuids.isEmpty()) { + SimpleQuery q = dbf.createQuery(VmNicSecurityGroupRefVO.class); + q.select(VmNicSecurityGroupRefVO_.vmNicUuid); + q.add(VmNicSecurityGroupRefVO_.vmInstanceUuid, Op.EQ, msg.getVmInstanceUuid()); + nicUuids = q.listValue(); + } + + if (nicUuids.isEmpty()) { + checkDefaultRulesOnHost(msg.getHostUuid()); + logger.debug(String.format("no nic of vm[uuid:%s] needs to refresh security group rule", msg.getVmInstanceUuid())); + bus.reply(msg, reply); + return; + } + + List otherNicUuids = new ArrayList<>(); + Map> sdnNicUuidsMap = new HashMap<>(); + List vmNicVOS = Q.New(VmNicVO.class).in(VmNicVO_.uuid, nicUuids).list(); + for (VmNicVO nicvo : vmNicVOS) { + SecurityGroupSdnBackend backend = getSdnBackendFroL3Uuid(nicvo.getL3NetworkUuid()); + if (backend == null) { + otherNicUuids.add(nicvo.getUuid()); + } else { + sdnNicUuidsMap.computeIfAbsent(backend, k -> new ArrayList<>()); + sdnNicUuidsMap.get(backend).add(nicvo.getUuid()); + } + } + + refreshVmSecurityGroupRulesBySdn(sdnNicUuidsMap, msg, new Completion(new NopeCompletion()) { + @Override + public void success() { + refreshVmSecurityGroupRules(otherNicUuids, msg); + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); } private void createFailureHostTask(String huuid) { @@ -671,8 +1055,9 @@ private void createFailureHostTask(String huuid) { } private void handle(RefreshSecurityGroupRulesOnHostMsg msg) { + // this message is sent after host reconnected, sdn controller will not handle it RuleCalculator cal = new RuleCalculator(); - cal.hostUuids = asList(msg.getHostUuid()); + cal.hostUuids = Collections.singletonList(msg.getHostUuid()); // refreshing may happen when host is reconnecting; at that time VMs' states are Unknown cal.vmStates = asList(VmInstanceState.Unknown, VmInstanceState.Running); List htos = cal.calculate(); @@ -732,6 +1117,8 @@ private void handle(APIValidateSecurityGroupRuleMsg msg) { private void setVmNicSecurityGroup(APISetVmNicSecurityGroupMsg msg, Completion completion) { + VmNicVO nic = dbf.findByUuid(msg.getVmNicUuid(), VmNicVO.class); + SecurityGroupSdnBackend backend = getSdnBackendFroL3Uuid(nic.getL3NetworkUuid()); Map data = new HashMap(); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setData(data); @@ -748,10 +1135,7 @@ public void run(FlowTrigger trigger, Map data) { List toUpdate = new ArrayList<>(); List sgUuids = new ArrayList<>(); Map refMap = new HashMap<>(); - - VmNicVO nic = dbf.findByUuid(msg.getVmNicUuid(), VmNicVO.class); List refs = Q.New(VmNicSecurityGroupRefVO.class).eq(VmNicSecurityGroupRefVO_.vmNicUuid, msg.getVmNicUuid()).list(); - refs.forEach(ref -> { refMap.put(ref.getSecurityGroupUuid(), ref); }); @@ -802,6 +1186,7 @@ public void run(FlowTrigger trigger, Map data) { } data.put(SecurityGroupConstant.Param.SECURITY_GROUP_UUIDS, sgUuids); + data.put(SecurityGroupConstant.Param.SECURITY_GROUP_REFS, toDelete); trigger.next(); } @@ -810,6 +1195,11 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "apply-rules-on-hosts"; + @Override + public boolean skip(Map data) { + return backend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { RuleCalculator cal = new RuleCalculator(); @@ -824,6 +1214,11 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "update-group-members"; + @Override + public boolean skip(Map data) { + return backend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { List sgUuids = (List)data.get(SecurityGroupConstant.Param.SECURITY_GROUP_UUIDS); @@ -842,6 +1237,32 @@ public void run(FlowTrigger trigger, Map data) { } }); + flow(new NoRollbackFlow() { + String __name__ = "update-sdn-controller"; + + @Override + public boolean skip(Map data) { + return backend == null; + } + + @Override + public void run(FlowTrigger trigger, Map data) { + List toDelete = (List) data.get(SecurityGroupConstant.Param.SECURITY_GROUP_REFS); + List sgUuids = toDelete.stream().map(VmNicSecurityGroupRefVO::getSecurityGroupUuid).distinct().collect(Collectors.toList()); + sdnRemoveSecurityGroupFromVmNic(backend, sgUuids, Collections.singletonList(msg.getVmNicUuid()), new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { @@ -896,6 +1317,7 @@ public String getName() { } private void doChangeSecurityGroupRuleState(APIChangeSecurityGroupRuleStateMsg msg, Completion completion) { + SecurityGroupSdnBackend sdnBackend = getSdnBackend(msg.getSecurityGroupUuid()); Map data = new HashMap(); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setData(data); @@ -925,6 +1347,11 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "apply-rules-on-hosts"; + @Override + public boolean skip(Map data) { + return sdnBackend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { RuleCalculator cal = new RuleCalculator(); @@ -936,6 +1363,31 @@ public void run(FlowTrigger trigger, Map data) { } }); + flow(new NoRollbackFlow() { + String __name__ = "apply-rules-on-hosts"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (sdnBackend == null) { + trigger.next(); + return; + } + + sdnRefreshSecurityGroup(sdnBackend, msg.getSecurityGroupUuid(), + new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { @@ -1011,16 +1463,37 @@ private void handle(APIChangeVmNicSecurityPolicyMsg msg) { } pvo = dbf.updateAndRefresh(pvo); - RuleCalculator cal = new RuleCalculator(); - cal.vmNicUuids = asList(msg.getVmNicUuid()); - List htos = cal.calculate(); - applyRules(htos); + VmNicSecurityPolicyInventory pinv = VmNicSecurityPolicyInventory.valueOf(pvo); + VmNicVO nicVO = dbf.findByUuid(msg.getVmNicUuid(), VmNicVO.class); + SecurityGroupSdnBackend backend = getSdnBackendFroL3Uuid(nicVO.getL3NetworkUuid()); + if (backend == null) { + RuleCalculator cal = new RuleCalculator(); + cal.vmNicUuids = asList(msg.getVmNicUuid()); + List htos = cal.calculate(); + applyRules(htos); - evt.setInventory(VmNicSecurityPolicyInventory.valueOf(pvo)); - bus.publish(evt); + evt.setInventory(pinv); + bus.publish(evt); + return; + } + + sdnRefreshVmNicsDefaultRule(backend, Collections.singletonList(msg.getVmNicUuid()), new Completion(msg) { + @Override + public void success() { + evt.setInventory(pinv); + bus.publish(evt); + } + + @Override + public void fail(ErrorCode errorCode) { + evt.setError(errorCode); + bus.publish(evt); + } + }); } private void doUpdateSecurityGroupRulePriority(APIUpdateSecurityGroupRulePriorityMsg msg, Completion completion) { + SecurityGroupSdnBackend sdnBackend = getSdnBackend(msg.getSecurityGroupUuid()); Map data = new HashMap(); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setData(data); @@ -1061,6 +1534,11 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "apply-rules-on-hosts"; + @Override + public boolean skip(Map data) { + return sdnBackend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { RuleCalculator cal = new RuleCalculator(); @@ -1073,6 +1551,31 @@ public void run(FlowTrigger trigger, Map data) { } }); + flow(new NoRollbackFlow() { + String __name__ = "apply-rules-on-sdn-controller"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (sdnBackend == null) { + trigger.next(); + return; + } + + sdnRefreshSecurityGroup(sdnBackend, msg.getSecurityGroupUuid(), + new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { @@ -1165,6 +1668,7 @@ public String getName() { } private void doChangeSecurityGroupRule(APIChangeSecurityGroupRuleMsg msg, String sgUuid, Completion completion) { + SecurityGroupSdnBackend sdnBackend = getSdnBackend(sgUuid); Map data = new HashMap(); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setData(data); @@ -1227,6 +1731,11 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "apply-rules-on-hosts"; + @Override + public boolean skip(Map data) { + return sdnBackend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { RuleCalculator cal = new RuleCalculator(); @@ -1238,6 +1747,30 @@ public void run(FlowTrigger trigger, Map data) { } }); + flow(new NoRollbackFlow() { + String __name__ = "apply-rules-on-sdn-controller"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (sdnBackend == null) { + trigger.next(); + return; + } + + sdnRefreshSecurityGroup(sdnBackend, sgUuid, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { @@ -1277,22 +1810,31 @@ private void handle(APIUpdateSecurityGroupMsg msg) { @Transactional(readOnly = true) private List getCandidateVmNic(String sgId, String accountUuid) { + SecurityGroupSdnBackend sdnBackend = getSdnBackend(sgId); + if (sdnBackend != null) { + return sdnBackend.getCandidateVmNic(sgId, accountUuid); + } + List nicUuidsToInclude = acntMgr.getResourceUuidsCanAccessByAccount(accountUuid, VmNicVO.class); if (nicUuidsToInclude != null && nicUuidsToInclude.isEmpty()) { return new ArrayList(); } - List nicUuidsToExclued = Q.New(VmNicSecurityGroupRefVO.class).select(VmNicSecurityGroupRefVO_.vmNicUuid).eq(VmNicSecurityGroupRefVO_.securityGroupUuid, sgId).listValues(); + List nicUuidsToExclued = Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.vmNicUuid) + .eq(VmNicSecurityGroupRefVO_.securityGroupUuid, sgId) + .listValues(); List candidateNics = new ArrayList<>(); List allNics = SQL.New("select nic from VmNicVO nic, VmInstanceVO vm" + - " where nic.vmInstanceUuid = vm.uuid" + - " and vm.type = :vmType" + - " and vm.state in (:vmStates)", VmNicVO.class) + " where nic.vmInstanceUuid = vm.uuid" + + " and nic.type = :nicType " + + " and vm.type = :vmType" + + " and vm.state in (:vmStates)", VmNicVO.class) + .param("nicType", VmInstanceConstant.VIRTUAL_NIC_TYPE) .param("vmType", VmInstanceConstant.USER_VM_TYPE) .param("vmStates", list(VmInstanceState.Running, VmInstanceState.Stopped)) .list(); - if (allNics.isEmpty()) { return allNics; } @@ -1417,14 +1959,59 @@ public String getName() { } private void handle(APIChangeSecurityGroupStateMsg msg) { + APIChangeSecurityGroupStateEvent evt = new APIChangeSecurityGroupStateEvent(msg.getId()); SecurityGroupStateEvent sevt = SecurityGroupStateEvent.valueOf(msg.getStateEvent()); SecurityGroupVO vo = dbf.findByUuid(msg.getUuid(), SecurityGroupVO.class); + SecurityGroupState oldState = vo.getState(); SecurityGroupState sgState = SecurityGroupStateEvent.enable.equals(sevt) ? SecurityGroupState.Enabled : SecurityGroupState.Disabled; + if (oldState == sgState) { + evt.setInventory(SecurityGroupInventory.valueOf(vo)); + bus.publish(evt); + return; + } + vo.setState(sgState); vo = dbf.updateAndRefresh(vo); - List sgUuids = Q.New(SecurityGroupRuleVO.class).select(SecurityGroupRuleVO_.securityGroupUuid).eq(SecurityGroupRuleVO_.remoteSecurityGroupUuid, msg.getUuid()).listValues(); + final SecurityGroupVO finalVO = vo; + SecurityGroupSdnBackend sdnBackend = getSdnBackend(msg.getUuid()); + if (sdnBackend != null) { + List vmNicUuids = Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.vmNicUuid) + .eq(VmNicSecurityGroupRefVO_.securityGroupUuid, msg.getUuid()) + .listValues(); + if (vmNicUuids.isEmpty()) { + evt.setInventory(SecurityGroupInventory.valueOf(finalVO)); + bus.publish(evt); + return; + } + + List sgStates = new ArrayList<>(); + sgStates.add(SecurityGroupState.Enabled); + if (sgState == SecurityGroupState.Disabled) { + sgStates.add(SecurityGroupState.Disabled); + } + sdnRefreshVmNics(sdnBackend, vmNicUuids, new Completion(msg) { + @Override + public void success() { + evt.setInventory(SecurityGroupInventory.valueOf(finalVO)); + bus.publish(evt); + } + + @Override + public void fail(ErrorCode errorCode) { + finalVO.setState(oldState); + dbf.persist(finalVO); + evt.setError(errorCode); + bus.publish(evt); + } + }); + return; + } + + List sgUuids = Q.New(SecurityGroupRuleVO.class).select(SecurityGroupRuleVO_.securityGroupUuid) + .eq(SecurityGroupRuleVO_.remoteSecurityGroupUuid, msg.getUuid()).listValues(); sgUuids.add(msg.getUuid()); sgUuids = sgUuids.stream().distinct().collect(Collectors.toList()); RuleCalculator cal = new RuleCalculator(); @@ -1441,7 +2028,6 @@ private void handle(APIChangeSecurityGroupStateMsg msg) { updateGroupMembers(groupMemberTO); } - APIChangeSecurityGroupStateEvent evt = new APIChangeSecurityGroupStateEvent(msg.getId()); evt.setInventory(SecurityGroupInventory.valueOf(vo)); bus.publish(evt); } @@ -1468,6 +2054,7 @@ public void run(SyncTaskChain chain) { ref.setSecurityGroupUuid(msg.getSecurityGroupUuid()); dbf.persist(ref); } + SecurityGroupVO sgvo = dbf.findByUuid(msg.getSecurityGroupUuid(), SecurityGroupVO.class); SecurityGroupInventory sginv = SecurityGroupInventory.valueOf(sgvo); evt.setInventory(sginv); @@ -1483,6 +2070,7 @@ public String getName() { } private void removeNicFromSecurityGroup(String sgUuid, List vmNicUuids, Completion completion) { + SecurityGroupSdnBackend backend = getSdnBackend(sgUuid); Map data = new HashMap(); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setData(data); @@ -1521,6 +2109,12 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "apply-rules-on-hosts"; + + @Override + public boolean skip(Map data) { + return backend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { RuleCalculator cal = new RuleCalculator(); @@ -1534,6 +2128,12 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "update-group-numbers"; + + @Override + public boolean skip(Map data) { + return backend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { RuleCalculator cal = new RuleCalculator(); @@ -1549,6 +2149,35 @@ public void run(FlowTrigger trigger, Map data) { } }); + flow(new NoRollbackFlow() { + String __name__ = "update-sdn-controller"; + + @Override + public boolean skip(Map data) { + return backend == null; + } + + @Override + public void run(FlowTrigger trigger, Map data) { + if (backend == null || vmNicUuids.isEmpty()) { + trigger.next(); + return; + } + + sdnRemoveSecurityGroupFromVmNic(backend, Collections.singletonList(sgUuid), vmNicUuids, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { @@ -1602,7 +2231,118 @@ public String getName() { }); } + private List updateRelatedSecurityGroupRules(String sgUuid) { + List rules = Q.New(SecurityGroupRuleVO.class) + .eq(SecurityGroupRuleVO_.remoteSecurityGroupUuid, sgUuid) + .notEq(SecurityGroupRuleVO_.securityGroupUuid, sgUuid).list(); + if (rules.isEmpty()) { + return new ArrayList<>(); + } + + Map> toDelete = new HashMap<>(); + rules.forEach(r -> { + toDelete.computeIfAbsent(r.getSecurityGroupUuid(), k -> new ArrayList<>()); + toDelete.get(r.getSecurityGroupUuid()).add(r.getUuid()); + }); + + for (Map.Entry> entry : toDelete.entrySet()) { + doDeleteSecurityGroupRule(entry.getKey(), entry.getValue()); + } + + return new ArrayList<>(toDelete.keySet()); + } + + private void deleteSecurityGroupFromSdn(SecurityGroupSdnBackend backend, String sgUuid, Completion completion) { + Map data = new HashMap(); + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("sdn-backend-delete-security-group-%s", sgUuid)); + chain.setData(data); + chain.then(new NoRollbackFlow() { + String __name__ = "update-security-group-db"; + + @Override + public void run(FlowTrigger trigger, Map data) { + // step 1, update vmnic + VmNicSecurityGroupTo delNicTo = new VmNicSecurityGroupTo(); + List vmNicUuids = Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.vmNicUuid) + .eq(VmNicSecurityGroupRefVO_.securityGroupUuid, sgUuid).listValues(); + if (!vmNicUuids.isEmpty()) { + //step 1.1, delete vmnic <--> security group ref + SQL.New(VmNicSecurityGroupRefVO.class) + .eq(VmNicSecurityGroupRefVO_.securityGroupUuid, sgUuid) + .in(VmNicSecurityGroupRefVO_.vmNicUuid, vmNicUuids).delete(); + + //step 1.2, update remain security group priority + for (String uuid : vmNicUuids) { + List refs = Q.New(VmNicSecurityGroupRefVO.class) + .eq(VmNicSecurityGroupRefVO_.vmNicUuid, uuid) + .orderBy(VmNicSecurityGroupRefVO_.priority, SimpleQuery.Od.ASC).list(); + if (!refs.isEmpty()) { + refs.forEach(ref ->{ + ref.setPriority(refs.indexOf(ref) + 1); + }); + dbf.updateCollection(refs); + } + } + } + + // step 2, update related security group + List relatedSgUuids = updateRelatedSecurityGroupRules(sgUuid); + if (!relatedSgUuids.isEmpty()) { + vmNicUuids.addAll(Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.vmNicUuid) + .in(VmNicSecurityGroupRefVO_.securityGroupUuid, relatedSgUuids) + .listValues()); + } + vmNicUuids = vmNicUuids.stream().distinct().collect(Collectors.toList()); + + data.put(VM_NIC_UUIDS, vmNicUuids); + + trigger.next(); + } + }).then(new NoRollbackFlow() { + String __name__ = "delete-from-sdn"; + + @Override + public void run(FlowTrigger trigger, Map data) { + List vmNicUuids = (List) data.get(VM_NIC_UUIDS); + sdnDeleteSecurityGroup(backend, vmNicUuids, sgUuid, new Completion(trigger) { + @Override + public void success() { + // step 3, remove security group + SQL.New(SecurityGroupVO.class).eq(SecurityGroupVO_.uuid, sgUuid).delete(); + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + // step 3, remove security group + SQL.New(SecurityGroupVO.class).eq(SecurityGroupVO_.uuid, sgUuid).delete(); + trigger.fail(errorCode); + } + }); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); + } + private void deleteSecurityGroup(String sgUuid, Completion completion) { + SecurityGroupSdnBackend backend = getSdnBackend(sgUuid); + if (backend != null) { + deleteSecurityGroupFromSdn(backend, sgUuid, completion); + return; + } + Map data = new HashMap(); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setData(data); @@ -1612,6 +2352,7 @@ public void setup() { flow(new NoRollbackFlow() { String __name__ = "dettach-nic-from-security-group-in-db"; + // this flow will refresh vmnic attached by current sg: sgUuid @Override public void run(FlowTrigger trigger, Map data) { List attachedNicUuids = Q.New(VmNicSecurityGroupRefVO.class).select(VmNicSecurityGroupRefVO_.vmNicUuid).eq(VmNicSecurityGroupRefVO_.securityGroupUuid, sgUuid).listValues(); @@ -1636,9 +2377,16 @@ public void run(MessageReply reply) { flow(new NoRollbackFlow() { String __name__ = "delete-all-associated-security-group-rules-in-db"; + // this flow will find other sgs related to current sg by SecurityGroupRuleVO_.remoteSecurityGroupUuid + // action: 1. delete related rules + // 2. re-calculate the remain rules priority + // 3. find the vmnics related to the other sgs + @Override public void run(FlowTrigger trigger, Map data) { - List rules = Q.New(SecurityGroupRuleVO.class).eq(SecurityGroupRuleVO_.remoteSecurityGroupUuid, sgUuid).notEq(SecurityGroupRuleVO_.securityGroupUuid, sgUuid).list(); + List rules = Q.New(SecurityGroupRuleVO.class) + .eq(SecurityGroupRuleVO_.remoteSecurityGroupUuid, sgUuid) + .notEq(SecurityGroupRuleVO_.securityGroupUuid, sgUuid).list(); if (rules.isEmpty()) { dbf.removeByPrimaryKey(sgUuid, SecurityGroupVO.class); trigger.next(); @@ -1646,7 +2394,7 @@ public void run(FlowTrigger trigger, Map data) { } Map> toDelete = new HashMap<>(); - rules.stream().forEach(r -> { + rules.forEach(r -> { if (!toDelete.containsKey(r.getSecurityGroupUuid())) { toDelete.put(r.getSecurityGroupUuid(), new ArrayList()); } @@ -1660,10 +2408,9 @@ public void run(FlowTrigger trigger, Map data) { otherNicUuids.addAll(nicUuids); doDeleteSecurityGroupRule(entry.getKey(), entry.getValue()); } - dbf.removeByPrimaryKey(sgUuid, SecurityGroupVO.class); - data.put(SecurityGroupConstant.Param.VM_NIC_UUIDS, otherNicUuids); + data.put(VM_NIC_UUIDS, otherNicUuids); trigger.next(); } @@ -1671,9 +2418,12 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "apply-rules-on-hosts"; + + // this flow will refresh the other nic found by previous flow + @Override public void run(FlowTrigger trigger, Map data) { - List vmNicUuids = (List)data.getOrDefault(SecurityGroupConstant.Param.VM_NIC_UUIDS, new ArrayList<>()); + List vmNicUuids = (List)data.getOrDefault(VM_NIC_UUIDS, new ArrayList<>()); if (!vmNicUuids.isEmpty()) { RuleCalculator cal = new RuleCalculator(); cal.vmNicUuids = vmNicUuids; @@ -1706,36 +2456,74 @@ public void handle(ErrorCode errCode, Map data) { private void handle(APIDeleteSecurityGroupMsg msg) { APIDeleteSecurityGroupEvent evt = new APIDeleteSecurityGroupEvent(msg.getId()); - thdf.chainSubmit(new ChainTask(msg) { - @Override - public String getSyncSignature() { - return getSecurityGroupSyncThreadName(msg.getUuid()); - } + final String issuer = SecurityGroupVO.class.getSimpleName(); + SecurityGroupInventory inv = SecurityGroupInventory.valueOf(dbf.findByUuid(msg.getSecurityGroupUuid(), SecurityGroupVO.class)); + final List ctx = Collections.singletonList(inv); + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("delete-security-group-%s", msg.getUuid())); + if (msg.getDeletionMode() == APIDeleteMessage.DeletionMode.Permissive) { + chain.then(new NoRollbackFlow() { + @Override + public void run(final FlowTrigger trigger, Map data) { + casf.asyncCascade(CascadeConstant.DELETION_CHECK_CODE, issuer, ctx, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } - @Override - public void run(SyncTaskChain chain) { - deleteSecurityGroup(msg.getUuid(), new Completion(msg, chain) { - @Override - public void success() { - logger.debug(String.format("successfully deleted security group[uuid:%s]", msg.getUuid())); - bus.publish(evt); - chain.next(); - } + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }).then(new NoRollbackFlow() { + @Override + public void run(final FlowTrigger trigger, Map data) { + casf.asyncCascade(CascadeConstant.DELETION_DELETE_CODE, issuer, ctx, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } - @Override - public void fail(ErrorCode errorCode) { - evt.setError(errorCode); - bus.publish(evt); - chain.next(); - } - }); - } + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + } else { + chain.then(new NoRollbackFlow() { + @Override + public void run(final FlowTrigger trigger, Map data) { + casf.asyncCascade(CascadeConstant.DELETION_FORCE_DELETE_CODE, issuer, ctx, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + } + chain.done(new FlowDoneHandler(msg) { @Override - public String getName() { - return String.format("delete-security-group-%s", msg.getUuid()); + public void handle(Map data) { + casf.asyncCascadeFull(CascadeConstant.DELETION_CLEANUP_CODE, issuer, ctx, new NopeCompletion()); + bus.publish(evt); } - }); + }).error(new FlowErrorHandler(msg) { + @Override + public void handle(ErrorCode errCode, Map data) { + evt.setError(errCode); + bus.publish(evt); + } + }).start(); } private void handle(APIDeleteSecurityGroupRuleMsg msg) { @@ -1824,6 +2612,7 @@ private void doDeleteSecurityGroupRule(String sgUuid, List ruleUuids) { } private void deleteSecurityGroupRule(APIDeleteSecurityGroupRuleMsg msg, String sgUuid, Completion completion) { + SecurityGroupSdnBackend sdnBackend = getSdnBackend(sgUuid); Map data = new HashMap(); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setData(data); @@ -1842,6 +2631,12 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "apply-rules-on-hosts"; + + @Override + public boolean skip(Map data) { + return sdnBackend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { SecurityGroupVO sgvo = dbf.findByUuid(sgUuid, SecurityGroupVO.class); @@ -1857,6 +2652,30 @@ public void run(FlowTrigger trigger, Map data) { } }); + flow(new NoRollbackFlow() { + String __name__ = "apply-rules-on-sdn-controller"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (sdnBackend == null) { + trigger.next(); + return; + } + + sdnRefreshSecurityGroup(sdnBackend, sgUuid, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { @@ -1880,7 +2699,7 @@ private void validate(AddVmNicToSecurityGroupMsg msg) { .select(VmNicVO_.uuid) .in(VmNicVO_.uuid, msg.getVmNicUuids()) .listValues(); - if (!uuids.containsAll(msg.getVmNicUuids())) { + if (!new HashSet<>(uuids).containsAll(msg.getVmNicUuids())) { msg.getVmNicUuids().removeAll(uuids); throw new OperationFailureException(err(SysErrors.RESOURCE_NOT_FOUND, "cannot find vm nics[uuids:%s]", msg.getVmNicUuids() @@ -1968,6 +2787,7 @@ private void doAddVmNicToSecurityGroup(String sgUuid, List vmNicUuids) { } private void addVmNicToSecurityGroup(String sgUuid, List vmNicUuids, Completion completion) { + SecurityGroupSdnBackend sdnBackend = getSdnBackend(sgUuid); Map data = new HashMap(); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setData(data); @@ -1987,6 +2807,12 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "apply-rules-on-hosts"; + + @Override + public boolean skip(Map data) { + return sdnBackend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { RuleCalculator cal = new RuleCalculator(); @@ -2000,6 +2826,12 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "update-group-numbers"; + + @Override + public boolean skip(Map data) { + return sdnBackend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { RuleCalculator cal = new RuleCalculator(); @@ -2015,6 +2847,30 @@ public void run(FlowTrigger trigger, Map data) { } }); + flow(new NoRollbackFlow() { + String __name__ = "apply-rules-on-sdn-controller"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (sdnBackend == null) { + trigger.next(); + return; + } + + sdnRefreshVmNics(sdnBackend, vmNicUuids, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { @@ -2201,6 +3057,7 @@ public String getName() { } private void doAddSecurityGroupRule(AddSecurityGroupRuleMessage msg, Completion completion) { + SecurityGroupSdnBackend sdnBackend = getSdnBackend(msg.getSecurityGroupUuid()); Map data = new HashMap(); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setData(data); @@ -2278,6 +3135,11 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "apply-rules-on-hosts"; + @Override + public boolean skip(Map data) { + return sdnBackend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { RuleCalculator cal = new RuleCalculator(); @@ -2289,6 +3151,30 @@ public void run(FlowTrigger trigger, Map data) { } }); + flow(new NoRollbackFlow() { + String __name__ = "apply-rules-on-sdn-controller"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (sdnBackend == null) { + trigger.next(); + return; + } + + sdnRefreshSecurityGroup(sdnBackend, msg.getSecurityGroupUuid(), new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { @@ -2308,6 +3194,8 @@ public void handle(ErrorCode errCode, Map data) { } private void handle(APICreateSecurityGroupMsg msg) { + APICreateSecurityGroupEvent evt = new APICreateSecurityGroupEvent(msg.getId()); + SecurityGroupVO vo = new SecurityGroupVO(); if (msg.getResourceUuid() != null) { vo.setUuid(msg.getResourceUuid()); @@ -2317,6 +3205,7 @@ private void handle(APICreateSecurityGroupMsg msg) { vo.setName(msg.getName()); vo.setDescription(msg.getDescription()); vo.setState(SecurityGroupState.Enabled); + vo.setvSwitchType(msg.getvSwitchType()); vo.setInternalId(dbf.generateSequenceNumber(SecurityGroupSequenceNumberVO.class)); vo.setAccountUuid(msg.getSession().getAccountUuid()); @@ -2336,10 +3225,28 @@ protected SecurityGroupVO scripts() { vo = dbf.reload(vo); SecurityGroupInventory inv = SecurityGroupInventory.valueOf(vo); - APICreateSecurityGroupEvent evt = new APICreateSecurityGroupEvent(msg.getId()); - evt.setInventory(inv); - logger.debug(String.format("successfully created security group[uuid:%s, name:%s]", vo.getUuid(), vo.getName())); - bus.publish(evt); + SecurityGroupSdnBackend sdnBackend = getSdnBackend(vo.getUuid()); + if (sdnBackend == null) { + evt.setInventory(inv); + logger.debug(String.format("successfully created security group[uuid:%s, name:%s]", vo.getUuid(), vo.getName())); + bus.publish(evt); + return; + } + + sdnBackend.createSecurityGroup(inv, new Completion(msg) { + @Override + public void success() { + evt.setInventory(inv); + logger.debug(String.format("successfully created security group[uuid:%s, name:%s]", inv.getUuid(), inv.getName())); + bus.publish(evt); + } + + @Override + public void fail(ErrorCode errorCode) { + evt.setError(errorCode); + bus.publish(evt); + } + }); } public String getId() { @@ -2458,9 +3365,20 @@ public void afterMigrateVm(final VmInstanceInventory inv, final String srcHostUu cal.vmNicUuids = CollectionUtils.transformToList(inv.getVmNics(), new Function() { @Override public String call(VmNicInventory arg) { - return arg.getUuid(); + // security group for ovn network does not care vm migration + String vswitchType = L3NetworkHelper.getL3networkVSwitchType(arg.getL3NetworkUuid()); + if (VSwitchType.valueOf(vswitchType).isAttachToCluster()) { + return arg.getUuid(); + } else { + return null; + } } }); + + if (cal.vmNicUuids.isEmpty()) { + return; + } + // if migrate vm with Storage,the vm stat is migrating cal.vmStates = asList(VmInstanceState.Running, VmInstanceState.Migrating); List htos = cal.calculate(); @@ -2498,9 +3416,19 @@ public void failedToMigrateVm(final VmInstanceInventory inv, final String destHo cal.vmNicUuids = CollectionUtils.transformToList(inv.getVmNics(), new Function() { @Override public String call(VmNicInventory arg) { - return arg.getUuid(); + // security group for ovn network does not care vm migration + String vswitchType = L3NetworkHelper.getL3networkVSwitchType(arg.getL3NetworkUuid()); + if (VSwitchType.valueOf(vswitchType).isAttachToCluster()) { + return arg.getUuid(); + } else { + return null; + } } }); + if (cal.vmNicUuids.isEmpty()) { + return; + } + cal.vmStates = asList(VmInstanceState.Unknown); List htos = cal.calculate(); @@ -2623,4 +3551,79 @@ public String getName() { return FailureHostWorker.class.getName(); } } + + private SecurityGroupSdnBackend getSdnBackend(String sgUuid) { + String sdnControllerUuid = SecurityGroupHelper.getSdnControllerUuid(sgUuid); + if (sdnControllerUuid == null) { + return null; + } + + for (SecurityGroupGetSdnBackendExtensionPoint exp : pluginRgty.getExtensionList(SecurityGroupGetSdnBackendExtensionPoint.class)) { + SecurityGroupSdnBackend backend = exp.getSecurityGroupSdnBackend(sdnControllerUuid); + if (backend != null) { + return backend; + } + } + + throw new CloudRuntimeException(String.format("can not find security backend for sdn controller[uuid:%s]", sdnControllerUuid)); + } + + private SecurityGroupSdnBackend getSdnBackendFroL3Uuid(String l3Uuid) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(l3Uuid); + if (sdnControllerUuid == null) { + return null; + } + + for (SecurityGroupGetSdnBackendExtensionPoint exp : pluginRgty.getExtensionList(SecurityGroupGetSdnBackendExtensionPoint.class)) { + SecurityGroupSdnBackend backend = exp.getSecurityGroupSdnBackend(sdnControllerUuid); + if (backend != null) { + return backend; + } + } + + return null; + } + + @Override + public void deleteNetworkServiceOfSdnController(String sdnControllerUuid, Completion completion) { + List sgUuids = Q.New(SecurityGroupVO.class) + .select(SecurityGroupVO_.uuid).listValues(); + if (sgUuids.isEmpty()) { + completion.success(); + return; + } + + List sdnSgUuids = new ArrayList<>(); + for (String uuid : sgUuids) { + String controllerUuid = SecurityGroupHelper.getSdnControllerUuid(uuid); + if (sdnControllerUuid.equals(controllerUuid)) { + sdnSgUuids.add(uuid); + } + } + if (sdnControllerUuid.isEmpty()) { + completion.success(); + return; + } + + new While<>(sdnSgUuids).step((uuid, wcomp) -> { + SecurityGroupDeletionMsg msg = new SecurityGroupDeletionMsg(); + msg.setUuid(uuid); + bus.makeTargetServiceIdByResourceUuid(msg, SecurityGroupConstant.SERVICE_ID, uuid); + bus.send(msg, new CloudBusCallBack(wcomp) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.warn(String.format("failed to security group [uuid:%s], %s", msg.getUuid(), reply.getError())); + } + + wcomp.done(); + } + }); + }, 10).run(new WhileDoneCompletion(completion) { + @Override + public void done(ErrorCodeList errorCodeList) { + completion.success(); + } + }); + } } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupNetworkServiceExtension.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupNetworkServiceExtension.java index f0bea6d0b72..a791b3d76f5 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupNetworkServiceExtension.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupNetworkServiceExtension.java @@ -129,6 +129,7 @@ public void applyNetworkService(VmInstanceSpec servedVm, Map dat msg.setVmInstanceUuid(servedVm.getVmInventory().getUuid()); msg.setHostUuid(servedVm.getDestHost().getUuid()); msg.setSgUuids(sgUuids); + msg.setOperation(servedVm.getCurrentVmOperation()); bus.makeLocalServiceId(msg, SecurityGroupConstant.SERVICE_ID); bus.send(msg, new CloudBusCallBack(completion) { @Override @@ -157,6 +158,7 @@ public void releaseNetworkService(final VmInstanceSpec servedVm, Map q = dbf.createQuery(NetworkServiceProviderVO.class); q.add(NetworkServiceProviderVO_.type, Op.EQ, SecurityGroupConstant.SECURITY_GROUP_PROVIDER_TYPE); diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupSdnBackend.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupSdnBackend.java new file mode 100644 index 00000000000..c134674f9a9 --- /dev/null +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupSdnBackend.java @@ -0,0 +1,14 @@ +package org.zstack.network.securitygroup; + +import org.zstack.header.core.Completion; +import org.zstack.header.vm.VmNicVO; + +import java.util.List; + +public interface SecurityGroupSdnBackend { + void createSecurityGroup(SecurityGroupInventory sg, Completion completion); + + void updateSecurityGroup(VmNicSecurityGroupTo to, Completion completion); + + List getCandidateVmNic(String sgId, String accountUuid); +} diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupSystemTags.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupSystemTags.java new file mode 100644 index 00000000000..a15583881c2 --- /dev/null +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupSystemTags.java @@ -0,0 +1,11 @@ +package org.zstack.network.securitygroup; + +import org.zstack.header.tag.TagDefinition; +import org.zstack.tag.PatternedSystemTag; + +@TagDefinition +public class SecurityGroupSystemTags { + public static String SDN_CONTROLLER_UUID_TOKEN = "SdnControllerUuid"; + public static PatternedSystemTag SDN_CONTROLLER_UUID = new PatternedSystemTag( + String.format("SdnControllerUuid::{%s}", SDN_CONTROLLER_UUID_TOKEN), SecurityGroupVO.class); +} diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupTo.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupTo.java new file mode 100644 index 00000000000..fec19f6bf09 --- /dev/null +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupTo.java @@ -0,0 +1,63 @@ +package org.zstack.network.securitygroup; + +import java.util.ArrayList; +import java.util.List; + +public class SecurityGroupTo { + public static final String ACTION_CODE_APPLY_CHAIN = "applyChain"; + public static final String ACTION_CODE_DELETE_CHAIN = "deleteChain"; + private String securityGroupUuid; + private String securityGroupName; + private List securityGroupVmIps = new ArrayList<>(); + private List securityGroupVmIp6s = new ArrayList<>(); + private String actionCode; + private List rules = new ArrayList<>(); + + public String getSecurityGroupUuid() { + return securityGroupUuid; + } + + public void setSecurityGroupUuid(String securityGroupUuid) { + this.securityGroupUuid = securityGroupUuid; + } + + public String getSecurityGroupName() { + return securityGroupName; + } + + public void setSecurityGroupName(String securityGroupName) { + this.securityGroupName = securityGroupName; + } + + public List getSecurityGroupVmIps() { + return securityGroupVmIps; + } + + public void setSecurityGroupVmIps(List securityGroupVmIps) { + this.securityGroupVmIps = securityGroupVmIps; + } + + public List getSecurityGroupVmIp6s() { + return securityGroupVmIp6s; + } + + public void setSecurityGroupVmIp6s(List securityGroupVmIp6s) { + this.securityGroupVmIp6s = securityGroupVmIp6s; + } + + public String getActionCode() { + return actionCode; + } + + public void setActionCode(String actionCode) { + this.actionCode = actionCode; + } + + public List getRules() { + return rules; + } + + public void setRules(List rules) { + this.rules = rules; + } +} diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupVO.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupVO.java index ba7ebc473ab..cb5fa5fcbc1 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupVO.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupVO.java @@ -2,7 +2,6 @@ import org.zstack.header.identity.OwnedByAccount; import org.zstack.header.vo.BaseResource; -import org.zstack.header.vo.EntityGraph; import org.zstack.header.vo.Index; import org.zstack.header.vo.ResourceVO; @@ -33,6 +32,9 @@ public class SecurityGroupVO extends ResourceVO implements OwnedByAccount { @Deprecated private Integer ipVersion; + @Column + private String vSwitchType; + @Column private Timestamp createDate; @@ -138,4 +140,12 @@ public Integer getIpVersion() { public void setIpVersion(Integer ipVersion) { this.ipVersion = ipVersion; } + + public String getvSwitchType() { + return vSwitchType; + } + + public void setvSwitchType(String vSwitchType) { + this.vSwitchType = vSwitchType; + } } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupVO_.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupVO_.java index 98cf7f31abe..18072ff7279 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupVO_.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupVO_.java @@ -13,6 +13,7 @@ public class SecurityGroupVO_ extends ResourceVO_ { public static volatile SingularAttribute state; public static volatile SingularAttribute internalId; public static volatile SingularAttribute ipVersion; + public static volatile SingularAttribute vSwitchType; public static volatile SingularAttribute createDate; public static volatile SingularAttribute lastOpDate; } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/VmNicSecurityGroupTo.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/VmNicSecurityGroupTo.java new file mode 100644 index 00000000000..18e716a20c4 --- /dev/null +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/VmNicSecurityGroupTo.java @@ -0,0 +1,25 @@ +package org.zstack.network.securitygroup; + +import java.util.ArrayList; +import java.util.List; + +public class VmNicSecurityGroupTo { + List vmNics = new ArrayList<>(); + List groups = new ArrayList<>(); + + public List getVmNics() { + return vmNics; + } + + public void setVmNics(List vmNics) { + this.vmNics = vmNics; + } + + public List getGroups() { + return groups; + } + + public void setGroups(List groups) { + this.groups = groups; + } +} diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/VmNicSecurityTO.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/VmNicSecurityTO.java index c5b2c4514cd..16cd5279e82 100644 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/VmNicSecurityTO.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/VmNicSecurityTO.java @@ -16,6 +16,7 @@ public class VmNicSecurityTO { private String egressPolicy; private String actionCode = ACTION_CODE_APPLY_CHAIN; private Map securityGroupRefs; + private boolean sync = false; public VmNicSecurityTO() { securityGroupRefs = new HashMap(); @@ -85,4 +86,12 @@ public Map getSecurityGroupRefs() { public void setSecurityGroupRefs(Map securityGroupRefs) { this.securityGroupRefs = securityGroupRefs; } + + public boolean isSync() { + return sync; + } + + public void setSync(boolean sync) { + this.sync = sync; + } } diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnControllerFactory.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnControllerFactory.java index 2a8d6cc9a93..82071a47bb5 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnControllerFactory.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnControllerFactory.java @@ -1,5 +1,6 @@ package org.zstack.sugonSdnController.controller; +import org.zstack.network.securitygroup.SecurityGroupSdnBackend; import org.zstack.sdnController.SdnController; import org.zstack.sdnController.SdnControllerFactory; import org.zstack.sdnController.SdnControllerL2; @@ -23,4 +24,9 @@ public SdnController getSdnController(SdnControllerVO vo) { public SdnControllerL2 getSdnControllerL2(SdnControllerVO vo) { return new SugonSdnController(vo); } + + @Override + public SecurityGroupSdnBackend getSdnControllerSecurityGroup(SdnControllerVO vo) { + return null; + } } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java index b5ad6e50f9d..d90242b1b27 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java @@ -43,10 +43,7 @@ import org.zstack.header.message.Message; import org.zstack.header.message.MessageReply; import org.zstack.header.network.NetworkException; -import org.zstack.header.network.l2.APICreateL2NetworkMsg; -import org.zstack.header.network.l2.L2NetworkConstant; -import org.zstack.header.network.l2.L2NetworkCreateExtensionPoint; -import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.network.l2.*; import org.zstack.header.network.l3.*; import org.zstack.header.network.service.*; import org.zstack.header.query.AddExpandedQueryExtensionPoint; @@ -903,6 +900,11 @@ public void afterCreateL2Network(L2NetworkInventory l2Network) { if (!supportedL2NetworkTypes.contains(l2Network.getType())) { return; } + + VSwitchType vSwitchType = VSwitchType.valueOf(l2Network.getvSwitchType()); + if (vSwitchType.getSdnControllerType() != null) { + return; + } NetworkServiceProviderVO vo = getRouterVO(); NetworkServiceProvider router = providerFactory.getNetworkServiceProvider(vo); @@ -2498,7 +2500,7 @@ public void callBack(String vrUuid, VirtualRouterHaTask task, Completion complet @Override public void afterAddIpRange(IpRangeInventory ipr, List systemTags) { - if (ipr.getIpRangeType() != IpRangeType.Normal) { + if (!Q.New(NormalIpRangeVO.class).eq(NormalIpRangeVO_.uuid, ipr.getUuid()).isExists()) { return; } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterVipVO.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterVipVO.java index a8c62810ab6..c97ade5bd28 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterVipVO.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterVipVO.java @@ -30,6 +30,8 @@ public class VirtualRouterVipVO { @ForeignKey(parentEntityClass = VipVO.class, onDeleteAction = ReferenceOption.RESTRICT) private String uuid; + + @Column @ForeignKey(parentEntityClass = VmInstanceEO.class, onDeleteAction = ReferenceOption.CASCADE) private String virtualRouterVmUuid; diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosVmBaseFactory.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosVmBaseFactory.java index 002dec3936d..28f0afe9581 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosVmBaseFactory.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosVmBaseFactory.java @@ -8,6 +8,7 @@ import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.config.GlobalConfigException; import org.zstack.core.config.GlobalConfigValidatorExtensionPoint; +import org.zstack.header.network.l2.*; import org.zstack.network.service.virtualrouter.VirtualRouterConstant; import org.zstack.resourceconfig.ResourceConfigFacade; import org.zstack.core.db.DatabaseFacade; @@ -19,10 +20,6 @@ import org.zstack.header.core.workflow.FlowChain; import org.zstack.header.managementnode.PrepareDbInitialValueExtensionPoint; import org.zstack.header.network.NetworkException; -import org.zstack.header.network.l2.APICreateL2NetworkMsg; -import org.zstack.header.network.l2.L2NetworkConstant; -import org.zstack.header.network.l2.L2NetworkCreateExtensionPoint; -import org.zstack.header.network.l2.L2NetworkInventory; import org.zstack.header.network.service.NetworkServiceProviderL2NetworkRefVO; import org.zstack.header.network.service.NetworkServiceProviderVO; import org.zstack.header.network.service.NetworkServiceProviderVO_; @@ -256,6 +253,11 @@ public void afterCreateL2Network(L2NetworkInventory l2Network) { return; } + VSwitchType vSwitchType = VSwitchType.valueOf(l2Network.getvSwitchType()); + if (vSwitchType.getSdnControllerType() != null) { + return; + } + NetworkServiceProviderL2NetworkRefVO ref = new NetworkServiceProviderL2NetworkRefVO(); ref.setNetworkServiceProviderUuid(providerVO.getUuid()); ref.setL2NetworkUuid(l2Network.getUuid()); diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSecurityGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSecurityGroupAction.java index 717beaac61f..44282d9e374 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSecurityGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSecurityGroupAction.java @@ -34,6 +34,9 @@ public Result throwExceptionIfError() { @Param(required = false, validValues = {"4","6"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer ipVersion; + @Param(required = false, validValues = {"LinuxBridge","OvnDpdk"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vSwitchType = "LinuxBridge"; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/SecurityGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/SecurityGroupInventory.java index a432ba3b723..8842a4c6259 100644 --- a/sdk/src/main/java/org/zstack/sdk/SecurityGroupInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/SecurityGroupInventory.java @@ -44,6 +44,14 @@ public java.lang.Integer getIpVersion() { return this.ipVersion; } + public java.lang.String vSwitchType; + public void setVSwitchType(java.lang.String vSwitchType) { + this.vSwitchType = vSwitchType; + } + public java.lang.String getVSwitchType() { + return this.vSwitchType; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ChangeSecurityGroupRuleStateCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ChangeSecurityGroupRuleStateCase.groovy index b3973997a7f..326010c36e5 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ChangeSecurityGroupRuleStateCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ChangeSecurityGroupRuleStateCase.groovy @@ -72,9 +72,9 @@ class ChangeSecurityGroupRuleStateCase extends SubCase { ip4Rules = cmd.ruleTOs.get(sg1.uuid) assert ip4Rules.size() == 12 - assert ip4Rules.find {it.priority == 1 && it.type == "Ingress" && it.state == "Enabled"} - assert ip4Rules.find {it.priority == 3 && it.type == "Ingress" && it.state == "Enabled"} - assert ip4Rules.find {it.priority == 5 && it.type == "Ingress" && it.state == "Enabled"} + assert ip4Rules.find {it.priority == 1 && it.ruleType == "Ingress" && it.state == "Enabled"} + assert ip4Rules.find {it.priority == 3 && it.ruleType == "Ingress" && it.state == "Enabled"} + assert ip4Rules.find {it.priority == 5 && it.ruleType == "Ingress" && it.state == "Enabled"} } cmd = null diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/SecurityGroupAccountCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/SecurityGroupAccountCase.groovy new file mode 100644 index 00000000000..641f941a595 --- /dev/null +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/SecurityGroupAccountCase.groovy @@ -0,0 +1,145 @@ +package org.zstack.test.integration.networkservice.provider.flat.securitygroup + +import org.zstack.network.securitygroup.APIAddSecurityGroupRuleMsg.SecurityGroupRuleAO +import org.zstack.sdk.AccountInventory +import org.zstack.sdk.L3NetworkInventory +import org.zstack.sdk.SecurityGroupInventory +import org.zstack.sdk.SessionInventory +import org.zstack.sdk.VmInstanceInventory +import org.zstack.test.integration.networkservice.provider.NetworkServiceProviderTest +import org.zstack.test.integration.networkservice.provider.virtualrouter.VirtualRouterNetworkServiceEnv +import org.zstack.testlib.EnvSpec +import org.zstack.testlib.SubCase + +class SecurityGroupAccountCase extends SubCase { + EnvSpec env + + L3NetworkInventory l3Net + VmInstanceInventory vm1, vm2, vm3, vm4 + SecurityGroupInventory sg1, sg2, sg3, sg4 + SessionInventory session1 + AccountInventory user1 + + void testDeleteSecurityGroupCase1() { + addVmNicToSecurityGroup { + securityGroupUuid = sg1.uuid + vmNicUuids = [vm1.vmNics[0].uuid] + } + addVmNicToSecurityGroup { + securityGroupUuid = sg2.uuid + vmNicUuids = [vm1.vmNics[0].uuid] + } + addVmNicToSecurityGroup { + securityGroupUuid = sg3.uuid + vmNicUuids = [vm1.vmNics[0].uuid] + } + + addVmNicToSecurityGroup { + securityGroupUuid = sg4.uuid + vmNicUuids = [vm4.vmNics[0].uuid] + } + + SecurityGroupRuleAO r = new SecurityGroupRuleAO() + r.type = 'Egress' + r.description = 'sg4-egress-rule-1' + r.protocol = 'TCP' + r.dstPortRange = '40-400' + sg4 = addSecurityGroupRule { + sessionId = session1.uuid + securityGroupUuid = sg4.uuid + remoteSecurityGroupUuids = [sg2.uuid] + rules = [r] + } + + r.protocol = 'UDP' + r.dstPortRange = '50-500' + r.description = 'sg4-egress-rule-2' + sg4 = addSecurityGroupRule { + sessionId = session1.uuid + securityGroupUuid = sg4.uuid + rules = [r] + priority = -1 + } + } + + @Override + void clean() { + env.delete() + } + + @Override + void setup() { + useSpring(NetworkServiceProviderTest.springSpec) + } + + @Override + void environment() { + env = VirtualRouterNetworkServiceEnv.fourVmThreeHostNoEipForSecurityGroupEnv() + } + + @Override + void test() { + env.create { + l3Net = env.inventoryByName("l3") as L3NetworkInventory + vm1 = env.inventoryByName("vm1") as VmInstanceInventory // vm1 in host1 + vm2 = env.inventoryByName("vm2") as VmInstanceInventory // vm2 in host2 + vm3 = env.inventoryByName("vm3") as VmInstanceInventory // vm3 in host3 + vm4 = env.inventoryByName("vm4") as VmInstanceInventory // vm4 in host3 + + user1 = createAccount { + name = "user1" + password = "password" + } as AccountInventory + + session1 = logInByAccount { + accountName = user1.name + password = "password" + } + sg1 = createSecurityGroup { + sessionId = session1.uuid + name = "sg-1" + ipVersion = 4 + } as SecurityGroupInventory + + sg2 = createSecurityGroup { + sessionId = session1.uuid + name = "sg-2" + ipVersion = 6 + } as SecurityGroupInventory + + sg3 = createSecurityGroup { + sessionId = session1.uuid + name = "sg-3" + ipVersion = 4 + } as SecurityGroupInventory + + sg4 = createSecurityGroup { + sessionId = session1.uuid + name = "sg-4" + ipVersion = 6 + } as SecurityGroupInventory + + attachSecurityGroupToL3Network { + securityGroupUuid = sg1.uuid + l3NetworkUuid = l3Net.uuid + } + attachSecurityGroupToL3Network { + securityGroupUuid = sg2.uuid + l3NetworkUuid = l3Net.uuid + } + attachSecurityGroupToL3Network { + securityGroupUuid = sg3.uuid + l3NetworkUuid = l3Net.uuid + } + attachSecurityGroupToL3Network { + securityGroupUuid = sg4.uuid + l3NetworkUuid = l3Net.uuid + } + } + + testDeleteSecurityGroupCase1() + deleteAccount { + uuid = user1.uuid + } + } +} From 0b13472410fb9d0df5da27612d80a07792e29b5a Mon Sep 17 00:00:00 2001 From: littleya Date: Fri, 11 Apr 2025 14:37:53 +0800 Subject: [PATCH 338/737] [conf]: refactor table HostHaStateVO [conf]: refactor table HostHaStateVO DBImpact 1. Drop exists table HostHaStateVO and recreate it 2. add new primary key 'id' to replace previous primary key 'uuid' 3. previous primary key 'uuid' rename to 'hostUuid' and remove primary key flag Resolves: ZSTAC-71704 Change-Id: I766f6f67756662656768646b7268627765647974 --- conf/db/upgrade/V5.3.28__schema.sql | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/conf/db/upgrade/V5.3.28__schema.sql b/conf/db/upgrade/V5.3.28__schema.sql index 856a9ea1206..86c86afe5d2 100644 --- a/conf/db/upgrade/V5.3.28__schema.sql +++ b/conf/db/upgrade/V5.3.28__schema.sql @@ -113,3 +113,16 @@ WHERE t.current = true AND t.rootImageUuid IS NULL; CALL ADD_COLUMN('SecurityGroupVO', 'vSwitchType', 'VARCHAR(32)', 0, 'LinuxBridge'); + +DROP TABLE IF EXISTS HostHaStateVO; +CREATE TABLE `HostHaStateVO` ( + `id` BIGINT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT, + `hostUuid` VARCHAR(32) NOT NULL, + `primaryStorageUuid` VARCHAR(32) NOT NULL, + `state` varchar(32), + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + CONSTRAINT `HostHaStateVO_HostEO_uuid_fk` FOREIGN KEY (`hostUuid`) REFERENCES `HostEO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `HostHaStateVO_PrimaryStorageEO_uuid_fk` FOREIGN KEY (`primaryStorageUuid`) REFERENCES `PrimaryStorageEO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; From 9da43fb235cab5724f15c70bb5ba45447540088a Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Tue, 18 Mar 2025 16:51:56 +0800 Subject: [PATCH 339/737] [sso]: add plugin support for OAuth2 Improved flexibility for third-party identity providers and enterprise authentication. Resolves: ZSTAC-72708 Change-Id: I71717270856f6f69697865796d7a7867786d6f77 (cherry picked from commit 53a651c97c35638e6596b7773b7b4fa9327ceb0f) --- .../org/zstack/abstraction/PluginDriver.java | 3 +- .../sso/OAuth2PluginConstants.java | 49 ++++++++++++++ .../abstraction/sso/OAuth2ProviderDriver.java | 65 +++++++++++++++++++ .../zstack/abstraction/sso/RequestData.java | 19 ++++++ conf/db/upgrade/V5.3.28__schema.sql | 2 + .../zstack/core/plugin/PluginManagerImpl.java | 2 +- .../zstack/sdk/CreateOAuthClientAction.java | 3 + .../org/zstack/sdk/OAuth2ClientInventory.java | 8 +++ .../zstack/sdk/UpdateOAuthClientAction.java | 3 + 9 files changed, 152 insertions(+), 2 deletions(-) create mode 100644 abstraction/src/main/java/org/zstack/abstraction/sso/OAuth2PluginConstants.java create mode 100644 abstraction/src/main/java/org/zstack/abstraction/sso/OAuth2ProviderDriver.java create mode 100644 abstraction/src/main/java/org/zstack/abstraction/sso/RequestData.java diff --git a/abstraction/src/main/java/org/zstack/abstraction/PluginDriver.java b/abstraction/src/main/java/org/zstack/abstraction/PluginDriver.java index e89037b65bb..61a812f06c3 100644 --- a/abstraction/src/main/java/org/zstack/abstraction/PluginDriver.java +++ b/abstraction/src/main/java/org/zstack/abstraction/PluginDriver.java @@ -1,5 +1,6 @@ package org.zstack.abstraction; +import java.util.ArrayList; import java.util.Collection; import java.util.Map; @@ -67,6 +68,6 @@ public interface PluginDriver { * @return Collection of OptionType */ default Collection optionTypes() { - return null; + return new ArrayList<>(); } } diff --git a/abstraction/src/main/java/org/zstack/abstraction/sso/OAuth2PluginConstants.java b/abstraction/src/main/java/org/zstack/abstraction/sso/OAuth2PluginConstants.java new file mode 100644 index 00000000000..087bbd5129e --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/sso/OAuth2PluginConstants.java @@ -0,0 +1,49 @@ +package org.zstack.abstraction.sso; + +/** + * @Author: DaoDao + * @Date: 2022/8/24 + */ +public interface OAuth2PluginConstants { + //default use OIDC, + public static final String AUTH_SCOPE_VALUE= "openid"; + + public static final int AUTH_RESPONSE_SUCCESS = 200; + public static final int AUTH_RESPONSE_ERROR = 500; + + public static final String OAUTH2_REDIRECT = "/sso/oauth2"; + public static final String TOKEN_INTROSPECT_PATH= "/introspect"; + public static final String TOKEN_Authorization = "Authorization"; + public static final String OAUTH2_TOKEN = "token"; + public static final String TOKEN_INTROSPECT_ACTIVE = "active"; + public static final String GRANT_TYPE_NAME = "grant_type"; + public static final String GRANT_TYPE_OCDE_VALUE = "authorization_code"; + public static final String REFRESH_TOKEN_VALUE = "refresh_token"; + public static final String GRANT_TYPE_PASSWORD_VALUE = "password"; + public static final String AUTH_REDIRECT_URL_NAME= "redirect_uri"; + public static final String CLIENT_ID_NAME = "client_id"; + public static final String CLIENT_SECRET_NAME = "client_secret"; + public static final String OAUTH2_CODE = "code"; + public static final String AUTH_SCOPE_NAME= "scope"; + public static final String RESPONSE_TYPE_NAME = "response_type"; + public static final String AUTH2_STATE = "state"; + + public static final String OAUTH2_USER_NAME = "username"; + public static final String OAUTH2_PASSWORD = "password"; + + public static final String OIDC_GET_USERNAME = "preferred_username"; + public static final String IAM2_ORGANIZATIONS = "organization"; + + public static final String OIDC_SSO_CLIENT_TYPE = "OIDC"; + public static final String OAUTH2_SSO_CLIENT_TYPE = "OAuth2"; + + public static final String ID_TOKEN_VALUE = "id_token"; + public static final String ACCESS_TOKEN_VALUE = "access_token"; + public static final String TOKEN_EXPIRE_TIME_NAME = "exp"; + + String DEFAULT_PROVIDER_NAME = "default"; + String PLUGIN_PROVIDER_NAME = "plugin"; + String ZF_PROVIDER_NAME = "zf"; + String ALI_PROVIDER_NAME = "ali_idaas_private"; + String MAX_KEY_PROVIDER_NAME = "max_key"; +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/sso/OAuth2ProviderDriver.java b/abstraction/src/main/java/org/zstack/abstraction/sso/OAuth2ProviderDriver.java new file mode 100644 index 00000000000..d6bbeada4f2 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/sso/OAuth2ProviderDriver.java @@ -0,0 +1,65 @@ +package org.zstack.abstraction.sso; + +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.util.StringUtils; +import org.springframework.web.util.UriComponentsBuilder; +import org.zstack.abstraction.PluginDriver; + +import java.util.Map; + +public interface OAuth2ProviderDriver extends PluginDriver { + default String type() { + return "sso"; + } + + default String prepareUrl(String requestUrl, MultiValueMap map, HttpHeaders headers) { + return UriComponentsBuilder.fromHttpUrl(requestUrl).toUriString(); + } + + default HttpEntity> prepareReq(MultiValueMap map, HttpHeaders headers) { + return new HttpEntity<>(map, headers); + } + + default MultiValueMap generateRequestCode(String code, String thirdPartyRedirectUrl, Map client) { + MultiValueMap map = new LinkedMultiValueMap<>(); + map.add(OAuth2PluginConstants.GRANT_TYPE_NAME, OAuth2PluginConstants.GRANT_TYPE_OCDE_VALUE); + map.add(OAuth2PluginConstants.AUTH_REDIRECT_URL_NAME, thirdPartyRedirectUrl); + map.add(OAuth2PluginConstants.CLIENT_ID_NAME, client.get("clientId")); + map.add(OAuth2PluginConstants.CLIENT_SECRET_NAME, client.get("clientSecret")); + map.add(OAuth2PluginConstants.OAUTH2_CODE, code); + map.add(OAuth2PluginConstants.AUTH_SCOPE_NAME, StringUtils.isEmpty(client.get("scope")) ? OAuth2PluginConstants.AUTH_SCOPE_VALUE : client.get("scope").replace("::", " ")); + return map; + } + + default RequestData buildRequestTokenData(MultiValueMap map, String requestUrl) { + return new RequestData(requestUrl, map, HttpMethod.POST, new HttpHeaders()); + } + + default RequestData buildRequestLogOutData(MultiValueMap map, String requestUrl) { + return new RequestData(requestUrl, map, HttpMethod.POST, new HttpHeaders()); + } + + default boolean skipRefreshToken() { + return false; + } + + default RequestData buildRequestRefreshTokenData(MultiValueMap map, String requestUrl) { + return new RequestData(requestUrl, map, HttpMethod.POST, new HttpHeaders()); + } + + default RequestData buildRequestTokenIntrospectData(MultiValueMap map, String requestUrl, HttpHeaders headers) { + return new RequestData(requestUrl, map, HttpMethod.POST, headers); + } + + default Map parseUserInfo(Map response) { + return response; + } + + default RequestData buildRequestUserInfoData(MultiValueMap map, String requestUrl, HttpHeaders headers) { + return new RequestData(requestUrl, map, HttpMethod.POST, headers); + } +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/sso/RequestData.java b/abstraction/src/main/java/org/zstack/abstraction/sso/RequestData.java new file mode 100644 index 00000000000..be2828b0725 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/sso/RequestData.java @@ -0,0 +1,19 @@ +package org.zstack.abstraction.sso; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.util.MultiValueMap; + +public class RequestData { + public String requestUrl; + public HttpMethod method; + public MultiValueMap map; + public HttpHeaders headers; + + public RequestData(String requestUrl, MultiValueMap map, HttpMethod method, HttpHeaders headers) { + this.requestUrl = requestUrl; + this.method = method; + this.map = map; + this.headers = headers; + } +} diff --git a/conf/db/upgrade/V5.3.28__schema.sql b/conf/db/upgrade/V5.3.28__schema.sql index 856a9ea1206..2a475fa82a9 100644 --- a/conf/db/upgrade/V5.3.28__schema.sql +++ b/conf/db/upgrade/V5.3.28__schema.sql @@ -49,6 +49,8 @@ DROP PROCEDURE IF EXISTS createThickProvisionVolumeTag; ALTER TABLE `zstack`.`EncryptionIntegrityVO` MODIFY COLUMN `resourceUuid` varchar(128) NOT NULL; +ALTER TABLE `zstack`.`OAuth2ClientVO` ADD COLUMN `pluginUuid` varchar(32) DEFAULT NULL; + CREATE TABLE `zstack`.`ObservabilityServerOfferingVO`( `uuid` varchar(32) NOT NULL UNIQUE, `managementNetworkUuid` varchar(32) DEFAULT NULL, diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java index fbd646d0fa8..3f1015d5410 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java +++ b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java @@ -101,7 +101,7 @@ private void collectPluginProtocolMetadata() { }); } - private void registerPluginAsSingleton( + protected void registerPluginAsSingleton( Class pluginRegisterClz, Class pluginDriverClz) { try { diff --git a/sdk/src/main/java/org/zstack/sdk/CreateOAuthClientAction.java b/sdk/src/main/java/org/zstack/sdk/CreateOAuthClientAction.java index 078e6ec60c3..b5bebc6cdf2 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateOAuthClientAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateOAuthClientAction.java @@ -61,6 +61,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String identityProvider; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String pluginUuid; + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String urlTemplate; diff --git a/sdk/src/main/java/org/zstack/sdk/OAuth2ClientInventory.java b/sdk/src/main/java/org/zstack/sdk/OAuth2ClientInventory.java index 3b32a96a2c8..8e96ac05b94 100644 --- a/sdk/src/main/java/org/zstack/sdk/OAuth2ClientInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/OAuth2ClientInventory.java @@ -60,6 +60,14 @@ public java.lang.String getIdentityProvider() { return this.identityProvider; } + public java.lang.String pluginUuid; + public void setPluginUuid(java.lang.String pluginUuid) { + this.pluginUuid = pluginUuid; + } + public java.lang.String getPluginUuid() { + return this.pluginUuid; + } + public java.lang.String logoutUrl; public void setLogoutUrl(java.lang.String logoutUrl) { this.logoutUrl = logoutUrl; diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateOAuthClientAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateOAuthClientAction.java index 59118ab3877..a17f2fe1d00 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateOAuthClientAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateOAuthClientAction.java @@ -55,6 +55,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String identityProvider; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String pluginUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String loginType; From cdad678556580fa92697028f01e62df95cae4cec Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Tue, 15 Apr 2025 11:46:22 +0800 Subject: [PATCH 340/737] [testlib]: fix case error Resolves: ZSTAC-73622 Change-Id: I6576776b736e6979686d707177626b7063727972 --- testlib/src/main/java/org/zstack/testlib/SpringSpec.groovy | 1 + 1 file changed, 1 insertion(+) diff --git a/testlib/src/main/java/org/zstack/testlib/SpringSpec.groovy b/testlib/src/main/java/org/zstack/testlib/SpringSpec.groovy index 59d343f23a2..79041022580 100755 --- a/testlib/src/main/java/org/zstack/testlib/SpringSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/SpringSpec.groovy @@ -66,6 +66,7 @@ class SpringSpec { void flatNetwork() { include("flatNetworkProvider.xml") + include("sdnController.xml") } void sftpBackupStorage() { From 99fc4367c5a6b6b5ec14f7970fc08a0644a08666 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Tue, 15 Apr 2025 14:50:33 +0800 Subject: [PATCH 341/737] [testlib]: fix case error Resolves: ZSTAC-73622 Change-Id: I6d78767965686a6d69707a6872616c66756c6765 --- testlib/src/main/java/org/zstack/testlib/SpringSpec.groovy | 1 + 1 file changed, 1 insertion(+) diff --git a/testlib/src/main/java/org/zstack/testlib/SpringSpec.groovy b/testlib/src/main/java/org/zstack/testlib/SpringSpec.groovy index 79041022580..6346b1cc68d 100755 --- a/testlib/src/main/java/org/zstack/testlib/SpringSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/SpringSpec.groovy @@ -67,6 +67,7 @@ class SpringSpec { void flatNetwork() { include("flatNetworkProvider.xml") include("sdnController.xml") + include("vxlan.xml") } void sftpBackupStorage() { From a1d3c3c2e54e61363fb2a00c0445d75a5b9e4124 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Tue, 15 Apr 2025 16:34:58 +0800 Subject: [PATCH 342/737] [ExternalPrimaryStorage]: set order avoid volume instanceUuid null Resolves: ZSTAC-74519 Change-Id: I6d7a6e68786a616e666b77706671767775627668 --- conf/springConfigXml/ExternalPrimaryStorage.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/springConfigXml/ExternalPrimaryStorage.xml b/conf/springConfigXml/ExternalPrimaryStorage.xml index b5638c24bcb..744a36fc522 100644 --- a/conf/springConfigXml/ExternalPrimaryStorage.xml +++ b/conf/springConfigXml/ExternalPrimaryStorage.xml @@ -18,7 +18,7 @@ - + From 2323e8075a48cee25ae83efca6acd3fab3681a20 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Wed, 16 Apr 2025 10:28:01 +0800 Subject: [PATCH 343/737] [sdnController]: vtep ip can not be dupicated Resolves: ZSTAC-73822 Change-Id: I626d7272777175786e73616c6c717867656e7362 --- .../org/zstack/sdnController/SdnControllerBase.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java index f3958b933f6..452caab50df 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java @@ -19,6 +19,7 @@ import org.zstack.core.thread.SyncTaskChain; import org.zstack.core.thread.ThreadFacade; import org.zstack.core.workflow.FlowChainBuilder; +import org.zstack.header.apimediator.ApiMessageInterceptionException; import org.zstack.header.core.Completion; import org.zstack.header.core.NopeCompletion; import org.zstack.header.core.WhileDoneCompletion; @@ -42,6 +43,7 @@ import java.util.*; import static java.util.Arrays.asList; +import static org.zstack.core.Platform.argerr; import static org.zstack.sdnController.header.SdnControllerFlowDataParam.SDN_CONTROLLER_UUID; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) @@ -239,6 +241,17 @@ public String getSyncSignature() { @Override public void run(SyncTaskChain chain) { + SdnControllerHostRefVO refvo = Q.New(SdnControllerHostRefVO.class) + .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .eq(SdnControllerHostRefVO_.vSwitchType, msg.getvSwitchType()) + .eq(SdnControllerHostRefVO_.vtepIp, msg.getVtepIp()).find(); + if (refvo != null) { + completion.fail(argerr("could not add host[uuid:%s] to sdn controller[uuid:%s], " + + " because vtepip is used by host[uuid:%s]", msg.getHostUuid(), + msg.getSdnControllerUuid(), refvo.getHostUuid())); + return; + } + SdnController controller = getSdnController(); controller.addHost(msg, new Completion(completion) { @Override From 36d8d5fe97ac9936447db3c6d48be0c84348c595 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Tue, 15 Apr 2025 18:08:35 +0800 Subject: [PATCH 344/737] [plugin]: make sure the host id exists before setting self fencer Resolves: ZSTAC-73856 Change-Id: I786c6a6a6565636d796c77617170636967647966 --- .../java/org/zstack/cbd/kvm/KvmCbdNodeServer.java | 15 +++++++-------- .../addon/primary/ExternalHostIdGetter.java | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java index 326c51d33ce..006d7260547 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java @@ -28,6 +28,7 @@ import org.zstack.kvm.KVMHostAsyncHttpCallMsg; import org.zstack.kvm.KVMHostAsyncHttpCallReply; import org.zstack.kvm.KvmSetupSelfFencerExtensionPoint; +import org.zstack.storage.addon.primary.ExternalHostIdGetter; import org.zstack.storage.addon.primary.ExternalPrimaryStorageFactory; import org.zstack.utils.DebugUtils; import org.zstack.utils.Utils; @@ -121,14 +122,13 @@ public void fail(ErrorCode errorCode) { @Override public void run(FlowTrigger trigger, Map data) { - Integer hostId = Q.New(ExternalPrimaryStorageHostRefVO.class).select(ExternalPrimaryStorageHostRefVO_.hostId) + ExternalPrimaryStorageHostRefVO ref = Q.New(ExternalPrimaryStorageHostRefVO.class) .eq(ExternalPrimaryStorageHostRefVO_.hostUuid, param.getHostUuid()) .eq(ExternalPrimaryStorageHostRefVO_.primaryStorageUuid, param.getPrimaryStorage().getUuid()) - .findValue(); - - if (hostId == null) { - trigger.fail(operr("not found hostId for hostUuid[%s] and primaryStorageUuid[%s]", param.getHostUuid(), param.getPrimaryStorage().getUuid())); - return; + .find(); + if (ref == null || ref.getHostId() == 0) { + logger.warn(String.format("not found hostId for hostUuid[%s] and primaryStorageUuid[%s]", param.getHostUuid(), param.getPrimaryStorage().getUuid())); + ref = new ExternalHostIdGetter(999).getOrAllocateHostIdRef(param.getHostUuid(), param.getPrimaryStorage().getUuid()); } KvmSetupSelfFencerCmd cmd = new KvmSetupSelfFencerCmd(); @@ -139,11 +139,10 @@ public void run(FlowTrigger trigger, Map data) { cmd.storageCheckerTimeout = param.getStorageCheckerTimeout(); cmd.heartbeatRequiredSpace = heartbeatVol.getHeartbeatRequiredSpace(); cmd.hostUuid = param.getHostUuid(); - cmd.hostId = hostId; + cmd.hostId = ref.getHostId(); cmd.strategy = param.getStrategy(); cmd.uuid = param.getPrimaryStorage().getUuid(); cmd.fencers = param.getFencers(); - httpCall(KvmCbdCommands.SETUP_CBD_SELF_FENCER_PATH, param.getHostUuid(), cmd, true, AgentRsp.class, new ReturnValueCompletion(trigger) { @Override public void success(AgentRsp returnValue) { diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalHostIdGetter.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalHostIdGetter.java index 278675e3502..3e35587825f 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalHostIdGetter.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalHostIdGetter.java @@ -129,7 +129,7 @@ protected Integer doAllocateAndSetHostId(String hostUuid, String psUuid) { vo.setStatus(PrimaryStorageHostStatus.Disconnected); dbf.getEntityManager().persist(vo); logger.debug(String.format( - "new sharedblock group primary storage[%s] host[%s] ref created, allocated host id[%s]", psUuid, hostUuid, vo.getHostId())); + "new external primary storage[%s] host[%s] ref created, allocated host id[%s]", psUuid, hostUuid, vo.getHostId())); return hostId; } else if (vo.getHostId() != hostId) { boolean exists = Q.New(ExternalPrimaryStorageHostRefVO.class) From c12dd659297575a28101c1d4cf21f25e24ac21df Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Thu, 17 Apr 2025 10:33:35 +0800 Subject: [PATCH 345/737] [sdk]: fix bandwith parameters Resolves: ZSTAC-74555 Change-Id: I6a707a7979686a7267797971676e61767178647a --- compute/src/main/java/org/zstack/compute/VmNicUtils.java | 6 ++++-- .../main/java/org/zstack/header/vm/VmInstanceConstant.java | 3 +++ sdk/src/main/java/org/zstack/sdk/SetNicQosAction.java | 4 ++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/VmNicUtils.java b/compute/src/main/java/org/zstack/compute/VmNicUtils.java index 703c7f8b741..6d001bdfb86 100644 --- a/compute/src/main/java/org/zstack/compute/VmNicUtils.java +++ b/compute/src/main/java/org/zstack/compute/VmNicUtils.java @@ -11,6 +11,8 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.argerr; +import static org.zstack.header.vm.VmInstanceConstant.VM_NIC_QOS_MAX; +import static org.zstack.header.vm.VmInstanceConstant.VM_NIC_QOS_MIN; public class VmNicUtils { public static void validateVmParms(List vmNicParms, List l3Uuids, List supportNicDriverTypes) { @@ -33,13 +35,13 @@ public static void validateVmParms(List vmNicParms, List l3U } if (nic.getOutboundBandwidth() != null) { - if (nic.getOutboundBandwidth() < 8192 || nic.getOutboundBandwidth() > 32212254720L) { + if (nic.getOutboundBandwidth() < VM_NIC_QOS_MIN || nic.getOutboundBandwidth() > VM_NIC_QOS_MAX) { throw new ApiMessageInterceptionException(argerr("outbound bandwidth[%d] of vm nic is out of [8192, 32212254720]", nic.getOutboundBandwidth())); } } if (nic.getInboundBandwidth() != null) { - if (nic.getInboundBandwidth() < 8192 || nic.getInboundBandwidth() > 32212254720L) { + if (nic.getInboundBandwidth() < VM_NIC_QOS_MIN || nic.getInboundBandwidth() > VM_NIC_QOS_MAX) { throw new ApiMessageInterceptionException(argerr("inbound bandwidth[%d] of vm nic is out of [8192, 32212254720]", nic.getInboundBandwidth())); } } diff --git a/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java b/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java index 6c76c9809a5..896e60e414e 100755 --- a/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java +++ b/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java @@ -90,4 +90,7 @@ enum Capability { String MEMORY_ACCESS_MODE_SHARED = "shared"; String MEMORY_ACCESS_MODE_PRIVATE = "private"; + + Long VM_NIC_QOS_MIN = 8000L; + Long VM_NIC_QOS_MAX = 30000000000L; } diff --git a/sdk/src/main/java/org/zstack/sdk/SetNicQosAction.java b/sdk/src/main/java/org/zstack/sdk/SetNicQosAction.java index 77ecab1cf52..bf839d354f1 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetNicQosAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetNicQosAction.java @@ -28,10 +28,10 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {8192L,32212254720L}, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {8000L,30000000000L}, noTrim = false) public java.lang.Long outboundBandwidth; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {8192L,32212254720L}, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {8000L,30000000000L}, noTrim = false) public java.lang.Long inboundBandwidth; @Param(required = false) From fc76e7a9f1f5de268a145003481d675713c31fea Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 9 Apr 2025 11:36:51 +0800 Subject: [PATCH 346/737] [utils]: support model center metric Resolves: ZSTAC-71251 Change-Id: I6f61776d6c6e7875626c72717563736262756a75 --- sdk/src/main/java/SourceClassMap.java | 2 + .../sdk/GetModelCenterServicesAction.java | 95 ++++++++++++++++ .../sdk/GetModelCenterServicesResult.java | 14 +++ .../sdk/ModelCenterServiceInventory.java | 31 ++++++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ .../org/zstack/utils/linux/ServiceUtils.java | 103 ++++++++++++++++++ 6 files changed, 272 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/GetModelCenterServicesAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/GetModelCenterServicesResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ModelCenterServiceInventory.java create mode 100644 utils/src/main/java/org/zstack/utils/linux/ServiceUtils.java diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 9d19858e067..513515e5ac6 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -24,6 +24,7 @@ public class SourceClassMap { put("org.zstack.ai.entity.ModelServiceRefInventory", "org.zstack.sdk.ModelServiceRefInventory"); put("org.zstack.ai.entity.TrainedModelRecordInventory", "org.zstack.sdk.TrainedModelRecordInventory"); put("org.zstack.ai.message.MaaSUsage", "org.zstack.sdk.MaaSUsage"); + put("org.zstack.ai.message.ModelCenterServiceInventory", "org.zstack.sdk.ModelCenterServiceInventory"); put("org.zstack.ai.message.ModelService", "org.zstack.sdk.ModelService"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessGroupInventory", "org.zstack.sdk.AliyunNasAccessGroupInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessRuleInventory", "org.zstack.sdk.AliyunNasAccessRuleInventory"); @@ -1143,6 +1144,7 @@ public class SourceClassMap { put("org.zstack.sdk.MirrorNetworkUsedIpInventory", "org.zstack.header.portMirror.MirrorNetworkUsedIpInventory"); put("org.zstack.sdk.ModelCenterCapacityInventory", "org.zstack.ai.entity.ModelCenterCapacityInventory"); put("org.zstack.sdk.ModelCenterInventory", "org.zstack.ai.entity.ModelCenterInventory"); + put("org.zstack.sdk.ModelCenterServiceInventory", "org.zstack.ai.message.ModelCenterServiceInventory"); put("org.zstack.sdk.ModelEvalServiceInstanceGroupInventory", "org.zstack.ai.entity.ModelEvalServiceInstanceGroupInventory"); put("org.zstack.sdk.ModelEvaluationTaskInventory", "org.zstack.ai.entity.ModelEvaluationTaskInventory"); put("org.zstack.sdk.ModelInventory", "org.zstack.ai.entity.ModelInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/GetModelCenterServicesAction.java b/sdk/src/main/java/org/zstack/sdk/GetModelCenterServicesAction.java new file mode 100644 index 00000000000..8b187275870 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetModelCenterServicesAction.java @@ -0,0 +1,95 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetModelCenterServicesAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.GetModelCenterServicesResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelCenterUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.GetModelCenterServicesResult value = res.getResult(org.zstack.sdk.GetModelCenterServicesResult.class); + ret.value = value == null ? new org.zstack.sdk.GetModelCenterServicesResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/ai/model-centers/services"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetModelCenterServicesResult.java b/sdk/src/main/java/org/zstack/sdk/GetModelCenterServicesResult.java new file mode 100644 index 00000000000..1825a61f696 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetModelCenterServicesResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class GetModelCenterServicesResult { + public java.util.List services; + public void setServices(java.util.List services) { + this.services = services; + } + public java.util.List getServices() { + return this.services; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelCenterServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelCenterServiceInventory.java new file mode 100644 index 00000000000..30ee696bfeb --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelCenterServiceInventory.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + + + +public class ModelCenterServiceInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 39ea0151494..1c3cbcad3cd 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -23183,6 +23183,33 @@ abstract class ApiHelper { } + def getModelCenterServices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetModelCenterServicesAction.class) Closure c) { + def a = new org.zstack.sdk.GetModelCenterServicesAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def getMonitorItem(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetMonitorItemAction.class) Closure c) { def a = new org.zstack.sdk.GetMonitorItemAction() a.sessionId = Test.currentEnvSpec?.session?.uuid diff --git a/utils/src/main/java/org/zstack/utils/linux/ServiceUtils.java b/utils/src/main/java/org/zstack/utils/linux/ServiceUtils.java new file mode 100644 index 00000000000..a1b57849ae8 --- /dev/null +++ b/utils/src/main/java/org/zstack/utils/linux/ServiceUtils.java @@ -0,0 +1,103 @@ +package org.zstack.utils.linux; + +import org.zstack.utils.Bash; +import org.zstack.utils.logging.CLogger; +import org.zstack.utils.logging.CLoggerImpl; + +import java.util.List; + +public class ServiceUtils { + private static final CLogger logger = CLoggerImpl.getLogger(ServiceUtils.class); + + /** + * 创建并安装Linux系统服务 + * + * @param serviceName 服务名称 + * @param description 服务描述 + * @param documentation 文档URL + * @param dependencies 依赖的其他服务 + * @param execStart 执行命令 + */ + public static void installService(String serviceName, String description, + String documentation, List dependencies, + String execStart) { + try { + StringBuilder serviceContent = new StringBuilder("[Unit]\n"); + serviceContent.append("Description=").append(description).append("\n"); + + if (documentation != null && !documentation.isEmpty()) { + serviceContent.append("Documentation=").append(documentation).append("\n"); + } + + if (dependencies != null && !dependencies.isEmpty()) { + serviceContent.append("After=").append(String.join(" ", dependencies)).append("\n"); + } + + serviceContent.append("\n[Service]\n"); + serviceContent.append("Type=forking\n"); + serviceContent.append("ExecStart=").append(execStart).append("\n"); + + serviceContent.append("\n[Install]\n"); + serviceContent.append("WantedBy=multi-user.target"); + + String tmpServicePath = "/tmp/" + serviceName + ".service"; + String servicePath = "/etc/systemd/system/" + serviceName + ".service"; + + new Bash() { + @Override + protected void scripts() { + run("echo '%s' > %s; sudo cp %s %s", serviceContent, tmpServicePath, tmpServicePath, servicePath); + run("sudo systemctl enable %s; sudo systemctl daemon-reload", serviceName); + } + }.execute(); + + } catch (Exception e) { + logger.debug("Failed to install service: " + e.getMessage(), e); + } + } + + /** + * 启动服务 + */ + public static void startService(String serviceName) { + new Bash() { + @Override + protected void scripts() { + setE(); + + run("sudo systemctl start %s", serviceName); + } + }.execute(); + } + + /** + * 停止服务 + */ + public static void stopService(String serviceName) { + new Bash() { + @Override + protected void scripts() { + setE(); + + run("sudo systemctl stop %s", serviceName); + } + }.execute(); + } + + /** + * 卸载服务 + */ + public static void uninstallService(String serviceName, String scriptPath) { + new Bash() { + @Override + protected void scripts() { + setE(); + + run("sudo systemctl disable %s" , serviceName); + run("sudo rm /etc/systemd/system/%s.service", serviceName); + run("sudo rm %s" + scriptPath, scriptPath); + run("sudo systemctl daemon-reload"); + } + }.execute(); + } +} From e7a15e298e60851b7763a2a7740eee36ecbcb83b Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Wed, 9 Apr 2025 18:41:50 +0800 Subject: [PATCH 347/737] [conf]: support zdfs metric DBImpact Resolves: ZSTAC-73048 Change-Id: I6b786b686a766b6b7671757664676f6d6a756378 --- build/pom.xml | 5 + conf/db/upgrade/V5.3.28__schema.sql | 29 +++++ sdk/src/main/java/SourceClassMap.java | 12 +++ .../org/zstack/sdk/AddModelCenterAction.java | 3 + .../org/zstack/sdk/MetaServerService.java | 87 +++++++++++++++ .../org/zstack/sdk/ModelCenterInventory.java | 9 ++ .../sdk/ModelCenterServiceInventory.java | 22 ++-- .../java/org/zstack/sdk/QueryZdfsAction.java | 75 +++++++++++++ .../java/org/zstack/sdk/QueryZdfsResult.java | 22 ++++ .../org/zstack/sdk/ReconnectZdfsAction.java | 101 ++++++++++++++++++ .../org/zstack/sdk/ReconnectZdfsResult.java | 14 +++ .../java/org/zstack/sdk/ServiceStatus.java | 23 ++++ .../main/java/org/zstack/sdk/StorageType.java | 6 ++ .../java/org/zstack/sdk/ZdfsInventory.java | 95 ++++++++++++++++ .../main/java/org/zstack/sdk/ZdfsService.java | 39 +++++++ .../org/zstack/sdk/ZdfsStorageInventory.java | 71 ++++++++++++ test/src/test/resources/zstack.properties | 2 + .../java/org/zstack/testlib/ApiHelper.groovy | 56 ++++++++++ 18 files changed, 660 insertions(+), 11 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/MetaServerService.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryZdfsAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryZdfsResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ReconnectZdfsAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ReconnectZdfsResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ServiceStatus.java create mode 100644 sdk/src/main/java/org/zstack/sdk/StorageType.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ZdfsInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ZdfsService.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ZdfsStorageInventory.java diff --git a/build/pom.xml b/build/pom.xml index 96170f5c51e..2d8c5257d7c 100755 --- a/build/pom.xml +++ b/build/pom.xml @@ -631,6 +631,11 @@ observabilityServer ${project.version} + + org.zstack + zdfs + ${project.version} +
diff --git a/conf/db/upgrade/V5.3.28__schema.sql b/conf/db/upgrade/V5.3.28__schema.sql index f82736ec996..171950ac050 100644 --- a/conf/db/upgrade/V5.3.28__schema.sql +++ b/conf/db/upgrade/V5.3.28__schema.sql @@ -150,3 +150,32 @@ CREATE TABLE `HostHaStateVO` ( CONSTRAINT `HostHaStateVO_HostEO_uuid_fk` FOREIGN KEY (`hostUuid`) REFERENCES `HostEO` (`uuid`) ON DELETE CASCADE, CONSTRAINT `HostHaStateVO_PrimaryStorageEO_uuid_fk` FOREIGN KEY (`primaryStorageUuid`) REFERENCES `PrimaryStorageEO` (`uuid`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ZdfsVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `zoneUuid` varchar(32) NULL, + `url` varchar(255) NOT NULL, + `hostName` varchar(255) NOT NULL, + `sshPort` int(16) not NULL, + `status` varchar(32) NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ZdfsStorageVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `endPoint` varchar(255) NOT NULL, + `type` varchar(32) NOT NULL, + `accessKey` varchar(255) NULL, + `secretKey` varchar(255) NULL, + `usedCapacity` bigint(20) unsigned NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CALL ADD_COLUMN('ModelCenterVO', 'zoneUuid', 'VARCHAR(32)', 1, NULL); +CALL ADD_COLUMN('ModelCenterVO', 'zdfsUuid', 'VARCHAR(32)', 1, NULL); +ALTER TABLE ModelCenterVO ADD CONSTRAINT fkModelCenterVOZoneVO FOREIGN KEY (zoneUuid) REFERENCES ZoneEO (uuid) ON DELETE CASCADE; +ALTER TABLE ModelCenterVO ADD CONSTRAINT fkModelCenterVOZdfsVO FOREIGN KEY (zdfsUuid) REFERENCES ZdfsVO (uuid) ON DELETE SET NULL; \ No newline at end of file diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 513515e5ac6..764c79b6e21 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -25,6 +25,9 @@ public class SourceClassMap { put("org.zstack.ai.entity.TrainedModelRecordInventory", "org.zstack.sdk.TrainedModelRecordInventory"); put("org.zstack.ai.message.MaaSUsage", "org.zstack.sdk.MaaSUsage"); put("org.zstack.ai.message.ModelCenterServiceInventory", "org.zstack.sdk.ModelCenterServiceInventory"); + put("org.zstack.ai.message.ModelCenterServiceInventory$MetaServerService", "org.zstack.sdk.MetaServerService"); + put("org.zstack.ai.message.ModelCenterServiceInventory$ServiceStatus", "org.zstack.sdk.ServiceStatus"); + put("org.zstack.ai.message.ModelCenterServiceInventory$ZdfsService", "org.zstack.sdk.ZdfsService"); put("org.zstack.ai.message.ModelService", "org.zstack.sdk.ModelService"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessGroupInventory", "org.zstack.sdk.AliyunNasAccessGroupInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessRuleInventory", "org.zstack.sdk.AliyunNasAccessRuleInventory"); @@ -414,6 +417,9 @@ public class SourceClassMap { put("org.zstack.header.vpc.ha.VpcHaGroupMonitorIpInventory", "org.zstack.sdk.VpcHaGroupMonitorIpInventory"); put("org.zstack.header.vpc.ha.VpcHaGroupNetworkServiceRefInventory", "org.zstack.sdk.VpcHaGroupNetworkServiceRefInventory"); put("org.zstack.header.vpc.ha.VpcHaGroupVipRefInventory", "org.zstack.sdk.VpcHaGroupVipRefInventory"); + put("org.zstack.header.zdfs.StorageType", "org.zstack.sdk.StorageType"); + put("org.zstack.header.zdfs.ZdfsInventory", "org.zstack.sdk.ZdfsInventory"); + put("org.zstack.header.zdfs.ZdfsStorageInventory", "org.zstack.sdk.ZdfsStorageInventory"); put("org.zstack.header.zone.ZoneInventory", "org.zstack.sdk.ZoneInventory"); put("org.zstack.hybrid.account.HybridAccountInventory", "org.zstack.sdk.HybridAccountInventory"); put("org.zstack.hybrid.core.HybridType", "org.zstack.sdk.HybridType"); @@ -1134,6 +1140,7 @@ public class SourceClassMap { put("org.zstack.sdk.MdevDeviceStatus", "org.zstack.pciDevice.virtual.vfio_mdev.MdevDeviceStatus"); put("org.zstack.sdk.MdevDeviceType", "org.zstack.pciDevice.virtual.vfio_mdev.MdevDeviceType"); put("org.zstack.sdk.MediaInventory", "org.zstack.monitoring.media.MediaInventory"); + put("org.zstack.sdk.MetaServerService", "org.zstack.ai.message.ModelCenterServiceInventory$MetaServerService"); put("org.zstack.sdk.MiniCandidateHostStruct", "org.zstack.header.bootstrap.MiniCandidateHostStruct"); put("org.zstack.sdk.MiniHostInfo", "org.zstack.header.bootstrap.MiniHostInfo"); put("org.zstack.sdk.MiniNetworkConfigStruct", "org.zstack.header.bootstrap.MiniNetworkConfigStruct"); @@ -1324,6 +1331,7 @@ public class SourceClassMap { put("org.zstack.sdk.SecurityGroupInventory", "org.zstack.network.securitygroup.SecurityGroupInventory"); put("org.zstack.sdk.SecurityGroupRuleInventory", "org.zstack.network.securitygroup.SecurityGroupRuleInventory"); put("org.zstack.sdk.SecurityMachineInventory", "org.zstack.header.securitymachine.SecurityMachineInventory"); + put("org.zstack.sdk.ServiceStatus", "org.zstack.ai.message.ModelCenterServiceInventory$ServiceStatus"); put("org.zstack.sdk.ServiceTypeStatisticData", "org.zstack.header.host.ServiceTypeStatisticData"); put("org.zstack.sdk.SessionInventory", "org.zstack.header.identity.SessionInventory"); put("org.zstack.sdk.SessionStatus", "org.zstack.header.portMirror.SessionStatus"); @@ -1361,6 +1369,7 @@ public class SourceClassMap { put("org.zstack.sdk.SshPrivateKeyPairInventory", "org.zstack.header.sshkeypair.SshPrivateKeyPairInventory"); put("org.zstack.sdk.StackParameters", "org.zstack.header.cloudformation.StackParameters"); put("org.zstack.sdk.StackTemplateInventory", "org.zstack.header.cloudformation.StackTemplateInventory"); + put("org.zstack.sdk.StorageType", "org.zstack.header.zdfs.StorageType"); put("org.zstack.sdk.SupportedResourceStruct", "org.zstack.header.cloudformation.SupportedResourceStruct"); put("org.zstack.sdk.SyncBackupResult", "org.zstack.header.storage.backup.SyncBackupResult"); put("org.zstack.sdk.SystemTagInventory", "org.zstack.header.tag.SystemTagInventory"); @@ -1495,6 +1504,9 @@ public class SourceClassMap { put("org.zstack.sdk.ZBoxVmBackupInfo", "org.zstack.externalbackup.zbox.ZBoxVmBackupInfo"); put("org.zstack.sdk.ZBoxVolumeBackupInfo", "org.zstack.externalbackup.zbox.ZBoxVolumeBackupInfo"); put("org.zstack.sdk.ZQLQueryReturn", "org.zstack.zql.ZQLQueryReturn"); + put("org.zstack.sdk.ZdfsInventory", "org.zstack.header.zdfs.ZdfsInventory"); + put("org.zstack.sdk.ZdfsService", "org.zstack.ai.message.ModelCenterServiceInventory$ZdfsService"); + put("org.zstack.sdk.ZdfsStorageInventory", "org.zstack.header.zdfs.ZdfsStorageInventory"); put("org.zstack.sdk.ZoneInventory", "org.zstack.header.zone.ZoneInventory"); put("org.zstack.sdk.databasebackup.DatabaseBackupInventory", "org.zstack.header.storage.database.backup.DatabaseBackupInventory"); put("org.zstack.sdk.databasebackup.DatabaseBackupStorageRefInventory", "org.zstack.header.storage.database.backup.DatabaseBackupStorageRefInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java index 38122fb2b2d..a702c54b525 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java @@ -31,6 +31,9 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String url; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; diff --git a/sdk/src/main/java/org/zstack/sdk/MetaServerService.java b/sdk/src/main/java/org/zstack/sdk/MetaServerService.java new file mode 100644 index 00000000000..411d4ac737d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/MetaServerService.java @@ -0,0 +1,87 @@ +package org.zstack.sdk; + + + +public class MetaServerService { + + public java.lang.String url; + public void setUrl(java.lang.String url) { + this.url = url; + } + public java.lang.String getUrl() { + return this.url; + } + + public boolean up; + public void setUp(boolean up) { + this.up = up; + } + public boolean getUp() { + return this.up; + } + + public java.lang.String role; + public void setRole(java.lang.String role) { + this.role = role; + } + public java.lang.String getRole() { + return this.role; + } + + public long usedMemoryInBytes; + public void setUsedMemoryInBytes(long usedMemoryInBytes) { + this.usedMemoryInBytes = usedMemoryInBytes; + } + public long getUsedMemoryInBytes() { + return this.usedMemoryInBytes; + } + + public long maxMemoryInBytes; + public void setMaxMemoryInBytes(long maxMemoryInBytes) { + this.maxMemoryInBytes = maxMemoryInBytes; + } + public long getMaxMemoryInBytes() { + return this.maxMemoryInBytes; + } + + public long connectedClients; + public void setConnectedClients(long connectedClients) { + this.connectedClients = connectedClients; + } + public long getConnectedClients() { + return this.connectedClients; + } + + public long maxClients; + public void setMaxClients(long maxClients) { + this.maxClients = maxClients; + } + public long getMaxClients() { + return this.maxClients; + } + + public boolean syncInProgress; + public void setSyncInProgress(boolean syncInProgress) { + this.syncInProgress = syncInProgress; + } + public boolean getSyncInProgress() { + return this.syncInProgress; + } + + public long replLagBytes; + public void setReplLagBytes(long replLagBytes) { + this.replLagBytes = replLagBytes; + } + public long getReplLagBytes() { + return this.replLagBytes; + } + + public java.lang.String version; + public void setVersion(java.lang.String version) { + this.version = version; + } + public java.lang.String getVersion() { + return this.version; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java index 3f61596c5b6..ec8bf2e9471 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java @@ -1,6 +1,7 @@ package org.zstack.sdk; import org.zstack.sdk.ModelCenterCapacityInventory; +import org.zstack.sdk.ZdfsInventory; public class ModelCenterInventory { @@ -116,6 +117,14 @@ public ModelCenterCapacityInventory getCapacity() { return this.capacity; } + public ZdfsInventory zdfs; + public void setZdfs(ZdfsInventory zdfs) { + this.zdfs = zdfs; + } + public ZdfsInventory getZdfs() { + return this.zdfs; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelCenterServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelCenterServiceInventory.java index 30ee696bfeb..954ae70836d 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelCenterServiceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelCenterServiceInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk; - +import org.zstack.sdk.ZdfsService; public class ModelCenterServiceInventory { @@ -12,20 +12,20 @@ public java.lang.String getUuid() { return this.uuid; } - public java.lang.String name; - public void setName(java.lang.String name) { - this.name = name; + public java.util.List serviceStatuses; + public void setServiceStatuses(java.util.List serviceStatuses) { + this.serviceStatuses = serviceStatuses; } - public java.lang.String getName() { - return this.name; + public java.util.List getServiceStatuses() { + return this.serviceStatuses; } - public java.lang.String status; - public void setStatus(java.lang.String status) { - this.status = status; + public ZdfsService zdfs; + public void setZdfs(ZdfsService zdfs) { + this.zdfs = zdfs; } - public java.lang.String getStatus() { - return this.status; + public ZdfsService getZdfs() { + return this.zdfs; } } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryZdfsAction.java b/sdk/src/main/java/org/zstack/sdk/QueryZdfsAction.java new file mode 100644 index 00000000000..638883de716 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryZdfsAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryZdfsAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryZdfsResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryZdfsResult value = res.getResult(org.zstack.sdk.QueryZdfsResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryZdfsResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/zdfs"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryZdfsResult.java b/sdk/src/main/java/org/zstack/sdk/QueryZdfsResult.java new file mode 100644 index 00000000000..83e1736bdf4 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryZdfsResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryZdfsResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectZdfsAction.java b/sdk/src/main/java/org/zstack/sdk/ReconnectZdfsAction.java new file mode 100644 index 00000000000..10324cbb46a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectZdfsAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class ReconnectZdfsAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.ReconnectZdfsResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.ReconnectZdfsResult value = res.getResult(org.zstack.sdk.ReconnectZdfsResult.class); + ret.value = value == null ? new org.zstack.sdk.ReconnectZdfsResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/zdfs/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "reconnectZdfs"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectZdfsResult.java b/sdk/src/main/java/org/zstack/sdk/ReconnectZdfsResult.java new file mode 100644 index 00000000000..c7e7488c012 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectZdfsResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ZdfsInventory; + +public class ReconnectZdfsResult { + public ZdfsInventory inventory; + public void setInventory(ZdfsInventory inventory) { + this.inventory = inventory; + } + public ZdfsInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ServiceStatus.java b/sdk/src/main/java/org/zstack/sdk/ServiceStatus.java new file mode 100644 index 00000000000..2ff9653cdc1 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ServiceStatus.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class ServiceStatus { + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/StorageType.java b/sdk/src/main/java/org/zstack/sdk/StorageType.java new file mode 100644 index 00000000000..c199b8c5d4b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/StorageType.java @@ -0,0 +1,6 @@ +package org.zstack.sdk; + +public enum StorageType { + S3, + NFS, +} diff --git a/sdk/src/main/java/org/zstack/sdk/ZdfsInventory.java b/sdk/src/main/java/org/zstack/sdk/ZdfsInventory.java new file mode 100644 index 00000000000..4697da9943f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ZdfsInventory.java @@ -0,0 +1,95 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ZdfsStorageInventory; + +public class ZdfsInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public java.lang.String zoneUuid; + public void setZoneUuid(java.lang.String zoneUuid) { + this.zoneUuid = zoneUuid; + } + public java.lang.String getZoneUuid() { + return this.zoneUuid; + } + + public java.lang.String url; + public void setUrl(java.lang.String url) { + this.url = url; + } + public java.lang.String getUrl() { + return this.url; + } + + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + + public java.lang.String hostName; + public void setHostName(java.lang.String hostName) { + this.hostName = hostName; + } + public java.lang.String getHostName() { + return this.hostName; + } + + public int sshPort; + public void setSshPort(int sshPort) { + this.sshPort = sshPort; + } + public int getSshPort() { + return this.sshPort; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + + public ZdfsStorageInventory storage; + public void setStorage(ZdfsStorageInventory storage) { + this.storage = storage; + } + public ZdfsStorageInventory getStorage() { + return this.storage; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ZdfsService.java b/sdk/src/main/java/org/zstack/sdk/ZdfsService.java new file mode 100644 index 00000000000..f5dd69ae912 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ZdfsService.java @@ -0,0 +1,39 @@ +package org.zstack.sdk; + + + +public class ZdfsService { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public int slaveCount; + public void setSlaveCount(int slaveCount) { + this.slaveCount = slaveCount; + } + public int getSlaveCount() { + return this.slaveCount; + } + + public int sentinelCount; + public void setSentinelCount(int sentinelCount) { + this.sentinelCount = sentinelCount; + } + public int getSentinelCount() { + return this.sentinelCount; + } + + public java.util.List metaServers; + public void setMetaServers(java.util.List metaServers) { + this.metaServers = metaServers; + } + public java.util.List getMetaServers() { + return this.metaServers; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ZdfsStorageInventory.java b/sdk/src/main/java/org/zstack/sdk/ZdfsStorageInventory.java new file mode 100644 index 00000000000..349e3d51dc7 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ZdfsStorageInventory.java @@ -0,0 +1,71 @@ +package org.zstack.sdk; + +import org.zstack.sdk.StorageType; + +public class ZdfsStorageInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String endPoint; + public void setEndPoint(java.lang.String endPoint) { + this.endPoint = endPoint; + } + public java.lang.String getEndPoint() { + return this.endPoint; + } + + public java.lang.String accessKey; + public void setAccessKey(java.lang.String accessKey) { + this.accessKey = accessKey; + } + public java.lang.String getAccessKey() { + return this.accessKey; + } + + public java.lang.String secretKey; + public void setSecretKey(java.lang.String secretKey) { + this.secretKey = secretKey; + } + public java.lang.String getSecretKey() { + return this.secretKey; + } + + public StorageType type; + public void setType(StorageType type) { + this.type = type; + } + public StorageType getType() { + return this.type; + } + + public java.lang.Long usedCapacity; + public void setUsedCapacity(java.lang.Long usedCapacity) { + this.usedCapacity = usedCapacity; + } + public java.lang.Long getUsedCapacity() { + return this.usedCapacity; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/test/src/test/resources/zstack.properties b/test/src/test/resources/zstack.properties index 8bbdc48707a..b8ee3650b69 100755 --- a/test/src/test/resources/zstack.properties +++ b/test/src/test/resources/zstack.properties @@ -40,6 +40,8 @@ httpConsoleProxyPort = 8989 AppBuildSystem.agentPort=8989 +Zdfs.agentPort=8989 + ApiMediator.apiWorkerNum=50 unitTestOn=true diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 1c3cbcad3cd..045890cce3e 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -35757,6 +35757,35 @@ abstract class ApiHelper { } + def queryZdfs(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryZdfsAction.class) Closure c) { + def a = new org.zstack.sdk.QueryZdfsAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryZone(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryZoneAction.class) Closure c) { def a = new org.zstack.sdk.QueryZoneAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -36245,6 +36274,33 @@ abstract class ApiHelper { } + def reconnectZdfs(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectZdfsAction.class) Closure c) { + def a = new org.zstack.sdk.ReconnectZdfsAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def recoverBaremetalInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RecoverBaremetalInstanceAction.class) Closure c) { def a = new org.zstack.sdk.RecoverBaremetalInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From cbd0790174b2d804625bc0fa8c15e9c862212a07 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Fri, 18 Apr 2025 16:57:20 +0800 Subject: [PATCH 348/737] [xinfini]: wait iscsi client group active Resolves: ZSTAC-74612 Change-Id: I6b627a626f75686e7a636872686f7665766a716f --- .../src/main/java/org/zstack/xinfini/XInfiniApiHelper.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java index ff092060958..0b231e9544b 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java @@ -643,9 +643,10 @@ public IscsiClientGroupModule createIscsiClientGroup(String name, List req.setIscsiGatewayIds(iscsiGatewayIds); req.setIscsiClientCodes(iscsiClientCodes); CreateIscsiClientGroupResponse rsp = callErrorOut(req, CreateIscsiClientGroupResponse.class); - // TODO xinfini not support yet - // return retryUtilStateActive(req, CreateIscsiClientGroupResponse.class,(CreateIscsiClientGroupResponse gvp) -> gvp.toModule().getMetadata().getState().getState()).toModule(); - return rsp.toModule(); + + GetIscsiClientGroupRequest gReq = new GetIscsiClientGroupRequest(); + gReq.setId(rsp.getSpec().getId()); + return retryUtilStateActive(gReq, GetIscsiClientGroupResponse.class,(GetIscsiClientGroupResponse gvp) -> gvp.toModule().getMetadata().getState().getState()).toModule(); } public IscsiClientGroupModule getIscsiClientGroup(int id) { From 455042c27d6103b0cdbc033ae20480438904ab20 Mon Sep 17 00:00:00 2001 From: J M Date: Tue, 25 Mar 2025 13:13:44 +0800 Subject: [PATCH 349/737] [image]: set actual size before download image image size quota use actual size in db to validate. Resolves: ZSTAC-73944 Change-Id: I756e767677626a676c6b70736678797a71756374 --- .../org/zstack/image/ImageManagerImpl.java | 5 +++- .../java/org/zstack/image/ImageQuotaUtil.java | 28 +++++++------------ .../longjob/AddImageLongJobCase.groovy | 21 +++++--------- 3 files changed, 21 insertions(+), 33 deletions(-) diff --git a/image/src/main/java/org/zstack/image/ImageManagerImpl.java b/image/src/main/java/org/zstack/image/ImageManagerImpl.java index 8d6207031b6..b12d6b9e2c3 100755 --- a/image/src/main/java/org/zstack/image/ImageManagerImpl.java +++ b/image/src/main/java/org/zstack/image/ImageManagerImpl.java @@ -1067,7 +1067,7 @@ public List reportQuota() { quota.addQuotaMessageChecker(new QuotaMessageHandler<>(APIAddImageMsg.class) .addCounterQuota(ImageQuotaConstant.IMAGE_NUM) - .addMessageRequiredQuotaHandler(ImageQuotaConstant.IMAGE_SIZE, (msg) -> new ImageQuotaUtil().getLocalImageSizeOnBackupStorage(msg))); + .addMessageRequiredQuotaHandler(ImageQuotaConstant.IMAGE_SIZE, (msg) -> new ImageQuotaUtil().getImageActualSizeOnBs(msg.getUrl().trim(), msg.getBackupStorageUuids()))); quota.addQuotaMessageChecker(new QuotaMessageHandler<>(APIRecoverImageMsg.class) .addMessageRequiredQuotaHandler(ImageQuotaConstant.IMAGE_SIZE, (msg) -> { ImageVO image = dbf.getEntityManager().find(ImageVO.class, msg.getImageUuid()); @@ -1181,6 +1181,9 @@ void reply(Message reply) { vo.setPlatform(ImagePlatform.valueOf(msgData.getPlatform())); } + long asize = new ImageQuotaUtil().getImageActualSizeOnBs(msgData.getUrl().trim(), msgData.getBackupStorageUuids()); + vo.setActualSize(asize); + ImageFactory factory = getImageFacotry(ImageType.valueOf(imageType)); final ImageVO ivo = new SQLBatchWithReturn() { @Override diff --git a/image/src/main/java/org/zstack/image/ImageQuotaUtil.java b/image/src/main/java/org/zstack/image/ImageQuotaUtil.java index c1d8dc42ced..df45e2f1a39 100644 --- a/image/src/main/java/org/zstack/image/ImageQuotaUtil.java +++ b/image/src/main/java/org/zstack/image/ImageQuotaUtil.java @@ -9,20 +9,17 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.errorcode.ErrorFacade; -import org.zstack.header.apimediator.ApiMessageInterceptionException; -import org.zstack.header.core.BypassWhenUnitTest; import org.zstack.header.errorcode.OperationFailureException; -import org.zstack.header.identity.Quota; -import org.zstack.header.image.APIAddImageMsg; import org.zstack.header.image.ImageVO; import org.zstack.header.rest.RESTFacade; -import org.zstack.header.storage.backup.*; -import org.zstack.identity.QuotaUtil; +import org.zstack.header.storage.backup.BackupStorageConstant; +import org.zstack.header.storage.backup.GetLocalFileSizeOnBackupStorageMsg; +import org.zstack.header.storage.backup.GetLocalFileSizeOnBackupStorageReply; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; import javax.persistence.TypedQuery; -import java.util.Map; +import java.util.List; /** * Created by miao on 16-10-9. @@ -85,25 +82,21 @@ public long getUsedImageSize(String accountUuid) { return imageSize; } - - public long getLocalImageSizeOnBackupStorage(APIAddImageMsg msg) { + public long getImageActualSizeOnBs(String url, List bsUuids) { long imageSizeAsked = 0; if (CoreGlobalProperty.UNIT_TEST_ON) { - return imageSizeAsked; + return 1; } - final String url = msg.getUrl().trim(); if (url.startsWith("file:///")) { GetLocalFileSizeOnBackupStorageMsg gmsg = new GetLocalFileSizeOnBackupStorageMsg(); - String bsUuid = msg.getBackupStorageUuids().get(0); - gmsg.setBackupStorageUuid(bsUuid); + gmsg.setBackupStorageUuid(bsUuids.get(0)); gmsg.setUrl(url.split("://")[1]); - bus.makeTargetServiceIdByResourceUuid(gmsg, BackupStorageConstant.SERVICE_ID, bsUuid); + bus.makeTargetServiceIdByResourceUuid(gmsg, BackupStorageConstant.SERVICE_ID, bsUuids.get(0)); GetLocalFileSizeOnBackupStorageReply reply = (GetLocalFileSizeOnBackupStorageReply) bus.call(gmsg); if (!reply.isSuccess()) { - logger.warn(String.format("cannot get image. The image url : %s. description: %s.name: %s", - url, msg.getDescription(), msg.getName())); + logger.warn(String.format("cannot get image. The image url: %s", url)); throw new OperationFailureException(reply.getError()); } else { imageSizeAsked = reply.getSize(); @@ -114,8 +107,7 @@ public long getLocalImageSizeOnBackupStorage(APIAddImageMsg msg) { try { len = header.getFirst("Content-Length"); } catch (Exception e) { - logger.warn(String.format("cannot get image. The image url : %s. description: %s.name: %s", - url, msg.getDescription(), msg.getName())); + logger.warn(String.format("cannot get image. The image url: %s", url)); } imageSizeAsked = len == null ? 0 : Long.parseLong(len); } diff --git a/test/src/test/groovy/org/zstack/test/integration/longjob/AddImageLongJobCase.groovy b/test/src/test/groovy/org/zstack/test/integration/longjob/AddImageLongJobCase.groovy index 1c4510aa77d..1ea4832ae4b 100644 --- a/test/src/test/groovy/org/zstack/test/integration/longjob/AddImageLongJobCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/longjob/AddImageLongJobCase.groovy @@ -4,36 +4,28 @@ import com.google.gson.Gson import org.springframework.http.HttpEntity import org.zstack.core.Platform import org.zstack.core.cloudbus.CloudBus -import org.zstack.core.config.GlobalConfigVO -import org.zstack.core.config.GlobalConfigVO_ import org.zstack.core.db.Q -import org.zstack.core.db.SQL import org.zstack.core.timeout.ApiTimeoutGlobalProperty -import org.zstack.header.image.APIAddImageMsg -import org.zstack.header.image.ImageConstant -import org.zstack.header.image.ImagePlatform -import org.zstack.header.image.ImageVO +import org.zstack.header.image.* +import org.zstack.header.longjob.LongJobState import org.zstack.header.longjob.LongJobVO import org.zstack.header.longjob.LongJobVO_ -import org.zstack.header.longjob.LongJobState import org.zstack.header.storage.backup.DownloadImageMsg import org.zstack.header.storage.backup.DownloadImageReply -import org.zstack.header.storage.primary.APIAttachPrimaryStorageToClusterMsg import org.zstack.longjob.LongJobGlobalConfig -import org.zstack.sdk.* +import org.zstack.sdk.BackupStorageInventory +import org.zstack.sdk.LongJobInventory +import org.zstack.sdk.UpdateGlobalConfigAction import org.zstack.storage.backup.sftp.SftpBackupStorageCommands import org.zstack.storage.backup.sftp.SftpBackupStorageConstant import org.zstack.test.integration.ZStackTest import org.zstack.test.integration.storage.Env import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase -import org.zstack.utils.SizeUtils import org.zstack.utils.TimeUtils import org.zstack.utils.data.SizeUnit import org.zstack.utils.gson.JSONObjectUtil -import javax.persistence.metamodel.SingularAttribute - /** * Created by camile on 2/5/18. */ @@ -102,13 +94,14 @@ class AddImageLongJobCase extends SubCase { timeout = cmd.getTimeout() //DownloadImageMsg LongJobVO vo = Q.New(LongJobVO.class).eq(LongJobVO_.description, myDescription).find() + assert Q.New(ImageVO.class).eq(ImageVO_.@name, "TinyLinux-1byte").select(ImageVO_.actualSize).findValue() != 0 assert vo.state == LongJobState.Running flag += 1 return rsp } APIAddImageMsg msg = new APIAddImageMsg() - msg.setName("TinyLinux") + msg.setName("TinyLinux-1byte") msg.setBackupStorageUuids(Collections.singletonList(bs.uuid)) msg.setUrl("http://192.168.1.20/share/images/tinylinux.qcow2") msg.setFormat(ImageConstant.QCOW2_FORMAT_STRING) From 7c532c87347de253a3cfc64bad6461f5a8612731 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Mon, 21 Apr 2025 17:19:19 +0800 Subject: [PATCH 350/737] [kvm]: add restoreNicPciAddressList in ovs command Resolves: ZSTAC-73863 Change-Id: I6b6c716f646d726871777a796a7268617866626d --- plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index 5ad95e7dffa..11994db7105 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -4738,6 +4738,8 @@ public static class StartOvsServiceCmd extends AgentCommand { @GrayVersion(value = "5.4.0") public Map nicNameDriverMap; @GrayVersion(value = "5.4.0") + public List restoreNicPciAddressList = new ArrayList<>(); + @GrayVersion(value = "5.4.0") public String brExName; @GrayVersion(value = "5.4.0") public String ovnRemoteConnection; From 26b24d3a2089d857a1346399df54b1f4071674df Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Thu, 17 Apr 2025 17:23:00 +0800 Subject: [PATCH 351/737] [GC]: fix GC that has done triggered fix GC that has done triggered Resolves/Related: ZSTAC-74593 Change-Id: I786b7965627a6b73636978647a6867726d76706e --- .../org/zstack/core/gc/GarbageCollector.java | 8 +- .../storage/primary/ceph/CephGCCase.groovy | 75 +++++++++++++++---- 2 files changed, 68 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/org/zstack/core/gc/GarbageCollector.java b/core/src/main/java/org/zstack/core/gc/GarbageCollector.java index 734818f1288..a27b2c5a073 100755 --- a/core/src/main/java/org/zstack/core/gc/GarbageCollector.java +++ b/core/src/main/java/org/zstack/core/gc/GarbageCollector.java @@ -202,8 +202,12 @@ void runTrigger() { GarbageCollector self = this; EXECUTED_TIMES++; - boolean isExisting = Q.New(GarbageCollectorVO.class).eq(GarbageCollectorVO_.uuid, getUuid()).isExists(); - if (!isExisting) { + boolean existAndNotDone = Q.New(GarbageCollectorVO.class) + .eq(GarbageCollectorVO_.uuid, getUuid()) + .notEq(GarbageCollectorVO_.status, GCStatus.Done) + .isExists(); + + if (!existAndNotDone) { canceller.run(); gcMgr.deregisterGC(self); return; diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephGCCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephGCCase.groovy index 6d34f4d96fa..92db098aa63 100755 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephGCCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephGCCase.groovy @@ -5,12 +5,9 @@ import org.zstack.core.db.SQL import org.zstack.core.gc.GCStatus import org.zstack.core.gc.GarbageCollectorVO import org.zstack.core.gc.GarbageCollectorVO_ +import org.zstack.header.exception.CloudRuntimeException import org.zstack.header.volume.VolumeDeletionPolicyManager -import org.zstack.sdk.DiskOfferingInventory -import org.zstack.sdk.GarbageCollectorInventory -import org.zstack.sdk.PrimaryStorageInventory -import org.zstack.sdk.VolumeInventory -import org.zstack.sdk.VolumeSnapshotInventory +import org.zstack.sdk.* import org.zstack.storage.ceph.CephGlobalConfig import org.zstack.storage.ceph.primary.CephDeleteVolumeChainGC import org.zstack.storage.ceph.primary.CephDeleteVolumeGC @@ -20,17 +17,10 @@ import org.zstack.storage.volume.VolumeGlobalConfig import org.zstack.storage.volume.VolumeSystemTags import org.zstack.test.integration.storage.CephEnv import org.zstack.test.integration.storage.StorageTest -import org.zstack.testlib.ClusterSpec -import org.zstack.testlib.DiskOfferingSpec -import org.zstack.testlib.EnvSpec -import org.zstack.testlib.HttpError -import org.zstack.testlib.PrimaryStorageSpec -import org.zstack.testlib.SubCase -import org.zstack.testlib.vfs.VFS +import org.zstack.testlib.* import org.zstack.utils.gson.JSONObjectUtil import java.util.concurrent.TimeUnit - /** * Created by kayo on 2018/7/25. */ @@ -354,6 +344,62 @@ class CephGCCase extends SubCase { } } + void testGCDoneAndCancelAfterTriggerGC() { + env.cleanSimulatorAndMessageHandlers() + def deleteFail = true + def callDelete = 0 + env.hijackSimulator(CephPrimaryStorageBase.DELETE_PATH) { rsp, HttpEntity e -> + callDelete ++ + if (deleteFail) { + throw new CloudRuntimeException("on purpose") + } + return rsp + } + + VolumeInventory vol = createDataVolume { + name = "data" + diskOfferingUuid = diskOffering.uuid + primaryStorageUuid = ceph.uuid + } + deleteDataVolume { + uuid = vol.uuid + } + expungeDataVolume { + uuid = vol.uuid + } + + def job + retryInSecs { + def jobs = queryGCJob { + conditions = ["context~=%${vol.getUuid()}%".toString()] + } as List + assert jobs.size() == 1 + job = jobs.get(0) + assert jobs.get(0).status != GCStatus.Done.toString() + assert callDelete == 1 + } + deleteFail = false + triggerGCJob { + uuid = job.uuid + } + retryInSecs { + def jobs = queryGCJob { + conditions = ["context~=%${vol.getUuid()}%".toString()] + } as List + assert jobs.size() == 1 + assert jobs.get(0).status == GCStatus.Done.toString() + assert callDelete == 2 + } + + assert !retryInSecs(3) { + def jobs = queryGCJob { + conditions = ["context~=%${vol.getUuid()}%".toString()] + } as List + return jobs.size() != 1 || jobs.get(0).status != GCStatus.Done.toString() || callDelete != 2 + } + + } + void prepareEnv() { env.preSimulator(CephPrimaryStorageBase.DELETE_PATH) { if (deleteFail) { @@ -370,6 +416,9 @@ class CephGCCase extends SubCase { ceph = (env.specByName("ceph-pri") as PrimaryStorageSpec).inventory diskOffering = (env.specByName("diskOffering") as DiskOfferingSpec).inventory + CephGlobalConfig.GC_INTERVAL.updateValue(TimeUnit.SECONDS.toSeconds(2)) + testGCDoneAndCancelAfterTriggerGC() + // set a very long time so the GC won't run, we use API to trigger it CephGlobalConfig.GC_INTERVAL.updateValue(TimeUnit.DAYS.toSeconds(1)) VolumeGlobalConfig.VOLUME_DELETION_POLICY.updateValue(VolumeDeletionPolicyManager.VolumeDeletionPolicy.Direct.toString()) From a7f4812c2a7295108d8f92442862b7eb6bbf511a Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Tue, 22 Apr 2025 16:51:26 +0800 Subject: [PATCH 352/737] [storage]: resolve "No space left on device" error for memory snapshots Resolves: ZSTAC-67162 Change-Id: I7171671625667162697865796d7a7867786d6f77 --- .../zstack/storage/snapshot/VolumeSnapshotGlobalConfig.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotGlobalConfig.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotGlobalConfig.java index 9948dbdf738..ab4eb23b431 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotGlobalConfig.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotGlobalConfig.java @@ -1,5 +1,6 @@ package org.zstack.storage.snapshot; +import org.zstack.core.GlobalProperty; import org.zstack.core.config.GlobalConfig; import org.zstack.core.config.GlobalConfigDef; import org.zstack.core.config.GlobalConfigDefinition; @@ -23,4 +24,7 @@ public class VolumeSnapshotGlobalConfig { @GlobalConfigValidation(validValues = {"true", "false"}) @GlobalConfigDef(defaultValue = "false", type = Boolean.class, description = "effective count with detached volumes") public static GlobalConfig EFFECTIVE_COUNT_WITH_DETACHED_VOLUMES = new GlobalConfig(CATEGORY, "effectiveCount.withDetachedVolumes"); + @GlobalConfigValidation(numberGreaterThan = 0) + @GlobalConfigDef(defaultValue = "10", type = Integer.class, description = "Percentage of additional space reserved when creating a logical volume for memory snapshot.") + public static GlobalConfig MEMORY_SNAPSHOT_VOLUME_BUFFER_PERCENT = new GlobalConfig(CATEGORY, "memorySnapshotVolume.BufferPercent"); } From 10cd9b85e7ba8477e635a5a4c840a1c5f0620bb3 Mon Sep 17 00:00:00 2001 From: "yingzhe.hu" Date: Thu, 24 Apr 2025 16:55:48 +0800 Subject: [PATCH 353/737] [storage]: resupport APICreateDataVolumeMsg resourceUuid param Resolves: ZSTAC-74725 Change-Id: I73616b6d796b726d636e6f77617a797269636770 --- .../main/java/org/zstack/storage/volume/VolumeManagerImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java b/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java index 8f2da2c5449..bd2e2471e80 100755 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java @@ -1118,6 +1118,7 @@ private void handle(APICreateDataVolumeMsg msg) { cmsg.setAccountUuid(msg.getSession().getAccountUuid()); cmsg.setDiskSize(msg.getDiskSize()); cmsg.setName(msg.getName()); + cmsg.setResourceUuid(msg.getResourceUuid()); cmsg.setSystemTags(msg.getSystemTags()); cmsg.setDiskOfferingUuid(msg.getDiskOfferingUuid()); cmsg.setPrimaryStorageUuid(msg.getPrimaryStorageUuid()); From 2026777bcf51e3118f2650177bef72201983153f Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 7 May 2025 11:08:43 +0800 Subject: [PATCH 354/737] [sdk]: Update sdk Resolves: ZSTAC-70417 Change-Id: I7865617a6f6b6171776776787a75767a71767671 Signed-off-by: ye.zou --- .../main/java/org/zstack/rest/RestServer.java | 29 ++- .../zstack/sdk/DeleteModelServicesAction.java | 104 ++++++++ .../zstack/sdk/DeleteModelServicesResult.java | 14 ++ .../java/org/zstack/testlib/ApiHelper.groovy | 234 ++++++++++-------- 4 files changed, 267 insertions(+), 114 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteModelServicesAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteModelServicesResult.java diff --git a/rest/src/main/java/org/zstack/rest/RestServer.java b/rest/src/main/java/org/zstack/rest/RestServer.java index 3d702b211fa..49a65591249 100755 --- a/rest/src/main/java/org/zstack/rest/RestServer.java +++ b/rest/src/main/java/org/zstack/rest/RestServer.java @@ -365,19 +365,24 @@ private void callWebHook(RequestData d) throws IllegalAccessException, NoSuchMet if (d.apiMessage instanceof APIBatchRequest) { if (evt.isSuccess()) { - APIBatchRequest.Result batchResult = ((APIBatchRequest) d.apiMessage).collectResult(d.apiMessage, evt); - - DebugUtils.Assert(batchResult != null, "APIBatchRequest.collectResult should not return null"); - RestConstants.Batch result; - if (batchResult.getSuccessCount() == 0) { - result = RestConstants.Batch.FAIL; - } else if (batchResult.getSuccessCount() == batchResult.getTotalCount()) { - result = RestConstants.Batch.SUCCESS; - } else { - result = RestConstants.Batch.PARTIAL; - } + try { + APIBatchRequest.Result batchResult = ((APIBatchRequest) d.apiMessage).collectResult(d.apiMessage, evt); + + DebugUtils.Assert(batchResult != null, "APIBatchRequest.collectResult should not return null"); + RestConstants.Batch result; + if (batchResult.getSuccessCount() == 0) { + result = RestConstants.Batch.FAIL; + } else if (batchResult.getSuccessCount() == batchResult.getTotalCount()) { + result = RestConstants.Batch.SUCCESS; + } else { + result = RestConstants.Batch.PARTIAL; + } - rb.addHeader(RestConstants.HEADER_JOB_BATCH, result.toString()); + rb.addHeader(RestConstants.HEADER_JOB_BATCH, result.toString()); + } catch (Exception e) { + logger.error(String.format("failed to collect batch result for %s", d.apiMessage.getId()), e); + rb.addHeader(RestConstants.HEADER_JOB_BATCH, RestConstants.Batch.FAIL.toString()); + } } else { rb.addHeader(RestConstants.HEADER_JOB_BATCH, RestConstants.Batch.FAIL.toString()); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelServicesAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelServicesAction.java new file mode 100644 index 00000000000..d8097c94c08 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelServicesAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteModelServicesAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeleteModelServicesResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List uuids; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeleteModelServicesResult value = res.getResult(org.zstack.sdk.DeleteModelServicesResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteModelServicesResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/ai/model-services/"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelServicesResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelServicesResult.java new file mode 100644 index 00000000000..5cf3f58417c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelServicesResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class DeleteModelServicesResult { + public java.util.List results; + public void setResults(java.util.List results) { + this.results = results; + } + public java.util.List getResults() { + return this.results; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 045890cce3e..81302325323 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -13496,7 +13496,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -15210,7 +15210,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -15237,8 +15237,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - - + return out } else { return errorOut(a.call()) @@ -15319,7 +15318,34 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } + + return out + } else { + return errorOut(a.call()) + } + } + + def deleteModelServices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelServicesAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteModelServicesAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + return out } else { return errorOut(a.call()) @@ -17641,7 +17667,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -17668,7 +17694,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -19410,6 +19436,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -23588,7 +23615,6 @@ abstract class ApiHelper { } - def getPortForwardingAttachableVmNics(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPortForwardingAttachableVmNicsAction.class) Closure c) { def a = new org.zstack.sdk.GetPortForwardingAttachableVmNicsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -31013,63 +31039,6 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - - a.conditions = a.conditions.collect { it.toString() } - - - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } - - def queryPluginDrivers(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPluginDriversAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPluginDriversAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() - - a.conditions = a.conditions.collect { it.toString() } - - - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } - - - def queryPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPolicyAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() a.conditions = a.conditions.collect { it.toString() } @@ -32717,6 +32686,64 @@ abstract class ApiHelper { } + def queryPluginDrivers(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPluginDriversAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPluginDriversAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def queryPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPolicyAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryPolicyRouteRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyRouteRuleAction.class) Closure c) { def a = new org.zstack.sdk.QueryPolicyRouteRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -32781,9 +32808,10 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid @@ -34955,34 +34983,9 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - - - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } - - - def refreshPluginDrivers(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshPluginDriversAction.class) Closure c) { - def a = new org.zstack.sdk.RefreshPluginDriversAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -35763,7 +35766,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + a.conditions = a.conditions.collect { it.toString() } @@ -35771,14 +35774,14 @@ abstract class ApiHelper { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -36280,20 +36283,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -36706,6 +36709,33 @@ abstract class ApiHelper { } + def refreshPluginDrivers(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshPluginDriversAction.class) Closure c) { + def a = new org.zstack.sdk.RefreshPluginDriversAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def refreshSSOServerToken(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshSSOServerTokenAction.class) Closure c) { def a = new org.zstack.sdk.RefreshSSOServerTokenAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -42544,7 +42574,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -42571,7 +42601,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -44231,7 +44261,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -44258,7 +44288,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) From 71bd39add25a1f47cb4177c6366ff488025b766c Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Tue, 6 May 2025 16:04:00 +0800 Subject: [PATCH 355/737] [plugin]: support for batch volume query Resolves: ZSTAC-74569 Change-Id: I797465707a7473757478727a7a7867637a6c736c --- .../storage/zbs/ZbsStorageController.java | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index aa15cd8cb45..2209dd63d02 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -37,7 +37,6 @@ import org.zstack.header.volume.VolumeConstant; import org.zstack.header.volume.VolumeProtocol; import org.zstack.header.volume.VolumeStats; -import org.zstack.kvm.KVMGlobalConfig; import org.zstack.kvm.KVMHostVO; import org.zstack.kvm.KVMHostVO_; import org.zstack.resourceconfig.ResourceConfig; @@ -84,6 +83,7 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar public static final String DELETE_VOLUME_PATH = "/zbs/primarystorage/volume/delete"; public static final String CLONE_VOLUME_PATH = "/zbs/primarystorage/volume/clone"; public static final String QUERY_VOLUME_PATH = "/zbs/primarystorage/volume/query"; + public static final String BATCH_QUERY_VOLUME_PATH = "/zbs/primarystorage/volume/query/batch"; public static final String EXPAND_VOLUME_PATH = "/zbs/primarystorage/volume/expand"; public static final String CBD_TO_NBD_PATH = "/zbs/primarystorage/volume/cbdtonbd"; public static final String CLEAN_NBD_PATH = "/zbs/primarystorage/volume/cleannbd"; @@ -703,7 +703,28 @@ public void fail(ErrorCode errorCode) { @Override public void batchStats(Collection installPath, ReturnValueCompletion> comp) { + BatchQueryVolumeCmd cmd = new BatchQueryVolumeCmd(); + cmd.setInstallPaths(installPath); + httpCall(BATCH_QUERY_VOLUME_PATH, cmd, BatchQueryVolumeRsp.class, new ReturnValueCompletion(comp) { + @Override + public void success(BatchQueryVolumeRsp returnValue) { + List stats = returnValue.getVolumes().entrySet().stream().map(v -> { + VolumeStats s = new VolumeStats(); + s.setInstallPath(v.getKey()); + s.setSize(v.getValue().get("length")); + s.setActualSize(v.getValue().get("usedSize")); + s.setFormat(VolumeConstant.VOLUME_FORMAT_RAW); + return s; + }).collect(Collectors.toList()); + comp.success(stats); + } + + @Override + public void fail(ErrorCode errorCode) { + comp.fail(errorCode); + } + }); } @Override @@ -1166,6 +1187,18 @@ public void setActualSize(long actualSize) { } } + public static class BatchQueryVolumeRsp extends AgentResponse { + private Map> volumes; + + public Map> getVolumes() { + return volumes; + } + + public void setVolumes(Map> volumes) { + this.volumes = volumes; + } + } + public static class CbdToNbdRsp extends AgentResponse { private String ip; private int port; @@ -1476,6 +1509,18 @@ public void setLunName(String lunName) { } } + public static class BatchQueryVolumeCmd extends AgentCommand { + private Collection installPaths; + + public Collection getInstallPaths() { + return installPaths; + } + + public void setInstallPaths(Collection installPaths) { + this.installPaths = installPaths; + } + } + public static class CleanNbdCmd extends AgentCommand { private String nbdAddr; private int port; From f13846004f24ebff4755538d2f2445d09ca40b6a Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 8 May 2025 14:21:00 +0800 Subject: [PATCH 356/737] [sdk]: Update sdk Resolves: ZSTAC-69069 Change-Id: I6d6871706175747175646e797a686772616e6466 --- sdk/src/main/java/org/zstack/sdk/DeleteModelCenterAction.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelCenterAction.java index ab2631f2d0d..32701153611 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteModelCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelCenterAction.java @@ -28,6 +28,9 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + @Param(required = false) public java.util.List systemTags; From f15910b478370e3c31c8939a2ba28869b8e6c812 Mon Sep 17 00:00:00 2001 From: lianghy Date: Thu, 8 May 2025 17:17:55 +0800 Subject: [PATCH 357/737] bump version to 5.4.0 DBImpact Change-Id: I6a656361776e657a61786e687865756b6366626c --- VERSION | 4 ++-- abstraction/pom.xml | 2 +- build/pom.xml | 2 +- compute/pom.xml | 2 +- conf/db/upgrade/V5.4.0__schema.sql | 0 configuration/pom.xml | 2 +- console/pom.xml | 2 +- .../main/java/org/zstack/console/ConsoleGlobalProperty.java | 2 +- core/pom.xml | 2 +- .../java/org/zstack/core/ansible/AnsibleGlobalProperty.java | 2 +- externalservice/pom.xml | 2 +- header/pom.xml | 4 ++-- identity/pom.xml | 2 +- image/pom.xml | 2 +- longjob/pom.xml | 2 +- network/pom.xml | 2 +- plugin/acl/pom.xml | 2 +- plugin/applianceVm/pom.xml | 2 +- .../org/zstack/appliancevm/ApplianceVmGlobalProperty.java | 2 +- plugin/cbd/pom.xml | 2 +- plugin/ceph/pom.xml | 2 +- .../main/java/org/zstack/storage/ceph/CephGlobalProperty.java | 4 ++-- plugin/directory/pom.xml | 2 +- plugin/eip/pom.xml | 2 +- plugin/expon/pom.xml | 2 +- plugin/externalStorage/pom.xml | 2 +- plugin/flatNetworkProvider/pom.xml | 2 +- plugin/hostNetworkInterface/pom.xml | 2 +- plugin/iscsi/pom.xml | 2 +- plugin/kvm/pom.xml | 2 +- .../kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java | 2 +- plugin/ldap/pom.xml | 2 +- plugin/loadBalancer/pom.xml | 2 +- plugin/localstorage/pom.xml | 2 +- plugin/loginPlugin/pom.xml | 2 +- plugin/mediator/pom.xml | 2 +- plugin/nfsPrimaryStorage/pom.xml | 2 +- plugin/pom.xml | 2 +- plugin/portForwarding/pom.xml | 2 +- plugin/sdnController/pom.xml | 2 +- plugin/securityGroup/pom.xml | 2 +- plugin/sftpBackupStorage/pom.xml | 2 +- .../storage/backup/sftp/SftpBackupStorageGlobalProperty.java | 2 +- plugin/sharedMountPointPrimaryStorage/pom.xml | 2 +- plugin/sshKeyPair/pom.xml | 2 +- plugin/sugonSdnController/pom.xml | 2 +- plugin/vhost/pom.xml | 2 +- plugin/vip/pom.xml | 2 +- plugin/virtualRouterProvider/pom.xml | 2 +- .../service/virtualrouter/VirtualRouterGlobalProperty.java | 2 +- plugin/vxlan/pom.xml | 2 +- plugin/xinfini/pom.xml | 2 +- plugin/zbs/pom.xml | 2 +- pom.xml | 2 +- portal/pom.xml | 2 +- resourceconfig/pom.xml | 2 +- rest/pom.xml | 2 +- sdk/pom.xml | 2 +- search/pom.xml | 2 +- simulator/pom.xml | 2 +- simulator/simulatorHeader/pom.xml | 2 +- simulator/simulatorImpl/pom.xml | 2 +- storage/pom.xml | 2 +- tag/pom.xml | 2 +- test/pom.xml | 2 +- testlib/pom.xml | 2 +- utils/pom.xml | 2 +- 67 files changed, 69 insertions(+), 69 deletions(-) create mode 100644 conf/db/upgrade/V5.4.0__schema.sql diff --git a/VERSION b/VERSION index 7287a5bd8d0..0d1081b0fe6 100755 --- a/VERSION +++ b/VERSION @@ -1,3 +1,3 @@ MAJOR=5 -MINOR=3 -UPDATE=28 +MINOR=4 +UPDATE=0 diff --git a/abstraction/pom.xml b/abstraction/pom.xml index e96183b0d4f..4e18325c587 100644 --- a/abstraction/pom.xml +++ b/abstraction/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. 4.0.0 diff --git a/build/pom.xml b/build/pom.xml index 2d8c5257d7c..e92d7dcc0dc 100755 --- a/build/pom.xml +++ b/build/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. build diff --git a/compute/pom.xml b/compute/pom.xml index dc289db0f6d..f0f9de03f5e 100755 --- a/compute/pom.xml +++ b/compute/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. compute diff --git a/conf/db/upgrade/V5.4.0__schema.sql b/conf/db/upgrade/V5.4.0__schema.sql new file mode 100644 index 00000000000..e69de29bb2d diff --git a/configuration/pom.xml b/configuration/pom.xml index 7b430de96d4..8ce34186f80 100755 --- a/configuration/pom.xml +++ b/configuration/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. configuration diff --git a/console/pom.xml b/console/pom.xml index 0212104dbf9..47806cb4219 100755 --- a/console/pom.xml +++ b/console/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java b/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java index 5101eecc77f..418f30ba433 100644 --- a/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java +++ b/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java @@ -9,7 +9,7 @@ */ @GlobalPropertyDefinition public class ConsoleGlobalProperty { - @GlobalProperty(name="ConsoleProxy.agentPackageName", defaultValue = "consoleproxy-5.3.0.tar.gz") + @GlobalProperty(name="ConsoleProxy.agentPackageName", defaultValue = "consoleproxy-5.4.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="MN.network.", defaultValue = "") public static List MN_NETWORKS; diff --git a/core/pom.xml b/core/pom.xml index aab291866b6..fbe13125a5a 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.zstack - 5.3.0 + 5.4.0 .. zstack diff --git a/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java b/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java index 635d7fca2bf..0dfc6c0d2da 100755 --- a/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java +++ b/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java @@ -9,7 +9,7 @@ public class AnsibleGlobalProperty { @GlobalProperty(name = "Ansible.executable", defaultValue = "python") public static String EXECUTABLE; - @GlobalProperty(name = "Ansible.zstacklibPackageName", defaultValue = "zstacklib-5.3.0.tar.gz") + @GlobalProperty(name = "Ansible.zstacklibPackageName", defaultValue = "zstacklib-5.4.0.tar.gz") public static String ZSTACKLIB_PACKAGE_NAME; @GlobalProperty(name = "Ansible.zstackRoot", defaultValue = "/var/lib/zstack") public static String ZSTACK_ROOT; diff --git a/externalservice/pom.xml b/externalservice/pom.xml index 92e4c0073c2..5059f579ce7 100755 --- a/externalservice/pom.xml +++ b/externalservice/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/header/pom.xml b/header/pom.xml index 5272e42ef5a..d31a8194b15 100755 --- a/header/pom.xml +++ b/header/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. header @@ -150,7 +150,7 @@ org.zstack abstraction - 5.3.0 + 5.4.0 diff --git a/identity/pom.xml b/identity/pom.xml index 9daa1aab9e2..2f06a0008cb 100755 --- a/identity/pom.xml +++ b/identity/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. identity diff --git a/image/pom.xml b/image/pom.xml index 7174263e909..917fbc74fac 100755 --- a/image/pom.xml +++ b/image/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. image diff --git a/longjob/pom.xml b/longjob/pom.xml index f446a1b482e..867476237b4 100755 --- a/longjob/pom.xml +++ b/longjob/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. longjob diff --git a/network/pom.xml b/network/pom.xml index 11e601b2f59..009efab142c 100755 --- a/network/pom.xml +++ b/network/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. network diff --git a/plugin/acl/pom.xml b/plugin/acl/pom.xml index c129127c8c4..1af18880f15 100644 --- a/plugin/acl/pom.xml +++ b/plugin/acl/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/applianceVm/pom.xml b/plugin/applianceVm/pom.xml index 54800dafa67..d6529929856 100755 --- a/plugin/applianceVm/pom.xml +++ b/plugin/applianceVm/pom.xml @@ -6,7 +6,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 .. applianceVm diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java index c346a2c7578..6658e2608fe 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java @@ -11,7 +11,7 @@ public class ApplianceVmGlobalProperty { public static boolean NO_ROLLBACK_ON_POST_FAILURE; @GlobalProperty(name = "ApplianceVm.connectVerbose", defaultValue = "false") public static boolean CONNECT_VERBOSE; - @GlobalProperty(name="ApplianceVm.agentPackageName", defaultValue = "appliancevm-5.3.0.tar.gz") + @GlobalProperty(name="ApplianceVm.agentPackageName", defaultValue = "appliancevm-5.4.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="ApplianceVm.agentPort", defaultValue = "7759") public static int AGENT_PORT; diff --git a/plugin/cbd/pom.xml b/plugin/cbd/pom.xml index 3320d7ee874..cdd77c86b4b 100644 --- a/plugin/cbd/pom.xml +++ b/plugin/cbd/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.3.0 + 5.4.0 cbd diff --git a/plugin/ceph/pom.xml b/plugin/ceph/pom.xml index 3df78c8a5f3..4bf8fde202f 100755 --- a/plugin/ceph/pom.xml +++ b/plugin/ceph/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java index 94555a56fd4..4219f67cc33 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java @@ -18,13 +18,13 @@ public class CephGlobalProperty { public static String PRIMARY_STORAGE_AGENT_URL_ROOT_PATH; @GlobalProperty(name="Ceph.primaryStorageAgent.port", defaultValue = "7762") public static int PRIMARY_STORAGE_AGENT_PORT; - @GlobalProperty(name="Ceph.backupStorage.agentPackageName", defaultValue = "cephbackupstorage-5.3.0.tar.gz") + @GlobalProperty(name="Ceph.backupStorage.agentPackageName", defaultValue = "cephbackupstorage-5.4.0.tar.gz") public static String BACKUP_STORAGE_PACKAGE_NAME; @GlobalProperty(name="Ceph.backupStorage.ansiblePlaybook", defaultValue = "cephb.py") public static String BACKUP_STORAGE_PLAYBOOK_NAME; @GlobalProperty(name="Ceph.backupStorage.ansibleModulePath", defaultValue = "ansible/cephb") public static String BACKUP_STORAGE_MODULE_PATH; - @GlobalProperty(name="Ceph.primaryStorage.agentPackageName", defaultValue = "cephprimarystorage-5.3.0.tar.gz") + @GlobalProperty(name="Ceph.primaryStorage.agentPackageName", defaultValue = "cephprimarystorage-5.4.0.tar.gz") public static String PRIMARY_STORAGE_PACKAGE_NAME; @GlobalProperty(name="Ceph.primaryStorage.ansiblePlaybook", defaultValue = "cephp.py") public static String PRIMARY_STORAGE_PLAYBOOK_NAME; diff --git a/plugin/directory/pom.xml b/plugin/directory/pom.xml index d282f417e1c..17d8f511076 100644 --- a/plugin/directory/pom.xml +++ b/plugin/directory/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/eip/pom.xml b/plugin/eip/pom.xml index 9849e0b04b3..08aa87feb87 100755 --- a/plugin/eip/pom.xml +++ b/plugin/eip/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/expon/pom.xml b/plugin/expon/pom.xml index 5474e1877ae..48c98522980 100644 --- a/plugin/expon/pom.xml +++ b/plugin/expon/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/externalStorage/pom.xml b/plugin/externalStorage/pom.xml index ea6e0b03f69..76c238c9c2b 100644 --- a/plugin/externalStorage/pom.xml +++ b/plugin/externalStorage/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 .. diff --git a/plugin/flatNetworkProvider/pom.xml b/plugin/flatNetworkProvider/pom.xml index a209c6d4001..1e768f5b2ea 100755 --- a/plugin/flatNetworkProvider/pom.xml +++ b/plugin/flatNetworkProvider/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/hostNetworkInterface/pom.xml b/plugin/hostNetworkInterface/pom.xml index d80bf49afbe..bb0d6ab3596 100644 --- a/plugin/hostNetworkInterface/pom.xml +++ b/plugin/hostNetworkInterface/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.3.0 + 5.4.0 hostNetworkInterface diff --git a/plugin/iscsi/pom.xml b/plugin/iscsi/pom.xml index b08238b12e5..bb7bacea0e7 100644 --- a/plugin/iscsi/pom.xml +++ b/plugin/iscsi/pom.xml @@ -6,7 +6,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 .. diff --git a/plugin/kvm/pom.xml b/plugin/kvm/pom.xml index 77efc0bfbe7..12ca68055a9 100755 --- a/plugin/kvm/pom.xml +++ b/plugin/kvm/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 .. kvm diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java index a590baf73da..7ee841b5051 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java @@ -10,7 +10,7 @@ */ @GlobalPropertyDefinition public class KVMGlobalProperty { - @GlobalProperty(name="KvmAgent.agentPackageName", defaultValue = "kvmagent-5.3.0.tar.gz") + @GlobalProperty(name="KvmAgent.agentPackageName", defaultValue = "kvmagent-5.4.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="KvmAgent.agentUrlRootPath", defaultValue = "") public static String AGENT_URL_ROOT_PATH; diff --git a/plugin/ldap/pom.xml b/plugin/ldap/pom.xml index ce88514ae42..ccfa2ca138d 100755 --- a/plugin/ldap/pom.xml +++ b/plugin/ldap/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/loadBalancer/pom.xml b/plugin/loadBalancer/pom.xml index c3603ebe8d4..65f09eeb277 100755 --- a/plugin/loadBalancer/pom.xml +++ b/plugin/loadBalancer/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/localstorage/pom.xml b/plugin/localstorage/pom.xml index aed148455b3..2fa49de85a0 100755 --- a/plugin/localstorage/pom.xml +++ b/plugin/localstorage/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/loginPlugin/pom.xml b/plugin/loginPlugin/pom.xml index e698ce03816..3be14fc3082 100644 --- a/plugin/loginPlugin/pom.xml +++ b/plugin/loginPlugin/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 .. loginPlugin diff --git a/plugin/mediator/pom.xml b/plugin/mediator/pom.xml index 44867a048ba..c98247a956f 100755 --- a/plugin/mediator/pom.xml +++ b/plugin/mediator/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/nfsPrimaryStorage/pom.xml b/plugin/nfsPrimaryStorage/pom.xml index 2e06cbe92bc..2d63182f8e1 100755 --- a/plugin/nfsPrimaryStorage/pom.xml +++ b/plugin/nfsPrimaryStorage/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 .. nfsPrimaryStorage diff --git a/plugin/pom.xml b/plugin/pom.xml index 1a96be7bffc..c97c9a24421 100755 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. plugin diff --git a/plugin/portForwarding/pom.xml b/plugin/portForwarding/pom.xml index bdcade2aa7e..051e60a74e7 100755 --- a/plugin/portForwarding/pom.xml +++ b/plugin/portForwarding/pom.xml @@ -4,7 +4,7 @@ org.zstack plugin - 5.3.0 + 5.4.0 portForwarding diff --git a/plugin/sdnController/pom.xml b/plugin/sdnController/pom.xml index 3d1a88f9e6d..c6fb7c3f735 100644 --- a/plugin/sdnController/pom.xml +++ b/plugin/sdnController/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/securityGroup/pom.xml b/plugin/securityGroup/pom.xml index f8983f1db39..f3651c37eba 100755 --- a/plugin/securityGroup/pom.xml +++ b/plugin/securityGroup/pom.xml @@ -4,7 +4,7 @@ org.zstack plugin - 5.3.0 + 5.4.0 securityGroup diff --git a/plugin/sftpBackupStorage/pom.xml b/plugin/sftpBackupStorage/pom.xml index 7f6b567a3f6..94f4a9a2b3a 100755 --- a/plugin/sftpBackupStorage/pom.xml +++ b/plugin/sftpBackupStorage/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 .. sftpBackupStorage diff --git a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java index 1c81f5ea44c..ec01923a4fd 100755 --- a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java +++ b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java @@ -10,7 +10,7 @@ @GlobalPropertyDefinition public class SftpBackupStorageGlobalProperty { - @GlobalProperty(name="SftpBackupStorage.agentPackageName", defaultValue = "sftpbackupstorage-5.3.0.tar.gz") + @GlobalProperty(name="SftpBackupStorage.agentPackageName", defaultValue = "sftpbackupstorage-5.4.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="SftpBackupStorage.agentPort", defaultValue = "7171") public static int AGENT_PORT; diff --git a/plugin/sharedMountPointPrimaryStorage/pom.xml b/plugin/sharedMountPointPrimaryStorage/pom.xml index a24b156f89b..20695c58859 100755 --- a/plugin/sharedMountPointPrimaryStorage/pom.xml +++ b/plugin/sharedMountPointPrimaryStorage/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/sshKeyPair/pom.xml b/plugin/sshKeyPair/pom.xml index 05fade1110a..51e8e74c9a0 100644 --- a/plugin/sshKeyPair/pom.xml +++ b/plugin/sshKeyPair/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.3.0 + 5.4.0 sshKeyPair diff --git a/plugin/sugonSdnController/pom.xml b/plugin/sugonSdnController/pom.xml index 9bc556f7980..a45fbb7638f 100644 --- a/plugin/sugonSdnController/pom.xml +++ b/plugin/sugonSdnController/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/vhost/pom.xml b/plugin/vhost/pom.xml index 322ebf27c65..a132e6b2567 100644 --- a/plugin/vhost/pom.xml +++ b/plugin/vhost/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/vip/pom.xml b/plugin/vip/pom.xml index 1ebfea74c84..ec953869f29 100755 --- a/plugin/vip/pom.xml +++ b/plugin/vip/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/virtualRouterProvider/pom.xml b/plugin/virtualRouterProvider/pom.xml index 44d52384795..a8eb705f54f 100755 --- a/plugin/virtualRouterProvider/pom.xml +++ b/plugin/virtualRouterProvider/pom.xml @@ -4,7 +4,7 @@ org.zstack plugin - 5.3.0 + 5.4.0 virtualRouterProvider diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java index 6e1cd42166b..7dad8ffaf39 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java @@ -9,7 +9,7 @@ */ @GlobalPropertyDefinition public class VirtualRouterGlobalProperty { - @GlobalProperty(name="VirtualRouter.agentPackageName", defaultValue = "virtualrouter-5.3.0.tar.gz") + @GlobalProperty(name="VirtualRouter.agentPackageName", defaultValue = "virtualrouter-5.4.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="VirtualRouter.agentPort", defaultValue = "7272") public static int AGENT_PORT; diff --git a/plugin/vxlan/pom.xml b/plugin/vxlan/pom.xml index cf98a1e8a48..8d601d112a6 100755 --- a/plugin/vxlan/pom.xml +++ b/plugin/vxlan/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/xinfini/pom.xml b/plugin/xinfini/pom.xml index 75068fd3c67..ae8dd2713b4 100644 --- a/plugin/xinfini/pom.xml +++ b/plugin/xinfini/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/plugin/zbs/pom.xml b/plugin/zbs/pom.xml index 6304721bc9c..611473553b8 100644 --- a/plugin/zbs/pom.xml +++ b/plugin/zbs/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.3.0 + 5.4.0 zbs diff --git a/pom.xml b/pom.xml index fd503a17da3..f43a599c13d 100755 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ 4.0.0 org.zstack zstack - 5.3.0 + 5.4.0 pom zstack diff --git a/portal/pom.xml b/portal/pom.xml index 494552aa75f..8a8775d4c5c 100755 --- a/portal/pom.xml +++ b/portal/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. portal diff --git a/resourceconfig/pom.xml b/resourceconfig/pom.xml index ad0a4287330..52e0a5ec525 100644 --- a/resourceconfig/pom.xml +++ b/resourceconfig/pom.xml @@ -6,7 +6,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. resourceconfig diff --git a/rest/pom.xml b/rest/pom.xml index 5cbedf16490..1a79e191c0f 100755 --- a/rest/pom.xml +++ b/rest/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/sdk/pom.xml b/sdk/pom.xml index cc00f0a8d47..72ed68dd8ab 100755 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/search/pom.xml b/search/pom.xml index cba6792904f..b765e61e0f1 100755 --- a/search/pom.xml +++ b/search/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. search diff --git a/simulator/pom.xml b/simulator/pom.xml index 7a6cfe8709f..d2e22ea6592 100755 --- a/simulator/pom.xml +++ b/simulator/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. simulator diff --git a/simulator/simulatorHeader/pom.xml b/simulator/simulatorHeader/pom.xml index 024ec5904de..8ed6ccc130d 100755 --- a/simulator/simulatorHeader/pom.xml +++ b/simulator/simulatorHeader/pom.xml @@ -4,7 +4,7 @@ simulator org.zstack - 5.3.0 + 5.4.0 .. simulatorHeader diff --git a/simulator/simulatorImpl/pom.xml b/simulator/simulatorImpl/pom.xml index 570b2c87e53..488fb34922d 100755 --- a/simulator/simulatorImpl/pom.xml +++ b/simulator/simulatorImpl/pom.xml @@ -4,7 +4,7 @@ simulator org.zstack - 5.3.0 + 5.4.0 .. simulatorImpl diff --git a/storage/pom.xml b/storage/pom.xml index 68360e375ef..d5fe306aec3 100755 --- a/storage/pom.xml +++ b/storage/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. storage diff --git a/tag/pom.xml b/tag/pom.xml index 991729e3689..1ea0b24c986 100755 --- a/tag/pom.xml +++ b/tag/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/test/pom.xml b/test/pom.xml index 9c04be4ae9b..9a40ae9864c 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -9,7 +9,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. test diff --git a/testlib/pom.xml b/testlib/pom.xml index 5e3a6f4ae41..2c8e374fce4 100644 --- a/testlib/pom.xml +++ b/testlib/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 4.0.0 diff --git a/utils/pom.xml b/utils/pom.xml index c28be564e13..55be08113bb 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.3.0 + 5.4.0 .. utils From 8f269210d56db4b5c989e90dc2b00913bf52adb0 Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Fri, 9 May 2025 15:59:29 +0800 Subject: [PATCH 358/737] [migration]: fix attach data volume to vm failed add AttachedVolumePrimaryStorageAllocatorFlow into DefaultHostAllocatorStrategyFactory Resolves/Related: ZSTAC-71738 Change-Id: I66616867656579676b6c717967677670656b7062 --- conf/springConfigXml/HostAllocatorManager.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/springConfigXml/HostAllocatorManager.xml b/conf/springConfigXml/HostAllocatorManager.xml index 3cd1245e8af..6370d63ea00 100755 --- a/conf/springConfigXml/HostAllocatorManager.xml +++ b/conf/springConfigXml/HostAllocatorManager.xml @@ -173,6 +173,7 @@ org.zstack.compute.allocator.HostStateAndHypervisorAllocatorFlow org.zstack.compute.allocator.ImageBackupStorageAllocatorFlow org.zstack.compute.allocator.HostCapacityAllocatorFlow + org.zstack.compute.allocator.AttachedVolumePrimaryStorageAllocatorFlow org.zstack.compute.allocator.HostPrimaryStorageAllocatorFlow org.zstack.compute.allocator.AvoidHostAllocatorFlow org.zstack.compute.allocator.TagAllocatorFlow From 0f8e76df14290e68f02eb9b16fb68d688e0fe1b2 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Mon, 12 May 2025 11:07:57 +0800 Subject: [PATCH 359/737] [network]: clear vm gateway arp by qga Resolves: ZSTAC-74899 Change-Id: I6178636d656b726f667a6573736d6b7178756d75 --- .../network/service/AfterApplyFlatEipExtensionPoint.java | 1 + .../org/zstack/network/service/flat/FlatEipBackend.java | 8 +++----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/header/src/main/java/org/zstack/header/network/service/AfterApplyFlatEipExtensionPoint.java b/header/src/main/java/org/zstack/header/network/service/AfterApplyFlatEipExtensionPoint.java index c013af92502..c643b7be0e4 100644 --- a/header/src/main/java/org/zstack/header/network/service/AfterApplyFlatEipExtensionPoint.java +++ b/header/src/main/java/org/zstack/header/network/service/AfterApplyFlatEipExtensionPoint.java @@ -4,4 +4,5 @@ public interface AfterApplyFlatEipExtensionPoint { void AfterApplyFlatEip(List vipUuids, String hostUuid); + default void cleanGatewayArpEntry(String vmUuid, String gatewayIp) {}; } diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipBackend.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipBackend.java index 37deaccd938..69dbf627c28 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipBackend.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipBackend.java @@ -55,10 +55,7 @@ import javax.persistence.Tuple; import javax.persistence.TypedQuery; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import static java.util.Arrays.asList; @@ -684,7 +681,8 @@ public void run(MessageReply reply) { } for (AfterApplyFlatEipExtensionPoint ext : pluginRgty.getExtensionList(AfterApplyFlatEipExtensionPoint.class)) { - ext.AfterApplyFlatEip(asList(struct.getVip().getUuid()), hostUuid); + ext.AfterApplyFlatEip(Collections.singletonList(struct.getVip().getUuid()), hostUuid); + ext.cleanGatewayArpEntry(struct.getNic().getVmInstanceUuid(), struct.getGuestIp().getGateway()); } completion.success(); From aa8d3b2e2bddf0c89032c80dd85be0157eab7216 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Wed, 23 Apr 2025 18:56:10 +0800 Subject: [PATCH 360/737] [network]: refactor ovn sync flow Resolves: ZSTAC-74371 Change-Id: I6d68697970726b64617170626879716a68667169 --- conf/db/upgrade/V5.4.0__schema.sql | 8 ++++++++ conf/persistence.xml | 1 + .../header/network/l2/L2NetworkConstant.java | 3 +++ .../zstack/header/network/l3/L3NetworkAO.java | 11 ++++++++++ .../header/network/l3/L3NetworkAO_.java | 1 + .../header/network/l3/L3NetworkInventory.java | 12 +++++++++++ .../network/l3/L3NetworkSequenceNumberVO.java | 20 +++++++++++++++++++ .../network/service/SdnControllerDhcp.java | 12 ++++++++++- .../org/zstack/network/l3/L3BasicNetwork.java | 4 ++-- .../network/l3/L3NetworkManagerImpl.java | 3 ++- .../network/l3/NormalIpRangeFactory.java | 2 +- .../network/service/flat/FlatDhcpBackend.java | 2 +- .../sdnController/SdnControllerBase.java | 10 ++++++---- .../zstack/sdnController/SdnControllerL2.java | 3 ++- .../securitygroup/SecurityGroupInventory.java | 6 ++---- .../securitygroup/SecurityGroupManager.java | 3 ++- .../SecurityGroupManagerImpl.java | 20 +++++++++++++++++++ .../securitygroup/SecurityGroupTo.java | 9 +++++++++ .../org/zstack/sdk/L3NetworkInventory.java | 8 ++++++++ .../zstack/sdk/SecurityGroupInventory.java | 8 ++++++++ .../java/org/zstack/testlib/EnvSpec.groovy | 2 +- 21 files changed, 131 insertions(+), 17 deletions(-) create mode 100644 header/src/main/java/org/zstack/header/network/l3/L3NetworkSequenceNumberVO.java diff --git a/conf/db/upgrade/V5.4.0__schema.sql b/conf/db/upgrade/V5.4.0__schema.sql index e69de29bb2d..1ffadcf6d3b 100644 --- a/conf/db/upgrade/V5.4.0__schema.sql +++ b/conf/db/upgrade/V5.4.0__schema.sql @@ -0,0 +1,8 @@ +CREATE TABLE `zstack`.`L3NetworkSequenceNumberVO` ( + `id` int unsigned NOT NULL UNIQUE AUTO_INCREMENT, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE `zstack`.`L3NetworkEO` ADD COLUMN `internalId` INT(32) unsigned DEFAULT 0; +DROP VIEW IF EXISTS `zstack`.`L3NetworkVO`; +CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, internalId, description, state, type, zoneUuid, l2NetworkUuid, `system`, dnsDomain, createDate, lastOpDate, category, ipVersion, enableIPAM, isolated FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; \ No newline at end of file diff --git a/conf/persistence.xml b/conf/persistence.xml index 8cefd20ca32..574b57cfb14 100755 --- a/conf/persistence.xml +++ b/conf/persistence.xml @@ -214,5 +214,6 @@ org.zstack.kvm.xmlhook.XmlHookVO org.zstack.kvm.xmlhook.XmlHookVmInstanceRefVO org.zstack.log.server.LogServerVO + org.zstack.header.network.l3.L3NetworkSequenceNumberVO diff --git a/header/src/main/java/org/zstack/header/network/l2/L2NetworkConstant.java b/header/src/main/java/org/zstack/header/network/l2/L2NetworkConstant.java index 23cfdf462cb..4e834ccb96d 100755 --- a/header/src/main/java/org/zstack/header/network/l2/L2NetworkConstant.java +++ b/header/src/main/java/org/zstack/header/network/l2/L2NetworkConstant.java @@ -56,4 +56,7 @@ public interface L2NetworkConstant { public static final String LACP_MODE_OFF = "off"; public static final String LACP_MODE_ACTIVE = "active"; public static final String LACP_MODE_PASSIVE = "passive"; + + public static final Integer VLAN_ID_MAX = 4095; + public static final Integer VXLAN_ID_MAX = 16777215; } diff --git a/header/src/main/java/org/zstack/header/network/l3/L3NetworkAO.java b/header/src/main/java/org/zstack/header/network/l3/L3NetworkAO.java index 8c34d2f40e4..52050b4ddd9 100755 --- a/header/src/main/java/org/zstack/header/network/l3/L3NetworkAO.java +++ b/header/src/main/java/org/zstack/header/network/l3/L3NetworkAO.java @@ -16,6 +16,9 @@ public class L3NetworkAO extends ResourceVO { @Index private String name; + @Column + private Integer internalId; + @Column private String description; @@ -175,4 +178,12 @@ public Boolean getIsolated() { public void setIsolated(Boolean isolated) { this.isolated = isolated; } + + public Integer getInternalId() { + return internalId; + } + + public void setInternalId(Integer internalId) { + this.internalId = internalId; + } } diff --git a/header/src/main/java/org/zstack/header/network/l3/L3NetworkAO_.java b/header/src/main/java/org/zstack/header/network/l3/L3NetworkAO_.java index 9cc55edca44..8268dc4fe3a 100755 --- a/header/src/main/java/org/zstack/header/network/l3/L3NetworkAO_.java +++ b/header/src/main/java/org/zstack/header/network/l3/L3NetworkAO_.java @@ -9,6 +9,7 @@ @StaticMetamodel(L3NetworkAO.class) public class L3NetworkAO_ extends ResourceVO_ { public static volatile SingularAttribute name; + public static volatile SingularAttribute internalId; public static volatile SingularAttribute type; public static volatile SingularAttribute system; public static volatile SingularAttribute state; diff --git a/header/src/main/java/org/zstack/header/network/l3/L3NetworkInventory.java b/header/src/main/java/org/zstack/header/network/l3/L3NetworkInventory.java index 6927c3ee044..f1662f6421f 100755 --- a/header/src/main/java/org/zstack/header/network/l3/L3NetworkInventory.java +++ b/header/src/main/java/org/zstack/header/network/l3/L3NetworkInventory.java @@ -85,6 +85,9 @@ public class L3NetworkInventory implements Serializable { * @desc max length of 255 characters */ private String name; + + private Integer internalId; + /** * @desc max length of 2048 characters */ @@ -162,6 +165,7 @@ public class L3NetworkInventory implements Serializable { public static L3NetworkInventory valueOf(L3NetworkVO vo) { L3NetworkInventory inv = new L3NetworkInventory(); inv.setUuid(vo.getUuid()); + inv.setInternalId(vo.getInternalId()); inv.setCreateDate(vo.getCreateDate()); inv.setDescription(vo.getDescription()); inv.setL2NetworkUuid(vo.getL2NetworkUuid()); @@ -430,4 +434,12 @@ public boolean enableIpAddressAllocation() { return false; } + + public Integer getInternalId() { + return internalId; + } + + public void setInternalId(Integer internalId) { + this.internalId = internalId; + } } diff --git a/header/src/main/java/org/zstack/header/network/l3/L3NetworkSequenceNumberVO.java b/header/src/main/java/org/zstack/header/network/l3/L3NetworkSequenceNumberVO.java new file mode 100644 index 00000000000..b388eebff63 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/l3/L3NetworkSequenceNumberVO.java @@ -0,0 +1,20 @@ +package org.zstack.header.network.l3; + +import javax.persistence.*; + +@Entity +@Table +public class L3NetworkSequenceNumberVO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column + private long id; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } +} diff --git a/header/src/main/java/org/zstack/header/network/service/SdnControllerDhcp.java b/header/src/main/java/org/zstack/header/network/service/SdnControllerDhcp.java index 1a14f3f6b68..065d90e17d9 100644 --- a/header/src/main/java/org/zstack/header/network/service/SdnControllerDhcp.java +++ b/header/src/main/java/org/zstack/header/network/service/SdnControllerDhcp.java @@ -24,12 +24,22 @@ public interface SdnControllerDhcp { /** * 启用指定 L3 网络的 DHCP 服务 + * @param l3_min L3 网络索引 + * @param l3_max L3 网络索引 * @param invs L3 网络清单列表 * @param sync 是否同步操作 * @param completion 操作完成后的回调 * */ - void enableDhcp(List invs, boolean sync, Completion completion); + void enableDhcp(long l3Min, long l3Max, List invs, boolean sync, Completion completion); + + /** + * 启用指定 L3 网络的 DHCP 服务 + * @param invs L3 网络清单列表 + * @param completion 操作完成后的回调 + * */ + + void enableDhcp(List invs, Completion completion); /** * 禁用指定 L3 网络的 DHCP 服务 diff --git a/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java b/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java index d1bc69cfd9a..55e316c0ab2 100755 --- a/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java +++ b/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java @@ -1126,7 +1126,7 @@ public void run(FlowTrigger trigger, Map data) { return; } - sdnDhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(self)), false, new Completion(trigger) { + sdnDhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(self)), new Completion(trigger) { @Override public void success() { trigger.next(); @@ -1244,7 +1244,7 @@ public void run(FlowTrigger trigger, Map data) { return; } - sdnDhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(self)), false, new Completion(trigger) { + sdnDhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(self)), new Completion(trigger) { @Override public void success() { trigger.next(); diff --git a/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java b/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java index 2e6625f7ea6..2037e0eaf0f 100755 --- a/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java +++ b/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java @@ -177,7 +177,7 @@ public void run(FlowTrigger trigger, Map data) { return; } - dhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(l3Vo)), false, new Completion(trigger) { + dhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(l3Vo)), new Completion(trigger) { @Override public void success() { trigger.next(); @@ -520,6 +520,7 @@ private void handle(APICreateL3NetworkMsg msg) { } else { vo.setIpVersion(IPv6Constants.IPv4); } + vo.setInternalId((int)dbf.generateSequenceNumber(L3NetworkSequenceNumberVO.class)); L3NetworkFactory factory = getL3NetworkFactory(L3NetworkType.valueOf(msg.getType())); L3NetworkInventory inv = new SQLBatchWithReturn() { diff --git a/network/src/main/java/org/zstack/network/l3/NormalIpRangeFactory.java b/network/src/main/java/org/zstack/network/l3/NormalIpRangeFactory.java index c867448e0f0..e373421a89d 100644 --- a/network/src/main/java/org/zstack/network/l3/NormalIpRangeFactory.java +++ b/network/src/main/java/org/zstack/network/l3/NormalIpRangeFactory.java @@ -125,7 +125,7 @@ public void run(FlowTrigger trigger, Map data) { return; } - sdnDhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(l3vo)), false, new Completion(trigger) { + sdnDhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(l3vo)), new Completion(trigger) { @Override public void success() { trigger.next(); diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java index d49e7a3b27a..2300f17cae2 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java @@ -369,7 +369,7 @@ public void run(FlowTrigger trigger, Map data) { } sdnDhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(l3VO)), - false, new Completion(trigger) { + new Completion(trigger) { @Override public void success() { trigger.next(); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java index 452caab50df..4de06d6eaf7 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java @@ -41,6 +41,7 @@ import javax.persistence.Tuple; import java.lang.reflect.Type; import java.util.*; +import java.util.stream.Collectors; import static java.util.Arrays.asList; import static org.zstack.core.Platform.argerr; @@ -577,7 +578,8 @@ public void done(ErrorCodeList errorCodeList) { @Override public void run(FlowTrigger trigger, Map data) { SdnControllerL2 sdnControllerL2 = getSdnControllerL2(); - List l2Uuids = sdnControllerL2.getL2NetworkOfSdnController(); + List l2Tuples = sdnControllerL2.getL2NetworkOfSdnController(); + List l2Uuids = l2Tuples.stream().map(t -> t.get(0, String.class)).collect(Collectors.toList()); if (l2Uuids.isEmpty()) { trigger.next(); return; @@ -678,15 +680,15 @@ public void done(ErrorCodeList errorCodeList) { @Override public void run(FlowTrigger trigger, Map data) { - controller.deleteSdnController(msg, SdnControllerInventory.valueOf(self), new Completion(completion) { + controller.deleteSdnController(msg, SdnControllerInventory.valueOf(self), new Completion(trigger) { @Override public void success() { - completion.success(); + trigger.next(); } @Override public void fail(ErrorCode errorCode) { - completion.fail(errorCode); + trigger.fail(errorCode); } }); } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java index 79bbdb1ecaf..812562148df 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java @@ -9,6 +9,7 @@ import org.zstack.sdnController.header.SdnVlanRange; import org.zstack.sdnController.header.SdnVniRange; +import javax.persistence.Tuple; import java.util.ArrayList; import java.util.List; @@ -28,7 +29,7 @@ public interface SdnControllerL2 { List getVniRange(SdnControllerInventory controller); List getVlanRange(SdnControllerInventory controller); - default List getL2NetworkOfSdnController() { return new ArrayList<>();}; + default List getL2NetworkOfSdnController() { return new ArrayList<>();}; default void addVmNics(List nics, Completion completion) {completion.success();}; default void removeVmNics(List nics, Completion completion) {completion.success();}; diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupInventory.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupInventory.java index 8671f0c9ef2..f99064771d2 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupInventory.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupInventory.java @@ -102,10 +102,8 @@ public class SecurityGroupInventory { * @desc last time this resource gets operated */ private Timestamp lastOpDate; - /** - * @ignore - */ - @APINoSee + + private long internalId; /** * @desc diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManager.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManager.java index bfc1ccf1a4a..e02b5a6934e 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManager.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManager.java @@ -1,6 +1,7 @@ package org.zstack.network.securitygroup; -import org.zstack.header.Service; +import java.util.List; public interface SecurityGroupManager { + VmNicSecurityGroupTo getVmNicSecurityGroupRules(List sgUuids); } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java index cee18bd8eb6..8fbc1e0181d 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java @@ -454,6 +454,8 @@ public VmNicSecurityGroupTo calculateVmNicSecurityGroupTO() { SecurityGroupVO vo = dbf.findByUuid(uuid, SecurityGroupVO.class); group.setSecurityGroupUuid(uuid); group.setSecurityGroupName(vo.getName()); + int internalId = (int)vo.getInternalId(); + group.setInternalId(internalId); group.setSecurityGroupVmIps(getVmIpsBySecurityGroup(uuid, IPv6Constants.IPv4)); group.setSecurityGroupVmIp6s(getVmIpsBySecurityGroup(uuid, IPv6Constants.IPv6)); @@ -629,6 +631,24 @@ private void handleLocalMessage(Message msg) { } } + @Override + public VmNicSecurityGroupTo getVmNicSecurityGroupRules(List sgUuids) { + RuleCalculator cal = new RuleCalculator(); + cal.sgStates = Collections.singletonList(SecurityGroupState.Enabled); + cal.securityGroupUuids = sgUuids; + cal.vmNicUuids = Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.vmNicUuid) + .in(VmNicSecurityGroupRefVO_.securityGroupUuid, sgUuids) + .listValues(); + cal.vmNicUuids = cal.vmNicUuids.stream().distinct().collect(Collectors.toList()); + if (cal.vmNicUuids.isEmpty()) { + VmNicSecurityGroupTo nicTo = cal.calculateVmNicSecurityGroupTO(); + return nicTo; + } + + return cal.calculateVmNicSecurityGroupTO(); + } + private void sdnRefreshVmNicsDefaultRule(SecurityGroupSdnBackend sdnBackend, List vmNicUuids, Completion completion) { RuleCalculator cal = new RuleCalculator(); cal.vmNicUuids = vmNicUuids; diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupTo.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupTo.java index fec19f6bf09..141e53798c8 100644 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupTo.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupTo.java @@ -8,6 +8,7 @@ public class SecurityGroupTo { public static final String ACTION_CODE_DELETE_CHAIN = "deleteChain"; private String securityGroupUuid; private String securityGroupName; + private Integer internalId; private List securityGroupVmIps = new ArrayList<>(); private List securityGroupVmIp6s = new ArrayList<>(); private String actionCode; @@ -29,6 +30,14 @@ public void setSecurityGroupName(String securityGroupName) { this.securityGroupName = securityGroupName; } + public Integer getInternalId() { + return internalId; + } + + public void setInternalId(Integer internalId) { + this.internalId = internalId; + } + public List getSecurityGroupVmIps() { return securityGroupVmIps; } diff --git a/sdk/src/main/java/org/zstack/sdk/L3NetworkInventory.java b/sdk/src/main/java/org/zstack/sdk/L3NetworkInventory.java index efdf3b27278..3a6a49902a6 100644 --- a/sdk/src/main/java/org/zstack/sdk/L3NetworkInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/L3NetworkInventory.java @@ -20,6 +20,14 @@ public java.lang.String getName() { return this.name; } + public java.lang.Integer internalId; + public void setInternalId(java.lang.Integer internalId) { + this.internalId = internalId; + } + public java.lang.Integer getInternalId() { + return this.internalId; + } + public java.lang.String description; public void setDescription(java.lang.String description) { this.description = description; diff --git a/sdk/src/main/java/org/zstack/sdk/SecurityGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/SecurityGroupInventory.java index 8842a4c6259..df994d41f2b 100644 --- a/sdk/src/main/java/org/zstack/sdk/SecurityGroupInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/SecurityGroupInventory.java @@ -68,6 +68,14 @@ public java.sql.Timestamp getLastOpDate() { return this.lastOpDate; } + public long internalId; + public void setInternalId(long internalId) { + this.internalId = internalId; + } + public long getInternalId() { + return this.internalId; + } + public java.util.List rules; public void setRules(java.util.List rules) { this.rules = rules; diff --git a/testlib/src/main/java/org/zstack/testlib/EnvSpec.groovy b/testlib/src/main/java/org/zstack/testlib/EnvSpec.groovy index 66c73314585..d22dd720dc3 100755 --- a/testlib/src/main/java/org/zstack/testlib/EnvSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/EnvSpec.groovy @@ -707,7 +707,7 @@ class EnvSpec extends ApiHelper implements Node { "EventRecordsVO", "AuditsVO", "AlarmRecordsVO", "VmCrashHistoryVO", "EncryptionIntegrityVO", "FileIntegrityVerificationVO", "EncryptEntityMetadataVO", "VmInstanceDeviceAddressGroupVO", "HostOsCategoryVO", "KvmHostHypervisorMetadataVO", "HaStrategyConditionVO", "SystemTagVO", "ConsoleProxyAgentVO", "ConsoleProxyVO", "XmlHookVO", "SSOServerTokenVO", - "HostNetworkLabelVO"]) { + "HostNetworkLabelVO", "L3NetworkSequenceNumberVO"]) { return } From 1b0d42549d27d7fc7f77b72f692baccdda617657 Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Tue, 13 May 2025 17:18:13 +0800 Subject: [PATCH 361/737] [root]: upgrade `simpleclient` and `simpleclient_httpserver` jdk httpserver add default timeout (sun.net.httpserver.maxReqTime, sun.net.httpserver.maxRspTime) https://github.com/prometheus/client_java/issues/636 Resolves: ZSTAC-74384 Change-Id: I796e656c6f6f7a656571716f6d716a63796a6b71 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index f43a599c13d..dbeb5219d39 100755 --- a/pom.xml +++ b/pom.xml @@ -455,12 +455,12 @@ io.prometheus simpleclient - 0.0.26 + 0.16.0 io.prometheus simpleclient_httpserver - 0.0.26 + 0.16.0 org.influxdb From f8d17c373f5f024b8833e8218cfa0e051d462405 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Tue, 13 May 2025 18:19:07 +0800 Subject: [PATCH 362/737] [conf]: update the NULL of the hash field to unknown Resolves: ZSTAC-74994 Change-Id: I6873647a78746b6665646c746a6b6367746c6772 --- conf/db/upgrade/V4.4.0__schema.sql | 1 + conf/db/upgrade/beforeValidate.sql | 1 + 2 files changed, 2 insertions(+) diff --git a/conf/db/upgrade/V4.4.0__schema.sql b/conf/db/upgrade/V4.4.0__schema.sql index d6ac5c72dd4..9164cfccd75 100644 --- a/conf/db/upgrade/V4.4.0__schema.sql +++ b/conf/db/upgrade/V4.4.0__schema.sql @@ -1,3 +1,4 @@ +UPDATE `zstack`.`LicenseHistoryVO` SET `hash` = 'unknown' WHERE `hash` IS NULL; ALTER TABLE `zstack`.`LicenseHistoryVO` MODIFY COLUMN `hash` char(32) NOT NULL DEFAULT 'unknown'; ALTER TABLE `zstack`.`LicenseHistoryVO` ADD COLUMN `source` varchar(16) DEFAULT 'Legacy'; ALTER TABLE `zstack`.`LicenseHistoryVO` MODIFY COLUMN `source` varchar(16) NOT NULL; diff --git a/conf/db/upgrade/beforeValidate.sql b/conf/db/upgrade/beforeValidate.sql index ccca45f0fd4..803f99bd760 100644 --- a/conf/db/upgrade/beforeValidate.sql +++ b/conf/db/upgrade/beforeValidate.sql @@ -38,6 +38,7 @@ BEGIN update `zstack`.`schema_version` set `checksum`=1298863127 where `script`='V5.3.0__schema.sql' and `checksum` <> 1298863127; update `zstack`.`schema_version` set `checksum`=613548663 where `script`='V5.3.6__schema.sql' and `checksum` <> 613548663; update `zstack`.`schema_version` set `checksum`=1489363540 where `script`='V5.3.22__schema.sql' and `checksum` <> 1489363540; + update `zstack`.`schema_version` set `checksum`=1648524318 where `script`='V4.4.0__schema.sql' and `checksum` <> 681550888; END IF; END $$ From ed218b6e9fd08a13098b62758e2933a9f084949f Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Thu, 15 May 2025 11:44:44 +0800 Subject: [PATCH 363/737] [loadBalancer]: remove lb deprecated http mode remove http mode: http-tunnel, forceclose APIImpact Resolves: ZSTAC-71742 Change-Id: I71776c6f6d746f6273666461727072716a616f79 --- conf/globalConfig/lb.xml | 2 +- .../lb/APIChangeLoadBalancerListenerMsg.java | 2 +- ...ChangeLoadBalancerListenerMsgDoc_zh_cn.groovy | 2 +- .../service/lb/LoadBalancerApiInterceptor.java | 16 ---------------- .../service/lb/LoadBalancerConstants.java | 4 ++-- .../service/lb/LoadBalancerManagerImpl.java | 4 +--- .../sdk/ChangeLoadBalancerListenerAction.java | 2 +- 7 files changed, 7 insertions(+), 25 deletions(-) diff --git a/conf/globalConfig/lb.xml b/conf/globalConfig/lb.xml index 88a235ef253..5b3a9e3f5d9 100755 --- a/conf/globalConfig/lb.xml +++ b/conf/globalConfig/lb.xml @@ -81,7 +81,7 @@ loadBalancer httpMode - When mode http is turned on, HAProxy processes HTTP protocol for each request and response passing through. to choose from http-keep-alive,http-server-close,http-tunnel,httpclose,forceclose + When mode http is turned on, HAProxy processes HTTP protocol for each request and response passing through. to choose from http-keep-alive,http-server-close,httpclose http-server-close java.lang.String diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeLoadBalancerListenerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeLoadBalancerListenerMsg.java index 0376e91e610..8228f15ae1a 100644 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeLoadBalancerListenerMsg.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeLoadBalancerListenerMsg.java @@ -62,7 +62,7 @@ public class APIChangeLoadBalancerListenerMsg extends APIMessage implements Load @APIParam(numberRange = {LoadBalancerConstants.NUMBER_OF_PROCESS_MIN, LoadBalancerConstants.NUMBER_OF_PROCESS_MAX}, required = false) private Integer nbprocess; - @APIParam(validValues = {"http-keep-alive", "http-server-close", "http-tunnel", "httpclose", "forceclose"}, required = false) + @APIParam(validValues = {"http-keep-alive", "http-server-close", "httpclose"}, required = false) private String httpMode; @APIParam(validValues = {"disable", "iphash", "insert", "rewrite"}, required = false) diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeLoadBalancerListenerMsgDoc_zh_cn.groovy b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeLoadBalancerListenerMsgDoc_zh_cn.groovy index bc3830b713a..bbe5abcf884 100644 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeLoadBalancerListenerMsgDoc_zh_cn.groovy +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeLoadBalancerListenerMsgDoc_zh_cn.groovy @@ -169,7 +169,7 @@ doc { type "String" optional true since "4.1" - values ("http-keep-alive","http-server-close","http-tunnel","httpclose","forceclose") + values ("http-keep-alive","http-server-close","httpclose") } column { name "sessionPersistence" diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerApiInterceptor.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerApiInterceptor.java index 6a5a55291a4..ea1168da036 100755 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerApiInterceptor.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerApiInterceptor.java @@ -1000,11 +1000,6 @@ private void validate(APICreateLoadBalancerListenerMsg msg) { throw new ApiMessageInterceptionException(argerr("loadBalancer[%s] listener[%s] doesn't support assigning session persistence cookieName without assigning insert mode", msg.getLoadBalancerUuid(), msg.getName())); } - /*can not assign session persistence rewrite with http-keep-alive*/ - if (LoadBalancerConstants.HTTP_MODE_HTTP_TUNNEL.equals(httpMode) && LoadBalancerSessionPersistence.rewrite.toString().equals(enableSession)) { - throw new ApiMessageInterceptionException(argerr("loadBalancer[%s] listener[%s] doesn't support assigning session persistence rewrite when the http mode is http-tunnel", msg.getLoadBalancerUuid(), msg.getName())); - } - } if (LoadBalancerConstants.BALANCE_ALGORITHM_LEAST_SOURCE.equals(algorithm)) { for (String tag : msg.getSystemTags()) { @@ -1245,9 +1240,6 @@ private void validate(APIChangeLoadBalancerListenerMsg msg) { if (httpRedirectHttps && (msg.getSessionPersistence() != null && !LoadBalancerSessionPersistence.disable.toString().equals(msg.getSessionPersistence()))) { throw new ApiMessageInterceptionException(argerr("could not support both HTTP redirect HTTPS and session persistence at the same time")); } - if (LoadBalancerSessionPersistence.rewrite.toString().equals(msg.getSessionPersistence()) && LoadBalancerConstants.HTTP_MODE_HTTP_TUNNEL.equals(msg.getHttpMode())) { - throw new ApiMessageInterceptionException(argerr("listener[%s] can not modifying session persistence rewrite when the http mode is http-tunnel", msg.getUuid())); - } if (LoadBalancerSessionPersistence.rewrite.toString().equals(msg.getSessionPersistence()) && msg.getHttpMode() == null) { Boolean httpModeTunnel = Q.New(SystemTagVO.class).eq(SystemTagVO_.resourceType, LoadBalancerListenerVO.class.getSimpleName()) .eq(SystemTagVO_.tag, "httpMode::http-tunnel") @@ -1256,14 +1248,6 @@ private void validate(APIChangeLoadBalancerListenerMsg msg) { throw new ApiMessageInterceptionException(argerr("listener[%s] can not modifying session persistence rewrite when the http mode is http-tunnel", msg.getUuid())); } } - if (LoadBalancerConstants.HTTP_MODE_HTTP_TUNNEL.equals(msg.getHttpMode()) && msg.getSessionPersistence() == null) { - Boolean cookieRewrite = Q.New(SystemTagVO.class).eq(SystemTagVO_.resourceType, LoadBalancerListenerVO.class.getSimpleName()) - .eq(SystemTagVO_.tag, "sessionPersistence::rewrite") - .eq(SystemTagVO_.resourceUuid, listener.getUuid()).isExists(); - if (cookieRewrite) { - throw new ApiMessageInterceptionException(argerr("listener[%s] can not modifying httpMode http-tunnel when the session persistence is rewrite", msg.getUuid())); - } - } } /*can not assign session persistence iphash without source algorithm*/ diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerConstants.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerConstants.java index 775dc21b9c8..fe147c11cf4 100755 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerConstants.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerConstants.java @@ -32,8 +32,10 @@ public class LoadBalancerConstants { public static final String HTTP_MODE_HTTP_KEEP_ALIVE = "http-keep-alive"; public static final String HTTP_MODE_HTTP_SERVER_CLOSE = "http-server-close"; + @Deprecated public static final String HTTP_MODE_HTTP_TUNNEL = "http-tunnel"; public static final String HTTP_MODE_HTTPCLOSE = "httpclose"; + @Deprecated public static final String HTTP_MODE_FORCECLOSE = "forceclose"; public static enum HealthCheckMothod { @@ -132,9 +134,7 @@ public String toString() { HTTP_MODES.add(HTTP_MODE_HTTP_KEEP_ALIVE); HTTP_MODES.add(HTTP_MODE_HTTP_SERVER_CLOSE); - HTTP_MODES.add(HTTP_MODE_HTTP_TUNNEL); HTTP_MODES.add(HTTP_MODE_HTTPCLOSE); - HTTP_MODES.add(HTTP_MODE_FORCECLOSE); } public static enum Param { diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerManagerImpl.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerManagerImpl.java index 7ae3f9aa15d..a250c07afcd 100755 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerManagerImpl.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerManagerImpl.java @@ -489,9 +489,7 @@ private void installConfigValidateExtension(){ public void validateGlobalConfig(String category, String name, String oldValue, String value) throws GlobalConfigException { List httpModes = new ArrayList<>(Arrays.asList("http-keep-alive", "http-server-close", - "http-tunnel", - "httpclose", - "forceclose")); + "httpclose")); if (!httpModes.contains(value)) { throw new GlobalConfigException(String.format("%s must be in %s", LoadBalancerGlobalConfig.HTTP_MODE.getName(),String.join(", ",httpModes))); diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeLoadBalancerListenerAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeLoadBalancerListenerAction.java index 5e361df9267..4c88a13d4e4 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeLoadBalancerListenerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeLoadBalancerListenerAction.java @@ -70,7 +70,7 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {1L,64L}, noTrim = false) public java.lang.Integer nbprocess; - @Param(required = false, validValues = {"http-keep-alive","http-server-close","http-tunnel","httpclose","forceclose"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"http-keep-alive","http-server-close","httpclose"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String httpMode; @Param(required = false, validValues = {"disable","iphash","insert","rewrite"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) From e7e3f0c4a7e37534a35aa3cc8427ab736b7bc9ef Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Mon, 31 Mar 2025 15:34:15 +0800 Subject: [PATCH 364/737] [guesttools]: support vm independent config sync support vm independent config ip netmask without gateway Resolves: ZSTAC-73956 Change-Id: I6868776c5a1bde0f6c8e4b7489abda8af3471b2e --- .../org/zstack/network/service/NetworkServiceHelper.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/network/src/main/java/org/zstack/network/service/NetworkServiceHelper.java b/network/src/main/java/org/zstack/network/service/NetworkServiceHelper.java index 4047e7a99d9..2347ea2ff2f 100644 --- a/network/src/main/java/org/zstack/network/service/NetworkServiceHelper.java +++ b/network/src/main/java/org/zstack/network/service/NetworkServiceHelper.java @@ -11,6 +11,14 @@ public class NetworkServiceHelper { public static class HostRouteInfo { public String prefix; public String nexthop; + + @Override + public String toString() { + return "HostRouteInfo{" + + "prefix='" + prefix + '\'' + + ", nexthop='" + nexthop + '\'' + + '}'; + } } public static List getL3NetworkHostRoute(String l3NetworkUuid){ From c7732bd5a59815accb04c76236f79d32df036197 Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Fri, 16 May 2025 16:32:34 +0800 Subject: [PATCH 365/737] [sns]: support email ssl test connection Resolves: ZSTAC-74969 Change-Id: I616e6c6261637963786461796d65796864756368 --- .../sdk/sns/platform/email/ValidateSNSEmailPlatformAction.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/ValidateSNSEmailPlatformAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/ValidateSNSEmailPlatformAction.java index 6638ecc9d7c..5b0914bc88f 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/ValidateSNSEmailPlatformAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/ValidateSNSEmailPlatformAction.java @@ -40,6 +40,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String password; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String encryptType; + @Param(required = false) public java.util.List systemTags; From 9b48598f715997a3cdf6522b4fae21bc77b79ba4 Mon Sep 17 00:00:00 2001 From: J M Date: Fri, 13 Dec 2024 17:00:09 +0800 Subject: [PATCH 366/737] [sdk]: support multi client config sdk config can be override by function param. Resolves: ZSTAC-71887 Change-Id: I746d686167626d666f79666b79747179796f686f --- .../main/java/org/zstack/sdk/ZSClient.java | 50 ++++++++++++----- .../core/config/GlobalConfigCase.groovy | 54 ++++++++++++++++--- 2 files changed, 85 insertions(+), 19 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/ZSClient.java b/sdk/src/main/java/org/zstack/sdk/ZSClient.java index d62e2fcbd64..025c9046d51 100755 --- a/sdk/src/main/java/org/zstack/sdk/ZSClient.java +++ b/sdk/src/main/java/org/zstack/sdk/ZSClient.java @@ -9,6 +9,7 @@ import com.google.gson.JsonParseException; import okhttp3.*; import org.apache.commons.codec.binary.Base64; +import org.springframework.lang.NonNull; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; @@ -128,19 +129,18 @@ public static ZSConfig getConfig() { public static void configure(ZSConfig c) { config = c; + http = buildHttpClient(c); + } - if (c.readTimeout != null || c.writeTimeout != null) { - OkHttpClient.Builder b = new OkHttpClient.Builder(); - - if (c.readTimeout != null) { - b.readTimeout(c.readTimeout, TimeUnit.MILLISECONDS); - } - if (c.writeTimeout != null) { - b.writeTimeout(c.writeTimeout, TimeUnit.MILLISECONDS); - } - - http = b.build(); + private static OkHttpClient buildHttpClient(ZSConfig c) { + OkHttpClient.Builder b = new OkHttpClient.Builder(); + if (c.readTimeout != null) { + b.readTimeout(c.readTimeout, TimeUnit.MILLISECONDS); } + if (c.writeTimeout != null) { + b.writeTimeout(c.writeTimeout, TimeUnit.MILLISECONDS); + } + return b.build(); } public static void webHookCallback(HttpServletRequest req, HttpServletResponse rsp) { @@ -213,15 +213,28 @@ static class Api { RestInfo info; InternalCompletion completion; String jobUuid = UUID.randomUUID().toString().replaceAll("-", ""); + ZSConfig config; + OkHttpClient http; private ApiResult resultFromWebHook; Api(AbstractAction action) { + this(action, ZSClient.config); + } + + Api(AbstractAction action, ZSConfig config) { this.action = action; info = action.getRestInfo(); if (action.apiId != null) { jobUuid = action.apiId; } + + this.config = config != null ? config : ZSClient.config; + if (this.config == ZSClient.config) { + this.http = ZSClient.http; + } else { + this.http = buildHttpClient(this.config); + } } void wakeUpFromWebHook(ApiResult res) { @@ -317,9 +330,9 @@ ApiResult doCall() { } if (response.code() == 200 || response.code() == 204) { + waittingApis.remove(jobUuid); return writeApiResult(response); } else if (response.code() == 202) { - if (config.webHook != null) { return webHookResult(); } else { @@ -578,7 +591,7 @@ private ApiResult pollResult(Response response) throws IOException { String configHost = String.format("%s:%s", config.getHostname(), config.getPort()); if (!pollingUrl.contains(configHost)) { - String splitRegex = "/zstack/v1/api-jobs"; + String splitRegex = Boolean.parseBoolean(System.getProperty("unitTestOn")) ? "/v1/api-jobs" : "/zstack/v1/api-jobs"; pollingUrl = String.format("http://%s%s%s", configHost, splitRegex ,pollingUrl.split(splitRegex)[1]); } @@ -599,6 +612,9 @@ private void asyncPollResult(final String url) { final long i = this.getInterval(); final Object sessionId = action.getParameterValue(Constants.SESSION_ID); + final Object accessKeyId = action.getParameterValue(Constants.ACCESS_KEY_KEYID); + final Object accessKeySecret = action.getParameterValue(Constants.ACCESS_KEY_KEY_SECRET); + final Object requestIp = action.getParameterValue(Constants.REQUEST_IP); final Timer timer = new Timer(); @@ -782,6 +798,14 @@ public static void call(AbstractAction action, InternalCompletion completion) { new Api(action).call(completion); } + public static void callWithConfig(AbstractAction action, @NonNull ZSConfig config, InternalCompletion completion) { + new Api(action, config).call(completion); + } + + public static ApiResult callWithConfig(AbstractAction action, @NonNull ZSConfig config) { + return new Api(action, config).call(); + } + public static ApiResult call(AbstractAction action) { errorIfNotConfigured(); return new Api(action).call(); diff --git a/test/src/test/groovy/org/zstack/test/integration/core/config/GlobalConfigCase.groovy b/test/src/test/groovy/org/zstack/test/integration/core/config/GlobalConfigCase.groovy index f125a2a3247..2a953a95c9f 100755 --- a/test/src/test/groovy/org/zstack/test/integration/core/config/GlobalConfigCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/config/GlobalConfigCase.groovy @@ -1,11 +1,10 @@ package org.zstack.test.integration.core.config -import org.zstack.core.config.GlobalConfigException import org.zstack.compute.vm.VmGlobalConfig import org.zstack.core.Platform import org.zstack.core.cloudbus.EventFacade -import org.zstack.core.config.GlobalConfig import org.zstack.core.config.GlobalConfigCanonicalEvents +import org.zstack.core.config.GlobalConfigException import org.zstack.core.config.GlobalConfigFacadeImpl import org.zstack.core.config.GlobalConfigVO import org.zstack.core.config.GlobalConfigVO_ @@ -17,16 +16,17 @@ import org.zstack.core.db.UpdateQuery import org.zstack.header.vm.APICreateVmNicMsg import org.zstack.image.ImageGlobalConfig import org.zstack.kvm.KVMGlobalConfig -import org.zstack.sdk.GlobalConfigInventory -import org.zstack.sdk.UpdateGlobalConfigAction -import org.zstack.sdk.GetGlobalConfigOptionsResult +import org.zstack.sdk.* import org.zstack.test.integration.kvm.KvmTest import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase +import java.util.concurrent.TimeUnit + import static org.zstack.utils.CollectionDSL.e import static org.zstack.utils.CollectionDSL.map import static org.zstack.utils.StringDSL.s + /** * Created by miao on 17-5-4. */ @@ -55,6 +55,7 @@ class GlobalConfigCase extends SubCase { @Override void test() { env.create { + testSdk() testTolerateDatabaseDirtyData() testUpdateIntegerConfigWithFloatValue() testFloatPointNumberTolerance() @@ -70,6 +71,47 @@ class GlobalConfigCase extends SubCase { } } + void testSdk() { + def zone = env.inventoryByName("zone") as ZoneInventory + + int port = 8989 + String WEB_HOOK_PATH = "http://127.0.0.1:$port/sdk/webook" + + def config = new ZSConfig.Builder() + .setHostname("127.0.0.1") + .setPort(port) + .setDefaultPollingInterval(100, TimeUnit.MILLISECONDS) + .setDefaultPollingTimeout(300000, TimeUnit.MILLISECONDS) + .setReadTimeout(10, TimeUnit.MINUTES) + .setWriteTimeout(10, TimeUnit.MINUTES) + .build() + + LogInByAccountAction a = new LogInByAccountAction(); + a.accountName = "admin" + a.password = "password" + a.call(); + + a = new LogInByAccountAction(); + a.accountName = "admin" + a.password = "password" + a.call(); + + ApiResult r = ZSClient.callWithConfig(a, config) + a = new LogInByAccountAction(); + a.accountName = "admin" + a.password = "password" + a.call(); + ZSClient.callWithConfig(a, ZSClient.getConfig()) + + CreateClusterAction ca = new CreateClusterAction(); + ca.name = "cluster" + ca.zoneUuid = zone.getUuid() + ca.hypervisorType = "KVM" + ca.sessionId = adminSession() + + ZSClient.callWithConfig(ca, config) + } + void testGetConfigOptions() { testGetValidValue() testGetNumberRange() @@ -202,7 +244,7 @@ class GlobalConfigCase extends SubCase { conditions = ["category=${KVMGlobalConfig.RESERVED_MEMORY_CAPACITY.category}","name=${KVMGlobalConfig.RESERVED_MEMORY_CAPACITY.name}"] }[0] assert KVMGlobalConfig.RESERVED_MEMORY_CAPACITY.value(int.class) == 10 - + resetGlobalConfig {} From 71358f345d2e9adf8c217c70d9ce4f56e64cef68 Mon Sep 17 00:00:00 2001 From: J M Date: Wed, 14 May 2025 18:08:25 +0800 Subject: [PATCH 367/737] [kvm]: add checker for reserved ports for qemu migration ports Resolves: ZSTAC-72369 Change-Id: I71786a7467636677756c7a6e6563687175707464 --- .../src/main/java/org/zstack/kvm/KVMHost.java | 1 + .../org/zstack/kvm/KvmHostConfigChecker.java | 56 ++++++ .../org/zstack/test/utils/TestRangeSet.java | 176 +++++++++++++++++- .../main/java/org/zstack/utils/RangeSet.java | 50 ++++- 4 files changed, 280 insertions(+), 3 deletions(-) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 68e9b6fae14..8e4e253ee46 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -5662,6 +5662,7 @@ public void run(final FlowTrigger trigger, Map data) { String enableKsm = rcf.getResourceConfigValue(KVMGlobalConfig.HOST_KSM, self.getUuid(), String.class); kvmHostConfigChecker.setRequireKsmCheck(enableKsm); + kvmHostConfigChecker.setRequireReservePorts("49152-49215"); deployArguments.setIsEnableKsm(enableKsm); if (NetworkGlobalProperty.BRIDGE_DISABLE_IPTABLES) { diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KvmHostConfigChecker.java b/plugin/kvm/src/main/java/org/zstack/kvm/KvmHostConfigChecker.java index 6184933f5e2..79709692a12 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KvmHostConfigChecker.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KvmHostConfigChecker.java @@ -1,13 +1,17 @@ package org.zstack.kvm; +import org.apache.logging.log4j.util.Strings; import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Configurable; import org.zstack.core.ansible.AnsibleChecker; +import org.zstack.utils.RangeSet; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; import org.zstack.utils.ssh.Ssh; import org.zstack.utils.ssh.SshResult; +import java.util.Objects; + @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class KvmHostConfigChecker implements AnsibleChecker { private static final CLogger logger = Utils.getLogger(KvmHostConfigChecker.class); @@ -17,10 +21,15 @@ public class KvmHostConfigChecker implements AnsibleChecker { private String privateKey; private String targetIp; private String requireKsmCheck; + private String requireReservePorts; private int sshPort = 22; @Override public boolean needDeploy() { + return needDeployKsmCheck() || needDeployReservePorts(); + } + + private boolean needDeployKsmCheck() { if ("none".equals(requireKsmCheck)) { return false; } @@ -61,6 +70,45 @@ public boolean needDeploy() { return true; } + private boolean needDeployReservePorts() { + if (Strings.isEmpty(requireReservePorts)) { + return false; + } + + Ssh ssh = new Ssh(); + ssh.setUsername(username).setPrivateKey(privateKey) + .setPassword(password).setPort(sshPort) + .setHostname(targetIp); + try { + ssh.sudoCommand("cat /proc/sys/net/ipv4/ip_local_reserved_ports"); + SshResult ret = ssh.setTimeout(60).runAndClose(); + if (ret.getReturnCode() != 0) { + logger.warn(String.format("exec ssh command failed, return code: %d, stdout: %s, stderr: %s", + ret.getReturnCode(), ret.getStdout(), ret.getStderr())); + return true; + } + String reservedPorts = ret.getStdout(); + RangeSet cur = RangeSet.valueOf(reservedPorts.trim()); + RangeSet expect = RangeSet.valueOf(requireReservePorts.trim()); + + for (RangeSet.Range range : cur.getRanges()) { + expect.closed(range.getStart(), range.getEnd()); + } + + cur.mergeAndSort(); + expect.mergeAndSort(); + + if (!Objects.equals(cur.getRanges(), expect.getRanges())) { + logger.debug(String.format("Reserved ports are not the same, need to deploy, current: %s, expect: %s", + cur.getRanges(), expect.getRanges())); + return true; + } + return false; + } finally { + ssh.close(); + } + } + @Override public void deleteDestFile() { @@ -106,6 +154,14 @@ public void setRequireKsmCheck(String requireKsmCheck) { this.requireKsmCheck = requireKsmCheck; } + public String getRequireReservePorts() { + return requireReservePorts; + } + + public void setRequireReservePorts(String requireReservePorts) { + this.requireReservePorts = requireReservePorts; + } + public int getSshPort() { return sshPort; } diff --git a/test/src/test/java/org/zstack/test/utils/TestRangeSet.java b/test/src/test/java/org/zstack/test/utils/TestRangeSet.java index 2821575640f..4d2c2057938 100755 --- a/test/src/test/java/org/zstack/test/utils/TestRangeSet.java +++ b/test/src/test/java/org/zstack/test/utils/TestRangeSet.java @@ -5,7 +5,9 @@ import org.zstack.utils.RangeSet; import org.zstack.utils.RangeSet.Range; -import java.util.List; +import java.util.*; + +import static org.junit.Assert.*; /** */ @@ -49,4 +51,176 @@ public void test() { r1 = ret.get(0); Assert.assertTrue(r1.is(1, 20)); } + + @Test + public void testValueOfCollection() { + // Test empty collection + Collection emptyCollection = new ArrayList<>(); + RangeSet emptyRangeSet = RangeSet.valueOf(emptyCollection); + assertTrue(emptyRangeSet.getRanges().isEmpty()); + + // Test single element + Collection singleElement = Collections.singletonList(5L); + RangeSet singleRangeSet = RangeSet.valueOf(singleElement); + assertEquals(1, singleRangeSet.getRanges().size()); + assertTrue(singleRangeSet.getRanges().get(0).is(5, 5)); + + // Test continuous elements + Collection continuousElements = Arrays.asList(1L, 2L, 3L, 4L, 5L); + RangeSet continuousRangeSet = RangeSet.valueOf(continuousElements); + assertEquals(1, continuousRangeSet.getRanges().size()); + assertTrue(continuousRangeSet.getRanges().get(0).is(1, 5)); + + // Test discontinuous elements + Collection discontinuousElements = Arrays.asList(1L, 2L, 4L, 5L, 8L); + RangeSet discontinuousRangeSet = RangeSet.valueOf(discontinuousElements); + assertEquals(3, discontinuousRangeSet.getRanges().size()); + assertTrue(discontinuousRangeSet.getRanges().get(0).is(1, 2)); + assertTrue(discontinuousRangeSet.getRanges().get(1).is(4, 5)); + assertTrue(discontinuousRangeSet.getRanges().get(2).is(8, 8)); + + // Test duplicate elements + Collection duplicateElements = Arrays.asList(1L, 1L, 2L, 3L, 3L, 5L); + RangeSet duplicateRangeSet = RangeSet.valueOf(duplicateElements); + assertEquals(2, duplicateRangeSet.getRanges().size()); + assertTrue(duplicateRangeSet.getRanges().get(0).is(1, 3)); + assertTrue(duplicateRangeSet.getRanges().get(1).is(5, 5)); + + // Test unsorted elements + Collection unsortedElements = Arrays.asList(5L, 3L, 1L, 2L, 4L); + RangeSet unsortedRangeSet = RangeSet.valueOf(unsortedElements); + assertEquals(1, unsortedRangeSet.getRanges().size()); + assertTrue(unsortedRangeSet.getRanges().get(0).is(1, 5)); + } + + @Test + public void testValueOfString() { + // Test empty string + RangeSet emptyRangeSet = RangeSet.valueOf(""); + assertTrue(emptyRangeSet.getRanges().isEmpty()); + + // Test single number + RangeSet singleNumRangeSet = RangeSet.valueOf("5"); + assertEquals(1, singleNumRangeSet.getRanges().size()); + assertTrue(singleNumRangeSet.getRanges().get(0).is(5, 5)); + + // Test single range + RangeSet singleRangeRangeSet = RangeSet.valueOf("1-5"); + assertEquals(1, singleRangeRangeSet.getRanges().size()); + assertTrue(singleRangeRangeSet.getRanges().get(0).is(1, 5)); + + // Test multiple ranges + RangeSet multiRangeRangeSet = RangeSet.valueOf("1-3,5-7,9"); + assertEquals(3, multiRangeRangeSet.getRanges().size()); + assertTrue(multiRangeRangeSet.getRanges().get(0).is(1, 3)); + assertTrue(multiRangeRangeSet.getRanges().get(1).is(5, 7)); + assertTrue(multiRangeRangeSet.getRanges().get(2).is(9, 9)); + } + + @Test + public void testMerge() { + // Test empty range set + RangeSet emptyRangeSet = new RangeSet(); + List emptyResult = emptyRangeSet.merge(); + assertTrue(emptyResult.isEmpty()); + + // Test single range + RangeSet singleRangeSet = new RangeSet().closed(1, 5); + List singleResult = singleRangeSet.merge(); + assertEquals(1, singleResult.size()); + assertTrue(singleResult.get(0).is(1, 5)); + + // Test overlapping ranges + RangeSet overlappingRangeSet = new RangeSet() + .closed(1, 5) + .closed(3, 8); + List overlappingResult = overlappingRangeSet.merge(); + assertEquals(1, overlappingResult.size()); + assertTrue(overlappingResult.get(0).is(1, 8)); + + // Test connected ranges + RangeSet connectedRangeSet = new RangeSet() + .closed(1, 5) + .closed(6, 10); + List connectedResult = connectedRangeSet.merge(); + assertEquals(1, connectedResult.size()); + assertTrue(connectedResult.get(0).is(1, 10)); + + // Test disjoint ranges (no overlap, no connection) + RangeSet disjointRangeSet = new RangeSet() + .closed(1, 5) + .closed(7, 10); + List disjointResult = disjointRangeSet.merge(); + assertEquals(2, disjointResult.size()); + assertTrue(disjointResult.get(0).is(1, 5)); + assertTrue(disjointResult.get(1).is(7, 10)); + + // Test mixed scenario with multiple ranges + RangeSet mixedRangeSet = new RangeSet() + .closed(1, 5) + .closed(4, 8) + .closed(10, 15) + .closed(16, 20) + .closed(25, 30); + List mixedResult = mixedRangeSet.merge(); + assertEquals(3, mixedResult.size()); + assertTrue(mixedResult.get(0).is(1, 8)); + assertTrue(mixedResult.get(1).is(10, 20)); + assertTrue(mixedResult.get(2).is(25, 30)); + } + + @Test + public void testMergeAndSort() { + // Test already ordered ranges + RangeSet orderedRangeSet = new RangeSet() + .closed(1, 5) + .closed(7, 10); + List orderedResult = orderedRangeSet.mergeAndSort(); + assertEquals(2, orderedResult.size()); + assertTrue(orderedResult.get(0).is(1, 5)); + assertTrue(orderedResult.get(1).is(7, 10)); + + // Test unordered ranges + RangeSet unorderedRangeSet = new RangeSet() + .closed(7, 10) + .closed(1, 5); + List unorderedResult = unorderedRangeSet.mergeAndSort(); + assertEquals(2, unorderedResult.size()); + assertTrue(unorderedResult.get(0).is(1, 5)); + assertTrue(unorderedResult.get(1).is(7, 10)); + + // Test ranges requiring both merging and sorting + RangeSet mixedRangeSet = new RangeSet() + .closed(15, 20) + .closed(5, 10) + .closed(8, 16); + List mixedResult = mixedRangeSet.mergeAndSort(); + assertEquals(1, mixedResult.size()); + assertTrue(mixedResult.get(0).is(5, 20)); + } + + @Test + public void testClosed() { + // Test normal case + RangeSet rangeSet = new RangeSet(); + RangeSet result = rangeSet.closed(1, 5); + + // Verify return value is this (for chaining) + assertSame(rangeSet, result); + + // Verify range is correctly added + assertEquals(1, rangeSet.getRanges().size()); + assertTrue(rangeSet.getRanges().get(0).is(1, 5)); + + // Test multiple calls + rangeSet.closed(7, 10); + assertEquals(2, rangeSet.getRanges().size()); + assertTrue(rangeSet.getRanges().get(0).is(1, 5)); + assertTrue(rangeSet.getRanges().get(1).is(7, 10)); + + // Test when start > end + rangeSet.closed(15, 12); + assertEquals(3, rangeSet.getRanges().size()); + assertTrue(rangeSet.getRanges().get(2).is(12, 15)); // Should automatically swap order + } } diff --git a/utils/src/main/java/org/zstack/utils/RangeSet.java b/utils/src/main/java/org/zstack/utils/RangeSet.java index a5807cdedd9..9f2c8378cf6 100755 --- a/utils/src/main/java/org/zstack/utils/RangeSet.java +++ b/utils/src/main/java/org/zstack/utils/RangeSet.java @@ -1,5 +1,7 @@ package org.zstack.utils; +import org.apache.logging.log4j.util.Strings; + import java.util.*; import java.util.stream.Collectors; @@ -69,6 +71,23 @@ public boolean is(long s, long e) { public String toString() { return String.format("[%s, %s]", start, end); } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + Range range = (Range) obj; + return start == range.start && end == range.end; + } + + @Override + public int hashCode() { + return Objects.hash(start, end); + } } private List ranges = new ArrayList(); @@ -120,13 +139,14 @@ public List merge() { } } ret.add(r); + ranges = ret; return ret; } public List mergeAndSort() { - List ret = merge(); + merge(); sort(); - return ret; + return ranges; } public void sort(){ @@ -178,6 +198,32 @@ public static RangeSet valueOf(Collection numbers) { return results; } + public static RangeSet valueOf(String str) { + RangeSet results = new RangeSet(); + if (str == null || str.isEmpty()) { + return results; + } + + for (String s : str.split(",")) { + if (Strings.isBlank(s)) { + continue; + } + String[] range = s.split("-"); + try { + if (range.length == 1) { + long value = Long.parseLong(range[0].trim()); + results.closed(value, value); + } else if (range.length == 2) { + String start = range[0].trim(); + String end = range[1].trim(); + results.closed(Long.parseLong(start), Long.parseLong(end)); + } + } catch (NumberFormatException ignore) {} + } + + return results; + } + public Set values(){ Set result = new HashSet<>(); for (Range range : ranges) { From 382742e782dedc91186fef12f501629513b502eb Mon Sep 17 00:00:00 2001 From: J M Date: Thu, 15 May 2025 15:58:40 +0800 Subject: [PATCH 368/737] [ceph]: add retry when check image size fix check size when only one MON has image Resolves: ZSTAC-75083 Change-Id: I796e6c67766867676b63746965796c686562766c --- .../ceph/backup/CephBackupStorageBase.java | 5 ++- .../backup/ceph/CephBSAddImageCase.groovy | 37 +++++++++++++++++-- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/CephBackupStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/CephBackupStorageBase.java index 3b6ee13a97c..9dba4c22ad4 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/CephBackupStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/CephBackupStorageBase.java @@ -1225,7 +1225,8 @@ protected void handle(GetLocalFileSizeOnBackupStorageMsg msg) { GetLocalFileSizeOnBackupStorageReply reply = new GetLocalFileSizeOnBackupStorageReply(); GetLocalFileSizeCmd cmd = new GetLocalFileSizeCmd(); cmd.path = msg.getUrl(); - httpCall(GET_LOCAL_FILE_SIZE, cmd, GetLocalFileSizeRsp.class, new ReturnValueCompletion(msg) { + String apiId = ThreadContext.get(Constants.THREAD_CONTEXT_API); + new HttpCaller<>(GET_LOCAL_FILE_SIZE, cmd, GetLocalFileSizeRsp.class, new ReturnValueCompletion(msg) { @Override public void fail(ErrorCode err) { reply.setError(err); @@ -1237,7 +1238,7 @@ public void success(GetLocalFileSizeRsp ret) { reply.setSize(ret.size); bus.reply(msg, reply); } - }); + }).tryNext().specifyOrder(apiId).call(); } @Override diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/backup/ceph/CephBSAddImageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/backup/ceph/CephBSAddImageCase.groovy index 65c29578d25..57802134edf 100755 --- a/test/src/test/groovy/org/zstack/test/integration/storage/backup/ceph/CephBSAddImageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/backup/ceph/CephBSAddImageCase.groovy @@ -9,17 +9,15 @@ import org.zstack.header.storage.backup.BackupStorageVO_ import org.zstack.sdk.BackupStorageInventory import org.zstack.sdk.DiskOfferingInventory import org.zstack.sdk.ImageInventory -import org.zstack.sdk.InstanceOfferingInventory +import org.zstack.sdk.SessionInventory import org.zstack.sdk.PrimaryStorageInventory import org.zstack.sdk.VolumeInventory import org.zstack.storage.ceph.backup.CephBackupStorageBase -import org.zstack.storage.ceph.backup.CephBackupStorageMonVO import org.zstack.test.integration.storage.StorageTest import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase import org.zstack.utils.data.SizeUnit import org.zstack.utils.gson.JSONObjectUtil - /** * Created by lining on 2017/3/31. */ @@ -27,6 +25,7 @@ class CephBSAddImageCase extends SubCase{ EnvSpec env int failCount = 0 final bsMonsCount = 2 + SessionInventory normalSession @Override void setup() { @@ -97,6 +96,7 @@ class CephBSAddImageCase extends SubCase{ @Override void test() { env.create { + prepareEnv() simulatorEnv() testImageBackupStorageRefVOWhenAddImage() testUploadImage() @@ -105,7 +105,30 @@ class CephBSAddImageCase extends SubCase{ } } + void prepareEnv() { + createAccount { + name = "test" + password = "password" + } + + normalSession = logInByAccount { + accountName = "test" + password = "password" + } as SessionInventory + } + void simulatorEnv() { + env.preSimulator(CephBackupStorageBase.GET_LOCAL_FILE_SIZE) { HttpEntity e -> + def cmd = JSONObjectUtil.toObject(e.body, CephBackupStorageBase.DownloadCmd.class) + if (cmd.url.startsWith("file:/")) { + if (++failCount < bsMonsCount) { + throw new Exception("on purpose") + } else { + failCount = 0 + } + } + } + env.preSimulator(CephBackupStorageBase.DOWNLOAD_IMAGE_PATH) { HttpEntity e -> def cmd = JSONObjectUtil.toObject(e.body, CephBackupStorageBase.DownloadCmd.class) if (cmd.url.startsWith("file:/")) { @@ -175,6 +198,14 @@ class CephBSAddImageCase extends SubCase{ format = ImageConstant.ISO_FORMAT_STRING } + ImageInventory newImage5 = addImage { + name = "image3" + url = "file:///my-site/foo.iso" + backupStorageUuids = [bs.uuid] + format = ImageConstant.ISO_FORMAT_STRING + sessionId = normalSession.uuid + } + assert 1 == Q.New(ImageBackupStorageRefVO.class) .eq(ImageBackupStorageRefVO_.imageUuid, newImage.uuid) .count() From f8a0dd5d06486e62c585d817d80ef7609a7c9b6c Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Thu, 15 May 2025 17:17:30 +0800 Subject: [PATCH 369/737] [virtualRouterProvider]: remove event: /appliance-vm/disconnected Resolves: ZSTAC-72876 Change-Id: I6e7773756c6466657a6a617972636b6c676e7472 --- .../zstack/appliancevm/ApplianceVmBase.java | 38 ++----------------- .../zstack/appliancevm/ApplianceVmStatus.java | 3 +- .../service/virtualrouter/VirtualRouter.java | 6 +-- 3 files changed, 7 insertions(+), 40 deletions(-) diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmBase.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmBase.java index de24b6746ff..e61227624cd 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmBase.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmBase.java @@ -430,10 +430,6 @@ protected FlowChain getStopVmWorkFlowChain(VmInstanceInventory inv) { @Override public void run(FlowTrigger trigger, Map data) { changeApplianceVmStatus(ApplianceVmStatus.Disconnected); - if (originStatus.equals(ApplianceVmStatus.Connected)) { - fireDisconnectedCanonicalEvent(operr("appliance vm %s stopped", - getSelf().getUuid())); - } trigger.next(); } @@ -468,7 +464,7 @@ protected void fireServiceUnhealthyCanonicalEvent(ErrorCode err) { data.setHealthy(false); data.setReason(err); - evtf.fire(ApplianceVmCanonicalEvents.SERVICE_UNHEALTHY_PATH, data); + evtf.fire(ApplianceVmCanonicalEvents.SERVICE_HEALTHY_PATH, data); } protected void fireServicehealthyCanonicalEvent() { @@ -498,7 +494,7 @@ protected FlowChain getDestroyVmWorkFlowChain(VmInstanceInventory inv) { ApplianceVmStatus originStatus = getSelf().getStatus(); public void run(FlowTrigger trigger, Map data) { - changeApplianceVmStatus(ApplianceVmStatus.Disconnected); + changeApplianceVmStatus(ApplianceVmStatus.Destroying); trigger.next(); } @@ -560,21 +556,12 @@ protected void provisionAfterRebootVm(VmInstanceSpec spec, NoErrorCompletion com @Override public void run(FlowTrigger trigger, Map data) { - changeApplianceVmStatus(ApplianceVmStatus.Connecting); - if (originStatus.equals(ApplianceVmStatus.Connected)) { - fireDisconnectedCanonicalEvent(operr("appliance vm %s reboot", - getSelf().getUuid())); - } + changeApplianceVmStatus(ApplianceVmStatus.Disconnected); trigger.next(); } @Override public void rollback(FlowRollback trigger, Map data) { - changeApplianceVmStatus(ApplianceVmStatus.Disconnected); - if (originStatus.equals(ApplianceVmStatus.Connected)) { - fireDisconnectedCanonicalEvent(operr("appliance vm %s reboot failed", - getSelf().getUuid())); - } trigger.rollback(); } }); @@ -640,10 +627,6 @@ public void run(FlowTrigger trigger, Map data) { @Override public void rollback(FlowRollback trigger, Map data) { changeApplianceVmStatus(ApplianceVmStatus.Disconnected); - if (originStatus.equals(ApplianceVmStatus.Connected)) { - fireDisconnectedCanonicalEvent(operr("appliance vm %s start failed", - getSelf().getUuid())); - } trigger.rollback(); } }); @@ -708,21 +691,12 @@ protected FlowChain getRebootVmWorkFlowChain(VmInstanceInventory inv) { @Override public void run(FlowTrigger trigger, Map data) { - changeApplianceVmStatus(ApplianceVmStatus.Connecting); - if (originStatus.equals(ApplianceVmStatus.Connected)) { - fireDisconnectedCanonicalEvent(operr("appliance vm %s reboot", - getSelf().getUuid())); - } + changeApplianceVmStatus(ApplianceVmStatus.Disconnected); trigger.next(); } @Override public void rollback(FlowRollback trigger, Map data) { - changeApplianceVmStatus(ApplianceVmStatus.Disconnected); - if (originStatus.equals(ApplianceVmStatus.Connected)) { - fireDisconnectedCanonicalEvent(operr("appliance vm %s reboot failed", - getSelf().getUuid())); - } trigger.rollback(); } }); @@ -781,10 +755,6 @@ public void run(FlowTrigger trigger, Map data) { @Override public void rollback(FlowRollback trigger, Map data) { changeApplianceVmStatus(ApplianceVmStatus.Disconnected); - if (originStatus.equals(ApplianceVmStatus.Connected)) { - fireDisconnectedCanonicalEvent(operr("appliance vm %s start failed", - getSelf().getUuid())); - } trigger.rollback(); } }); diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmStatus.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmStatus.java index 5c865dfb25a..363036b4650 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmStatus.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmStatus.java @@ -5,5 +5,6 @@ public enum ApplianceVmStatus { Connecting, Connected, - Disconnected + Disconnected, + Destroying } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java index 13ee9d98ed2..f321ce68f11 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java @@ -466,7 +466,7 @@ public void done(ErrorCodeList errorCodeList) { if (replies.size() == steps.size()) { changeApplianceVmStatus(ApplianceVmStatus.Disconnected); } - + bus.reply(msg, replies.get(0)); chain.next(); } @@ -922,10 +922,6 @@ public void handle(Map data) { }).error(new FlowErrorHandler(completion) { @Override public void handle(ErrorCode errCode, Map data) { - if (oldStatus == ApplianceVmStatus.Connected) { - fireDisconnectedCanonicalEvent(errCode); - } - completion.fail(errCode); } }).start(); From 4e057d5719328eb7144fff1f0662db02a7d3349f Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Thu, 22 May 2025 11:30:39 +0800 Subject: [PATCH 370/737] [virtualRouterProvider]: add hagroup uuid Resolves: ZSTAC-72373 Change-Id: I617363617962746775666f6b77696d6361787672 --- .../zstack/network/service/virtualrouter/vyos/VyosConstants.java | 1 + 1 file changed, 1 insertion(+) diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConstants.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConstants.java index d3192f7e9be..47fbf47f30c 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConstants.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConstants.java @@ -27,6 +27,7 @@ enum BootstrapInfoKey { String REPLACE_FIREWALL_WITH_IPTBALES = "SkipVyosIptables"; String HA_STATUS = "haStatus"; String CONFIG_ENABLE_VYOS = "EnableVyosCmd"; + String HA_GROUP_UUID = "haGroupUuid"; /* in old version, vpc snat is disabled in mn node, but it's not delete in vyos node, which is fix in http://jira.zstack.io/browse/ZSTAC-27851 * so when upgrade before 3.9.0.0, mn will reconnect virtual router, during reconnection, the snat rules should be deleted*/ From c71e9184464ee5f71451fa23eabe1f155986d4ab Mon Sep 17 00:00:00 2001 From: shenjin Date: Thu, 22 May 2025 16:15:35 +0800 Subject: [PATCH 371/737] [console]: get targetSchema from uri get targetSchema from uri Resolves: ZSTAC-71008 Change-Id: I6a736e6764737169766f74656b62627567766479 --- console/src/main/java/org/zstack/console/ConsoleProxyBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/console/src/main/java/org/zstack/console/ConsoleProxyBase.java b/console/src/main/java/org/zstack/console/ConsoleProxyBase.java index 18a23c6d079..4af9bbacbdb 100755 --- a/console/src/main/java/org/zstack/console/ConsoleProxyBase.java +++ b/console/src/main/java/org/zstack/console/ConsoleProxyBase.java @@ -79,7 +79,7 @@ private void doEstablishConsoleProxyConnection(ConsoleUrl consoleUrl, final Retu cmd.setTargetHostname(targetHostname); cmd.setTargetPort(targetPort); cmd.setProxyHostname("0.0.0.0"); - if (ConsoleConstants.HTTP_SCHEMA.equals(self.getTargetSchema())) { + if (ConsoleConstants.HTTP_SCHEMA.equals(targetSchema)) { cmd.setProxyPort(CoreGlobalProperty.HTTP_CONSOLE_PROXY_PORT); } else { cmd.setProxyPort(CoreGlobalProperty.CONSOLE_PROXY_PORT); From 977838b5843b2ed1c2fdebf51fc8e9760b61e1fc Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Tue, 20 May 2025 19:07:56 +0800 Subject: [PATCH 372/737] [cloudbus]: call AsyncBackup for method 'CancelablePeriodicTask.run' 1.call AsyncBackup for method 'CancelablePeriodicTask.run' 2.reply error when bus.call timeout. Resolves/Related: ZSTAC-70710 Change-Id: I6c7765646472696f7464786c6870777670647573 --- .../zstack/core/aspect/AsyncBackupAspect.aj | 17 ++++- .../zstack/core/cloudbus/CloudBusImpl3.java | 14 ++++ .../core/cloudbus/CloudBusCase.groovy | 26 +++++++ .../core/cloudbus/FakeNeedReplyMessage4.java | 6 ++ .../zstack/test/aop/TestAsyncBackup11.java | 73 +++++++++++++++++++ .../test/resources/unitTestSuiteXml/Core.xml | 1 + 6 files changed, 133 insertions(+), 4 deletions(-) create mode 100644 test/src/test/groovy/org/zstack/test/integration/core/cloudbus/FakeNeedReplyMessage4.java create mode 100644 test/src/test/java/org/zstack/test/aop/TestAsyncBackup11.java diff --git a/core/src/main/java/org/zstack/core/aspect/AsyncBackupAspect.aj b/core/src/main/java/org/zstack/core/aspect/AsyncBackupAspect.aj index 144fe8161bd..700bf48a38b 100755 --- a/core/src/main/java/org/zstack/core/aspect/AsyncBackupAspect.aj +++ b/core/src/main/java/org/zstack/core/aspect/AsyncBackupAspect.aj @@ -3,14 +3,14 @@ package org.zstack.core.aspect; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.errorcode.ErrorFacade; -import org.zstack.header.core.workflow.FlowRollback; -import org.zstack.header.errorcode.ErrorCodeList; -import org.zstack.header.errorcode.OperationFailureException; import org.zstack.core.thread.ChainTask; import org.zstack.core.thread.SyncTaskChain; -import org.zstack.header.core.workflow.FlowTrigger; import org.zstack.header.core.*; +import org.zstack.header.core.workflow.FlowRollback; +import org.zstack.header.core.workflow.FlowTrigger; import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.ErrorCodeList; +import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.message.Message; import org.zstack.utils.DebugUtils; @@ -247,4 +247,13 @@ public aspect AsyncBackupAspect { backup(completion.getBackups(), t); } } + + boolean around(org.zstack.header.core.AbstractCompletion completion) : this(completion) && execution(boolean org.zstack.core.thread.CancelablePeriodicTask+.run()) { + try { + return proceed(completion); + } catch (Throwable t) { + backup(completion.getBackups(), t); + return true; + } + } } diff --git a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java index 0d83683708a..12de539758a 100755 --- a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java +++ b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java @@ -680,6 +680,11 @@ public void run(MessageReply reply) { }); future.await(SYNC_CALL_TIMEOUT); + if (!future.isSuccess()) { + MessageReply reply = new MessageReply(); + reply.setError(future.getErrorCode()); + return reply; + } return future.getResult(); } @@ -696,6 +701,15 @@ public void run(List replies) { }); future.await(SYNC_CALL_TIMEOUT); + if (!future.isSuccess()) { + List replies = new ArrayList<>(msgs.size()); + msgs.forEach(msg -> { + MessageReply reply = new MessageReply(); + reply.setError(future.getErrorCode()); + replies.add(reply); + }); + return replies; + } return future.getResult(); } diff --git a/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/CloudBusCase.groovy b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/CloudBusCase.groovy index 44fa4def7e0..e3ab4170478 100644 --- a/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/CloudBusCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/CloudBusCase.groovy @@ -2,11 +2,13 @@ package org.zstack.test.integration.core.cloudbus import org.zstack.core.Platform import org.zstack.core.cloudbus.CloudBusCallBack +import org.zstack.core.cloudbus.CloudBusGlobalProperty import org.zstack.core.cloudbus.CloudBusIN import org.zstack.core.errorcode.ErrorFacade import org.zstack.core.thread.AsyncThread import org.zstack.header.AbstractService import org.zstack.header.errorcode.ErrorCodeList +import org.zstack.header.errorcode.SysErrors import org.zstack.header.message.Message import org.zstack.header.message.MessageReply import org.zstack.testlib.SkipTestSuite @@ -76,6 +78,8 @@ class CloudBusCase extends SubCase{ def r = new MessageReply() r.setError(errf.stringToOperationError("fake first error", [operr("origin error")])) bus.reply(msg, r) + } else if (msg instanceof FakeNeedReplyMessage4) { + // no reply } } @@ -126,6 +130,28 @@ class CloudBusCase extends SubCase{ assert r.error instanceof ErrorCodeList assert r.error.causes[0] instanceof ErrorCodeList assert r.error.causes[0].causes[0] instanceof ErrorCodeList + + CloudBusGlobalProperty.SYNC_CALL_TIMEOUT = TimeUnit.MINUTES.toMillis(1) + def msg4 = new FakeNeedReplyMessage4() + bus.makeTargetServiceIdByResourceUuid(msg4, servId, Platform.getUuid()) + def reply = bus.call(msg4) + assert !reply.isSuccess() + assert reply.getError().isError(SysErrors.TIMEOUT) + + List msgs = new ArrayList<>() + for (final def i in (1..5)) { + def m = new FakeNeedReplyMessage4() + bus.makeTargetServiceIdByResourceUuid(m, servId, Platform.getUuid()) + msgs.add(m) + } + def messageReplies = bus.call(msgs) + assert messageReplies.size() == 5 + for (final def rr in messageReplies) { + assert !rr.isSuccess() + assert rr.getError().isError(SysErrors.TIMEOUT) + } + + CloudBusGlobalProperty.SYNC_CALL_TIMEOUT = TimeUnit.MINUTES.toMillis(15) } @Override diff --git a/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/FakeNeedReplyMessage4.java b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/FakeNeedReplyMessage4.java new file mode 100644 index 00000000000..9a89029cf05 --- /dev/null +++ b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/FakeNeedReplyMessage4.java @@ -0,0 +1,6 @@ +package org.zstack.test.integration.core.cloudbus; + +import org.zstack.header.message.NeedReplyMessage; + +public class FakeNeedReplyMessage4 extends NeedReplyMessage { +} diff --git a/test/src/test/java/org/zstack/test/aop/TestAsyncBackup11.java b/test/src/test/java/org/zstack/test/aop/TestAsyncBackup11.java new file mode 100644 index 00000000000..928898ef4f9 --- /dev/null +++ b/test/src/test/java/org/zstack/test/aop/TestAsyncBackup11.java @@ -0,0 +1,73 @@ +package org.zstack.test.aop; + +import junit.framework.Assert; +import org.junit.Before; +import org.junit.Test; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.componentloader.ComponentLoader; +import org.zstack.core.thread.CancelablePeriodicTask; +import org.zstack.core.thread.ThreadFacade; +import org.zstack.header.core.Completion; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.test.BeanConstructor; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +/** + */ +public class TestAsyncBackup11 { + CLogger logger = Utils.getLogger(TestAsyncBackup11.class); + boolean success; + ComponentLoader loader; + ThreadFacade thdf; + CloudBus bus; + + @Before + public void setUp() throws Exception { + BeanConstructor con = new BeanConstructor(); + loader = con.build(); + thdf = loader.getComponent(ThreadFacade.class); + bus = loader.getComponent(CloudBus.class); + } + + @Test + public void test() throws InterruptedException { + Completion comp = new Completion(null) { + @Override + public void success() { + } + + @Override + public void fail(ErrorCode errorCode) { + success = true; + } + }; + Future task = thdf.submitCancelablePeriodicTask(new CancelablePeriodicTask(comp) { + @Override + public boolean run() { + throw new RuntimeException("on purpose"); + } + + @Override + public TimeUnit getTimeUnit() { + return TimeUnit.SECONDS; + } + + @Override + public long getInterval() { + return 3; + } + + @Override + public String getName() { + return "test"; + } + }); + + TimeUnit.SECONDS.sleep(1); + Assert.assertTrue(success); + Assert.assertTrue(task.isCancelled()); + } +} diff --git a/test/src/test/resources/unitTestSuiteXml/Core.xml b/test/src/test/resources/unitTestSuiteXml/Core.xml index 5f111b95a32..5e17ac243f0 100755 --- a/test/src/test/resources/unitTestSuiteXml/Core.xml +++ b/test/src/test/resources/unitTestSuiteXml/Core.xml @@ -122,6 +122,7 @@ + From b189eba8e9dbc63d8fcf8a3c3430e89119a8929a Mon Sep 17 00:00:00 2001 From: J M Date: Thu, 22 May 2025 17:49:19 +0800 Subject: [PATCH 373/737] [vm]: add no-converge to disable auto-converge disable auto-converge explicitly in API params. APIImpact Resolves: ZSTAC-71037 Change-Id: I6a6967746964657a6172626768736d73776f7776 --- .../org/zstack/header/vm/APIMigrateVmMsg.java | 2 +- .../header/vm/APIMigrateVmMsgDoc_zh_cn.groovy | 2 +- .../kvm/src/main/java/org/zstack/kvm/KVMHost.java | 10 ++++++---- .../main/java/org/zstack/sdk/MigrateVmAction.java | 2 +- .../zstack/sdk/PrimaryStorageMigrateVmAction.java | 2 +- .../migrate/MigrateVmFromDestitonHostCase.groovy | 15 +++++++++++---- 6 files changed, 21 insertions(+), 12 deletions(-) diff --git a/header/src/main/java/org/zstack/header/vm/APIMigrateVmMsg.java b/header/src/main/java/org/zstack/header/vm/APIMigrateVmMsg.java index 89d9fc210bc..763a5757476 100755 --- a/header/src/main/java/org/zstack/header/vm/APIMigrateVmMsg.java +++ b/header/src/main/java/org/zstack/header/vm/APIMigrateVmMsg.java @@ -69,7 +69,7 @@ public class APIMigrateVmMsg extends APIMessage implements VmInstanceMessage, Mi @APIParam(required = false) private boolean allowUnknown; - @APIParam(required = false, validValues = {"auto-converge"}) + @APIParam(required = false, validValues = {"auto-converge", "no-converge"}) private String strategy; @APIParam(required = false) diff --git a/header/src/main/java/org/zstack/header/vm/APIMigrateVmMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/vm/APIMigrateVmMsgDoc_zh_cn.groovy index a615888ea1d..6b948fc0699 100644 --- a/header/src/main/java/org/zstack/header/vm/APIMigrateVmMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/vm/APIMigrateVmMsgDoc_zh_cn.groovy @@ -65,7 +65,7 @@ doc { type "String" optional true since "3.6.0" - values ("auto-converge") + values ("auto-converge","no-converge") } column { name "systemTags" diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 68e9b6fae14..549c8966dc8 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -3050,9 +3050,11 @@ public void fail(ErrorCode errorCode) { public void run(final FlowTrigger trigger, Map data) { TaskProgressRange stage = markTaskStage(parentStage, MIGRATE_VM_STAGE); - boolean autoConverage = rcf.getResourceConfigValue(KVMGlobalConfig.MIGRATE_AUTO_CONVERGE, vmUuid, Boolean.class); - if (!autoConverage) { - autoConverage = s.strategy != null && s.strategy.equals("auto-converge"); + boolean autoConverge; + if (s.strategy != null) { + autoConverge = s.strategy.equals("auto-converge"); + } else { + autoConverge = rcf.getResourceConfigValue(KVMGlobalConfig.MIGRATE_AUTO_CONVERGE, vmUuid, Boolean.class); } boolean xbzrle = KVMGlobalConfig.MIGRATE_XBZRLE.value(Boolean.class); @@ -3064,7 +3066,7 @@ public void run(final FlowTrigger trigger, Map data) { cmd.setMigrateFromDestination(migrateFromDestination); cmd.setStorageMigrationPolicy(storageMigrationPolicy == null ? null : storageMigrationPolicy.toString()); cmd.setVmUuid(vmUuid); - cmd.setAutoConverge(autoConverage); + cmd.setAutoConverge(autoConverge); cmd.setXbzrle(xbzrle); cmd.setVdpaPaths((List) data.get("vDPA_paths")); cmd.setUseNuma(rcf.getResourceConfigValue(VmGlobalConfig.NUMA, vmUuid, Boolean.class)); diff --git a/sdk/src/main/java/org/zstack/sdk/MigrateVmAction.java b/sdk/src/main/java/org/zstack/sdk/MigrateVmAction.java index 268bdffb7e7..dac09c8977f 100644 --- a/sdk/src/main/java/org/zstack/sdk/MigrateVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/MigrateVmAction.java @@ -37,7 +37,7 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public boolean allowUnknown = false; - @Param(required = false, validValues = {"auto-converge"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"auto-converge","no-converge"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String strategy; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVmAction.java b/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVmAction.java index c54de853b69..60e8edc1025 100644 --- a/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVmAction.java @@ -46,7 +46,7 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer downTime; - @Param(required = false, validValues = {"auto-converge"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"auto-converge","no-converge"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String strategy; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/migrate/MigrateVmFromDestitonHostCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/migrate/MigrateVmFromDestitonHostCase.groovy index c42058ef4fb..5fca7dff6b2 100644 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/migrate/MigrateVmFromDestitonHostCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/migrate/MigrateVmFromDestitonHostCase.groovy @@ -5,9 +5,6 @@ import org.springframework.http.HttpEntity import org.zstack.core.db.Q import org.zstack.core.db.SQL import org.zstack.header.Constants -import org.zstack.header.host.HostStatus -import org.zstack.header.host.HostVO -import org.zstack.header.host.HostVO_ import org.zstack.header.longjob.LongJobState import org.zstack.header.longjob.LongJobVO import org.zstack.header.longjob.LongJobVO_ @@ -27,7 +24,6 @@ import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase import org.zstack.utils.data.SizeUnit import org.zstack.utils.gson.JSONObjectUtil - /** * Created by shixin.ruan on 2018/02/10. */ @@ -287,6 +283,17 @@ class MigrateVmFromDestitonHostCase extends SubCase { MigrateVmAction.Result ret = action.call() assert ret.error != null + + // test migrate disable auto-converge + KVMGlobalConfig.MIGRATE_AUTO_CONVERGE.updateValue(true) + migrateVm { + vmInstanceUuid = vm1.uuid + hostUuid = host.uuid + strategy = "no-converge" + downTime = 300 + } + + assert !cmd.autoConverge } private void migrateUnknownVm(String destHostUuid) { From d9315fc9462b4721967bf7dcc17c9eb8e3b24fbb Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Thu, 29 May 2025 15:07:51 +0800 Subject: [PATCH 374/737] [virtualRouterProvider]: add allowPasswordAuth in zvr bootstrap Resolves: ZSTAC-64632 Change-Id: I6e67797463686d797470616e6c63696f6661746b --- .../network/service/virtualrouter/vyos/VyosConstants.java | 1 + .../network/service/virtualrouter/vyos/VyosVmBaseFactory.java | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConstants.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConstants.java index 47fbf47f30c..93941c5dacc 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConstants.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConstants.java @@ -28,6 +28,7 @@ enum BootstrapInfoKey { String HA_STATUS = "haStatus"; String CONFIG_ENABLE_VYOS = "EnableVyosCmd"; String HA_GROUP_UUID = "haGroupUuid"; + String ALLOW_PASSWORD_AUTH = "allowPasswordAuth"; /* in old version, vpc snat is disabled in mn node, but it's not delete in vyos node, which is fix in http://jira.zstack.io/browse/ZSTAC-27851 * so when upgrade before 3.9.0.0, mn will reconnect virtual router, during reconnection, the snat rules should be deleted*/ diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosVmBaseFactory.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosVmBaseFactory.java index 28f0afe9581..63db32086b4 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosVmBaseFactory.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosVmBaseFactory.java @@ -294,7 +294,9 @@ public void applianceVmPrepareBootstrapInfo(VmInstanceSpec spec, Map Date: Thu, 29 May 2025 16:50:39 +0800 Subject: [PATCH 375/737] [compute]: allow same mac in different l2 Resolves: ZSTAC-74895 Change-Id: I66776b766a6175786173696a716b7a6d6a6e6676 --- .../org/zstack/compute/vm/MacOperator.java | 23 +++++++++++++++---- .../zstack/compute/vm/VmAllocateNicFlow.java | 2 +- .../compute/vm/VmInstanceApiInterceptor.java | 3 ++- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/vm/MacOperator.java b/compute/src/main/java/org/zstack/compute/vm/MacOperator.java index 95d96c6fb41..ea1c9bf1336 100644 --- a/compute/src/main/java/org/zstack/compute/vm/MacOperator.java +++ b/compute/src/main/java/org/zstack/compute/vm/MacOperator.java @@ -7,6 +7,8 @@ import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.header.errorcode.OperationFailureException; +import org.zstack.header.network.l3.L3NetworkVO; +import org.zstack.header.network.l3.L3NetworkVO_; import org.zstack.header.vm.*; import org.zstack.tag.PatternedSystemTag; import org.zstack.utils.Utils; @@ -42,9 +44,6 @@ public VmMacStruct(String l3Uuid, String mac) { } } - @Autowired - private DatabaseFacade dbf; - private PatternedSystemTag that = VmSystemTags.CUSTOM_MAC; public List getMacInfobyVmUuid(String vmUuid) { @@ -97,14 +96,30 @@ public void validateAvailableMac(String mac) { } } - public boolean checkDuplicateMac(String hypervisorType, String mac) { + public boolean checkDuplicateMac(String hypervisorType, String l3Uuid, String mac) { if (!VmInstanceConstant.KVM_HYPERVISOR_TYPE.equals(hypervisorType)) { return false; } + L3NetworkVO l3vo = Q.New(L3NetworkVO.class) + .eq(L3NetworkVO_.uuid, l3Uuid).find(); + if (l3vo == null) { + return false; + } + + List l3Uuids = Q.New(L3NetworkVO.class) + .select(L3NetworkVO_.uuid) + .eq(L3NetworkVO_.l2NetworkUuid, l3vo.getL2NetworkUuid()) + .listValues(); + + if (l3Uuids.isEmpty()) { + return false; + } + return Q.New(VmNicVO.class) .eq(VmNicVO_.hypervisorType, hypervisorType) .eq(VmNicVO_.mac, mac.toLowerCase()) + .in(VmNicVO_.l3NetworkUuid, l3Uuids) .notEq(VmNicVO_.state, VmNicState.disable) .isExists(); } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java index bafd101280a..2c41f63e68e 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java @@ -128,7 +128,7 @@ public void run(final FlowTrigger trigger, final Map data) { nic.setMac(mac); nic.setHypervisorType(spec.getDestHost() == null ? spec.getVmInventory().getHypervisorType() : spec.getDestHost().getHypervisorType()); - if (mo.checkDuplicateMac(nic.getHypervisorType(), nic.getMac())) { + if (mo.checkDuplicateMac(nic.getHypervisorType(), nic.getL3NetworkUuid(), nic.getMac())) { trigger.fail(operr("Duplicate mac address [%s]", nic.getMac())); return; } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceApiInterceptor.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceApiInterceptor.java index d1aa104a594..fe1f33f104c 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceApiInterceptor.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceApiInterceptor.java @@ -1091,7 +1091,8 @@ private void validate(APIChangeVmNicStateMsg msg) { VmNicVO nicVO = Q.New(VmNicVO.class).eq(VmNicVO_.uuid, msg.getVmNicUuid()).find(); if (msg.getState().equals(VmNicState.enable.toString()) && !msg.getState().equals(nicVO.getState().toString())) { MacOperator mo = new MacOperator(); - if (mo.checkDuplicateMac(nicVO.getHypervisorType(), nicVO.getMac())) { + if (mo.checkDuplicateMac(nicVO.getHypervisorType(), nicVO.getL3NetworkUuid(), + nicVO.getMac())) { throw new ApiMessageInterceptionException(Platform.argerr("Duplicate mac address [%s]", nicVO.getMac())); } } From c40b67a18138dbea2948cdc6ee3e230e0625042c Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Fri, 30 May 2025 17:40:15 +0800 Subject: [PATCH 376/737] [virtualRouterProvider]: fire vr disconnected event if vr is stopped, fire vr disconnected event Resolves: ZSTAC-73042 Change-Id: I746b677663756571777a67736f74767064786a67 --- .../zstack/network/service/virtualrouter/VirtualRouter.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java index f321ce68f11..fd22cc113d9 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java @@ -412,6 +412,10 @@ public void run(final SyncTaskChain chain) { final PingVirtualRouterVmReply reply = new PingVirtualRouterVmReply(self.getUuid()); if ((VmInstanceState.Running != self.getState() && VmInstanceState.Unknown != self.getState()) || ApplianceVmStatus.Connecting == getSelf().getStatus()) { + if (VmInstanceState.Stopped == self.getState() + && ApplianceVmStatus.Disconnected != getSelf().getStatus()) { + changeApplianceVmStatus(ApplianceVmStatus.Disconnected); + } reply.setDoReconnect(false); bus.reply(msg, reply); chain.next(); From 75cd5149d54f93b9df078d823ccda11dac9f262e Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Fri, 30 May 2025 17:40:15 +0800 Subject: [PATCH 377/737] [virtualRouterProvider]: fire vr disconnected event if vr is stopped, fire vr disconnected event Resolves: ZSTAC-72876 Change-Id: I746b677663756571777a67736f74767064786a67 --- .../zstack/network/service/virtualrouter/VirtualRouter.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java index f321ce68f11..fd22cc113d9 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java @@ -412,6 +412,10 @@ public void run(final SyncTaskChain chain) { final PingVirtualRouterVmReply reply = new PingVirtualRouterVmReply(self.getUuid()); if ((VmInstanceState.Running != self.getState() && VmInstanceState.Unknown != self.getState()) || ApplianceVmStatus.Connecting == getSelf().getStatus()) { + if (VmInstanceState.Stopped == self.getState() + && ApplianceVmStatus.Disconnected != getSelf().getStatus()) { + changeApplianceVmStatus(ApplianceVmStatus.Disconnected); + } reply.setDoReconnect(false); bus.reply(msg, reply); chain.next(); From 11a04ebde3dbf4291fa862795fcd3d08cdfd4a0b Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Fri, 23 May 2025 00:36:53 +0800 Subject: [PATCH 378/737] [kvm]: wait host shutdown to send disconnect event Resolves: ZSTAC-75279 Change-Id: I6f7a6d726e7364717379756569706e6a757a6262 (cherry picked from commit db79d79b0dc8ed9eb1c165051306e85bc208ef7a) --- .../src/main/java/org/zstack/kvm/KVMHost.java | 40 +++++++++++-------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 0a9fe77e200..ff3efacad6e 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -1308,12 +1308,11 @@ private void handleShutdownHostByIpmi(ShutdownHostMsg msg, NoErrorCompletion com Completion c = new Completion(msg, completion) { @Override public void success() { - changeConnectionState(HostStatusEvent.disconnected); if (msg.isReturnEarly()) { bus.reply(msg, reply); - } else { - submitTaskWaitHostShutdownByIpmi(); } + + submitTaskWaitHostShutdownByIpmi(); completion.done(); } @@ -1338,16 +1337,21 @@ public boolean run() { HostVO host = dbf.findByUuid(msg.getHostUuid(), HostVO.class); if (timeHelper.getCurrentTimeMillis() > deadline) { - reply.setError(operr(String.format("Host[%s] has not been shut down within %d seconds for an unknown reason. Please check host status in BMC[%s]", msg.getHostUuid(), timeoutInSec, host.getIpmi().getIpmiAddress()))); - reply.setSuccess(false); - bus.reply(msg, reply); + if (!msg.isReturnEarly()) { + reply.setError(operr(String.format("Host[%s] has not been shut down within %d seconds for an unknown reason. Please check host status in BMC[%s]", msg.getHostUuid(), timeoutInSec, host.getIpmi().getIpmiAddress()))); + reply.setSuccess(false); + bus.reply(msg, reply); + } HostIpmiVO ipmi = host.getIpmi(); kvmHostIpmiPowerExecutor.updateIpmiPowerStatusInDB(ipmi, HostPowerStatus.POWER_ON); return true; } HostPowerStatus status = kvmHostIpmiPowerExecutor.refreshHostPowerStatus(host).getIpmiPowerStatus(); if (HostPowerStatus.POWER_OFF.equals(status)) { - bus.reply(msg, reply); + if (!msg.isReturnEarly()) { + bus.reply(msg, reply); + } + changeConnectionState(HostStatusEvent.disconnected); return true; } if (HostPowerStatus.POWER_ON.equals(status)) { @@ -6145,13 +6149,12 @@ public void success(KVMAgentCommands.ShutdownHostResponse ret) { return; } - changeConnectionState(HostStatusEvent.disconnected); if (msg.isReturnEarly()) { bus.reply(msg, reply); completion.done(); - } else { - waitForHostShutdown(reply, completion); } + + waitForHostShutdown(reply, completion); } private boolean testPort() { @@ -6177,10 +6180,12 @@ private void waitForHostShutdown(ShutdownHostReply reply, NoErrorCompletion noEr @Override public boolean run() { if (isTimeout()) { - reply.setSuccess(false); - reply.setError(operr("host[%s] not shutdown in %d seconds",msg.getHostUuid(), ctimeout)); - bus.reply(msg,reply); - noErrorCompletion.done(); + if (!msg.isReturnEarly()) { + reply.setSuccess(false); + reply.setError(operr("host[%s] not shutdown in %d seconds", msg.getHostUuid(), ctimeout)); + bus.reply(msg, reply); + noErrorCompletion.done(); + } return true; } @@ -6188,8 +6193,11 @@ public boolean run() { return false; } - bus.reply(msg, reply); - noErrorCompletion.done(); + if (!msg.isReturnEarly()) { + bus.reply(msg, reply); + noErrorCompletion.done(); + } + changeConnectionState(HostStatusEvent.disconnected); return true; } From c78f06bc28b0719b9fce54dea1d348379499877e Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Wed, 4 Jun 2025 16:37:18 +0800 Subject: [PATCH 379/737] [virtualRouterProvider]: skip vr reconnect if vr is not running Resolves: ZSTAC-73042 Change-Id: I646b62627974746768776774706e6a647770776c --- .../virtualrouter/VirtualRouterPingTracker.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterPingTracker.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterPingTracker.java index 1cde54cbce6..b12896a4924 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterPingTracker.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterPingTracker.java @@ -18,11 +18,13 @@ import org.zstack.header.message.MessageReply; import org.zstack.header.message.NeedReplyMessage; import org.zstack.header.vm.VmInstanceConstant; +import org.zstack.header.vm.VmInstanceState; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.function.Function; import org.zstack.utils.logging.CLogger; +import java.util.ArrayList; import java.util.List; /** @@ -81,6 +83,15 @@ public void handleReply(final String resourceUuid, MessageReply reply) { return; } + // virtual router is not running/unknow state, skip the reconnection + List states = new ArrayList<>(); + states.add(VmInstanceState.Running); + states.add(VmInstanceState.Unknown); + if (Q.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, resourceUuid) + .notIn(VirtualRouterVmVO_.state, states).isExists()) { + return; + } + logger.debug(String.format("[Virtual Router VM Tracker]: the virtual router vm[uuid:%s] is detected a reconnect is needed, issuing it...", resourceUuid)); ReconnectVirtualRouterVmMsg msg = new ReconnectVirtualRouterVmMsg(); msg.setVirtualRouterVmUuid(resourceUuid); From 7bfc1219979e50d72d1507680edee647f4f71f3f Mon Sep 17 00:00:00 2001 From: "xinhao.huang" Date: Wed, 4 Jun 2025 16:59:18 +0800 Subject: [PATCH 380/737] [sdk]: support multiple date formats for HTTP headers and allow custom date format in SDK signature Resolves: ZSTAC-75469 Change-Id: I6662617a73786979676768697a67736f6e6b6e65 --- .../main/java/org/zstack/rest/RestServer.java | 38 +++++++++++++++++-- .../main/java/org/zstack/sdk/ZSClient.java | 9 ++++- .../main/java/org/zstack/sdk/ZSConfig.java | 5 +++ 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/rest/src/main/java/org/zstack/rest/RestServer.java b/rest/src/main/java/org/zstack/rest/RestServer.java index 49a65591249..322089899f4 100755 --- a/rest/src/main/java/org/zstack/rest/RestServer.java +++ b/rest/src/main/java/org/zstack/rest/RestServer.java @@ -162,8 +162,37 @@ public void registerRestServletRequestInterceptor(RestServletRequestInterceptor } formatter = new DateTimeFormatterBuilder() - .parseCaseInsensitive() - .appendPattern("EEE, dd MMM yyyy HH:mm:ss z") + .parseCaseInsensitive() // Allows parsing of month names and day periods (e.g., "Jan" or "JAN", "AM" or "am") in a case-insensitive manner. + + // Common RFC 1123-like format with two-digit day and time zone name (e.g., "Thu, 26 Oct 2023 10:30:00 GMT"). + // Note: The 'z' pattern has limited support for time zone names (e.g., typically parses "GMT" but not full IDs like "Asia/Shanghai"). + .appendOptional(DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH)) + + // Standard RFC 1123 date-time formatter, commonly used in HTTP headers. + // It handles single-digit days (e.g., '5 Jun') and formats time zones as offsets (e.g., '+0800') or 'GMT'. + // Example: "Thu, 5 Jun 2025 15:47:29 +0800". + .appendOptional(DateTimeFormatter.RFC_1123_DATE_TIME) + + // ISO 8601 (International Organization for Standardization standard) + // Appends the ISO-8601 date-time formatter with an offset from UTC. Example: "2023-10-26T10:30:00+08:00". + .appendOptional(DateTimeFormatter.ISO_OFFSET_DATE_TIME) + + // Appends a custom formatter for date-time with milliseconds and a two-character ISO-8601 offset. Example: "2023-10-26T10:30:00.123+08". + .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSxx", Locale.ENGLISH)) + + // Appends a custom formatter for date-time with milliseconds and a four-digit offset (e.g., "+0800"). Example: "2023-10-26T10:30:00.123+0800". + .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.ENGLISH)) + + // Appends a custom formatter for date-time with a colon-separated ISO-8601 extended offset. Example: "2023-10-26T10:30:00+08:00". + .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH)) + + // Appends a custom formatter for date-time (no milliseconds) with a two-character ISO-8601 offset. Example: "2023-10-26T10:30:00+08". + .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxx", Locale.ENGLISH)) + + // Appends a custom formatter for date-time (no milliseconds) with a four-digit offset. Example: "2023-10-26T10:30:00+0800". + .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH)) + + // Completes the builder and creates the final DateTimeFormatter, ensuring that English locale rules are used for parsing (e.g., for month names). .toFormatter(Locale.ENGLISH); } @@ -1060,7 +1089,10 @@ private void checkTime(String dateStr, boolean checkTimeZone) throws RestExcepti try { date = ZonedDateTime.parse(dateStr, formatter); } catch (RuntimeException e) { - throw new RestException(HttpStatus.BAD_REQUEST.value(), "'Date' format error, correct format is 'EEE, dd MMM yyyy HH:mm:ss z'"); + throw new RestException(HttpStatus.BAD_REQUEST.value(), + "Date format error. The 'Date' header must conform to one of the supported RFC 1123 or ISO 8601 formats. " + + "Examples include: 'Thu, 5 Jun 2025 15:47:29 +0800', '2025-06-05T16:08:42+08:00', or '2025-06-05T16:08:42.123Z'." + ); } ZonedDateTime now = ZonedDateTime.now(); diff --git a/sdk/src/main/java/org/zstack/sdk/ZSClient.java b/sdk/src/main/java/org/zstack/sdk/ZSClient.java index 025c9046d51..882284e45c6 100755 --- a/sdk/src/main/java/org/zstack/sdk/ZSClient.java +++ b/sdk/src/main/java/org/zstack/sdk/ZSClient.java @@ -383,8 +383,15 @@ private ApiResult webHookResult() { private void calculateAccessKeySignature(Request.Builder reqBuilder, String accessKeyId, String accessKeySecret, String path) throws Exception { ZonedDateTime date = ZonedDateTime.now(); - String dateStr = date.format(formatter); + DateTimeFormatter fmt = formatter; + if (getConfig() != null && getConfig().accessKeyDateStr != null) { + fmt = new DateTimeFormatterBuilder() + .parseCaseInsensitive() + .appendPattern(getConfig().accessKeyDateStr) + .toFormatter(Locale.ENGLISH); + } + String dateStr = date.format(fmt); StringBuilder sb = new StringBuilder(); sb.append(info.httpMethod).append("\n"); sb.append(dateStr).append("\n").append("/v1").append(path); diff --git a/sdk/src/main/java/org/zstack/sdk/ZSConfig.java b/sdk/src/main/java/org/zstack/sdk/ZSConfig.java index 657639bc933..fb154a092aa 100755 --- a/sdk/src/main/java/org/zstack/sdk/ZSConfig.java +++ b/sdk/src/main/java/org/zstack/sdk/ZSConfig.java @@ -14,6 +14,7 @@ public class ZSConfig { Long readTimeout; Long writeTimeout; String contextPath; + String accessKeyDateStr; public String getHostname() { return hostname; @@ -74,6 +75,10 @@ public Builder setContextPath(String name) { return this; } + public Builder setAccessKeyDateStr(String name) { + config.accessKeyDateStr = name; + return this; + } public ZSConfig build() { return config; From 866b137a8a89349d2b66cc9bf0fe8b0031b3729a Mon Sep 17 00:00:00 2001 From: J M Date: Thu, 29 May 2025 14:45:31 +0800 Subject: [PATCH 381/737] [storage]: trash top after storage live migration top is unused after storage migration even if its snapshot referenced by other volumes. only skip trash volume when its snapshots are inner snapshot. Resolves: ZSTAC-71514 Change-Id: I636b6d726d6c757478737869726f6a777a736663 --- .../storage/snapshot/VolumeSnapshotTree.java | 18 +++++++ .../VolumeSnapshotReferenceInventory.java | 3 ++ .../reference/VolumeSnapshotReferenceVO.java | 3 ++ .../VolumeSnapshotReferenceUtils.java | 50 +++++++++++++------ 4 files changed, 60 insertions(+), 14 deletions(-) diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotTree.java b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotTree.java index fbb8a670d83..57b4fab4099 100755 --- a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotTree.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotTree.java @@ -348,6 +348,7 @@ private VolumeSnapshotInventory getInventory(Set filterUuids) { private SnapshotLeaf root; private String volumeUuid; + private String uuid; public static VolumeSnapshotTree fromInventories(List invs) { VolumeSnapshotTree tree = new VolumeSnapshotTree(); @@ -377,6 +378,7 @@ public static VolumeSnapshotTree fromInventories(List i } tree.volumeUuid = inv.getVolumeUuid(); + tree.uuid = inv.getTreeUuid(); } DebugUtils.Assert(tree.root != null, "why tree root is null???"); @@ -403,6 +405,14 @@ public void setVolumeUuid(String volumeUuid) { this.volumeUuid = volumeUuid; } + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + private SnapshotLeaf findSnapshot(final List leafs, final Function func) { for (SnapshotLeaf leaf : leafs) { SnapshotLeaf ret = findSnapshot(leaf.children, func); @@ -424,4 +434,12 @@ public SnapshotLeaf findSnapshot(Function func } return findSnapshot(root.children, func); } + + public SnapshotLeaf findSnapshot(String snapshotUuid) { + if (snapshotUuid == null) { + return null; + } + + return findSnapshot(arg -> arg.getUuid().equals(snapshotUuid)); + } } diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceInventory.java b/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceInventory.java index a3db08d459c..e8b12800b12 100644 --- a/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceInventory.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceInventory.java @@ -36,6 +36,9 @@ public class VolumeSnapshotReferenceInventory { private String directSnapshotInstallUrl; + /** + * the UUID of resource referencing @volumeUuid. + */ private String referenceUuid; private String referenceType; diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceVO.java b/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceVO.java index 25fe22ee9e0..c646c440847 100644 --- a/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceVO.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceVO.java @@ -52,6 +52,9 @@ public class VolumeSnapshotReferenceVO { private Long parentId; + /** + * the UUID of resource referencing @volumeUuid. + */ @Column private String referenceUuid; diff --git a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java index 2c534aac1b1..69c25da4cad 100644 --- a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java @@ -82,33 +82,55 @@ public static String getVolumeInstallUrlBackingOtherVolume(String volumeUuid) { return null; } - public static List getVolumeInstallUrlsReferenceByOtherVolumes(String volumeUuid) { + // use getVolumeAllSnapshotsReferencedOtherVolumes or isVolumeDirectlyReferenceByOthers + @Deprecated + public static List getVolumeSnapshotsReferencedByOtherVolumes(String volumeUuid) { return getVolumeReferenceRef(volumeUuid).stream() .map(VolumeSnapshotReferenceVO::getVolumeSnapshotInstallUrl).distinct() .collect(Collectors.toList()); } // get volume snapshotUuids referenced by other volumes directly or indirectly + // FIXME split different primary storage snapshot reference public static Set getVolumeAllSnapshotsReferencedByOtherVolumes(String volumeUuid) { - List refVolumeSnapshotUuids = getVolumeReferenceRef(volumeUuid).stream() - .map(VolumeSnapshotReferenceVO::getVolumeSnapshotUuid).distinct() - .collect(Collectors.toList()); - if (refVolumeSnapshotUuids.isEmpty()) { + Set refSnapshotUuids = getVolumeReferenceRef(volumeUuid).stream() + .map(VolumeSnapshotReferenceVO::getVolumeSnapshotUuid) + .collect(Collectors.toSet()); + if (refSnapshotUuids.isEmpty()) { return Collections.emptySet(); } List allSnapshots = Q.New(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.volumeUuid, volumeUuid).list(); + // snapshotUuid in VolumeSnapshotReferenceVO may not exist in VolumeSnapshotVO, + // maybe because the snapshot has been deleted db only after volume migration, + // so we need to filter them out + refSnapshotUuids.retainAll(allSnapshots.stream().map(VolumeSnapshotVO::getUuid).collect(Collectors.toSet())); + if (refSnapshotUuids.isEmpty()) { + return Collections.emptySet(); + } + + Set allRefSnapshotUuids = new HashSet<>(refSnapshotUuids); + Map trees = allSnapshots.stream() + .collect(Collectors.groupingBy(VolumeSnapshotVO::getTreeUuid, Collectors.toList())) + .values().stream() + .collect(Collectors.toMap( + snaps -> snaps.get(0).getTreeUuid(), + VolumeSnapshotTree::fromVOs + )); - Map> treeSnapshotsMap = allSnapshots.stream().collect(Collectors.groupingBy(VolumeSnapshotVO::getTreeUuid)); - List refVolumeSnapshotUuidsInTree = new ArrayList<>(); - for (VolumeSnapshotVO refSnapshot : allSnapshots.stream().filter(sp -> refVolumeSnapshotUuids.contains(sp.getUuid())).collect(Collectors.toList())) { - refVolumeSnapshotUuidsInTree.add(refSnapshot.getUuid()); - VolumeSnapshotTree tree = VolumeSnapshotTree.fromVOs(treeSnapshotsMap.get(refSnapshot.getTreeUuid())); - VolumeSnapshotTree.SnapshotLeaf snapshotLeaf = tree.findSnapshot(arg -> arg.getUuid().equals(refSnapshot.getUuid())); - refVolumeSnapshotUuidsInTree.addAll(snapshotLeaf.getAncestors().stream() - .map(VolumeSnapshotInventory::getUuid).collect(Collectors.toList())); + List refSnapshots = allSnapshots.stream() + .filter(sp -> refSnapshotUuids.contains(sp.getUuid())) + .collect(Collectors.toList()); + for (VolumeSnapshotVO refSnapshot : refSnapshots) { + Set ancestorUuids = trees.get(refSnapshot.getTreeUuid()) + .findSnapshot(refSnapshot.getUuid()) + .getAncestors().stream() + .map(VolumeSnapshotInventory::getUuid) + .collect(Collectors.toSet()); + allRefSnapshotUuids.addAll(ancestorUuids); } - return new HashSet<>(refVolumeSnapshotUuidsInTree); + + return allRefSnapshotUuids; } public static List getReferenceVolume(String volumeUuid) { From 570394dbdad2c3006e68a15cc1388b228e9b01b6 Mon Sep 17 00:00:00 2001 From: J M Date: Tue, 10 Jun 2025 01:08:56 +0800 Subject: [PATCH 382/737] [lun]: add missing error xml Resolves: ZSTAC-75573 Change-Id: I736867626c7a6b6c76647363627765726b6d7375 --- conf/errorCodes/lun.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 conf/errorCodes/lun.xml diff --git a/conf/errorCodes/lun.xml b/conf/errorCodes/lun.xml new file mode 100644 index 00000000000..a8cb629c553 --- /dev/null +++ b/conf/errorCodes/lun.xml @@ -0,0 +1,13 @@ + + LUN + + + 1000 + lun has been created + + + + 1001 + lun cannot be found + + From 1b2809f7cd254aa11ff97094d31e6e70936b2d46 Mon Sep 17 00:00:00 2001 From: J M Date: Tue, 10 Jun 2025 02:13:57 +0800 Subject: [PATCH 383/737] [host]: add doc to shutdown msg Resolves: ZSTAC-75574 Change-Id: I6875616a72727a6f626f6e696174646376636c6d --- .../src/main/java/org/zstack/compute/host/HostBase.java | 1 - .../main/java/org/zstack/header/host/ShutdownHostMsg.java | 7 +++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/compute/src/main/java/org/zstack/compute/host/HostBase.java b/compute/src/main/java/org/zstack/compute/host/HostBase.java index dad898b017c..512c407b97b 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostBase.java +++ b/compute/src/main/java/org/zstack/compute/host/HostBase.java @@ -261,7 +261,6 @@ private void handle(APIShutdownHostMsg msg) { final APIShutdownHostEvent event = new APIShutdownHostEvent(msg.getId()); ShutdownHostMsg shutdownHostMsg = new ShutdownHostMsg(); shutdownHostMsg.setMethod(HostPowerManagementMethod.valueOf(msg.getMethod())); - shutdownHostMsg.setWaitTaskCompleted(!msg.isReturnEarly()); shutdownHostMsg.setReturnEarly(msg.isReturnEarly()); shutdownHostMsg.setUuid(msg.getUuid()); shutdownHostMsg.setForce(msg.isForce()); diff --git a/header/src/main/java/org/zstack/header/host/ShutdownHostMsg.java b/header/src/main/java/org/zstack/header/host/ShutdownHostMsg.java index c39bb6d3369..aa18ed2f7dc 100644 --- a/header/src/main/java/org/zstack/header/host/ShutdownHostMsg.java +++ b/header/src/main/java/org/zstack/header/host/ShutdownHostMsg.java @@ -7,8 +7,15 @@ */ public class ShutdownHostMsg extends NeedReplyMessage implements HostMessage { private String uuid; + /** + * If true, the shutdown task execution should wait for the running task to complete. + */ private boolean waitTaskCompleted; private Long maxWaitTime; + + /** + * If true, the shutdown task will return immediately without waiting for the host to be powered off. + */ private boolean returnEarly; private HostPowerManagementMethod method; private boolean force = false; From 4b5e001d6dcf7ec2e38fc7fb9eaf397d833706c3 Mon Sep 17 00:00:00 2001 From: "xinhao.huang" Date: Wed, 30 Apr 2025 16:34:46 +0800 Subject: [PATCH 384/737] [utils]: use form-data in get webssh Resolves: ZSTAC-67679 Change-Id: I63666478777a6c6a617367776a67626e6466746f --- .../src/main/java/org/zstack/kvm/KVMHost.java | 18 ++++---- .../src/main/java/org/zstack/utils/HTTP.java | 45 +++++++++++++++++-- 2 files changed, 51 insertions(+), 12 deletions(-) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index ff3efacad6e..01881129f62 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -1162,14 +1162,16 @@ private void handle(GetHostWebSshUrlMsg msg) { } KVMHostVO host = dbf.findByUuid(msg.getHostUuid(), KVMHostVO.class); - HTTP.Builder hb = HTTP.post(); - hb.body(""); - hb.url(String.format("http://localhost:%s?username=%s&&hostname=%s&&port=%s&&password=%s", - KVMGlobalConfig.HOST_WEBSSH_PORT.value(), - msg.getUserName(), - host.getManagementIp(), - host.getPort().toString(), - msg.getPassword())); + + Map formMap = new HashMap<>(); + formMap.put("username", msg.getUserName()); + formMap.put("hostname", host.getManagementIp()); + formMap.put("port", host.getPort().toString()); + formMap.put("password", msg.getPassword()); + + HTTP.Builder hb = HTTP.post() + .url(String.format("http://localhost:%s", KVMGlobalConfig.HOST_WEBSSH_PORT.value())) + .formData(formMap); try (Response r = hb.callWithException()) { // 1. webssh maybe is not running diff --git a/utils/src/main/java/org/zstack/utils/HTTP.java b/utils/src/main/java/org/zstack/utils/HTTP.java index cff6ddc142f..327ac3030d9 100755 --- a/utils/src/main/java/org/zstack/utils/HTTP.java +++ b/utils/src/main/java/org/zstack/utils/HTTP.java @@ -5,6 +5,7 @@ import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; +import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -130,6 +131,8 @@ public static class Builder { private boolean build; + private MultipartBody.Builder multipartBody; + public Param getParam() { return param; } @@ -196,6 +199,32 @@ public Builder logging() { return this; } + public Builder formData(Map formFields) { + if (formFields == null) { + throw new IllegalArgumentException("formFields cannot be null"); + } + + if (param.body != null) { + throw new IllegalStateException("Cannot set both body and form data"); + } + + multipartBody = new MultipartBody.Builder().setType(MultipartBody.FORM); + formFields.forEach((k, v) -> { + if (k == null || v == null) { + return; // skip null entries + } + + if (v instanceof File) { + File file = (File) v; + RequestBody fileBody = RequestBody.create(file, MediaType.parse("application/octet-stream")); + multipartBody.addFormDataPart(k, file.getName(), fileBody); + } else { + multipartBody.addFormDataPart(k, v.toString()); + } + }); + return this; + } + public Response callWithException() throws IOException { build(); @@ -254,15 +283,23 @@ private void build() { } if ("POST".equals(param.method)) { - DebugUtils.Assert(param.body != null, "POST requires body"); - rb.post(RequestBody.create(MediaType.parse(contentType), param.body)); + if (multipartBody != null) { + rb.post(multipartBody.build()); + } else { + DebugUtils.Assert(param.body != null, "POST requires body"); + rb.post(RequestBody.create(param.body, MediaType.parse(contentType))); + } } else if ("GET".equals(param.method)) { rb.get(); } else if ("DELETE".equals(param.method)) { rb.delete(); } else if ("PUT".equals(param.method)) { - DebugUtils.Assert(param.body != null, "PUT requires body"); - rb.put(RequestBody.create(MediaType.parse(contentType), param.body)); + if (multipartBody != null) { + rb.put(multipartBody.build()); + } else { + DebugUtils.Assert(param.body != null, "PUT requires body"); + rb.put(RequestBody.create(param.body, MediaType.parse(contentType))); + } } else if ("HEAD".equals(param.method)) { rb.head(); } else { From 562dad156d670a83534ff1c0f3e8757e4c992e0e Mon Sep 17 00:00:00 2001 From: J M Date: Wed, 11 Jun 2025 16:00:13 +0800 Subject: [PATCH 385/737] [host]: update status before reply 1. prevent db update race condition. 2. makesure task completed after reply recieved. Resolves: ZSTAC-75574 Change-Id: I6869636e757966786f6278727771656f6a796a70 --- .../org/zstack/compute/host/HostBase.java | 5 +++-- .../zstack/header/host/ShutdownHostMsg.java | 9 +++++++++ .../src/main/java/org/zstack/kvm/KVMHost.java | 19 +++++++++++++++---- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/host/HostBase.java b/compute/src/main/java/org/zstack/compute/host/HostBase.java index 512c407b97b..2d2d3ed64ce 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostBase.java +++ b/compute/src/main/java/org/zstack/compute/host/HostBase.java @@ -54,6 +54,7 @@ import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; import static org.zstack.core.Platform.*; import static org.zstack.utils.CollectionDSL.e; @@ -1191,7 +1192,7 @@ protected boolean changeConnectionState(final HostStatusEvent event) { return changeConnectionState(event, null); } - protected boolean changeConnectionState(final HostStatusEvent event, Runnable runnable) { + protected boolean changeConnectionState(final HostStatusEvent event, Consumer consumer) { String hostUuid = self.getUuid(); self = dbf.reload(self); if (self == null) { @@ -1205,7 +1206,7 @@ protected boolean changeConnectionState(final HostStatusEvent event, Runnable ru } self.setStatus(next); - Optional.ofNullable(runnable).ifPresent(Runnable::run); + Optional.ofNullable(consumer).ifPresent(it -> it.accept(self)); self = dbf.updateAndRefresh(self); logger.debug(String.format("Host %s [uuid:%s] changed connection state from %s to %s", self.getName(), self.getUuid(), before, next)); diff --git a/header/src/main/java/org/zstack/header/host/ShutdownHostMsg.java b/header/src/main/java/org/zstack/header/host/ShutdownHostMsg.java index aa18ed2f7dc..1aa5d0f9dd1 100644 --- a/header/src/main/java/org/zstack/header/host/ShutdownHostMsg.java +++ b/header/src/main/java/org/zstack/header/host/ShutdownHostMsg.java @@ -17,6 +17,7 @@ public class ShutdownHostMsg extends NeedReplyMessage implements HostMessage { * If true, the shutdown task will return immediately without waiting for the host to be powered off. */ private boolean returnEarly; + private String originState; private HostPowerManagementMethod method; private boolean force = false; @@ -72,4 +73,12 @@ public boolean isForce() { public void setForce(boolean force) { this.force = force; } + + public String getOriginState() { + return originState; + } + + public void setOriginState(String originState) { + this.originState = originState; + } } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index ff3efacad6e..75a187bba74 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -106,6 +106,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Consumer; import java.util.stream.Collectors; import static org.zstack.core.Platform.*; @@ -1337,21 +1338,26 @@ public boolean run() { HostVO host = dbf.findByUuid(msg.getHostUuid(), HostVO.class); if (timeHelper.getCurrentTimeMillis() > deadline) { + HostIpmiVO ipmi = host.getIpmi(); + kvmHostIpmiPowerExecutor.updateIpmiPowerStatusInDB(ipmi, HostPowerStatus.POWER_ON); if (!msg.isReturnEarly()) { reply.setError(operr(String.format("Host[%s] has not been shut down within %d seconds for an unknown reason. Please check host status in BMC[%s]", msg.getHostUuid(), timeoutInSec, host.getIpmi().getIpmiAddress()))); reply.setSuccess(false); bus.reply(msg, reply); } - HostIpmiVO ipmi = host.getIpmi(); - kvmHostIpmiPowerExecutor.updateIpmiPowerStatusInDB(ipmi, HostPowerStatus.POWER_ON); return true; } HostPowerStatus status = kvmHostIpmiPowerExecutor.refreshHostPowerStatus(host).getIpmiPowerStatus(); if (HostPowerStatus.POWER_OFF.equals(status)) { + Consumer c = msg.getOriginState() == null ? null : h -> { + logger.debug(String.format("host[uuid:%s, name:%s, ip:%s] is power off, set it to origin state %s", + h.getUuid(), h.getName(), h.getManagementIp(), msg.getOriginState())); + h.setState(HostState.valueOf(msg.getOriginState())); + }; + changeConnectionState(HostStatusEvent.disconnected, c); if (!msg.isReturnEarly()) { bus.reply(msg, reply); } - changeConnectionState(HostStatusEvent.disconnected); return true; } if (HostPowerStatus.POWER_ON.equals(status)) { @@ -6193,11 +6199,16 @@ public boolean run() { return false; } + Consumer c = msg.getOriginState() == null ? null : h -> { + logger.debug(String.format("host[uuid:%s, name:%s, ip:%s] is power off, set it to origin state %s", + h.getUuid(), h.getName(), h.getManagementIp(), msg.getOriginState())); + h.setState(HostState.valueOf(msg.getOriginState())); + }; + changeConnectionState(HostStatusEvent.disconnected, c); if (!msg.isReturnEarly()) { bus.reply(msg, reply); noErrorCompletion.done(); } - changeConnectionState(HostStatusEvent.disconnected); return true; } From 5082eabe35c231e958769ef02aa55428cbcebc5b Mon Sep 17 00:00:00 2001 From: J M Date: Thu, 12 Jun 2025 11:07:18 +0800 Subject: [PATCH 386/737] [ceph]: enhance ceph capacity calculate ignore empty install path Resolves: ZSTAC-74848 Change-Id: I707266726270677672676666686f796e64746562 --- .../ceph/primary/capacity/CephOsdGroupCapacityHelper.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/capacity/CephOsdGroupCapacityHelper.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/capacity/CephOsdGroupCapacityHelper.java index ddd4c2f9901..1ca0a262c1d 100644 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/capacity/CephOsdGroupCapacityHelper.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/capacity/CephOsdGroupCapacityHelper.java @@ -1,6 +1,7 @@ package org.zstack.storage.ceph.primary.capacity; import org.apache.commons.collections.CollectionUtils; +import org.apache.logging.log4j.util.Strings; import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; @@ -238,7 +239,7 @@ public Long calculateAvailableCapacityByRatio(CephOsdGroupVO osdGroup, String pr for (String poolName : poolNames) { String installPathPrefix = String.format("ceph://%s", poolName); long volSize = volumes.parallelStream() - .filter(v -> v.getInstallPath() != null && v.getInstallPath() + .filter(v -> Strings.isNotEmpty(v.getInstallPath()) && v.getInstallPath() .substring(0, v.getInstallPath().lastIndexOf("/")) .equals((installPathPrefix))) .map(VolumeVO::getSize) @@ -246,7 +247,7 @@ public Long calculateAvailableCapacityByRatio(CephOsdGroupVO osdGroup, String pr .reduce(0L, Long::sum); long imageCacheSize = imageCaches.parallelStream() - .filter(v -> v.getInstallUrl() != null && v.getInstallUrl() + .filter(v -> Strings.isNotEmpty(v.getInstallUrl()) && v.getInstallUrl() .substring(0, v.getInstallUrl().lastIndexOf("/")) .equals((installPathPrefix))) .map(ImageCacheVO::getSize) @@ -254,7 +255,7 @@ public Long calculateAvailableCapacityByRatio(CephOsdGroupVO osdGroup, String pr .reduce(0L, Long::sum); long snapShotSize = snapshots.parallelStream() - .filter(v -> v.getPrimaryStorageInstallPath() != null && v.getPrimaryStorageInstallPath() + .filter(v -> Strings.isNotEmpty(v.getPrimaryStorageInstallPath()) && v.getPrimaryStorageInstallPath() .substring(0, v.getPrimaryStorageInstallPath().lastIndexOf("/")) .equals((installPathPrefix))) .map(VolumeSnapshotVO::getSize) From 1183f58c5518b01683d95bd08b1e41aa87498423 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Fri, 13 Jun 2025 10:46:20 +0800 Subject: [PATCH 387/737] [virtualRouterProvider]: put PingVirtualRouterVmMsg to vmchain if PingVirtualRouterVmMsg and APIRebootVmInstanceMsg run at same time, it may lead to virtual router reconnect after reboot, which is not necessary Resolves: ZSTAC-75610 Change-Id: I6864656b6175687161706d786d736f6e62656961 --- .../network/service/virtualrouter/VirtualRouter.java | 2 +- .../virtualrouter/VirtualRouterPingTracker.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java index fd22cc113d9..3659fd27133 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java @@ -404,7 +404,7 @@ private void handle(final PingVirtualRouterVmMsg msg) { thdf.chainSubmit(new ChainTask(msg) { @Override public String getSyncSignature() { - return String.format("ping-virtualrouter-%s", self.getUuid()); + return syncThreadName; } @Override diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterPingTracker.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterPingTracker.java index b12896a4924..860217ab831 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterPingTracker.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterPingTracker.java @@ -84,11 +84,11 @@ public void handleReply(final String resourceUuid, MessageReply reply) { } // virtual router is not running/unknow state, skip the reconnection - List states = new ArrayList<>(); - states.add(VmInstanceState.Running); - states.add(VmInstanceState.Unknown); - if (Q.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, resourceUuid) - .notIn(VirtualRouterVmVO_.state, states).isExists()) { + VmInstanceState state = Q.New(VirtualRouterVmVO.class) + .eq(VirtualRouterVmVO_.uuid, resourceUuid) + .select(VirtualRouterVmVO_.state).findValue(); + if (VmInstanceState.Running != state && VmInstanceState.Unknown != state) { + logger.debug(String.format("virtual router[uuid:%s] is in state: %s, skip the reconnection", resourceUuid, state)); return; } From af58834cb816224677b5bc2d7badd0a7a446befa Mon Sep 17 00:00:00 2001 From: J M Date: Thu, 5 Jun 2025 19:40:33 +0800 Subject: [PATCH 388/737] [cloudbus]: support send confirm 1. send in CloudBus means submit a message send task. function return do not means sending completion. so there is no way to set a limition in sender. add a FutureCompletion to confirm message send. provide a way to limited send. 2. fix mn heartbeat thread interrupt handle 3. refactor duplicate code for getChainInfo, fix synchronized target. Resolves: ZSTAC-71213 Change-Id: I686361627566737a7775706263796b736967666c --- .../main/java/org/zstack/core/Platform.java | 12 +- .../org/zstack/core/cloudbus/CloudBus.java | 10 +- .../zstack/core/cloudbus/CloudBusImpl2.java | 12 +- .../zstack/core/cloudbus/CloudBusImpl3.java | 79 +++--- .../zstack/core/thread/DispatchQueueImpl.java | 90 +++---- .../zstack/core/thread/TaskInfoBuilder.java | 14 +- .../zstack/core/thread/ThreadFacadeImpl.java | 1 + .../header/core/progress/ChainInfo.java | 26 ++ .../ManagementNodeManagerImpl.java | 24 +- .../core/cloudbus/CloudBus3Case.groovy | 227 +++++++++++++++++- .../ManagementNodeNotFoundHandlerCase.groovy | 35 ++- .../core/cloudbus/MessageSender.java | 43 ++++ .../portal/ManagementNodeHeartbeatCase.groovy | 9 +- 13 files changed, 456 insertions(+), 126 deletions(-) create mode 100644 test/src/test/groovy/org/zstack/test/integration/core/cloudbus/MessageSender.java diff --git a/core/src/main/java/org/zstack/core/Platform.java b/core/src/main/java/org/zstack/core/Platform.java index 4093b47846f..d95b3d35b75 100755 --- a/core/src/main/java/org/zstack/core/Platform.java +++ b/core/src/main/java/org/zstack/core/Platform.java @@ -50,6 +50,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; @@ -826,9 +827,14 @@ private static String getManagementServerIpInternal() { for (NetworkInterface iface : Collections.list(nets)) { String name = iface.getName(); if (defaultLine.contains(name)) { - InetAddress ia = iface.getInetAddresses().nextElement(); - ip = ia.getHostAddress(); - break; + for (InetAddress ia : Collections.list(iface.getInetAddresses())) { + ip = ia.getHostAddress(); + if (ia instanceof Inet4Address) { + // we prefer IPv4 address + ip = ia.getHostAddress(); + break; + } + } } } } catch (SocketException e) { diff --git a/core/src/main/java/org/zstack/core/cloudbus/CloudBus.java b/core/src/main/java/org/zstack/core/cloudbus/CloudBus.java index efe579df429..2ae626dcebf 100755 --- a/core/src/main/java/org/zstack/core/cloudbus/CloudBus.java +++ b/core/src/main/java/org/zstack/core/cloudbus/CloudBus.java @@ -3,6 +3,7 @@ import org.springframework.http.HttpEntity; import org.zstack.header.Component; import org.zstack.header.Service; +import org.zstack.header.core.FutureCompletion; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.exception.CloudConfigureFailException; import org.zstack.header.message.*; @@ -12,14 +13,19 @@ import java.util.function.Consumer; public interface CloudBus extends Component { - void send(Message msg); + /** + * submit a message sending task into the queue. + * @return {@link FutureCompletion} which can be used to check whether the message was successfully sent or not. + */ + + FutureCompletion send(Message msg); void send(List msgs); @Deprecated void send(APIMessage msg, Consumer consumer); - void send(NeedReplyMessage msg, CloudBusCallBack callback); + FutureCompletion send(NeedReplyMessage msg, CloudBusCallBack callback); @Deprecated void send(List msgs, CloudBusListCallBack callBack); diff --git a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl2.java b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl2.java index a00a6718513..579a78e4860 100755 --- a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl2.java +++ b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl2.java @@ -19,6 +19,7 @@ import org.zstack.core.timeout.ApiTimeoutManager; import org.zstack.header.Constants; import org.zstack.header.Service; +import org.zstack.header.core.FutureCompletion; import org.zstack.header.log.NoLogging; import org.zstack.header.apimediator.APIIsReadyToGoMsg; import org.zstack.header.apimediator.APIIsReadyToGoReply; @@ -105,6 +106,11 @@ public class CloudBusImpl2 implements CloudBus, CloudBusIN, ManagementNodeChange private final String AMQP_PROPERTY_HEADER__COMPRESSED = "compressed"; private String SERVICE_ID = makeLocalServiceId("cloudbus"); + public static final FutureCompletion SEND_CONFIRMED = new FutureCompletion(null); + + static { + SEND_CONFIRMED.success(); + } public void setDEFAULT_MESSAGE_TIMEOUT(long timeout) { this.DEFAULT_MESSAGE_TIMEOUT = timeout; @@ -1327,8 +1333,9 @@ private void send(Message msg, Boolean noNeedReply) { } @Override - public void send(Message msg) { + public FutureCompletion send(Message msg) { send(msg, true); + return SEND_CONFIRMED; } @Override @@ -1358,7 +1365,7 @@ private void evaluateMessageTimeout(NeedReplyMessage msg) { } @Override - public void send(final NeedReplyMessage msg, final CloudBusCallBack callback) { + public FutureCompletion send(final NeedReplyMessage msg, final CloudBusCallBack callback) { evaluateMessageTimeout(msg); Envelope e = new Envelope() { @@ -1409,6 +1416,7 @@ List getRequests() { envelopes.put(msg.getId(), e); send(msg, false); + return SEND_CONFIRMED; } private MessageReply createTimeoutReply(NeedReplyMessage m) { diff --git a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java index 12de539758a..1a228ef7af7 100755 --- a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java +++ b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java @@ -101,6 +101,7 @@ public class CloudBusImpl3 implements CloudBus, CloudBusIN { private final static TimeoutRestTemplate http = RESTFacade.createRestTemplate(CoreGlobalProperty.REST_FACADE_READ_TIMEOUT, CoreGlobalProperty.REST_FACADE_CONNECT_TIMEOUT); public static final String HTTP_BASE_URL = "/cloudbus"; + public static final FutureCompletion SEND_CONFIRMED = new FutureCompletion(null); { if (CloudBusGlobalProperty.MESSAGE_LOG != null) { @@ -114,6 +115,8 @@ public class CloudBusImpl3 implements CloudBus, CloudBusIN { CloudBusGlobalProperty.HTTP_CONTEXT_PATH = ""; CloudBusGlobalProperty.HTTP_PORT = 8989; } + + SEND_CONFIRMED.success(); } public static String getManagementNodeUUIDFromServiceID(String serviceID) { @@ -125,6 +128,12 @@ public static String getManagementNodeUUIDFromServiceID(String serviceID) { return ss[0]; } + private FutureCompletion sendFail(ErrorCode errorCode) { + FutureCompletion c = new FutureCompletion(null); + c.fail(errorCode); + return c; + } + private abstract class Envelope { long startTime; @@ -250,8 +259,8 @@ public void deActiveService(String id) { } @Override - public void send(Message msg) { - send(msg, true); + public FutureCompletion send(Message msg) { + return send(msg, true); } @Override @@ -291,11 +300,11 @@ private MessageReply createTimeoutReply(NeedReplyMessage m) { } @Override - public void send(NeedReplyMessage msg, CloudBusCallBack callback) { + public FutureCompletion send(NeedReplyMessage msg, CloudBusCallBack callback) { evaluateMessageTimeout(msg); if (msg.getTimeout() <= 1) { callback.run(createTimeoutReply(msg)); - return; + return SEND_CONFIRMED; } Envelope e = new Envelope() { @@ -346,7 +355,7 @@ public void timeout() { envelopes.put(msg.getId(), e); msgExts.forEach(m -> m.afterAddEnvelopes(msg.getId())); - send(msg, false); + return send(msg, false); } @Override @@ -526,29 +535,36 @@ public MessageSender(Message msg) { localSend = !CloudBusGlobalProperty.HTTP_ALWAYS && managementNodeId.equals(Platform.getManagementServerId()); } - void send() { + FutureCompletion send() { try { - doSend(); + return doSend(); } catch (Throwable th) { - replyErrorIfNeeded(operr(th.getMessage())); + ErrorCode err = operr(th.getMessage()); + replyErrorIfNeeded(err); + + FutureCompletion c = new FutureCompletion(null); + c.fail(err); + return c; } } - private void doSend() { + private FutureCompletion doSend() { if (msg instanceof Event) { eventSend(); - return; + return SEND_CONFIRMED; } if (localSend) { localSend(); + return SEND_CONFIRMED; } else { - httpSend(); + return httpSend(); } } - private void httpSendInQueue(String ip) { - thdf.chainSubmit(new ChainTask(null) { + private FutureCompletion httpSendInQueue(String ip) { + FutureCompletion sendCompletion = new FutureCompletion(null); + thdf.chainSubmit(new ChainTask(sendCompletion) { @Override public String getSyncSignature() { return "http-send-in-queue"; @@ -557,6 +573,7 @@ public String getSyncSignature() { @Override public void run(SyncTaskChain chain) { httpSend(ip); + sendCompletion.success(); chain.next(); } @@ -570,25 +587,29 @@ public String getName() { return getSyncSignature(); } }); + return sendCompletion; } - private void httpSend() { + private FutureCompletion httpSend() { buildSchema(msg); + String ip; try { - String ip = destMaker.getNodeInfo(managementNodeId).getNodeIP(); - httpSendInQueue(ip); + ip = destMaker.getNodeInfo(managementNodeId).getNodeIP(); } catch (ManagementNodeNotFoundException e) { - if (msg instanceof MessageReply) { - if (!deadMessageManager.handleManagementNodeNotFoundError(managementNodeId, msg, () -> { - String ip = destMaker.getNodeInfo(managementNodeId).getNodeIP(); - httpSendInQueue(ip); - })) { - throw e; - } + boolean errorHandled = msg instanceof MessageReply && + deadMessageManager.handleManagementNodeNotFoundError(managementNodeId, msg, () -> { + String otherIp = destMaker.getNodeInfo(managementNodeId).getNodeIP(); + logger.warn(String.format("resend the message[id:%s] to node[ip:%s]", msg.getId(), otherIp)); + httpSendInQueue(otherIp); + }); + if (errorHandled) { + return SEND_CONFIRMED; } else { throw e; } } + + return httpSendInQueue(ip); } private void httpSend(String ip) { @@ -1208,7 +1229,7 @@ private void evalThreadContextToMessage(Message msg) { } } - private void doSendAndCallExtensions(Message msg) { + private FutureCompletion doSendAndCallExtensions(Message msg) { // for unit test finding invocation chain MessageCommandRecorder.record(msg.getClass()); @@ -1223,20 +1244,20 @@ private void doSendAndCallExtensions(Message msg) { interceptor.beforeSendMessage(msg); } - doSend(msg); + return doSend(msg); } - private void doSend(Message msg) { + private FutureCompletion doSend(Message msg) { evalThreadContextToMessage(msg); if (logger.isTraceEnabled() && islogMessage(msg)) { logger.trace(String.format("[msg send]: %s", dumpMessage(msg))); } - new MessageSender(msg).send(); + return new MessageSender(msg).send(); } - private void send(Message msg, Boolean noNeedReply) { + private FutureCompletion send(Message msg, Boolean noNeedReply) { if (msg.getServiceId() == null) { throw new IllegalArgumentException(String.format("service id cannot be null: %s", msg.getClass().getName())); } @@ -1252,7 +1273,7 @@ private void send(Message msg, Boolean noNeedReply) { msg.putHeaderEntry(NO_NEED_REPLY_MSG, noNeedReply.toString()); } - doSendAndCallExtensions(msg); + return doSendAndCallExtensions(msg); } private void restoreFromSchema(Message msg, Map raw) throws ClassNotFoundException { diff --git a/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java b/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java index 356844c7dc6..7b608783816 100755 --- a/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java +++ b/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java @@ -8,7 +8,6 @@ import org.zstack.core.debug.DebugManager; import org.zstack.core.debug.DebugSignalHandler; import org.zstack.header.Constants; -import org.zstack.header.core.Completion; import org.zstack.header.core.ExceptionSafe; import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.core.progress.ChainInfo; @@ -107,47 +106,33 @@ public void handleDebugSignal() { public void beforeCleanQueuedumpThread(String signatureName) { String title = "\n================= Before Clean Task Queue Dump ================"; - dumpsignatureNameThread(signatureName,title); + dumpSignatureNameThread(signatureName,title); } public void afterCleanQueuedumpThread(String signatureName) { String title = "\n================= After Clean Task Queue Dump ================"; - dumpsignatureNameThread(signatureName,title); + dumpSignatureNameThread(signatureName,title); } - public void dumpsignatureNameThread(String signatureName,String title) { + public void dumpSignatureNameThread(String signatureName, String title) { StringBuilder sb = new StringBuilder(); sb.append(title); sb.append("\nASYNC TASK QUEUE DUMP:"); sb.append(String.format("\nTASK QUEUE NUMBER: %s\n", chainTasks.size())); List asyncTasks = new ArrayList<>(); - long now = System.currentTimeMillis(); - synchronized (chainTasks) { - ChainTaskQueueWrapper w = chainTasks.get(signatureName); - if (w == null) { - sb.append(String.format("\n===== NO QUEUE SYNC SIGNATURE: %s =====", signatureName)); - sb.append(StringUtils.join(asyncTasks, "\n")); - sb.append("\n================= END TASK QUEUE DUMP ==================\n"); - _threadFacade.printThreadsAndTasks(); - logger.debug(sb.toString()); - return; - } - StringBuilder tb = new StringBuilder(String.format("\nQUEUE SYNC SIGNATURE: %s", signatureName)); - tb.append(String.format("\nRUNNING TASK NUMBER: %s", w.runningQueue.size())); - tb.append(String.format("\nPENDING TASK NUMBER: %s", w.pendingQueue.size())); - tb.append(String.format("\nASYNC LEVEL: %s", w.maxThreadNum)); - int index = 0; - for (Object obj : w.runningQueue) { - ChainFuture cf = (ChainFuture) obj; - tb.append(TaskInfoBuilder.buildRunningTaskInfo(cf, now, index++)); - } - for (Object obj : w.pendingQueue) { - ChainFuture cf = (ChainFuture) obj; - tb.append(TaskInfoBuilder.buildPendingTaskInfo(cf, now, index++)); - } - asyncTasks.add(tb.toString()); + ChainTaskQueueWrapper w = chainTasks.get(signatureName); + if (w == null) { + sb.append(String.format("\n===== NO QUEUE SYNC SIGNATURE: %s =====", signatureName)); + sb.append(StringUtils.join(asyncTasks, "\n")); + sb.append("\n================= END TASK QUEUE DUMP ==================\n"); + _threadFacade.printThreadsAndTasks(); + logger.debug(sb.toString()); + return; } + StringBuilder tb = new StringBuilder(String.format("\nQUEUE SYNC SIGNATURE: %s", signatureName)); + tb.append(w.getTaskQueueInfo()); + asyncTasks.add(tb.toString()); sb.append(StringUtils.join(asyncTasks, "\n")); sb.append("\n================= END TASK QUEUE DUMP ==================\n"); @@ -157,26 +142,12 @@ public void dumpsignatureNameThread(String signatureName,String title) { @Override public ChainInfo getChainTaskInfo(String signature) { - long now = System.currentTimeMillis(); - synchronized (chainTasks) { - ChainInfo info = new ChainInfo(); - ChainTaskQueueWrapper w = chainTasks.get(signature); - if (w == null) { - return info; - } - - int index = 0; - for (Object obj : w.runningQueue) { - ChainFuture cf = (ChainFuture) obj; - info.addRunningTask(TaskInfoBuilder.buildRunningTaskInfo(cf, now, index++)); - } - - for (Object obj : w.pendingQueue) { - ChainFuture cf = (ChainFuture) obj; - info.addPendingTask(TaskInfoBuilder.buildPendingTaskInfo(cf, now, index++)); - } - return info; + ChainTaskQueueWrapper w = chainTasks.get(signature); + if (w == null) { + return new ChainInfo(); } + + return w.getChainInfo(); } @Override @@ -782,7 +753,7 @@ protected String getTaskQueueInfo() { } private class ChainTaskQueueWrapper extends AbstractTaskQueueWrapper { - LinkedList pendingQueue = new LinkedList(); + final LinkedList pendingQueue = new LinkedList(); final Map subPendingMap = new ConcurrentHashMap<>(); final LinkedList runningQueue = new LinkedList(); AtomicInteger counter = new AtomicInteger(0); @@ -958,28 +929,31 @@ public Void call() { @Override protected String getTaskQueueInfo() { + return getChainInfo().toString(); + } + + protected ChainInfo getChainInfo() { long now = zTimer.getCurrentTimeMillis(); - StringBuilder tb = new StringBuilder(); - tb.append(String.format("\nRUNNING TASK NUMBER: %s", runningQueue.size())); - tb.append(String.format("\nPENDING TASK NUMBER: %s", pendingQueue.size())); - tb.append(String.format("\nASYNC LEVEL: %s", maxThreadNum)); + + ChainInfo info = new ChainInfo(); + info.setMaxThreadNum(maxThreadNum); int index = 0; synchronized (runningQueue) { for (Object obj : runningQueue) { ChainFuture cf = (ChainFuture) obj; - tb.append(TaskInfoBuilder.buildRunningTaskInfo(cf, now, index++)); + info.addRunningTask(TaskInfoBuilder.buildRunningTaskInfo(cf, now, index++)); } } - synchronized (pendingQueue) { + // pendingQueue is synchronized with chainTasks, do not synchronize itself + synchronized (chainTasks) { for (Object obj : pendingQueue) { ChainFuture cf = (ChainFuture) obj; - tb.append(TaskInfoBuilder.buildPendingTaskInfo(cf, now, index++)); + info.addPendingTask(TaskInfoBuilder.buildPendingTaskInfo(cf, now, index++)); } } - - return tb.toString(); + return info; } } diff --git a/core/src/main/java/org/zstack/core/thread/TaskInfoBuilder.java b/core/src/main/java/org/zstack/core/thread/TaskInfoBuilder.java index aa4a1717a68..cb3c1040d88 100644 --- a/core/src/main/java/org/zstack/core/thread/TaskInfoBuilder.java +++ b/core/src/main/java/org/zstack/core/thread/TaskInfoBuilder.java @@ -21,7 +21,7 @@ public class TaskInfoBuilder { static RunningTaskInfo buildRunningTaskInfo(AbstractTimeStatisticFuture abstractTimeStatisticFuture, long now, int index) { RunningTaskInfo info = new RunningTaskInfo(); - loadTaskInfo(info, abstractTimeStatisticFuture, index); + loadTaskInfo(info, abstractTimeStatisticFuture.getTask(), index); info.setExecutionTime(TimeUnit.MILLISECONDS.toSeconds(now - abstractTimeStatisticFuture.getStartExecutionTimeInMills())); info.setPendingTime(TimeUnit.MILLISECONDS.toSeconds(now - abstractTimeStatisticFuture.getStartPendingTimeInMills()) - info.getExecutionTime()); return info; @@ -29,23 +29,23 @@ static RunningTaskInfo buildRunningTaskInfo(AbstractTimeStatisticFuture abstract static PendingTaskInfo buildPendingTaskInfo(AbstractTimeStatisticFuture abstractTimeStatisticFuture, long now, int index) { PendingTaskInfo info = new PendingTaskInfo(); - loadTaskInfo(info, abstractTimeStatisticFuture, index); + loadTaskInfo(info, abstractTimeStatisticFuture.getTask(), index); info.setPendingTime(TimeUnit.MILLISECONDS.toSeconds(now - abstractTimeStatisticFuture.getStartPendingTimeInMills())); return info; } - static private void loadTaskInfo(TaskInfo info, AbstractTimeStatisticFuture cf, int index) { - info.setName(cf.getTask().getName()); - info.setClassName(cf.getTask().getClass().getSimpleName()); + static private void loadTaskInfo(TaskInfo info, AbstractChainTask task, int index) { + info.setName(task.getName()); + info.setClassName(task.getClass().getSimpleName()); info.setIndex(index); - Map tc = cf.getTask().getThreadContext(); + Map tc = task.getThreadContext(); if (tc != null) { info.setApiName(tc.get(Constants.THREAD_CONTEXT_TASK_NAME)); info.setApiId(tc.get(Constants.THREAD_CONTEXT_API)); } info.setContextList(new ArrayList<>()); - for (AsyncBackup backup : cf.getTask().getBackups()) { + for (AsyncBackup backup : task.getBackups()) { if (backup instanceof Message) { info.getContextList().add(JSONObjectUtil.toJsonString(backup)); } diff --git a/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java b/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java index e8e54abbeb0..04a81cc84c8 100755 --- a/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java @@ -163,6 +163,7 @@ public void destroy() { @Override public Future submit(Task task) { + _logger.trace(String.format("submit task: %s", task.getName())); return _pool.submit(new Worker(task)); } diff --git a/header/src/main/java/org/zstack/header/core/progress/ChainInfo.java b/header/src/main/java/org/zstack/header/core/progress/ChainInfo.java index bb07ad06050..2cb11b1fbb6 100644 --- a/header/src/main/java/org/zstack/header/core/progress/ChainInfo.java +++ b/header/src/main/java/org/zstack/header/core/progress/ChainInfo.java @@ -1,5 +1,8 @@ package org.zstack.header.core.progress; +import org.zstack.header.message.NoJsonSchema; +import org.zstack.header.rest.APINoSee; + import java.util.ArrayList; import java.util.List; @@ -9,6 +12,8 @@ public class ChainInfo { private List runningTask = new ArrayList<>(); private List pendingTask = new ArrayList<>(); + @APINoSee + private long maxThreadNum; public void setPendingTask(List pendingTask) { this.pendingTask = pendingTask; @@ -33,4 +38,25 @@ public void addRunningTask(RunningTaskInfo task) { public void addPendingTask(PendingTaskInfo pendingTask) { this.pendingTask.add(pendingTask); } + + public void setMaxThreadNum(long maxThreadNum) { + this.maxThreadNum = maxThreadNum; + } + + public long getMaxThreadNum() { + return maxThreadNum; + } + + @Override + public String toString() { + StringBuilder tb = new StringBuilder(); + tb.append(String.format("\nRUNNING TASK NUMBER: %s", runningTask.size())); + tb.append(String.format("\nPENDING TASK NUMBER: %s", pendingTask.size())); + tb.append(String.format("\nASYNC LEVEL: %s", maxThreadNum)); + + runningTask.forEach(tb::append); + pendingTask.forEach(tb::append); + + return tb.toString(); + } } diff --git a/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java b/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java index fb59c563f50..97e90e49de1 100755 --- a/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java +++ b/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java @@ -869,7 +869,17 @@ public void run() { @Override public Void call() { + logger.debug(String.format("heartbeat thread[%s] for management node[uuid:%s] started", + Thread.currentThread().getName(), node().getUuid())); while (true) { + if (Thread.currentThread().isInterrupted()) { + // the heartbeat task may be cancelled by the heartbeat interval change, + // just return, don't break, otherwise it stops the management node + logger.debug(String.format("heartbeat thread[%s] for management node[uuid:%s] is interrupted, exit heartbeat loop", + Thread.currentThread().getName(), node().getUuid())); + return null; + } + try { if (!amIalive()) { logger.warn(String.format("cannot find my[uuid:%s] heartbeat in database, quit process", node().getUuid())); @@ -892,23 +902,19 @@ public Void call() { } sleepAHeartbeatInterval(); - - if (heartBeatTask.isCancelled()) { - // the heartbeat task may be cancelled by the heartbeat interval change, - // just return, don't break, otherwise it stops the management node - return null; - } } stop(); return null; } - private void sleepAHeartbeatInterval() { + private boolean sleepAHeartbeatInterval() { try { TimeUnit.SECONDS.sleep(ManagementNodeGlobalConfig.NODE_HEARTBEAT_INTERVAL.value(Long.class)); + return true; } catch (InterruptedException ignored) { Thread.currentThread().interrupt(); + return false; } } @@ -927,6 +933,10 @@ private boolean handleHeartbeatFailure(Throwable t) { int heartbeatFailureTimes = 0; while (true) { + if (Thread.currentThread().isInterrupted()) { + return false; + } + if (heartbeatFailureTimes > PortalGlobalProperty.MAX_HEARTBEAT_FAILURE) { logger.warn(String.format("the heartbeat has failed %s times that is greater than the max allowed value[%s]," + " quit process", heartbeatFailureTimes, PortalGlobalProperty.MAX_HEARTBEAT_FAILURE), t); diff --git a/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/CloudBus3Case.groovy b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/CloudBus3Case.groovy index 675c6b5a4e6..2e756f5ad37 100755 --- a/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/CloudBus3Case.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/CloudBus3Case.groovy @@ -1,9 +1,14 @@ package org.zstack.test.integration.core.cloudbus +import org.zstack.core.CoreGlobalProperty import org.zstack.core.Platform import org.zstack.core.cloudbus.* import org.zstack.core.db.DatabaseFacade +import org.zstack.core.thread.SyncThread +import org.zstack.core.thread.ThreadFacade import org.zstack.header.AbstractService +import org.zstack.header.core.FutureCompletion +import org.zstack.header.core.progress.ChainInfo import org.zstack.header.errorcode.OperationFailureException import org.zstack.header.errorcode.SysErrors import org.zstack.header.managementnode.ManagementNodeInventory @@ -22,6 +27,9 @@ import java.util.concurrent.TimeUnit import java.util.function.Consumer class CloudBus3Case extends SubCase { + AbstractService service + CloudBus bus + @Override void clean() { } @@ -222,16 +230,13 @@ class CloudBus3Case extends SubCase { def qmsg = new APIQueryVmInstanceMsg() qmsg.setTimeout(1L) - bus.makeLocalServiceId(qmsg, SERVICE_ID) bus.makeServiceIdByManagementNodeId(qmsg, SERVICE_ID, "some-fake-uuid") MessageReply r = bus.call(qmsg) assert r.error.isError(SysErrors.TIMEOUT) qmsg = new APIQueryVmInstanceMsg() - qmsg.setTimeout(2L) - bus.makeLocalServiceId(qmsg, SERVICE_ID) - bus.makeServiceIdByManagementNodeId(qmsg, SERVICE_ID, "some-fake-uuid") + bus.makeServiceIdByManagementNodeId(qmsg, SERVICE_ID, "some-fake-uuid2") expect(OperationFailureException.class) { bus.call(qmsg) @@ -240,10 +245,224 @@ class CloudBus3Case extends SubCase { bus.unregisterService(service) } + void testFutureCompletionSend() { + CloudBus bus = bean(CloudBus.class) + String SERVICE_ID = "testFutureCompletionSend" + + if (service == null) { + service = new AbstractService() { + @Override + void handleMessage(Message msg) { + bus.reply(msg, new MessageReply()) + } + + @Override + String getId() { + return bus.makeLocalServiceId(SERVICE_ID) + } + + @Override + boolean start() { + return true + } + + @Override + boolean stop() { + return true + } + } + + bus.registerService(service) + } + + StartVmInstanceMsg msg = new StartVmInstanceMsg(vmInstanceUuid: Platform.uuid) + bus.makeLocalServiceId(msg, SERVICE_ID) + FutureCompletion completion = bus.send(msg) + completion.await(5000L) + assert completion.isSuccess() + assert !completion.isTimeout() + + MessageReply[] replyHolder = new MessageReply[1] + NeedReplyMessage nrMsg = new StartVmInstanceMsg(vmInstanceUuid: Platform.uuid) + bus.makeLocalServiceId(nrMsg, SERVICE_ID) + FutureCompletion completion2 = bus.send(nrMsg, new CloudBusCallBack(null) { + @Override + void run(MessageReply reply) { + replyHolder[0] = reply + } + }) + completion2.await(5000L) + assert completion2.isSuccess() + assert !completion2.isTimeout() + retryInSecs { + assert replyHolder[0] != null + assert replyHolder[0].isSuccess() + } + } + + void testFutureCompletionSendToNonExistService() { + CloudBus bus = bean(CloudBus.class) + String NON_EXIST_SERVICE_ID = "NonExistService" + Platform.uuid + + StartVmInstanceMsg msg = new StartVmInstanceMsg(vmInstanceUuid: Platform.uuid) + bus.makeLocalServiceId(msg, NON_EXIST_SERVICE_ID) + FutureCompletion completion = bus.send(msg) + completion.await(5000L) + assert completion.isSuccess() + + + MessageReply[] replyHolder = new MessageReply[1] + NeedReplyMessage nrMsg = new StartVmInstanceMsg(vmInstanceUuid: Platform.uuid) + bus.makeLocalServiceId(nrMsg, NON_EXIST_SERVICE_ID) + FutureCompletion completion2 = bus.send(nrMsg, new CloudBusCallBack(null) { + @Override + void run(MessageReply reply) { + replyHolder[0] = reply + } + }) + completion2.await(5000L) + assert completion2.isSuccess() + retryInSecs { + assert replyHolder[0] != null + assert !replyHolder[0].isSuccess() + } + } + + void testFutureCompletionSendTimeout() { + CloudBus bus = bean(CloudBus.class) + String SERVICE_ID = "testFutureCompletionSendTimeout" + + def service = new AbstractService() { + @Override + void handleMessage(Message msg) { + // Do not reply to simulate timeout + try { + Thread.sleep(3000) + } catch (InterruptedException e) { + e.printStackTrace() + } + } + + @Override + String getId() { + return bus.makeLocalServiceId(SERVICE_ID) + } + + @Override + boolean start() { + return true + } + + @Override + boolean stop() { + return true + } + } + + bus.registerService(service) + + // test timeout (Message msg) + StartVmInstanceMsg msg = new StartVmInstanceMsg(vmInstanceUuid: Platform.uuid) + msg.setTimeout(1) + bus.makeLocalServiceId(msg, SERVICE_ID) + FutureCompletion completion = bus.send(msg) + completion.await(5000L) + assert completion.isSuccess() + + MessageReply[] replyHolder = new MessageReply[1] + NeedReplyMessage nrMsg = new StartVmInstanceMsg(vmInstanceUuid: Platform.uuid) + nrMsg.setTimeout(1) + bus.makeLocalServiceId(nrMsg, SERVICE_ID) + FutureCompletion completion2 = bus.send(nrMsg, new CloudBusCallBack(null) { + @Override + void run(MessageReply reply) { + replyHolder[0] = reply + } + }) + completion2.await(5000L) + assert completion2.isSuccess() + retryInSecs { + assert replyHolder[0] != null + assert !replyHolder[0].isSuccess() + assert replyHolder[0].error.isError(SysErrors.TIMEOUT) + } + + bus.unregisterService(service) + } + + void testFutureCompletionSendToMissingNode() { + CloudBus bus = bean(CloudBus.class) + String SERVICE_ID = "testFutureCompletionSendToMissingNode" + + StartVmInstanceMsg msg = new StartVmInstanceMsg(vmInstanceUuid: Platform.uuid) + msg.setTimeout(2) + bus.makeServiceIdByManagementNodeId(msg, SERVICE_ID, "fake-management-node-uuid") + FutureCompletion completion = bus.send(msg) + completion.await(5000L) + assert !completion.isSuccess() + + MessageReply[] replyHolder = new MessageReply[1] + NeedReplyMessage nrMsg = new StartVmInstanceMsg(vmInstanceUuid: Platform.uuid) + nrMsg.setTimeout(2) + bus.makeServiceIdByManagementNodeId(nrMsg, SERVICE_ID, "fake-management-node-uuid") + FutureCompletion completion2 = bus.send(nrMsg, new CloudBusCallBack(null) { + @Override + void run(MessageReply reply) { + replyHolder[0] = reply + } + }) + completion2.await(5000L) + assert !completion2.isSuccess() + assert completion2.getErrorCode() != null + + retryInSecs { + assert replyHolder[0] != null + assert !replyHolder[0].isSuccess() + // TODO + // assert replyHolder[0].error.isError(SysErrors.MANAGEMENT_NODE_UNAVAILABLE_ERROR) + } + } + + void testSendQueue() { + def threads = [] + 1.upto(50) { i -> + Thread t = Thread.start { + new MessageSender().sendMsg() + } + threads << t + } + + ThreadFacade thdf = bean(ThreadFacade.class) + + ChainInfo info = thdf.getChainTaskInfo("http-send-in-queue") + assert info.runningTask.size() <= 1 + sleep(100) + info = thdf.getChainTaskInfo("http-send-in-queue") + assert info.runningTask.size() <= 1 + + threads.each { it.join() } + } + @Override void test() { + bus = bean(CloudBus.class) + testStepSend() testManagementNodeGone() testSendToMissingNode() + testFutureCompletionSend() + testFutureCompletionSendToNonExistService() + testFutureCompletionSendTimeout() + testFutureCompletionSendToMissingNode() + CloudBusGlobalProperty.HTTP_ALWAYS = true + + testFutureCompletionSend() + testFutureCompletionSendToNonExistService() + testFutureCompletionSendTimeout() + testFutureCompletionSendToMissingNode() + + testSendQueue() + bus.unregisterService(service) + CloudBusGlobalProperty.HTTP_ALWAYS = false } } diff --git a/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/ManagementNodeNotFoundHandlerCase.groovy b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/ManagementNodeNotFoundHandlerCase.groovy index 2b7a0a7c2f3..5edf88e951d 100755 --- a/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/ManagementNodeNotFoundHandlerCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/ManagementNodeNotFoundHandlerCase.groovy @@ -3,10 +3,12 @@ package org.zstack.test.integration.core.cloudbus import org.zstack.core.Platform import org.zstack.core.cloudbus.CloudBus import org.zstack.core.cloudbus.CloudBusGlobalConfig +import org.zstack.core.cloudbus.DeadMessageManager import org.zstack.core.cloudbus.DeadMessageManagerImpl import org.zstack.core.cloudbus.EventFacade import org.zstack.core.db.DatabaseFacade import org.zstack.header.AbstractService +import org.zstack.header.core.FutureCompletion import org.zstack.header.managementnode.ManagementNodeCanonicalEvent import org.zstack.header.managementnode.ManagementNodeInventory import org.zstack.header.managementnode.ManagementNodeState @@ -22,6 +24,8 @@ import org.zstack.testlib.SubCase import java.util.concurrent.TimeUnit class ManagementNodeNotFoundHandlerCase extends SubCase { + DeadMessageManagerImpl mgr + @Override void clean() { } @@ -33,7 +37,7 @@ class ManagementNodeNotFoundHandlerCase extends SubCase { @Override void environment() { - DeadMessageManagerImpl mgr = bean(DeadMessageManagerImpl.class) + mgr = bean(DeadMessageManagerImpl.class) mgr.managementNodeNotFoundHandlers.invalidateAll() mgr.managementNodeNotFoundHandlers.cleanUp() @@ -46,7 +50,7 @@ class ManagementNodeNotFoundHandlerCase extends SubCase { ManagementNodeVO vo = new ManagementNodeVO( hostName: "127.0.0.10", // mock a future heartbeat - heartBeat: new Date(System.currentTimeMillis() + TimeUnit.HOURS.toMillis(1)).toTimestamp(), + heartBeat: new Date(System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(5)).toTimestamp(), uuid: mgmtUuid, port: 8989, state: ManagementNodeState.RUNNING @@ -74,6 +78,7 @@ class ManagementNodeNotFoundHandlerCase extends SubCase { def secondNodeService = new AbstractService() { @Override void handleMessage(Message msg) { + logger.debug("received message[${msg.id}] on service[${getId()}]") message = msg } @@ -95,17 +100,18 @@ class ManagementNodeNotFoundHandlerCase extends SubCase { StartVmInstanceReply reply = new StartVmInstanceReply() bus.makeServiceIdByManagementNodeId(reply, secondServiceName, secondNodeUuid) - bus.send(reply) + FutureCompletion c = bus.send(reply) assert message == null bus.registerService(secondNodeService) + c.await() + assert !mgr.managementNodeNotFoundHandlers.asMap().values().message.contains(reply) Closure cleanup = mockAManagementNode(secondNodeUuid) - retryInSecs { - assert message == null - } + sleep(1000) + assert message == null cleanup() bus.unregisterService(secondNodeService) @@ -120,6 +126,7 @@ class ManagementNodeNotFoundHandlerCase extends SubCase { def secondNodeService = new AbstractService() { @Override void handleMessage(Message msg) { + logger.debug("received message[${msg.id}] on service[${getId()}]") message = msg } @@ -141,17 +148,17 @@ class ManagementNodeNotFoundHandlerCase extends SubCase { StartVmInstanceMsg msg = new StartVmInstanceMsg() bus.makeServiceIdByManagementNodeId(msg, secondServiceName, secondNodeUuid) - bus.send(msg) + FutureCompletion c = bus.send(msg) assert message == null bus.registerService(secondNodeService) - + c.await() + assert !mgr.managementNodeNotFoundHandlers.asMap().values().message.contains(msg) Closure cleanup = mockAManagementNode(secondNodeUuid) - retryInSecs { - assert message == null - } + sleep(1000) + assert message == null cleanup() bus.unregisterService(secondNodeService) @@ -166,6 +173,7 @@ class ManagementNodeNotFoundHandlerCase extends SubCase { def secondNodeService = new AbstractService() { @Override void handleMessage(Message msg) { + logger.debug("received message[${msg.id}] on service[${getId()}]") message = msg } @@ -190,12 +198,15 @@ class ManagementNodeNotFoundHandlerCase extends SubCase { StartVmInstanceReply reply = new StartVmInstanceReply() bus.makeServiceIdByManagementNodeId(reply, secondServiceName, secondNodeUuid) - bus.send(reply) + FutureCompletion c = bus.send(reply) assert message == null bus.registerService(secondNodeService) + // send is a async operation, so we need to wait a bit + c.await() + assert mgr.managementNodeNotFoundHandlers.asMap().values().message.contains(reply) Closure cleanup = mockAManagementNode(secondNodeUuid) retryInSecs { diff --git a/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/MessageSender.java b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/MessageSender.java new file mode 100644 index 00000000000..24aabd81056 --- /dev/null +++ b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/MessageSender.java @@ -0,0 +1,43 @@ +package org.zstack.test.integration.core.cloudbus; + +import org.zstack.core.Platform; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.thread.SyncTask; +import org.zstack.core.thread.SyncThread; +import org.zstack.core.thread.ThreadFacade; +import org.zstack.header.core.FutureCompletion; +import org.zstack.header.vm.StartVmInstanceMsg; + +public class MessageSender { + + void sendMsg() { + CloudBus bus = Platform.getComponentLoader().getComponent(CloudBus.class); + ThreadFacade thread = Platform.getComponentLoader().getComponent(ThreadFacade.class); + + thread.syncSubmit(new SyncTask() { + @Override + public Void call() throws Exception { + StartVmInstanceMsg msg = new StartVmInstanceMsg(); + bus.makeLocalServiceId(msg, "testFutureCompletionSend"); + FutureCompletion completion = bus.send(msg); + completion.await(5000L); + return null; + } + + @Override + public String getName() { + return "MessageSender.sendMsg"; + } + + @Override + public int getSyncLevel() { + return 1; + } + + @Override + public String getSyncSignature() { + return getName(); + } + }); + } +} diff --git a/test/src/test/groovy/org/zstack/test/integration/portal/ManagementNodeHeartbeatCase.groovy b/test/src/test/groovy/org/zstack/test/integration/portal/ManagementNodeHeartbeatCase.groovy index 6684b602860..a6940fab90e 100644 --- a/test/src/test/groovy/org/zstack/test/integration/portal/ManagementNodeHeartbeatCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/portal/ManagementNodeHeartbeatCase.groovy @@ -58,10 +58,10 @@ class ManagementNodeHeartbeatCase extends SubCase { } void testUnexpectedManagementNodeRecord() { + prepareInvalidRecords() ManagementNodeGlobalConfig.NODE_HEARTBEAT_INTERVAL.updateValue(1) PortalGlobalProperty.MAX_HEARTBEAT_FAILURE = 2 - prepareInvalidRecords() int heartbeatFailureTimeout = ManagementNodeGlobalConfig.NODE_HEARTBEAT_INTERVAL.value(Integer.class) * PortalGlobalProperty.MAX_HEARTBEAT_FAILURE int heartbeatUpdateDelay = 1 * ManagementNodeGlobalConfig.NODE_HEARTBEAT_INTERVAL.value(Integer.class) @@ -80,7 +80,12 @@ class ManagementNodeHeartbeatCase extends SubCase { assert count == 2 // wait one more interval to wait 127.0.0.111 cleaned - sleep(TimeUnit.SECONDS.toMillis(failureInterval * 3)) + // exceed 3s will be added in suspects + // next heartbeat will be clean + // but hb timestamp is second precision, so it will not be added until 4s. + // and cleaned after 5s + // so we need to wait more than 5s + sleep(TimeUnit.SECONDS.toMillis(failureInterval * 3) + 500) count = dbf.count(ManagementNodeVO.class) assert count == 1 From 5b611a5ea0522b42dec3dfe15a4740362984e596 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Tue, 17 Jun 2025 14:11:56 +0800 Subject: [PATCH 389/737] [storage]: create record after create image cache Resolves: ZSTAC-73992 Change-Id: I776d7975637069736c656e716474637872677273 (cherry picked from commit 43864f41189e419a1aff7e080f5b5afef63eee92) --- .../addon/primary/ExternalPrimaryStorage.java | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index ea3bd38e192..6bcbbf97f6e 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -606,8 +606,9 @@ public void run(MessageReply r) { } }); + flow(new Flow() { - final String __name__ = "clone-volume"; + final String __name__ = "create-image-cache-from-volume-snapshot"; @Override public void run(FlowTrigger trigger, Map data) { @@ -657,6 +658,39 @@ public void fail(ErrorCode errorCode) { } }); + flow(new NoRollbackFlow() { + String __name__ = "create-image-cache-snapshot"; + + @Override + public void run(FlowTrigger trigger, Map data) { + CreateVolumeSnapshotSpec sspec = new CreateVolumeSnapshotSpec(); + sspec.setVolumeInstallPath(imageCachePath); + sspec.setName(buildSnapshotName(msg.getImageInventory().getUuid())); + controller.createSnapshot(sspec, new ReturnValueCompletion(trigger) { + @Override + public void success(VolumeSnapshotStats returnValue) { + ImageCacheVO cvo = new ImageCacheVO(); + cvo.setMd5sum("not calculated"); + cvo.setInstallUrl(returnValue.getInstallPath()); + cvo.setImageUuid((msg.getImageInventory().getUuid())); + cvo.setPrimaryStorageUuid(self.getUuid()); + cvo.setMediaType(ImageConstant.ImageMediaType.valueOf( + msg.getImageInventory().getMediaType()) + ); + cvo.setState(ImageCacheState.ready); + cvo.setSize(returnValue.getActualSize()); + dbf.persist(cvo); + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + done(new FlowDoneHandler(msg) { @Override public void handle(Map data) { @@ -1319,7 +1353,7 @@ public boolean skip(Map data) { public void run(FlowTrigger trigger, Map data) { CreateVolumeSnapshotSpec sspec = new CreateVolumeSnapshotSpec(); sspec.setVolumeInstallPath(volume.getInstallPath()); - sspec.setName(spec.getName()); + sspec.setName(buildSnapshotName(spec.getUuid())); controller.createSnapshot(sspec, new ReturnValueCompletion(trigger) { @Override public void success(VolumeSnapshotStats returnValue) { From de102da6d0889221abf6af904f3e463a88a0d1f9 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Tue, 24 Jun 2025 11:32:49 +0800 Subject: [PATCH 390/737] [message]: trimspace character in api string list para Resolves: ZSTAC-75257 Change-Id: I736c707365626679737873676c7a7578676a6a7a --- .../org/zstack/header/message/APIMessage.java | 14 +++++++++++++ .../OperateLoadBalancerCase.groovy | 21 ++++++++++++++++++- .../ChangeSecurityGroupRuleCase.groovy | 2 +- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/header/src/main/java/org/zstack/header/message/APIMessage.java b/header/src/main/java/org/zstack/header/message/APIMessage.java index dfd1ad59dff..bffc2cc75d0 100755 --- a/header/src/main/java/org/zstack/header/message/APIMessage.java +++ b/header/src/main/java/org/zstack/header/message/APIMessage.java @@ -219,6 +219,20 @@ public void validate(Collection validators) throws IllegalA value = ((String) value).trim(); f.set(this, value); } + + if (value instanceof List && !at.noTrim()) { + List valueList = (List) value; + if (!valueList.isEmpty()) { + boolean allStrings = valueList.stream().allMatch(element -> element instanceof String); + if (allStrings) { + List valueNew = new ArrayList<>(); + for (Object element : valueList) { + valueNew.add(((String) element).trim()); + } + f.set(this, valueNew); + } + } + } for (ApiMessageValidator validator : validators) { validator.validate(this, f, value, at); diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/loadbalancer/OperateLoadBalancerCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/loadbalancer/OperateLoadBalancerCase.groovy index 71d579c459c..dd346c6eb24 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/loadbalancer/OperateLoadBalancerCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/loadbalancer/OperateLoadBalancerCase.groovy @@ -17,6 +17,7 @@ import org.zstack.sdk.L3NetworkInventory import org.zstack.sdk.LoadBalancerInventory import org.zstack.sdk.LoadBalancerListenerInventory import org.zstack.sdk.SystemTagInventory +import org.zstack.sdk.TagInventory import org.zstack.sdk.VipInventory import org.zstack.sdk.VirtualRouterOfferingInventory import org.zstack.sdk.VirtualRouterVmInventory @@ -296,14 +297,32 @@ class OperateLoadBalancerCase extends SubCase { assert Q.New(VipNetworkServicesRefVO.class).eq(VipNetworkServicesRefVO_.vipUuid, vip.getUuid()).select(VipNetworkServicesRefVO_.serviceType).findValue() == VipUseForList.LB_NETWORK_SERVICE_TYPE assert Q.New(VipPeerL3NetworkRefVO.class).eq(VipPeerL3NetworkRefVO_.vipUuid, vip.getUuid()).count() == 0 + List httpAlgos = ["deflate","gzip", "raw-deflate"] + List httpAlgosInput = ["deflate","gzip", "raw-deflate\n"] def listener = createLoadBalancerListener { loadBalancerUuid = lb.uuid name = "listener" instancePort = 22 loadBalancerPort = 22 - protocol = LoadBalancerConstants.LB_PROTOCOL_TCP + protocol = LoadBalancerConstants.LB_PROTOCOL_HTTP + httpCompressAlgos = httpAlgosInput } as LoadBalancerListenerInventory + String httpAlgosTag = String.join(" ", httpAlgos) + List tags = querySystemTag { + conditions = [ + "resourceUuid=${listener.uuid}", + "tag=httpCompressAlgos::${httpAlgosTag}".toString() + ]} + assert tags.size() == 1 + httpAlgosTag = String.join(" ", httpAlgosInput) + tags = querySystemTag { + conditions = [ + "resourceUuid=${listener.uuid}", + "tag=httpCompressAlgos::${httpAlgosTag}".toString() + ]} + assert tags.size() == 0 + def result = getCandidateVmNicsForLoadBalancer { listenerUuid = listener.uuid } as List diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ChangeSecurityGroupRuleCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ChangeSecurityGroupRuleCase.groovy index 27064ffc76d..5090a5d3989 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ChangeSecurityGroupRuleCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ChangeSecurityGroupRuleCase.groovy @@ -374,7 +374,7 @@ class ChangeSecurityGroupRuleCase extends SubCase { r.description = 'ingress-rule-1' r.ipVersion = 4 r.dstPortRange = '300-400' - r.srcIpRange = '3.3.3.3' + r.srcIpRange = '3.3.3.0/24\n' r.protocol = 'TCP' sg4 = addSecurityGroupRule { From f83f10ea18b708293bb04b70d5f1d74d6ebcb510 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Thu, 26 Jun 2025 14:44:01 +0800 Subject: [PATCH 391/737] [conf]: update checksum Resolves: ZSTAC-74994 Change-Id: I6c746d766463626b69747571746a697571766c61 --- conf/db/upgrade/beforeValidate.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/db/upgrade/beforeValidate.sql b/conf/db/upgrade/beforeValidate.sql index 803f99bd760..0de10ef5711 100644 --- a/conf/db/upgrade/beforeValidate.sql +++ b/conf/db/upgrade/beforeValidate.sql @@ -38,7 +38,7 @@ BEGIN update `zstack`.`schema_version` set `checksum`=1298863127 where `script`='V5.3.0__schema.sql' and `checksum` <> 1298863127; update `zstack`.`schema_version` set `checksum`=613548663 where `script`='V5.3.6__schema.sql' and `checksum` <> 613548663; update `zstack`.`schema_version` set `checksum`=1489363540 where `script`='V5.3.22__schema.sql' and `checksum` <> 1489363540; - update `zstack`.`schema_version` set `checksum`=1648524318 where `script`='V4.4.0__schema.sql' and `checksum` <> 681550888; + update `zstack`.`schema_version` set `checksum`=1648524318 where `script`='V4.4.0__schema.sql' and `checksum` <> 1648524318; END IF; END $$ From ec5c145495f372b0d7a1d3dceaf1039825768cc8 Mon Sep 17 00:00:00 2001 From: J M Date: Fri, 13 Jun 2025 18:14:28 +0800 Subject: [PATCH 392/737] [storage]: adjust snapshot interface and gc GlobalConfigImpact Resolves: ZSTAC-56555 Change-Id: I676d737a67696c6277756b66717970786d746d71 --- .../zstack/core/trash/StorageRecycleImpl.java | 17 +++++--------- .../DeleteOnPrimaryStorageMessage.java | 5 ++++ .../DeleteSnapshotOnPrimaryStorageMsg.java | 12 +++++++++- .../DeleteSnapshotOnPrimaryStorageReply.java | 9 ++++++++ .../DeleteVolumeChainOnPrimaryStorageMsg.java | 10 ++++++-- ...lumeSnapshotAfterDeleteExtensionPoint.java | 4 ++-- .../VolumeBeforeExpungeExtensionPoint.java | 3 ++- .../ceph/primary/CephPrimaryStorageBase.java | 6 +++-- ...ephVolumeSnapshotAfterDeleteExtension.java | 9 +++----- .../primary/local/LocalStorageBase.java | 9 ++++---- .../primary/nfs/NfsPrimaryStorage.java | 1 + .../zstack/storage/zbs/ZbsStorageFactory.java | 10 +++----- .../snapshot/DeleteVolumeSnapshotGC.java | 13 +++++------ .../storage/snapshot/VolumeSnapshotBase.java | 23 ++++--------------- .../snapshot/VolumeSnapshotManagerImpl.java | 18 +++------------ .../snapshot/VolumeSnapshotTreeBase.java | 2 +- .../org/zstack/storage/volume/VolumeBase.java | 14 ++--------- .../storage/primary/ceph/CephGCCase.groovy | 6 ++--- 18 files changed, 78 insertions(+), 93 deletions(-) create mode 100644 header/src/main/java/org/zstack/header/storage/primary/DeleteOnPrimaryStorageMessage.java rename plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeSnapshotGC.java => storage/src/main/java/org/zstack/storage/snapshot/DeleteVolumeSnapshotGC.java (79%) diff --git a/core/src/main/java/org/zstack/core/trash/StorageRecycleImpl.java b/core/src/main/java/org/zstack/core/trash/StorageRecycleImpl.java index 01b22920781..1e13efa02ae 100644 --- a/core/src/main/java/org/zstack/core/trash/StorageRecycleImpl.java +++ b/core/src/main/java/org/zstack/core/trash/StorageRecycleImpl.java @@ -15,7 +15,7 @@ import org.zstack.core.thread.PeriodicTask; import org.zstack.core.thread.ThreadFacade; import org.zstack.header.Component; -import org.zstack.header.core.Completion; +import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.core.trash.InstallPathRecycleInventory; import org.zstack.header.core.trash.InstallPathRecycleVO; import org.zstack.header.core.trash.InstallPathRecycleVO_; @@ -297,7 +297,7 @@ public void removeFromDb(Long trashId) { UpdateQuery.New(InstallPathRecycleVO.class).eq(InstallPathRecycleVO_.trashId, trashId).delete(); } - private void deleteTrashForVolume(String resourceUuid, String primaryStorageUuid, Completion completion) { + private void deleteTrashForVolume(String resourceUuid, String primaryStorageUuid, NoErrorCompletion completion) { List vos = Q.New(InstallPathRecycleVO.class).eq(InstallPathRecycleVO_.storageUuid, primaryStorageUuid).list(); List trashIds = new ArrayList<>(); for (InstallPathRecycleVO vo: vos) { @@ -309,9 +309,9 @@ private void deleteTrashForVolume(String resourceUuid, String primaryStorageUuid deleteTrashForVolume(trashIds.iterator(), primaryStorageUuid, completion); } - private void deleteTrashForVolume(final Iterator trashIds, String primaryStorageUuid, Completion completion) { + private void deleteTrashForVolume(final Iterator trashIds, String primaryStorageUuid, NoErrorCompletion completion) { if (!trashIds.hasNext()) { - completion.success(); + completion.done(); return; } Long trashId = trashIds.next(); @@ -333,15 +333,10 @@ public void run(MessageReply reply) { } @Override - public void volumeSnapshotAfterDeleteExtensionPoint(VolumeSnapshotInventory snapshot, Completion completion) { + public void volumeSnapshotAfterDeleteExtensionPoint(VolumeSnapshotInventory snapshot, NoErrorCompletion completion) { deleteTrashForVolume(snapshot.getUuid(), snapshot.getPrimaryStorageUuid(), completion); } - @Override - public void volumeSnapshotAfterFailedDeleteExtensionPoint(VolumeSnapshotInventory snapshot) { - - } - @Override public void volumeSnapshotAfterCleanUpExtensionPoint(String volumeUuid, List snapshots) { } @@ -432,7 +427,7 @@ public boolean stop() { public void volumePreExpunge(VolumeInventory volume) {} @Override - public void volumeBeforeExpunge(VolumeInventory volume, Completion completion) { + public void volumeBeforeExpunge(VolumeInventory volume, NoErrorCompletion completion) { deleteTrashForVolume(volume.getUuid(), volume.getPrimaryStorageUuid(), completion); } diff --git a/header/src/main/java/org/zstack/header/storage/primary/DeleteOnPrimaryStorageMessage.java b/header/src/main/java/org/zstack/header/storage/primary/DeleteOnPrimaryStorageMessage.java new file mode 100644 index 00000000000..e3e6acec382 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/primary/DeleteOnPrimaryStorageMessage.java @@ -0,0 +1,5 @@ +package org.zstack.header.storage.primary; + +public interface DeleteOnPrimaryStorageMessage extends PrimaryStorageMessage { + boolean isGcOnFailure(); +} diff --git a/header/src/main/java/org/zstack/header/storage/primary/DeleteSnapshotOnPrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/primary/DeleteSnapshotOnPrimaryStorageMsg.java index ff8302a44ba..839eecf6e85 100755 --- a/header/src/main/java/org/zstack/header/storage/primary/DeleteSnapshotOnPrimaryStorageMsg.java +++ b/header/src/main/java/org/zstack/header/storage/primary/DeleteSnapshotOnPrimaryStorageMsg.java @@ -5,8 +5,9 @@ /** */ -public class DeleteSnapshotOnPrimaryStorageMsg extends NeedReplyMessage implements PrimaryStorageMessage { +public class DeleteSnapshotOnPrimaryStorageMsg extends NeedReplyMessage implements DeleteOnPrimaryStorageMessage { private VolumeSnapshotInventory snapshot; + private boolean gcOnFailure = false; @Override public String getPrimaryStorageUuid() { @@ -20,4 +21,13 @@ public VolumeSnapshotInventory getSnapshot() { public void setSnapshot(VolumeSnapshotInventory snapshot) { this.snapshot = snapshot; } + + @Override + public boolean isGcOnFailure() { + return gcOnFailure; + } + + public void setGcOnFailure(boolean gcOnFailure) { + this.gcOnFailure = gcOnFailure; + } } diff --git a/header/src/main/java/org/zstack/header/storage/primary/DeleteSnapshotOnPrimaryStorageReply.java b/header/src/main/java/org/zstack/header/storage/primary/DeleteSnapshotOnPrimaryStorageReply.java index ed29cbe5e69..39a8a89bf44 100755 --- a/header/src/main/java/org/zstack/header/storage/primary/DeleteSnapshotOnPrimaryStorageReply.java +++ b/header/src/main/java/org/zstack/header/storage/primary/DeleteSnapshotOnPrimaryStorageReply.java @@ -5,4 +5,13 @@ /** */ public class DeleteSnapshotOnPrimaryStorageReply extends MessageReply { + private boolean gcSubmitted = false; + + public void setGcSubmitted(boolean gcSubmitted) { + this.gcSubmitted = gcSubmitted; + } + + public boolean isGcSubmitted() { + return gcSubmitted; + } } diff --git a/header/src/main/java/org/zstack/header/storage/primary/DeleteVolumeChainOnPrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/primary/DeleteVolumeChainOnPrimaryStorageMsg.java index 6faaa5e56b4..f635eb61318 100644 --- a/header/src/main/java/org/zstack/header/storage/primary/DeleteVolumeChainOnPrimaryStorageMsg.java +++ b/header/src/main/java/org/zstack/header/storage/primary/DeleteVolumeChainOnPrimaryStorageMsg.java @@ -5,15 +5,16 @@ import java.util.List; -public class DeleteVolumeChainOnPrimaryStorageMsg extends NeedReplyMessage implements PrimaryStorageMessage { +public class DeleteVolumeChainOnPrimaryStorageMsg extends NeedReplyMessage implements DeleteOnPrimaryStorageMessage { private String primaryStorageUuid; - + // TODO remove this field, use url instead private String hostUuid; private List installPaths; private String volumeFormat; + // TODO refactor, remove it // for gc, used to deduplicate GC private String chainTop; @@ -62,4 +63,9 @@ public String getChainTop() { public void setChainTop(String chainTop) { this.chainTop = chainTop; } + + @Override + public boolean isGcOnFailure() { + return true; + } } diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotAfterDeleteExtensionPoint.java b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotAfterDeleteExtensionPoint.java index 0044b6ca8fb..da1592442ad 100755 --- a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotAfterDeleteExtensionPoint.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotAfterDeleteExtensionPoint.java @@ -1,6 +1,7 @@ package org.zstack.header.storage.snapshot; import org.zstack.header.core.Completion; +import org.zstack.header.core.NoErrorCompletion; import java.util.List; @@ -8,7 +9,6 @@ * Created by xing5 on 2016/5/3. */ public interface VolumeSnapshotAfterDeleteExtensionPoint { - void volumeSnapshotAfterDeleteExtensionPoint(VolumeSnapshotInventory snapshot, Completion completion); - void volumeSnapshotAfterFailedDeleteExtensionPoint(VolumeSnapshotInventory snapshot); + void volumeSnapshotAfterDeleteExtensionPoint(VolumeSnapshotInventory snapshot, NoErrorCompletion completion); void volumeSnapshotAfterCleanUpExtensionPoint(String volumeUuid, List snapshots); } diff --git a/header/src/main/java/org/zstack/header/volume/VolumeBeforeExpungeExtensionPoint.java b/header/src/main/java/org/zstack/header/volume/VolumeBeforeExpungeExtensionPoint.java index 3d6f8f76c78..673c7cbf9bd 100755 --- a/header/src/main/java/org/zstack/header/volume/VolumeBeforeExpungeExtensionPoint.java +++ b/header/src/main/java/org/zstack/header/volume/VolumeBeforeExpungeExtensionPoint.java @@ -1,13 +1,14 @@ package org.zstack.header.volume; import org.zstack.header.core.Completion; +import org.zstack.header.core.NoErrorCompletion; /** * Created by xing5 on 2016/5/3. */ public interface VolumeBeforeExpungeExtensionPoint { void volumePreExpunge(VolumeInventory volume); - void volumeBeforeExpunge(VolumeInventory volume, Completion completion); + void volumeBeforeExpunge(VolumeInventory volume, NoErrorCompletion completion); default boolean skipExpungeVolume(VolumeInventory volume) { return false; diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java index 17a6a013412..300b4413ece 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java @@ -72,6 +72,7 @@ import org.zstack.storage.ceph.primary.CephPrimaryStorageMonBase.PingOperationFailure; import org.zstack.storage.ceph.primary.capacity.CephOsdGroupCapacityHelper; import org.zstack.storage.primary.*; +import org.zstack.storage.snapshot.DeleteVolumeSnapshotGC; import org.zstack.storage.volume.VolumeErrors; import org.zstack.storage.volume.VolumeSystemTags; import org.zstack.tag.SystemTag; @@ -5382,12 +5383,13 @@ public void success(DeleteSnapshotRsp returnValue) { @Override public void fail(ErrorCode errorCode) { - CephDeleteVolumeSnapshotGC snapshotGC = new CephDeleteVolumeSnapshotGC(); + // ceph has trash, so children may not be deleted immediately. + DeleteVolumeSnapshotGC snapshotGC = new DeleteVolumeSnapshotGC(); snapshotGC.NAME = String.format("gc-ceph-%s-volumesnapshot-path-%s", self.getUuid(), cmd.snapshotPath); snapshotGC.primaryStorageUuid = self.getUuid(); snapshotGC.volumeSnapshot = msg.getSnapshot(); snapshotGC.deduplicateSubmit(CephGlobalConfig.GC_INTERVAL.value(Long.class), TimeUnit.SECONDS); - reply.setError(errorCode); + reply.setGcSubmitted(true); bus.reply(msg, reply); completion.done(); } diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephVolumeSnapshotAfterDeleteExtension.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephVolumeSnapshotAfterDeleteExtension.java index 0dbffe4e008..71287bce671 100644 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephVolumeSnapshotAfterDeleteExtension.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephVolumeSnapshotAfterDeleteExtension.java @@ -7,6 +7,7 @@ import org.zstack.core.db.SQL; import org.zstack.core.trash.StorageTrash; import org.zstack.header.core.Completion; +import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.storage.primary.DeleteVolumeBitsOnPrimaryStorageMsg; import org.zstack.header.storage.primary.PrimaryStorageConstant; import org.zstack.header.storage.snapshot.VolumeSnapshotAfterDeleteExtensionPoint; @@ -30,12 +31,8 @@ public class CephVolumeSnapshotAfterDeleteExtension implements VolumeSnapshotAft private static final CLogger logger = Utils.getLogger(CephVolumeSnapshotAfterDeleteExtension.class); @Override - public void volumeSnapshotAfterDeleteExtensionPoint(VolumeSnapshotInventory snapshot, Completion completion) { - completion.success(); - } - - @Override - public void volumeSnapshotAfterFailedDeleteExtensionPoint(VolumeSnapshotInventory snapshot) { + public void volumeSnapshotAfterDeleteExtensionPoint(VolumeSnapshotInventory snapshot, NoErrorCompletion completion) { + completion.done(); } private String getVolumeInstallPathFromSnapshot(String snapshotInstallPath) { diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java index 1ec8926d1dc..8825eb3c99e 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java @@ -43,7 +43,9 @@ import org.zstack.storage.primary.*; import org.zstack.storage.primary.local.APIGetLocalStorageHostDiskCapacityReply.HostDiskCapacity; import org.zstack.storage.primary.local.MigrateBitsStruct.ResourceInfo; +import org.zstack.storage.snapshot.DeleteVolumeSnapshotGC; import org.zstack.storage.snapshot.reference.VolumeSnapshotReferenceUtils; +import org.zstack.storage.volume.VolumeErrors; import org.zstack.storage.volume.VolumeSystemTags; import org.zstack.tag.SystemTagCreator; import org.zstack.utils.CollectionDSL; @@ -1448,7 +1450,7 @@ protected void handle(final DeleteSnapshotOnPrimaryStorageMsg msg) { FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setName(String.format("delete-snapshot-%s-on-local-storage-%s", msg.getSnapshot().getUuid(), self.getUuid())); chain.then(new ShareFlow() { - DeleteSnapshotOnPrimaryStorageReply reply; + DeleteSnapshotOnPrimaryStorageReply reply = new DeleteSnapshotOnPrimaryStorageReply(); @Override public void setup() { @@ -1459,10 +1461,9 @@ public void setup() { public void run(final FlowTrigger trigger, Map data) { LocalStorageHypervisorFactory f = getHypervisorBackendFactoryByHostUuid(hostUuid); LocalStorageHypervisorBackend bkd = f.getHypervisorBackend(self); - bkd.handle(msg, hostUuid, new ReturnValueCompletion(trigger) { + bkd.deleteBits(msg.getSnapshot().getPrimaryStorageInstallPath(), hostUuid, new Completion(trigger) { @Override - public void success(DeleteSnapshotOnPrimaryStorageReply returnValue) { - reply = returnValue; + public void success() { trigger.next(); } diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java index 1b6a5057b78..63f0bba79bc 100755 --- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java +++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java @@ -595,6 +595,7 @@ public void fail(ErrorCode errorCode) { gc.primaryStorageUuid = self.getUuid(); gc.hypervisorType = bkd.getHypervisorType().toString(); gc.submit(NfsPrimaryStorageGlobalConfig.GC_INTERVAL.value(Long.class), TimeUnit.SECONDS); + reply.setGcSubmitted(true); logger.warn(String.format("NFS primary storage[uuid:%s] failed to delete a volume snapshot[uuid:%s], %s. A GC" + " job[uuid:%s] is scheduled to cleanup it in the interval of %s seconds", diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java index 95b73d955f1..1d6707119ed 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java @@ -8,6 +8,7 @@ import org.zstack.core.trash.StorageTrash; import org.zstack.externalStorage.primary.ExternalStorageFencerType; import org.zstack.header.core.Completion; +import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.storage.addon.primary.*; import org.zstack.header.storage.primary.DeleteVolumeBitsOnPrimaryStorageMsg; @@ -74,13 +75,8 @@ public String getIdentity() { } @Override - public void volumeSnapshotAfterDeleteExtensionPoint(VolumeSnapshotInventory snapshot, Completion completion) { - completion.success(); - } - - @Override - public void volumeSnapshotAfterFailedDeleteExtensionPoint(VolumeSnapshotInventory snapshot) { - + public void volumeSnapshotAfterDeleteExtensionPoint(VolumeSnapshotInventory snapshot, NoErrorCompletion completion) { + completion.done(); } private boolean isCbdProtocol(String volumeUuid) { diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeSnapshotGC.java b/storage/src/main/java/org/zstack/storage/snapshot/DeleteVolumeSnapshotGC.java similarity index 79% rename from plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeSnapshotGC.java rename to storage/src/main/java/org/zstack/storage/snapshot/DeleteVolumeSnapshotGC.java index d7cdf706aa3..e2a4adf8dd8 100644 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeSnapshotGC.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/DeleteVolumeSnapshotGC.java @@ -1,4 +1,4 @@ -package org.zstack.storage.ceph.primary; +package org.zstack.storage.snapshot; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.gc.GC; @@ -6,22 +6,22 @@ import org.zstack.core.gc.TimeBasedGarbageCollector; import org.zstack.header.message.MessageReply; import org.zstack.header.storage.primary.DeleteSnapshotOnPrimaryStorageMsg; -import org.zstack.header.storage.primary.DeleteVolumeBitsOnPrimaryStorageMsg; import org.zstack.header.storage.primary.PrimaryStorageConstant; +import org.zstack.header.storage.primary.PrimaryStorageInventory; import org.zstack.header.storage.primary.PrimaryStorageVO; import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; -import org.zstack.header.volume.VolumeInventory; -import org.zstack.storage.volume.VolumeErrors; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; -public class CephDeleteVolumeSnapshotGC extends TimeBasedGarbageCollector { +public class DeleteVolumeSnapshotGC extends TimeBasedGarbageCollector { @GC public String primaryStorageUuid; @GC public VolumeSnapshotInventory volumeSnapshot; + @GC + public String fullInstallUrl; - private static final CLogger logger = Utils.getLogger(CephDeleteVolumeSnapshotGC.class); + private static final CLogger logger = Utils.getLogger(DeleteVolumeSnapshotGC.class); @Override protected void triggerNow(GCCompletion completion) { @@ -46,4 +46,3 @@ public void run(MessageReply reply) { }); } } - diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotBase.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotBase.java index 2195fb7576a..4a4ae42f1a4 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotBase.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotBase.java @@ -11,6 +11,7 @@ import org.zstack.core.cloudbus.MessageSafe; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.gc.GCGlobalConfig; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; import org.zstack.header.core.Completion; @@ -222,17 +223,7 @@ private void handle(final VolumeSnapshotPrimaryStorageDeletionMsg msg) { chain.then(new ShareFlow() { private void finish() { new While<>(pluginRgty.getExtensionList(VolumeSnapshotAfterDeleteExtensionPoint.class)).all((ext, c) -> { - ext.volumeSnapshotAfterDeleteExtensionPoint(sp, new Completion(c) { - @Override - public void success() { - c.done(); - } - - @Override - public void fail(ErrorCode errorCode) { - c.done(); - } - }); + ext.volumeSnapshotAfterDeleteExtensionPoint(sp, c); }).run(new WhileDoneCompletion(msg) { @Override public void done(ErrorCodeList errorCodeList) { @@ -259,13 +250,6 @@ private void updateDb() { } private void errors(ErrorCode errorCode) { - CollectionUtils.safeForEach(pluginRgty.getExtensionList(VolumeSnapshotAfterDeleteExtensionPoint.class), new ForEachFunction() { - @Override - public void run(VolumeSnapshotAfterDeleteExtensionPoint arg) { - arg.volumeSnapshotAfterFailedDeleteExtensionPoint(sp); - } - }); - VolumeSnapshotPrimaryStorageDeletionReply dreply = new VolumeSnapshotPrimaryStorageDeletionReply(); dreply.setError(errorCode); bus.reply(msg, dreply); @@ -279,6 +263,7 @@ public void setup() { public void run(final FlowTrigger trigger, Map data) { DeleteSnapshotOnPrimaryStorageMsg dmsg = new DeleteSnapshotOnPrimaryStorageMsg(); dmsg.setSnapshot(getSelfInventory()); + dmsg.setGcOnFailure(true); bus.makeTargetServiceIdByResourceUuid(dmsg, PrimaryStorageConstant.SERVICE_ID, self.getPrimaryStorageUuid()); bus.send(dmsg, new CloudBusCallBack(trigger) { @Override @@ -318,7 +303,7 @@ public void handle(Map data) { error(new FlowErrorHandler(msg) { @Override public void handle(ErrorCode errCode, Map data) { - // TODO GC + // primary storage handle gc by itself, and reply success. the flow chain will always succeed. if (VolumeSnapshotErrors.FULL_SNAPSHOT_ERROR.toString().equals(errCode.getCode())) { errors(errCode); } else { diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java index 4285ec348c8..1df8c974fee 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java @@ -17,10 +17,7 @@ import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; import org.zstack.header.AbstractService; -import org.zstack.header.core.Completion; -import org.zstack.header.core.ExceptionSafe; -import org.zstack.header.core.NopeCompletion; -import org.zstack.header.core.WhileDoneCompletion; +import org.zstack.header.core.*; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.ErrorCodeList; @@ -1316,7 +1313,7 @@ public boolean skipExpungeVolume(VolumeInventory volume) { } @Override - public void volumeBeforeExpunge(VolumeInventory volume, Completion completion) { + public void volumeBeforeExpunge(VolumeInventory volume, NoErrorCompletion completion) { List msgs = VolumeSnapshotCascadeExtension.handleVolumeExpunge(volume.getUuid()); new While<>(msgs).all((msg, c) -> { @@ -1325,22 +1322,13 @@ public void volumeBeforeExpunge(VolumeInventory volume, Completion completion) { bus.send(msg, new CloudBusCallBack(c) { @Override public void run(MessageReply reply) { - if (!reply.isSuccess()) { - c.addError(reply.getError()); - } - c.done(); } }); }).run(new WhileDoneCompletion(completion) { @Override public void done(ErrorCodeList errorCodeList) { - if (!errorCodeList.getCauses().isEmpty()) { - completion.fail(errorCodeList.getCauses().get(0)); - return; - } - - completion.success(); + completion.done(); } }); } diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java index 91487ed876f..b56f58f6033 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java @@ -671,7 +671,7 @@ public void run(List replies) { } } if (errors.getCauses().size() > 0) { - trigger.fail(errors); + trigger.fail(errors.getCauses().get(0)); } else { trigger.next(); } diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java b/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java index d62b09766fd..bd038ceccb7 100755 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java @@ -911,18 +911,8 @@ public void setup() { @Override public void run(FlowTrigger trigger, Map data) { - new While<>(exts).each((ext, c) -> ext.volumeBeforeExpunge(inv, new Completion(c) { - @Override - public void success() { - c.done(); - } - - @Override - public void fail(ErrorCode errorCode) { - logger.debug(String.format("failed to execute extension, because %s", errorCode.getDetails())); - c.done(); - } - })).run(new WhileDoneCompletion(trigger) { + new While<>(exts).each((ext, c) -> ext.volumeBeforeExpunge(inv, c)) + .run(new WhileDoneCompletion(trigger) { @Override public void done(ErrorCodeList errorCodeList) { trigger.next(); diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephGCCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephGCCase.groovy index 92db098aa63..e5644c47072 100755 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephGCCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephGCCase.groovy @@ -11,7 +11,7 @@ import org.zstack.sdk.* import org.zstack.storage.ceph.CephGlobalConfig import org.zstack.storage.ceph.primary.CephDeleteVolumeChainGC import org.zstack.storage.ceph.primary.CephDeleteVolumeGC -import org.zstack.storage.ceph.primary.CephDeleteVolumeSnapshotGC +import org.zstack.storage.snapshot.DeleteVolumeSnapshotGC import org.zstack.storage.ceph.primary.CephPrimaryStorageBase import org.zstack.storage.volume.VolumeGlobalConfig import org.zstack.storage.volume.VolumeSystemTags @@ -196,7 +196,7 @@ class CephGCCase extends SubCase { } def spGC = queryGCJob { - conditions = ["runnerClass=${CephDeleteVolumeSnapshotGC.class.name}".toString(), "context~=%${sp.primaryStorageInstallPath}%".toString()] + conditions = ["runnerClass=${DeleteVolumeSnapshotGC.class.name}".toString(), "context~=%${sp.primaryStorageInstallPath}%".toString()] } as List assert spGC.size() == 1 assert spGC[0].status != GCStatus.Done.toString() @@ -218,7 +218,7 @@ class CephGCCase extends SubCase { retryInSecs { assert queryGCJob { - conditions = ["runnerClass=${CephDeleteVolumeSnapshotGC.class.name}".toString(), "context~=%${sp.primaryStorageInstallPath}%".toString()] + conditions = ["runnerClass=${DeleteVolumeSnapshotGC.class.name}".toString(), "context~=%${sp.primaryStorageInstallPath}%".toString()] }[0].status == GCStatus.Done.toString() assert queryGCJob { conditions = ["runnerClass=${CephDeleteVolumeGC.class.name}".toString(), "context~=%${vol.installPath}%".toString()] From b18b94ac6dc26538850b297e6b52d94b0427338e Mon Sep 17 00:00:00 2001 From: J M Date: Fri, 4 Jul 2025 17:14:28 +0800 Subject: [PATCH 393/737] [identity]: enhance admin auth check simplify admin auth check logic Resolves: ZSTAC-76214 Change-Id: I61667778777979697a7a617961726c626c766a67 --- .../identity/rbac/RBACAPIRequestChecker.java | 2 +- .../org/zstack/identity/rbac/RBACManager.java | 16 +++++----------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/identity/src/main/java/org/zstack/identity/rbac/RBACAPIRequestChecker.java b/identity/src/main/java/org/zstack/identity/rbac/RBACAPIRequestChecker.java index 59131decfbb..c2eb1e54b08 100755 --- a/identity/src/main/java/org/zstack/identity/rbac/RBACAPIRequestChecker.java +++ b/identity/src/main/java/org/zstack/identity/rbac/RBACAPIRequestChecker.java @@ -36,7 +36,7 @@ public void check(RBACEntity entity) { return; } - if (PolicyUtils.isAdminOnlyAction(entity.getApiName()) && !AccountConstant.isAdminPermission(entity.getApiMessage().getSession())) { + if (!AccountConstant.isAdminPermission(entity.getApiMessage().getSession()) && PolicyUtils.isAdminOnlyAction(entity.getApiName())) { throw new OperationFailureException(err(IdentityErrors.PERMISSION_DENIED, "request api[name: %s] is admin only, can not be executed by current user", entity.getApiName())); diff --git a/identity/src/main/java/org/zstack/identity/rbac/RBACManager.java b/identity/src/main/java/org/zstack/identity/rbac/RBACManager.java index 35903c19835..650bd74cc51 100755 --- a/identity/src/main/java/org/zstack/identity/rbac/RBACManager.java +++ b/identity/src/main/java/org/zstack/identity/rbac/RBACManager.java @@ -21,20 +21,14 @@ static List getPoliciesByAPI(APIMessage message) { } static List getPoliciesBySession(final SessionInventory session) { + if (session.getAccountUuid().equals(AccountConstant.INITIAL_SYSTEM_ADMIN_UUID) || session.isAccountSession()) { + return new ArrayList<>(internalPolices); + + } + return new SQLBatchWithReturn>() { @Override protected List scripts() { - List ret = new ArrayList<>(); - if (!session.getAccountUuid().equals(AccountConstant.INITIAL_SYSTEM_ADMIN_UUID) && !session.isAccountSession()) { - ret.addAll(getPoliciesForUser(session)); - } else { - ret.addAll(internalPolices); - } - - return ret; - } - - private List getPoliciesForUser(SessionInventory session) { // polices attached to the user List vos = sql("select p from PolicyVO p, UserPolicyRefVO r where r.policyUuid = p.uuid" + " and r.userUuid = :uuid", PolicyVO.class).param("uuid", session.getUserUuid()).list(); From 7383f1da85f446612a93e778b857e88138212d40 Mon Sep 17 00:00:00 2001 From: "weiqiang.xu" Date: Sat, 5 Jul 2025 11:11:59 +0800 Subject: [PATCH 394/737] [iam2]: generate SDK for IMA2State Resolves: ZSTAC-76338 Change-Id: I6b61657a78636e6661656f706579636561776370 --- sdk/src/main/java/SourceClassMap.java | 4 ++-- .../zstack/sdk/iam2/entity/IAM2OrganizationInventory.java | 8 ++++---- .../zstack/sdk/iam2/entity/{State.java => IAM2State.java} | 2 +- .../sdk/iam2/entity/IAM2VirtualIDGroupInventory.java | 8 ++++---- .../zstack/sdk/iam2/entity/IAM2VirtualIDInventory.java | 8 ++++---- 5 files changed, 15 insertions(+), 15 deletions(-) rename sdk/src/main/java/org/zstack/sdk/iam2/entity/{State.java => IAM2State.java} (74%) diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 764c79b6e21..9c5bf94a2ed 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -441,13 +441,13 @@ public class SourceClassMap { put("org.zstack.iam2.entity.IAM2ProjectInventory", "org.zstack.sdk.iam2.entity.IAM2ProjectInventory"); put("org.zstack.iam2.entity.IAM2ProjectRoleInventory", "org.zstack.sdk.iam2.entity.IAM2ProjectRoleInventory"); put("org.zstack.iam2.entity.IAM2ProjectTemplateInventory", "org.zstack.sdk.iam2.entity.IAM2ProjectTemplateInventory"); + put("org.zstack.iam2.entity.IAM2State", "org.zstack.sdk.iam2.entity.IAM2State"); put("org.zstack.iam2.entity.IAM2VirtualIDAttributeInventory", "org.zstack.sdk.iam2.entity.IAM2VirtualIDAttributeInventory"); put("org.zstack.iam2.entity.IAM2VirtualIDGroupAttributeInventory", "org.zstack.sdk.iam2.entity.IAM2VirtualIDGroupAttributeInventory"); put("org.zstack.iam2.entity.IAM2VirtualIDGroupInventory", "org.zstack.sdk.iam2.entity.IAM2VirtualIDGroupInventory"); put("org.zstack.iam2.entity.IAM2VirtualIDInventory", "org.zstack.sdk.iam2.entity.IAM2VirtualIDInventory"); put("org.zstack.iam2.entity.OrganizationType", "org.zstack.sdk.iam2.entity.OrganizationType"); put("org.zstack.iam2.entity.ProjectState", "org.zstack.sdk.iam2.entity.ProjectState"); - put("org.zstack.iam2.entity.State", "org.zstack.sdk.iam2.entity.State"); put("org.zstack.iam2.entity.StateEvent", "org.zstack.sdk.iam2.entity.StateEvent"); put("org.zstack.iam2.project.template.Template", "org.zstack.sdk.iam2.project.template.Template"); put("org.zstack.imagereplicator.ImageReplicationGroupBackupStorageRefInventory", "org.zstack.sdk.ImageReplicationGroupBackupStorageRefInventory"); @@ -1530,13 +1530,13 @@ public class SourceClassMap { put("org.zstack.sdk.iam2.entity.IAM2ProjectInventory", "org.zstack.iam2.entity.IAM2ProjectInventory"); put("org.zstack.sdk.iam2.entity.IAM2ProjectRoleInventory", "org.zstack.iam2.entity.IAM2ProjectRoleInventory"); put("org.zstack.sdk.iam2.entity.IAM2ProjectTemplateInventory", "org.zstack.iam2.entity.IAM2ProjectTemplateInventory"); + put("org.zstack.sdk.iam2.entity.IAM2State", "org.zstack.iam2.entity.IAM2State"); put("org.zstack.sdk.iam2.entity.IAM2VirtualIDAttributeInventory", "org.zstack.iam2.entity.IAM2VirtualIDAttributeInventory"); put("org.zstack.sdk.iam2.entity.IAM2VirtualIDGroupAttributeInventory", "org.zstack.iam2.entity.IAM2VirtualIDGroupAttributeInventory"); put("org.zstack.sdk.iam2.entity.IAM2VirtualIDGroupInventory", "org.zstack.iam2.entity.IAM2VirtualIDGroupInventory"); put("org.zstack.sdk.iam2.entity.IAM2VirtualIDInventory", "org.zstack.iam2.entity.IAM2VirtualIDInventory"); put("org.zstack.sdk.iam2.entity.OrganizationType", "org.zstack.iam2.entity.OrganizationType"); put("org.zstack.sdk.iam2.entity.ProjectState", "org.zstack.iam2.entity.ProjectState"); - put("org.zstack.sdk.iam2.entity.State", "org.zstack.iam2.entity.State"); put("org.zstack.sdk.iam2.entity.StateEvent", "org.zstack.iam2.entity.StateEvent"); put("org.zstack.sdk.iam2.project.template.Template", "org.zstack.iam2.project.template.Template"); put("org.zstack.sdk.identity.role.RoleInventory", "org.zstack.header.identity.role.RoleInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2OrganizationInventory.java b/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2OrganizationInventory.java index cbea6d639db..2fe5da94bd1 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2OrganizationInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2OrganizationInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk.iam2.entity; -import org.zstack.sdk.iam2.entity.State; +import org.zstack.sdk.iam2.entity.IAM2State; import org.zstack.sdk.iam2.entity.OrganizationType; public class IAM2OrganizationInventory { @@ -29,11 +29,11 @@ public java.lang.String getDescription() { return this.description; } - public State state; - public void setState(State state) { + public IAM2State state; + public void setState(IAM2State state) { this.state = state; } - public State getState() { + public IAM2State getState() { return this.state; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/entity/State.java b/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2State.java similarity index 74% rename from sdk/src/main/java/org/zstack/sdk/iam2/entity/State.java rename to sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2State.java index d36e1349b76..393b5e08ff2 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/entity/State.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2State.java @@ -1,6 +1,6 @@ package org.zstack.sdk.iam2.entity; -public enum State { +public enum IAM2State { Enabled, Disabled, Staled, diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2VirtualIDGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2VirtualIDGroupInventory.java index e0939c640df..0cf12cbb273 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2VirtualIDGroupInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2VirtualIDGroupInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk.iam2.entity; -import org.zstack.sdk.iam2.entity.State; +import org.zstack.sdk.iam2.entity.IAM2State; public class IAM2VirtualIDGroupInventory { @@ -36,11 +36,11 @@ public java.lang.String getDescription() { return this.description; } - public State state; - public void setState(State state) { + public IAM2State state; + public void setState(IAM2State state) { this.state = state; } - public State getState() { + public IAM2State getState() { return this.state; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2VirtualIDInventory.java b/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2VirtualIDInventory.java index 97d33c26c04..b49096b1b3c 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2VirtualIDInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2VirtualIDInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk.iam2.entity; -import org.zstack.sdk.iam2.entity.State; +import org.zstack.sdk.iam2.entity.IAM2State; public class IAM2VirtualIDInventory { @@ -36,11 +36,11 @@ public java.lang.String getType() { return this.type; } - public State state; - public void setState(State state) { + public IAM2State state; + public void setState(IAM2State state) { this.state = state; } - public State getState() { + public IAM2State getState() { return this.state; } From 166b772c3bbe37d210d61fc1c9e38672a9602d20 Mon Sep 17 00:00:00 2001 From: "weiqiang.xu" Date: Mon, 21 Jul 2025 17:30:14 +0800 Subject: [PATCH 395/737] [identity]: rename enum StatementEffect to PolicyStatementEffect APIImpact Resolves: ZSTAC-76348 Change-Id: I7465787766666e6773636a78626f73766173776a --- .../identity/APICheckApiPermissionReply.java | 2 +- .../header/identity/APICreatePolicyEvent.java | 2 +- .../header/identity/APICreatePolicyMsg.java | 2 +- .../header/identity/APIQueryPolicyReply.java | 2 +- .../PolicyInventory_StatementDoc_zh_cn.groovy | 4 +- .../header/identity/PolicyStatement.java | 10 ++--- .../identity/PolicyStatementDoc_zh_cn.groovy | 6 +-- ...Effect.java => PolicyStatementEffect.java} | 2 +- .../org/zstack/header/identity/rbac/RBAC.java | 14 +++---- .../api/APIAddPolicyStatementsToRoleMsg.java | 4 +- .../role/api/APIChangeRoleStateEvent.java | 4 +- .../identity/role/api/APICreateRoleEvent.java | 4 +- .../identity/role/api/APICreateRoleMsg.java | 4 +- .../identity/role/api/APIUpdateRoleEvent.java | 4 +- .../identity/role/api/APIUpdateRoleMsg.java | 4 +- .../zstack/identity/AccountManagerImpl.java | 8 ++-- .../IAMIdentityResourceGenerator.java | 3 +- .../org/zstack/identity/rbac/RBACManager.java | 5 +-- .../identity/rbac/SystemInternalPolicy.groovy | 6 +-- sdk/src/main/java/SourceClassMap.java | 4 +- .../test/compute/vm/TestPolicyForVm.java | 17 ++++---- .../test/compute/vm/TestPolicyForVm1.java | 4 +- .../test/compute/vm/TestPolicyForVm6.java | 40 +++++++++---------- .../TestPolicyForConfiguration.java | 6 +-- .../org/zstack/test/eip/TestPolicyForEip.java | 8 ++-- .../zstack/test/identity/TestIdentity5.java | 4 +- .../zstack/test/identity/TestIdentity7.java | 4 +- .../zstack/test/identity/TestIdentity8.java | 4 +- .../zstack/test/identity/TestIdentity9.java | 10 ++--- .../zstack/test/image/TestPolicyForImage.java | 6 +-- .../test/lb/TestVirtualRouterLbPolicy.java | 6 +-- .../test/network/TestPolicyForL3Network.java | 6 +-- .../TestPolicyForSecurityGroup.java | 6 +-- .../snapshot/TestPolicyForSnapshot.java | 6 +-- .../storage/volume/TestPolicyForVolume.java | 6 +-- .../org/zstack/test/tag/TestPolicyForTag.java | 6 +-- .../org/zstack/test/vip/TestPolicyForVip.java | 6 +-- .../TestPolicyForPortForwarding.java | 8 ++-- .../TestPolicyForVirtualRouterOffering.java | 6 +-- 39 files changed, 120 insertions(+), 133 deletions(-) rename header/src/main/java/org/zstack/header/identity/{StatementEffect.java => PolicyStatementEffect.java} (79%) mode change 100755 => 100644 diff --git a/header/src/main/java/org/zstack/header/identity/APICheckApiPermissionReply.java b/header/src/main/java/org/zstack/header/identity/APICheckApiPermissionReply.java index 568ba11a91d..01d5512208a 100755 --- a/header/src/main/java/org/zstack/header/identity/APICheckApiPermissionReply.java +++ b/header/src/main/java/org/zstack/header/identity/APICheckApiPermissionReply.java @@ -24,7 +24,7 @@ public void setInventory(Map inventory) { public static APICheckApiPermissionReply __example__() { APICheckApiPermissionReply reply = new APICheckApiPermissionReply(); Map inventory = new HashMap<>(); - inventory.put("APICheckApiPermissionMsg", StatementEffect.Allow.toString()); + inventory.put("APICheckApiPermissionMsg", PolicyStatementEffect.Allow.toString()); reply.setInventory(inventory); return reply; } diff --git a/header/src/main/java/org/zstack/header/identity/APICreatePolicyEvent.java b/header/src/main/java/org/zstack/header/identity/APICreatePolicyEvent.java index 6c1109fd04e..4558534f067 100755 --- a/header/src/main/java/org/zstack/header/identity/APICreatePolicyEvent.java +++ b/header/src/main/java/org/zstack/header/identity/APICreatePolicyEvent.java @@ -34,7 +34,7 @@ public static APICreatePolicyEvent __example__() { inventory.setName("USER-RESET-PASSWORD"); PolicyStatement s = new PolicyStatement(); s.setName(String.format("user-reset-password-%s", inventory.getUuid())); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", AccountConstant.ACTION_CATEGORY, APIUpdateUserMsg.class.getSimpleName())); inventory.setStatements(list(s)); diff --git a/header/src/main/java/org/zstack/header/identity/APICreatePolicyMsg.java b/header/src/main/java/org/zstack/header/identity/APICreatePolicyMsg.java index 077fafd1c9c..88dde9a9277 100755 --- a/header/src/main/java/org/zstack/header/identity/APICreatePolicyMsg.java +++ b/header/src/main/java/org/zstack/header/identity/APICreatePolicyMsg.java @@ -63,7 +63,7 @@ public static APICreatePolicyMsg __example__() { PolicyStatement s = new PolicyStatement(); s.setName(String.format("user-reset-password-%s", uuid())); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", AccountConstant.ACTION_CATEGORY, APIUpdateUserMsg.class.getSimpleName())); msg.setStatements(list(s)); diff --git a/header/src/main/java/org/zstack/header/identity/APIQueryPolicyReply.java b/header/src/main/java/org/zstack/header/identity/APIQueryPolicyReply.java index 26e64ec8b9b..4732ada1fe4 100755 --- a/header/src/main/java/org/zstack/header/identity/APIQueryPolicyReply.java +++ b/header/src/main/java/org/zstack/header/identity/APIQueryPolicyReply.java @@ -30,7 +30,7 @@ public static APIQueryPolicyReply __example__() { inventory.setName("USER-RESET-PASSWORD"); PolicyStatement s = new PolicyStatement(); s.setName(String.format("user-reset-password-%s", inventory.getUuid())); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", AccountConstant.ACTION_CATEGORY, APIUpdateUserMsg.class.getSimpleName())); inventory.setStatements(list(s)); diff --git a/header/src/main/java/org/zstack/header/identity/PolicyInventory_StatementDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/identity/PolicyInventory_StatementDoc_zh_cn.groovy index 3c19a6c7aed..a86a4c77c8c 100755 --- a/header/src/main/java/org/zstack/header/identity/PolicyInventory_StatementDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/identity/PolicyInventory_StatementDoc_zh_cn.groovy @@ -14,9 +14,9 @@ doc { name "effect" path "org.zstack.header.identity.PolicyInventory.Statement.effect" desc "声明的效果(许可,禁止)" - type "StatementEffect" + type "PolicyStatementEffect" since "0.6" - clz StatementEffect.class + clz PolicyStatementEffect.class } field { name "principals" diff --git a/header/src/main/java/org/zstack/header/identity/PolicyStatement.java b/header/src/main/java/org/zstack/header/identity/PolicyStatement.java index 01415cdacb8..d4a6f0c5de5 100755 --- a/header/src/main/java/org/zstack/header/identity/PolicyStatement.java +++ b/header/src/main/java/org/zstack/header/identity/PolicyStatement.java @@ -10,7 +10,7 @@ @SDK(sdkClassName = "PolicyStatement") public class PolicyStatement { private String name; - private StatementEffect effect; + private PolicyStatementEffect effect; private List principals; private List actions; private List resources; @@ -31,11 +31,11 @@ public void setName(String name) { this.name = name; } - public StatementEffect getEffect() { + public PolicyStatementEffect getEffect() { return effect; } - public void setEffect(StatementEffect effect) { + public void setEffect(PolicyStatementEffect effect) { this.effect = effect; } @@ -77,7 +77,7 @@ public static PolicyStatementBuilder builder() { public static final class PolicyStatementBuilder { private String name; - private StatementEffect effect; + private PolicyStatementEffect effect; private List principals; private List actions; private List resources; @@ -90,7 +90,7 @@ public PolicyStatementBuilder name(String name) { return this; } - public PolicyStatementBuilder effect(StatementEffect effect) { + public PolicyStatementBuilder effect(PolicyStatementEffect effect) { this.effect = effect; return this; } diff --git a/header/src/main/java/org/zstack/header/identity/PolicyStatementDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/identity/PolicyStatementDoc_zh_cn.groovy index 2228b37593d..266954dde18 100644 --- a/header/src/main/java/org/zstack/header/identity/PolicyStatementDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/identity/PolicyStatementDoc_zh_cn.groovy @@ -1,7 +1,5 @@ package org.zstack.header.identity -import org.zstack.header.identity.StatementEffect - doc { title "在这里输入结构的名称" @@ -16,9 +14,9 @@ doc { name "effect" path "org.zstack.header.identity.PolicyStatement.effect" desc "null" - type "StatementEffect" + type "PolicyStatementEffect" since "0.6" - clz StatementEffect.class + clz PolicyStatementEffect.class } field { name "principals" diff --git a/header/src/main/java/org/zstack/header/identity/StatementEffect.java b/header/src/main/java/org/zstack/header/identity/PolicyStatementEffect.java old mode 100755 new mode 100644 similarity index 79% rename from header/src/main/java/org/zstack/header/identity/StatementEffect.java rename to header/src/main/java/org/zstack/header/identity/PolicyStatementEffect.java index 2706cffeb19..6c616c1e1d5 --- a/header/src/main/java/org/zstack/header/identity/StatementEffect.java +++ b/header/src/main/java/org/zstack/header/identity/PolicyStatementEffect.java @@ -3,7 +3,7 @@ import org.zstack.header.rest.SDK; @SDK(sdkClassName = "PolicyStatementEffect") -public enum StatementEffect { +public enum PolicyStatementEffect { Allow, Deny, } diff --git a/header/src/main/java/org/zstack/header/identity/rbac/RBAC.java b/header/src/main/java/org/zstack/header/identity/rbac/RBAC.java index 07bee62dd29..5e1183c8522 100755 --- a/header/src/main/java/org/zstack/header/identity/rbac/RBAC.java +++ b/header/src/main/java/org/zstack/header/identity/rbac/RBAC.java @@ -4,15 +4,13 @@ import org.zstack.header.core.StaticInit; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.identity.PolicyStatement; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.SuppressCredentialCheck; import org.zstack.header.message.APIMessage; import org.zstack.utils.BeanUtils; import org.zstack.utils.DebugUtils; import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; public class RBAC { public static List permissions = new ArrayList<>(); @@ -113,12 +111,12 @@ public RoleBuilder permissionsByName(String...pnames) { } public RoleBuilder allow() { - role.effect = StatementEffect.Allow; + role.effect = PolicyStatementEffect.Allow; return this; } public RoleBuilder deny() { - role.effect = StatementEffect.Deny; + role.effect = PolicyStatementEffect.Deny; return this; } @@ -155,7 +153,7 @@ public static class Role { private String uuid; private String name; private Set allowedActions = new HashSet<>(); - private StatementEffect effect = StatementEffect.Allow; + private PolicyStatementEffect effect = PolicyStatementEffect.Allow; private boolean adminOnly; private boolean predefine = true; private List excludedActions = new ArrayList<>(); @@ -184,11 +182,11 @@ public void setAllowedActions(Set allowedActions) { this.allowedActions = allowedActions; } - public StatementEffect getEffect() { + public PolicyStatementEffect getEffect() { return effect; } - public void setEffect(StatementEffect effect) { + public void setEffect(PolicyStatementEffect effect) { this.effect = effect; } diff --git a/header/src/main/java/org/zstack/header/identity/role/api/APIAddPolicyStatementsToRoleMsg.java b/header/src/main/java/org/zstack/header/identity/role/api/APIAddPolicyStatementsToRoleMsg.java index db8433f44f8..abaf94ccf91 100755 --- a/header/src/main/java/org/zstack/header/identity/role/api/APIAddPolicyStatementsToRoleMsg.java +++ b/header/src/main/java/org/zstack/header/identity/role/api/APIAddPolicyStatementsToRoleMsg.java @@ -2,7 +2,7 @@ import org.springframework.http.HttpMethod; import org.zstack.header.identity.PolicyStatement; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.role.RoleVO; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; @@ -48,7 +48,7 @@ public static APIAddPolicyStatementsToRoleMsg __example__() { PolicyStatement state = new PolicyStatement(); state.setName("state-1"); - state.setEffect(StatementEffect.Allow); + state.setEffect(PolicyStatementEffect.Allow); state.setActions(asList("accpet")); msg.setStatements(asList(state)); diff --git a/header/src/main/java/org/zstack/header/identity/role/api/APIChangeRoleStateEvent.java b/header/src/main/java/org/zstack/header/identity/role/api/APIChangeRoleStateEvent.java index b558f9cc2e5..def7e59ff3d 100755 --- a/header/src/main/java/org/zstack/header/identity/role/api/APIChangeRoleStateEvent.java +++ b/header/src/main/java/org/zstack/header/identity/role/api/APIChangeRoleStateEvent.java @@ -1,7 +1,7 @@ package org.zstack.header.identity.role.api; import org.zstack.header.identity.PolicyStatement; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.role.RoleInventory; import org.zstack.header.identity.role.RolePolicyStatementInventory; import org.zstack.header.identity.role.RoleState; @@ -40,7 +40,7 @@ public static APIChangeRoleStateEvent __example__() { RolePolicyStatementInventory inv = new RolePolicyStatementInventory(); PolicyStatement statement = new PolicyStatement(); - statement.setEffect(StatementEffect.Allow); + statement.setEffect(PolicyStatementEffect.Allow); statement.setActions(asList("org.zstack.header.vm.APICreateVmInstanceMsg")); statement.setName("statement for test"); diff --git a/header/src/main/java/org/zstack/header/identity/role/api/APICreateRoleEvent.java b/header/src/main/java/org/zstack/header/identity/role/api/APICreateRoleEvent.java index ba32ecf9e46..6de9a7a4282 100755 --- a/header/src/main/java/org/zstack/header/identity/role/api/APICreateRoleEvent.java +++ b/header/src/main/java/org/zstack/header/identity/role/api/APICreateRoleEvent.java @@ -1,7 +1,7 @@ package org.zstack.header.identity.role.api; import org.zstack.header.identity.PolicyStatement; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.role.RoleInventory; import org.zstack.header.identity.role.RolePolicyStatementInventory; import org.zstack.header.identity.role.RoleState; @@ -40,7 +40,7 @@ public static APICreateRoleEvent __example__() { role.setName("role-1"); RolePolicyStatementInventory inv = new RolePolicyStatementInventory(); PolicyStatement statement = new PolicyStatement(); - statement.setEffect(StatementEffect.Allow); + statement.setEffect(PolicyStatementEffect.Allow); statement.setActions(asList("org.zstack.header.vm.APICreateVmInstanceMsg")); statement.setName("statement for test"); diff --git a/header/src/main/java/org/zstack/header/identity/role/api/APICreateRoleMsg.java b/header/src/main/java/org/zstack/header/identity/role/api/APICreateRoleMsg.java index 439eb5011c1..5ec25b5eb40 100755 --- a/header/src/main/java/org/zstack/header/identity/role/api/APICreateRoleMsg.java +++ b/header/src/main/java/org/zstack/header/identity/role/api/APICreateRoleMsg.java @@ -2,8 +2,8 @@ import org.springframework.http.HttpMethod; import org.zstack.header.identity.PolicyStatement; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.PolicyVO; -import org.zstack.header.identity.StatementEffect; import org.zstack.header.message.APICreateMessage; import org.zstack.header.message.APIParam; import org.zstack.header.rest.RestRequest; @@ -70,7 +70,7 @@ public static APICreateRoleMsg __example__() { msg.setPolicyUuids(asList(uuid())); PolicyStatement statement = new PolicyStatement(); - statement.setEffect(StatementEffect.Allow); + statement.setEffect(PolicyStatementEffect.Allow); statement.setActions(asList("org.zstack.header.vm.APICreateVmInstanceMsg")); statement.setName("statement for test"); msg.setStatements(asList(statement)); diff --git a/header/src/main/java/org/zstack/header/identity/role/api/APIUpdateRoleEvent.java b/header/src/main/java/org/zstack/header/identity/role/api/APIUpdateRoleEvent.java index 488b2c027de..007dd62f6de 100644 --- a/header/src/main/java/org/zstack/header/identity/role/api/APIUpdateRoleEvent.java +++ b/header/src/main/java/org/zstack/header/identity/role/api/APIUpdateRoleEvent.java @@ -1,7 +1,7 @@ package org.zstack.header.identity.role.api; import org.zstack.header.identity.PolicyStatement; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.role.RoleInventory; import org.zstack.header.identity.role.RolePolicyStatementInventory; import org.zstack.header.identity.role.RoleState; @@ -43,7 +43,7 @@ public static APIUpdateRoleEvent __example__() { role.setName("role-1"); RolePolicyStatementInventory inv = new RolePolicyStatementInventory(); PolicyStatement statement = new PolicyStatement(); - statement.setEffect(StatementEffect.Allow); + statement.setEffect(PolicyStatementEffect.Allow); statement.setActions(asList("org.zstack.header.vm.APICreateVmInstanceMsg")); statement.setName("statement for test"); diff --git a/header/src/main/java/org/zstack/header/identity/role/api/APIUpdateRoleMsg.java b/header/src/main/java/org/zstack/header/identity/role/api/APIUpdateRoleMsg.java index 1800157f600..4fbfa50ebdf 100644 --- a/header/src/main/java/org/zstack/header/identity/role/api/APIUpdateRoleMsg.java +++ b/header/src/main/java/org/zstack/header/identity/role/api/APIUpdateRoleMsg.java @@ -3,7 +3,7 @@ import org.springframework.http.HttpMethod; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.PolicyVO; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.role.RoleVO; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; @@ -76,7 +76,7 @@ public static APIUpdateRoleMsg __example__() { msg.setName("role-1"); msg.setPolicyUuids(Arrays.asList(uuid())); PolicyStatement policy = new PolicyStatement(); - policy.setEffect(StatementEffect.Allow); + policy.setEffect(PolicyStatementEffect.Allow); policy.setName("test role"); policy.setActions(Arrays.asList("org.zstack.header.identity.role.api.APIUpdateRoleMsg")); msg.setStatements(Arrays.asList(new PolicyStatement())); diff --git a/identity/src/main/java/org/zstack/identity/AccountManagerImpl.java b/identity/src/main/java/org/zstack/identity/AccountManagerImpl.java index 7d111d33185..c00a6e11dd2 100755 --- a/identity/src/main/java/org/zstack/identity/AccountManagerImpl.java +++ b/identity/src/main/java/org/zstack/identity/AccountManagerImpl.java @@ -430,10 +430,10 @@ private void handle(APICheckApiPermissionMsg msg) { try { new Auth().check(api); - ret.put(apiName, StatementEffect.Allow.toString()); + ret.put(apiName, PolicyStatementEffect.Allow.toString()); } catch (ApiMessageInterceptionException e) { logger.debug(e.getMessage()); - ret.put(apiName, StatementEffect.Deny.toString()); + ret.put(apiName, PolicyStatementEffect.Deny.toString()); } } catch (ClassNotFoundException e) { throw new OperationFailureException(argerr("%s is not an API", apiName)); @@ -1264,7 +1264,7 @@ private void accountFieldCheck() throws IllegalAccessException { private void useDecision(Decision d, boolean userPolicy) { String policyCategory = userPolicy ? "user policy" : "group policy"; - if (d.effect == StatementEffect.Allow) { + if (d.effect == PolicyStatementEffect.Allow) { logger.debug(String.format("API[name: %s, action: %s] is approved by a %s[name: %s, uuid: %s]," + " statement[name: %s, action: %s]", msg.getClass().getSimpleName(), d.action, policyCategory, d.policy.getName(), d.policy.getUuid(), d.statement.getName(), d.actionRule)); @@ -1379,7 +1379,7 @@ class Decision { String action; PolicyStatement statement; String actionRule; - StatementEffect effect; + PolicyStatementEffect effect; } private Decision decide(List userPolicies) { diff --git a/identity/src/main/java/org/zstack/identity/IAMIdentityResourceGenerator.java b/identity/src/main/java/org/zstack/identity/IAMIdentityResourceGenerator.java index 8c6b9e5f26a..ca045613d5f 100644 --- a/identity/src/main/java/org/zstack/identity/IAMIdentityResourceGenerator.java +++ b/identity/src/main/java/org/zstack/identity/IAMIdentityResourceGenerator.java @@ -10,7 +10,6 @@ import org.zstack.utils.logging.CLogger; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import static org.zstack.utils.CollectionDSL.list; @@ -49,7 +48,7 @@ private void makeReadAPIsForNormalAccountJSONStatement() { readAPIs.add(APIUpdateUserMsg.class.getName()); PolicyStatement s = PolicyStatement.builder().name("read-apis-for-normal-account") - .effect(StatementEffect.Allow) + .effect(PolicyStatementEffect.Allow) .actions(readAPIs) .build(); diff --git a/identity/src/main/java/org/zstack/identity/rbac/RBACManager.java b/identity/src/main/java/org/zstack/identity/rbac/RBACManager.java index 650bd74cc51..7f136f9ec15 100755 --- a/identity/src/main/java/org/zstack/identity/rbac/RBACManager.java +++ b/identity/src/main/java/org/zstack/identity/rbac/RBACManager.java @@ -3,7 +3,6 @@ import org.zstack.core.db.SQLBatchWithReturn; import org.zstack.header.identity.*; import org.zstack.header.message.APIMessage; -import org.zstack.identity.Session; import java.util.ArrayList; import java.util.HashMap; @@ -45,7 +44,7 @@ protected List scripts() { static Map> collectDenyStatements(List polices) { Map> ret = new HashMap<>(); polices.forEach(p -> { - List ss = p.getStatements().stream().filter(s->s.getEffect() == StatementEffect.Deny).collect(Collectors.toList()); + List ss = p.getStatements().stream().filter(s->s.getEffect() == PolicyStatementEffect.Deny).collect(Collectors.toList()); if (!ss.isEmpty()) { ret.put(p, ss); } @@ -57,7 +56,7 @@ static Map> collectDenyStatements(List> collectAllowedStatements(List polices) { Map> ret = new HashMap<>(); polices.forEach(p -> { - List ss = p.getStatements().stream().filter(s->s.getEffect() == StatementEffect.Allow).collect(Collectors.toList()); + List ss = p.getStatements().stream().filter(s->s.getEffect() == PolicyStatementEffect.Allow).collect(Collectors.toList()); if (!ss.isEmpty()) { ret.put(p, ss); } diff --git a/identity/src/main/java/org/zstack/identity/rbac/SystemInternalPolicy.groovy b/identity/src/main/java/org/zstack/identity/rbac/SystemInternalPolicy.groovy index e47b71a19e0..932c85c56b3 100755 --- a/identity/src/main/java/org/zstack/identity/rbac/SystemInternalPolicy.groovy +++ b/identity/src/main/java/org/zstack/identity/rbac/SystemInternalPolicy.groovy @@ -3,7 +3,7 @@ package org.zstack.identity.rbac import org.zstack.header.identity.AccountConstant import org.zstack.header.identity.InternalPolicy import org.zstack.header.identity.PolicyInventory -import org.zstack.header.identity.StatementEffect +import org.zstack.header.identity.PolicyStatementEffect import org.zstack.header.identity.rbac.RBAC class SystemInternalPolicy implements InternalPolicy { @@ -15,7 +15,7 @@ class SystemInternalPolicy implements InternalPolicy { statement { name = "normal-account-allowed-apis" - effect = StatementEffect.Allow + effect = PolicyStatementEffect.Allow RBAC.permissions.each { info -> info.normalAPIs.each { action(it) } @@ -24,7 +24,7 @@ class SystemInternalPolicy implements InternalPolicy { statement { name = "give-admin-all-apis" - effect = StatementEffect.Allow + effect = PolicyStatementEffect.Allow action("**") diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 9c5bf94a2ed..0b70997cc82 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -272,11 +272,11 @@ public class SourceClassMap { put("org.zstack.header.identity.AccountResourceRefInventory", "org.zstack.sdk.AccountResourceRefInventory"); put("org.zstack.header.identity.PolicyInventory", "org.zstack.sdk.PolicyInventory"); put("org.zstack.header.identity.PolicyStatement", "org.zstack.sdk.PolicyStatement"); + put("org.zstack.header.identity.PolicyStatementEffect", "org.zstack.sdk.PolicyStatementEffect"); put("org.zstack.header.identity.Quota$QuotaUsage", "org.zstack.sdk.QuotaUsage"); put("org.zstack.header.identity.QuotaInventory", "org.zstack.sdk.QuotaInventory"); put("org.zstack.header.identity.SessionInventory", "org.zstack.sdk.SessionInventory"); put("org.zstack.header.identity.SharedResourceInventory", "org.zstack.sdk.SharedResourceInventory"); - put("org.zstack.header.identity.StatementEffect", "org.zstack.sdk.PolicyStatementEffect"); put("org.zstack.header.identity.UserGroupInventory", "org.zstack.sdk.UserGroupInventory"); put("org.zstack.header.identity.UserInventory", "org.zstack.sdk.UserInventory"); put("org.zstack.header.identity.login.LoginAuthenticationProcedureDesc", "org.zstack.sdk.LoginAuthenticationProcedureDesc"); @@ -1250,7 +1250,7 @@ public class SourceClassMap { put("org.zstack.sdk.PolicyRouteTableRouteEntryInventory", "org.zstack.policyRoute.PolicyRouteTableRouteEntryInventory"); put("org.zstack.sdk.PolicyRouteTableVRouterRefInventory", "org.zstack.policyRoute.PolicyRouteTableVRouterRefInventory"); put("org.zstack.sdk.PolicyStatement", "org.zstack.header.identity.PolicyStatement"); - put("org.zstack.sdk.PolicyStatementEffect", "org.zstack.header.identity.StatementEffect"); + put("org.zstack.sdk.PolicyStatementEffect", "org.zstack.header.identity.PolicyStatementEffect"); put("org.zstack.sdk.PortForwardingRuleInventory", "org.zstack.network.service.portforwarding.PortForwardingRuleInventory"); put("org.zstack.sdk.PortMirrorInventory", "org.zstack.header.portMirror.PortMirrorInventory"); put("org.zstack.sdk.PortMirrorSessionInventory", "org.zstack.header.portMirror.PortMirrorSessionInventory"); diff --git a/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm.java b/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm.java index df65035ad90..4d141698052 100755 --- a/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm.java +++ b/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm.java @@ -8,11 +8,8 @@ import org.zstack.core.db.DatabaseFacade; import org.zstack.header.configuration.InstanceOfferingInventory; import org.zstack.header.host.HostInventory; -import org.zstack.header.identity.StatementEffect; -import org.zstack.header.identity.IdentityErrors; -import org.zstack.header.identity.PolicyStatement; -import org.zstack.header.identity.SessionInventory; -import org.zstack.header.identity.UserInventory; +import org.zstack.header.identity.*; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.image.ImageInventory; import org.zstack.header.network.l3.L3NetworkInventory; import org.zstack.header.query.QueryCondition; @@ -83,7 +80,7 @@ public void test() throws ApiSenderException, InterruptedException { UserInventory user = identityCreator.createUser("user", "password"); PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APICreateVmInstanceMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APIDestroyVmInstanceMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APIRebootVmInstanceMsg.class.getSimpleName())); @@ -113,7 +110,7 @@ public void test() throws ApiSenderException, InterruptedException { s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APIDestroyVmInstanceMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APIRebootVmInstanceMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APIStopVmInstanceMsg.class.getSimpleName())); @@ -124,7 +121,7 @@ public void test() throws ApiSenderException, InterruptedException { s = new PolicyStatement(); s.setName("allowcreate"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APICreateVmInstanceMsg.class.getSimpleName())); identityCreator.createPolicy("allowcreate", s); identityCreator.attachPolicyToUser("user", "allowcreate"); @@ -175,7 +172,7 @@ public void test() throws ApiSenderException, InterruptedException { s = new PolicyStatement(); s.setName("denycreate"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APICreateVmInstanceMsg.class.getSimpleName())); identityCreator.createPolicy("denycreate", s); identityCreator.attachPolicyToUser("user", "denycreate"); @@ -195,7 +192,7 @@ public void test() throws ApiSenderException, InterruptedException { s = new PolicyStatement(); s.setName("allowall"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:.*", VmInstanceConstant.ACTION_CATEGORY)); identityCreator.createPolicy("allowall", s); identityCreator.attachPolicyToUser("user", "allowall"); diff --git a/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm1.java b/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm1.java index 66982b92161..3ab67d53769 100755 --- a/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm1.java +++ b/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm1.java @@ -8,7 +8,7 @@ import org.zstack.core.db.DatabaseFacade; import org.zstack.header.configuration.InstanceOfferingInventory; import org.zstack.header.host.HostInventory; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -62,7 +62,7 @@ public void test() throws ApiSenderException, InterruptedException { UserInventory user = identityCreator.createUser("user", "password"); PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APICreateVmInstanceMsg.class.getSimpleName())); identityCreator.createPolicy("allow", s); identityCreator.attachPolicyToUser("user", "allow"); diff --git a/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm6.java b/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm6.java index 2367ecc9813..8c6ed59c321 100755 --- a/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm6.java +++ b/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm6.java @@ -6,7 +6,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; import org.zstack.header.identity.UserInventory; @@ -51,7 +51,7 @@ public void test() throws ApiSenderException, InterruptedException { PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APICreateVmInstanceMsg.class.getName())); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APIDestroyVmInstanceMsg.class.getName())); identityCreator.createPolicy("allow", s); @@ -59,7 +59,7 @@ public void test() throws ApiSenderException, InterruptedException { s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APIRebootVmInstanceMsg.class.getName())); identityCreator.createPolicy("deny", s); identityCreator.attachPolicyToUser("user", "deny"); @@ -68,37 +68,37 @@ public void test() throws ApiSenderException, InterruptedException { APIRebootVmInstanceMsg.class.getName(), APIStartVmInstanceMsg.class.getName()); Map ret = api.checkUserPolicy(apiNames, user.getUuid(), null); - Assert.assertEquals(StatementEffect.Allow.toString(), ret.get(APICreateVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Allow.toString(), ret.get(APIDestroyVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Deny.toString(), ret.get(APIRebootVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Deny.toString(), ret.get(APIStartVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Allow.toString(), ret.get(APICreateVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Allow.toString(), ret.get(APIDestroyVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Deny.toString(), ret.get(APIRebootVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Deny.toString(), ret.get(APIStartVmInstanceMsg.class.getName())); SessionInventory session = identityCreator.userLogin(user.getName(), "password"); ret = api.checkUserPolicy(apiNames, null, session); - Assert.assertEquals(StatementEffect.Allow.toString(), ret.get(APICreateVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Allow.toString(), ret.get(APIDestroyVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Deny.toString(), ret.get(APIRebootVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Deny.toString(), ret.get(APIStartVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Allow.toString(), ret.get(APICreateVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Allow.toString(), ret.get(APIDestroyVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Deny.toString(), ret.get(APIRebootVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Deny.toString(), ret.get(APIStartVmInstanceMsg.class.getName())); identityCreator.createGroup("group"); identityCreator.addUserToGroup("user", "group"); s = new PolicyStatement(); s.setName("group-allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APIStartVmInstanceMsg.class.getName())); identityCreator.createPolicy("group-allow", s); identityCreator.attachPolicyToGroup("group", "group-allow"); ret = api.checkUserPolicy(apiNames, null, session); - Assert.assertEquals(StatementEffect.Allow.toString(), ret.get(APICreateVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Allow.toString(), ret.get(APIDestroyVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Deny.toString(), ret.get(APIRebootVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Allow.toString(), ret.get(APIStartVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Allow.toString(), ret.get(APICreateVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Allow.toString(), ret.get(APIDestroyVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Deny.toString(), ret.get(APIRebootVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Allow.toString(), ret.get(APIStartVmInstanceMsg.class.getName())); // user can test own permissions ret = api.checkUserPolicy(apiNames, user.getUuid(), session); - Assert.assertEquals(StatementEffect.Allow.toString(), ret.get(APICreateVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Allow.toString(), ret.get(APIDestroyVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Deny.toString(), ret.get(APIRebootVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Allow.toString(), ret.get(APIStartVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Allow.toString(), ret.get(APICreateVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Allow.toString(), ret.get(APIDestroyVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Deny.toString(), ret.get(APIRebootVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Allow.toString(), ret.get(APIStartVmInstanceMsg.class.getName())); } } diff --git a/test/src/test/java/org/zstack/test/configuration/TestPolicyForConfiguration.java b/test/src/test/java/org/zstack/test/configuration/TestPolicyForConfiguration.java index 4e1a3c07f0f..8f357220a61 100755 --- a/test/src/test/java/org/zstack/test/configuration/TestPolicyForConfiguration.java +++ b/test/src/test/java/org/zstack/test/configuration/TestPolicyForConfiguration.java @@ -6,7 +6,7 @@ import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; import org.zstack.header.configuration.*; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -85,7 +85,7 @@ public void test() throws ApiSenderException { identityCreator.createUser("user1", "password"); PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", ConfigurationConstant.ACTION_CATEGORY, APICreateInstanceOfferingMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", ConfigurationConstant.ACTION_CATEGORY, APIChangeInstanceOfferingStateMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", ConfigurationConstant.ACTION_CATEGORY, APIUpdateInstanceOfferingMsg.class.getSimpleName())); @@ -116,7 +116,7 @@ public void test() throws ApiSenderException { s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", ConfigurationConstant.ACTION_CATEGORY, APICreateInstanceOfferingMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", ConfigurationConstant.ACTION_CATEGORY, APIChangeInstanceOfferingStateMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", ConfigurationConstant.ACTION_CATEGORY, APIUpdateInstanceOfferingMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/eip/TestPolicyForEip.java b/test/src/test/java/org/zstack/test/eip/TestPolicyForEip.java index c9782e06a07..e06282a87f4 100755 --- a/test/src/test/java/org/zstack/test/eip/TestPolicyForEip.java +++ b/test/src/test/java/org/zstack/test/eip/TestPolicyForEip.java @@ -7,7 +7,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -98,13 +98,13 @@ public void test() throws ApiSenderException { identityCreator.createUser("user1", "password"); PolicyStatement s = new PolicyStatement(); s.setName("allowvip"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", VipConstant.ACTION_CATEGORY, APICreateVipMsg.class.getSimpleName())); identityCreator.createPolicy("allowvip", s); s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", EipConstant.ACTION_CATEGORY, APICreateEipMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", EipConstant.ACTION_CATEGORY, APIUpdateEipMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", EipConstant.ACTION_CATEGORY, APIChangeEipStateMsg.class.getSimpleName())); @@ -126,7 +126,7 @@ public void test() throws ApiSenderException { eip = createEip(l3.getUuid(), nic.getUuid(), session); s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", EipConstant.ACTION_CATEGORY, APICreateEipMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", EipConstant.ACTION_CATEGORY, APIUpdateEipMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", EipConstant.ACTION_CATEGORY, APIChangeEipStateMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/identity/TestIdentity5.java b/test/src/test/java/org/zstack/test/identity/TestIdentity5.java index 635e0fb9da5..a0a2f645d35 100755 --- a/test/src/test/java/org/zstack/test/identity/TestIdentity5.java +++ b/test/src/test/java/org/zstack/test/identity/TestIdentity5.java @@ -8,7 +8,7 @@ import org.zstack.core.db.SimpleQuery; import org.zstack.core.db.SimpleQuery.Op; import org.zstack.header.identity.*; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.PolicyStatement; import org.zstack.test.*; import org.zstack.test.deployer.Deployer; @@ -39,7 +39,7 @@ public void test() throws ApiSenderException { PolicyStatement s = new PolicyStatement(); s.addAction(".*"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); PolicyInventory p = creator.createPolicy("test", s); creator.attachPolicyToUser("test", "test"); diff --git a/test/src/test/java/org/zstack/test/identity/TestIdentity7.java b/test/src/test/java/org/zstack/test/identity/TestIdentity7.java index 808748e51e1..0b14f65c645 100755 --- a/test/src/test/java/org/zstack/test/identity/TestIdentity7.java +++ b/test/src/test/java/org/zstack/test/identity/TestIdentity7.java @@ -8,7 +8,7 @@ import org.zstack.core.db.SimpleQuery; import org.zstack.core.db.SimpleQuery.Op; import org.zstack.header.identity.*; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.query.QueryOp; import org.zstack.test.*; @@ -64,7 +64,7 @@ public void test() throws ApiSenderException { PolicyStatement s = new PolicyStatement(); s.addAction(".*"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); PolicyInventory p = creator.createPolicy("test", s); creator.attachPolicyToUser("test", "test"); diff --git a/test/src/test/java/org/zstack/test/identity/TestIdentity8.java b/test/src/test/java/org/zstack/test/identity/TestIdentity8.java index 30a9b50160e..42d83fc8923 100755 --- a/test/src/test/java/org/zstack/test/identity/TestIdentity8.java +++ b/test/src/test/java/org/zstack/test/identity/TestIdentity8.java @@ -7,7 +7,7 @@ import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.SimpleQuery; import org.zstack.core.db.SimpleQuery.Op; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.*; import org.zstack.header.identity.PolicyStatement; import org.zstack.test.*; @@ -43,7 +43,7 @@ public void test() throws ApiSenderException { PolicyStatement s = new PolicyStatement(); s.addAction(".*"); s.setName("test"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); creator.createPolicy("test", s); api.deleteAccount(a.getUuid(), creator.getAccountSession()); diff --git a/test/src/test/java/org/zstack/test/identity/TestIdentity9.java b/test/src/test/java/org/zstack/test/identity/TestIdentity9.java index 5c19b1213d9..1c85179f097 100755 --- a/test/src/test/java/org/zstack/test/identity/TestIdentity9.java +++ b/test/src/test/java/org/zstack/test/identity/TestIdentity9.java @@ -7,12 +7,8 @@ import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.SimpleQuery; import org.zstack.core.db.SimpleQuery.Op; -import org.zstack.header.identity.StatementEffect; -import org.zstack.header.identity.PolicyInventory; -import org.zstack.header.identity.PolicyStatement; -import org.zstack.header.identity.UserInventory; -import org.zstack.header.identity.UserPolicyRefVO; -import org.zstack.header.identity.UserPolicyRefVO_; +import org.zstack.header.identity.*; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.test.*; import org.zstack.test.deployer.Deployer; @@ -50,7 +46,7 @@ public void test() throws ApiSenderException { for (int i = 0; i < num; i++) { PolicyStatement s = new PolicyStatement(); s.addAction(".*"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); PolicyInventory p = creator.createPolicy(String.format("test%s", i), s); policyUuids.add(p.getUuid()); } diff --git a/test/src/test/java/org/zstack/test/image/TestPolicyForImage.java b/test/src/test/java/org/zstack/test/image/TestPolicyForImage.java index c77792a5144..2cdb4a88fd5 100755 --- a/test/src/test/java/org/zstack/test/image/TestPolicyForImage.java +++ b/test/src/test/java/org/zstack/test/image/TestPolicyForImage.java @@ -6,7 +6,7 @@ import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.SimpleQuery; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -89,7 +89,7 @@ public void test() throws ApiSenderException { identityCreator.createUser("user1", "password"); PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", ImageConstant.ACTION_CATEGORY, APIAddImageMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", ImageConstant.ACTION_CATEGORY, APIUpdateImageMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", ImageConstant.ACTION_CATEGORY, APIChangeImageStateMsg.class.getSimpleName())); @@ -106,7 +106,7 @@ public void test() throws ApiSenderException { identityCreator.detachPolicyFromUser("user1", "allow"); s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", ImageConstant.ACTION_CATEGORY, APIAddImageMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", ImageConstant.ACTION_CATEGORY, APIUpdateImageMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", ImageConstant.ACTION_CATEGORY, APIChangeImageStateMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/lb/TestVirtualRouterLbPolicy.java b/test/src/test/java/org/zstack/test/lb/TestVirtualRouterLbPolicy.java index baec975a915..9538a82b858 100755 --- a/test/src/test/java/org/zstack/test/lb/TestVirtualRouterLbPolicy.java +++ b/test/src/test/java/org/zstack/test/lb/TestVirtualRouterLbPolicy.java @@ -7,7 +7,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.*; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.network.l3.L3NetworkInventory; @@ -92,7 +92,7 @@ public Quota.QuotaUsage call(Quota.QuotaUsage arg) { identityCreator.createUser("user1", "password"); PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", LoadBalancerConstants.ACTION_CATEGORY, APICreateLoadBalancerMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", LoadBalancerConstants.ACTION_CATEGORY, APICreateLoadBalancerListenerMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", LoadBalancerConstants.ACTION_CATEGORY, APIAddVmNicToLoadBalancerMsg.class.getSimpleName())); @@ -124,7 +124,7 @@ public Quota.QuotaUsage call(Quota.QuotaUsage arg) { listener.setLoadBalancerUuid(lb.getUuid()); listener = api.createLoadBalancerListener(listener, userSession); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", LoadBalancerConstants.ACTION_CATEGORY, APICreateLoadBalancerMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", LoadBalancerConstants.ACTION_CATEGORY, APICreateLoadBalancerListenerMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", LoadBalancerConstants.ACTION_CATEGORY, APIAddVmNicToLoadBalancerMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/network/TestPolicyForL3Network.java b/test/src/test/java/org/zstack/test/network/TestPolicyForL3Network.java index d650e559bd2..1add7d93e49 100755 --- a/test/src/test/java/org/zstack/test/network/TestPolicyForL3Network.java +++ b/test/src/test/java/org/zstack/test/network/TestPolicyForL3Network.java @@ -6,7 +6,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -68,7 +68,7 @@ public void test() throws ApiSenderException, InterruptedException { PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", L3NetworkConstant.ACTION_CATEGORY, APICreateL3NetworkMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", L3NetworkConstant.ACTION_CATEGORY, APIChangeL3NetworkStateMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", L3NetworkConstant.ACTION_CATEGORY, APIUpdateL3NetworkMsg.class.getSimpleName())); @@ -102,7 +102,7 @@ public void test() throws ApiSenderException, InterruptedException { s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", L3NetworkConstant.ACTION_CATEGORY, APICreateL3NetworkMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", L3NetworkConstant.ACTION_CATEGORY, APIChangeL3NetworkStateMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", L3NetworkConstant.ACTION_CATEGORY, APIUpdateL3NetworkMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/securitygroup/TestPolicyForSecurityGroup.java b/test/src/test/java/org/zstack/test/securitygroup/TestPolicyForSecurityGroup.java index 5afcedddace..f7de68b6fce 100755 --- a/test/src/test/java/org/zstack/test/securitygroup/TestPolicyForSecurityGroup.java +++ b/test/src/test/java/org/zstack/test/securitygroup/TestPolicyForSecurityGroup.java @@ -5,7 +5,7 @@ import org.junit.Test; import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -57,7 +57,7 @@ public void test() throws ApiSenderException { identityCreator.createUser("user1", "password"); PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", SecurityGroupConstant.ACTION_CATEGORY, APICreateSecurityGroupMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", SecurityGroupConstant.ACTION_CATEGORY, APIUpdateSecurityGroupMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", SecurityGroupConstant.ACTION_CATEGORY, APIChangeSecurityGroupStateMsg.class.getSimpleName())); @@ -91,7 +91,7 @@ public void test() throws ApiSenderException { s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", SecurityGroupConstant.ACTION_CATEGORY, APICreateSecurityGroupMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", SecurityGroupConstant.ACTION_CATEGORY, APIUpdateSecurityGroupMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", SecurityGroupConstant.ACTION_CATEGORY, APIChangeSecurityGroupStateMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/storage/snapshot/TestPolicyForSnapshot.java b/test/src/test/java/org/zstack/test/storage/snapshot/TestPolicyForSnapshot.java index dfb834d88e4..f8d4938d22a 100755 --- a/test/src/test/java/org/zstack/test/storage/snapshot/TestPolicyForSnapshot.java +++ b/test/src/test/java/org/zstack/test/storage/snapshot/TestPolicyForSnapshot.java @@ -6,7 +6,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -83,7 +83,7 @@ public void test() throws ApiSenderException { identityCreator.createUser("user1", "password"); PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", VolumeSnapshotConstant.ACTION_CATEGORY, APICreateVolumeSnapshotMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VolumeSnapshotConstant.ACTION_CATEGORY, APIRevertVolumeFromSnapshotMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VolumeSnapshotConstant.ACTION_CATEGORY, APIDeleteVolumeSnapshotMsg.class.getSimpleName())); @@ -114,7 +114,7 @@ public void test() throws ApiSenderException { s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", VolumeSnapshotConstant.ACTION_CATEGORY, APICreateVolumeSnapshotMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VolumeSnapshotConstant.ACTION_CATEGORY, APIRevertVolumeFromSnapshotMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VolumeSnapshotConstant.ACTION_CATEGORY, APIDeleteVolumeSnapshotMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/storage/volume/TestPolicyForVolume.java b/test/src/test/java/org/zstack/test/storage/volume/TestPolicyForVolume.java index c32c621f24e..377b474b423 100755 --- a/test/src/test/java/org/zstack/test/storage/volume/TestPolicyForVolume.java +++ b/test/src/test/java/org/zstack/test/storage/volume/TestPolicyForVolume.java @@ -7,7 +7,7 @@ import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; import org.zstack.header.configuration.DiskOfferingInventory; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -84,7 +84,7 @@ public void test() throws ApiSenderException, InterruptedException { identityCreator.createUser("user1", "password"); PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", VolumeConstant.ACTION_CATEGORY, APICreateDataVolumeMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VolumeConstant.ACTION_CATEGORY, APIChangeVolumeStateMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VolumeConstant.ACTION_CATEGORY, APIDeleteDataVolumeMsg.class.getSimpleName())); @@ -114,7 +114,7 @@ public void test() throws ApiSenderException, InterruptedException { s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", VolumeConstant.ACTION_CATEGORY, APICreateDataVolumeMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VolumeConstant.ACTION_CATEGORY, APIChangeVolumeStateMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VolumeConstant.ACTION_CATEGORY, APIDeleteDataVolumeMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/tag/TestPolicyForTag.java b/test/src/test/java/org/zstack/test/tag/TestPolicyForTag.java index 9ad5b9b6f1f..421a055387b 100755 --- a/test/src/test/java/org/zstack/test/tag/TestPolicyForTag.java +++ b/test/src/test/java/org/zstack/test/tag/TestPolicyForTag.java @@ -7,7 +7,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -56,7 +56,7 @@ public void test() throws ApiSenderException { PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", TagConstant.ACTION_CATEGORY, APICreateUserTagMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", TagConstant.ACTION_CATEGORY, APICreateSystemTagMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", TagConstant.ACTION_CATEGORY, APIDeleteTagMsg.class.getSimpleName())); @@ -71,7 +71,7 @@ public void test() throws ApiSenderException { s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", TagConstant.ACTION_CATEGORY, APICreateUserTagMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", TagConstant.ACTION_CATEGORY, APICreateSystemTagMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", TagConstant.ACTION_CATEGORY, APIDeleteTagMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/vip/TestPolicyForVip.java b/test/src/test/java/org/zstack/test/vip/TestPolicyForVip.java index 61235c86df4..5bd03da9bf6 100755 --- a/test/src/test/java/org/zstack/test/vip/TestPolicyForVip.java +++ b/test/src/test/java/org/zstack/test/vip/TestPolicyForVip.java @@ -6,7 +6,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -84,7 +84,7 @@ public void test() throws ApiSenderException { identityCreator.useAccount("test"); identityCreator.createUser("user1", "password"); PolicyStatement s = new PolicyStatement(); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.setName("allow"); s.addAction(String.format("%s:%s", VipConstant.ACTION_CATEGORY, APICreateVipMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VipConstant.ACTION_CATEGORY, APIUpdateVipMsg.class.getSimpleName())); @@ -102,7 +102,7 @@ public void test() throws ApiSenderException { vip = api.acquireIp(pubL3.getUuid(), session); identityCreator.detachPolicyFromUser("user1", "allow"); s = new PolicyStatement(); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.setName("deny"); s.addAction(String.format("%s:%s", VipConstant.ACTION_CATEGORY, APICreateVipMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VipConstant.ACTION_CATEGORY, APIUpdateVipMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/virtualrouter/TestPolicyForPortForwarding.java b/test/src/test/java/org/zstack/test/virtualrouter/TestPolicyForPortForwarding.java index 1a15b2abf55..046c3b758b6 100755 --- a/test/src/test/java/org/zstack/test/virtualrouter/TestPolicyForPortForwarding.java +++ b/test/src/test/java/org/zstack/test/virtualrouter/TestPolicyForPortForwarding.java @@ -6,7 +6,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -85,13 +85,13 @@ public void test() throws ApiSenderException { identityCreator.useAccount("test"); identityCreator.createUser("user1", "password"); PolicyStatement s = new PolicyStatement(); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.setName("allowvip"); s.addAction(String.format("%s:%s", VipConstant.ACTION_CATEGORY, APICreateVipMsg.class.getSimpleName())); identityCreator.createPolicy("allowvip", s); s = new PolicyStatement(); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.setName("allow"); s.addAction(String.format("%s:%s", PortForwardingConstant.ACTION_CATEGORY, APICreatePortForwardingRuleMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", PortForwardingConstant.ACTION_CATEGORY, APIUpdatePortForwardingRuleMsg.class.getSimpleName())); @@ -116,7 +116,7 @@ public void test() throws ApiSenderException { rule = createPortForwarding(vipNw.getUuid(), session); s = new PolicyStatement(); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.setName("deny"); s.addAction(String.format("%s:%s", PortForwardingConstant.ACTION_CATEGORY, APICreatePortForwardingRuleMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", PortForwardingConstant.ACTION_CATEGORY, APIUpdatePortForwardingRuleMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/virtualrouter/TestPolicyForVirtualRouterOffering.java b/test/src/test/java/org/zstack/test/virtualrouter/TestPolicyForVirtualRouterOffering.java index c4d894de39f..85d6633df5a 100755 --- a/test/src/test/java/org/zstack/test/virtualrouter/TestPolicyForVirtualRouterOffering.java +++ b/test/src/test/java/org/zstack/test/virtualrouter/TestPolicyForVirtualRouterOffering.java @@ -9,7 +9,7 @@ import org.zstack.header.configuration.APIDeleteInstanceOfferingMsg; import org.zstack.header.configuration.ConfigurationConstant; import org.zstack.header.configuration.InstanceOfferingInventory; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -74,7 +74,7 @@ public void test() throws ApiSenderException, InterruptedException { identityCreator.createUser("user1", "password"); PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", VirtualRouterConstant.ACTION_CATEGORY, APICreateVirtualRouterOfferingMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", ConfigurationConstant.ACTION_CATEGORY, APIDeleteInstanceOfferingMsg.class.getSimpleName())); identityCreator.createPolicy("allow", s); @@ -86,7 +86,7 @@ public void test() throws ApiSenderException, InterruptedException { s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", VirtualRouterConstant.ACTION_CATEGORY, APICreateVirtualRouterOfferingMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", ConfigurationConstant.ACTION_CATEGORY, APIDeleteInstanceOfferingMsg.class.getSimpleName())); identityCreator.createPolicy("deny", s); From b6e5a7d595d2903a5d859f2b51951480236b6cbe Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Mon, 19 May 2025 16:42:29 +0800 Subject: [PATCH 396/737] [xinfini]: support snapshot rollback and export Resolves: ZSTAC-75073 Change-Id: I7061776c6d786c74616d61616563696e62756371 --- .../sdk/ExternalStorageParam.java | 4 + .../org/zstack/externalStorage/sdk/Param.java | 2 + .../org/zstack/xinfini/XInfiniApiHelper.java | 36 ++++++++- .../org/zstack/xinfini/XInfiniPathHelper.java | 4 + .../xinfini/XInfiniStorageController.java | 78 +++++++++++++++---- .../org/zstack/xinfini/sdk/XInfiniClient.java | 19 +++-- .../sdk/volume/CloneVolumeRequest.java | 2 +- .../sdk/volume/FlattenVolumeRequest.java | 53 +++++++++++++ .../sdk/volume/FlattenVolumeResponse.java | 43 ++++++++++ .../sdk/volume/RollbackSnapshotRequest.java | 64 +++++++++++++++ .../sdk/volume/RollbackSnapshotResponse.java | 43 ++++++++++ .../sdk/volume/UpdateVolumeRequest.java | 2 +- 12 files changed, 324 insertions(+), 26 deletions(-) create mode 100644 plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/FlattenVolumeRequest.java create mode 100644 plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/FlattenVolumeResponse.java create mode 100644 plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/RollbackSnapshotRequest.java create mode 100644 plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/RollbackSnapshotResponse.java diff --git a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/sdk/ExternalStorageParam.java b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/sdk/ExternalStorageParam.java index e52f8dcd77c..27c7c8e25bd 100644 --- a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/sdk/ExternalStorageParam.java +++ b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/sdk/ExternalStorageParam.java @@ -69,6 +69,10 @@ default Object getParameterValue(String name){ return getParameterValue(name, true); } + default boolean isQueryableParam(String name) { + return getParameterMap().get(name).annotation.queryable(); + } + default Object getParameterValue(String name, boolean exceptionOnNotFound){ return getParameterValue(getParameterMap(), name, exceptionOnNotFound); } diff --git a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/sdk/Param.java b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/sdk/Param.java index 9eb251ac8bf..0daaae1474d 100644 --- a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/sdk/Param.java +++ b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/sdk/Param.java @@ -13,4 +13,6 @@ long[] numberRange() default {}; boolean nonempty() default false; + + boolean queryable() default false; } diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java index 0b231e9544b..1a6cd24cfd5 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java @@ -226,6 +226,17 @@ public VolumeModule queryVolumeByName(String name) { return rsp.getItems().get(0); } + public VolumeModule queryVolumeByNameAndSnapId(String name, int snapId) { + QueryVolumeRequest req = new QueryVolumeRequest(); + req.q = String.format("((spec.name:%s) AND (spec.bs_snap_id:%s))", name, snapId); + QueryVolumeResponse rsp = queryErrorOut(req, QueryVolumeResponse.class); + if (rsp.getMetadata().getPagination().getCount() == 0) { + return null; + } + + return rsp.getItems().get(0); + } + public VolumeModule queryVolumeById(int id) { QueryVolumeRequest req = new QueryVolumeRequest(); req.q = String.format("spec.id:%s", id); @@ -285,6 +296,17 @@ public VolumeModule cloneVolume(int snapId, String name, String desc, boolean fl (GetVolumeResponse gvp) -> gvp.toModule().getMetadata().getState().getState()).toModule(); } + public VolumeModule flattenVolume(int volId) { + FlattenVolumeRequest req = new FlattenVolumeRequest(); + req.setId(volId); + req.setCreator(XInfiniConstants.DEFAULT_CREATOR); + callErrorOut(req, FlattenVolumeResponse.class); + GetVolumeRequest gReq = new GetVolumeRequest(); + gReq.setId(volId); + return retryUtilStateActive(gReq, GetVolumeResponse.class, + (GetVolumeResponse gvp) -> gvp.toModule().getMetadata().getState().getState()).toModule(); + } + public VolumeModule expandVolume(int volId, long size) { UpdateVolumeRequest req = new UpdateVolumeRequest(); req.setCreator(XInfiniConstants.DEFAULT_CREATOR); @@ -401,6 +423,17 @@ public void deleteBdcBdev(int bdevId) { retryUtilResourceDeleted(gReq, GetBdcBdevResponse.class); } + public VolumeModule rollbackSnapshot(int volId, int snapId) { + RollbackSnapshotRequest req = new RollbackSnapshotRequest(); + req.setId(volId); + req.setBsSnapId(snapId); + callErrorOut(req, RollbackSnapshotResponse.class); + GetVolumeRequest gReq = new GetVolumeRequest(); + gReq.setId(volId); + return retryUtilStateActive(gReq, GetVolumeResponse.class, + (GetVolumeResponse gvp) -> gvp.toModule().getMetadata().getState().getState()).toModule(); + } + public void deleteVolume(int volId, boolean force) { List mappings = queryVolumeClientGroupMappingByVolId(volId); if (!CollectionUtils.isEmpty(mappings)) { @@ -452,7 +485,8 @@ public void deleteVolumeSnapshot(int snapShotId) { .isExists(); if (exist) { - throw new OperationFailureException(operr("snapshot %s has %d cloned volumes, volumes names: %s", snapShotId, vRsp.getMetadata().getPagination().getCount(), volNames)); + VolumeSnapshotModule snap = getVolumeSnapshot(snapShotId); + throw new OperationFailureException(operr("snapshot [id:%s, name:%s] has %d cloned volumes, volumes names: %s", snapShotId, snap.getSpec().getName(), vRsp.getMetadata().getPagination().getCount(), volNames)); } logger.info("all cloned volumes not exist in database, try to delete them"); // try to delete cloned volumes if not exist in db diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniPathHelper.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniPathHelper.java index cc7701de2ba..611ae98c9c7 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniPathHelper.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniPathHelper.java @@ -37,4 +37,8 @@ public static int getVolIdFromPath(String url) { public static int getSnapIdFromPath(String url) { return Integer.parseInt(url.replace("xinfini://", "").split("/")[1].split("@")[1]); } + + public static String buildSnapshotExportVolumeName(int snapId) { + return String.format("for-snapshot-%s-iscsi-export", snapId); + } } diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index 50a43284df6..95a005ea48d 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -275,14 +275,21 @@ public String getActivePath(BaseVolumeInfo v, HostInventory h, boolean shareable bdc.getSpec().getId(), bdevName, vcfs); return bdev.getSpec().getSocketPath(); } else if (VolumeProtocol.iSCSI.toString().equals(v.getProtocol())) { + int volId; if (v.getInstallPath().contains("@")) { - // todo - throw new OperationFailureException(operr("not support active snapshot with iscsi protocol")); + int snapId = getSnapIdFromPath(v.getInstallPath()); + VolumeModule vol = apiHelper.queryVolumeByNameAndSnapId(buildSnapshotExportVolumeName(snapId), snapId); + if (vol == null) { + logger.info(String.format("can not find exported volume for snapshot %s", snapId)); + return null; + } + volId = vol.getSpec().getId(); + } else { + volId = getVolIdFromPath(v.getInstallPath()); } String clientIqn = IscsiUtils.getHostInitiatorName(h.getUuid()); IscsiClientModule client = apiHelper.queryIscsiClientByIqn(clientIqn); IscsiClientGroupModule group = apiHelper.getIscsiClientGroup(client.getSpec().getIscsiClientGroupId()); - int volId = getVolIdFromPath(v.getInstallPath()); VolumeClientGroupMappingModule map = apiHelper.queryVolumeClientGroupMappingByGroupIdAndVolId(group.getSpec().getId(), volId); if (map == null) { logger.info(String.format("vol %s not related to client group %s, skip get installPath", volId, group.getSpec().getId())); @@ -720,8 +727,12 @@ public void trashVolume(String installPath, Completion comp) { @Override public void cloneVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValueCompletion comp) { + cloneVolume(srcInstallPath, dst, comp, false); + } + + private void cloneVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValueCompletion comp, boolean flatten) { int snapId = getSnapIdFromPath(srcInstallPath); - VolumeModule vol = apiHelper.cloneVolume(snapId, dst.getName(), null, false); + VolumeModule vol = apiHelper.cloneVolume(snapId, dst.getName(), null, flatten); if (SizeUnit.MEGABYTE.toByte(vol.getSpec().getSizeMb()) < dst.getSize()) { vol = apiHelper.expandVolume(vol.getSpec().getId(), convertBytesToMegaBytes(dst.getSize())); @@ -737,14 +748,18 @@ public void cloneVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValue @Override public void copyVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValueCompletion comp) { - // TODO - throw new OperationFailureException(operr("not support copy volume yet")); + cloneVolume(srcInstallPath, dst, comp, true); } @Override public void flattenVolume(String installPath, ReturnValueCompletion comp) { - // TODO - throw new OperationFailureException(operr("not support flatten volume yet")); + VolumeModule vol = apiHelper.flattenVolume(getVolIdFromPath(installPath)); + VolumeStats stats = new VolumeStats(); + stats.setInstallPath(installPath); + stats.setSize(SizeUnit.MEGABYTE.toByte(vol.getSpec().getSizeMb())); + stats.setActualSize(vol.getStatus().getAllocatedSizeByte()); + stats.setFormat(VolumeConstant.VOLUME_FORMAT_RAW); + comp.success(stats); } @Override @@ -813,13 +828,24 @@ synchronized IscsiRemoteTarget exportIscsi(ExportSpec espec) { return createIscsiRemoteTarget(espec.getClientMnIp(), espec.getClientQualifiedName(), espec.getInstallPath()); } + private VolumeModule cloneVolumeIfNotExist(int snapId, String dstVolumeName) { + VolumeModule vol = apiHelper.queryVolumeByNameAndSnapId(dstVolumeName, snapId); + if (vol != null) { + return vol; + } + vol = apiHelper.cloneVolume(snapId, dstVolumeName, null, false); + return vol; + } + private IscsiRemoteTarget createIscsiRemoteTarget(String clientIp, String clientIqn, String installPath) { + int volId; if (installPath.contains("@")) { - // todo - throw new OperationFailureException(operr("not support active snapshot with iscsi protocol")); + int snapId = getSnapIdFromPath(installPath); + VolumeModule vol = cloneVolumeIfNotExist(snapId, buildSnapshotExportVolumeName(snapId)); + volId = vol.getSpec().getId(); + } else { + volId = getVolIdFromPath(installPath); } - - int volId = getVolIdFromPath(installPath); IscsiClientGroupModule group; IscsiClientModule clientModule; clientModule = apiHelper.queryIscsiClientByIqn(clientIqn); @@ -873,9 +899,17 @@ public void unexport(ExportSpec espec, RemoteTarget remoteTarget, VolumeProtocol } private synchronized void unexportIscsi(String source, String clientIqn) { + int volId; if (source.contains("@")) { - // todo - throw new OperationFailureException(operr("not support unexport snapshot with iscsi protocol")); + int snapId = getSnapIdFromPath(source); + VolumeModule vol = apiHelper.queryVolumeByNameAndSnapId(buildSnapshotExportVolumeName(snapId), snapId); + if (vol == null) { + return; + } + + volId = vol.getSpec().getId(); + } else { + volId = getVolIdFromPath(source); } IscsiClientModule clientModule = apiHelper.queryIscsiClientByIqn(clientIqn); @@ -883,12 +917,16 @@ private synchronized void unexportIscsi(String source, String clientIqn) { return; } - VolumeClientGroupMappingModule mapping = apiHelper.queryVolumeClientGroupMappingByGroupIdAndVolId(clientModule.getSpec().getIscsiClientGroupId(), getVolIdFromPath(source)); + VolumeClientGroupMappingModule mapping = apiHelper.queryVolumeClientGroupMappingByGroupIdAndVolId(clientModule.getSpec().getIscsiClientGroupId(), volId); if (mapping == null) { return; } retry(() -> apiHelper.deleteVolumeClientGroupMapping(mapping.getSpec().getId())); + + if (source.contains("@")) { + apiHelper.deleteVolume(volId, true); + } } @Override @@ -914,8 +952,14 @@ public void expungeSnapshot(String installPath, Completion comp) { @Override public void revertVolumeSnapshot(String snapshotInstallPath, ReturnValueCompletion comp) { - // TODO - throw new OperationFailureException(operr("not support revert volume snapshot yet")); + int volId = getVolIdFromPath(snapshotInstallPath); + int snapId = getSnapIdFromPath(snapshotInstallPath); + VolumeModule vol = apiHelper.rollbackSnapshot(volId, snapId); + VolumeStats stats = new VolumeStats(); + stats.setInstallPath(buildXInfiniPath(vol.getSpec().getPoolId(), vol.getSpec().getId())); + stats.setSize(SizeUnit.MEGABYTE.toByte(vol.getSpec().getSizeMb())); + stats.setActualSize(vol.getStatus().getAllocatedSizeByte()); + comp.success(stats); } @Override diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java index 89eb1b9f80f..12ff3f5b29c 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java @@ -6,6 +6,7 @@ import org.springframework.http.HttpMethod; import org.zstack.core.Platform; import org.zstack.externalStorage.sdk.ExternalStorageApiClient; +import org.zstack.externalStorage.sdk.ExternalStorageParam; import org.zstack.header.rest.DefaultSSLVerifier; import org.zstack.header.xinfini.XInfiniConstants; import org.zstack.utils.Utils; @@ -13,6 +14,7 @@ import org.zstack.utils.logging.CLogger; import org.zstack.xinfini.NodeStatus; import org.zstack.xinfini.XInfiniConfig; +import org.zstack.xinfini.sdk.volume.FlattenVolumeRequest; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.X509TrustManager; @@ -92,7 +94,6 @@ class Api { final String taskIdForLog = Platform.getUuid(); String reqBody; // for log - final String CREATOR_PARAM = "creator"; Api(XInfiniRequest action) { this.action = action; @@ -286,6 +287,7 @@ private void fillNonQueryApiRequestBuilder(Request.Builder reqBuilder, XInfiniCo } final Map params = new HashMap<>(); + final Map queryableParams = new HashMap<>(); for (String pname : action.getAllParameterNames()) { if (varNames.contains(pname)) { @@ -294,7 +296,13 @@ private void fillNonQueryApiRequestBuilder(Request.Builder reqBuilder, XInfiniCo } Object value = action.getParameterValue(pname); - if (value != null) { + if (value == null) { + continue; + } + + if (action.isQueryableParam(pname)) { + queryableParams.put(pname, value.toString()); + } else { params.put(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, pname), value); } } @@ -304,10 +312,9 @@ private void fillNonQueryApiRequestBuilder(Request.Builder reqBuilder, XInfiniCo } else if (restInfo.method().equals(HttpMethod.DELETE) && !restInfo.hasBody()) { params.forEach((k, v) -> builder.addQueryParameter(k, v.toString())); reqBuilder.url(builder.build()).delete(); - } else if (restInfo.method().equals(HttpMethod.PATCH)) { - if (params.containsKey(CREATOR_PARAM)) { - builder.addQueryParameter(CREATOR_PARAM, params.get(CREATOR_PARAM).toString()); - params.remove(CREATOR_PARAM); + } else if (!queryableParams.isEmpty()) { + for (Map.Entry entry : queryableParams.entrySet()) { + builder.addQueryParameter(entry.getKey(), entry.getValue()); } reqBody = gson.toJson(new WrappedRequest(params)); reqBuilder.url(builder.build()).method(restInfo.method().toString(), RequestBody.create(XInfiniConstants.JSON, reqBody)); diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/CloneVolumeRequest.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/CloneVolumeRequest.java index 1ecfdc1830e..25242ba27b6 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/CloneVolumeRequest.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/CloneVolumeRequest.java @@ -17,7 +17,7 @@ @XInfiniRestRequest( path = "/bs-volumes/:clone", method = HttpMethod.POST, - responseClass = CreateVolumeSnapshotResponse.class, + responseClass = CloneVolumeResponse.class, category = XInfiniApiCategory.AFA ) public class CloneVolumeRequest extends XInfiniRequest { diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/FlattenVolumeRequest.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/FlattenVolumeRequest.java new file mode 100644 index 00000000000..267a8fd70da --- /dev/null +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/FlattenVolumeRequest.java @@ -0,0 +1,53 @@ +package org.zstack.xinfini.sdk.volume; + +import org.springframework.http.HttpMethod; +import org.zstack.externalStorage.sdk.Param; +import org.zstack.header.xinfini.XInfiniConstants; +import org.zstack.xinfini.XInfiniApiCategory; +import org.zstack.xinfini.sdk.XInfiniRequest; +import org.zstack.xinfini.sdk.XInfiniRestRequest; + +import java.util.HashMap; +import java.util.Map; + +/** + * @ Author : yh.w + * @ Date : Created in 17:36 2024/5/27 + */ +@XInfiniRestRequest( + path = "/bs-volumes/{id}/:flatten", + method = HttpMethod.POST, + responseClass = FlattenVolumeResponse.class, + category = XInfiniApiCategory.AFA +) +public class FlattenVolumeRequest extends XInfiniRequest { + @Param + private int id; + + @Param(queryable=true) + private String creator = XInfiniConstants.DEFAULT_CREATOR; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getCreator() { + return creator; + } + + public void setCreator(String creator) { + this.creator = creator; + } + + private static final HashMap parameterMap = new HashMap<>(); + + @Override + public Map getParameterMap() { + return parameterMap; + } + +} diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/FlattenVolumeResponse.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/FlattenVolumeResponse.java new file mode 100644 index 00000000000..a773f18faa1 --- /dev/null +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/FlattenVolumeResponse.java @@ -0,0 +1,43 @@ + +package org.zstack.xinfini.sdk.volume; + +import org.zstack.xinfini.sdk.BaseResource; +import org.zstack.xinfini.sdk.XInfiniResponse; + +/** + * @ Author : yh.w + * @ Date : Created in 18:30 2024/5/29 + */ +public class FlattenVolumeResponse extends XInfiniResponse { + private BaseResource.Metadata metadata; + private VolumeModule.VolumeSpec spec; + private VolumeModule.VolumeStatus status; + + public BaseResource.Metadata getMetadata() { + return metadata; + } + + public void setMetadata(BaseResource.Metadata metadata) { + this.metadata = metadata; + } + + public VolumeModule.VolumeSpec getSpec() { + return spec; + } + + public void setSpec(VolumeModule.VolumeSpec spec) { + this.spec = spec; + } + + public VolumeModule.VolumeStatus getStatus() { + return status; + } + + public void setStatus(VolumeModule.VolumeStatus status) { + this.status = status; + } + + public VolumeModule toModule() { + return new VolumeModule(metadata, spec, status); + } +} diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/RollbackSnapshotRequest.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/RollbackSnapshotRequest.java new file mode 100644 index 00000000000..0403ba39cfd --- /dev/null +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/RollbackSnapshotRequest.java @@ -0,0 +1,64 @@ +package org.zstack.xinfini.sdk.volume; + +import org.springframework.http.HttpMethod; +import org.zstack.externalStorage.sdk.Param; +import org.zstack.header.xinfini.XInfiniConstants; +import org.zstack.xinfini.XInfiniApiCategory; +import org.zstack.xinfini.sdk.XInfiniRequest; +import org.zstack.xinfini.sdk.XInfiniRestRequest; + +import java.util.HashMap; +import java.util.Map; + +/** + * @ Author : yh.w + * @ Date : Created in 17:36 2024/5/27 + */ +@XInfiniRestRequest( + path = "/bs-volumes/{id}/:rollback", + method = HttpMethod.POST, + responseClass = RollbackSnapshotResponse.class, + category = XInfiniApiCategory.AFA +) +public class RollbackSnapshotRequest extends XInfiniRequest { + @Param + private int id; + + @Param + private int bsSnapId; + + @Param + private String creator = XInfiniConstants.DEFAULT_CREATOR; + + public int getBsSnapId() { + return bsSnapId; + } + + public void setBsSnapId(int bsSnapId) { + this.bsSnapId = bsSnapId; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getCreator() { + return creator; + } + + public void setCreator(String creator) { + this.creator = creator; + } + + private static final HashMap parameterMap = new HashMap<>(); + + @Override + public Map getParameterMap() { + return parameterMap; + } + +} diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/RollbackSnapshotResponse.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/RollbackSnapshotResponse.java new file mode 100644 index 00000000000..366b5ca7c40 --- /dev/null +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/RollbackSnapshotResponse.java @@ -0,0 +1,43 @@ + +package org.zstack.xinfini.sdk.volume; + +import org.zstack.xinfini.sdk.BaseResource; +import org.zstack.xinfini.sdk.XInfiniResponse; + +/** + * @ Author : yh.w + * @ Date : Created in 18:30 2024/5/29 + */ +public class RollbackSnapshotResponse extends XInfiniResponse { + private BaseResource.Metadata metadata; + private VolumeModule.VolumeSpec spec; + private VolumeModule.VolumeStatus status; + + public BaseResource.Metadata getMetadata() { + return metadata; + } + + public void setMetadata(BaseResource.Metadata metadata) { + this.metadata = metadata; + } + + public VolumeModule.VolumeSpec getSpec() { + return spec; + } + + public void setSpec(VolumeModule.VolumeSpec spec) { + this.spec = spec; + } + + public VolumeModule.VolumeStatus getStatus() { + return status; + } + + public void setStatus(VolumeModule.VolumeStatus status) { + this.status = status; + } + + public VolumeModule toModule() { + return new VolumeModule(metadata, spec, status); + } +} diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/UpdateVolumeRequest.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/UpdateVolumeRequest.java index ef10b78186a..d29da90d412 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/UpdateVolumeRequest.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/UpdateVolumeRequest.java @@ -20,7 +20,7 @@ category = XInfiniApiCategory.AFA ) public class UpdateVolumeRequest extends XInfiniRequest { - @Param(required = false) + @Param(required = false, queryable = true) private String creator; @Param From 457129fa41356854ccec810f3c81dc0d91ad8af2 Mon Sep 17 00:00:00 2001 From: J M Date: Mon, 26 May 2025 18:41:49 +0800 Subject: [PATCH 397/737] [storage]: add config lazy delete Resolves: ZSTAC-75280 Change-Id: I686b6e6f656b79736c64706d66616f6c68657479 --- .../primary/VolumeSnapshotCapability.java | 21 +++++++++++++++++++ .../zstack/expon/ExponStorageController.java | 1 + .../xinfini/XInfiniStorageController.java | 1 + .../storage/zbs/ZbsStorageController.java | 1 + .../addon/primary/ExternalPrimaryStorage.java | 13 ++++++++++-- 5 files changed, 35 insertions(+), 2 deletions(-) diff --git a/header/src/main/java/org/zstack/header/storage/primary/VolumeSnapshotCapability.java b/header/src/main/java/org/zstack/header/storage/primary/VolumeSnapshotCapability.java index ab75ad69b61..8a19064a38e 100755 --- a/header/src/main/java/org/zstack/header/storage/primary/VolumeSnapshotCapability.java +++ b/header/src/main/java/org/zstack/header/storage/primary/VolumeSnapshotCapability.java @@ -12,13 +12,34 @@ public void setSupportCreateOnHypervisor(boolean supportCreateOnHypervisor) { this.supportCreateOnHypervisor = supportCreateOnHypervisor; } + public boolean isSupportLazyDelete() { + return supportLazyDelete; + } + + public void setSupportLazyDelete(boolean supportLazyDelete) { + this.supportLazyDelete = supportLazyDelete; + } + public static enum VolumeSnapshotArrangementType { CHAIN, INDIVIDUAL } private boolean support; + + /*** + * Whether the primary storage supports creating volume snapshots by hypervisor. + */ private boolean supportCreateOnHypervisor; + + + /*** + * Whether the primary storage supports lazy delete for volume snapshots. + * even if snapshot is not ready for delete, it can be auto-deleted in storage backend. + * so client can delete snapshot immediately without waiting for reference cleaned. + */ + private boolean supportLazyDelete; + private VolumeSnapshotArrangementType arrangementType; public boolean isSupport() { diff --git a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java index 0b7ee6f86f8..cef1855013b 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java +++ b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java @@ -94,6 +94,7 @@ public class ExponStorageController implements PrimaryStorageControllerSvc, Prim scap.setSupport(true); scap.setArrangementType(VolumeSnapshotCapability.VolumeSnapshotArrangementType.INDIVIDUAL); scap.setSupportCreateOnHypervisor(false); + scap.setSupportLazyDelete(true); capabilities.setSnapshotCapability(scap); capabilities.setSupportCloneFromVolume(false); capabilities.setSupportStorageQos(true); diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index 95a005ea48d..5259fb2ad2e 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -88,6 +88,7 @@ public class XInfiniStorageController implements PrimaryStorageControllerSvc, Pr scap.setSupport(true); scap.setArrangementType(VolumeSnapshotCapability.VolumeSnapshotArrangementType.INDIVIDUAL); scap.setSupportCreateOnHypervisor(false); + scap.setSupportLazyDelete(false); capabilities.setSnapshotCapability(scap); capabilities.setSupportCloneFromVolume(false); capabilities.setSupportStorageQos(false); diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 2209dd63d02..a008bd6eab1 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -98,6 +98,7 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar scap.setSupport(true); scap.setArrangementType(VolumeSnapshotCapability.VolumeSnapshotArrangementType.INDIVIDUAL); scap.setSupportCreateOnHypervisor(false); + scap.setSupportLazyDelete(false); capabilities.setSnapshotCapability(scap); capabilities.setSupportCloneFromVolume(false); capabilities.setSupportStorageQos(false); diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index 6bcbbf97f6e..20d17ec411e 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -722,8 +722,17 @@ protected void handle(CreateImageCacheFromVolumeSnapshotOnPrimaryStorageMsg msg) ImageCacheVO cache = createTemporaryImageCacheFromVolumeSnapshot(msg.getImageInventory(), msg.getVolumeSnapshot()); dbf.persist(cache); reply.setInventory(cache.toInventory()); - // TODO hardcode for expon - reply.setIncremental(false); + + boolean lazyDelete = controller.reportCapabilities().getSnapshotCapability().isSupportLazyDelete(); + /** + If the primary storage supports lazy deletion, we can delete the snapshot immediately. + Otherwise, we need to retain the snapshot until its references are deleted. + The incremental clone mechanism handles this reference management. + + In other words, if the primary storage supports lazy deletion, we can treat it as a + standard clone operation for simplified management. + */ + reply.setIncremental(!lazyDelete); bus.reply(msg, reply); return; } From a5f4aff1acff095cad523705a296b00d7237f476 Mon Sep 17 00:00:00 2001 From: J M Date: Tue, 3 Jun 2025 18:48:52 +0800 Subject: [PATCH 398/737] [storage]: support extPs get and delete chain some storage may not support trash. use delete volume and snapshot for link clone. for external PS controller stats function should support param installUri from parentUri from VolumeStats Resolves: ZSTAC-75280 Change-Id: I756563717379666a6e687969717a7861767a6b61 --- .../primary/PrimaryStorageControllerSvc.java | 1 + ...lumeBackingChainFromPrimaryStorageMsg.java | 1 + .../org/zstack/header/volume/VolumeStats.java | 18 +++- .../zstack/expon/ExponStorageController.java | 1 + .../zstack/expon/sdk/volume/VolumeModule.java | 1 + .../xinfini/XInfiniStorageController.java | 1 + .../storage/zbs/ZbsStorageController.java | 1 + .../addon/primary/ExternalPrimaryStorage.java | 98 ++++++++++++++++++- 8 files changed, 116 insertions(+), 6 deletions(-) diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java b/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java index 88f32c1dc79..14d7d47eb16 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java @@ -32,6 +32,7 @@ public interface PrimaryStorageControllerSvc { void copyVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValueCompletioncomp); void flattenVolume(String installPath, ReturnValueCompletioncomp); + // support uri or path void stats(String installPath, ReturnValueCompletion comp); void batchStats(Collection installPath, ReturnValueCompletion> comp); diff --git a/header/src/main/java/org/zstack/header/storage/primary/GetVolumeBackingChainFromPrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/primary/GetVolumeBackingChainFromPrimaryStorageMsg.java index 08c361b78f3..d928fea28c7 100644 --- a/header/src/main/java/org/zstack/header/storage/primary/GetVolumeBackingChainFromPrimaryStorageMsg.java +++ b/header/src/main/java/org/zstack/header/storage/primary/GetVolumeBackingChainFromPrimaryStorageMsg.java @@ -12,6 +12,7 @@ public class GetVolumeBackingChainFromPrimaryStorageMsg extends NeedReplyMessage private String volumeUuid; private List rootInstallPaths = new ArrayList<>(); private String primaryStorageUuid; + // TODO remove it private String hostUuid; private String volumeFormat; diff --git a/header/src/main/java/org/zstack/header/volume/VolumeStats.java b/header/src/main/java/org/zstack/header/volume/VolumeStats.java index 5cf77698ea2..2931945e7ed 100644 --- a/header/src/main/java/org/zstack/header/volume/VolumeStats.java +++ b/header/src/main/java/org/zstack/header/volume/VolumeStats.java @@ -2,9 +2,16 @@ public class VolumeStats { protected String installPath; - protected Long actualSize; protected String format; + protected Long actualSize; protected Long size; + /** + * The parent uri of the volume, vendor://pool/path@snapshot or snapshot://uuid + */ + protected String parentUri; + + // TODO(shenjin): remove it + @Deprecated protected String runStatus; public VolumeStats(String installPath, Long actualSize) { @@ -54,6 +61,15 @@ public String getFormat() { return format; } + public void setParentUri(String parentUri) { + this.parentUri = parentUri; + } + + public String getParentUri() { + return parentUri; + } + + @Deprecated public String getRunStatus() { return runStatus; } diff --git a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java index cef1855013b..2a0489c7b2e 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java +++ b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java @@ -1063,6 +1063,7 @@ public void cloneVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValue stats.setFormat(VolumeConstant.VOLUME_FORMAT_RAW); stats.setSize(vol.getVolumeSize()); stats.setActualSize(vol.getDataSize()); + stats.setParentUri(srcInstallPath); comp.success(stats); } diff --git a/plugin/expon/src/main/java/org/zstack/expon/sdk/volume/VolumeModule.java b/plugin/expon/src/main/java/org/zstack/expon/sdk/volume/VolumeModule.java index 2f9194ef597..aa9efe98263 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/sdk/volume/VolumeModule.java +++ b/plugin/expon/src/main/java/org/zstack/expon/sdk/volume/VolumeModule.java @@ -28,6 +28,7 @@ public class VolumeModule { private boolean isDelete; private boolean qosStatus; private ExponVolumeQos qos; + private String runStatus; public String getId() { diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index 5259fb2ad2e..7fc593a266c 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -744,6 +744,7 @@ private void cloneVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValu stats.setFormat(VolumeConstant.VOLUME_FORMAT_RAW); stats.setSize(SizeUnit.MEGABYTE.toByte(vol.getSpec().getSizeMb())); stats.setActualSize(vol.getStatus().getAllocatedSizeByte()); + stats.setParentUri(srcInstallPath); comp.success(stats); } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index a008bd6eab1..3210e65c72e 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -587,6 +587,7 @@ public void success(CloneVolumeRsp returnValue) { stats.setFormat(VolumeConstant.VOLUME_FORMAT_RAW); stats.setSize(returnValue.getSize()); stats.setActualSize(returnValue.getActualSize()); + stats.setParentUri(srcInstallPath); trigger.next(); } diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index 20d17ec411e..0fd83d5253f 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -55,10 +55,7 @@ import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; @@ -139,6 +136,10 @@ protected void handleLocalMessage(Message msg) { handle((GetAccessPathMsg) msg); } else if (msg instanceof UpdatePrimaryStorageHostStatusMsg) { handle((UpdatePrimaryStorageHostStatusMsg) msg); + } else if (msg instanceof GetVolumeBackingChainFromPrimaryStorageMsg) { + handle((GetVolumeBackingChainFromPrimaryStorageMsg) msg); + } else if (msg instanceof DeleteVolumeChainOnPrimaryStorageMsg) { + handle((DeleteVolumeChainOnPrimaryStorageMsg) msg); } else { super.handleLocalMessage(msg); } @@ -1408,6 +1409,91 @@ protected void handle(GetInstallPathForDataVolumeDownloadMsg msg) { bus.reply(msg, reply); } + protected void handle(GetVolumeBackingChainFromPrimaryStorageMsg msg) { + GetVolumeBackingChainFromPrimaryStorageReply r = new GetVolumeBackingChainFromPrimaryStorageReply(); + new While<>(msg.getRootInstallPaths()).each((installPath, compl) -> { + getParentChain(installPath, new ArrayList<>(), new ReturnValueCompletion>(compl) { + @Override + public void success(List chains) { + long tsize = 0; + List chainPaths = new ArrayList<>(); + for (VolumeStats stats : chains) { + tsize += stats.getActualSize(); + chainPaths.add(stats.getInstallPath()); + } + + r.putBackingChainInstallPath(installPath, chainPaths); + r.putBackingChainSize(installPath, tsize); + compl.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + compl.addError(errorCode); + compl.allDone(); + } + }); + }).run(new WhileDoneCompletion(msg) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + r.setError(errorCodeList.getCauses().get(0)); + } + bus.reply(msg, r); + } + }); + } + + private void getParentChain(String installPath, List chains, ReturnValueCompletion> completion) { + controller.stats(installPath, new ReturnValueCompletion(completion) { + @Override + public void success(VolumeStats stats) { + chains.add(stats); + if (stats.getParentUri() == null) { + chains.remove(0); // do not contain self + completion.success(chains); + return; + } + + getParentChain(stats.getParentUri(), chains, completion); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + protected void handle(DeleteVolumeChainOnPrimaryStorageMsg msg) { + DeleteVolumeChainOnPrimaryStorageReply reply = new DeleteVolumeChainOnPrimaryStorageReply(); + new While<>(msg.getInstallPaths()).each((installPath, compl) -> { + // TODO use trash instead, make sure only one snapshot for link clone. + controller.deleteVolumeAndSnapshot(installPath, new Completion(compl) { + @Override + public void success() { + compl.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + compl.addError(errorCode); + compl.allDone(); + } + }); + }).run(new WhileDoneCompletion(msg) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + reply.setError(errorCodeList.getCauses().get(0)); + bus.reply(msg, reply); + } else { + bus.reply(msg, reply); + } + } + }); + } + @Override protected void handle(DeleteVolumeBitsOnPrimaryStorageMsg msg) { String protocol = null; @@ -1417,6 +1503,8 @@ protected void handle(DeleteVolumeBitsOnPrimaryStorageMsg msg) { if (volume != null) { protocol = volume.getProtocol(); } + + // FIXME(shenjin) remove it if (volume != null && VolumeType.Root.equals(volume.getType()) && VolumeProtocol.iSCSI.toString().equals(protocol)) { force = true; } @@ -2021,7 +2109,7 @@ public void handle(ErrorCode errCode, Map data) { }).start(); } - protected void doDeleteBits(String installPath, boolean force, Completion completion) { + private void doDeleteBits(String installPath, boolean force, Completion completion) { if (force) { controller.deleteVolume(installPath, completion); } else { From cb55e2ca8aacac8b980463d5c86e393ddcdcf96b Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Wed, 4 Jun 2025 18:31:52 +0800 Subject: [PATCH 399/737] [xinfini]: support get volume parent uri Resolves: ZSTAC-75421 Change-Id: I69646963666374776a79746975676476766b776a --- .../org/zstack/xinfini/XInfiniPathHelper.java | 4 +++ .../xinfini/XInfiniStorageController.java | 36 +++++++++++++------ .../addon/primary/ExternalPrimaryStorage.java | 1 - 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniPathHelper.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniPathHelper.java index 611ae98c9c7..0d057986f71 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniPathHelper.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniPathHelper.java @@ -26,6 +26,10 @@ public static String buildXInfiniSnapshotPath(String volPath, Integer snapId) { return volPath + "@" + snapId; } + public static String buildXInfiniSnapshotPath(Integer poolId, Integer volId, Integer snapId) { + return String.format("xinfini://%s/%s@%s", poolId, volId, snapId); + } + public static int getPoolIdFromPath(String url) { return Integer.parseInt(url.replace("xinfini://", "").split("/")[0]); } diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index 7fc593a266c..5be013edb2a 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -77,7 +77,15 @@ public class XInfiniStorageController implements PrimaryStorageControllerSvc, Pr @Autowired private ResourceConfigFacade rcf; - private final String vhostSocketDir; + private String vhostSocketDir; + + private String getVhostSocketDir() { + if (vhostSocketDir == null) { + vhostSocketDir = String.format("/var/run/bdc-%s/", apiHelper.getClusterUuid()); + } + + return vhostSocketDir; + } private static final StorageCapabilities capabilities = new StorageCapabilities(); @@ -119,7 +127,6 @@ public XInfiniStorageController(String configStr) { client.configure(clientConfig); apiHelper = new XInfiniApiHelper(client); - vhostSocketDir = String.format("/var/run/bdc-%s/", apiHelper.getClusterUuid()); } private String protocolToString(VolumeProtocol protocol) { @@ -325,8 +332,8 @@ public String getActivePath(BaseVolumeInfo v, HostInventory h, boolean shareable public BaseVolumeInfo getActiveVolumeInfo(String activePath, HostInventory h, boolean shareable) { BaseVolumeInfo info = new BaseVolumeInfo(); String volUuid; - if (activePath.startsWith(vhostSocketDir)) { - volUuid = activePath.replace(String.format("%svolume-", vhostSocketDir), ""); + if (activePath.startsWith(getVhostSocketDir())) { + volUuid = activePath.replace(String.format("%svolume-", getVhostSocketDir()), ""); info.setUuid(volUuid); info.setProtocol(VolumeProtocol.Vhost.toString()); info.setShareable(shareable); @@ -394,7 +401,7 @@ public List getActiveClients(String installPath, String prot @Override public List getActiveVolumesLocation(HostInventory h) { - return Collections.singletonList("file://" + PathUtil.join(vhostSocketDir, "volume-*")); + return Collections.singletonList("file://" + PathUtil.join(getVhostSocketDir(), "volume-*")); } @Override @@ -419,7 +426,7 @@ public synchronized void activateHeartbeatVolume(HostInventory h, ReturnValueCom to.setInstallPath(target.getResourceURI()); to.setHostId(apiHelper.queryBdcByIp(h.getManagementIp()).getSpec().getId()); to.setHeartbeatRequiredSpace(SizeUnit.MEGABYTE.toByte(1)); - to.setCoveringPaths(Collections.singletonList(vhostSocketDir)); + to.setCoveringPaths(Collections.singletonList(getVhostSocketDir())); comp.success(to); } @@ -465,7 +472,7 @@ public HeartbeatVolumeTO getHeartbeatVolumeActiveInfo(HostInventory h) { to.setInstallPath(target.getResourceURI()); to.setHostId(apiHelper.queryBdcByIp(h.getManagementIp()).getSpec().getId()); to.setHeartbeatRequiredSpace(SizeUnit.MEGABYTE.toByte(1)); - to.setCoveringPaths(Collections.singletonList(vhostSocketDir)); + to.setCoveringPaths(Collections.singletonList(getVhostSocketDir())); return to; } @@ -531,7 +538,7 @@ public void connect(String config, String url, ReturnValueCompletion new OperationFailureException(operr("fail to get pool[id:%d, name:%s] %s details", it.getId(), it.getName())))); } info.setPools(pools.stream().map(this::getPoolAddonInfo).collect(Collectors.toList())); - + vhostSocketDir = String.format("/var/run/bdc-%s/", apiHelper.getClusterUuid()); comp.success(JSONObjectUtil.rehashObject(info, LinkedHashMap.class)); } @@ -772,9 +779,19 @@ public void stats(String installPath, ReturnValueCompletion comp) { stats.setSize(SizeUnit.MEGABYTE.toByte(vol.getSpec().getSizeMb())); stats.setActualSize(vol.getStatus().getAllocatedSizeByte()); stats.setFormat(VolumeConstant.VOLUME_FORMAT_RAW); + stats.setParentUri(getParentUri(vol)); comp.success(stats); } + private String getParentUri(VolumeModule vol) { + if (vol.getSpec().getBsSnapId() == 0) { + return null; + } + + VolumeSnapshotModule vss = apiHelper.getVolumeSnapshot(vol.getSpec().getBsSnapId()); + return buildXInfiniSnapshotPath(vss.getSpec().getPoolId(), vss.getSpec().getBsVolumeId(), vss.getSpec().getId()); + } + @Override public void batchStats(Collection installPath, ReturnValueCompletion> comp) { List stats = installPath.stream().map(it -> { @@ -948,8 +965,7 @@ public void deleteSnapshot(String installPath, Completion comp) { @Override public void expungeSnapshot(String installPath, Completion comp) { - apiHelper.deleteVolume(getSnapIdFromPath(installPath), true); - comp.success(); + deleteSnapshot(installPath, comp); } @Override diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index 0fd83d5253f..7019a2dcd3b 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -5,7 +5,6 @@ import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; -import org.zstack.core.CoreGlobalProperty; import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.cloudbus.ResourceDestinationMaker; From b397e46f6ce41600e075f4f40f8d726ac9bc7799 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Mon, 16 Jun 2025 11:12:43 +0800 Subject: [PATCH 400/737] [xinfini]: support vm ha Resolves: ZSTAC-75674 Change-Id: I636a697a6b6a75736f666f777874787762766e79 --- .../org/zstack/xinfini/XInfiniApiHelper.java | 35 +++++++++++++++++-- .../xinfini/XInfiniStorageController.java | 23 +++++++++--- .../zstack/xinfini/XInfiniStorageFactory.java | 5 ++- .../xinfini/sdk/iscsi/IscsiGatewayModule.java | 9 +++++ .../xinfini/sdk/iscsi/IscsiNodeState.java | 6 ++++ .../zstack/xinfini/sdk/vhost/BdcRunState.java | 10 ++++++ .../addon/primary/ExternalPrimaryStorage.java | 3 +- 7 files changed, 81 insertions(+), 10 deletions(-) create mode 100644 plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/iscsi/IscsiNodeState.java create mode 100644 plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/vhost/BdcRunState.java diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java index 1a6cd24cfd5..a0bdae6bea4 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java @@ -319,11 +319,33 @@ public VolumeModule expandVolume(int volId, long size) { (GetVolumeResponse gvp) -> gvp.toModule().getMetadata().getState().getState()).toModule(); } + private void retryUtilResourceDeletedIn10Secs(XInfiniRequest req, + Class rsp) { + new Retry() { + @Override + @RetryCondition(times = 5, interval = 2) + protected Void call() { + T r = XInfiniApiHelper.this.call(req, rsp); + if (!r.resourceIsDeleted()) { + throw new RetryException("resource not deleted yet"); + } + + return null; + } + + @Override + // not error out if delete failed + protected boolean onFailure(Throwable t) { + return false; + } + }.run(); + } + private void retryUtilResourceDeleted(XInfiniRequest req, Class rsp) { new Retry() { @Override - @RetryCondition(times = XInfiniConstants.DEFAULT_POLLING_TIMES) + @RetryCondition(times = 150, interval = 2) protected Void call() { T r = XInfiniApiHelper.this.call(req, rsp); if (!r.resourceIsDeleted()) { @@ -405,7 +427,7 @@ public BdcBdevModule getBdcBdev(int id) { return callErrorOut(req, GetBdcBdevResponse.class).toModule(); } - public void deleteBdcBdev(int bdevId) { + public void deleteBdcBdev(int bdevId, int bdcId) { DeleteBdcBdevRequest req = new DeleteBdcBdevRequest(); req.setId(bdevId); DeleteBdcBdevResponse rsp = call(req, DeleteBdcBdevResponse.class); @@ -420,7 +442,14 @@ public void deleteBdcBdev(int bdevId) { GetBdcBdevRequest gReq = new GetBdcBdevRequest(); gReq.setId(bdevId); - retryUtilResourceDeleted(gReq, GetBdcBdevResponse.class); + BdcModule bdc = getBdc(bdcId); + if (!BdcRunState.Active.toString().equals(bdc.getStatus().getRunState())) { + logger.info(String.format("bdc %s is not active, current %s, check bdev deleted in 30s", + bdcId, bdc.getStatus().getRunState())); + retryUtilResourceDeletedIn10Secs(gReq, GetBdcBdevResponse.class); + } else { + retryUtilResourceDeleted(gReq, GetBdcBdevResponse.class); + } } public VolumeModule rollbackSnapshot(int volId, int snapId) { diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index 5be013edb2a..eb439d429d7 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -1,6 +1,7 @@ package org.zstack.xinfini; import org.apache.commons.lang.StringUtils; +import org.apache.lucene.util.packed.DirectMonotonicReader; import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; @@ -45,6 +46,7 @@ import org.zstack.xinfini.sdk.pool.PoolModule; import org.zstack.xinfini.sdk.vhost.BdcBdevModule; import org.zstack.xinfini.sdk.vhost.BdcModule; +import org.zstack.xinfini.sdk.vhost.BdcRunState; import org.zstack.xinfini.sdk.volume.VolumeModule; import org.zstack.xinfini.sdk.volume.VolumeSnapshotModule; @@ -251,7 +253,7 @@ private void deactivateVhost(String installPath, HostInventory h) { return; } - retry(() -> apiHelper.deleteBdcBdev(bdev.getSpec().getId())); + retry(() -> apiHelper.deleteBdcBdev(bdev.getSpec().getId(), bdc.getSpec().getId())); } @Override @@ -627,7 +629,7 @@ private void setNodeHealthyByIscsi(HostInventory host, NodeHealthy healthy) { private void setNodeHealthyByVhost(HostInventory host, NodeHealthy healthy) { VolumeProtocol protocol = VolumeProtocol.Vhost; BdcModule bdc = apiHelper.queryBdcByIp(host.getManagementIp()); - if (bdc.getMetadata().getState().getState().equals(MetadataState.active.toString())) { + if (bdc.getStatus().getRunState().equals(BdcRunState.Active.toString())) { healthy.setHealthy(protocol, StorageHealthy.Ok); } else { healthy.setHealthy(protocol, StorageHealthy.Failed); @@ -762,7 +764,13 @@ public void copyVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValueC @Override public void flattenVolume(String installPath, ReturnValueCompletion comp) { - VolumeModule vol = apiHelper.flattenVolume(getVolIdFromPath(installPath)); + VolumeModule vol = apiHelper.getVolume(getVolIdFromPath(installPath)); + if (vol.getSpec().getBsSnapId() == 0) { + logger.info(String.format("volume[%s] has no related snapshot, no need to flatten", installPath)); + } else { + vol = apiHelper.flattenVolume(getVolIdFromPath(installPath)); + } + VolumeStats stats = new VolumeStats(); stats.setInstallPath(installPath); stats.setSize(SizeUnit.MEGABYTE.toByte(vol.getSpec().getSizeMb())); @@ -889,7 +897,14 @@ private IscsiRemoteTarget createIscsiRemoteTarget(String clientIp, String client .map(IscsiGatewayClientGroupMappingModule::getSpec) .map(IscsiGatewayClientGroupMappingModule.IscsiGatewayClientGroupMappingSpec::getIscsiGatewayId) .collect(Collectors.toList()); - List groupRelatedGateways = apiHelper.queryIscsiGatewaysByIds(gatewayIds); + List groupRelatedGateways = apiHelper.queryIscsiGatewaysByIds(gatewayIds) + .stream() + .filter(v -> IscsiNodeState.ACTIVE.toString().equals(v.getStatus().getNodeState())) + .collect(Collectors.toList()); + + if (groupRelatedGateways.isEmpty()) { + throw new OperationFailureException(operr("no active gateway found for client[%s]", clientIqn)); + } // refresh client clientModule = apiHelper.queryIscsiClientByIqn(clientIqn); diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageFactory.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageFactory.java index 730d8b88851..4faa1988e18 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageFactory.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageFactory.java @@ -1,12 +1,13 @@ package org.zstack.xinfini; -import com.google.common.collect.Maps; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.externalStorage.primary.ExternalStorageFencerType; import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.storage.addon.primary.*; import org.zstack.header.volume.VolumeAfterExpungeExtensionPoint; import org.zstack.header.volume.VolumeInventory; +import org.zstack.header.volume.VolumeProtocol; import org.zstack.header.xinfini.XInfiniConstants; import org.zstack.storage.addon.primary.ExternalPrimaryStorageFactory; @@ -17,6 +18,8 @@ public class XInfiniStorageFactory implements ExternalPrimaryStorageSvcBuilder, BackupStorageSelector, VolumeAfterExpungeExtensionPoint { + public static final ExternalStorageFencerType fencerType = new ExternalStorageFencerType(XInfiniConstants.IDENTITY, VolumeProtocol.iSCSI.toString()); + private List preferBackupStorageTypes; @Autowired diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/iscsi/IscsiGatewayModule.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/iscsi/IscsiGatewayModule.java index aea689ae9c2..54c49aa553c 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/iscsi/IscsiGatewayModule.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/iscsi/IscsiGatewayModule.java @@ -44,6 +44,15 @@ public static class IscsiGatewayStatus extends BaseStatus { private int iscsiClientNum; private int iscsiClientGroupNum; private int iscsiPathNum; + private String nodeState; + + public String getNodeState() { + return nodeState; + } + + public void setNodeState(String nodeState) { + this.nodeState = nodeState; + } public String getConfigContent() { return configContent; diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/iscsi/IscsiNodeState.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/iscsi/IscsiNodeState.java new file mode 100644 index 00000000000..a2d2875d574 --- /dev/null +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/iscsi/IscsiNodeState.java @@ -0,0 +1,6 @@ +package org.zstack.xinfini.sdk.iscsi; + +public enum IscsiNodeState { + ACTIVE, + ERROR +} diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/vhost/BdcRunState.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/vhost/BdcRunState.java new file mode 100644 index 00000000000..6267c1a8546 --- /dev/null +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/vhost/BdcRunState.java @@ -0,0 +1,10 @@ +package org.zstack.xinfini.sdk.vhost; + +/** + * @ Author : yh.w + * @ Date : Created in 11:03 2025/6/12 + */ +public enum BdcRunState { + Active, + Offline +} diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index 7019a2dcd3b..e764f8d28f5 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -259,8 +259,7 @@ public void success(VolumeStats stats) { reply.setSize(stats.getSize()); reply.setInstallPath(stats.getInstallPath()); reply.setProtocol(externalVO.getDefaultProtocol()); - // FIXME: bypass the incremental flag for expon - // reply.setIncremental(true); + reply.setIncremental(!controller.reportCapabilities().getSnapshotCapability().isSupportLazyDelete()); bus.reply(msg, reply); } From 3e106780d120589dbd36002b9780cf4b9b42efae Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Fri, 27 Jun 2025 10:28:57 +0800 Subject: [PATCH 401/737] [iscsi]: remove unused code on fencer cancel Resolves: ZSTAC-75655 Change-Id: I686d716a6b7a7a74666c71756e666c657368697a --- .../zstack/iscsi/kvm/KvmIscsiNodeServer.java | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java b/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java index 026d2f1c128..31dddaa0789 100644 --- a/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java +++ b/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java @@ -279,39 +279,16 @@ public void handle(Map data) { @Override public void kvmCancelSelfFencer(KvmCancelSelfFencerParam param, Completion completion) { - PrimaryStorageNodeSvc nodeSvc = extPsFactory.getNodeSvc(param.getPrimaryStorage().getUuid()); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setName(String.format("cancel-self-fencer-for-external-primary-storage-%s", param.getPrimaryStorage().getUuid())); chain.then(new ShareFlow() { - HostInventory host = HostInventory.valueOf(dbf.findByUuid(param.getHostUuid(), HostVO.class)); - HeartbeatVolumeTO heartbeatVol; @Override public void setup() { - flow(new NoRollbackFlow() { - @Override - public void run(FlowTrigger trigger, Map data) { - nodeSvc.activateHeartbeatVolume(host, new ReturnValueCompletion(trigger) { - @Override - public void success(HeartbeatVolumeTO vol) { - heartbeatVol = vol; - trigger.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - trigger.fail(errorCode); - } - }); - } - }); flow(new NoRollbackFlow() { @Override public void run(FlowTrigger trigger, Map data) { KvmCancelSelfFencerCmd cmd = new KvmCancelSelfFencerCmd(); - cmd.installPath = heartbeatVol.getInstallPath(); - cmd.hostId = heartbeatVol.getHostId(); - cmd.hostUuid = param.getHostUuid(); cmd.uuid = param.getPrimaryStorage().getUuid(); httpCall(KvmIscsiCommands.CANCEL_ISCSI_SELF_FENCER_PATH, param.getHostUuid(), cmd, true, AgentRsp.class, new ReturnValueCompletion(trigger) { From 58954850401371aae982b0f981150659b04f6182 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Sun, 29 Jun 2025 16:47:46 +0800 Subject: [PATCH 402/737] [xinfini]: reformat log Resolves: ZSTAC-75655 Change-Id: I776d6d656268726c7062716c796367616f657677 --- .../src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java index 12ff3f5b29c..8b486289dc7 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java @@ -159,11 +159,10 @@ XinfiniApiResult doCallWithNode(XInfiniConfig.Node withNode) { Request request = reqBuilder.build(); - logger.debug(String.format("call request[%s: %s]: %s, body: %s", action.getClass().getSimpleName(), taskIdForLog, - request, reqBody)); int retryCount = 0; while (retryCount <= 2) { try { + logger.debug(String.format("call request[%s: %s]: %s, body: %s", action.getClass().getSimpleName(), taskIdForLog, request, reqBody)); try (Response response = http.newCall(request).execute()) { if (!response.isSuccessful()) { if (response.body() == null) { From ff74ae92b494198b2dec419ce0e2d2e3b48f0035 Mon Sep 17 00:00:00 2001 From: gitlab Date: Tue, 13 May 2025 07:17:48 +0000 Subject: [PATCH 403/737] Merge branch 'fix-72624' into '5.3.28-suiyuan' [acl]: fix remove acl with multi lb listener See merge request zstackio/zstack!7810 (cherry picked from commit 0d0eef03d205533636ac2a29a3c2839c1d06f38a) e7e63c8b [acl]: fix remove acl with multi lb listener --- .../acl/AccessControlListManagerImpl.java | 20 ++++ .../lb/LoadBalancerCascadeExtension.java | 53 ++++++---- ...rtualRouterLoadBalancerListenerCase.groovy | 97 +++++++++++++++++++ 3 files changed, 153 insertions(+), 17 deletions(-) diff --git a/plugin/acl/src/main/java/org/zstack/acl/AccessControlListManagerImpl.java b/plugin/acl/src/main/java/org/zstack/acl/AccessControlListManagerImpl.java index b953caef9c3..8a8fab95e9c 100644 --- a/plugin/acl/src/main/java/org/zstack/acl/AccessControlListManagerImpl.java +++ b/plugin/acl/src/main/java/org/zstack/acl/AccessControlListManagerImpl.java @@ -411,6 +411,18 @@ public void fail(ErrorCode errorCode) { fchain.done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { + // Call extensions before deleting entries + List entries = Q.New(AccessControlListEntryVO.class) + .eq(AccessControlListEntryVO_.aclUuid, aclVO.getUuid()).list(); + + entries.forEach(entry -> { + CollectionUtils.safeForEach(pluginRgty.getExtensionList(RefreshAccessControlListExtensionPoint.class), + ext -> { + logger.debug(String.format("execute before del acl ip entry extension point %s", ext)); + ext.beforeDeleteIpEntry(aclVO.toInventory(), entry.toInventory()); + }); + }); + new SQLBatch() { @Override protected void scripts() { @@ -419,6 +431,14 @@ protected void scripts() { if (!entrys.isEmpty()) { entrys.forEach( entry-> remove(entry)); } + // Call extensions after deleting entries + entries.forEach(entry -> { + CollectionUtils.safeForEach(pluginRgty.getExtensionList(RefreshAccessControlListExtensionPoint.class), + ext -> { + logger.debug(String.format("execute after del acl ip entry extension point %s", ext)); + ext.afterDeleteIpEntry(aclVO.toInventory(), entry.toInventory()); + }); + }); remove(aclVO); } }.execute(); diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerCascadeExtension.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerCascadeExtension.java index 765c9d07dd1..74acb10f15d 100755 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerCascadeExtension.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerCascadeExtension.java @@ -75,31 +75,50 @@ private void handleDeletion(CascadeAction action, final Completion completion) { completion.success(); return; } - - LoadBalancerListenerVO listenerVO = Q.New(LoadBalancerListenerVO.class).eq(LoadBalancerListenerVO_.uuid, refVOS.get(0).getListenerUuid()).find(); - if (listenerVO.getLoadBalancerUuid() == null) { + List refList = refVOS.stream().map(LoadBalancerListenerACLRefVO::getListenerUuid).collect(Collectors.toList()); + List listenerVOList = Q.New(LoadBalancerListenerVO.class).in(LoadBalancerListenerVO_.uuid, refList).list(); + if (listenerVOList.isEmpty()) { completion.success(); return; } + List msgs = new ArrayList<>(); + listenerVOList.forEach(listenerVO -> { + if (listenerVO.getLoadBalancerUuid() == null) { + return; + } + RemoveAccessControlListFromLoadBalancerMsg msg = new RemoveAccessControlListFromLoadBalancerMsg(); + msg.setLoadBalancerUuid(listenerVO.getLoadBalancerUuid()); + msg.setAclUuids(Collections.singletonList(acl.getUuid())); + msg.setServerGroupUuids(refVOS.stream().filter(ref -> ref.getServerGroupUuid() != null).map(LoadBalancerListenerACLRefVO::getServerGroupUuid).collect(Collectors.toList())); + msg.setListenerUuid(listenerVO.getUuid()); + bus.makeTargetServiceIdByResourceUuid(msg, LoadBalancerConstants.SERVICE_ID, listenerVO.getLoadBalancerUuid()); + msgs.add(msg); + }); - RemoveAccessControlListFromLoadBalancerMsg msg = new RemoveAccessControlListFromLoadBalancerMsg(); - msg.setLoadBalancerUuid(listenerVO.getLoadBalancerUuid()); - msg.setAclUuids(Collections.singletonList(acl.getUuid())); - msg.setServerGroupUuids(refVOS.stream().filter(ref -> ref.getServerGroupUuid() != null).map(LoadBalancerListenerACLRefVO::getServerGroupUuid).collect(Collectors.toList())); - msg.setListenerUuid(listenerVO.getUuid()); - bus.makeTargetServiceIdByResourceUuid(msg, LoadBalancerConstants.SERVICE_ID, listenerVO.getLoadBalancerUuid()); - - bus.send(msg, new CloudBusCallBack(msg) { + List errors = new ArrayList<>(); + new While<>(msgs).each((msg, coml) -> { + bus.send(msg, new CloudBusCallBack(coml) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.warn(String.format("Failed to delete ACL[uuids:%s] from listener[uuid:%s] of load balancer[uuid:%s], error: %s", + msg.getAclUuids(), msg.getListenerUuid(), msg.getLoadBalancerUuid(), reply.getError())); + errors.add(reply.getError()); + } + coml.done(); + } + }); + }).run(new WhileDoneCompletion(completion) { @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - completion.fail(reply.getError()); - return; + public void done(ErrorCodeList errorCodeList) { + if (!errors.isEmpty()) { + errorCodeList.getCauses().addAll(errors); + completion.fail(errorCodeList); + } else { + completion.success(); } - completion.success(); } }); - return; } diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/VirtualRouterLoadBalancerListenerCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/VirtualRouterLoadBalancerListenerCase.groovy index ed4d8288ca6..78f3382bd27 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/VirtualRouterLoadBalancerListenerCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/VirtualRouterLoadBalancerListenerCase.groovy @@ -147,6 +147,11 @@ class VirtualRouterLoadBalancerListenerCase extends SubCase{ name = "lb" useVip("pubL3") } + + lb { + name = "lb2" + useVip("pubL3") + } } vm { @@ -182,6 +187,7 @@ class VirtualRouterLoadBalancerListenerCase extends SubCase{ testOperateLBRedirectRuleCase() testValidateLBRedirectAclCase() testOperateLBRedirectAclCase() + testDeleteAclWithMultipleListenersCase() } } @@ -1305,6 +1311,97 @@ class VirtualRouterLoadBalancerListenerCase extends SubCase{ } + private void testDeleteAclWithMultipleListenersCase() { + def load = env.inventoryByName("lb2") as LoadBalancerInventory + def vm = env.inventoryByName("vm") as VmInstanceInventory + def l3 = env.inventoryByName("l3") as L3NetworkInventory + VirtualRouterLoadBalancerBackend.RefreshLbCmd cmd = null + int refreshCount = 0 + env.afterSimulator(VirtualRouterLoadBalancerBackend.REFRESH_LB_PATH) { rsp, HttpEntity e -> + cmd = JSONObjectUtil.toObject(e.body, VirtualRouterLoadBalancerBackend.RefreshLbCmd.class) + refreshCount++ + return rsp + } + + // Create multiple listeners associated with the same load balancer + List listeners = new ArrayList<>() + int listenerCount = 3 // Create 3 listeners to ensure multiple associations + for (int i = 0; i < listenerCount; i++) { + CreateLoadBalancerListenerAction listenerAction = new CreateLoadBalancerListenerAction() + listenerAction.loadBalancerUuid = load.uuid + listenerAction.name = "listener-${i}" + listenerAction.loadBalancerPort = 9000 + i + listenerAction.instancePort = 9000 + i + listenerAction.protocol = "udp" + listenerAction.sessionId = adminSession() + CreateLoadBalancerListenerAction.Result lblRes = listenerAction.call() + assert lblRes.error == null + listeners.add(lblRes.value.inventory) + + // Add VM NIC to each listener to ensure backend server group exists + addVmNicToLoadBalancer { + vmNicUuids = [vm.vmNics.find { nic -> nic.l3NetworkUuid == l3.uuid }.uuid] + listenerUuid = lblRes.value.inventory.uuid + } + } + + // Create an ACL + AccessControlListInventory acl = createAccessControlList { + name = "acl-multi-listeners" + } + addAccessControlListEntry { + aclUuid = acl.uuid + entries = "192.168.0.1,192.168.1.0/24" + } + + // Associate the ACL with all listeners + listeners.each { listener -> + addAccessControlListToLoadBalancer { + aclUuids = [acl.uuid] + aclType = LoadBalancerAclType.black.toString() + listenerUuid = listener.uuid + } + } + + // Verify that ACL is associated with all listeners + listeners.each { listener -> + def refs = Q.New(LoadBalancerListenerACLRefVO.class) + .eq(LoadBalancerListenerACLRefVO_.listenerUuid, listener.uuid) + .eq(LoadBalancerListenerACLRefVO_.aclUuid, acl.uuid) + .list() + assert refs.size() == 1 + } + + // Delete the ACL and verify all associations are removed + cmd = null + refreshCount = 0 + deleteAccessControlList { + uuid = acl.uuid + } + + // Retry to ensure the deletion operation is completed and messages are sent + retryInSecs { + assert cmd != null + assert cmd.lbs.size() == listenerCount + assert refreshCount == listenerCount + } + + // Verify that all LoadBalancerListenerACLRefVO records are removed + listeners.each { listener -> + def refs = Q.New(LoadBalancerListenerACLRefVO.class) + .eq(LoadBalancerListenerACLRefVO_.listenerUuid, listener.uuid) + .eq(LoadBalancerListenerACLRefVO_.aclUuid, acl.uuid) + .list() + assert refs.isEmpty() + } + + // Verify that AccessControlListEntryVO records are also removed + def entries = Q.New(AccessControlListEntryVO.class) + .eq(AccessControlListEntryVO_.aclUuid, acl.uuid) + .list() + assert entries.isEmpty() + } + @Override void clean() { def load = env.inventoryByName("lb") as LoadBalancerInventory From d73d2511d7a6deb191c945db7d5486c641cd4ed7 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Thu, 15 May 2025 05:28:45 +0000 Subject: [PATCH 404/737] Merge branch 'fix-72641' into '5.3.28-suiyuan' [loadBalancer]: fix ChangeLoadBalancerListener acl status rollback See merge request zstackio/zstack!7818 (cherry picked from commit a5d510122800ba70952f89922f5500f5ae442fec) fc17aa09 [loadBalancer]: fix ChangeLoadBalancerListener acl status rollback --- .../network/service/lb/LoadBalancerBase.java | 21 +++++++-- ...rtualRouterLoadBalancerListenerCase.groovy | 44 +++++++++++++++++++ 2 files changed, 61 insertions(+), 4 deletions(-) diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerBase.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerBase.java index d65c781702d..d8b43fa7464 100755 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerBase.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerBase.java @@ -2360,6 +2360,8 @@ public void run(SyncTaskChain chain) { } } + final String oldAclStatus = LoadBalancerSystemTags.BALANCER_ACL.getTokenByResourceUuid( + msg.getUuid(), LoadBalancerSystemTags.BALANCER_ACL_TOKEN); if (msg.getAclStatus() != null) { if (LoadBalancerSystemTags.BALANCER_ACL.hasTag(msg.getUuid())) { LoadBalancerSystemTags.BALANCER_ACL.update(msg.getUuid(), @@ -2387,15 +2389,26 @@ public void run(SyncTaskChain chain) { boolean refresh = isListenerNeedRefresh(lblVo, null); if (refresh) { - RefreshLoadBalancerMsg msg = new RefreshLoadBalancerMsg(); - msg.setUuid(lblVo.getLoadBalancerUuid()); - bus.makeLocalServiceId(msg, LoadBalancerConstants.SERVICE_ID); - bus.send(msg, new CloudBusCallBack(chain) { + RefreshLoadBalancerMsg rmsg = new RefreshLoadBalancerMsg(); + rmsg.setUuid(lblVo.getLoadBalancerUuid()); + bus.makeLocalServiceId(rmsg, LoadBalancerConstants.SERVICE_ID); + bus.send(rmsg, new CloudBusCallBack(chain) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { logger.warn(String.format( "update listener [uuid:%s] failed", lblVo.getUuid())); evt.setError(reply.getError()); + if (msg.getAclStatus() != null) { + logger.warn(String.format( "rollback acl status for listener [uuid:%s]", msg.getUuid())); + if (oldAclStatus != null) { + LoadBalancerSystemTags.BALANCER_ACL.update(msg.getUuid(), + LoadBalancerSystemTags.BALANCER_ACL.instantiateTag(map( + e(LoadBalancerSystemTags.BALANCER_ACL_TOKEN, oldAclStatus) + ))); + } else { + LoadBalancerSystemTags.BALANCER_ACL.delete(msg.getUuid()); + } + } } else { evt.setInventory(LoadBalancerListenerInventory.valueOf(lblVo)); } diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/VirtualRouterLoadBalancerListenerCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/VirtualRouterLoadBalancerListenerCase.groovy index 78f3382bd27..53103f5ac24 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/VirtualRouterLoadBalancerListenerCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/VirtualRouterLoadBalancerListenerCase.groovy @@ -188,6 +188,7 @@ class VirtualRouterLoadBalancerListenerCase extends SubCase{ testValidateLBRedirectAclCase() testOperateLBRedirectAclCase() testDeleteAclWithMultipleListenersCase() + testAclStatusRollbackCase() } } @@ -1402,6 +1403,49 @@ class VirtualRouterLoadBalancerListenerCase extends SubCase{ assert entries.isEmpty() } + void testAclStatusRollbackCase() { + def lb = env.inventoryByName("lb") as LoadBalancerInventory + def vm = env.inventoryByName("vm") as VmInstanceInventory + def vm2 = env.inventoryByName("vm2") as VmInstanceInventory + def l3 = env.inventoryByName("l3") as L3NetworkInventory + def _name = "testacl" + + CreateLoadBalancerListenerAction listenerAction = new CreateLoadBalancerListenerAction() + listenerAction.loadBalancerUuid = lb.uuid + listenerAction.name = _name + listenerAction.loadBalancerPort = 8080 + listenerAction.instancePort = 8080 + listenerAction.protocol = "http" + listenerAction.sessionId = adminSession() + CreateLoadBalancerListenerAction.Result createRes = listenerAction.call() + assert createRes.error == null + def listenerUuid_lb = createRes.value.inventory.uuid + + List nicUuids = [vm.vmNics.find{ nic -> nic.l3NetworkUuid == l3.uuid }.uuid, vm2.vmNics.find{ nic -> nic.l3NetworkUuid == l3.uuid }.uuid] + addVmNicToLoadBalancer { + vmNicUuids = nicUuids + listenerUuid = listenerUuid_lb + } + + def oldAclStatus = LoadBalancerSystemTags.BALANCER_ACL.getTokenByResourceUuid(listenerUuid_lb, LoadBalancerSystemTags.BALANCER_ACL_TOKEN) + assert oldAclStatus == "disable" + + env.simulator(VirtualRouterLoadBalancerBackend.REFRESH_LB_PATH) { rsp, HttpEntity e -> + VirtualRouterLoadBalancerBackend.RefreshLbRsp rspFail = new VirtualRouterLoadBalancerBackend.RefreshLbRsp() + rspFail.setError("Acl refresh failed") + rspFail.setSuccess(false) + return rspFail + } + + ChangeLoadBalancerListenerAction changeAction = new ChangeLoadBalancerListenerAction() + changeAction.uuid = listenerUuid_lb + changeAction.aclStatus = LoadBalancerAclStatus.enable.toString() + changeAction.sessionId = adminSession() + ChangeLoadBalancerListenerAction.Result changeRes = changeAction.call() + def rollbackedStatus = LoadBalancerSystemTags.BALANCER_ACL.getTokenByResourceUuid(listenerUuid_lb, LoadBalancerSystemTags.BALANCER_ACL_TOKEN) + assert rollbackedStatus == "disable" + } + @Override void clean() { def load = env.inventoryByName("lb") as LoadBalancerInventory From 0b6c06497b29fb3c247966c59aa6c4f3fce1f19c Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Tue, 15 Jul 2025 12:59:50 +0800 Subject: [PATCH 405/737] [storage]: external primary storage support shared volume Resolves: ZSTAC-76092 Change-Id: I74687a796b7466716c6e6775757876707761686c --- ...atePrimaryStorageForAttachingDiskFlow.java | 28 +-------- .../ExternalPrimaryStorage.xml | 1 + .../springConfigXml/PrimaryStorageManager.xml | 5 ++ .../addon/primary/StorageCapabilities.java | 10 ++++ .../primary/AllocatePrimaryStorageMsg.java | 10 ++++ .../primary/PrimaryStorageAllocationSpec.java | 10 ++++ .../primary/PrimaryStorageFeature.java | 9 +++ .../storage/zbs/ZbsStorageController.java | 1 + .../ExternalPrimaryStorageFactory.java | 20 ++++++- ...StorageFeatureAllocatorExtensionPoint.java | 15 +++++ .../PrimaryStorageFeatureAllocatorFlow.java | 58 +++++++++++++++++++ .../PrimaryStorageMainAllocatorFlow.java | 1 + .../primary/PrimaryStorageManagerImpl.java | 15 ++++- .../storage/volume/VolumeManagerImpl.java | 3 +- 14 files changed, 157 insertions(+), 29 deletions(-) create mode 100644 header/src/main/java/org/zstack/header/storage/primary/PrimaryStorageFeature.java create mode 100644 storage/src/main/java/org/zstack/storage/primary/PrimaryStorageFeatureAllocatorExtensionPoint.java create mode 100644 storage/src/main/java/org/zstack/storage/primary/PrimaryStorageFeatureAllocatorFlow.java diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAllocatePrimaryStorageForAttachingDiskFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAllocatePrimaryStorageForAttachingDiskFlow.java index aa9c1e34b50..bc2f59d6cdc 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmAllocatePrimaryStorageForAttachingDiskFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAllocatePrimaryStorageForAttachingDiskFlow.java @@ -1,13 +1,11 @@ package org.zstack.compute.vm; -import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.db.DatabaseFacade; -import org.zstack.core.db.SQL; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.header.core.workflow.Flow; import org.zstack.header.core.workflow.FlowRollback; @@ -19,13 +17,10 @@ import org.zstack.header.storage.primary.*; import org.zstack.header.vm.VmInstanceConstant; import org.zstack.header.vm.VmInstanceSpec; -import org.zstack.header.vm.VmInstanceSpec.VolumeSpec; import org.zstack.header.volume.VolumeInventory; -import java.util.Arrays; -import java.util.List; +import java.util.Collections; import java.util.Map; -import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; @@ -63,25 +58,8 @@ public void run(final FlowTrigger chain, final Map data) { if (volume.isShareable()) { String clusterUuid = spec.getVmInventory().getClusterUuid(); - List vos = SQL.New("select pri" + - " from PrimaryStorageVO pri, PrimaryStorageClusterRefVO ref" + - " where ref.clusterUuid = :clusterUuid" + - " and ref.primaryStorageUuid = pri.uuid" + - " and pri.status = :status" + - " and pri.state = :priState") - .param("clusterUuid", clusterUuid) - .param("status", PrimaryStorageStatus.Connected) - .param("priState", PrimaryStorageState.Enabled) - .list(); - - if (CollectionUtils.isNotEmpty(vos)) { - amsg.setPossiblePrimaryStorageTypes(vos.stream() - .filter(v -> PrimaryStorageType.valueOf(v.getType()).isSupportSharedVolume()) - .map(PrimaryStorageVO::getType) - .collect(Collectors.toList())); - } - - amsg.setRequiredClusterUuids(Arrays.asList(clusterUuid)); + amsg.setRequiredClusterUuids(Collections.singletonList(clusterUuid)); + amsg.setRequiredFeatures(Collections.singleton(PrimaryStorageFeature.SHARED_VOLUME)); } else { amsg.setRequiredHostUuid(hinv.getUuid()); } diff --git a/conf/springConfigXml/ExternalPrimaryStorage.xml b/conf/springConfigXml/ExternalPrimaryStorage.xml index 744a36fc522..b85c19a9b72 100644 --- a/conf/springConfigXml/ExternalPrimaryStorage.xml +++ b/conf/springConfigXml/ExternalPrimaryStorage.xml @@ -27,6 +27,7 @@ + diff --git a/conf/springConfigXml/PrimaryStorageManager.xml b/conf/springConfigXml/PrimaryStorageManager.xml index 94d73fc46b3..b458d4dd29a 100755 --- a/conf/springConfigXml/PrimaryStorageManager.xml +++ b/conf/springConfigXml/PrimaryStorageManager.xml @@ -24,6 +24,7 @@ + @@ -39,6 +40,7 @@ org.zstack.storage.primary.PrimaryStorageMainAllocatorFlow org.zstack.storage.primary.PrimaryStorageAvoidAllocatorFlow + org.zstack.storage.primary.PrimaryStorageFeatureAllocatorFlow org.zstack.storage.primary.PrimaryStorageTagAllocatorFlow org.zstack.storage.primary.PrimaryStorageReservedCapacityAllocatorFlow @@ -63,6 +65,7 @@ org.zstack.storage.primary.PrimaryStorageMainAllocatorFlow org.zstack.storage.primary.PrimaryStorageAvoidAllocatorFlow + org.zstack.storage.primary.PrimaryStorageFeatureAllocatorFlow org.zstack.storage.primary.PrimaryStorageTagAllocatorFlow org.zstack.storage.primary.PrimaryStorageReservedCapacityAllocatorFlow @@ -87,6 +90,7 @@ org.zstack.storage.primary.PrimaryStorageMainAllocatorFlow org.zstack.storage.primary.PrimaryStorageAvoidAllocatorFlow + org.zstack.storage.primary.PrimaryStorageFeatureAllocatorFlow org.zstack.storage.primary.PrimaryStorageTagAllocatorFlow org.zstack.storage.primary.PrimaryStorageReservedCapacityAllocatorFlow @@ -111,6 +115,7 @@ org.zstack.storage.primary.PrimaryStorageMainAllocatorFlow org.zstack.storage.primary.PrimaryStorageAvoidAllocatorFlow + org.zstack.storage.primary.PrimaryStorageFeatureAllocatorFlow org.zstack.storage.primary.PrimaryStorageTagAllocatorFlow org.zstack.storage.primary.PrimaryStorageReservedCapacityAllocatorFlow diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/StorageCapabilities.java b/header/src/main/java/org/zstack/header/storage/addon/primary/StorageCapabilities.java index d38ea8ce9db..b2a6b7fe64a 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/primary/StorageCapabilities.java +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/StorageCapabilities.java @@ -5,6 +5,7 @@ import java.util.List; +// TODO Merge with PrimaryStorageFeature public class StorageCapabilities { private VolumeSnapshotCapability snapshotCapability; @@ -13,11 +14,20 @@ public class StorageCapabilities { private boolean supportStorageQos; private boolean supportLiveExpandVolume; + private boolean supportShareableVolume; private boolean supportExportVolumeSnapshot; public List supportedImageFormats; private VolumeProtocol defaultIsoActiveProtocol; private VolumeProtocol defaultImageExportProtocol; + public boolean isSupportShareableVolume() { + return supportShareableVolume; + } + + public void setSupportShareableVolume(boolean supportShareableVolume) { + this.supportShareableVolume = supportShareableVolume; + } + public VolumeProtocol getDefaultIsoActiveProtocol() { return defaultIsoActiveProtocol; } diff --git a/header/src/main/java/org/zstack/header/storage/primary/AllocatePrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/primary/AllocatePrimaryStorageMsg.java index 2a08a8fac90..5126ffa2883 100755 --- a/header/src/main/java/org/zstack/header/storage/primary/AllocatePrimaryStorageMsg.java +++ b/header/src/main/java/org/zstack/header/storage/primary/AllocatePrimaryStorageMsg.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Set; /** * Allocate PrimaryStorage @@ -21,6 +22,7 @@ public class AllocatePrimaryStorageMsg extends NeedReplyMessage { private String backupStorageUuid; private List possiblePrimaryStorageTypes; private List excludePrimaryStorageTypes; + private Set requiredFeatures; private Long totalSize = null; private long size; @@ -43,6 +45,14 @@ public class AllocatePrimaryStorageMsg extends NeedReplyMessage { private boolean noOverProvisioning; private String purpose; + public Set getRequiredFeatures() { + return requiredFeatures; + } + + public void setRequiredFeatures(Set requiredFeatures) { + this.requiredFeatures = requiredFeatures; + } + public List getExcludePrimaryStorageTypes() { return excludePrimaryStorageTypes; } diff --git a/header/src/main/java/org/zstack/header/storage/primary/PrimaryStorageAllocationSpec.java b/header/src/main/java/org/zstack/header/storage/primary/PrimaryStorageAllocationSpec.java index ffb9854b2cf..13bc292157b 100755 --- a/header/src/main/java/org/zstack/header/storage/primary/PrimaryStorageAllocationSpec.java +++ b/header/src/main/java/org/zstack/header/storage/primary/PrimaryStorageAllocationSpec.java @@ -2,6 +2,7 @@ import java.util.Collections; import java.util.List; +import java.util.Set; /** */ @@ -23,6 +24,15 @@ public class PrimaryStorageAllocationSpec { private List possiblePrimaryStorageTypes; private List excludePrimaryStorageTypes; private String backupStorageUuid; + private Set requiredFeatures; + + public Set getRequiredFeatures() { + return requiredFeatures; + } + + public void setRequiredFeatures(Set requiredFeatures) { + this.requiredFeatures = requiredFeatures; + } public List getCandidatePrimaryStorageUuids() { return candidatePrimaryStorageUuids == null ? Collections.emptyList() : candidatePrimaryStorageUuids; diff --git a/header/src/main/java/org/zstack/header/storage/primary/PrimaryStorageFeature.java b/header/src/main/java/org/zstack/header/storage/primary/PrimaryStorageFeature.java new file mode 100644 index 00000000000..1dbee35303c --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/primary/PrimaryStorageFeature.java @@ -0,0 +1,9 @@ +package org.zstack.header.storage.primary; + +/** + * @ Author : yh.w + * @ Date : Created in 10:42 2025/7/15 + */ +public enum PrimaryStorageFeature { + SHARED_VOLUME, +} diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 3210e65c72e..ee7492b42ee 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -100,6 +100,7 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar scap.setSupportCreateOnHypervisor(false); scap.setSupportLazyDelete(false); capabilities.setSnapshotCapability(scap); + capabilities.setSupportShareableVolume(true); capabilities.setSupportCloneFromVolume(false); capabilities.setSupportStorageQos(false); capabilities.setSupportLiveExpandVolume(false); diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java index b12d17ebe91..65003a0e0f0 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java @@ -38,6 +38,7 @@ import org.zstack.header.volume.VolumeInventory; import org.zstack.header.volume.VolumeVO; import org.zstack.storage.addon.backup.ExternalBackupStorageFactory; +import org.zstack.storage.primary.PrimaryStorageFeatureAllocatorExtensionPoint; import org.zstack.storage.snapshot.MarkRootVolumeAsSnapshotExtension; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; @@ -53,7 +54,7 @@ public class ExternalPrimaryStorageFactory implements PrimaryStorageFactory, Com PreVmInstantiateResourceExtensionPoint, VmReleaseResourceExtensionPoint, VmAttachVolumeExtensionPoint, VmDetachVolumeExtensionPoint, BeforeTakeLiveSnapshotsOnVolumes, CreateTemplateFromVolumeSnapshotExtensionPoint, MarkRootVolumeAsSnapshotExtension, VmInstanceMigrateExtensionPoint, - ManagementNodeChangeListener { + ManagementNodeChangeListener, PrimaryStorageFeatureAllocatorExtensionPoint { private static final CLogger logger = Utils.getLogger(ExternalBackupStorageFactory.class); public static PrimaryStorageType type = new PrimaryStorageType(PrimaryStorageConstant.EXTERNAL_PRIMARY_STORAGE_TYPE); @@ -79,6 +80,7 @@ public class ExternalPrimaryStorageFactory implements PrimaryStorageFactory, Com static { type.setSupportHeartbeatFile(true); type.setSupportStorageTrash(true); + type.setSupportSharedVolume(true); } @Override @@ -949,4 +951,20 @@ public void iAmDead(ManagementNodeInventory inv) { public void iJoin(ManagementNodeInventory inv) { } + + @Override + public List allocatePrimaryStorage(Set requiredFeatures, List candidates) { + if (requiredFeatures.contains(PrimaryStorageFeature.SHARED_VOLUME)) { + List excludeCandidates = candidates.stream() + .filter(v -> PrimaryStorageConstant.EXTERNAL_PRIMARY_STORAGE_TYPE.equals(v.getType())) + .filter(v -> !(controllers.containsKey(v.getUuid()) && controllers.get(v.getUuid()).reportCapabilities().isSupportShareableVolume())) + .collect(Collectors.toList()); + + logger.info(String.format("exclude external primary storage candidates: %s for shared volume feature", excludeCandidates)); + + candidates.removeAll(excludeCandidates); + } + + return candidates; + } } diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageFeatureAllocatorExtensionPoint.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageFeatureAllocatorExtensionPoint.java new file mode 100644 index 00000000000..da53a4da48b --- /dev/null +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageFeatureAllocatorExtensionPoint.java @@ -0,0 +1,15 @@ +package org.zstack.storage.primary; + +import org.zstack.header.storage.primary.PrimaryStorageFeature; +import org.zstack.header.storage.primary.PrimaryStorageVO; + +import java.util.List; +import java.util.Set; + +/** + * @ Author : yh.w + * @ Date : Created in 10:49 2025/7/15 + */ +public interface PrimaryStorageFeatureAllocatorExtensionPoint { + List allocatePrimaryStorage(Set requiredFeatures, List candidates); +} diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageFeatureAllocatorFlow.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageFeatureAllocatorFlow.java new file mode 100644 index 00000000000..ff6cc9376ff --- /dev/null +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageFeatureAllocatorFlow.java @@ -0,0 +1,58 @@ +package org.zstack.storage.primary; + +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Configurable; +import org.zstack.core.componentloader.PluginRegistry; +import org.zstack.header.core.workflow.FlowTrigger; +import org.zstack.header.core.workflow.NoRollbackFlow; +import org.zstack.header.errorcode.OperationFailureException; +import org.zstack.header.storage.primary.PrimaryStorageAllocationSpec; +import org.zstack.header.storage.primary.PrimaryStorageConstant; +import org.zstack.header.storage.primary.PrimaryStorageVO; + +import java.util.List; +import java.util.Map; + +import static org.zstack.core.Platform.operr; + +/** + * @ Author : yh.w + * @ Date : Created in 18:41 2025/7/14 + */ +@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) +public class PrimaryStorageFeatureAllocatorFlow extends NoRollbackFlow { + @Autowired + private PluginRegistry pluginRgty; + + protected final List featureExtensions = pluginRgty.getExtensionList(PrimaryStorageFeatureAllocatorExtensionPoint.class);; + + @Override + public void run(FlowTrigger trigger, Map data) { + PrimaryStorageAllocationSpec spec = (PrimaryStorageAllocationSpec) data.get(PrimaryStorageConstant.AllocatorParams.SPEC); + List candidates = (List) data.get(PrimaryStorageConstant.AllocatorParams.CANDIDATES); + List ret; + for (PrimaryStorageFeatureAllocatorExtensionPoint extp : featureExtensions) { + ret = extp.allocatePrimaryStorage(spec.getRequiredFeatures(), candidates); + if (ret == null) { + continue; + } + + if (ret.isEmpty()) { + throw new OperationFailureException(operr("PrimaryStorageFeatureAllocatorFlow[%s] returns zero primary storage candidate", extp.getClass().getName())); + } + + candidates = ret; + } + + data.put(PrimaryStorageConstant.AllocatorParams.CANDIDATES, candidates); + trigger.next(); + } + + @Override + public boolean skip(Map data) { + PrimaryStorageAllocationSpec spec = (PrimaryStorageAllocationSpec) data.get(PrimaryStorageConstant.AllocatorParams.SPEC); + return CollectionUtils.isEmpty(spec.getRequiredFeatures()); + } +} diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageMainAllocatorFlow.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageMainAllocatorFlow.java index 074a12b3193..9d80582f268 100755 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageMainAllocatorFlow.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageMainAllocatorFlow.java @@ -15,6 +15,7 @@ import org.zstack.header.storage.backup.BackupStorageVO; import org.zstack.header.storage.primary.*; import org.zstack.header.storage.primary.PrimaryStorageConstant.AllocatorParams; +import org.zstack.storage.addon.primary.ExternalPrimaryStorage; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.function.Function; diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageManagerImpl.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageManagerImpl.java index 56ef7ef3a3e..965747050ef 100755 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageManagerImpl.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageManagerImpl.java @@ -78,7 +78,7 @@ public class PrimaryStorageManagerImpl extends AbstractService implements PrimaryStorageManager, ManagementNodeChangeListener, ManagementNodeReadyExtensionPoint, VmInstanceStartExtensionPoint, VmInstanceCreateExtensionPoint, InstanceOfferingUserConfigValidator, DiskOfferingUserConfigValidator, - PrimaryStorageSortExtensionPoint { + PrimaryStorageSortExtensionPoint, PrimaryStorageFeatureAllocatorExtensionPoint { private static final CLogger logger = Utils.getLogger(PrimaryStorageManager.class); @Autowired @@ -827,6 +827,7 @@ private String getAllocateStrategyFromMsg(AllocatePrimaryStorageMsg msg) { private PrimaryStorageAllocationSpec buildAllocateSpecFromMsg(AllocatePrimaryStorageMsg msg) { PrimaryStorageAllocationSpec spec = new PrimaryStorageAllocationSpec(); spec.setPossiblePrimaryStorageTypes(msg.getPossiblePrimaryStorageTypes()); + spec.setRequiredFeatures(msg.getRequiredFeatures()); spec.setExcludePrimaryStorageTypes(msg.getExcludePrimaryStorageTypes()); spec.setImageUuid(msg.getImageUuid()); spec.setDiskOfferingUuid(msg.getDiskOfferingUuid()); @@ -1023,6 +1024,18 @@ public void sort(List primaryStorageVOS, VmInstanceSpec.ImageS strategy.sort(allocationSpec, primaryStorageVOS); } + @Override + public List allocatePrimaryStorage(Set requiredFeatures, List candidates) { + if (requiredFeatures.contains(PrimaryStorageFeature.SHARED_VOLUME)) { + candidates = candidates.stream() + .filter(v -> PrimaryStorageType.getSupportFeaturesTypes(PrimaryStorageType::isSupportSharedVolume) + .contains(v.getType())) + .collect(Collectors.toList()); + } + + return candidates; + } + class AutoDeleteTrashTask { Future runnable; PeriodicTask task; diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java b/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java index bd2e2471e80..76e8bc229a8 100755 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java @@ -66,7 +66,6 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; import static org.zstack.header.host.HostStatus.Connected; @@ -351,7 +350,7 @@ public void run(final FlowTrigger trigger, Map data) { } if (vvo.isShareable()) { - amsg.setPossiblePrimaryStorageTypes(PrimaryStorageType.getSupportFeaturesTypes(PrimaryStorageType::isSupportSharedVolume)); + amsg.setRequiredFeatures(Collections.singleton(PrimaryStorageFeature.SHARED_VOLUME)); } bus.makeLocalServiceId(amsg, PrimaryStorageConstant.SERVICE_ID); From 395b9154346130be19f1706253074a9fcdf2ca0e Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Thu, 3 Jul 2025 03:18:41 +0000 Subject: [PATCH 406/737] Merge branch 'shixin-ZSTAC-76157' into '5.3.40' [applianceVm]: set applianceVm bootstrap even grade upgrade is on See merge request zstackio/zstack!8024 (cherry picked from commit 0c0004588c7f8dd0e6359541dc8931c255c6a0a2) e2c516a0 [applianceVm]: set applianceVm bootstrap even grade upgrade is on --- .../src/main/java/org/zstack/appliancevm/ApplianceVmBase.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmBase.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmBase.java index e61227624cd..6f3f6e09242 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmBase.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmBase.java @@ -789,10 +789,6 @@ public void run(FlowTrigger trigger, Map data) { } private FlowChain addBootstrapFlows(FlowChain chain, HypervisorType hvType) { - if (upgradeChecker.skipInnerDeployOrInitOnCurrentAgent(self.getUuid())) { - return chain; - } - for (Flow flow : createBootstrapFlows(hvType)) { chain.then(flow); } From 721623d6a806abd9b6c406b8e976c04d09708cc8 Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Fri, 25 Jul 2025 14:24:15 +0800 Subject: [PATCH 407/737] [virtualRouterProvider]: fix VirtualRouter null public nic handling Resolves: ZSTAC-76503 Change-Id: I6868776c7040dbf0f7fb4b45bed165020d239778 --- .../service/virtualrouter/VirtualRouter.java | 22 ++++++++++++++++++- .../eip/VirtualRouterSyncEipOnStartFlow.java | 12 +++++----- .../nat/VirtualRouterSnatBackend.java | 10 +++++++-- .../nat/VirtualRouterSyncSNATOnStartFlow.java | 5 ++++- ...terSyncPortForwardingRulesOnStartFlow.java | 11 ++++++---- .../VirtualRouterSyncVipForNewCreateFlow.java | 2 +- 6 files changed, 48 insertions(+), 14 deletions(-) diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java index 3659fd27133..85287633e0c 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java @@ -1116,7 +1116,27 @@ protected void afterAttachNic(VmNicInventory nicInventory, boolean applyToBacken usedIpVO.setMetaData(GUEST_NIC_MASK.toString()); dbf.updateAndRefresh(usedIpVO); } else { - vo.setMetaData(ADDITIONAL_PUBLIC_NIC_MASK.toString()); + VirtualRouterVmVO vrVO = Q.New(VirtualRouterVmVO.class) + .eq(VirtualRouterVmVO_.uuid, self.getUuid()) + .find(); + boolean isOfferingPubNic = vrVO.getPublicNetworkUuid() != null && + vrVO.getPublicNetworkUuid().equals(l3NetworkVO.getUuid()); + if (isOfferingPubNic) { + VirtualRouterOfferingVO offering = Q.New(VirtualRouterOfferingVO.class) + .eq(VirtualRouterOfferingVO_.uuid, vrVO.getInstanceOfferingUuid()) + .find(); + if (offering == null) { + vo.setMetaData(VirtualRouterNicMetaData.PUBLIC_NIC_MASK.toString()); + } else { + boolean hasSeparatePublic = offering.getPublicNetworkUuid() != null && + !offering.getManagementNetworkUuid().equals(offering.getPublicNetworkUuid()); + vo.setMetaData(hasSeparatePublic + ? VirtualRouterNicMetaData.PUBLIC_NIC_MASK.toString() + : VirtualRouterNicMetaData.PUBLIC_AND_MANAGEMENT_NIC_MASK.toString()); + } + } else { + vo.setMetaData(ADDITIONAL_PUBLIC_NIC_MASK.toString()); + } } vo = dbf.updateAndRefresh(vo); logger.debug(String.format("updated metadata of vmnic[uuid: %s]", vo.getUuid())); diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterSyncEipOnStartFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterSyncEipOnStartFlow.java index 64e4558f95e..6fdb051df5b 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterSyncEipOnStartFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterSyncEipOnStartFlow.java @@ -116,13 +116,15 @@ private List findEipOnThisRouter(final VirtualRouterVmInventory vr, Map guestNics = vr.getGuestNics(); List pubL3Uuids = new ArrayList<>(); - pubL3Uuids.add(vr.getPublicNic().getL3NetworkUuid()); + VmNicInventory publicNic = vr.getPublicNic(); pubL3Uuids.addAll(vr.getAdditionalPublicNics().stream().map(VmNicInventory::getL3NetworkUuid).collect(Collectors.toList())); - if (!vr.getPublicNic().getL3NetworkUuid().equals(vr.getManagementNetworkUuid())) { - /* in old code, eip can be configured on management nic */ - pubL3Uuids.add(vr.getManagementNetworkUuid()); + if (publicNic != null) { + pubL3Uuids.add(publicNic.getL3NetworkUuid()); + if (!publicNic.getL3NetworkUuid().equals(vr.getManagementNetworkUuid())) { + /* in old code, eip can be configured on management nic */ + pubL3Uuids.add(vr.getManagementNetworkUuid()); + } } - if (guestNics == null || guestNics.isEmpty()) { return new ArrayList<>(); } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSnatBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSnatBackend.java index 5f45a975f8c..24d851efb0a 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSnatBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSnatBackend.java @@ -153,7 +153,10 @@ private void releasePrivateNicSnat(String vrUuid, VmNicInventory privateNic, Com final List snatInfo = new ArrayList(); List pubNics = new ArrayList<>(); - pubNics.add(vr.getPublicNic()); + VmNicInventory publicNic = vr.getPublicNic(); + if (publicNic != null) { + pubNics.add(publicNic); + } pubNics.addAll(vr.getAdditionalPublicNics()); for (VmNicInventory pubNic : pubNics) { @@ -360,7 +363,10 @@ public void afterAttachNic(VmNicInventory nic, Completion completion) { final List snatInfo = new ArrayList(); List pubNics = new ArrayList<>(); - pubNics.add(vr.getPublicNic()); + VmNicInventory publicNic = vr.getPublicNic(); + if (publicNic != null) { + pubNics.add(publicNic); + } pubNics.addAll(vr.getAdditionalPublicNics()); for (VmNicInventory pubnic : pubNics) { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSyncSNATOnStartFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSyncSNATOnStartFlow.java index a1d76c25411..037c12098f3 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSyncSNATOnStartFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSyncSNATOnStartFlow.java @@ -90,7 +90,10 @@ public void run(final FlowTrigger chain, Map data) { final List snatInfo = new ArrayList(); List pubNics = new ArrayList<>(); - pubNics.add(vr.getPublicNic()); + VmNicInventory publicNic = vr.getPublicNic(); + if (publicNic != null) { + pubNics.add(publicNic); + } pubNics.addAll(vr.getAdditionalPublicNics()); for (VmNicInventory pubNic : pubNics) { if (pubNic.isIpv6OnlyNic()) { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterSyncPortForwardingRulesOnStartFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterSyncPortForwardingRulesOnStartFlow.java index 535fab9814b..c0bac709904 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterSyncPortForwardingRulesOnStartFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterSyncPortForwardingRulesOnStartFlow.java @@ -65,11 +65,14 @@ private List findRulesForThisRouter(VirtualRouterVmInvento } List pubL3Uuids = new ArrayList<>(); - pubL3Uuids.add(vr.getPublicNic().getL3NetworkUuid()); + VmNicInventory publicNic = vr.getPublicNic(); pubL3Uuids.addAll(vr.getAdditionalPublicNics().stream().map(VmNicInventory::getL3NetworkUuid).collect(Collectors.toList())); - if (!vr.getPublicNic().getL3NetworkUuid().equals(vr.getManagementNetworkUuid())) { - /* in old code, pf can be configured on management nic */ - pubL3Uuids.add(vr.getManagementNetworkUuid()); + if (publicNic != null) { + pubL3Uuids.add(publicNic.getL3NetworkUuid()); + if (!publicNic.getL3NetworkUuid().equals(vr.getManagementNetworkUuid())) { + /* in old code, pf can be configured on management nic */ + pubL3Uuids.add(vr.getManagementNetworkUuid()); + } } String sql = "select rule from PortForwardingRuleVO rule, VipVO vip, VmNicVO nic where " + diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterSyncVipForNewCreateFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterSyncVipForNewCreateFlow.java index 1eb3772a672..713f33ff4d1 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterSyncVipForNewCreateFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterSyncVipForNewCreateFlow.java @@ -46,7 +46,7 @@ public void run(final FlowTrigger chain, Map data) { final VmNicInventory publicNic = vr.getPublicNic(); List l3Uuids = guestNics.stream().map(n -> n.getL3NetworkUuid()).collect(Collectors.toList()); List vipUuids = new ArrayList(); - if (vrMgr.isL3NetworksNeedingNetworkServiceByVirtualRouter(l3Uuids, EipConstant.EIP_NETWORK_SERVICE_TYPE) && + if (publicNic != null && vrMgr.isL3NetworksNeedingNetworkServiceByVirtualRouter(l3Uuids, EipConstant.EIP_NETWORK_SERVICE_TYPE) && !(VirtualRouterSystemTags.DEDICATED_ROLE_VR.hasTag(vr.getUuid()) && !VirtualRouterSystemTags.VR_EIP_ROLE.hasTag(vr.getUuid()))) { vipUuids.addAll(new Callable>() { @Override From 2a1907075c6ae0633b0634d4488c7c294810d199 Mon Sep 17 00:00:00 2001 From: "haoyu.ding" Date: Tue, 15 Jul 2025 06:19:14 +0000 Subject: [PATCH 408/737] [securityGroup]: add SecurityGroupGlobalProperty to control Ip/Port limit GlobalPropertyImpact Resolves: ZSTAC-76328 Change-Id: I6e6f6b6f616a6f747262626f7770747471676b64 --- conf/db/upgrade/V5.4.0__schema.sql | 5 ++++- .../securitygroup/SecurityGroupApiInterceptor.java | 10 +++++----- .../securitygroup/SecurityGroupGlobalProperty.java | 4 ++++ .../AddSecurityGroupRuleOptimizedCase.groovy | 3 ++- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/conf/db/upgrade/V5.4.0__schema.sql b/conf/db/upgrade/V5.4.0__schema.sql index 1ffadcf6d3b..808f516f301 100644 --- a/conf/db/upgrade/V5.4.0__schema.sql +++ b/conf/db/upgrade/V5.4.0__schema.sql @@ -5,4 +5,7 @@ CREATE TABLE `zstack`.`L3NetworkSequenceNumberVO` ( ALTER TABLE `zstack`.`L3NetworkEO` ADD COLUMN `internalId` INT(32) unsigned DEFAULT 0; DROP VIEW IF EXISTS `zstack`.`L3NetworkVO`; -CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, internalId, description, state, type, zoneUuid, l2NetworkUuid, `system`, dnsDomain, createDate, lastOpDate, category, ipVersion, enableIPAM, isolated FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; \ No newline at end of file +CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, internalId, description, state, type, zoneUuid, l2NetworkUuid, `system`, dnsDomain, createDate, lastOpDate, category, ipVersion, enableIPAM, isolated FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; + +ALTER TABLE SecurityGroupRuleVO MODIFY COLUMN `dstPortRange` varchar(1024) DEFAULT NULL; +ALTER TABLE SecurityGroupRuleVO MODIFY COLUMN `srcPortRange` varchar(1024) DEFAULT NULL; \ No newline at end of file diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java index f3cc8005afc..a6c9703a4a9 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java @@ -691,9 +691,9 @@ private void validatePorts(String ports) { } String portArray[]; if (ports.contains(SecurityGroupConstant.IP_SPLIT)) { - String[] tmpPorts = ports.split(String.format("%s|%s", SecurityGroupConstant.IP_SPLIT, SecurityGroupConstant.RANGE_SPLIT)); - if (tmpPorts.length > SecurityGroupConstant.PORT_GROUP_NUMBER_LIMIT) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid ports[%s], port range[%s] number[%d] is out of max limit[%d]", ports, Arrays.toString(tmpPorts), tmpPorts.length, SecurityGroupConstant.PORT_GROUP_NUMBER_LIMIT)); + String[] tmpPorts = ports.split(SecurityGroupConstant.IP_SPLIT); + if (tmpPorts.length > SecurityGroupGlobalProperty.PORT_GROUP_NUMBER_LIMIT) { + throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid ports[%s], port range[%s] number[%d] is out of max limit[%d]", ports, Arrays.toString(tmpPorts), tmpPorts.length, SecurityGroupGlobalProperty.PORT_GROUP_NUMBER_LIMIT)); } portArray = ports.split(SecurityGroupConstant.IP_SPLIT); @@ -746,8 +746,8 @@ private void validateIps(String ips, Integer ipVersion) { String ipArray[]; if (ips.contains(SecurityGroupConstant.IP_SPLIT)) { ipArray = ips.split(SecurityGroupConstant.IP_SPLIT); - if (ipArray.length > SecurityGroupConstant.IP_GROUP_NUMBER_LIMIT) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ips[%s], ip number[%d] is out of max limit[%d]", ips, ipArray.length, SecurityGroupConstant.IP_GROUP_NUMBER_LIMIT)); + if (ipArray.length > SecurityGroupGlobalProperty.IP_GROUP_NUMBER_LIMIT) { + throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ips[%s], ip number[%d] is out of max limit[%d]", ips, ipArray.length, SecurityGroupGlobalProperty.IP_GROUP_NUMBER_LIMIT)); } Stream stream = Stream.of(ipArray).distinct(); if (ipArray.length != stream.count()) { diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalProperty.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalProperty.java index da80dbdc6ce..e7e6921fa20 100644 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalProperty.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalProperty.java @@ -7,4 +7,8 @@ public class SecurityGroupGlobalProperty { @GlobalProperty(name="upgradeSecurityGroup", defaultValue = "false") public static boolean UPGRADE_SECURITY_GROUP; + @GlobalProperty(name="SecurityGroupRuleIpLimit", defaultValue = "10") + public static int IP_GROUP_NUMBER_LIMIT; + @GlobalProperty(name="SecurityGroupRulePortLimit", defaultValue = "50") + public static int PORT_GROUP_NUMBER_LIMIT; } diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/AddSecurityGroupRuleOptimizedCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/AddSecurityGroupRuleOptimizedCase.groovy index db262f5b196..e6f463aaa18 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/AddSecurityGroupRuleOptimizedCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/AddSecurityGroupRuleOptimizedCase.groovy @@ -172,7 +172,8 @@ class AddSecurityGroupRuleOptimizedCase extends SubCase { errorRule.protocol = "TCP" errorRule.startPort = null errorRule.endPort = null - errorRule.dstPortRange = "1,2,3,4,5,6-7,8-10,11-12" + // The current security group allows a maximum of 50 ports (ver:5.4.0) + errorRule.dstPortRange = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51" expect(AssertionError) { addSecurityGroupRule { securityGroupUuid = sg1.uuid From e5e81f5aeec7142019279c3cb10e9335e68059cd Mon Sep 17 00:00:00 2001 From: J M Date: Tue, 1 Jul 2025 18:22:21 +0800 Subject: [PATCH 409/737] [storage]: fix migrate trash Resolves: ZSTAC-61914 Change-Id: I706a7479756c766b6978626f6167736b67627562 --- conf/springConfigXml/ceph.xml | 1 + .../zstack/core/trash/StorageRecycleImpl.java | 21 +++++--- .../primary/CheckInstallPathInTrashReply.java | 11 ++++ .../VolumeInnerSnapshotPathParser.java | 8 +++ ...VolumeSnapshotPreDeleteExtensionPoint.java | 8 --- .../primary/CephPrimaryStorageFactory.java | 12 ++++- .../ceph/primary/CephRequiredUrlParser.java | 4 ++ .../nfs/NfsPrimaryStorageKVMBackend.java | 1 + .../storage/primary/PrimaryStorageBase.java | 1 + .../VolumeSnapshotReferenceUtils.java | 9 +--- .../ceph/CephVolumeSnapshotCase.groovy | 2 +- .../testlib/CephPrimaryStorageSpec.groovy | 4 +- .../testlib/NfsPrimaryStorageSpec.groovy | 51 +++++++++---------- .../java/org/zstack/testlib/vfs/VFS.groovy | 5 +- 14 files changed, 81 insertions(+), 57 deletions(-) create mode 100644 header/src/main/java/org/zstack/header/storage/snapshot/VolumeInnerSnapshotPathParser.java delete mode 100755 header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotPreDeleteExtensionPoint.java diff --git a/conf/springConfigXml/ceph.xml b/conf/springConfigXml/ceph.xml index c4489de344c..3e948ecf134 100755 --- a/conf/springConfigXml/ceph.xml +++ b/conf/springConfigXml/ceph.xml @@ -50,6 +50,7 @@ + diff --git a/core/src/main/java/org/zstack/core/trash/StorageRecycleImpl.java b/core/src/main/java/org/zstack/core/trash/StorageRecycleImpl.java index 1e13efa02ae..0262fd47d0b 100644 --- a/core/src/main/java/org/zstack/core/trash/StorageRecycleImpl.java +++ b/core/src/main/java/org/zstack/core/trash/StorageRecycleImpl.java @@ -43,6 +43,7 @@ import java.util.Iterator; import java.util.List; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import static org.zstack.core.Platform.inerr; @@ -87,6 +88,8 @@ private InstallPathRecycleInventory createRecycleFromVolume(TrashType type, bool } vo = dbf.persistAndRefresh(vo); + logger.debug(String.format("create trash for volume[uuid:%s, installPath:%s] on primary storage[uuid:%s], trashId: %s, type: %s", + vol.getUuid(), vol.getInstallPath(), vol.getPrimaryStorageUuid(), vo.getTrashId(), type)); return InstallPathRecycleInventory.valueOf(vo); } @@ -103,6 +106,8 @@ private InstallPathRecycleInventory createRecycleFromImage(TrashType type, boole vo.setSize(image.getSize()); vo = dbf.persistAndRefresh(vo); + logger.debug(String.format("create trash for image[uuid:%s, installPath:%s] on backup storage[uuid:%s], trashId: %s, type: %s", + image.getUuid(), image.getUrl(), image.getDescription(), vo.getTrashId(), type)); return InstallPathRecycleInventory.valueOf(vo); } @@ -123,6 +128,8 @@ private InstallPathRecycleInventory createRecycleFromVolumeSnapshot(TrashType ty } vo = dbf.persistAndRefresh(vo); + logger.debug(String.format("create trash for volume snapshot[uuid:%s, installPath:%s] on primary storage[uuid:%s], trashId: %s, type: %s", + snapshot.getUuid(), snapshot.getPrimaryStorageInstallPath(), snapshot.getPrimaryStorageUuid(), vo.getTrashId(), type)); return InstallPathRecycleInventory.valueOf(vo); } @@ -295,6 +302,7 @@ public Long getTrashId(String storageUuid, String installPath) { public void removeFromDb(Long trashId) { DebugUtils.Assert(trashId != null, "trashId is not allowed null here"); UpdateQuery.New(InstallPathRecycleVO.class).eq(InstallPathRecycleVO_.trashId, trashId).delete(); + logger.debug(String.format("remove trash[trashId:%s] from db", trashId)); } private void deleteTrashForVolume(String resourceUuid, String primaryStorageUuid, NoErrorCompletion completion) { @@ -408,14 +416,11 @@ public void run() { @Override public List findTrashInstallPath(String installPath, String storageUuid) { - List trashInstallPath = new ArrayList<>(); - List vos = Q.New(InstallPathRecycleVO.class).eq(InstallPathRecycleVO_.storageUuid, storageUuid).list(); - for (InstallPathRecycleVO vo: vos) { - if (vo.getInstallPath().startsWith(installPath)) { - trashInstallPath.add(vo.getInstallPath().substring(installPath.length())); - } - } - return trashInstallPath; + List absPaths = Q.New(InstallPathRecycleVO.class).select(InstallPathRecycleVO_.installPath) + .eq(InstallPathRecycleVO_.storageUuid, storageUuid) + .like(InstallPathRecycleVO_.installPath, String.format("%s%%", installPath)) + .listValues(); + return absPaths.stream().map(it -> it.substring(installPath.length())).collect(Collectors.toList()); } @Override diff --git a/header/src/main/java/org/zstack/header/storage/primary/CheckInstallPathInTrashReply.java b/header/src/main/java/org/zstack/header/storage/primary/CheckInstallPathInTrashReply.java index f1e0372a5c8..7eebf88e616 100644 --- a/header/src/main/java/org/zstack/header/storage/primary/CheckInstallPathInTrashReply.java +++ b/header/src/main/java/org/zstack/header/storage/primary/CheckInstallPathInTrashReply.java @@ -2,12 +2,15 @@ import org.zstack.header.message.MessageReply; +import java.util.List; + /** * Created by mingjian.deng on 2018/12/25. */ public class CheckInstallPathInTrashReply extends MessageReply { private Long trashId; private String resourceUuid; + private List relatedTrashPaths; public Long getTrashId() { return trashId; @@ -24,4 +27,12 @@ public String getResourceUuid() { public void setResourceUuid(String resourceUuid) { this.resourceUuid = resourceUuid; } + + public List getRelatedTrashPaths() { + return relatedTrashPaths; + } + + public void setRelatedTrashPaths(List relatedTrashPaths) { + this.relatedTrashPaths = relatedTrashPaths; + } } diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeInnerSnapshotPathParser.java b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeInnerSnapshotPathParser.java new file mode 100644 index 00000000000..974c624ba94 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeInnerSnapshotPathParser.java @@ -0,0 +1,8 @@ +package org.zstack.header.storage.snapshot; + +import org.zstack.header.storage.primary.PrimaryStorageType; + +public interface VolumeInnerSnapshotPathParser { + String getVolumePathFromSnapshot(VolumeSnapshotInventory snapshot); + PrimaryStorageType getPrimaryStorageType(); +} diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotPreDeleteExtensionPoint.java b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotPreDeleteExtensionPoint.java deleted file mode 100755 index fdd6c422490..00000000000 --- a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotPreDeleteExtensionPoint.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.zstack.header.storage.snapshot; - -/** - * Created by xing5 on 2016/5/3. - */ -public interface VolumeSnapshotPreDeleteExtensionPoint { - void volumeSnapshotPreDeleteExtensionPoint(VolumeSnapshotInventory snapshot); -} diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java index 6b3dfc4a3a4..3adf292187d 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java @@ -89,7 +89,8 @@ public class CephPrimaryStorageFactory implements PrimaryStorageFactory, CephCap KvmSetupSelfFencerExtensionPoint, KVMPreAttachIsoExtensionPoint, Component, PostMarkRootVolumeAsSnapshotExtension, BeforeTakeLiveSnapshotsOnVolumes, VmInstanceCreateExtensionPoint, CreateDataVolumeExtensionPoint, InstanceOfferingUserConfigValidator, DiskOfferingUserConfigValidator, MarkRootVolumeAsSnapshotExtension, - VmCapabilitiesExtensionPoint, PreVmInstantiateResourceExtensionPoint, PSCapacityExtensionPoint, RecalculatePrimaryStorageCapacityExtensionPoint { + VmCapabilitiesExtensionPoint, PreVmInstantiateResourceExtensionPoint, PSCapacityExtensionPoint, + RecalculatePrimaryStorageCapacityExtensionPoint, VolumeInnerSnapshotPathParser { private static final CLogger logger = Utils.getLogger(CephPrimaryStorageFactory.class); public static final PrimaryStorageType type = new PrimaryStorageType(CephConstants.CEPH_PRIMARY_STORAGE_TYPE); @@ -1258,6 +1259,15 @@ public String buildAllocatedInstallUrl(AllocatePrimaryStorageSpaceMsg msg, Prima return getPreAllocatedInstallUrl(msg, psInv.getUuid()); } + @Override + public String getVolumePathFromSnapshot(VolumeSnapshotInventory snapshot) { + if (StringUtils.isEmpty(snapshot.getPrimaryStorageInstallPath())) { + return null; + } + + return snapshot.getPrimaryStorageInstallPath().split("@")[0]; + } + @Override @Transactional(propagation = Propagation.MANDATORY) public long reserveCapacity(AllocatePrimaryStorageSpaceMsg msg, String allocatedInstallUrl, long size, String psUuid) { diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephRequiredUrlParser.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephRequiredUrlParser.java index d9b37f5cac5..906e04e5bdd 100644 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephRequiredUrlParser.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephRequiredUrlParser.java @@ -1,9 +1,13 @@ package org.zstack.storage.ceph.primary; +import org.apache.commons.lang.StringUtils; import org.zstack.core.db.Q; import org.zstack.header.errorcode.OperationFailureException; +import org.zstack.header.storage.snapshot.VolumeInnerSnapshotPathParser; +import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; import org.zstack.header.volume.VolumeVO; import org.zstack.header.volume.VolumeVO_; +import org.zstack.storage.ceph.CephConstants; import org.zstack.utils.DebugUtils; import java.net.URI; diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackend.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackend.java index b81e961bada..f8beca29741 100755 --- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackend.java +++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackend.java @@ -945,6 +945,7 @@ public void handle(PrimaryStorageInventory inv, NfsRebaseVolumeBackingFileMsg ms cmd.dstPsMountPath = Q.New(PrimaryStorageVO.class).select(PrimaryStorageVO_.mountPath).eq(PrimaryStorageVO_.uuid, msg.getDstPsUuid()).findValue(); cmd.dstVolumeFolderPath = msg.getDstVolumeFolderPath(); cmd.dstImageCacheTemplateFolderPath = msg.getDstImageCacheTemplateFolderPath(); + cmd.setUuid(inv.getUuid()); final HostInventory host = nfsFactory.getConnectedHostForOperation(inv).get(0); new KvmCommandSender(host.getUuid()).send(cmd, NFS_REBASE_VOLUME_BACKING_FILE_PATH, new KvmCommandFailureChecker() { diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java index 42bc1a5a57f..48c087e4409 100755 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java @@ -500,6 +500,7 @@ protected void handle(final CheckInstallPathInTrashMsg msg) { reply.setTrashId(trashId); reply.setResourceUuid(inv.getResourceUuid()); } + reply.setRelatedTrashPaths(trash.findTrashInstallPath(msg.getInstallPath(), self.getUuid())); bus.reply(msg, reply); } diff --git a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java index 69c25da4cad..c15d0528719 100644 --- a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java @@ -67,6 +67,7 @@ public static Map> getDirectReferencedSnapshotUuidsGroupByT )); } + // suppose that inner snapshot path is like: volumePath@snapshotId public static boolean isVolumeDirectlyReferenceByOthers(VolumeInventory volume) { return Q.New(VolumeSnapshotReferenceVO.class).eq(VolumeSnapshotReferenceVO_.volumeUuid, volume.getUuid()) .like(VolumeSnapshotReferenceVO_.volumeSnapshotInstallUrl, volume.getInstallPath() + "%%") @@ -82,14 +83,6 @@ public static String getVolumeInstallUrlBackingOtherVolume(String volumeUuid) { return null; } - // use getVolumeAllSnapshotsReferencedOtherVolumes or isVolumeDirectlyReferenceByOthers - @Deprecated - public static List getVolumeSnapshotsReferencedByOtherVolumes(String volumeUuid) { - return getVolumeReferenceRef(volumeUuid).stream() - .map(VolumeSnapshotReferenceVO::getVolumeSnapshotInstallUrl).distinct() - .collect(Collectors.toList()); - } - // get volume snapshotUuids referenced by other volumes directly or indirectly // FIXME split different primary storage snapshot reference public static Set getVolumeAllSnapshotsReferencedByOtherVolumes(String volumeUuid) { diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephVolumeSnapshotCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephVolumeSnapshotCase.groovy index 821ff43ac15..fc8503e27f9 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephVolumeSnapshotCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephVolumeSnapshotCase.groovy @@ -108,7 +108,7 @@ class CephVolumeSnapshotCase extends SubCase { name = "root-snapshot" } as VolumeSnapshotInventory - assert rootSnapshot.primaryStorageInstallPath.startsWith("ceph://pri-c-") + assert rootSnapshot.primaryStorageInstallPath.startsWith("ceph://pri-v-r-") assert rootSnapshot.primaryStorageInstallPath.endsWith("/${root.uuid}@${rootSnapshot.uuid}") assert rootSnapshot.parentUuid == null assert rootSnapshot.status == VolumeSnapshotStatus.Ready.toString() diff --git a/testlib/src/main/java/org/zstack/testlib/CephPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/CephPrimaryStorageSpec.groovy index 88d79ad7a2c..ab5065396ce 100755 --- a/testlib/src/main/java/org/zstack/testlib/CephPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/CephPrimaryStorageSpec.groovy @@ -32,11 +32,11 @@ class CephPrimaryStorageSpec extends PrimaryStorageSpec { @SpecParam Map monAddrs = [:] @SpecParam - String rootVolumePoolName = "pri-c-" + Platform.getUuid() + String rootVolumePoolName = "pri-v-r-" + Platform.getUuid() @SpecParam String dataVolumePoolName = "pri-v-d-" + Platform.getUuid() @SpecParam - String imageCachePoolName = "pri-v-r-" + Platform.getUuid() + String imageCachePoolName = "pri-c-" + Platform.getUuid() CephPrimaryStorageSpec(EnvSpec envSpec) { super(envSpec) diff --git a/testlib/src/main/java/org/zstack/testlib/NfsPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/NfsPrimaryStorageSpec.groovy index e8a3a3ebfbd..5a02b592891 100755 --- a/testlib/src/main/java/org/zstack/testlib/NfsPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/NfsPrimaryStorageSpec.groovy @@ -467,7 +467,12 @@ class NfsPrimaryStorageSpec extends PrimaryStorageSpec { srcVfs.walkFileSystem { VFSFile f -> if (f.pathString().contains(cmd.srcFolderPath)) { String newPath = f.pathString().replace(cmd.srcFolderPath, cmd.dstFolderPath) - dstVfs.createFileFrom(Paths.get(newPath), f) + def dstFile = dstVfs.createFileFrom(Paths.get(newPath), f) + if (dstFile instanceof Qcow2 && + dstFile.backingFile != null && + f.pathString() == cmd.independentPath) { + dstFile.rebase(null) + } } } @@ -515,33 +520,23 @@ class NfsPrimaryStorageSpec extends PrimaryStorageSpec { VFS.vfsHook(NfsPrimaryStorageKVMBackend.NFS_REBASE_VOLUME_BACKING_FILE_PATH, xspec) { rsp, HttpEntity e, EnvSpec spec -> def cmd = JSONObjectUtil.toObject(e.body, NfsPrimaryStorageKVMBackendCommands.NfsRebaseVolumeBackingFileCmd.class) -// String dstPrimaryStorageUuid = getPrimaryStorageFromPath(cmd.dstPsMountPath) -// VFS dstVfs = vfs(dstPrimaryStorageUuid, spec) - //TODO: for guoyi -// List fileList = new ArrayList<>() -// if (cmd.dstImageCacheTemplateFolderPath == null) { -// dstVfs.walkFileSystem { f -> -// if (f.pathString().contains(cmd.dstVolumeFolderPath)) { -// fileList.add(f) -// } -// } -// } else { -// dstVfs.walkFileSystem { f -> -// if (f.pathString().contains(cmd.dstVolumeFolderPath) -// || f.pathString().contains(cmd.dstImageCacheTemplateFolderPath)) { -// fileList.add(f) -// } -// } -// } -// -// fileList.each { file -> -// if (file.backingFile == null) { -// return -// } -// -// file.backingFile = Paths.get(file.backingFile.toAbsolutePath().toString().replace(cmd.srcPsMountPath, cmd.dstPsMountPath)) -// dstVfs.write(file.path, file.asJSONString()) -// } + + VFS dstVfs = vfs(cmd, spec) + List fileList = new ArrayList<>() + dstVfs.walkFileSystem { f -> + if (f.pathString().contains(cmd.dstVolumeFolderPath) + || (cmd.dstImageCacheTemplateFolderPath != null && + f.pathString().contains(cmd.dstImageCacheTemplateFolderPath))) { + fileList.add(f) + } + } + + fileList.each { file -> + if (file instanceof Qcow2 && file.backingFile != null) { + String newBackingFile = file.backingFile.toAbsolutePath().toString().replace(cmd.srcPsMountPath, cmd.dstPsMountPath) + file.rebase(newBackingFile) + } + } return rsp } diff --git a/testlib/src/main/java/org/zstack/testlib/vfs/VFS.groovy b/testlib/src/main/java/org/zstack/testlib/vfs/VFS.groovy index c3692b14ffd..b8751b8d5bb 100755 --- a/testlib/src/main/java/org/zstack/testlib/vfs/VFS.groovy +++ b/testlib/src/main/java/org/zstack/testlib/vfs/VFS.groovy @@ -319,9 +319,12 @@ class VFS { } createDirectories(p.getParent()) + def originPath = f.path f.path = p write(p, f.asJSONString()) - return getFile(f.pathString(), true) + VFSFile ret = getFile(f.pathString(), true) + f.path = originPath // restore original path + return ret } VFSFile createFileFrom(VFSFile f) { From abf384ca3be04817f1bbf6c74e50b5b976ca83f2 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Wed, 16 Jul 2025 15:18:09 +0800 Subject: [PATCH 410/737] [storage]: zbs support cdp GlobalPropertyImpact Resolves: ZSTAC-71011 Change-Id: I6964747463626a6568656e786a6f6a747877747a --- .../zstack/storage/zbs/ZbsGlobalProperty.java | 2 +- .../storage/primary/PrimaryStorageBase.java | 1 + .../org/zstack/storage/volume/VolumeBase.java | 11 ++++++++--- .../java/org/zstack/utils/path/PathUtil.java | 18 ++++++++++++++++++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsGlobalProperty.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsGlobalProperty.java index fbf4b3928e6..3c2dabef30b 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsGlobalProperty.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsGlobalProperty.java @@ -15,7 +15,7 @@ public class ZbsGlobalProperty { public static String PRIMARY_STORAGE_MODULE_PATH; @GlobalProperty(name = "Zbs.primaryStorage.ansiblePlaybook", defaultValue = "zbsp.py") public static String PRIMARY_STORAGE_PLAYBOOK_NAME; - @GlobalProperty(name = "Zbs.primaryStorage.agentPackageName", defaultValue = "zbsprimarystorage-5.0.0.tar.gz") + @GlobalProperty(name = "Zbs.primaryStorage.agentPackageName", defaultValue = "zbsprimarystorage-5.3.0.tar.gz") public static String PRIMARY_STORAGE_PACKAGE_NAME; @GlobalProperty(name = "Zbs.primaryStorageAgent.port", defaultValue = "7763") public static int PRIMARY_STORAGE_AGENT_PORT; diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java index 48c087e4409..6f9515a1e40 100755 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java @@ -758,6 +758,7 @@ public void run(MessageReply reply) { r2.getVolume().getInstallPath(), msg.getBackupStorageRef().getInstallPath()) ); + r.setProtocol(r2.getVolume().getProtocol()); } bus.reply(msg, r); } diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java b/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java index bd038ceccb7..b6225dcee3b 100755 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java @@ -47,8 +47,8 @@ import org.zstack.storage.primary.EstimateVolumeTemplateSizeOnPrimaryStorageMsg; import org.zstack.storage.primary.EstimateVolumeTemplateSizeOnPrimaryStorageReply; import org.zstack.storage.primary.PrimaryStorageGlobalConfig; -import org.zstack.storage.snapshot.reference.VolumeSnapshotReferenceUtils; import org.zstack.storage.snapshot.group.VolumeSnapshotGroupOperationValidator; +import org.zstack.storage.snapshot.reference.VolumeSnapshotReferenceUtils; import org.zstack.tag.SystemTagCreator; import org.zstack.tag.TagManager; import org.zstack.utils.CollectionUtils; @@ -57,6 +57,7 @@ import org.zstack.utils.Utils; import org.zstack.utils.function.ForEachFunction; import org.zstack.utils.logging.CLogger; +import org.zstack.utils.path.PathUtil; import javax.persistence.TypedQuery; import java.util.*; @@ -1228,6 +1229,7 @@ public void run(MessageReply reply) { if (deletionPolicy == VolumeDeletionPolicy.Direct) { flow(new NoRollbackFlow() { + final List allowedStatuses = Arrays.asList(VolumeStatus.Ready, VolumeStatus.Migrating); String __name__ = "delete-volume-from-primary-storage"; @Override @@ -1238,8 +1240,11 @@ public boolean skip(Map data) { @Override public void run(final FlowTrigger trigger, Map data) { - if (self.getStatus() == VolumeStatus.Ready && - self.getPrimaryStorageUuid() != null) { + if (allowedStatuses.contains(self.getStatus()) && self.getPrimaryStorageUuid() != null) { + if (self.getStatus() == VolumeStatus.Migrating) { + self.setInstallPath(PathUtil.normalizePathWithoutQuery(self.getInstallPath())); + } + DeleteVolumeOnPrimaryStorageMsg dmsg = new DeleteVolumeOnPrimaryStorageMsg(); dmsg.setVolume(getSelfInventory()); dmsg.setUuid(self.getPrimaryStorageUuid()); diff --git a/utils/src/main/java/org/zstack/utils/path/PathUtil.java b/utils/src/main/java/org/zstack/utils/path/PathUtil.java index 29028402218..fcabfffd20b 100755 --- a/utils/src/main/java/org/zstack/utils/path/PathUtil.java +++ b/utils/src/main/java/org/zstack/utils/path/PathUtil.java @@ -3,10 +3,12 @@ import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; import java.io.*; +import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.nio.charset.Charset; @@ -447,4 +449,20 @@ public static FileTime getFileLastModifiedTime(String filePath) { throw new RuntimeException(e); } } + + public static String normalizePathWithoutQuery(String path) { + try { + String normalizedPath = path.replaceFirst( + "^([a-zA-Z]+:)(?!/{2})", + "$1//"); + final String query = new URI(normalizedPath).getQuery(); + if (query != null) { + return StringUtils.removeEnd(path, '?' + query); + } + } catch (URISyntaxException ignored) { + logger.warn(String.format("unexpected path: %s", path)); + } + + return path; + } } \ No newline at end of file From 6ab664035530600b2d8026d5064b8e1a84537097 Mon Sep 17 00:00:00 2001 From: "yingzhe.hu" Date: Thu, 24 Apr 2025 09:51:36 +0800 Subject: [PATCH 411/737] [storage]: enable sblk cbt Resolves: ZSTAC-73119 Change-Id: I66717066766e63627263617677647671706c6365 --- conf/db/upgrade/V5.3.36__schema.sql | 13 +++++++++++++ .../org/zstack/storage/volume/VolumeSystemTags.java | 3 +++ 2 files changed, 16 insertions(+) create mode 100644 conf/db/upgrade/V5.3.36__schema.sql diff --git a/conf/db/upgrade/V5.3.36__schema.sql b/conf/db/upgrade/V5.3.36__schema.sql new file mode 100644 index 00000000000..d7a568582ea --- /dev/null +++ b/conf/db/upgrade/V5.3.36__schema.sql @@ -0,0 +1,13 @@ +CREATE TABLE IF NOT EXISTS `zstack`.`VolumeCbtBackupRecordVO` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `taskUuid` varchar(32) NOT NULL, + `volumeUuid` varchar(32) NOT NULL, + `mode` varchar(255) NOT NULL, + `target` varchar(2048) NOT NULL, + `scratchNodeName` varchar(255) NOT NULL, + `bitmapName` varchar(255) NOT NULL, + `lastBitmapName` varchar(255), + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeSystemTags.java b/storage/src/main/java/org/zstack/storage/volume/VolumeSystemTags.java index b6772555b89..1cbd13ff463 100644 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeSystemTags.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeSystemTags.java @@ -45,6 +45,9 @@ public class VolumeSystemTags { @NonCloneable public static EphemeralSystemTag FORMAT_QCOW2 = new EphemeralSystemTag("volume::format::qcow2"); + @NonCloneable + public static EphemeralSystemTag NO_ZERO_FILLED_VOLUME = new EphemeralSystemTag("volume::noZeroFilled"); + public static String VOLUME_QOS_TOKEN = "qos"; public static PatternedSystemTag VOLUME_QOS = new PatternedSystemTag(String.format("%s::{%s}", VOLUME_QOS_TOKEN, VOLUME_QOS_TOKEN), VolumeVO.class); } From c8fe8aff63c74ccb3203ef82627757caa0e9dc0f Mon Sep 17 00:00:00 2001 From: J M Date: Mon, 3 Mar 2025 18:09:01 +0800 Subject: [PATCH 412/737] [kvm]: reject change cpuMode online migration check will use the current cpu mode. Resolves: ZSTAC-66401 Change-Id: I6c6f73647561617a69697371626d657a7268616c --- .../org/zstack/compute/vm/VmInstanceBase.java | 32 ++++++++++++------- .../compute/vm/VmStopOnHypervisorFlow.java | 1 + .../org/zstack/header/vm/VmInstanceState.java | 13 +++++--- .../java/org/zstack/kvm/KVMHostFactory.java | 16 ++++++++++ 4 files changed, 46 insertions(+), 16 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java index 558adde5b1f..3aa3b938562 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java @@ -7832,20 +7832,28 @@ public void done() { completion.fail(errCode); } }); - } else { - VmInstanceState currentState = Q.New(VmInstanceVO.class) - .select(VmInstanceVO_.state) - .eq(VmInstanceVO_.uuid, self.getUuid()) - .findValue(); - if (currentState == VmInstanceState.Rebooting) { - SQL.New(VmInstanceVO.class) - .set(VmInstanceVO_.state, originState) - .eq(VmInstanceVO_.uuid, self.getUuid()) - .update(); - } + return; + } - completion.fail(errCode); + VmInstanceState currentState = Q.New(VmInstanceVO.class) + .select(VmInstanceVO_.state) + .eq(VmInstanceVO_.uuid, self.getUuid()) + .findValue(); + + if (currentState == VmInstanceState.Rebooting) { + if (data.containsKey(VmStopOnHypervisorFlow.class.getName())) { + currentState = currentState.nextState(VmInstanceStateEvent.stopped); + } + if (data.containsKey(VmStartOnHypervisorFlow.class.getName())) { + currentState = currentState.nextState(VmInstanceStateEvent.running); + } + SQL.New(VmInstanceVO.class) + .set(VmInstanceVO_.state, currentState) + .eq(VmInstanceVO_.uuid, self.getUuid()) + .update(); } + + completion.fail(errCode); } }).start(); } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmStopOnHypervisorFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmStopOnHypervisorFlow.java index d7df47541f1..96120fbb7a5 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmStopOnHypervisorFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmStopOnHypervisorFlow.java @@ -50,6 +50,7 @@ public void run(final FlowTrigger chain, Map data) { @Override public void run(MessageReply reply) { if (reply.isSuccess()) { + data.put(VmStopOnHypervisorFlow.class.getName(), true); chain.next(); } else { if (spec.isGcOnStopFailure() && reply.getError().isError(HostErrors.OPERATION_FAILURE_GC_ELIGIBLE)) { diff --git a/header/src/main/java/org/zstack/header/vm/VmInstanceState.java b/header/src/main/java/org/zstack/header/vm/VmInstanceState.java index 281c22480eb..8a755b52fda 100755 --- a/header/src/main/java/org/zstack/header/vm/VmInstanceState.java +++ b/header/src/main/java/org/zstack/header/vm/VmInstanceState.java @@ -3,10 +3,7 @@ import org.zstack.header.configuration.PythonClass; import org.zstack.header.exception.CloudRuntimeException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @PythonClass public enum VmInstanceState { @@ -32,6 +29,8 @@ public enum VmInstanceState { public static List intermediateStates = new ArrayList(); + public static Set offlineStates = new HashSet<>(); + static { intermediateStates.add(Starting); intermediateStates.add(Stopping); @@ -43,6 +42,12 @@ public enum VmInstanceState { intermediateStates.add(VolumeMigrating); intermediateStates.add(VolumeRecovering); + offlineStates.add(Created); + offlineStates.add(Stopped); + offlineStates.add(Destroyed); + offlineStates.add(VolumeMigrating); + offlineStates.add(Crashed); + Created.transactions( new Transaction(VmInstanceStateEvent.starting, VmInstanceState.Starting), new Transaction(VmInstanceStateEvent.destroying, VmInstanceState.Destroying), diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java index 1f68d830713..4d4fa167b7e 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java @@ -512,6 +512,22 @@ public void validateGlobalConfig(String category, String name, String oldValue, } }); + resourceConfig = rcf.getResourceConfig(KVMGlobalConfig.NESTED_VIRTUALIZATION.getIdentity()); + resourceConfig.installValidatorExtension((resourceUuid, oldValue, newValue) -> { + if (oldValue.equals(newValue)) { + return; + } + + VmInstanceState vmState = Q.New(VmInstanceVO.class).select(VmInstanceVO_.state) + .eq(VmInstanceVO_.uuid, resourceUuid) + .findValue(); + if (vmState != null + && vmState != VmInstanceState.Starting // some configs are set while vm is starting + && !VmInstanceState.offlineStates.contains(vmState)) { + throw new GlobalConfigException("Can not change vm.cpuMode while VM is living."); + } + }); + restf.registerSyncHttpCallHandler(KVMConstant.KVM_RECONNECT_ME, ReconnectMeCmd.class, new SyncHttpCallHandler() { @Override public String handleSyncHttpCall(ReconnectMeCmd cmd) { From 9f3e6a5d068c10b701906731972c336b51105c4e Mon Sep 17 00:00:00 2001 From: "xinhao.huang" Date: Thu, 3 Jul 2025 18:24:27 +0800 Subject: [PATCH 413/737] [os]: not start process-exporter and zs-exporter in loongarch64 Resolves: ZSTAC-75192 Change-Id: I72616168766a616e756c6767656565616b796c79 (cherry picked from commit beb170b65853c062d96fb0da5bd9e2ff00a8a501) --- .../org/zstack/header/os/OSArchitecture.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 header/src/main/java/org/zstack/header/os/OSArchitecture.java diff --git a/header/src/main/java/org/zstack/header/os/OSArchitecture.java b/header/src/main/java/org/zstack/header/os/OSArchitecture.java new file mode 100644 index 00000000000..57776bf301f --- /dev/null +++ b/header/src/main/java/org/zstack/header/os/OSArchitecture.java @@ -0,0 +1,65 @@ +package org.zstack.header.os; + +import java.util.Locale; + +/** + * Represents the operating system architecture type obtained from System.getProperty("os.arch"). + */ +public enum OSArchitecture { + X86_64(new String[]{"amd64", "x86_64"}, "x86_64"), + AARCH64(new String[]{"aarch64"}, "aarch64"), + LOONGARCH64(new String[]{"loongarch64"}, "loongarch64"), + MIPS64EL(new String[]{"mips64el"}, "mips64el"), + UNKNOWN(null, "unknown"); + + private final String[] archNames; + private final String normalizedName; + + /** + * Private constructor for OSArchitecture enum. + * + * @param archNames An array of possible raw architecture names from System.getProperty("os.arch"). Can be null for UNKNOWN. + * @param normalizedName The standardized, simplified name for this architecture. + */ + OSArchitecture(String[] archNames, String normalizedName) { + this.archNames = archNames; + this.normalizedName = normalizedName; + } + + /** + * Gets the current OS architecture based on System.getProperty("os.arch"). + * Returns UNKNOWN if no match is found. + * + * @return The corresponding OSArchitecture enum constant. + */ + public static OSArchitecture getCurrent() { + String currentArch = System.getProperty("os.arch"); + if (currentArch == null) { + return UNKNOWN; + } + + String lowerCaseArch = currentArch.toLowerCase(Locale.ROOT); + + for (OSArchitecture arch : values()) { + if (arch.archNames == null) { + continue; + } + for (String name : arch.archNames) { + if (lowerCaseArch.equals(name.toLowerCase())) { + return arch; + } + } + } + return UNKNOWN; + } + + /** + * Returns a normalized string representation of the architecture, as defined in the enum constant. + * For example, for X86_64, this will always return "x86_64". + * + * @return A normalized string name for the architecture. + */ + public String normalizedArchName() { + return this.normalizedName; + } +} \ No newline at end of file From 43ff347a9dbdd451ba65c4f7d586c45995b76033 Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Mon, 4 Aug 2025 18:01:23 +0800 Subject: [PATCH 414/737] [sharedblock]: improve sblk ha fencer 1.Improve the robustness of zsblk-agent heartbeat detection and expose the heartbeat query interface. 2.Remove the commands that may be stuck before fencer vm, and use sanlock and zsblk agent heartbeat directly as the basis for storing whether there are abnormalities and fencer vm. When there is a storage exception, all vms under vg will be killed. 3.When both the sanlock and zsblk-agent services are abnormal, try to stop HA to prevent split-brain. If it cannot be stopped, kill all VMs. Resolves/Related: ZSTAC-75282 Change-Id: I6561726a6178697067756d77756971706c726d64 --- plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java | 1 + 1 file changed, 1 insertion(+) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java index 334f4d6b767..8654f9e415f 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java @@ -104,6 +104,7 @@ public interface KVMConstant { String KVM_RECONNECT_ME = "/kvm/reconnectme"; String KVM_REPORT_PS_STATUS = "/kvm/reportstoragestatus"; String KVM_REPORT_SELF_FENCER = "/kvm/reportselffencer"; + String KVM_REPORT_SELF_FENCER_STATE_CHANGED = "/kvm/reportselffencerstatechanged"; String KVM_REQUEST_MAINTAIN_HOST = "/kvm/requestmaintainhost"; String KVM_ANSIBLE_LOG_PATH_FROMAT = "/kvm/ansiblelog/{uuid}"; String KVM_REPORT_VM_SHUTDOWN_EVENT = "/kvm/reportvmshutdown"; From d80857d0c2174cae8019557eae69ff00fde09e6d Mon Sep 17 00:00:00 2001 From: "haoyu.ding" Date: Wed, 13 Aug 2025 02:59:45 +0000 Subject: [PATCH 415/737] [securityGroup]: add SecurityGroupGlobalProperty to control Ip/Port limit GlobalPropertyImpact Resolves: ZSTAC-76328 Change-Id: I7172726769746b6671746f616a6e76716b746975 --- .../network/securitygroup/SecurityGroupGlobalProperty.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalProperty.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalProperty.java index e7e6921fa20..aab07748427 100644 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalProperty.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalProperty.java @@ -7,7 +7,7 @@ public class SecurityGroupGlobalProperty { @GlobalProperty(name="upgradeSecurityGroup", defaultValue = "false") public static boolean UPGRADE_SECURITY_GROUP; - @GlobalProperty(name="SecurityGroupRuleIpLimit", defaultValue = "10") + @GlobalProperty(name="SecurityGroupRuleIpLimit", defaultValue = "50") public static int IP_GROUP_NUMBER_LIMIT; @GlobalProperty(name="SecurityGroupRulePortLimit", defaultValue = "50") public static int PORT_GROUP_NUMBER_LIMIT; From dbe64a4821b651282524853402e24e9fa032780e Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Mon, 11 Aug 2025 14:20:40 +0800 Subject: [PATCH 416/737] [virtualRouterProvider]: limit vpc auto demote before migrate Resolves: ZSTAC-72388 Change-Id: I6868776cf465034c99d9458d8400f1f8ced795bf --- .../virtualrouter/VirtualRouterManagerImpl.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java index d90242b1b27..6d47951e257 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java @@ -2772,7 +2772,15 @@ private List findVipsOnVirtualRouter(List vfNics, String public void preVmMigration(VmInstanceInventory vm, VmMigrationType type, String dstHostUuid, Completion completion) { if (ApplianceVmConstant.APPLIANCE_VM_TYPE.equals(vm.getType())) { VirtualRouterVmVO vrVo = Q.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, vm.getUuid()).find(); - if (vrVo != null && vrVo.isHaEnabled()) { + if (vrVo == null) { + completion.success(); + return; + } + VirtualRouterVmInventory inv = VirtualRouterVmInventory.valueOf(vrVo); + List vfNics = inv.getVmNics().stream() + .filter(nic -> !Objects.equals(nic.getType(), VmInstanceConstant.VIRTUAL_NIC_TYPE)) + .collect(Collectors.toList()); + if (vrVo.isHaEnabled() && !vfNics.isEmpty()) { List exps = pluginRgty.getExtensionList(VirtualRouterHaGroupExtensionPoint.class); if (exps.isEmpty()) { completion.success(); From 6efc547428f64657001cb2eed2d7a27b715a6a0e Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Wed, 13 Aug 2025 17:33:27 +0800 Subject: [PATCH 417/737] [storage]: markSnapshotAsVolume before delete origin volume bits Resolves: ZSTAC-76704 Change-Id: I6d66726c636e6e707076667772707a7578777379 --- .../org/zstack/storage/volume/VolumeBase.java | 63 ++++++++++--------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java b/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java index b6225dcee3b..f1d918cbe3a 100755 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java @@ -46,6 +46,7 @@ import org.zstack.identity.AccountManager; import org.zstack.storage.primary.EstimateVolumeTemplateSizeOnPrimaryStorageMsg; import org.zstack.storage.primary.EstimateVolumeTemplateSizeOnPrimaryStorageReply; +import org.zstack.storage.primary.PrimaryStorageDeleteBitGC; import org.zstack.storage.primary.PrimaryStorageGlobalConfig; import org.zstack.storage.snapshot.group.VolumeSnapshotGroupOperationValidator; import org.zstack.storage.snapshot.reference.VolumeSnapshotReferenceUtils; @@ -61,6 +62,7 @@ import javax.persistence.TypedQuery; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static org.zstack.core.Platform.*; @@ -3473,7 +3475,7 @@ public void run(MessageReply reply) { }); flow(new NoRollbackFlow() { - String __name__ = "delete-origin-volume-bits"; + String __name__ = "update-db-install-path"; @Override public boolean skip(Map data) { @@ -3482,24 +3484,18 @@ public boolean skip(Map data) { @Override public void run(FlowTrigger trigger, Map data) { - DeleteVolumeBitsOnPrimaryStorageMsg dmsg = new DeleteVolumeBitsOnPrimaryStorageMsg(); - dmsg.setPrimaryStorageUuid(self.getPrimaryStorageUuid()); - dmsg.setInstallPath(originVolumePath); - dmsg.setSize(self.getSize()); - dmsg.setBitsType(VolumeVO.class.getSimpleName()); - dmsg.setBitsUuid(self.getUuid()); - dmsg.setHypervisorType(VolumeFormat.getMasterHypervisorTypeByVolumeFormat(getSelfInventory().getFormat()).toString()); - dmsg.setFolder(false); - dmsg.setFromRecycle(true); - bus.makeTargetServiceIdByResourceUuid(dmsg, PrimaryStorageConstant.SERVICE_ID, self.getPrimaryStorageUuid()); - bus.send(dmsg, new CloudBusCallBack(trigger) { + MarkSnapshotAsVolumeMsg mmsg = new MarkSnapshotAsVolumeMsg(); + mmsg.setVolumeUuid(self.getUuid()); + mmsg.setSnapshotUuid(snapShot.getUuid()); + mmsg.setSize(size); + mmsg.setVolumePath(newVolumeInstallPath); + mmsg.setTreeUuid(snapShot.getTreeUuid()); + bus.makeTargetServiceIdByResourceUuid(mmsg, VolumeSnapshotConstant.SERVICE_ID, snapShot.getUuid()); + bus.send(mmsg, new CloudBusCallBack(trigger) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { - if (reply.getError().isError(VolumeErrors.VOLUME_IN_USE)) { - logger.warn(String.format("unable to delete path:%s right now", originVolumePath)); - } - + logger.warn(String.format("mark snapshot:%s as volume failed", snapShot.getUuid())); trigger.fail(reply.getError()); return; } @@ -3511,7 +3507,7 @@ public void run(MessageReply reply) { }); flow(new NoRollbackFlow() { - String __name__ = "update-db-install-path"; + String __name__ = "delete-origin-volume-bits"; @Override public boolean skip(Map data) { @@ -3520,20 +3516,31 @@ public boolean skip(Map data) { @Override public void run(FlowTrigger trigger, Map data) { - MarkSnapshotAsVolumeMsg mmsg = new MarkSnapshotAsVolumeMsg(); - mmsg.setVolumeUuid(self.getUuid()); - mmsg.setSnapshotUuid(snapShot.getUuid()); - mmsg.setSize(size); - mmsg.setVolumePath(newVolumeInstallPath); - mmsg.setTreeUuid(snapShot.getTreeUuid()); - bus.makeTargetServiceIdByResourceUuid(mmsg, VolumeSnapshotConstant.SERVICE_ID, snapShot.getUuid()); - bus.send(mmsg, new CloudBusCallBack(trigger) { + DeleteVolumeBitsOnPrimaryStorageMsg dmsg = new DeleteVolumeBitsOnPrimaryStorageMsg(); + dmsg.setPrimaryStorageUuid(self.getPrimaryStorageUuid()); + dmsg.setInstallPath(originVolumePath); + dmsg.setSize(self.getSize()); + dmsg.setBitsType(VolumeVO.class.getSimpleName()); + dmsg.setBitsUuid(self.getUuid()); + dmsg.setHypervisorType(VolumeFormat.getMasterHypervisorTypeByVolumeFormat(getSelfInventory().getFormat()).toString()); + dmsg.setFolder(false); + dmsg.setFromRecycle(true); + bus.makeTargetServiceIdByResourceUuid(dmsg, PrimaryStorageConstant.SERVICE_ID, self.getPrimaryStorageUuid()); + bus.send(dmsg, new CloudBusCallBack(trigger) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { - logger.warn(String.format("mark snapshot:%s as volume failed", snapShot.getUuid())); - trigger.fail(reply.getError()); - return; + if (reply.getError().isError(VolumeErrors.VOLUME_IN_USE)) { + logger.warn(String.format("unable to delete path:%s right now", originVolumePath)); + } + + PrimaryStorageDeleteBitGC gc = new PrimaryStorageDeleteBitGC(); + gc.NAME = String.format("gc-delete-bits-volume-%s-on-primary-storage-%s", self.getUuid(), self.getPrimaryStorageUuid()); + gc.primaryStorageInstallPath = originVolumePath; + gc.primaryStorageUuid = self.getPrimaryStorageUuid(); + gc.volume = self; + gc.submit(PrimaryStorageGlobalConfig.PRIMARY_STORAGE_DELETEBITS_GARBAGE_COLLECTOR_INTERVAL.value(Long.class), + TimeUnit.SECONDS); } trigger.next(); From af3dae50cc970514aff0aa7af361febdd4bf0df6 Mon Sep 17 00:00:00 2001 From: gitlab Date: Wed, 14 May 2025 08:55:53 +0000 Subject: [PATCH 418/737] Merge branch 'fix-74789' into '5.3.28-suiyuan' [acl]: add acl list update api See merge request zstackio/zstack!7813 (cherry picked from commit 9078c959560c66455dc81f2ed9accfed99b337c1) b8c8a0e5 [acl]: add acl list update api --- conf/serviceConfig/acl.xml | 4 + .../acl/AccessControlListManagerImpl.java | 22 ++++ .../acl/APIUpdateAccessControlListEvent.java | 37 ++++++ ...dateAccessControlListEventDoc_zh_cn.groovy | 32 ++++++ .../acl/APIUpdateAccessControlListMsg.java | 65 +++++++++++ ...UpdateAccessControlListMsgDoc_zh_cn.groovy | 76 +++++++++++++ .../sdk/UpdateAccessControlListAction.java | 107 ++++++++++++++++++ .../sdk/UpdateAccessControlListResult.java | 14 +++ ...rtualRouterLoadBalancerListenerCase.groovy | 6 + .../java/org/zstack/testlib/ApiHelper.groovy | 29 ++++- 10 files changed, 391 insertions(+), 1 deletion(-) create mode 100644 plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListEvent.java create mode 100644 plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListEventDoc_zh_cn.groovy create mode 100644 plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListMsg.java create mode 100644 plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListMsgDoc_zh_cn.groovy create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateAccessControlListAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateAccessControlListResult.java diff --git a/conf/serviceConfig/acl.xml b/conf/serviceConfig/acl.xml index 9c789a6b1b0..ac0ed59c777 100644 --- a/conf/serviceConfig/acl.xml +++ b/conf/serviceConfig/acl.xml @@ -7,6 +7,10 @@ org.zstack.header.acl.APICreateAccessControlListMsg + + org.zstack.header.acl.APIUpdateAccessControlListMsg + + org.zstack.header.acl.APIDeleteAccessControlListMsg diff --git a/plugin/acl/src/main/java/org/zstack/acl/AccessControlListManagerImpl.java b/plugin/acl/src/main/java/org/zstack/acl/AccessControlListManagerImpl.java index 8a8fab95e9c..5e90711f200 100644 --- a/plugin/acl/src/main/java/org/zstack/acl/AccessControlListManagerImpl.java +++ b/plugin/acl/src/main/java/org/zstack/acl/AccessControlListManagerImpl.java @@ -73,6 +73,8 @@ public void handleMessage(Message msg) { protected void handleApiMessage(APIMessage msg) { if (msg instanceof APICreateAccessControlListMsg) { handle((APICreateAccessControlListMsg) msg); + } else if (msg instanceof APIUpdateAccessControlListMsg) { + handle((APIUpdateAccessControlListMsg) msg); } else if (msg instanceof APIDeleteAccessControlListMsg) { handle((APIDeleteAccessControlListMsg) msg); } else if (msg instanceof APIAddAccessControlListEntryMsg) { @@ -119,6 +121,26 @@ protected void scripts() { bus.publish(evt); } + private void handle(APIUpdateAccessControlListMsg msg) { + AccessControlListVO vo = dbf.findByUuid(msg.getUuid(), AccessControlListVO.class); + boolean update = false; + if (msg.getName() != null) { + vo.setName(msg.getName()); + update = true; + } + if (msg.getDescription() != null) { + vo.setDescription(msg.getDescription()); + update = true; + } + if (update) { + vo = dbf.updateAndRefresh(vo); + } + + APIUpdateAccessControlListEvent event = new APIUpdateAccessControlListEvent(msg.getId()); + event.setInventory(vo.toInventory()); + bus.publish(event); + } + private void handle(APIDeleteAccessControlListMsg msg) { APIDeleteAccessControlListEvent evt = new APIDeleteAccessControlListEvent(msg.getId()); deleteAccessControlList(msg.getUuid(), msg.getDeletionMode(), new Completion(msg) { diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListEvent.java b/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListEvent.java new file mode 100644 index 00000000000..5fe80081dcc --- /dev/null +++ b/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListEvent.java @@ -0,0 +1,37 @@ +package org.zstack.header.acl; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +/** + * Created by boce.wang on 05/13/2025. + */ +@RestResponse(allTo = "inventory") +public class APIUpdateAccessControlListEvent extends APIEvent { + private AccessControlListInventory inventory; + + public APIUpdateAccessControlListEvent() { } + + public APIUpdateAccessControlListEvent(String apiId) { + super(apiId); + } + + public void setInventory(AccessControlListInventory inventory) { + this.inventory = inventory; + } + + public AccessControlListInventory getInventory() { + return inventory; + } + + public static APIUpdateAccessControlListEvent __example__() { + APIUpdateAccessControlListEvent event = new APIUpdateAccessControlListEvent(); + AccessControlListInventory inv = new AccessControlListInventory(); + + inv.setName("acl-group"); + inv.setIpVersion(4); + + event.setInventory(inv); + return event; + } +} diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListEventDoc_zh_cn.groovy b/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..fae86438d4a --- /dev/null +++ b/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.acl + +import org.zstack.header.acl.AccessControlListInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "访问控制策略组清单" + + ref { + name "inventory" + path "org.zstack.header.acl.APIUpdateAccessControlListEvent.inventory" + desc "更新后的访问控制策略组详细信息" + type "AccessControlListInventory" + since "5.3.28" + clz AccessControlListInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.28" + } + ref { + name "error" + path "org.zstack.header.acl.APIUpdateAccessControlListEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.28" + clz ErrorCode.class + } +} diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListMsg.java b/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListMsg.java new file mode 100644 index 00000000000..5525b72adf4 --- /dev/null +++ b/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListMsg.java @@ -0,0 +1,65 @@ +package org.zstack.header.acl; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APIEvent; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.other.APIAuditor; +import org.zstack.header.rest.RestRequest; + +/** + * Created by boce.wang on 05/13/2025. + */ + +@Action(category = AccessControlListConstants.ACTION_CATEGORY) +@RestRequest( + path = "/access-control-lists/{uuid}/actions", + method = HttpMethod.PUT, + responseClass = APIUpdateAccessControlListEvent.class, + isAction = true +) +public class APIUpdateAccessControlListMsg extends APIMessage implements APIAuditor { + @APIParam(resourceType = AccessControlListVO.class, checkAccount = true) + private String uuid; + @APIParam(required = false, maxLength = 255, emptyString = false) + private String name; + @APIParam(maxLength = 2048, required = false) + private String description; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + @Override + public Result audit(APIMessage msg, APIEvent rsp) { + return new Result(rsp.isSuccess() ? ((APIUpdateAccessControlListEvent)rsp).getInventory().getUuid() : "", AccessControlListVO.class); + } + + public static APIUpdateAccessControlListMsg __example__() { + APIUpdateAccessControlListMsg msg = new APIUpdateAccessControlListMsg(); + msg.setName("acl-1"); + msg.setDescription("acl-1 description"); + return msg; + } +} diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListMsgDoc_zh_cn.groovy b/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..31f76a1c9f0 --- /dev/null +++ b/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListMsgDoc_zh_cn.groovy @@ -0,0 +1,76 @@ +package org.zstack.header.acl + +import org.zstack.header.acl.APIUpdateAccessControlListEvent + +doc { + title "UpdateAccessControlList" + + category "acl" + + desc """更新访问控制策略组""" + + rest { + request { + url "PUT /v1/access-control-lists/{uuid}/actions" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIUpdateAccessControlListMsg.class + + desc """用于更新指定UUID的访问控制策略组的名称和描述""" + + params { + + column { + name "uuid" + enclosedIn "updateAccessControlList" + desc "资源的UUID,唯一标示该资源" + location "url" + type "String" + optional false + since "5.3.28" + } + column { + name "name" + enclosedIn "updateAccessControlList" + desc "资源名称" + location "body" + type "String" + optional true + since "5.3.28" + } + column { + name "description" + enclosedIn "updateAccessControlList" + desc "资源的详细描述" + location "body" + type "String" + optional true + since "5.3.28" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.28" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.28" + } + } + } + + response { + clz APIUpdateAccessControlListEvent.class + } + } +} \ No newline at end of file diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAccessControlListAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAccessControlListAction.java new file mode 100644 index 00000000000..3c930a245ac --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAccessControlListAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateAccessControlListAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UpdateAccessControlListResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = false, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UpdateAccessControlListResult value = res.getResult(org.zstack.sdk.UpdateAccessControlListResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateAccessControlListResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/access-control-lists/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateAccessControlList"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAccessControlListResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateAccessControlListResult.java new file mode 100644 index 00000000000..01e68b9a7bb --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAccessControlListResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.AccessControlListInventory; + +public class UpdateAccessControlListResult { + public AccessControlListInventory inventory; + public void setInventory(AccessControlListInventory inventory) { + this.inventory = inventory; + } + public AccessControlListInventory getInventory() { + return this.inventory; + } + +} diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/VirtualRouterLoadBalancerListenerCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/VirtualRouterLoadBalancerListenerCase.groovy index 53103f5ac24..86b0ce9a5f8 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/VirtualRouterLoadBalancerListenerCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/VirtualRouterLoadBalancerListenerCase.groovy @@ -1137,6 +1137,12 @@ class VirtualRouterLoadBalancerListenerCase extends SubCase{ AccessControlListInventory acl8 = createAccessControlList { name = "redirect-acl-test-7-8" } + + acl8 = updateAccessControlList { + uuid = acl8.uuid + name = "redirect-acl-test-7-8-update" + description = "redirect-acl-test-7-8-update" + } AccessControlListEntryInventory redirectRule3 = addAccessControlListRedirectRule { name = "redirect rule" domain = "*.zstack.io" diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 81302325323..e59412c7e7e 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -41116,7 +41116,34 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def updateAccessControlList(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAccessControlListAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAccessControlListAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + if (System.getProperty("apipath") != null) { if (a.apiId == null) { From 1bf6bb2e6cb397a33598f1a6733d52d27cb0984b Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Thu, 14 Aug 2025 10:43:33 +0800 Subject: [PATCH 419/737] [core]: Fix issue where live migration of host fails during a grayscale upgrade. Resolves: ZSTAC-76548 Change-Id: I7375747654876741897574646678757a7a734578 --- .../java/org/zstack/core/upgrade/UpgradeChecker.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/zstack/core/upgrade/UpgradeChecker.java b/core/src/main/java/org/zstack/core/upgrade/UpgradeChecker.java index f62c65bc03e..160b32b7864 100644 --- a/core/src/main/java/org/zstack/core/upgrade/UpgradeChecker.java +++ b/core/src/main/java/org/zstack/core/upgrade/UpgradeChecker.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.lang.StringUtils; import org.apache.logging.log4j.ThreadContext; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.cloudbus.EventFacade; @@ -237,7 +238,13 @@ public ErrorCode checkAgentHttpParamChanges(String agentUuid, String commandName Set> entries = fields.entrySet() .stream() .filter(entry -> {//logger.debug(String.format("entry key: %s, value:%s", entry.getKey(), entry.getValue())); - return currentVersion.lessThan(entry.getValue());}) + String ver = entry.getValue(); + if (StringUtils.isEmpty(ver)) { + logger.warn("null version for field: " + entry.getKey()); + return false; + } + return currentVersion.lessThan(ver); + }) .collect(Collectors.toSet()); // do not have new version changes From e04e7ce5911d494c9e51e5b004f8ec0f885932ee Mon Sep 17 00:00:00 2001 From: J M Date: Thu, 14 Aug 2025 14:02:08 +0800 Subject: [PATCH 420/737] [longjob]: split job and progress db update prevent db deadlock. Resolves: ZSTAC-64058 Change-Id: I7a677a6a69736c71746462796d61637279647563 --- .../src/main/java/org/zstack/longjob/LongJobUtils.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/longjob/src/main/java/org/zstack/longjob/LongJobUtils.java b/longjob/src/main/java/org/zstack/longjob/LongJobUtils.java index 675f208e41a..c99cd6589e0 100644 --- a/longjob/src/main/java/org/zstack/longjob/LongJobUtils.java +++ b/longjob/src/main/java/org/zstack/longjob/LongJobUtils.java @@ -112,7 +112,8 @@ public static boolean jobCompleted(LongJobVO vo) { } static LongJobVO updateByUuid(String uuid, Consumer consumer) { - return new SQLBatchWithReturn(){ + final boolean[] jobCompleted = {false}; + LongJobVO job = new SQLBatchWithReturn(){ @Override protected LongJobVO scripts() { @@ -123,7 +124,7 @@ protected LongJobVO scripts() { if (jobCompleted(job)) { setExecuteTimeIfNeed(job); - cleanProgress(job); + jobCompleted[0] = true; } if (originState != newState) { @@ -134,6 +135,10 @@ protected LongJobVO scripts() { return job; } }.execute(); + if (jobCompleted[0]) { + cleanProgress(job); + } + return job; } static LongJobVO changeState(String uuid, LongJobStateEvent stateEvent) { From fe1e818e560ead2b19444e571c53771cee41c784 Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Mon, 17 Feb 2025 09:49:28 +0800 Subject: [PATCH 421/737] [testlib]: add get metric labels (/labels) Resolves: ZSTAC-67037 Change-Id: I6872657567656e62667977616874746770616569 --- .../GetPrometheusMetricLabelValueAction.java | 110 ++++++++++++++++++ .../GetPrometheusMetricLabelValueResult.java | 14 +++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ 3 files changed, 151 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/zwatch/api/GetPrometheusMetricLabelValueAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/zwatch/api/GetPrometheusMetricLabelValueResult.java diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetPrometheusMetricLabelValueAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetPrometheusMetricLabelValueAction.java new file mode 100644 index 00000000000..966d8ed7114 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetPrometheusMetricLabelValueAction.java @@ -0,0 +1,110 @@ +package org.zstack.sdk.zwatch.api; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetPrometheusMetricLabelValueAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.zwatch.api.GetPrometheusMetricLabelValueResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String namespace; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String metricName; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {0L,253402271999L}, noTrim = false) + public java.lang.Long startTime; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {0L,253402271999L}, noTrim = false) + public java.lang.Long endTime; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List labelNames; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List filterLabels; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.zwatch.api.GetPrometheusMetricLabelValueResult value = res.getResult(org.zstack.sdk.zwatch.api.GetPrometheusMetricLabelValueResult.class); + ret.value = value == null ? new org.zstack.sdk.zwatch.api.GetPrometheusMetricLabelValueResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/zwatch/metrics/prometheus/label-values"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetPrometheusMetricLabelValueResult.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetPrometheusMetricLabelValueResult.java new file mode 100644 index 00000000000..62a3157e5bd --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetPrometheusMetricLabelValueResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.zwatch.api; + + + +public class GetPrometheusMetricLabelValueResult { + public java.util.Map labelValues; + public void setLabelValues(java.util.Map labelValues) { + this.labelValues = labelValues; + } + public java.util.Map getLabelValues() { + return this.labelValues; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 81302325323..8ca0387821e 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -53732,6 +53732,33 @@ abstract class ApiHelper { } + def getPrometheusMetricLabelValue(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.zwatch.api.GetPrometheusMetricLabelValueAction.class) Closure c) { + def a = new org.zstack.sdk.zwatch.api.GetPrometheusMetricLabelValueAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def getZWatchAlertHistogram(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.zwatch.api.GetZWatchAlertHistogramAction.class) Closure c) { def a = new org.zstack.sdk.zwatch.api.GetZWatchAlertHistogramAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 58dddd64ef108bb916aba2e6b489951b18766f1c Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Mon, 21 Jul 2025 13:31:40 +0800 Subject: [PATCH 422/737] [sdnController]: support h3c v2 vcfc sdn controller Resolves: ZSTAC-76071 Change-Id: I6868776c80a8a2ffa5b541839725d42f31e84cd1 --- conf/db/upgrade/V5.3.46__schema.sql | 30 + conf/persistence.xml | 2 + conf/serviceConfig/sdnController.xml | 4 + conf/springConfigXml/sdnController.xml | 11 + .../l3/AfterDeleteIpRangeExtensionPoint.java | 10 + .../org/zstack/network/l3/L3BasicNetwork.java | 11 + .../zstack/sdnController/SdnController.java | 2 + .../SdnControllerApiInterceptor.java | 71 +- .../sdnController/SdnControllerBase.java | 238 ++++++- .../SdnControllerGlobalConfig.java | 21 + .../zstack/sdnController/SdnControllerL2.java | 8 +- .../SdnControllerManagerImpl.java | 143 +++- .../sdnController/SdnControllerPingMsg.java | 20 + .../sdnController/SdnControllerPingReply.java | 18 + .../SdnControllerPingTracker.java | 156 ++++ .../h3cVcfc/H3cVcfcApiInterceptor.java | 103 ++- .../h3cVcfc/H3cVcfcCommands.java | 2 +- .../h3cVcfc/H3cVcfcHttpClient.java | 15 +- .../h3cVcfc/H3cVcfcSdnController.java | 206 ++++-- .../h3cVcfc/H3cVcfcSdnControllerFactory.java | 15 +- .../H3cVcfcSdnControllerGlobalProperty.java | 3 + .../H3cVcfcSdnControllerSystemTags.java | 6 + .../h3cVcfc/H3cVcfcV2Commands.java | 116 +++ .../h3cVcfc/H3cVcfcV2SdnController.java | 674 ++++++++++++++++++ .../hardwareVxlan/HardwareVxlanNetwork.java | 4 +- .../HardwareVxlanNetworkExtensionPoint.java | 3 +- .../HardwareVxlanNetworkFactory.java | 2 +- .../header/APIAddSdnControllerMsg.java | 11 + .../APICreateL2HardwareVxlanNetworkMsg.java | 13 + ...eL2HardwareVxlanNetworkMsgDoc_zh_cn.groovy | 9 + .../APIPullSdnControllerTenantEvent.java | 38 + ...llSdnControllerTenantEventDoc_zh_cn.groovy | 32 + .../header/APIPullSdnControllerTenantMsg.java | 43 ++ ...PullSdnControllerTenantMsgDoc_zh_cn.groovy | 58 ++ .../H3cSdnControllerTenantInventory.java | 134 ++++ ...nControllerTenantInventoryDoc_zh_cn.groovy | 69 ++ .../header/H3cSdnControllerTenantVO.java | 132 ++++ .../header/H3cSdnControllerTenantVO_.java | 22 + .../header/H3cSdnSubnetIpRangeRefVO.java | 109 +++ .../header/H3cSdnSubnetIpRangeRefVO_.java | 19 + .../header/PullSdnControllerTenantMsg.java | 25 + .../header/PullSdnControllerTenantReply.java | 20 + .../header/ReconnectSdnControllerMsg.java | 12 +- .../header/SdnControllerConstant.java | 15 + .../header/SdnControllerInventory.java | 10 + .../sdnController/header/SdnControllerVO.java | 11 + .../controller/SugonSdnController.java | 2 +- sdk/src/main/java/SourceClassMap.java | 2 + .../zstack/sdk/AddSdnControllerAction.java | 3 + .../CreateL2HardwareVxlanNetworkAction.java | 3 + .../sdk/GetAvailableVpcL3NetworkAction.java | 95 +++ .../sdk/GetAvailableVpcL3NetworkResult.java | 14 + .../sdk/H3cSdnControllerTenantInventory.java | 87 +++ .../sdk/PullSdnControllerTenantAction.java | 101 +++ .../sdk/PullSdnControllerTenantResult.java | 14 + .../zstack/sdk/SdnControllerInventory.java | 8 + .../sdnController/SdnControllerCase.groovy | 250 ++++++- .../java/org/zstack/testlib/ApiHelper.groovy | 27 + .../zstack/testlib/SdnControllerSpec.groovy | 35 +- 59 files changed, 3204 insertions(+), 113 deletions(-) create mode 100644 conf/db/upgrade/V5.3.46__schema.sql create mode 100644 header/src/main/java/org/zstack/header/network/l3/AfterDeleteIpRangeExtensionPoint.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerGlobalConfig.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingMsg.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingReply.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2Commands.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantEvent.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantEventDoc_zh_cn.groovy create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsg.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsgDoc_zh_cn.groovy create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantInventory.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantInventoryDoc_zh_cn.groovy create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantVO.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantVO_.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO_.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/PullSdnControllerTenantMsg.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/PullSdnControllerTenantReply.java create mode 100644 sdk/src/main/java/org/zstack/sdk/GetAvailableVpcL3NetworkAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/GetAvailableVpcL3NetworkResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/H3cSdnControllerTenantInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/PullSdnControllerTenantAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/PullSdnControllerTenantResult.java diff --git a/conf/db/upgrade/V5.3.46__schema.sql b/conf/db/upgrade/V5.3.46__schema.sql new file mode 100644 index 00000000000..baa5c2ff9c4 --- /dev/null +++ b/conf/db/upgrade/V5.3.46__schema.sql @@ -0,0 +1,30 @@ + +CALL ADD_COLUMN('SdnControllerVO', 'vendorVersion', 'VARCHAR(32)', 0, 'V1'); + +CREATE TABLE IF NOT EXISTS `zstack`.`H3cSdnControllerTenantVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `sdnControllerUuid` varchar(32) NOT NULL, + `tenantUuid` varchar(255) DEFAULT NULL, + `vdsUuid` varchar(255) DEFAULT NULL, + `tenantName` varchar(255) DEFAULT NULL, + `vdsName` varchar(255) DEFAULT NULL, + `cloudDomainName` varchar(255) DEFAULT NULL, + `state` varchar(32) NOT NULL DEFAULT "Enabled", + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`), + CONSTRAINT `fkH3cSdnControllerTenantVOSdnControllerVO` FOREIGN KEY (`sdnControllerUuid`) REFERENCES `SdnControllerVO` (`uuid`) ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`H3cSdnSubnetIpRangeRefVO` ( + `id` BIGINT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT, + `sdnControllerUuid` varchar(32) NOT NULL, + `ipRangeUuid` varchar(32) NOT NULL, + `subnetUuid` varchar(255) NOT NULL, + `l2NetworkUuid` varchar(32) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + CONSTRAINT `fkH3cSdnSubnetIpRangeRefVOSdnControllerVO` FOREIGN KEY (`sdnControllerUuid`) REFERENCES `SdnControllerVO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkH3cSdnSubnetIpRangeRefVOIpRangeVO` FOREIGN KEY (`ipRangeUuid`) REFERENCES `IpRangeEO` (`uuid`) ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/conf/persistence.xml b/conf/persistence.xml index 574b57cfb14..26537f82958 100755 --- a/conf/persistence.xml +++ b/conf/persistence.xml @@ -197,6 +197,8 @@ org.zstack.sdnController.header.VxlanHostMappingVO org.zstack.sdnController.header.VxlanClusterMappingVO org.zstack.sdnController.header.SdnControllerHostRefVO + org.zstack.sdnController.header.H3cSdnControllerTenantVO + org.zstack.sdnController.header.H3cSdnSubnetIpRangeRefVO org.zstack.header.volume.VolumeHostRefVO org.zstack.directory.DirectoryVO org.zstack.directory.ResourceDirectoryRefVO diff --git a/conf/serviceConfig/sdnController.xml b/conf/serviceConfig/sdnController.xml index 7710a022210..ac74c9fe8bb 100644 --- a/conf/serviceConfig/sdnController.xml +++ b/conf/serviceConfig/sdnController.xml @@ -35,4 +35,8 @@ org.zstack.sdnController.header.APIQuerySdnControllerMsg query + + + org.zstack.sdnController.header.APIPullSdnControllerTenantMsg + \ No newline at end of file diff --git a/conf/springConfigXml/sdnController.xml b/conf/springConfigXml/sdnController.xml index 068e846cffc..1ec7a6b49b8 100644 --- a/conf/springConfigXml/sdnController.xml +++ b/conf/springConfigXml/sdnController.xml @@ -32,6 +32,8 @@ + + @@ -92,4 +94,13 @@ + + + + + + + + + diff --git a/header/src/main/java/org/zstack/header/network/l3/AfterDeleteIpRangeExtensionPoint.java b/header/src/main/java/org/zstack/header/network/l3/AfterDeleteIpRangeExtensionPoint.java new file mode 100644 index 00000000000..70833859dfc --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/l3/AfterDeleteIpRangeExtensionPoint.java @@ -0,0 +1,10 @@ +package org.zstack.header.network.l3; + +import org.zstack.header.core.Completion; + +/** + * Created by boce.wang on 07/01/2025. + */ +public interface AfterDeleteIpRangeExtensionPoint { + void afterDeleteIpRange(IpRangeInventory ipr); +} diff --git a/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java b/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java index 55e316c0ab2..6e26273bd66 100755 --- a/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java +++ b/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java @@ -284,6 +284,17 @@ public void run(IpRangeDeletionExtensionPoint arg) { }); trigger.next(); } + }).then(new NoRollbackFlow() { + String __name__ = "after-delete-ip-range"; + + @Override + public void run (FlowTrigger trigger, Map data){ + CollectionUtils.safeForEach( + pluginRgty.getExtensionList(AfterDeleteIpRangeExtensionPoint.class), + ext -> ext.afterDeleteIpRange(inv) + ); + trigger.next(); + } }).error(new FlowErrorHandler(msg) { @Override public void handle(ErrorCode errCode, Map data) { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java index a27a42161be..61d37fa9098 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java @@ -18,6 +18,8 @@ public interface SdnController { void deleteSdnController(SdnControllerDeletionMsg msg, SdnControllerInventory sdn, Completion completion); + default void reconnectSdnController(Completion completion) {completion.success();}; + default void addHost(APISdnControllerAddHostMsg msg, Completion completion) {completion.success();}; default void removeHost(SdnControllerRemoveHostMsg msg, Completion completion) {completion.success();}; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java index 77b621119dc..09b93bdc611 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java @@ -11,26 +11,25 @@ import org.zstack.header.apimediator.ApiMessageInterceptor; import org.zstack.header.apimediator.GlobalApiMessageInterceptor; import org.zstack.header.message.APIMessage; -import org.zstack.header.network.l2.APIAttachL2NetworkToClusterMsg; -import org.zstack.header.network.l2.APICreateL2NoVlanNetworkMsg; -import org.zstack.header.network.l2.APICreateL2VlanNetworkMsg; import org.zstack.header.network.l2.L2NetworkConstant; +import org.zstack.header.network.l3.L3NetworkVO; +import org.zstack.header.network.l3.L3NetworkVO_; import org.zstack.header.vm.APIAttachL3NetworkToVmMsg; import org.zstack.header.vm.APIChangeVmNicNetworkMsg; import org.zstack.header.vm.VmInstanceVO; import org.zstack.header.vm.VmNicVO; -import org.zstack.network.l2.vxlan.vxlanNetwork.APICreateL2VxlanNetworkMsg; +import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; +import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO_; import org.zstack.network.l3.L3NetworkHelper; import org.zstack.network.securitygroup.*; import org.zstack.sdnController.header.*; -import org.zstack.utils.ObjectUtils; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; import org.zstack.utils.network.NetworkUtils; +import java.util.List; import java.lang.reflect.Type; import java.util.ArrayList; -import java.util.List; import java.util.Map; import static org.zstack.core.Platform.argerr; @@ -61,6 +60,7 @@ public List getMessageClassToIntercept() { ret.add(APIAddSecurityGroupRuleMsg.class); ret.add(APIAttachL3NetworkToVmMsg.class); ret.add(APIChangeVmNicNetworkMsg.class); + ret.add(APIPullSdnControllerTenantMsg.class); return ret; } @@ -90,6 +90,8 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti validate((APIAttachL3NetworkToVmMsg) msg); } else if (msg instanceof APIChangeVmNicNetworkMsg) { validate((APIChangeVmNicNetworkMsg) msg); + } else if (msg instanceof APIPullSdnControllerTenantMsg) { + validate((APIPullSdnControllerTenantMsg) msg); } setServiceId(msg); @@ -109,6 +111,16 @@ private void validate(APIAttachL3NetworkToVmMsg msg) { "because sdn controller[uuid:%s] is not find", sdnControlerUuid)); } + if (SdnControllerConstant.H3C_VCFC_CONTROLLER.equals(controllerVO.getVendorType()) && + SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2.equals(controllerVO.getVendorVersion())) { + validateH3cTenantStatus(msg.getL3NetworkUuid(), sdnControlerUuid); + return; + } + + if (SdnControllerConstant.H3C_VCFC_CONTROLLER.equals(controllerVO.getVendorType())) { + return; + } + VmInstanceVO vmVo = dbf.findByUuid(msg.getVmInstanceUuid(), VmInstanceVO.class); boolean found = false; for (SdnControllerHostRefVO ref : controllerVO.getHostRefVOS()) { @@ -129,7 +141,7 @@ private void validate(APIChangeVmNicNetworkMsg msg) { if (sdnControlerUuid == null) { return; } - + SdnControllerVO controllerVO = dbf.findByUuid(sdnControlerUuid, SdnControllerVO.class); if (controllerVO == null) { throw new ApiMessageInterceptionException(argerr("could not change vmnic to l3network[uuid:%s], " + @@ -287,4 +299,49 @@ private void validate(APISdnControllerChangeHostMsg msg) { } } + private void validateH3cTenantStatus(String l3NetworkUuid, String sdnControllerUuid) { + String l2NetworkUuid = Q.New(L3NetworkVO.class) + .eq(L3NetworkVO_.uuid, l3NetworkUuid) + .select(L3NetworkVO_.l2NetworkUuid) + .findValue(); + if (l2NetworkUuid == null) { + return; + } + VxlanNetworkVO vxlanVO = Q.New(VxlanNetworkVO.class) + .eq(VxlanNetworkVO_.uuid, l2NetworkUuid) + .find(); + if (vxlanVO == null) { + return; + } + HardwareL2VxlanNetworkPoolVO poolVO = Q.New(HardwareL2VxlanNetworkPoolVO.class) + .eq(HardwareL2VxlanNetworkPoolVO_.uuid, vxlanVO.getPoolUuid()) + .find(); + if (vxlanVO.getPoolUuid() == null || poolVO == null || !sdnControllerUuid.equals(poolVO.getSdnControllerUuid())) { + return; + } + boolean hasDisabledTenants = Q.New(H3cSdnControllerTenantVO.class) + .eq(H3cSdnControllerTenantVO_.sdnControllerUuid, sdnControllerUuid) + .eq(H3cSdnControllerTenantVO_.state, SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_DISABLE) + .isExists(); + if (hasDisabledTenants) { + throw new ApiMessageInterceptionException(argerr("Cannot attach L3 network to VM because some tenants in SDN controller[uuid:%s] have been deleted. " + + "Please run tenant synchronization first to update tenant status", sdnControllerUuid)); + } + } + + private void validate(APIPullSdnControllerTenantMsg msg) { + SdnControllerVO sdnControllerVO = dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class); + if (sdnControllerVO == null) { + throw new ApiMessageInterceptionException(argerr("SDN controller[uuid:%s] not found", msg.getSdnControllerUuid())); + } + + // Only H3C_VCFC_CONTROLLER with vendorVersion H3C_VCFC_VENDOR_VERSION_V2 supports pull tenant operation + if (!SdnControllerConstant.H3C_VCFC_CONTROLLER.equals(sdnControllerVO.getVendorType()) || + !SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2.equals(sdnControllerVO.getVendorVersion())) { + throw new ApiMessageInterceptionException(argerr("Pull tenant operation is not supported for SDN controller[uuid:%s, vendorType:%s, vendorVersion:%s]. " + + "Only H3C VCFC V2 controllers support this operation", + msg.getSdnControllerUuid(), sdnControllerVO.getVendorType(), sdnControllerVO.getVendorVersion())); + } + } + } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java index 4de06d6eaf7..8b8a52b3c3a 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java @@ -5,6 +5,7 @@ import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; +import org.zstack.core.Platform; import org.zstack.core.asyncbatch.While; import org.zstack.core.cascade.CascadeConstant; import org.zstack.core.cascade.CascadeFacade; @@ -19,7 +20,6 @@ import org.zstack.core.thread.SyncTaskChain; import org.zstack.core.thread.ThreadFacade; import org.zstack.core.workflow.FlowChainBuilder; -import org.zstack.header.apimediator.ApiMessageInterceptionException; import org.zstack.header.core.Completion; import org.zstack.header.core.NopeCompletion; import org.zstack.header.core.WhileDoneCompletion; @@ -34,6 +34,8 @@ import org.zstack.network.hostNetworkInterface.HostNetworkInterfaceVO; import org.zstack.network.hostNetworkInterface.HostNetworkInterfaceVO_; import org.zstack.sdnController.header.*; +import org.zstack.sdnController.h3cVcfc.H3cVcfcV2Commands; +import org.zstack.sdnController.h3cVcfc.H3cVcfcV2SdnController; import org.zstack.utils.Utils; import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; @@ -45,6 +47,7 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.argerr; +import static org.zstack.core.Platform.operr; import static org.zstack.sdnController.header.SdnControllerFlowDataParam.SDN_CONTROLLER_UUID; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) @@ -64,6 +67,8 @@ public class SdnControllerBase { SdnControllerManager sdnMgr; @Autowired private PluginRegistry pluginRgty; + @Autowired + private SdnControllerPingTracker pingTracker; public SdnControllerVO self; @@ -100,8 +105,12 @@ public void handleMessage(SdnControllerMessage msg) { handle((APIReconnectSdnControllerMsg) msg); } else if (msg instanceof APISdnControllerChangeHostMsg) { handle((APISdnControllerChangeHostMsg) msg); + } else if (msg instanceof APIPullSdnControllerTenantMsg) { + handle((APIPullSdnControllerTenantMsg) msg); } else if (msg instanceof SdnControllerRemoveHostMsg) { handle((SdnControllerRemoveHostMsg) msg); + } else if (msg instanceof PullSdnControllerTenantMsg) { + handle((PullSdnControllerTenantMsg) msg); } else if (msg instanceof ReconnectSdnControllerMsg) { handle((ReconnectSdnControllerMsg) msg); } else { @@ -212,6 +221,24 @@ public void rollback(FlowRollback trigger, Map data) { changeSdnControllerStatus(SdnControllerStatus.Disconnected); trigger.rollback(); } + }).then(new NoRollbackFlow() { + String __name__ = "reconnect-to-sdn-controller"; + + @Override + public void run(FlowTrigger trigger, Map data) { + SdnController controller = getSdnController(); + controller.reconnectSdnController(new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } }).then(new NoRollbackFlow() { String __name__ = "change-sdn-controller-status-to-connected"; @@ -696,6 +723,7 @@ public void fail(ErrorCode errorCode) { String __name__ = "delete-sdn-controller-on-db"; @Override public void run(FlowTrigger trigger, Map data) { + pingTracker.untrack(msg.getSdnControllerUuid()); dbf.removeByPrimaryKey(msg.getSdnControllerUuid(), SdnControllerVO.class); trigger.next(); } @@ -841,4 +869,212 @@ private void handle(APIUpdateSdnControllerMsg msg) { event.setInventory(SdnControllerInventory.valueOf(vo)); bus.publish(event); } + + private void handle(APIPullSdnControllerTenantMsg amsg) { + APIPullSdnControllerTenantEvent event = new APIPullSdnControllerTenantEvent(amsg.getId()); + + PullSdnControllerTenantMsg msg = PullSdnControllerTenantMsg.fromApi(amsg); + pullSdnControllerTenant(msg, new Completion(msg) { + @Override + public void success() { + // After synchronization is complete, query and return the latest tenant data + List tenantVOs = Q.New(H3cSdnControllerTenantVO.class) + .eq(H3cSdnControllerTenantVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .list(); + List inventories = H3cSdnControllerTenantInventory.valueOf(tenantVOs); + event.setInventories(inventories); + bus.publish(event); + } + + @Override + public void fail(ErrorCode errorCode) { + event.setError(errorCode); + bus.publish(event); + } + }); + } + + private void handle(PullSdnControllerTenantMsg msg) { + PullSdnControllerTenantReply reply = new PullSdnControllerTenantReply(); + + pullSdnControllerTenant(msg, new Completion(msg) { + @Override + public void success() { + // After synchronization is complete, query and return the latest tenant data + List tenantVOs = Q.New(H3cSdnControllerTenantVO.class) + .eq(H3cSdnControllerTenantVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .list(); + List inventories = H3cSdnControllerTenantInventory.valueOf(tenantVOs); + reply.setInventories(inventories); + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } + + private void pullSdnControllerTenant(PullSdnControllerTenantMsg msg, Completion completion) { + // Only H3C VCFC V2 controllers support this operation, already validated in interceptor + // But confirm again here to ensure type safety + if (!SdnControllerConstant.H3C_VCFC_CONTROLLER.equals(self.getVendorType()) || + !SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2.equals(self.getVendorVersion())) { + completion.fail(operr("Pull tenant operation is only supported for H3C VCFC V2 controllers")); + return; + } + + // Get the correct controller instance through factory + SdnControllerFactory factory = sdnMgr.getSdnControllerFactory(self.getVendorType()); + H3cVcfcV2SdnController h3cController = (H3cVcfcV2SdnController) factory.getSdnController(self); + + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("pull-tenant-for-h3c-sdn-%s", self.getUuid())); + chain.then(new NoRollbackFlow() { + String __name__ = "pull-h3c-vds-tenant"; + + @Override + public void run(FlowTrigger trigger, Map data) { + try { + // Directly get all tenant information + h3cController.getH3cControllerToken(new Completion(trigger) { + @Override + public void success() { + List apiTenants = h3cController.getAllH3cTenants(); + syncTenantData(msg.getSdnControllerUuid(), apiTenants, trigger); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } catch (Exception e) { + trigger.fail(operr("Failed to pull tenant data: %s", e.getMessage())); + } + } + }).then(new NoRollbackFlow() { + String __name__ = "pull-h3c-vni-ranges"; + + @Override + public void run(FlowTrigger trigger, Map data) { + h3cController.getH3cVniRanges(new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); + } + + private void syncTenantData(String sdnControllerUuid, List apiTenants, FlowTrigger trigger) { + // Check if API response is valid (non-empty list indicates valid response with default tenant) + if (apiTenants == null || apiTenants.isEmpty()) { + logger.warn(String.format("Failed to pull tenant data for sdn controller [%s], no tenant data returned by API", sdnControllerUuid)); + trigger.next(); + return; + } + + // Query existing tenant records in database + List existingTenants = Q.New(H3cSdnControllerTenantVO.class) + .eq(H3cSdnControllerTenantVO_.sdnControllerUuid, sdnControllerUuid) + .list(); + + // Create mapping table for easy lookup + Map existingTenantMap = new HashMap<>(); + for (H3cSdnControllerTenantVO tenant : existingTenants) { + String key = generateTenantKey(tenant.getTenantUuid(), tenant.getVdsUuid()); + existingTenantMap.put(key, tenant); + } + + Set apiTenantKeys = new HashSet<>(); + List tenantsToSave = new ArrayList<>(); + + // Process tenant data returned by API + for (H3cVcfcV2Commands.H3cTenantStruct apiTenant : apiTenants) { + if (apiTenant.vds_list != null && !apiTenant.vds_list.isEmpty()) { + String vdsUuid = apiTenant.vds_list.get(0); + String key = generateTenantKey(apiTenant.id, vdsUuid); + apiTenantKeys.add(key); + + H3cSdnControllerTenantVO existingTenant = existingTenantMap.get(key); + if (existingTenant == null) { + // New tenant, create record + H3cSdnControllerTenantVO newTenant = new H3cSdnControllerTenantVO(); + newTenant.setUuid(Platform.getUuid()); + newTenant.setSdnControllerUuid(sdnControllerUuid); + newTenant.setTenantUuid(apiTenant.id); + newTenant.setVdsUuid(vdsUuid); + newTenant.setTenantName(apiTenant.name); + newTenant.setVdsName(getVdsName(vdsUuid)); // Get VDS name + newTenant.setCloudDomainName(apiTenant.cloud_domain_name); + newTenant.setState(SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_ENABLE); + tenantsToSave.add(newTenant); + } else { + // Existing tenant, check if update is needed + boolean needUpdate = false; + if (!Objects.equals(existingTenant.getTenantName(), apiTenant.name)) { + existingTenant.setTenantName(apiTenant.name); + needUpdate = true; + } + if (!Objects.equals(existingTenant.getCloudDomainName(), apiTenant.cloud_domain_name)) { + existingTenant.setCloudDomainName(apiTenant.cloud_domain_name); + needUpdate = true; + } + // Ensure tenants found in API response are marked as enabled + if (!SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_ENABLE.equals(existingTenant.getState())) { + existingTenant.setState(SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_ENABLE); + needUpdate = true; + } + if (needUpdate) { + tenantsToSave.add(existingTenant); + } + } + } + } + + // Handle tenants that exist in database but not in API (soft delete) + for (H3cSdnControllerTenantVO existingTenant : existingTenants) { + String key = generateTenantKey(existingTenant.getTenantUuid(), existingTenant.getVdsUuid()); + if (!apiTenantKeys.contains(key) && !SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_DISABLE.equals(existingTenant.getState())) { + existingTenant.setState(SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_DISABLE); + tenantsToSave.add(existingTenant); + } + } + + // Batch save updates + if (!tenantsToSave.isEmpty()) { + dbf.updateCollection(tenantsToSave); + } + + trigger.next(); + } + + private String generateTenantKey(String tenantUuid, String vdsUuid) { + return String.format("%s-%s", tenantUuid != null ? tenantUuid : "", vdsUuid != null ? vdsUuid : ""); + } + + private String getVdsName(String vdsUuid) { + // TODO: Implement logic to get VDS name + // May need to query related VDS table or get VDS name from other sources + return vdsUuid; // Temporarily return UUID as name + } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerGlobalConfig.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerGlobalConfig.java new file mode 100644 index 00000000000..0b6a081c454 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerGlobalConfig.java @@ -0,0 +1,21 @@ +package org.zstack.sdnController; + +import org.zstack.core.config.GlobalConfig; +import org.zstack.core.config.GlobalConfigDef; +import org.zstack.core.config.GlobalConfigDefinition; +import org.zstack.core.config.GlobalConfigValidation; + +/** + */ +@GlobalConfigDefinition +public class SdnControllerGlobalConfig { + public static final String CATEGORY = "sdnController"; + + @GlobalConfigValidation(numberGreaterThan = 1) + @GlobalConfigDef(defaultValue = "60", type = Long.class, description = "The interval management server sends ping command to sdn controller, in seconds") + public static GlobalConfig PING_INTERVAL = new GlobalConfig(CATEGORY, "ping.interval"); + + @GlobalConfigValidation(numberGreaterThan = 0, numberLessThan = 100) + @GlobalConfigDef(defaultValue = "5", type = Long.class, description = "The max number of management server sends ping commands to sdn controller in parallel") + public static GlobalConfig PING_PARALLELISM_DEGREE = new GlobalConfig(CATEGORY, "ping.parallelismDegree"); +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java index 812562148df..312f391f2bc 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java @@ -1,7 +1,10 @@ package org.zstack.sdnController; import org.zstack.header.core.Completion; +import org.zstack.header.network.l2.APICreateL2NetworkMsg; import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.network.l3.IpRangeInventory; +import org.zstack.header.network.l3.L3NetworkInventory; import org.zstack.header.vm.VmNicInventory; import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; import org.zstack.sdnController.header.SdnControllerDeletionMsg; @@ -15,7 +18,7 @@ public interface SdnControllerL2 { void preCreateVxlanNetwork(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); - void createL2Network(L2NetworkInventory inv, List systemTags, Completion completion); + void createL2Network(L2NetworkInventory inv, APICreateL2NetworkMsg msg, Completion completion); void postCreateVxlanNetwork(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); void preAttachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); @@ -33,4 +36,7 @@ public interface SdnControllerL2 { default void addVmNics(List nics, Completion completion) {completion.success();}; default void removeVmNics(List nics, Completion completion) {completion.success();}; + + default void addL3NetworkIpRange(L3NetworkInventory inv, IpRangeInventory ipr, Completion completion) {completion.success();}; + default void deleteL3NetworkIpRange(L3NetworkInventory inv, IpRangeInventory ipr, Completion completion) {completion.success();}; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java index 2d512196647..9c4aa23adc1 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java @@ -19,8 +19,7 @@ import org.zstack.header.message.Message; import org.zstack.header.network.NetworkException; import org.zstack.header.network.l2.*; -import org.zstack.header.network.l3.L3NetworkInventory; -import org.zstack.header.network.l3.L3NetworkVO; +import org.zstack.header.network.l3.*; import org.zstack.header.network.service.GetSdnControllerDhcpExtensionPoint; import org.zstack.header.network.service.SdnControllerDhcp; import org.zstack.header.vm.*; @@ -31,6 +30,7 @@ import org.zstack.network.securitygroup.SecurityGroupSdnBackend; import org.zstack.sdnController.header.*; import org.zstack.tag.TagManager; +import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; @@ -42,7 +42,7 @@ public class SdnControllerManagerImpl extends AbstractService implements SdnCont L2NetworkCreateExtensionPoint, L2NetworkDeleteExtensionPoint, InstantiateResourceOnAttachingNicExtensionPoint, PreVmInstantiateResourceExtensionPoint, VmReleaseResourceExtensionPoint, ReleaseNetworkServiceOnDetachingNicExtensionPoint, SecurityGroupGetSdnBackendExtensionPoint, - GetSdnControllerDhcpExtensionPoint { + GetSdnControllerDhcpExtensionPoint, AfterAddIpRangeExtensionPoint, IpRangeDeletionExtensionPoint { private static final CLogger logger = Utils.getLogger(SdnControllerManagerImpl.class); @Autowired @@ -55,6 +55,8 @@ public class SdnControllerManagerImpl extends AbstractService implements SdnCont private TagManager tagMgr; @Autowired private SecurityGroupManager sgMgr; + @Autowired + private SdnControllerPingTracker pingTracker; private Map sdnControllerFactories = Collections.synchronizedMap(new HashMap()); @@ -181,6 +183,7 @@ public void fail(ErrorCode errorCode) { @Override public void handle(Map data) { logger.debug(String.format("successfully create sdn controller")); + pingTracker.track(vo.getUuid()); completion.success(); } }); @@ -199,6 +202,7 @@ private void handle(APIAddSdnControllerMsg msg) { SdnControllerVO vo = new SdnControllerVO(); vo.setVendorType(msg.getVendorType()); + vo.setVendorVersion(msg.getVendorVersion() == null ? SdnControllerConstant.DEFAULT_VENDOR_VERSION : msg.getVendorVersion()); if (msg.getResourceUuid() != null) { vo.setUuid(msg.getResourceUuid()); } else { @@ -240,30 +244,36 @@ public void postCreateL2Network(L2NetworkInventory l2Network, APICreateL2Network completion.success(); return; } - - String sdnControllerUuid = null; - for (String systag : msg.getSystemTags()) { - if (L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.isMatch(systag)) { - sdnControllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByTag( - systag, L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); + SdnControllerVO sdnControllerVO = getSdnControllerVO(l2Network); + if (sdnControllerVO == null) { + String sdnControllerUuid = null; + List sysTags = msg.getSystemTags(); + if (sysTags == null || sysTags.isEmpty()) { + completion.fail(operr("cannot create sdn l2 network because sdn controller uuid is missing from systemTags in API message")); + return; + } + for (String systag : sysTags) { + if (L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.isMatch(systag)) { + sdnControllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByTag( + systag, L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); + } } - } - - if (sdnControllerUuid == null) { - completion.fail(operr("can not create sdn l2 network because there is not sdn controller uuid in api message")); - return; - } - SdnControllerVO vo = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); - if (vo == null) { - completion.fail(operr("can not found sdn controller for l2 network[uuid:%s, vswitchType:%s]", - l2Network.getUuid(), l2Network.getvSwitchType())); - return; + if (sdnControllerUuid == null) { + completion.fail(operr("cannot create sdn l2 network because sdn controller uuid is missing from API message")); + return; + } + sdnControllerVO = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); + if (sdnControllerVO == null) { + completion.fail(operr("cannot find sdn controller for l2 network[uuid:%s, vswitchType:%s]", + l2Network.getUuid(), l2Network.getvSwitchType())); + return; + } } - SdnControllerFactory factory = getSdnControllerFactory(vo.getVendorType()); - SdnControllerL2 controller = factory.getSdnControllerL2(vo); - controller.createL2Network(l2Network, msg.getSystemTags(), completion); + SdnControllerFactory factory = getSdnControllerFactory(sdnControllerVO.getVendorType()); + SdnControllerL2 controller = factory.getSdnControllerL2(sdnControllerVO); + controller.createL2Network(l2Network, msg, completion); } @Override @@ -730,4 +740,91 @@ public boolean stop() { } + @Override + public void afterAddIpRange(IpRangeInventory ipr, List systemTags) { + L3NetworkVO l3vo = dbf.findByUuid(ipr.getL3NetworkUuid(), L3NetworkVO.class); + if (l3vo == null) { + logger.warn(String.format( + "l3 network[uuid:%s] not found when adding ipRange[uuid:%s], skip syncing to sdn controller", + ipr.getL3NetworkUuid(), ipr.getUuid())); + return; + } + L3NetworkInventory l3Network = L3NetworkInventory.valueOf(l3vo); + SdnControllerVO sdnControllerVO = getSdnControllerVO(l3Network); + if (sdnControllerVO == null) { + return; + } + SdnControllerFactory factory = getSdnControllerFactory(sdnControllerVO.getVendorType()); + SdnControllerL2 controller = factory.getSdnControllerL2(sdnControllerVO); + controller.addL3NetworkIpRange(l3Network, ipr, new Completion(null) { + @Override + public void success() { + logger.debug(String.format("success to create l3 network[uuid:%s] ipRange on sdn controller[uuid:%s]", + l3Network.getUuid(), sdnControllerVO.getUuid())); + } + + @Override + public void fail(ErrorCode errorCode) { + logger.warn(String.format("failed to create l3 network[uuid:%s] ipRange on sdn controller[uuid:%s], because: %s", + l3Network.getUuid(), sdnControllerVO.getUuid(), errorCode.getDetails())); + } + }); + } + + @Override + public void preDeleteIpRange(IpRangeInventory ipRange) { + } + + @Override + public void beforeDeleteIpRange(IpRangeInventory ipRange) { + } + + @Override + public void afterDeleteIpRange(IpRangeInventory ipRange) { + L3NetworkVO l3vo = dbf.findByUuid(ipRange.getL3NetworkUuid(), L3NetworkVO.class); + if (l3vo == null) { + logger.warn(String.format("l3 network[uuid:%s] not found when deleting ipRange[uuid:%s], skip syncing to sdn controller", + ipRange.getL3NetworkUuid(), ipRange.getUuid())); + return; + } + L3NetworkInventory l3Network = L3NetworkInventory.valueOf(l3vo); + SdnControllerVO sdnControllerVO = getSdnControllerVO(l3Network); + if (sdnControllerVO == null) { + return; + } + SdnControllerFactory factory = getSdnControllerFactory(sdnControllerVO.getVendorType()); + SdnControllerL2 controller = factory.getSdnControllerL2(sdnControllerVO); + controller.deleteL3NetworkIpRange(l3Network, ipRange, new Completion(null) { + @Override + public void success() { + logger.debug(String.format("success to delete l3 network[uuid:%s] ipRange on sdn controller[uuid:%s]", + l3Network.getUuid(), sdnControllerVO.getUuid())); + } + + @Override + public void fail(ErrorCode errorCode) { + logger.warn(String.format("failed to delete l3 network[uuid:%s] ipRange on sdn controller[uuid:%s], because: %s", + l3Network.getUuid(), sdnControllerVO.getUuid(), errorCode.getDetails())); + } + }); + } + + @Override + public void failedToDeleteIpRange(IpRangeInventory ipRange, ErrorCode errorCode) { + } + + private SdnControllerVO getSdnControllerVO(L2NetworkInventory l2Network) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL2Uuid(l2Network.getUuid()); + if (sdnControllerUuid == null) { + return null; + } + return dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); + } + private SdnControllerVO getSdnControllerVO(L3NetworkInventory l3Network) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(l3Network.getUuid()); + if (sdnControllerUuid == null) { + return null; + } + return dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); + } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingMsg.java new file mode 100644 index 00000000000..a655e7be43a --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingMsg.java @@ -0,0 +1,20 @@ +package org.zstack.sdnController; + +import org.zstack.header.message.NeedReplyMessage; +import org.zstack.sdnController.header.SdnControllerMessage; + +/** + * Created by shixin.ruan on 06/26/2025. + */ +public class SdnControllerPingMsg extends NeedReplyMessage implements SdnControllerMessage { + private String sdnControllerUuid; + + @Override + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingReply.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingReply.java new file mode 100644 index 00000000000..6046d785fcb --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingReply.java @@ -0,0 +1,18 @@ +package org.zstack.sdnController; + +import org.zstack.header.message.MessageReply; + +/** + * Created by shixin.ruan on 06/26/2025. + */ +public class SdnControllerPingReply extends MessageReply { + private boolean doReconnect = false; + + public boolean getDoReconnect() { + return doReconnect; + } + + public void setDoReconnect(boolean doReconnect) { + this.doReconnect = doReconnect; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java new file mode 100644 index 00000000000..875b314e9b8 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java @@ -0,0 +1,156 @@ +package org.zstack.sdnController; + +import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.cloudbus.ResourceDestinationMaker; +import org.zstack.core.componentloader.PluginRegistry; +import org.zstack.core.config.GlobalConfig; +import org.zstack.core.config.GlobalConfigUpdateExtensionPoint; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; +import org.zstack.core.thread.AsyncThread; +import org.zstack.core.tracker.PingTracker; +import org.zstack.header.core.Completion; +import org.zstack.header.managementnode.ManagementNodeChangeListener; +import org.zstack.header.managementnode.ManagementNodeInventory; +import org.zstack.header.managementnode.ManagementNodeReadyExtensionPoint; +import org.zstack.header.message.MessageReply; +import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.network.l2.SdnControllerDeleteExtensionPoint; +import org.zstack.sdnController.header.*; +import org.zstack.utils.CollectionUtils; +import org.zstack.utils.Utils; +import org.zstack.utils.function.Function; +import org.zstack.utils.logging.CLogger; + +import java.util.List; + +/** + * Created by shixin on 06/26/2025. + */ +public class SdnControllerPingTracker extends PingTracker implements + ManagementNodeChangeListener, ManagementNodeReadyExtensionPoint, SdnControllerDeleteExtensionPoint { + private final static CLogger logger = Utils.getLogger(SdnControllerPingTracker.class); + + @Autowired + private DatabaseFacade dbf; + @Autowired + private ResourceDestinationMaker destinationMaker; + @Autowired + protected PluginRegistry pluginRgty; + @Autowired + protected SdnControllerManager sdnMgr; + + public String getResourceName() { + return "sdn controller"; + } + + // sdn controller will only ping when it's connected or disconnected, + // if ping failed, it will send ReconnectSdnControllerMsg, + @Override + public NeedReplyMessage getPingMessage(String resUuid) { + SdnControllerVO vo = dbf.findByUuid(resUuid, SdnControllerVO.class); + if (vo.getStatus() == SdnControllerStatus.Connecting) { + return null; + } + + SdnControllerPingMsg msg = new SdnControllerPingMsg(); + msg.setSdnControllerUuid(resUuid); + bus.makeTargetServiceIdByResourceUuid(msg, SdnControllerConstant.SERVICE_ID, resUuid); + return msg; + } + + @Override + public int getPingInterval() { + return SdnControllerGlobalConfig.PING_INTERVAL.value(Integer.class); + } + + @Override + public int getParallelismDegree() { + return SdnControllerGlobalConfig.PING_PARALLELISM_DEGREE.value(Integer.class); + } + + @Override + public void handleReply(final String resourceUuid, MessageReply reply) { + SdnControllerVO vo = dbf.findByUuid(resourceUuid, SdnControllerVO.class); + if (vo == null) { + logger.warn(String.format("SDN controller[uuid:%s] has been deleted, skip ping handling", resourceUuid)); + return; + } + + + if (!reply.isSuccess()) { + logger.warn(String.format("[SDN Ping Tracker]: unable to ping the sdn controller[uuid: %s], %s", resourceUuid, reply.getError())); + new SdnControllerBase(vo).changeSdnControllerStatus(SdnControllerStatus.Disconnected); + return; + } + + SdnControllerStatus oldStatus = vo.getStatus(); + new SdnControllerBase(vo).changeSdnControllerStatus(SdnControllerStatus.Connected); + if (oldStatus == SdnControllerStatus.Disconnected) { + ReconnectSdnControllerMsg msg = new ReconnectSdnControllerMsg(); + msg.setControllerUuid(resourceUuid); + bus.makeTargetServiceIdByResourceUuid(msg, SdnControllerConstant.SERVICE_ID, resourceUuid); + bus.send(msg); + } + } + + private void trackOurs() { + List sdnControllerUuids = Q.New(SdnControllerVO.class) + .select(SdnControllerVO_.uuid).listValues(); + List toTrack = CollectionUtils.transformToList(sdnControllerUuids, new Function() { + @Override + public String call(String arg) { + return destinationMaker.isManagedByUs(arg) ? arg : null; + } + }); + + untrackAll(); + track(toTrack); + } + + @Override + public void nodeJoin(ManagementNodeInventory inv) { + trackOurs(); + } + + @Override + public void nodeLeft(ManagementNodeInventory inv) { + trackOurs(); + } + + @Override + public void iAmDead(ManagementNodeInventory inv) { + + } + + @Override + public void iJoin(ManagementNodeInventory inv) { + } + + @Override + protected void startHook() { + SdnControllerGlobalConfig.PING_INTERVAL.installUpdateExtension(new GlobalConfigUpdateExtensionPoint() { + @Override + public void updateGlobalConfig(GlobalConfig oldConfig, GlobalConfig newConfig) { + pingIntervalChanged(); + } + }); + } + + @Override + @AsyncThread + public void managementNodeReady() { + trackOurs(); + } + + @Override + protected void trackHook(String resourceUuid) { + super.trackHook(resourceUuid); + } + + @Override + public void deleteNetworkServiceOfSdnController(String sdnControllerUuid, Completion completion) { + super.untrack(sdnControllerUuid); + completion.success(); + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java index 49575b07281..50da9d73db3 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java @@ -3,18 +3,23 @@ import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; import org.zstack.header.apimediator.ApiMessageInterceptionException; import org.zstack.header.apimediator.ApiMessageInterceptor; import org.zstack.header.apimediator.GlobalApiMessageInterceptor; import org.zstack.header.message.APIMessage; import org.zstack.header.network.l2.APIAttachL2NetworkToClusterMsg; import org.zstack.header.network.l2.APIDetachL2NetworkFromClusterMsg; +import org.zstack.header.network.l3.APIAddIpRangeByNetworkCidrMsg; +import org.zstack.header.network.l3.APIAddIpRangeMsg; import org.zstack.header.network.l3.APICreateL3NetworkMsg; +import org.zstack.header.network.l3.L3NetworkCategory; +import org.zstack.network.l2.L2NetworkSystemTags; import org.zstack.network.l2.vxlan.vxlanNetwork.APICreateL2VxlanNetworkMsg; import org.zstack.network.l2.vxlan.vxlanNetwork.APIDeleteVxlanL2Network; import org.zstack.network.l2.vxlan.vxlanNetworkPool.APICreateVniRangeMsg; import org.zstack.network.l2.vxlan.vxlanNetworkPool.VxlanNetworkPoolVO; -import org.zstack.sdnController.SdnController; +import org.zstack.network.l3.L3NetworkHelper; import org.zstack.sdnController.SdnControllerL2; import org.zstack.sdnController.SdnControllerManager; import org.zstack.sdnController.header.*; @@ -25,6 +30,8 @@ import java.util.List; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.CollectionDSL.e; +import static org.zstack.utils.CollectionDSL.map; public class H3cVcfcApiInterceptor implements ApiMessageInterceptor, GlobalApiMessageInterceptor { private static final CLogger logger = Utils.getLogger(H3cVcfcApiInterceptor.class); @@ -55,6 +62,8 @@ public List getMessageClassToIntercept() { ret.add(APIDeleteVxlanL2Network.class); ret.add(APIRemoveSdnControllerMsg.class); ret.add(APICreateL3NetworkMsg.class); + ret.add(APIAddIpRangeMsg.class); + ret.add(APIAddIpRangeByNetworkCidrMsg.class); return ret; } @@ -83,6 +92,10 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti validate((APIRemoveSdnControllerMsg) msg); } else if (msg instanceof APICreateL3NetworkMsg) { validate((APICreateL3NetworkMsg) msg); + } else if (msg instanceof APIAddIpRangeMsg) { + validate((APIAddIpRangeMsg) msg); + } else if (msg instanceof APIAddIpRangeByNetworkCidrMsg) { + validate((APIAddIpRangeByNetworkCidrMsg) msg); } setServiceId(msg); @@ -100,7 +113,7 @@ public static boolean isOverlappedVniRange(Integer startVni1, Integer endVni1, I private void validate(APICreateVniRangeMsg msg) { VxlanNetworkPoolVO pool = dbf.findByUuid(msg.getL2NetworkUuid(), VxlanNetworkPoolVO.class); if ( pool == null ) { - throw new ApiMessageInterceptionException(argerr("unable create vni range, because l2 uuid[%s] is not vxlan network pool",msg.getL2NetworkUuid())); + throw new ApiMessageInterceptionException(argerr("Could not create VNI range because the specified L2 network [uuid:%s] is not a VXLAN network pool", msg.getL2NetworkUuid())); } HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(msg.getL2NetworkUuid(), HardwareL2VxlanNetworkPoolVO.class); @@ -115,7 +128,7 @@ private void validate(APICreateVniRangeMsg msg) { // user's vni must <= 4094 if (msg.getStartVni() > 4094 || msg.getEndVni() > 4094) { - throw new ApiMessageInterceptionException(argerr("the vni range:[%s.%s} is illegal, because h3c's controller uses vni as vlan id", msg.getStartVni(), msg.getEndVni())); + throw new ApiMessageInterceptionException(argerr("Could not create VNI range [%s-%s] because H3C controllers use VNI as VLAN ID and the range must be within 1-4094", msg.getStartVni(), msg.getEndVni())); } SdnControllerL2 sdnController = sdnControllerManager.getSdnControllerL2(vo); @@ -130,10 +143,57 @@ private void validate(APICreateVniRangeMsg msg) { return; } } - throw new ApiMessageInterceptionException(argerr("the vni range:[%s.%s} is illegal, must covered by a sdn's vniRange", userVniRange.startVni, userVniRange.endVni)); + throw new ApiMessageInterceptionException(argerr("Could not create VNI range [%s-%s] because it is not covered by any of the SDN controller's configured VNI ranges", userVniRange.startVni, userVniRange.endVni)); + } + + private void validate(APIAddIpRangeMsg msg) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(msg.getL3NetworkUuid()); + if (sdnControllerUuid == null) { + return; + } + SdnControllerVO vo = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); + if (vo == null) { + return; + } + if (!vo.getVendorType().equals(SdnControllerConstant.H3C_VCFC_CONTROLLER)) { + return; + } + if (vo.getStatus() != SdnControllerStatus.Connected) { + throw new ApiMessageInterceptionException(argerr("Could not add IP range because the SDN controller [uuid:%s] is not connected. Current status: %s", + sdnControllerUuid, vo.getStatus())); + } + } + + private void validate(APIAddIpRangeByNetworkCidrMsg msg) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(msg.getL3NetworkUuid()); + if (sdnControllerUuid == null) { + return; + } + SdnControllerVO vo = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); + if (vo == null) { + return; + } + if (!vo.getVendorType().equals(SdnControllerConstant.H3C_VCFC_CONTROLLER)) { + return; + } + if (vo.getStatus() != SdnControllerStatus.Connected) { + throw new ApiMessageInterceptionException(argerr("Could not add IP range by network CIDR because the SDN controller [uuid:%s] is not connected. Current status: %s", + sdnControllerUuid, vo.getStatus())); + } } private void validate(APICreateL3NetworkMsg msg) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL2Uuid(msg.getL2NetworkUuid()); + if (sdnControllerUuid == null) { + return; + } + SdnControllerVO vo = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); + if (SdnControllerConstant.H3C_VCFC_CONTROLLER.equals(vo.getVendorType()) && + SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2.equals(vo.getVendorVersion()) && + L3NetworkCategory.Public.toString().equals(msg.getCategory())) { + throw new ApiMessageInterceptionException(argerr("can not create l3 network" + + "because H3C VCFC V2 SDN controller does not support l3[type:%s, category:%s]", msg.getType(), msg.getCategory())); + } } private void validate(APIRemoveSdnControllerMsg msg) { @@ -146,6 +206,37 @@ private void validate(APIDetachL2NetworkFromClusterMsg msg) { } private void validate(APICreateL2HardwareVxlanNetworkMsg msg) { + HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(msg.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); + if (poolVO == null) { + return; + } + + SdnControllerVO sdnControllerVO = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); + if (sdnControllerVO != null + && SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2.equals(sdnControllerVO.getVendorVersion())) { + boolean tenantExist = msg.getH3cTenantUuid() != null && + Q.New(H3cSdnControllerTenantVO.class) + .eq(H3cSdnControllerTenantVO_.uuid, msg.getH3cTenantUuid()) + .isExists(); + if (!tenantExist) { + throw new ApiMessageInterceptionException(argerr( + "Could not create hardware VXLAN network because tenant UUID is a mandatory parameter for the H3C VCFC V2 controller")); + } + } + + boolean hasSdnControllerTag = msg.getSystemTags() != null && + msg.getSystemTags().stream() + .anyMatch(L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID::isMatch); + + if (!hasSdnControllerTag && poolVO.getSdnControllerUuid() != null) { + if (msg.getSystemTags() == null) { + msg.setSystemTags(new ArrayList<>()); + } + String tag = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.instantiateTag( + map(e(L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN, poolVO.getSdnControllerUuid())) + ); + msg.getSystemTags().add(tag); + } } private void validate(APICreateL2HardwareVxlanNetworkPoolMsg msg) { @@ -175,8 +266,8 @@ private void validate(APIAddSdnControllerMsg msg) { if (!msg.getVendorType().equals(SdnControllerConstant.H3C_VCFC_CONTROLLER)) { return; } - if (!validateH3cController(msg)) { - throw new ApiMessageInterceptionException(argerr("H3C VCFC controller must include systemTags vdsUuid::{%s}")); + if (!validateH3cController(msg) && msg.getVendorVersion().equals(SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V1)) { + throw new ApiMessageInterceptionException(argerr("Could not add H3C VCFC controller because VDS UUID system tag is required for H3C VCFC V1 controllers")); } } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcCommands.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcCommands.java index b1977d85feb..604bb4422ac 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcCommands.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcCommands.java @@ -98,7 +98,7 @@ public static class H3cTenantStruct { public String type; } public static class GetH3cTenantsRsp extends H3cRsp { - public List tenants; + public List tenants; } public static class GetH3cTeamLederIpCmd extends H3cCmd { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcHttpClient.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcHttpClient.java index f5c829915fc..8e43b7ed120 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcHttpClient.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcHttpClient.java @@ -9,6 +9,7 @@ import org.zstack.header.rest.RESTFacade; import org.zstack.utils.gson.JSONObjectUtil; +import java.nio.charset.StandardCharsets; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -53,11 +54,23 @@ public T syncCall(String action, String ip, String url, Object body, Map params = JSONObjectUtil.rehashObject(body, Map.class); + UriComponentsBuilder ub = UriComponentsBuilder.fromUriString(fullUrl); + for (Map.Entry entry : params.entrySet()) { + ub.queryParam(entry.getKey(), entry.getValue()); + } + fullUrl = ub.build().toUriString(); + } + return restf.syncJsonGet(fullUrl, null, headers, responseClass); } case "DELETE": { return restf.syncJsonDelete(buildUrl(ip, url), httpBody, headers, responseClass); } + case "PUT": { + return restf.syncJsonPut(buildUrl(ip, url), httpBody, headers, responseClass); + } default: { if (url.equals(H3cVcfcCommands.H3C_VCFC_L2_NETWORKS)) { httpBody = httpBody.replace("\"network_type\"", "\"provider:network_type\"") diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java index de3068b85bf..a0192966bbb 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java @@ -3,6 +3,7 @@ import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; +import org.springframework.http.HttpMethod; import org.springframework.web.util.UriComponentsBuilder; import org.zstack.core.CoreGlobalProperty; import org.zstack.core.cloudbus.CloudBus; @@ -12,14 +13,13 @@ import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.message.Message; +import org.zstack.header.network.l2.APICreateL2NetworkMsg; import org.zstack.header.network.l2.L2NetworkInventory; import org.zstack.header.rest.RESTFacade; import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; -import org.zstack.sdnController.SdnController; -import org.zstack.sdnController.SdnControllerL2; +import org.zstack.sdnController.*; import org.zstack.sdnController.header.*; -import org.zstack.sdnController.SdnControllerLog; import org.zstack.tag.SystemTagCreator; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; @@ -65,12 +65,7 @@ public H3cVcfcSdnController(SdnControllerVO self) { } private Map getH3cHeaders() { - Map headers = new HashMap<>(); - headers.put("Content-Type", "application/json"); - headers.put("Accept", "application/json"); - headers.put("Cache-Control", "no-cache"); - - return headers; + return getH3cHeaders(null); } private Map getH3cHeaders(String token) { @@ -78,18 +73,20 @@ private Map getH3cHeaders(String token) { headers.put("Content-Type", "application/json"); headers.put("Accept", "application/json"); headers.put("Cache-Control", "no-cache"); - headers.put("X-Auth-Token", token); - + if (token != null) { + headers.put("X-Auth-Token", token); + } return headers; } // from H3cCmd - private void getH3cVniRanges(Completion completion) { - H3cVcfcCommands.GetH3cVniRangeCmd cmd = new H3cVcfcCommands.GetH3cVniRangeCmd(); + public void getH3cVniRanges(Completion completion) { + H3cVcfcCommands.GetH3cVniRangeCmd cmd = getGetH3cVniRangeCmd(); try { - H3cVcfcCommands.GetH3cVniRangeRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcCommands.GetH3cVniRangeRsp.class).syncCall("GET", self.getIp(), H3cVcfcCommands.H3C_VCFC_VNI_RANGES, cmd, getH3cHeaders(token)); + H3cVcfcCommands.GetH3cVniRangeRsp rsp = new H3cVcfcHttpClient<>(getGetH3cVniRangeRspClass()) + .syncCall(HttpMethod.GET.name(), self.getIp(), getH3cVcfcVniRangesPath(), cmd, getH3cHeaders(token)); if (rsp == null) { - completion.fail(operr("get vni range on sdn controller [ip:%s] failed", self.getIp())); + completion.fail(operr("Could not retrieve VNI ranges because the SDN controller [ip:%s] did not respond", self.getIp())); return; } @@ -113,22 +110,23 @@ private void getH3cVniRanges(Completion completion) { } if (count == 0) { - completion.fail(operr("there is no vni range on sdn controller [ip:%s]", self.getIp())); + completion.fail(operr("Could not initialize SDN controller because no VNI ranges are configured on controller [ip:%s]", self.getIp())); return; } completion.success(); } catch (Exception e) { - completion.fail(operr("get sdn controller [ip:%s] vni range failed because %s", self.getIp(), e.getLocalizedMessage())); + completion.fail(operr("Could not retrieve VNI ranges from SDN controller [ip:%s] because %s", self.getIp(), e.getLocalizedMessage())); } } private void getH3cDefaultTenant(Completion completion) { - H3cVcfcCommands.GetH3cTenantsCmd cmd = new H3cVcfcCommands.GetH3cTenantsCmd(); + H3cVcfcCommands.GetH3cTenantsCmd cmd = getGetH3cTenantsCmd(); try { - H3cVcfcCommands.GetH3cTenantsRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcCommands.GetH3cTenantsRsp.class).syncCall("GET", self.getIp(), H3cVcfcCommands.H3C_VCFC_TENANTS, cmd, getH3cHeaders(token)); + H3cVcfcCommands.GetH3cTenantsRsp rsp = new H3cVcfcHttpClient<>(getGetH3cTenantsRspClass()) + .syncCall(HttpMethod.GET.name(), self.getIp(), getH3cVcfcTenantsPath(), cmd, getH3cHeaders(token)); if (rsp == null) { - completion.fail(operr("there is no vni range on sdn controller [ip:%s]", self.getIp())); + completion.fail(operr("Could not retrieve tenants because the SDN controller [ip:%s] did not respond", self.getIp())); return; } @@ -151,13 +149,13 @@ private void getH3cDefaultTenant(Completion completion) { } if (!found) { - completion.fail(operr("there is no vni range on sdn controller [ip:%s]", self.getIp())); + completion.fail(operr("Could not initialize SDN controller because no default tenant is configured on controller [ip:%s]", self.getIp())); return; } completion.success(); } catch (Exception e) { - completion.fail(operr("there is no default tenant on sdn controller [ip:%s]", self.getIp())); + completion.fail(operr("Could not retrieve default tenant from SDN controller [ip:%s] because of a communication error", self.getIp())); } } @@ -187,8 +185,8 @@ public void fail(ErrorCode errorCode) { @Override public void run(FlowTrigger trigger, Map data) { - for(String systemTag : msg.getSystemTags()) { - if(H3cVcfcSdnControllerSystemTags.H3C_TENANT_UUID.isMatch(systemTag)) { + for (String systemTag : msg.getSystemTags()) { + if (H3cVcfcSdnControllerSystemTags.H3C_TENANT_UUID.isMatch(systemTag)) { trigger.next(); return; } @@ -220,7 +218,11 @@ public void handle(ErrorCode errCode, Map data) { @Override public void handleMessage(SdnControllerMessage msg) { - bus.dealWithUnknownMessage((Message) msg); + if (msg instanceof SdnControllerPingMsg) { + handle((SdnControllerPingMsg)msg); + } else { + bus.dealWithUnknownMessage((Message) msg); + } } @Override @@ -276,8 +278,8 @@ private void doCreateVxlanNetworkOnController(L2NetworkInventory vxlan, Completi VxlanNetworkVO vo = dbf.findByUuid(vxlan.getUuid(), VxlanNetworkVO.class); String tenantUuid = H3cVcfcSdnControllerSystemTags.H3C_TENANT_UUID.getTokenByResourceUuid(self.getUuid(), H3cVcfcSdnControllerSystemTags.H3C_TENANT_UUID_TOKEN); String vdsUuid = H3cVcfcSdnControllerSystemTags.H3C_VDS_UUID.getTokenByResourceUuid(self.getUuid(), H3cVcfcSdnControllerSystemTags.H3C_VDS_TOKEN); - H3cVcfcCommands.CreateH3cNetworksCmd cmd = new H3cVcfcCommands.CreateH3cNetworksCmd(); - H3cVcfcCommands.NetworkCmd networkCmd = new H3cVcfcCommands.NetworkCmd(); + H3cVcfcCommands.CreateH3cNetworksCmd cmd = getCreateH3cNetworksCmd(); + H3cVcfcCommands.NetworkCmd networkCmd = getNetworkCmd(); networkCmd.name = vxlan.getName(); networkCmd.tenant_id = tenantUuid; networkCmd.distributed = true; @@ -290,9 +292,10 @@ private void doCreateVxlanNetworkOnController(L2NetworkInventory vxlan, Completi cmd.networks.add(networkCmd); try { - H3cVcfcCommands.CreateH3cNetworksRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcCommands.CreateH3cNetworksRsp.class).syncCall("POST", leaderIp, H3cVcfcCommands.H3C_VCFC_L2_NETWORKS, cmd, getH3cHeaders(token)); + H3cVcfcCommands.CreateH3cNetworksRsp rsp = new H3cVcfcHttpClient<>(getCreateH3cNetworksRspClass()) + .syncCall(HttpMethod.POST.name(), leaderIp, getH3cVcfcL2NetworksPath(), cmd, getH3cHeaders(token)); if (rsp == null) { - completion.fail(operr("create vxlan network on sdn controller [ip:%s] failed", self.getIp())); + completion.fail(operr("Could not create VXLAN network because the SDN controller [ip:%s] did not respond", self.getIp())); return; } H3cVcfcCommands.NetworkCmd network = rsp.networks.get(0); @@ -308,13 +311,13 @@ private void doCreateVxlanNetworkOnController(L2NetworkInventory vxlan, Completi completion.success(); } catch (Exception e) { - completion.fail(operr("create vxlan network on sdn controller [ip:%s] failed because %s", self.getIp(), e.getMessage())); + completion.fail(operr("Could not create VXLAN network on SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); } } @Override @SdnControllerLog - public void createL2Network(L2NetworkInventory inv, List systemTags, Completion completion) { + public void createL2Network(L2NetworkInventory inv, APICreateL2NetworkMsg msg, Completion completion) { /* initSdnController get the token */ getH3cControllerToken(new Completion(completion) { @Override @@ -381,18 +384,19 @@ public void fail(ErrorCode errorCode) { } private void doDeleteVxlanNetworkOnController(L2NetworkInventory vxlan, Completion completion) { - H3cVcfcCommands.DeleteH3cNetworksCmd cmd = new H3cVcfcCommands.DeleteH3cNetworksCmd(); + H3cVcfcCommands.DeleteH3cNetworksCmd cmd = getDeleteH3cNetworksCmd(); try { String h3cL2NetworkUuid = H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID.getTokenByResourceUuid(vxlan.getUuid(), H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID_TOKEN); - H3cVcfcCommands.DeleteH3cNetworksRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcCommands.DeleteH3cNetworksRsp.class).syncCall("DELETE", leaderIp, String.format("%s/%s", H3cVcfcCommands.H3C_VCFC_L2_NETWORKS, h3cL2NetworkUuid), cmd, getH3cHeaders(token)); + H3cVcfcCommands.DeleteH3cNetworksRsp rsp = new H3cVcfcHttpClient<>(getDeleteH3cNetworksRspClass()) + .syncCall(HttpMethod.DELETE.name(), leaderIp, String.format("%s/%s", getH3cVcfcL2NetworksPath(), h3cL2NetworkUuid), cmd, getH3cHeaders(token)); if (rsp == null) { - completion.fail(operr("delete vxlan network on sdn controller [ip:%s] failed", self.getIp())); + completion.fail(operr("Could not delete VXLAN network because the SDN controller [ip:%s] did not respond", self.getIp())); return; } completion.success(); } catch (Exception e) { - completion.fail(operr("delete vxlan network on sdn controller [ip:%s] failed because %s", self.getIp(), e.getMessage())); + completion.fail(operr("Could not delete VXLAN network on SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); } } @@ -443,33 +447,35 @@ public List getVlanRange(SdnControllerInventory controller) { } private void getH3cControllerLeaderIp(Completion completion) { - H3cVcfcCommands.GetH3cTeamLederIpCmd cmd = new H3cVcfcCommands.GetH3cTeamLederIpCmd(); + H3cVcfcCommands.GetH3cTeamLederIpCmd cmd = getGetH3cTeamLederIpCmd(); try { - H3cVcfcCommands.GetH3cTeamLederIpReply rsp = new H3cVcfcHttpClient<>(H3cVcfcCommands.GetH3cTeamLederIpReply.class).syncCall("GET", self.getIp(), H3cVcfcCommands.H3C_VCFC_TEAM_LEADERIP, cmd, getH3cHeaders(token)); + H3cVcfcCommands.GetH3cTeamLederIpReply rsp = new H3cVcfcHttpClient<>(getGetH3cTeamLederIpReplyClass()) + .syncCall(HttpMethod.GET.name(), self.getIp(), getH3cVcfcTeamLeaderIpPath(), cmd, getH3cHeaders(token)); if (rsp == null) { - completion.fail(operr("get leader of sdn controller [ip:%s] failed", self.getIp())); + completion.fail(operr("Could not determine cluster leader because the SDN controller [ip:%s] did not respond", self.getIp())); return; } leaderIp = rsp.ip; completion.success(); } catch (Exception e) { - completion.fail(operr("get token of sdn controller [ip:%s] failed because %s", self.getIp(), e.getMessage())); + completion.fail(operr("Could not determine cluster leader for SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); } } - private void getH3cControllerToken(Completion completion) { - H3cVcfcCommands.GetH3cTokenCmd cmd = new H3cVcfcCommands.GetH3cTokenCmd(); - H3cVcfcCommands.LoginCmd loginCmd = new H3cVcfcCommands.LoginCmd(); + public void getH3cControllerToken(Completion completion) { + H3cVcfcCommands.GetH3cTokenCmd cmd = getGetH3cTokenCmd(); + H3cVcfcCommands.LoginCmd loginCmd = getLoginCmd(); loginCmd.user = self.getUsername(); loginCmd.password = self.getPassword(); cmd.login = loginCmd; try { - H3cVcfcCommands.LoginRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcCommands.LoginRsp.class).syncCall("POST", self.getIp(), H3cVcfcCommands.H3C_VCFC_GET_TOKEN, cmd, getH3cHeaders()); + H3cVcfcCommands.LoginRsp rsp = new H3cVcfcHttpClient<>(getLoginRspClass()) + .syncCall(HttpMethod.POST.name(), self.getIp(), getH3cVcfcGetTokenPath(), cmd, getH3cHeaders()); if (rsp == null) { - completion.fail(operr("get token of sdn controller [ip:%s] failed", self.getIp())); + completion.fail(operr("Could not authenticate with SDN controller because controller [ip:%s] did not respond", self.getIp())); return; } @@ -477,7 +483,117 @@ private void getH3cControllerToken(Completion completion) { completion.success(); } catch (Exception e) { - completion.fail(operr("get token of sdn controller [ip:%s] failed because %s", self.getIp(), e.getMessage())); + completion.fail(operr("Could not authenticate with SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); } } + + void handle(SdnControllerPingMsg msg) { + SdnControllerPingReply reply = new SdnControllerPingReply(); + + getH3cControllerToken(new Completion(msg) { + @Override + public void success() { + reply.setSuccess(true); + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } + + @Override + public void reconnectSdnController(Completion completion) { + getH3cControllerToken(new Completion(completion) { + @Override + public void success() { + completion.success(); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + // Protected methods for H3cVcfcCommands access, for subclass override + protected Class getGetH3cVniRangeRspClass() { + return H3cVcfcCommands.GetH3cVniRangeRsp.class; + } + + protected H3cVcfcCommands.GetH3cVniRangeCmd getGetH3cVniRangeCmd() { + return new H3cVcfcCommands.GetH3cVniRangeCmd(); + } + + protected String getH3cVcfcVniRangesPath() { + return H3cVcfcCommands.H3C_VCFC_VNI_RANGES; + } + + private Class getGetH3cTenantsRspClass() { + return H3cVcfcCommands.GetH3cTenantsRsp.class; + } + + protected H3cVcfcCommands.GetH3cTenantsCmd getGetH3cTenantsCmd() { + return new H3cVcfcCommands.GetH3cTenantsCmd(); + } + + protected String getH3cVcfcTenantsPath() { + return H3cVcfcCommands.H3C_VCFC_TENANTS; + } + + private H3cVcfcCommands.NetworkCmd getNetworkCmd() { + return new H3cVcfcCommands.NetworkCmd(); + } + + private H3cVcfcCommands.CreateH3cNetworksCmd getCreateH3cNetworksCmd() { + return new H3cVcfcCommands.CreateH3cNetworksCmd(); + } + + private Class getCreateH3cNetworksRspClass() { + return H3cVcfcCommands.CreateH3cNetworksRsp.class; + } + + protected String getH3cVcfcL2NetworksPath() { + return H3cVcfcCommands.H3C_VCFC_L2_NETWORKS; + } + + private H3cVcfcCommands.DeleteH3cNetworksCmd getDeleteH3cNetworksCmd() { + return new H3cVcfcCommands.DeleteH3cNetworksCmd(); + } + + protected Class getDeleteH3cNetworksRspClass() { + return H3cVcfcCommands.DeleteH3cNetworksRsp.class; + } + + protected H3cVcfcCommands.GetH3cTeamLederIpCmd getGetH3cTeamLederIpCmd() { + return new H3cVcfcCommands.GetH3cTeamLederIpCmd(); + } + + protected Class getGetH3cTeamLederIpReplyClass() { + return H3cVcfcCommands.GetH3cTeamLederIpReply.class; + } + + protected String getH3cVcfcTeamLeaderIpPath() { + return H3cVcfcCommands.H3C_VCFC_TEAM_LEADERIP; + } + + protected H3cVcfcCommands.GetH3cTokenCmd getGetH3cTokenCmd() { + return new H3cVcfcCommands.GetH3cTokenCmd(); + } + + protected H3cVcfcCommands.LoginCmd getLoginCmd() { + return new H3cVcfcCommands.LoginCmd(); + } + + protected Class getLoginRspClass() { + return H3cVcfcCommands.LoginRsp.class; + } + + protected String getH3cVcfcGetTokenPath() { + return H3cVcfcCommands.H3C_VCFC_GET_TOKEN; + } } \ No newline at end of file diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java index 41d847bb876..7134399ed10 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java @@ -3,8 +3,7 @@ import org.zstack.network.securitygroup.SecurityGroupSdnBackend; import org.zstack.sdnController.SdnController; import org.zstack.sdnController.SdnControllerFactory; -import org.zstack.sdnController.SdnControllerL2; -import org.zstack.sdnController.SdnControllerType; +import org.zstack.sdnController.*; import org.zstack.sdnController.header.*; public class H3cVcfcSdnControllerFactory implements SdnControllerFactory { @@ -17,12 +16,20 @@ public SdnControllerType getVendorType() { @Override public SdnController getSdnController(SdnControllerVO vo) { - return new H3cVcfcSdnController(vo); + if (SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2.equals(vo.getVendorVersion())) { + return new H3cVcfcV2SdnController(vo); + } else { + return new H3cVcfcSdnController(vo); + } } @Override public SdnControllerL2 getSdnControllerL2(SdnControllerVO vo) { - return new H3cVcfcSdnController(vo); + if (SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2.equals(vo.getVendorVersion())) { + return new H3cVcfcV2SdnController(vo); + } else { + return new H3cVcfcSdnController(vo); + } } @Override diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerGlobalProperty.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerGlobalProperty.java index becff8a3708..f0c56fbfe4c 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerGlobalProperty.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerGlobalProperty.java @@ -14,4 +14,7 @@ public class H3cVcfcSdnControllerGlobalProperty { /* default timeout 30 seconds */ @GlobalProperty(name="H3c.Timeout", defaultValue = "30000000") public static Long H3C_CONTROLLER_TIMEOUT; + + @GlobalProperty(name="H3c.Mgtip.Is.LeaderIp", defaultValue = "true") + public static Boolean H3C_MGT_IP_IS_LEADER_IP; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerSystemTags.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerSystemTags.java index 22d30cf63c1..e697b264347 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerSystemTags.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerSystemTags.java @@ -19,4 +19,10 @@ public class H3cVcfcSdnControllerSystemTags { public static String H3C_L2_NETWORK_UUID_TOKEN = "h3cL2NetworkUuid"; public static PatternedSystemTag H3C_L2_NETWORK_UUID = new PatternedSystemTag(String.format("h3cL2NetworkUuid::{%s}", H3C_L2_NETWORK_UUID_TOKEN), VxlanNetworkVO.class); + + public static String H3C_L2_VROUTER_UUID_TOKEN = "h3cL2RouterUuid"; + public static PatternedSystemTag H3C_L2_VROUTER_UUID = new PatternedSystemTag(String.format("h3cL2RouterUuid::{%s}", H3C_L2_VROUTER_UUID_TOKEN), VxlanNetworkVO.class); + + public static String H3C_L2_TENANT_UUID_TOKEN = "h3cL2TenantUuid"; + public static PatternedSystemTag H3C_L2_TENANT_UUID = new PatternedSystemTag(String.format("h3cL2TenantUuid::{%s}", H3C_L2_TENANT_UUID_TOKEN), VxlanNetworkVO.class); } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2Commands.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2Commands.java new file mode 100644 index 00000000000..f636c16a396 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2Commands.java @@ -0,0 +1,116 @@ +package org.zstack.sdnController.h3cVcfc; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by boce.wang on 04/28/2025. + */ +public class H3cVcfcV2Commands extends H3cVcfcCommands { + + public static final String H3C_VCFC_SUBNETS = "/vds/1.0/subnets"; + public static final String H3C_VCFC_ROUTERS = "/vds/1.0/routers"; + + public static class NetworkCmd extends H3cVcfcCommands.NetworkCmd { + String tenant_name; + String vds_name; + } + + public static class CreateH3cNetworksCmd extends H3cCmd { + List networks = new ArrayList<>(); + } + + public static class CreateH3cNetworksRsp extends H3cRsp { + List networks = new ArrayList<>(); + } + + public static class H3cTenantStruct extends H3cVcfcCommands.H3cTenantStruct { + public List vds_list; + public String cloud_region_name; + public String cloud_domain_name; + + public H3cTenantStruct() { + vds_list = new ArrayList<>(); + } + } + + public static class GetH3cTenantsRsp extends H3cRsp { + public List tenants; + } + + public static class AllocationPoolStruct { + public String start; + public String end; + } + + public static class SubnetCmd { + String id; + String name; + String network_id; + String nqa_profile_id; + String segment_id; + String cidr; + String gateway_ip; + Boolean enable_dhcp; + List allocation_pools; + List dns_nameservers; + List service_types; + String cloud_region_name; + List protocal_ips; + String tenant_name; + String vds_name; + } + + public static class CreateH3cSubnetsCmd extends H3cCmd { + public List subnets = new ArrayList<>(); + } + + public static class CreateH3cSubnetsRsp extends H3cRsp { + public List subnets = new ArrayList<>(); + } + + public static class GetH3cSubnetsCmd extends H3cCmd { + public String network_id; + } + public static class GetH3cSubnetsRsp extends H3cRsp { + public List subnets = new ArrayList<>(); + } + + public static class RouterCmd { + String id; + String name; + String tenant_id; + } + + public static class CreateH3cRoutersCmd extends H3cCmd { + public List routers = new ArrayList<>(); + } + + public static class CreateH3cRoutersRsp extends H3cRsp { + public List routers = new ArrayList<>(); + } + + public static class DeleteH3cRoutersCmd extends H3cCmd { + } + + public static class DeleteH3cRoutersRsp extends H3cRsp { + } + + public static class AddRouterInterfaceCmd extends H3cCmd { + public String subnet_id; + } + + public static class AddRouterInterfaceRsp extends H3cRsp { + public String id; + public String subnet_id; + public String tenant_id; + public String port_id; + } + + public static class RemoveRouterInterfaceCmd extends H3cCmd { + public String subnet_id; + } + + public static class RemoveRouterInterfaceRsp extends H3cRsp { + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java new file mode 100644 index 00000000000..0440966d270 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java @@ -0,0 +1,674 @@ +package org.zstack.sdnController.h3cVcfc; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Configurable; +import org.springframework.http.HttpMethod; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; +import org.zstack.core.workflow.FlowChainBuilder; +import org.zstack.header.core.Completion; +import org.zstack.header.core.workflow.*; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.network.l2.APICreateL2NetworkMsg; +import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.network.l3.IpRangeInventory; +import org.zstack.header.network.l3.L3NetworkConstant; +import org.zstack.header.network.l3.L3NetworkInventory; +import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; +import org.zstack.sdnController.SdnControllerLog; +import org.zstack.sdnController.header.*; +import org.zstack.tag.SystemTagCreator; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import java.util.*; +import java.util.stream.Collectors; + +import static org.codehaus.groovy.runtime.InvokerHelper.asList; +import static org.zstack.core.Platform.operr; +import static org.zstack.sdnController.h3cVcfc.H3cVcfcSdnControllerGlobalProperty.H3C_MGT_IP_IS_LEADER_IP; +import static org.zstack.utils.CollectionDSL.e; +import static org.zstack.utils.CollectionDSL.map; + +/** + * H3C VCFC SDN Controller V2 Implementation. + * Extends the base H3cVcfcSdnController to support newer versions or features. + */ +@Slf4j +@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) +public class H3cVcfcV2SdnController extends H3cVcfcSdnController { + private static final CLogger logger = Utils.getLogger(H3cVcfcV2SdnController.class); + + @Autowired + private DatabaseFacade dbf; + private SdnControllerVO self; + private String token; + private String leaderIp; + + private Map getH3cHeaders() { + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + headers.put("Accept", "application/json"); + headers.put("Cache-Control", "no-cache"); + + return headers; + } + + private Map getH3cHeaders(String token) { + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + headers.put("Accept", "application/json"); + headers.put("Cache-Control", "no-cache"); + headers.put("X-Auth-Token", token); + + return headers; + } + + public H3cVcfcV2SdnController(SdnControllerVO self) { + super(self); + this.self = self; + logger.debug(String.format("Instantiated H3C VCFC V2 Controller for VO [uuid:%s, name:%s]", self.getUuid(), self.getName())); + } + + @Override + @SdnControllerLog + public void addL3NetworkIpRange(L3NetworkInventory inv, IpRangeInventory ipr, Completion completion) { + getH3cControllerToken(new Completion(completion) { + @Override + public void success() { + addL3NetworkIpRangeOnController(inv, ipr, completion); + } + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + @Override + @SdnControllerLog + public void deleteL3NetworkIpRange(L3NetworkInventory inv, IpRangeInventory ipr, Completion completion) { + getH3cControllerToken(new Completion(completion) { + @Override + public void success() { + deleteL3NetworkIpRangeOnController(inv, ipr, completion); + } + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + @Override + @SdnControllerLog + public void createL2Network(L2NetworkInventory inv, APICreateL2NetworkMsg msg, Completion completion) { + /* initSdnController get the token */ + getH3cControllerToken(new Completion(completion) { + @Override + public void success() { + createVxlanNetworkOnController(inv, (APICreateL2HardwareVxlanNetworkMsg) msg, completion); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + @Override + @SdnControllerLog + public void deleteL2Network(L2NetworkInventory vxlan, Completion completion) { + /* initSdnController get the token */ + getH3cControllerToken(new Completion(completion) { + @Override + public void success() { + deleteVxlanNetworkOnController(vxlan, completion); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + @Override + @SdnControllerLog + public void initSdnController(APIAddSdnControllerMsg msg, Completion completion) { + getH3cControllerToken(new Completion(completion) { + @Override + public void success() { + getH3cParameters(msg, completion); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + private void addL3NetworkIpRangeOnController(L3NetworkInventory inv, IpRangeInventory ipr, Completion completion) { + try { + String h3cL2NetworkUuid = H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID.getTokenByResourceUuid(inv.getL2NetworkUuid(), H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID_TOKEN); + List subnets = getSubnetsByNetworkUuid(h3cL2NetworkUuid); + H3cVcfcV2Commands.SubnetCmd subnet = subnets.stream() + .filter(s -> ipr.getNetworkCidr().equals(s.cidr)) + .findFirst() + .orElse(null); + if (subnet == null) { + logger.debug(String.format("addL3NetworkIpRangeOnController: subnet %s not exist in controller", ipr.getNetworkCidr())); + H3cVcfcV2Commands.SubnetCmd newSubnet = new H3cVcfcV2Commands.SubnetCmd(); + newSubnet.cidr = ipr.getNetworkCidr(); + newSubnet.gateway_ip = ipr.getGateway(); + newSubnet.name = ipr.getNetworkCidr(); + newSubnet.network_id = h3cL2NetworkUuid; + subnet = (H3cVcfcV2Commands.SubnetCmd) createSubnets(asList(newSubnet)).get(0); + } + if (subnet == null) { + completion.fail(operr("Could not add IP range because subnet creation failed on the SDN controller")); + return; + } + if (!Q.New(H3cSdnSubnetIpRangeRefVO.class) + .eq(H3cSdnSubnetIpRangeRefVO_.l2NetworkUuid, inv.getL2NetworkUuid()) + .eq(H3cSdnSubnetIpRangeRefVO_.ipRangeUuid, ipr.getUuid()) + .eq(H3cSdnSubnetIpRangeRefVO_.sdnControllerUuid, self.getUuid()) + .eq(H3cSdnSubnetIpRangeRefVO_.subnetUuid, subnet.id) + .isExists()) { + H3cSdnSubnetIpRangeRefVO newRef = new H3cSdnSubnetIpRangeRefVO(); + newRef.setL2NetworkUuid(inv.getL2NetworkUuid()); + newRef.setIpRangeUuid(ipr.getUuid()); + newRef.setSdnControllerUuid(self.getUuid()); + newRef.setSubnetUuid(subnet.id); + dbf.persist(newRef); + String h3cL2VRouterUuid = H3cVcfcSdnControllerSystemTags.H3C_L2_VROUTER_UUID.getTokenByResourceUuid(inv.getL2NetworkUuid(), H3cVcfcSdnControllerSystemTags.H3C_L2_VROUTER_UUID_TOKEN); + if(h3cL2VRouterUuid != null && !inv.getType().equals(L3NetworkConstant.L3_BASIC_NETWORK_TYPE)) { + addRouterInterface(h3cL2VRouterUuid, subnet.id); + } + } + completion.success(); + } catch (Exception e) { + completion.fail(operr("Could not add IP range to L3 network because %s", e.getMessage())); + } + } + + private void deleteL3NetworkIpRangeOnController(L3NetworkInventory inv, IpRangeInventory ipr, Completion completion) { + try { + String h3cL2NetworkUuid = H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID.getTokenByResourceUuid( + inv.getL2NetworkUuid(), H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID_TOKEN); + List subnets = getSubnetsByNetworkUuid(h3cL2NetworkUuid); + H3cVcfcV2Commands.SubnetCmd subnet = subnets.stream() + .filter(s -> ipr.getNetworkCidr().equals(s.cidr)) + .findFirst() + .orElse(null); + if (subnet == null) { + dbf.removeCollection( + Q.New(H3cSdnSubnetIpRangeRefVO.class).eq(H3cSdnSubnetIpRangeRefVO_.ipRangeUuid, ipr.getUuid()).list(), + H3cSdnSubnetIpRangeRefVO.class + ); + } else { + List refs = Q.New(H3cSdnSubnetIpRangeRefVO.class) + .eq(H3cSdnSubnetIpRangeRefVO_.l2NetworkUuid, inv.getL2NetworkUuid()) + .eq(H3cSdnSubnetIpRangeRefVO_.sdnControllerUuid, self.getUuid()) + .eq(H3cSdnSubnetIpRangeRefVO_.subnetUuid, subnet.id).list(); + List refsToDelete = refs.stream() + .filter(ref -> ref.getIpRangeUuid().equals(ipr.getUuid())) + .collect(Collectors.toList()); + refs.removeAll(refsToDelete); + if (refs.isEmpty()) { + deleteSubnet(subnet.id); + } + dbf.removeCollection(refsToDelete, H3cSdnSubnetIpRangeRefVO.class); + } + completion.success(); + } catch (Exception e) { + completion.fail(operr("Could not delete IP range from L3 network because %s", e.getMessage())); + } + } + + private void createVxlanNetworkOnController(L2NetworkInventory vxlan, APICreateL2HardwareVxlanNetworkMsg msg, Completion completion) { + getH3cControllerLeaderIp(new Completion(completion) { + @Override + public void success() { + doCreateVxlanNetworkOnController(vxlan, msg, completion); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + private void getH3cControllerLeaderIp(Completion completion) { + if (H3C_MGT_IP_IS_LEADER_IP) { + leaderIp = self.getIp(); + completion.success(); + return; + } + + H3cVcfcV2Commands.GetH3cTeamLederIpCmd cmd = getGetH3cTeamLederIpCmd(); + + try { + H3cVcfcV2Commands.GetH3cTeamLederIpReply rsp = new H3cVcfcHttpClient<>(getGetH3cTeamLederIpReplyClass()) + .syncCall(HttpMethod.GET.name(), self.getIp(), getH3cVcfcTeamLeaderIpPath(), cmd, getH3cHeaders(token)); + if (rsp == null) { + completion.fail(operr("Could not determine cluster leader because the SDN controller [ip:%s] did not respond", self.getIp())); + return; + } + + leaderIp = rsp.ip; + completion.success(); + } catch (Exception e) { + completion.fail(operr("Could not determine cluster leader for SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); + } + } + + @Override + public void getH3cControllerToken(Completion completion) { + H3cVcfcV2Commands.GetH3cTokenCmd cmd = getGetH3cTokenCmd(); + H3cVcfcV2Commands.LoginCmd loginCmd = getLoginCmd(); + loginCmd.user = self.getUsername(); + loginCmd.password = self.getPassword(); + cmd.login = loginCmd; + + try { + H3cVcfcV2Commands.LoginRsp rsp = new H3cVcfcHttpClient<>(getLoginRspClass()) + .syncCall(HttpMethod.POST.name(), self.getIp(), getH3cVcfcGetTokenPath(), cmd, getH3cHeaders()); + if (rsp == null) { + completion.fail(operr("Could not authenticate with SDN controller because controller [ip:%s] did not respond", self.getIp())); + return; + } + + token = rsp.record.token; + + completion.success(); + } catch (Exception e) { + completion.fail(operr("Could not authenticate with SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); + } + } + + @Override + public void getH3cVniRanges(Completion completion) { + H3cVcfcV2Commands.GetH3cVniRangeCmd cmd = getGetH3cVniRangeCmd(); + try { + H3cVcfcV2Commands.GetH3cVniRangeRsp rsp = new H3cVcfcHttpClient<>(getGetH3cVniRangeRspClass()) + .syncCall(HttpMethod.GET.name(), self.getIp(), getH3cVcfcVniRangesPath(), cmd, getH3cHeaders(token)); + if (rsp == null) { + completion.fail(operr("Could not retrieve VNI ranges because the SDN controller [ip:%s] did not respond", self.getIp())); + return; + } + // Delete previous inherent VNI range tags before creating new ones + H3cVcfcSdnControllerSystemTags.H3C_VNI_RANGE.delete(self.getUuid()); + int count = 0; + for (H3cVcfcV2Commands.H3cVniRangeStruct d : rsp.domains) { + for (H3cVcfcV2Commands.VniRangeStruct v : d.vlan_map_list) { + SystemTagCreator creator = H3cVcfcSdnControllerSystemTags.H3C_VNI_RANGE.newSystemTagCreator(self.getUuid()); + creator.ignoreIfExisting = false; + creator.inherent = false; + creator.setTagByTokens( + map( + e(H3cVcfcSdnControllerSystemTags.H3C_START_VNI_TOKEN, v.start_vxlan), + e(H3cVcfcSdnControllerSystemTags.H3C_END_VNI_TOKEN, v.end_vxlan) + ) + ); + creator.create(); + count++; + } + } + + if (count == 0) { + completion.fail(operr("Could not initialize SDN controller because no VNI ranges are configured on controller [ip:%s]", self.getIp())); + return; + } + + completion.success(); + } catch (Exception e) { + completion.fail(operr("Could not retrieve VNI ranges from SDN controller [ip:%s] because %s", self.getIp(), e.getLocalizedMessage())); + } + } + + private void getH3cParameters(APIAddSdnControllerMsg msg, Completion completion) { + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("get-h3c-parameters-%s", self.getIp())); + chain.then(new NoRollbackFlow() { + String __name__ = "get_h3c_controller_token"; + + @Override + public void run(FlowTrigger trigger, Map data) { + getH3cControllerToken(new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = "get_h3c_vni_ranges"; + + @Override + public void run(FlowTrigger trigger, Map data) { + getH3cVniRanges(new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); + } + + private void doCreateVxlanNetworkOnController(L2NetworkInventory vxlan, APICreateL2HardwareVxlanNetworkMsg msg, Completion completion) { + VxlanNetworkVO vo = dbf.findByUuid(vxlan.getUuid(), VxlanNetworkVO.class); + if (msg.getH3cTenantUuid() == null) { + completion.fail(operr("Could not create hardware VXLAN network because H3C tenant UUID is a mandatory parameter for the H3C VCFC V2 controller")); + return; + } + H3cSdnControllerTenantVO tenantVO = Q.New(H3cSdnControllerTenantVO.class) + .eq(H3cSdnControllerTenantVO_.uuid, msg.getH3cTenantUuid()) + .eq(H3cSdnControllerTenantVO_.sdnControllerUuid, self.getUuid()) + .limit(1) + .find(); + if (tenantVO == null) { + completion.fail(operr("Could not create hardware VXLAN network because the specified tenant does not exist in the SDN controller")); + return; + } + + H3cVcfcV2Commands.CreateH3cNetworksCmd cmd = getCreateH3cNetworksCmd(); + H3cVcfcV2Commands.NetworkCmd networkCmd = getNetworkCmd(); + networkCmd.name = vxlan.getName(); + networkCmd.tenant_id = tenantVO.getTenantUuid(); + networkCmd.distributed = true; + networkCmd.network_type = "VXLAN"; + networkCmd.original_network_type = "VXLAN"; + networkCmd.domain = tenantVO.getVdsUuid(); + networkCmd.segmentation_id = vo.getVni(); + networkCmd.external = false; + networkCmd.force_flat = false; + + cmd.networks.add(networkCmd); + try { + H3cVcfcV2Commands.CreateH3cNetworksRsp rsp = new H3cVcfcHttpClient<>(getCreateH3cNetworksRspClass()) + .syncCall(HttpMethod.POST.name(), leaderIp, getH3cVcfcL2NetworksPath(), cmd, getH3cHeaders(token)); + if (rsp == null) { + completion.fail(operr("Could not create VXLAN network because the SDN controller [ip:%s] did not respond", self.getIp())); + return; + } + H3cVcfcV2Commands.NetworkCmd network = rsp.networks.get(0); + SystemTagCreator creator = H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID.newSystemTagCreator(vxlan.getUuid()); + creator.ignoreIfExisting = false; + creator.inherent = false; + creator.setTagByTokens( + map( + e(H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID_TOKEN, network.id) + ) + ); + creator.create(); + + String routerId = createVirtualRouterOnController(SdnControllerConstant.SDN_CONTROLLER_VROUTER_PREFIX + network.name, tenantVO.getUuid()); + if (routerId != null) { + SystemTagCreator routerTagCreator = H3cVcfcSdnControllerSystemTags.H3C_L2_VROUTER_UUID.newSystemTagCreator(vxlan.getUuid()); + routerTagCreator.ignoreIfExisting = false; + routerTagCreator.inherent = false; + routerTagCreator.setTagByTokens(map(e(H3cVcfcSdnControllerSystemTags.H3C_L2_VROUTER_UUID_TOKEN, routerId))); + routerTagCreator.create(); + } + + if (tenantVO != null) { + SystemTagCreator tenantTagCreator = H3cVcfcSdnControllerSystemTags.H3C_L2_TENANT_UUID.newSystemTagCreator(vxlan.getUuid()); + tenantTagCreator.ignoreIfExisting = false; + tenantTagCreator.inherent = false; + tenantTagCreator.setTagByTokens(map(e(H3cVcfcSdnControllerSystemTags.H3C_L2_TENANT_UUID_TOKEN, tenantVO.getTenantUuid()))); + tenantTagCreator.create(); + } + completion.success(); + } catch (Exception e) { + completion.fail(operr("Could not create VXLAN network on SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); + } + } + + private void deleteVxlanNetworkOnController(L2NetworkInventory vxlan, Completion completion) { + getH3cControllerLeaderIp(new Completion(completion) { + @Override + public void success() { + doDeleteVxlanNetworkOnController(vxlan, completion); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + private void doDeleteVxlanNetworkOnController(L2NetworkInventory vxlan, Completion completion) { + H3cVcfcV2Commands.DeleteH3cNetworksCmd cmd = getDeleteH3cNetworksCmd(); + try { + String h3cL2NetworkUuid = H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID.getTokenByResourceUuid(vxlan.getUuid(), H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID_TOKEN); + H3cVcfcV2Commands.DeleteH3cNetworksRsp rsp = new H3cVcfcHttpClient<>(getDeleteH3cNetworksRspClass()) + .syncCall(HttpMethod.DELETE.name(), leaderIp, String.format("%s/%s", getH3cVcfcL2NetworksPath(), h3cL2NetworkUuid), cmd, getH3cHeaders(token)); + + String h3cL2VRouterUuid = H3cVcfcSdnControllerSystemTags.H3C_L2_VROUTER_UUID.getTokenByResourceUuid(vxlan.getUuid(), H3cVcfcSdnControllerSystemTags.H3C_L2_VROUTER_UUID_TOKEN); + if(h3cL2VRouterUuid != null) { + deleteVirtualRouterOnController(h3cL2VRouterUuid); + } + + completion.success(); + } catch (Exception e) { + completion.fail(operr("Could not delete VXLAN network on SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); + } + } + + private H3cVcfcCommands.DeleteH3cNetworksCmd getDeleteH3cNetworksCmd() { + return new H3cVcfcV2Commands.DeleteH3cNetworksCmd(); + } + + private H3cVcfcV2Commands.NetworkCmd getNetworkCmd() { + return new H3cVcfcV2Commands.NetworkCmd(); + } + + private H3cVcfcV2Commands.CreateH3cNetworksCmd getCreateH3cNetworksCmd() { + return new H3cVcfcV2Commands.CreateH3cNetworksCmd(); + } + + private Class getCreateH3cNetworksRspClass() { + return H3cVcfcV2Commands.CreateH3cNetworksRsp.class; + } + + private Class getGetH3cTenantsRspClass() { + return H3cVcfcV2Commands.GetH3cTenantsRsp.class; + } + + private Class getGetH3cSubnetsRspClass() { + return H3cVcfcV2Commands.GetH3cSubnetsRsp.class; + } + + @Override + protected String getH3cVcfcTenantsPath() { + return H3cVcfcV2Commands.H3C_VCFC_TENANTS; + } + + public List getAllH3cTenants() { + H3cVcfcV2Commands.GetH3cTenantsCmd cmd = new H3cVcfcV2Commands.GetH3cTenantsCmd(); + try { + H3cVcfcV2Commands.GetH3cTenantsRsp rsp = new H3cVcfcHttpClient<>(getGetH3cTenantsRspClass()) + .syncCall(HttpMethod.GET.name(), self.getIp(), H3cVcfcV2Commands.H3C_VCFC_TENANTS, cmd, getH3cHeaders(token)); + if (rsp == null || rsp.tenants == null) { + return new ArrayList<>(); + } + + // Validate response by checking for default tenant presence + boolean hasDefaultTenant = rsp.tenants.stream() + .anyMatch(tenant -> SdnControllerConstant.H3C_SDN_CONTROLLER_DEFAULT_TENANT_ID.equals(tenant.id)); + + if (!hasDefaultTenant) { + throw new RuntimeException(String.format("No default tenant found in SDN controller [ip:%s]", self.getIp())); + } + + return rsp.tenants; + } catch (Exception e) { + logger.error("Failed to get all tenants from SDN controller: " + e.getMessage(), e); + throw new RuntimeException(String.format("failed to get all tenants from SDN controller [ip:%s], error: %s", self.getIp(), e.getMessage()), e); + } + } + + private List getSubnetsByNetworkUuid(String networkUuid) { + H3cVcfcV2Commands.GetH3cSubnetsCmd cmd = new H3cVcfcV2Commands.GetH3cSubnetsCmd(); + cmd.network_id = networkUuid; + try { + H3cVcfcV2Commands.GetH3cSubnetsRsp rsp = new H3cVcfcHttpClient<>(getGetH3cSubnetsRspClass()) + .syncCall(HttpMethod.GET.name(), self.getIp(), H3cVcfcV2Commands.H3C_VCFC_SUBNETS, cmd, getH3cHeaders(token)); + if (rsp == null || rsp.subnets == null) { + return new ArrayList<>(); + } + return rsp.subnets; + } catch (Exception e) { + logger.error("Failed to get all subnets from SDN controller: " + e.getMessage(), e); + throw new RuntimeException(String.format("failed to get all subnets from SDN controller [ip:%s], error: %s", self.getIp(), e.getMessage()), e); + } + } + + private List createSubnets(List subnets) { + H3cVcfcV2Commands.CreateH3cSubnetsCmd cmd = new H3cVcfcV2Commands.CreateH3cSubnetsCmd(); + cmd.subnets = subnets; + try { + H3cVcfcV2Commands.CreateH3cSubnetsRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcV2Commands.CreateH3cSubnetsRsp.class) + .syncCall(HttpMethod.POST.name(), self.getIp(), H3cVcfcV2Commands.H3C_VCFC_SUBNETS, cmd, getH3cHeaders(token)); + if (rsp == null || rsp.subnets == null) { + return new ArrayList<>(); + } + return rsp.subnets; + } catch (Exception e) { + logger.error("Failed to create subnets on SDN controller: " + e.getMessage(), e); + throw new RuntimeException(String.format("failed to create subnets on SDN controller [ip:%s], error: %s", self.getIp(), e.getMessage()), e); + } + } + + private void deleteSubnet(String subnetId) { + H3cVcfcCommands.H3cCmd cmd = new H3cVcfcCommands.H3cCmd(); + try { + H3cVcfcCommands.H3cRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcCommands.H3cRsp.class) + .syncCall(HttpMethod.DELETE.name(), self.getIp(), String.format("%s/%s", H3cVcfcV2Commands.H3C_VCFC_SUBNETS, subnetId), cmd, getH3cHeaders(token)); + } catch (Exception e) { + logger.error("Failed to delete subnets on SDN controller: " + e.getMessage(), e); + throw new RuntimeException(String.format("failed to delete subnets on SDN controller [ip:%s], error: %s", self.getIp(), e.getMessage()), e); + } + } + + private String createVirtualRouterOnController(String routerName, String tenantUuid) { + H3cSdnControllerTenantVO tenantVO = Q.New(H3cSdnControllerTenantVO.class) + .eq(H3cSdnControllerTenantVO_.uuid, tenantUuid) + .eq(H3cSdnControllerTenantVO_.sdnControllerUuid, self.getUuid()) + .limit(1) + .find(); + if (tenantVO == null) { + logger.warn(String.format("cannot find tenant in sdn controller for virtual router [name:%s]", routerName)); + return null; + } + + H3cVcfcV2Commands.CreateH3cRoutersCmd cmd = new H3cVcfcV2Commands.CreateH3cRoutersCmd(); + H3cVcfcV2Commands.RouterCmd routerCmd = new H3cVcfcV2Commands.RouterCmd(); + routerCmd.name = routerName; + routerCmd.tenant_id = tenantVO.getTenantUuid(); + + cmd.routers.add(routerCmd); + try { + H3cVcfcV2Commands.CreateH3cRoutersRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcV2Commands.CreateH3cRoutersRsp.class) + .syncCall(HttpMethod.POST.name(), leaderIp, H3cVcfcV2Commands.H3C_VCFC_ROUTERS, cmd, getH3cHeaders(token)); + if (rsp == null || rsp.routers == null || rsp.routers.isEmpty()) { + logger.warn(String.format("create virtual router on sdn controller [ip:%s] failed", self.getIp())); + return null; + } + + H3cVcfcV2Commands.RouterCmd router = rsp.routers.get(0); + logger.info(String.format("Successfully created virtual router [name:%s, id:%s] on sdn controller [ip:%s]", + router.name, router.id, self.getIp())); + return router.id; + } catch (Exception e) { + logger.warn(String.format("create virtual router on sdn controller [ip:%s] failed because %s", self.getIp(), e.getMessage())); + } + return null; + } + + private void deleteVirtualRouterOnController(String routerId) { + H3cVcfcV2Commands.DeleteH3cRoutersCmd cmd = new H3cVcfcV2Commands.DeleteH3cRoutersCmd(); + try { + H3cVcfcV2Commands.DeleteH3cRoutersRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcV2Commands.DeleteH3cRoutersRsp.class) + .syncCall(HttpMethod.DELETE.name(), leaderIp, String.format("%s/%s", H3cVcfcV2Commands.H3C_VCFC_ROUTERS, routerId), cmd, getH3cHeaders(token)); + if (rsp == null) { + logger.warn(String.format("delete virtual router on sdn controller [ip:%s] failed", self.getIp())); + return; + } + + logger.info(String.format("Successfully deleted virtual router [id:%s] on sdn controller [ip:%s]", + routerId, self.getIp())); + + } catch (Exception e) { + logger.warn(String.format("delete virtual router on sdn controller [ip:%s] failed because %s", self.getIp(), e.getMessage())); + } + } + + private void addRouterInterface(String routerId, String subnetId) { + H3cVcfcV2Commands.AddRouterInterfaceCmd cmd = new H3cVcfcV2Commands.AddRouterInterfaceCmd(); + cmd.subnet_id = subnetId; + + try { + H3cVcfcV2Commands.AddRouterInterfaceRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcV2Commands.AddRouterInterfaceRsp.class) + .syncCall(HttpMethod.PUT.name(), self.getIp(), String.format("%s/%s/add_router_interface", H3cVcfcV2Commands.H3C_VCFC_ROUTERS, routerId), cmd, getH3cHeaders(token)); + if (rsp == null) { + logger.warn(String.format("add router interface on sdn controller [ip:%s] failed for router [id:%s] subnet [id:%s]", + self.getIp(), routerId, subnetId)); + } else { + logger.info(String.format("Successfully added router interface for router [id:%s] subnet [id:%s] on sdn controller [ip:%s]", + routerId, subnetId, self.getIp())); + } + } catch (Exception e) { + logger.warn(String.format("add router interface on sdn controller [ip:%s] failed for router [id:%s] subnet [id:%s] because %s", + self.getIp(), routerId, subnetId, e.getMessage())); + } + } + + private void removeRouterInterface(String routerId, String subnetId) { + H3cVcfcV2Commands.RemoveRouterInterfaceCmd cmd = new H3cVcfcV2Commands.RemoveRouterInterfaceCmd(); + cmd.subnet_id = subnetId; + + try { + H3cVcfcV2Commands.RemoveRouterInterfaceRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcV2Commands.RemoveRouterInterfaceRsp.class) + .syncCall(HttpMethod.PUT.name(), self.getIp(), String.format("%s/%s/remove_router_interface", H3cVcfcV2Commands.H3C_VCFC_ROUTERS, routerId), cmd, getH3cHeaders(token)); + if (rsp == null) { + logger.warn(String.format("remove router interface on sdn controller [ip:%s] failed for router [id:%s] subnet [id:%s]", + self.getIp(), routerId, subnetId)); + } else { + logger.info(String.format("Successfully removed router interface for router [id:%s] subnet [id:%s] on sdn controller [ip:%s]", + routerId, subnetId, self.getIp())); + } + } catch (Exception e) { + logger.warn(String.format("remove router interface on sdn controller [ip:%s] failed for router [id:%s] subnet [id:%s] because %s", + self.getIp(), routerId, subnetId, e.getMessage())); + } + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java index 93983b2e89f..d2b871abd0b 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java @@ -38,11 +38,11 @@ public HardwareVxlanNetwork(L2NetworkVO self) { } @Override - public void createVxlanNetworkOnSdnController(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion) { + public void createVxlanNetworkOnSdnController(L2VxlanNetworkInventory vxlan, APICreateL2NetworkMsg msg, Completion completion) { HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(vxlan.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); SdnControllerL2 sdnController = sdnControllerManager.getSdnControllerL2(sdn); - sdnController.createL2Network(vxlan, systemTags, completion); + sdnController.createL2Network(vxlan, msg, completion); } @Override diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkExtensionPoint.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkExtensionPoint.java index 459e730a59c..cee9ef1b6ce 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkExtensionPoint.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkExtensionPoint.java @@ -1,13 +1,14 @@ package org.zstack.sdnController.hardwareVxlan; import org.zstack.header.core.Completion; +import org.zstack.header.network.l2.APICreateL2NetworkMsg; import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; import java.util.List; public interface HardwareVxlanNetworkExtensionPoint { - void createVxlanNetworkOnSdnController(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); + void createVxlanNetworkOnSdnController(L2VxlanNetworkInventory vxlan, APICreateL2NetworkMsg msg, Completion completion); void attachL2NetworkToClusterOnSdnController(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); void deleteVxlanNetworkOnSdnController(VxlanNetworkVO vo, Completion completion); } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java index 0456d5ab760..cdd1b4ba093 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java @@ -163,7 +163,7 @@ public void rollback(FlowRollback trigger, Map data) { public void run(FlowTrigger trigger, Map data) { VxlanNetworkVO ovo = (VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); L2VxlanNetworkInventory vxlan = L2VxlanNetworkInventory.valueOf(ovo); - hardwareVxlan.createVxlanNetworkOnSdnController(vxlan, msg.getSystemTags(), new Completion(trigger) { + hardwareVxlan.createVxlanNetworkOnSdnController(vxlan, msg, new Completion(trigger) { @Override public void success() { trigger.next(); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsg.java index 33af6807901..56b23f85f47 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsg.java @@ -21,6 +21,9 @@ public class APIAddSdnControllerMsg extends APICreateMessage implements APIAudit @APIParam(maxLength = 255) private String vendorType; + @APIParam(required = false, maxLength = 255) + private String vendorVersion; + @APIParam(maxLength = 255) private String name; @@ -45,6 +48,14 @@ public void setVendorType(String vendorType) { this.vendorType = vendorType; } + public String getVendorVersion() { + return vendorVersion; + } + + public void setVendorVersion(String vendorVersion) { + this.vendorVersion = vendorVersion; + } + public String getIp() { return ip; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsg.java index 58308f1ae33..145d7807d68 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsg.java @@ -7,9 +7,11 @@ import org.zstack.header.message.OverriddenApiParams; import org.zstack.header.network.l2.APICreateL2NetworkMsg; import org.zstack.header.rest.RestRequest; +import org.zstack.header.tag.TagResourceType; import org.zstack.header.zone.ZoneVO; import org.zstack.network.l2.vxlan.vxlanNetworkPool.VxlanNetworkPoolConstant; +@TagResourceType(SdnControllerVO.class) @Action(category = VxlanNetworkPoolConstant.ACTION_CATEGORY) @OverriddenApiParams({ @OverriddenApiParam(field = "physicalInterface", param = @APIParam(maxLength = 1024, required = false)), @@ -28,6 +30,9 @@ public class APICreateL2HardwareVxlanNetworkMsg extends APICreateL2NetworkMsg { @APIParam(required = true, resourceType = HardwareL2VxlanNetworkPoolVO.class) private String poolUuid; + @APIParam(required = false, resourceType = H3cSdnControllerTenantVO.class) + private String h3cTenantUuid; + public Integer getVni() { return vni; } @@ -49,6 +54,14 @@ public void setPoolUuid(String poolUuid) { this.poolUuid = poolUuid; } + public String getH3cTenantUuid() { + return h3cTenantUuid; + } + + public void setH3cTenantUuid(String h3cTenantUuid) { + this.h3cTenantUuid = h3cTenantUuid; + } + public static APICreateL2HardwareVxlanNetworkMsg __example__() { APICreateL2HardwareVxlanNetworkMsg msg = new APICreateL2HardwareVxlanNetworkMsg(); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsgDoc_zh_cn.groovy index 78b84db85aa..2aae352d32b 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsgDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsgDoc_zh_cn.groovy @@ -148,6 +148,15 @@ doc { optional true since "4.8.0" } + column { + name "h3cTenantUuid" + enclosedIn "params" + desc "" + location "body" + type "String" + optional true + since "5.3.28" + } } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantEvent.java new file mode 100644 index 00000000000..e0e536b323f --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantEvent.java @@ -0,0 +1,38 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by boce.wang on 06/13/2025. + */ + +@RestResponse(allTo = "inventories") +public class APIPullSdnControllerTenantEvent extends APIEvent { + private List inventories; + + public List getInventories() { + return inventories; + } + + public void setInventories(List inventories) { + this.inventories = inventories; + } + + public APIPullSdnControllerTenantEvent(){ + } + + public APIPullSdnControllerTenantEvent(String apiId) { + super(apiId); + } + + public static APIPullSdnControllerTenantEvent __example__() { + APIPullSdnControllerTenantEvent event = new APIPullSdnControllerTenantEvent(); + List inventories = new ArrayList<>(); + event.setInventories(inventories); + return event; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..a32bca97ab3 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.sdnController.header + +import org.zstack.sdnController.header.H3cSdnControllerTenantInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "拉取SDN控制器租户结果" + + ref { + name "inventories" + path "org.zstack.sdnController.header.APIPullSdnControllerTenantEvent.inventories" + desc "null" + type "List" + since "5.3.28" + clz H3cSdnControllerTenantInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.28" + } + ref { + name "error" + path "org.zstack.sdnController.header.APIPullSdnControllerTenantEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.28" + clz ErrorCode.class + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsg.java new file mode 100644 index 00000000000..2265e017ab1 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsg.java @@ -0,0 +1,43 @@ +package org.zstack.sdnController.header; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; + +/** + * Created by boce.wang on 06/13/2025. + */ + +@RestRequest( + path = "/sdn-controllers/{uuid}/tenant/actions", + method = HttpMethod.PUT, + responseClass = APIPullSdnControllerTenantEvent.class, + isAction = true +) +@Action(category = SdnControllerConstant.ACTION_CATEGORY) +public class APIPullSdnControllerTenantMsg extends APIMessage implements SdnControllerMessage { + @APIParam(resourceType = SdnControllerVO.class, checkAccount = true, operationTarget = true) + private String uuid; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + @Override + public String getSdnControllerUuid() { + return uuid; + } + + public static APIPullSdnControllerTenantMsg __example__() { + APIPullSdnControllerTenantMsg msg = new APIPullSdnControllerTenantMsg(); + msg.setUuid(uuid()); + + return msg; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..420c5c2d677 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsgDoc_zh_cn.groovy @@ -0,0 +1,58 @@ +package org.zstack.sdnController.header + +import org.zstack.sdnController.header.APIPullSdnControllerTenantEvent + +doc { + title "PullSdnControllerTenant" + + category "SdnController" + + desc """拉取SDN控制器租户""" + + rest { + request { + url "PUT /v1/sdn-controllers/{uuid}/tenant/actions" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIPullSdnControllerTenantMsg.class + + desc """""" + + params { + + column { + name "uuid" + enclosedIn "pullSdnControllerTenant" + desc "资源的UUID,唯一标示该资源" + location "url" + type "String" + optional false + since "5.3.28" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.28" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.28" + } + } + } + + response { + clz APIPullSdnControllerTenantEvent.class + } + } +} \ No newline at end of file diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantInventory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantInventory.java new file mode 100644 index 00000000000..fbdf67d77b7 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantInventory.java @@ -0,0 +1,134 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.query.ExpandedQueries; +import org.zstack.header.query.ExpandedQuery; +import org.zstack.header.search.Inventory; + +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Created by boce.wang on 06/16/2025. + */ +@Inventory(mappingVOClass = H3cSdnControllerTenantVO.class) +@ExpandedQueries({ + @ExpandedQuery(expandedField = "sdnController", inventoryClass = SdnControllerInventory.class, + foreignKey = "sdnControllerUuid", expandedInventoryKey = "uuid") +}) +public class H3cSdnControllerTenantInventory { + private String uuid; + private String sdnControllerUuid; + private String tenantUuid; + private String vdsUuid; + private String tenantName; + private String vdsName; + private String cloudDomainName; + private String state; + private Timestamp createDate; + private Timestamp lastOpDate; + + public static H3cSdnControllerTenantInventory valueOf(H3cSdnControllerTenantVO vo) { + H3cSdnControllerTenantInventory inv = new H3cSdnControllerTenantInventory(); + inv.setUuid(vo.getUuid()); + inv.setSdnControllerUuid(vo.getSdnControllerUuid()); + inv.setTenantUuid(vo.getTenantUuid()); + inv.setVdsUuid(vo.getVdsUuid()); + inv.setTenantName(vo.getTenantName()); + inv.setVdsName(vo.getVdsName()); + inv.setCloudDomainName(vo.getCloudDomainName()); + inv.setState(vo.getState()); + inv.setCreateDate(vo.getCreateDate()); + inv.setLastOpDate(vo.getLastOpDate()); + return inv; + } + + public static List valueOf(Collection vos) { + List invs = new ArrayList(); + for (H3cSdnControllerTenantVO vo : vos) { + invs.add(valueOf(vo)); + } + return invs; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getTenantUuid() { + return tenantUuid; + } + + public void setTenantUuid(String tenantUuid) { + this.tenantUuid = tenantUuid; + } + + public String getVdsUuid() { + return vdsUuid; + } + + public void setVdsUuid(String vdsUuid) { + this.vdsUuid = vdsUuid; + } + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + + public String getVdsName() { + return vdsName; + } + + public void setVdsName(String vdsName) { + this.vdsName = vdsName; + } + + public String getCloudDomainName() { + return cloudDomainName; + } + + public void setCloudDomainName(String cloudDomainName) { + this.cloudDomainName = cloudDomainName; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantInventoryDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..f0232fe9282 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantInventoryDoc_zh_cn.groovy @@ -0,0 +1,69 @@ +package org.zstack.sdnController.header + +import java.sql.Timestamp + +doc { + + title "SDN控制器租户清单" + + field { + name "uuid" + desc "资源的UUID,唯一标示该资源" + type "String" + since "5.3.28" + } + field { + name "sdnControllerUuid" + desc "" + type "String" + since "5.3.28" + } + field { + name "tenantUuid" + desc "" + type "String" + since "5.3.28" + } + field { + name "vdsUuid" + desc "" + type "String" + since "5.3.28" + } + field { + name "tenantName" + desc "" + type "String" + since "5.3.28" + } + field { + name "vdsName" + desc "" + type "String" + since "5.3.28" + } + field { + name "cloudDomainName" + desc "" + type "String" + since "5.3.28" + } + field { + name "status" + desc "" + type "String" + since "5.3.28" + } + field { + name "createDate" + desc "创建时间" + type "Timestamp" + since "5.3.28" + } + field { + name "lastOpDate" + desc "最后一次修改时间" + type "Timestamp" + since "5.3.28" + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantVO.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantVO.java new file mode 100644 index 00000000000..84f7f37acd5 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantVO.java @@ -0,0 +1,132 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.vo.EntityGraph; +import org.zstack.header.vo.ForeignKey; + +import javax.persistence.*; +import java.sql.Timestamp; + +/** + * Created by boce.wang on 06/13/2025. + */ +@Entity +@Table +@EntityGraph( + friends = { + @EntityGraph.Neighbour(type = SdnControllerVO.class, myField = "sdnControllerUuid", targetField = "uuid"), + } +) +public class H3cSdnControllerTenantVO { + + @Column + @Id + private String uuid; + + @Column + @ForeignKey(parentEntityClass = SdnControllerVO.class, onDeleteAction = ForeignKey.ReferenceOption.CASCADE) + private String sdnControllerUuid; + + @Column + private String tenantUuid; + @Column + private String vdsUuid; + @Column + private String tenantName; + @Column + private String vdsName; + @Column + private String cloudDomainName; + @Column + private String state; + + @Column + private Timestamp createDate; + + @Column + private Timestamp lastOpDate; + + @PreUpdate + private void preUpdate() { + lastOpDate = null; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getTenantUuid() { + return tenantUuid; + } + + public void setTenantUuid(String tenantUuid) { + this.tenantUuid = tenantUuid; + } + + public String getVdsUuid() { + return vdsUuid; + } + + public void setVdsUuid(String vdsUuid) { + this.vdsUuid = vdsUuid; + } + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + + public String getVdsName() { + return vdsName; + } + + public void setVdsName(String vdsName) { + this.vdsName = vdsName; + } + + public String getCloudDomainName() { + return cloudDomainName; + } + + public void setCloudDomainName(String cloudDomainName) { + this.cloudDomainName = cloudDomainName; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantVO_.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantVO_.java new file mode 100644 index 00000000000..e93073735b1 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantVO_.java @@ -0,0 +1,22 @@ +package org.zstack.sdnController.header; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; +import java.sql.Timestamp; + +/** + * Created by boce.wang on 06/16/2025. + */ +@StaticMetamodel(H3cSdnControllerTenantVO.class) +public class H3cSdnControllerTenantVO_ { + public static volatile SingularAttribute uuid; + public static volatile SingularAttribute sdnControllerUuid; + public static volatile SingularAttribute tenantUuid; + public static volatile SingularAttribute vdsUuid; + public static volatile SingularAttribute tenantName; + public static volatile SingularAttribute vdsName; + public static volatile SingularAttribute cloudDomainName; + public static volatile SingularAttribute state; + public static volatile SingularAttribute createDate; + public static volatile SingularAttribute lastOpDate; +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO.java new file mode 100644 index 00000000000..ad4be72bc76 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO.java @@ -0,0 +1,109 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.network.l3.IpRangeEO; +import org.zstack.header.vo.EntityGraph; +import org.zstack.header.vo.ForeignKey; +import org.zstack.header.vo.ForeignKey.ReferenceOption; + +import javax.persistence.*; +import java.sql.Timestamp; + +/** + * Created by boce.wang on 07/02/2025. + */ + +@Entity +@Table +@org.zstack.header.vo.EntityGraph( + friends = { + @EntityGraph.Neighbour(type = SdnControllerVO.class, myField = "sdnControllerUuid", targetField = "uuid"), + @EntityGraph.Neighbour(type = IpRangeEO.class, myField = "ipRangeUuid", targetField = "uuid") + } +) +public class H3cSdnSubnetIpRangeRefVO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column + private long id; + + @Column + @ForeignKey(parentEntityClass = SdnControllerVO.class, onDeleteAction = ReferenceOption.CASCADE) + private String sdnControllerUuid; + + @Column + @ForeignKey(parentEntityClass = IpRangeEO.class, onDeleteAction = ReferenceOption.CASCADE) + private String ipRangeUuid; + + @Column + private String subnetUuid; + + @Column + private String l2NetworkUuid; + + @Column + private Timestamp createDate; + + @Column + private Timestamp lastOpDate; + + @PreUpdate + private void preUpdate() { + lastOpDate = null; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getIpRangeUuid() { + return ipRangeUuid; + } + + public void setIpRangeUuid(String ipRangeUuid) { + this.ipRangeUuid = ipRangeUuid; + } + + public String getSubnetUuid() { + return subnetUuid; + } + + public void setSubnetUuid(String subnetUuid) { + this.subnetUuid = subnetUuid; + } + + public String getL2NetworkUuid() { + return l2NetworkUuid; + } + + public void setL2NetworkUuid(String l2NetworkUuid) { + this.l2NetworkUuid = l2NetworkUuid; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO_.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO_.java new file mode 100644 index 00000000000..a74ac66cee7 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO_.java @@ -0,0 +1,19 @@ +package org.zstack.sdnController.header; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; +import java.sql.Timestamp; + +/** + * Created by boce.wang on 07/02/2025. + */ +@StaticMetamodel(H3cSdnSubnetIpRangeRefVO.class) +public class H3cSdnSubnetIpRangeRefVO_ { + public static volatile SingularAttribute uuid; + public static volatile SingularAttribute sdnControllerUuid; + public static volatile SingularAttribute ipRangeUuid; + public static volatile SingularAttribute subnetUuid; + public static volatile SingularAttribute l2NetworkUuid; + public static volatile SingularAttribute createDate; + public static volatile SingularAttribute lastOpDate; +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/PullSdnControllerTenantMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/PullSdnControllerTenantMsg.java new file mode 100644 index 00000000000..c70c94a5ec8 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/PullSdnControllerTenantMsg.java @@ -0,0 +1,25 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.NeedReplyMessage; + +/** + * Created by boce.wang on 06/13/2025. + */ +public class PullSdnControllerTenantMsg extends NeedReplyMessage implements SdnControllerMessage { + private String sdnControllerUuid; + + public static PullSdnControllerTenantMsg fromApi(APIPullSdnControllerTenantMsg amsg) { + PullSdnControllerTenantMsg msg = new PullSdnControllerTenantMsg(); + msg.setSdnControllerUuid(amsg.getSdnControllerUuid()); + return msg; + } + + @Override + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/PullSdnControllerTenantReply.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/PullSdnControllerTenantReply.java new file mode 100644 index 00000000000..4332fc9d1df --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/PullSdnControllerTenantReply.java @@ -0,0 +1,20 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.MessageReply; + +import java.util.List; + +/** + * Created by boce.wang on 06/13/2025. + */ +public class PullSdnControllerTenantReply extends MessageReply { + private List inventories; + + public List getInventories() { + return inventories; + } + + public void setInventories(List inventories) { + this.inventories = inventories; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerMsg.java index 8a088840326..37b6cc0b00d 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerMsg.java @@ -3,18 +3,18 @@ import org.zstack.header.message.NeedReplyMessage; public class ReconnectSdnControllerMsg extends NeedReplyMessage implements SdnControllerMessage { - String controllerUUid; + private String controllerUuid; - public String getControllerUUid() { - return controllerUUid; + public String getControllerUuid() { + return controllerUuid; } - public void setControllerUUid(String controllerUUid) { - this.controllerUUid = controllerUUid; + public void setControllerUuid(String controllerUuid) { + this.controllerUuid = controllerUuid; } @Override public String getSdnControllerUuid() { - return controllerUUid; + return controllerUuid; } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerConstant.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerConstant.java index 8552c56c167..7282ea80730 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerConstant.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerConstant.java @@ -12,16 +12,31 @@ public class SdnControllerConstant { @PythonClass public static final String HARDWARE_VXLAN_NETWORK_TYPE = "HardwareVxlanNetwork"; + public static final String DEFAULT_VENDOR_VERSION = "V1"; + public static final String ACTION_CATEGORY = "SdnController"; public static final String SERVICE_ID = "SdnController"; public static final String H3C_VCFC_CONTROLLER = "H3C VCFC"; + + public static final String H3C_VCFC_VENDOR_VERSION_V1 = DEFAULT_VENDOR_VERSION; + public static final String H3C_VCFC_VENDOR_VERSION_V2 = "V2"; + public static final String H3C_VCFC_DEFAULT_TENANT_NAME = "default"; public static final String H3C_VCFC_DEFAULT_TENANT_TYPE = "default"; + // H3C SDN Controller Tenant Status + public static final String H3C_SDN_CONTROLLER_TENANT_STATE_ENABLE = "Enabled"; + public static final String H3C_SDN_CONTROLLER_TENANT_STATE_DISABLE = "Disabled"; + + // H3C SDN Controller Default Tenant ID (cannot be deleted) + public static final String H3C_SDN_CONTROLLER_DEFAULT_TENANT_ID = "ffffffff-0000-0000-0000-000000000001"; + public static final String TF_CONTROLLER = "TF"; + public static final String SDN_CONTROLLER_VROUTER_PREFIX = "VR_"; + public enum Processes{ Pre, Post diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventory.java index c79c9f373ef..fef5f0670e3 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventory.java @@ -19,6 +19,7 @@ public class SdnControllerInventory implements Serializable { private String uuid; private String vendorType; + private String vendorVersion; private String name; private String description; private String ip; @@ -36,6 +37,7 @@ public static SdnControllerInventory valueOf(SdnControllerVO vo) { SdnControllerInventory inv = new SdnControllerInventory(); inv.setUuid(vo.getUuid()); inv.setVendorType(vo.getVendorType()); + inv.setVendorVersion(vo.getVendorVersion()); inv.setDescription(vo.getDescription()); inv.setName(vo.getName()); inv.setIp(vo.getIp()); @@ -83,6 +85,14 @@ public void setVendorType(String vendorType) { this.vendorType = vendorType; } + public String getVendorVersion() { + return vendorVersion; + } + + public void setVendorVersion(String vendorVersion) { + this.vendorVersion = vendorVersion; + } + public String getName() { return name; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO.java index 060884551f7..5aec348a145 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO.java @@ -26,6 +26,9 @@ public class SdnControllerVO extends ResourceVO implements OwnedByAccount, ToInv @Column private String vendorType; + @Column + private String vendorVersion; + @Column private String name; @@ -77,6 +80,14 @@ public void setVendorType(String vendorType) { this.vendorType = vendorType; } + public String getVendorVersion() { + return vendorVersion; + } + + public void setVendorVersion(String vendorVersion) { + this.vendorVersion = vendorVersion; + } + public String getName() { return name; } diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java index 9abd1dcf556..8147f7d9f82 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java @@ -116,7 +116,7 @@ public void preCreateVxlanNetwork(L2VxlanNetworkInventory vxlan, List sy } @Override - public void createL2Network(L2NetworkInventory inv, List systemTags, Completion completion) { + public void createL2Network(L2NetworkInventory inv, APICreateL2NetworkMsg msg, Completion completion) { completion.success(); } diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 0b70997cc82..2c2b594001a 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -611,6 +611,7 @@ public class SourceClassMap { put("org.zstack.resourceconfig.APIGetResourceBindableConfigReply$ResourceBindableConfigStruct", "org.zstack.sdk.ResourceBindableConfigStruct"); put("org.zstack.resourceconfig.ResourceConfigInventory", "org.zstack.sdk.ResourceConfigInventory"); put("org.zstack.resourceconfig.ResourceConfigStruct", "org.zstack.sdk.ResourceConfigStruct"); + put("org.zstack.sdnController.header.H3cSdnControllerTenantInventory", "org.zstack.sdk.H3cSdnControllerTenantInventory"); put("org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory", "org.zstack.sdk.HardwareL2VxlanNetworkPoolInventory"); put("org.zstack.sdnController.header.SdnControllerHostRefInventory", "org.zstack.sdk.SdnControllerHostRefInventory"); put("org.zstack.sdnController.header.SdnControllerInventory", "org.zstack.sdk.SdnControllerInventory"); @@ -1023,6 +1024,7 @@ public class SourceClassMap { put("org.zstack.sdk.GuestVmScriptExecutedRecordDetailInventory", "org.zstack.guesttools.GuestVmScriptExecutedRecordDetailInventory"); put("org.zstack.sdk.GuestVmScriptExecutedRecordInventory", "org.zstack.guesttools.GuestVmScriptExecutedRecordInventory"); put("org.zstack.sdk.GuestVmScriptInventory", "org.zstack.guesttools.GuestVmScriptInventory"); + put("org.zstack.sdk.H3cSdnControllerTenantInventory", "org.zstack.sdnController.header.H3cSdnControllerTenantInventory"); put("org.zstack.sdk.HaStrategyConditionInventory", "org.zstack.ha.HaStrategyConditionInventory"); put("org.zstack.sdk.HaiTaiSecretResourcePoolInventory", "org.zstack.crypto.securitymachine.thirdparty.haitai.HaiTaiSecretResourcePoolInventory"); put("org.zstack.sdk.HardwareL2VxlanNetworkPoolInventory", "org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/AddSdnControllerAction.java b/sdk/src/main/java/org/zstack/sdk/AddSdnControllerAction.java index b0b11f2877c..8a03256cd95 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddSdnControllerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddSdnControllerAction.java @@ -28,6 +28,9 @@ public Result throwExceptionIfError() { @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vendorType; + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vendorVersion; + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkAction.java index 75b58922b3f..b6de94c6cae 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkAction.java @@ -31,6 +31,9 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String poolUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String h3cTenantUuid; + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; diff --git a/sdk/src/main/java/org/zstack/sdk/GetAvailableVpcL3NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/GetAvailableVpcL3NetworkAction.java new file mode 100644 index 00000000000..a4cfdf4ba2b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetAvailableVpcL3NetworkAction.java @@ -0,0 +1,95 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetAvailableVpcL3NetworkAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.GetAvailableVpcL3NetworkResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.GetAvailableVpcL3NetworkResult value = res.getResult(org.zstack.sdk.GetAvailableVpcL3NetworkResult.class); + ret.value = value == null ? new org.zstack.sdk.GetAvailableVpcL3NetworkResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/vpc/virtual-routers/available-vpc-l3s"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetAvailableVpcL3NetworkResult.java b/sdk/src/main/java/org/zstack/sdk/GetAvailableVpcL3NetworkResult.java new file mode 100644 index 00000000000..7520b896114 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetAvailableVpcL3NetworkResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class GetAvailableVpcL3NetworkResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/H3cSdnControllerTenantInventory.java b/sdk/src/main/java/org/zstack/sdk/H3cSdnControllerTenantInventory.java new file mode 100644 index 00000000000..55a399e501f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/H3cSdnControllerTenantInventory.java @@ -0,0 +1,87 @@ +package org.zstack.sdk; + + + +public class H3cSdnControllerTenantInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String sdnControllerUuid; + public void setSdnControllerUuid(java.lang.String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + public java.lang.String getSdnControllerUuid() { + return this.sdnControllerUuid; + } + + public java.lang.String tenantUuid; + public void setTenantUuid(java.lang.String tenantUuid) { + this.tenantUuid = tenantUuid; + } + public java.lang.String getTenantUuid() { + return this.tenantUuid; + } + + public java.lang.String vdsUuid; + public void setVdsUuid(java.lang.String vdsUuid) { + this.vdsUuid = vdsUuid; + } + public java.lang.String getVdsUuid() { + return this.vdsUuid; + } + + public java.lang.String tenantName; + public void setTenantName(java.lang.String tenantName) { + this.tenantName = tenantName; + } + public java.lang.String getTenantName() { + return this.tenantName; + } + + public java.lang.String vdsName; + public void setVdsName(java.lang.String vdsName) { + this.vdsName = vdsName; + } + public java.lang.String getVdsName() { + return this.vdsName; + } + + public java.lang.String cloudDomainName; + public void setCloudDomainName(java.lang.String cloudDomainName) { + this.cloudDomainName = cloudDomainName; + } + public java.lang.String getCloudDomainName() { + return this.cloudDomainName; + } + + public java.lang.String state; + public void setState(java.lang.String state) { + this.state = state; + } + public java.lang.String getState() { + return this.state; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/PullSdnControllerTenantAction.java b/sdk/src/main/java/org/zstack/sdk/PullSdnControllerTenantAction.java new file mode 100644 index 00000000000..615aeedd813 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/PullSdnControllerTenantAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class PullSdnControllerTenantAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.PullSdnControllerTenantResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.PullSdnControllerTenantResult value = res.getResult(org.zstack.sdk.PullSdnControllerTenantResult.class); + ret.value = value == null ? new org.zstack.sdk.PullSdnControllerTenantResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/sdn-controllers/{uuid}/tenant/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "pullSdnControllerTenant"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/PullSdnControllerTenantResult.java b/sdk/src/main/java/org/zstack/sdk/PullSdnControllerTenantResult.java new file mode 100644 index 00000000000..0627e44bd89 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/PullSdnControllerTenantResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class PullSdnControllerTenantResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerInventory.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerInventory.java index 9ee1e373677..bb1005a7211 100644 --- a/sdk/src/main/java/org/zstack/sdk/SdnControllerInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerInventory.java @@ -20,6 +20,14 @@ public java.lang.String getVendorType() { return this.vendorType; } + public java.lang.String vendorVersion; + public void setVendorVersion(java.lang.String vendorVersion) { + this.vendorVersion = vendorVersion; + } + public java.lang.String getVendorVersion() { + return this.vendorVersion; + } + public java.lang.String name; public void setName(java.lang.String name) { this.name = name; diff --git a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy index 36072291389..cd10000305f 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy @@ -1,14 +1,21 @@ package org.zstack.test.integration.network.sdnController +import org.springframework.http.HttpEntity import org.zstack.core.db.DatabaseFacade +import org.zstack.core.db.Q +import org.zstack.header.network.l3.L3NetworkConstant import org.zstack.sdk.* +import org.zstack.sdnController.SdnControllerGlobalConfig +import org.zstack.sdnController.h3cVcfc.H3cVcfcCommands +import org.zstack.sdnController.h3cVcfc.H3cVcfcV2Commands +import org.zstack.sdnController.h3cVcfc.H3cVcfcSdnControllerSystemTags +import org.zstack.sdnController.header.H3cSdnControllerTenantVO +import org.zstack.sdnController.header.H3cSdnControllerTenantVO_ import org.zstack.sdnController.header.SdnControllerConstant import org.zstack.sdnController.header.SdnControllerVO -import org.zstack.header.network.l3.L3NetworkConstant -import org.zstack.sdnController.h3cVcfc.H3cVcfcSdnControllerSystemTags import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase - +import org.zstack.utils.gson.JSONObjectUtil /** * Created by shixin on 2019/09/30. */ @@ -33,6 +40,9 @@ class SdnControllerCase extends SubCase { env.create { dbf = bean(DatabaseFacade.class) testSdnControllerApi() + testH3cV2ControllerApi() + testSdnControllerPing() + testSdnControllerReconnect() } } @@ -41,6 +51,105 @@ class SdnControllerCase extends SubCase { env.delete() } + void testH3cV2ControllerApi() { + def zone = env.inventoryByName("zone") as ZoneInventory + def cluster = env.inventoryByName("cluster") as ClusterInventory + String h3cVdsUuid = "abdssef" + String inputTenantUuid = "adddddc" + String sVni = "400" + String eVni = "500" + + SdnControllerInventory sdn2 = addSdnController { + vendorType = SdnControllerConstant.H3C_VCFC_CONTROLLER + name = "sdn1" + ip = "192.168.1.1" + userName = "user" + password = "password" + vendorVersion = SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2 + systemTags = [String.format("vdsUuid::%s", h3cVdsUuid), String.format("tenantUuid::%s", inputTenantUuid), String.format("startVni::%s::endVni::%s", sVni, eVni)] + } + + testPullSdnControllerTenant(sdn2) + } + + void testPullSdnControllerTenant(SdnControllerInventory sdn) { + // Test pull tenant operation (only supported by H3C VCFC V2) + // 1. First pull tenant information + def result = pullSdnControllerTenant { + uuid = sdn.uuid + } as List + + assert result.size() > 0 + + // 2. Query tenant records in database + def tenantVOs = Q.New(H3cSdnControllerTenantVO.class) + .eq(H3cSdnControllerTenantVO_.sdnControllerUuid, sdn.uuid) + .list() + + // Should have 3 tenant records based on mock data + assert tenantVOs.size() == 3 + + // Verify Test tenant data + def testTenantRecords = tenantVOs.findAll { it.tenantUuid == "03e01b37-8440-471a-aa8f-8d1fb8cc1381" } + assert testTenantRecords.size() == 1 + assert testTenantRecords[0].tenantName == "Test" + assert testTenantRecords[0].state == SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_ENABLE + assert testTenantRecords[0].vdsUuid == "eb32cf5e-04e9-42ad-b64c-2c3f9bacd3cc" + + // Verify default tenant data + def defaultTenantRecords = tenantVOs.findAll { it.tenantUuid == "ffffffff-0000-0000-0000-000000000001" } + assert defaultTenantRecords.size() == 1 + assert defaultTenantRecords[0].tenantName == "default" + assert defaultTenantRecords[0].state == SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_ENABLE + assert defaultTenantRecords[0].vdsUuid == "ffffffff-0000-0000-0000-000000000001" + + // Verify sr tenant data + def srTenantRecords = tenantVOs.findAll { it.tenantUuid == "c9d49b6f-d2cd-4636-b9d4-be0f9c9c7783" } + assert srTenantRecords.size() == 1 + assert srTenantRecords[0].tenantName == "sr" + assert srTenantRecords[0].state == SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_ENABLE + assert srTenantRecords[0].vdsUuid == "ffffffff-0000-0000-0000-000000000001" + + // 3. Pull again to verify idempotency + def result2 = pullSdnControllerTenant { + uuid = sdn.uuid + } as List + + assert result2.size() == 3 + + // Verify database record count unchanged + def tenantVOs2 = Q.New(H3cSdnControllerTenantVO.class) + .eq(H3cSdnControllerTenantVO_.sdnControllerUuid, sdn.uuid) + .list() + assert tenantVOs2.size() == 3 + + // 4. Test unsupported controller version + // Create a V1 controller + SdnControllerInventory sdnV1 = addSdnController { + vendorType = SdnControllerConstant.H3C_VCFC_CONTROLLER + name = "sdn-v1" + ip = "192.168.1.2" + userName = "user" + password = "password" + vendorVersion = SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V1 + systemTags = ["vdsUuid::test-vds-uuid"] + } + + // Pull tenant operation should fail for V1 controller + expectError { + pullSdnControllerTenant { + uuid = sdnV1.uuid + } + } + + removeSdnController { + uuid = sdnV1.uuid + } + removeSdnController { + uuid = sdn.uuid + } + } + void testSdnControllerApi() { def zone = env.inventoryByName("zone") as ZoneInventory def cluster = env.inventoryByName("cluster") as ClusterInventory @@ -196,7 +305,7 @@ class SdnControllerCase extends SubCase { deleteL2Network { delegate.uuid = softPool.getUuid() } - + //AbstractVniAllocatorStrategy allocateRequiredVni: out of vni range expectError { createL2HardwareVxlanNetwork { @@ -254,4 +363,137 @@ class SdnControllerCase extends SubCase { vxlanNetworks = queryL2Network {conditions=["type=" + SdnControllerConstant.HARDWARE_VXLAN_NETWORK_TYPE]} assert vxlanNetworks.size() == 0 } + + void testSdnControllerPing() { + // Setup mock simulator for successful controller creation + env.simulator(H3cVcfcV2Commands.H3C_VCFC_GET_TOKEN) { HttpEntity e, EnvSpec spec -> + def rsp = new H3cVcfcV2Commands.LoginRsp() + rsp.record = new H3cVcfcV2Commands.LoginReply() + rsp.record.token = "init-token-12345" + rsp.record.userName = "user" + rsp.record.domainName = "default" + return rsp + } + + // Create H3C V2 SDN controller + SdnControllerInventory sdn = addSdnController { + vendorType = SdnControllerConstant.H3C_VCFC_CONTROLLER + name = "sdn-ping-test" + ip = "192.168.1.10" + userName = "user" + password = "password" + vendorVersion = SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2 + } + + // Verify initial status is Connected + assert sdn.status == org.zstack.sdk.SdnControllerStatus.Connected + + // Set ping interval to 1 second for testing + SdnControllerGlobalConfig.PING_INTERVAL.updateValue(1) + + // Mock token retrieval failure to simulate ping failure + env.simulator(H3cVcfcV2Commands.H3C_VCFC_GET_TOKEN) { HttpEntity e, EnvSpec spec -> + def rsp = new H3cVcfcV2Commands.LoginRsp() + rsp.record = null + return rsp + } + + // Wait for ping failure, status should change to Disconnected + retryInSecs(10) { + SdnControllerInventory currentSdn = querySdnController { conditions = ["uuid=${sdn.uuid}".toString()] }[0] + assert currentSdn.status == org.zstack.sdk.SdnControllerStatus.Disconnected + } + + // Mock token retrieval success to simulate ping recovery + env.simulator(H3cVcfcV2Commands.H3C_VCFC_GET_TOKEN) { HttpEntity e, EnvSpec spec -> + def rsp = new H3cVcfcV2Commands.LoginRsp() + rsp.record = new H3cVcfcV2Commands.LoginReply() + rsp.record.token = "test-token-12345" + rsp.record.userName = "user" + rsp.record.domainName = "default" + return rsp + } + + // Wait for ping success, status should change to Connected + retryInSecs(10) { + SdnControllerInventory currentSdn = querySdnController { conditions = ["uuid=${sdn.uuid}".toString()] }[0] + assert currentSdn.status == org.zstack.sdk.SdnControllerStatus.Connected + } + + // Cleanup + removeSdnController { + uuid = sdn.uuid + } + } + + void testSdnControllerReconnect() { + // Setup mock simulator for successful controller creation + env.simulator(H3cVcfcV2Commands.H3C_VCFC_GET_TOKEN) { HttpEntity e, EnvSpec spec -> + def rsp = new H3cVcfcV2Commands.LoginRsp() + rsp.record = new H3cVcfcV2Commands.LoginReply() + rsp.record.token = "init-token-67890" + rsp.record.userName = "user" + rsp.record.domainName = "default" + return rsp + } + + // Create H3C V2 SDN controller + SdnControllerInventory sdn = addSdnController { + vendorType = SdnControllerConstant.H3C_VCFC_CONTROLLER + name = "sdn-reconnect-test" + ip = "192.168.1.20" + userName = "user" + password = "password" + vendorVersion = SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2 + } + + // Verify initial status is Connected + assert sdn.status == org.zstack.sdk.SdnControllerStatus.Connected + + // Mock successful token retrieval for reconnect + boolean reconnectCalled = false + env.simulator(H3cVcfcV2Commands.H3C_VCFC_GET_TOKEN) { HttpEntity e, EnvSpec spec -> + reconnectCalled = true + def rsp = new H3cVcfcV2Commands.LoginRsp() + rsp.record = new H3cVcfcV2Commands.LoginReply() + rsp.record.token = "reconnect-token-67890" + rsp.record.userName = "user" + rsp.record.domainName = "default" + return rsp + } + + // Manually trigger reconnect + reconnectSdnController { + sdnControllerUuid = sdn.uuid + } + + // Verify reconnect called token retrieval + assert reconnectCalled + + // Verify status remains Connected + SdnControllerInventory currentSdn = querySdnController { conditions = ["uuid=${sdn.uuid}".toString()] }[0] + assert currentSdn.status == org.zstack.sdk.SdnControllerStatus.Connected + + // Test reconnect failure scenario + reconnectCalled = false + env.simulator(H3cVcfcV2Commands.H3C_VCFC_GET_TOKEN) { HttpEntity e, EnvSpec spec -> + reconnectCalled = true + throw new RuntimeException("Connection failed") + } + + // Manually trigger reconnect, expect failure + expect(AssertionError.class) { + reconnectSdnController { + sdnControllerUuid = sdn.uuid + } + } + + // Verify reconnect called token retrieval + assert reconnectCalled + + // Cleanup + removeSdnController { + uuid = sdn.uuid + } + } } diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 822410003a3..1e18d5f2442 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -27584,6 +27584,33 @@ abstract class ApiHelper { } + def pullSdnControllerTenant(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PullSdnControllerTenantAction.class) Closure c) { + def a = new org.zstack.sdk.PullSdnControllerTenantAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def pushLicenseAddOnsUsage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PushLicenseAddOnsUsageAction.class) Closure c) { def a = new org.zstack.sdk.PushLicenseAddOnsUsageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid diff --git a/testlib/src/main/java/org/zstack/testlib/SdnControllerSpec.groovy b/testlib/src/main/java/org/zstack/testlib/SdnControllerSpec.groovy index a8e3d148c64..957b7f1c085 100644 --- a/testlib/src/main/java/org/zstack/testlib/SdnControllerSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/SdnControllerSpec.groovy @@ -14,6 +14,8 @@ import org.zstack.sdnController.h3cVcfc.H3cVcfcCommands.VniRangeStruct import org.zstack.sdnController.h3cVcfc.H3cVcfcCommands.GetH3cTenantsRsp import org.zstack.sdnController.h3cVcfc.H3cVcfcCommands.H3cTenantStruct import org.zstack.sdnController.h3cVcfc.H3cVcfcCommands.GetH3cTeamLederIpReply +import org.zstack.sdnController.h3cVcfc.H3cVcfcV2Commands +import org.springframework.http.HttpEntity import org.zstack.sugonSdnController.controller.SugonSdnControllerConstant import org.zstack.sugonSdnController.controller.api.ApiSerializer import org.zstack.sugonSdnController.controller.api.TfCommands @@ -113,21 +115,36 @@ class SdnControllerSpec extends Spec implements HasSession { } simulator(H3cVcfcCommands.H3C_VCFC_TENANTS) { - GetH3cTenantsRsp rsp = new GetH3cTenantsRsp() + H3cVcfcV2Commands.GetH3cTenantsRsp rsp = new H3cVcfcV2Commands.GetH3cTenantsRsp() rsp.tenants = new ArrayList<>() - H3cTenantStruct t1 = new H3cTenantStruct() - t1.type = "default" - t1.name = "default" - t1.id = "id1" + H3cVcfcV2Commands.H3cTenantStruct t1 = new H3cVcfcV2Commands.H3cTenantStruct() + t1.id = "03e01b37-8440-471a-aa8f-8d1fb8cc1381" + t1.name = "Test" + t1.type = "local-create" + t1.vds_list = ["eb32cf5e-04e9-42ad-b64c-2c3f9bacd3cc"] + t1.cloud_region_name = null + t1.cloud_domain_name = null rsp.tenants.add(t1) - H3cTenantStruct t2 = new H3cTenantStruct() - t2.type = "zstack" - t2.name = "zstack" - t2.id = "id2" + H3cVcfcV2Commands.H3cTenantStruct t2 = new H3cVcfcV2Commands.H3cTenantStruct() + t2.id = "ffffffff-0000-0000-0000-000000000001" + t2.name = "default" + t2.type = "default" + t2.vds_list = ["ffffffff-0000-0000-0000-000000000001"] + t2.cloud_region_name = null + t2.cloud_domain_name = null rsp.tenants.add(t2) + H3cVcfcV2Commands.H3cTenantStruct t3 = new H3cVcfcV2Commands.H3cTenantStruct() + t3.id = "c9d49b6f-d2cd-4636-b9d4-be0f9c9c7783" + t3.name = "sr" + t3.type = "local-create" + t3.vds_list = ["ffffffff-0000-0000-0000-000000000001"] + t3.cloud_region_name = null + t3.cloud_domain_name = null + rsp.tenants.add(t3) + return rsp } From c0a1e6ed87af3786fb4522740e1003d35f0cdbc4 Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Thu, 14 Aug 2025 17:05:29 +0800 Subject: [PATCH 423/737] [sdnController]: add query VDS name for H3C SDN Resolves: ZSTAC-77062 Change-Id: I6868776cedfa8d2798434919b5fa6d1b87633152 --- .../sdnController/SdnControllerBase.java | 21 +++++++------ .../h3cVcfc/H3cVcfcV2Commands.java | 20 ++++++++++++ .../h3cVcfc/H3cVcfcV2SdnController.java | 16 ++++++++++ .../sdnController/SdnControllerCase.groovy | 4 +++ .../zstack/testlib/SdnControllerSpec.groovy | 31 +++++++++++++++++++ 5 files changed, 83 insertions(+), 9 deletions(-) diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java index 8b8a52b3c3a..ced3cc6ae3e 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java @@ -943,7 +943,8 @@ public void run(FlowTrigger trigger, Map data) { @Override public void success() { List apiTenants = h3cController.getAllH3cTenants(); - syncTenantData(msg.getSdnControllerUuid(), apiTenants, trigger); + List apiVds = h3cController.getAllH3cVds(); + syncTenantData(msg.getSdnControllerUuid(), apiTenants, apiVds, trigger); } @Override @@ -985,7 +986,7 @@ public void handle(ErrorCode errCode, Map data) { }).start(); } - private void syncTenantData(String sdnControllerUuid, List apiTenants, FlowTrigger trigger) { + private void syncTenantData(String sdnControllerUuid, List apiTenants, List apiVds, FlowTrigger trigger) { // Check if API response is valid (non-empty list indicates valid response with default tenant) if (apiTenants == null || apiTenants.isEmpty()) { logger.warn(String.format("Failed to pull tenant data for sdn controller [%s], no tenant data returned by API", sdnControllerUuid)); @@ -1024,7 +1025,15 @@ private void syncTenantData(String sdnControllerUuid, List vds; + } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java index 0440966d270..2c7fdb7125e 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java @@ -536,6 +536,22 @@ public List getAllH3cTenants() { } } + public List getAllH3cVds() { + H3cVcfcV2Commands.GetH3cVdsCmd cmd = new H3cVcfcV2Commands.GetH3cVdsCmd(); + try { + H3cVcfcV2Commands.GetH3cVdsRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcV2Commands.GetH3cVdsRsp.class) + .syncCall(HttpMethod.GET.name(), self.getIp(), H3cVcfcV2Commands.H3C_VCFC_VDS, cmd, getH3cHeaders(token)); + if (rsp == null || rsp.vds == null) { + return new ArrayList<>(); + } + + return rsp.vds; + } catch (Exception e) { + logger.error("Failed to get all VDS from SDN controller: " + e.getMessage(), e); + throw new RuntimeException(String.format("failed to get all VDS from SDN controller [ip:%s], error: %s", self.getIp(), e.getMessage()), e); + } + } + private List getSubnetsByNetworkUuid(String networkUuid) { H3cVcfcV2Commands.GetH3cSubnetsCmd cmd = new H3cVcfcV2Commands.GetH3cSubnetsCmd(); cmd.network_id = networkUuid; diff --git a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy index cd10000305f..fc1f59de648 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy @@ -95,6 +95,7 @@ class SdnControllerCase extends SubCase { assert testTenantRecords[0].tenantName == "Test" assert testTenantRecords[0].state == SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_ENABLE assert testTenantRecords[0].vdsUuid == "eb32cf5e-04e9-42ad-b64c-2c3f9bacd3cc" + assert testTenantRecords[0].vdsName == "Test_VDS" // Verify default tenant data def defaultTenantRecords = tenantVOs.findAll { it.tenantUuid == "ffffffff-0000-0000-0000-000000000001" } @@ -102,6 +103,7 @@ class SdnControllerCase extends SubCase { assert defaultTenantRecords[0].tenantName == "default" assert defaultTenantRecords[0].state == SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_ENABLE assert defaultTenantRecords[0].vdsUuid == "ffffffff-0000-0000-0000-000000000001" + assert defaultTenantRecords[0].vdsName == "Default_VDS" // Verify sr tenant data def srTenantRecords = tenantVOs.findAll { it.tenantUuid == "c9d49b6f-d2cd-4636-b9d4-be0f9c9c7783" } @@ -109,6 +111,8 @@ class SdnControllerCase extends SubCase { assert srTenantRecords[0].tenantName == "sr" assert srTenantRecords[0].state == SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_ENABLE assert srTenantRecords[0].vdsUuid == "ffffffff-0000-0000-0000-000000000001" + // Verify vdsName is correctly retrieved from VDS simulator + assert srTenantRecords[0].vdsName == "Default_VDS" // 3. Pull again to verify idempotency def result2 = pullSdnControllerTenant { diff --git a/testlib/src/main/java/org/zstack/testlib/SdnControllerSpec.groovy b/testlib/src/main/java/org/zstack/testlib/SdnControllerSpec.groovy index 957b7f1c085..25b24d7f412 100644 --- a/testlib/src/main/java/org/zstack/testlib/SdnControllerSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/SdnControllerSpec.groovy @@ -154,6 +154,37 @@ class SdnControllerSpec extends Spec implements HasSession { return rsp } + simulator(H3cVcfcV2Commands.H3C_VCFC_VDS) { + H3cVcfcV2Commands.GetH3cVdsRsp rsp = new H3cVcfcV2Commands.GetH3cVdsRsp() + rsp.vds = new ArrayList<>() + + H3cVcfcV2Commands.H3cVdsStruct vds1 = new H3cVcfcV2Commands.H3cVdsStruct() + vds1.uuid = "eb32cf5e-04e9-42ad-b64c-2c3f9bacd3cc" + vds1.name = "Test_VDS" + vds1.bridge = "Test_VDS-br" + vds1.status = "UP" + vds1.openflow_hard_age = "300" + vds1.vxlan_tunnel_name = "vxlan_Test_VDS-br" + vds1.vxlan_range = "1-16777215" + vds1.virtual_mac = "00:00:00:00:00:01" + vds1.forwarding_mode = "mac-forwarding" + rsp.vds.add(vds1) + + H3cVcfcV2Commands.H3cVdsStruct vds2 = new H3cVcfcV2Commands.H3cVdsStruct() + vds2.uuid = "ffffffff-0000-0000-0000-000000000001" + vds2.name = "Default_VDS" + vds2.bridge = "Default_VDS-br" + vds2.status = "UP" + vds2.openflow_hard_age = "300" + vds2.vxlan_tunnel_name = "vxlan_Default_VDS-br" + vds2.vxlan_range = "1-16777215" + vds2.virtual_mac = "00:00:00:00:00:02" + vds2.forwarding_mode = "mac-forwarding" + rsp.vds.add(vds2) + + return rsp + } + simulator(TfCommands.TF_GET_DAEMON) { TfCommands.GetDomainRsp rsp = new TfCommands.GetDomainRsp() rsp.uuid = TfCommands.TEST_DOMAIN_UUID From 281168d4133ae3d2d28a9535708d331551eba1e1 Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Fri, 15 Aug 2025 14:01:55 +0800 Subject: [PATCH 424/737] [sdnController]: add IPv6 range validate for H3C VCFC SDN controller Resolves: ZSTAC-76918 Change-Id: I6868776ce0c323294f1c4ab1b1613f57c3e87909 --- .../h3cVcfc/H3cVcfcApiInterceptor.java | 48 +++++++++++++++++-- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java index 50da9d73db3..d2751c15cf2 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java @@ -10,10 +10,7 @@ import org.zstack.header.message.APIMessage; import org.zstack.header.network.l2.APIAttachL2NetworkToClusterMsg; import org.zstack.header.network.l2.APIDetachL2NetworkFromClusterMsg; -import org.zstack.header.network.l3.APIAddIpRangeByNetworkCidrMsg; -import org.zstack.header.network.l3.APIAddIpRangeMsg; -import org.zstack.header.network.l3.APICreateL3NetworkMsg; -import org.zstack.header.network.l3.L3NetworkCategory; +import org.zstack.header.network.l3.*; import org.zstack.network.l2.L2NetworkSystemTags; import org.zstack.network.l2.vxlan.vxlanNetwork.APICreateL2VxlanNetworkMsg; import org.zstack.network.l2.vxlan.vxlanNetwork.APIDeleteVxlanL2Network; @@ -64,6 +61,8 @@ public List getMessageClassToIntercept() { ret.add(APICreateL3NetworkMsg.class); ret.add(APIAddIpRangeMsg.class); ret.add(APIAddIpRangeByNetworkCidrMsg.class); + ret.add(APIAddIpv6RangeMsg.class); + ret.add(APIAddIpv6RangeByNetworkCidrMsg.class); return ret; } @@ -96,8 +95,11 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti validate((APIAddIpRangeMsg) msg); } else if (msg instanceof APIAddIpRangeByNetworkCidrMsg) { validate((APIAddIpRangeByNetworkCidrMsg) msg); + } else if (msg instanceof APIAddIpv6RangeMsg) { + validate((APIAddIpv6RangeMsg) msg); + } else if (msg instanceof APIAddIpv6RangeByNetworkCidrMsg) { + validate((APIAddIpv6RangeByNetworkCidrMsg) msg); } - setServiceId(msg); return msg; @@ -146,6 +148,42 @@ private void validate(APICreateVniRangeMsg msg) { throw new ApiMessageInterceptionException(argerr("Could not create VNI range [%s-%s] because it is not covered by any of the SDN controller's configured VNI ranges", userVniRange.startVni, userVniRange.endVni)); } + private void validate(APIAddIpv6RangeMsg msg) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(msg.getL3NetworkUuid()); + if (sdnControllerUuid == null) { + return; + } + SdnControllerVO vo = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); + if (vo == null) { + return; + } + if (!vo.getVendorType().equals(SdnControllerConstant.H3C_VCFC_CONTROLLER)) { + return; + } + if (vo.getStatus() != SdnControllerStatus.Connected) { + throw new ApiMessageInterceptionException(argerr("Could not add IPv6 range because the SDN controller [uuid:%s] is not connected. Current status: %s", + sdnControllerUuid, vo.getStatus())); + } + } + + private void validate(APIAddIpv6RangeByNetworkCidrMsg msg) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(msg.getL3NetworkUuid()); + if (sdnControllerUuid == null) { + return; + } + SdnControllerVO vo = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); + if (vo == null) { + return; + } + if (!vo.getVendorType().equals(SdnControllerConstant.H3C_VCFC_CONTROLLER)) { + return; + } + if (vo.getStatus() != SdnControllerStatus.Connected) { + throw new ApiMessageInterceptionException(argerr("Could not add IPv6 range by network CIDR because the SDN controller [uuid:%s] is not connected. Current status: %s", + sdnControllerUuid, vo.getStatus())); + } + } + private void validate(APIAddIpRangeMsg msg) { String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(msg.getL3NetworkUuid()); if (sdnControllerUuid == null) { From 59187ccbf924f08d9d765af9dbb4b80e7e355eaf Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Thu, 7 Aug 2025 11:47:57 +0800 Subject: [PATCH 425/737] [conf]:change accountId to iam2projectId for auditvo DBImpact Resolves: ZSTAC-76818 Change-Id: I686a65786a7470686c686e6b66756e776a657470 Conflicts: conf/db/upgrade/V5.3.46__schema.sql Conflicts: conf/db/upgrade/V5.3.46__schema.sql --- conf/db/upgrade/V5.3.46__schema.sql | 86 +++++++++++++++++++ sdk/src/main/java/SourceClassMap.java | 12 +-- .../sdk/{zwatch/datatype => }/AuditData.java | 2 +- .../main/java/org/zstack/sdk/AuditDataV1.java | 8 ++ .../{zwatch/datatype => }/AuditDataV2.java | 4 +- .../sdk/zwatch/datatype/AuditDataV1.java | 8 -- 6 files changed, 103 insertions(+), 17 deletions(-) rename sdk/src/main/java/org/zstack/sdk/{zwatch/datatype => }/AuditData.java (98%) create mode 100644 sdk/src/main/java/org/zstack/sdk/AuditDataV1.java rename sdk/src/main/java/org/zstack/sdk/{zwatch/datatype => }/AuditDataV2.java (64%) delete mode 100644 sdk/src/main/java/org/zstack/sdk/zwatch/datatype/AuditDataV1.java diff --git a/conf/db/upgrade/V5.3.46__schema.sql b/conf/db/upgrade/V5.3.46__schema.sql index baa5c2ff9c4..8c1953ec5b4 100644 --- a/conf/db/upgrade/V5.3.46__schema.sql +++ b/conf/db/upgrade/V5.3.46__schema.sql @@ -1,3 +1,89 @@ +-- Migration script to change AccountId to ProjectId for AuditVO +-- Based on changeAccountIdToProjectIdForAduitVO function from NamespaceEventManagerImpl.java +-- Uses IAM2ProjectAccountRefVO to get mapping between AccountVO.uuid and IAM2ProjectVO.uuid + +DELIMITER $$ +DROP PROCEDURE IF EXISTS changeAccountIdToProjectIdForAuditVO$$ +CREATE PROCEDURE changeAccountIdToProjectIdForAuditVO() +pro_label: BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE v_accountUuid VARCHAR(32); + DECLARE v_projectUuid VARCHAR(32); + DECLARE v_update_count1 INT DEFAULT 0; + DECLARE v_update_count2 INT DEFAULT 0; + DECLARE v_total_processed INT DEFAULT 0; + + -- Cursor to iterate through IAM2ProjectAccountRefVO records + -- This table contains the mapping between accountUuid and projectUuid + DECLARE project_cursor CURSOR FOR + SELECT accountUuid, projectUuid + FROM IAM2ProjectAccountRefVO; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + -- Check if there are any project account references to process + IF (SELECT COUNT(*) FROM IAM2ProjectAccountRefVO) = 0 THEN + SELECT 'No IAM2ProjectAccountRefVO records found, skipping migration.' AS message; + LEAVE pro_label; + END IF; + + SELECT 'Starting migration of AuditsVO records from AccountUuid to ProjectUuid...' AS message; + SELECT CONCAT('Total account-project mappings to process: ', (SELECT COUNT(*) FROM IAM2ProjectAccountRefVO)) AS info; + + OPEN project_cursor; + + read_loop: LOOP + FETCH project_cursor INTO v_accountUuid, v_projectUuid; + + IF done THEN + LEAVE read_loop; + END IF; + + -- First SQL operation: Update records where resourceType = 'AccountVO' + -- Change resourceUuid from accountUuid to projectUuid + -- Change resourceType from 'AccountVO' to 'IAM2ProjectVO' + -- This corresponds to: SQL.New(AuditsVO.class).eq(AuditsVO_.resourceType, AccountVO.class.getSimpleName()) + -- .set(AuditsVO_.resourceUuid, projectUuid).set(AuditsVO_.resourceType, IAM2ProjectVO.class.getSimpleName()) + UPDATE AuditsVO + SET resourceUuid = v_projectUuid, + resourceType = 'IAM2ProjectVO' + WHERE apiName = 'org.zstack.header.identity.APIUpdateQuotaMsg' + AND resourceUuid = v_accountUuid + AND resourceType = 'AccountVO'; + + SET v_update_count1 = ROW_COUNT(); + + -- Second SQL operation: Update records where resourceType != 'AccountVO' + -- Change only resourceUuid from accountUuid to projectUuid (keep original resourceType) + -- This corresponds to: SQL.New(AuditsVO.class).notEq(AuditsVO_.resourceType, AccountVO.class.getSimpleName()) + -- .set(AuditsVO_.resourceUuid, projectUuid) + UPDATE AuditsVO + SET resourceUuid = v_projectUuid + WHERE apiName = 'org.zstack.header.identity.APIUpdateQuotaMsg' + AND resourceUuid = v_accountUuid + AND resourceType != 'AccountVO'; + + SET v_update_count2 = ROW_COUNT(); + SET v_total_processed = v_total_processed + 1; + + -- Log progress for each account-project pair (optional, can be removed for performance) + IF (v_update_count1 > 0 OR v_update_count2 > 0) THEN + SELECT CONCAT('Processed mapping: Account[', v_accountUuid, '] -> Project[', v_projectUuid, ']', + ', AccountVO records updated: ', v_update_count1, + ', Other records updated: ', v_update_count2) AS progress; + END IF; + + END LOOP; + + CLOSE project_cursor; + + SELECT CONCAT('Migration completed successfully. Total account-project pairs processed: ', v_total_processed) AS message; + +END$$ + +DELIMITER ; +CALL changeAccountIdToProjectIdForAuditVO(); +DROP PROCEDURE IF EXISTS changeAccountIdToProjectIdForAuditVO; CALL ADD_COLUMN('SdnControllerVO', 'vendorVersion', 'VARCHAR(32)', 0, 'V1'); diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 2c2b594001a..01c650c9d03 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -421,6 +421,9 @@ public class SourceClassMap { put("org.zstack.header.zdfs.ZdfsInventory", "org.zstack.sdk.ZdfsInventory"); put("org.zstack.header.zdfs.ZdfsStorageInventory", "org.zstack.sdk.ZdfsStorageInventory"); put("org.zstack.header.zone.ZoneInventory", "org.zstack.sdk.ZoneInventory"); + put("org.zstack.header.zwatch.AuditData", "org.zstack.sdk.AuditData"); + put("org.zstack.header.zwatch.AuditDataV1", "org.zstack.sdk.AuditDataV1"); + put("org.zstack.header.zwatch.AuditDataV2", "org.zstack.sdk.AuditDataV2"); put("org.zstack.hybrid.account.HybridAccountInventory", "org.zstack.sdk.HybridAccountInventory"); put("org.zstack.hybrid.core.HybridType", "org.zstack.sdk.HybridType"); put("org.zstack.iam2.api.APIGetIAM2VirtualIDAPIPermissionMsg$APIPermissionStruct", "org.zstack.sdk.iam2.api.APIPermissionStruct"); @@ -786,9 +789,6 @@ public class SourceClassMap { put("org.zstack.zwatch.datatype.AlarmData", "org.zstack.sdk.zwatch.datatype.AlarmData"); put("org.zstack.zwatch.datatype.AlarmDataV1", "org.zstack.sdk.zwatch.datatype.AlarmDataV1"); put("org.zstack.zwatch.datatype.AlarmDataV2", "org.zstack.sdk.zwatch.datatype.AlarmDataV2"); - put("org.zstack.zwatch.datatype.AuditData", "org.zstack.sdk.zwatch.datatype.AuditData"); - put("org.zstack.zwatch.datatype.AuditDataV1", "org.zstack.sdk.zwatch.datatype.AuditDataV1"); - put("org.zstack.zwatch.datatype.AuditDataV2", "org.zstack.sdk.zwatch.datatype.AuditDataV2"); put("org.zstack.zwatch.datatype.AuditType", "org.zstack.sdk.zwatch.datatype.AuditType"); put("org.zstack.zwatch.datatype.Datapoint", "org.zstack.sdk.zwatch.datatype.Datapoint"); put("org.zstack.zwatch.datatype.EmergencyLevel", "org.zstack.sdk.zwatch.datatype.EmergencyLevel"); @@ -868,6 +868,9 @@ public class SourceClassMap { put("org.zstack.sdk.ApplianceVmInventory", "org.zstack.appliancevm.ApplianceVmInventory"); put("org.zstack.sdk.ApplicationDevelopmentServiceInventory", "org.zstack.ai.entity.ApplicationDevelopmentServiceInventory"); put("org.zstack.sdk.AttachTagResult", "org.zstack.tag2.AttachTagResult"); + put("org.zstack.sdk.AuditData", "org.zstack.header.zwatch.AuditData"); + put("org.zstack.sdk.AuditDataV1", "org.zstack.header.zwatch.AuditDataV1"); + put("org.zstack.sdk.AuditDataV2", "org.zstack.header.zwatch.AuditDataV2"); put("org.zstack.sdk.AutoScalingGroupActivityInventory", "org.zstack.autoscaling.group.activity.AutoScalingGroupActivityInventory"); put("org.zstack.sdk.AutoScalingGroupInstanceInventory", "org.zstack.autoscaling.group.instance.AutoScalingGroupInstanceInventory"); put("org.zstack.sdk.AutoScalingGroupInventory", "org.zstack.autoscaling.group.AutoScalingGroupInventory"); @@ -1606,9 +1609,6 @@ public class SourceClassMap { put("org.zstack.sdk.zwatch.datatype.AlarmData", "org.zstack.zwatch.datatype.AlarmData"); put("org.zstack.sdk.zwatch.datatype.AlarmDataV1", "org.zstack.zwatch.datatype.AlarmDataV1"); put("org.zstack.sdk.zwatch.datatype.AlarmDataV2", "org.zstack.zwatch.datatype.AlarmDataV2"); - put("org.zstack.sdk.zwatch.datatype.AuditData", "org.zstack.zwatch.datatype.AuditData"); - put("org.zstack.sdk.zwatch.datatype.AuditDataV1", "org.zstack.zwatch.datatype.AuditDataV1"); - put("org.zstack.sdk.zwatch.datatype.AuditDataV2", "org.zstack.zwatch.datatype.AuditDataV2"); put("org.zstack.sdk.zwatch.datatype.AuditType", "org.zstack.zwatch.datatype.AuditType"); put("org.zstack.sdk.zwatch.datatype.Datapoint", "org.zstack.zwatch.datatype.Datapoint"); put("org.zstack.sdk.zwatch.datatype.EmergencyLevel", "org.zstack.zwatch.datatype.EmergencyLevel"); diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/datatype/AuditData.java b/sdk/src/main/java/org/zstack/sdk/AuditData.java similarity index 98% rename from sdk/src/main/java/org/zstack/sdk/zwatch/datatype/AuditData.java rename to sdk/src/main/java/org/zstack/sdk/AuditData.java index 645325fb9e8..a08244cb7bd 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/datatype/AuditData.java +++ b/sdk/src/main/java/org/zstack/sdk/AuditData.java @@ -1,4 +1,4 @@ -package org.zstack.sdk.zwatch.datatype; +package org.zstack.sdk; diff --git a/sdk/src/main/java/org/zstack/sdk/AuditDataV1.java b/sdk/src/main/java/org/zstack/sdk/AuditDataV1.java new file mode 100644 index 00000000000..950866d5e1f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AuditDataV1.java @@ -0,0 +1,8 @@ +package org.zstack.sdk; + + + +public class AuditDataV1 extends org.zstack.sdk.AuditData { + + +} diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/datatype/AuditDataV2.java b/sdk/src/main/java/org/zstack/sdk/AuditDataV2.java similarity index 64% rename from sdk/src/main/java/org/zstack/sdk/zwatch/datatype/AuditDataV2.java rename to sdk/src/main/java/org/zstack/sdk/AuditDataV2.java index 41261faed36..4da10e95e9c 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/datatype/AuditDataV2.java +++ b/sdk/src/main/java/org/zstack/sdk/AuditDataV2.java @@ -1,8 +1,8 @@ -package org.zstack.sdk.zwatch.datatype; +package org.zstack.sdk; -public class AuditDataV2 extends org.zstack.sdk.zwatch.datatype.AuditData { +public class AuditDataV2 extends org.zstack.sdk.AuditData { public java.lang.String success; public void setSuccess(java.lang.String success) { diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/datatype/AuditDataV1.java b/sdk/src/main/java/org/zstack/sdk/zwatch/datatype/AuditDataV1.java deleted file mode 100644 index c011401d3bc..00000000000 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/datatype/AuditDataV1.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.zstack.sdk.zwatch.datatype; - - - -public class AuditDataV1 extends org.zstack.sdk.zwatch.datatype.AuditData { - - -} From 31cd8f17d5d1c321b702e07782af6da8cff7bb9a Mon Sep 17 00:00:00 2001 From: "haoyu.ding" Date: Mon, 18 Aug 2025 03:59:39 +0000 Subject: [PATCH 426/737] [conf]: speed up account-to-project audit migration using JOIN DBImpact Resolves: ZSTAC-76818 Change-Id: I616465727a71766a70706375686570686c757171 --- conf/db/upgrade/V5.3.46__schema.sql | 95 +++++++---------------------- 1 file changed, 21 insertions(+), 74 deletions(-) diff --git a/conf/db/upgrade/V5.3.46__schema.sql b/conf/db/upgrade/V5.3.46__schema.sql index 8c1953ec5b4..faa0d767924 100644 --- a/conf/db/upgrade/V5.3.46__schema.sql +++ b/conf/db/upgrade/V5.3.46__schema.sql @@ -1,83 +1,30 @@ --- Migration script to change AccountId to ProjectId for AuditVO --- Based on changeAccountIdToProjectIdForAduitVO function from NamespaceEventManagerImpl.java --- Uses IAM2ProjectAccountRefVO to get mapping between AccountVO.uuid and IAM2ProjectVO.uuid +-- Migration script to update AuditVO table from AccountId to ProjectId. +-- This script efficiently migrates data using a single JOIN operation. DELIMITER $$ DROP PROCEDURE IF EXISTS changeAccountIdToProjectIdForAuditVO$$ CREATE PROCEDURE changeAccountIdToProjectIdForAuditVO() -pro_label: BEGIN - DECLARE done INT DEFAULT FALSE; - DECLARE v_accountUuid VARCHAR(32); - DECLARE v_projectUuid VARCHAR(32); - DECLARE v_update_count1 INT DEFAULT 0; - DECLARE v_update_count2 INT DEFAULT 0; - DECLARE v_total_processed INT DEFAULT 0; + pro_label: BEGIN + DECLARE v_total_updated INT DEFAULT 0; - -- Cursor to iterate through IAM2ProjectAccountRefVO records - -- This table contains the mapping between accountUuid and projectUuid - DECLARE project_cursor CURSOR FOR - SELECT accountUuid, projectUuid - FROM IAM2ProjectAccountRefVO; - - DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; - - -- Check if there are any project account references to process IF (SELECT COUNT(*) FROM IAM2ProjectAccountRefVO) = 0 THEN - SELECT 'No IAM2ProjectAccountRefVO records found, skipping migration.' AS message; - LEAVE pro_label; - END IF; - - SELECT 'Starting migration of AuditsVO records from AccountUuid to ProjectUuid...' AS message; - SELECT CONCAT('Total account-project mappings to process: ', (SELECT COUNT(*) FROM IAM2ProjectAccountRefVO)) AS info; - - OPEN project_cursor; - - read_loop: LOOP - FETCH project_cursor INTO v_accountUuid, v_projectUuid; - - IF done THEN - LEAVE read_loop; - END IF; - - -- First SQL operation: Update records where resourceType = 'AccountVO' - -- Change resourceUuid from accountUuid to projectUuid - -- Change resourceType from 'AccountVO' to 'IAM2ProjectVO' - -- This corresponds to: SQL.New(AuditsVO.class).eq(AuditsVO_.resourceType, AccountVO.class.getSimpleName()) - -- .set(AuditsVO_.resourceUuid, projectUuid).set(AuditsVO_.resourceType, IAM2ProjectVO.class.getSimpleName()) - UPDATE AuditsVO - SET resourceUuid = v_projectUuid, - resourceType = 'IAM2ProjectVO' - WHERE apiName = 'org.zstack.header.identity.APIUpdateQuotaMsg' - AND resourceUuid = v_accountUuid - AND resourceType = 'AccountVO'; - - SET v_update_count1 = ROW_COUNT(); - - -- Second SQL operation: Update records where resourceType != 'AccountVO' - -- Change only resourceUuid from accountUuid to projectUuid (keep original resourceType) - -- This corresponds to: SQL.New(AuditsVO.class).notEq(AuditsVO_.resourceType, AccountVO.class.getSimpleName()) - -- .set(AuditsVO_.resourceUuid, projectUuid) - UPDATE AuditsVO - SET resourceUuid = v_projectUuid - WHERE apiName = 'org.zstack.header.identity.APIUpdateQuotaMsg' - AND resourceUuid = v_accountUuid - AND resourceType != 'AccountVO'; - - SET v_update_count2 = ROW_COUNT(); - SET v_total_processed = v_total_processed + 1; - - -- Log progress for each account-project pair (optional, can be removed for performance) - IF (v_update_count1 > 0 OR v_update_count2 > 0) THEN - SELECT CONCAT('Processed mapping: Account[', v_accountUuid, '] -> Project[', v_projectUuid, ']', - ', AccountVO records updated: ', v_update_count1, - ', Other records updated: ', v_update_count2) AS progress; - END IF; - - END LOOP; - - CLOSE project_cursor; - - SELECT CONCAT('Migration completed successfully. Total account-project pairs processed: ', v_total_processed) AS message; +SELECT 'No IAM2ProjectAccountRefVO records found, skipping migration.' AS message; +LEAVE pro_label; +END IF; + +SELECT 'Starting migration of AuditsVO records from AccountUuid to ProjectUuid...' AS message; + +UPDATE AuditsVO a + JOIN IAM2ProjectAccountRefVO i +ON a.resourceUuid = i.accountUuid + SET a.resourceUuid = i.projectUuid, + a.resourceType = CASE + WHEN a.resourceType = 'AccountVO' THEN 'IAM2ProjectVO' + ELSE a.resourceType +END +WHERE a.apiName = 'org.zstack.header.identity.APIUpdateQuotaMsg'; + SET v_total_updated = ROW_COUNT(); +SELECT CONCAT('Migration completed successfully. Total records updated: ', v_total_updated) AS message; END$$ From d242635a710e4dab4091f84242187aa51cad9ba1 Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Wed, 20 Aug 2025 17:51:23 +0800 Subject: [PATCH 427/737] [migration]: fix cannot to select the correct host before migration. correctly check the results of cpu function comparison to avoid determining cpu function mismatch in case of abnormalities. Resolves/Related: ZSTAC-65793 Change-Id: I61746a72726470677a697a6e6e75736b75696f72 --- .../host/CompareCpuFunctionOnHostReply.java | 18 ++++++++++++++++++ .../java/org/zstack/kvm/KVMAgentCommands.java | 18 ++++++++++++++++++ .../src/main/java/org/zstack/kvm/KVMHost.java | 18 +++++++++++------- 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/header/src/main/java/org/zstack/header/host/CompareCpuFunctionOnHostReply.java b/header/src/main/java/org/zstack/header/host/CompareCpuFunctionOnHostReply.java index 73f3fe8946e..402fa684bbb 100644 --- a/header/src/main/java/org/zstack/header/host/CompareCpuFunctionOnHostReply.java +++ b/header/src/main/java/org/zstack/header/host/CompareCpuFunctionOnHostReply.java @@ -6,4 +6,22 @@ * Created by LiangHanYu on 2021/8/13 16:32 */ public class CompareCpuFunctionOnHostReply extends MessageReply { + private boolean match; + private String compareError; + + public boolean isMatch() { + return match; + } + + public void setMatch(boolean match) { + this.match = match; + } + + public String getCompareError() { + return compareError; + } + + public void setCompareError(String compareError) { + this.compareError = compareError; + } } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index 11994db7105..3d54c0260d2 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -3886,6 +3886,24 @@ public void setCpuXml(String cpuXml) { } public static class VmCompareCpuFunctionResponse extends AgentResponse { + private boolean match = true; + private String compareError; + + public boolean isMatch() { + return match; + } + + public void setMatch(boolean match) { + this.match = match; + } + + public String getCompareError() { + return compareError; + } + + public void setCompareError(String compareError) { + this.compareError = compareError; + } } public static class MergeSnapshotRsp extends AgentResponse { diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 0c6accb4d2f..d70b462e2be 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -1500,14 +1500,12 @@ public void fail(ErrorCode errorCode) { } private void handle(CompareCpuFunctionOnHostMsg msg) { - CompareCpuFunctionOnHostReply reply = new CompareCpuFunctionOnHostReply(); - thdf.singleFlightSubmit(new SingleFlightTask(msg) .setSyncSignature(String.format("compare-host-%s-cpu-function-xml-on-host-%s", msg.getSrcHostUuid(), msg.getDstHostUuid())) - .run((com) -> compareCpuFunctionOnHost(msg, new ReturnValueCompletion(com) { + .run((com) -> compareCpuFunctionOnHost(msg, new ReturnValueCompletion(com) { @Override - public void success(CompareCpuFunctionOnHostReply returnValue) { - com.success(returnValue); + public void success(VmCompareCpuFunctionResponse resp) { + com.success(resp); } @Override @@ -1516,14 +1514,20 @@ public void fail(ErrorCode errorCode) { } })) .done(((result) -> { + CompareCpuFunctionOnHostReply reply = new CompareCpuFunctionOnHostReply(); if (!result.isSuccess()) { reply.setError(result.getErrorCode()); + bus.reply(msg, reply); + return; } + VmCompareCpuFunctionResponse resp = (VmCompareCpuFunctionResponse)result.getResult(); + reply.setMatch(resp.isMatch()); + reply.setCompareError(resp.getCompareError()); bus.reply(msg, reply); }))); } - private void compareCpuFunctionOnHost(final CompareCpuFunctionOnHostMsg msg, ReturnValueCompletion completion) { + private void compareCpuFunctionOnHost(final CompareCpuFunctionOnHostMsg msg, ReturnValueCompletion completion) { VmCompareCpuFunctionCmd cmd = new VmCompareCpuFunctionCmd(); cmd.setCpuXml(msg.getCpuXml()); restf.asyncJsonPost(compareCpuFunctionPath, cmd, new JsonAsyncRESTCallback(completion) { @@ -1533,7 +1537,7 @@ public void success(VmCompareCpuFunctionResponse ret) { completion.fail(operr(ret.getError())); return; } - completion.success(new CompareCpuFunctionOnHostReply()); + completion.success(ret); } @Override From 1e59293fa2c9cd0f4218845d1b9dca07afd88ccd Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Fri, 6 Jun 2025 18:41:11 +0800 Subject: [PATCH 428/737] [plugin]: introducing snapshots for fast revert Resolves: ZSTAC-77226 Change-Id: I616b616d72766576637965737a74687071616b6e --- conf/globalConfig/snapshot.xml | 15 ++++ .../ceph/primary/CephDeleteVolumeGC.java | 3 +- .../ceph/primary/CephPrimaryStorageBase.java | 75 +++++++++++++++++-- .../ceph/primary/CephSnapshotProtector.java | 3 +- .../snapshot/VolumeSnapshotGlobalConfig.java | 7 ++ .../snapshot/VolumeSnapshotTreeBase.java | 3 +- .../group/VolumeSnapshotGroupBase.java | 5 +- .../storage/volume/VolumeSystemTags.java | 4 +- 8 files changed, 100 insertions(+), 15 deletions(-) diff --git a/conf/globalConfig/snapshot.xml b/conf/globalConfig/snapshot.xml index fcfc393178c..d0a9ada1bc6 100755 --- a/conf/globalConfig/snapshot.xml +++ b/conf/globalConfig/snapshot.xml @@ -40,4 +40,19 @@ java.lang.Boolean + + volumeSnapshot + enable.fast.revert + Enable fast revert for volume snapshot + false + java.lang.Boolean + + + + volumeSnapshot + snapshot.group.revert.concurrency + The maximum number of snapshots that are permitted to revert concurrently. + 1 + java.lang.Integer + \ No newline at end of file diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeGC.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeGC.java index 45df50b4ad6..33f5fdf0a6c 100644 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeGC.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeGC.java @@ -12,6 +12,7 @@ import org.zstack.header.storage.primary.PrimaryStorageVO; import org.zstack.header.volume.VolumeInventory; import org.zstack.storage.volume.VolumeErrors; +import org.zstack.storage.volume.VolumeSystemTags; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; @@ -46,7 +47,7 @@ protected void triggerNow(GCCompletion completion) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { - if (reply.getError().isError(VolumeErrors.VOLUME_IN_USE)) { + if (reply.getError().isError(VolumeErrors.VOLUME_IN_USE) && !VolumeSystemTags.FAST_REVERT.hasTag(volume.getUuid())) { logger.warn(String.format("unable to delete path:%s right now, cancel this GC job because it's in use", msg.getInstallPath())); completion.cancel(); return; diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java index 300b4413ece..b7ae52e1043 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java @@ -73,10 +73,12 @@ import org.zstack.storage.ceph.primary.capacity.CephOsdGroupCapacityHelper; import org.zstack.storage.primary.*; import org.zstack.storage.snapshot.DeleteVolumeSnapshotGC; +import org.zstack.storage.snapshot.VolumeSnapshotGlobalConfig; import org.zstack.storage.volume.VolumeErrors; import org.zstack.storage.volume.VolumeSystemTags; import org.zstack.tag.SystemTag; import org.zstack.tag.SystemTagCreator; +import org.zstack.tag.TagManager; import org.zstack.utils.*; import org.zstack.utils.function.Function; import org.zstack.utils.gson.JSONObjectUtil; @@ -119,6 +121,8 @@ public class CephPrimaryStorageBase extends PrimaryStorageBase { private PoolUsageReport poolUsageCollector; @Autowired protected PrimaryStoragePhysicalCapacityManager psPhysicalCapacityMgr; + @Autowired + private TagManager tagMgr; public CephPrimaryStorageBase() { @@ -1833,6 +1837,7 @@ public void run(MessageReply reply) { logger.info(String.format("Deleted volume %s in Trash.", inv.getInstallPath())); } else { logger.warn(String.format("Failed to delete volume %s in Trash.", inv.getInstallPath())); + submitCephDeleteVolumeGC(inv, self); } trigger.next(); } @@ -1928,6 +1933,7 @@ public void run(MessageReply reply) { logger.info(String.format("Deleted volume %s in Trash.", inv.getInstallPath())); } else { logger.warn(String.format("Failed to delete volume %s in Trash.", inv.getInstallPath())); + submitCephDeleteVolumeGC(inv, self); } trigger.next(); } @@ -1968,6 +1974,18 @@ public void done(ErrorCodeList errorCodeList) { }); } + private void submitCephDeleteVolumeGC(InstallPathRecycleInventory inv, PrimaryStorageVO self) { + CephDeleteVolumeGC gc = new CephDeleteVolumeGC(); + gc.NAME = String.format("gc-ceph-%s-volume-path-%s", self.getUuid(), inv.getInstallPath()); + gc.primaryStorageUuid = self.getUuid(); + VolumeInventory volume = new VolumeInventory(); + volume.setUuid(inv.getResourceUuid()); + volume.setInstallPath(inv.getInstallPath()); + volume.setSize(inv.getSize()); + gc.volume = volume; + gc.deduplicateSubmit(CephGlobalConfig.GC_INTERVAL.value(Long.class), TimeUnit.SECONDS); + } + protected void handle(final CleanUpTrashOnPrimaryStroageMsg msg) { MessageReply reply = new MessageReply(); thdf.chainSubmit(new ChainTask(msg) { @@ -5149,21 +5167,36 @@ protected void handle(final RevertVolumeFromSnapshotOnPrimaryStorageMsg msg) { chain.then(new ShareFlow() { @Override public void setup() { + boolean fastRevert = VolumeSnapshotGlobalConfig.ENABLE_FAST_REVERT.value(Boolean.class); + String snapShotPath = msg.getSnapshot().getPrimaryStorageInstallPath(); // get volume path from snapshot path, just split @ - String volumePath = msg.getSnapshot().getPrimaryStorageInstallPath().split("@")[0]; + String volumePath = snapShotPath.split("@")[0]; + final String newVolumePath = makeVolumeInstallPathByTargetPool(Platform.getUuid(), getTargetPoolNameFromAllocatedUrl(snapShotPath)); flow(new NoRollbackFlow() { + String __name__ = "revert-volume-from-snapshot"; + + @Override + public boolean skip(Map data) { + return fastRevert; + } + @Override public void run(FlowTrigger trigger, Map data) { TaskProgressRange stage = markTaskStage(parentStage, UNDO_SNAPSHOT_CREATION_STAGE); RollbackSnapshotCmd cmd = new RollbackSnapshotCmd(); - cmd.snapshotPath = msg.getSnapshot().getPrimaryStorageInstallPath(); + cmd.snapshotPath = snapShotPath; cmd.capacityThreshold = psPhysicalCapacityMgr.getRatio(getSelf().getUuid()); httpCall(ROLLBACK_SNAPSHOT_PATH, cmd, RollbackSnapshotRsp.class, new ReturnValueCompletion(msg) { @Override public void success(RollbackSnapshotRsp returnValue) { + Long trashId = trash.getTrashId(self.getUuid(), volumePath); + if (trashId != null) { + trash.removeFromDb(trashId); + } reply.setSize(returnValue.getSize()); + reply.setNewVolumeInstallPath(volumePath); reportProgress(stage.getEnd().toString()); trigger.next(); } @@ -5176,15 +5209,41 @@ public void fail(ErrorCode errorCode) { } }); + + flow(new NoRollbackFlow() { + String __name__ = "fast-revert-volume-from-snapshot"; + + @Override + public boolean skip(Map data) { + return !fastRevert; + } + + @Override + public void run(final FlowTrigger trigger, Map data) { + TaskProgressRange stage = markTaskStage(parentStage, UNDO_SNAPSHOT_CREATION_STAGE); + + VolumeSnapshotInventory sp = msg.getSnapshot(); + cloneAndProtectSnaphost(sp.getPrimaryStorageInstallPath(), newVolumePath, new ReturnValueCompletion(trigger) { + @Override + public void success(CloneRsp rsp) { + reply.setNewVolumeInstallPath(newVolumePath); + reply.setSize(rsp.size); + tagMgr.createNonInherentSystemTag(sp.getVolumeUuid(), VolumeSystemTags.FAST_REVERT.getTagFormat(), VolumeVO.class.getSimpleName()); + reportProgress(stage.getEnd().toString()); + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + done(new FlowDoneHandler(msg) { @Override public void handle(Map data) { - Long trashId = trash.getTrashId(self.getUuid(), volumePath); - if (trashId != null) { - trash.removeFromDb(trashId); - } - - reply.setNewVolumeInstallPath(volumePath); bus.reply(msg, reply); } }); diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephSnapshotProtector.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephSnapshotProtector.java index af991e60f1b..c08a1528399 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephSnapshotProtector.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephSnapshotProtector.java @@ -1,7 +1,6 @@ package org.zstack.storage.ceph.primary; import org.zstack.header.core.Completion; -import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.storage.snapshot.VolumeSnapshotDeletionProtector; import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; import org.zstack.storage.ceph.CephConstants; @@ -29,7 +28,7 @@ public void protect(VolumeSnapshotInventory snapshot, Completion completion) { completion.success(); } - if (volUuids.stream().noneMatch(it -> snapshot.getPrimaryStorageInstallPath().contains(it))) { + if (volUuids.stream().noneMatch(it -> snapshot.getPrimaryStorageInstallPath().contains(it)) && !VolumeSystemTags.FAST_REVERT.hasTag(snapshot.getVolumeUuid())) { completion.fail(inerr("the snapshot[name:%s, uuid:%s, path: %s] seems not belong to the volume[uuid:%s]", snapshot.getName(), snapshot.getUuid(), snapshot.getPrimaryStorageInstallPath(), snapshot.getVolumeUuid())); return; diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotGlobalConfig.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotGlobalConfig.java index ab4eb23b431..0ca0b3191ee 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotGlobalConfig.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotGlobalConfig.java @@ -24,7 +24,14 @@ public class VolumeSnapshotGlobalConfig { @GlobalConfigValidation(validValues = {"true", "false"}) @GlobalConfigDef(defaultValue = "false", type = Boolean.class, description = "effective count with detached volumes") public static GlobalConfig EFFECTIVE_COUNT_WITH_DETACHED_VOLUMES = new GlobalConfig(CATEGORY, "effectiveCount.withDetachedVolumes"); + @GlobalConfigValidation(numberGreaterThan = 0) @GlobalConfigDef(defaultValue = "10", type = Integer.class, description = "Percentage of additional space reserved when creating a logical volume for memory snapshot.") public static GlobalConfig MEMORY_SNAPSHOT_VOLUME_BUFFER_PERCENT = new GlobalConfig(CATEGORY, "memorySnapshotVolume.BufferPercent"); + + @GlobalConfigValidation(validValues = {"true", "false"}) + public static GlobalConfig ENABLE_FAST_REVERT = new GlobalConfig(CATEGORY, "enable.fast.revert"); + + @GlobalConfigValidation(inNumberRange = {1, 10}) + public static GlobalConfig SNAPSHOT_GROUP_REVERT_CONCURRENCY = new GlobalConfig(CATEGORY, "snapshot.group.revert.concurrency"); } diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java index b56f58f6033..3c3e5db007c 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java @@ -2094,7 +2094,8 @@ public boolean skip(Map data) { @Override public void run(FlowTrigger trigger, Map data) { - if (!VolumeSnapshotGlobalConfig.SNAPSHOT_BEFORE_REVERTVOLUME.value(Boolean.class)) { + if (VolumeSnapshotGlobalConfig.ENABLE_FAST_REVERT.value(Boolean.class) + || !VolumeSnapshotGlobalConfig.SNAPSHOT_BEFORE_REVERTVOLUME.value(Boolean.class)) { VolumeInventory vol = VolumeInventory.valueOf(volume); vol.setSize(actualSize); vol.setInstallPath(oldVolumeInstallPath); diff --git a/storage/src/main/java/org/zstack/storage/snapshot/group/VolumeSnapshotGroupBase.java b/storage/src/main/java/org/zstack/storage/snapshot/group/VolumeSnapshotGroupBase.java index fc41db80347..dfd93922563 100644 --- a/storage/src/main/java/org/zstack/storage/snapshot/group/VolumeSnapshotGroupBase.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/group/VolumeSnapshotGroupBase.java @@ -373,7 +373,8 @@ private void handle(RevertVmFromSnapshotGroupInnerMsg msg) { } final String finalNewGroupUuid = newGroup == null ? null : newGroup.getUuid(); - new While<>(snapshots).each((snapshot, compl) -> { + Integer concurrencyNum = VolumeSnapshotGlobalConfig.SNAPSHOT_GROUP_REVERT_CONCURRENCY.value(Integer.class); + new While<>(snapshots).step((snapshot, compl) -> { if (Q.New(VolumeVO.class).eq(VolumeVO_.uuid, snapshot.getVolumeUuid()).eq(VolumeVO_.type, VolumeType.Memory).isExists()) { compl.done(); return; @@ -394,7 +395,7 @@ public void run(MessageReply r) { compl.done(); } }); - }).run(new WhileDoneCompletion(msg) { + }, concurrencyNum).run(new WhileDoneCompletion(msg) { @Override public void done(ErrorCodeList errorCodeList) { bus.reply(msg, reply); diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeSystemTags.java b/storage/src/main/java/org/zstack/storage/volume/VolumeSystemTags.java index 1cbd13ff463..d20cebd9592 100644 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeSystemTags.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeSystemTags.java @@ -3,10 +3,10 @@ import org.zstack.header.core.NonCloneable; import org.zstack.header.storage.primary.PrimaryStorageVO; import org.zstack.header.tag.TagDefinition; -import org.zstack.header.vm.VmInstanceVO; import org.zstack.header.volume.VolumeVO; import org.zstack.tag.EphemeralSystemTag; import org.zstack.tag.PatternedSystemTag; +import org.zstack.tag.SystemTag; /** * Created by miao on 12/23/16. @@ -50,4 +50,6 @@ public class VolumeSystemTags { public static String VOLUME_QOS_TOKEN = "qos"; public static PatternedSystemTag VOLUME_QOS = new PatternedSystemTag(String.format("%s::{%s}", VOLUME_QOS_TOKEN, VOLUME_QOS_TOKEN), VolumeVO.class); + + public static SystemTag FAST_REVERT = new SystemTag("fast::revert", VolumeVO.class); } From 7f4bf48f9c3bf86ab06d4d585dc9a93def4431d9 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Mon, 9 Jun 2025 13:11:57 +0800 Subject: [PATCH 429/737] [plugin]: introducing flatten volume for zbs Resolves: ZSTAC-73557 Change-Id: I6c687062676c6b72787868737a75766366656676 (cherry picked from commit 826f200449962c88bf9e3559b51a920a45f63801) --- .../storage/zbs/ZbsStorageController.java | 63 ++++++++++++++----- 1 file changed, 49 insertions(+), 14 deletions(-) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index ee7492b42ee..0aa26434349 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -85,6 +85,7 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar public static final String QUERY_VOLUME_PATH = "/zbs/primarystorage/volume/query"; public static final String BATCH_QUERY_VOLUME_PATH = "/zbs/primarystorage/volume/query/batch"; public static final String EXPAND_VOLUME_PATH = "/zbs/primarystorage/volume/expand"; + public static final String FLATTEN_VOLUME_PATH = "/zbs/primarystorage/volume/flatten"; public static final String CBD_TO_NBD_PATH = "/zbs/primarystorage/volume/cbdtonbd"; public static final String CLEAN_NBD_PATH = "/zbs/primarystorage/volume/cleannbd"; public static final String CREATE_SNAPSHOT_PATH = "/zbs/primarystorage/snapshot/create"; @@ -553,7 +554,7 @@ public void deleteVolume(String installPath, Completion comp) { @Override public void deleteVolumeAndSnapshot(String installPath, Completion comp) { - + doDeleteVolume(installPath, true, comp); } @Override @@ -677,14 +678,31 @@ public void fail(ErrorCode errorCode) { @Override public void flattenVolume(String installPath, ReturnValueCompletion comp) { - comp.fail(operr("not supported flatten volume with zbs primary storage.")); + FlattenVolumeCmd cmd = new FlattenVolumeCmd(); + cmd.setPath(installPath); + + httpCall(FLATTEN_VOLUME_PATH, cmd, FlattenVolumeRsp.class, new ReturnValueCompletion(comp) { + @Override + public void success(FlattenVolumeRsp returnValue) { + VolumeStats stats = new VolumeStats(); + stats.setInstallPath(installPath); + stats.setSize(returnValue.getSize()); + stats.setActualSize(returnValue.getActualSize()); + stats.setFormat(VolumeConstant.VOLUME_FORMAT_RAW); + comp.success(stats); + } + + @Override + public void fail(ErrorCode errorCode) { + comp.fail(errorCode); + } + }); } @Override public void stats(String installPath, ReturnValueCompletion comp) { QueryVolumeCmd cmd = new QueryVolumeCmd(); - cmd.setLogicalPoolName(getLogicalPoolNameFromPath(installPath)); - cmd.setLunName(getLunNameFromPath(installPath)); + cmd.setPath(installPath); httpCall(QUERY_VOLUME_PATH, cmd, QueryVolumeRsp.class, new ReturnValueCompletion(comp) { @Override @@ -694,6 +712,7 @@ public void success(QueryVolumeRsp returnValue) { stats.setSize(returnValue.getSize()); stats.setActualSize(returnValue.getActualSize()); stats.setFormat(VolumeConstant.VOLUME_FORMAT_RAW); + stats.setParentUri(returnValue.getParentUri()); comp.success(stats); } @@ -1172,6 +1191,7 @@ public static class DeleteSnapshotRsp extends AgentResponse { public static class QueryVolumeRsp extends AgentResponse { private long size; private long actualSize; + private String parentUri; public long getSize() { return size; @@ -1188,6 +1208,18 @@ public long getActualSize() { public void setActualSize(long actualSize) { this.actualSize = actualSize; } + + public String getParentUri() { + return parentUri; + } + + public void setParentUri(String parentUri) { + this.parentUri = parentUri; + } + } + + public static class FlattenVolumeRsp extends QueryVolumeRsp { + } public static class BatchQueryVolumeRsp extends AgentResponse { @@ -1492,23 +1524,26 @@ public void setSnapshotName(String snapshotName) { } public static class QueryVolumeCmd extends AgentCommand { - private String logicalPoolName; - private String lunName; + private String path; - public String getLogicalPoolName() { - return logicalPoolName; + public String getPath() { + return path; } - public void setLogicalPoolName(String logicalPoolName) { - this.logicalPoolName = logicalPoolName; + public void setPath(String path) { + this.path = path; } + } - public String getLunName() { - return lunName; + public static class FlattenVolumeCmd extends AgentCommand { + private String path; + + public String getPath() { + return path; } - public void setLunName(String lunName) { - this.lunName = lunName; + public void setPath(String path) { + this.path = path; } } From 3d332f8536536f7003d82c7a0b4d2356e5d81386 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Wed, 18 Jun 2025 18:03:32 +0800 Subject: [PATCH 430/737] [storage]: set incremental value Resolves: ZSTAC-75670 Change-Id: I6f69696579777875737479706575796762636879 (cherry picked from commit 933e85da61998b5429c067c0638b57611d0d4ec3) From 57ae7094f483b6e95b96cfa32a1ee2267d9ed229 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Thu, 26 Jun 2025 11:31:47 +0800 Subject: [PATCH 431/737] [plugin]: add sync metadata Resolves: ZSTAC-75830 Change-Id: I6f62686f777a63707976766c68666a7a6f747179 (cherry picked from commit 2b46bbe1350ba94edfd0726c79f884dc94761616) --- .../src/main/java/org/zstack/cbd/MdsInfo.java | 59 +-- .../src/main/java/org/zstack/cbd/MdsUri.java | 24 +- .../org/zstack/storage/zbs/ZbsHelper.java | 24 +- .../org/zstack/storage/zbs/ZbsMdsBase.java | 18 +- .../storage/zbs/ZbsPrimaryStorageMdsBase.java | 110 +++-- .../storage/zbs/ZbsStorageController.java | 387 ++++++------------ .../zstack/storage/zbs/ZbsStorageFactory.java | 2 +- .../addon/zbs/ZbsPrimaryStorageCase.groovy | 18 +- .../testlib/ExternalPrimaryStorageSpec.groovy | 9 +- 9 files changed, 280 insertions(+), 371 deletions(-) diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java b/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java index 4ab8fe44313..5ca740b59ee 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java @@ -5,49 +5,58 @@ * @date 2024/4/10 23:18 */ public class MdsInfo { - private String sshUsername; - private String sshPassword; - private int sshPort = 22; - private String mdsAddr; - private MdsStatus mdsStatus; + private String username; + private String password; + private int port = 22; + private String addr; + private String externalAddr; + private MdsStatus status; - public String getSshUsername() { - return sshUsername; + public String getUsername() { + return username; } - public void setSshUsername(String sshUsername) { - this.sshUsername = sshUsername; + public void setUsername(String username) { + this.username = username; } - public String getSshPassword() { - return sshPassword; + public String getPassword() { + return password; } - public void setSshPassword(String sshPassword) { - this.sshPassword = sshPassword; + public void setPassword(String password) { + this.password = password; } - public int getSshPort() { - return sshPort; + public int getPort() { + return port; } - public void setSshPort(int sshPort) { - this.sshPort = sshPort; + public void setPort(int port) { + this.port = port; } - public String getMdsAddr() { - return mdsAddr; + public String getAddr() { + return addr; } - public void setMdsAddr(String mdsAddr) { - this.mdsAddr = mdsAddr; + public void setAddr(String addr) { + this.addr = addr; } - public MdsStatus getMdsStatus() { - return mdsStatus; + public String getExternalAddr() { + return externalAddr; } - public void setMdsStatus(MdsStatus mdsStatus) { - this.mdsStatus = mdsStatus; + public void setExternalAddr(String externalAddr) { + this.externalAddr = externalAddr; + } + + public MdsStatus getStatus() { + return status; + } + + public void setStatus(MdsStatus status) { + this.status = status; } } diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/MdsUri.java b/plugin/cbd/src/main/java/org/zstack/cbd/MdsUri.java index 714f9cf8e4d..9fef3451b01 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/MdsUri.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/MdsUri.java @@ -22,8 +22,8 @@ public class MdsUri { private String hostname; private int mdsPort = DEFAULT_MDS_PORT; private int sshPort = DEFAULT_SSH_PORT; - private String sshUsername; - private String sshPassword; + private String username; + private String password; private static final String MDS_URL_FORMAT = "sshUsername:sshPassword@hostname:[sshPort]/?[mdsPort=]"; private static final Integer DEFAULT_MDS_PORT = 6666; @@ -73,8 +73,8 @@ public MdsUri(String url) { throw new OperationFailureException(operr("invalid mdsUrl[%s]. SSH username and password must be separated by ':' and cannot be empty. A valid monUrl format is %s", url, MDS_URL_FORMAT)); } - sshUsername = ssh[0]; - sshPassword = ssh[1]; + username = ssh[0]; + password = ssh[1]; URI uri = new URI(String.format("ssh://%s", rest)); hostname = uri.getHost(); @@ -113,20 +113,20 @@ public void setMdsPort(int mdsPort) { this.mdsPort = mdsPort; } - public String getSshUsername() { - return sshUsername; + public String getUsername() { + return username; } - public void setSshUsername(String sshUsername) { - this.sshUsername = sshUsername; + public void setUsername(String username) { + this.username = username; } - public String getSshPassword() { - return sshPassword; + public String getPassword() { + return password; } - public void setSshPassword(String sshPassword) { - this.sshPassword = sshPassword; + public void setPassword(String password) { + this.password = password; } public int getSshPort() { diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java index af0ce889d9c..6dd1b0251a2 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java @@ -17,28 +17,12 @@ public static void configUrl(String psUuid) { } } - public static String buildVolumePath(String physicalPoolName, String logicalPoolName, String volId) { + public static String buildVolumePath(String physicalPool, String logicalPool, String volId) { String base = volId.replace("-", ""); - return String.format(ZbsConstants.ZBS_CBD_LUN_PATH_FORMAT, physicalPoolName, logicalPoolName, base); + return String.format(ZbsConstants.ZBS_CBD_LUN_PATH_FORMAT, physicalPool, logicalPool, base); } - public static String getLogicalPoolNameFromPath(String url) { - return url.split("/")[1]; - } - - public static String getPhysicalPoolNameFromPath(String url) { - return url.split("/")[0].split(":")[1]; - } - - public static String getLunNameFromPath(String url) { - return url.split("/")[2].split("@")[0]; - } - - public static String getSnapshotNameFromPath(String url) { - return url.split("/")[2].split("@")[1]; - } - - public static String getVolumeInstallPathFromSnapshot(String snapshotInstallPath) { - return snapshotInstallPath.split("@")[0]; + public static String getVolumeFromSnapshotPath(String path) { + return path.split("@")[0]; } } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java index b23abf61154..64560b71770 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java @@ -47,7 +47,7 @@ public MdsInfo getSelf() { protected void checkTools() { Ssh ssh = new Ssh(); try { - ssh.setHostname(self.getMdsAddr()).setUsername(self.getSshUsername()).setPassword(self.getSshPassword()).setPort(self.getSshPort()) + ssh.setHostname(self.getAddr()).setUsername(self.getUsername()).setPassword(self.getPassword()).setPort(self.getPort()) .checkTool("zbs").setTimeout(60).runErrorByExceptionAndClose(); } catch (SshException e) { throw new OperationFailureException(operr("The problem may be caused by zbs-tool is missing on mds node.")); @@ -58,7 +58,7 @@ protected void checkHealth() { Ssh ssh = new Ssh(); SshResult ret = null; try { - ret = ssh.setHostname(self.getMdsAddr()).setUsername(self.getSshUsername()).setPassword(self.getSshPassword()).setPort(self.getSshPort()) + ret = ssh.setHostname(self.getAddr()).setUsername(self.getUsername()).setPassword(self.getPassword()).setPort(self.getPort()) .shell("zbs status mds --format json").setTimeout(60).runAndClose(); } catch (SshException e) { throw new OperationFailureException(operr("The problem may be caused by zbs storage health issue.")); @@ -103,9 +103,9 @@ public Class getReturnClass() { }; if (unit == null) { - restf.asyncJsonPost(makeHttpPath(self.getMdsAddr(), path), cmd, callback); + restf.asyncJsonPost(makeHttpPath(self.getAddr(), path), cmd, callback); } else { - restf.asyncJsonPost(makeHttpPath(self.getMdsAddr(), path), cmd, callback, unit, timeout); + restf.asyncJsonPost(makeHttpPath(self.getAddr(), path), cmd, callback, unit, timeout); } } @@ -142,7 +142,7 @@ public ErrorCode buildErrorCode() { public static class AgentCommand { private String uuid; - private String mdsAddr; + private String addr; public String getUuid() { return uuid; @@ -152,12 +152,12 @@ public void setUuid(String uuid) { this.uuid = uuid; } - public String getMdsAddr() { - return mdsAddr; + public String getAddr() { + return addr; } - public void setMdsAddr(String mdsAddr) { - this.mdsAddr = mdsAddr; + public void setAddr(String addr) { + this.addr = addr; } } } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java index 47a26c0cfc4..9f2dec0fbe0 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java @@ -49,14 +49,15 @@ public class ZbsPrimaryStorageMdsBase extends ZbsMdsBase { public static final String ECHO_PATH = "/zbs/primarystorage/echo"; public static final String PING_PATH = "/zbs/primarystorage/ping"; + public static final String SYNC_METADATA_PATH = "/zbs/primarystorage/metadata/sync"; public ZbsPrimaryStorageMdsBase(MdsInfo self) { super(self); - this.syncId = String.format("connect-mds-%s", self.getMdsAddr()); + this.syncId = String.format("connect-mds-%s", self.getAddr()); } private void doConnect(final Completion completion) { - getSelf().setMdsStatus(MdsStatus.Connecting); + getSelf().setStatus(MdsStatus.Connecting); final FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setName("connect-mds"); @@ -82,30 +83,30 @@ public void run(FlowTrigger trigger, Map data) { @Override public void run(FlowTrigger trigger, Map data) { SshFileMd5Checker checker = new SshFileMd5Checker(); - checker.setTargetIp(getSelf().getMdsAddr()); - checker.setUsername(getSelf().getSshUsername()); - checker.setPassword(getSelf().getSshPassword()); + checker.setTargetIp(getSelf().getAddr()); + checker.setUsername(getSelf().getUsername()); + checker.setPassword(getSelf().getPassword()); checker.addSrcDestPair(SshFileMd5Checker.ZSTACKLIB_SRC_PATH, String.format("/var/lib/zstack/zbsp/package/%s", AnsibleGlobalProperty.ZSTACKLIB_PACKAGE_NAME)); checker.addSrcDestPair(PathUtil.findFileOnClassPath(String.format("ansible/zbsp/%s", ZbsGlobalProperty.PRIMARY_STORAGE_PACKAGE_NAME), true).getAbsolutePath(), String.format("/var/lib/zstack/zbsp/package/%s", ZbsGlobalProperty.PRIMARY_STORAGE_PACKAGE_NAME)); SshChronyConfigChecker chronyChecker = new SshChronyConfigChecker(); - chronyChecker.setTargetIp(getSelf().getMdsAddr()); - chronyChecker.setUsername(getSelf().getSshUsername()); - chronyChecker.setPassword(getSelf().getSshPassword()); - chronyChecker.setSshPort(getSelf().getSshPort()); + chronyChecker.setTargetIp(getSelf().getAddr()); + chronyChecker.setUsername(getSelf().getUsername()); + chronyChecker.setPassword(getSelf().getPassword()); + chronyChecker.setSshPort(getSelf().getPort()); SshYumRepoChecker repoChecker = new SshYumRepoChecker(); - repoChecker.setTargetIp(getSelf().getMdsAddr()); - repoChecker.setUsername(getSelf().getSshUsername()); - repoChecker.setPassword(getSelf().getSshPassword()); - repoChecker.setSshPort(getSelf().getSshPort()); + repoChecker.setTargetIp(getSelf().getAddr()); + repoChecker.setUsername(getSelf().getUsername()); + repoChecker.setPassword(getSelf().getPassword()); + repoChecker.setSshPort(getSelf().getPort()); CallBackNetworkChecker callBackChecker = new CallBackNetworkChecker(); - callBackChecker.setTargetIp(getSelf().getMdsAddr()); - callBackChecker.setUsername(getSelf().getSshUsername()); - callBackChecker.setPassword(getSelf().getSshPassword()); - callBackChecker.setPort(getSelf().getSshPort()); + callBackChecker.setTargetIp(getSelf().getAddr()); + callBackChecker.setUsername(getSelf().getUsername()); + callBackChecker.setPassword(getSelf().getPassword()); + callBackChecker.setPort(getSelf().getPort()); callBackChecker.setCallbackIp(Platform.getManagementServerIp()); callBackChecker.setCallBackPort(CloudBusGlobalProperty.HTTP_PORT); @@ -114,10 +115,10 @@ public void run(FlowTrigger trigger, Map data) { runner.installChecker(chronyChecker); runner.installChecker(repoChecker); runner.installChecker(callBackChecker); - runner.setUsername(getSelf().getSshUsername()); - runner.setPassword(getSelf().getSshPassword()); - runner.setTargetIp(getSelf().getMdsAddr()); - runner.setTargetUuid(getSelf().getMdsAddr()); + runner.setUsername(getSelf().getUsername()); + runner.setPassword(getSelf().getPassword()); + runner.setTargetIp(getSelf().getAddr()); + runner.setTargetUuid(getSelf().getAddr()); runner.setAgentPort(ZbsGlobalProperty.PRIMARY_STORAGE_AGENT_PORT); runner.setPlayBookName(ZbsGlobalProperty.PRIMARY_STORAGE_PLAYBOOK_NAME); @@ -160,10 +161,10 @@ public void run(FlowTrigger trigger, Map data) { try { new Ssh().shell(builder.toString()) - .setUsername(getSelf().getSshUsername()) - .setPassword(getSelf().getSshPassword()) - .setHostname(getSelf().getMdsAddr()) - .setPort(getSelf().getSshPort()).runErrorByExceptionAndClose(); + .setUsername(getSelf().getUsername()) + .setPassword(getSelf().getPassword()) + .setHostname(getSelf().getAddr()) + .setPort(getSelf().getPort()).runErrorByExceptionAndClose(); } catch (SshException ex) { throw new OperationFailureException(operr(ex.toString())); } @@ -178,7 +179,7 @@ public void run(FlowTrigger trigger, Map data) { @Override public void run(FlowTrigger trigger, Map data) { - restf.echo(ZbsAgentUrl.primaryStorageUrl(getSelf().getMdsAddr(), ECHO_PATH), new Completion(trigger) { + restf.echo(ZbsAgentUrl.primaryStorageUrl(getSelf().getAddr(), ECHO_PATH), new Completion(trigger) { @Override public void success() { trigger.next(); @@ -192,10 +193,38 @@ public void fail(ErrorCode errorCode) { } }); + flow(new NoRollbackFlow() { + String __name__ = "sync-metadata"; + + @Override + public void run(FlowTrigger trigger, Map data) { + SyncMetadataCmd cmd = new SyncMetadataCmd(); + cmd.setAddr(getSelf().getAddr()); + + restf.asyncJsonPost(ZbsAgentUrl.primaryStorageUrl(getSelf().getAddr(), SYNC_METADATA_PATH), cmd, new JsonAsyncRESTCallback(trigger) { + @Override + public void success(SyncMetadataRsp ret) { + getSelf().setExternalAddr(ret.getExternalAddr()); + trigger.next(); + } + + @Override + public void fail(ErrorCode err) { + trigger.fail(err); + } + + @Override + public Class getReturnClass() { + return SyncMetadataRsp.class; + } + }); + } + }); + done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { - getSelf().setMdsStatus(MdsStatus.Connected); + getSelf().setStatus(MdsStatus.Connected); completion.success(); } }); @@ -203,7 +232,7 @@ public void handle(Map data) { error(new FlowErrorHandler(completion) { @Override public void handle(ErrorCode errCode, Map data) { - getSelf().setMdsStatus(MdsStatus.Disconnected); + getSelf().setStatus(MdsStatus.Disconnected); completion.fail(errCode); } }); @@ -238,7 +267,7 @@ public String getSyncSignature() { @Override public String getName() { - return String.format("mds-%s", getSelf().getMdsAddr()); + return String.format("mds-%s", getSelf().getAddr()); } }); } @@ -270,7 +299,7 @@ public void fail(ErrorCode errorCode) { @Override public String getName() { - return String.format("ping-zbs-primary-storage-mds-%s", getSelf().getMdsAddr()); + return String.format("ping-zbs-primary-storage-mds-%s", getSelf().getAddr()); } }); } @@ -284,8 +313,8 @@ private void pingMds(final Completion completion) { new While<>(stepCount).each((step, comp) -> { PingCmd cmd = new PingCmd(); - cmd.setMdsAddr(getSelf().getMdsAddr()); - restf.asyncJsonPost(ZbsAgentUrl.primaryStorageUrl(getSelf().getMdsAddr(), PING_PATH), + cmd.setAddr(getSelf().getAddr()); + restf.asyncJsonPost(ZbsAgentUrl.primaryStorageUrl(getSelf().getAddr(), PING_PATH), cmd, new JsonAsyncRESTCallback(completion) { @Override public void success(PingRsp rsp) { @@ -306,7 +335,7 @@ public void success(PingRsp rsp) { @Override public void fail(ErrorCode errorCode) { - logger.warn(String.format("ping zbs primary storage mds[%s] failed (%d/%d): %s", getSelf().getMdsAddr(), step, MAX_PING_CNT, errorCode.toString())); + logger.warn(String.format("ping zbs primary storage mds[%s] failed (%d/%d): %s", getSelf().getAddr(), step, MAX_PING_CNT, errorCode.toString())); comp.addError(errorCode); if (step.equals(MAX_PING_CNT)) { @@ -340,6 +369,21 @@ public static class PingRsp extends ZbsMdsBase.AgentResponse { public static class PingCmd extends ZbsMdsBase.AgentCommand { } + public static class SyncMetadataRsp extends ZbsMdsBase.AgentResponse { + private String externalAddr; + + public String getExternalAddr() { + return externalAddr; + } + + public void setExternalAddr(String externalAddr) { + this.externalAddr = externalAddr; + } + } + + public static class SyncMetadataCmd extends ZbsMdsBase.AgentCommand { + } + @Override protected String makeHttpPath(String ip, String path) { return ZbsAgentUrl.primaryStorageUrl(ip, path); diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 0aa26434349..0065a1791e2 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -167,8 +167,8 @@ public void deployClient(HostInventory h, Completion comp) { } DeployClientCmd cmd = new DeployClientCmd(); - cmd.setClientIp(h.getManagementIp()); - cmd.setClientPassword(clientPassword); + cmd.setIp(h.getManagementIp()); + cmd.setPassword(clientPassword); httpCall(DEPLOY_CLIENT_PATH, cmd, DeployClientRsp.class, new ReturnValueCompletion(comp) { @Override @@ -188,8 +188,8 @@ public synchronized void activateHeartbeatVolume(HostInventory h, ReturnValueCom reloadDbInfo(); CreateVolumeCmd cmd = new CreateVolumeCmd(); - cmd.setLogicalPoolName(config.getLogicalPoolName()); - cmd.setLunName(ZbsConstants.ZBS_HEARTBEAT_VOLUME_NAME); + cmd.setLogicalPool(config.getLogicalPoolName()); + cmd.setVolume(ZbsConstants.ZBS_HEARTBEAT_VOLUME_NAME); cmd.setSkipIfExisting(true); httpCall(CREATE_VOLUME_PATH, cmd, CreateVolumeRsp.class, new ReturnValueCompletion(comp) { @@ -244,16 +244,16 @@ public void connect(String cfg, String url, ReturnValueCompletion for (String mdsUrl : config.getMdsUrls()) { MdsUri uri = new MdsUri(mdsUrl); MdsInfo mdsInfo = new MdsInfo(); - mdsInfo.setSshUsername(uri.getSshUsername()); - mdsInfo.setSshPassword(uri.getSshPassword()); - mdsInfo.setSshPort(uri.getSshPort()); - mdsInfo.setMdsAddr(uri.getHostname()); + mdsInfo.setUsername(uri.getUsername()); + mdsInfo.setPassword(uri.getPassword()); + mdsInfo.setPort(uri.getSshPort()); + mdsInfo.setAddr(uri.getHostname()); mdsInfos.add(mdsInfo); } - AddonInfo info = new AddonInfo(); - info.setMdsInfos(mdsInfos); - final List mds = CollectionUtils.transformToList(info.getMdsInfos(), + AddonInfo newAddonInfo = new AddonInfo(); + newAddonInfo.setMdsInfos(mdsInfos); + final List mds = CollectionUtils.transformToList(newAddonInfo.getMdsInfos(), ZbsPrimaryStorageMdsBase::new); class Connector { @@ -310,6 +310,7 @@ public void setup() { @Override public void run(FlowTrigger trigger, Map data) { new Connector().connect(trigger); + addonInfo = newAddonInfo; } }); @@ -346,8 +347,8 @@ public void run(FlowTrigger trigger, Map data) { } DeployClientCmd cmd = new DeployClientCmd(); - cmd.setClientIp(h.getManagementIp()); - cmd.setClientPassword(clientPassword); + cmd.setIp(h.getManagementIp()); + cmd.setPassword(clientPassword); httpCall(DEPLOY_CLIENT_PATH, cmd, DeployClientRsp.class, new ReturnValueCompletion(comp) { @Override @@ -380,8 +381,8 @@ public void done(ErrorCodeList errorCodeList) { public void handle(Map data) { changeStatus(PrimaryStorageStatus.Connected); configUrl(self.getUuid()); - addonInfo = info; - completion.success(JSONObjectUtil.rehashObject(info, LinkedHashMap.class)); + addonInfo = newAddonInfo; + completion.success(JSONObjectUtil.rehashObject(newAddonInfo, LinkedHashMap.class)); } }); @@ -404,13 +405,13 @@ public void ping(Completion completion) { m.ping(new Completion(comp) { @Override public void success() { - m.getSelf().setMdsStatus(MdsStatus.Connected); + m.getSelf().setStatus(MdsStatus.Connected); comp.done(); } @Override public void fail(ErrorCode errorCode) { - m.getSelf().setMdsStatus(MdsStatus.Disconnected); + m.getSelf().setStatus(MdsStatus.Disconnected); comp.done(); } }); @@ -421,11 +422,11 @@ public void done(ErrorCodeList errorCodeList) { .set(ExternalPrimaryStorageVO_.addonInfo, JSONObjectUtil.toJsonString(addonInfo)) .update(); - boolean isConnected = addonInfo.getMdsInfos().stream().anyMatch(mdsInfo -> MdsStatus.Connected.equals(mdsInfo.getMdsStatus())); + boolean isConnected = addonInfo.getMdsInfos().stream().anyMatch(mdsInfo -> MdsStatus.Connected.equals(mdsInfo.getStatus())); if (!isConnected) { String notConnectedIps = addonInfo.getMdsInfos().stream() - .filter(mdsInfo -> !MdsStatus.Connected.equals(mdsInfo.getMdsStatus())) - .map(MdsInfo::getMdsAddr) + .filter(mdsInfo -> !MdsStatus.Connected.equals(mdsInfo.getStatus())) + .map(MdsInfo::getAddr) .collect(Collectors.joining(", ")); completion.fail(operr("no MDS node is Connected, the following MDS nodes[%s] are not Connected.", notConnectedIps)); @@ -441,7 +442,7 @@ public void reportCapacity(ReturnValueCompletion comp) { reloadDbInfo(); GetCapacityCmd cmd = new GetCapacityCmd(); - cmd.setLogicalPoolName(config.getLogicalPoolName()); + cmd.setLogicalPool(config.getLogicalPoolName()); httpCall(GET_CAPACITY_PATH, cmd, GetCapacityRsp.class, new ReturnValueCompletion(comp) { @Override @@ -524,8 +525,8 @@ public void createVolume(CreateVolumeSpec v, ReturnValueCompletion reloadDbInfo(); CreateVolumeCmd cmd = new CreateVolumeCmd(); - cmd.setLogicalPoolName(config.getLogicalPoolName()); - cmd.setLunName(v.getName()); + cmd.setLogicalPool(config.getLogicalPoolName()); + cmd.setVolume(v.getName()); cmd.setSize((long)Math.ceil(SizeUnit.BYTE.toGigaByte((double)v.getSize()))); cmd.setSkipIfExisting(true); @@ -577,10 +578,8 @@ public void setup() { @Override public void run(FlowTrigger trigger, Map data) { CloneVolumeCmd cmd = new CloneVolumeCmd(); - cmd.setLogicalPoolName(getLogicalPoolNameFromPath(srcInstallPath)); - cmd.setLunName(getLunNameFromPath(srcInstallPath)); - cmd.setSnapshotName(getSnapshotNameFromPath(srcInstallPath)); - cmd.setDstLunName(dst.getName()); + cmd.setPath(srcInstallPath); + cmd.setDstVolume(dst.getName()); httpCall(CLONE_VOLUME_PATH, cmd, CloneVolumeRsp.class, new ReturnValueCompletion(trigger) { @Override @@ -612,8 +611,7 @@ public boolean skip(Map data) { @Override public void run(FlowTrigger trigger, Map data) { ExpandVolumeCmd cmd = new ExpandVolumeCmd(); - cmd.setLogicalPoolName(getLogicalPoolNameFromPath(stats.getInstallPath())); - cmd.setLunName(getLunNameFromPath(stats.getInstallPath())); + cmd.setPath(stats.getInstallPath()); cmd.setSize(SizeUnit.BYTE.toGigaByte(dst.getSize())); httpCall(EXPAND_VOLUME_PATH, cmd, ExpandVolumeRsp.class, new ReturnValueCompletion(trigger) { @@ -651,12 +649,9 @@ public void handle(ErrorCode errCode, Map data) { @Override public void copyVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValueCompletion comp) { CopyCmd cmd = new CopyCmd(); - cmd.setPhysicalPoolName(getPhysicalPoolNameFromPath(srcInstallPath)); - cmd.setLogicalPoolName(getLogicalPoolNameFromPath(srcInstallPath)); - cmd.setLunName(getLunNameFromPath(srcInstallPath)); - cmd.setSnapshotName(getSnapshotNameFromPath(srcInstallPath)); - cmd.setDstLunName(dst.getName()); - cmd.setDstLunSize(dst.getSize() / (1L << 30)); + cmd.setPath(srcInstallPath); + cmd.setDstVolume(dst.getName()); + cmd.setDstSize(dst.getSize() / (1L << 30)); httpCall(COPY_PATH, cmd, CopyRsp.class, new ReturnValueCompletion(comp) { @Override @@ -752,8 +747,7 @@ public void fail(ErrorCode errorCode) { @Override public void expandVolume(String installPath, long size, ReturnValueCompletion comp) { ExpandVolumeCmd cmd = new ExpandVolumeCmd(); - cmd.setLogicalPoolName(getLogicalPoolNameFromPath(installPath)); - cmd.setLunName(getLunNameFromPath(installPath)); + cmd.setPath(installPath); cmd.setSize(SizeUnit.BYTE.toGigaByte(size)); httpCall(EXPAND_VOLUME_PATH, cmd, ExpandVolumeRsp.class, new ReturnValueCompletion(comp) { @@ -798,7 +792,7 @@ public void export(ExportSpec espec, VolumeProtocol protocol, ReturnValueComplet } CbdToNbdCmd cmd = new CbdToNbdCmd(); - cmd.setInstallPath(espec.getInstallPath()); + cmd.setPath(espec.getInstallPath()); cmd.setPortRange(HostGlobalConfig.NBD_PORT_RANGE.value(String.class)); httpCall(CBD_TO_NBD_PATH, cmd, CbdToNbdRsp.class, new ReturnValueCompletion(comp) { @@ -860,9 +854,8 @@ public void fail(ErrorCode errorCode) { @Override public void createSnapshot(CreateVolumeSnapshotSpec spec, ReturnValueCompletion comp) { CreateSnapshotCmd cmd = new CreateSnapshotCmd(); - cmd.setLogicalPoolName(getLogicalPoolNameFromPath(spec.getVolumeInstallPath())); - cmd.setLunName(getLunNameFromPath(spec.getVolumeInstallPath())); - cmd.setSnapshotName(spec.getName()); + cmd.setPath(spec.getVolumeInstallPath()); + cmd.setSnapshot(spec.getName()); cmd.setSkipOnExisting(true); httpCall(CREATE_SNAPSHOT_PATH, cmd, CreateSnapshotRsp.class, new ReturnValueCompletion(comp) { @@ -884,9 +877,7 @@ public void fail(ErrorCode errorCode) { @Override public void deleteSnapshot(String installPath, Completion comp) { DeleteSnapshotCmd cmd = new DeleteSnapshotCmd(); - cmd.setLogicalPoolName(getLogicalPoolNameFromPath(installPath)); - cmd.setLunName(getLunNameFromPath(installPath)); - cmd.setSnapshotName(getSnapshotNameFromPath(installPath)); + cmd.setPath(installPath); httpCall(DELETE_SNAPSHOT_PATH, cmd, DeleteSnapshotRsp.class, new ReturnValueCompletion(comp) { @Override @@ -909,9 +900,7 @@ public void expungeSnapshot(String installPath, Completion comp) { @Override public void revertVolumeSnapshot(String snapshotInstallPath, ReturnValueCompletion comp) { RollbackSnapshotCmd cmd = new RollbackSnapshotCmd(); - cmd.setLogicalPoolName(getLogicalPoolNameFromPath(snapshotInstallPath)); - cmd.setLunName(getLunNameFromPath(snapshotInstallPath)); - cmd.setSnapshotName(getSnapshotNameFromPath(snapshotInstallPath)); + cmd.setPath(snapshotInstallPath); httpCall(ROLLBACK_SNAPSHOT_PATH, cmd, RollbackSnapshotRsp.class, new ReturnValueCompletion(comp) { @Override @@ -950,8 +939,7 @@ public void onFirstAdditionConfigure(Completion completion) { public void doDeleteVolume(String installPath, Boolean force, Completion comp) { DeleteVolumeCmd cmd = new DeleteVolumeCmd(); - cmd.setLogicalPoolName(getLogicalPoolNameFromPath(installPath)); - cmd.setLunName(getLunNameFromPath(installPath)); + cmd.setPath(installPath); cmd.setForce(force); httpCall(DELETE_VOLUME_PATH, cmd, DeleteVolumeRsp.class, new ReturnValueCompletion(comp) { @@ -1038,7 +1026,7 @@ public void call() { HttpCaller setTargetMds(String mdsAddr) { logger.debug(String.format("target mds[ip:%s]", mdsAddr)); - mdsInfos.removeIf(it -> !it.getMdsAddr().equals(mdsAddr)); + mdsInfos.removeIf(it -> !it.getAddr().equals(mdsAddr)); if (mdsInfos.isEmpty()) { throw new OperationFailureException(operr( "not found mds[ip:%s] of zbs primary storage[uuid:%s] node", mdsAddr, self.getUuid()) @@ -1057,7 +1045,7 @@ private List prepareMds() { Collections.shuffle(mds); - mds.removeIf(it -> it.getMdsStatus() != MdsStatus.Connected); + mds.removeIf(it -> it.getStatus() != MdsStatus.Connected); if (mds.isEmpty()) { throw new OperationFailureException(operr( "all zbs mds of primary storage[uuid:%s] are not in Connected state", self.getUuid()) @@ -1078,7 +1066,7 @@ private void doCall() { } ZbsPrimaryStorageMdsBase base = it.next(); - cmd.setMdsAddr(base.getSelf().getMdsAddr()); + cmd.setAddr(base.getSelf().getAddr()); ReturnValueCompletion completion = new ReturnValueCompletion(callback) { @Override @@ -1090,7 +1078,7 @@ public void success(T ret) { public void fail(ErrorCode errorCode) { if (!errorCode.isError(SysErrors.OPERATION_ERROR) && !errorCode.isError(SysErrors.TIMEOUT)) { logger.warn(String.format("mds[addr:%s] failed to execute http call[%s], error is: %s", - base.getSelf().getMdsAddr(), path, JSONObjectUtil.toJsonString(errorCode))); + base.getSelf().getAddr(), path, JSONObjectUtil.toJsonString(errorCode))); errorCodes.getCauses().add(errorCode); doCall(); return; @@ -1364,37 +1352,16 @@ public static class DeployClientRsp extends AgentResponse { } - public static class GetFactsRsp extends AgentResponse { - private String mdsExternalAddr; - - public String getMdsExternalAddr() { - return mdsExternalAddr; - } - - public void setMdsExternalAddr(String mdsExternalAddr) { - this.mdsExternalAddr = mdsExternalAddr; - } - } - public static class ExpandVolumeCmd extends AgentCommand { - private String logicalPoolName; - private String lunName; + private String path; private long size; - public String getLogicalPoolName() { - return logicalPoolName; - } - - public void setLogicalPoolName(String logicalPoolName) { - this.logicalPoolName = logicalPoolName; - } - - public String getLunName() { - return lunName; + public String getPath() { + return path; } - public void setLunName(String lunName) { - this.lunName = lunName; + public void setPath(String path) { + this.path = path; } public long getSize() { @@ -1407,119 +1374,56 @@ public void setSize(long size) { } public static class CopyCmd extends AgentCommand implements HasThreadContext { - private String physicalPoolName; - private String logicalPoolName; - private String lunName; - private String snapshotName; - private String dstLunName; - private long dstLunSize; - - public String getPhysicalPoolName() { - return physicalPoolName; - } - - public void setPhysicalPoolName(String physicalPoolName) { - this.physicalPoolName = physicalPoolName; - } - - public String getLogicalPoolName() { - return logicalPoolName; - } - - public void setLogicalPoolName(String logicalPoolName) { - this.logicalPoolName = logicalPoolName; - } - - public String getLunName() { - return lunName; - } - - public void setLunName(String lunName) { - this.lunName = lunName; - } + private String path; + private String dstVolume; + private long dstSize; - public String getSnapshotName() { - return snapshotName; + public String getPath() { + return path; } - public void setSnapshotName(String snapshotName) { - this.snapshotName = snapshotName; + public void setPath(String path) { + this.path = path; } - public String getDstLunName() { - return dstLunName; + public String getDstVolume() { + return dstVolume; } - public void setDstLunName(String dstLunName) { - this.dstLunName = dstLunName; + public void setDstVolume(String dstVolume) { + this.dstVolume = dstVolume; } - public long getDstLunSize() { - return dstLunSize; + public long getDstSize() { + return dstSize; } - public void setDstLunSize(long dstLunSize) { - this.dstLunSize = dstLunSize; + public void setDstSize(long dstSize) { + this.dstSize = dstSize; } } public static class RollbackSnapshotCmd extends AgentCommand { - private String logicalPoolName; - private String lunName; - private String snapshotName; - - public String getLogicalPoolName() { - return logicalPoolName; - } - - public void setLogicalPoolName(String logicalPoolName) { - this.logicalPoolName = logicalPoolName; - } - - public String getLunName() { - return lunName; - } - - public void setLunName(String lunName) { - this.lunName = lunName; - } + private String path; - public String getSnapshotName() { - return snapshotName; + public String getPath() { + return path; } - public void setSnapshotName(String snapshotName) { - this.snapshotName = snapshotName; + public void setPath(String path) { + this.path = path; } } public static class DeleteSnapshotCmd extends AgentCommand { - private String logicalPoolName; - private String lunName; - private String snapshotName; - - public String getLogicalPoolName() { - return logicalPoolName; - } - - public void setLogicalPoolName(String logicalPoolName) { - this.logicalPoolName = logicalPoolName; - } - - public String getLunName() { - return lunName; - } - - public void setLunName(String lunName) { - this.lunName = lunName; - } + private String path; - public String getSnapshotName() { - return snapshotName; + public String getPath() { + return path; } - public void setSnapshotName(String snapshotName) { - this.snapshotName = snapshotName; + public void setPath(String path) { + this.path = path; } } @@ -1581,15 +1485,15 @@ public void setPort(int port) { } public static class CbdToNbdCmd extends AgentCommand { - private String installPath; + private String path; private String portRange; - public String getInstallPath() { - return installPath; + public String getPath() { + return path; } - public void setInstallPath(String installPath) { - this.installPath = installPath; + public void setPath(String path) { + this.path = path; } public String getPortRange() { @@ -1602,72 +1506,45 @@ public void setPortRange(String portRange) { } public static class CloneVolumeCmd extends AgentCommand { - private String logicalPoolName; - private String lunName; - private String snapshotName; - private String dstLunName; - - public String getLogicalPoolName() { - return logicalPoolName; - } - - public void setLogicalPoolName(String logicalPoolName) { - this.logicalPoolName = logicalPoolName; - } - - public String getLunName() { - return lunName; - } - - public void setLunName(String lunName) { - this.lunName = lunName; - } + private String path; + private String dstVolume; - public String getSnapshotName() { - return snapshotName; + public String getPath() { + return path; } - public void setSnapshotName(String snapshotName) { - this.snapshotName = snapshotName; + public void setPath(String path) { + this.path = path; } - public String getDstLunName() { - return dstLunName; + public String getDstVolume() { + return dstVolume; } - public void setDstLunName(String dstLunName) { - this.dstLunName = dstLunName; + public void setDstVolume(String dstVolume) { + this.dstVolume = dstVolume; } } public static class CreateSnapshotCmd extends AgentCommand { - private String logicalPoolName; - private String lunName; - private String snapshotName; + private String path; + private String snapshot; private boolean skipOnExisting; - public String getLogicalPoolName() { - return logicalPoolName; - } - - public void setLogicalPoolName(String logicalPoolName) { - this.logicalPoolName = logicalPoolName; - } - - public String getLunName() { - return lunName; + public String getPath() { + return path; } - public void setLunName(String lunName) { - this.lunName = lunName; + public void setPath(String path) { + this.path = path; } - public String getSnapshotName() { - return snapshotName; + public String getSnapshot() { + return snapshot; } - public void setSnapshotName(String snapshotName) { - this.snapshotName = snapshotName; + public void setSnapshot(String snapshot) { + this.snapshot = snapshot; } public boolean isSkipOnExisting() { @@ -1680,24 +1557,15 @@ public void setSkipOnExisting(boolean skipOnExisting) { } public static class DeleteVolumeCmd extends AgentCommand { - private String logicalPoolName; - private String lunName; + private String path; private boolean force; - public String getLogicalPoolName() { - return logicalPoolName; - } - - public void setLogicalPoolName(String logicalPoolName) { - this.logicalPoolName = logicalPoolName; - } - - public String getLunName() { - return lunName; + public String getPath() { + return path; } - public void setLunName(String lunName) { - this.lunName = lunName; + public void setPath(String path) { + this.path = path; } public boolean isForce() { @@ -1710,25 +1578,25 @@ public void setForce(boolean force) { } public static class CreateVolumeCmd extends AgentCommand { - private String logicalPoolName; - private String lunName; + private String logicalPool; + private String volume; private long size = 1L; private boolean skipIfExisting; - public String getLogicalPoolName() { - return logicalPoolName; + public String getLogicalPool() { + return logicalPool; } - public void setLogicalPoolName(String logicalPoolName) { - this.logicalPoolName = logicalPoolName; + public void setLogicalPool(String logicalPool) { + this.logicalPool = logicalPool; } - public String getLunName() { - return lunName; + public String getVolume() { + return volume; } - public void setLunName(String lunName) { - this.lunName = lunName; + public void setVolume(String volume) { + this.volume = volume; } public long getSize() { @@ -1749,41 +1617,38 @@ public void setSkipIfExisting(boolean skipIfExisting) { } public static class GetCapacityCmd extends AgentCommand { - private String logicalPoolName; + private String logicalPool; - public String getLogicalPoolName() { - return logicalPoolName; + public String getLogicalPool() { + return logicalPool; } - public void setLogicalPoolName(String logicalPoolName) { - this.logicalPoolName = logicalPoolName; + public void setLogicalPool(String logicalPool) { + this.logicalPool = logicalPool; } } public static class DeployClientCmd extends AgentCommand { - private String clientIp; - private String clientPassword; + private String ip; + private String password; - public String getClientIp() { - return clientIp; + public String getIp() { + return ip; } - public void setClientIp(String clientIp) { - this.clientIp = clientIp; + public void setIp(String ip) { + this.ip = ip; } - public String getClientPassword() { - return clientPassword; + public String getPassword() { + return password; } - public void setClientPassword(String clientPassword) { - this.clientPassword = clientPassword; + public void setPassword(String password) { + this.password = password; } } - public static class GetFactsCmd extends AgentCommand { - } - public static class AgentResponse extends ZbsMdsBase.AgentResponse { } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java index 1d6707119ed..24f25d28ae5 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java @@ -89,7 +89,7 @@ public void volumeSnapshotAfterCleanUpExtensionPoint(String volumeUuid, List volumeInstallPaths = snapshots.stream().map(s -> getVolumeInstallPathFromSnapshot(s.getPrimaryStorageInstallPath())) + Set volumeInstallPaths = snapshots.stream().map(s -> getVolumeFromSnapshotPath(s.getPrimaryStorageInstallPath())) .collect(Collectors.toSet()); if (volumeInstallPaths.isEmpty()) { return; diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index 6f095a93ad6..d0045b750c6 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -193,7 +193,7 @@ class ZbsPrimaryStorageCase extends SubCase { def cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.DeployClientCmd) ZbsStorageController.DeployClientRsp deployClientRsp = new ZbsStorageController.DeployClientRsp() - if (cmd.clientIp.equals("127.0.0.1")) { + if (cmd.ip.equals("127.0.0.1")) { deployClientRsp.success = false deployClientRsp.error = "on purpose" } @@ -226,12 +226,12 @@ class ZbsPrimaryStorageCase extends SubCase { def addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() - assert addonInfo == "{\"mdsInfos\":[{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.1\",\"mdsStatus\":\"Connected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.2\",\"mdsStatus\":\"Connected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.3\",\"mdsStatus\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" + assert addonInfo == "{\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" env.afterSimulator(ZbsPrimaryStorageMdsBase.PING_PATH) { rsp, HttpEntity e -> def cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) ZbsPrimaryStorageMdsBase.PingRsp pingRsp = new ZbsPrimaryStorageMdsBase.PingRsp() - if (cmd.mdsAddr.equals("127.0.1.1")) { + if (cmd.addr.equals("127.0.1.1")) { pingRsp.success = false pingRsp.error = "on purpose" } @@ -243,20 +243,20 @@ class ZbsPrimaryStorageCase extends SubCase { addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() - assert addonInfo == "{\"mdsInfos\":[{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.1\",\"mdsStatus\":\"Disconnected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.2\",\"mdsStatus\":\"Connected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.3\",\"mdsStatus\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" + assert addonInfo == "{\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" assert Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Connected env.afterSimulator(ZbsPrimaryStorageMdsBase.PING_PATH) { rsp, HttpEntity e -> def cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) ZbsPrimaryStorageMdsBase.PingRsp pingRsp = new ZbsPrimaryStorageMdsBase.PingRsp() - if (cmd.mdsAddr.equals("127.0.1.1")) { + if (cmd.addr.equals("127.0.1.1")) { pingRsp.success = false pingRsp.error = "on purpose" - } else if (cmd.mdsAddr.equals("127.0.1.2")) { + } else if (cmd.addr.equals("127.0.1.2")) { pingRsp.success = false pingRsp.error = "on purpose" - } else if (cmd.mdsAddr.equals("127.0.1.3")) { + } else if (cmd.addr.equals("127.0.1.3")) { pingRsp.success = false pingRsp.error = "on purpose" } @@ -268,7 +268,7 @@ class ZbsPrimaryStorageCase extends SubCase { addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() - assert addonInfo == "{\"mdsInfos\":[{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.1\",\"mdsStatus\":\"Disconnected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.2\",\"mdsStatus\":\"Disconnected\"},{\"sshUsername\":\"root\",\"sshPassword\":\"password\",\"sshPort\":22,\"mdsAddr\":\"127.0.1.3\",\"mdsStatus\":\"Disconnected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" + assert addonInfo == "{\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" assert Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Disconnected @@ -406,7 +406,7 @@ class ZbsPrimaryStorageCase extends SubCase { def specialPassword = "password123-`=[];,./~!@#\$%^&*()_+|{}:<>?" def mdsUri = "root:${specialPassword}@127.0.2.1" MdsUri uri = new MdsUri(mdsUri); - assert uri.sshPassword == specialPassword + assert uri.password == specialPassword } diff --git a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy index 51042670bed..e9f55807674 100644 --- a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy @@ -52,6 +52,13 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { return rsp } + simulator(ZbsPrimaryStorageMdsBase.SYNC_METADATA_PATH) { + ZbsPrimaryStorageMdsBase.SyncMetadataRsp rsp = new ZbsPrimaryStorageMdsBase.SyncMetadataRsp() + rsp.success = true + rsp.externalAddr = "127.0.0.1" + return rsp + } + simulator(ZbsStorageController.DEPLOY_CLIENT_PATH) { HttpEntity e, EnvSpec spec -> ZbsStorageController.DeployClientCmd cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.DeployClientCmd.class) ExternalPrimaryStorageSpec zspec = spec.specByUuid(cmd.uuid) @@ -86,7 +93,7 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { logicalPoolInfo.setRawUsedSize(968884224); logicalPoolInfo.setPhysicalPoolName("pool1"); logicalPoolInfo.setCapacity(579933831168); - logicalPoolInfo.setLogicalPoolName(cmd.logicalPoolName); + logicalPoolInfo.setLogicalPoolName(cmd.logicalPool); logicalPoolInfo.setUserPolicy("eyJwb2xpY3kiIDogMX0="); logicalPoolInfo.setAllocatedSize(3221225472); From 30dba6bfa21c1571e4b6dae4a22652d1bed9cc32 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Fri, 27 Jun 2025 15:39:26 +0800 Subject: [PATCH 432/737] [plugin]: introducing the mds update Resolves: ZSTAC-75947 Change-Id: I6d686971756f69736b626b6e70686c766b786572 (cherry picked from commit d9c4130fa38445d1e95f46169226b3204201bd47) --- .../src/main/java/org/zstack/cbd/MdsInfo.java | 19 +++ .../org/zstack/storage/zbs/ZbsMdsBase.java | 8 +- .../storage/zbs/ZbsPrimaryStorageMdsBase.java | 6 +- .../storage/zbs/ZbsStorageController.java | 118 +++++++++--------- .../addon/primary/ExternalPrimaryStorage.java | 24 ++++ .../addon/zbs/ZbsPrimaryStorageCase.groovy | 39 ++++++ 6 files changed, 148 insertions(+), 66 deletions(-) diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java b/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java index 5ca740b59ee..a41fff09303 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java @@ -1,5 +1,7 @@ package org.zstack.cbd; +import java.util.Objects; + /** * @author Xingwei Yu * @date 2024/4/10 23:18 @@ -12,6 +14,23 @@ public class MdsInfo { private String externalAddr; private MdsStatus status; + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + + MdsInfo other = (MdsInfo) obj; + return Objects.equals(addr, other.addr) && + Objects.equals(port, other.port) && + Objects.equals(username, other.username) && + Objects.equals(password, other.password); + } + + @Override + public int hashCode() { + return Objects.hash(addr, port, username, password); + } + public String getUsername() { return username; } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java index 64560b71770..3961191b710 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java @@ -44,24 +44,24 @@ public MdsInfo getSelf() { public abstract void ping(Completion completion); protected abstract String makeHttpPath(String ip, String path); - protected void checkTools() { + protected void checkSshAndTools() { Ssh ssh = new Ssh(); try { ssh.setHostname(self.getAddr()).setUsername(self.getUsername()).setPassword(self.getPassword()).setPort(self.getPort()) .checkTool("zbs").setTimeout(60).runErrorByExceptionAndClose(); } catch (SshException e) { - throw new OperationFailureException(operr("The problem may be caused by zbs-tool is missing on mds node.")); + throw new OperationFailureException(operr("failed to SSH or zbs-tools was not installed in MDS[%s], you need to check the SSH configuration and dependencies", self.getAddr())); } } - protected void checkHealth() { + protected void checkStorageHealth() { Ssh ssh = new Ssh(); SshResult ret = null; try { ret = ssh.setHostname(self.getAddr()).setUsername(self.getUsername()).setPassword(self.getPassword()).setPort(self.getPort()) .shell("zbs status mds --format json").setTimeout(60).runAndClose(); } catch (SshException e) { - throw new OperationFailureException(operr("The problem may be caused by zbs storage health issue.")); + throw new OperationFailureException(operr("failed to get MDS[%s] metadata, you need to check the ZBS configuration", self.getAddr())); } if (ret.getReturnCode() != 0) { diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java index 9f2dec0fbe0..bafd6ab4f4e 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java @@ -71,8 +71,8 @@ public void setup() { @Override public void run(FlowTrigger trigger, Map data) { - checkTools(); - checkHealth(); + checkSshAndTools(); + checkStorageHealth(); trigger.next(); } }); @@ -335,7 +335,7 @@ public void success(PingRsp rsp) { @Override public void fail(ErrorCode errorCode) { - logger.warn(String.format("ping zbs primary storage mds[%s] failed (%d/%d): %s", getSelf().getAddr(), step, MAX_PING_CNT, errorCode.toString())); + logger.warn(String.format("ping ZBS primary storage MDS[%s] failed (%d/%d): %s", getSelf().getAddr(), step, MAX_PING_CNT, errorCode.toString())); comp.addError(errorCode); if (step.equals(MAX_PING_CNT)) { diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 0065a1791e2..8fe20fc0a5a 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -16,9 +16,7 @@ import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; import org.zstack.header.HasThreadContext; -import org.zstack.header.core.Completion; -import org.zstack.header.core.ReturnValueCompletion; -import org.zstack.header.core.WhileDoneCompletion; +import org.zstack.header.core.*; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.ErrorCodeList; @@ -233,48 +231,32 @@ public String getIdentity() { @Override public void connect(String cfg, String url, ReturnValueCompletion completion) { - changeStatus(PrimaryStorageStatus.Connecting); - - reloadDbInfo(); - if (config.getLogicalPoolName().contains("/")) { - throw new CloudRuntimeException(String.format("invalid logical pool name[%s]", config.getLogicalPoolName())); - } - - List mdsInfos = new ArrayList<>(); - for (String mdsUrl : config.getMdsUrls()) { - MdsUri uri = new MdsUri(mdsUrl); - MdsInfo mdsInfo = new MdsInfo(); - mdsInfo.setUsername(uri.getUsername()); - mdsInfo.setPassword(uri.getPassword()); - mdsInfo.setPort(uri.getSshPort()); - mdsInfo.setAddr(uri.getHostname()); - mdsInfos.add(mdsInfo); - } - AddonInfo newAddonInfo = new AddonInfo(); + Config current = JSONObjectUtil.toObject(cfg, Config.class); + List mdsInfos = parseMdsInfos(current.getMdsUrls()); newAddonInfo.setMdsInfos(mdsInfos); - final List mds = CollectionUtils.transformToList(newAddonInfo.getMdsInfos(), + final List mdsList = CollectionUtils.transformToList(newAddonInfo.getMdsInfos(), ZbsPrimaryStorageMdsBase::new); class Connector { private final ErrorCodeList errorCodes = new ErrorCodeList(); - private final Iterator it = mds.iterator(); + private final Iterator it = mdsList.iterator(); void connect(final FlowTrigger trigger) { if (!it.hasNext()) { - if (errorCodes.getCauses().size() == mds.size()) { + if (errorCodes.getCauses().size() == mdsList.size()) { if (errorCodes.getCauses().isEmpty()) { - trigger.fail(operr("unable to connect to the zbs primary storage[uuid:%s]," + - " failed to connect all zbs mds", self.getUuid())); + trigger.fail(operr("unable to connect to the ZBS primary storage[uuid:%s]," + + " failed to connect all MDS", self.getUuid())); } else { - trigger.fail(operr(errorCodes, "unable to connect to the zbs primary storage[uuid:%s]," + - " failed to connect all zbs mds", + trigger.fail(operr(errorCodes, "unable to connect to the ZBS primary storage[uuid:%s]," + + " failed to connect all MDS", self.getUuid())); } } else { ExternalPrimaryStorageVO vo = dbf.reload(self); if (vo == null) { - trigger.fail(operr("zbs primary storage[uuid:%s] may have been deleted", self.getUuid())); + trigger.fail(operr("ZBS primary storage[uuid:%s] may have been deleted", self.getUuid())); } else { self = vo; trigger.next(); @@ -343,7 +325,7 @@ public void run(FlowTrigger trigger, Map data) { .findValue(); if (clientPassword == null) { - comp.addError(operr("failed to get client[uuid:%s] password.", h.getUuid())); + comp.addError(operr("failed to get ZBS client[uuid:%s] password.", h.getUuid())); } DeployClientCmd cmd = new DeployClientCmd(); @@ -379,7 +361,6 @@ public void done(ErrorCodeList errorCodeList) { done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { - changeStatus(PrimaryStorageStatus.Connected); configUrl(self.getUuid()); addonInfo = newAddonInfo; completion.success(JSONObjectUtil.rehashObject(newAddonInfo, LinkedHashMap.class)); @@ -389,7 +370,6 @@ public void handle(Map data) { error(new FlowErrorHandler(completion) { @Override public void handle(ErrorCode errCode, Map data) { - changeStatus(PrimaryStorageStatus.Disconnected); completion.fail(errCode); } }); @@ -429,7 +409,7 @@ public void done(ErrorCodeList errorCodeList) { .map(MdsInfo::getAddr) .collect(Collectors.joining(", ")); - completion.fail(operr("no MDS node is Connected, the following MDS nodes[%s] are not Connected.", notConnectedIps)); + completion.fail(operr("no MDS is Connected, the following MDS[%s] are not Connected.", notConnectedIps)); return; } completion.success(); @@ -824,7 +804,7 @@ public void unexport(ExportSpec espec, RemoteTarget remoteTarget, VolumeProtocol } if (remoteTarget == null || remoteTarget.getResourceURI() == null) { - logger.debug("remote target or the uri does not exist"); + logger.debug("remote target or the URI does not exist"); comp.success(); return; } @@ -847,7 +827,7 @@ public void fail(ErrorCode errorCode) { } }).setTargetMds(uri.getHost()).call(); } catch (URISyntaxException e) { - comp.fail(operr("Invalid URI syntax: %s", e.getMessage())); + comp.fail(operr("invalid URI syntax: %s", e.getMessage())); } } @@ -922,7 +902,35 @@ public void fail(ErrorCode errorCode) { @Override public void validateConfig(String config) { + Config old = JSONObjectUtil.toObject(self.getConfig(), Config.class); + Config current = JSONObjectUtil.toObject(config, Config.class); + + if (current.getLogicalPoolName().contains("/")) { + throw new CloudRuntimeException(String.format("invalid logical pool name[%s]", current.getLogicalPoolName())); + } + + if (current.getMdsUrls().isEmpty()) { + throw new OperationFailureException(operr("ensure at least one MDS is configured")); + } + + List newMdsInfos = parseMdsInfos(current.getMdsUrls()); + List duplicateMdsInfos = newMdsInfos.stream().collect(Collectors.groupingBy(MdsInfo::getAddr)) + .values().stream().filter(addr -> addr.size() > 1).flatMap(List::stream).collect(Collectors.toList()); + if (!duplicateMdsInfos.isEmpty()) { + throw new OperationFailureException(operr("do not allow to add duplicate MDS[%s]", + duplicateMdsInfos.stream().map(MdsInfo::getAddr).distinct().collect(Collectors.joining(", ")) + )); + } + List oldMdsInfos = parseMdsInfos(old.getMdsUrls()); + List changedMdsInfos = newMdsInfos.stream().filter(n -> oldMdsInfos.stream().noneMatch(o -> o.equals(n))).collect(Collectors.toList()); + if (!changedMdsInfos.isEmpty() && !CoreGlobalProperty.UNIT_TEST_ON) { + List mdsList = CollectionUtils.transformToList(changedMdsInfos, ZbsPrimaryStorageMdsBase::new); + for (ZbsPrimaryStorageMdsBase base : mdsList) { + base.checkSshAndTools(); + base.checkStorageHealth(); + } + } } @Override @@ -961,24 +969,16 @@ private void reloadDbInfo() { config = StringUtils.isEmpty(self.getConfig()) ? new Config() : JSONObjectUtil.toObject(self.getConfig(), Config.class); } - public void changeStatus(PrimaryStorageStatus status) { - String uuid = self.getUuid(); - self = dbf.reload(self); - if (self == null) { - throw new OperationFailureException(operr( - "cannot update status of the zbs primary storage[uuid:%s], it has been deleted." + - "This error can be ignored", uuid - )); - } - - if (self.getStatus() == status) { - return; - } - - PrimaryStorageStatus oldStatus = self.getStatus(); - self.setStatus(status); - self = dbf.updateAndRefresh(self); - logger.debug(String.format("zbs primary storage[uuid:%s] changed status from %s to %s", self.getUuid(), oldStatus, status)); + private List parseMdsInfos(List mdsUrls) { + return mdsUrls.stream().map(mdsUrl -> { + MdsUri uri = new MdsUri(mdsUrl); + MdsInfo mdsInfo = new MdsInfo(); + mdsInfo.setUsername(uri.getUsername()); + mdsInfo.setPassword(uri.getPassword()); + mdsInfo.setPort(uri.getSshPort()); + mdsInfo.setAddr(uri.getHostname()); + return mdsInfo; + }).collect(Collectors.toList()); } protected void httpCall(final String path, final AgentCommand cmd, final Class retClass, final ReturnValueCompletion callback) { @@ -1024,12 +1024,12 @@ public void call() { } HttpCaller setTargetMds(String mdsAddr) { - logger.debug(String.format("target mds[ip:%s]", mdsAddr)); + logger.debug(String.format("target MDS[%s]", mdsAddr)); mdsInfos.removeIf(it -> !it.getAddr().equals(mdsAddr)); if (mdsInfos.isEmpty()) { throw new OperationFailureException(operr( - "not found mds[ip:%s] of zbs primary storage[uuid:%s] node", mdsAddr, self.getUuid()) + "not found MDS[%s] of zbs primary storage[uuid:%s] node", mdsAddr, self.getUuid()) ); } @@ -1048,7 +1048,7 @@ private List prepareMds() { mds.removeIf(it -> it.getStatus() != MdsStatus.Connected); if (mds.isEmpty()) { throw new OperationFailureException(operr( - "all zbs mds of primary storage[uuid:%s] are not in Connected state", self.getUuid()) + "all MDS of ZBS primary storage[uuid:%s] are not in Connected state", self.getUuid()) ); } @@ -1061,7 +1061,7 @@ private void prepareMdsIterator() { private void doCall() { if (!it.hasNext()) { - callback.fail(operr(errorCodes, "all mds cannot execute http call[%s]", path)); + callback.fail(operr(errorCodes, "all MDS cannot execute http call[%s]", path)); return; } @@ -1077,8 +1077,8 @@ public void success(T ret) { @Override public void fail(ErrorCode errorCode) { if (!errorCode.isError(SysErrors.OPERATION_ERROR) && !errorCode.isError(SysErrors.TIMEOUT)) { - logger.warn(String.format("mds[addr:%s] failed to execute http call[%s], error is: %s", - base.getSelf().getAddr(), path, JSONObjectUtil.toJsonString(errorCode))); + logger.warn(String.format("failed to execute http call[%s] on MDS[%s], error is: %s", + path, base.getSelf().getAddr(), JSONObjectUtil.toJsonString(errorCode))); errorCodes.getCauses().add(errorCode); doCall(); return; diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index e764f8d28f5..c808573cc5a 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -179,11 +179,34 @@ private void handle(APIUpdateExternalPrimaryStorageMsg msg) { if (msg.getDefaultProtocol() != null) { externalVO.setDefaultProtocol(msg.getDefaultProtocol()); } + boolean needReconnect = false; if (msg.getConfig() != null) { controller.validateConfig(msg.getConfig()); externalVO.setConfig(msg.getConfig()); + needReconnect = true; } externalVO = dbf.updateAndRefresh(externalVO); + + if (needReconnect) { + ReconnectPrimaryStorageMsg rmsg = new ReconnectPrimaryStorageMsg(); + rmsg.setPrimaryStorageUuid(externalVO.getUuid()); + bus.makeTargetServiceIdByResourceUuid(rmsg, PrimaryStorageConstant.SERVICE_ID, rmsg.getPrimaryStorageUuid()); + bus.send(rmsg, new CloudBusCallBack(msg) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + evt.setError(reply.getError()); + } else { + self = dbf.reload(self); + evt.setInventory(externalVO.toInventory()); + } + + bus.publish(evt); + } + }); + return; + } + evt.setInventory(externalVO.toInventory()); bus.publish(evt); } @@ -1900,6 +1923,7 @@ protected void handle(CheckVolumeSnapshotOperationOnPrimaryStorageMsg msg) { @Override protected void connectHook(ConnectParam param, Completion completion) { + controller.validateConfig(externalVO.getConfig()); controller.connect(externalVO.getConfig(), self.getUrl(), new ReturnValueCompletion(completion) { @Override public void success(LinkedHashMap addonInfo) { diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index d0045b750c6..e7a8ba5b6ca 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -148,6 +148,7 @@ class ZbsPrimaryStorageCase extends SubCase { diskOffering = env.inventoryByName("diskOffering") as DiskOfferingInventory testDefaultConfig() + testUpdateExternalPrimaryStorage() testLifecycle() testDataVolumeLifecycle() testMdsPing() @@ -157,6 +158,44 @@ class ZbsPrimaryStorageCase extends SubCase { } } + void testUpdateExternalPrimaryStorage() { + expect(AssertionError.class) { + updateExternalPrimaryStorage { + uuid = ps.uuid + config = "{\"mdsUrls\":[],\"logicalPoolName\":\"lpool1\"}" + } + } + + expect(AssertionError.class) { + updateExternalPrimaryStorage { + uuid = ps.uuid + config = "{\"mdsUrls\":[\"root:password@127.0.1.1\",\"root:password@127.0.1.1\"],\"logicalPoolName\":\"lpool1\"}" + } + } + + updateExternalPrimaryStorage { + uuid = ps.uuid + config = "{\"mdsUrls\":[\"root:password@127.0.1.1\",\"root:password@127.0.1.2\"],\"logicalPoolName\":\"lpool1\"}" + } + + String addonInfo = Q.New(ExternalPrimaryStorageVO.class) + .select(ExternalPrimaryStorageVO_.addonInfo) + .eq(ExternalPrimaryStorageVO_.uuid, ps.uuid) + .findValue() + assert !addonInfo.contains("127.0.1.3") + + updateExternalPrimaryStorage { + uuid = ps.uuid + config = "{\"mdsUrls\":[\"root:password@127.0.1.1\",\"root:password@127.0.1.2\",\"root:password@127.0.1.3\"],\"logicalPoolName\":\"lpool1\"}" + } + + addonInfo = Q.New(ExternalPrimaryStorageVO.class) + .select(ExternalPrimaryStorageVO_.addonInfo) + .eq(ExternalPrimaryStorageVO_.uuid, ps.uuid) + .findValue() + assert addonInfo.contains("127.0.1.3") + } + void testDefaultConfig() { def rc = getResourceConfig { category = VolumeGlobalConfig.CATEGORY From e5e18f12667d6f05f36261fbbbb3f2ee2d971a99 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Fri, 1 Aug 2025 13:31:19 +0800 Subject: [PATCH 433/737] [plugin]: support to modify ssh port of ansible runner Resolves: ZSTAC-76535 Change-Id: I6e7a696e6566726c6f716f726962786f66616668 (cherry picked from commit edf4758473938c49e28fcbbb8fa9961192889923) --- .../storage/zbs/ZbsPrimaryStorageMdsBase.java | 1 + .../storage/zbs/ZbsStorageController.java | 38 +++++++++++-------- .../addon/zbs/ZbsPrimaryStorageCase.groovy | 11 ++++++ 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java index bafd6ab4f4e..4e9f817c8a7 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java @@ -117,6 +117,7 @@ public void run(FlowTrigger trigger, Map data) { runner.installChecker(callBackChecker); runner.setUsername(getSelf().getUsername()); runner.setPassword(getSelf().getPassword()); + runner.setSshPort(getSelf().getPort()); runner.setTargetIp(getSelf().getAddr()); runner.setTargetUuid(getSelf().getAddr()); runner.setAgentPort(ZbsGlobalProperty.PRIMARY_STORAGE_AGENT_PORT); diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 8fe20fc0a5a..9cde9fb7a8e 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -159,15 +159,16 @@ public List getActiveVolumesLocation(HostInventory h) { @Override public void deployClient(HostInventory h, Completion comp) { - String clientPassword = Q.New(KVMHostVO.class).select(KVMHostVO_.password).eq(KVMHostVO_.uuid, h.getUuid()).findValue(); - if (clientPassword == null) { - comp.fail(operr("failed to get client[uuid:%s] password", h.getUuid())); + KVMHostVO host = Q.New(KVMHostVO.class).eq(KVMHostVO_.uuid, h.getUuid()).find(); + if (host == null) { + comp.fail(operr("cannot found kvm host[uuid:%s], unable to deploy client", h.getUuid())); + return; } DeployClientCmd cmd = new DeployClientCmd(); cmd.setIp(h.getManagementIp()); - cmd.setPassword(clientPassword); - + cmd.setPassword(host.getPassword()); + cmd.setPort(host.getPort()); httpCall(DEPLOY_CLIENT_PATH, cmd, DeployClientRsp.class, new ReturnValueCompletion(comp) { @Override public void success(DeployClientRsp returnValue) { @@ -319,19 +320,17 @@ public void run(FlowTrigger trigger, Map data) { .list(); new While<>(hosts).each((h, comp) -> { - String clientPassword = Q.New(KVMHostVO.class) - .select(KVMHostVO_.password) - .eq(KVMHostVO_.uuid, h.getUuid()) - .findValue(); - - if (clientPassword == null) { - comp.addError(operr("failed to get ZBS client[uuid:%s] password.", h.getUuid())); + KVMHostVO host = Q.New(KVMHostVO.class).eq(KVMHostVO_.uuid, h.getUuid()).find(); + if (host == null) { + comp.addError(operr("cannot found kvm host[uuid:%s], unable to deploy client", h.getUuid())); + comp.allDone(); + return; } DeployClientCmd cmd = new DeployClientCmd(); cmd.setIp(h.getManagementIp()); - cmd.setPassword(clientPassword); - + cmd.setPassword(host.getPassword()); + cmd.setPort(host.getPort()); httpCall(DEPLOY_CLIENT_PATH, cmd, DeployClientRsp.class, new ReturnValueCompletion(comp) { @Override public void success(DeployClientRsp returnValue) { @@ -341,7 +340,7 @@ public void success(DeployClientRsp returnValue) { @Override public void fail(ErrorCode errorCode) { comp.addError(errorCode); - comp.done(); + comp.allDone(); } }); }).run(new WhileDoneCompletion(trigger) { @@ -1631,6 +1630,7 @@ public void setLogicalPool(String logicalPool) { public static class DeployClientCmd extends AgentCommand { private String ip; private String password; + private Integer port; public String getIp() { return ip; @@ -1647,6 +1647,14 @@ public String getPassword() { public void setPassword(String password) { this.password = password; } + + public Integer getPort() { + return port; + } + + public void setPort(Integer port) { + this.port = port; + } } public static class AgentResponse extends ZbsMdsBase.AgentResponse { diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index e7a8ba5b6ca..a79979b9ee3 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -184,6 +184,17 @@ class ZbsPrimaryStorageCase extends SubCase { .findValue() assert !addonInfo.contains("127.0.1.3") + updateExternalPrimaryStorage { + uuid = ps.uuid + config = "{\"mdsUrls\":[\"root:password@127.0.1.1:33\",\"root:password@127.0.1.2\"],\"logicalPoolName\":\"lpool1\"}" + } + + addonInfo = Q.New(ExternalPrimaryStorageVO.class) + .select(ExternalPrimaryStorageVO_.addonInfo) + .eq(ExternalPrimaryStorageVO_.uuid, ps.uuid) + .findValue() + assert addonInfo.contains("\"port\":33,\"addr\":\"127.0.1.1\"") + updateExternalPrimaryStorage { uuid = ps.uuid config = "{\"mdsUrls\":[\"root:password@127.0.1.1\",\"root:password@127.0.1.2\",\"root:password@127.0.1.3\"],\"logicalPoolName\":\"lpool1\"}" From 89057016d18843dbe3612dc8bfe0e78303926249 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Wed, 6 Aug 2025 15:03:39 +0800 Subject: [PATCH 434/737] [plugin]: introducing check host storage connection for zbs primary storage Resolves: ZSTAC-76593 Change-Id: I6575776f6f66696b76706a6d6963757a6662746e (cherry picked from commit 6236ff54a2574faf729ea23962607af706d1487a) --- .../org/zstack/storage/zbs/ZbsHelper.java | 4 ++ .../storage/zbs/ZbsStorageController.java | 58 ++++++++++++++++--- .../addon/zbs/ZbsPrimaryStorageCase.groovy | 45 ++++++++++++++ .../testlib/ExternalPrimaryStorageSpec.groovy | 8 +++ 4 files changed, 106 insertions(+), 9 deletions(-) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java index 6dd1b0251a2..b6b1b03397b 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java @@ -17,6 +17,10 @@ public static void configUrl(String psUuid) { } } + public static String buildHeartbeatVolumePath(String logicalPool) { + return String.format("cbd:%s_physical/%s/%s", logicalPool, logicalPool, ZbsConstants.ZBS_HEARTBEAT_VOLUME_NAME); + } + public static String buildVolumePath(String physicalPool, String logicalPool, String volId) { String base = volId.replace("-", ""); return String.format(ZbsConstants.ZBS_CBD_LUN_PATH_FORMAT, physicalPool, logicalPool, base); diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 9cde9fb7a8e..e152407979f 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -10,6 +10,8 @@ import org.zstack.compute.host.HostGlobalConfig; import org.zstack.core.CoreGlobalProperty; import org.zstack.core.asyncbatch.While; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.core.db.SQL; @@ -24,9 +26,11 @@ import org.zstack.header.errorcode.SysErrors; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.host.HostAO_; +import org.zstack.header.host.HostConstant; import org.zstack.header.host.HostInventory; import org.zstack.header.host.HostVO; import org.zstack.header.image.ImageConstant; +import org.zstack.header.message.MessageReply; import org.zstack.header.rest.RESTFacade; import org.zstack.header.storage.addon.*; import org.zstack.header.storage.addon.primary.*; @@ -35,6 +39,7 @@ import org.zstack.header.volume.VolumeConstant; import org.zstack.header.volume.VolumeProtocol; import org.zstack.header.volume.VolumeStats; +import org.zstack.kvm.KVMHostAsyncHttpCallMsg; import org.zstack.kvm.KVMHostVO; import org.zstack.kvm.KVMHostVO_; import org.zstack.resourceconfig.ResourceConfig; @@ -69,6 +74,8 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar protected RESTFacade restf; @Autowired private ResourceConfigFacade rcf; + @Autowired + private CloudBus bus; private ExternalPrimaryStorageVO self; private AddonInfo addonInfo; @@ -89,6 +96,7 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar public static final String CREATE_SNAPSHOT_PATH = "/zbs/primarystorage/snapshot/create"; public static final String DELETE_SNAPSHOT_PATH = "/zbs/primarystorage/snapshot/delete"; public static final String ROLLBACK_SNAPSHOT_PATH = "/zbs/primarystorage/snapshot/rollback"; + public static final String CHECK_HOST_STORAGE_CONNECTION_PATH = "/zbs/primarystorage/check/host/connection"; private static final StorageCapabilities capabilities = new StorageCapabilities(); @@ -217,11 +225,11 @@ public void deactivateHeartbeatVolume(HostInventory h, Completion comp) { public HeartbeatVolumeTO getHeartbeatVolumeActiveInfo(HostInventory h) { reloadDbInfo(); - // FIXME: hard code for install path CbdHeartbeatVolumeTO to = new CbdHeartbeatVolumeTO(); - to.setInstallPath(String.format("cbd:%s_physical/%s/%s", config.getLogicalPoolName(), config.getLogicalPoolName(), ZbsConstants.ZBS_HEARTBEAT_VOLUME_NAME)); + to.setInstallPath(buildHeartbeatVolumePath(config.getLogicalPoolName())); to.setHeartbeatRequiredSpace(SizeUnit.MEGABYTE.toByte(1)); to.setCoveringPaths(Collections.singletonList(config.getLogicalPoolName())); + return to; } @@ -457,14 +465,24 @@ public void reportHealthy(ReturnValueCompletion comp) { @Override public void reportNodeHealthy(HostInventory host, ReturnValueCompletion comp) { - NodeHealthy healthy = new NodeHealthy(); - - Arrays.asList(VolumeProtocol.CBD).forEach(it -> { - // TODO: CHECK_HOST_STORAGE_CONNECTION_PATH - healthy.setHealthy(it, StorageHealthy.Ok); + CheckHostStorageConnectionCmd cmd = new CheckHostStorageConnectionCmd(); + cmd.setHostUuid(host.getUuid()); + cmd.setPath(buildHeartbeatVolumePath(config.getLogicalPoolName())); + + KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); + msg.setCommand(cmd); + msg.setHostUuid(host.getUuid()); + msg.setPath(CHECK_HOST_STORAGE_CONNECTION_PATH); + msg.setNoStatusCheck(true); + bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, msg.getHostUuid()); + bus.send(msg, new CloudBusCallBack(comp) { + @Override + public void run(MessageReply reply) { + NodeHealthy healthy = new NodeHealthy(); + healthy.setHealthy(VolumeProtocol.CBD, reply.isSuccess() ? StorageHealthy.Ok : StorageHealthy.Failed); + comp.success(healthy); + } }); - - comp.success(healthy); } @Override @@ -1657,6 +1675,28 @@ public void setPort(Integer port) { } } + public static class CheckHostStorageConnectionCmd { + public String hostUuid; + private String path; + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + } + + public static class AgentResponse extends ZbsMdsBase.AgentResponse { } diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index a79979b9ee3..e9fdf94f996 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -4,10 +4,14 @@ import org.springframework.http.HttpEntity import org.zstack.core.db.Q import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO_ +import org.zstack.header.storage.primary.PrimaryStorageHostRefVO +import org.zstack.header.storage.primary.PrimaryStorageHostRefVO_ import org.zstack.header.storage.primary.PrimaryStorageStatus import org.zstack.cbd.MdsUri +import org.zstack.kvm.KVMAgentCommands import org.zstack.sdk.* import org.zstack.storage.primary.PrimaryStorageGlobalConfig +import org.zstack.header.storage.primary.PrimaryStorageHostStatus import org.zstack.storage.volume.VolumeGlobalConfig import org.zstack.storage.zbs.ZbsConstants import org.zstack.storage.zbs.ZbsPrimaryStorageMdsBase @@ -30,6 +34,7 @@ class ZbsPrimaryStorageCase extends SubCase { PrimaryStorageInventory ps DiskOfferingInventory diskOffering VolumeInventory vol, vol2 + KVMHostInventory kvm @Override void clean() { @@ -146,18 +151,58 @@ class ZbsPrimaryStorageCase extends SubCase { cluster = env.inventoryByName("cluster") as ClusterInventory ps = env.inventoryByName("zbs-1") as PrimaryStorageInventory diskOffering = env.inventoryByName("diskOffering") as DiskOfferingInventory + kvm = env.inventoryByName("kvm-1") as KVMHostInventory testDefaultConfig() testUpdateExternalPrimaryStorage() testLifecycle() testDataVolumeLifecycle() testMdsPing() + testCheckHostStorageConnection() testNegativeScenario() testDataVolumeNegativeScenario() testDecodeMdsUriWithSpecialPassword() } } + void testCheckHostStorageConnection() { + attachPrimaryStorageToCluster { + primaryStorageUuid = ps.uuid + clusterUuid = cluster.uuid + } + + env.afterSimulator(ZbsStorageController.CHECK_HOST_STORAGE_CONNECTION_PATH) { rsp, HttpEntity e -> + ZbsStorageController.CheckHostStorageConnectionCmd cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.CheckHostStorageConnectionCmd) + + if (cmd.hostUuid == kvm.getUuid()) { + throw new HttpError(404, "on purpose") + } + + return new KVMAgentCommands.AgentResponse() + } + + expect(AssertionError.class) { + reconnectHost { + uuid = kvm.getUuid() + } + } + + retryInSecs { + assert Q.New(PrimaryStorageHostRefVO.class) + .eq(PrimaryStorageHostRefVO_.primaryStorageUuid, ps.uuid) + .eq(PrimaryStorageHostRefVO_.hostUuid, kvm.getUuid()) + .eq(PrimaryStorageHostRefVO_.status, PrimaryStorageHostStatus.Disconnected) + .count() == 1 + } + + env.cleanSimulatorAndMessageHandlers() + + detachPrimaryStorageFromCluster { + primaryStorageUuid = ps.uuid + clusterUuid = cluster.uuid + } + } + void testUpdateExternalPrimaryStorage() { expect(AssertionError.class) { updateExternalPrimaryStorage { diff --git a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy index e9f55807674..640bef0c4e8 100644 --- a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy @@ -3,6 +3,7 @@ package org.zstack.testlib import org.springframework.http.HttpEntity import org.zstack.cbd.LogicalPoolInfo import org.zstack.cbd.kvm.KvmCbdCommands +import org.zstack.kvm.KVMAgentCommands import org.zstack.sdk.PrimaryStorageInventory import org.zstack.storage.zbs.ZbsPrimaryStorageMdsBase import org.zstack.storage.zbs.ZbsStorageController @@ -70,6 +71,13 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { return rsp } + simulator(ZbsStorageController.CHECK_HOST_STORAGE_CONNECTION_PATH) { HttpEntity e -> + ZbsStorageController.CheckHostStorageConnectionCmd cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.CheckHostStorageConnectionCmd) + assert cmd.hostUuid != null + + return new KVMAgentCommands.AgentResponse() + } + simulator(ZbsStorageController.GET_CAPACITY_PATH) { HttpEntity e, EnvSpec spec -> ZbsStorageController.GetCapacityCmd cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.GetCapacityCmd.class) ExternalPrimaryStorageSpec zspec = spec.specByUuid(cmd.uuid) From d54b82eadf0425d2466b7ea5332f14687558583e Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Wed, 13 Aug 2025 11:37:44 +0800 Subject: [PATCH 435/737] [plugin]: add check host storage connection response Resolves: ZSTAC-76593 Change-Id: I71726466706c68796566726e7179786e73766274 (cherry picked from commit fbc19a4a6b2c4c19523e06efabdb87791911037f) --- .../java/org/zstack/storage/zbs/ZbsMdsBase.java | 2 -- .../zstack/storage/zbs/ZbsStorageController.java | 14 ++++++++++++-- .../primary/addon/zbs/ZbsPrimaryStorageCase.groovy | 8 ++++---- .../testlib/ExternalPrimaryStorageSpec.groovy | 5 ++++- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java index 3961191b710..d9281d03fe2 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java @@ -111,7 +111,6 @@ public Class getReturnClass() { public static class AgentResponse { private String error; - @Deprecated private boolean success = true; public String getError() { @@ -123,7 +122,6 @@ public void setError(String error) { this.error = error; } - @Deprecated public boolean isSuccess() { return success; } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index e152407979f..85ee19dcc0b 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -40,6 +40,7 @@ import org.zstack.header.volume.VolumeProtocol; import org.zstack.header.volume.VolumeStats; import org.zstack.kvm.KVMHostAsyncHttpCallMsg; +import org.zstack.kvm.KVMHostAsyncHttpCallReply; import org.zstack.kvm.KVMHostVO; import org.zstack.kvm.KVMHostVO_; import org.zstack.resourceconfig.ResourceConfig; @@ -478,8 +479,15 @@ public void reportNodeHealthy(HostInventory host, ReturnValueCompletion e -> ZbsStorageController.CheckHostStorageConnectionCmd cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.CheckHostStorageConnectionCmd) - if (cmd.hostUuid == kvm.getUuid()) { - throw new HttpError(404, "on purpose") - } + ZbsStorageController.CheckHostStorageConnectionRsp checkHostStorageConnectionRsp = new ZbsStorageController.CheckHostStorageConnectionRsp() + checkHostStorageConnectionRsp.error = "fake error" + checkHostStorageConnectionRsp.success = false - return new KVMAgentCommands.AgentResponse() + return checkHostStorageConnectionRsp } expect(AssertionError.class) { diff --git a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy index 640bef0c4e8..aa93b76d1a4 100644 --- a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy @@ -75,7 +75,10 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { ZbsStorageController.CheckHostStorageConnectionCmd cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.CheckHostStorageConnectionCmd) assert cmd.hostUuid != null - return new KVMAgentCommands.AgentResponse() + def rsp = new ZbsStorageController.CheckHostStorageConnectionRsp() + rsp.success = true + + return rsp } simulator(ZbsStorageController.GET_CAPACITY_PATH) { HttpEntity e, EnvSpec spec -> From 03ffab4504573ea7df5c359c5f6cfc8017a4b243 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Thu, 7 Aug 2025 18:17:25 +0800 Subject: [PATCH 436/737] [plugin]: update size unit Resolves: ZSTAC-67398 Change-Id: I687465656d7677747a6c6466616f65626e747764 (cherry picked from commit 8c849b009b0cfe8deeb0b3639dde6508bf13a59a) --- .../main/java/org/zstack/cbd/AddonInfo.java | 9 ++ .../main/java/org/zstack/cbd/ClusterInfo.java | 17 ++++ .../org/zstack/storage/zbs/ZbsConstants.java | 3 + .../org/zstack/storage/zbs/ZbsHelper.java | 10 +++ .../storage/zbs/ZbsStorageController.java | 90 ++++++++++++++----- .../addon/zbs/ZbsPrimaryStorageCase.groovy | 14 +-- .../testlib/ExternalPrimaryStorageSpec.groovy | 12 +++ 7 files changed, 127 insertions(+), 28 deletions(-) create mode 100644 plugin/cbd/src/main/java/org/zstack/cbd/ClusterInfo.java diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/AddonInfo.java b/plugin/cbd/src/main/java/org/zstack/cbd/AddonInfo.java index dab817ba94d..c08f5c37c66 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/AddonInfo.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/AddonInfo.java @@ -8,9 +8,18 @@ * @date 2024/4/1 18:12 */ public class AddonInfo { + private ClusterInfo clusterInfo; private List mdsInfos = new ArrayList<>(); private List logicalPoolInfos = new ArrayList<>(); + public ClusterInfo getClusterInfo() { + return clusterInfo; + } + + public void setClusterInfo(ClusterInfo clusterInfo) { + this.clusterInfo = clusterInfo; + } + public List getMdsInfos() { return mdsInfos; } diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/ClusterInfo.java b/plugin/cbd/src/main/java/org/zstack/cbd/ClusterInfo.java new file mode 100644 index 00000000000..5ddfec01d52 --- /dev/null +++ b/plugin/cbd/src/main/java/org/zstack/cbd/ClusterInfo.java @@ -0,0 +1,17 @@ +package org.zstack.cbd; + +/** + * @author Xingwei Yu + * @date 2025/8/8 14:03 + */ +public class ClusterInfo { + private String version; + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } +} diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java index 3e04e2bd924..626cbbfb75e 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java @@ -16,4 +16,7 @@ public interface ZbsConstants { String ZBS_CBD_PREFIX_SCHEME = "cbd://"; Integer PRIMARY_STORAGE_MDS_MAXIMUM_PING_FAILURE = 3; String VOLUME_PHYSICAL_BLOCK_SIZE = "4096"; + String MEGABYTE_SUPPORTED_VERSION = "1.6.1"; + String MEGABYTE_UNIT = "M"; + String GIGABYTE_UNIT = "G"; } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java index b6b1b03397b..dcd6ccb47d8 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java @@ -4,6 +4,8 @@ import org.zstack.core.db.SQL; import org.zstack.header.storage.primary.PrimaryStorageVO; import org.zstack.header.storage.primary.PrimaryStorageVO_; +import org.zstack.utils.VersionComparator; +import org.zstack.utils.data.SizeUnit; /** * @author Xingwei Yu @@ -29,4 +31,12 @@ public static String buildVolumePath(String physicalPool, String logicalPool, St public static String getVolumeFromSnapshotPath(String path) { return path.split("@")[0]; } + + public static String getSizeUnit(String version) { + return new VersionComparator(version.split("-")[0]).compare(ZbsConstants.MEGABYTE_SUPPORTED_VERSION) >= 0 ? ZbsConstants.MEGABYTE_UNIT : ZbsConstants.GIGABYTE_UNIT; + } + + public static long alignSizeTo(long size, String unit) { + return ZbsConstants.MEGABYTE_UNIT.equals(unit) ? (long) Math.ceil(SizeUnit.BYTE.toMegaByte((double) size)) : (long) Math.ceil(SizeUnit.BYTE.toGigaByte((double) size)); + } } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 85ee19dcc0b..7f221b9964a 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -84,6 +84,7 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar public static final String DEPLOY_CLIENT_PATH = "/zbs/primarystorage/client/deploy"; public static final String GET_CAPACITY_PATH = "/zbs/primarystorage/capacity"; + public static final String GET_FACTS_PATH = "/zbs/primarystorage/facts"; public static final String COPY_PATH = "/zbs/primarystorage/copy"; public static final String CREATE_VOLUME_PATH = "/zbs/primarystorage/volume/create"; public static final String DELETE_VOLUME_PATH = "/zbs/primarystorage/volume/delete"; @@ -306,6 +307,28 @@ public void run(FlowTrigger trigger, Map data) { } }); + flow(new NoRollbackFlow() { + String __name__ = "get-facts"; + + @Override + public void run(FlowTrigger trigger, Map data) { + httpCall(GET_FACTS_PATH, new GetFactsCmd(), GetFactsRsp.class, new ReturnValueCompletion(trigger) { + @Override + public void success(GetFactsRsp returnValue) { + ClusterInfo info = new ClusterInfo(); + info.setVersion(returnValue.getVersion()); + newAddonInfo.setClusterInfo(info); + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + flow(new NoRollbackFlow() { String __name__ = "deploy-client"; @@ -532,7 +555,8 @@ public void createVolume(CreateVolumeSpec v, ReturnValueCompletion CreateVolumeCmd cmd = new CreateVolumeCmd(); cmd.setLogicalPool(config.getLogicalPoolName()); cmd.setVolume(v.getName()); - cmd.setSize((long)Math.ceil(SizeUnit.BYTE.toGigaByte((double)v.getSize()))); + cmd.setUnit(getSizeUnit(addonInfo.getClusterInfo().getVersion())); + cmd.setSize(alignSizeTo(v.getSize(), cmd.getUnit())); cmd.setSkipIfExisting(true); httpCall(CREATE_VOLUME_PATH, cmd, CreateVolumeRsp.class, new ReturnValueCompletion(comp) { @@ -617,7 +641,8 @@ public boolean skip(Map data) { public void run(FlowTrigger trigger, Map data) { ExpandVolumeCmd cmd = new ExpandVolumeCmd(); cmd.setPath(stats.getInstallPath()); - cmd.setSize(SizeUnit.BYTE.toGigaByte(dst.getSize())); + cmd.setUnit(getSizeUnit(addonInfo.getClusterInfo().getVersion())); + cmd.setSize(alignSizeTo(dst.getSize(), cmd.getUnit())); httpCall(EXPAND_VOLUME_PATH, cmd, ExpandVolumeRsp.class, new ReturnValueCompletion(trigger) { @Override @@ -753,7 +778,8 @@ public void fail(ErrorCode errorCode) { public void expandVolume(String installPath, long size, ReturnValueCompletion comp) { ExpandVolumeCmd cmd = new ExpandVolumeCmd(); cmd.setPath(installPath); - cmd.setSize(SizeUnit.BYTE.toGigaByte(size)); + cmd.setUnit(getSizeUnit(addonInfo.getClusterInfo().getVersion())); + cmd.setSize(alignSizeTo(size, cmd.getUnit())); httpCall(EXPAND_VOLUME_PATH, cmd, ExpandVolumeRsp.class, new ReturnValueCompletion(comp) { @Override @@ -1377,9 +1403,8 @@ public static class DeployClientRsp extends AgentResponse { } - public static class ExpandVolumeCmd extends AgentCommand { + public static class ExpandVolumeCmd extends SizeCmd { private String path; - private long size; public String getPath() { return path; @@ -1388,14 +1413,6 @@ public String getPath() { public void setPath(String path) { this.path = path; } - - public long getSize() { - return size; - } - - public void setSize(long size) { - this.size = size; - } } public static class CopyCmd extends AgentCommand implements HasThreadContext { @@ -1602,10 +1619,30 @@ public void setForce(boolean force) { } } - public static class CreateVolumeCmd extends AgentCommand { + public static class SizeCmd extends AgentCommand { + private long size; + private String unit; + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + } + + public static class CreateVolumeCmd extends SizeCmd { private String logicalPool; private String volume; - private long size = 1L; private boolean skipIfExisting; public String getLogicalPool() { @@ -1624,14 +1661,6 @@ public void setVolume(String volume) { this.volume = volume; } - public long getSize() { - return size; - } - - public void setSize(long size) { - this.size = size; - } - public boolean isSkipIfExisting() { return skipIfExisting; } @@ -1683,6 +1712,21 @@ public void setPort(Integer port) { } } + public static class GetFactsRsp extends AgentResponse { + private String version; + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } + + public static class GetFactsCmd extends AgentCommand { + } + public static class CheckHostStorageConnectionCmd extends AgentCommand { public String hostUuid; private String path; diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index 421fecf1652..e2dd2d11483 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -321,7 +321,7 @@ class ZbsPrimaryStorageCase extends SubCase { def addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() - assert addonInfo == "{\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" + assert addonInfo == "{\"clusterInfo\":{\"version\":\"1.6.1-for-test\"},\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" env.afterSimulator(ZbsPrimaryStorageMdsBase.PING_PATH) { rsp, HttpEntity e -> def cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) @@ -338,7 +338,7 @@ class ZbsPrimaryStorageCase extends SubCase { addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() - assert addonInfo == "{\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" + assert addonInfo == "{\"clusterInfo\":{\"version\":\"1.6.1-for-test\"},\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" assert Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Connected @@ -363,14 +363,18 @@ class ZbsPrimaryStorageCase extends SubCase { addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() - assert addonInfo == "{\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" + assert addonInfo == "{\"clusterInfo\":{\"version\":\"1.6.1-for-test\"},\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" assert Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Disconnected env.cleanAfterSimulatorHandlers() - reconnectPrimaryStorage { - uuid = ps.uuid + sleep(2000) + + retryInSecs { + reconnectPrimaryStorage { + uuid = ps.uuid + } } Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Connected diff --git a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy index aa93b76d1a4..4424e921634 100644 --- a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy @@ -71,6 +71,18 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { return rsp } + simulator(ZbsStorageController.GET_FACTS_PATH) { HttpEntity e, EnvSpec spec -> + ZbsStorageController.GetFactsCmd cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.GetFactsCmd.class) + ExternalPrimaryStorageSpec zspec = spec.specByUuid(cmd.uuid) + assert zspec != null: "cannot found zbs primary storage[uuid:${cmd.uuid}], check your environment()." + + def rsp = new ZbsStorageController.GetFactsRsp() + rsp.version = "1.6.1-for-test" + rsp.success = true + + return rsp + } + simulator(ZbsStorageController.CHECK_HOST_STORAGE_CONNECTION_PATH) { HttpEntity e -> ZbsStorageController.CheckHostStorageConnectionCmd cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.CheckHostStorageConnectionCmd) assert cmd.hostUuid != null From 3b8a172d3d927a868c34188185484f7a0ff19394 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Tue, 12 Aug 2025 14:45:59 +0800 Subject: [PATCH 437/737] [plugin]: add resize volume extension point Resolves: ZSTAC-76396 Change-Id: I6f626a75677875727a68746c6e7567726c716579 (cherry picked from commit 3cab3b7d8695bf415a6ab08392c26c0dfd77f032) --- .../ExternalPrimaryStorage.xml | 1 + .../host/HostResizeVolumeExtensionPoint.java | 10 ++++++ .../header/host/HostResizeVolumeStruct.java | 35 +++++++++++++++++++ .../primary/PrimaryStorageControllerSvc.java | 2 ++ .../zstack/expon/ExponStorageController.java | 5 +++ .../xinfini/XInfiniStorageController.java | 5 +++ .../org/zstack/storage/zbs/ZbsHelper.java | 4 +++ .../storage/zbs/ZbsStorageController.java | 6 ++++ .../ExternalPrimaryStorageFactory.java | 15 +++++++- .../addon/zbs/ZbsPrimaryStorageCase.groovy | 6 ---- 10 files changed, 82 insertions(+), 7 deletions(-) create mode 100644 header/src/main/java/org/zstack/header/host/HostResizeVolumeExtensionPoint.java create mode 100644 header/src/main/java/org/zstack/header/host/HostResizeVolumeStruct.java diff --git a/conf/springConfigXml/ExternalPrimaryStorage.xml b/conf/springConfigXml/ExternalPrimaryStorage.xml index b85c19a9b72..f0b5f60289a 100644 --- a/conf/springConfigXml/ExternalPrimaryStorage.xml +++ b/conf/springConfigXml/ExternalPrimaryStorage.xml @@ -28,6 +28,7 @@ + diff --git a/header/src/main/java/org/zstack/header/host/HostResizeVolumeExtensionPoint.java b/header/src/main/java/org/zstack/header/host/HostResizeVolumeExtensionPoint.java new file mode 100644 index 00000000000..d1a14188180 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/HostResizeVolumeExtensionPoint.java @@ -0,0 +1,10 @@ +package org.zstack.header.host; + +import org.zstack.header.volume.VolumeInventory; + +/** + * Created by kayo on 2018/4/2. + */ +public interface HostResizeVolumeExtensionPoint { + HostResizeVolumeStruct beforeKvmHostResizeVolume(HostResizeVolumeStruct struct, VolumeInventory vol, String hostUuid); +} diff --git a/header/src/main/java/org/zstack/header/host/HostResizeVolumeStruct.java b/header/src/main/java/org/zstack/header/host/HostResizeVolumeStruct.java new file mode 100644 index 00000000000..2f6774c6e14 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/HostResizeVolumeStruct.java @@ -0,0 +1,35 @@ +package org.zstack.header.host; + +/** + * @author Xingwei Yu + * @date 2025/8/12 14:20 + */ +public class HostResizeVolumeStruct { + private String deviceType; + String installPath; + long size; + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getInstallPath() { + return installPath; + } + + public void setInstallPath(String installPath) { + this.installPath = installPath; + } + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java b/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java index 14d7d47eb16..5d6896960ce 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java @@ -52,4 +52,6 @@ public interface PrimaryStorageControllerSvc { void setTrashExpireTime(int timeInSeconds, Completion completion); void onFirstAdditionConfigure(Completion completion); + + long alignSize(long size); } diff --git a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java index 2a0489c7b2e..551e782d516 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java +++ b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java @@ -1321,6 +1321,11 @@ public void onFirstAdditionConfigure(Completion completion) { completion.success(); } + @Override + public long alignSize(long size) { + return size; + } + private void retry(Runnable r) { retry(r, 3); } diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index eb439d429d7..df42df49770 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -1010,6 +1010,11 @@ public void onFirstAdditionConfigure(Completion completion) { completion.success(); } + @Override + public long alignSize(long size) { + return SizeUnit.MEGABYTE.toByte(convertBytesToMegaBytes(size)); + } + public void cleanActiveRecord(VolumeInventory vol) { } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java index dcd6ccb47d8..23030921f53 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java @@ -39,4 +39,8 @@ public static String getSizeUnit(String version) { public static long alignSizeTo(long size, String unit) { return ZbsConstants.MEGABYTE_UNIT.equals(unit) ? (long) Math.ceil(SizeUnit.BYTE.toMegaByte((double) size)) : (long) Math.ceil(SizeUnit.BYTE.toGigaByte((double) size)); } + + public static long convertSizeToByte(long size, String unit) { + return ZbsConstants.MEGABYTE_UNIT.equals(unit) ? SizeUnit.MEGABYTE.toByte(size) : SizeUnit.GIGABYTE.toByte(size); + } } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 7f221b9964a..1884dd16586 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -996,6 +996,12 @@ public void onFirstAdditionConfigure(Completion completion) { completion.success(); } + @Override + public long alignSize(long size) { + String unit = getSizeUnit(addonInfo.getClusterInfo().getVersion()); + return convertSizeToByte(alignSizeTo(size, unit), unit); + } + public void doDeleteVolume(String installPath, Boolean force, Completion comp) { DeleteVolumeCmd cmd = new DeleteVolumeCmd(); cmd.setPath(installPath); diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java index 65003a0e0f0..2d8c4fd9109 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java @@ -21,7 +21,9 @@ import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.host.HostInventory; +import org.zstack.header.host.HostResizeVolumeExtensionPoint; import org.zstack.header.host.HostVO; +import org.zstack.header.host.HostResizeVolumeStruct; import org.zstack.header.managementnode.ManagementNodeChangeListener; import org.zstack.header.managementnode.ManagementNodeInventory; import org.zstack.header.message.AbstractBeforeDeliveryMessageInterceptor; @@ -54,7 +56,7 @@ public class ExternalPrimaryStorageFactory implements PrimaryStorageFactory, Com PreVmInstantiateResourceExtensionPoint, VmReleaseResourceExtensionPoint, VmAttachVolumeExtensionPoint, VmDetachVolumeExtensionPoint, BeforeTakeLiveSnapshotsOnVolumes, CreateTemplateFromVolumeSnapshotExtensionPoint, MarkRootVolumeAsSnapshotExtension, VmInstanceMigrateExtensionPoint, - ManagementNodeChangeListener, PrimaryStorageFeatureAllocatorExtensionPoint { + ManagementNodeChangeListener, PrimaryStorageFeatureAllocatorExtensionPoint, HostResizeVolumeExtensionPoint { private static final CLogger logger = Utils.getLogger(ExternalBackupStorageFactory.class); public static PrimaryStorageType type = new PrimaryStorageType(PrimaryStorageConstant.EXTERNAL_PRIMARY_STORAGE_TYPE); @@ -967,4 +969,15 @@ public List allocatePrimaryStorage(Set return candidates; } + + @Override + public HostResizeVolumeStruct beforeKvmHostResizeVolume(HostResizeVolumeStruct struct, VolumeInventory vol, String hostUuid) { + PrimaryStorageControllerSvc controller = controllers.get(vol.getPrimaryStorageUuid()); + if (controller == null) { + return struct; + } + + struct.setSize(controller.alignSize(struct.getSize())); + return struct; + } } diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index e2dd2d11483..445e06e4a76 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -371,12 +371,6 @@ class ZbsPrimaryStorageCase extends SubCase { sleep(2000) - retryInSecs { - reconnectPrimaryStorage { - uuid = ps.uuid - } - } - Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Connected PrimaryStorageGlobalConfig.PING_INTERVAL.resetValue() From 90a9e120b268533c60337a8d3746b2c9ec773d75 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Mon, 18 Aug 2025 14:36:30 +0800 Subject: [PATCH 438/737] [plugin]: set heartbeat volume size Resolves: ZSTAC-76752 Change-Id: I726669766664637567797262796b686667706862 (cherry picked from commit 9cb42f31ce287122021f811bd7dad33365c145f3) --- .../zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java | 1 + .../main/java/org/zstack/storage/zbs/ZbsStorageController.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java index 626cbbfb75e..4c767f87103 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java @@ -12,6 +12,7 @@ public interface ZbsConstants { String ZBS_PS_IPTABLES_COMMENTS = "Zbsp.allow.port"; String ZBS_PS_ALLOW_PORTS = "7763"; String ZBS_HEARTBEAT_VOLUME_NAME = "zbs_zstack_heartbeat"; + long ZBS_HEARTBEAT_VOLUME_SIZE_IN_GIGABYTE = 1; String ZBS_CBD_LUN_PATH_FORMAT = "cbd:%s/%s/%s"; String ZBS_CBD_PREFIX_SCHEME = "cbd://"; Integer PRIMARY_STORAGE_MDS_MAXIMUM_PING_FAILURE = 3; diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 1884dd16586..da9ef2ce940 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -199,6 +199,8 @@ public synchronized void activateHeartbeatVolume(HostInventory h, ReturnValueCom CreateVolumeCmd cmd = new CreateVolumeCmd(); cmd.setLogicalPool(config.getLogicalPoolName()); cmd.setVolume(ZbsConstants.ZBS_HEARTBEAT_VOLUME_NAME); + cmd.setSize(ZbsConstants.ZBS_HEARTBEAT_VOLUME_SIZE_IN_GIGABYTE); + cmd.setUnit(ZbsConstants.GIGABYTE_UNIT); cmd.setSkipIfExisting(true); httpCall(CREATE_VOLUME_PATH, cmd, CreateVolumeRsp.class, new ReturnValueCompletion(comp) { From df99288fc1a0be051ebf7fa255f7a70dd63925a9 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Wed, 13 Aug 2025 17:11:52 +0800 Subject: [PATCH 439/737] [plugin]: introducing get facts Resolves: ZSTAC-76752 Change-Id: I666b7a6663657a6f7863707963696369706c7667 (cherry picked from commit 854ad48c2b9754c4053cb276f4077ca3fc1f741c) --- .../main/java/org/zstack/cbd/ClusterInfo.java | 9 ++++ .../org/zstack/storage/zbs/ZbsMdsBase.java | 3 +- .../storage/zbs/ZbsPrimaryStorageMdsBase.java | 17 +++++-- .../storage/zbs/ZbsStorageController.java | 45 ++++++++++++++----- .../addon/zbs/ZbsPrimaryStorageCase.groovy | 6 +-- .../testlib/ExternalPrimaryStorageSpec.groovy | 1 + 6 files changed, 62 insertions(+), 19 deletions(-) diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/ClusterInfo.java b/plugin/cbd/src/main/java/org/zstack/cbd/ClusterInfo.java index 5ddfec01d52..6907f7e7e0a 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/ClusterInfo.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/ClusterInfo.java @@ -5,8 +5,17 @@ * @date 2025/8/8 14:03 */ public class ClusterInfo { + private String uuid; private String version; + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + public String getVersion() { return version; } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java index d9281d03fe2..bec901e4032 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java @@ -3,6 +3,7 @@ import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; +import org.zstack.cbd.ClusterInfo; import org.zstack.cbd.MdsInfo; import org.zstack.core.db.DatabaseFacade; import org.zstack.header.core.Completion; @@ -41,7 +42,7 @@ public MdsInfo getSelf() { } public abstract void connect(Completion completion); - public abstract void ping(Completion completion); + public abstract void ping(ClusterInfo clusterInfo, Completion completion); protected abstract String makeHttpPath(String ip, String path); protected void checkSshAndTools() { diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java index 4e9f817c8a7..81309d43642 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java @@ -1,6 +1,7 @@ package org.zstack.storage.zbs; import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.cbd.ClusterInfo; import org.zstack.cbd.MdsInfo; import org.zstack.cbd.MdsStatus; import org.zstack.compute.host.HostGlobalConfig; @@ -274,7 +275,7 @@ public String getName() { } @Override - public void ping(Completion completion) { + public void ping(ClusterInfo clusterInfo, Completion completion) { thdf.chainSubmit(new ChainTask(completion) { @Override public String getSyncSignature() { @@ -283,7 +284,7 @@ public String getSyncSignature() { @Override public void run(final SyncTaskChain chain) { - pingMds(new Completion(completion) { + pingMds(clusterInfo, new Completion(completion) { @Override public void success() { completion.success(); @@ -305,7 +306,7 @@ public String getName() { }); } - private void pingMds(final Completion completion) { + private void pingMds(ClusterInfo clusterInfo, final Completion completion) { final Integer MAX_PING_CNT = ZbsConstants.PRIMARY_STORAGE_MDS_MAXIMUM_PING_FAILURE; final List stepCount = new ArrayList<>(); for (int i = 1; i <= MAX_PING_CNT; i++) { @@ -314,6 +315,7 @@ private void pingMds(final Completion completion) { new While<>(stepCount).each((step, comp) -> { PingCmd cmd = new PingCmd(); + cmd.setClusterInfo(clusterInfo); cmd.setAddr(getSelf().getAddr()); restf.asyncJsonPost(ZbsAgentUrl.primaryStorageUrl(getSelf().getAddr(), PING_PATH), cmd, new JsonAsyncRESTCallback(completion) { @@ -368,6 +370,15 @@ public static class PingRsp extends ZbsMdsBase.AgentResponse { } public static class PingCmd extends ZbsMdsBase.AgentCommand { + private ClusterInfo clusterInfo; + + public ClusterInfo getClusterInfo() { + return clusterInfo; + } + + public void setClusterInfo(ClusterInfo clusterInfo) { + this.clusterInfo = clusterInfo; + } } public static class SyncMetadataRsp extends ZbsMdsBase.AgentResponse { diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index da9ef2ce940..7a127154d27 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -177,8 +177,9 @@ public void deployClient(HostInventory h, Completion comp) { DeployClientCmd cmd = new DeployClientCmd(); cmd.setIp(h.getManagementIp()); - cmd.setPassword(host.getPassword()); cmd.setPort(host.getPort()); + cmd.setUsername(host.getUsername()); + cmd.setPassword(host.getPassword()); httpCall(DEPLOY_CLIENT_PATH, cmd, DeployClientRsp.class, new ReturnValueCompletion(comp) { @Override public void success(DeployClientRsp returnValue) { @@ -318,6 +319,7 @@ public void run(FlowTrigger trigger, Map data) { @Override public void success(GetFactsRsp returnValue) { ClusterInfo info = new ClusterInfo(); + info.setUuid(returnValue.getUuid()); info.setVersion(returnValue.getVersion()); newAddonInfo.setClusterInfo(info); trigger.next(); @@ -363,8 +365,9 @@ public void run(FlowTrigger trigger, Map data) { DeployClientCmd cmd = new DeployClientCmd(); cmd.setIp(h.getManagementIp()); - cmd.setPassword(host.getPassword()); cmd.setPort(host.getPort()); + cmd.setUsername(host.getUsername()); + cmd.setPassword(host.getPassword()); httpCall(DEPLOY_CLIENT_PATH, cmd, DeployClientRsp.class, new ReturnValueCompletion(comp) { @Override public void success(DeployClientRsp returnValue) { @@ -415,7 +418,7 @@ public void ping(Completion completion) { reloadDbInfo(); final List mds = CollectionUtils.transformToList(addonInfo.getMdsInfos(), ZbsPrimaryStorageMdsBase::new); new While<>(mds).each((m, comp) -> { - m.ping(new Completion(comp) { + m.ping(addonInfo.getClusterInfo(), new Completion(comp) { @Override public void success() { m.getSelf().setStatus(MdsStatus.Connected); @@ -1692,8 +1695,9 @@ public void setLogicalPool(String logicalPool) { public static class DeployClientCmd extends AgentCommand { private String ip; - private String password; private Integer port; + private String username; + private String password; public String getIp() { return ip; @@ -1703,14 +1707,6 @@ public void setIp(String ip) { this.ip = ip; } - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - public Integer getPort() { return port; } @@ -1718,11 +1714,36 @@ public Integer getPort() { public void setPort(Integer port) { this.port = port; } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } } public static class GetFactsRsp extends AgentResponse { + private String uuid; private String version; + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + public String getVersion() { return version; } diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index 445e06e4a76..5fc8f14aa97 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -321,7 +321,7 @@ class ZbsPrimaryStorageCase extends SubCase { def addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() - assert addonInfo == "{\"clusterInfo\":{\"version\":\"1.6.1-for-test\"},\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" + assert addonInfo == "{\"clusterInfo\":{\"uuid\":\"123456789\",\"version\":\"1.6.1-for-test\"},\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" env.afterSimulator(ZbsPrimaryStorageMdsBase.PING_PATH) { rsp, HttpEntity e -> def cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) @@ -338,7 +338,7 @@ class ZbsPrimaryStorageCase extends SubCase { addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() - assert addonInfo == "{\"clusterInfo\":{\"version\":\"1.6.1-for-test\"},\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" + assert addonInfo == "{\"clusterInfo\":{\"uuid\":\"123456789\",\"version\":\"1.6.1-for-test\"},\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" assert Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Connected @@ -363,7 +363,7 @@ class ZbsPrimaryStorageCase extends SubCase { addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() - assert addonInfo == "{\"clusterInfo\":{\"version\":\"1.6.1-for-test\"},\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" + assert addonInfo == "{\"clusterInfo\":{\"uuid\":\"123456789\",\"version\":\"1.6.1-for-test\"},\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" assert Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Disconnected diff --git a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy index 4424e921634..881c4f50a58 100644 --- a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy @@ -77,6 +77,7 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { assert zspec != null: "cannot found zbs primary storage[uuid:${cmd.uuid}], check your environment()." def rsp = new ZbsStorageController.GetFactsRsp() + rsp.uuid = "123456789" rsp.version = "1.6.1-for-test" rsp.success = true From f0f603b87179aa54274864b7e6f606f2c6144245 Mon Sep 17 00:00:00 2001 From: Xingwei Yu Date: Tue, 19 Aug 2025 13:58:36 +0800 Subject: [PATCH 440/737] [plugin]: set default unit is gigabyte Resolves: ZSTAC-77126 Change-Id: I7a67756963656a686b656b6778777a636e686279 (cherry picked from commit 51fd6099fb58e7689c42a85598b31a5b0c809211) --- .../zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java | 2 +- plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java | 2 +- .../main/java/org/zstack/storage/zbs/ZbsStorageController.java | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java index 4c767f87103..8f547cfeb29 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java @@ -19,5 +19,5 @@ public interface ZbsConstants { String VOLUME_PHYSICAL_BLOCK_SIZE = "4096"; String MEGABYTE_SUPPORTED_VERSION = "1.6.1"; String MEGABYTE_UNIT = "M"; - String GIGABYTE_UNIT = "G"; + String DEFAULT_GIGABYTE_UNIT = null; } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java index 23030921f53..7af981c5194 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java @@ -33,7 +33,7 @@ public static String getVolumeFromSnapshotPath(String path) { } public static String getSizeUnit(String version) { - return new VersionComparator(version.split("-")[0]).compare(ZbsConstants.MEGABYTE_SUPPORTED_VERSION) >= 0 ? ZbsConstants.MEGABYTE_UNIT : ZbsConstants.GIGABYTE_UNIT; + return new VersionComparator(version.split("-")[0]).compare(ZbsConstants.MEGABYTE_SUPPORTED_VERSION) >= 0 ? ZbsConstants.MEGABYTE_UNIT : ZbsConstants.DEFAULT_GIGABYTE_UNIT; } public static long alignSizeTo(long size, String unit) { diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 7a127154d27..83225638746 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -201,7 +201,6 @@ public synchronized void activateHeartbeatVolume(HostInventory h, ReturnValueCom cmd.setLogicalPool(config.getLogicalPoolName()); cmd.setVolume(ZbsConstants.ZBS_HEARTBEAT_VOLUME_NAME); cmd.setSize(ZbsConstants.ZBS_HEARTBEAT_VOLUME_SIZE_IN_GIGABYTE); - cmd.setUnit(ZbsConstants.GIGABYTE_UNIT); cmd.setSkipIfExisting(true); httpCall(CREATE_VOLUME_PATH, cmd, CreateVolumeRsp.class, new ReturnValueCompletion(comp) { From cf2f16536f1b26b04123746a8ceae0b00746476f Mon Sep 17 00:00:00 2001 From: littleya Date: Sat, 12 Jul 2025 15:30:28 +0800 Subject: [PATCH 441/737] [root]: update commons-beanutils to 1.11.0 to fix CVEs Resolves: ZSTAC-76249 Change-Id: I74667174646b766d7a6b6e797767706d64636b63 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index dbeb5219d39..7eb089349a4 100755 --- a/pom.xml +++ b/pom.xml @@ -354,7 +354,7 @@ commons-beanutils commons-beanutils - 1.9.4 + 1.11.0 org.javassist From 715ba188cfb660b78ebdef976a864be24dceb8a3 Mon Sep 17 00:00:00 2001 From: "weiqiang.xu" Date: Thu, 10 Apr 2025 13:29:26 +0800 Subject: [PATCH 442/737] [flatNetworkProvider]: add fields in metaDataTO and userDataTO Add inner VmInstance 169.254.169.254 accessible fields generate sdk for GuestTools add field vswitch-cidr-block for userdata Resolves: ZSTAC-73178 Change-Id: I77627a74627571676c71796a617763616473666d --- conf/db/upgrade/V5.3.36__schema.sql | 4 +- .../service/flat/FlatUserdataBackend.java | 1806 +++++++++-------- .../apimediator/ApiMessageProcessorImpl.java | 586 +++--- sdk/src/main/java/SourceClassMap.java | 4 + .../sdk/AliyunInvocationRecordData.java | 87 + .../sdk/AliyunInvocationRecordDetailData.java | 47 + .../sdk/GetAliyunInvocationsAction.java | 107 + .../sdk/GetAliyunInvocationsResult.java | 22 + .../TestUserDataBatchApllyCase.groovy | 31 + .../java/org/zstack/testlib/ApiHelper.groovy | 27 + 10 files changed, 1589 insertions(+), 1132 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/AliyunInvocationRecordData.java create mode 100644 sdk/src/main/java/org/zstack/sdk/AliyunInvocationRecordDetailData.java create mode 100644 sdk/src/main/java/org/zstack/sdk/GetAliyunInvocationsAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/GetAliyunInvocationsResult.java diff --git a/conf/db/upgrade/V5.3.36__schema.sql b/conf/db/upgrade/V5.3.36__schema.sql index d7a568582ea..c244fd6f203 100644 --- a/conf/db/upgrade/V5.3.36__schema.sql +++ b/conf/db/upgrade/V5.3.36__schema.sql @@ -10,4 +10,6 @@ CREATE TABLE IF NOT EXISTS `zstack`.`VolumeCbtBackupRecordVO` ( `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE VIEW `zstack`.`GuestVmScriptVO` AS SELECT uuid, name, description, platform, encodingType, scriptContent, renderParams, scriptType, scriptTimeout, version, createDate, lastOpDate FROM `zstack`.`GuestVmScriptEO` WHERE deleted IS NULL; \ No newline at end of file diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java index c465b61b3a7..2d0978f7a60 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java @@ -1,838 +1,968 @@ -package org.zstack.network.service.flat; - -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; -import org.zstack.compute.vm.UserdataBuilder; -import org.zstack.compute.vm.VmSystemTags; -import org.zstack.core.asyncbatch.While; -import org.zstack.core.cloudbus.CloudBus; -import org.zstack.core.cloudbus.CloudBusCallBack; -import org.zstack.core.componentloader.PluginRegistry; -import org.zstack.core.db.DatabaseFacade; -import org.zstack.core.db.Q; -import org.zstack.core.gc.GC; -import org.zstack.core.gc.GCCompletion; -import org.zstack.core.gc.TimeBasedGarbageCollector; -import org.zstack.core.timeout.ApiTimeoutManager; -import org.zstack.core.upgrade.GrayVersion; -import org.zstack.core.workflow.FlowChainBuilder; -import org.zstack.core.workflow.ShareFlow; -import org.zstack.header.core.Completion; -import org.zstack.header.core.FutureCompletion; -import org.zstack.header.core.ReturnValueCompletion; -import org.zstack.header.core.WhileDoneCompletion; -import org.zstack.header.core.workflow.*; -import org.zstack.header.errorcode.ErrorCode; -import org.zstack.header.errorcode.ErrorCodeList; -import org.zstack.header.errorcode.OperationFailureException; -import org.zstack.header.host.HostConstant; -import org.zstack.header.host.HostStatus; -import org.zstack.header.host.HostVO; -import org.zstack.header.host.HostVO_; -import org.zstack.header.message.MessageReply; -import org.zstack.header.network.l2.L2NetworkInventory; -import org.zstack.header.network.l2.L2NetworkUpdateExtensionPoint; -import org.zstack.header.network.l3.*; -import org.zstack.header.network.service.*; -import org.zstack.header.vm.*; -import org.zstack.kvm.*; -import org.zstack.kvm.KVMAgentCommands.AgentResponse; -import org.zstack.network.l2.L2NetworkHostHelper; -import org.zstack.network.service.NetworkProviderFinder; -import org.zstack.network.service.NetworkServiceFilter; -import org.zstack.network.service.NetworkServiceManager; -import org.zstack.network.service.userdata.*; -import org.zstack.utils.CollectionUtils; -import org.zstack.utils.Utils; -import org.zstack.utils.function.Function; -import org.zstack.utils.logging.CLogger; -import org.zstack.utils.network.IPv6Constants; - -import javax.persistence.Tuple; -import javax.persistence.TypedQuery; -import java.util.*; -import java.util.concurrent.Callable; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -import static org.zstack.core.Platform.operr; - -/** - * Created by frank on 10/13/2015. - */ -public class FlatUserdataBackend implements UserdataBackend, KVMHostConnectExtensionPoint, - L3NetworkDeleteExtensionPoint, L2NetworkUpdateExtensionPoint, VmInstanceMigrateExtensionPoint { - private static final CLogger logger = Utils.getLogger(FlatUserdataBackend.class); - - @Autowired - private CloudBus bus; - @Autowired - private DatabaseFacade dbf; - @Autowired - private ApiTimeoutManager timeoutMgr; - @Autowired - private FlatDhcpBackend dhcpBackend; - @Autowired - private PluginRegistry pluginRgty; - @Autowired - private NetworkServiceManager nsMgr; - - public static final String APPLY_USER_DATA = "/flatnetworkprovider/userdata/apply"; - public static final String BATCH_APPLY_USER_DATA = "/flatnetworkprovider/userdata/batchapply"; - public static final String RELEASE_USER_DATA = "/flatnetworkprovider/userdata/release"; - public static final String CLEANUP_USER_DATA = "/flatnetworkprovider/userdata/cleanup"; - - @Override - public Flow createKvmHostConnectingFlow(final KVMHostConnectedContext context) { - return createHostPrepareUserdataFlow(context.getInventory().getUuid()); - } - - private Flow createHostPrepareUserdataFlow(final String hostUuid) { - return new NoRollbackFlow() { - String __name__ = "prepare-userdata"; - - @Transactional(readOnly = true) - private List getVmsNeedUserdataOnHost() { - String sql = "select vm.uuid from VmInstanceVO vm where vm.hostUuid = :huuid and vm.state = :state and vm.type = :type"; - TypedQuery q = dbf.getEntityManager().createQuery(sql, String.class); - q.setParameter("state", VmInstanceState.Running); - q.setParameter("huuid", hostUuid); - q.setParameter("type", VmInstanceConstant.USER_VM_TYPE); - List vmUuids = q.getResultList(); - if (vmUuids.isEmpty()) { - return null; - } - - vmUuids = new NetworkServiceFilter().filterVmByServiceTypeAndProviderType(vmUuids, UserdataConstant.USERDATA_TYPE_STRING, FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING); - if (vmUuids.isEmpty()) { - return null; - } - - return vmUuids; - } - - class VmIpL3Uuid { - String vmIp; - String netmask; - String l3Uuid; - String dhcpServerIp; - } - - @Transactional(readOnly = true) - private Map getVmIpL3Uuid(List vmUuids) { - String sql = "select vm.uuid, ip.ip, ip.l3NetworkUuid, ip.netmask from VmInstanceVO vm," + - "VmNicVO nic, NetworkServiceL3NetworkRefVO ref," + - "NetworkServiceProviderVO pro, UsedIpVO ip where " + - " vm.uuid = nic.vmInstanceUuid and vm.uuid in (:uuids)" + - " and nic.uuid = ip.vmNicUuid " + - " and ip.l3NetworkUuid = vm.defaultL3NetworkUuid and ip.ipVersion = :ipversion" + - " and ref.networkServiceProviderUuid = pro.uuid" + - " and ref.l3NetworkUuid = vm.defaultL3NetworkUuid" + - " and pro.type = :proType"; - - TypedQuery q = dbf.getEntityManager().createQuery(sql, Tuple.class); - q.setParameter("uuids", vmUuids); - q.setParameter("proType", FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING); - /* current only ipv4 has userdata */ - q.setParameter("ipversion", IPv6Constants.IPv4); - List ts = q.getResultList(); - - Map ret = new HashMap(); - for (Tuple t : ts) { - String vmUuid = t.get(0, String.class); - VmIpL3Uuid v = new VmIpL3Uuid(); - v.vmIp = t.get(1, String.class); - v.l3Uuid = t.get(2, String.class); - v.netmask = t.get(3, String.class); - ret.put(vmUuid, v); - } - - return ret; - } - - private List getUserData() { - List vmUuids = getVmsNeedUserdataOnHost(); - if (vmUuids == null) { - return null; - } - - Map vmipl3 = getVmIpL3Uuid(vmUuids); - if (vmipl3.isEmpty()) { - return null; - } - - // filter out vm that not using flat network provider - vmUuids = vmUuids.stream().filter(vmipl3::containsKey).collect(Collectors.toList()); - if (vmUuids.isEmpty()) { - return null; - } - - Map> userdata = new UserdataBuilder().buildByVmUuids(vmUuids); - Set l3Uuids = new HashSet(); - for (VmIpL3Uuid l : vmipl3.values()) { - String dhcpIp = dhcpBackend.allocateDhcpIp(l.l3Uuid, IPv6Constants.IPv4); - if (dhcpIp != null) { - l.dhcpServerIp = dhcpIp; - } - l3Uuids.add(l.l3Uuid); - } - List tos = new ArrayList<>(); - if (l3Uuids.isEmpty()) { - return tos; - } - Map bridgeNames = new BridgeNameFinder().findByL3Uuids(l3Uuids); - List l2Uuids = Q.New(L3NetworkVO.class) - .select(L3NetworkVO_.l2NetworkUuid).in(L3NetworkVO_.uuid, l3Uuids).listValues(); - Map bridgesVlan = new BridgeVlanIdFinder().findByL2Uuids(l2Uuids); - - for (String vmuuid : vmUuids) { - UserdataTO to = new UserdataTO(); - MetadataTO mto = new MetadataTO(); - mto.vmUuid = vmuuid; - mto.vmHostname = VmSystemTags.HOSTNAME.getTokenByResourceUuid(vmuuid, VmSystemTags.HOSTNAME_TOKEN); - to.metadata = mto; - - VmIpL3Uuid l = vmipl3.get(vmuuid); - if (l.vmIp == null) { - continue; - } - - if (bridgeNames.get(l.l3Uuid) == null) { - continue; - } - - if (l.netmask == null) { - /* user data config need netmask */ - logger.info(String.format("can not get netmask for vmnic[ip:%s] for vm[uuid:%s]", - l.vmIp, vmuuid)); - continue; - } - - to.dhcpServerIp = l.dhcpServerIp; - to.vmIp = l.vmIp; - to.netmask = l.netmask; - to.bridgeName = bridgeNames.get(l.l3Uuid); - to.vlanId = bridgesVlan.get(to.bridgeName); - to.namespaceName = FlatDhcpBackend.makeNamespaceName(to.bridgeName, l.l3Uuid); - if (userdata.get(vmuuid) != null) { - to.userdataList.addAll(userdata.get(vmuuid)); - } - to.port = UserdataGlobalProperty.HOST_PORT; - to.l3NetworkUuid = l.l3Uuid; - to.agentConfig = new HashMap<>(); - for (BeforeUpdateUserdataExtensionPoint ext : pluginRgty.getExtensionList(BeforeUpdateUserdataExtensionPoint.class)) { - ext.beforeApplyUserdata(vmuuid, to); - } - tos.add(to); - } - - return tos; - } - - @Override - public void run(final FlowTrigger trigger, Map data) { - List tos = getUserData(); - if (tos == null) { - trigger.next(); - return; - } - - BatchApplyUserdataCmd cmd = new BatchApplyUserdataCmd(); - cmd.userdata = tos; - cmd.rebuild = true; - - new KvmCommandSender(hostUuid, true).send(cmd, BATCH_APPLY_USER_DATA, new KvmCommandFailureChecker() { - @Override - public ErrorCode getError(KvmResponseWrapper wrapper) { - AgentResponse rsp = wrapper.getResponse(AgentResponse.class); - return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); - } - }, new ReturnValueCompletion(trigger) { - @Override - public void success(KvmResponseWrapper returnValue) { - trigger.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - trigger.fail(errorCode); - } - }); - } - }; - } - - @Override - public String preDeleteL3Network(L3NetworkInventory inventory) { - return null; - } - - @Override - public void beforeDeleteL3Network(L3NetworkInventory inventory) { - } - - @Override - public void afterDeleteL3Network(L3NetworkInventory l3) { - Optional o = l3.getNetworkServices().stream().filter(n -> n.getNetworkServiceType().equals(UserdataConstant.USERDATA_TYPE_STRING)).findAny(); - if (!o.isPresent()) { - return; - } - - NetworkServiceL3NetworkRefInventory ref = o.get(); - if (!dbf.isExist(ref.getNetworkServiceProviderUuid(), NetworkServiceProviderVO.class)) { - return; - } - - List hostUuids = new Callable>() { - @Override - @Transactional(readOnly = true) - public List call() { - String sql = "select h.uuid from HostVO h, L2NetworkClusterRefVO ref where h.clusterUuid = ref.clusterUuid" + - " and ref.l2NetworkUuid = :l2Uuid and h.hypervisorType = :hvType"; - TypedQuery q = dbf.getEntityManager().createQuery(sql, String.class); - q.setParameter("l2Uuid", l3.getL2NetworkUuid()); - q.setParameter("hvType", KVMConstant.KVM_HYPERVISOR_TYPE); - return q.getResultList(); - } - }.call(); - - if (hostUuids.isEmpty()) { - return; - } - - CleanupUserdataCmd cmd = new CleanupUserdataCmd(); - cmd.bridgeName = new BridgeNameFinder().findByL3Uuid(l3.getUuid()); - cmd.l3NetworkUuid = l3.getUuid(); - cmd.namespaceName = FlatDhcpBackend.makeNamespaceName(cmd.bridgeName, cmd.l3NetworkUuid); - - for (String huuid : hostUuids) { - new KvmCommandSender(huuid).send(cmd, CLEANUP_USER_DATA, new KvmCommandFailureChecker() { - @Override - public ErrorCode getError(KvmResponseWrapper w) { - CleanupUserdataRsp rsp = w.getResponse(CleanupUserdataRsp.class); - return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); - } - }, new ReturnValueCompletion(null) { - @Override - public void success(KvmResponseWrapper w) { - logger.debug(String.format("successfully cleanup userdata service on the host[uuid:%s] for the deleted L3 network[uuid:%s, name:%s]", - huuid, l3.getUuid(), l3.getName())); - } - - @Override - public void fail(ErrorCode errorCode) { - //TODO: Add GC - logger.warn(errorCode.toString()); - } - }); - } - } - - private UserdataStruct makeUserdataStructForMigratingVm(VmInstanceInventory inv, String hostUuid) { - if (!nsMgr.isVmNeedNetworkService(inv.getType(), UserdataConstant.USERDATA_TYPE)) { - return null; - } - - String providerType = new NetworkProviderFinder().getNetworkProviderTypeByNetworkServiceType(inv.getDefaultL3NetworkUuid(), UserdataConstant.USERDATA_TYPE_STRING); - if (!FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING.equals(providerType)) { - return null; - } - - List userdataList = new UserdataBuilder().buildByVmUuid(inv.getUuid()); - if (userdataList == null) { - // Apply userdata anyway after migrating VM to redeploy lighttpd server - // so that the VM can still send metric data to pushgateway through lighttpd - userdataList = Collections.emptyList(); - } - - UserdataStruct struct = new UserdataStruct(); - struct.setParametersFromVmInventory(inv); - struct.setHostUuid(hostUuid); - struct.setL3NetworkUuid(inv.getDefaultL3NetworkUuid()); - struct.setUserdataList(userdataList); - return struct; - } - - - @Override - public void preMigrateVm(VmInstanceInventory inv, String destHostUuid, Completion completion) { - UserdataStruct struct = makeUserdataStructForMigratingVm(inv, destHostUuid); - if (struct == null) { - completion.success(); - return; - } - - applyUserdata(struct, completion); - } - - @Override - public void beforeMigrateVm(VmInstanceInventory inv, String destHostUuid) { - - } - - public static class UserdataReleseGC extends TimeBasedGarbageCollector { - public static long INTERVAL = 300; - - @GC - public UserdataStruct struct; - - @Override - protected void triggerNow(GCCompletion completion) { - - HostStatus status = Q.New(HostVO.class).select(HostVO_.status).eq(HostVO_.uuid, struct.getHostUuid()).findValue(); - if (status == null) { - // host deleted - completion.cancel(); - return; - } - - if (status != HostStatus.Connected) { - completion.fail(operr("host[uuid:%s] is not connected", struct.getHostUuid())); - return; - } - - String vmIp = CollectionUtils.find(struct.getVmNics(), arg -> arg.getL3NetworkUuid().equals(struct.getL3NetworkUuid()) ? arg.getIp() : null); - if (vmIp == null) { - completion.cancel(); - return; - } - - ReleaseUserdataCmd cmd = new ReleaseUserdataCmd(); - cmd.hostUuid = struct.getHostUuid(); - cmd.bridgeName = new BridgeNameFinder().findByL3Uuid(struct.getL3NetworkUuid()); - cmd.namespaceName = FlatDhcpBackend.makeNamespaceName(cmd.bridgeName, struct.getL3NetworkUuid()); - cmd.vmIp = vmIp; - - KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); - msg.setHostUuid(struct.getHostUuid()); - msg.setCommand(cmd); - msg.setPath(RELEASE_USER_DATA); - bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, struct.getHostUuid()); - bus.send(msg, new CloudBusCallBack(completion) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - completion.fail(reply.getError()); - return; - } - - KVMHostAsyncHttpCallReply r = reply.castReply(); - ReleaseUserdataRsp rsp = r.toResponse(ReleaseUserdataRsp.class); - if (!rsp.isSuccess()) { - completion.fail(operr("operation error, because:%s", rsp.getError())); - return; - } - - completion.success(); - } - }); - } - } - - @Override - public void afterMigrateVm(VmInstanceInventory inv, String srcHostUuid) { - UserdataStruct struct = makeUserdataStructForMigratingVm(inv, srcHostUuid); - if (struct == null) { - return; - } - - releaseUserdata(struct, new Completion(null) { - @Override - public void success() { - // nothing - } - - @Override - public void fail(ErrorCode errorCode) { - logger.warn(String.format("failed to release userdata on the source host[uuid:%s]" + - " for the migrated VM[uuid: %s, name:%s], %s. GC will take care it", srcHostUuid, inv.getUuid(), inv.getName(), errorCode)); - UserdataReleseGC gc = new UserdataReleseGC(); - gc.struct = struct; - gc.submit(UserdataReleseGC.INTERVAL, TimeUnit.SECONDS); - } - }); - } - - @Override - public void failedToMigrateVm(VmInstanceInventory inv, String destHostUuid, ErrorCode reason) { - if (destHostUuid == null) { - return; - } - - UserdataStruct struct = makeUserdataStructForMigratingVm(inv, destHostUuid); - if (struct == null) { - return; - } - - // clean the userdata that set on the dest host - releaseUserdata(struct, new Completion(null) { - @Override - public void success() { - // nothing - } - - @Override - public void fail(ErrorCode errorCode) { - UserdataReleseGC gc = new UserdataReleseGC(); - gc.struct = struct; - gc.submit(UserdataReleseGC.INTERVAL, TimeUnit.SECONDS); - } - }); - } - - public static class UserdataTO { - public MetadataTO metadata; - public List userdataList = new ArrayList<>(); - public String vmIp; - public String netmask; - public String dhcpServerIp; - public String bridgeName; - public String vlanId; - public String namespaceName; - public String l3NetworkUuid; - public Map agentConfig; - public int port; - } - - public static class MetadataTO { - public String vmUuid; - public String vmHostname; - } - - public static class CleanupUserdataCmd extends KVMAgentCommands.AgentCommand { - @GrayVersion(value = "5.0.0") - public String bridgeName; - @GrayVersion(value = "5.0.0") - public String l3NetworkUuid; - @GrayVersion(value = "5.0.0") - public String namespaceName; - } - - public static class CleanupUserdataRsp extends KVMAgentCommands.AgentResponse { - - } - - public static class BatchApplyUserdataCmd extends KVMAgentCommands.AgentCommand { - @GrayVersion(value = "5.0.0") - public List userdata; - @GrayVersion(value = "5.0.0") - public boolean rebuild; - } - - public static class ApplyUserdataCmd extends KVMAgentCommands.AgentCommand { - @GrayVersion(value = "5.0.0") - public String hostUuid; - @GrayVersion(value = "5.0.0") - public UserdataTO userdata; - } - - public static class ApplyUserdataRsp extends KVMAgentCommands.AgentResponse { - - } - - public static class ReleaseUserdataCmd extends KVMAgentCommands.AgentCommand { - @GrayVersion(value = "5.0.0") - public String hostUuid; - @GrayVersion(value = "5.0.0") - public String vmIp; - @GrayVersion(value = "5.0.0") - public String bridgeName; - @GrayVersion(value = "5.0.0") - public String namespaceName; - } - - public static class ReleaseUserdataRsp extends KVMAgentCommands.AgentResponse { - } - - @Override - public NetworkServiceProviderType getProviderType() { - return FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE; - } - - private boolean hasMetedata(UserdataStruct struct) { - return VmSystemTags.HOSTNAME.getTokenByResourceUuid(struct.getVmUuid(), VmSystemTags.HOSTNAME_TOKEN) != null; - } - - private boolean hasUserdata(UserdataStruct struct) { - return struct.getUserdataList() != null && !struct.getUserdataList().isEmpty(); - } - - @Override - public void applyUserdata(final UserdataStruct struct, final Completion completion) { - if (!UserdataGlobalConfig.OPEN_USERDATA_SERVICE_BY_DEFAULT.value(Boolean.class)) { - if ( !hasMetedata(struct) && !hasUserdata(struct)) { - completion.success(); - return; - } - } - - if (new FlatNetworkServiceValidator().validate(struct.getHostUuid())) { - completion.success(); - return; - } - - VmNicInventory destNic = CollectionUtils.find(struct.getVmNics(), new Function() { - @Override - public VmNicInventory call(VmNicInventory arg) { - return arg.getL3NetworkUuid().equals(struct.getL3NetworkUuid()) ? arg : null; - } - }); - - if (destNic == null) { - completion.success(); - return; - } - - L3NetworkVO defaultL3 = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.uuid, struct.getL3NetworkUuid()).find(); - if (defaultL3!= null && defaultL3.getNetworkServices().stream().noneMatch( - service -> Objects.equals(UserdataConstant.USERDATA_TYPE_STRING, service.getNetworkServiceType()))) { - completion.success(); - return; - } - - UsedIpVO ipv4 = Q.New(UsedIpVO.class).eq(UsedIpVO_.vmNicUuid, destNic.getUuid()) - .eq(UsedIpVO_.ipVersion, IPv6Constants.IPv4).limit(1).find(); - if (ipv4 == null) { - // userdata depends on the ipv4 address - completion.success(); - return; - } - if (StringUtils.isEmpty(ipv4.getNetmask())) { - // userdata depends on the ipv4 netmask - logger.info(String.format("can not get netmask for vmnic[ip:%s] for vm[uuid:%s]", - ipv4.getIp(), struct.getVmUuid())); - completion.success(); - return; - } - - - FlowChain chain = FlowChainBuilder.newShareFlowChain(); - chain.setName(String.format("flat-network-userdata-set-for-vm-%s", struct.getVmUuid())); - chain.then(new ShareFlow() { - String dhcpServerIp; - - @Override - public void setup() { - flow(new NoRollbackFlow() { - String __name__ = "get-dhcp-server-ip"; - - @Override - public void run(final FlowTrigger trigger, Map data) { - FlatDhcpAcquireDhcpServerIpMsg msg = new FlatDhcpAcquireDhcpServerIpMsg(); - msg.setL3NetworkUuid(struct.getL3NetworkUuid()); - bus.makeTargetServiceIdByResourceUuid(msg, FlatNetworkServiceConstant.SERVICE_ID, struct.getL3NetworkUuid()); - bus.send(msg, new CloudBusCallBack(trigger) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - trigger.fail(reply.getError()); - return; - } - - FlatDhcpAcquireDhcpServerIpReply dreply = (FlatDhcpAcquireDhcpServerIpReply) reply; - if (dreply.getDhcpServerList() != null && !dreply.getDhcpServerList().isEmpty()) { - dhcpServerIp = dreply.getDhcpServerList().get(0).getIp(); - } - - - trigger.next(); - } - }); - } - }); - - flow(new NoRollbackFlow() { - String __name__ = "apply-user-data"; - - @Override - public void run(final FlowTrigger trigger, Map data) { - ApplyUserdataCmd cmd = new ApplyUserdataCmd(); - cmd.hostUuid = struct.getHostUuid(); - - MetadataTO to = new MetadataTO(); - to.vmUuid = struct.getVmUuid(); - to.vmHostname = VmSystemTags.HOSTNAME.getTokenByResourceUuid(struct.getVmUuid(), VmSystemTags.HOSTNAME_TOKEN); - UserdataTO uto = new UserdataTO(); - uto.metadata = to; - uto.userdataList = struct.getUserdataList(); - uto.dhcpServerIp = dhcpServerIp; - uto.vmIp = ipv4.getIp(); - uto.netmask = ipv4.getNetmask(); - uto.bridgeName = new BridgeNameFinder().findByL3Uuid(struct.getL3NetworkUuid()); - uto.vlanId = new BridgeVlanIdFinder().findByL2Uuid(defaultL3.getL2NetworkUuid(), false); - uto.namespaceName = FlatDhcpBackend.makeNamespaceName(uto.bridgeName, struct.getL3NetworkUuid()); - uto.port = UserdataGlobalProperty.HOST_PORT; - uto.l3NetworkUuid = struct.getL3NetworkUuid(); - uto.agentConfig = new HashMap<>(); - for (BeforeUpdateUserdataExtensionPoint ext : pluginRgty.getExtensionList(BeforeUpdateUserdataExtensionPoint.class)) { - ext.beforeApplyUserdata(struct.getVmUuid(), uto); - } - cmd.userdata = uto; - - KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); - msg.setHostUuid(struct.getHostUuid()); - msg.setCommand(cmd); - msg.setPath(APPLY_USER_DATA); - bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, struct.getHostUuid()); - bus.send(msg, new CloudBusCallBack(trigger) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - trigger.fail(reply.getError()); - return; - } - - KVMHostAsyncHttpCallReply r = reply.castReply(); - ApplyUserdataRsp rsp = r.toResponse(ApplyUserdataRsp.class); - if (!rsp.isSuccess()) { - trigger.fail(operr("operation error, because:%s", rsp.getError())); - return; - } - - trigger.next(); - } - }); - } - }); - - done(new FlowDoneHandler(completion) { - @Override - public void handle(Map data) { - completion.success(); - } - }); - - error(new FlowErrorHandler(completion) { - @Override - public void handle(ErrorCode errCode, Map data) { - completion.fail(errCode); - } - }); - } - }).start(); - } - - @Override - public void releaseUserdata(final UserdataStruct struct, final Completion completion) { - if (new FlatNetworkServiceValidator().validate(struct.getHostUuid())) { - completion.success(); - return; - } - - - VmNicInventory destNic = CollectionUtils.find(struct.getVmNics(), new Function() { - @Override - public VmNicInventory call(VmNicInventory arg) { - return arg.getL3NetworkUuid().equals(struct.getL3NetworkUuid()) ? arg : null; - } - }); - - if (destNic == null) { - completion.success(); - return; - } - - UsedIpInventory ipv4 = destNic.getUsedIps().stream().filter(ip -> ip.getIpVersion() == IPv6Constants.IPv4).findAny().orElse(null); - if (ipv4 == null) { - // userdata depends on the ipv4 address - completion.success(); - return; - } - - FlowChain chain = FlowChainBuilder.newShareFlowChain(); - chain.setName(String.format("flat-network-userdata-release-for-vm-%s", struct.getVmUuid())); - chain.then(new ShareFlow() { - @Override - public void setup() { - flow(new NoRollbackFlow() { - String __name__ = "release-user-data"; - - @Override - public void run(final FlowTrigger trigger, Map data) { - ReleaseUserdataCmd cmd = new ReleaseUserdataCmd(); - cmd.hostUuid = struct.getHostUuid(); - cmd.bridgeName = new BridgeNameFinder().findByL3Uuid(struct.getL3NetworkUuid()); - cmd.namespaceName = FlatDhcpBackend.makeNamespaceName(cmd.bridgeName, struct.getL3NetworkUuid()); - cmd.vmIp = ipv4.getIp(); - - KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); - msg.setHostUuid(struct.getHostUuid()); - msg.setCommand(cmd); - msg.setPath(RELEASE_USER_DATA); - bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, struct.getHostUuid()); - bus.send(msg, new CloudBusCallBack(trigger) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - trigger.fail(reply.getError()); - return; - } - - KVMHostAsyncHttpCallReply r = reply.castReply(); - ReleaseUserdataRsp rsp = r.toResponse(ReleaseUserdataRsp.class); - if (!rsp.isSuccess()) { - trigger.fail(operr("operation error, because:%s", rsp.getError())); - return; - } - - trigger.next(); - } - }); - } - }); - - done(new FlowDoneHandler(completion) { - @Override - public void handle(Map data) { - completion.success(); - } - }); - - error(new FlowErrorHandler(completion) { - @Override - public void handle(ErrorCode errCode, Map data) { - completion.fail(errCode); - } - }); - } - }).start(); - } - - @Override - public void beforeChangeL2NetworkVlanId(L2NetworkInventory l2Inv) { - - } - - @Override - public void afterChangeL2NetworkVlanId(L2NetworkInventory l2Inv) { - new While<>(L2NetworkHostHelper.getHostsByL2NetworkAttachedCluster(l2Inv)).step((host, whileCompletion) -> { - FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); - chain.setName(String.format("after-l2-%s-changed-flat-network-userdata-apply-in-host-%s", - l2Inv.getUuid(), host.getUuid())); - chain.then(createHostPrepareUserdataFlow(host.getUuid())); - chain.done(new FlowDoneHandler(whileCompletion) { - @Override - public void handle(Map data) { - whileCompletion.done(); - } - }).error(new FlowErrorHandler(whileCompletion) { - @Override - public void handle(ErrorCode errCode, Map data) { - whileCompletion.addError(errCode); - whileCompletion.allDone(); - } - }).start(); - },10).run(new WhileDoneCompletion(null) { - @Override - public void done(ErrorCodeList errorCodeList) { - if (!errorCodeList.getCauses().isEmpty()) { - logger.error(String.format("apply userdata failed after L2Network changed, because:%s", - errorCodeList.getCauses().get(0))); - } else { - logger.debug("apply userdata successful after L2Network changed"); - } - } - }); - } -} +package org.zstack.network.service.flat; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.zstack.compute.vm.UserdataBuilder; +import org.zstack.compute.vm.VmSystemTags; +import org.zstack.core.asyncbatch.While; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.cloudbus.CloudBusCallBack; +import org.zstack.core.componentloader.PluginRegistry; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; +import org.zstack.core.gc.GC; +import org.zstack.core.gc.GCCompletion; +import org.zstack.core.gc.TimeBasedGarbageCollector; +import org.zstack.core.timeout.ApiTimeoutManager; +import org.zstack.core.upgrade.GrayVersion; +import org.zstack.core.workflow.FlowChainBuilder; +import org.zstack.core.workflow.ShareFlow; +import org.zstack.header.core.Completion; +import org.zstack.header.core.ReturnValueCompletion; +import org.zstack.header.core.WhileDoneCompletion; +import org.zstack.header.core.workflow.*; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.ErrorCodeList; +import org.zstack.header.host.HostConstant; +import org.zstack.header.host.HostStatus; +import org.zstack.header.host.HostVO; +import org.zstack.header.host.HostVO_; +import org.zstack.header.message.MessageReply; +import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.network.l2.L2NetworkUpdateExtensionPoint; +import org.zstack.header.network.l3.*; +import org.zstack.header.network.service.*; +import org.zstack.header.vm.*; +import org.zstack.header.zone.ZoneVO; +import org.zstack.kvm.*; +import org.zstack.kvm.KVMAgentCommands.AgentResponse; +import org.zstack.network.l2.L2NetworkHostHelper; +import org.zstack.network.service.NetworkProviderFinder; +import org.zstack.network.service.NetworkServiceFilter; +import org.zstack.network.service.NetworkServiceManager; +import org.zstack.network.service.userdata.*; +import org.zstack.utils.CollectionUtils; +import org.zstack.utils.Utils; +import org.zstack.utils.function.Function; +import org.zstack.utils.logging.CLogger; +import org.zstack.utils.network.IPv6Constants; + +import javax.persistence.Tuple; +import javax.persistence.TypedQuery; +import java.util.*; +import java.util.concurrent.Callable; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import static org.zstack.core.Platform.operr; + +/** + * Created by frank on 10/13/2015. + */ +public class FlatUserdataBackend implements UserdataBackend, KVMHostConnectExtensionPoint, + L3NetworkDeleteExtensionPoint, L2NetworkUpdateExtensionPoint, VmInstanceMigrateExtensionPoint { + private static final CLogger logger = Utils.getLogger(FlatUserdataBackend.class); + + @Autowired + private CloudBus bus; + @Autowired + private DatabaseFacade dbf; + @Autowired + private ApiTimeoutManager timeoutMgr; + @Autowired + private FlatDhcpBackend dhcpBackend; + @Autowired + private PluginRegistry pluginRgty; + @Autowired + private NetworkServiceManager nsMgr; + + public static final String APPLY_USER_DATA = "/flatnetworkprovider/userdata/apply"; + public static final String BATCH_APPLY_USER_DATA = "/flatnetworkprovider/userdata/batchapply"; + public static final String RELEASE_USER_DATA = "/flatnetworkprovider/userdata/release"; + public static final String CLEANUP_USER_DATA = "/flatnetworkprovider/userdata/cleanup"; + + private String getVmNicMacAddressByVmInstanceId(String vmInstanceId) { + String sql = "SELECT nic.mac " + + "FROM VmInstanceVO vm " + + "JOIN VmNicVO nic ON vm.uuid = nic.vmInstanceUuid " + + "WHERE vm.uuid = :vmInstanceId " + + "AND nic.l3NetworkUuid = vm.defaultL3NetworkUuid"; + + TypedQuery q = dbf.getEntityManager().createQuery(sql, String.class); + q.setParameter("vmInstanceId", vmInstanceId); + + List resultList = q.getResultList(); + if (resultList.isEmpty()) { + return null; + } + return resultList.get(0); + } + + + private String getZoneNameByVmInstanceId(String vmInstanceId) { + VmInstanceVO vmInstance = dbf.findByUuid(vmInstanceId, VmInstanceVO.class); + if (vmInstance == null || vmInstance.getZoneUuid() == null) { + return null; + } + + String zoneId = vmInstance.getZoneUuid(); + + ZoneVO zone = dbf.findByUuid(zoneId, ZoneVO.class); + if (zone == null) { + return null; + } + + return zone.getName(); + } + + private String getDnsServersIp(String vmInstanceId) { + String sql = "SELECT dns.dns FROM VmInstanceVO AS v " + + "JOIN L3NetworkDnsVO AS dns ON v.defaultL3NetworkUuid = dns.l3NetworkUuid " + + "WHERE v.uuid = :vmInstanceId"; + + TypedQuery query = dbf.getEntityManager().createQuery(sql, String.class); + query.setParameter("vmInstanceId", vmInstanceId); + List dnsServers = query.getResultList(); + if (dnsServers.isEmpty()) { + return null; + } + + StringBuilder dnsIpListBuilder = new StringBuilder(); + for (String dnsIp : dnsServers) { + dnsIpListBuilder.append(dnsIp).append("\n"); + } + // 删除最后一个多余的换行符(如果存在) + if (dnsIpListBuilder.length() > 0) { + dnsIpListBuilder.setLength(dnsIpListBuilder.length() - 1); + } + + return dnsIpListBuilder.toString(); + } + + private String getVpcIdByVmInstanceUuid(String vmInstanceUuid) { + String sql = "SELECT DISTINCT vm.uuid " + + "FROM VmInstanceVO vm " + + "JOIN VmNicVO nic ON vm.uuid = nic.vmInstanceUuid " + + "WHERE vm.type = 'ApplianceVm' " + + "AND nic.l3NetworkUuid IN (" + + " SELECT v.defaultL3NetworkUuid " + + " FROM VmInstanceVO v " + + " WHERE v.uuid = :vmInstanceUuid" + + ")"; + + TypedQuery query = dbf.getEntityManager().createQuery(sql, String.class); + query.setParameter("vmInstanceUuid", vmInstanceUuid); + + List results = query.getResultList(); + if (results.isEmpty()) { + return null; + } + + return results.get(0); + } + + private List getNetworkInterfaceDetails(String vmInstanceUuid) { + String sql = "select DISTINCT nic.mac, nic.ip, nic.netmask, nic.gateway, ipr.networkCidr " + + "from VmNicVO nic " + + "join IpRangeVO ipr on nic.l3NetworkUuid = ipr.l3NetworkUuid " + // 加入对IpRangeVO的JOIN + "where nic.vmInstanceUuid = :vmInstanceUuid " + + "and nic.ipVersion = :ipversion " ; + + TypedQuery q = dbf.getEntityManager().createQuery(sql, Tuple.class); + q.setParameter("vmInstanceUuid", vmInstanceUuid); + q.setParameter("ipversion", IPv6Constants.IPv4); + List ts = q.getResultList(); + + List networkInterfaceDetailsList = new ArrayList<>(); + + for (Tuple t : ts) { + NetworkInterfaceDetails details = new NetworkInterfaceDetails(); + details.macAddress = t.get(0, String.class); + details.ip = t.get(1, String.class); + details.netmask = t.get(2, String.class); + details.gateway = t.get(3, String.class); + details.vpcCidrBlock = t.get(4, String.class); + details.vSwitchCidrBlock = t.get(4, String.class); + networkInterfaceDetailsList.add(details); + } + + return networkInterfaceDetailsList; + } + @Override + public Flow createKvmHostConnectingFlow(final KVMHostConnectedContext context) { + return createHostPrepareUserdataFlow(context.getInventory().getUuid()); + } + + private Flow createHostPrepareUserdataFlow(final String hostUuid) { + return new NoRollbackFlow() { + String __name__ = "prepare-userdata"; + + @Transactional(readOnly = true) + private List getVmsNeedUserdataOnHost() { + String sql = "select vm.uuid from VmInstanceVO vm where vm.hostUuid = :huuid and vm.state = :state and vm.type = :type"; + TypedQuery q = dbf.getEntityManager().createQuery(sql, String.class); + q.setParameter("state", VmInstanceState.Running); + q.setParameter("huuid", hostUuid); + q.setParameter("type", VmInstanceConstant.USER_VM_TYPE); + List vmUuids = q.getResultList(); + if (vmUuids.isEmpty()) { + return null; + } + + vmUuids = new NetworkServiceFilter().filterVmByServiceTypeAndProviderType(vmUuids, UserdataConstant.USERDATA_TYPE_STRING, FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING); + if (vmUuids.isEmpty()) { + return null; + } + + return vmUuids; + } + + class VmIpL3Uuid { + String vmIp; + String netmask; + String l3Uuid; + String dhcpServerIp; + } + + @Transactional(readOnly = true) + private Map getVmIpL3Uuid(List vmUuids) { + String sql = "select vm.uuid, ip.ip, ip.l3NetworkUuid, ip.netmask from VmInstanceVO vm," + + "VmNicVO nic, NetworkServiceL3NetworkRefVO ref," + + "NetworkServiceProviderVO pro, UsedIpVO ip where " + + " vm.uuid = nic.vmInstanceUuid and vm.uuid in (:uuids)" + + " and nic.uuid = ip.vmNicUuid " + + " and ip.l3NetworkUuid = vm.defaultL3NetworkUuid and ip.ipVersion = :ipversion" + + " and ref.networkServiceProviderUuid = pro.uuid" + + " and ref.l3NetworkUuid = vm.defaultL3NetworkUuid" + + " and pro.type = :proType"; + + TypedQuery q = dbf.getEntityManager().createQuery(sql, Tuple.class); + q.setParameter("uuids", vmUuids); + q.setParameter("proType", FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING); + /* current only ipv4 has userdata */ + q.setParameter("ipversion", IPv6Constants.IPv4); + List ts = q.getResultList(); + + Map ret = new HashMap(); + for (Tuple t : ts) { + String vmUuid = t.get(0, String.class); + VmIpL3Uuid v = new VmIpL3Uuid(); + v.vmIp = t.get(1, String.class); + v.l3Uuid = t.get(2, String.class); + v.netmask = t.get(3, String.class); + ret.put(vmUuid, v); + } + + return ret; + } + + private List getUserData() { + List vmUuids = getVmsNeedUserdataOnHost(); + if (vmUuids == null) { + return null; + } + + Map vmipl3 = getVmIpL3Uuid(vmUuids); + if (vmipl3.isEmpty()) { + return null; + } + + // filter out vm that not using flat network provider + vmUuids = vmUuids.stream().filter(vmipl3::containsKey).collect(Collectors.toList()); + if (vmUuids.isEmpty()) { + return null; + } + + Map> userdata = new UserdataBuilder().buildByVmUuids(vmUuids); + Set l3Uuids = new HashSet(); + for (VmIpL3Uuid l : vmipl3.values()) { + String dhcpIp = dhcpBackend.allocateDhcpIp(l.l3Uuid, IPv6Constants.IPv4); + if (dhcpIp != null) { + l.dhcpServerIp = dhcpIp; + } + l3Uuids.add(l.l3Uuid); + } + List tos = new ArrayList<>(); + if (l3Uuids.isEmpty()) { + return tos; + } + Map bridgeNames = new BridgeNameFinder().findByL3Uuids(l3Uuids); + List l2Uuids = Q.New(L3NetworkVO.class) + .select(L3NetworkVO_.l2NetworkUuid).in(L3NetworkVO_.uuid, l3Uuids).listValues(); + Map bridgesVlan = new BridgeVlanIdFinder().findByL2Uuids(l2Uuids); + + for (String vmuuid : vmUuids) { + UserdataTO to = new UserdataTO(); + MetadataTO mto = new MetadataTO(); + mto.vmUuid = vmuuid; + mto.vmHostname = VmSystemTags.HOSTNAME.getTokenByResourceUuid(vmuuid, VmSystemTags.HOSTNAME_TOKEN); + mto.regionName = getZoneNameByVmInstanceId(vmuuid); + mto.mac = getVmNicMacAddressByVmInstanceId(vmuuid); + mto.dnsServersIp = getDnsServersIp(vmuuid); + mto.vpcId = getVpcIdByVmInstanceUuid(vmuuid); + to.metadata = mto; + + VmIpL3Uuid l = vmipl3.get(vmuuid); + if (l.vmIp == null) { + continue; + } + + if (bridgeNames.get(l.l3Uuid) == null) { + continue; + } + + if (l.netmask == null) { + /* user data config need netmask */ + logger.info(String.format("can not get netmask for vmnic[ip:%s] for vm[uuid:%s]", + l.vmIp, vmuuid)); + continue; + } + + to.networkInterfaces = getNetworkInterfaceDetails(vmuuid); + to.dhcpServerIp = l.dhcpServerIp; + to.vmIp = l.vmIp; + to.netmask = l.netmask; + to.bridgeName = bridgeNames.get(l.l3Uuid); + to.vlanId = bridgesVlan.get(to.bridgeName); + to.namespaceName = FlatDhcpBackend.makeNamespaceName(to.bridgeName, l.l3Uuid); + if (userdata.get(vmuuid) != null) { + to.userdataList.addAll(userdata.get(vmuuid)); + } + to.port = UserdataGlobalProperty.HOST_PORT; + to.l3NetworkUuid = l.l3Uuid; + to.agentConfig = new HashMap<>(); + for (BeforeUpdateUserdataExtensionPoint ext : pluginRgty.getExtensionList(BeforeUpdateUserdataExtensionPoint.class)) { + ext.beforeApplyUserdata(vmuuid, to); + } + tos.add(to); + } + + return tos; + } + + @Override + public void run(final FlowTrigger trigger, Map data) { + List tos = getUserData(); + if (tos == null) { + trigger.next(); + return; + } + + BatchApplyUserdataCmd cmd = new BatchApplyUserdataCmd(); + cmd.userdata = tos; + cmd.rebuild = true; + + new KvmCommandSender(hostUuid, true).send(cmd, BATCH_APPLY_USER_DATA, new KvmCommandFailureChecker() { + @Override + public ErrorCode getError(KvmResponseWrapper wrapper) { + AgentResponse rsp = wrapper.getResponse(AgentResponse.class); + return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); + } + }, new ReturnValueCompletion(trigger) { + @Override + public void success(KvmResponseWrapper returnValue) { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }; + } + + @Override + public String preDeleteL3Network(L3NetworkInventory inventory) { + return null; + } + + @Override + public void beforeDeleteL3Network(L3NetworkInventory inventory) { + } + + @Override + public void afterDeleteL3Network(L3NetworkInventory l3) { + Optional o = l3.getNetworkServices().stream().filter(n -> n.getNetworkServiceType().equals(UserdataConstant.USERDATA_TYPE_STRING)).findAny(); + if (!o.isPresent()) { + return; + } + + NetworkServiceL3NetworkRefInventory ref = o.get(); + if (!dbf.isExist(ref.getNetworkServiceProviderUuid(), NetworkServiceProviderVO.class)) { + return; + } + + List hostUuids = new Callable>() { + @Override + @Transactional(readOnly = true) + public List call() { + String sql = "select h.uuid from HostVO h, L2NetworkClusterRefVO ref where h.clusterUuid = ref.clusterUuid" + + " and ref.l2NetworkUuid = :l2Uuid and h.hypervisorType = :hvType"; + TypedQuery q = dbf.getEntityManager().createQuery(sql, String.class); + q.setParameter("l2Uuid", l3.getL2NetworkUuid()); + q.setParameter("hvType", KVMConstant.KVM_HYPERVISOR_TYPE); + return q.getResultList(); + } + }.call(); + + if (hostUuids.isEmpty()) { + return; + } + + CleanupUserdataCmd cmd = new CleanupUserdataCmd(); + cmd.bridgeName = new BridgeNameFinder().findByL3Uuid(l3.getUuid()); + cmd.l3NetworkUuid = l3.getUuid(); + cmd.namespaceName = FlatDhcpBackend.makeNamespaceName(cmd.bridgeName, cmd.l3NetworkUuid); + + for (String huuid : hostUuids) { + new KvmCommandSender(huuid).send(cmd, CLEANUP_USER_DATA, new KvmCommandFailureChecker() { + @Override + public ErrorCode getError(KvmResponseWrapper w) { + CleanupUserdataRsp rsp = w.getResponse(CleanupUserdataRsp.class); + return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); + } + }, new ReturnValueCompletion(null) { + @Override + public void success(KvmResponseWrapper w) { + logger.debug(String.format("successfully cleanup userdata service on the host[uuid:%s] for the deleted L3 network[uuid:%s, name:%s]", + huuid, l3.getUuid(), l3.getName())); + } + + @Override + public void fail(ErrorCode errorCode) { + //TODO: Add GC + logger.warn(errorCode.toString()); + } + }); + } + } + + private UserdataStruct makeUserdataStructForMigratingVm(VmInstanceInventory inv, String hostUuid) { + if (!nsMgr.isVmNeedNetworkService(inv.getType(), UserdataConstant.USERDATA_TYPE)) { + return null; + } + + String providerType = new NetworkProviderFinder().getNetworkProviderTypeByNetworkServiceType(inv.getDefaultL3NetworkUuid(), UserdataConstant.USERDATA_TYPE_STRING); + if (!FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING.equals(providerType)) { + return null; + } + + List userdataList = new UserdataBuilder().buildByVmUuid(inv.getUuid()); + if (userdataList == null) { + // Apply userdata anyway after migrating VM to redeploy lighttpd server + // so that the VM can still send metric data to pushgateway through lighttpd + userdataList = Collections.emptyList(); + } + + UserdataStruct struct = new UserdataStruct(); + struct.setParametersFromVmInventory(inv); + struct.setHostUuid(hostUuid); + struct.setL3NetworkUuid(inv.getDefaultL3NetworkUuid()); + struct.setUserdataList(userdataList); + return struct; + } + + + @Override + public void preMigrateVm(VmInstanceInventory inv, String destHostUuid, Completion completion) { + UserdataStruct struct = makeUserdataStructForMigratingVm(inv, destHostUuid); + if (struct == null) { + completion.success(); + return; + } + + applyUserdata(struct, completion); + } + + @Override + public void beforeMigrateVm(VmInstanceInventory inv, String destHostUuid) { + + } + + public static class UserdataReleseGC extends TimeBasedGarbageCollector { + public static long INTERVAL = 300; + + @GC + public UserdataStruct struct; + + @Override + protected void triggerNow(GCCompletion completion) { + + HostStatus status = Q.New(HostVO.class).select(HostVO_.status).eq(HostVO_.uuid, struct.getHostUuid()).findValue(); + if (status == null) { + // host deleted + completion.cancel(); + return; + } + + if (status != HostStatus.Connected) { + completion.fail(operr("host[uuid:%s] is not connected", struct.getHostUuid())); + return; + } + + String vmIp = CollectionUtils.find(struct.getVmNics(), arg -> arg.getL3NetworkUuid().equals(struct.getL3NetworkUuid()) ? arg.getIp() : null); + if (vmIp == null) { + completion.cancel(); + return; + } + + ReleaseUserdataCmd cmd = new ReleaseUserdataCmd(); + cmd.hostUuid = struct.getHostUuid(); + cmd.bridgeName = new BridgeNameFinder().findByL3Uuid(struct.getL3NetworkUuid()); + cmd.namespaceName = FlatDhcpBackend.makeNamespaceName(cmd.bridgeName, struct.getL3NetworkUuid()); + cmd.vmIp = vmIp; + + KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); + msg.setHostUuid(struct.getHostUuid()); + msg.setCommand(cmd); + msg.setPath(RELEASE_USER_DATA); + bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, struct.getHostUuid()); + bus.send(msg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + completion.fail(reply.getError()); + return; + } + + KVMHostAsyncHttpCallReply r = reply.castReply(); + ReleaseUserdataRsp rsp = r.toResponse(ReleaseUserdataRsp.class); + if (!rsp.isSuccess()) { + completion.fail(operr("operation error, because:%s", rsp.getError())); + return; + } + + completion.success(); + } + }); + } + } + + @Override + public void afterMigrateVm(VmInstanceInventory inv, String srcHostUuid) { + UserdataStruct struct = makeUserdataStructForMigratingVm(inv, srcHostUuid); + if (struct == null) { + return; + } + + releaseUserdata(struct, new Completion(null) { + @Override + public void success() { + // nothing + } + + @Override + public void fail(ErrorCode errorCode) { + logger.warn(String.format("failed to release userdata on the source host[uuid:%s]" + + " for the migrated VM[uuid: %s, name:%s], %s. GC will take care it", srcHostUuid, inv.getUuid(), inv.getName(), errorCode)); + UserdataReleseGC gc = new UserdataReleseGC(); + gc.struct = struct; + gc.submit(UserdataReleseGC.INTERVAL, TimeUnit.SECONDS); + } + }); + } + + @Override + public void failedToMigrateVm(VmInstanceInventory inv, String destHostUuid, ErrorCode reason) { + if (destHostUuid == null) { + return; + } + + UserdataStruct struct = makeUserdataStructForMigratingVm(inv, destHostUuid); + if (struct == null) { + return; + } + + // clean the userdata that set on the dest host + releaseUserdata(struct, new Completion(null) { + @Override + public void success() { + // nothing + } + + @Override + public void fail(ErrorCode errorCode) { + UserdataReleseGC gc = new UserdataReleseGC(); + gc.struct = struct; + gc.submit(UserdataReleseGC.INTERVAL, TimeUnit.SECONDS); + } + }); + } + + public static class UserdataTO { + public MetadataTO metadata; + public List networkInterfaces; + public List userdataList = new ArrayList<>(); + public String vmIp; + public String netmask; + public String dhcpServerIp; + public String bridgeName; + public String vlanId; + public String namespaceName; + public String l3NetworkUuid; + public Map agentConfig; + public int port; + } + + public static class MetadataTO { + public String vmUuid; + public String vmHostname; + public String regionName; + public String mac; + public String dnsServersIp; + public String vpcId; + } + + public static class NetworkInterfaceDetails { + public String macAddress; + public String ip; + public String vpcCidrBlock; + public String vSwitchCidrBlock; + public String netmask; + public String gateway; + } + + public static class CleanupUserdataCmd extends KVMAgentCommands.AgentCommand { + @GrayVersion(value = "5.0.0") + public String bridgeName; + @GrayVersion(value = "5.0.0") + public String l3NetworkUuid; + @GrayVersion(value = "5.0.0") + public String namespaceName; + } + + public static class CleanupUserdataRsp extends KVMAgentCommands.AgentResponse { + + } + + public static class BatchApplyUserdataCmd extends KVMAgentCommands.AgentCommand { + @GrayVersion(value = "5.0.0") + public List userdata; + @GrayVersion(value = "5.0.0") + public boolean rebuild; + } + + public static class ApplyUserdataCmd extends KVMAgentCommands.AgentCommand { + @GrayVersion(value = "5.0.0") + public String hostUuid; + @GrayVersion(value = "5.0.0") + public UserdataTO userdata; + } + + public static class ApplyUserdataRsp extends KVMAgentCommands.AgentResponse { + + } + + public static class ReleaseUserdataCmd extends KVMAgentCommands.AgentCommand { + @GrayVersion(value = "5.0.0") + public String hostUuid; + @GrayVersion(value = "5.0.0") + public String vmIp; + @GrayVersion(value = "5.0.0") + public String bridgeName; + @GrayVersion(value = "5.0.0") + public String namespaceName; + } + + public static class ReleaseUserdataRsp extends KVMAgentCommands.AgentResponse { + } + + @Override + public NetworkServiceProviderType getProviderType() { + return FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE; + } + + private boolean hasMetedata(UserdataStruct struct) { + return VmSystemTags.HOSTNAME.getTokenByResourceUuid(struct.getVmUuid(), VmSystemTags.HOSTNAME_TOKEN) != null; + } + + private boolean hasUserdata(UserdataStruct struct) { + return struct.getUserdataList() != null && !struct.getUserdataList().isEmpty(); + } + + @Override + public void applyUserdata(final UserdataStruct struct, final Completion completion) { + if (!UserdataGlobalConfig.OPEN_USERDATA_SERVICE_BY_DEFAULT.value(Boolean.class)) { + if ( !hasMetedata(struct) && !hasUserdata(struct)) { + completion.success(); + return; + } + } + + if (new FlatNetworkServiceValidator().validate(struct.getHostUuid())) { + completion.success(); + return; + } + + VmNicInventory destNic = CollectionUtils.find(struct.getVmNics(), new Function() { + @Override + public VmNicInventory call(VmNicInventory arg) { + return arg.getL3NetworkUuid().equals(struct.getL3NetworkUuid()) ? arg : null; + } + }); + + if (destNic == null) { + completion.success(); + return; + } + + L3NetworkVO defaultL3 = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.uuid, struct.getL3NetworkUuid()).find(); + if (defaultL3!= null && defaultL3.getNetworkServices().stream().noneMatch( + service -> Objects.equals(UserdataConstant.USERDATA_TYPE_STRING, service.getNetworkServiceType()))) { + completion.success(); + return; + } + + UsedIpVO ipv4 = Q.New(UsedIpVO.class).eq(UsedIpVO_.vmNicUuid, destNic.getUuid()) + .eq(UsedIpVO_.ipVersion, IPv6Constants.IPv4).limit(1).find(); + if (ipv4 == null) { + // userdata depends on the ipv4 address + completion.success(); + return; + } + if (StringUtils.isEmpty(ipv4.getNetmask())) { + // userdata depends on the ipv4 netmask + logger.info(String.format("can not get netmask for vmnic[ip:%s] for vm[uuid:%s]", + ipv4.getIp(), struct.getVmUuid())); + completion.success(); + return; + } + + + FlowChain chain = FlowChainBuilder.newShareFlowChain(); + chain.setName(String.format("flat-network-userdata-set-for-vm-%s", struct.getVmUuid())); + chain.then(new ShareFlow() { + String dhcpServerIp; + + @Override + public void setup() { + flow(new NoRollbackFlow() { + String __name__ = "get-dhcp-server-ip"; + + @Override + public void run(final FlowTrigger trigger, Map data) { + FlatDhcpAcquireDhcpServerIpMsg msg = new FlatDhcpAcquireDhcpServerIpMsg(); + msg.setL3NetworkUuid(struct.getL3NetworkUuid()); + bus.makeTargetServiceIdByResourceUuid(msg, FlatNetworkServiceConstant.SERVICE_ID, struct.getL3NetworkUuid()); + bus.send(msg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + return; + } + + FlatDhcpAcquireDhcpServerIpReply dreply = (FlatDhcpAcquireDhcpServerIpReply) reply; + if (dreply.getDhcpServerList() != null && !dreply.getDhcpServerList().isEmpty()) { + dhcpServerIp = dreply.getDhcpServerList().get(0).getIp(); + } + + + trigger.next(); + } + }); + } + }); + + flow(new NoRollbackFlow() { + String __name__ = "apply-user-data"; + + @Override + public void run(final FlowTrigger trigger, Map data) { + ApplyUserdataCmd cmd = new ApplyUserdataCmd(); + cmd.hostUuid = struct.getHostUuid(); + + MetadataTO to = new MetadataTO(); + to.vmUuid = struct.getVmUuid(); + to.vmHostname = VmSystemTags.HOSTNAME.getTokenByResourceUuid(struct.getVmUuid(), VmSystemTags.HOSTNAME_TOKEN); + to.regionName = getZoneNameByVmInstanceId(struct.getVmUuid()); + to.mac = destNic.getMac(); + to.dnsServersIp = getDnsServersIp(struct.getVmUuid()); + to.vpcId = getVpcIdByVmInstanceUuid(struct.getVmUuid()); + UserdataTO uto = new UserdataTO(); + uto.metadata = to; + uto.networkInterfaces = getNetworkInterfaceDetails(struct.getVmUuid()); + uto.userdataList = struct.getUserdataList(); + uto.dhcpServerIp = dhcpServerIp; + uto.vmIp = ipv4.getIp(); + uto.netmask = ipv4.getNetmask(); + uto.bridgeName = new BridgeNameFinder().findByL3Uuid(struct.getL3NetworkUuid()); + uto.vlanId = new BridgeVlanIdFinder().findByL2Uuid(defaultL3.getL2NetworkUuid(), false); + uto.namespaceName = FlatDhcpBackend.makeNamespaceName(uto.bridgeName, struct.getL3NetworkUuid()); + uto.port = UserdataGlobalProperty.HOST_PORT; + uto.l3NetworkUuid = struct.getL3NetworkUuid(); + uto.agentConfig = new HashMap<>(); + for (BeforeUpdateUserdataExtensionPoint ext : pluginRgty.getExtensionList(BeforeUpdateUserdataExtensionPoint.class)) { + ext.beforeApplyUserdata(struct.getVmUuid(), uto); + } + cmd.userdata = uto; + + KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); + msg.setHostUuid(struct.getHostUuid()); + msg.setCommand(cmd); + msg.setPath(APPLY_USER_DATA); + bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, struct.getHostUuid()); + bus.send(msg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + return; + } + + KVMHostAsyncHttpCallReply r = reply.castReply(); + ApplyUserdataRsp rsp = r.toResponse(ApplyUserdataRsp.class); + if (!rsp.isSuccess()) { + trigger.fail(operr("operation error, because:%s", rsp.getError())); + return; + } + + trigger.next(); + } + }); + } + }); + + done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }); + + error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }); + } + }).start(); + } + + @Override + public void releaseUserdata(final UserdataStruct struct, final Completion completion) { + if (new FlatNetworkServiceValidator().validate(struct.getHostUuid())) { + completion.success(); + return; + } + + + VmNicInventory destNic = CollectionUtils.find(struct.getVmNics(), new Function() { + @Override + public VmNicInventory call(VmNicInventory arg) { + return arg.getL3NetworkUuid().equals(struct.getL3NetworkUuid()) ? arg : null; + } + }); + + if (destNic == null) { + completion.success(); + return; + } + + UsedIpInventory ipv4 = destNic.getUsedIps().stream().filter(ip -> ip.getIpVersion() == IPv6Constants.IPv4).findAny().orElse(null); + if (ipv4 == null) { + // userdata depends on the ipv4 address + completion.success(); + return; + } + + FlowChain chain = FlowChainBuilder.newShareFlowChain(); + chain.setName(String.format("flat-network-userdata-release-for-vm-%s", struct.getVmUuid())); + chain.then(new ShareFlow() { + @Override + public void setup() { + flow(new NoRollbackFlow() { + String __name__ = "release-user-data"; + + @Override + public void run(final FlowTrigger trigger, Map data) { + ReleaseUserdataCmd cmd = new ReleaseUserdataCmd(); + cmd.hostUuid = struct.getHostUuid(); + cmd.bridgeName = new BridgeNameFinder().findByL3Uuid(struct.getL3NetworkUuid()); + cmd.namespaceName = FlatDhcpBackend.makeNamespaceName(cmd.bridgeName, struct.getL3NetworkUuid()); + cmd.vmIp = ipv4.getIp(); + + KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); + msg.setHostUuid(struct.getHostUuid()); + msg.setCommand(cmd); + msg.setPath(RELEASE_USER_DATA); + bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, struct.getHostUuid()); + bus.send(msg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + return; + } + + KVMHostAsyncHttpCallReply r = reply.castReply(); + ReleaseUserdataRsp rsp = r.toResponse(ReleaseUserdataRsp.class); + if (!rsp.isSuccess()) { + trigger.fail(operr("operation error, because:%s", rsp.getError())); + return; + } + + trigger.next(); + } + }); + } + }); + + done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }); + + error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }); + } + }).start(); + } + + @Override + public void beforeChangeL2NetworkVlanId(L2NetworkInventory l2Inv) { + + } + + @Override + public void afterChangeL2NetworkVlanId(L2NetworkInventory l2Inv) { + new While<>(L2NetworkHostHelper.getHostsByL2NetworkAttachedCluster(l2Inv)).step((host, whileCompletion) -> { + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("after-l2-%s-changed-flat-network-userdata-apply-in-host-%s", + l2Inv.getUuid(), host.getUuid())); + chain.then(createHostPrepareUserdataFlow(host.getUuid())); + chain.done(new FlowDoneHandler(whileCompletion) { + @Override + public void handle(Map data) { + whileCompletion.done(); + } + }).error(new FlowErrorHandler(whileCompletion) { + @Override + public void handle(ErrorCode errCode, Map data) { + whileCompletion.addError(errCode); + whileCompletion.allDone(); + } + }).start(); + },10).run(new WhileDoneCompletion(null) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + logger.error(String.format("apply userdata failed after L2Network changed, because:%s", + errorCodeList.getCauses().get(0))); + } else { + logger.debug("apply userdata successful after L2Network changed"); + } + } + }); + } +} diff --git a/portal/src/main/java/org/zstack/portal/apimediator/ApiMessageProcessorImpl.java b/portal/src/main/java/org/zstack/portal/apimediator/ApiMessageProcessorImpl.java index f2d556912fa..9308df4be06 100755 --- a/portal/src/main/java/org/zstack/portal/apimediator/ApiMessageProcessorImpl.java +++ b/portal/src/main/java/org/zstack/portal/apimediator/ApiMessageProcessorImpl.java @@ -1,293 +1,293 @@ -package org.zstack.portal.apimediator; - -import org.springframework.beans.factory.NoSuchBeanDefinitionException; -import org.springframework.beans.factory.annotation.Autowire; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Configurable; -import org.zstack.core.CoreGlobalProperty; -import org.zstack.core.Platform; -import org.zstack.core.cloudbus.CloudBus; -import org.zstack.core.componentloader.ComponentLoader; -import org.zstack.core.componentloader.PluginRegistry; -import org.zstack.core.db.DatabaseFacade; -import org.zstack.core.errorcode.ErrorFacade; -import org.zstack.header.apimediator.ApiMessageInterceptionException; -import org.zstack.header.apimediator.ApiMessageInterceptor; -import org.zstack.header.apimediator.GlobalApiMessageInterceptor; -import org.zstack.header.apimediator.GlobalApiMessageInterceptor.InterceptorPosition; -import org.zstack.header.exception.CloudRuntimeException; -import org.zstack.header.message.*; -import org.zstack.portal.apimediator.schema.Service; -import org.zstack.utils.FieldUtils; -import org.zstack.utils.Utils; -import org.zstack.utils.logging.CLogger; -import org.zstack.utils.path.PathUtil; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; -import java.io.File; -import java.lang.reflect.Field; -import java.util.*; - -/** - * Created with IntelliJ IDEA. - * User: frank - * Time: 11:46 PM - * To change this template use File | Settings | File Templates. - */ -@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) -public class ApiMessageProcessorImpl implements ApiMessageProcessor { - private static CLogger logger = Utils.getLogger(ApiMessageProcessorImpl.class); - private Map descriptors = new HashMap(); - private Map> globalInterceptors = new HashMap>(); - private Set globalInterceptorsForAllMsg = new HashSet(); - private Comparator msgInterceptorComparator = Comparator - .comparingInt(ApiMessageProcessorImpl::interceptorPositionToOrder) - .thenComparing(ApiMessageInterceptor::getPriority); - - private static int interceptorPositionToOrder(ApiMessageInterceptor interceptor) { - if (interceptor instanceof GlobalApiMessageInterceptor) { - return ((GlobalApiMessageInterceptor) interceptor).getPosition().ordinal(); - } - - return InterceptorPosition.DEFAULT.ordinal(); - } - - @Autowired - private PluginRegistry pluginRgty; - @Autowired - private ErrorFacade errf; - @Autowired - private DatabaseFacade dbf; - @Autowired - private CloudBus bus; - - private boolean unitTestOn; - // add switch to skip api check for minimal - private boolean minimalOn; - private List configFolders; - List supportApis; - - private void dump() { - StringBuilder sb = new StringBuilder(); - for (Map.Entry e : descriptors.entrySet()) { - ApiMessageDescriptor desc = e.getValue(); - sb.append("\n-------------------------------------------"); - sb.append(String.format("\nname: %s", desc.getName())); - sb.append(String.format("\nconfigured service id: %s", desc.getServiceId())); - sb.append(String.format("\nconfig path: %s", desc.getConfigPath())); - List inc = new ArrayList(); - for (ApiMessageInterceptor ic : desc.getInterceptors()) { - inc.add(ic.getClass().getName()); - } - sb.append(String.format("\ninterceptors: %s", inc)); - sb.append("\n-------------------------------------------"); - } - - logger.debug(String.format("ApiMessageDescriptor dump:\n%s", sb.toString())); - } - - public ApiMessageProcessorImpl(Map config) { - this.unitTestOn = CoreGlobalProperty.UNIT_TEST_ON; - this.minimalOn = Platform.isMinimalOn(); - this.configFolders = (List )config.get("serviceConfigFolders"); - this.supportApis = new ArrayList<>(); - - populateGlobalInterceptors(); - - try { - JAXBContext context = JAXBContext.newInstance("org.zstack.portal.apimediator.schema"); - List paths = new ArrayList(); - for (String configFolder : this.configFolders) { - paths.addAll(PathUtil.scanFolderOnClassPath(configFolder)); - } - - for (String p : paths) { - if (!p.endsWith(".xml")) { - logger.warn(String.format("ignore %s which is not ending with .xml", p)); - continue; - } - - File cfg = new File(p); - Unmarshaller unmarshaller = context.createUnmarshaller(); - Service schema = (Service) unmarshaller.unmarshal(cfg); - createDescriptor(schema, cfg.getAbsolutePath()); - } - - if (!this.unitTestOn) { - dump(); - } - } catch (JAXBException e) { - throw new CloudRuntimeException(e); - } - } - - private void prepareInterceptors(ApiMessageDescriptor desc, Service.Message mschema, Service schema) { - ComponentLoader loader = Platform.getComponentLoader(); - List interceptors = new ArrayList(); - List icNames = new ArrayList(); - icNames.addAll(mschema.getInterceptor()); - icNames.addAll(schema.getInterceptor()); - for (String name : icNames) { - try { - ApiMessageInterceptor ic = loader.getComponentByBeanName(name); - interceptors.add(ic); - } catch (NoSuchBeanDefinitionException ne) { - if (this.minimalOn) { - continue; - } - if (!this.unitTestOn) { - throw new CloudRuntimeException(String.format("Cannot find ApiMessageInterceptor[%s] for message[%s] described in %s. Make sure the ApiMessageInterceptor is configured in spring bean xml file", name, desc.getName(), desc.getConfigPath()), ne); - } - } - } - - Set gis = new HashSet(); - for (Map.Entry> e : globalInterceptors.entrySet()) { - Class baseMsgClz = e.getKey(); - if (baseMsgClz.isAssignableFrom(desc.getClazz())) { - gis.addAll(e.getValue()); - } - } - - List globalInterceptors = new ArrayList<>(); - - for (GlobalApiMessageInterceptor gi : gis) { - if (logger.isTraceEnabled()) { - logger.trace(String.format("install GlobalApiMessageInterceptor[%s] to message[%s]", gi.getClass().getName(), desc.getClazz().getName())); - } - globalInterceptors.add(gi); - } - - for (GlobalApiMessageInterceptor gi : globalInterceptorsForAllMsg) { - if (logger.isTraceEnabled()) { - logger.trace(String.format("install GlobalApiMessageInterceptor[%s] to message[%s]", gi.getClass().getName(), desc.getClazz().getName())); - } - globalInterceptors.add(gi); - } - - globalInterceptors.addAll(interceptors); - globalInterceptors.sort(this.msgInterceptorComparator); - - desc.setInterceptors(globalInterceptors); - } - - - private void createDescriptor(Service schema, String cfgPath) { - for (Service.Message mschema : schema.getMessage()) { - Class msgClz = null; - try { - msgClz = Class.forName(mschema.getName()); - } catch (ClassNotFoundException e) { - String err = String.format("unable to create ApiMessageDescriptor for message[name:%s, path:%s]", mschema.getName(), cfgPath); - throw new CloudRuntimeException(err, e); - } - - ApiMessageDescriptor old = descriptors.get(msgClz); - if (old != null) { - throw new CloudRuntimeException(String.format("Duplicate message description. Message[%s] is described in %s and %s", mschema.getName(), old.getConfigPath(), cfgPath)); - } - - ApiMessageDescriptor desc = new ApiMessageDescriptor(); - desc.setName(mschema.getName()); - String serviceId = mschema.getServiceId() != null ? mschema.getServiceId() : schema.getId(); - desc.setServiceId(serviceId); - desc.setConfigPath(cfgPath); - desc.setClazz(msgClz); - - prepareInterceptors(desc, mschema, schema); - List services = pluginRgty.getExtensionList(org.zstack.header.Service.class); - if (services.stream().anyMatch(it -> bus.makeLocalServiceId(desc.getServiceId()).equals(it.getId()))) { - supportApis.add(desc.getClazz().getSimpleName()); - } - buildApiParams(desc); - - descriptors.put(msgClz, desc); - } - } - - private void buildApiParams(ApiMessageDescriptor desc) { - Class msgClz = desc.getClazz(); - List fields = FieldUtils.getAllFields(msgClz); - - class FP { - Field field; - APIParam param; - } - - Map fmap = new HashMap(); - for (Field f : fields) { - APIParam at = f.getAnnotation(APIParam.class); - if (at == null) { - continue; - } - - FP fp = new FP(); - fp.field = f; - fp.param = f.getAnnotation(APIParam.class); - fmap.put(f.getName(), fp); - } - - OverriddenApiParams at = desc.getClazz().getAnnotation(OverriddenApiParams.class); - if (at != null) { - for (OverriddenApiParam atp : at.value()) { - Field f = FieldUtils.getField(atp.field(), msgClz); - if (f == null) { - throw new CloudRuntimeException(String.format("cannot find the field[%s] specified in @OverriddenApiParam of class[%s]", - atp.field(), msgClz)); - } - - FP fp = new FP(); - fp.field = f; - fp.param = atp.param(); - fmap.put(atp.field(), fp); - } - } - - for (FP fp : fmap.values()) { - desc.getFieldApiParams().put(fp.field, fp.param); - } - } - - @Override - public APIMessage process(APIMessage msg) throws ApiMessageInterceptionException { - ApiMessageDescriptor desc = descriptors.get(msg.getClass()); - if (desc == null) { - throw new CloudRuntimeException(String.format("Message[%s] has no ApiMessageDescriptor", msg.getClass().getName())); - } - - for (ApiMessageInterceptor ic : desc.getInterceptors()) { - msg = ic.intercept(msg); - } - - return msg; - } - - @Override - public ApiMessageDescriptor getApiMessageDescriptor(APIMessage msg) { - return descriptors.get(msg.getClass()); - } - - @Override - public List getSupportApis() { - return supportApis; - } - - private void populateGlobalInterceptors() { - for (GlobalApiMessageInterceptor gi : pluginRgty.getExtensionList(GlobalApiMessageInterceptor.class)) { - if (gi.getMessageClassToIntercept() == null) { - globalInterceptorsForAllMsg.add(gi); - } else { - for (Class msgClz : gi.getMessageClassToIntercept()) { - Set gis = globalInterceptors.get(msgClz); - if (gis == null) { - gis = new HashSet(); - globalInterceptors.put(msgClz, gis); - } - gis.add(gi); - } - } - } - } -} +package org.zstack.portal.apimediator; + +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Configurable; +import org.zstack.core.CoreGlobalProperty; +import org.zstack.core.Platform; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.componentloader.ComponentLoader; +import org.zstack.core.componentloader.PluginRegistry; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.errorcode.ErrorFacade; +import org.zstack.header.apimediator.ApiMessageInterceptionException; +import org.zstack.header.apimediator.ApiMessageInterceptor; +import org.zstack.header.apimediator.GlobalApiMessageInterceptor; +import org.zstack.header.apimediator.GlobalApiMessageInterceptor.InterceptorPosition; +import org.zstack.header.exception.CloudRuntimeException; +import org.zstack.header.message.*; +import org.zstack.portal.apimediator.schema.Service; +import org.zstack.utils.FieldUtils; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; +import org.zstack.utils.path.PathUtil; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import java.io.File; +import java.lang.reflect.Field; +import java.util.*; + +/** + * Created with IntelliJ IDEA. + * User: frank + * Time: 11:46 PM + * To change this template use File | Settings | File Templates. + */ +@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) +public class ApiMessageProcessorImpl implements ApiMessageProcessor { + private static CLogger logger = Utils.getLogger(ApiMessageProcessorImpl.class); + private Map descriptors = new HashMap(); + private Map> globalInterceptors = new HashMap>(); + private Set globalInterceptorsForAllMsg = new HashSet(); + private Comparator msgInterceptorComparator = Comparator + .comparingInt(ApiMessageProcessorImpl::interceptorPositionToOrder) + .thenComparing(ApiMessageInterceptor::getPriority); + + private static int interceptorPositionToOrder(ApiMessageInterceptor interceptor) { + if (interceptor instanceof GlobalApiMessageInterceptor) { + return ((GlobalApiMessageInterceptor) interceptor).getPosition().ordinal(); + } + + return InterceptorPosition.DEFAULT.ordinal(); + } + + @Autowired + private PluginRegistry pluginRgty; + @Autowired + private ErrorFacade errf; + @Autowired + private DatabaseFacade dbf; + @Autowired + private CloudBus bus; + + private boolean unitTestOn; + // add switch to skip api check for minimal + private boolean minimalOn; + private List configFolders; + List supportApis; + + private void dump() { + StringBuilder sb = new StringBuilder(); + for (Map.Entry e : descriptors.entrySet()) { + ApiMessageDescriptor desc = e.getValue(); + sb.append("\n-------------------------------------------"); + sb.append(String.format("\nname: %s", desc.getName())); + sb.append(String.format("\nconfigured service id: %s", desc.getServiceId())); + sb.append(String.format("\nconfig path: %s", desc.getConfigPath())); + List inc = new ArrayList(); + for (ApiMessageInterceptor ic : desc.getInterceptors()) { + inc.add(ic.getClass().getName()); + } + sb.append(String.format("\ninterceptors: %s", inc)); + sb.append("\n-------------------------------------------"); + } + + logger.debug(String.format("ApiMessageDescriptor dump:\n%s", sb.toString())); + } + + public ApiMessageProcessorImpl(Map config) { + this.unitTestOn = CoreGlobalProperty.UNIT_TEST_ON; + this.minimalOn = Platform.isMinimalOn(); + this.configFolders = (List )config.get("serviceConfigFolders"); + this.supportApis = new ArrayList<>(); + + populateGlobalInterceptors(); + + try { + JAXBContext context = JAXBContext.newInstance("org.zstack.portal.apimediator.schema"); + List paths = new ArrayList(); + for (String configFolder : this.configFolders) { + paths.addAll(PathUtil.scanFolderOnClassPath(configFolder)); + } + + for (String p : paths) { + if (!p.endsWith(".xml")) { + logger.warn(String.format("ignore %s which is not ending with .xml", p)); + continue; + } + + File cfg = new File(p); + Unmarshaller unmarshaller = context.createUnmarshaller(); + Service schema = (Service) unmarshaller.unmarshal(cfg); + createDescriptor(schema, cfg.getAbsolutePath()); + } + + if (!this.unitTestOn) { + dump(); + } + } catch (JAXBException e) { + throw new CloudRuntimeException(e); + } + } + + private void prepareInterceptors(ApiMessageDescriptor desc, Service.Message mschema, Service schema) { + ComponentLoader loader = Platform.getComponentLoader(); + List interceptors = new ArrayList(); + List icNames = new ArrayList(); + icNames.addAll(mschema.getInterceptor()); + icNames.addAll(schema.getInterceptor()); + for (String name : icNames) { + try { + ApiMessageInterceptor ic = loader.getComponentByBeanName(name); + interceptors.add(ic); + } catch (NoSuchBeanDefinitionException ne) { + if (this.minimalOn) { + continue; + } + if (!this.unitTestOn) { + throw new CloudRuntimeException(String.format("Cannot find ApiMessageInterceptor[%s] for message[%s] described in %s. Make sure the ApiMessageInterceptor is configured in spring bean xml file", name, desc.getName(), desc.getConfigPath()), ne); + } + } + } + + Set gis = new HashSet(); + for (Map.Entry> e : globalInterceptors.entrySet()) { + Class baseMsgClz = e.getKey(); + if (baseMsgClz.isAssignableFrom(desc.getClazz())) { + gis.addAll(e.getValue()); + } + } + + List globalInterceptors = new ArrayList<>(); + + for (GlobalApiMessageInterceptor gi : gis) { + if (logger.isTraceEnabled()) { + logger.trace(String.format("install GlobalApiMessageInterceptor[%s] to message[%s]", gi.getClass().getName(), desc.getClazz().getName())); + } + globalInterceptors.add(gi); + } + + for (GlobalApiMessageInterceptor gi : globalInterceptorsForAllMsg) { + if (logger.isTraceEnabled()) { + logger.trace(String.format("install GlobalApiMessageInterceptor[%s] to message[%s]", gi.getClass().getName(), desc.getClazz().getName())); + } + globalInterceptors.add(gi); + } + + globalInterceptors.addAll(interceptors); + globalInterceptors.sort(this.msgInterceptorComparator); + + desc.setInterceptors(globalInterceptors); + } + + + private void createDescriptor(Service schema, String cfgPath) { + for (Service.Message mschema : schema.getMessage()) { + Class msgClz = null; + try { + msgClz = Class.forName(mschema.getName()); + } catch (ClassNotFoundException e) { + String err = String.format("unable to create ApiMessageDescriptor for message[name:%s, path:%s]", mschema.getName(), cfgPath); + throw new CloudRuntimeException(err, e); + } + + ApiMessageDescriptor old = descriptors.get(msgClz); + if (old != null) { + throw new CloudRuntimeException(String.format("Duplicate message description. Message[%s] is described in %s and %s", mschema.getName(), old.getConfigPath(), cfgPath)); + } + + ApiMessageDescriptor desc = new ApiMessageDescriptor(); + desc.setName(mschema.getName()); + String serviceId = mschema.getServiceId() != null ? mschema.getServiceId() : schema.getId(); + desc.setServiceId(serviceId); + desc.setConfigPath(cfgPath); + desc.setClazz(msgClz); + + prepareInterceptors(desc, mschema, schema); + List services = pluginRgty.getExtensionList(org.zstack.header.Service.class); + if (services.stream().anyMatch(it -> bus.makeLocalServiceId(desc.getServiceId()).equals(it.getId()))) { + supportApis.add(desc.getClazz().getSimpleName()); + } + buildApiParams(desc); + + descriptors.put(msgClz, desc); + } + } + + private void buildApiParams(ApiMessageDescriptor desc) { + Class msgClz = desc.getClazz(); + List fields = FieldUtils.getAllFields(msgClz); + + class FP { + Field field; + APIParam param; + } + + Map fmap = new HashMap(); + for (Field f : fields) { + APIParam at = f.getAnnotation(APIParam.class); + if (at == null) { + continue; + } + + FP fp = new FP(); + fp.field = f; + fp.param = f.getAnnotation(APIParam.class); + fmap.put(f.getName(), fp); + } + + OverriddenApiParams at = desc.getClazz().getAnnotation(OverriddenApiParams.class); + if (at != null) { + for (OverriddenApiParam atp : at.value()) { + Field f = FieldUtils.getField(atp.field(), msgClz); + if (f == null) { + throw new CloudRuntimeException(String.format("cannot find the field[%s] specified in @OverriddenApiParam of class[%s]", + atp.field(), msgClz)); + } + + FP fp = new FP(); + fp.field = f; + fp.param = atp.param(); + fmap.put(atp.field(), fp); + } + } + + for (FP fp : fmap.values()) { + desc.getFieldApiParams().put(fp.field, fp.param); + } + } + + @Override + public APIMessage process(APIMessage msg) throws ApiMessageInterceptionException { + ApiMessageDescriptor desc = descriptors.get(msg.getClass()); + if (desc == null) { + throw new CloudRuntimeException(String.format("Message[%s] has no ApiMessageDescriptor", msg.getClass().getName())); + } + + for (ApiMessageInterceptor ic : desc.getInterceptors()) { + msg = ic.intercept(msg); + } + + return msg; + } + + @Override + public ApiMessageDescriptor getApiMessageDescriptor(APIMessage msg) { + return descriptors.get(msg.getClass()); + } + + @Override + public List getSupportApis() { + return supportApis; + } + + private void populateGlobalInterceptors() { + for (GlobalApiMessageInterceptor gi : pluginRgty.getExtensionList(GlobalApiMessageInterceptor.class)) { + if (gi.getMessageClassToIntercept() == null) { + globalInterceptorsForAllMsg.add(gi); + } else { + for (Class msgClz : gi.getMessageClassToIntercept()) { + Set gis = globalInterceptors.get(msgClz); + if (gis == null) { + gis = new HashSet(); + globalInterceptors.put(msgClz, gis); + } + gis.add(gi); + } + } + } + } +} diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 01c650c9d03..7682eae779a 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -160,6 +160,8 @@ public class SourceClassMap { put("org.zstack.externalbackup.zbox.ZBoxVmBackupInfo", "org.zstack.sdk.ZBoxVmBackupInfo"); put("org.zstack.externalbackup.zbox.ZBoxVolumeBackupInfo", "org.zstack.sdk.ZBoxVolumeBackupInfo"); put("org.zstack.faulttolerance.entity.FaultToleranceVmGroupInventory", "org.zstack.sdk.FaultToleranceVmGroupInventory"); + put("org.zstack.guesttools.AliyunInvocationRecordData", "org.zstack.sdk.AliyunInvocationRecordData"); + put("org.zstack.guesttools.AliyunInvocationRecordDetailData", "org.zstack.sdk.AliyunInvocationRecordDetailData"); put("org.zstack.guesttools.GuestToolsInventory", "org.zstack.sdk.GuestToolsInventory"); put("org.zstack.guesttools.GuestToolsStateInventory", "org.zstack.sdk.GuestToolsStateInventory"); put("org.zstack.guesttools.GuestVmScriptExecutedRecordDetailInventory", "org.zstack.sdk.GuestVmScriptExecutedRecordDetailInventory"); @@ -850,6 +852,8 @@ public class SourceClassMap { put("org.zstack.sdk.AliyunEbsBackupStorageInventory", "org.zstack.header.aliyun.ebs.AliyunEbsBackupStorageInventory"); put("org.zstack.sdk.AliyunEbsPrimaryStorageInventory", "org.zstack.header.aliyun.ebs.AliyunEbsPrimaryStorageInventory"); put("org.zstack.sdk.AliyunErrorCode", "org.zstack.header.aliyun.errorCode.AliyunErrorCode"); + put("org.zstack.sdk.AliyunInvocationRecordData", "org.zstack.guesttools.AliyunInvocationRecordData"); + put("org.zstack.sdk.AliyunInvocationRecordDetailData", "org.zstack.guesttools.AliyunInvocationRecordDetailData"); put("org.zstack.sdk.AliyunNasAccessGroupInventory", "org.zstack.aliyun.nas.filesystem.AliyunNasAccessGroupInventory"); put("org.zstack.sdk.AliyunNasAccessGroupProperty", "org.zstack.aliyun.nas.message.AliyunNasAccessGroupProperty"); put("org.zstack.sdk.AliyunNasAccessRuleInventory", "org.zstack.aliyun.nas.filesystem.AliyunNasAccessRuleInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/AliyunInvocationRecordData.java b/sdk/src/main/java/org/zstack/sdk/AliyunInvocationRecordData.java new file mode 100644 index 00000000000..5fbd8341f87 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AliyunInvocationRecordData.java @@ -0,0 +1,87 @@ +package org.zstack.sdk; + + + +public class AliyunInvocationRecordData { + + public java.sql.Timestamp startTime; + public void setStartTime(java.sql.Timestamp startTime) { + this.startTime = startTime; + } + public java.sql.Timestamp getStartTime() { + return this.startTime; + } + + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + + public java.lang.String scriptUuid; + public void setScriptUuid(java.lang.String scriptUuid) { + this.scriptUuid = scriptUuid; + } + public java.lang.String getScriptUuid() { + return this.scriptUuid; + } + + public java.lang.String scriptType; + public void setScriptType(java.lang.String scriptType) { + this.scriptType = scriptType; + } + public java.lang.String getScriptType() { + return this.scriptType; + } + + public java.lang.String scriptContent; + public void setScriptContent(java.lang.String scriptContent) { + this.scriptContent = scriptContent; + } + public java.lang.String getScriptContent() { + return this.scriptContent; + } + + public java.lang.String scriptName; + public void setScriptName(java.lang.String scriptName) { + this.scriptName = scriptName; + } + public java.lang.String getScriptName() { + return this.scriptName; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public java.lang.String recordUuid; + public void setRecordUuid(java.lang.String recordUuid) { + this.recordUuid = recordUuid; + } + public java.lang.String getRecordUuid() { + return this.recordUuid; + } + + public java.lang.String timeout; + public void setTimeout(java.lang.String timeout) { + this.timeout = timeout; + } + public java.lang.String getTimeout() { + return this.timeout; + } + + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AliyunInvocationRecordDetailData.java b/sdk/src/main/java/org/zstack/sdk/AliyunInvocationRecordDetailData.java new file mode 100644 index 00000000000..21ef6d4029f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AliyunInvocationRecordDetailData.java @@ -0,0 +1,47 @@ +package org.zstack.sdk; + + + +public class AliyunInvocationRecordDetailData { + + public java.lang.String InstanceId; + public void setInstanceId(java.lang.String InstanceId) { + this.InstanceId = InstanceId; + } + public java.lang.String getInstanceId() { + return this.InstanceId; + } + + public java.lang.String InvocationStatus; + public void setInvocationStatus(java.lang.String InvocationStatus) { + this.InvocationStatus = InvocationStatus; + } + public java.lang.String getInvocationStatus() { + return this.InvocationStatus; + } + + public java.sql.Timestamp CreationTime; + public void setCreationTime(java.sql.Timestamp CreationTime) { + this.CreationTime = CreationTime; + } + public java.sql.Timestamp getCreationTime() { + return this.CreationTime; + } + + public java.sql.Timestamp FinishTime; + public void setFinishTime(java.sql.Timestamp FinishTime) { + this.FinishTime = FinishTime; + } + public java.sql.Timestamp getFinishTime() { + return this.FinishTime; + } + + public java.lang.String Output; + public void setOutput(java.lang.String Output) { + this.Output = Output; + } + public java.lang.String getOutput() { + return this.Output; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetAliyunInvocationsAction.java b/sdk/src/main/java/org/zstack/sdk/GetAliyunInvocationsAction.java new file mode 100644 index 00000000000..c6412a082c2 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetAliyunInvocationsAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetAliyunInvocationsAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.GetAliyunInvocationsResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String recordUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmInstanceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean includeOutput = false; + + @Param(required = false) + public java.lang.Integer limit = 1000; + + @Param(required = false) + public java.lang.Integer start = 0; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.GetAliyunInvocationsResult value = res.getResult(org.zstack.sdk.GetAliyunInvocationsResult.class); + ret.value = value == null ? new org.zstack.sdk.GetAliyunInvocationsResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/scripts/aliyun-invocations"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetAliyunInvocationsResult.java b/sdk/src/main/java/org/zstack/sdk/GetAliyunInvocationsResult.java new file mode 100644 index 00000000000..23357b8013e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetAliyunInvocationsResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class GetAliyunInvocationsResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/userdata/TestUserDataBatchApllyCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/userdata/TestUserDataBatchApllyCase.groovy index a5a67d96a1e..68038204981 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/userdata/TestUserDataBatchApllyCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/userdata/TestUserDataBatchApllyCase.groovy @@ -1,7 +1,9 @@ package org.zstack.test.integration.networkservice.provider.flat.userdata import org.springframework.http.HttpEntity +import org.zstack.header.network.l3.L3NetworkType import org.zstack.header.network.service.NetworkServiceType +import org.zstack.header.vm.VmInstanceVO import org.zstack.network.service.eip.EipConstant import org.zstack.network.service.flat.FlatNetworkServiceConstant import org.zstack.network.service.flat.FlatUserdataBackend @@ -135,6 +137,11 @@ class TestUserDataBatchApllyCase extends SubCase { imageUuid = image.uuid l3NetworkUuids = [l31.uuid] } + createSystemTag { + resourceUuid = vm1.uuid + resourceType = VmInstanceVO.class.getSimpleName() + tag = "hostname::kvm" + } VmNicInventory nic1 = vm1.vmNics.get(0) VmInstanceInventory vm2 = createVmInstance { @@ -143,6 +150,11 @@ class TestUserDataBatchApllyCase extends SubCase { imageUuid = image.uuid l3NetworkUuids = [l31.uuid] } + createSystemTag { + resourceUuid = vm2.uuid + resourceType = VmInstanceVO.class.getSimpleName() + tag = "hostname::kvm" + } VmNicInventory nic2 = vm2.vmNics.get(0) VmInstanceInventory vm3 = createVmInstance { @@ -151,6 +163,11 @@ class TestUserDataBatchApllyCase extends SubCase { imageUuid = image.uuid l3NetworkUuids = [l32.uuid] } + createSystemTag { + resourceUuid = vm3.uuid + resourceType = VmInstanceVO.class.getSimpleName() + tag = "hostname::kvm" + } VmNicInventory nic3 = vm3.vmNics.get(0) FlatUserdataBackend.BatchApplyUserdataCmd cmd = null @@ -168,6 +185,20 @@ class TestUserDataBatchApllyCase extends SubCase { assert to.vmIp == nic1.ip || to.vmIp == nic2.ip || to.vmIp == nic3.ip assert to.netmask == nic1.netmask || to.netmask == nic2.netmask || to.netmask == nic3.netmask assert to.l3NetworkUuid == nic1.l3NetworkUuid || to.l3NetworkUuid == nic2.l3NetworkUuid || to.l3NetworkUuid == nic3.l3NetworkUuid + assert to.metadata.vmUuid == vm1.uuid || to.metadata.vmUuid == vm2.uuid || to.metadata.vmUuid == vm3.uuid + assert to.metadata.mac == nic1.mac || to.metadata.mac == nic2.mac || to.metadata.mac == nic3.mac + assert to.metadata.vmHostname == host.name + assert to.metadata.regionName +// assert to.metadata.dnsServersIp +// assert to.metadata.vpcId + + for (FlatUserdataBackend.NetworkInterfaceDetails nid : to.networkInterfaces) { + assert nid.ip == nic1.ip || nid.ip == nic2.ip || nid.ip == nic3.ip + assert nid.netmask == nic1.netmask || nid.netmask == nic2.netmask || nid.netmask == nic3.netmask + assert nid.gateway == nic1.gateway || nid.gateway == nic2.gateway || nid.gateway == nic3.gateway + assert nid.macAddress == nic1.mac || nid.macAddress == nic2.mac || nid.macAddress == nic3.mac + assert nid.vpcCidrBlock == l31.ipRanges.get(0).networkCidr || nid.vpcCidrBlock == l32.ipRanges.get(0).networkCidr + } } FlatUserdataBackend.CleanupUserdataCmd ccmd = null diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 1e18d5f2442..de415bdba72 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -19997,6 +19997,33 @@ abstract class ApiHelper { } + def getAliyunInvocations(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAliyunInvocationsAction.class) Closure c) { + def a = new org.zstack.sdk.GetAliyunInvocationsAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def getAliyunNasAccessGroupRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAliyunNasAccessGroupRemoteAction.class) Closure c) { def a = new org.zstack.sdk.GetAliyunNasAccessGroupRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 20d7740488a534f50087dfe05bc51f7fdaeb27f1 Mon Sep 17 00:00:00 2001 From: "yingzhe.hu" Date: Wed, 4 Jun 2025 13:10:39 +0800 Subject: [PATCH 443/737] [image]: support image group 1.support query/delete image group 2.support image clone 3.sdk APIImpact DBImpact Resolves: ZSTAC-75311 Change-Id: I666d65687179646b6c7678676e6d776275767477 --- conf/db/upgrade/V5.3.36__schema.sql | 20 +- conf/persistence.xml | 2 + conf/serviceConfig/image.xml | 30 + .../header/image/APICloneImageEvent.java | 53 + .../image/APICloneImageEventDoc_zh_cn.groovy | 32 + .../zstack/header/image/APICloneImageMsg.java | 45 + .../image/APICloneImageMsgDoc_zh_cn.groovy | 95 + .../APICreateImageGroupFromImageEvent.java | 25 + ...teImageGroupFromImageEventDoc_zh_cn.groovy | 32 + .../APICreateImageGroupFromImageMsg.java | 61 + ...eateImageGroupFromImageMsgDoc_zh_cn.groovy | 103 + .../APICreateImageGroupFromSnapshotEvent.java | 26 + ...mageGroupFromSnapshotEventDoc_zh_cn.groovy | 32 + .../APICreateImageGroupFromSnapshotMsg.java | 61 + ...eImageGroupFromSnapshotMsgDoc_zh_cn.groovy | 103 + ...PICreateImageGroupFromVmInstanceEvent.java | 25 + ...geGroupFromVmInstanceEventDoc_zh_cn.groovy | 32 + .../APICreateImageGroupFromVmInstanceMsg.java | 50 + ...mageGroupFromVmInstanceMsgDoc_zh_cn.groovy | 94 + .../image/APIExpungeImageGroupEvent.java | 21 + .../APIExpungeImageGroupEventDoc_zh_cn.groovy | 23 + .../header/image/APIExpungeImageGroupMsg.java | 27 + .../APIExpungeImageGroupMsgDoc_zh_cn.groovy | 58 + .../header/image/APIQueryImageGroupMsg.java | 25 + .../APIQueryImageGroupMsgDoc_zh_cn.groovy | 31 + .../image/APIQueryImageGroupRefMsg.java | 25 + .../APIQueryImageGroupRefMsgDoc_zh_cn.groovy | 31 + .../image/APIQueryImageGroupRefReply.java | 27 + ...APIQueryImageGroupRefReplyDoc_zh_cn.groovy | 32 + .../header/image/APIQueryImageGroupReply.java | 27 + .../APIQueryImageGroupReplyDoc_zh_cn.groovy | 32 + .../header/image/ImageCloneStrategy.java | 5 + .../header/image/ImageGroupInventory.java | 104 + .../image/ImageGroupInventoryDoc_zh_cn.groovy | 52 + .../header/image/ImageGroupRefInventory.java | 71 + .../ImageGroupRefInventoryDoc_zh_cn.groovy | 33 + .../zstack/header/image/ImageGroupRefVO.java | 75 + .../zstack/header/image/ImageGroupRefVO_.java | 11 + .../org/zstack/header/image/ImageGroupVO.java | 86 + .../zstack/header/image/ImageGroupVO_.java | 14 + .../main/java/org/zstack/image/ImageBase.java | 30 +- .../org/zstack/image/ImageManagerImpl.java | 679 +++++- .../service/flat/FlatUserdataBackend.java | 1937 +++++++++-------- .../apimediator/ApiMessageProcessorImpl.java | 586 ++--- sdk/src/main/java/SourceClassMap.java | 4 + .../java/org/zstack/sdk/CloneImageAction.java | 110 + .../java/org/zstack/sdk/CloneImageResult.java | 14 + .../sdk/CreateImageGroupFromImageAction.java | 116 + .../sdk/CreateImageGroupFromImageResult.java | 14 + .../CreateImageGroupFromSnapshotAction.java | 116 + .../CreateImageGroupFromSnapshotResult.java | 14 + .../CreateImageGroupFromVmInstanceAction.java | 113 + .../CreateImageGroupFromVmInstanceResult.java | 14 + .../zstack/sdk/ExpungeImageGroupAction.java | 101 + .../zstack/sdk/ExpungeImageGroupResult.java | 7 + .../org/zstack/sdk/ImageGroupInventory.java | 63 + .../zstack/sdk/ImageGroupRefInventory.java | 39 + .../org/zstack/sdk/QueryImageGroupAction.java | 75 + .../zstack/sdk/QueryImageGroupRefAction.java | 75 + .../zstack/sdk/QueryImageGroupRefResult.java | 22 + .../org/zstack/sdk/QueryImageGroupResult.java | 22 + .../image/ImageGroupOperationsCase.groovy | 293 +++ .../java/org/zstack/testlib/ApiHelper.groovy | 191 ++ 63 files changed, 5089 insertions(+), 1277 deletions(-) create mode 100644 header/src/main/java/org/zstack/header/image/APICloneImageEvent.java create mode 100644 header/src/main/java/org/zstack/header/image/APICloneImageEventDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/image/APICloneImageMsg.java create mode 100644 header/src/main/java/org/zstack/header/image/APICloneImageMsgDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEvent.java create mode 100644 header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEventDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsg.java create mode 100644 header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsgDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEvent.java create mode 100644 header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEventDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsg.java create mode 100644 header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsgDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceEvent.java create mode 100644 header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceEventDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsg.java create mode 100644 header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsgDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/image/APIExpungeImageGroupEvent.java create mode 100644 header/src/main/java/org/zstack/header/image/APIExpungeImageGroupEventDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsg.java create mode 100644 header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsgDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/image/APIQueryImageGroupMsg.java create mode 100644 header/src/main/java/org/zstack/header/image/APIQueryImageGroupMsgDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefMsg.java create mode 100644 header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefMsgDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefReply.java create mode 100644 header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefReplyDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/image/APIQueryImageGroupReply.java create mode 100644 header/src/main/java/org/zstack/header/image/APIQueryImageGroupReplyDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/image/ImageCloneStrategy.java create mode 100644 header/src/main/java/org/zstack/header/image/ImageGroupInventory.java create mode 100644 header/src/main/java/org/zstack/header/image/ImageGroupInventoryDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/image/ImageGroupRefInventory.java create mode 100644 header/src/main/java/org/zstack/header/image/ImageGroupRefInventoryDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/image/ImageGroupRefVO.java create mode 100644 header/src/main/java/org/zstack/header/image/ImageGroupRefVO_.java create mode 100644 header/src/main/java/org/zstack/header/image/ImageGroupVO.java create mode 100644 header/src/main/java/org/zstack/header/image/ImageGroupVO_.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CloneImageAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CloneImageResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromVmInstanceAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromVmInstanceResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ImageGroupInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ImageGroupRefInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryImageGroupAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryImageGroupRefAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryImageGroupRefResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryImageGroupResult.java create mode 100644 test/src/test/groovy/org/zstack/test/integration/image/ImageGroupOperationsCase.groovy diff --git a/conf/db/upgrade/V5.3.36__schema.sql b/conf/db/upgrade/V5.3.36__schema.sql index c244fd6f203..389ce127e05 100644 --- a/conf/db/upgrade/V5.3.36__schema.sql +++ b/conf/db/upgrade/V5.3.36__schema.sql @@ -12,4 +12,22 @@ CREATE TABLE IF NOT EXISTS `zstack`.`VolumeCbtBackupRecordVO` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -CREATE VIEW `zstack`.`GuestVmScriptVO` AS SELECT uuid, name, description, platform, encodingType, scriptContent, renderParams, scriptType, scriptTimeout, version, createDate, lastOpDate FROM `zstack`.`GuestVmScriptEO` WHERE deleted IS NULL; \ No newline at end of file +CREATE TABLE IF NOT EXISTS `zstack`.`ImageGroupVO` ( + `uuid` VARCHAR(32) NOT NULL UNIQUE, + `name` VARCHAR(255) NOT NULL, + `status` varchar(32) NOT NULL, + `description` VARCHAR(2048) DEFAULT NULL, + `imageCount` int unsigned NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE current_timestamp(), + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ImageGroupRefVO` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `imageUuid` VARCHAR(32) NOT NULL, + `imageGroupUuid` VARCHAR(32) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE current_timestamp(), + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/conf/persistence.xml b/conf/persistence.xml index 26537f82958..2b4f57d7265 100755 --- a/conf/persistence.xml +++ b/conf/persistence.xml @@ -36,6 +36,8 @@ org.zstack.header.storage.backup.BackupStorageZoneRefVO org.zstack.header.image.ImageVO org.zstack.header.image.ImageEO + org.zstack.header.image.ImageGroupVO + org.zstack.header.image.ImageGroupRefVO org.zstack.header.image.GuestOsCategoryVO org.zstack.header.image.ImageBackupStorageRefVO org.zstack.header.allocator.HostCapacityVO diff --git a/conf/serviceConfig/image.xml b/conf/serviceConfig/image.xml index f4712e2a01b..b93b17d9516 100755 --- a/conf/serviceConfig/image.xml +++ b/conf/serviceConfig/image.xml @@ -11,11 +11,25 @@ org.zstack.header.image.APIDeleteImageMsg
+ + org.zstack.header.image.APICloneImageMsg + + org.zstack.header.image.APIQueryImageMsg query + + org.zstack.header.image.APIQueryImageGroupMsg + query + + + + org.zstack.header.image.APIQueryImageGroupRefMsg + query + + org.zstack.header.image.APIGetUploadImageJobDetailsMsg @@ -48,6 +62,10 @@ org.zstack.header.image.APIExpungeImageMsg + + org.zstack.header.image.APIExpungeImageGroupMsg + + org.zstack.header.image.APIRecoverImageMsg @@ -63,4 +81,16 @@ org.zstack.header.image.APICalculateImageHashMsg + + + org.zstack.header.image.APICreateImageGroupFromVmInstanceMsg + + + + org.zstack.header.image.APICreateImageGroupFromImageMsg + + + + org.zstack.header.image.APICreateImageGroupFromSnapshotMsg + diff --git a/header/src/main/java/org/zstack/header/image/APICloneImageEvent.java b/header/src/main/java/org/zstack/header/image/APICloneImageEvent.java new file mode 100644 index 00000000000..4798d138287 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICloneImageEvent.java @@ -0,0 +1,53 @@ +package org.zstack.header.image; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +import java.util.Collections; + +@RestResponse(allTo = "inventory") +public class APICloneImageEvent extends APIEvent { + public APICloneImageEvent(String apiId) { + super(apiId); + } + + public APICloneImageEvent() { + super(null); + } + + private ImageInventory inventory; + + public ImageInventory getInventory() { + return inventory; + } + + public void setInventory(ImageInventory inventory) { + this.inventory = inventory; + } + + public static APICloneImageEvent __example__() { + APICloneImageEvent event = new APICloneImageEvent(); + + ImageInventory inv = new ImageInventory(); + inv.setUuid(uuid()); + + ImageBackupStorageRefInventory ref = new ImageBackupStorageRefInventory(); + ref.setBackupStorageUuid(uuid()); + ref.setImageUuid(inv.getUuid()); + ref.setInstallPath("ceph://zs-images/f0b149e053b34c7eb7fe694b182ebffd"); + ref.setStatus(ImageStatus.Ready.toString()); + + inv.setName("TinyLinux"); + inv.setBackupStorageRefs(Collections.singletonList(ref)); + inv.setUrl("http://192.168.1.20/share/images/tinylinux.qcow2"); + inv.setFormat(ImageConstant.QCOW2_FORMAT_STRING); + inv.setMediaType(ImageConstant.ImageMediaType.RootVolumeTemplate.toString()); + inv.setPlatform(ImagePlatform.Linux.toString()); + inv.setArchitecture(ImageArchitecture.x86_64.toString()); + + event.setInventory(inv); + return event; + } + +} + diff --git a/header/src/main/java/org/zstack/header/image/APICloneImageEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICloneImageEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..a6b7cac1a84 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICloneImageEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.image + +import org.zstack.header.image.ImageInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "克隆镜像的执行结果" + + ref { + name "inventory" + path "org.zstack.header.image.APICloneImageEvent.inventory" + desc "null" + type "ImageInventory" + since "5.3.36" + clz ImageInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.36" + } + ref { + name "error" + path "org.zstack.header.image.APICloneImageEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.36" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/image/APICloneImageMsg.java b/header/src/main/java/org/zstack/header/image/APICloneImageMsg.java new file mode 100644 index 00000000000..21ab2c537e6 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICloneImageMsg.java @@ -0,0 +1,45 @@ +package org.zstack.header.image; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.message.*; +import org.zstack.header.other.APIAuditor; +import org.zstack.header.rest.RestRequest; +import org.zstack.header.tag.TagResourceType; + +@TagResourceType(ImageVO.class) +@Action(category = ImageConstant.ACTION_CATEGORY) +@RestRequest( + path = "/image/clone/{imageUuid}", + method = HttpMethod.POST, + parameterName = "params", + responseClass = APICloneImageEvent.class +) +public class APICloneImageMsg extends APICreateMessage implements APIAuditor { + @APIParam(resourceType = ImageVO.class, noOwnerCheck = true) + private String imageUuid; + + @APIParam(required = false, validValues = {"DatabaseOnly"}) + private String strategy = ImageCloneStrategy.DatabaseOnly.toString(); + + @Override + public Result audit(APIMessage msg, APIEvent rsp) { + return null; + } + + public String getImageUuid() { + return imageUuid; + } + + public void setImageUuid(String imageUuid) { + this.imageUuid = imageUuid; + } + + public String getStrategy() { + return strategy; + } + + public void setStrategy(String strategy) { + this.strategy = strategy; + } +} diff --git a/header/src/main/java/org/zstack/header/image/APICloneImageMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICloneImageMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..8be21f21829 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICloneImageMsgDoc_zh_cn.groovy @@ -0,0 +1,95 @@ +package org.zstack.header.image + +import org.zstack.header.image.APICloneImageEvent + +doc { + title "CloneImage" + + category "image" + + desc """克隆镜像""" + + rest { + request { + url "POST /v1/image/clone/{imageUuid}" + + header (Authorization: 'OAuth the-session-uuid') + + clz APICloneImageMsg.class + + desc """""" + + params { + + column { + name "imageUuid" + enclosedIn "params" + desc "镜像UUID" + location "url" + type "String" + optional false + since "5.3.36" + } + column { + name "imageGroupUuid" + enclosedIn "params" + desc "镜像组UUID" + location "body" + type "String" + optional false + since "5.3.36" + } + column { + name "strategy" + enclosedIn "params" + desc "克隆策略" + location "body" + type "String" + optional true + since "5.3.36" + values ("DatabaseOnly") + } + column { + name "resourceUuid" + enclosedIn "params" + desc "资源UUID" + location "body" + type "String" + optional true + since "5.3.36" + } + column { + name "tagUuids" + enclosedIn "params" + desc "标签UUID列表" + location "body" + type "List" + optional true + since "5.3.36" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.36" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.36" + } + } + } + + response { + clz APICloneImageEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEvent.java b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEvent.java new file mode 100644 index 00000000000..635bee37bc5 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEvent.java @@ -0,0 +1,25 @@ +package org.zstack.header.image; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +@RestResponse(allTo = "inventory") +public class APICreateImageGroupFromImageEvent extends APIEvent { + ImageGroupInventory inventory; + + public APICreateImageGroupFromImageEvent(String apiId) { + super(apiId); + } + + public APICreateImageGroupFromImageEvent() { + super(); + } + + public void setInventory(ImageGroupInventory imageGroup) { + this.inventory = imageGroup; + } + + public ImageGroupInventory getInventory() { + return inventory; + } +} diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..be604e50543 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.image + +import org.zstack.header.image.ImageGroupInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "从镜像创建镜像组的返回" + + ref { + name "inventory" + path "org.zstack.header.image.APICreateImageGroupFromImageEvent.inventory" + desc "null" + type "ImageGroupInventory" + since "5.3.36" + clz ImageGroupInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.36" + } + ref { + name "error" + path "org.zstack.header.image.APICreateImageGroupFromImageEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.36" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsg.java b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsg.java new file mode 100644 index 00000000000..f9810ed49b6 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsg.java @@ -0,0 +1,61 @@ +package org.zstack.header.image; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APICreateMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; +import org.zstack.header.tag.TagResourceType; + +import java.util.List; + +@Action(category = ImageConstant.ACTION_CATEGORY) +@RestRequest( + path = "/imagegroup/from/image/{rootVolumeTemplateUuid}", + method = HttpMethod.POST, + responseClass = APICreateImageGroupFromImageEvent.class, + parameterName = "params" +) +@TagResourceType(ImageVO.class) +public class APICreateImageGroupFromImageMsg extends APICreateMessage { + @APIParam(maxLength = 255) + private String name; + @APIParam(required = true, maxLength = 2048) + private String rootVolumeTemplateUuid; + @APIParam(required = false, maxLength = 2048) + private String description; + @APIParam(required = false) + private List dateVolumeTemplateUuids; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getRootVolumeTemplateUuid() { + return rootVolumeTemplateUuid; + } + + public void setRootVolumeTemplateUuid(String rootVolumeTemplateUuid) { + this.rootVolumeTemplateUuid = rootVolumeTemplateUuid; + } + + public List getDateVolumeTemplateUuids() { + return dateVolumeTemplateUuids; + } + + public void setDateVolumeTemplateUuids(List dateVolumeTemplateUuids) { + this.dateVolumeTemplateUuids = dateVolumeTemplateUuids; + } +} diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..0e07df40713 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsgDoc_zh_cn.groovy @@ -0,0 +1,103 @@ +package org.zstack.header.image + +import org.zstack.header.image.APICreateImageGroupFromImageEvent + +doc { + title "CreateImageGroupFromImage" + + category "image" + + desc """从镜像创建镜像组""" + + rest { + request { + url "POST /v1/imagegroup/from/image/{rootVolumeTemplateUuid}" + + header (Authorization: 'OAuth the-session-uuid') + + clz APICreateImageGroupFromImageMsg.class + + desc """""" + + params { + + column { + name "name" + enclosedIn "params" + desc "资源名称" + location "body" + type "String" + optional false + since "5.3.36" + } + column { + name "rootVolumeTemplateUuid" + enclosedIn "params" + desc "" + location "url" + type "String" + optional false + since "5.3.36" + } + column { + name "description" + enclosedIn "params" + desc "资源的详细描述" + location "body" + type "String" + optional true + since "5.3.36" + } + column { + name "dateVolumeTemplateUuids" + enclosedIn "params" + desc "" + location "body" + type "List" + optional true + since "5.3.36" + } + column { + name "resourceUuid" + enclosedIn "params" + desc "资源UUID" + location "body" + type "String" + optional true + since "5.3.36" + } + column { + name "tagUuids" + enclosedIn "params" + desc "标签UUID列表" + location "body" + type "List" + optional true + since "5.3.36" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.36" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.36" + } + } + } + + response { + clz APICreateImageGroupFromImageEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEvent.java b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEvent.java new file mode 100644 index 00000000000..5c760497305 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEvent.java @@ -0,0 +1,26 @@ +package org.zstack.header.image; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +@RestResponse(allTo = "inventory") +public class APICreateImageGroupFromSnapshotEvent extends APIEvent { + ImageGroupInventory inventory; + + public APICreateImageGroupFromSnapshotEvent(String apiId) { + super(apiId); + } + + public APICreateImageGroupFromSnapshotEvent() { + super(); + } + + public void setInventory(ImageGroupInventory imageGroup) { + this.inventory = imageGroup; + } + + public ImageGroupInventory getInventory() { + return inventory; + } + +} diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..6d5de203e0f --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.image + +import org.zstack.header.image.ImageGroupInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "从快照创建镜像组的返回" + + ref { + name "inventory" + path "org.zstack.header.image.APICreateImageGroupFromSnapshotEvent.inventory" + desc "null" + type "ImageGroupInventory" + since "5.3.36" + clz ImageGroupInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.36" + } + ref { + name "error" + path "org.zstack.header.image.APICreateImageGroupFromSnapshotEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.36" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsg.java b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsg.java new file mode 100644 index 00000000000..c4779f5d673 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsg.java @@ -0,0 +1,61 @@ +package org.zstack.header.image; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APICreateMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; +import org.zstack.header.tag.TagResourceType; + +import java.util.List; + +@Action(category = ImageConstant.ACTION_CATEGORY) +@RestRequest( + path = "/imagegroup/from/snapshot/{rootVolumeSnapshotUuid}", + method = HttpMethod.POST, + responseClass = APICreateImageGroupFromSnapshotEvent.class, + parameterName = "params" +) +@TagResourceType(ImageVO.class) +public class APICreateImageGroupFromSnapshotMsg extends APICreateMessage { + @APIParam(maxLength = 255) + private String name; + @APIParam(required = true, maxLength = 2048) + private String rootVolumeSnapshotUuid; + @APIParam(required = false, maxLength = 2048) + private String description; + @APIParam(required = false) + private List dateVolumeSnapshotUuids; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getRootVolumeSnapshotUuid() { + return rootVolumeSnapshotUuid; + } + + public void setRootVolumeSnapshotUuid(String rootVolumeSnapshotUuid) { + this.rootVolumeSnapshotUuid = rootVolumeSnapshotUuid; + } + + public List getDateVolumeSnapshotUuids() { + return dateVolumeSnapshotUuids; + } + + public void setDateVolumeSnapshotUuids(List dateVolumeSnapshotUuids) { + this.dateVolumeSnapshotUuids = dateVolumeSnapshotUuids; + } +} diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..959faef15d8 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsgDoc_zh_cn.groovy @@ -0,0 +1,103 @@ +package org.zstack.header.image + +import org.zstack.header.image.APICreateImageGroupFromSnapshotEvent + +doc { + title "CreateImageGroupFromSnapshot" + + category "image" + + desc """从快照创建镜像组""" + + rest { + request { + url "POST /v1/imagegroup/from/snapshot/{rootVolumeSnapshotUuid}" + + header (Authorization: 'OAuth the-session-uuid') + + clz APICreateImageGroupFromSnapshotMsg.class + + desc """""" + + params { + + column { + name "name" + enclosedIn "params" + desc "资源名称" + location "body" + type "String" + optional false + since "5.3.36" + } + column { + name "rootVolumeSnapshotUuid" + enclosedIn "params" + desc "" + location "url" + type "String" + optional false + since "5.3.36" + } + column { + name "description" + enclosedIn "params" + desc "资源的详细描述" + location "body" + type "String" + optional true + since "5.3.36" + } + column { + name "dateVolumeSnapshotUuids" + enclosedIn "params" + desc "" + location "body" + type "List" + optional true + since "5.3.36" + } + column { + name "resourceUuid" + enclosedIn "params" + desc "资源UUID" + location "body" + type "String" + optional true + since "5.3.36" + } + column { + name "tagUuids" + enclosedIn "params" + desc "标签UUID列表" + location "body" + type "List" + optional true + since "5.3.36" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.36" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.36" + } + } + } + + response { + clz APICreateImageGroupFromSnapshotEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceEvent.java b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceEvent.java new file mode 100644 index 00000000000..21cc3c92b1e --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceEvent.java @@ -0,0 +1,25 @@ +package org.zstack.header.image; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +@RestResponse(allTo = "inventory") +public class APICreateImageGroupFromVmInstanceEvent extends APIEvent { + ImageGroupInventory inventory; + + public APICreateImageGroupFromVmInstanceEvent(String apiId) { + super(apiId); + } + + public APICreateImageGroupFromVmInstanceEvent() { + super(); + } + + public void setInventory(ImageGroupInventory imageGroup) { + this.inventory = imageGroup; + } + + public ImageGroupInventory getInventory() { + return inventory; + } +} diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..7a42e3e38c1 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.image + +import org.zstack.header.image.ImageGroupInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "从虚拟机创建镜像组的返回" + + ref { + name "inventory" + path "org.zstack.header.image.APICreateImageGroupFromVmInstanceEvent.inventory" + desc "null" + type "ImageGroupInventory" + since "5.3.36" + clz ImageGroupInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.36" + } + ref { + name "error" + path "org.zstack.header.image.APICreateImageGroupFromVmInstanceEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.36" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsg.java b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsg.java new file mode 100644 index 00000000000..80ecbbac514 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsg.java @@ -0,0 +1,50 @@ +package org.zstack.header.image; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APICreateMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; +import org.zstack.header.tag.TagResourceType; +import org.zstack.header.vm.VmInstanceVO; + +@Action(category = ImageConstant.ACTION_CATEGORY) +@RestRequest( + path = "/images/groups/from/vm-instance", + method = HttpMethod.POST, + responseClass = APICreateImageGroupFromVmInstanceEvent.class, + parameterName = "params" +) +@TagResourceType(ImageVO.class) +public class APICreateImageGroupFromVmInstanceMsg extends APICreateMessage { + @APIParam(resourceType = VmInstanceVO.class, checkAccount = true, operationTarget = true) + private String vmInstanceUuid; + @APIParam(maxLength = 255) + private String name; + @APIParam(required = false, maxLength = 2048) + private String description; + + public String getVmInstanceUuid() { + return vmInstanceUuid; + } + + public void setVmInstanceUuid(String vmInstanceUuid) { + this.vmInstanceUuid = vmInstanceUuid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..ccf7a4a7feb --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsgDoc_zh_cn.groovy @@ -0,0 +1,94 @@ +package org.zstack.header.image + +import org.zstack.header.image.APICreateImageGroupFromVmInstanceEvent + +doc { + title "CreateImageGroupFromVmInstance" + + category "image" + + desc """从虚拟机创建镜像组""" + + rest { + request { + url "POST /v1/images/groups/from/vm-instance" + + header (Authorization: 'OAuth the-session-uuid') + + clz APICreateImageGroupFromVmInstanceMsg.class + + desc """""" + + params { + + column { + name "vmInstanceUuid" + enclosedIn "params" + desc "云主机UUID" + location "body" + type "String" + optional false + since "5.3.36" + } + column { + name "name" + enclosedIn "params" + desc "资源名称" + location "body" + type "String" + optional false + since "5.3.36" + } + column { + name "description" + enclosedIn "params" + desc "资源的详细描述" + location "body" + type "String" + optional true + since "5.3.36" + } + column { + name "resourceUuid" + enclosedIn "params" + desc "资源UUID" + location "body" + type "String" + optional true + since "5.3.36" + } + column { + name "tagUuids" + enclosedIn "params" + desc "标签UUID列表" + location "body" + type "List" + optional true + since "5.3.36" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.36" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.36" + } + } + } + + response { + clz APICreateImageGroupFromVmInstanceEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupEvent.java b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupEvent.java new file mode 100644 index 00000000000..d6499a9505d --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupEvent.java @@ -0,0 +1,21 @@ +package org.zstack.header.image; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +@RestResponse +public class APIExpungeImageGroupEvent extends APIEvent { + public APIExpungeImageGroupEvent() { + } + + public APIExpungeImageGroupEvent(String apiId) { + super(apiId); + } + + public static APIExpungeImageGroupEvent __example__() { + APIExpungeImageGroupEvent event = new APIExpungeImageGroupEvent(); + + + return event; + } +} diff --git a/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..31459053acf --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupEventDoc_zh_cn.groovy @@ -0,0 +1,23 @@ +package org.zstack.header.image + +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "删除镜像组的返回" + + field { + name "success" + desc "" + type "boolean" + since "5.3.36" + } + ref { + name "error" + path "org.zstack.header.image.APIExpungeImageGroupEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.36" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsg.java b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsg.java new file mode 100644 index 00000000000..3a36dd751e4 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsg.java @@ -0,0 +1,27 @@ +package org.zstack.header.image; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; + +@Action(category = ImageConstant.ACTION_CATEGORY) +@RestRequest( + path = "/imagegroups/{uuid}/actions", + method = HttpMethod.PUT, + responseClass = APIExpungeImageGroupEvent.class, + isAction = true +) +public class APIExpungeImageGroupMsg extends APIMessage { + @APIParam(required = false, resourceType = ImageGroupVO.class, checkAccount = true, operationTarget = true) + private String uuid; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } +} diff --git a/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..9b3adb86c0b --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsgDoc_zh_cn.groovy @@ -0,0 +1,58 @@ +package org.zstack.header.image + +import org.zstack.header.image.APIExpungeImageGroupEvent + +doc { + title "ExpungeImageGroup" + + category "image" + + desc """删除镜像组""" + + rest { + request { + url "PUT /v1/imagegroups/{uuid}/actions" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIExpungeImageGroupMsg.class + + desc """""" + + params { + + column { + name "uuid" + enclosedIn "expungeImageGroup" + desc "资源的UUID,唯一标示该资源" + location "url" + type "String" + optional true + since "5.3.36" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.36" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.36" + } + } + } + + response { + clz APIExpungeImageGroupEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/APIQueryImageGroupMsg.java b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupMsg.java new file mode 100644 index 00000000000..383e304d76d --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupMsg.java @@ -0,0 +1,25 @@ +package org.zstack.header.image; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.query.APIQueryMessage; +import org.zstack.header.query.AutoQuery; +import org.zstack.header.rest.RestRequest; + +import java.util.Collections; +import java.util.List; + +@AutoQuery(replyClass = APIQueryImageGroupReply.class, inventoryClass = ImageGroupInventory.class) +@Action(category = ImageConstant.ACTION_CATEGORY, names = {"read"}) +@RestRequest( + path = "/imagegroups", + optionalPaths = {"/imagegroups/{uuid}"}, + method = HttpMethod.GET, + responseClass = APIQueryImageGroupReply.class +) +public class APIQueryImageGroupMsg extends APIQueryMessage { + public static List __example__() { + return Collections.singletonList("uuid=" + uuid()); + } + +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/APIQueryImageGroupMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..8d081b59021 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupMsgDoc_zh_cn.groovy @@ -0,0 +1,31 @@ +package org.zstack.header.image + +import org.zstack.header.image.APIQueryImageGroupReply +import org.zstack.header.query.APIQueryMessage + +doc { + title "QueryImageGroup" + + category "image" + + desc """查询镜像组""" + + rest { + request { + url "GET /v1/imagegroups" + url "GET /v1/imagegroups/{uuid}" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIQueryImageGroupMsg.class + + desc """""" + + params APIQueryMessage.class + } + + response { + clz APIQueryImageGroupReply.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefMsg.java b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefMsg.java new file mode 100644 index 00000000000..3fb9bf2466e --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefMsg.java @@ -0,0 +1,25 @@ +package org.zstack.header.image; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.query.APIQueryMessage; +import org.zstack.header.query.AutoQuery; +import org.zstack.header.rest.RestRequest; + +import java.util.Collections; +import java.util.List; + +@AutoQuery(replyClass = APIQueryImageGroupRefReply.class, inventoryClass = ImageGroupRefInventory.class) +@Action(category = ImageConstant.ACTION_CATEGORY, names = {"read"}) +@RestRequest( + path = "/imagegrouprefs", + optionalPaths = {"/imagegrouprefs/{imageGroupUuid}"}, + method = HttpMethod.GET, + responseClass = APIQueryImageGroupRefReply.class +) +public class APIQueryImageGroupRefMsg extends APIQueryMessage { + public static List __example__() { + return Collections.singletonList("uuid=" + uuid()); + } + +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..0cfd9617faf --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefMsgDoc_zh_cn.groovy @@ -0,0 +1,31 @@ +package org.zstack.header.image + +import org.zstack.header.image.APIQueryImageGroupRefReply +import org.zstack.header.query.APIQueryMessage + +doc { + title "QueryImageGroupRef" + + category "image" + + desc """查询镜像组关联关系""" + + rest { + request { + url "GET /v1/imagegrouprefs" + url "GET /v1/imagegrouprefs/{imageGroupUuid}" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIQueryImageGroupRefMsg.class + + desc """""" + + params APIQueryMessage.class + } + + response { + clz APIQueryImageGroupRefReply.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefReply.java b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefReply.java new file mode 100644 index 00000000000..3b6143b38dc --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefReply.java @@ -0,0 +1,27 @@ +package org.zstack.header.image; + +import org.zstack.header.query.APIQueryReply; +import org.zstack.header.rest.RestResponse; + +import java.util.List; + +@RestResponse(allTo = "inventories") +public class APIQueryImageGroupRefReply extends APIQueryReply { + private List inventories; + + public List getInventories() { + return inventories; + } + + public void setInventories(List inventories) { + this.inventories = inventories; + } + + public static APIQueryImageGroupRefReply __example__() { + APIQueryImageGroupRefReply reply = new APIQueryImageGroupRefReply(); + + + return reply; + } + +} diff --git a/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefReplyDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefReplyDoc_zh_cn.groovy new file mode 100644 index 00000000000..c38ad3bda83 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefReplyDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.image + +import org.zstack.header.image.ImageGroupRefInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "查询镜像组关联关系的返回" + + ref { + name "inventories" + path "org.zstack.header.image.APIQueryImageGroupRefReply.inventories" + desc "null" + type "List" + since "5.3.36" + clz ImageGroupRefInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.36" + } + ref { + name "error" + path "org.zstack.header.image.APIQueryImageGroupRefReply.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.36" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/image/APIQueryImageGroupReply.java b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupReply.java new file mode 100644 index 00000000000..277e04885e9 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupReply.java @@ -0,0 +1,27 @@ +package org.zstack.header.image; + +import org.zstack.header.query.APIQueryReply; +import org.zstack.header.rest.RestResponse; + +import java.util.List; + +@RestResponse(allTo = "inventories") +public class APIQueryImageGroupReply extends APIQueryReply { + private List inventories; + + public List getInventories() { + return inventories; + } + + public void setInventories(List inventories) { + this.inventories = inventories; + } + + public static APIQueryImageGroupReply __example__() { + APIQueryImageGroupReply reply = new APIQueryImageGroupReply(); + + + return reply; + } + +} diff --git a/header/src/main/java/org/zstack/header/image/APIQueryImageGroupReplyDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupReplyDoc_zh_cn.groovy new file mode 100644 index 00000000000..addfed26c50 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupReplyDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.image + +import org.zstack.header.image.ImageGroupInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "查询镜像组的返回" + + ref { + name "inventories" + path "org.zstack.header.image.APIQueryImageGroupReply.inventories" + desc "null" + type "List" + since "5.3.36" + clz ImageGroupInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.36" + } + ref { + name "error" + path "org.zstack.header.image.APIQueryImageGroupReply.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.36" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/image/ImageCloneStrategy.java b/header/src/main/java/org/zstack/header/image/ImageCloneStrategy.java new file mode 100644 index 00000000000..abd9fe2d361 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/ImageCloneStrategy.java @@ -0,0 +1,5 @@ +package org.zstack.header.image; + +public enum ImageCloneStrategy { + DatabaseOnly, +} diff --git a/header/src/main/java/org/zstack/header/image/ImageGroupInventory.java b/header/src/main/java/org/zstack/header/image/ImageGroupInventory.java new file mode 100644 index 00000000000..9489aad53e1 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/ImageGroupInventory.java @@ -0,0 +1,104 @@ +package org.zstack.header.image; + +import org.zstack.header.configuration.PythonClassInventory; +import org.zstack.header.search.Inventory; + +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@PythonClassInventory +@Inventory(mappingVOClass = ImageGroupVO.class, collectionValueOfMethod = "valueOf1") +public class ImageGroupInventory implements Serializable { + private Integer imageCount; + private String name; + private String description; + private String status; + private Timestamp createDate; + private Timestamp lastOpDate; + private String uuid; + + protected ImageGroupInventory(ImageGroupVO vo) { + this.setImageCount(vo.getImageCount()); + this.setName(vo.getName()); + this.setStatus(vo.getStatus().toString()); + this.setDescription(vo.getDescription()); + this.setCreateDate(vo.getCreateDate()); + this.setLastOpDate(vo.getLastOpDate()); + this.setUuid(vo.getUuid()); + } + + public static ImageGroupInventory valueOf(ImageGroupVO vo) { + return new ImageGroupInventory(vo); + } + + public static List valueOf1(Collection vos) { + List invs = new ArrayList(vos.size()); + for (ImageGroupVO vo : vos) { + invs.add(ImageGroupInventory.valueOf(vo)); + } + return invs; + } + + public ImageGroupInventory() { + } + + + public Integer getImageCount() { + return imageCount; + } + + public void setImageCount(Integer imageCount) { + this.imageCount = imageCount; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } +} diff --git a/header/src/main/java/org/zstack/header/image/ImageGroupInventoryDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/ImageGroupInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..96090af971e --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/ImageGroupInventoryDoc_zh_cn.groovy @@ -0,0 +1,52 @@ +package org.zstack.header.image + +import java.lang.Integer +import java.sql.Timestamp + +doc { + + title "在这里输入结构的名称" + + field { + name "imageCount" + desc "" + type "Integer" + since "5.3.36" + } + field { + name "name" + desc "资源名称" + type "String" + since "5.3.36" + } + field { + name "description" + desc "资源的详细描述" + type "String" + since "5.3.36" + } + field { + name "status" + desc "" + type "String" + since "5.3.36" + } + field { + name "createDate" + desc "创建时间" + type "Timestamp" + since "5.3.36" + } + field { + name "lastOpDate" + desc "最后一次修改时间" + type "Timestamp" + since "5.3.36" + } + field { + name "uuid" + desc "资源的UUID,唯一标示该资源" + type "String" + since "5.3.36" + } +} diff --git a/header/src/main/java/org/zstack/header/image/ImageGroupRefInventory.java b/header/src/main/java/org/zstack/header/image/ImageGroupRefInventory.java new file mode 100644 index 00000000000..2800ac336b1 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/ImageGroupRefInventory.java @@ -0,0 +1,71 @@ +package org.zstack.header.image; + +import org.zstack.header.configuration.PythonClassInventory; +import org.zstack.header.search.Inventory; + +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@PythonClassInventory +@Inventory(mappingVOClass = ImageGroupRefVO.class, collectionValueOfMethod = "valueOf1") +public class ImageGroupRefInventory implements Serializable { + private String imageUuid; + private String imageGroupUuid; + private Timestamp createDate; + private Timestamp lastOpDate; + + protected ImageGroupRefInventory(ImageGroupRefVO vo) { + this.setImageUuid(vo.getImageUuid()); + this.setImageGroupUuid(vo.getImageGroupUuid()); + this.setCreateDate(vo.getCreateDate()); + this.setLastOpDate(vo.getLastOpDate()); + } + + public static ImageGroupRefInventory valueOf(ImageGroupRefVO vo) { + return new ImageGroupRefInventory(vo); + } + + public static List valueOf1(Collection vos) { + List invs = new ArrayList(vos.size()); + for (ImageGroupRefVO vo : vos) { + invs.add(ImageGroupRefInventory.valueOf(vo)); + } + return invs; + } + + public String getImageUuid() { + return imageUuid; + } + + public void setImageUuid(String imageUuid) { + this.imageUuid = imageUuid; + } + + public String getImageGroupUuid() { + return imageGroupUuid; + } + + public void setImageGroupUuid(String imageGroupUuid) { + this.imageGroupUuid = imageGroupUuid; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + +} diff --git a/header/src/main/java/org/zstack/header/image/ImageGroupRefInventoryDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/ImageGroupRefInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..bdcee6ad5f7 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/ImageGroupRefInventoryDoc_zh_cn.groovy @@ -0,0 +1,33 @@ +package org.zstack.header.image + +import java.sql.Timestamp + +doc { + + title "在这里输入结构的名称" + + field { + name "imageUuid" + desc "镜像UUID" + type "String" + since "5.3.36" + } + field { + name "imageGroupUuid" + desc "" + type "String" + since "5.3.36" + } + field { + name "createDate" + desc "创建时间" + type "Timestamp" + since "5.3.36" + } + field { + name "lastOpDate" + desc "最后一次修改时间" + type "Timestamp" + since "5.3.36" + } +} diff --git a/header/src/main/java/org/zstack/header/image/ImageGroupRefVO.java b/header/src/main/java/org/zstack/header/image/ImageGroupRefVO.java new file mode 100644 index 00000000000..886900da98c --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/ImageGroupRefVO.java @@ -0,0 +1,75 @@ +package org.zstack.header.image; + +import org.zstack.header.vm.VmNicVO; +import org.zstack.header.vo.*; +import org.zstack.header.vo.EntityGraph; +import org.zstack.header.vo.ForeignKey; +import org.zstack.header.vo.Index; + +import javax.persistence.*; +import java.io.Serializable; +import java.sql.Timestamp; + +@Entity +@Table +@EntityGraph( + friends = { + @EntityGraph.Neighbour(type = ImageGroupVO.class, myField = "ImageGroupUuid", targetField = "uuid"), + @EntityGraph.Neighbour(type = ImageVO.class, myField = "ImageUuid", targetField = "uuid"), + } +) +public class ImageGroupRefVO implements Serializable { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column + private long id; + + @Column + private String imageUuid; + + @Column + private String imageGroupUuid; + + @Column + private Timestamp createDate; + + @Column + private Timestamp lastOpDate; + + @PreUpdate + private void preUpdate() { + lastOpDate = null; + } + + public String getImageUuid() { + return imageUuid; + } + + public void setImageUuid(String imageUuid) { + this.imageUuid = imageUuid; + } + + public String getImageGroupUuid() { + return imageGroupUuid; + } + + public void setImageGroupUuid(String imageGroupUuid) { + this.imageGroupUuid = imageGroupUuid; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/ImageGroupRefVO_.java b/header/src/main/java/org/zstack/header/image/ImageGroupRefVO_.java new file mode 100644 index 00000000000..ae8a6f5310a --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/ImageGroupRefVO_.java @@ -0,0 +1,11 @@ +package org.zstack.header.image; + +import javax.persistence.metamodel.SingularAttribute; +import java.sql.Timestamp; + +public class ImageGroupRefVO_ { + public static volatile SingularAttribute imageUuid; + public static volatile SingularAttribute imageGroupUuid; + public static volatile SingularAttribute createDate; + public static volatile SingularAttribute lastOpDate; +} diff --git a/header/src/main/java/org/zstack/header/image/ImageGroupVO.java b/header/src/main/java/org/zstack/header/image/ImageGroupVO.java new file mode 100644 index 00000000000..25deb06dc8d --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/ImageGroupVO.java @@ -0,0 +1,86 @@ +package org.zstack.header.image; + +import org.zstack.header.vo.BaseResource; +import org.zstack.header.vo.EntityGraph; +import org.zstack.header.vo.ResourceVO; + +import javax.persistence.Column; +import java.sql.Timestamp; +import javax.persistence.*; + +@Entity +@Table +@BaseResource +@EntityGraph( + friends = { + @EntityGraph.Neighbour(type = ImageGroupRefVO.class, myField = "uuid", targetField = "imageGroupUuid") + } +) +public class ImageGroupVO extends ResourceVO { + @Column + private Integer imageCount; + @Column + private String name; + @Column + @Enumerated(EnumType.STRING) + private ImageStatus status; + @Column + private String description; + @Column + private Timestamp createDate; + @Column + private Timestamp lastOpDate; + + @PreUpdate + private void preUpdate() { + lastOpDate = null; + } + + public Integer getImageCount() { + return imageCount; + } + + public void setImageCount(Integer imageCount) { + this.imageCount = imageCount; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + + public ImageStatus getStatus() { + return status; + } + + public void setStatus(ImageStatus status) { + this.status = status; + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/ImageGroupVO_.java b/header/src/main/java/org/zstack/header/image/ImageGroupVO_.java new file mode 100644 index 00000000000..d7d6112ebe0 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/ImageGroupVO_.java @@ -0,0 +1,14 @@ +package org.zstack.header.image; + +import org.zstack.header.vo.ResourceVO_; + +import javax.persistence.metamodel.SingularAttribute; +import java.sql.Timestamp; + +public class ImageGroupVO_ extends ResourceVO_ { + public static volatile SingularAttribute imageCount; + public static volatile SingularAttribute name; + public static volatile SingularAttribute description; + public static volatile SingularAttribute createDate; + public static volatile SingularAttribute lastOpDate; +} diff --git a/image/src/main/java/org/zstack/image/ImageBase.java b/image/src/main/java/org/zstack/image/ImageBase.java index 2843e90c0c3..81b5ae537b1 100755 --- a/image/src/main/java/org/zstack/image/ImageBase.java +++ b/image/src/main/java/org/zstack/image/ImageBase.java @@ -3,8 +3,7 @@ import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; -import org.zstack.compute.vm.IsoOperator; -import org.zstack.compute.vm.VmSystemTags; +import org.zstack.compute.vm.*; import org.zstack.core.asyncbatch.While; import org.zstack.core.cascade.CascadeConstant; import org.zstack.core.cascade.CascadeFacade; @@ -18,6 +17,10 @@ import org.zstack.core.thread.SyncTaskChain; import org.zstack.core.thread.ThreadFacade; import org.zstack.core.workflow.FlowChainBuilder; +import org.zstack.core.workflow.ShareFlow; +import org.zstack.header.cluster.APIDeleteClusterEvent; +import org.zstack.header.cluster.ClusterInventory; +import org.zstack.header.cluster.ClusterVO; import org.zstack.header.core.Completion; import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.core.WhileDoneCompletion; @@ -35,14 +38,17 @@ import org.zstack.header.image.ImageConstant.ImageMediaType; import org.zstack.header.image.ImageDeletionPolicyManager.ImageDeletionPolicy; import org.zstack.header.message.*; +import org.zstack.header.network.l3.*; import org.zstack.header.storage.backup.*; -import org.zstack.header.vm.DetachIsoFromVmInstanceMsg; -import org.zstack.header.vm.VmInstanceConstant; +import org.zstack.header.vm.*; import org.zstack.header.volume.VolumeType; +import org.zstack.header.volume.VolumeVO; +import org.zstack.header.volume.VolumeVO_; import org.zstack.tag.SystemTagCreator; import org.zstack.tag.TagManager; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; +import org.zstack.utils.function.ForEachFunction; import org.zstack.utils.function.Function; import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; @@ -51,8 +57,8 @@ import java.util.concurrent.TimeUnit; import static org.zstack.core.Platform.*; -import static org.zstack.utils.CollectionDSL.e; -import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.CollectionDSL.*; +import static org.zstack.utils.CollectionDSL.list; /** * Created with IntelliJ IDEA. @@ -463,6 +469,12 @@ public void done(ErrorCodeList errorCodeList) { @Override public void run(final FlowTrigger trigger, Map data) { if (deletionPolicy == ImageDeletionPolicy.Direct) { + long count = Q.New(ImageBackupStorageRefVO.class).eq(ImageBackupStorageRefVO_.installPath, ref.getInstallPath()).count(); + if (count > 1) { + trigger.next(); + return; + } + DeleteBitsOnBackupStorageMsg dmsg = new DeleteBitsOnBackupStorageMsg(); dmsg.setBackupStorageUuid(ref.getBackupStorageUuid()); dmsg.setInstallPath(ref.getInstallPath()); @@ -815,7 +827,7 @@ public String call(ImageBackupStorageRefVO arg) { if (bsUuids.isEmpty()) { throw new OperationFailureException(operr("the image[uuid:%s, name:%s] is not deleted on any backup storage", - self.getUuid(), self.getName())); + self.getUuid(), self.getName())); } } else { for (final String bsUuid : msg.getBackupStorageUuids()) { @@ -831,12 +843,12 @@ public ImageBackupStorageRefVO call(ImageBackupStorageRefVO arg) { if (ref == null) { throw new OperationFailureException(argerr("the image[uuid:%s, name:%s] is not on the backup storage[uuid:%s]", - self.getUuid(), self.getName(), bsUuid)); + self.getUuid(), self.getName(), bsUuid)); } if (ref.getStatus() != ImageStatus.Deleted) { throw new OperationFailureException(argerr("the image[uuid:%s, name:%s] is not deleted on the backup storage[uuid:%s]", - self.getUuid(), self.getName(), bsUuid)); + self.getUuid(), self.getName(), bsUuid)); } bsUuids.add(bsUuid); diff --git a/image/src/main/java/org/zstack/image/ImageManagerImpl.java b/image/src/main/java/org/zstack/image/ImageManagerImpl.java index b12d6b9e2c3..c2bd37b1bf3 100755 --- a/image/src/main/java/org/zstack/image/ImageManagerImpl.java +++ b/image/src/main/java/org/zstack/image/ImageManagerImpl.java @@ -24,6 +24,7 @@ import org.zstack.core.thread.ThreadFacade; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; +import org.zstack.core.workflow.SimpleFlowChain; import org.zstack.header.AbstractService; import org.zstack.header.allocator.HostAllocatorFilterExtensionPoint; import org.zstack.header.allocator.HostAllocatorSpec; @@ -34,6 +35,7 @@ import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.ErrorCodeList; +import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.errorcode.SysErrors; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.host.HostVO; @@ -46,6 +48,7 @@ import org.zstack.header.longjob.LongJobState; import org.zstack.header.managementnode.ManagementNodeReadyExtensionPoint; import org.zstack.header.message.*; +import org.zstack.header.network.l3.IpRangeVO; import org.zstack.header.rest.RESTFacade; import org.zstack.header.storage.backup.*; import org.zstack.header.storage.primary.CancelJobOnPrimaryStorageMsg; @@ -55,10 +58,9 @@ import org.zstack.header.storage.snapshot.*; import org.zstack.header.tag.SystemTagCreateMessageValidator; import org.zstack.header.tag.SystemTagValidator; -import org.zstack.header.vm.CreateTemplateFromRootVolumeVmMsg; -import org.zstack.header.vm.CreateTemplateFromRootVolumeVmReply; -import org.zstack.header.vm.VmInstanceConstant; -import org.zstack.header.vm.VmInstanceVO; +import org.zstack.header.vm.*; +import org.zstack.header.vo.ResourceVO; +import org.zstack.header.vo.ResourceVO_; import org.zstack.header.volume.*; import org.zstack.identity.AccountManager; import org.zstack.tag.TagManager; @@ -66,25 +68,32 @@ import org.zstack.utils.function.Function; import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; +import org.zstack.utils.network.IPv6Constants; +import org.zstack.utils.network.IPv6NetworkUtils; +import org.zstack.utils.network.NetworkUtils; import org.zstack.zql.ZQL; import javax.persistence.Tuple; import javax.persistence.TypedQuery; +import javax.xml.ws.ResponseWrapper; import java.net.URI; import java.net.URISyntaxException; import java.sql.Timestamp; +import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; import java.util.stream.Collectors; +import static java.util.Arrays.asList; import static org.zstack.core.Platform.*; -import static org.zstack.core.progress.ProgressReportService.getTaskStage; -import static org.zstack.core.progress.ProgressReportService.reportProgress; +import static org.zstack.core.progress.ProgressReportService.*; +import static org.zstack.core.progress.ProgressReportService.markTaskStage; import static org.zstack.longjob.LongJobUtils.buildErrIfCanceled; import static org.zstack.longjob.LongJobUtils.noncancelableErr; import static org.zstack.utils.CollectionDSL.list; @@ -328,6 +337,78 @@ private void handleLocalMessage(Message msg) { } } + private void handle(final APIExpungeImageGroupMsg msg) { + final APIExpungeImageGroupEvent evt = new APIExpungeImageGroupEvent(msg.getId()); + List imageUuids = Q.New(ImageGroupRefVO.class) + .eq(ImageGroupRefVO_.imageGroupUuid, msg.getUuid()) + .select(ImageGroupRefVO_.imageUuid) + .listValues(); + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("delete-image-group-%s", msg.getUuid())); + chain.then(new NoRollbackFlow() { + String __name__ = String.format("delete-images-from-image-group-%s", msg.getUuid()); + + @Override + public boolean skip(Map data) { + return CollectionUtils.isEmpty(imageUuids); + } + + @Override + public void run(final FlowTrigger trigger, Map data) { + new While<>(imageUuids).all((uuid, compl) -> { + ImageDeletionMsg msg = new ImageDeletionMsg(); + msg.setImageUuid(uuid); + msg.setDeletionPolicy(ImageDeletionPolicyManager.ImageDeletionPolicy.Direct.toString()); + msg.setForceDelete(true); + bus.makeTargetServiceIdByResourceUuid(msg, ImageConstant.SERVICE_ID, uuid); + bus.send(msg, new CloudBusCallBack(compl) { + @Override + public void run(MessageReply reply) { + compl.done(); + } + }); + }).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + trigger.next(); + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = "database-clean"; + + @Override + public void run(final FlowTrigger trigger, Map data) { + new SQLBatch() { + @Override + protected void scripts() { + if (!CollectionUtils.isEmpty(imageUuids)) { + sql(ImageGroupRefVO.class) + .eq(ImageGroupRefVO_.imageGroupUuid, msg.getUuid()) + .hardDelete(); + } + + sql(ImageGroupVO.class) + .eq(ImageGroupVO_.uuid, msg.getUuid()) + .hardDelete(); + } + }.execute(); + trigger.next(); + } + }); + chain.done(new FlowDoneHandler(msg) { + @Override + public void handle(Map data) { + bus.publish(evt); + } + }).error(new FlowErrorHandler(msg) { + @Override + public void handle(ErrorCode errCode, Map data) { + bus.publish(evt); + } + }).start(); + } + private void handle(CreateDataVolumeTemplateFromVolumeMsg msg) { CreateDataVolumeTemplateFromVolumeReply reply = new CreateDataVolumeTemplateFromVolumeReply(); createDataVolumeTemplateFromVolume(msg, msg.getVolumeUuid(), new ReturnValueCompletion(msg) { @@ -494,6 +575,10 @@ public void fail(ErrorCode errorCode) { private void handleApiMessage(Message msg) { if (msg instanceof APIAddImageMsg) { handle((APIAddImageMsg) msg); + } else if (msg instanceof APIExpungeImageGroupMsg) { + handle((APIExpungeImageGroupMsg) msg); + } else if (msg instanceof APICloneImageMsg) { + handle((APICloneImageMsg) msg); } else if (msg instanceof APIGetUploadImageJobDetailsMsg) { handle((APIGetUploadImageJobDetailsMsg) msg); } else if (msg instanceof APICreateRootVolumeTemplateFromRootVolumeMsg) { @@ -504,11 +589,511 @@ private void handleApiMessage(Message msg) { handle((APICreateDataVolumeTemplateFromVolumeMsg) msg); } else if (msg instanceof APICreateDataVolumeTemplateFromVolumeSnapshotMsg) { handle((APICreateDataVolumeTemplateFromVolumeSnapshotMsg) msg); + } else if (msg instanceof APICreateImageGroupFromVmInstanceMsg){ + handle((APICreateImageGroupFromVmInstanceMsg) msg); + } else if (msg instanceof APICreateImageGroupFromImageMsg){ + handle((APICreateImageGroupFromImageMsg) msg); + } else if (msg instanceof APICreateImageGroupFromSnapshotMsg){ + handle((APICreateImageGroupFromSnapshotMsg) msg); } else { bus.dealWithUnknownMessage(msg); } } + private void handle(APICreateImageGroupFromSnapshotMsg msg) { + APICreateImageGroupFromSnapshotEvent evt = new APICreateImageGroupFromSnapshotEvent(msg.getId()); + createImageGroupFromSnapshot(msg, new ReturnValueCompletion(evt) { + @Override + public void success(ImageGroupInventory imageGroup) { + evt.setInventory(imageGroup); + bus.publish(evt); + } + + @Override + public void fail(ErrorCode errorCode) { + evt.setError(errorCode); + bus.publish(evt); + } + }); + } + + private void handle(APICreateImageGroupFromVmInstanceMsg msg) { + APICreateImageGroupFromVmInstanceEvent evt = new APICreateImageGroupFromVmInstanceEvent(msg.getId()); + createImageGroupFromVmInstance(msg, msg.getVmInstanceUuid(), new ReturnValueCompletion(evt) { + @Override + public void success(ImageGroupInventory imageGroup) { + evt.setInventory(imageGroup); + bus.publish(evt); + } + + @Override + public void fail(ErrorCode errorCode) { + evt.setError(errorCode); + bus.publish(evt); + } + }); + } + + private void handle(APICreateImageGroupFromImageMsg msg) { + APICreateImageGroupFromImageEvent evt = new APICreateImageGroupFromImageEvent(msg.getId()); + + ImageGroupVO gvo = new SQLBatchWithReturn() { + @Override + protected ImageGroupVO scripts() { + List dateVolumeTemplateUuids = msg.getDateVolumeTemplateUuids(); + List volumesUuids = new ArrayList<>(); + volumesUuids.add(msg.getRootVolumeTemplateUuid()); + String groupUuid = Platform.getUuid(); + ImageGroupVO vo = new ImageGroupVO(); + vo.setUuid(groupUuid); + vo.setName(msg.getName()); + vo.setStatus(ImageStatus.Ready); + vo.setDescription(msg.getDescription()); + vo.setImageCount(1); + if (!CollectionUtils.isEmpty(dateVolumeTemplateUuids)) { + vo.setImageCount(1 + dateVolumeTemplateUuids.size()); + volumesUuids.addAll(msg.getDateVolumeTemplateUuids()); + } + vo = persist(vo); + + + new HashSet(volumesUuids).forEach( + uuid -> { + ImageVO image = q(ImageVO.class) + .eq(ImageVO_.uuid, uuid) + .find(); + + ImageGroupRefVO refVO = new ImageGroupRefVO(); + refVO.setImageGroupUuid(groupUuid); + refVO.setImageUuid(uuid); + persist(refVO); + } + ); + return vo; + } + }.execute(); + evt.setInventory(ImageGroupInventory.valueOf(gvo)); + bus.publish(evt); + } + + private void createImageGroupFromSnapshot(APICreateImageGroupFromSnapshotMsg msg, ReturnValueCompletion completion) { + FlowChain chain = FlowChainBuilder.newShareFlowChain(); + chain.setName(String.format("create-image-group-from-snapshot-%s", msg.getRootVolumeSnapshotUuid())); + chain.then(new ShareFlow() { + ImageGroupVO imageGroupVO = new ImageGroupVO(); + String rootVolumeSnapshotUuid = msg.getRootVolumeSnapshotUuid(); + List dataVolumeSnapshotUuids = msg.getDateVolumeSnapshotUuids(); + List newImageUuids = new ArrayList(); + + @Override + public void setup() { + flow(new Flow() { + String __name__ = "prepare-db"; + + @Override + public void run(FlowTrigger trigger, Map data) { + imageGroupVO = new SQLBatchWithReturn() { + @Override + protected ImageGroupVO scripts() { + String groupUuid = StringUtils.isEmpty(msg.getResourceUuid()) ? Platform.getUuid() : msg.getResourceUuid(); + ImageGroupVO vo = new ImageGroupVO(); + vo.setUuid(groupUuid); + vo.setName(msg.getName()); + vo.setStatus(ImageStatus.Creating); + vo.setDescription(msg.getDescription()); + vo.setImageCount(1); + if (!CollectionUtils.isEmpty(dataVolumeSnapshotUuids)) { + vo.setImageCount(1 + dataVolumeSnapshotUuids.size()); + } + vo = persist(vo); + return vo; + } + }.execute(); + trigger.next(); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + dbf.removeByPrimaryKey(imageGroupVO.getUuid(), ImageGroupVO.class); + trigger.rollback(); + } + }); + flow(new Flow() { + String __name__ = "create-root-template-from-snapshot"; + + @Override + public void run(FlowTrigger trigger, Map data) { + CreateRootVolumeTemplateFromVolumeSnapshotMsg cmsg = new CreateRootVolumeTemplateFromVolumeSnapshotMsg(); + cmsg.setName("create-from-snap-" + rootVolumeSnapshotUuid); + cmsg.setSnapshotUuid(rootVolumeSnapshotUuid); + cmsg.setSession(msg.getSession()); + bus.makeLocalServiceId(cmsg, ImageConstant.SERVICE_ID); + bus.send(cmsg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply r) { + if (!r.isSuccess()) { + trigger.fail(r.getError()); + return; + } + + CreateRootVolumeTemplateFromVolumeSnapshotReply reply = r.castReply(); + ImageInventory imageInv = ((CreateRootVolumeTemplateFromVolumeSnapshotReply) reply).getInventory(); + newImageUuids.add(imageInv.getUuid()); + trigger.next(); + } + }); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + if (CollectionUtils.isEmpty(newImageUuids)) { + trigger.rollback(); + return; + } + for (String uuid : newImageUuids) { + ImageDeletionMsg delMsg = new ImageDeletionMsg(); + delMsg.setImageUuid(uuid); + delMsg.setDeletionPolicy(VolumeDeletionPolicyManager.VolumeDeletionPolicy.Direct.toString()); + delMsg.setForceDelete(true); + bus.makeTargetServiceIdByResourceUuid(delMsg, ImageConstant.SERVICE_ID, uuid); + bus.send(delMsg); + newImageUuids.remove(uuid); + } + trigger.rollback(); + } + }); + + flow(new Flow() { + String __name__ = "create-data-templates-from-snapshots"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (CollectionUtils.isEmpty(dataVolumeSnapshotUuids)) { + trigger.next(); + return; + } + + List errors = new ArrayList<>(); + new While<>(dataVolumeSnapshotUuids).each((iUuid, compl) -> { + CreateDataVolumeTemplateFromVolumeSnapshotMsg csmsg = new CreateDataVolumeTemplateFromVolumeSnapshotMsg(); + csmsg.setName(String.format("create-from-snapshot-%s", iUuid)); + csmsg.setSnapshotUuid(iUuid); + csmsg.setSession(msg.getSession()); + bus.makeLocalServiceId(csmsg, ImageConstant.SERVICE_ID); + bus.send(csmsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + errors.add(reply.getError()); + compl.allDone(); + } + + ImageInventory imageInv = ((CreateDataVolumeTemplateFromVolumeSnapshotReply) reply).getInventory(); + newImageUuids.add(imageInv.getUuid()); + compl.done(); + } + }); + }).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errors.isEmpty()) { + trigger.fail(errors.get(0)); + return; + } + trigger.next(); + } + }); + + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + if (CollectionUtils.isEmpty(newImageUuids)) { + trigger.rollback(); + return; + } + for (String uuid : newImageUuids) { + ImageDeletionMsg delMsg = new ImageDeletionMsg(); + delMsg.setImageUuid(uuid); + delMsg.setDeletionPolicy(VolumeDeletionPolicyManager.VolumeDeletionPolicy.Direct.toString()); + delMsg.setForceDelete(true); + bus.makeTargetServiceIdByResourceUuid(delMsg, ImageConstant.SERVICE_ID, uuid); + bus.send(delMsg); + newImageUuids.remove(uuid); + } + trigger.rollback(); + } + }); + + flow(new NoRollbackFlow() { + @Override + public void run(FlowTrigger trigger, Map data) { + String __name__ = "create-image-group-in-database"; + + imageGroupVO = new SQLBatchWithReturn() { + @Override + protected ImageGroupVO scripts() { + ImageGroupVO vo = findByUuid(imageGroupVO.getUuid(), ImageGroupVO.class); + vo.setStatus(ImageStatus.Ready); + vo = merge(vo); + + new HashSet(newImageUuids).forEach( + resourceUuid -> { + ImageGroupRefVO refVO = new ImageGroupRefVO(); + refVO.setImageGroupUuid(imageGroupVO.getUuid()); + refVO.setImageUuid(resourceUuid); + persist(refVO); + } + ); + return vo; + } + }.execute(); + trigger.next(); + } + }); + + done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + ImageGroupInventory inv = ImageGroupInventory.valueOf(imageGroupVO); + completion.success(inv); + } + }); + + error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }); + } + }).start(); + } + + + private void createImageGroupFromVmInstance(APICreateImageGroupFromVmInstanceMsg msg, String vmUuid, ReturnValueCompletion completion) { + FlowChain chain = FlowChainBuilder.newShareFlowChain(); + chain.setName(String.format("create-image-group-from-vm-instance-%s", vmUuid)); + chain.then(new ShareFlow() { + ImageGroupVO imageGroupVO = new ImageGroupVO(); + String rootVolumeUuid; + List dataVolumeUuids = new ArrayList(); + List newVolumeUuids = new ArrayList(); + + @Override + public void setup() { + flow(new Flow() { + String __name__ = "prepare-db"; + + @Override + public void run(FlowTrigger trigger, Map data) { + List volumes = Q.New(VolumeVO.class).eq(VolumeVO_.vmInstanceUuid, vmUuid).list(); + if (CollectionUtils.isEmpty(volumes)) { + trigger.fail(operr("vm instance[uuid:%s] has no volume", vmUuid)); + return; + } + + for (VolumeVO vol : volumes) { + if (vol.getType() == VolumeType.Root) { + rootVolumeUuid = vol.getUuid(); + } else { + dataVolumeUuids.add(vol.getUuid()); + } + } + + if (rootVolumeUuid == null) { + trigger.fail(operr("vm instance[uuid:%s] has no root volume", vmUuid)); + return; + } + + imageGroupVO = new SQLBatchWithReturn() { + @Override + protected ImageGroupVO scripts() { + String groupUuid = StringUtils.isEmpty(msg.getResourceUuid()) ? Platform.getUuid() : msg.getResourceUuid(); + ImageGroupVO vo = new ImageGroupVO(); + vo.setUuid(groupUuid); + vo.setName(msg.getName()); + vo.setStatus(ImageStatus.Creating); + vo.setDescription(msg.getDescription()); + vo.setImageCount(1); + if (!CollectionUtils.isEmpty(dataVolumeUuids)) { + vo.setImageCount(1 + dataVolumeUuids.size()); + } + vo = persist(vo); + return vo; + } + }.execute(); + trigger.next(); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + dbf.removeByPrimaryKey(imageGroupVO.getUuid(), ImageGroupVO.class); + trigger.rollback(); + } + }); + + flow(new Flow() { + String __name__ = "create-root-template-from-volume"; + + @Override + public void run(FlowTrigger trigger, Map data) { + VmInstanceVO vmVO = Q.New(VmInstanceVO.class).eq(VmInstanceVO_.uuid, vmUuid).find(); + CreateRootVolumeTemplateFromRootVolumeMsg crtMsg = new CreateRootVolumeTemplateFromRootVolumeMsg(); + crtMsg.setRootVolumeUuid(rootVolumeUuid); + crtMsg.setName(String.format("create-from-root-volume-%s", rootVolumeUuid)); + crtMsg.setArchitecture(vmVO.getArchitecture()); + crtMsg.setPlatform(vmVO.getPlatform()); + crtMsg.setGuestOsType(vmVO.getPlatform()); + crtMsg.setDescription(msg.getDescription()); + crtMsg.setSession(msg.getSession()); + bus.makeLocalServiceId(crtMsg, ImageConstant.SERVICE_ID); + bus.send(crtMsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + return; + } + + ImageInventory imageInv = ((CreateRootVolumeTemplateFromRootVolumeReply) reply).getInventory(); + newVolumeUuids.add(imageInv.getUuid()); + trigger.next(); + } + }); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + if (CollectionUtils.isEmpty(newVolumeUuids)) { + trigger.rollback(); + return; + } + for (String uuid : newVolumeUuids) { + ImageDeletionMsg delMsg = new ImageDeletionMsg(); + delMsg.setImageUuid(uuid); + delMsg.setDeletionPolicy(VolumeDeletionPolicyManager.VolumeDeletionPolicy.Direct.toString()); + delMsg.setForceDelete(true); + bus.makeTargetServiceIdByResourceUuid(delMsg, ImageConstant.SERVICE_ID, uuid); + bus.send(delMsg); + newVolumeUuids.remove(uuid); + } + trigger.rollback(); + } + }); + + flow(new Flow() { + String __name__ = "create-data-templates-from-volumes"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (CollectionUtils.isEmpty(dataVolumeUuids)) { + trigger.next(); + return; + } + + List errors = new ArrayList<>(); + new While<>(dataVolumeUuids).each((volUuid, compl) -> { + CreateDataVolumeTemplateFromVolumeMsg cdtMsg = new CreateDataVolumeTemplateFromVolumeMsg(); + cdtMsg.setVolumeUuid(volUuid); + cdtMsg.setName(String.format("create-from-data-volume-%s", volUuid)); + cdtMsg.setDescription(msg.getDescription()); + cdtMsg.setSession(msg.getSession()); + bus.makeLocalServiceId(cdtMsg, ImageConstant.SERVICE_ID); + bus.send(cdtMsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + errors.add(reply.getError()); + compl.allDone(); + } + + ImageInventory imageInv = ((CreateDataVolumeTemplateFromVolumeReply) reply).getInventory(); + newVolumeUuids.add(imageInv.getUuid()); + compl.done(); + } + }); + }).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errors.isEmpty()) { + trigger.fail(errors.get(0)); + return; + } + trigger.next(); + } + }); + + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + if (CollectionUtils.isEmpty(newVolumeUuids)) { + trigger.rollback(); + return; + } + for (String uuid : newVolumeUuids) { + ImageDeletionMsg delMsg = new ImageDeletionMsg(); + delMsg.setImageUuid(uuid); + delMsg.setDeletionPolicy(VolumeDeletionPolicyManager.VolumeDeletionPolicy.Direct.toString()); + delMsg.setForceDelete(true); + bus.makeTargetServiceIdByResourceUuid(delMsg, ImageConstant.SERVICE_ID, uuid); + bus.send(delMsg); + newVolumeUuids.remove(uuid); + } + trigger.rollback(); + } + }); + + flow(new NoRollbackFlow() { + @Override + public void run(FlowTrigger trigger, Map data) { + String __name__ = "create-image-group-ref-in-database"; + + imageGroupVO = new SQLBatchWithReturn() { + @Override + protected ImageGroupVO scripts() { + ImageGroupVO vo = findByUuid(imageGroupVO.getUuid(), ImageGroupVO.class); + vo.setStatus(ImageStatus.Ready); + vo = merge(vo); + + new HashSet(newVolumeUuids).forEach( + resourceUuid -> { + ImageVO image = q(ImageVO.class) + .eq(ImageVO_.uuid, resourceUuid) + .find(); + + ImageGroupRefVO refVO = new ImageGroupRefVO(); + refVO.setImageGroupUuid(imageGroupVO.getUuid()); + refVO.setImageUuid(resourceUuid); + persist(refVO); + } + ); + return vo; + } + }.execute(); + trigger.next(); + } + }); + + done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + ImageGroupInventory inv = ImageGroupInventory.valueOf(imageGroupVO); + completion.success(inv); + } + }); + + error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }); + } + }).start(); + } + private void handle(final APICreateDataVolumeTemplateFromVolumeMsg msg) { APICreateDataVolumeTemplateFromVolumeEvent evt = new APICreateDataVolumeTemplateFromVolumeEvent(msg.getId()); createDataVolumeTemplateFromVolume(msg, msg.getVolumeUuid(), new ReturnValueCompletion(evt) { @@ -806,6 +1391,88 @@ private void handle(final APIAddImageMsg msg) { handleAddImageMsg(data, evt); } + private void handle(final APICloneImageMsg msg) { + APICloneImageEvent evt = new APICloneImageEvent(msg.getId()); + Set copiedRefs; + ImageVO sourceImage = dbf.findByUuid(msg.getImageUuid(), ImageVO.class); + if (sourceImage == null) { + throw new OperationFailureException(operr("source image [%s] not existed", msg.getImageUuid())); + } + if (sourceImage.getStatus() != ImageStatus.Ready) { + throw new OperationFailureException(operr("cannot clone image, because image [%s] status is not ready", msg.getImageUuid())); + } + + ImageVO vo = new ImageVO(); + if (msg.getResourceUuid() != null) { + dbf.eoCleanup(ImageVO.class, msg.getResourceUuid()); + vo.setUuid(msg.getResourceUuid()); + } else { + vo.setUuid(Platform.getUuid()); + } + vo.setName(String.format("Clone-from-%s", sourceImage.getName())); + vo.setDescription(sourceImage.getDescription()); + vo.setStatus(ImageStatus.Ready); + vo.setState(sourceImage.getState()); + vo.setSize(sourceImage.getSize()); + vo.setActualSize(sourceImage.getActualSize()); + vo.setMd5Sum(sourceImage.getMd5Sum()); + vo.setPlatform(sourceImage.getPlatform()); + vo.setType(sourceImage.getType()); + vo.setFormat(sourceImage.getFormat()); + vo.setUrl(sourceImage.getUrl()); + vo.setSystem(sourceImage.isSystem()); + vo.setMediaType(sourceImage.getMediaType()); + vo.setCreateDate(sourceImage.getCreateDate()); + vo.setLastOpDate(sourceImage.getLastOpDate()); + vo.setGuestOsType(sourceImage.getGuestOsType()); + vo.setArchitecture(sourceImage.getArchitecture()); + vo.setVirtio(sourceImage.getVirtio()); + vo.setAccountUuid(sourceImage.getAccountUuid()); + copiedRefs = sourceImage.getBackupStorageRefs(); + + ImageFactory factory = getImageFacotry(ImageType.valueOf(sourceImage.getType())); + final ImageVO ivo = new SQLBatchWithReturn() { + @Override + protected ImageVO scripts() { + Set rvos = new HashSet<>(); + vo.setAccountUuid(sourceImage.getAccountUuid()); + tagMgr.createTagsFromAPICreateMessage(msg, vo.getUuid(), ImageVO.class.getSimpleName()); + ImageVO ivo = factory.createImage(vo); + for (ImageBackupStorageRefVO ref : copiedRefs) { + ImageBackupStorageRefVO rvo = copyImageBackupStorageRefVO(ref); + rvo.setImageUuid(vo.getUuid()); + + persist(rvo); + rvos.add(rvo); + } + + ivo.setBackupStorageRefs(rvos); + ivo = merge(ivo); + return ivo; + } + }.execute(); + + evt.setInventory(ImageInventory.valueOf(ivo)); + bus.publish(evt); + } + + private static ImageBackupStorageRefVO copyImageBackupStorageRefVO(ImageBackupStorageRefVO original) { + if (original == null) { + return null; + } + + ImageBackupStorageRefVO copy = new ImageBackupStorageRefVO(); + copy.setImageUuid(original.getImageUuid()); + copy.setBackupStorageUuid(original.getBackupStorageUuid()); + copy.setStatus(original.getStatus()); + copy.setInstallPath(original.getInstallPath()); + Timestamp now = Timestamp.valueOf(LocalDateTime.now()); + copy.setCreateDate(now); + copy.setLastOpDate(now); + + return copy; + } + @Override public String getId() { return bus.makeLocalServiceId(ImageConstant.SERVICE_ID); diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java index 2d0978f7a60..5c7247bda6b 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java @@ -1,968 +1,969 @@ -package org.zstack.network.service.flat; - -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; -import org.zstack.compute.vm.UserdataBuilder; -import org.zstack.compute.vm.VmSystemTags; -import org.zstack.core.asyncbatch.While; -import org.zstack.core.cloudbus.CloudBus; -import org.zstack.core.cloudbus.CloudBusCallBack; -import org.zstack.core.componentloader.PluginRegistry; -import org.zstack.core.db.DatabaseFacade; -import org.zstack.core.db.Q; -import org.zstack.core.gc.GC; -import org.zstack.core.gc.GCCompletion; -import org.zstack.core.gc.TimeBasedGarbageCollector; -import org.zstack.core.timeout.ApiTimeoutManager; -import org.zstack.core.upgrade.GrayVersion; -import org.zstack.core.workflow.FlowChainBuilder; -import org.zstack.core.workflow.ShareFlow; -import org.zstack.header.core.Completion; -import org.zstack.header.core.ReturnValueCompletion; -import org.zstack.header.core.WhileDoneCompletion; -import org.zstack.header.core.workflow.*; -import org.zstack.header.errorcode.ErrorCode; -import org.zstack.header.errorcode.ErrorCodeList; -import org.zstack.header.host.HostConstant; -import org.zstack.header.host.HostStatus; -import org.zstack.header.host.HostVO; -import org.zstack.header.host.HostVO_; -import org.zstack.header.message.MessageReply; -import org.zstack.header.network.l2.L2NetworkInventory; -import org.zstack.header.network.l2.L2NetworkUpdateExtensionPoint; -import org.zstack.header.network.l3.*; -import org.zstack.header.network.service.*; -import org.zstack.header.vm.*; -import org.zstack.header.zone.ZoneVO; -import org.zstack.kvm.*; -import org.zstack.kvm.KVMAgentCommands.AgentResponse; -import org.zstack.network.l2.L2NetworkHostHelper; -import org.zstack.network.service.NetworkProviderFinder; -import org.zstack.network.service.NetworkServiceFilter; -import org.zstack.network.service.NetworkServiceManager; -import org.zstack.network.service.userdata.*; -import org.zstack.utils.CollectionUtils; -import org.zstack.utils.Utils; -import org.zstack.utils.function.Function; -import org.zstack.utils.logging.CLogger; -import org.zstack.utils.network.IPv6Constants; - -import javax.persistence.Tuple; -import javax.persistence.TypedQuery; -import java.util.*; -import java.util.concurrent.Callable; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -import static org.zstack.core.Platform.operr; - -/** - * Created by frank on 10/13/2015. - */ -public class FlatUserdataBackend implements UserdataBackend, KVMHostConnectExtensionPoint, - L3NetworkDeleteExtensionPoint, L2NetworkUpdateExtensionPoint, VmInstanceMigrateExtensionPoint { - private static final CLogger logger = Utils.getLogger(FlatUserdataBackend.class); - - @Autowired - private CloudBus bus; - @Autowired - private DatabaseFacade dbf; - @Autowired - private ApiTimeoutManager timeoutMgr; - @Autowired - private FlatDhcpBackend dhcpBackend; - @Autowired - private PluginRegistry pluginRgty; - @Autowired - private NetworkServiceManager nsMgr; - - public static final String APPLY_USER_DATA = "/flatnetworkprovider/userdata/apply"; - public static final String BATCH_APPLY_USER_DATA = "/flatnetworkprovider/userdata/batchapply"; - public static final String RELEASE_USER_DATA = "/flatnetworkprovider/userdata/release"; - public static final String CLEANUP_USER_DATA = "/flatnetworkprovider/userdata/cleanup"; - - private String getVmNicMacAddressByVmInstanceId(String vmInstanceId) { - String sql = "SELECT nic.mac " + - "FROM VmInstanceVO vm " + - "JOIN VmNicVO nic ON vm.uuid = nic.vmInstanceUuid " + - "WHERE vm.uuid = :vmInstanceId " + - "AND nic.l3NetworkUuid = vm.defaultL3NetworkUuid"; - - TypedQuery q = dbf.getEntityManager().createQuery(sql, String.class); - q.setParameter("vmInstanceId", vmInstanceId); - - List resultList = q.getResultList(); - if (resultList.isEmpty()) { - return null; - } - return resultList.get(0); - } - - - private String getZoneNameByVmInstanceId(String vmInstanceId) { - VmInstanceVO vmInstance = dbf.findByUuid(vmInstanceId, VmInstanceVO.class); - if (vmInstance == null || vmInstance.getZoneUuid() == null) { - return null; - } - - String zoneId = vmInstance.getZoneUuid(); - - ZoneVO zone = dbf.findByUuid(zoneId, ZoneVO.class); - if (zone == null) { - return null; - } - - return zone.getName(); - } - - private String getDnsServersIp(String vmInstanceId) { - String sql = "SELECT dns.dns FROM VmInstanceVO AS v " + - "JOIN L3NetworkDnsVO AS dns ON v.defaultL3NetworkUuid = dns.l3NetworkUuid " + - "WHERE v.uuid = :vmInstanceId"; - - TypedQuery query = dbf.getEntityManager().createQuery(sql, String.class); - query.setParameter("vmInstanceId", vmInstanceId); - List dnsServers = query.getResultList(); - if (dnsServers.isEmpty()) { - return null; - } - - StringBuilder dnsIpListBuilder = new StringBuilder(); - for (String dnsIp : dnsServers) { - dnsIpListBuilder.append(dnsIp).append("\n"); - } - // 删除最后一个多余的换行符(如果存在) - if (dnsIpListBuilder.length() > 0) { - dnsIpListBuilder.setLength(dnsIpListBuilder.length() - 1); - } - - return dnsIpListBuilder.toString(); - } - - private String getVpcIdByVmInstanceUuid(String vmInstanceUuid) { - String sql = "SELECT DISTINCT vm.uuid " + - "FROM VmInstanceVO vm " + - "JOIN VmNicVO nic ON vm.uuid = nic.vmInstanceUuid " + - "WHERE vm.type = 'ApplianceVm' " + - "AND nic.l3NetworkUuid IN (" + - " SELECT v.defaultL3NetworkUuid " + - " FROM VmInstanceVO v " + - " WHERE v.uuid = :vmInstanceUuid" + - ")"; - - TypedQuery query = dbf.getEntityManager().createQuery(sql, String.class); - query.setParameter("vmInstanceUuid", vmInstanceUuid); - - List results = query.getResultList(); - if (results.isEmpty()) { - return null; - } - - return results.get(0); - } - - private List getNetworkInterfaceDetails(String vmInstanceUuid) { - String sql = "select DISTINCT nic.mac, nic.ip, nic.netmask, nic.gateway, ipr.networkCidr " + - "from VmNicVO nic " + - "join IpRangeVO ipr on nic.l3NetworkUuid = ipr.l3NetworkUuid " + // 加入对IpRangeVO的JOIN - "where nic.vmInstanceUuid = :vmInstanceUuid " + - "and nic.ipVersion = :ipversion " ; - - TypedQuery q = dbf.getEntityManager().createQuery(sql, Tuple.class); - q.setParameter("vmInstanceUuid", vmInstanceUuid); - q.setParameter("ipversion", IPv6Constants.IPv4); - List ts = q.getResultList(); - - List networkInterfaceDetailsList = new ArrayList<>(); - - for (Tuple t : ts) { - NetworkInterfaceDetails details = new NetworkInterfaceDetails(); - details.macAddress = t.get(0, String.class); - details.ip = t.get(1, String.class); - details.netmask = t.get(2, String.class); - details.gateway = t.get(3, String.class); - details.vpcCidrBlock = t.get(4, String.class); - details.vSwitchCidrBlock = t.get(4, String.class); - networkInterfaceDetailsList.add(details); - } - - return networkInterfaceDetailsList; - } - @Override - public Flow createKvmHostConnectingFlow(final KVMHostConnectedContext context) { - return createHostPrepareUserdataFlow(context.getInventory().getUuid()); - } - - private Flow createHostPrepareUserdataFlow(final String hostUuid) { - return new NoRollbackFlow() { - String __name__ = "prepare-userdata"; - - @Transactional(readOnly = true) - private List getVmsNeedUserdataOnHost() { - String sql = "select vm.uuid from VmInstanceVO vm where vm.hostUuid = :huuid and vm.state = :state and vm.type = :type"; - TypedQuery q = dbf.getEntityManager().createQuery(sql, String.class); - q.setParameter("state", VmInstanceState.Running); - q.setParameter("huuid", hostUuid); - q.setParameter("type", VmInstanceConstant.USER_VM_TYPE); - List vmUuids = q.getResultList(); - if (vmUuids.isEmpty()) { - return null; - } - - vmUuids = new NetworkServiceFilter().filterVmByServiceTypeAndProviderType(vmUuids, UserdataConstant.USERDATA_TYPE_STRING, FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING); - if (vmUuids.isEmpty()) { - return null; - } - - return vmUuids; - } - - class VmIpL3Uuid { - String vmIp; - String netmask; - String l3Uuid; - String dhcpServerIp; - } - - @Transactional(readOnly = true) - private Map getVmIpL3Uuid(List vmUuids) { - String sql = "select vm.uuid, ip.ip, ip.l3NetworkUuid, ip.netmask from VmInstanceVO vm," + - "VmNicVO nic, NetworkServiceL3NetworkRefVO ref," + - "NetworkServiceProviderVO pro, UsedIpVO ip where " + - " vm.uuid = nic.vmInstanceUuid and vm.uuid in (:uuids)" + - " and nic.uuid = ip.vmNicUuid " + - " and ip.l3NetworkUuid = vm.defaultL3NetworkUuid and ip.ipVersion = :ipversion" + - " and ref.networkServiceProviderUuid = pro.uuid" + - " and ref.l3NetworkUuid = vm.defaultL3NetworkUuid" + - " and pro.type = :proType"; - - TypedQuery q = dbf.getEntityManager().createQuery(sql, Tuple.class); - q.setParameter("uuids", vmUuids); - q.setParameter("proType", FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING); - /* current only ipv4 has userdata */ - q.setParameter("ipversion", IPv6Constants.IPv4); - List ts = q.getResultList(); - - Map ret = new HashMap(); - for (Tuple t : ts) { - String vmUuid = t.get(0, String.class); - VmIpL3Uuid v = new VmIpL3Uuid(); - v.vmIp = t.get(1, String.class); - v.l3Uuid = t.get(2, String.class); - v.netmask = t.get(3, String.class); - ret.put(vmUuid, v); - } - - return ret; - } - - private List getUserData() { - List vmUuids = getVmsNeedUserdataOnHost(); - if (vmUuids == null) { - return null; - } - - Map vmipl3 = getVmIpL3Uuid(vmUuids); - if (vmipl3.isEmpty()) { - return null; - } - - // filter out vm that not using flat network provider - vmUuids = vmUuids.stream().filter(vmipl3::containsKey).collect(Collectors.toList()); - if (vmUuids.isEmpty()) { - return null; - } - - Map> userdata = new UserdataBuilder().buildByVmUuids(vmUuids); - Set l3Uuids = new HashSet(); - for (VmIpL3Uuid l : vmipl3.values()) { - String dhcpIp = dhcpBackend.allocateDhcpIp(l.l3Uuid, IPv6Constants.IPv4); - if (dhcpIp != null) { - l.dhcpServerIp = dhcpIp; - } - l3Uuids.add(l.l3Uuid); - } - List tos = new ArrayList<>(); - if (l3Uuids.isEmpty()) { - return tos; - } - Map bridgeNames = new BridgeNameFinder().findByL3Uuids(l3Uuids); - List l2Uuids = Q.New(L3NetworkVO.class) - .select(L3NetworkVO_.l2NetworkUuid).in(L3NetworkVO_.uuid, l3Uuids).listValues(); - Map bridgesVlan = new BridgeVlanIdFinder().findByL2Uuids(l2Uuids); - - for (String vmuuid : vmUuids) { - UserdataTO to = new UserdataTO(); - MetadataTO mto = new MetadataTO(); - mto.vmUuid = vmuuid; - mto.vmHostname = VmSystemTags.HOSTNAME.getTokenByResourceUuid(vmuuid, VmSystemTags.HOSTNAME_TOKEN); - mto.regionName = getZoneNameByVmInstanceId(vmuuid); - mto.mac = getVmNicMacAddressByVmInstanceId(vmuuid); - mto.dnsServersIp = getDnsServersIp(vmuuid); - mto.vpcId = getVpcIdByVmInstanceUuid(vmuuid); - to.metadata = mto; - - VmIpL3Uuid l = vmipl3.get(vmuuid); - if (l.vmIp == null) { - continue; - } - - if (bridgeNames.get(l.l3Uuid) == null) { - continue; - } - - if (l.netmask == null) { - /* user data config need netmask */ - logger.info(String.format("can not get netmask for vmnic[ip:%s] for vm[uuid:%s]", - l.vmIp, vmuuid)); - continue; - } - - to.networkInterfaces = getNetworkInterfaceDetails(vmuuid); - to.dhcpServerIp = l.dhcpServerIp; - to.vmIp = l.vmIp; - to.netmask = l.netmask; - to.bridgeName = bridgeNames.get(l.l3Uuid); - to.vlanId = bridgesVlan.get(to.bridgeName); - to.namespaceName = FlatDhcpBackend.makeNamespaceName(to.bridgeName, l.l3Uuid); - if (userdata.get(vmuuid) != null) { - to.userdataList.addAll(userdata.get(vmuuid)); - } - to.port = UserdataGlobalProperty.HOST_PORT; - to.l3NetworkUuid = l.l3Uuid; - to.agentConfig = new HashMap<>(); - for (BeforeUpdateUserdataExtensionPoint ext : pluginRgty.getExtensionList(BeforeUpdateUserdataExtensionPoint.class)) { - ext.beforeApplyUserdata(vmuuid, to); - } - tos.add(to); - } - - return tos; - } - - @Override - public void run(final FlowTrigger trigger, Map data) { - List tos = getUserData(); - if (tos == null) { - trigger.next(); - return; - } - - BatchApplyUserdataCmd cmd = new BatchApplyUserdataCmd(); - cmd.userdata = tos; - cmd.rebuild = true; - - new KvmCommandSender(hostUuid, true).send(cmd, BATCH_APPLY_USER_DATA, new KvmCommandFailureChecker() { - @Override - public ErrorCode getError(KvmResponseWrapper wrapper) { - AgentResponse rsp = wrapper.getResponse(AgentResponse.class); - return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); - } - }, new ReturnValueCompletion(trigger) { - @Override - public void success(KvmResponseWrapper returnValue) { - trigger.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - trigger.fail(errorCode); - } - }); - } - }; - } - - @Override - public String preDeleteL3Network(L3NetworkInventory inventory) { - return null; - } - - @Override - public void beforeDeleteL3Network(L3NetworkInventory inventory) { - } - - @Override - public void afterDeleteL3Network(L3NetworkInventory l3) { - Optional o = l3.getNetworkServices().stream().filter(n -> n.getNetworkServiceType().equals(UserdataConstant.USERDATA_TYPE_STRING)).findAny(); - if (!o.isPresent()) { - return; - } - - NetworkServiceL3NetworkRefInventory ref = o.get(); - if (!dbf.isExist(ref.getNetworkServiceProviderUuid(), NetworkServiceProviderVO.class)) { - return; - } - - List hostUuids = new Callable>() { - @Override - @Transactional(readOnly = true) - public List call() { - String sql = "select h.uuid from HostVO h, L2NetworkClusterRefVO ref where h.clusterUuid = ref.clusterUuid" + - " and ref.l2NetworkUuid = :l2Uuid and h.hypervisorType = :hvType"; - TypedQuery q = dbf.getEntityManager().createQuery(sql, String.class); - q.setParameter("l2Uuid", l3.getL2NetworkUuid()); - q.setParameter("hvType", KVMConstant.KVM_HYPERVISOR_TYPE); - return q.getResultList(); - } - }.call(); - - if (hostUuids.isEmpty()) { - return; - } - - CleanupUserdataCmd cmd = new CleanupUserdataCmd(); - cmd.bridgeName = new BridgeNameFinder().findByL3Uuid(l3.getUuid()); - cmd.l3NetworkUuid = l3.getUuid(); - cmd.namespaceName = FlatDhcpBackend.makeNamespaceName(cmd.bridgeName, cmd.l3NetworkUuid); - - for (String huuid : hostUuids) { - new KvmCommandSender(huuid).send(cmd, CLEANUP_USER_DATA, new KvmCommandFailureChecker() { - @Override - public ErrorCode getError(KvmResponseWrapper w) { - CleanupUserdataRsp rsp = w.getResponse(CleanupUserdataRsp.class); - return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); - } - }, new ReturnValueCompletion(null) { - @Override - public void success(KvmResponseWrapper w) { - logger.debug(String.format("successfully cleanup userdata service on the host[uuid:%s] for the deleted L3 network[uuid:%s, name:%s]", - huuid, l3.getUuid(), l3.getName())); - } - - @Override - public void fail(ErrorCode errorCode) { - //TODO: Add GC - logger.warn(errorCode.toString()); - } - }); - } - } - - private UserdataStruct makeUserdataStructForMigratingVm(VmInstanceInventory inv, String hostUuid) { - if (!nsMgr.isVmNeedNetworkService(inv.getType(), UserdataConstant.USERDATA_TYPE)) { - return null; - } - - String providerType = new NetworkProviderFinder().getNetworkProviderTypeByNetworkServiceType(inv.getDefaultL3NetworkUuid(), UserdataConstant.USERDATA_TYPE_STRING); - if (!FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING.equals(providerType)) { - return null; - } - - List userdataList = new UserdataBuilder().buildByVmUuid(inv.getUuid()); - if (userdataList == null) { - // Apply userdata anyway after migrating VM to redeploy lighttpd server - // so that the VM can still send metric data to pushgateway through lighttpd - userdataList = Collections.emptyList(); - } - - UserdataStruct struct = new UserdataStruct(); - struct.setParametersFromVmInventory(inv); - struct.setHostUuid(hostUuid); - struct.setL3NetworkUuid(inv.getDefaultL3NetworkUuid()); - struct.setUserdataList(userdataList); - return struct; - } - - - @Override - public void preMigrateVm(VmInstanceInventory inv, String destHostUuid, Completion completion) { - UserdataStruct struct = makeUserdataStructForMigratingVm(inv, destHostUuid); - if (struct == null) { - completion.success(); - return; - } - - applyUserdata(struct, completion); - } - - @Override - public void beforeMigrateVm(VmInstanceInventory inv, String destHostUuid) { - - } - - public static class UserdataReleseGC extends TimeBasedGarbageCollector { - public static long INTERVAL = 300; - - @GC - public UserdataStruct struct; - - @Override - protected void triggerNow(GCCompletion completion) { - - HostStatus status = Q.New(HostVO.class).select(HostVO_.status).eq(HostVO_.uuid, struct.getHostUuid()).findValue(); - if (status == null) { - // host deleted - completion.cancel(); - return; - } - - if (status != HostStatus.Connected) { - completion.fail(operr("host[uuid:%s] is not connected", struct.getHostUuid())); - return; - } - - String vmIp = CollectionUtils.find(struct.getVmNics(), arg -> arg.getL3NetworkUuid().equals(struct.getL3NetworkUuid()) ? arg.getIp() : null); - if (vmIp == null) { - completion.cancel(); - return; - } - - ReleaseUserdataCmd cmd = new ReleaseUserdataCmd(); - cmd.hostUuid = struct.getHostUuid(); - cmd.bridgeName = new BridgeNameFinder().findByL3Uuid(struct.getL3NetworkUuid()); - cmd.namespaceName = FlatDhcpBackend.makeNamespaceName(cmd.bridgeName, struct.getL3NetworkUuid()); - cmd.vmIp = vmIp; - - KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); - msg.setHostUuid(struct.getHostUuid()); - msg.setCommand(cmd); - msg.setPath(RELEASE_USER_DATA); - bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, struct.getHostUuid()); - bus.send(msg, new CloudBusCallBack(completion) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - completion.fail(reply.getError()); - return; - } - - KVMHostAsyncHttpCallReply r = reply.castReply(); - ReleaseUserdataRsp rsp = r.toResponse(ReleaseUserdataRsp.class); - if (!rsp.isSuccess()) { - completion.fail(operr("operation error, because:%s", rsp.getError())); - return; - } - - completion.success(); - } - }); - } - } - - @Override - public void afterMigrateVm(VmInstanceInventory inv, String srcHostUuid) { - UserdataStruct struct = makeUserdataStructForMigratingVm(inv, srcHostUuid); - if (struct == null) { - return; - } - - releaseUserdata(struct, new Completion(null) { - @Override - public void success() { - // nothing - } - - @Override - public void fail(ErrorCode errorCode) { - logger.warn(String.format("failed to release userdata on the source host[uuid:%s]" + - " for the migrated VM[uuid: %s, name:%s], %s. GC will take care it", srcHostUuid, inv.getUuid(), inv.getName(), errorCode)); - UserdataReleseGC gc = new UserdataReleseGC(); - gc.struct = struct; - gc.submit(UserdataReleseGC.INTERVAL, TimeUnit.SECONDS); - } - }); - } - - @Override - public void failedToMigrateVm(VmInstanceInventory inv, String destHostUuid, ErrorCode reason) { - if (destHostUuid == null) { - return; - } - - UserdataStruct struct = makeUserdataStructForMigratingVm(inv, destHostUuid); - if (struct == null) { - return; - } - - // clean the userdata that set on the dest host - releaseUserdata(struct, new Completion(null) { - @Override - public void success() { - // nothing - } - - @Override - public void fail(ErrorCode errorCode) { - UserdataReleseGC gc = new UserdataReleseGC(); - gc.struct = struct; - gc.submit(UserdataReleseGC.INTERVAL, TimeUnit.SECONDS); - } - }); - } - - public static class UserdataTO { - public MetadataTO metadata; - public List networkInterfaces; - public List userdataList = new ArrayList<>(); - public String vmIp; - public String netmask; - public String dhcpServerIp; - public String bridgeName; - public String vlanId; - public String namespaceName; - public String l3NetworkUuid; - public Map agentConfig; - public int port; - } - - public static class MetadataTO { - public String vmUuid; - public String vmHostname; - public String regionName; - public String mac; - public String dnsServersIp; - public String vpcId; - } - - public static class NetworkInterfaceDetails { - public String macAddress; - public String ip; - public String vpcCidrBlock; - public String vSwitchCidrBlock; - public String netmask; - public String gateway; - } - - public static class CleanupUserdataCmd extends KVMAgentCommands.AgentCommand { - @GrayVersion(value = "5.0.0") - public String bridgeName; - @GrayVersion(value = "5.0.0") - public String l3NetworkUuid; - @GrayVersion(value = "5.0.0") - public String namespaceName; - } - - public static class CleanupUserdataRsp extends KVMAgentCommands.AgentResponse { - - } - - public static class BatchApplyUserdataCmd extends KVMAgentCommands.AgentCommand { - @GrayVersion(value = "5.0.0") - public List userdata; - @GrayVersion(value = "5.0.0") - public boolean rebuild; - } - - public static class ApplyUserdataCmd extends KVMAgentCommands.AgentCommand { - @GrayVersion(value = "5.0.0") - public String hostUuid; - @GrayVersion(value = "5.0.0") - public UserdataTO userdata; - } - - public static class ApplyUserdataRsp extends KVMAgentCommands.AgentResponse { - - } - - public static class ReleaseUserdataCmd extends KVMAgentCommands.AgentCommand { - @GrayVersion(value = "5.0.0") - public String hostUuid; - @GrayVersion(value = "5.0.0") - public String vmIp; - @GrayVersion(value = "5.0.0") - public String bridgeName; - @GrayVersion(value = "5.0.0") - public String namespaceName; - } - - public static class ReleaseUserdataRsp extends KVMAgentCommands.AgentResponse { - } - - @Override - public NetworkServiceProviderType getProviderType() { - return FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE; - } - - private boolean hasMetedata(UserdataStruct struct) { - return VmSystemTags.HOSTNAME.getTokenByResourceUuid(struct.getVmUuid(), VmSystemTags.HOSTNAME_TOKEN) != null; - } - - private boolean hasUserdata(UserdataStruct struct) { - return struct.getUserdataList() != null && !struct.getUserdataList().isEmpty(); - } - - @Override - public void applyUserdata(final UserdataStruct struct, final Completion completion) { - if (!UserdataGlobalConfig.OPEN_USERDATA_SERVICE_BY_DEFAULT.value(Boolean.class)) { - if ( !hasMetedata(struct) && !hasUserdata(struct)) { - completion.success(); - return; - } - } - - if (new FlatNetworkServiceValidator().validate(struct.getHostUuid())) { - completion.success(); - return; - } - - VmNicInventory destNic = CollectionUtils.find(struct.getVmNics(), new Function() { - @Override - public VmNicInventory call(VmNicInventory arg) { - return arg.getL3NetworkUuid().equals(struct.getL3NetworkUuid()) ? arg : null; - } - }); - - if (destNic == null) { - completion.success(); - return; - } - - L3NetworkVO defaultL3 = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.uuid, struct.getL3NetworkUuid()).find(); - if (defaultL3!= null && defaultL3.getNetworkServices().stream().noneMatch( - service -> Objects.equals(UserdataConstant.USERDATA_TYPE_STRING, service.getNetworkServiceType()))) { - completion.success(); - return; - } - - UsedIpVO ipv4 = Q.New(UsedIpVO.class).eq(UsedIpVO_.vmNicUuid, destNic.getUuid()) - .eq(UsedIpVO_.ipVersion, IPv6Constants.IPv4).limit(1).find(); - if (ipv4 == null) { - // userdata depends on the ipv4 address - completion.success(); - return; - } - if (StringUtils.isEmpty(ipv4.getNetmask())) { - // userdata depends on the ipv4 netmask - logger.info(String.format("can not get netmask for vmnic[ip:%s] for vm[uuid:%s]", - ipv4.getIp(), struct.getVmUuid())); - completion.success(); - return; - } - - - FlowChain chain = FlowChainBuilder.newShareFlowChain(); - chain.setName(String.format("flat-network-userdata-set-for-vm-%s", struct.getVmUuid())); - chain.then(new ShareFlow() { - String dhcpServerIp; - - @Override - public void setup() { - flow(new NoRollbackFlow() { - String __name__ = "get-dhcp-server-ip"; - - @Override - public void run(final FlowTrigger trigger, Map data) { - FlatDhcpAcquireDhcpServerIpMsg msg = new FlatDhcpAcquireDhcpServerIpMsg(); - msg.setL3NetworkUuid(struct.getL3NetworkUuid()); - bus.makeTargetServiceIdByResourceUuid(msg, FlatNetworkServiceConstant.SERVICE_ID, struct.getL3NetworkUuid()); - bus.send(msg, new CloudBusCallBack(trigger) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - trigger.fail(reply.getError()); - return; - } - - FlatDhcpAcquireDhcpServerIpReply dreply = (FlatDhcpAcquireDhcpServerIpReply) reply; - if (dreply.getDhcpServerList() != null && !dreply.getDhcpServerList().isEmpty()) { - dhcpServerIp = dreply.getDhcpServerList().get(0).getIp(); - } - - - trigger.next(); - } - }); - } - }); - - flow(new NoRollbackFlow() { - String __name__ = "apply-user-data"; - - @Override - public void run(final FlowTrigger trigger, Map data) { - ApplyUserdataCmd cmd = new ApplyUserdataCmd(); - cmd.hostUuid = struct.getHostUuid(); - - MetadataTO to = new MetadataTO(); - to.vmUuid = struct.getVmUuid(); - to.vmHostname = VmSystemTags.HOSTNAME.getTokenByResourceUuid(struct.getVmUuid(), VmSystemTags.HOSTNAME_TOKEN); - to.regionName = getZoneNameByVmInstanceId(struct.getVmUuid()); - to.mac = destNic.getMac(); - to.dnsServersIp = getDnsServersIp(struct.getVmUuid()); - to.vpcId = getVpcIdByVmInstanceUuid(struct.getVmUuid()); - UserdataTO uto = new UserdataTO(); - uto.metadata = to; - uto.networkInterfaces = getNetworkInterfaceDetails(struct.getVmUuid()); - uto.userdataList = struct.getUserdataList(); - uto.dhcpServerIp = dhcpServerIp; - uto.vmIp = ipv4.getIp(); - uto.netmask = ipv4.getNetmask(); - uto.bridgeName = new BridgeNameFinder().findByL3Uuid(struct.getL3NetworkUuid()); - uto.vlanId = new BridgeVlanIdFinder().findByL2Uuid(defaultL3.getL2NetworkUuid(), false); - uto.namespaceName = FlatDhcpBackend.makeNamespaceName(uto.bridgeName, struct.getL3NetworkUuid()); - uto.port = UserdataGlobalProperty.HOST_PORT; - uto.l3NetworkUuid = struct.getL3NetworkUuid(); - uto.agentConfig = new HashMap<>(); - for (BeforeUpdateUserdataExtensionPoint ext : pluginRgty.getExtensionList(BeforeUpdateUserdataExtensionPoint.class)) { - ext.beforeApplyUserdata(struct.getVmUuid(), uto); - } - cmd.userdata = uto; - - KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); - msg.setHostUuid(struct.getHostUuid()); - msg.setCommand(cmd); - msg.setPath(APPLY_USER_DATA); - bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, struct.getHostUuid()); - bus.send(msg, new CloudBusCallBack(trigger) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - trigger.fail(reply.getError()); - return; - } - - KVMHostAsyncHttpCallReply r = reply.castReply(); - ApplyUserdataRsp rsp = r.toResponse(ApplyUserdataRsp.class); - if (!rsp.isSuccess()) { - trigger.fail(operr("operation error, because:%s", rsp.getError())); - return; - } - - trigger.next(); - } - }); - } - }); - - done(new FlowDoneHandler(completion) { - @Override - public void handle(Map data) { - completion.success(); - } - }); - - error(new FlowErrorHandler(completion) { - @Override - public void handle(ErrorCode errCode, Map data) { - completion.fail(errCode); - } - }); - } - }).start(); - } - - @Override - public void releaseUserdata(final UserdataStruct struct, final Completion completion) { - if (new FlatNetworkServiceValidator().validate(struct.getHostUuid())) { - completion.success(); - return; - } - - - VmNicInventory destNic = CollectionUtils.find(struct.getVmNics(), new Function() { - @Override - public VmNicInventory call(VmNicInventory arg) { - return arg.getL3NetworkUuid().equals(struct.getL3NetworkUuid()) ? arg : null; - } - }); - - if (destNic == null) { - completion.success(); - return; - } - - UsedIpInventory ipv4 = destNic.getUsedIps().stream().filter(ip -> ip.getIpVersion() == IPv6Constants.IPv4).findAny().orElse(null); - if (ipv4 == null) { - // userdata depends on the ipv4 address - completion.success(); - return; - } - - FlowChain chain = FlowChainBuilder.newShareFlowChain(); - chain.setName(String.format("flat-network-userdata-release-for-vm-%s", struct.getVmUuid())); - chain.then(new ShareFlow() { - @Override - public void setup() { - flow(new NoRollbackFlow() { - String __name__ = "release-user-data"; - - @Override - public void run(final FlowTrigger trigger, Map data) { - ReleaseUserdataCmd cmd = new ReleaseUserdataCmd(); - cmd.hostUuid = struct.getHostUuid(); - cmd.bridgeName = new BridgeNameFinder().findByL3Uuid(struct.getL3NetworkUuid()); - cmd.namespaceName = FlatDhcpBackend.makeNamespaceName(cmd.bridgeName, struct.getL3NetworkUuid()); - cmd.vmIp = ipv4.getIp(); - - KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); - msg.setHostUuid(struct.getHostUuid()); - msg.setCommand(cmd); - msg.setPath(RELEASE_USER_DATA); - bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, struct.getHostUuid()); - bus.send(msg, new CloudBusCallBack(trigger) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - trigger.fail(reply.getError()); - return; - } - - KVMHostAsyncHttpCallReply r = reply.castReply(); - ReleaseUserdataRsp rsp = r.toResponse(ReleaseUserdataRsp.class); - if (!rsp.isSuccess()) { - trigger.fail(operr("operation error, because:%s", rsp.getError())); - return; - } - - trigger.next(); - } - }); - } - }); - - done(new FlowDoneHandler(completion) { - @Override - public void handle(Map data) { - completion.success(); - } - }); - - error(new FlowErrorHandler(completion) { - @Override - public void handle(ErrorCode errCode, Map data) { - completion.fail(errCode); - } - }); - } - }).start(); - } - - @Override - public void beforeChangeL2NetworkVlanId(L2NetworkInventory l2Inv) { - - } - - @Override - public void afterChangeL2NetworkVlanId(L2NetworkInventory l2Inv) { - new While<>(L2NetworkHostHelper.getHostsByL2NetworkAttachedCluster(l2Inv)).step((host, whileCompletion) -> { - FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); - chain.setName(String.format("after-l2-%s-changed-flat-network-userdata-apply-in-host-%s", - l2Inv.getUuid(), host.getUuid())); - chain.then(createHostPrepareUserdataFlow(host.getUuid())); - chain.done(new FlowDoneHandler(whileCompletion) { - @Override - public void handle(Map data) { - whileCompletion.done(); - } - }).error(new FlowErrorHandler(whileCompletion) { - @Override - public void handle(ErrorCode errCode, Map data) { - whileCompletion.addError(errCode); - whileCompletion.allDone(); - } - }).start(); - },10).run(new WhileDoneCompletion(null) { - @Override - public void done(ErrorCodeList errorCodeList) { - if (!errorCodeList.getCauses().isEmpty()) { - logger.error(String.format("apply userdata failed after L2Network changed, because:%s", - errorCodeList.getCauses().get(0))); - } else { - logger.debug("apply userdata successful after L2Network changed"); - } - } - }); - } -} +package org.zstack.network.service.flat; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.zstack.compute.vm.UserdataBuilder; +import org.zstack.compute.vm.VmSystemTags; +import org.zstack.core.asyncbatch.While; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.cloudbus.CloudBusCallBack; +import org.zstack.core.componentloader.PluginRegistry; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; +import org.zstack.core.gc.GC; +import org.zstack.core.gc.GCCompletion; +import org.zstack.core.gc.TimeBasedGarbageCollector; +import org.zstack.core.timeout.ApiTimeoutManager; +import org.zstack.core.upgrade.GrayVersion; +import org.zstack.core.workflow.FlowChainBuilder; +import org.zstack.core.workflow.ShareFlow; +import org.zstack.header.core.Completion; +import org.zstack.header.core.ReturnValueCompletion; +import org.zstack.header.core.WhileDoneCompletion; +import org.zstack.header.core.workflow.*; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.ErrorCodeList; +import org.zstack.header.host.HostConstant; +import org.zstack.header.host.HostStatus; +import org.zstack.header.host.HostVO; +import org.zstack.header.host.HostVO_; +import org.zstack.header.message.MessageReply; +import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.network.l2.L2NetworkUpdateExtensionPoint; +import org.zstack.header.network.l3.*; +import org.zstack.header.network.service.*; +import org.zstack.header.vm.*; +import org.zstack.header.zone.ZoneVO; +import org.zstack.kvm.*; +import org.zstack.kvm.KVMAgentCommands.AgentResponse; +import org.zstack.network.l2.L2NetworkHostHelper; +import org.zstack.network.service.NetworkProviderFinder; +import org.zstack.network.service.NetworkServiceFilter; +import org.zstack.network.service.NetworkServiceManager; +import org.zstack.network.service.userdata.*; +import org.zstack.utils.CollectionUtils; +import org.zstack.utils.Utils; +import org.zstack.utils.function.Function; +import org.zstack.utils.logging.CLogger; +import org.zstack.utils.network.IPv6Constants; + +import javax.persistence.Tuple; +import javax.persistence.TypedQuery; +import java.util.*; +import java.util.concurrent.Callable; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import static org.zstack.core.Platform.operr; + +/** + * Created by frank on 10/13/2015. + */ +public class FlatUserdataBackend implements UserdataBackend, KVMHostConnectExtensionPoint, + L3NetworkDeleteExtensionPoint, L2NetworkUpdateExtensionPoint, VmInstanceMigrateExtensionPoint { + private static final CLogger logger = Utils.getLogger(FlatUserdataBackend.class); + + @Autowired + private CloudBus bus; + @Autowired + private DatabaseFacade dbf; + @Autowired + private ApiTimeoutManager timeoutMgr; + @Autowired + private FlatDhcpBackend dhcpBackend; + @Autowired + private PluginRegistry pluginRgty; + @Autowired + private NetworkServiceManager nsMgr; + + public static final String APPLY_USER_DATA = "/flatnetworkprovider/userdata/apply"; + public static final String BATCH_APPLY_USER_DATA = "/flatnetworkprovider/userdata/batchapply"; + public static final String RELEASE_USER_DATA = "/flatnetworkprovider/userdata/release"; + public static final String CLEANUP_USER_DATA = "/flatnetworkprovider/userdata/cleanup"; + + private String getVmNicMacAddressByVmInstanceId(String vmInstanceId) { + String sql = "SELECT nic.mac " + + "FROM VmInstanceVO vm " + + "JOIN VmNicVO nic ON vm.uuid = nic.vmInstanceUuid " + + "WHERE vm.uuid = :vmInstanceId " + + "AND nic.l3NetworkUuid = vm.defaultL3NetworkUuid"; + + TypedQuery q = dbf.getEntityManager().createQuery(sql, String.class); + q.setParameter("vmInstanceId", vmInstanceId); + + List resultList = q.getResultList(); + if (resultList.isEmpty()) { + return null; + } + return resultList.get(0); + } + + + private String getZoneNameByVmInstanceId(String vmInstanceId) { + VmInstanceVO vmInstance = dbf.findByUuid(vmInstanceId, VmInstanceVO.class); + if (vmInstance == null || vmInstance.getZoneUuid() == null) { + return null; + } + + String zoneId = vmInstance.getZoneUuid(); + + ZoneVO zone = dbf.findByUuid(zoneId, ZoneVO.class); + if (zone == null) { + return null; + } + + return zone.getName(); + } + + private String getDnsServersIp(String vmInstanceId) { + String sql = "SELECT dns.dns FROM VmInstanceVO AS v " + + "JOIN L3NetworkDnsVO AS dns ON v.defaultL3NetworkUuid = dns.l3NetworkUuid " + + "WHERE v.uuid = :vmInstanceId"; + + TypedQuery query = dbf.getEntityManager().createQuery(sql, String.class); + query.setParameter("vmInstanceId", vmInstanceId); + List dnsServers = query.getResultList(); + if (dnsServers.isEmpty()) { + return null; + } + + StringBuilder dnsIpListBuilder = new StringBuilder(); + for (String dnsIp : dnsServers) { + dnsIpListBuilder.append(dnsIp).append("\n"); + } + // Delete the last extra newline character, if it exists. + if (dnsIpListBuilder.length() > 0) { + dnsIpListBuilder.setLength(dnsIpListBuilder.length() - 1); + } + + return dnsIpListBuilder.toString(); + } + + private String getVpcIdByVmInstanceUuid(String vmInstanceUuid) { + String sql = "SELECT DISTINCT vm.uuid " + + "FROM VmInstanceVO vm " + + "JOIN VmNicVO nic ON vm.uuid = nic.vmInstanceUuid " + + "WHERE vm.type = 'ApplianceVm' " + + "AND nic.l3NetworkUuid IN (" + + " SELECT v.defaultL3NetworkUuid " + + " FROM VmInstanceVO v " + + " WHERE v.uuid = :vmInstanceUuid" + + ")"; + + TypedQuery query = dbf.getEntityManager().createQuery(sql, String.class); + query.setParameter("vmInstanceUuid", vmInstanceUuid); + + List results = query.getResultList(); + if (results.isEmpty()) { + return null; + } + + return results.get(0); + } + + private List getNetworkInterfaceDetails(String vmInstanceUuid) { + String sql = "select DISTINCT nic.mac, nic.ip, nic.netmask, nic.gateway, ipr.networkCidr " + + "from VmNicVO nic " + + "join IpRangeVO ipr on nic.l3NetworkUuid = ipr.l3NetworkUuid " + // 加入对IpRangeVO的JOIN + "where nic.vmInstanceUuid = :vmInstanceUuid " + + "and nic.ipVersion = :ipversion "; + + TypedQuery q = dbf.getEntityManager().createQuery(sql, Tuple.class); + q.setParameter("vmInstanceUuid", vmInstanceUuid); + q.setParameter("ipversion", IPv6Constants.IPv4); + List ts = q.getResultList(); + + List networkInterfaceDetailsList = new ArrayList<>(); + + for (Tuple t : ts) { + NetworkInterfaceDetails details = new NetworkInterfaceDetails(); + details.macAddress = t.get(0, String.class); + details.ip = t.get(1, String.class); + details.netmask = t.get(2, String.class); + details.gateway = t.get(3, String.class); + details.vpcCidrBlock = t.get(4, String.class); + details.vSwitchCidrBlock = t.get(4, String.class); + networkInterfaceDetailsList.add(details); + } + + return networkInterfaceDetailsList; + } + + @Override + public Flow createKvmHostConnectingFlow(final KVMHostConnectedContext context) { + return createHostPrepareUserdataFlow(context.getInventory().getUuid()); + } + + private Flow createHostPrepareUserdataFlow(final String hostUuid) { + return new NoRollbackFlow() { + String __name__ = "prepare-userdata"; + + @Transactional(readOnly = true) + private List getVmsNeedUserdataOnHost() { + String sql = "select vm.uuid from VmInstanceVO vm where vm.hostUuid = :huuid and vm.state = :state and vm.type = :type"; + TypedQuery q = dbf.getEntityManager().createQuery(sql, String.class); + q.setParameter("state", VmInstanceState.Running); + q.setParameter("huuid", hostUuid); + q.setParameter("type", VmInstanceConstant.USER_VM_TYPE); + List vmUuids = q.getResultList(); + if (vmUuids.isEmpty()) { + return null; + } + + vmUuids = new NetworkServiceFilter().filterVmByServiceTypeAndProviderType(vmUuids, UserdataConstant.USERDATA_TYPE_STRING, FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING); + if (vmUuids.isEmpty()) { + return null; + } + + return vmUuids; + } + + class VmIpL3Uuid { + String vmIp; + String netmask; + String l3Uuid; + String dhcpServerIp; + } + + @Transactional(readOnly = true) + private Map getVmIpL3Uuid(List vmUuids) { + String sql = "select vm.uuid, ip.ip, ip.l3NetworkUuid, ip.netmask from VmInstanceVO vm," + + "VmNicVO nic, NetworkServiceL3NetworkRefVO ref," + + "NetworkServiceProviderVO pro, UsedIpVO ip where " + + " vm.uuid = nic.vmInstanceUuid and vm.uuid in (:uuids)" + + " and nic.uuid = ip.vmNicUuid " + + " and ip.l3NetworkUuid = vm.defaultL3NetworkUuid and ip.ipVersion = :ipversion" + + " and ref.networkServiceProviderUuid = pro.uuid" + + " and ref.l3NetworkUuid = vm.defaultL3NetworkUuid" + + " and pro.type = :proType"; + + TypedQuery q = dbf.getEntityManager().createQuery(sql, Tuple.class); + q.setParameter("uuids", vmUuids); + q.setParameter("proType", FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING); + /* current only ipv4 has userdata */ + q.setParameter("ipversion", IPv6Constants.IPv4); + List ts = q.getResultList(); + + Map ret = new HashMap(); + for (Tuple t : ts) { + String vmUuid = t.get(0, String.class); + VmIpL3Uuid v = new VmIpL3Uuid(); + v.vmIp = t.get(1, String.class); + v.l3Uuid = t.get(2, String.class); + v.netmask = t.get(3, String.class); + ret.put(vmUuid, v); + } + + return ret; + } + + private List getUserData() { + List vmUuids = getVmsNeedUserdataOnHost(); + if (vmUuids == null) { + return null; + } + + Map vmipl3 = getVmIpL3Uuid(vmUuids); + if (vmipl3.isEmpty()) { + return null; + } + + // filter out vm that not using flat network provider + vmUuids = vmUuids.stream().filter(vmipl3::containsKey).collect(Collectors.toList()); + if (vmUuids.isEmpty()) { + return null; + } + + Map> userdata = new UserdataBuilder().buildByVmUuids(vmUuids); + Set l3Uuids = new HashSet(); + for (VmIpL3Uuid l : vmipl3.values()) { + String dhcpIp = dhcpBackend.allocateDhcpIp(l.l3Uuid, IPv6Constants.IPv4); + if (dhcpIp != null) { + l.dhcpServerIp = dhcpIp; + } + l3Uuids.add(l.l3Uuid); + } + List tos = new ArrayList<>(); + if (l3Uuids.isEmpty()) { + return tos; + } + Map bridgeNames = new BridgeNameFinder().findByL3Uuids(l3Uuids); + List l2Uuids = Q.New(L3NetworkVO.class) + .select(L3NetworkVO_.l2NetworkUuid).in(L3NetworkVO_.uuid, l3Uuids).listValues(); + Map bridgesVlan = new BridgeVlanIdFinder().findByL2Uuids(l2Uuids); + + for (String vmuuid : vmUuids) { + UserdataTO to = new UserdataTO(); + MetadataTO mto = new MetadataTO(); + mto.vmUuid = vmuuid; + mto.vmHostname = VmSystemTags.HOSTNAME.getTokenByResourceUuid(vmuuid, VmSystemTags.HOSTNAME_TOKEN); + mto.regionName = getZoneNameByVmInstanceId(vmuuid); + mto.mac = getVmNicMacAddressByVmInstanceId(vmuuid); + mto.dnsServersIp = getDnsServersIp(vmuuid); + mto.vpcId = getVpcIdByVmInstanceUuid(vmuuid); + to.metadata = mto; + + VmIpL3Uuid l = vmipl3.get(vmuuid); + if (l.vmIp == null) { + continue; + } + + if (bridgeNames.get(l.l3Uuid) == null) { + continue; + } + + if (l.netmask == null) { + /* user data config need netmask */ + logger.info(String.format("can not get netmask for vmnic[ip:%s] for vm[uuid:%s]", + l.vmIp, vmuuid)); + continue; + } + + to.networkInterfaces = getNetworkInterfaceDetails(vmuuid); + to.dhcpServerIp = l.dhcpServerIp; + to.vmIp = l.vmIp; + to.netmask = l.netmask; + to.bridgeName = bridgeNames.get(l.l3Uuid); + to.vlanId = bridgesVlan.get(to.bridgeName); + to.namespaceName = FlatDhcpBackend.makeNamespaceName(to.bridgeName, l.l3Uuid); + if (userdata.get(vmuuid) != null) { + to.userdataList.addAll(userdata.get(vmuuid)); + } + to.port = UserdataGlobalProperty.HOST_PORT; + to.l3NetworkUuid = l.l3Uuid; + to.agentConfig = new HashMap<>(); + for (BeforeUpdateUserdataExtensionPoint ext : pluginRgty.getExtensionList(BeforeUpdateUserdataExtensionPoint.class)) { + ext.beforeApplyUserdata(vmuuid, to); + } + tos.add(to); + } + + return tos; + } + + @Override + public void run(final FlowTrigger trigger, Map data) { + List tos = getUserData(); + if (tos == null) { + trigger.next(); + return; + } + + BatchApplyUserdataCmd cmd = new BatchApplyUserdataCmd(); + cmd.userdata = tos; + cmd.rebuild = true; + + new KvmCommandSender(hostUuid, true).send(cmd, BATCH_APPLY_USER_DATA, new KvmCommandFailureChecker() { + @Override + public ErrorCode getError(KvmResponseWrapper wrapper) { + AgentResponse rsp = wrapper.getResponse(AgentResponse.class); + return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); + } + }, new ReturnValueCompletion(trigger) { + @Override + public void success(KvmResponseWrapper returnValue) { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }; + } + + @Override + public String preDeleteL3Network(L3NetworkInventory inventory) { + return null; + } + + @Override + public void beforeDeleteL3Network(L3NetworkInventory inventory) { + } + + @Override + public void afterDeleteL3Network(L3NetworkInventory l3) { + Optional o = l3.getNetworkServices().stream().filter(n -> n.getNetworkServiceType().equals(UserdataConstant.USERDATA_TYPE_STRING)).findAny(); + if (!o.isPresent()) { + return; + } + + NetworkServiceL3NetworkRefInventory ref = o.get(); + if (!dbf.isExist(ref.getNetworkServiceProviderUuid(), NetworkServiceProviderVO.class)) { + return; + } + + List hostUuids = new Callable>() { + @Override + @Transactional(readOnly = true) + public List call() { + String sql = "select h.uuid from HostVO h, L2NetworkClusterRefVO ref where h.clusterUuid = ref.clusterUuid" + + " and ref.l2NetworkUuid = :l2Uuid and h.hypervisorType = :hvType"; + TypedQuery q = dbf.getEntityManager().createQuery(sql, String.class); + q.setParameter("l2Uuid", l3.getL2NetworkUuid()); + q.setParameter("hvType", KVMConstant.KVM_HYPERVISOR_TYPE); + return q.getResultList(); + } + }.call(); + + if (hostUuids.isEmpty()) { + return; + } + + CleanupUserdataCmd cmd = new CleanupUserdataCmd(); + cmd.bridgeName = new BridgeNameFinder().findByL3Uuid(l3.getUuid()); + cmd.l3NetworkUuid = l3.getUuid(); + cmd.namespaceName = FlatDhcpBackend.makeNamespaceName(cmd.bridgeName, cmd.l3NetworkUuid); + + for (String huuid : hostUuids) { + new KvmCommandSender(huuid).send(cmd, CLEANUP_USER_DATA, new KvmCommandFailureChecker() { + @Override + public ErrorCode getError(KvmResponseWrapper w) { + CleanupUserdataRsp rsp = w.getResponse(CleanupUserdataRsp.class); + return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); + } + }, new ReturnValueCompletion(null) { + @Override + public void success(KvmResponseWrapper w) { + logger.debug(String.format("successfully cleanup userdata service on the host[uuid:%s] for the deleted L3 network[uuid:%s, name:%s]", + huuid, l3.getUuid(), l3.getName())); + } + + @Override + public void fail(ErrorCode errorCode) { + //TODO: Add GC + logger.warn(errorCode.toString()); + } + }); + } + } + + private UserdataStruct makeUserdataStructForMigratingVm(VmInstanceInventory inv, String hostUuid) { + if (!nsMgr.isVmNeedNetworkService(inv.getType(), UserdataConstant.USERDATA_TYPE)) { + return null; + } + + String providerType = new NetworkProviderFinder().getNetworkProviderTypeByNetworkServiceType(inv.getDefaultL3NetworkUuid(), UserdataConstant.USERDATA_TYPE_STRING); + if (!FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING.equals(providerType)) { + return null; + } + + List userdataList = new UserdataBuilder().buildByVmUuid(inv.getUuid()); + if (userdataList == null) { + // Apply userdata anyway after migrating VM to redeploy lighttpd server + // so that the VM can still send metric data to pushgateway through lighttpd + userdataList = Collections.emptyList(); + } + + UserdataStruct struct = new UserdataStruct(); + struct.setParametersFromVmInventory(inv); + struct.setHostUuid(hostUuid); + struct.setL3NetworkUuid(inv.getDefaultL3NetworkUuid()); + struct.setUserdataList(userdataList); + return struct; + } + + + @Override + public void preMigrateVm(VmInstanceInventory inv, String destHostUuid, Completion completion) { + UserdataStruct struct = makeUserdataStructForMigratingVm(inv, destHostUuid); + if (struct == null) { + completion.success(); + return; + } + + applyUserdata(struct, completion); + } + + @Override + public void beforeMigrateVm(VmInstanceInventory inv, String destHostUuid) { + + } + + public static class UserdataReleseGC extends TimeBasedGarbageCollector { + public static long INTERVAL = 300; + + @GC + public UserdataStruct struct; + + @Override + protected void triggerNow(GCCompletion completion) { + + HostStatus status = Q.New(HostVO.class).select(HostVO_.status).eq(HostVO_.uuid, struct.getHostUuid()).findValue(); + if (status == null) { + // host deleted + completion.cancel(); + return; + } + + if (status != HostStatus.Connected) { + completion.fail(operr("host[uuid:%s] is not connected", struct.getHostUuid())); + return; + } + + String vmIp = CollectionUtils.find(struct.getVmNics(), arg -> arg.getL3NetworkUuid().equals(struct.getL3NetworkUuid()) ? arg.getIp() : null); + if (vmIp == null) { + completion.cancel(); + return; + } + + ReleaseUserdataCmd cmd = new ReleaseUserdataCmd(); + cmd.hostUuid = struct.getHostUuid(); + cmd.bridgeName = new BridgeNameFinder().findByL3Uuid(struct.getL3NetworkUuid()); + cmd.namespaceName = FlatDhcpBackend.makeNamespaceName(cmd.bridgeName, struct.getL3NetworkUuid()); + cmd.vmIp = vmIp; + + KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); + msg.setHostUuid(struct.getHostUuid()); + msg.setCommand(cmd); + msg.setPath(RELEASE_USER_DATA); + bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, struct.getHostUuid()); + bus.send(msg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + completion.fail(reply.getError()); + return; + } + + KVMHostAsyncHttpCallReply r = reply.castReply(); + ReleaseUserdataRsp rsp = r.toResponse(ReleaseUserdataRsp.class); + if (!rsp.isSuccess()) { + completion.fail(operr("operation error, because:%s", rsp.getError())); + return; + } + + completion.success(); + } + }); + } + } + + @Override + public void afterMigrateVm(VmInstanceInventory inv, String srcHostUuid) { + UserdataStruct struct = makeUserdataStructForMigratingVm(inv, srcHostUuid); + if (struct == null) { + return; + } + + releaseUserdata(struct, new Completion(null) { + @Override + public void success() { + // nothing + } + + @Override + public void fail(ErrorCode errorCode) { + logger.warn(String.format("failed to release userdata on the source host[uuid:%s]" + + " for the migrated VM[uuid: %s, name:%s], %s. GC will take care it", srcHostUuid, inv.getUuid(), inv.getName(), errorCode)); + UserdataReleseGC gc = new UserdataReleseGC(); + gc.struct = struct; + gc.submit(UserdataReleseGC.INTERVAL, TimeUnit.SECONDS); + } + }); + } + + @Override + public void failedToMigrateVm(VmInstanceInventory inv, String destHostUuid, ErrorCode reason) { + if (destHostUuid == null) { + return; + } + + UserdataStruct struct = makeUserdataStructForMigratingVm(inv, destHostUuid); + if (struct == null) { + return; + } + + // clean the userdata that set on the dest host + releaseUserdata(struct, new Completion(null) { + @Override + public void success() { + // nothing + } + + @Override + public void fail(ErrorCode errorCode) { + UserdataReleseGC gc = new UserdataReleseGC(); + gc.struct = struct; + gc.submit(UserdataReleseGC.INTERVAL, TimeUnit.SECONDS); + } + }); + } + + public static class UserdataTO { + public MetadataTO metadata; + public List networkInterfaces; + public List userdataList = new ArrayList<>(); + public String vmIp; + public String netmask; + public String dhcpServerIp; + public String bridgeName; + public String vlanId; + public String namespaceName; + public String l3NetworkUuid; + public Map agentConfig; + public int port; + } + + public static class MetadataTO { + public String vmUuid; + public String vmHostname; + public String regionName; + public String mac; + public String dnsServersIp; + public String vpcId; + } + + public static class NetworkInterfaceDetails { + public String macAddress; + public String ip; + public String vpcCidrBlock; + public String vSwitchCidrBlock; + public String netmask; + public String gateway; + } + + public static class CleanupUserdataCmd extends KVMAgentCommands.AgentCommand { + @GrayVersion(value = "5.0.0") + public String bridgeName; + @GrayVersion(value = "5.0.0") + public String l3NetworkUuid; + @GrayVersion(value = "5.0.0") + public String namespaceName; + } + + public static class CleanupUserdataRsp extends KVMAgentCommands.AgentResponse { + + } + + public static class BatchApplyUserdataCmd extends KVMAgentCommands.AgentCommand { + @GrayVersion(value = "5.0.0") + public List userdata; + @GrayVersion(value = "5.0.0") + public boolean rebuild; + } + + public static class ApplyUserdataCmd extends KVMAgentCommands.AgentCommand { + @GrayVersion(value = "5.0.0") + public String hostUuid; + @GrayVersion(value = "5.0.0") + public UserdataTO userdata; + } + + public static class ApplyUserdataRsp extends KVMAgentCommands.AgentResponse { + + } + + public static class ReleaseUserdataCmd extends KVMAgentCommands.AgentCommand { + @GrayVersion(value = "5.0.0") + public String hostUuid; + @GrayVersion(value = "5.0.0") + public String vmIp; + @GrayVersion(value = "5.0.0") + public String bridgeName; + @GrayVersion(value = "5.0.0") + public String namespaceName; + } + + public static class ReleaseUserdataRsp extends KVMAgentCommands.AgentResponse { + } + + @Override + public NetworkServiceProviderType getProviderType() { + return FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE; + } + + private boolean hasMetedata(UserdataStruct struct) { + return VmSystemTags.HOSTNAME.getTokenByResourceUuid(struct.getVmUuid(), VmSystemTags.HOSTNAME_TOKEN) != null; + } + + private boolean hasUserdata(UserdataStruct struct) { + return struct.getUserdataList() != null && !struct.getUserdataList().isEmpty(); + } + + @Override + public void applyUserdata(final UserdataStruct struct, final Completion completion) { + if (!UserdataGlobalConfig.OPEN_USERDATA_SERVICE_BY_DEFAULT.value(Boolean.class)) { + if (!hasMetedata(struct) && !hasUserdata(struct)) { + completion.success(); + return; + } + } + + if (new FlatNetworkServiceValidator().validate(struct.getHostUuid())) { + completion.success(); + return; + } + + VmNicInventory destNic = CollectionUtils.find(struct.getVmNics(), new Function() { + @Override + public VmNicInventory call(VmNicInventory arg) { + return arg.getL3NetworkUuid().equals(struct.getL3NetworkUuid()) ? arg : null; + } + }); + + if (destNic == null) { + completion.success(); + return; + } + + L3NetworkVO defaultL3 = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.uuid, struct.getL3NetworkUuid()).find(); + if (defaultL3 != null && defaultL3.getNetworkServices().stream().noneMatch( + service -> Objects.equals(UserdataConstant.USERDATA_TYPE_STRING, service.getNetworkServiceType()))) { + completion.success(); + return; + } + + UsedIpVO ipv4 = Q.New(UsedIpVO.class).eq(UsedIpVO_.vmNicUuid, destNic.getUuid()) + .eq(UsedIpVO_.ipVersion, IPv6Constants.IPv4).limit(1).find(); + if (ipv4 == null) { + // userdata depends on the ipv4 address + completion.success(); + return; + } + if (StringUtils.isEmpty(ipv4.getNetmask())) { + // userdata depends on the ipv4 netmask + logger.info(String.format("can not get netmask for vmnic[ip:%s] for vm[uuid:%s]", + ipv4.getIp(), struct.getVmUuid())); + completion.success(); + return; + } + + + FlowChain chain = FlowChainBuilder.newShareFlowChain(); + chain.setName(String.format("flat-network-userdata-set-for-vm-%s", struct.getVmUuid())); + chain.then(new ShareFlow() { + String dhcpServerIp; + + @Override + public void setup() { + flow(new NoRollbackFlow() { + String __name__ = "get-dhcp-server-ip"; + + @Override + public void run(final FlowTrigger trigger, Map data) { + FlatDhcpAcquireDhcpServerIpMsg msg = new FlatDhcpAcquireDhcpServerIpMsg(); + msg.setL3NetworkUuid(struct.getL3NetworkUuid()); + bus.makeTargetServiceIdByResourceUuid(msg, FlatNetworkServiceConstant.SERVICE_ID, struct.getL3NetworkUuid()); + bus.send(msg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + return; + } + + FlatDhcpAcquireDhcpServerIpReply dreply = (FlatDhcpAcquireDhcpServerIpReply) reply; + if (dreply.getDhcpServerList() != null && !dreply.getDhcpServerList().isEmpty()) { + dhcpServerIp = dreply.getDhcpServerList().get(0).getIp(); + } + + + trigger.next(); + } + }); + } + }); + + flow(new NoRollbackFlow() { + String __name__ = "apply-user-data"; + + @Override + public void run(final FlowTrigger trigger, Map data) { + ApplyUserdataCmd cmd = new ApplyUserdataCmd(); + cmd.hostUuid = struct.getHostUuid(); + + MetadataTO to = new MetadataTO(); + to.vmUuid = struct.getVmUuid(); + to.vmHostname = VmSystemTags.HOSTNAME.getTokenByResourceUuid(struct.getVmUuid(), VmSystemTags.HOSTNAME_TOKEN); + to.regionName = getZoneNameByVmInstanceId(struct.getVmUuid()); + to.mac = destNic.getMac(); + to.dnsServersIp = getDnsServersIp(struct.getVmUuid()); + to.vpcId = getVpcIdByVmInstanceUuid(struct.getVmUuid()); + UserdataTO uto = new UserdataTO(); + uto.metadata = to; + uto.networkInterfaces = getNetworkInterfaceDetails(struct.getVmUuid()); + uto.userdataList = struct.getUserdataList(); + uto.dhcpServerIp = dhcpServerIp; + uto.vmIp = ipv4.getIp(); + uto.netmask = ipv4.getNetmask(); + uto.bridgeName = new BridgeNameFinder().findByL3Uuid(struct.getL3NetworkUuid()); + uto.vlanId = new BridgeVlanIdFinder().findByL2Uuid(defaultL3.getL2NetworkUuid(), false); + uto.namespaceName = FlatDhcpBackend.makeNamespaceName(uto.bridgeName, struct.getL3NetworkUuid()); + uto.port = UserdataGlobalProperty.HOST_PORT; + uto.l3NetworkUuid = struct.getL3NetworkUuid(); + uto.agentConfig = new HashMap<>(); + for (BeforeUpdateUserdataExtensionPoint ext : pluginRgty.getExtensionList(BeforeUpdateUserdataExtensionPoint.class)) { + ext.beforeApplyUserdata(struct.getVmUuid(), uto); + } + cmd.userdata = uto; + + KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); + msg.setHostUuid(struct.getHostUuid()); + msg.setCommand(cmd); + msg.setPath(APPLY_USER_DATA); + bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, struct.getHostUuid()); + bus.send(msg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + return; + } + + KVMHostAsyncHttpCallReply r = reply.castReply(); + ApplyUserdataRsp rsp = r.toResponse(ApplyUserdataRsp.class); + if (!rsp.isSuccess()) { + trigger.fail(operr("operation error, because:%s", rsp.getError())); + return; + } + + trigger.next(); + } + }); + } + }); + + done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }); + + error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }); + } + }).start(); + } + + @Override + public void releaseUserdata(final UserdataStruct struct, final Completion completion) { + if (new FlatNetworkServiceValidator().validate(struct.getHostUuid())) { + completion.success(); + return; + } + + + VmNicInventory destNic = CollectionUtils.find(struct.getVmNics(), new Function() { + @Override + public VmNicInventory call(VmNicInventory arg) { + return arg.getL3NetworkUuid().equals(struct.getL3NetworkUuid()) ? arg : null; + } + }); + + if (destNic == null) { + completion.success(); + return; + } + + UsedIpInventory ipv4 = destNic.getUsedIps().stream().filter(ip -> ip.getIpVersion() == IPv6Constants.IPv4).findAny().orElse(null); + if (ipv4 == null) { + // userdata depends on the ipv4 address + completion.success(); + return; + } + + FlowChain chain = FlowChainBuilder.newShareFlowChain(); + chain.setName(String.format("flat-network-userdata-release-for-vm-%s", struct.getVmUuid())); + chain.then(new ShareFlow() { + @Override + public void setup() { + flow(new NoRollbackFlow() { + String __name__ = "release-user-data"; + + @Override + public void run(final FlowTrigger trigger, Map data) { + ReleaseUserdataCmd cmd = new ReleaseUserdataCmd(); + cmd.hostUuid = struct.getHostUuid(); + cmd.bridgeName = new BridgeNameFinder().findByL3Uuid(struct.getL3NetworkUuid()); + cmd.namespaceName = FlatDhcpBackend.makeNamespaceName(cmd.bridgeName, struct.getL3NetworkUuid()); + cmd.vmIp = ipv4.getIp(); + + KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); + msg.setHostUuid(struct.getHostUuid()); + msg.setCommand(cmd); + msg.setPath(RELEASE_USER_DATA); + bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, struct.getHostUuid()); + bus.send(msg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + return; + } + + KVMHostAsyncHttpCallReply r = reply.castReply(); + ReleaseUserdataRsp rsp = r.toResponse(ReleaseUserdataRsp.class); + if (!rsp.isSuccess()) { + trigger.fail(operr("operation error, because:%s", rsp.getError())); + return; + } + + trigger.next(); + } + }); + } + }); + + done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }); + + error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }); + } + }).start(); + } + + @Override + public void beforeChangeL2NetworkVlanId(L2NetworkInventory l2Inv) { + + } + + @Override + public void afterChangeL2NetworkVlanId(L2NetworkInventory l2Inv) { + new While<>(L2NetworkHostHelper.getHostsByL2NetworkAttachedCluster(l2Inv)).step((host, whileCompletion) -> { + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("after-l2-%s-changed-flat-network-userdata-apply-in-host-%s", + l2Inv.getUuid(), host.getUuid())); + chain.then(createHostPrepareUserdataFlow(host.getUuid())); + chain.done(new FlowDoneHandler(whileCompletion) { + @Override + public void handle(Map data) { + whileCompletion.done(); + } + }).error(new FlowErrorHandler(whileCompletion) { + @Override + public void handle(ErrorCode errCode, Map data) { + whileCompletion.addError(errCode); + whileCompletion.allDone(); + } + }).start(); + }, 10).run(new WhileDoneCompletion(null) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + logger.error(String.format("apply userdata failed after L2Network changed, because:%s", + errorCodeList.getCauses().get(0))); + } else { + logger.debug("apply userdata successful after L2Network changed"); + } + } + }); + } +} diff --git a/portal/src/main/java/org/zstack/portal/apimediator/ApiMessageProcessorImpl.java b/portal/src/main/java/org/zstack/portal/apimediator/ApiMessageProcessorImpl.java index 9308df4be06..20d7df9a1c2 100755 --- a/portal/src/main/java/org/zstack/portal/apimediator/ApiMessageProcessorImpl.java +++ b/portal/src/main/java/org/zstack/portal/apimediator/ApiMessageProcessorImpl.java @@ -1,293 +1,293 @@ -package org.zstack.portal.apimediator; - -import org.springframework.beans.factory.NoSuchBeanDefinitionException; -import org.springframework.beans.factory.annotation.Autowire; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Configurable; -import org.zstack.core.CoreGlobalProperty; -import org.zstack.core.Platform; -import org.zstack.core.cloudbus.CloudBus; -import org.zstack.core.componentloader.ComponentLoader; -import org.zstack.core.componentloader.PluginRegistry; -import org.zstack.core.db.DatabaseFacade; -import org.zstack.core.errorcode.ErrorFacade; -import org.zstack.header.apimediator.ApiMessageInterceptionException; -import org.zstack.header.apimediator.ApiMessageInterceptor; -import org.zstack.header.apimediator.GlobalApiMessageInterceptor; -import org.zstack.header.apimediator.GlobalApiMessageInterceptor.InterceptorPosition; -import org.zstack.header.exception.CloudRuntimeException; -import org.zstack.header.message.*; -import org.zstack.portal.apimediator.schema.Service; -import org.zstack.utils.FieldUtils; -import org.zstack.utils.Utils; -import org.zstack.utils.logging.CLogger; -import org.zstack.utils.path.PathUtil; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; -import java.io.File; -import java.lang.reflect.Field; -import java.util.*; - -/** - * Created with IntelliJ IDEA. - * User: frank - * Time: 11:46 PM - * To change this template use File | Settings | File Templates. - */ -@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) -public class ApiMessageProcessorImpl implements ApiMessageProcessor { - private static CLogger logger = Utils.getLogger(ApiMessageProcessorImpl.class); - private Map descriptors = new HashMap(); - private Map> globalInterceptors = new HashMap>(); - private Set globalInterceptorsForAllMsg = new HashSet(); - private Comparator msgInterceptorComparator = Comparator - .comparingInt(ApiMessageProcessorImpl::interceptorPositionToOrder) - .thenComparing(ApiMessageInterceptor::getPriority); - - private static int interceptorPositionToOrder(ApiMessageInterceptor interceptor) { - if (interceptor instanceof GlobalApiMessageInterceptor) { - return ((GlobalApiMessageInterceptor) interceptor).getPosition().ordinal(); - } - - return InterceptorPosition.DEFAULT.ordinal(); - } - - @Autowired - private PluginRegistry pluginRgty; - @Autowired - private ErrorFacade errf; - @Autowired - private DatabaseFacade dbf; - @Autowired - private CloudBus bus; - - private boolean unitTestOn; - // add switch to skip api check for minimal - private boolean minimalOn; - private List configFolders; - List supportApis; - - private void dump() { - StringBuilder sb = new StringBuilder(); - for (Map.Entry e : descriptors.entrySet()) { - ApiMessageDescriptor desc = e.getValue(); - sb.append("\n-------------------------------------------"); - sb.append(String.format("\nname: %s", desc.getName())); - sb.append(String.format("\nconfigured service id: %s", desc.getServiceId())); - sb.append(String.format("\nconfig path: %s", desc.getConfigPath())); - List inc = new ArrayList(); - for (ApiMessageInterceptor ic : desc.getInterceptors()) { - inc.add(ic.getClass().getName()); - } - sb.append(String.format("\ninterceptors: %s", inc)); - sb.append("\n-------------------------------------------"); - } - - logger.debug(String.format("ApiMessageDescriptor dump:\n%s", sb.toString())); - } - - public ApiMessageProcessorImpl(Map config) { - this.unitTestOn = CoreGlobalProperty.UNIT_TEST_ON; - this.minimalOn = Platform.isMinimalOn(); - this.configFolders = (List )config.get("serviceConfigFolders"); - this.supportApis = new ArrayList<>(); - - populateGlobalInterceptors(); - - try { - JAXBContext context = JAXBContext.newInstance("org.zstack.portal.apimediator.schema"); - List paths = new ArrayList(); - for (String configFolder : this.configFolders) { - paths.addAll(PathUtil.scanFolderOnClassPath(configFolder)); - } - - for (String p : paths) { - if (!p.endsWith(".xml")) { - logger.warn(String.format("ignore %s which is not ending with .xml", p)); - continue; - } - - File cfg = new File(p); - Unmarshaller unmarshaller = context.createUnmarshaller(); - Service schema = (Service) unmarshaller.unmarshal(cfg); - createDescriptor(schema, cfg.getAbsolutePath()); - } - - if (!this.unitTestOn) { - dump(); - } - } catch (JAXBException e) { - throw new CloudRuntimeException(e); - } - } - - private void prepareInterceptors(ApiMessageDescriptor desc, Service.Message mschema, Service schema) { - ComponentLoader loader = Platform.getComponentLoader(); - List interceptors = new ArrayList(); - List icNames = new ArrayList(); - icNames.addAll(mschema.getInterceptor()); - icNames.addAll(schema.getInterceptor()); - for (String name : icNames) { - try { - ApiMessageInterceptor ic = loader.getComponentByBeanName(name); - interceptors.add(ic); - } catch (NoSuchBeanDefinitionException ne) { - if (this.minimalOn) { - continue; - } - if (!this.unitTestOn) { - throw new CloudRuntimeException(String.format("Cannot find ApiMessageInterceptor[%s] for message[%s] described in %s. Make sure the ApiMessageInterceptor is configured in spring bean xml file", name, desc.getName(), desc.getConfigPath()), ne); - } - } - } - - Set gis = new HashSet(); - for (Map.Entry> e : globalInterceptors.entrySet()) { - Class baseMsgClz = e.getKey(); - if (baseMsgClz.isAssignableFrom(desc.getClazz())) { - gis.addAll(e.getValue()); - } - } - - List globalInterceptors = new ArrayList<>(); - - for (GlobalApiMessageInterceptor gi : gis) { - if (logger.isTraceEnabled()) { - logger.trace(String.format("install GlobalApiMessageInterceptor[%s] to message[%s]", gi.getClass().getName(), desc.getClazz().getName())); - } - globalInterceptors.add(gi); - } - - for (GlobalApiMessageInterceptor gi : globalInterceptorsForAllMsg) { - if (logger.isTraceEnabled()) { - logger.trace(String.format("install GlobalApiMessageInterceptor[%s] to message[%s]", gi.getClass().getName(), desc.getClazz().getName())); - } - globalInterceptors.add(gi); - } - - globalInterceptors.addAll(interceptors); - globalInterceptors.sort(this.msgInterceptorComparator); - - desc.setInterceptors(globalInterceptors); - } - - - private void createDescriptor(Service schema, String cfgPath) { - for (Service.Message mschema : schema.getMessage()) { - Class msgClz = null; - try { - msgClz = Class.forName(mschema.getName()); - } catch (ClassNotFoundException e) { - String err = String.format("unable to create ApiMessageDescriptor for message[name:%s, path:%s]", mschema.getName(), cfgPath); - throw new CloudRuntimeException(err, e); - } - - ApiMessageDescriptor old = descriptors.get(msgClz); - if (old != null) { - throw new CloudRuntimeException(String.format("Duplicate message description. Message[%s] is described in %s and %s", mschema.getName(), old.getConfigPath(), cfgPath)); - } - - ApiMessageDescriptor desc = new ApiMessageDescriptor(); - desc.setName(mschema.getName()); - String serviceId = mschema.getServiceId() != null ? mschema.getServiceId() : schema.getId(); - desc.setServiceId(serviceId); - desc.setConfigPath(cfgPath); - desc.setClazz(msgClz); - - prepareInterceptors(desc, mschema, schema); - List services = pluginRgty.getExtensionList(org.zstack.header.Service.class); - if (services.stream().anyMatch(it -> bus.makeLocalServiceId(desc.getServiceId()).equals(it.getId()))) { - supportApis.add(desc.getClazz().getSimpleName()); - } - buildApiParams(desc); - - descriptors.put(msgClz, desc); - } - } - - private void buildApiParams(ApiMessageDescriptor desc) { - Class msgClz = desc.getClazz(); - List fields = FieldUtils.getAllFields(msgClz); - - class FP { - Field field; - APIParam param; - } - - Map fmap = new HashMap(); - for (Field f : fields) { - APIParam at = f.getAnnotation(APIParam.class); - if (at == null) { - continue; - } - - FP fp = new FP(); - fp.field = f; - fp.param = f.getAnnotation(APIParam.class); - fmap.put(f.getName(), fp); - } - - OverriddenApiParams at = desc.getClazz().getAnnotation(OverriddenApiParams.class); - if (at != null) { - for (OverriddenApiParam atp : at.value()) { - Field f = FieldUtils.getField(atp.field(), msgClz); - if (f == null) { - throw new CloudRuntimeException(String.format("cannot find the field[%s] specified in @OverriddenApiParam of class[%s]", - atp.field(), msgClz)); - } - - FP fp = new FP(); - fp.field = f; - fp.param = atp.param(); - fmap.put(atp.field(), fp); - } - } - - for (FP fp : fmap.values()) { - desc.getFieldApiParams().put(fp.field, fp.param); - } - } - - @Override - public APIMessage process(APIMessage msg) throws ApiMessageInterceptionException { - ApiMessageDescriptor desc = descriptors.get(msg.getClass()); - if (desc == null) { - throw new CloudRuntimeException(String.format("Message[%s] has no ApiMessageDescriptor", msg.getClass().getName())); - } - - for (ApiMessageInterceptor ic : desc.getInterceptors()) { - msg = ic.intercept(msg); - } - - return msg; - } - - @Override - public ApiMessageDescriptor getApiMessageDescriptor(APIMessage msg) { - return descriptors.get(msg.getClass()); - } - - @Override - public List getSupportApis() { - return supportApis; - } - - private void populateGlobalInterceptors() { - for (GlobalApiMessageInterceptor gi : pluginRgty.getExtensionList(GlobalApiMessageInterceptor.class)) { - if (gi.getMessageClassToIntercept() == null) { - globalInterceptorsForAllMsg.add(gi); - } else { - for (Class msgClz : gi.getMessageClassToIntercept()) { - Set gis = globalInterceptors.get(msgClz); - if (gis == null) { - gis = new HashSet(); - globalInterceptors.put(msgClz, gis); - } - gis.add(gi); - } - } - } - } -} +package org.zstack.portal.apimediator; + +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Configurable; +import org.zstack.core.CoreGlobalProperty; +import org.zstack.core.Platform; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.componentloader.ComponentLoader; +import org.zstack.core.componentloader.PluginRegistry; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.errorcode.ErrorFacade; +import org.zstack.header.apimediator.ApiMessageInterceptionException; +import org.zstack.header.apimediator.ApiMessageInterceptor; +import org.zstack.header.apimediator.GlobalApiMessageInterceptor; +import org.zstack.header.apimediator.GlobalApiMessageInterceptor.InterceptorPosition; +import org.zstack.header.exception.CloudRuntimeException; +import org.zstack.header.message.*; +import org.zstack.portal.apimediator.schema.Service; +import org.zstack.utils.FieldUtils; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; +import org.zstack.utils.path.PathUtil; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import java.io.File; +import java.lang.reflect.Field; +import java.util.*; + +/** + * Created with IntelliJ IDEA. + * User: frank + * Time: 11:46 PM + * To change this template use File | Settings | File Templates. + */ +@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) +public class ApiMessageProcessorImpl implements ApiMessageProcessor { + private static CLogger logger = Utils.getLogger(ApiMessageProcessorImpl.class); + private Map descriptors = new HashMap(); + private Map> globalInterceptors = new HashMap>(); + private Set globalInterceptorsForAllMsg = new HashSet(); + private Comparator msgInterceptorComparator = Comparator + .comparingInt(ApiMessageProcessorImpl::interceptorPositionToOrder) + .thenComparing(ApiMessageInterceptor::getPriority); + + private static int interceptorPositionToOrder(ApiMessageInterceptor interceptor) { + if (interceptor instanceof GlobalApiMessageInterceptor) { + return ((GlobalApiMessageInterceptor) interceptor).getPosition().ordinal(); + } + + return InterceptorPosition.DEFAULT.ordinal(); + } + + @Autowired + private PluginRegistry pluginRgty; + @Autowired + private ErrorFacade errf; + @Autowired + private DatabaseFacade dbf; + @Autowired + private CloudBus bus; + + private boolean unitTestOn; + // add switch to skip api check for minimal + private boolean minimalOn; + private List configFolders; + List supportApis; + + private void dump() { + StringBuilder sb = new StringBuilder(); + for (Map.Entry e : descriptors.entrySet()) { + ApiMessageDescriptor desc = e.getValue(); + sb.append("\n-------------------------------------------"); + sb.append(String.format("\nname: %s", desc.getName())); + sb.append(String.format("\nconfigured service id: %s", desc.getServiceId())); + sb.append(String.format("\nconfig path: %s", desc.getConfigPath())); + List inc = new ArrayList(); + for (ApiMessageInterceptor ic : desc.getInterceptors()) { + inc.add(ic.getClass().getName()); + } + sb.append(String.format("\ninterceptors: %s", inc)); + sb.append("\n-------------------------------------------"); + } + + logger.debug(String.format("ApiMessageDescriptor dump:\n%s", sb.toString())); + } + + public ApiMessageProcessorImpl(Map config) { + this.unitTestOn = CoreGlobalProperty.UNIT_TEST_ON; + this.minimalOn = Platform.isMinimalOn(); + this.configFolders = (List) config.get("serviceConfigFolders"); + this.supportApis = new ArrayList<>(); + + populateGlobalInterceptors(); + + try { + JAXBContext context = JAXBContext.newInstance("org.zstack.portal.apimediator.schema"); + List paths = new ArrayList(); + for (String configFolder : this.configFolders) { + paths.addAll(PathUtil.scanFolderOnClassPath(configFolder)); + } + + for (String p : paths) { + if (!p.endsWith(".xml")) { + logger.warn(String.format("ignore %s which is not ending with .xml", p)); + continue; + } + + File cfg = new File(p); + Unmarshaller unmarshaller = context.createUnmarshaller(); + Service schema = (Service) unmarshaller.unmarshal(cfg); + createDescriptor(schema, cfg.getAbsolutePath()); + } + + if (!this.unitTestOn) { + dump(); + } + } catch (JAXBException e) { + throw new CloudRuntimeException(e); + } + } + + private void prepareInterceptors(ApiMessageDescriptor desc, Service.Message mschema, Service schema) { + ComponentLoader loader = Platform.getComponentLoader(); + List interceptors = new ArrayList(); + List icNames = new ArrayList(); + icNames.addAll(mschema.getInterceptor()); + icNames.addAll(schema.getInterceptor()); + for (String name : icNames) { + try { + ApiMessageInterceptor ic = loader.getComponentByBeanName(name); + interceptors.add(ic); + } catch (NoSuchBeanDefinitionException ne) { + if (this.minimalOn) { + continue; + } + if (!this.unitTestOn) { + throw new CloudRuntimeException(String.format("Cannot find ApiMessageInterceptor[%s] for message[%s] described in %s. Make sure the ApiMessageInterceptor is configured in spring bean xml file", name, desc.getName(), desc.getConfigPath()), ne); + } + } + } + + Set gis = new HashSet(); + for (Map.Entry> e : globalInterceptors.entrySet()) { + Class baseMsgClz = e.getKey(); + if (baseMsgClz.isAssignableFrom(desc.getClazz())) { + gis.addAll(e.getValue()); + } + } + + List globalInterceptors = new ArrayList<>(); + + for (GlobalApiMessageInterceptor gi : gis) { + if (logger.isTraceEnabled()) { + logger.trace(String.format("install GlobalApiMessageInterceptor[%s] to message[%s]", gi.getClass().getName(), desc.getClazz().getName())); + } + globalInterceptors.add(gi); + } + + for (GlobalApiMessageInterceptor gi : globalInterceptorsForAllMsg) { + if (logger.isTraceEnabled()) { + logger.trace(String.format("install GlobalApiMessageInterceptor[%s] to message[%s]", gi.getClass().getName(), desc.getClazz().getName())); + } + globalInterceptors.add(gi); + } + + globalInterceptors.addAll(interceptors); + globalInterceptors.sort(this.msgInterceptorComparator); + + desc.setInterceptors(globalInterceptors); + } + + + private void createDescriptor(Service schema, String cfgPath) { + for (Service.Message mschema : schema.getMessage()) { + Class msgClz = null; + try { + msgClz = Class.forName(mschema.getName()); + } catch (ClassNotFoundException e) { + String err = String.format("unable to create ApiMessageDescriptor for message[name:%s, path:%s]", mschema.getName(), cfgPath); + throw new CloudRuntimeException(err, e); + } + + ApiMessageDescriptor old = descriptors.get(msgClz); + if (old != null) { + throw new CloudRuntimeException(String.format("Duplicate message description. Message[%s] is described in %s and %s", mschema.getName(), old.getConfigPath(), cfgPath)); + } + + ApiMessageDescriptor desc = new ApiMessageDescriptor(); + desc.setName(mschema.getName()); + String serviceId = mschema.getServiceId() != null ? mschema.getServiceId() : schema.getId(); + desc.setServiceId(serviceId); + desc.setConfigPath(cfgPath); + desc.setClazz(msgClz); + + prepareInterceptors(desc, mschema, schema); + List services = pluginRgty.getExtensionList(org.zstack.header.Service.class); + if (services.stream().anyMatch(it -> bus.makeLocalServiceId(desc.getServiceId()).equals(it.getId()))) { + supportApis.add(desc.getClazz().getSimpleName()); + } + buildApiParams(desc); + + descriptors.put(msgClz, desc); + } + } + + private void buildApiParams(ApiMessageDescriptor desc) { + Class msgClz = desc.getClazz(); + List fields = FieldUtils.getAllFields(msgClz); + + class FP { + Field field; + APIParam param; + } + + Map fmap = new HashMap(); + for (Field f : fields) { + APIParam at = f.getAnnotation(APIParam.class); + if (at == null) { + continue; + } + + FP fp = new FP(); + fp.field = f; + fp.param = f.getAnnotation(APIParam.class); + fmap.put(f.getName(), fp); + } + + OverriddenApiParams at = desc.getClazz().getAnnotation(OverriddenApiParams.class); + if (at != null) { + for (OverriddenApiParam atp : at.value()) { + Field f = FieldUtils.getField(atp.field(), msgClz); + if (f == null) { + throw new CloudRuntimeException(String.format("cannot find the field[%s] specified in @OverriddenApiParam of class[%s]", + atp.field(), msgClz)); + } + + FP fp = new FP(); + fp.field = f; + fp.param = atp.param(); + fmap.put(atp.field(), fp); + } + } + + for (FP fp : fmap.values()) { + desc.getFieldApiParams().put(fp.field, fp.param); + } + } + + @Override + public APIMessage process(APIMessage msg) throws ApiMessageInterceptionException { + ApiMessageDescriptor desc = descriptors.get(msg.getClass()); + if (desc == null) { + throw new CloudRuntimeException(String.format("Message[%s] has no ApiMessageDescriptor", msg.getClass().getName())); + } + + for (ApiMessageInterceptor ic : desc.getInterceptors()) { + msg = ic.intercept(msg); + } + + return msg; + } + + @Override + public ApiMessageDescriptor getApiMessageDescriptor(APIMessage msg) { + return descriptors.get(msg.getClass()); + } + + @Override + public List getSupportApis() { + return supportApis; + } + + private void populateGlobalInterceptors() { + for (GlobalApiMessageInterceptor gi : pluginRgty.getExtensionList(GlobalApiMessageInterceptor.class)) { + if (gi.getMessageClassToIntercept() == null) { + globalInterceptorsForAllMsg.add(gi); + } else { + for (Class msgClz : gi.getMessageClassToIntercept()) { + Set gis = globalInterceptors.get(msgClz); + if (gis == null) { + gis = new HashSet(); + globalInterceptors.put(msgClz, gis); + } + gis.add(gi); + } + } + } + } +} diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 7682eae779a..c55393c0123 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -294,6 +294,8 @@ public class SourceClassMap { put("org.zstack.header.image.APICreateRootVolumeTemplateFromVolumeSnapshotEvent$Failure", "org.zstack.sdk.CreateRootVolumeTemplateFromVolumeSnapshotFailure"); put("org.zstack.header.image.APIGetUploadImageJobDetailsReply$JobDetails", "org.zstack.sdk.JobDetails"); put("org.zstack.header.image.ImageBackupStorageRefInventory", "org.zstack.sdk.ImageBackupStorageRefInventory"); + put("org.zstack.header.image.ImageGroupInventory", "org.zstack.sdk.ImageGroupInventory"); + put("org.zstack.header.image.ImageGroupRefInventory", "org.zstack.sdk.ImageGroupRefInventory"); put("org.zstack.header.image.ImageInventory", "org.zstack.sdk.ImageInventory"); put("org.zstack.header.longjob.LongJobInventory", "org.zstack.sdk.LongJobInventory"); put("org.zstack.header.longjob.LongJobState", "org.zstack.sdk.LongJobState"); @@ -1068,6 +1070,8 @@ public class SourceClassMap { put("org.zstack.sdk.IdentityZoneProperty", "org.zstack.header.identityzone.IdentityZoneProperty"); put("org.zstack.sdk.ImageBackupStorageRefInventory", "org.zstack.header.image.ImageBackupStorageRefInventory"); put("org.zstack.sdk.ImageCacheInventory", "org.zstack.header.storage.primary.ImageCacheInventory"); + put("org.zstack.sdk.ImageGroupInventory", "org.zstack.header.image.ImageGroupInventory"); + put("org.zstack.sdk.ImageGroupRefInventory", "org.zstack.header.image.ImageGroupRefInventory"); put("org.zstack.sdk.ImageInventory", "org.zstack.header.image.ImageInventory"); put("org.zstack.sdk.ImagePackageInventory", "org.zstack.ovf.datatype.ImagePackageInventory"); put("org.zstack.sdk.ImagePackageState", "org.zstack.ovf.datatype.ImagePackageState"); diff --git a/sdk/src/main/java/org/zstack/sdk/CloneImageAction.java b/sdk/src/main/java/org/zstack/sdk/CloneImageAction.java new file mode 100644 index 00000000000..a4020c83ca8 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CloneImageAction.java @@ -0,0 +1,110 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CloneImageAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.CloneImageResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String imageUuid; + + @Param(required = false, validValues = {"DatabaseOnly"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String strategy = "DatabaseOnly"; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.CloneImageResult value = res.getResult(org.zstack.sdk.CloneImageResult.class); + ret.value = value == null ? new org.zstack.sdk.CloneImageResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/image/clone/{imageUuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CloneImageResult.java b/sdk/src/main/java/org/zstack/sdk/CloneImageResult.java new file mode 100644 index 00000000000..32205ed5a0c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CloneImageResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ImageInventory; + +public class CloneImageResult { + public ImageInventory inventory; + public void setInventory(ImageInventory inventory) { + this.inventory = inventory; + } + public ImageInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageAction.java b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageAction.java new file mode 100644 index 00000000000..f1c76b38c61 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageAction.java @@ -0,0 +1,116 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateImageGroupFromImageAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.CreateImageGroupFromImageResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = true, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String rootVolumeTemplateUuid; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List dateVolumeTemplateUuids; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.CreateImageGroupFromImageResult value = res.getResult(org.zstack.sdk.CreateImageGroupFromImageResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateImageGroupFromImageResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/imagegroup/from/image/{rootVolumeTemplateUuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageResult.java b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageResult.java new file mode 100644 index 00000000000..f3f294f5b35 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ImageGroupInventory; + +public class CreateImageGroupFromImageResult { + public ImageGroupInventory inventory; + public void setInventory(ImageGroupInventory inventory) { + this.inventory = inventory; + } + public ImageGroupInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotAction.java b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotAction.java new file mode 100644 index 00000000000..6078f943ac7 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotAction.java @@ -0,0 +1,116 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateImageGroupFromSnapshotAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.CreateImageGroupFromSnapshotResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = true, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String rootVolumeSnapshotUuid; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List dateVolumeSnapshotUuids; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.CreateImageGroupFromSnapshotResult value = res.getResult(org.zstack.sdk.CreateImageGroupFromSnapshotResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateImageGroupFromSnapshotResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/imagegroup/from/snapshot/{rootVolumeSnapshotUuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotResult.java b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotResult.java new file mode 100644 index 00000000000..99afb167f15 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ImageGroupInventory; + +public class CreateImageGroupFromSnapshotResult { + public ImageGroupInventory inventory; + public void setInventory(ImageGroupInventory inventory) { + this.inventory = inventory; + } + public ImageGroupInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromVmInstanceAction.java new file mode 100644 index 00000000000..8c68c3496fd --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromVmInstanceAction.java @@ -0,0 +1,113 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateImageGroupFromVmInstanceAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.CreateImageGroupFromVmInstanceResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmInstanceUuid; + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.CreateImageGroupFromVmInstanceResult value = res.getResult(org.zstack.sdk.CreateImageGroupFromVmInstanceResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateImageGroupFromVmInstanceResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/images/groups/from/vm-instance"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromVmInstanceResult.java b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromVmInstanceResult.java new file mode 100644 index 00000000000..5c9b0cc0e8b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromVmInstanceResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ImageGroupInventory; + +public class CreateImageGroupFromVmInstanceResult { + public ImageGroupInventory inventory; + public void setInventory(ImageGroupInventory inventory) { + this.inventory = inventory; + } + public ImageGroupInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupAction.java b/sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupAction.java new file mode 100644 index 00000000000..c95cc15508a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class ExpungeImageGroupAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.ExpungeImageGroupResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.ExpungeImageGroupResult value = res.getResult(org.zstack.sdk.ExpungeImageGroupResult.class); + ret.value = value == null ? new org.zstack.sdk.ExpungeImageGroupResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/imagegroups/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "expungeImageGroup"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupResult.java b/sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupResult.java new file mode 100644 index 00000000000..34c7d779469 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class ExpungeImageGroupResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ImageGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/ImageGroupInventory.java new file mode 100644 index 00000000000..0bfb4c3b0d6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ImageGroupInventory.java @@ -0,0 +1,63 @@ +package org.zstack.sdk; + + + +public class ImageGroupInventory { + + public java.lang.Integer imageCount; + public void setImageCount(java.lang.Integer imageCount) { + this.imageCount = imageCount; + } + public java.lang.Integer getImageCount() { + return this.imageCount; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ImageGroupRefInventory.java b/sdk/src/main/java/org/zstack/sdk/ImageGroupRefInventory.java new file mode 100644 index 00000000000..9bc2bdac3dd --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ImageGroupRefInventory.java @@ -0,0 +1,39 @@ +package org.zstack.sdk; + + + +public class ImageGroupRefInventory { + + public java.lang.String imageUuid; + public void setImageUuid(java.lang.String imageUuid) { + this.imageUuid = imageUuid; + } + public java.lang.String getImageUuid() { + return this.imageUuid; + } + + public java.lang.String imageGroupUuid; + public void setImageGroupUuid(java.lang.String imageGroupUuid) { + this.imageGroupUuid = imageGroupUuid; + } + public java.lang.String getImageGroupUuid() { + return this.imageGroupUuid; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryImageGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryImageGroupAction.java new file mode 100644 index 00000000000..609b52d35cc --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryImageGroupAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryImageGroupAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryImageGroupResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryImageGroupResult value = res.getResult(org.zstack.sdk.QueryImageGroupResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryImageGroupResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/imagegroups"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryImageGroupRefAction.java b/sdk/src/main/java/org/zstack/sdk/QueryImageGroupRefAction.java new file mode 100644 index 00000000000..970ca5d3e29 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryImageGroupRefAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryImageGroupRefAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryImageGroupRefResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryImageGroupRefResult value = res.getResult(org.zstack.sdk.QueryImageGroupRefResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryImageGroupRefResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/imagegrouprefs"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryImageGroupRefResult.java b/sdk/src/main/java/org/zstack/sdk/QueryImageGroupRefResult.java new file mode 100644 index 00000000000..4870dddbba2 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryImageGroupRefResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryImageGroupRefResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryImageGroupResult.java b/sdk/src/main/java/org/zstack/sdk/QueryImageGroupResult.java new file mode 100644 index 00000000000..a2352e38668 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryImageGroupResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryImageGroupResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/test/src/test/groovy/org/zstack/test/integration/image/ImageGroupOperationsCase.groovy b/test/src/test/groovy/org/zstack/test/integration/image/ImageGroupOperationsCase.groovy new file mode 100644 index 00000000000..c49bf4a5a13 --- /dev/null +++ b/test/src/test/groovy/org/zstack/test/integration/image/ImageGroupOperationsCase.groovy @@ -0,0 +1,293 @@ +package org.zstack.test.integration.image + +import org.zstack.core.db.DatabaseFacade +import org.zstack.core.db.Q +import org.zstack.header.image.ImageGroupRefVO +import org.zstack.header.image.ImageGroupRefVO_ +import org.zstack.header.image.ImageGroupVO +import org.zstack.header.image.ImageGroupVO_ +import org.zstack.header.image.ImageVO +import org.zstack.header.image.ImageVO_ +import org.zstack.header.vm.VmInstanceState +import org.zstack.header.vm.VmInstanceVO +import org.zstack.header.vm.VmInstanceVO_ +import org.zstack.sdk.DiskOfferingInventory +import org.zstack.sdk.HostInventory +import org.zstack.sdk.ImageInventory +import org.zstack.sdk.SftpBackupStorageInventory +import org.zstack.sdk.VmInstanceInventory +import org.zstack.sdk.VolumeInventory +import org.zstack.sdk.ImageGroupInventory +import org.zstack.sdk.VolumeSnapshotInventory +import org.zstack.test.integration.ZStackTest +import org.zstack.testlib.EnvSpec +import org.zstack.testlib.SubCase +import org.zstack.utils.data.SizeUnit + +class ImageGroupOperationsCase extends SubCase { + EnvSpec env + DatabaseFacade dbf + VmInstanceInventory vm + DiskOfferingInventory diskOffering + SftpBackupStorageInventory bs + HostInventory host + ImageInventory rimage + ImageInventory dimage + + @Override + void setup() { + useSpring(ZStackTest.springSpec) + } + + @Override + void environment() { + env = env { + instanceOffering { + name = "instanceOffering" + memory = SizeUnit.GIGABYTE.toByte(8) + cpu = 4 + } + + diskOffering { + name = "diskOffering" + diskSize = SizeUnit.GIGABYTE.toByte(2) + } + + sftpBackupStorage { + name = "sftp" + url = "/sftp" + username = "username" + password = "password" + hostname = "hostname1" + + image { + name = "image" + url = "http://somehost/boot.iso" + format = "iso" + } + + image { + name = "image1" + url = "http://somehost/boot.iso" + } + } + + sftpBackupStorage { + name = "sftp1" + url = "/sftp1" + username = "username" + password = "password" + hostname = "hostname2" + + image { + name = "image" + url = "http://somehost/boot.iso" + format = "iso" + } + + image { + name = "image1" + url = "http://somehost/boot.iso" + } + } + + zone { + name = "zone" + description = "test" + + cluster { + name = "cluster" + hypervisorType = "KVM" + + kvm { + name = "kvm" + managementIp = "localhost" + username = "root" + password = "password" + } + + attachPrimaryStorage("local") + attachL2Network("l2") + } + + localPrimaryStorage { + name = "local" + url = "/local_ps" + } + + l2NoVlanNetwork { + name = "l2" + physicalInterface = "eth0" + + l3Network { + name = "l3" + + ip { + startIp = "192.168.100.10" + endIp = "192.168.100.100" + netmask = "255.255.255.0" + gateway = "192.168.100.1" + } + } + } + attachBackupStorage("sftp") + attachBackupStorage("sftp1") + } + + vm { + name = "vm" + useInstanceOffering("instanceOffering") + useImage("image1") + useL3Networks("l3") + } + } + } + + @Override + void test() { + env.create { + vm = env.inventoryByName("vm") as VmInstanceInventory + diskOffering = env.inventoryByName("diskOffering") as DiskOfferingInventory + bs = env.inventoryByName("sftp") as SftpBackupStorageInventory + host = env.inventoryByName("kvm") as HostInventory + rimage = env.inventoryByName("image") as ImageInventory + + testCreateImageGroup() + } + } + + void testCreateImageGroup() { + VolumeInventory volume = createDataVolume { + name = "data" + diskOfferingUuid = diskOffering.uuid + } as VolumeInventory + + attachDataVolumeToVm { + volumeUuid = volume.uuid + vmInstanceUuid = vm.uuid + } + + VolumeSnapshotInventory rsnap = createVolumeSnapshot { + name = "snap-root" + volumeUuid = vm.rootVolumeUuid + } as VolumeSnapshotInventory + + VolumeSnapshotInventory dsnap = createVolumeSnapshot { + name = "snap-data" + volumeUuid = volume.uuid + } as VolumeSnapshotInventory + + stopVmInstance { + uuid = vm.uuid + } + assert Q.New(VmInstanceVO.class).eq(VmInstanceVO_.state, VmInstanceState.Stopped).eq(VmInstanceVO_.uuid, vm.uuid).isExists() + + dimage = createDataVolumeTemplateFromVolume { + name = "data-image" + volumeUuid = volume.uuid + backupStorageUuids = [bs.uuid] + } as ImageInventory + + ImageGroupInventory group = createImageGroupFromVmInstance { + vmInstanceUuid = vm.uuid + name = "imageGroup" + } as ImageGroupInventory + + queryImageGroup { + } + + queryImageGroupRef { + + } + + retryInSecs { + assert Q.New(ImageGroupVO.class).count() == 1 + assert Q.New(ImageGroupRefVO.class).count() == 2 + } + + expungeImageGroup { + uuid = group.uuid + } + + retryInSecs { + assert Q.New(ImageGroupVO.class).count() == 0 + assert Q.New(ImageGroupRefVO.class).count() == 0 + assert Q.New(ImageVO.class).count() == 5 + } + + ImageGroupInventory group2 = createImageGroupFromImage { + rootVolumeTemplateUuid = rimage.uuid + dateVolumeTemplateUuids = [dimage.uuid] + name = "imageGroup2" + } as ImageGroupInventory + + queryImageGroup { + } + + queryImageGroupRef { + + } + + retryInSecs { + assert Q.New(ImageGroupVO.class).count() == 1 + assert Q.New(ImageGroupRefVO.class).count() == 2 + assert Q.New(ImageVO.class).count() == 5 + } + + ImageInventory cimage = cloneImage { + imageUuid = rimage.uuid + } as ImageInventory + + retryInSecs { + assert Q.New(ImageVO.class).count() == 6 + } + + expungeImageGroup { + uuid = group2.uuid + } + + retryInSecs { + assert Q.New(ImageGroupVO.class).count() == 0 + assert Q.New(ImageGroupRefVO.class).count() == 0 + assert Q.New(ImageVO.class).count() == 5 + } + + deleteImage { + uuid = cimage.uuid + } + + ImageGroupInventory group3 = createImageGroupFromSnapshot { + rootVolumeSnapshotUuid = rsnap.uuid + dateVolumeSnapshotUuids = [dsnap.uuid] + name = "imageGroup3" + } as ImageGroupInventory + + queryImageGroup { + } + + queryImageGroupRef { + + } + + retryInSecs { + assert Q.New(ImageGroupVO.class).count() == 1 + assert Q.New(ImageGroupRefVO.class).count() == 2 + assert Q.New(ImageVO.class).count() == 7 + } + + expungeImageGroup { + uuid = group3.uuid + } + + retryInSecs { + assert Q.New(ImageGroupVO.class).count() == 0 + assert Q.New(ImageGroupRefVO.class).count() == 0 + assert Q.New(ImageVO.class).count() == 5 + } + } + + @Override + void clean() { + env.delete() + } +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index de415bdba72..fc05ea23969 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -9601,6 +9601,112 @@ abstract class ApiHelper { } } + def cloneImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CloneImageAction.class) Closure c) { + def a = new org.zstack.sdk.CloneImageAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def createImageGroupFromImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateImageGroupFromImageAction.class) Closure c) { + def a = new org.zstack.sdk.CreateImageGroupFromImageAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def createImageGroupFromSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateImageGroupFromSnapshotAction.class) Closure c) { + def a = new org.zstack.sdk.CreateImageGroupFromSnapshotAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def createImageGroupFromVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateImageGroupFromVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.CreateImageGroupFromVmInstanceAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + def createImageReplicationGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateImageReplicationGroupAction.class) Closure c) { def a = new org.zstack.sdk.CreateImageReplicationGroupAction() @@ -19592,6 +19698,33 @@ abstract class ApiHelper { } + def expungeImageGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExpungeImageGroupAction.class) Closure c) { + def a = new org.zstack.sdk.ExpungeImageGroupAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def expungeVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExpungeVmInstanceAction.class) Closure c) { def a = new org.zstack.sdk.ExpungeVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -31058,6 +31191,64 @@ abstract class ApiHelper { } + def queryImageGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryImageGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryImageGroupAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def queryImageGroupRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryImageGroupRefAction.class) Closure c) { + def a = new org.zstack.sdk.QueryImageGroupRefAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryImagePackage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryImagePackageAction.class) Closure c) { def a = new org.zstack.sdk.QueryImagePackageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From f03c750c58d56e81d5ef4271868a6315447ba799 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Wed, 25 Jun 2025 14:59:27 +0800 Subject: [PATCH 444/737] [conf]: support createVolumeFromTemplate Resolves: ZSTAC-75838 Change-Id: I7079776d67737261746566746a6266756c7a706c --- conf/persistence.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/conf/persistence.xml b/conf/persistence.xml index 2b4f57d7265..26537f82958 100755 --- a/conf/persistence.xml +++ b/conf/persistence.xml @@ -36,8 +36,6 @@ org.zstack.header.storage.backup.BackupStorageZoneRefVO org.zstack.header.image.ImageVO org.zstack.header.image.ImageEO - org.zstack.header.image.ImageGroupVO - org.zstack.header.image.ImageGroupRefVO org.zstack.header.image.GuestOsCategoryVO org.zstack.header.image.ImageBackupStorageRefVO org.zstack.header.allocator.HostCapacityVO From bde655d973c56ec4128d638028aad26645007ed7 Mon Sep 17 00:00:00 2001 From: "weiqiang.xu" Date: Thu, 3 Jul 2025 10:22:21 +0800 Subject: [PATCH 445/737] [conf]: fix imageGroup err in persistence.xml Resolves: ZSTAC-75311 Change-Id: I617879796b676977687a636b63746d6e736e6676 --- conf/persistence.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/persistence.xml b/conf/persistence.xml index 26537f82958..2b4f57d7265 100755 --- a/conf/persistence.xml +++ b/conf/persistence.xml @@ -36,6 +36,8 @@ org.zstack.header.storage.backup.BackupStorageZoneRefVO org.zstack.header.image.ImageVO org.zstack.header.image.ImageEO + org.zstack.header.image.ImageGroupVO + org.zstack.header.image.ImageGroupRefVO org.zstack.header.image.GuestOsCategoryVO org.zstack.header.image.ImageBackupStorageRefVO org.zstack.header.allocator.HostCapacityVO From a9b019d805183e845dae0686e01f79bd866648fd Mon Sep 17 00:00:00 2001 From: "weiqiang.xu" Date: Thu, 3 Jul 2025 13:38:07 +0800 Subject: [PATCH 446/737] [image]: add a non-arg constructor for ImageGroupRefInventory Resolves: ZSTAC-75311 Change-Id: I62636965656b716e6e6162726d74636862717374 --- .../java/org/zstack/header/image/ImageGroupRefInventory.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/header/src/main/java/org/zstack/header/image/ImageGroupRefInventory.java b/header/src/main/java/org/zstack/header/image/ImageGroupRefInventory.java index 2800ac336b1..c5d337cffc6 100644 --- a/header/src/main/java/org/zstack/header/image/ImageGroupRefInventory.java +++ b/header/src/main/java/org/zstack/header/image/ImageGroupRefInventory.java @@ -24,6 +24,9 @@ protected ImageGroupRefInventory(ImageGroupRefVO vo) { this.setLastOpDate(vo.getLastOpDate()); } + public ImageGroupRefInventory() { + } + public static ImageGroupRefInventory valueOf(ImageGroupRefVO vo) { return new ImageGroupRefInventory(vo); } From 1b9f19a541a2036128235f2eb04d626a40e75954 Mon Sep 17 00:00:00 2001 From: J M Date: Thu, 14 Aug 2025 15:42:47 +0800 Subject: [PATCH 447/737] [local]: fix local image cache clean Resolves: ZSTAC-66651 Change-Id: I71696f667a696473677a6773726e65696d68746f --- .../ceph/primary/CephImageCacheCleaner.java | 5 +- .../ceph/primary/CephPrimaryStorageBase.java | 2 +- .../primary/local/LocalStorageBase.java | 7 +- .../local/LocalStorageImageCleaner.java | 52 ++++--------- .../primary/nfs/NfsPrimaryStorage.java | 2 +- .../primary/smp/SMPPrimaryStorageBase.java | 7 +- .../addon/primary/ExternalPrimaryStorage.java | 2 +- .../storage/primary/ImageCacheCleanParam.java | 15 ++++ .../storage/primary/ImageCacheCleaner.java | 75 ++++++++++++------- .../VolumeSnapshotReferenceUtils.java | 1 + ...ImageCacheOnLocalPrimaryStorageCase.groovy | 72 +++++++++++++++++- 11 files changed, 156 insertions(+), 84 deletions(-) create mode 100644 storage/src/main/java/org/zstack/storage/primary/ImageCacheCleanParam.java diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephImageCacheCleaner.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephImageCacheCleaner.java index ed35ef32043..81cec9a040c 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephImageCacheCleaner.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephImageCacheCleaner.java @@ -7,6 +7,7 @@ import org.zstack.header.storage.primary.ImageCacheVO; import org.zstack.storage.ceph.CephConstants; import org.zstack.storage.ceph.CephGlobalConfig; +import org.zstack.storage.primary.ImageCacheCleanParam; import org.zstack.storage.primary.ImageCacheCleaner; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; @@ -32,8 +33,8 @@ protected GlobalConfig cleanupIntervalConfig() { @Transactional @Override - protected List createShadowImageCacheVOsForNewDeletedAndOld(String psUuid) { - List staleImageCacheIds = getStaleImageCacheIds(psUuid); + protected List createShadowImageCacheVOsForNewDeletedAndOld(String psUuid, ImageCacheCleanParam param) { + List staleImageCacheIds = getStaleImageCacheIds(psUuid, false); if (staleImageCacheIds == null || staleImageCacheIds.isEmpty()) { return null; } diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java index 300b4413ece..22eeabb7eb7 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java @@ -2116,7 +2116,7 @@ public void fail(ErrorCode errorCode) { @Override protected void handle(APICleanUpImageCacheOnPrimaryStorageMsg msg) { APICleanUpImageCacheOnPrimaryStorageEvent evt = new APICleanUpImageCacheOnPrimaryStorageEvent(msg.getId()); - imageCacheCleaner.cleanup(msg.getUuid(), false); + imageCacheCleaner.cleanup(msg.getUuid(), new ImageCacheCleanParam(true, msg.isForce())); bus.publish(evt); } diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java index 8825eb3c99e..7764e503a18 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java @@ -910,10 +910,9 @@ public void fail(ErrorCode errorCode) { @Override protected void handle(APICleanUpImageCacheOnPrimaryStorageMsg msg) { - APICleanUpImageCacheOnPrimaryStorageEvent evt = new APICleanUpImageCacheOnPrimaryStorageEvent(msg.getId()); - imageCacheCleaner.setForce(msg.isForce()); - imageCacheCleaner.cleanup(msg.getUuid(), false); - bus.publish(evt); + APICleanUpImageCacheOnPrimaryStorageEvent evt = new APICleanUpImageCacheOnPrimaryStorageEvent(msg.getId()); + imageCacheCleaner.cleanup(msg.getUuid(), new ImageCacheCleanParam(true, msg.isForce())); + bus.publish(evt); } diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageImageCleaner.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageImageCleaner.java index 5a042a0b3c3..05d0342cbbc 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageImageCleaner.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageImageCleaner.java @@ -26,6 +26,7 @@ import org.zstack.header.storage.primary.*; import org.zstack.header.volume.VolumeStatus; import org.zstack.header.volume.VolumeVO; +import org.zstack.storage.primary.ImageCacheCleanParam; import org.zstack.storage.primary.ImageCacheCleaner; import org.zstack.storage.primary.local.LocalStorageUtils.InstallPath; import org.zstack.utils.CollectionUtils; @@ -56,40 +57,15 @@ protected String getPrimaryStorageType() { return LocalStorageConstants.LOCAL_STORAGE_TYPE; } - private boolean force; - - public boolean isForce() { - return force; - } - - public void setForce(boolean force) { - this.force = force; - } - @Transactional - protected List createShadowImageCacheVOsForNewDeletedAndOld(String psUUid) { + protected List createShadowImageCacheVOsForNewDeletedAndOld(String psUUid, ImageCacheCleanParam param) { // 1. images has been deleted List staleImageCacheIds = new ArrayList<>(); - List imageDeletedCacheIds = getStaleImageCacheIds(psUUid); + List imageDeletedCacheIds = getStaleImageCacheIds(psUUid, param.includeReadyImage); if (!CollectionUtils.isEmpty(imageDeletedCacheIds)) { staleImageCacheIds.addAll(imageDeletedCacheIds); } - if (force){ - // 2. no vm used but image is not deleted - // FIXME: it means nothing. think about host ref. - String sql; - if (psUUid == null) { - sql = "select c.id from ImageCacheVO c, PrimaryStorageVO pri where c.imageUuid not in (select vm.imageUuid from VmInstanceVO vm) and" + - " c.primaryStorageUuid = pri.uuid and pri.type = :psType"; - staleImageCacheIds.addAll(SQL.New(sql).param("psType", getPrimaryStorageType()).list()); - } else { - sql = "select c.id from ImageCacheVO c, PrimaryStorageVO pri where c.imageUuid not in (select vm.imageUuid from VmInstanceVO vm) and" + - " c.primaryStorageUuid = pri.uuid and pri.type = :psType and pri.uuid = :psUuid"; - staleImageCacheIds.addAll(SQL.New(sql).param("psType", getPrimaryStorageType()).param("psUuid", psUUid).list()); - } - } - if (staleImageCacheIds.isEmpty()) { return null; } @@ -242,19 +218,19 @@ public void done(ErrorCodeList errorCodeList) { } @Override - protected void cleanUpVolumeCache(String psUuid, boolean needDestinationCheck, NoErrorCompletion completion) { - List shadowVOs = createShadowImageCacheVOs(psUuid); + protected void cleanUpVolumeCache(String psUuid, ImageCacheCleanParam param, NoErrorCompletion completion) { + List shadowVOs = createShadowImageCacheVOs(psUuid, param); if (shadowVOs == null || shadowVOs.isEmpty()) { completion.done(); return; } - new While<>(shadowVOs).each((vo, whileCompletion) -> { - if (needDestinationCheck && !destMaker.isManagedByUs(vo.getImageUuid())) { - whileCompletion.done(); - return; - } + if (!param.triggerByApi) { + shadowVOs.removeIf(vo -> !destMaker.isManagedByUs(vo.getImageUuid())); + } + + new While<>(shadowVOs).each((vo, whileCompletion) -> { InstallPath p = new InstallPath(); p.fullPath = vo.getInstallUrl(); p.disassemble(); @@ -295,7 +271,7 @@ public void done(ErrorCodeList errorCodeList) { } @Override - protected void doCleanup(String psUuid, boolean needDestinationCheck, NoErrorCompletion completion) { + protected void doCleanup(String psUuid, ImageCacheCleanParam param, NoErrorCompletion completion) { List psUuids = new ArrayList<>(); if (psUuid == null) { psUuids.addAll(listPrimaryStoragesBySelfType()); @@ -308,7 +284,7 @@ protected void doCleanup(String psUuid, boolean needDestinationCheck, NoErrorCom chain.then(new NoRollbackFlow() { @Override public void run(FlowTrigger trigger, Map data) { - cleanUpVolumeCache(psUuid, needDestinationCheck, new NoErrorCompletion() { + cleanUpVolumeCache(psUuid, param, new NoErrorCompletion() { @Override public void done() { trigger.next(); @@ -379,7 +355,7 @@ public void handle(ErrorCode errCode, Map data) { } @Override - public void cleanup(String psUuid, boolean needDestinationCheck) { + public void cleanup(String psUuid, ImageCacheCleanParam param) { ImageCacheCleaner self = this; thdf.chainSubmit(new ChainTask(null) { @Override @@ -390,7 +366,7 @@ public String getSyncSignature() { @Override public void run(SyncTaskChain chain) { logger.debug("start clean up cache"); - doCleanup(psUuid, needDestinationCheck, new NoErrorCompletion() { + doCleanup(psUuid, param, new NoErrorCompletion() { @Override public void done() { chain.next(); diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java index 63f0bba79bc..6bbf9d40a14 100755 --- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java +++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java @@ -293,7 +293,7 @@ public void fail(ErrorCode errorCode) { @Override protected void handle(APICleanUpImageCacheOnPrimaryStorageMsg msg) { APICleanUpImageCacheOnPrimaryStorageEvent evt = new APICleanUpImageCacheOnPrimaryStorageEvent(msg.getId()); - imageCacheCleaner.cleanup(msg.getUuid(), false); + imageCacheCleaner.cleanup(msg.getUuid(), new ImageCacheCleanParam(true, msg.isForce())); bus.publish(evt); } diff --git a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageBase.java b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageBase.java index 8fe390a7dfa..62237d6243f 100755 --- a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageBase.java +++ b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageBase.java @@ -38,10 +38,7 @@ import org.zstack.kvm.KVMConstant; import org.zstack.kvm.KVMHostInventory; import org.zstack.kvm.KVMTakeSnapshotExtensionPoint; -import org.zstack.storage.primary.EstimateVolumeTemplateSizeOnPrimaryStorageMsg; -import org.zstack.storage.primary.EstimateVolumeTemplateSizeOnPrimaryStorageReply; -import org.zstack.storage.primary.PrimaryStorageBase; -import org.zstack.storage.primary.PrimaryStorageCapacityUpdater; +import org.zstack.storage.primary.*; import org.zstack.storage.snapshot.reference.VolumeSnapshotReferenceUtils; import org.zstack.storage.volume.VolumeErrors; import org.zstack.storage.volume.VolumeSystemTags; @@ -809,7 +806,7 @@ public void handle(ErrorCode errCode, Map data) { @Override protected void handle(APICleanUpImageCacheOnPrimaryStorageMsg msg) { APICleanUpImageCacheOnPrimaryStorageEvent evt = new APICleanUpImageCacheOnPrimaryStorageEvent(msg.getId()); - imageCacheCleaner.cleanup(msg.getUuid(), false); + imageCacheCleaner.cleanup(msg.getUuid(), new ImageCacheCleanParam(true, msg.isForce())); bus.publish(evt); } diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index e764f8d28f5..fb06e126139 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -191,7 +191,7 @@ private void handle(APIUpdateExternalPrimaryStorageMsg msg) { @Override protected void handle(APICleanUpImageCacheOnPrimaryStorageMsg msg) { APICleanUpImageCacheOnPrimaryStorageEvent evt = new APICleanUpImageCacheOnPrimaryStorageEvent(msg.getId()); - imageCacheCleaner.cleanup(msg.getUuid(), false); + imageCacheCleaner.cleanup(msg.getUuid(), new ImageCacheCleanParam(true, msg.isForce())); bus.publish(evt); } diff --git a/storage/src/main/java/org/zstack/storage/primary/ImageCacheCleanParam.java b/storage/src/main/java/org/zstack/storage/primary/ImageCacheCleanParam.java new file mode 100644 index 00000000000..47f557c8f10 --- /dev/null +++ b/storage/src/main/java/org/zstack/storage/primary/ImageCacheCleanParam.java @@ -0,0 +1,15 @@ +package org.zstack.storage.primary; + +public class ImageCacheCleanParam { + public boolean triggerByApi; + public boolean includeReadyImage; + + public ImageCacheCleanParam() { + + } + + public ImageCacheCleanParam(boolean triggerByApi, boolean includeReadyImage) { + this.triggerByApi = triggerByApi; + this.includeReadyImage = includeReadyImage; + } +} diff --git a/storage/src/main/java/org/zstack/storage/primary/ImageCacheCleaner.java b/storage/src/main/java/org/zstack/storage/primary/ImageCacheCleaner.java index 4a83b78c6f1..8aab976bf7c 100755 --- a/storage/src/main/java/org/zstack/storage/primary/ImageCacheCleaner.java +++ b/storage/src/main/java/org/zstack/storage/primary/ImageCacheCleaner.java @@ -80,11 +80,7 @@ protected GlobalConfig cleanupIntervalConfig() { return PrimaryStorageGlobalConfig.IMAGE_CACHE_GARBAGE_COLLECTOR_INTERVAL; } - public void cleanup(boolean needDestinationCheck) { - cleanup(null, needDestinationCheck); - } - - public void cleanup(String psUuid, boolean needDestinationCheck) { + public void cleanup(String psUuid, ImageCacheCleanParam param) { ImageCacheCleaner self = this; thdf.chainSubmit(new ChainTask(null) { @Override @@ -94,7 +90,7 @@ public String getSyncSignature() { @Override public void run(SyncTaskChain chain) { - doCleanup(psUuid, needDestinationCheck, new NoErrorCompletion() { + doCleanup(psUuid, param, new NoErrorCompletion() { @Override public void done() { chain.next(); @@ -109,19 +105,18 @@ public String getName() { }); } - protected void cleanUpVolumeCache(String psUuid, boolean needDestinationCheck, NoErrorCompletion completion) { - List shadowVOs = createShadowImageCacheVOs(psUuid); + protected void cleanUpVolumeCache(String psUuid, ImageCacheCleanParam param, NoErrorCompletion completion) { + List shadowVOs = createShadowImageCacheVOs(psUuid, param); if (shadowVOs == null || shadowVOs.isEmpty()) { completion.done(); return; } - new While<>(shadowVOs).each((vo, whileCompletion) -> { - if (needDestinationCheck && !destMaker.isManagedByUs(vo.getImageUuid())) { - whileCompletion.done(); - return; - } + if (!param.triggerByApi) { + shadowVOs.removeIf(vo -> !destMaker.isManagedByUs(vo.getImageUuid())); + } + new While<>(shadowVOs).each((vo, whileCompletion) -> { DeleteImageCacheOnPrimaryStorageMsg msg = new DeleteImageCacheOnPrimaryStorageMsg(); msg.setImageUuid(vo.getImageUuid()); msg.setInstallPath(vo.getInstallUrl()); @@ -175,7 +170,7 @@ public void done(ErrorCodeList errorCodeList) { }); } - protected void doCleanup(String psUuid, boolean needDestinationCheck, NoErrorCompletion completion) { + protected void doCleanup(String psUuid, ImageCacheCleanParam param, NoErrorCompletion completion) { List psUuids = new ArrayList<>(); if (psUuid == null) { psUuids.addAll(listPrimaryStoragesBySelfType()); @@ -188,7 +183,7 @@ protected void doCleanup(String psUuid, boolean needDestinationCheck, NoErrorCom chain.then(new NoRollbackFlow() { @Override public void run(FlowTrigger trigger, Map data) { - cleanUpVolumeCache(psUuid, needDestinationCheck, new NoErrorCompletion() { + cleanUpVolumeCache(psUuid, param, new NoErrorCompletion() { @Override public void done() { trigger.next(); @@ -283,7 +278,7 @@ public String getName() { @Override public void run() { - cleanup(true); + cleanup(null, new ImageCacheCleanParam(false, false)); } }); } @@ -324,14 +319,43 @@ protected boolean volumeFindMissingImageUuid(String psUuid) { * @return image cache ids whose image is expunged */ @Transactional - protected List getStaleImageCacheIds(String psUuid) { + protected List getStaleImageCacheIds(String psUuid, boolean includeReadyImage) { if (volumeFindMissingImageUuid(psUuid)) { return null; } + List ids; + if (includeReadyImage) { + ids = queryCacheOfAllImage(psUuid); + } else { + ids = queryCacheOfExpungedImage(psUuid); + } + + return VolumeSnapshotReferenceUtils.filterStaleImageCache(ids); + } + + private List queryCacheOfAllImage(String psUuid) { + if (psUuid == null) { + String sql = "select c.id from ImageCacheVO c, PrimaryStorageVO pri" + + " where c.primaryStorageUuid = pri.uuid" + + " and pri.type = :ptype"; + return SQL.New(sql, Long.class) + .param("ptype", getPrimaryStorageType()) + .list(); + } else { + return Q.New(ImageCacheVO.class).eq(ImageCacheVO_.primaryStorageUuid, psUuid) + .select(ImageCacheVO_.id).listValues(); + } + } + + private List queryCacheOfExpungedImage(String psUuid) { String sql; if (psUuid == null) { - sql = "select c.id from ImageCacheVO c, PrimaryStorageVO pri, ImageEO i where c.primaryStorageUuid = pri.uuid and i.uuid = c.imageUuid and i.deleted is not null and pri.type = :ptype"; + sql = "select c.id from ImageCacheVO c, PrimaryStorageVO pri, ImageEO i" + + " where c.primaryStorageUuid = pri.uuid" + + " and i.uuid = c.imageUuid" + + " and i.deleted is not null" + + " and pri.type = :ptype"; } else { sql = "select c.id from ImageCacheVO c, PrimaryStorageVO pri, ImageEO i where c.primaryStorageUuid = pri.uuid and i.uuid = c.imageUuid and i.deleted is not null and pri.type = :ptype and pri.uuid = :psUuid"; } @@ -357,19 +381,14 @@ protected List getStaleImageCacheIds(String psUuid) { cq.setParameter("psUuid", psUuid); } deleted.addAll(cq.getResultList()); - - if (deleted.isEmpty()) { - return null; - } - - return VolumeSnapshotReferenceUtils.filterStaleImageCache(deleted); + return deleted; } @Transactional - protected List createShadowImageCacheVOsForNewDeletedAndOld(String psUuid) { + protected List createShadowImageCacheVOsForNewDeletedAndOld(String psUuid, ImageCacheCleanParam param) { // 1. image has been deleted - List staleImageCacheIds = getStaleImageCacheIds(psUuid); + List staleImageCacheIds = getStaleImageCacheIds(psUuid, false); if (staleImageCacheIds == null || staleImageCacheIds.isEmpty()) { return null; } @@ -409,8 +428,8 @@ protected List createShadowImageCacheVOsForNewDeletedAndOld( } @Transactional - protected List createShadowImageCacheVOs(String psUuid) { - List newDeletedAndOld = createShadowImageCacheVOsForNewDeletedAndOld(psUuid); + protected List createShadowImageCacheVOs(String psUuid, ImageCacheCleanParam param) { + List newDeletedAndOld = createShadowImageCacheVOsForNewDeletedAndOld(psUuid, param); if (newDeletedAndOld == null) { // no new deleted images, let's check if there any old that failed to be deleted last time String sql = "select s from ImageCacheShadowVO s, PrimaryStorageVO p where p.uuid = s.primaryStorageUuid and p.type = :ptype"; diff --git a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java index c15d0528719..61625dd4539 100644 --- a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java @@ -363,6 +363,7 @@ public static void cleanTemporaryImageReference(List images) { }); } + // FIXME: consider path and psUuid public static List filterStaleImageCache(List ids) { if (CollectionUtils.isEmpty(ids)) { return Collections.emptyList(); diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/local/CleanImageCacheOnLocalPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/local/CleanImageCacheOnLocalPrimaryStorageCase.groovy index 13a1e0db080..0bc9ae2c229 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/local/CleanImageCacheOnLocalPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/local/CleanImageCacheOnLocalPrimaryStorageCase.groovy @@ -12,6 +12,7 @@ import org.zstack.header.vm.VmInstanceDeletionPolicyManager import org.zstack.network.securitygroup.SecurityGroupConstant import org.zstack.network.service.virtualrouter.VirtualRouterConstant import org.zstack.sdk.ApplianceVmInventory +import org.zstack.sdk.HostInventory import org.zstack.sdk.ImageInventory import org.zstack.sdk.PrimaryStorageInventory import org.zstack.sdk.VmInstanceInventory @@ -90,6 +91,11 @@ class CleanImageCacheOnLocalPrimaryStorageCase extends SubCase{ availableCapacity = SizeUnit.GIGABYTE.toByte(100) } + nfsPrimaryStorage { + name = "nfs" + url = "localhost:/test" + } + cluster { name = "cluster" hypervisorType = "KVM" @@ -101,7 +107,15 @@ class CleanImageCacheOnLocalPrimaryStorageCase extends SubCase{ password = "password" } + kvm { + name = "kvm2" + managementIp = "127.0.0.2" + username = "root" + password = "password" + } + attachPrimaryStorage("local-ps") + attachPrimaryStorage("nfs") attachL2Network("l2") } @@ -157,6 +171,7 @@ class CleanImageCacheOnLocalPrimaryStorageCase extends SubCase{ vm { name = "vm" useInstanceOffering("instanceOffering") + usePrimaryStorage("local-ps") useCluster("cluster") useImage("image1") useL3Networks("l3") @@ -164,6 +179,27 @@ class CleanImageCacheOnLocalPrimaryStorageCase extends SubCase{ useHost("kvm") } + vm { + name = "vm2" + useInstanceOffering("instanceOffering") + usePrimaryStorage("nfs") + useCluster("cluster") + useImage("image1") + useL3Networks("l3") + useRootDiskOffering("diskOffering") + useHost("kvm") + } + + vm { + name = "vm3" + useInstanceOffering("instanceOffering") + usePrimaryStorage("local-ps") + useCluster("cluster") + useImage("image1") + useL3Networks("l3") + useRootDiskOffering("diskOffering") + useHost("kvm2") + } } } @@ -178,9 +214,16 @@ class CleanImageCacheOnLocalPrimaryStorageCase extends SubCase{ PrimaryStorageInventory localps = env.inventoryByName("local-ps") ImageInventory image1 = env.inventoryByName("image1") ImageInventory vrImage = env.inventoryByName("vr") + HostInventory host1 = env.inventoryByName("kvm") as HostInventory + HostInventory host2 = env.inventoryByName("kvm2") as HostInventory - ImageCacheVO c = Q.New(ImageCacheVO.class).eq(ImageCacheVO_.imageUuid,image1.getUuid()).find() - assert c != null + assert Q.New(ImageCacheVO.class) + .eq(ImageCacheVO_.primaryStorageUuid, localps.uuid) + .eq(ImageCacheVO_.imageUuid,image1.getUuid()).count() == 2L + ImageCacheVO c = Q.New(ImageCacheVO.class) + .eq(ImageCacheVO_.primaryStorageUuid, localps.uuid) + .like(ImageCacheVO_.installUrl, String.format("%%%s%%", host1.uuid)) + .eq(ImageCacheVO_.imageUuid,image1.getUuid()).find() def checked = false def cmdTemp @@ -207,14 +250,35 @@ class CleanImageCacheOnLocalPrimaryStorageCase extends SubCase{ PrimaryStorageGlobalConfig.IMAGE_CACHE_GARBAGE_COLLECTOR_INTERVAL.updateValue(1) retryInSecs { - assert Q.New(ImageCacheShadowVO.class).eq(ImageCacheShadowVO_.imageUuid, image1.getUuid()).find() == null - assert Q.New(ImageCacheVO.class).eq(ImageCacheVO_.imageUuid, image1.getUuid()).find() == null + assert Q.New(ImageCacheShadowVO.class) + .eq(ImageCacheShadowVO_.primaryStorageUuid, localps.uuid) + .eq(ImageCacheShadowVO_.imageUuid, image1.getUuid()).find() == null + assert Q.New(ImageCacheVO.class).select(ImageCacheVO_.installUrl) + .eq(ImageCacheVO_.primaryStorageUuid, localps.uuid) + .eq(ImageCacheVO_.imageUuid, image1.getUuid()).findValue().contains(host2.uuid) } ApplianceVmInventory vr = queryApplianceVm {}[0] as ApplianceVmInventory destroyVmInstance { uuid = vr.uuid } + + sleep(TimeUnit.SECONDS.toMillis(1)) + + assert !Q.New(ImageCacheShadowVO.class) + .eq(ImageCacheShadowVO_.imageUuid, vrImage.getUuid()) + .isExists() + assert Q.New(ImageCacheVO.class) + .eq(ImageCacheVO_.imageUuid, vrImage.getUuid()) + .isExists() + + deleteImage { + uuid = vrImage.uuid + } + expungeImage { + imageUuid = vrImage.uuid + } + retryInSecs { assert !Q.New(ImageCacheShadowVO.class) .eq(ImageCacheShadowVO_.imageUuid, vrImage.getUuid()) From 417f3773b85c3234bb6dcfece11b0a5056ac0f35 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Tue, 26 Aug 2025 09:37:07 +0800 Subject: [PATCH 448/737] [sdnController]: fix create SdnControllerHostRefVO error Resolves: ZSTAC-73863 Change-Id: I7877796b796f61646866786d6d6968756d6c7878 --- .../HostNetworkInterfaceConstant.java | 6 ++++ .../sdnController/SdnControllerBase.java | 34 ------------------- 2 files changed, 6 insertions(+), 34 deletions(-) diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceConstant.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceConstant.java index 15ee3d8732a..995c2d945ff 100644 --- a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceConstant.java +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceConstant.java @@ -1,5 +1,11 @@ package org.zstack.network.hostNetworkInterface; +import java.util.Arrays; +import java.util.List; + public interface HostNetworkInterfaceConstant { String NIC_DRIVER_TYPE_VFIO_PCI = "vfio-pci"; + String NIC_DRIVER_TYPE_UIO_PCI = "uio_pci_generic"; + + List VFIO_DRIVER_TYPES = Arrays.asList(NIC_DRIVER_TYPE_VFIO_PCI, NIC_DRIVER_TYPE_UIO_PCI); } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java index ced3cc6ae3e..cc508a8e84a 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java @@ -284,40 +284,6 @@ public void run(SyncTaskChain chain) { controller.addHost(msg, new Completion(completion) { @Override public void success() { - SdnControllerHostRefVO ref = new SdnControllerHostRefVO(); - ref.setSdnControllerUuid(msg.getSdnControllerUuid()); - ref.setHostUuid(msg.getHostUuid()); - ref.setvSwitchType(msg.getvSwitchType()); - - Map nicNameDriverMap = new HashMap<>(); - Map nicNamePciAddressMap = new HashMap<>(); - List nicTuples = Q.New(HostNetworkInterfaceVO.class) - .eq(HostNetworkInterfaceVO_.hostUuid, msg.getHostUuid()) - .in(HostNetworkInterfaceVO_.interfaceName, msg.getNicNames()) - .select(HostNetworkInterfaceVO_.interfaceName, - HostNetworkInterfaceVO_.driverType, - HostNetworkInterfaceVO_.pciDeviceAddress) - .listTuple(); - for (Tuple t : nicTuples) { - nicNameDriverMap.put(t.get(0, String.class), t.get(1, String.class)); - nicNamePciAddressMap.put(t.get(0, String.class), t.get(2, String.class)); - } - ref.setNicDrivers(JSONObjectUtil.toJsonString(nicNameDriverMap)); - ref.setNicPciAddresses(JSONObjectUtil.toJsonString(nicNamePciAddressMap)); - if (msg.getVtepIp() != null) { - ref.setVtepIp(msg.getVtepIp()); - } - if (msg.getNetmask() != null) { - ref.setNetmask(msg.getNetmask()); - } - if (msg.getBondMode() != null) { - ref.setBondMode(msg.getBondMode()); - } - if (msg.getLacpMode() != null) { - ref.setLacpMode(msg.getLacpMode()); - } - dbf.persist(ref); - completion.success(); chain.next(); } From 4a54e44692fc6900e9bd4fb920c024e9cc53b9ac Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Wed, 27 Aug 2025 11:37:21 +0800 Subject: [PATCH 449/737] [vm]: GetCandidatePrimaryStorage support offering config Resolves: ZSTAC-31791 Change-Id: I64786b6a72616563627977726b77616f736f6567 --- compute/pom.xml | 5 + .../compute/vm/VmInstanceManagerImpl.java | 31 +++++ ...didatePrimaryStoragesForCreatingVmMsg.java | 13 +- ...ryStoragesForCreatingVmMsgDoc_zh_cn.groovy | 9 ++ ...atePrimaryStoragesForCreatingVmAction.java | 3 + .../vm/GetCandidatePrimaryStorageCase.groovy | 112 ++++++++++++++++-- 6 files changed, 163 insertions(+), 10 deletions(-) diff --git a/compute/pom.xml b/compute/pom.xml index f0f9de03f5e..e87ed4a4b12 100755 --- a/compute/pom.xml +++ b/compute/pom.xml @@ -132,5 +132,10 @@ directory ${project.version} + + org.zstack + configuration + ${project.version} + diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java index a014672e4da..bc78267adae 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java @@ -8,6 +8,9 @@ import org.springframework.transaction.annotation.Transactional; import org.zstack.compute.allocator.HostAllocatorManager; import org.zstack.compute.vm.quota.*; +import org.zstack.configuration.DiskOfferingSystemTags; +import org.zstack.configuration.InstanceOfferingSystemTags; +import org.zstack.configuration.OfferingUserConfigUtils; import org.zstack.core.Platform; import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.*; @@ -32,6 +35,8 @@ import org.zstack.header.cluster.ClusterInventory; import org.zstack.header.cluster.ClusterVO; import org.zstack.header.configuration.*; +import org.zstack.header.configuration.userconfig.DiskOfferingUserConfig; +import org.zstack.header.configuration.userconfig.InstanceOfferingUserConfig; import org.zstack.header.core.*; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; @@ -822,13 +827,31 @@ protected ImageInventory scripts() { } else { Tuple t = Q.New(DiskOfferingVO.class).eq(DiskOfferingVO_.uuid, msg.getRootDiskOfferingUuid()) .select(DiskOfferingVO_.diskSize, DiskOfferingVO_.allocatorStrategy).findTuple(); + rmsg.setSize((long) t.get(0)); rmsg.setAllocationStrategy((String) t.get(1)); rmsg.setDiskOfferingUuid(msg.getRootDiskOfferingUuid()); + + if (DiskOfferingSystemTags.DISK_OFFERING_USER_CONFIG.hasTag(msg.getRootDiskOfferingUuid())) { + DiskOfferingUserConfig config = OfferingUserConfigUtils.getDiskOfferingConfig(msg.getRootDiskOfferingUuid(), DiskOfferingUserConfig.class); + if (config.getAllocate() != null && config.getAllocate().getPrimaryStorage() != null) { + String psUuid = config.getAllocate().getPrimaryStorage().getUuid(); + rmsg.setRequiredPrimaryStorageUuid(psUuid); + } + } } } else { rmsg.setSize(imageInv.getSize()); } + + if (msg.getInstanceOfferingUuid() != null && InstanceOfferingSystemTags.INSTANCE_OFFERING_USER_CONFIG.hasTag(msg.getInstanceOfferingUuid())) { + InstanceOfferingUserConfig config = OfferingUserConfigUtils.getInstanceOfferingConfig(msg.getInstanceOfferingUuid(), InstanceOfferingUserConfig.class); + if (config.getAllocate() != null && config.getAllocate().getPrimaryStorage() != null) { + String psUuid = config.getAllocate().getPrimaryStorage().getUuid(); + rmsg.setRequiredPrimaryStorageUuid(psUuid); + } + } + rmsg.setPurpose(PrimaryStorageAllocationPurpose.CreateNewVm.toString()); rmsg.setPossiblePrimaryStorageTypes(new ArrayList<>(psTypes)); bus.makeLocalServiceId(rmsg, PrimaryStorageConstant.SERVICE_ID); @@ -842,6 +865,14 @@ protected ImageInventory scripts() { amsg.setRequiredClusterUuids(clusterUuids); amsg.setAllocationStrategy(dinv.getAllocatorStrategy()); amsg.setDiskOfferingUuid(dinv.getUuid()); + if (DiskOfferingSystemTags.DISK_OFFERING_USER_CONFIG.hasTag(dinv.getUuid())) { + DiskOfferingUserConfig config = OfferingUserConfigUtils.getDiskOfferingConfig(dinv.getUuid(), DiskOfferingUserConfig.class); + if (config.getAllocate() != null && config.getAllocate().getPrimaryStorage() != null) { + String psUuid = config.getAllocate().getPrimaryStorage().getUuid(); + amsg.setRequiredPrimaryStorageUuid(psUuid); + } + } + bus.makeLocalServiceId(amsg, PrimaryStorageConstant.SERVICE_ID); msgs.add(amsg); } diff --git a/header/src/main/java/org/zstack/header/vm/APIGetCandidatePrimaryStoragesForCreatingVmMsg.java b/header/src/main/java/org/zstack/header/vm/APIGetCandidatePrimaryStoragesForCreatingVmMsg.java index 45168b08aaf..3ea3c9375c0 100644 --- a/header/src/main/java/org/zstack/header/vm/APIGetCandidatePrimaryStoragesForCreatingVmMsg.java +++ b/header/src/main/java/org/zstack/header/vm/APIGetCandidatePrimaryStoragesForCreatingVmMsg.java @@ -2,13 +2,13 @@ import org.springframework.http.HttpMethod; import org.zstack.header.configuration.DiskOfferingVO; +import org.zstack.header.configuration.InstanceOfferingVO; import org.zstack.header.identity.Action; import org.zstack.header.image.ImageVO; import org.zstack.header.message.APIParam; import org.zstack.header.message.APISyncCallMessage; import org.zstack.header.network.l3.L3NetworkVO; import org.zstack.header.rest.RestRequest; -import org.zstack.header.storage.backup.BackupStorageVO; import java.util.List; @@ -41,6 +41,17 @@ public class APIGetCandidatePrimaryStoragesForCreatingVmMsg extends APISyncCallM private String clusterUuid; private String defaultL3NetworkUuid; + @APIParam(required = false, resourceType = InstanceOfferingVO.class, checkAccount = true) + private String instanceOfferingUuid; + + public String getInstanceOfferingUuid() { + return instanceOfferingUuid; + } + + public void setInstanceOfferingUuid(String instanceOfferingUuid) { + this.instanceOfferingUuid = instanceOfferingUuid; + } + public List getDataDiskSizes() { return dataDiskSizes; } diff --git a/header/src/main/java/org/zstack/header/vm/APIGetCandidatePrimaryStoragesForCreatingVmMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/vm/APIGetCandidatePrimaryStoragesForCreatingVmMsgDoc_zh_cn.groovy index d0f388f677b..d0b146235af 100644 --- a/header/src/main/java/org/zstack/header/vm/APIGetCandidatePrimaryStoragesForCreatingVmMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/vm/APIGetCandidatePrimaryStoragesForCreatingVmMsgDoc_zh_cn.groovy @@ -120,6 +120,15 @@ doc { optional true since "2.1" } + column { + name "instanceOfferingUuid" + enclosedIn "" + desc "计算规格UUID" + location "query" + type "String" + optional true + since "5.4.0" + } } } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidatePrimaryStoragesForCreatingVmAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidatePrimaryStoragesForCreatingVmAction.java index b24aecb3c21..086394f1989 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidatePrimaryStoragesForCreatingVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidatePrimaryStoragesForCreatingVmAction.java @@ -52,6 +52,9 @@ public Result throwExceptionIfError() { @Param(required = false) public java.lang.String defaultL3NetworkUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String instanceOfferingUuid; + @Param(required = false) public java.util.List systemTags; diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/GetCandidatePrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/GetCandidatePrimaryStorageCase.groovy index 7210b96c294..513e2dd3436 100644 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/GetCandidatePrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/GetCandidatePrimaryStorageCase.groovy @@ -1,5 +1,7 @@ package org.zstack.test.integration.kvm.vm +import org.zstack.configuration.DiskOfferingSystemTags +import org.zstack.configuration.InstanceOfferingSystemTags import org.zstack.core.db.Q import org.zstack.header.network.service.NetworkServiceType import org.zstack.header.storage.primary.PrimaryStorageCapacityVO @@ -10,6 +12,7 @@ import org.zstack.sdk.DiskOfferingInventory import org.zstack.sdk.GetCandidatePrimaryStoragesForCreatingVmAction import org.zstack.sdk.GetCandidatePrimaryStoragesForCreatingVmResult import org.zstack.sdk.ImageInventory +import org.zstack.sdk.InstanceOfferingInventory import org.zstack.sdk.L3NetworkInventory import org.zstack.sdk.PrimaryStorageInventory import org.zstack.test.integration.kvm.KvmTest @@ -17,6 +20,9 @@ import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase import org.zstack.utils.data.SizeUnit +import static org.zstack.utils.CollectionDSL.e +import static org.zstack.utils.CollectionDSL.map + /** * Created by MaJin on 2017-08-19. */ @@ -101,7 +107,9 @@ class GetCandidatePrimaryStorageCase extends SubCase{ totalMem = SizeUnit.GIGABYTE.toByte(320) } - attachPrimaryStorage("smp") + attachPrimaryStorage("local") + attachPrimaryStorage("local2") + attachPrimaryStorage("local3") attachL2Network("l2") } @@ -119,9 +127,19 @@ class GetCandidatePrimaryStorageCase extends SubCase{ attachL2Network("l2") } - smpPrimaryStorage { - name = "smp" - url = "/opt/smp" + localPrimaryStorage { + name = "local" + url = "/opt/local" + } + + localPrimaryStorage { + name = "local2" + url = "/opt/local2" + } + + localPrimaryStorage { + name = "local3" + url = "/opt/local3" } cephPrimaryStorage { @@ -201,11 +219,12 @@ class GetCandidatePrimaryStorageCase extends SubCase{ imageOnSftp = env.inventoryByName("image-on-sftp") as ImageInventory imageOnCeph = env.inventoryByName("image-on-ceph") as ImageInventory l3 = env.inventoryByName("l3") as L3NetworkInventory - ps = env.inventoryByName("smp") as PrimaryStorageInventory + ps = env.inventoryByName("local") as PrimaryStorageInventory disk = env.inventoryByName("diskOffering") as DiskOfferingInventory iso = env.inventoryByName("iso") as ImageInventory testGetPsForCreatingVm() testGetCephPsCandidate() + testGetInstanceOfferingRelatedPs() } } @@ -214,13 +233,88 @@ class GetCandidatePrimaryStorageCase extends SubCase{ env.delete() } - void testGetPsForCreatingVm(){ + void testGetInstanceOfferingRelatedPs() { + def local2 = env.inventoryByName("local2") as PrimaryStorageInventory + def local3 = env.inventoryByName("local3") as PrimaryStorageInventory + String instanceOfferingConfig = "{\n" + + " \"allocate\": {\n" + + " \"primaryStorage\": {\n" + + " \"type\": \"LocalStorage\", \n" + + " \"uuid\": ${local2.uuid} \n" + + " }\n" + + " }\n" + + "}" + + InstanceOfferingInventory instanceOffering = createInstanceOffering { + name = "instanceOffering" + cpuNum = 1 + memorySize = SizeUnit.GIGABYTE.toByte(1) + systemTags = [ + InstanceOfferingSystemTags.INSTANCE_OFFERING_USER_CONFIG.instantiateTag(map( + e(InstanceOfferingSystemTags.INSTANCE_OFFERING_USER_CONFIG_TOKEN, instanceOfferingConfig) + )) + ] + } + + String diskOfferingConfig = "{\n" + + " \"allocate\": {\n" + + " \"primaryStorage\": {\n" + + " \"type\": \"LocalStorage\", \n" + + " \"uuid\": ${local3.uuid} \n" + + " }\n" + + " }\n" + + "}" + + DiskOfferingInventory diskOffering = createDiskOffering { + name = "diskOffering" + diskSize = SizeUnit.GIGABYTE.toByte(1) + systemTags = [ + DiskOfferingSystemTags.DISK_OFFERING_USER_CONFIG.instantiateTag(map( + e(DiskOfferingSystemTags.DISK_OFFERING_USER_CONFIG_TOKEN, diskOfferingConfig) + )) + ] + } + + 5.times { + def result = getCandidatePrimaryStoragesForCreatingVm { + imageUuid = imageOnSftp.uuid + l3NetworkUuids = [l3.uuid] + } as GetCandidatePrimaryStoragesForCreatingVmResult + + assert result.rootVolumePrimaryStorages.size() == 3 + + result = getCandidatePrimaryStoragesForCreatingVm { + imageUuid = imageOnSftp.uuid + l3NetworkUuids = [l3.uuid] + instanceOfferingUuid = instanceOffering.uuid + } as GetCandidatePrimaryStoragesForCreatingVmResult + + assert result.rootVolumePrimaryStorages.size() == 1 + assert result.rootVolumePrimaryStorages.get(0).uuid == local2.uuid + + result = getCandidatePrimaryStoragesForCreatingVm { + imageUuid = imageOnSftp.uuid + l3NetworkUuids = [l3.uuid] + instanceOfferingUuid = instanceOffering.uuid + dataDiskOfferingUuids = [diskOffering.uuid] + } as GetCandidatePrimaryStoragesForCreatingVmResult + + assert result.rootVolumePrimaryStorages.size() == 1 + assert result.rootVolumePrimaryStorages.get(0).uuid == local2.uuid + assert result.dataVolumePrimaryStorages.size() == 1 + def dataVolumePrimaryStorages = result.dataVolumePrimaryStorages.get(diskOffering.uuid) as List + assert dataVolumePrimaryStorages.size() == 1 + assert dataVolumePrimaryStorages.get(0).uuid == local3.uuid + } + } + + void testGetPsForCreatingVm() { GetCandidatePrimaryStoragesForCreatingVmResult result = getCandidatePrimaryStoragesForCreatingVm { imageUuid = imageOnSftp.uuid l3NetworkUuids = [l3.uuid] } as GetCandidatePrimaryStoragesForCreatingVmResult - assert result.rootVolumePrimaryStorages.size() == 1 + assert result.rootVolumePrimaryStorages.size() == 3 assert result.dataVolumePrimaryStorages.size() == 0 result = getCandidatePrimaryStoragesForCreatingVm { @@ -229,7 +323,7 @@ class GetCandidatePrimaryStorageCase extends SubCase{ l3NetworkUuids = [l3.uuid] } as GetCandidatePrimaryStoragesForCreatingVmResult - assert result.rootVolumePrimaryStorages.size() == 1 + assert result.rootVolumePrimaryStorages.size() == 3 assert result.dataVolumePrimaryStorages.size() == 0 result = getCandidatePrimaryStoragesForCreatingVm { @@ -239,7 +333,7 @@ class GetCandidatePrimaryStorageCase extends SubCase{ l3NetworkUuids = [l3.uuid] } as GetCandidatePrimaryStoragesForCreatingVmResult - assert result.rootVolumePrimaryStorages.size() == 1 + assert result.rootVolumePrimaryStorages.size() == 3 assert result.dataVolumePrimaryStorages.size() == 1 GetCandidatePrimaryStoragesForCreatingVmAction a = new GetCandidatePrimaryStoragesForCreatingVmAction() From 8ef77c9305a6594d3d33fb6759ea8c9f74d9e118 Mon Sep 17 00:00:00 2001 From: "yingzhe.hu" Date: Tue, 26 Aug 2025 13:28:03 +0800 Subject: [PATCH 450/737] [image]: external adapter code improvement APIImpact DBImpact Resolves: ZSTAC-77213 Change-Id: I6a79666b696b7462686c66697061716c717a6f70 --- conf/db/upgrade/V5.3.36__schema.sql | 20 --- conf/db/upgrade/V5.4.0__schema.sql | 20 +++ .../image/APICloneImageEventDoc_zh_cn.groovy | 6 +- .../zstack/header/image/APICloneImageMsg.java | 7 + .../image/APICloneImageMsgDoc_zh_cn.groovy | 14 +- .../APICreateImageGroupFromImageEvent.java | 12 +- ...teImageGroupFromImageEventDoc_zh_cn.groovy | 6 +- .../APICreateImageGroupFromImageMsg.java | 21 ++- ...eateImageGroupFromImageMsgDoc_zh_cn.groovy | 20 +-- .../APICreateImageGroupFromSnapshotEvent.java | 8 ++ ...mageGroupFromSnapshotEventDoc_zh_cn.groovy | 6 +- .../APICreateImageGroupFromSnapshotMsg.java | 22 ++- ...eImageGroupFromSnapshotMsgDoc_zh_cn.groovy | 20 +-- ...geGroupFromVmInstanceEventDoc_zh_cn.groovy | 6 +- .../APICreateImageGroupFromVmInstanceMsg.java | 8 ++ ...mageGroupFromVmInstanceMsgDoc_zh_cn.groovy | 14 +- .../APIExpungeImageGroupEventDoc_zh_cn.groovy | 6 +- .../header/image/APIExpungeImageGroupMsg.java | 8 +- .../APIExpungeImageGroupMsgDoc_zh_cn.groovy | 8 +- ...APIQueryImageGroupRefReplyDoc_zh_cn.groovy | 8 +- .../APIQueryImageGroupReplyDoc_zh_cn.groovy | 6 +- .../image/ImageGroupInventoryDoc_zh_cn.groovy | 16 +-- .../ImageGroupRefInventoryDoc_zh_cn.groovy | 10 +- .../zstack/header/image/ImageGroupRefVO.java | 4 +- .../main/java/org/zstack/image/ImageBase.java | 40 ++---- .../org/zstack/image/ImageManagerImpl.java | 27 ++-- .../service/flat/FlatUserdataBackend.java | 36 ++--- sdk/src/main/java/SourceClassMap.java | 8 +- .../sdk/AliyunInvocationRecordDetailData.java | 47 ------- .../sdk/CreateImageGroupFromImageAction.java | 2 +- .../CreateImageGroupFromSnapshotAction.java | 2 +- .../zstack/sdk/ExpungeImageGroupAction.java | 2 +- ...n.java => GetInvocationRecordsAction.java} | 8 +- ...t.java => GetInvocationRecordsResult.java} | 2 +- ...nRecordData.java => InvocationRecord.java} | 2 +- .../zstack/sdk/InvocationRecordDetail.java | 47 +++++++ .../storage/backup/BackupStorageBase.java | 45 ++++++- .../image/ImageGroupOperationsCase.groovy | 34 +++-- .../java/org/zstack/testlib/ApiHelper.groovy | 125 +++++++++++------- 39 files changed, 412 insertions(+), 291 deletions(-) delete mode 100644 sdk/src/main/java/org/zstack/sdk/AliyunInvocationRecordDetailData.java rename sdk/src/main/java/org/zstack/sdk/{GetAliyunInvocationsAction.java => GetInvocationRecordsAction.java} (88%) rename sdk/src/main/java/org/zstack/sdk/{GetAliyunInvocationsResult.java => GetInvocationRecordsResult.java} (91%) rename sdk/src/main/java/org/zstack/sdk/{AliyunInvocationRecordData.java => InvocationRecord.java} (98%) create mode 100644 sdk/src/main/java/org/zstack/sdk/InvocationRecordDetail.java diff --git a/conf/db/upgrade/V5.3.36__schema.sql b/conf/db/upgrade/V5.3.36__schema.sql index 389ce127e05..d7a568582ea 100644 --- a/conf/db/upgrade/V5.3.36__schema.sql +++ b/conf/db/upgrade/V5.3.36__schema.sql @@ -10,24 +10,4 @@ CREATE TABLE IF NOT EXISTS `zstack`.`VolumeCbtBackupRecordVO` ( `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE IF NOT EXISTS `zstack`.`ImageGroupVO` ( - `uuid` VARCHAR(32) NOT NULL UNIQUE, - `name` VARCHAR(255) NOT NULL, - `status` varchar(32) NOT NULL, - `description` VARCHAR(2048) DEFAULT NULL, - `imageCount` int unsigned NOT NULL, - `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE current_timestamp(), - `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', - PRIMARY KEY (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE IF NOT EXISTS `zstack`.`ImageGroupRefVO` ( - `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, - `imageUuid` VARCHAR(32) NOT NULL, - `imageGroupUuid` VARCHAR(32) NOT NULL, - `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE current_timestamp(), - `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', - PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/conf/db/upgrade/V5.4.0__schema.sql b/conf/db/upgrade/V5.4.0__schema.sql index 808f516f301..2b2a053d1ff 100644 --- a/conf/db/upgrade/V5.4.0__schema.sql +++ b/conf/db/upgrade/V5.4.0__schema.sql @@ -7,5 +7,25 @@ ALTER TABLE `zstack`.`L3NetworkEO` ADD COLUMN `internalId` INT(32) unsigned DEFA DROP VIEW IF EXISTS `zstack`.`L3NetworkVO`; CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, internalId, description, state, type, zoneUuid, l2NetworkUuid, `system`, dnsDomain, createDate, lastOpDate, category, ipVersion, enableIPAM, isolated FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; +CREATE TABLE IF NOT EXISTS `zstack`.`ImageGroupVO` ( + `uuid` VARCHAR(32) NOT NULL UNIQUE, + `name` VARCHAR(255) NOT NULL, + `status` varchar(32) NOT NULL, + `description` VARCHAR(2048) DEFAULT NULL, + `imageCount` int unsigned NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ImageGroupRefVO` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `imageUuid` VARCHAR(32) NOT NULL, + `imageGroupUuid` VARCHAR(32) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + ALTER TABLE SecurityGroupRuleVO MODIFY COLUMN `dstPortRange` varchar(1024) DEFAULT NULL; ALTER TABLE SecurityGroupRuleVO MODIFY COLUMN `srcPortRange` varchar(1024) DEFAULT NULL; \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/APICloneImageEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICloneImageEventDoc_zh_cn.groovy index a6b7cac1a84..f406289e561 100644 --- a/header/src/main/java/org/zstack/header/image/APICloneImageEventDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/image/APICloneImageEventDoc_zh_cn.groovy @@ -12,21 +12,21 @@ doc { path "org.zstack.header.image.APICloneImageEvent.inventory" desc "null" type "ImageInventory" - since "5.3.36" + since "5.4.0" clz ImageInventory.class } field { name "success" desc "" type "boolean" - since "5.3.36" + since "5.4.0" } ref { name "error" path "org.zstack.header.image.APICloneImageEvent.error" desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false type "ErrorCode" - since "5.3.36" + since "5.4.0" clz ErrorCode.class } } diff --git a/header/src/main/java/org/zstack/header/image/APICloneImageMsg.java b/header/src/main/java/org/zstack/header/image/APICloneImageMsg.java index 21ab2c537e6..5f614e6f304 100644 --- a/header/src/main/java/org/zstack/header/image/APICloneImageMsg.java +++ b/header/src/main/java/org/zstack/header/image/APICloneImageMsg.java @@ -42,4 +42,11 @@ public String getStrategy() { public void setStrategy(String strategy) { this.strategy = strategy; } + + public static APICloneImageMsg __example__() { + APICloneImageMsg msg = new APICloneImageMsg(); + msg.setImageUuid(uuid()); + msg.setStrategy(ImageCloneStrategy.DatabaseOnly.toString()); + return msg; + } } diff --git a/header/src/main/java/org/zstack/header/image/APICloneImageMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICloneImageMsgDoc_zh_cn.groovy index 8be21f21829..22d7a47e1b0 100644 --- a/header/src/main/java/org/zstack/header/image/APICloneImageMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/image/APICloneImageMsgDoc_zh_cn.groovy @@ -28,7 +28,7 @@ doc { location "url" type "String" optional false - since "5.3.36" + since "5.4.0" } column { name "imageGroupUuid" @@ -37,7 +37,7 @@ doc { location "body" type "String" optional false - since "5.3.36" + since "5.4.0" } column { name "strategy" @@ -46,7 +46,7 @@ doc { location "body" type "String" optional true - since "5.3.36" + since "5.4.0" values ("DatabaseOnly") } column { @@ -56,7 +56,7 @@ doc { location "body" type "String" optional true - since "5.3.36" + since "5.4.0" } column { name "tagUuids" @@ -65,7 +65,7 @@ doc { location "body" type "List" optional true - since "5.3.36" + since "5.4.0" } column { name "systemTags" @@ -74,7 +74,7 @@ doc { location "body" type "List" optional true - since "5.3.36" + since "5.4.0" } column { name "userTags" @@ -83,7 +83,7 @@ doc { location "body" type "List" optional true - since "5.3.36" + since "5.4.0" } } } diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEvent.java b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEvent.java index 635bee37bc5..46641ac1ebb 100644 --- a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEvent.java +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEvent.java @@ -4,7 +4,7 @@ import org.zstack.header.rest.RestResponse; @RestResponse(allTo = "inventory") -public class APICreateImageGroupFromImageEvent extends APIEvent { +public class APICreateImageGroupFromImageEvent extends APIEvent { ImageGroupInventory inventory; public APICreateImageGroupFromImageEvent(String apiId) { @@ -22,4 +22,14 @@ public void setInventory(ImageGroupInventory imageGroup) { public ImageGroupInventory getInventory() { return inventory; } + + public static APICreateImageGroupFromImageEvent __example__() { + APICreateImageGroupFromImageEvent event = new APICreateImageGroupFromImageEvent(); + ImageGroupInventory inv = new ImageGroupInventory(); + inv.setUuid("f0b149e0-53b3-4c7e-b7fe-694b182ebffd"); + inv.setName("example-image-group"); + inv.setDescription("example image group"); + event.setInventory(inv); + return event; + } } diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEventDoc_zh_cn.groovy index be604e50543..7eafd031064 100644 --- a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEventDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEventDoc_zh_cn.groovy @@ -12,21 +12,21 @@ doc { path "org.zstack.header.image.APICreateImageGroupFromImageEvent.inventory" desc "null" type "ImageGroupInventory" - since "5.3.36" + since "5.4.0" clz ImageGroupInventory.class } field { name "success" desc "" type "boolean" - since "5.3.36" + since "5.4.0" } ref { name "error" path "org.zstack.header.image.APICreateImageGroupFromImageEvent.error" desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false type "ErrorCode" - since "5.3.36" + since "5.4.0" clz ErrorCode.class } } diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsg.java b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsg.java index f9810ed49b6..7f8d6fd8c39 100644 --- a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsg.java +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsg.java @@ -25,7 +25,7 @@ public class APICreateImageGroupFromImageMsg extends APICreateMessage { @APIParam(required = false, maxLength = 2048) private String description; @APIParam(required = false) - private List dateVolumeTemplateUuids; + private List dataVolumeTemplateUuids; public String getName() { return name; @@ -51,11 +51,22 @@ public void setRootVolumeTemplateUuid(String rootVolumeTemplateUuid) { this.rootVolumeTemplateUuid = rootVolumeTemplateUuid; } - public List getDateVolumeTemplateUuids() { - return dateVolumeTemplateUuids; + public List getDataVolumeTemplateUuids() { + return dataVolumeTemplateUuids; } - public void setDateVolumeTemplateUuids(List dateVolumeTemplateUuids) { - this.dateVolumeTemplateUuids = dateVolumeTemplateUuids; + public void setDataVolumeTemplateUuids(List dataVolumeTemplateUuids) { + this.dataVolumeTemplateUuids = dataVolumeTemplateUuids; + } + + public static APICreateImageGroupFromImageMsg __example__() { + APICreateImageGroupFromImageMsg msg = new APICreateImageGroupFromImageMsg(); + msg.setRootVolumeTemplateUuid("b7b9dcad-3c6d-4a7b-9a0a-1b9a20f5c002"); + msg.setName("example-image-group-from-image"); + msg.setDescription("create image group from root image template"); + msg.setDataVolumeTemplateUuids(java.util.Arrays.asList( + "c1b9dcad-3c6d-4a7b-9a0a-1b9a20f5c003", + "d2b9dcad-3c6d-4a7b-9a0a-1b9a20f5c004")); + return msg; } } diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsgDoc_zh_cn.groovy index 0e07df40713..e41d9eed7f6 100644 --- a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsgDoc_zh_cn.groovy @@ -28,7 +28,7 @@ doc { location "body" type "String" optional false - since "5.3.36" + since "5.4.0" } column { name "rootVolumeTemplateUuid" @@ -37,7 +37,7 @@ doc { location "url" type "String" optional false - since "5.3.36" + since "5.4.0" } column { name "description" @@ -46,16 +46,16 @@ doc { location "body" type "String" optional true - since "5.3.36" + since "5.4.0" } column { - name "dateVolumeTemplateUuids" + name "dataVolumeTemplateUuids" enclosedIn "params" - desc "" + desc "数据盘镜像模板 UUID 列表" location "body" type "List" optional true - since "5.3.36" + since "5.4.0" } column { name "resourceUuid" @@ -64,7 +64,7 @@ doc { location "body" type "String" optional true - since "5.3.36" + since "5.4.0" } column { name "tagUuids" @@ -73,7 +73,7 @@ doc { location "body" type "List" optional true - since "5.3.36" + since "5.4.0" } column { name "systemTags" @@ -82,7 +82,7 @@ doc { location "body" type "List" optional true - since "5.3.36" + since "5.4.0" } column { name "userTags" @@ -91,7 +91,7 @@ doc { location "body" type "List" optional true - since "5.3.36" + since "5.4.0" } } } diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEvent.java b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEvent.java index 5c760497305..aed70766b0c 100644 --- a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEvent.java +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEvent.java @@ -23,4 +23,12 @@ public ImageGroupInventory getInventory() { return inventory; } + public static APICreateImageGroupFromSnapshotEvent __example__() { + APICreateImageGroupFromSnapshotEvent event = new APICreateImageGroupFromSnapshotEvent(); + ImageGroupInventory inv = new ImageGroupInventory(); + inv.setUuid("a4b149e0-53b3-4c7e-b7fe-694b182eb001"); + inv.setName("example-image-group-from-snapshot"); + event.setInventory(inv); + return event; + } } diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEventDoc_zh_cn.groovy index 6d5de203e0f..601a0ea15c7 100644 --- a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEventDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEventDoc_zh_cn.groovy @@ -12,21 +12,21 @@ doc { path "org.zstack.header.image.APICreateImageGroupFromSnapshotEvent.inventory" desc "null" type "ImageGroupInventory" - since "5.3.36" + since "5.4.0" clz ImageGroupInventory.class } field { name "success" desc "" type "boolean" - since "5.3.36" + since "5.4.0" } ref { name "error" path "org.zstack.header.image.APICreateImageGroupFromSnapshotEvent.error" desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false type "ErrorCode" - since "5.3.36" + since "5.4.0" clz ErrorCode.class } } diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsg.java b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsg.java index c4779f5d673..74fd042043c 100644 --- a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsg.java +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsg.java @@ -25,7 +25,7 @@ public class APICreateImageGroupFromSnapshotMsg extends APICreateMessage { @APIParam(required = false, maxLength = 2048) private String description; @APIParam(required = false) - private List dateVolumeSnapshotUuids; + private List dataVolumeSnapshotUuids; public String getName() { return name; @@ -51,11 +51,23 @@ public void setRootVolumeSnapshotUuid(String rootVolumeSnapshotUuid) { this.rootVolumeSnapshotUuid = rootVolumeSnapshotUuid; } - public List getDateVolumeSnapshotUuids() { - return dateVolumeSnapshotUuids; + public List getDataVolumeSnapshotUuids() { + return dataVolumeSnapshotUuids; } - public void setDateVolumeSnapshotUuids(List dateVolumeSnapshotUuids) { - this.dateVolumeSnapshotUuids = dateVolumeSnapshotUuids; + public void setDataVolumeSnapshotUuids(List dataVolumeSnapshotUuids) { + this.dataVolumeSnapshotUuids = dataVolumeSnapshotUuids; + } + + public static APICreateImageGroupFromSnapshotMsg __example__() { + APICreateImageGroupFromSnapshotMsg msg = new APICreateImageGroupFromSnapshotMsg(); + msg.setRootVolumeSnapshotUuid("aa12b3cd-3c6d-4a7b-9a0a-1b9a20f5c005"); + msg.setName("example-image-group-from-snapshot"); + msg.setDescription("create image group from root volume snapshot"); + msg.setDataVolumeSnapshotUuids(java.util.Arrays.asList( + "bb12b3cd-3c6d-4a7b-9a0a-1b9a20f5c006", + "cc12b3cd-3c6d-4a7b-9a0a-1b9a20f5c007" + )); + return msg; } } diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsgDoc_zh_cn.groovy index 959faef15d8..a89468d1adc 100644 --- a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsgDoc_zh_cn.groovy @@ -28,7 +28,7 @@ doc { location "body" type "String" optional false - since "5.3.36" + since "5.4.0" } column { name "rootVolumeSnapshotUuid" @@ -37,7 +37,7 @@ doc { location "url" type "String" optional false - since "5.3.36" + since "5.4.0" } column { name "description" @@ -46,16 +46,16 @@ doc { location "body" type "String" optional true - since "5.3.36" + since "5.4.0" } column { - name "dateVolumeSnapshotUuids" + name "dataVolumeSnapshotUuids" enclosedIn "params" - desc "" + desc "数据盘快照 UUID 列表" location "body" type "List" optional true - since "5.3.36" + since "5.4.0" } column { name "resourceUuid" @@ -64,7 +64,7 @@ doc { location "body" type "String" optional true - since "5.3.36" + since "5.4.0" } column { name "tagUuids" @@ -73,7 +73,7 @@ doc { location "body" type "List" optional true - since "5.3.36" + since "5.4.0" } column { name "systemTags" @@ -82,7 +82,7 @@ doc { location "body" type "List" optional true - since "5.3.36" + since "5.4.0" } column { name "userTags" @@ -91,7 +91,7 @@ doc { location "body" type "List" optional true - since "5.3.36" + since "5.4.0" } } } diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceEventDoc_zh_cn.groovy index 7a42e3e38c1..c7472afdbdc 100644 --- a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceEventDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceEventDoc_zh_cn.groovy @@ -12,21 +12,21 @@ doc { path "org.zstack.header.image.APICreateImageGroupFromVmInstanceEvent.inventory" desc "null" type "ImageGroupInventory" - since "5.3.36" + since "5.4.0" clz ImageGroupInventory.class } field { name "success" desc "" type "boolean" - since "5.3.36" + since "5.4.0" } ref { name "error" path "org.zstack.header.image.APICreateImageGroupFromVmInstanceEvent.error" desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false type "ErrorCode" - since "5.3.36" + since "5.4.0" clz ErrorCode.class } } diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsg.java b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsg.java index 80ecbbac514..b36db132359 100644 --- a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsg.java +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsg.java @@ -47,4 +47,12 @@ public String getDescription() { public void setDescription(String description) { this.description = description; } + + public static APICreateImageGroupFromVmInstanceMsg __example__() { + APICreateImageGroupFromVmInstanceMsg msg = new APICreateImageGroupFromVmInstanceMsg(); + msg.setVmInstanceUuid("e7b9dcad-3c6d-4a7b-9a0a-1b9a20f5c001"); + msg.setName("example-image-group-from-vm"); + msg.setDescription("create image group from vm instance"); + return msg; + } } diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsgDoc_zh_cn.groovy index ccf7a4a7feb..cecf4966ac4 100644 --- a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsgDoc_zh_cn.groovy @@ -28,7 +28,7 @@ doc { location "body" type "String" optional false - since "5.3.36" + since "5.4.0" } column { name "name" @@ -37,7 +37,7 @@ doc { location "body" type "String" optional false - since "5.3.36" + since "5.4.0" } column { name "description" @@ -46,7 +46,7 @@ doc { location "body" type "String" optional true - since "5.3.36" + since "5.4.0" } column { name "resourceUuid" @@ -55,7 +55,7 @@ doc { location "body" type "String" optional true - since "5.3.36" + since "5.4.0" } column { name "tagUuids" @@ -64,7 +64,7 @@ doc { location "body" type "List" optional true - since "5.3.36" + since "5.4.0" } column { name "systemTags" @@ -73,7 +73,7 @@ doc { location "body" type "List" optional true - since "5.3.36" + since "5.4.0" } column { name "userTags" @@ -82,7 +82,7 @@ doc { location "body" type "List" optional true - since "5.3.36" + since "5.4.0" } } } diff --git a/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupEventDoc_zh_cn.groovy index 31459053acf..95b4c0d40ad 100644 --- a/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupEventDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupEventDoc_zh_cn.groovy @@ -10,14 +10,14 @@ doc { name "success" desc "" type "boolean" - since "5.3.36" + since "5.4.0" } ref { name "error" path "org.zstack.header.image.APIExpungeImageGroupEvent.error" - desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null" type "ErrorCode" - since "5.3.36" + since "5.4.0" clz ErrorCode.class } } diff --git a/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsg.java b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsg.java index 3a36dd751e4..849fd236442 100644 --- a/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsg.java +++ b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsg.java @@ -14,7 +14,7 @@ isAction = true ) public class APIExpungeImageGroupMsg extends APIMessage { - @APIParam(required = false, resourceType = ImageGroupVO.class, checkAccount = true, operationTarget = true) + @APIParam(required = true, resourceType = ImageGroupVO.class, checkAccount = true, operationTarget = true) private String uuid; public String getUuid() { @@ -24,4 +24,10 @@ public String getUuid() { public void setUuid(String uuid) { this.uuid = uuid; } + + public static APIExpungeImageGroupMsg __example__() { + APIExpungeImageGroupMsg msg = new APIExpungeImageGroupMsg(); + msg.setUuid(uuid()); + return msg; + } } diff --git a/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsgDoc_zh_cn.groovy index 9b3adb86c0b..2a43cafb204 100644 --- a/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsgDoc_zh_cn.groovy @@ -27,8 +27,8 @@ doc { desc "资源的UUID,唯一标示该资源" location "url" type "String" - optional true - since "5.3.36" + optional false + since "5.4.0" } column { name "systemTags" @@ -37,7 +37,7 @@ doc { location "body" type "List" optional true - since "5.3.36" + since "5.4.0" } column { name "userTags" @@ -46,7 +46,7 @@ doc { location "body" type "List" optional true - since "5.3.36" + since "5.4.0" } } } diff --git a/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefReplyDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefReplyDoc_zh_cn.groovy index c38ad3bda83..f8e6d9fac4e 100644 --- a/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefReplyDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefReplyDoc_zh_cn.groovy @@ -12,21 +12,21 @@ doc { path "org.zstack.header.image.APIQueryImageGroupRefReply.inventories" desc "null" type "List" - since "5.3.36" + since "5.4.0" clz ImageGroupRefInventory.class } field { name "success" desc "" type "boolean" - since "5.3.36" + since "5.4.0" } ref { name "error" path "org.zstack.header.image.APIQueryImageGroupRefReply.error" - desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null" type "ErrorCode" - since "5.3.36" + since "5.4.0" clz ErrorCode.class } } diff --git a/header/src/main/java/org/zstack/header/image/APIQueryImageGroupReplyDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupReplyDoc_zh_cn.groovy index addfed26c50..76e2651f944 100644 --- a/header/src/main/java/org/zstack/header/image/APIQueryImageGroupReplyDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupReplyDoc_zh_cn.groovy @@ -12,21 +12,21 @@ doc { path "org.zstack.header.image.APIQueryImageGroupReply.inventories" desc "null" type "List" - since "5.3.36" + since "5.4.0" clz ImageGroupInventory.class } field { name "success" desc "" type "boolean" - since "5.3.36" + since "5.4.0" } ref { name "error" path "org.zstack.header.image.APIQueryImageGroupReply.error" desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false type "ErrorCode" - since "5.3.36" + since "5.4.0" clz ErrorCode.class } } diff --git a/header/src/main/java/org/zstack/header/image/ImageGroupInventoryDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/ImageGroupInventoryDoc_zh_cn.groovy index 96090af971e..af9ac25cbc3 100644 --- a/header/src/main/java/org/zstack/header/image/ImageGroupInventoryDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/image/ImageGroupInventoryDoc_zh_cn.groovy @@ -5,48 +5,48 @@ import java.sql.Timestamp doc { - title "在这里输入结构的名称" + title "镜像组清单" field { name "imageCount" desc "" type "Integer" - since "5.3.36" + since "5.4.0" } field { name "name" desc "资源名称" type "String" - since "5.3.36" + since "5.4.0" } field { name "description" desc "资源的详细描述" type "String" - since "5.3.36" + since "5.4.0" } field { name "status" desc "" type "String" - since "5.3.36" + since "5.4.0" } field { name "createDate" desc "创建时间" type "Timestamp" - since "5.3.36" + since "5.4.0" } field { name "lastOpDate" desc "最后一次修改时间" type "Timestamp" - since "5.3.36" + since "5.4.0" } field { name "uuid" desc "资源的UUID,唯一标示该资源" type "String" - since "5.3.36" + since "5.4.0" } } diff --git a/header/src/main/java/org/zstack/header/image/ImageGroupRefInventoryDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/ImageGroupRefInventoryDoc_zh_cn.groovy index bdcee6ad5f7..eb3bc0d91b6 100644 --- a/header/src/main/java/org/zstack/header/image/ImageGroupRefInventoryDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/image/ImageGroupRefInventoryDoc_zh_cn.groovy @@ -4,30 +4,30 @@ import java.sql.Timestamp doc { - title "在这里输入结构的名称" + title "镜像组引用结构清单" field { name "imageUuid" desc "镜像UUID" type "String" - since "5.3.36" + since "5.4.0" } field { name "imageGroupUuid" desc "" type "String" - since "5.3.36" + since "5.4.0" } field { name "createDate" desc "创建时间" type "Timestamp" - since "5.3.36" + since "5.4.0" } field { name "lastOpDate" desc "最后一次修改时间" type "Timestamp" - since "5.3.36" + since "5.4.0" } } diff --git a/header/src/main/java/org/zstack/header/image/ImageGroupRefVO.java b/header/src/main/java/org/zstack/header/image/ImageGroupRefVO.java index 886900da98c..68050f3f6d5 100644 --- a/header/src/main/java/org/zstack/header/image/ImageGroupRefVO.java +++ b/header/src/main/java/org/zstack/header/image/ImageGroupRefVO.java @@ -14,8 +14,8 @@ @Table @EntityGraph( friends = { - @EntityGraph.Neighbour(type = ImageGroupVO.class, myField = "ImageGroupUuid", targetField = "uuid"), - @EntityGraph.Neighbour(type = ImageVO.class, myField = "ImageUuid", targetField = "uuid"), + @EntityGraph.Neighbour(type = ImageGroupVO.class, myField = "imageGroupUuid", targetField = "uuid"), + @EntityGraph.Neighbour(type = ImageVO.class, myField = "imageUuid", targetField = "uuid"), } ) public class ImageGroupRefVO implements Serializable { diff --git a/image/src/main/java/org/zstack/image/ImageBase.java b/image/src/main/java/org/zstack/image/ImageBase.java index 81b5ae537b1..c4ca5fcb840 100755 --- a/image/src/main/java/org/zstack/image/ImageBase.java +++ b/image/src/main/java/org/zstack/image/ImageBase.java @@ -17,10 +17,6 @@ import org.zstack.core.thread.SyncTaskChain; import org.zstack.core.thread.ThreadFacade; import org.zstack.core.workflow.FlowChainBuilder; -import org.zstack.core.workflow.ShareFlow; -import org.zstack.header.cluster.APIDeleteClusterEvent; -import org.zstack.header.cluster.ClusterInventory; -import org.zstack.header.cluster.ClusterVO; import org.zstack.header.core.Completion; import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.core.WhileDoneCompletion; @@ -38,17 +34,13 @@ import org.zstack.header.image.ImageConstant.ImageMediaType; import org.zstack.header.image.ImageDeletionPolicyManager.ImageDeletionPolicy; import org.zstack.header.message.*; -import org.zstack.header.network.l3.*; import org.zstack.header.storage.backup.*; import org.zstack.header.vm.*; import org.zstack.header.volume.VolumeType; -import org.zstack.header.volume.VolumeVO; -import org.zstack.header.volume.VolumeVO_; import org.zstack.tag.SystemTagCreator; import org.zstack.tag.TagManager; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; -import org.zstack.utils.function.ForEachFunction; import org.zstack.utils.function.Function; import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; @@ -58,7 +50,6 @@ import static org.zstack.core.Platform.*; import static org.zstack.utils.CollectionDSL.*; -import static org.zstack.utils.CollectionDSL.list; /** * Created with IntelliJ IDEA. @@ -301,6 +292,7 @@ private void handle(final ExpungeImageMsg msg) { bus.reply(msg, reply); return; } + dbf.remove(ref); DeleteBitsOnBackupStorageMsg dmsg = new DeleteBitsOnBackupStorageMsg(); dmsg.setBackupStorageUuid(ref.getBackupStorageUuid()); @@ -320,7 +312,6 @@ public void run(MessageReply r) { } returnBackupStorageCapacity(ref.getBackupStorageUuid(), self.getActualSize()); - dbf.remove(ref); //TODO remove ref from metadata, this logic should after all refs deleted runAfterExpungeImageExtension(ref.getBackupStorageUuid()); @@ -459,9 +450,7 @@ public void done(ErrorCodeList errorCodeList) { } }); - List refs = new ArrayList<>(); - for (final ImageBackupStorageRefVO ref : toDelete) { chain.then(new NoRollbackFlow() { String __name__ = String.format("delete-image-%s-from-backup-storage-%s", self.getUuid(), ref.getBackupStorageUuid()); @@ -469,11 +458,7 @@ public void done(ErrorCodeList errorCodeList) { @Override public void run(final FlowTrigger trigger, Map data) { if (deletionPolicy == ImageDeletionPolicy.Direct) { - long count = Q.New(ImageBackupStorageRefVO.class).eq(ImageBackupStorageRefVO_.installPath, ref.getInstallPath()).count(); - if (count > 1) { - trigger.next(); - return; - } + dbf.remove(ref); DeleteBitsOnBackupStorageMsg dmsg = new DeleteBitsOnBackupStorageMsg(); dmsg.setBackupStorageUuid(ref.getBackupStorageUuid()); @@ -483,16 +468,22 @@ public void run(final FlowTrigger trigger, Map data) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { - //TODO logger.warn(String.format("failed to delete image[uuid:%s, name:%s] from backup storage[uuid:%s] because %s," + " need to garbage collect it", self.getUuid(), self.getName(), reply.getError(), ref.getBackupStorageUuid())); - } else { - returnBackupStorageCapacity(ref.getBackupStorageUuid(), self.getActualSize()); - dbf.remove(ref); - // now delete ref in metadata - runAfterExpungeImageExtension(ref.getBackupStorageUuid()); + + BackupStorageDeleteBitGC gc = new BackupStorageDeleteBitGC(); + gc.NAME = String.format("gc-delete-bits-%s-on-backup-storage-%s", msg.getImageUuid(), ref.getBackupStorageUuid()); + gc.backupStorageUuid = ref.getBackupStorageUuid(); + gc.imageUuid = msg.getImageUuid(); + gc.installPath = ref.getInstallPath(); + gc.deduplicateSubmit(ImageGlobalConfig.DELETION_GARBAGE_COLLECTION_INTERVAL.value(Long.class), + TimeUnit.SECONDS); } + + returnBackupStorageCapacity(ref.getBackupStorageUuid(), self.getActualSize()); + // now delete ref in metadata + runAfterExpungeImageExtension(ref.getBackupStorageUuid()); trigger.next(); } }); @@ -504,7 +495,6 @@ public void run(MessageReply reply) { } else { ref.setStatus(ImageStatus.Deleted); refs.add(ref); - trigger.next(); } } @@ -591,10 +581,8 @@ public void done(ErrorCodeList errorCodeList) { bus.reply(msg, reply); } }); - } - private void handle(OverlayMessage msg) { thdf.chainSubmit(new ChainTask(msg) { @Override diff --git a/image/src/main/java/org/zstack/image/ImageManagerImpl.java b/image/src/main/java/org/zstack/image/ImageManagerImpl.java index c2bd37b1bf3..0f1f87975d0 100755 --- a/image/src/main/java/org/zstack/image/ImageManagerImpl.java +++ b/image/src/main/java/org/zstack/image/ImageManagerImpl.java @@ -404,6 +404,7 @@ public void handle(Map data) { }).error(new FlowErrorHandler(msg) { @Override public void handle(ErrorCode errCode, Map data) { + evt.setError(errCode); bus.publish(evt); } }).start(); @@ -640,7 +641,7 @@ private void handle(APICreateImageGroupFromImageMsg msg) { ImageGroupVO gvo = new SQLBatchWithReturn() { @Override protected ImageGroupVO scripts() { - List dateVolumeTemplateUuids = msg.getDateVolumeTemplateUuids(); + List dataVolumeTemplateUuids = msg.getDataVolumeTemplateUuids(); List volumesUuids = new ArrayList<>(); volumesUuids.add(msg.getRootVolumeTemplateUuid()); String groupUuid = Platform.getUuid(); @@ -650,13 +651,12 @@ protected ImageGroupVO scripts() { vo.setStatus(ImageStatus.Ready); vo.setDescription(msg.getDescription()); vo.setImageCount(1); - if (!CollectionUtils.isEmpty(dateVolumeTemplateUuids)) { - vo.setImageCount(1 + dateVolumeTemplateUuids.size()); - volumesUuids.addAll(msg.getDateVolumeTemplateUuids()); + if (!CollectionUtils.isEmpty(dataVolumeTemplateUuids)) { + vo.setImageCount(1 + dataVolumeTemplateUuids.size()); + volumesUuids.addAll(msg.getDataVolumeTemplateUuids()); } vo = persist(vo); - new HashSet(volumesUuids).forEach( uuid -> { ImageVO image = q(ImageVO.class) @@ -682,7 +682,7 @@ private void createImageGroupFromSnapshot(APICreateImageGroupFromSnapshotMsg msg chain.then(new ShareFlow() { ImageGroupVO imageGroupVO = new ImageGroupVO(); String rootVolumeSnapshotUuid = msg.getRootVolumeSnapshotUuid(); - List dataVolumeSnapshotUuids = msg.getDateVolumeSnapshotUuids(); + List dataVolumeSnapshotUuids = msg.getDataVolumeSnapshotUuids(); List newImageUuids = new ArrayList(); @Override @@ -750,10 +750,10 @@ public void rollback(FlowRollback trigger, Map data) { trigger.rollback(); return; } - for (String uuid : newImageUuids) { + for (String uuid : new ArrayList<>(newImageUuids)) { ImageDeletionMsg delMsg = new ImageDeletionMsg(); delMsg.setImageUuid(uuid); - delMsg.setDeletionPolicy(VolumeDeletionPolicyManager.VolumeDeletionPolicy.Direct.toString()); + delMsg.setDeletionPolicy(ImageDeletionPolicyManager.ImageDeletionPolicy.Direct.toString()); delMsg.setForceDelete(true); bus.makeTargetServiceIdByResourceUuid(delMsg, ImageConstant.SERVICE_ID, uuid); bus.send(delMsg); @@ -812,10 +812,10 @@ public void rollback(FlowRollback trigger, Map data) { trigger.rollback(); return; } - for (String uuid : newImageUuids) { + for (String uuid : new ArrayList<>(newImageUuids)) { ImageDeletionMsg delMsg = new ImageDeletionMsg(); delMsg.setImageUuid(uuid); - delMsg.setDeletionPolicy(VolumeDeletionPolicyManager.VolumeDeletionPolicy.Direct.toString()); + delMsg.setDeletionPolicy(ImageDeletionPolicyManager.ImageDeletionPolicy.Direct.toString()); delMsg.setForceDelete(true); bus.makeTargetServiceIdByResourceUuid(delMsg, ImageConstant.SERVICE_ID, uuid); bus.send(delMsg); @@ -944,7 +944,7 @@ public void run(FlowTrigger trigger, Map data) { crtMsg.setName(String.format("create-from-root-volume-%s", rootVolumeUuid)); crtMsg.setArchitecture(vmVO.getArchitecture()); crtMsg.setPlatform(vmVO.getPlatform()); - crtMsg.setGuestOsType(vmVO.getPlatform()); + crtMsg.setGuestOsType(vmVO.getGuestOsType()); crtMsg.setDescription(msg.getDescription()); crtMsg.setSession(msg.getSession()); bus.makeLocalServiceId(crtMsg, ImageConstant.SERVICE_ID); @@ -972,7 +972,7 @@ public void rollback(FlowRollback trigger, Map data) { for (String uuid : newVolumeUuids) { ImageDeletionMsg delMsg = new ImageDeletionMsg(); delMsg.setImageUuid(uuid); - delMsg.setDeletionPolicy(VolumeDeletionPolicyManager.VolumeDeletionPolicy.Direct.toString()); + delMsg.setDeletionPolicy(ImageDeletionPolicyManager.ImageDeletionPolicy.Direct.toString()); delMsg.setForceDelete(true); bus.makeTargetServiceIdByResourceUuid(delMsg, ImageConstant.SERVICE_ID, uuid); bus.send(delMsg); @@ -1035,7 +1035,7 @@ public void rollback(FlowRollback trigger, Map data) { for (String uuid : newVolumeUuids) { ImageDeletionMsg delMsg = new ImageDeletionMsg(); delMsg.setImageUuid(uuid); - delMsg.setDeletionPolicy(VolumeDeletionPolicyManager.VolumeDeletionPolicy.Direct.toString()); + delMsg.setDeletionPolicy(ImageDeletionPolicyManager.ImageDeletionPolicy.Direct.toString()); delMsg.setForceDelete(true); bus.makeTargetServiceIdByResourceUuid(delMsg, ImageConstant.SERVICE_ID, uuid); bus.send(delMsg); @@ -1462,7 +1462,6 @@ private static ImageBackupStorageRefVO copyImageBackupStorageRefVO(ImageBackupSt } ImageBackupStorageRefVO copy = new ImageBackupStorageRefVO(); - copy.setImageUuid(original.getImageUuid()); copy.setBackupStorageUuid(original.getBackupStorageUuid()); copy.setStatus(original.getStatus()); copy.setInstallPath(original.getInstallPath()); diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java index 5c7247bda6b..c7b9181da1b 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java @@ -82,15 +82,15 @@ public class FlatUserdataBackend implements UserdataBackend, KVMHostConnectExten public static final String RELEASE_USER_DATA = "/flatnetworkprovider/userdata/release"; public static final String CLEANUP_USER_DATA = "/flatnetworkprovider/userdata/cleanup"; - private String getVmNicMacAddressByVmInstanceId(String vmInstanceId) { + private String getVmNicMacAddressByVmInstanceUuid(String vmInstanceUuid) { String sql = "SELECT nic.mac " + "FROM VmInstanceVO vm " + "JOIN VmNicVO nic ON vm.uuid = nic.vmInstanceUuid " + - "WHERE vm.uuid = :vmInstanceId " + + "WHERE vm.uuid = :vmInstanceUuid " + "AND nic.l3NetworkUuid = vm.defaultL3NetworkUuid"; TypedQuery q = dbf.getEntityManager().createQuery(sql, String.class); - q.setParameter("vmInstanceId", vmInstanceId); + q.setParameter("vmInstanceUuid", vmInstanceUuid); List resultList = q.getResultList(); if (resultList.isEmpty()) { @@ -100,8 +100,8 @@ private String getVmNicMacAddressByVmInstanceId(String vmInstanceId) { } - private String getZoneNameByVmInstanceId(String vmInstanceId) { - VmInstanceVO vmInstance = dbf.findByUuid(vmInstanceId, VmInstanceVO.class); + private String getZoneNameByVmInstanceUuid(String vmInstanceUuid) { + VmInstanceVO vmInstance = dbf.findByUuid(vmInstanceUuid, VmInstanceVO.class); if (vmInstance == null || vmInstance.getZoneUuid() == null) { return null; } @@ -116,13 +116,13 @@ private String getZoneNameByVmInstanceId(String vmInstanceId) { return zone.getName(); } - private String getDnsServersIp(String vmInstanceId) { + private String getDnsServersIpFromVm(String vmInstanceUuid) { String sql = "SELECT dns.dns FROM VmInstanceVO AS v " + "JOIN L3NetworkDnsVO AS dns ON v.defaultL3NetworkUuid = dns.l3NetworkUuid " + - "WHERE v.uuid = :vmInstanceId"; + "WHERE v.uuid = :vmInstanceUuid"; TypedQuery query = dbf.getEntityManager().createQuery(sql, String.class); - query.setParameter("vmInstanceId", vmInstanceId); + query.setParameter("vmInstanceUuid", vmInstanceUuid); List dnsServers = query.getResultList(); if (dnsServers.isEmpty()) { return null; @@ -165,13 +165,13 @@ private String getVpcIdByVmInstanceUuid(String vmInstanceUuid) { private List getNetworkInterfaceDetails(String vmInstanceUuid) { String sql = "select DISTINCT nic.mac, nic.ip, nic.netmask, nic.gateway, ipr.networkCidr " + "from VmNicVO nic " + - "join IpRangeVO ipr on nic.l3NetworkUuid = ipr.l3NetworkUuid " + // 加入对IpRangeVO的JOIN + "join IpRangeVO ipr on nic.l3NetworkUuid = ipr.l3NetworkUuid " + "where nic.vmInstanceUuid = :vmInstanceUuid " + - "and nic.ipVersion = :ipversion "; + "and nic.ipVersion = :ipVersion "; TypedQuery q = dbf.getEntityManager().createQuery(sql, Tuple.class); q.setParameter("vmInstanceUuid", vmInstanceUuid); - q.setParameter("ipversion", IPv6Constants.IPv4); + q.setParameter("ipVersion", IPv6Constants.IPv4); List ts = q.getResultList(); List networkInterfaceDetailsList = new ArrayList<>(); @@ -233,7 +233,7 @@ private Map getVmIpL3Uuid(List vmUuids) { "NetworkServiceProviderVO pro, UsedIpVO ip where " + " vm.uuid = nic.vmInstanceUuid and vm.uuid in (:uuids)" + " and nic.uuid = ip.vmNicUuid " + - " and ip.l3NetworkUuid = vm.defaultL3NetworkUuid and ip.ipVersion = :ipversion" + + " and ip.l3NetworkUuid = vm.defaultL3NetworkUuid and ip.ipVersion = :ipVersion" + " and ref.networkServiceProviderUuid = pro.uuid" + " and ref.l3NetworkUuid = vm.defaultL3NetworkUuid" + " and pro.type = :proType"; @@ -242,7 +242,7 @@ private Map getVmIpL3Uuid(List vmUuids) { q.setParameter("uuids", vmUuids); q.setParameter("proType", FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING); /* current only ipv4 has userdata */ - q.setParameter("ipversion", IPv6Constants.IPv4); + q.setParameter("ipVersion", IPv6Constants.IPv4); List ts = q.getResultList(); Map ret = new HashMap(); @@ -298,9 +298,9 @@ private List getUserData() { MetadataTO mto = new MetadataTO(); mto.vmUuid = vmuuid; mto.vmHostname = VmSystemTags.HOSTNAME.getTokenByResourceUuid(vmuuid, VmSystemTags.HOSTNAME_TOKEN); - mto.regionName = getZoneNameByVmInstanceId(vmuuid); - mto.mac = getVmNicMacAddressByVmInstanceId(vmuuid); - mto.dnsServersIp = getDnsServersIp(vmuuid); + mto.regionName = getZoneNameByVmInstanceUuid(vmuuid); + mto.mac = getVmNicMacAddressByVmInstanceUuid(vmuuid); + mto.dnsServersIp = getDnsServersIpFromVm(vmuuid); mto.vpcId = getVpcIdByVmInstanceUuid(vmuuid); to.metadata = mto; @@ -779,9 +779,9 @@ public void run(final FlowTrigger trigger, Map data) { MetadataTO to = new MetadataTO(); to.vmUuid = struct.getVmUuid(); to.vmHostname = VmSystemTags.HOSTNAME.getTokenByResourceUuid(struct.getVmUuid(), VmSystemTags.HOSTNAME_TOKEN); - to.regionName = getZoneNameByVmInstanceId(struct.getVmUuid()); + to.regionName = getZoneNameByVmInstanceUuid(struct.getVmUuid()); to.mac = destNic.getMac(); - to.dnsServersIp = getDnsServersIp(struct.getVmUuid()); + to.dnsServersIp = getDnsServersIpFromVm(struct.getVmUuid()); to.vpcId = getVpcIdByVmInstanceUuid(struct.getVmUuid()); UserdataTO uto = new UserdataTO(); uto.metadata = to; diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index c55393c0123..a48db1bdab6 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -160,13 +160,13 @@ public class SourceClassMap { put("org.zstack.externalbackup.zbox.ZBoxVmBackupInfo", "org.zstack.sdk.ZBoxVmBackupInfo"); put("org.zstack.externalbackup.zbox.ZBoxVolumeBackupInfo", "org.zstack.sdk.ZBoxVolumeBackupInfo"); put("org.zstack.faulttolerance.entity.FaultToleranceVmGroupInventory", "org.zstack.sdk.FaultToleranceVmGroupInventory"); - put("org.zstack.guesttools.AliyunInvocationRecordData", "org.zstack.sdk.AliyunInvocationRecordData"); - put("org.zstack.guesttools.AliyunInvocationRecordDetailData", "org.zstack.sdk.AliyunInvocationRecordDetailData"); put("org.zstack.guesttools.GuestToolsInventory", "org.zstack.sdk.GuestToolsInventory"); put("org.zstack.guesttools.GuestToolsStateInventory", "org.zstack.sdk.GuestToolsStateInventory"); put("org.zstack.guesttools.GuestVmScriptExecutedRecordDetailInventory", "org.zstack.sdk.GuestVmScriptExecutedRecordDetailInventory"); put("org.zstack.guesttools.GuestVmScriptExecutedRecordInventory", "org.zstack.sdk.GuestVmScriptExecutedRecordInventory"); put("org.zstack.guesttools.GuestVmScriptInventory", "org.zstack.sdk.GuestVmScriptInventory"); + put("org.zstack.guesttools.InvocationRecord", "org.zstack.sdk.InvocationRecord"); + put("org.zstack.guesttools.InvocationRecordDetail", "org.zstack.sdk.InvocationRecordDetail"); put("org.zstack.ha.HaStrategyConditionInventory", "org.zstack.sdk.HaStrategyConditionInventory"); put("org.zstack.header.acl.AccessControlListEntryInventory", "org.zstack.sdk.AccessControlListEntryInventory"); put("org.zstack.header.acl.AccessControlListInventory", "org.zstack.sdk.AccessControlListInventory"); @@ -854,8 +854,6 @@ public class SourceClassMap { put("org.zstack.sdk.AliyunEbsBackupStorageInventory", "org.zstack.header.aliyun.ebs.AliyunEbsBackupStorageInventory"); put("org.zstack.sdk.AliyunEbsPrimaryStorageInventory", "org.zstack.header.aliyun.ebs.AliyunEbsPrimaryStorageInventory"); put("org.zstack.sdk.AliyunErrorCode", "org.zstack.header.aliyun.errorCode.AliyunErrorCode"); - put("org.zstack.sdk.AliyunInvocationRecordData", "org.zstack.guesttools.AliyunInvocationRecordData"); - put("org.zstack.sdk.AliyunInvocationRecordDetailData", "org.zstack.guesttools.AliyunInvocationRecordDetailData"); put("org.zstack.sdk.AliyunNasAccessGroupInventory", "org.zstack.aliyun.nas.filesystem.AliyunNasAccessGroupInventory"); put("org.zstack.sdk.AliyunNasAccessGroupProperty", "org.zstack.aliyun.nas.message.AliyunNasAccessGroupProperty"); put("org.zstack.sdk.AliyunNasAccessRuleInventory", "org.zstack.aliyun.nas.filesystem.AliyunNasAccessRuleInventory"); @@ -1085,6 +1083,8 @@ public class SourceClassMap { put("org.zstack.sdk.InputType", "org.zstack.abstraction.OptionType$InputType"); put("org.zstack.sdk.InstallPathRecycleInventory", "org.zstack.header.core.trash.InstallPathRecycleInventory"); put("org.zstack.sdk.InstanceOfferingInventory", "org.zstack.header.configuration.InstanceOfferingInventory"); + put("org.zstack.sdk.InvocationRecord", "org.zstack.guesttools.InvocationRecord"); + put("org.zstack.sdk.InvocationRecordDetail", "org.zstack.guesttools.InvocationRecordDetail"); put("org.zstack.sdk.IpCapacityData", "org.zstack.header.network.l3.datatypes.IpCapacityData"); put("org.zstack.sdk.IpRangeInventory", "org.zstack.header.network.l3.IpRangeInventory"); put("org.zstack.sdk.IpRangeType", "org.zstack.header.network.l3.IpRangeType"); diff --git a/sdk/src/main/java/org/zstack/sdk/AliyunInvocationRecordDetailData.java b/sdk/src/main/java/org/zstack/sdk/AliyunInvocationRecordDetailData.java deleted file mode 100644 index 21ef6d4029f..00000000000 --- a/sdk/src/main/java/org/zstack/sdk/AliyunInvocationRecordDetailData.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.zstack.sdk; - - - -public class AliyunInvocationRecordDetailData { - - public java.lang.String InstanceId; - public void setInstanceId(java.lang.String InstanceId) { - this.InstanceId = InstanceId; - } - public java.lang.String getInstanceId() { - return this.InstanceId; - } - - public java.lang.String InvocationStatus; - public void setInvocationStatus(java.lang.String InvocationStatus) { - this.InvocationStatus = InvocationStatus; - } - public java.lang.String getInvocationStatus() { - return this.InvocationStatus; - } - - public java.sql.Timestamp CreationTime; - public void setCreationTime(java.sql.Timestamp CreationTime) { - this.CreationTime = CreationTime; - } - public java.sql.Timestamp getCreationTime() { - return this.CreationTime; - } - - public java.sql.Timestamp FinishTime; - public void setFinishTime(java.sql.Timestamp FinishTime) { - this.FinishTime = FinishTime; - } - public java.sql.Timestamp getFinishTime() { - return this.FinishTime; - } - - public java.lang.String Output; - public void setOutput(java.lang.String Output) { - this.Output = Output; - } - public java.lang.String getOutput() { - return this.Output; - } - -} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageAction.java b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageAction.java index f1c76b38c61..36958dbf1ee 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageAction.java @@ -35,7 +35,7 @@ public Result throwExceptionIfError() { public java.lang.String description; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.util.List dateVolumeTemplateUuids; + public java.util.List dataVolumeTemplateUuids; @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotAction.java b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotAction.java index 6078f943ac7..35f84d7b83e 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotAction.java @@ -35,7 +35,7 @@ public Result throwExceptionIfError() { public java.lang.String description; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.util.List dateVolumeSnapshotUuids; + public java.util.List dataVolumeSnapshotUuids; @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupAction.java b/sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupAction.java index c95cc15508a..721a4fd529a 100644 --- a/sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupAction.java @@ -25,7 +25,7 @@ public Result throwExceptionIfError() { } } - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; @Param(required = false) diff --git a/sdk/src/main/java/org/zstack/sdk/GetAliyunInvocationsAction.java b/sdk/src/main/java/org/zstack/sdk/GetInvocationRecordsAction.java similarity index 88% rename from sdk/src/main/java/org/zstack/sdk/GetAliyunInvocationsAction.java rename to sdk/src/main/java/org/zstack/sdk/GetInvocationRecordsAction.java index c6412a082c2..750279d5f0d 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetAliyunInvocationsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetInvocationRecordsAction.java @@ -4,7 +4,7 @@ import java.util.Map; import org.zstack.sdk.*; -public class GetAliyunInvocationsAction extends AbstractAction { +public class GetInvocationRecordsAction extends AbstractAction { private static final HashMap parameterMap = new HashMap<>(); @@ -12,7 +12,7 @@ public class GetAliyunInvocationsAction extends AbstractAction { public static class Result { public ErrorCode error; - public org.zstack.sdk.GetAliyunInvocationsResult value; + public org.zstack.sdk.GetInvocationRecordsResult value; public Result throwExceptionIfError() { if (error != null) { @@ -66,8 +66,8 @@ private Result makeResult(ApiResult res) { return ret; } - org.zstack.sdk.GetAliyunInvocationsResult value = res.getResult(org.zstack.sdk.GetAliyunInvocationsResult.class); - ret.value = value == null ? new org.zstack.sdk.GetAliyunInvocationsResult() : value; + org.zstack.sdk.GetInvocationRecordsResult value = res.getResult(org.zstack.sdk.GetInvocationRecordsResult.class); + ret.value = value == null ? new org.zstack.sdk.GetInvocationRecordsResult() : value; return ret; } diff --git a/sdk/src/main/java/org/zstack/sdk/GetAliyunInvocationsResult.java b/sdk/src/main/java/org/zstack/sdk/GetInvocationRecordsResult.java similarity index 91% rename from sdk/src/main/java/org/zstack/sdk/GetAliyunInvocationsResult.java rename to sdk/src/main/java/org/zstack/sdk/GetInvocationRecordsResult.java index 23357b8013e..40a347bba53 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetAliyunInvocationsResult.java +++ b/sdk/src/main/java/org/zstack/sdk/GetInvocationRecordsResult.java @@ -2,7 +2,7 @@ -public class GetAliyunInvocationsResult { +public class GetInvocationRecordsResult { public java.util.List inventories; public void setInventories(java.util.List inventories) { this.inventories = inventories; diff --git a/sdk/src/main/java/org/zstack/sdk/AliyunInvocationRecordData.java b/sdk/src/main/java/org/zstack/sdk/InvocationRecord.java similarity index 98% rename from sdk/src/main/java/org/zstack/sdk/AliyunInvocationRecordData.java rename to sdk/src/main/java/org/zstack/sdk/InvocationRecord.java index 5fbd8341f87..9b760c04bd5 100644 --- a/sdk/src/main/java/org/zstack/sdk/AliyunInvocationRecordData.java +++ b/sdk/src/main/java/org/zstack/sdk/InvocationRecord.java @@ -2,7 +2,7 @@ -public class AliyunInvocationRecordData { +public class InvocationRecord { public java.sql.Timestamp startTime; public void setStartTime(java.sql.Timestamp startTime) { diff --git a/sdk/src/main/java/org/zstack/sdk/InvocationRecordDetail.java b/sdk/src/main/java/org/zstack/sdk/InvocationRecordDetail.java new file mode 100644 index 00000000000..665b3015aa6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/InvocationRecordDetail.java @@ -0,0 +1,47 @@ +package org.zstack.sdk; + + + +public class InvocationRecordDetail { + + public java.lang.String instanceId; + public void setInstanceId(java.lang.String instanceId) { + this.instanceId = instanceId; + } + public java.lang.String getInstanceId() { + return this.instanceId; + } + + public java.lang.String invocationStatus; + public void setInvocationStatus(java.lang.String invocationStatus) { + this.invocationStatus = invocationStatus; + } + public java.lang.String getInvocationStatus() { + return this.invocationStatus; + } + + public java.sql.Timestamp creationTime; + public void setCreationTime(java.sql.Timestamp creationTime) { + this.creationTime = creationTime; + } + public java.sql.Timestamp getCreationTime() { + return this.creationTime; + } + + public java.sql.Timestamp finishTime; + public void setFinishTime(java.sql.Timestamp finishTime) { + this.finishTime = finishTime; + } + public java.sql.Timestamp getFinishTime() { + return this.finishTime; + } + + public java.lang.String output; + public void setOutput(java.lang.String output) { + this.output = output; + } + public java.lang.String getOutput() { + return this.output; + } + +} diff --git a/storage/src/main/java/org/zstack/storage/backup/BackupStorageBase.java b/storage/src/main/java/org/zstack/storage/backup/BackupStorageBase.java index 2fafa766f4b..ca9b35898fc 100755 --- a/storage/src/main/java/org/zstack/storage/backup/BackupStorageBase.java +++ b/storage/src/main/java/org/zstack/storage/backup/BackupStorageBase.java @@ -14,6 +14,7 @@ import org.zstack.core.cloudbus.EventFacade; import org.zstack.core.config.GlobalConfigFacade; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; import org.zstack.core.db.SQL; import org.zstack.core.db.TransactionalCallback; import org.zstack.core.errorcode.ErrorFacade; @@ -33,9 +34,7 @@ import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.errorcode.SysErrors; -import org.zstack.header.image.CancelDownloadImageMsg; -import org.zstack.header.image.ImageConstant; -import org.zstack.header.image.ImageVO; +import org.zstack.header.image.*; import org.zstack.header.message.APIDeleteMessage; import org.zstack.header.message.APIMessage; import org.zstack.header.message.Message; @@ -51,6 +50,7 @@ import javax.persistence.LockModeType; import javax.persistence.Query; +import javax.persistence.TypedQuery; import java.net.URISyntaxException; import java.util.*; @@ -324,9 +324,42 @@ private void handleBase(CancelDownloadImageMsg msg) { } private void handleBase(DeleteBitsOnBackupStorageMsg msg) { - checkState(msg); - checkStatus(msg); - handle(msg); + thdf.chainSubmit(new ChainTask(msg) { + @Override + public String getSyncSignature() { + return String.format("delete-%s-on-backup-storage-%s", msg.getInstallPath(), msg.getBackupStorageUuid()); + } + + @Override + public void run(SyncTaskChain chain) { + checkState(msg); + checkStatus(msg); + + if (!bitsCanDelete(msg.getInstallPath(), msg.getBackupStorageUuid())) { + final DeleteBitsOnBackupStorageReply reply = new DeleteBitsOnBackupStorageReply(); + logger.debug(String.format("cannot delete %s on backup storage %s because it is still referenced by " + + "other images", msg.getInstallPath(), msg.getBackupStorageUuid())); + + bus.reply(msg, reply); + chain.next(); + return; + } + + handle(msg); + chain.next(); + } + + @Override + public String getName() { + return String.format("delete-image-%s-on-backup-storage-%s", msg.getInstallPath(), msg.getBackupStorageUuid()); + } + }); + } + + private boolean bitsCanDelete(String installPath, String bsUuid) { + return !Q.New(ImageBackupStorageRefVO.class) + .eq(ImageBackupStorageRefVO_.installPath, installPath) + .eq(ImageBackupStorageRefVO_.backupStorageUuid, bsUuid).isExists(); } @Transactional diff --git a/test/src/test/groovy/org/zstack/test/integration/image/ImageGroupOperationsCase.groovy b/test/src/test/groovy/org/zstack/test/integration/image/ImageGroupOperationsCase.groovy index c49bf4a5a13..7c27df0be61 100644 --- a/test/src/test/groovy/org/zstack/test/integration/image/ImageGroupOperationsCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/image/ImageGroupOperationsCase.groovy @@ -2,15 +2,15 @@ package org.zstack.test.integration.image import org.zstack.core.db.DatabaseFacade import org.zstack.core.db.Q +import org.zstack.header.image.ImageBackupStorageRefVO +import org.zstack.header.image.ImageDeletionPolicyManager import org.zstack.header.image.ImageGroupRefVO -import org.zstack.header.image.ImageGroupRefVO_ import org.zstack.header.image.ImageGroupVO -import org.zstack.header.image.ImageGroupVO_ import org.zstack.header.image.ImageVO -import org.zstack.header.image.ImageVO_ import org.zstack.header.vm.VmInstanceState import org.zstack.header.vm.VmInstanceVO import org.zstack.header.vm.VmInstanceVO_ +import org.zstack.image.ImageGlobalConfig import org.zstack.sdk.DiskOfferingInventory import org.zstack.sdk.HostInventory import org.zstack.sdk.ImageInventory @@ -203,6 +203,7 @@ class ImageGroupOperationsCase extends SubCase { retryInSecs { assert Q.New(ImageGroupVO.class).count() == 1 assert Q.New(ImageGroupRefVO.class).count() == 2 + assert Q.New(ImageVO.class).count() == 7 } expungeImageGroup { @@ -217,7 +218,7 @@ class ImageGroupOperationsCase extends SubCase { ImageGroupInventory group2 = createImageGroupFromImage { rootVolumeTemplateUuid = rimage.uuid - dateVolumeTemplateUuids = [dimage.uuid] + dataVolumeTemplateUuids = [dimage.uuid] name = "imageGroup2" } as ImageGroupInventory @@ -231,6 +232,7 @@ class ImageGroupOperationsCase extends SubCase { retryInSecs { assert Q.New(ImageGroupVO.class).count() == 1 assert Q.New(ImageGroupRefVO.class).count() == 2 + assert Q.New(ImageBackupStorageRefVO.class).count() == 5 assert Q.New(ImageVO.class).count() == 5 } @@ -239,9 +241,21 @@ class ImageGroupOperationsCase extends SubCase { } as ImageInventory retryInSecs { + assert Q.New(ImageBackupStorageRefVO.class).count() == 6 assert Q.New(ImageVO.class).count() == 6 } + // Simulate the policy for deleting an image from an image group. + ImageGlobalConfig.DELETION_POLICY.updateValue(ImageDeletionPolicyManager.ImageDeletionPolicy.Direct.toString()) + deleteImage { + uuid = cimage.uuid + } + + retryInSecs { + assert Q.New(ImageBackupStorageRefVO.class).count() == 5 + assert Q.New(ImageVO.class).count() == 5 + } + expungeImageGroup { uuid = group2.uuid } @@ -249,16 +263,12 @@ class ImageGroupOperationsCase extends SubCase { retryInSecs { assert Q.New(ImageGroupVO.class).count() == 0 assert Q.New(ImageGroupRefVO.class).count() == 0 - assert Q.New(ImageVO.class).count() == 5 - } - - deleteImage { - uuid = cimage.uuid + assert Q.New(ImageVO.class).count() == 3 } ImageGroupInventory group3 = createImageGroupFromSnapshot { rootVolumeSnapshotUuid = rsnap.uuid - dateVolumeSnapshotUuids = [dsnap.uuid] + dataVolumeSnapshotUuids = [dsnap.uuid] name = "imageGroup3" } as ImageGroupInventory @@ -272,7 +282,7 @@ class ImageGroupOperationsCase extends SubCase { retryInSecs { assert Q.New(ImageGroupVO.class).count() == 1 assert Q.New(ImageGroupRefVO.class).count() == 2 - assert Q.New(ImageVO.class).count() == 7 + assert Q.New(ImageVO.class).count() == 5 } expungeImageGroup { @@ -282,7 +292,7 @@ class ImageGroupOperationsCase extends SubCase { retryInSecs { assert Q.New(ImageGroupVO.class).count() == 0 assert Q.New(ImageGroupRefVO.class).count() == 0 - assert Q.New(ImageVO.class).count() == 5 + assert Q.New(ImageVO.class).count() == 3 } } diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index fc05ea23969..647860261a5 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -7442,6 +7442,33 @@ abstract class ApiHelper { } + def cloneImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CloneImageAction.class) Closure c) { + def a = new org.zstack.sdk.CloneImageAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def cloneModelService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CloneModelServiceAction.class) Closure c) { def a = new org.zstack.sdk.CloneModelServiceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -9601,31 +9628,6 @@ abstract class ApiHelper { } } - def cloneImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CloneImageAction.class) Closure c) { - def a = new org.zstack.sdk.CloneImageAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() - - - if (System.getProperty("apipath") != null) { - if (a.apiId == null) { - a.apiId = Platform.uuid - } - - def tracker = new ApiPathTracker(a.apiId) - def out = errorOut(a.call()) - def path = tracker.getApiPath() - if (!path.isEmpty()) { - Test.apiPaths[a.class.name] = path.join(" --->\n") - } - - return out - } else { - return errorOut(a.call()) - } - } def createImageGroupFromImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateImageGroupFromImageAction.class) Closure c) { def a = new org.zstack.sdk.CreateImageGroupFromImageAction() @@ -20130,8 +20132,8 @@ abstract class ApiHelper { } - def getAliyunInvocations(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAliyunInvocationsAction.class) Closure c) { - def a = new org.zstack.sdk.GetAliyunInvocationsAction() + def getAliyunNasAccessGroupRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAliyunNasAccessGroupRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.GetAliyunNasAccessGroupRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20157,8 +20159,8 @@ abstract class ApiHelper { } - def getAliyunNasAccessGroupRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAliyunNasAccessGroupRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.GetAliyunNasAccessGroupRemoteAction() + def getAliyunNasFileSystemRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAliyunNasFileSystemRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.GetAliyunNasFileSystemRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20184,8 +20186,8 @@ abstract class ApiHelper { } - def getAliyunNasFileSystemRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAliyunNasFileSystemRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.GetAliyunNasFileSystemRemoteAction() + def getAliyunNasMountTargetRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAliyunNasMountTargetRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.GetAliyunNasMountTargetRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20211,8 +20213,8 @@ abstract class ApiHelper { } - def getAliyunNasMountTargetRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAliyunNasMountTargetRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.GetAliyunNasMountTargetRemoteAction() + def getAppBuildSystemCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAppBuildSystemCapacityAction.class) Closure c) { + def a = new org.zstack.sdk.GetAppBuildSystemCapacityAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20238,8 +20240,8 @@ abstract class ApiHelper { } - def getAppBuildSystemCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAppBuildSystemCapacityAction.class) Closure c) { - def a = new org.zstack.sdk.GetAppBuildSystemCapacityAction() + def getAttachablePublicL3ForVRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAttachablePublicL3ForVRouterAction.class) Closure c) { + def a = new org.zstack.sdk.GetAttachablePublicL3ForVRouterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20265,8 +20267,8 @@ abstract class ApiHelper { } - def getAttachablePublicL3ForVRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAttachablePublicL3ForVRouterAction.class) Closure c) { - def a = new org.zstack.sdk.GetAttachablePublicL3ForVRouterAction() + def getAttachableVpcL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAttachableVpcL3NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.GetAttachableVpcL3NetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20292,8 +20294,8 @@ abstract class ApiHelper { } - def getAttachableVpcL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAttachableVpcL3NetworkAction.class) Closure c) { - def a = new org.zstack.sdk.GetAttachableVpcL3NetworkAction() + def getAvailableTriggers(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAvailableTriggersAction.class) Closure c) { + def a = new org.zstack.sdk.GetAvailableTriggersAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20319,8 +20321,8 @@ abstract class ApiHelper { } - def getAvailableTriggers(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAvailableTriggersAction.class) Closure c) { - def a = new org.zstack.sdk.GetAvailableTriggersAction() + def getAvailableVpcL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAvailableVpcL3NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.GetAvailableVpcL3NetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22614,6 +22616,33 @@ abstract class ApiHelper { } + def getInvocationRecords(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetInvocationRecordsAction.class) Closure c) { + def a = new org.zstack.sdk.GetInvocationRecordsAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def getIpAddressCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetIpAddressCapacityAction.class) Closure c) { def a = new org.zstack.sdk.GetIpAddressCapacityAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -27750,20 +27779,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -41361,20 +41390,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -41388,7 +41417,7 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { From 8930f363ce37537b90340619c40b30ad4f6fc626 Mon Sep 17 00:00:00 2001 From: "haoyu.ding" Date: Thu, 28 Aug 2025 15:27:03 +0800 Subject: [PATCH 451/737] [securityGroup]: Refresh the security group rules on all relevant hosts Resolves: ZSTAC-76988 Change-Id: I646d6b647a6d7868736f796c6472687a6678616f --- .../SecurityGroupManagerImpl.java | 12 ++ .../SecurityGroupNetworkServiceExtension.java | 169 ++++++++++++++++-- ...reateSystemtagWithSecurityGroupCase.groovy | 31 ++-- 3 files changed, 186 insertions(+), 26 deletions(-) diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java index 8fbc1e0181d..b6c6d8719f4 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java @@ -1032,6 +1032,18 @@ private void handle(RefreshSecurityGroupRulesOnVmMsg msg) { q.add(VmNicSecurityGroupRefVO_.vmInstanceUuid, Op.EQ, msg.getVmInstanceUuid()); nicUuids = q.listValue(); } + if (msg.getHostUuid() == null ||msg.getHostUuid().isEmpty()) { + String VmUuid = Q.New(VmNicVO.class).in(VmNicVO_.uuid, nicUuids) + .select(VmNicVO_.vmInstanceUuid) + .findValue(); + + String HostUuid = Q.New(VmInstanceVO.class) + .eq(VmInstanceVO_.uuid, VmUuid) + .select(VmInstanceVO_.hostUuid) + .findValue(); + + msg.setHostUuid(HostUuid); + } if (nicUuids.isEmpty()) { checkDefaultRulesOnHost(msg.getHostUuid()); diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupNetworkServiceExtension.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupNetworkServiceExtension.java index a791b3d76f5..e8ab05e84c3 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupNetworkServiceExtension.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupNetworkServiceExtension.java @@ -9,7 +9,13 @@ import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.db.Q; import org.zstack.core.db.SQL; +import org.zstack.core.asyncbatch.While; +import org.zstack.header.core.WhileDoneCompletion; import org.zstack.header.core.Completion; +import org.zstack.core.workflow.FlowChainBuilder; +import org.zstack.header.core.workflow.*; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.message.MessageReply; import org.zstack.header.network.l3.L3NetworkInventory; @@ -24,6 +30,7 @@ import java.util.*; import java.util.stream.Collectors; import javax.persistence.Query; +import static org.zstack.core.Platform.operr; /** */ @@ -116,31 +123,161 @@ private List syncSystemTagToVmNicSecurityGroup(String vmUuid) { @Override public void applyNetworkService(VmInstanceSpec servedVm, Map data, final Completion completion) { - List sgUuids = syncSystemTagToVmNicSecurityGroup(servedVm.getVmInventory().getUuid()); + syncSystemTagToVmNicSecurityGroup(servedVm.getVmInventory().getUuid()); - Map> map = getNetworkServiceProviderMap(SecurityGroupProviderFactory.networkServiceType, - VmNicSpec.getL3NetworkInventoryOfSpec(servedVm.getL3Networks())); + Map> map = getNetworkServiceProviderMap( + SecurityGroupProviderFactory.networkServiceType, + VmNicSpec.getL3NetworkInventoryOfSpec(servedVm.getL3Networks()) + ); if (map.isEmpty()) { completion.success(); return; } - RefreshSecurityGroupRulesOnVmMsg msg = new RefreshSecurityGroupRulesOnVmMsg(); - msg.setVmInstanceUuid(servedVm.getVmInventory().getUuid()); - msg.setHostUuid(servedVm.getDestHost().getUuid()); - msg.setSgUuids(sgUuids); - msg.setOperation(servedVm.getCurrentVmOperation()); - bus.makeLocalServiceId(msg, SecurityGroupConstant.SERVICE_ID); - bus.send(msg, new CloudBusCallBack(completion) { + List destNics = servedVm.getDestNics(); + + List vmNicUuids = destNics.stream() + .map(VmNicInventory::getUuid) + .collect(Collectors.toList()); + + List sgUuids = Q.New(VmNicSecurityGroupRefVO.class) + .in(VmNicSecurityGroupRefVO_.vmNicUuid, vmNicUuids) + .select(VmNicSecurityGroupRefVO_.securityGroupUuid) + .listValues(); + + if (sgUuids == null || sgUuids.isEmpty()) { + logger.warn(String.format("No security groups found for vmNics: " + vmNicUuids)); + completion.success(); + return; + } + + Set allRelatedSgUuids = new HashSet<>(sgUuids); + + List remoteSGUuids = Q.New(SecurityGroupRuleVO.class) + .in(SecurityGroupRuleVO_.remoteSecurityGroupUuid, sgUuids) + .select(SecurityGroupRuleVO_.securityGroupUuid) + .listValues(); + + allRelatedSgUuids.addAll(remoteSGUuids); + + Set vmUuidsToRefresh = new HashSet<>(); + + vmUuidsToRefresh.add(servedVm.getVmInventory().getUuid()); + + List vmUuids = Q.New(VmNicSecurityGroupRefVO.class) + .in(VmNicSecurityGroupRefVO_.securityGroupUuid, new ArrayList<>(allRelatedSgUuids)) + .select(VmNicSecurityGroupRefVO_.vmInstanceUuid) + .listValues(); + + vmUuidsToRefresh.addAll(vmUuids); + + FlowChain schain = FlowChainBuilder.newSimpleFlowChain().setName(String.format("apply-security-group-to-vm-%s", servedVm.getVmInventory().getUuid())); + schain.allowEmptyFlow(); + + Flow applyToCurrentVmFlow = new Flow() { + String __name__ = "apply-security-group-rules-to-current-vm"; + @Override - public void run(MessageReply reply) { - if (reply.isSuccess()) { - completion.success(); - } else { - completion.fail(reply.getError()); + public void run(FlowTrigger trigger, Map data) { + logger.debug(String.format("Applying security group rules to current VM[uuid:%s]", servedVm.getVmInventory().getUuid())); + + RefreshSecurityGroupRulesOnVmMsg msg = new RefreshSecurityGroupRulesOnVmMsg(); + msg.setVmInstanceUuid(servedVm.getVmInventory().getUuid()); + msg.setHostUuid(servedVm.getDestHost().getUuid()); + msg.setSgUuids(sgUuids); + msg.setOperation(servedVm.getCurrentVmOperation()); + bus.makeLocalServiceId(msg, SecurityGroupConstant.SERVICE_ID); + + bus.send(msg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (reply.isSuccess()) { + trigger.next(); + } else { + trigger.fail(operr("Failed to apply security group rules to current VM[uuid:%s]", + servedVm.getVmInventory().getUuid()) + .causedBy(reply.getError())); + } + } + }); + } + + @Override + public void rollback(FlowRollback rollback, Map data) { + logger.debug(String.format("No rollback needed for applying security group rules to current VM[uuid:%s]", servedVm.getVmInventory().getUuid())); + rollback.rollback(); + } + }; + + schain.then(applyToCurrentVmFlow); + + Flow applyToOtherVmsFlow = new Flow() { + String __name__ = "apply-security-group-rules-to-other-vms"; + + @Override + public void run(FlowTrigger trigger, Map data) { + Set otherVmUuids = new HashSet<>(vmUuidsToRefresh); + otherVmUuids.remove(servedVm.getVmInventory().getUuid()); + + if (otherVmUuids.isEmpty()) { + trigger.next(); + return; } + + List errs = Collections.synchronizedList(new ArrayList<>()); + + logger.debug(String.format("Applying security group rules to %d other VMs: %s", otherVmUuids.size(), otherVmUuids)); + + new While<>(otherVmUuids) + .each((vmUuid, wcompl) -> { + RefreshSecurityGroupRulesOnVmMsg msg = new RefreshSecurityGroupRulesOnVmMsg(); + msg.setVmInstanceUuid(vmUuid); + bus.makeTargetServiceIdByResourceUuid(msg, SecurityGroupConstant.SERVICE_ID, vmUuid); + + bus.send(msg, new CloudBusCallBack(wcompl) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.warn(String.format("Failed to refresh security group rules for VM[uuid:%s]: %s", + vmUuid, reply.getError())); + errs.add(reply.getError()); + } + wcompl.done(); + } + }); + }) + .run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errs.isEmpty()) { + trigger.next(); + } else { + trigger.fail(operr("Failed to apply security group rules to some VMs")); + } + } + }); } - }); + + @Override + public void rollback(FlowRollback rollback, Map data) { + logger.debug("Rolling back security group application to other VMs... (no-op)"); + rollback.rollback(); + } + }; + + schain.then(applyToOtherVmsFlow); + + schain.error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode err, Map data) { + completion.fail(err); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).start(); } @Override diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/CreateSystemtagWithSecurityGroupCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/CreateSystemtagWithSecurityGroupCase.groovy index 48b96e35899..28d94f110b7 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/CreateSystemtagWithSecurityGroupCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/CreateSystemtagWithSecurityGroupCase.groovy @@ -44,8 +44,12 @@ class CreateSystemtagWithSecurityGroupCase extends SubCase { void testCreateVmWithSystemtag() { KVMAgentCommands.ApplySecurityGroupRuleCmd cmd = null + Set allCmds = [] as Set env.afterSimulator(KVMSecurityGroupBackend.SECURITY_GROUP_APPLY_RULE_PATH) { rsp, HttpEntity e -> cmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.ApplySecurityGroupRuleCmd.class) + if (cmd.vmNicTOs != null && !cmd.vmNicTOs.isEmpty()) { + allCmds << cmd + } return rsp } @@ -64,11 +68,12 @@ class CreateSystemtagWithSecurityGroupCase extends SubCase { assert refvos.get(0).priority == 1 retryInSecs { - assert cmd != null - assert cmd.vmNicTOs.get(0).vmNicUuid == vm1.vmNics[0].uuid + assert allCmds != null + assert allCmds.find { it.vmNicTOs.get(0).vmNicUuid == vm1.vmNics[0].uuid } } cmd = null + allCmds = [] vm2 = createVmInstance { name = "vm2" @@ -84,11 +89,12 @@ class CreateSystemtagWithSecurityGroupCase extends SubCase { assert refvos.find { it.securityGroupUuid == sg2.uuid }.priority == 2 retryInSecs { - assert cmd != null - assert cmd.vmNicTOs.get(0).vmNicUuid == vm2.vmNics[0].uuid + assert allCmds != null + assert allCmds.find { it.vmNicTOs.get(0).vmNicUuid == vm2.vmNics[0].uuid } } cmd = null + allCmds = [] createSystemTag { resourceType = VmInstanceVO.class.simpleName @@ -107,15 +113,19 @@ class CreateSystemtagWithSecurityGroupCase extends SubCase { assert refvos.find { it.securityGroupUuid == sg3.uuid }.priority == 3 retryInSecs { - assert cmd != null - assert cmd.vmNicTOs.get(0).vmNicUuid == vm2.vmNics[0].uuid + assert allCmds != null + assert allCmds.find { it.vmNicTOs.get(0).vmNicUuid == vm2.vmNics[0].uuid } } } void testAttachNicWithSystemtag() { KVMAgentCommands.ApplySecurityGroupRuleCmd cmd = null + Set allCmds = [] as Set env.afterSimulator(KVMSecurityGroupBackend.SECURITY_GROUP_APPLY_RULE_PATH) { rsp, HttpEntity e -> cmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.ApplySecurityGroupRuleCmd.class) + if (cmd.vmNicTOs != null && !cmd.vmNicTOs.isEmpty()) { + allCmds << cmd + } return rsp } @@ -133,11 +143,12 @@ class CreateSystemtagWithSecurityGroupCase extends SubCase { assert refvos.find { it.securityGroupUuid == sg3.uuid }.priority == 1 retryInSecs { - assert cmd != null - assert cmd.vmNicTOs.get(0).vmNicUuid == vm3.vmNics[0].uuid + assert allCmds != null + assert allCmds.find { it.vmNicTOs.get(0).vmNicUuid == vm3.vmNics[0].uuid } } cmd = null + allCmds = [] attachSecurityGroupToL3Network { securityGroupUuid = sg3.uuid @@ -155,8 +166,8 @@ class CreateSystemtagWithSecurityGroupCase extends SubCase { assert refvos.find { it.securityGroupUuid == sg3.uuid }.priority == 1 retryInSecs { - assert cmd != null - assert cmd.vmNicTOs.size() == 2 + assert allCmds != null + assert allCmds.find { it.vmNicTOs.size() == 2 } } } From f581fa3ff8426f3f345135269f525c83c4a5458f Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Wed, 20 Aug 2025 17:51:23 +0800 Subject: [PATCH 452/737] [migration]: fix cannot to select the correct host before migration. correctly check the results of cpu function comparison to avoid determining cpu function mismatch in case of abnormalities. Resolves/Related: ZSTAC-65793 Change-Id: I61746a72726470677a697a6e6e75736b75696f72 --- .../host/CompareCpuFunctionOnHostReply.java | 18 ++++++++++++++++++ .../java/org/zstack/kvm/KVMAgentCommands.java | 18 ++++++++++++++++++ .../src/main/java/org/zstack/kvm/KVMHost.java | 18 +++++++++++------- 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/header/src/main/java/org/zstack/header/host/CompareCpuFunctionOnHostReply.java b/header/src/main/java/org/zstack/header/host/CompareCpuFunctionOnHostReply.java index 73f3fe8946e..402fa684bbb 100644 --- a/header/src/main/java/org/zstack/header/host/CompareCpuFunctionOnHostReply.java +++ b/header/src/main/java/org/zstack/header/host/CompareCpuFunctionOnHostReply.java @@ -6,4 +6,22 @@ * Created by LiangHanYu on 2021/8/13 16:32 */ public class CompareCpuFunctionOnHostReply extends MessageReply { + private boolean match; + private String compareError; + + public boolean isMatch() { + return match; + } + + public void setMatch(boolean match) { + this.match = match; + } + + public String getCompareError() { + return compareError; + } + + public void setCompareError(String compareError) { + this.compareError = compareError; + } } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index 11994db7105..3d54c0260d2 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -3886,6 +3886,24 @@ public void setCpuXml(String cpuXml) { } public static class VmCompareCpuFunctionResponse extends AgentResponse { + private boolean match = true; + private String compareError; + + public boolean isMatch() { + return match; + } + + public void setMatch(boolean match) { + this.match = match; + } + + public String getCompareError() { + return compareError; + } + + public void setCompareError(String compareError) { + this.compareError = compareError; + } } public static class MergeSnapshotRsp extends AgentResponse { diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 0c6accb4d2f..d70b462e2be 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -1500,14 +1500,12 @@ public void fail(ErrorCode errorCode) { } private void handle(CompareCpuFunctionOnHostMsg msg) { - CompareCpuFunctionOnHostReply reply = new CompareCpuFunctionOnHostReply(); - thdf.singleFlightSubmit(new SingleFlightTask(msg) .setSyncSignature(String.format("compare-host-%s-cpu-function-xml-on-host-%s", msg.getSrcHostUuid(), msg.getDstHostUuid())) - .run((com) -> compareCpuFunctionOnHost(msg, new ReturnValueCompletion(com) { + .run((com) -> compareCpuFunctionOnHost(msg, new ReturnValueCompletion(com) { @Override - public void success(CompareCpuFunctionOnHostReply returnValue) { - com.success(returnValue); + public void success(VmCompareCpuFunctionResponse resp) { + com.success(resp); } @Override @@ -1516,14 +1514,20 @@ public void fail(ErrorCode errorCode) { } })) .done(((result) -> { + CompareCpuFunctionOnHostReply reply = new CompareCpuFunctionOnHostReply(); if (!result.isSuccess()) { reply.setError(result.getErrorCode()); + bus.reply(msg, reply); + return; } + VmCompareCpuFunctionResponse resp = (VmCompareCpuFunctionResponse)result.getResult(); + reply.setMatch(resp.isMatch()); + reply.setCompareError(resp.getCompareError()); bus.reply(msg, reply); }))); } - private void compareCpuFunctionOnHost(final CompareCpuFunctionOnHostMsg msg, ReturnValueCompletion completion) { + private void compareCpuFunctionOnHost(final CompareCpuFunctionOnHostMsg msg, ReturnValueCompletion completion) { VmCompareCpuFunctionCmd cmd = new VmCompareCpuFunctionCmd(); cmd.setCpuXml(msg.getCpuXml()); restf.asyncJsonPost(compareCpuFunctionPath, cmd, new JsonAsyncRESTCallback(completion) { @@ -1533,7 +1537,7 @@ public void success(VmCompareCpuFunctionResponse ret) { completion.fail(operr(ret.getError())); return; } - completion.success(new CompareCpuFunctionOnHostReply()); + completion.success(ret); } @Override From 37ff0cee086e81c67f9b5cc96b7ac4b669860358 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Fri, 29 Aug 2025 13:34:01 +0800 Subject: [PATCH 453/737] [conf]: bump version to 5.3.36 Resolves: ZSTAC-74189 DBImpact Change-Id: I69616667716d74657861707477676b6774697961 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 0d1081b0fe6..4154392baad 100755 --- a/VERSION +++ b/VERSION @@ -1,3 +1,3 @@ MAJOR=5 -MINOR=4 -UPDATE=0 +MINOR=3 +UPDATE=36 From eff5871dda01f3ebc0853f4f2efd1ed42dfe11b3 Mon Sep 17 00:00:00 2001 From: lianghy Date: Thu, 19 Jun 2025 10:58:03 +0800 Subject: [PATCH 454/737] [conf]: bump version to 5.3.40 DBImpact Change-Id: I697362677268656163757879667a6b77686d6b78 --- VERSION | 2 +- conf/db/upgrade/V5.3.40__schema.sql | 0 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 conf/db/upgrade/V5.3.40__schema.sql diff --git a/VERSION b/VERSION index 4154392baad..5e37b24bb9b 100755 --- a/VERSION +++ b/VERSION @@ -1,3 +1,3 @@ MAJOR=5 MINOR=3 -UPDATE=36 +UPDATE=40 diff --git a/conf/db/upgrade/V5.3.40__schema.sql b/conf/db/upgrade/V5.3.40__schema.sql new file mode 100644 index 00000000000..e69de29bb2d From 6f1131c75b460e31feb013e38394ec3d5e27db1a Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Mon, 30 Jun 2025 18:25:18 +0800 Subject: [PATCH 455/737] [ceph]: ensure VM creation fails when integrity verification fails Resolves: ZSTAC-76067 Change-Id: I736e646e7573636c70676c74746d737760676d6d --- .../ceph/primary/CephPrimaryStorageBase.java | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java index b7ae52e1043..f88ba7904a4 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java @@ -2395,10 +2395,13 @@ public void fail(ErrorCode errorCode) { } }); - done(new FlowDoneHandler(completion) { + flow(new Flow() { + String __name__ = "persist-db"; + + ImageCacheVO cvo = new ImageCacheVO(); + @Override - public void handle(Map data) { - ImageCacheVO cvo = new ImageCacheVO(); + public void run(final FlowTrigger trigger, Map data) { cvo.setMd5sum("not calculated"); cvo.setSize(image.getInventory().getActualSize()); cvo.setInstallUrl(snapshotPath); @@ -2408,9 +2411,23 @@ public void handle(Map data) { cvo.setState(ImageCacheState.ready); cvo.setSize(actualSize); cvo = dbf.persistAndRefresh(cvo); + data.put(ImageCacheVO.class.getSimpleName(),cvo); + trigger.next(); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + dbf.remove(cvo); + trigger.rollback(); + } + }); - ImageCacheVO finalCvo = cvo; + flow(new NoRollbackFlow() { + String __name__ = "save-encryption-Integrity-after-create-image-cache"; + @Override + public void run(final FlowTrigger trigger, Map data) { + ImageCacheVO finalCvo = (ImageCacheVO) (data.get(ImageCacheVO.class.getSimpleName())); new While<>(pluginRgty.getExtensionList(AfterCreateImageCacheExtensionPoint.class)).each((ext, whileCompletion) -> { ext.saveEncryptAfterCreateImageCache(null, ImageCacheInventory.valueOf(finalCvo), new Completion(whileCompletion) { @Override @@ -2428,14 +2445,22 @@ public void fail(ErrorCode errorCode) { @Override public void done(ErrorCodeList errorCodeList) { if (!errorCodeList.getCauses().isEmpty()) { - logger.warn(String.format("failed to saveEncryptAfterCreateImageCache: %s", errorCodeList.getCauses().get(0))); + trigger.fail(operr(String.format("failed to saveEncryptAfterCreateImageCache: %s", errorCodeList.getCauses().get(0)))); + return; } - completion.success(finalCvo); + trigger.next(); } }); } }); + done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success((ImageCacheVO) (data.get(ImageCacheVO.class.getSimpleName()))); + } + }); + error(new FlowErrorHandler(completion) { @Override public void handle(ErrorCode errCode, Map data) { From 55b65a73b7c66456d491b6b1f6e9fa9242f8adab Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 19 May 2025 11:17:41 +0800 Subject: [PATCH 456/737] [sdk]: Update sdk Resolves: ZSTAC-74888 Change-Id: I736e646e7573636c70676c74746d73706f776d6d --- sdk/src/main/java/SourceClassMap.java | 2 + .../org/zstack/sdk/AddModelServiceAction.java | 9 +++ .../sdk/ModelServiceImageInventory.java | 63 +++++++++++++++++++ .../org/zstack/sdk/ModelServiceInventory.java | 8 +++ 4 files changed, 82 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/ModelServiceImageInventory.java diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 01c650c9d03..9bde31684f5 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -18,6 +18,7 @@ public class SourceClassMap { put("org.zstack.ai.entity.ModelEvaluationTaskInventory", "org.zstack.sdk.ModelEvaluationTaskInventory"); put("org.zstack.ai.entity.ModelInventory", "org.zstack.sdk.ModelInventory"); put("org.zstack.ai.entity.ModelServiceGroupDatasetRefInventory", "org.zstack.sdk.ModelServiceGroupDatasetRefInventory"); + put("org.zstack.ai.entity.ModelServiceImageInventory", "org.zstack.sdk.ModelServiceImageInventory"); put("org.zstack.ai.entity.ModelServiceInstanceGroupInventory", "org.zstack.sdk.ModelServiceInstanceGroupInventory"); put("org.zstack.ai.entity.ModelServiceInstanceInventory", "org.zstack.sdk.ModelServiceInstanceInventory"); put("org.zstack.ai.entity.ModelServiceInventory", "org.zstack.sdk.ModelServiceInventory"); @@ -1162,6 +1163,7 @@ public class SourceClassMap { put("org.zstack.sdk.ModelInventory", "org.zstack.ai.entity.ModelInventory"); put("org.zstack.sdk.ModelService", "org.zstack.ai.message.ModelService"); put("org.zstack.sdk.ModelServiceGroupDatasetRefInventory", "org.zstack.ai.entity.ModelServiceGroupDatasetRefInventory"); + put("org.zstack.sdk.ModelServiceImageInventory", "org.zstack.ai.entity.ModelServiceImageInventory"); put("org.zstack.sdk.ModelServiceInstanceGroupInventory", "org.zstack.ai.entity.ModelServiceInstanceGroupInventory"); put("org.zstack.sdk.ModelServiceInstanceInventory", "org.zstack.ai.entity.ModelServiceInstanceInventory"); put("org.zstack.sdk.ModelServiceInventory", "org.zstack.ai.entity.ModelServiceInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index 825c9aaa8dc..f4defd7c0ff 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -82,6 +82,15 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List modelUuids; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List gpuVendors; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List cpuArchitectures; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List architectureImages; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceImageInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceImageInventory.java new file mode 100644 index 00000000000..49445cca243 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceImageInventory.java @@ -0,0 +1,63 @@ +package org.zstack.sdk; + + + +public class ModelServiceImageInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String modelServiceUuid; + public void setModelServiceUuid(java.lang.String modelServiceUuid) { + this.modelServiceUuid = modelServiceUuid; + } + public java.lang.String getModelServiceUuid() { + return this.modelServiceUuid; + } + + public java.lang.String cpuArchitecture; + public void setCpuArchitecture(java.lang.String cpuArchitecture) { + this.cpuArchitecture = cpuArchitecture; + } + public java.lang.String getCpuArchitecture() { + return this.cpuArchitecture; + } + + public java.lang.String vmImageUuid; + public void setVmImageUuid(java.lang.String vmImageUuid) { + this.vmImageUuid = vmImageUuid; + } + public java.lang.String getVmImageUuid() { + return this.vmImageUuid; + } + + public java.lang.String dockerImage; + public void setDockerImage(java.lang.String dockerImage) { + this.dockerImage = dockerImage; + } + public java.lang.String getDockerImage() { + return this.dockerImage; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java index 542632293c1..fe1530416f8 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java @@ -172,6 +172,14 @@ public java.util.List getModelServiceRefs() { return this.modelServiceRefs; } + public java.util.List modelServiceImages; + public void setModelServiceImages(java.util.List modelServiceImages) { + this.modelServiceImages = modelServiceImages; + } + public java.util.List getModelServiceImages() { + return this.modelServiceImages; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; From 577d627475d51c417c6a130223ed15346d112cc5 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Mon, 19 May 2025 11:34:22 +0800 Subject: [PATCH 457/737] [conf]: Update schema to support cpu arch and gpu vendor DBImpact Resolves: ZSTAC-74888 Change-Id: I6c6f7369716f756b796b76796c707865736d7476 Signed-off-by: ye.zou --- conf/db/upgrade/V5.3.40__schema.sql | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/conf/db/upgrade/V5.3.40__schema.sql b/conf/db/upgrade/V5.3.40__schema.sql index e69de29bb2d..7e323b279d3 100644 --- a/conf/db/upgrade/V5.3.40__schema.sql +++ b/conf/db/upgrade/V5.3.40__schema.sql @@ -0,0 +1,14 @@ +CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceImageVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `modelServiceUuid` varchar(32) NOT NULL, + `cpuArchitecture` varchar(32) NOT NULL, + `vmImageUuid` varchar(32) NULL, + `dockerImage` varchar(255) NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`), + CONSTRAINT `fkModelServiceImageVOModelServiceVO` FOREIGN KEY (`modelServiceUuid`) REFERENCES `ModelServiceVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CALL ADD_COLUMN('ModelServiceVO', 'gpuVendors', 'varchar(255)', 1, 'NULL'); +CALL ADD_COLUMN('ModelServiceVO', 'cpuArchitectures', 'varchar(255)', 1, 'NULL'); \ No newline at end of file From 4bcd441eecaac44eef20487e7fa440deafd7c76d Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 19 May 2025 13:13:55 +0800 Subject: [PATCH 458/737] [sdk]: Update sdk Resolves: ZSTAC-74888 Change-Id: I61717176797a7065746b6a6c656d726a636d656f --- .../org/zstack/sdk/ModelServiceInventory.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java index fe1530416f8..6c8c9a8eb8f 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java @@ -164,6 +164,22 @@ public java.lang.String getStartCommand() { return this.startCommand; } + public java.lang.String cpuArchitectures; + public void setCpuArchitectures(java.lang.String cpuArchitectures) { + this.cpuArchitectures = cpuArchitectures; + } + public java.lang.String getCpuArchitectures() { + return this.cpuArchitectures; + } + + public java.lang.String gpuVendors; + public void setGpuVendors(java.lang.String gpuVendors) { + this.gpuVendors = gpuVendors; + } + public java.lang.String getGpuVendors() { + return this.gpuVendors; + } + public java.util.List modelServiceRefs; public void setModelServiceRefs(java.util.List modelServiceRefs) { this.modelServiceRefs = modelServiceRefs; From e8ef79ac170fe0fae5a2a49cb83724871e5d623a Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Mon, 19 May 2025 13:53:00 +0800 Subject: [PATCH 459/737] [conf]: Setup default cpu arch from vm image DBImpact Resolves: ZSTAC-74888 Change-Id: I78656d6e74777778656c79687179687a70787166 Signed-off-by: ye.zou --- conf/db/upgrade/V5.3.40__schema.sql | 42 ++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.3.40__schema.sql b/conf/db/upgrade/V5.3.40__schema.sql index 7e323b279d3..da1c726b06e 100644 --- a/conf/db/upgrade/V5.3.40__schema.sql +++ b/conf/db/upgrade/V5.3.40__schema.sql @@ -11,4 +11,44 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceImageVO` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CALL ADD_COLUMN('ModelServiceVO', 'gpuVendors', 'varchar(255)', 1, 'NULL'); -CALL ADD_COLUMN('ModelServiceVO', 'cpuArchitectures', 'varchar(255)', 1, 'NULL'); \ No newline at end of file +CALL ADD_COLUMN('ModelServiceVO', 'cpuArchitectures', 'varchar(255)', 1, 'NULL'); + +DROP PROCEDURE IF EXISTS update_model_service_cpu_arch; +DELIMITER $$ +CREATE PROCEDURE update_model_service_cpu_arch() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE service_uuid VARCHAR(32); + DECLARE vm_image_uuid VARCHAR(32); + DECLARE cpu_arch VARCHAR(32); + DECLARE img_cursor CURSOR FOR + SELECT ms.uuid, ms.vmImageUuid, img.architecture + FROM ModelServiceVO ms + JOIN ImageVO img ON ms.vmImageUuid = img.uuid + WHERE ms.vmImageUuid IS NOT NULL; + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + OPEN img_cursor; + + read_loop: LOOP + FETCH img_cursor INTO service_uuid, vm_image_uuid, cpu_arch; + IF done THEN + LEAVE read_loop; + END IF; + + UPDATE ModelServiceVO + SET cpuArchitectures = cpu_arch + WHERE uuid = service_uuid; + + IF NOT EXISTS (SELECT 1 FROM ModelServiceImageVO WHERE modelServiceUuid = service_uuid AND cpuArchitecture = cpu_arch) THEN + INSERT INTO ModelServiceImageVO (uuid, modelServiceUuid, cpuArchitecture, vmImageUuid, createDate, lastOpDate) + VALUES (UUID_SHORT(), service_uuid, cpu_arch, vm_image_uuid, NOW(), NOW()); + END IF; + END LOOP; + + CLOSE img_cursor; +END$$ +DELIMITER ; + +CALL update_model_service_cpu_arch(); +DROP PROCEDURE IF EXISTS update_model_service_cpu_arch; \ No newline at end of file From 305517832c24f997b089ff1aac20b9ec79045448 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 19 May 2025 14:01:57 +0800 Subject: [PATCH 460/737] [sdk]: Update sdk Resolves: ZSTAC-74888 Change-Id: I6f66747873636a66716d6a62706b6972786b7a78 --- .../java/org/zstack/sdk/UpdateModelServiceAction.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java index 3d580c21e78..f6c3a9948af 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java @@ -67,6 +67,15 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String framework; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List cpuArchitectures; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List gpuVendors; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List architectureImages; + @Param(required = false) public java.util.List systemTags; From 88c9dcfaf0eb77148115b528875e22ce06054c14 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Tue, 20 May 2025 09:52:34 +0800 Subject: [PATCH 461/737] [conf]: Add container backup storage to sql schema DBImpact Resolves: ZSTAC-74888 Change-Id: I6a6e776d6e677976736e616264767a726d7a786a Signed-off-by: ye.zou --- conf/db/upgrade/V5.3.40__schema.sql | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.3.40__schema.sql b/conf/db/upgrade/V5.3.40__schema.sql index da1c726b06e..5f5f2ff45e6 100644 --- a/conf/db/upgrade/V5.3.40__schema.sql +++ b/conf/db/upgrade/V5.3.40__schema.sql @@ -51,4 +51,13 @@ END$$ DELIMITER ; CALL update_model_service_cpu_arch(); -DROP PROCEDURE IF EXISTS update_model_service_cpu_arch; \ No newline at end of file +DROP PROCEDURE IF EXISTS update_model_service_cpu_arch; + +CREATE TABLE IF NOT EXISTS `zstack`.`ContainerBackupStorageVO` ( + `uuid` varchar(32) NOT NULL, + `endpointUuid` varchar(32) NOT NULL, + `id` bigint(20) unsigned DEFAULT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkContainerBackupStorageVOBackupStorageEO` FOREIGN KEY (`uuid`) REFERENCES `BackupStorageEO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkContainerBackupStorageVOContainerManagementEndpointVO` FOREIGN KEY (`endpointUuid`) REFERENCES `ContainerManagementEndpointVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file From 7f7561551822df5982afa8b95a218e54cdd5ec5f Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 20 May 2025 15:51:41 +0800 Subject: [PATCH 462/737] [sdk]: Update sdk Resolves: ZSTAC-74888 Change-Id: I6b7478646a6b71646a756565746b69797777717a --- sdk/src/main/java/SourceClassMap.java | 14 ++++++----- .../sdk/ContainerBackupStorageInventory.java | 23 +++++++++++++++++++ .../ContainerImageInventory.java | 2 +- .../ContainerImageTagInventory.java | 10 +++++++- .../ProjectRepositoryInventory.java | 2 +- test/src/test/resources/log4j2.xml | 2 ++ 6 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/ContainerBackupStorageInventory.java rename sdk/src/main/java/org/zstack/sdk/{iam2/container => }/ContainerImageInventory.java (96%) rename sdk/src/main/java/org/zstack/sdk/{iam2/container => }/ContainerImageTagInventory.java (84%) rename sdk/src/main/java/org/zstack/sdk/{iam2/container => }/ProjectRepositoryInventory.java (98%) diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 9bde31684f5..6f6b737591b 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -111,10 +111,14 @@ public class SourceClassMap { put("org.zstack.cloudformation.template.struct.ActionStruct", "org.zstack.sdk.ActionStruct"); put("org.zstack.cloudformation.template.struct.ResourceStruct", "org.zstack.sdk.ResourceStruct"); put("org.zstack.cloudformation.template.struct.ResourceType", "org.zstack.sdk.ResourceType"); + put("org.zstack.container.ContainerBackupStorageInventory", "org.zstack.sdk.ContainerBackupStorageInventory"); put("org.zstack.container.ContainerUsage", "org.zstack.sdk.ContainerUsage"); + put("org.zstack.container.entity.ContainerImageInventory", "org.zstack.sdk.ContainerImageInventory"); + put("org.zstack.container.entity.ContainerImageTagInventory", "org.zstack.sdk.ContainerImageTagInventory"); put("org.zstack.container.entity.ContainerManagementEndpointInventory", "org.zstack.sdk.ContainerManagementEndpointInventory"); put("org.zstack.container.entity.NativeClusterInventory", "org.zstack.sdk.NativeClusterInventory"); put("org.zstack.container.entity.NativeHostInventory", "org.zstack.sdk.NativeHostInventory"); + put("org.zstack.container.entity.ProjectRepositoryInventory", "org.zstack.sdk.ProjectRepositoryInventory"); put("org.zstack.core.config.GlobalConfigInventory", "org.zstack.sdk.GlobalConfigInventory"); put("org.zstack.core.config.GlobalConfigOptions", "org.zstack.sdk.GlobalConfigOptions"); put("org.zstack.core.config.GuestOsCharacterInventory", "org.zstack.sdk.GuestOsCharacterInventory"); @@ -432,9 +436,6 @@ public class SourceClassMap { put("org.zstack.iam2.api.Attribute", "org.zstack.sdk.iam2.api.Attribute"); put("org.zstack.iam2.api.ErrorResult", "org.zstack.sdk.iam2.api.ErrorResult"); put("org.zstack.iam2.container.ContainerClusterInventory", "org.zstack.sdk.iam2.container.ContainerClusterInventory"); - put("org.zstack.iam2.container.ContainerImageInventory", "org.zstack.sdk.iam2.container.ContainerImageInventory"); - put("org.zstack.iam2.container.ContainerImageTagInventory", "org.zstack.sdk.iam2.container.ContainerImageTagInventory"); - put("org.zstack.iam2.container.ProjectRepositoryInventory", "org.zstack.sdk.iam2.container.ProjectRepositoryInventory"); put("org.zstack.iam2.entity.AttributeType", "org.zstack.sdk.iam2.entity.AttributeType"); put("org.zstack.iam2.entity.IAM2AttributeInventory", "org.zstack.sdk.iam2.entity.IAM2AttributeInventory"); put("org.zstack.iam2.entity.IAM2OrganizationAttributeInventory", "org.zstack.sdk.iam2.entity.IAM2OrganizationAttributeInventory"); @@ -957,6 +958,9 @@ public class SourceClassMap { put("org.zstack.sdk.ConnectionRelationShipProperty", "org.zstack.header.aliyun.network.connection.ConnectionRelationShipProperty"); put("org.zstack.sdk.ConsoleInventory", "org.zstack.header.console.ConsoleInventory"); put("org.zstack.sdk.ConsoleProxyAgentInventory", "org.zstack.header.console.ConsoleProxyAgentInventory"); + put("org.zstack.sdk.ContainerBackupStorageInventory", "org.zstack.container.ContainerBackupStorageInventory"); + put("org.zstack.sdk.ContainerImageInventory", "org.zstack.container.entity.ContainerImageInventory"); + put("org.zstack.sdk.ContainerImageTagInventory", "org.zstack.container.entity.ContainerImageTagInventory"); put("org.zstack.sdk.ContainerManagementEndpointInventory", "org.zstack.container.entity.ContainerManagementEndpointInventory"); put("org.zstack.sdk.ContainerUsage", "org.zstack.container.ContainerUsage"); put("org.zstack.sdk.ControlStrategy", "org.zstack.loginControl.entity.ControlStrategy"); @@ -1273,6 +1277,7 @@ public class SourceClassMap { put("org.zstack.sdk.PrimaryStorageHostStatus", "org.zstack.header.storage.primary.PrimaryStorageHostStatus"); put("org.zstack.sdk.PrimaryStorageInventory", "org.zstack.header.storage.primary.PrimaryStorageInventory"); put("org.zstack.sdk.ProgressProperty", "org.zstack.header.aliyun.image.ProgressProperty"); + put("org.zstack.sdk.ProjectRepositoryInventory", "org.zstack.container.entity.ProjectRepositoryInventory"); put("org.zstack.sdk.ProtocolType", "org.zstack.vpcfirewall.entity.ProtocolType"); put("org.zstack.sdk.PubIpVipBandwidthInBillingInventory", "org.zstack.billing.generator.pubip.vip.PubIpVipBandwidthInBillingInventory"); put("org.zstack.sdk.PubIpVipBandwidthOutBillingInventory", "org.zstack.billing.generator.pubip.vip.PubIpVipBandwidthOutBillingInventory"); @@ -1524,9 +1529,6 @@ public class SourceClassMap { put("org.zstack.sdk.iam2.api.ErrorResult", "org.zstack.iam2.api.ErrorResult"); put("org.zstack.sdk.iam2.api.Permission", "org.zstack.iam2.api.APIGetIAM2VirtualIDAPIPermissionReply$Permission"); put("org.zstack.sdk.iam2.container.ContainerClusterInventory", "org.zstack.iam2.container.ContainerClusterInventory"); - put("org.zstack.sdk.iam2.container.ContainerImageInventory", "org.zstack.iam2.container.ContainerImageInventory"); - put("org.zstack.sdk.iam2.container.ContainerImageTagInventory", "org.zstack.iam2.container.ContainerImageTagInventory"); - put("org.zstack.sdk.iam2.container.ProjectRepositoryInventory", "org.zstack.iam2.container.ProjectRepositoryInventory"); put("org.zstack.sdk.iam2.entity.AttributeType", "org.zstack.iam2.entity.AttributeType"); put("org.zstack.sdk.iam2.entity.IAM2AttributeInventory", "org.zstack.iam2.entity.IAM2AttributeInventory"); put("org.zstack.sdk.iam2.entity.IAM2OrganizationAttributeInventory", "org.zstack.iam2.entity.IAM2OrganizationAttributeInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/ContainerBackupStorageInventory.java b/sdk/src/main/java/org/zstack/sdk/ContainerBackupStorageInventory.java new file mode 100644 index 00000000000..cfeacef4bae --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ContainerBackupStorageInventory.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class ContainerBackupStorageInventory extends org.zstack.sdk.BackupStorageInventory { + + public java.lang.String endpointUuid; + public void setEndpointUuid(java.lang.String endpointUuid) { + this.endpointUuid = endpointUuid; + } + public java.lang.String getEndpointUuid() { + return this.endpointUuid; + } + + public java.lang.Long id; + public void setId(java.lang.Long id) { + this.id = id; + } + public java.lang.Long getId() { + return this.id; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerImageInventory.java b/sdk/src/main/java/org/zstack/sdk/ContainerImageInventory.java similarity index 96% rename from sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerImageInventory.java rename to sdk/src/main/java/org/zstack/sdk/ContainerImageInventory.java index 68d21c35d51..d1f7c0b9f07 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerImageInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ContainerImageInventory.java @@ -1,4 +1,4 @@ -package org.zstack.sdk.iam2.container; +package org.zstack.sdk; diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerImageTagInventory.java b/sdk/src/main/java/org/zstack/sdk/ContainerImageTagInventory.java similarity index 84% rename from sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerImageTagInventory.java rename to sdk/src/main/java/org/zstack/sdk/ContainerImageTagInventory.java index d743b8f3048..33e02e08b4b 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerImageTagInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ContainerImageTagInventory.java @@ -1,4 +1,4 @@ -package org.zstack.sdk.iam2.container; +package org.zstack.sdk; @@ -60,4 +60,12 @@ public java.lang.String getPullCommand() { return this.pullCommand; } + public java.lang.String architectures; + public void setArchitectures(java.lang.String architectures) { + this.architectures = architectures; + } + public java.lang.String getArchitectures() { + return this.architectures; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/ProjectRepositoryInventory.java b/sdk/src/main/java/org/zstack/sdk/ProjectRepositoryInventory.java similarity index 98% rename from sdk/src/main/java/org/zstack/sdk/iam2/container/ProjectRepositoryInventory.java rename to sdk/src/main/java/org/zstack/sdk/ProjectRepositoryInventory.java index 31c765f4dde..8ea1651d122 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/container/ProjectRepositoryInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ProjectRepositoryInventory.java @@ -1,4 +1,4 @@ -package org.zstack.sdk.iam2.container; +package org.zstack.sdk; diff --git a/test/src/test/resources/log4j2.xml b/test/src/test/resources/log4j2.xml index 93fa1ab6301..d888a0027e4 100755 --- a/test/src/test/resources/log4j2.xml +++ b/test/src/test/resources/log4j2.xml @@ -164,6 +164,8 @@ + + From 40e9366e228361967820f88e45ba36ef8caa6303 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 20 May 2025 17:03:34 +0800 Subject: [PATCH 463/737] [sdk]: Update sdk Resolves: ZSTAC-74888 Change-Id: I737a6d7270646b776c796661636e6b646d746574 --- .../java/org/zstack/sdk/ModelServiceInventory.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java index 6c8c9a8eb8f..ba1c6d948d1 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java @@ -164,19 +164,19 @@ public java.lang.String getStartCommand() { return this.startCommand; } - public java.lang.String cpuArchitectures; - public void setCpuArchitectures(java.lang.String cpuArchitectures) { + public java.util.List cpuArchitectures; + public void setCpuArchitectures(java.util.List cpuArchitectures) { this.cpuArchitectures = cpuArchitectures; } - public java.lang.String getCpuArchitectures() { + public java.util.List getCpuArchitectures() { return this.cpuArchitectures; } - public java.lang.String gpuVendors; - public void setGpuVendors(java.lang.String gpuVendors) { + public java.util.List gpuVendors; + public void setGpuVendors(java.util.List gpuVendors) { this.gpuVendors = gpuVendors; } - public java.lang.String getGpuVendors() { + public java.util.List getGpuVendors() { return this.gpuVendors; } From c3ed9a1c7f1f0cebbfd146a9e78b064c3b46d2a1 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Thu, 22 May 2025 14:31:35 +0800 Subject: [PATCH 464/737] [host]: Add cpu architecture to sdk Resolves: ZSTAC-74888 Change-Id: I6b786d6a6e76646a7570726b72776c646778667a Signed-off-by: AlanJager --- conf/db/upgrade/V5.3.40__schema.sql | 20 ++++++++++++ .../zstack/header/host/CpuArchitecture.java | 3 ++ sdk/src/main/java/SourceClassMap.java | 4 +++ .../zstack/sdk/ArchitectureImageMapping.java | 31 +++++++++++++++++++ .../java/org/zstack/sdk/CpuArchitecture.java | 8 +++++ 5 files changed, 66 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/ArchitectureImageMapping.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CpuArchitecture.java diff --git a/conf/db/upgrade/V5.3.40__schema.sql b/conf/db/upgrade/V5.3.40__schema.sql index 5f5f2ff45e6..fda49b1582c 100644 --- a/conf/db/upgrade/V5.3.40__schema.sql +++ b/conf/db/upgrade/V5.3.40__schema.sql @@ -60,4 +60,24 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ContainerBackupStorageVO` ( PRIMARY KEY (`uuid`), CONSTRAINT `fkContainerBackupStorageVOBackupStorageEO` FOREIGN KEY (`uuid`) REFERENCES `BackupStorageEO` (`uuid`) ON DELETE CASCADE, CONSTRAINT `fkContainerBackupStorageVOContainerManagementEndpointVO` FOREIGN KEY (`endpointUuid`) REFERENCES `ContainerManagementEndpointVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceCpuArchitectureVO` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `modelServiceUuid` varchar(32) NOT NULL, + `architecture` varchar(32) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + CONSTRAINT `fkModelServiceCpuArchitectureVOModelServiceVO` FOREIGN KEY (`modelServiceUuid`) REFERENCES `ModelServiceVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceGpuVendorVO` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `modelServiceUuid` varchar(32) NOT NULL, + `gpuVendor` varchar(32) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + CONSTRAINT `fkModelServiceGpuVendorVOModelServiceVO` FOREIGN KEY (`modelServiceUuid`) REFERENCES `ModelServiceVO` (`uuid`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/host/CpuArchitecture.java b/header/src/main/java/org/zstack/header/host/CpuArchitecture.java index f5260e1ce6e..2119bdeec27 100644 --- a/header/src/main/java/org/zstack/header/host/CpuArchitecture.java +++ b/header/src/main/java/org/zstack/header/host/CpuArchitecture.java @@ -1,5 +1,8 @@ package org.zstack.header.host; +import org.zstack.header.rest.SDK; + +@SDK public enum CpuArchitecture { x86_64, aarch64, diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 6f6b737591b..8f1cab95449 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -24,6 +24,7 @@ public class SourceClassMap { put("org.zstack.ai.entity.ModelServiceInventory", "org.zstack.sdk.ModelServiceInventory"); put("org.zstack.ai.entity.ModelServiceRefInventory", "org.zstack.sdk.ModelServiceRefInventory"); put("org.zstack.ai.entity.TrainedModelRecordInventory", "org.zstack.sdk.TrainedModelRecordInventory"); + put("org.zstack.ai.message.ArchitectureImageMapping", "org.zstack.sdk.ArchitectureImageMapping"); put("org.zstack.ai.message.MaaSUsage", "org.zstack.sdk.MaaSUsage"); put("org.zstack.ai.message.ModelCenterServiceInventory", "org.zstack.sdk.ModelCenterServiceInventory"); put("org.zstack.ai.message.ModelCenterServiceInventory$MetaServerService", "org.zstack.sdk.MetaServerService"); @@ -255,6 +256,7 @@ public class SourceClassMap { put("org.zstack.header.flowMeter.FlowMeterInventory", "org.zstack.sdk.FlowMeterInventory"); put("org.zstack.header.flowMeter.NetworkRouterFlowMeterRefInventory", "org.zstack.sdk.NetworkRouterFlowMeterRefInventory"); put("org.zstack.header.host.AddHostFromFileResult", "org.zstack.sdk.AddHostFromFileResult"); + put("org.zstack.header.host.CpuArchitecture", "org.zstack.sdk.CpuArchitecture"); put("org.zstack.header.host.HostInventory", "org.zstack.sdk.HostInventory"); put("org.zstack.header.host.HostIpmiInventory", "org.zstack.sdk.HostIpmiInventory"); put("org.zstack.header.host.HostNUMANode", "org.zstack.sdk.HostNUMANode"); @@ -869,6 +871,7 @@ public class SourceClassMap { put("org.zstack.sdk.AppBuildSystemZoneRefInventory", "org.zstack.header.buildsystem.AppBuildSystemZoneRefInventory"); put("org.zstack.sdk.ApplianceVmInventory", "org.zstack.appliancevm.ApplianceVmInventory"); put("org.zstack.sdk.ApplicationDevelopmentServiceInventory", "org.zstack.ai.entity.ApplicationDevelopmentServiceInventory"); + put("org.zstack.sdk.ArchitectureImageMapping", "org.zstack.ai.message.ArchitectureImageMapping"); put("org.zstack.sdk.AttachTagResult", "org.zstack.tag2.AttachTagResult"); put("org.zstack.sdk.AuditData", "org.zstack.header.zwatch.AuditData"); put("org.zstack.sdk.AuditDataV1", "org.zstack.header.zwatch.AuditDataV1"); @@ -964,6 +967,7 @@ public class SourceClassMap { put("org.zstack.sdk.ContainerManagementEndpointInventory", "org.zstack.container.entity.ContainerManagementEndpointInventory"); put("org.zstack.sdk.ContainerUsage", "org.zstack.container.ContainerUsage"); put("org.zstack.sdk.ControlStrategy", "org.zstack.loginControl.entity.ControlStrategy"); + put("org.zstack.sdk.CpuArchitecture", "org.zstack.header.host.CpuArchitecture"); put("org.zstack.sdk.CpuMemoryCapacityData", "org.zstack.header.allocator.datatypes.CpuMemoryCapacityData"); put("org.zstack.sdk.CreateDataVolumeTemplateFromVolumeSnapshotFailure", "org.zstack.header.image.APICreateDataVolumeTemplateFromVolumeSnapshotEvent$Failure"); put("org.zstack.sdk.CreateRootVolumeTemplateFromVolumeSnapshotFailure", "org.zstack.header.image.APICreateRootVolumeTemplateFromVolumeSnapshotEvent$Failure"); diff --git a/sdk/src/main/java/org/zstack/sdk/ArchitectureImageMapping.java b/sdk/src/main/java/org/zstack/sdk/ArchitectureImageMapping.java new file mode 100644 index 00000000000..bcce51854c0 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ArchitectureImageMapping.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + + + +public class ArchitectureImageMapping { + + public java.lang.String cpuArchitecture; + public void setCpuArchitecture(java.lang.String cpuArchitecture) { + this.cpuArchitecture = cpuArchitecture; + } + public java.lang.String getCpuArchitecture() { + return this.cpuArchitecture; + } + + public java.lang.String vmImageUuid; + public void setVmImageUuid(java.lang.String vmImageUuid) { + this.vmImageUuid = vmImageUuid; + } + public java.lang.String getVmImageUuid() { + return this.vmImageUuid; + } + + public java.lang.String dockerImage; + public void setDockerImage(java.lang.String dockerImage) { + this.dockerImage = dockerImage; + } + public java.lang.String getDockerImage() { + return this.dockerImage; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CpuArchitecture.java b/sdk/src/main/java/org/zstack/sdk/CpuArchitecture.java new file mode 100644 index 00000000000..63f24dc20de --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CpuArchitecture.java @@ -0,0 +1,8 @@ +package org.zstack.sdk; + +public enum CpuArchitecture { + x86_64, + aarch64, + mips64el, + loongarch64, +} From e158e47a23cdefca172b51fff717e699e9df19aa Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Fri, 29 Aug 2025 13:40:56 +0800 Subject: [PATCH 465/737] [image]: Update schema for container image - Modify ImageVO and ImageEO to support extends - Update sdk and api helper about clone model service Resolves: ZSTAC-74888 Change-Id: I75737369647063777a6f686d7475726d78636f67 Signed-off-by: ye.zou --- conf/db/upgrade/V5.3.40__schema.sql | 10 +++ .../java/org/zstack/header/image/ImageEO.java | 4 +- .../zstack/header/image/ImageInventory.java | 65 ++++++++++------ .../java/org/zstack/header/image/ImageVO.java | 1 + sdk/src/main/java/SourceClassMap.java | 2 + .../zstack/sdk/CloneModelServiceAction.java | 9 +++ .../zstack/sdk/ContainerImageInventory.java | 48 ++++-------- .../zstack/sdk/QueryContainerImageAction.java | 75 +++++++++++++++++++ .../zstack/sdk/QueryContainerImageResult.java | 22 ++++++ .../org/zstack/sdk/ZakuImageInventory.java | 47 ++++++++++++ .../java/org/zstack/testlib/ApiHelper.groovy | 33 +++++++- 11 files changed, 257 insertions(+), 59 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryContainerImageAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryContainerImageResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ZakuImageInventory.java diff --git a/conf/db/upgrade/V5.3.40__schema.sql b/conf/db/upgrade/V5.3.40__schema.sql index fda49b1582c..9c44b8709c6 100644 --- a/conf/db/upgrade/V5.3.40__schema.sql +++ b/conf/db/upgrade/V5.3.40__schema.sql @@ -80,4 +80,14 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceGpuVendorVO` ( `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`), CONSTRAINT `fkModelServiceGpuVendorVOModelServiceVO` FOREIGN KEY (`modelServiceUuid`) REFERENCES `ModelServiceVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ContainerImageVO` ( + `uuid` varchar(32) NOT NULL, + `registryUrl` varchar(255) DEFAULT NULL, + `endpointUuid` varchar(32) NOT NULL, + `imageTag` varchar(64) DEFAULT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkContainerImageVOImageEO` FOREIGN KEY (`uuid`) REFERENCES `ImageEO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkContainerImageVOContainerManagementEndpointVO` FOREIGN KEY (`endpointUuid`) REFERENCES `ContainerManagementEndpointVO` (`uuid`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/ImageEO.java b/header/src/main/java/org/zstack/header/image/ImageEO.java index acc78d4e409..b04867f6051 100755 --- a/header/src/main/java/org/zstack/header/image/ImageEO.java +++ b/header/src/main/java/org/zstack/header/image/ImageEO.java @@ -1,8 +1,6 @@ package org.zstack.header.image; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; +import javax.persistence.*; /** */ diff --git a/header/src/main/java/org/zstack/header/image/ImageInventory.java b/header/src/main/java/org/zstack/header/image/ImageInventory.java index f72ca14916c..5acb06c38e9 100755 --- a/header/src/main/java/org/zstack/header/image/ImageInventory.java +++ b/header/src/main/java/org/zstack/header/image/ImageInventory.java @@ -49,29 +49,50 @@ public class ImageInventory implements Serializable { private List backupStorageRefs; private List systemTags; + public ImageInventory() { + + } + public ImageInventory(ImageVO vo) { + this.uuid = vo.getUuid(); + this.name = vo.getName(); + this.description = vo.getDescription(); + if (vo.getState() != null) { + this.state = vo.getState().toString(); + } else { + this.state = null; + } + if (vo.getStatus() != null) { + this.status = vo.getStatus().toString(); + } else { + this.status = null; + } + this.size = vo.getSize(); + this.actualSize = vo.getActualSize(); + this.md5Sum = vo.getMd5Sum(); + this.url = vo.getUrl(); + if (vo.getMediaType() != null) { + this.mediaType = vo.getMediaType().toString(); + } else { + this.mediaType = null; + } + this.guestOsType = vo.getGuestOsType(); + this.type = vo.getType(); + if (vo.getPlatform() != null) { + this.platform = vo.getPlatform().toString(); + } else { + this.platform = null; + } + this.architecture = vo.getArchitecture(); + this.format = vo.getFormat(); + this.system = vo.isSystem(); + this.virtio = vo.getVirtio(); + this.createDate = vo.getCreateDate(); + this.lastOpDate = vo.getLastOpDate(); + this.backupStorageRefs = ImageBackupStorageRefInventory.valueOf(vo.getBackupStorageRefs()); + } + public static ImageInventory valueOf(ImageVO vo) { - ImageInventory inv = new ImageInventory(); - inv.setCreateDate(vo.getCreateDate()); - inv.setDescription(vo.getDescription()); - inv.setMediaType(vo.getMediaType().toString()); - inv.setFormat(vo.getFormat()); - inv.setGuestOsType(vo.getGuestOsType()); - inv.setMd5Sum(vo.getMd5Sum()); - inv.setName(vo.getName()); - inv.setSize(vo.getSize()); - inv.setActualSize(vo.getActualSize()); - inv.setStatus(vo.getStatus().toString()); - inv.setState(vo.getState().toString()); - inv.setUrl(vo.getUrl()); - inv.setPlatform(vo.getPlatform() == null ? null : vo.getPlatform().toString()); - inv.setArchitecture(vo.getArchitecture()); - inv.setUuid(vo.getUuid()); - inv.setType(vo.getType()); - inv.setSystem(vo.isSystem()); - inv.setLastOpDate(vo.getLastOpDate()); - inv.setBackupStorageRefs(ImageBackupStorageRefInventory.valueOf(vo.getBackupStorageRefs())); - inv.setVirtio(vo.getVirtio()); - return inv; + return new ImageInventory(vo); } public static ImageInventory valueOf(ImageEO vo) { diff --git a/header/src/main/java/org/zstack/header/image/ImageVO.java b/header/src/main/java/org/zstack/header/image/ImageVO.java index 84b67648159..944be03a291 100755 --- a/header/src/main/java/org/zstack/header/image/ImageVO.java +++ b/header/src/main/java/org/zstack/header/image/ImageVO.java @@ -17,6 +17,7 @@ @EntityGraph.Neighbour(type = ImageBackupStorageRefVO.class, myField = "uuid", targetField = "imageUuid") } ) +@Inheritance(strategy = InheritanceType.JOINED) public class ImageVO extends ImageAO implements OwnedByAccount, ToInventory { @OneToMany(fetch = FetchType.EAGER) @JoinColumn(name = "imageUuid", insertable = false, updatable = false) diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 8f1cab95449..dabe466e277 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -120,6 +120,7 @@ public class SourceClassMap { put("org.zstack.container.entity.NativeClusterInventory", "org.zstack.sdk.NativeClusterInventory"); put("org.zstack.container.entity.NativeHostInventory", "org.zstack.sdk.NativeHostInventory"); put("org.zstack.container.entity.ProjectRepositoryInventory", "org.zstack.sdk.ProjectRepositoryInventory"); + put("org.zstack.container.entity.ZakuImageInventory", "org.zstack.sdk.ZakuImageInventory"); put("org.zstack.core.config.GlobalConfigInventory", "org.zstack.sdk.GlobalConfigInventory"); put("org.zstack.core.config.GlobalConfigOptions", "org.zstack.sdk.GlobalConfigOptions"); put("org.zstack.core.config.GuestOsCharacterInventory", "org.zstack.sdk.GuestOsCharacterInventory"); @@ -1520,6 +1521,7 @@ public class SourceClassMap { put("org.zstack.sdk.ZBoxVmBackupInfo", "org.zstack.externalbackup.zbox.ZBoxVmBackupInfo"); put("org.zstack.sdk.ZBoxVolumeBackupInfo", "org.zstack.externalbackup.zbox.ZBoxVolumeBackupInfo"); put("org.zstack.sdk.ZQLQueryReturn", "org.zstack.zql.ZQLQueryReturn"); + put("org.zstack.sdk.ZakuImageInventory", "org.zstack.container.entity.ZakuImageInventory"); put("org.zstack.sdk.ZdfsInventory", "org.zstack.header.zdfs.ZdfsInventory"); put("org.zstack.sdk.ZdfsService", "org.zstack.ai.message.ModelCenterServiceInventory$ZdfsService"); put("org.zstack.sdk.ZdfsStorageInventory", "org.zstack.header.zdfs.ZdfsStorageInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java index a3dbaf0f1f1..82f2991cd83 100644 --- a/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java @@ -82,6 +82,15 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Long requestMemory; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List cpuArchitectures; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List gpuVendors; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List architectureImages; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/ContainerImageInventory.java b/sdk/src/main/java/org/zstack/sdk/ContainerImageInventory.java index d1f7c0b9f07..7e21e79ccfb 100644 --- a/sdk/src/main/java/org/zstack/sdk/ContainerImageInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ContainerImageInventory.java @@ -2,46 +2,30 @@ -public class ContainerImageInventory { +public class ContainerImageInventory extends org.zstack.sdk.ImageInventory { - public java.lang.String name; - public void setName(java.lang.String name) { - this.name = name; + public java.lang.String endpointUuid; + public void setEndpointUuid(java.lang.String endpointUuid) { + this.endpointUuid = endpointUuid; } - public java.lang.String getName() { - return this.name; + public java.lang.String getEndpointUuid() { + return this.endpointUuid; } - public java.lang.Integer tagCount; - public void setTagCount(java.lang.Integer tagCount) { - this.tagCount = tagCount; + public java.lang.String imageTag; + public void setImageTag(java.lang.String imageTag) { + this.imageTag = imageTag; } - public java.lang.Integer getTagCount() { - return this.tagCount; + public java.lang.String getImageTag() { + return this.imageTag; } - public java.lang.Integer pullCount; - public void setPullCount(java.lang.Integer pullCount) { - this.pullCount = pullCount; + public java.lang.String registryUrl; + public void setRegistryUrl(java.lang.String registryUrl) { + this.registryUrl = registryUrl; } - public java.lang.Integer getPullCount() { - return this.pullCount; - } - - public java.lang.String createTime; - public void setCreateTime(java.lang.String createTime) { - this.createTime = createTime; - } - public java.lang.String getCreateTime() { - return this.createTime; - } - - public java.lang.String updateTime; - public void setUpdateTime(java.lang.String updateTime) { - this.updateTime = updateTime; - } - public java.lang.String getUpdateTime() { - return this.updateTime; + public java.lang.String getRegistryUrl() { + return this.registryUrl; } } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryContainerImageAction.java b/sdk/src/main/java/org/zstack/sdk/QueryContainerImageAction.java new file mode 100644 index 00000000000..3938fbcdec4 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryContainerImageAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryContainerImageAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryContainerImageResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryContainerImageResult value = res.getResult(org.zstack.sdk.QueryContainerImageResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryContainerImageResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/container/images"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryContainerImageResult.java b/sdk/src/main/java/org/zstack/sdk/QueryContainerImageResult.java new file mode 100644 index 00000000000..772a47e2179 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryContainerImageResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryContainerImageResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ZakuImageInventory.java b/sdk/src/main/java/org/zstack/sdk/ZakuImageInventory.java new file mode 100644 index 00000000000..ddb0a381e7a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ZakuImageInventory.java @@ -0,0 +1,47 @@ +package org.zstack.sdk; + + + +public class ZakuImageInventory { + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.Integer tagCount; + public void setTagCount(java.lang.Integer tagCount) { + this.tagCount = tagCount; + } + public java.lang.Integer getTagCount() { + return this.tagCount; + } + + public java.lang.Integer pullCount; + public void setPullCount(java.lang.Integer pullCount) { + this.pullCount = pullCount; + } + public java.lang.Integer getPullCount() { + return this.pullCount; + } + + public java.lang.String createTime; + public void setCreateTime(java.lang.String createTime) { + this.createTime = createTime; + } + public java.lang.String getCreateTime() { + return this.createTime; + } + + public java.lang.String updateTime; + public void setUpdateTime(java.lang.String updateTime) { + this.updateTime = updateTime; + } + public java.lang.String getUpdateTime() { + return this.updateTime; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 1e18d5f2442..376de732da4 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -15318,7 +15318,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -15345,7 +15345,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -29465,6 +29465,35 @@ abstract class ApiHelper { } + def queryContainerImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryContainerImageAction.class) Closure c) { + def a = new org.zstack.sdk.QueryContainerImageAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryContainerManagementEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryContainerManagementEndpointAction.class) Closure c) { def a = new org.zstack.sdk.QueryContainerManagementEndpointAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 59933f67aab5279430b04a1492ec9812ec2c49a6 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Mon, 26 May 2025 14:33:42 +0800 Subject: [PATCH 466/737] [conf]: Fix upgrade sql missing insert resource vo DBImpact Resolves: ZSTAC-74888 Change-Id: I747a716867676c6e776f6a6176766c6f646d7376 --- conf/db/upgrade/V5.3.40__schema.sql | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.3.40__schema.sql b/conf/db/upgrade/V5.3.40__schema.sql index 9c44b8709c6..908ca7ef8f8 100644 --- a/conf/db/upgrade/V5.3.40__schema.sql +++ b/conf/db/upgrade/V5.3.40__schema.sql @@ -21,6 +21,7 @@ BEGIN DECLARE service_uuid VARCHAR(32); DECLARE vm_image_uuid VARCHAR(32); DECLARE cpu_arch VARCHAR(32); + DECLARE model_service_image_uuid VARCHAR(32); DECLARE img_cursor CURSOR FOR SELECT ms.uuid, ms.vmImageUuid, img.architecture FROM ModelServiceVO ms @@ -41,8 +42,10 @@ BEGIN WHERE uuid = service_uuid; IF NOT EXISTS (SELECT 1 FROM ModelServiceImageVO WHERE modelServiceUuid = service_uuid AND cpuArchitecture = cpu_arch) THEN + SET model_service_image_uuid = REPLACE(UUID(),'-',''); INSERT INTO ModelServiceImageVO (uuid, modelServiceUuid, cpuArchitecture, vmImageUuid, createDate, lastOpDate) - VALUES (UUID_SHORT(), service_uuid, cpu_arch, vm_image_uuid, NOW(), NOW()); + VALUES (model_service_image_uuid, service_uuid, cpu_arch, vm_image_uuid, NOW(), NOW()); + INSERT INTO ResourceVO (uuid, resourceType, concreteResourceType) values (model_service_image_uuid, 'ModelServiceImageVO', 'org.zstack.ai.entity.ModelServiceImageVO'); END IF; END LOOP; From 83ba12799835c1583e634c691777a0938340f11c Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 26 May 2025 16:59:02 +0800 Subject: [PATCH 467/737] [testlib]: Update sdk and api helper Resolves: ZSTAC-75176 Change-Id: I6e736f746a716c78796f6b6b6377736e6e707876 --- .../sdk/GetGpuDeviceSpecCandidatesAction.java | 104 ++++++++++++++++++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ 2 files changed, 131 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesAction.java diff --git a/sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesAction.java b/sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesAction.java new file mode 100644 index 00000000000..61c55f0b6c7 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetGpuDeviceSpecCandidatesAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.GetPciDeviceSpecCandidatesResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List clusterUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmInstanceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List vmInstanceUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.GetPciDeviceSpecCandidatesResult value = res.getResult(org.zstack.sdk.GetPciDeviceSpecCandidatesResult.class); + ret.value = value == null ? new org.zstack.sdk.GetPciDeviceSpecCandidatesResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/gpu-device-specs/candidates"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 376de732da4..d70da3b04c0 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -21860,6 +21860,33 @@ abstract class ApiHelper { } + def getGpuDeviceSpecCandidates(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetGpuDeviceSpecCandidatesAction.class) Closure c) { + def a = new org.zstack.sdk.GetGpuDeviceSpecCandidatesAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def getGuestOsMetadata(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetGuestOsMetadataAction.class) Closure c) { def a = new org.zstack.sdk.GetGuestOsMetadataAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From c182245d76c927547d91c1e553056df88f28937d Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Mon, 9 Jun 2025 10:56:04 +0800 Subject: [PATCH 468/737] [conf]: Drop unused columns and update sdk DBImpact Resolves: ZSTAC-75539 Change-Id: I68617171636c6f64686f64716a7a746a7577676b Signed-off-by: ye.zou --- conf/db/upgrade/V5.3.40__schema.sql | 5 ++++- .../org/zstack/sdk/AddModelServiceAction.java | 6 ------ .../org/zstack/sdk/CloneModelServiceAction.java | 6 ------ .../org/zstack/sdk/ModelServiceInventory.java | 16 ---------------- .../org/zstack/sdk/UpdateModelServiceAction.java | 6 ------ 5 files changed, 4 insertions(+), 35 deletions(-) diff --git a/conf/db/upgrade/V5.3.40__schema.sql b/conf/db/upgrade/V5.3.40__schema.sql index 908ca7ef8f8..6264b0c1cd0 100644 --- a/conf/db/upgrade/V5.3.40__schema.sql +++ b/conf/db/upgrade/V5.3.40__schema.sql @@ -93,4 +93,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ContainerImageVO` ( PRIMARY KEY (`uuid`), CONSTRAINT `fkContainerImageVOImageEO` FOREIGN KEY (`uuid`) REFERENCES `ImageEO` (`uuid`) ON DELETE CASCADE, CONSTRAINT `fkContainerImageVOContainerManagementEndpointVO` FOREIGN KEY (`endpointUuid`) REFERENCES `ContainerManagementEndpointVO` (`uuid`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CALL DROP_COLUMN('ModelServiceVO', 'vmImageUuid'); +CALL DROP_COLUMN('ModelServiceVO', 'dockerImage'); diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index f4defd7c0ff..e39532f75aa 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -28,9 +28,6 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String dockerImage; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; @@ -40,9 +37,6 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String modelCenterUuid; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String vmImageUuid; - @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer requestCpu; diff --git a/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java index 82f2991cd83..b95850e0aeb 100644 --- a/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java @@ -37,12 +37,6 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String readme; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String vmImageUuid; - - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String dockerImage; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public long size = 0L; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java index ba1c6d948d1..e96787d185b 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java @@ -92,14 +92,6 @@ public java.lang.String getSource() { return this.source; } - public java.lang.String dockerImage; - public void setDockerImage(java.lang.String dockerImage) { - this.dockerImage = dockerImage; - } - public java.lang.String getDockerImage() { - return this.dockerImage; - } - public java.lang.Long size; public void setSize(java.lang.Long size) { this.size = size; @@ -116,14 +108,6 @@ public java.lang.Boolean getSystem() { return this.system; } - public java.lang.String vmImageUuid; - public void setVmImageUuid(java.lang.String vmImageUuid) { - this.vmImageUuid = vmImageUuid; - } - public java.lang.String getVmImageUuid() { - return this.vmImageUuid; - } - public java.lang.String gpuComputeCapability; public void setGpuComputeCapability(java.lang.String gpuComputeCapability) { this.gpuComputeCapability = gpuComputeCapability; diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java index f6c3a9948af..4923707e635 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java @@ -31,18 +31,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String dockerImage; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String yaml; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.lang.String vmImageUuid; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer requestCpu; From 00dc6af2bdc0076592eb8e144f18fe8b21bd2280 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Fri, 20 Jun 2025 15:24:45 +0800 Subject: [PATCH 469/737] [conf]: Upgrade vmImageUuid and dockerImage DBImpact Resolves: ZSTAC-75784 Change-Id: I7a776a6a68646d6d746778696962736c716e6470 --- conf/db/upgrade/V5.3.40__schema.sql | 92 ++++++++++++++++++++++++----- 1 file changed, 78 insertions(+), 14 deletions(-) diff --git a/conf/db/upgrade/V5.3.40__schema.sql b/conf/db/upgrade/V5.3.40__schema.sql index 6264b0c1cd0..4b48036e279 100644 --- a/conf/db/upgrade/V5.3.40__schema.sql +++ b/conf/db/upgrade/V5.3.40__schema.sql @@ -13,6 +13,79 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceImageVO` ( CALL ADD_COLUMN('ModelServiceVO', 'gpuVendors', 'varchar(255)', 1, 'NULL'); CALL ADD_COLUMN('ModelServiceVO', 'cpuArchitectures', 'varchar(255)', 1, 'NULL'); +DROP PROCEDURE IF EXISTS migrate_model_service_image_data; +DELIMITER $$ +CREATE PROCEDURE migrate_model_service_image_data() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE service_uuid VARCHAR(32); + DECLARE vm_image_uuid VARCHAR(32); + DECLARE docker_image VARCHAR(255); + DECLARE model_service_image_uuid VARCHAR(32); + DECLARE cpu_arch VARCHAR(32); + + DECLARE vm_cursor CURSOR FOR + SELECT ms.uuid, ms.vmImageUuid + FROM ModelServiceVO ms + WHERE ms.vmImageUuid IS NOT NULL; + + DECLARE docker_cursor CURSOR FOR + SELECT ms.uuid, ms.dockerImage + FROM ModelServiceVO ms + WHERE ms.dockerImage IS NOT NULL; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + OPEN vm_cursor; + vm_read_loop: LOOP + FETCH vm_cursor INTO service_uuid, vm_image_uuid; + IF done THEN + SET done = FALSE; + LEAVE vm_read_loop; + END IF; + + SELECT IFNULL(img.architecture, 'x86_64') INTO cpu_arch + FROM ImageVO img + WHERE img.uuid = vm_image_uuid + LIMIT 1; + + IF NOT EXISTS (SELECT 1 FROM ModelServiceImageVO WHERE modelServiceUuid = service_uuid AND vmImageUuid = vm_image_uuid) THEN + SET model_service_image_uuid = REPLACE(UUID(),'-',''); + INSERT INTO ModelServiceImageVO (uuid, modelServiceUuid, cpuArchitecture, vmImageUuid, createDate, lastOpDate) + VALUES (model_service_image_uuid, service_uuid, cpu_arch, vm_image_uuid, NOW(), NOW()); + INSERT INTO ResourceVO (uuid, resourceType, concreteResourceType) + VALUES (model_service_image_uuid, 'ModelServiceImageVO', 'org.zstack.ai.entity.ModelServiceImageVO'); + END IF; + END LOOP; + CLOSE vm_cursor; + + OPEN docker_cursor; + docker_read_loop: LOOP + FETCH docker_cursor INTO service_uuid, docker_image; + IF done THEN + LEAVE docker_read_loop; + END IF; + + SET cpu_arch = 'x86_64'; + + IF NOT EXISTS (SELECT 1 FROM ModelServiceImageVO WHERE modelServiceUuid = service_uuid AND dockerImage = docker_image) THEN + SET model_service_image_uuid = REPLACE(UUID(),'-',''); + INSERT INTO ModelServiceImageVO (uuid, modelServiceUuid, cpuArchitecture, dockerImage, createDate, lastOpDate) + VALUES (model_service_image_uuid, service_uuid, cpu_arch, docker_image, NOW(), NOW()); + INSERT INTO ResourceVO (uuid, resourceType, concreteResourceType) + VALUES (model_service_image_uuid, 'ModelServiceImageVO', 'org.zstack.ai.entity.ModelServiceImageVO'); + END IF; + END LOOP; + CLOSE docker_cursor; +END$$ +DELIMITER ; + +CALL migrate_model_service_image_data(); +DROP PROCEDURE IF EXISTS migrate_model_service_image_data; + +CALL DROP_COLUMN('ModelServiceVO', 'vmImageUuid'); +CALL DROP_COLUMN('ModelServiceVO', 'dockerImage'); + DROP PROCEDURE IF EXISTS update_model_service_cpu_arch; DELIMITER $$ CREATE PROCEDURE update_model_service_cpu_arch() @@ -23,10 +96,11 @@ BEGIN DECLARE cpu_arch VARCHAR(32); DECLARE model_service_image_uuid VARCHAR(32); DECLARE img_cursor CURSOR FOR - SELECT ms.uuid, ms.vmImageUuid, img.architecture + SELECT ms.uuid, msi.vmImageUuid, img.architecture FROM ModelServiceVO ms - JOIN ImageVO img ON ms.vmImageUuid = img.uuid - WHERE ms.vmImageUuid IS NOT NULL; + JOIN ModelServiceImageVO msi ON ms.uuid = msi.modelServiceUuid + JOIN ImageVO img ON msi.vmImageUuid = img.uuid + WHERE msi.vmImageUuid IS NOT NULL; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN img_cursor; @@ -40,13 +114,6 @@ BEGIN UPDATE ModelServiceVO SET cpuArchitectures = cpu_arch WHERE uuid = service_uuid; - - IF NOT EXISTS (SELECT 1 FROM ModelServiceImageVO WHERE modelServiceUuid = service_uuid AND cpuArchitecture = cpu_arch) THEN - SET model_service_image_uuid = REPLACE(UUID(),'-',''); - INSERT INTO ModelServiceImageVO (uuid, modelServiceUuid, cpuArchitecture, vmImageUuid, createDate, lastOpDate) - VALUES (model_service_image_uuid, service_uuid, cpu_arch, vm_image_uuid, NOW(), NOW()); - INSERT INTO ResourceVO (uuid, resourceType, concreteResourceType) values (model_service_image_uuid, 'ModelServiceImageVO', 'org.zstack.ai.entity.ModelServiceImageVO'); - END IF; END LOOP; CLOSE img_cursor; @@ -93,7 +160,4 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ContainerImageVO` ( PRIMARY KEY (`uuid`), CONSTRAINT `fkContainerImageVOImageEO` FOREIGN KEY (`uuid`) REFERENCES `ImageEO` (`uuid`) ON DELETE CASCADE, CONSTRAINT `fkContainerImageVOContainerManagementEndpointVO` FOREIGN KEY (`endpointUuid`) REFERENCES `ContainerManagementEndpointVO` (`uuid`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CALL DROP_COLUMN('ModelServiceVO', 'vmImageUuid'); -CALL DROP_COLUMN('ModelServiceVO', 'dockerImage'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file From baa0a8ef232f153255ae6ac816f39c314bd56621 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Mon, 23 Jun 2025 18:30:47 +0800 Subject: [PATCH 470/737] [conf]: Fix ModelServiceImageVO have too many records issue Check if image with same arch already exists to avoid insert more than one record DBImpact Resolves: ZSTAC-75784 Change-Id: I7173646570616a657975767a776761676b717075 --- conf/db/upgrade/V5.3.40__schema.sql | 91 +++++++++++++++++++++++++++-- 1 file changed, 86 insertions(+), 5 deletions(-) diff --git a/conf/db/upgrade/V5.3.40__schema.sql b/conf/db/upgrade/V5.3.40__schema.sql index 4b48036e279..4f04c334f4d 100644 --- a/conf/db/upgrade/V5.3.40__schema.sql +++ b/conf/db/upgrade/V5.3.40__schema.sql @@ -23,7 +23,11 @@ BEGIN DECLARE docker_image VARCHAR(255); DECLARE model_service_image_uuid VARCHAR(32); DECLARE cpu_arch VARCHAR(32); + DECLARE existing_uuid VARCHAR(32); + DECLARE all_services_cursor CURSOR FOR + SELECT uuid FROM ModelServiceVO; + DECLARE vm_cursor CURSOR FOR SELECT ms.uuid, ms.vmImageUuid FROM ModelServiceVO ms @@ -36,6 +40,25 @@ BEGIN DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + OPEN all_services_cursor; + all_services_loop: LOOP + FETCH all_services_cursor INTO service_uuid; + IF done THEN + SET done = FALSE; + LEAVE all_services_loop; + END IF; + + IF NOT EXISTS (SELECT 1 FROM ModelServiceImageVO WHERE modelServiceUuid = service_uuid) THEN + SET model_service_image_uuid = REPLACE(UUID(),'-',''); + INSERT INTO ModelServiceImageVO (uuid, modelServiceUuid, cpuArchitecture, createDate, lastOpDate) + VALUES (model_service_image_uuid, service_uuid, 'x86_64', NOW(), NOW()); + + INSERT INTO ResourceVO (uuid, resourceType, concreteResourceType) + VALUES (model_service_image_uuid, 'ModelServiceImageVO', 'org.zstack.ai.entity.ModelServiceImageVO'); + END IF; + END LOOP; + CLOSE all_services_cursor; + OPEN vm_cursor; vm_read_loop: LOOP FETCH vm_cursor INTO service_uuid, vm_image_uuid; @@ -45,17 +68,29 @@ BEGIN END IF; SELECT IFNULL(img.architecture, 'x86_64') INTO cpu_arch - FROM ImageVO img + FROM ImageVO img WHERE img.uuid = vm_image_uuid LIMIT 1; - IF NOT EXISTS (SELECT 1 FROM ModelServiceImageVO WHERE modelServiceUuid = service_uuid AND vmImageUuid = vm_image_uuid) THEN + SELECT uuid INTO existing_uuid + FROM ModelServiceImageVO + WHERE modelServiceUuid = service_uuid AND cpuArchitecture = cpu_arch + LIMIT 1; + + IF existing_uuid IS NULL THEN SET model_service_image_uuid = REPLACE(UUID(),'-',''); INSERT INTO ModelServiceImageVO (uuid, modelServiceUuid, cpuArchitecture, vmImageUuid, createDate, lastOpDate) VALUES (model_service_image_uuid, service_uuid, cpu_arch, vm_image_uuid, NOW(), NOW()); - INSERT INTO ResourceVO (uuid, resourceType, concreteResourceType) + + INSERT INTO ResourceVO (uuid, resourceType, concreteResourceType) VALUES (model_service_image_uuid, 'ModelServiceImageVO', 'org.zstack.ai.entity.ModelServiceImageVO'); + ELSE + UPDATE ModelServiceImageVO + SET vmImageUuid = vm_image_uuid, lastOpDate = NOW() + WHERE uuid = existing_uuid; END IF; + + SET existing_uuid = NULL; END LOOP; CLOSE vm_cursor; @@ -68,21 +103,67 @@ BEGIN SET cpu_arch = 'x86_64'; - IF NOT EXISTS (SELECT 1 FROM ModelServiceImageVO WHERE modelServiceUuid = service_uuid AND dockerImage = docker_image) THEN + SELECT uuid INTO existing_uuid + FROM ModelServiceImageVO + WHERE modelServiceUuid = service_uuid AND cpuArchitecture = cpu_arch + LIMIT 1; + + IF existing_uuid IS NULL THEN SET model_service_image_uuid = REPLACE(UUID(),'-',''); INSERT INTO ModelServiceImageVO (uuid, modelServiceUuid, cpuArchitecture, dockerImage, createDate, lastOpDate) VALUES (model_service_image_uuid, service_uuid, cpu_arch, docker_image, NOW(), NOW()); - INSERT INTO ResourceVO (uuid, resourceType, concreteResourceType) + + INSERT INTO ResourceVO (uuid, resourceType, concreteResourceType) VALUES (model_service_image_uuid, 'ModelServiceImageVO', 'org.zstack.ai.entity.ModelServiceImageVO'); + ELSE + UPDATE ModelServiceImageVO + SET dockerImage = docker_image, lastOpDate = NOW() + WHERE uuid = existing_uuid; END IF; + + SET existing_uuid = NULL; END LOOP; CLOSE docker_cursor; + + INSERT INTO zstack.OperationLog (content, type, resourceUuid) + VALUES (CONCAT('ModelServiceVO count: ', + (SELECT COUNT(*) FROM ModelServiceVO), + ', ModelServiceImageVO count: ', + (SELECT COUNT(*) FROM ModelServiceImageVO)), + 'System', REPLACE(UUID(),'-','')); END$$ DELIMITER ; +-- 执行迁移并添加检查 CALL migrate_model_service_image_data(); + +-- 再次检查确保所有ModelServiceVO都有对应的ModelServiceImageVO +DROP PROCEDURE IF EXISTS ensure_model_service_image_completeness; +DELIMITER $$ +CREATE PROCEDURE ensure_model_service_image_completeness() +BEGIN + INSERT INTO ModelServiceImageVO (uuid, modelServiceUuid, cpuArchitecture, createDate, lastOpDate) + SELECT REPLACE(UUID(),'-',''), ms.uuid, 'x86_64', NOW(), NOW() + FROM ModelServiceVO ms + WHERE NOT EXISTS ( + SELECT 1 FROM ModelServiceImageVO msi WHERE msi.modelServiceUuid = ms.uuid + ); + + -- 记录最终结果 + INSERT INTO zstack.OperationLog (content, type, resourceUuid) + VALUES (CONCAT('Final ModelServiceVO count: ', + (SELECT COUNT(*) FROM ModelServiceVO), + ', ModelServiceImageVO count: ', + (SELECT COUNT(*) FROM ModelServiceImageVO)), + 'System', REPLACE(UUID(),'-','')); +END$$ +DELIMITER ; + +CALL ensure_model_service_image_completeness(); +DROP PROCEDURE IF EXISTS ensure_model_service_image_completeness; DROP PROCEDURE IF EXISTS migrate_model_service_image_data; +-- 确认数据完整后再删除字段 CALL DROP_COLUMN('ModelServiceVO', 'vmImageUuid'); CALL DROP_COLUMN('ModelServiceVO', 'dockerImage'); From 9a4f202d6e08508a7cb9849c7f5fbe766844b923 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Wed, 25 Jun 2025 11:47:39 +0800 Subject: [PATCH 471/737] [conf]: Fix schema error with missing table DBImpact Resolves: ZSTAC-75784 Change-Id: I74736e686c6e6d6a78786b6d7672667079736b76 --- conf/db/upgrade/V5.3.40__schema.sql | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/conf/db/upgrade/V5.3.40__schema.sql b/conf/db/upgrade/V5.3.40__schema.sql index 4f04c334f4d..922f8e09be2 100644 --- a/conf/db/upgrade/V5.3.40__schema.sql +++ b/conf/db/upgrade/V5.3.40__schema.sql @@ -124,20 +124,11 @@ BEGIN SET existing_uuid = NULL; END LOOP; CLOSE docker_cursor; - - INSERT INTO zstack.OperationLog (content, type, resourceUuid) - VALUES (CONCAT('ModelServiceVO count: ', - (SELECT COUNT(*) FROM ModelServiceVO), - ', ModelServiceImageVO count: ', - (SELECT COUNT(*) FROM ModelServiceImageVO)), - 'System', REPLACE(UUID(),'-','')); END$$ DELIMITER ; --- 执行迁移并添加检查 CALL migrate_model_service_image_data(); --- 再次检查确保所有ModelServiceVO都有对应的ModelServiceImageVO DROP PROCEDURE IF EXISTS ensure_model_service_image_completeness; DELIMITER $$ CREATE PROCEDURE ensure_model_service_image_completeness() @@ -148,14 +139,6 @@ BEGIN WHERE NOT EXISTS ( SELECT 1 FROM ModelServiceImageVO msi WHERE msi.modelServiceUuid = ms.uuid ); - - -- 记录最终结果 - INSERT INTO zstack.OperationLog (content, type, resourceUuid) - VALUES (CONCAT('Final ModelServiceVO count: ', - (SELECT COUNT(*) FROM ModelServiceVO), - ', ModelServiceImageVO count: ', - (SELECT COUNT(*) FROM ModelServiceImageVO)), - 'System', REPLACE(UUID(),'-','')); END$$ DELIMITER ; From 209e1d6d812399f5207f76c45264325e9398991f Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Wed, 2 Jul 2025 13:24:49 +0800 Subject: [PATCH 472/737] [host]: Fix unstable ConnectHostMultiTimesCase Resolves: ZSTAC-31304 Change-Id: I757a637a6d6c686c78656c63617966727379716d --- .../integration/kvm/host/ConnectHostMultiTimesCase.groovy | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/host/ConnectHostMultiTimesCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/host/ConnectHostMultiTimesCase.groovy index 9caf5c1c08d..f8f2666163f 100644 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/host/ConnectHostMultiTimesCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/host/ConnectHostMultiTimesCase.groovy @@ -106,7 +106,9 @@ class ConnectHostMultiTimesCase extends SubCase { stateEvent = HostStateEvent.enable } - assert count == 1 + retryInSecs { + assert count == 1 + } cleanup() retryInSecs { From 33d412acb689c3776633d906a45576cc08de258f Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Wed, 2 Jul 2025 13:38:10 +0800 Subject: [PATCH 473/737] [utils]: Change default usage of curl - Ignore progress - Return none-zero value if http code return 4xx and 5xx - Use head request to avoid send content to endpoint Resolves: ZSTAC-25326 Change-Id: I6b696d76736f68626c626169686c6c6478676a78 --- utils/src/main/java/org/zstack/utils/DomainUtils.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/utils/src/main/java/org/zstack/utils/DomainUtils.java b/utils/src/main/java/org/zstack/utils/DomainUtils.java index 85919fdd401..f8ff559c6e1 100644 --- a/utils/src/main/java/org/zstack/utils/DomainUtils.java +++ b/utils/src/main/java/org/zstack/utils/DomainUtils.java @@ -16,7 +16,8 @@ public static String getDomain(String url) { } public static Boolean curl(String url) { - ShellResult rst = ShellUtils.runAndReturn(String.format("curl %s", url), true); + String command = String.format("curl -sf --head --connect-timeout 5 %s", url); + ShellResult rst = ShellUtils.runAndReturn(command, true); return rst.getRetCode() == 0; } From 674037a690c2534179e123aa8e6a4ace9d2e2114 Mon Sep 17 00:00:00 2001 From: "xingwei.yu" Date: Fri, 29 Aug 2025 13:43:58 +0800 Subject: [PATCH 474/737] [plugin]: introducing the mds update Resolves: ZSTAC-75947 Change-Id: I6d686971756f69736b626b6e70686c766b786572 From 7db4c00f04afb6eb2a0d012b7be00693bf2643dd Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Fri, 4 Jul 2025 12:02:59 +0800 Subject: [PATCH 475/737] [conf]: Make model service image and its arch as unique key DBImpact Resolves: ZSTAC-76155 Change-Id: I636a78656c69736f727464616f6c706e6a6a7271 --- conf/db/upgrade/V5.3.40__schema.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/db/upgrade/V5.3.40__schema.sql b/conf/db/upgrade/V5.3.40__schema.sql index 922f8e09be2..9576e65b7a6 100644 --- a/conf/db/upgrade/V5.3.40__schema.sql +++ b/conf/db/upgrade/V5.3.40__schema.sql @@ -7,6 +7,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceImageVO` ( `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`uuid`), + UNIQUE KEY `ukModelServiceCpuArch` (`modelServiceUuid`,`cpuArchitecture`) USING BTREE, CONSTRAINT `fkModelServiceImageVOModelServiceVO` FOREIGN KEY (`modelServiceUuid`) REFERENCES `ModelServiceVO` (`uuid`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; From 77227709ced232e2cf06f489d291bb6e44eebfa9 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Mon, 7 Jul 2025 14:04:44 +0800 Subject: [PATCH 476/737] [conf]: Set cpu arch as default value of no image found before DBImpact Resolves: ZSTAC-76219 Change-Id: I62696673786370656d7375766b77676d66796966 --- conf/db/upgrade/V5.3.40__schema.sql | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/conf/db/upgrade/V5.3.40__schema.sql b/conf/db/upgrade/V5.3.40__schema.sql index 9576e65b7a6..c58eddd8599 100644 --- a/conf/db/upgrade/V5.3.40__schema.sql +++ b/conf/db/upgrade/V5.3.40__schema.sql @@ -73,6 +73,10 @@ BEGIN WHERE img.uuid = vm_image_uuid LIMIT 1; + IF cpu_arch IS NULL THEN + SET cpu_arch = 'x86_64'; + END IF; + SELECT uuid INTO existing_uuid FROM ModelServiceImageVO WHERE modelServiceUuid = service_uuid AND cpuArchitecture = cpu_arch From b932b3f2f27063c4343820ce06e0bc8ee7dd07e2 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Tue, 8 Jul 2025 14:05:08 +0800 Subject: [PATCH 477/737] [conf]: Remove redundant code DBImpact Resolves: ZSTAC-72604 Change-Id: I6e6b66647063656c7461666863636c737a676f65 --- conf/db/upgrade/V5.3.40__schema.sql | 9 --------- 1 file changed, 9 deletions(-) diff --git a/conf/db/upgrade/V5.3.40__schema.sql b/conf/db/upgrade/V5.3.40__schema.sql index c58eddd8599..2310be14e45 100644 --- a/conf/db/upgrade/V5.3.40__schema.sql +++ b/conf/db/upgrade/V5.3.40__schema.sql @@ -53,9 +53,6 @@ BEGIN SET model_service_image_uuid = REPLACE(UUID(),'-',''); INSERT INTO ModelServiceImageVO (uuid, modelServiceUuid, cpuArchitecture, createDate, lastOpDate) VALUES (model_service_image_uuid, service_uuid, 'x86_64', NOW(), NOW()); - - INSERT INTO ResourceVO (uuid, resourceType, concreteResourceType) - VALUES (model_service_image_uuid, 'ModelServiceImageVO', 'org.zstack.ai.entity.ModelServiceImageVO'); END IF; END LOOP; CLOSE all_services_cursor; @@ -86,9 +83,6 @@ BEGIN SET model_service_image_uuid = REPLACE(UUID(),'-',''); INSERT INTO ModelServiceImageVO (uuid, modelServiceUuid, cpuArchitecture, vmImageUuid, createDate, lastOpDate) VALUES (model_service_image_uuid, service_uuid, cpu_arch, vm_image_uuid, NOW(), NOW()); - - INSERT INTO ResourceVO (uuid, resourceType, concreteResourceType) - VALUES (model_service_image_uuid, 'ModelServiceImageVO', 'org.zstack.ai.entity.ModelServiceImageVO'); ELSE UPDATE ModelServiceImageVO SET vmImageUuid = vm_image_uuid, lastOpDate = NOW() @@ -117,9 +111,6 @@ BEGIN SET model_service_image_uuid = REPLACE(UUID(),'-',''); INSERT INTO ModelServiceImageVO (uuid, modelServiceUuid, cpuArchitecture, dockerImage, createDate, lastOpDate) VALUES (model_service_image_uuid, service_uuid, cpu_arch, docker_image, NOW(), NOW()); - - INSERT INTO ResourceVO (uuid, resourceType, concreteResourceType) - VALUES (model_service_image_uuid, 'ModelServiceImageVO', 'org.zstack.ai.entity.ModelServiceImageVO'); ELSE UPDATE ModelServiceImageVO SET dockerImage = docker_image, lastOpDate = NOW() From 4611af2ddd1a583e1dccc917ca47f5411f4f341b Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Wed, 6 Aug 2025 13:43:29 +0800 Subject: [PATCH 478/737] [sdk]: update zdfs service sdk Resolves: ZSTAC-76388 Change-Id: I69636d696c66636465757a687866756b63797976 --- sdk/src/main/java/org/zstack/sdk/MetaServerService.java | 8 ++++++++ sdk/src/main/java/org/zstack/sdk/ZdfsService.java | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/MetaServerService.java b/sdk/src/main/java/org/zstack/sdk/MetaServerService.java index 411d4ac737d..096d55f08da 100644 --- a/sdk/src/main/java/org/zstack/sdk/MetaServerService.java +++ b/sdk/src/main/java/org/zstack/sdk/MetaServerService.java @@ -36,6 +36,14 @@ public long getUsedMemoryInBytes() { return this.usedMemoryInBytes; } + public long systemMemoryInBytes; + public void setSystemMemoryInBytes(long systemMemoryInBytes) { + this.systemMemoryInBytes = systemMemoryInBytes; + } + public long getSystemMemoryInBytes() { + return this.systemMemoryInBytes; + } + public long maxMemoryInBytes; public void setMaxMemoryInBytes(long maxMemoryInBytes) { this.maxMemoryInBytes = maxMemoryInBytes; diff --git a/sdk/src/main/java/org/zstack/sdk/ZdfsService.java b/sdk/src/main/java/org/zstack/sdk/ZdfsService.java index f5dd69ae912..751e03b2637 100644 --- a/sdk/src/main/java/org/zstack/sdk/ZdfsService.java +++ b/sdk/src/main/java/org/zstack/sdk/ZdfsService.java @@ -28,6 +28,14 @@ public int getSentinelCount() { return this.sentinelCount; } + public java.lang.String metaServerStatus; + public void setMetaServerStatus(java.lang.String metaServerStatus) { + this.metaServerStatus = metaServerStatus; + } + public java.lang.String getMetaServerStatus() { + return this.metaServerStatus; + } + public java.util.List metaServers; public void setMetaServers(java.util.List metaServers) { this.metaServers = metaServers; From cfce9a1793b0612238a69ea1aeff8de08e8dd39d Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Tue, 19 Aug 2025 17:01:51 +0800 Subject: [PATCH 479/737] [identity]: Remove unnecessary interface changes Resolves: ZSTAC-77201 Change-Id: I6a69727269756c6d7871647a70726f6b656b6475 Signed-off-by: ye.zou --- .../org/zstack/header/identity/login/LoginBackend.java | 4 ---- .../java/org/zstack/identity/AccountLoginBackend.java | 9 --------- .../org/zstack/sdk/LoginIAM2VirtualIDWithLdapAction.java | 3 +++ 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/header/src/main/java/org/zstack/header/identity/login/LoginBackend.java b/header/src/main/java/org/zstack/header/identity/login/LoginBackend.java index b1270efd25d..b6b5a97de16 100644 --- a/header/src/main/java/org/zstack/header/identity/login/LoginBackend.java +++ b/header/src/main/java/org/zstack/header/identity/login/LoginBackend.java @@ -28,8 +28,4 @@ public interface LoginBackend { default Set possibleUserUuidSetForGettingProcedures(LoginContext loginContext) { return Collections.emptySet(); } - - default Map generateJwtTokenClaims(LoginContext loginContext, LoginSessionInfo info) { - return new HashMap<>(); - } } diff --git a/identity/src/main/java/org/zstack/identity/AccountLoginBackend.java b/identity/src/main/java/org/zstack/identity/AccountLoginBackend.java index 10b0ca08bf0..0cbaf8b45aa 100644 --- a/identity/src/main/java/org/zstack/identity/AccountLoginBackend.java +++ b/identity/src/main/java/org/zstack/identity/AccountLoginBackend.java @@ -29,15 +29,6 @@ public LoginType getLoginType() { return loginType; } - @Override - public Map generateJwtTokenClaims(LoginContext loginContext, LoginSessionInfo info) { - Map claims = new HashMap<>(); - claims.put(AccountConstant.LOGIN_TYPE_NAME, loginContext.getLoginBackendType()); - claims.put(AccountConstant.FULL_NAME, loginContext.getUsername()); - claims.put(AccountConstant.PREFERRED_USERNAME, loginContext.getUsername()); - return claims; - } - @Override public void login(LoginContext loginContext, ReturnValueCompletion completion) { AccountVO vo = Q.New(AccountVO.class) diff --git a/sdk/src/main/java/org/zstack/sdk/LoginIAM2VirtualIDWithLdapAction.java b/sdk/src/main/java/org/zstack/sdk/LoginIAM2VirtualIDWithLdapAction.java index ac779e23bc9..26c37563989 100644 --- a/sdk/src/main/java/org/zstack/sdk/LoginIAM2VirtualIDWithLdapAction.java +++ b/sdk/src/main/java/org/zstack/sdk/LoginIAM2VirtualIDWithLdapAction.java @@ -37,6 +37,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String captchaUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map clientInfo; + @Param(required = false) public java.util.List systemTags; From 7daa418d10e3904cc32f753686c4c79c098bd4dd Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Mon, 25 Aug 2025 14:01:06 +0800 Subject: [PATCH 480/737] [conf]: Remove unused user tag on models DBImpact Resolves: ZSTAC-76458 Change-Id: I6f65666f6879706c72617365776d69727173696a --- conf/db/upgrade/V5.3.46__schema.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/db/upgrade/V5.3.46__schema.sql b/conf/db/upgrade/V5.3.46__schema.sql index faa0d767924..94b6d3b67f5 100644 --- a/conf/db/upgrade/V5.3.46__schema.sql +++ b/conf/db/upgrade/V5.3.46__schema.sql @@ -61,3 +61,5 @@ CREATE TABLE IF NOT EXISTS `zstack`.`H3cSdnSubnetIpRangeRefVO` ( CONSTRAINT `fkH3cSdnSubnetIpRangeRefVOSdnControllerVO` FOREIGN KEY (`sdnControllerUuid`) REFERENCES `SdnControllerVO` (`uuid`) ON DELETE CASCADE, CONSTRAINT `fkH3cSdnSubnetIpRangeRefVOIpRangeVO` FOREIGN KEY (`ipRangeUuid`) REFERENCES `IpRangeEO` (`uuid`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DELETE FROM UserTagVO WHERE uuid = 'a4de80903e57422699fb05bd367a3cb4'; From 8b8bf2f54cb5a348ef5b084eeddef1d88c21e27e Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Fri, 8 Aug 2025 15:56:50 +0800 Subject: [PATCH 481/737] [conf]: Update PciDeviceSpecVO's column for new feature DBImpact Resolves: ZSTAC-76511 Change-Id: I6a75756c736f6d68797a7672637863737666706b --- conf/db/upgrade/V5.3.46__schema.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/db/upgrade/V5.3.46__schema.sql b/conf/db/upgrade/V5.3.46__schema.sql index 94b6d3b67f5..5e415435475 100644 --- a/conf/db/upgrade/V5.3.46__schema.sql +++ b/conf/db/upgrade/V5.3.46__schema.sql @@ -63,3 +63,5 @@ CREATE TABLE IF NOT EXISTS `zstack`.`H3cSdnSubnetIpRangeRefVO` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; DELETE FROM UserTagVO WHERE uuid = 'a4de80903e57422699fb05bd367a3cb4'; + +CALL ADD_COLUMN('PciDeviceSpecVO', 'allowResourceConfigWithMultipleDevices', 'tinyint(1)', 1, '1'); From 8679acca556bd2a75259e9bb7512619a46d30051 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 8 Aug 2025 16:32:40 +0800 Subject: [PATCH 482/737] [sdk]: Update sdk Resolves: ZSTAC-76511 Change-Id: I71786b646769617575796364796c6265756c7875 --- conf/db/upgrade/V5.3.46__schema.sql | 2 +- .../main/java/org/zstack/sdk/PciDeviceSpecInventory.java | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.3.46__schema.sql b/conf/db/upgrade/V5.3.46__schema.sql index 5e415435475..a0c3583d7ef 100644 --- a/conf/db/upgrade/V5.3.46__schema.sql +++ b/conf/db/upgrade/V5.3.46__schema.sql @@ -64,4 +64,4 @@ CREATE TABLE IF NOT EXISTS `zstack`.`H3cSdnSubnetIpRangeRefVO` ( DELETE FROM UserTagVO WHERE uuid = 'a4de80903e57422699fb05bd367a3cb4'; -CALL ADD_COLUMN('PciDeviceSpecVO', 'allowResourceConfigWithMultipleDevices', 'tinyint(1)', 1, '1'); +CALL ADD_COLUMN('PciDeviceSpecVO', 'allowResourceConfigWithMultipleDevices', 'tinyint(1)', 0, '1'); diff --git a/sdk/src/main/java/org/zstack/sdk/PciDeviceSpecInventory.java b/sdk/src/main/java/org/zstack/sdk/PciDeviceSpecInventory.java index 0619513ab97..99b34405fe4 100644 --- a/sdk/src/main/java/org/zstack/sdk/PciDeviceSpecInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/PciDeviceSpecInventory.java @@ -117,6 +117,14 @@ public java.lang.Boolean getIsVirtual() { return this.isVirtual; } + public boolean allowResourceConfigWithMultipleDevices; + public void setAllowResourceConfigWithMultipleDevices(boolean allowResourceConfigWithMultipleDevices) { + this.allowResourceConfigWithMultipleDevices = allowResourceConfigWithMultipleDevices; + } + public boolean getAllowResourceConfigWithMultipleDevices() { + return this.allowResourceConfigWithMultipleDevices; + } + public java.lang.String romVersion; public void setRomVersion(java.lang.String romVersion) { this.romVersion = romVersion; From d5ce4afbec491871080ef0dce134f9aa5f48f4ef Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Mon, 18 Aug 2025 10:01:51 +0800 Subject: [PATCH 483/737] [conf]: Add opaque column to GpuDeviceVO DBImpact Resolves: ZSTAC-76166 Change-Id: I76716261617777776269666369707265656b7674 --- conf/db/upgrade/V5.3.46__schema.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/db/upgrade/V5.3.46__schema.sql b/conf/db/upgrade/V5.3.46__schema.sql index a0c3583d7ef..a5f7cb2d1d0 100644 --- a/conf/db/upgrade/V5.3.46__schema.sql +++ b/conf/db/upgrade/V5.3.46__schema.sql @@ -65,3 +65,5 @@ CREATE TABLE IF NOT EXISTS `zstack`.`H3cSdnSubnetIpRangeRefVO` ( DELETE FROM UserTagVO WHERE uuid = 'a4de80903e57422699fb05bd367a3cb4'; CALL ADD_COLUMN('PciDeviceSpecVO', 'allowResourceConfigWithMultipleDevices', 'tinyint(1)', 0, '1'); + +CALL ADD_COLUMN('GpuDeviceVO', 'opaque', 'MEDIUMTEXT', 1, NULL); From 76ae9589ee97281ee7a3ab847a15d081f4983f14 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Tue, 19 Aug 2025 11:41:53 +0800 Subject: [PATCH 484/737] [conf]: Introduce new column nodeRank to ModelServiceInstanceVO DBImpact Resolves: ZSTAC-76166 Change-Id: I676d6b706566616e6e7a7a7479676f666c747777 --- conf/db/upgrade/V5.3.46__schema.sql | 2 ++ .../org/zstack/sdk/ModelServiceInstanceInventory.java | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/conf/db/upgrade/V5.3.46__schema.sql b/conf/db/upgrade/V5.3.46__schema.sql index a5f7cb2d1d0..adfc6854c0b 100644 --- a/conf/db/upgrade/V5.3.46__schema.sql +++ b/conf/db/upgrade/V5.3.46__schema.sql @@ -67,3 +67,5 @@ DELETE FROM UserTagVO WHERE uuid = 'a4de80903e57422699fb05bd367a3cb4'; CALL ADD_COLUMN('PciDeviceSpecVO', 'allowResourceConfigWithMultipleDevices', 'tinyint(1)', 0, '1'); CALL ADD_COLUMN('GpuDeviceVO', 'opaque', 'MEDIUMTEXT', 1, NULL); + +CALL ADD_COLUMN('ModelServiceInstanceVO', 'nodeRank', 'int', 1, 0); diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java index 84cabea7bb8..22356ce9658 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java @@ -84,6 +84,14 @@ public java.lang.String getVmInstanceUuid() { return this.vmInstanceUuid; } + public java.lang.Integer nodeRank; + public void setNodeRank(java.lang.Integer nodeRank) { + this.nodeRank = nodeRank; + } + public java.lang.Integer getNodeRank() { + return this.nodeRank; + } + public VmInstanceInventory vm; public void setVm(VmInstanceInventory vm) { this.vm = vm; From d6858c3da4bb7e00c2d36520bdc3a29a232ea261 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 20 Aug 2025 20:49:18 +0800 Subject: [PATCH 485/737] [sdk]: Update sdk Resolves: ZSTAC-77110 Change-Id: I7066657563696c636a6363666873637262666873 --- sdk/src/main/java/org/zstack/sdk/NginxRedirectRule.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/NginxRedirectRule.java b/sdk/src/main/java/org/zstack/sdk/NginxRedirectRule.java index 8878b46441a..fe062e43956 100644 --- a/sdk/src/main/java/org/zstack/sdk/NginxRedirectRule.java +++ b/sdk/src/main/java/org/zstack/sdk/NginxRedirectRule.java @@ -44,4 +44,12 @@ public java.lang.String getCurrentJupyterUrl() { return this.currentJupyterUrl; } + public java.lang.String overriddenUuid; + public void setOverriddenUuid(java.lang.String overriddenUuid) { + this.overriddenUuid = overriddenUuid; + } + public java.lang.String getOverriddenUuid() { + return this.overriddenUuid; + } + } From 0bc9bbdd2c1d9fdc83efdf406397a6b8c3e0579a Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Thu, 21 Aug 2025 12:49:34 +0800 Subject: [PATCH 486/737] [conf]: Add GpuDeviceSpecVO to schema Update sdk DBImpact Resolves: ZSTAC-77276 Change-Id: I69667878777765706371646169657164646b6963 --- conf/db/upgrade/V5.3.46__schema.sql | 7 +++++++ sdk/src/main/java/SourceClassMap.java | 2 ++ .../sdk/GetGpuDeviceSpecCandidatesAction.java | 6 +++--- .../sdk/GetGpuDeviceSpecCandidatesResult.java | 14 ++++++++++++++ .../org/zstack/sdk/GpuDeviceSpecInventory.java | 15 +++++++++++++++ 5 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/GpuDeviceSpecInventory.java diff --git a/conf/db/upgrade/V5.3.46__schema.sql b/conf/db/upgrade/V5.3.46__schema.sql index adfc6854c0b..012960302ef 100644 --- a/conf/db/upgrade/V5.3.46__schema.sql +++ b/conf/db/upgrade/V5.3.46__schema.sql @@ -69,3 +69,10 @@ CALL ADD_COLUMN('PciDeviceSpecVO', 'allowResourceConfigWithMultipleDevices', 'ti CALL ADD_COLUMN('GpuDeviceVO', 'opaque', 'MEDIUMTEXT', 1, NULL); CALL ADD_COLUMN('ModelServiceInstanceVO', 'nodeRank', 'int', 1, 0); + +CREATE TABLE IF NOT EXISTS `zstack`.`GpuDeviceSpecVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `memory` bigint unsigned NULL DEFAULT 0, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkGpuDeviceSpecVOPciDeviceSpecVO` FOREIGN KEY (`uuid`) REFERENCES `PciDeviceSpecVO` (`uuid`) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index dabe466e277..08351fd0522 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -591,6 +591,7 @@ public class SourceClassMap { put("org.zstack.pciDevice.PciDeviceStatus", "org.zstack.sdk.PciDeviceStatus"); put("org.zstack.pciDevice.PciDeviceType", "org.zstack.sdk.PciDeviceType"); put("org.zstack.pciDevice.gpu.GpuDeviceInventory", "org.zstack.sdk.GpuDeviceInventory"); + put("org.zstack.pciDevice.gpu.GpuDeviceSpecInventory", "org.zstack.sdk.GpuDeviceSpecInventory"); put("org.zstack.pciDevice.gpu.GpuVendor", "org.zstack.sdk.GpuVendor"); put("org.zstack.pciDevice.specification.mdev.MdevDeviceSpecInventory", "org.zstack.sdk.MdevDeviceSpecInventory"); put("org.zstack.pciDevice.specification.mdev.MdevDeviceSpecState", "org.zstack.sdk.MdevDeviceSpecState"); @@ -1030,6 +1031,7 @@ public class SourceClassMap { put("org.zstack.sdk.GlobalConfigOptions", "org.zstack.core.config.GlobalConfigOptions"); put("org.zstack.sdk.GlobalConfigTemplateInventory", "org.zstack.templateConfig.GlobalConfigTemplateInventory"); put("org.zstack.sdk.GpuDeviceInventory", "org.zstack.pciDevice.gpu.GpuDeviceInventory"); + put("org.zstack.sdk.GpuDeviceSpecInventory", "org.zstack.pciDevice.gpu.GpuDeviceSpecInventory"); put("org.zstack.sdk.GpuVendor", "org.zstack.pciDevice.gpu.GpuVendor"); put("org.zstack.sdk.GuestOsCharacterInventory", "org.zstack.core.config.GuestOsCharacterInventory"); put("org.zstack.sdk.GuestToolsInventory", "org.zstack.guesttools.GuestToolsInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesAction.java b/sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesAction.java index 61c55f0b6c7..382a27fd969 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesAction.java @@ -12,7 +12,7 @@ public class GetGpuDeviceSpecCandidatesAction extends AbstractAction { public static class Result { public ErrorCode error; - public org.zstack.sdk.GetPciDeviceSpecCandidatesResult value; + public org.zstack.sdk.GetGpuDeviceSpecCandidatesResult value; public Result throwExceptionIfError() { if (error != null) { @@ -63,8 +63,8 @@ private Result makeResult(ApiResult res) { return ret; } - org.zstack.sdk.GetPciDeviceSpecCandidatesResult value = res.getResult(org.zstack.sdk.GetPciDeviceSpecCandidatesResult.class); - ret.value = value == null ? new org.zstack.sdk.GetPciDeviceSpecCandidatesResult() : value; + org.zstack.sdk.GetGpuDeviceSpecCandidatesResult value = res.getResult(org.zstack.sdk.GetGpuDeviceSpecCandidatesResult.class); + ret.value = value == null ? new org.zstack.sdk.GetGpuDeviceSpecCandidatesResult() : value; return ret; } diff --git a/sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesResult.java b/sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesResult.java new file mode 100644 index 00000000000..d4ff0e09993 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class GetGpuDeviceSpecCandidatesResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GpuDeviceSpecInventory.java b/sdk/src/main/java/org/zstack/sdk/GpuDeviceSpecInventory.java new file mode 100644 index 00000000000..24d0532f3cb --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GpuDeviceSpecInventory.java @@ -0,0 +1,15 @@ +package org.zstack.sdk; + + + +public class GpuDeviceSpecInventory extends org.zstack.sdk.PciDeviceSpecInventory { + + public java.lang.Long memory; + public void setMemory(java.lang.Long memory) { + this.memory = memory; + } + public java.lang.Long getMemory() { + return this.memory; + } + +} From 5e79da88d5fe75f0cfc98022645093125c9b91d0 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Tue, 26 Aug 2025 10:39:41 +0800 Subject: [PATCH 487/737] [conf]: Add new column supportDistributed - Update sdk DBImpact Resolves: ZSTAC-77105 Change-Id: I786d7a636a6979616668717963756f7377766367 Signed-off-by: ye.zou --- conf/db/upgrade/V5.3.46__schema.sql | 2 ++ .../main/java/org/zstack/sdk/AddModelServiceAction.java | 3 +++ .../main/java/org/zstack/sdk/CloneModelServiceAction.java | 3 +++ .../main/java/org/zstack/sdk/ModelServiceInventory.java | 8 ++++++++ .../java/org/zstack/sdk/UpdateModelServiceAction.java | 3 +++ 5 files changed, 19 insertions(+) diff --git a/conf/db/upgrade/V5.3.46__schema.sql b/conf/db/upgrade/V5.3.46__schema.sql index 012960302ef..717fc5dcf4b 100644 --- a/conf/db/upgrade/V5.3.46__schema.sql +++ b/conf/db/upgrade/V5.3.46__schema.sql @@ -76,3 +76,5 @@ CREATE TABLE IF NOT EXISTS `zstack`.`GpuDeviceSpecVO` ( PRIMARY KEY (`uuid`), CONSTRAINT `fkGpuDeviceSpecVOPciDeviceSpecVO` FOREIGN KEY (`uuid`) REFERENCES `PciDeviceSpecVO` (`uuid`) ON UPDATE RESTRICT ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CALL ADD_COLUMN('ModelServiceVO', 'supportDistributed', 'tinyint(1)', 0, 0); diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index e39532f75aa..e9466a61625 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -85,6 +85,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List architectureImages; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean supportDistributed; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java index b95850e0aeb..01c6c28abe6 100644 --- a/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java @@ -85,6 +85,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List architectureImages; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean supportDistributed; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java index e96787d185b..33beaf1a5f4 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java @@ -148,6 +148,14 @@ public java.lang.String getStartCommand() { return this.startCommand; } + public boolean supportDistributed; + public void setSupportDistributed(boolean supportDistributed) { + this.supportDistributed = supportDistributed; + } + public boolean getSupportDistributed() { + return this.supportDistributed; + } + public java.util.List cpuArchitectures; public void setCpuArchitectures(java.util.List cpuArchitectures) { this.cpuArchitectures = cpuArchitectures; diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java index 4923707e635..defc4fa5c08 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java @@ -70,6 +70,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List architectureImages; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean supportDistributed; + @Param(required = false) public java.util.List systemTags; From 08ffe856e7b7f5202380f763018183a1c405f635 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 27 Aug 2025 11:14:26 +0800 Subject: [PATCH 488/737] [sdk]: Update sdk Resolves: ZSTAC-77110 Change-Id: I78726a7268787976676567706a70636368706968 --- .../java/org/zstack/sdk/SyncAINginxConfigurationAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java b/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java index 07483f18775..d14229a47a5 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java @@ -26,7 +26,7 @@ public Result throwExceptionIfError() { } @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.util.List instanceUuids; + public java.util.List groupUuids; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Boolean dryRun; From 7906a02a2c2ccd8090fda3c1c7964839eb2b9c44 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Wed, 27 Aug 2025 14:38:06 +0800 Subject: [PATCH 489/737] [testlib]: Test controller should head request with no body Related: ZSTAC-77110 Change-Id: I6c747773707078646e617a696d72706d6e6b6678 --- .../src/main/java/org/zstack/testlib/TestLibController.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/testlib/src/main/java/org/zstack/testlib/TestLibController.java b/testlib/src/main/java/org/zstack/testlib/TestLibController.java index 8ea200aa56a..3b8ac96d5f2 100755 --- a/testlib/src/main/java/org/zstack/testlib/TestLibController.java +++ b/testlib/src/main/java/org/zstack/testlib/TestLibController.java @@ -8,6 +8,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.InvocationTargetException; +import java.util.Objects; /** * Created by xing5 on 2017/2/12. @@ -22,6 +23,11 @@ public class TestLibController { } ) public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { + if (request.getMethod().equalsIgnoreCase(RequestMethod.HEAD.toString())) { + response.setStatus(200); + return; + } + Test.handleHttp(request, response); } } From ef0435461276e8073895e3d6a0b90ea446dc8a5b Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 27 Aug 2025 18:10:49 +0800 Subject: [PATCH 490/737] [sdk]: Update sdk Resolves: ZSTAC-77139 Change-Id: I65766f6a6d7969756b6767646663616562756372 --- .../org/zstack/sdk/DeployAppDevelopmentServiceAction.java | 6 ++++++ .../org/zstack/sdk/DeployDistributedModelServiceAction.java | 6 ++++++ .../java/org/zstack/sdk/DeployModelEvalServiceAction.java | 6 ++++++ .../main/java/org/zstack/sdk/DeployModelServiceAction.java | 6 ++++++ 4 files changed, 24 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java index f5c1909699d..536310c17d3 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java @@ -85,6 +85,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Long rootDiskSize; + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceAction.java index 9639a38d5ca..82c263bde6d 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceAction.java @@ -37,6 +37,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java index 7c754df39b1..dd3c2933a19 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java @@ -136,6 +136,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Long rootDiskSize; + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java index 16779f12584..9c73bee8daa 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java @@ -85,6 +85,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Long rootDiskSize; + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + @Param(required = false) public java.util.List systemTags; From 8e6d4349c044fc7846d0d7a3c0a438ed8500dbf1 Mon Sep 17 00:00:00 2001 From: zhangjianjun Date: Mon, 19 May 2025 18:53:58 +0800 Subject: [PATCH 491/737] [virtualRouterProvider]: clean snat rule for backup vr Resolves: ZSTAC-75147 Change-Id: I61626a7a6b6d77656e6f6272797768636a707179 Signed-off-by: zhangjianjun --- conf/springConfigXml/VirtualRouter.xml | 1 + .../nat/VirtualRouterSnatBackend.java | 54 ++++++++++++++++++- 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/conf/springConfigXml/VirtualRouter.xml b/conf/springConfigXml/VirtualRouter.xml index 2ddb8e25467..b63416a09e2 100755 --- a/conf/springConfigXml/VirtualRouter.xml +++ b/conf/springConfigXml/VirtualRouter.xml @@ -179,6 +179,7 @@ + diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSnatBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSnatBackend.java index 24d851efb0a..f6a80863445 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSnatBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSnatBackend.java @@ -46,7 +46,8 @@ * To change this template use File | Settings | File Templates. */ public class VirtualRouterSnatBackend extends AbstractVirtualRouterBackend implements - NetworkServiceSnatBackend, VirtualRouterAfterAttachNicExtensionPoint, VirtualRouterBeforeDetachNicExtensionPoint { + NetworkServiceSnatBackend, VirtualRouterAfterAttachNicExtensionPoint, VirtualRouterBeforeDetachNicExtensionPoint, + VirtualRouterAfterDetachNicExtensionPoint { private static final CLogger logger = Utils.getLogger(VirtualRouterSnatBackend.class); @Autowired @@ -304,7 +305,8 @@ public void run(MessageReply reply) { String msg = String.format( "virtual router[uuid:%s, ip:%s] successfully released snat for public l3[uuid:%s]", vr.getUuid(), vr.getManagementNic().getIp(), finalNic.getL3NetworkUuid()); - app.detachNetworkService(vr.getUuid(), NetworkServiceType.SNAT.toString(), finalNic.getL3NetworkUuid()); + //has moved to afterDetachNic to avoid delete data too early + //app.detachNetworkService(vr.getUuid(), NetworkServiceType.SNAT.toString(), finalNic.getL3NetworkUuid()); logger.warn(msg); } } @@ -479,4 +481,52 @@ private Vip getVipWithSnatService(VirtualRouterVmInventory vr, VmNicInventory ni public void afterAttachNicRollback(VmNicInventory nic, NoErrorCompletion completion) { completion.done(); } + + @Override + public void afterDetachVirtualRouterNic(VmNicInventory nic, Completion completion) { + VirtualRouterVmVO vrVO = Q.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, nic.getVmInstanceUuid()).find(); + if (vrVO == null) { + completion.success(); + return; + } + final VirtualRouterVmInventory vr = VirtualRouterVmInventory.valueOf(vrVO); + ApplianceVmSubTypeFactory subTypeFactory = apvmFactory.getApplianceVmSubTypeFactory(vrVO.getApplianceVmType()); + ApplianceVm app = subTypeFactory.getSubApplianceVm(vrVO); + + if ( ! (VirtualRouterNicMetaData.isPublicNic(nic) || VirtualRouterNicMetaData.isAddinitionalPublicNic(nic))) { + completion.success(); + return; + } + + String peerVrUuid = haBackend.getVirtualRouterPeerUuid(vr.getUuid()); + if (peerVrUuid == null) { + logger.info(String.format("No peer VR found for VR[uuid:%s], detaching SNAT service for L3[uuid:%s]", + vr.getUuid(), nic.getL3NetworkUuid())); + app.detachNetworkService(vr.getUuid(), NetworkServiceType.SNAT.toString(), nic.getL3NetworkUuid()); + completion.success(); + return; + } + + VirtualRouterVmVO peerVrVO = Q.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, peerVrUuid).find(); + if (peerVrVO == null) { + logger.warn(String.format("Peer VR[uuid:%s] not found, proceeding with detach", peerVrUuid)); + app.detachNetworkService(vr.getUuid(), NetworkServiceType.SNAT.toString(), nic.getL3NetworkUuid()); + completion.success(); + return; + } + + VirtualRouterVmInventory peerVr = VirtualRouterVmInventory.valueOf(peerVrVO); + List allL3Uuids = peerVr.getAllL3Networks(); + if (allL3Uuids != null && allL3Uuids.contains(nic.getL3NetworkUuid())) { + logger.info(String.format("Peer VR[uuid:%s] still has L3[uuid:%s], skipping detach", + peerVrUuid, nic.getL3NetworkUuid())); + completion.success(); + return; + } + + logger.info(String.format("Detaching SNAT service for VR[uuid:%s] L3[uuid:%s]", + vr.getUuid(), nic.getL3NetworkUuid())); + app.detachNetworkService(vr.getUuid(), NetworkServiceType.SNAT.toString(), nic.getL3NetworkUuid()); + completion.success(); + } } From f11fcdfdfadddd354a9834bdf5db9104f660dd66 Mon Sep 17 00:00:00 2001 From: shenjin Date: Tue, 26 Aug 2025 15:22:56 +0800 Subject: [PATCH 492/737] [vm]: add default vm gpu alarm and event add default vm gpu temperature alarm and default vm gpu status abnormal event Resolves: ZSTAC-71999 Change-Id: I78746367726a676e6e617468646c6363707a7a6a --- .../zstack/header/vm/VmCanonicalEvents.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/header/src/main/java/org/zstack/header/vm/VmCanonicalEvents.java b/header/src/main/java/org/zstack/header/vm/VmCanonicalEvents.java index bde3985ce8d..e6fe6a92272 100755 --- a/header/src/main/java/org/zstack/header/vm/VmCanonicalEvents.java +++ b/header/src/main/java/org/zstack/header/vm/VmCanonicalEvents.java @@ -19,6 +19,7 @@ public class VmCanonicalEvents { public static final String VM_NIC_INFO_CHANGED_PATH = "/vm/nicinfo/change"; public static final String VM_NIC_INFO_DUPLICATE_PATH = "/vm/nicinfo/duplicate"; public static final String VM_NIC_INFO_IPRANGE_CONFLICT_PATH = "/vm/nicinfo/iprangeConflict"; + public static final String VM_GPU_STATUS_ABNORMAL = "/vm/gpu/status/abnormal"; @NeedJsonSchema public static class VmCrashReportData { @@ -317,4 +318,35 @@ public void setInternalIp(String internalIp) { this.internalIp = internalIp; } } + + @NeedJsonSchema + public static class VmGpuStatusAbnormalData { + private String vmUuid; + private String pciDeviceAddress; + private String status; + + public String getVmUuid() { + return vmUuid; + } + + public void setVmUuid(String vmUuid) { + this.vmUuid = vmUuid; + } + + public String getPciDeviceAddress() { + return pciDeviceAddress; + } + + public void setPciDeviceAddress(String pciDeviceAddress) { + this.pciDeviceAddress = pciDeviceAddress; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + } } From 83c8d89bc1b880dad21d64f3eed6f12ddefbdbfe Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Fri, 20 Jun 2025 16:22:00 +0800 Subject: [PATCH 493/737] [compute]: fix nicManager setNicDriverType Resolves: ZSTAC-75732 Change-Id: I6868776cf30600e03e664d6a9fe9147c7fa96aba --- .../main/java/org/zstack/compute/vm/VmAllocateNicFlow.java | 4 ++-- .../src/main/java/org/zstack/compute/vm/VmNicManagerImpl.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java index 2c41f63e68e..3589d8c7307 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java @@ -136,8 +136,8 @@ public void run(final FlowTrigger trigger, final Map data) { if (!StringUtils.isEmpty(nicSpec.getNicDriverType())) { nic.setDriverType(nicSpec.getNicDriverType()); } else { - boolean vmHasVirtio = VmSystemTags.VIRTIO.hasTag(spec.getVmInventory().getUuid()); - nicManager.setNicDriverType(nic, vmHasVirtio, + boolean vmImageHasVirtio = VmSystemTags.VIRTIO.hasTag(spec.getVmInventory().getUuid()); + nicManager.setNicDriverType(nic, vmImageHasVirtio, ImagePlatform.valueOf(spec.getVmInventory().getPlatform()).isParaVirtualization(), spec.getVmInventory()); } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmNicManagerImpl.java b/compute/src/main/java/org/zstack/compute/vm/VmNicManagerImpl.java index 47f05b466b5..df2bc6bcaf7 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmNicManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmNicManagerImpl.java @@ -193,7 +193,7 @@ public void vmPlatformChange(VmInstanceInventory vm, String previousPlatform, St return; } - if (ImagePlatform.valueOf(nowPlatform).isParaVirtualization()) { + if (ImagePlatform.valueOf(nowPlatform).isParaVirtualization() || VmSystemTags.VIRTIO.hasTag(vm.getUuid())) { resetVmNicDriverType(vm.getUuid(), defaultPVNicDriver); return; } @@ -266,7 +266,7 @@ public void setNicDriverType(VmNicInventory nic, boolean isImageSupportVirtIo, b return; } - if (isImageSupportVirtIo || isParaVirtualization || VmSystemTags.VIRTIO.hasTag(nic.getVmInstanceUuid())) { + if (isImageSupportVirtIo || isParaVirtualization || VmSystemTags.VIRTIO.hasTag(vm.getUuid())) { nic.setDriverType(getDefaultPVNicDriver()); } else { nic.setDriverType(getDefaultNicDriver()); From 57ca3c777fdedb2bfd5d6b59feea5c9f68534ab9 Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Fri, 20 Jun 2025 16:24:28 +0800 Subject: [PATCH 494/737] [flatNetworkProvider]: fix apply userdata fix apply userdata when vm attach none default nic Resolves: ZSTAC-75776 Change-Id: I6868776c9fbf656008d74d039ea7eb3979dde737 --- .../service/userdata/UserdataExtension.java | 50 ++++++++++--------- .../userdata/UserdataGlobalProperty.java | 3 ++ 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/userdata/UserdataExtension.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/userdata/UserdataExtension.java index 248dcfa0e57..8e75c4edd53 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/userdata/UserdataExtension.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/userdata/UserdataExtension.java @@ -4,6 +4,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; import org.zstack.header.Component; import org.zstack.header.core.Completion; import org.zstack.header.core.NoErrorCompletion; @@ -11,14 +12,15 @@ import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.network.l3.L3NetworkInventory; import org.zstack.header.network.l3.L3NetworkVO; +import org.zstack.header.network.l3.L3NetworkVO_; import org.zstack.header.network.service.*; import org.zstack.header.vm.VmInstanceSpec; +import org.zstack.header.vm.VmNicInventory; import org.zstack.header.vm.VmNicSpec; import org.zstack.network.securitygroup.SecurityGroupGetDefaultRuleExtensionPoint; import org.zstack.network.service.AbstractNetworkServiceExtension; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; -import org.zstack.utils.function.Function; import org.zstack.utils.logging.CLogger; import org.zstack.utils.network.IPv6Constants; @@ -66,14 +68,10 @@ public NetworkServiceType getNetworkServiceType() { return UserdataConstant.USERDATA_TYPE; } - private NetworkServiceProviderInventory findProvider(final VmInstanceSpec spec) { - L3NetworkInventory defaultL3 = CollectionUtils.find(VmNicSpec.getL3NetworkInventoryOfSpec(spec.getL3Networks()), - new Function() { - @Override - public L3NetworkInventory call(L3NetworkInventory arg) { - return arg.getUuid().equals(spec.getVmInventory().getDefaultL3NetworkUuid()) ? arg : null; - } - }); + private NetworkServiceProviderInventory findProvider(final L3NetworkInventory defaultL3) { + if (defaultL3 == null || defaultL3.getNetworkServices() == null) { + return null; + } for (NetworkServiceL3NetworkRefInventory ref : defaultL3.getNetworkServices()) { if (UserdataConstant.USERDATA_TYPE_STRING.equals(ref.getNetworkServiceType())) { @@ -96,12 +94,21 @@ private UserdataBackend getUserdataBackend(String providerType) { @Override public void applyNetworkService(final VmInstanceSpec servedVm, Map data, Completion completion) { L3NetworkInventory defaultL3 = CollectionUtils.find(VmNicSpec.getL3NetworkInventoryOfSpec(servedVm.getL3Networks()), - new Function() { - @Override - public L3NetworkInventory call(L3NetworkInventory arg) { - return arg.getUuid().equals(servedVm.getVmInventory().getDefaultL3NetworkUuid()) ? arg : null; + arg -> arg.getUuid().equals(servedVm.getVmInventory().getDefaultL3NetworkUuid()) ? arg : null); + VmNicInventory defaultNic = null; + if (defaultL3 == null && servedVm.getVmInventory().getDefaultL3NetworkUuid() != null && UserdataGlobalProperty.APPLY_WITH_NONE_DEFAULT_NIC) { + L3NetworkVO l3 = Q.New(L3NetworkVO.class) + .eq(L3NetworkVO_.uuid, servedVm.getVmInventory().getDefaultL3NetworkUuid()) + .find(); + if (l3 != null) { + defaultL3 = L3NetworkInventory.valueOf(l3); + final String defaultL3Uuid = defaultL3.getUuid(); + defaultNic = servedVm.getVmInventory().getVmNics().stream() + .filter(vmNic -> vmNic.getL3NetworkUuid().equals(defaultL3Uuid)) + .findFirst() + .orElse(null); } - }); + } if (defaultL3 == null) { // the L3 for operation is not the default L3 @@ -115,7 +122,7 @@ public L3NetworkInventory call(L3NetworkInventory arg) { return; } - NetworkServiceProviderInventory provider = findProvider(servedVm); + NetworkServiceProviderInventory provider = findProvider(defaultL3); if (provider == null) { completion.success(); return; @@ -125,7 +132,9 @@ public L3NetworkInventory call(L3NetworkInventory arg) { struct.setL3NetworkUuid(servedVm.getVmInventory().getDefaultL3NetworkUuid()); struct.setParametersFromVmSpec(servedVm); struct.setUserdataList(servedVm.getUserdataList()); - + if (defaultNic != null) { + struct.getVmNics().add(defaultNic); + } UserdataBackend bkd = getUserdataBackend(provider.getType()); bkd.applyUserdata(struct, completion); } @@ -144,12 +153,7 @@ public List getGroupMembers(String sgUuid, int ipVersion) { @Override public void releaseNetworkService(final VmInstanceSpec servedVm, Map data, final NoErrorCompletion completion) { L3NetworkInventory defaultL3 = CollectionUtils.find(VmNicSpec.getL3NetworkInventoryOfSpec(servedVm.getL3Networks()), - new Function() { - @Override - public L3NetworkInventory call(L3NetworkInventory arg) { - return arg.getUuid().equals(servedVm.getVmInventory().getDefaultL3NetworkUuid()) ? arg : null; - } - }); + arg -> arg.getUuid().equals(servedVm.getVmInventory().getDefaultL3NetworkUuid()) ? arg : null); if (!Optional.ofNullable(servedVm.getDestHost()).isPresent()){ completion.done(); return; @@ -166,7 +170,7 @@ public L3NetworkInventory call(L3NetworkInventory arg) { return; } - NetworkServiceProviderInventory provider = findProvider(servedVm); + NetworkServiceProviderInventory provider = findProvider(defaultL3); if (provider == null) { completion.done(); return; diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/userdata/UserdataGlobalProperty.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/userdata/UserdataGlobalProperty.java index 50bbd0c6862..c6d8e4edad2 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/userdata/UserdataGlobalProperty.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/userdata/UserdataGlobalProperty.java @@ -10,4 +10,7 @@ public class UserdataGlobalProperty { @GlobalProperty(name="Userdata.hostPort", defaultValue = "1180") public static int HOST_PORT; + + @GlobalProperty(name="Userdata.applyWithNoneDefaultNic", defaultValue = "false") + public static boolean APPLY_WITH_NONE_DEFAULT_NIC; } From 9ac521f1822216e86ecf19c808ae4a3c828c2f95 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Thu, 4 Sep 2025 17:26:08 +0800 Subject: [PATCH 495/737] [root]: bump version to 5.4.0 Change-Id: I7a7670696e696f706e697864656f77636f746270 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 5e37b24bb9b..0d1081b0fe6 100755 --- a/VERSION +++ b/VERSION @@ -1,3 +1,3 @@ MAJOR=5 -MINOR=3 -UPDATE=40 +MINOR=4 +UPDATE=0 From f929443266e8b4e35e1dfc4f9035f715d1c8f103 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Thu, 4 Sep 2025 18:45:05 +0800 Subject: [PATCH 496/737] [ceph]: correct backup param Change-Id: I776370656a6b707279747a666b7362767a6d6a67 --- .../org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java | 2 +- .../zstack/storage/primary/local/LocalStorageKvmBackend.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java index 9f9e40e5c50..ab44a21e827 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java @@ -2261,7 +2261,7 @@ private void createFromVolumeSnapshot(FlowTrigger trigger) { cmd.srcPath = snapshot.getPrimaryStorageInstallPath(); cmd.dstPath = dstPath; cmd.shareable = false; - httpCall(CP_PATH, cmd, CpRsp.class, new ReturnValueCompletion(completion) { + httpCall(CP_PATH, cmd, CpRsp.class, new ReturnValueCompletion(trigger) { @Override public void success(CpRsp rsp) { if (rsp.actualSize != null) { diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java index b26c23e1f6c..cc2bd2caf69 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java @@ -2196,7 +2196,7 @@ public void run(FlowTrigger trigger, Map data) { cmd.imagePath = makeCachedImageInstallUrlFromImageUuidForTemplate(msg.getVolume().getRootImageUuid()); cmd.volumePath = makeRootVolumeInstallUrl(msg.getVolume()); - httpCall(REINIT_IMAGE_PATH, hostUuid, cmd, ReinitImageRsp.class, new ReturnValueCompletion(completion) { + httpCall(REINIT_IMAGE_PATH, hostUuid, cmd, ReinitImageRsp.class, new ReturnValueCompletion(trigger) { @Override public void success(ReinitImageRsp rsp) { reply.setNewVolumeInstallPath(rsp.getNewVolumeInstallPath()); From ef050e8e4188a13458bf4a4b8f9dde0d791e7baa Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Wed, 28 May 2025 04:54:01 -0400 Subject: [PATCH 497/737] [sso]: migrate sso config storage from SystemTagVO to AttributesVO MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolves: ZSTAC-74198 Change-Id: I637a74198f696e77766377626f78647269707470 [sdk]: support pushing user data to Keycloak Resolves: ZSTAC-74189 Change-Id: I7375741896676741897574646678757a7a7a7578 [iam2]: multe region adapter 1、APICreateAccountMsg support set `type` 2、APICreateIAM2VirtualIDMsg support set `type` 3、APICreateIAM2VirtualIDMsg.attributes support set `uuid` 4、APICreateIAM2OrganizationMsg.attributes support set `uuid` 5、APICreateIAM2VirtualIDGroupMsg.attributes support set `uuid` 6、APICreateIAM2ProjectMsg.attributes support set `uuid` Resolves: ZSTAC-74189 Change-Id: I62726d7a736b67706b6176726d75636568677068 [sdk]: sdk add morph flag Resolves: ZSTAC-74189 Change-Id: I656b6d6c6c72687a6669616864736361637a7475 [sdk]: sdk add morph flag 2 Resolves: ZSTAC-74189 Change-Id: I717a756d6c6f75726d74716d6c707063666d786e [iam2]: CreateIAM2ProjectFromTemplate add params `linkAccountUuid` Resolves: ZSTAC-74189 Change-Id: I6370787a6865776c616e7665796364666e716b71 [iam2]: CreateIAM2Project add params `linkAccountUuid` Resolves: ZSTAC-74189 Change-Id: I6a717564676d63647379797177746a796f646e61 [iam2]: SetIAM2ProjectLoginExpired add params `loginExpiredAttributeUuid` Resolves: ZSTAC-74189 Change-Id: I756a6967636463777775617a636c79617a676774 --- conf/db/upgrade/V5.4.0__schema.sql | 15 ++- .../java/org/zstack/header/Constants.java | 3 + .../header/identity/APICreateAccountMsg.java | 6 +- .../header/identity/APICreatePolicyMsg.java | 4 +- .../header/identity/APIDeleteAccountMsg.java | 6 +- .../header/identity/APIDeletePolicyMsg.java | 6 +- .../header/identity/APIUpdateAccountMsg.java | 4 +- .../header/identity/APIUpdateQuotaMsg.java | 4 +- .../role/api/APIAttachRoleToAccountMsg.java | 4 +- .../identity/role/api/APICreateRoleMsg.java | 3 +- .../identity/role/api/APIDeleteRoleMsg.java | 4 +- .../role/api/APIDetachRoleFromAccountMsg.java | 7 +- .../identity/role/api/APIUpdateRoleMsg.java | 4 +- .../org/zstack/header/rest/RestRequest.java | 1 + .../APIUpdateResourceConfigMsg.java | 4 +- .../resources/scripts/SdkApiTemplate.groovy | 4 +- sdk/src/main/java/SourceClassMap.java | 8 ++ .../java/org/zstack/sdk/AttributePurpose.java | 7 ++ .../org/zstack/sdk/CreateAccountAction.java | 3 +- .../org/zstack/sdk/CreateCasClientAction.java | 3 + .../zstack/sdk/CreateOAuthClientAction.java | 3 + .../org/zstack/sdk/CreatePolicyAction.java | 1 + .../org/zstack/sdk/DeleteAccountAction.java | 1 + .../org/zstack/sdk/DeletePolicyAction.java | 1 + .../DetachPriceTableFromAccountAction.java | 1 + .../org/zstack/sdk/ExtendedAttribute.java | 23 ++++ .../main/java/org/zstack/sdk/RestInfo.java | 1 + .../org/zstack/sdk/RuleAttributeType.java | 6 + .../sdk/SSOClientAttributeInventory.java | 72 ++++++++++++ .../org/zstack/sdk/SSOClientInventory.java | 8 ++ .../zstack/sdk/SsoClientPushDataAction.java | 107 +++++++++++++++++ .../zstack/sdk/SsoClientPushDataResult.java | 7 ++ .../org/zstack/sdk/UpdateAccountAction.java | 1 + .../org/zstack/sdk/UpdateQuotaAction.java | 1 + .../sdk/UpdateResourceConfigAction.java | 1 + .../sdk/UpdateSSOClientAttributeAction.java | 110 ++++++++++++++++++ .../sdk/UpdateSSOClientAttributeResult.java | 14 +++ ...AddAttributesToIAM2OrganizationAction.java | 1 + .../api/AddAttributesToIAM2ProjectAction.java | 1 + .../AddAttributesToIAM2VirtualIDAction.java | 1 + ...dAttributesToIAM2VirtualIDGroupAction.java | 1 + ...AddIAM2VirtualIDGroupToProjectsAction.java | 1 + .../api/AddIAM2VirtualIDsToGroupAction.java | 1 + ...AddIAM2VirtualIDsToOrganizationAction.java | 1 + .../api/AddIAM2VirtualIDsToProjectAction.java | 1 + .../AddIAM2VirtualIDsToProjectsAction.java | 1 + .../api/AddRolesToIAM2VirtualIDAction.java | 1 + .../AddRolesToIAM2VirtualIDGroupAction.java | 1 + ...chIAM2ProjectToIAM2OrganizationAction.java | 1 + .../org/zstack/sdk/iam2/api/Attribute.java | 8 ++ ...eateIAM2VirtualIDFromConfigFileAction.java | 1 + .../ChangeIAM2OrganizationParentAction.java | 1 + .../ChangeIAM2OrganizationStateAction.java | 1 + .../api/ChangeIAM2ProjectStateAction.java | 1 + .../ChangeIAM2VirtualIDGroupStateAction.java | 1 + .../api/ChangeIAM2VirtualIDStateAction.java | 1 + .../api/ChangeIAM2VirtualIDTypeAction.java | 1 + .../CheckIAM2VirtualIDConfigFileAction.java | 1 + .../api/CreateIAM2OrganizationAction.java | 1 + .../sdk/iam2/api/CreateIAM2ProjectAction.java | 4 + .../CreateIAM2ProjectFromTemplateAction.java | 4 + .../iam2/api/CreateIAM2ProjectRoleAction.java | 1 + .../api/CreateIAM2ProjectTemplateAction.java | 1 + ...eIAM2ProjectTemplateFromProjectAction.java | 1 + .../iam2/api/CreateIAM2VirtualIDAction.java | 4 + .../api/CreateIAM2VirtualIDGroupAction.java | 1 + .../api/DeleteIAM2OrganizationAction.java | 1 + .../sdk/iam2/api/DeleteIAM2ProjectAction.java | 1 + .../api/DeleteIAM2ProjectTemplateAction.java | 1 + .../iam2/api/DeleteIAM2VirtualIDAction.java | 1 + .../api/DeleteIAM2VirtualIDGroupAction.java | 1 + ...IAM2ProjectFromIAM2OrganizationAction.java | 1 + .../iam2/api/ExpungeIAM2ProjectAction.java | 1 + .../iam2/api/RecoverIAM2ProjectAction.java | 1 + ...eAttributesFromIAM2OrganizationAction.java | 1 + ...RemoveAttributesFromIAM2ProjectAction.java | 1 + ...moveAttributesFromIAM2VirtualIDAction.java | 1 + ...ttributesFromIAM2VirtualIDGroupAction.java | 1 + .../RemoveIAM2ProjectLoginExpiredAction.java | 1 + ...eIAM2VirtualIDGroupFromProjectsAction.java | 1 + .../RemoveIAM2VirtualIDsFromGroupAction.java | 1 + ...eIAM2VirtualIDsFromOrganizationAction.java | 1 + ...RemoveIAM2VirtualIDsFromProjectAction.java | 1 + ...emoveIAM2VirtualIDsFromProjectsAction.java | 1 + .../RemoveRolesFromIAM2VirtualIDAction.java | 1 + ...moveRolesFromIAM2VirtualIDGroupAction.java | 1 + .../api/SetIAM2ProjectLoginExpiredAction.java | 4 + .../api/SetIAM2ProjectRetirePolicyAction.java | 1 + .../api/SetOrganizationOperationAction.java | 1 + .../api/SetOrganizationSupervisorAction.java | 1 + .../api/UpdateIAM2OrganizationAction.java | 1 + ...UpdateIAM2OrganizationAttributeAction.java | 1 + .../sdk/iam2/api/UpdateIAM2ProjectAction.java | 1 + .../api/UpdateIAM2ProjectAttributeAction.java | 1 + .../api/UpdateIAM2ProjectTemplateAction.java | 1 + .../iam2/api/UpdateIAM2VirtualIDAction.java | 1 + .../UpdateIAM2VirtualIDAttributeAction.java | 1 + .../api/UpdateIAM2VirtualIDGroupAction.java | 1 + ...dateIAM2VirtualIDGroupAttributeAction.java | 1 + .../api/UpdateOrganizationQuotaAction.java | 1 + .../role/api/AttachRoleToAccountAction.java | 1 + .../identity/role/api/CreateRoleAction.java | 1 + .../identity/role/api/DeleteRoleAction.java | 1 + .../role/api/DetachRoleFromAccountAction.java | 1 + .../identity/role/api/UpdateRoleAction.java | 1 + .../java/org/zstack/testlib/ApiHelper.groovy | 54 +++++++++ 106 files changed, 574 insertions(+), 25 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/AttributePurpose.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ExtendedAttribute.java create mode 100644 sdk/src/main/java/org/zstack/sdk/RuleAttributeType.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SSOClientAttributeInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SsoClientPushDataAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SsoClientPushDataResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateSSOClientAttributeAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateSSOClientAttributeResult.java diff --git a/conf/db/upgrade/V5.4.0__schema.sql b/conf/db/upgrade/V5.4.0__schema.sql index 2b2a053d1ff..fae7e91ab8f 100644 --- a/conf/db/upgrade/V5.4.0__schema.sql +++ b/conf/db/upgrade/V5.4.0__schema.sql @@ -1,3 +1,16 @@ +CREATE TABLE `SSOClientAttributeVO` ( + `uuid` VARCHAR(32) NOT NULL, + `name` TEXT NOT NULL, + `value` TEXT DEFAULT NULL, + `type` VARCHAR(32) NOT NULL, + `purpose` VARCHAR(32) NOT NULL, + `ssoClientUuid` VARCHAR(32) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`), + CONSTRAINT `fkSSOClientAttributeVOSSOClientVO` FOREIGN KEY (`ssoClientUuid`) REFERENCES SSOClientVO (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + CREATE TABLE `zstack`.`L3NetworkSequenceNumberVO` ( `id` int unsigned NOT NULL UNIQUE AUTO_INCREMENT, PRIMARY KEY (`id`) @@ -28,4 +41,4 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ImageGroupRefVO` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE SecurityGroupRuleVO MODIFY COLUMN `dstPortRange` varchar(1024) DEFAULT NULL; -ALTER TABLE SecurityGroupRuleVO MODIFY COLUMN `srcPortRange` varchar(1024) DEFAULT NULL; \ No newline at end of file +ALTER TABLE SecurityGroupRuleVO MODIFY COLUMN `srcPortRange` varchar(1024) DEFAULT NULL; diff --git a/header/src/main/java/org/zstack/header/Constants.java b/header/src/main/java/org/zstack/header/Constants.java index c132492270d..071b394b900 100755 --- a/header/src/main/java/org/zstack/header/Constants.java +++ b/header/src/main/java/org/zstack/header/Constants.java @@ -16,4 +16,7 @@ public interface Constants { String CATEGORY_METADATA = "metadata"; String UUID_FOR_EXAMPLE = "UUID_FOR_EXAMPLE"; + + String MORPH_TRANSFORM_IAM1 = "IAM1"; + String MORPH_TRANSFORM_IAM2 = "IAM2"; } diff --git a/header/src/main/java/org/zstack/header/identity/APICreateAccountMsg.java b/header/src/main/java/org/zstack/header/identity/APICreateAccountMsg.java index ac06c354534..ca1433f18ae 100755 --- a/header/src/main/java/org/zstack/header/identity/APICreateAccountMsg.java +++ b/header/src/main/java/org/zstack/header/identity/APICreateAccountMsg.java @@ -1,6 +1,7 @@ package org.zstack.header.identity; import org.springframework.http.HttpMethod; +import org.zstack.header.Constants; import org.zstack.header.log.NoLogging; import org.zstack.header.message.APICreateMessage; import org.zstack.header.message.APIEvent; @@ -13,7 +14,8 @@ path = "/accounts", method = HttpMethod.POST, parameterName = "params", - responseClass = APICreateAccountEvent.class + responseClass = APICreateAccountEvent.class, + morphTransform = Constants.MORPH_TRANSFORM_IAM1 ) public class APICreateAccountMsg extends APICreateMessage implements APIAuditor { @APIParam(maxLength = 255) @@ -21,7 +23,7 @@ public class APICreateAccountMsg extends APICreateMessage implements APIAuditor @APIParam(maxLength = 255, password = true) @NoLogging private String password; - @APIParam(validValues = {"SystemAdmin", "Normal"}, required = false) + @APIParam(validValues = {"SystemAdmin", "Normal", "ThirdParty"}, required = false) private String type; @APIParam(maxLength = 2048, required = false) private String description; diff --git a/header/src/main/java/org/zstack/header/identity/APICreatePolicyMsg.java b/header/src/main/java/org/zstack/header/identity/APICreatePolicyMsg.java index 88dde9a9277..af30ad57792 100755 --- a/header/src/main/java/org/zstack/header/identity/APICreatePolicyMsg.java +++ b/header/src/main/java/org/zstack/header/identity/APICreatePolicyMsg.java @@ -1,6 +1,7 @@ package org.zstack.header.identity; import org.springframework.http.HttpMethod; +import org.zstack.header.Constants; import org.zstack.header.message.APICreateMessage; import org.zstack.header.message.APIEvent; import org.zstack.header.message.APIMessage; @@ -17,7 +18,8 @@ path = "/accounts/policies", method = HttpMethod.POST, responseClass = APICreatePolicyEvent.class, - parameterName = "params" + parameterName = "params", + morphTransform = Constants.MORPH_TRANSFORM_IAM1 ) public class APICreatePolicyMsg extends APICreateMessage implements AccountMessage, APIAuditor { @APIParam(maxLength = 255) diff --git a/header/src/main/java/org/zstack/header/identity/APIDeleteAccountMsg.java b/header/src/main/java/org/zstack/header/identity/APIDeleteAccountMsg.java index 6a95307a1cd..7f7dddbd901 100755 --- a/header/src/main/java/org/zstack/header/identity/APIDeleteAccountMsg.java +++ b/header/src/main/java/org/zstack/header/identity/APIDeleteAccountMsg.java @@ -1,9 +1,8 @@ package org.zstack.header.identity; import org.springframework.http.HttpMethod; +import org.zstack.header.Constants; import org.zstack.header.message.APIDeleteMessage; -import org.zstack.header.message.APIEvent; -import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; import org.zstack.header.rest.RestRequest; @@ -14,7 +13,8 @@ @RestRequest( path = "/accounts/{uuid}", method = HttpMethod.DELETE, - responseClass = APIDeleteAccountEvent.class + responseClass = APIDeleteAccountEvent.class, + morphTransform = Constants.MORPH_TRANSFORM_IAM1 ) public class APIDeleteAccountMsg extends APIDeleteMessage implements AccountMessage { @APIParam(resourceType = AccountVO.class, successIfResourceNotExisting = true) diff --git a/header/src/main/java/org/zstack/header/identity/APIDeletePolicyMsg.java b/header/src/main/java/org/zstack/header/identity/APIDeletePolicyMsg.java index 6fcd8f91217..b5338ec0126 100755 --- a/header/src/main/java/org/zstack/header/identity/APIDeletePolicyMsg.java +++ b/header/src/main/java/org/zstack/header/identity/APIDeletePolicyMsg.java @@ -1,9 +1,8 @@ package org.zstack.header.identity; import org.springframework.http.HttpMethod; +import org.zstack.header.Constants; import org.zstack.header.message.APIDeleteMessage; -import org.zstack.header.message.APIEvent; -import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; import org.zstack.header.rest.RestRequest; @@ -14,7 +13,8 @@ @RestRequest( path = "/accounts/policies/{uuid}", method = HttpMethod.DELETE, - responseClass = APIDeletePolicyEvent.class + responseClass = APIDeletePolicyEvent.class, + morphTransform = Constants.MORPH_TRANSFORM_IAM1 ) public class APIDeletePolicyMsg extends APIDeleteMessage implements AccountMessage { @APIParam(resourceType = PolicyVO.class, successIfResourceNotExisting = true) diff --git a/header/src/main/java/org/zstack/header/identity/APIUpdateAccountMsg.java b/header/src/main/java/org/zstack/header/identity/APIUpdateAccountMsg.java index d60053a40a9..15b33ee87c0 100755 --- a/header/src/main/java/org/zstack/header/identity/APIUpdateAccountMsg.java +++ b/header/src/main/java/org/zstack/header/identity/APIUpdateAccountMsg.java @@ -1,6 +1,7 @@ package org.zstack.header.identity; import org.springframework.http.HttpMethod; +import org.zstack.header.Constants; import org.zstack.header.log.NoLogging; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; @@ -13,7 +14,8 @@ path = "/accounts/{uuid}", method = HttpMethod.PUT, isAction = true, - responseClass = APIUpdateAccountEvent.class + responseClass = APIUpdateAccountEvent.class, + morphTransform = Constants.MORPH_TRANSFORM_IAM1 ) public class APIUpdateAccountMsg extends APIMessage implements AccountMessage, Serializable { @APIParam(resourceType = AccountVO.class, checkAccount = true, operationTarget = true) diff --git a/header/src/main/java/org/zstack/header/identity/APIUpdateQuotaMsg.java b/header/src/main/java/org/zstack/header/identity/APIUpdateQuotaMsg.java index d111fa4fbca..bac63de35a3 100755 --- a/header/src/main/java/org/zstack/header/identity/APIUpdateQuotaMsg.java +++ b/header/src/main/java/org/zstack/header/identity/APIUpdateQuotaMsg.java @@ -1,6 +1,7 @@ package org.zstack.header.identity; import org.springframework.http.HttpMethod; +import org.zstack.header.Constants; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; import org.zstack.header.rest.APINoSee; @@ -13,7 +14,8 @@ path = "/accounts/quotas/actions", responseClass = APIUpdateQuotaEvent.class, isAction = true, - method = HttpMethod.PUT + method = HttpMethod.PUT, + morphTransform = Constants.MORPH_TRANSFORM_IAM1 ) public class APIUpdateQuotaMsg extends APIMessage implements AccountMessage { @APIParam(resourceType = AccountVO.class) diff --git a/header/src/main/java/org/zstack/header/identity/role/api/APIAttachRoleToAccountMsg.java b/header/src/main/java/org/zstack/header/identity/role/api/APIAttachRoleToAccountMsg.java index 4bbc3a1b4cb..872f4001c8f 100755 --- a/header/src/main/java/org/zstack/header/identity/role/api/APIAttachRoleToAccountMsg.java +++ b/header/src/main/java/org/zstack/header/identity/role/api/APIAttachRoleToAccountMsg.java @@ -1,6 +1,7 @@ package org.zstack.header.identity.role.api; import org.springframework.http.HttpMethod; +import org.zstack.header.Constants; import org.zstack.header.identity.AccountVO; import org.zstack.header.identity.role.RoleVO; import org.zstack.header.message.APIMessage; @@ -11,7 +12,8 @@ path = "/identities/accounts/{accountUuid}/roles/{roleUuid}", method = HttpMethod.POST, parameterName = "params", - responseClass = APIAttachRoleToAccountEvent.class + responseClass = APIAttachRoleToAccountEvent.class, + morphTransform = Constants.MORPH_TRANSFORM_IAM1 ) public class APIAttachRoleToAccountMsg extends APIMessage implements RoleMessage { @APIParam(resourceType = RoleVO.class) diff --git a/header/src/main/java/org/zstack/header/identity/role/api/APICreateRoleMsg.java b/header/src/main/java/org/zstack/header/identity/role/api/APICreateRoleMsg.java index 5ec25b5eb40..e681b1781cc 100755 --- a/header/src/main/java/org/zstack/header/identity/role/api/APICreateRoleMsg.java +++ b/header/src/main/java/org/zstack/header/identity/role/api/APICreateRoleMsg.java @@ -1,6 +1,7 @@ package org.zstack.header.identity.role.api; import org.springframework.http.HttpMethod; +import org.zstack.header.Constants; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.PolicyVO; @@ -12,7 +13,7 @@ import static java.util.Arrays.asList; -@RestRequest(path = "/identities/roles", method = HttpMethod.POST, responseClass = APICreateRoleEvent.class, parameterName = "params") +@RestRequest(path = "/identities/roles", method = HttpMethod.POST, responseClass = APICreateRoleEvent.class, parameterName = "params", morphTransform = Constants.MORPH_TRANSFORM_IAM2) public class APICreateRoleMsg extends APICreateMessage { @APIParam(maxLength = 255) private String name; diff --git a/header/src/main/java/org/zstack/header/identity/role/api/APIDeleteRoleMsg.java b/header/src/main/java/org/zstack/header/identity/role/api/APIDeleteRoleMsg.java index 480ca3f8f0f..9f5db41b10e 100755 --- a/header/src/main/java/org/zstack/header/identity/role/api/APIDeleteRoleMsg.java +++ b/header/src/main/java/org/zstack/header/identity/role/api/APIDeleteRoleMsg.java @@ -1,13 +1,13 @@ package org.zstack.header.identity.role.api; import org.springframework.http.HttpMethod; +import org.zstack.header.Constants; import org.zstack.header.identity.role.RoleVO; import org.zstack.header.message.APIDeleteMessage; import org.zstack.header.message.APIParam; -import org.zstack.header.network.l3.APIAddDnsToL3NetworkMsg; import org.zstack.header.rest.RestRequest; -@RestRequest(path = "/identities/roles/{uuid}", method = HttpMethod.DELETE, responseClass = APIDeleteRoleEvent.class) +@RestRequest(path = "/identities/roles/{uuid}", method = HttpMethod.DELETE, responseClass = APIDeleteRoleEvent.class, morphTransform = Constants.MORPH_TRANSFORM_IAM2) public class APIDeleteRoleMsg extends APIDeleteMessage implements RoleMessage { @APIParam(resourceType = RoleVO.class, successIfResourceNotExisting = true) private String uuid; diff --git a/header/src/main/java/org/zstack/header/identity/role/api/APIDetachRoleFromAccountMsg.java b/header/src/main/java/org/zstack/header/identity/role/api/APIDetachRoleFromAccountMsg.java index 2b53ed34b1f..319ec0d6a98 100755 --- a/header/src/main/java/org/zstack/header/identity/role/api/APIDetachRoleFromAccountMsg.java +++ b/header/src/main/java/org/zstack/header/identity/role/api/APIDetachRoleFromAccountMsg.java @@ -1,15 +1,12 @@ package org.zstack.header.identity.role.api; import org.springframework.http.HttpMethod; -import org.zstack.header.identity.AccountVO; -import org.zstack.header.identity.role.RoleStateEvent; -import org.zstack.header.identity.role.RoleVO; +import org.zstack.header.Constants; import org.zstack.header.message.APIDeleteMessage; -import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; import org.zstack.header.rest.RestRequest; -@RestRequest(path = "/identities/accounts/{accountUuid}/roles/{roleUuid}", method = HttpMethod.DELETE, responseClass = APIDetachRoleFromAccountEvent.class) +@RestRequest(path = "/identities/accounts/{accountUuid}/roles/{roleUuid}", method = HttpMethod.DELETE, responseClass = APIDetachRoleFromAccountEvent.class, morphTransform = Constants.MORPH_TRANSFORM_IAM1) public class APIDetachRoleFromAccountMsg extends APIDeleteMessage implements RoleMessage { @APIParam private String roleUuid; diff --git a/header/src/main/java/org/zstack/header/identity/role/api/APIUpdateRoleMsg.java b/header/src/main/java/org/zstack/header/identity/role/api/APIUpdateRoleMsg.java index 4fbfa50ebdf..9064e8d56a9 100644 --- a/header/src/main/java/org/zstack/header/identity/role/api/APIUpdateRoleMsg.java +++ b/header/src/main/java/org/zstack/header/identity/role/api/APIUpdateRoleMsg.java @@ -1,6 +1,7 @@ package org.zstack.header.identity.role.api; import org.springframework.http.HttpMethod; +import org.zstack.header.Constants; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.PolicyVO; import org.zstack.header.identity.PolicyStatementEffect; @@ -18,7 +19,8 @@ @RestRequest(path = "/identities/roles/{uuid}/actions", method = HttpMethod.PUT, isAction = true, - responseClass = APIUpdateRoleEvent.class) + responseClass = APIUpdateRoleEvent.class, + morphTransform = Constants.MORPH_TRANSFORM_IAM1) public class APIUpdateRoleMsg extends APIMessage implements RoleMessage { @APIParam(resourceType = RoleVO.class) private String uuid; diff --git a/header/src/main/java/org/zstack/header/rest/RestRequest.java b/header/src/main/java/org/zstack/header/rest/RestRequest.java index d606b570170..e2e062e4624 100755 --- a/header/src/main/java/org/zstack/header/rest/RestRequest.java +++ b/header/src/main/java/org/zstack/header/rest/RestRequest.java @@ -21,4 +21,5 @@ String[] mappingFields() default {}; Class responseClass(); String category() default ""; + String morphTransform() default ""; } diff --git a/resourceconfig/src/main/java/org/zstack/resourceconfig/APIUpdateResourceConfigMsg.java b/resourceconfig/src/main/java/org/zstack/resourceconfig/APIUpdateResourceConfigMsg.java index 2b1daa04244..6b502c5e18d 100644 --- a/resourceconfig/src/main/java/org/zstack/resourceconfig/APIUpdateResourceConfigMsg.java +++ b/resourceconfig/src/main/java/org/zstack/resourceconfig/APIUpdateResourceConfigMsg.java @@ -2,6 +2,7 @@ import org.springframework.http.HttpMethod; import org.zstack.core.Platform; +import org.zstack.header.Constants; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; import org.zstack.header.rest.RestRequest; @@ -10,7 +11,8 @@ @RestRequest(path = "/resource-configurations/{category}/{name}/{resourceUuid}/actions", method = HttpMethod.PUT, isAction = true, - responseClass = APIUpdateResourceConfigEvent.class) + responseClass = APIUpdateResourceConfigEvent.class, + morphTransform = Constants.MORPH_TRANSFORM_IAM2) public class APIUpdateResourceConfigMsg extends APIMessage implements ResourceConfigMessage { @APIParam private String category; diff --git a/rest/src/main/resources/scripts/SdkApiTemplate.groovy b/rest/src/main/resources/scripts/SdkApiTemplate.groovy index eeb6d64c58c..7ff5e238cee 100755 --- a/rest/src/main/resources/scripts/SdkApiTemplate.groovy +++ b/rest/src/main/resources/scripts/SdkApiTemplate.groovy @@ -284,7 +284,9 @@ class SdkApiTemplate implements SdkTemplate { info.path = "${path}"; info.needSession = ${!apiMessageClass.isAnnotationPresent(SuppressCredentialCheck.class)}; info.needPoll = ${!APISyncCallMessage.class.isAssignableFrom(apiMessageClass)}; - info.parameterName = "${requestAnnotation.isAction() ? StringUtils.uncapitalize(normalizeApiName()) : requestAnnotation.parameterName()}"; + info.parameterName = "${requestAnnotation.isAction() ? StringUtils.uncapitalize(normalizeApiName()) : requestAnnotation.parameterName()}";\ +${requestAnnotation.morphTransform() ? """ + info.morphTransform = \"${requestAnnotation.morphTransform()}\";""" : ""} return info; } """) diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index a48db1bdab6..7ceb7a95a33 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -647,11 +647,15 @@ public class SourceClassMap { put("org.zstack.sns.platform.universalsms.supplier.emay.SNSEmaySmsEndpointInventory", "org.zstack.sdk.sns.platform.universalsms.supplier.emay.SNSEmaySmsEndpointInventory"); put("org.zstack.sns.platform.wecom.SNSWeComAtPersonInventory", "org.zstack.sdk.sns.platform.wecom.SNSWeComAtPersonInventory"); put("org.zstack.sns.platform.wecom.SNSWeComEndpointInventory", "org.zstack.sdk.sns.platform.wecom.SNSWeComEndpointInventory"); + put("org.zstack.sso.header.AttributePurpose", "org.zstack.sdk.AttributePurpose"); put("org.zstack.sso.header.CasClientInventory", "org.zstack.sdk.CasClientInventory"); put("org.zstack.sso.header.CasState", "org.zstack.sdk.CasState"); + put("org.zstack.sso.header.ExtendedAttribute", "org.zstack.sdk.ExtendedAttribute"); put("org.zstack.sso.header.OAuth2ClientInventory", "org.zstack.sdk.OAuth2ClientInventory"); put("org.zstack.sso.header.OAuth2TokenInventory", "org.zstack.sdk.OAuth2TokenInventory"); put("org.zstack.sso.header.RedirectUrlTemplate", "org.zstack.sdk.RedirectUrlTemplate"); + put("org.zstack.sso.header.RuleAttributeType", "org.zstack.sdk.RuleAttributeType"); + put("org.zstack.sso.header.SSOClientAttributeInventory", "org.zstack.sdk.SSOClientAttributeInventory"); put("org.zstack.sso.header.SSOClientInventory", "org.zstack.sdk.SSOClientInventory"); put("org.zstack.sso.header.SSORedirectTemplateInventory", "org.zstack.sdk.SSORedirectTemplateInventory"); put("org.zstack.sso.header.SSOServerTokenInventory", "org.zstack.sdk.SSOServerTokenInventory"); @@ -872,6 +876,7 @@ public class SourceClassMap { put("org.zstack.sdk.ApplianceVmInventory", "org.zstack.appliancevm.ApplianceVmInventory"); put("org.zstack.sdk.ApplicationDevelopmentServiceInventory", "org.zstack.ai.entity.ApplicationDevelopmentServiceInventory"); put("org.zstack.sdk.AttachTagResult", "org.zstack.tag2.AttachTagResult"); + put("org.zstack.sdk.AttributePurpose", "org.zstack.sso.header.AttributePurpose"); put("org.zstack.sdk.AuditData", "org.zstack.header.zwatch.AuditData"); put("org.zstack.sdk.AuditDataV1", "org.zstack.header.zwatch.AuditDataV1"); put("org.zstack.sdk.AuditDataV2", "org.zstack.header.zwatch.AuditDataV2"); @@ -999,6 +1004,7 @@ public class SourceClassMap { put("org.zstack.sdk.EthernetVfStatus", "org.zstack.header.sriov.EthernetVfStatus"); put("org.zstack.sdk.EventLogInventory", "org.zstack.core.eventlog.EventLogInventory"); put("org.zstack.sdk.ExponBlockVolumeInventory", "org.zstack.header.volume.block.ExponBlockVolumeInventory"); + put("org.zstack.sdk.ExtendedAttribute", "org.zstack.sso.header.ExtendedAttribute"); put("org.zstack.sdk.ExternalBackupInventory", "org.zstack.externalbackup.ExternalBackupInventory"); put("org.zstack.sdk.ExternalBackupState", "org.zstack.externalbackup.ExternalBackupState"); put("org.zstack.sdk.ExternalBackupStorageInventory", "org.zstack.header.storage.addon.backup.ExternalBackupStorageInventory"); @@ -1316,8 +1322,10 @@ public class SourceClassMap { put("org.zstack.sdk.RootVolumeSpending", "org.zstack.billing.spendingcalculator.volume.root.RootVolumeSpending"); put("org.zstack.sdk.RootVolumeSpendingInventory", "org.zstack.billing.spendingcalculator.volume.root.RootVolumeSpendingInventory"); put("org.zstack.sdk.RouterAreaInventory", "org.zstack.header.protocol.RouterAreaInventory"); + put("org.zstack.sdk.RuleAttributeType", "org.zstack.sso.header.RuleAttributeType"); put("org.zstack.sdk.RunningState", "org.zstack.storage.device.localRaid.RunningState"); put("org.zstack.sdk.RunningTaskInfo", "org.zstack.header.core.progress.RunningTaskInfo"); + put("org.zstack.sdk.SSOClientAttributeInventory", "org.zstack.sso.header.SSOClientAttributeInventory"); put("org.zstack.sdk.SSOClientInventory", "org.zstack.sso.header.SSOClientInventory"); put("org.zstack.sdk.SSORedirectTemplateInventory", "org.zstack.sso.header.SSORedirectTemplateInventory"); put("org.zstack.sdk.SSOServerTokenInventory", "org.zstack.sso.header.SSOServerTokenInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/AttributePurpose.java b/sdk/src/main/java/org/zstack/sdk/AttributePurpose.java new file mode 100644 index 00000000000..a5a0c75c526 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AttributePurpose.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + +public enum AttributePurpose { + Mapping, + Configuration, + Customize, +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAccountAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAccountAction.java index 328f1f8c467..e6003930447 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAccountAction.java @@ -31,7 +31,7 @@ public Result throwExceptionIfError() { @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String password; - @Param(required = false, validValues = {"SystemAdmin","Normal"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"SystemAdmin","Normal","ThirdParty"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) @@ -110,6 +110,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM1"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateCasClientAction.java b/sdk/src/main/java/org/zstack/sdk/CreateCasClientAction.java index 7984cf2897a..6dd4d9b91f8 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateCasClientAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateCasClientAction.java @@ -46,6 +46,9 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String urlTemplate; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List attributes; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/CreateOAuthClientAction.java b/sdk/src/main/java/org/zstack/sdk/CreateOAuthClientAction.java index b5bebc6cdf2..95d00dc0678 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateOAuthClientAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateOAuthClientAction.java @@ -73,6 +73,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List scopeList; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List attributes; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/CreatePolicyAction.java b/sdk/src/main/java/org/zstack/sdk/CreatePolicyAction.java index 63f337152f5..93e3698cd11 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreatePolicyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreatePolicyAction.java @@ -107,6 +107,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM1"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAccountAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAccountAction.java index 61df036b45f..613571787f4 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAccountAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM1"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePolicyAction.java b/sdk/src/main/java/org/zstack/sdk/DeletePolicyAction.java index 3ffa27d047b..8082295e2dd 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeletePolicyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeletePolicyAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM1"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachPriceTableFromAccountAction.java b/sdk/src/main/java/org/zstack/sdk/DetachPriceTableFromAccountAction.java index d7416c51428..4279f0a6b6a 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachPriceTableFromAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachPriceTableFromAccountAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM1"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/ExtendedAttribute.java b/sdk/src/main/java/org/zstack/sdk/ExtendedAttribute.java new file mode 100644 index 00000000000..11de0363683 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ExtendedAttribute.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class ExtendedAttribute extends org.zstack.sdk.iam2.api.Attribute { + + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.lang.String purpose; + public void setPurpose(java.lang.String purpose) { + this.purpose = purpose; + } + public java.lang.String getPurpose() { + return this.purpose; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/RestInfo.java b/sdk/src/main/java/org/zstack/sdk/RestInfo.java index de40ecb0979..1ba8ebddf88 100755 --- a/sdk/src/main/java/org/zstack/sdk/RestInfo.java +++ b/sdk/src/main/java/org/zstack/sdk/RestInfo.java @@ -9,4 +9,5 @@ public class RestInfo { public boolean needSession; public boolean needPoll; public String parameterName; + public String morphTransform; } diff --git a/sdk/src/main/java/org/zstack/sdk/RuleAttributeType.java b/sdk/src/main/java/org/zstack/sdk/RuleAttributeType.java new file mode 100644 index 00000000000..0296179fc1c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/RuleAttributeType.java @@ -0,0 +1,6 @@ +package org.zstack.sdk; + +public enum RuleAttributeType { + SYSTEM, + CUSTOM, +} diff --git a/sdk/src/main/java/org/zstack/sdk/SSOClientAttributeInventory.java b/sdk/src/main/java/org/zstack/sdk/SSOClientAttributeInventory.java new file mode 100644 index 00000000000..f0bdd5b1751 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SSOClientAttributeInventory.java @@ -0,0 +1,72 @@ +package org.zstack.sdk; + +import org.zstack.sdk.RuleAttributeType; +import org.zstack.sdk.AttributePurpose; + +public class SSOClientAttributeInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String value; + public void setValue(java.lang.String value) { + this.value = value; + } + public java.lang.String getValue() { + return this.value; + } + + public RuleAttributeType type; + public void setType(RuleAttributeType type) { + this.type = type; + } + public RuleAttributeType getType() { + return this.type; + } + + public AttributePurpose purpose; + public void setPurpose(AttributePurpose purpose) { + this.purpose = purpose; + } + public AttributePurpose getPurpose() { + return this.purpose; + } + + public java.lang.String ssoClientUuid; + public void setSsoClientUuid(java.lang.String ssoClientUuid) { + this.ssoClientUuid = ssoClientUuid; + } + public java.lang.String getSsoClientUuid() { + return this.ssoClientUuid; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SSOClientInventory.java b/sdk/src/main/java/org/zstack/sdk/SSOClientInventory.java index 2e9cf88a3a2..52e7328ae24 100644 --- a/sdk/src/main/java/org/zstack/sdk/SSOClientInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/SSOClientInventory.java @@ -84,4 +84,12 @@ public java.lang.String getAccountUuid() { return this.accountUuid; } + public java.util.List attributes; + public void setAttributes(java.util.List attributes) { + this.attributes = attributes; + } + public java.util.List getAttributes() { + return this.attributes; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/SsoClientPushDataAction.java b/sdk/src/main/java/org/zstack/sdk/SsoClientPushDataAction.java new file mode 100644 index 00000000000..5ca300579e1 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SsoClientPushDataAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class SsoClientPushDataAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.SsoClientPushDataResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String dataType; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serverUrl; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.SsoClientPushDataResult value = res.getResult(org.zstack.sdk.SsoClientPushDataResult.class); + ret.value = value == null ? new org.zstack.sdk.SsoClientPushDataResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/sso/resource/data/push"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "ssoClientPushData"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SsoClientPushDataResult.java b/sdk/src/main/java/org/zstack/sdk/SsoClientPushDataResult.java new file mode 100644 index 00000000000..7a0b770ef56 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SsoClientPushDataResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class SsoClientPushDataResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAccountAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAccountAction.java index ff9178a1d6e..3d593e20b84 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAccountAction.java @@ -107,6 +107,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateAccount"; + info.morphTransform = "IAM1"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateQuotaAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateQuotaAction.java index 7fcfd53713c..12f2b6efe12 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateQuotaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateQuotaAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateQuota"; + info.morphTransform = "IAM1"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateResourceConfigAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateResourceConfigAction.java index 2e4e9c3e678..70cb42ca5a2 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateResourceConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateResourceConfigAction.java @@ -104,6 +104,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateResourceConfig"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSSOClientAttributeAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSSOClientAttributeAction.java new file mode 100644 index 00000000000..c59c63aeea8 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSSOClientAttributeAction.java @@ -0,0 +1,110 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateSSOClientAttributeAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UpdateSSOClientAttributeResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String value; + + @Param(required = false, maxLength = 32, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String purpose; + + @Param(required = false, maxLength = 32, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UpdateSSOClientAttributeResult value = res.getResult(org.zstack.sdk.UpdateSSOClientAttributeResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateSSOClientAttributeResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/sso/client/attributes/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateSSOClientAttribute"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSSOClientAttributeResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateSSOClientAttributeResult.java new file mode 100644 index 00000000000..d831e04073c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSSOClientAttributeResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SSOClientAttributeInventory; + +public class UpdateSSOClientAttributeResult { + public SSOClientAttributeInventory inventory; + public void setInventory(SSOClientAttributeInventory inventory) { + this.inventory = inventory; + } + public SSOClientAttributeInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2OrganizationAction.java index 854d32d13fa..f00de1952fb 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2OrganizationAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2ProjectAction.java index 0670aef20e6..53bb36c5b6f 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2ProjectAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDAction.java index 4d1575b67f4..188581aa6bb 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDGroupAction.java index a5bb512701d..ea4ea41d38a 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDGroupAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDGroupToProjectsAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDGroupToProjectsAction.java index b26c2ba8f8c..d9d9ae5e33b 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDGroupToProjectsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDGroupToProjectsAction.java @@ -95,6 +95,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToGroupAction.java index debd245aacc..095e3ee8378 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToGroupAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToOrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToOrganizationAction.java index 34084349c64..6659e146a43 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToOrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToOrganizationAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectAction.java index 572d5b879b1..5958bcbdc30 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectsAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectsAction.java index 61937527ca9..7320a5c6fc4 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectsAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDAction.java index 407331c12bc..08da2267a85 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDGroupAction.java index d2899b65128..c82beaf94e2 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDGroupAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AttachIAM2ProjectToIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AttachIAM2ProjectToIAM2OrganizationAction.java index 55c408c03ab..59ed9c8c863 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AttachIAM2ProjectToIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AttachIAM2ProjectToIAM2OrganizationAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/Attribute.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/Attribute.java index f1915a28c93..9126f1aed9f 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/Attribute.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/Attribute.java @@ -4,6 +4,14 @@ public class Attribute { + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + public java.lang.String name; public void setName(java.lang.String name) { this.name = name; diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/BatchCreateIAM2VirtualIDFromConfigFileAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/BatchCreateIAM2VirtualIDFromConfigFileAction.java index 2d8a76d4ef8..d8979de3cca 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/BatchCreateIAM2VirtualIDFromConfigFileAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/BatchCreateIAM2VirtualIDFromConfigFileAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationParentAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationParentAction.java index 6173fcbdbf9..190291ad557 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationParentAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationParentAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "changeIAM2OrganizationParent"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationStateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationStateAction.java index a60afac270e..69c87a49009 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationStateAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "changeIAM2OrganizationState"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2ProjectStateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2ProjectStateAction.java index 633788c62f0..c4ae6821a67 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2ProjectStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2ProjectStateAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "changeIAM2ProjectState"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDGroupStateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDGroupStateAction.java index 707213b8b4f..fc59203fdcd 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDGroupStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDGroupStateAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "changeIAM2VirtualIDGroupState"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDStateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDStateAction.java index ca1c012bae4..46dff445083 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDStateAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "changeIAM2VirtualIDState"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDTypeAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDTypeAction.java index ad3178e7b86..945ae077534 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDTypeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDTypeAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "changeIAM2VirtualIDType"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CheckIAM2VirtualIDConfigFileAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CheckIAM2VirtualIDConfigFileAction.java index 124030b4558..94ea71721ca 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CheckIAM2VirtualIDConfigFileAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CheckIAM2VirtualIDConfigFileAction.java @@ -89,6 +89,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = false; info.parameterName = "checkIAM2VirtualIDConfigFile"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2OrganizationAction.java index f9d2bd47d18..0eeec742bbb 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2OrganizationAction.java @@ -119,6 +119,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectAction.java index fc7d649762a..ba48f0c2e9d 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectAction.java @@ -46,6 +46,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String organizationUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String linkAccountUuid; + @Param(required = false) public java.lang.String resourceUuid; @@ -119,6 +122,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectFromTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectFromTemplateAction.java index bd7cc5f4209..24c59d1109f 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectFromTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectFromTemplateAction.java @@ -43,6 +43,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List resourceTemplates; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String linkAccountUuid; + @Param(required = false) public java.lang.String resourceUuid; @@ -116,6 +119,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectRoleAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectRoleAction.java index 5eb409ec0a6..b70638444fd 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectRoleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectRoleAction.java @@ -113,6 +113,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateAction.java index 3a6b279b5ac..afc0334c75b 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateAction.java @@ -110,6 +110,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateFromProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateFromProjectAction.java index cccd51654b3..7d87d108777 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateFromProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateFromProjectAction.java @@ -107,6 +107,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDAction.java index ae8180b6009..40cd014b6d4 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDAction.java @@ -46,6 +46,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public boolean withoutDefaultRole = false; + @Param(required = false, validValues = {"ZStack","OAuth2","Ldap"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + @Param(required = false) public java.lang.String resourceUuid; @@ -119,6 +122,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDGroupAction.java index 07b6969bce6..5db10864bdc 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDGroupAction.java @@ -110,6 +110,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2OrganizationAction.java index cbcbf4f6f69..02a9b82fd91 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2OrganizationAction.java @@ -95,6 +95,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectAction.java index b47340b71dd..bce7d3914c6 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectAction.java @@ -95,6 +95,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectTemplateAction.java index 924cfc1a594..93dda594247 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectTemplateAction.java @@ -95,6 +95,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDAction.java index 689d6f4ad48..22c842115ef 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDGroupAction.java index 089189db132..177696a16c0 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDGroupAction.java @@ -95,6 +95,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/DetachIAM2ProjectFromIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/DetachIAM2ProjectFromIAM2OrganizationAction.java index 67526a0729a..5ee8e5a63ce 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/DetachIAM2ProjectFromIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/DetachIAM2ProjectFromIAM2OrganizationAction.java @@ -95,6 +95,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/ExpungeIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/ExpungeIAM2ProjectAction.java index 788374814e2..911d0b7a958 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/ExpungeIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/ExpungeIAM2ProjectAction.java @@ -95,6 +95,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "expungeIAM2Project"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RecoverIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RecoverIAM2ProjectAction.java index 220f4280937..9dd2a44f60c 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RecoverIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RecoverIAM2ProjectAction.java @@ -95,6 +95,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "recoverIAM2Project"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2OrganizationAction.java index 5ab190627d9..583e1c74023 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2OrganizationAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2ProjectAction.java index b993c0f8909..3e6df585357 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2ProjectAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDAction.java index 9addba20a2f..a60560db14d 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDGroupAction.java index dc51bb20ae6..dfb19368649 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDGroupAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2ProjectLoginExpiredAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2ProjectLoginExpiredAction.java index be58161739d..83cae324e0a 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2ProjectLoginExpiredAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2ProjectLoginExpiredAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "removeIAM2ProjectLoginExpired"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDGroupFromProjectsAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDGroupFromProjectsAction.java index 7b549c875b3..a670804f856 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDGroupFromProjectsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDGroupFromProjectsAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromGroupAction.java index fb42e010b22..51b54bde2de 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromGroupAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromOrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromOrganizationAction.java index 03afe428cf3..c1eae738074 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromOrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromOrganizationAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectAction.java index cac0c3146f3..96f9b59ebcf 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectsAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectsAction.java index 57c6a9b218a..97a67ee6b23 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectsAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDAction.java index 5829aecd2f8..f5c1b087c54 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDGroupAction.java index 12be25c8bc5..16d4eaaead0 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDGroupAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectLoginExpiredAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectLoginExpiredAction.java index 4ae4aea4deb..38df38a70e7 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectLoginExpiredAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectLoginExpiredAction.java @@ -31,6 +31,9 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String loginExpired; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String loginExpiredAttributeUuid; + @Param(required = false) public java.util.List systemTags; @@ -98,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "setIAM2ProjectLoginExpired"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectRetirePolicyAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectRetirePolicyAction.java index 05a7b6a20ca..24f903ce22b 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectRetirePolicyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectRetirePolicyAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "setIAM2ProjectRetirePolicy"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationOperationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationOperationAction.java index a20e677ccb8..a712dc663b2 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationOperationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationOperationAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "setOrganizationOperation"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationSupervisorAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationSupervisorAction.java index 2135d390376..97cc2963cc6 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationSupervisorAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationSupervisorAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "setOrganizationSupervisor"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAction.java index f39dea59097..ad6506acf8c 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAction.java @@ -107,6 +107,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateIAM2Organization"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAttributeAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAttributeAction.java index b4e33b1492b..83a66ee2d3b 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAttributeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAttributeAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateIAM2OrganizationAttribute"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAction.java index 4b3b5575d62..c69898d3ef8 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateIAM2Project"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAttributeAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAttributeAction.java index 9eb8f57086d..cf980b8e938 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAttributeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAttributeAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateIAM2ProjectAttribute"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectTemplateAction.java index 2d771440f07..2e91ce544b4 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectTemplateAction.java @@ -107,6 +107,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateIAM2ProjectTemplate"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAction.java index f771d47be19..053860e40bd 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAction.java @@ -107,6 +107,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateIAM2VirtualID"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAttributeAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAttributeAction.java index 4a608b88917..252aba3c19f 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAttributeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAttributeAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateIAM2VirtualIDAttribute"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAction.java index 484a5edd3a1..757210c6de1 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateIAM2VirtualIDGroup"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAttributeAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAttributeAction.java index d568abb3259..09b8eae4bd4 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAttributeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAttributeAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateIAM2VirtualIDGroupAttribute"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateOrganizationQuotaAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateOrganizationQuotaAction.java index 7640bd6cf93..5c2293bf9db 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateOrganizationQuotaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateOrganizationQuotaAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateOrganizationQuota"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/identity/role/api/AttachRoleToAccountAction.java b/sdk/src/main/java/org/zstack/sdk/identity/role/api/AttachRoleToAccountAction.java index 7bfca2d27b3..2f2dad88fe8 100644 --- a/sdk/src/main/java/org/zstack/sdk/identity/role/api/AttachRoleToAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/identity/role/api/AttachRoleToAccountAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM1"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/identity/role/api/CreateRoleAction.java b/sdk/src/main/java/org/zstack/sdk/identity/role/api/CreateRoleAction.java index fc70db18a8a..0afc3d658ad 100644 --- a/sdk/src/main/java/org/zstack/sdk/identity/role/api/CreateRoleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/identity/role/api/CreateRoleAction.java @@ -113,6 +113,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/identity/role/api/DeleteRoleAction.java b/sdk/src/main/java/org/zstack/sdk/identity/role/api/DeleteRoleAction.java index caf75de8d3f..41a8424a486 100644 --- a/sdk/src/main/java/org/zstack/sdk/identity/role/api/DeleteRoleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/identity/role/api/DeleteRoleAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/identity/role/api/DetachRoleFromAccountAction.java b/sdk/src/main/java/org/zstack/sdk/identity/role/api/DetachRoleFromAccountAction.java index 7a8e64cbbec..346d675e7ee 100644 --- a/sdk/src/main/java/org/zstack/sdk/identity/role/api/DetachRoleFromAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/identity/role/api/DetachRoleFromAccountAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM1"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/identity/role/api/UpdateRoleAction.java b/sdk/src/main/java/org/zstack/sdk/identity/role/api/UpdateRoleAction.java index 8ae3c7219c6..28ab46551cd 100644 --- a/sdk/src/main/java/org/zstack/sdk/identity/role/api/UpdateRoleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/identity/role/api/UpdateRoleAction.java @@ -107,6 +107,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateRole"; + info.morphTransform = "IAM1"; return info; } diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 647860261a5..aaac47ad12a 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -39818,6 +39818,33 @@ abstract class ApiHelper { } + def ssoClientPushData(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SsoClientPushDataAction.class) Closure c) { + def a = new org.zstack.sdk.SsoClientPushDataAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def startBareMetal2Instance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StartBareMetal2InstanceAction.class) Closure c) { def a = new org.zstack.sdk.StartBareMetal2InstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -45218,6 +45245,33 @@ abstract class ApiHelper { } + def updateSSOClientAttribute(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSSOClientAttributeAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateSSOClientAttributeAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def updateSSORedirectTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSSORedirectTemplateAction.class) Closure c) { def a = new org.zstack.sdk.UpdateSSORedirectTemplateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From f1aafc3e318e0ab204ec99fb7b9a811f9e021701 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Wed, 3 Sep 2025 16:17:41 +0800 Subject: [PATCH 498/737] [compute]: allow vm state change from unknown to nostate Resolves: ZSTAC-77221 Change-Id: I687377786d6f7a73636e61687a776a6b686b6d7a --- .../org/zstack/compute/vm/VmInstanceBase.java | 3 ++- .../zstack/compute/vm/VmInstanceManagerImpl.java | 16 ++++++++-------- .../header/vm/VmAbnormalLifeCycleStruct.java | 8 ++++++++ .../kvm/vm/GetCandidatePrimaryStorageCase.groovy | 9 +++++++++ 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java index 3aa3b938562..ed98aef34e0 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java @@ -1510,7 +1510,8 @@ private void vmStateChangeOnHost(final VmStateChangedOnHostMsg msg, final NoErro completion.done(); return; } else if (operation == VmAbnormalLifeCycleOperation.VmNoStateFromRunningStateHostNotChanged - || operation == VmAbnormalLifeCycleOperation.VmNoStateFromCrashedStateHostNotChanged) { + || operation == VmAbnormalLifeCycleOperation.VmNoStateFromCrashedStateHostNotChanged + || operation == VmAbnormalLifeCycleOperation.VmNoStateFromUnknownStateHostNotChanged) { // the vm is detected on the host again. It's largely because the host disconnected before // and now reconnected changeVmStateInDb(VmInstanceStateEvent.noState, () -> self.setHostUuid(msg.getHostUuid())); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java index bc78267adae..8ed1ba2e943 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java @@ -831,19 +831,19 @@ protected ImageInventory scripts() { rmsg.setSize((long) t.get(0)); rmsg.setAllocationStrategy((String) t.get(1)); rmsg.setDiskOfferingUuid(msg.getRootDiskOfferingUuid()); - - if (DiskOfferingSystemTags.DISK_OFFERING_USER_CONFIG.hasTag(msg.getRootDiskOfferingUuid())) { - DiskOfferingUserConfig config = OfferingUserConfigUtils.getDiskOfferingConfig(msg.getRootDiskOfferingUuid(), DiskOfferingUserConfig.class); - if (config.getAllocate() != null && config.getAllocate().getPrimaryStorage() != null) { - String psUuid = config.getAllocate().getPrimaryStorage().getUuid(); - rmsg.setRequiredPrimaryStorageUuid(psUuid); - } - } } } else { rmsg.setSize(imageInv.getSize()); } + if (msg.getRootDiskOfferingUuid() != null && DiskOfferingSystemTags.DISK_OFFERING_USER_CONFIG.hasTag(msg.getRootDiskOfferingUuid())) { + DiskOfferingUserConfig config = OfferingUserConfigUtils.getDiskOfferingConfig(msg.getRootDiskOfferingUuid(), DiskOfferingUserConfig.class); + if (config.getAllocate() != null && config.getAllocate().getPrimaryStorage() != null) { + String psUuid = config.getAllocate().getPrimaryStorage().getUuid(); + rmsg.setRequiredPrimaryStorageUuid(psUuid); + } + } + if (msg.getInstanceOfferingUuid() != null && InstanceOfferingSystemTags.INSTANCE_OFFERING_USER_CONFIG.hasTag(msg.getInstanceOfferingUuid())) { InstanceOfferingUserConfig config = OfferingUserConfigUtils.getInstanceOfferingConfig(msg.getInstanceOfferingUuid(), InstanceOfferingUserConfig.class); if (config.getAllocate() != null && config.getAllocate().getPrimaryStorage() != null) { diff --git a/header/src/main/java/org/zstack/header/vm/VmAbnormalLifeCycleStruct.java b/header/src/main/java/org/zstack/header/vm/VmAbnormalLifeCycleStruct.java index 733e3db7aa3..a268e6421dc 100755 --- a/header/src/main/java/org/zstack/header/vm/VmAbnormalLifeCycleStruct.java +++ b/header/src/main/java/org/zstack/header/vm/VmAbnormalLifeCycleStruct.java @@ -163,6 +163,14 @@ boolean match(VmAbnormalLifeCycleStruct struct) { && Objects.equals(struct.getCurrentHostUuid(), struct.getOriginalHostUuid()); } }, + VmNoStateFromUnknownStateHostNotChanged { + @Override + boolean match(VmAbnormalLifeCycleStruct struct) { + return struct.getOriginalState() == VmInstanceState.Unknown + && struct.getCurrentState() == VmInstanceState.NoState + && Objects.equals(struct.getCurrentHostUuid(), struct.getOriginalHostUuid()); + } + }, VmNoStateFromCrashedStateHostNotChanged { @Override boolean match(VmAbnormalLifeCycleStruct struct) { diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/GetCandidatePrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/GetCandidatePrimaryStorageCase.groovy index 513e2dd3436..6aa816d4b2e 100644 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/GetCandidatePrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/GetCandidatePrimaryStorageCase.groovy @@ -283,6 +283,15 @@ class GetCandidatePrimaryStorageCase extends SubCase{ assert result.rootVolumePrimaryStorages.size() == 3 + result = getCandidatePrimaryStoragesForCreatingVm { + imageUuid = imageOnSftp.uuid + l3NetworkUuids = [l3.uuid] + rootDiskOfferingUuid = diskOffering.uuid + } as GetCandidatePrimaryStoragesForCreatingVmResult + + assert result.rootVolumePrimaryStorages.size() == 1 + assert result.rootVolumePrimaryStorages.get(0).uuid == local3.uuid + result = getCandidatePrimaryStoragesForCreatingVm { imageUuid = imageOnSftp.uuid l3NetworkUuids = [l3.uuid] From f9f884bc0ebfc2ebcfe0a9522d70d3eccf95b53e Mon Sep 17 00:00:00 2001 From: zhangjianjun Date: Fri, 5 Sep 2025 15:47:21 +0800 Subject: [PATCH 499/737] [securityGroup]: strip space tab newLine in rule Resolves: ZSTAC-75806 Change-Id: I616963747a756966766c6d6f7a6375796c626875 Signed-off-by: zhangjianjun --- .../zstack/network/securitygroup/RuleTO.java | 6 +-- .../SecurityGroupApiInterceptor.java | 16 ++++++ .../ChangeSecurityGroupRuleCase.groovy | 50 +++++++++++++++++++ .../ValidateSecurityGroupRuleCase.groovy | 35 +++++++++++++ 4 files changed, 104 insertions(+), 3 deletions(-) diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/RuleTO.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/RuleTO.java index fed6b2a770b..670e9934db2 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/RuleTO.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/RuleTO.java @@ -59,7 +59,7 @@ public String getSrcIpRange() { } public void setSrcIpRange(String srcIpRange) { - this.srcIpRange = srcIpRange; + this.srcIpRange = srcIpRange == null ? null : srcIpRange.replaceAll("\\s+", ""); } public String getDstIpRange() { @@ -67,7 +67,7 @@ public String getDstIpRange() { } public void setDstIpRange(String dstIpRange) { - this.dstIpRange = dstIpRange; + this.dstIpRange = dstIpRange == null ? null : dstIpRange.replaceAll("\\s+", ""); } public String getDstPortRange() { @@ -75,7 +75,7 @@ public String getDstPortRange() { } public void setDstPortRange(String dstPortRange) { - this.dstPortRange = dstPortRange; + this.dstPortRange = dstPortRange == null ? null : dstPortRange.replaceAll("\\s+", ""); } public String getProtocol() { diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java index a6c9703a4a9..c3ae7912012 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java @@ -127,6 +127,9 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti return msg; } + private String normalizeIpOrPort(String value) { + return value == null ? null : StringUtils.deleteWhitespace(value); + } private void validate(APIChangeResourceOwnerMsg msg) { AccountResourceRefVO ref = Q.New(AccountResourceRefVO.class).eq(AccountResourceRefVO_.resourceUuid, msg.getResourceUuid()).find(); @@ -168,6 +171,8 @@ private void validate(APIValidateSecurityGroupRuleMsg msg) { if (msg.getAllowedCidr() == null) { msg.setAllowedCidr(msg.getIpVersion() == IPv6Constants.IPv4 ? SecurityGroupConstant.WORLD_OPEN_CIDR : SecurityGroupConstant.WORLD_OPEN_CIDR_IPV6); } else { + //remove extra space characters + msg.setAllowedCidr(normalizeIpOrPort(msg.getAllowedCidr())); validateIps(msg.getAllowedCidr(), msg.getIpVersion()); } @@ -180,14 +185,17 @@ private void validate(APIValidateSecurityGroupRuleMsg msg) { } if (msg.getSrcIpRange() != null) { + msg.setSrcIpRange(normalizeIpOrPort(msg.getSrcIpRange()));; validateIps(msg.getSrcIpRange(), msg.getIpVersion()); } if (msg.getDstIpRange() != null) { + msg.setDstIpRange(normalizeIpOrPort(msg.getDstIpRange())); validateIps(msg.getDstIpRange(), msg.getIpVersion()); } if (msg.getDstPortRange() != null) { + msg.setDstPortRange(normalizeIpOrPort(msg.getDstPortRange())); validatePorts(msg.getDstPortRange()); } @@ -575,6 +583,8 @@ private void validate(APIChangeSecurityGroupRuleMsg msg) { if (StringUtils.isNotEmpty(msg.getRemoteSecurityGroupUuid())) { throw new ApiMessageInterceptionException(argerr("could not change security group rule, because srcIpRange[%s] is set, remoteSecurityGroupUuid[%s] must be empty", msg.getSrcIpRange(), msg.getRemoteSecurityGroupUuid())); } + + msg.setSrcIpRange(normalizeIpOrPort(msg.getSrcIpRange())); validateIps(msg.getSrcIpRange(), vo.getIpVersion()); } @@ -588,6 +598,8 @@ private void validate(APIChangeSecurityGroupRuleMsg msg) { if (StringUtils.isNotEmpty(msg.getRemoteSecurityGroupUuid())) { throw new ApiMessageInterceptionException(argerr("could not change security group rule, because dstIpRange[%s] is set, remoteSecurityGroupUuid[%s] must be empty", msg.getDstIpRange(), msg.getRemoteSecurityGroupUuid())); } + + msg.setDstIpRange(normalizeIpOrPort(msg.getDstIpRange())); validateIps(msg.getDstIpRange(), vo.getIpVersion()); } @@ -638,6 +650,7 @@ private void validate(APIChangeSecurityGroupRuleMsg msg) { if (SecurityGroupRuleProtocolType.ICMP.toString().equals(msg.getProtocol()) || SecurityGroupRuleProtocolType.ALL.toString().equals(msg.getProtocol())) { throw new ApiMessageInterceptionException(argerr("could not change security group rule, because rule protocol is [%s], dstPortRange cannot be set", msg.getProtocol())); } + msg.setDstPortRange(normalizeIpOrPort(msg.getDstPortRange())); validatePorts(msg.getDstPortRange()); } else if (msg.getDstPortRange() != null) { if (SecurityGroupRuleProtocolType.TCP.toString().equals(msg.getProtocol()) || SecurityGroupRuleProtocolType.UDP.toString().equals(msg.getProtocol())) { @@ -1065,6 +1078,7 @@ private void validate(APIAddSecurityGroupRuleMsg msg) { if (ao.getRemoteSecurityGroupUuid() != null) { throw new ApiMessageInterceptionException(argerr("could not add security group rule, because the ip range[%s] and remoteSecurityGroupUuid[%s] are in conflict", ao.getDstIpRange(), ao.getRemoteSecurityGroupUuid())); } + ao.setDstIpRange(normalizeIpOrPort(ao.getDstIpRange())); validateIps(ao.getDstIpRange(), ao.getIpVersion()); } } else { @@ -1083,6 +1097,7 @@ private void validate(APIAddSecurityGroupRuleMsg msg) { if (ao.getRemoteSecurityGroupUuid() != null) { throw new ApiMessageInterceptionException(argerr("could not add security group rule, because the ip range[%s] and remoteSecurityGroupUuid[%s] are in conflict", ao.getSrcIpRange(), ao.getRemoteSecurityGroupUuid())); } + ao.setSrcIpRange(normalizeIpOrPort(ao.getSrcIpRange())); validateIps(ao.getSrcIpRange(), ao.getIpVersion()); } } @@ -1122,6 +1137,7 @@ private void validate(APIAddSecurityGroupRuleMsg msg) { if (ao.getDstPortRange() == null) { throw new ApiMessageInterceptionException(argerr("could not add security group rule, because the protocol type TCP/UDP must set dstPortRange")); } + ao.setDstPortRange(normalizeIpOrPort(ao.getDstPortRange())); validatePorts(ao.getDstPortRange()); } } diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ChangeSecurityGroupRuleCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ChangeSecurityGroupRuleCase.groovy index 5090a5d3989..ad29787ef1e 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ChangeSecurityGroupRuleCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ChangeSecurityGroupRuleCase.groovy @@ -629,6 +629,55 @@ class ChangeSecurityGroupRuleCase extends SubCase { assert rule2.dstPortRange == '400-500' } + void testStripSpaceTabNewLineFromRule() { + SecurityGroupRuleAO r = new SecurityGroupRuleAO() + r.type = "Egress" + r.description = "testStripSpaceTabNewLine" + r.ipVersion = 4 + r.dstPortRange = "433, 8888" + r.dstIpRange = "1.1.1.1, 2.2.2.2, 3.3.3.0/24" + r.protocol = "TCP" + + sg2 = addSecurityGroupRule { + securityGroupUuid = sg2.uuid + rules = [r] + } + + SecurityGroupRuleInventory rule = sg2.rules.find { it.description == "testStripSpaceTabNewLine" } + + SQL.New(SecurityGroupRuleVO.class).eq(SecurityGroupRuleVO_.securityGroupUuid, sg2.uuid) + .eq(SecurityGroupRuleVO_.uuid, rule.uuid) + .set(SecurityGroupRuleVO_.dstPortRange, "433, \n \t8888\n") + .set(SecurityGroupRuleVO_.dstIpRange, "\t1.1.1.1, \n2.2.2.2, \t \n3.3.3.0/24 \n") + .update() + + KVMAgentCommands.ApplySecurityGroupRuleCmd cmd = null + env.afterSimulator(KVMSecurityGroupBackend.SECURITY_GROUP_APPLY_RULE_PATH) { rsp, HttpEntity e -> + cmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.ApplySecurityGroupRuleCmd.class) + return rsp + } + + addVmNicToSecurityGroup{ + securityGroupUuid = sg2.uuid + vmNicUuids = [vm2.vmNics.get(0).uuid] + } + + Boolean find = false + retryInSecs(100) { + assert cmd != null : "ApplySecurityGroupRuleCmd not received" + for (ruleTOLists in cmd.ruleTOs.values()) { + for (ruleTO in ruleTOLists) { + if (ruleTO.dstIpRange == "1.1.1.1,2.2.2.2,3.3.3.0/24" && ruleTO.dstPortRange == "433,8888" ) { + find = true + break + } + } + } + assert find : "RuleTOs not found with expected dstIpRange and dstPortRange" + } + } + + @Override void clean() { env.delete() @@ -676,5 +725,6 @@ class ChangeSecurityGroupRuleCase extends SubCase { testChangeRuleDuplicate() testChangeRuleParamLimit() testChangeRuleWithOldRules() + testStripSpaceTabNewLineFromRule() } } diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ValidateSecurityGroupRuleCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ValidateSecurityGroupRuleCase.groovy index 4a1b5a553e3..dcb01f9dafe 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ValidateSecurityGroupRuleCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ValidateSecurityGroupRuleCase.groovy @@ -107,6 +107,41 @@ class ValidateSecurityGroupRuleCase extends SubCase { assert e.code == SecurityGroupErrors.RULE_IP_FIELD_ERROR.toString() } + validateSecurityGroupRule { + securityGroupUuid = sg1.uuid + type = "Ingress" + protocol = "TCP" + allowedCidr = "3.168.1.100, 33.168.1.0/24\n" + startPort = 500 + endPort = 600 + } + + validateSecurityGroupRule { + securityGroupUuid = sg1.uuid + type = "Ingress" + protocol = "TCP" + srcIpRange = "3.168.1.0/24,\n33.168.1.0/24" + startPort = 500 + endPort = 600 + } + + validateSecurityGroupRule { + securityGroupUuid = sg1.uuid + type = "Egress" + protocol = "TCP" + dstIpRange = "3.168.1.0/24,\n33.168.1.0/24" + startPort = 500 + endPort = 600 + } + + validateSecurityGroupRule { + securityGroupUuid = sg1.uuid + type = "Egress" + protocol = "TCP" + allowedCidr = "3.168.1.0/24,\n33.168.1.0/24" + dstPortRange = "111-500\t\n" + } + SecurityGroupRuleAO r = new SecurityGroupRuleAO() r.type = "Ingress" r.ipVersion = 4 From 84455a14b223b79c41e8884598d4052623deb4e3 Mon Sep 17 00:00:00 2001 From: zhangjianjun Date: Fri, 5 Sep 2025 18:18:04 +0800 Subject: [PATCH 500/737] [VirtualRouter]: clean pf rule on backup VirtualRouterVmVO Resolves: ZSTAC-75666 Change-Id: I6d766a70776676646862777475656e6f6162656f Signed-off-by: zhangjianjun --- conf/springConfigXml/VirtualRouter.xml | 1 + .../VirtualRouterPortForwardingBackend.java | 73 ++++++++++++++++++- 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/conf/springConfigXml/VirtualRouter.xml b/conf/springConfigXml/VirtualRouter.xml index b63416a09e2..1f60d286f95 100755 --- a/conf/springConfigXml/VirtualRouter.xml +++ b/conf/springConfigXml/VirtualRouter.xml @@ -221,6 +221,7 @@ + diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterPortForwardingBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterPortForwardingBackend.java index 052d13706e9..6451b4b781d 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterPortForwardingBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterPortForwardingBackend.java @@ -46,7 +46,7 @@ public class VirtualRouterPortForwardingBackend extends AbstractVirtualRouterBackend implements PortForwardingBackend, Component, VirtualRouterAfterAttachNicExtensionPoint, VirtualRouterBeforeDetachNicExtensionPoint, - VirtualRouterHaGetCallbackExtensionPoint { + VirtualRouterHaGetCallbackExtensionPoint, VirtualRouterAfterDetachNicExtensionPoint { private static final CLogger logger = Utils.getLogger(VirtualRouterPortForwardingBackend.class); @Autowired @@ -484,6 +484,7 @@ public void run(MessageReply reply) { vrVO.getUuid(), ret.getError()); completion.fail(err); } else { + /* move clean up db to afterDetachNic List pfs = findPortForwardingTuplesOnVmNic(nic); List ruleUuids = pfs.stream().map(p -> p.get(0, PortForwardingRuleVO.class).getUuid()).collect(Collectors.toList()); proxy.detachNetworkService(vr.getUuid(), PortForwardingRuleVO.class.getSimpleName(), ruleUuids); @@ -497,6 +498,7 @@ protected void scripts() { } }.execute(); } + */ String info = String.format("sync port forwardings on virtual router[uuid:%s] successfully", vrVO.getUuid()); @@ -573,4 +575,73 @@ public void callBack(String vrUuid, VirtualRouterHaTask task, Completion complet return structs; } + + @Override + public void afterDetachVirtualRouterNic(VmNicInventory nic, Completion completion) { + if (!VirtualRouterNicMetaData.GUEST_NIC_MASK_STRING_LIST.contains(nic.getMetaData())) { + completion.success(); + return; + } + + if (VirtualRouterSystemTags.DEDICATED_ROLE_VR.hasTag(nic.getVmInstanceUuid())) { + completion.success(); + return; + } + + try { + nwServiceMgr.getTypeOfNetworkServiceProviderForService(nic.getL3NetworkUuid(), PortForwardingConstant.PORTFORWARDING_TYPE); + } catch (OperationFailureException e) { + completion.success(); + return; + } + + VirtualRouterVmVO vrVO = Q.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, nic.getVmInstanceUuid()).find(); + if (vrVO == null) { + completion.success(); + return; + } + final VirtualRouterVmInventory vr = VirtualRouterVmInventory.valueOf(vrVO); + + class DbCleaner { + void run() { + List pfs = findPortForwardingTuplesOnVmNic(nic); + List ruleUuids = pfs.stream().map(p -> p.get(0, PortForwardingRuleVO.class).getUuid()).collect(Collectors.toList()); + proxy.detachNetworkService(vr.getUuid(), PortForwardingRuleVO.class.getSimpleName(), ruleUuids); + for (Tuple t : pfs) { + PortForwardingRuleVO rule = t.get(0, PortForwardingRuleVO.class); + new SQLBatch() { + @Override + protected void scripts() { + sql(PortForwardingRuleVO.class).eq(PortForwardingRuleVO_.uuid, rule.getUuid()) + .set(PortForwardingRuleVO_.guestIp, null).set(PortForwardingRuleVO_.vmNicUuid, null).update(); + } + }.execute(); + } + } + } + DbCleaner cleaner = new DbCleaner(); + + String peerVrUuid = haBackend.getVirtualRouterPeerUuid(vr.getUuid()); + if (peerVrUuid == null || peerVrUuid.isEmpty()) { + cleaner.run(); + completion.success(); + return; + } + + VirtualRouterVmVO peerVrVO = Q.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, peerVrUuid).find(); + if (peerVrVO == null) { + cleaner.run(); + completion.success(); + return; + } + VirtualRouterVmInventory peerVr = VirtualRouterVmInventory.valueOf(peerVrVO); + List allL3Uuids = peerVr.getAllL3Networks(); + if (allL3Uuids != null && allL3Uuids.contains(nic.getL3NetworkUuid())) { + completion.success(); + return; + } + + cleaner.run(); + completion.success(); + } } From 3b43d2fb6a77902b736c6af0dc6ec11cb644bca9 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Mon, 8 Sep 2025 16:38:52 +0800 Subject: [PATCH 501/737] [xinfini]: support set volume qos Resolves: ZSTAC-77707 Change-Id: I71637966757761786c6b6467636c626171726f6a --- .../org/zstack/xinfini/XInfiniApiHelper.java | 24 ++++++++- .../xinfini/XInfiniStorageController.java | 23 ++++++--- .../sdk/volume/CloneVolumeRequest.java | 11 ++++ .../sdk/volume/UpdateVolumeRequest.java | 19 +++++-- .../xinfini/sdk/volume/VolumeModule.java | 18 +++++++ .../xinfini/sdk/volume/XinfiniVolumeQos.java | 50 +++++++++++++++++++ 6 files changed, 134 insertions(+), 11 deletions(-) create mode 100644 plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/XinfiniVolumeQos.java diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java index a0bdae6bea4..3a90db3b043 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java @@ -283,12 +283,16 @@ public VolumeSnapshotModule createVolumeSnapshot(int volumeId, String name) { (GetVolumeSnapshotResponse gvp) -> gvp.toModule().getMetadata().getState().getState()).toModule(); } - public VolumeModule cloneVolume(int snapId, String name, String desc, boolean flatten) { + public VolumeModule cloneVolume(int snapId, String name, String desc, boolean flatten, XinfiniVolumeQos qos) { CloneVolumeRequest req = new CloneVolumeRequest(); req.setName(name); req.setDescription(desc); req.setBsSnapId(snapId); req.setFlatten(flatten); + if (qos != null) { + req.setQos(qos); + } + CloneVolumeResponse rsp = callErrorOut(req, CloneVolumeResponse.class); GetVolumeRequest gReq = new GetVolumeRequest(); gReq.setId(rsp.getSpec().getId()); @@ -319,6 +323,24 @@ public VolumeModule expandVolume(int volId, long size) { (GetVolumeResponse gvp) -> gvp.toModule().getMetadata().getState().getState()).toModule(); } + public VolumeModule setVolumeQos(int volId, XinfiniVolumeQos qos) { + UpdateVolumeRequest req = new UpdateVolumeRequest(); + req.setCreator(XInfiniConstants.DEFAULT_CREATOR); + req.setId(volId); + req.setQos(qos); + callErrorOut(req, UpdateVolumeResponse.class); + return getVolume(volId); + } + + public VolumeModule deleteVolumeQos(int volId) { + UpdateVolumeRequest req = new UpdateVolumeRequest(); + req.setCreator(XInfiniConstants.DEFAULT_CREATOR); + req.setId(volId); + req.setQos(new XinfiniVolumeQos()); + callErrorOut(req, UpdateVolumeResponse.class); + return getVolume(volId); + } + private void retryUtilResourceDeletedIn10Secs(XInfiniRequest req, Class rsp) { new Retry() { diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index df42df49770..232408a894f 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -49,6 +49,7 @@ import org.zstack.xinfini.sdk.vhost.BdcRunState; import org.zstack.xinfini.sdk.volume.VolumeModule; import org.zstack.xinfini.sdk.volume.VolumeSnapshotModule; +import org.zstack.xinfini.sdk.volume.XinfiniVolumeQos; import java.util.*; import java.util.concurrent.TimeUnit; @@ -742,7 +743,7 @@ public void cloneVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValue private void cloneVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValueCompletion comp, boolean flatten) { int snapId = getSnapIdFromPath(srcInstallPath); - VolumeModule vol = apiHelper.cloneVolume(snapId, dst.getName(), null, flatten); + VolumeModule vol = apiHelper.cloneVolume(snapId, dst.getName(), null, flatten, XinfiniVolumeQos.valueOf(dst.getQos())); if (SizeUnit.MEGABYTE.toByte(vol.getSpec().getSizeMb()) < dst.getSize()) { vol = apiHelper.expandVolume(vol.getSpec().getId(), convertBytesToMegaBytes(dst.getSize())); @@ -827,14 +828,24 @@ public void expandVolume(String installPath, long size, ReturnValueCompletion parameterMap = new HashMap<>(); + + @Param(required = false, numberRange = {104857600, 107374182400L}) + private long maxTotalBwBps; + @Param(required = false, numberRange = {1000, 10000000}) + private long maxTotalIops; + + public static XinfiniVolumeQos valueOf(VolumeQos qos) { + if (qos == null) { + return null; + } + + XinfiniVolumeQos ret = new XinfiniVolumeQos(); + ret.maxTotalBwBps = qos.getTotalBandwidth() == null || qos.getTotalBandwidth() < 0 ? 0 : qos.getTotalBandwidth(); + ret.maxTotalIops = qos.getTotalIOPS() == null || qos.getTotalIOPS() < 0 ? 0 : qos.getTotalIOPS(); + return ret; + } + + public long getMaxTotalBwBps() { + return maxTotalBwBps; + } + + public void setMaxTotalBwBps(long maxTotalBwBps) { + this.maxTotalBwBps = maxTotalBwBps; + } + + public long getMaxTotalIops() { + return maxTotalIops; + } + + public void setMaxTotalIops(long maxTotalIops) { + this.maxTotalIops = maxTotalIops; + } + + @Override + public Map getParameterMap() { + return parameterMap; + } +} From 9b1da5f5a9d2c95e8e14a2ade8197159d019f323 Mon Sep 17 00:00:00 2001 From: littleya Date: Wed, 3 Sep 2025 18:07:20 +0800 Subject: [PATCH 502/737] [dependencies]: update quartz to version 2.4.0 Resolves: ZSTAC-64577 Change-Id: I6676737167747a68767479776572626872686e6f --- core/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/pom.xml b/core/pom.xml index fbe13125a5a..2f9c5be27f1 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -24,7 +24,7 @@ org.quartz-scheduler quartz - 2.3.2 + 2.4.0 javax.servlet From acf8bf6c1d4f5050686fc637b20f4568db862504 Mon Sep 17 00:00:00 2001 From: zhangjianjun Date: Tue, 1 Jul 2025 22:09:53 +0800 Subject: [PATCH 503/737] [ovn]: config ovn ovs by ResourceConfig Resolves: ZSTAC-75481 Change-Id: I71727a7163766c72687677667a6d6b75726b6e76 Signed-off-by: zhangjianjun --- .../main/java/org/zstack/kvm/KVMAgentCommands.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index 3d54c0260d2..519bc13c190 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -4773,6 +4773,19 @@ public static class StartOvsServiceCmd extends AgentCommand { public String bondingMode; @GrayVersion(value = "5.4.0") public String lacpMode; + @GrayVersion(value = "5.4.0") + public Integer hugePageSize; + @GrayVersion(value = "5.4.0") + public Integer socketMem; + @GrayVersion(value = "5.4.0") + public String lcores; + @GrayVersion(value = "5.4.0") + public String pmdcores; + @GrayVersion(value = "5.4.0") + public Integer nicRxQueueNumber; + @GrayVersion(value = "5.4.0") + public Integer nicRxQueueDescNumber; + } public static class StartOvsServiceRsp extends AgentResponse { From 8ba6ffd927b199ff1ec49fd188e035b8f2303212 Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Wed, 10 Sep 2025 16:25:48 +0800 Subject: [PATCH 504/737] [nic]: Cleaning dirty Data Resolves: ZSTAC-77662 Change-Id: I6868727a64716d6661777064646f627779727764 --- conf/db/upgrade/V5.4.0__schema.sql | 3 +++ 1 file changed, 3 insertions(+) diff --git a/conf/db/upgrade/V5.4.0__schema.sql b/conf/db/upgrade/V5.4.0__schema.sql index fae7e91ab8f..15ca04caad1 100644 --- a/conf/db/upgrade/V5.4.0__schema.sql +++ b/conf/db/upgrade/V5.4.0__schema.sql @@ -42,3 +42,6 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ImageGroupRefVO` ( ALTER TABLE SecurityGroupRuleVO MODIFY COLUMN `dstPortRange` varchar(1024) DEFAULT NULL; ALTER TABLE SecurityGroupRuleVO MODIFY COLUMN `srcPortRange` varchar(1024) DEFAULT NULL; + +# Delete data with blank lines at the end (Reconnect host added again) +DELETE FROM `zstack`.`HostNetworkInterfaceVO` WHERE `pciDeviceAddress` LIKE '%\n'; \ No newline at end of file From c97a48e00c4bd9a5213d2be3618914b13bb177d5 Mon Sep 17 00:00:00 2001 From: "xinhao.huang" Date: Thu, 11 Sep 2025 13:20:06 +0800 Subject: [PATCH 505/737] [sdk]: support saml2.0 - sso login support saml 2.0 DBImpact Resolves: ZSTAC-76199 Change-Id: I656d6e726463787970636666756b746263766a79 --- conf/db/upgrade/V5.4.0__schema.sql | 13 +- conf/scripts/generate-saml-cert.sh | 31 +++++ .../main/java/org/zstack/core/Platform.java | 17 +++ sdk/src/main/java/SourceClassMap.java | 4 + .../zstack/sdk/CreateSAML2ClientAction.java | 125 ++++++++++++++++++ .../zstack/sdk/CreateSAML2ClientResult.java | 14 ++ .../org/zstack/sdk/SAML2ClientInventory.java | 39 ++++++ .../main/java/org/zstack/sdk/SAML2State.java | 6 + .../zstack/sdk/UpdateSAML2ClientAction.java | 113 ++++++++++++++++ .../zstack/sdk/UpdateSAML2ClientResult.java | 14 ++ .../java/org/zstack/testlib/ApiHelper.groovy | 58 +++++++- 11 files changed, 431 insertions(+), 3 deletions(-) create mode 100644 conf/scripts/generate-saml-cert.sh create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateSAML2ClientAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateSAML2ClientResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SAML2ClientInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SAML2State.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateSAML2ClientAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateSAML2ClientResult.java diff --git a/conf/db/upgrade/V5.4.0__schema.sql b/conf/db/upgrade/V5.4.0__schema.sql index 15ca04caad1..1e1adfe2a91 100644 --- a/conf/db/upgrade/V5.4.0__schema.sql +++ b/conf/db/upgrade/V5.4.0__schema.sql @@ -44,4 +44,15 @@ ALTER TABLE SecurityGroupRuleVO MODIFY COLUMN `dstPortRange` varchar(1024) DEFAU ALTER TABLE SecurityGroupRuleVO MODIFY COLUMN `srcPortRange` varchar(1024) DEFAULT NULL; # Delete data with blank lines at the end (Reconnect host added again) -DELETE FROM `zstack`.`HostNetworkInterfaceVO` WHERE `pciDeviceAddress` LIKE '%\n'; \ No newline at end of file +DELETE FROM `zstack`.`HostNetworkInterfaceVO` WHERE `pciDeviceAddress` LIKE '%\n'; + +CREATE TABLE IF NOT EXISTS `zstack`.`SAML2ClientVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `idpMetadataBase64` TEXT, + `spX509Certificate` TEXT, + `spPrivateKey` TEXT, + `spMetadataUrl` varchar(256) DEFAULT NULL, + `state` varchar(32) NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkSAMLClientVOSSOClientVO` FOREIGN KEY (`uuid`) REFERENCES `SSOClientVO` (`uuid`) ON UPDATE RESTRICT ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/conf/scripts/generate-saml-cert.sh b/conf/scripts/generate-saml-cert.sh new file mode 100644 index 00000000000..53079e9ce68 --- /dev/null +++ b/conf/scripts/generate-saml-cert.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +set -euo pipefail + +OUTDIR=./ +TMP="$(mktemp -t saml_cert.XXXXXX)" +trap 'rm -f "${TMP}"* 2>/dev/null' EXIT + +# Do not overwrite existing certificates +test -s ${OUTDIR}/saml_privkey.pem && \ + { echo "SAML certificates already generated"; exit 0; } + +# Generate private key (PKCS#1) +openssl genrsa -out ${OUTDIR}/saml_privkey.pem 2048 + +# Convert private key to PKCS#8 format +openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt \ + -in ${OUTDIR}/saml_privkey.pem \ + -out ${OUTDIR}/saml_privkey_pkcs8.pem + +chmod 400 ${OUTDIR}/saml_privkey.pem +chmod 400 ${OUTDIR}/saml_privkey_pkcs8.pem + +# Generate self-signed SAML certificate +openssl req -x509 -new -nodes \ + -key ${OUTDIR}/saml_privkey.pem \ + -days 1095 \ + -out ${OUTDIR}/saml_cert.pem \ + -subj "/CN=SAML Certificate" + +exit 0 \ No newline at end of file diff --git a/core/src/main/java/org/zstack/core/Platform.java b/core/src/main/java/org/zstack/core/Platform.java index d95b3d35b75..a8d8ae191ed 100755 --- a/core/src/main/java/org/zstack/core/Platform.java +++ b/core/src/main/java/org/zstack/core/Platform.java @@ -34,6 +34,7 @@ import org.zstack.utils.data.StringTemplate; import org.zstack.utils.logging.CLogger; import org.zstack.utils.logging.CLoggerImpl; +import org.zstack.utils.network.IPv6NetworkUtils; import org.zstack.utils.network.NetworkUtils; import org.zstack.utils.path.PathUtil; import org.zstack.utils.string.ErrorCodeElaboration; @@ -54,6 +55,7 @@ import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; +import java.net.UnknownHostException; import java.sql.Timestamp; import java.util.*; import java.util.concurrent.TimeUnit; @@ -730,6 +732,21 @@ public static String getManagementServerVip() { return ZSha2Helper.getInfo(false).getDbvip(); } + public static String getManagementServerVipBaseUrl() { + String ipAddress = getManagementServerVip(); + int port = getManagementNodeServicePort(); + String formattedIp; + + + if (IPv6NetworkUtils.isIpv6Address(ipAddress)) { + formattedIp = String.format("[%s]", ipAddress); + } else { + formattedIp = ipAddress; + } + + return String.format("http://%s:%d", formattedIp, port); + } + public static String getCanonicalServerIp() { if (!ZSha2Helper.isMNHaEnvironment()) { return getManagementServerIp(); diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 236de49eb76..bdb2dd6ab4a 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -661,6 +661,8 @@ public class SourceClassMap { put("org.zstack.sso.header.OAuth2TokenInventory", "org.zstack.sdk.OAuth2TokenInventory"); put("org.zstack.sso.header.RedirectUrlTemplate", "org.zstack.sdk.RedirectUrlTemplate"); put("org.zstack.sso.header.RuleAttributeType", "org.zstack.sdk.RuleAttributeType"); + put("org.zstack.sso.header.SAML2ClientInventory", "org.zstack.sdk.SAML2ClientInventory"); + put("org.zstack.sso.header.SAML2State", "org.zstack.sdk.SAML2State"); put("org.zstack.sso.header.SSOClientAttributeInventory", "org.zstack.sdk.SSOClientAttributeInventory"); put("org.zstack.sso.header.SSOClientInventory", "org.zstack.sdk.SSOClientInventory"); put("org.zstack.sso.header.SSORedirectTemplateInventory", "org.zstack.sdk.SSORedirectTemplateInventory"); @@ -1339,6 +1341,8 @@ public class SourceClassMap { put("org.zstack.sdk.RuleAttributeType", "org.zstack.sso.header.RuleAttributeType"); put("org.zstack.sdk.RunningState", "org.zstack.storage.device.localRaid.RunningState"); put("org.zstack.sdk.RunningTaskInfo", "org.zstack.header.core.progress.RunningTaskInfo"); + put("org.zstack.sdk.SAML2ClientInventory", "org.zstack.sso.header.SAML2ClientInventory"); + put("org.zstack.sdk.SAML2State", "org.zstack.sso.header.SAML2State"); put("org.zstack.sdk.SSOClientAttributeInventory", "org.zstack.sso.header.SSOClientAttributeInventory"); put("org.zstack.sdk.SSOClientInventory", "org.zstack.sso.header.SSOClientInventory"); put("org.zstack.sdk.SSORedirectTemplateInventory", "org.zstack.sso.header.SSORedirectTemplateInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSAML2ClientAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSAML2ClientAction.java new file mode 100644 index 00000000000..1198122f6a2 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateSAML2ClientAction.java @@ -0,0 +1,125 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateSAML2ClientAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.CreateSAML2ClientResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String idpMetadataBase64; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String redirectUrl; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String loginType; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String urlTemplate; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List attributes; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.CreateSAML2ClientResult value = res.getResult(org.zstack.sdk.CreateSAML2ClientResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateSAML2ClientResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/create/saml2/client"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSAML2ClientResult.java b/sdk/src/main/java/org/zstack/sdk/CreateSAML2ClientResult.java new file mode 100644 index 00000000000..aa742483a44 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateSAML2ClientResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SAML2ClientInventory; + +public class CreateSAML2ClientResult { + public SAML2ClientInventory inventory; + public void setInventory(SAML2ClientInventory inventory) { + this.inventory = inventory; + } + public SAML2ClientInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SAML2ClientInventory.java b/sdk/src/main/java/org/zstack/sdk/SAML2ClientInventory.java new file mode 100644 index 00000000000..8dba965aad9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SAML2ClientInventory.java @@ -0,0 +1,39 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SAML2State; + +public class SAML2ClientInventory extends org.zstack.sdk.SSOClientInventory { + + public java.lang.String idpMetadataBase64; + public void setIdpMetadataBase64(java.lang.String idpMetadataBase64) { + this.idpMetadataBase64 = idpMetadataBase64; + } + public java.lang.String getIdpMetadataBase64() { + return this.idpMetadataBase64; + } + + public java.lang.String spX509Certificate; + public void setSpX509Certificate(java.lang.String spX509Certificate) { + this.spX509Certificate = spX509Certificate; + } + public java.lang.String getSpX509Certificate() { + return this.spX509Certificate; + } + + public java.lang.String spMetadataUrl; + public void setSpMetadataUrl(java.lang.String spMetadataUrl) { + this.spMetadataUrl = spMetadataUrl; + } + public java.lang.String getSpMetadataUrl() { + return this.spMetadataUrl; + } + + public SAML2State state; + public void setState(SAML2State state) { + this.state = state; + } + public SAML2State getState() { + return this.state; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SAML2State.java b/sdk/src/main/java/org/zstack/sdk/SAML2State.java new file mode 100644 index 00000000000..48c4a0a880d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SAML2State.java @@ -0,0 +1,6 @@ +package org.zstack.sdk; + +public enum SAML2State { + Enabled, + Disabled, +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSAML2ClientAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSAML2ClientAction.java new file mode 100644 index 00000000000..73bb94a429d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSAML2ClientAction.java @@ -0,0 +1,113 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateSAML2ClientAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UpdateSAML2ClientResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String idpMetadataBase64; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String redirectUrl; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UpdateSAML2ClientResult value = res.getResult(org.zstack.sdk.UpdateSAML2ClientResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateSAML2ClientResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/update/saml2/client"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSAML2ClientResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateSAML2ClientResult.java new file mode 100644 index 00000000000..e150748bdaf --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSAML2ClientResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SAML2ClientInventory; + +public class UpdateSAML2ClientResult { + public SAML2ClientInventory inventory; + public void setInventory(SAML2ClientInventory inventory) { + this.inventory = inventory; + } + public SAML2ClientInventory getInventory() { + return this.inventory; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index b3e735a952d..75824481874 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -10925,6 +10925,33 @@ abstract class ApiHelper { } + def createSAML2Client(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSAML2ClientAction.class) Closure c) { + def a = new org.zstack.sdk.CreateSAML2ClientAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def createSSORedirectTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSSORedirectTemplateAction.class) Closure c) { def a = new org.zstack.sdk.CreateSSORedirectTemplateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -15426,7 +15453,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -15453,7 +15480,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -45301,6 +45328,33 @@ abstract class ApiHelper { } + def updateSAML2Client(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSAML2ClientAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateSAML2ClientAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def updateSSOClientAttribute(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSSOClientAttributeAction.class) Closure c) { def a = new org.zstack.sdk.UpdateSSOClientAttributeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 90a4ce085e862b907330d1f2169d61419134a37f Mon Sep 17 00:00:00 2001 From: "tao.gan" Date: Fri, 29 Aug 2025 14:52:34 +0800 Subject: [PATCH 506/737] [storage]: support specifying the initial size of LV Resolves: ZSV-9789 Change-Id: I74656b756a74716e6a697a6875766c766e73766e --- .../InstantiateVolumeForNewCreatedVmExtension.java | 5 ++++- .../org/zstack/tag/EphemeralPatternSystemTag.java | 13 +++++++++++++ .../main/java/org/zstack/tag/TagManagerImpl.java | 8 +++++++- 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 tag/src/main/java/org/zstack/tag/EphemeralPatternSystemTag.java diff --git a/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForNewCreatedVmExtension.java b/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForNewCreatedVmExtension.java index 926063df1eb..b165106d351 100755 --- a/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForNewCreatedVmExtension.java +++ b/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForNewCreatedVmExtension.java @@ -208,9 +208,12 @@ public void preInstantiateVmResource(VmInstanceSpec spec, Completion completion) } else if (image.getInventory() != null && ImageMediaType.RootVolumeTemplate.toString().equals(image.getInventory().getMediaType())) { InstantiateVolumeMsg rmsg = fillMsg(new InstantiateRootVolumeMsg(), spec.getDestRootVolume(), spec); ((InstantiateRootVolumeMsg) rmsg).setTemplateSpec(image); + rmsg.setSystemTags(spec.getRootVolumeSystemTags()); msgs.add(rmsg); } else { - msgs.add(fillMsg(new InstantiateVolumeMsg(), spec.getDestRootVolume(), spec)); + InstantiateVolumeMsg rmsg = fillMsg(new InstantiateVolumeMsg(), spec.getDestRootVolume(), spec); + rmsg.setSystemTags(spec.getRootVolumeSystemTags()); + msgs.add(rmsg); } if (spec.getDataVolumeTemplateUuids() != null) { diff --git a/tag/src/main/java/org/zstack/tag/EphemeralPatternSystemTag.java b/tag/src/main/java/org/zstack/tag/EphemeralPatternSystemTag.java new file mode 100644 index 00000000000..9ba80b05b51 --- /dev/null +++ b/tag/src/main/java/org/zstack/tag/EphemeralPatternSystemTag.java @@ -0,0 +1,13 @@ +package org.zstack.tag; + +import org.zstack.header.tag.TagConstant; + +public class EphemeralPatternSystemTag extends PatternedSystemTag { + public EphemeralPatternSystemTag(String tagFormat, Class resourceClass) { + super(String.format("%s::%s", TagConstant.EPHEMERAL_TAG_PREFIX, tagFormat), resourceClass); + } + + public String getTagFormatWithoutEphemeralPrefix() { + return tagFormat.substring(String.format("%s::", TagConstant.EPHEMERAL_TAG_PREFIX).length()); + } +} diff --git a/tag/src/main/java/org/zstack/tag/TagManagerImpl.java b/tag/src/main/java/org/zstack/tag/TagManagerImpl.java index 04245ec336f..b3c916391a2 100755 --- a/tag/src/main/java/org/zstack/tag/TagManagerImpl.java +++ b/tag/src/main/java/org/zstack/tag/TagManagerImpl.java @@ -94,7 +94,13 @@ private void initSystemTags() throws IllegalAccessException { f.getDeclaringClass(), f.getName())); } - if (PatternedSystemTag.class.isAssignableFrom(f.getType())) { + if (EphemeralPatternSystemTag.class.isAssignableFrom(f.getType())) { + EphemeralPatternSystemTag ptag = new EphemeralPatternSystemTag(((EphemeralPatternSystemTag) stag).getTagFormatWithoutEphemeralPrefix(), stag.getResourceClass()); + ptag.setValidators(stag.getValidators()); + f.set(null, ptag); + systemTags.add(ptag); + stag = ptag; + } else if (PatternedSystemTag.class.isAssignableFrom(f.getType())) { PatternedSystemTag ptag = new PatternedSystemTag(stag.getTagFormat(), stag.getResourceClass()); ptag.setValidators(stag.getValidators()); f.set(null, ptag); From c4e9257bc9e2d3f49cd0f21c113acd0d233c7b02 Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Thu, 4 Sep 2025 16:20:36 +0800 Subject: [PATCH 507/737] [conf]: add new GuestOS Add new GuestOS in guestOsCategory and guestOsCharacter Resolves: ZSTAC-77340 Change-Id: I6868776c69929b27a5b34e1bb544e419e4724e10 --- conf/guestOs/guestOsCategory.xml | 102 ++++++++++++++++++++++++++++++ conf/guestOs/guestOsCharacter.xml | 96 ++++++++++++++++++++++++++++ 2 files changed, 198 insertions(+) diff --git a/conf/guestOs/guestOsCategory.xml b/conf/guestOs/guestOsCategory.xml index f852ba950ec..166efcac33b 100644 --- a/conf/guestOs/guestOsCategory.xml +++ b/conf/guestOs/guestOsCategory.xml @@ -24,6 +24,18 @@ 8 CentOS 8 + + Linux + CentOS Stream + 9 + CentOS Stream 9 + + + Linux + CentOS Stream + 10 + CentOS Stream 10 + Linux RedHat @@ -54,6 +66,12 @@ 9 RHEL 9 + + Linux + RedHat + 10 + RHEL 10 + Linux Ubuntu @@ -78,6 +96,12 @@ 22 Ubuntu 22 + + Linux + Ubuntu + 24 + Ubuntu 24 + Linux Debian @@ -102,12 +126,36 @@ 10 Debian 10 + + Linux + Debian + 11 + Debian 11 + + + Linux + Debian + 12 + Debian 12 + + + Linux + Debian + 13 + Debian 13 + Linux Fedora Fedora + + Linux + Fedora + 42 + Fedora 42 + Linux Kylin @@ -126,6 +174,12 @@ 10 Kylin 10 + + Linux + Kylin + 11 + Kylin 11 + Linux UOS @@ -144,6 +198,12 @@ 22.03 openEuler 22.03 + + Linux + openEuler + 24.03 + openEuler 24.03 + Linux VyOS @@ -180,6 +240,42 @@ 7 Oracle Linux 7 + + Linux + Oracle + 8 + Oracle Linux 8 + + + Linux + Oracle + 9 + Oracle Linux 9 + + + Linux + Rocky Linux + 8 + Rocky Linux 8 + + + Linux + Rocky Linux + 9 + Rocky Linux 9 + + + Linux + Rocky Linux + 10 + Rocky Linux 10 + + + Linux + AnolisOS + 8 + AnolisOS 8 + Linux Linux @@ -229,6 +325,12 @@ 2022 WindowsServer 2022 + + Windows + Windows + 2025 + WindowsServer 2025 + Windows Windows diff --git a/conf/guestOs/guestOsCharacter.xml b/conf/guestOs/guestOsCharacter.xml index 4f9f672bae9..22ae530379a 100644 --- a/conf/guestOs/guestOsCharacter.xml +++ b/conf/guestOs/guestOsCharacter.xml @@ -43,6 +43,16 @@ Linux CentOS 8 + + x86_64 + Linux + CentOS Stream 9 + + + x86_64 + Linux + CentOS Stream 10 + x86_64 Linux @@ -68,6 +78,11 @@ Linux RHEL 9 + + x86_64 + Linux + RHEL 10 + x86_64 Linux @@ -88,6 +103,11 @@ Linux Ubuntu 22 + + x86_64 + Linux + Ubuntu 24 + x86_64 Linux @@ -108,11 +128,31 @@ Linux Debian 10 + + x86_64 + Linux + Debian 11 + + + x86_64 + Linux + Debian 12 + + + x86_64 + Linux + Debian 13 + x86_64 Linux Fedora + + x86_64 + Linux + Fedora 42 + x86_64 Linux @@ -128,6 +168,11 @@ Linux Kylin 10 + + x86_64 + Linux + Kylin 11 + x86_64 Linux @@ -143,6 +188,11 @@ Linux openEuler 22.03 + + x86_64 + Linux + openEuler 24.03 + x86_64 Linux @@ -158,6 +208,46 @@ Linux Oracle Linux 7 + + x86_64 + Linux + Oracle Linux 8 + + + x86_64 + Linux + Oracle Linux 9 + + + x86_64 + Linux + SUSE Linux 12 + + + x86_64 + Linux + SUSE Linux 15 + + + x86_64 + Linux + Rocky Linux 8 + + + x86_64 + Linux + Rocky Linux 9 + + + x86_64 + Linux + Rocky Linux 10 + + + x86_64 + Linux + AnolisOS 8 + x86_64 Linux @@ -202,6 +292,12 @@ WindowsServer 2022 false + + x86_64 + Windows + WindowsServer 2025 + false + x86_64 Windows From 048c479b7aaa2513f046709dad4bfc484349c52c Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Thu, 11 Sep 2025 10:57:43 +0800 Subject: [PATCH 508/737] [storage]: extrenal ps save imageCache size with actualsize Resolves: ZSTAC-78037 Change-Id: I71696c6579646b6f6774717a766c6d6365656c6e --- .../zstack/storage/addon/primary/ExternalPrimaryStorage.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index 41832147dd5..f625242ce9e 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -1212,7 +1212,10 @@ public void success(VolumeStats volStats) { cache.setImageUuid(image.getUuid()); cache.setMediaType(ImageConstant.ImageMediaType.valueOf(image.getMediaType())); cache.setInstallUrl(volStats.getInstallPath()); - cache.setSize(volStats.getSize()); + // zbs report size in 20~30s interval, so we can't use volStats.getActualSize(), + // Currently, all external storages are thinly provisioned. For now, + // we will use the actual size of the image. + cache.setSize(image.getActualSize()); cache.setPrimaryStorageUuid(self.getUuid()); dbf.persist(cache); completion.success(ImageCacheInventory.valueOf(cache)); From abe5251765bc7504162cad038685126f7724ca2c Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Fri, 12 Sep 2025 11:38:08 +0800 Subject: [PATCH 509/737] [compute]: remove empty nic check for designedAllocatorStrategy Resolves: ZSTAC-77395 Change-Id: I71736a717069657a61657364796d7a72626e7275 --- .../main/java/org/zstack/compute/vm/VmAllocateHostFlow.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAllocateHostFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAllocateHostFlow.java index 962412de85a..ee542fe36ee 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmAllocateHostFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAllocateHostFlow.java @@ -110,10 +110,7 @@ public String call(L3NetworkInventory arg) { } if (msg.getAllocatorStrategy() == null && - (spec.getRequiredClusterUuid() != null - || spec.getRequiredHostUuid() != null - || CollectionUtils.isEmpty(spec.getRequiredClusterUuids()) - || CollectionUtils.isEmpty(spec.getVmInventory().getVmNics()))) { + (!CollectionUtils.isEmpty(msg.getClusterUuids()) || msg.getHostUuid() != null)) { msg.setAllocatorStrategy(HostAllocatorConstant.DESIGNATED_HOST_ALLOCATOR_STRATEGY_TYPE); } From 56a927ee66518722498c69c5d95ff13fd0588c22 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Mon, 16 Jun 2025 14:28:24 +0800 Subject: [PATCH 510/737] [hostNetworkInterface]: add huawei imaster APIImpact DBImpact Resolves: ZSTAC-51948 Change-Id: I737a656a686170787372726a66697962746f726a --- build/pom.xml | 10 + conf/db/upgrade/V5.4.0__schema.sql | 116 ++++++ conf/persistence.xml | 7 +- conf/searchConfig/indexConfig.xml | 2 +- conf/serviceConfig/sdnController.xml | 10 + conf/springConfigXml/HostNetworkManager.xml | 1 + conf/springConfigXml/sdnController.xml | 2 +- .../org/zstack/core/rest/RESTFacadeImpl.java | 4 +- .../header/network/l2/L2NetworkConstant.java | 1 + .../header/network/l3/SdnControllerL3.java | 12 + .../SdnControllerHostRefInventory.java | 2 +- ...ControllerHostRefInventoryDoc_zh_cn.groovy | 4 +- .../SdnControllerHostRefVO.java | 3 +- .../SdnControllerHostRefVO_.java | 2 +- .../SdnControllerInventory.java | 78 +--- .../SdnControllerInventoryDoc_zh_cn.groovy | 76 ++++ .../sdncontroller}/SdnControllerStatus.java | 2 +- .../SdnControllerStatusDoc_zh_cn.groovy | 4 +- .../sdncontroller}/SdnControllerVO.java | 17 +- .../sdncontroller}/SdnControllerVO_.java | 3 +- .../GetSdnControllerDhcpExtensionPoint.java | 5 - .../GetSdnControllerExtensionPoint.java | 8 + .../network/l2/L2NetworkCascadeExtension.java | 33 +- .../zstack/network/l2/L2NoVlanNetwork.java | 8 +- .../org/zstack/network/l3/L3BasicNetwork.java | 322 +++++++++++------ .../zstack/network/l3/L3NetworkManager.java | 8 + .../network/l3/L3NetworkManagerImpl.java | 113 ++++-- .../network/l3/L3NetworkSystemTags.java | 5 + .../network/l3/NormalIpRangeFactory.java | 25 ++ .../APIQueryPhysicalSwitchMsg.java | 34 ++ .../APIQueryPhysicalSwitchMsgDoc_zh_cn.groovy | 31 ++ .../APIQueryPhysicalSwitchReply.java | 41 +++ ...PIQueryPhysicalSwitchReplyDoc_zh_cn.groovy | 32 ++ .../HostNetworkInterfaceCanonicalEvents.java | 38 ++ .../hostNetworkInterface/PackageInfo.java | 10 + .../PhysicalSwitchInventory.java | 143 ++++++++ .../PhysicalSwitchInventoryDoc_zh_cn.groovy | 78 ++++ .../PhysicalSwitchPortInventory.java | 135 +++++++ ...hysicalSwitchPortInventoryDoc_zh_cn.groovy | 69 ++++ .../PhysicalSwitchPortVO.java | 150 ++++++++ .../PhysicalSwitchPortVO_.java | 23 ++ .../PhysicalSwitchVO.java | 162 +++++++++ .../PhysicalSwitchVO_.java | 23 ++ .../hostNetworkInterface/RBACInfo.java | 32 ++ .../lldp/LldpKvmAgentCommands.java | 4 + .../lldp/LldpManagerImpl.java | 186 +++++++++- .../api/GetHostNetworkInterfaceLldpMsg.java | 15 + .../api/GetHostNetworkInterfaceLldpReply.java | 18 + .../HostNetworkInterfaceLldpRefVO_.java | 1 + .../org/zstack/sdnController/RBACInfo.java | 6 +- .../zstack/sdnController/SdnController.java | 5 + .../SdnControllerApiInterceptor.java | 98 +++-- .../sdnController/SdnControllerBase.java | 175 ++++++++- .../SdnControllerCascadeExtension.java | 5 +- .../sdnController/SdnControllerFactory.java | 6 +- .../zstack/sdnController/SdnControllerL2.java | 8 +- .../sdnController/SdnControllerManager.java | 2 +- .../SdnControllerManagerImpl.java | 54 ++- .../SdnControllerPingTracker.java | 3 + .../SdnControllerSystemTags.java | 18 + .../h3cVcfc/H3cVcfcApiInterceptor.java | 4 + .../h3cVcfc/H3cVcfcSdnController.java | 40 ++- .../h3cVcfc/H3cVcfcSdnControllerFactory.java | 13 + .../H3cVcfcSdnControllerSystemTags.java | 6 +- .../h3cVcfc/H3cVcfcV2SdnController.java | 10 +- .../hardwareVxlan/HardwareVxlanNetwork.java | 136 ++++++- .../HardwareVxlanNetworkExtensionPoint.java | 2 +- .../HardwareVxlanNetworkFactory.java | 131 ++++--- .../HardwareVxlanNetworkPool.java | 164 ++++++++- .../HardwareVxlanNetworkPoolFactory.java | 21 +- ...KVMRealizeHardwareVxlanNetworkBackend.java | 52 ++- .../header/APIAddSdnControllerEvent.java | 1 + .../APIAddSdnControllerEventDoc_zh_cn.groovy | 1 + .../header/APIAddSdnControllerMsg.java | 2 +- .../header/APIChangeSdnControllerEvent.java | 51 +++ ...PIChangeSdnControllerEventDoc_zh_cn.groovy | 32 ++ .../header/APIChangeSdnControllerMsg.java | 85 +++++ .../APIChangeSdnControllerMsgDoc_zh_cn.groovy | 85 +++++ .../APICreateL2HardwareVxlanNetworkMsg.java | 13 + ...eL2HardwareVxlanNetworkMsgDoc_zh_cn.groovy | 9 + ...PICreateL2HardwareVxlanNetworkPoolMsg.java | 1 + ...ardwareVxlanNetworkPoolMsgDoc_zh_cn.groovy | 18 + .../header/APIPullSdnControllerTenantMsg.java | 1 + .../header/APIQuerySdnControllerMsg.java | 1 + .../header/APIQuerySdnControllerReply.java | 1 + ...APIQuerySdnControllerReplyDoc_zh_cn.groovy | 1 + .../APIReconnectSdnControllerEvent.java | 1 + ...econnectSdnControllerEventDoc_zh_cn.groovy | 2 +- .../header/APIReconnectSdnControllerMsg.java | 1 + .../header/APIRemoveSdnControllerMsg.java | 1 + .../header/APISdnControllerAddHostEvent.java | 1 + ...ISdnControllerAddHostEventDoc_zh_cn.groovy | 2 +- .../header/APISdnControllerAddHostMsg.java | 5 +- .../APISdnControllerChangeHostEvent.java | 1 + ...nControllerChangeHostEventDoc_zh_cn.groovy | 2 +- .../header/APISdnControllerChangeHostMsg.java | 1 + .../APISdnControllerRemoveHostEvent.java | 1 + ...nControllerRemoveHostEventDoc_zh_cn.groovy | 2 +- .../header/APISdnControllerRemoveHostMsg.java | 1 + .../header/APIUpdateSdnControllerEvent.java | 1 + ...PIUpdateSdnControllerEventDoc_zh_cn.groovy | 1 + .../header/APIUpdateSdnControllerMsg.java | 2 +- .../H3cSdnControllerTenantInventory.java | 1 + .../header/H3cSdnControllerTenantVO.java | 1 + .../header/H3cSdnSubnetIpRangeRefVO.java | 1 + .../HardwareL2VxlanNetworkInventory.java | 53 +++ .../HardwareL2VxlanNetworkPoolInventory.java | 21 ++ ...2VxlanNetworkPoolInventoryDoc_zh_cn.groovy | 10 +- .../header/HardwareL2VxlanNetworkPoolVO.java | 23 ++ .../header/HardwareL2VxlanNetworkPoolVO_.java | 2 + .../header/HardwareL2VxlanNetworkVO.java | 40 +++ .../header/HardwareL2VxlanNetworkVO_.java | 15 + .../header/HardwareVxlanHelper.java | 9 +- .../header/SdnControllerCanonicalEvents.java | 1 + .../header/SdnControllerConstant.java | 5 +- .../header/SdnControllerFlowDataParam.java | 3 + .../SdnControllerInventoryDoc_zh_cn.groovy | 99 ------ .../header/SdnControllerTableState.java | 17 + .../account/AccountSync.java | 4 +- .../controller/SugonSdnController.java | 25 +- .../controller/SugonSdnControllerFactory.java | 14 +- .../neutronClient/TfPortClient.java | 5 +- .../network/TfL2Network.java | 4 +- .../network/TfL3Network.java | 4 +- .../virtualrouter/vyos/VyosConnectFlow.java | 4 +- .../vxlan/vtep/VtepInventoryDoc_zh_cn.groovy | 6 + .../l2/vxlan/vxlanNetwork/VxlanNetwork.java | 2 +- .../vxlanNetwork/VxlanNetworkConstant.java | 8 + .../vxlanNetwork/VxlanNetworkFactory.java | 4 +- .../vxlanNetwork/VxlanNetworkHelper.java | 35 ++ .../KVMRealizeL2VxlanNetworkBackend.java | 24 +- .../KVMRealizeL2VxlanNetworkPoolBackend.java | 4 +- .../VniRangeInventoryDoc_zh_cn.groovy | 2 - .../vxlanNetworkPool/VxlanNetworkPool.java | 24 +- sdk/src/main/java/SourceClassMap.java | 30 +- .../zstack/sdk/ChangeSdnControllerAction.java | 110 ++++++ .../zstack/sdk/ChangeSdnControllerResult.java | 14 + .../CreateL2HardwareVxlanNetworkAction.java | 3 + .../sdk/HardwareL2VxlanNetworkInventory.java | 15 + .../HardwareL2VxlanNetworkPoolInventory.java | 16 + .../zstack/sdk/PhysicalSwitchInventory.java | 95 +++++ .../sdk/PhysicalSwitchPortInventory.java | 87 +++++ .../zstack/sdk/QueryPhysicalSwitchAction.java | 75 ++++ .../zstack/sdk/QueryPhysicalSwitchResult.java | 22 ++ .../sdk/SdnControllerHostRefInventory.java | 79 ----- .../zstack/sdk/SdnControllerInventory.java | 24 -- .../java/org/zstack/sdk/SdnVlanRange.java | 23 ++ .../main/java/org/zstack/sdk/SdnVniRange.java | 23 -- .../CreateHuaweiIMasterVRouterAction.java | 113 ++++++ .../CreateHuaweiIMasterVRouterResult.java | 14 + .../DeleteHuaweiIMasterFabricAction.java | 107 ++++++ .../DeleteHuaweiIMasterFabricResult.java | 7 + .../DeleteHuaweiIMasterTenantAction.java | 107 ++++++ .../DeleteHuaweiIMasterTenantResult.java | 7 + .../DeleteHuaweiIMasterVRouterAction.java | 107 ++++++ .../DeleteHuaweiIMasterVRouterResult.java | 7 + .../imaster/DeleteHuaweiIMasterVpcAction.java | 107 ++++++ .../imaster/DeleteHuaweiIMasterVpcResult.java | 7 + .../imaster/HuaweiIMasterFabricInventory.java | 63 ++++ .../HuaweiIMasterSdnControllerInventory.java | 47 +++ .../imaster/HuaweiIMasterTenantInventory.java | 71 ++++ .../HuaweiIMasterVRouterInventory.java | 87 +++++ .../imaster/HuaweiIMasterVpcInventory.java | 87 +++++ .../PullHuaweiIMasterControllerAction.java | 104 ++++++ .../PullHuaweiIMasterControllerResult.java | 14 + .../QueryHuaweiIMasterFabricAction.java | 75 ++++ .../QueryHuaweiIMasterFabricResult.java | 22 ++ .../QueryHuaweiIMasterTenantAction.java | 75 ++++ .../QueryHuaweiIMasterTenantResult.java | 22 ++ .../QueryHuaweiIMasterVRouterAction.java | 75 ++++ .../QueryHuaweiIMasterVRouterResult.java | 22 ++ .../imaster/QueryHuaweiIMasterVpcAction.java | 75 ++++ .../imaster/QueryHuaweiIMasterVpcResult.java | 22 ++ .../sdnController/SdnControllerCase.groovy | 23 +- .../SugonSdnControllerCase.groovy | 2 +- .../java/org/zstack/testlib/ApiHelper.groovy | 334 ++++++++++++++++++ .../java/org/zstack/testlib/EnvSpec.groovy | 8 +- 177 files changed, 5576 insertions(+), 715 deletions(-) create mode 100644 header/src/main/java/org/zstack/header/network/l3/SdnControllerL3.java rename {plugin/sdnController/src/main/java/org/zstack/sdnController/header => header/src/main/java/org/zstack/header/network/sdncontroller}/SdnControllerHostRefInventory.java (98%) rename {plugin/sdnController/src/main/java/org/zstack/sdnController/header => header/src/main/java/org/zstack/header/network/sdncontroller}/SdnControllerHostRefInventoryDoc_zh_cn.groovy (89%) rename {plugin/sdnController/src/main/java/org/zstack/sdnController/header => header/src/main/java/org/zstack/header/network/sdncontroller}/SdnControllerHostRefVO.java (98%) rename {plugin/sdnController/src/main/java/org/zstack/sdnController/header => header/src/main/java/org/zstack/header/network/sdncontroller}/SdnControllerHostRefVO_.java (95%) rename {plugin/sdnController/src/main/java/org/zstack/sdnController/header => header/src/main/java/org/zstack/header/network/sdncontroller}/SdnControllerInventory.java (53%) create mode 100644 header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerInventoryDoc_zh_cn.groovy rename {plugin/sdnController/src/main/java/org/zstack/sdnController/header => header/src/main/java/org/zstack/header/network/sdncontroller}/SdnControllerStatus.java (63%) rename {plugin/sdnController/src/main/java/org/zstack/sdnController/header => header/src/main/java/org/zstack/header/network/sdncontroller}/SdnControllerStatusDoc_zh_cn.groovy (79%) rename {plugin/sdnController/src/main/java/org/zstack/sdnController/header => header/src/main/java/org/zstack/header/network/sdncontroller}/SdnControllerVO.java (85%) rename {plugin/sdnController/src/main/java/org/zstack/sdnController/header => header/src/main/java/org/zstack/header/network/sdncontroller}/SdnControllerVO_.java (88%) delete mode 100644 header/src/main/java/org/zstack/header/network/service/GetSdnControllerDhcpExtensionPoint.java create mode 100644 header/src/main/java/org/zstack/header/network/service/GetSdnControllerExtensionPoint.java create mode 100644 plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchMsg.java create mode 100644 plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchMsgDoc_zh_cn.groovy create mode 100644 plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchReply.java create mode 100644 plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchReplyDoc_zh_cn.groovy create mode 100644 plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceCanonicalEvents.java create mode 100644 plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PackageInfo.java create mode 100644 plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchInventory.java create mode 100644 plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchInventoryDoc_zh_cn.groovy create mode 100644 plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortInventory.java create mode 100644 plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortInventoryDoc_zh_cn.groovy create mode 100644 plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortVO.java create mode 100644 plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortVO_.java create mode 100644 plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchVO.java create mode 100644 plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchVO_.java create mode 100644 plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/RBACInfo.java create mode 100644 plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/GetHostNetworkInterfaceLldpMsg.java create mode 100644 plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/GetHostNetworkInterfaceLldpReply.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerSystemTags.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerEvent.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerEventDoc_zh_cn.groovy create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerMsg.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerMsgDoc_zh_cn.groovy create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkInventory.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkVO.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkVO_.java delete mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventoryDoc_zh_cn.groovy create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerTableState.java create mode 100644 plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkHelper.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ChangeSdnControllerAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ChangeSdnControllerResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/HardwareL2VxlanNetworkInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/PhysicalSwitchInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/PhysicalSwitchPortInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryPhysicalSwitchAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryPhysicalSwitchResult.java delete mode 100644 sdk/src/main/java/org/zstack/sdk/SdnControllerHostRefInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SdnVlanRange.java delete mode 100644 sdk/src/main/java/org/zstack/sdk/SdnVniRange.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/CreateHuaweiIMasterVRouterAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/CreateHuaweiIMasterVRouterResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterFabricAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterFabricResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterTenantAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterTenantResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVRouterAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVRouterResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVpcAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVpcResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterFabricInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterSdnControllerInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterTenantInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterVRouterInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterVpcInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/PullHuaweiIMasterControllerAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/PullHuaweiIMasterControllerResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterFabricAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterFabricResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterTenantAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterTenantResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVRouterAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVRouterResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVpcAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVpcResult.java diff --git a/build/pom.xml b/build/pom.xml index e92d7dcc0dc..504841e00b9 100755 --- a/build/pom.xml +++ b/build/pom.xml @@ -636,6 +636,11 @@ zdfs ${project.version} + + org.zstack + huawei-imaster + ${project.version} + @@ -945,5 +950,10 @@ observabilityServer ${project.version} + + org.zstack + huawei-imaster + ${project.version} + diff --git a/conf/db/upgrade/V5.4.0__schema.sql b/conf/db/upgrade/V5.4.0__schema.sql index 1e1adfe2a91..c21f700b79c 100644 --- a/conf/db/upgrade/V5.4.0__schema.sql +++ b/conf/db/upgrade/V5.4.0__schema.sql @@ -56,3 +56,119 @@ CREATE TABLE IF NOT EXISTS `zstack`.`SAML2ClientVO` ( PRIMARY KEY (`uuid`), CONSTRAINT `fkSAMLClientVOSSOClientVO` FOREIGN KEY (`uuid`) REFERENCES `SSOClientVO` (`uuid`) ON UPDATE RESTRICT ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`PhysicalSwitchVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) NOT NULL, + `description` varchar(2048) DEFAULT NULL, + `ip` varchar(64) NOT NULL, + `mac` varchar(32) NOT NULL, + `mode` varchar(128) NOT NULL, + `softwareVersion` varchar(128) NOT NULL, + `sdnControllerUuid` varchar(32) DEFAULT NULL, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`PhysicalSwitchPortVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) NOT NULL, + `description` varchar(2048) DEFAULT NULL, + `ethTrunkName` varchar(255) DEFAULT NULL, + `portType` varchar(64) NOT NULL, + `peerInterfaceUuid` varchar(32) DEFAULT NULL, + `switchUuid` varchar(32) NOT NULL, + `sdnControllerUuid` varchar(32) DEFAULT NULL, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkPhysicalSwitchPortVOHostNetworkInterfaceVO` FOREIGN KEY (`peerInterfaceUuid`) REFERENCES `HostNetworkInterfaceVO` (`uuid`) ON DELETE SET NULL, + CONSTRAINT `fkPhysicalSwitchPortVOPhysicalSwitchVO` FOREIGN KEY (`switchUuid`) REFERENCES `PhysicalSwitchVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`HuaweiIMasterFabricVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) NOT NULL, + `sdnControllerUuid` varchar(32) NOT NULL, + `description` varchar(2048) DEFAULT NULL, + `state` varchar(32) NOT NULL DEFAULT "Enabled", + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkHuaweiIMasterFabricVOSdnControllerVO` FOREIGN KEY (`sdnControllerUuid`) REFERENCES `SdnControllerVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`HuaweiIMasterTenantVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) NOT NULL, + `description` varchar(2048) DEFAULT NULL, + `sdnControllerUuid` varchar(32) NOT NULL, + `state` varchar(32) NOT NULL DEFAULT "Enabled", + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkHuaweiIMasterTenantVOSdnControllerVO` FOREIGN KEY (`sdnControllerUuid`) REFERENCES `SdnControllerVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`HuaweiIMasterVpcVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) NOT NULL, + `description` varchar(2048) DEFAULT NULL, + `tenantId` varchar(32) NOT NULL, + `fabricId` varchar(2048) NOT NULL, + `sdnControllerUuid` varchar(32) NOT NULL, + `isVpcDeployed` BOOLEAN NOT NULL DEFAULT TRUE, + `state` varchar(32) NOT NULL DEFAULT "Enabled", + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkHuaweiIMasterVpcVOTenantVO` FOREIGN KEY (`tenantId`) REFERENCES `HuaweiIMasterTenantVO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkHuaweiIMasterVpcVOSdnControllerVO` FOREIGN KEY (`sdnControllerUuid`) REFERENCES `SdnControllerVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`HuaweiIMasterVRouterVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) NOT NULL, + `description` varchar(2048) DEFAULT NULL, + `logicalNetworkId` varchar(32) NOT NULL, + `tenantId` varchar(32) NOT NULL, + `fabricUuid` varchar(32) NOT NULL, + `sdnControllerUuid` varchar(32) NOT NULL, + `state` varchar(32) NOT NULL DEFAULT "Enabled", + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkHuaweiIMasterVRouterVOLogicalNetworkVO` FOREIGN KEY (`logicalNetworkId`) REFERENCES `HuaweiIMasterVpcVO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkHuaweiIMasterVRouterVOTenantVO` FOREIGN KEY (`tenantId`) REFERENCES `HuaweiIMasterTenantVO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkHuaweiIMasterVRouterVOHuaweiIMasterFabricVO` FOREIGN KEY (`fabricUuid`) REFERENCES `HuaweiIMasterFabricVO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkHuaweiIMasterVRouterVOSdnControllerVO` FOREIGN KEY (`sdnControllerUuid`) REFERENCES `SdnControllerVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`HardwareL2VxlanNetworkVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `vlan` int unsigned NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT fkHardwareL2VxlanNetworkVOL2NetworkEO FOREIGN KEY (uuid) REFERENCES L2NetworkEO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`HuaweiIMasterSdnControllerVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + PRIMARY KEY (`uuid`), + CONSTRAINT fkHuaweiIMasterSdnControllerVOSdnControllerVO FOREIGN KEY (uuid) REFERENCES SdnControllerVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`HuaweiIMasterTenantFabricRefVO` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `tenantUuid` varchar(32) NOT NULL, + `fabricUuid` varchar(32) NOT NULL, + `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_tenant_fabric` (`tenantUuid`, `fabricUuid`), + CONSTRAINT fkHuaweiIMasterTenantFabricRefVOHuaweiIMasterFabricVO FOREIGN KEY (fabricUuid) REFERENCES HuaweiIMasterFabricVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE, + CONSTRAINT fkHuaweiIMasterTenantFabricRefVOHuaweiIMasterTenantVO FOREIGN KEY (tenantUuid) REFERENCES HuaweiIMasterTenantVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CALL ADD_COLUMN('HardwareL2VxlanNetworkPoolVO', 'startVlan', 'int unsigned', 1, NULL); +CALL ADD_COLUMN('HardwareL2VxlanNetworkPoolVO', 'endVlan', 'int unsigned', 1, NULL); \ No newline at end of file diff --git a/conf/persistence.xml b/conf/persistence.xml index 2b4f57d7265..33f4326f407 100755 --- a/conf/persistence.xml +++ b/conf/persistence.xml @@ -194,11 +194,12 @@ org.zstack.header.vm.devices.VmInstanceDeviceAddressGroupVO org.zstack.header.core.encrypt.EncryptEntityMetadataVO org.zstack.storage.ceph.primary.CephOsdGroupVO - org.zstack.sdnController.header.SdnControllerVO + org.zstack.header.network.sdncontroller.SdnControllerVO + org.zstack.header.network.sdncontroller.SdnControllerHostRefVO org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolVO + org.zstack.sdnController.header.HardwareL2VxlanNetworkVO org.zstack.sdnController.header.VxlanHostMappingVO org.zstack.sdnController.header.VxlanClusterMappingVO - org.zstack.sdnController.header.SdnControllerHostRefVO org.zstack.sdnController.header.H3cSdnControllerTenantVO org.zstack.sdnController.header.H3cSdnSubnetIpRangeRefVO org.zstack.header.volume.VolumeHostRefVO @@ -219,5 +220,7 @@ org.zstack.kvm.xmlhook.XmlHookVmInstanceRefVO org.zstack.log.server.LogServerVO org.zstack.header.network.l3.L3NetworkSequenceNumberVO + org.zstack.network.hostNetworkInterface.PhysicalSwitchVO + org.zstack.network.hostNetworkInterface.PhysicalSwitchPortVO diff --git a/conf/searchConfig/indexConfig.xml b/conf/searchConfig/indexConfig.xml index 450086a6734..a8a6439a059 100644 --- a/conf/searchConfig/indexConfig.xml +++ b/conf/searchConfig/indexConfig.xml @@ -131,7 +131,7 @@ - + diff --git a/conf/serviceConfig/sdnController.xml b/conf/serviceConfig/sdnController.xml index ac74c9fe8bb..41521e0803c 100644 --- a/conf/serviceConfig/sdnController.xml +++ b/conf/serviceConfig/sdnController.xml @@ -27,6 +27,10 @@ org.zstack.sdnController.header.APISdnControllerRemoveHostMsg + + org.zstack.sdnController.header.APIChangeSdnControllerMsg + + org.zstack.sdnController.header.APIReconnectSdnControllerMsg @@ -38,5 +42,11 @@ org.zstack.sdnController.header.APIPullSdnControllerTenantMsg + query + + + + org.zstack.network.hostNetworkInterface.APIQueryPhysicalSwitchMsg + query \ No newline at end of file diff --git a/conf/springConfigXml/HostNetworkManager.xml b/conf/springConfigXml/HostNetworkManager.xml index 2b0169e91e9..7a4641713e8 100644 --- a/conf/springConfigXml/HostNetworkManager.xml +++ b/conf/springConfigXml/HostNetworkManager.xml @@ -24,6 +24,7 @@ + diff --git a/conf/springConfigXml/sdnController.xml b/conf/springConfigXml/sdnController.xml index 1ec7a6b49b8..83dead819ef 100644 --- a/conf/springConfigXml/sdnController.xml +++ b/conf/springConfigXml/sdnController.xml @@ -31,9 +31,9 @@ - + diff --git a/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java b/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java index a6598eb7569..dd35a75a80e 100755 --- a/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java @@ -632,7 +632,9 @@ protected ResponseEntity call() { boolean valid = false; if (method == HttpMethod.DELETE && rsp.getStatusCode() == org.springframework.http.HttpStatus.NO_CONTENT) { valid = true; - } else if (method == HttpMethod.POST && rsp.getStatusCode() == org.springframework.http.HttpStatus.CREATED) { + } else if (method == HttpMethod.POST && + (rsp.getStatusCode() == org.springframework.http.HttpStatus.CREATED || + rsp.getStatusCode() == org.springframework.http.HttpStatus.NO_CONTENT)) { valid = true; } else if (rsp.getStatusCode() == org.springframework.http.HttpStatus.OK || rsp.getStatusCode() == org.springframework.http.HttpStatus.ACCEPTED) { valid = true; diff --git a/header/src/main/java/org/zstack/header/network/l2/L2NetworkConstant.java b/header/src/main/java/org/zstack/header/network/l2/L2NetworkConstant.java index 4e834ccb96d..e72b0b91396 100755 --- a/header/src/main/java/org/zstack/header/network/l2/L2NetworkConstant.java +++ b/header/src/main/java/org/zstack/header/network/l2/L2NetworkConstant.java @@ -59,4 +59,5 @@ public interface L2NetworkConstant { public static final Integer VLAN_ID_MAX = 4095; public static final Integer VXLAN_ID_MAX = 16777215; + public static final Integer MAX_PARALLEL_HOST_MSG = 10; } diff --git a/header/src/main/java/org/zstack/header/network/l3/SdnControllerL3.java b/header/src/main/java/org/zstack/header/network/l3/SdnControllerL3.java new file mode 100644 index 00000000000..228b05aa98d --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/l3/SdnControllerL3.java @@ -0,0 +1,12 @@ +package org.zstack.header.network.l3; + +import org.zstack.header.core.Completion; + +import java.util.List; + +public interface SdnControllerL3 { + void createL3Network(L3NetworkInventory inv, List systemTags, Completion completion); + void deleteL3Network(L3NetworkInventory inv, Completion completion); + void createIpRange(IpRangeInventory inv, Completion completion); + void deleteIpRange(IpRangeInventory inv, Completion completion); +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefInventory.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefInventory.java similarity index 98% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefInventory.java rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefInventory.java index 4789a1a11fb..840d2f72cda 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefInventory.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefInventory.java @@ -1,4 +1,4 @@ -package org.zstack.sdnController.header; +package org.zstack.header.network.sdncontroller; import org.zstack.header.configuration.PythonClassInventory; import org.zstack.header.host.HostInventory; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefInventoryDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefInventoryDoc_zh_cn.groovy similarity index 89% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefInventoryDoc_zh_cn.groovy rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefInventoryDoc_zh_cn.groovy index 0eb0f0ed773..d6fa745e440 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefInventoryDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefInventoryDoc_zh_cn.groovy @@ -1,10 +1,10 @@ -package org.zstack.sdnController.header +package org.zstack.header.network.sdncontroller doc { - title "SDN控制器物理机清单" + title "SDN控制器与物理机关联关系清单" field { name "sdnControllerUuid" diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefVO.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefVO.java similarity index 98% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefVO.java rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefVO.java index 949fee347e1..6d932d02d90 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefVO.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefVO.java @@ -1,4 +1,4 @@ -package org.zstack.sdnController.header; +package org.zstack.header.network.sdncontroller; import org.zstack.header.host.HostEO; import org.zstack.header.search.SqlTrigger; @@ -9,7 +9,6 @@ import org.zstack.header.vo.SoftDeletionCascades; import javax.persistence.*; -import java.util.HashMap; /** * Created by shixin.ruan on 09/30/2019. diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefVO_.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefVO_.java similarity index 95% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefVO_.java rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefVO_.java index 625d965cb63..c0348a6efdf 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerHostRefVO_.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefVO_.java @@ -1,4 +1,4 @@ -package org.zstack.sdnController.header; +package org.zstack.header.network.sdncontroller; import javax.persistence.metamodel.SingularAttribute; import javax.persistence.metamodel.StaticMetamodel; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventory.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerInventory.java similarity index 53% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventory.java rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerInventory.java index fef5f0670e3..cfcdeb2ffe8 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventory.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerInventory.java @@ -1,18 +1,13 @@ -package org.zstack.sdnController.header; +package org.zstack.header.network.sdncontroller; import org.zstack.header.configuration.PythonClassInventory; -import org.zstack.header.log.NoLogging; -import org.zstack.header.query.ExpandedQueries; -import org.zstack.header.query.ExpandedQuery; import org.zstack.header.search.Inventory; -import org.zstack.sdnController.h3cVcfc.H3cVcfcSdnControllerSystemTags; import java.io.Serializable; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Map; @Inventory(mappingVOClass = SdnControllerVO.class) @PythonClassInventory @@ -24,41 +19,30 @@ public class SdnControllerInventory implements Serializable { private String description; private String ip; private String username; - @NoLogging private String password; private SdnControllerStatus status; private Timestamp createDate; private Timestamp lastOpDate; - private List vniRanges; - private List vxlanPools; - private List hostRefs; + + public SdnControllerInventory() { + } + + public SdnControllerInventory(SdnControllerVO vo) { + this.setUuid(vo.getUuid()); + this.setVendorType(vo.getVendorType()); + this.setVendorVersion(vo.getVendorVersion()); + this.setDescription(vo.getDescription()); + this.setName(vo.getName()); + this.setIp(vo.getIp()); + this.setUsername(vo.getUsername()); + this.setPassword(vo.getPassword()); + this.setStatus(vo.getStatus()); + this.setCreateDate(vo.getCreateDate()); + this.setLastOpDate(vo.getLastOpDate()); + } public static SdnControllerInventory valueOf(SdnControllerVO vo) { - SdnControllerInventory inv = new SdnControllerInventory(); - inv.setUuid(vo.getUuid()); - inv.setVendorType(vo.getVendorType()); - inv.setVendorVersion(vo.getVendorVersion()); - inv.setDescription(vo.getDescription()); - inv.setName(vo.getName()); - inv.setIp(vo.getIp()); - inv.setUsername(vo.getUsername()); - inv.setPassword(vo.getPassword()); - inv.setStatus(vo.getStatus()); - inv.setCreateDate(vo.getCreateDate()); - inv.setLastOpDate(vo.getLastOpDate()); - inv.vniRanges = new ArrayList<>(); - if (vo.getVendorType().equals(SdnControllerConstant.H3C_VCFC_CONTROLLER)) { - List> tokenList = H3cVcfcSdnControllerSystemTags.H3C_VNI_RANGE.getTokensOfTagsByResourceUuid(vo.getUuid()); - for (Map tokens : tokenList) { - SdnVniRange range = new SdnVniRange(); - range.startVni = Integer.valueOf(tokens.get(H3cVcfcSdnControllerSystemTags.H3C_START_VNI_TOKEN)); - range.endVni = Integer.valueOf(tokens.get(H3cVcfcSdnControllerSystemTags.H3C_END_VNI_TOKEN)); - inv.vniRanges.add(range); - } - } - inv.setVxlanPools(HardwareL2VxlanNetworkPoolInventory.valueOf2(vo.getVxlanPools())); - inv.setHostRefs(SdnControllerHostRefInventory.valueOf(vo.getHostRefVOS())); - return inv; + return new SdnControllerInventory(vo); } public static List valueOf(Collection vos) { @@ -149,22 +133,6 @@ public void setLastOpDate(Timestamp lastOpDate) { this.lastOpDate = lastOpDate; } - public List getVniRanges() { - return vniRanges; - } - - public void setVniRanges(List vniRanges) { - this.vniRanges = vniRanges; - } - - public List getVxlanPools() { - return vxlanPools; - } - - public void setVxlanPools(List vxlanPools) { - this.vxlanPools = vxlanPools; - } - public SdnControllerStatus getStatus() { return status; } @@ -172,12 +140,4 @@ public SdnControllerStatus getStatus() { public void setStatus(SdnControllerStatus status) { this.status = status; } - - public List getHostRefs() { - return hostRefs; - } - - public void setHostRefs(List hostRefs) { - this.hostRefs = hostRefs; - } } diff --git a/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerInventoryDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..ca9a031f59e --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerInventoryDoc_zh_cn.groovy @@ -0,0 +1,76 @@ +package org.zstack.header.network.sdncontroller + + +doc { + + title "SDN控制器清单" + + field { + name "uuid" + desc "资源的UUID,唯一标示该资源" + type "String" + since "3.7" + } + field { + name "vendorType" + desc "" + type "String" + since "3.7" + } + field { + name "vendorVersion" + desc "厂商版本" + type "String" + since "5.4" + } + field { + name "name" + desc "资源名称" + type "String" + since "3.7" + } + field { + name "description" + desc "资源的详细描述" + type "String" + since "3.7" + } + field { + name "ip" + desc "" + type "String" + since "3.7" + } + field { + name "username" + desc "" + type "String" + since "3.7" + } + field { + name "password" + desc "" + type "String" + since "3.7" + } + ref { + name "status" + path "org.zstack.header.network.sdncontroller.SdnControllerInventory.status" + desc "null" + type "SdnControllerStatus" + since "5.3.0" + clz SdnControllerStatus.class + } + field { + name "createDate" + desc "创建时间" + type "Timestamp" + since "3.7" + } + field { + name "lastOpDate" + desc "最后一次修改时间" + type "Timestamp" + since "3.7" + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerStatus.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerStatus.java similarity index 63% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerStatus.java rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerStatus.java index 27b27040278..5bc0c7ebda0 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerStatus.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerStatus.java @@ -1,4 +1,4 @@ -package org.zstack.sdnController.header; +package org.zstack.header.network.sdncontroller; public enum SdnControllerStatus { Connecting, diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerStatusDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerStatusDoc_zh_cn.groovy similarity index 79% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerStatusDoc_zh_cn.groovy rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerStatusDoc_zh_cn.groovy index 604ae4193b3..c049e771f1b 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerStatusDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerStatusDoc_zh_cn.groovy @@ -1,10 +1,10 @@ -package org.zstack.sdnController.header +package org.zstack.header.network.sdncontroller doc { - title "SDN控制器状态清单" + title "SDN控制器状态" field { name "Connecting" diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerVO.java similarity index 85% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO.java rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerVO.java index 5aec348a145..f9a911436d2 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerVO.java @@ -1,12 +1,10 @@ -package org.zstack.sdnController.header; +package org.zstack.header.network.sdncontroller; import org.zstack.header.identity.OwnedByAccount; import org.zstack.header.vo.BaseResource; -import org.zstack.header.vo.ForeignKey; import org.zstack.header.vo.NoView; import org.zstack.header.vo.ResourceVO; import org.zstack.header.vo.ToInventory; -import org.zstack.header.zone.ZoneEO; import javax.persistence.*; import java.sql.Timestamp; @@ -44,11 +42,6 @@ public class SdnControllerVO extends ResourceVO implements OwnedByAccount, ToInv @Column private String password; - @OneToMany(fetch=FetchType.EAGER) - @JoinColumn(name="sdnControllerUuid", insertable=false, updatable=false) - @NoView - private Set vxlanPools = new HashSet(); - @OneToMany(fetch=FetchType.EAGER) @JoinColumn(name="sdnControllerUuid", insertable=false, updatable=false) @NoView @@ -144,14 +137,6 @@ public void setLastOpDate(Timestamp lastOpDate) { this.lastOpDate = lastOpDate; } - public Set getVxlanPools() { - return vxlanPools; - } - - public void setVxlanPools(Set vxlanPools) { - this.vxlanPools = vxlanPools; - } - @Override public String getAccountUuid() { return accountUuid; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO_.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerVO_.java similarity index 88% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO_.java rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerVO_.java index 57d476a37b0..27eb3abfbcb 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO_.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerVO_.java @@ -1,4 +1,4 @@ -package org.zstack.sdnController.header; +package org.zstack.header.network.sdncontroller; import org.zstack.header.vo.ResourceVO_; @@ -9,6 +9,7 @@ @StaticMetamodel(SdnControllerVO.class) public class SdnControllerVO_ extends ResourceVO_ { public static volatile SingularAttribute vendorType; + public static volatile SingularAttribute vendorVersion; public static volatile SingularAttribute name; public static volatile SingularAttribute description; public static volatile SingularAttribute ip; diff --git a/header/src/main/java/org/zstack/header/network/service/GetSdnControllerDhcpExtensionPoint.java b/header/src/main/java/org/zstack/header/network/service/GetSdnControllerDhcpExtensionPoint.java deleted file mode 100644 index 468d46f4ae8..00000000000 --- a/header/src/main/java/org/zstack/header/network/service/GetSdnControllerDhcpExtensionPoint.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.zstack.header.network.service; - -public interface GetSdnControllerDhcpExtensionPoint { - SdnControllerDhcp getSdnControllerDhcp(String l3Uuid); -} diff --git a/header/src/main/java/org/zstack/header/network/service/GetSdnControllerExtensionPoint.java b/header/src/main/java/org/zstack/header/network/service/GetSdnControllerExtensionPoint.java new file mode 100644 index 00000000000..42b45b254b7 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/service/GetSdnControllerExtensionPoint.java @@ -0,0 +1,8 @@ +package org.zstack.header.network.service; + +import org.zstack.header.network.l3.SdnControllerL3; + +public interface GetSdnControllerExtensionPoint { + SdnControllerDhcp getSdnControllerDhcp(String l3Uuid); + SdnControllerL3 getSdnControllerL3(String l2Uuid); +} diff --git a/network/src/main/java/org/zstack/network/l2/L2NetworkCascadeExtension.java b/network/src/main/java/org/zstack/network/l2/L2NetworkCascadeExtension.java index bc9c073ada4..309fb83477e 100755 --- a/network/src/main/java/org/zstack/network/l2/L2NetworkCascadeExtension.java +++ b/network/src/main/java/org/zstack/network/l2/L2NetworkCascadeExtension.java @@ -9,6 +9,7 @@ import org.zstack.core.cloudbus.CloudBusListCallBack; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.SQL; import org.zstack.core.db.SimpleQuery; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.header.core.Completion; @@ -16,6 +17,8 @@ import org.zstack.header.identity.AccountVO; import org.zstack.header.message.MessageReply; import org.zstack.header.network.l2.*; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.zone.ZoneInventory; import org.zstack.header.zone.ZoneVO; import org.zstack.utils.CollectionUtils; @@ -178,7 +181,9 @@ private void handleDeletionCheck(CascadeAction action, Completion completion) { @Override public List getEdgeNames() { - return Arrays.asList(ZoneVO.class.getSimpleName(), AccountVO.class.getSimpleName()); + return Arrays.asList(ZoneVO.class.getSimpleName(), + AccountVO.class.getSimpleName(), + SdnControllerVO.class.getSimpleName()); } @Override @@ -228,6 +233,32 @@ public List call() { if (!vos.isEmpty()) { ret = L2NetworkInventory.valueOf(vos); } + } else if (SdnControllerVO.class.getSimpleName().equals(action.getParentIssuer())) { + List controllerUuids = CollectionUtils.transformToList((List) action.getParentIssuerContext(), new Function() { + @Override + public String call(SdnControllerInventory arg) { + return arg.getUuid(); + } + }); + if (controllerUuids.isEmpty()) { + return null; + } + + ret = new ArrayList<>(); + for (String controllerUuid : controllerUuids) { + String tag = String.format("%s::%s", L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN, controllerUuid); + List l2Vos = SQL.New("select l2 from L2NetworkVO l2, SystemTagVO tag " + + "where tag.resourceUuid=l2.uuid " + + "and tag.resourceType='L2NetworkVO' " + + "and tag.tag=:tag", L2NetworkVO.class) + .param("tag", tag).list(); + if (!l2Vos.isEmpty()) { + ret.addAll(L2NetworkInventory.valueOf(l2Vos)); + } + } + if (ret.isEmpty()) { + ret = null; + } } return ret; diff --git a/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java b/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java index 892ff3b50aa..c3449db0145 100755 --- a/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java +++ b/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java @@ -675,7 +675,7 @@ public void handle(ErrorCode errCode, Map data) { }).start(); } - private void prepareL2NetworkOnHosts(final List hosts, String providerType, final Completion completion) { + protected void prepareL2NetworkOnHosts(final List hosts, String providerType, final Completion completion) { FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); chain.setName(String.format("prepare-l2-%s-on-hosts", self.getUuid())); chain.then(new NoRollbackFlow() { @@ -737,7 +737,7 @@ public void fail(ErrorCode errorCode) { whileCompletion.allDone(); } }); - },10).run(new WhileDoneCompletion(trigger) { + },L2NetworkConstant.MAX_PARALLEL_HOST_MSG).run(new WhileDoneCompletion(trigger) { @Override public void done(ErrorCodeList errorCodeList) { if (!errorCodeList.getCauses().isEmpty()) { @@ -1029,7 +1029,7 @@ protected void deleteL2Bridge(Completion completion) { deleteL2Bridge(null, completion); } - private void deleteL2Bridge(List clusterUuids, Completion completion) { + protected void deleteL2Bridge(List clusterUuids, Completion completion) { if (clusterUuids == null) { L2NetworkInventory l2NetworkInventory = getSelfInventory(); clusterUuids = l2NetworkInventory.getAttachedClusterUuids(); @@ -1074,7 +1074,7 @@ public void fail(ErrorCode errorCode) { } }); - },10).run((new WhileDoneCompletion(completion) { + },L2NetworkConstant.MAX_PARALLEL_HOST_MSG).run((new WhileDoneCompletion(completion) { @Override public void done(ErrorCodeList errorCodeList) { if (errs.size() > 0) { diff --git a/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java b/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java index 6e26273bd66..19b9e530a59 100755 --- a/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java +++ b/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java @@ -101,8 +101,11 @@ public class L3BasicNetwork implements L3Network { private L3NetworkVO self; + protected String syncThreadName; + public L3BasicNetwork(L3NetworkVO vo) { this.self = vo; + syncThreadName = "l3-" + vo.getUuid(); } protected L3NetworkVO getSelf() { @@ -202,151 +205,264 @@ private void handle(CheckIpAvailabilityMsg msg) { bus.reply(msg, reply); } + private boolean isLastNormalIpRangeOfVersion(String ipRangeUuid, int ipVersion) { + List normalIpRanges = IpRangeHelper.getNormalIpRanges(self); + normalIpRanges = normalIpRanges.stream() + .filter(r -> r.getIpVersion() == ipVersion) + .collect(Collectors.toList()); + return normalIpRanges.size() == 1 && + normalIpRanges.get(0).getUuid().equals(ipRangeUuid); + } + private void handle(IpRangeDeletionMsg msg) { IpRangeDeletionReply reply = new IpRangeDeletionReply(); + doDeleteIpRange(msg, new Completion(msg) { + @Override + public void success() { + bus.reply(msg, reply); + } - List exts = pluginRgty.getExtensionList(IpRangeDeletionExtensionPoint.class); - IpRangeVO iprvo = dbf.findByUuid(msg.getIpRangeUuid(), IpRangeVO.class); - if (iprvo == null) { - bus.reply(msg, reply); - return; - } - - final IpRangeInventory inv = IpRangeInventory.valueOf(iprvo); - - for (IpRangeDeletionExtensionPoint ext : exts) { - ext.preDeleteIpRange(inv); - } - - CollectionUtils.safeForEach(exts, new ForEachFunction() { @Override - public void run(IpRangeDeletionExtensionPoint arg) { - arg.beforeDeleteIpRange(inv); + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); } }); + } - FlowChain chain = new SimpleFlowChain(); - chain.setName(String.format("del-ip-range-%s", inv.getUuid())); - chain.then(new NoRollbackFlow() { - String __name__ = "disable-sdn-dhcp"; - + private void doDeleteIpRange(IpRangeDeletionMsg msg, Completion completion) { + thdf.chainSubmit(new ChainTask(completion) { @Override - @Deferred - public void run(FlowTrigger trigger, Map data) { - if (!self.enableIpAddressAllocation()) { - trigger.next(); + public void run(SyncTaskChain chainTask) { + List exts = pluginRgty.getExtensionList(IpRangeDeletionExtensionPoint.class); + IpRangeVO iprvo = dbf.findByUuid(msg.getIpRangeUuid(), IpRangeVO.class); + if (iprvo == null) { + completion.success(); + chainTask.next(); return; } - SdnControllerDhcp sdnDhcp = l3NwMgr.getSdnControllerDhcp(self.getUuid()); - if (sdnDhcp == null) { - trigger.next(); - return; + final IpRangeInventory inv = IpRangeInventory.valueOf(iprvo); + + for (IpRangeDeletionExtensionPoint ext : exts) { + ext.preDeleteIpRange(inv); } - GLock lock = new GLock(String.format("delete-ip-range-from-l3-%s", self.getUuid()), TimeUnit.MINUTES.toSeconds(5)); - lock.lock(); - Defer.defer(lock::unlock); + CollectionUtils.safeForEach(exts, new ForEachFunction() { + @Override + public void run(IpRangeDeletionExtensionPoint arg) { + arg.beforeDeleteIpRange(inv); + } + }); - self = dbf.reload(self); - List normalIpRanges = IpRangeHelper.getNormalIpRanges(self); - normalIpRanges = normalIpRanges.stream().filter(r -> r.getIpVersion() == inv.getIpVersion()).collect(Collectors.toList()); - if (normalIpRanges.size() == 1 && normalIpRanges.get(0).getUuid().equals(msg.getIpRangeUuid())) { - sdnDhcp.disableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(self)), inv.getIpVersion(), - new Completion(trigger) { - @Override - public void success() { + FlowChain chain = new SimpleFlowChain(); + chain.setName(String.format("del-ip-range-%s", inv.getUuid())); + chain.then(new NoRollbackFlow() { + String __name__ = "disable-sdn-dhcp"; + + @Override + public void run(FlowTrigger trigger, Map data) { + boolean isLastIpRange = isLastNormalIpRangeOfVersion(msg.getIpRangeUuid(), inv.getIpVersion()); + data.put("isLastIpRange", isLastIpRange); + + if (!self.enableIpAddressAllocation()) { trigger.next(); + return; } - @Override - public void fail(ErrorCode errorCode) { - trigger.fail(errorCode); + SdnControllerDhcp sdnDhcp = l3NwMgr.getSdnControllerDhcp(self.getUuid()); + if (sdnDhcp == null) { + trigger.next(); + return; } - }); - } else { - trigger.next(); - } - } - }).then(new NoRollbackFlow() { - String __name__ = "remove-db"; - @Override - public void run(FlowTrigger trigger, Map data) { - dbf.remove(iprvo); - IpRangeHelper.updateL3NetworkIpversion(iprvo); + if (isLastIpRange) { + sdnDhcp.disableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(self)), inv.getIpVersion(), + new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } else { + trigger.next(); + } + } + }).then(new NoRollbackFlow() { + String __name__ = "delete-ip-range"; - CollectionUtils.safeForEach(exts, new ForEachFunction() { @Override - public void run(IpRangeDeletionExtensionPoint arg) { - arg.afterDeleteIpRange(inv); + public void run(FlowTrigger trigger, Map data) { + SdnControllerL3 sdnL3 = l3NwMgr.getSdnControllerL3(self.getL2NetworkUuid()); + if (sdnL3 == null) { + trigger.next(); + return; + } + + boolean isLastIpRange = (boolean) data.get("isLastIpRange"); + if (isLastIpRange) { + sdnL3.deleteIpRange(inv, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + logger.debug(String.format("delete ip range [uuid:%s] failed because %s", + inv.getUuid(), errorCode.getDetails())); + trigger.next(); + } + }); + } else { + trigger.next(); + } } - }); - trigger.next(); - } - }).then(new NoRollbackFlow() { - String __name__ = "after-delete-ip-range"; + }).then(new NoRollbackFlow() { + String __name__ = "remove-db"; - @Override - public void run (FlowTrigger trigger, Map data){ - CollectionUtils.safeForEach( - pluginRgty.getExtensionList(AfterDeleteIpRangeExtensionPoint.class), - ext -> ext.afterDeleteIpRange(inv) - ); - trigger.next(); + @Override + public void run(FlowTrigger trigger, Map data) { + dbf.remove(iprvo); + IpRangeHelper.updateL3NetworkIpversion(iprvo); + + CollectionUtils.safeForEach(exts, new ForEachFunction() { + @Override + public void run(IpRangeDeletionExtensionPoint arg) { + arg.afterDeleteIpRange(inv); + } + }); + trigger.next(); + } + }).then(new NoRollbackFlow() { + String __name__ = "after-delete-ip-range"; + + @Override + public void run (FlowTrigger trigger, Map data){ + CollectionUtils.safeForEach( + pluginRgty.getExtensionList(AfterDeleteIpRangeExtensionPoint.class), + ext -> ext.afterDeleteIpRange(inv) + ); + trigger.next(); + } + }).error(new FlowErrorHandler(msg) { + @Override + @Deferred + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + chainTask.next(); + } + }).done(new FlowDoneHandler(msg) { + @Override + @Deferred + public void handle(Map data) { + completion.success(); + chainTask.next(); + } + }).start(); } - }).error(new FlowErrorHandler(msg) { + @Override - public void handle(ErrorCode errCode, Map data) { - reply.setError(errCode); - bus.reply(msg, reply); + public String getSyncSignature() { + return syncThreadName; } - }).done(new FlowDoneHandler(msg) { + @Override - public void handle(Map data) { - bus.reply(msg, reply); + public String getName() { + return "delete-ip-range"; } - }).start(); + }); } private void handle(L3NetworkDeletionMsg msg) { thdf.chainSubmit(new ChainTask(msg) { @Override public void run(SyncTaskChain chain) { + L3NetworkDeletionReply reply = new L3NetworkDeletionReply(); L3NetworkVO l3NetworkVO = dbf.findByUuid(msg.getL3NetworkUuid(), L3NetworkVO.class); L2NetworkVO l2NetworkVO = dbf.findByUuid(l3NetworkVO.getL2NetworkUuid(), L2NetworkVO.class); - boolean isExistSystemL3 = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.system, true) - .eq(L3NetworkVO_.l2NetworkUuid, l2NetworkVO.getUuid()).isExists(); - List clusterUuids = Q.New(L2NetworkClusterRefVO.class).select(L2NetworkClusterRefVO_.clusterUuid) - .eq(L2NetworkClusterRefVO_.l2NetworkUuid, l2NetworkVO.getUuid()).listValues(); - if (isExistSystemL3) { - if (clusterUuids != null && !clusterUuids.isEmpty()) { - for (ServiceTypeExtensionPoint ext : pluginRgty.getExtensionList(ServiceTypeExtensionPoint.class)) { - List hostUuids = Q.New(HostVO.class).select(HostVO_.uuid).in(HostVO_.clusterUuid, clusterUuids).listValues(); - if (l2NetworkVO.getType().equals(L2NetworkConstant.VXLAN_NETWORK_TYPE) || l2NetworkVO.getType().equals(L2NetworkConstant.HARDWARE_VXLAN_NETWORK_TYPE)) { - ext.syncManagementServiceTypeExtensionPoint(hostUuids, "vxlan" + l2NetworkVO.getVirtualNetworkId(), null, true); + + FlowChain fchain = new SimpleFlowChain(); + fchain.setName(String.format("del-l3-network-%s", msg.getL3NetworkUuid())); + fchain.then(new NoRollbackFlow() { + String __name__ = "remove-from-sdn-controller"; + + @Override + @Deferred + public void run(FlowTrigger trigger, Map data) { + SdnControllerL3 controllerL3 = l3NwMgr.getSdnControllerL3(self.getL2NetworkUuid()); + if (controllerL3 == null) { + trigger.next(); + return; + } + + controllerL3.deleteL3Network(L3NetworkInventory.valueOf(l3NetworkVO), new Completion(trigger) { + @Override + public void success() { + trigger.next(); } - if (l2NetworkVO.getType().equals(L2NetworkConstant.L2_NO_VLAN_NETWORK_TYPE) || l2NetworkVO.getType().equals(L2NetworkConstant.L2_VLAN_NETWORK_TYPE)) { - ext.syncManagementServiceTypeExtensionPoint(hostUuids, l2NetworkVO.getPhysicalInterface(), l2NetworkVO.getVirtualNetworkId(), true); + + @Override + public void fail(ErrorCode errorCode) { + trigger.next();//ignore error } - } + }); } - } + }).then(new NoRollbackFlow() { + String __name__ = "remove-db"; - if (!self.getReservedIpRanges().isEmpty()) { - SQL.New(ReservedIpRangeVO.class) - .in(ReservedIpRangeVO_.uuid, self.getReservedIpRanges().stream().map(ReservedIpRangeVO::getUuid).collect(Collectors.toList())) - .delete(); - } + @Override + public void run(FlowTrigger trigger, Map data) { + boolean isExistSystemL3 = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.system, true) + .eq(L3NetworkVO_.l2NetworkUuid, l2NetworkVO.getUuid()).isExists(); + List clusterUuids = Q.New(L2NetworkClusterRefVO.class).select(L2NetworkClusterRefVO_.clusterUuid) + .eq(L2NetworkClusterRefVO_.l2NetworkUuid, l2NetworkVO.getUuid()).listValues(); + if (isExistSystemL3) { + if (clusterUuids != null && !clusterUuids.isEmpty()) { + for (ServiceTypeExtensionPoint ext : pluginRgty.getExtensionList(ServiceTypeExtensionPoint.class)) { + List hostUuids = Q.New(HostVO.class).select(HostVO_.uuid).in(HostVO_.clusterUuid, clusterUuids).listValues(); + if (l2NetworkVO.getType().equals(L2NetworkConstant.VXLAN_NETWORK_TYPE) || l2NetworkVO.getType().equals(L2NetworkConstant.HARDWARE_VXLAN_NETWORK_TYPE)) { + ext.syncManagementServiceTypeExtensionPoint(hostUuids, "vxlan" + l2NetworkVO.getVirtualNetworkId(), null, true); + } + if (l2NetworkVO.getType().equals(L2NetworkConstant.L2_NO_VLAN_NETWORK_TYPE) || l2NetworkVO.getType().equals(L2NetworkConstant.L2_VLAN_NETWORK_TYPE)) { + ext.syncManagementServiceTypeExtensionPoint(hostUuids, l2NetworkVO.getPhysicalInterface(), l2NetworkVO.getVirtualNetworkId(), true); + } + } + } + } - L3NetworkInventory inv = L3NetworkInventory.valueOf(self); - extpEmitter.beforeDelete(inv); - deleteHook(); - extpEmitter.afterDelete(inv); + if (!self.getReservedIpRanges().isEmpty()) { + SQL.New(ReservedIpRangeVO.class) + .in(ReservedIpRangeVO_.uuid, self.getReservedIpRanges().stream().map(ReservedIpRangeVO::getUuid).collect(Collectors.toList())) + .delete(); + } - L3NetworkDeletionReply reply = new L3NetworkDeletionReply(); - bus.reply(msg, reply); - chain.next(); + L3NetworkInventory inv = L3NetworkInventory.valueOf(self); + extpEmitter.beforeDelete(inv); + deleteHook(); + extpEmitter.afterDelete(inv); + + trigger.next(); + } + }).error(new FlowErrorHandler(msg) { + @Override + public void handle(ErrorCode errCode, Map data) { + reply.setError(errCode); + bus.reply(msg, reply); + chain.next(); + } + }).done(new FlowDoneHandler(msg) { + @Override + public void handle(Map data) { + bus.reply(msg, reply); + chain.next(); + } + }).start(); } @Override diff --git a/network/src/main/java/org/zstack/network/l3/L3NetworkManager.java b/network/src/main/java/org/zstack/network/l3/L3NetworkManager.java index 67127864c25..eebbb11b747 100755 --- a/network/src/main/java/org/zstack/network/l3/L3NetworkManager.java +++ b/network/src/main/java/org/zstack/network/l3/L3NetworkManager.java @@ -33,4 +33,12 @@ public interface L3NetworkManager { boolean applyNetworkServiceWhenVmStateChange(String type); SdnControllerDhcp getSdnControllerDhcp(String l3Uuid); + + /** + * Resolve SDN controller L3 service bound to the given L2 network. + * + * @param l2Uuid L2Network UUID used to locate the SDN controller + * @return SdnControllerL3 implementation, or null if none is available + */ + SdnControllerL3 getSdnControllerL3(String l2Uuid); } diff --git a/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java b/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java index 2037e0eaf0f..7c1ee6da361 100755 --- a/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java +++ b/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java @@ -10,6 +10,7 @@ import org.zstack.core.cloudbus.MessageSafe; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.*; +import org.zstack.core.defer.Deferred; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.SimpleFlowChain; @@ -33,7 +34,7 @@ import org.zstack.header.network.l2.*; import org.zstack.header.network.l3.*; import org.zstack.header.network.l3.datatypes.IpCapacityData; -import org.zstack.header.network.service.GetSdnControllerDhcpExtensionPoint; +import org.zstack.header.network.service.GetSdnControllerExtensionPoint; import org.zstack.header.network.service.SdnControllerDhcp; import org.zstack.header.vm.VmNicInventory; import org.zstack.header.vm.VmNicVO; @@ -52,6 +53,7 @@ import org.zstack.utils.ExceptionDSL; import org.zstack.utils.ObjectUtils; import org.zstack.utils.Utils; +import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; import org.zstack.utils.network.IPv6Constants; import org.zstack.utils.network.IPv6NetworkUtils; @@ -63,6 +65,7 @@ import java.math.BigInteger; import java.util.*; import java.util.concurrent.Callable; +import java.util.stream.Collectors; import static org.zstack.core.Platform.err; import static org.zstack.utils.CollectionDSL.*; @@ -496,6 +499,8 @@ private void syncManagementServiceTypeWhileCreate(ServiceTypeExtensionPoint ext, } private void handle(APICreateL3NetworkMsg msg) { + APICreateL3NetworkEvent evt = new APICreateL3NetworkEvent(msg.getId()); + L2NetworkVO l2Vo = Q.New(L2NetworkVO.class).eq(L2NetworkVO_.uuid, msg.getL2NetworkUuid()).find(); assert l2Vo.getZoneUuid() != null; @@ -522,36 +527,81 @@ private void handle(APICreateL3NetworkMsg msg) { } vo.setInternalId((int)dbf.generateSequenceNumber(L3NetworkSequenceNumberVO.class)); - L3NetworkFactory factory = getL3NetworkFactory(L3NetworkType.valueOf(msg.getType())); - L3NetworkInventory inv = new SQLBatchWithReturn() { + FlowChain fchain = new SimpleFlowChain(); + fchain.setName(String.format("create-l3-network-%s", vo.getUuid())); + fchain.then(new NoRollbackFlow() { + String __name__ = "add-l3-to-sdn-controller"; + @Override - protected L3NetworkInventory scripts() { - vo.setAccountUuid(msg.getSession().getAccountUuid()); - L3NetworkInventory inv = factory.createL3Network(vo, msg); - tagMgr.createTagsFromAPICreateMessage(msg, vo.getUuid(), L3NetworkVO.class.getSimpleName()); - return inv; - } - }.execute(); - - if (msg.isSystem()) { - L2NetworkVO l2NetworkVO = dbf.findByUuid(msg.getL2NetworkUuid(), L2NetworkVO.class); - List clusterUuids = Q.New(L2NetworkClusterRefVO.class).select(L2NetworkClusterRefVO_.clusterUuid) - .eq(L2NetworkClusterRefVO_.l2NetworkUuid, l2NetworkVO.getUuid()).listValues(); - if (clusterUuids != null && !clusterUuids.isEmpty()) { - List hostUuids = Q.New(HostVO.class).select(HostVO_.uuid) - .in(HostVO_.clusterUuid, clusterUuids).listValues(); - for (ServiceTypeExtensionPoint ext : pluginRgty.getExtensionList(ServiceTypeExtensionPoint.class)) { - syncManagementServiceTypeWhileCreate(ext, l2NetworkVO, hostUuids); + @Deferred + public void run(FlowTrigger trigger, Map data) { + SdnControllerL3 controllerL3 = getSdnControllerL3(msg.getL2NetworkUuid()); + if (controllerL3 == null) { + trigger.next(); + return; } + + controllerL3.createL3Network(L3NetworkInventory.valueOf(vo), msg.getSystemTags(), + new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); } - } + }).then(new NoRollbackFlow() { + String __name__ = "save-db"; - extpEmitter.afterCreate(inv); + @Override + public void run(FlowTrigger trigger, Map data) { + L3NetworkFactory factory = getL3NetworkFactory(L3NetworkType.valueOf(msg.getType())); + L3NetworkInventory inv = new SQLBatchWithReturn() { + @Override + protected L3NetworkInventory scripts() { + vo.setAccountUuid(msg.getSession().getAccountUuid()); + L3NetworkInventory inv = factory.createL3Network(vo, msg); + tagMgr.createTagsFromAPICreateMessage(msg, vo.getUuid(), L3NetworkVO.class.getSimpleName()); + return inv; + } + }.execute(); + + if (msg.isSystem()) { + L2NetworkVO l2NetworkVO = dbf.findByUuid(msg.getL2NetworkUuid(), L2NetworkVO.class); + List clusterUuids = Q.New(L2NetworkClusterRefVO.class).select(L2NetworkClusterRefVO_.clusterUuid) + .eq(L2NetworkClusterRefVO_.l2NetworkUuid, l2NetworkVO.getUuid()).listValues(); + if (clusterUuids != null && !clusterUuids.isEmpty()) { + List hostUuids = Q.New(HostVO.class).select(HostVO_.uuid) + .in(HostVO_.clusterUuid, clusterUuids).listValues(); + for (ServiceTypeExtensionPoint ext : pluginRgty.getExtensionList(ServiceTypeExtensionPoint.class)) { + syncManagementServiceTypeWhileCreate(ext, l2NetworkVO, hostUuids); + } + } + } + + extpEmitter.afterCreate(inv); + evt.setInventory(inv); + + trigger.next(); + } + }).error(new FlowErrorHandler(msg) { + @Override + public void handle(ErrorCode errCode, Map data) { + evt.setError(errCode); + bus.publish(evt); + } + }).done(new FlowDoneHandler(msg) { + @Override + public void handle(Map data) { + logger.debug(String.format("Successfully created L3Network[name:%s, uuid:%s]", vo.getName(), vo.getUuid())); + bus.publish(evt); + } + }).start(); - APICreateL3NetworkEvent evt = new APICreateL3NetworkEvent(msg.getId()); - evt.setInventory(inv); - logger.debug(String.format("Successfully created L3Network[name:%s, uuid:%s]", inv.getName(), inv.getUuid())); - bus.publish(evt); } @Override @@ -984,10 +1034,19 @@ public void check(CheckIpAvailabilityMsg msg, ReturnValueCompletion vos = (List) data.get("IpRangeVO"); + sdnL3.createIpRange(IpRangeInventory.valueOf(vos.get(0)), new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + @Override public void fail(ErrorCode errorCode) { trigger.fail(errorCode); diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchMsg.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchMsg.java new file mode 100644 index 00000000000..a5dc969af22 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchMsg.java @@ -0,0 +1,34 @@ +package org.zstack.network.hostNetworkInterface; + +import org.springframework.http.HttpMethod; +import org.zstack.header.host.HostConstant; +import org.zstack.header.identity.Action; +import org.zstack.header.query.APIQueryMessage; +import org.zstack.header.query.AutoQuery; +import org.zstack.header.rest.RestRequest; + +import java.util.List; + +import static java.util.Arrays.asList; + +/** + * Created with IntelliJ IDEA. + * User: frank + * Time: 8:34 PM + * To change this template use File | Settings | File Templates. + */ +@AutoQuery(replyClass = APIQueryPhysicalSwitchReply.class, inventoryClass = PhysicalSwitchInventory.class) +@Action(category = HostConstant.ACTION_CATEGORY, names = {"read"}) +@RestRequest( + path = "/topo/physical-switches", + optionalPaths = {"/topo/physical-switches/{uuid}"}, + method = HttpMethod.GET, + responseClass = APIQueryPhysicalSwitchReply.class +) +public class APIQueryPhysicalSwitchMsg extends APIQueryMessage { + + public static List __example__() { + return asList("uuid=" + uuid()); + } + +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchMsgDoc_zh_cn.groovy b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..31b125d3f80 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchMsgDoc_zh_cn.groovy @@ -0,0 +1,31 @@ +package org.zstack.network.hostNetworkInterface + +import org.zstack.network.hostNetworkInterface.APIQueryPhysicalSwitchReply +import org.zstack.header.query.APIQueryMessage + +doc { + title "QueryPhysicalSwitch" + + category "二层网络" + + desc """查询物理机交换机信息""" + + rest { + request { + url "GET /v1/topo/physical-switches" + url "GET /v1/topo/physical-switches/{uuid}" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIQueryPhysicalSwitchMsg.class + + desc """""" + + params APIQueryMessage.class + } + + response { + clz APIQueryPhysicalSwitchReply.class + } + } +} \ No newline at end of file diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchReply.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchReply.java new file mode 100644 index 00000000000..562c34887e8 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchReply.java @@ -0,0 +1,41 @@ +package org.zstack.network.hostNetworkInterface; + +import org.zstack.header.query.APIQueryReply; +import org.zstack.header.rest.RestResponse; + +import java.util.List; + +import static org.zstack.utils.CollectionDSL.list; + +/** + * Created with IntelliJ IDEA. + * User: frank + * Time: 8:35 PM + * To change this template use File | Settings | File Templates. + */ +@RestResponse(allTo = "inventories") +public class APIQueryPhysicalSwitchReply extends APIQueryReply { + private List inventories; + + public List getInventories() { + return inventories; + } + + public void setInventories(List inventories) { + this.inventories = inventories; + } + + public static APIQueryPhysicalSwitchReply __example__() { + APIQueryPhysicalSwitchReply reply = new APIQueryPhysicalSwitchReply(); + + PhysicalSwitchInventory phySwitch = new PhysicalSwitchInventory(); + phySwitch.setName("test-sdn"); + phySwitch.setUuid(uuid()); + phySwitch.setDescription("sdn for test"); + phySwitch.setIp("192.168.1.1"); + + reply.setInventories(list(phySwitch)); + return reply; + } + +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchReplyDoc_zh_cn.groovy b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchReplyDoc_zh_cn.groovy new file mode 100644 index 00000000000..a3e9bfc00c0 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchReplyDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.network.hostNetworkInterface + +import org.zstack.network.hostNetworkInterface.PhysicalSwitchInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "query physical switch" + + ref { + name "inventories" + path "org.zstack.network.hostNetworkInterface.APIQueryPhysicalSwitchReply.inventories" + desc "List of physical switch inventories returned by the query" + type "List" + since "5.3.28" + clz PhysicalSwitchInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.28" + } + ref { + name "error" + path "org.zstack.network.hostNetworkInterface.APIQueryPhysicalSwitchReply.error" + desc "Error code, null indicates success, non-null indicates operation failure" + type "ErrorCode" + since "5.3.28" + clz ErrorCode.class + } +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceCanonicalEvents.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceCanonicalEvents.java new file mode 100644 index 00000000000..eebf1f8ee76 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceCanonicalEvents.java @@ -0,0 +1,38 @@ +package org.zstack.network.hostNetworkInterface; + +import org.zstack.header.message.NeedJsonSchema; + +public class HostNetworkInterfaceCanonicalEvents { + public static final String PEER_PORT_CHANGED = "/network/host-network-interface/peer-changed"; + + @NeedJsonSchema + public static class PeerPortChangedData { + private String interfaceUuid; + private PhysicalSwitchPortInventory oldPhysicalSwitchPort; + private PhysicalSwitchPortInventory newPhysiaclSwitchPort; + + public String getInterfaceUuid() { + return interfaceUuid; + } + + public void setInterfaceUuid(String interfaceUuid) { + this.interfaceUuid = interfaceUuid; + } + + public PhysicalSwitchPortInventory getOldPhysicalSwitchPort() { + return oldPhysicalSwitchPort; + } + + public void setOldPhysicalSwitchPort(PhysicalSwitchPortInventory oldPhysicalSwitchPort) { + this.oldPhysicalSwitchPort = oldPhysicalSwitchPort; + } + + public PhysicalSwitchPortInventory getNewPhysiaclSwitchPort() { + return newPhysiaclSwitchPort; + } + + public void setNewPhysiaclSwitchPort(PhysicalSwitchPortInventory newPhysiaclSwitchPort) { + this.newPhysiaclSwitchPort = newPhysiaclSwitchPort; + } + } +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PackageInfo.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PackageInfo.java new file mode 100644 index 00000000000..04fe8bc246a --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PackageInfo.java @@ -0,0 +1,10 @@ +package org.zstack.network.hostNetworkInterface; + +import org.zstack.header.PackageAPIInfo; + +@PackageAPIInfo( + APICategoryName = "物理机网络", + permissions = {PackageAPIInfo.PERMISSION_COMMUNITY_AVAILABLE, PackageAPIInfo.PERMISSION_ZSV_BASIC_AVAILABLE} +) +public class PackageInfo { +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchInventory.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchInventory.java new file mode 100644 index 00000000000..47b4bff1fc7 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchInventory.java @@ -0,0 +1,143 @@ +package org.zstack.network.hostNetworkInterface; + +import org.zstack.header.configuration.PythonClassInventory; +import org.zstack.header.search.Inventory; +import org.zstack.header.vm.VmNicInventory; + +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Physical Switch Inventory + */ +@Inventory(mappingVOClass = PhysicalSwitchVO.class) +@PythonClassInventory +public class PhysicalSwitchInventory implements Serializable { + + private String uuid; + private String name; + private String description; + private String ip; + private String mac; + private String mode; + private String softwareVersion; + private String sdnControllerUuid; + private Timestamp createDate; + private Timestamp lastOpDate; + private List ports; + + public static PhysicalSwitchInventory valueOf(PhysicalSwitchVO vo) { + PhysicalSwitchInventory inv = new PhysicalSwitchInventory(); + inv.setUuid(vo.getUuid()); + inv.setName(vo.getName()); + inv.setDescription(vo.getDescription()); + inv.setIp(vo.getIp()); + inv.setMac(vo.getMac()); + inv.setMode(vo.getMode()); + inv.setSoftwareVersion(vo.getSoftwareVersion()); + inv.setSdnControllerUuid(vo.getSdnControllerUuid()); + inv.setCreateDate(vo.getCreateDate()); + inv.setLastOpDate(vo.getLastOpDate()); + inv.setPorts(PhysicalSwitchPortInventory.valueOf(vo.getPorts())); + return inv; + } + + public static List valueOf(Collection vos) { + List invs = new ArrayList<>(); + for (PhysicalSwitchVO vo : vos) { + invs.add(valueOf(vo)); + } + return invs; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public String getMac() { + return mac; + } + + public void setMac(String mac) { + this.mac = mac; + } + + public String getMode() { + return mode; + } + + public void setMode(String mode) { + this.mode = mode; + } + + public String getSoftwareVersion() { + return softwareVersion; + } + + public void setSoftwareVersion(String softwareVersion) { + this.softwareVersion = softwareVersion; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + + public List getPorts() { + return ports; + } + + public void setPorts(List ports) { + this.ports = ports; + } + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchInventoryDoc_zh_cn.groovy b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..86520347a16 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchInventoryDoc_zh_cn.groovy @@ -0,0 +1,78 @@ +package org.zstack.network.hostNetworkInterface + +import java.sql.Timestamp +import org.zstack.network.hostNetworkInterface.PhysicalSwitchPortInventory + +doc { + + title "物理交换机清单" + + field { + name "uuid" + desc "资源的UUID,唯一标示该资源" + type "String" + since "5.3.28" + } + field { + name "name" + desc "资源名称" + type "String" + since "5.3.28" + } + field { + name "description" + desc "资源的详细描述" + type "String" + since "5.3.28" + } + field { + name "ip" + desc "物理交换机管理IP地址" + type "String" + since "5.3.28" + } + field { + name "mac" + desc "物理交换机MAC地址" + type "String" + since "5.3.28" + } + field { + name "mode" + desc "物理交换机工作模式(Switch,Router)" + type "String" + since "5.3.28" + } + field { + name "softwareVersion" + desc "物理交换机软件版本" + type "String" + since "5.3.28" + } + field { + name "sdnControllerUuid" + desc "SDN控制器uuid" + type "String" + since "5.3.28" + } + field { + name "createDate" + desc "创建时间" + type "Timestamp" + since "5.3.28" + } + field { + name "lastOpDate" + desc "最后一次修改时间" + type "Timestamp" + since "5.3.28" + } + ref { + name "ports" + path "org.zstack.network.hostNetworkInterface.PhysicalSwitchInventory.ports" + desc "null" + type "List" + since "5.3.28" + clz PhysicalSwitchPortInventory.class + } +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortInventory.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortInventory.java new file mode 100644 index 00000000000..917b18ae891 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortInventory.java @@ -0,0 +1,135 @@ +package org.zstack.network.hostNetworkInterface; + +import org.zstack.header.configuration.PythonClassInventory; +import org.zstack.header.search.Inventory; + +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Physical Switch Port Inventory + */ +@Inventory(mappingVOClass = PhysicalSwitchPortVO.class) +@PythonClassInventory +public class PhysicalSwitchPortInventory implements Serializable { + + private String uuid; + private String name; + private String description; + private String ethTrunkName; + private String portType; + private String peerInterfaceUuid; + private String switchUuid; + private String sdnControllerUuid; + private Timestamp createDate; + private Timestamp lastOpDate; + + public static PhysicalSwitchPortInventory valueOf(PhysicalSwitchPortVO vo) { + if (vo == null) { + return null; + } + PhysicalSwitchPortInventory inv = new PhysicalSwitchPortInventory(); + inv.setUuid(vo.getUuid()); + inv.setName(vo.getName()); + inv.setDescription(vo.getDescription()); + inv.setEthTrunkName(vo.getEthTrunkName()); + inv.setPortType(vo.getPortType()); + inv.setPeerInterfaceUuid(vo.getPeerInterfaceUuid()); + inv.setSwitchUuid(vo.getSwitchUuid()); + inv.setCreateDate(vo.getCreateDate()); + inv.setLastOpDate(vo.getLastOpDate()); + inv.setSdnControllerUuid(vo.getSdnControllerUuid()); + return inv; + } + + public static List valueOf(Collection vos) { + List invs = new ArrayList<>(); + for (PhysicalSwitchPortVO vo : vos) { + invs.add(valueOf(vo)); + } + return invs; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getEthTrunkName() { + return ethTrunkName; + } + + public void setEthTrunkName(String ethTrunkName) { + this.ethTrunkName = ethTrunkName; + } + + public String getPortType() { + return portType; + } + + public void setPortType(String portType) { + this.portType = portType; + } + + public String getPeerInterfaceUuid() { + return peerInterfaceUuid; + } + + public void setPeerInterfaceUuid(String peerInterfaceUuid) { + this.peerInterfaceUuid = peerInterfaceUuid; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + + public String getSwitchUuid() { + return switchUuid; + } + + public void setSwitchUuid(String switchUuid) { + this.switchUuid = switchUuid; + } + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortInventoryDoc_zh_cn.groovy b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..8da98357885 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortInventoryDoc_zh_cn.groovy @@ -0,0 +1,69 @@ +package org.zstack.network.hostNetworkInterface + +import java.sql.Timestamp + +doc { + + title "物理交换机端口清单" + + field { + name "uuid" + desc "资源的UUID,唯一标示该资源" + type "String" + since "5.3.28" + } + field { + name "name" + desc "资源名称" + type "String" + since "5.3.28" + } + field { + name "description" + desc "资源的详细描述" + type "String" + since "5.3.28" + } + field { + name "ethTrunkName" + desc "物理交换机端口所属的trunk名称" + type "String" + since "5.3.28" + } + field { + name "portType" + desc "物理交换机端口链路类型" + type "String" + since "5.3.28" + } + field { + name "peerInterfaceUuid" + desc "物理交换机端口连接服务器接口uuid" + type "String" + since "5.3.28" + } + field { + name "switchUuid" + desc "物理交换机端口所属交换机uuid" + type "String" + since "5.3.28" + } + field { + name "sdnControllerUuid" + desc "SDN控制器uuid" + type "String" + since "5.3.28" + } + field { + name "createDate" + desc "创建时间" + type "Timestamp" + since "5.3.28" + } + field { + name "lastOpDate" + desc "最后一次修改时间" + type "Timestamp" + since "5.3.28" + } +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortVO.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortVO.java new file mode 100644 index 00000000000..9480d946f2b --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortVO.java @@ -0,0 +1,150 @@ +package org.zstack.network.hostNetworkInterface; + +import org.zstack.header.identity.OwnedByAccount; +import org.zstack.header.tag.AutoDeleteTag; +import org.zstack.header.vo.ForeignKey; +import org.zstack.header.vo.ResourceVO; +import org.zstack.header.vo.ToInventory; + +import javax.persistence.*; +import java.sql.Timestamp; + +/** + * Physical Switch Port Value Object + */ +@Entity +@Table(name = "PhysicalSwitchPortVO") +@AutoDeleteTag +public class PhysicalSwitchPortVO extends ResourceVO implements ToInventory, OwnedByAccount { + + @Column + private String name; + + @Column + private String description; + + @Column + private String ethTrunkName; + + @Column + private String portType; + + @Column + @ForeignKey(parentEntityClass = PhysicalSwitchVO.class, parentKey = "uuid", onDeleteAction = ForeignKey.ReferenceOption.CASCADE) + private String switchUuid; + + @Column + @ForeignKey(parentEntityClass = HostNetworkInterfaceVO.class, parentKey = "uuid") + private String peerInterfaceUuid; + + @Column + private String sdnControllerUuid; + + @Column + private Timestamp createDate; + + @Column + private Timestamp lastOpDate; + + @Transient + private String accountUuid; + + @PreUpdate + private void preUpdate() { + lastOpDate = null; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getEthTrunkName() { + return ethTrunkName; + } + + public void setEthTrunkName(String ethTrunkName) { + this.ethTrunkName = ethTrunkName; + } + + public String getPortType() { + return portType; + } + + public void setPortType(String portType) { + this.portType = portType; + } + + public String getPeerInterfaceUuid() { + return peerInterfaceUuid; + } + + public void setPeerInterfaceUuid(String peerInterfaceUuid) { + this.peerInterfaceUuid = peerInterfaceUuid; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + + public String getSwitchUuid() { + return switchUuid; + } + + public void setSwitchUuid(String switchUuid) { + this.switchUuid = switchUuid; + } + + @Override + public String getAccountUuid() { + return accountUuid; + } + + @Override + public void setAccountUuid(String accountUuid) { + this.accountUuid = accountUuid; + } + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public void copyFromAnother(PhysicalSwitchPortVO vo) { + this.name = vo.name; + this.description = vo.description; + this.ethTrunkName = vo.ethTrunkName; + this.portType = vo.portType; + this.switchUuid = vo.switchUuid; + this.sdnControllerUuid = vo.sdnControllerUuid; + if (vo.getPeerInterfaceUuid() != null) { + this.peerInterfaceUuid = vo.getPeerInterfaceUuid(); + } + } +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortVO_.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortVO_.java new file mode 100644 index 00000000000..76d963b73e4 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortVO_.java @@ -0,0 +1,23 @@ +package org.zstack.network.hostNetworkInterface; + +import org.zstack.header.vo.ResourceVO_; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; +import java.sql.Timestamp; + +/** + * Physical Switch Port VO Metamodel + */ +@StaticMetamodel(PhysicalSwitchPortVO.class) +public class PhysicalSwitchPortVO_ extends ResourceVO_ { + public static volatile SingularAttribute name; + public static volatile SingularAttribute description; + public static volatile SingularAttribute ethTrunkName; + public static volatile SingularAttribute portType; + public static volatile SingularAttribute peerInterfaceUuid; + public static volatile SingularAttribute switchUuid; + public static volatile SingularAttribute sdnControllerUuid; + public static volatile SingularAttribute createDate; + public static volatile SingularAttribute lastOpDate; +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchVO.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchVO.java new file mode 100644 index 00000000000..8c8cb7bbce8 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchVO.java @@ -0,0 +1,162 @@ +package org.zstack.network.hostNetworkInterface; + +import org.zstack.header.identity.OwnedByAccount; +import org.zstack.header.tag.AutoDeleteTag; +import org.zstack.header.vm.VmNicVO; +import org.zstack.header.vo.NoView; +import org.zstack.header.vo.ResourceVO; +import org.zstack.header.vo.ToInventory; + +import javax.persistence.*; +import java.sql.Timestamp; +import java.util.HashSet; +import java.util.Set; + +/** + * Physical Switch Value Object + */ +@Entity +@Table +@AutoDeleteTag +public class PhysicalSwitchVO extends ResourceVO implements ToInventory, OwnedByAccount { + + @Column + private String name; + + @Column + private String description; + + @Column + private String ip; + + @Column + private String mac; + + @Column + private String mode; + + @Column + private String softwareVersion; + + @Column + private String sdnControllerUuid; + + @Column + private Timestamp createDate; + + @Column + private Timestamp lastOpDate; + + @Transient + private String accountUuid; + + @OneToMany(fetch = FetchType.EAGER) + @JoinColumn(name = "switchUuid", insertable = false, updatable = false) + @NoView + private Set ports = new HashSet(); + + @PreUpdate + private void preUpdate() { + lastOpDate = null; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public String getMac() { + return mac; + } + + public void setMac(String mac) { + this.mac = mac; + } + + public String getMode() { + return mode; + } + + public void setMode(String mode) { + this.mode = mode; + } + + public String getSoftwareVersion() { + return softwareVersion; + } + + public void setSoftwareVersion(String softwareVersion) { + this.softwareVersion = softwareVersion; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + + @Override + public String getAccountUuid() { + return accountUuid; + } + + @Override + public void setAccountUuid(String accountUuid) { + this.accountUuid = accountUuid; + } + + public Set getPorts() { + return ports; + } + + public void setPorts(Set ports) { + this.ports = ports; + } + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public void copyFromAnother(PhysicalSwitchVO vo) { + this.name = vo.name; + this.description = vo.description; + this.ip = vo.ip; + this.mac = vo.mac; + this.mode = vo.mode; + this.softwareVersion = vo.softwareVersion; + this.sdnControllerUuid = vo.sdnControllerUuid; + } +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchVO_.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchVO_.java new file mode 100644 index 00000000000..ac2f1c68b4d --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchVO_.java @@ -0,0 +1,23 @@ +package org.zstack.network.hostNetworkInterface; + +import org.zstack.header.vo.ResourceVO_; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; +import java.sql.Timestamp; + +/** + * Physical Switch VO Metamodel + */ +@StaticMetamodel(PhysicalSwitchVO.class) +public class PhysicalSwitchVO_ extends ResourceVO_ { + public static volatile SingularAttribute name; + public static volatile SingularAttribute description; + public static volatile SingularAttribute ip; + public static volatile SingularAttribute mac; + public static volatile SingularAttribute mode; + public static volatile SingularAttribute softwareVersion; + public static volatile SingularAttribute sdnControllerUuid; + public static volatile SingularAttribute createDate; + public static volatile SingularAttribute lastOpDate; +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/RBACInfo.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/RBACInfo.java new file mode 100644 index 00000000000..fd189fcb4d0 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/RBACInfo.java @@ -0,0 +1,32 @@ +package org.zstack.network.hostNetworkInterface; + +import org.zstack.header.identity.rbac.RBACDescription; + +public class RBACInfo implements RBACDescription { + @Override + public void permissions() { + permissionBuilder() + .name("hostNetwork") + .adminOnlyAPIs("org.zstack.network.hostNetworkInterface.**") + .build(); + } + + @Override + public void contributeToRoles() { + + } + + @Override + public void roles() { + roleBuilder() + .name("hostNetwork") + .uuid("4266a77e46cb4e68864899458287941e") + .permissionsByName("hostNetwork") + .build(); + } + + @Override + public void globalReadableResources() { + + } +} \ No newline at end of file diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpKvmAgentCommands.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpKvmAgentCommands.java index 98cd7a92d31..8c65ffb3597 100644 --- a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpKvmAgentCommands.java +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpKvmAgentCommands.java @@ -1,5 +1,6 @@ package org.zstack.network.hostNetworkInterface.lldp; +import org.zstack.core.upgrade.GrayVersion; import org.zstack.core.validation.ConditionalValidation; import java.util.List; @@ -36,6 +37,7 @@ public boolean needValidation() { } public static class ChangeLldpModeCmd extends AgentCommand { + @GrayVersion(value = "5.0.0") private List physicalInterfaceNames; private String mode; @@ -61,6 +63,7 @@ public static class ChangeLldpModeResponse extends AgentResponse { } public static class GetLldpInfoCmd extends AgentCommand { + @GrayVersion(value = "5.0.0") private String physicalInterfaceName; public String getPhysicalInterfaceName() { @@ -73,6 +76,7 @@ public void setPhysicalInterfaceName(String physicalInterfaceName) { } public static class GetLldpInfoResponse extends AgentResponse { + @GrayVersion(value = "5.0.0") private LldpInfoStruct lldpInfo; public LldpInfoStruct getLldpInfo() { diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpManagerImpl.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpManagerImpl.java index 8a9495eaaaf..95501e8cf1c 100644 --- a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpManagerImpl.java +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpManagerImpl.java @@ -1,8 +1,10 @@ package org.zstack.network.hostNetworkInterface.lldp; import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusCallBack; +import org.zstack.core.cloudbus.EventFacade; import org.zstack.core.cloudbus.MessageSafe; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; @@ -10,7 +12,11 @@ import org.zstack.core.db.SQL; import org.zstack.header.AbstractService; import org.zstack.header.core.Completion; +import org.zstack.header.core.NoErrorCompletion; +import org.zstack.header.core.ReturnValueCompletion; +import org.zstack.header.core.WhileDoneCompletion; import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.host.*; import org.zstack.header.identity.AccountConstant; import org.zstack.header.message.APIMessage; @@ -18,6 +24,8 @@ import org.zstack.header.message.MessageReply; import org.zstack.kvm.KVMHostAsyncHttpCallMsg; import org.zstack.kvm.KVMHostAsyncHttpCallReply; +import org.zstack.kvm.KVMHostInventory; +import org.zstack.kvm.KVMPingAgentNoFailureExtensionPoint; import org.zstack.network.hostNetworkInterface.*; import org.zstack.network.hostNetworkInterface.lldp.api.*; import org.zstack.network.hostNetworkInterface.lldp.entity.*; @@ -31,13 +39,16 @@ import static org.zstack.core.Platform.operr; -public class LldpManagerImpl extends AbstractService implements HostAfterConnectedExtensionPoint, HostDeleteExtensionPoint { +public class LldpManagerImpl extends AbstractService implements HostAfterConnectedExtensionPoint, HostDeleteExtensionPoint, + KVMPingAgentNoFailureExtensionPoint { private static final CLogger logger = Utils.getLogger(LldpManagerImpl.class); @Autowired private DatabaseFacade dbf; @Autowired private CloudBus bus; + @Autowired + private EventFacade evtf; private final Map interfaceLocks = new ConcurrentHashMap<>(); @@ -61,7 +72,11 @@ public void handleMessage(Message msg) { } private void handleLocalMessage(Message msg) { - bus.dealWithUnknownMessage(msg); + if (msg instanceof GetHostNetworkInterfaceLldpMsg) { + handle((GetHostNetworkInterfaceLldpMsg) msg); + } else { + bus.dealWithUnknownMessage(msg); + } } private void handleApiMessage(APIMessage msg) { @@ -167,13 +182,66 @@ private synchronized void syncHostNetworkInterfaceLldpInDb(String interfaceUuid, refVO.setLastOpDate(new Timestamp(System.currentTimeMillis())); dbf.updateAndRefresh(refVO); } + + /* link host network interface to physical interface based on: + HostNetworkInterfaceLldpRefVO.systemName == PhysicalSwitchVO.name + && HostNetworkInterfaceLldpRefVO.portId == PhysicalSwitchPortVO.name + > select lldpUuid,chassisId,systemName,portId,aggregationPortId from HostNetworkInterfaceLldpRefVO; +----------------------------------+-------------------+------------+------------+-------------------+ +| lldpUuid | chassisId | systemName | portId | aggregationPortId | ++----------------------------------+-------------------+------------+------------+-------------------+ +| 0a89ae9894274b608b3e5cd29b20e216 | c0:e3:fb:65:ab:d1 | huawei_152 | 10GE1/0/13 | NULL | +| d3905992b4c043099c86785b0ee3186d | c0:e3:fb:65:ab:d1 | huawei_152 | 10GE1/0/11 | 1 | ++----------------------------------+-------------------+------------+------------+-------------------+ + select uuid,name,mac from PhysicalSwitchVO; ++----------------------------------+------------+-------------------+ +| uuid | name | mac | ++----------------------------------+------------+-------------------+ +| b9d708c427c630b1b9fffe2d989c3a48 | huawei_152 | C0:E3:FB:65:AB:D1 | ++----------------------------------+------------+-------------------+ +1 row in set (0.000 sec) +select name,ethTrunkName,switchUuid from PhysicalSwitchPortVO limit 1; ++------------+--------------+----------------------------------+ +| name | ethTrunkName | switchUuid | ++------------+--------------+----------------------------------+ +| 10GE1/0/30 | NULL | b9d708c427c630b1b9fffe2d989c3a48 | ++------------+--------------+----------------------------------+ + */ + PhysicalSwitchVO switchVO = Q.New(PhysicalSwitchVO.class) + .eq(PhysicalSwitchVO_.name, refVO.getSystemName()).limit(1).find(); + if (switchVO != null) { + PhysicalSwitchPortVO oldPhysicalSwitchPortVO = Q.New(PhysicalSwitchPortVO.class) + .eq(PhysicalSwitchPortVO_.peerInterfaceUuid, interfaceUuid).find(); + PhysicalSwitchPortVO physicalSwitchPortVO = Q.New(PhysicalSwitchPortVO.class) + .eq(PhysicalSwitchPortVO_.switchUuid, switchVO.getUuid()) + .eq(PhysicalSwitchPortVO_.name, refVO.getPortId()).limit(1).find(); + if (physicalSwitchPortVO != null) { + logger.debug(String.format("link host network interface[uuid:%s] to physical switch port[uuid:%s,name:%s]", + interfaceUuid, physicalSwitchPortVO.getUuid(), physicalSwitchPortVO.getName())); + if (physicalSwitchPortVO.getPeerInterfaceUuid() != null && physicalSwitchPortVO.getPeerInterfaceUuid().equals(interfaceUuid)) { + logger.debug(String.format("physical switch port[uuid:%s,name:%s] is already linked to host network interface[uuid:%s], skip", + physicalSwitchPortVO.getUuid(), physicalSwitchPortVO.getName(), physicalSwitchPortVO.getPeerInterfaceUuid())); + return; + } + physicalSwitchPortVO.setPeerInterfaceUuid(interfaceUuid); + dbf.update(physicalSwitchPortVO); + + if (oldPhysicalSwitchPortVO != null) { + oldPhysicalSwitchPortVO.setPeerInterfaceUuid(null); + dbf.update(oldPhysicalSwitchPortVO); + } + + HostNetworkInterfaceCanonicalEvents.PeerPortChangedData data = new HostNetworkInterfaceCanonicalEvents.PeerPortChangedData(); + data.setInterfaceUuid(interfaceUuid); + data.setOldPhysicalSwitchPort(PhysicalSwitchPortInventory.valueOf(oldPhysicalSwitchPortVO)); + data.setNewPhysiaclSwitchPort(PhysicalSwitchPortInventory.valueOf(physicalSwitchPortVO)); + evtf.fire(HostNetworkInterfaceCanonicalEvents.PEER_PORT_CHANGED, data); + } + } } } - private void handle(APIGetHostNetworkInterfaceLldpMsg msg) { - APIGetHostNetworkInterfaceLldpReply greply = new APIGetHostNetworkInterfaceLldpReply(); - - HostNetworkInterfaceVO interfaceVO = dbf.findByUuid(msg.getInterfaceUuid(), HostNetworkInterfaceVO.class); + void doGetHostNetworkInterfaceLLdpInfo(String interfaceUuid, ReturnValueCompletion completion) { + HostNetworkInterfaceVO interfaceVO = dbf.findByUuid(interfaceUuid, HostNetworkInterfaceVO.class); final LldpKvmAgentCommands.GetLldpInfoCmd cmd = new LldpKvmAgentCommands.GetLldpInfoCmd(); cmd.setPhysicalInterfaceName(interfaceVO.getInterfaceName()); @@ -182,28 +250,65 @@ private void handle(APIGetHostNetworkInterfaceLldpMsg msg) { kmsg.setHostUuid(interfaceVO.getHostUuid()); kmsg.setCommand(cmd); bus.makeTargetServiceIdByResourceUuid(kmsg, HostConstant.SERVICE_ID, interfaceVO.getHostUuid()); - bus.send(kmsg, new CloudBusCallBack(msg) { + bus.send(kmsg, new CloudBusCallBack(completion) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { - greply.setError(reply.getError()); - bus.reply(msg, greply); + completion.fail(reply.getError()); return; } else { KVMHostAsyncHttpCallReply r = reply.castReply(); LldpKvmAgentCommands.GetLldpInfoResponse rsp = r.toResponse(LldpKvmAgentCommands.GetLldpInfoResponse.class); if (!rsp.isSuccess()) { - greply.setError(operr("operation error, because %s", rsp.getError())); + completion.fail(operr("operation error, because %s", rsp.getError())); } else { - HostNetworkInterfaceLldpVO vo = Q.New(HostNetworkInterfaceLldpVO.class).eq(HostNetworkInterfaceLldpVO_.interfaceUuid, msg.getInterfaceUuid()).find(); - - syncHostNetworkInterfaceLldpInDb(msg.getInterfaceUuid(), rsp.getLldpInfo()); + HostNetworkInterfaceLldpVO vo = Q.New(HostNetworkInterfaceLldpVO.class) + .eq(HostNetworkInterfaceLldpVO_.interfaceUuid, interfaceUuid).find(); + syncHostNetworkInterfaceLldpInDb(interfaceUuid, rsp.getLldpInfo()); HostNetworkInterfaceLldpRefVO lldpRefVO = Q.New(HostNetworkInterfaceLldpRefVO.class) .eq(HostNetworkInterfaceLldpRefVO_.lldpUuid, vo.getUuid()) .find(); - greply.setLldp(lldpRefVO != null ? HostNetworkInterfaceLldpRefInventory.valueOf(lldpRefVO) : null); + if (lldpRefVO != null) { + completion.success(HostNetworkInterfaceLldpRefInventory.valueOf(lldpRefVO)); + } else { + completion.fail(operr("get lldp ref for[%s] failed", interfaceUuid)); + } } } + } + }); + } + + private void handle(GetHostNetworkInterfaceLldpMsg msg) { + GetHostNetworkInterfaceLldpReply reply = new GetHostNetworkInterfaceLldpReply(); + doGetHostNetworkInterfaceLLdpInfo(msg.getInterfaceUuid(), new ReturnValueCompletion(msg) { + @Override + public void success(HostNetworkInterfaceLldpRefInventory returnValue) { + reply.setLldp(returnValue); + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } + + private void handle(APIGetHostNetworkInterfaceLldpMsg msg) { + APIGetHostNetworkInterfaceLldpReply greply = new APIGetHostNetworkInterfaceLldpReply(); + + doGetHostNetworkInterfaceLLdpInfo(msg.getInterfaceUuid(), new ReturnValueCompletion(msg) { + @Override + public void success(HostNetworkInterfaceLldpRefInventory returnValue) { + greply.setLldp(returnValue); + bus.reply(msg, greply); + } + + @Override + public void fail(ErrorCode errorCode) { + greply.setError(errorCode); bus.reply(msg, greply); } }); @@ -321,6 +426,59 @@ public void afterDeleteHost(HostInventory inventory) { } + @Override + public void kvmPingAgentNoFailure(KVMHostInventory host, NoErrorCompletion completion) { + List interfaceUuids = Q.New(HostNetworkInterfaceVO.class) + .select(HostNetworkInterfaceVO_.uuid) + .eq(HostNetworkInterfaceVO_.hostUuid, host.getUuid()) + .listValues(); + if (interfaceUuids.isEmpty()) { + completion.done(); + return; + } + + List lldpVOS = Q.New(HostNetworkInterfaceLldpVO.class) + .in(HostNetworkInterfaceLldpVO_.interfaceUuid, interfaceUuids) + .list(); + List toUpdate = new ArrayList<>(); + for (HostNetworkInterfaceLldpVO lldpVO : lldpVOS) { + if (LldpConstant.mode.disable.toString().equals(lldpVO.getMode())) { + continue; + } + + if (lldpVO.getNeighborDevice() != null) { + continue; + } + + toUpdate.add(lldpVO); + } + + if (toUpdate.isEmpty()) { + completion.done(); + return; + } + + new While<>(toUpdate).each((lldpVO, wcomp) -> { + doGetHostNetworkInterfaceLLdpInfo(lldpVO.getInterfaceUuid(), new ReturnValueCompletion(wcomp) { + @Override + public void success(HostNetworkInterfaceLldpRefInventory returnValue) { + wcomp.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + logger.debug("get lldp info failed, ignore it"); + wcomp.done(); + } + }); + }).run(new WhileDoneCompletion(completion) { + @Override + public void done(ErrorCodeList errorCodeList) { + completion.done(); + } + }); + } + @Override public String getId() { return bus.makeLocalServiceId(LldpConstant.SERVICE_ID); diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/GetHostNetworkInterfaceLldpMsg.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/GetHostNetworkInterfaceLldpMsg.java new file mode 100644 index 00000000000..2efe1526b36 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/GetHostNetworkInterfaceLldpMsg.java @@ -0,0 +1,15 @@ +package org.zstack.network.hostNetworkInterface.lldp.api; + +import org.zstack.header.message.NeedReplyMessage; + +public class GetHostNetworkInterfaceLldpMsg extends NeedReplyMessage { + private String interfaceUuid; + + public String getInterfaceUuid() { + return interfaceUuid; + } + + public void setInterfaceUuid(String interfaceUuid) { + this.interfaceUuid = interfaceUuid; + } +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/GetHostNetworkInterfaceLldpReply.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/GetHostNetworkInterfaceLldpReply.java new file mode 100644 index 00000000000..f182596b7e2 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/GetHostNetworkInterfaceLldpReply.java @@ -0,0 +1,18 @@ +package org.zstack.network.hostNetworkInterface.lldp.api; + +import org.zstack.header.message.MessageReply; +import org.zstack.network.hostNetworkInterface.lldp.entity.HostNetworkInterfaceLldpRefInventory; + +import java.io.Serializable; + +public class GetHostNetworkInterfaceLldpReply extends MessageReply implements Serializable { + private HostNetworkInterfaceLldpRefInventory lldp; + + public HostNetworkInterfaceLldpRefInventory getLldp() { + return lldp; + } + + public void setLldp(HostNetworkInterfaceLldpRefInventory lldp) { + this.lldp = lldp; + } +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/entity/HostNetworkInterfaceLldpRefVO_.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/entity/HostNetworkInterfaceLldpRefVO_.java index 42821501466..46036735b4a 100644 --- a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/entity/HostNetworkInterfaceLldpRefVO_.java +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/entity/HostNetworkInterfaceLldpRefVO_.java @@ -14,6 +14,7 @@ public class HostNetworkInterfaceLldpRefVO_ { public static volatile SingularAttribute systemName; public static volatile SingularAttribute systemDescription; public static volatile SingularAttribute systemCapabilities; + public static volatile SingularAttribute portId; public static volatile SingularAttribute portDescription; public static volatile SingularAttribute vlanId; public static volatile SingularAttribute aggregationPortId; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/RBACInfo.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/RBACInfo.java index d5a9cbfec31..f8a39857c20 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/RBACInfo.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/RBACInfo.java @@ -17,7 +17,11 @@ public void contributeToRoles() { @Override public void roles() { - + roleBuilder() + .name("sdnController") + .uuid("4266a67e46cb4e68864899458287941e") + .permissionsByName("sdnController") + .build(); } @Override diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java index 61d37fa9098..6ed59cf090a 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java @@ -1,6 +1,9 @@ package org.zstack.sdnController; import org.zstack.header.core.Completion; +import org.zstack.header.network.sdncontroller.SdnControllerHostRefVO; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.sdnController.header.*; @@ -13,6 +16,8 @@ public interface SdnController { 有关sdn控制器的后置处理: post-event */ void preInitSdnController(APIAddSdnControllerMsg msg, Completion completion); + void createSdnControllerDb(APIAddSdnControllerMsg msg, SdnControllerVO vo, Completion completion); + void deleteSdnControllerDb(SdnControllerVO vo); void initSdnController(APIAddSdnControllerMsg msg, Completion completion); void postInitSdnController(SdnControllerVO vo, Completion completion); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java index 09b93bdc611..06310557fa5 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java @@ -14,6 +14,10 @@ import org.zstack.header.network.l2.L2NetworkConstant; import org.zstack.header.network.l3.L3NetworkVO; import org.zstack.header.network.l3.L3NetworkVO_; +import org.zstack.header.network.sdncontroller.SdnControllerHostRefVO; +import org.zstack.header.network.sdncontroller.SdnControllerHostRefVO_; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO_; import org.zstack.header.vm.APIAttachL3NetworkToVmMsg; import org.zstack.header.vm.APIChangeVmNicNetworkMsg; import org.zstack.header.vm.VmInstanceVO; @@ -30,6 +34,8 @@ import java.util.List; import java.lang.reflect.Type; import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Map; import static org.zstack.core.Platform.argerr; @@ -52,6 +58,7 @@ private void setServiceId(APIMessage msg) { } } + @Override public List getMessageClassToIntercept() { List ret = new ArrayList<>(); ret.add(APIAttachSecurityGroupToL3NetworkMsg.class); @@ -65,10 +72,12 @@ public List getMessageClassToIntercept() { return ret; } + @Override public InterceptorPosition getPosition() { return InterceptorPosition.END; } + @Override public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionException { if (msg instanceof APIAddSdnControllerMsg) { validate((APIAddSdnControllerMsg)msg); @@ -78,20 +87,16 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti validate((APISdnControllerRemoveHostMsg)msg); } else if (msg instanceof APISdnControllerChangeHostMsg) { validate((APISdnControllerChangeHostMsg)msg); - } else if (msg instanceof APIAttachSecurityGroupToL3NetworkMsg) { - validate((APIAttachSecurityGroupToL3NetworkMsg)msg); - } else if (msg instanceof APIAddVmNicToSecurityGroupMsg) { - validate((APIAddVmNicToSecurityGroupMsg) msg); - } else if (msg instanceof APISetVmNicSecurityGroupMsg) { + } else if (msg instanceof APISetVmNicSecurityGroupMsg) { validate((APISetVmNicSecurityGroupMsg) msg); } else if (msg instanceof APIAddSecurityGroupRuleMsg) { validate((APIAddSecurityGroupRuleMsg) msg); - } else if (msg instanceof APIAttachL3NetworkToVmMsg) { - validate((APIAttachL3NetworkToVmMsg) msg); } else if (msg instanceof APIChangeVmNicNetworkMsg) { validate((APIChangeVmNicNetworkMsg) msg); } else if (msg instanceof APIPullSdnControllerTenantMsg) { validate((APIPullSdnControllerTenantMsg) msg); + } else if (msg instanceof APIChangeSdnControllerMsg) { + validate((APIChangeSdnControllerMsg) msg); } setServiceId(msg); @@ -191,42 +196,18 @@ private void validate(APIAddSecurityGroupRuleMsg msg) { } } - private void validate(APIAddVmNicToSecurityGroupMsg msg) { - String sgControllerUuid = SecurityGroupHelper.getSdnControllerUuid(msg.getSecurityGroupUuid()); - for (String uuid : msg.getVmNicUuids()) { - VmNicVO nicVO = dbf.findByUuid(uuid, VmNicVO.class); - String nicControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(nicVO.getL3NetworkUuid()); - if (!StringUtils.equals(sgControllerUuid, nicControllerUuid)) { - throw new ApiMessageInterceptionException(argerr("could not add vmnic to securityGroup, " + - "because they have different sdn controller[nic controller uuid:%s, security group controller uuid:%s]", - nicControllerUuid, sgControllerUuid)); - } - } - } - - - private void validate(APIAttachSecurityGroupToL3NetworkMsg msg) { - String l3SdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(msg.getL3NetworkUuid()); - String sgSdnControllerUuid = SecurityGroupHelper.getSdnControllerUuid(msg.getSecurityGroupUuid()); - if (!StringUtils.equals(l3SdnControllerUuid, sgSdnControllerUuid)) { - throw new ApiMessageInterceptionException(argerr("could not attach l3 network to securityGroup, " + - "because they have different sdn controller[l3 controller uuid:%s, security group controller uuid:%s]", - l3SdnControllerUuid, sgSdnControllerUuid)); - } - } - private void validate(APIAddSdnControllerMsg msg) { if (!SdnControllerType.getAllTypeNames().contains(msg.getVendorType())) { - throw new ApiMessageInterceptionException(argerr("Sdn controller type: %s in not in the supported list: %s ", msg.getVendorType(), SdnControllerType.getAllTypeNames())); + throw new ApiMessageInterceptionException(argerr("could not add sdn controller because type: %s in not in the supported list: %s", msg.getVendorType(), SdnControllerType.getAllTypeNames())); } if (!NetworkUtils.isUnicastIPAddress(msg.getIp())) { - throw new ApiMessageInterceptionException(argerr("Sdn controller ip[%s] is not an unicast address ", msg.getIp())); + throw new ApiMessageInterceptionException(argerr("could not add sdn controller because ip[%s] is not an unicast address", msg.getIp())); } boolean existed = Q.New(SdnControllerVO.class).eq(SdnControllerVO_.ip, msg.getIp()).isExists(); if (existed) { - throw new ApiMessageInterceptionException(argerr("Sdn controller with ip [%s] is already added ", msg.getIp())); + throw new ApiMessageInterceptionException(argerr("could not add sdn controller because controller [ip:%s] is already added", msg.getIp())); } } @@ -344,4 +325,53 @@ private void validate(APIPullSdnControllerTenantMsg msg) { } } + private void validateVlanRanges(List ranges) { + List sdnVlanRanges = new ArrayList<>(); + for (String range : ranges) { + List vlans = Arrays.asList(range.split("-")); + if (vlans.size() != 2) { + throw new ApiMessageInterceptionException(argerr("could not change sdn controller, " + + "because vlan range[%s] is not in the correct format", range)); + } + + try { + int start = Integer.parseInt(vlans.get(0)); + int end = Integer.parseInt(vlans.get(1)); + if (start > end) { + throw new ApiMessageInterceptionException(argerr("could not change sdn controller, " + + "because vlan range[%s] is not in the correct format", range)); + } + + for (SdnVlanRange vrange : sdnVlanRanges) { + if (isOverlappedVlanRange(start, end, vrange.startVlan, vrange.endVlan)) { + throw new ApiMessageInterceptionException(argerr("could not change sdn controller, " + + "because vlan range[%s] is overlapped with other vlan range", range)); + } + } + SdnVlanRange vlanRange = new SdnVlanRange(); + vlanRange.startVlan = start; + vlanRange.endVlan = end; + sdnVlanRanges.add(vlanRange); + } catch (Exception e) { + throw new ApiMessageInterceptionException(argerr("could not change sdn controller, " + + "because vlan range[%s] is not in the correct format", range)); + } + } + } + + private boolean isOverlappedVlanRange(int start, int end, Integer startVlan, Integer endVlan) { + // Two ranges [start, end] and [startVlan, endVlan] overlap if: + // 1. start is within [startVlan, endVlan], OR + // 2. end is within [startVlan, endVlan], OR + // 3. [start, end] completely contains [startVlan, endVlan] + return (start >= startVlan && start <= endVlan) || + (end >= startVlan && end <= endVlan) || + (start <= startVlan && end >= endVlan); + } + + private void validate(APIChangeSdnControllerMsg msg) { + if (msg.getVlanRanges() != null && !msg.getVlanRanges().isEmpty()) { + validateVlanRanges(msg.getVlanRanges()); + } + } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java index cc508a8e84a..b34e62ba11f 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java @@ -31,11 +31,14 @@ import org.zstack.header.network.l2.DeleteL2NetworkMsg; import org.zstack.header.network.l2.L2NetworkConstant; import org.zstack.header.network.l2.SdnControllerDeleteExtensionPoint; +import org.zstack.header.network.l3.SdnControllerL3; +import org.zstack.header.network.sdncontroller.*; import org.zstack.network.hostNetworkInterface.HostNetworkInterfaceVO; import org.zstack.network.hostNetworkInterface.HostNetworkInterfaceVO_; import org.zstack.sdnController.header.*; import org.zstack.sdnController.h3cVcfc.H3cVcfcV2Commands; import org.zstack.sdnController.h3cVcfc.H3cVcfcV2SdnController; +import org.zstack.tag.SystemTagCreator; import org.zstack.utils.Utils; import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; @@ -49,6 +52,9 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; import static org.zstack.sdnController.header.SdnControllerFlowDataParam.SDN_CONTROLLER_UUID; +import static org.zstack.sdnController.header.SdnControllerFlowDataParam.*; +import static org.zstack.utils.CollectionDSL.e; +import static org.zstack.utils.CollectionDSL.map; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class SdnControllerBase { @@ -68,7 +74,7 @@ public class SdnControllerBase { @Autowired private PluginRegistry pluginRgty; @Autowired - private SdnControllerPingTracker pingTracker; + private SdnControllerPingTracker sdnPingTracker; public SdnControllerVO self; @@ -90,6 +96,11 @@ protected SdnControllerL2 getSdnControllerL2() { return factory.getSdnControllerL2(self); } + protected SdnControllerL3 getSdnControllerL3() { + SdnControllerFactory factory = sdnMgr.getSdnControllerFactory(self.getVendorType()); + return factory.getSdnControllerL3(self); + } + public void handleMessage(SdnControllerMessage msg) { if (msg instanceof APIRemoveSdnControllerMsg) { handle((APIRemoveSdnControllerMsg) msg); @@ -107,6 +118,8 @@ public void handleMessage(SdnControllerMessage msg) { handle((APISdnControllerChangeHostMsg) msg); } else if (msg instanceof APIPullSdnControllerTenantMsg) { handle((APIPullSdnControllerTenantMsg) msg); + } else if (msg instanceof APIChangeSdnControllerMsg) { + handle((APIChangeSdnControllerMsg) msg); } else if (msg instanceof SdnControllerRemoveHostMsg) { handle((SdnControllerRemoveHostMsg) msg); } else if (msg instanceof PullSdnControllerTenantMsg) { @@ -139,6 +152,156 @@ public void changeSdnControllerStatus(SdnControllerStatus status) { evtf.fire(SdnControllerCanonicalEvents.SDNCONTROLLER_STATUS_CHANGED_PATH, d); } + private void doChangeSdnController(APIChangeSdnControllerMsg msg, Completion completion) { + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("change-sdn-controller-%s-%s", self.getUuid(), self.getName())); + chain.then(new Flow() { + String __name__ = "change-sdn-controller-db"; + + @Override + public void run(FlowTrigger trigger, Map data) { + boolean changed = false; + + // Handle name change + if (msg.getUserName() != null && !msg.getUserName().equals(self.getName())) { + chain.getData().put(SDN_CONTROLLER_USERNAME, self.getName()); + self.setUsername(msg.getUserName()); + changed = true; + } + + // Handle password change + if (msg.getPassword() != null && !msg.getPassword().equals(self.getPassword())) { + chain.getData().put(SDN_CONTROLLER_PASSWORD, self.getPassword()); + self.setPassword(msg.getPassword()); + changed = true; + } + + if (changed) { + self = dbf.updateAndRefresh(self); + chain.getData().put(SDN_CONTROLLER_CHANGED, changed); + } + + if (msg.getVlanRanges() != null && !msg.getVlanRanges().isEmpty()) { + SdnControllerSystemTags.VLAN_RANGE.delete(self.getUuid()); + for (String vlanRange : msg.getVlanRanges()) { + List vlans = Arrays.asList(vlanRange.split("-")); + SystemTagCreator creator = SdnControllerSystemTags.VLAN_RANGE.newSystemTagCreator(self.getUuid()); + creator.setTagByTokens(map( + e(SdnControllerSystemTags.START_VLAN_TOKEN, vlans.get(0)), + e(SdnControllerSystemTags.END_VLAN_TOKEN, vlans.get(1)))); + creator.inherent = false; + creator.recreate = false; + creator.ignoreIfExisting = true; + creator.create(); + } + } + + trigger.next(); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + String username = (String)chain.getData().get(SDN_CONTROLLER_USERNAME); + String password = (String)chain.getData().get(SDN_CONTROLLER_PASSWORD); + if (password != null) { + self.setPassword(password); + } + if (username != null) { + self.setUsername(username); + } + if (password != null || username != null) { + self = dbf.updateAndRefresh(self); + } + + trigger.rollback(); + } + }).then(new NoRollbackFlow() { + String __name__ = "ping-sdn-controller"; + + @Override + public void run(FlowTrigger trigger, Map data) { + boolean changed = data.get(SDN_CONTROLLER_CHANGED) == null ? false : (boolean) data.get(SDN_CONTROLLER_CHANGED); + if (!changed) { + // password not changed + trigger.next(); + return; + } + + SdnControllerPingMsg pmsg = new SdnControllerPingMsg(); + pmsg.setSdnControllerUuid(self.getUuid()); + bus.makeTargetServiceIdByResourceUuid(pmsg, SdnControllerConstant.SERVICE_ID, self.getUuid()); + bus.send(pmsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(operr("ping sdn controller failed, error: %s", reply.getError().getDetails())); + } else { + trigger.next(); + } + } + }); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); + } + + private void changeSdnController(APIChangeSdnControllerMsg msg, Completion completion) { + thdf.chainSubmit(new ChainTask(completion) { + @Override + public String getSyncSignature() { + return getSdnControllerSignature(); + } + + @Override + public void run(SyncTaskChain chain) { + doChangeSdnController(msg, new Completion(completion) { + @Override + public void success() { + completion.success(); + chain.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + chain.next(); + } + }); + } + + @Override + public String getName() { + return String.format("change-sdn-controller-%s", self.getUuid()); + } + }); + } + + private void handle(APIChangeSdnControllerMsg msg) { + APIChangeSdnControllerEvent event = new APIChangeSdnControllerEvent(msg.getId()); + changeSdnController(msg, new Completion(msg) { + @Override + public void success() { + event.setInventory(SdnControllerInventory.valueOf(dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class))); + bus.publish(event); + } + + @Override + public void fail(ErrorCode errorCode) { + event.setError(errorCode); + bus.publish(event); + } + }); + } + private void handle(APIReconnectSdnControllerMsg msg) { APIReconnectSdnControllerEvent event = new APIReconnectSdnControllerEvent(msg.getId()); reconnectSdnController(new Completion(msg) { @@ -578,7 +741,7 @@ public void run(FlowTrigger trigger, Map data) { return; } - new While<>(l2Uuids).step((uuid, wcomp) -> { + new While<>(l2Uuids).each((uuid, wcomp) -> { DeleteL2NetworkMsg msg = new DeleteL2NetworkMsg(); msg.setUuid(uuid); bus.makeTargetServiceIdByResourceUuid(msg, L2NetworkConstant.SERVICE_ID, uuid); @@ -591,7 +754,7 @@ public void run(MessageReply reply) { wcomp.done(); } }); - }, 5).run(new WhileDoneCompletion(trigger) { + }).run(new WhileDoneCompletion(trigger) { @Override public void done(ErrorCodeList errorCodeList) { if (errorCodeList.getCauses().isEmpty()) { @@ -614,7 +777,7 @@ public void run(FlowTrigger trigger, Map data) { return; } - new While<>(refVOS).step((ref, wcomp) -> { + new While<>(refVOS).each((ref, wcomp) -> { SdnControllerRemoveHostMsg msg = new SdnControllerRemoveHostMsg(); msg.setSdnControllerUuid(ref.getSdnControllerUuid()); msg.setHostUuid(ref.getHostUuid()); @@ -631,7 +794,7 @@ public void run(MessageReply reply) { wcomp.done(); } }); - }, 5).run(new WhileDoneCompletion(trigger) { + }).run(new WhileDoneCompletion(trigger) { @Override public void done(ErrorCodeList errorCodeList) { if (errorCodeList.getCauses().isEmpty()) { @@ -689,7 +852,7 @@ public void fail(ErrorCode errorCode) { String __name__ = "delete-sdn-controller-on-db"; @Override public void run(FlowTrigger trigger, Map data) { - pingTracker.untrack(msg.getSdnControllerUuid()); + sdnPingTracker.untrack(msg.getSdnControllerUuid()); dbf.removeByPrimaryKey(msg.getSdnControllerUuid(), SdnControllerVO.class); trigger.next(); } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerCascadeExtension.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerCascadeExtension.java index 571d1b52f69..debd10d63c0 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerCascadeExtension.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerCascadeExtension.java @@ -18,6 +18,10 @@ import org.zstack.header.identity.AccountInventory; import org.zstack.header.identity.AccountVO; import org.zstack.header.message.MessageReply; +import org.zstack.header.network.sdncontroller.SdnControllerHostRefVO; +import org.zstack.header.network.sdncontroller.SdnControllerHostRefVO_; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.sdnController.header.*; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; @@ -26,7 +30,6 @@ import javax.persistence.TypedQuery; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.concurrent.Callable; import java.util.stream.Collectors; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerFactory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerFactory.java index f9166c6cde8..6c25dcaddb9 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerFactory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerFactory.java @@ -2,13 +2,16 @@ import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.header.core.workflow.FlowChain; +import org.zstack.header.network.l3.SdnControllerL3; import org.zstack.header.network.service.SdnControllerDhcp; import org.zstack.network.securitygroup.SecurityGroupSdnBackend; -import org.zstack.sdnController.header.SdnControllerVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO; public interface SdnControllerFactory { SdnControllerType getVendorType(); + SdnControllerVO persistSdnController(SdnControllerVO vo); + SdnController getSdnController(SdnControllerVO vo); default SdnController getSdnController(String l2NetworkUuid) {return null;}; @@ -16,6 +19,7 @@ public interface SdnControllerFactory { SdnControllerL2 getSdnControllerL2(SdnControllerVO vo); default SdnControllerL2 getSdnControllerL2(String l2NetworkUuid) {return null;}; + default SdnControllerL3 getSdnControllerL3(SdnControllerVO vo) {return null;}; SecurityGroupSdnBackend getSdnControllerSecurityGroup(SdnControllerVO vo); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java index 312f391f2bc..283da0d16d1 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java @@ -1,6 +1,7 @@ package org.zstack.sdnController; import org.zstack.header.core.Completion; +import org.zstack.header.host.HostInventory; import org.zstack.header.network.l2.APICreateL2NetworkMsg; import org.zstack.header.network.l2.L2NetworkInventory; import org.zstack.header.network.l3.IpRangeInventory; @@ -8,7 +9,7 @@ import org.zstack.header.vm.VmNicInventory; import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; import org.zstack.sdnController.header.SdnControllerDeletionMsg; -import org.zstack.sdnController.header.SdnControllerInventory; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.sdnController.header.SdnVlanRange; import org.zstack.sdnController.header.SdnVniRange; @@ -22,11 +23,12 @@ public interface SdnControllerL2 { void postCreateVxlanNetwork(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); void preAttachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); - void attachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); + void attachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List clusterUuids, List systemTags, Completion completion); + default void attachL2NetworkToHosts(L2VxlanNetworkInventory vxlan, List hinvs, List systemTags, Completion completion) {completion.success();}; void postAttachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); void deleteSdnController(SdnControllerDeletionMsg msg, SdnControllerInventory sdn, Completion completion); - void detachL2NetworkFromCluster(L2VxlanNetworkInventory vxlan, String clusterUuid, Completion completion); + void detachL2NetworkFromCluster(L2VxlanNetworkInventory vxlan, List clusterUuids, Completion completion); void deleteL2Network(L2NetworkInventory inv, Completion completion); List getVniRange(SdnControllerInventory controller); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManager.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManager.java index 57dc76508f9..b2a5633bed2 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManager.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManager.java @@ -2,7 +2,7 @@ import org.zstack.header.core.workflow.FlowChain; import org.zstack.header.network.service.SdnControllerDhcp; -import org.zstack.sdnController.header.SdnControllerVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO; public interface SdnControllerManager { SdnControllerFactory getSdnControllerFactory(String type); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java index 9c4aa23adc1..d0babd87c85 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java @@ -1,5 +1,7 @@ package org.zstack.sdnController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.Platform; import org.zstack.core.asyncbatch.While; @@ -20,7 +22,13 @@ import org.zstack.header.network.NetworkException; import org.zstack.header.network.l2.*; import org.zstack.header.network.l3.*; -import org.zstack.header.network.service.GetSdnControllerDhcpExtensionPoint; +import org.zstack.header.network.l3.L3NetworkInventory; +import org.zstack.header.network.l3.L3NetworkVO; +import org.zstack.header.network.l3.SdnControllerL3; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; +import org.zstack.header.network.sdncontroller.SdnControllerStatus; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.network.service.GetSdnControllerExtensionPoint; import org.zstack.header.network.service.SdnControllerDhcp; import org.zstack.header.vm.*; import org.zstack.network.l2.L2NetworkSystemTags; @@ -42,8 +50,9 @@ public class SdnControllerManagerImpl extends AbstractService implements SdnCont L2NetworkCreateExtensionPoint, L2NetworkDeleteExtensionPoint, InstantiateResourceOnAttachingNicExtensionPoint, PreVmInstantiateResourceExtensionPoint, VmReleaseResourceExtensionPoint, ReleaseNetworkServiceOnDetachingNicExtensionPoint, SecurityGroupGetSdnBackendExtensionPoint, - GetSdnControllerDhcpExtensionPoint, AfterAddIpRangeExtensionPoint, IpRangeDeletionExtensionPoint { + AfterAddIpRangeExtensionPoint, IpRangeDeletionExtensionPoint, GetSdnControllerExtensionPoint { private static final CLogger logger = Utils.getLogger(SdnControllerManagerImpl.class); + private static final Logger log = LoggerFactory.getLogger(SdnControllerManagerImpl.class); @Autowired private CloudBus bus; @@ -109,6 +118,7 @@ public void setup() { @Override public void run(FlowTrigger trigger, Map data) { + msg.setResourceUuid(vo.getUuid()); controller.preInitSdnController(msg, new Completion(trigger) { @Override public void success() { @@ -127,13 +137,23 @@ public void fail(ErrorCode errorCode) { @Override public void run(FlowTrigger trigger, Map data) { - dbf.persist(vo); - trigger.next(); + controller.createSdnControllerDb(msg, vo, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + logger.debug(String.format("create sdn controller db error: %s", errorCode.getDetails())); + trigger.fail(errorCode); + } + }); } @Override public void rollback(FlowRollback trigger, Map data) { - dbf.removeByPrimaryKey(vo.getUuid(), SdnControllerVO.class); + controller.deleteSdnControllerDb(vo); trigger.rollback(); } }); @@ -150,7 +170,7 @@ public void success() { @Override public void fail(ErrorCode errorCode) { - dbf.removeByPrimaryKey(vo.getUuid(), SdnControllerVO.class); + controller.deleteSdnControllerDb(vo); trigger.fail(errorCode); } }); @@ -214,6 +234,11 @@ private void handle(APIAddSdnControllerMsg msg) { vo.setUsername(msg.getUserName()); vo.setPassword(msg.getPassword()); vo.setAccountUuid(msg.getSession().getAccountUuid()); + if (msg.getVendorVersion() != null) { + vo.setVendorVersion(msg.getVendorVersion()); + } else { + vo.setVendorVersion(SdnControllerConstant.DEFAULT_SDN_CONTROLLER_VERSION); + } vo.setStatus(SdnControllerStatus.Connected); doCreateSdnController(vo, msg, new Completion(msg) { @@ -295,6 +320,7 @@ public void beforeDeleteL2Network(L2NetworkInventory inventory) { public void deleteL2Network(L2NetworkInventory inv, NoErrorCompletion completion) { VSwitchType vSwitchType = VSwitchType.valueOf(inv.getvSwitchType()); if (vSwitchType.getSdnControllerType() == null) { + //hardware vxlan will go this path completion.done(); return; } @@ -709,6 +735,22 @@ public SdnControllerDhcp getSdnControllerDhcp(String l3Uuid) { return factory.getSdnControllerDhcp(vo); } + @Override + public SdnControllerL3 getSdnControllerL3(String l2Uuid) { + String controllerUuid = L3NetworkHelper.getSdnControllerUuidFromL2Uuid(l2Uuid); + if (controllerUuid == null) { + return null; + } + + SdnControllerVO vo = dbf.findByUuid(controllerUuid, SdnControllerVO.class); + if (vo == null) { + throw new CloudRuntimeException(String.format("can not find sdn controller[uuid:%s] for l2 network[uuid:%s]", + controllerUuid, l2Uuid)); + } + SdnControllerFactory factory = getSdnControllerFactory(vo.getVendorType()); + return factory.getSdnControllerL3(vo); + } + @Override public FlowChain getSyncChain(SdnControllerVO sdnControllerVO) { SdnControllerFactory f = getSdnControllerFactory(sdnControllerVO.getVendorType()); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java index 875b314e9b8..951838093ec 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java @@ -16,6 +16,9 @@ import org.zstack.header.message.MessageReply; import org.zstack.header.message.NeedReplyMessage; import org.zstack.header.network.l2.SdnControllerDeleteExtensionPoint; +import org.zstack.header.network.sdncontroller.SdnControllerStatus; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO_; import org.zstack.sdnController.header.*; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerSystemTags.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerSystemTags.java new file mode 100644 index 00000000000..1ced576c095 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerSystemTags.java @@ -0,0 +1,18 @@ +package org.zstack.sdnController; + +import org.zstack.header.tag.TagDefinition; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.tag.PatternedSystemTag; + +@TagDefinition +public class SdnControllerSystemTags { + public static String START_VNI_TOKEN = "startVni"; + public static String END_VNI_TOKEN = "endVni"; + public static PatternedSystemTag VNI_RANGE = new PatternedSystemTag(String.format("startVni::{%s}::endVni::{%s}", + START_VNI_TOKEN, END_VNI_TOKEN), SdnControllerVO.class); + + public static String START_VLAN_TOKEN = "startVlan"; + public static String END_VLAN_TOKEN = "endVlan"; + public static PatternedSystemTag VLAN_RANGE = new PatternedSystemTag(String.format("startVlan::{%s}::endVlan::{%s}", + START_VLAN_TOKEN, END_VLAN_TOKEN), SdnControllerVO.class); +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java index d2751c15cf2..726b3bd657e 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java @@ -11,7 +11,11 @@ import org.zstack.header.network.l2.APIAttachL2NetworkToClusterMsg; import org.zstack.header.network.l2.APIDetachL2NetworkFromClusterMsg; import org.zstack.header.network.l3.*; +import org.zstack.header.network.sdncontroller.SdnControllerStatus; import org.zstack.network.l2.L2NetworkSystemTags; +import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolVO; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.network.l2.vxlan.vxlanNetwork.APICreateL2VxlanNetworkMsg; import org.zstack.network.l2.vxlan.vxlanNetwork.APIDeleteVxlanL2Network; import org.zstack.network.l2.vxlan.vxlanNetworkPool.APICreateVniRangeMsg; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java index a0192966bbb..e563e8af159 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java @@ -12,10 +12,16 @@ import org.zstack.header.core.Completion; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.host.HostInventory; import org.zstack.header.message.Message; import org.zstack.header.network.l2.APICreateL2NetworkMsg; import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.network.l3.IpRangeInventory; +import org.zstack.header.network.l3.L3NetworkInventory; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RESTFacade; +import org.zstack.header.vm.VmNicInventory; import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; import org.zstack.sdnController.*; @@ -24,6 +30,7 @@ import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; +import javax.persistence.Tuple; import java.util.*; import static org.zstack.core.Platform.operr; @@ -95,13 +102,13 @@ public void getH3cVniRanges(Completion completion) { for (H3cVcfcCommands.VniRangeStruct v : d.vlan_map_list) { Integer startVni = Integer.valueOf(v.start_vxlan); Integer endVni = Integer.valueOf(v.end_vxlan); - SystemTagCreator creator = H3cVcfcSdnControllerSystemTags.H3C_VNI_RANGE.newSystemTagCreator(self.getUuid()); + SystemTagCreator creator = SdnControllerSystemTags.VNI_RANGE.newSystemTagCreator(self.getUuid()); creator.ignoreIfExisting = false; creator.inherent = false; creator.setTagByTokens( map( - e(H3cVcfcSdnControllerSystemTags.H3C_START_VNI_TOKEN, v.start_vxlan), - e(H3cVcfcSdnControllerSystemTags.H3C_END_VNI_TOKEN, v.end_vxlan) + e(SdnControllerSystemTags.START_VNI_TOKEN, v.start_vxlan), + e(SdnControllerSystemTags.END_VNI_TOKEN, v.end_vxlan) ) ); creator.create(); @@ -231,6 +238,17 @@ public void preInitSdnController(APIAddSdnControllerMsg msg, Completion completi completion.success(); } + @Override + public void createSdnControllerDb(APIAddSdnControllerMsg msg, SdnControllerVO vo, Completion completion) { + dbf.persist(vo); + completion.success(); + } + + @Override + public void deleteSdnControllerDb(SdnControllerVO vo) { + dbf.removeByPrimaryKey(vo.getUuid(), SdnControllerVO.class); + } + @Override @SdnControllerLog public void initSdnController(APIAddSdnControllerMsg msg, Completion completion) { @@ -346,7 +364,7 @@ public void preAttachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion) { + public void attachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List clusterUuids, List systemTags, Completion completion) { completion.success(); } @@ -365,7 +383,7 @@ public void deleteSdnController(SdnControllerDeletionMsg msg, SdnControllerInven @Override @SdnControllerLog - public void detachL2NetworkFromCluster(L2VxlanNetworkInventory vxlan, String clusterUuid, Completion completion) { + public void detachL2NetworkFromCluster(L2VxlanNetworkInventory vxlan, List clusterUuid, Completion completion) { completion.success(); } @@ -419,13 +437,13 @@ public void fail(ErrorCode errorCode) { @Override public List getVniRange(SdnControllerInventory controller) { - List> tokenList = H3cVcfcSdnControllerSystemTags.H3C_VNI_RANGE + List> tokenList = SdnControllerSystemTags.VNI_RANGE .getTokensOfTagsByResourceUuid(controller.getUuid()); List vniRanges = new ArrayList<>(); for (Map tokens : tokenList) { SdnVniRange range = new SdnVniRange(); - range.startVni = Integer.valueOf(tokens.get(H3cVcfcSdnControllerSystemTags.H3C_START_VNI_TOKEN)); - range.endVni = Integer.valueOf(tokens.get(H3cVcfcSdnControllerSystemTags.H3C_END_VNI_TOKEN)); + range.startVni = Integer.valueOf(tokens.get(SdnControllerSystemTags.START_VNI_TOKEN)); + range.endVni = Integer.valueOf(tokens.get(SdnControllerSystemTags.END_VNI_TOKEN)); vniRanges.add(range); } return vniRanges; @@ -434,13 +452,13 @@ public List getVniRange(SdnControllerInventory controller) { @Override public List getVlanRange(SdnControllerInventory controller) { // H3c: access vlan == vni - List> tokenList = H3cVcfcSdnControllerSystemTags.H3C_VNI_RANGE + List> tokenList = SdnControllerSystemTags.VNI_RANGE .getTokensOfTagsByResourceUuid(controller.getUuid()); List vlanRanges = new ArrayList<>(); for (Map tokens : tokenList) { SdnVlanRange range = new SdnVlanRange(); - range.startVlan = Integer.valueOf(tokens.get(H3cVcfcSdnControllerSystemTags.H3C_START_VNI_TOKEN)); - range.endVlan = Integer.valueOf(tokens.get(H3cVcfcSdnControllerSystemTags.H3C_END_VNI_TOKEN)); + range.startVlan = Integer.valueOf(tokens.get(SdnControllerSystemTags.START_VNI_TOKEN)); + range.endVlan = Integer.valueOf(tokens.get(SdnControllerSystemTags.END_VNI_TOKEN)); vlanRanges.add(range); } return vlanRanges; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java index 7134399ed10..f65c41b5fad 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java @@ -1,5 +1,8 @@ package org.zstack.sdnController.h3cVcfc; +import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.network.securitygroup.SecurityGroupSdnBackend; import org.zstack.sdnController.SdnController; import org.zstack.sdnController.SdnControllerFactory; @@ -9,11 +12,21 @@ public class H3cVcfcSdnControllerFactory implements SdnControllerFactory { SdnControllerType sdnControllerType = new SdnControllerType(SdnControllerConstant.H3C_VCFC_CONTROLLER); + @Autowired + DatabaseFacade dbf; + @Override public SdnControllerType getVendorType() { return sdnControllerType; } + @Override + public SdnControllerVO persistSdnController(SdnControllerVO vo) { + vo = dbf.persistAndRefresh(vo); + return vo; + } + + @Override public SdnController getSdnController(SdnControllerVO vo) { if (SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2.equals(vo.getVendorVersion())) { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerSystemTags.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerSystemTags.java index e697b264347..cd504aa258b 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerSystemTags.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerSystemTags.java @@ -2,7 +2,7 @@ import org.zstack.header.tag.TagDefinition; import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; -import org.zstack.sdnController.header.SdnControllerVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.tag.PatternedSystemTag; @TagDefinition @@ -13,10 +13,6 @@ public class H3cVcfcSdnControllerSystemTags { public static String H3C_VDS_TOKEN = "vdsUuid"; public static PatternedSystemTag H3C_VDS_UUID = new PatternedSystemTag(String.format("vdsUuid::{%s}", H3C_VDS_TOKEN), SdnControllerVO.class); - public static String H3C_START_VNI_TOKEN = "startVni"; - public static String H3C_END_VNI_TOKEN = "endVni"; - public static PatternedSystemTag H3C_VNI_RANGE = new PatternedSystemTag(String.format("startVni::{%s}::endVni::{%s}", H3C_START_VNI_TOKEN, H3C_END_VNI_TOKEN), SdnControllerVO.class); - public static String H3C_L2_NETWORK_UUID_TOKEN = "h3cL2NetworkUuid"; public static PatternedSystemTag H3C_L2_NETWORK_UUID = new PatternedSystemTag(String.format("h3cL2NetworkUuid::{%s}", H3C_L2_NETWORK_UUID_TOKEN), VxlanNetworkVO.class); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java index 2c7fdb7125e..5239d9a01de 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java @@ -16,8 +16,10 @@ import org.zstack.header.network.l3.IpRangeInventory; import org.zstack.header.network.l3.L3NetworkConstant; import org.zstack.header.network.l3.L3NetworkInventory; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; import org.zstack.sdnController.SdnControllerLog; +import org.zstack.sdnController.SdnControllerSystemTags; import org.zstack.sdnController.header.*; import org.zstack.tag.SystemTagCreator; import org.zstack.utils.Utils; @@ -303,17 +305,17 @@ public void getH3cVniRanges(Completion completion) { return; } // Delete previous inherent VNI range tags before creating new ones - H3cVcfcSdnControllerSystemTags.H3C_VNI_RANGE.delete(self.getUuid()); + SdnControllerSystemTags.VNI_RANGE.delete(self.getUuid()); int count = 0; for (H3cVcfcV2Commands.H3cVniRangeStruct d : rsp.domains) { for (H3cVcfcV2Commands.VniRangeStruct v : d.vlan_map_list) { - SystemTagCreator creator = H3cVcfcSdnControllerSystemTags.H3C_VNI_RANGE.newSystemTagCreator(self.getUuid()); + SystemTagCreator creator = SdnControllerSystemTags.VNI_RANGE.newSystemTagCreator(self.getUuid()); creator.ignoreIfExisting = false; creator.inherent = false; creator.setTagByTokens( map( - e(H3cVcfcSdnControllerSystemTags.H3C_START_VNI_TOKEN, v.start_vxlan), - e(H3cVcfcSdnControllerSystemTags.H3C_END_VNI_TOKEN, v.end_vxlan) + e(SdnControllerSystemTags.START_VNI_TOKEN, v.start_vxlan), + e(SdnControllerSystemTags.END_VNI_TOKEN, v.end_vxlan) ) ); creator.create(); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java index d2b871abd0b..8bf3118dcac 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java @@ -10,8 +10,9 @@ import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.host.*; import org.zstack.header.network.l2.*; +import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.network.l2.vxlan.vxlanNetwork.*; -import org.zstack.sdnController.SdnController; import org.zstack.sdnController.SdnControllerL2; import org.zstack.sdnController.SdnControllerManager; import org.zstack.sdnController.header.*; @@ -67,20 +68,7 @@ private void realizeNetwork(String hostUuid, String htype, L2VxlanNetworkInvento ext.realize(inv, hostUuid, completion); } - @Override - public void attachL2NetworkToClusterOnSdnController(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion) { - List clusterUuids = Q.New(L2NetworkClusterRefVO.class).eq(L2NetworkClusterRefVO_.l2NetworkUuid, vxlan.getPoolUuid()) - .select(L2NetworkClusterRefVO_.clusterUuid).listValues(); - if (clusterUuids == null || clusterUuids.isEmpty()) { - completion.success(); - return; - } - - List hosts = Q.New(HostVO.class).in(HostVO_.clusterUuid, clusterUuids) - .notIn(HostVO_.state, asList(HostState.PreMaintenance, HostState.Maintenance)) - .eq(HostVO_.status, HostStatus.Connected).list(); - List hvinvs = HostInventory.valueOf(hosts); - + public void attachL2NetworkToHosts(L2VxlanNetworkInventory vxlan, List hvinvs, Completion completion) { FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); chain.setName(String.format("attach-hardware-vxlan-%s-on-hosts", vxlan.getUuid())); chain.then(new NoRollbackFlow() { @@ -123,18 +111,128 @@ public void handle(ErrorCode errCode, Map data) { }).start(); } + @Override + public void attachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, APICreateL2NetworkMsg msg, Completion completion) { + List clusterUuids = Q.New(L2NetworkClusterRefVO.class).eq(L2NetworkClusterRefVO_.l2NetworkUuid, vxlan.getPoolUuid()) + .select(L2NetworkClusterRefVO_.clusterUuid).listValues(); + if (clusterUuids == null || clusterUuids.isEmpty()) { + logger.debug(String.format("no cluster attached to hardware vxlan network[uuid:%s, name:%s]", + vxlan.getUuid(), vxlan.getName())); + completion.success(); + return; + } + + List hosts = Q.New(HostVO.class).in(HostVO_.clusterUuid, clusterUuids) + .notIn(HostVO_.state, asList(HostState.PreMaintenance, HostState.Maintenance)) + .eq(HostVO_.status, HostStatus.Connected).list(); + List hvinvs = HostInventory.valueOf(hosts); + + attachL2NetworkToHosts(vxlan, hvinvs, completion); + } + @Override public void deleteHook(Completion completion) { - deleteVxlanNetworkOnSdnController((VxlanNetworkVO) self, new Completion(completion) { + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("delete-hardware-vxlan")); + chain.then(new NoRollbackFlow() { + final String __name__ = "delete-hardware-vxlan-from-sdn"; + + @Override + public void run(FlowTrigger trigger, Map data) { + deleteVxlanNetworkOnSdnController((VxlanNetworkVO) self, new Completion(completion) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.next(); + } + }); + } + }).then(new NoRollbackFlow() { + @Override + public void run(FlowTrigger trigger, Map data) { + HardwareVxlanNetwork.super.deleteL2Bridge(null, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.next(); + } + }); + } + }).done(new FlowDoneHandler(completion) { @Override - public void success() { + public void handle(Map data) { completion.success(); } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); + } + + // called by handle(DetachL2NetworkFromClusterMsg msg) + @Override + protected void deleteL2Bridge(List clusterUuids, Completion completion) { + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("detach-hardware-vxlan")); + chain.then(new NoRollbackFlow() { + final String __name__ = "detach-hardware-vxlan-from-sdn"; @Override - public void fail(ErrorCode errorCode) { + public void run(FlowTrigger trigger, Map data) { + L2VxlanNetworkInventory vxlan = getSelfInventory(); + HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(vxlan.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); + SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); + + SdnControllerL2 controller = sdnControllerManager.getSdnControllerL2(sdn); + controller.detachL2NetworkFromCluster(vxlan, clusterUuids, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.next(); + } + }); + } + }).then(new NoRollbackFlow() { + final String __name__ = "detach-hardware-vxlan-from-host"; + + @Override + public void run(FlowTrigger trigger, Map data) { + HardwareVxlanNetwork.super.deleteL2Bridge(clusterUuids, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.next(); + } + }); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { completion.success(); } - }); + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkExtensionPoint.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkExtensionPoint.java index cee9ef1b6ce..15da376c78e 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkExtensionPoint.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkExtensionPoint.java @@ -9,6 +9,6 @@ public interface HardwareVxlanNetworkExtensionPoint { void createVxlanNetworkOnSdnController(L2VxlanNetworkInventory vxlan, APICreateL2NetworkMsg msg, Completion completion); - void attachL2NetworkToClusterOnSdnController(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); + void attachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, APICreateL2NetworkMsg msg, Completion completion); void deleteVxlanNetworkOnSdnController(VxlanNetworkVO vo, Completion completion); } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java index cdd1b4ba093..e6689831815 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java @@ -23,6 +23,9 @@ import org.zstack.header.network.l2.*; import org.zstack.header.network.l3.L3NetworkVO; import org.zstack.header.network.l3.L3NetworkVO_; +import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory; +import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.vm.VmInstanceInventory; import org.zstack.header.vm.VmInstanceMigrateExtensionPoint; import org.zstack.header.vm.VmNicInventory; @@ -30,17 +33,17 @@ import org.zstack.network.l2.L2NetworkCascadeFilterExtensionPoint; import org.zstack.network.l2.L2NetworkDefaultMtu; import org.zstack.network.l2.L2NetworkManager; -import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; +import org.zstack.network.l2.L2NetworkSystemTags; import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; import org.zstack.network.l2.vxlan.vxlanNetworkPool.AllocateVniMsg; import org.zstack.network.l2.vxlan.vxlanNetworkPool.AllocateVniReply; -import org.zstack.network.l2.vxlan.vxlanNetworkPool.VxlanNetworkPoolVO; import org.zstack.network.service.NetworkServiceGlobalConfig; import org.zstack.resourceconfig.ResourceConfigFacade; -import org.zstack.sdnController.SdnController; import org.zstack.sdnController.SdnControllerL2; import org.zstack.sdnController.SdnControllerManager; import org.zstack.sdnController.header.*; +import org.zstack.tag.SystemTagCreator; +import org.zstack.tag.TagManager; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; @@ -50,8 +53,9 @@ import java.util.Map; import java.util.stream.Collectors; -import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.CollectionDSL.e; +import static org.zstack.utils.CollectionDSL.map; /** * Created by shixin.ruan on 09/17/2019. @@ -70,6 +74,8 @@ public class HardwareVxlanNetworkFactory implements L2NetworkFactory, VmInstance private L2NetworkManager l2Mgr; @Autowired private ResourceConfigFacade rcf; + @Autowired + private TagManager tagMgr; @Override public L2NetworkType getType() { @@ -79,12 +85,22 @@ public L2NetworkType getType() { @Override public void createL2Network(L2NetworkVO ovo, APICreateL2NetworkMsg msg, ReturnValueCompletion completion) { APICreateL2HardwareVxlanNetworkMsg amsg = (APICreateL2HardwareVxlanNetworkMsg) msg; - VxlanNetworkVO vo = new VxlanNetworkVO(ovo); + HardwareL2VxlanNetworkVO vo = new HardwareL2VxlanNetworkVO(ovo); + HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(amsg.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); + SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); + if (sdn == null) { + completion.fail(operr("can not find sdn controller %s", poolVO.getSdnControllerUuid())); + return; + } + SdnControllerL2 controller = sdnControllerManager.getSdnControllerL2(sdn); + vo.setAccountUuid(msg.getSession().getAccountUuid()); - vo.setPoolUuid((amsg.getPoolUuid())); - VxlanNetworkPoolVO poolVO = dbf.findByUuid(vo.getPoolUuid(), VxlanNetworkPoolVO.class); + vo.setPoolUuid(amsg.getPoolUuid()); vo.setPhysicalInterface(poolVO.getPhysicalInterface()); vo.setVni(0); + if (amsg.getVlan() != null) { + vo.setVlan(amsg.getVlan()); + } HardwareVxlanNetwork hardwareVxlan = new HardwareVxlanNetwork(vo); @@ -100,16 +116,7 @@ public void setup() { @Override public void run(FlowTrigger trigger, Map data) { - L2VxlanNetworkInventory vxlan = L2VxlanNetworkInventory.valueOf(vo); - HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(vxlan.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); - if (poolVO == null || poolVO.getSdnControllerUuid() == null) { - completion.fail(argerr("there is no sdn controller for vxlan pool [uuid:%s]", vxlan.getPoolUuid())); - return; - } - SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); - SdnControllerL2 controller = sdnControllerManager.getSdnControllerL2(sdn); - - controller.preCreateVxlanNetwork(vxlan, msg.getSystemTags(), new Completion(trigger) { + controller.preCreateVxlanNetwork(HardwareL2VxlanNetworkInventory.valueOf(vo), msg.getSystemTags(), new Completion(trigger) { @Override public void success() { trigger.next(); @@ -141,9 +148,21 @@ public void run(MessageReply reply) { AllocateVniReply r = reply.castReply(); vo.setVni(r.getVni()); - vo.setVirtualNetworkId(vo.getVni()); + vo.setVirtualNetworkId(r.getVni()); dbf.persist(vo); + tagMgr.createTagsFromAPICreateMessage(msg, vo.getUuid(), L2NetworkVO.class.getSimpleName()); + + SystemTagCreator creator = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.newSystemTagCreator(vo.getUuid()); + creator.ignoreIfExisting = true; + creator.inherent = false; + creator.setTagByTokens( + map( + e(L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN, poolVO.getSdnControllerUuid()) + ) + ); + creator.create(); + data.put(SdnControllerConstant.Params.VXLAN_NETWORK.toString(), vo); trigger.next(); } @@ -152,7 +171,6 @@ public void run(MessageReply reply) { @Override public void rollback(FlowRollback trigger, Map data) { - /* no need to release vni because vni is saved in VxlanNetworkVO */ trigger.rollback(); } }); @@ -161,8 +179,8 @@ public void rollback(FlowRollback trigger, Map data) { @Override public void run(FlowTrigger trigger, Map data) { - VxlanNetworkVO ovo = (VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); - L2VxlanNetworkInventory vxlan = L2VxlanNetworkInventory.valueOf(ovo); + HardwareL2VxlanNetworkVO ovo = (HardwareL2VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); + HardwareL2VxlanNetworkInventory vxlan = HardwareL2VxlanNetworkInventory.valueOf(ovo); hardwareVxlan.createVxlanNetworkOnSdnController(vxlan, msg, new Completion(trigger) { @Override public void success() { @@ -178,7 +196,7 @@ public void fail(ErrorCode errorCode) { @Override public void rollback(FlowRollback trigger, Map data) { - VxlanNetworkVO ovo = (VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); + HardwareL2VxlanNetworkVO ovo = (HardwareL2VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); hardwareVxlan.deleteVxlanNetworkOnSdnController(ovo, new Completion(trigger) { @Override public void success() { @@ -197,12 +215,8 @@ public void fail(ErrorCode errorCode) { @Override public void run(FlowTrigger trigger, Map data) { - VxlanNetworkVO ovo = (VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); - L2VxlanNetworkInventory vxlan = L2VxlanNetworkInventory.valueOf(ovo); - HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(vxlan.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); - SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); - - SdnControllerL2 controller = sdnControllerManager.getSdnControllerL2(sdn); + HardwareL2VxlanNetworkVO ovo = (HardwareL2VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); + HardwareL2VxlanNetworkInventory vxlan = HardwareL2VxlanNetworkInventory.valueOf(ovo); controller.postCreateVxlanNetwork(vxlan, msg.getSystemTags(), new Completion(trigger) { @Override public void success() { @@ -221,12 +235,8 @@ public void fail(ErrorCode errorCode) { @Override public void run(FlowTrigger trigger, Map data) { - VxlanNetworkVO ovo = (VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); - L2VxlanNetworkInventory vxlan = L2VxlanNetworkInventory.valueOf(ovo); - HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(vxlan.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); - SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); - - SdnControllerL2 controller = sdnControllerManager.getSdnControllerL2(sdn); + HardwareL2VxlanNetworkVO ovo = (HardwareL2VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); + HardwareL2VxlanNetworkInventory vxlan = HardwareL2VxlanNetworkInventory.valueOf(ovo); controller.preAttachL2NetworkToCluster(vxlan, msg.getSystemTags(), new Completion(trigger) { @Override public void success() { @@ -245,9 +255,9 @@ public void fail(ErrorCode errorCode) { @Override public void run(FlowTrigger trigger, Map data) { - VxlanNetworkVO vov = (VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); - L2VxlanNetworkInventory vxlan = L2VxlanNetworkInventory.valueOf(vov); - hardwareVxlan.attachL2NetworkToClusterOnSdnController(vxlan, msg.getSystemTags(), new Completion(trigger) { + HardwareL2VxlanNetworkVO vov = (HardwareL2VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); + HardwareL2VxlanNetworkInventory vxlan = HardwareL2VxlanNetworkInventory.valueOf(vov); + hardwareVxlan.attachL2NetworkToCluster(vxlan, msg, new Completion(trigger) { @Override public void success() { trigger.next(); @@ -271,13 +281,15 @@ public void rollback(FlowRollback trigger, Map data) { @Override public void run(FlowTrigger trigger, Map data) { - VxlanNetworkVO ovo = (VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); - L2VxlanNetworkInventory vxlan = L2VxlanNetworkInventory.valueOf(ovo); - HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(vxlan.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); - SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); + List clusterUuids = HardwareL2VxlanNetworkPoolInventory.valueOf(poolVO).getAttachedClusterUuids(); + if (clusterUuids.isEmpty()) { + trigger.next(); + return; + } - SdnControllerL2 controller = sdnControllerManager.getSdnControllerL2(sdn); - controller.attachL2NetworkToCluster(vxlan, msg.getSystemTags(), new Completion(trigger) { + HardwareL2VxlanNetworkVO ovo = (HardwareL2VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); + HardwareL2VxlanNetworkInventory vxlan = HardwareL2VxlanNetworkInventory.valueOf(ovo); + controller.attachL2NetworkToCluster(vxlan, clusterUuids, msg.getSystemTags(), new Completion(trigger) { @Override public void success() { trigger.next(); @@ -292,7 +304,20 @@ public void fail(ErrorCode errorCode) { @Override public void rollback(FlowRollback trigger, Map data) { - trigger.rollback(); + HardwareL2VxlanNetworkVO ovo = (HardwareL2VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); + HardwareL2VxlanNetworkInventory vxlan = HardwareL2VxlanNetworkInventory.valueOf(ovo); + + controller.detachL2NetworkFromCluster(vxlan, null, new Completion(trigger) { + @Override + public void success() { + trigger.rollback(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.rollback(); + } + }); } }); flow(new NoRollbackFlow() { @@ -300,12 +325,9 @@ public void rollback(FlowRollback trigger, Map data) { @Override public void run(FlowTrigger trigger, Map data) { - VxlanNetworkVO ovo = (VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); - L2VxlanNetworkInventory vxlan = L2VxlanNetworkInventory.valueOf(ovo); - HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(vxlan.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); - SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); - - SdnControllerL2 controller = sdnControllerManager.getSdnControllerL2(sdn); + HardwareL2VxlanNetworkVO ovo = (HardwareL2VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); + HardwareL2VxlanNetworkInventory vxlan = HardwareL2VxlanNetworkInventory.valueOf(ovo); + controller.postAttachL2NetworkToCluster(vxlan, msg.getSystemTags(), new Completion(trigger) { @Override public void success() { @@ -338,13 +360,14 @@ public void handle(Map data) { dbf.persistCollection(refs); } - completion.success(L2VxlanNetworkInventory.valueOf(dbf.findByUuid(vo.getUuid(), VxlanNetworkVO.class))); + completion.success(HardwareL2VxlanNetworkInventory.valueOf(dbf.findByUuid(vo.getUuid(), + HardwareL2VxlanNetworkVO.class))); } }); error(new FlowErrorHandler(completion) { @Override public void handle(ErrorCode errCode, Map data) { - dbf.removeByPrimaryKey(vo.getUuid(), VxlanNetworkVO.class); + dbf.removeByPrimaryKey(vo.getUuid(), HardwareL2VxlanNetworkVO.class); completion.fail(errCode); } }); @@ -428,11 +451,11 @@ public Integer getDefaultMtu(L2NetworkInventory inv) { @Override public Integer getL2NetworkVni(String l2NetworkUuid, String hostUuid) { - VxlanNetworkVO vxlan = dbf.findByUuid(l2NetworkUuid, VxlanNetworkVO.class); + HardwareL2VxlanNetworkVO vxlan = dbf.findByUuid(l2NetworkUuid, HardwareL2VxlanNetworkVO.class); HostInventory host = HostInventory.valueOf(dbf.findByUuid(hostUuid, HostVO.class)); HardwareVxlanHelper.VxlanHostMappingStruct struct = HardwareVxlanHelper.getHardwareVxlanMappingVxlanId( - L2VxlanNetworkInventory.valueOf(vxlan), host); + HardwareL2VxlanNetworkInventory.valueOf(vxlan), host); return struct.getVlanId(); } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPool.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPool.java index 213e426abb2..f16da37a90e 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPool.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPool.java @@ -6,28 +6,34 @@ import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.db.Q; +import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.header.core.Completion; import org.zstack.header.core.WhileDoneCompletion; +import org.zstack.header.core.workflow.*; +import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.exception.CloudRuntimeException; +import org.zstack.header.host.HostConstant; +import org.zstack.header.host.HostInventory; import org.zstack.header.message.MessageReply; import org.zstack.header.network.l2.*; -import org.zstack.network.l2.vxlan.vtep.APICreateVxlanVtepMsg; -import org.zstack.network.l2.vxlan.vtep.CreateVtepMsg; -import org.zstack.network.l2.vxlan.vtep.DeleteVtepMsg; -import org.zstack.network.l2.vxlan.vtep.PopulateVtepPeersMsg; +import org.zstack.network.l2.vxlan.vtep.*; +import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO_; import org.zstack.network.l2.vxlan.vxlanNetworkPool.*; +import org.zstack.sdnController.SdnControllerFactory; +import org.zstack.sdnController.SdnControllerL2; import org.zstack.sdnController.SdnControllerManager; import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory; import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; -import java.util.List; +import java.util.*; -import static org.zstack.core.Platform.argerr; +import static org.zstack.core.Platform.operr; /** * Created by shixin.ruan on 09/17/2019. @@ -47,6 +53,7 @@ private HardwareL2VxlanNetworkPoolVO getSelf1() { return (HardwareL2VxlanNetworkPoolVO) self; } + @Override protected HardwareL2VxlanNetworkPoolInventory getSelfInventory() { return HardwareL2VxlanNetworkPoolInventory.valueOf(getSelf1()); } @@ -77,8 +84,149 @@ protected void afterDetachVxlanPoolFromCluster(APIDetachL2NetworkFromClusterMsg } @Override - protected void afterAttachVxlanPoolFromClusterFailed(APIAttachL2NetworkToClusterMsg msg) { - super.afterAttachVxlanPoolFromClusterFailed(msg); + public void prepareL2NetworkOnHosts(final String l2NetworkUuid, final List hosts, boolean applyToSdn, final Completion completion) { + List vxlanVos = Q.New(VxlanNetworkVO.class) + .eq(VxlanNetworkVO_.poolUuid, self.getUuid()).list(); + SdnControllerVO vo = dbf.findByUuid(getSelf1().getSdnControllerUuid(), SdnControllerVO.class); + SdnControllerFactory factory = sdnControllerManager.getSdnControllerFactory(vo.getVendorType()); + if (factory == null) { + completion.fail(operr("there is no sdn controller factory for sdn controller type:%s", vo.getVendorType())); + return; + } + + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("prepare-l2-%s-on-hosts", self.getUuid())); + chain.then(new NoRollbackFlow() { + String __name__ = "check-physical-interface"; + + @Override + public void run(final FlowTrigger trigger, Map data) { + List cmsgs = new ArrayList(); + for (HostInventory h : hosts) { + CheckNetworkPhysicalInterfaceMsg cmsg = new CheckNetworkPhysicalInterfaceMsg(); + cmsg.setHostUuid(h.getUuid()); + cmsg.setPhysicalInterface(self.getPhysicalInterface()); + bus.makeTargetServiceIdByResourceUuid(cmsg, HostConstant.SERVICE_ID, h.getUuid()); + cmsgs.add(cmsg); + } + + if (cmsgs.isEmpty()) { + trigger.next(); + return; + } + + new While<>(cmsgs).step((msg, wcomp) -> { + bus.send(msg, new CloudBusCallBack(wcomp) { + @Override + public void run(MessageReply reply) { + if (reply.isSuccess()) { + wcomp.done(); + } else { + wcomp.addError(reply.getError()); + wcomp.allDone(); + } + } + }); + }, L2NetworkConstant.MAX_PARALLEL_HOST_MSG).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().isEmpty()) { + trigger.next(); + } else { + trigger.fail(errorCodeList.getCauses().get(0)); + } + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = "realize-vxlan-network"; + + @Override + public void run(final FlowTrigger trigger, Map data) { + if (vxlanVos.isEmpty()) { + trigger.next(); + return; + } + + new While<>(vxlanVos).each((vxlan, whileCompletion) -> { + HardwareVxlanNetwork nw = new HardwareVxlanNetwork(vxlan); + nw.attachL2NetworkToHosts(L2VxlanNetworkInventory.valueOf(vxlan), + hosts, new Completion(whileCompletion) { + @Override + public void success() { + whileCompletion.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + whileCompletion.addError(errorCode); + whileCompletion.allDone(); + } + }); + }).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + trigger.fail(errorCodeList.getCauses().get(0)); + } else { + trigger.next(); + } + } + + }); + } + + }).then(new NoRollbackFlow() { + String __name__ = "attach-vxlan-network-on-sdn"; + @Override + public void run(FlowTrigger trigger, Map data) { + if (vxlanVos.isEmpty()) { + trigger.next(); + return; + } + + if (!applyToSdn) { + trigger.next(); + return; + } + + SdnControllerL2 controller = factory.getSdnControllerL2(vo); + new While<>(vxlanVos).each((vxlan, whileCompletion) -> { + controller.attachL2NetworkToHosts(L2VxlanNetworkInventory.valueOf(vxlan), hosts, new ArrayList<>(), new Completion(whileCompletion) { + @Override + public void success() { + whileCompletion.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + whileCompletion.addError(errorCode); + whileCompletion.allDone(); + } + }); + }).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + trigger.fail(errorCodeList.getCauses().get(0)); + } else { + trigger.next(); + } + } + + }); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); } @Override diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPoolFactory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPoolFactory.java index 769125d6312..27983cbb37d 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPoolFactory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPoolFactory.java @@ -12,9 +12,13 @@ import org.zstack.header.message.APIMessage; import org.zstack.header.network.l2.*; import org.zstack.header.network.l3.APICreateL3NetworkMsg; +import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory; +import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.network.l2.vxlan.vxlanNetwork.APICreateL2VxlanNetworkMsg; import org.zstack.network.l2.vxlan.vxlanNetworkPool.VxlanNetworkChecker; import org.zstack.network.l2.vxlan.vxlanNetworkPool.VxlanNetworkPoolVO; +import org.zstack.network.l3.L3NetworkHelper; import org.zstack.sdnController.header.*; import org.zstack.utils.Utils; import org.zstack.utils.gson.JSONObjectUtil; @@ -45,9 +49,10 @@ public L2NetworkType getType() { @Override @Transactional public void createL2Network(L2NetworkVO ovo, APICreateL2NetworkMsg msg, ReturnValueCompletion completion) { + APICreateL2HardwareVxlanNetworkPoolMsg vxlanMsg = (APICreateL2HardwareVxlanNetworkPoolMsg) msg; HardwareL2VxlanNetworkPoolVO vo = new HardwareL2VxlanNetworkPoolVO(ovo); vo.setAccountUuid(msg.getSession().getAccountUuid()); - vo.setSdnControllerUuid(((APICreateL2HardwareVxlanNetworkPoolMsg) msg).getSdnControllerUuid()); + vo.setSdnControllerUuid(vxlanMsg.getSdnControllerUuid()); vo = dbf.persistAndRefresh(vo); HardwareL2VxlanNetworkPoolInventory inv = HardwareL2VxlanNetworkPoolInventory.valueOf(vo); @@ -103,7 +108,19 @@ private void validate(APIAttachL2NetworkToClusterMsg msg) { vxlanInterceptor.validateSystemTagFormat(msg.getSystemTags()); } - vxlanInterceptor.validateVniRangeOverlap(L2NetworkInventory.valueOf(l2NetworkVO), msg.getClusterUuid()); + String sdnUuid = L3NetworkHelper.getSdnControllerUuidFromL2Uuid(msg.getL2NetworkUuid()); + if (sdnUuid == null) { + return; + } + + SdnControllerVO sdnControllerVO = dbf.findByUuid(sdnUuid, SdnControllerVO.class); + if (sdnControllerVO == null) { + logger.warn(String.format("skip VNI overlap validation: SDN controller[%s] not found", sdnUuid)); + return; + } + if (SdnControllerConstant.H3C_VCFC_CONTROLLER.equals(sdnControllerVO.getVendorType())) { + vxlanInterceptor.validateVniRangeOverlap(L2NetworkInventory.valueOf(l2NetworkVO), msg.getClusterUuid()); + } } private void validate(APICreateL3NetworkMsg msg) { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanNetworkBackend.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanNetworkBackend.java index 3ae1025f684..d1870905066 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanNetworkBackend.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanNetworkBackend.java @@ -21,8 +21,6 @@ import org.zstack.kvm.KVMAgentCommands.CreateVlanBridgeResponse; import org.zstack.kvm.KVMAgentCommands.NicTO; import org.zstack.network.l2.L2NetworkManager; -import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; -import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; import org.zstack.network.service.MtuGetter; import org.zstack.sdnController.header.*; import org.zstack.tag.SystemTagCreator; @@ -49,7 +47,8 @@ private String makeBridgeName(String l2Uuid, int vlan) { @Override public void realize(final L2NetworkInventory l2Network, final String hostUuid, boolean noStatusCheck, final Completion completion) { - final L2VxlanNetworkInventory vxlan = (L2VxlanNetworkInventory) l2Network; + HardwareL2VxlanNetworkVO vo = dbf.findByUuid(l2Network.getUuid(), HardwareL2VxlanNetworkVO.class); + final HardwareL2VxlanNetworkInventory vxlan = HardwareL2VxlanNetworkInventory.valueOf(vo); HostInventory host = HostInventory.valueOf(dbf.findByUuid(hostUuid, HostVO.class)); HardwareVxlanHelper.VxlanHostMappingStruct struct = HardwareVxlanHelper.getHardwareVxlanMappingVxlanId(vxlan, host); @@ -112,7 +111,8 @@ public void realize(final L2NetworkInventory l2Network, final String hostUuid, f } public void check(final L2NetworkInventory l2Network, final String hostUuid, boolean noStatusCheck, final Completion completion) { - final L2VxlanNetworkInventory vxlan = (L2VxlanNetworkInventory) l2Network; + HardwareL2VxlanNetworkVO vo = dbf.findByUuid(l2Network.getUuid(), HardwareL2VxlanNetworkVO.class); + final HardwareL2VxlanNetworkInventory vxlan = HardwareL2VxlanNetworkInventory.valueOf(vo); HostInventory host = HostInventory.valueOf(dbf.findByUuid(hostUuid, HostVO.class)); HardwareVxlanHelper.VxlanHostMappingStruct struct = HardwareVxlanHelper.getHardwareVxlanMappingVxlanId(vxlan, host); @@ -182,7 +182,8 @@ public VSwitchType getSupportedVSwitchType() { @Override public NicTO completeNicInformation(L2NetworkInventory l2Network, L3NetworkInventory l3Network, VmNicInventory nic) { - L2VxlanNetworkInventory vxlan = L2VxlanNetworkInventory.valueOf(dbf.findByUuid(l2Network.getUuid(), VxlanNetworkVO.class)); + HardwareL2VxlanNetworkVO vo = dbf.findByUuid(l2Network.getUuid(), HardwareL2VxlanNetworkVO.class); + final HardwareL2VxlanNetworkInventory vxlan = HardwareL2VxlanNetworkInventory.valueOf(vo); VmInstanceVO vm = dbf.findByUuid(nic.getVmInstanceUuid(), VmInstanceVO.class); /* TODO vm must have hostUuid */ @@ -199,7 +200,7 @@ public NicTO completeNicInformation(L2NetworkInventory l2Network, L3NetworkInven @Override public String getBridgeName(L2NetworkInventory l2Network) { - VxlanNetworkVO vo = dbf.findByUuid(l2Network.getUuid(), VxlanNetworkVO.class); + HardwareL2VxlanNetworkVO vo = dbf.findByUuid(l2Network.getUuid(), HardwareL2VxlanNetworkVO.class); /* * to be done */ @@ -207,6 +208,43 @@ public String getBridgeName(L2NetworkInventory l2Network) { } public void delete(L2NetworkInventory l2Network, String hostUuid, Completion completion) { - completion.success(); + HardwareL2VxlanNetworkVO vo = dbf.findByUuid(l2Network.getUuid(), HardwareL2VxlanNetworkVO.class); + HardwareL2VxlanNetworkInventory l2Vxlan = HardwareL2VxlanNetworkInventory.valueOf(vo); + KVMAgentCommands.DeleteVlanBridgeCmd cmd = new KVMAgentCommands.DeleteVlanBridgeCmd(); + cmd.setPhysicalInterfaceName(l2Network.getPhysicalInterface()); + cmd.setBridgeName(makeBridgeName(l2Vxlan.getUuid(), l2Vxlan.getVlan())); + cmd.setVlan(l2Vxlan.getVlan()); + cmd.setL2NetworkUuid(l2Network.getUuid()); + + KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); + msg.setHostUuid(hostUuid); + msg.setCommand(cmd); + msg.setPath(KVMConstant.KVM_DELETE_L2VLAN_NETWORK_PATH); + bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, hostUuid); + bus.send(msg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + completion.fail(reply.getError()); + return; + } + + KVMHostAsyncHttpCallReply hreply = reply.castReply(); + KVMAgentCommands.DeleteVlanBridgeResponse rsp = hreply.toResponse(KVMAgentCommands.DeleteVlanBridgeResponse.class); + if (!rsp.isSuccess()) { + ErrorCode err = operr("failed to delete bridge[%s] for l2Network[uuid:%s, type:%s, vlan:%s] on kvm host[uuid:%s], because %s", + cmd.getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2Vxlan.getVlan(), hostUuid, rsp.getError()); + completion.fail(err); + return; + } + + String message = String.format( + "successfully delete bridge[%s] for l2Network[uuid:%s, type:%s, vlan:%s] on kvm host[uuid:%s]", cmd + .getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2Vxlan.getVlan(), hostUuid); + logger.debug(message); + + completion.success(); + } + }); } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerEvent.java index afc08a1997c..97a21595c59 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerEvent.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerEvent.java @@ -1,6 +1,7 @@ package org.zstack.sdnController.header; import org.zstack.header.message.APIEvent; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.rest.RestResponse; @RestResponse(allTo = "inventory") diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerEventDoc_zh_cn.groovy index 19500a17b76..3973ff9b695 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerEventDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerEventDoc_zh_cn.groovy @@ -1,6 +1,7 @@ package org.zstack.sdnController.header import org.zstack.header.errorcode.ErrorCode +import org.zstack.header.network.sdncontroller.SdnControllerInventory doc { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsg.java index 56b23f85f47..ba582b27e99 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsg.java @@ -4,10 +4,10 @@ import org.zstack.header.identity.Action; import org.zstack.header.log.NoLogging; import org.zstack.header.message.*; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.other.APIAuditor; import org.zstack.header.rest.RestRequest; import org.zstack.header.tag.TagResourceType; -import org.zstack.header.zone.ZoneVO; @TagResourceType(SdnControllerVO.class) @Action(category = SdnControllerConstant.ACTION_CATEGORY) diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerEvent.java new file mode 100644 index 00000000000..a0852ec4ce9 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerEvent.java @@ -0,0 +1,51 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; +import org.zstack.header.rest.RestResponse; + +/** + * API event for changing SDN controller configuration + */ +@RestResponse(allTo = "inventory") +public class APIChangeSdnControllerEvent extends APIEvent { + + /** + * @desc see :ref:`SdnControllerInventory` + */ + private SdnControllerInventory inventory; + + public APIChangeSdnControllerEvent() { + super(null); + } + + public APIChangeSdnControllerEvent(String apiId) { + super(apiId); + } + + public SdnControllerInventory getInventory() { + return inventory; + } + + public void setInventory(SdnControllerInventory inventory) { + this.inventory = inventory; + } + + public static APIChangeSdnControllerEvent __example__() { + APIChangeSdnControllerEvent event = new APIChangeSdnControllerEvent(); + SdnControllerInventory inventory = new SdnControllerInventory(); + + inventory.setUuid(uuid()); + inventory.setVendorType("H3C-VCFC"); + inventory.setName("updated-sdn-controller"); + inventory.setDescription("Updated SDN controller configuration"); + inventory.setIp("192.168.1.100"); + inventory.setUsername("admin"); + inventory.setPassword("newpassword"); + inventory.setCreateDate(new java.sql.Timestamp(org.zstack.header.message.DocUtils.date)); + inventory.setLastOpDate(new java.sql.Timestamp(org.zstack.header.message.DocUtils.date)); + + event.setInventory(inventory); + return event; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..e13d620d737 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.sdnController.header + +import org.zstack.header.network.sdncontroller.SdnControllerInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "Upate SDN Controller" + + ref { + name "inventory" + path "org.zstack.sdnController.header.APIChangeSdnControllerEvent.inventory" + desc "Updated SDN controller inventory after change operation" + type "SdnControllerInventory" + since "5.3.28" + clz SdnControllerInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.28" + } + ref { + name "error" + path "org.zstack.sdnController.header.APIChangeSdnControllerEvent.error" + desc "Error code, null if operation succeeds, non-null if operation fails",false + type "ErrorCode" + since "5.3.28" + clz ErrorCode.class + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerMsg.java new file mode 100644 index 00000000000..00d72f17bd4 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerMsg.java @@ -0,0 +1,85 @@ +package org.zstack.sdnController.header; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.log.NoLogging; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.message.DefaultTimeout; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.rest.RestRequest; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * API message for changing SDN controller configuration + */ +@Action(category = SdnControllerConstant.ACTION_CATEGORY) +@RestRequest( + path = "/sdn-controllers/{uuid}/actions", + method = HttpMethod.PUT, + responseClass = APIChangeSdnControllerEvent.class, + isAction = true +) +@DefaultTimeout(timeunit = TimeUnit.MINUTES, value = 30) +public class APIChangeSdnControllerMsg extends APIMessage implements SdnControllerMessage { + + @APIParam(resourceType = SdnControllerVO.class, checkAccount = true, operationTarget = true) + private String uuid; + + @APIParam(required = false, maxLength = 255) + private String userName; + + @APIParam(required = false, maxLength = 255) + @NoLogging + private String password; + + @APIParam(required = false, maxLength = 255) + private List vlanRanges; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + @Override + public String getSdnControllerUuid() { + return uuid; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public List getVlanRanges() { + return vlanRanges; + } + + public void setVlanRanges(List vlanRanges) { + this.vlanRanges = vlanRanges; + } + + public static APIChangeSdnControllerMsg __example__() { + APIChangeSdnControllerMsg msg = new APIChangeSdnControllerMsg(); + msg.setUuid(uuid()); + msg.setUserName("sdnuser"); + msg.setPassword("newpassword"); + return msg; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..dcfc216e75f --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerMsgDoc_zh_cn.groovy @@ -0,0 +1,85 @@ +package org.zstack.sdnController.header + +import org.zstack.sdnController.header.APIChangeSdnControllerEvent + +doc { + title "ChangeSdnController" + + category "SdnController" + + desc """Changes SDN controller""" + + rest { + request { + url "PUT /v1/sdn-controllers/{uuid}/actions" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIChangeSdnControllerMsg.class + + desc """""" + + params { + + column { + name "uuid" + enclosedIn "changeSdnController" + desc "UUID of the SDN controller resource" + location "url" + type "String" + optional false + since "5.3.28" + } + column { + name "userName" + enclosedIn "changeSdnController" + desc "New user name for the SDN controller" + location "body" + type "String" + optional true + since "5.3.28" + } + column { + name "password" + enclosedIn "changeSdnController" + desc "New password for the SDN controller" + location "body" + type "String" + optional true + since "5.3.28" + } + column { + name "systemTags" + enclosedIn "" + desc "System tags" + location "body" + type "List" + optional true + since "5.3.28" + } + column { + name "userTags" + enclosedIn "" + desc "User tags" + location "body" + type "List" + optional true + since "5.3.28" + } + column { + name "vlanRanges" + enclosedIn "changeSdnController" + desc "" + location "body" + type "List" + optional true + since "5.3.28" + } + } + } + + response { + clz APIChangeSdnControllerEvent.class + } + } +} \ No newline at end of file diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsg.java index 145d7807d68..55b4628004d 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsg.java @@ -6,6 +6,8 @@ import org.zstack.header.message.OverriddenApiParam; import org.zstack.header.message.OverriddenApiParams; import org.zstack.header.network.l2.APICreateL2NetworkMsg; +import org.zstack.header.network.l2.L2NetworkVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; import org.zstack.header.tag.TagResourceType; import org.zstack.header.zone.ZoneVO; @@ -33,6 +35,9 @@ public class APICreateL2HardwareVxlanNetworkMsg extends APICreateL2NetworkMsg { @APIParam(required = false, resourceType = H3cSdnControllerTenantVO.class) private String h3cTenantUuid; + @APIParam(required = false, numberRange = {1, 4095}) + private Integer vlan; + public Integer getVni() { return vni; } @@ -62,6 +67,14 @@ public void setH3cTenantUuid(String h3cTenantUuid) { this.h3cTenantUuid = h3cTenantUuid; } + public Integer getVlan() { + return vlan; + } + + public void setVlan(Integer vlan) { + this.vlan = vlan; + } + public static APICreateL2HardwareVxlanNetworkMsg __example__() { APICreateL2HardwareVxlanNetworkMsg msg = new APICreateL2HardwareVxlanNetworkMsg(); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsgDoc_zh_cn.groovy index 2aae352d32b..863f275cbe4 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsgDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsgDoc_zh_cn.groovy @@ -157,6 +157,15 @@ doc { optional true since "5.3.28" } + column { + name "vlan" + enclosedIn "params" + desc "" + location "body" + type "Integer" + optional true + since "5.4.0" + } } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolMsg.java index efccb43fa72..d0a09badd06 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolMsg.java @@ -3,6 +3,7 @@ import org.springframework.http.HttpMethod; import org.zstack.header.message.APIParam; import org.zstack.header.network.l2.APICreateL2NetworkMsg; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; @RestRequest( diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolMsgDoc_zh_cn.groovy index 7384b3985b4..ec4edea5cc7 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolMsgDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolMsgDoc_zh_cn.groovy @@ -139,6 +139,24 @@ doc { optional true since "4.8.0" } + column { + name "startVlan" + enclosedIn "params" + desc "" + location "body" + type "Integer" + optional true + since "5.3.28" + } + column { + name "endVlan" + enclosedIn "params" + desc "" + location "body" + type "Integer" + optional true + since "5.3.28" + } } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsg.java index 2265e017ab1..fa25bb4fd76 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsg.java @@ -4,6 +4,7 @@ import org.zstack.header.identity.Action; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; /** diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerMsg.java index fc06c781cc0..46409b6cef4 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerMsg.java @@ -2,6 +2,7 @@ import org.springframework.http.HttpMethod; import org.zstack.header.identity.Action; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.query.APIQueryMessage; import org.zstack.header.query.AutoQuery; import org.zstack.header.rest.RestRequest; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerReply.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerReply.java index 38c251b4072..e678c696c41 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerReply.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerReply.java @@ -1,5 +1,6 @@ package org.zstack.sdnController.header; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.query.APIQueryReply; import org.zstack.header.rest.RestResponse; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerReplyDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerReplyDoc_zh_cn.groovy index 955b56b0240..ddbc0982463 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerReplyDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerReplyDoc_zh_cn.groovy @@ -1,6 +1,7 @@ package org.zstack.sdnController.header import org.zstack.header.errorcode.ErrorCode +import org.zstack.header.network.sdncontroller.SdnControllerInventory doc { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEvent.java index fbf0c036504..3f94369dad8 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEvent.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEvent.java @@ -1,6 +1,7 @@ package org.zstack.sdnController.header; import org.zstack.header.message.APIEvent; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.rest.RestResponse; /** diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEventDoc_zh_cn.groovy index aa592daeb88..658780d216a 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEventDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEventDoc_zh_cn.groovy @@ -1,6 +1,6 @@ package org.zstack.sdnController.header -import org.zstack.sdnController.header.SdnControllerInventory +import org.zstack.header.network.sdncontroller.SdnControllerInventory import org.zstack.header.errorcode.ErrorCode doc { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsg.java index d6f452cbedc..1689091c7f0 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsg.java @@ -4,6 +4,7 @@ import org.zstack.header.identity.Action; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; /** diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIRemoveSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIRemoveSdnControllerMsg.java index 60381eb8a88..4226ebff9b9 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIRemoveSdnControllerMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIRemoveSdnControllerMsg.java @@ -4,6 +4,7 @@ import org.zstack.header.identity.Action; import org.zstack.header.message.APIDeleteMessage; import org.zstack.header.message.APIParam; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; @Action(category = SdnControllerConstant.ACTION_CATEGORY) diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEvent.java index 1b9542bf1de..86b8f4f8836 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEvent.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEvent.java @@ -1,6 +1,7 @@ package org.zstack.sdnController.header; import org.zstack.header.message.APIEvent; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.rest.RestResponse; @RestResponse(allTo = "inventory") diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEventDoc_zh_cn.groovy index 4963f1da915..b7a2ac7c56c 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEventDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEventDoc_zh_cn.groovy @@ -1,6 +1,6 @@ package org.zstack.sdnController.header -import org.zstack.sdnController.header.SdnControllerInventory +import org.zstack.header.network.sdncontroller.SdnControllerInventory import org.zstack.header.errorcode.ErrorCode doc { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsg.java index 50a891d57b3..17d23cc3620 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsg.java @@ -1,18 +1,15 @@ package org.zstack.sdnController.header; import org.springframework.http.HttpMethod; -import org.zstack.header.cluster.ClusterVO; import org.zstack.header.host.HostVO; import org.zstack.header.identity.Action; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; import org.zstack.header.network.l2.L2NetworkConstant; -import org.zstack.header.rest.APINoSee; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; -import java.util.HashMap; import java.util.List; -import java.util.Map; @Action(category = SdnControllerConstant.ACTION_CATEGORY) @RestRequest( diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEvent.java index 9a58419f0c2..0cce7579422 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEvent.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEvent.java @@ -1,6 +1,7 @@ package org.zstack.sdnController.header; import org.zstack.header.message.APIEvent; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.rest.RestResponse; @RestResponse(allTo = "inventory") diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEventDoc_zh_cn.groovy index 83e1e8c7c75..a75ee6d301d 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEventDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEventDoc_zh_cn.groovy @@ -1,6 +1,6 @@ package org.zstack.sdnController.header -import org.zstack.sdnController.header.SdnControllerInventory +import org.zstack.header.network.sdncontroller.SdnControllerInventory import org.zstack.header.errorcode.ErrorCode doc { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsg.java index 54a3de0bd69..31ecc3cb2b6 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsg.java @@ -6,6 +6,7 @@ import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; import org.zstack.header.network.l2.L2NetworkConstant; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; import java.util.List; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEvent.java index 6d01aaa2674..f9070811611 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEvent.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEvent.java @@ -1,6 +1,7 @@ package org.zstack.sdnController.header; import org.zstack.header.message.APIEvent; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.rest.RestResponse; @RestResponse(allTo = "inventory") diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEventDoc_zh_cn.groovy index 816e1c58ebf..d84ebbca9cd 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEventDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEventDoc_zh_cn.groovy @@ -1,6 +1,6 @@ package org.zstack.sdnController.header -import org.zstack.sdnController.header.SdnControllerInventory +import org.zstack.header.network.sdncontroller.SdnControllerInventory import org.zstack.header.errorcode.ErrorCode doc { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java index 87e53c82a53..a91d68faeba 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java @@ -5,6 +5,7 @@ import org.zstack.header.identity.Action; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerEvent.java index b38e3268fa4..e4327198594 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerEvent.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerEvent.java @@ -1,6 +1,7 @@ package org.zstack.sdnController.header; import org.zstack.header.message.APIEvent; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.rest.RestResponse; /** diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerEventDoc_zh_cn.groovy index 0205e1be276..5977a9e0a92 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerEventDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerEventDoc_zh_cn.groovy @@ -1,6 +1,7 @@ package org.zstack.sdnController.header import org.zstack.header.errorcode.ErrorCode +import org.zstack.header.network.sdncontroller.SdnControllerInventory doc { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerMsg.java index 2ceda3f1a5c..90295b0c2bd 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerMsg.java @@ -4,7 +4,7 @@ import org.zstack.header.identity.Action; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; -import org.zstack.header.network.l2.L2NetworkMessage; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; /** diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantInventory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantInventory.java index fbdf67d77b7..787f93dbd9d 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantInventory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantInventory.java @@ -1,5 +1,6 @@ package org.zstack.sdnController.header; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.query.ExpandedQueries; import org.zstack.header.query.ExpandedQuery; import org.zstack.header.search.Inventory; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantVO.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantVO.java index 84f7f37acd5..3d50629bede 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantVO.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantVO.java @@ -1,5 +1,6 @@ package org.zstack.sdnController.header; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.vo.EntityGraph; import org.zstack.header.vo.ForeignKey; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO.java index ad4be72bc76..4d7ef95fcfd 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO.java @@ -1,6 +1,7 @@ package org.zstack.sdnController.header; import org.zstack.header.network.l3.IpRangeEO; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.vo.EntityGraph; import org.zstack.header.vo.ForeignKey; import org.zstack.header.vo.ForeignKey.ReferenceOption; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkInventory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkInventory.java new file mode 100644 index 00000000000..f80dc90af3a --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkInventory.java @@ -0,0 +1,53 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.configuration.PythonClassInventory; +import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; +import org.zstack.header.query.ExpandedQueries; +import org.zstack.header.query.ExpandedQuery; +import org.zstack.header.search.Inventory; +import org.zstack.header.search.Parent; +import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@PythonClassInventory +@Inventory(mappingVOClass = HardwareL2VxlanNetworkVO.class, collectionValueOfMethod = "valueOf2", + parent = {@Parent(inventoryClass = L2NetworkInventory.class, type = SdnControllerConstant.HARDWARE_VXLAN_NETWORK_TYPE)}) +@ExpandedQueries({ + @ExpandedQuery(expandedField = "sdnController", inventoryClass = SdnControllerInventory.class, + foreignKey = "sdnControllerUuid", expandedInventoryKey = "uuid"), +}) +public class HardwareL2VxlanNetworkInventory extends L2VxlanNetworkInventory { + private Integer vlan; + + public HardwareL2VxlanNetworkInventory() { + } + + protected HardwareL2VxlanNetworkInventory(HardwareL2VxlanNetworkVO vo) { + super(vo); + this.setVlan(vo.getVlan()); + } + + public static HardwareL2VxlanNetworkInventory valueOf(HardwareL2VxlanNetworkVO vo) { + return new HardwareL2VxlanNetworkInventory(vo); + } + + public static List valueOf2(Collection vos) { + List invs = new ArrayList(vos.size()); + for (HardwareL2VxlanNetworkVO vo : vos) { + invs.add(new HardwareL2VxlanNetworkInventory(vo)); + } + return invs; + } + + public Integer getVlan() { + return vlan; + } + + public void setVlan(Integer vlan) { + this.vlan = vlan; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventory.java index 923445031b3..95bc77e4ded 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventory.java @@ -3,6 +3,7 @@ import org.zstack.core.db.Q; import org.zstack.header.configuration.PythonClassInventory; import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.query.ExpandedQueries; import org.zstack.header.query.ExpandedQuery; import org.zstack.header.search.Inventory; @@ -27,6 +28,8 @@ }) public class HardwareL2VxlanNetworkPoolInventory extends L2VxlanNetworkPoolInventory { private String sdnControllerUuid; + private Integer startVlan; + private Integer endVlan; public HardwareL2VxlanNetworkPoolInventory() { } @@ -34,6 +37,8 @@ public HardwareL2VxlanNetworkPoolInventory() { protected HardwareL2VxlanNetworkPoolInventory(HardwareL2VxlanNetworkPoolVO vo) { super(vo); setSdnControllerUuid(vo.getSdnControllerUuid()); + setStartVlan(vo.getStartVlan()); + setEndVlan(vo.getEndVlan()); setAttachedVniRanges(VniRangeInventory.valueOf(vo.getAttachedVniRanges())); List networkVOS = Q.New(VxlanNetworkVO.class).eq(VxlanNetworkVO_.poolUuid, vo.getUuid()).list(); setAttachedVxlanNetworkRefs(L2VxlanNetworkInventory.valueOf1(networkVOS)); @@ -58,4 +63,20 @@ public String getSdnControllerUuid() { public void setSdnControllerUuid(String sdnControllerUuid) { this.sdnControllerUuid = sdnControllerUuid; } + + public Integer getStartVlan() { + return startVlan; + } + + public void setStartVlan(Integer startVlan) { + this.startVlan = startVlan; + } + + public Integer getEndVlan() { + return endVlan; + } + + public void setEndVlan(Integer endVlan) { + this.endVlan = endVlan; + } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventoryDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventoryDoc_zh_cn.groovy index 088aeffbb2d..3ca52dd5bd8 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventoryDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventoryDoc_zh_cn.groovy @@ -1,16 +1,8 @@ package org.zstack.sdnController.header -import org.zstack.network.l2.vxlan.vtep.VtepInventory -import org.zstack.network.l2.vxlan.vtep.RemoteVtepInventory -import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory -import org.zstack.network.l2.vxlan.vxlanNetworkPool.VniRangeInventory -import java.lang.Integer -import java.lang.Boolean -import java.sql.Timestamp - doc { - title "在这里输入结构的名称" + title "硬件VXLAN资源池清单" field { name "sdnControllerUuid" diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolVO.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolVO.java index c77d4445470..20374e4b6e3 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolVO.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolVO.java @@ -2,6 +2,7 @@ import org.zstack.header.network.l2.L2NetworkEO; import org.zstack.header.network.l2.L2NetworkVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.tag.AutoDeleteTag; import org.zstack.header.vo.EO; import org.zstack.header.vo.ForeignKey; @@ -22,6 +23,12 @@ public class HardwareL2VxlanNetworkPoolVO extends VxlanNetworkPoolVO { @ForeignKey(parentEntityClass = SdnControllerVO.class, onDeleteAction = ForeignKey.ReferenceOption.RESTRICT) private String sdnControllerUuid; + @Column + private Integer startVlan; + + @Column + private Integer endVlan; + public HardwareL2VxlanNetworkPoolVO() { } @@ -36,4 +43,20 @@ public String getSdnControllerUuid() { public void setSdnControllerUuid(String sdnControllerUuid) { this.sdnControllerUuid = sdnControllerUuid; } + + public Integer getStartVlan() { + return startVlan; + } + + public void setStartVlan(Integer startVlan) { + this.startVlan = startVlan; + } + + public Integer getEndVlan() { + return endVlan; + } + + public void setEndVlan(Integer endVlan) { + this.endVlan = endVlan; + } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolVO_.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolVO_.java index 16960eba093..d0363da0cef 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolVO_.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolVO_.java @@ -11,4 +11,6 @@ @StaticMetamodel(HardwareL2VxlanNetworkPoolVO.class) public class HardwareL2VxlanNetworkPoolVO_ extends L2NetworkVO_ { public static volatile SingularAttribute sdnControllerUuid; + public static volatile SingularAttribute startVlan; + public static volatile SingularAttribute endVlan; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkVO.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkVO.java new file mode 100644 index 00000000000..1f3e6b3d377 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkVO.java @@ -0,0 +1,40 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.network.l2.L2NetworkEO; +import org.zstack.header.network.l2.L2NetworkVO; +import org.zstack.header.tag.AutoDeleteTag; +import org.zstack.header.vo.EO; +import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.PrimaryKeyJoinColumn; +import javax.persistence.Table; + +/** + * Created by shixin.ruan on 07/09/2027. + */ +@Entity +@Table +@PrimaryKeyJoinColumn(name = "uuid", referencedColumnName = "uuid") +@EO(EOClazz = L2NetworkEO.class, needView = false) +@AutoDeleteTag +public class HardwareL2VxlanNetworkVO extends VxlanNetworkVO { + @Column + private int vlan; + + public HardwareL2VxlanNetworkVO() { + } + + public HardwareL2VxlanNetworkVO(L2NetworkVO vo) { + super(vo); + } + + public int getVlan() { + return vlan; + } + + public void setVlan(int vlan) { + this.vlan = vlan; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkVO_.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkVO_.java new file mode 100644 index 00000000000..1098f3a5e28 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkVO_.java @@ -0,0 +1,15 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.network.l2.L2NetworkVO_; +import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO_; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; + +/** + * Created by shixin.ruan on 09/20/2019. + */ +@StaticMetamodel(HardwareL2VxlanNetworkVO.class) +public class HardwareL2VxlanNetworkVO_ extends VxlanNetworkVO_ { + public static volatile SingularAttribute vlan; +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareVxlanHelper.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareVxlanHelper.java index 2077a520462..92d84e56cb3 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareVxlanHelper.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareVxlanHelper.java @@ -2,7 +2,6 @@ import org.zstack.core.db.Q; import org.zstack.header.host.HostInventory; -import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; public class HardwareVxlanHelper { public static class VxlanHostMappingStruct { @@ -29,7 +28,7 @@ public void setPhysicalInterface(String physicalInterface) { } } - public static VxlanHostMappingStruct getHardwareVxlanMappingVxlanId(L2VxlanNetworkInventory vxlan, HostInventory host) { + public static VxlanHostMappingStruct getHardwareVxlanMappingVxlanId(HardwareL2VxlanNetworkInventory vxlan, HostInventory host) { String phyNic = Q.New(HardwareL2VxlanNetworkPoolVO.class) .eq(HardwareL2VxlanNetworkPoolVO_.uuid, vxlan.getPoolUuid()) .select(HardwareL2VxlanNetworkPoolVO_.physicalInterface).findValue(); @@ -63,7 +62,11 @@ public static VxlanHostMappingStruct getHardwareVxlanMappingVxlanId(L2VxlanNetwo return struct; } - struct.setVlanId(vxlan.getVni()); + if (vxlan.getVlan() != 0) { + struct.setVlanId(vxlan.getVlan()); + } else { + struct.setVlanId(vxlan.getVirtualNetworkId()); + } struct.setPhysicalInterface(phyNic); return struct; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerCanonicalEvents.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerCanonicalEvents.java index 545db346521..1375de42ec2 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerCanonicalEvents.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerCanonicalEvents.java @@ -1,6 +1,7 @@ package org.zstack.sdnController.header; import org.zstack.header.message.NeedJsonSchema; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; public class SdnControllerCanonicalEvents { public static final String SDNCONTROLLER_STATE_CHANGED_PATH = "/sdnController/state/change"; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerConstant.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerConstant.java index 7282ea80730..9f9f56d2ebe 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerConstant.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerConstant.java @@ -37,6 +37,8 @@ public class SdnControllerConstant { public static final String SDN_CONTROLLER_VROUTER_PREFIX = "VR_"; + public static final String DEFAULT_SDN_CONTROLLER_VERSION = "V1"; + public enum Processes{ Pre, Post @@ -58,6 +60,7 @@ public enum ResourceTypes{ public enum Params { HARDWARE_VXLAN_POOLS, - VXLAN_NETWORK + VXLAN_NETWORK, + SDN_CONTROLLER, } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerFlowDataParam.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerFlowDataParam.java index 9266b61442a..7682575f00c 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerFlowDataParam.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerFlowDataParam.java @@ -2,4 +2,7 @@ public enum SdnControllerFlowDataParam { SDN_CONTROLLER_UUID, + SDN_CONTROLLER_PASSWORD, + SDN_CONTROLLER_USERNAME, + SDN_CONTROLLER_CHANGED, } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventoryDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventoryDoc_zh_cn.groovy deleted file mode 100644 index 5930ad05ed6..00000000000 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventoryDoc_zh_cn.groovy +++ /dev/null @@ -1,99 +0,0 @@ -package org.zstack.sdnController.header - -import org.zstack.sdnController.header.SdnControllerStatus -import java.sql.Timestamp -import org.zstack.sdnController.header.SdnVniRange -import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory -import org.zstack.sdnController.header.SdnControllerHostRefInventory - -doc { - - title "SDN控制器清单" - - field { - name "uuid" - desc "资源的UUID,唯一标示该资源" - type "String" - since "3.7" - } - field { - name "vendorType" - desc "" - type "String" - since "3.7" - } - field { - name "name" - desc "资源名称" - type "String" - since "3.7" - } - field { - name "description" - desc "资源的详细描述" - type "String" - since "3.7" - } - field { - name "ip" - desc "" - type "String" - since "3.7" - } - field { - name "username" - desc "" - type "String" - since "3.7" - } - field { - name "password" - desc "" - type "String" - since "3.7" - } - ref { - name "status" - path "org.zstack.sdnController.header.SdnControllerInventory.status" - desc "null" - type "SdnControllerStatus" - since "5.3.0" - clz SdnControllerStatus.class - } - field { - name "createDate" - desc "创建时间" - type "Timestamp" - since "3.7" - } - field { - name "lastOpDate" - desc "最后一次修改时间" - type "Timestamp" - since "3.7" - } - ref { - name "vniRanges" - path "org.zstack.sdnController.header.SdnControllerInventory.vniRanges" - desc "null" - type "List" - since "3.7" - clz SdnVniRange.class - } - ref { - name "vxlanPools" - path "org.zstack.sdnController.header.SdnControllerInventory.vxlanPools" - desc "null" - type "List" - since "3.7" - clz HardwareL2VxlanNetworkPoolInventory.class - } - ref { - name "hostRefs" - path "org.zstack.sdnController.header.SdnControllerInventory.hostRefs" - desc "null" - type "List" - since "5.3.0" - clz SdnControllerHostRefInventory.class - } -} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerTableState.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerTableState.java new file mode 100644 index 00000000000..3352d966dce --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerTableState.java @@ -0,0 +1,17 @@ +package org.zstack.sdnController.header; + +public enum SdnControllerTableState { + Enabled("Enabled"), + Disabled("Disabled"); + + public final String value; + private SdnControllerTableState(String value) { + this.value = value; + } + + + @Override + public String toString() { + return value; + } +} diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/account/AccountSync.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/account/AccountSync.java index e311e5ddeb5..1ffaf20178e 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/account/AccountSync.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/account/AccountSync.java @@ -10,8 +10,8 @@ import org.zstack.header.identity.BeforeDeleteAccountExtensionPoint; import org.zstack.header.identity.BeforeUpdateAccountExtensionPoint; import org.zstack.sdnController.SdnControllerManager; -import org.zstack.sdnController.header.SdnControllerVO; -import org.zstack.sdnController.header.SdnControllerVO_; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO_; /** * @description: diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java index 8147f7d9f82..89c08198ae6 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java @@ -6,8 +6,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.header.core.Completion; +import org.zstack.header.host.HostInventory; import org.zstack.header.identity.AccountInventory; import org.zstack.header.identity.AccountVO; import org.zstack.header.identity.AccountVO_; @@ -16,6 +18,10 @@ import org.zstack.header.network.l2.L2NetworkInventory; import org.zstack.header.network.l2.L2NetworkVO; import org.zstack.header.network.l3.*; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO_; +import org.zstack.header.vm.VmNicInventory; import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; import org.zstack.network.l3.L3NetworkSystemTags; import org.zstack.sdnController.SdnController; @@ -29,6 +35,7 @@ import org.zstack.utils.logging.CLogger; import org.zstack.utils.network.NetworkUtils; +import javax.persistence.Tuple; import java.util.*; import static org.zstack.core.Platform.operr; @@ -40,6 +47,8 @@ public class SugonSdnController implements TfSdnController, SdnController, SdnCo @Autowired CloudBus bus; + @Autowired + DatabaseFacade dbf; private SdnControllerVO sdnControllerVO; private TfHttpClient client; @@ -100,6 +109,17 @@ public void preInitSdnController(APIAddSdnControllerMsg msg, Completion completi } } + @Override + public void createSdnControllerDb(APIAddSdnControllerMsg msg, SdnControllerVO vo, Completion completion) { + dbf.persist(vo); + completion.success(); + } + + @Override + public void deleteSdnControllerDb(SdnControllerVO vo) { + dbf.removeByPrimaryKey(vo.getUuid(), SdnControllerVO.class); + } + @Override public void initSdnController(APIAddSdnControllerMsg msg, Completion completion) { completion.success(); @@ -130,8 +150,9 @@ public void preAttachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion) { + public void attachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List clusterUuids, List systemTags, Completion completion) { completion.success(); } @@ -224,7 +245,7 @@ public void deleteSdnController(SdnControllerDeletionMsg msg, SdnControllerInven } @Override - public void detachL2NetworkFromCluster(L2VxlanNetworkInventory vxlan, String clusterUuid, Completion completion) { + public void detachL2NetworkFromCluster(L2VxlanNetworkInventory vxlan, List clusterUuid, Completion completion) { completion.success(); } diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnControllerFactory.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnControllerFactory.java index 82071a47bb5..b277a336c3d 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnControllerFactory.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnControllerFactory.java @@ -1,20 +1,32 @@ package org.zstack.sugonSdnController.controller; +import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.db.DatabaseFacade; import org.zstack.network.securitygroup.SecurityGroupSdnBackend; import org.zstack.sdnController.SdnController; import org.zstack.sdnController.SdnControllerFactory; import org.zstack.sdnController.SdnControllerL2; import org.zstack.sdnController.SdnControllerType; -import org.zstack.sdnController.header.SdnControllerVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO; public class SugonSdnControllerFactory implements SdnControllerFactory { SdnControllerType sdnControllerType = new SdnControllerType(SugonSdnControllerConstant.TF_CONTROLLER); + + @Autowired + private DatabaseFacade dbf; + @Override public SdnControllerType getVendorType() { return sdnControllerType; } + @Override + public SdnControllerVO persistSdnController(SdnControllerVO vo) { + vo = dbf.persistAndRefresh(vo); + return vo; + } + @Override public SdnController getSdnController(SdnControllerVO vo) { return new SugonSdnController(vo); diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/neutronClient/TfPortClient.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/neutronClient/TfPortClient.java index 0251d480d62..421201a8f0f 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/neutronClient/TfPortClient.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/neutronClient/TfPortClient.java @@ -6,9 +6,8 @@ import org.zstack.header.network.l3.L3NetworkVO; import org.zstack.header.network.l3.L3NetworkVO_; import org.zstack.sdnController.header.SdnControllerConstant; -import org.zstack.sdnController.header.SdnControllerVO; -import org.zstack.sdnController.header.SdnControllerVO_; -import org.zstack.sugonSdnController.controller.SugonSdnControllerGlobalProperty; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO_; import org.zstack.sugonSdnController.controller.api.*; import org.zstack.sugonSdnController.controller.api.types.*; import org.zstack.utils.StringDSL; diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL2Network.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL2Network.java index 091b5c946c4..1855c797a32 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL2Network.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL2Network.java @@ -14,8 +14,8 @@ import org.zstack.header.network.l2.*; import org.zstack.network.l2.L2NoVlanNetwork; import org.zstack.sdnController.SdnControllerManager; -import org.zstack.sdnController.header.SdnControllerVO; -import org.zstack.sdnController.header.SdnControllerVO_; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO_; import static org.zstack.core.Platform.err; import static org.zstack.core.Platform.operr; diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL3Network.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL3Network.java index 2c3327db5a6..8d9531ede52 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL3Network.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL3Network.java @@ -14,8 +14,8 @@ import org.zstack.network.l3.L3BasicNetwork; import org.zstack.sdnController.SdnController; import org.zstack.sdnController.SdnControllerManager; -import org.zstack.sdnController.header.SdnControllerVO; -import org.zstack.sdnController.header.SdnControllerVO_; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO_; import org.zstack.sugonSdnController.controller.SugonSdnController; import org.zstack.sugonSdnController.controller.SugonSdnControllerConstant; import org.zstack.sugonSdnController.controller.neutronClient.TfPortClient; diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConnectFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConnectFlow.java index a946edf1591..d890e10ed33 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConnectFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConnectFlow.java @@ -165,10 +165,10 @@ public void run(final FlowTrigger trigger, Map data) { String url = vrMgr.buildUrl(mgmtNic.getIp(), VirtualRouterConstant.VR_INIT); int timeoutInSeconds = ApplianceVmGlobalConfig.CONNECT_TIMEOUT.value(Integer.class); - int interval = 30 ; /* seonds*/ + int interval = 120 ; /* seonds*/ List steps = new ArrayList<>(timeoutInSeconds/interval); - for (int i = 0; i < timeoutInSeconds/interval; i++) { + for (int i = 0; i <= timeoutInSeconds/interval; i++) { steps.add(i); } List errs = new ArrayList<>(); diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/VtepInventoryDoc_zh_cn.groovy b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/VtepInventoryDoc_zh_cn.groovy index 035a90ae789..d0ef4ef0863 100644 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/VtepInventoryDoc_zh_cn.groovy +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/VtepInventoryDoc_zh_cn.groovy @@ -37,6 +37,12 @@ doc { type "String" since "0.6" } + field { + name "physicalInterface" + desc "" + type "String" + since "5.3.28" + } field { name "createDate" desc "创建时间" diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetwork.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetwork.java index e7cd24f1cf2..0be8bb9aefa 100755 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetwork.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetwork.java @@ -83,7 +83,7 @@ && getVSwitchType().isAttachToCluster()) { } @Override - protected L2NetworkInventory getSelfInventory() { + protected L2VxlanNetworkInventory getSelfInventory() { return L2VxlanNetworkInventory.valueOf(getSelf()); } diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkConstant.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkConstant.java index 87e1f48880d..4ab04c033cb 100644 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkConstant.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkConstant.java @@ -9,4 +9,12 @@ public class VxlanNetworkConstant { @PythonClass public static final String VXLAN_NETWORK_TYPE = "VxlanNetwork"; + + //vlxan id range + public static final int MIN_VNI = 1; + public static final int MAX_VNI = 16777215; + + //vlan id range + public static final int MIN_VLAN = 1; + public static final int MAX_VLAN = 4095; } diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkFactory.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkFactory.java index 34f0ee2f30c..101ac6cbdd4 100755 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkFactory.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkFactory.java @@ -99,7 +99,7 @@ protected VxlanNetworkVO scripts() { String uuid = msg.getResourceUuid() == null ? Platform.getUuid() : msg.getResourceUuid(); vo.setUuid(uuid); vo.setVni(r.getVni()); - vo.setVirtualNetworkId(vo.getVni()); + vo.setVirtualNetworkId(r.getVni()); vo.setAccountUuid(msg.getSession().getAccountUuid()); vo.setPoolUuid((amsg.getPoolUuid())); if (vo.getPhysicalInterface() == null) { @@ -247,7 +247,7 @@ public Integer getDefaultMtu(L2NetworkInventory inv) { @Override public Integer getL2NetworkVni(String l2NetworkUuid, String hostUuid) { VxlanNetworkVO vxlanNetworkVO = Q.New(VxlanNetworkVO.class).eq(VxlanNetworkVO_.uuid, l2NetworkUuid).find(); - return vxlanNetworkVO.getVni(); + return vxlanNetworkVO.getVirtualNetworkId(); } @Override diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkHelper.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkHelper.java new file mode 100644 index 00000000000..f40f557c1e1 --- /dev/null +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkHelper.java @@ -0,0 +1,35 @@ +package org.zstack.network.l2.vxlan.vxlanNetwork; + +public class VxlanNetworkHelper { + public static boolean isValidVniRange(int startVni, int endVni) { + if (startVni < VxlanNetworkConstant.MIN_VNI || endVni < VxlanNetworkConstant.MIN_VNI) { + return false; + } + + if (startVni > VxlanNetworkConstant.MAX_VNI || endVni > VxlanNetworkConstant.MAX_VNI) { + return false; + } + + if (startVni > endVni) { + return false; + } + + return true; + } + + public static boolean isValidVlanRange(int startVlan, int endVlan) { + if (startVlan < VxlanNetworkConstant.MIN_VLAN || endVlan < VxlanNetworkConstant.MIN_VLAN) { + return false; + } + + if (startVlan > VxlanNetworkConstant.MAX_VLAN || endVlan > VxlanNetworkConstant.MAX_VLAN) { + return false; + } + + if (startVlan > endVlan) { + return false; + } + + return true; + } +} diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkBackend.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkBackend.java index b06b6200919..0fba2988fcf 100755 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkBackend.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkBackend.java @@ -107,7 +107,7 @@ public void realize(final L2NetworkInventory l2Network, final String hostUuid, b String info = String.format( "get vtep peers [%s] and vtep ip [%s] for l2Network[uuid:%s, type:%s, vni:%s] on kvm host[uuid:%s]", peers, - vtepIp, l2Network.getUuid(), l2Network.getType(), l2vxlan.getVni(), hostUuid); + vtepIp, l2Network.getUuid(), l2Network.getType(), l2vxlan.getVirtualNetworkId(), hostUuid); logger.debug(info); List dstports = Q.New(VtepVO.class).select(VtepVO_.port) @@ -120,7 +120,7 @@ public void realize(final L2NetworkInventory l2Network, final String hostUuid, b final VxlanKvmAgentCommands.CreateVxlanBridgeCmd cmd = new VxlanKvmAgentCommands.CreateVxlanBridgeCmd(); cmd.setVtepIp(vtepIp); cmd.setBridgeName(getBridgeName(l2vxlan)); - cmd.setVni(l2vxlan.getVni()); + cmd.setVni(l2vxlan.getVirtualNetworkId()); cmd.setL2NetworkUuid(l2Network.getUuid()); cmd.setPeers(peers); cmd.setDstport(dstport); @@ -146,14 +146,14 @@ public void run(MessageReply reply) { VxlanKvmAgentCommands.CreateVxlanBridgeResponse rsp = hreply.toResponse(VxlanKvmAgentCommands.CreateVxlanBridgeResponse.class); if (!rsp.isSuccess()) { ErrorCode err = operr("failed to create bridge[%s] for l2Network[uuid:%s, type:%s, vni:%s] on kvm host[uuid:%s], because %s", - cmd.getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2vxlan.getVni(), hostUuid, rsp.getError()); + cmd.getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2vxlan.getVirtualNetworkId(), hostUuid, rsp.getError()); completion.fail(err); return; } String info = String.format( "successfully realize bridge[%s] for l2Network[uuid:%s, type:%s, vni:%s] on kvm host[uuid:%s]", cmd - .getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2vxlan.getVni(), hostUuid); + .getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2vxlan.getVirtualNetworkId(), hostUuid); logger.debug(info); SystemTagCreator creator = KVMSystemTags.L2_BRIDGE_NAME.newSystemTagCreator(l2Network.getUuid()); @@ -364,7 +364,7 @@ public void run(FlowTrigger trigger, Map data) { VxlanKvmAgentCommands.PopulateVxlanFdbCmd cmd = new VxlanKvmAgentCommands.PopulateVxlanFdbCmd(); cmd.setPeers(peers); - cmd.setVni(l2vxlan.getVni()); + cmd.setVni(l2vxlan.getVirtualNetworkId()); KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); msg.setHostUuid(vtep.getHostUuid()); @@ -423,7 +423,7 @@ public L2NetworkType getL2NetworkTypeVmNicOn() { @Override public KVMAgentCommands.NicTO completeNicInformation(L2NetworkInventory l2Network, L3NetworkInventory l3Network, VmNicInventory nic) { - final Integer vni = getVni(l2Network.getUuid()); + final Integer vni = getVirtualNetworkId(l2Network.getUuid()); KVMAgentCommands.NicTO to = KVMAgentCommands.NicTO.fromVmNicInventory(nic); to.setBridgeName(getBridgeName(l2Network)); to.setMetaData(String.valueOf(vni)); @@ -436,7 +436,7 @@ public String getBridgeName(L2NetworkInventory l2Network) { if (KVMSystemTags.L2_BRIDGE_NAME.hasTag(l2Network.getUuid(), L2NetworkVO.class)) { return KVMSystemTags.L2_BRIDGE_NAME.getTokenByResourceUuid(l2Network.getUuid(), KVMSystemTags.L2_BRIDGE_NAME_TOKEN); } - final Integer vni = getVni(l2Network.getUuid()); + final Integer vni = getVirtualNetworkId(l2Network.getUuid()); return makeBridgeName(vni); } @@ -451,10 +451,10 @@ public Map getAttachedCidrs(String l2NetworkUuid) { return attachedClusters; } - private Integer getVni(String l2NetworkUuid) { + private Integer getVirtualNetworkId(String l2NetworkUuid) { return Q.New(VxlanNetworkVO.class) .eq(VxlanNetworkVO_.uuid, l2NetworkUuid) - .select(VxlanNetworkVO_.vni) + .select(VxlanNetworkVO_.virtualNetworkId) .findValue(); } @@ -524,7 +524,7 @@ public void delete(L2NetworkInventory l2Network, String hostUuid, Completion com final VxlanKvmAgentCommands.DeleteVxlanBridgeCmd cmd = new VxlanKvmAgentCommands.DeleteVxlanBridgeCmd(); cmd.setBridgeName(getBridgeName(l2vxlan)); - cmd.setVni(l2vxlan.getVni()); + cmd.setVni(l2vxlan.getVirtualNetworkId()); cmd.setL2NetworkUuid(l2Network.getUuid()); final List vtepIps = Q.New(VtepVO.class).select(VtepVO_.vtepIp).eq(VtepVO_.hostUuid, hostUuid).eq(VtepVO_.poolUuid, l2vxlan.getPoolUuid()).listValues(); @@ -548,14 +548,14 @@ public void run(MessageReply reply) { VxlanKvmAgentCommands.DeleteVxlanBridgeResponse rsp = hreply.toResponse(VxlanKvmAgentCommands.DeleteVxlanBridgeResponse.class); if (!rsp.isSuccess()) { ErrorCode err = operr("failed to delete bridge[%s] for l2Network[uuid:%s, type:%s, vni:%s] on kvm host[uuid:%s], because %s", - cmd.getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2vxlan.getVni(), hostUuid, rsp.getError()); + cmd.getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2vxlan.getVirtualNetworkId(), hostUuid, rsp.getError()); completion.fail(err); return; } String message = String.format( "successfully delete bridge[%s] for l2Network[uuid:%s, type:%s, vni:%s] on kvm host[uuid:%s]", cmd - .getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2vxlan.getVni(), hostUuid); + .getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2vxlan.getVirtualNetworkId(), hostUuid); logger.debug(message); completion.success(); diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkPoolBackend.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkPoolBackend.java index de4f2427330..728e49bff18 100755 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkPoolBackend.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkPoolBackend.java @@ -236,7 +236,7 @@ public void run(FlowTrigger trigger, Map data) { VxlanKvmAgentCommands.CreateVxlanBridgeCmd bridgeCmd = new VxlanKvmAgentCommands.CreateVxlanBridgeCmd(); bridgeCmd.setVtepIp((String) data.get(VTEP_IP)); bridgeCmd.setBridgeName(getBridgeName(vo.toInventory())); - bridgeCmd.setVni(vo.getVni()); + bridgeCmd.setVni(vo.getVirtualNetworkId()); bridgeCmd.setDstport(dstport); bridgeCmd.setL2NetworkUuid(vo.getUuid()); bridgeCmd.setMtu(new MtuGetter().getL2Mtu(L2VxlanNetworkInventory.valueOf(vo))); @@ -331,7 +331,7 @@ public String getBridgeName(L2NetworkInventory l2Network) { if (KVMSystemTags.L2_BRIDGE_NAME.hasTag(l2Network.getUuid(), L2NetworkVO.class)) { return KVMSystemTags.L2_BRIDGE_NAME.getTokenByResourceUuid(l2Network.getUuid(), KVMSystemTags.L2_BRIDGE_NAME_TOKEN); } - return KVMRealizeL2VxlanNetworkBackend.makeBridgeName(vo.getVni()); + return KVMRealizeL2VxlanNetworkBackend.makeBridgeName(vo.getVirtualNetworkId()); } public Map getAttachedCidrs(String l2NetworkUuid) { diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VniRangeInventoryDoc_zh_cn.groovy b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VniRangeInventoryDoc_zh_cn.groovy index 7362248055d..a7fcb7220d5 100644 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VniRangeInventoryDoc_zh_cn.groovy +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VniRangeInventoryDoc_zh_cn.groovy @@ -1,8 +1,6 @@ package org.zstack.network.l2.vxlan.vxlanNetworkPool import java.lang.Integer -import java.lang.Integer -import java.sql.Timestamp import java.sql.Timestamp doc { diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanNetworkPool.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanNetworkPool.java index c4a608c940f..3148a31f42d 100755 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanNetworkPool.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanNetworkPool.java @@ -281,9 +281,9 @@ public void done(ErrorCodeList errorCodeList) { }); } - private void handle(final PrepareL2NetworkOnHostMsg msg) { + protected void handle(final PrepareL2NetworkOnHostMsg msg) { final PrepareL2NetworkOnHostReply reply = new PrepareL2NetworkOnHostReply(); - prepareL2NetworkOnHosts(msg.getL2NetworkUuid(), Arrays.asList(msg.getHost()), new Completion(msg) { + prepareL2NetworkOnHosts(msg.getL2NetworkUuid(), Arrays.asList(msg.getHost()), false, new Completion(msg) { @Override public void success() { bus.reply(msg, reply); @@ -777,6 +777,8 @@ public void run(MessageReply reply) { }); } }).then(new NoRollbackFlow() { + String __name__ = "after-detach-l2-vxlan-pool"; + @Override public void run(FlowTrigger trigger, Map data) { afterDetachVxlanPoolFromCluster(msg); @@ -822,6 +824,10 @@ private void handle(final APICreateVniRangeMsg msg) { } protected void afterAttachVxlanPoolFromClusterFailed(APIAttachL2NetworkToClusterMsg msg) { + if (msg.getSystemTags() == null) { + return; + } + for (String tag : msg.getSystemTags()) { VxlanSystemTags.VXLAN_POOL_CLUSTER_VTEP_CIDR.delete(msg.getL2NetworkUuid(), tag); } @@ -850,9 +856,15 @@ private void handle(final APIAttachL2NetworkToClusterMsg msg) { query.add(HostVO_.state, SimpleQuery.Op.NOT_IN, HostState.PreMaintenance, HostState.Maintenance); query.add(HostVO_.status, SimpleQuery.Op.EQ, HostStatus.Connected); final List hosts = query.list(); + if (hosts.isEmpty()) { + evt.setInventory(self.toInventory()); + bus.publish(evt); + return; + } + List hvinvs = HostInventory.valueOf(hosts); - prepareL2NetworkOnHosts(msg.getL2NetworkUuid(), hvinvs, new Completion(msg) { + prepareL2NetworkOnHosts(msg.getL2NetworkUuid(), hvinvs, true, new Completion(msg) { @Override public void success() { L2NetworkClusterRefVO rvo = new L2NetworkClusterRefVO(); @@ -987,11 +999,13 @@ private void handle(final APIUpdateVniRangeMsg msg) { logger.info(String.format("update l2 vxlan vni range[%s] name[%s]", msg.getUuid(), msg.getName())); } - private void prepareL2NetworkOnHosts(final String l2NetworkUuid, final List hosts, final Completion completion) { + public void prepareL2NetworkOnHosts(final String l2NetworkUuid, final List hosts, boolean applyToSdn, final Completion completion) { FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); List vtepIpChanged = new ArrayList<>(); chain.setName(String.format("prepare-l2-%s-on-hosts", self.getUuid())); chain.then(new NoRollbackFlow() { + String __name__ = "check-vtep-ip"; + @Override public void run(final FlowTrigger trigger, Map data) { ErrorCodeList errList = new ErrorCodeList(); @@ -1052,6 +1066,8 @@ public void run(MessageReply reply) { }); } }).then(new NoRollbackFlow() { + String __name__ = "realize-l2-network"; + private void realize(final Iterator it, final FlowTrigger trigger) { if (!it.hasNext()) { trigger.next(); diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index bdb2dd6ab4a..9c51befc4a1 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -321,6 +321,8 @@ public class SourceClassMap { put("org.zstack.header.network.l3.ReservedIpRangeInventory", "org.zstack.sdk.ReservedIpRangeInventory"); put("org.zstack.header.network.l3.UsedIpInventory", "org.zstack.sdk.UsedIpInventory"); put("org.zstack.header.network.l3.datatypes.IpCapacityData", "org.zstack.sdk.IpCapacityData"); + put("org.zstack.header.network.sdncontroller.SdnControllerInventory", "org.zstack.sdk.SdnControllerInventory"); + put("org.zstack.header.network.sdncontroller.SdnControllerStatus", "org.zstack.sdk.SdnControllerStatus"); put("org.zstack.header.network.service.NetworkServiceL3NetworkRefInventory", "org.zstack.sdk.NetworkServiceL3NetworkRefInventory"); put("org.zstack.header.network.service.NetworkServiceProviderInventory", "org.zstack.sdk.NetworkServiceProviderInventory"); put("org.zstack.header.portMirror.MirrorNetworkUsedIpInventory", "org.zstack.sdk.MirrorNetworkUsedIpInventory"); @@ -519,8 +521,15 @@ public class SourceClassMap { put("org.zstack.nas.NasProtocolType", "org.zstack.sdk.NasProtocolType"); put("org.zstack.network.hostNetworkInterface.HostNetworkBondingInventory", "org.zstack.sdk.HostNetworkBondingInventory"); put("org.zstack.network.hostNetworkInterface.HostNetworkInterfaceInventory", "org.zstack.sdk.HostNetworkInterfaceInventory"); + put("org.zstack.network.hostNetworkInterface.PhysicalSwitchInventory", "org.zstack.sdk.PhysicalSwitchInventory"); + put("org.zstack.network.hostNetworkInterface.PhysicalSwitchPortInventory", "org.zstack.sdk.PhysicalSwitchPortInventory"); put("org.zstack.network.hostNetworkInterface.lldp.entity.HostNetworkInterfaceLldpInventory", "org.zstack.sdk.HostNetworkInterfaceLldpInventory"); put("org.zstack.network.hostNetworkInterface.lldp.entity.HostNetworkInterfaceLldpRefInventory", "org.zstack.sdk.HostNetworkInterfaceLldpRefInventory"); + put("org.zstack.network.huawei.imaster.HuaweiIMasterFabricInventory", "org.zstack.sdk.huawei.imaster.HuaweiIMasterFabricInventory"); + put("org.zstack.network.huawei.imaster.HuaweiIMasterSdnControllerInventory", "org.zstack.sdk.huawei.imaster.HuaweiIMasterSdnControllerInventory"); + put("org.zstack.network.huawei.imaster.HuaweiIMasterTenantInventory", "org.zstack.sdk.huawei.imaster.HuaweiIMasterTenantInventory"); + put("org.zstack.network.huawei.imaster.HuaweiIMasterVRouterInventory", "org.zstack.sdk.huawei.imaster.HuaweiIMasterVRouterInventory"); + put("org.zstack.network.huawei.imaster.HuaweiIMasterVpcInventory", "org.zstack.sdk.huawei.imaster.HuaweiIMasterVpcInventory"); put("org.zstack.network.l2.virtualSwitch.header.L2PortGroupNetworkInventory", "org.zstack.sdk.L2PortGroupNetworkInventory"); put("org.zstack.network.l2.virtualSwitch.header.L2PortGroupVlanMode", "org.zstack.sdk.L2PortGroupVlanMode"); put("org.zstack.network.l2.virtualSwitch.header.L2VirtualSwitchNetworkInventory", "org.zstack.sdk.L2VirtualSwitchNetworkInventory"); @@ -625,11 +634,9 @@ public class SourceClassMap { put("org.zstack.resourceconfig.ResourceConfigInventory", "org.zstack.sdk.ResourceConfigInventory"); put("org.zstack.resourceconfig.ResourceConfigStruct", "org.zstack.sdk.ResourceConfigStruct"); put("org.zstack.sdnController.header.H3cSdnControllerTenantInventory", "org.zstack.sdk.H3cSdnControllerTenantInventory"); + put("org.zstack.sdnController.header.HardwareL2VxlanNetworkInventory", "org.zstack.sdk.HardwareL2VxlanNetworkInventory"); put("org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory", "org.zstack.sdk.HardwareL2VxlanNetworkPoolInventory"); - put("org.zstack.sdnController.header.SdnControllerHostRefInventory", "org.zstack.sdk.SdnControllerHostRefInventory"); - put("org.zstack.sdnController.header.SdnControllerInventory", "org.zstack.sdk.SdnControllerInventory"); - put("org.zstack.sdnController.header.SdnControllerStatus", "org.zstack.sdk.SdnControllerStatus"); - put("org.zstack.sdnController.header.SdnVniRange", "org.zstack.sdk.SdnVniRange"); + put("org.zstack.sdnController.header.SdnVlanRange", "org.zstack.sdk.SdnVlanRange"); put("org.zstack.snmp.agent.SnmpAgentInventory", "org.zstack.sdk.SnmpAgentInventory"); put("org.zstack.sns.SNSAliyunSmsEndpointInventory", "org.zstack.sdk.sns.SNSAliyunSmsEndpointInventory"); put("org.zstack.sns.SNSApplicationEndpointInventory", "org.zstack.sdk.sns.SNSApplicationEndpointInventory"); @@ -1054,6 +1061,7 @@ public class SourceClassMap { put("org.zstack.sdk.H3cSdnControllerTenantInventory", "org.zstack.sdnController.header.H3cSdnControllerTenantInventory"); put("org.zstack.sdk.HaStrategyConditionInventory", "org.zstack.ha.HaStrategyConditionInventory"); put("org.zstack.sdk.HaiTaiSecretResourcePoolInventory", "org.zstack.crypto.securitymachine.thirdparty.haitai.HaiTaiSecretResourcePoolInventory"); + put("org.zstack.sdk.HardwareL2VxlanNetworkInventory", "org.zstack.sdnController.header.HardwareL2VxlanNetworkInventory"); put("org.zstack.sdk.HardwareL2VxlanNetworkPoolInventory", "org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory"); put("org.zstack.sdk.HbaDeviceInventory", "org.zstack.storage.device.hba.HbaDeviceInventory"); put("org.zstack.sdk.HostConnectedStatus", "org.zstack.zops.HostConnectedStatus"); @@ -1271,6 +1279,8 @@ public class SourceClassMap { put("org.zstack.sdk.PciDeviceVirtStatus", "org.zstack.pciDevice.virtual.PciDeviceVirtStatus"); put("org.zstack.sdk.PendingTaskInfo", "org.zstack.header.core.progress.PendingTaskInfo"); put("org.zstack.sdk.PhysicalDriveSmartSelfTestHistoryInventory", "org.zstack.storage.device.localRaid.PhysicalDriveSmartSelfTestHistoryInventory"); + put("org.zstack.sdk.PhysicalSwitchInventory", "org.zstack.network.hostNetworkInterface.PhysicalSwitchInventory"); + put("org.zstack.sdk.PhysicalSwitchPortInventory", "org.zstack.network.hostNetworkInterface.PhysicalSwitchPortInventory"); put("org.zstack.sdk.PluginDriverInventory", "org.zstack.header.core.external.plugin.PluginDriverInventory"); put("org.zstack.sdk.PluginSecretResourcePoolInventory", "org.zstack.crypto.securitymachine.thirdparty.plugin.PluginSecretResourcePoolInventory"); put("org.zstack.sdk.PolicyInventory", "org.zstack.header.identity.PolicyInventory"); @@ -1361,10 +1371,9 @@ public class SourceClassMap { put("org.zstack.sdk.ScsiLunHostRefInventory", "org.zstack.header.storageDevice.ScsiLunHostRefInventory"); put("org.zstack.sdk.ScsiLunInventory", "org.zstack.header.storageDevice.ScsiLunInventory"); put("org.zstack.sdk.ScsiLunVmInstanceRefInventory", "org.zstack.header.storageDevice.ScsiLunVmInstanceRefInventory"); - put("org.zstack.sdk.SdnControllerHostRefInventory", "org.zstack.sdnController.header.SdnControllerHostRefInventory"); - put("org.zstack.sdk.SdnControllerInventory", "org.zstack.sdnController.header.SdnControllerInventory"); - put("org.zstack.sdk.SdnControllerStatus", "org.zstack.sdnController.header.SdnControllerStatus"); - put("org.zstack.sdk.SdnVniRange", "org.zstack.sdnController.header.SdnVniRange"); + put("org.zstack.sdk.SdnControllerInventory", "org.zstack.header.network.sdncontroller.SdnControllerInventory"); + put("org.zstack.sdk.SdnControllerStatus", "org.zstack.header.network.sdncontroller.SdnControllerStatus"); + put("org.zstack.sdk.SdnVlanRange", "org.zstack.sdnController.header.SdnVlanRange"); put("org.zstack.sdk.SecretResourcePoolInventory", "org.zstack.header.securitymachine.SecretResourcePoolInventory"); put("org.zstack.sdk.SecurityGroupIngressRuleTO", "org.zstack.network.securitygroup.SecurityGroupIngressRuleTO"); put("org.zstack.sdk.SecurityGroupInventory", "org.zstack.network.securitygroup.SecurityGroupInventory"); @@ -1552,6 +1561,11 @@ public class SourceClassMap { put("org.zstack.sdk.databasebackup.DatabaseBackupStorageRefInventory", "org.zstack.header.storage.database.backup.DatabaseBackupStorageRefInventory"); put("org.zstack.sdk.databasebackup.DatabaseBackupStruct", "org.zstack.header.storage.database.backup.DatabaseBackupStruct"); put("org.zstack.sdk.databasebackup.DatabaseType", "org.zstack.header.storage.database.backup.DatabaseType"); + put("org.zstack.sdk.huawei.imaster.HuaweiIMasterFabricInventory", "org.zstack.network.huawei.imaster.HuaweiIMasterFabricInventory"); + put("org.zstack.sdk.huawei.imaster.HuaweiIMasterSdnControllerInventory", "org.zstack.network.huawei.imaster.HuaweiIMasterSdnControllerInventory"); + put("org.zstack.sdk.huawei.imaster.HuaweiIMasterTenantInventory", "org.zstack.network.huawei.imaster.HuaweiIMasterTenantInventory"); + put("org.zstack.sdk.huawei.imaster.HuaweiIMasterVRouterInventory", "org.zstack.network.huawei.imaster.HuaweiIMasterVRouterInventory"); + put("org.zstack.sdk.huawei.imaster.HuaweiIMasterVpcInventory", "org.zstack.network.huawei.imaster.HuaweiIMasterVpcInventory"); put("org.zstack.sdk.iam2.api.APIPermissionStruct", "org.zstack.iam2.api.APIGetIAM2VirtualIDAPIPermissionMsg$APIPermissionStruct"); put("org.zstack.sdk.iam2.api.Attribute", "org.zstack.iam2.api.Attribute"); put("org.zstack.sdk.iam2.api.ErrorResult", "org.zstack.iam2.api.ErrorResult"); diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeSdnControllerAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeSdnControllerAction.java new file mode 100644 index 00000000000..39edbc03474 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ChangeSdnControllerAction.java @@ -0,0 +1,110 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class ChangeSdnControllerAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.ChangeSdnControllerResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String userName; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String password; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List vlanRanges; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.ChangeSdnControllerResult value = res.getResult(org.zstack.sdk.ChangeSdnControllerResult.class); + ret.value = value == null ? new org.zstack.sdk.ChangeSdnControllerResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/sdn-controllers/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "changeSdnController"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeSdnControllerResult.java b/sdk/src/main/java/org/zstack/sdk/ChangeSdnControllerResult.java new file mode 100644 index 00000000000..543289e2381 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ChangeSdnControllerResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SdnControllerInventory; + +public class ChangeSdnControllerResult { + public SdnControllerInventory inventory; + public void setInventory(SdnControllerInventory inventory) { + this.inventory = inventory; + } + public SdnControllerInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkAction.java index b6de94c6cae..7b6b891307a 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkAction.java @@ -34,6 +34,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String h3cTenantUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {1L,4095L}, noTrim = false) + public java.lang.Integer vlan; + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; diff --git a/sdk/src/main/java/org/zstack/sdk/HardwareL2VxlanNetworkInventory.java b/sdk/src/main/java/org/zstack/sdk/HardwareL2VxlanNetworkInventory.java new file mode 100644 index 00000000000..b1343c5e5d6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/HardwareL2VxlanNetworkInventory.java @@ -0,0 +1,15 @@ +package org.zstack.sdk; + + + +public class HardwareL2VxlanNetworkInventory extends org.zstack.sdk.L2VxlanNetworkInventory { + + public java.lang.Integer vlan; + public void setVlan(java.lang.Integer vlan) { + this.vlan = vlan; + } + public java.lang.Integer getVlan() { + return this.vlan; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/HardwareL2VxlanNetworkPoolInventory.java b/sdk/src/main/java/org/zstack/sdk/HardwareL2VxlanNetworkPoolInventory.java index d4497f7e0be..d33ab4af273 100644 --- a/sdk/src/main/java/org/zstack/sdk/HardwareL2VxlanNetworkPoolInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/HardwareL2VxlanNetworkPoolInventory.java @@ -12,4 +12,20 @@ public java.lang.String getSdnControllerUuid() { return this.sdnControllerUuid; } + public java.lang.Integer startVlan; + public void setStartVlan(java.lang.Integer startVlan) { + this.startVlan = startVlan; + } + public java.lang.Integer getStartVlan() { + return this.startVlan; + } + + public java.lang.Integer endVlan; + public void setEndVlan(java.lang.Integer endVlan) { + this.endVlan = endVlan; + } + public java.lang.Integer getEndVlan() { + return this.endVlan; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/PhysicalSwitchInventory.java b/sdk/src/main/java/org/zstack/sdk/PhysicalSwitchInventory.java new file mode 100644 index 00000000000..b2ad514a15f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/PhysicalSwitchInventory.java @@ -0,0 +1,95 @@ +package org.zstack.sdk; + + + +public class PhysicalSwitchInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public java.lang.String ip; + public void setIp(java.lang.String ip) { + this.ip = ip; + } + public java.lang.String getIp() { + return this.ip; + } + + public java.lang.String mac; + public void setMac(java.lang.String mac) { + this.mac = mac; + } + public java.lang.String getMac() { + return this.mac; + } + + public java.lang.String mode; + public void setMode(java.lang.String mode) { + this.mode = mode; + } + public java.lang.String getMode() { + return this.mode; + } + + public java.lang.String softwareVersion; + public void setSoftwareVersion(java.lang.String softwareVersion) { + this.softwareVersion = softwareVersion; + } + public java.lang.String getSoftwareVersion() { + return this.softwareVersion; + } + + public java.lang.String sdnControllerUuid; + public void setSdnControllerUuid(java.lang.String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + public java.lang.String getSdnControllerUuid() { + return this.sdnControllerUuid; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + + public java.util.List ports; + public void setPorts(java.util.List ports) { + this.ports = ports; + } + public java.util.List getPorts() { + return this.ports; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/PhysicalSwitchPortInventory.java b/sdk/src/main/java/org/zstack/sdk/PhysicalSwitchPortInventory.java new file mode 100644 index 00000000000..f9ecabfa199 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/PhysicalSwitchPortInventory.java @@ -0,0 +1,87 @@ +package org.zstack.sdk; + + + +public class PhysicalSwitchPortInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public java.lang.String ethTrunkName; + public void setEthTrunkName(java.lang.String ethTrunkName) { + this.ethTrunkName = ethTrunkName; + } + public java.lang.String getEthTrunkName() { + return this.ethTrunkName; + } + + public java.lang.String portType; + public void setPortType(java.lang.String portType) { + this.portType = portType; + } + public java.lang.String getPortType() { + return this.portType; + } + + public java.lang.String peerInterfaceUuid; + public void setPeerInterfaceUuid(java.lang.String peerInterfaceUuid) { + this.peerInterfaceUuid = peerInterfaceUuid; + } + public java.lang.String getPeerInterfaceUuid() { + return this.peerInterfaceUuid; + } + + public java.lang.String switchUuid; + public void setSwitchUuid(java.lang.String switchUuid) { + this.switchUuid = switchUuid; + } + public java.lang.String getSwitchUuid() { + return this.switchUuid; + } + + public java.lang.String sdnControllerUuid; + public void setSdnControllerUuid(java.lang.String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + public java.lang.String getSdnControllerUuid() { + return this.sdnControllerUuid; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPhysicalSwitchAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPhysicalSwitchAction.java new file mode 100644 index 00000000000..50e7691813e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryPhysicalSwitchAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryPhysicalSwitchAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryPhysicalSwitchResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryPhysicalSwitchResult value = res.getResult(org.zstack.sdk.QueryPhysicalSwitchResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryPhysicalSwitchResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/topo/physical-switches"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPhysicalSwitchResult.java b/sdk/src/main/java/org/zstack/sdk/QueryPhysicalSwitchResult.java new file mode 100644 index 00000000000..d111c05dd37 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryPhysicalSwitchResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryPhysicalSwitchResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerHostRefInventory.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerHostRefInventory.java deleted file mode 100644 index 0d7dda066b9..00000000000 --- a/sdk/src/main/java/org/zstack/sdk/SdnControllerHostRefInventory.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.zstack.sdk; - - - -public class SdnControllerHostRefInventory { - - public java.lang.String sdnControllerUuid; - public void setSdnControllerUuid(java.lang.String sdnControllerUuid) { - this.sdnControllerUuid = sdnControllerUuid; - } - public java.lang.String getSdnControllerUuid() { - return this.sdnControllerUuid; - } - - public java.lang.String hostUuid; - public void setHostUuid(java.lang.String hostUuid) { - this.hostUuid = hostUuid; - } - public java.lang.String getHostUuid() { - return this.hostUuid; - } - - public java.lang.String vSwitchType; - public void setVSwitchType(java.lang.String vSwitchType) { - this.vSwitchType = vSwitchType; - } - public java.lang.String getVSwitchType() { - return this.vSwitchType; - } - - public java.lang.String vtepIp; - public void setVtepIp(java.lang.String vtepIp) { - this.vtepIp = vtepIp; - } - public java.lang.String getVtepIp() { - return this.vtepIp; - } - - public java.lang.String nicPciAddresses; - public void setNicPciAddresses(java.lang.String nicPciAddresses) { - this.nicPciAddresses = nicPciAddresses; - } - public java.lang.String getNicPciAddresses() { - return this.nicPciAddresses; - } - - public java.lang.String nicDrivers; - public void setNicDrivers(java.lang.String nicDrivers) { - this.nicDrivers = nicDrivers; - } - public java.lang.String getNicDrivers() { - return this.nicDrivers; - } - - public java.lang.String netmask; - public void setNetmask(java.lang.String netmask) { - this.netmask = netmask; - } - public java.lang.String getNetmask() { - return this.netmask; - } - - public java.lang.String bondMode; - public void setBondMode(java.lang.String bondMode) { - this.bondMode = bondMode; - } - public java.lang.String getBondMode() { - return this.bondMode; - } - - public java.lang.String lacpMode; - public void setLacpMode(java.lang.String lacpMode) { - this.lacpMode = lacpMode; - } - public java.lang.String getLacpMode() { - return this.lacpMode; - } - -} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerInventory.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerInventory.java index bb1005a7211..e771c2915c2 100644 --- a/sdk/src/main/java/org/zstack/sdk/SdnControllerInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerInventory.java @@ -92,28 +92,4 @@ public java.sql.Timestamp getLastOpDate() { return this.lastOpDate; } - public java.util.List vniRanges; - public void setVniRanges(java.util.List vniRanges) { - this.vniRanges = vniRanges; - } - public java.util.List getVniRanges() { - return this.vniRanges; - } - - public java.util.List vxlanPools; - public void setVxlanPools(java.util.List vxlanPools) { - this.vxlanPools = vxlanPools; - } - public java.util.List getVxlanPools() { - return this.vxlanPools; - } - - public java.util.List hostRefs; - public void setHostRefs(java.util.List hostRefs) { - this.hostRefs = hostRefs; - } - public java.util.List getHostRefs() { - return this.hostRefs; - } - } diff --git a/sdk/src/main/java/org/zstack/sdk/SdnVlanRange.java b/sdk/src/main/java/org/zstack/sdk/SdnVlanRange.java new file mode 100644 index 00000000000..d5ff24050f4 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SdnVlanRange.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class SdnVlanRange { + + public java.lang.Integer startVlan; + public void setStartVlan(java.lang.Integer startVlan) { + this.startVlan = startVlan; + } + public java.lang.Integer getStartVlan() { + return this.startVlan; + } + + public java.lang.Integer endVlan; + public void setEndVlan(java.lang.Integer endVlan) { + this.endVlan = endVlan; + } + public java.lang.Integer getEndVlan() { + return this.endVlan; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnVniRange.java b/sdk/src/main/java/org/zstack/sdk/SdnVniRange.java deleted file mode 100644 index 1250af40c82..00000000000 --- a/sdk/src/main/java/org/zstack/sdk/SdnVniRange.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.zstack.sdk; - - - -public class SdnVniRange { - - public java.lang.Integer startVni; - public void setStartVni(java.lang.Integer startVni) { - this.startVni = startVni; - } - public java.lang.Integer getStartVni() { - return this.startVni; - } - - public java.lang.Integer endVni; - public void setEndVni(java.lang.Integer endVni) { - this.endVni = endVni; - } - public java.lang.Integer getEndVni() { - return this.endVni; - } - -} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/CreateHuaweiIMasterVRouterAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/CreateHuaweiIMasterVRouterAction.java new file mode 100644 index 00000000000..40808907cbe --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/CreateHuaweiIMasterVRouterAction.java @@ -0,0 +1,113 @@ +package org.zstack.sdk.huawei.imaster; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateHuaweiIMasterVRouterAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.huawei.imaster.CreateHuaweiIMasterVRouterResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String huaweiVpcUuid; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.huawei.imaster.CreateHuaweiIMasterVRouterResult value = res.getResult(org.zstack.sdk.huawei.imaster.CreateHuaweiIMasterVRouterResult.class); + ret.value = value == null ? new org.zstack.sdk.huawei.imaster.CreateHuaweiIMasterVRouterResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/sdn-controller/huawei-imaster/vrouters"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/CreateHuaweiIMasterVRouterResult.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/CreateHuaweiIMasterVRouterResult.java new file mode 100644 index 00000000000..e7f94c38b51 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/CreateHuaweiIMasterVRouterResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.huawei.imaster; + +import org.zstack.sdk.huawei.imaster.HuaweiIMasterVRouterInventory; + +public class CreateHuaweiIMasterVRouterResult { + public HuaweiIMasterVRouterInventory inventory; + public void setInventory(HuaweiIMasterVRouterInventory inventory) { + this.inventory = inventory; + } + public HuaweiIMasterVRouterInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterFabricAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterFabricAction.java new file mode 100644 index 00000000000..dac79b20065 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterFabricAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk.huawei.imaster; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteHuaweiIMasterFabricAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterFabricResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.lang.String sdnControllerUuid; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterFabricResult value = res.getResult(org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterFabricResult.class); + ret.value = value == null ? new org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterFabricResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/sdn-controller/huawei-imaster/fabrics/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterFabricResult.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterFabricResult.java new file mode 100644 index 00000000000..b77013b2eb0 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterFabricResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class DeleteHuaweiIMasterFabricResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterTenantAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterTenantAction.java new file mode 100644 index 00000000000..8f42501e563 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterTenantAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk.huawei.imaster; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteHuaweiIMasterTenantAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterTenantResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.lang.String sdnControllerUuid; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterTenantResult value = res.getResult(org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterTenantResult.class); + ret.value = value == null ? new org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterTenantResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/sdn-controller/huawei-imaster/tenants/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterTenantResult.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterTenantResult.java new file mode 100644 index 00000000000..b08da0dd4df --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterTenantResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class DeleteHuaweiIMasterTenantResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVRouterAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVRouterAction.java new file mode 100644 index 00000000000..b901c8c9526 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVRouterAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk.huawei.imaster; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteHuaweiIMasterVRouterAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterVRouterResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.lang.String sdnControllerUuid; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterVRouterResult value = res.getResult(org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterVRouterResult.class); + ret.value = value == null ? new org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterVRouterResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/sdn-controller/huawei-imaster/vrouters/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVRouterResult.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVRouterResult.java new file mode 100644 index 00000000000..901f06a2e25 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVRouterResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class DeleteHuaweiIMasterVRouterResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVpcAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVpcAction.java new file mode 100644 index 00000000000..e61f3a56f21 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVpcAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk.huawei.imaster; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteHuaweiIMasterVpcAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterVpcResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.lang.String sdnControllerUuid; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterVpcResult value = res.getResult(org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterVpcResult.class); + ret.value = value == null ? new org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterVpcResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/sdn-controller/huawei-imaster/vpcs/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVpcResult.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVpcResult.java new file mode 100644 index 00000000000..df23f002cfc --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVpcResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class DeleteHuaweiIMasterVpcResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterFabricInventory.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterFabricInventory.java new file mode 100644 index 00000000000..5fecd41b979 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterFabricInventory.java @@ -0,0 +1,63 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class HuaweiIMasterFabricInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public java.lang.String sdnControllerUuid; + public void setSdnControllerUuid(java.lang.String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + public java.lang.String getSdnControllerUuid() { + return this.sdnControllerUuid; + } + + public java.lang.String state; + public void setState(java.lang.String state) { + this.state = state; + } + public java.lang.String getState() { + return this.state; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterSdnControllerInventory.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterSdnControllerInventory.java new file mode 100644 index 00000000000..0bcbbdf4593 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterSdnControllerInventory.java @@ -0,0 +1,47 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class HuaweiIMasterSdnControllerInventory extends org.zstack.sdk.SdnControllerInventory { + + public java.util.List fabrics; + public void setFabrics(java.util.List fabrics) { + this.fabrics = fabrics; + } + public java.util.List getFabrics() { + return this.fabrics; + } + + public java.util.List tenants; + public void setTenants(java.util.List tenants) { + this.tenants = tenants; + } + public java.util.List getTenants() { + return this.tenants; + } + + public java.util.List vpcs; + public void setVpcs(java.util.List vpcs) { + this.vpcs = vpcs; + } + public java.util.List getVpcs() { + return this.vpcs; + } + + public java.util.List vrouters; + public void setVrouters(java.util.List vrouters) { + this.vrouters = vrouters; + } + public java.util.List getVrouters() { + return this.vrouters; + } + + public java.util.List vlanRanges; + public void setVlanRanges(java.util.List vlanRanges) { + this.vlanRanges = vlanRanges; + } + public java.util.List getVlanRanges() { + return this.vlanRanges; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterTenantInventory.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterTenantInventory.java new file mode 100644 index 00000000000..a3f1c964021 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterTenantInventory.java @@ -0,0 +1,71 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class HuaweiIMasterTenantInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public java.util.List fabricIds; + public void setFabricIds(java.util.List fabricIds) { + this.fabricIds = fabricIds; + } + public java.util.List getFabricIds() { + return this.fabricIds; + } + + public java.lang.String sdnControllerUuid; + public void setSdnControllerUuid(java.lang.String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + public java.lang.String getSdnControllerUuid() { + return this.sdnControllerUuid; + } + + public java.lang.String state; + public void setState(java.lang.String state) { + this.state = state; + } + public java.lang.String getState() { + return this.state; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterVRouterInventory.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterVRouterInventory.java new file mode 100644 index 00000000000..7709bd4bfd0 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterVRouterInventory.java @@ -0,0 +1,87 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class HuaweiIMasterVRouterInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public java.lang.String logicalNetworkId; + public void setLogicalNetworkId(java.lang.String logicalNetworkId) { + this.logicalNetworkId = logicalNetworkId; + } + public java.lang.String getLogicalNetworkId() { + return this.logicalNetworkId; + } + + public java.lang.String tenantId; + public void setTenantId(java.lang.String tenantId) { + this.tenantId = tenantId; + } + public java.lang.String getTenantId() { + return this.tenantId; + } + + public java.lang.String fabricUuid; + public void setFabricUuid(java.lang.String fabricUuid) { + this.fabricUuid = fabricUuid; + } + public java.lang.String getFabricUuid() { + return this.fabricUuid; + } + + public java.lang.String sdnControllerUuid; + public void setSdnControllerUuid(java.lang.String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + public java.lang.String getSdnControllerUuid() { + return this.sdnControllerUuid; + } + + public java.lang.String state; + public void setState(java.lang.String state) { + this.state = state; + } + public java.lang.String getState() { + return this.state; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterVpcInventory.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterVpcInventory.java new file mode 100644 index 00000000000..df9e60d3ba4 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterVpcInventory.java @@ -0,0 +1,87 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class HuaweiIMasterVpcInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public java.lang.String tenantId; + public void setTenantId(java.lang.String tenantId) { + this.tenantId = tenantId; + } + public java.lang.String getTenantId() { + return this.tenantId; + } + + public java.lang.String fabricId; + public void setFabricId(java.lang.String fabricId) { + this.fabricId = fabricId; + } + public java.lang.String getFabricId() { + return this.fabricId; + } + + public java.lang.String sdnControllerUuid; + public void setSdnControllerUuid(java.lang.String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + public java.lang.String getSdnControllerUuid() { + return this.sdnControllerUuid; + } + + public java.lang.String state; + public void setState(java.lang.String state) { + this.state = state; + } + public java.lang.String getState() { + return this.state; + } + + public java.lang.Boolean isVpcDeployed; + public void setIsVpcDeployed(java.lang.Boolean isVpcDeployed) { + this.isVpcDeployed = isVpcDeployed; + } + public java.lang.Boolean getIsVpcDeployed() { + return this.isVpcDeployed; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/PullHuaweiIMasterControllerAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/PullHuaweiIMasterControllerAction.java new file mode 100644 index 00000000000..c8cab63f3fa --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/PullHuaweiIMasterControllerAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk.huawei.imaster; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class PullHuaweiIMasterControllerAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.huawei.imaster.PullHuaweiIMasterControllerResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public boolean pullSwitch = true; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.huawei.imaster.PullHuaweiIMasterControllerResult value = res.getResult(org.zstack.sdk.huawei.imaster.PullHuaweiIMasterControllerResult.class); + ret.value = value == null ? new org.zstack.sdk.huawei.imaster.PullHuaweiIMasterControllerResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/sdn-controller/huawei-imaster/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "pullHuaweiIMasterController"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/PullHuaweiIMasterControllerResult.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/PullHuaweiIMasterControllerResult.java new file mode 100644 index 00000000000..d7b2feff3a0 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/PullHuaweiIMasterControllerResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class PullHuaweiIMasterControllerResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterFabricAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterFabricAction.java new file mode 100644 index 00000000000..52ab2e1b5cd --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterFabricAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk.huawei.imaster; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryHuaweiIMasterFabricAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterFabricResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterFabricResult value = res.getResult(org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterFabricResult.class); + ret.value = value == null ? new org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterFabricResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/sdn-controller/huawei-imaster/fabrics"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterFabricResult.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterFabricResult.java new file mode 100644 index 00000000000..10a64737469 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterFabricResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class QueryHuaweiIMasterFabricResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterTenantAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterTenantAction.java new file mode 100644 index 00000000000..ef20f29f9d9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterTenantAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk.huawei.imaster; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryHuaweiIMasterTenantAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterTenantResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterTenantResult value = res.getResult(org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterTenantResult.class); + ret.value = value == null ? new org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterTenantResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/sdn-controller/huawei-imaster/tenants"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterTenantResult.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterTenantResult.java new file mode 100644 index 00000000000..3a4b358929e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterTenantResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class QueryHuaweiIMasterTenantResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVRouterAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVRouterAction.java new file mode 100644 index 00000000000..1ea349fce1a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVRouterAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk.huawei.imaster; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryHuaweiIMasterVRouterAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterVRouterResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterVRouterResult value = res.getResult(org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterVRouterResult.class); + ret.value = value == null ? new org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterVRouterResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/sdn-controller/huawei-imaster/vrouters"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVRouterResult.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVRouterResult.java new file mode 100644 index 00000000000..a75d7d71d9e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVRouterResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class QueryHuaweiIMasterVRouterResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVpcAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVpcAction.java new file mode 100644 index 00000000000..877f4bd0feb --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVpcAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk.huawei.imaster; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryHuaweiIMasterVpcAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterVpcResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterVpcResult value = res.getResult(org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterVpcResult.class); + ret.value = value == null ? new org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterVpcResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/sdn-controller/huawei-imaster/vpcs"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVpcResult.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVpcResult.java new file mode 100644 index 00000000000..df6c792e1ca --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVpcResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class QueryHuaweiIMasterVpcResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy index fc1f59de648..cf784182084 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy @@ -3,16 +3,21 @@ package org.zstack.test.integration.network.sdnController import org.springframework.http.HttpEntity import org.zstack.core.db.DatabaseFacade import org.zstack.core.db.Q -import org.zstack.header.network.l3.L3NetworkConstant -import org.zstack.sdk.* +import org.zstack.header.network.sdncontroller.SdnControllerVO +import org.zstack.sdk.ClusterInventory +import org.zstack.sdk.H3cSdnControllerTenantInventory +import org.zstack.sdk.L2NetworkInventory +import org.zstack.sdk.L2VxlanNetworkPoolInventory +import org.zstack.sdk.SdnControllerInventory +import org.zstack.sdk.ZoneInventory import org.zstack.sdnController.SdnControllerGlobalConfig -import org.zstack.sdnController.h3cVcfc.H3cVcfcCommands +import org.zstack.sdnController.SdnControllerSystemTags import org.zstack.sdnController.h3cVcfc.H3cVcfcV2Commands -import org.zstack.sdnController.h3cVcfc.H3cVcfcSdnControllerSystemTags +import org.zstack.sdnController.header.SdnControllerConstant import org.zstack.sdnController.header.H3cSdnControllerTenantVO import org.zstack.sdnController.header.H3cSdnControllerTenantVO_ -import org.zstack.sdnController.header.SdnControllerConstant -import org.zstack.sdnController.header.SdnControllerVO +import org.zstack.header.network.l3.L3NetworkConstant +import org.zstack.sdnController.h3cVcfc.H3cVcfcSdnControllerSystemTags import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase import org.zstack.utils.gson.JSONObjectUtil @@ -188,10 +193,8 @@ class SdnControllerCase extends SubCase { H3cVcfcSdnControllerSystemTags.H3C_TENANT_UUID_TOKEN) assert tenantUuid != null assert tenantUuid == inputTenantUuid - List> vniRanges = H3cVcfcSdnControllerSystemTags.H3C_VNI_RANGE.getTokensOfTagsByResourceUuid(sdn2.uuid) + List> vniRanges = SdnControllerSystemTags.VNI_RANGE.getTokensOfTagsByResourceUuid(sdn2.uuid) assert vniRanges.size() > 0 - /* this result depends on the simulator */ - assert sdn2.vniRanges.size() == 3 /* can not add controller with same ip again */ expectError { @@ -210,7 +213,7 @@ class SdnControllerCase extends SubCase { name = "sdn2" description = "sdn2" } - SdnControllerVO vo = dbf.findByUuid(sdn2.uuid, SdnControllerVO.class) + SdnControllerVO vo = dbf.findByUuid(sdn2.uuid, SdnControllerVO.class) assert vo.name == "sdn2" assert vo.description == "sdn2" diff --git a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SugonSdnControllerCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SugonSdnControllerCase.groovy index 141813024d1..8e28757ba5a 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SugonSdnControllerCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SugonSdnControllerCase.groovy @@ -1,6 +1,7 @@ package org.zstack.test.integration.network.sdnController import org.zstack.core.db.DatabaseFacade +import org.zstack.header.network.sdncontroller.SdnControllerVO import org.zstack.sdk.* import org.zstack.sugonSdnController.controller.SugonSdnControllerConstant import org.zstack.sugonSdnController.controller.api.types.MacAddressesType @@ -8,7 +9,6 @@ import org.zstack.sugonSdnController.controller.api.types.Project import org.zstack.sugonSdnController.controller.api.types.VirtualMachineInterface import org.zstack.sugonSdnController.controller.api.ApiSerializer import org.zstack.sugonSdnController.controller.api.TfCommands -import org.zstack.sdnController.header.SdnControllerVO import org.zstack.header.network.l3.L3NetworkVO; import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 75824481874..8bb1ac7dd91 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -6119,6 +6119,33 @@ abstract class ApiHelper { } + def changeSdnController(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ChangeSdnControllerAction.class) Closure c) { + def a = new org.zstack.sdk.ChangeSdnControllerAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def changeSecretResourcePoolState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ChangeSecretResourcePoolStateAction.class) Closure c) { def a = new org.zstack.sdk.ChangeSecretResourcePoolStateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -33043,6 +33070,35 @@ abstract class ApiHelper { } + def queryPhysicalSwitch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPhysicalSwitchAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPhysicalSwitchAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryPluginDrivers(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPluginDriversAction.class) Closure c) { def a = new org.zstack.sdk.QueryPluginDriversAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -47463,6 +47519,284 @@ abstract class ApiHelper { } + def createHuaweiIMasterVRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.huawei.imaster.CreateHuaweiIMasterVRouterAction.class) Closure c) { + def a = new org.zstack.sdk.huawei.imaster.CreateHuaweiIMasterVRouterAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def deleteHuaweiIMasterFabric(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterFabricAction.class) Closure c) { + def a = new org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterFabricAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def deleteHuaweiIMasterTenant(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterTenantAction.class) Closure c) { + def a = new org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterTenantAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def deleteHuaweiIMasterVRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterVRouterAction.class) Closure c) { + def a = new org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterVRouterAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def deleteHuaweiIMasterVpc(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterVpcAction.class) Closure c) { + def a = new org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterVpcAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def pullHuaweiIMasterController(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.huawei.imaster.PullHuaweiIMasterControllerAction.class) Closure c) { + def a = new org.zstack.sdk.huawei.imaster.PullHuaweiIMasterControllerAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def queryHuaweiIMasterFabric(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterFabricAction.class) Closure c) { + def a = new org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterFabricAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def queryHuaweiIMasterTenant(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterTenantAction.class) Closure c) { + def a = new org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterTenantAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def queryHuaweiIMasterVRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterVRouterAction.class) Closure c) { + def a = new org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterVRouterAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def queryHuaweiIMasterVpc(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterVpcAction.class) Closure c) { + def a = new org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterVpcAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def addAttributesToIAM2Organization(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddAttributesToIAM2OrganizationAction.class) Closure c) { def a = new org.zstack.sdk.iam2.api.AddAttributesToIAM2OrganizationAction() a.sessionId = Test.currentEnvSpec?.session?.uuid diff --git a/testlib/src/main/java/org/zstack/testlib/EnvSpec.groovy b/testlib/src/main/java/org/zstack/testlib/EnvSpec.groovy index d22dd720dc3..5491d321f1b 100755 --- a/testlib/src/main/java/org/zstack/testlib/EnvSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/EnvSpec.groovy @@ -1049,7 +1049,7 @@ class EnvSpec extends ApiHelper implements Node { ret = handler() } else if (handler.maximumNumberOfParameters == 1) { ret = handler(entity) - } else if (handler.maximumNumberOfParameters == 3) { + } else if (handler.maximumNumberOfParameters >= 3) { ret = handler(req, entity, this) } else { ret = handler(entity, this) @@ -1058,7 +1058,8 @@ class EnvSpec extends ApiHelper implements Node { Closure postHandler = httpPostHandlers[url] if (postHandler == null) { - for (String httpUrl : httpPostHandlers.keys()) { + List keys = (httpHandlers.keySet() as List).sort {a, b -> b.size() - a.size() } + for (String httpUrl : keys) { if (Pattern.matches(httpUrl, url)) { postHandler = httpPostHandlers.get(httpUrl) break @@ -1123,7 +1124,8 @@ class EnvSpec extends ApiHelper implements Node { def handler = httpHandlers[url] if (handler == null) { - for (String httpUrl : httpHandlers.keys()) { + List keys = (httpHandlers.keySet() as List).sort {a, b -> b.size() - a.size() } + for (String httpUrl : keys) { if (Pattern.matches(httpUrl, url)) { handler = httpHandlers.get(httpUrl) break From 62b3feb0facd76c80a793bf5b89a3da89d851616 Mon Sep 17 00:00:00 2001 From: "tao.gan" Date: Mon, 5 Feb 2024 16:43:59 +0800 Subject: [PATCH 511/737] [volume]: delete volume snapshot by block-commit APIImpact Resolves: ZSV-5799 Change-Id: I6b72706a71796c646567686b746d756478656a78 --- .../host/CommitVolumeOnHypervisorMsg.java | 53 -- .../host/CommitVolumeOnHypervisorReply.java | 24 - .../CommitVolumeSnapshotOnHypervisorMsg.java | 57 ++ ...CommitVolumeSnapshotOnHypervisorReply.java | 15 + .../PullVolumeSnapshotOnHypervisorMsg.java | 54 ++ .../PullVolumeSnapshotOnHypervisorReply.java | 17 + ...mmitVolumeSnapshotOnPrimaryStorageMsg.java | 52 ++ ...itVolumeSnapshotOnPrimaryStorageReply.java | 15 + ...PullVolumeSnapshotOnPrimaryStorageMsg.java | 52 ++ ...llVolumeSnapshotOnPrimaryStorageReply.java | 15 + ...doSnapshotCreationOnPrimaryStorageMsg.java | 67 -- ...SnapshotCreationOnPrimaryStorageReply.java | 24 - .../snapshot/APIDeleteVolumeSnapshotMsg.java | 22 + ...APIDeleteVolumeSnapshotMsgDoc_zh_cn.groovy | 18 + .../DeleteVolumeSnapshotDirection.java | 30 + .../snapshot/DeleteVolumeSnapshotMessage.java | 4 + .../snapshot/DeleteVolumeSnapshotMsg.java | 21 + .../snapshot/DeleteVolumeSnapshotScope.java | 18 + .../snapshot/MarkSnapshotAsVolumeMsg.java | 57 -- .../snapshot/MarkSnapshotAsVolumeReply.java | 10 - .../snapshot/VolumeSnapshotDeletionMsg.java | 18 + .../VolumeSnapshotDeletionStructs.java | 39 + .../snapshot/VolumeSnapshotInventory.java | 0 .../APIDeleteVolumeSnapshotGroupMsg.java | 34 + ...leteVolumeSnapshotGroupMsgDoc_zh_cn.groovy | 18 + .../DeleteVolumeSnapshotGroupInnerMsg.java | 18 + .../volume/UndoSnapshotCreationMsg.java | 35 - .../volume/UndoSnapshotCreationReply.java | 15 - .../ceph/primary/CephPrimaryStorageBase.java | 64 +- .../java/org/zstack/kvm/KVMAgentCommands.java | 72 +- .../kvm/KVMBlockCommitExtensionPoint.java | 29 +- .../kvm/KVMBlockPullExtensionPoint.java | 14 + .../main/java/org/zstack/kvm/KVMConstant.java | 1 + .../org/zstack/kvm/KVMExtensionEmitter.java | 68 +- .../src/main/java/org/zstack/kvm/KVMHost.java | 205 +++-- .../primary/local/LocalStorageBase.java | 39 +- .../local/LocalStorageHypervisorBackend.java | 4 +- .../primary/local/LocalStorageKvmBackend.java | 107 ++- .../primary/nfs/NfsPrimaryStorage.java | 154 ++-- .../primary/nfs/NfsPrimaryStorageBackend.java | 5 +- .../nfs/NfsPrimaryStorageKVMBackend.java | 74 +- .../NfsPrimaryStorageKVMBackendCommands.java | 33 + .../primary/smp/HypervisorBackend.java | 4 +- .../storage/primary/smp/KvmBackend.java | 139 +-- .../primary/smp/SMPPrimaryStorageBase.java | 66 +- .../zstack/storage/zbs/ZbsStorageFactory.java | 2 +- .../sdk/DeleteVolumeSnapshotAction.java | 6 + .../sdk/DeleteVolumeSnapshotGroupAction.java | 6 + .../snapshot/DeleteVolumeSnapshotLongJob.java | 2 + .../VolumeSnapshotCascadeExtension.java | 25 +- .../snapshot/VolumeSnapshotManagerImpl.java | 7 +- .../snapshot/VolumeSnapshotTreeBase.java | 843 +++++++++++++++--- .../zstack/storage/snapshot/VolumeTree.java | 551 ++++++++++++ .../group/VolumeSnapshotGroupBase.java | 6 +- .../org/zstack/storage/volume/VolumeBase.java | 222 +---- .../org/zstack/testlib/KVMSimulator.groovy | 45 +- .../zstack/testlib/LocalStorageSpec.groovy | 56 +- .../testlib/NfsPrimaryStorageSpec.groovy | 35 +- .../SharedMountPointPrimaryStorageSpec.groovy | 56 +- .../java/org/zstack/testlib/vfs/Qcow2.groovy | 33 +- ...FSPrimaryStorageTakeSnapshotBackend.groovy | 6 +- ...FSPrimaryStorageTakeSnapshotBackend.groovy | 29 +- ...FSPrimaryStorageTakeSnapshotBackend.groovy | 25 +- ...FSPrimaryStorageTakeSnapshotBackend.groovy | 28 +- 64 files changed, 2876 insertions(+), 987 deletions(-) delete mode 100644 header/src/main/java/org/zstack/header/host/CommitVolumeOnHypervisorMsg.java delete mode 100644 header/src/main/java/org/zstack/header/host/CommitVolumeOnHypervisorReply.java create mode 100644 header/src/main/java/org/zstack/header/host/CommitVolumeSnapshotOnHypervisorMsg.java create mode 100644 header/src/main/java/org/zstack/header/host/CommitVolumeSnapshotOnHypervisorReply.java create mode 100644 header/src/main/java/org/zstack/header/host/PullVolumeSnapshotOnHypervisorMsg.java create mode 100644 header/src/main/java/org/zstack/header/host/PullVolumeSnapshotOnHypervisorReply.java create mode 100644 header/src/main/java/org/zstack/header/storage/primary/CommitVolumeSnapshotOnPrimaryStorageMsg.java create mode 100644 header/src/main/java/org/zstack/header/storage/primary/CommitVolumeSnapshotOnPrimaryStorageReply.java create mode 100644 header/src/main/java/org/zstack/header/storage/primary/PullVolumeSnapshotOnPrimaryStorageMsg.java create mode 100644 header/src/main/java/org/zstack/header/storage/primary/PullVolumeSnapshotOnPrimaryStorageReply.java delete mode 100644 header/src/main/java/org/zstack/header/storage/primary/UndoSnapshotCreationOnPrimaryStorageMsg.java delete mode 100644 header/src/main/java/org/zstack/header/storage/primary/UndoSnapshotCreationOnPrimaryStorageReply.java create mode 100644 header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotDirection.java create mode 100644 header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotScope.java delete mode 100644 header/src/main/java/org/zstack/header/storage/snapshot/MarkSnapshotAsVolumeMsg.java delete mode 100644 header/src/main/java/org/zstack/header/storage/snapshot/MarkSnapshotAsVolumeReply.java create mode 100644 header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotDeletionStructs.java mode change 100755 => 100644 header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotInventory.java delete mode 100644 header/src/main/java/org/zstack/header/volume/UndoSnapshotCreationMsg.java delete mode 100644 header/src/main/java/org/zstack/header/volume/UndoSnapshotCreationReply.java create mode 100644 plugin/kvm/src/main/java/org/zstack/kvm/KVMBlockPullExtensionPoint.java create mode 100644 storage/src/main/java/org/zstack/storage/snapshot/VolumeTree.java diff --git a/header/src/main/java/org/zstack/header/host/CommitVolumeOnHypervisorMsg.java b/header/src/main/java/org/zstack/header/host/CommitVolumeOnHypervisorMsg.java deleted file mode 100644 index c5bbbbc5a1a..00000000000 --- a/header/src/main/java/org/zstack/header/host/CommitVolumeOnHypervisorMsg.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.zstack.header.host; - -import org.zstack.header.message.NeedReplyMessage; -import org.zstack.header.volume.VolumeInventory; - -public class CommitVolumeOnHypervisorMsg extends NeedReplyMessage implements HostMessage { - private String hostUuid; - private String vmUuid; - private VolumeInventory volume; - private String srcPath; - private String dstPath; - - public VolumeInventory getVolume() { - return volume; - } - - public void setVolume(VolumeInventory volume) { - this.volume = volume; - } - - @Override - public String getHostUuid() { - return hostUuid; - } - - public void setHostUuid(String hostUuid) { - this.hostUuid = hostUuid; - } - - public String getVmUuid() { - return vmUuid; - } - - public void setVmUuid(String vmUuid) { - this.vmUuid = vmUuid; - } - - public String getSrcPath() { - return srcPath; - } - - public void setSrcPath(String srcPath) { - this.srcPath = srcPath; - } - - public String getDstPath() { - return dstPath; - } - - public void setDstPath(String dstPath) { - this.dstPath = dstPath; - } -} diff --git a/header/src/main/java/org/zstack/header/host/CommitVolumeOnHypervisorReply.java b/header/src/main/java/org/zstack/header/host/CommitVolumeOnHypervisorReply.java deleted file mode 100644 index 7776e04b02d..00000000000 --- a/header/src/main/java/org/zstack/header/host/CommitVolumeOnHypervisorReply.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.zstack.header.host; - -import org.zstack.header.message.MessageReply; - -public class CommitVolumeOnHypervisorReply extends MessageReply { - private String newVolumeInstallPath; - private long size; - - public long getSize() { - return size; - } - - public void setSize(long size) { - this.size = size; - } - - public String getNewVolumeInstallPath() { - return newVolumeInstallPath; - } - - public void setNewVolumeInstallPath(String newVolumeInstallPath) { - this.newVolumeInstallPath = newVolumeInstallPath; - } -} diff --git a/header/src/main/java/org/zstack/header/host/CommitVolumeSnapshotOnHypervisorMsg.java b/header/src/main/java/org/zstack/header/host/CommitVolumeSnapshotOnHypervisorMsg.java new file mode 100644 index 00000000000..4ceb022eab0 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/CommitVolumeSnapshotOnHypervisorMsg.java @@ -0,0 +1,57 @@ +package org.zstack.header.host; + +import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; +import org.zstack.header.volume.VolumeInventory; + +import java.util.ArrayList; +import java.util.List; + +public class CommitVolumeSnapshotOnHypervisorMsg extends NeedReplyMessage implements HostMessage { + private String hostUuid; + private VolumeInventory volume; + private VolumeSnapshotInventory srcSnapshot; + private VolumeSnapshotInventory dstSnapshot; + private List srcChildrenInstallPathInDb = new ArrayList<>(); + + @Override + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public VolumeInventory getVolume() { + return volume; + } + + public void setVolume(VolumeInventory volume) { + this.volume = volume; + } + + public VolumeSnapshotInventory getSrcSnapshot() { + return srcSnapshot; + } + + public void setSrcSnapshot(VolumeSnapshotInventory srcSnapshot) { + this.srcSnapshot = srcSnapshot; + } + + public VolumeSnapshotInventory getDstSnapshot() { + return dstSnapshot; + } + + public void setDstSnapshot(VolumeSnapshotInventory dstSnapshot) { + this.dstSnapshot = dstSnapshot; + } + + public List getSrcChildrenInstallPathInDb() { + return srcChildrenInstallPathInDb; + } + + public void setSrcChildrenInstallPathInDb(List srcChildrenInstallPathInDb) { + this.srcChildrenInstallPathInDb = srcChildrenInstallPathInDb; + } +} diff --git a/header/src/main/java/org/zstack/header/host/CommitVolumeSnapshotOnHypervisorReply.java b/header/src/main/java/org/zstack/header/host/CommitVolumeSnapshotOnHypervisorReply.java new file mode 100644 index 00000000000..38475ee85f1 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/CommitVolumeSnapshotOnHypervisorReply.java @@ -0,0 +1,15 @@ +package org.zstack.header.host; + +import org.zstack.header.message.MessageReply; + +public class CommitVolumeSnapshotOnHypervisorReply extends MessageReply { + private long size; + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } +} diff --git a/header/src/main/java/org/zstack/header/host/PullVolumeSnapshotOnHypervisorMsg.java b/header/src/main/java/org/zstack/header/host/PullVolumeSnapshotOnHypervisorMsg.java new file mode 100644 index 00000000000..c1577a1d9eb --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/PullVolumeSnapshotOnHypervisorMsg.java @@ -0,0 +1,54 @@ +package org.zstack.header.host; + +import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; +import org.zstack.header.volume.VolumeInventory; + +public class PullVolumeSnapshotOnHypervisorMsg extends NeedReplyMessage implements HostMessage { + VolumeInventory volume; + private String srcSnapshotParentPath; + private VolumeSnapshotInventory srcSnapshot; + private VolumeSnapshotInventory dstSnapshot; + private String hostUuid; + + public VolumeInventory getVolume() { + return volume; + } + + public void setVolume(VolumeInventory volume) { + this.volume = volume; + } + + public String getSrcSnapshotParentPath() { + return srcSnapshotParentPath; + } + + public void setSrcSnapshotParentPath(String srcSnapshotParentPath) { + this.srcSnapshotParentPath = srcSnapshotParentPath; + } + + public VolumeSnapshotInventory getSrcSnapshot() { + return srcSnapshot; + } + + public void setSrcSnapshot(VolumeSnapshotInventory srcSnapshot) { + this.srcSnapshot = srcSnapshot; + } + + public VolumeSnapshotInventory getDstSnapshot() { + return dstSnapshot; + } + + public void setDstSnapshot(VolumeSnapshotInventory dstSnapshot) { + this.dstSnapshot = dstSnapshot; + } + + @Override + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } +} diff --git a/header/src/main/java/org/zstack/header/host/PullVolumeSnapshotOnHypervisorReply.java b/header/src/main/java/org/zstack/header/host/PullVolumeSnapshotOnHypervisorReply.java new file mode 100644 index 00000000000..13d109c48d5 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/PullVolumeSnapshotOnHypervisorReply.java @@ -0,0 +1,17 @@ +package org.zstack.header.host; + +import org.zstack.header.message.MessageReply; + +/** + */ +public class PullVolumeSnapshotOnHypervisorReply extends MessageReply { + private long size; + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/primary/CommitVolumeSnapshotOnPrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/primary/CommitVolumeSnapshotOnPrimaryStorageMsg.java new file mode 100644 index 00000000000..8e1595df39c --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/primary/CommitVolumeSnapshotOnPrimaryStorageMsg.java @@ -0,0 +1,52 @@ +package org.zstack.header.storage.primary; + +import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; +import org.zstack.header.volume.VolumeInventory; + +import java.util.ArrayList; +import java.util.List; + +public class CommitVolumeSnapshotOnPrimaryStorageMsg extends NeedReplyMessage implements PrimaryStorageMessage { + private VolumeInventory volume; + private VolumeSnapshotInventory srcSnapshot; + private VolumeSnapshotInventory dstSnapshot; + private List srcChildrenInstallPathInDb = new ArrayList<>(); + + public VolumeInventory getVolume() { + return volume; + } + + public void setVolume(VolumeInventory volume) { + this.volume = volume; + } + + public VolumeSnapshotInventory getSrcSnapshot() { + return srcSnapshot; + } + + public void setSrcSnapshot(VolumeSnapshotInventory srcSnapshot) { + this.srcSnapshot = srcSnapshot; + } + + public VolumeSnapshotInventory getDstSnapshot() { + return dstSnapshot; + } + + public void setDstSnapshot(VolumeSnapshotInventory dstSnapshot) { + this.dstSnapshot = dstSnapshot; + } + + public List getSrcChildrenInstallPathInDb() { + return srcChildrenInstallPathInDb; + } + + public void setSrcChildrenInstallPathInDb(List srcChildrenInstallPathInDb) { + this.srcChildrenInstallPathInDb = srcChildrenInstallPathInDb; + } + + @Override + public String getPrimaryStorageUuid() { + return srcSnapshot.getPrimaryStorageUuid(); + } +} diff --git a/header/src/main/java/org/zstack/header/storage/primary/CommitVolumeSnapshotOnPrimaryStorageReply.java b/header/src/main/java/org/zstack/header/storage/primary/CommitVolumeSnapshotOnPrimaryStorageReply.java new file mode 100644 index 00000000000..d5f87e1ab9f --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/primary/CommitVolumeSnapshotOnPrimaryStorageReply.java @@ -0,0 +1,15 @@ +package org.zstack.header.storage.primary; + +import org.zstack.header.message.MessageReply; + +public class CommitVolumeSnapshotOnPrimaryStorageReply extends MessageReply { + private long size; + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/primary/PullVolumeSnapshotOnPrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/primary/PullVolumeSnapshotOnPrimaryStorageMsg.java new file mode 100644 index 00000000000..2c06c26286e --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/primary/PullVolumeSnapshotOnPrimaryStorageMsg.java @@ -0,0 +1,52 @@ +package org.zstack.header.storage.primary; + +import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; +import org.zstack.header.volume.VolumeInventory; + +public class PullVolumeSnapshotOnPrimaryStorageMsg extends NeedReplyMessage implements PrimaryStorageMessage { + private VolumeInventory volume; + private String srcSnapshotParentPath; + private VolumeSnapshotInventory srcSnapshot; + private VolumeSnapshotInventory dstSnapshot; + + public VolumeInventory getVolume() { + return volume; + } + + public void setVolume(VolumeInventory volume) { + this.volume = volume; + } + + public String getSrcSnapshotParentPath() { + return srcSnapshotParentPath; + } + + public void setSrcSnapshotParentPath(String srcSnapshotParentPath) { + this.srcSnapshotParentPath = srcSnapshotParentPath; + } + + public VolumeSnapshotInventory getSrcSnapshot() { + return srcSnapshot; + } + + public void setSrcSnapshot(VolumeSnapshotInventory srcSnapshot) { + this.srcSnapshot = srcSnapshot; + } + + public VolumeSnapshotInventory getDstSnapshot() { + return dstSnapshot; + } + + public void setDstSnapshot(VolumeSnapshotInventory dstSnapshot) { + this.dstSnapshot = dstSnapshot; + } + + @Override + public String getPrimaryStorageUuid() { + if (volume == null) { + throw new IllegalArgumentException("volume cannot be null"); + } + return volume.getPrimaryStorageUuid(); + } +} diff --git a/header/src/main/java/org/zstack/header/storage/primary/PullVolumeSnapshotOnPrimaryStorageReply.java b/header/src/main/java/org/zstack/header/storage/primary/PullVolumeSnapshotOnPrimaryStorageReply.java new file mode 100644 index 00000000000..0cae40ce2e4 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/primary/PullVolumeSnapshotOnPrimaryStorageReply.java @@ -0,0 +1,15 @@ +package org.zstack.header.storage.primary; + +import org.zstack.header.message.MessageReply; + +public class PullVolumeSnapshotOnPrimaryStorageReply extends MessageReply { + private long size; + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/primary/UndoSnapshotCreationOnPrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/primary/UndoSnapshotCreationOnPrimaryStorageMsg.java deleted file mode 100644 index 5ee1ed35a3f..00000000000 --- a/header/src/main/java/org/zstack/header/storage/primary/UndoSnapshotCreationOnPrimaryStorageMsg.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.zstack.header.storage.primary; - -import org.zstack.header.message.NeedReplyMessage; -import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; -import org.zstack.header.volume.VolumeInventory; - -/** - * @ Author : yh.w - * @ Date : Created in 11:47 2023/8/21 - */ -public class UndoSnapshotCreationOnPrimaryStorageMsg extends NeedReplyMessage implements PrimaryStorageMessage { - private String vmUuid; - private VolumeInventory volume; - private VolumeSnapshotInventory snapshot; - private String srcPath; - private String dstPath; - private String primaryStorageUuid; - - public VolumeSnapshotInventory getSnapshot() { - return snapshot; - } - - public void setSnapshot(VolumeSnapshotInventory snapshot) { - this.snapshot = snapshot; - } - - public VolumeInventory getVolume() { - return volume; - } - - public void setVolume(VolumeInventory volume) { - this.volume = volume; - } - - public String getVmUuid() { - return vmUuid; - } - - public void setVmUuid(String vmUuid) { - this.vmUuid = vmUuid; - } - - public String getSrcPath() { - return srcPath; - } - - public void setSrcPath(String srcPath) { - this.srcPath = srcPath; - } - - public String getDstPath() { - return dstPath; - } - - public void setDstPath(String dstPath) { - this.dstPath = dstPath; - } - - public void setPrimaryStorageUuid(String primaryStorageUuid) { - this.primaryStorageUuid = primaryStorageUuid; - } - - @Override - public String getPrimaryStorageUuid() { - return primaryStorageUuid; - } -} diff --git a/header/src/main/java/org/zstack/header/storage/primary/UndoSnapshotCreationOnPrimaryStorageReply.java b/header/src/main/java/org/zstack/header/storage/primary/UndoSnapshotCreationOnPrimaryStorageReply.java deleted file mode 100644 index be0b31aa3c4..00000000000 --- a/header/src/main/java/org/zstack/header/storage/primary/UndoSnapshotCreationOnPrimaryStorageReply.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.zstack.header.storage.primary; - -import org.zstack.header.message.MessageReply; - -public class UndoSnapshotCreationOnPrimaryStorageReply extends MessageReply { - private String newVolumeInstallPath; - private long size; - - public long getSize() { - return size; - } - - public void setSize(long size) { - this.size = size; - } - - public String getNewVolumeInstallPath() { - return newVolumeInstallPath; - } - - public void setNewVolumeInstallPath(String newVolumeInstallPath) { - this.newVolumeInstallPath = newVolumeInstallPath; - } -} diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/APIDeleteVolumeSnapshotMsg.java b/header/src/main/java/org/zstack/header/storage/snapshot/APIDeleteVolumeSnapshotMsg.java index f9ed4e674fa..93003c6211c 100755 --- a/header/src/main/java/org/zstack/header/storage/snapshot/APIDeleteVolumeSnapshotMsg.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/APIDeleteVolumeSnapshotMsg.java @@ -61,6 +61,12 @@ public class APIDeleteVolumeSnapshotMsg extends APIDeleteMessage implements Dele @APINoSee private String treeUuid; + @APIParam(required = false, validValues = {"pull", "commit", "auto"}) + private String direction = "auto"; + + @APIParam(required = false, validValues = {"single", "chain", "auto"}) + private String scope = "chain"; + @Override public String getTreeUuid() { return treeUuid; @@ -84,6 +90,22 @@ public String getSnapshotUuid() { return uuid; } + public String getDirection() { + return direction; + } + + public void setDirection(String direction) { + this.direction = direction; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } + @Override public String getVolumeUuid() { return volumeUuid; diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/APIDeleteVolumeSnapshotMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/storage/snapshot/APIDeleteVolumeSnapshotMsgDoc_zh_cn.groovy index 44586873a44..9e8005b626e 100644 --- a/header/src/main/java/org/zstack/header/storage/snapshot/APIDeleteVolumeSnapshotMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/storage/snapshot/APIDeleteVolumeSnapshotMsgDoc_zh_cn.groovy @@ -39,6 +39,24 @@ doc { optional true since "0.6" } + column { + name "direction" + enclosedIn "" + desc "数据合并方向。pull:向前合并;commit:向后合并;auto:自动选择最优合并方向" + location "body" + type "String" + optional true + since "4.10.6" + } + column { + name "scope" + enclosedIn "" + desc "数据合并方式。single:仅合并单个快照;chain:合并整个快照链;auto:自动判断最佳合并范围" + location "body" + type "String" + optional true + since "4.10.6" + } column { name "systemTags" enclosedIn "" diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotDirection.java b/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotDirection.java new file mode 100644 index 00000000000..09fa7efe320 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotDirection.java @@ -0,0 +1,30 @@ +package org.zstack.header.storage.snapshot; + +public enum DeleteVolumeSnapshotDirection { + Pull("pull"), + Commit("commit"), + Auto("auto"); + + private final String direction; + + DeleteVolumeSnapshotDirection(String direction) { + this.direction = direction; + } + + @Override + public String toString() { + return direction; + } + + public static DeleteVolumeSnapshotDirection fromString(String value) { + if (value == null || value.trim().isEmpty()) { + throw new IllegalArgumentException(String.format("direction must be one of [pull, commit, auto], but value is %s", value)); + } + for (DeleteVolumeSnapshotDirection direction : DeleteVolumeSnapshotDirection.values()) { + if (direction.direction.equalsIgnoreCase(value)) { + return direction; + } + } + throw new IllegalArgumentException("Invalid direction: " + value); + } +} diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotMessage.java b/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotMessage.java index 78fe7375d56..b6efff2c386 100644 --- a/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotMessage.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotMessage.java @@ -7,4 +7,8 @@ */ public interface DeleteVolumeSnapshotMessage extends VolumeSnapshotMessage { DeletionMode getDeletionMode(); + + String getDirection(); + + String getScope(); } diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotMsg.java b/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotMsg.java index 3bb86662266..78af874890e 100644 --- a/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotMsg.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotMsg.java @@ -1,6 +1,7 @@ package org.zstack.header.storage.snapshot; import org.zstack.header.message.APIDeleteMessage; +import org.zstack.header.message.APIParam; import org.zstack.header.message.NeedReplyMessage; /** @@ -11,6 +12,8 @@ public class DeleteVolumeSnapshotMsg extends NeedReplyMessage implements DeleteV private String volumeUuid; private String treeUuid; private String deletionMode; + private String direction; + private String scope; public void setSnapshotUuid(String snapshotUuid) { this.snapshotUuid = snapshotUuid; @@ -49,4 +52,22 @@ public void setTreeUuid(String treeUuid) { public String getTreeUuid() { return treeUuid; } + + @Override + public String getDirection() { + return direction; + } + + public void setDirection(String direction) { + this.direction = direction; + } + + @Override + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } } diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotScope.java b/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotScope.java new file mode 100644 index 00000000000..1cf6b15dcf4 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotScope.java @@ -0,0 +1,18 @@ +package org.zstack.header.storage.snapshot; + +public enum DeleteVolumeSnapshotScope { + Single("single"), + Chain("chain"), + Auto("auto"); + + private final String scope; + + DeleteVolumeSnapshotScope(String scope) { + this.scope = scope; + } + + @Override + public String toString() { + return scope; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/MarkSnapshotAsVolumeMsg.java b/header/src/main/java/org/zstack/header/storage/snapshot/MarkSnapshotAsVolumeMsg.java deleted file mode 100644 index 06073791161..00000000000 --- a/header/src/main/java/org/zstack/header/storage/snapshot/MarkSnapshotAsVolumeMsg.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.zstack.header.storage.snapshot; - -import org.zstack.header.message.NeedReplyMessage; - -/** - * @ Author : yh.w - * @ Date : Created in 13:35 2023/9/4 - */ -public class MarkSnapshotAsVolumeMsg extends NeedReplyMessage implements VolumeSnapshotMessage { - private String volumeUuid; - private String snapshotUuid; - private long size; - private String volumePath; - private String treeUuid; - - public String getVolumePath() { - return volumePath; - } - - public void setVolumePath(String volumePath) { - this.volumePath = volumePath; - } - - public String getVolumeUuid() { - return volumeUuid; - } - - public void setVolumeUuid(String volumeUuid) { - this.volumeUuid = volumeUuid; - } - - @Override - public void setTreeUuid(String treeUuid) { - this.treeUuid = treeUuid; - } - - @Override - public String getTreeUuid() { - return treeUuid; - } - - public String getSnapshotUuid() { - return snapshotUuid; - } - - public void setSnapshotUuid(String snapshotUuid) { - this.snapshotUuid = snapshotUuid; - } - - public long getSize() { - return size; - } - - public void setSize(long size) { - this.size = size; - } -} diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/MarkSnapshotAsVolumeReply.java b/header/src/main/java/org/zstack/header/storage/snapshot/MarkSnapshotAsVolumeReply.java deleted file mode 100644 index e14d357bfb4..00000000000 --- a/header/src/main/java/org/zstack/header/storage/snapshot/MarkSnapshotAsVolumeReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.zstack.header.storage.snapshot; - -import org.zstack.header.message.MessageReply; - -/** - * @ Author : yh.w - * @ Date : Created in 15:59 2023/9/4 - */ -public class MarkSnapshotAsVolumeReply extends MessageReply { -} diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotDeletionMsg.java b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotDeletionMsg.java index 07099be40ca..7c1cf7f6244 100755 --- a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotDeletionMsg.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotDeletionMsg.java @@ -9,6 +9,8 @@ public class VolumeSnapshotDeletionMsg extends DeletionMessage implements Volume private String volumeUuid; private boolean volumeDeletion; private boolean dbOnly; + private String direction; + private String scope; /** * @ignore */ @@ -57,4 +59,20 @@ public boolean isDbOnly() { public void setDbOnly(boolean dbOnly) { this.dbOnly = dbOnly; } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } + + public String getDirection() { + return direction; + } + + public void setDirection(String direction) { + this.direction = direction; + } } diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotDeletionStructs.java b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotDeletionStructs.java new file mode 100644 index 00000000000..cd1b03ef05a --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotDeletionStructs.java @@ -0,0 +1,39 @@ +package org.zstack.header.storage.snapshot; + +import java.util.List; + +public class VolumeSnapshotDeletionStructs { + private List snapshotInventories; + private String direction; + private String scope; + + public VolumeSnapshotDeletionStructs(List snapshotInventories, String direction, String scope) { + this.snapshotInventories = snapshotInventories; + this.direction = direction; + this.scope = scope; + } + + public List getSnapshotInventories() { + return snapshotInventories; + } + + public void setSnapshotInventories(List snapshotInventories) { + this.snapshotInventories = snapshotInventories; + } + + public String getDirection() { + return direction; + } + + public void setDirection(String direction) { + this.direction = direction; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotInventory.java b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotInventory.java old mode 100755 new mode 100644 diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/group/APIDeleteVolumeSnapshotGroupMsg.java b/header/src/main/java/org/zstack/header/storage/snapshot/group/APIDeleteVolumeSnapshotGroupMsg.java index 1a5d3c16f7e..42fe3df00a9 100644 --- a/header/src/main/java/org/zstack/header/storage/snapshot/group/APIDeleteVolumeSnapshotGroupMsg.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/group/APIDeleteVolumeSnapshotGroupMsg.java @@ -5,6 +5,7 @@ import org.zstack.header.message.APIDeleteMessage; import org.zstack.header.message.APIParam; import org.zstack.header.message.DefaultTimeout; +import org.zstack.header.rest.APINoSee; import org.zstack.header.rest.RestRequest; import org.zstack.header.storage.snapshot.SnapshotBackendOperation; import org.zstack.header.storage.snapshot.VolumeSnapshotConstant; @@ -25,6 +26,15 @@ public class APIDeleteVolumeSnapshotGroupMsg extends APIDeleteMessage implements @APIParam(resourceType = VolumeSnapshotGroupVO.class, successIfResourceNotExisting = true) private String uuid; + @APIParam(required = false, validValues = {"pull", "commit", "auto"}) + private String direction = "auto"; + + @APIParam(required = false, validValues = {"single", "chain", "auto"}) + private String scope = "chain"; + + @APINoSee + private String vmUuid; + public String getUuid() { return uuid; } @@ -33,6 +43,30 @@ public void setUuid(String uuid) { this.uuid = uuid; } + public String getDirection() { + return direction; + } + + public void setDirection(String direction) { + this.direction = direction; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } + + public String getVmUuid() { + return vmUuid; + } + + public void setVmUuid(String vmUuid) { + this.vmUuid = vmUuid; + } + @Override public String getGroupUuid() { return uuid; diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/group/APIDeleteVolumeSnapshotGroupMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/storage/snapshot/group/APIDeleteVolumeSnapshotGroupMsgDoc_zh_cn.groovy index b835804ca6f..fa875873256 100644 --- a/header/src/main/java/org/zstack/header/storage/snapshot/group/APIDeleteVolumeSnapshotGroupMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/storage/snapshot/group/APIDeleteVolumeSnapshotGroupMsgDoc_zh_cn.groovy @@ -30,6 +30,24 @@ doc { optional false since "3.6.0" } + column { + name "direction" + enclosedIn "" + desc "数据合并方向。pull:向前合并;commit:向后合并;auto:自动选择最优合并方向" + location "body" + type "String" + optional true + since "4.10.6" + } + column { + name "scope" + enclosedIn "" + desc "数据合并方式。single:仅合并单个快照;chain:合并整个快照链;auto:自动判断最佳合并范围" + location "body" + type "String" + optional true + since "4.10.6" + } column { name "deleteMode" enclosedIn "" diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/group/DeleteVolumeSnapshotGroupInnerMsg.java b/header/src/main/java/org/zstack/header/storage/snapshot/group/DeleteVolumeSnapshotGroupInnerMsg.java index cddf37f9ff1..6f1129a8911 100644 --- a/header/src/main/java/org/zstack/header/storage/snapshot/group/DeleteVolumeSnapshotGroupInnerMsg.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/group/DeleteVolumeSnapshotGroupInnerMsg.java @@ -10,6 +10,8 @@ public class DeleteVolumeSnapshotGroupInnerMsg extends NeedReplyMessage implements VolumeSnapshotGroupMessage { private String uuid; private String deletionMode; + private String direction; + private String scope; public String getUuid() { return uuid; @@ -36,4 +38,20 @@ public void setDeletionMode(APIDeleteMessage.DeletionMode deletionMode) { public APIDeleteMessage.DeletionMode getDeletionMode() { return APIDeleteMessage.DeletionMode.valueOf(deletionMode); } + + public String getDirection() { + return direction; + } + + public void setDirection(String direction) { + this.direction = direction; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } } diff --git a/header/src/main/java/org/zstack/header/volume/UndoSnapshotCreationMsg.java b/header/src/main/java/org/zstack/header/volume/UndoSnapshotCreationMsg.java deleted file mode 100644 index 682a563fde5..00000000000 --- a/header/src/main/java/org/zstack/header/volume/UndoSnapshotCreationMsg.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.zstack.header.volume; - -import org.zstack.header.message.NeedReplyMessage; -import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; - -public class UndoSnapshotCreationMsg extends NeedReplyMessage implements VolumeMessage { - String vmInstanceUuid; - String volumeUuid; - VolumeSnapshotInventory snapShot; - - public String getVmInstanceUuid() { - return vmInstanceUuid; - } - - public void setVmInstanceUuid(String vmInstanceUuid) { - this.vmInstanceUuid = vmInstanceUuid; - } - - public VolumeSnapshotInventory getSnapShot() { - return snapShot; - } - - public void setSnapShot(VolumeSnapshotInventory snapShot) { - this.snapShot = snapShot; - } - - @Override - public String getVolumeUuid() { - return volumeUuid; - } - - public void setVolumeUuid(String volumeUuid) { - this.volumeUuid = volumeUuid; - } -} diff --git a/header/src/main/java/org/zstack/header/volume/UndoSnapshotCreationReply.java b/header/src/main/java/org/zstack/header/volume/UndoSnapshotCreationReply.java deleted file mode 100644 index c3d7098374c..00000000000 --- a/header/src/main/java/org/zstack/header/volume/UndoSnapshotCreationReply.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.zstack.header.volume; - -import org.zstack.header.message.MessageReply; - -public class UndoSnapshotCreationReply extends MessageReply { - private VolumeInventory volume; - - public VolumeInventory getVolume() { - return volume; - } - - public void setVolume(VolumeInventory volume) { - this.volume = volume; - } -} diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java index ab44a21e827..ab151953071 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java @@ -3057,12 +3057,14 @@ public void rollback(FlowRollback trigger, Map data) { trigger.rollback(); return; } - - UndoSnapshotCreationMsg cmsg = new UndoSnapshotCreationMsg(); - cmsg.setVolumeUuid(snapshot.getVolumeUuid()); - cmsg.setSnapShot(snapshot); - bus.makeTargetServiceIdByResourceUuid(cmsg, VolumeConstant.SERVICE_ID, snapshot.getVolumeUuid()); - bus.send(cmsg, new CloudBusCallBack(trigger) { + VolumeSnapshotDeletionMsg dmsg = new VolumeSnapshotDeletionMsg(); + dmsg.setTreeUuid(snapshot.getTreeUuid()); + dmsg.setVolumeUuid(snapshot.getVolumeUuid()); + dmsg.setSnapshotUuid(snapshot.getUuid()); + dmsg.setDirection(DeleteVolumeSnapshotDirection.Commit.toString()); + dmsg.setScope(DeleteVolumeSnapshotScope.Single.toString()); + bus.makeTargetServiceIdByResourceUuid(dmsg, VolumeSnapshotConstant.SERVICE_ID, snapshot.getUuid()); + bus.send(dmsg, new CloudBusCallBack(msg) { @Override public void run(MessageReply reply) { trigger.rollback(); @@ -3108,26 +3110,26 @@ public void run(MessageReply r) { }); flow(new NoRollbackFlow() { - String __name__ = "undo-snapshot-creation"; + String __name__ = "delete-temp-snapshot"; @Override public boolean skip(Map data) { - if (msg instanceof CreateTemplateFromVolumeSnapshotOnPrimaryStorageMsg || - !PrimaryStorageGlobalConfig.UNDO_TEMP_SNAPSHOT.value(Boolean.class)) { - return true; - } - - return false; + return msg instanceof CreateTemplateFromVolumeSnapshotOnPrimaryStorageMsg || + !PrimaryStorageGlobalConfig.UNDO_TEMP_SNAPSHOT.value(Boolean.class); } @Override public void run(FlowTrigger trigger, Map data) { TaskProgressRange stage = markTaskStage(parentStage, UNDO_SNAPSHOT_CREATION_STAGE); - UndoSnapshotCreationMsg cmsg = new UndoSnapshotCreationMsg(); - cmsg.setVolumeUuid(snapshot.getVolumeUuid()); - cmsg.setSnapShot(snapshot); - bus.makeTargetServiceIdByResourceUuid(cmsg, VolumeConstant.SERVICE_ID, snapshot.getVolumeUuid()); - bus.send(cmsg, new CloudBusCallBack(trigger) { + + VolumeSnapshotDeletionMsg dmsg = new VolumeSnapshotDeletionMsg(); + dmsg.setTreeUuid(snapshot.getTreeUuid()); + dmsg.setVolumeUuid(snapshot.getVolumeUuid()); + dmsg.setSnapshotUuid(snapshot.getUuid()); + dmsg.setScope(DeleteVolumeSnapshotScope.Single.toString()); + dmsg.setDirection(DeleteVolumeSnapshotDirection.Commit.toString()); + bus.makeTargetServiceIdByResourceUuid(dmsg, VolumeSnapshotConstant.SERVICE_ID, snapshot.getUuid()); + bus.send(dmsg, new CloudBusCallBack(msg) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { @@ -3164,30 +3166,6 @@ public void handle(ErrorCode errCode, Map data) { }).start(); } - private void handle(final UndoSnapshotCreationOnPrimaryStorageMsg msg) { - VolumeSnapshotDeletionMsg dmsg = new VolumeSnapshotDeletionMsg(); - dmsg.setTreeUuid(msg.getSnapshot().getTreeUuid()); - dmsg.setVolumeUuid(msg.getSnapshot().getVolumeUuid()); - dmsg.setSnapshotUuid(msg.getSnapshot().getUuid()); - dmsg.setVolumeDeletion(false); - bus.makeTargetServiceIdByResourceUuid(dmsg, VolumeSnapshotConstant.SERVICE_ID, msg.getSnapshot().getUuid()); - bus.send(dmsg, new CloudBusCallBack(msg) { - @Override - public void run(MessageReply reply) { - UndoSnapshotCreationOnPrimaryStorageReply ret = new UndoSnapshotCreationOnPrimaryStorageReply(); - if (!reply.isSuccess()) { - ret.setError(reply.getError()); - bus.reply(msg, ret); - return; - } - - ret.setNewVolumeInstallPath(msg.getVolume().getInstallPath()); - ret.setSize(msg.getVolume().getActualSize()); - bus.reply(msg, ret); - } - }); - } - @Override protected void handle(CancelJobOnPrimaryStorageMsg msg) { inQueue().name(String.format("cancel-job-on-primarystorage-%s", self.getUuid())) @@ -4520,8 +4498,6 @@ protected void handleLocalMessage(Message msg) { handle((GetPrimaryStorageUsageReportMsg) msg); } else if (msg instanceof CleanUpStorageTrashOnPrimaryStorageMsg) { handle((CleanUpStorageTrashOnPrimaryStorageMsg)msg); - } else if (msg instanceof UndoSnapshotCreationOnPrimaryStorageMsg) { - handle((UndoSnapshotCreationOnPrimaryStorageMsg) msg); } else { super.handleLocalMessage(msg); } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index 519bc13c190..9d8e5ddd1c4 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -3907,6 +3907,7 @@ public void setCompareError(String compareError) { } public static class MergeSnapshotRsp extends AgentResponse { + public long size; } public static class MergeSnapshotCmd extends AgentCommand implements HasThreadContext { @@ -4015,7 +4016,7 @@ public void setExcludeInstallPaths(List excludeInstallPaths) { } } - public static class BlockCommitVolumeCmd extends AgentCommand implements HasThreadContext { + public static class BlockCommitCmd extends AgentCommand implements HasThreadContext { @GrayVersion(value = "5.0.0") private String vmUuid; @GrayVersion(value = "5.0.0") @@ -4026,6 +4027,8 @@ public static class BlockCommitVolumeCmd extends AgentCommand implements HasThre private String top; @GrayVersion(value = "5.0.0") private String base; + @GrayVersion(value = "5.4.0") + private List topChildrenInstallPathInDb = new ArrayList<>(); public String getVmUuid() { return vmUuid; @@ -4035,14 +4038,6 @@ public void setVmUuid(String vmUuid) { this.vmUuid = vmUuid; } - public String getVolumeUuid() { - return volumeUuid; - } - - public void setVolumeUuid(String volumeUuid) { - this.volumeUuid = volumeUuid; - } - public VolumeTO getVolume() { return volume; } @@ -4066,12 +4061,17 @@ public String getBase() { public void setBase(String base) { this.base = base; } + + public List getTopChildrenInstallPathInDb() { + return topChildrenInstallPathInDb; + } + + public void setTopChildrenInstallPathInDb(List topChildrenInstallPathInDb) { + this.topChildrenInstallPathInDb = topChildrenInstallPathInDb; + } } - public static class BlockCommitVolumeResponse extends AgentResponse { - @Validation - @GrayVersion(value = "5.0.0") - private String newVolumeInstallPath; + public static class BlockCommitResponse extends AgentResponse { @Validation(notZero = true) @GrayVersion(value = "5.0.0") private long size; @@ -4083,13 +4083,51 @@ public long getSize() { public void setSize(long size) { this.size = size; } + } - public String getNewVolumeInstallPath() { - return newVolumeInstallPath; + public static class BlockPullCmd extends AgentCommand implements HasThreadContext { + @GrayVersion(value = "5.4.0") + private String vmUuid; + @GrayVersion(value = "5.4.0") + private VolumeTO volume; + @GrayVersion(value = "5.4.0") + private String base; + + public String getVmUuid() { + return vmUuid; } - public void setNewVolumeInstallPath(String newVolumeInstallPath) { - this.newVolumeInstallPath = newVolumeInstallPath; + public void setVmUuid(String vmUuid) { + this.vmUuid = vmUuid; + } + + public VolumeTO getVolume() { + return volume; + } + + public void setVolume(VolumeTO volume) { + this.volume = volume; + } + + public String getBase() { + return base; + } + + public void setBase(String base) { + this.base = base; + } + } + + public static class BlockPullResponse extends AgentResponse { + @GrayVersion(value = "5.4.0") + private long size; + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; } } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMBlockCommitExtensionPoint.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMBlockCommitExtensionPoint.java index cdaaf8b2b84..bab798b471a 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMBlockCommitExtensionPoint.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMBlockCommitExtensionPoint.java @@ -1,15 +1,14 @@ -package org.zstack.kvm; - -import org.zstack.header.core.Completion; -import org.zstack.header.errorcode.ErrorCode; -import org.zstack.header.host.CommitVolumeOnHypervisorMsg; -import org.zstack.header.host.CommitVolumeOnHypervisorReply; - - -public interface KVMBlockCommitExtensionPoint { - void beforeCommitVolume(KVMHostInventory host, CommitVolumeOnHypervisorMsg msg, KVMAgentCommands.BlockCommitVolumeCmd cmd, Completion completion); - - void afterCommitVolume(KVMHostInventory host, CommitVolumeOnHypervisorMsg msg, KVMAgentCommands.BlockCommitVolumeCmd cmd, CommitVolumeOnHypervisorReply reply, Completion completion); - - void failedToCommitVolume(KVMHostInventory host, CommitVolumeOnHypervisorMsg msg, KVMAgentCommands.BlockCommitVolumeCmd cmd, KVMAgentCommands.BlockCommitVolumeResponse rsp, ErrorCode err); -} +package org.zstack.kvm; + +import org.zstack.header.core.Completion; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.host.CommitVolumeSnapshotOnHypervisorMsg; +import org.zstack.header.host.CommitVolumeSnapshotOnHypervisorReply; + +public interface KVMBlockCommitExtensionPoint { + void beforeCommitVolume(KVMHostInventory host, CommitVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockCommitCmd cmd, Completion completion); + + void afterCommitVolume(KVMHostInventory host, CommitVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockCommitCmd cmd, CommitVolumeSnapshotOnHypervisorReply reply, Completion completion); + + void failedToCommitVolume(KVMHostInventory host, CommitVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockCommitCmd cmd, KVMAgentCommands.BlockCommitResponse rsp, ErrorCode err); +} diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMBlockPullExtensionPoint.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMBlockPullExtensionPoint.java new file mode 100644 index 00000000000..c7146ea323e --- /dev/null +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMBlockPullExtensionPoint.java @@ -0,0 +1,14 @@ +package org.zstack.kvm; + +import org.zstack.header.core.Completion; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.host.PullVolumeSnapshotOnHypervisorMsg; +import org.zstack.header.host.PullVolumeSnapshotOnHypervisorReply; + +public interface KVMBlockPullExtensionPoint { + void beforePullVolume(KVMHostInventory host, PullVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockPullCmd cmd, Completion completion); + + void afterPullVolume(KVMHostInventory host, PullVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockPullCmd cmd, PullVolumeSnapshotOnHypervisorReply reply, Completion completion); + + void failedToPullVolume(KVMHostInventory host, PullVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockPullCmd cmd, KVMAgentCommands.BlockPullResponse rsp, ErrorCode err); +} diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java index 8654f9e415f..f40157764ea 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java @@ -119,6 +119,7 @@ public interface KVMConstant { String KVM_HOST_ATTACH_VOLUME_PATH = "/host/volume/attach"; String KVM_HOST_DETACH_VOLUME_PATH = "/host/volume/detach"; String KVM_BLOCK_COMMIT_VOLUME_PATH = "/vm/volume/blockcommit"; + String KVM_BLOCK_PULL_VOLUME_PATH = "/vm/volume/blockpull"; String TAKE_VM_CONSOLE_SCREENSHOT_PATH = "/vm/console/screenshot"; String KVM_HOST_IPSET_ATTACH_NIC_PATH = "/network/ipset/attach"; diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMExtensionEmitter.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMExtensionEmitter.java index e0588ce8b56..0e723cd16aa 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMExtensionEmitter.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMExtensionEmitter.java @@ -44,6 +44,7 @@ public class KVMExtensionEmitter implements Component { private List checkVmStateExts = new ArrayList<>(); private List syncVmDeviceInfoExts = new ArrayList<>(); private List blockCommitExts = new ArrayList<>(); + private List blockPullExts = new ArrayList<>(); private void populateExtensions() { startVmExts = pluginRgty.getExtensionList(KVMStartVmExtensionPoint.class); @@ -59,6 +60,7 @@ private void populateExtensions() { checkSnapshotExts = pluginRgty.getExtensionList(KVMCheckSnapshotExtensionPoint.class); syncVmDeviceInfoExts = pluginRgty.getExtensionList(KVMSyncVmDeviceInfoExtensionPoint.class); blockCommitExts = pluginRgty.getExtensionList(KVMBlockCommitExtensionPoint.class); + blockPullExts = pluginRgty.getExtensionList(KVMBlockPullExtensionPoint.class); } public void afterReceiveSyncVmDeviceInfoResponse(final VmInstanceInventory vm, final KVMAgentCommands.VmDevicesInfoResponse rsp, VmInstanceSpec spec) { @@ -231,7 +233,7 @@ public void done(ErrorCodeList errorCodeList) { }); } - private void doBeforeCommitVolume(Iterator it, KVMHostInventory host, CommitVolumeOnHypervisorMsg msg, KVMAgentCommands.BlockCommitVolumeCmd cmd, Completion completion) { + public void doBeforeCommitVolume(Iterator it, KVMHostInventory host, CommitVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockCommitCmd cmd, Completion completion) { if (!it.hasNext()) { completion.success(); return; @@ -251,12 +253,12 @@ public void fail(ErrorCode errorCode) { }); } - public void beforeCommitVolume(KVMHostInventory host, CommitVolumeOnHypervisorMsg msg, KVMAgentCommands.BlockCommitVolumeCmd cmd, Completion completion) { + public void beforeCommitVolume(KVMHostInventory host, CommitVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockCommitCmd cmd, Completion completion) { Iterator it = blockCommitExts.iterator(); doBeforeCommitVolume(it, host, msg, cmd, completion); } - private void doAfterCommitVolume(Iterator it, KVMHostInventory host, CommitVolumeOnHypervisorMsg msg, KVMAgentCommands.BlockCommitVolumeCmd cmd, CommitVolumeOnHypervisorReply reply, Completion completion) { + public void doAfterCommitVolume(Iterator it, KVMHostInventory host, CommitVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockCommitCmd cmd, CommitVolumeSnapshotOnHypervisorReply reply, Completion completion) { if (!it.hasNext()) { completion.success(); return; @@ -276,17 +278,73 @@ public void fail(ErrorCode errorCode) { }); } - public void afterCommitVolume(KVMHostInventory host, CommitVolumeOnHypervisorMsg msg, KVMAgentCommands.BlockCommitVolumeCmd cmd, CommitVolumeOnHypervisorReply reply, Completion completion) { + public void afterCommitVolume(KVMHostInventory host, CommitVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockCommitCmd cmd, CommitVolumeSnapshotOnHypervisorReply reply, Completion completion) { Iterator it = blockCommitExts.iterator(); doAfterCommitVolume(it, host, msg, cmd, reply, completion); } - public void failedToCommitVolume(KVMHostInventory host, CommitVolumeOnHypervisorMsg msg, KVMAgentCommands.BlockCommitVolumeCmd cmd, KVMAgentCommands.BlockCommitVolumeResponse rsp, ErrorCode err) { + public void failedToCommitVolume(KVMHostInventory host, CommitVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockCommitCmd cmd, KVMAgentCommands.BlockCommitResponse rsp, ErrorCode err) { for (KVMBlockCommitExtensionPoint ext : blockCommitExts) { ext.failedToCommitVolume(host, msg, cmd, rsp, err); } } + public void doBeforePullVolume(Iterator it, KVMHostInventory host, PullVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockPullCmd cmd, Completion completion) { + if (!it.hasNext()) { + completion.success(); + return; + } + + KVMBlockPullExtensionPoint ext = it.next(); + ext.beforePullVolume(host, msg, cmd, new Completion(completion) { + @Override + public void success() { + doBeforePullVolume(it, host, msg, cmd, completion); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + public void beforePullVolume(KVMHostInventory host, PullVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockPullCmd cmd, Completion completion) { + Iterator it = blockPullExts.iterator(); + doBeforePullVolume(it, host, msg, cmd, completion); + } + + public void doAfterPullVolume(Iterator it, KVMHostInventory host, PullVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockPullCmd cmd, PullVolumeSnapshotOnHypervisorReply reply, Completion completion) { + if (!it.hasNext()) { + completion.success(); + return; + } + + KVMBlockPullExtensionPoint ext = it.next(); + ext.afterPullVolume(host, msg, cmd, reply, new Completion(completion) { + @Override + public void success() { + doAfterPullVolume(it, host, msg, cmd, reply, completion); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + public void afterPullVolume(KVMHostInventory host, PullVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockPullCmd cmd, PullVolumeSnapshotOnHypervisorReply reply, Completion completion) { + Iterator it = blockPullExts.iterator(); + doAfterPullVolume(it, host, msg, cmd, reply, completion); + } + + public void failedToPullVolume(KVMHostInventory host, PullVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockPullCmd cmd, KVMAgentCommands.BlockPullResponse rsp, ErrorCode err) { + for (KVMBlockPullExtensionPoint ext : blockPullExts) { + ext.failedToPullVolume(host, msg, cmd, rsp, err); + } + } + public void beforeTakeSnapshot(KVMHostInventory host, TakeSnapshotOnHypervisorMsg msg, KVMAgentCommands.TakeSnapshotCmd cmd, Completion completion) { Iterator it = takeSnapshotExts.iterator(); doBeforeTakeSnapshot(it, host, msg, cmd, completion); diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index d70b462e2be..87a0553fd3a 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -12,6 +12,10 @@ import org.zstack.compute.cluster.arch.ClusterResourceConfigInitializer; import org.zstack.compute.host.*; import org.zstack.compute.vm.*; +import org.zstack.core.timeout.TimeHelper; +import org.zstack.header.core.*; +import org.zstack.header.vm.devices.VirtualDeviceInfo; +import org.zstack.header.vm.devices.VmInstanceDeviceManager; import org.zstack.core.CoreGlobalProperty; import org.zstack.core.MessageCommandRecorder; import org.zstack.core.Platform; @@ -219,7 +223,8 @@ public class KVMHost extends HostBase implements Host { private String attachVolumePath; private String detachVolumePath; private String vmFstrimPath; - private String blockCommitVolumePath; + private String blockCommitPath; + private String blockPullPath; private String agentPackageName = KVMGlobalProperty.AGENT_PACKAGE_NAME; private String hostTakeOverFlagPath = KVMGlobalProperty.TAKEVOERFLAGPATH; @@ -443,7 +448,11 @@ public KVMHost(KVMHostVO self, KVMHostContext context) { ub = UriComponentsBuilder.fromHttpUrl(baseUrl); ub.path(KVMConstant.KVM_BLOCK_COMMIT_VOLUME_PATH); - blockCommitVolumePath = ub.build().toString(); + blockCommitPath = ub.build().toString(); + + ub = UriComponentsBuilder.fromHttpUrl(baseUrl); + ub.path(KVMConstant.KVM_BLOCK_PULL_VOLUME_PATH); + blockPullPath = ub.build().toString(); } static { @@ -687,8 +696,10 @@ protected void handleLocalMessage(Message msg) { handle((GetHostPowerStatusMsg) msg); } else if (msg instanceof FstrimVmMsg) { handle((FstrimVmMsg) msg); - } else if (msg instanceof CommitVolumeOnHypervisorMsg) { - handle((CommitVolumeOnHypervisorMsg) msg); + } else if (msg instanceof CommitVolumeSnapshotOnHypervisorMsg) { + handle((CommitVolumeSnapshotOnHypervisorMsg) msg); + } else if (msg instanceof PullVolumeSnapshotOnHypervisorMsg) { + handle((PullVolumeSnapshotOnHypervisorMsg) msg); } else if (msg instanceof TakeVmConsoleScreenshotMsg) { handle((TakeVmConsoleScreenshotMsg) msg); } else if (msg instanceof RestartKvmAgentMsg) { @@ -971,64 +982,27 @@ public void run(MessageReply reply) { }); } - private void handle(CommitVolumeOnHypervisorMsg msg) { - inQueue().name(String.format("block-commit-on-kvm-%s", self.getUuid())) + private void handle(CommitVolumeSnapshotOnHypervisorMsg msg) { + inQueue().name(String.format("commit-volume-snapshot-on-kvm-%s", self.getUuid())) .asyncBackup(msg) - .run(chain -> { - commitVolume(msg); - chain.next(); - }); - } - - private void commitVolume(final CommitVolumeOnHypervisorMsg msg) { - thdf.chainSubmit(new ChainTask(msg) { - @Override - public String getSyncSignature() { - return getName(); - } - - @Override - public void run(SyncTaskChain chain) { - doCommitVolume(msg, new NoErrorCompletion() { + .run(chain -> commitVolumeSnapshot(msg, new NoErrorCompletion(chain) { @Override public void done() { chain.next(); } - }); - } - - @Override - protected int getSyncLevel() { - return KVMGlobalConfig.HOST_SNAPSHOT_SYNC_LEVEL.value(Integer.class); - } - - @Override - public String getName() { - return String.format("block-commit-volume-on-kvm-%s", self.getUuid()); - } - }); + })); } - private void doCommitVolume(final CommitVolumeOnHypervisorMsg msg, final NoErrorCompletion completion) { + private void commitVolumeSnapshot(final CommitVolumeSnapshotOnHypervisorMsg msg, final NoErrorCompletion completion) { checkStateAndStatus(); - final CommitVolumeOnHypervisorReply reply = new CommitVolumeOnHypervisorReply(); - - BlockCommitVolumeCmd cmd = new BlockCommitVolumeCmd(); - if (msg.getVmUuid() != null) { - VmInstanceState state = Q.New(VmInstanceVO.class) - .eq(VmInstanceVO_.uuid, msg.getVmUuid()) - .select(VmInstanceVO_.state) - .findValue(); - if (state != VmInstanceState.Running && state != VmInstanceState.Stopped && state != VmInstanceState.Paused) { - throw new OperationFailureException(operr("vm[uuid:%s] is not Running or Stopped, current state[%s]", msg.getVmUuid(), state)); - } - } - - cmd.setVmUuid(msg.getVmUuid()); + CommitVolumeSnapshotOnHypervisorReply reply = new CommitVolumeSnapshotOnHypervisorReply(); + BlockCommitCmd cmd = new BlockCommitCmd(); + cmd.setVmUuid(msg.getVolume().getVmInstanceUuid()); cmd.setVolume(VolumeTO.valueOf(msg.getVolume(), (KVMHostInventory) getSelfInventory())); - cmd.setTop(msg.getSrcPath()); - cmd.setBase(msg.getDstPath()); + cmd.setTop(msg.getSrcSnapshot().getPrimaryStorageInstallPath()); + cmd.setBase(msg.getDstSnapshot().getPrimaryStorageInstallPath()); + cmd.setTopChildrenInstallPathInDb(msg.getSrcChildrenInstallPathInDb()); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setName(String.format("block-commit-for-volume-%s", msg.getVolume().getUuid())); @@ -1059,21 +1033,16 @@ public void fail(ErrorCode errorCode) { @Override public void run(FlowTrigger trigger, Map data) { - new Http<>(blockCommitVolumePath, cmd, BlockCommitVolumeResponse.class).call(new ReturnValueCompletion(msg, trigger) { + new Http<>(blockCommitPath, cmd, BlockCommitResponse.class).call(new ReturnValueCompletion(msg, completion) { @Override - public void success(BlockCommitVolumeResponse ret) { - if (ret.isSuccess()) { - if (Objects.equals(ret.getNewVolumeInstallPath(), cmd.getTop())) { - throw new OperationFailureException(operr("after block commit, new volume path still use %s", ret.getNewVolumeInstallPath())); - } - } else { + public void success(BlockCommitResponse ret) { + if (!ret.isSuccess()) { ErrorCode err = operr("operation error, because:%s", ret.getError()); extEmitter.failedToCommitVolume((KVMHostInventory) getSelfInventory(), msg, cmd, ret, err); trigger.fail(err); return; } - reply.setNewVolumeInstallPath(ret.getNewVolumeInstallPath()); reply.setSize(ret.getSize()); trigger.next(); } @@ -1127,6 +1096,118 @@ public void handle(ErrorCode errCode, Map data) { }).start(); } + private void handle(final PullVolumeSnapshotOnHypervisorMsg msg) { + inQueue().name(String.format("pull-volume-snapshot-on-kvm-%s", self.getUuid())) + .asyncBackup(msg) + .run(chain -> pullVolumeSnapshot(msg, new NoErrorCompletion(chain) { + @Override + public void done() { + chain.next(); + } + })); + } + + private void pullVolumeSnapshot(PullVolumeSnapshotOnHypervisorMsg msg, final NoErrorCompletion completion) { + checkStateAndStatus(); + + final PullVolumeSnapshotOnHypervisorReply reply = new PullVolumeSnapshotOnHypervisorReply(); + BlockPullCmd cmd = new BlockPullCmd(); + cmd.setBase(msg.getSrcSnapshotParentPath()); + cmd.setVmUuid(msg.getVolume().getVmInstanceUuid()); + cmd.setVolume(VolumeTO.valueOf(msg.getVolume(), (KVMHostInventory) getSelfInventory())); + + FlowChain chain = FlowChainBuilder.newShareFlowChain(); + chain.setName(String.format("block-pull-for-volume-%s", msg.getVolume().getUuid())); + chain.then(new ShareFlow() { + @Override + public void setup() { + flow(new NoRollbackFlow() { + String __name__ = String.format("before-block-pull-for-volume-%s", msg.getVolume().getUuid()); + + @Override + public void run(FlowTrigger trigger, Map data) { + extEmitter.beforePullVolume((KVMHostInventory) getSelfInventory(), msg, cmd, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + + flow(new NoRollbackFlow() { + String __name__ = String.format("do-block-pull-for-volume-%s", msg.getVolume().getUuid()); + + @Override + public void run(FlowTrigger trigger, Map data) { + new Http<>(blockPullPath, cmd, BlockPullResponse.class).call(new ReturnValueCompletion(msg, completion) { + @Override + public void success(BlockPullResponse ret) { + if (!ret.isSuccess()) { + ErrorCode err = operr("operation error, because:%s", ret.getError()); + extEmitter.failedToPullVolume((KVMHostInventory) getSelfInventory(), msg, cmd, ret, err); + trigger.fail(err); + return; + } + + reply.setSize(ret.getSize()); + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + extEmitter.failedToPullVolume((KVMHostInventory) getSelfInventory(), msg, cmd, null, errorCode); + reply.setError(errorCode); + trigger.fail(errorCode); + } + }); + } + }); + + flow(new NoRollbackFlow() { + String __name__ = String.format("after-block-pull-for-volume-%s", msg.getVolume().getUuid()); + + @Override + public void run(FlowTrigger trigger, Map data) { + extEmitter.afterPullVolume((KVMHostInventory) getSelfInventory(), msg, cmd, reply, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + + done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + bus.reply(msg, reply); + completion.done(); + } + }); + + error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + reply.setError(errCode); + bus.reply(msg, reply); + completion.done(); + } + }); + } + }).start(); + } + private void handle(GetHostPowerStatusMsg msg) { handleGetPowerStatusByIpmi(msg); } @@ -2201,6 +2282,10 @@ protected RunInQueue inQueue() { return new RunInQueue(id, thdf, getHostSyncLevel()); } + protected RunInQueue inQueue(int level) { + return new RunInQueue(id, thdf, level); + } + private void handle(final VmDirectlyDestroyOnHypervisorMsg msg) { inQueue().name(String.format("directly-delete-vm-%s-msg-on-kvm-%s", msg.getVmUuid(), self.getUuid())) .asyncBackup(msg) diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java index 7764e503a18..c7b39fc161a 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java @@ -849,8 +849,10 @@ public void handleLocalMessage(Message msg) { handle((GetVolumeBackingChainFromPrimaryStorageMsg) msg); } else if (msg instanceof GetPrimaryStorageUsageReportMsg) { handle((GetPrimaryStorageUsageReportMsg) msg); - } else if (msg instanceof UndoSnapshotCreationOnPrimaryStorageMsg) { - handle((UndoSnapshotCreationOnPrimaryStorageMsg) msg); + } else if (msg instanceof CommitVolumeSnapshotOnPrimaryStorageMsg) { + handle((CommitVolumeSnapshotOnPrimaryStorageMsg) msg); + } else if (msg instanceof PullVolumeSnapshotOnPrimaryStorageMsg) { + handle((PullVolumeSnapshotOnPrimaryStorageMsg) msg); } else { super.handleLocalMessage(msg); } @@ -952,6 +954,11 @@ public void fail(ErrorCode errorCode) { } private void handle(GetVolumeBackingChainFromPrimaryStorageMsg msg) { + String hostUuid; + if (msg.getHostUuid() == null) { + hostUuid = getHostUuidByResourceUuid(msg.getVolumeUuid()); + msg.setHostUuid(hostUuid); + } LocalStorageHypervisorFactory f = getHypervisorBackendFactoryByHostUuid(msg.getHostUuid()); LocalStorageHypervisorBackend bkd = f.getHypervisorBackend(self); bkd.handle(msg, new ReturnValueCompletion(msg) { @@ -1545,20 +1552,40 @@ public void fail(ErrorCode errorCode) { }); } - private void handle(final UndoSnapshotCreationOnPrimaryStorageMsg msg) { + private void handle(final CommitVolumeSnapshotOnPrimaryStorageMsg msg) { + final String hostUuid = getHostUuidByResourceUuid(msg.getVolume().getUuid()); + + LocalStorageHypervisorFactory f = getHypervisorBackendFactoryByHostUuid(hostUuid); + LocalStorageHypervisorBackend bkd = f.getHypervisorBackend(self); + bkd.handle(msg, hostUuid, new ReturnValueCompletion(msg) { + @Override + public void success(CommitVolumeSnapshotOnPrimaryStorageReply returnValue) { + bus.reply(msg, returnValue); + } + + @Override + public void fail(ErrorCode errorCode) { + CommitVolumeSnapshotOnPrimaryStorageReply reply = new CommitVolumeSnapshotOnPrimaryStorageReply(); + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } + + private void handle(final PullVolumeSnapshotOnPrimaryStorageMsg msg) { final String hostUuid = getHostUuidByResourceUuid(msg.getVolume().getUuid()); LocalStorageHypervisorFactory f = getHypervisorBackendFactoryByHostUuid(hostUuid); LocalStorageHypervisorBackend bkd = f.getHypervisorBackend(self); - bkd.handle(msg, hostUuid, new ReturnValueCompletion(msg) { + bkd.handle(msg, hostUuid, new ReturnValueCompletion(msg) { @Override - public void success(UndoSnapshotCreationOnPrimaryStorageReply returnValue) { + public void success(PullVolumeSnapshotOnPrimaryStorageReply returnValue) { bus.reply(msg, returnValue); } @Override public void fail(ErrorCode errorCode) { - UndoSnapshotCreationOnPrimaryStorageReply reply = new UndoSnapshotCreationOnPrimaryStorageReply(); + PullVolumeSnapshotOnPrimaryStorageReply reply = new PullVolumeSnapshotOnPrimaryStorageReply(); reply.setError(errorCode); bus.reply(msg, reply); } diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageHypervisorBackend.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageHypervisorBackend.java index bd1d3e5cd2b..7760e28de93 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageHypervisorBackend.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageHypervisorBackend.java @@ -118,5 +118,7 @@ public LocalStorageHypervisorBackend(PrimaryStorageVO self) { abstract void handle(GetVolumeSnapshotEncryptedOnPrimaryStorageMsg msg, ReturnValueCompletion completion); - abstract void handle(UndoSnapshotCreationOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion completion); + abstract void handle(CommitVolumeSnapshotOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion completion); + + abstract void handle(PullVolumeSnapshotOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion completion); } diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java index cc2bd2caf69..86d521b1a94 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java @@ -44,10 +44,7 @@ import org.zstack.header.rest.RESTFacade; import org.zstack.header.storage.backup.*; import org.zstack.header.storage.primary.*; -import org.zstack.header.storage.primary.UndoSnapshotCreationOnPrimaryStorageMsg; -import org.zstack.header.storage.snapshot.VolumeSnapshotConstant; -import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; -import org.zstack.header.storage.snapshot.VolumeSnapshotVO; +import org.zstack.header.storage.snapshot.*; import org.zstack.header.vm.VmInstanceSpec.ImageSpec; import org.zstack.header.vm.VmInstanceState; import org.zstack.header.vm.VmInstanceVO; @@ -729,6 +726,38 @@ public void setDestPath(String destPath) { } public static class OfflineMergeSnapshotRsp extends AgentResponse { + @GrayVersion(value = "5.4.0") + private long actualSize; + + public long getActualSize() { + return actualSize; + } + + public void setActualSize(long actualSize) { + this.actualSize = actualSize; + } + } + + public static class OfflineCommitSnapshotCmd extends AgentCommand implements HasThreadContext { + @GrayVersion(value = "5.4.0") + public String top; + @GrayVersion(value = "5.4.0") + public String base; + @GrayVersion(value = "5.4.0") + public List topChildrenInstallPathInDb = new ArrayList<>(); + } + + public static class OfflineCommitSnapshotRsp extends AgentResponse { + @GrayVersion(value = "5.4.0") + private long actualSize; + + public long getActualSize() { + return actualSize; + } + + public void setActualSize(long actualSize) { + this.actualSize = actualSize; + } } public static class CheckBitsCmd extends AgentCommand { @@ -978,6 +1007,7 @@ public void setHashValue(String hashValue) { public static final String REINIT_IMAGE_PATH = "/localstorage/reinit/image"; public static final String MERGE_SNAPSHOT_PATH = "/localstorage/snapshot/merge"; public static final String OFFLINE_MERGE_PATH = "/localstorage/snapshot/offlinemerge"; + public static final String OFFLINE_COMMIT_PATH = "/localstorage/snapshot/offlinecommit"; public static final String GET_MD5_PATH = "/localstorage/getmd5"; public static final String CHECK_MD5_PATH = "/localstorage/checkmd5"; public static final String GET_BACKING_FILE_PATH = "/localstorage/volume/getbackingfile"; @@ -2109,32 +2139,6 @@ public void run(MessageReply reply) { }); } - @Override - void handle(final UndoSnapshotCreationOnPrimaryStorageMsg msg, final String hostUuid, final ReturnValueCompletion completion) { - CommitVolumeOnHypervisorMsg hmsg = new CommitVolumeOnHypervisorMsg(); - hmsg.setHostUuid(hostUuid); - hmsg.setVmUuid(msg.getVmUuid()); - hmsg.setVolume(msg.getVolume()); - hmsg.setSrcPath(msg.getSrcPath()); - hmsg.setDstPath(msg.getDstPath()); - bus.makeTargetServiceIdByResourceUuid(hmsg, HostConstant.SERVICE_ID, hostUuid); - bus.send(hmsg, new CloudBusCallBack(completion) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - completion.fail(reply.getError()); - return; - } - - UndoSnapshotCreationOnPrimaryStorageReply ret = new UndoSnapshotCreationOnPrimaryStorageReply(); - CommitVolumeOnHypervisorReply treply = (CommitVolumeOnHypervisorReply) reply; - ret.setSize(treply.getSize()); - ret.setNewVolumeInstallPath(treply.getNewVolumeInstallPath()); - completion.success(ret); - } - }); - } - @Override void handle(final DeleteSnapshotOnPrimaryStorageMsg msg, final String hostUuid, final ReturnValueCompletion completion) { final DeleteSnapshotOnPrimaryStorageReply reply = new DeleteSnapshotOnPrimaryStorageReply(); @@ -3864,4 +3868,47 @@ public void fail(ErrorCode errorCode) { private String makeInitializedFilePath() { return String.format("%s/%s-initialized-file", self.getMountPath(), self.getUuid()); } + + @Override + void handle(CommitVolumeSnapshotOnPrimaryStorageMsg msg, String hostUuid, final ReturnValueCompletion completion) { + CommitVolumeSnapshotOnPrimaryStorageReply reply = new CommitVolumeSnapshotOnPrimaryStorageReply(); + OfflineCommitSnapshotCmd cmd = new OfflineCommitSnapshotCmd(); + cmd.top = msg.getSrcSnapshot().getPrimaryStorageInstallPath(); + cmd.base = msg.getDstSnapshot().getPrimaryStorageInstallPath(); + cmd.topChildrenInstallPathInDb = msg.getSrcChildrenInstallPathInDb(); + httpCall(OFFLINE_COMMIT_PATH, hostUuid, cmd, OfflineCommitSnapshotRsp.class, new ReturnValueCompletion(completion) { + @Override + public void success(OfflineCommitSnapshotRsp returnValue) { + reply.setSize(returnValue.getActualSize()); + completion.success(reply); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + @Override + void handle(PullVolumeSnapshotOnPrimaryStorageMsg msg, String hostUuid, final ReturnValueCompletion completion) { + PullVolumeSnapshotOnPrimaryStorageReply reply = new PullVolumeSnapshotOnPrimaryStorageReply(); + + OfflineMergeSnapshotCmd cmd = new OfflineMergeSnapshotCmd(); + cmd.srcPath = msg.getSrcSnapshotParentPath(); + cmd.destPath = msg.getDstSnapshot().getPrimaryStorageInstallPath(); + cmd.fullRebase = StringUtils.isEmpty(cmd.srcPath); + httpCall(OFFLINE_MERGE_PATH, hostUuid, cmd, OfflineMergeSnapshotRsp.class, new ReturnValueCompletion(completion) { + @Override + public void success(OfflineMergeSnapshotRsp rsp) { + reply.setSize(rsp.getActualSize()); + completion.success(reply); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } } diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java index 6bbf9d40a14..11e888024fb 100755 --- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java +++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java @@ -37,6 +37,7 @@ import org.zstack.header.storage.backup.BackupStorageVO; import org.zstack.header.storage.primary.*; import org.zstack.header.storage.primary.VolumeSnapshotCapability.VolumeSnapshotArrangementType; +import org.zstack.header.storage.snapshot.DeleteVolumeSnapshotDirection; import org.zstack.header.storage.snapshot.ShrinkVolumeSnapshotOnPrimaryStorageMsg; import org.zstack.header.storage.snapshot.VolumeSnapshotConstant; import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; @@ -45,7 +46,7 @@ import org.zstack.header.vm.VmInstanceVO; import org.zstack.header.vm.VmInstanceVO_; import org.zstack.header.volume.*; -import org.zstack.kvm.KVMConstant; +import org.zstack.kvm.*; import org.zstack.storage.primary.*; import org.zstack.storage.snapshot.reference.VolumeSnapshotReferenceUtils; import org.zstack.storage.volume.VolumeErrors; @@ -60,9 +61,7 @@ import javax.persistence.Tuple; import javax.persistence.TypedQuery; import java.io.File; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -129,69 +128,15 @@ protected void handleLocalMessage(Message msg) { handle((GetDownloadBitsFromKVMHostProgressMsg) msg); } else if (msg instanceof GetVolumeBackingChainFromPrimaryStorageMsg) { handle((GetVolumeBackingChainFromPrimaryStorageMsg) msg); - } else if (msg instanceof UndoSnapshotCreationOnPrimaryStorageMsg) { - handle((UndoSnapshotCreationOnPrimaryStorageMsg) msg); + } else if (msg instanceof CommitVolumeSnapshotOnPrimaryStorageMsg) { + handle((CommitVolumeSnapshotOnPrimaryStorageMsg) msg); + } else if (msg instanceof PullVolumeSnapshotOnPrimaryStorageMsg) { + handle((PullVolumeSnapshotOnPrimaryStorageMsg) msg); } else { super.handleLocalMessage(msg); } } - private void handle(final UndoSnapshotCreationOnPrimaryStorageMsg msg) { - final TakeSnapshotReply reply = new TakeSnapshotReply(); - - String volumeUuid = msg.getVolume().getUuid(); - VolumeVO vol = dbf.findByUuid(volumeUuid, VolumeVO.class); - - String huuid; - String connectedHostUuid = factory.getConnectedHostForOperation(getSelfInventory()).get(0).getUuid(); - if (vol.getVmInstanceUuid() != null) { - Tuple t = Q.New(VmInstanceVO.class) - .select(VmInstanceVO_.state, VmInstanceVO_.hostUuid) - .eq(VmInstanceVO_.uuid, vol.getVmInstanceUuid()) - .findTuple(); - VmInstanceState state = t.get(0, VmInstanceState.class); - String vmHostUuid = t.get(1, String.class); - - if (state == VmInstanceState.Running || state == VmInstanceState.Paused) { - DebugUtils.Assert(vmHostUuid != null, - String.format("vm[uuid:%s] is Running or Paused, but has no hostUuid", vol.getVmInstanceUuid())); - huuid = vmHostUuid; - } else if (state == VmInstanceState.Stopped) { - huuid = connectedHostUuid; - } else { - reply.setError(operr("vm[uuid:%s] is not Running, Paused or Stopped, current state is %s", - vol.getVmInstanceUuid(), state)); - bus.reply(msg, reply); - return; - } - } else { - huuid = connectedHostUuid; - } - CommitVolumeOnHypervisorMsg hmsg = new CommitVolumeOnHypervisorMsg(); - hmsg.setHostUuid(huuid); - hmsg.setVmUuid(msg.getVmUuid()); - hmsg.setVolume(msg.getVolume()); - hmsg.setSrcPath(msg.getSrcPath()); - hmsg.setDstPath(msg.getDstPath()); - bus.makeTargetServiceIdByResourceUuid(hmsg, HostConstant.SERVICE_ID, huuid); - bus.send(hmsg, new CloudBusCallBack(msg) { - @Override - public void run(MessageReply reply) { - UndoSnapshotCreationOnPrimaryStorageReply ret = new UndoSnapshotCreationOnPrimaryStorageReply(); - if (!reply.isSuccess()) { - ret.setError(reply.getError()); - bus.reply(msg, ret); - return; - } - - CommitVolumeOnHypervisorReply treply = (CommitVolumeOnHypervisorReply) reply; - ret.setSize(treply.getSize()); - ret.setNewVolumeInstallPath(treply.getNewVolumeInstallPath()); - bus.reply(msg, ret); - } - }); - } - protected void updateMountPoint(String newUrl, Completion completion) { String oldUrl = self.getUrl(); @@ -1937,4 +1882,89 @@ public void fail(ErrorCode errorCode) { } }); } + + protected void handle(CommitVolumeSnapshotOnPrimaryStorageMsg msg) { + CommitVolumeSnapshotOnPrimaryStorageReply reply = new CommitVolumeSnapshotOnPrimaryStorageReply(); + + String hostUuid = getHostUuidFromVolume(msg.getVolume().getUuid()); + if (hostUuid == null || hostUuid.isEmpty()) { + reply.setError(operr("no host found for volume[uuid:%s]", msg.getVolume().getUuid())); + bus.reply(msg, reply); + return; + } + + final NfsPrimaryStorageBackend backend = getBackend(nfsMgr.findHypervisorTypeByImageFormatAndPrimaryStorageUuid( + msg.getVolume().getFormat(), self.getUuid())); + + backend.commitSnapshot(msg, hostUuid, new ReturnValueCompletion(msg) { + @Override + public void success(CommitVolumeSnapshotOnPrimaryStorageReply r) { + bus.reply(msg, r); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } + + protected void handle(PullVolumeSnapshotOnPrimaryStorageMsg msg) { + PullVolumeSnapshotOnPrimaryStorageReply reply = new PullVolumeSnapshotOnPrimaryStorageReply(); + + String hostUuid = getHostUuidFromVolume(msg.getVolume().getUuid()); + if (hostUuid == null || hostUuid.isEmpty()) { + reply.setError(operr("no host found for volume[uuid:%s]", msg.getVolume().getUuid())); + bus.reply(msg, reply); + return; + } + + final NfsPrimaryStorageBackend backend = getBackend(nfsMgr.findHypervisorTypeByImageFormatAndPrimaryStorageUuid( + msg.getVolume().getFormat(), self.getUuid())); + + backend.pullSnapshot(msg, hostUuid, new ReturnValueCompletion(msg) { + @Override + public void success(PullVolumeSnapshotOnPrimaryStorageReply r) { + bus.reply(msg, r); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } + + private String getHostUuidFromVolume(String volumeUuid) { + VolumeVO vol = dbf.findByUuid(volumeUuid, VolumeVO.class); + + String hostUuid = ""; + List connectedHost = factory.getConnectedHostForOperation(getSelfInventory()); + if (connectedHost.isEmpty()) { + return hostUuid; + } + String connectedHostUuid = factory.getConnectedHostForOperation(getSelfInventory()).get(0).getUuid(); + if (vol.getVmInstanceUuid() != null) { + Tuple t = Q.New(VmInstanceVO.class) + .select(VmInstanceVO_.state, VmInstanceVO_.hostUuid) + .eq(VmInstanceVO_.uuid, vol.getVmInstanceUuid()) + .findTuple(); + VmInstanceState state = t.get(0, VmInstanceState.class); + String vmHostUuid = t.get(1, String.class); + + if (state == VmInstanceState.Running || state == VmInstanceState.Paused) { + DebugUtils.Assert(vmHostUuid != null, + String.format("vm[uuid:%s] is Running or Paused, but has no hostUuid", vol.getVmInstanceUuid())); + hostUuid = vmHostUuid; + } else if (state == VmInstanceState.Stopped) { + hostUuid = connectedHostUuid; + } + } else { + hostUuid = connectedHostUuid; + } + + return hostUuid; + } } diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageBackend.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageBackend.java index e7904c92620..6c26e682ce6 100755 --- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageBackend.java +++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageBackend.java @@ -87,8 +87,11 @@ public interface NfsPrimaryStorageBackend { void remount(PrimaryStorageInventory pinv, String clusterUuid, NfsPrimaryStorage.NfsConnectParam param, Completion completion); - void updateMountPoint(PrimaryStorageInventory pinv, String clusterUuid, String oldMountPoint, String newMountPoint, Completion completion); + void pullSnapshot(PullVolumeSnapshotOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion completion); + + void commitSnapshot(CommitVolumeSnapshotOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion completion); + void updateMountPoint(PrimaryStorageInventory pinv, String clusterUuid, String oldMountPoint, String newMountPoint, Completion completion); class BitsInfo { private String installPath; diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackend.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackend.java index f8beca29741..5ad1919dd0f 100755 --- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackend.java +++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackend.java @@ -23,9 +23,7 @@ import org.zstack.core.trash.StorageTrash; import org.zstack.core.upgrade.UpgradeChecker; import org.zstack.header.core.*; -import org.zstack.header.core.workflow.Flow; -import org.zstack.header.core.workflow.FlowTrigger; -import org.zstack.header.core.workflow.NoRollbackFlow; +import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.errorcode.OperationFailureException; @@ -118,6 +116,7 @@ public class NfsPrimaryStorageKVMBackend implements NfsPrimaryStorageBackend, public static final String ESTIMATE_TEMPLATE_SIZE_PATH = "/nfsprimarystorage/estimatetemplatesize"; public static final String CREATE_VOLUME_WITH_BACKING_PATH = "/nfsprimarystorage/createvolumewithbacking"; public static final String OFFLINE_SNAPSHOT_MERGE = "/nfsprimarystorage/offlinesnapshotmerge"; + public static final String OFFLINE_SNAPSHOT_COMMIT = "/nfsprimarystorage/offlinesnapshotcommit"; public static final String REMOUNT_PATH = "/nfsprimarystorage/remount"; public static final String GET_VOLUME_SIZE_PATH = "/nfsprimarystorage/getvolumesize"; public static final String BATCH_GET_VOLUME_SIZE_PATH = "/nfsprimarystorage/batchgetvolumesize"; @@ -2009,4 +2008,73 @@ public void fail(ErrorCode errorCode) { } }); } + + @Override + public void pullSnapshot(PullVolumeSnapshotOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion completion) { + PullVolumeSnapshotOnPrimaryStorageReply reply = new PullVolumeSnapshotOnPrimaryStorageReply(); + + OfflineMergeSnapshotCmd cmd = new OfflineMergeSnapshotCmd(); + cmd.setSrcPath(msg.getSrcSnapshotParentPath()); + cmd.setDestPath(msg.getDstSnapshot().getPrimaryStorageInstallPath()); + cmd.setUuid(msg.getVolume().getPrimaryStorageUuid()); + cmd.setFullRebase(cmd.getSrcPath() == null); + + KVMHostAsyncHttpCallMsg kmsg = new KVMHostAsyncHttpCallMsg(); + kmsg.setCommand(cmd); + kmsg.setPath(OFFLINE_SNAPSHOT_MERGE); + kmsg.setHostUuid(hostUuid); + bus.makeTargetServiceIdByResourceUuid(kmsg, HostConstant.SERVICE_ID, hostUuid); + bus.send(kmsg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply r) { + if (!r.isSuccess()) { + completion.fail(r.getError()); + return; + } + + OfflineMergeSnapshotRsp rsp = ((KVMHostAsyncHttpCallReply) r).toResponse(OfflineMergeSnapshotRsp.class); + if (!rsp.isSuccess()) { + completion.fail(operr("operation error, because:%s", rsp.getError())); + return; + } + + reply.setSize(rsp.getActualSize()); + completion.success(reply); + } + }); + } + + @Override + public void commitSnapshot(CommitVolumeSnapshotOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion completion) { + OfflineCommitSnapshotCmd cmd = new OfflineCommitSnapshotCmd(); + cmd.top = msg.getSrcSnapshot().getPrimaryStorageInstallPath(); + cmd.base = msg.getDstSnapshot().getPrimaryStorageInstallPath(); + cmd.topChildrenInstallPathInDb = msg.getSrcChildrenInstallPathInDb(); + cmd.setUuid(msg.getVolume().getPrimaryStorageUuid()); + + KVMHostAsyncHttpCallMsg kmsg = new KVMHostAsyncHttpCallMsg(); + kmsg.setCommand(cmd); + kmsg.setPath(OFFLINE_SNAPSHOT_COMMIT); + kmsg.setHostUuid(hostUuid); + bus.makeTargetServiceIdByResourceUuid(kmsg, HostConstant.SERVICE_ID, hostUuid); + bus.send(kmsg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply r) { + if (!r.isSuccess()) { + completion.fail(r.getError()); + return; + } + + OfflineCommitSnapshotRsp rsp = ((KVMHostAsyncHttpCallReply) r).toResponse(OfflineCommitSnapshotRsp.class); + if (!rsp.isSuccess()) { + completion.fail(operr("operation error, because:%s", rsp.getError())); + return; + } + + CommitVolumeSnapshotOnPrimaryStorageReply reply = new CommitVolumeSnapshotOnPrimaryStorageReply(); + reply.setSize(rsp.getActualSize()); + completion.success(reply); + } + }); + } } diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackendCommands.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackendCommands.java index 5297a10d1ef..1a31b5b6b7e 100755 --- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackendCommands.java +++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackendCommands.java @@ -7,6 +7,7 @@ import org.zstack.kvm.KVMAgentCommands.AgentCommand; import org.zstack.kvm.KVMAgentCommands.AgentResponse; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -883,6 +884,38 @@ public void setDestPath(String destPath) { } public static class OfflineMergeSnapshotRsp extends NfsPrimaryStorageAgentResponse { + @GrayVersion(value = "5.4.0") + private long actualSize; + + public long getActualSize() { + return actualSize; + } + + public void setActualSize(long actualSize) { + this.actualSize = actualSize; + } + } + + public static class OfflineCommitSnapshotCmd extends NfsPrimaryStorageAgentCommand implements HasThreadContext { + @GrayVersion(value = "5.4.0") + public String top; + @GrayVersion(value = "5.4.0") + public String base; + @GrayVersion(value = "5.4.0") + public List topChildrenInstallPathInDb = new ArrayList<>(); + } + + public static class OfflineCommitSnapshotRsp extends NfsPrimaryStorageAgentResponse { + @GrayVersion(value = "5.4.0") + private Long actualSize; + + public Long getActualSize() { + return actualSize; + } + + public void setActualSize(Long actualSize) { + this.actualSize = actualSize; + } } public static class RemountCmd extends NfsPrimaryStorageAgentCommand { diff --git a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/HypervisorBackend.java b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/HypervisorBackend.java index b914d291026..c78d3b89172 100755 --- a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/HypervisorBackend.java +++ b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/HypervisorBackend.java @@ -97,7 +97,9 @@ public HypervisorBackend(PrimaryStorageVO self) { abstract void handle(ResizeVolumeOnPrimaryStorageMsg msg, ReturnValueCompletion returnValueCompletion); - abstract void handle(UndoSnapshotCreationOnPrimaryStorageMsg msg, ReturnValueCompletion completion); + abstract void handle(CommitVolumeSnapshotOnPrimaryStorageMsg msg, ReturnValueCompletion completion); + + abstract void handle(PullVolumeSnapshotOnPrimaryStorageMsg msg, ReturnValueCompletion completion); abstract void createEmptyVolumeWithBackingFile(final VolumeInventory volume, String hostUuid, String backingFile, final ReturnValueCompletion completion); } diff --git a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/KvmBackend.java b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/KvmBackend.java index c640a0040c7..1a0351c76af 100755 --- a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/KvmBackend.java +++ b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/KvmBackend.java @@ -43,7 +43,10 @@ import org.zstack.header.vm.VmInstanceState; import org.zstack.header.vm.VmInstanceVO; import org.zstack.header.vm.VmInstanceVO_; -import org.zstack.header.volume.*; +import org.zstack.header.volume.VolumeConstant; +import org.zstack.header.volume.VolumeInventory; +import org.zstack.header.volume.VolumeType; +import org.zstack.header.volume.VolumeVO; import org.zstack.kvm.*; import org.zstack.storage.primary.*; import org.zstack.storage.volume.VolumeErrors; @@ -58,7 +61,6 @@ import javax.persistence.Tuple; import java.io.File; import java.util.*; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static org.zstack.core.Platform.argerr; @@ -333,6 +335,41 @@ public static class OfflineMergeSnapshotCmd extends AgentCmd implements HasThrea public boolean fullRebase; } + public static class OfflineMergeSnapshotRsp extends AgentRsp { + @GrayVersion(value = "5.4.0") + private long actualSize; + + public long getActualSize() { + return actualSize; + } + + public void setActualSize(long actualSize) { + this.actualSize = actualSize; + } + } + + public static class OfflineCommitSnapshotCmd extends AgentCmd implements HasThreadContext { + @GrayVersion(value = "5.4.0") + public String top; + @GrayVersion(value = "5.4.0") + public String base; + @GrayVersion(value = "5.4.0") + public List topChildrenInstallPathInDb = new ArrayList<>(); + } + + public static class OfflineCommitSnapshotRsp extends AgentRsp { + @GrayVersion(value = "5.4.0") + private long actualSize; + + public long getActualSize() { + return actualSize; + } + + public void setActualSize(long actualSize) { + this.actualSize = actualSize; + } + } + public static class CreateEmptyVolumeCmd extends AgentCmd { @GrayVersion(value = "5.0.0") public String installPath; @@ -470,6 +507,7 @@ public static class GetBackingChainRsp extends AgentRsp { public static final String REINIT_IMAGE_PATH = "/sharedmountpointprimarystorage/volume/reinitimage"; public static final String MERGE_SNAPSHOT_PATH = "/sharedmountpointprimarystorage/snapshot/merge"; public static final String OFFLINE_MERGE_SNAPSHOT_PATH = "/sharedmountpointprimarystorage/snapshot/offlinemerge"; + public static final String OFFLINE_COMMIT_SNAPSHOT_PATH = "/sharedmountpointprimarystorage/snapshot/offlinecommit"; public static final String CREATE_EMPTY_VOLUME_PATH = "/sharedmountpointprimarystorage/volume/createempty"; public static final String CREATE_FOLDER_PATH = "/sharedmountpointprimarystorage/volume/createfolder"; public static final String CHECK_BITS_PATH = "/sharedmountpointprimarystorage/bits/check"; @@ -1863,58 +1901,6 @@ public void fail(ErrorCode errorCode) { }); } - @Override - void handle(UndoSnapshotCreationOnPrimaryStorageMsg msg, ReturnValueCompletion completion) { - VolumeInventory vol = msg.getVolume(); - String hostUuid; - String connectedHostUuid = primaryStorageFactory.getConnectedHostForOperation(getSelfInventory()).get(0).getUuid(); - if (vol.getVmInstanceUuid() != null){ - Tuple t = Q.New(VmInstanceVO.class) - .select(VmInstanceVO_.state, VmInstanceVO_.hostUuid) - .eq(VmInstanceVO_.uuid, vol.getVmInstanceUuid()) - .findTuple(); - VmInstanceState state = t.get(0, VmInstanceState.class); - String vmHostUuid = t.get(1, String.class); - - if (state == VmInstanceState.Running || state == VmInstanceState.Paused){ - DebugUtils.Assert(vmHostUuid != null, - String.format("vm[uuid:%s] is Running or Paused, but has no hostUuid", vol.getVmInstanceUuid())); - hostUuid = vmHostUuid; - } else if (state == VmInstanceState.Stopped){ - hostUuid = connectedHostUuid; - } else { - completion.fail(operr("vm[uuid:%s] is not Running, Paused or Stopped, current state[%s]", - vol.getVmInstanceUuid(), state)); - return; - } - } else { - hostUuid = connectedHostUuid; - } - - CommitVolumeOnHypervisorMsg hmsg = new CommitVolumeOnHypervisorMsg(); - hmsg.setHostUuid(hostUuid); - hmsg.setVmUuid(msg.getVmUuid()); - hmsg.setVolume(msg.getVolume()); - hmsg.setSrcPath(msg.getSrcPath()); - hmsg.setDstPath(msg.getDstPath()); - bus.makeTargetServiceIdByResourceUuid(hmsg, HostConstant.SERVICE_ID, hostUuid); - bus.send(hmsg, new CloudBusCallBack(msg) { - @Override - public void run(MessageReply reply) { - UndoSnapshotCreationOnPrimaryStorageReply ret = new UndoSnapshotCreationOnPrimaryStorageReply(); - if (!reply.isSuccess()) { - completion.fail(reply.getError()); - return; - } - - CommitVolumeOnHypervisorReply treply = (CommitVolumeOnHypervisorReply) reply; - ret.setSize(treply.getSize()); - ret.setNewVolumeInstallPath(treply.getNewVolumeInstallPath()); - completion.success(ret); - } - }); - } - @Override void deleteBits(String path, final Completion completion) { deleteBits(path, false, completion); @@ -2555,4 +2541,49 @@ public void fail(ErrorCode errorCode) { } }); } + + @Override + void handle(CommitVolumeSnapshotOnPrimaryStorageMsg msg, final ReturnValueCompletion completion) { + OfflineCommitSnapshotCmd cmd = new OfflineCommitSnapshotCmd(); + cmd.top = msg.getSrcSnapshot().getPrimaryStorageInstallPath(); + cmd.base = msg.getDstSnapshot().getPrimaryStorageInstallPath(); + cmd.topChildrenInstallPathInDb = msg.getSrcChildrenInstallPathInDb(); + new Do().go(OFFLINE_COMMIT_SNAPSHOT_PATH, cmd, OfflineCommitSnapshotRsp.class, new ReturnValueCompletion(completion) { + @Override + public void success(AgentRsp returnValue) { + OfflineCommitSnapshotRsp rsp = (OfflineCommitSnapshotRsp) returnValue; + + CommitVolumeSnapshotOnPrimaryStorageReply reply = new CommitVolumeSnapshotOnPrimaryStorageReply(); + reply.setSize(rsp.getActualSize()); + completion.success(reply); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + @Override + void handle(PullVolumeSnapshotOnPrimaryStorageMsg msg, final ReturnValueCompletion completion) { + PullVolumeSnapshotOnPrimaryStorageReply reply = new PullVolumeSnapshotOnPrimaryStorageReply(); + OfflineMergeSnapshotCmd cmd = new OfflineMergeSnapshotCmd(); + cmd.srcPath = msg.getSrcSnapshotParentPath(); + cmd.destPath = msg.getDstSnapshot().getPrimaryStorageInstallPath(); + cmd.fullRebase = cmd.srcPath == null; + new Do().go(OFFLINE_MERGE_SNAPSHOT_PATH, cmd, OfflineMergeSnapshotRsp.class, new ReturnValueCompletion(completion) { + @Override + public void success(AgentRsp returnValue) { + OfflineMergeSnapshotRsp rsp = (OfflineMergeSnapshotRsp) returnValue; + reply.setSize(rsp.getActualSize()); + completion.success(reply); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } } diff --git a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageBase.java b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageBase.java index 62237d6243f..a554238854c 100755 --- a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageBase.java +++ b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageBase.java @@ -660,8 +660,10 @@ public void handleLocalMessage(Message msg) { handle((GetVolumeBackingChainFromPrimaryStorageMsg) msg); } else if (msg instanceof ResizeVolumeOnPrimaryStorageMsg) { handle((ResizeVolumeOnPrimaryStorageMsg) msg); - } else if (msg instanceof UndoSnapshotCreationOnPrimaryStorageMsg) { - handle((UndoSnapshotCreationOnPrimaryStorageMsg) msg); + } else if (msg instanceof CommitVolumeSnapshotOnPrimaryStorageMsg) { + handle((CommitVolumeSnapshotOnPrimaryStorageMsg) msg); + } else if (msg instanceof PullVolumeSnapshotOnPrimaryStorageMsg) { + handle((PullVolumeSnapshotOnPrimaryStorageMsg) msg); } else { super.handleLocalMessage(msg); } @@ -722,8 +724,14 @@ public void fail(ErrorCode errorCode) { } private void handle(GetVolumeBackingChainFromPrimaryStorageMsg msg) { - HypervisorFactory f = getHypervisorFactoryByHostUuid(msg.getHostUuid()); - HypervisorBackend bkd = f.getHypervisorBackend(self); + HypervisorBackend bkd; + if (msg.getHostUuid() == null) { + bkd = getHypervisorBackendByVolumeUuid(msg.getVolumeUuid()); + } else { + HypervisorFactory f = getHypervisorFactoryByHostUuid(msg.getHostUuid()); + bkd = f.getHypervisorBackend(self); + } + bkd.handle(msg, new ReturnValueCompletion(msg) { public void success(GetVolumeBackingChainFromPrimaryStorageReply returnValue) { bus.reply(msg, returnValue); @@ -1049,23 +1057,6 @@ public void fail(ErrorCode errorCode) { }); } - private void handle(final UndoSnapshotCreationOnPrimaryStorageMsg msg) { - HypervisorBackend bkd = getHypervisorBackendByVolumeUuid(msg.getVolume().getUuid()); - bkd.handle(msg, new ReturnValueCompletion(msg) { - @Override - public void success(UndoSnapshotCreationOnPrimaryStorageReply returnValue) { - bus.reply(msg, returnValue); - } - - @Override - public void fail(ErrorCode errorCode) { - UndoSnapshotCreationOnPrimaryStorageReply reply = new UndoSnapshotCreationOnPrimaryStorageReply(); - reply.setError(errorCode); - bus.reply(msg, reply); - } - }); - } - @Transactional(readOnly = true) protected String getAvailableHostUuidForOperation() { String sql = "select host.uuid from PrimaryStorageClusterRefVO ref, HostVO host where" + @@ -1223,6 +1214,39 @@ public void fail(ErrorCode errorCode) { }); } + private void handle(final CommitVolumeSnapshotOnPrimaryStorageMsg msg) { + HypervisorBackend bkd = getHypervisorBackendByVolumeUuid(msg.getVolume().getUuid()); + bkd.handle(msg, new ReturnValueCompletion(msg) { + @Override + public void success(CommitVolumeSnapshotOnPrimaryStorageReply reply) { + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + CommitVolumeSnapshotOnPrimaryStorageReply reply = new CommitVolumeSnapshotOnPrimaryStorageReply(); + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } + + private void handle(final PullVolumeSnapshotOnPrimaryStorageMsg msg) { + HypervisorBackend bkd = getHypervisorBackendByVolumeUuid(msg.getVolume().getUuid()); + bkd.handle(msg, new ReturnValueCompletion(msg) { + @Override + public void success(PullVolumeSnapshotOnPrimaryStorageReply reply) { + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + PullVolumeSnapshotOnPrimaryStorageReply reply = new PullVolumeSnapshotOnPrimaryStorageReply(); + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } private boolean isSharedMountPointPrimaryStorage(String psUuid) { return psUuid != null && Q.New(PrimaryStorageVO.class) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java index 24f25d28ae5..43c95e77e70 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java @@ -80,7 +80,7 @@ public void volumeSnapshotAfterDeleteExtensionPoint(VolumeSnapshotInventory snap } private boolean isCbdProtocol(String volumeUuid) { - return VolumeProtocol.CBD.toString().equals(Q.New(VolumeVO.class).select(VolumeVO_.protocol).eq(VolumeVO_.uuid, volumeUuid).find()); + return Q.New(VolumeVO.class).eq(VolumeVO_.protocol, VolumeProtocol.CBD.toString()).eq(VolumeVO_.uuid, volumeUuid).isExists(); } @Override diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotAction.java index 4d2808cf2e0..f582c762165 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotAction.java @@ -28,6 +28,12 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; + @Param(required = false, validValues = {"pull","commit","auto"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String direction = "auto"; + + @Param(required = false, validValues = {"single","chain","auto"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String scope = "chain"; + @Param(required = false) public java.lang.String deleteMode = "Permissive"; diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotGroupAction.java index 9d76314eef5..e4a183f38b0 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotGroupAction.java @@ -28,6 +28,12 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; + @Param(required = false, validValues = {"pull","commit","auto"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String direction = "auto"; + + @Param(required = false, validValues = {"single","chain","auto"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String scope = "chain"; + @Param(required = false) public java.lang.String deleteMode = "Permissive"; diff --git a/storage/src/main/java/org/zstack/storage/snapshot/DeleteVolumeSnapshotLongJob.java b/storage/src/main/java/org/zstack/storage/snapshot/DeleteVolumeSnapshotLongJob.java index 6bc15670a42..1b7864807d5 100644 --- a/storage/src/main/java/org/zstack/storage/snapshot/DeleteVolumeSnapshotLongJob.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/DeleteVolumeSnapshotLongJob.java @@ -42,6 +42,8 @@ public void start(LongJobVO job, ReturnValueCompletion completion) { msg.setVolumeUuid(apiMessage.getSnapshotUuid()); msg.setSnapshotUuid(apiMessage.getSnapshotUuid()); msg.setDeletionMode(apiMessage.getDeletionMode()); + msg.setDirection(apiMessage.getDirection()); + msg.setScope(apiMessage.getScope()); bus.makeTargetServiceIdByResourceUuid(msg, VolumeSnapshotConstant.SERVICE_ID, getRoutedMnId(apiMessage)); bus.send(msg, new CloudBusCallBack(completion) { @Override diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotCascadeExtension.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotCascadeExtension.java index 2c5def975d0..9128094ffdf 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotCascadeExtension.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotCascadeExtension.java @@ -68,7 +68,8 @@ public void asyncCascade(CascadeAction action, Completion completion) { private void handleDeletionCleanup(CascadeAction action, Completion completion) { try { if (VolumeSnapshotVO.class.getSimpleName().equals(action.getParentIssuer())) { - List sinvs = action.getParentIssuerContext(); + VolumeSnapshotDeletionStructs structs = action.getParentIssuerContext(); + List sinvs = structs.getSnapshotInventories(); sinvs.forEach(s -> dbf.eoCleanup(VolumeSnapshotVO.class, s.getUuid())); } else { dbf.eoCleanup(VolumeSnapshotVO.class); @@ -83,7 +84,7 @@ private void handleDeletionCleanup(CascadeAction action, Completion completion) } } - private static VolumeSnapshotDeletionMsg buildMsg(final String suuid, boolean volumeDeletion) { + private static VolumeSnapshotDeletionMsg buildMsg(final String suuid, String direction, String scope, boolean volumeDeletion) { Tuple t = Q.New(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.uuid, suuid) .select(VolumeSnapshotVO_.volumeUuid, VolumeSnapshotVO_.treeUuid) .findTuple(); @@ -96,11 +97,13 @@ private static VolumeSnapshotDeletionMsg buildMsg(final String suuid, boolean vo msg.setTreeUuid(treeUuid); msg.setVolumeUuid(volumeUuid); msg.setVolumeDeletion(volumeDeletion); + msg.setDirection(direction); + msg.setScope(scope); return msg; } - private VolumeSnapshotDeletionMsg makeMsg(final String suuid, boolean volumeDeletion) { - VolumeSnapshotDeletionMsg msg = buildMsg(suuid, volumeDeletion); + private VolumeSnapshotDeletionMsg makeMsg(final String suuid, String direction, String scope, boolean volumeDeletion) { + VolumeSnapshotDeletionMsg msg = buildMsg(suuid, direction, scope, volumeDeletion); setTargetServiceId(msg); return msg; } @@ -118,9 +121,11 @@ private void handleDeletion(final CascadeAction action, final Completion complet msgs.addAll(handleVolumeDeletion(vol)); } } else if (VolumeSnapshotVO.class.getSimpleName().equals(action.getParentIssuer())) { - List sinvs = action.getParentIssuerContext(); + VolumeSnapshotDeletionStructs struct = action.getParentIssuerContext(); + List sinvs = struct.getSnapshotInventories(); + for (VolumeSnapshotInventory sinv : sinvs) { - msgs.add(handleSnapshotDeletion(sinv)); + msgs.add(handleSnapshotDeletion(sinv, struct.getDirection(), struct.getScope())); } } @@ -190,8 +195,8 @@ public void done(ErrorCodeList errorCodeList) { }); } - private VolumeSnapshotDeletionMsg handleSnapshotDeletion(VolumeSnapshotInventory sinv) { - return makeMsg(sinv.getUuid(), false); + private VolumeSnapshotDeletionMsg handleSnapshotDeletion(VolumeSnapshotInventory sinv, String direction, String scope) { + return makeMsg(sinv.getUuid(), direction, scope, false); } private List handleVolumeDeletion(VolumeDeletionStruct vol) { @@ -213,8 +218,8 @@ static List handleVolumeExpunge(String volumeUuid) { .getDirectReferencedSnapshotUuidsGroupByTree(volumeUuid); return cuuids.stream().flatMap(it -> - getDeletableSnapshotUuidOnVolumeExpunge(it, referenceSnapshotTrees.get(it)).stream()) - .map(it -> buildMsg(it, true)) + getDeletableSnapshotUuidOnVolumeExpunge(it, referenceSnapshotTrees.get(it)).stream()) + .map(it -> buildMsg(it, DeleteVolumeSnapshotDirection.Pull.toString(), DeleteVolumeSnapshotScope.Chain.toString(), true)) .collect(Collectors.toList()); } diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java index 1df8c974fee..7488f23e178 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java @@ -278,7 +278,8 @@ private void handle(APIBatchDeleteVolumeSnapshotMsg msg) { final String issuer = VolumeSnapshotVO.class.getSimpleName(); List vos = Q.New(VolumeSnapshotVO.class).in(VolumeSnapshotVO_.uuid, ancestorMap.keySet()).list(); - final List ctx = VolumeSnapshotInventory.valueOf(vos); + VolumeSnapshotDeletionStructs ctx = new VolumeSnapshotDeletionStructs( + VolumeSnapshotInventory.valueOf(vos), DeleteVolumeSnapshotDirection.Pull.toString(), DeleteVolumeSnapshotScope.Chain.toString()); FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); chain.setName(String.format("batch-delete-snapshots-%s", msg.getUuids())); @@ -346,7 +347,7 @@ public void fail(ErrorCode errorCode) { public void handle(Map data) { reportProgress("95"); casf.asyncCascadeFull(CascadeConstant.DELETION_CLEANUP_CODE, issuer, ctx, new NopeCompletion()); - ctx.stream().filter(inventory -> results.containsKey(inventory.getUuid()) && results.get(inventory.getUuid()).isSuccess()) + ctx.getSnapshotInventories().stream().filter(inventory -> results.containsKey(inventory.getUuid()) && results.get(inventory.getUuid()).isSuccess()) .forEach(inventory -> { new FireSnapShotCanonicalEvent() .fireSnapShotStatusChangedEvent(VolumeSnapshotStatus.valueOf(inventory.getStatus()), inventory); @@ -378,7 +379,7 @@ public void handle(ErrorCode errCode, Map data) { } handleErrorCode((ErrorCodeList) errCode); event.setResults(new ArrayList<>(results.values())); - ctx.stream().filter(inventory -> results.containsKey(inventory.getUuid()) && results.get(inventory.getUuid()).isSuccess()) + ctx.getSnapshotInventories().stream().filter(inventory -> results.containsKey(inventory.getUuid()) && results.get(inventory.getUuid()).isSuccess()) .forEach(inventory -> { new FireSnapShotCanonicalEvent() .fireSnapShotStatusChangedEvent(VolumeSnapshotStatus.valueOf(inventory.getStatus()), inventory); diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java index 3c3e5db007c..154438d94fd 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java @@ -17,6 +17,7 @@ import org.zstack.core.db.SimpleQuery.Op; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.core.thread.ChainTask; +import org.zstack.core.thread.RunInQueue; import org.zstack.core.thread.SyncTaskChain; import org.zstack.core.thread.ThreadFacade; import org.zstack.core.trash.StorageTrash; @@ -30,16 +31,12 @@ import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.errorcode.SysErrors; import org.zstack.header.exception.CloudRuntimeException; -import org.zstack.header.host.CancelHostTasksMsg; -import org.zstack.header.host.HostConstant; +import org.zstack.header.host.*; import org.zstack.header.image.ImageConstant; import org.zstack.header.image.ImageInventory; import org.zstack.header.image.ImageVO; import org.zstack.header.image.SyncSystemTagFromVolumeMsg; -import org.zstack.header.message.APIDeleteMessage; -import org.zstack.header.message.APIMessage; -import org.zstack.header.message.Message; -import org.zstack.header.message.MessageReply; +import org.zstack.header.message.*; import org.zstack.header.storage.backup.AllocateBackupStorageMsg; import org.zstack.header.storage.backup.AllocateBackupStorageReply; import org.zstack.header.storage.backup.BackupStorageConstant; @@ -179,7 +176,7 @@ private VolumeSnapshotInventory getSelfInventory() { private void buildFullSnapshotTree() { SimpleQuery q = dbf.createQuery(VolumeSnapshotVO.class); - q.add(VolumeSnapshotVO_.treeUuid, SimpleQuery.Op.EQ, currentRoot.getTreeUuid()); + q.add(VolumeSnapshotVO_.treeUuid, Op.EQ, currentRoot.getTreeUuid()); List vos = q.list(); fullTree = VolumeSnapshotTree.fromVOs(vos); @@ -211,8 +208,6 @@ private void handleLocalMessage(Message msg) { handle((RevertVolumeFromSnapshotGroupMsg) msg); } else if (msg instanceof CancelDeleteVolumeSnapshotMsg) { handle((CancelDeleteVolumeSnapshotMsg) msg); - } else if (msg instanceof MarkSnapshotAsVolumeMsg) { - handle((MarkSnapshotAsVolumeMsg) msg); } else { bus.dealWithUnknownMessage(msg); } @@ -377,29 +372,21 @@ private void deletion(final VolumeSnapshotDeletionMsg msg, final NoErrorCompleti return; } - FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setName(String.format("delete-snapshot-%s", currentRoot.getUuid())); chain.allowEmptyFlow(); - boolean ancestorOfLatest = false; - long size = 0; - for (VolumeSnapshotInventory inv : currentLeaf.getDescendants()) { - if (inv.isLatest()) { - ancestorOfLatest = true; - } - - size += inv.getSize(); - } - long volumeVirtualSize = Q.New(VolumeVO.class) - .select(VolumeVO_.size) - .eq(VolumeVO_.uuid, msg.getVolumeUuid()) - .findValue(); - long requiredSize = size < volumeVirtualSize ? size : volumeVirtualSize; - + VolumeVO volume = dbf.findByUuid(msg.getVolumeUuid(), VolumeVO.class); String primaryStorageType = Q.New(PrimaryStorageVO.class).select(PrimaryStorageVO_.type) .eq(PrimaryStorageVO_.uuid, getSelfInventory().getPrimaryStorageUuid()).findValue(); - chain.then(new NoRollbackFlow() { + chain.then(new ShareFlow() { + boolean ancestorOfLatest; + long requiredSize; + + @Override + public void setup() { + flow(new NoRollbackFlow() { String __name__ = "check-snapshot-reference"; @Override @@ -418,7 +405,7 @@ public void run(FlowTrigger trigger, Map data) { trigger.fail(operr("snapshot or its desendant has reference volume[uuids:%s]", refVolUuids)); } }); - chain.then(new NoRollbackFlow() { + flow(new NoRollbackFlow() { String __name__ = "run snapshot protector"; @Override @@ -479,7 +466,102 @@ public void done(ErrorCodeList errorCodeList) { } }); - chain.then(new Flow() { + if (Objects.equals(msg.getScope(), DeleteVolumeSnapshotScope.Single.toString())) { + deleteSingleFlows(); + } else { + if (msg.getScope() == null) { + logger.warn("snapshot deletion scope is null, default to Chain scope"); + } + + long size = 0; + for (VolumeSnapshotInventory inv : currentLeaf.getDescendants()) { + if (inv.isLatest()) { + ancestorOfLatest = true; + } + size += inv.getSize(); + } + requiredSize = Math.min(size, volume.getSize()); + + deleteChainFlows(); + } + + done(new FlowDoneHandler(msg, completion) { + @Override + public void handle(Map data) { + if (Objects.equals(msg.getScope(), DeleteVolumeSnapshotScope.Single.toString())) { + bus.reply(msg, reply); + completion.done(); + return; + } + + new SQLBatch() { + @Override + protected void scripts() { + if (msg.isVolumeDeletion()) { + sql("update VolumeSnapshotTreeVO tree set tree.volumeUuid = NULL where tree.uuid = :treeUuid") + .param("treeUuid", currentRoot.getTreeUuid()).execute(); + + sql("update VolumeSnapshotVO s set s.volumeUuid = NULL where s.treeUuid = :treeUuid") + .param("treeUuid", currentRoot.getTreeUuid()).execute(); + } + + + if (!msg.isVolumeDeletion() && ancestorOfLatest && currentRoot.getParentUuid() != null) { + // reset latest + sql(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.uuid, currentRoot.getParentUuid()) + .set(VolumeSnapshotVO_.latest, true).update(); + logger.debug(String.format("reset latest snapshot of tree[uuid:%s] to snapshot[uuid:%s]", + currentRoot.getTreeUuid(), currentRoot.getParentUuid())); + } + } + }.execute(); + + if (!cleanup()) { + changeStatusOfSnapshots(StatusEvent.ready, currentLeaf.getDescendants(), new Completion(msg, completion) { + @Override + public void success() { + bus.reply(msg, reply); + completion.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + completion.done(); + } + }); + } else { + if (msg.isVolumeDeletion()) { + List aliveAncestors = currentLeaf.getAncestors().stream().map(VolumeSnapshotInventory::getUuid).collect(Collectors.toList()); + if (!aliveAncestors.isEmpty()) { + SQL.New(VolumeSnapshotTreeVO.class).eq(VolumeSnapshotTreeVO_.uuid, currentRoot.getTreeUuid()) + .set(VolumeSnapshotTreeVO_.volumeUuid, currentRoot.getVolumeUuid()) + .update(); + SQL.New(VolumeSnapshotVO.class).in(VolumeSnapshotVO_.uuid, aliveAncestors) + .set(VolumeSnapshotVO_.volumeUuid, currentRoot.getVolumeUuid()) + .update(); + } + } + + bus.reply(msg, reply); + completion.done(); + } + } + }); + + error(new FlowErrorHandler(msg, completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + reply.setError(errCode); + bus.reply(msg, reply); + completion.done(); + } + }); + } + + private void deleteChainFlows() { + flow(new Flow() { String __name__ = String.format("change-volume-snapshot-status-%s", VolumeSnapshotStatus.Deleting); public void run(final FlowTrigger trigger, Map data) { @@ -521,7 +603,7 @@ public void fail(ErrorCode errorCode) { boolean needMerge = onCurrentTree && ancestorOfLatest && currentRoot.getPrimaryStorageUuid() != null && VolumeSnapshotConstant.HYPERVISOR_SNAPSHOT_TYPE.toString().equals(currentRoot.getType()); if (needMerge) { - chain.then(new Flow() { + flow(new Flow() { String __name__ = "allocate-primary-storage"; boolean success; @@ -564,7 +646,7 @@ public void rollback(FlowRollback trigger, Map data) { trigger.rollback(); } }); - chain.then(new NoRollbackFlow() { + flow(new NoRollbackFlow() { String __name__ = "merge-volume-snapshots-to-volume"; @Override @@ -596,7 +678,7 @@ public void run(MessageReply reply) { }); } - chain.then(new NoRollbackFlow() { + flow(new NoRollbackFlow() { String __name__ = "delete-volume-snapshots-from-backup-storage"; @Override @@ -625,7 +707,7 @@ public void run(List replies) { }); } - chain.then(new NoRollbackFlow() { + flow(new NoRollbackFlow() { String __name__ = "delete-volume-snapshots-from-primary-storage"; @Override @@ -679,73 +761,624 @@ public void run(List replies) { }); } }); + } - final boolean finalAncestorOfLatest = ancestorOfLatest; - chain.done(new FlowDoneHandler(msg, completion) { - @Override - public void handle(Map data) { - new SQLBatch() { - @Override - protected void scripts() { - if (msg.isVolumeDeletion()) { - sql("update VolumeSnapshotTreeVO tree set tree.volumeUuid = NULL where tree.uuid = :treeUuid") - .param("treeUuid", currentRoot.getTreeUuid()).execute(); - - sql("update VolumeSnapshotVO s set s.volumeUuid = NULL where s.treeUuid = :treeUuid") - .param("treeUuid", currentRoot.getTreeUuid()).execute(); - } + private void deleteSingleFlows() { + flow(new NoRollbackFlow() { + VmInstanceState vmState; + String srcSnapshotParentPath; + String __name__ = "delete-single-volume-snapshot"; - if (!msg.isVolumeDeletion() && finalAncestorOfLatest && currentRoot.getParentUuid() != null) { - // reset latest - sql(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.uuid, currentRoot.getParentUuid()) - .set(VolumeSnapshotVO_.latest, true).update(); - logger.debug(String.format("reset latest snapshot of tree[uuid:%s] to snapshot[uuid:%s]", - currentRoot.getTreeUuid(), currentRoot.getParentUuid())); - } - } - }.execute(); + public void run(final FlowTrigger trigger, Map data) { + if (volume == null) { + trigger.fail(operr("volume not found for volumeUuid: %s", msg.getVolumeUuid())); + return; + } - if (!cleanup()) { - changeStatusOfSnapshots(StatusEvent.ready, currentLeaf.getDescendants(), new Completion(msg, completion) { + if (VolumeSnapshotConstant.STORAGE_SNAPSHOT_TYPE.toString().equals(currentRoot.getType()) + || Objects.equals(currentRoot.getVolumeType(), VolumeType.Memory.toString())) { + deleteVolumeSnapshotAndSyncVolumeSize(new Completion(completion) { @Override public void success() { - bus.reply(msg, reply); - completion.done(); + trigger.next(); } @Override public void fail(ErrorCode errorCode) { - reply.setError(errorCode); - bus.reply(msg, reply); - completion.done(); + trigger.fail(errorCode); } }); + return; + } + + if (volume.getVmInstanceUuid() != null) { + vmState = Q.New(VmInstanceVO.class).eq(VmInstanceVO_.uuid, volume.getVmInstanceUuid()).select(VmInstanceVO_.state).findValue(); + if (vmState != VmInstanceState.Running && vmState != VmInstanceState.Paused + && vmState != VmInstanceState.Destroyed && vmState != VmInstanceState.Stopped && vmState != VmInstanceState.Destroying) { + trigger.fail(operr("vm[uuid:%s] is not Running, Paused or Destroyed, Stopped, Destroying, " + + "current state[%s]", volume.getVmInstanceUuid(), vmState)); + return; + } + } + + stepDelete(new Completion(msg, completion) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + + private void stepDelete(Completion completion) { + List vos = Q.New(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.treeUuid, currentRoot.getTreeUuid()).list(); + boolean current = Q.New(VolumeSnapshotTreeVO.class).eq(VolumeSnapshotTreeVO_.uuid, currentRoot.getTreeUuid()) + .select(VolumeSnapshotTreeVO_.current).findValue(); + VolumeTree volumeTree = VolumeTree.fromVOs(vos, current, VolumeInventory.valueOf(volume)); + List children = volumeTree.getSnapshotLeaf(currentRoot.getUuid()).getChildren(); + + if (children.isEmpty()) { + deleteVolumeSnapshotAndSyncVolumeSize(completion); + return; + } + + VolumeTree.VolumeSnapshotLeaf onlineChild = children.stream() + .filter(child -> volumeTree.isOnline(current, currentRoot.getUuid(), child.getUuid(), vmState)) + .findFirst().orElse(null); + + Completion comp = new Completion(completion) { + @Override + public void success() { + stepDelete(completion); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }; + VolumeTree.VolumeSnapshotLeaf child = children.get(0); + if (children.size() == 1) { + DeleteVolumeSnapshotDirection direction = volumeTree.resolveDirection(currentRoot.getUuid(), child.getUuid(), + msg.getDirection(), currentRoot.isLatest(), vmState); + boolean online = volumeTree.isOnline(current, currentRoot.getUuid(), child.getUuid(), vmState); + if (Objects.equals(direction, DeleteVolumeSnapshotDirection.Commit)) { + commit(child, volumeTree, online, comp); + } else { + pull(child, volumeTree, online, comp); + } } else { - if (msg.isVolumeDeletion()) { - List aliveAncestors = currentLeaf.getAncestors().stream().map(VolumeSnapshotInventory::getUuid).collect(Collectors.toList()); - if (!aliveAncestors.isEmpty()) { - SQL.New(VolumeSnapshotTreeVO.class).eq(VolumeSnapshotTreeVO_.uuid, currentRoot.getTreeUuid()) - .set(VolumeSnapshotTreeVO_.volumeUuid, currentRoot.getVolumeUuid()) - .update(); - SQL.New(VolumeSnapshotVO.class).in(VolumeSnapshotVO_.uuid, aliveAncestors) - .set(VolumeSnapshotVO_.volumeUuid, currentRoot.getVolumeUuid()) - .update(); + if (onlineChild != null && Objects.equals(child.getUuid(), onlineChild.getUuid())) { + child = children.get(1); + } + boolean online = volumeTree.isOnline(current, currentRoot.getUuid(), child.getUuid(), vmState); + pull(child, volumeTree, online, comp); + } + } + + private void commit(VolumeTree.VolumeSnapshotLeaf child, VolumeTree volumeTree, boolean online, Completion completion) { + FlowChain chain = FlowChainBuilder.newShareFlowChain(); + chain.setName(String.format("delete-single-volume-snapshot-%s-by-commit", currentRoot.getUuid())); + chain.then(new ShareFlow() { + final VolumeSnapshotInventory srcSnapshotInv = child.getInventory(); + final VolumeTree.VolumeSnapshotLeaf srcSnapshotLeaf = child; + final VolumeSnapshotInventory dstSnapshotInv = VolumeSnapshotInventory.valueOf(currentRoot); + long size = srcSnapshotInv.getSize(); + String allocatedInstall; + + @Override + public void setup() { + if (Objects.equals(srcSnapshotInv.getUuid(), volume.getUuid())) { + flow(new NoRollbackFlow() { + String __name__ = String.format("get-volume-%s-current-size", volume.getUuid()); + + @Override + public void run(FlowTrigger trigger, Map data) { + SyncVolumeSizeOnPrimaryStorageMsg smsg = new SyncVolumeSizeOnPrimaryStorageMsg(); + smsg.setPrimaryStorageUuid(volume.getPrimaryStorageUuid()); + smsg.setVolumeUuid(volume.getUuid()); + smsg.setInstallPath(volume.getInstallPath()); + bus.makeTargetServiceIdByResourceUuid(smsg, PrimaryStorageConstant.SERVICE_ID, volume.getPrimaryStorageUuid()); + bus.send(smsg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(operr(String.format("failed to get volume[uuid:%s, installPath:%s] size " + + "on primary storage[uuid:%s], %s", volume.getUuid(), volume.getInstallPath(), + volume.getPrimaryStorageUuid(), reply.getError().getDetails()))); + return; + } + + SyncVolumeSizeOnPrimaryStorageReply r = reply.castReply(); + size = r.getActualSize(); + srcSnapshotInv.setSize(size); + trigger.next(); + } + }); + } + }); } + + flow(new Flow() { + String __name__ = "allocate-primary-storage-capacity"; + + @Override + public void run(FlowTrigger trigger, Map data) { + AllocatePrimaryStorageSpaceMsg amsg = new AllocatePrimaryStorageSpaceMsg(); + amsg.setRequiredPrimaryStorageUuid(volume.getPrimaryStorageUuid()); + amsg.setSize(size); + amsg.setNoOverProvisioning(true); + amsg.setRequiredInstallUri(String.format("volume://%s", volume.getUuid())); + bus.makeTargetServiceIdByResourceUuid(amsg, PrimaryStorageConstant.SERVICE_ID, volume.getPrimaryStorageUuid()); + bus.send(amsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + return; + } + AllocatePrimaryStorageSpaceReply r = reply.castReply(); + allocatedInstall = r.getAllocatedInstallUrl(); + trigger.next(); + } + }); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + if (allocatedInstall == null) { + trigger.rollback(); + return; + } + ReleasePrimaryStorageSpaceMsg rmsg = new ReleasePrimaryStorageSpaceMsg(); + rmsg.setDiskSize(size); + rmsg.setPrimaryStorageUuid(volume.getPrimaryStorageUuid()); + rmsg.setNoOverProvisioning(true); + rmsg.setAllocatedInstallUrl(allocatedInstall); + bus.makeTargetServiceIdByResourceUuid(rmsg, PrimaryStorageConstant.SERVICE_ID, volume.getPrimaryStorageUuid()); + bus.send(rmsg); + trigger.rollback(); + } + }); + + flow(new NoRollbackFlow() { + String __name__ = "commit-volume-snapshot-on-primary-storage"; + + long newInstallPathSize; + + @Override + public void run(FlowTrigger trigger, Map data) { + List childrenInstallPath = child.getChildren().stream().map(c -> + c.getInventory().getPrimaryStorageInstallPath()).collect(Collectors.toList()); + + if (online) { + String hostUuid = Q.New(VmInstanceVO.class).eq(VmInstanceVO_.uuid, volume.getVmInstanceUuid()) + .select(VmInstanceVO_.hostUuid).findValue(); + CommitVolumeSnapshotOnHypervisorMsg cmsg = new CommitVolumeSnapshotOnHypervisorMsg(); + cmsg.setHostUuid(hostUuid); + cmsg.setVolume(VolumeInventory.valueOf(volume)); + cmsg.setSrcSnapshot(srcSnapshotInv); + cmsg.setDstSnapshot(dstSnapshotInv); + cmsg.setSrcChildrenInstallPathInDb(childrenInstallPath); + bus.makeTargetServiceIdByResourceUuid(cmsg, HostConstant.SERVICE_ID, hostUuid); + bus.send(cmsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply r) { + if (!r.isSuccess()) { + trigger.fail(r.getError()); + return; + } + CommitVolumeSnapshotOnHypervisorReply re = r.castReply(); + newInstallPathSize = re.getSize(); + updateDatabase(); + trigger.next(); + } + }); + } else { + CommitVolumeSnapshotOnPrimaryStorageMsg cmsg = new CommitVolumeSnapshotOnPrimaryStorageMsg(); + cmsg.setVolume(VolumeInventory.valueOf(volume)); + cmsg.setSrcSnapshot(srcSnapshotInv); + cmsg.setDstSnapshot(dstSnapshotInv); + cmsg.setSrcChildrenInstallPathInDb(childrenInstallPath); + bus.makeTargetServiceIdByResourceUuid(cmsg, PrimaryStorageConstant.SERVICE_ID, volume.getPrimaryStorageUuid()); + bus.send(cmsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply r) { + if (!r.isSuccess()) { + trigger.fail(r.getError()); + return; + } + CommitVolumeSnapshotOnPrimaryStorageReply re = r.castReply(); + newInstallPathSize = re.getSize(); + updateDatabase(); + trigger.next(); + } + }); + } + } + + private void updateDatabase() { + ReleasePrimaryStorageSpaceMsg rmsg = new ReleasePrimaryStorageSpaceMsg(); + rmsg.setDiskSize(size); + rmsg.setPrimaryStorageUuid(volume.getPrimaryStorageUuid()); + rmsg.setAllocatedInstallUrl(allocatedInstall); + rmsg.setNoOverProvisioning(true); + bus.makeTargetServiceIdByResourceUuid(rmsg, PrimaryStorageConstant.SERVICE_ID, volume.getPrimaryStorageUuid()); + bus.send(rmsg); + + if (Objects.equals(srcSnapshotInv.getUuid(), volume.getUuid())) { + markSnapshotAsVolume(VolumeInventory.valueOf(volume), size, dstSnapshotInv.getPrimaryStorageInstallPath(), newInstallPathSize); + return; + } + + volumeTree.updateDatabaseAfterCommit(srcSnapshotLeaf, dstSnapshotInv, newInstallPathSize); + } + }); + + done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }); + + error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }); } + }).start(); + } - bus.reply(msg, reply); + private void pull(VolumeTree.VolumeSnapshotLeaf child, VolumeTree volumeTree, boolean online, Completion completion) { + FlowChain chain = FlowChainBuilder.newShareFlowChain(); + chain.setName(String.format("delete-single-volume-snapshot-%s-by-pull", currentRoot.getUuid())); + chain.then(new ShareFlow() { + final VolumeSnapshotInventory srcSnapshotInv = VolumeSnapshotInventory.valueOf(currentRoot); + final VolumeSnapshotInventory dstSnapshotInv = child.getInventory(); + final VolumeTree.VolumeSnapshotLeaf dstSnapshotLeaf = child; + String hostUuid; + long newInstallPathSize; + String allocatedInstall; + + @Override + public void setup() { + if (volume.getVmInstanceUuid() != null && (vmState == VmInstanceState.Running || vmState == VmInstanceState.Paused)) { + hostUuid = Q.New(VmInstanceVO.class).eq(VmInstanceVO_.uuid, volume.getVmInstanceUuid()) + .select(VmInstanceVO_.hostUuid).findValue(); + } + + flow(new NoRollbackFlow() { + String __name__ = "get-snapshot-backing-chain"; + + @Override + public boolean skip(Map data) { + return srcSnapshotParentPath != null; + } + + @Override + public void run(FlowTrigger trigger, Map data) { + GetVolumeBackingChainFromPrimaryStorageMsg gmsg = new GetVolumeBackingChainFromPrimaryStorageMsg(); + gmsg.setVolumeUuid(volume.getUuid()); + gmsg.setRootInstallPaths(Collections.singletonList(srcSnapshotInv.getPrimaryStorageInstallPath())); + gmsg.setPrimaryStorageUuid(srcSnapshotInv.getPrimaryStorageUuid()); + gmsg.setHostUuid(hostUuid); + gmsg.setVolumeFormat(volume.getFormat()); + bus.makeTargetServiceIdByResourceUuid(gmsg, PrimaryStorageConstant.SERVICE_ID, gmsg.getPrimaryStorageUuid()); + bus.send(gmsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + return; + } + + GetVolumeBackingChainFromPrimaryStorageReply gr = reply.castReply(); + List backingChainInstallPath = gr.getBackingChainInstallPath().get(srcSnapshotInv.getPrimaryStorageInstallPath()); + if (!CollectionUtils.isEmpty(backingChainInstallPath)) { + srcSnapshotParentPath = backingChainInstallPath.get(0); + } + trigger.next(); + } + }); + } + }); + + flow(new Flow() { + String __name__ = "allocate-primary-storage-capacity"; + + @Override + public void run(FlowTrigger trigger, Map data) { + AllocatePrimaryStorageSpaceMsg amsg = new AllocatePrimaryStorageSpaceMsg(); + amsg.setRequiredPrimaryStorageUuid(volume.getPrimaryStorageUuid()); + amsg.setSize(srcSnapshotInv.getSize()); + amsg.setNoOverProvisioning(true); + amsg.setRequiredInstallUri(String.format("volume://%s", volume.getUuid())); + bus.makeTargetServiceIdByResourceUuid(amsg, PrimaryStorageConstant.SERVICE_ID, volume.getPrimaryStorageUuid()); + bus.send(amsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + return; + } + AllocatePrimaryStorageSpaceReply r = reply.castReply(); + allocatedInstall = r.getAllocatedInstallUrl(); + trigger.next(); + } + }); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + if (allocatedInstall == null) { + trigger.rollback(); + return; + } + ReleasePrimaryStorageSpaceMsg rmsg = new ReleasePrimaryStorageSpaceMsg(); + rmsg.setDiskSize(srcSnapshotInv.getSize()); + rmsg.setPrimaryStorageUuid(volume.getPrimaryStorageUuid()); + rmsg.setNoOverProvisioning(true); + rmsg.setAllocatedInstallUrl(allocatedInstall); + bus.makeTargetServiceIdByResourceUuid(rmsg, PrimaryStorageConstant.SERVICE_ID, volume.getPrimaryStorageUuid()); + bus.send(rmsg); + trigger.rollback(); + } + }); + + if (Objects.equals(dstSnapshotInv.getUuid(), volume.getUuid())) { + flow(new NoRollbackFlow() { + String __name__ = String.format("get-volume-%s-current-size", volume.getUuid()); + + @Override + public void run(FlowTrigger trigger, Map data) { + SyncVolumeSizeOnPrimaryStorageMsg smsg = new SyncVolumeSizeOnPrimaryStorageMsg(); + smsg.setPrimaryStorageUuid(volume.getPrimaryStorageUuid()); + smsg.setVolumeUuid(volume.getUuid()); + smsg.setInstallPath(volume.getInstallPath()); + bus.makeTargetServiceIdByResourceUuid(smsg, PrimaryStorageConstant.SERVICE_ID, volume.getPrimaryStorageUuid()); + bus.send(smsg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(operr(String.format("failed to get volume[uuid:%s, installPath:%s] size on primary storage[uuid:%s], because %s", + volume.getUuid(), volume.getInstallPath(), volume.getPrimaryStorageUuid(), reply.getError().getDetails()))); + return; + } + + SyncVolumeSizeOnPrimaryStorageReply r = reply.castReply(); + dstSnapshotInv.setSize(r.getActualSize()); + trigger.next(); + } + }); + } + }); + } + + flow(new NoRollbackFlow() { + String __name__ = "pull-volume-snapshot-on-primary-storage"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (online) { + PullVolumeSnapshotOnHypervisorMsg pmsg = new PullVolumeSnapshotOnHypervisorMsg(); + pmsg.setHostUuid(hostUuid); + pmsg.setVolume(VolumeInventory.valueOf(volume)); + pmsg.setSrcSnapshotParentPath(srcSnapshotParentPath); + pmsg.setSrcSnapshot(srcSnapshotInv); + pmsg.setDstSnapshot(dstSnapshotInv); + bus.makeTargetServiceIdByResourceUuid(pmsg, HostConstant.SERVICE_ID, hostUuid); + bus.send(pmsg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply r) { + if (!r.isSuccess()) { + trigger.fail(r.getError()); + return; + } + + PullVolumeSnapshotOnHypervisorReply re = r.castReply(); + newInstallPathSize = re.getSize(); + updateDatabase(); + trigger.next(); + } + }); + } else { + PullVolumeSnapshotOnPrimaryStorageMsg pmsg = new PullVolumeSnapshotOnPrimaryStorageMsg(); + pmsg.setVolume(VolumeInventory.valueOf(volume)); + pmsg.setSrcSnapshotParentPath(srcSnapshotParentPath); + pmsg.setSrcSnapshot(srcSnapshotInv); + pmsg.setDstSnapshot(dstSnapshotInv); + bus.makeTargetServiceIdByResourceUuid(pmsg, PrimaryStorageConstant.SERVICE_ID, volume.getPrimaryStorageUuid()); + bus.send(pmsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply r) { + if (!r.isSuccess()) { + trigger.fail(r.getError()); + return; + } + PullVolumeSnapshotOnPrimaryStorageReply re = r.castReply(); + newInstallPathSize = re.getSize(); + updateDatabase(); + trigger.next(); + } + }); + } + } + + private void updateDatabase() { + ReleasePrimaryStorageSpaceMsg rmsg = new ReleasePrimaryStorageSpaceMsg(); + rmsg.setDiskSize(srcSnapshotInv.getSize()); + rmsg.setPrimaryStorageUuid(volume.getPrimaryStorageUuid()); + rmsg.setAllocatedInstallUrl(allocatedInstall); + rmsg.setNoOverProvisioning(true); + bus.makeTargetServiceIdByResourceUuid(rmsg, PrimaryStorageConstant.SERVICE_ID, volume.getPrimaryStorageUuid()); + bus.send(rmsg); + + if (Objects.equals(dstSnapshotInv.getUuid(), volume.getUuid())) { + volumeTree.updateDatabaseAfterPullToVolume(srcSnapshotInv); + return; + } + volumeTree.updateDatabaseAfterPull(srcSnapshotInv, dstSnapshotLeaf, newInstallPathSize); + } + }); + + done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }); + + error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }); + + } + }).start(); + } + + private void deleteVolumeSnapshotAndSyncVolumeSize(Completion completion) { + FlowChain chain = FlowChainBuilder.newShareFlowChain(); + chain.setName("delete-volume-snapshot-and-sync-volume-size"); + chain.then(new ShareFlow() { + @Override + public void setup() { + flow(new NoRollbackFlow() { + String __name__ = String.format("delete-snapshot-%s-on-primary-storage", currentRoot.getUuid()); + + @Override + public void run(FlowTrigger trigger, Map data) { + VolumeSnapshotPrimaryStorageDeletionMsg pmsg = new VolumeSnapshotPrimaryStorageDeletionMsg(); + pmsg.setUuid(currentRoot.getUuid()); + bus.makeTargetServiceIdByResourceUuid(pmsg, VolumeSnapshotConstant.SERVICE_ID, currentRoot.getPrimaryStorageUuid()); + bus.send(pmsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + //TODO add gc + logger.warn(String.format("failed to delete snapshot[uuid:%s] on primary storage[uuid:%s], " + + "%s", currentRoot.getUuid(), currentRoot.getPrimaryStorageUuid(), reply.getError().getDetails())); + } + VolumeSnapshotVO vo = dbf.findByUuid(currentRoot.getUuid(), VolumeSnapshotVO.class); + cleanupInQueue(VolumeSnapshotInventory.valueOf(vo), new NoErrorCompletion() { + @Override + public void done() { + trigger.next(); + } + }); + } + }); + } + }); + + flow(new NoRollbackFlow() { + String __name__ = String.format("sync-volume-%s-size", volume.getUuid()); + + @Override + public void run(FlowTrigger trigger, Map data) { + SyncVolumeSizeMsg msg = new SyncVolumeSizeMsg(); + msg.setVolumeUuid(volume.getUuid()); + bus.makeTargetServiceIdByResourceUuid(msg, VolumeConstant.SERVICE_ID, volume.getUuid()); + bus.send(msg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.warn(String.format("failed to sync volume[%s] size, because %s", volume.getUuid(), reply.getError())); + } + trigger.next(); + } + }); + } + }); + + done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }); + + error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }); + } + }).start(); + } + }); + } + }).start(); + } + + private void cleanupInQueue(VolumeSnapshotInventory volumeSnapshotInv, NoErrorCompletion completion) { + if (volumeSnapshotInv.getGroupUuid() == null) { + cleanupAfterDeleteSingleSnapshot(volumeSnapshotInv, new NoErrorCompletion() { + @Override + public void done() { completion.done(); } - } - }).error(new FlowErrorHandler(msg, completion) { + }); + return; + } + + new RunInQueue(String.format("cleanup-snapshot-on-volumeSnapshotGroup-%s", volumeSnapshotInv.getGroupUuid()), thdf, 1) + .name("cleanup-snapshot-on-volumeSnapshotGroup-in-queue").asyncBackup(completion) + .run(chain -> cleanupAfterDeleteSingleSnapshot(volumeSnapshotInv, new NoErrorCompletion(chain) { + @Override + public void done() { + completion.done(); + chain.next(); + } + })); + } + + private void cleanupAfterDeleteSingleSnapshot(VolumeSnapshotInventory volumeSnapshotInv, final NoErrorCompletion completion) { + boolean cleanup = new SQLBatchWithReturn() { @Override - public void handle(ErrorCode errCode, Map data) { - reply.setError(errCode); - bus.reply(msg, reply); - completion.done(); + protected Boolean scripts() { + sql(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.uuid, volumeSnapshotInv.getUuid()).hardDelete(); + if (!q(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.treeUuid, volumeSnapshotInv.getTreeUuid()).isExists()) { + logger.debug(String.format("volume snapshot tree[uuid:%s] has no leaf, delete it", volumeSnapshotInv.getTreeUuid())); + sql(VolumeSnapshotTreeVO.class).eq(VolumeSnapshotTreeVO_.uuid, volumeSnapshotInv.getTreeUuid()).hardDelete(); + } + return true; } - }).start(); + }.execute(); + + if (cleanup) { + ungroupAfterDeleteSingleSnapshot(volumeSnapshotInv); + } + + completion.done(); + } + + private void ungroupAfterDeleteSingleSnapshot(VolumeSnapshotInventory volumeSnapshotInv) { + if (volumeSnapshotInv.getGroupUuid() == null) { + return; + } + + SQL.New(VolumeSnapshotGroupRefVO.class).eq(VolumeSnapshotGroupRefVO_.volumeSnapshotUuid, volumeSnapshotInv.getUuid()) + .set(VolumeSnapshotGroupRefVO_.snapshotDeleted, true).update(); + long count = Q.New(VolumeSnapshotGroupRefVO.class) + .eq(VolumeSnapshotGroupRefVO_.volumeSnapshotGroupUuid, volumeSnapshotInv.getGroupUuid()) + .eq(VolumeSnapshotGroupRefVO_.snapshotDeleted, false).count(); + if (count == 0) { + dbf.removeByPrimaryKey(volumeSnapshotInv.getGroupUuid(), VolumeSnapshotGroupVO.class); + logger.debug(String.format("snapshot group[uuid:%s] all volume snapshot has been deleted, " + + "delete snapshot group", volumeSnapshotInv.getGroupUuid())); + } } private void handle(final InstantiateDataVolumeFromVolumeSnapshotMsg msg) { @@ -1415,6 +2048,7 @@ public void run(MessageReply rly) { }); } + // The logic for cleaning up snapshots when deleting a snapshot chain private boolean cleanup() { List snapshots = currentLeaf.getDescendants(); @@ -1455,6 +2089,7 @@ protected Boolean scripts() { return cleanup; } + // The logic for cleaning up snapshot groups when deleting a snapshot chain private void ungroupAfterDeleted(List snapshots) { List uuids = snapshots.stream().map(VolumeSnapshotInventory::getUuid).collect(Collectors.toList()); SQL.New(VolumeSnapshotGroupRefVO.class).in(VolumeSnapshotGroupRefVO_.volumeSnapshotUuid, uuids) @@ -1884,7 +2519,6 @@ public String getName() { }); } - private void revert(final RevertVolumeSnapshotMessage msg, final Completion completion) { refreshVO(); final ErrorCode err = isOperationAllowed((Message) msg); @@ -2199,7 +2833,8 @@ public void handle(ErrorCode errCode, Map data) { private void deleteVolumeSnapshot(final DeleteVolumeSnapshotMessage msg, Completion completion) { final String issuer = VolumeSnapshotVO.class.getSimpleName(); - final List ctx = Arrays.asList(getSelfInventory()); + VolumeSnapshotDeletionStructs ctx = new VolumeSnapshotDeletionStructs( + Collections.singletonList(getSelfInventory()), msg.getDirection(), msg.getScope()); FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); chain.setName(String.format("delete-snapshot-%s", msg.getSnapshotUuid())); @@ -2289,35 +2924,24 @@ public void fail(ErrorCode errorCode) { }); } - private void handle(final MarkSnapshotAsVolumeMsg msg) { - thdf.chainSubmit(new ChainTask(msg) { - @Override - public String getSyncSignature() { - return syncSignature; - } - - @Override - public void run(final SyncTaskChain chain) { + private void markSnapshotAsVolume(VolumeInventory volume,long volumeInstallPathSize, String newInstallPath, long newInstallPathSize) { refreshVO(); - MarkSnapshotAsVolumeReply reply = new MarkSnapshotAsVolumeReply(); if (!currentRoot.isLatest()) { - reply.setError(operr("current snapshot:%s is not latest snapshot, cannot mark as volume", currentRoot.getUuid())); - bus.reply(msg, reply); - chain.next(); - return; + throw new RuntimeException(String.format("current snapshot[uuid:%s] is not the latest snapshot, cannot mark it as volume", currentRoot.getUuid())); } new SQLBatch() { @Override protected void scripts() { - sql(VolumeVO.class).eq(VolumeVO_.uuid, msg.getVolumeUuid()) - .set(VolumeVO_.installPath, msg.getVolumePath()) - .set(VolumeVO_.actualSize, msg.getSize()) + sql(VolumeVO.class).eq(VolumeVO_.uuid, volume.getUuid()) + .set(VolumeVO_.installPath, newInstallPath) + .set(VolumeVO_.actualSize, newInstallPathSize) .update(); - sql(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.uuid, msg.getSnapshotUuid()) - .set(VolumeSnapshotVO_.primaryStorageInstallPath, null) - .set(VolumeSnapshotVO_.primaryStorageUuid, null) + sql(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.uuid, currentRoot.getUuid()) + .set(VolumeSnapshotVO_.primaryStorageInstallPath, volume.getInstallPath()) + .set(VolumeSnapshotVO_.size, volumeInstallPathSize) + .set(VolumeSnapshotVO_.latest, false) .update(); if (currentRoot.getParentUuid() != null) { @@ -2328,20 +2952,13 @@ protected void scripts() { currentRoot.getTreeUuid(), currentRoot.getParentUuid())); } + if (currentRoot.getParentUuid() == null) { + sql(VolumeSnapshotTreeVO.class).eq(VolumeSnapshotTreeVO_.uuid, currentRoot.getTreeUuid()) + .set(VolumeSnapshotTreeVO_.current, false).update(); + } + VolumeSnapshotReferenceUtils.updateReferenceAfterMarkSnapshotAsVolume(currentRoot); } }.execute(); - - cleanup(); - - bus.reply(msg, reply); - chain.next(); - } - - @Override - public String getName() { - return String.format("mark-snapshot-%s-as-volume", currentRoot.getUuid()); - } - }); } } diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeTree.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeTree.java new file mode 100644 index 00000000000..8aa9c70d66f --- /dev/null +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeTree.java @@ -0,0 +1,551 @@ +package org.zstack.storage.snapshot; + +import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Configurable; +import org.zstack.core.Platform; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; +import org.zstack.core.db.SQLBatch; +import org.zstack.header.storage.snapshot.*; +import org.zstack.header.storage.snapshot.group.VolumeSnapshotGroupRefVO; +import org.zstack.header.storage.snapshot.group.VolumeSnapshotGroupRefVO_; +import org.zstack.header.storage.snapshot.reference.VolumeSnapshotReferenceVO; +import org.zstack.header.vm.VmInstanceState; +import org.zstack.header.volume.VolumeInventory; +import org.zstack.utils.CollectionUtils; +import org.zstack.utils.DebugUtils; +import org.zstack.utils.Utils; +import org.zstack.utils.function.Function; +import org.zstack.utils.logging.CLogger; + +import java.util.*; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +/** + * When building the VolumeTree, if the tree is current, then add the volume to the VolumeTree. + */ +@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) +public class VolumeTree { + private static final CLogger logger = Utils.getLogger(VolumeTree.class); + + @Autowired + private DatabaseFacade dbf; + + private VolumeSnapshotLeaf root; + VolumeInventory volume; + List allSnapshots = new ArrayList<>(); + private boolean current; + + public boolean isCurrent() { + return current; + } + + // the aliveChainSnapshots represents a chain where the volume is located, but only if the VolumeTree contains that volume. + // If the VolumeTree does not contain the volume, then aliveChainInventory should be empty. + private List aliveChain = new ArrayList<>(); + + private static class VolumeSnapshotLeafInventory { + private VolumeSnapshotInventory inventory; + private String parentUuid; + private List children = new ArrayList<>(); + + public VolumeSnapshotInventory getInventory() { + return inventory; + } + + public void setInventory(VolumeSnapshotInventory inventory) { + this.inventory = inventory; + } + + public String getParentUuid() { + return parentUuid; + } + + public void setParentUuid(String parentUuid) { + this.parentUuid = parentUuid; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + public String getStatus() { + return inventory.getStatus(); + } + } + + public static class VolumeSnapshotLeaf { + private VolumeSnapshotInventory inventory; + private VolumeSnapshotLeaf parent; + private List children = new ArrayList<>(); + private List descendants; + private List ancestors; + + public VolumeSnapshotInventory getInventory() { + return inventory; + } + + public void setInventory(VolumeSnapshotInventory inventory) { + this.inventory = inventory; + } + + public VolumeSnapshotLeaf getParent() { + return parent; + } + + public void setParent(VolumeSnapshotLeaf parent) { + this.parent = parent; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + public String getUuid() { + return inventory.getUuid(); + } + + public void setUuid(String uuid) { + if (inventory == null) { + inventory = new VolumeSnapshotInventory(); + } + inventory.setUuid(uuid); + } + + private static void walkDownAll(VolumeSnapshotLeaf me, Consumer consumer) { + consumer.accept(me); + me.children.forEach(c -> walkDownAll(c, consumer)); + + } + + public void walkDownAll(Consumer consumer) { + walkDownAll(this, consumer); + } + + public VolumeTree toSubTree() { + VolumeTree tree = new VolumeTree(); + tree.root = this; + return tree; + } + + private static VolumeSnapshotLeaf walkUp(VolumeSnapshotLeaf leaf, Function func) { + if (func.call(leaf.inventory)) { + return leaf; + } + + if (leaf.getParent() == null) { + return null; + } + + return walkUp(leaf.getParent(), func); + } + + public VolumeSnapshotLeaf walkUp(Function func) { + if (func.call(inventory)) { + return this; + } + + if (getParent() == null) { + return null; + } + + return walkUp(getParent(), func); + } + + public VolumeSnapshotLeaf walkDown(Function func) { + return walkDown(this, func); + } + + private static VolumeSnapshotLeaf walkDown(VolumeSnapshotLeaf leaf, Function func) { + if (func.call(leaf.inventory)) { + return leaf; + } + + if (leaf.getChildren().isEmpty()) { + return null; + } + + for (VolumeSnapshotLeaf l : leaf.getChildren()) { + VolumeSnapshotLeaf ret = walkDown(l, func); + if (ret != null) { + return ret; + } + } + + return null; + } + + public List getDescendants() { + if (descendants == null) { + descendants = new ArrayList(); + walkDown(new Function() { + @Override + public Boolean call(VolumeSnapshotInventory arg) { + descendants.add(arg); + return false; + } + }); + } + + return descendants; + } + + public List getAncestors() { + if (ancestors == null) { + ancestors = new ArrayList(); + walkUp(new Function() { + @Override + public Boolean call(VolumeSnapshotInventory arg) { + ancestors.add(arg); + return false; + } + }); + } + + return ancestors; + } + + public VolumeSnapshotLeafInventory toLeafInventory(Set filterUuids) { + return doToLeafInventory(filterUuids); + } + + public VolumeSnapshotLeafInventory toLeafInventory() { + return doToLeafInventory(null); + } + + private VolumeSnapshotLeafInventory doToLeafInventory(Set filterUuids) { + VolumeSnapshotLeafInventory leafInventory = new VolumeSnapshotLeafInventory(); + leafInventory.setInventory(getInventory(filterUuids)); + if (parent != null) { + leafInventory.setParentUuid(parent.getUuid()); + } + + for (VolumeSnapshotLeaf leaf : children) { + leafInventory.getChildren().add(leaf.doToLeafInventory(filterUuids)); + } + + return leafInventory; + } + + private VolumeSnapshotInventory getInventory(Set filterUuids) { + if (filterUuids == null || filterUuids.contains(inventory.getUuid())) { + return inventory; + } else { + VolumeSnapshotInventory inv = new VolumeSnapshotInventory(); + inv.setUuid(inventory.getUuid()); + return inv; + } + } + + public List getChildrenVolumeSnapshotInventoryUuid() { + return children.stream().map(it -> it.getInventory().getUuid()).collect(Collectors.toList()); + } + + public String getStatus() { + return inventory.getStatus(); + } + } + + // TODO(clone) : When both chain cloning and single-node snapshot deletion are enabled, + // it is necessary to consider the dependency relationships of all snapshot nodes in the current snapshot tree within the VolumeSnapshotReferenceVO. + public static VolumeTree fromVOs(List vos, boolean current, VolumeInventory volumeInv) { + if (CollectionUtils.isEmpty(vos)) { + throw new IllegalArgumentException("VolumeSnapshotVO list cannot be null or empty"); + } + + List noParentVO = vos.stream().filter(it -> it.getParentUuid() == null).collect(Collectors.toList()); + if (noParentVO.size() > 1) { + throw new IllegalArgumentException(String.format("There are %d root snapshots on tree[uuid:%s]", + noParentVO.size(), vos.get(0).getTreeUuid())); + } + + List invs = VolumeSnapshotInventory.valueOf(vos); + + List latestSnapshotInv = invs.stream() + .filter(VolumeSnapshotInventory::isLatest).collect(Collectors.toList()); + if (latestSnapshotInv.size() > 1) { + throw new IllegalArgumentException(String.format("There are %d latest snapshots on tree[uuid:%s]", + latestSnapshotInv.size(), invs.get(0).getTreeUuid())); + } + + VolumeTree tree = new VolumeTree(); + tree.current = current; + tree.volume = volumeInv; + if (tree.current && latestSnapshotInv.size() == 1) { + VolumeSnapshotVO snapshotVO = new VolumeSnapshotVO(); + snapshotVO.setLatest(false); + snapshotVO.setName(String.format("volume-%s-%s", volumeInv.getName(), volumeInv.getUuid())); + snapshotVO.setUuid(volumeInv.getUuid()); + VolumeSnapshotInventory latestInv = latestSnapshotInv.get(0); + snapshotVO.setParentUuid(latestInv.getUuid()); + snapshotVO.setTreeUuid(latestInv.getTreeUuid()); + snapshotVO.setState(VolumeSnapshotState.Enabled); + snapshotVO.setStatus(VolumeSnapshotStatus.Ready); + snapshotVO.setPrimaryStorageInstallPath(volumeInv.getInstallPath()); + snapshotVO.setPrimaryStorageUuid(volumeInv.getPrimaryStorageUuid()); + invs.add(VolumeSnapshotInventory.valueOf(snapshotVO)); + } + + Map map = new HashMap<>(); + for (VolumeSnapshotInventory inv : invs) { + VolumeSnapshotLeaf leaf = map.get(inv.getUuid()); + if (leaf == null) { + leaf = new VolumeSnapshotLeaf(); + leaf.inventory = inv; + map.put(inv.getUuid(), leaf); + } else { + leaf.inventory = inv; + } + + if (inv.getParentUuid() != null) { + VolumeSnapshotLeaf parent = map.get(inv.getParentUuid()); + if (parent == null) { + parent = new VolumeSnapshotLeaf(); + parent.setUuid(inv.getParentUuid()); + map.put(parent.getUuid(), parent); + } + + parent.children.add(leaf); + leaf.parent = parent; + } else { + tree.root = leaf; + } + } + + if (tree.current) { + VolumeSnapshotLeaf leaf = tree.getSnapshotLeaf(volumeInv.getUuid()); + tree.aliveChain = leaf != null ? leaf.getAncestors() : new ArrayList<>(); + } + DebugUtils.Assert(tree.root != null, "why tree root is null???"); + tree.allSnapshots = invs; + return tree; + } + + private VolumeSnapshotLeaf findSnapshot(final List leafs, final Function func) { + for (VolumeSnapshotLeaf leaf : leafs) { + VolumeSnapshotLeaf ret = findSnapshot(leaf.children, func); + if (ret != null) { + return ret; + } + + if (func.call(leaf.getInventory())) { + return leaf; + } + } + + return null; + } + + private VolumeSnapshotLeaf findSnapshot(Function func) { + if (func.call(root.getInventory())) { + return root; + } + return findSnapshot(root.children, func); + } + + public VolumeSnapshotLeaf getSnapshotLeaf(String snapshotUuid) { + return findSnapshot(new Function() { + @Override + public Boolean call(VolumeSnapshotInventory arg) { + return arg.getUuid().equals(snapshotUuid); + } + }); + } + + public List getAliveChainSnapshotUuids() { + return aliveChain.stream().map(VolumeSnapshotInventory::getUuid).collect(Collectors.toList()); + } + + public DeleteVolumeSnapshotDirection resolveDirection(String targetSnapshotUuid, String childSnapshotUuid, String initialDirection, + boolean targetSnapshotIsLatest, VmInstanceState vmState) { + boolean online = (vmState == VmInstanceState.Running || vmState == VmInstanceState.Paused) + && getAliveChainSnapshotUuids().contains(targetSnapshotUuid) && getAliveChainSnapshotUuids().contains(childSnapshotUuid); + + boolean shouldUseCommitStrategy = current && !targetSnapshotIsLatest && online; + + if (Objects.equals(initialDirection, DeleteVolumeSnapshotDirection.Pull.toString()) && shouldUseCommitStrategy) { + throw new IllegalArgumentException("the snapshot will be deleted by block 'commit', but the direction is 'pull', " + + "change the direction to 'commit' or 'auto'."); + } + + if (initialDirection == null) { + return DeleteVolumeSnapshotDirection.Commit; + } + + if (Objects.equals(initialDirection, DeleteVolumeSnapshotDirection.Auto.toString())) { + return shouldUseCommitStrategy ? + DeleteVolumeSnapshotDirection.Commit : + DeleteVolumeSnapshotDirection.Pull; + } + + return DeleteVolumeSnapshotDirection.fromString(initialDirection); + } + + public boolean isOnline(boolean treeIsCurrent, String targetSnapshotUuid, String childSnapshotUuid, VmInstanceState vmState) { + return treeIsCurrent && (vmState == VmInstanceState.Running || vmState == VmInstanceState.Paused) + && getAliveChainSnapshotUuids().contains(targetSnapshotUuid) && getAliveChainSnapshotUuids().contains(childSnapshotUuid); + } + + // TODO(clone) : When both chain cloning and single-node snapshot deletion are enabled, + // the following three functions must take into account the dependencies within the snapshot chain. + public void updateDatabaseAfterPullToVolume(VolumeSnapshotInventory srcSnapshotInv) { + new SQLBatch() { + @Override + protected void scripts() { + sql(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.uuid, srcSnapshotInv.getUuid()) + .set(VolumeSnapshotVO_.latest, false).update(); + + if (srcSnapshotInv.getParentUuid() != null) { + sql(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.uuid, srcSnapshotInv.getParentUuid()) + .set(VolumeSnapshotVO_.latest, true).update(); + logger.debug(String.format("reset latest snapshot of tree[uuid:%s] to snapshot[uuid:%s]", + srcSnapshotInv.getTreeUuid(), srcSnapshotInv.getParentUuid())); + } + + if (srcSnapshotInv.getParentUuid() == null) { + sql(VolumeSnapshotTreeVO.class).eq(VolumeSnapshotTreeVO_.uuid, srcSnapshotInv.getTreeUuid()) + .set(VolumeSnapshotTreeVO_.current, false).update(); + } + } + }.execute(); + } + + public void updateDatabaseAfterPull(VolumeSnapshotInventory srcSnapshotInv, VolumeTree.VolumeSnapshotLeaf dstSnapshotLeaf, long newInstallPathSize) { + VolumeSnapshotInventory dstSnapshotInv = dstSnapshotLeaf.getInventory(); + + new SQLBatch() { + @Override + protected void scripts() { + List descendantsUuid = dstSnapshotLeaf.getDescendants().stream().map(VolumeSnapshotInventory::getUuid) + .filter(uuid -> !Objects.equals(uuid, volume.getUuid())) + .collect(Collectors.toList()); + + List vos = q(VolumeSnapshotVO.class).in(VolumeSnapshotVO_.uuid, descendantsUuid).list(); + vos.forEach(vo -> { + // update distance + vo.setDistance(vo.getDistance() - 1); + + if (Objects.equals(vo.getUuid(), dstSnapshotInv.getUuid())) { + // update parentUuid + vo.setParentUuid(srcSnapshotInv.getParentUuid()); + logger.debug(String.format("update the parent of snapshot[uuid:%s] to %s", dstSnapshotInv.getUuid(), srcSnapshotInv.getParentUuid())); + + vo.setSize(newInstallPathSize); + logger.debug(String.format("update the size of snapshot[uuid:%s] to %s", dstSnapshotInv.getUuid(), newInstallPathSize)); + } + }); + + VolumeSnapshotTreeVO newTree = null; + // create new tree and update treeUuid + if (srcSnapshotInv.getParentUuid() == null) { + newTree = new VolumeSnapshotTreeVO(); + newTree.setCurrent(descendantsUuid.contains(volume.getUuid())); + newTree.setVolumeUuid(volume.getUuid()); + newTree.setUuid(Platform.getUuid()); + newTree.setStatus(VolumeSnapshotTreeStatus.Completed); + if (getAliveChainSnapshotUuids().contains(dstSnapshotInv.getUuid())) { + newTree.setCurrent(true); + } + dbf.persist(newTree); + logger.debug(String.format("created new volume snapshot tree[uuid:%s]", newTree.getUuid())); + VolumeSnapshotTreeVO finalNewTree = newTree; + vos.forEach(vo -> vo.setTreeUuid(finalNewTree.getUuid())); + } + + dbf.updateCollection(vos); + + if (newTree != null && Objects.equals(dstSnapshotInv.getUuid(), volume.getUuid()) + && q(VolumeSnapshotTreeVO.class).eq(VolumeSnapshotTreeVO_.uuid, srcSnapshotInv.getTreeUuid()).count() == 1) { + sql(VolumeSnapshotTreeVO.class).eq(VolumeSnapshotTreeVO_.uuid, srcSnapshotInv.getTreeUuid()) + .set(VolumeSnapshotTreeVO_.current, false).update(); + } + } + }.execute(); + } + + public void updateDatabaseAfterCommit(VolumeTree.VolumeSnapshotLeaf srcSnapshotLeaf, VolumeSnapshotInventory dstSnapshotInv, long newInstallPathSize) { + VolumeSnapshotInventory srcSnapshotInv = srcSnapshotLeaf.getInventory(); + new SQLBatch() { + @Override + protected void scripts() { + List descendantsUuid = srcSnapshotLeaf.getDescendants().stream().map(VolumeSnapshotInventory::getUuid) + .filter(uuid -> !Objects.equals(uuid, srcSnapshotLeaf.getUuid())) + .filter(uuid -> !Objects.equals(uuid, volume.getUuid())) + .collect(Collectors.toList()); + + List vos = new ArrayList<>(); + if (!descendantsUuid.isEmpty()) { + vos = Q.New(VolumeSnapshotVO.class).in(VolumeSnapshotVO_.uuid, descendantsUuid).list(); + vos.forEach(vo -> { + // update distance + vo.setDistance(vo.getDistance() - 1); + }); + } + + VolumeSnapshotTreeVO newTree = null; + // create new tree and update treeUuid + if (dstSnapshotInv.getParentUuid() == null) { + newTree = new VolumeSnapshotTreeVO(); + newTree.setCurrent(descendantsUuid.contains(volume.getUuid())); + newTree.setVolumeUuid(volume.getUuid()); + newTree.setUuid(Platform.getUuid()); + newTree.setStatus(VolumeSnapshotTreeStatus.Completed); + if (getAliveChainSnapshotUuids().contains(srcSnapshotInv.getUuid())) { + newTree.setCurrent(true); + } + dbf.persist(newTree); + logger.debug(String.format("created new volume snapshot tree[uuid:%s]", newTree.getUuid())); + } + if (!vos.isEmpty() && newTree != null) { + VolumeSnapshotTreeVO finalNewTree = newTree; + vos.forEach(vo -> vo.setTreeUuid(finalNewTree.getUuid())); + dbf.updateCollection(vos); + } + + if (newTree != null && Objects.equals(srcSnapshotInv.getUuid(), volume.getUuid()) + && q(VolumeSnapshotTreeVO.class).eq(VolumeSnapshotTreeVO_.uuid, dstSnapshotInv.getTreeUuid()).count() == 1) { + sql(VolumeSnapshotTreeVO.class).eq(VolumeSnapshotTreeVO_.uuid, srcSnapshotInv.getTreeUuid()) + .set(VolumeSnapshotTreeVO_.current, false).update(); + } + + sql(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.uuid, dstSnapshotInv.getUuid()) + .set(VolumeSnapshotVO_.primaryStorageInstallPath, srcSnapshotInv.getPrimaryStorageInstallPath()) + .set(VolumeSnapshotVO_.size, srcSnapshotInv.getSize()).update(); + if (dstSnapshotInv.getGroupUuid() != null) { + sql(VolumeSnapshotGroupRefVO.class) + .eq(VolumeSnapshotGroupRefVO_.volumeSnapshotGroupUuid, dstSnapshotInv.getGroupUuid()) + .eq(VolumeSnapshotGroupRefVO_.volumeSnapshotUuid, dstSnapshotInv.getUuid()) + .set(VolumeSnapshotGroupRefVO_.volumeSnapshotInstallPath, srcSnapshotInv.getPrimaryStorageInstallPath()) + .update(); + } + + sql(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.uuid, srcSnapshotInv.getUuid()) + .set(VolumeSnapshotVO_.primaryStorageInstallPath, dstSnapshotInv.getPrimaryStorageInstallPath()) + .set(VolumeSnapshotVO_.size, newInstallPathSize) + .set(VolumeSnapshotVO_.distance, srcSnapshotInv.getDistance() - 1) + .set(VolumeSnapshotVO_.parentUuid, dstSnapshotInv.getParentUuid()) + .set(VolumeSnapshotVO_.treeUuid, newTree != null ? newTree.getUuid() : srcSnapshotInv.getTreeUuid()) + .update(); + logger.debug(String.format("update the parent of snapshot[uuid:%s] to %s", srcSnapshotInv.getUuid(), dstSnapshotInv.getParentUuid())); + + if (srcSnapshotInv.getGroupUuid() != null) { + sql(VolumeSnapshotGroupRefVO.class) + .eq(VolumeSnapshotGroupRefVO_.volumeSnapshotGroupUuid, srcSnapshotInv.getGroupUuid()) + .eq(VolumeSnapshotGroupRefVO_.volumeSnapshotUuid, srcSnapshotInv.getUuid()) + .set(VolumeSnapshotGroupRefVO_.volumeSnapshotInstallPath, dstSnapshotInv.getPrimaryStorageInstallPath()) + .update(); + } + } + }.execute(); + } +} diff --git a/storage/src/main/java/org/zstack/storage/snapshot/group/VolumeSnapshotGroupBase.java b/storage/src/main/java/org/zstack/storage/snapshot/group/VolumeSnapshotGroupBase.java index dfd93922563..4463fe97847 100644 --- a/storage/src/main/java/org/zstack/storage/snapshot/group/VolumeSnapshotGroupBase.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/group/VolumeSnapshotGroupBase.java @@ -179,7 +179,6 @@ public String getName() { return "delete-snapshot-group"; } }); - } private void handleDelete(APIDeleteVolumeSnapshotGroupMsg msg, NoErrorCompletion completion) { @@ -187,6 +186,8 @@ private void handleDelete(APIDeleteVolumeSnapshotGroupMsg msg, NoErrorCompletion DeleteVolumeSnapshotGroupInnerMsg imsg = new DeleteVolumeSnapshotGroupInnerMsg(); imsg.setUuid(msg.getUuid()); imsg.setDeletionMode(msg.getDeletionMode()); + imsg.setScope(msg.getScope()); + imsg.setDirection(msg.getDirection()); bus.makeTargetServiceIdByResourceUuid(imsg, VolumeSnapshotConstant.SERVICE_ID, msg.getUuid()); overlaySend(imsg, new CloudBusCallBack(msg) { @Override @@ -218,7 +219,8 @@ private void handle(DeleteVolumeSnapshotGroupInnerMsg msg) { rmsg.setVolumeUuid(snapshot.getVolumeUuid()); rmsg.setTreeUuid(snapshot.getTreeUuid()); rmsg.setDeletionMode(msg.getDeletionMode()); - + rmsg.setScope(msg.getScope()); + rmsg.setDirection(msg.getDirection()); bus.makeTargetServiceIdByResourceUuid(rmsg, VolumeSnapshotConstant.SERVICE_ID, getResourceIdToRouteMsg(snapshot)); bus.send(rmsg, new CloudBusCallBack(compl) { @Override diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java b/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java index f1d918cbe3a..c9790563260 100755 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java @@ -166,8 +166,6 @@ private void handleLocalMessage(Message msg) { handle((FlattenVolumeMsg) msg); } else if (msg instanceof CancelFlattenVolumeMsg) { handle((CancelFlattenVolumeMsg) msg); - } else if (msg instanceof UndoSnapshotCreationMsg) { - handle((UndoSnapshotCreationMsg) msg); } else { bus.dealWithUnknownMessage(msg); } @@ -2966,6 +2964,8 @@ public void rollback(FlowRollback trigger, Map data) { DeleteVolumeSnapshotGroupInnerMsg imsg = new DeleteVolumeSnapshotGroupInnerMsg(); imsg.setUuid(((VolumeSnapshotGroupInventory) data.get(SNAPSHOT_GROUP_INV)).getUuid()); imsg.setDeletionMode(DeletionMode.Permissive); + imsg.setScope(DeleteVolumeSnapshotScope.Single.toString()); + imsg.setDirection(DeleteVolumeSnapshotDirection.Commit.toString()); bus.makeTargetServiceIdByResourceUuid(imsg, VolumeSnapshotConstant.SERVICE_ID, imsg.getUuid()); VolumeSnapshotGroupOverlayMsg omsg = new VolumeSnapshotGroupOverlayMsg(); omsg.setVmInstanceUuid(self.getVmInstanceUuid()); @@ -3423,217 +3423,29 @@ public void run(MessageReply reply) { }); } - private void undoSnapShotCreation(UndoSnapshotCreationMsg msg, ReturnValueCompletion completion) { - UndoSnapshotCreationReply reply = new UndoSnapshotCreationReply(); - VolumeSnapshotVO snapShot = dbf.findByUuid(msg.getSnapShot().getUuid(), VolumeSnapshotVO.class); - if (snapShot == null) { - logger.info(String.format("snapshot:%s has been deleted", msg.getSnapShot().getUuid())); - reply.setVolume(getSelfInventory()); - completion.success(reply); - return; - } - - FlowChain chain = FlowChainBuilder.newShareFlowChain(); - // currently, we only deal with overlay commit to snapshot - // TODO expand msg properties to support intermediate commit - chain.setName(String.format("undo-snapshot-snapshot-%s-creation", snapShot.getUuid())); - chain.then(new ShareFlow() { - String originVolumePath = self.getInstallPath(); - String newVolumeInstallPath; - long size; - - @Override - public void setup() { - flow(new NoRollbackFlow() { - String __name__ = "undo-snapshot-creation-on-primary-storage"; - - @Override - public void run(FlowTrigger trigger, Map data) { - UndoSnapshotCreationOnPrimaryStorageMsg bmsg = new UndoSnapshotCreationOnPrimaryStorageMsg(); - bmsg.setVolume(getSelfInventory()); - bmsg.setDstPath(snapShot.getPrimaryStorageInstallPath()); - bmsg.setSrcPath(originVolumePath); - bmsg.setSnapshot(VolumeSnapshotInventory.valueOf(snapShot)); - bmsg.setVmUuid(self.getVmInstanceUuid()); - bmsg.setPrimaryStorageUuid(self.getPrimaryStorageUuid()); - bus.makeTargetServiceIdByResourceUuid(bmsg, PrimaryStorageConstant.SERVICE_ID, self.getPrimaryStorageUuid()); - bus.send(bmsg, new CloudBusCallBack(trigger) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - trigger.fail(reply.getError()); - return; - } - - UndoSnapshotCreationOnPrimaryStorageReply treply = (UndoSnapshotCreationOnPrimaryStorageReply) reply; - newVolumeInstallPath = treply.getNewVolumeInstallPath(); - size = treply.getSize(); - trigger.next(); - } - }); - } - }); - - flow(new NoRollbackFlow() { - String __name__ = "update-db-install-path"; - - @Override - public boolean skip(Map data) { - return originVolumePath.equals(newVolumeInstallPath); - } - - @Override - public void run(FlowTrigger trigger, Map data) { - MarkSnapshotAsVolumeMsg mmsg = new MarkSnapshotAsVolumeMsg(); - mmsg.setVolumeUuid(self.getUuid()); - mmsg.setSnapshotUuid(snapShot.getUuid()); - mmsg.setSize(size); - mmsg.setVolumePath(newVolumeInstallPath); - mmsg.setTreeUuid(snapShot.getTreeUuid()); - bus.makeTargetServiceIdByResourceUuid(mmsg, VolumeSnapshotConstant.SERVICE_ID, snapShot.getUuid()); - bus.send(mmsg, new CloudBusCallBack(trigger) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - logger.warn(String.format("mark snapshot:%s as volume failed", snapShot.getUuid())); - trigger.fail(reply.getError()); - return; - } - - trigger.next(); - } - }); - } - }); - - flow(new NoRollbackFlow() { - String __name__ = "delete-origin-volume-bits"; - - @Override - public boolean skip(Map data) { - return originVolumePath.equals(newVolumeInstallPath); - } - - @Override - public void run(FlowTrigger trigger, Map data) { - DeleteVolumeBitsOnPrimaryStorageMsg dmsg = new DeleteVolumeBitsOnPrimaryStorageMsg(); - dmsg.setPrimaryStorageUuid(self.getPrimaryStorageUuid()); - dmsg.setInstallPath(originVolumePath); - dmsg.setSize(self.getSize()); - dmsg.setBitsType(VolumeVO.class.getSimpleName()); - dmsg.setBitsUuid(self.getUuid()); - dmsg.setHypervisorType(VolumeFormat.getMasterHypervisorTypeByVolumeFormat(getSelfInventory().getFormat()).toString()); - dmsg.setFolder(false); - dmsg.setFromRecycle(true); - bus.makeTargetServiceIdByResourceUuid(dmsg, PrimaryStorageConstant.SERVICE_ID, self.getPrimaryStorageUuid()); - bus.send(dmsg, new CloudBusCallBack(trigger) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - if (reply.getError().isError(VolumeErrors.VOLUME_IN_USE)) { - logger.warn(String.format("unable to delete path:%s right now", originVolumePath)); - } - - PrimaryStorageDeleteBitGC gc = new PrimaryStorageDeleteBitGC(); - gc.NAME = String.format("gc-delete-bits-volume-%s-on-primary-storage-%s", self.getUuid(), self.getPrimaryStorageUuid()); - gc.primaryStorageInstallPath = originVolumePath; - gc.primaryStorageUuid = self.getPrimaryStorageUuid(); - gc.volume = self; - gc.submit(PrimaryStorageGlobalConfig.PRIMARY_STORAGE_DELETEBITS_GARBAGE_COLLECTOR_INTERVAL.value(Long.class), - TimeUnit.SECONDS); - } - - trigger.next(); - } - }); - } - }); - - flow(new NoRollbackFlow() { - String __name__ = "release-origin-volume-size"; - - @Override - public void run(FlowTrigger trigger, Map data) { - RecalculatePrimaryStorageCapacityMsg rmsg = new RecalculatePrimaryStorageCapacityMsg(); - rmsg.setPrimaryStorageUuid(self.getPrimaryStorageUuid()); - bus.makeTargetServiceIdByResourceUuid(rmsg, PrimaryStorageConstant.SERVICE_ID, self.getPrimaryStorageUuid()); - bus.send(rmsg); - trigger.next(); - } - }); - - done(new FlowDoneHandler(completion) { - @Override - public void handle(Map data) { - refreshVO(); - reply.setVolume(getSelfInventory()); - completion.success(reply); - } - }); - - error(new FlowErrorHandler(completion) { - @Override - public void handle(ErrorCode errCode, Map data) { - completion.fail(errCode); - } - }); - } - }).start(); - } - - private void handle(UndoSnapshotCreationMsg msg) { - thdf.chainSubmit(new ChainTask(msg) { - @Override - public String getSyncSignature() { - return String.format("volume-%s-undo-snapshot-creation", self.getUuid()); - } - - @Override - public void run(final SyncTaskChain chain) { - undoSnapShotCreation(msg, new ReturnValueCompletion(chain) { - - @Override - public void success(UndoSnapshotCreationReply returnValue) { - bus.reply(msg, returnValue); - chain.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - UndoSnapshotCreationReply reply = new UndoSnapshotCreationReply(); - reply.setError(errorCode); - bus.reply(msg, reply); - chain.next(); - } - }); - } - - @Override - public String getName() { - return String.format("volume-%s-undo-snapshot-creation", self.getUuid()); - } - }); - } - private void handle(APIUndoSnapshotCreationMsg msg) { APIUndoSnapshotCreationEvent evt = new APIUndoSnapshotCreationEvent(msg.getId()); VolumeSnapshotVO snapShot = dbf.findByUuid(msg.getSnapShotUuid(), VolumeSnapshotVO.class); - UndoSnapshotCreationMsg vmsg = new UndoSnapshotCreationMsg(); - vmsg.setVmInstanceUuid(self.getVmInstanceUuid()); - vmsg.setVolumeUuid(msg.getVolumeUuid()); - vmsg.setSnapShot(VolumeSnapshotInventory.valueOf(snapShot)); - bus.makeTargetServiceIdByResourceUuid(vmsg, VolumeConstant.SERVICE_ID, msg.getVolumeUuid()); - bus.send(vmsg, new CloudBusCallBack(msg) { + DeleteVolumeSnapshotMsg dmsg = new DeleteVolumeSnapshotMsg(); + dmsg.setTreeUuid(snapShot.getTreeUuid()); + dmsg.setVolumeUuid(snapShot.getVolumeUuid()); + dmsg.setSnapshotUuid(snapShot.getUuid()); + dmsg.setDeletionMode(APIDeleteMessage.DeletionMode.Permissive); + dmsg.setScope(DeleteVolumeSnapshotScope.Single.toString()); + dmsg.setDirection(DeleteVolumeSnapshotDirection.Commit.toString()); + + bus.makeTargetServiceIdByResourceUuid(dmsg, VolumeSnapshotConstant.SERVICE_ID, snapShot.getUuid()); + bus.send(dmsg, new CloudBusCallBack(msg) { @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - evt.setError(reply.getError()); + public void run(MessageReply r) { + if (!r.isSuccess()) { + evt.setError(r.getError()); bus.publish(evt); return; } - UndoSnapshotCreationReply gr = reply.castReply(); - evt.setInventory(gr.getVolume()); + VolumeVO volumeVO = Q.New(VolumeVO.class).eq(VolumeVO_.uuid, snapShot.getVolumeUuid()).find(); + evt.setInventory(VolumeInventory.valueOf(volumeVO)); bus.publish(evt); } }); diff --git a/testlib/src/main/java/org/zstack/testlib/KVMSimulator.groovy b/testlib/src/main/java/org/zstack/testlib/KVMSimulator.groovy index 183de054f91..6e77c2dfeda 100755 --- a/testlib/src/main/java/org/zstack/testlib/KVMSimulator.groovy +++ b/testlib/src/main/java/org/zstack/testlib/KVMSimulator.groovy @@ -20,6 +20,7 @@ import org.zstack.header.volume.VolumeVO_ import org.zstack.kvm.KVMAgentCommands import org.zstack.kvm.KVMConstant import org.zstack.kvm.VolumeTO +import org.zstack.testlib.vfs.Qcow2 import org.zstack.testlib.vfs.VFS import org.zstack.testlib.vfs.extensions.VFSPrimaryStorageTakeSnapshotBackend import org.zstack.testlib.vfs.extensions.VFSSnapshot @@ -612,13 +613,51 @@ class KVMSimulator implements Simulator { } spec.simulator(KVMConstant.KVM_BLOCK_COMMIT_VOLUME_PATH) { HttpEntity e -> - KVMAgentCommands.BlockCommitVolumeCmd cmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.BlockCommitVolumeCmd.class) - def rsp = new KVMAgentCommands.BlockCommitVolumeResponse() - rsp.newVolumeInstallPath = cmd.base + def rsp = new BlockCommitResponse() rsp.size = 1 return rsp } + VFS.vfsHook(KVMConstant.KVM_BLOCK_COMMIT_VOLUME_PATH, spec) { rsp, HttpEntity e, EnvSpec espec -> + BlockCommitCmd cmd = JSONObjectUtil.toObject(e.body, BlockCommitCmd.class) + + VolumeVO volume = Q.New(VolumeVO.class).eq(VolumeVO_.uuid, cmd.volume.getVolumeUuid()).find() + assert volume : "cannot find volume[uuid: ${cmd.volume.getVolumeUuid()}]" + + String primaryStorageType = Q.New(PrimaryStorageVO.class).select(PrimaryStorageVO_.type) + .eq(PrimaryStorageVO_.uuid, volume.primaryStorageUuid).findValue() + assert primaryStorageType : "cannot find primary storage[uuid: ${volume.primaryStorageUuid}] " + + "from volume[uuid: ${volume.uuid}, name: ${volume.name}]" + + VFSPrimaryStorageTakeSnapshotBackend bkd = getVFSPrimaryStorageTakeSnapshotBackend(primaryStorageType) + bkd.blockCommit(e, espec, cmd, volume.toInventory() as VolumeInventory) + return rsp + } + + spec.simulator(KVMConstant.KVM_BLOCK_PULL_VOLUME_PATH) { HttpEntity e -> + def rsp = new BlockPullResponse() + rsp.size = 1 + return rsp + } + + VFS.vfsHook(KVMConstant.KVM_BLOCK_PULL_VOLUME_PATH, spec) { BlockPullResponse rsp, HttpEntity e, EnvSpec espec -> + BlockPullCmd cmd = JSONObjectUtil.toObject(e.body, BlockPullCmd.class) + + VolumeVO volume = Q.New(VolumeVO.class).eq(VolumeVO_.uuid, cmd.volume.getVolumeUuid()).find() + assert volume : "cannot find volume[uuid: ${cmd.getVolume().getVolumeUuid()}]" + + String primaryStorageType = Q.New(PrimaryStorageVO.class).select(PrimaryStorageVO_.type) + .eq(PrimaryStorageVO_.uuid, volume.primaryStorageUuid).findValue() + assert primaryStorageType : "cannot find primary storage[uuid: ${volume.primaryStorageUuid}] " + + "from volume[uuid: ${volume.uuid}, name: ${volume.name}]" + + VFSPrimaryStorageTakeSnapshotBackend bkd = getVFSPrimaryStorageTakeSnapshotBackend(primaryStorageType) + + Qcow2 newInstallPath = bkd.blockPull(e, espec, cmd, volume.toInventory() as VolumeInventory) + rsp.size = newInstallPath.actualSize == 0 ? 1 : newInstallPath.actualSize + return rsp + } + spec.simulator(KVMConstant.TAKE_VM_CONSOLE_SCREENSHOT_PATH) { def rsp = new KVMAgentCommands.TakeVmConsoleScreenshotRsp() rsp.imageData = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAABECAIAAADFvmZTAAACA0lEQVR4nO3VMYviQBQH8Hkvk5hE2ZUEU+juFlbKauH3/wYWNhYWKiiIRBDcZDckJJmZK6Zb7q44uJW7/f+qCcOQzP89XoSAL0FPT09VVTFzEARhGKZp2rat67qO4xhjlFJ5nidJcr1eHx8fPc+r65qZ27Zt2zbP83t//z9DRlFUVRURGWN83/c8z/O8Xq/HzFEUvb29aa211sxsgxZCKKWIKMuyPM9tSWypHMdRSmmtP72DmTudTlmWRCSl1Forpe5x2XuSSZJcLpeiKPr9flEUdV0LIZqm+fj4GI/H+/1+Npsdj8fX11chRFVV5/N5MBgIIZg5juP5fN7tdpfL5WAwiKJovV4Ph8MgCDabzWQyKcvycDgsFoskSVarlZTy+fl5t9udz2db2jvf/gsRETGz1tp13bZtbT8yszHGdqiNw66Z2W4ZY7TWUkqbl5TSGGOPSymFEHb+2Oa1u47jEFHTNFrrbxWxRQ8PD1LKuq7Lsux2u8zcNE1d10EQFEXR6XRc1yWiPM9937cxua6rlPrplIBfkS8vL2EYZlmWpul0OvV9/3Q6vb+/j0aj4/EYx3EYhkqp7XY7HA6TJDHG3G43IjocDnbsfsP2/OuIyP4P4U8Q0W8eAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgf/QDviYImvcayGAAAAAASUVORK5CYII=" diff --git a/testlib/src/main/java/org/zstack/testlib/LocalStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/LocalStorageSpec.groovy index c9c8e432ba3..747ca4388b1 100755 --- a/testlib/src/main/java/org/zstack/testlib/LocalStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/LocalStorageSpec.groovy @@ -120,9 +120,10 @@ class LocalStorageSpec extends PrimaryStorageSpec { Qcow2 file = vfs(e, cmd, spec).findFile { it.pathString() == cmd.path } assert file : "cannot find file[${cmd.path}]" - assert file.backingFile != null : "qcow2[${cmd.path}] has no backing file, ${file}" - rsp.backingFilePath = file.backingFile.toAbsolutePath().toString() + if (file.backingFile != null) { + rsp.backingFilePath = file.backingFile.toAbsolutePath().toString() + } rsp.size = 0 return rsp } @@ -508,11 +509,43 @@ class LocalStorageSpec extends PrimaryStorageSpec { Qcow2 snapshot = vfs.getFile(cmd.snapshotInstallPath) assert snapshot : "cannot find snapshot[${cmd.snapshotInstallPath}]" vfs.createQcow2(cmd.workspaceInstallPath, 0L, 0L, null) + rsp.actualSize = 1 return rsp } simulator(LocalStorageKvmBackend.OFFLINE_MERGE_PATH) { HttpEntity e, EnvSpec spec -> - return new LocalStorageKvmBackend.OfflineMergeSnapshotRsp() + def rsp = new LocalStorageKvmBackend.OfflineMergeSnapshotRsp() + rsp.actualSize = 1 + return rsp + } + + VFS.vfsHook(LocalStorageKvmBackend.OFFLINE_MERGE_PATH, espec) { LocalStorageKvmBackend.OfflineMergeSnapshotRsp rsp, HttpEntity e, EnvSpec spec -> + def cmd = JSONObjectUtil.toObject(e.body, LocalStorageKvmBackend.OfflineMergeSnapshotCmd.class) + VFS vfs = vfs(e, cmd, spec) + Qcow2 dst = vfs.getFile(cmd.destPath, true) + if (cmd.fullRebase) { + dst.rebase((String) null) + } else { + dst.rebase(cmd.srcPath) + } + rsp.actualSize = 1 + return rsp + } + + simulator(LocalStorageKvmBackend.OFFLINE_COMMIT_PATH) { HttpEntity e, EnvSpec spec -> + def rsp = new LocalStorageKvmBackend.OfflineCommitSnapshotRsp() + rsp.actualSize = 1 + return rsp + } + + VFS.vfsHook(LocalStorageKvmBackend.OFFLINE_COMMIT_PATH, espec) { rsp, HttpEntity e, EnvSpec spec -> + def cmd = JSONObjectUtil.toObject(e.body, LocalStorageKvmBackend.OfflineCommitSnapshotCmd.class) + VFS vfs = vfs(e, cmd, spec) + Qcow2 src = vfs.getFile(cmd.top) + Qcow2 dst = vfs.getFile(cmd.base) + Qcow2 qcow2 = Qcow2.commit(vfs, src, dst) + rsp.actualSize = qcow2.actualSize == 0 ? 1 : qcow2.actualSize + return rsp } simulator(LocalStorageKvmBackend.CHECK_INITIALIZED_FILE) { @@ -567,23 +600,6 @@ class LocalStorageSpec extends PrimaryStorageSpec { rsp.hashValue = cmd.installPath return rsp } - - VFS.vfsHook(LocalStorageKvmBackend.OFFLINE_MERGE_PATH, espec) { rsp, HttpEntity e, EnvSpec spec -> - def cmd = JSONObjectUtil.toObject(e.body, LocalStorageKvmBackend.OfflineMergeSnapshotCmd.class) - VFS vfs = vfs(e, cmd, spec) - - - Qcow2 dst = vfs.getFile(cmd.destPath) - assert dst : "cannot find destination file[${cmd.destPath}]" - if (cmd.fullRebase) { - dst.rebase((String) null) - } else { - Qcow2 src = vfs.getFile(cmd.srcPath) - assert src : "cannot find source file[${cmd.srcPath}]" - dst.rebase(cmd.srcPath) - } - return rsp - } } } diff --git a/testlib/src/main/java/org/zstack/testlib/NfsPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/NfsPrimaryStorageSpec.groovy index 5a02b592891..af186beb8a5 100755 --- a/testlib/src/main/java/org/zstack/testlib/NfsPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/NfsPrimaryStorageSpec.groovy @@ -125,7 +125,6 @@ class NfsPrimaryStorageSpec extends PrimaryStorageSpec { return rsp } - simulator(NfsPrimaryStorageKVMBackend.UNMOUNT_PRIMARY_STORAGE_PATH) { HttpEntity e -> Spec.checkHttpCallType(e, true) return new KVMAgentCommands.AgentResponse() @@ -234,24 +233,28 @@ class NfsPrimaryStorageSpec extends PrimaryStorageSpec { VFS.vfsHook(NfsPrimaryStorageKVMBackend.OFFLINE_SNAPSHOT_MERGE, xspec) { rsp, HttpEntity e, EnvSpec spec -> def cmd = JSONObjectUtil.toObject(e.body, NfsPrimaryStorageKVMBackendCommands.OfflineMergeSnapshotCmd.class) VFS vfs = vfs(cmd, spec) - - if (!cmd.fullRebase) { - Qcow2 src = vfs.getFile(cmd.srcPath) - src.rebase(cmd.destPath) + Qcow2 dst = vfs.getFile(cmd.destPath, true) + if (cmd.fullRebase) { + dst.rebase((String) null) } else { - // when full rebase requested - // general steps for offline Qcow2 merge operation has following steps: - // 1. create a temp Qcow2 file - // 2. convert Qcow2 on destPath to temp Qcow2 - // 3. replace Qcow2 on destPath with temp file - if (!vfs.exists(cmd.destPath)) { - vfs.createQcow2(cmd.destPath, 0, 0) - } - - Qcow2 dest = vfs.getFile(cmd.destPath) - dest.rebase(null) + dst.rebase(cmd.srcPath) } + return rsp + } + simulator(NfsPrimaryStorageKVMBackend.OFFLINE_SNAPSHOT_COMMIT) { + def rsp = new NfsPrimaryStorageKVMBackendCommands.OfflineCommitSnapshotRsp() + rsp.actualSize = 1 + return rsp + } + + VFS.vfsHook(NfsPrimaryStorageKVMBackend.OFFLINE_SNAPSHOT_COMMIT, xspec) { NfsPrimaryStorageKVMBackendCommands.OfflineCommitSnapshotRsp rsp, HttpEntity e, EnvSpec spec -> + def cmd = JSONObjectUtil.toObject(e.body, NfsPrimaryStorageKVMBackendCommands.OfflineCommitSnapshotCmd.class) + VFS vfs = vfs(cmd, spec) + Qcow2 src = vfs.getFile(cmd.top) + Qcow2 dst = vfs.getFile(cmd.base) + Qcow2 qcow2 = Qcow2.commit(vfs, src, dst) + rsp.actualSize = qcow2.actualSize == 0 ? 1 : qcow2.actualSize return rsp } diff --git a/testlib/src/main/java/org/zstack/testlib/SharedMountPointPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/SharedMountPointPrimaryStorageSpec.groovy index 59d1f2e0d9d..2735e198f25 100755 --- a/testlib/src/main/java/org/zstack/testlib/SharedMountPointPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/SharedMountPointPrimaryStorageSpec.groovy @@ -236,7 +236,38 @@ class SharedMountPointPrimaryStorageSpec extends PrimaryStorageSpec { } simulator(KvmBackend.OFFLINE_MERGE_SNAPSHOT_PATH) { - return new KvmBackend.AgentRsp() + def rsp = new KvmBackend.OfflineMergeSnapshotRsp() + rsp.actualSize = 1 + return rsp + } + + VFS.vfsHook(KvmBackend.OFFLINE_MERGE_SNAPSHOT_PATH, xspec) { KvmBackend.OfflineMergeSnapshotRsp rsp, HttpEntity e, EnvSpec spec -> + def cmd = JSONObjectUtil.toObject(e.body, KvmBackend.OfflineMergeSnapshotCmd.class) + VFS vfs = SharedMountPointPrimaryStorageSpec.vfs(cmd, spec) + Qcow2 dst = vfs.getFile(cmd.destPath, true) + if (cmd.fullRebase) { + dst.rebase((String) null) + } else { + dst.rebase(cmd.srcPath) + } + rsp.actualSize = 1 + return rsp + } + + simulator(KvmBackend.OFFLINE_COMMIT_SNAPSHOT_PATH) { + def rsp = new KvmBackend.OfflineCommitSnapshotRsp() + rsp.actualSize = 1 + return rsp + } + + VFS.vfsHook(KvmBackend.OFFLINE_COMMIT_SNAPSHOT_PATH, xspec) { KvmBackend.OfflineCommitSnapshotRsp rsp, HttpEntity e, EnvSpec spec -> + def cmd = JSONObjectUtil.toObject(e.body, KvmBackend.OfflineCommitSnapshotCmd.class) + VFS vfs = vfs(cmd, spec) + Qcow2 src = vfs.getFile(cmd.top) + Qcow2 dst = vfs.getFile(cmd.base) + Qcow2 qcow2 = Qcow2.commit(vfs, src, dst) + rsp.actualSize = qcow2.actualSize == 0 ? 1 : qcow2.actualSize + return rsp } simulator(KvmBackend.CREATE_EMPTY_VOLUME_PATH) { @@ -309,6 +340,29 @@ class SharedMountPointPrimaryStorageSpec extends PrimaryStorageSpec { rsp.hashValue = cmd.installPath return rsp } + + simulator(KvmBackend.GET_BACKING_CHAIN_PATH) { HttpEntity e, EnvSpec spec -> + return new KvmBackend.GetBackingChainRsp() + } + + VFS.vfsHook(KvmBackend.GET_BACKING_CHAIN_PATH, xspec) { rsp, HttpEntity e, EnvSpec spec -> + def cmd = JSONObjectUtil.toObject(e.body, KvmBackend.GetBackingChainCmd.class) + + List chain = [] + VFS vfs = SharedMountPointPrimaryStorageSpec.vfs(cmd, spec) + Qcow2 file = vfs.getFile(cmd.installPath) + if (file == null) { + logger.debug("Dump of whole VFS:\\n${vfs.dumpAsString()}") + } + assert file != null : "cannot find file[${cmd.installPath}]" + while (file.backingQcow2() != null) { + chain.add(file.backingQcow2().pathString()) + file = file.backingQcow2() + } + + rsp.backingChain = chain + return rsp + } } } diff --git a/testlib/src/main/java/org/zstack/testlib/vfs/Qcow2.groovy b/testlib/src/main/java/org/zstack/testlib/vfs/Qcow2.groovy index 056a42ad335..74ccf075f4d 100755 --- a/testlib/src/main/java/org/zstack/testlib/vfs/Qcow2.groovy +++ b/testlib/src/main/java/org/zstack/testlib/vfs/Qcow2.groovy @@ -168,5 +168,36 @@ class Qcow2 extends Volume { return baseImage } -} + List getChildren() { + List children = [] + vfs.walkFileSystem { vfile -> + if (vfile instanceof Qcow2 && vfile.backingFile != null && vfile.backingFile.toAbsolutePath().toString() == pathString()) { + children.add(vfile) + } + } + return children + } + + static Qcow2 commit(VFS vfs, Qcow2 top, Qcow2 base) { + assert top != null && base != null: "commit requires non-null top and base" + assert top.pathString() != base.pathString(): "top and base must differ" + + top.backingFile = null + top.update() + List childrenOfTop = top.getChildren() + childrenOfTop.forEach { children -> + children.backingFile = vfs.getPath(base.pathString()) + children.update() + } + return base + } + + static void pull(VFS vfs, String base, Qcow2 volumePath) { + if (base == null) { + volumePath.rebase((String) null) + } else { + volumePath.rebase(base) + } + } +} diff --git a/testlib/src/main/java/org/zstack/testlib/vfs/extensions/VFSPrimaryStorageTakeSnapshotBackend.groovy b/testlib/src/main/java/org/zstack/testlib/vfs/extensions/VFSPrimaryStorageTakeSnapshotBackend.groovy index 9570207a116..bdc327fc41f 100755 --- a/testlib/src/main/java/org/zstack/testlib/vfs/extensions/VFSPrimaryStorageTakeSnapshotBackend.groovy +++ b/testlib/src/main/java/org/zstack/testlib/vfs/extensions/VFSPrimaryStorageTakeSnapshotBackend.groovy @@ -3,10 +3,10 @@ package org.zstack.testlib.vfs.extensions import org.springframework.http.HttpEntity import org.zstack.header.storage.snapshot.TakeSnapshotsOnKvmJobStruct import org.zstack.header.storage.snapshot.TakeSnapshotsOnKvmResultStruct -import org.zstack.header.storage.snapshot.VolumeSnapshotInventory import org.zstack.header.volume.VolumeInventory import org.zstack.kvm.KVMAgentCommands import org.zstack.testlib.EnvSpec +import org.zstack.testlib.vfs.Qcow2 interface VFSPrimaryStorageTakeSnapshotBackend { String getPrimaryStorageType() @@ -24,4 +24,8 @@ interface VFSPrimaryStorageTakeSnapshotBackend { List takeSnapshotsOnVolumes(String primaryStorageUuid, HttpEntity e, EnvSpec spec, List snapshotJobs) void blockStream(HttpEntity e, EnvSpec spec, VolumeInventory volume) + + Qcow2 blockCommit(HttpEntity e, EnvSpec spec, KVMAgentCommands.BlockCommitCmd cmd, VolumeInventory volume) + + Qcow2 blockPull(HttpEntity e, EnvSpec spec, KVMAgentCommands.BlockPullCmd cmd, VolumeInventory volume) } diff --git a/testlib/src/main/java/org/zstack/testlib/vfs/storage/LocalStorageVFSPrimaryStorageTakeSnapshotBackend.groovy b/testlib/src/main/java/org/zstack/testlib/vfs/storage/LocalStorageVFSPrimaryStorageTakeSnapshotBackend.groovy index 108ad4d6563..9d59b128586 100755 --- a/testlib/src/main/java/org/zstack/testlib/vfs/storage/LocalStorageVFSPrimaryStorageTakeSnapshotBackend.groovy +++ b/testlib/src/main/java/org/zstack/testlib/vfs/storage/LocalStorageVFSPrimaryStorageTakeSnapshotBackend.groovy @@ -1,7 +1,6 @@ package org.zstack.testlib.vfs.storage import org.springframework.http.HttpEntity -import org.zstack.core.Platform import org.zstack.core.db.Q import org.zstack.core.db.SQL import org.zstack.header.storage.primary.PrimaryStorageVO @@ -117,6 +116,34 @@ class LocalStorageVFSPrimaryStorageTakeSnapshotBackend implements AbstractFileSy .find() VFS vfs = LocalStorageSpec.vfs(LocalStorageSpec.hostUuidFromHTTPHeaders(e), storagePath, spec) + if (vfs.exists(volume.getInstallPath())) { + vfs.delete(volume.getInstallPath()) + } blockStream(vfs, volume) } + + @Override + Qcow2 blockCommit(HttpEntity e, EnvSpec spec, KVMAgentCommands.BlockCommitCmd cmd, VolumeInventory volume) { + String storagePath = Q.New(PrimaryStorageVO.class) + .select(PrimaryStorageVO_.mountPath) + .eq(PrimaryStorageVO_.uuid, volume.primaryStorageUuid) + .findValue() + VFS vfs = LocalStorageSpec.vfs(LocalStorageSpec.hostUuidFromHTTPHeaders(e), storagePath, spec) + Qcow2 top = vfs.getFile(cmd.top, true) + Qcow2 base = vfs.getFile(cmd.base, true) + Qcow2.commit(vfs, top, base) + return vfs.getFile(cmd.base, true) + } + + @Override + Qcow2 blockPull(HttpEntity e, EnvSpec spec, KVMAgentCommands.BlockPullCmd cmd, VolumeInventory volume) { + String storagePath = Q.New(PrimaryStorageVO.class) + .select(PrimaryStorageVO_.mountPath) + .eq(PrimaryStorageVO_.uuid, volume.primaryStorageUuid) + .findValue() + VFS vfs = LocalStorageSpec.vfs(LocalStorageSpec.hostUuidFromHTTPHeaders(e), storagePath, spec) + Qcow2 volumePath = vfs.getFile(volume.getInstallPath(), true) + Qcow2.pull(vfs, cmd.base, volumePath) + return vfs.getFile(volume.getInstallPath(), true) + } } diff --git a/testlib/src/main/java/org/zstack/testlib/vfs/storage/NFSVFSPrimaryStorageTakeSnapshotBackend.groovy b/testlib/src/main/java/org/zstack/testlib/vfs/storage/NFSVFSPrimaryStorageTakeSnapshotBackend.groovy index 2358c8da6ab..a5826b0d973 100755 --- a/testlib/src/main/java/org/zstack/testlib/vfs/storage/NFSVFSPrimaryStorageTakeSnapshotBackend.groovy +++ b/testlib/src/main/java/org/zstack/testlib/vfs/storage/NFSVFSPrimaryStorageTakeSnapshotBackend.groovy @@ -10,8 +10,8 @@ import org.zstack.header.volume.VolumeVO_ import org.zstack.kvm.KVMAgentCommands import org.zstack.storage.primary.nfs.NfsPrimaryStorageConstant import org.zstack.testlib.EnvSpec -import org.zstack.testlib.LocalStorageSpec import org.zstack.testlib.NfsPrimaryStorageSpec +import org.zstack.testlib.vfs.Qcow2 import org.zstack.testlib.vfs.VFS import org.zstack.testlib.vfs.extensions.VFSPrimaryStorageTakeSnapshotBackend import org.zstack.testlib.vfs.extensions.VFSSnapshot @@ -48,6 +48,27 @@ class NFSVFSPrimaryStorageTakeSnapshotBackend implements AbstractFileSystemBased @Override void blockStream(HttpEntity e, EnvSpec spec, VolumeInventory volume) { - blockStream(NfsPrimaryStorageSpec.vfs(volume.getPrimaryStorageUuid(), spec), volume) + VFS vfs = NfsPrimaryStorageSpec.vfs(volume.getPrimaryStorageUuid(), spec) + if (vfs.exists(volume.getInstallPath())) { + vfs.delete(volume.getInstallPath()) + } + blockStream(vfs, volume) + } + + @Override + Qcow2 blockCommit(HttpEntity e, EnvSpec spec, KVMAgentCommands.BlockCommitCmd cmd, VolumeInventory volume) { + VFS vfs = NfsPrimaryStorageSpec.vfs(volume.getPrimaryStorageUuid(), spec) + Qcow2 top = vfs.getFile(cmd.top, true) + Qcow2 base = vfs.getFile(cmd.base, true) + Qcow2.commit(vfs, top, base) + return vfs.getFile(cmd.base, true) + } + + @Override + Qcow2 blockPull(HttpEntity e, EnvSpec spec, KVMAgentCommands.BlockPullCmd cmd, VolumeInventory volume) { + VFS vfs = NfsPrimaryStorageSpec.vfs(volume.getPrimaryStorageUuid(), spec) + Qcow2 volumePath = vfs.getFile(volume.getInstallPath(), true) + Qcow2.pull(vfs, cmd.base, volumePath) + return vfs.getFile(volume.getInstallPath(), true) } } diff --git a/testlib/src/main/java/org/zstack/testlib/vfs/storage/SMPVFSPrimaryStorageTakeSnapshotBackend.groovy b/testlib/src/main/java/org/zstack/testlib/vfs/storage/SMPVFSPrimaryStorageTakeSnapshotBackend.groovy index f0a5a5fcbf6..9cea533a330 100755 --- a/testlib/src/main/java/org/zstack/testlib/vfs/storage/SMPVFSPrimaryStorageTakeSnapshotBackend.groovy +++ b/testlib/src/main/java/org/zstack/testlib/vfs/storage/SMPVFSPrimaryStorageTakeSnapshotBackend.groovy @@ -1,14 +1,15 @@ package org.zstack.testlib.vfs.storage import org.springframework.http.HttpEntity -import org.zstack.core.Platform +import org.zstack.core.db.Q import org.zstack.header.storage.snapshot.TakeSnapshotsOnKvmJobStruct import org.zstack.header.storage.snapshot.TakeSnapshotsOnKvmResultStruct import org.zstack.header.volume.VolumeInventory +import org.zstack.header.volume.VolumeVO +import org.zstack.header.volume.VolumeVO_ import org.zstack.kvm.KVMAgentCommands import org.zstack.storage.primary.smp.SMPConstants import org.zstack.testlib.EnvSpec -import org.zstack.testlib.NfsPrimaryStorageSpec import org.zstack.testlib.SharedMountPointPrimaryStorageSpec import org.zstack.testlib.vfs.Qcow2 import org.zstack.testlib.vfs.VFS @@ -43,6 +44,27 @@ class SMPVFSPrimaryStorageTakeSnapshotBackend implements AbstractFileSystemBased @Override void blockStream(HttpEntity e, EnvSpec spec, VolumeInventory volume) { - blockStream(SharedMountPointPrimaryStorageSpec.vfs(volume.getPrimaryStorageUuid(), spec), volume) + VFS vfs = SharedMountPointPrimaryStorageSpec.vfs(volume.getPrimaryStorageUuid(), spec) + if (vfs.exists(volume.getInstallPath())) { + vfs.delete(volume.getInstallPath()) + } + blockStream(vfs, volume) + } + + @Override + Qcow2 blockCommit(HttpEntity e, EnvSpec spec, KVMAgentCommands.BlockCommitCmd cmd, VolumeInventory volume) { + VFS vfs = SharedMountPointPrimaryStorageSpec.vfs(volume.getPrimaryStorageUuid(), spec) + Qcow2 top = vfs.getFile(cmd.top, true) + Qcow2 base = vfs.getFile(cmd.base, true) + Qcow2.commit(vfs, top, base) + return vfs.getFile(cmd.base, true) + } + + @Override + Qcow2 blockPull(HttpEntity e, EnvSpec spec, KVMAgentCommands.BlockPullCmd cmd, VolumeInventory volume) { + VFS vfs = SharedMountPointPrimaryStorageSpec.vfs(volume.getPrimaryStorageUuid(), spec) + Qcow2 volumePath = vfs.getFile(volume.getInstallPath(), true) + Qcow2.pull(vfs, cmd.base, volumePath) + return vfs.getFile(volume.getInstallPath(), true) } } From bd801f65c44d492499014b1543324940e8a612dc Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Fri, 29 Aug 2025 10:17:48 +0800 Subject: [PATCH 512/737] [core]: load inner classes by correcting pattern matching Resolves: ZSTAC-76185 Change-Id: I737576185765547655441897574646678757a7a734578 (cherry picked from commit 67e8fc8e64c272cc52772115e8613b9f05249438) --- .../src/main/java/org/zstack/core/plugin/PluginManagerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java index 3f1015d5410..823a3ea91e9 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java +++ b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java @@ -353,7 +353,7 @@ protected void loadPluginsFromJar(File jarFile) { continue; } - if (entryName.matches(".*\\d.*")) { + if (entryName.matches(".*\\$\\d+\\.class$")) { // eg: org.zstack.CipherOnCloudCryptoPlugin$1.class continue; } From 07ec0e5df8d74d79bfa0c830dee37cf1ba491e83 Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Mon, 15 Sep 2025 10:32:51 +0800 Subject: [PATCH 513/737] [conf]: add GuestOS AlmaLinux Resolves: ZSTAC-77340 Change-Id: I6868776cffea076a7ac641a2bb96626c8b23af31 --- conf/guestOs/guestOsCategory.xml | 6 ++++++ conf/guestOs/guestOsCharacter.xml | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/conf/guestOs/guestOsCategory.xml b/conf/guestOs/guestOsCategory.xml index 166efcac33b..b444d32cecc 100644 --- a/conf/guestOs/guestOsCategory.xml +++ b/conf/guestOs/guestOsCategory.xml @@ -270,6 +270,12 @@ 10 Rocky Linux 10 + + Linux + AlmaLinux + 9 + AlmaLinux 9 + Linux AnolisOS diff --git a/conf/guestOs/guestOsCharacter.xml b/conf/guestOs/guestOsCharacter.xml index 22ae530379a..2714496712c 100644 --- a/conf/guestOs/guestOsCharacter.xml +++ b/conf/guestOs/guestOsCharacter.xml @@ -243,6 +243,11 @@ Linux Rocky Linux 10 + + x86_64 + Linux + AlmaLinux 9 + x86_64 Linux From e82df18ad570f154a345256482f1215168c40e42 Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Fri, 20 Jun 2025 13:51:11 +0800 Subject: [PATCH 514/737] [storage-device]: alarm when multipath default config changed 1.alarm when multipath default config changed 2.fixed multipath find_multipaths value is yes 3.automatically enable multipath service when installing the os Resolves/Related: ZSTAC-77506 Change-Id: I7a797462746a67706b6f676d7a726670696f6871 --- .../header/host/HostCanonicalEvents.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java b/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java index 46001b9f1ce..cca0e26567d 100755 --- a/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java +++ b/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java @@ -33,6 +33,7 @@ public class HostCanonicalEvents { public static final String HOST_PROCESS_PHYSICAL_MEMORY_USAGE_ABNORMAL = "/host/process/physicalMemory/usage/abnormal"; public static final String HOST_PING_SKIP = "/host/ping/skip"; public static final String HOST_PING_CANCEL_SKIP = "/host/ping/cancel/skip"; + public static final String HOST_MULTIPATH_CONFIG_CHANGED = "/host/multipathConfig/changed"; @NeedJsonSchema public static class HostPhysicalHbaPortStateAbnormalData { @@ -664,6 +665,28 @@ public void setInterfaceStatus(String interfaceStatus) { } } + @NeedJsonSchema + public static class MultipathConfigChangedData { + private String hostUuid; + private String details; + + public String getDetails() { + return details; + } + + public void setDetails(String details) { + this.details = details; + } + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + } + @NeedJsonSchema public static class HostProcessPhysicalMemoryUsageAlarmData { private String hostUuid; From bf78cacf34a376b996dc66e9d6218ac7b1db2a61 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Mon, 15 Sep 2025 11:06:53 +0800 Subject: [PATCH 515/737] [console]: change port range for console proxy APIImpact GlobalPropertyImpact Resolves: ZSTAC-77943 Change-Id: I70667073717179646368647a6d646b7979646375 --- .../ManagementServerConsoleProxyBackend.java | 18 ++++++++++++++++++ .../org/zstack/core/CoreGlobalProperty.java | 4 ++-- .../console/APIUpdateConsoleProxyAgentMsg.java | 2 +- .../sdk/UpdateConsoleProxyAgentAction.java | 2 +- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java b/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java index 664d2a127fa..3a414c1cf43 100755 --- a/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java +++ b/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java @@ -485,6 +485,24 @@ private void handle(UpdateConsoleProxyAgentMsg msg) { @Override public void setup() { + flow(new NoRollbackFlow() { + String __name__ = "verify-console-proxy-port"; + @Override + public void run(FlowTrigger trigger, Map data) { + ShellUtils.ShellRunner runner = new ShellUtils.ShellRunner(); + runner.setCommand(String.format("netstat -nltp4 | grep :%d\b", msg.getConsoleProxyPort())); + runner.setVerbose(false); + runner.setWithSudo(true); + runner.setSuppressTraceLog(true); + ShellResult res = runner.run(); + String stdout = res.getStdout(); + if (res.getRetCode() == 0) { + trigger.fail(argerr("there is other process using the port: %s", stdout)); + } else { + trigger.next(); + } + } + }); flow(new Flow() { String __name__ = "update-console-proxy-agent-vo"; @Override diff --git a/core/src/main/java/org/zstack/core/CoreGlobalProperty.java b/core/src/main/java/org/zstack/core/CoreGlobalProperty.java index ff1759b1cb1..393face30d3 100755 --- a/core/src/main/java/org/zstack/core/CoreGlobalProperty.java +++ b/core/src/main/java/org/zstack/core/CoreGlobalProperty.java @@ -61,11 +61,11 @@ public class CoreGlobalProperty { public static boolean IS_UPGRADE_START; @GlobalProperty(name = "shadowEntityOn", defaultValue = "false") public static boolean SHADOW_ENTITY_ON; - @NumberRange({1024, 49151}) + @NumberRange({1, 65535}) @GlobalProperty(name = "consoleProxyPort", defaultValue = "4900") public static int CONSOLE_PROXY_PORT; // for vnc @GlobalProperty(name = "httpConsoleProxyPort", defaultValue = "4901") - @NumberRange({1024, 49151}) + @NumberRange({1, 65535}) public static int HTTP_CONSOLE_PROXY_PORT; // for terminal @GlobalProperty(name = "consoleProxyCertFile", defaultValue = "") public static String CONSOLE_PROXY_CERT_FILE; diff --git a/header/src/main/java/org/zstack/header/console/APIUpdateConsoleProxyAgentMsg.java b/header/src/main/java/org/zstack/header/console/APIUpdateConsoleProxyAgentMsg.java index 16c44692e0f..c5b6ae7e4d1 100755 --- a/header/src/main/java/org/zstack/header/console/APIUpdateConsoleProxyAgentMsg.java +++ b/header/src/main/java/org/zstack/header/console/APIUpdateConsoleProxyAgentMsg.java @@ -18,7 +18,7 @@ public class APIUpdateConsoleProxyAgentMsg extends APIMessage implements Console private String uuid; @APIParam private String consoleProxyOverriddenIp; - @APIParam(required = false) + @APIParam(required = false, numberRange={1, 65535}) private int consoleProxyPort; public int getConsoleProxyPort() { diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateConsoleProxyAgentAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateConsoleProxyAgentAction.java index 4e34b0ea324..afd360cb79e 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateConsoleProxyAgentAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateConsoleProxyAgentAction.java @@ -31,7 +31,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String consoleProxyOverriddenIp; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {1L,65535L}, noTrim = false) public int consoleProxyPort = 0; @Param(required = false) From aa33b3cbb5123c40c406599c674a3e06913db0dc Mon Sep 17 00:00:00 2001 From: "haoyu.ding" Date: Tue, 16 Sep 2025 17:52:38 +0800 Subject: [PATCH 516/737] [securityGroup]: Change the method of hostuuid validation Resolves: ZSTAC-76988 Change-Id: I687670666e746372637574616d74627a6b6b7961 --- .../network/securitygroup/SecurityGroupManagerImpl.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java index b6c6d8719f4..ba7a4d41d7d 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java @@ -1033,12 +1033,8 @@ private void handle(RefreshSecurityGroupRulesOnVmMsg msg) { nicUuids = q.listValue(); } if (msg.getHostUuid() == null ||msg.getHostUuid().isEmpty()) { - String VmUuid = Q.New(VmNicVO.class).in(VmNicVO_.uuid, nicUuids) - .select(VmNicVO_.vmInstanceUuid) - .findValue(); - String HostUuid = Q.New(VmInstanceVO.class) - .eq(VmInstanceVO_.uuid, VmUuid) + .eq(VmInstanceVO_.uuid, msg.getVmInstanceUuid()) .select(VmInstanceVO_.hostUuid) .findValue(); From 0da36ea74d30ccc64cfe2c159de1f224b030661a Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Tue, 16 Sep 2025 15:15:43 +0800 Subject: [PATCH 517/737] [vxlan]: add L2NetworkClusterRefVO for vxlan pool Resolves: ZSTAC-78217 Change-Id: I71616f6777666f6d647469626a7a6f77786d6961 --- conf/springConfigXml/NetworkManager.xml | 6 ++++++ conf/springConfigXml/sdnController.xml | 6 ------ .../network/sdncontroller}/SdnControllerConstant.java | 2 +- .../sdncontroller}/SdnControllerDeletionMsg.java | 2 +- .../sdncontroller}/SdnControllerDeletionReply.java | 2 +- .../network/sdncontroller}/SdnControllerMessage.java | 2 +- .../sdncontroller}/SdnControllerRemoveHostMsg.java | 10 +--------- .../sdncontroller}/SdnControllerRemoveHostReply.java | 2 +- .../network/l2}/SdnControllerCascadeExtension.java | 8 ++------ .../java/org/zstack/sdnController/SdnController.java | 4 +--- .../sdnController/SdnControllerApiInterceptor.java | 6 +----- .../org/zstack/sdnController/SdnControllerBase.java | 5 ++++- .../java/org/zstack/sdnController/SdnControllerL2.java | 2 +- .../zstack/sdnController/SdnControllerLogAspect.java | 6 +++--- .../zstack/sdnController/SdnControllerManagerImpl.java | 5 +---- .../org/zstack/sdnController/SdnControllerPingMsg.java | 2 +- .../zstack/sdnController/SdnControllerPingTracker.java | 1 + .../sdnController/h3cVcfc/H3cVcfcApiInterceptor.java | 4 +--- .../sdnController/h3cVcfc/H3cVcfcSdnController.java | 8 +------- .../h3cVcfc/H3cVcfcSdnControllerFactory.java | 2 +- .../sdnController/h3cVcfc/H3cVcfcV2SdnController.java | 1 + .../hardwareVxlan/HardwareVxlanNetwork.java | 2 +- .../hardwareVxlan/HardwareVxlanNetworkFactory.java | 1 + .../hardwareVxlan/HardwareVxlanNetworkPoolFactory.java | 1 + .../KVMConnectExtensionForHardwareVxlanNetwork.java | 2 +- .../KVMRealizeHardwareVxlanNetworkBackend.java | 1 + .../KVMRealizeHardwareVxlanPoolNetworkBackend.java | 2 +- .../sdnController/header/APIAddSdnControllerEvent.java | 1 + .../sdnController/header/APIAddSdnControllerMsg.java | 1 + .../header/APIChangeSdnControllerMsg.java | 2 ++ .../header/APICreateL2HardwareVxlanNetworkMsg.java | 2 +- .../APICreateL2HardwareVxlanNetworkPoolEvent.java | 1 + .../header/APICreateL2HardwareVxlanNetworkPoolMsg.java | 1 + .../header/APIPullSdnControllerTenantMsg.java | 2 ++ .../sdnController/header/APIQuerySdnControllerMsg.java | 1 + .../header/APIReconnectSdnControllerEvent.java | 1 + .../header/APIReconnectSdnControllerMsg.java | 2 ++ .../header/APIRemoveSdnControllerMsg.java | 2 ++ .../header/APISdnControllerAddHostEvent.java | 1 + .../header/APISdnControllerAddHostMsg.java | 2 ++ .../header/APISdnControllerChangeHostEvent.java | 1 + .../header/APISdnControllerChangeHostMsg.java | 2 ++ .../header/APISdnControllerRemoveHostEvent.java | 1 + .../header/APISdnControllerRemoveHostMsg.java | 2 ++ .../header/APIUpdateSdnControllerEvent.java | 1 + .../header/APIUpdateSdnControllerMsg.java | 2 ++ .../header/HardwareL2VxlanNetworkInventory.java | 1 + .../header/HardwareL2VxlanNetworkPoolInventory.java | 1 + .../header/PullSdnControllerTenantMsg.java | 1 + .../header/ReconnectSdnControllerMsg.java | 1 + .../controller/SugonSdnController.java | 7 +------ .../controller/neutronClient/TfPortClient.java | 2 +- .../network/sdnController/HardwareVxlanCase.groovy | 2 +- .../network/sdnController/HardwareVxlanPoolCase.groovy | 2 +- .../network/sdnController/SdnControllerCase.groovy | 4 ++-- .../integration/other/mysqlschema/MustPassCase.groovy | 1 + 56 files changed, 75 insertions(+), 70 deletions(-) rename {plugin/sdnController/src/main/java/org/zstack/sdnController/header => header/src/main/java/org/zstack/header/network/sdncontroller}/SdnControllerConstant.java (97%) rename {plugin/sdnController/src/main/java/org/zstack/sdnController/header => header/src/main/java/org/zstack/header/network/sdncontroller}/SdnControllerDeletionMsg.java (89%) rename {plugin/sdnController/src/main/java/org/zstack/sdnController/header => header/src/main/java/org/zstack/header/network/sdncontroller}/SdnControllerDeletionReply.java (69%) rename {plugin/sdnController/src/main/java/org/zstack/sdnController/header => header/src/main/java/org/zstack/header/network/sdncontroller}/SdnControllerMessage.java (61%) rename {plugin/sdnController/src/main/java/org/zstack/sdnController/header => header/src/main/java/org/zstack/header/network/sdncontroller}/SdnControllerRemoveHostMsg.java (72%) rename {plugin/sdnController/src/main/java/org/zstack/sdnController/header => header/src/main/java/org/zstack/header/network/sdncontroller}/SdnControllerRemoveHostReply.java (70%) rename {plugin/sdnController/src/main/java/org/zstack/sdnController => network/src/main/java/org/zstack/network/l2}/SdnControllerCascadeExtension.java (95%) diff --git a/conf/springConfigXml/NetworkManager.xml b/conf/springConfigXml/NetworkManager.xml index d0babe3093a..1b964387eb4 100755 --- a/conf/springConfigXml/NetworkManager.xml +++ b/conf/springConfigXml/NetworkManager.xml @@ -142,6 +142,12 @@ + + + + + + diff --git a/conf/springConfigXml/sdnController.xml b/conf/springConfigXml/sdnController.xml index 83dead819ef..a9be9ec8795 100644 --- a/conf/springConfigXml/sdnController.xml +++ b/conf/springConfigXml/sdnController.xml @@ -68,12 +68,6 @@ - - - - - - diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerConstant.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerConstant.java similarity index 97% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerConstant.java rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerConstant.java index 9f9f56d2ebe..b6a6ddbe6ad 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerConstant.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerConstant.java @@ -1,4 +1,4 @@ -package org.zstack.sdnController.header; +package org.zstack.header.network.sdncontroller; import org.zstack.header.configuration.PythonClass; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerDeletionMsg.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerDeletionMsg.java similarity index 89% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerDeletionMsg.java rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerDeletionMsg.java index c74ff667458..104233ad9a8 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerDeletionMsg.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerDeletionMsg.java @@ -1,4 +1,4 @@ -package org.zstack.sdnController.header; +package org.zstack.header.network.sdncontroller; import org.zstack.header.message.DeletionMessage; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerDeletionReply.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerDeletionReply.java similarity index 69% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerDeletionReply.java rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerDeletionReply.java index e18dd0538e3..950b69084b0 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerDeletionReply.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerDeletionReply.java @@ -1,4 +1,4 @@ -package org.zstack.sdnController.header; +package org.zstack.header.network.sdncontroller; import org.zstack.header.message.MessageReply; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerMessage.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerMessage.java similarity index 61% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerMessage.java rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerMessage.java index 042ae3a541b..cddec39c551 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerMessage.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerMessage.java @@ -1,4 +1,4 @@ -package org.zstack.sdnController.header; +package org.zstack.header.network.sdncontroller; public interface SdnControllerMessage { String getSdnControllerUuid(); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerRemoveHostMsg.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerRemoveHostMsg.java similarity index 72% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerRemoveHostMsg.java rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerRemoveHostMsg.java index abb39e94f6f..69a11e7bdc6 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerRemoveHostMsg.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerRemoveHostMsg.java @@ -1,4 +1,4 @@ -package org.zstack.sdnController.header; +package org.zstack.header.network.sdncontroller; import org.zstack.header.message.NeedReplyMessage; @@ -8,14 +8,6 @@ public class SdnControllerRemoveHostMsg extends NeedReplyMessage implements SdnC private String vSwitchType; private boolean createChain = true; - public static SdnControllerRemoveHostMsg fromApi(APISdnControllerRemoveHostMsg amsg) { - SdnControllerRemoveHostMsg msg = new SdnControllerRemoveHostMsg(); - msg.setSdnControllerUuid(amsg.getSdnControllerUuid()); - msg.setHostUuid(amsg.getHostUuid()); - msg.setvSwitchType(amsg.getvSwitchType()); - return msg; - } - public void setSdnControllerUuid(String sdnControllerUuid) { this.sdnControllerUuid = sdnControllerUuid; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerRemoveHostReply.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerRemoveHostReply.java similarity index 70% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerRemoveHostReply.java rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerRemoveHostReply.java index 964a48d8697..9376a4d0649 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerRemoveHostReply.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerRemoveHostReply.java @@ -1,4 +1,4 @@ -package org.zstack.sdnController.header; +package org.zstack.header.network.sdncontroller; import org.zstack.header.message.MessageReply; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerCascadeExtension.java b/network/src/main/java/org/zstack/network/l2/SdnControllerCascadeExtension.java similarity index 95% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerCascadeExtension.java rename to network/src/main/java/org/zstack/network/l2/SdnControllerCascadeExtension.java index debd10d63c0..2fd70fb4c7c 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerCascadeExtension.java +++ b/network/src/main/java/org/zstack/network/l2/SdnControllerCascadeExtension.java @@ -1,4 +1,4 @@ -package org.zstack.sdnController; +package org.zstack.network.l2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; @@ -18,11 +18,7 @@ import org.zstack.header.identity.AccountInventory; import org.zstack.header.identity.AccountVO; import org.zstack.header.message.MessageReply; -import org.zstack.header.network.sdncontroller.SdnControllerHostRefVO; -import org.zstack.header.network.sdncontroller.SdnControllerHostRefVO_; -import org.zstack.header.network.sdncontroller.SdnControllerInventory; -import org.zstack.header.network.sdncontroller.SdnControllerVO; -import org.zstack.sdnController.header.*; +import org.zstack.header.network.sdncontroller.*; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.function.Function; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java index 6ed59cf090a..5de07d899f7 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java @@ -1,9 +1,7 @@ package org.zstack.sdnController; import org.zstack.header.core.Completion; -import org.zstack.header.network.sdncontroller.SdnControllerHostRefVO; -import org.zstack.header.network.sdncontroller.SdnControllerInventory; -import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.network.sdncontroller.*; import org.zstack.sdnController.header.*; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java index 06310557fa5..45073426427 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java @@ -14,10 +14,7 @@ import org.zstack.header.network.l2.L2NetworkConstant; import org.zstack.header.network.l3.L3NetworkVO; import org.zstack.header.network.l3.L3NetworkVO_; -import org.zstack.header.network.sdncontroller.SdnControllerHostRefVO; -import org.zstack.header.network.sdncontroller.SdnControllerHostRefVO_; -import org.zstack.header.network.sdncontroller.SdnControllerVO; -import org.zstack.header.network.sdncontroller.SdnControllerVO_; +import org.zstack.header.network.sdncontroller.*; import org.zstack.header.vm.APIAttachL3NetworkToVmMsg; import org.zstack.header.vm.APIChangeVmNicNetworkMsg; import org.zstack.header.vm.VmInstanceVO; @@ -35,7 +32,6 @@ import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Arrays; -import java.util.List; import java.util.Map; import static org.zstack.core.Platform.argerr; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java index b34e62ba11f..f4733f6a833 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java @@ -539,7 +539,10 @@ public String getName() { private void handle(APISdnControllerRemoveHostMsg amsg) { APISdnControllerRemoveHostEvent event = new APISdnControllerRemoveHostEvent(amsg.getId()); - SdnControllerRemoveHostMsg msg = SdnControllerRemoveHostMsg.fromApi(amsg); + SdnControllerRemoveHostMsg msg = new SdnControllerRemoveHostMsg(); + msg.setSdnControllerUuid(amsg.getSdnControllerUuid()); + msg.setHostUuid(amsg.getHostUuid()); + msg.setvSwitchType(amsg.getvSwitchType()); sdnControllerRemoveHostInQueue(msg, new Completion(msg) { @Override public void success() { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java index 283da0d16d1..502efb5f21f 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java @@ -8,7 +8,7 @@ import org.zstack.header.network.l3.L3NetworkInventory; import org.zstack.header.vm.VmNicInventory; import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; -import org.zstack.sdnController.header.SdnControllerDeletionMsg; +import org.zstack.header.network.sdncontroller.SdnControllerDeletionMsg; import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.sdnController.header.SdnVlanRange; import org.zstack.sdnController.header.SdnVniRange; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerLogAspect.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerLogAspect.java index 6f89f601c47..8eb382d76bc 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerLogAspect.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerLogAspect.java @@ -9,9 +9,9 @@ import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; import org.zstack.sdnController.header.APIAddSdnControllerMsg; -import org.zstack.sdnController.header.SdnControllerConstant.Processes; -import org.zstack.sdnController.header.SdnControllerConstant.Operations; -import org.zstack.sdnController.header.SdnControllerConstant.ResourceTypes; +import org.zstack.header.network.sdncontroller.SdnControllerConstant.Processes; +import org.zstack.header.network.sdncontroller.SdnControllerConstant.Operations; +import org.zstack.header.network.sdncontroller.SdnControllerConstant.ResourceTypes; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java index d0babd87c85..c9e939b63f4 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java @@ -25,9 +25,7 @@ import org.zstack.header.network.l3.L3NetworkInventory; import org.zstack.header.network.l3.L3NetworkVO; import org.zstack.header.network.l3.SdnControllerL3; -import org.zstack.header.network.sdncontroller.SdnControllerInventory; -import org.zstack.header.network.sdncontroller.SdnControllerStatus; -import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.network.sdncontroller.*; import org.zstack.header.network.service.GetSdnControllerExtensionPoint; import org.zstack.header.network.service.SdnControllerDhcp; import org.zstack.header.vm.*; @@ -38,7 +36,6 @@ import org.zstack.network.securitygroup.SecurityGroupSdnBackend; import org.zstack.sdnController.header.*; import org.zstack.tag.TagManager; -import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingMsg.java index a655e7be43a..22436283c17 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingMsg.java @@ -1,7 +1,7 @@ package org.zstack.sdnController; import org.zstack.header.message.NeedReplyMessage; -import org.zstack.sdnController.header.SdnControllerMessage; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; /** * Created by shixin.ruan on 06/26/2025. diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java index 951838093ec..2deeb4602aa 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java @@ -16,6 +16,7 @@ import org.zstack.header.message.MessageReply; import org.zstack.header.message.NeedReplyMessage; import org.zstack.header.network.l2.SdnControllerDeleteExtensionPoint; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.network.sdncontroller.SdnControllerStatus; import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.network.sdncontroller.SdnControllerVO_; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java index 726b3bd657e..8583a8b07ee 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java @@ -11,11 +11,9 @@ import org.zstack.header.network.l2.APIAttachL2NetworkToClusterMsg; import org.zstack.header.network.l2.APIDetachL2NetworkFromClusterMsg; import org.zstack.header.network.l3.*; -import org.zstack.header.network.sdncontroller.SdnControllerStatus; +import org.zstack.header.network.sdncontroller.*; import org.zstack.network.l2.L2NetworkSystemTags; import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolVO; -import org.zstack.header.network.sdncontroller.SdnControllerInventory; -import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.network.l2.vxlan.vxlanNetwork.APICreateL2VxlanNetworkMsg; import org.zstack.network.l2.vxlan.vxlanNetwork.APIDeleteVxlanL2Network; import org.zstack.network.l2.vxlan.vxlanNetworkPool.APICreateVniRangeMsg; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java index e563e8af159..f9afed355d9 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java @@ -12,16 +12,11 @@ import org.zstack.header.core.Completion; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; -import org.zstack.header.host.HostInventory; import org.zstack.header.message.Message; import org.zstack.header.network.l2.APICreateL2NetworkMsg; import org.zstack.header.network.l2.L2NetworkInventory; -import org.zstack.header.network.l3.IpRangeInventory; -import org.zstack.header.network.l3.L3NetworkInventory; -import org.zstack.header.network.sdncontroller.SdnControllerInventory; -import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.network.sdncontroller.*; import org.zstack.header.rest.RESTFacade; -import org.zstack.header.vm.VmNicInventory; import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; import org.zstack.sdnController.*; @@ -30,7 +25,6 @@ import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; -import javax.persistence.Tuple; import java.util.*; import static org.zstack.core.Platform.operr; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java index f65c41b5fad..2d297ca518c 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java @@ -2,12 +2,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.db.DatabaseFacade; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.network.securitygroup.SecurityGroupSdnBackend; import org.zstack.sdnController.SdnController; import org.zstack.sdnController.SdnControllerFactory; import org.zstack.sdnController.*; -import org.zstack.sdnController.header.*; public class H3cVcfcSdnControllerFactory implements SdnControllerFactory { SdnControllerType sdnControllerType = new SdnControllerType(SdnControllerConstant.H3C_VCFC_CONTROLLER); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java index 5239d9a01de..778d641c5e4 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java @@ -16,6 +16,7 @@ import org.zstack.header.network.l3.IpRangeInventory; import org.zstack.header.network.l3.L3NetworkConstant; import org.zstack.header.network.l3.L3NetworkInventory; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; import org.zstack.sdnController.SdnControllerLog; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java index 8bf3118dcac..b21d317c240 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java @@ -10,12 +10,12 @@ import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.host.*; import org.zstack.header.network.l2.*; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolVO; import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.network.l2.vxlan.vxlanNetwork.*; import org.zstack.sdnController.SdnControllerL2; import org.zstack.sdnController.SdnControllerManager; -import org.zstack.sdnController.header.*; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java index e6689831815..bc356a6a4c5 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java @@ -23,6 +23,7 @@ import org.zstack.header.network.l2.*; import org.zstack.header.network.l3.L3NetworkVO; import org.zstack.header.network.l3.L3NetworkVO_; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory; import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolVO; import org.zstack.header.network.sdncontroller.SdnControllerVO; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPoolFactory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPoolFactory.java index 27983cbb37d..e56adeeda2d 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPoolFactory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPoolFactory.java @@ -12,6 +12,7 @@ import org.zstack.header.message.APIMessage; import org.zstack.header.network.l2.*; import org.zstack.header.network.l3.APICreateL3NetworkMsg; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory; import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolVO; import org.zstack.header.network.sdncontroller.SdnControllerVO; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMConnectExtensionForHardwareVxlanNetwork.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMConnectExtensionForHardwareVxlanNetwork.java index 88ec1bdc2d6..2c90803b403 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMConnectExtensionForHardwareVxlanNetwork.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMConnectExtensionForHardwareVxlanNetwork.java @@ -20,7 +20,7 @@ import org.zstack.kvm.KVMHostConnectedContext; import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; -import org.zstack.sdnController.header.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import javax.persistence.TypedQuery; import java.util.ArrayList; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanNetworkBackend.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanNetworkBackend.java index d1870905066..71ccb7db63d 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanNetworkBackend.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanNetworkBackend.java @@ -13,6 +13,7 @@ import org.zstack.header.message.MessageReply; import org.zstack.header.network.l2.*; import org.zstack.header.network.l3.L3NetworkInventory; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.vm.VmInstanceVO; import org.zstack.header.vm.VmNicInventory; import org.zstack.kvm.*; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanPoolNetworkBackend.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanPoolNetworkBackend.java index f12ecb4dc40..df44da2ee64 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanPoolNetworkBackend.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanPoolNetworkBackend.java @@ -20,7 +20,7 @@ import org.zstack.kvm.KVMConstant; import org.zstack.kvm.KVMHostUtils; import org.zstack.network.service.MtuGetter; -import org.zstack.sdnController.header.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerEvent.java index 97a21595c59..8e8ffdffbc9 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerEvent.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerEvent.java @@ -1,6 +1,7 @@ package org.zstack.sdnController.header; import org.zstack.header.message.APIEvent; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.rest.RestResponse; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsg.java index ba582b27e99..2f544dd627a 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsg.java @@ -4,6 +4,7 @@ import org.zstack.header.identity.Action; import org.zstack.header.log.NoLogging; import org.zstack.header.message.*; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.other.APIAuditor; import org.zstack.header.rest.RestRequest; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerMsg.java index 00d72f17bd4..cd57adda7d9 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerMsg.java @@ -6,6 +6,8 @@ import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; import org.zstack.header.message.DefaultTimeout; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsg.java index 55b4628004d..55f71c8f8e5 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsg.java @@ -6,7 +6,7 @@ import org.zstack.header.message.OverriddenApiParam; import org.zstack.header.message.OverriddenApiParams; import org.zstack.header.network.l2.APICreateL2NetworkMsg; -import org.zstack.header.network.l2.L2NetworkVO; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; import org.zstack.header.tag.TagResourceType; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolEvent.java index c31f48fc7b7..5841ec9e943 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolEvent.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolEvent.java @@ -1,6 +1,7 @@ package org.zstack.sdnController.header; import org.zstack.header.network.l2.APICreateL2NetworkEvent; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.rest.RestResponse; /** diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolMsg.java index d0a09badd06..17a9a7b3ea9 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolMsg.java @@ -3,6 +3,7 @@ import org.springframework.http.HttpMethod; import org.zstack.header.message.APIParam; import org.zstack.header.network.l2.APICreateL2NetworkMsg; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsg.java index fa25bb4fd76..c2dbc23c40c 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsg.java @@ -4,6 +4,8 @@ import org.zstack.header.identity.Action; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerMsg.java index 46409b6cef4..bd092b0194b 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerMsg.java @@ -2,6 +2,7 @@ import org.springframework.http.HttpMethod; import org.zstack.header.identity.Action; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.query.APIQueryMessage; import org.zstack.header.query.AutoQuery; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEvent.java index 3f94369dad8..8c8b350fc20 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEvent.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEvent.java @@ -1,6 +1,7 @@ package org.zstack.sdnController.header; import org.zstack.header.message.APIEvent; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.rest.RestResponse; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsg.java index 1689091c7f0..0ecdf5c9615 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsg.java @@ -4,6 +4,8 @@ import org.zstack.header.identity.Action; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIRemoveSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIRemoveSdnControllerMsg.java index 4226ebff9b9..78c805b44d0 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIRemoveSdnControllerMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIRemoveSdnControllerMsg.java @@ -4,6 +4,8 @@ import org.zstack.header.identity.Action; import org.zstack.header.message.APIDeleteMessage; import org.zstack.header.message.APIParam; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEvent.java index 86b8f4f8836..4014d2a6d23 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEvent.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEvent.java @@ -1,6 +1,7 @@ package org.zstack.sdnController.header; import org.zstack.header.message.APIEvent; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.rest.RestResponse; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsg.java index 17d23cc3620..a4d8b601cdd 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsg.java @@ -6,6 +6,8 @@ import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; import org.zstack.header.network.l2.L2NetworkConstant; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEvent.java index 0cce7579422..ab86e2d07a9 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEvent.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEvent.java @@ -1,6 +1,7 @@ package org.zstack.sdnController.header; import org.zstack.header.message.APIEvent; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.rest.RestResponse; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsg.java index 31ecc3cb2b6..2dd5780b76c 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsg.java @@ -6,6 +6,8 @@ import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; import org.zstack.header.network.l2.L2NetworkConstant; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEvent.java index f9070811611..8229b842df2 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEvent.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEvent.java @@ -1,6 +1,7 @@ package org.zstack.sdnController.header; import org.zstack.header.message.APIEvent; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.rest.RestResponse; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java index a91d68faeba..6606c033c09 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java @@ -5,6 +5,8 @@ import org.zstack.header.identity.Action; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerEvent.java index e4327198594..3d720302ef9 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerEvent.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerEvent.java @@ -1,6 +1,7 @@ package org.zstack.sdnController.header; import org.zstack.header.message.APIEvent; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.rest.RestResponse; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerMsg.java index 90295b0c2bd..7ec4d9f4029 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerMsg.java @@ -4,6 +4,8 @@ import org.zstack.header.identity.Action; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkInventory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkInventory.java index f80dc90af3a..6820d8b9d89 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkInventory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkInventory.java @@ -2,6 +2,7 @@ import org.zstack.header.configuration.PythonClassInventory; import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.query.ExpandedQueries; import org.zstack.header.query.ExpandedQuery; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventory.java index 95bc77e4ded..2ede24d3e76 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventory.java @@ -3,6 +3,7 @@ import org.zstack.core.db.Q; import org.zstack.header.configuration.PythonClassInventory; import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.query.ExpandedQueries; import org.zstack.header.query.ExpandedQuery; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/PullSdnControllerTenantMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/PullSdnControllerTenantMsg.java index c70c94a5ec8..64837cd2b58 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/PullSdnControllerTenantMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/PullSdnControllerTenantMsg.java @@ -1,6 +1,7 @@ package org.zstack.sdnController.header; import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; /** * Created by boce.wang on 06/13/2025. diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerMsg.java index 37b6cc0b00d..dffe66fa86b 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerMsg.java @@ -1,6 +1,7 @@ package org.zstack.sdnController.header; import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; public class ReconnectSdnControllerMsg extends NeedReplyMessage implements SdnControllerMessage { private String controllerUuid; diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java index 89c08198ae6..45a68537e38 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java @@ -9,7 +9,6 @@ import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.header.core.Completion; -import org.zstack.header.host.HostInventory; import org.zstack.header.identity.AccountInventory; import org.zstack.header.identity.AccountVO; import org.zstack.header.identity.AccountVO_; @@ -18,10 +17,7 @@ import org.zstack.header.network.l2.L2NetworkInventory; import org.zstack.header.network.l2.L2NetworkVO; import org.zstack.header.network.l3.*; -import org.zstack.header.network.sdncontroller.SdnControllerInventory; -import org.zstack.header.network.sdncontroller.SdnControllerVO; -import org.zstack.header.network.sdncontroller.SdnControllerVO_; -import org.zstack.header.vm.VmNicInventory; +import org.zstack.header.network.sdncontroller.*; import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; import org.zstack.network.l3.L3NetworkSystemTags; import org.zstack.sdnController.SdnController; @@ -35,7 +31,6 @@ import org.zstack.utils.logging.CLogger; import org.zstack.utils.network.NetworkUtils; -import javax.persistence.Tuple; import java.util.*; import static org.zstack.core.Platform.operr; diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/neutronClient/TfPortClient.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/neutronClient/TfPortClient.java index 421201a8f0f..1054f708696 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/neutronClient/TfPortClient.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/neutronClient/TfPortClient.java @@ -5,7 +5,7 @@ import org.zstack.core.db.Q; import org.zstack.header.network.l3.L3NetworkVO; import org.zstack.header.network.l3.L3NetworkVO_; -import org.zstack.sdnController.header.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.network.sdncontroller.SdnControllerVO_; import org.zstack.sugonSdnController.controller.api.*; diff --git a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/HardwareVxlanCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/HardwareVxlanCase.groovy index d4370f43897..d5f0c01eb14 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/HardwareVxlanCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/HardwareVxlanCase.groovy @@ -7,7 +7,7 @@ import org.zstack.kvm.KVMConstant import org.zstack.network.l2.vxlan.vxlanNetworkPool.VxlanKvmAgentCommands import org.zstack.network.l2.vxlan.vxlanNetworkPool.VxlanNetworkPoolConstant import org.zstack.sdk.* -import org.zstack.sdnController.header.SdnControllerConstant +import org.zstack.header.network.sdncontroller.SdnControllerConstant import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase diff --git a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/HardwareVxlanPoolCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/HardwareVxlanPoolCase.groovy index 4997d76921a..3f12fbd43d0 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/HardwareVxlanPoolCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/HardwareVxlanPoolCase.groovy @@ -2,7 +2,7 @@ package org.zstack.test.integration.network.sdnController import org.zstack.core.db.DatabaseFacade import org.zstack.sdk.* -import org.zstack.sdnController.header.SdnControllerConstant +import org.zstack.header.network.sdncontroller.SdnControllerConstant import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase diff --git a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy index cf784182084..c07c9c3314c 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy @@ -13,14 +13,14 @@ import org.zstack.sdk.ZoneInventory import org.zstack.sdnController.SdnControllerGlobalConfig import org.zstack.sdnController.SdnControllerSystemTags import org.zstack.sdnController.h3cVcfc.H3cVcfcV2Commands -import org.zstack.sdnController.header.SdnControllerConstant +import org.zstack.header.network.sdncontroller.SdnControllerConstant import org.zstack.sdnController.header.H3cSdnControllerTenantVO import org.zstack.sdnController.header.H3cSdnControllerTenantVO_ import org.zstack.header.network.l3.L3NetworkConstant import org.zstack.sdnController.h3cVcfc.H3cVcfcSdnControllerSystemTags import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase -import org.zstack.utils.gson.JSONObjectUtil + /** * Created by shixin on 2019/09/30. */ diff --git a/test/src/test/groovy/org/zstack/test/integration/other/mysqlschema/MustPassCase.groovy b/test/src/test/groovy/org/zstack/test/integration/other/mysqlschema/MustPassCase.groovy index 952a8d924b6..11b4957fb32 100644 --- a/test/src/test/groovy/org/zstack/test/integration/other/mysqlschema/MustPassCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/other/mysqlschema/MustPassCase.groovy @@ -13,6 +13,7 @@ class MustPassCase extends SubCase { @Override void setup() { + useSpring(Mysql57Test.springSpec) } @Override From 6b2a24695b73e4df14cea37a22d88ccdb343df01 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Tue, 16 Sep 2025 18:24:09 +0800 Subject: [PATCH 518/737] [vxlan]: add L2NetworkClusterRefVO even no host in cluster Resolves: ZSTAC-78318 Change-Id: I6270767268657a78777363616861627a6a776e65 --- .../vxlanNetworkPool/VxlanNetworkPool.java | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanNetworkPool.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanNetworkPool.java index 3148a31f42d..68d20f08df8 100755 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanNetworkPool.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanNetworkPool.java @@ -833,6 +833,25 @@ protected void afterAttachVxlanPoolFromClusterFailed(APIAttachL2NetworkToCluster } } + private void addVxlanNetworkClusterRefs(String clusterUuid, String l2Uuid) { + List refs = new ArrayList<>(); + L2NetworkClusterRefVO rvo = new L2NetworkClusterRefVO(); + rvo.setClusterUuid(clusterUuid); + rvo.setL2NetworkUuid(l2Uuid); + refs.add(rvo); + + List uuids = Q.New(VxlanNetworkVO.class) + .select(VxlanNetworkVO_.uuid).eq(VxlanNetworkVO_.poolUuid, l2Uuid).listValues(); + for (String uuid : uuids) { + rvo = new L2NetworkClusterRefVO(); + rvo.setClusterUuid(clusterUuid); + rvo.setL2NetworkUuid(uuid); + refs.add(rvo); + } + + dbf.persistCollection(refs); + } + private void handle(final APIAttachL2NetworkToClusterMsg msg) { final APIAttachL2NetworkToClusterEvent evt = new APIAttachL2NetworkToClusterEvent(msg.getId()); SimpleQuery rq = dbf.createQuery(L2NetworkClusterRefVO.class); @@ -857,6 +876,8 @@ private void handle(final APIAttachL2NetworkToClusterMsg msg) { query.add(HostVO_.status, SimpleQuery.Op.EQ, HostStatus.Connected); final List hosts = query.list(); if (hosts.isEmpty()) { + addVxlanNetworkClusterRefs(msg.getClusterUuid(), msg.getL2NetworkUuid()); + self = dbf.reload(self); evt.setInventory(self.toInventory()); bus.publish(evt); return; @@ -867,20 +888,7 @@ private void handle(final APIAttachL2NetworkToClusterMsg msg) { prepareL2NetworkOnHosts(msg.getL2NetworkUuid(), hvinvs, true, new Completion(msg) { @Override public void success() { - L2NetworkClusterRefVO rvo = new L2NetworkClusterRefVO(); - rvo.setClusterUuid(msg.getClusterUuid()); - rvo.setL2NetworkUuid(self.getUuid()); - dbf.persist(rvo); - - List uuids = Q.New(VxlanNetworkVO.class) - .select(VxlanNetworkVO_.uuid).eq(VxlanNetworkVO_.poolUuid, msg.getL2NetworkUuid()).listValues(); - for (String uuid : uuids) { - rvo = new L2NetworkClusterRefVO(); - rvo.setClusterUuid(msg.getClusterUuid()); - rvo.setL2NetworkUuid(uuid); - dbf.persist(rvo); - } - + addVxlanNetworkClusterRefs(msg.getClusterUuid(), msg.getL2NetworkUuid()); logger.debug(String.format("successfully attached L2VxlanNetworkPool[uuid:%s] to cluster [uuid:%s]", self.getUuid(), msg.getClusterUuid())); self = dbf.findByUuid(self.getUuid(), L2NetworkVO.class); From 9f6291aeac4c846826051f18da88e6c95f83336d Mon Sep 17 00:00:00 2001 From: J M Date: Tue, 16 Sep 2025 18:28:58 +0800 Subject: [PATCH 519/737] [message]: support sync vm systag Resolves: ZSTAC-78120 Change-Id: I777a737a67686b6f77726b77726c62656d6e6273 --- .../java/org/zstack/header/message/NeedReplyMessage.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/header/src/main/java/org/zstack/header/message/NeedReplyMessage.java b/header/src/main/java/org/zstack/header/message/NeedReplyMessage.java index 052015e5f2b..20aa9427295 100755 --- a/header/src/main/java/org/zstack/header/message/NeedReplyMessage.java +++ b/header/src/main/java/org/zstack/header/message/NeedReplyMessage.java @@ -32,6 +32,14 @@ public boolean hasSystemTag(Predicate isMatch) { return systemTags != null && systemTags.stream().anyMatch(isMatch); } + public boolean removeSystemTag(Predicate isMatch) { + if (systemTags == null) { + return false; + } + + return systemTags.removeIf(isMatch); + } + public void addSystemTag(String systemTag){ if (systemTags == null) { systemTags = new ArrayList<>(); From 53916c06fd8ef7bba996da38da2e5a0c775d0938 Mon Sep 17 00:00:00 2001 From: zhangjianjun Date: Mon, 7 Jul 2025 17:39:39 +0800 Subject: [PATCH 520/737] [sdnController]: only set lacp to active on balance-tcp mode Resolves: ZSTAC-76047 Change-Id: I696e6f676a737062666b62756e6e7176756a7a76 Signed-off-by: zhangjianjun --- .../org/zstack/sdnController/SdnControllerApiInterceptor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java index 45073426427..741a99cdb70 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java @@ -236,7 +236,7 @@ private void validate(APISdnControllerAddHostMsg msg) { msg.setBondMode(L2NetworkConstant.BONDING_MODE_AB); } - if (msg.getBondMode() != null && msg.getLacpMode() == null) { + if (msg.getBondMode() != null && msg.getBondMode().equals(L2NetworkConstant.BONDING_MODE_TCP) && msg.getLacpMode() == null) { msg.setLacpMode(L2NetworkConstant.LACP_MODE_ACTIVE); } } From 16e70dfdd843eae683f076c23c2504670536f270 Mon Sep 17 00:00:00 2001 From: littleya Date: Tue, 16 Sep 2025 18:21:26 +0800 Subject: [PATCH 521/737] [kvm]: add Tengyun-S5000C as option of cpu model GlobalConfigImpact Resolves: ZSTAC-78282 Change-Id: I6c64627774687774656c796c7179626b6f626b67 --- plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalConfig.java | 2 +- .../test/integration/core/config/GlobalConfigCase.groovy | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalConfig.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalConfig.java index 933c3b7b384..aa0fd787bed 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalConfig.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalConfig.java @@ -47,7 +47,7 @@ public class KVMGlobalConfig { "Dhyana", "EPYC", "EPYC-IBPB", "Haswell", "Haswell-noTSX", "Broadwell", "Broadwell-noTSX", "SandyBridge", "IvyBridge", "Conroe", "Penryn", "Nehalem", "Westmere", "Opteron_G1", "Opteron_G2", "Opteron_G3", "Opteron_G4", "pentium", "pentium2", "pentium3", - "Kunpeng-920", "FT-2000+", "Tengyun-S2500", "Loongson-3A5000", "Loongson-3A4000-COMP"}) + "Kunpeng-920", "FT-2000+", "Tengyun-S2500", "Tengyun-S5000C", "Loongson-3A5000", "Loongson-3A4000-COMP"}) @BindResourceConfig({VmInstanceVO.class, ClusterVO.class}) public static GlobalConfig NESTED_VIRTUALIZATION = new GlobalConfig(CATEGORY, "vm.cpuMode"); @GlobalConfigValidation diff --git a/test/src/test/groovy/org/zstack/test/integration/core/config/GlobalConfigCase.groovy b/test/src/test/groovy/org/zstack/test/integration/core/config/GlobalConfigCase.groovy index 2a953a95c9f..fb03e56b403 100755 --- a/test/src/test/groovy/org/zstack/test/integration/core/config/GlobalConfigCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/config/GlobalConfigCase.groovy @@ -124,8 +124,8 @@ class GlobalConfigCase extends SubCase { name = KVMGlobalConfig.NESTED_VIRTUALIZATION.name } as GetGlobalConfigOptionsResult - // there are 27 valid values for category "vm.cpuMode" from KVMGlobalConfig.java - assert configOptions.options.validValue.size() == 28 + // there are 29 valid values for category "vm.cpuMode" from KVMGlobalConfig.java + assert configOptions.options.validValue.size() == 29 } void testGetNumberRange() { From 4cfa4a9c0a822a7248de5a65bd8cb211942be093 Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Wed, 6 Aug 2025 17:51:24 +0800 Subject: [PATCH 522/737] [compute]: resolve issue where reserved CPU settings were not applied Resolves: ZSTAC-76533 Change-Id: 202cb7653359075b964b07152d234b70 (cherry picked from commit 0a06bf39fd83454585024a747e9f73519ae69fdc) --- .../allocator/HostCapacityReserveManagerImpl.java | 2 +- conf/globalConfig/kvm.xml | 2 +- .../CheckHostCapacityWhenAddHostCase.groovy | 14 ++++++++++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/allocator/HostCapacityReserveManagerImpl.java b/compute/src/main/java/org/zstack/compute/allocator/HostCapacityReserveManagerImpl.java index b6376025859..aa4a0a6de31 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/HostCapacityReserveManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/allocator/HostCapacityReserveManagerImpl.java @@ -266,7 +266,7 @@ private void reserveCapacityWithChecking(String hostUuid, long requestCpu, long updater.run(cap -> { long availCpu = cap.getAvailableCpu() - requestCpu; - if (requestCpu != 0 && availCpu < 0) { + if (requestCpu != 0 && availCpu - ret.getReservedCpuCapacity() < 0) { throw new UnableToReserveHostCapacityException( String.format("no enough CPU[%s] on the host[uuid:%s]", requestCpu, hostUuid)); } diff --git a/conf/globalConfig/kvm.xml b/conf/globalConfig/kvm.xml index f600dbb12bc..76d53a5453a 100755 --- a/conf/globalConfig/kvm.xml +++ b/conf/globalConfig/kvm.xml @@ -28,7 +28,7 @@ kvm reservedCpu The CPU capacity reserved on all KVM hosts. ZStack KVM agent is a python web server that needs some CPU capacity to run, this value reserve a portion of CPU for the agent as well as other host applications. The value can be overriden by system tag on individual host, cluster and zone level - 512 + 0 diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/capacity/CheckHostCapacityWhenAddHostCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/capacity/CheckHostCapacityWhenAddHostCase.groovy index b8c046775a2..2ae56b73372 100755 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/capacity/CheckHostCapacityWhenAddHostCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/capacity/CheckHostCapacityWhenAddHostCase.groovy @@ -5,10 +5,10 @@ import org.zstack.kvm.KVMAgentCommands import org.zstack.kvm.KVMConstant import org.zstack.kvm.KVMGlobalConfig import org.zstack.sdk.AddKVMHostAction +import org.zstack.sdk.ClusterInventory import org.zstack.sdk.GetCpuMemoryCapacityResult import org.zstack.test.integration.kvm.KvmTest import org.zstack.test.integration.kvm.host.HostEnv -import org.zstack.sdk.ClusterInventory import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase import org.zstack.utils.data.SizeUnit @@ -64,7 +64,7 @@ class CheckHostCapacityWhenAddHostCase extends SubCase { clusterUuids = [cluster.uuid] } - KVMGlobalConfig.RESERVED_CPU_CAPACITY.updateValue(result.availableCpu) + KVMGlobalConfig.RESERVED_CPU_CAPACITY.updateValue(76) createVmInstance { name = "vm" @@ -73,6 +73,16 @@ class CheckHostCapacityWhenAddHostCase extends SubCase { instanceOfferingUuid = instanceOffering.uuid clusterUuid = cluster.uuid } + + expect(AssertionError.class) { + createVmInstance { + name = "4c-vm" + imageUuid = image.uuid + l3NetworkUuids = [l3.uuid] + instanceOfferingUuid = instanceOffering.uuid + clusterUuid = cluster.uuid + } + } } void testCheckCapacityWhenAddHost() { From 6aef79fd49d77fe0402364efa55b477209413fdc Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Wed, 17 Sep 2025 17:28:15 +0800 Subject: [PATCH 523/737] [console]: fix APIUpdateConsoleProxyAgentMsg type error APIImpact Resolves: ZSTAC-77943 Change-Id: I696a776e6d6f68667071656e756d7376667a6471 --- .../header/console/APIUpdateConsoleProxyAgentMsg.java | 6 +++--- .../console/APIUpdateConsoleProxyAgentMsgDoc_zh_cn.groovy | 2 +- .../java/org/zstack/sdk/UpdateConsoleProxyAgentAction.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/header/src/main/java/org/zstack/header/console/APIUpdateConsoleProxyAgentMsg.java b/header/src/main/java/org/zstack/header/console/APIUpdateConsoleProxyAgentMsg.java index c5b6ae7e4d1..b9f2792ea65 100755 --- a/header/src/main/java/org/zstack/header/console/APIUpdateConsoleProxyAgentMsg.java +++ b/header/src/main/java/org/zstack/header/console/APIUpdateConsoleProxyAgentMsg.java @@ -19,13 +19,13 @@ public class APIUpdateConsoleProxyAgentMsg extends APIMessage implements Console @APIParam private String consoleProxyOverriddenIp; @APIParam(required = false, numberRange={1, 65535}) - private int consoleProxyPort; + private Integer consoleProxyPort; - public int getConsoleProxyPort() { + public Integer getConsoleProxyPort() { return consoleProxyPort; } - public void setConsoleProxyPort(int consoleProxyPort) { + public void setConsoleProxyPort(Integer consoleProxyPort) { this.consoleProxyPort = consoleProxyPort; } diff --git a/header/src/main/java/org/zstack/header/console/APIUpdateConsoleProxyAgentMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/console/APIUpdateConsoleProxyAgentMsgDoc_zh_cn.groovy index acaa07c57f0..914e5a128c3 100644 --- a/header/src/main/java/org/zstack/header/console/APIUpdateConsoleProxyAgentMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/console/APIUpdateConsoleProxyAgentMsgDoc_zh_cn.groovy @@ -62,7 +62,7 @@ doc { enclosedIn "updateConsoleProxyAgent" desc "" location "body" - type "int" + type "Integer" optional true since "4.1.0" } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateConsoleProxyAgentAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateConsoleProxyAgentAction.java index afd360cb79e..da6a400c4b6 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateConsoleProxyAgentAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateConsoleProxyAgentAction.java @@ -32,7 +32,7 @@ public Result throwExceptionIfError() { public java.lang.String consoleProxyOverriddenIp; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {1L,65535L}, noTrim = false) - public int consoleProxyPort = 0; + public java.lang.Integer consoleProxyPort; @Param(required = false) public java.util.List systemTags; From fd4785f9d333655a60b8209d8a106d7228e7cd68 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Thu, 18 Sep 2025 10:35:39 +0800 Subject: [PATCH 524/737] [console]: fix console proxy agent Resolves: ZSTAC-77943 Change-Id: I636d7669616b777075696c656968706869686d62 --- .../console/ManagementServerConsoleProxyBackend.java | 7 ++++++- .../test/integration/console/ConsoleProxyCase.groovy | 8 ++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java b/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java index 3a414c1cf43..377517d8b0a 100755 --- a/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java +++ b/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java @@ -480,7 +480,7 @@ private void handle(UpdateConsoleProxyAgentMsg msg) { ConsoleProxyAgentVO vo; String oldProxyIp; int oldProxyPort; - int newProxyPort = msg.getConsoleProxyPort() == 0 ? CoreGlobalProperty.CONSOLE_PROXY_PORT : msg.getConsoleProxyPort(); + int newProxyPort = msg.getConsoleProxyPort() == null ? CoreGlobalProperty.CONSOLE_PROXY_PORT : msg.getConsoleProxyPort(); @Override @@ -489,6 +489,11 @@ public void setup() { String __name__ = "verify-console-proxy-port"; @Override public void run(FlowTrigger trigger, Map data) { + if (msg.getConsoleProxyPort() == null) { + trigger.next(); + return; + } + ShellUtils.ShellRunner runner = new ShellUtils.ShellRunner(); runner.setCommand(String.format("netstat -nltp4 | grep :%d\b", msg.getConsoleProxyPort())); runner.setVerbose(false); diff --git a/test/src/test/groovy/org/zstack/test/integration/console/ConsoleProxyCase.groovy b/test/src/test/groovy/org/zstack/test/integration/console/ConsoleProxyCase.groovy index a02602cc64d..94f1fb161d0 100644 --- a/test/src/test/groovy/org/zstack/test/integration/console/ConsoleProxyCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/console/ConsoleProxyCase.groovy @@ -195,6 +195,14 @@ class ConsoleProxyCase extends SubCase { } ConsoleProxyAgentVO agent = dbf.listAll(ConsoleProxyAgentVO)[0] + + updateConsoleProxyAgent { + uuid = agent.uuid + consoleProxyOverriddenIp = "127.0.0.2" + } + agent = dbf.reload(agent) + assert agent.consoleProxyOverriddenIp == "127.0.0.2" + updateConsoleProxyAgent { uuid = agent.uuid consoleProxyOverriddenIp = "127.0.0.1" From ec720d5cac07e3efdf8ad2f170112b6715745388 Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Thu, 18 Sep 2025 13:01:05 +0800 Subject: [PATCH 525/737] [utils]: Endpoint check connection Resolves: ZSTAC-77924 Change-Id: I6d676f74786f756d74627173617166687576736f --- utils/src/main/java/org/zstack/utils/DomainUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/src/main/java/org/zstack/utils/DomainUtils.java b/utils/src/main/java/org/zstack/utils/DomainUtils.java index f8ff559c6e1..f85e501984f 100644 --- a/utils/src/main/java/org/zstack/utils/DomainUtils.java +++ b/utils/src/main/java/org/zstack/utils/DomainUtils.java @@ -16,7 +16,7 @@ public static String getDomain(String url) { } public static Boolean curl(String url) { - String command = String.format("curl -sf --head --connect-timeout 5 %s", url); + String command = String.format("curl -s --head --connect-timeout 5 %s", url); ShellResult rst = ShellUtils.runAndReturn(command, true); return rst.getRetCode() == 0; } From 7bba0932e601ed87fe4aeb21e840beaff3245cf9 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Thu, 18 Sep 2025 16:59:06 +0800 Subject: [PATCH 526/737] [network]: add hostRefs in SdnControllerInventory Resolves: ZSTAC-78370 Change-Id: I697970747075646a68616a74756f69656a6b6c75 --- .../sdncontroller/SdnControllerInventory.java | 10 +++ sdk/src/main/java/SourceClassMap.java | 2 + .../sdk/SdnControllerHostRefInventory.java | 79 +++++++++++++++++++ .../zstack/sdk/SdnControllerInventory.java | 8 ++ 4 files changed, 99 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/SdnControllerHostRefInventory.java diff --git a/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerInventory.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerInventory.java index cfcdeb2ffe8..9f364f79136 100644 --- a/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerInventory.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerInventory.java @@ -21,6 +21,7 @@ public class SdnControllerInventory implements Serializable { private String username; private String password; private SdnControllerStatus status; + private List hostRefs; private Timestamp createDate; private Timestamp lastOpDate; @@ -37,6 +38,7 @@ public SdnControllerInventory(SdnControllerVO vo) { this.setUsername(vo.getUsername()); this.setPassword(vo.getPassword()); this.setStatus(vo.getStatus()); + this.setHostRefs(SdnControllerHostRefInventory.valueOf(vo.getHostRefVOS())); this.setCreateDate(vo.getCreateDate()); this.setLastOpDate(vo.getLastOpDate()); } @@ -140,4 +142,12 @@ public SdnControllerStatus getStatus() { public void setStatus(SdnControllerStatus status) { this.status = status; } + + public List getHostRefs() { + return hostRefs; + } + + public void setHostRefs(List hostRefs) { + this.hostRefs = hostRefs; + } } diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 9c51befc4a1..acf5887b7ba 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -321,6 +321,7 @@ public class SourceClassMap { put("org.zstack.header.network.l3.ReservedIpRangeInventory", "org.zstack.sdk.ReservedIpRangeInventory"); put("org.zstack.header.network.l3.UsedIpInventory", "org.zstack.sdk.UsedIpInventory"); put("org.zstack.header.network.l3.datatypes.IpCapacityData", "org.zstack.sdk.IpCapacityData"); + put("org.zstack.header.network.sdncontroller.SdnControllerHostRefInventory", "org.zstack.sdk.SdnControllerHostRefInventory"); put("org.zstack.header.network.sdncontroller.SdnControllerInventory", "org.zstack.sdk.SdnControllerInventory"); put("org.zstack.header.network.sdncontroller.SdnControllerStatus", "org.zstack.sdk.SdnControllerStatus"); put("org.zstack.header.network.service.NetworkServiceL3NetworkRefInventory", "org.zstack.sdk.NetworkServiceL3NetworkRefInventory"); @@ -1371,6 +1372,7 @@ public class SourceClassMap { put("org.zstack.sdk.ScsiLunHostRefInventory", "org.zstack.header.storageDevice.ScsiLunHostRefInventory"); put("org.zstack.sdk.ScsiLunInventory", "org.zstack.header.storageDevice.ScsiLunInventory"); put("org.zstack.sdk.ScsiLunVmInstanceRefInventory", "org.zstack.header.storageDevice.ScsiLunVmInstanceRefInventory"); + put("org.zstack.sdk.SdnControllerHostRefInventory", "org.zstack.header.network.sdncontroller.SdnControllerHostRefInventory"); put("org.zstack.sdk.SdnControllerInventory", "org.zstack.header.network.sdncontroller.SdnControllerInventory"); put("org.zstack.sdk.SdnControllerStatus", "org.zstack.header.network.sdncontroller.SdnControllerStatus"); put("org.zstack.sdk.SdnVlanRange", "org.zstack.sdnController.header.SdnVlanRange"); diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerHostRefInventory.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerHostRefInventory.java new file mode 100644 index 00000000000..0d7dda066b9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerHostRefInventory.java @@ -0,0 +1,79 @@ +package org.zstack.sdk; + + + +public class SdnControllerHostRefInventory { + + public java.lang.String sdnControllerUuid; + public void setSdnControllerUuid(java.lang.String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + public java.lang.String getSdnControllerUuid() { + return this.sdnControllerUuid; + } + + public java.lang.String hostUuid; + public void setHostUuid(java.lang.String hostUuid) { + this.hostUuid = hostUuid; + } + public java.lang.String getHostUuid() { + return this.hostUuid; + } + + public java.lang.String vSwitchType; + public void setVSwitchType(java.lang.String vSwitchType) { + this.vSwitchType = vSwitchType; + } + public java.lang.String getVSwitchType() { + return this.vSwitchType; + } + + public java.lang.String vtepIp; + public void setVtepIp(java.lang.String vtepIp) { + this.vtepIp = vtepIp; + } + public java.lang.String getVtepIp() { + return this.vtepIp; + } + + public java.lang.String nicPciAddresses; + public void setNicPciAddresses(java.lang.String nicPciAddresses) { + this.nicPciAddresses = nicPciAddresses; + } + public java.lang.String getNicPciAddresses() { + return this.nicPciAddresses; + } + + public java.lang.String nicDrivers; + public void setNicDrivers(java.lang.String nicDrivers) { + this.nicDrivers = nicDrivers; + } + public java.lang.String getNicDrivers() { + return this.nicDrivers; + } + + public java.lang.String netmask; + public void setNetmask(java.lang.String netmask) { + this.netmask = netmask; + } + public java.lang.String getNetmask() { + return this.netmask; + } + + public java.lang.String bondMode; + public void setBondMode(java.lang.String bondMode) { + this.bondMode = bondMode; + } + public java.lang.String getBondMode() { + return this.bondMode; + } + + public java.lang.String lacpMode; + public void setLacpMode(java.lang.String lacpMode) { + this.lacpMode = lacpMode; + } + public java.lang.String getLacpMode() { + return this.lacpMode; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerInventory.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerInventory.java index e771c2915c2..33cf6ab7ae0 100644 --- a/sdk/src/main/java/org/zstack/sdk/SdnControllerInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerInventory.java @@ -76,6 +76,14 @@ public SdnControllerStatus getStatus() { return this.status; } + public java.util.List hostRefs; + public void setHostRefs(java.util.List hostRefs) { + this.hostRefs = hostRefs; + } + public java.util.List getHostRefs() { + return this.hostRefs; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; From 7c4c584c97f57ea1dd68b35cf8f2cf0fcdba9c79 Mon Sep 17 00:00:00 2001 From: "haoyu.ding" Date: Thu, 18 Sep 2025 17:37:41 +0800 Subject: [PATCH 527/737] [securityGroup]: Modify the port range verification method GlobalPropertyImpact Resolves: ZSTAC-76328 Change-Id: I636f7865726d786566706876677866726d656571 --- .../network/securitygroup/SecurityGroupApiInterceptor.java | 3 ++- .../network/securitygroup/SecurityGroupGlobalProperty.java | 2 +- .../securitygroup/AddSecurityGroupRuleOptimizedCase.groovy | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java index c3ae7912012..3bd2f78aa36 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java @@ -704,7 +704,8 @@ private void validatePorts(String ports) { } String portArray[]; if (ports.contains(SecurityGroupConstant.IP_SPLIT)) { - String[] tmpPorts = ports.split(SecurityGroupConstant.IP_SPLIT); + // The port range in iptables, such as 10-20, will occupy the number of two multiports + String[] tmpPorts = ports.split(String.format("%s|%s", SecurityGroupConstant.IP_SPLIT, SecurityGroupConstant.RANGE_SPLIT)); if (tmpPorts.length > SecurityGroupGlobalProperty.PORT_GROUP_NUMBER_LIMIT) { throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid ports[%s], port range[%s] number[%d] is out of max limit[%d]", ports, Arrays.toString(tmpPorts), tmpPorts.length, SecurityGroupGlobalProperty.PORT_GROUP_NUMBER_LIMIT)); } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalProperty.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalProperty.java index aab07748427..2c3537c7058 100644 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalProperty.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalProperty.java @@ -9,6 +9,6 @@ public class SecurityGroupGlobalProperty { public static boolean UPGRADE_SECURITY_GROUP; @GlobalProperty(name="SecurityGroupRuleIpLimit", defaultValue = "50") public static int IP_GROUP_NUMBER_LIMIT; - @GlobalProperty(name="SecurityGroupRulePortLimit", defaultValue = "50") + @GlobalProperty(name="SecurityGroupRulePortLimit", defaultValue = "15") //The max number of multiport modes in iptables is 15 public static int PORT_GROUP_NUMBER_LIMIT; } diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/AddSecurityGroupRuleOptimizedCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/AddSecurityGroupRuleOptimizedCase.groovy index e6f463aaa18..ed9a2736c5f 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/AddSecurityGroupRuleOptimizedCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/AddSecurityGroupRuleOptimizedCase.groovy @@ -173,7 +173,7 @@ class AddSecurityGroupRuleOptimizedCase extends SubCase { errorRule.startPort = null errorRule.endPort = null // The current security group allows a maximum of 50 ports (ver:5.4.0) - errorRule.dstPortRange = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51" + errorRule.dstPortRange = "1,2,3,4,5,6,7,8,9,10,11,12,13,14-16,17" expect(AssertionError) { addSecurityGroupRule { securityGroupUuid = sg1.uuid From 2905d7ad32262da0be4fdfc7dfaffe21b664001f Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Thu, 18 Sep 2025 18:28:56 +0800 Subject: [PATCH 528/737] [xinfini]: support external ps extend cloned vm qos Resolves: ZSTAC-78433 Change-Id: I6f6861617663746264667a757172696c67797a77 --- .../java/org/zstack/xinfini/XInfiniStorageController.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index 232408a894f..ca6625624bc 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -833,8 +833,10 @@ public void setVolumeQos(BaseVolumeInfo v, Completion comp) { return; } - if (v.getQos().getReadBandwidth() != null || v.getQos().getWriteBandwidth() != null - || v.getQos().getReadIOPS() != null || v.getQos().getWriteIOPS() != null) { + if ((v.getQos().getReadBandwidth() != null && v.getQos().getReadBandwidth() > 0) + || (v.getQos().getWriteBandwidth() != null && v.getQos().getWriteBandwidth() > 0) + || (v.getQos().getReadIOPS() != null && v.getQos().getReadIOPS() > 0) + || v.getQos().getWriteIOPS() != null && v.getQos().getWriteIOPS() > 0) { throw new OperationFailureException(operr("xinfini only support set total qos")); } From bb3052f2840f6f4b79e10b29cc861d1b5f3aa76e Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Thu, 18 Sep 2025 15:34:10 +0800 Subject: [PATCH 529/737] [zbs]: zbs support getting active clients Resolves: ZSTAC-78105 Change-Id: I716563666c6e7862736b6a65766f6e6674786970 --- .../kvm/ExternalPrimaryStorageKvmFactory.java | 27 +++- .../xinfini/XInfiniStorageController.java | 1 + .../org/zstack/storage/zbs/ZbsMdsBase.java | 4 + .../storage/zbs/ZbsStorageController.java | 144 +++++++++++++++--- .../testlib/ExternalPrimaryStorageSpec.groovy | 5 + 5 files changed, 154 insertions(+), 27 deletions(-) diff --git a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/kvm/ExternalPrimaryStorageKvmFactory.java b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/kvm/ExternalPrimaryStorageKvmFactory.java index 8675d0a501e..e8b55f23437 100644 --- a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/kvm/ExternalPrimaryStorageKvmFactory.java +++ b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/kvm/ExternalPrimaryStorageKvmFactory.java @@ -10,19 +10,19 @@ import org.zstack.core.db.Q; import org.zstack.core.db.SQL; import org.zstack.core.workflow.FlowChainBuilder; +import org.zstack.externalStorage.primary.ExternalStorageConstant; import org.zstack.header.core.*; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.ErrorCodeList; +import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.host.HostInventory; import org.zstack.header.host.HostVO; import org.zstack.header.host.HostVO_; import org.zstack.header.message.MessageReply; import org.zstack.header.storage.addon.NodeHealthy; import org.zstack.header.storage.addon.StorageHealthy; -import org.zstack.header.storage.addon.primary.BaseVolumeInfo; -import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO; -import org.zstack.header.storage.addon.primary.PrimaryStorageNodeSvc; +import org.zstack.header.storage.addon.primary.*; import org.zstack.header.storage.primary.*; import org.zstack.header.vm.VmInstanceSpec; import org.zstack.header.vm.VmInstanceState; @@ -31,6 +31,7 @@ import org.zstack.header.volume.VolumeVO_; import org.zstack.kvm.*; import org.zstack.storage.addon.primary.ExternalPrimaryStorageFactory; +import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; @@ -330,13 +331,19 @@ public void beforeStartVmOnKvm(KVMHostInventory host, VmInstanceSpec spec, KVMAg List vols = getManagerExclusiveVolume(spec); for (VolumeInventory vol : vols) { - PrimaryStorageNodeSvc nodeSvc = getNodeService(vol); + PrimaryStorageNodeSvc nodeSvc = extPsFactory.getNodeSvc(vol.getPrimaryStorageUuid()); if (nodeSvc == null) { continue; } - nodeSvc.getActiveClients(vol.getInstallPath(), vol.getProtocol()).forEach(client -> { + List clients = nodeSvc.getActiveClients(vol.getInstallPath(), vol.getProtocol()); + clients.forEach(client -> { if (!client.getManagerIp().equals(host.getManagementIp()) && !client.isInBlacklist()) { + // hard code for zbs, zbs not support deactive and blacklist yet + if (vol.getProtocol().equals(ExternalStorageConstant.CBD_PROTOCOL)) { + throw new OperationFailureException(operr("find active clients for volume[uuid:%s, installPath %s, client:%s]", + vol.getUuid(), vol.getInstallPath(), client.getManagerIp())); + } // TODO use async call HostVO clientHost = Q.New(HostVO.class).eq(HostVO_.managementIp, client.getManagerIp()).find(); if (clientHost != null) { @@ -389,12 +396,16 @@ private List getManagerExclusiveVolume(VmInstanceSpec spec) { vols.add(spec.getDestRootVolume()); vols.addAll(spec.getDestDataVolumes()); + List pss = Q.New(ExternalPrimaryStorageVO.class) + .in(ExternalPrimaryStorageVO_.uuid, vols.stream().map(VolumeInventory::getPrimaryStorageUuid).collect(Collectors.toList())) + .list(); + Map psIdentities = pss.stream() + .collect(Collectors.toMap(ExternalPrimaryStorageVO::getUuid, ExternalPrimaryStorageVO::getIdentity)); vols.removeIf(info -> { - if (info.getInstallPath() == null || info.isShareable()) { + if (info.getInstallPath() == null || info.isShareable() || !psIdentities.containsKey(info.getPrimaryStorageUuid())) { return true; } - String identity = info.getInstallPath().split("://")[0]; - return !extPsFactory.support(identity); + return !extPsFactory.support(psIdentities.get(info.getPrimaryStorageUuid())); }); return vols; diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index 232408a894f..5c5405c868a 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -1014,6 +1014,7 @@ public void validateConfig(String config) { @Override public void setTrashExpireTime(int timeInSeconds, Completion completion) { //TODO + completion.success(); } @Override diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java index bec901e4032..1d4f286233a 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java @@ -76,6 +76,10 @@ protected void checkStorageHealth() { } } + public T syncCall(final String path, final Object cmd, final Class retClass, TimeUnit unit, long timeout) { + return restf.syncJsonPost(makeHttpPath(self.getAddr(), path), cmd, retClass, unit, timeout); + } + public void httpCall(final String path, final Object cmd, final Class retClass, final ReturnValueCompletion completion) { httpCall(path, cmd, retClass, completion, null, 0); } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 83225638746..5bcf7fec9df 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -13,7 +13,6 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.db.DatabaseFacade; -import org.zstack.core.db.Q; import org.zstack.core.db.SQL; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; @@ -99,6 +98,7 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar public static final String DELETE_SNAPSHOT_PATH = "/zbs/primarystorage/snapshot/delete"; public static final String ROLLBACK_SNAPSHOT_PATH = "/zbs/primarystorage/snapshot/rollback"; public static final String CHECK_HOST_STORAGE_CONNECTION_PATH = "/zbs/primarystorage/check/host/connection"; + public static final String GET_VOLUME_CLIENTS_PATH = "/zbs/primarystorage/volume/clients"; private static final StorageCapabilities capabilities = new StorageCapabilities(); @@ -130,17 +130,18 @@ public void activate(BaseVolumeInfo v, HostInventory h, boolean shareable, Retur @Override public void deactivate(String installPath, String protocol, HostInventory h, Completion comp) { - + // not support inactive client yet + comp.success(); } @Override public void deactivate(String installPath, String protocol, ActiveVolumeClient client, Completion comp) { - + comp.success(); } @Override public void blacklist(String installPath, String protocol, HostInventory h, Completion comp) { - + comp.success(); } @Override @@ -156,7 +157,23 @@ public BaseVolumeInfo getActiveVolumeInfo(String activePath, HostInventory h, bo @Override public List getActiveClients(String installPath, String protocol) { if (VolumeProtocol.CBD.toString().equals(protocol)) { - return Collections.emptyList(); + GetVolumeClientsCmd cmd = new GetVolumeClientsCmd(); + cmd.setPath(installPath); + GetVolumeClientsRsp rsp = syncHttpCall(GET_VOLUME_CLIENTS_PATH, cmd, GetVolumeClientsRsp.class); + List clients = new ArrayList<>(); + + if (!rsp.isSuccess()) { + throw new OperationFailureException(operr(rsp.getError())); + } + + if (rsp.getClients() != null) { + for (ClientInfo clientInfo : rsp.getClients()) { + ActiveVolumeClient client = new ActiveVolumeClient(); + client.setManagerIp(clientInfo.getIp()); + clients.add(client); + } + } + return clients; } else { throw new OperationFailureException(operr("not supported protocol[%s] for active", protocol)); } @@ -169,7 +186,7 @@ public List getActiveVolumesLocation(HostInventory h) { @Override public void deployClient(HostInventory h, Completion comp) { - KVMHostVO host = Q.New(KVMHostVO.class).eq(KVMHostVO_.uuid, h.getUuid()).find(); + KVMHostVO host = org.zstack.core.db.Q.New(KVMHostVO.class).eq(KVMHostVO_.uuid, h.getUuid()).find(); if (host == null) { comp.fail(operr("cannot found kvm host[uuid:%s], unable to deploy client", h.getUuid())); return; @@ -222,7 +239,7 @@ public void fail(ErrorCode errorCode) { @Override public void deactivateHeartbeatVolume(HostInventory h, Completion comp) { - + comp.success(); } @Override @@ -335,7 +352,7 @@ public void fail(ErrorCode errorCode) { flow(new NoRollbackFlow() { String __name__ = "deploy-client"; - List refs = Q.New(PrimaryStorageClusterRefVO.class) + List refs = org.zstack.core.db.Q.New(PrimaryStorageClusterRefVO.class) .eq(PrimaryStorageClusterRefVO_.primaryStorageUuid, self.getUuid()) .list(); @@ -350,12 +367,12 @@ public void run(FlowTrigger trigger, Map data) { .map(PrimaryStorageClusterRefVO::getClusterUuid) .collect(Collectors.toList()); - List hosts = Q.New(HostVO.class) + List hosts = org.zstack.core.db.Q.New(HostVO.class) .in(HostAO_.clusterUuid, clusterUuids) .list(); new While<>(hosts).each((h, comp) -> { - KVMHostVO host = Q.New(KVMHostVO.class).eq(KVMHostVO_.uuid, h.getUuid()).find(); + KVMHostVO host = org.zstack.core.db.Q.New(KVMHostVO.class).eq(KVMHostVO_.uuid, h.getUuid()).find(); if (host == null) { comp.addError(operr("cannot found kvm host[uuid:%s], unable to deploy client", h.getUuid())); comp.allDone(); @@ -803,12 +820,12 @@ public void fail(ErrorCode errorCode) { @Override public void setVolumeQos(BaseVolumeInfo v, Completion comp) { - + comp.success(); } @Override public void deleteVolumeQos(BaseVolumeInfo v, Completion comp) { - + comp.success(); } @Override @@ -929,7 +946,7 @@ public void fail(ErrorCode errorCode) { @Override public void expungeSnapshot(String installPath, Completion comp) { - + comp.success(); } @Override @@ -990,7 +1007,7 @@ public void validateConfig(String config) { @Override public void setTrashExpireTime(int timeInSeconds, Completion completion) { - + completion.success(); } @Override @@ -1042,12 +1059,20 @@ private List parseMdsInfos(List mdsUrls) { }).collect(Collectors.toList()); } + protected T syncHttpCall(final String path, final AgentCommand cmd, final Class retClass) { + return httpCall(path, cmd, retClass, null, 0, true); + } + + protected T httpCall(final String path, final AgentCommand cmd, final Class retClass, TimeUnit unit, long timeout, boolean sync) { + return new HttpCaller<>(path, cmd, retClass, null, unit, timeout, sync).syncCall(); + } + protected void httpCall(final String path, final AgentCommand cmd, final Class retClass, final ReturnValueCompletion callback) { - httpCall(path, cmd, retClass, callback, null, 0); + httpCall(path, cmd, retClass, callback, null, 0, false); } - protected void httpCall(final String path, final AgentCommand cmd, final Class retClass, final ReturnValueCompletion callback, TimeUnit unit, long timeout) { - new HttpCaller<>(path, cmd, retClass, callback, unit, timeout).call(); + protected void httpCall(final String path, final AgentCommand cmd, final Class retClass, final ReturnValueCompletion callback, TimeUnit unit, long timeout, boolean sync) { + new HttpCaller<>(path, cmd, retClass, callback, unit, timeout, sync).call(); } public class HttpCaller { @@ -1061,14 +1086,15 @@ public class HttpCaller { private final ReturnValueCompletion callback; private final TimeUnit unit; private final long timeout; + private final boolean sync; private boolean tryNext = false; public HttpCaller(String path, AgentCommand cmd, Class retClass, ReturnValueCompletion callback) { - this(path, cmd, retClass, callback, null, 0); + this(path, cmd, retClass, callback, null, 0, false); } - public HttpCaller(String path, AgentCommand cmd, Class retClass, ReturnValueCompletion callback, TimeUnit unit, long timeout) { + public HttpCaller(String path, AgentCommand cmd, Class retClass, ReturnValueCompletion callback, TimeUnit unit, long timeout, boolean sync) { this.path = path; this.cmd = cmd; this.retClass = retClass; @@ -1076,6 +1102,7 @@ public HttpCaller(String path, AgentCommand cmd, Class retClass, ReturnValueC this.unit = unit; this.timeout = timeout; this.mdsInfos = prepareMds(); + this.sync = sync; } public void call() { @@ -1084,6 +1111,12 @@ public void call() { doCall(); } + public T syncCall() { + prepareMdsIterator(); + prepareCmd(); + return doSyncCall(); + } + HttpCaller setTargetMds(String mdsAddr) { logger.debug(String.format("target MDS[%s]", mdsAddr)); @@ -1120,6 +1153,29 @@ private void prepareMdsIterator() { it = mdsInfos.stream().map(ZbsPrimaryStorageMdsBase::new).collect(Collectors.toList()).iterator(); } + private T doSyncCall() { + if (!it.hasNext()) { + throw new OperationFailureException(operr(errorCodes, "all MDS cannot execute http call[%s]", path)); + } + + ZbsPrimaryStorageMdsBase base = it.next(); + cmd.setAddr(base.getSelf().getAddr()); + + T ret = base.syncCall(path, cmd, retClass, unit, timeout); + if (!ret.isSuccess()) { + logger.warn(String.format("failed to execute http call[%s] on MDS[%s], error is: %s", + path, base.getSelf().getAddr(), JSONObjectUtil.toJsonString(ret.getError()))); + errorCodes.getCauses().add(operr(ret.getError())); + if (tryNext) { + return doSyncCall(); + } else { + throw new OperationFailureException(operr(errorCodes, "all MDS cannot execute http call[%s]", path)); + } + } + + return ret; + } + private void doCall() { if (!it.hasNext()) { callback.fail(operr(errorCodes, "all MDS cannot execute http call[%s]", path)); @@ -1629,6 +1685,56 @@ public void setForce(boolean force) { } } + public static class GetVolumeClientsCmd extends AgentCommand { + private String path; + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + } + + public static class ClientInfo { + public ClientInfo(String ip, int port) { + this.ip = ip; + this.port = port; + } + + private String ip; + private int port; + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + } + + public static class GetVolumeClientsRsp extends AgentResponse { + private List clients; + + public List getClients() { + return clients; + } + + public void setClients(List clients) { + this.clients = clients; + } + } + public static class SizeCmd extends AgentCommand { private long size; private String unit; diff --git a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy index 881c4f50a58..a9e9290e8c6 100644 --- a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy @@ -209,6 +209,11 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { return rsp } + + simulator(ZbsStorageController.GET_VOLUME_CLIENTS_PATH) { HttpEntity e, EnvSpec spec -> + return new ZbsStorageController.GetVolumeClientsRsp() + } + simulator(KvmCbdCommands.SETUP_CBD_SELF_FENCER_PATH) { return new KvmCbdCommands.AgentRsp() } From 757edeb402fbd492b960d837f5997745b294a567 Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Fri, 19 Sep 2025 10:38:13 +0800 Subject: [PATCH 530/737] [utils]: Endpoint check connection support ssl Resolves: ZSTAC-77924 Change-Id: I62726264786d696a686270777662636d6c656370 --- utils/src/main/java/org/zstack/utils/DomainUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/src/main/java/org/zstack/utils/DomainUtils.java b/utils/src/main/java/org/zstack/utils/DomainUtils.java index f85e501984f..c68b933dfd0 100644 --- a/utils/src/main/java/org/zstack/utils/DomainUtils.java +++ b/utils/src/main/java/org/zstack/utils/DomainUtils.java @@ -16,7 +16,7 @@ public static String getDomain(String url) { } public static Boolean curl(String url) { - String command = String.format("curl -s --head --connect-timeout 5 %s", url); + String command = String.format("curl -sk --head --connect-timeout 5 %s", url); ShellResult rst = ShellUtils.runAndReturn(command, true); return rst.getRetCode() == 0; } From 45dfd2f1aa925106437a0c3cc78c4c537c8bae57 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Fri, 19 Sep 2025 15:04:24 +0800 Subject: [PATCH 531/737] [hostNetworkInterface]: unblock host ping by lldp Resolves: ZSTAC-78473 Change-Id: I7163617575726e6572716679726d786466766179 --- .../hostNetworkInterface/lldp/LldpManagerImpl.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpManagerImpl.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpManagerImpl.java index 95501e8cf1c..56e6bc1d385 100644 --- a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpManagerImpl.java +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpManagerImpl.java @@ -11,10 +11,7 @@ import org.zstack.core.Platform; import org.zstack.core.db.SQL; import org.zstack.header.AbstractService; -import org.zstack.header.core.Completion; -import org.zstack.header.core.NoErrorCompletion; -import org.zstack.header.core.ReturnValueCompletion; -import org.zstack.header.core.WhileDoneCompletion; +import org.zstack.header.core.*; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.host.*; @@ -458,6 +455,9 @@ public void kvmPingAgentNoFailure(KVMHostInventory host, NoErrorCompletion compl return; } + completion.done(); + + NopeCompletion nope = new NopeCompletion(); new While<>(toUpdate).each((lldpVO, wcomp) -> { doGetHostNetworkInterfaceLLdpInfo(lldpVO.getInterfaceUuid(), new ReturnValueCompletion(wcomp) { @Override @@ -471,10 +471,10 @@ public void fail(ErrorCode errorCode) { wcomp.done(); } }); - }).run(new WhileDoneCompletion(completion) { + }).run(new WhileDoneCompletion(nope) { @Override public void done(ErrorCodeList errorCodeList) { - completion.done(); + nope.success(); } }); } From eb1c5fd05796fbfe633a4099d0bf644a72d3aac9 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Fri, 19 Sep 2025 17:28:00 +0800 Subject: [PATCH 532/737] [localstorage]: set diskoffering uuid on LocalStorageDesignatedAllocateCapacityFlow Resolves: ZSTAC-73931 Change-Id: I74636f66747778786a6b637761727665726c676c --- .../local/LocalStorageDesignatedAllocateCapacityFlow.java | 1 + 1 file changed, 1 insertion(+) diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageDesignatedAllocateCapacityFlow.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageDesignatedAllocateCapacityFlow.java index 3ae047fb60c..2c7b909827f 100644 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageDesignatedAllocateCapacityFlow.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageDesignatedAllocateCapacityFlow.java @@ -95,6 +95,7 @@ public void run(MessageReply reply) { if (msg == rootVolumeAllocationMsg) { vspec.setSize(ar.getSize()); vspec.setPrimaryStorageInventory(ar.getPrimaryStorageInventory()); + vspec.setDiskOfferingUuid(msg.getDiskOfferingUuid()); vspec.setType(VolumeType.Root.toString()); } else { vspec.setSize(ar.getSize()); From 54873386f49a4554db7092d4b6cf909c1dc655fc Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Mon, 22 Sep 2025 11:57:37 +0800 Subject: [PATCH 533/737] [hostNetworkInterface]: enable auto get lldp neigbor only after add huawei sdn controller GlobalConfigImpact Resolves: ZSTAC-78518 Change-Id: I6a636b6e786a776b756e67736777786c716b726f --- .../lldp/LldpGlobalConfig.java | 13 +++++++++++ .../lldp/LldpManagerImpl.java | 22 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpGlobalConfig.java diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpGlobalConfig.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpGlobalConfig.java new file mode 100644 index 00000000000..0228ae0e20c --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpGlobalConfig.java @@ -0,0 +1,13 @@ +package org.zstack.network.hostNetworkInterface.lldp; + +import org.zstack.core.config.GlobalConfig; +import org.zstack.core.config.GlobalConfigDef; +import org.zstack.core.config.GlobalConfigDefinition; + +@GlobalConfigDefinition +public class LldpGlobalConfig { + public static final String CATEGORY = "lldp"; + + @GlobalConfigDef(defaultValue = "false", type = Boolean.class, description = "auto pull host network interface lldp neighbour if it's true") + public static GlobalConfig AUTO_GET_LLDP_NEIGHBOUR = new GlobalConfig(CATEGORY, "auto.get.lldp.neighbour"); +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpManagerImpl.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpManagerImpl.java index 56e6bc1d385..420a6ef544a 100644 --- a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpManagerImpl.java +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpManagerImpl.java @@ -47,6 +47,13 @@ public class LldpManagerImpl extends AbstractService implements HostAfterConnect @Autowired private EventFacade evtf; + private enum LLDPGetNeighbourState { + None, + STARTING, + Done, + } + + private final Map getNeighbourStateMap = new ConcurrentHashMap<>(); private final Map interfaceLocks = new ConcurrentHashMap<>(); private Object getInterfaceLock(String interfaceUuid) { @@ -242,6 +249,7 @@ void doGetHostNetworkInterfaceLLdpInfo(String interfaceUuid, ReturnValueCompleti final LldpKvmAgentCommands.GetLldpInfoCmd cmd = new LldpKvmAgentCommands.GetLldpInfoCmd(); cmd.setPhysicalInterfaceName(interfaceVO.getInterfaceName()); + getNeighbourStateMap.put(interfaceUuid, LLDPGetNeighbourState.STARTING); KVMHostAsyncHttpCallMsg kmsg = new KVMHostAsyncHttpCallMsg(); kmsg.setPath(LldpConstant.GET_LLDP_INFO_PATH); kmsg.setHostUuid(interfaceVO.getHostUuid()); @@ -252,10 +260,12 @@ void doGetHostNetworkInterfaceLLdpInfo(String interfaceUuid, ReturnValueCompleti public void run(MessageReply reply) { if (!reply.isSuccess()) { completion.fail(reply.getError()); + getNeighbourStateMap.put(interfaceUuid, LLDPGetNeighbourState.Done); return; } else { KVMHostAsyncHttpCallReply r = reply.castReply(); LldpKvmAgentCommands.GetLldpInfoResponse rsp = r.toResponse(LldpKvmAgentCommands.GetLldpInfoResponse.class); + getNeighbourStateMap.put(interfaceUuid, LLDPGetNeighbourState.Done); if (!rsp.isSuccess()) { completion.fail(operr("operation error, because %s", rsp.getError())); } else { @@ -425,6 +435,12 @@ public void afterDeleteHost(HostInventory inventory) { @Override public void kvmPingAgentNoFailure(KVMHostInventory host, NoErrorCompletion completion) { + boolean autoGetLldpNeighbor = LldpGlobalConfig.AUTO_GET_LLDP_NEIGHBOUR.value(Boolean.class); + if (!autoGetLldpNeighbor) { + completion.done(); + return; + } + List interfaceUuids = Q.New(HostNetworkInterfaceVO.class) .select(HostNetworkInterfaceVO_.uuid) .eq(HostNetworkInterfaceVO_.hostUuid, host.getUuid()) @@ -459,6 +475,12 @@ public void kvmPingAgentNoFailure(KVMHostInventory host, NoErrorCompletion compl NopeCompletion nope = new NopeCompletion(); new While<>(toUpdate).each((lldpVO, wcomp) -> { + LLDPGetNeighbourState state = getNeighbourStateMap.get(lldpVO.getInterfaceUuid()); + if (state == LLDPGetNeighbourState.STARTING) { + wcomp.done(); + return; + } + doGetHostNetworkInterfaceLLdpInfo(lldpVO.getInterfaceUuid(), new ReturnValueCompletion(wcomp) { @Override public void success(HostNetworkInterfaceLldpRefInventory returnValue) { From 0813f8a861073fa0ded6baa9d5114994dba8bb97 Mon Sep 17 00:00:00 2001 From: Zhang Wenhao Date: Thu, 22 May 2025 15:38:03 +0800 Subject: [PATCH 534/737] [sdk]: support license server Resolves: ZSV-8949 Change-Id: I6771656f78776d74627679716674697075677767 --- conf/db/upgrade/V5.4.0.1__schema.sql | 42 +++ sdk/src/main/java/SourceClassMap.java | 2 + .../sdk/LicenseAuthorizedNodeInventory.java | 63 ++++ ...sterLicenseRequestedApplicationAction.java | 3 + .../DegradeFromLicenseServerAction.java | 98 +++++++ .../DegradeFromLicenseServerResult.java | 7 + .../GetLicenseAuthorizedCapacityAction.java | 92 ++++++ .../GetLicenseAuthorizedCapacityResult.java | 7 + .../api/server/IsLicenseServerAction.java | 92 ++++++ .../api/server/IsLicenseServerResult.java | 14 + .../QueryLicenseAuthorizedNodeAction.java | 75 +++++ .../QueryLicenseAuthorizedNodeResult.java | 22 ++ .../server/RegisterLicenseServerAction.java | 104 +++++++ .../server/RegisterLicenseServerResult.java | 14 + .../api/server/SyncLicenseCapacityAction.java | 98 +++++++ .../api/server/SyncLicenseCapacityResult.java | 7 + ...sterLicenseRequestedApplicationAction.java | 101 +++++++ ...sterLicenseRequestedApplicationResult.java | 7 + .../server/UnregisterLicenseServerAction.java | 101 +++++++ .../server/UnregisterLicenseServerResult.java | 7 + .../server/UpgradeToLicenseServerAction.java | 98 +++++++ .../server/UpgradeToLicenseServerResult.java | 14 + .../api/server/VerifyLicenseServerAction.java | 107 +++++++ .../api/server/VerifyLicenseServerResult.java | 30 ++ .../java/org/zstack/testlib/ApiHelper.groovy | 272 ++++++++++++++++++ 25 files changed, 1477 insertions(+) create mode 100644 conf/db/upgrade/V5.4.0.1__schema.sql create mode 100644 sdk/src/main/java/org/zstack/sdk/LicenseAuthorizedNodeInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/DegradeFromLicenseServerAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/DegradeFromLicenseServerResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/IsLicenseServerAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/IsLicenseServerResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/QueryLicenseAuthorizedNodeAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/QueryLicenseAuthorizedNodeResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/RegisterLicenseServerAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/RegisterLicenseServerResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/SyncLicenseCapacityAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/SyncLicenseCapacityResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseRequestedApplicationAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseRequestedApplicationResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseServerAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseServerResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerResult.java diff --git a/conf/db/upgrade/V5.4.0.1__schema.sql b/conf/db/upgrade/V5.4.0.1__schema.sql new file mode 100644 index 00000000000..ced47984c4e --- /dev/null +++ b/conf/db/upgrade/V5.4.0.1__schema.sql @@ -0,0 +1,42 @@ +CREATE TABLE IF NOT EXISTS `zstack`.`LicenseAuthorizedNodeVO` ( + `uuid` char(32) NOT NULL UNIQUE, + `ip` varchar(255) NOT NULL, + `lastSyncDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59', + `status` varchar(64) NOT NULL, + `type` varchar(64) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`LicenseAuthorizedCapacityVO` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `uuid` char(32) NOT NULL UNIQUE, + `resourceUuid` char(32) DEFAULT NULL, + `quotaType` varchar(64) NOT NULL, + `quota` bigint unsigned DEFAULT 0, + `licenseType` varchar(64) NOT NULL, + `type` varchar(64) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59', + PRIMARY KEY (`id`), + CONSTRAINT `fkLicenseAuthorizedCapacityLicenseAuthorizedNode` FOREIGN KEY (`uuid`) REFERENCES `LicenseAuthorizedNodeVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`LicenseAuthorizeHistoryVO` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `uuid` char(32) NOT NULL UNIQUE, + `resourceUuid` char(32) DEFAULT NULL, + `quotaType` varchar(64) NOT NULL, + `usageFrom` bigint unsigned DEFAULT 0, + `usageTo` bigint unsigned DEFAULT NULL, + `quota` bigint unsigned DEFAULT 0, + `licenseType` varchar(64) NOT NULL, + `type` varchar(64) NOT NULL, + `action` varchar(255) NOT NULL, + `result` varchar(64) DEFAULT NULL, + `error` text DEFAULT NULL, + `requestUuid` char(32) NOT NULL, + `createDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index acf5887b7ba..69fdb1d130b 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -499,6 +499,7 @@ public class SourceClassMap { put("org.zstack.log.server.LogServerInventory", "org.zstack.sdk.LogServerInventory"); put("org.zstack.log.server.LogType", "org.zstack.sdk.LogType"); put("org.zstack.login.entity.LdapResourceRefInventory", "org.zstack.sdk.LdapResourceRefInventory"); + put("org.zstack.license.header.server.LicenseAuthorizedNodeInventory", "org.zstack.sdk.LicenseAuthorizedNodeInventory"); put("org.zstack.loginControl.entity.AccessControlRuleInventory", "org.zstack.sdk.AccessControlRuleInventory"); put("org.zstack.loginControl.entity.ControlStrategy", "org.zstack.sdk.ControlStrategy"); put("org.zstack.mevoco.ShareableVolumeVmInstanceRefInventory", "org.zstack.sdk.ShareableVolumeVmInstanceRefInventory"); @@ -1150,6 +1151,7 @@ public class SourceClassMap { put("org.zstack.sdk.LdapResourceRefInventory", "org.zstack.login.entity.LdapResourceRefInventory"); put("org.zstack.sdk.LdapServerInventory", "org.zstack.ldap.LdapServerInventory"); put("org.zstack.sdk.LicenseAddOnInventory", "org.zstack.license.LicenseAddOnInventory"); + put("org.zstack.sdk.LicenseAuthorizedNodeInventory", "org.zstack.license.header.server.LicenseAuthorizedNodeInventory"); put("org.zstack.sdk.LicenseInventory", "org.zstack.license.LicenseInventory"); put("org.zstack.sdk.LoadBalancerDataInventory", "org.zstack.observabilityServer.service.loadBalancer.LoadBalancerDataInventory"); put("org.zstack.sdk.LoadBalancerInventory", "org.zstack.network.service.lb.LoadBalancerInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/LicenseAuthorizedNodeInventory.java b/sdk/src/main/java/org/zstack/sdk/LicenseAuthorizedNodeInventory.java new file mode 100644 index 00000000000..c217ab619c6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/LicenseAuthorizedNodeInventory.java @@ -0,0 +1,63 @@ +package org.zstack.sdk; + + + +public class LicenseAuthorizedNodeInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String ip; + public void setIp(java.lang.String ip) { + this.ip = ip; + } + public java.lang.String getIp() { + return this.ip; + } + + public java.sql.Timestamp lastSyncDate; + public void setLastSyncDate(java.sql.Timestamp lastSyncDate) { + this.lastSyncDate = lastSyncDate; + } + public java.sql.Timestamp getLastSyncDate() { + return this.lastSyncDate; + } + + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/RegisterLicenseRequestedApplicationAction.java b/sdk/src/main/java/org/zstack/sdk/RegisterLicenseRequestedApplicationAction.java index 4b26be3291e..4133773a938 100644 --- a/sdk/src/main/java/org/zstack/sdk/RegisterLicenseRequestedApplicationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RegisterLicenseRequestedApplicationAction.java @@ -31,6 +31,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String clientPubKey; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long currentTimeMillis; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/DegradeFromLicenseServerAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/DegradeFromLicenseServerAction.java new file mode 100644 index 00000000000..63c9e9edc32 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/DegradeFromLicenseServerAction.java @@ -0,0 +1,98 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DegradeFromLicenseServerAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.license.api.server.DegradeFromLicenseServerResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.license.api.server.DegradeFromLicenseServerResult value = res.getResult(org.zstack.sdk.license.api.server.DegradeFromLicenseServerResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.DegradeFromLicenseServerResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/license-server"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/DegradeFromLicenseServerResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/DegradeFromLicenseServerResult.java new file mode 100644 index 00000000000..c7800115aba --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/DegradeFromLicenseServerResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.license.api.server; + + + +public class DegradeFromLicenseServerResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityAction.java new file mode 100644 index 00000000000..5b442748907 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityAction.java @@ -0,0 +1,92 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetLicenseAuthorizedCapacityAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.license.api.server.GetLicenseAuthorizedCapacityResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.license.api.server.GetLicenseAuthorizedCapacityResult value = res.getResult(org.zstack.sdk.license.api.server.GetLicenseAuthorizedCapacityResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.GetLicenseAuthorizedCapacityResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/license-server/authorized-capacity"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityResult.java new file mode 100644 index 00000000000..ebcd3bc6bb0 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.license.api.server; + + + +public class GetLicenseAuthorizedCapacityResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/IsLicenseServerAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/IsLicenseServerAction.java new file mode 100644 index 00000000000..e590a853801 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/IsLicenseServerAction.java @@ -0,0 +1,92 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class IsLicenseServerAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.license.api.server.IsLicenseServerResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.license.api.server.IsLicenseServerResult value = res.getResult(org.zstack.sdk.license.api.server.IsLicenseServerResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.IsLicenseServerResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/license-server/is-server"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/IsLicenseServerResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/IsLicenseServerResult.java new file mode 100644 index 00000000000..40183f7f4f7 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/IsLicenseServerResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.license.api.server; + + + +public class IsLicenseServerResult { + public boolean licenseServer; + public void setLicenseServer(boolean licenseServer) { + this.licenseServer = licenseServer; + } + public boolean getLicenseServer() { + return this.licenseServer; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/QueryLicenseAuthorizedNodeAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/QueryLicenseAuthorizedNodeAction.java new file mode 100644 index 00000000000..b4d633f3d96 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/QueryLicenseAuthorizedNodeAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryLicenseAuthorizedNodeAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.license.api.server.QueryLicenseAuthorizedNodeResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.license.api.server.QueryLicenseAuthorizedNodeResult value = res.getResult(org.zstack.sdk.license.api.server.QueryLicenseAuthorizedNodeResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.QueryLicenseAuthorizedNodeResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/license-servers"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/QueryLicenseAuthorizedNodeResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/QueryLicenseAuthorizedNodeResult.java new file mode 100644 index 00000000000..42812471867 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/QueryLicenseAuthorizedNodeResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk.license.api.server; + + + +public class QueryLicenseAuthorizedNodeResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/RegisterLicenseServerAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/RegisterLicenseServerAction.java new file mode 100644 index 00000000000..14ddda4da72 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/RegisterLicenseServerAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class RegisterLicenseServerAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.license.api.server.RegisterLicenseServerResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ip; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map loginParams; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.license.api.server.RegisterLicenseServerResult value = res.getResult(org.zstack.sdk.license.api.server.RegisterLicenseServerResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.RegisterLicenseServerResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/license-server/client"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/RegisterLicenseServerResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/RegisterLicenseServerResult.java new file mode 100644 index 00000000000..848c6defc75 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/RegisterLicenseServerResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.license.api.server; + + + +public class RegisterLicenseServerResult { + public java.lang.String appId; + public void setAppId(java.lang.String appId) { + this.appId = appId; + } + public java.lang.String getAppId() { + return this.appId; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/SyncLicenseCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/SyncLicenseCapacityAction.java new file mode 100644 index 00000000000..7610c600282 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/SyncLicenseCapacityAction.java @@ -0,0 +1,98 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class SyncLicenseCapacityAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.license.api.server.SyncLicenseCapacityResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.license.api.server.SyncLicenseCapacityResult value = res.getResult(org.zstack.sdk.license.api.server.SyncLicenseCapacityResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.SyncLicenseCapacityResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/license-server/authorized-capacity/sync"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "syncLicenseCapacity"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/SyncLicenseCapacityResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/SyncLicenseCapacityResult.java new file mode 100644 index 00000000000..1f491410569 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/SyncLicenseCapacityResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.license.api.server; + + + +public class SyncLicenseCapacityResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseRequestedApplicationAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseRequestedApplicationAction.java new file mode 100644 index 00000000000..727c9605895 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseRequestedApplicationAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UnregisterLicenseRequestedApplicationAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.license.api.server.UnregisterLicenseRequestedApplicationResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String appId; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.license.api.server.UnregisterLicenseRequestedApplicationResult value = res.getResult(org.zstack.sdk.license.api.server.UnregisterLicenseRequestedApplicationResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.UnregisterLicenseRequestedApplicationResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/license/unregister-applications"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "unregisterLicenseRequestedApplication"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseRequestedApplicationResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseRequestedApplicationResult.java new file mode 100644 index 00000000000..c49df01533b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseRequestedApplicationResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.license.api.server; + + + +public class UnregisterLicenseRequestedApplicationResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseServerAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseServerAction.java new file mode 100644 index 00000000000..8c9669b4fd6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseServerAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UnregisterLicenseServerAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.license.api.server.UnregisterLicenseServerResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clientAuthorizedNodeUuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.license.api.server.UnregisterLicenseServerResult value = res.getResult(org.zstack.sdk.license.api.server.UnregisterLicenseServerResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.UnregisterLicenseServerResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/license-server/client"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseServerResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseServerResult.java new file mode 100644 index 00000000000..58c6ce83cf3 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseServerResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.license.api.server; + + + +public class UnregisterLicenseServerResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerAction.java new file mode 100644 index 00000000000..f3ea01c77e7 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerAction.java @@ -0,0 +1,98 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpgradeToLicenseServerAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.license.api.server.UpgradeToLicenseServerResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.license.api.server.UpgradeToLicenseServerResult value = res.getResult(org.zstack.sdk.license.api.server.UpgradeToLicenseServerResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.UpgradeToLicenseServerResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/license-server"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerResult.java new file mode 100644 index 00000000000..8a2a5a3d755 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.license.api.server; + +import org.zstack.sdk.LicenseAuthorizedNodeInventory; + +public class UpgradeToLicenseServerResult { + public LicenseAuthorizedNodeInventory inventory; + public void setInventory(LicenseAuthorizedNodeInventory inventory) { + this.inventory = inventory; + } + public LicenseAuthorizedNodeInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerAction.java new file mode 100644 index 00000000000..7cce409fdbf --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class VerifyLicenseServerAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.license.api.server.VerifyLicenseServerResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String appId; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clientAccessKeyId; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clientAccessKeySecret; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.license.api.server.VerifyLicenseServerResult value = res.getResult(org.zstack.sdk.license.api.server.VerifyLicenseServerResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.VerifyLicenseServerResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/license-server/register-verify"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerResult.java new file mode 100644 index 00000000000..1a9289ce6d6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerResult.java @@ -0,0 +1,30 @@ +package org.zstack.sdk.license.api.server; + + + +public class VerifyLicenseServerResult { + public java.lang.String accessKeyId; + public void setAccessKeyId(java.lang.String accessKeyId) { + this.accessKeyId = accessKeyId; + } + public java.lang.String getAccessKeyId() { + return this.accessKeyId; + } + + public java.lang.String accessKeySecret; + public void setAccessKeySecret(java.lang.String accessKeySecret) { + this.accessKeySecret = accessKeySecret; + } + public java.lang.String getAccessKeySecret() { + return this.accessKeySecret; + } + + public java.lang.String serverAppId; + public void setServerAppId(java.lang.String serverAppId) { + this.serverAppId = serverAppId; + } + public java.lang.String getServerAppId() { + return this.serverAppId; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 8bb1ac7dd91..2aa8a844e3f 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -50577,6 +50577,278 @@ abstract class ApiHelper { } + def degradeFromLicenseServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.DegradeFromLicenseServerAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.DegradeFromLicenseServerAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def getLicenseAuthorizedCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.GetLicenseAuthorizedCapacityAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.GetLicenseAuthorizedCapacityAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def isLicenseServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.IsLicenseServerAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.IsLicenseServerAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def queryLicenseAuthorizedNode(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.QueryLicenseAuthorizedNodeAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.QueryLicenseAuthorizedNodeAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def registerLicenseServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.RegisterLicenseServerAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.RegisterLicenseServerAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def syncLicenseCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.SyncLicenseCapacityAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.SyncLicenseCapacityAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def unregisterLicenseRequestedApplication(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.UnregisterLicenseRequestedApplicationAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.UnregisterLicenseRequestedApplicationAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def unregisterLicenseServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.UnregisterLicenseServerAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.UnregisterLicenseServerAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def upgradeToLicenseServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.UpgradeToLicenseServerAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.UpgradeToLicenseServerAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def verifyLicenseServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.VerifyLicenseServerAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.VerifyLicenseServerAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def addSNSSmsReceiver(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.sns.AddSNSSmsReceiverAction.class) Closure c) { def a = new org.zstack.sdk.sns.AddSNSSmsReceiverAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 1fb8bea920865c5ed679857d628e6e44b691bd2b Mon Sep 17 00:00:00 2001 From: Zhang Wenhao Date: Fri, 23 May 2025 16:36:25 +0800 Subject: [PATCH 535/737] [conf]: add license error code Related: ZSV-8949 Change-Id: I787268667871796c676775637567797575796b7b --- conf/errorCodes/license.xml | 75 +++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/conf/errorCodes/license.xml b/conf/errorCodes/license.xml index f7177169f13..1a9411d0a3a 100755 --- a/conf/errorCodes/license.xml +++ b/conf/errorCodes/license.xml @@ -45,5 +45,80 @@ 1008 The current Primary License does not allow using Addon licenses to add plus services + + + 2000 + Generic license component error + + + + 2001 + Missing license request code + + + + 3000 + Generic license server error + + + + 3002 + Unsupported license key-store type + + + + 3003 + License key-store error + + + + 3004 + License public key error + + + + 3100 + License server generic error + + + + 3101 + Missing license server file + + + + 3102 + Connect to license client error + + + + 3104 + License server call license client API error + + + + 3200 + License client generic error + + + + 3201 + Missing license client file + + + + 3202 + Connect to license server error + + + + 3203 + Log in license server error + + + + 3204 + License client call license server API error + From ed689197d5c7a1bc12eb6c9ab019a5f1a724591e Mon Sep 17 00:00:00 2001 From: Zhang Wenhao Date: Mon, 9 Jun 2025 15:08:20 +0800 Subject: [PATCH 536/737] [mevoco]: split LicenseAuthorizedNodeVO.nodeUuid and appId Related: ZSV-8949 DBImpact Change-Id: I646c7279646664686c6766756c6d676c687a7971 --- conf/db/upgrade/V5.4.0.1__schema.sql | 7 ++++--- sdk/src/main/java/SourceClassMap.java | 4 ++-- .../server/RegisterLicenseServerResult.java | 21 +++++++++++++------ .../server/UpgradeToLicenseServerResult.java | 2 +- .../api/server/VerifyLicenseServerResult.java | 21 +++++++++++++------ .../LicenseAuthorizedNodeInventory.java | 10 ++++++++- 6 files changed, 46 insertions(+), 19 deletions(-) rename sdk/src/main/java/org/zstack/sdk/{ => license/header/server}/LicenseAuthorizedNodeInventory.java (86%) diff --git a/conf/db/upgrade/V5.4.0.1__schema.sql b/conf/db/upgrade/V5.4.0.1__schema.sql index ced47984c4e..4e0e119bb8f 100644 --- a/conf/db/upgrade/V5.4.0.1__schema.sql +++ b/conf/db/upgrade/V5.4.0.1__schema.sql @@ -1,5 +1,6 @@ CREATE TABLE IF NOT EXISTS `zstack`.`LicenseAuthorizedNodeVO` ( `uuid` char(32) NOT NULL UNIQUE, + `appId` char(32) NOT NULL, `ip` varchar(255) NOT NULL, `lastSyncDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59', `status` varchar(64) NOT NULL, @@ -11,7 +12,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`LicenseAuthorizedNodeVO` ( CREATE TABLE IF NOT EXISTS `zstack`.`LicenseAuthorizedCapacityVO` ( `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, - `uuid` char(32) NOT NULL UNIQUE, + `nodeUuid` char(32) NOT NULL UNIQUE, `resourceUuid` char(32) DEFAULT NULL, `quotaType` varchar(64) NOT NULL, `quota` bigint unsigned DEFAULT 0, @@ -20,12 +21,12 @@ CREATE TABLE IF NOT EXISTS `zstack`.`LicenseAuthorizedCapacityVO` ( `lastOpDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59' ON UPDATE CURRENT_TIMESTAMP, `createDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59', PRIMARY KEY (`id`), - CONSTRAINT `fkLicenseAuthorizedCapacityLicenseAuthorizedNode` FOREIGN KEY (`uuid`) REFERENCES `LicenseAuthorizedNodeVO` (`uuid`) ON DELETE CASCADE + CONSTRAINT `fkLicenseAuthorizedCapacityLicenseAuthorizedNode` FOREIGN KEY (`nodeUuid`) REFERENCES `LicenseAuthorizedNodeVO` (`uuid`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `zstack`.`LicenseAuthorizeHistoryVO` ( `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, - `uuid` char(32) NOT NULL UNIQUE, + `nodeUuid` char(32) NOT NULL UNIQUE, `resourceUuid` char(32) DEFAULT NULL, `quotaType` varchar(64) NOT NULL, `usageFrom` bigint unsigned DEFAULT 0, diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 69fdb1d130b..9aebf19cffb 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -499,7 +499,7 @@ public class SourceClassMap { put("org.zstack.log.server.LogServerInventory", "org.zstack.sdk.LogServerInventory"); put("org.zstack.log.server.LogType", "org.zstack.sdk.LogType"); put("org.zstack.login.entity.LdapResourceRefInventory", "org.zstack.sdk.LdapResourceRefInventory"); - put("org.zstack.license.header.server.LicenseAuthorizedNodeInventory", "org.zstack.sdk.LicenseAuthorizedNodeInventory"); + put("org.zstack.license.header.server.LicenseAuthorizedNodeInventory", "org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory"); put("org.zstack.loginControl.entity.AccessControlRuleInventory", "org.zstack.sdk.AccessControlRuleInventory"); put("org.zstack.loginControl.entity.ControlStrategy", "org.zstack.sdk.ControlStrategy"); put("org.zstack.mevoco.ShareableVolumeVmInstanceRefInventory", "org.zstack.sdk.ShareableVolumeVmInstanceRefInventory"); @@ -1151,7 +1151,6 @@ public class SourceClassMap { put("org.zstack.sdk.LdapResourceRefInventory", "org.zstack.login.entity.LdapResourceRefInventory"); put("org.zstack.sdk.LdapServerInventory", "org.zstack.ldap.LdapServerInventory"); put("org.zstack.sdk.LicenseAddOnInventory", "org.zstack.license.LicenseAddOnInventory"); - put("org.zstack.sdk.LicenseAuthorizedNodeInventory", "org.zstack.license.header.server.LicenseAuthorizedNodeInventory"); put("org.zstack.sdk.LicenseInventory", "org.zstack.license.LicenseInventory"); put("org.zstack.sdk.LoadBalancerDataInventory", "org.zstack.observabilityServer.service.loadBalancer.LoadBalancerDataInventory"); put("org.zstack.sdk.LoadBalancerInventory", "org.zstack.network.service.lb.LoadBalancerInventory"); @@ -1601,6 +1600,7 @@ public class SourceClassMap { put("org.zstack.sdk.identity.role.RoleStateEvent", "org.zstack.header.identity.role.RoleStateEvent"); put("org.zstack.sdk.identity.role.RoleType", "org.zstack.header.identity.role.RoleType"); put("org.zstack.sdk.sns.SNSAliyunSmsEndpointInventory", "org.zstack.sns.SNSAliyunSmsEndpointInventory"); + put("org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory", "org.zstack.license.header.server.LicenseAuthorizedNodeInventory"); put("org.zstack.sdk.sns.SNSApplicationEndpointInventory", "org.zstack.sns.SNSApplicationEndpointInventory"); put("org.zstack.sdk.sns.SNSApplicationPlatformInventory", "org.zstack.sns.SNSApplicationPlatformInventory"); put("org.zstack.sdk.sns.SNSSmsReceiverInventory", "org.zstack.sns.SNSSmsReceiverInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/RegisterLicenseServerResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/RegisterLicenseServerResult.java index 848c6defc75..905feafa03b 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/RegisterLicenseServerResult.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/RegisterLicenseServerResult.java @@ -1,14 +1,23 @@ package org.zstack.sdk.license.api.server; - +import org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory; +import org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory; public class RegisterLicenseServerResult { - public java.lang.String appId; - public void setAppId(java.lang.String appId) { - this.appId = appId; + public LicenseAuthorizedNodeInventory licenseClient; + public void setLicenseClient(LicenseAuthorizedNodeInventory licenseClient) { + this.licenseClient = licenseClient; + } + public LicenseAuthorizedNodeInventory getLicenseClient() { + return this.licenseClient; + } + + public LicenseAuthorizedNodeInventory licenseServer; + public void setLicenseServer(LicenseAuthorizedNodeInventory licenseServer) { + this.licenseServer = licenseServer; } - public java.lang.String getAppId() { - return this.appId; + public LicenseAuthorizedNodeInventory getLicenseServer() { + return this.licenseServer; } } diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerResult.java index 8a2a5a3d755..0a3710c6f4c 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerResult.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerResult.java @@ -1,6 +1,6 @@ package org.zstack.sdk.license.api.server; -import org.zstack.sdk.LicenseAuthorizedNodeInventory; +import org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory; public class UpgradeToLicenseServerResult { public LicenseAuthorizedNodeInventory inventory; diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerResult.java index 1a9289ce6d6..de5484187cc 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerResult.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerResult.java @@ -1,6 +1,7 @@ package org.zstack.sdk.license.api.server; - +import org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory; +import org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory; public class VerifyLicenseServerResult { public java.lang.String accessKeyId; @@ -19,12 +20,20 @@ public java.lang.String getAccessKeySecret() { return this.accessKeySecret; } - public java.lang.String serverAppId; - public void setServerAppId(java.lang.String serverAppId) { - this.serverAppId = serverAppId; + public LicenseAuthorizedNodeInventory licenseClient; + public void setLicenseClient(LicenseAuthorizedNodeInventory licenseClient) { + this.licenseClient = licenseClient; + } + public LicenseAuthorizedNodeInventory getLicenseClient() { + return this.licenseClient; + } + + public LicenseAuthorizedNodeInventory licenseServer; + public void setLicenseServer(LicenseAuthorizedNodeInventory licenseServer) { + this.licenseServer = licenseServer; } - public java.lang.String getServerAppId() { - return this.serverAppId; + public LicenseAuthorizedNodeInventory getLicenseServer() { + return this.licenseServer; } } diff --git a/sdk/src/main/java/org/zstack/sdk/LicenseAuthorizedNodeInventory.java b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedNodeInventory.java similarity index 86% rename from sdk/src/main/java/org/zstack/sdk/LicenseAuthorizedNodeInventory.java rename to sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedNodeInventory.java index c217ab619c6..fde99128f9d 100644 --- a/sdk/src/main/java/org/zstack/sdk/LicenseAuthorizedNodeInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedNodeInventory.java @@ -1,4 +1,4 @@ -package org.zstack.sdk; +package org.zstack.sdk.license.header.server; @@ -12,6 +12,14 @@ public java.lang.String getUuid() { return this.uuid; } + public java.lang.String appId; + public void setAppId(java.lang.String appId) { + this.appId = appId; + } + public java.lang.String getAppId() { + return this.appId; + } + public java.lang.String ip; public void setIp(java.lang.String ip) { this.ip = ip; From 9d6231bcb9f674d1802e0ed8f64345ae705aab8a Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Tue, 29 Jul 2025 11:05:53 +0800 Subject: [PATCH 537/737] [license]: resolve shared license code compatibility issues Resolves: ZSTAC-76293 Change-Id: I7375747629376741897574646678757a7a734578 --- .../org/zstack/core/rest/RESTFacadeImpl.java | 104 +++++++++ .../java/org/zstack/core/retry/Retry.java | 4 + .../main/java/org/zstack/header/Confirm.java | 5 + .../zstack/header/errorcode/ErrorCode.java | 5 + .../org/zstack/header/rest/RESTFacade.java | 2 + .../java/org/zstack/header/rest/RestHttp.java | 221 ++++++++++++++++++ sdk/src/main/java/SourceClassMap.java | 4 +- 7 files changed, 343 insertions(+), 2 deletions(-) create mode 100644 header/src/main/java/org/zstack/header/Confirm.java create mode 100644 header/src/main/java/org/zstack/header/rest/RestHttp.java diff --git a/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java b/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java index dd35a75a80e..4f2157deca2 100755 --- a/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java @@ -520,6 +520,110 @@ public T syncJsonPost(String url, Object body, Class returnClass, TimeUni return syncJsonPost(url, body == null ? null : JSONObjectUtil.toJsonString(body),null, returnClass, unit, timeout); } + public RestHttp http(Class returnClass) { + RestHttp http = new RestHttp<>(returnClass) + .withHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE); + + if (CoreGlobalProperty.UNIT_TEST_ON) { + http.retryIfException(ResourceAccessException.class); + } else { + http.retryIfException(ResourceAccessException.class, HttpStatusCodeException.class); + } + + return http + .withHandler(this::syncJson) + .withErrorCodeBuilder((e, http2) -> { + if (e instanceof HttpStatusCodeException) { + final HttpStatusCodeException exception = (HttpStatusCodeException) e; + return operr("failed to %s to %s, status code: %s, response body: %s", + http2.getMethod().toString().toLowerCase(), + http2.getPath(), + exception.getStatusCode(), exception.getResponseBodyAsString()); + } else if (e instanceof ResourceAccessException) { + return operr("failed to %s to %s, IO Error: %s", + http2.getMethod().toString().toLowerCase(), + http2.getPath(), + e.getMessage()); + } + return null; + }); + } + + protected ResponseEntity syncJson(RestHttp http) { + String body = http.getBody() == null ? "" : http.getBody(); + + HttpHeaders requestHeaders = new HttpHeaders(); + requestHeaders.setAll(http.getHeaders()); + requestHeaders.setContentLength(body.length()); + HttpEntity req = new HttpEntity<>(body, requestHeaders); + ResponseEntity rsp = syncRawJson(req, http); + + if (logger.isTraceEnabled()) { + logger.trace(String.format("[http response(url: %s)] %s", http.getPath(), rsp.getBody())); + } + return rsp; + } + + public ResponseEntity syncRawJson(HttpEntity req, RestHttp http) { + if (logger.isTraceEnabled()) { + logger.trace(String.format("json %s[%s], %s", http.getMethod().toString().toLowerCase(), http.getPath(), req)); + } + + ResponseEntity rsp; + final String url = http.getPath(); + final HttpMethod method = http.getMethod(); + + try { + if (http.isRetry()) { + rsp = new Retry>() { + { + retryConditions.addAll(http.getRetryIfExceptionMatched()); + times = http.getRetryTimes(); + interval = http.getRetryIntervalInSeconds(); + } + + @Override + protected ResponseEntity call() { + if (http.isTimeoutEnabled()) { + return template.exchange(url, method, req, String.class); + } else { + final long millis = http.getTimeoutInMillis(); + return template.exchange(url, method, req, String.class, Platform.getUuid(), millis, millis); + } + } + }.run(); + } else { + rsp = (http.isTimeoutEnabled()) ? + template.exchange(url, method, req, String.class, + Platform.getUuid(), http.getTimeoutInMillis(), http.getTimeoutInMillis()) : + template.exchange(url, method, req, String.class); + } + } catch (Exception e) { + if (http.getErrorCodeBuilder() != null) { + ErrorCode errorCode = http.getErrorCodeBuilder().apply(e, http); + if (errorCode != null) { + throw new OperationFailureException(errorCode); + } + } + throw e; + } + + boolean valid = false; + if (method == HttpMethod.DELETE && rsp.getStatusCode() == org.springframework.http.HttpStatus.NO_CONTENT) { + valid = true; + } else if (method == HttpMethod.POST && rsp.getStatusCode() == org.springframework.http.HttpStatus.CREATED) { + valid = true; + } else if (rsp.getStatusCode() == org.springframework.http.HttpStatus.OK || rsp.getStatusCode() == org.springframework.http.HttpStatus.ACCEPTED) { + valid = true; + } + + if (!valid) { + throw new OperationFailureException(operr("failed to %s to %s, status code: %s, response body: %s", method.toString().toLowerCase(), url, rsp.getStatusCode(), rsp.getBody())); + } + + return rsp; + } + @Override public T syncJsonPost(String url, String body, Class returnClass) { return syncJsonPost(url, body, null, returnClass, null, -1); diff --git a/core/src/main/java/org/zstack/core/retry/Retry.java b/core/src/main/java/org/zstack/core/retry/Retry.java index 27a12d9d91a..440027b0d6a 100755 --- a/core/src/main/java/org/zstack/core/retry/Retry.java +++ b/core/src/main/java/org/zstack/core/retry/Retry.java @@ -1,5 +1,6 @@ package org.zstack.core.retry; +import org.zstack.header.Confirm; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.SysErrors; import org.zstack.header.exception.CloudRuntimeException; @@ -10,6 +11,8 @@ import static org.zstack.core.Platform.i18n; import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.TimeUnit; import java.util.function.Function; @@ -40,6 +43,7 @@ public RetryException(String message, Throwable cause, boolean enableSuppression protected int times, count = 5; protected int interval = 1; + protected final List> retryConditions = new ArrayList<>(); private static final CLogger logger = Utils.getLogger(Retry.class); diff --git a/header/src/main/java/org/zstack/header/Confirm.java b/header/src/main/java/org/zstack/header/Confirm.java new file mode 100644 index 00000000000..ae503815262 --- /dev/null +++ b/header/src/main/java/org/zstack/header/Confirm.java @@ -0,0 +1,5 @@ +package org.zstack.header; + +public enum Confirm { + Yes, No, Skip +} diff --git a/header/src/main/java/org/zstack/header/errorcode/ErrorCode.java b/header/src/main/java/org/zstack/header/errorcode/ErrorCode.java index 3da94d1f9cd..0d1dbf94bba 100755 --- a/header/src/main/java/org/zstack/header/errorcode/ErrorCode.java +++ b/header/src/main/java/org/zstack/header/errorcode/ErrorCode.java @@ -39,6 +39,11 @@ public void putToOpaque(String key, Object value) { opaque.put(key, value); } + public ErrorCode withOpaque(String key, Object value) { + putToOpaque(key,value); + return this; + } + public Object getFromOpaque(String key) { return opaque == null ? null : opaque.get(key); } diff --git a/header/src/main/java/org/zstack/header/rest/RESTFacade.java b/header/src/main/java/org/zstack/header/rest/RESTFacade.java index 6dca102465d..e9d3120f9d6 100755 --- a/header/src/main/java/org/zstack/header/rest/RESTFacade.java +++ b/header/src/main/java/org/zstack/header/rest/RESTFacade.java @@ -64,6 +64,8 @@ public interface RESTFacade { T syncJsonPut(String url, String body, Map headers, Class returnClass, TimeUnit unit, long timeout); + RestHttp http(Class returnClass); + ResponseEntity syncRawJson(String url, HttpEntity req, HttpMethod method, TimeUnit unit, long timeout); HttpHeaders syncHead(String url); diff --git a/header/src/main/java/org/zstack/header/rest/RestHttp.java b/header/src/main/java/org/zstack/header/rest/RestHttp.java new file mode 100644 index 00000000000..7c7527698fc --- /dev/null +++ b/header/src/main/java/org/zstack/header/rest/RestHttp.java @@ -0,0 +1,221 @@ +package org.zstack.header.rest; + +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.zstack.header.Confirm; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.ErrorableValue; +import org.zstack.header.errorcode.OperationFailureException; +import org.zstack.utils.DebugUtils; +import org.zstack.utils.TypeUtils; +import org.zstack.utils.gson.JSONObjectUtil; + +import java.util.*; +import java.util.function.BiFunction; +import java.util.function.Function; + +import static org.zstack.header.Confirm.*; + +public class RestHttp { + public final Class returnClass; + + // basic info + protected String path; + protected Map headers = new HashMap<>(); + protected String body; + protected HttpMethod method; + + // request parameters + protected boolean timeoutEnabled = true; + protected long timeoutInMillis = 1800000L; // -1 means never timeout + protected boolean retry = true; + protected int retryTimes = 5; + protected int retryIntervalInSeconds = 1; + + // response handlers + protected BiFunction, ErrorCode> errorCodeBuilder; + protected Function, ResponseEntity> handler; + protected final List> retryIfExceptionMatched = new ArrayList<>(); + + public RestHttp(Class returnClass) { + this.returnClass = Objects.requireNonNull(returnClass); + } + + public RestHttp withPath(String path) { + this.path = path; + return this; + } + + public RestHttp withHeader(String key, String value) { + this.headers.put(key, value); + return this; + } + + public RestHttp withBody(String body) { + this.body = body; + return this; + } + + public RestHttp withBodyJson(Object body) { + this.body = JSONObjectUtil.toJsonString(body); + return this; + } + + public RestHttp withTimeoutInMillis(long timeoutInMillis) { + this.timeoutEnabled = true; + this.timeoutInMillis = timeoutInMillis; + return this; + } + + /** + * Not recommended + */ + public RestHttp withoutTimeout() { + this.timeoutEnabled = false; + this.timeoutInMillis = -1L; + return this; + } + + public RestHttp withRetry(int retryTimes, int retryIntervalInSeconds) { + this.retry = true; + this.retryTimes = retryTimes; + this.retryIntervalInSeconds = retryIntervalInSeconds; + return this; + } + + public RestHttp withoutRetry() { + this.retry = false; + return this; + } + + public RestHttp retryIfException(Function checker) { + this.retryIfExceptionMatched.add(checker); + return this; + } + + public RestHttp retryIfException(Class... classes) { + return retryIfException(e -> TypeUtils.isTypeOf(e, classes) ? Yes : No); + } + + public RestHttp withHandler(Function, ResponseEntity> handler) { + this.handler = handler; + return this; + } + + public RestHttp withErrorCodeBuilder(BiFunction, ErrorCode> errorCodeBuilder) { + this.errorCodeBuilder = errorCodeBuilder; + return this; + } + + @SuppressWarnings("unchecked") + protected ErrorableValue handleWithErrorCode() { + try { + DebugUtils.Assert(this.handler != null, "handler cannot be null"); + final ResponseEntity entity = this.handler.apply(this); + if (returnClass == Void.class) { + return ErrorableValue.of(null); + } + + return returnClass == String.class ? + ((ErrorableValue) ErrorableValue.of(entity.getBody())) : + ErrorableValue.of(JSONObjectUtil.toObject(entity.getBody(), returnClass)); + } catch (OperationFailureException e) { + return ErrorableValue.ofErrorCode(e.getErrorCode()); + } + } + + public T get() { + return call(HttpMethod.GET); + } + + public ErrorableValue getWithErrorCode() { + return callWithErrorCode(HttpMethod.GET); + } + + public T post() { + return call(HttpMethod.POST); + } + + public ErrorableValue postWithErrorCode() { + return callWithErrorCode(HttpMethod.POST); + } + + public T put() { + return call(HttpMethod.PUT); + } + + public ErrorableValue putWithErrorCode() { + return callWithErrorCode(HttpMethod.PUT); + } + + public T delete() { + return call(HttpMethod.DELETE); + } + + public ErrorableValue deleteWithErrorCode() { + return callWithErrorCode(HttpMethod.DELETE); + } + + public T call(HttpMethod method) { + this.method = method; + ErrorableValue result = handleWithErrorCode(); + if (!result.isSuccess()) { + throw new OperationFailureException(result.error); + } + return result.result; + } + + public ErrorableValue callWithErrorCode(HttpMethod method) { + this.method = method; + return handleWithErrorCode(); + } + + public ResponseEntity exchange(HttpMethod method) { + this.method = method; + return this.handler.apply(this); + } + + public String getPath() { + return path; + } + + public Map getHeaders() { + return headers; + } + + public String getBody() { + return body; + } + + public HttpMethod getMethod() { + return method; + } + + public boolean isTimeoutEnabled() { + return timeoutEnabled; + } + + public long getTimeoutInMillis() { + return timeoutInMillis; + } + + public boolean isRetry() { + return retry; + } + + public int getRetryTimes() { + return retryTimes; + } + + public int getRetryIntervalInSeconds() { + return retryIntervalInSeconds; + } + + public BiFunction, ErrorCode> getErrorCodeBuilder() { + return errorCodeBuilder; + } + + public List> getRetryIfExceptionMatched() { + return retryIfExceptionMatched; + } +} diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 9aebf19cffb..b8d45c589c8 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -494,12 +494,12 @@ public class SourceClassMap { put("org.zstack.license.LicenseInventory", "org.zstack.sdk.LicenseInventory"); put("org.zstack.license.UKeyInventory", "org.zstack.sdk.UKeyInventory"); put("org.zstack.license.UKeyStatus", "org.zstack.sdk.UKeyStatus"); + put("org.zstack.license.header.server.LicenseAuthorizedNodeInventory", "org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory"); put("org.zstack.log.server.LogCategory", "org.zstack.sdk.LogCategory"); put("org.zstack.log.server.LogLevel", "org.zstack.sdk.LogLevel"); put("org.zstack.log.server.LogServerInventory", "org.zstack.sdk.LogServerInventory"); put("org.zstack.log.server.LogType", "org.zstack.sdk.LogType"); put("org.zstack.login.entity.LdapResourceRefInventory", "org.zstack.sdk.LdapResourceRefInventory"); - put("org.zstack.license.header.server.LicenseAuthorizedNodeInventory", "org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory"); put("org.zstack.loginControl.entity.AccessControlRuleInventory", "org.zstack.sdk.AccessControlRuleInventory"); put("org.zstack.loginControl.entity.ControlStrategy", "org.zstack.sdk.ControlStrategy"); put("org.zstack.mevoco.ShareableVolumeVmInstanceRefInventory", "org.zstack.sdk.ShareableVolumeVmInstanceRefInventory"); @@ -1599,8 +1599,8 @@ public class SourceClassMap { put("org.zstack.sdk.identity.role.RoleState", "org.zstack.header.identity.role.RoleState"); put("org.zstack.sdk.identity.role.RoleStateEvent", "org.zstack.header.identity.role.RoleStateEvent"); put("org.zstack.sdk.identity.role.RoleType", "org.zstack.header.identity.role.RoleType"); - put("org.zstack.sdk.sns.SNSAliyunSmsEndpointInventory", "org.zstack.sns.SNSAliyunSmsEndpointInventory"); put("org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory", "org.zstack.license.header.server.LicenseAuthorizedNodeInventory"); + put("org.zstack.sdk.sns.SNSAliyunSmsEndpointInventory", "org.zstack.sns.SNSAliyunSmsEndpointInventory"); put("org.zstack.sdk.sns.SNSApplicationEndpointInventory", "org.zstack.sns.SNSApplicationEndpointInventory"); put("org.zstack.sdk.sns.SNSApplicationPlatformInventory", "org.zstack.sns.SNSApplicationPlatformInventory"); put("org.zstack.sdk.sns.SNSSmsReceiverInventory", "org.zstack.sns.SNSSmsReceiverInventory"); From bdbbbdc105bc13e5c3d47ad2f79b3d57559ed5fb Mon Sep 17 00:00:00 2001 From: Zhang Wenhao Date: Mon, 9 Jun 2025 17:54:32 +0800 Subject: [PATCH 538/737] [sdk]: add license server sdk Resolves: ZSV-8949 DBImpact Change-Id: I6e6f666b67736e736c746879726c69726e657974 --- conf/db/upgrade/V5.4.0.1__schema.sql | 43 ------- conf/db/upgrade/V5.4.0__schema.sql | 44 +++++++ conf/errorCodes/license.xml | 10 ++ sdk/src/main/java/SourceClassMap.java | 12 ++ .../java/org/zstack/sdk/LicenseInventory.java | 10 +- .../GetLicenseAuthorizedCapacityAction.java | 3 + .../GetLicenseAuthorizedCapacityResult.java | 17 ++- .../server/RequestLicenseCapacityAction.java | 113 ++++++++++++++++++ .../server/RequestLicenseCapacityResult.java | 14 +++ ...hdrawLicenseCapacityApplicationAction.java | 107 +++++++++++++++++ ...hdrawLicenseCapacityApplicationResult.java | 7 ++ ...uthorizedCapacityClientAddOnUsageView.java | 31 +++++ ...enseAuthorizedCapacityClientUsageView.java | 55 +++++++++ .../LicenseAuthorizedCapacityInventory.java | 79 ++++++++++++ ...enseAuthorizedCapacityUsageDetailView.java | 39 ++++++ .../header/server/LicenseUsageView.java | 39 ++++++ .../TotalLicenseAuthorizedCapacityView.java | 48 ++++++++ .../java/org/zstack/testlib/ApiHelper.groovy | 54 +++++++++ .../main/java/org/zstack/testlib/Test.groovy | 54 +++++++++ .../java/org/zstack/testlib/VmSpec.groovy | 1 + 20 files changed, 735 insertions(+), 45 deletions(-) delete mode 100644 conf/db/upgrade/V5.4.0.1__schema.sql create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/WithdrawLicenseCapacityApplicationAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/WithdrawLicenseCapacityApplicationResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityClientAddOnUsageView.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityClientUsageView.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityUsageDetailView.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseUsageView.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/header/server/TotalLicenseAuthorizedCapacityView.java diff --git a/conf/db/upgrade/V5.4.0.1__schema.sql b/conf/db/upgrade/V5.4.0.1__schema.sql deleted file mode 100644 index 4e0e119bb8f..00000000000 --- a/conf/db/upgrade/V5.4.0.1__schema.sql +++ /dev/null @@ -1,43 +0,0 @@ -CREATE TABLE IF NOT EXISTS `zstack`.`LicenseAuthorizedNodeVO` ( - `uuid` char(32) NOT NULL UNIQUE, - `appId` char(32) NOT NULL, - `ip` varchar(255) NOT NULL, - `lastSyncDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59', - `status` varchar(64) NOT NULL, - `type` varchar(64) NOT NULL, - `lastOpDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59' ON UPDATE CURRENT_TIMESTAMP, - `createDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59', - PRIMARY KEY (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE IF NOT EXISTS `zstack`.`LicenseAuthorizedCapacityVO` ( - `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, - `nodeUuid` char(32) NOT NULL UNIQUE, - `resourceUuid` char(32) DEFAULT NULL, - `quotaType` varchar(64) NOT NULL, - `quota` bigint unsigned DEFAULT 0, - `licenseType` varchar(64) NOT NULL, - `type` varchar(64) NOT NULL, - `lastOpDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59' ON UPDATE CURRENT_TIMESTAMP, - `createDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59', - PRIMARY KEY (`id`), - CONSTRAINT `fkLicenseAuthorizedCapacityLicenseAuthorizedNode` FOREIGN KEY (`nodeUuid`) REFERENCES `LicenseAuthorizedNodeVO` (`uuid`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE IF NOT EXISTS `zstack`.`LicenseAuthorizeHistoryVO` ( - `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, - `nodeUuid` char(32) NOT NULL UNIQUE, - `resourceUuid` char(32) DEFAULT NULL, - `quotaType` varchar(64) NOT NULL, - `usageFrom` bigint unsigned DEFAULT 0, - `usageTo` bigint unsigned DEFAULT NULL, - `quota` bigint unsigned DEFAULT 0, - `licenseType` varchar(64) NOT NULL, - `type` varchar(64) NOT NULL, - `action` varchar(255) NOT NULL, - `result` varchar(64) DEFAULT NULL, - `error` text DEFAULT NULL, - `requestUuid` char(32) NOT NULL, - `createDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/conf/db/upgrade/V5.4.0__schema.sql b/conf/db/upgrade/V5.4.0__schema.sql index c21f700b79c..0925b143a4a 100644 --- a/conf/db/upgrade/V5.4.0__schema.sql +++ b/conf/db/upgrade/V5.4.0__schema.sql @@ -11,6 +11,50 @@ CREATE TABLE `SSOClientAttributeVO` ( CONSTRAINT `fkSSOClientAttributeVOSSOClientVO` FOREIGN KEY (`ssoClientUuid`) REFERENCES SSOClientVO (`uuid`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE IF NOT EXISTS `zstack`.`LicenseAuthorizedNodeVO` ( + `uuid` char(32) NOT NULL UNIQUE, + `appId` char(32) NOT NULL, + `ip` varchar(255) NOT NULL, + `lastSyncDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59', + `status` varchar(64) NOT NULL, + `type` varchar(64) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59', + PRIMARY KEY (`uuid`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`LicenseAuthorizedCapacityVO` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `nodeUuid` char(32) NOT NULL, + `resourceUuid` char(32) DEFAULT NULL, + `quotaType` varchar(64) NOT NULL, + `quota` bigint unsigned DEFAULT 0, + `licenseType` varchar(64) NOT NULL, + `type` varchar(64) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59', + PRIMARY KEY (`id`), + CONSTRAINT `fkLicenseAuthorizedCapacityLicenseAuthorizedNode` FOREIGN KEY (`nodeUuid`) REFERENCES `LicenseAuthorizedNodeVO` (`uuid`) ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`LicenseAuthorizeHistoryVO` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `nodeUuid` char(32) NOT NULL, + `resourceUuid` char(32) DEFAULT NULL, + `quotaType` varchar(64) NOT NULL, + `usageFrom` bigint unsigned DEFAULT 0, + `usageTo` bigint unsigned DEFAULT NULL, + `quota` bigint unsigned DEFAULT 0, + `licenseType` varchar(64) NOT NULL, + `type` varchar(64) NOT NULL, + `action` varchar(255) NOT NULL, + `result` varchar(64) DEFAULT NULL, + `error` text DEFAULT NULL, + `requestUuid` char(32) NOT NULL, + `createDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59', + PRIMARY KEY (`id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + CREATE TABLE `zstack`.`L3NetworkSequenceNumberVO` ( `id` int unsigned NOT NULL UNIQUE AUTO_INCREMENT, PRIMARY KEY (`id`) diff --git a/conf/errorCodes/license.xml b/conf/errorCodes/license.xml index 1a9411d0a3a..8acf5f86168 100755 --- a/conf/errorCodes/license.xml +++ b/conf/errorCodes/license.xml @@ -120,5 +120,15 @@ 3204 License client call license server API error + + + 3211 + Invalid license capacity application + + + + 3212 + License quota exceeded + diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index b8d45c589c8..73ca658fada 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -494,7 +494,13 @@ public class SourceClassMap { put("org.zstack.license.LicenseInventory", "org.zstack.sdk.LicenseInventory"); put("org.zstack.license.UKeyInventory", "org.zstack.sdk.UKeyInventory"); put("org.zstack.license.UKeyStatus", "org.zstack.sdk.UKeyStatus"); + put("org.zstack.license.header.server.LicenseAuthorizedCapacityClientAddOnUsageView", "org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityClientAddOnUsageView"); + put("org.zstack.license.header.server.LicenseAuthorizedCapacityClientUsageView", "org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityClientUsageView"); + put("org.zstack.license.header.server.LicenseAuthorizedCapacityInventory", "org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityInventory"); + put("org.zstack.license.header.server.LicenseAuthorizedCapacityUsageDetailView", "org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityUsageDetailView"); put("org.zstack.license.header.server.LicenseAuthorizedNodeInventory", "org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory"); + put("org.zstack.license.header.server.LicenseUsageView", "org.zstack.sdk.license.header.server.LicenseUsageView"); + put("org.zstack.license.header.server.TotalLicenseAuthorizedCapacityView", "org.zstack.sdk.license.header.server.TotalLicenseAuthorizedCapacityView"); put("org.zstack.log.server.LogCategory", "org.zstack.sdk.LogCategory"); put("org.zstack.log.server.LogLevel", "org.zstack.sdk.LogLevel"); put("org.zstack.log.server.LogServerInventory", "org.zstack.sdk.LogServerInventory"); @@ -1599,7 +1605,13 @@ public class SourceClassMap { put("org.zstack.sdk.identity.role.RoleState", "org.zstack.header.identity.role.RoleState"); put("org.zstack.sdk.identity.role.RoleStateEvent", "org.zstack.header.identity.role.RoleStateEvent"); put("org.zstack.sdk.identity.role.RoleType", "org.zstack.header.identity.role.RoleType"); + put("org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityClientAddOnUsageView", "org.zstack.license.header.server.LicenseAuthorizedCapacityClientAddOnUsageView"); + put("org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityClientUsageView", "org.zstack.license.header.server.LicenseAuthorizedCapacityClientUsageView"); + put("org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityInventory", "org.zstack.license.header.server.LicenseAuthorizedCapacityInventory"); + put("org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityUsageDetailView", "org.zstack.license.header.server.LicenseAuthorizedCapacityUsageDetailView"); put("org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory", "org.zstack.license.header.server.LicenseAuthorizedNodeInventory"); + put("org.zstack.sdk.license.header.server.LicenseUsageView", "org.zstack.license.header.server.LicenseUsageView"); + put("org.zstack.sdk.license.header.server.TotalLicenseAuthorizedCapacityView", "org.zstack.license.header.server.TotalLicenseAuthorizedCapacityView"); put("org.zstack.sdk.sns.SNSAliyunSmsEndpointInventory", "org.zstack.sns.SNSAliyunSmsEndpointInventory"); put("org.zstack.sdk.sns.SNSApplicationEndpointInventory", "org.zstack.sns.SNSApplicationEndpointInventory"); put("org.zstack.sdk.sns.SNSApplicationPlatformInventory", "org.zstack.sns.SNSApplicationPlatformInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/LicenseInventory.java b/sdk/src/main/java/org/zstack/sdk/LicenseInventory.java index 730e79abb59..204094611e3 100644 --- a/sdk/src/main/java/org/zstack/sdk/LicenseInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/LicenseInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk; - +import org.zstack.sdk.license.header.server.LicenseUsageView; public class LicenseInventory { @@ -156,4 +156,12 @@ public java.lang.Integer getAvailableVmNum() { return this.availableVmNum; } + public LicenseUsageView usage; + public void setUsage(LicenseUsageView usage) { + this.usage = usage; + } + public LicenseUsageView getUsage() { + return this.usage; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityAction.java index 5b442748907..81bdb0fce6c 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityAction.java @@ -25,6 +25,9 @@ public Result throwExceptionIfError() { } } + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clientAuthorizedNodeUuid; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityResult.java index ebcd3bc6bb0..d7ef5eb8490 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityResult.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityResult.java @@ -1,7 +1,22 @@ package org.zstack.sdk.license.api.server; - +import org.zstack.sdk.license.header.server.TotalLicenseAuthorizedCapacityView; public class GetLicenseAuthorizedCapacityResult { + public TotalLicenseAuthorizedCapacityView total; + public void setTotal(TotalLicenseAuthorizedCapacityView total) { + this.total = total; + } + public TotalLicenseAuthorizedCapacityView getTotal() { + return this.total; + } + + public java.util.List clients; + public void setClients(java.util.List clients) { + this.clients = clients; + } + public java.util.List getClients() { + return this.clients; + } } diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityAction.java new file mode 100644 index 00000000000..72ec861a03a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityAction.java @@ -0,0 +1,113 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class RequestLicenseCapacityAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.license.api.server.RequestLicenseCapacityResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String resourceUuid; + + @Param(required = true, validValues = {"CPU","VM","Host","Capacity","None"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String quotaType; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {0L,9223372036854775807L}, noTrim = false) + public java.lang.Long quota; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clientAuthorizedNodeUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String licenseType; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.license.api.server.RequestLicenseCapacityResult value = res.getResult(org.zstack.sdk.license.api.server.RequestLicenseCapacityResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.RequestLicenseCapacityResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/license-server/capacity-application"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityResult.java new file mode 100644 index 00000000000..000317b5d1f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.license.api.server; + +import org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityInventory; + +public class RequestLicenseCapacityResult { + public LicenseAuthorizedCapacityInventory inventory; + public void setInventory(LicenseAuthorizedCapacityInventory inventory) { + this.inventory = inventory; + } + public LicenseAuthorizedCapacityInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/WithdrawLicenseCapacityApplicationAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/WithdrawLicenseCapacityApplicationAction.java new file mode 100644 index 00000000000..6334e2ec530 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/WithdrawLicenseCapacityApplicationAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class WithdrawLicenseCapacityApplicationAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.license.api.server.WithdrawLicenseCapacityApplicationResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.util.List resourceUuidList; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clientAuthorizedNodeUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String licenseType; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.license.api.server.WithdrawLicenseCapacityApplicationResult value = res.getResult(org.zstack.sdk.license.api.server.WithdrawLicenseCapacityApplicationResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.WithdrawLicenseCapacityApplicationResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/license-server/capacity-application"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/WithdrawLicenseCapacityApplicationResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/WithdrawLicenseCapacityApplicationResult.java new file mode 100644 index 00000000000..f8020407e72 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/WithdrawLicenseCapacityApplicationResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.license.api.server; + + + +public class WithdrawLicenseCapacityApplicationResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityClientAddOnUsageView.java b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityClientAddOnUsageView.java new file mode 100644 index 00000000000..4b3f9c3c59d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityClientAddOnUsageView.java @@ -0,0 +1,31 @@ +package org.zstack.sdk.license.header.server; + + + +public class LicenseAuthorizedCapacityClientAddOnUsageView { + + public java.lang.String module; + public void setModule(java.lang.String module) { + this.module = module; + } + public java.lang.String getModule() { + return this.module; + } + + public long used; + public void setUsed(long used) { + this.used = used; + } + public long getUsed() { + return this.used; + } + + public java.util.List usageDetails; + public void setUsageDetails(java.util.List usageDetails) { + this.usageDetails = usageDetails; + } + public java.util.List getUsageDetails() { + return this.usageDetails; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityClientUsageView.java b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityClientUsageView.java new file mode 100644 index 00000000000..df2514261bf --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityClientUsageView.java @@ -0,0 +1,55 @@ +package org.zstack.sdk.license.header.server; + +import org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory; + +public class LicenseAuthorizedCapacityClientUsageView { + + public java.lang.String clientAppId; + public void setClientAppId(java.lang.String clientAppId) { + this.clientAppId = clientAppId; + } + public java.lang.String getClientAppId() { + return this.clientAppId; + } + + public java.lang.String clientAuthorizedNodeUuid; + public void setClientAuthorizedNodeUuid(java.lang.String clientAuthorizedNodeUuid) { + this.clientAuthorizedNodeUuid = clientAuthorizedNodeUuid; + } + public java.lang.String getClientAuthorizedNodeUuid() { + return this.clientAuthorizedNodeUuid; + } + + public LicenseAuthorizedNodeInventory clientInventory; + public void setClientInventory(LicenseAuthorizedNodeInventory clientInventory) { + this.clientInventory = clientInventory; + } + public LicenseAuthorizedNodeInventory getClientInventory() { + return this.clientInventory; + } + + public long platformUsed; + public void setPlatformUsed(long platformUsed) { + this.platformUsed = platformUsed; + } + public long getPlatformUsed() { + return this.platformUsed; + } + + public java.util.List platformUsageDetails; + public void setPlatformUsageDetails(java.util.List platformUsageDetails) { + this.platformUsageDetails = platformUsageDetails; + } + public java.util.List getPlatformUsageDetails() { + return this.platformUsageDetails; + } + + public java.util.List addOns; + public void setAddOns(java.util.List addOns) { + this.addOns = addOns; + } + public java.util.List getAddOns() { + return this.addOns; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityInventory.java b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityInventory.java new file mode 100644 index 00000000000..cb5184b0207 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityInventory.java @@ -0,0 +1,79 @@ +package org.zstack.sdk.license.header.server; + + + +public class LicenseAuthorizedCapacityInventory { + + public java.lang.Long id; + public void setId(java.lang.Long id) { + this.id = id; + } + public java.lang.Long getId() { + return this.id; + } + + public java.lang.String nodeUuid; + public void setNodeUuid(java.lang.String nodeUuid) { + this.nodeUuid = nodeUuid; + } + public java.lang.String getNodeUuid() { + return this.nodeUuid; + } + + public java.lang.String resourceUuid; + public void setResourceUuid(java.lang.String resourceUuid) { + this.resourceUuid = resourceUuid; + } + public java.lang.String getResourceUuid() { + return this.resourceUuid; + } + + public java.lang.String quotaType; + public void setQuotaType(java.lang.String quotaType) { + this.quotaType = quotaType; + } + public java.lang.String getQuotaType() { + return this.quotaType; + } + + public java.lang.Long quota; + public void setQuota(java.lang.Long quota) { + this.quota = quota; + } + public java.lang.Long getQuota() { + return this.quota; + } + + public java.lang.String licenseType; + public void setLicenseType(java.lang.String licenseType) { + this.licenseType = licenseType; + } + public java.lang.String getLicenseType() { + return this.licenseType; + } + + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityUsageDetailView.java b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityUsageDetailView.java new file mode 100644 index 00000000000..e8d8e567b18 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityUsageDetailView.java @@ -0,0 +1,39 @@ +package org.zstack.sdk.license.header.server; + + + +public class LicenseAuthorizedCapacityUsageDetailView { + + public java.lang.String resourceUuid; + public void setResourceUuid(java.lang.String resourceUuid) { + this.resourceUuid = resourceUuid; + } + public java.lang.String getResourceUuid() { + return this.resourceUuid; + } + + public long used; + public void setUsed(long used) { + this.used = used; + } + public long getUsed() { + return this.used; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseUsageView.java b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseUsageView.java new file mode 100644 index 00000000000..dd713fdddfa --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseUsageView.java @@ -0,0 +1,39 @@ +package org.zstack.sdk.license.header.server; + + + +public class LicenseUsageView { + + public java.lang.String quotaType; + public void setQuotaType(java.lang.String quotaType) { + this.quotaType = quotaType; + } + public java.lang.String getQuotaType() { + return this.quotaType; + } + + public long quota; + public void setQuota(long quota) { + this.quota = quota; + } + public long getQuota() { + return this.quota; + } + + public long used; + public void setUsed(long used) { + this.used = used; + } + public long getUsed() { + return this.used; + } + + public long available; + public void setAvailable(long available) { + this.available = available; + } + public long getAvailable() { + return this.available; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/header/server/TotalLicenseAuthorizedCapacityView.java b/sdk/src/main/java/org/zstack/sdk/license/header/server/TotalLicenseAuthorizedCapacityView.java new file mode 100644 index 00000000000..7860523e8b8 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/header/server/TotalLicenseAuthorizedCapacityView.java @@ -0,0 +1,48 @@ +package org.zstack.sdk.license.header.server; + +import org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory; +import org.zstack.sdk.LicenseInventory; + +public class TotalLicenseAuthorizedCapacityView { + + public java.lang.String serverAppId; + public void setServerAppId(java.lang.String serverAppId) { + this.serverAppId = serverAppId; + } + public java.lang.String getServerAppId() { + return this.serverAppId; + } + + public java.lang.String serverAuthorizedNodeUuid; + public void setServerAuthorizedNodeUuid(java.lang.String serverAuthorizedNodeUuid) { + this.serverAuthorizedNodeUuid = serverAuthorizedNodeUuid; + } + public java.lang.String getServerAuthorizedNodeUuid() { + return this.serverAuthorizedNodeUuid; + } + + public LicenseAuthorizedNodeInventory serverInventory; + public void setServerInventory(LicenseAuthorizedNodeInventory serverInventory) { + this.serverInventory = serverInventory; + } + public LicenseAuthorizedNodeInventory getServerInventory() { + return this.serverInventory; + } + + public LicenseInventory platformLicense; + public void setPlatformLicense(LicenseInventory platformLicense) { + this.platformLicense = platformLicense; + } + public LicenseInventory getPlatformLicense() { + return this.platformLicense; + } + + public java.util.List addOns; + public void setAddOns(java.util.List addOns) { + this.addOns = addOns; + } + public java.util.List getAddOns() { + return this.addOns; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 2aa8a844e3f..f1217280c22 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -50714,6 +50714,33 @@ abstract class ApiHelper { } + def requestLicenseCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.RequestLicenseCapacityAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.RequestLicenseCapacityAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def syncLicenseCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.SyncLicenseCapacityAction.class) Closure c) { def a = new org.zstack.sdk.license.api.server.SyncLicenseCapacityAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -50849,6 +50876,33 @@ abstract class ApiHelper { } + def withdrawLicenseCapacityApplication(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.WithdrawLicenseCapacityApplicationAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.WithdrawLicenseCapacityApplicationAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def addSNSSmsReceiver(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.sns.AddSNSSmsReceiverAction.class) Closure c) { def a = new org.zstack.sdk.sns.AddSNSSmsReceiverAction() a.sessionId = Test.currentEnvSpec?.session?.uuid diff --git a/testlib/src/main/java/org/zstack/testlib/Test.groovy b/testlib/src/main/java/org/zstack/testlib/Test.groovy index de15b0e2e64..553d3084959 100755 --- a/testlib/src/main/java/org/zstack/testlib/Test.groovy +++ b/testlib/src/main/java/org/zstack/testlib/Test.groovy @@ -1,5 +1,7 @@ package org.zstack.testlib +import com.google.gson.JsonParser +import com.google.gson.JsonSyntaxException import okhttp3.OkHttpClient import org.apache.commons.lang.StringUtils import org.zstack.core.Platform @@ -15,6 +17,8 @@ import org.zstack.header.message.AbstractBeforeDeliveryMessageInterceptor import org.zstack.header.message.AbstractBeforeSendMessageInterceptor import org.zstack.header.message.Event import org.zstack.header.message.Message +import org.zstack.sdk.ErrorCode +import org.zstack.sdk.ErrorCodeList import org.zstack.sdk.SessionInventory import org.zstack.sdk.ZQLQueryReturn import org.zstack.sdk.ZSClient @@ -1010,6 +1014,56 @@ mysqldump -u root zstack > ${failureLogDir.absolutePath}/dbdump.sql } } + static void expectApiFailure(Closure c, @DelegatesTo(strategy = Closure.OWNER_FIRST, value = ErrorCodeList.class) Closure errorCodeChecker) { + AssertionError error = null + + try { + c() + } catch (AssertionError t) { + error = t + } catch (Throwable t) { + throw new Exception("expected to get a Throwable of AssertionError but got ${t.class.name}", t) + } + + if (error == null) { + throw new ExpectedException("expect AssertionError raised, but nothing happens") + } + + def message = error.message + if (!message.startsWith("API failure: ")) { + throw new Exception("unexpected API failure", error) + } + + ErrorCodeList code + try { + int startIndex = "API failure: ".length() + int endIndex = message.indexOf(". Expression: ") + code = JSONObjectUtil.toObject(message.substring(startIndex, endIndex), ErrorCodeList) + } catch (JsonSyntaxException | IndexOutOfBoundsException ignored) { + throw new Exception("unexpected API failure", error) + } + + if (code.code == "sdk.1000") { + code = extractOriginalErrorFromSDKError(code) + } + + errorCodeChecker.resolveStrategy = Closure.OWNER_FIRST + errorCodeChecker.delegate = code + errorCodeChecker.call() + } + + /** + * MN always return HTTP code 503 when MN raise Identity ErrorCode. + * ZStack SDK will warp true error code with sdk.1000. + * + * The function would extract original error code from SDKErrorCode. + */ + static ErrorCodeList extractOriginalErrorFromSDKError(ErrorCode sdkError) { + assert sdkError.code == "sdk.1000" + def errorCodeJson = JsonParser.parseString(sdkError.details).getAsJsonObject().get("error") + return JSONObjectUtil.rehashObject(errorCodeJson, ErrorCodeList.class) + } + protected void configProperty() { return } diff --git a/testlib/src/main/java/org/zstack/testlib/VmSpec.groovy b/testlib/src/main/java/org/zstack/testlib/VmSpec.groovy index 0dfd82348d0..b40d90c6e74 100755 --- a/testlib/src/main/java/org/zstack/testlib/VmSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/VmSpec.groovy @@ -169,6 +169,7 @@ class VmSpec extends Spec implements HasSession { delegate.l3NetworkUuids = l3Networks() delegate.defaultL3NetworkUuid = defaultL3Network() delegate.systemTags = systemTags + delegate.timeout = 60000 } postCreate { From 6119aec5b72041e4bb0a1adae0779626d0f27070 Mon Sep 17 00:00:00 2001 From: Zhang Wenhao Date: Tue, 13 Aug 2024 15:07:30 +0800 Subject: [PATCH 539/737] [core]: introduce class QueryMore Related: ZSV-6559 Change-Id: I6b75736c6c6f617a73777369627a75736964786d --- core/src/main/java/org/zstack/core/db/Q.java | 26 + .../java/org/zstack/core/db/QueryMore.java | 473 ++++++++++++++++++ .../java/org/zstack/core/db/SQLBatch.java | 4 + .../org/zstack/core/db/SimpleQueryImpl.java | 30 ++ .../db/schema/QueryMoreCase.groovy | 142 ++++++ 5 files changed, 675 insertions(+) create mode 100644 core/src/main/java/org/zstack/core/db/QueryMore.java create mode 100644 test/src/test/groovy/org/zstack/test/integration/db/schema/QueryMoreCase.groovy diff --git a/core/src/main/java/org/zstack/core/db/Q.java b/core/src/main/java/org/zstack/core/db/Q.java index 708fe20c048..8dcdcdf48fa 100755 --- a/core/src/main/java/org/zstack/core/db/Q.java +++ b/core/src/main/java/org/zstack/core/db/Q.java @@ -31,6 +31,16 @@ public Q orderBy(SingularAttribute attr, SimpleQuery.Od order) { return this; } + public Q orderByAsc(SingularAttribute attr) { + q.orderBy(attr, SimpleQuery.Od.ASC); + return this; + } + + public Q orderByDesc(SingularAttribute attr) { + q.orderBy(attr, SimpleQuery.Od.DESC); + return this; + } + public Q groupBy(SingularAttribute attr) { q.groupBy(attr); return this; @@ -116,11 +126,19 @@ public Q in(SingularAttribute attr, Collection val) { return this; } + public QueryMore in(SingularAttribute attr, Q subQuery) { + return toQueryMore().in(attr, subQuery); + } + public Q notIn(SingularAttribute attr, Collection val) { q.add(attr, SimpleQuery.Op.NOT_IN, val); return this; } + public QueryMore notIn(SingularAttribute attr, Q subQuery) { + return toQueryMore().notIn(attr, subQuery); + } + public Q isNull(SingularAttribute attr) { q.add(attr, SimpleQuery.Op.NULL); return this; @@ -164,4 +182,12 @@ public Q notLike(SingularAttribute attr, Object val) { public static Q New(Class clz) { return new Q(clz); } + + public static QueryMore New(Class clz, Class... more) { + return new QueryMore(clz, more); + } + + public QueryMore toQueryMore() { + return q.toQueryMore(); + } } diff --git a/core/src/main/java/org/zstack/core/db/QueryMore.java b/core/src/main/java/org/zstack/core/db/QueryMore.java new file mode 100644 index 00000000000..9b56f29a1e9 --- /dev/null +++ b/core/src/main/java/org/zstack/core/db/QueryMore.java @@ -0,0 +1,473 @@ +package org.zstack.core.db; + +import org.apache.commons.collections.CollectionUtils; +import org.zstack.header.exception.CloudRuntimeException; +import org.zstack.utils.DebugUtils; + +import javax.persistence.Tuple; +import javax.persistence.metamodel.SingularAttribute; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.IntFunction; + +import static org.zstack.core.db.SimpleQuery.Op.*; + +public class QueryMore { + private final Class[] tables; + private List selects = new ArrayList<>(); + private List orders = new ArrayList<>(); + private List conditions = new ArrayList<>(); + private List moreConditions = new ArrayList<>(); + private Integer limit; + private Integer start; + + private int tableIndex; + private int tableOffset; // used in sub-query + + QueryMore(Class one, Class... more) { + this.tables = new Class[more.length + 1]; + this.tables[0] = one; + + if (more.length > 0) { + System.arraycopy(more, 0, this.tables, 1, more.length); + } + } + + public class AttrInfo { + SingularAttribute attr; + String function; + int tableIndex; + + private String toSql() { + if (function != null) { + return attr == null ? + String.format("%s(t%d)", function, tableIndex + tableOffset) : + String.format("%s(t%d.%s)", function, tableIndex + tableOffset, attr.getName()); + } + + return attr == null ? + String.format("t%d", tableIndex + tableOffset) : + String.format("t%d.%s", tableIndex + tableOffset, attr.getName()); + } + } + + public class OrderInfo { + SingularAttribute attr; + SimpleQuery.Od od; + int tableIndex; + + private String toSql() { + return String.format("t%d.%s %s", tableIndex + tableOffset, attr.getName(), od.name()); + } + } + + public static class TableOption { + IntFunction function; + Consumer> attrConsumer; + + public ResultType table0(SingularAttribute attr) { + return table(0, attr); + } + + public ResultType table1(SingularAttribute attr) { + return table(1, attr); + } + + public ResultType table2(SingularAttribute attr) { + return table(2, attr); + } + + public ResultType table3(SingularAttribute attr) { + return table(3, attr); + } + + public ResultType table(int tableIndex, SingularAttribute attr) { + attrConsumer.accept(attr); + return function.apply(tableIndex); + } + } + + public class Condition { + SingularAttribute attr; + SimpleQuery.Op op; + Object value; + int tableIndex; + + private String toSql(int paramIndex) { + switch (op) { + case NULL: case NOT_NULL: + return String.format("t%d.%s %s", tableIndex + tableOffset, attr.getName(), op.toString()); + case IN: case NOT_IN: case LIKE: case NOT_LIKE: + return String.format("t%d.%s %s :p%d", tableIndex + tableOffset, attr.getName(), op.toString(), paramIndex); + } + return String.format("t%d.%s%s:p%d", tableIndex + tableOffset, attr.getName(), op.toString(), paramIndex); + } + + private boolean needParam() { + return op != NULL && op != NOT_NULL; + } + + private boolean hasSubQuery() { + return value instanceof QueryMore; + } + + private String handleSubQuery(Map params, int tableOffset) { + if (value instanceof QueryMore) { + final QueryMore q = (QueryMore) value; + q.tableOffset = tableOffset; + final String sql = q.toSqlAndFillParamMap(params); + return String.format("t%d.%s %s (%s)", + tableIndex + QueryMore.this.tableOffset, + attr.getName(), op.toString(), sql); + } + throw new CloudRuntimeException("should not be here"); + } + } + + public class ConditionBetweenTables { + int tableIndex1; + SingularAttribute attr1; + SimpleQuery.Op op; + int tableIndex2; + SingularAttribute attr2; + + private String toSql() { + return String.format("t%d.%s%st%d.%s", + tableIndex1 + tableOffset, attr1.getName(), op.toString(), + tableIndex2 + tableOffset, attr2.getName()); + } + } + + public QueryMore condition(SingularAttribute attr, SimpleQuery.Op op, Object value) { + Condition c = new Condition(); + c.attr = attr; + c.op = op; + c.value = value; + c.tableIndex = tableIndex; + conditions.add(c); + return this; + } + + public QueryMore selectThisTable() { + AttrInfo info = new AttrInfo(); + info.tableIndex = tableIndex; + selects.add(info); + return this; + } + + public QueryMore selectCountThisTable() { + AttrInfo info = new AttrInfo(); + info.tableIndex = tableIndex; + info.function = "count"; + selects.add(info); + return this; + } + + public QueryMore select(SingularAttribute... attrs) { + for (int i = 0; i < attrs.length; i++) { + AttrInfo info = new AttrInfo(); + info.attr = attrs[i]; + info.tableIndex = tableIndex; + selects.add(info); + } + return this; + } + + public QueryMore selectSum(SingularAttribute attr) { + AttrInfo info = new AttrInfo(); + info.attr = attr; + info.function = "sum"; + info.tableIndex = tableIndex; + selects.add(info); + return this; + } + + public QueryMore selectCount(SingularAttribute attr) { + AttrInfo info = new AttrInfo(); + info.attr = attr; + info.function = "count"; + info.tableIndex = tableIndex; + selects.add(info); + return this; + } + + public QueryMore eq(SingularAttribute attr, Object value) { + return condition(attr, EQ, value); + } + + // table0.uuid = table1.refUuid + public TableOption eq(SingularAttribute attr) { + ConditionBetweenTables condition = new ConditionBetweenTables(); + condition.tableIndex1 = tableIndex; + condition.attr1 = attr; + condition.op = SimpleQuery.Op.EQ; + + TableOption result = new TableOption<>(); + result.attrConsumer = (attr2) -> condition.attr2 = attr2; + result.function = (tableIndex) -> { + condition.tableIndex2 = tableIndex; + moreConditions.add(condition); + return this; + }; + return result; + } + + public QueryMore notEq(SingularAttribute attr, Object value) { + return condition(attr, NOT_EQ, value); + } + + public QueryMore in(SingularAttribute attr, Collection collection) { + DebugUtils.Assert(CollectionUtils.isNotEmpty(collection), "Op.IN value cannot be null or empty"); + return condition(attr, IN, collection); + } + + public QueryMore in(SingularAttribute attr, QueryMore subQuery) { + return condition(attr, IN, subQuery); + } + + public QueryMore in(SingularAttribute attr, Q subQuery) { + return in(attr, subQuery.toQueryMore()); + } + + public QueryMore notIn(SingularAttribute attr, Collection collection) { + return condition(attr, NOT_IN, collection); + } + + public QueryMore notIn(SingularAttribute attr, QueryMore subQuery) { + return condition(attr, NOT_IN, subQuery); + } + + public QueryMore notIn(SingularAttribute attr, Q subQuery) { + return in(attr, subQuery.toQueryMore()); + } + + public QueryMore isNull(SingularAttribute attr) { + return condition(attr, NULL, null); + } + + public QueryMore notNull(SingularAttribute attr) { + return condition(attr, NOT_NULL, null); + } + + public QueryMore gt(SingularAttribute attr, Object value) { + return condition(attr, GT, value); + } + + public QueryMore gte(SingularAttribute attr, Object value) { + return condition(attr, GTE, value); + } + + public QueryMore lt(SingularAttribute attr, Object value) { + return condition(attr, LT, value); + } + + public QueryMore lte(SingularAttribute attr, Object value) { + return condition(attr, LTE, value); + } + + public QueryMore like(SingularAttribute attr, Object value) { + return condition(attr, LIKE, value); + } + + public QueryMore notLike(SingularAttribute attr, Object value) { + return condition(attr, NOT_LIKE, value); + } + + public QueryMore table(int tableIndex) { + this.tableIndex = tableIndex; + return this; + } + + public QueryMore table0() { + return table(0); + } + + public QueryMore table1() { + return table(1); + } + + public QueryMore table2() { + return table(2); + } + + public QueryMore table3() { + return table(3); + } + + public QueryMore orderByAsc(SingularAttribute attr) { + OrderInfo order = new OrderInfo(); + order.tableIndex = tableIndex; + order.od = SimpleQuery.Od.ASC; + order.attr = attr; + orders.add(order); + return this; + } + + public QueryMore orderByDesc(SingularAttribute attr) { + OrderInfo order = new OrderInfo(); + order.tableIndex = tableIndex; + order.od = SimpleQuery.Od.DESC; + order.attr = attr; + orders.add(order); + return this; + } + + public QueryMore limit(int limit) { + this.limit = limit; + return this; + } + + public QueryMore start(int start) { + this.start = start; + return this; + } + + public String toSql() { + return toSqlAndFillParamMap(new HashMap<>()); + } + + private String toSqlAndFillParamMap(Map params) { + StringBuilder builder = new StringBuilder(); + + builder.append("select "); + if (!selects.isEmpty()) { + for (AttrInfo select : selects) { + builder.append(select.toSql()).append(','); + } + builder.deleteCharAt(builder.length() - 1); + } else if (tables.length == 1) { + builder.append("t0"); + } else { + builder.append('*'); + } + + builder.append(" from "); + for (int i = 0; i < tables.length; i++) { + Class table = tables[i]; + builder.append(table.getSimpleName()).append(' ').append('t').append(i + tableOffset).append(','); + } + builder.deleteCharAt(builder.length() - 1); + + if (!conditions.isEmpty() || !moreConditions.isEmpty()) { + builder.append(" where "); + List conditionScripts = new ArrayList<>(); + + for (Condition condition : conditions) { + if (condition.hasSubQuery()) { + conditionScripts.add(condition.handleSubQuery(params, tableOffset + tables.length)); + continue; + } + + int paramIndex = params.size(); + conditionScripts.add(condition.toSql(paramIndex)); + if (condition.needParam()) { + params.put("p" + paramIndex, condition.value); + } + } + + for (ConditionBetweenTables moreCondition : moreConditions) { + conditionScripts.add(moreCondition.toSql()); + } + + builder.append(String.join(" and ", conditionScripts)); + } + + if (!orders.isEmpty()) { + builder.append(" order by "); + + for (OrderInfo order : orders) { + builder.append(order.toSql()).append(','); + } + builder.deleteCharAt(builder.length() - 1); + } + + if (limit != null) { + builder.append(" limit ").append(limit); + } + if (start != null) { + builder.append(" offset ").append(start); + } + + return builder.toString(); + } + + @Override + public String toString() { + return toSql(); + } + + public SQL toSqlInstance(Class returnType) { + final Map paramMap = new HashMap<>(); + final SQL sqlInstance = SQL.New(toSqlAndFillParamMap(paramMap), returnType); + paramMap.forEach(sqlInstance::param); + return sqlInstance; + } + + public SQL toSqlInstance() { + final Map paramMap = new HashMap<>(); + final SQL sqlInstance = SQL.New(toSqlAndFillParamMap(paramMap)); + paramMap.forEach(sqlInstance::param); + return sqlInstance; + } + + public List list() { + if (this.selects.size() == 1 && this.selects.get(0).attr == null) { + int tableIndex = this.selects.get(0).tableIndex; + return toSqlInstance(tables[tableIndex]).list(); + } else if (this.selects.isEmpty() && this.tables.length == 1) { + return toSqlInstance(tables[0]).list(); + } + + return toSqlInstance().list(); + } + + public T find() { + if (this.selects.size() == 1 && this.selects.get(0).attr == null) { + int tableIndex = this.selects.get(0).tableIndex; + return toSqlInstance(tables[tableIndex]).find(); + } else if (this.selects.isEmpty() && this.tables.length == 1) { + return toSqlInstance(tables[0]).find(); + } + + return toSqlInstance().find(); + } + + public T find(Class returnType) { + return toSqlInstance(returnType).find(); + } + + public Tuple findTuple() { + return toSqlInstance(Tuple.class).find(); + } + + public List listTuple() { + return toSqlInstance(Tuple.class).list(); + } + + public Long count() { + if (selects.isEmpty()) { + AttrInfo info = new AttrInfo(); + info.tableIndex = 0; + info.function = "count"; + selects.add(info); + } else if (selects.size() == 1) { + selects.get(0).function = "count"; + } else { + throw new CloudRuntimeException("You must specify an attribute using the selectCount() method"); + } + + return toSqlInstance(Long.class).find(); + } + + public boolean isExists() { + return count() > 0; + } + + public static QueryMore New(Class clz) { + return new QueryMore(clz); + } +} diff --git a/core/src/main/java/org/zstack/core/db/SQLBatch.java b/core/src/main/java/org/zstack/core/db/SQLBatch.java index fe476e4b6f4..c23ea9ec71c 100755 --- a/core/src/main/java/org/zstack/core/db/SQLBatch.java +++ b/core/src/main/java/org/zstack/core/db/SQLBatch.java @@ -68,6 +68,10 @@ protected Q q(Class clz) { return Q.New(clz); } + protected QueryMore q(Class first, Class... more) { + return Q.New(first, more); + } + @Transactional private void _execute() { scripts(); diff --git a/core/src/main/java/org/zstack/core/db/SimpleQueryImpl.java b/core/src/main/java/org/zstack/core/db/SimpleQueryImpl.java index 18f5bebe189..9ba9b0ac494 100755 --- a/core/src/main/java/org/zstack/core/db/SimpleQueryImpl.java +++ b/core/src/main/java/org/zstack/core/db/SimpleQueryImpl.java @@ -405,4 +405,34 @@ public SimpleQuery setStart(int start) { this.start = start; return this; } + + public QueryMore toQueryMore() { + QueryMore q = new QueryMore(_entityClass); + + if (start != null) { + q.start(start); + } + if (limit != null) { + q.limit(limit); + } + + if (!_selects.isEmpty()) { + q.select(_selects.stream().map(s -> s._attr).toArray(SingularAttribute[]::new)); + } + if (!orderInfos.isEmpty()) { + for (OrderInfo orderInfo : orderInfos) { + if (orderInfo.od == Od.ASC) { + q.orderByAsc(orderInfo.attr); + } else { + q.orderByDesc(orderInfo.attr); + } + } + } + if (!_conditions.isEmpty()) { + for (Condition condition : _conditions) { + q.condition(condition._attr, condition._op, condition._val[0]); + } + } + return q; + } } diff --git a/test/src/test/groovy/org/zstack/test/integration/db/schema/QueryMoreCase.groovy b/test/src/test/groovy/org/zstack/test/integration/db/schema/QueryMoreCase.groovy new file mode 100644 index 00000000000..d243e7fb5d9 --- /dev/null +++ b/test/src/test/groovy/org/zstack/test/integration/db/schema/QueryMoreCase.groovy @@ -0,0 +1,142 @@ +package org.zstack.test.integration.db.schema + +import org.zstack.core.db.Q +import org.zstack.header.host.HostVO +import org.zstack.header.host.HostVO_ +import org.zstack.header.identity.AccountResourceRefVO +import org.zstack.header.identity.AccountResourceRefVO_ +import org.zstack.header.vm.VmInstanceVO +import org.zstack.header.vm.VmInstanceVO_ +import org.zstack.sdk.HostInventory +import org.zstack.sdk.VmInstanceInventory +import org.zstack.test.integration.ZStackTest +import org.zstack.test.integration.identity.Env +import org.zstack.testlib.EnvSpec +import org.zstack.testlib.SubCase + +class QueryMoreCase extends SubCase { + EnvSpec env + + VmInstanceInventory vm + HostInventory host + + @Override + void setup() { + useSpring(ZStackTest.springSpec) + } + + @Override + void environment() { + env = Env.oneVmBasicEnv() + } + + @Override + void test() { + env.create { + prepare() + testBasicQueryMode() + } + } + + void prepare() { + vm = env.inventoryByName("vm") as VmInstanceInventory + host = env.inventoryByName("kvm") as HostInventory + } + + void testBasicQueryMode() { + def q = Q.New(VmInstanceVO.class, HostVO.class) + .table0() + .eq(VmInstanceVO_.uuid, vm.uuid) + .eq(VmInstanceVO_.hostUuid).table1(HostVO_.uuid) + .table1() + .select(HostVO_.@name) + .orderByDesc(HostVO_.uuid) + + assert q.toString() == "select t1.name from VmInstanceVO t0,HostVO t1 where t0.uuid=:p0 and t0.hostUuid=t1.uuid order by t1.uuid DESC" + def list = q.list() + logger.info(list.toString()) + + assert list.size() == 1 + assert list[0] == "kvm" + + def q2 = Q.New(HostVO.class) + .select(HostVO_.@name) + .in(HostVO_.uuid, + Q.New(VmInstanceVO.class) + .select(VmInstanceVO_.hostUuid) + .eq(VmInstanceVO_.uuid, vm.uuid) + ) + .orderByDesc(HostVO_.uuid) + + assert q2.toString() == "select t0.name from HostVO t0 where t0.uuid in (select t1.hostUuid from VmInstanceVO t1 where t1.uuid=:p0) order by t0.uuid DESC" + list = q2.list() + logger.info(list.toString()) + + assert list.size() == 1 + assert list[0] == "kvm" + + def q3 = Q.New(VmInstanceVO.class, AccountResourceRefVO.class) + .table0() + .select(VmInstanceVO_.clusterUuid) + .eq(VmInstanceVO_.uuid).table1(AccountResourceRefVO_.resourceUuid) + .eq(VmInstanceVO_.type, "UserVm") + .table1() + .eq(AccountResourceRefVO_.accountUuid, env.session.accountUuid) + + assert q3.toString() == "select t0.clusterUuid from VmInstanceVO t0,AccountResourceRefVO t1 where t0.type=:p0 and t1.accountUuid=:p1 and t0.uuid=t1.resourceUuid" + list = q3.list() + logger.info(list.toString()) + + assert list.size() == 1 + assert list[0] == vm.clusterUuid + + def q4 = Q.New(VmInstanceVO.class, AccountResourceRefVO.class) + .table0() + .selectThisTable() + .eq(VmInstanceVO_.uuid).table1(AccountResourceRefVO_.resourceUuid) + .eq(VmInstanceVO_.type, "UserVm") + .table1() + .eq(AccountResourceRefVO_.accountUuid, env.session.accountUuid) + + assert q4.toString() == "select t0 from VmInstanceVO t0,AccountResourceRefVO t1 where t0.type=:p0 and t1.accountUuid=:p1 and t0.uuid=t1.resourceUuid" + list = q4.list() + logger.info(list.toString()) + + assert list.size() == 1 + assert list[0] instanceof VmInstanceVO + assert (list[0] as VmInstanceVO).uuid == vm.uuid + + def q5 = Q.New(VmInstanceVO.class, AccountResourceRefVO.class) + .table0() + .selectCountThisTable() + .eq(VmInstanceVO_.uuid).table1(AccountResourceRefVO_.resourceUuid) + .eq(VmInstanceVO_.type, "UserVm") + .table1() + .eq(AccountResourceRefVO_.accountUuid, env.session.accountUuid) + + assert q5.toString() == "select count(t0) from VmInstanceVO t0,AccountResourceRefVO t1 where t0.type=:p0 and t1.accountUuid=:p1 and t0.uuid=t1.resourceUuid" + long count = q5.count() + assert count == 1L + + def q6 = Q.New(VmInstanceVO.class, AccountResourceRefVO.class) + .table0() + .selectThisTable() + .eq(VmInstanceVO_.uuid).table1(AccountResourceRefVO_.resourceUuid) + .in(VmInstanceVO_.type, ["UserVm", "ApplianceVm"]) + .table1() + .eq(AccountResourceRefVO_.accountUuid, env.session.accountUuid) + + assert q6.toString() == "select t0 from VmInstanceVO t0,AccountResourceRefVO t1 where t0.type in :p0 and t1.accountUuid=:p1 and t0.uuid=t1.resourceUuid" + list = q6.list() + logger.info(list.toString()) + + assert list.size() == 2 // a VM, a router + assert list.every { it instanceof VmInstanceVO } + assert list.any { (it as VmInstanceVO).uuid == vm.uuid } + } + + @Override + void clean() { + env.delete() + } +} From 730ebf640080e75910f0b9926325810a93fa3639 Mon Sep 17 00:00:00 2001 From: Zhang Wenhao Date: Fri, 13 Jun 2025 15:54:37 +0800 Subject: [PATCH 540/737] [conf]: license client periodically sync info from server Related: ZSV-8949 Change-Id: I66787173707164627177707968797462696e7371 --- conf/errorCodes/license.xml | 19 ++++++++++++------- .../org/zstack/utils/CollectionUtils.java | 4 ++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/conf/errorCodes/license.xml b/conf/errorCodes/license.xml index 8acf5f86168..fa1db7d837a 100755 --- a/conf/errorCodes/license.xml +++ b/conf/errorCodes/license.xml @@ -96,6 +96,16 @@ License server call license client API error + + 3111 + Invalid license capacity application + + + + 3112 + License quota exceeded + + 3200 License client generic error @@ -122,13 +132,8 @@ - 3211 - Invalid license capacity application - - - - 3212 - License quota exceeded + 3205 + Invalid license capacity response from license server diff --git a/utils/src/main/java/org/zstack/utils/CollectionUtils.java b/utils/src/main/java/org/zstack/utils/CollectionUtils.java index b74d83c9c83..b04a0635668 100755 --- a/utils/src/main/java/org/zstack/utils/CollectionUtils.java +++ b/utils/src/main/java/org/zstack/utils/CollectionUtils.java @@ -56,6 +56,10 @@ public static List transform(Collection from, java.util.fun return from.stream().map(mapper).collect(Collectors.toList()); } + public static List transformAndRemoveNull(Collection from, java.util.function.Function mapper) { + return from.stream().map(mapper).filter(Objects::nonNull).collect(Collectors.toList()); + } + public static List filter(Collection from, Predicate tester) { return from.stream().filter(tester).collect(Collectors.toList()); } From 8c4050804425cf4a1991e2c1679041d8a25679a8 Mon Sep 17 00:00:00 2001 From: Zhang Wenhao Date: Wed, 18 Jun 2025 18:47:23 +0800 Subject: [PATCH 541/737] [mevoco]: fix example in APILogInMsg Related: ZSV-8949 Change-Id: I756c66756c616271706d68726768776e74656760 --- .../zstack/header/identity/login/APILogInMsg.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/header/src/main/java/org/zstack/header/identity/login/APILogInMsg.java b/header/src/main/java/org/zstack/header/identity/login/APILogInMsg.java index d8de8552f6a..9a23ad4f10b 100644 --- a/header/src/main/java/org/zstack/header/identity/login/APILogInMsg.java +++ b/header/src/main/java/org/zstack/header/identity/login/APILogInMsg.java @@ -112,4 +112,17 @@ public LoginResult loginAudit(APIMessage msg, APIReply reply) { String resourceUuid = reply.isSuccess() ? ((APILogInReply) reply).getInventory().getUuid() : ""; return new LoginResult(clientIp, clientBrowser, resourceUuid, SessionVO.class); } + + @Override + public String getOperator() { + return username; + } + + public static APILogInMsg __example__() { + APILogInMsg msg = new APILogInMsg(); + msg.setUsername("admin"); + msg.setPassword("password"); + msg.setLoginType("account"); + return msg; + } } From cfd051e48b6e07e09838f2a09d1cfc223a0a5f87 Mon Sep 17 00:00:00 2001 From: "Zhang, Wenhao" Date: Tue, 24 Jun 2025 06:26:39 +0000 Subject: [PATCH 542/737] [sdk]: add APIGetLicenseAuthorizedCapacityReply.serverCapacity Resolves: ZSV-8949 Change-Id: I63757075677a707161696364646d6d767369756b --- sdk/src/main/java/SourceClassMap.java | 2 ++ .../GetLicenseAuthorizedCapacityAction.java | 3 +++ .../GetLicenseAuthorizedCapacityResult.java | 9 ++++++++ ...enseAuthorizedCapacityServerUsageView.java | 23 +++++++++++++++++++ 4 files changed, 37 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityServerUsageView.java diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 73ca658fada..06524da5227 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -497,6 +497,7 @@ public class SourceClassMap { put("org.zstack.license.header.server.LicenseAuthorizedCapacityClientAddOnUsageView", "org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityClientAddOnUsageView"); put("org.zstack.license.header.server.LicenseAuthorizedCapacityClientUsageView", "org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityClientUsageView"); put("org.zstack.license.header.server.LicenseAuthorizedCapacityInventory", "org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityInventory"); + put("org.zstack.license.header.server.LicenseAuthorizedCapacityServerUsageView", "org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityServerUsageView"); put("org.zstack.license.header.server.LicenseAuthorizedCapacityUsageDetailView", "org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityUsageDetailView"); put("org.zstack.license.header.server.LicenseAuthorizedNodeInventory", "org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory"); put("org.zstack.license.header.server.LicenseUsageView", "org.zstack.sdk.license.header.server.LicenseUsageView"); @@ -1608,6 +1609,7 @@ public class SourceClassMap { put("org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityClientAddOnUsageView", "org.zstack.license.header.server.LicenseAuthorizedCapacityClientAddOnUsageView"); put("org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityClientUsageView", "org.zstack.license.header.server.LicenseAuthorizedCapacityClientUsageView"); put("org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityInventory", "org.zstack.license.header.server.LicenseAuthorizedCapacityInventory"); + put("org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityServerUsageView", "org.zstack.license.header.server.LicenseAuthorizedCapacityServerUsageView"); put("org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityUsageDetailView", "org.zstack.license.header.server.LicenseAuthorizedCapacityUsageDetailView"); put("org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory", "org.zstack.license.header.server.LicenseAuthorizedNodeInventory"); put("org.zstack.sdk.license.header.server.LicenseUsageView", "org.zstack.license.header.server.LicenseUsageView"); diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityAction.java index 81bdb0fce6c..510d48226c1 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityAction.java @@ -28,6 +28,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String clientAuthorizedNodeUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public boolean showServerCapacity = false; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityResult.java index d7ef5eb8490..914453c4bb9 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityResult.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityResult.java @@ -1,6 +1,7 @@ package org.zstack.sdk.license.api.server; import org.zstack.sdk.license.header.server.TotalLicenseAuthorizedCapacityView; +import org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityServerUsageView; public class GetLicenseAuthorizedCapacityResult { public TotalLicenseAuthorizedCapacityView total; @@ -19,4 +20,12 @@ public java.util.List getClients() { return this.clients; } + public LicenseAuthorizedCapacityServerUsageView server; + public void setServer(LicenseAuthorizedCapacityServerUsageView server) { + this.server = server; + } + public LicenseAuthorizedCapacityServerUsageView getServer() { + return this.server; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityServerUsageView.java b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityServerUsageView.java new file mode 100644 index 00000000000..d498f815d3a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityServerUsageView.java @@ -0,0 +1,23 @@ +package org.zstack.sdk.license.header.server; + + + +public class LicenseAuthorizedCapacityServerUsageView { + + public long platformUsed; + public void setPlatformUsed(long platformUsed) { + this.platformUsed = platformUsed; + } + public long getPlatformUsed() { + return this.platformUsed; + } + + public java.util.List addOns; + public void setAddOns(java.util.List addOns) { + this.addOns = addOns; + } + public java.util.List getAddOns() { + return this.addOns; + } + +} From 0e7a811c5243672f74beb9eee45ffc9c8c972d9e Mon Sep 17 00:00:00 2001 From: Zhang Wenhao Date: Tue, 24 Jun 2025 19:16:26 +0800 Subject: [PATCH 543/737] [header]: skip build schema of APIReply if field is transient Related: ZSV-8949 Change-Id: I626964757679706b66656f666669656567626270 --- core/src/main/java/org/zstack/core/db/QueryMore.java | 2 +- .../main/java/org/zstack/header/message/JsonSchemaBuilder.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/zstack/core/db/QueryMore.java b/core/src/main/java/org/zstack/core/db/QueryMore.java index 9b56f29a1e9..21d1441c677 100644 --- a/core/src/main/java/org/zstack/core/db/QueryMore.java +++ b/core/src/main/java/org/zstack/core/db/QueryMore.java @@ -242,7 +242,7 @@ public QueryMore notIn(SingularAttribute attr, QueryMore subQuery) { } public QueryMore notIn(SingularAttribute attr, Q subQuery) { - return in(attr, subQuery.toQueryMore()); + return notIn(attr, subQuery.toQueryMore()); } public QueryMore isNull(SingularAttribute attr) { diff --git a/header/src/main/java/org/zstack/header/message/JsonSchemaBuilder.java b/header/src/main/java/org/zstack/header/message/JsonSchemaBuilder.java index 8a9f5b98d39..668a5572868 100755 --- a/header/src/main/java/org/zstack/header/message/JsonSchemaBuilder.java +++ b/header/src/main/java/org/zstack/header/message/JsonSchemaBuilder.java @@ -27,7 +27,7 @@ public JsonSchemaBuilder(Object object) { private boolean isSkip(Field f) { return f.isAnnotationPresent(NoJsonSchema.class) || Modifier.isStatic(f.getModifiers()) - || f.isAnnotationPresent(GsonTransient.class); + || f.isAnnotationPresent(GsonTransient.class) || Modifier.isTransient(f.getModifiers()); } private void build(Object o, Stack paths) throws IllegalAccessException { From 9c99f997165a3b6717cd8e42b697c02b575a3c06 Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Tue, 23 Sep 2025 14:15:59 +0800 Subject: [PATCH 544/737] [host]: Supports returning cpuCoreNum when getting capacity Resolves: ZSTAC-77257 Change-Id: I737577257765547655441897574646678757a7a734578 --- .../compute/allocator/HostAllocatorManagerImpl.java | 6 ++++-- conf/db/upgrade/V5.4.0__schema.sql | 3 +++ .../header/allocator/HostCapacityInventory.java | 10 ++++++++++ .../org/zstack/header/allocator/HostCapacityVO.java | 11 +++++++++++ .../org/zstack/header/allocator/HostCapacityVO_.java | 1 + .../header/cluster/ReportHostCapacityMessage.java | 9 +++++++++ .../main/java/org/zstack/kvm/KVMAgentCommands.java | 10 ++++++++++ plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java | 1 + .../main/java/org/zstack/sdk/LicenseInventory.java | 8 ++++++++ .../api/server/RequestLicenseCapacityAction.java | 2 +- .../capacity/CheckHostCapacityWhenAddHostCase.groovy | 10 ++++++++++ 11 files changed, 68 insertions(+), 3 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorManagerImpl.java b/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorManagerImpl.java index daf3a9259a2..814cf91b83a 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorManagerImpl.java @@ -286,6 +286,7 @@ private void handle(ReportHostCapacityMessage msg) { vo.setAvailablePhysicalMemory(availMem); vo.setCpuNum(msg.getCpuNum()); vo.setCpuSockets(msg.getCpuSockets()); + vo.setCpuCoreNum(msg.getCpuCoreNum()); HostCapacityStruct s = new HostCapacityStruct(); s.setCpuSockets(vo.getCpuSockets()); @@ -308,6 +309,7 @@ private void handle(ReportHostCapacityMessage msg) { vo.setAvailablePhysicalMemory(availMem); vo.setTotalMemory(msg.getTotalMemory()); vo.setCpuSockets(msg.getCpuSockets()); + vo.setCpuCoreNum(msg.getCpuCoreNum()); HostCapacityStruct s = new HostCapacityStruct(); s.setCapacityVO(vo); @@ -327,10 +329,10 @@ private void handle(ReportHostCapacityMessage msg) { } private boolean needUpdateCapacity(HostCapacityVO vo, ReportHostCapacityMessage msg, long totalCpu, long avaliCpu, long availMem) { - return vo.getCpuNum() != msg.getCpuNum() || vo.getTotalCpu() != totalCpu + return vo.getCpuNum() != msg.getCpuNum() || vo.getTotalCpu() != totalCpu || vo.getAvailableCpu() != avaliCpu || vo.getTotalPhysicalMemory() != msg.getTotalMemory() || vo.getAvailablePhysicalMemory() != availMem || vo.getTotalMemory() != msg.getTotalMemory() - || vo.getCpuSockets() != msg.getCpuSockets(); + || vo.getCpuSockets() != msg.getCpuSockets() || vo.getCpuCoreNum() != msg.getCpuCoreNum(); } private void handle(final AllocateHostMsg msg) { diff --git a/conf/db/upgrade/V5.4.0__schema.sql b/conf/db/upgrade/V5.4.0__schema.sql index 0925b143a4a..693b0f60b6a 100644 --- a/conf/db/upgrade/V5.4.0__schema.sql +++ b/conf/db/upgrade/V5.4.0__schema.sql @@ -55,6 +55,9 @@ CREATE TABLE IF NOT EXISTS `zstack`.`LicenseAuthorizeHistoryVO` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +ALTER TABLE `zstack`.`LicenseHistoryVO` ADD COLUMN `quotaType` varchar(64) DEFAULT 'None'; +ALTER TABLE HostCapacityVO ADD cpuCoreNum int unsigned NOT NULL DEFAULT 0; + CREATE TABLE `zstack`.`L3NetworkSequenceNumberVO` ( `id` int unsigned NOT NULL UNIQUE AUTO_INCREMENT, PRIMARY KEY (`id`) diff --git a/header/src/main/java/org/zstack/header/allocator/HostCapacityInventory.java b/header/src/main/java/org/zstack/header/allocator/HostCapacityInventory.java index 8fd888110f2..ca76b7234ff 100755 --- a/header/src/main/java/org/zstack/header/allocator/HostCapacityInventory.java +++ b/header/src/main/java/org/zstack/header/allocator/HostCapacityInventory.java @@ -15,6 +15,7 @@ public class HostCapacityInventory { private Long totalCpu; private Integer cpuNum; private Integer cpuSockets; + private Integer cpuCoreNum; private Long availableMemory; private Long availableCpu; private Long totalPhysicalMemory; @@ -31,6 +32,7 @@ public static HostCapacityInventory valueOf(HostCapacityVO vo) { inv.setTotalPhysicalMemory(vo.getTotalPhysicalMemory()); inv.setCpuNum(vo.getCpuNum()); inv.setCpuSockets(vo.getCpuSockets()); + inv.setCpuCoreNum(vo.getCpuCoreNum()); return inv; } @@ -42,6 +44,14 @@ public static List valueOf(Collection vos return invs; } + public Integer getCpuCoreNum() { + return cpuCoreNum; + } + + public void setCpuCoreNum(Integer cpuCoreNum) { + this.cpuCoreNum = cpuCoreNum; + } + public Integer getCpuSockets() { return cpuSockets; } diff --git a/header/src/main/java/org/zstack/header/allocator/HostCapacityVO.java b/header/src/main/java/org/zstack/header/allocator/HostCapacityVO.java index 18a66f7af99..b6a17d1a91f 100755 --- a/header/src/main/java/org/zstack/header/allocator/HostCapacityVO.java +++ b/header/src/main/java/org/zstack/header/allocator/HostCapacityVO.java @@ -40,6 +40,9 @@ public class HostCapacityVO { @Column private int cpuSockets; + @Column + private int cpuCoreNum; + @Column @Index private long availableMemory; @@ -63,6 +66,14 @@ public int getCpuSockets() { return cpuSockets; } + public int getCpuCoreNum() { + return cpuCoreNum; + } + + public void setCpuCoreNum(int cpuCoreNum) { + this.cpuCoreNum = cpuCoreNum; + } + public void setCpuSockets(int cpuSockets) { this.cpuSockets = cpuSockets; } diff --git a/header/src/main/java/org/zstack/header/allocator/HostCapacityVO_.java b/header/src/main/java/org/zstack/header/allocator/HostCapacityVO_.java index 0e256752159..d521909ad5a 100755 --- a/header/src/main/java/org/zstack/header/allocator/HostCapacityVO_.java +++ b/header/src/main/java/org/zstack/header/allocator/HostCapacityVO_.java @@ -10,6 +10,7 @@ public class HostCapacityVO_ { public static volatile SingularAttribute totalCpu; public static volatile SingularAttribute cpuNum; public static volatile SingularAttribute cpuSockets; + public static volatile SingularAttribute cpuCoreNum; public static volatile SingularAttribute availableMemory; public static volatile SingularAttribute availableCpu; public static volatile SingularAttribute totalPhysicalMemory; diff --git a/header/src/main/java/org/zstack/header/cluster/ReportHostCapacityMessage.java b/header/src/main/java/org/zstack/header/cluster/ReportHostCapacityMessage.java index bd41d6a2cca..e2d069c6a10 100755 --- a/header/src/main/java/org/zstack/header/cluster/ReportHostCapacityMessage.java +++ b/header/src/main/java/org/zstack/header/cluster/ReportHostCapacityMessage.java @@ -10,6 +10,15 @@ public class ReportHostCapacityMessage extends NeedReplyMessage { private String hostUuid; private int cpuNum; private int cpuSockets; + private int cpuCoreNum; + + public int getCpuCoreNum() { + return cpuCoreNum; + } + + public void setCpuCoreNum(int cpuCoreNum) { + this.cpuCoreNum = cpuCoreNum; + } public int getCpuSockets() { return cpuSockets; diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index 9d8e5ddd1c4..91e5d885bd8 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -799,6 +799,16 @@ public static class HostCapacityResponse extends AgentResponse { private long usedMemory; @GrayVersion(value = "5.0.0") private int cpuSockets; + @GrayVersion(value = "5.4.0") + private int cpuCoreNum; + + public int getCpuCoreNum() { + return cpuCoreNum; + } + + public void setCpuCoreNum(int cpuCoreNum) { + this.cpuCoreNum = cpuCoreNum; + } public int getCpuSockets() { return cpuSockets; diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 87a0553fd3a..ab8c29640f3 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -1794,6 +1794,7 @@ public void run(MessageReply reply) { rmsg.setTotalMemory(rsp.getTotalMemory()); rmsg.setUsedMemory(rsp.getUsedMemory()); rmsg.setCpuSockets(rsp.getCpuSockets()); + rmsg.setCpuCoreNum(rsp.getCpuCoreNum()); rmsg.setServiceId(bus.makeLocalServiceId(HostAllocatorConstant.SERVICE_ID)); bus.send(rmsg, new CloudBusCallBack(msg) { @Override diff --git a/sdk/src/main/java/org/zstack/sdk/LicenseInventory.java b/sdk/src/main/java/org/zstack/sdk/LicenseInventory.java index 204094611e3..d4217d9b607 100644 --- a/sdk/src/main/java/org/zstack/sdk/LicenseInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/LicenseInventory.java @@ -68,6 +68,14 @@ public java.lang.String getLicenseType() { return this.licenseType; } + public java.lang.String quotaType; + public void setQuotaType(java.lang.String quotaType) { + this.quotaType = quotaType; + } + public java.lang.String getQuotaType() { + return this.quotaType; + } + public java.lang.String expiredDate; public void setExpiredDate(java.lang.String expiredDate) { this.expiredDate = expiredDate; diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityAction.java index 72ec861a03a..0f42eedfe4f 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityAction.java @@ -28,7 +28,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String resourceUuid; - @Param(required = true, validValues = {"CPU","VM","Host","Capacity","None"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"CPU_Socket","CPU_Core","VM","Host","Capacity","None"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String quotaType; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {0L,9223372036854775807L}, noTrim = false) diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/capacity/CheckHostCapacityWhenAddHostCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/capacity/CheckHostCapacityWhenAddHostCase.groovy index 2ae56b73372..8a66fb0827d 100755 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/capacity/CheckHostCapacityWhenAddHostCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/capacity/CheckHostCapacityWhenAddHostCase.groovy @@ -1,6 +1,9 @@ package org.zstack.test.integration.kvm.capacity import org.springframework.http.HttpEntity +import org.zstack.core.db.Q +import org.zstack.header.allocator.HostCapacityVO +import org.zstack.header.allocator.HostCapacityVO_ import org.zstack.kvm.KVMAgentCommands import org.zstack.kvm.KVMConstant import org.zstack.kvm.KVMGlobalConfig @@ -91,6 +94,7 @@ class CheckHostCapacityWhenAddHostCase extends SubCase { env.afterSimulator(KVMConstant.KVM_HOST_CAPACITY_PATH) { rsp, HttpEntity e -> rsp as KVMAgentCommands.HostCapacityResponse + rsp.setCpuCoreNum(20) rsp.setTotalMemory(SizeUnit.GIGABYTE.toByte(10)) return rsp } @@ -111,6 +115,11 @@ class CheckHostCapacityWhenAddHostCase extends SubCase { res = action.call() assert res.error == null + retryInSecs { + Integer cpuCoreNum = Q.New(HostCapacityVO.class).eq(HostCapacityVO_.uuid, res.value.getInventory().uuid).select(HostCapacityVO_.cpuCoreNum).findValue() + assert cpuCoreNum == 20 + } + deleteHost { uuid = res.value.inventory.uuid } @@ -141,3 +150,4 @@ class CheckHostCapacityWhenAddHostCase extends SubCase { env.delete() } } + From 845aedbbf51884239e55298a8be2ec0d671a4a3e Mon Sep 17 00:00:00 2001 From: "yingzhe.hu" Date: Wed, 24 Sep 2025 14:49:25 +0800 Subject: [PATCH 545/737] [kvm]: update ExpungeVmUserDefinedXmlHookScript rest request path APIImpact Resolves: ZSTAC-78661 Change-Id: I74636e69726973737862746c67736b70716e7978 --- .../kvm/xmlhook/APIExpungeVmUserDefinedXmlHookScriptMsg.java | 2 +- .../APIExpungeVmUserDefinedXmlHookScriptMsgDoc_zh_cn.groovy | 4 ++-- .../zstack/sdk/ExpungeVmUserDefinedXmlHookScriptAction.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/xmlhook/APIExpungeVmUserDefinedXmlHookScriptMsg.java b/plugin/kvm/src/main/java/org/zstack/kvm/xmlhook/APIExpungeVmUserDefinedXmlHookScriptMsg.java index 7aaa560775d..228b314fa0a 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/xmlhook/APIExpungeVmUserDefinedXmlHookScriptMsg.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/xmlhook/APIExpungeVmUserDefinedXmlHookScriptMsg.java @@ -6,7 +6,7 @@ import org.zstack.header.rest.RestRequest; @RestRequest( - path = "/vm-instances/xml-hook-script", + path = "/vm-instances/xml-hook-script/{uuid}", method = HttpMethod.DELETE, responseClass = APIExpungeVmUserDefinedXmlHookScriptEvent.class ) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/xmlhook/APIExpungeVmUserDefinedXmlHookScriptMsgDoc_zh_cn.groovy b/plugin/kvm/src/main/java/org/zstack/kvm/xmlhook/APIExpungeVmUserDefinedXmlHookScriptMsgDoc_zh_cn.groovy index eff27495dff..2a1df417940 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/xmlhook/APIExpungeVmUserDefinedXmlHookScriptMsgDoc_zh_cn.groovy +++ b/plugin/kvm/src/main/java/org/zstack/kvm/xmlhook/APIExpungeVmUserDefinedXmlHookScriptMsgDoc_zh_cn.groovy @@ -11,7 +11,7 @@ doc { rest { request { - url "DELETE /v1/vm-instances/xml-hook-script" + url "DELETE /v1/vm-instances/xml-hook-script/{uuid}" header (Authorization: 'OAuth the-session-uuid') @@ -25,7 +25,7 @@ doc { name "uuid" enclosedIn "" desc "资源的UUID,唯一标示该资源" - location "body" + location "url" type "String" optional false since "5.2.0" diff --git a/sdk/src/main/java/org/zstack/sdk/ExpungeVmUserDefinedXmlHookScriptAction.java b/sdk/src/main/java/org/zstack/sdk/ExpungeVmUserDefinedXmlHookScriptAction.java index c18da4275cc..43903c96df6 100644 --- a/sdk/src/main/java/org/zstack/sdk/ExpungeVmUserDefinedXmlHookScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ExpungeVmUserDefinedXmlHookScriptAction.java @@ -91,7 +91,7 @@ protected Map getNonAPIParameterMap() { protected RestInfo getRestInfo() { RestInfo info = new RestInfo(); info.httpMethod = "DELETE"; - info.path = "/vm-instances/xml-hook-script"; + info.path = "/vm-instances/xml-hook-script/{uuid}"; info.needSession = true; info.needPoll = true; info.parameterName = ""; From f8bb187eeb2cb4ccc9efce66bf6d1009a921eeb6 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Thu, 25 Sep 2025 13:45:40 +0800 Subject: [PATCH 546/737] [sdnController]: add import in HardwareL2VxlanNetworkPoolInventoryDoc Resolves: ZSTAC-51948 Change-Id: I73706b7a6c726d657a766c66776f6f6578797879 --- .../HardwareL2VxlanNetworkPoolInventoryDoc_zh_cn.groovy | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventoryDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventoryDoc_zh_cn.groovy index 3ca52dd5bd8..3d003dec971 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventoryDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventoryDoc_zh_cn.groovy @@ -1,4 +1,8 @@ package org.zstack.sdnController.header +import org.zstack.network.l2.vxlan.vtep.VtepInventory +import org.zstack.network.l2.vxlan.vtep.RemoteVtepInventory +import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory +import org.zstack.network.l2.vxlan.vxlanNetworkPool.VniRangeInventory doc { From ab70b438c2afcf04f37430bf5b11a4a064406dca Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Fri, 26 Sep 2025 11:44:29 +0800 Subject: [PATCH 547/737] [zbs]: bump zbs agent version to 5.4.0 GlobalPropertyImpact Resolves: ZSTAC-74915 Change-Id: I72647770726366737478676175797869616b6761 --- .../src/main/java/org/zstack/storage/zbs/ZbsGlobalProperty.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsGlobalProperty.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsGlobalProperty.java index 3c2dabef30b..16cd549cdf6 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsGlobalProperty.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsGlobalProperty.java @@ -15,7 +15,7 @@ public class ZbsGlobalProperty { public static String PRIMARY_STORAGE_MODULE_PATH; @GlobalProperty(name = "Zbs.primaryStorage.ansiblePlaybook", defaultValue = "zbsp.py") public static String PRIMARY_STORAGE_PLAYBOOK_NAME; - @GlobalProperty(name = "Zbs.primaryStorage.agentPackageName", defaultValue = "zbsprimarystorage-5.3.0.tar.gz") + @GlobalProperty(name = "Zbs.primaryStorage.agentPackageName", defaultValue = "zbsprimarystorage-5.4.0.tar.gz") public static String PRIMARY_STORAGE_PACKAGE_NAME; @GlobalProperty(name = "Zbs.primaryStorageAgent.port", defaultValue = "7763") public static int PRIMARY_STORAGE_AGENT_PORT; From aa15462f314dac7f7e3151a5ab437b1c89878299 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Fri, 26 Sep 2025 16:49:32 +0800 Subject: [PATCH 548/737] [storage]: optimize external ps reinit error message Resolves: ZSTAC-78799 Change-Id: I726d7161726a706a626d6f64746365757268736b --- .../storage/addon/primary/ExternalPrimaryStorage.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index f625242ce9e..05bea4ba5f3 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -1819,7 +1819,13 @@ public void setup() { @Override public void run(final FlowTrigger trigger, Map data) { - ImageInventory image = ImageInventory.valueOf(dbf.findByUuid(msg.getVolume().getRootImageUuid(), ImageVO.class)); + ImageVO ivo = dbf.findByUuid(msg.getVolume().getRootImageUuid(), ImageVO.class); + if (ivo == null) { + throw new OperationFailureException(operr("cannot reinit rootvolume [%s] because image [%s] has been deleted and imagecache cannot be found", + msg.getVolume().getUuid(), msg.getVolume().getRootImageUuid())); + } + + ImageInventory image = ImageInventory.valueOf(ivo); downloadImageCache(image, new ReturnValueCompletion(trigger) { @Override public void success(ImageCacheInventory returnValue) { From 8226dbee0215a926a09c5d866fe5b153af6843f9 Mon Sep 17 00:00:00 2001 From: "tao.gan" Date: Fri, 26 Sep 2025 17:11:38 +0800 Subject: [PATCH 549/737] [storage]: update API parameter version information Resolves: ZSTAC-61815 Change-Id: I746d687770726e756d786c6972656b627a777972 --- .../snapshot/APIDeleteVolumeSnapshotMsgDoc_zh_cn.groovy | 4 ++-- .../group/APIDeleteVolumeSnapshotGroupMsgDoc_zh_cn.groovy | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/APIDeleteVolumeSnapshotMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/storage/snapshot/APIDeleteVolumeSnapshotMsgDoc_zh_cn.groovy index 9e8005b626e..36b1322fc02 100644 --- a/header/src/main/java/org/zstack/header/storage/snapshot/APIDeleteVolumeSnapshotMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/storage/snapshot/APIDeleteVolumeSnapshotMsgDoc_zh_cn.groovy @@ -46,7 +46,7 @@ doc { location "body" type "String" optional true - since "4.10.6" + since "5.4.0" } column { name "scope" @@ -55,7 +55,7 @@ doc { location "body" type "String" optional true - since "4.10.6" + since "5.4.0" } column { name "systemTags" diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/group/APIDeleteVolumeSnapshotGroupMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/storage/snapshot/group/APIDeleteVolumeSnapshotGroupMsgDoc_zh_cn.groovy index fa875873256..11e71e4c39d 100644 --- a/header/src/main/java/org/zstack/header/storage/snapshot/group/APIDeleteVolumeSnapshotGroupMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/storage/snapshot/group/APIDeleteVolumeSnapshotGroupMsgDoc_zh_cn.groovy @@ -37,7 +37,7 @@ doc { location "body" type "String" optional true - since "4.10.6" + since "5.4.0" } column { name "scope" @@ -46,7 +46,7 @@ doc { location "body" type "String" optional true - since "4.10.6" + since "5.4.0" } column { name "deleteMode" From 3df5d5dca106d91402be6f870c90913a9be70486 Mon Sep 17 00:00:00 2001 From: J M Date: Thu, 25 Sep 2025 19:28:47 +0800 Subject: [PATCH 550/737] [ceph]: fix ext ps trash delete Resolves: ZSTAC-78626 Change-Id: I6c7976656e65646a6c616c6a62666f78796d716f --- conf/springConfigXml/ceph.xml | 1 - .../zstack/core/trash/StorageRecycleImpl.java | 6 +-- .../primary/VolumeSnapshotCapability.java | 50 +++++++++++++------ .../VolumeInnerSnapshotPathParser.java | 8 --- .../ceph/primary/CephPrimaryStorageBase.java | 1 + .../primary/CephPrimaryStorageFactory.java | 11 +--- .../ceph/primary/CephRequiredUrlParser.java | 4 -- .../zstack/expon/ExponStorageController.java | 1 + .../xinfini/XInfiniStorageController.java | 1 + .../storage/zbs/ZbsStorageController.java | 1 + .../ExternalPrimaryStorageFactory.java | 1 + .../VolumeSnapshotReferenceTreeBase.java | 7 ++- .../VolumeSnapshotReferenceUtils.java | 10 +++- .../testlib/ExternalPrimaryStorageSpec.groovy | 10 ++-- .../testlib/NfsPrimaryStorageSpec.groovy | 1 + 15 files changed, 64 insertions(+), 49 deletions(-) delete mode 100644 header/src/main/java/org/zstack/header/storage/snapshot/VolumeInnerSnapshotPathParser.java diff --git a/conf/springConfigXml/ceph.xml b/conf/springConfigXml/ceph.xml index 3e948ecf134..c4489de344c 100755 --- a/conf/springConfigXml/ceph.xml +++ b/conf/springConfigXml/ceph.xml @@ -50,7 +50,6 @@ - diff --git a/core/src/main/java/org/zstack/core/trash/StorageRecycleImpl.java b/core/src/main/java/org/zstack/core/trash/StorageRecycleImpl.java index 0262fd47d0b..eb6c1a76d00 100644 --- a/core/src/main/java/org/zstack/core/trash/StorageRecycleImpl.java +++ b/core/src/main/java/org/zstack/core/trash/StorageRecycleImpl.java @@ -186,7 +186,7 @@ private String checkImageCache(String installPath) { return null; } - private String checkCephVolumeSnapshot(String installPath) { + private String checkInnerVolumeSnapshot(String installPath) { List uuids = Q.New(VolumeSnapshotVO.class).like(VolumeSnapshotVO_.primaryStorageInstallPath, installPath + "@%").select(VolumeSnapshotVO_.uuid).listValues(); if (uuids.size() > 0) { return String.format("%s is still in using by volumesnapshot %s, cannot remove it from trash before delete them", installPath, uuids); @@ -199,7 +199,7 @@ private String checkVolumeSnapshot(String installPath) { if (uuids.size() > 0) { return String.format("%s is still in using by volumesnapshot %s, cannot remove it from trash before delete them", installPath, uuids); } - return checkCephVolumeSnapshot(installPath); + return checkInnerVolumeSnapshot(installPath); } private String checkImage(String installPath) { @@ -220,7 +220,7 @@ protected String makeSureInstallPathNotUsedByVolume(String installPath) { if (details != null) { return details; } - details = checkCephVolumeSnapshot(installPath); + details = checkInnerVolumeSnapshot(installPath); if (details != null) { return details; } diff --git a/header/src/main/java/org/zstack/header/storage/primary/VolumeSnapshotCapability.java b/header/src/main/java/org/zstack/header/storage/primary/VolumeSnapshotCapability.java index 8a19064a38e..59d63b473ca 100755 --- a/header/src/main/java/org/zstack/header/storage/primary/VolumeSnapshotCapability.java +++ b/header/src/main/java/org/zstack/header/storage/primary/VolumeSnapshotCapability.java @@ -1,25 +1,11 @@ package org.zstack.header.storage.primary; +import java.util.function.Function; + /** * Created by frank on 6/9/2015. */ public class VolumeSnapshotCapability { - public boolean isSupportCreateOnHypervisor() { - return supportCreateOnHypervisor; - } - - public void setSupportCreateOnHypervisor(boolean supportCreateOnHypervisor) { - this.supportCreateOnHypervisor = supportCreateOnHypervisor; - } - - public boolean isSupportLazyDelete() { - return supportLazyDelete; - } - - public void setSupportLazyDelete(boolean supportLazyDelete) { - this.supportLazyDelete = supportLazyDelete; - } - public static enum VolumeSnapshotArrangementType { CHAIN, INDIVIDUAL @@ -42,6 +28,14 @@ public static enum VolumeSnapshotArrangementType { private VolumeSnapshotArrangementType arrangementType; + /*** + * If volume snapshot is inner snapshot on volume, it must be set. + * A regex match volume install path from inner volume snapshot install path. + * such as pool/vol from pool/vol@snapshot can be extracted by regex ^[^@]+ + */ + // TODO(mj) refactor it + private String volumePathFromInnerSnapshotRegex; + public boolean isSupport() { return support; } @@ -57,4 +51,28 @@ public VolumeSnapshotArrangementType getArrangementType() { public void setArrangementType(VolumeSnapshotArrangementType arrangementType) { this.arrangementType = arrangementType; } + + public boolean isSupportCreateOnHypervisor() { + return supportCreateOnHypervisor; + } + + public void setSupportCreateOnHypervisor(boolean supportCreateOnHypervisor) { + this.supportCreateOnHypervisor = supportCreateOnHypervisor; + } + + public boolean isSupportLazyDelete() { + return supportLazyDelete; + } + + public void setSupportLazyDelete(boolean supportLazyDelete) { + this.supportLazyDelete = supportLazyDelete; + } + + public String getVolumePathFromInnerSnapshotRegex() { + return volumePathFromInnerSnapshotRegex; + } + + public void setVolumePathFromInnerSnapshotRegex(String volumePathFromInnerSnapshotRegex) { + this.volumePathFromInnerSnapshotRegex = volumePathFromInnerSnapshotRegex; + } } diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeInnerSnapshotPathParser.java b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeInnerSnapshotPathParser.java deleted file mode 100644 index 974c624ba94..00000000000 --- a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeInnerSnapshotPathParser.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.zstack.header.storage.snapshot; - -import org.zstack.header.storage.primary.PrimaryStorageType; - -public interface VolumeInnerSnapshotPathParser { - String getVolumePathFromSnapshot(VolumeSnapshotInventory snapshot); - PrimaryStorageType getPrimaryStorageType(); -} diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java index ab151953071..562067654c2 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java @@ -3320,6 +3320,7 @@ protected void handle(AskVolumeSnapshotCapabilityMsg msg) { if (VolumeType.Data.toString().equals(volumeType) || VolumeType.Root.toString().equals(volumeType)) { cap.setSupport(true); cap.setArrangementType(VolumeSnapshotArrangementType.INDIVIDUAL); + cap.setVolumePathFromInnerSnapshotRegex("^[^@]+"); } else if (VolumeType.Memory.toString().equals(volumeType)) { cap.setSupport(false); } else { diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java index 3adf292187d..cb7dde9c5cc 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java @@ -90,7 +90,7 @@ public class CephPrimaryStorageFactory implements PrimaryStorageFactory, CephCap BeforeTakeLiveSnapshotsOnVolumes, VmInstanceCreateExtensionPoint, CreateDataVolumeExtensionPoint, InstanceOfferingUserConfigValidator, DiskOfferingUserConfigValidator, MarkRootVolumeAsSnapshotExtension, VmCapabilitiesExtensionPoint, PreVmInstantiateResourceExtensionPoint, PSCapacityExtensionPoint, - RecalculatePrimaryStorageCapacityExtensionPoint, VolumeInnerSnapshotPathParser { + RecalculatePrimaryStorageCapacityExtensionPoint { private static final CLogger logger = Utils.getLogger(CephPrimaryStorageFactory.class); public static final PrimaryStorageType type = new PrimaryStorageType(CephConstants.CEPH_PRIMARY_STORAGE_TYPE); @@ -1259,15 +1259,6 @@ public String buildAllocatedInstallUrl(AllocatePrimaryStorageSpaceMsg msg, Prima return getPreAllocatedInstallUrl(msg, psInv.getUuid()); } - @Override - public String getVolumePathFromSnapshot(VolumeSnapshotInventory snapshot) { - if (StringUtils.isEmpty(snapshot.getPrimaryStorageInstallPath())) { - return null; - } - - return snapshot.getPrimaryStorageInstallPath().split("@")[0]; - } - @Override @Transactional(propagation = Propagation.MANDATORY) public long reserveCapacity(AllocatePrimaryStorageSpaceMsg msg, String allocatedInstallUrl, long size, String psUuid) { diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephRequiredUrlParser.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephRequiredUrlParser.java index 906e04e5bdd..d9b37f5cac5 100644 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephRequiredUrlParser.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephRequiredUrlParser.java @@ -1,13 +1,9 @@ package org.zstack.storage.ceph.primary; -import org.apache.commons.lang.StringUtils; import org.zstack.core.db.Q; import org.zstack.header.errorcode.OperationFailureException; -import org.zstack.header.storage.snapshot.VolumeInnerSnapshotPathParser; -import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; import org.zstack.header.volume.VolumeVO; import org.zstack.header.volume.VolumeVO_; -import org.zstack.storage.ceph.CephConstants; import org.zstack.utils.DebugUtils; import java.net.URI; diff --git a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java index 551e782d516..7e6619497a7 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java +++ b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java @@ -95,6 +95,7 @@ public class ExponStorageController implements PrimaryStorageControllerSvc, Prim scap.setArrangementType(VolumeSnapshotCapability.VolumeSnapshotArrangementType.INDIVIDUAL); scap.setSupportCreateOnHypervisor(false); scap.setSupportLazyDelete(true); + scap.setVolumePathFromInnerSnapshotRegex("^[^@]+"); capabilities.setSnapshotCapability(scap); capabilities.setSupportCloneFromVolume(false); capabilities.setSupportStorageQos(true); diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index 3d1be186ed2..67b5d3904a4 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -100,6 +100,7 @@ private String getVhostSocketDir() { scap.setArrangementType(VolumeSnapshotCapability.VolumeSnapshotArrangementType.INDIVIDUAL); scap.setSupportCreateOnHypervisor(false); scap.setSupportLazyDelete(false); + scap.setVolumePathFromInnerSnapshotRegex("^[^@]+"); capabilities.setSnapshotCapability(scap); capabilities.setSupportCloneFromVolume(false); capabilities.setSupportStorageQos(false); diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 5bcf7fec9df..2ae9b36512e 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -108,6 +108,7 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar scap.setArrangementType(VolumeSnapshotCapability.VolumeSnapshotArrangementType.INDIVIDUAL); scap.setSupportCreateOnHypervisor(false); scap.setSupportLazyDelete(false); + scap.setVolumePathFromInnerSnapshotRegex("^[^@]+"); capabilities.setSnapshotCapability(scap); capabilities.setSupportShareableVolume(true); capabilities.setSupportCloneFromVolume(false); diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java index 2d8c4fd9109..cfc8e3db3c5 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java @@ -58,6 +58,7 @@ public class ExternalPrimaryStorageFactory implements PrimaryStorageFactory, Com CreateTemplateFromVolumeSnapshotExtensionPoint, MarkRootVolumeAsSnapshotExtension, VmInstanceMigrateExtensionPoint, ManagementNodeChangeListener, PrimaryStorageFeatureAllocatorExtensionPoint, HostResizeVolumeExtensionPoint { private static final CLogger logger = Utils.getLogger(ExternalBackupStorageFactory.class); + public static PrimaryStorageType type = new PrimaryStorageType(PrimaryStorageConstant.EXTERNAL_PRIMARY_STORAGE_TYPE); protected static Map controllers = new HashMap<>(); diff --git a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceTreeBase.java b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceTreeBase.java index 93ec04b6458..cb1bb6a657e 100644 --- a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceTreeBase.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceTreeBase.java @@ -6,6 +6,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; import org.zstack.core.thread.ChainTask; import org.zstack.core.thread.SyncTaskChain; import org.zstack.core.thread.ThreadFacade; @@ -25,6 +26,7 @@ import org.zstack.header.storage.snapshot.reference.VolumeSnapshotReferenceInventory; import org.zstack.header.storage.snapshot.reference.VolumeSnapshotReferenceTreeInventory; import org.zstack.header.volume.VolumeVO; +import org.zstack.header.volume.VolumeVO_; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; @@ -108,7 +110,10 @@ private void deleteSnapshotRefLeaf(DeleteVolumeSnapshotReferenceLeafMsg msg, Com return; } - boolean rootDeleted = msg.getLeaf().getParentId() == null && !dbf.isExist(msg.getLeaf().getVolumeUuid(), VolumeVO.class); + boolean rootDeleted = msg.getLeaf().getParentId() == null && !Q.New(VolumeVO.class) + .eq(VolumeVO_.uuid, msg.getLeaf().getVolumeUuid()) + .eq(VolumeVO_.primaryStorageUuid, msg.getTree().getPrimaryStorageUuid()) + .isExists(); String endPath = rootDeleted ? self.getRootInstallUrl() : msg.getLeaf().getVolumeSnapshotInstallUrl(); String startPath = msg.getLeaf().getDirectSnapshotInstallUrl(); if (startPath.equals(endPath) && !rootDeleted) { diff --git a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java index 61625dd4539..49662466a46 100644 --- a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java @@ -528,7 +528,15 @@ private static void deleteSnapshotRef(VolumeSnapshotReferenceVO ref) { private static void deleteSnapshotRefLeafInTree(VolumeSnapshotReferenceTreeVO tree, VolumeSnapshotReferenceVO ref) { boolean referenceRedirected = !ref.getDirectSnapshotUuid().equals(ref.getVolumeSnapshotUuid()); - if (referenceRedirected || !Q.New(VolumeVO.class).eq(VolumeVO_.uuid, ref.getVolumeUuid()).isExists()) { + boolean backingVolumeDeletedInDb = SQL.New("select vol.uuid from VolumeVO vol, VolumeSnapshotReferenceTreeVO tree" + + " where vol.uuid = :volUuid" + + " and tree.uuid = :treeUuid" + + " and vol.primaryStorageUuid = tree.primaryStorageUuid", String.class) + .param("volUuid", ref.getVolumeUuid()) + .param("treeUuid", ref.getTreeUuid()) + .find() == null; + + if (referenceRedirected || backingVolumeDeletedInDb) { if (tree == null) { tree = Q.New(VolumeSnapshotReferenceTreeVO.class).eq(VolumeSnapshotReferenceTreeVO_.uuid, ref.getTreeUuid()).find(); } diff --git a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy index a9e9290e8c6..356a9641f10 100644 --- a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy @@ -138,7 +138,7 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { def rsp = new ZbsStorageController.CreateVolumeRsp() rsp.setSize(actualSize) rsp.setActualSize(actualSize) - rsp.setInstallPath("cbd:pool1/lpool1/volume") + rsp.setInstallPath(String.format("cbd:pool1/%s/%s", cmd.logicalPool, cmd.volume)) return rsp } @@ -158,7 +158,7 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { def rsp = new ZbsStorageController.CreateSnapshotRsp() rsp.setSize(actualSize) - rsp.setInstallPath("cbd:pool1/lpool1/image@image") + rsp.setInstallPath(cmd.path + "@" + cmd.snapshot) return rsp } @@ -170,8 +170,8 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { def rsp = new ZbsStorageController.CloneVolumeRsp() rsp.setSize(actualSize) - rsp.setInstallPath("cbd:pool1/lpool1/clone") - + // replace volume name + rsp.setInstallPath(cmd.path.replaceAll("([^/]+)\$", cmd.dstVolume)) return rsp } @@ -203,7 +203,7 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { assert zspec != null: "cannot found zbs primary storage[uuid:${cmd.uuid}], check your environment()." def rsp = new ZbsStorageController.CopyRsp() - rsp.setInstallPath("cbd:pool1/lpool1/copy") + rsp.setInstallPath(cmd.path.replaceAll("([^/]+)\$", cmd.dstVolume)) rsp.setSize(actualSize) return rsp diff --git a/testlib/src/main/java/org/zstack/testlib/NfsPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/NfsPrimaryStorageSpec.groovy index af186beb8a5..0dbe59bfc01 100755 --- a/testlib/src/main/java/org/zstack/testlib/NfsPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/NfsPrimaryStorageSpec.groovy @@ -455,6 +455,7 @@ class NfsPrimaryStorageSpec extends PrimaryStorageSpec { simulator(NfsPrimaryStorageKVMBackend.NFS_TO_NFS_MIGRATE_BITS_PATH) { HttpEntity e, EnvSpec spec -> def cmd = JSONObjectUtil.toObject(e.body, NfsPrimaryStorageKVMBackendCommands.NfsToNfsMigrateBitsCmd.class) + // all fast clone case must be mock by itself assert cmd.independentPath == null return new NfsPrimaryStorageKVMBackendCommands.NfsToNfsMigrateBitsRsp() } From 1ff10dda18bb774aa74928e4a45d2deb42bc5c83 Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Mon, 29 Sep 2025 10:24:30 +0800 Subject: [PATCH 551/737] Revert "[storage-device]: alarm when multipath default config changed" This reverts commit e82df18ad570f154a345256482f1215168c40e42. --- .../header/host/HostCanonicalEvents.java | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java b/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java index cca0e26567d..46001b9f1ce 100755 --- a/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java +++ b/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java @@ -33,7 +33,6 @@ public class HostCanonicalEvents { public static final String HOST_PROCESS_PHYSICAL_MEMORY_USAGE_ABNORMAL = "/host/process/physicalMemory/usage/abnormal"; public static final String HOST_PING_SKIP = "/host/ping/skip"; public static final String HOST_PING_CANCEL_SKIP = "/host/ping/cancel/skip"; - public static final String HOST_MULTIPATH_CONFIG_CHANGED = "/host/multipathConfig/changed"; @NeedJsonSchema public static class HostPhysicalHbaPortStateAbnormalData { @@ -665,28 +664,6 @@ public void setInterfaceStatus(String interfaceStatus) { } } - @NeedJsonSchema - public static class MultipathConfigChangedData { - private String hostUuid; - private String details; - - public String getDetails() { - return details; - } - - public void setDetails(String details) { - this.details = details; - } - - public String getHostUuid() { - return hostUuid; - } - - public void setHostUuid(String hostUuid) { - this.hostUuid = hostUuid; - } - } - @NeedJsonSchema public static class HostProcessPhysicalMemoryUsageAlarmData { private String hostUuid; From 2d0efab71d030d07ec71bfdfd64fa6d84c0ff142 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Thu, 9 Oct 2025 10:21:35 +0800 Subject: [PATCH 552/737] [plugin]: introducing flatten volume for zbs Resolves: ZSTAC-73557 Change-Id: I6c687062676c6b72787868737a75766366656676 --- .../main/java/org/zstack/storage/zbs/ZbsStorageController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 2ae9b36512e..f517c0db857 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -736,6 +736,7 @@ public void success(FlattenVolumeRsp returnValue) { stats.setSize(returnValue.getSize()); stats.setActualSize(returnValue.getActualSize()); stats.setFormat(VolumeConstant.VOLUME_FORMAT_RAW); + stats.setParentUri(returnValue.getParentUri()); comp.success(stats); } From 39bf48737cc966e175d4b6a0e929363ad3d47c70 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Thu, 9 Oct 2025 10:23:59 +0800 Subject: [PATCH 553/737] [image]: Update schema for container image - Modify ImageVO and ImageEO to support extends - Update sdk and api helper about clone model service Resolves: ZSTAC-74888 Change-Id: I75737369647063777a6f686d7475726d78636f67 Signed-off-by: ye.zou --- testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index f1217280c22..eeb7fdebdc9 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -15480,7 +15480,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -15507,7 +15507,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) From 126d5ea999dab59f840f5ea8036510bb50064f07 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Thu, 9 Oct 2025 10:35:51 +0800 Subject: [PATCH 554/737] [sdnController]: support h3c v2 vcfc sdn controller Resolves: ZSTAC-76071 Change-Id: I6868776c80a8a2ffa5b541839725d42f31e84cd1 --- testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index eeb7fdebdc9..eaa6d0af804 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -27860,20 +27860,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) From 49d0c223809459acb780daf2d0ffb195b85f731e Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Mon, 15 Sep 2025 11:52:54 +0800 Subject: [PATCH 555/737] [conf]: Introduce 5.3.52 schema - Update sdk DBImpact Resolves: ZSTAC-76891 Change-Id: I646a68736f766c62777a71776a65707975766e78 --- conf/db/upgrade/V5.3.52__schema.sql | 2 ++ .../sdk/ModelServiceInstanceInventory.java | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 conf/db/upgrade/V5.3.52__schema.sql diff --git a/conf/db/upgrade/V5.3.52__schema.sql b/conf/db/upgrade/V5.3.52__schema.sql new file mode 100644 index 00000000000..95ec0d36f7a --- /dev/null +++ b/conf/db/upgrade/V5.3.52__schema.sql @@ -0,0 +1,2 @@ +CALL ADD_COLUMN('ModelServiceInstanceVO', 'name', 'VARCHAR(255)', 1, NULL); +CALL ADD_COLUMN('ModelServiceInstanceVO', 'namespace', 'VARCHAR(255)', 1, NULL); diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java index 22356ce9658..5c129e3771b 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java @@ -12,6 +12,14 @@ public java.lang.String getUuid() { return this.uuid; } + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + public java.lang.String modelServiceGroupUuid; public void setModelServiceGroupUuid(java.lang.String modelServiceGroupUuid) { this.modelServiceGroupUuid = modelServiceGroupUuid; @@ -92,6 +100,22 @@ public java.lang.Integer getNodeRank() { return this.nodeRank; } + public java.lang.Long clusterId; + public void setClusterId(java.lang.Long clusterId) { + this.clusterId = clusterId; + } + public java.lang.Long getClusterId() { + return this.clusterId; + } + + public java.lang.String namespace; + public void setNamespace(java.lang.String namespace) { + this.namespace = namespace; + } + public java.lang.String getNamespace() { + return this.namespace; + } + public VmInstanceInventory vm; public void setVm(VmInstanceInventory vm) { this.vm = vm; From 8d49d7f1745f3474d0aa7e8bf4a389d03203df21 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Thu, 18 Sep 2025 13:59:29 +0800 Subject: [PATCH 556/737] [conf]: Update schema to delete old pod info DBImpact Resolves: ZSTAC-76891 Change-Id: I6a706679626173616265766a626c6872776a7963 --- conf/db/upgrade/V5.3.52__schema.sql | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/conf/db/upgrade/V5.3.52__schema.sql b/conf/db/upgrade/V5.3.52__schema.sql index 95ec0d36f7a..0894a774619 100644 --- a/conf/db/upgrade/V5.3.52__schema.sql +++ b/conf/db/upgrade/V5.3.52__schema.sql @@ -1,2 +1,11 @@ CALL ADD_COLUMN('ModelServiceInstanceVO', 'name', 'VARCHAR(255)', 1, NULL); CALL ADD_COLUMN('ModelServiceInstanceVO', 'namespace', 'VARCHAR(255)', 1, NULL); + +-- Delete old vm records for pod and resync will be done after node started +DELETE FROM `VmInstanceEO` where hypervisorType = 'Native'; + +CREATE TABLE `zstack`.`PodVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `status` varchar(64) NOT NULL, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file From ef0a01b2bdfb07172cc38ec7158dcc3cff34ac13 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 18 Sep 2025 16:21:38 +0800 Subject: [PATCH 557/737] [sdk]: Update sdk Resolves: ZSTAC-76891 Change-Id: I776d68666c76797274647a617a746764636d6b78 --- sdk/src/main/java/SourceClassMap.java | 2 ++ .../zstack/sdk/ModelServiceInstanceInventory.java | 8 ++++++++ .../main/java/org/zstack/sdk/PodInventory.java | 15 +++++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/PodInventory.java diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 06524da5227..ac6f862be13 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -119,6 +119,7 @@ public class SourceClassMap { put("org.zstack.container.entity.ContainerManagementEndpointInventory", "org.zstack.sdk.ContainerManagementEndpointInventory"); put("org.zstack.container.entity.NativeClusterInventory", "org.zstack.sdk.NativeClusterInventory"); put("org.zstack.container.entity.NativeHostInventory", "org.zstack.sdk.NativeHostInventory"); + put("org.zstack.container.entity.PodInventory", "org.zstack.sdk.PodInventory"); put("org.zstack.container.entity.ProjectRepositoryInventory", "org.zstack.sdk.ProjectRepositoryInventory"); put("org.zstack.container.entity.ZakuImageInventory", "org.zstack.sdk.ZakuImageInventory"); put("org.zstack.core.config.GlobalConfigInventory", "org.zstack.sdk.GlobalConfigInventory"); @@ -1292,6 +1293,7 @@ public class SourceClassMap { put("org.zstack.sdk.PhysicalSwitchPortInventory", "org.zstack.network.hostNetworkInterface.PhysicalSwitchPortInventory"); put("org.zstack.sdk.PluginDriverInventory", "org.zstack.header.core.external.plugin.PluginDriverInventory"); put("org.zstack.sdk.PluginSecretResourcePoolInventory", "org.zstack.crypto.securitymachine.thirdparty.plugin.PluginSecretResourcePoolInventory"); + put("org.zstack.sdk.PodInventory", "org.zstack.container.entity.PodInventory"); put("org.zstack.sdk.PolicyInventory", "org.zstack.header.identity.PolicyInventory"); put("org.zstack.sdk.PolicyRouteRuleInventory", "org.zstack.policyRoute.PolicyRouteRuleInventory"); put("org.zstack.sdk.PolicyRouteRuleProtocol", "org.zstack.policyRoute.PolicyRouteRuleProtocol"); diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java index 5c129e3771b..d4e8be79fb9 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java @@ -116,6 +116,14 @@ public java.lang.String getNamespace() { return this.namespace; } + public java.lang.String accountUuid; + public void setAccountUuid(java.lang.String accountUuid) { + this.accountUuid = accountUuid; + } + public java.lang.String getAccountUuid() { + return this.accountUuid; + } + public VmInstanceInventory vm; public void setVm(VmInstanceInventory vm) { this.vm = vm; diff --git a/sdk/src/main/java/org/zstack/sdk/PodInventory.java b/sdk/src/main/java/org/zstack/sdk/PodInventory.java new file mode 100644 index 00000000000..27e9412d2ef --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/PodInventory.java @@ -0,0 +1,15 @@ +package org.zstack.sdk; + + + +public class PodInventory extends org.zstack.sdk.VmInstanceInventory { + + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + +} From ea24cb96d976953c5acf71cf7a9a6708c8e54d74 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Fri, 19 Sep 2025 15:15:13 +0800 Subject: [PATCH 558/737] [conf]: Add new column to Gpu device and spec - Add gpu type to gpu device vo instead of using pci device's any field - Gpu type will be used for gpu related scheduling like pod deployment or display DBImpact Resolves: ZSTAC-77522 Change-Id: I75666c72686461636f71647377777a76696a766b --- conf/db/upgrade/V5.3.52__schema.sql | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.3.52__schema.sql b/conf/db/upgrade/V5.3.52__schema.sql index 0894a774619..4468ee98c32 100644 --- a/conf/db/upgrade/V5.3.52__schema.sql +++ b/conf/db/upgrade/V5.3.52__schema.sql @@ -8,4 +8,7 @@ CREATE TABLE `zstack`.`PodVO` ( `uuid` varchar(32) NOT NULL UNIQUE, `status` varchar(64) NOT NULL, PRIMARY KEY (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CALL ADD_COLUMN('GpuDeviceVO', 'gpuType', 'VARCHAR(255)', 1, NULL); +CALL ADD_COLUMN('GpuDeviceSpecVO', 'gpuType', 'VARCHAR(255)', 1, NULL); From 4c54db54a860fd98433aae219c20d7dc7ec1fce3 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 25 Sep 2025 18:31:06 +0800 Subject: [PATCH 559/737] [sdk]: Update sdk Resolves: ZSTAC-77522 Change-Id: I687a747174676c737064746c7677677763697a6e --- sdk/src/main/java/org/zstack/sdk/GpuDeviceInventory.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/GpuDeviceInventory.java b/sdk/src/main/java/org/zstack/sdk/GpuDeviceInventory.java index fdeb1c7996e..0ed9716220f 100644 --- a/sdk/src/main/java/org/zstack/sdk/GpuDeviceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/GpuDeviceInventory.java @@ -36,4 +36,12 @@ public java.lang.Boolean getIsDriverLoaded() { return this.isDriverLoaded; } + public java.lang.String gpuType; + public void setGpuType(java.lang.String gpuType) { + this.gpuType = gpuType; + } + public java.lang.String getGpuType() { + return this.gpuType; + } + } From 474dbc63385a59b634d93545ff24c6c0637b5f83 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 25 Sep 2025 15:41:13 +0800 Subject: [PATCH 560/737] [sdk]: Update sdk Resolves: ZSTAC-77708 Change-Id: I766c656a726b646a796e6670706f7a65666b6866 --- .../zstack/sdk/UpdateModelServiceAction.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java index defc4fa5c08..ee73e642cb9 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java @@ -73,6 +73,36 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Boolean supportDistributed; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.HashMap environmentParameters; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.HashMap startupParameters; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.HashMap inferenceParams; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceName; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List servicePorts; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceLivez; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceReadyz; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer serviceBootupTime; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceInstallPath; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceStartCommand; + @Param(required = false) public java.util.List systemTags; From b0777eb09941b130df6d755c031f66a374f4b058 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Mon, 29 Sep 2025 13:46:25 +0800 Subject: [PATCH 561/737] [conf]: Delete ResourceVO before delete VmInstanceEO DBImpact Resolves: ZSTAC-77896 Change-Id: I75706f6d7067656b616a7a666974616d646d7277 --- conf/db/upgrade/V5.3.52__schema.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/db/upgrade/V5.3.52__schema.sql b/conf/db/upgrade/V5.3.52__schema.sql index 4468ee98c32..448945477a7 100644 --- a/conf/db/upgrade/V5.3.52__schema.sql +++ b/conf/db/upgrade/V5.3.52__schema.sql @@ -2,6 +2,7 @@ CALL ADD_COLUMN('ModelServiceInstanceVO', 'name', 'VARCHAR(255)', 1, NULL); CALL ADD_COLUMN('ModelServiceInstanceVO', 'namespace', 'VARCHAR(255)', 1, NULL); -- Delete old vm records for pod and resync will be done after node started +DELETE FROM `ResourceVO` where resourceType = 'VmInstanceVO' and uuid in (SELECT uuid FROM `VmInstanceEO` where hypervisorType = 'Native'); DELETE FROM `VmInstanceEO` where hypervisorType = 'Native'; CREATE TABLE `zstack`.`PodVO` ( From d14f79e86f738dd3d5fd59663bda8fcea50c732f Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Mon, 29 Sep 2025 17:54:23 +0800 Subject: [PATCH 562/737] [conf]: Add fk between model center and l3 network DBImpact Resolves: ZSTAC-77423 Change-Id: I746f7661757870686d706b73636e757563627861 Signed-off-by: AlanJager --- conf/db/upgrade/V5.3.52__schema.sql | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/conf/db/upgrade/V5.3.52__schema.sql b/conf/db/upgrade/V5.3.52__schema.sql index 448945477a7..b856bb32c31 100644 --- a/conf/db/upgrade/V5.3.52__schema.sql +++ b/conf/db/upgrade/V5.3.52__schema.sql @@ -13,3 +13,20 @@ CREATE TABLE `zstack`.`PodVO` ( CALL ADD_COLUMN('GpuDeviceVO', 'gpuType', 'VARCHAR(255)', 1, NULL); CALL ADD_COLUMN('GpuDeviceSpecVO', 'gpuType', 'VARCHAR(255)', 1, NULL); + +UPDATE ModelCenterVO m +LEFT JOIN L3NetworkEO l ON m.storageNetworkUuid = l.uuid +SET m.storageNetworkUuid = NULL +WHERE m.storageNetworkUuid IS NOT NULL AND l.uuid IS NULL; + +UPDATE ModelCenterVO m +LEFT JOIN L3NetworkEO l ON m.serviceNetworkUuid = l.uuid +SET m.serviceNetworkUuid = NULL +WHERE m.serviceNetworkUuid IS NOT NULL AND l.uuid IS NULL; + +ALTER TABLE ModelCenterVO + MODIFY COLUMN storageNetworkUuid VARCHAR(32) NULL, + MODIFY COLUMN serviceNetworkUuid VARCHAR(32) NULL; + +CALL ADD_CONSTRAINT('ModelCenterVO', 'fkModelCenterVOStorageNetworkUuid', 'storageNetworkUuid', 'L3NetworkEO', 'uuid', 'SET NULL'); +CALL ADD_CONSTRAINT('ModelCenterVO', 'fkModelCenterVOServiceNetworkUuid', 'serviceNetworkUuid', 'L3NetworkEO', 'uuid', 'SET NULL'); From 5933dd89dba679378c39e376bd1e2af2a63813fa Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Tue, 30 Sep 2025 15:43:06 +0800 Subject: [PATCH 563/737] [conf]: Add gpu type to devices on kvm host DBImpact Resolves: ZSTAC-78829 Change-Id: I717a666567627a787a7569726c76666f736a6772 --- conf/db/upgrade/V5.3.52__schema.sql | 47 +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/conf/db/upgrade/V5.3.52__schema.sql b/conf/db/upgrade/V5.3.52__schema.sql index b856bb32c31..919a97c0afe 100644 --- a/conf/db/upgrade/V5.3.52__schema.sql +++ b/conf/db/upgrade/V5.3.52__schema.sql @@ -14,6 +14,53 @@ CREATE TABLE `zstack`.`PodVO` ( CALL ADD_COLUMN('GpuDeviceVO', 'gpuType', 'VARCHAR(255)', 1, NULL); CALL ADD_COLUMN('GpuDeviceSpecVO', 'gpuType', 'VARCHAR(255)', 1, NULL); +DROP PROCEDURE IF EXISTS update_gpu_type_from_pci; + +DELIMITER $$ + +CREATE PROCEDURE update_gpu_type_from_pci() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE pci_uuid_val VARCHAR(32); + DECLARE pci_host_uuid_val VARCHAR(32); + DECLARE pci_description_val VARCHAR(2048); + DECLARE kvm_host_count INT; + + DECLARE cur CURSOR FOR + SELECT pd.uuid, pd.hostUuid, pd.description + FROM PciDeviceVO pd + INNER JOIN GpuDeviceVO gd ON pd.uuid = gd.uuid; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + OPEN cur; + + read_loop: LOOP + FETCH cur INTO pci_uuid_val, pci_host_uuid_val, pci_description_val; + + IF done THEN + LEAVE read_loop; + END IF; + + SELECT COUNT(*) INTO kvm_host_count FROM KVMHostVO WHERE uuid = pci_host_uuid_val; + + IF kvm_host_count > 0 THEN + UPDATE GpuDeviceVO + SET gpuType = pci_description_val + WHERE uuid = pci_uuid_val; + END IF; + + END LOOP; + + SELECT CURTIME(); + + CLOSE cur; +END$$ + +DELIMITER ; + +CALL update_gpu_type_from_pci(); + UPDATE ModelCenterVO m LEFT JOIN L3NetworkEO l ON m.storageNetworkUuid = l.uuid SET m.storageNetworkUuid = NULL From 609e0af640be341b8cb94950b77420eb10a061a9 Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Fri, 20 Jun 2025 13:51:11 +0800 Subject: [PATCH 564/737] [storage-device]: alarm when multipath default config changed 1.alarm when multipath default config changed 2.fixed multipath find_multipaths value is yes 3.automatically enable multipath service when installing the os Resolves/Related: ZSTAC-77506 Change-Id: I7a797462746a67706b6f676d7a726670696f6871 --- .../header/host/HostCanonicalEvents.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java b/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java index 46001b9f1ce..cca0e26567d 100755 --- a/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java +++ b/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java @@ -33,6 +33,7 @@ public class HostCanonicalEvents { public static final String HOST_PROCESS_PHYSICAL_MEMORY_USAGE_ABNORMAL = "/host/process/physicalMemory/usage/abnormal"; public static final String HOST_PING_SKIP = "/host/ping/skip"; public static final String HOST_PING_CANCEL_SKIP = "/host/ping/cancel/skip"; + public static final String HOST_MULTIPATH_CONFIG_CHANGED = "/host/multipathConfig/changed"; @NeedJsonSchema public static class HostPhysicalHbaPortStateAbnormalData { @@ -664,6 +665,28 @@ public void setInterfaceStatus(String interfaceStatus) { } } + @NeedJsonSchema + public static class MultipathConfigChangedData { + private String hostUuid; + private String details; + + public String getDetails() { + return details; + } + + public void setDetails(String details) { + this.details = details; + } + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + } + @NeedJsonSchema public static class HostProcessPhysicalMemoryUsageAlarmData { private String hostUuid; From dd0be44334a0b5f0dd54a03e6072d549ec22ed93 Mon Sep 17 00:00:00 2001 From: shenjin Date: Tue, 14 Oct 2025 11:11:58 +0800 Subject: [PATCH 565/737] [conf]: extend mdev device name field length Extended the name column length in MdevDeviceSpecVO and MdevDeviceVO tables from 32 to 128 characters to accommodate longer device names. Resolves: ZSTAC-79016 Change-Id: I786367796974617178736f636669726868656d6a --- conf/db/upgrade/V5.4.2__schema.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 conf/db/upgrade/V5.4.2__schema.sql diff --git a/conf/db/upgrade/V5.4.2__schema.sql b/conf/db/upgrade/V5.4.2__schema.sql new file mode 100644 index 00000000000..1950c7b6340 --- /dev/null +++ b/conf/db/upgrade/V5.4.2__schema.sql @@ -0,0 +1,2 @@ +ALTER TABLE `zstack`.`MdevDeviceSpecVO` modify column name varchar(128) NOT NULL; +ALTER TABLE `zstack`.`MdevDeviceVO` modify column name varchar(128) NOT NULL; \ No newline at end of file From 2cb11e982a60f5eed5355242d6ebec03eca3602a Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Tue, 14 Oct 2025 17:29:17 +0800 Subject: [PATCH 566/737] [zwatch]: thridpart alerts rebuild Resolves: ZSTAC-78725 Change-Id: I72616362677370696a6175636f6a6679787a6973 --- .../thirdparty/api/AddThirdpartyPlatformAction.java | 2 +- .../src/main/java/org/zstack/testlib/ApiHelper.groovy | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/AddThirdpartyPlatformAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/AddThirdpartyPlatformAction.java index 429fd24c961..2aa0bfcf9eb 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/AddThirdpartyPlatformAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/AddThirdpartyPlatformAction.java @@ -28,7 +28,7 @@ public Result throwExceptionIfError() { @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; - @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"XSKY","XSKY_V6","ZSTONE"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index eaa6d0af804..f1217280c22 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -15480,7 +15480,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -15507,7 +15507,7 @@ abstract class ApiHelper { if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) @@ -27860,20 +27860,20 @@ abstract class ApiHelper { c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - + if (System.getProperty("apipath") != null) { if (a.apiId == null) { a.apiId = Platform.uuid } - + def tracker = new ApiPathTracker(a.apiId) def out = errorOut(a.call()) def path = tracker.getApiPath() if (!path.isEmpty()) { Test.apiPaths[a.class.name] = path.join(" --->\n") } - + return out } else { return errorOut(a.call()) From ecc3d786a0e8cd67c5d5c340b4d33724dee6a2ed Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Thu, 16 Oct 2025 15:46:44 +0800 Subject: [PATCH 567/737] [zbs]: decrease db info reload times Resolves: ZSTAC-79068 Change-Id: I756665756a717964756f666968637664646c6e61 (cherry picked from commit 83b0c1e566fb91ed7037bdbeef5acdad68cc0c3f) --- .../storage/zbs/ZbsStorageController.java | 44 ++++++++++++------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index f517c0db857..dd1861e58fe 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -213,7 +213,9 @@ public void fail(ErrorCode errorCode) { @Override public synchronized void activateHeartbeatVolume(HostInventory h, ReturnValueCompletion comp) { - reloadDbInfo(); + if (config == null) { + reloadDbInfo(); + } CreateVolumeCmd cmd = new CreateVolumeCmd(); cmd.setLogicalPool(config.getLogicalPoolName()); @@ -245,7 +247,9 @@ public void deactivateHeartbeatVolume(HostInventory h, Completion comp) { @Override public HeartbeatVolumeTO getHeartbeatVolumeActiveInfo(HostInventory h) { - reloadDbInfo(); + if (config == null) { + reloadDbInfo(); + } CbdHeartbeatVolumeTO to = new CbdHeartbeatVolumeTO(); to.setInstallPath(buildHeartbeatVolumePath(config.getLogicalPoolName())); @@ -433,22 +437,26 @@ public void handle(ErrorCode errCode, Map data) { @Override public void ping(Completion completion) { reloadDbInfo(); + + if (addonInfo == null || addonInfo.getClusterInfo() == null) { + completion.fail(operr(String.format("addon info is null, primary storage[uuid:%s] is not ready, skip ping task", self.getUuid()))); + return; + } + final List mds = CollectionUtils.transformToList(addonInfo.getMdsInfos(), ZbsPrimaryStorageMdsBase::new); - new While<>(mds).each((m, comp) -> { - m.ping(addonInfo.getClusterInfo(), new Completion(comp) { - @Override - public void success() { - m.getSelf().setStatus(MdsStatus.Connected); - comp.done(); - } + new While<>(mds).each((m, comp) -> m.ping(addonInfo.getClusterInfo(), new Completion(comp) { + @Override + public void success() { + m.getSelf().setStatus(MdsStatus.Connected); + comp.done(); + } - @Override - public void fail(ErrorCode errorCode) { - m.getSelf().setStatus(MdsStatus.Disconnected); - comp.done(); - } - }); - }).run(new WhileDoneCompletion(completion) { + @Override + public void fail(ErrorCode errorCode) { + m.getSelf().setStatus(MdsStatus.Disconnected); + comp.done(); + } + })).run(new WhileDoneCompletion(completion) { @Override public void done(ErrorCodeList errorCodeList) { SQL.New(ExternalPrimaryStorageVO.class).eq(ExternalPrimaryStorageVO_.uuid, self.getUuid()) @@ -545,7 +553,9 @@ public StorageCapabilities reportCapabilities() { @Override public String allocateSpace(AllocateSpaceSpec aspec) { - reloadDbInfo(); + if (config == null) { + reloadDbInfo(); + } // TODO allocate pool LogicalPoolInfo logicalPoolInfo = allocateFreePool(aspec.getSize()); From 588f2114a77e2461ba1f972281c61793a10dbd62 Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Thu, 23 Oct 2025 11:15:56 +0800 Subject: [PATCH 568/737] [identity]: ValidateSession clear SSOToken Resolves: ZSTAC-77432 Change-Id: I65796b67786879696f76626f6e62767674727272 --- .../src/main/java/org/zstack/identity/Session.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/identity/src/main/java/org/zstack/identity/Session.java b/identity/src/main/java/org/zstack/identity/Session.java index fdc837f2d54..2b27931beef 100755 --- a/identity/src/main/java/org/zstack/identity/Session.java +++ b/identity/src/main/java/org/zstack/identity/Session.java @@ -40,6 +40,10 @@ public class Session implements Component { private DatabaseFacade dbf; @Autowired private EventFacade evtf; + @Autowired + private PluginRegistry pluginRgty; + + private static List logoutExtensionPoints; private Future expiredSessionCollector; private static Interner sessionLock = Interners.newWeakInterner(); @@ -221,6 +225,11 @@ protected ErrorCode scripts() { } logout(s.getUuid()); + + for (LogoutExtensionPoint ext : logoutExtensionPoints) { + ext.beforeLogout(s); + } + return err(IdentityErrors.INVALID_SESSION, "Session expired"); } @@ -266,6 +275,7 @@ public boolean start() { setupGlobalConfig(); startCleanUpStaleSessionTask(); setupCanonicalEvents(); + logoutExtensionPoints = pluginRgty.getExtensionList(LogoutExtensionPoint.class); return true; } From 55d7a7ea6733ee3b178a85fc78eaaf4840233c29 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Thu, 18 Sep 2025 10:35:39 +0800 Subject: [PATCH 569/737] [console]: fix console proxy agent Resolves: ZSTAC-77943 Change-Id: I636d7669616b777075696c656968706869686d62 --- .../org/zstack/console/ManagementServerConsoleProxyBackend.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java b/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java index 377517d8b0a..14ad99dc48a 100755 --- a/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java +++ b/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java @@ -495,7 +495,7 @@ public void run(FlowTrigger trigger, Map data) { } ShellUtils.ShellRunner runner = new ShellUtils.ShellRunner(); - runner.setCommand(String.format("netstat -nltp4 | grep :%d\b", msg.getConsoleProxyPort())); + runner.setCommand(String.format("netstat -nltp | grep -E ':%d\\s+'", msg.getConsoleProxyPort())); runner.setVerbose(false); runner.setWithSudo(true); runner.setSuppressTraceLog(true); From 56dc1b9f74ab0daac068d14880fb6605581c33da Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Wed, 22 Oct 2025 15:35:30 +0800 Subject: [PATCH 570/737] [virtualRouterProvider]: remove ha router snat Resolves: ZSTAC-79219 Change-Id: I736a7177776d696a677075737177686f776d6b67 --- .../service/virtualrouter/nat/VirtualRouterSnatBackend.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSnatBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSnatBackend.java index f6a80863445..73439479aa4 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSnatBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSnatBackend.java @@ -247,7 +247,9 @@ private void releasePublicNicSnat(String vrUuid, VmNicInventory publicNic, Compl ApplianceVmSubTypeFactory subTypeFactory = apvmFactory.getApplianceVmSubTypeFactory(vrVO.getApplianceVmType()); ApplianceVm app = subTypeFactory.getSubApplianceVm(vrVO); List snatL3Uuids = app.getSnatL3NetworkOnRouter(vrUuid); - if (!snatL3Uuids.contains(publicNic.getL3NetworkUuid())) { + if (!snatL3Uuids.contains(publicNic.getL3NetworkUuid()) && !vr.isHaEnabled()) { + // for ha router, first router will detach snat service, it will cause second router can not remove snat + // so remove snat for ha router no matter snat is enabled completion.success(); return; } From 7de94a8e2d4662d8ad17efe5fbf1ca6e594c908e Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Thu, 23 Oct 2025 14:52:25 +0800 Subject: [PATCH 571/737] [kvm]: fix l2 bridge name conflict Resolves: ZSTAC-78893 Change-Id: I6868776c01d17b5a91604cc295ac3676f9a0d8f6 --- .../java/org/zstack/kvm/KVMHostUtils.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostUtils.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostUtils.java index ae8b84267dd..cf6d16e7560 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostUtils.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostUtils.java @@ -33,17 +33,26 @@ public class KVMHostUtils { * @return normalized bridge name, or null if anything wrong */ public static String getNormalizedBridgeName(String l2Uuid, String format) { - if (KVMSystemTags.L2_BRIDGE_NAME.hasTag(l2Uuid, L2NetworkVO.class)) { - return KVMSystemTags.L2_BRIDGE_NAME.getTokenByResourceUuid(l2Uuid, KVMSystemTags.L2_BRIDGE_NAME_TOKEN); + String current = KVMSystemTags.L2_BRIDGE_NAME.getTokenByResourceUuid(l2Uuid, KVMSystemTags.L2_BRIDGE_NAME_TOKEN); + if (current != null) { + return current; } validateFormatString(format); - String newBridgeName = generateNewBridgeName(l2Uuid); String physicalInterface = getPhysicalInterface(l2Uuid, format); + String preferredBridgeName = String.format(format, physicalInterface); - return checkNameConflict(l2Uuid, String.format(format, physicalInterface)) ? - newBridgeName : String.format(format, physicalInterface); + if (!checkNameConflict(l2Uuid, preferredBridgeName)) { + return preferredBridgeName; + } + + current = KVMSystemTags.L2_BRIDGE_NAME.getTokenByResourceUuid(l2Uuid, KVMSystemTags.L2_BRIDGE_NAME_TOKEN); + if (current != null) { + return current; + } + + return generateNewBridgeName(l2Uuid); } private static void validateFormatString(String format) { From b01d444185d04cf93678d09ea648e956ab79386f Mon Sep 17 00:00:00 2001 From: shenjin Date: Fri, 26 Sep 2025 13:38:16 +0800 Subject: [PATCH 572/737] [storage]: refactor expon bm2 with vhost ps refactor expon bm2 with vhost ps Resolves: ZSTAC-77315 Change-Id: I6670626f746f6e617466737965776f756a766774 --- .../storage/addon/IscsiRemoteTarget.java | 52 ++++++ .../volume/block/BlockVolumeInventory.java | 57 +++++++ .../BlockVolumeInventoryDoc_zh_cn.groovy | 150 ++++++++++++++++++ .../zstack/expon/ExponStorageController.java | 36 +++-- .../java/org/zstack/iscsi/IscsiUtils.java | 6 + .../xinfini/XInfiniStorageController.java | 8 +- .../BlockExternalPrimaryStorageFactory.java | 6 - .../ExternalPrimaryStorageFactory.java | 20 +++ 8 files changed, 310 insertions(+), 25 deletions(-) create mode 100644 header/src/main/java/org/zstack/header/volume/block/BlockVolumeInventory.java create mode 100644 header/src/main/java/org/zstack/header/volume/block/BlockVolumeInventoryDoc_zh_cn.groovy diff --git a/header/src/main/java/org/zstack/header/storage/addon/IscsiRemoteTarget.java b/header/src/main/java/org/zstack/header/storage/addon/IscsiRemoteTarget.java index fa73f3579b5..c35816b09ae 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/IscsiRemoteTarget.java +++ b/header/src/main/java/org/zstack/header/storage/addon/IscsiRemoteTarget.java @@ -1,6 +1,12 @@ package org.zstack.header.storage.addon; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import java.net.URI; + public class IscsiRemoteTarget extends BlockRemoteTarget { + private final static CLogger logger = Utils.getLogger(IscsiRemoteTarget.class); private String transport = "tcp"; private String iqn; @@ -70,4 +76,50 @@ public enum DiskIdType { wwn, serial } + + public static IscsiRemoteTarget fromUri(String uriString) { + try { + URI uri = URI.create(uriString); + + if (!"iscsi".equalsIgnoreCase(uri.getScheme())) { + logger.info("Invalid URI scheme. Expected 'iscsi', got: " + uri.getScheme()); + return null; + } + + IscsiRemoteTarget target = new IscsiRemoteTarget(); + String authority = uri.getAuthority(); + if (authority == null || authority.isEmpty()) { + logger.info("Invalid URI authority: " + uri.getAuthority()); + return null; + } + String[] serverHostNames = authority.split(":")[0].split(","); + target.setIp(serverHostNames[0]); + target.setPort(uri.getPort() == -1 ? 3260 : uri.getPort()); + + // parse: /{iqn}/{diskIdType}_{diskId} + String path = uri.getPath(); + if (path != null && path.startsWith("/")) { + String[] pathParts = path.substring(1).split("/"); + if (pathParts.length >= 2) { + target.setIqn(pathParts[0]); + String[] diskParts = pathParts[1].split("_", 2); + if (diskParts.length == 2) { + target.setDiskIdType(diskParts[0]); + target.setDiskId(diskParts[1]); + } else { + logger.info("Invalid diskId format in URI path: " + pathParts[1]); + return null; + } + } else { + logger.info("Invalid URI path format: " + path); + return null; + } + } + + return target; + } catch (Exception e) { + logger.error("Failed to parse URI: " + uriString, e); + return null; + } + } } diff --git a/header/src/main/java/org/zstack/header/volume/block/BlockVolumeInventory.java b/header/src/main/java/org/zstack/header/volume/block/BlockVolumeInventory.java new file mode 100644 index 00000000000..b4bed57f82e --- /dev/null +++ b/header/src/main/java/org/zstack/header/volume/block/BlockVolumeInventory.java @@ -0,0 +1,57 @@ +package org.zstack.header.volume.block; + +import org.zstack.header.configuration.PythonClassInventory; +import org.zstack.header.search.Inventory; +import org.zstack.header.search.Parent; +import org.zstack.header.volume.VolumeConstant; +import org.zstack.header.volume.VolumeInventory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@Inventory(mappingVOClass = BlockVolumeVO.class, collectionValueOfMethod="valueOf1", + parent = {@Parent(inventoryClass = VolumeInventory.class, type = VolumeConstant.BLOCK_VOLUME_TYPE)}) +@PythonClassInventory +public class BlockVolumeInventory extends VolumeInventory { + private String iscsiPath; + + private String vendor; + + public String getVendor() { + return vendor; + } + + public void setVendor(String vendor) { + this.vendor = vendor; + } + + public String getIscsiPath() { + return iscsiPath; + } + + public void setIscsiPath(String iscsiPath) { + this.iscsiPath = iscsiPath; + } + + public static BlockVolumeInventory valueOf(BlockVolumeVO vo) { + return new BlockVolumeInventory(vo); + } + + public BlockVolumeInventory() { + } + + public BlockVolumeInventory(BlockVolumeVO other) { + super(VolumeInventory.valueOf(other)); + this.vendor = other.getVendor(); + this.iscsiPath = other.getIscsiPath(); + } + + public static List valueOf1(Collection vos) { + List invs = new ArrayList(vos.size()); + for (BlockVolumeVO vo : vos) { + invs.add(new BlockVolumeInventory(vo)); + } + return invs; + } +} diff --git a/header/src/main/java/org/zstack/header/volume/block/BlockVolumeInventoryDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/volume/block/BlockVolumeInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..7dacb678bdd --- /dev/null +++ b/header/src/main/java/org/zstack/header/volume/block/BlockVolumeInventoryDoc_zh_cn.groovy @@ -0,0 +1,150 @@ +package org.zstack.header.volume.block + +import java.lang.Integer +import java.lang.Long +import java.sql.Timestamp +import java.lang.Boolean + +doc { + + title "块存储卷" + + field { + name "iscsiPath" + desc "" + type "String" + since "4.7.11" + } + field { + name "vendor" + desc "" + type "String" + since "4.7.11" + } + field { + name "uuid" + desc "资源的UUID,唯一标示该资源" + type "String" + since "4.7.11" + } + field { + name "name" + desc "资源名称" + type "String" + since "4.7.11" + } + field { + name "description" + desc "资源的详细描述" + type "String" + since "4.7.11" + } + field { + name "primaryStorageUuid" + desc "主存储UUID" + type "String" + since "4.7.11" + } + field { + name "vmInstanceUuid" + desc "云主机UUID" + type "String" + since "4.7.11" + } + field { + name "diskOfferingUuid" + desc "云盘规格UUID" + type "String" + since "4.7.11" + } + field { + name "rootImageUuid" + desc "" + type "String" + since "4.7.11" + } + field { + name "installPath" + desc "" + type "String" + since "4.7.11" + } + field { + name "type" + desc "" + type "String" + since "4.7.11" + } + field { + name "format" + desc "" + type "String" + since "4.7.11" + } + field { + name "size" + desc "" + type "Long" + since "4.7.11" + } + field { + name "actualSize" + desc "" + type "Long" + since "4.7.11" + } + field { + name "deviceId" + desc "" + type "Integer" + since "4.7.11" + } + field { + name "state" + desc "" + type "String" + since "4.7.11" + } + field { + name "status" + desc "" + type "String" + since "4.7.11" + } + field { + name "createDate" + desc "创建时间" + type "Timestamp" + since "4.7.11" + } + field { + name "lastOpDate" + desc "最后一次修改时间" + type "Timestamp" + since "4.7.11" + } + field { + name "isShareable" + desc "" + type "Boolean" + since "4.7.11" + } + field { + name "volumeQos" + desc "" + type "String" + since "4.7.11" + } + field { + name "lastDetachDate" + desc "" + type "Timestamp" + since "4.7.11" + } + field { + name "lastVmInstanceUuid" + desc "" + type "String" + since "4.7.11" + } +} diff --git a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java index 7e6619497a7..ca72e1a08b6 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java +++ b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java @@ -21,6 +21,7 @@ import org.zstack.expon.sdk.uss.UssGatewayModule; import org.zstack.expon.sdk.vhost.VhostControllerModule; import org.zstack.expon.sdk.volume.ExponVolumeQos; +import org.zstack.expon.sdk.volume.VolumeLunModule; import org.zstack.expon.sdk.volume.VolumeModule; import org.zstack.expon.sdk.volume.VolumeSnapshotModule; import org.zstack.header.core.Completion; @@ -37,13 +38,12 @@ import org.zstack.header.storage.primary.ImageCacheInventory; import org.zstack.header.storage.primary.VolumeSnapshotCapability; import org.zstack.header.storage.snapshot.VolumeSnapshotStats; -import org.zstack.header.volume.VolumeConstant; -import org.zstack.header.volume.VolumeInventory; -import org.zstack.header.volume.VolumeProtocol; -import org.zstack.header.volume.VolumeStats; +import org.zstack.header.volume.*; +import org.zstack.header.volume.block.BlockVolumeVO; import org.zstack.iscsi.IscsiUtils; import org.zstack.iscsi.kvm.IscsiHeartbeatVolumeTO; import org.zstack.iscsi.kvm.IscsiVolumeTO; +import org.zstack.kvm.KVMConstant; import org.zstack.storage.addon.primary.ExternalPrimaryStorageFactory; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; @@ -76,8 +76,6 @@ public class ExponStorageController implements PrimaryStorageControllerSvc, Prim private ExponConfig config; public ExponAddonInfo addonInfo; public final ExponApiHelper apiHelper; - @Autowired - private ExternalPrimaryStorageFactory extPsFactory; // TODO static nqn private final static String hostNqn = "nqn.2014-08.org.nvmexpress:uuid:zstack"; @@ -239,6 +237,10 @@ public List getIscsiServers(String tianshuId) { private synchronized ActiveVolumeTO activeIscsiVolume(HostInventory h, BaseVolumeInfo vol, boolean shareable) { String clientIqn = IscsiUtils.getHostInitiatorName(h.getUuid()); + if (!KVMConstant.KVM_HYPERVISOR_TYPE.equals(h.getHypervisorType())) { + VolumeVO volume = dbf.findByUuid(vol.getUuid(), VolumeVO.class); + clientIqn = IscsiUtils.getBMInitiatorName(volume.getVmInstanceUuid()); + } if (clientIqn == null) { throw new RuntimeException(String.format("cannot get host[uuid:%s] initiator name", h.getUuid())); } @@ -533,6 +535,9 @@ public List getActiveClients(String installPath, String prot } else { c.setManagerIp(it); } + VolumeLunModule lunDetail = apiHelper.getVolumeLunDetail(getVolIdFromPath(installPath)); + // path: uuid/poolId/lunid + c.setPath(String.format("%s/%s/%s", lunDetail.getUuid(), lunDetail.getPoolId(), lunDetail.getLunId())); return c; }).collect(Collectors.toList()); } else { @@ -578,14 +583,13 @@ public void deactivate(String installPath, String protocol, HostInventory h, Com @Override public void deactivate(String installPath, String protocol, ActiveVolumeClient client, Completion comp) { - HostVO host = Q.New(HostVO.class).eq(HostVO_.managementIp, client.getManagerIp()).find(); - if (host != null) { - deactivate(installPath, protocol, HostInventory.valueOf(host), comp); - } else { - // bm instance InitiatorName + if (VolumeProtocol.iSCSI.toString().equals(protocol)) { deactivateIscsi(installPath, client.getQualifiedName()); comp.success(); + return; } + HostVO host = Q.New(HostVO.class).eq(HostVO_.managementIp, client.getManagerIp()).find(); + deactivate(installPath, protocol, HostInventory.valueOf(host), comp); } public void cleanActiveRecord(VolumeInventory vol) { @@ -751,6 +755,10 @@ private void deactivateVhost(String installPath, HostInventory h) { private void deactivateIscsi(String installPath, HostInventory h) { String iqn = IscsiUtils.getHostInitiatorName(h.getUuid()); + if (!KVMConstant.KVM_HYPERVISOR_TYPE.equals(h.getHypervisorType())) { + VolumeVO volume = Q.New(VolumeVO.class).eq(VolumeVO_.installPath, installPath).find(); + iqn = IscsiUtils.getBMInitiatorName(volume.getLastVmInstanceUuid()); + } if (iqn == null) { throw new RuntimeException(String.format("cannot get host[uuid:%s] initiator name", h.getUuid())); } @@ -955,10 +963,10 @@ private void setNodeHealthyByVhost(HostInventory host, NodeHealthy healthy) { } private String getProtocolByHypervisorType(String type) { - NodeHealthyCheckProtocolExtensionPoint point = extPsFactory.nodeHealthyCheckProtocolExtensions.get(type); - if (point != null) { - return point.getHealthyProtocol(); + if (!KVMConstant.KVM_HYPERVISOR_TYPE.equals(type)) { + return VolumeProtocol.iSCSI.toString(); } + return VolumeProtocol.Vhost.toString(); } diff --git a/plugin/iscsi/src/main/java/org/zstack/iscsi/IscsiUtils.java b/plugin/iscsi/src/main/java/org/zstack/iscsi/IscsiUtils.java index 034ad33f203..1fa5af3d517 100644 --- a/plugin/iscsi/src/main/java/org/zstack/iscsi/IscsiUtils.java +++ b/plugin/iscsi/src/main/java/org/zstack/iscsi/IscsiUtils.java @@ -11,6 +11,8 @@ import org.zstack.header.storage.backup.*; import org.zstack.header.tag.SystemTagVO; import org.zstack.header.tag.SystemTagVO_; +import org.zstack.header.vm.VmInstanceVO; +import org.zstack.header.vm.VmInstanceVO_; import org.zstack.storage.backup.BackupStorageSystemTags; import java.util.Collections; @@ -53,4 +55,8 @@ private static String getBsMnIp(String bsUuid) { public static String getBSInitiatorName(String bsUuid) { return BackupStorageSystemTags.ISCSI_INITIATOR_NAME.getTokenByResourceUuid(bsUuid, BackupStorageVO.class, BackupStorageSystemTags.ISCSI_INITIATOR_NAME_TOKEN); } + + public static String getBMInitiatorName(String vmUuid) { + return String.format("iqn.2015-01.io.zstack:initiator.instance.%s", vmUuid); + } } diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index 67b5d3904a4..a43a9eaa6c4 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -25,6 +25,7 @@ import org.zstack.iscsi.IscsiUtils; import org.zstack.iscsi.kvm.IscsiHeartbeatVolumeTO; import org.zstack.iscsi.kvm.IscsiVolumeTO; +import org.zstack.kvm.KVMConstant; import org.zstack.resourceconfig.ResourceConfigFacade; import org.zstack.storage.addon.primary.ExternalPrimaryStorageFactory; import org.zstack.storage.volume.VolumeConfigsGetter; @@ -76,8 +77,6 @@ public class XInfiniStorageController implements PrimaryStorageControllerSvc, Pr private XInfiniAddonInfo addonInfo; private final XInfiniApiHelper apiHelper; @Autowired - private ExternalPrimaryStorageFactory extPsFactory; - @Autowired private ResourceConfigFacade rcf; private String vhostSocketDir; @@ -639,9 +638,8 @@ private void setNodeHealthyByVhost(HostInventory host, NodeHealthy healthy) { } private String getProtocolByHypervisorType(String type) { - NodeHealthyCheckProtocolExtensionPoint point = extPsFactory.nodeHealthyCheckProtocolExtensions.get(type); - if (point != null) { - return point.getHealthyProtocol(); + if (!KVMConstant.KVM_HYPERVISOR_TYPE.equals(type)) { + return VolumeProtocol.iSCSI.toString(); } return VolumeProtocol.Vhost.toString(); } diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/BlockExternalPrimaryStorageFactory.java b/storage/src/main/java/org/zstack/storage/addon/primary/BlockExternalPrimaryStorageFactory.java index 45b2b92502d..2c561cc03a3 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/BlockExternalPrimaryStorageFactory.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/BlockExternalPrimaryStorageFactory.java @@ -10,10 +10,4 @@ public interface BlockExternalPrimaryStorageFactory { String getType(); BlockExternalPrimaryStorageBackend getBlockExternalPrimaryStorageBackend(PrimaryStorageVO vo); - - void activeIscsiVolume(String clientIqn, BaseVolumeInfo vol, boolean shareable); - - Map getVolumeIscsiInfo(String volInstallPath, HostInventory host); - - String getVolumeLunId(String volInstallPath); } diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java index cfc8e3db3c5..6b21ab8325a 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java @@ -29,6 +29,7 @@ import org.zstack.header.message.AbstractBeforeDeliveryMessageInterceptor; import org.zstack.header.message.Message; import org.zstack.header.message.MessageReply; +import org.zstack.header.storage.addon.IscsiRemoteTarget; import org.zstack.header.storage.addon.primary.*; import org.zstack.header.storage.backup.BackupStorageConstant; import org.zstack.header.storage.backup.DeleteBitsOnBackupStorageMsg; @@ -39,6 +40,7 @@ import org.zstack.header.vm.cdrom.VmCdRomVO_; import org.zstack.header.volume.VolumeInventory; import org.zstack.header.volume.VolumeVO; +import org.zstack.header.volume.block.BlockVolumeVO; import org.zstack.storage.addon.backup.ExternalBackupStorageFactory; import org.zstack.storage.primary.PrimaryStorageFeatureAllocatorExtensionPoint; import org.zstack.storage.snapshot.MarkRootVolumeAsSnapshotExtension; @@ -458,6 +460,24 @@ private void activeVolumeIfNeed(VmInstanceInventory vm, VolumeInventory volume, svc.activate(BaseVolumeInfo.valueOf(volume), host, volume.isShareable(), new ReturnValueCompletion(completion) { @Override public void success(ActiveVolumeTO returnValue) { + VolumeVO volumeVO = dbf.findByUuid(volume.getUuid(), VolumeVO.class); + if (!(volumeVO instanceof BlockVolumeVO)) { + completion.success(); + return; + } + String uri = svc.getActivePath(BaseVolumeInfo.valueOf(volume), + host, volume.isShareable()); + IscsiRemoteTarget target = IscsiRemoteTarget.fromUri(uri); + if (target == null) { + completion.success(); + return; + } + + BlockVolumeVO blockVolumeVO = (BlockVolumeVO) volumeVO; + if (!blockVolumeVO.getIscsiPath().contains(target.getIqn())) { + blockVolumeVO.setIscsiPath(String.format("%s%s", blockVolumeVO.getIscsiPath(), target.getIqn())); + dbf.updateAndRefresh(blockVolumeVO); + } completion.success(); } From bd7a0194fcce87586c384088b2d8e6e869dbeeb5 Mon Sep 17 00:00:00 2001 From: "yingzhe.hu" Date: Fri, 24 Oct 2025 16:17:23 +0800 Subject: [PATCH 573/737] [storage]: support data volume thinProvisioningInitializeSize tag Resolves: ZSTACK-78122 Change-Id: I6e6c786a736b6277696f716e6163776264637567 --- ...stantiateVolumeForNewCreatedVmExtension.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForNewCreatedVmExtension.java b/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForNewCreatedVmExtension.java index b165106d351..6254e518957 100755 --- a/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForNewCreatedVmExtension.java +++ b/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForNewCreatedVmExtension.java @@ -25,6 +25,7 @@ import org.zstack.header.vm.VmInstanceSpec.ImageSpec; import org.zstack.header.volume.*; import org.zstack.identity.AccountManager; +import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; @@ -33,6 +34,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.*; +import java.util.stream.Collectors; public class InstantiateVolumeForNewCreatedVmExtension implements PreVmInstantiateResourceExtensionPoint { private static final CLogger logger = Utils.getLogger(InstantiateVolumeForNewCreatedVmExtension.class); @@ -187,8 +189,21 @@ public void preInstantiateVmResource(VmInstanceSpec spec, Completion completion) } List msgs = new ArrayList<>(); + Map> volumeTagsMap = Optional.ofNullable(spec.getVolumeSpecs()) + .orElse(Collections.emptyList()) + .stream() + .collect(Collectors.toMap( + VmInstanceSpec.VolumeSpec::getAssociatedVolumeUuid, + vspec -> vspec.getTags() != null ? vspec.getTags() : Collections.emptyList() + )); + for (VolumeInventory volume : spec.getDestDataVolumes()) { - msgs.add(fillMsg(new InstantiateVolumeMsg(), volume, spec)); + InstantiateVolumeMsg dmsg = fillMsg(new InstantiateVolumeMsg(), volume, spec); + List tags = volumeTagsMap.get(volume.getUuid()); + if (!CollectionUtils.isEmpty(tags)) { + dmsg.setSystemTags(tags); + } + msgs.add(dmsg); } for (VolumeInventory volume : spec.getDestCacheVolumes()) { From d7c2609342bbd1de489089bbc386c401cd506168 Mon Sep 17 00:00:00 2001 From: J M Date: Thu, 23 Oct 2025 18:52:35 +0800 Subject: [PATCH 574/737] [storage]: volume snapshot revert overlay volume revert snapshot will cause volume install path changed. so queue it in volume. start vm will check volume queue. Resolves: ZSTAC-59188 Change-Id: I6f75766371627a616571616878636d6e61746d6b --- .../zstack/header/message/OverlayMessage.java | 1 + .../VolumeSnapshotRevertOverlayVolumeMsg.java | 16 ++++++ .../snapshot/RevertVolumeSnapshotLongJob.java | 9 ++- .../snapshot/VolumeSnapshotTreeBase.java | 57 ++++++++----------- .../VolumeSnapshotOperationLongJobCase.groovy | 10 ++++ .../RevertVolumeFromSnapshotCase.groovy | 13 +++++ 6 files changed, 72 insertions(+), 34 deletions(-) create mode 100644 header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotRevertOverlayVolumeMsg.java diff --git a/header/src/main/java/org/zstack/header/message/OverlayMessage.java b/header/src/main/java/org/zstack/header/message/OverlayMessage.java index b76f9585f10..a58a0bcd703 100755 --- a/header/src/main/java/org/zstack/header/message/OverlayMessage.java +++ b/header/src/main/java/org/zstack/header/message/OverlayMessage.java @@ -37,6 +37,7 @@ public NeedReplyMessage getMessage() { public String getTaskName() { String simpleName = messageClassName.substring( messageClassName.lastIndexOf(".") + 1, messageClassName.lastIndexOf("Msg")); + simpleName = simpleName.replaceFirst("API", ""); return CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_HYPHEN, simpleName); } } diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotRevertOverlayVolumeMsg.java b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotRevertOverlayVolumeMsg.java new file mode 100644 index 00000000000..c3a19becf5f --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotRevertOverlayVolumeMsg.java @@ -0,0 +1,16 @@ +package org.zstack.header.storage.snapshot; + +import org.zstack.header.message.OverlayMessage; +import org.zstack.header.volume.VolumeMessage; + +public class VolumeSnapshotRevertOverlayVolumeMsg extends OverlayMessage implements VolumeMessage { + private String volumeUuid; + + public String getVolumeUuid() { + return volumeUuid; + } + + public void setVolumeUuid(String volumeUuid) { + this.volumeUuid = volumeUuid; + } +} diff --git a/storage/src/main/java/org/zstack/storage/snapshot/RevertVolumeSnapshotLongJob.java b/storage/src/main/java/org/zstack/storage/snapshot/RevertVolumeSnapshotLongJob.java index 5c1af6a932e..2dd1aa5a5ab 100644 --- a/storage/src/main/java/org/zstack/storage/snapshot/RevertVolumeSnapshotLongJob.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/RevertVolumeSnapshotLongJob.java @@ -18,6 +18,7 @@ import org.zstack.header.message.APIEvent; import org.zstack.header.message.MessageReply; import org.zstack.header.storage.snapshot.*; +import org.zstack.header.volume.VolumeConstant; import org.zstack.header.volume.VolumeVO; import org.zstack.longjob.LongJobUtils; import org.zstack.utils.gson.JSONObjectUtil; @@ -45,7 +46,13 @@ public void start(LongJobVO job, ReturnValueCompletion completion) { msg.setTreeUuid(apiMessage.getTreeUuid()); msg.setSession(apiMessage.getSession()); bus.makeServiceIdByManagementNodeId(msg, VolumeSnapshotConstant.SERVICE_ID, getRoutedMnId(apiMessage)); - bus.send(msg, new CloudBusCallBack(completion) { + + + VolumeSnapshotRevertOverlayVolumeMsg omsg = new VolumeSnapshotRevertOverlayVolumeMsg(); + omsg.setVolumeUuid(msg.getVolumeUuid()); + omsg.setMessage(msg); + bus.makeTargetServiceIdByResourceUuid(omsg, VolumeConstant.SERVICE_ID, msg.getVolumeUuid()); + bus.send(omsg, new CloudBusCallBack(completion) { @Override public void run(MessageReply reply) { auditResourceUuid = msg.getVolumeUuid(); diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java index 154438d94fd..e21cec893e8 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java @@ -8,10 +8,7 @@ import org.zstack.core.asyncbatch.While; import org.zstack.core.cascade.CascadeConstant; import org.zstack.core.cascade.CascadeFacade; -import org.zstack.core.cloudbus.CloudBus; -import org.zstack.core.cloudbus.CloudBusCallBack; -import org.zstack.core.cloudbus.CloudBusListCallBack; -import org.zstack.core.cloudbus.MessageSafe; +import org.zstack.core.cloudbus.*; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.*; import org.zstack.core.db.SimpleQuery.Op; @@ -2486,35 +2483,28 @@ public String getName() { } private void handle(final APIRevertVolumeFromSnapshotMsg msg) { - thdf.chainSubmit(new ChainTask(msg) { - @Override - public String getSyncSignature() { - return syncSignature; - } - - @Override - public void run(final SyncTaskChain chain) { - APIRevertVolumeFromSnapshotEvent evt = new APIRevertVolumeFromSnapshotEvent(msg.getId()); - - revert(msg, new Completion(evt, chain) { - @Override - public void success() { - bus.publish(evt); - chain.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - evt.setError(errorCode); - bus.publish(evt); - chain.next(); - } - }); - } - - @Override - public String getName() { - return String.format("revert-volume-%s-from-snapshot-%s", currentRoot.getVolumeUuid(), currentRoot.getUuid()); + APIRevertVolumeFromSnapshotEvent evt = new APIRevertVolumeFromSnapshotEvent(msg.getId()); + + RevertVolumeSnapshotMsg rmsg = new RevertVolumeSnapshotMsg(); + rmsg.setSnapshotUuid(msg.getSnapshotUuid()); + rmsg.setVolumeUuid(msg.getVolumeUuid()); + rmsg.setTreeUuid(msg.getTreeUuid()); + rmsg.setSession(msg.getSession()); + rmsg.setServiceId(msg.getServiceId()); + + VolumeSnapshotRevertOverlayVolumeMsg omsg = new VolumeSnapshotRevertOverlayVolumeMsg(); + omsg.setVolumeUuid(msg.getVolumeUuid()); + omsg.setMessage(rmsg); + bus.makeTargetServiceIdByResourceUuid(omsg, VolumeConstant.SERVICE_ID, msg.getVolumeUuid()); + bus.send(omsg, new CloudBusCallBack(msg) { + @Override + public void run(MessageReply reply) { + if (reply.isSuccess()) { + bus.publish(evt); + } else { + evt.setError(reply.getError()); + bus.publish(evt); + } } }); } @@ -2601,6 +2591,7 @@ public void run(MessageReply r) { }); if (msg instanceof RevertVolumeFromSnapshotGroupMsg) { + // TODO refactor this logic to group snapshot creator flow(new NoRollbackFlow() { String __name__ = "add-snapshot-to-group"; String newGroupUuid = ((RevertVolumeFromSnapshotGroupMsg) msg).getNewSnapshotGroupUuid(); diff --git a/test/src/test/groovy/org/zstack/test/integration/longjob/VolumeSnapshotOperationLongJobCase.groovy b/test/src/test/groovy/org/zstack/test/integration/longjob/VolumeSnapshotOperationLongJobCase.groovy index 9e773ed0848..7875ab9beb5 100644 --- a/test/src/test/groovy/org/zstack/test/integration/longjob/VolumeSnapshotOperationLongJobCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/longjob/VolumeSnapshotOperationLongJobCase.groovy @@ -9,6 +9,7 @@ import org.zstack.header.storage.snapshot.APIRevertVolumeFromSnapshotMsg import org.zstack.sdk.LongJobInventory import org.zstack.sdk.VmInstanceInventory import org.zstack.sdk.VolumeSnapshotInventory +import org.zstack.storage.primary.local.LocalStorageKvmBackend import org.zstack.test.integration.ZStackTest import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase @@ -166,6 +167,15 @@ class VolumeSnapshotOperationLongJobCase extends SubCase { def id = Platform.getUuid() + env.afterSimulator(LocalStorageKvmBackend.REVERT_SNAPSHOT_PATH) { rsp -> + expectError { + startVmInstance { + uuid = vm.uuid + } + } + return rsp + } + def job = submitLongJob { jobName = msg.getClass().getSimpleName() jobData = gson.toJson(msg) diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/snapshot/RevertVolumeFromSnapshotCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/snapshot/RevertVolumeFromSnapshotCase.groovy index 95c2a6a8ea9..358ea427092 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/snapshot/RevertVolumeFromSnapshotCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/snapshot/RevertVolumeFromSnapshotCase.groovy @@ -1,5 +1,6 @@ package org.zstack.test.integration.storage.snapshot +import org.springframework.http.HttpEntity import org.zstack.core.db.Q import org.zstack.core.trash.StorageTrash import org.zstack.core.trash.TrashType @@ -10,12 +11,16 @@ import org.zstack.header.storage.snapshot.VolumeSnapshotVO_ import org.zstack.sdk.VmInstanceInventory import org.zstack.sdk.VolumeInventory import org.zstack.sdk.VolumeSnapshotInventory +import org.zstack.storage.primary.local.LocalStorageKvmBackend import org.zstack.storage.primary.local.LocalStorageResourceRefVO import org.zstack.storage.primary.local.LocalStorageResourceRefVO_ import org.zstack.test.integration.ldap.Env import org.zstack.test.integration.storage.StorageTest import org.zstack.testlib.EnvSpec +import org.zstack.testlib.HttpError import org.zstack.testlib.SubCase +import org.zstack.utils.gson.JSONObjectUtil + /** * Created by ads6 on 2018/1/2. */ @@ -71,6 +76,14 @@ STEP: def installPath = root.installPath def size = root.size + env.preSimulator(LocalStorageKvmBackend.REVERT_SNAPSHOT_PATH) { HttpEntity e -> + expectError { + startVmInstance { + uuid = vm.uuid + } + } + } + revertVolumeFromSnapshot { uuid = s1.uuid } From 5b72c8554a2836170362edd082baec6c6e9bc04a Mon Sep 17 00:00:00 2001 From: J M Date: Sat, 25 Oct 2025 13:34:28 +0800 Subject: [PATCH 575/737] [testlib]: enhance ceph spec for migrate cidr set Resolves: ZSTAC-65976 Change-Id: I747075656f6e6b656d7562736b6e6d7174797670 --- .../zstack/testlib/CephPrimaryStorageSpec.groovy | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/testlib/src/main/java/org/zstack/testlib/CephPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/CephPrimaryStorageSpec.groovy index ab5065396ce..e8f90f1d110 100755 --- a/testlib/src/main/java/org/zstack/testlib/CephPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/CephPrimaryStorageSpec.groovy @@ -9,6 +9,7 @@ import org.zstack.header.volume.VolumeVO_ import org.zstack.kvm.KVMAgentCommands import org.zstack.sdk.PrimaryStorageInventory import org.zstack.storage.ceph.CephConstants +import org.zstack.storage.ceph.CephMonSystemTags import org.zstack.storage.ceph.CephPoolCapacity import org.zstack.storage.ceph.CephSystemTags import org.zstack.storage.ceph.DataSecurityPolicy @@ -19,6 +20,7 @@ import org.zstack.testlib.vfs.VFSFile import org.zstack.utils.data.SizeUnit import org.zstack.utils.gson.JSONObjectUtil +import javax.persistence.Tuple import java.nio.file.Path /** @@ -665,6 +667,18 @@ class CephPrimaryStorageSpec extends PrimaryStorageSpec { .select(CephPrimaryStorageMonVO_.primaryStorageUuid) .eq(CephPrimaryStorageMonVO_.hostname, cmd.dstMonHostname) .findValue() + if (dstPrimaryStorageUuid == null) { + List ts = Q.New(CephPrimaryStorageMonVO.class) + .select(CephPrimaryStorageMonVO_.uuid, CephPrimaryStorageMonVO_.primaryStorageUuid) + .listTuple() + for (final def t in ts) { + String extraIp = CephMonSystemTags.EXTRA_IPS.getTokenByResourceUuid(t.get(0, String.class), CephMonSystemTags.EXTRA_IPS_TOKEN) + if (extraIp != null && extraIp.split(",").contains(cmd.dstMonHostname)) { + dstPrimaryStorageUuid = t.get(1, String.class) + break + } + } + } String dstFsid = Q.New(CephPrimaryStorageVO.class) .select(CephPrimaryStorageVO_.fsid) .eq(CephPrimaryStorageVO_.uuid, dstPrimaryStorageUuid) From a54caf3c58e9b6ad17780b0ab25809b403c3aa5d Mon Sep 17 00:00:00 2001 From: lianghy Date: Mon, 27 Oct 2025 10:16:02 +0800 Subject: [PATCH 576/737] [core]: bump version to 5.4.2 Resolves: ZSTAC-79247 Change-Id: I6c76666f78766d7562696a716c6f6f6f62697a68 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 0d1081b0fe6..b8ac796c958 100755 --- a/VERSION +++ b/VERSION @@ -1,3 +1,3 @@ MAJOR=5 MINOR=4 -UPDATE=0 +UPDATE=2 From 85976da509e71c8971de01c0d026f3c5d402a448 Mon Sep 17 00:00:00 2001 From: moyu Date: Thu, 30 Oct 2025 13:49:16 +0800 Subject: [PATCH 577/737] [portal]: add debug signal handler to dump node information - Add runtime debugging capability to inspect all registered nodes in the cluster for troubleshooting node distribution and management node issues. - Register a "DumpNodeInfo" debug signal handler in ManagementNodeManager that prints all node UUIDs and IPs from destinationMaker when triggered. - No side effects. Read-only debug feature that only executes when explicitly triggered via debug signal. Resolves: ZSTAC-79428 Change-Id: I67726a6f62646d7676696b7371616c7564696a74 --- .../ManagementNodeManagerImpl.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java b/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java index 97e90e49de1..747a154919b 100755 --- a/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java +++ b/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java @@ -101,6 +101,7 @@ public class ManagementNodeManagerImpl extends AbstractService implements Manage private static boolean stopped = false; private Future heartBeatTask = null; private HeartBeatDBSource heartBeatDBSource; + private static final String DEBUG_SIGNAL = "DumpNodeInfo"; private List lifeCycleExtension = new ArrayList(); // A dictionary (nodeId -> ManagementNodeInventory) of joined management Node final private Map joinedManagementNodes = new ConcurrentHashMap<>(); @@ -386,6 +387,20 @@ private void dumpDebugMessages() { } } + private void registerDebugDumpNodeInfo() { + DebugManager.registerDebugSignalHandler(DEBUG_SIGNAL, () -> { + StringBuilder sb = new StringBuilder(); + sb.append("\n================ BEGIN: NODE INFO ===================\n"); + + destinationMaker.getAllNodeInfo().forEach((nodeInfo) -> { + sb.append(String.format("Node[%s, %s]\n", nodeInfo.getNodeUuid(), nodeInfo.getNodeIP())); + }); + + sb.append("================ END: NODE INFO =====================\n"); + logger.debug(sb.toString()); + }); + } + @Override public boolean start() { if (started) { @@ -616,6 +631,7 @@ public void handle(ErrorCode errCode, Map data) { stopped = false; installShutdownHook(); + registerDebugDumpNodeInfo(); DebugSignalHandler.listenTo("USR2", this); logger.info("Management node: " + getId() + " starts successfully"); From 820596e5a0e346b221bff2ce508fc9fa45d3dddd Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Thu, 30 Oct 2025 14:05:24 +0800 Subject: [PATCH 578/737] [console]: skip port check if port not changed Resolves: ZSTAC-77943 Change-Id: I7578727a727564766f676b6d787369626e79787a --- .../zstack/console/ManagementServerConsoleProxyBackend.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java b/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java index 14ad99dc48a..5a84fbca1ea 100755 --- a/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java +++ b/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java @@ -494,6 +494,12 @@ public void run(FlowTrigger trigger, Map data) { return; } + vo = dbf.findByUuid(msg.getUuid(), ConsoleProxyAgentVO.class); + if ((int)msg.getConsoleProxyPort() == vo.getConsoleProxyPort()) { + trigger.next(); + return; + } + ShellUtils.ShellRunner runner = new ShellUtils.ShellRunner(); runner.setCommand(String.format("netstat -nltp | grep -E ':%d\\s+'", msg.getConsoleProxyPort())); runner.setVerbose(false); From 797293cfa62bf4159e4f23d8e6962fdbda9e68ec Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Fri, 31 Oct 2025 11:28:59 +0800 Subject: [PATCH 579/737] [xinfini]: change VolumeSpec fields from int to long Resolves: ZSTAC-79460 Change-Id: I6b77656f6668796677626b6c6b7361696e6a6274 --- .../org/zstack/xinfini/sdk/volume/VolumeModule.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/VolumeModule.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/VolumeModule.java index 3470c0c4781..999eb45797a 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/VolumeModule.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/VolumeModule.java @@ -89,22 +89,22 @@ public static class VolumeSpec extends BaseSpec { private int poolId; private boolean flattened; private String serial; - private int maxTotalIops; - private int maxTotalBwBps; + private long maxTotalIops; + private long maxTotalBwBps; - public int getMaxTotalIops() { + public long getMaxTotalIops() { return maxTotalIops; } - public void setMaxTotalIops(int maxTotalIops) { + public void setMaxTotalIops(long maxTotalIops) { this.maxTotalIops = maxTotalIops; } - public int getMaxTotalBwBps() { + public long getMaxTotalBwBps() { return maxTotalBwBps; } - public void setMaxTotalBwBps(int maxTotalBwBps) { + public void setMaxTotalBwBps(long maxTotalBwBps) { this.maxTotalBwBps = maxTotalBwBps; } From 8b995517cdfedde36093415101f1736f862b37f6 Mon Sep 17 00:00:00 2001 From: "xinhao.huang" Date: Thu, 30 Oct 2025 16:55:10 +0800 Subject: [PATCH 580/737] [resourceconfig]: fix hygon cpu vendor global config not work and remove getResourceConfigValueByResourceType Resolves: ZSTAC-74746 Change-Id: I61656d6e7963686d78776475726e65767a6f7163 --- .../kvm/VmCpuVendorKvmStartVmExtension.java | 16 ++---- .../zstack/resourceconfig/ResourceConfig.java | 23 -------- .../resourceconfig/ResourceConfigFacade.java | 2 - .../ResourceConfigFacadeImpl.java | 10 ---- .../integration/kvm/vm/VmSetVendorCase.groovy | 53 +++++++++++++++++-- .../test/resources/springConfigXml/Kvm.xml | 7 +++ 6 files changed, 60 insertions(+), 51 deletions(-) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/VmCpuVendorKvmStartVmExtension.java b/plugin/kvm/src/main/java/org/zstack/kvm/VmCpuVendorKvmStartVmExtension.java index 72502cc750a..25e099a2940 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/VmCpuVendorKvmStartVmExtension.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/VmCpuVendorKvmStartVmExtension.java @@ -11,13 +11,7 @@ import org.zstack.core.db.Q; import org.zstack.core.db.SQL; import org.zstack.header.errorcode.ErrorCode; -import org.zstack.header.vm.CreateVmInstanceMsg; -import org.zstack.header.vm.VmInstanceCreateExtensionPoint; import org.zstack.header.vm.VmInstanceSpec; -import org.zstack.header.vm.VmInstanceVO; -import org.zstack.kvm.KVMAgentCommands; -import org.zstack.kvm.KVMHostInventory; -import org.zstack.kvm.KVMStartVmExtensionPoint; import org.zstack.resourceconfig.ResourceConfig; import org.zstack.resourceconfig.ResourceConfigFacade; import org.zstack.resourceconfig.ResourceConfigVO; @@ -25,7 +19,6 @@ import java.util.ArrayList; import java.util.List; -import static org.zstack.compute.vm.VmCpuVendor.AuthenticAMD; import static org.zstack.kvm.KVMConstant.CPU_MODE_HOST_PASSTHROUGH; import static org.zstack.kvm.KVMConstant.CPU_MODE_HYGON_CUSTOMIZED; @@ -49,12 +42,11 @@ public void beforeStartVmOnKvm(KVMHostInventory host, VmInstanceSpec spec, KVMAg } ResourceConfig rc = rcf.getResourceConfig(VmGlobalConfig.VM_CPUID_VENDOR.getIdentity()); - String vmCpuIdVendor = rc.getResourceConfigValueByResourceType(spec.getVmInventory().getUuid(), VmInstanceVO.class.getSimpleName(), String.class); - if (vmCpuIdVendor == null) { - rc.updateValue(spec.getVmInventory().getUuid(), AuthenticAMD.toString()); - } + String vmCpuIdVendor = rc.getResourceConfigValue(spec.getVmInventory().getUuid(), String.class); - cmd.setVmCpuVendorId(rcf.getResourceConfigValue(VmGlobalConfig.VM_CPUID_VENDOR, spec.getVmInventory().getUuid(), String.class)); + if (vmCpuIdVendor != null) { + cmd.setVmCpuVendorId(vmCpuIdVendor); + } } @Override diff --git a/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfig.java b/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfig.java index a2a519844c5..cbec4e64dde 100644 --- a/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfig.java +++ b/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfig.java @@ -110,11 +110,6 @@ public T getResourceConfigValue(String resourceUuid, Class clz) { return TypeUtils.stringToValue(value, clz); } - public T getResourceConfigValueByResourceType(String resourceUuid, String resourceType, Class clz) { - String value = getResourceConfigValueByResourceType(resourceUuid, resourceType); - return TypeUtils.stringToValue(value, clz); - } - public Map getResourceConfigValues(List resourceUuids, Class clz) { Map values = new HashMap<>(); getResourceConfigValues(resourceUuids).forEach((key, value) -> values.put(key, TypeUtils.stringToValue(value, clz))); @@ -248,24 +243,6 @@ protected String getResourceConfigValue(String resourceUuid) { return getter.getResourceConfigValue(resourceUuid); } - @Transactional(readOnly = true) - protected String getResourceConfigValueByResourceType(String resourceUuid, String type) { - String resourceType = Q.New(ResourceVO.class).select(ResourceVO_.resourceType).eq(ResourceVO_.uuid, resourceUuid).findValue(); - if (resourceType == null || !resourceType.equals(type)) { - logger.warn(String.format("no resource[uuid:%s] by resourceType[%s] found, cannot get it's resource config", resourceUuid, type)); - return null; - } - - ResourceConfigGetter getter = configGetter.get(resourceType); - if (getter == null) { - logger.warn(String.format("resource[uuid:%s, type:%s] is not bound to global config[category:%s, name:%s]", - resourceUuid, resourceType, globalConfig.getCategory(), globalConfig.getName())); - return null; - } - - return loadConfigValue(resourceUuid); - } - @Transactional(readOnly = true) protected Map getResourceConfigValues(List resourceUuids) { Map valuesByResourceUuids = new HashMap<>(); diff --git a/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigFacade.java b/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigFacade.java index cf1f4b395f0..81074e7c319 100644 --- a/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigFacade.java +++ b/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigFacade.java @@ -12,8 +12,6 @@ public interface ResourceConfigFacade { T getResourceConfigValue(GlobalConfig gc, String resourceUuid, Class clz); - T getResourceConfigValueByResourceType(GlobalConfig gc, String resourceUuid, String type, Class clz); - Map getResourceConfigValues(GlobalConfig gc, List resourceUuids, Class clz); Map getResourceConfigValueByResourceUuids(GlobalConfig gc, List resourceUuids, Class clz); diff --git a/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigFacadeImpl.java b/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigFacadeImpl.java index b210a908e4e..2c5fa2aa959 100644 --- a/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigFacadeImpl.java +++ b/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigFacadeImpl.java @@ -200,16 +200,6 @@ public T getResourceConfigValue(GlobalConfig gc, String resourceUuid, Class< return rc.getResourceConfigValue(resourceUuid, clz); } - @Override - public T getResourceConfigValueByResourceType(GlobalConfig gc, String resourceUuid, String resourceType, Class clz) { - ResourceConfig rc = resourceConfigs.get(gc.getIdentity()); - if (rc == null) { - logger.debug(String.format("resource[uuid:%s] is not bound to global config[category:%s, name:%s]", resourceUuid, gc.getCategory(), gc.getName())); - return null; - } - return rc.getResourceConfigValueByResourceType(resourceUuid, resourceType, clz); - } - @Override public Map getResourceConfigValues(GlobalConfig gc, List resourceUuids, Class clz) { ResourceConfig rc = resourceConfigs.get(gc.getIdentity()); diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmSetVendorCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmSetVendorCase.groovy index 4c1dcb583ea..a909c7bdae4 100644 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmSetVendorCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmSetVendorCase.groovy @@ -9,13 +9,16 @@ import org.zstack.kvm.KVMSystemTags import org.zstack.network.securitygroup.SecurityGroupConstant import org.zstack.network.service.virtualrouter.VirtualRouterConstant import org.zstack.resourceconfig.ResourceConfigFacade +import org.zstack.sdk.GlobalConfigInventory import org.zstack.sdk.VmInstanceInventory import org.zstack.test.integration.kvm.KvmTest import org.zstack.testlib.EnvSpec +import org.zstack.testlib.HttpError import org.zstack.testlib.SubCase import org.zstack.utils.data.SizeUnit import org.zstack.utils.gson.JSONObjectUtil +import static org.zstack.kvm.KVMConstant.KVM_HOST_FACT_PATH import static org.zstack.utils.CollectionDSL.e import static org.zstack.utils.CollectionDSL.map @@ -23,7 +26,7 @@ class VmSetVendorCase extends SubCase { EnvSpec env VmInstanceInventory vm ResourceConfigFacade rcf - def cpuModelName = "hygon" + def hygonCpuModelName = "hygon" @Override void clean() { @@ -87,7 +90,7 @@ class VmSetVendorCase extends SubCase { username = "root" password = "password" systemTags = [ - KVMSystemTags.CPU_MODEL_NAME.instantiateTag(map(e(KVMSystemTags.CPU_MODEL_NAME_TOKEN, cpuModelName))) + KVMSystemTags.CPU_MODEL_NAME.instantiateTag(map(e(KVMSystemTags.CPU_MODEL_NAME_TOKEN, hygonCpuModelName))) ] } @@ -160,6 +163,12 @@ class VmSetVendorCase extends SubCase { @Override void test() { + env.afterSimulator(KVM_HOST_FACT_PATH) { KVMAgentCommands.HostFactResponse rsp -> + rsp.cpuModelName = hygonCpuModelName + rsp.hostCpuModelName = hygonCpuModelName + return rsp + } + env.create { rcf = bean(ResourceConfigFacade.class) vm = env.inventoryByName("vm") as VmInstanceInventory @@ -173,6 +182,18 @@ class VmSetVendorCase extends SubCase { def l3 = env.inventoryByName("l3") def instance = env.inventoryByName("instanceOffering") + GlobalConfigInventory originCpuModel = queryGlobalConfig { + conditions = ["category=${VmGlobalConfig.CATEGORY}", "name=${VmGlobalConfig.VM_CPUID_VENDOR.name}"] + }[0] as GlobalConfigInventory + + assert originCpuModel != null + + env.afterSimulator(KVMConstant.KVM_START_VM_PATH) { KVMAgentCommands.StartVmResponse rsp, HttpEntity e -> + def cmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.StartVmCmd.class) + assert cmd.vmCpuVendorId == "AuthenticAMD" + return rsp + } + def vm1 = createVmInstance { name = "vm1" imageUuid = image.uuid @@ -180,7 +201,27 @@ class VmSetVendorCase extends SubCase { instanceOfferingUuid = instance.uuid } - assert rcf.getResourceConfigValue(VmGlobalConfig.VM_CPUID_VENDOR, vm1.uuid, String.class) == "AuthenticAMD" + updateGlobalConfig { + category = VmGlobalConfig.CATEGORY + name = VmGlobalConfig.VM_CPUID_VENDOR.name + value = "None" + } + + env.afterSimulator(KVMConstant.KVM_START_VM_PATH) { KVMAgentCommands.StartVmResponse rsp, HttpEntity e -> + def cmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.StartVmCmd.class) + assert cmd.vmCpuVendorId == "None" + return rsp + } + + rebootVmInstance { + uuid = vm1.uuid + } + + updateGlobalConfig { + category = VmGlobalConfig.CATEGORY + name = VmGlobalConfig.VM_CPUID_VENDOR.name + value = "AuthenticAMD" + } updateResourceConfig { name = VmGlobalConfig.VM_CPUID_VENDOR.name @@ -193,7 +234,11 @@ class VmSetVendorCase extends SubCase { uuid = vm1.uuid } - assert rcf.getResourceConfigValue(VmGlobalConfig.VM_CPUID_VENDOR, vm1.uuid, String.class) == "None" + updateGlobalConfig { + name = VmGlobalConfig.VM_CPUID_VENDOR.name + category = VmGlobalConfig.CATEGORY + value = originCpuModel.value + } destroyVmInstance { uuid = vm1.uuid diff --git a/test/src/test/resources/springConfigXml/Kvm.xml b/test/src/test/resources/springConfigXml/Kvm.xml index 81e6039b85d..b5c509ebad7 100755 --- a/test/src/test/resources/springConfigXml/Kvm.xml +++ b/test/src/test/resources/springConfigXml/Kvm.xml @@ -242,6 +242,13 @@ + + + + + + + From de018f60a3bfdef428b957e6415e048a49706ee3 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Fri, 31 Oct 2025 17:27:02 +0800 Subject: [PATCH 581/737] [conf]: Update schema for new model fields - Update sdk DBImpact Resolves: ZSTAC-77238 Change-Id: I737a6e65636161766a6274666c6f636f6174716b --- conf/db/upgrade/V5.4.2__schema.sql | 10 +++- .../java/org/zstack/sdk/ModelInventory.java | 56 +++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.4.2__schema.sql b/conf/db/upgrade/V5.4.2__schema.sql index 1950c7b6340..47a951f5524 100644 --- a/conf/db/upgrade/V5.4.2__schema.sql +++ b/conf/db/upgrade/V5.4.2__schema.sql @@ -1,2 +1,10 @@ ALTER TABLE `zstack`.`MdevDeviceSpecVO` modify column name varchar(128) NOT NULL; -ALTER TABLE `zstack`.`MdevDeviceVO` modify column name varchar(128) NOT NULL; \ No newline at end of file +ALTER TABLE `zstack`.`MdevDeviceVO` modify column name varchar(128) NOT NULL; + +CALL ADD_COLUMN('ModelVO', 'versionSemver', 'varchar(255)', 1, 'NULL'); +CALL ADD_COLUMN('ModelVO', 'isLatestVersion', 'tinyint(1)', 1, '0'); +CALL ADD_COLUMN('ModelVO', 'artifactChecksum', 'varchar(255)', 1, 'NULL'); +CALL ADD_COLUMN('ModelVO', 'artifactSizeBytes', 'bigint', 1, '0'); +CALL ADD_COLUMN('ModelVO', 'architectureType', 'varchar(255)', 1, 'NULL'); +CALL ADD_COLUMN('ModelVO', 'frameworkVersion', 'varchar(255)', 1, 'NULL'); +CALL ADD_COLUMN('ModelVO', 'requiredAccelerator', 'varchar(255)', 1, 'NULL'); diff --git a/sdk/src/main/java/org/zstack/sdk/ModelInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java index f6235db4af1..a2ff03462f9 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java @@ -116,6 +116,62 @@ public java.lang.Long getMinGpuMemory() { return this.minGpuMemory; } + public java.lang.String versionSemver; + public void setVersionSemver(java.lang.String versionSemver) { + this.versionSemver = versionSemver; + } + public java.lang.String getVersionSemver() { + return this.versionSemver; + } + + public java.lang.Boolean isLatestVersion; + public void setIsLatestVersion(java.lang.Boolean isLatestVersion) { + this.isLatestVersion = isLatestVersion; + } + public java.lang.Boolean getIsLatestVersion() { + return this.isLatestVersion; + } + + public java.lang.String artifactChecksum; + public void setArtifactChecksum(java.lang.String artifactChecksum) { + this.artifactChecksum = artifactChecksum; + } + public java.lang.String getArtifactChecksum() { + return this.artifactChecksum; + } + + public java.lang.Long artifactSizeBytes; + public void setArtifactSizeBytes(java.lang.Long artifactSizeBytes) { + this.artifactSizeBytes = artifactSizeBytes; + } + public java.lang.Long getArtifactSizeBytes() { + return this.artifactSizeBytes; + } + + public java.lang.String architectureType; + public void setArchitectureType(java.lang.String architectureType) { + this.architectureType = architectureType; + } + public java.lang.String getArchitectureType() { + return this.architectureType; + } + + public java.lang.String frameworkVersion; + public void setFrameworkVersion(java.lang.String frameworkVersion) { + this.frameworkVersion = frameworkVersion; + } + public java.lang.String getFrameworkVersion() { + return this.frameworkVersion; + } + + public java.lang.String requiredAccelerator; + public void setRequiredAccelerator(java.lang.String requiredAccelerator) { + this.requiredAccelerator = requiredAccelerator; + } + public java.lang.String getRequiredAccelerator() { + return this.requiredAccelerator; + } + public java.util.List modelServiceRefs; public void setModelServiceRefs(java.util.List modelServiceRefs) { this.modelServiceRefs = modelServiceRefs; From 7b7dff420a38c0387a573b17b76911e6fcb562ee Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Fri, 31 Oct 2025 17:27:36 +0800 Subject: [PATCH 582/737] [conf]: Update schema for model/service's new fields DBImpact Resolves: ZSTAC-77238 Change-Id: I63766176647164627161756a7069756b74746e77 --- conf/db/upgrade/V5.4.2__schema.sql | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/conf/db/upgrade/V5.4.2__schema.sql b/conf/db/upgrade/V5.4.2__schema.sql index 47a951f5524..db4387a791c 100644 --- a/conf/db/upgrade/V5.4.2__schema.sql +++ b/conf/db/upgrade/V5.4.2__schema.sql @@ -1,10 +1,19 @@ ALTER TABLE `zstack`.`MdevDeviceSpecVO` modify column name varchar(128) NOT NULL; ALTER TABLE `zstack`.`MdevDeviceVO` modify column name varchar(128) NOT NULL; -CALL ADD_COLUMN('ModelVO', 'versionSemver', 'varchar(255)', 1, 'NULL'); +CALL ADD_COLUMN('ModelVO', 'framework', 'varchar(255)', 1, NULL); +CALL ADD_COLUMN('ModelVO', 'versionSemver', 'varchar(255)', 1, NULL); CALL ADD_COLUMN('ModelVO', 'isLatestVersion', 'tinyint(1)', 1, '0'); -CALL ADD_COLUMN('ModelVO', 'artifactChecksum', 'varchar(255)', 1, 'NULL'); +CALL ADD_COLUMN('ModelVO', 'artifactChecksum', 'varchar(255)', 1, NULL); CALL ADD_COLUMN('ModelVO', 'artifactSizeBytes', 'bigint', 1, '0'); -CALL ADD_COLUMN('ModelVO', 'architectureType', 'varchar(255)', 1, 'NULL'); -CALL ADD_COLUMN('ModelVO', 'frameworkVersion', 'varchar(255)', 1, 'NULL'); -CALL ADD_COLUMN('ModelVO', 'requiredAccelerator', 'varchar(255)', 1, 'NULL'); +CALL ADD_COLUMN('ModelVO', 'architectureType', 'varchar(255)', 1, NULL); +CALL ADD_COLUMN('ModelVO', 'frameworkVersion', 'varchar(255)', 1, NULL); +CALL ADD_COLUMN('ModelVO', 'requiredAccelerator', 'varchar(255)', 1, NULL); + +CALL RENAME_TABLE('ModelServiceImageVO', 'ModelServiceTemplateVO'); + +CALL ADD_COLUMN('ModelServiceTemplateVO', 'pythonVersionSemver', 'varchar(255)', 1, NULL); +CALL ADD_COLUMN('ModelServiceTemplateVO', 'cudaVersion', 'varchar(255)', 1, NULL); +CALL ADD_COLUMN('ModelServiceTemplateVO', 'cannVersion', 'varchar(255)', 1, NULL); +CALL ADD_COLUMN('ModelServiceTemplateVO', 'frameworkVersionSemver', 'varchar(255)', 1, NULL); +CALL ADD_COLUMN('ModelServiceTemplateVO', 'gpuVendor', 'varchar(255)', 1, NULL); From 7c6872417638e9c252daf937d13252db655f961b Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 16 Oct 2025 18:14:14 +0800 Subject: [PATCH 583/737] [sdk]: Update sdk to remove unused fields Resolves: ZSTAC-77238 Change-Id: I6a66656a72787a61716d6c777a626c66716a6c70 --- sdk/src/main/java/SourceClassMap.java | 4 ++-- .../java/org/zstack/sdk/AddModelServiceAction.java | 6 ------ .../java/org/zstack/sdk/ArchitectureImageMapping.java | 8 ++++++++ ...ventory.java => ModelServiceTemplateInventory.java} | 10 +++++++++- .../java/org/zstack/sdk/UpdateModelServiceAction.java | 6 ------ 5 files changed, 19 insertions(+), 15 deletions(-) rename sdk/src/main/java/org/zstack/sdk/{ModelServiceImageInventory.java => ModelServiceTemplateInventory.java} (86%) diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index ac6f862be13..7a7e0c427ca 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -18,11 +18,11 @@ public class SourceClassMap { put("org.zstack.ai.entity.ModelEvaluationTaskInventory", "org.zstack.sdk.ModelEvaluationTaskInventory"); put("org.zstack.ai.entity.ModelInventory", "org.zstack.sdk.ModelInventory"); put("org.zstack.ai.entity.ModelServiceGroupDatasetRefInventory", "org.zstack.sdk.ModelServiceGroupDatasetRefInventory"); - put("org.zstack.ai.entity.ModelServiceImageInventory", "org.zstack.sdk.ModelServiceImageInventory"); put("org.zstack.ai.entity.ModelServiceInstanceGroupInventory", "org.zstack.sdk.ModelServiceInstanceGroupInventory"); put("org.zstack.ai.entity.ModelServiceInstanceInventory", "org.zstack.sdk.ModelServiceInstanceInventory"); put("org.zstack.ai.entity.ModelServiceInventory", "org.zstack.sdk.ModelServiceInventory"); put("org.zstack.ai.entity.ModelServiceRefInventory", "org.zstack.sdk.ModelServiceRefInventory"); + put("org.zstack.ai.entity.ModelServiceTemplateInventory", "org.zstack.sdk.ModelServiceTemplateInventory"); put("org.zstack.ai.entity.TrainedModelRecordInventory", "org.zstack.sdk.TrainedModelRecordInventory"); put("org.zstack.ai.message.ArchitectureImageMapping", "org.zstack.sdk.ArchitectureImageMapping"); put("org.zstack.ai.message.MaaSUsage", "org.zstack.sdk.MaaSUsage"); @@ -1208,11 +1208,11 @@ public class SourceClassMap { put("org.zstack.sdk.ModelInventory", "org.zstack.ai.entity.ModelInventory"); put("org.zstack.sdk.ModelService", "org.zstack.ai.message.ModelService"); put("org.zstack.sdk.ModelServiceGroupDatasetRefInventory", "org.zstack.ai.entity.ModelServiceGroupDatasetRefInventory"); - put("org.zstack.sdk.ModelServiceImageInventory", "org.zstack.ai.entity.ModelServiceImageInventory"); put("org.zstack.sdk.ModelServiceInstanceGroupInventory", "org.zstack.ai.entity.ModelServiceInstanceGroupInventory"); put("org.zstack.sdk.ModelServiceInstanceInventory", "org.zstack.ai.entity.ModelServiceInstanceInventory"); put("org.zstack.sdk.ModelServiceInventory", "org.zstack.ai.entity.ModelServiceInventory"); put("org.zstack.sdk.ModelServiceRefInventory", "org.zstack.ai.entity.ModelServiceRefInventory"); + put("org.zstack.sdk.ModelServiceTemplateInventory", "org.zstack.ai.entity.ModelServiceTemplateInventory"); put("org.zstack.sdk.MonInfo", "org.zstack.storage.ceph.primary.KVMCephVolumeTO$MonInfo"); put("org.zstack.sdk.MonInfo", "org.zstack.storage.ceph.primary.KvmCephCdRomTO$MonInfo"); put("org.zstack.sdk.MonInfo", "org.zstack.storage.ceph.primary.KvmCephIsoTO$MonInfo"); diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index e9466a61625..122a9792e0e 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -76,12 +76,6 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List modelUuids; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.util.List gpuVendors; - - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.util.List cpuArchitectures; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List architectureImages; diff --git a/sdk/src/main/java/org/zstack/sdk/ArchitectureImageMapping.java b/sdk/src/main/java/org/zstack/sdk/ArchitectureImageMapping.java index bcce51854c0..df4d4d44042 100644 --- a/sdk/src/main/java/org/zstack/sdk/ArchitectureImageMapping.java +++ b/sdk/src/main/java/org/zstack/sdk/ArchitectureImageMapping.java @@ -12,6 +12,14 @@ public java.lang.String getCpuArchitecture() { return this.cpuArchitecture; } + public java.lang.String gpuVendor; + public void setGpuVendor(java.lang.String gpuVendor) { + this.gpuVendor = gpuVendor; + } + public java.lang.String getGpuVendor() { + return this.gpuVendor; + } + public java.lang.String vmImageUuid; public void setVmImageUuid(java.lang.String vmImageUuid) { this.vmImageUuid = vmImageUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceImageInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceTemplateInventory.java similarity index 86% rename from sdk/src/main/java/org/zstack/sdk/ModelServiceImageInventory.java rename to sdk/src/main/java/org/zstack/sdk/ModelServiceTemplateInventory.java index 49445cca243..31186ad627f 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceImageInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceTemplateInventory.java @@ -2,7 +2,7 @@ -public class ModelServiceImageInventory { +public class ModelServiceTemplateInventory { public java.lang.String uuid; public void setUuid(java.lang.String uuid) { @@ -44,6 +44,14 @@ public java.lang.String getDockerImage() { return this.dockerImage; } + public java.lang.String gpuVendor; + public void setGpuVendor(java.lang.String gpuVendor) { + this.gpuVendor = gpuVendor; + } + public java.lang.String getGpuVendor() { + return this.gpuVendor; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java index ee73e642cb9..0d689b99825 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java @@ -61,12 +61,6 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String framework; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.util.List cpuArchitectures; - - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.util.List gpuVendors; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List architectureImages; From e25a85c7556ea0a6d909aa177ae6115eecb7f62f Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 21 Oct 2025 10:47:42 +0800 Subject: [PATCH 584/737] [sdk]: Update sdk and api helper Resolves: ZSTAC-77238 Change-Id: I6d75656465617965646461776f6675746866707a --- conf/db/upgrade/V5.4.2__schema.sql | 1 + ...chModelServiceTemplateWithModelAction.java | 104 ++++++++++++++++++ ...chModelServiceTemplateWithModelResult.java | 14 +++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ 4 files changed, 146 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelResult.java diff --git a/conf/db/upgrade/V5.4.2__schema.sql b/conf/db/upgrade/V5.4.2__schema.sql index db4387a791c..ff4217aa0c2 100644 --- a/conf/db/upgrade/V5.4.2__schema.sql +++ b/conf/db/upgrade/V5.4.2__schema.sql @@ -9,6 +9,7 @@ CALL ADD_COLUMN('ModelVO', 'artifactSizeBytes', 'bigint', 1, '0'); CALL ADD_COLUMN('ModelVO', 'architectureType', 'varchar(255)', 1, NULL); CALL ADD_COLUMN('ModelVO', 'frameworkVersion', 'varchar(255)', 1, NULL); CALL ADD_COLUMN('ModelVO', 'requiredAccelerator', 'varchar(255)', 1, NULL); +CALL ADD_COLUMN('ModelVO', 'quantizationType', 'varchar(255)', 1, NULL); CALL RENAME_TABLE('ModelServiceImageVO', 'ModelServiceTemplateVO'); diff --git a/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java b/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java new file mode 100644 index 00000000000..00c849e158c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class MatchModelServiceTemplateWithModelAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.MatchModelServiceTemplateWithModelResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelUuids; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelServiceUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.MatchModelServiceTemplateWithModelResult value = res.getResult(org.zstack.sdk.MatchModelServiceTemplateWithModelResult.class); + ret.value = value == null ? new org.zstack.sdk.MatchModelServiceTemplateWithModelResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/ai/model-services/templates"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "param"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelResult.java b/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelResult.java new file mode 100644 index 00000000000..f63996f0f1f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class MatchModelServiceTemplateWithModelResult { + public java.util.Map result; + public void setResult(java.util.Map result) { + this.result = result; + } + public java.util.Map getResult() { + return this.result; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index f1217280c22..99871088e25 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -27098,6 +27098,33 @@ abstract class ApiHelper { } + def matchModelServiceTemplateWithModel(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.MatchModelServiceTemplateWithModelAction.class) Closure c) { + def a = new org.zstack.sdk.MatchModelServiceTemplateWithModelAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def mergeDataOnBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.MergeDataOnBackupStorageAction.class) Closure c) { def a = new org.zstack.sdk.MergeDataOnBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 4fcb1614aa0f479058d8f2ec24d5946aa5c154ac Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 21 Oct 2025 16:03:33 +0800 Subject: [PATCH 585/737] [sdk]: Update sdk Resolves: ZSTAC-77238 Change-Id: I6b657964756664796d6e727362796f6376657468 --- sdk/src/main/java/SourceClassMap.java | 4 ++ ...chModelServiceTemplateWithModelAction.java | 66 +++++++++++++++++++ .../sdk/ModelServiceMatchEntryName.java | 10 +++ .../zstack/sdk/ModelServiceMatchStatus.java | 7 ++ 4 files changed, 87 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntryName.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ModelServiceMatchStatus.java diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 7a7e0c427ca..10201e3e41c 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -31,6 +31,8 @@ public class SourceClassMap { put("org.zstack.ai.message.ModelCenterServiceInventory$ServiceStatus", "org.zstack.sdk.ServiceStatus"); put("org.zstack.ai.message.ModelCenterServiceInventory$ZdfsService", "org.zstack.sdk.ZdfsService"); put("org.zstack.ai.message.ModelService", "org.zstack.sdk.ModelService"); + put("org.zstack.ai.message.ModelServiceMatchEntryName", "org.zstack.sdk.ModelServiceMatchEntryName"); + put("org.zstack.ai.message.ModelServiceMatchStatus", "org.zstack.sdk.ModelServiceMatchStatus"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessGroupInventory", "org.zstack.sdk.AliyunNasAccessGroupInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessRuleInventory", "org.zstack.sdk.AliyunNasAccessRuleInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasFileSystemInventory", "org.zstack.sdk.AliyunNasFileSystemInventory"); @@ -1211,6 +1213,8 @@ public class SourceClassMap { put("org.zstack.sdk.ModelServiceInstanceGroupInventory", "org.zstack.ai.entity.ModelServiceInstanceGroupInventory"); put("org.zstack.sdk.ModelServiceInstanceInventory", "org.zstack.ai.entity.ModelServiceInstanceInventory"); put("org.zstack.sdk.ModelServiceInventory", "org.zstack.ai.entity.ModelServiceInventory"); + put("org.zstack.sdk.ModelServiceMatchEntryName", "org.zstack.ai.message.ModelServiceMatchEntryName"); + put("org.zstack.sdk.ModelServiceMatchStatus", "org.zstack.ai.message.ModelServiceMatchStatus"); put("org.zstack.sdk.ModelServiceRefInventory", "org.zstack.ai.entity.ModelServiceRefInventory"); put("org.zstack.sdk.ModelServiceTemplateInventory", "org.zstack.ai.entity.ModelServiceTemplateInventory"); put("org.zstack.sdk.MonInfo", "org.zstack.storage.ceph.primary.KVMCephVolumeTO$MonInfo"); diff --git a/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java b/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java index 00c849e158c..ea3b6cdfb00 100644 --- a/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java @@ -31,6 +31,72 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List modelServiceUuids; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmImageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String primaryStorageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List datasetUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelServiceGroupUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String dockerImage; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer cpuNum; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map environmentVariables; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map startupParameters; + + @Param(required = true, validValues = {"VirtualMachine","Container"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clusterUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long memorySize; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List l3NetworkUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer serviceBootUptime; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String rootDiskOfferingUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long rootDiskSize; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntryName.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntryName.java new file mode 100644 index 00000000000..870d1463a03 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntryName.java @@ -0,0 +1,10 @@ +package org.zstack.sdk; + +public enum ModelServiceMatchEntryName { + TemplateExistence, + FrameworkCompatibility, + AcceleratorCompatibility, + FrameworkVersionCompatibility, + ArchitectureCompatibility, + QuantizationCompatibility, +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchStatus.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchStatus.java new file mode 100644 index 00000000000..46c3426ae8b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchStatus.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + +public enum ModelServiceMatchStatus { + Passed, + Failed, + Skipped, +} From 2c0c8885a0cf88853b2fda903d38dd2ce484beef Mon Sep 17 00:00:00 2001 From: "haoyu.ding" Date: Wed, 22 Oct 2025 16:04:30 +0800 Subject: [PATCH 586/737] [conf]: Use KubernetesServiceVO to store container service information DBImpact Resolves: ZSTAC-77444 Change-Id: I76656f636c78646d677174756c776a7677637a63 --- conf/db/upgrade/V5.4.2__schema.sql | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/conf/db/upgrade/V5.4.2__schema.sql b/conf/db/upgrade/V5.4.2__schema.sql index ff4217aa0c2..94f80870910 100644 --- a/conf/db/upgrade/V5.4.2__schema.sql +++ b/conf/db/upgrade/V5.4.2__schema.sql @@ -18,3 +18,17 @@ CALL ADD_COLUMN('ModelServiceTemplateVO', 'cudaVersion', 'varchar(255)', 1, NULL CALL ADD_COLUMN('ModelServiceTemplateVO', 'cannVersion', 'varchar(255)', 1, NULL); CALL ADD_COLUMN('ModelServiceTemplateVO', 'frameworkVersionSemver', 'varchar(255)', 1, NULL); CALL ADD_COLUMN('ModelServiceTemplateVO', 'gpuVendor', 'varchar(255)', 1, NULL); + +CALL ADD_COLUMN('PodVO', 'namespace', 'varchar(64)', 1, NULL); + +CREATE TABLE `zstack`.`KubernetesServiceVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(64) NOT NULL, + `description` varchar(255) DEFAULT NULL, + `namespace` varchar(64) NOT NULL, + `type` varchar(20) NOT NULL, + `clusterIp` varchar(64) DEFAULT NULL, + `externalIp` varchar(64) DEFAULT NULL, + `ports` text, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; From 5b64baebd77324e77b59cb3ac2827c3e9e74f8bc Mon Sep 17 00:00:00 2001 From: "haoyu.ding" Date: Thu, 23 Oct 2025 16:30:13 +0800 Subject: [PATCH 587/737] [conf]: add Inventory for ZQLQuery DBImpact Resolves: ZSTAC-77444 Change-Id: I6c6a6267767a72747a64756877696366746c6b6a --- conf/db/upgrade/V5.4.2__schema.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/db/upgrade/V5.4.2__schema.sql b/conf/db/upgrade/V5.4.2__schema.sql index 94f80870910..5f23c862042 100644 --- a/conf/db/upgrade/V5.4.2__schema.sql +++ b/conf/db/upgrade/V5.4.2__schema.sql @@ -30,5 +30,6 @@ CREATE TABLE `zstack`.`KubernetesServiceVO` ( `clusterIp` varchar(64) DEFAULT NULL, `externalIp` varchar(64) DEFAULT NULL, `ports` text, + `endpointUuid` varchar(32) NOT NULL, PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; From 6b5cf25d7268833f91495d8d7cfa9f84c276b0de Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Thu, 23 Oct 2025 14:43:21 +0800 Subject: [PATCH 588/737] [conf]: Add new column to PodVO DBImpact Resolves: ZSTAC-79033 Change-Id: I746d787a6a6d6e66787163636d6f697a68797979 --- conf/db/upgrade/V5.4.2__schema.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/db/upgrade/V5.4.2__schema.sql b/conf/db/upgrade/V5.4.2__schema.sql index 5f23c862042..c729b1fd936 100644 --- a/conf/db/upgrade/V5.4.2__schema.sql +++ b/conf/db/upgrade/V5.4.2__schema.sql @@ -33,3 +33,5 @@ CREATE TABLE `zstack`.`KubernetesServiceVO` ( `endpointUuid` varchar(32) NOT NULL, PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CALL ADD_COLUMN('PodVO', 'clusterId', 'INT', 1, NULL); From 85dca5754464b140dd769c2fd1398eadcd937d0b Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 22 Oct 2025 13:13:03 +0800 Subject: [PATCH 589/737] [sdk]: Update sdk Resolves: ZSTAC-79033 Change-Id: I63736a6d70796473646d6967616b67746f78676b --- .../sdk/ModelServiceInstanceInventory.java | 16 ---------------- .../main/java/org/zstack/sdk/PodInventory.java | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java index d4e8be79fb9..13cf707f507 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java @@ -100,22 +100,6 @@ public java.lang.Integer getNodeRank() { return this.nodeRank; } - public java.lang.Long clusterId; - public void setClusterId(java.lang.Long clusterId) { - this.clusterId = clusterId; - } - public java.lang.Long getClusterId() { - return this.clusterId; - } - - public java.lang.String namespace; - public void setNamespace(java.lang.String namespace) { - this.namespace = namespace; - } - public java.lang.String getNamespace() { - return this.namespace; - } - public java.lang.String accountUuid; public void setAccountUuid(java.lang.String accountUuid) { this.accountUuid = accountUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/PodInventory.java b/sdk/src/main/java/org/zstack/sdk/PodInventory.java index 27e9412d2ef..1e7db6ae39f 100644 --- a/sdk/src/main/java/org/zstack/sdk/PodInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/PodInventory.java @@ -12,4 +12,20 @@ public java.lang.String getStatus() { return this.status; } + public java.lang.String namespace; + public void setNamespace(java.lang.String namespace) { + this.namespace = namespace; + } + public java.lang.String getNamespace() { + return this.namespace; + } + + public java.lang.Long clusterId; + public void setClusterId(java.lang.Long clusterId) { + this.clusterId = clusterId; + } + public java.lang.Long getClusterId() { + return this.clusterId; + } + } From 00249a231237b06ebd7bc63bf61d5906366813cc Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Mon, 27 Oct 2025 18:32:38 +0800 Subject: [PATCH 590/737] [conf]: Clean up AccountResourceRefVO when introduce PodVO This is a fix for commit: b0777eb09941b130df6d755c031f66a374f4b058 and 8d49d7f1745f3474d0aa7e8bf4a389d03203df21 Those commits add new table `PodVO` and need to delete old Native VmInstanceVO/EO records but only `ResourceVO` be cleaned at that time so add a new sql to delete stale AccountResourceRefVO which do not have related uuid in VmInstanceVO DBImpact Resolves: ZSTAC-78957 Change-Id: I62677a6c7274796e6d62616e79636f74796b616b --- conf/db/upgrade/V5.4.2__schema.sql | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/conf/db/upgrade/V5.4.2__schema.sql b/conf/db/upgrade/V5.4.2__schema.sql index c729b1fd936..10a449acf79 100644 --- a/conf/db/upgrade/V5.4.2__schema.sql +++ b/conf/db/upgrade/V5.4.2__schema.sql @@ -35,3 +35,7 @@ CREATE TABLE `zstack`.`KubernetesServiceVO` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CALL ADD_COLUMN('PodVO', 'clusterId', 'INT', 1, NULL); + +DELETE FROM `AccountResourceRefVO` +WHERE `concreteResourceType` = 'org.zstack.header.vm.VmInstanceVO' + AND `resourceUuid` NOT IN (SELECT `uuid` FROM `VmInstanceVO`); From a3d4f6db7a5457c0db364039bae6dba801a8551f Mon Sep 17 00:00:00 2001 From: "haoyu.ding" Date: Wed, 29 Oct 2025 18:46:43 +0800 Subject: [PATCH 591/737] [conf]: Add the createDate field to enable frontend sorting DBImpact Resolves: ZSTAC-77444 Change-Id: I7072656e63776f6d6a7266676b6162776a79656a --- conf/db/upgrade/V5.4.2__schema.sql | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.4.2__schema.sql b/conf/db/upgrade/V5.4.2__schema.sql index 10a449acf79..4b522ee6d92 100644 --- a/conf/db/upgrade/V5.4.2__schema.sql +++ b/conf/db/upgrade/V5.4.2__schema.sql @@ -21,7 +21,7 @@ CALL ADD_COLUMN('ModelServiceTemplateVO', 'gpuVendor', 'varchar(255)', 1, NULL); CALL ADD_COLUMN('PodVO', 'namespace', 'varchar(64)', 1, NULL); -CREATE TABLE `zstack`.`KubernetesServiceVO` ( +CREATE TABLE IF NOT EXISTS `zstack`.`KubernetesServiceVO` ( `uuid` varchar(32) NOT NULL UNIQUE, `name` varchar(64) NOT NULL, `description` varchar(255) DEFAULT NULL, @@ -31,6 +31,8 @@ CREATE TABLE `zstack`.`KubernetesServiceVO` ( `externalIp` varchar(64) DEFAULT NULL, `ports` text, `endpointUuid` varchar(32) NOT NULL, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; From 637c4d734804f6fc82c576ff3e8c18f933c4c49a Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Thu, 30 Oct 2025 14:59:41 +0800 Subject: [PATCH 592/737] [conf]: Update ModelCenterCapacity schema and sdk DBImpact Resolves: ZSTAC-79041 Change-Id: I7a7975707864726c656579686c696c736d786a6e --- conf/db/upgrade/V5.4.2__schema.sql | 2 ++ .../java/org/zstack/sdk/ModelCenterCapacityInventory.java | 8 -------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/conf/db/upgrade/V5.4.2__schema.sql b/conf/db/upgrade/V5.4.2__schema.sql index 4b522ee6d92..4c8b6ac6b2e 100644 --- a/conf/db/upgrade/V5.4.2__schema.sql +++ b/conf/db/upgrade/V5.4.2__schema.sql @@ -41,3 +41,5 @@ CALL ADD_COLUMN('PodVO', 'clusterId', 'INT', 1, NULL); DELETE FROM `AccountResourceRefVO` WHERE `concreteResourceType` = 'org.zstack.header.vm.VmInstanceVO' AND `resourceUuid` NOT IN (SELECT `uuid` FROM `VmInstanceVO`); + +CALL DROP_COLUMN('ModelCenterCapacityVO', 'installationUsedCapacity'); diff --git a/sdk/src/main/java/org/zstack/sdk/ModelCenterCapacityInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelCenterCapacityInventory.java index fe9fe635372..92430b6daca 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelCenterCapacityInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelCenterCapacityInventory.java @@ -52,14 +52,6 @@ public long getModelEvaluationUsedCapacity() { return this.modelEvaluationUsedCapacity; } - public long installationUsedCapacity; - public void setInstallationUsedCapacity(long installationUsedCapacity) { - this.installationUsedCapacity = installationUsedCapacity; - } - public long getInstallationUsedCapacity() { - return this.installationUsedCapacity; - } - public long temporaryUsedCapacity; public void setTemporaryUsedCapacity(long temporaryUsedCapacity) { this.temporaryUsedCapacity = temporaryUsedCapacity; From 394bb6bcde661d88f509a9e051609b9f1b5adc23 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Thu, 30 Oct 2025 19:03:38 +0800 Subject: [PATCH 593/737] [conf]: Add status to NativeClusterVO and update sdk DBImpact Resolves: ZSTAC-79412 Change-Id: I6f6a677875716e756675726c7870767a686e746b --- conf/db/upgrade/V5.4.2__schema.sql | 3 +++ .../main/java/org/zstack/sdk/NativeClusterInventory.java | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/conf/db/upgrade/V5.4.2__schema.sql b/conf/db/upgrade/V5.4.2__schema.sql index 4c8b6ac6b2e..b8c758a2e5b 100644 --- a/conf/db/upgrade/V5.4.2__schema.sql +++ b/conf/db/upgrade/V5.4.2__schema.sql @@ -43,3 +43,6 @@ WHERE `concreteResourceType` = 'org.zstack.header.vm.VmInstanceVO' AND `resourceUuid` NOT IN (SELECT `uuid` FROM `VmInstanceVO`); CALL DROP_COLUMN('ModelCenterCapacityVO', 'installationUsedCapacity'); +CALL ADD_COLUMN('NativeClusterVO', 'status', 'varchar(32)', 1, NULL); + +UPDATE `NativeClusterVO` SET `status` = 'Status_Cluster_Running' WHERE `status` IS NULL; diff --git a/sdk/src/main/java/org/zstack/sdk/NativeClusterInventory.java b/sdk/src/main/java/org/zstack/sdk/NativeClusterInventory.java index 0b4aaa9d1ad..150665bdb35 100644 --- a/sdk/src/main/java/org/zstack/sdk/NativeClusterInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/NativeClusterInventory.java @@ -60,4 +60,12 @@ public java.lang.String getCreateType() { return this.createType; } + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + } From f887febb28a45a2accbbca16b3f660e693e5f8f9 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 3 Nov 2025 11:22:39 +0800 Subject: [PATCH 594/737] [sdk]: Update sdk Resolves: ZSTAC-77238 Change-Id: I656a6b787461726b76736970777a6b796d6c7168 --- sdk/src/main/java/SourceClassMap.java | 2 + ...chModelServiceTemplateWithModelAction.java | 3 ++ .../zstack/sdk/ModelServiceMatchEntry.java | 48 +++++++++++++++++++ .../sdk/ModelServiceMatchEntryName.java | 1 + 4 files changed, 54 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntry.java diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 10201e3e41c..124a03ad442 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -31,6 +31,7 @@ public class SourceClassMap { put("org.zstack.ai.message.ModelCenterServiceInventory$ServiceStatus", "org.zstack.sdk.ServiceStatus"); put("org.zstack.ai.message.ModelCenterServiceInventory$ZdfsService", "org.zstack.sdk.ZdfsService"); put("org.zstack.ai.message.ModelService", "org.zstack.sdk.ModelService"); + put("org.zstack.ai.message.ModelServiceMatchEntry", "org.zstack.sdk.ModelServiceMatchEntry"); put("org.zstack.ai.message.ModelServiceMatchEntryName", "org.zstack.sdk.ModelServiceMatchEntryName"); put("org.zstack.ai.message.ModelServiceMatchStatus", "org.zstack.sdk.ModelServiceMatchStatus"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessGroupInventory", "org.zstack.sdk.AliyunNasAccessGroupInventory"); @@ -1213,6 +1214,7 @@ public class SourceClassMap { put("org.zstack.sdk.ModelServiceInstanceGroupInventory", "org.zstack.ai.entity.ModelServiceInstanceGroupInventory"); put("org.zstack.sdk.ModelServiceInstanceInventory", "org.zstack.ai.entity.ModelServiceInstanceInventory"); put("org.zstack.sdk.ModelServiceInventory", "org.zstack.ai.entity.ModelServiceInventory"); + put("org.zstack.sdk.ModelServiceMatchEntry", "org.zstack.ai.message.ModelServiceMatchEntry"); put("org.zstack.sdk.ModelServiceMatchEntryName", "org.zstack.ai.message.ModelServiceMatchEntryName"); put("org.zstack.sdk.ModelServiceMatchStatus", "org.zstack.ai.message.ModelServiceMatchStatus"); put("org.zstack.sdk.ModelServiceRefInventory", "org.zstack.ai.entity.ModelServiceRefInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java b/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java index ea3b6cdfb00..7d6d97cb2c8 100644 --- a/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java @@ -31,6 +31,9 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List modelServiceUuids; + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer instanceNumber; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntry.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntry.java new file mode 100644 index 00000000000..98f2675fc50 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntry.java @@ -0,0 +1,48 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceMatchStatus; +import org.zstack.sdk.ModelServiceMatchEntryName; + +public class ModelServiceMatchEntry { + + public ModelServiceMatchStatus status; + public void setStatus(ModelServiceMatchStatus status) { + this.status = status; + } + public ModelServiceMatchStatus getStatus() { + return this.status; + } + + public ModelServiceMatchEntryName name; + public void setName(ModelServiceMatchEntryName name) { + this.name = name; + } + public ModelServiceMatchEntryName getName() { + return this.name; + } + + public java.lang.String fieldName; + public void setFieldName(java.lang.String fieldName) { + this.fieldName = fieldName; + } + public java.lang.String getFieldName() { + return this.fieldName; + } + + public java.lang.String fieldValue; + public void setFieldValue(java.lang.String fieldValue) { + this.fieldValue = fieldValue; + } + public java.lang.String getFieldValue() { + return this.fieldValue; + } + + public java.lang.String comments; + public void setComments(java.lang.String comments) { + this.comments = comments; + } + public java.lang.String getComments() { + return this.comments; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntryName.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntryName.java index 870d1463a03..1344fb4d662 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntryName.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntryName.java @@ -7,4 +7,5 @@ public enum ModelServiceMatchEntryName { FrameworkVersionCompatibility, ArchitectureCompatibility, QuantizationCompatibility, + ScalingCapability, } From f192d12971292d02137e4dc2be93c5ed7d394064 Mon Sep 17 00:00:00 2001 From: "haoyu.ding" Date: Mon, 3 Nov 2025 17:22:07 +0800 Subject: [PATCH 595/737] [conf]: Add clusterId field for frontend query DBImpact Resolves: ZSTAC-77444 Change-Id: I74697077686a6f7363646a7665727363766a786d --- conf/db/upgrade/V5.4.2__schema.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/db/upgrade/V5.4.2__schema.sql b/conf/db/upgrade/V5.4.2__schema.sql index b8c758a2e5b..cefe4a74e7d 100644 --- a/conf/db/upgrade/V5.4.2__schema.sql +++ b/conf/db/upgrade/V5.4.2__schema.sql @@ -31,6 +31,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`KubernetesServiceVO` ( `externalIp` varchar(64) DEFAULT NULL, `ports` text, `endpointUuid` varchar(32) NOT NULL, + `clusterId` INT DEFAULT NULL, `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`uuid`) From 150a6909fd6e7ea4633884af12d07fce48d09b8b Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 3 Nov 2025 17:36:57 +0800 Subject: [PATCH 596/737] [sdk]: Update sdk and add ModelServiceGpuSpecRefVO DBImpact Resolves: ZSTAC-77238 Change-Id: I78786e68686a7170706264716b6f687678626869 --- conf/db/upgrade/V5.4.2__schema.sql | 11 +++++++++++ .../java/org/zstack/sdk/AddModelServiceAction.java | 3 +++ .../java/org/zstack/sdk/ArchitectureImageMapping.java | 8 -------- .../java/org/zstack/sdk/CloneModelServiceAction.java | 6 +++--- .../java/org/zstack/sdk/ModelServiceInventory.java | 10 +++++----- .../org/zstack/sdk/ModelServiceTemplateInventory.java | 8 -------- .../java/org/zstack/sdk/UpdateModelServiceAction.java | 3 +++ 7 files changed, 25 insertions(+), 24 deletions(-) diff --git a/conf/db/upgrade/V5.4.2__schema.sql b/conf/db/upgrade/V5.4.2__schema.sql index b8c758a2e5b..15bdbc49322 100644 --- a/conf/db/upgrade/V5.4.2__schema.sql +++ b/conf/db/upgrade/V5.4.2__schema.sql @@ -46,3 +46,14 @@ CALL DROP_COLUMN('ModelCenterCapacityVO', 'installationUsedCapacity'); CALL ADD_COLUMN('NativeClusterVO', 'status', 'varchar(32)', 1, NULL); UPDATE `NativeClusterVO` SET `status` = 'Status_Cluster_Running' WHERE `status` IS NULL; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceGpuVendorSpecRefVO` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `refUuid` bigint UNSIGNED NOT NULL, + `specUuid` varchar(32) NOT NULL, + CONSTRAINT `pkModelServiceGpuVendorSpecRef` PRIMARY KEY (`id`), + CONSTRAINT `ukModelServiceGpuVendorSpecRefRefSpec` UNIQUE (`refUuid`, `specUuid`), + CONSTRAINT `fkModelServiceGpuVendorSpecRefRefUuid` FOREIGN KEY (`refUuid`) + REFERENCES `ModelServiceGpuVendorVO`(`id`) + ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index 122a9792e0e..01d2193ea65 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -82,6 +82,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Boolean supportDistributed; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map vendorToSpecUuidsMap; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/ArchitectureImageMapping.java b/sdk/src/main/java/org/zstack/sdk/ArchitectureImageMapping.java index df4d4d44042..bcce51854c0 100644 --- a/sdk/src/main/java/org/zstack/sdk/ArchitectureImageMapping.java +++ b/sdk/src/main/java/org/zstack/sdk/ArchitectureImageMapping.java @@ -12,14 +12,6 @@ public java.lang.String getCpuArchitecture() { return this.cpuArchitecture; } - public java.lang.String gpuVendor; - public void setGpuVendor(java.lang.String gpuVendor) { - this.gpuVendor = gpuVendor; - } - public java.lang.String getGpuVendor() { - return this.gpuVendor; - } - public java.lang.String vmImageUuid; public void setVmImageUuid(java.lang.String vmImageUuid) { this.vmImageUuid = vmImageUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java index 01c6c28abe6..37bad5494f9 100644 --- a/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java @@ -79,15 +79,15 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List cpuArchitectures; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public java.util.List gpuVendors; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List architectureImages; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Boolean supportDistributed; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map vendorToSpecUuidsMap; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java index 33beaf1a5f4..a588313c065 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java @@ -164,12 +164,12 @@ public java.util.List getCpuArchitectures() { return this.cpuArchitectures; } - public java.util.List gpuVendors; - public void setGpuVendors(java.util.List gpuVendors) { - this.gpuVendors = gpuVendors; + public java.util.Map vendorToSpecUuidsMap; + public void setVendorToSpecUuidsMap(java.util.Map vendorToSpecUuidsMap) { + this.vendorToSpecUuidsMap = vendorToSpecUuidsMap; } - public java.util.List getGpuVendors() { - return this.gpuVendors; + public java.util.Map getVendorToSpecUuidsMap() { + return this.vendorToSpecUuidsMap; } public java.util.List modelServiceRefs; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceTemplateInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceTemplateInventory.java index 31186ad627f..04278cd76d4 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceTemplateInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceTemplateInventory.java @@ -44,14 +44,6 @@ public java.lang.String getDockerImage() { return this.dockerImage; } - public java.lang.String gpuVendor; - public void setGpuVendor(java.lang.String gpuVendor) { - this.gpuVendor = gpuVendor; - } - public java.lang.String getGpuVendor() { - return this.gpuVendor; - } - public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java index 0d689b99825..cc8d6852576 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java @@ -97,6 +97,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String serviceStartCommand; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map vendorToSpecUuidsMap; + @Param(required = false) public java.util.List systemTags; From 2178b3d63f12d379481efa879adb5bb9dac5fe2f Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Tue, 4 Nov 2025 15:07:39 +0800 Subject: [PATCH 597/737] [compute]: Allow different hypervisor use same management ip Resolves: ZSTAC-79341 Change-Id: I7372637467766d6b75717663766d646a6c78726f --- .../zstack/compute/host/HostManagerImpl.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java b/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java index 30bcd10460e..10dfe6049d1 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java @@ -370,17 +370,27 @@ public String getName() { } private void doAddHost(final AddHostMessage msg, ReturnValueCompletion completion) { - if (Q.New(HostVO.class).eq(HostVO_.managementIp, msg.getManagementIp()).isExists()) { - completion.fail(argerr("there has been a host having managementIp[%s]", msg.getManagementIp())); - return; - } - final ClusterVO cluster = findClusterByUuid(msg.getClusterUuid()); if (cluster == null) { completion.fail(argerr("cluster[uuid:%s] is not existing", msg.getClusterUuid())); return; } + String hvType = cluster.getHypervisorType(); + if (hvType == null) { + completion.fail(argerr("cluster[uuid:%s] has null hypervisorType", msg.getClusterUuid())); + return; + } + + if (Q.New(HostVO.class) + .eq(HostVO_.managementIp, msg.getManagementIp()) + .eq(HostVO_.hypervisorType, hvType) + .isExists()) { + completion.fail(argerr("there has been a host having managementIp[%s] for hypervisor[%s]", + msg.getManagementIp(), hvType)); + return; + } + final HostVO hvo = new HostVO(); if (msg.getResourceUuid() != null) { hvo.setUuid(msg.getResourceUuid()); From 63908aaf3e15ac7315171cfd19019fd716a1ef39 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Tue, 4 Nov 2025 17:09:22 +0800 Subject: [PATCH 598/737] [conf]: Introduce PodGpuStats view DBImpact Resolves: ZSTAC-79399 Change-Id: I656269746b7861776b697963667177687674786f --- conf/db/upgrade/V5.4.2__schema.sql | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/conf/db/upgrade/V5.4.2__schema.sql b/conf/db/upgrade/V5.4.2__schema.sql index 15bdbc49322..ee9c3a89f4c 100644 --- a/conf/db/upgrade/V5.4.2__schema.sql +++ b/conf/db/upgrade/V5.4.2__schema.sql @@ -57,3 +57,14 @@ CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceGpuVendorSpecRefVO` ( REFERENCES `ModelServiceGpuVendorVO`(`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE OR REPLACE VIEW PodGpuStatsVO AS +SELECT + p.uuid AS podUuid, + COUNT(g.uuid) AS gpuCount, + COALESCE(CAST(ROUND(AVG(g.memory)) AS SIGNED), 0) AS avgAllocatedMb, + COALESCE(CAST(SUM(g.memory) AS SIGNED), 0) AS totalGpuMemMb +FROM PodVO p + LEFT JOIN PciDeviceVO pci ON pci.vmInstanceUuid = p.uuid + LEFT JOIN GpuDeviceVO g ON g.uuid = pci.uuid +GROUP BY p.uuid; From b963bd28f26d9e58a3dd5c2a13ed123c43bd5d32 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 6 Nov 2025 10:11:10 +0800 Subject: [PATCH 599/737] [conf]: Update sdk and gpu device allocation status Resolves: ZSTAC-79025 Change-Id: I627073626565646477627a62666d696e6d6e7475 --- conf/db/upgrade/V5.4.2__schema.sql | 11 +++++++++++ sdk/src/main/java/SourceClassMap.java | 2 ++ .../main/java/org/zstack/sdk/GpuAllocateStatus.java | 6 ++++++ .../main/java/org/zstack/sdk/GpuDeviceInventory.java | 10 +++++++++- 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/GpuAllocateStatus.java diff --git a/conf/db/upgrade/V5.4.2__schema.sql b/conf/db/upgrade/V5.4.2__schema.sql index 0ab14d94e4e..299a877a0cb 100644 --- a/conf/db/upgrade/V5.4.2__schema.sql +++ b/conf/db/upgrade/V5.4.2__schema.sql @@ -69,3 +69,14 @@ FROM PodVO p LEFT JOIN PciDeviceVO pci ON pci.vmInstanceUuid = p.uuid LEFT JOIN GpuDeviceVO g ON g.uuid = pci.uuid GROUP BY p.uuid; + +CALL ADD_COLUMN('GpuDeviceVO', 'allocateStatus', 'varchar(32)', 1, NULL); + +-- Upgrade GpuDeviceVO.allocateStatus based vmInstanceUuid +UPDATE GpuDeviceVO gpuDevice +JOIN PciDeviceVO pciDevice ON gpuDevice.uuid = pciDevice.uuid +SET gpuDevice.allocateStatus = + CASE + WHEN pciDevice.vmInstanceUuid IS NOT NULL THEN 'Allocated' + ELSE 'Unallocated' + END; diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 124a03ad442..976ae5d4e48 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -616,6 +616,7 @@ public class SourceClassMap { put("org.zstack.pciDevice.PciDeviceState", "org.zstack.sdk.PciDeviceState"); put("org.zstack.pciDevice.PciDeviceStatus", "org.zstack.sdk.PciDeviceStatus"); put("org.zstack.pciDevice.PciDeviceType", "org.zstack.sdk.PciDeviceType"); + put("org.zstack.pciDevice.gpu.GpuAllocateStatus", "org.zstack.sdk.GpuAllocateStatus"); put("org.zstack.pciDevice.gpu.GpuDeviceInventory", "org.zstack.sdk.GpuDeviceInventory"); put("org.zstack.pciDevice.gpu.GpuDeviceSpecInventory", "org.zstack.sdk.GpuDeviceSpecInventory"); put("org.zstack.pciDevice.gpu.GpuVendor", "org.zstack.sdk.GpuVendor"); @@ -1062,6 +1063,7 @@ public class SourceClassMap { put("org.zstack.sdk.GlobalConfigInventory", "org.zstack.core.config.GlobalConfigInventory"); put("org.zstack.sdk.GlobalConfigOptions", "org.zstack.core.config.GlobalConfigOptions"); put("org.zstack.sdk.GlobalConfigTemplateInventory", "org.zstack.templateConfig.GlobalConfigTemplateInventory"); + put("org.zstack.sdk.GpuAllocateStatus", "org.zstack.pciDevice.gpu.GpuAllocateStatus"); put("org.zstack.sdk.GpuDeviceInventory", "org.zstack.pciDevice.gpu.GpuDeviceInventory"); put("org.zstack.sdk.GpuDeviceSpecInventory", "org.zstack.pciDevice.gpu.GpuDeviceSpecInventory"); put("org.zstack.sdk.GpuVendor", "org.zstack.pciDevice.gpu.GpuVendor"); diff --git a/sdk/src/main/java/org/zstack/sdk/GpuAllocateStatus.java b/sdk/src/main/java/org/zstack/sdk/GpuAllocateStatus.java new file mode 100644 index 00000000000..8ee453e7f55 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GpuAllocateStatus.java @@ -0,0 +1,6 @@ +package org.zstack.sdk; + +public enum GpuAllocateStatus { + Unallocated, + Allocated, +} diff --git a/sdk/src/main/java/org/zstack/sdk/GpuDeviceInventory.java b/sdk/src/main/java/org/zstack/sdk/GpuDeviceInventory.java index 0ed9716220f..c45b9f27bac 100644 --- a/sdk/src/main/java/org/zstack/sdk/GpuDeviceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/GpuDeviceInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk; - +import org.zstack.sdk.GpuAllocateStatus; public class GpuDeviceInventory extends org.zstack.sdk.PciDeviceInventory { @@ -44,4 +44,12 @@ public java.lang.String getGpuType() { return this.gpuType; } + public GpuAllocateStatus allocateStatus; + public void setAllocateStatus(GpuAllocateStatus allocateStatus) { + this.allocateStatus = allocateStatus; + } + public GpuAllocateStatus getAllocateStatus() { + return this.allocateStatus; + } + } From bc338a431315c00e92ff6819e579509dd8de3e22 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Thu, 6 Nov 2025 14:11:27 +0800 Subject: [PATCH 600/737] [compute]: fix enum value of error Resolves: ZSTAC-79450 Change-Id: I61626e7667637a76736d7674676e6e70656d6565 --- .../src/main/java/org/zstack/compute/vm/MacOperator.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/vm/MacOperator.java b/compute/src/main/java/org/zstack/compute/vm/MacOperator.java index ea1c9bf1336..5d500f451b5 100644 --- a/compute/src/main/java/org/zstack/compute/vm/MacOperator.java +++ b/compute/src/main/java/org/zstack/compute/vm/MacOperator.java @@ -127,7 +127,7 @@ public boolean checkDuplicateMac(String hypervisorType, String l3Uuid, String ma public static String generateMacWithDeviceId(short deviceId) { VmMacAddressSchemaType type; try { - type = VmMacAddressSchemaType.valueOf(VmGlobalProperty.vmMacAddressSchema.toLowerCase()); + type = VmMacAddressSchemaType.valueOf(VmGlobalProperty.vmMacAddressSchema); } catch (Exception e) { type = VmMacAddressSchemaType.Random; } @@ -148,8 +148,8 @@ public static String generateMacWithDeviceIdIp(short deviceId) { } /* encode mgt ip address into mac address: for example, - * mgt ip is: 172.24.0.81, its hex string: AC 18 0 51, - * so mac address will look like: 18:00:51:xx:xx:yy + * mgt ip is: 172.24.0.81, its hex string: AC 18 00 51, + * so mac address will look like: fa:00:51:xx:xx:yy * xx:xx are random. yy is device ID */ int mgtIpL = (int)NetworkUtils.ipv4StringToLong(mgtIp); String mgtIpStr = Integer.toHexString(mgtIpL); @@ -158,7 +158,7 @@ public static String generateMacWithDeviceIdIp(short deviceId) { mgtIpStr = compensate + mgtIpStr; } - StringBuilder sb = new StringBuilder(mgtIpStr.substring(2, 4)).append(":"); + StringBuilder sb = new StringBuilder("fa").append(":"); sb.append(mgtIpStr, 4, 6).append(":"); sb.append(mgtIpStr, 6, 8).append(":"); From 31fc3e670e0680cd1f06f87bdb48ab4591ab934f Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Thu, 6 Nov 2025 15:38:38 +0800 Subject: [PATCH 601/737] [conf]: Mark system templates with correct GPU vendor This change is necessary because system templates need to be marked with the correct GPU vendor for compatibility assessment checks. This commit addresses the problem by introducing a stored procedure to . This procedure ensures that system model services in the table have their corresponding GPU vendor information correctly recorded in the table. The procedure is idempotent and only targets system services. DBImpact Resolves: ZSTAC-79649 Change-Id: I6a6f6e697a776366686664616c77697468797a79 --- conf/db/upgrade/V5.4.2__schema.sql | 75 ++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/conf/db/upgrade/V5.4.2__schema.sql b/conf/db/upgrade/V5.4.2__schema.sql index 299a877a0cb..54c29517a46 100644 --- a/conf/db/upgrade/V5.4.2__schema.sql +++ b/conf/db/upgrade/V5.4.2__schema.sql @@ -80,3 +80,78 @@ SET gpuDevice.allocateStatus = WHEN pciDevice.vmInstanceUuid IS NOT NULL THEN 'Allocated' ELSE 'Unallocated' END; + +DELIMITER $$ +CREATE PROCEDURE update_system_model_service_gpu_vendors() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE service_uuid VARCHAR(32); + DECLARE model_name VARCHAR(255); + DECLARE gpu_vendor_name VARCHAR(32); + + -- Cursor to iterate over the models + DECLARE models_cursor CURSOR FOR + SELECT name, vendor FROM system_models_to_update; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + -- Temporary table to hold the data + CREATE TEMPORARY TABLE IF NOT EXISTS system_models_to_update ( + name VARCHAR(255), + vendor VARCHAR(32) + ); + + -- Populate the temporary table + INSERT INTO system_models_to_update (name, vendor) VALUES + ('vLLM-0.7.2', 'NVIDIA'), + ('vLLM-0.8.5', 'NVIDIA'), + ('vLLM-0.9.2', 'NVIDIA'), + ('vLLM-0.11.0', 'NVIDIA'), + ('SGLang-0.4.9.post1', 'NVIDIA'), + ('SGLang-0.5.2', 'NVIDIA'), + ('Transformers-4.48.3', 'NVIDIA'), + ('Transformers-4.56.2', 'NVIDIA'), + ('sentence_transformers-3.1.1', 'NVIDIA'), + ('Diffusers-0.30.0', 'NVIDIA'), + ('Diffusers-0.35.1', 'NVIDIA'), + ('MindIE-2.0.RC1-910B', 'HUAWEI'), + ('MindIE-2.1.RC1-910B', 'HUAWEI'), + ('MindIE-1.0.0-310P', 'HUAWEI'), + ('vllm-Ascend-0.11.0', 'HUAWEI'), + ('vLLM-0.5.0-HYGON-Z100L', 'HAIGUANG'), + ('vLLM-0.8.5-HYGON-K100-AI', 'HAIGUANG'), + ('vLLM-0.9.2-HYGON-K100-AI', 'HAIGUANG'), + ('vLLM-0.7.2-HYGON-K100-AI', 'HAIGUANG'), + ('MinerU-2.5', 'NVIDIA'); + + OPEN models_cursor; + update_loop: LOOP + FETCH models_cursor INTO model_name, gpu_vendor_name; + IF done THEN + LEAVE update_loop; + END IF; + + -- Find the model service uuid, only for system services + SELECT uuid INTO service_uuid FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND system = 1 LIMIT 1; + + -- If the model service exists, ensure the GPU vendor is associated + IF service_uuid IS NOT NULL THEN + IF NOT EXISTS (SELECT 1 FROM `zstack`.`ModelServiceGpuVendorVO` WHERE modelServiceUuid = service_uuid AND gpuVendor = gpu_vendor_name) THEN + INSERT INTO `zstack`.`ModelServiceGpuVendorVO` (modelServiceUuid, gpuVendor, createDate, lastOpDate) + VALUES (service_uuid, gpu_vendor_name, NOW(), NOW()); + END IF; + END IF; + + SET service_uuid = NULL; + + END LOOP; + CLOSE models_cursor; + + -- Clean up + DROP TEMPORARY TABLE system_models_to_update; + +END $$ +DELIMITER ; + +CALL update_system_model_service_gpu_vendors(); +DROP PROCEDURE IF EXISTS update_system_model_service_gpu_vendors; From d94b4ed070944fe3dc2207befbb0c3c260252366 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 7 Nov 2025 14:55:19 +0800 Subject: [PATCH 602/737] [sdk]: Update sdk Resolves: ZSTAC-79627 Change-Id: I6b69767562797876776a6f75736373696e69726d --- .../java/org/zstack/sdk/ModelServiceMatchEntryName.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntryName.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntryName.java index 1344fb4d662..955a9dc8007 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntryName.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntryName.java @@ -1,11 +1,12 @@ package org.zstack.sdk; public enum ModelServiceMatchEntryName { - TemplateExistence, - FrameworkCompatibility, + GpuVendorCompatibility, AcceleratorCompatibility, + GpuPrecisionCompatibility, + TemplateExistence, FrameworkVersionCompatibility, + ScalingCapability, ArchitectureCompatibility, QuantizationCompatibility, - ScalingCapability, } From 9bef3116ee591bfd5ef43642c39038287dd889ee Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Fri, 7 Nov 2025 15:32:17 +0800 Subject: [PATCH 603/737] [conf]: Fix model service upgrade if service missed in DB DBImpact Resolves: ZSTAC-79649 Change-Id: I676c75626965766e6d69757a746962786d677078 --- conf/db/upgrade/V5.4.2__schema.sql | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/conf/db/upgrade/V5.4.2__schema.sql b/conf/db/upgrade/V5.4.2__schema.sql index 54c29517a46..8fb22a9dcd9 100644 --- a/conf/db/upgrade/V5.4.2__schema.sql +++ b/conf/db/upgrade/V5.4.2__schema.sql @@ -117,12 +117,12 @@ BEGIN ('MindIE-2.0.RC1-910B', 'HUAWEI'), ('MindIE-2.1.RC1-910B', 'HUAWEI'), ('MindIE-1.0.0-310P', 'HUAWEI'), - ('vllm-Ascend-0.11.0', 'HUAWEI'), + ('vLLM-Ascend-0.11.0.rc0', 'HUAWEI'), ('vLLM-0.5.0-HYGON-Z100L', 'HAIGUANG'), ('vLLM-0.8.5-HYGON-K100-AI', 'HAIGUANG'), ('vLLM-0.9.2-HYGON-K100-AI', 'HAIGUANG'), ('vLLM-0.7.2-HYGON-K100-AI', 'HAIGUANG'), - ('MinerU-2.5', 'NVIDIA'); + ('MinerU2.5-2509', 'NVIDIA'); OPEN models_cursor; update_loop: LOOP @@ -132,14 +132,30 @@ BEGIN END IF; -- Find the model service uuid, only for system services - SELECT uuid INTO service_uuid FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND system = 1 LIMIT 1; + SELECT COUNT(*) INTO @cnt FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND system = 1; + IF @cnt > 0 THEN + SELECT uuid INTO service_uuid FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND system = 1 LIMIT 1; + ELSE + SET service_uuid = NULL; + END IF; -- If the model service exists, ensure the GPU vendor is associated IF service_uuid IS NOT NULL THEN + SELECT CONCAT('INFO: Processing model=', model_name, ', service_uuid=', service_uuid, ', desired_vendor=', gpu_vendor_name) AS msg; + -- delete different gpu vendors + DELETE FROM `zstack`.`ModelServiceGpuVendorVO` + WHERE modelServiceUuid = service_uuid + AND gpuVendor <> gpu_vendor_name; + SELECT CONCAT('INFO: Deleted different GPU vendors for service_uuid=', service_uuid, ', deleted_rows=', ROW_COUNT()) AS msg; IF NOT EXISTS (SELECT 1 FROM `zstack`.`ModelServiceGpuVendorVO` WHERE modelServiceUuid = service_uuid AND gpuVendor = gpu_vendor_name) THEN - INSERT INTO `zstack`.`ModelServiceGpuVendorVO` (modelServiceUuid, gpuVendor, createDate, lastOpDate) - VALUES (service_uuid, gpu_vendor_name, NOW(), NOW()); + INSERT INTO `zstack`.`ModelServiceGpuVendorVO` (modelServiceUuid, gpuVendor, createDate, lastOpDate) + VALUES (service_uuid, gpu_vendor_name, NOW(), NOW()); + SELECT CONCAT('INFO: Inserted GPU vendor=', gpu_vendor_name, ' for service_uuid=', service_uuid, ', inserted_rows=', ROW_COUNT()) AS msg; + ELSE + SELECT CONCAT('INFO: GPU vendor=', gpu_vendor_name, ' already exists for service_uuid=', service_uuid) AS msg; END IF; + ELSE + SELECT CONCAT('WARN: Service not found for model=', model_name) AS msg; END IF; SET service_uuid = NULL; From 67dc4492c90d07873d047a066058560730d478f0 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Sat, 8 Nov 2025 16:51:20 +0800 Subject: [PATCH 604/737] [ai]: MindIE-1.0.0-310P should not have x86_64 arch Resolves: ZSTAC-79732 Change-Id: I69777270796c6a6a7168696a7477796a63696161 --- conf/db/upgrade/V5.4.2__schema.sql | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/conf/db/upgrade/V5.4.2__schema.sql b/conf/db/upgrade/V5.4.2__schema.sql index 8fb22a9dcd9..68dd516ab05 100644 --- a/conf/db/upgrade/V5.4.2__schema.sql +++ b/conf/db/upgrade/V5.4.2__schema.sql @@ -171,3 +171,10 @@ DELIMITER ; CALL update_system_model_service_gpu_vendors(); DROP PROCEDURE IF EXISTS update_system_model_service_gpu_vendors; + +-- Delete unexpected ModelServiceTemplateVO entries of MindIE-1.0.0-310P +DELETE FROM `zstack`.`ModelServiceTemplateVO` +WHERE `modelServiceUuid` = 'fe4ed042ac074c55ba1e76921b175ba5' and `cpuArchitecture` = 'x86_64'; + +DELETE FROM `zstack`.`ModelServiceCpuArchitectureVO` +WHERE `modelServiceUuid` = 'fe4ed042ac074c55ba1e76921b175ba5' and `architecture` = 'x86_64'; From 74d37f9dfa8b096edd1a5b35232ea38447eb63f0 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Sat, 8 Nov 2025 21:53:27 +0800 Subject: [PATCH 605/737] [sdk]: Update sdk Resolves: ZSTAC-79735 Change-Id: I61726266686978696475637972767374776d686c --- sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntryName.java | 1 - 1 file changed, 1 deletion(-) diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntryName.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntryName.java index 955a9dc8007..da8c6a273c3 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntryName.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntryName.java @@ -5,7 +5,6 @@ public enum ModelServiceMatchEntryName { AcceleratorCompatibility, GpuPrecisionCompatibility, TemplateExistence, - FrameworkVersionCompatibility, ScalingCapability, ArchitectureCompatibility, QuantizationCompatibility, From e54f8178fe91349f98660cdaec84790b5b3bfb32 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 11 Nov 2025 10:53:26 +0800 Subject: [PATCH 606/737] [sdk]: Update sdk Resolves: ZSTAC-79795 Change-Id: I69686b786862746f717364646d7a656b64676173 --- .../sdk/GenerateModelMetadataAction.java | 104 ++++++++++++++++++ .../sdk/GenerateModelMetadataResult.java | 7 ++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ 3 files changed, 138 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataResult.java diff --git a/sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataAction.java b/sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataAction.java new file mode 100644 index 00000000000..9d52805be39 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GenerateModelMetadataAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeployModelServiceResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelCenterUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeployModelServiceResult value = res.getResult(org.zstack.sdk.DeployModelServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.DeployModelServiceResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/ai/model/metadata/generate"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "generateModelMetadata"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataResult.java b/sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataResult.java new file mode 100644 index 00000000000..0bcbe7c9600 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class GenerateModelMetadataResult { + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 99871088e25..34cf02a9ff5 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -20024,6 +20024,33 @@ abstract class ApiHelper { } + def generateModelMetadata(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GenerateModelMetadataAction.class) Closure c) { + def a = new org.zstack.sdk.GenerateModelMetadataAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def generateSeMdevDevices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GenerateSeMdevDevicesAction.class) Closure c) { def a = new org.zstack.sdk.GenerateSeMdevDevicesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From fe8dd5bd7deaaaf14697e736d4c0bf77cf36c78b Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 11 Nov 2025 14:33:03 +0800 Subject: [PATCH 607/737] [conf]: Upgrade previous system model services DBImpact Resolves: ZSTAC-79795 Change-Id: I666969646c616e6970627572656b6d72616f7566 --- conf/db/upgrade/V5.4.2__schema.sql | 87 ++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/conf/db/upgrade/V5.4.2__schema.sql b/conf/db/upgrade/V5.4.2__schema.sql index 68dd516ab05..476304fd72d 100644 --- a/conf/db/upgrade/V5.4.2__schema.sql +++ b/conf/db/upgrade/V5.4.2__schema.sql @@ -172,6 +172,93 @@ DELIMITER ; CALL update_system_model_service_gpu_vendors(); DROP PROCEDURE IF EXISTS update_system_model_service_gpu_vendors; +DELIMITER $$ +CREATE PROCEDURE update_system_model_service_templates() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE service_uuid VARCHAR(32); + DECLARE model_name VARCHAR(255); + DECLARE gpu_vendor_name VARCHAR(32); + DECLARE py_version VARCHAR(255); + DECLARE cuda_version VARCHAR(255); + DECLARE cann_version VARCHAR(255); + DECLARE fw_version VARCHAR(255); + + DECLARE templates_cursor CURSOR FOR + SELECT name, vendor, pythonVersion, cudaVersion, cannVersion, frameworkVersion FROM system_models_templates_to_update; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + CREATE TEMPORARY TABLE IF NOT EXISTS system_models_templates_to_update ( + name VARCHAR(255), + vendor VARCHAR(32), + pythonVersion VARCHAR(255), + cudaVersion VARCHAR(255), + cannVersion VARCHAR(255), + frameworkVersion VARCHAR(255) + ); + + INSERT INTO system_models_templates_to_update (name, vendor, pythonVersion, cudaVersion, cannVersion, frameworkVersion) VALUES + ('vLLM-0.7.2', 'NVIDIA', '3.10', '12.5', NULL, '0.7.2'), + ('vLLM-0.8.5', 'NVIDIA', '3.10', '12.5', NULL, '0.8.5'), + ('vLLM-0.9.2', 'NVIDIA', '3.10', '12.5', NULL, '0.9.2'), + ('vLLM-0.11.0', 'NVIDIA', '3.10', '12.5', NULL, '0.11.0'), + ('SGLang-0.4.9.post1', 'NVIDIA', '3.10', '12.5', NULL, '0.4.9.post1'), + ('SGLang-0.5.2', 'NVIDIA', '3.10', '12.5', NULL, '0.5.2'), + ('Transformers-4.48.3', 'NVIDIA', '3.10', '12.5', NULL, '4.48.3'), + ('Transformers-4.56.2', 'NVIDIA', '3.10', '12.5', NULL, '4.56.2'), + ('sentence_transformers-3.1.1', 'NVIDIA', '3.10', '12.5', NULL, '3.1.1'), + ('Diffusers-0.30.0', 'NVIDIA', '3.10', '12.5', NULL, '0.30.0'), + ('Diffusers-0.35.1', 'NVIDIA', '3.10', '12.5', NULL, '0.35.1'), + ('MindIE-2.0.RC1-910B', 'HUAWEI', '3.9', NULL, '8.0', '2.0.RC1'), + ('MindIE-2.1.RC1-910B', 'HUAWEI', '3.9', NULL, '8.0', '2.1.RC1'), + ('MindIE-1.0.0-310P', 'HUAWEI', '3.9', NULL, '7.0', '1.0.0'), + ('vLLM-Ascend-0.11.0.rc0', 'HUAWEI', '3.9', NULL, '8.0', '0.11.0.rc0'), + ('vLLM-0.5.0-HYGON-Z100L', 'HAIGUANG', '3.10', NULL, NULL, '0.5.0'), + ('vLLM-0.8.5-HYGON-K100-AI', 'HAIGUANG', '3.10', NULL, NULL, '0.8.5'), + ('vLLM-0.9.2-HYGON-K100-AI', 'HAIGUANG', '3.10', NULL, NULL, '0.9.2'), + ('vLLM-0.7.2-HYGON-K100-AI', 'HAIGUANG', '3.10', NULL, NULL, '0.7.2'), + ('MinerU2.5-2509', 'NVIDIA', '3.10', '12.5', NULL, '2.5'); + + OPEN templates_cursor; + update_template_loop: LOOP + FETCH templates_cursor INTO model_name, gpu_vendor_name, py_version, cuda_version, cann_version, fw_version; + IF done THEN + LEAVE update_template_loop; + END IF; + + SELECT COUNT(*) INTO @cnt FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND system = 1; + IF @cnt > 0 THEN + SELECT uuid INTO service_uuid FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND system = 1 LIMIT 1; + ELSE + SET service_uuid = NULL; + END IF; + + IF service_uuid IS NOT NULL THEN + UPDATE `zstack`.`ModelServiceTemplateVO` + SET + `pythonVersionSemver` = py_version, + `cudaVersion` = cuda_version, + `cannVersion` = cann_version, + `frameworkVersionSemver` = fw_version, + `gpuVendor` = gpu_vendor_name + WHERE `modelServiceUuid` = service_uuid; + SELECT CONCAT('INFO: Updated ModelServiceTemplateVO for service_uuid=', service_uuid, ', updated_rows=', ROW_COUNT()) AS msg; + ELSE + SELECT CONCAT('WARN: Service not found for model=', model_name, ', skipping template update.') AS msg; + END IF; + + SET service_uuid = NULL; + END LOOP; + CLOSE templates_cursor; + + DROP TEMPORARY TABLE system_models_templates_to_update; +END $$ +DELIMITER ; + +CALL update_system_model_service_templates(); +DROP PROCEDURE IF EXISTS update_system_model_service_templates; + -- Delete unexpected ModelServiceTemplateVO entries of MindIE-1.0.0-310P DELETE FROM `zstack`.`ModelServiceTemplateVO` WHERE `modelServiceUuid` = 'fe4ed042ac074c55ba1e76921b175ba5' and `cpuArchitecture` = 'x86_64'; From b0f8057d5af9967c1a3d4b53b140804d8250303c Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 12 Nov 2025 18:55:09 +0800 Subject: [PATCH 608/737] [sdk]: Update sdk Resolves: ZSTAC-79795 Change-Id: I6e78716665646a786277656f7379787a6e62756f --- .../java/org/zstack/sdk/GenerateModelMetadataAction.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataAction.java b/sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataAction.java index 9d52805be39..435e738b095 100644 --- a/sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataAction.java @@ -12,7 +12,7 @@ public class GenerateModelMetadataAction extends AbstractAction { public static class Result { public ErrorCode error; - public org.zstack.sdk.DeployModelServiceResult value; + public org.zstack.sdk.GenerateModelMetadataResult value; public Result throwExceptionIfError() { if (error != null) { @@ -63,8 +63,8 @@ private Result makeResult(ApiResult res) { return ret; } - org.zstack.sdk.DeployModelServiceResult value = res.getResult(org.zstack.sdk.DeployModelServiceResult.class); - ret.value = value == null ? new org.zstack.sdk.DeployModelServiceResult() : value; + org.zstack.sdk.GenerateModelMetadataResult value = res.getResult(org.zstack.sdk.GenerateModelMetadataResult.class); + ret.value = value == null ? new org.zstack.sdk.GenerateModelMetadataResult() : value; return ret; } From cbf8971616f77204be9a6ad1d9f29e0c790ae30e Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Tue, 18 Nov 2025 19:27:12 +0800 Subject: [PATCH 609/737] [conf]: recover UsedIpVO DBImpact Resolves: ZSTAC-77608 Change-Id: I6c71707372797770667069646563746568636162 --- conf/db/upgrade/V5.4.6__schema.sql | 57 ++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 conf/db/upgrade/V5.4.6__schema.sql diff --git a/conf/db/upgrade/V5.4.6__schema.sql b/conf/db/upgrade/V5.4.6__schema.sql new file mode 100644 index 00000000000..138893de85b --- /dev/null +++ b/conf/db/upgrade/V5.4.6__schema.sql @@ -0,0 +1,57 @@ +-- Fix UsedIpVO gateway and netmask from empty strings +DROP PROCEDURE IF EXISTS fixUsedIpGatewayAndNetmask; + +DELIMITER $$ + +CREATE PROCEDURE fixUsedIpGatewayAndNetmask() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE v_usedIpUuid VARCHAR(32); + DECLARE v_ipRangeUuid VARCHAR(32); + DECLARE v_gateway VARCHAR(64); + DECLARE v_netmask VARCHAR(64); + + -- Cursor for UsedIpVO records with empty gateway or netmask + DECLARE cur CURSOR FOR + SELECT uuid, ipRangeUuid + FROM UsedIpVO + WHERE (gateway = '' OR netmask = '' OR gateway IS NULL OR netmask IS NULL) + AND ipRangeUuid IS NOT NULL; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + OPEN cur; + + read_loop: LOOP + FETCH cur INTO v_usedIpUuid, v_ipRangeUuid; + + IF done THEN + LEAVE read_loop; + END IF; + + -- Get gateway and netmask from IpRangeVO + SELECT gateway, netmask + INTO v_gateway, v_netmask + FROM IpRangeVO + WHERE uuid = v_ipRangeUuid; + + -- Update UsedIpVO with correct gateway and netmask + IF v_gateway IS NOT NULL AND v_netmask IS NOT NULL THEN + UPDATE UsedIpVO + SET gateway = v_gateway, netmask = v_netmask + WHERE uuid = v_usedIpUuid; + END IF; + + END LOOP; + + CLOSE cur; + +END$$ + +DELIMITER ; + +-- Execute the procedure +CALL fixUsedIpGatewayAndNetmask(); + +-- Drop the procedure after use +DROP PROCEDURE IF EXISTS fixUsedIpGatewayAndNetmask; From f6a093c3f2d5f7e325a55c719a191727fc70c8f0 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Wed, 19 Nov 2025 14:59:12 +0800 Subject: [PATCH 610/737] [applianceVm]: refactor applianVm cascade Resolves: ZSTAC-79667 Change-Id: I78726c6d697577776873706c6c6f6e63636a7264 --- conf/springConfigXml/vyos.xml | 1 + .../ApplianceVmCascadeExtension.java | 79 ++++++++++++++++--- .../zstack/appliancevm/ApplianceVmFacade.java | 2 + .../appliancevm/ApplianceVmFacadeImpl.java | 20 ++++- .../ApvmCascadeFilterExtensionPoint.java | 21 ++++- .../VirtualRouterManagerImpl.java | 13 ++- .../virtualrouter/vyos/VyosVmFactory.java | 39 ++++++++- 7 files changed, 153 insertions(+), 22 deletions(-) diff --git a/conf/springConfigXml/vyos.xml b/conf/springConfigXml/vyos.xml index 30a2ecbf077..0793d44131a 100755 --- a/conf/springConfigXml/vyos.xml +++ b/conf/springConfigXml/vyos.xml @@ -125,6 +125,7 @@ + diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmCascadeExtension.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmCascadeExtension.java index bef8e06bddc..d2134ad3f8c 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmCascadeExtension.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmCascadeExtension.java @@ -74,6 +74,8 @@ public class ApplianceVmCascadeExtension extends AbstractAsyncCascadeExtension { private PluginRegistry pluginRgty; @Autowired protected ThreadFacade thdf; + @Autowired + private ApplianceVmFacade apvmFacade; private static String NAME = ApplianceVmVO.class.getSimpleName(); @@ -287,10 +289,22 @@ private void handleL2NetworkDetach(CascadeAction action, final Completion comple .map(VmInstanceVO::getUuid).collect(Collectors.toList())).list(); if (!applianceVmVOS.isEmpty()) { - for (ApvmCascadeFilterExtensionPoint ext : pluginRgty.getExtensionList(ApvmCascadeFilterExtensionPoint.class)) { - applianceVmVOS = ext.filterApplianceVmCascade(applianceVmVOS, action, action.getParentIssuer(), l3uuids, - new ArrayList<>(), new ArrayList<>()); + List toMigrateVms = new ArrayList<>(); + Map> apvmsByType = applianceVmVOS.stream() + .collect(Collectors.groupingBy(ApplianceVmVO::getApplianceVmType)); + + for (Map.Entry> entry : apvmsByType.entrySet()) { + ApplianceVmType vmType = ApplianceVmType.valueOf(entry.getKey()); + List vmsOfType = entry.getValue(); + + ApvmCascadeFilterExtensionPoint ext = apvmFacade.getApvmCascadeFilterExtensionPoint(vmType); + if (ext != null) { + vmsOfType = ext.filterApplianceVmCascade(vmsOfType, action, action.getParentIssuer(), l3uuids, + new ArrayList<>(), new ArrayList<>()); + } + toMigrateVms.addAll(vmsOfType); } + applianceVmVOS = toMigrateVms; } if (applianceVmVOS.isEmpty()) { @@ -788,12 +802,32 @@ public String call(L3NetworkInventory arg) { q.setParameter("l3Uuids", l3uuids); List apvms = q.getResultList(); if (!apvms.isEmpty()) { - for (ApvmCascadeFilterExtensionPoint ext : pluginRgty.getExtensionList(ApvmCascadeFilterExtensionPoint.class)) { - apvms = ext.filterApplianceVmCascade(apvms, action, action.getParentIssuer(), l3uuids, - toDeleteNics, toDeleteIps); + List toDeleteVms = new ArrayList<>(); + List vmNics = new ArrayList<>(); + List ips = new ArrayList<>(); + Map> apvmsByType = apvms.stream() + .collect(Collectors.groupingBy(ApplianceVmVO::getApplianceVmType)); + + for (Map.Entry> entry : apvmsByType.entrySet()) { + ApplianceVmType vmType = ApplianceVmType.valueOf(entry.getKey()); + List vmsOfType = entry.getValue(); + + ApvmCascadeFilterExtensionPoint ext = apvmFacade.getApvmCascadeFilterExtensionPoint(vmType); + if (ext != null) { + vmsOfType = ext.filterApplianceVmCascade(vmsOfType, action, action.getParentIssuer(), l3uuids, + vmNics, ips); + if (!vmNics.isEmpty()) { + toDeleteNics.addAll(vmNics); + } + if (!ips.isEmpty()) { + toDeleteIps.addAll(ips); + } + } + toDeleteVms.addAll(vmsOfType); } - if (!apvms.isEmpty()) { - ret = ApplianceVmInventory.valueOf1(apvms); + + if (!toDeleteVms.isEmpty()) { + ret = ApplianceVmInventory.valueOf1(toDeleteVms); } } } else if (IpRangeVO.class.getSimpleName().equals(action.getParentIssuer())) { @@ -857,13 +891,32 @@ public List call() { } } } - for (ApvmCascadeFilterExtensionPoint ext : pluginRgty.getExtensionList(ApvmCascadeFilterExtensionPoint.class)) { - vmvos = ext.filterApplianceVmCascade(vmvos, action, action.getParentIssuer(), ipruuids, - toDeleteNics, toDeleteIps); + + List toDeleteVms = new ArrayList<>(); + Map> vmvosByType = vmvos.stream() + .collect(Collectors.groupingBy(ApplianceVmVO::getApplianceVmType)); + + for (Map.Entry> entry : vmvosByType.entrySet()) { + ApplianceVmType vmType = ApplianceVmType.valueOf(entry.getKey()); + List vmsOfType = entry.getValue(); + List vmNics = new ArrayList<>(); + List ips = new ArrayList<>(); + ApvmCascadeFilterExtensionPoint ext = apvmFacade.getApvmCascadeFilterExtensionPoint(vmType); + if (ext != null) { + vmsOfType = ext.filterApplianceVmCascade(vmsOfType, action, action.getParentIssuer(), ipruuids, + vmNics, ips); + if (!vmNics.isEmpty()) { + toDeleteNics.addAll(vmNics); + } + if (!ips.isEmpty()) { + toDeleteIps.addAll(ips); + } + } + toDeleteVms.addAll(vmsOfType); } - if (!vmvos.isEmpty()) { - ret = ApplianceVmInventory.valueOf1(vmvos); + if (!toDeleteVms.isEmpty()) { + ret = ApplianceVmInventory.valueOf1(toDeleteVms); } } else if (AccountVO.class.getSimpleName().equals(action.getParentIssuer())) { final List auuids = CollectionUtils.transformToList((List) action.getParentIssuerContext(), new Function() { diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacade.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacade.java index 261c1ee638e..fa8411218ca 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacade.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacade.java @@ -43,4 +43,6 @@ public interface ApplianceVmFacade { void attachApplianceVmToHaGroup(String vmUuid, String haGroupUuid); void dettachVmInstanceFromAffinityGroup(String vmUuid); void detachVirtualRouterFromHaGroup(String vmUuid, String haGroupUuid); + + ApvmCascadeFilterExtensionPoint getApvmCascadeFilterExtensionPoint(ApplianceVmType applianceVmType); } diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacadeImpl.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacadeImpl.java index 9ae61e10c78..9a415a48bfe 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacadeImpl.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacadeImpl.java @@ -40,15 +40,12 @@ import org.zstack.network.service.MtuGetter; import org.zstack.header.vm.hooks.VmInstanceAfterCreateHook; import org.zstack.header.vm.hooks.VmInstanceAfterDestroyHook; -import org.zstack.header.vm.hooks.VmInstanceBeforeCreateHook; import org.zstack.header.vm.hooks.VmInstanceBeforeDestroyHook; import org.zstack.utils.CollectionUtils; import org.zstack.utils.DebugUtils; import org.zstack.utils.Utils; import org.zstack.utils.function.Function; import org.zstack.utils.logging.CLogger; -import org.zstack.utils.zsha2.ZSha2Helper; -import org.zstack.utils.zsha2.ZSha2Info; import javax.persistence.Query; import java.util.*; @@ -88,6 +85,7 @@ public class ApplianceVmFacadeImpl extends AbstractService implements ApplianceV private FlowChainBuilder createApplianceVmWorkFlowBuilder; private Map bootstrapInfoFlowFactories = new HashMap(); private Map l2NetworkGetVniExtensionPointMap = new HashMap<>(); + private Map apvmCascadeFilterExtensionPointMap = new HashMap<>(); private String OWNER = String.format("ApplianceVm.%s", Platform.getManagementServerId()); @@ -224,6 +222,18 @@ private void populateExtensions() { l2NetworkGetVniExtensionPointMap.put(ext.getL2NetworkVniType(), ext); logger.debug(String.format("add new l2NetworkGetVniExtensionPoint, %s: %s", ext.getL2NetworkVniType(), ext.getClass().getCanonicalName())); } + + for (ApvmCascadeFilterExtensionPoint ext : pluginRgty.getExtensionList(ApvmCascadeFilterExtensionPoint.class)) { + ApplianceVmType type = ext.getApplianceVmType(); + ApvmCascadeFilterExtensionPoint old = apvmCascadeFilterExtensionPointMap.get(type); + if (old != null) { + throw new CloudRuntimeException(String.format("two extensions[%s, %s] declare ApvmCascadeFilterExtensionPoint for appliance vm type[%s]", old.getClass().getName(), ext.getClass().getName(), type)); + } + + apvmCascadeFilterExtensionPointMap.put(type, ext); + logger.debug(String.format("add new apvmCascadeFilterExtensionPoint, %s: %s", type, ext.getClass().getCanonicalName())); + + } } private void deployAnsible() { @@ -627,4 +637,8 @@ public void detachVirtualRouterFromHaGroup(String vmUuid, String haGroupUuid) { ext.detachVirtualRouterFromHaGroup(vmUuid, haGroupUuid); } } + + public ApvmCascadeFilterExtensionPoint getApvmCascadeFilterExtensionPoint(ApplianceVmType type) { + return apvmCascadeFilterExtensionPointMap.get(type); + } } diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApvmCascadeFilterExtensionPoint.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApvmCascadeFilterExtensionPoint.java index be9ab31b221..cd6d8903599 100644 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApvmCascadeFilterExtensionPoint.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApvmCascadeFilterExtensionPoint.java @@ -3,16 +3,35 @@ import org.zstack.core.cascade.CascadeAction; import org.zstack.header.network.l3.UsedIpInventory; import org.zstack.header.vm.VmNicInventory; -import org.zstack.network.service.vip.VipInventory; import java.util.List; /** + * Appliance VM cascade deletion filter extension point - Factory pattern + * Each implementation handles cascade deletion logic for specific appliance VM type + * * Created by weiwang on 22/10/2017 */ public interface ApvmCascadeFilterExtensionPoint { + /** + * Filter appliance VMs that need to be cascade deleted + * + * @param applianceVmVOS appliance VM list to process + * @param action cascade action + * @param parentIssuer parent resource type + * @param parentIssuerUuids parent resource UUID list + * @param toDeleteNics nics to be deleted (output parameter) + * @param toDeleteIps IPs to be deleted (output parameter) + * @return filtered VM list to delete + */ List filterApplianceVmCascade(List applianceVmVOS, CascadeAction action, String parentIssuer, List parentIssuerUuids, List toDeleteNics, List toDeleteIps); + + /** + * Check if this factory supports the specified appliance VM type + * @return true if supported, false otherwise + */ + ApplianceVmType getApplianceVmType(); } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java index 6d47951e257..ca14cc78996 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java @@ -2033,7 +2033,7 @@ protected List scripts() { }.execute(); } - private List applianceVmsToBeDeleted(List applianceVmVOS, List deletedUuids) { + public List applianceVmsToBeDeleted(List applianceVmVOS, List deletedUuids) { List vos = new ArrayList<>(); for (ApplianceVmVO vo : applianceVmVOS) { VirtualRouterVmVO vo_dbf = dbf.findByUuid(vo.getUuid(), VirtualRouterVmVO.class); @@ -2057,7 +2057,7 @@ private List applianceVmsToBeDeleted(List applianc return vos; } - List applianceVmsAdditionalPublicNic(List applianceVmVOS, List parentIssuerUuids) { + public List applianceVmsAdditionalPublicNic(List applianceVmVOS, List parentIssuerUuids) { List toDeleteNics = new ArrayList<>(); for (ApplianceVmVO vo : applianceVmVOS) { VirtualRouterVmVO vr_dbf = dbf.findByUuid(vo.getUuid(), VirtualRouterVmVO.class); @@ -2132,7 +2132,7 @@ public void done(ErrorCodeList errorCodeList) { }); } - List applianceVmsToDeleteNicByIpRanges(List applianceVmVOS, List iprUuids) { + public List applianceVmsToDeleteNicByIpRanges(List applianceVmVOS, List iprUuids) { List toDeleteNics = new ArrayList<>(); for (ApplianceVmVO vo : applianceVmVOS) { for (VmNicVO nic : vo.getVmNics()) { @@ -2159,7 +2159,7 @@ List applianceVmsToDeleteNicByIpRanges(List applianceVmV return toDeleteNics; } - private List applianceVmsToBeDeletedByIpRanges(List applianceVmVOS, List iprUuids) { + public List applianceVmsToBeDeletedByIpRanges(List applianceVmVOS, List iprUuids) { List toDeleted = new ArrayList<>(); List l3Uuids = Q.New(IpRangeVO.class).in(IpRangeVO_.uuid, iprUuids).select(IpRangeVO_.l3NetworkUuid).listValues(); for (ApplianceVmVO vos : applianceVmVOS) { @@ -2215,6 +2215,11 @@ public List filterApplianceVmCascade(List applianc } } + @Override + public ApplianceVmType getApplianceVmType() { + return ApplianceVmType.valueOf(VirtualRouterConstant.VIRTUAL_ROUTER_VM_TYPE); + } + private void reconenctVirtualRouter(String vrUUid, boolean statusChange) { ReconnectVirtualRouterVmMsg msg = new ReconnectVirtualRouterVmMsg(); msg.setVirtualRouterVmUuid(vrUUid); diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosVmFactory.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosVmFactory.java index 17d62cc88b6..69aa5b0155e 100644 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosVmFactory.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosVmFactory.java @@ -2,13 +2,21 @@ import org.springframework.beans.factory.annotation.Autowired; import org.zstack.appliancevm.ApplianceVmType; +import org.zstack.appliancevm.ApplianceVmVO; +import org.zstack.appliancevm.ApvmCascadeFilterExtensionPoint; +import org.zstack.core.cascade.CascadeAction; import org.zstack.core.db.DatabaseFacade; +import org.zstack.header.network.l3.IpRangeVO; +import org.zstack.header.network.l3.L3NetworkVO; +import org.zstack.header.network.l3.UsedIpInventory; import org.zstack.header.network.service.NetworkServiceType; +import org.zstack.header.vm.VmNicInventory; import org.zstack.network.service.lb.LoadBalancerConstants; import org.zstack.network.service.vip.VipGetUsedPortRangeExtensionPoint; import org.zstack.network.service.vip.VipVO; import org.zstack.network.service.virtualrouter.VirtualRouterGlobalConfig; import org.zstack.network.service.virtualrouter.VirtualRouterGlobalProperty; +import org.zstack.network.service.virtualrouter.VirtualRouterManagerImpl; import org.zstack.utils.RangeSet; import org.zstack.utils.Utils; import org.zstack.utils.VipUseForList; @@ -20,12 +28,14 @@ /** * Created by weiwang on 19/09/2017 */ -public class VyosVmFactory extends VyosVmBaseFactory implements VipGetUsedPortRangeExtensionPoint { +public class VyosVmFactory extends VyosVmBaseFactory implements VipGetUsedPortRangeExtensionPoint, ApvmCascadeFilterExtensionPoint { private static final CLogger logger = Utils.getLogger(VyosVmFactory.class); public static ApplianceVmType applianceVmType = new ApplianceVmType(VyosConstants.VYOS_VM_TYPE); @Autowired private DatabaseFacade dbf; + @Autowired + private VirtualRouterManagerImpl vrMgr; @Override public ApplianceVmType getApplianceVmType() { @@ -60,4 +70,31 @@ public RangeSet getVipUsePortRange(String vipUuid, String protocol, VipUseForLis return portRangeList; } + + @Override + public List filterApplianceVmCascade(List applianceVmVOS, CascadeAction action, + String parentIssuer, + List parentIssuerUuids, + List toDeleteNics, + List toDeleteIps) { + logger.debug(String.format("filter appliance vm type %s with parentIssuer [type: %s, uuids: %s]", + VyosConstants.VYOS_VM_TYPE, parentIssuer, parentIssuerUuids)); + + if (parentIssuer.equals(L3NetworkVO.class.getSimpleName())) { + List vos = vrMgr.applianceVmsToBeDeleted(applianceVmVOS, parentIssuerUuids); + + applianceVmVOS.removeAll(vos); + toDeleteNics.addAll(vrMgr.applianceVmsAdditionalPublicNic(applianceVmVOS, parentIssuerUuids)); + + return vos; + } else if (parentIssuer.equals(IpRangeVO.class.getSimpleName())) { + List vos = vrMgr.applianceVmsToBeDeletedByIpRanges(applianceVmVOS, parentIssuerUuids); + applianceVmVOS.removeAll(vos); + toDeleteNics.addAll(VmNicInventory.valueOf(vrMgr.applianceVmsToDeleteNicByIpRanges(applianceVmVOS, parentIssuerUuids))); + + return vos; + } else { + return applianceVmVOS; + } + } } From b2f4bffc2cc98043f9ab3c8968a9820f6255c04e Mon Sep 17 00:00:00 2001 From: lianghy Date: Thu, 20 Nov 2025 17:48:31 +0800 Subject: [PATCH 611/737] [conf]: bump version to 5.4.6 DBImpact Resolves: ZSTAC-80020 Change-Id: I68666f6f7074636c6d7478796e73676d6c727863 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index b8ac796c958..8577c9efcfb 100755 --- a/VERSION +++ b/VERSION @@ -1,3 +1,3 @@ MAJOR=5 MINOR=4 -UPDATE=2 +UPDATE=6 From 7f38521d77c5a033c798bf6e4707fa32fe86ed3e Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 21 Nov 2025 17:21:39 +0800 Subject: [PATCH 612/737] [sdk]: Update sdk Resolves: ZSTAC-74156 Change-Id: I78646174636d676d627467786c7266756f746270 --- .../main/java/org/zstack/sdk/MdevDeviceSpecInventory.java | 8 ++++++++ .../main/java/org/zstack/sdk/PciDeviceSpecInventory.java | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/MdevDeviceSpecInventory.java b/sdk/src/main/java/org/zstack/sdk/MdevDeviceSpecInventory.java index 0360c59dbd0..c3b2fc5b0ea 100644 --- a/sdk/src/main/java/org/zstack/sdk/MdevDeviceSpecInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/MdevDeviceSpecInventory.java @@ -77,4 +77,12 @@ public java.sql.Timestamp getLastOpDate() { return this.lastOpDate; } + public java.lang.Integer maxAvailableDevicesPerHost; + public void setMaxAvailableDevicesPerHost(java.lang.Integer maxAvailableDevicesPerHost) { + this.maxAvailableDevicesPerHost = maxAvailableDevicesPerHost; + } + public java.lang.Integer getMaxAvailableDevicesPerHost() { + return this.maxAvailableDevicesPerHost; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/PciDeviceSpecInventory.java b/sdk/src/main/java/org/zstack/sdk/PciDeviceSpecInventory.java index 99b34405fe4..6bead4ce0d9 100644 --- a/sdk/src/main/java/org/zstack/sdk/PciDeviceSpecInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/PciDeviceSpecInventory.java @@ -157,4 +157,12 @@ public java.sql.Timestamp getLastOpDate() { return this.lastOpDate; } + public java.lang.Integer maxAvailableDevicesPerHost; + public void setMaxAvailableDevicesPerHost(java.lang.Integer maxAvailableDevicesPerHost) { + this.maxAvailableDevicesPerHost = maxAvailableDevicesPerHost; + } + public java.lang.Integer getMaxAvailableDevicesPerHost() { + return this.maxAvailableDevicesPerHost; + } + } From ed4dca59b0dfd1da18afc72be9fd6593b1de3e15 Mon Sep 17 00:00:00 2001 From: "xinhao.huang" Date: Fri, 21 Nov 2025 17:29:42 +0800 Subject: [PATCH 613/737] [conf]: update model service's framework in sql schema DBImpact Resolves: ZSTAC-79819 Change-Id: I656a74706867656168667775716869766e736d64 --- conf/db/upgrade/V5.4.6__schema.sql | 38 ++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/conf/db/upgrade/V5.4.6__schema.sql b/conf/db/upgrade/V5.4.6__schema.sql index 138893de85b..01d1d006e96 100644 --- a/conf/db/upgrade/V5.4.6__schema.sql +++ b/conf/db/upgrade/V5.4.6__schema.sql @@ -55,3 +55,41 @@ CALL fixUsedIpGatewayAndNetmask(); -- Drop the procedure after use DROP PROCEDURE IF EXISTS fixUsedIpGatewayAndNetmask; + + +-- Update ModelServiceVO framework values +DROP PROCEDURE IF EXISTS updateModelServiceFramework; + +DELIMITER $$ + +CREATE PROCEDURE updateModelServiceFramework() +BEGIN + DECLARE v_table_exists INT DEFAULT 0; + + -- Check if ModelServiceVO table and framework column exist + SELECT COUNT(*) INTO v_table_exists + FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'ModelServiceVO' + AND COLUMN_NAME = 'framework'; + + IF v_table_exists > 0 THEN + -- Update llama.cpp to LlamaCpp + UPDATE ModelServiceVO + SET framework = 'LlamaCpp' + WHERE framework = 'llama.cpp'; + + -- Update sentence_transformers to SentenceTransformers + UPDATE ModelServiceVO + SET framework = 'SentenceTransformers' + WHERE framework = 'sentence_transformers'; + END IF; +END$$ + +DELIMITER ; + +-- Execute the procedure +CALL updateModelServiceFramework(); + +-- Drop the procedure after use +DROP PROCEDURE IF EXISTS updateModelServiceFramework; From e8785c0af31aec2b164b9525fec7c28cf1c66d0f Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 25 Nov 2025 10:43:19 +0800 Subject: [PATCH 614/737] [conf]: Upgrade xtts and sdxl-turbo's architecture type DBImpact Resolves: ZSTAC-79822 Change-Id: I757a69696276717870766863617778737165746a --- conf/db/upgrade/V5.4.6__schema.sql | 3 +++ 1 file changed, 3 insertions(+) diff --git a/conf/db/upgrade/V5.4.6__schema.sql b/conf/db/upgrade/V5.4.6__schema.sql index 01d1d006e96..d5d23d63c24 100644 --- a/conf/db/upgrade/V5.4.6__schema.sql +++ b/conf/db/upgrade/V5.4.6__schema.sql @@ -93,3 +93,6 @@ CALL updateModelServiceFramework(); -- Drop the procedure after use DROP PROCEDURE IF EXISTS updateModelServiceFramework; + +UPDATE ModelVO SET architectureType = 'xtts-v2' WHERE uuid = '39280569b4e0490fb581f6ab98e76400'; +UPDATE ModelVO SET architectureType = 'sdxl-turbo' WHERE uuid = '6a720c01935f4f9ea09f81bde722ee42'; From c682625ece536b3f624920e561081a31c3ac2e8d Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 25 Nov 2025 16:21:41 +0800 Subject: [PATCH 615/737] [sdk]: Update sdk Resolves: ZSTAC-78793 Change-Id: I66636873787076786973697a72766c6c75746873 --- .../org/zstack/sdk/AddModelServiceAction.java | 6 ++++++ .../org/zstack/sdk/CloneModelServiceAction.java | 6 ++++++ .../org/zstack/sdk/ModelServiceInventory.java | 16 ++++++++++++++++ .../org/zstack/sdk/UpdateModelServiceAction.java | 6 ++++++ 4 files changed, 34 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index 01d2193ea65..3062782ee51 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -55,6 +55,12 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String startCommand; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerCommand; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerArgs; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String pythonVersion; diff --git a/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java index 37bad5494f9..d8a876b518c 100644 --- a/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java @@ -49,6 +49,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String startCommand; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerCommand; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerArgs; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String pythonVersion; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java index a588313c065..3b0d6495722 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java @@ -148,6 +148,22 @@ public java.lang.String getStartCommand() { return this.startCommand; } + public java.lang.String containerCommand; + public void setContainerCommand(java.lang.String containerCommand) { + this.containerCommand = containerCommand; + } + public java.lang.String getContainerCommand() { + return this.containerCommand; + } + + public java.lang.String containerArgs; + public void setContainerArgs(java.lang.String containerArgs) { + this.containerArgs = containerArgs; + } + public java.lang.String getContainerArgs() { + return this.containerArgs; + } + public boolean supportDistributed; public void setSupportDistributed(boolean supportDistributed) { this.supportDistributed = supportDistributed; diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java index cc8d6852576..131e4e3b9f4 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java @@ -49,6 +49,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String startCommand; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerCommand; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerArgs; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String pythonVersion; From a9e47e9c1d4f3da2db5fbb1f0723b4f8743c18f8 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 25 Nov 2025 17:36:53 +0800 Subject: [PATCH 616/737] [conf]: Fix update schema DBImpact Resolves: ZSTAC-78793 Change-Id: I65786775617a6b746276756f636c79616b7a7475 --- conf/db/upgrade/V5.4.6__schema.sql | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/conf/db/upgrade/V5.4.6__schema.sql b/conf/db/upgrade/V5.4.6__schema.sql index d5d23d63c24..2343c34c7cd 100644 --- a/conf/db/upgrade/V5.4.6__schema.sql +++ b/conf/db/upgrade/V5.4.6__schema.sql @@ -96,3 +96,7 @@ DROP PROCEDURE IF EXISTS updateModelServiceFramework; UPDATE ModelVO SET architectureType = 'xtts-v2' WHERE uuid = '39280569b4e0490fb581f6ab98e76400'; UPDATE ModelVO SET architectureType = 'sdxl-turbo' WHERE uuid = '6a720c01935f4f9ea09f81bde722ee42'; + +CALL ADD_COLUMN('ModelServiceVO', 'containerArgs', 'TEXT', 1, NULL); +CALL ADD_COLUMN('ModelServiceVO', 'containerCommand', 'TEXT', 1, NULL); + From f3cf7294da6c57677095dfb6f9d4aaeed9035e1d Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Tue, 25 Nov 2025 17:53:30 +0800 Subject: [PATCH 617/737] [zbs]: reload if addon info null Resolves: ZSTAC-80049 Change-Id: I726a616d6569716c78756f7562666f6d6767657a --- .../main/java/org/zstack/storage/zbs/ZbsStorageController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index dd1861e58fe..3d7a0b67457 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -553,7 +553,7 @@ public StorageCapabilities reportCapabilities() { @Override public String allocateSpace(AllocateSpaceSpec aspec) { - if (config == null) { + if (config == null || addonInfo == null) { reloadDbInfo(); } From 48ecbf2bd2588d6d02d34adcb44212f8596ea5a4 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Tue, 25 Nov 2025 21:33:02 +0800 Subject: [PATCH 618/737] [testlib]: update libcbd on deploying client Resolves: ZSTAC-79057 Change-Id: I6471766d6d786871777977736e7073726e64776a --- .../kvm/ExternalPrimaryStorageKvmFactory.java | 7 +- .../storage/zbs/ZbsStorageController.java | 119 ++++++++++++++---- .../testlib/ExternalPrimaryStorageSpec.groovy | 7 ++ 3 files changed, 110 insertions(+), 23 deletions(-) diff --git a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/kvm/ExternalPrimaryStorageKvmFactory.java b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/kvm/ExternalPrimaryStorageKvmFactory.java index e8b55f23437..c6eb04a8557 100644 --- a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/kvm/ExternalPrimaryStorageKvmFactory.java +++ b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/kvm/ExternalPrimaryStorageKvmFactory.java @@ -131,7 +131,12 @@ public void run(FlowTrigger trigger, Map data) { deployClient(context, extPss, new WhileDoneCompletion(trigger) { @Override public void done(ErrorCodeList errorCodeList) { - trigger.next(); + if (errorCodeList.getCauses().isEmpty()) { + trigger.next(); + } else { + // todo rollback + trigger.fail(errorCodeList.getCauses().get(0)); + } } }); } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 3d7a0b67457..01d67f7deed 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -9,10 +9,12 @@ import org.zstack.cbd.kvm.CbdVolumeTo; import org.zstack.compute.host.HostGlobalConfig; import org.zstack.core.CoreGlobalProperty; +import org.zstack.core.ansible.AnsibleGlobalProperty; import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; import org.zstack.core.db.SQL; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; @@ -99,6 +101,7 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar public static final String ROLLBACK_SNAPSHOT_PATH = "/zbs/primarystorage/snapshot/rollback"; public static final String CHECK_HOST_STORAGE_CONNECTION_PATH = "/zbs/primarystorage/check/host/connection"; public static final String GET_VOLUME_CLIENTS_PATH = "/zbs/primarystorage/volume/clients"; + public static final String UPDATE_HOST_DEPENDENCY_PATH = "/zbs/primarystorage/host/updatedependency"; private static final StorageCapabilities capabilities = new StorageCapabilities(); @@ -187,28 +190,92 @@ public List getActiveVolumesLocation(HostInventory h) { @Override public void deployClient(HostInventory h, Completion comp) { - KVMHostVO host = org.zstack.core.db.Q.New(KVMHostVO.class).eq(KVMHostVO_.uuid, h.getUuid()).find(); - if (host == null) { - comp.fail(operr("cannot found kvm host[uuid:%s], unable to deploy client", h.getUuid())); - return; - } - - DeployClientCmd cmd = new DeployClientCmd(); - cmd.setIp(h.getManagementIp()); - cmd.setPort(host.getPort()); - cmd.setUsername(host.getUsername()); - cmd.setPassword(host.getPassword()); - httpCall(DEPLOY_CLIENT_PATH, cmd, DeployClientRsp.class, new ReturnValueCompletion(comp) { + FlowChain chain = FlowChainBuilder.newShareFlowChain(); + chain.setName(String.format("deploy-zbs-client-on-host-%s", h.getUuid())); + chain.then(new ShareFlow() { @Override - public void success(DeployClientRsp returnValue) { - comp.success(); - } + public void setup() { + flow(new NoRollbackFlow() { + String __name__ = "deploy-client"; - @Override - public void fail(ErrorCode errorCode) { - comp.fail(errorCode); + @Override + public void run(FlowTrigger trigger, Map data) { + KVMHostVO host = Q.New(KVMHostVO.class).eq(KVMHostVO_.uuid, h.getUuid()).find(); + if (host == null) { + trigger.fail(operr("cannot found kvm host[uuid:%s], unable to deploy client", h.getUuid())); + return; + } + + DeployClientCmd cmd = new DeployClientCmd(); + cmd.setIp(h.getManagementIp()); + cmd.setPort(host.getPort()); + cmd.setUsername(host.getUsername()); + cmd.setPassword(host.getPassword()); + httpCall(DEPLOY_CLIENT_PATH, cmd, DeployClientRsp.class, new ReturnValueCompletion(trigger) { + @Override + public void success(DeployClientRsp returnValue) { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + + flow(new NoRollbackFlow() { + String __name__ = "update-host-client-dependency"; + + @Override + public void run(FlowTrigger trigger, Map data) { + UpdateHostDependencyCmd cmd = new UpdateHostDependencyCmd(); + cmd.updatePackages = "libcbd"; + cmd.zstackRepo = AnsibleGlobalProperty.ZSTACK_REPO; + + KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); + msg.setCommand(cmd); + msg.setHostUuid(h.getUuid()); + msg.setPath(UPDATE_HOST_DEPENDENCY_PATH); + msg.setNoStatusCheck(true); + bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, msg.getHostUuid()); + bus.send(msg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + return; + } + + KVMHostAsyncHttpCallReply hreply = reply.castReply(); + UpdateHostDependencyRsp rsp = hreply.toResponse(UpdateHostDependencyRsp.class); + if (!rsp.isSuccess()) { + trigger.fail(operr(rsp.getError())); + return; + } + + trigger.next(); + } + }); + } + }); + + done(new FlowDoneHandler(comp) { + @Override + public void handle(Map data) { + comp.success(); + } + }); + + error(new FlowErrorHandler(comp) { + @Override + public void handle(ErrorCode errCode, Map data) { + comp.fail(errCode); + } + }); } - }); + }).start(); } @Override @@ -357,7 +424,7 @@ public void fail(ErrorCode errorCode) { flow(new NoRollbackFlow() { String __name__ = "deploy-client"; - List refs = org.zstack.core.db.Q.New(PrimaryStorageClusterRefVO.class) + List refs = Q.New(PrimaryStorageClusterRefVO.class) .eq(PrimaryStorageClusterRefVO_.primaryStorageUuid, self.getUuid()) .list(); @@ -372,12 +439,12 @@ public void run(FlowTrigger trigger, Map data) { .map(PrimaryStorageClusterRefVO::getClusterUuid) .collect(Collectors.toList()); - List hosts = org.zstack.core.db.Q.New(HostVO.class) + List hosts = Q.New(HostVO.class) .in(HostAO_.clusterUuid, clusterUuids) .list(); new While<>(hosts).each((h, comp) -> { - KVMHostVO host = org.zstack.core.db.Q.New(KVMHostVO.class).eq(KVMHostVO_.uuid, h.getUuid()).find(); + KVMHostVO host = Q.New(KVMHostVO.class).eq(KVMHostVO_.uuid, h.getUuid()).find(); if (host == null) { comp.addError(operr("cannot found kvm host[uuid:%s], unable to deploy client", h.getUuid())); comp.allDone(); @@ -1897,6 +1964,14 @@ public void setPath(String path) { public static class CheckHostStorageConnectionRsp extends AgentResponse { } + public static class UpdateHostDependencyCmd extends AgentCommand { + public String updatePackages; + public String zstackRepo; + } + + public static class UpdateHostDependencyRsp extends AgentResponse { + } + public static class AgentResponse extends ZbsMdsBase.AgentResponse { } diff --git a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy index 356a9641f10..19dedb00cce 100644 --- a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy @@ -71,6 +71,13 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { return rsp } + simulator(ZbsStorageController.UPDATE_HOST_DEPENDENCY_PATH) { HttpEntity e, EnvSpec spec -> + def rsp = new ZbsStorageController.UpdateHostDependencyRsp() + rsp.success = true + + return rsp + } + simulator(ZbsStorageController.GET_FACTS_PATH) { HttpEntity e, EnvSpec spec -> ZbsStorageController.GetFactsCmd cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.GetFactsCmd.class) ExternalPrimaryStorageSpec zspec = spec.specByUuid(cmd.uuid) From 48ec0ecb5da210b99bf6ab4c8bc5a761a2975e60 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 25 Nov 2025 18:13:16 +0800 Subject: [PATCH 619/737] [sdk]: Update sdk Resolves: ZSTAC-80119 Change-Id: I6966616b68627679756b6a6e79686f6972716b67 --- .../sdk/UpdateModelServiceInstanceGroupAction.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java index 0862c561bf0..18e3b183092 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java @@ -40,6 +40,15 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.Map startupParameters; + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceLivez; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceReadyz; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer serviceBootupTime; + @Param(required = false) public java.util.List systemTags; From ae91ababe7af489c6b713e9ee4b341783cca3385 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Sat, 29 Nov 2025 13:22:47 +0800 Subject: [PATCH 620/737] [sdk]: Update sdk Resolves: ZSTAC-80119 Change-Id: I73726b787377706261676f6874726f6e61696f62 --- .../sdk/DeployAppDevelopmentServiceAction.java | 6 ++++++ .../zstack/sdk/DeployModelEvalServiceAction.java | 6 ++++++ .../org/zstack/sdk/DeployModelServiceAction.java | 6 ++++++ ...MatchModelServiceTemplateWithModelAction.java | 6 ++++++ .../main/java/org/zstack/sdk/ModelService.java | 16 ++++++++++++++++ 5 files changed, 40 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java index 536310c17d3..2ab7e2b846e 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java @@ -79,6 +79,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer serviceBootUptime; + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceLivez; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceReadyz; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String rootDiskOfferingUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java index dd3c2933a19..bf4c6abc18b 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java @@ -130,6 +130,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer serviceBootUptime; + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceLivez; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceReadyz; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String rootDiskOfferingUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java index 9c73bee8daa..61ee4158818 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java @@ -79,6 +79,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer serviceBootUptime; + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceLivez; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceReadyz; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String rootDiskOfferingUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java b/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java index 7d6d97cb2c8..be243bba4d3 100644 --- a/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java @@ -88,6 +88,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer serviceBootUptime; + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceLivez; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceReadyz; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String rootDiskOfferingUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelService.java b/sdk/src/main/java/org/zstack/sdk/ModelService.java index 60c82ea6840..cc765e67495 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelService.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelService.java @@ -172,6 +172,22 @@ public java.lang.Integer getServiceBootUptime() { return this.serviceBootUptime; } + public java.lang.String serviceLivez; + public void setServiceLivez(java.lang.String serviceLivez) { + this.serviceLivez = serviceLivez; + } + public java.lang.String getServiceLivez() { + return this.serviceLivez; + } + + public java.lang.String serviceReadyz; + public void setServiceReadyz(java.lang.String serviceReadyz) { + this.serviceReadyz = serviceReadyz; + } + public java.lang.String getServiceReadyz() { + return this.serviceReadyz; + } + public java.lang.String rootDiskOfferingUuid; public void setRootDiskOfferingUuid(java.lang.String rootDiskOfferingUuid) { this.rootDiskOfferingUuid = rootDiskOfferingUuid; From c25cfa17c8c6d200345ef90b6f591530982e9bfb Mon Sep 17 00:00:00 2001 From: "haoyu.ding" Date: Mon, 1 Dec 2025 21:39:03 +0800 Subject: [PATCH 621/737] [ceph]: change default password Resolves: ZSTAC-79936 Change-Id: I65657166766872677463796e796d6f6f78746964 --- conf/globalConfig/ceph.xml | 2 +- .../test/integration/storage/ceph/CephOperationCase.groovy | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/globalConfig/ceph.xml b/conf/globalConfig/ceph.xml index be1993a594f..ccde2ee2806 100755 --- a/conf/globalConfig/ceph.xml +++ b/conf/globalConfig/ceph.xml @@ -107,7 +107,7 @@ sds.admin.password the password of ceph admin user - password + Admin@123 ceph java.lang.String diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/ceph/CephOperationCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/ceph/CephOperationCase.groovy index eb6ddc82962..b131d740241 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/ceph/CephOperationCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/ceph/CephOperationCase.groovy @@ -263,7 +263,7 @@ class CephOperationCase extends SubCase { .select(GlobalConfigVO_.value) .eq(GlobalConfigVO_.name, "sds.admin.password") .eq(GlobalConfigVO_.category, "ceph") - .findValue() == "password" + .findValue() == "Admin@123" updateGlobalConfig { category = CephGlobalConfig.CATEGORY From cce827da4c006530f6741afe9c71395026fd213f Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 2 Dec 2025 13:52:27 +0800 Subject: [PATCH 622/737] [conf]: Add isolated field to gpu and gpu spec DBImpact Resolves: ZSTAC-79981 Change-Id: I706a65776377706f73766f62786e667472677a6c --- conf/db/upgrade/V5.4.6__schema.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/db/upgrade/V5.4.6__schema.sql b/conf/db/upgrade/V5.4.6__schema.sql index 2343c34c7cd..1905c878f67 100644 --- a/conf/db/upgrade/V5.4.6__schema.sql +++ b/conf/db/upgrade/V5.4.6__schema.sql @@ -100,3 +100,5 @@ UPDATE ModelVO SET architectureType = 'sdxl-turbo' WHERE uuid = '6a720c01935f4f9 CALL ADD_COLUMN('ModelServiceVO', 'containerArgs', 'TEXT', 1, NULL); CALL ADD_COLUMN('ModelServiceVO', 'containerCommand', 'TEXT', 1, NULL); +CALL ADD_COLUMN('GpuDeviceVO', 'isolated', 'TINYINT(1)', 1, NULL); +CALL ADD_COLUMN('GpuDeviceSpecVO', 'isolated', 'TINYINT(1)', 1, NULL); From 7f5c5cfa43589de62cb346635636f756dcb372f5 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 2 Dec 2025 16:49:32 +0800 Subject: [PATCH 623/737] [sdk]: Update sdk Resolves: ZSTAC-79981 Change-Id: I766568646477627a766c6570617871786a776675 --- .../org/zstack/sdk/GpuDeviceSpecInventory.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/GpuDeviceSpecInventory.java b/sdk/src/main/java/org/zstack/sdk/GpuDeviceSpecInventory.java index 24d0532f3cb..e043f206e5b 100644 --- a/sdk/src/main/java/org/zstack/sdk/GpuDeviceSpecInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/GpuDeviceSpecInventory.java @@ -12,4 +12,20 @@ public java.lang.Long getMemory() { return this.memory; } + public java.lang.String gpuType; + public void setGpuType(java.lang.String gpuType) { + this.gpuType = gpuType; + } + public java.lang.String getGpuType() { + return this.gpuType; + } + + public java.lang.Boolean isolated; + public void setIsolated(java.lang.Boolean isolated) { + this.isolated = isolated; + } + public java.lang.Boolean getIsolated() { + return this.isolated; + } + } From fa231786854cf49e31c7a67eeb9d4c0e242e96d1 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 3 Dec 2025 14:50:38 +0800 Subject: [PATCH 624/737] [sdk]: Fix sdk and upgrade gpuVendor field Resolves: ZSTAC-80203 Change-Id: I73736d736c7775677273766572787462756d7a71 --- conf/db/upgrade/V5.4.6__schema.sql | 6 ++++++ sdk/src/main/java/org/zstack/sdk/GpuVendor.java | 10 +++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/conf/db/upgrade/V5.4.6__schema.sql b/conf/db/upgrade/V5.4.6__schema.sql index 1905c878f67..fd9e2c31f48 100644 --- a/conf/db/upgrade/V5.4.6__schema.sql +++ b/conf/db/upgrade/V5.4.6__schema.sql @@ -100,5 +100,11 @@ UPDATE ModelVO SET architectureType = 'sdxl-turbo' WHERE uuid = '6a720c01935f4f9 CALL ADD_COLUMN('ModelServiceVO', 'containerArgs', 'TEXT', 1, NULL); CALL ADD_COLUMN('ModelServiceVO', 'containerCommand', 'TEXT', 1, NULL); +-- Upgrade gpuVendor field in ModelServiceGpuVendorVO +Update ModelServiceGpuVendorVO set gpuVendor = 'Huawei' where gpuVendor = 'HUAWEI'; +Update ModelServiceGpuVendorVO set gpuVendor = 'Haiguang' where gpuVendor = 'HAIGUANG'; +Update ModelServiceGpuVendorVO set gpuVendor = 'TianShu' where gpuVendor = 'TIANSHU'; +Update ModelServiceGpuVendorVO set gpuVendor = 'Intel' where gpuVendor = 'INTEL'; + CALL ADD_COLUMN('GpuDeviceVO', 'isolated', 'TINYINT(1)', 1, NULL); CALL ADD_COLUMN('GpuDeviceSpecVO', 'isolated', 'TINYINT(1)', 1, NULL); diff --git a/sdk/src/main/java/org/zstack/sdk/GpuVendor.java b/sdk/src/main/java/org/zstack/sdk/GpuVendor.java index ef072743742..d5f4842085e 100644 --- a/sdk/src/main/java/org/zstack/sdk/GpuVendor.java +++ b/sdk/src/main/java/org/zstack/sdk/GpuVendor.java @@ -1,11 +1,11 @@ package org.zstack.sdk; public enum GpuVendor { - INTEL, + Intel, AMD, NVIDIA, - HAIGUANG, - HUAWEI, - TIANSHU, - OTHER, + Haiguang, + Huawei, + TianShu, + Other, } From 18692ef672cf7bfdf84888b91606b865c856998e Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 3 Dec 2025 14:57:50 +0800 Subject: [PATCH 625/737] [conf]: Fix model services whose cpu arch missed in db DBImpact Resolves: ZSTAC-80334 Change-Id: I6d7470667a6b666a617575707474626a626a7a68 --- conf/db/upgrade/V5.4.6__schema.sql | 100 +++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/conf/db/upgrade/V5.4.6__schema.sql b/conf/db/upgrade/V5.4.6__schema.sql index 1905c878f67..77c3a4675d4 100644 --- a/conf/db/upgrade/V5.4.6__schema.sql +++ b/conf/db/upgrade/V5.4.6__schema.sql @@ -102,3 +102,103 @@ CALL ADD_COLUMN('ModelServiceVO', 'containerCommand', 'TEXT', 1, NULL); CALL ADD_COLUMN('GpuDeviceVO', 'isolated', 'TINYINT(1)', 1, NULL); CALL ADD_COLUMN('GpuDeviceSpecVO', 'isolated', 'TINYINT(1)', 1, NULL); + +DELIMITER $$ + +DROP PROCEDURE IF EXISTS fix_missing_architecture_records$$ + +CREATE PROCEDURE fix_missing_architecture_records() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE v_model_service_uuid VARCHAR(32); + DECLARE v_architecture VARCHAR(32); + DECLARE v_exists INT; + + -- Cursor to find all model services that have templates but missing architecture records + DECLARE service_cursor CURSOR FOR + SELECT DISTINCT mst.modelServiceUuid, mst.cpuArchitecture + FROM ModelServiceTemplateVO mst + WHERE NOT EXISTS ( + SELECT 1 + FROM ModelServiceCpuArchitectureVO msca + WHERE msca.modelServiceUuid = mst.modelServiceUuid + AND msca.architecture = mst.cpuArchitecture + ) + ORDER BY mst.modelServiceUuid, mst.cpuArchitecture; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + -- Start transaction + START TRANSACTION; + + -- Create a temporary table to store statistics + CREATE TEMPORARY TABLE IF NOT EXISTS fix_stats ( + total_services INT DEFAULT 0, + total_records_added INT DEFAULT 0 + ); + + INSERT INTO fix_stats VALUES (0, 0); + + -- Open cursor and process each missing architecture record + OPEN service_cursor; + + read_loop: LOOP + FETCH service_cursor INTO v_model_service_uuid, v_architecture; + + IF done THEN + LEAVE read_loop; + END IF; + + -- Double check if the record doesn't exist (to avoid duplicates) + SELECT COUNT(*) INTO v_exists + FROM ModelServiceCpuArchitectureVO + WHERE modelServiceUuid = v_model_service_uuid + AND architecture = v_architecture; + + IF v_exists = 0 THEN + -- Insert the missing architecture record + INSERT INTO ModelServiceCpuArchitectureVO (modelServiceUuid, architecture, lastOpDate, createDate) + VALUES ( + v_model_service_uuid, + v_architecture, + CURRENT_TIMESTAMP(3), + CURRENT_TIMESTAMP(3) + ); + + -- Update statistics + UPDATE fix_stats SET total_records_added = total_records_added + 1; + + -- Log the fix + SELECT CONCAT('Fixed: Added architecture record [', v_architecture, '] for model service [', v_model_service_uuid, ']') AS log_message; + END IF; + + END LOOP; + + CLOSE service_cursor; + + -- Count total affected services + UPDATE fix_stats SET total_services = ( + SELECT COUNT(DISTINCT modelServiceUuid) + FROM ModelServiceCpuArchitectureVO + WHERE createDate >= (SELECT MIN(createDate) FROM (SELECT createDate FROM ModelServiceCpuArchitectureVO ORDER BY createDate DESC LIMIT 1000) AS recent) + ); + + -- Display summary + SELECT + total_records_added AS 'Total Architecture Records Added', + (SELECT COUNT(DISTINCT modelServiceUuid) FROM ModelServiceTemplateVO) AS 'Total Model Services with Templates', + (SELECT COUNT(DISTINCT modelServiceUuid) FROM ModelServiceCpuArchitectureVO) AS 'Total Model Services with Architecture Records' + FROM fix_stats; + + -- Cleanup + DROP TEMPORARY TABLE IF EXISTS fix_stats; + + -- Commit transaction + COMMIT; + + SELECT 'Fix completed successfully!' AS status; +END$$ + +DELIMITER ; + +CALL fix_missing_architecture_records(); From 1372396968f48d9e2bf70ce9964edc5866737d1b Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 4 Dec 2025 15:32:47 +0800 Subject: [PATCH 626/737] [sdk]: Update sdk and add new fields Resolves: ZSTAC-78057 Change-Id: I67617a667567756a7578706a6c78646e6267756d --- conf/db/upgrade/V5.4.6__schema.sql | 4 ++++ .../main/java/org/zstack/sdk/AddModelAction.java | 6 ++++++ .../main/java/org/zstack/sdk/ModelInventory.java | 16 ++++++++++++++++ .../java/org/zstack/sdk/UpdateModelAction.java | 6 ++++++ 4 files changed, 32 insertions(+) diff --git a/conf/db/upgrade/V5.4.6__schema.sql b/conf/db/upgrade/V5.4.6__schema.sql index 9ee1050de7b..b7280a5ac3a 100644 --- a/conf/db/upgrade/V5.4.6__schema.sql +++ b/conf/db/upgrade/V5.4.6__schema.sql @@ -208,3 +208,7 @@ END$$ DELIMITER ; CALL fix_missing_architecture_records(); + +-- Add new gpu constraint fields +CALL ADD_COLUMN('ModelVO', 'recommendedGpuNum', 'VARCHAR(256)', 1, NULL); +CALL ADD_COLUMN('ModelVO', 'gpuConstraintDescription', 'VARCHAR(512)', 1, NULL); diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelAction.java index 2dc39539fb1..a43fcee825b 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelAction.java @@ -61,6 +61,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List modelServiceUuids; + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String recommendedGpuNum; + + @Param(required = false, maxLength = 512, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String gpuConstraintDescription; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java index a2ff03462f9..ec46d527eec 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java @@ -116,6 +116,22 @@ public java.lang.Long getMinGpuMemory() { return this.minGpuMemory; } + public java.util.List recommendedGpuNum; + public void setRecommendedGpuNum(java.util.List recommendedGpuNum) { + this.recommendedGpuNum = recommendedGpuNum; + } + public java.util.List getRecommendedGpuNum() { + return this.recommendedGpuNum; + } + + public java.lang.String gpuConstraintDescription; + public void setGpuConstraintDescription(java.lang.String gpuConstraintDescription) { + this.gpuConstraintDescription = gpuConstraintDescription; + } + public java.lang.String getGpuConstraintDescription() { + return this.gpuConstraintDescription; + } + public java.lang.String versionSemver; public void setVersionSemver(java.lang.String versionSemver) { this.versionSemver = versionSemver; diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java index 057e11a49a7..1d440e5787b 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java @@ -46,6 +46,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List modelClassifications; + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String recommendedGpuNum; + + @Param(required = false, maxLength = 512, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String gpuConstraintDescription; + @Param(required = false) public java.util.List systemTags; From 9741abc12d31168e987130dde608338f249269be Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 4 Dec 2025 18:22:29 +0800 Subject: [PATCH 627/737] [compute]: Export public method for static ip case Resolves: ZSTAC-80381 Change-Id: I7673656d7769756d706b736467797868666f7a69 --- .../org/zstack/compute/vm/StaticIpOperator.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/vm/StaticIpOperator.java b/compute/src/main/java/org/zstack/compute/vm/StaticIpOperator.java index 183b095154a..0fe152196f5 100755 --- a/compute/src/main/java/org/zstack/compute/vm/StaticIpOperator.java +++ b/compute/src/main/java/org/zstack/compute/vm/StaticIpOperator.java @@ -318,8 +318,7 @@ public void validateSystemTagInCreateMessage(APICreateMessage msg) { validateSystemTagInApiMessage(msg); } - public void validateSystemTagInApiMessage(APIMessage msg) { - Map staticIps = getNicNetworkInfoBySystemTag(msg.getSystemTags()); + public List fillUpStaticIpInfoToVmNics(Map staticIps) { List newSystags = new ArrayList<>(); for (Map.Entry e : staticIps.entrySet()) { String l3Uuid = e.getKey(); @@ -350,7 +349,7 @@ public void validateSystemTagInApiMessage(APIMessage msg) { )); } else if (!nicIp.ipv4Netmask.equals(ipRangeVO.getNetmask())) { throw new ApiMessageInterceptionException(operr("netmask error, expect: %s, got: %s", - ipRangeVO.getNetmask(), nicIp.ipv4Netmask)); + ipRangeVO.getNetmask(), nicIp.ipv4Netmask)); } if (StringUtils.isEmpty(nicIp.ipv4Gateway)) { @@ -397,10 +396,16 @@ public void validateSystemTagInApiMessage(APIMessage msg) { } } } + } - if (!newSystags.isEmpty()) { - msg.getSystemTags().addAll(newSystags); - } + return newSystags; + } + + public void validateSystemTagInApiMessage(APIMessage msg) { + Map staticIps = getNicNetworkInfoBySystemTag(msg.getSystemTags()); + List newSystags = fillUpStaticIpInfoToVmNics(staticIps); + if (!newSystags.isEmpty()) { + msg.getSystemTags().addAll(newSystags); } } From 2048e5bf807ff7aa2563952479b9351e94f4bc31 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 4 Dec 2025 18:56:55 +0800 Subject: [PATCH 628/737] [conf]: Fix missing records in ModelServiceGpuVendorVO DBImpact Resolves: ZSTAC-80203 Change-Id: I6473736b7a716b77796b6b796467716e7062627a --- conf/db/upgrade/V5.4.6__schema.sql | 113 +++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) diff --git a/conf/db/upgrade/V5.4.6__schema.sql b/conf/db/upgrade/V5.4.6__schema.sql index b7280a5ac3a..d9fae10108f 100644 --- a/conf/db/upgrade/V5.4.6__schema.sql +++ b/conf/db/upgrade/V5.4.6__schema.sql @@ -212,3 +212,116 @@ CALL fix_missing_architecture_records(); -- Add new gpu constraint fields CALL ADD_COLUMN('ModelVO', 'recommendedGpuNum', 'VARCHAR(256)', 1, NULL); CALL ADD_COLUMN('ModelVO', 'gpuConstraintDescription', 'VARCHAR(512)', 1, NULL); + +DELIMITER $$ + +CREATE PROCEDURE update_system_model_service_templates() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE model_name VARCHAR(255); + DECLARE gpu_vendor_name VARCHAR(32); + DECLARE py_version VARCHAR(255); + DECLARE cuda_version VARCHAR(255); + DECLARE cann_version VARCHAR(255); + DECLARE fw_version VARCHAR(255); + DECLARE service_uuid VARCHAR(32); + + DECLARE templates_cursor CURSOR FOR + SELECT name, vendor, pythonVersion, cudaVersion, cannVersion, frameworkVersion FROM system_models_templates_to_update; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + CREATE TEMPORARY TABLE IF NOT EXISTS system_models_templates_to_update ( + name VARCHAR(255), + vendor VARCHAR(32), + pythonVersion VARCHAR(255), + cudaVersion VARCHAR(255), + cannVersion VARCHAR(255), + frameworkVersion VARCHAR(255) + ); + + INSERT INTO system_models_templates_to_update (name, vendor, pythonVersion, cudaVersion, cannVersion, frameworkVersion) VALUES + ('vLLM-0.7.2', 'NVIDIA', '3.10', '12.5', NULL, '0.7.2'), + ('vLLM-0.8.5', 'NVIDIA', '3.10', '12.5', NULL, '0.8.5'), + ('vLLM-0.9.2', 'NVIDIA', '3.10', '12.5', NULL, '0.9.2'), + ('vLLM-0.11.0', 'NVIDIA', '3.10', '12.5', NULL, '0.11.0'), + ('SGLang-0.4.9.post1', 'NVIDIA', '3.10', '12.5', NULL, '0.4.9.post1'), + ('SGLang-0.5.2', 'NVIDIA', '3.10', '12.5', NULL, '0.5.2'), + ('SGLang-0.5.4', 'NVIDIA', '3.10', '12.5', NULL, '0.5.4'), + ('Transformers-4.48.3', 'NVIDIA', '3.10', '12.5', NULL, '4.48.3'), + ('Transformers-4.57.1', 'NVIDIA', '3.10', '12.5', NULL, '4.57.1'), + ('Transformers-4.56.2', 'NVIDIA', '3.10', '12.5', NULL, '4.56.2'), + ('sentence_transformers-3.1.1', 'NVIDIA', '3.10', '12.5', NULL, '3.1.1'), + ('Diffusers-0.30.0', 'NVIDIA', '3.10', '12.5', NULL, '0.30.0'), + ('Diffusers-0.35.1', 'NVIDIA', '3.10', '12.5', NULL, '0.35.1'), + ('MindIE-2.0.RC1-910B', 'Huawei', '3.9', NULL, '8.0', '2.0.RC1'), + ('MindIE-2.1.RC1-910B', 'Huawei', '3.9', NULL, '8.0', '2.1.RC1'), + ('MindIE-2.1.RC2-910B', 'Huawei', '3.9', NULL, '8.0', '2.1.RC2'), + ('MindIE-1.0.0-310P', 'Huawei', '3.9', NULL, '7.0', '1.0.0'), + ('vLLM-Ascend-0.11.0.rc0', 'Huawei', '3.9', NULL, '8.0', '0.11.0.rc0'), + ('vLLM-0.5.0-HYGON-Z100L', 'Haiguang', '3.10', NULL, NULL, '0.5.0'), + ('vLLM-0.8.5-HYGON-K100-AI', 'Haiguang', '3.10', NULL, NULL, '0.8.5'), + ('vLLM-0.9.2-HYGON-K100-AI', 'Haiguang', '3.10', NULL, NULL, '0.9.2'), + ('vLLM-0.7.2-HYGON-K100-AI', 'Haiguang', '3.10', NULL, NULL, '0.7.2'), + ('MinerU2.5-2509', 'NVIDIA', '3.10', '12.5', NULL, '2.5'); + + OPEN templates_cursor; + update_template_loop: LOOP + FETCH templates_cursor INTO model_name, gpu_vendor_name, py_version, cuda_version, cann_version, fw_version; + IF done THEN + LEAVE update_template_loop; + END IF; + + SELECT COUNT(*) INTO @cnt FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND system = 1; + IF @cnt > 0 THEN + SELECT uuid INTO service_uuid FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND system = 1 LIMIT 1; + ELSE + SET service_uuid = NULL; + END IF; + + IF service_uuid IS NOT NULL THEN + SELECT COUNT(*) INTO @tmpl_cnt FROM `zstack`.`ModelServiceTemplateVO` WHERE `modelServiceUuid` = service_uuid; + IF @tmpl_cnt > 0 THEN + UPDATE `zstack`.`ModelServiceTemplateVO` SET + `pythonVersionSemver` = py_version, + `cudaVersion` = cuda_version, + `cannVersion` = cann_version, + `frameworkVersionSemver` = fw_version, + `gpuVendor` = gpu_vendor_name + WHERE `modelServiceUuid` = service_uuid; + SELECT CONCAT('INFO: Updated ModelServiceTemplateVO for service_uuid=', service_uuid, ', updated_rows=', ROW_COUNT()) AS msg; + ELSE + INSERT INTO `zstack`.`ModelServiceTemplateVO` (`uuid`, `modelServiceUuid`, `pythonVersionSemver`, `cudaVersion`, `cannVersion`, `frameworkVersionSemver`, `gpuVendor`) + VALUES (REPLACE(UUID(),'-',''), service_uuid, py_version, cuda_version, cann_version, fw_version, gpu_vendor_name); + SELECT CONCAT('INFO: Inserted ModelServiceTemplateVO for service_uuid=', service_uuid, ', inserted_rows=', ROW_COUNT()) AS msg; + END IF; + + -- Ensure ModelServiceGpuVendorVO record exists with the corresponding gpuVendor for this modelServiceUuid + SELECT COUNT(*) INTO @gv_cnt FROM `zstack`.`ModelServiceGpuVendorVO` + WHERE `modelServiceUuid` = service_uuid AND `gpuVendor` = gpu_vendor_name; + IF @gv_cnt = 0 THEN + INSERT INTO `zstack`.`ModelServiceGpuVendorVO` (`modelServiceUuid`, `gpuVendor`) + VALUES (service_uuid, gpu_vendor_name); + SELECT CONCAT('INFO: Inserted ModelServiceGpuVendorVO for service_uuid=', service_uuid, ', gpuVendor=', gpu_vendor_name) AS msg; + ELSE + SELECT CONCAT('INFO: ModelServiceGpuVendorVO exists for service_uuid=', service_uuid, ', gpuVendor=', gpu_vendor_name) AS msg; + END IF; + ELSE + SELECT CONCAT('WARN: Service not found for model=', model_name, ', skipping template and gpuVendor update.') AS msg; + END IF; + + SET service_uuid = NULL; + END LOOP; + CLOSE templates_cursor; + + DROP TEMPORARY TABLE IF EXISTS system_models_templates_to_update; +END $$ +DELIMITER ; + +CALL update_system_model_service_templates(); +DROP PROCEDURE IF EXISTS update_system_model_service_templates; + +Update ModelServiceTemplateVO set gpuVendor = 'Huawei' where gpuVendor = 'HUAWEI'; +Update ModelServiceTemplateVO set gpuVendor = 'Haiguang' where gpuVendor = 'HAIGUANG'; +Update ModelServiceTemplateVO set gpuVendor = 'TianShu' where gpuVendor = 'TIANSHU'; +Update ModelServiceTemplateVO set gpuVendor = 'Intel' where gpuVendor = 'INTEL'; From 1d32a1ecda76bc787805aac8ec7564d0569a5ff7 Mon Sep 17 00:00:00 2001 From: J M Date: Mon, 3 Nov 2025 19:31:17 +0800 Subject: [PATCH 629/737] [storage]: use specify msg get volume path 1. add snapshot placement capability to external storage 2. ext ps controller cannot use extension point, move it to exp ps. 3. retain the ask meaning of AskSnapshotCapabilityMsg. Resolves: ZSTAC-79582 ZSTAC-79481 Change-Id: I7a7074707079616b696f7375757577666c79756b --- .../ExternalPrimaryStorage.xml | 8 +- conf/springConfigXml/zbs.xml | 1 - ...ningVolumePathFromInternalSnapshotMsg.java | 27 +++++++ ...ngVolumePathFromInternalSnapshotReply.java | 22 ++++++ .../primary/VolumeSnapshotCapability.java | 28 +++++-- .../ceph/primary/CephPrimaryStorageBase.java | 23 +++++- .../zstack/expon/ExponStorageController.java | 3 +- .../primary/ExternalStorageFencerType.java | 1 + .../primary/local/LocalStorageBase.java | 1 + .../primary/nfs/NfsPrimaryStorage.java | 1 + .../primary/smp/SMPPrimaryStorageBase.java | 1 + .../xinfini/XInfiniStorageController.java | 3 +- .../storage/zbs/ZbsStorageController.java | 3 +- .../zstack/storage/zbs/ZbsStorageFactory.java | 42 +--------- .../primary/SimulatorPrimaryStorage.java | 1 + .../addon/primary/ExternalPrimaryStorage.java | 34 +++++++- ...ChangeVolumeProcessingMethodExtension.java | 31 -------- .../ExternalPrimaryStorageFactory.java | 77 ++++++++++++++++++- .../storage/primary/PrimaryStorageBase.java | 7 ++ 19 files changed, 221 insertions(+), 93 deletions(-) create mode 100644 header/src/main/java/org/zstack/header/storage/primary/GetOwningVolumePathFromInternalSnapshotMsg.java create mode 100644 header/src/main/java/org/zstack/header/storage/primary/GetOwningVolumePathFromInternalSnapshotReply.java delete mode 100644 storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageChangeVolumeProcessingMethodExtension.java diff --git a/conf/springConfigXml/ExternalPrimaryStorage.xml b/conf/springConfigXml/ExternalPrimaryStorage.xml index f0b5f60289a..55450dca7b7 100644 --- a/conf/springConfigXml/ExternalPrimaryStorage.xml +++ b/conf/springConfigXml/ExternalPrimaryStorage.xml @@ -29,6 +29,8 @@ + + @@ -52,10 +54,4 @@ - - - - - - diff --git a/conf/springConfigXml/zbs.xml b/conf/springConfigXml/zbs.xml index 4ef20cc35c2..2e0234ddc1d 100644 --- a/conf/springConfigXml/zbs.xml +++ b/conf/springConfigXml/zbs.xml @@ -21,7 +21,6 @@ - diff --git a/header/src/main/java/org/zstack/header/storage/primary/GetOwningVolumePathFromInternalSnapshotMsg.java b/header/src/main/java/org/zstack/header/storage/primary/GetOwningVolumePathFromInternalSnapshotMsg.java new file mode 100644 index 00000000000..8e82eafac9d --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/primary/GetOwningVolumePathFromInternalSnapshotMsg.java @@ -0,0 +1,27 @@ +package org.zstack.header.storage.primary; + +import org.zstack.header.message.NeedReplyMessage; + +import java.util.List; + +public class GetOwningVolumePathFromInternalSnapshotMsg extends NeedReplyMessage implements PrimaryStorageMessage { + private String primaryStorageUuid; + private List snapshotPaths; + + @Override + public String getPrimaryStorageUuid() { + return primaryStorageUuid; + } + + public void setPrimaryStorageUuid(String primaryStorageUuid) { + this.primaryStorageUuid = primaryStorageUuid; + } + + public List getSnapshotPaths() { + return snapshotPaths; + } + + public void setSnapshotPaths(List snapshotPaths) { + this.snapshotPaths = snapshotPaths; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/primary/GetOwningVolumePathFromInternalSnapshotReply.java b/header/src/main/java/org/zstack/header/storage/primary/GetOwningVolumePathFromInternalSnapshotReply.java new file mode 100644 index 00000000000..00836233185 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/primary/GetOwningVolumePathFromInternalSnapshotReply.java @@ -0,0 +1,22 @@ +package org.zstack.header.storage.primary; + +import org.zstack.header.message.MessageReply; + +import java.util.HashMap; +import java.util.Map; + +public class GetOwningVolumePathFromInternalSnapshotReply extends MessageReply { + private Map owningVolumePaths = new HashMap<>(); + + public Map getOwningVolumePaths() { + return owningVolumePaths; + } + + public void setOwningVolumePaths(Map owningVolumePaths) { + this.owningVolumePaths = owningVolumePaths; + } + + public void putOwningVolumePath(String snapshotPath, String volumePath) { + this.owningVolumePaths.put(snapshotPath, volumePath); + } +} diff --git a/header/src/main/java/org/zstack/header/storage/primary/VolumeSnapshotCapability.java b/header/src/main/java/org/zstack/header/storage/primary/VolumeSnapshotCapability.java index 59d63b473ca..79050146db5 100755 --- a/header/src/main/java/org/zstack/header/storage/primary/VolumeSnapshotCapability.java +++ b/header/src/main/java/org/zstack/header/storage/primary/VolumeSnapshotCapability.java @@ -10,6 +10,11 @@ public static enum VolumeSnapshotArrangementType { CHAIN, INDIVIDUAL } + + public static enum VolumeSnapshotPlacementType { + INTERNAL, + EXTERNAL, + } private boolean support; @@ -28,13 +33,14 @@ public static enum VolumeSnapshotArrangementType { private VolumeSnapshotArrangementType arrangementType; + private VolumeSnapshotPlacementType placementType; + /*** * If volume snapshot is inner snapshot on volume, it must be set. * A regex match volume install path from inner volume snapshot install path. * such as pool/vol from pool/vol@snapshot can be extracted by regex ^[^@]+ */ - // TODO(mj) refactor it - private String volumePathFromInnerSnapshotRegex; + private String volumePathFromInternalSnapshotRegex; public boolean isSupport() { return support; @@ -52,6 +58,14 @@ public void setArrangementType(VolumeSnapshotArrangementType arrangementType) { this.arrangementType = arrangementType; } + public VolumeSnapshotPlacementType getPlacementType() { + return placementType; + } + + public void setPlacementType(VolumeSnapshotPlacementType placementType) { + this.placementType = placementType; + } + public boolean isSupportCreateOnHypervisor() { return supportCreateOnHypervisor; } @@ -68,11 +82,13 @@ public void setSupportLazyDelete(boolean supportLazyDelete) { this.supportLazyDelete = supportLazyDelete; } - public String getVolumePathFromInnerSnapshotRegex() { - return volumePathFromInnerSnapshotRegex; + @Deprecated + public String getVolumePathFromInternalSnapshotRegex() { + return volumePathFromInternalSnapshotRegex; } - public void setVolumePathFromInnerSnapshotRegex(String volumePathFromInnerSnapshotRegex) { - this.volumePathFromInnerSnapshotRegex = volumePathFromInnerSnapshotRegex; + @Deprecated + public void setVolumePathFromInternalSnapshotRegex(String volumePathFromInternalSnapshotRegex) { + this.volumePathFromInternalSnapshotRegex = volumePathFromInternalSnapshotRegex; } } diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java index 562067654c2..6579e941392 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java @@ -3320,7 +3320,8 @@ protected void handle(AskVolumeSnapshotCapabilityMsg msg) { if (VolumeType.Data.toString().equals(volumeType) || VolumeType.Root.toString().equals(volumeType)) { cap.setSupport(true); cap.setArrangementType(VolumeSnapshotArrangementType.INDIVIDUAL); - cap.setVolumePathFromInnerSnapshotRegex("^[^@]+"); + cap.setPlacementType(VolumeSnapshotCapability.VolumeSnapshotPlacementType.INTERNAL); + cap.setVolumePathFromInternalSnapshotRegex("^[^@]+"); } else if (VolumeType.Memory.toString().equals(volumeType)) { cap.setSupport(false); } else { @@ -4722,7 +4723,7 @@ private void deleteImageCacheOnPrimaryStorage(DeleteImageCacheOnPrimaryStorageMs DeleteImageCacheCmd cmd = new DeleteImageCacheCmd(); cmd.setFsId(getSelf().getFsid()); cmd.setUuid(self.getUuid()); - cmd.imagePath = msg.getInstallPath().split("@")[0]; + cmd.imagePath = getVolumePathFromSnapshot(msg.getInstallPath()); cmd.snapshotPath = msg.getInstallPath(); httpCall(DELETE_IMAGE_CACHE, cmd, AgentResponse.class, new ReturnValueCompletion(msg) { @Override @@ -5172,7 +5173,7 @@ public void setup() { boolean fastRevert = VolumeSnapshotGlobalConfig.ENABLE_FAST_REVERT.value(Boolean.class); String snapShotPath = msg.getSnapshot().getPrimaryStorageInstallPath(); // get volume path from snapshot path, just split @ - String volumePath = snapShotPath.split("@")[0]; + String volumePath = getVolumePathFromSnapshot(snapShotPath); final String newVolumePath = makeVolumeInstallPathByTargetPool(Platform.getUuid(), getTargetPoolNameFromAllocatedUrl(snapShotPath)); flow(new NoRollbackFlow() { @@ -6078,6 +6079,18 @@ private void handle(GetPrimaryStorageUsageReportMsg msg) { bus.reply(msg, reply); } + @Override + protected void handle(GetOwningVolumePathFromInternalSnapshotMsg msg) { + GetOwningVolumePathFromInternalSnapshotReply reply = new GetOwningVolumePathFromInternalSnapshotReply(); + if (msg.getSnapshotPaths() != null) { + for (String snapshotPath : msg.getSnapshotPaths()) { + reply.putOwningVolumePath(snapshotPath, getVolumePathFromSnapshot(snapshotPath)); + } + } + + bus.reply(msg, reply); + } + protected void handle(CleanUpStorageTrashOnPrimaryStorageMsg msg) { CleanUpStorageTrashOnPrimaryStorageReply reply = new CleanUpStorageTrashOnPrimaryStorageReply(); thdf.singleFlightSubmit(new SingleFlightTask(msg) @@ -6142,6 +6155,10 @@ private String makeCephPath(String originPath) { return String.format("ceph://%s", originPath); } + private static String getVolumePathFromSnapshot(String snapshotPath) { + return snapshotPath.split("@")[0]; + } + protected String getTargetPoolNameFromAllocatedUrl(String allocatedUrl) { if (allocatedUrl == null) { throw new OperationFailureException(operr("allocated url not found")); diff --git a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java index ca72e1a08b6..2a3762f98ff 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java +++ b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java @@ -91,9 +91,10 @@ public class ExponStorageController implements PrimaryStorageControllerSvc, Prim VolumeSnapshotCapability scap = new VolumeSnapshotCapability(); scap.setSupport(true); scap.setArrangementType(VolumeSnapshotCapability.VolumeSnapshotArrangementType.INDIVIDUAL); + scap.setPlacementType(VolumeSnapshotCapability.VolumeSnapshotPlacementType.INTERNAL); scap.setSupportCreateOnHypervisor(false); scap.setSupportLazyDelete(true); - scap.setVolumePathFromInnerSnapshotRegex("^[^@]+"); + scap.setVolumePathFromInternalSnapshotRegex("^[^@]+"); capabilities.setSnapshotCapability(scap); capabilities.setSupportCloneFromVolume(false); capabilities.setSupportStorageQos(true); diff --git a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/ExternalStorageFencerType.java b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/ExternalStorageFencerType.java index 50031d7b4e4..7c0e17cd173 100644 --- a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/ExternalStorageFencerType.java +++ b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/ExternalStorageFencerType.java @@ -8,6 +8,7 @@ * @author Xingwei Yu * @date 2024/8/21 10:38 */ +// TODO refactor it, use controller interface not this fencer type class public class ExternalStorageFencerType { private static Map types = Collections.synchronizedMap(new HashMap()); diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java index c7b39fc161a..5e4697ac8f5 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java @@ -2672,6 +2672,7 @@ protected void handle(AskVolumeSnapshotCapabilityMsg msg) { String volumeType = msg.getVolume().getType(); if (VolumeType.Data.toString().equals(volumeType) || VolumeType.Root.toString().equals(volumeType)) { capability.setArrangementType(VolumeSnapshotArrangementType.CHAIN); + capability.setPlacementType(VolumeSnapshotCapability.VolumeSnapshotPlacementType.EXTERNAL); } else if (VolumeType.Memory.toString().equals(volumeType)) { capability.setArrangementType(VolumeSnapshotArrangementType.INDIVIDUAL); } else { diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java index 11e888024fb..1a1f39a18c0 100755 --- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java +++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java @@ -1336,6 +1336,7 @@ protected void handle(AskVolumeSnapshotCapabilityMsg msg) { String volumeType = msg.getVolume().getType(); if (VolumeType.Data.toString().equals(volumeType) || VolumeType.Root.toString().equals(volumeType)) { capability.setArrangementType(VolumeSnapshotArrangementType.CHAIN); + capability.setPlacementType(VolumeSnapshotCapability.VolumeSnapshotPlacementType.EXTERNAL); } else if (VolumeType.Memory.toString().equals(volumeType)) { capability.setArrangementType(VolumeSnapshotArrangementType.INDIVIDUAL); } else { diff --git a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageBase.java b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageBase.java index a554238854c..38aeef95cc1 100755 --- a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageBase.java +++ b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageBase.java @@ -396,6 +396,7 @@ protected void handle(AskVolumeSnapshotCapabilityMsg msg) { String volumeType = msg.getVolume().getType(); if (VolumeType.Data.toString().equals(volumeType) || VolumeType.Root.toString().equals(volumeType)) { capability.setArrangementType(VolumeSnapshotArrangementType.CHAIN); + capability.setPlacementType(VolumeSnapshotCapability.VolumeSnapshotPlacementType.EXTERNAL); } else if (VolumeType.Memory.toString().equals(volumeType)) { capability.setArrangementType(VolumeSnapshotArrangementType.INDIVIDUAL); } else { diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index a43a9eaa6c4..267d55f4039 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -97,9 +97,10 @@ private String getVhostSocketDir() { VolumeSnapshotCapability scap = new VolumeSnapshotCapability(); scap.setSupport(true); scap.setArrangementType(VolumeSnapshotCapability.VolumeSnapshotArrangementType.INDIVIDUAL); + scap.setPlacementType(VolumeSnapshotCapability.VolumeSnapshotPlacementType.INTERNAL); scap.setSupportCreateOnHypervisor(false); scap.setSupportLazyDelete(false); - scap.setVolumePathFromInnerSnapshotRegex("^[^@]+"); + scap.setVolumePathFromInternalSnapshotRegex("^[^@]+"); capabilities.setSnapshotCapability(scap); capabilities.setSupportCloneFromVolume(false); capabilities.setSupportStorageQos(false); diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 01d67f7deed..4b725d7d952 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -109,9 +109,10 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar VolumeSnapshotCapability scap = new VolumeSnapshotCapability(); scap.setSupport(true); scap.setArrangementType(VolumeSnapshotCapability.VolumeSnapshotArrangementType.INDIVIDUAL); + scap.setPlacementType(VolumeSnapshotCapability.VolumeSnapshotPlacementType.INTERNAL); scap.setSupportCreateOnHypervisor(false); scap.setSupportLazyDelete(false); - scap.setVolumePathFromInnerSnapshotRegex("^[^@]+"); + scap.setVolumePathFromInternalSnapshotRegex("^[^@]+"); capabilities.setSnapshotCapability(scap); capabilities.setSupportShareableVolume(true); capabilities.setSupportCloneFromVolume(false); diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java index 43c95e77e70..df9fb479a2c 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java @@ -34,15 +34,10 @@ * @author Xingwei Yu * @date 2024/3/21 11:56 */ -public class ZbsStorageFactory implements ExternalPrimaryStorageSvcBuilder, BackupStorageSelector, VolumeSnapshotAfterDeleteExtensionPoint { +public class ZbsStorageFactory implements ExternalPrimaryStorageSvcBuilder, BackupStorageSelector { private static CLogger logger = Utils.getLogger(ZbsStorageFactory.class); public static final ExternalStorageFencerType fencerType = new ExternalStorageFencerType(ZbsConstants.IDENTITY, VolumeProtocol.CBD.toString()); - @Autowired - private CloudBus bus; - @Autowired - private StorageTrash trash; - private List preferBackupStorageTypes; @Override @@ -73,39 +68,4 @@ public List getPreferBackupStorageTypes() { public String getIdentity() { return ZbsConstants.IDENTITY; } - - @Override - public void volumeSnapshotAfterDeleteExtensionPoint(VolumeSnapshotInventory snapshot, NoErrorCompletion completion) { - completion.done(); - } - - private boolean isCbdProtocol(String volumeUuid) { - return Q.New(VolumeVO.class).eq(VolumeVO_.protocol, VolumeProtocol.CBD.toString()).eq(VolumeVO_.uuid, volumeUuid).isExists(); - } - - @Override - public void volumeSnapshotAfterCleanUpExtensionPoint(String volumeUuid, List snapshots) { - if (CollectionUtils.isEmpty(snapshots) || !isCbdProtocol(volumeUuid)) { - return; - } - - Set volumeInstallPaths = snapshots.stream().map(s -> getVolumeFromSnapshotPath(s.getPrimaryStorageInstallPath())) - .collect(Collectors.toSet()); - if (volumeInstallPaths.isEmpty()) { - return; - } - - volumeInstallPaths.forEach(volumeInstallPath -> { - String details = trash.makeSureInstallPathNotUsed(volumeInstallPath, VolumeVO.class.getSimpleName()); - - if (StringUtils.isBlank(details)) { - logger.debug(String.format("delete volume[InstallPath:%s] after cleaning up snapshots", volumeInstallPath)); - DeleteVolumeBitsOnPrimaryStorageMsg msg = new DeleteVolumeBitsOnPrimaryStorageMsg(); - msg.setPrimaryStorageUuid(snapshots.get(0).getPrimaryStorageUuid()); - msg.setInstallPath(volumeInstallPath); - bus.makeTargetServiceIdByResourceUuid(msg, PrimaryStorageConstant.SERVICE_ID, snapshots.get(0).getPrimaryStorageUuid()); - bus.send(msg); - } - }); - } } diff --git a/simulator/simulatorImpl/src/main/java/org/zstack/simulator/storage/primary/SimulatorPrimaryStorage.java b/simulator/simulatorImpl/src/main/java/org/zstack/simulator/storage/primary/SimulatorPrimaryStorage.java index a4c639c9bdd..45cf8612a3c 100755 --- a/simulator/simulatorImpl/src/main/java/org/zstack/simulator/storage/primary/SimulatorPrimaryStorage.java +++ b/simulator/simulatorImpl/src/main/java/org/zstack/simulator/storage/primary/SimulatorPrimaryStorage.java @@ -155,6 +155,7 @@ protected void handle(AskVolumeSnapshotCapabilityMsg msg) { AskVolumeSnapshotCapabilityReply reply = new AskVolumeSnapshotCapabilityReply(); VolumeSnapshotCapability capability = new VolumeSnapshotCapability(); capability.setArrangementType(VolumeSnapshotArrangementType.CHAIN); + capability.setPlacementType(VolumeSnapshotCapability.VolumeSnapshotPlacementType.EXTERNAL); capability.setSupport(true); reply.setCapability(capability); bus.reply(msg, reply); diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index 05bea4ba5f3..79332acdc88 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -55,6 +55,8 @@ import org.zstack.utils.logging.CLogger; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; @@ -1866,12 +1868,18 @@ public void fail(ErrorCode errorCode) { }); flow(new NoRollbackFlow() { - // TODO: hardcode for expon final String __name__ = "delete-origin-root-volume-which-has-no-snapshot"; + @Override + public boolean skip(Map data) { + return controller.reportCapabilities().getSnapshotCapability() + .getPlacementType() != VolumeSnapshotCapability.VolumeSnapshotPlacementType.INTERNAL; + } + @Override public void run(FlowTrigger trigger, Map data) { boolean hasSnapshot = Q.New(VolumeSnapshotVO.class) + .eq(VolumeSnapshotVO_.volumeUuid, msg.getVolume().getUuid()) .like(VolumeSnapshotVO_.primaryStorageInstallPath, String.format("%s%%", msg.getVolume().getInstallPath())) .isExists(); if (!hasSnapshot) { @@ -1920,6 +1928,30 @@ protected void handle(AskInstallPathForNewSnapshotMsg msg) { bus.reply(msg, reply); } + @Override + protected void handle(GetOwningVolumePathFromInternalSnapshotMsg msg) { + GetOwningVolumePathFromInternalSnapshotReply reply = new GetOwningVolumePathFromInternalSnapshotReply(); + if (msg.getSnapshotPaths() != null) { + VolumeSnapshotCapability scap = controller.reportCapabilities().getSnapshotCapability(); + if (scap.getPlacementType() == VolumeSnapshotCapability.VolumeSnapshotPlacementType.INTERNAL) { + Pattern pattern = Pattern.compile(scap.getVolumePathFromInternalSnapshotRegex()); + for (String snapshotPath : msg.getSnapshotPaths()) { + Matcher matcher = pattern.matcher(snapshotPath); + if (matcher.find()) { + String volumePath = matcher.group(); + reply.putOwningVolumePath(snapshotPath, volumePath); + } else { + reply.setError(operr("cannot find owning volume path from internal snapshot path[%s], " + + "because the regex[%s] does not match the snapshot path", snapshotPath, scap.getVolumePathFromInternalSnapshotRegex())); + break; + } + } + } + } + + bus.reply(msg, reply); + } + @Override protected void handle(GetPrimaryStorageResourceLocationMsg msg) { bus.reply(msg, new GetPrimaryStorageResourceLocationReply()); diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageChangeVolumeProcessingMethodExtension.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageChangeVolumeProcessingMethodExtension.java deleted file mode 100644 index 09dbccb01b1..00000000000 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageChangeVolumeProcessingMethodExtension.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.zstack.storage.addon.primary; - -import org.zstack.core.db.Q; -import org.zstack.header.storage.primary.PrimaryStorageConstant; -import org.zstack.header.storage.primary.PrimaryStorageVO; -import org.zstack.header.storage.primary.PrimaryStorageVO_; -import org.zstack.header.storage.snapshot.VolumeSnapshotVO; -import org.zstack.header.storage.snapshot.VolumeSnapshotVO_; -import org.zstack.header.volume.VolumeDeletionPolicyManager; -import org.zstack.header.volume.VolumeInventory; -import org.zstack.storage.volume.ChangeVolumeProcessingMethodExtensionPoint; - -/** - * @author Xingwei Yu - * @date 2024/10/23 16:07 - */ -public class ExternalPrimaryStorageChangeVolumeProcessingMethodExtension implements ChangeVolumeProcessingMethodExtensionPoint { - @Override - public VolumeDeletionPolicyManager.VolumeDeletionPolicy getTransientVolumeDeletionPolicy(VolumeInventory transientVolume) { - String psType = Q.New(PrimaryStorageVO.class).eq(PrimaryStorageVO_.uuid, transientVolume.getPrimaryStorageUuid()).select(PrimaryStorageVO_.type).findValue(); - if (!psType.equals(PrimaryStorageConstant.EXTERNAL_PRIMARY_STORAGE_TYPE)) { - return null; - } - boolean hasSnapshots = Q.New(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.primaryStorageUuid, transientVolume.getPrimaryStorageUuid()) - .like(VolumeSnapshotVO_.primaryStorageInstallPath, String.format("%s@%%", transientVolume.getInstallPath())).isExists(); - if (!hasSnapshots) { - return VolumeDeletionPolicyManager.VolumeDeletionPolicy.Direct; - } - return VolumeDeletionPolicyManager.VolumeDeletionPolicy.DBOnly; - } -} diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java index 6b21ab8325a..a8e00d3a0ad 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java @@ -1,5 +1,6 @@ package org.zstack.storage.addon.primary; +import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.Platform; import org.zstack.core.asyncbatch.While; @@ -11,6 +12,7 @@ import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.core.singleflight.MultiNodeSingleFlightImpl; +import org.zstack.core.trash.StorageTrash; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.header.Component; import org.zstack.header.apimediator.ApiMessageInterceptionException; @@ -38,17 +40,21 @@ import org.zstack.header.vm.*; import org.zstack.header.vm.cdrom.VmCdRomVO; import org.zstack.header.vm.cdrom.VmCdRomVO_; +import org.zstack.header.volume.VolumeDeletionPolicyManager; import org.zstack.header.volume.VolumeInventory; import org.zstack.header.volume.VolumeVO; import org.zstack.header.volume.block.BlockVolumeVO; import org.zstack.storage.addon.backup.ExternalBackupStorageFactory; import org.zstack.storage.primary.PrimaryStorageFeatureAllocatorExtensionPoint; import org.zstack.storage.snapshot.MarkRootVolumeAsSnapshotExtension; +import org.zstack.storage.volume.ChangeVolumeProcessingMethodExtensionPoint; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; import static org.zstack.core.Platform.argerr; @@ -58,7 +64,8 @@ public class ExternalPrimaryStorageFactory implements PrimaryStorageFactory, Com PreVmInstantiateResourceExtensionPoint, VmReleaseResourceExtensionPoint, VmAttachVolumeExtensionPoint, VmDetachVolumeExtensionPoint, BeforeTakeLiveSnapshotsOnVolumes, CreateTemplateFromVolumeSnapshotExtensionPoint, MarkRootVolumeAsSnapshotExtension, VmInstanceMigrateExtensionPoint, - ManagementNodeChangeListener, PrimaryStorageFeatureAllocatorExtensionPoint, HostResizeVolumeExtensionPoint { + ManagementNodeChangeListener, PrimaryStorageFeatureAllocatorExtensionPoint, HostResizeVolumeExtensionPoint, + VolumeSnapshotAfterDeleteExtensionPoint, ChangeVolumeProcessingMethodExtensionPoint { private static final CLogger logger = Utils.getLogger(ExternalBackupStorageFactory.class); public static PrimaryStorageType type = new PrimaryStorageType(PrimaryStorageConstant.EXTERNAL_PRIMARY_STORAGE_TYPE); @@ -81,6 +88,8 @@ public class ExternalPrimaryStorageFactory implements PrimaryStorageFactory, Com protected CloudBus bus; @Autowired protected EventFacade evtf; + @Autowired + protected StorageTrash trash; static { type.setSupportHeartbeatFile(true); @@ -1001,4 +1010,70 @@ public HostResizeVolumeStruct beforeKvmHostResizeVolume(HostResizeVolumeStruct s struct.setSize(controller.alignSize(struct.getSize())); return struct; } + + @Override + public void volumeSnapshotAfterDeleteExtensionPoint(VolumeSnapshotInventory snapshot, NoErrorCompletion completion) { + completion.done(); + } + + + @Override + public void volumeSnapshotAfterCleanUpExtensionPoint(String volumeUuid, List snapshots) { + if (CollectionUtils.isEmpty(snapshots)) { + return; + } + + String psUuid = snapshots.get(0).getPrimaryStorageUuid(); + PrimaryStorageControllerSvc controller = controllers.get(psUuid); + if (controller == null) { + return; + } + + VolumeSnapshotCapability snapCap = controller.reportCapabilities().getSnapshotCapability(); + if (snapCap.getPlacementType() != VolumeSnapshotCapability.VolumeSnapshotPlacementType.INTERNAL) { + return; + } + + Pattern pattern = Pattern.compile(snapCap.getVolumePathFromInternalSnapshotRegex()); + Set volumeInstallPaths = snapshots.stream().map(s -> { + Matcher matcher = pattern.matcher(s.getPrimaryStorageInstallPath()); + if (matcher.find()) { + return matcher.group(); + } else { + logger.warn(String.format("cannot find volume install path from internal snapshot install path[%s] " + + "by regex[%s], skip deleting volume bits on primary storage", s.getPrimaryStorageInstallPath(), + snapCap.getVolumePathFromInternalSnapshotRegex())); + return null; + } + }).filter(Objects::nonNull).collect(Collectors.toSet()); + + volumeInstallPaths.forEach(volumeInstallPath -> { + String details = trash.makeSureInstallPathNotUsed(volumeInstallPath, VolumeVO.class.getSimpleName()); + + if (StringUtils.isBlank(details)) { + logger.debug(String.format("delete volume[InstallPath:%s] after cleaning up snapshots", volumeInstallPath)); + DeleteVolumeBitsOnPrimaryStorageMsg msg = new DeleteVolumeBitsOnPrimaryStorageMsg(); + msg.setPrimaryStorageUuid(snapshots.get(0).getPrimaryStorageUuid()); + msg.setInstallPath(volumeInstallPath); + bus.makeTargetServiceIdByResourceUuid(msg, PrimaryStorageConstant.SERVICE_ID, snapshots.get(0).getPrimaryStorageUuid()); + bus.send(msg); + } + }); + } + + @Override + public VolumeDeletionPolicyManager.VolumeDeletionPolicy getTransientVolumeDeletionPolicy(VolumeInventory transientVolume) { + PrimaryStorageControllerSvc controllerSvc = controllers.get(transientVolume.getPrimaryStorageUuid()); + if (controllerSvc == null || controllerSvc.reportCapabilities().getSnapshotCapability() + .getPlacementType() != VolumeSnapshotCapability.VolumeSnapshotPlacementType.INTERNAL) { + return null; + } + + boolean hasSnapshots = Q.New(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.primaryStorageUuid, transientVolume.getPrimaryStorageUuid()) + .like(VolumeSnapshotVO_.primaryStorageInstallPath, String.format("%s@%%", transientVolume.getInstallPath())).isExists(); + if (!hasSnapshots) { + return VolumeDeletionPolicyManager.VolumeDeletionPolicy.Direct; + } + return VolumeDeletionPolicyManager.VolumeDeletionPolicy.DBOnly; + } } diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java index 6f9515a1e40..a5011877ba3 100755 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java @@ -413,6 +413,8 @@ protected void handleLocalMessage(Message msg) { handle((DeleteVolumeChainOnPrimaryStorageMsg) msg); } else if (msg instanceof CleanUpStorageTrashOnPrimaryStorageMsg) { handle((CleanUpStorageTrashOnPrimaryStorageMsg)msg); + } else if (msg instanceof GetOwningVolumePathFromInternalSnapshotMsg) { + handle((GetOwningVolumePathFromInternalSnapshotMsg) msg); } else { bus.dealWithUnknownMessage(msg); } @@ -1763,6 +1765,11 @@ protected void handle(UnlinkBitsOnPrimaryStorageMsg msg) { bus.reply(msg, reply); }; + protected void handle(GetOwningVolumePathFromInternalSnapshotMsg msg) { + GetOwningVolumePathFromInternalSnapshotReply reply = new GetOwningVolumePathFromInternalSnapshotReply(); + bus.reply(msg, reply); + } + // don't attach any cluster public boolean isUnmounted() { long count = Q.New(PrimaryStorageClusterRefVO.class) From e0cb873e60526e4b98e54b732485b46874157060 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 5 Dec 2025 15:28:19 +0800 Subject: [PATCH 630/737] [conf]: Upgrade GpuDeviceVO add gpuStatus DBImpact Resolves: ZSTAC-79761 Change-Id: I7662666569656f6c736d736667747679726a666c --- conf/db/upgrade/V5.4.6__schema.sql | 4 ++++ sdk/src/main/java/org/zstack/sdk/GpuDeviceInventory.java | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/conf/db/upgrade/V5.4.6__schema.sql b/conf/db/upgrade/V5.4.6__schema.sql index d9fae10108f..c268fff0577 100644 --- a/conf/db/upgrade/V5.4.6__schema.sql +++ b/conf/db/upgrade/V5.4.6__schema.sql @@ -325,3 +325,7 @@ Update ModelServiceTemplateVO set gpuVendor = 'Huawei' where gpuVendor = 'HUAWEI Update ModelServiceTemplateVO set gpuVendor = 'Haiguang' where gpuVendor = 'HAIGUANG'; Update ModelServiceTemplateVO set gpuVendor = 'TianShu' where gpuVendor = 'TIANSHU'; Update ModelServiceTemplateVO set gpuVendor = 'Intel' where gpuVendor = 'INTEL'; + +CALL ADD_COLUMN('GpuDeviceVO', 'gpuStatus', 'varchar(16)', 1, NULL); + +UPDATE `zstack`.`GpuDeviceVO` SET `gpuStatus`='nominal' WHERE `gpuStatus` IS NULL; diff --git a/sdk/src/main/java/org/zstack/sdk/GpuDeviceInventory.java b/sdk/src/main/java/org/zstack/sdk/GpuDeviceInventory.java index c45b9f27bac..587c9cbeae3 100644 --- a/sdk/src/main/java/org/zstack/sdk/GpuDeviceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/GpuDeviceInventory.java @@ -44,6 +44,14 @@ public java.lang.String getGpuType() { return this.gpuType; } + public java.lang.String gpuStatus; + public void setGpuStatus(java.lang.String gpuStatus) { + this.gpuStatus = gpuStatus; + } + public java.lang.String getGpuStatus() { + return this.gpuStatus; + } + public GpuAllocateStatus allocateStatus; public void setAllocateStatus(GpuAllocateStatus allocateStatus) { this.allocateStatus = allocateStatus; From 1d5b821e8ee832d3c39d5aa8e8cdae560240026f Mon Sep 17 00:00:00 2001 From: "xinhao.huang" Date: Fri, 5 Dec 2025 18:37:17 +0800 Subject: [PATCH 631/737] [conf]: update ModelServiceInstanceGroupVO schema - add column supportMetrics for ModelServiceInstanceGroupVO DBImpact Resolves: ZSTAC-80375 Change-Id: I6862697569686b7a6b6e787673696e71736f6169 --- conf/db/upgrade/V5.4.6__schema.sql | 22 +++++++++++++++++++ .../ModelServiceInstanceGroupInventory.java | 8 +++++++ 2 files changed, 30 insertions(+) diff --git a/conf/db/upgrade/V5.4.6__schema.sql b/conf/db/upgrade/V5.4.6__schema.sql index c268fff0577..9030590e1d8 100644 --- a/conf/db/upgrade/V5.4.6__schema.sql +++ b/conf/db/upgrade/V5.4.6__schema.sql @@ -329,3 +329,25 @@ Update ModelServiceTemplateVO set gpuVendor = 'Intel' where gpuVendor = 'INTEL'; CALL ADD_COLUMN('GpuDeviceVO', 'gpuStatus', 'varchar(16)', 1, NULL); UPDATE `zstack`.`GpuDeviceVO` SET `gpuStatus`='nominal' WHERE `gpuStatus` IS NULL; + +-- Add supportMetrics column to ModelServiceInstanceGroupVO +DROP PROCEDURE IF EXISTS addModelServiceInstanceGroupSupportMetricsColumn; +DELIMITER $$ +CREATE PROCEDURE addModelServiceInstanceGroupSupportMetricsColumn() +BEGIN + DECLARE columnExists BOOLEAN DEFAULT FALSE; + + SELECT COUNT(*) INTO columnExists + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_NAME = 'ModelServiceInstanceGroupVO' + AND COLUMN_NAME = 'supportMetrics' + AND TABLE_SCHEMA = 'zstack'; + + IF columnExists = FALSE THEN + ALTER TABLE `zstack`.`ModelServiceInstanceGroupVO` ADD COLUMN `supportMetrics` TEXT DEFAULT NULL; + END IF; +END $$ +DELIMITER ; + +CALL addModelServiceInstanceGroupSupportMetricsColumn(); +DROP PROCEDURE IF EXISTS addModelServiceInstanceGroupSupportMetricsColumn; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java index 8720f3ff254..25ad17e970d 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java @@ -108,4 +108,12 @@ public java.lang.String getYaml() { return this.yaml; } + public java.util.List supportMetrics; + public void setSupportMetrics(java.util.List supportMetrics) { + this.supportMetrics = supportMetrics; + } + public java.util.List getSupportMetrics() { + return this.supportMetrics; + } + } From 55a16d3f1213c348a8c2005f0cdc8a4b97b78102 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 8 Dec 2025 10:12:24 +0800 Subject: [PATCH 632/737] [conf]: Fix gpu work status upgrade sql Fix status from lowercase to uppercase, to avoid Enum.valueOf failure DBImpact Resolves: ZSTAC-80451 Change-Id: I67646d73796f7076626d6a616664746c76757979 --- conf/db/upgrade/V5.4.6__schema.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.4.6__schema.sql b/conf/db/upgrade/V5.4.6__schema.sql index 9030590e1d8..c487fde82d6 100644 --- a/conf/db/upgrade/V5.4.6__schema.sql +++ b/conf/db/upgrade/V5.4.6__schema.sql @@ -328,7 +328,7 @@ Update ModelServiceTemplateVO set gpuVendor = 'Intel' where gpuVendor = 'INTEL'; CALL ADD_COLUMN('GpuDeviceVO', 'gpuStatus', 'varchar(16)', 1, NULL); -UPDATE `zstack`.`GpuDeviceVO` SET `gpuStatus`='nominal' WHERE `gpuStatus` IS NULL; +UPDATE `zstack`.`GpuDeviceVO` SET `gpuStatus`='NOMINAL' WHERE `gpuStatus` IS NULL; -- Add supportMetrics column to ModelServiceInstanceGroupVO DROP PROCEDURE IF EXISTS addModelServiceInstanceGroupSupportMetricsColumn; From 7ad8dac200b79b96e2b7bd08458d099485610cab Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 8 Dec 2025 10:55:19 +0800 Subject: [PATCH 633/737] [sdk]: Update sdk Resolves: ZSTAC-80172 Change-Id: I7774626b796a6b626a626b78656d6f69656a7274 --- .../org/zstack/sdk/DeleteModelEvaluationTasksResult.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksResult.java index 5d1619bb4e1..9da05d4467e 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksResult.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksResult.java @@ -3,5 +3,12 @@ public class DeleteModelEvaluationTasksResult { + public java.util.List results; + public void setResults(java.util.List results) { + this.results = results; + } + public java.util.List getResults() { + return this.results; + } } From 6c8be0f7949af8c96a02ba01c13f446a2ddd9570 Mon Sep 17 00:00:00 2001 From: lianghy Date: Thu, 20 Nov 2025 18:01:34 +0800 Subject: [PATCH 634/737] [iam2-ldap]: support two-factor authentication for AD/LDAP accounts Resolves: ZSTAC-73108 Change-Id: I646373108a7923767067706e7a6e667a796f686d --- .../org/zstack/sdk/GetTwoFactorAuthenticationSecretAction.java | 2 +- .../zstack/sdk/ResetTwoFactorAuthenticationSecretAction.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/src/main/java/org/zstack/sdk/GetTwoFactorAuthenticationSecretAction.java b/sdk/src/main/java/org/zstack/sdk/GetTwoFactorAuthenticationSecretAction.java index 7968d3fe2bb..6023de48038 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetTwoFactorAuthenticationSecretAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetTwoFactorAuthenticationSecretAction.java @@ -31,7 +31,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = true, nullElements = false, emptyString = true, noTrim = false) public java.lang.String password; - @Param(required = true, validValues = {"account","iam2"}, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"account","iam2","iam2-ldap"}, nonempty = true, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/ResetTwoFactorAuthenticationSecretAction.java b/sdk/src/main/java/org/zstack/sdk/ResetTwoFactorAuthenticationSecretAction.java index ce0a61a40a5..f3633f18b77 100644 --- a/sdk/src/main/java/org/zstack/sdk/ResetTwoFactorAuthenticationSecretAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ResetTwoFactorAuthenticationSecretAction.java @@ -31,7 +31,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = true, nullElements = false, emptyString = true, noTrim = false) public java.lang.String password; - @Param(required = true, validValues = {"account","iam2"}, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"account","iam2","iam2-ldap"}, nonempty = true, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) From 845671dfdc7133ced74a0db38754fa8906fea1ed Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Wed, 5 Nov 2025 15:37:01 +0800 Subject: [PATCH 635/737] [applianceVm]: support sriov bond - ApplianceVm support vf nic bond in vm Resolves: ZSTAC-79984 Change-Id: I6868776c48bfce58c0324b2397c5197eab1af751 --- .../allocator/HostAllocatorManagerImpl.java | 14 ++-- .../compute/allocator/HostSortorChain.java | 6 +- conf/db/upgrade/V5.5.0__schema.sql | 2 + .../appliancevm/ApplianceVmFacadeImpl.java | 20 +++++- ...ApplianceVmNicBootstrapExtensionPoint.java | 7 ++ .../zstack/appliancevm/ApplianceVmNicTO.java | 9 +++ .../java/org/zstack/kvm/KVMAgentCommands.java | 9 +++ .../main/java/org/zstack/kvm/KVMConstant.java | 1 + .../service/virtualrouter/VirtualRouter.java | 18 +++++ .../virtualrouter/VirtualRouterCommands.java | 9 +++ .../VirtualRouterManagerImpl.java | 68 ++++++++++++++++--- .../lb/VirtualRouterLoadBalancerBackend.java | 17 ++++- sdk/src/main/java/org/zstack/sdk/NicTO.java | 8 +++ .../java/org/zstack/sdk/VmVfNicInventory.java | 8 +++ 14 files changed, 177 insertions(+), 19 deletions(-) create mode 100644 conf/db/upgrade/V5.5.0__schema.sql create mode 100644 plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmNicBootstrapExtensionPoint.java diff --git a/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorManagerImpl.java b/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorManagerImpl.java index 814cf91b83a..c1eb12ba209 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorManagerImpl.java @@ -530,12 +530,14 @@ public void fail(ErrorCode errorCode) { @Override public void rollback(FlowRollback trigger, Map data) { - ReturnHostCapacityMsg rmsg = new ReturnHostCapacityMsg(); - rmsg.setHostUuid(reply.getHost().getUuid()); - rmsg.setMemoryCapacity(spec.getMemoryCapacity()); - rmsg.setCpuCapacity(spec.getCpuCapacity()); - bus.makeTargetServiceIdByResourceUuid(rmsg, HostAllocatorConstant.SERVICE_ID, rmsg.getHostUuid()); - bus.send(rmsg); + if (reply.getHost() != null) { + ReturnHostCapacityMsg rmsg = new ReturnHostCapacityMsg(); + rmsg.setHostUuid(reply.getHost().getUuid()); + rmsg.setMemoryCapacity(spec.getMemoryCapacity()); + rmsg.setCpuCapacity(spec.getCpuCapacity()); + bus.makeTargetServiceIdByResourceUuid(rmsg, HostAllocatorConstant.SERVICE_ID, rmsg.getHostUuid()); + bus.send(rmsg); + } trigger.rollback(); } }).then(new NoRollbackFlow() { diff --git a/compute/src/main/java/org/zstack/compute/allocator/HostSortorChain.java b/compute/src/main/java/org/zstack/compute/allocator/HostSortorChain.java index a96ac0db751..cbffe137617 100644 --- a/compute/src/main/java/org/zstack/compute/allocator/HostSortorChain.java +++ b/compute/src/main/java/org/zstack/compute/allocator/HostSortorChain.java @@ -195,7 +195,11 @@ public void fail(ErrorCode errorCode) { @Override public void done(ErrorCodeList errorCodeList) { if (selectedHost.get() == null) { - completion.fail(errorCodeList); + if (!errorCodeList.getCauses().isEmpty()) { + completion.fail(errorCodeList.getCauses().get(0)); + } else { + completion.fail(operr("failed to reserve host capacity for all candidate hosts")); + } return; } completion.success(selectedHost.get()); diff --git a/conf/db/upgrade/V5.5.0__schema.sql b/conf/db/upgrade/V5.5.0__schema.sql new file mode 100644 index 00000000000..802f0170ea9 --- /dev/null +++ b/conf/db/upgrade/V5.5.0__schema.sql @@ -0,0 +1,2 @@ +CALL ADD_COLUMN('VmVfNicVO', 'secondaryPciDeviceUuid', 'VARCHAR(32)', 1, NULL); +ALTER TABLE `zstack`.`VmVfNicVO` ADD CONSTRAINT `fkVmVfNicVOSecondaryPciDeviceVO` FOREIGN KEY (`secondaryPciDeviceUuid`) REFERENCES `zstack`.`PciDeviceVO` (`uuid`) ON DELETE SET NULL; \ No newline at end of file diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacadeImpl.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacadeImpl.java index 9a415a48bfe..871479f13ac 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacadeImpl.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacadeImpl.java @@ -86,6 +86,7 @@ public class ApplianceVmFacadeImpl extends AbstractService implements ApplianceV private Map bootstrapInfoFlowFactories = new HashMap(); private Map l2NetworkGetVniExtensionPointMap = new HashMap<>(); private Map apvmCascadeFilterExtensionPointMap = new HashMap<>(); + private List nicBootstrapExtensions = Collections.emptyList(); private String OWNER = String.format("ApplianceVm.%s", Platform.getManagementServerId()); @@ -222,7 +223,7 @@ private void populateExtensions() { l2NetworkGetVniExtensionPointMap.put(ext.getL2NetworkVniType(), ext); logger.debug(String.format("add new l2NetworkGetVniExtensionPoint, %s: %s", ext.getL2NetworkVniType(), ext.getClass().getCanonicalName())); } - + for (ApvmCascadeFilterExtensionPoint ext : pluginRgty.getExtensionList(ApvmCascadeFilterExtensionPoint.class)) { ApplianceVmType type = ext.getApplianceVmType(); ApvmCascadeFilterExtensionPoint old = apvmCascadeFilterExtensionPointMap.get(type); @@ -234,6 +235,11 @@ private void populateExtensions() { logger.debug(String.format("add new apvmCascadeFilterExtensionPoint, %s: %s", type, ext.getClass().getCanonicalName())); } + + nicBootstrapExtensions = pluginRgty.getExtensionList(ApplianceVmNicBootstrapExtensionPoint.class); + if (nicBootstrapExtensions == null) { + nicBootstrapExtensions = Collections.emptyList(); + } } private void deployAnsible() { @@ -347,6 +353,13 @@ private List reduceNic(List nics, VmNicInventory return ret; } + private void fillVfNicBootstrapInfo(VmNicInventory nic, ApplianceVmNicTO to) { + to.setBondMode("none"); + for (ApplianceVmNicBootstrapExtensionPoint ext : nicBootstrapExtensions) { + ext.fillNicBootstrapInfo(nic, to); + } + } + @Override public Map prepareBootstrapInformation(VmInstanceSpec spec) { VmNicInventory mgmtNic = null; @@ -386,6 +399,7 @@ public Map prepareBootstrapInformation(VmInstanceSpec spec) { mto.setCategory(l3NetworkVO.getCategory().toString()); mto.setL2type(l2NetworkVO.getType()); mto.setPhysicalInterface(l2NetworkVO.getPhysicalInterface()); + fillVfNicBootstrapInfo(mgmtNic, mto); if (l2NetworkGetVniExtensionPointMap == null || l2NetworkGetVniExtensionPointMap.isEmpty() || l2NetworkGetVniExtensionPointMap.get(l2NetworkVO.getType()) == null) { logger.debug("l2NetworkGetVniExtensionPointMap is null. skip to get vni"); @@ -424,6 +438,7 @@ public Map prepareBootstrapInformation(VmInstanceSpec spec) { t.setL2type(l2NetworkVO.getType()); t.setVni(l2NetworkGetVniExtensionPointMap.get(l2NetworkVO.getType()).getL2NetworkVni(l2NetworkVO.getUuid(), spec.getVmInventory().getHostUuid())); t.setPhysicalInterface(l2NetworkVO.getPhysicalInterface()); + fillVfNicBootstrapInfo(defaultRouteNic, t); t.setMtu(new MtuGetter().getMtu(l3NetworkVO.getUuid())); deviceId ++; extraTos.add(t); @@ -440,6 +455,7 @@ public Map prepareBootstrapInformation(VmInstanceSpec spec) { nto.setL2type(l2NetworkVO.getType()); nto.setVni(l2NetworkGetVniExtensionPointMap.get(l2NetworkVO.getType()).getL2NetworkVni(l2NetworkVO.getUuid(), spec.getVmInventory().getHostUuid())); nto.setPhysicalInterface(l2NetworkVO.getPhysicalInterface()); + fillVfNicBootstrapInfo(nic, nto); nto.setMtu(new MtuGetter().getMtu(l3NetworkVO.getUuid())); extraTos.add(nto); deviceId ++; @@ -637,7 +653,7 @@ public void detachVirtualRouterFromHaGroup(String vmUuid, String haGroupUuid) { ext.detachVirtualRouterFromHaGroup(vmUuid, haGroupUuid); } } - + public ApvmCascadeFilterExtensionPoint getApvmCascadeFilterExtensionPoint(ApplianceVmType type) { return apvmCascadeFilterExtensionPointMap.get(type); } diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmNicBootstrapExtensionPoint.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmNicBootstrapExtensionPoint.java new file mode 100644 index 00000000000..ce9173f1698 --- /dev/null +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmNicBootstrapExtensionPoint.java @@ -0,0 +1,7 @@ +package org.zstack.appliancevm; + +import org.zstack.header.vm.VmNicInventory; + +public interface ApplianceVmNicBootstrapExtensionPoint { + void fillNicBootstrapInfo(VmNicInventory nic, ApplianceVmNicTO nicTo); +} diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmNicTO.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmNicTO.java index 3f58eacd3ae..c9905a78667 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmNicTO.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmNicTO.java @@ -24,6 +24,7 @@ public class ApplianceVmNicTO { private Integer prefixLength; private String gateway6; private String addressMode; + private String bondMode; public ApplianceVmNicTO(VmNicInventory inv) { for (UsedIpInventory uip : inv.getUsedIps()) { @@ -178,4 +179,12 @@ public String getAddressMode() { public void setAddressMode(String addressMode) { this.addressMode = addressMode; } + + public String getBondMode() { + return bondMode; + } + + public void setBondMode(String bondMode) { + this.bondMode = bondMode; + } } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index 91e5d885bd8..3b2eebb15e7 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -1208,6 +1208,7 @@ public static class NicTO extends BaseVirtualDeviceTO { // only for vf nic private String vlanId; private String pciDeviceAddress; + private List extraPciDeviceAddresses; // only for tf nic private String ipForTf; private String l2NetworkUuid; @@ -1315,6 +1316,14 @@ public void setPciDeviceAddress(String pciDeviceAddress) { this.pciDeviceAddress = pciDeviceAddress; } + public List getExtraPciDeviceAddresses() { + return extraPciDeviceAddresses; + } + + public void setExtraPciDeviceAddresses(List extraPciDeviceAddresses) { + this.extraPciDeviceAddresses = extraPciDeviceAddresses; + } + public Integer getMtu() { return mtu; } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java index f40157764ea..283fa68af52 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java @@ -65,6 +65,7 @@ public interface KVMConstant { String KVM_DETACH_NIC_PATH = "/vm/detachnic"; String KVM_CHANGE_NIC_STATE_PATH = "/vm/changenicstate"; String KVM_UPDATE_NIC_PATH = "/vm/updatenic"; + String KVM_SET_VF_NIC_MAC_PATH = "/vm/setvfnicmac"; String KVM_VM_CHECK_STATE = "/vm/checkstate"; String KVM_VM_UPDATE_PRIORITY_PATH = "/vm/priority"; String KVM_TAKE_VOLUME_SNAPSHOT_PATH = "/vm/volume/takesnapshot"; diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java index 85287633e0c..32a4448b686 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java @@ -945,6 +945,22 @@ public void attachNetworkService(String vrUuid, String networkServiceType, Strin public void detachNetworkService(String vrUuid, String networkServiceType, String l3NetworkUuid){ } + private void fillNicBondMode(VmNicInventory nicInventory, VirtualRouterCommands.NicInfo info) { + info.setBondMode("none"); + + List exts = pluginRgty.getExtensionList(ApplianceVmNicBootstrapExtensionPoint.class); + if (exts == null || exts.isEmpty()) { + return; + } + + ApplianceVmNicTO nicTO = new ApplianceVmNicTO(); + nicTO.setBondMode("none"); + for (ApplianceVmNicBootstrapExtensionPoint ext : exts) { + ext.fillNicBootstrapInfo(nicInventory, nicTO); + } + info.setBondMode(nicTO.getBondMode()); + } + public class virtualRouterAfterAttachNicFlow extends NoRollbackFlow { @Override public void run(FlowTrigger trigger, Map data) { @@ -987,6 +1003,7 @@ public void run(FlowTrigger trigger, Map data) { } info.setMtu(new MtuGetter().getMtu(l3NetworkVO.getUuid())); info.setState(nicInventory.getState()); + fillNicBondMode(nicInventory, info); cmd.setNics(Arrays.asList(info)); VirtualRouterAsyncHttpCallMsg cmsg = new VirtualRouterAsyncHttpCallMsg(); @@ -1314,6 +1331,7 @@ public void run(FlowTrigger trigger, Map data) { info.setGateway(nicInventory.getGateway()); info.setMac(nicInventory.getMac()); info.setNetmask(nicInventory.getNetmask()); + fillNicBondMode(nicInventory, info); cmd.setNics(Arrays.asList(info)); VirtualRouterAsyncHttpCallMsg cmsg = new VirtualRouterAsyncHttpCallMsg(); diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterCommands.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterCommands.java index 3d9f9636058..6b167a0b89d 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterCommands.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterCommands.java @@ -196,6 +196,7 @@ public static class NicInfo { private String gateway6; private String addressMode; private String state; + private String bondMode; public String getIp() { return ip; @@ -315,6 +316,14 @@ public String getState() { public void setState(String state) { this.state = state; } + + public String getBondMode() { + return bondMode; + } + + public void setBondMode(String bondMode) { + this.bondMode = bondMode; + } } public static class ConfigureNicCmd extends AgentCommand { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java index ca14cc78996..e5880b3f835 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java @@ -2718,19 +2718,69 @@ public void run(MessageReply reply) { } private List findVipsOnVirtualRouter(List vfNics, String vrUuid) { - List vipUuids = SQL.New("select vip.uuid from VipVO vip, VipPeerL3NetworkRefVO ref " + - "where ref.vipUuid = vip.uuid " + - "and (ref.l3NetworkUuid in (:l3NetworkUuids) " + - "or vip.l3NetworkUuid in (:l3NetworkUuids))") - .param("l3NetworkUuids", vfNics.stream().map(VmNicInventory::getL3NetworkUuid).collect(Collectors.toList())) - .list(); + List l3Uuids = vfNics.stream().map(VmNicInventory::getL3NetworkUuid).collect(Collectors.toList()); + List l3Networks = Q.New(L3NetworkVO.class).in(L3NetworkVO_.uuid, l3Uuids).list(); + + /* separate private l3 and public/system l3 by category */ + List guestL3Uuids = l3Networks.stream() + .filter(l3 -> L3NetworkCategory.Private.equals(l3.getCategory())) + .map(L3NetworkVO::getUuid) + .collect(Collectors.toList()); + /* public and system l3 are both treated as public l3, because they are shared resources among VRs */ + List publicL3Uuids = l3Networks.stream() + .filter(l3 -> L3NetworkCategory.Public.equals(l3.getCategory()) || + L3NetworkCategory.System.equals(l3.getCategory())) + .map(L3NetworkVO::getUuid) + .collect(Collectors.toList()); + + Set vipUuids = new HashSet<>(); + + /* for guest vf nics, find vips bindingto these l3 networks as peerL3 */ + if (!guestL3Uuids.isEmpty()) { + List guestVipUuids = SQL.New("select vip.uuid from VipVO vip, VipPeerL3NetworkRefVO ref " + + "where ref.vipUuid = vip.uuid " + + "and ref.l3NetworkUuid in (:l3NetworkUuids)") + .param("l3NetworkUuids", guestL3Uuids) + .list(); + vipUuids.addAll(guestVipUuids); + } + + /* for public vf nics, find vips bindingto this vr and bindingto these l3 networks as public l3 */ + if (!publicL3Uuids.isEmpty()) { + List publicVipUuids = SQL.New("select vip.uuid from VipVO vip, VirtualRouterVipVO ref " + + "where ref.uuid = vip.uuid " + + "and ref.virtualRouterVmUuid = :vrUuid " + + "and vip.l3NetworkUuid in (:l3NetworkUuids)") + .param("vrUuid", vrUuid) + .param("l3NetworkUuids", publicL3Uuids) + .list(); + vipUuids.addAll(publicVipUuids); + + String haUuid = haBackend.getVirtualRouterHaUuid(vrUuid); + if (haUuid != null) { + List haVipUuids = SQL.New("select vip.uuid from VipVO vip, VpcHaGroupNetworkServiceRefVO ref " + + "where ref.networkServiceUuid = vip.uuid " + + "and ref.vpcHaRouterUuid = :haUuid " + + "and ref.networkServiceName = :vipType " + + "and vip.l3NetworkUuid in (:l3NetworkUuids)") + .param("haUuid", haUuid) + .param("vipType", VipVO.class.getSimpleName()) + .param("l3NetworkUuids", publicL3Uuids) + .list(); + vipUuids.addAll(haVipUuids); + } + } + + if (vipUuids.isEmpty()) { + return new ArrayList<>(); + } - vipUuids = getVirtualRouterVips(vrUuid, vipUuids); - if (vipUuids == null || vipUuids.isEmpty()) { + List filteredVipUuids = getVirtualRouterVips(vrUuid, new ArrayList<>(vipUuids)); + if (filteredVipUuids == null || filteredVipUuids.isEmpty()) { return new ArrayList<>(); } - List vips = Q.New(VipVO.class).in(VipVO_.uuid, vipUuids).list(); + List vips = Q.New(VipVO.class).in(VipVO_.uuid, filteredVipUuids).list(); VirtualRouterVmInventory vr = VirtualRouterVmInventory.valueOf((VirtualRouterVmVO) Q.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, vrUuid).find()); diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterLoadBalancerBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterLoadBalancerBackend.java index c08db611610..3ee3d33449f 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterLoadBalancerBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterLoadBalancerBackend.java @@ -953,6 +953,16 @@ public int compare(LoadBalancerServerGroupServerIpInventory r1, LoadBalancerServ } } if (addIp) { + // Check if VR has a NIC connected to this L3 network + if (vr != null) { + boolean vrHasL3Network = vr.getVmNics().stream() + .anyMatch(vrNic -> usedIpInventory.getL3NetworkUuid().equals(vrNic.getL3NetworkUuid())); + if (!vrHasL3Network) { + logger.warn(String.format("VR[uuid:%s] has no NIC connected to L3Network[uuid:%s], " + + "skip backend server IP[%s]", vr.getUuid(), usedIpInventory.getL3NetworkUuid(), usedIpInventory.getIp())); + continue; + } + } ips.add(usedIpInventory.getIp()); params.add(String.format("balancerWeight::%s::%s", usedIpInventory.getIp(), nicRef.getWeight())); backendServers.add(new LbTO.BackendServer(usedIpInventory.getIp(), nicRef.getWeight())); @@ -2572,7 +2582,12 @@ private List getLoadBalancersByL3Networks(String l3Uuid, boo LoadBalancerStruct struct = new LoadBalancerStruct(); LoadBalancerVO lb = dbf.findByUuid(e.getKey(), LoadBalancerVO.class); struct.setLb(LoadBalancerInventory.valueOf(lb)); - struct.setVip(VipInventory.valueOf(dbf.findByUuid(lb.getVipUuid(), VipVO.class))); + if (lb.getVipUuid() != null) { + struct.setVip(VipInventory.valueOf(dbf.findByUuid(lb.getVipUuid(), VipVO.class))); + } + if (lb.getIpv6VipUuid() != null) { + struct.setIpv6Vip(VipInventory.valueOf(dbf.findByUuid(lb.getIpv6VipUuid(), VipVO.class))); + } struct.setListenerServerGroupMap(new HashMap<>()); List serverGroupUuids = new ArrayList<>(); diff --git a/sdk/src/main/java/org/zstack/sdk/NicTO.java b/sdk/src/main/java/org/zstack/sdk/NicTO.java index 2dc95ea8529..6eecb1466a8 100644 --- a/sdk/src/main/java/org/zstack/sdk/NicTO.java +++ b/sdk/src/main/java/org/zstack/sdk/NicTO.java @@ -149,6 +149,14 @@ public java.lang.String getPciDeviceAddress() { return this.pciDeviceAddress; } + public java.util.List extraPciDeviceAddresses; + public void setExtraPciDeviceAddresses(java.util.List extraPciDeviceAddresses) { + this.extraPciDeviceAddresses = extraPciDeviceAddresses; + } + public java.util.List getExtraPciDeviceAddresses() { + return this.extraPciDeviceAddresses; + } + public java.lang.String ipForTf; public void setIpForTf(java.lang.String ipForTf) { this.ipForTf = ipForTf; diff --git a/sdk/src/main/java/org/zstack/sdk/VmVfNicInventory.java b/sdk/src/main/java/org/zstack/sdk/VmVfNicInventory.java index 1a25f664e04..e008576b36e 100644 --- a/sdk/src/main/java/org/zstack/sdk/VmVfNicInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/VmVfNicInventory.java @@ -20,4 +20,12 @@ public java.lang.String getHaState() { return this.haState; } + public java.lang.String secondaryPciDeviceUuid; + public void setSecondaryPciDeviceUuid(java.lang.String secondaryPciDeviceUuid) { + this.secondaryPciDeviceUuid = secondaryPciDeviceUuid; + } + public java.lang.String getSecondaryPciDeviceUuid() { + return this.secondaryPciDeviceUuid; + } + } From 50df70c4f06d1af4ef79f33885bc3ed9454893b2 Mon Sep 17 00:00:00 2001 From: "haoyu.ding" Date: Mon, 15 Dec 2025 19:34:50 +0800 Subject: [PATCH 636/737] [vm]: Modifying the vnc password does not require a restart APIImpact Resolves: ZSTAC-73270 Change-Id: I68727271736c6d687374776a64686a717a6f6d68 --- .../zstack/compute/vm/AbstractVmInstance.java | 1 + .../compute/vm/VmInstanceApiInterceptor.java | 21 ++++ .../org/zstack/compute/vm/VmInstanceBase.java | 111 ++++++++++++++++++ conf/serviceConfig/vmInstance.xml | 3 + .../vm/APIUpdateConsolePasswordEvent.java | 38 ++++++ ...UpdateConsolePasswordEventDoc_zh_cn.groovy | 32 +++++ .../vm/APIUpdateConsolePasswordMsg.java | 55 +++++++++ ...PIUpdateConsolePasswordMsgDoc_zh_cn.groovy | 67 +++++++++++ ...pdateVmConsolePasswordOnHypervisorMsg.java | 37 ++++++ ...ateVmConsolePasswordOnHypervisorReply.java | 6 + .../java/org/zstack/kvm/KVMAgentCommands.java | 11 ++ .../main/java/org/zstack/kvm/KVMConstant.java | 1 + .../src/main/java/org/zstack/kvm/KVMHost.java | 67 +++++++++++ .../sdk/UpdateConsolePasswordAction.java | 104 ++++++++++++++++ .../sdk/UpdateConsolePasswordResult.java | 14 +++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ 16 files changed, 595 insertions(+) create mode 100644 header/src/main/java/org/zstack/header/vm/APIUpdateConsolePasswordEvent.java create mode 100644 header/src/main/java/org/zstack/header/vm/APIUpdateConsolePasswordEventDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/vm/APIUpdateConsolePasswordMsg.java create mode 100644 header/src/main/java/org/zstack/header/vm/APIUpdateConsolePasswordMsgDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/vm/UpdateVmConsolePasswordOnHypervisorMsg.java create mode 100644 header/src/main/java/org/zstack/header/vm/UpdateVmConsolePasswordOnHypervisorReply.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateConsolePasswordAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateConsolePasswordResult.java diff --git a/compute/src/main/java/org/zstack/compute/vm/AbstractVmInstance.java b/compute/src/main/java/org/zstack/compute/vm/AbstractVmInstance.java index 100bdb2bc86..51c5ed925ea 100755 --- a/compute/src/main/java/org/zstack/compute/vm/AbstractVmInstance.java +++ b/compute/src/main/java/org/zstack/compute/vm/AbstractVmInstance.java @@ -65,6 +65,7 @@ public abstract class AbstractVmInstance implements VmInstance { AttachIsoToVmInstanceMsg.class.getName(), APIDetachIsoFromVmInstanceMsg.class.getName(), APIGetVmConsoleAddressMsg.class.getName(), + APIUpdateConsolePasswordMsg.class.getName(), APIDeleteVmStaticIpMsg.class.getName(), APIPauseVmInstanceMsg.class.getName(), CreateTemplateFromRootVolumeSnapShotVmMsg.class.getName(), diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceApiInterceptor.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceApiInterceptor.java index fe1f33f104c..e598163a5a9 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceApiInterceptor.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceApiInterceptor.java @@ -9,6 +9,8 @@ import org.zstack.compute.VmNicUtils; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.componentloader.PluginRegistry; +import org.zstack.core.config.GlobalConfigVO; +import org.zstack.core.config.GlobalConfigVO_; import org.zstack.core.db.*; import org.zstack.core.db.SimpleQuery.Op; import org.zstack.header.apimediator.ApiMessageInterceptionException; @@ -137,6 +139,8 @@ else if (msg instanceof APIAttachVmNicToVmMsg) { validate((APIUpdateVmInstanceMsg) msg); } else if (msg instanceof APISetVmConsolePasswordMsg) { validate((APISetVmConsolePasswordMsg) msg); + } else if (msg instanceof APIUpdateConsolePasswordMsg) { + validate((APIUpdateConsolePasswordMsg) msg); } else if (msg instanceof APIChangeInstanceOfferingMsg) { validate((APIChangeInstanceOfferingMsg) msg); } else if (msg instanceof APIMigrateVmMsg) { @@ -1533,6 +1537,23 @@ private void validate(APISetVmConsolePasswordMsg msg) { } } + private void validate(APIUpdateConsolePasswordMsg msg) { + VmInstanceVO vm = dbf.findByUuid(msg.getUuid(), VmInstanceVO.class); + if (vm.getState() != VmInstanceState.Running) { + throw new ApiMessageInterceptionException(operr( + "Cannot update console password for VM[uuid:%s] because it is not in 'Running' state. Current state is '%s'.", + vm.getUuid(), vm.getState() + )); + } + boolean hasPassword = VmSystemTags.CONSOLE_PASSWORD.hasTag(vm.getUuid()); + if (!hasPassword) { + throw new ApiMessageInterceptionException(operr( + "Cannot update the console password for VM[uuid:%s] because no console password is currently set. ", + vm.getUuid() + )); + } + } + private void validate(APIAttachL3NetworkToVmNicMsg msg) { throw new ApiMessageInterceptionException(argerr("can not call this api because it's Deprecated")); } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java index ed98aef34e0..1c4834f9379 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java @@ -3277,6 +3277,8 @@ protected void handleApiMessage(APIMessage msg) { handle((APISetVmBootVolumeMsg) msg); } else if (msg instanceof APISetVmConsolePasswordMsg) { handle((APISetVmConsolePasswordMsg) msg); + } else if (msg instanceof APIUpdateConsolePasswordMsg) { + handle((APIUpdateConsolePasswordMsg) msg); } else if (msg instanceof APISetVmSoundTypeMsg) { handle((APISetVmSoundTypeMsg) msg); } else if (msg instanceof APISetVmQxlMemoryMsg) { @@ -4197,6 +4199,115 @@ public void handle(Map data) { }).start(); } + private void handle(APIUpdateConsolePasswordMsg msg) { + thdf.chainSubmit(new ChainTask(msg) { + @Override + public String getSyncSignature() { + return syncThreadName; + } + + @Override + public String getName() { + return String.format("update-and-apply-console-password-for-vm-%s", msg.getVmInstanceUuid()); + } + + @Override + public void run(SyncTaskChain chain) { + final APIUpdateConsolePasswordEvent evt = new APIUpdateConsolePasswordEvent(msg.getId()); + + refreshVO(); + + ErrorCode error = validateOperationByState(msg, self.getState(), SysErrors.OPERATION_ERROR); + if (error != null) { + throw new OperationFailureException(error); + } + + if (self.getHostUuid() == null) { + throw new OperationFailureException(operr( + "cannot update console password of vm[uuid:%s], the vm is not running on any host", + self.getUuid() + )); + } + + + FlowChain fchain = FlowChainBuilder.newSimpleFlowChain(); + fchain.setName(getName()); + + fchain.then(new Flow() { + String __name__ = "persist-new-console-password-in-db"; + private String oldPassword; + + @Override + public void run(FlowTrigger trigger, Map data) { + oldPassword = Optional.ofNullable(VmSystemTags.CONSOLE_PASSWORD.getTag(self.getUuid())) + .map(tag -> VmSystemTags.CONSOLE_PASSWORD.getTokenByTag(tag, VmSystemTags.CONSOLE_PASSWORD_TOKEN)) + .orElse(null); + + SystemTagCreator creator = VmSystemTags.CONSOLE_PASSWORD.newSystemTagCreator(self.getUuid()); + creator.setTagByTokens(map(e(VmSystemTags.CONSOLE_PASSWORD_TOKEN, msg.getPassword()))); + creator.recreate = true; + creator.create(); + trigger.next(); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + if (oldPassword == null) { + VmSystemTags.CONSOLE_PASSWORD.delete(self.getUuid()); + } else { + SystemTagCreator creator = VmSystemTags.CONSOLE_PASSWORD.newSystemTagCreator(self.getUuid()); + creator.setTagByTokens(map(e(VmSystemTags.CONSOLE_PASSWORD_TOKEN, oldPassword))); + creator.recreate = true; + creator.create(); + } + trigger.rollback(); + } + }); + + fchain.then(new NoRollbackFlow() { + String __name__ = "apply-new-console-password-on-hypervisor"; + + @Override + public void run(FlowTrigger trigger, Map data) { + UpdateVmConsolePasswordOnHypervisorMsg umsg = new UpdateVmConsolePasswordOnHypervisorMsg(); + umsg.setVmInstanceUuid(self.getUuid()); + umsg.setHostUuid(self.getHostUuid()); + umsg.setPassword(msg.getPassword()); + + bus.makeTargetServiceIdByResourceUuid(umsg, HostConstant.SERVICE_ID, self.getHostUuid()); + + bus.send(umsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + } else { + trigger.next(); + } + } + }); + } + }); + + fchain.done(new FlowDoneHandler(msg) { + @Override + public void handle(Map data) { + evt.setInventory(getSelfInventory()); + bus.publish(evt); + chain.next(); + } + }).error(new FlowErrorHandler(msg) { + @Override + public void handle(ErrorCode errCode, Map data) { + evt.setError(errCode); + bus.publish(evt); + chain.next(); + } + }).start(); + } + }); + } + private void handle(APISetVmSoundTypeMsg msg) { APISetVmSoundTypeEvent evt = new APISetVmSoundTypeEvent(msg.getId()); SystemTagCreator creator = VmSystemTags.SOUND_TYPE.newSystemTagCreator(self.getUuid()); diff --git a/conf/serviceConfig/vmInstance.xml b/conf/serviceConfig/vmInstance.xml index 81a683490e5..e24559a05c5 100755 --- a/conf/serviceConfig/vmInstance.xml +++ b/conf/serviceConfig/vmInstance.xml @@ -117,6 +117,9 @@ org.zstack.header.vm.APISetVmConsolePasswordMsg + + org.zstack.header.vm.APIUpdateConsolePasswordMsg + org.zstack.header.vm.APIGetVmConsoleAddressMsg diff --git a/header/src/main/java/org/zstack/header/vm/APIUpdateConsolePasswordEvent.java b/header/src/main/java/org/zstack/header/vm/APIUpdateConsolePasswordEvent.java new file mode 100644 index 00000000000..8e8df9cd1f9 --- /dev/null +++ b/header/src/main/java/org/zstack/header/vm/APIUpdateConsolePasswordEvent.java @@ -0,0 +1,38 @@ +package org.zstack.header.vm; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +/** + * Created by haoyu.ding on 2025/11/19. + */ +@RestResponse(allTo = "inventory") +public class APIUpdateConsolePasswordEvent extends APIEvent { + private VmInstanceInventory inventory; + + public APIUpdateConsolePasswordEvent() { + super(null); + } + + public APIUpdateConsolePasswordEvent(String apiId) { + super(apiId); + } + + public VmInstanceInventory getInventory() { + return inventory; + } + + public void setInventory(VmInstanceInventory inventory) { + this.inventory = inventory; + } + + public static APIUpdateConsolePasswordEvent __example__() { + APIUpdateConsolePasswordEvent event = new APIUpdateConsolePasswordEvent(uuid()); + VmInstanceInventory vm = new VmInstanceInventory(); + vm.setUuid(uuid()); + vm.setName("Test-VM-Updated"); + vm.setState(VmInstanceState.Running.toString()); + event.setInventory(vm); + return event; + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/vm/APIUpdateConsolePasswordEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/vm/APIUpdateConsolePasswordEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..06edb77809a --- /dev/null +++ b/header/src/main/java/org/zstack/header/vm/APIUpdateConsolePasswordEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.vm + +import org.zstack.header.vm.VmInstanceInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "更新虚拟机控制台密码事件" + + ref { + name "inventory" + path "org.zstack.header.vm.APIUpdateConsolePasswordEvent.inventory" + desc "null" + type "VmInstanceInventory" + since "5.4.2" + clz VmInstanceInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.4.2" + } + ref { + name "error" + path "org.zstack.header.vm.APIUpdateConsolePasswordEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.4.2" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/vm/APIUpdateConsolePasswordMsg.java b/header/src/main/java/org/zstack/header/vm/APIUpdateConsolePasswordMsg.java new file mode 100644 index 00000000000..1d5c31917a5 --- /dev/null +++ b/header/src/main/java/org/zstack/header/vm/APIUpdateConsolePasswordMsg.java @@ -0,0 +1,55 @@ +package org.zstack.header.vm; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.log.NoLogging; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; + +/** + * Created by haoyu.ding on 2025/11/19. + */ +@Action(category = VmInstanceConstant.ACTION_CATEGORY) +@RestRequest( + path = "/vm-instances/{uuid}/actions", + isAction = true, + method = HttpMethod.PUT, + responseClass = APIUpdateConsolePasswordEvent.class +) +public class APIUpdateConsolePasswordMsg extends APIMessage implements VmInstanceMessage { + @APIParam(resourceType = VmInstanceVO.class, checkAccount = true, operationTarget = true) + private String uuid; + + @APIParam + @NoLogging + private String password; + + @Override + public String getVmInstanceUuid() { + return uuid; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public static APIUpdateConsolePasswordMsg __example__() { + APIUpdateConsolePasswordMsg msg = new APIUpdateConsolePasswordMsg(); + msg.setUuid(uuid()); + msg.setPassword("new-password-123"); + return msg; + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/vm/APIUpdateConsolePasswordMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/vm/APIUpdateConsolePasswordMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..9b4a3afacd3 --- /dev/null +++ b/header/src/main/java/org/zstack/header/vm/APIUpdateConsolePasswordMsgDoc_zh_cn.groovy @@ -0,0 +1,67 @@ +package org.zstack.header.vm + +import org.zstack.header.vm.APIUpdateConsolePasswordEvent + +doc { + title "UpdateConsolePassword" + + category "vmInstance" + + desc """更新虚拟机控制台密码,虚拟机必须处于运行状态且已设置控制台密码""" + + rest { + request { + url "PUT /v1/vm-instances/{uuid}/actions" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIUpdateConsolePasswordMsg.class + + desc """""" + + params { + + column { + name "uuid" + enclosedIn "updateConsolePassword" + desc "资源的UUID,唯一标示该资源" + location "url" + type "String" + optional false + since "5.4.2" + } + column { + name "password" + enclosedIn "updateConsolePassword" + desc "" + location "body" + type "String" + optional false + since "5.4.2" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.4.2" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.4.2" + } + } + } + + response { + clz APIUpdateConsolePasswordEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/vm/UpdateVmConsolePasswordOnHypervisorMsg.java b/header/src/main/java/org/zstack/header/vm/UpdateVmConsolePasswordOnHypervisorMsg.java new file mode 100644 index 00000000000..c008220bd52 --- /dev/null +++ b/header/src/main/java/org/zstack/header/vm/UpdateVmConsolePasswordOnHypervisorMsg.java @@ -0,0 +1,37 @@ +package org.zstack.header.vm; + +import org.zstack.header.host.HostMessage; +import org.zstack.header.log.NoLogging; +import org.zstack.header.message.NeedReplyMessage; + +public class UpdateVmConsolePasswordOnHypervisorMsg extends NeedReplyMessage implements HostMessage { + private String hostUuid; + private String vmInstanceUuid; + @NoLogging + private String password; + + @Override + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getVmInstanceUuid() { + return vmInstanceUuid; + } + + public void setVmInstanceUuid(String vmInstanceUuid) { + this.vmInstanceUuid = vmInstanceUuid; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/vm/UpdateVmConsolePasswordOnHypervisorReply.java b/header/src/main/java/org/zstack/header/vm/UpdateVmConsolePasswordOnHypervisorReply.java new file mode 100644 index 00000000000..f85cd1fe515 --- /dev/null +++ b/header/src/main/java/org/zstack/header/vm/UpdateVmConsolePasswordOnHypervisorReply.java @@ -0,0 +1,6 @@ +package org.zstack.header.vm; + +import org.zstack.header.message.MessageReply; + +public class UpdateVmConsolePasswordOnHypervisorReply extends MessageReply { +} \ No newline at end of file diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index 91e5d885bd8..401059f60f9 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -992,6 +992,17 @@ public void setMldVersion(Integer mldVersion) { public static class CreateBridgeResponse extends AgentResponse { } + public static class SetVmConsolePasswordLiveCmd extends AgentCommand implements Serializable { + private String vmUuid; + @NoLogging + private String password; + + public String getVmUuid() { return vmUuid; } + public void setVmUuid(String vmUuid) { this.vmUuid = vmUuid; } + public String getPassword() { return password; } + public void setPassword(String password) { this.password = password; } + } + public static class UpdateL2NetworkCmd extends AgentCommand { private String physicalInterfaceName; private String bridgeName; diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java index f40157764ea..21cac149680 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java @@ -121,6 +121,7 @@ public interface KVMConstant { String KVM_BLOCK_COMMIT_VOLUME_PATH = "/vm/volume/blockcommit"; String KVM_BLOCK_PULL_VOLUME_PATH = "/vm/volume/blockpull"; String TAKE_VM_CONSOLE_SCREENSHOT_PATH = "/vm/console/screenshot"; + String UPDATE_VM_CONSOLE_PASSWORD_PATH = "/host/vm/updateConsolePassword/live"; String KVM_HOST_IPSET_ATTACH_NIC_PATH = "/network/ipset/attach"; String KVM_HOST_IPSET_DETACH_NIC_PATH = "/network/ipset/detach"; diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index ab8c29640f3..122eeeeb32e 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -704,6 +704,8 @@ protected void handleLocalMessage(Message msg) { handle((TakeVmConsoleScreenshotMsg) msg); } else if (msg instanceof RestartKvmAgentMsg) { handle((RestartKvmAgentMsg) msg); + } else if (msg instanceof UpdateVmConsolePasswordOnHypervisorMsg) { + handle((UpdateVmConsolePasswordOnHypervisorMsg) msg); } else { super.handleLocalMessage(msg); } @@ -6893,4 +6895,69 @@ public void fail(ErrorCode errorCode) { } }); } + + private void handle(UpdateVmConsolePasswordOnHypervisorMsg msg) { + final UpdateVmConsolePasswordOnHypervisorReply reply = new UpdateVmConsolePasswordOnHypervisorReply(); + + thdf.singleFlightSubmit(new SingleFlightTask(msg) + .setSyncSignature(String.format("update-vm-%s-console-password-on-host-%s", msg.getVmInstanceUuid(), msg.getHostUuid())) + .run(completion -> { + doUpdateVmConsolePasswordOnHypervisor( + msg.getVmInstanceUuid(), + msg.getHostUuid(), + msg.getPassword(), + new ReturnValueCompletion(completion) { + @Override + public void success(UpdateVmConsolePasswordOnHypervisorReply returnValue) { + completion.success(returnValue); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + }) + .done(result -> { + if (result.isSuccess()) { + bus.reply(msg, reply); + } else { + reply.setError(result.getErrorCode()); + bus.reply(msg, reply); + } + }) + ); + } + + private void doUpdateVmConsolePasswordOnHypervisor(String vmUuid, String hostUuid, String password, + ReturnValueCompletion completion) { + SetVmConsolePasswordLiveCmd cmd = new SetVmConsolePasswordLiveCmd(); + cmd.setVmUuid(vmUuid); + cmd.setPassword(password); + + KVMHostAsyncHttpCallMsg kmsg = new KVMHostAsyncHttpCallMsg(); + kmsg.setCommand(cmd); + kmsg.setHostUuid(hostUuid); + kmsg.setPath(KVMConstant.UPDATE_VM_CONSOLE_PASSWORD_PATH); + kmsg.setNoStatusCheck(true); + + bus.makeTargetServiceIdByResourceUuid(kmsg, HostConstant.SERVICE_ID, hostUuid); + bus.send(kmsg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + completion.fail(reply.getError()); + return; + } + + KVMHostAsyncHttpCallReply r = reply.castReply(); + AgentResponse rsp = r.toResponse(AgentResponse.class); + if (!rsp.isSuccess()) { + completion.fail(operr(rsp.getError())); + } else { + completion.success(new UpdateVmConsolePasswordOnHypervisorReply()); + } + } + }); + } } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateConsolePasswordAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateConsolePasswordAction.java new file mode 100644 index 00000000000..c3398dbbe07 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateConsolePasswordAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateConsolePasswordAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UpdateConsolePasswordResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String password; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UpdateConsolePasswordResult value = res.getResult(org.zstack.sdk.UpdateConsolePasswordResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateConsolePasswordResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/vm-instances/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateConsolePassword"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateConsolePasswordResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateConsolePasswordResult.java new file mode 100644 index 00000000000..1462e8ae7db --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateConsolePasswordResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VmInstanceInventory; + +public class UpdateConsolePasswordResult { + public VmInstanceInventory inventory; + public void setInventory(VmInstanceInventory inventory) { + this.inventory = inventory; + } + public VmInstanceInventory getInventory() { + return this.inventory; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 34cf02a9ff5..1fb130443cc 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -43035,6 +43035,33 @@ abstract class ApiHelper { } + def updateConsolePassword(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateConsolePasswordAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateConsolePasswordAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def updateConsoleProxyAgent(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateConsoleProxyAgentAction.class) Closure c) { def a = new org.zstack.sdk.UpdateConsoleProxyAgentAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From 6b6c758104e456abd7703ff19537dac486adee67 Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Mon, 13 Oct 2025 11:16:19 +0800 Subject: [PATCH 637/737] [storage-migration]: storage migration supports specifying volume provision strategy. storage migration supports specifying volume provision strategy. Resolves/Related: ZSTAC-77942 Change-Id: I767861677267636b677578636267746c62777479 --- plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java | 9 ++------- .../org/zstack/sdk/PrimaryStorageMigrateVmAction.java | 3 +++ .../zstack/sdk/PrimaryStorageMigrateVolumeAction.java | 3 +++ 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index ab8c29640f3..38086488fff 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -565,13 +565,8 @@ void runBeforeAsyncJsonPostExts(Map header) { } } - if (commandStr.equals("{}")) { - commandStr = commandStr.replaceAll("\\}$", - String.format("\"%s\":%s}", KVMConstant.KVM_HOST_ADDONS, JSONObjectUtil.toJsonString(kvmHostAddon))); - } else { - commandStr = commandStr.replaceAll("\\}$", - String.format(",\"%s\":%s}", KVMConstant.KVM_HOST_ADDONS, JSONObjectUtil.toJsonString(kvmHostAddon))); - } + commandMap.put(KVMConstant.KVM_HOST_ADDONS, kvmHostAddon); + commandStr = JSONObjectUtil.toJsonString(commandMap); } } diff --git a/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVmAction.java b/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVmAction.java index 60e8edc1025..49641300f27 100644 --- a/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVmAction.java @@ -52,6 +52,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public long bandwidth = 0L; + @Param(required = false, validValues = {"Specified","FollowVolume","FollowDestPrimaryStorage"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String volumeProvisioningStrategy = "FollowDestPrimaryStorage"; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVolumeAction.java index ed88a0bd610..7ed53f5ebce 100644 --- a/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVolumeAction.java @@ -31,6 +31,9 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String dstPrimaryStorageUuid; + @Param(required = false, validValues = {"Specified","FollowVolume","FollowDestPrimaryStorage"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String volumeProvisioningStrategy = "FollowDestPrimaryStorage"; + @Param(required = false) public java.util.List systemTags; From 4baa9811223ccb62c099fa9b53d7f92e30eb6f35 Mon Sep 17 00:00:00 2001 From: shenjin Date: Tue, 16 Dec 2025 20:19:45 +0800 Subject: [PATCH 638/737] [conf]: add dependent devices support for PCI device group Add `dependentDevices` field to `PciDeviceVO` to store related device dependencies. Rename `getRelatedPciDeviceUuids` method to include dependent devices. Resolves: ZSTAC-79394 Change-Id: I6664697077636b7a77697261747a626f74706b71 (cherry picked from commit 6f679187a4e9e493cd12cc7b86ef4c7ac6deeae8) --- conf/db/upgrade/V5.5.0__schema.sql | 4 +++- sdk/src/main/java/org/zstack/sdk/PciDeviceInventory.java | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.5.0__schema.sql b/conf/db/upgrade/V5.5.0__schema.sql index 802f0170ea9..f6f376c5729 100644 --- a/conf/db/upgrade/V5.5.0__schema.sql +++ b/conf/db/upgrade/V5.5.0__schema.sql @@ -1,2 +1,4 @@ CALL ADD_COLUMN('VmVfNicVO', 'secondaryPciDeviceUuid', 'VARCHAR(32)', 1, NULL); -ALTER TABLE `zstack`.`VmVfNicVO` ADD CONSTRAINT `fkVmVfNicVOSecondaryPciDeviceVO` FOREIGN KEY (`secondaryPciDeviceUuid`) REFERENCES `zstack`.`PciDeviceVO` (`uuid`) ON DELETE SET NULL; \ No newline at end of file +ALTER TABLE `zstack`.`VmVfNicVO` ADD CONSTRAINT `fkVmVfNicVOSecondaryPciDeviceVO` FOREIGN KEY (`secondaryPciDeviceUuid`) REFERENCES `zstack`.`PciDeviceVO` (`uuid`) ON DELETE SET NULL; + +CALL ADD_COLUMN('PciDeviceVO', 'dependentDevices', 'varchar(255)', 1, NULL); diff --git a/sdk/src/main/java/org/zstack/sdk/PciDeviceInventory.java b/sdk/src/main/java/org/zstack/sdk/PciDeviceInventory.java index 7dec3755727..06e7e5885c4 100644 --- a/sdk/src/main/java/org/zstack/sdk/PciDeviceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/PciDeviceInventory.java @@ -185,6 +185,14 @@ public java.lang.String getRev() { return this.rev; } + public java.lang.String dependentDevices; + public void setDependentDevices(java.lang.String dependentDevices) { + this.dependentDevices = dependentDevices; + } + public java.lang.String getDependentDevices() { + return this.dependentDevices; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; From e4da6d5a47b5bb8c80c1c5829fdeb147f825c9cf Mon Sep 17 00:00:00 2001 From: shenjin Date: Sun, 30 Nov 2025 12:24:47 +0800 Subject: [PATCH 639/737] [sdk]: support kunlunxin GPU support kunlunxin GPU, add GPU_Communication_Controller Resolves: ZSTAC-79110 Change-Id: I6277786e6e6973637566746c737364637676626a --- sdk/src/main/java/org/zstack/sdk/MdevDeviceType.java | 1 + sdk/src/main/java/org/zstack/sdk/PciDeviceType.java | 1 + 2 files changed, 2 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/MdevDeviceType.java b/sdk/src/main/java/org/zstack/sdk/MdevDeviceType.java index a2ff1befcc4..cb58e93b769 100644 --- a/sdk/src/main/java/org/zstack/sdk/MdevDeviceType.java +++ b/sdk/src/main/java/org/zstack/sdk/MdevDeviceType.java @@ -6,4 +6,5 @@ public enum MdevDeviceType { GPU_Processing_Accelerators, GPU_Co_Processor, GPU_3D_Controller, + GPU_Communication_Controller, } diff --git a/sdk/src/main/java/org/zstack/sdk/PciDeviceType.java b/sdk/src/main/java/org/zstack/sdk/PciDeviceType.java index 2d6cc7a4bac..a81359354f8 100644 --- a/sdk/src/main/java/org/zstack/sdk/PciDeviceType.java +++ b/sdk/src/main/java/org/zstack/sdk/PciDeviceType.java @@ -8,6 +8,7 @@ public enum PciDeviceType { GPU_3D_Controller, GPU_Processing_Accelerators, GPU_Co_Processor, + GPU_Communication_Controller, Ethernet_Controller, Audio_Controller, USB_Controller, From 1afe6f2d87cdf90811997079c71686c0dd8a6f88 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Tue, 18 Nov 2025 18:24:38 +0800 Subject: [PATCH 640/737] [sdk]: support designating ps for slb instance Resolves: ZSTAC-79222 Change-Id: I726a716d61706e716c74656c727779637a6b6b64 --- .../main/java/org/zstack/sdk/CreateSlbInstanceAction.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSlbInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSlbInstanceAction.java index 7019e2c9991..4be292428e7 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSlbInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSlbInstanceAction.java @@ -43,6 +43,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String hostUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String primaryStorageUuidForRootVolume; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List rootVolumeSystemTags; + @Param(required = false) public java.lang.String resourceUuid; From 05817d1785321ab743ae866b678d55fa0d3a16c6 Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Tue, 16 Dec 2025 17:45:43 +0800 Subject: [PATCH 641/737] [vhost]:fix start vm failed 1.When the cluster where the vm is located has attached vhost primary storage, regardless of whether vhost volume is currently attached for vm, we will enable hugepage memory and set the memory access mode to shared. 2.Check hugepage and shared memory before attaching vhost volume to vm online. Resolves/Related: ZSTAC-80546 Change-Id: I74716b65706f6f717a6d626a62757265796c7875 --- .../org/zstack/compute/vm/VmGlobalConfig.java | 4 ++ .../zstack/vhost/kvm/KvmVhostNodeServer.java | 30 +++++++- .../expon/ExponPrimaryStorageCase.groovy | 69 ++++++++++++++++++- 3 files changed, 99 insertions(+), 4 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/vm/VmGlobalConfig.java b/compute/src/main/java/org/zstack/compute/vm/VmGlobalConfig.java index bd79900c13c..b9b5cfa3ef5 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmGlobalConfig.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmGlobalConfig.java @@ -133,4 +133,8 @@ public class VmGlobalConfig { @GlobalConfigValidation(validValues = {"None", "AuthenticAMD"}) @BindResourceConfig(value = {VmInstanceVO.class}) public static GlobalConfig VM_CPUID_VENDOR = new GlobalConfig(CATEGORY, "vm.cpuid.vendor"); + + @GlobalConfigValidation(validValues = {"true", "false", "auto"}) + @GlobalConfigDef(defaultValue = "false", type = String.class, description = "generate config required for vhost primary storage") + public static GlobalConfig GENERATE_CONFIG_VHOST_REQUIRED = new GlobalConfig(CATEGORY, "generate.config.vhost.required"); } diff --git a/plugin/vhost/src/main/java/org/zstack/vhost/kvm/KvmVhostNodeServer.java b/plugin/vhost/src/main/java/org/zstack/vhost/kvm/KvmVhostNodeServer.java index 5b9cf5623e6..fe4dd595e2f 100644 --- a/plugin/vhost/src/main/java/org/zstack/vhost/kvm/KvmVhostNodeServer.java +++ b/plugin/vhost/src/main/java/org/zstack/vhost/kvm/KvmVhostNodeServer.java @@ -1,8 +1,10 @@ package org.zstack.vhost.kvm; +import javax.persistence.TypedQuery; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; +import org.zstack.compute.vm.VmGlobalConfig; import org.zstack.core.componentloader.PluginRegistry; +import org.zstack.core.db.DatabaseFacade; import org.zstack.header.Component; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.OperationFailureException; @@ -15,6 +17,7 @@ import org.zstack.header.volume.VolumeProtocol; import org.zstack.header.volume.VolumeProtocolCapability; import org.zstack.kvm.*; +import org.zstack.resourceconfig.ResourceConfigFacade; import org.zstack.storage.addon.primary.ExternalPrimaryStorageFactory; import java.util.ArrayList; @@ -27,6 +30,10 @@ public class KvmVhostNodeServer implements Component, KVMStartVmExtensionPoint, KVMConvertVolumeExtensionPoint, KVMDetachVolumeExtensionPoint, KVMAttachVolumeExtensionPoint { @Autowired private ExternalPrimaryStorageFactory extPsFactory; + @Autowired + private DatabaseFacade dbf; + @Autowired + private ResourceConfigFacade rcf; private PluginRegistry pluginRgty; @@ -39,6 +46,21 @@ public class KvmVhostNodeServer implements Component, KVMStartVmExtensionPoint, capability.setSupportReadonly(false); } + private boolean needSupportVhostPrimaryStorage(String clusterUuid) { + String generateVhostConfig = VmGlobalConfig.GENERATE_CONFIG_VHOST_REQUIRED.value(String.class); + if (!"auto".equals(generateVhostConfig)) { + return Boolean.parseBoolean(generateVhostConfig); + } + String sql = "select count(ref) from PrimaryStorageClusterRefVO ref, PrimaryStorageOutputProtocolRefVO protoRef" + + " where ref.primaryStorageUuid = protoRef.primaryStorageUuid" + + " and ref.clusterUuid = :clusterUuid" + + " and protoRef.outputProtocol = :outputProtocol"; + TypedQuery q = dbf.getEntityManager().createQuery(sql, Long.class); + q.setParameter("clusterUuid", clusterUuid); + q.setParameter("outputProtocol", VolumeProtocol.Vhost.name()); + Long count = q.getSingleResult(); + return count != null && count > 0; + } @Override public void beforeStartVmOnKvm(KVMHostInventory host, VmInstanceSpec spec, KVMAgentCommands.StartVmCmd cmd) { @@ -54,13 +76,15 @@ public void beforeStartVmOnKvm(KVMHostInventory host, VmInstanceSpec spec, KVMAg } } - cmd.setDataVolumes(dtos); if (VolumeProtocol.Vhost.name().equals(spec.getDestRootVolume().getProtocol()) || - spec.getDestDataVolumes().stream().anyMatch(v -> VolumeProtocol.Vhost.name().equals(v.getProtocol()))) { + spec.getDestDataVolumes().stream().anyMatch(v -> VolumeProtocol.Vhost.name().equals(v.getProtocol())) || + needSupportVhostPrimaryStorage(host.getClusterUuid())) { cmd.setUseHugePage(true); cmd.setMemAccess("shared"); } + cmd.setDataVolumes(dtos); + // vhostuser disk not support readonly mode, so no iso. } diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/expon/ExponPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/expon/ExponPrimaryStorageCase.groovy index 192d189b81d..0f1e52b24c0 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/expon/ExponPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/expon/ExponPrimaryStorageCase.groovy @@ -1,6 +1,8 @@ package org.zstack.test.integration.storage.primary.addon.expon import org.springframework.http.HttpEntity +import org.zstack.compute.cluster.ClusterGlobalConfig +import org.zstack.compute.vm.VmGlobalConfig import org.zstack.core.Platform import org.zstack.core.cloudbus.CloudBus import org.zstack.core.db.Q @@ -49,6 +51,7 @@ import org.zstack.utils.data.SizeUnit import org.zstack.utils.gson.JSONObjectUtil import static java.util.Arrays.asList +import static java.util.UUID.randomUUID import static org.zstack.expon.ExponIscsiHelper.iscsiExportTargetName import static org.zstack.expon.ExponNameHelper.getVolIdFromPath @@ -204,7 +207,7 @@ class ExponPrimaryStorageCase extends SubCase { reconnectPrimaryStorage { uuid = ps.uuid } - + testCreateVmWhenSpecifiedSblk() testDeletePs() } } @@ -713,6 +716,70 @@ class ExponPrimaryStorageCase extends SubCase { } } + void testCreateVmWhenSpecifiedSblk() { + def sblk = addSharedBlockGroupPrimaryStorage { + name = "sblk" + diskUuids = [randomUUID() as String] + zoneUuid = cluster.getZoneUuid() + } as PrimaryStorageInventory + + attachPrimaryStorageToCluster { + primaryStorageUuid = sblk.uuid + clusterUuid = cluster.getUuid() + } + + env.afterSimulator(KVMConstant.KVM_START_VM_PATH) { rsp, HttpEntity e -> + def cmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.StartVmCmd.class) + assert cmd.useHugePage + assert cmd.memAccess == "shared" + return rsp + } + + VmGlobalConfig.GENERATE_CONFIG_VHOST_REQUIRED.updateValue("auto") + + def vm1 = createVmInstance { + name = "vm" + instanceOfferingUuid = instanceOffering.uuid + rootDiskOfferingUuid = diskOffering.uuid + imageUuid = image.uuid + l3NetworkUuids = [l3.uuid] + primaryStorageUuidForRootVolume = sblk.uuid + } as VmInstanceInventory + + VmGlobalConfig.GENERATE_CONFIG_VHOST_REQUIRED.updateValue("true") + + def vm2 = createVmInstance { + name = "vm" + instanceOfferingUuid = instanceOffering.uuid + rootDiskOfferingUuid = diskOffering.uuid + imageUuid = image.uuid + l3NetworkUuids = [l3.uuid] + primaryStorageUuidForRootVolume = sblk.uuid + } as VmInstanceInventory + + detachPrimaryStorageFromCluster { + primaryStorageUuid = sblk.uuid + clusterUuid = cluster.getUuid() + } + + deletePrimaryStorage { + uuid = sblk.uuid + } + + VmGlobalConfig.GENERATE_CONFIG_VHOST_REQUIRED.updateValue("false") + def vm3 = createVmInstance { + name = "vm" + instanceOfferingUuid = instanceOffering.uuid + rootDiskOfferingUuid = diskOffering.uuid + imageUuid = image.uuid + l3NetworkUuids = [l3.uuid] + } as VmInstanceInventory + + deleteVm(vm1.uuid) + deleteVm(vm2.uuid) + deleteVm(vm3.uuid) + } + void testDeletePs() { assert MultiNodeSingleFlightImpl.getExecutor(ps.uuid) != null From 84a53f3d5dcdb2cf92f69a555f5ec2afb8e78c75 Mon Sep 17 00:00:00 2001 From: "zhong.xian" Date: Thu, 18 Dec 2025 18:24:03 +0800 Subject: [PATCH 642/737] [sdk]: add recommendedGpuMemory to ModelInventory Resolves: ZSTAC-80492 Change-Id: I697977666d61636a686b657262736f6b62706b76 --- sdk/src/main/java/org/zstack/sdk/ModelInventory.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/ModelInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java index ec46d527eec..a501bd81fe2 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java @@ -116,6 +116,14 @@ public java.lang.Long getMinGpuMemory() { return this.minGpuMemory; } + public java.lang.Long recommendedGpuMemory; + public void setRecommendedGpuMemory(java.lang.Long recommendedGpuMemory) { + this.recommendedGpuMemory = recommendedGpuMemory; + } + public java.lang.Long getRecommendedGpuMemory() { + return this.recommendedGpuMemory; + } + public java.util.List recommendedGpuNum; public void setRecommendedGpuNum(java.util.List recommendedGpuNum) { this.recommendedGpuNum = recommendedGpuNum; From 94456471e16508f7d6646b09b3006d5bd9aa3392 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Tue, 18 Nov 2025 18:24:38 +0800 Subject: [PATCH 643/737] [sdk]: support designating ps for slb instance Resolves: ZSTAC-79222 Change-Id: I726a716d61706e716c74656c727779637a6b6b64 --- .../main/java/org/zstack/sdk/CreateSlbInstanceAction.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSlbInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSlbInstanceAction.java index 7019e2c9991..4be292428e7 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSlbInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSlbInstanceAction.java @@ -43,6 +43,12 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String hostUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String primaryStorageUuidForRootVolume; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List rootVolumeSystemTags; + @Param(required = false) public java.lang.String resourceUuid; From a56d7a6a515a6e9f6846e68762a3a0bde2c99784 Mon Sep 17 00:00:00 2001 From: J M Date: Fri, 14 Nov 2025 18:04:11 +0800 Subject: [PATCH 644/737] [storage]: external storage support multi pools add systemTag to pass required url. add ExternalPrimaryStorageSpaceVO to record pool capacity. reject no mds or no pools config DBImpact Resolves: ZSTAC-67556 Change-Id: I6f64687a75697362786d6c737473776e6d746663 --- conf/db/upgrade/V5.5.0__schema.sql | 63 +++ conf/persistence.xml | 1 + .../ExternalPrimaryStorage.xml | 8 + conf/springConfigXml/cbd.xml | 4 + .../header/message/NeedReplyMessage.java | 5 + .../header/storage/addon/StorageCapacity.java | 40 ++ .../ExternalPrimaryStorageSpaceInventory.java | 133 +++++ .../ExternalPrimaryStorageSpaceVO.java | 140 ++++++ .../ExternalPrimaryStorageSpaceVO_.java | 19 + .../primary/PrimaryStorageControllerSvc.java | 6 +- .../addon/primary/StorageCapabilities.java | 20 +- .../AllocatePrimaryStorageSpaceMsg.java | 4 + .../primary/PSCapacityExtensionPoint.java | 21 +- .../org/zstack/header/vm/VmInstanceSpec.java | 8 + .../src/main/java/org/zstack/cbd/Config.java | 28 -- .../org/zstack/cbd/kvm/KvmCbdNodeServer.java | 105 +++- .../ceph/primary/CephPrimaryStorageBase.java | 9 +- .../primary/CephPrimaryStorageFactory.java | 6 +- .../zstack/expon/ExponStorageController.java | 24 +- .../ExternalPrimaryStorageAllocator.java | 128 +++++ .../local/LocalStorageAllocatorFactory.java | 3 +- .../nfs/NfsDownloadImageToCacheJob.java | 2 +- .../zstack/vhost/kvm/KvmVhostNodeServer.java | 4 +- .../xinfini/XInfiniStorageController.java | 28 +- .../org/zstack/storage/zbs}/AddonInfo.java | 4 +- .../org/zstack/storage/zbs}/ClusterInfo.java | 2 +- .../java/org/zstack/storage/zbs/Config.java | 61 +++ .../zstack/storage/zbs}/LogicalPoolInfo.java | 2 +- .../org/zstack/storage/zbs/ZbsConstants.java | 3 +- .../org/zstack/storage/zbs/ZbsHelper.java | 31 +- .../org/zstack/storage/zbs/ZbsMdsBase.java | 1 - .../storage/zbs/ZbsPrimaryStorageMdsBase.java | 1 - .../storage/zbs/ZbsStorageController.java | 471 +++++++----------- .../BlockExternalPrimaryStorageBackend.java | 4 + .../BlockExternalPrimaryStorageFactory.java | 6 +- .../addon/primary/ExternalPrimaryStorage.java | 53 +- .../ExternalPrimaryStorageFactory.java | 99 +++- ...rnalPrimaryStorageSpaceCapacityHelper.java | 285 +++++++++++ .../ExternalPrimaryStorageSpaceHelper.java | 56 +++ .../ExternalPrimaryStorageSystemTags.java | 13 + .../storage/primary/ImageCacheUtil.java | 10 +- .../storage/primary/PrimaryStorageBase.java | 1 + .../primary/PrimaryStorageManagerImpl.java | 5 +- .../storage/snapshot/VolumeSnapshotBase.java | 2 + .../snapshot/VolumeSnapshotTreeBase.java | 18 +- .../org/zstack/storage/volume/VolumeBase.java | 2 + .../addon/zbs/ZbsPrimaryStorageCase.groovy | 105 +++- .../testlib/ExternalPrimaryStorageSpec.groovy | 25 +- 48 files changed, 1669 insertions(+), 400 deletions(-) create mode 100644 header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageSpaceInventory.java create mode 100644 header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageSpaceVO.java create mode 100644 header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageSpaceVO_.java delete mode 100644 plugin/cbd/src/main/java/org/zstack/cbd/Config.java create mode 100644 plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/ExternalPrimaryStorageAllocator.java rename plugin/{cbd/src/main/java/org/zstack/cbd => zbs/src/main/java/org/zstack/storage/zbs}/AddonInfo.java (93%) rename plugin/{cbd/src/main/java/org/zstack/cbd => zbs/src/main/java/org/zstack/storage/zbs}/ClusterInfo.java (92%) create mode 100644 plugin/zbs/src/main/java/org/zstack/storage/zbs/Config.java rename plugin/{cbd/src/main/java/org/zstack/cbd => zbs/src/main/java/org/zstack/storage/zbs}/LogicalPoolInfo.java (99%) create mode 100644 storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSpaceCapacityHelper.java create mode 100644 storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSpaceHelper.java create mode 100644 storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSystemTags.java diff --git a/conf/db/upgrade/V5.5.0__schema.sql b/conf/db/upgrade/V5.5.0__schema.sql index f6f376c5729..5d1587afdcd 100644 --- a/conf/db/upgrade/V5.5.0__schema.sql +++ b/conf/db/upgrade/V5.5.0__schema.sql @@ -2,3 +2,66 @@ CALL ADD_COLUMN('VmVfNicVO', 'secondaryPciDeviceUuid', 'VARCHAR(32)', 1, NULL); ALTER TABLE `zstack`.`VmVfNicVO` ADD CONSTRAINT `fkVmVfNicVOSecondaryPciDeviceVO` FOREIGN KEY (`secondaryPciDeviceUuid`) REFERENCES `zstack`.`PciDeviceVO` (`uuid`) ON DELETE SET NULL; CALL ADD_COLUMN('PciDeviceVO', 'dependentDevices', 'varchar(255)', 1, NULL); + +CREATE TABLE IF NOT EXISTS `zstack`.`ExternalPrimaryStorageSpaceVO` +( + uuid VARCHAR(32) NOT NULL, + primaryStorageUuid VARCHAR(32), + locationUrl VARCHAR(255), + type VARCHAR(255), + name VARCHAR(255), + availableCapacity BIGINT, + totalCapacity BIGINT, + availablePhysicalCapacity BIGINT, + totalPhysicalCapacity BIGINT, + `lastOpDate` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` TIMESTAMP, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkExternalPrimaryStorageSpaceVOPrimaryStorageEO` FOREIGN KEY (`primaryStorageUuid`) REFERENCES `zstack`.`PrimaryStorageEO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +DROP PROCEDURE IF EXISTS UpdateVolumeInstallPathForZbs; + +DELIMITER $$ +CREATE PROCEDURE UpdateVolumeInstallPathForZbs() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE psUuid VARCHAR(32); + DECLARE cur CURSOR FOR + SELECT uuid FROM `zstack`.`ExternalPrimaryStorageVO` WHERE identity = 'zbs'; + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + OPEN cur; + read_loop: LOOP + FETCH cur INTO psUuid; + IF done THEN + LEAVE read_loop; + END IF; + + UPDATE `zstack`.`VolumeEO` + SET installPath = CONCAT('zbs://', SUBSTRING_INDEX(SUBSTRING(installPath, 5), '/', -2)) + WHERE primaryStorageUuid = psUuid + AND installPath LIKE 'cbd:%/%/%'; + + UPDATE `zstack`.`VolumeSnapshotEO` + SET primaryStorageInstallPath = CONCAT('zbs://', SUBSTRING_INDEX(SUBSTRING(primaryStorageInstallPath, 5), '/', -2)) + WHERE primaryStorageUuid = psUuid + AND primaryStorageInstallPath LIKE 'cbd:%/%/%'; + + UPDATE `zstack`.`ImageCacheVO` + SET installUrl = CONCAT('zbs://', SUBSTRING_INDEX(SUBSTRING(installUrl, 5), '/', -2)) + WHERE primaryStorageUuid = psUuid + AND installUrl LIKE 'cbd:%/%/%'; + + UPDATE `zstack`.`ImageCacheShadowVO` + SET installUrl = CONCAT('zbs://', SUBSTRING_INDEX(SUBSTRING(installUrl, 5), '/', -2)) + WHERE primaryStorageUuid = psUuid + AND installUrl LIKE 'cbd:%/%/%'; + END LOOP; + CLOSE cur; +END $$ + +DELIMITER ; + +CALL UpdateVolumeInstallPathForZbs(); diff --git a/conf/persistence.xml b/conf/persistence.xml index 33f4326f407..30c36210dd6 100755 --- a/conf/persistence.xml +++ b/conf/persistence.xml @@ -139,6 +139,7 @@ org.zstack.storage.primary.local.LocalStorageResourceRefVO org.zstack.storage.primary.local.LocalStorageHostRefVO org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO + org.zstack.header.storage.addon.primary.ExternalPrimaryStorageSpaceVO org.zstack.header.storage.addon.primary.PrimaryStorageOutputProtocolRefVO org.zstack.header.storage.addon.primary.ExternalPrimaryStorageHostRefVO org.zstack.storage.ceph.backup.CephBackupStorageVO diff --git a/conf/springConfigXml/ExternalPrimaryStorage.xml b/conf/springConfigXml/ExternalPrimaryStorage.xml index 55450dca7b7..60c3ed6115f 100644 --- a/conf/springConfigXml/ExternalPrimaryStorage.xml +++ b/conf/springConfigXml/ExternalPrimaryStorage.xml @@ -25,6 +25,7 @@ + @@ -46,6 +47,13 @@ + + + + + + + diff --git a/conf/springConfigXml/cbd.xml b/conf/springConfigXml/cbd.xml index 1582b325515..fc95b60b6b7 100644 --- a/conf/springConfigXml/cbd.xml +++ b/conf/springConfigXml/cbd.xml @@ -16,6 +16,10 @@ + + + + diff --git a/header/src/main/java/org/zstack/header/message/NeedReplyMessage.java b/header/src/main/java/org/zstack/header/message/NeedReplyMessage.java index 20aa9427295..c873b03b04b 100755 --- a/header/src/main/java/org/zstack/header/message/NeedReplyMessage.java +++ b/header/src/main/java/org/zstack/header/message/NeedReplyMessage.java @@ -24,6 +24,11 @@ public List getSystemTags() { return systemTags; } + public String getSystemTag(Predicate isMatch) { + return systemTags == null ? null : + systemTags.stream().filter(isMatch).findFirst().orElse(null); + } + public void setSystemTags(List systemTags) { this.systemTags = systemTags; } diff --git a/header/src/main/java/org/zstack/header/storage/addon/StorageCapacity.java b/header/src/main/java/org/zstack/header/storage/addon/StorageCapacity.java index 59388eaa758..9f2ff79c7d4 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/StorageCapacity.java +++ b/header/src/main/java/org/zstack/header/storage/addon/StorageCapacity.java @@ -1,8 +1,29 @@ package org.zstack.header.storage.addon; +import java.util.HashMap; +import java.util.Map; + public class StorageCapacity { + public static class Capacity { + public long total; + public long available; + } + private long totalCapacity; private long availableCapacity; + /*** + * key: location url, it must be unique and consistent anywhere and anytime. + * ZStack use location url to identify different storage locations and generate storage space resource uuid based on it. + * storage space resource uuid = UUID.nameUUIDFromBytes((psUuid + locationUrl).getBytes()).toString() + *

+ * if storage do not support multiple locations, return null or empty map. + * if storage support multiple locations, the location url must be the prefix of volume install url. + * ZStack will retrieve the location url from volume install url to find the corresponding capacity info. + */ + private Map capacitiesByLocationUrl; + + // remove in future versions + @Deprecated private StorageHealthy healthy; public long getTotalCapacity() { @@ -21,6 +42,25 @@ public void setAvailableCapacity(long availableCapacity) { this.availableCapacity = availableCapacity; } + public Map getCapacitiesByLocationUrl() { + return capacitiesByLocationUrl; + } + + public void setCapacitiesByLocationUrl(Map capacitiesByLocationUrl) { + this.capacitiesByLocationUrl = capacitiesByLocationUrl; + } + + public void putCapacity(String locationUrl, long availableCapacity, long totalCapacity) { + if (this.capacitiesByLocationUrl == null) { + this.capacitiesByLocationUrl = new HashMap<>(); + } + + Capacity capacity = new Capacity(); + capacity.available = availableCapacity; + capacity.total = totalCapacity; + this.capacitiesByLocationUrl.put(locationUrl, capacity); + } + public StorageHealthy getHealthy() { return healthy; } diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageSpaceInventory.java b/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageSpaceInventory.java new file mode 100644 index 00000000000..c6236d14fae --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageSpaceInventory.java @@ -0,0 +1,133 @@ +package org.zstack.header.storage.addon.primary; + +import org.zstack.header.search.Inventory; + +import javax.persistence.*; +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +@Inventory(mappingVOClass = ExternalPrimaryStorageSpaceVO.class) +public class ExternalPrimaryStorageSpaceInventory implements Serializable { + private String uuid; + private String primaryStorageUuid; + private String locationUrl; + private String type; + private String name; + private Long availableCapacity; + private Long totalCapacity; + private Long availablePhysicalCapacity; + private Long totalPhysicalCapacity; + private Timestamp createDate; + private Timestamp lastOpDate; + + public static ExternalPrimaryStorageSpaceInventory valueOf(ExternalPrimaryStorageSpaceVO vo) { + ExternalPrimaryStorageSpaceInventory inv = new ExternalPrimaryStorageSpaceInventory(); + inv.setUuid(vo.getUuid()); + inv.setPrimaryStorageUuid(vo.getPrimaryStorageUuid()); + inv.setLocationUrl(vo.getLocationUrl()); + inv.setType(vo.getType()); + inv.setName(vo.getName()); + inv.setAvailableCapacity(vo.getAvailableCapacity()); + inv.setTotalCapacity(vo.getTotalCapacity()); + inv.setAvailablePhysicalCapacity(vo.getAvailablePhysicalCapacity()); + inv.setTotalPhysicalCapacity(vo.getTotalPhysicalCapacity()); + inv.setCreateDate(vo.getCreateDate()); + inv.setLastOpDate(vo.getLastOpDate()); + return inv; + } + + public static List valueOf(Collection vos) { + return vos.stream().map(ExternalPrimaryStorageSpaceInventory::valueOf).collect(Collectors.toList()); + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getPrimaryStorageUuid() { + return primaryStorageUuid; + } + + public void setPrimaryStorageUuid(String primaryStorageUuid) { + this.primaryStorageUuid = primaryStorageUuid; + } + + public String getLocationUrl() { + return locationUrl; + } + + public void setLocationUrl(String locationUrl) { + this.locationUrl = locationUrl; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getAvailableCapacity() { + return availableCapacity; + } + + public void setAvailableCapacity(Long availableCapacity) { + this.availableCapacity = availableCapacity; + } + + public Long getTotalCapacity() { + return totalCapacity; + } + + public void setTotalCapacity(Long totalCapacity) { + this.totalCapacity = totalCapacity; + } + + public Long getAvailablePhysicalCapacity() { + return availablePhysicalCapacity; + } + + public void setAvailablePhysicalCapacity(Long availablePhysicalCapacity) { + this.availablePhysicalCapacity = availablePhysicalCapacity; + } + + public Long getTotalPhysicalCapacity() { + return totalPhysicalCapacity; + } + + public void setTotalPhysicalCapacity(Long totalPhysicalCapacity) { + this.totalPhysicalCapacity = totalPhysicalCapacity; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageSpaceVO.java b/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageSpaceVO.java new file mode 100644 index 00000000000..59473955b8f --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageSpaceVO.java @@ -0,0 +1,140 @@ +package org.zstack.header.storage.addon.primary; + +import org.zstack.header.storage.primary.PrimaryStorageEO; +import org.zstack.header.vo.ForeignKey; +import org.zstack.header.vo.ToInventory; + +import javax.persistence.*; +import java.sql.Timestamp; + +@Entity +@Table +public class ExternalPrimaryStorageSpaceVO implements ToInventory { + @Column + @Id + private String uuid; + + @Column + @ForeignKey(parentEntityClass = PrimaryStorageEO.class, onDeleteAction = ForeignKey.ReferenceOption.CASCADE) + private String primaryStorageUuid; + + @Column + private String locationUrl; + + @Column + private String type; + + @Column + private String name; + + @Column + private long availableCapacity; + + @Column + private long totalCapacity; + + @Column + private long availablePhysicalCapacity; + + @Column + private long totalPhysicalCapacity; + + @Column + private Timestamp createDate; + @Column + private Timestamp lastOpDate; + + + @PreUpdate + private void preUpdate() { + lastOpDate = null; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getPrimaryStorageUuid() { + return primaryStorageUuid; + } + + public void setPrimaryStorageUuid(String primaryStorageUuid) { + this.primaryStorageUuid = primaryStorageUuid; + } + + public String getLocationUrl() { + return locationUrl; + } + + public void setLocationUrl(String locationUrl) { + this.locationUrl = locationUrl; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public long getAvailableCapacity() { + return availableCapacity; + } + + public void setAvailableCapacity(long availableCapacity) { + this.availableCapacity = availableCapacity; + } + + public long getTotalCapacity() { + return totalCapacity; + } + + public void setTotalCapacity(long totalCapacity) { + this.totalCapacity = totalCapacity; + } + + public long getAvailablePhysicalCapacity() { + return availablePhysicalCapacity; + } + + public void setAvailablePhysicalCapacity(long availablePhysicalCapacity) { + this.availablePhysicalCapacity = availablePhysicalCapacity; + } + + public long getTotalPhysicalCapacity() { + return totalPhysicalCapacity; + } + + public void setTotalPhysicalCapacity(long totalPhysicalCapacity) { + this.totalPhysicalCapacity = totalPhysicalCapacity; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageSpaceVO_.java b/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageSpaceVO_.java new file mode 100644 index 00000000000..a09a94b389e --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageSpaceVO_.java @@ -0,0 +1,19 @@ +package org.zstack.header.storage.addon.primary; + + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; + +@StaticMetamodel(ExternalPrimaryStorageSpaceVO.class) +public class ExternalPrimaryStorageSpaceVO_ { + + public static volatile SingularAttribute uuid; + public static volatile SingularAttribute primaryStorageUuid; + public static volatile SingularAttribute type; + public static volatile SingularAttribute name; + public static volatile SingularAttribute locationUrl; + public static volatile SingularAttribute availableCapacity; + public static volatile SingularAttribute totalCapacity; + public static volatile SingularAttribute availablePhysicalCapacity; + public static volatile SingularAttribute totalPhysicalCapacity; +} diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java b/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java index 5d6896960ce..48d9b290688 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java @@ -1,5 +1,6 @@ package org.zstack.header.storage.addon.primary; +import org.zstack.header.apimediator.ApiMessageInterceptionException; import org.zstack.header.core.Completion; import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.host.HostInventory; @@ -17,11 +18,14 @@ public interface PrimaryStorageControllerSvc { void connect(String config, String url, ReturnValueCompletion comp); void ping(Completion completion); + void getCapacity(List requiredUrls, ReturnValueCompletion comp); void reportCapacity(ReturnValueCompletion comp); void reportHealthy(ReturnValueCompletion comp); void reportNodeHealthy(HostInventory host, ReturnValueCompletion comp); StorageCapabilities reportCapabilities(); + // TODO: remove this method in future + @Deprecated String allocateSpace(AllocateSpaceSpec aspec); void createVolume(CreateVolumeSpec v, ReturnValueCompletioncomp); @@ -48,7 +52,7 @@ public interface PrimaryStorageControllerSvc { void expungeSnapshot(String installPath, Completion comp); void revertVolumeSnapshot(String snapshotInstallPath, ReturnValueCompletion comp); - void validateConfig(String config); + String validateConfig(String config) throws ApiMessageInterceptionException; void setTrashExpireTime(int timeInSeconds, Completion completion); void onFirstAdditionConfigure(Completion completion); diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/StorageCapabilities.java b/header/src/main/java/org/zstack/header/storage/addon/primary/StorageCapabilities.java index b2a6b7fe64a..e1ca8e8e5c3 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/primary/StorageCapabilities.java +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/StorageCapabilities.java @@ -9,10 +9,10 @@ public class StorageCapabilities { private VolumeSnapshotCapability snapshotCapability; + private boolean supportMultiSpace; private boolean supportCloneFromVolume; - + private boolean supportCloneFromAnotherSpace; private boolean supportStorageQos; - private boolean supportLiveExpandVolume; private boolean supportShareableVolume; private boolean supportExportVolumeSnapshot; @@ -68,6 +68,14 @@ public void setSupportCloneFromVolume(boolean supportCloneFromVolume) { this.supportCloneFromVolume = supportCloneFromVolume; } + public boolean isSupportCloneFromAnotherSpace() { + return supportCloneFromAnotherSpace; + } + + public void setSupportCloneFromAnotherSpace(boolean supportCloneFromAnotherSpace) { + this.supportCloneFromAnotherSpace = supportCloneFromAnotherSpace; + } + public List getSupportedImageFormats() { return supportedImageFormats; } @@ -91,4 +99,12 @@ public boolean isSupportLiveExpandVolume() { public void setSupportLiveExpandVolume(boolean supportLiveExpandVolume) { this.supportLiveExpandVolume = supportLiveExpandVolume; } + + public boolean isSupportMultiSpace() { + return supportMultiSpace; + } + + public void setSupportMultiSpace(boolean supportMultiSpace) { + this.supportMultiSpace = supportMultiSpace; + } } diff --git a/header/src/main/java/org/zstack/header/storage/primary/AllocatePrimaryStorageSpaceMsg.java b/header/src/main/java/org/zstack/header/storage/primary/AllocatePrimaryStorageSpaceMsg.java index 7b8543d03f0..3413603d290 100644 --- a/header/src/main/java/org/zstack/header/storage/primary/AllocatePrimaryStorageSpaceMsg.java +++ b/header/src/main/java/org/zstack/header/storage/primary/AllocatePrimaryStorageSpaceMsg.java @@ -1,6 +1,10 @@ package org.zstack.header.storage.primary; public class AllocatePrimaryStorageSpaceMsg extends AllocatePrimaryStorageMsg { + /** + * Indicates whether to force allocate primary storage space even if the primary storage + * is marked as full. Because some volume snapshot instantiated before allocated + */ private boolean force; private String requiredInstallUri; diff --git a/header/src/main/java/org/zstack/header/storage/primary/PSCapacityExtensionPoint.java b/header/src/main/java/org/zstack/header/storage/primary/PSCapacityExtensionPoint.java index 6a3eba3cd36..7a86252c670 100644 --- a/header/src/main/java/org/zstack/header/storage/primary/PSCapacityExtensionPoint.java +++ b/header/src/main/java/org/zstack/header/storage/primary/PSCapacityExtensionPoint.java @@ -4,8 +4,27 @@ import org.springframework.transaction.annotation.Transactional; public interface PSCapacityExtensionPoint { - String buildAllocatedInstallUrl(AllocatePrimaryStorageSpaceMsg msg, PrimaryStorageInventory psInv); + /** + * Allocate space dry run, return the installUrl that can be used to allocate space + * note: this method will not actually allocate space, just check whether the space can be allocated, + * and it has no thread safety guarantee, so it is possible that the space can be allocated in dry run, + * but fail in actual allocation. + * @param msg + * @param psInv + * @return installUrl that can be used to allocate space + */ + String allocateSpaceDryRun(AllocatePrimaryStorageSpaceMsg msg, PrimaryStorageInventory psInv); + + /** + * Reserve capacity after space allocation. + * throw exception if failed + * @param msg + * @param allocatedInstallUrl + * @param size + * @param psUuid + * @return the actually reserved size + */ @Transactional(propagation = Propagation.MANDATORY) long reserveCapacity(AllocatePrimaryStorageSpaceMsg msg, String allocatedInstallUrl, long size, String psUuid); diff --git a/header/src/main/java/org/zstack/header/vm/VmInstanceSpec.java b/header/src/main/java/org/zstack/header/vm/VmInstanceSpec.java index 96da4293fa8..c182acd19ce 100755 --- a/header/src/main/java/org/zstack/header/vm/VmInstanceSpec.java +++ b/header/src/main/java/org/zstack/header/vm/VmInstanceSpec.java @@ -122,6 +122,7 @@ public boolean isRoot() { public static class ImageSpec implements Serializable { private ImageInventory inventory; + // FIXME: not for multi space primary storage private boolean needDownload = true; private ImageBackupStorageRefInventory selectedBackupStorage; @@ -788,6 +789,13 @@ public void setRootVolumeSystemTags(List rootVolumeSystemTags) { this.rootVolumeSystemTags = rootVolumeSystemTags; } + public void addRootVolumeSystemTag(String rootVolumeSystemTag) { + if (this.rootVolumeSystemTags == null) { + this.rootVolumeSystemTags = new ArrayList<>(); + } + this.rootVolumeSystemTags.add(rootVolumeSystemTag); + } + public List getDataVolumeSystemTags() { return dataVolumeSystemTags; } diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/Config.java b/plugin/cbd/src/main/java/org/zstack/cbd/Config.java deleted file mode 100644 index 99a08cf62da..00000000000 --- a/plugin/cbd/src/main/java/org/zstack/cbd/Config.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.zstack.cbd; - -import java.util.List; - -/** - * @author Xingwei Yu - * @date 2024/4/2 11:13 - */ -public class Config { - private List mdsUrls; - private String logicalPoolName; - - public List getMdsUrls() { - return mdsUrls; - } - - public void setMdsUrls(List mdsUrls) { - this.mdsUrls = mdsUrls; - } - - public String getLogicalPoolName() { - return logicalPoolName; - } - - public void setLogicalPoolName(String logicalPoolName) { - this.logicalPoolName = logicalPoolName; - } -} diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java index 006d7260547..8c3e60e68f7 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java @@ -15,34 +15,36 @@ import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.host.HostConstant; import org.zstack.header.host.HostInventory; import org.zstack.header.host.HostVO; import org.zstack.header.message.MessageReply; -import org.zstack.header.storage.addon.primary.HeartbeatVolumeTO; -import org.zstack.header.storage.addon.primary.PrimaryStorageNodeSvc; -import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageHostRefVO; -import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageHostRefVO_; +import org.zstack.header.storage.addon.primary.*; +import org.zstack.header.vm.VmInstanceInventory; +import org.zstack.header.vm.VmInstanceSpec; +import org.zstack.header.volume.VolumeInventory; import org.zstack.header.volume.VolumeProtocol; -import org.zstack.kvm.KVMAgentCommands; -import org.zstack.kvm.KVMHostAsyncHttpCallMsg; -import org.zstack.kvm.KVMHostAsyncHttpCallReply; -import org.zstack.kvm.KvmSetupSelfFencerExtensionPoint; +import org.zstack.kvm.*; import org.zstack.storage.addon.primary.ExternalHostIdGetter; import org.zstack.storage.addon.primary.ExternalPrimaryStorageFactory; import org.zstack.utils.DebugUtils; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; +import java.util.ArrayList; +import java.util.List; import java.util.Map; +import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; /** * @author Xingwei Yu * @date 2024/4/9 16:22 */ -public class KvmCbdNodeServer implements Component, KvmSetupSelfFencerExtensionPoint { +public class KvmCbdNodeServer implements Component, KvmSetupSelfFencerExtensionPoint, KVMStartVmExtensionPoint, + KVMConvertVolumeExtensionPoint, KVMDetachVolumeExtensionPoint, KVMAttachVolumeExtensionPoint { private static final CLogger logger = Utils.getLogger(KvmCbdNodeServer.class); @Autowired @@ -220,4 +222,89 @@ public void run(MessageReply reply) { } }); } + + private PrimaryStorageNodeSvc getNodeService(VolumeInventory volumeInventory) { + String identity = volumeInventory.getInstallPath().split("://")[0]; + if (!extPsFactory.support(identity)) { + return null; + } + + return extPsFactory.getNodeSvc(volumeInventory.getPrimaryStorageUuid()); + } + + private VolumeTO convertVolumeIfNeeded(VolumeInventory volumeInventory, HostInventory host, VolumeTO volumeTO) { + if (!VolumeProtocol.CBD.name().equals(volumeInventory.getProtocol())) { + return volumeTO; + } + + PrimaryStorageNodeSvc nodeSvc = getNodeService(volumeInventory); + if (nodeSvc == null) { + return volumeTO; + } + + String path = nodeSvc.getActivePath(BaseVolumeInfo.valueOf(volumeInventory), host,false); + volumeTO.setInstallPath(path); + return volumeTO; + } + + @Override + public void beforeAttachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, KVMAgentCommands.AttachDataVolumeCmd cmd, Map data) { + cmd.setVolume(convertVolumeIfNeeded(volume, host, cmd.getVolume())); + } + + @Override + public void afterAttachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, KVMAgentCommands.AttachDataVolumeCmd cmd) { + } + + @Override + public void attachVolumeFailed(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, KVMAgentCommands.AttachDataVolumeCmd cmd, ErrorCode err, Map data) { + + } + + @Override + public VolumeTO convertVolumeIfNeed(KVMHostInventory host, VolumeInventory inventory, VolumeTO to) { + return convertVolumeIfNeeded(inventory, host, to); + } + + @Override + public void beforeDetachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, KVMAgentCommands.DetachDataVolumeCmd cmd) { + cmd.setVolume(convertVolumeIfNeeded(volume, host, cmd.getVolume())); + } + + @Override + public void afterDetachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, KVMAgentCommands.DetachDataVolumeCmd cmd) { + + } + + @Override + public void detachVolumeFailed(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, KVMAgentCommands.DetachDataVolumeCmd cmd, ErrorCode err) { + + } + + @Override + public void beforeStartVmOnKvm(KVMHostInventory host, VmInstanceSpec spec, KVMAgentCommands.StartVmCmd cmd) { + cmd.setRootVolume(convertVolumeIfNeeded(spec.getDestRootVolume(), host, cmd.getRootVolume())); + + List dtos = new ArrayList<>(); + for (VolumeTO to : cmd.getDataVolumes()) { + for (VolumeInventory vol : spec.getDestDataVolumes()) { + if (vol.getUuid().equals(to.getVolumeUuid())) { + dtos.add(convertVolumeIfNeeded(vol, host, to)); + break; + } + } + } + + cmd.setDataVolumes(dtos); + } + + @Override + public void startVmOnKvmSuccess(KVMHostInventory host, VmInstanceSpec spec) { + + } + + @Override + public void startVmOnKvmFailed(KVMHostInventory host, VmInstanceSpec spec, ErrorCode err) { + + } } diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java index 6579e941392..00dcaebe022 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java @@ -1848,6 +1848,7 @@ public void run(MessageReply reply) { chain.done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { + //TODO: replace with ReleasePrimaryStorageSpaceMsg IncreasePrimaryStorageCapacityMsg imsg = new IncreasePrimaryStorageCapacityMsg(); imsg.setPrimaryStorageUuid(self.getUuid()); imsg.setDiskSize(inv.getSize()); @@ -1944,6 +1945,7 @@ public void run(MessageReply reply) { chain.done(new FlowDoneHandler(coml) { @Override public void handle(Map data) { + // TODO: replace with ReleasePrimaryStorageSpaceMsg IncreasePrimaryStorageCapacityMsg imsg = new IncreasePrimaryStorageCapacityMsg(); imsg.setPrimaryStorageUuid(self.getUuid()); imsg.setDiskSize(inv.getSize()); @@ -2512,7 +2514,7 @@ public void run(final SyncTaskChain chain) { if (cache != null) { final CheckIsBitsExistingCmd cmd = new CheckIsBitsExistingCmd(); - cmd.setInstallPath(ImageCacheUtil.getImageCachePath(cache.toInventory())); + cmd.setInstallPath(ImageCacheUtil.getImageCachePath(cache.getInstallUrl())); httpCall(CHECK_BITS_PATH, cmd, CheckIsBitsExistingRsp.class, new ReturnValueCompletion(chain) { @Override public void success(CheckIsBitsExistingRsp returnValue) { @@ -2527,9 +2529,10 @@ public void success(CheckIsBitsExistingRsp returnValue) { q.add(ImageCacheVO_.imageUuid, Op.EQ, image.getInventory().getUuid()); ImageCacheVO cvo = q.find(); - IncreasePrimaryStorageCapacityMsg imsg = new IncreasePrimaryStorageCapacityMsg(); + ReleasePrimaryStorageSpaceMsg imsg = new ReleasePrimaryStorageSpaceMsg(); imsg.setDiskSize(cvo.getSize()); imsg.setPrimaryStorageUuid(cvo.getPrimaryStorageUuid()); + imsg.setAllocatedInstallUrl(cvo.getInstallUrl()); bus.makeTargetServiceIdByResourceUuid(imsg, PrimaryStorageConstant.SERVICE_ID, cvo.getPrimaryStorageUuid()); bus.send(imsg); dbf.remove(cvo); @@ -5438,7 +5441,7 @@ private void deleteSnapshotOnPrimaryStorage(final DeleteSnapshotOnPrimaryStorage httpCall(DELETE_SNAPSHOT_PATH, cmd, DeleteSnapshotRsp.class, new ReturnValueCompletion(msg) { @Override public void success(DeleteSnapshotRsp returnValue) { - osdHelper.releaseAvailableCapWithRatio(msg.getSnapshot().getPrimaryStorageInstallPath(), msg.getSnapshot().getSize()); + osdHelper.releaseAvailableCapacity(msg.getSnapshot().getPrimaryStorageInstallPath(), msg.getSnapshot().getSize()); bus.reply(msg, reply); completion.done(); } diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java index cb7dde9c5cc..a3906011ef0 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java @@ -1249,10 +1249,12 @@ public void preReleaseVmResource(VmInstanceSpec spec, Completion completion) { } @Override - public String buildAllocatedInstallUrl(AllocatePrimaryStorageSpaceMsg msg, PrimaryStorageInventory psInv) { + public String allocateSpaceDryRun(AllocatePrimaryStorageSpaceMsg msg, PrimaryStorageInventory psInv) { if (msg.getRequiredInstallUri() != null) { CephRequiredUrlParser.InstallPath path = CephRequiredUrlParser.getInstallPathFromUri(msg.getRequiredInstallUri()); - checkCephPoolCapacityForNewVolume(path.poolName, msg.getSize(), psInv.getUuid()); + if (!msg.isForce()) { + checkCephPoolCapacityForNewVolume(path.poolName, msg.getSize(), psInv.getUuid()); + } return path.fullPath; } diff --git a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java index 2a3762f98ff..2528ddeb27b 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java +++ b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java @@ -885,6 +885,26 @@ private void reloadDbInfo() { config = StringUtils.isEmpty(self.getConfig()) ? new ExponConfig() : JSONObjectUtil.toObject(self.getConfig(), ExponConfig.class); } + // TODO: add more not found handling when support multi pool + @Override + public void getCapacity(List locationUrl, ReturnValueCompletion comp) { + List pools = getSelfPools(); + StorageCapacity cap = new StorageCapacity(); + long total = pools.stream().mapToLong(FailureDomainModule::getValidSize).sum(); + long avail = total - pools.stream().mapToLong(FailureDomainModule::getRealDataSize).sum(); + cap.setAvailableCapacity(avail); + cap.setTotalCapacity(total); + for (String url : locationUrl) { + String poolName = getPoolNameFromPath(url); + FailureDomainModule pool = pools.stream().filter(it -> it.getFailureDomainName().equals(poolName)).findFirst().orElse(null); + if (pool != null) { + cap.putCapacity(url, pool.getValidSize() - pool.getRealDataSize(), pool.getValidSize()); + } + } + + comp.success(cap); + } + @Override public void reportCapacity(ReturnValueCompletion comp) { reloadDbInfo(); @@ -1310,8 +1330,8 @@ public void revertVolumeSnapshot(String snapshotInstallPath, ReturnValueCompleti } @Override - public void validateConfig(String config) { - + public String validateConfig(String config) { + return config; } @Override diff --git a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/ExternalPrimaryStorageAllocator.java b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/ExternalPrimaryStorageAllocator.java new file mode 100644 index 00000000000..99b5849d1f8 --- /dev/null +++ b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/ExternalPrimaryStorageAllocator.java @@ -0,0 +1,128 @@ +package org.zstack.externalStorage.primary; + +import groovy.lang.Tuple; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.compute.vm.VmAllocateHostAndPrimaryStorageFlow; +import org.zstack.compute.vm.VmAllocateHostFlow; +import org.zstack.core.db.Q; +import org.zstack.externalStorage.primary.kvm.ExternalPrimaryStorageKvmFactory; +import org.zstack.header.core.workflow.Flow; +import org.zstack.header.core.workflow.FlowChain; +import org.zstack.header.core.workflow.FlowTrigger; +import org.zstack.header.core.workflow.NoRollbackFlow; +import org.zstack.header.storage.addon.primary.PrimaryStorageControllerSvc; +import org.zstack.header.storage.addon.primary.StorageCapabilities; +import org.zstack.header.storage.primary.ImageCacheVO; +import org.zstack.header.storage.primary.ImageCacheVO_; +import org.zstack.header.vm.MarshalVmOperationFlowExtensionPoint; +import org.zstack.header.vm.VmInstanceConstant; +import org.zstack.header.vm.VmInstanceSpec; +import org.zstack.storage.addon.primary.ExternalPrimaryStorageFactory; +import org.zstack.storage.addon.primary.ExternalPrimaryStorageSpaceHelper; +import org.zstack.storage.addon.primary.ExternalPrimaryStorageSystemTags; +import org.zstack.storage.primary.ImageCacheUtil; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static org.zstack.core.Platform.operr; + +public class ExternalPrimaryStorageAllocator implements MarshalVmOperationFlowExtensionPoint { + private static final CLogger logger = Utils.getLogger(ExternalPrimaryStorageAllocator.class); + + @Autowired + private ExternalPrimaryStorageFactory extPsFactory; + + @Override + public Flow marshalVmOperationFlow(String previousFlowName, String nextFlowName, FlowChain chain, VmInstanceSpec spec) { + if (VmAllocateHostAndPrimaryStorageFlow.class.getName().equals(nextFlowName)) { + if (spec.getCurrentVmOperation() != VmInstanceConstant.VmOperation.NewCreate || !spec.getImageSpec().relyOnImageCache()) { + return null; + } + + if (extPsFactory.getAllControllerSvcs().isEmpty()) { + return null; + } + + List candidatePsUuid = spec.getCandidatePrimaryStorageUuidsForRootVolume(); + List ts = null; + if (candidatePsUuid == null || candidatePsUuid.isEmpty()) { + ts = Q.New(ImageCacheVO.class).select(ImageCacheVO_.primaryStorageUuid, ImageCacheVO_.installUrl) + .eq(ImageCacheVO_.imageUuid, spec.getImageSpec().getInventory().getUuid()) + .listValues(); + candidatePsUuid = ts.stream().map(it -> (String) it.get(0)).distinct().collect(Collectors.toList()); + } + + // TODO only consider the situation that there is only one candidate primary storage such as fast create + if (candidatePsUuid.size() != 1) { + logger.warn(String.format("ExternalPrimaryStorageAllocator only supports one candidate primary storage, found candidates: %s", candidatePsUuid)); + return null; + } + + String requiredPsUuid = candidatePsUuid.get(0); + PrimaryStorageControllerSvc controller = extPsFactory.getControllerSvc(requiredPsUuid); + if (controller == null) { + return null; + } + StorageCapabilities cap = controller.reportCapabilities(); + if (!cap.isSupportMultiSpace() || cap.isSupportCloneFromAnotherSpace()) { + return null; + } + + List rootSysTags = spec.getRootVolumeSystemTags(); + List cacheInstallUrls = new ArrayList<>(); + if (ts != null) { + for (Tuple t : ts) { + if (requiredPsUuid.equals(t.get(0))) { + cacheInstallUrls.add(ImageCacheUtil.getImageCachePath((String) t.get(1))); + } + } + } else { + cacheInstallUrls = Q.New(ImageCacheVO.class).select(ImageCacheVO_.installUrl) + .eq(ImageCacheVO_.imageUuid, spec.getImageSpec().getInventory().getUuid()) + .eq(ImageCacheVO_.primaryStorageUuid, requiredPsUuid) + .listValues().stream().map(it -> ImageCacheUtil.getImageCachePath((String) it)).collect(Collectors.toList()); + } + if (cacheInstallUrls.isEmpty()) { + logger.warn(String.format("no candidate URLs found for image cache[uuid:%s] on primary storage[uuid:%s]", + spec.getImageSpec().getInventory().getUuid(), requiredPsUuid)); + return null; + } + + ExternalPrimaryStorageSpaceHelper helper = new ExternalPrimaryStorageSpaceHelper(requiredPsUuid, controller.getIdentity()); + List candidateUrls = cacheInstallUrls.stream() + .map(helper::getLocationSpaceUrl) + .collect(Collectors.toList()); + + String requiredUrlTag = rootSysTags == null ? null : + rootSysTags.stream().filter(ExternalPrimaryStorageSystemTags.REQUIRED_INSTALL_URL::isMatch).findFirst().orElse(null); + if (requiredUrlTag != null) { + String requiredUrl = ExternalPrimaryStorageSystemTags.REQUIRED_INSTALL_URL.getTokenByTag( + requiredUrlTag, ExternalPrimaryStorageSystemTags.REQUIRED_INSTALL_URL_TOKEN).replaceAll("/$", ""); + if (candidateUrls.contains(requiredUrl)) { + return null; + } else { + return new NoRollbackFlow() { + @Override + public void run(FlowTrigger trigger, Map data) { + trigger.fail(operr("creation relies on image cache[uuid:%s, locate urls: [%s]], cannot create other places.", spec.getImageSpec().getInventory().getUuid(), candidateUrls)); + + } + }; + } + } else { + spec.addRootVolumeSystemTag(ExternalPrimaryStorageSystemTags.REQUIRED_INSTALL_URL.instantiateTag( + Collections.singletonMap(ExternalPrimaryStorageSystemTags.REQUIRED_INSTALL_URL_TOKEN, candidateUrls.get(0))) + ); + } + } + + return null; + } +} diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageAllocatorFactory.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageAllocatorFactory.java index 9d84ec2a0fc..3d3a2c7f473 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageAllocatorFactory.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageAllocatorFactory.java @@ -16,6 +16,7 @@ import org.zstack.header.allocator.HostAllocatorSpec; import org.zstack.header.allocator.HostAllocatorStrategyExtensionPoint; import org.zstack.header.errorcode.OperationFailureException; +import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.host.HostInventory; import org.zstack.header.host.HostVO; import org.zstack.header.storage.primary.*; @@ -345,7 +346,7 @@ public String getHostUuidByResourceUuid(String primaryStorageUuid, String resUui } @Override - public String buildAllocatedInstallUrl(AllocatePrimaryStorageSpaceMsg msg, PrimaryStorageInventory psInv) { + public String allocateSpaceDryRun(AllocatePrimaryStorageSpaceMsg msg, PrimaryStorageInventory psInv) { String hostUuid = getHostUuidFromAllocateMsg(msg); if (hostUuid == null) { diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsDownloadImageToCacheJob.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsDownloadImageToCacheJob.java index 3ba33c480fc..cf56ff5e5a6 100755 --- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsDownloadImageToCacheJob.java +++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsDownloadImageToCacheJob.java @@ -256,7 +256,7 @@ public void handle(ErrorCode errCode, Map data) { private void useExistingCache(final ImageCacheVO cvo, final ReturnValueCompletion completion) { NfsPrimaryStorageBackend bkd = nfsFactory.getHypervisorBackend(nfsMgr.findHypervisorTypeByImageFormatAndPrimaryStorageUuid(image.getInventory().getFormat(), primaryStorage.getUuid())); - bkd.checkIsBitsExisting(primaryStorage, ImageCacheUtil.getImageCachePath(cvo.toInventory()), new ReturnValueCompletion(completion) { + bkd.checkIsBitsExisting(primaryStorage, ImageCacheUtil.getImageCachePath(cvo.getInstallUrl()), new ReturnValueCompletion(completion) { @Override public void success(Boolean returnValue) { if (returnValue) { diff --git a/plugin/vhost/src/main/java/org/zstack/vhost/kvm/KvmVhostNodeServer.java b/plugin/vhost/src/main/java/org/zstack/vhost/kvm/KvmVhostNodeServer.java index 5b9cf5623e6..c533f114ef2 100644 --- a/plugin/vhost/src/main/java/org/zstack/vhost/kvm/KvmVhostNodeServer.java +++ b/plugin/vhost/src/main/java/org/zstack/vhost/kvm/KvmVhostNodeServer.java @@ -130,10 +130,10 @@ public void beforeDetachVolume(KVMHostInventory host, VmInstanceInventory vm, Vo } @Override - public void afterDetachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, KVMAgentCommands.DetachDataVolumeCmd cmd) { } + public void afterDetachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, KVMAgentCommands.DetachDataVolumeCmd cmd) {} @Override - public void detachVolumeFailed(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, KVMAgentCommands.DetachDataVolumeCmd cmd, ErrorCode err) { } + public void detachVolumeFailed(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, KVMAgentCommands.DetachDataVolumeCmd cmd, ErrorCode err) {} @Override public void beforeAttachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, KVMAgentCommands.AttachDataVolumeCmd cmd, Map data) { diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index 267d55f4039..92224dc1e47 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -558,6 +558,30 @@ private void reloadDbInfo() { config = StringUtils.isEmpty(self.getConfig()) ? new XInfiniConfig() : JSONObjectUtil.toObject(self.getConfig(), XInfiniConfig.class); } + // TODO: add more not found handling when support multi pool + @Override + public void getCapacity(List requiredUrls, ReturnValueCompletion comp) { + Map pools = refreshPoolCapacity() + .stream() + .filter(it -> config.getPoolIds().contains(it.getId())) + .collect(Collectors.toMap(XInfiniAddonInfo.Pool::getId, it -> it)); + + long total = pools.values().stream().mapToLong(XInfiniAddonInfo.Pool::getTotalCapacity).sum(); + long avail = pools.values().stream().mapToLong(XInfiniAddonInfo.Pool::getAvailableCapacity).sum(); + StorageCapacity cap = new StorageCapacity(); + cap.setAvailableCapacity(avail); + cap.setTotalCapacity(total); + + for (String url : requiredUrls) { + int poolId = getPoolIdFromPath(url); + XInfiniAddonInfo.Pool pool = pools.get(poolId); + if (pool != null) { + cap.putCapacity(url, pool.getAvailableCapacity(), pool.getTotalCapacity()); + } + } + comp.success(cap); + } + @Override public void reportCapacity(ReturnValueCompletion comp) { reloadDbInfo(); @@ -1009,8 +1033,8 @@ public void revertVolumeSnapshot(String snapshotInstallPath, ReturnValueCompleti } @Override - public void validateConfig(String config) { - + public String validateConfig(String config) { + return config; } @Override diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/AddonInfo.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/AddonInfo.java similarity index 93% rename from plugin/cbd/src/main/java/org/zstack/cbd/AddonInfo.java rename to plugin/zbs/src/main/java/org/zstack/storage/zbs/AddonInfo.java index c08f5c37c66..d711cf7da41 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/AddonInfo.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/AddonInfo.java @@ -1,4 +1,6 @@ -package org.zstack.cbd; +package org.zstack.storage.zbs; + +import org.zstack.cbd.MdsInfo; import java.util.ArrayList; import java.util.List; diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/ClusterInfo.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ClusterInfo.java similarity index 92% rename from plugin/cbd/src/main/java/org/zstack/cbd/ClusterInfo.java rename to plugin/zbs/src/main/java/org/zstack/storage/zbs/ClusterInfo.java index 6907f7e7e0a..2f0e21d950a 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/ClusterInfo.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ClusterInfo.java @@ -1,4 +1,4 @@ -package org.zstack.cbd; +package org.zstack.storage.zbs; /** * @author Xingwei Yu diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/Config.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/Config.java new file mode 100644 index 00000000000..ca7d1c24066 --- /dev/null +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/Config.java @@ -0,0 +1,61 @@ +package org.zstack.storage.zbs; + + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author Xingwei Yu + * @date 2024/4/2 11:13 + */ +public class Config { + public static class Pool { + public String logicalName; + public String aliasName; + + public Pool(String logicalName, String aliasName) { + this.logicalName = logicalName; + this.aliasName = aliasName; + } + + public Pool() {} + } + + private List mdsUrls; + private List pools; + private String logicalPoolName; + private transient List poolNames; + + public List getMdsUrls() { + return mdsUrls; + } + + public void setMdsUrls(List mdsUrls) { + this.mdsUrls = mdsUrls; + } + + public String getLogicalPoolName() { + return logicalPoolName; + } + + public void setLogicalPoolName(String logicalPoolName) { + this.logicalPoolName = logicalPoolName; + } + + public void setPools(List pools) { + this.pools = pools; + poolNames = getPoolNames(); + } + + public List getPools() { + return pools; + } + + public List getPoolNames() { + if (poolNames == null) { + poolNames = pools == null ? Collections.emptyList() : pools.stream().map(pool -> pool.logicalName).collect(Collectors.toList()); + } + return poolNames; + } +} diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/LogicalPoolInfo.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/LogicalPoolInfo.java similarity index 99% rename from plugin/cbd/src/main/java/org/zstack/cbd/LogicalPoolInfo.java rename to plugin/zbs/src/main/java/org/zstack/storage/zbs/LogicalPoolInfo.java index 8725ca0aaa3..bc3a1a1dfad 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/LogicalPoolInfo.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/LogicalPoolInfo.java @@ -1,4 +1,4 @@ -package org.zstack.cbd; +package org.zstack.storage.zbs; /** * @author Xingwei Yu diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java index 8f547cfeb29..9d69ca21b45 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java @@ -13,8 +13,7 @@ public interface ZbsConstants { String ZBS_PS_ALLOW_PORTS = "7763"; String ZBS_HEARTBEAT_VOLUME_NAME = "zbs_zstack_heartbeat"; long ZBS_HEARTBEAT_VOLUME_SIZE_IN_GIGABYTE = 1; - String ZBS_CBD_LUN_PATH_FORMAT = "cbd:%s/%s/%s"; - String ZBS_CBD_PREFIX_SCHEME = "cbd://"; + String SCHEME_PREFIX = "zbs://"; Integer PRIMARY_STORAGE_MDS_MAXIMUM_PING_FAILURE = 3; String VOLUME_PHYSICAL_BLOCK_SIZE = "4096"; String MEGABYTE_SUPPORTED_VERSION = "1.6.1"; diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java index 7af981c5194..3484be39c20 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java @@ -7,25 +7,40 @@ import org.zstack.utils.VersionComparator; import org.zstack.utils.data.SizeUnit; +import java.util.function.Function; + /** * @author Xingwei Yu * @date 2024/4/9 17:50 */ public class ZbsHelper { - public static void configUrl(String psUuid) { - String psUrl = ZbsConstants.ZBS_CBD_PREFIX_SCHEME + psUuid; - if (!psUrl.equals(Q.New(PrimaryStorageVO.class).select(PrimaryStorageVO_.url).eq(PrimaryStorageVO_.uuid, psUuid).findValue())) { - SQL.New(PrimaryStorageVO.class).set(PrimaryStorageVO_.url, psUrl).eq(PrimaryStorageVO_.uuid, psUuid).update(); - } + // cbdPath: cbd:physical_pool/logical_pool/volume_id + public static String convertCbdPathToZbsPath(String cbdPath) { + return cbdPath.replaceFirst(".+?/", "zbs://"); + } + + public static String convertZbsPathToCbdPath(String zbsPath, Function physicalPoolGetter) { + String logicalPool = getPoolFromVolumePath(zbsPath); + String physicalPool = physicalPoolGetter.apply(logicalPool); + return zbsPath.replaceFirst("zbs://", String.format("cbd:%s/", physicalPool)); } public static String buildHeartbeatVolumePath(String logicalPool) { - return String.format("cbd:%s_physical/%s/%s", logicalPool, logicalPool, ZbsConstants.ZBS_HEARTBEAT_VOLUME_NAME); + return String.format("zbs://%s/%s", logicalPool, ZbsConstants.ZBS_HEARTBEAT_VOLUME_NAME); } - public static String buildVolumePath(String physicalPool, String logicalPool, String volId) { + public static String buildPoolPath(String logicalPool) { + return String.format("zbs://%s", logicalPool); + } + + public static String buildVolumePath(String logicalPool, String volId) { String base = volId.replace("-", ""); - return String.format(ZbsConstants.ZBS_CBD_LUN_PATH_FORMAT, physicalPool, logicalPool, base); + return String.format("zbs://%s/%s", logicalPool, base); + } + + public static String getPoolFromVolumePath(String path) { + String[] parts = path.replace("zbs://", "").split("/"); + return parts[0]; } public static String getVolumeFromSnapshotPath(String path) { diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java index 1d4f286233a..80d3f96e7d2 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java @@ -3,7 +3,6 @@ import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; -import org.zstack.cbd.ClusterInfo; import org.zstack.cbd.MdsInfo; import org.zstack.core.db.DatabaseFacade; import org.zstack.header.core.Completion; diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java index 81309d43642..25bbcec8204 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java @@ -1,7 +1,6 @@ package org.zstack.storage.zbs; import org.springframework.beans.factory.annotation.Autowired; -import org.zstack.cbd.ClusterInfo; import org.zstack.cbd.MdsInfo; import org.zstack.cbd.MdsStatus; import org.zstack.compute.host.HostGlobalConfig; diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 4b725d7d952..b41d219a02a 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -19,13 +19,13 @@ import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; import org.zstack.header.HasThreadContext; +import org.zstack.header.apimediator.ApiMessageInterceptionException; import org.zstack.header.core.*; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.errorcode.SysErrors; -import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.host.HostAO_; import org.zstack.header.host.HostConstant; import org.zstack.header.host.HostInventory; @@ -56,9 +56,14 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; +import java.util.function.Function; +import java.util.function.Predicate; import java.util.stream.Collectors; +import java.util.stream.Stream; +import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; import static org.zstack.storage.zbs.ZbsHelper.*; @@ -83,6 +88,8 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar private AddonInfo addonInfo; private Config config; + private Map physicalPoolByLogicalPool = new ConcurrentHashMap<>(); + public static final String DEPLOY_CLIENT_PATH = "/zbs/primarystorage/client/deploy"; public static final String GET_CAPACITY_PATH = "/zbs/primarystorage/capacity"; public static final String GET_FACTS_PATH = "/zbs/primarystorage/facts"; @@ -116,8 +123,10 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar capabilities.setSnapshotCapability(scap); capabilities.setSupportShareableVolume(true); capabilities.setSupportCloneFromVolume(false); + capabilities.setSupportCloneFromAnotherSpace(false); capabilities.setSupportStorageQos(false); capabilities.setSupportLiveExpandVolume(false); + capabilities.setSupportMultiSpace(true); capabilities.setSupportedImageFormats(Collections.singletonList(ImageConstant.RAW_FORMAT_STRING)); capabilities.setDefaultIsoActiveProtocol(VolumeProtocol.CBD); capabilities.setDefaultImageExportProtocol(VolumeProtocol.NBD); @@ -126,6 +135,7 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar @Override public void activate(BaseVolumeInfo v, HostInventory h, boolean shareable, ReturnValueCompletion comp) { if (VolumeProtocol.CBD.toString().equals(v.getProtocol())) { + comp.success(new CbdVolumeTo()); return; } @@ -151,7 +161,11 @@ public void blacklist(String installPath, String protocol, HostInventory h, Comp @Override public String getActivePath(BaseVolumeInfo v, HostInventory h, boolean shareable) { - return null; + if (VolumeProtocol.CBD.toString().equals(v.getProtocol())) { + return convertZbsPathToCbdPath(v.getInstallPath(), this::getPhysicalPoolName); + } else { + throw new OperationFailureException(operr("not supported protocol[%s] for active", v.getProtocol())); + } } @Override @@ -295,9 +309,10 @@ public synchronized void activateHeartbeatVolume(HostInventory h, ReturnValueCom @Override public void success(CreateVolumeRsp returnValue) { CbdHeartbeatVolumeTO to = new CbdHeartbeatVolumeTO(); - to.setInstallPath(returnValue.installPath); + String zbsPath = returnValue.installPath; + to.setInstallPath(ZbsHelper.convertZbsPathToCbdPath(zbsPath, ZbsStorageController.this::getPhysicalPoolName)); to.setHeartbeatRequiredSpace(SizeUnit.MEGABYTE.toByte(1)); - to.setCoveringPaths(Collections.singletonList(config.getLogicalPoolName())); + to.setCoveringPaths(config.getPoolNames()); comp.success(to); } @@ -319,10 +334,13 @@ public HeartbeatVolumeTO getHeartbeatVolumeActiveInfo(HostInventory h) { reloadDbInfo(); } + String zbsPath = buildHeartbeatVolumePath(config.getLogicalPoolName()); + String cbdPath = ZbsHelper.convertZbsPathToCbdPath(zbsPath, this::getPhysicalPoolName); + CbdHeartbeatVolumeTO to = new CbdHeartbeatVolumeTO(); - to.setInstallPath(buildHeartbeatVolumePath(config.getLogicalPoolName())); + to.setInstallPath(cbdPath); to.setHeartbeatRequiredSpace(SizeUnit.MEGABYTE.toByte(1)); - to.setCoveringPaths(Collections.singletonList(config.getLogicalPoolName())); + to.setCoveringPaths(config.getPoolNames()); return to; } @@ -486,7 +504,6 @@ public void done(ErrorCodeList errorCodeList) { done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { - configUrl(self.getUuid()); addonInfo = newAddonInfo; completion.success(JSONObjectUtil.rehashObject(newAddonInfo, LinkedHashMap.class)); } @@ -546,12 +563,21 @@ public void done(ErrorCodeList errorCodeList) { }); } + @Override + public void getCapacity(List requiredUrls, ReturnValueCompletion comp) { + List poolNames = requiredUrls.stream().map(ZbsHelper::getPoolFromVolumePath).collect(Collectors.toList()); + getPoolCapacities(poolNames, comp); + } + @Override public void reportCapacity(ReturnValueCompletion comp) { reloadDbInfo(); + getPoolCapacities(config.getPoolNames(), comp); + } + private void getPoolCapacities(List poolNames, ReturnValueCompletion comp) { GetCapacityCmd cmd = new GetCapacityCmd(); - cmd.setLogicalPool(config.getLogicalPoolName()); + cmd.logicalPoolNames = poolNames; httpCall(GET_CAPACITY_PATH, cmd, GetCapacityRsp.class, new ReturnValueCompletion(comp) { @Override @@ -570,6 +596,9 @@ public void success(GetCapacityRsp returnValue) { cap.setTotalCapacity(total); cap.setAvailableCapacity(avail); cap.setHealthy(StorageHealthy.Ok); + for (LogicalPoolInfo pool : logicalPoolInfos) { + cap.putCapacity(buildPoolPath(pool.getLogicalPoolName()), pool.getCapacity() - pool.getUsedSize(), pool.getCapacity()); + } comp.success(cap); } @@ -582,14 +611,26 @@ public void fail(ErrorCode errorCode) { @Override public void reportHealthy(ReturnValueCompletion comp) { + // TODO: more accurate healthy report + getPoolCapacities(config.getPoolNames(), new ReturnValueCompletion(comp) { + @Override + public void success(StorageCapacity returnValue) { + comp.success(StorageHealthy.Ok); + } + @Override + public void fail(ErrorCode errorCode) { + comp.success(StorageHealthy.Unknown); + } + }); } @Override public void reportNodeHealthy(HostInventory host, ReturnValueCompletion comp) { CheckHostStorageConnectionCmd cmd = new CheckHostStorageConnectionCmd(); cmd.setHostUuid(host.getUuid()); - cmd.setPath(buildHeartbeatVolumePath(config.getLogicalPoolName())); + String zbsHbPath = buildHeartbeatVolumePath(config.getLogicalPoolName()); + cmd.setPath(ZbsHelper.convertZbsPathToCbdPath(zbsHbPath, this::getPhysicalPoolName)); KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); msg.setCommand(cmd); @@ -625,26 +666,34 @@ public String allocateSpace(AllocateSpaceSpec aspec) { reloadDbInfo(); } - // TODO allocate pool - LogicalPoolInfo logicalPoolInfo = allocateFreePool(aspec.getSize()); + Predicate p = aspec.getRequiredUrl() == null ? null : it -> { + String pool = getPoolFromVolumePath(aspec.getRequiredUrl()); + return StringUtils.equals(pool, it.getLogicalPoolName()); + }; + + LogicalPoolInfo logicalPoolInfo = allocateFreePool(aspec.getSize(), p); if (logicalPoolInfo == null) { - throw new OperationFailureException(operr("no available logical pool with enough space[%d]", aspec.getSize())); + throw new OperationFailureException(operr("no available logical pool with enough space[%d] and required url: %s", + aspec.getSize(), aspec.getRequiredUrl())); } - return buildVolumePath("", config.getLogicalPoolName(), ""); + return buildPoolPath(logicalPoolInfo.getLogicalPoolName()); } - private LogicalPoolInfo allocateFreePool(long size) { + private LogicalPoolInfo allocateFreePool(long size, Predicate filter) { List logicalPoolInfos = getSelfPools(); - return logicalPoolInfos.stream().filter(it -> it.getCapacity() - it.getUsedSize() > size) - .max(Comparator.comparingLong(it -> it.getCapacity() - it.getUsedSize())) + Stream s = logicalPoolInfos.stream().filter(it -> it.getCapacity() - it.getUsedSize() > size); + if (filter != null) { + s = s.filter(filter); + } + + return s.max(Comparator.comparingLong(it -> it.getCapacity() - it.getUsedSize())) .orElse(null); } private List getSelfPools() { - String configLogicalPoolName = config.getLogicalPoolName(); List logicalPoolInfos = addonInfo.getLogicalPoolInfos(); - logicalPoolInfos.removeIf(it -> !configLogicalPoolName.equals(it.getLogicalPoolName())); + logicalPoolInfos.removeIf(it -> !config.getPoolNames().contains(it.getLogicalPoolName())); return logicalPoolInfos; } @@ -653,11 +702,13 @@ public void createVolume(CreateVolumeSpec v, ReturnValueCompletion reloadDbInfo(); CreateVolumeCmd cmd = new CreateVolumeCmd(); - cmd.setLogicalPool(config.getLogicalPoolName()); cmd.setVolume(v.getName()); cmd.setUnit(getSizeUnit(addonInfo.getClusterInfo().getVersion())); cmd.setSize(alignSizeTo(v.getSize(), cmd.getUnit())); cmd.setSkipIfExisting(true); + String poolName = v.getAllocatedUrl() != null ? getPoolFromVolumePath(v.getAllocatedUrl()) : + allocateFreePool(cmd.getSize(), null).getLogicalPoolName(); + cmd.setLogicalPool(poolName); httpCall(CREATE_VOLUME_PATH, cmd, CreateVolumeRsp.class, new ReturnValueCompletion(comp) { @Override @@ -740,7 +791,7 @@ public boolean skip(Map data) { @Override public void run(FlowTrigger trigger, Map data) { ExpandVolumeCmd cmd = new ExpandVolumeCmd(); - cmd.setPath(stats.getInstallPath()); + cmd.setPath(convertZbsPathToCbdPath(stats.getInstallPath(), ZbsStorageController.this::getPhysicalPoolName)); cmd.setUnit(getSizeUnit(addonInfo.getClusterInfo().getVersion())); cmd.setSize(alignSizeTo(dst.getSize(), cmd.getUnit())); @@ -850,9 +901,11 @@ public void fail(ErrorCode errorCode) { } @Override - public void batchStats(Collection installPath, ReturnValueCompletion> comp) { + public void batchStats(Collection installPaths, ReturnValueCompletion> comp) { BatchQueryVolumeCmd cmd = new BatchQueryVolumeCmd(); - cmd.setInstallPaths(installPath); + + cmd.setInstallPaths(installPaths.stream().map(it -> convertZbsPathToCbdPath(it, this::getPhysicalPoolName)) + .collect(Collectors.toList())); httpCall(BATCH_QUERY_VOLUME_PATH, cmd, BatchQueryVolumeRsp.class, new ReturnValueCompletion(comp) { @Override @@ -1053,23 +1106,42 @@ public void fail(ErrorCode errorCode) { } @Override - public void validateConfig(String config) { + public String validateConfig(String config) throws ApiMessageInterceptionException { Config old = JSONObjectUtil.toObject(self.getConfig(), Config.class); Config current = JSONObjectUtil.toObject(config, Config.class); + if (current.getLogicalPoolName() == null && !CollectionUtils.isEmpty(current.getPools())) { + if (current.getPoolNames().contains(old.getLogicalPoolName())) { + current.setLogicalPoolName(old.getLogicalPoolName()); + } else { + current.setLogicalPoolName(current.getPoolNames().get(0)); + } + } + + if (current.getLogicalPoolName() != null && CollectionUtils.isEmpty(current.getPools())) { + current.setPools(Arrays.asList(new Config.Pool(current.getLogicalPoolName(), null))); + } if (current.getLogicalPoolName().contains("/")) { - throw new CloudRuntimeException(String.format("invalid logical pool name[%s]", current.getLogicalPoolName())); + throw new ApiMessageInterceptionException(argerr("invalid logical pool name[%s]", current.getLogicalPoolName())); } - if (current.getMdsUrls().isEmpty()) { - throw new OperationFailureException(operr("ensure at least one MDS is configured")); + if (!current.getPoolNames().contains(current.getLogicalPoolName())) { + throw new ApiMessageInterceptionException(argerr("invalid pool name[%s]", current.getLogicalPoolName())); + } + + if (CollectionUtils.isEmpty(current.getPoolNames())) { + throw new ApiMessageInterceptionException(argerr("ensure at least one pool is configured")); + } + + if (CollectionUtils.isEmpty(current.getMdsUrls())) { + throw new ApiMessageInterceptionException(argerr("ensure at least one MDS is configured")); } List newMdsInfos = parseMdsInfos(current.getMdsUrls()); List duplicateMdsInfos = newMdsInfos.stream().collect(Collectors.groupingBy(MdsInfo::getAddr)) .values().stream().filter(addr -> addr.size() > 1).flatMap(List::stream).collect(Collectors.toList()); if (!duplicateMdsInfos.isEmpty()) { - throw new OperationFailureException(operr("do not allow to add duplicate MDS[%s]", + throw new ApiMessageInterceptionException(argerr("do not allow to add duplicate MDS[%s]", duplicateMdsInfos.stream().map(MdsInfo::getAddr).distinct().collect(Collectors.joining(", ")) )); } @@ -1083,6 +1155,7 @@ public void validateConfig(String config) { base.checkStorageHealth(); } } + return JSONObjectUtil.toJsonString(current); } @Override @@ -1125,6 +1198,8 @@ private void reloadDbInfo() { self = dbf.reload(self); addonInfo = StringUtils.isEmpty(self.getAddonInfo()) ? new AddonInfo() : JSONObjectUtil.toObject(self.getAddonInfo(), AddonInfo.class); config = StringUtils.isEmpty(self.getConfig()) ? new Config() : JSONObjectUtil.toObject(self.getConfig(), Config.class); + physicalPoolByLogicalPool = addonInfo.getLogicalPoolInfos().stream() + .collect(Collectors.toMap(LogicalPoolInfo::getLogicalPoolName, LogicalPoolInfo::getPhysicalPoolName) ); } private List parseMdsInfos(List mdsUrls) { @@ -1139,6 +1214,19 @@ private List parseMdsInfos(List mdsUrls) { }).collect(Collectors.toList()); } + protected String getPhysicalPoolName(String logicalPoolName) { + if (physicalPoolByLogicalPool.containsKey(logicalPoolName)) { + return physicalPoolByLogicalPool.get(logicalPoolName); + } else { + reloadDbInfo(); + String physicalPool = physicalPoolByLogicalPool.get(logicalPoolName); + if (physicalPool == null) { + throw new OperationFailureException(operr("cannot find physical pool for logical pool[%s]", logicalPoolName)); + } + return physicalPool; + } + } + protected T syncHttpCall(final String path, final AgentCommand cmd, final Class retClass) { return httpCall(path, cmd, retClass, null, 0, true); } @@ -1211,6 +1299,10 @@ HttpCaller setTargetMds(String mdsAddr) { } private void prepareCmd() { + if (cmd instanceof VolumeCommand) { + String cbdPath = convertZbsPathToCbdPath(((VolumeCommand) cmd).getPath(), ZbsStorageController.this::getPhysicalPoolName); + ((VolumeCommand) cmd).setPath(cbdPath); + } cmd.setUuid(self.getUuid()); } @@ -1268,6 +1360,13 @@ private void doCall() { ReturnValueCompletion completion = new ReturnValueCompletion(callback) { @Override public void success(T ret) { + if (ret instanceof VolumeResponse) { + String path = ((VolumeResponse) ret).installPath; + if (path != null && path.startsWith("cbd:")) { + ((VolumeResponse) ret).installPath = ZbsHelper.convertCbdPathToZbsPath(path); + } + } + callback.success(ret); } @@ -1309,64 +1408,10 @@ public void setSize(long size) { } } - public static class CopyRsp extends AgentResponse { - private String installPath; - private long size; - private long actualSize; - - public String getInstallPath() { - return installPath; - } - - public void setInstallPath(String installPath) { - this.installPath = installPath; - } - - public long getSize() { - return size; - } - - public void setSize(long size) { - this.size = size; - } - - public long getActualSize() { - return actualSize; - } - - public void setActualSize(long actualSize) { - this.actualSize = actualSize; - } + public static class CopyRsp extends VolumeResponse { } - public static class RollbackSnapshotRsp extends AgentResponse { - private String installPath; - private long size; - private long actualSize; - - public String getInstallPath() { - return installPath; - } - - public void setInstallPath(String installPath) { - this.installPath = installPath; - } - - public long getSize() { - return size; - } - - public void setSize(long size) { - this.size = size; - } - - public long getActualSize() { - return actualSize; - } - - public void setActualSize(long actualSize) { - this.actualSize = actualSize; - } + public static class RollbackSnapshotRsp extends VolumeResponse { } public static class DeleteSnapshotRsp extends AgentResponse { @@ -1440,97 +1485,16 @@ public void setPort(int port) { } } - public static class CloneVolumeRsp extends AgentResponse { - private long size; - private long actualSize; - private String installPath; - - public long getSize() { - return size; - } - - public void setSize(long size) { - this.size = size; - } - - public long getActualSize() { - return actualSize; - } - - public void setActualSize(long actualSize) { - this.actualSize = actualSize; - } - - public String getInstallPath() { - return installPath; - } - - public void setInstallPath(String installPath) { - this.installPath = installPath; - } + public static class CloneVolumeRsp extends VolumeResponse { } - public static class CreateSnapshotRsp extends AgentResponse { - private String installPath; - private long size; - private long actualSize; - - public String getInstallPath() { - return installPath; - } - - public void setInstallPath(String installPath) { - this.installPath = installPath; - } - - public long getSize() { - return size; - } - - public void setSize(long size) { - this.size = size; - } - - public long getActualSize() { - return actualSize; - } - - public void setActualSize(long actualSize) { - this.actualSize = actualSize; - } + public static class CreateSnapshotRsp extends VolumeResponse { } public static class DeleteVolumeRsp extends AgentResponse { } - public static class CreateVolumeRsp extends AgentResponse { - private String installPath; - private long size; - private long actualSize; - - public String getInstallPath() { - return installPath; - } - - public void setInstallPath(String installPath) { - this.installPath = installPath; - } - - public long getSize() { - return size; - } - - public void setSize(long size) { - this.size = size; - } - - public long getActualSize() { - return actualSize; - } - - public void setActualSize(long actualSize) { - this.actualSize = actualSize; - } + public static class CreateVolumeRsp extends VolumeResponse { } public static class GetCapacityRsp extends AgentResponse { @@ -1561,19 +1525,10 @@ public void setPath(String path) { } } - public static class CopyCmd extends AgentCommand implements HasThreadContext { - private String path; + public static class CopyCmd extends VolumeCommand implements HasThreadContext { private String dstVolume; private long dstSize; - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } - public String getDstVolume() { return dstVolume; } @@ -1591,52 +1546,16 @@ public void setDstSize(long dstSize) { } } - public static class RollbackSnapshotCmd extends AgentCommand { - private String path; - - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } + public static class RollbackSnapshotCmd extends VolumeCommand { } - public static class DeleteSnapshotCmd extends AgentCommand { - private String path; - - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } + public static class DeleteSnapshotCmd extends VolumeCommand { } - public static class QueryVolumeCmd extends AgentCommand { - private String path; - - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } + public static class QueryVolumeCmd extends VolumeCommand { } - public static class FlattenVolumeCmd extends AgentCommand { - private String path; - - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } + public static class FlattenVolumeCmd extends VolumeCommand { } public static class BatchQueryVolumeCmd extends AgentCommand { @@ -1672,18 +1591,9 @@ public void setPort(int port) { } } - public static class CbdToNbdCmd extends AgentCommand { - private String path; + public static class CbdToNbdCmd extends VolumeCommand { private String portRange; - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } - public String getPortRange() { return portRange; } @@ -1693,18 +1603,9 @@ public void setPortRange(String portRange) { } } - public static class CloneVolumeCmd extends AgentCommand { - private String path; + public static class CloneVolumeCmd extends VolumeCommand { private String dstVolume; - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } - public String getDstVolume() { return dstVolume; } @@ -1714,19 +1615,10 @@ public void setDstVolume(String dstVolume) { } } - public static class CreateSnapshotCmd extends AgentCommand { - private String path; + public static class CreateSnapshotCmd extends VolumeCommand { private String snapshot; private boolean skipOnExisting; - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } - public String getSnapshot() { return snapshot; } @@ -1744,18 +1636,9 @@ public void setSkipOnExisting(boolean skipOnExisting) { } } - public static class DeleteVolumeCmd extends AgentCommand { - private String path; + public static class DeleteVolumeCmd extends VolumeCommand { private boolean force; - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } - public boolean isForce() { return force; } @@ -1765,16 +1648,7 @@ public void setForce(boolean force) { } } - public static class GetVolumeClientsCmd extends AgentCommand { - private String path; - - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } + public static class GetVolumeClientsCmd extends VolumeCommand { } public static class ClientInfo { @@ -1834,6 +1708,14 @@ public String getUnit() { public void setUnit(String unit) { this.unit = unit; } + + public long getSizeInBytes() { + if (unit != null && unit.toLowerCase().startsWith("m")) { + return SizeUnit.MEGABYTE.toByte(size); + } else { + return size; + } + } } public static class CreateVolumeCmd extends SizeCmd { @@ -1867,14 +1749,14 @@ public void setSkipIfExisting(boolean skipIfExisting) { } public static class GetCapacityCmd extends AgentCommand { - private String logicalPool; + private List logicalPoolNames; - public String getLogicalPool() { - return logicalPool; + public List getLogicalPoolNames() { + return logicalPoolNames; } - public void setLogicalPool(String logicalPool) { - this.logicalPool = logicalPool; + public void setLogicalPoolNames(List logicalPoolNames) { + this.logicalPoolNames = logicalPoolNames; } } @@ -1941,9 +1823,8 @@ public void setVersion(String version) { public static class GetFactsCmd extends AgentCommand { } - public static class CheckHostStorageConnectionCmd extends AgentCommand { + public static class CheckHostStorageConnectionCmd extends VolumeCommand { public String hostUuid; - private String path; public String getHostUuid() { return hostUuid; @@ -1952,17 +1833,51 @@ public String getHostUuid() { public void setHostUuid(String hostUuid) { this.hostUuid = hostUuid; } + } - public String getPath() { - return path; - } + public static class CheckHostStorageConnectionRsp extends AgentResponse { + } + + public static abstract class VolumeCommand extends AgentCommand { + protected String path; public void setPath(String path) { this.path = path; } + + public String getPath() { + return path; + } } - public static class CheckHostStorageConnectionRsp extends AgentResponse { + public static abstract class VolumeResponse extends AgentResponse { + protected String installPath; + protected long size; + protected long actualSize; + + public void setInstallPath(String installPath) { + this.installPath = installPath; + } + + public String getInstallPath() { + return installPath; + } + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } + + public long getActualSize() { + return actualSize; + } + + public void setActualSize(long actualSize) { + this.actualSize = actualSize; + } } public static class UpdateHostDependencyCmd extends AgentCommand { diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/BlockExternalPrimaryStorageBackend.java b/storage/src/main/java/org/zstack/storage/addon/primary/BlockExternalPrimaryStorageBackend.java index 4641315ed63..dc2cfa760bf 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/BlockExternalPrimaryStorageBackend.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/BlockExternalPrimaryStorageBackend.java @@ -3,6 +3,10 @@ import org.zstack.header.storage.primary.*; import org.zstack.header.volume.block.GetAccessPathMsg; +/** + * do not match external primary storage design. + */ +@Deprecated public interface BlockExternalPrimaryStorageBackend { String getType(); diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/BlockExternalPrimaryStorageFactory.java b/storage/src/main/java/org/zstack/storage/addon/primary/BlockExternalPrimaryStorageFactory.java index 2c561cc03a3..7c1b5839efa 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/BlockExternalPrimaryStorageFactory.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/BlockExternalPrimaryStorageFactory.java @@ -1,11 +1,13 @@ package org.zstack.storage.addon.primary; -import org.zstack.header.host.HostInventory; -import org.zstack.header.storage.addon.primary.BaseVolumeInfo; import org.zstack.header.storage.primary.PrimaryStorageVO; import java.util.Map; +/** + * do not match external primary storage design. + */ +@Deprecated public interface BlockExternalPrimaryStorageFactory { String getType(); diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index 79332acdc88..18fc2af1f16 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -183,8 +183,8 @@ private void handle(APIUpdateExternalPrimaryStorageMsg msg) { } boolean needReconnect = false; if (msg.getConfig() != null) { - controller.validateConfig(msg.getConfig()); - externalVO.setConfig(msg.getConfig()); + String config = controller.validateConfig(msg.getConfig()); + externalVO.setConfig(config); needReconnect = true; } externalVO = dbf.updateAndRefresh(externalVO); @@ -336,7 +336,7 @@ public void setup() { @Override public void run(final FlowTrigger trigger, Map data) { - downloadImageCache(msg.getTemplateSpec().getInventory(), new ReturnValueCompletion(trigger) { + downloadImageCache(msg.getTemplateSpec().getInventory(), spec.getAllocatedUrl(), new ReturnValueCompletion(trigger) { @Override public void success(ImageCacheInventory returnValue) { pathInCache = ImageCacheUtil.getImageCachePath(returnValue); @@ -1156,7 +1156,7 @@ public void fail(ErrorCode errorCode) { }); } - private void downloadImageCache(ImageInventory image, ReturnValueCompletion completion) { + private void downloadImageCache(ImageInventory image, String allocatedUrl, ReturnValueCompletion completion) { thdf.chainSubmit(new ChainTask(completion) { @Override public String getSyncSignature() { @@ -1165,7 +1165,7 @@ public String getSyncSignature() { @Override public void run(SyncTaskChain chain) { - doDownloadImageCache(image, new ReturnValueCompletion(chain) { + doDownloadImageCache(image, allocatedUrl, new ReturnValueCompletion(chain) { @Override public void success(ImageCacheInventory returnValue) { completion.success(returnValue); @@ -1187,19 +1187,24 @@ public String getName() { }); } - private void doDownloadImageCache(ImageInventory image, ReturnValueCompletion completion) { + private void doDownloadImageCache(ImageInventory image, String allocatedUrl, ReturnValueCompletion completion) { CreateVolumeSpec spec = new CreateVolumeSpec(); spec.setUuid(image.getUuid()); spec.setName(buildImageName(image.getUuid())); + spec.setAllocatedUrl(allocatedUrl); - ImageCacheVO cache = Q.New(ImageCacheVO.class) + List caches = Q.New(ImageCacheVO.class) .eq(ImageCacheVO_.primaryStorageUuid, self.getUuid()) .eq(ImageCacheVO_.imageUuid, image.getUuid()) - .find(); - if (cache != null) { - // TODO check exists in ps - completion.success(ImageCacheInventory.valueOf(cache)); - return; + .list(); + + for (ImageCacheVO cache : caches) { + ImageCacheInventory inv = cache.toInventory(); + // TODO: suppose that path always starts with allocatedUrl + if (allocatedUrl != null && ImageCacheUtil.getImageCachePath(inv).startsWith(allocatedUrl)) { + completion.success(inv); + return; + } } downloadImageTo(image, spec, ImageCacheVO.class.getSimpleName(), new ReturnValueCompletion(completion) { @@ -1429,6 +1434,7 @@ protected void handle(GetInstallPathForDataVolumeDownloadMsg msg) { AllocateSpaceSpec aspec = new AllocateSpaceSpec(); aspec.setSize(msg.getImage().getSize()); aspec.setPurpose(PrimaryStorageAllocationPurpose.CreateDataVolume); + aspec.setRequiredUrl(msg.getAllocatedInstallUrl()); String installPath = controller.allocateSpace(aspec); reply.setInstallPath(installPath); @@ -1567,6 +1573,8 @@ protected void handle(DeleteVolumeOnPrimaryStorageMsg msg) { trashVolume(msg.getVolume().getInstallPath(), msg.getVolume().getProtocol(), force, new Completion(msg) { @Override public void success() { + ExternalPrimaryStorageSpaceCapacityHelper helper = new ExternalPrimaryStorageSpaceCapacityHelper(self.getUuid(), controller.getIdentity()); + helper.releaseAvailableCapWithRatio(msg.getVolume().getInstallPath(), msg.getVolume().getSize()); bus.reply(msg, reply); } @@ -1617,7 +1625,12 @@ public void fail(ErrorCode errorCode) { @Override protected void handle(DownloadIsoToPrimaryStorageMsg msg) { DownloadIsoToPrimaryStorageReply reply = new DownloadIsoToPrimaryStorageReply(); - downloadImageCache(msg.getIsoSpec().getInventory(), new ReturnValueCompletion(msg) { + String urlTag = msg.getSystemTag(ExternalPrimaryStorageSystemTags.REQUIRED_INSTALL_URL::isMatch); + String allocatedUrl = urlTag == null ? null : + ExternalPrimaryStorageSystemTags.REQUIRED_INSTALL_URL.getTokenByTag(urlTag, + ExternalPrimaryStorageSystemTags.REQUIRED_INSTALL_URL_TOKEN); + + downloadImageCache(msg.getIsoSpec().getInventory(), allocatedUrl, new ReturnValueCompletion(msg) { @Override public void success(ImageCacheInventory cache) { String isoProtocol = controller.reportCapabilities().getDefaultIsoActiveProtocol() != null @@ -1774,6 +1787,8 @@ protected void handle(DeleteSnapshotOnPrimaryStorageMsg msg) { controller.deleteSnapshot(msg.getSnapshot().getPrimaryStorageInstallPath(), new Completion(msg) { @Override public void success() { + ExternalPrimaryStorageSpaceCapacityHelper helper = new ExternalPrimaryStorageSpaceCapacityHelper(self.getUuid(), controller.getIdentity()); + helper.releaseAvailableCapacity(msg.getSnapshot().getPrimaryStorageInstallPath(), msg.getSnapshot().getSize()); bus.reply(msg, reply); } @@ -1828,7 +1843,7 @@ public void run(final FlowTrigger trigger, Map data) { } ImageInventory image = ImageInventory.valueOf(ivo); - downloadImageCache(image, new ReturnValueCompletion(trigger) { + downloadImageCache(image, msg.getAllocatedInstallUrl(), new ReturnValueCompletion(trigger) { @Override public void success(ImageCacheInventory returnValue) { installUrl = returnValue.getInstallUrl(); @@ -1964,15 +1979,19 @@ protected void handle(CheckVolumeSnapshotOperationOnPrimaryStorageMsg msg) { @Override protected void connectHook(ConnectParam param, Completion completion) { - controller.validateConfig(externalVO.getConfig()); - controller.connect(externalVO.getConfig(), self.getUrl(), new ReturnValueCompletion(completion) { + String config = controller.validateConfig(externalVO.getConfig()); + controller.connect(config, self.getUrl(), new ReturnValueCompletion(completion) { @Override public void success(LinkedHashMap addonInfo) { if (param.isNewAdded()) { controller.onFirstAdditionConfigure(new NopeCompletion()); } + SQL.New(ExternalPrimaryStorageVO.class).eq(ExternalPrimaryStorageVO_.uuid, self.getUuid()) .set(ExternalPrimaryStorageVO_.addonInfo, JSONObjectUtil.toJsonString(addonInfo)) + .set(ExternalPrimaryStorageVO_.config, config) + .set(ExternalPrimaryStorageVO_.url, StringUtils.isEmpty(self.getUrl()) ? + externalVO.getIdentity() + "://" + self.getUuid() : self.getUrl()) .update(); controller.setTrashExpireTime(PrimaryStorageGlobalConfig.TRASH_EXPIRATION_TIME.value(Integer.class), new NopeCompletion()); pingHook(completion); @@ -2031,6 +2050,8 @@ public void success(StorageCapacity capacity) { return cap; }); + + new ExternalPrimaryStorageSpaceCapacityHelper(externalVO).updateStorageSpace(capacity); trigger.next(); } else { trigger.fail(operr("storage is not healthy:%s", capacity.getHealthy().toString())); diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java index a8e00d3a0ad..8e715f6a6f5 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java @@ -2,6 +2,8 @@ import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; import org.zstack.core.Platform; import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.CloudBus; @@ -43,6 +45,7 @@ import org.zstack.header.volume.VolumeDeletionPolicyManager; import org.zstack.header.volume.VolumeInventory; import org.zstack.header.volume.VolumeVO; +import org.zstack.header.volume.VolumeVO_; import org.zstack.header.volume.block.BlockVolumeVO; import org.zstack.storage.addon.backup.ExternalBackupStorageFactory; import org.zstack.storage.primary.PrimaryStorageFeatureAllocatorExtensionPoint; @@ -65,7 +68,8 @@ public class ExternalPrimaryStorageFactory implements PrimaryStorageFactory, Com VmAttachVolumeExtensionPoint, VmDetachVolumeExtensionPoint, BeforeTakeLiveSnapshotsOnVolumes, CreateTemplateFromVolumeSnapshotExtensionPoint, MarkRootVolumeAsSnapshotExtension, VmInstanceMigrateExtensionPoint, ManagementNodeChangeListener, PrimaryStorageFeatureAllocatorExtensionPoint, HostResizeVolumeExtensionPoint, - VolumeSnapshotAfterDeleteExtensionPoint, ChangeVolumeProcessingMethodExtensionPoint { + VolumeSnapshotAfterDeleteExtensionPoint, ChangeVolumeProcessingMethodExtensionPoint, + RecalculatePrimaryStorageCapacityExtensionPoint { private static final CLogger logger = Utils.getLogger(ExternalBackupStorageFactory.class); public static PrimaryStorageType type = new PrimaryStorageType(PrimaryStorageConstant.EXTERNAL_PRIMARY_STORAGE_TYPE); @@ -173,38 +177,87 @@ public boolean stop() { return false; } + private String getRequiredUrl(ExternalPrimaryStorageSpaceCapacityHelper helper, AllocatePrimaryStorageSpaceMsg msg) { + if (msg.getRequiredInstallUri() != null) { + String url = msg.getRequiredInstallUri(); + if (!url.startsWith("volume://")) { + return url; + } + + String volUuid = url.substring("volume://".length()); + String volumePath = Q.New(VolumeVO.class).eq(VolumeVO_.uuid, volUuid).select(VolumeVO_.installPath).findValue(); + if (volumePath == null) { + throw new OperationFailureException( + Platform.operr("cannot find volume[uuid:%s] install path", volUuid) + ); + } + + return helper.getLocationSpaceUrl(volumePath); + } + + String requiredSystag = msg.getSystemTag(ExternalPrimaryStorageSystemTags.REQUIRED_INSTALL_URL::isMatch); + if (requiredSystag != null) { + return ExternalPrimaryStorageSystemTags.REQUIRED_INSTALL_URL.getTokenByTag(requiredSystag, + ExternalPrimaryStorageSystemTags.REQUIRED_INSTALL_URL_TOKEN); + } + + return null; + } + @Override - public String buildAllocatedInstallUrl(AllocatePrimaryStorageSpaceMsg msg, PrimaryStorageInventory psInv) { + public String allocateSpaceDryRun(AllocatePrimaryStorageSpaceMsg msg, PrimaryStorageInventory psInv) { PrimaryStorageControllerSvc controller = controllers.get(psInv.getUuid()); if (controller == null) { return psInv.getUrl(); } - AllocateSpaceSpec aspec = new AllocateSpaceSpec(); - aspec.setDryRun(true); - aspec.setSize(msg.getSize()); - aspec.setRequiredUrl(msg.getRequiredInstallUri()); - return controller.allocateSpace(aspec); + ExternalPrimaryStorageSpaceCapacityHelper helper = new ExternalPrimaryStorageSpaceCapacityHelper(psInv.getUuid(), controller.getIdentity()); + String requiredUrl = getRequiredUrl(helper, msg); + + // TODO: remove it + if (!controller.reportCapabilities().isSupportMultiSpace()) { + AllocateSpaceSpec aspec = new AllocateSpaceSpec(); + aspec.setDryRun(true); + aspec.setSize(msg.getSize()); + aspec.setRequiredUrl(requiredUrl); + return controller.allocateSpace(aspec); + } + + if (requiredUrl != null) { + if (msg.isForce() || helper.checkVirtualSizeByRatio(requiredUrl, msg.getSize())) { + return requiredUrl; + } else { + return null; + } + } + + // return max available capacity space + return helper.findMostSuitableSpace(msg.getSize(), Comparator.comparingLong(ExternalPrimaryStorageSpaceVO::getAvailableCapacity).reversed()); } @Override + @Transactional(propagation = Propagation.MANDATORY) public long reserveCapacity(AllocatePrimaryStorageSpaceMsg msg, String allocatedInstallUrl, long size, String psUuid) { PrimaryStorageControllerSvc controller = controllers.get(psUuid); - if (controller == null) { + if (controller == null || !controller.reportCapabilities().isSupportMultiSpace()) { return size; } - AllocateSpaceSpec aspec = new AllocateSpaceSpec(); - aspec.setDryRun(false); - aspec.setSize(msg.getSize()); - aspec.setRequiredUrl(msg.getRequiredInstallUri()); - controller.allocateSpace(aspec); + ExternalPrimaryStorageSpaceCapacityHelper helper = new ExternalPrimaryStorageSpaceCapacityHelper(psUuid, controller.getIdentity()); + helper.reserveAvailableCapacity(allocatedInstallUrl, size); return size; } @Override + @Transactional(propagation = Propagation.MANDATORY) public void releaseCapacity(String allocatedInstallUrl, long size, String psUuid) { + PrimaryStorageControllerSvc controller = controllers.get(psUuid); + if (controller == null || !controller.reportCapabilities().isSupportMultiSpace()) { + return; + } + ExternalPrimaryStorageSpaceCapacityHelper helper = new ExternalPrimaryStorageSpaceCapacityHelper(psUuid, controller.getIdentity()); + helper.releaseAvailableCapacity(allocatedInstallUrl, size); } @Override @@ -274,6 +327,10 @@ public void validateStorageProtocol(String protocol) { } } + public List getAllControllerSvcs() { + return new ArrayList<>(controllers.values()); + } + public PrimaryStorageControllerSvc getControllerSvc(String primaryStorageUuid) { return controllers.get(primaryStorageUuid); } @@ -1076,4 +1133,20 @@ public VolumeDeletionPolicyManager.VolumeDeletionPolicy getTransientVolumeDeleti } return VolumeDeletionPolicyManager.VolumeDeletionPolicy.DBOnly; } + + public String getPrimaryStorageTypeForRecalculateCapacityExtensionPoint() { + return type.toString(); + } + + @Override + public void afterRecalculatePrimaryStorageCapacity(RecalculatePrimaryStorageCapacityStruct struct) { + PrimaryStorageControllerSvc controller = controllers.get(struct.getPrimaryStorageUuid()); + if (controller == null || !controller.reportCapabilities().isSupportMultiSpace()) { + return; + } + new ExternalPrimaryStorageSpaceCapacityHelper(struct.getPrimaryStorageUuid(), controller.getIdentity()).recalculateAvailableCapacity(); + } + + @Override + public void beforeRecalculatePrimaryStorageCapacity(RecalculatePrimaryStorageCapacityStruct struct) {} } diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSpaceCapacityHelper.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSpaceCapacityHelper.java new file mode 100644 index 00000000000..9fa5f2269bc --- /dev/null +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSpaceCapacityHelper.java @@ -0,0 +1,285 @@ +package org.zstack.storage.addon.primary; + +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Configurable; +import org.springframework.transaction.annotation.Transactional; +import org.zstack.core.Platform; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.DeadlockAutoRestart; +import org.zstack.core.db.Q; +import org.zstack.core.db.SQL; +import org.zstack.header.errorcode.OperationFailureException; +import org.zstack.header.storage.addon.StorageCapacity; +import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageSpaceVO; +import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageSpaceVO_; +import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO; +import org.zstack.header.storage.primary.ImageCacheVO; +import org.zstack.header.storage.primary.ImageCacheVO_; +import org.zstack.header.storage.primary.PrimaryStorageOverProvisioningManager; +import org.zstack.header.storage.snapshot.VolumeSnapshotVO; +import org.zstack.header.storage.snapshot.VolumeSnapshotVO_; +import org.zstack.header.volume.VolumeVO; +import org.zstack.header.volume.VolumeVO_; +import org.zstack.storage.primary.PrimaryStorageCapacityChecker; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; +import org.zstack.utils.stopwatch.StopWatch; + +import java.util.*; +import java.util.stream.Collectors; + +import static java.util.Arrays.asList; +import static org.zstack.core.Platform.operr; + + +@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) +public class ExternalPrimaryStorageSpaceCapacityHelper extends ExternalPrimaryStorageSpaceHelper { + @Autowired + protected PrimaryStorageOverProvisioningManager ratioMgr; + @Autowired + protected ExternalPrimaryStorageFactory extFactory; + @Autowired + protected DatabaseFacade dbf; + + + private static final CLogger logger = Utils.getLogger(ExternalPrimaryStorageSpaceCapacityHelper.class); + + private String primaryStorageUuid; + private String spaceName; + private Map storageSpacesByUrl; + + public ExternalPrimaryStorageSpaceCapacityHelper(ExternalPrimaryStorageVO ps) { + super(ps); + this.primaryStorageUuid = ps.getUuid(); + this.spaceName = ps.getIdentity(); + } + + public ExternalPrimaryStorageSpaceCapacityHelper(String psUuid, String identity) { + super(psUuid, identity); + this.primaryStorageUuid = psUuid; + spaceName = identity; + } + + protected void updateStorageSpace(StorageCapacity cap) { + if (cap.getCapacitiesByLocationUrl() == null || cap.getCapacitiesByLocationUrl().isEmpty()) { + return; + } + + List beforeSpaces = Q.New(ExternalPrimaryStorageSpaceVO.class) + .eq(ExternalPrimaryStorageSpaceVO_.primaryStorageUuid, primaryStorageUuid) + .list(); + + Map beforeSpacesByUrl = beforeSpaces.stream() + .collect(Collectors.toMap(ExternalPrimaryStorageSpaceVO::getLocationUrl, it -> it)); + List toPersistSpaces = new ArrayList<>(); + List toRemoveSpaces = new ArrayList<>(); + + for (Map.Entry e : cap.getCapacitiesByLocationUrl().entrySet()) { + String locationUrl = e.getKey(); + StorageCapacity.Capacity capacity = e.getValue(); + ExternalPrimaryStorageSpaceVO spaceVO = beforeSpacesByUrl.get(locationUrl); + if (spaceVO == null) { + spaceVO = new ExternalPrimaryStorageSpaceVO(); + spaceVO.setUuid(Platform.getUuidFromBytes((primaryStorageUuid + locationUrl).getBytes())); + spaceVO.setPrimaryStorageUuid(primaryStorageUuid); + spaceVO.setLocationUrl(locationUrl.replaceAll("/$", "")); + spaceVO.setTotalPhysicalCapacity(capacity.total); + spaceVO.setAvailablePhysicalCapacity(capacity.available); + spaceVO.setTotalCapacity(capacity.total); + spaceVO.setAvailableCapacity(capacity.available); + toPersistSpaces.add(spaceVO); + } else { + spaceVO.setTotalPhysicalCapacity(capacity.total); + spaceVO.setAvailablePhysicalCapacity(capacity.available); + spaceVO.setTotalCapacity(capacity.total); + } + } + + for (Iterator> it = beforeSpacesByUrl.entrySet().iterator(); it.hasNext(); ) { + Map.Entry entry = it.next(); + if (!cap.getCapacitiesByLocationUrl().containsKey(entry.getKey())) { + toRemoveSpaces.add(entry.getValue()); + it.remove(); + } + } + + if (!toRemoveSpaces.isEmpty()) { + dbf.removeCollection(toRemoveSpaces, ExternalPrimaryStorageSpaceVO.class); + } + if (!toPersistSpaces.isEmpty()) { + dbf.persistCollection(toPersistSpaces); + } + dbf.updateCollection(beforeSpacesByUrl.values()); + } + + private ExternalPrimaryStorageSpaceVO getSpaceFromInstallUrl(String installPath) { + Map spacesByUrl = getStorageSpacesByUrl(); + String spaceUrl = spacesByUrl.keySet().stream().filter(installPath::startsWith) + .findFirst().orElseThrow(() -> new OperationFailureException(operr("cannot find storage space for installPath[%s]", installPath))); + return spacesByUrl.get(spaceUrl); + } + + @DeadlockAutoRestart + public void releaseAvailableCapWithRatio(String installPath, long size) { + long ratioSize = ratioMgr.calculateByRatio(primaryStorageUuid, size); + _release(installPath, ratioSize); + } + + @DeadlockAutoRestart + public void releaseAvailableCapacity(String installPath, long size) { + _release(installPath, size); + } + + @Transactional + protected void _release(String installPath, long size) { + if (installPath == null) { + logger.debug(String.format("no install path found, skip release %s capacity", spaceName)); + return; + } + + ExternalPrimaryStorageSpaceVO space = getSpaceFromInstallUrl(installPath); + space.setAvailableCapacity(space.getAvailableCapacity() + size); + if (space.getAvailableCapacity() > space.getTotalPhysicalCapacity()) { + logger.warn(String.format("invalid space[locationUrl:%s] capacity after release size %s, available capacity[%s] > total capacity[%s], " + + "try to reconnect ps to recalculate pool capacity", + space.getLocationUrl(), size, space.getAvailableCapacity(), space.getTotalPhysicalCapacity())); + } + + dbf.getEntityManager().merge(space); + logger.debug(String.format("ps space [%s] release capacity: %s, updated: %s", + space.getLocationUrl(), size, space.getAvailableCapacity())); + } + + @DeadlockAutoRestart + public long reserveAvailableCapacity(String installPath, long size) { + return _reserve(installPath, size); + } + + @Transactional + protected long _reserve(String installPath, long size) { + if (installPath == null) { + logger.debug(String.format("no install path found, skip reserve %s capacity", spaceName)); + return 0; + } + + + ExternalPrimaryStorageSpaceVO space = getSpaceFromInstallUrl(installPath); + long originAvailableCapacity = space.getAvailableCapacity(); + if (originAvailableCapacity < size) { + throw new OperationFailureException(operr("required space[locationUrl:%s] cannot satisfy conditions [availableSize > %s bytes], " + + "current available size %s", space.getLocationUrl(), size, originAvailableCapacity)); + } + + space.setAvailableCapacity(space.getAvailableCapacity() - size); + dbf.getEntityManager().merge(space); + + logger.debug(String.format("%s[%s] reserve capacity: %s, origin: %s, updated: %s", + spaceName, space.getLocationUrl(), size, originAvailableCapacity, space.getAvailableCapacity())); + return originAvailableCapacity; + } + + public void recalculateAvailableCapacity() { + Map spacesByUrl = getStorageSpacesByUrl(); + Map usedCapBySpaceUrl = spacesByUrl.keySet().stream() + .collect(Collectors.toMap(url -> url, url -> 0L )); + + StopWatch watch = Utils.getStopWatch(); + watch.start(); + + // 1. calculate used capacity from volumes + long total = Q.New(VolumeVO.class).eq(VolumeVO_.primaryStorageUuid, primaryStorageUuid).count(); + SQL.New("select vol from VolumeVO vol" + + " where primaryStorageUuid = :psUuid", VolumeVO.class) + .param("psUuid", primaryStorageUuid) + .limit(1000) + .paginate(total, vos -> { + for (Object v : vos) { + VolumeVO vo = (VolumeVO) v; + if (vo.getInstallPath() != null) { + ExternalPrimaryStorageSpaceVO space = getSpaceFromInstallUrl(vo.getInstallPath()); + usedCapBySpaceUrl.compute(space.getLocationUrl(), (k, usedCap) -> usedCap + vo.getSize()); + } + } + }); + + for (String key : usedCapBySpaceUrl.keySet()) { + usedCapBySpaceUrl.compute(key, (k, usedCap) -> ratioMgr.calculateByRatio(primaryStorageUuid, usedCap)); + } + + // 2. calculate used capacity from image caches + total = Q.New(ImageCacheVO.class).eq(ImageCacheVO_.primaryStorageUuid, primaryStorageUuid).count(); + SQL.New("select img from ImageCacheVO img" + + " where primaryStorageUuid = :psUuid", ImageCacheVO.class) + .param("psUuid", primaryStorageUuid) + .limit(1000) + .paginate(total, imgs -> { + for (Object i : imgs) { + ImageCacheVO img = (ImageCacheVO) i; + if (img.getInstallUrl() != null) { + ExternalPrimaryStorageSpaceVO space = getSpaceFromInstallUrl(img.getInstallUrl()); + usedCapBySpaceUrl.compute(space.getLocationUrl(), (k, usedCap) -> usedCap + img.getSize()); + } + } + }); + + + // 3. calculate used capacity from snapshots + total = Q.New(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.primaryStorageUuid, primaryStorageUuid).count(); + SQL.New("select snap from VolumeSnapshotVO snap" + + " where primaryStorageUuid = :psUuid", VolumeSnapshotVO.class) + .param("psUuid", primaryStorageUuid) + .limit(1000) + .paginate(total, snaps -> { + for (Object s : snaps) { + VolumeSnapshotVO snap = (VolumeSnapshotVO) s; + if (snap.getPrimaryStorageInstallPath() != null) { + ExternalPrimaryStorageSpaceVO space = getSpaceFromInstallUrl(snap.getPrimaryStorageInstallPath()); + usedCapBySpaceUrl.compute(space.getLocationUrl(), (k, usedCap) -> usedCap + snap.getSize()); + } + } + }); + + watch.stop(); + logger.info(String.format("it takes %d ms to recalculate external primary storage [%s] space used capacity", + watch.getLapse(), primaryStorageUuid)); + + // 4. update available capacity + for (Map.Entry e : spacesByUrl.entrySet()) { + String url = e.getKey(); + ExternalPrimaryStorageSpaceVO space = e.getValue(); + long usedCap = usedCapBySpaceUrl.get(url); + long availableCap = space.getTotalPhysicalCapacity() - usedCap; + space.setAvailableCapacity(availableCap); + logger.info(String.format("recalculated external primary storage [%s] space [%s] available capacity: %s, used capacity: %s, total capacity: %s", + primaryStorageUuid, url, availableCap, usedCap, space.getTotalPhysicalCapacity())); + } + + dbf.updateCollection(spacesByUrl.values()); + } + + public boolean checkVirtualSizeByRatio(String requiredInstallUrl, long requiredSize) { + ExternalPrimaryStorageSpaceVO space = getSpaceFromInstallUrl(requiredInstallUrl); + return PrimaryStorageCapacityChecker.New(primaryStorageUuid, + space.getAvailableCapacity(), space.getTotalPhysicalCapacity(), space.getAvailablePhysicalCapacity()) + .checkRequiredSize(requiredSize); + } + + public String findMostSuitableSpace(long requiredSize, Comparator comparator) { + Map spacesByUrl = getStorageSpacesByUrl(); + List suitableSpaces = spacesByUrl.values().stream() + .filter(space -> PrimaryStorageCapacityChecker.New(primaryStorageUuid, + space.getAvailableCapacity(), space.getTotalPhysicalCapacity(), space.getAvailablePhysicalCapacity()) + .checkRequiredSize(requiredSize)) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(suitableSpaces)) { + return null; + } + + suitableSpaces.sort(comparator); + return suitableSpaces.get(0).getLocationUrl(); + } + + +} diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSpaceHelper.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSpaceHelper.java new file mode 100644 index 00000000000..ee176db2244 --- /dev/null +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSpaceHelper.java @@ -0,0 +1,56 @@ +package org.zstack.storage.addon.primary; + +import org.apache.commons.collections.CollectionUtils; +import org.zstack.core.db.Q; +import org.zstack.header.errorcode.OperationFailureException; +import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageSpaceVO; +import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageSpaceVO_; +import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import static org.zstack.core.Platform.operr; + +public class ExternalPrimaryStorageSpaceHelper { + protected String primaryStorageUuid; + protected String spaceName; + protected Map storageSpacesByUrl; + + public ExternalPrimaryStorageSpaceHelper(ExternalPrimaryStorageVO ps) { + super(); + this.primaryStorageUuid = ps.getUuid(); + this.spaceName = ps.getIdentity(); + } + + public ExternalPrimaryStorageSpaceHelper(String psUuid, String identity) { + this.primaryStorageUuid = psUuid; + spaceName = identity; + } + + public Map getStorageSpacesByUrl() { + if (storageSpacesByUrl == null) { + List spaces = Q.New(ExternalPrimaryStorageSpaceVO.class) + .eq(ExternalPrimaryStorageSpaceVO_.primaryStorageUuid, primaryStorageUuid) + .list(); + if (CollectionUtils.isEmpty(spaces)) { + storageSpacesByUrl = new HashMap<>(); + } else { + storageSpacesByUrl = spaces.stream() + .collect(Collectors.toMap(ExternalPrimaryStorageSpaceVO::getLocationUrl, it -> it)); + spaceName += (" " + spaces.get(0).getType()); + } + } + return storageSpacesByUrl; + } + + // TODO: add cache for db result + public String getLocationSpaceUrl(String installUrl) { + Set spaceUrls = getStorageSpacesByUrl().keySet(); + return spaceUrls.stream().filter(installUrl::startsWith).findFirst() + .orElseThrow(() -> new OperationFailureException(operr("cannot find storage space for installUrl[%s]", installUrl))); + } +} diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSystemTags.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSystemTags.java new file mode 100644 index 00000000000..3ffca439eea --- /dev/null +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSystemTags.java @@ -0,0 +1,13 @@ +package org.zstack.storage.addon.primary; + +import org.zstack.header.cluster.ClusterVO; +import org.zstack.header.tag.TagDefinition; +import org.zstack.tag.EphemeralPatternSystemTag; + +@TagDefinition +public class ExternalPrimaryStorageSystemTags { + public static String REQUIRED_INSTALL_URL_TOKEN = "requiredInstallUrl"; + public static EphemeralPatternSystemTag REQUIRED_INSTALL_URL = new EphemeralPatternSystemTag( + String.format("required::installUrl::{%s}", REQUIRED_INSTALL_URL_TOKEN), + ClusterVO.class); +} \ No newline at end of file diff --git a/storage/src/main/java/org/zstack/storage/primary/ImageCacheUtil.java b/storage/src/main/java/org/zstack/storage/primary/ImageCacheUtil.java index bdae91b21fa..3c835bf7381 100644 --- a/storage/src/main/java/org/zstack/storage/primary/ImageCacheUtil.java +++ b/storage/src/main/java/org/zstack/storage/primary/ImageCacheUtil.java @@ -23,10 +23,14 @@ public static String getImageCachePath(ImageInventory image, Function e -> def cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) @@ -338,7 +391,12 @@ class ZbsPrimaryStorageCase extends SubCase { addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() - assert addonInfo == "{\"clusterInfo\":{\"uuid\":\"123456789\",\"version\":\"1.6.1-for-test\"},\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" + assert addonInfo == "{\"clusterInfo\":{\"uuid\":\"123456789\",\"version\":\"1.6.1-for-test\"}," + + "\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"}," + + "{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"}," + + "{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"}]," + + "\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}," + + "{\"physicalPoolID\":2,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":2,\"usedSize\":123456789,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":123456789,\"physicalPoolName\":\"pool2\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool2\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":987654321}]}" assert Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Connected @@ -363,7 +421,12 @@ class ZbsPrimaryStorageCase extends SubCase { addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() - assert addonInfo == "{\"clusterInfo\":{\"uuid\":\"123456789\",\"version\":\"1.6.1-for-test\"},\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" + assert addonInfo == "{\"clusterInfo\":{\"uuid\":\"123456789\",\"version\":\"1.6.1-for-test\"}," + + "\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"}," + + "{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"}," + + "{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"}]," + + "\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}," + + "{\"physicalPoolID\":2,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":2,\"usedSize\":123456789,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":123456789,\"physicalPoolName\":\"pool2\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool2\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":987654321}]}" assert Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Disconnected @@ -377,13 +440,26 @@ class ZbsPrimaryStorageCase extends SubCase { } void testDataVolumeLifecycle() { + long usedCapPoolBefore = getUsedCapacity("lpool2") + long usedCapPsBefore = getUsedCapacity() vol = createDataVolume { name = "test" diskOfferingUuid = diskOffering.uuid primaryStorageUuid = ps.uuid + systemTags = [ExternalPrimaryStorageSystemTags.REQUIRED_INSTALL_URL.instantiateTag( + Collections.singletonMap(ExternalPrimaryStorageSystemTags.REQUIRED_INSTALL_URL_TOKEN, "zbs://lpool2"))] + } as VolumeInventory + assert getUsedCapacity("lpool2") == usedCapPoolBefore + vol.size + assert getUsedCapacity() == usedCapPsBefore + vol.size + assert vol.installPath.startsWith("zbs://lpool2") deleteVolume(vol.uuid) + + retryInSecs { + assert getUsedCapacity("lpool2") == usedCapPoolBefore + assert getUsedCapacity() == usedCapPsBefore + } } void testNegativeScenario() { @@ -512,4 +588,21 @@ class ZbsPrimaryStorageCase extends SubCase { uuid = volUuid } } + + long getUsedCapacity(String poolName) { + ExternalPrimaryStorageSpaceVO spaceVO = Q.New(ExternalPrimaryStorageSpaceVO.class) + .eq(ExternalPrimaryStorageSpaceVO_.primaryStorageUuid, ps.uuid) + .eq(ExternalPrimaryStorageSpaceVO_.locationUrl, "zbs://" + poolName) + .find() + + return spaceVO.totalCapacity - spaceVO.availableCapacity + } + + long getUsedCapacity() { + PrimaryStorageCapacityVO cap = Q.New(PrimaryStorageCapacityVO.class) + .eq(PrimaryStorageCapacityVO_.uuid, ps.uuid) + .find() + + return cap.totalCapacity - cap.availableCapacity + } } diff --git a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy index 19dedb00cce..67092a73bb8 100644 --- a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy @@ -1,9 +1,8 @@ package org.zstack.testlib import org.springframework.http.HttpEntity -import org.zstack.cbd.LogicalPoolInfo +import org.zstack.storage.zbs.LogicalPoolInfo import org.zstack.cbd.kvm.KvmCbdCommands -import org.zstack.kvm.KVMAgentCommands import org.zstack.sdk.PrimaryStorageInventory import org.zstack.storage.zbs.ZbsPrimaryStorageMdsBase import org.zstack.storage.zbs.ZbsStorageController @@ -124,13 +123,31 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { logicalPoolInfo.setRawUsedSize(968884224); logicalPoolInfo.setPhysicalPoolName("pool1"); logicalPoolInfo.setCapacity(579933831168); - logicalPoolInfo.setLogicalPoolName(cmd.logicalPool); + logicalPoolInfo.setLogicalPoolName(cmd.logicalPoolNames[0]); logicalPoolInfo.setUserPolicy("eyJwb2xpY3kiIDogMX0="); logicalPoolInfo.setAllocatedSize(3221225472); List logicalPoolInfos = new ArrayList<>() logicalPoolInfos.add(logicalPoolInfo) + logicalPoolInfos.add(new LogicalPoolInfo( + physicalPoolID: 2, + logicalPoolID: 2, + logicalPoolName: "lpool2", + physicalPoolName: "pool2", + capacity: 579933831168, + usedSize: 123456789, + allocatedSize: 987654321, + quota: 0, + createTime: 1735875794, + type: 0, + rawWalUsedSize: 0, + allocateStatus: 0, + rawUsedSize: 123456789, + redundanceAndPlaceMentPolicy: redundanceAndPlaceMentPolicy, + userPolicy: "eyJwb2xpY3kiIDogMX0=" + )) + def rsp = new ZbsStorageController.GetCapacityRsp() rsp.setLogicalPoolInfos(logicalPoolInfos) @@ -143,7 +160,7 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { assert zspec != null: "cannot found zbs primary storage[uuid:${cmd.uuid}], check your environment()." def rsp = new ZbsStorageController.CreateVolumeRsp() - rsp.setSize(actualSize) + rsp.setSize(cmd.getSizeInBytes()) rsp.setActualSize(actualSize) rsp.setInstallPath(String.format("cbd:pool1/%s/%s", cmd.logicalPool, cmd.volume)) From 8f59d57958b71db58457ab926578dfd2e2bf1884 Mon Sep 17 00:00:00 2001 From: J M Date: Mon, 15 Dec 2025 11:08:21 +0800 Subject: [PATCH 645/737] [conf]: modify addon info to TEXT DBImpact Resolves: ZSTAC-80673 Change-Id: I6b707a6c727179786b7a706e656e64756c706f66 --- conf/db/upgrade/V5.5.0__schema.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/db/upgrade/V5.5.0__schema.sql b/conf/db/upgrade/V5.5.0__schema.sql index 5d1587afdcd..e127f595041 100644 --- a/conf/db/upgrade/V5.5.0__schema.sql +++ b/conf/db/upgrade/V5.5.0__schema.sql @@ -65,3 +65,5 @@ END $$ DELIMITER ; CALL UpdateVolumeInstallPathForZbs(); + +ALTER TABLE `zstack`.`ExternalPrimaryStorageVO` MODIFY `addonInfo` TEXT DEFAULT NULL; From 4a61ea147f55e32b67fe8542f52dd2c42d7db6d8 Mon Sep 17 00:00:00 2001 From: J M Date: Tue, 16 Dec 2025 18:37:15 +0800 Subject: [PATCH 646/737] [zbs]: support zbs storage discover refactor some cbd class to zbs Resolves: ZSTAC-80635 Change-Id: I787a7a7469676f766c73647a6f706e6b76616273 --- .../java/org/zstack/cbd/CbdConstants.java | 12 - .../org/zstack/cbd/kvm/KvmCbdCommands.java | 13 - .../org/zstack/storage/zbs/AddonInfo.java | 6 +- .../zstack/storage/zbs/LogicalPoolInfo.java | 24 ++ .../java/org/zstack/storage/zbs}/MdsInfo.java | 19 +- .../org/zstack/storage/zbs}/MdsStatus.java | 2 +- .../java/org/zstack/storage/zbs}/MdsUri.java | 8 +- .../zstack/storage/zbs/ZbsListPoolResult.java | 277 ++++++++++++++++++ .../org/zstack/storage/zbs/ZbsMdsBase.java | 1 - .../storage/zbs/ZbsPrimaryStorageMdsBase.java | 2 - .../storage/zbs/ZbsStorageController.java | 27 +- .../zstack/storage/zbs/ZbsStorageFactory.java | 54 +++- .../addon/zbs/ZbsPrimaryStorageCase.groovy | 2 +- 13 files changed, 393 insertions(+), 54 deletions(-) delete mode 100644 plugin/cbd/src/main/java/org/zstack/cbd/CbdConstants.java rename plugin/{cbd/src/main/java/org/zstack/cbd => zbs/src/main/java/org/zstack/storage/zbs}/MdsInfo.java (73%) rename plugin/{cbd/src/main/java/org/zstack/cbd => zbs/src/main/java/org/zstack/storage/zbs}/MdsStatus.java (80%) rename plugin/{cbd/src/main/java/org/zstack/cbd => zbs/src/main/java/org/zstack/storage/zbs}/MdsUri.java (95%) create mode 100644 plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsListPoolResult.java diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/CbdConstants.java b/plugin/cbd/src/main/java/org/zstack/cbd/CbdConstants.java deleted file mode 100644 index 4e96f6cf85b..00000000000 --- a/plugin/cbd/src/main/java/org/zstack/cbd/CbdConstants.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.zstack.cbd; - -import org.zstack.header.configuration.PythonClass; - -/** - * @author Xingwei Yu - * @date 2024/4/10 23:28 - */ -@PythonClass -public interface CbdConstants { - String MDS_PARAM_MDS_PORT = "mdsPort"; -} diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java index 52653a0bc40..8ff948fc8ca 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java @@ -1,6 +1,5 @@ package org.zstack.cbd.kvm; -import org.zstack.cbd.MdsInfo; import org.zstack.kvm.KVMAgentCommands; import java.util.List; @@ -19,18 +18,6 @@ public static class AgentRsp { public String error; } - public static class KvmUpdateClientConfCmd extends AgentCmd { - private List mdsInfos; - - public List getMdsInfos() { - return mdsInfos; - } - - public void setMdsInfos(List mdsInfos) { - this.mdsInfos = mdsInfos; - } - } - public static class KvmSetupSelfFencerCmd extends AgentCmd { public long interval; public int maxAttempts; diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/AddonInfo.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/AddonInfo.java index d711cf7da41..fba2dd72a67 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/AddonInfo.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/AddonInfo.java @@ -1,7 +1,5 @@ package org.zstack.storage.zbs; -import org.zstack.cbd.MdsInfo; - import java.util.ArrayList; import java.util.List; @@ -37,4 +35,8 @@ public List getLogicalPoolInfos() { public void setLogicalPoolInfos(List logicalPoolInfos) { this.logicalPoolInfos = logicalPoolInfos; } + + public void addLogicalPoolInfo(LogicalPoolInfo logicalPoolInfo) { + this.logicalPoolInfos.add(logicalPoolInfo); + } } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/LogicalPoolInfo.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/LogicalPoolInfo.java index bc3a1a1dfad..4a3a5411db9 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/LogicalPoolInfo.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/LogicalPoolInfo.java @@ -170,4 +170,28 @@ public void setZoneNum(int zoneNum) { this.zoneNum = zoneNum; } } + + public static LogicalPoolInfo valueOf(ZbsListPoolResult.LogicalPoolInfo logicalPoolInfo) { + if (logicalPoolInfo == null) { + return null; + } + + LogicalPoolInfo info = new LogicalPoolInfo(); + info.setAllocatedSize(logicalPoolInfo.getAllocatedSize()); + info.setCapacity(logicalPoolInfo.getCapacity()); + info.setCreateTime(logicalPoolInfo.getCreateTime()); + info.setLogicalPoolID(logicalPoolInfo.getLogicalPoolID()); + info.setLogicalPoolName(logicalPoolInfo.getLogicalPoolName()); + info.setPhysicalPoolID(logicalPoolInfo.getPhysicalPoolID()); + info.setPhysicalPoolName(logicalPoolInfo.getPhysicalPoolName()); + info.setQuota(logicalPoolInfo.getQuota()); + info.setRawUsedSize(logicalPoolInfo.getRawUsedSize()); + info.setRawWalUsedSize(logicalPoolInfo.getRawWalUsedSize()); + info.setType(logicalPoolInfo.getType()); + info.setUsedSize(logicalPoolInfo.getUsedSize()); + info.setUserPolicy(logicalPoolInfo.getUserPolicy()); + info.setAllocateStatus(logicalPoolInfo.getAllocateStatus()); + return info; + + } } diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/MdsInfo.java similarity index 73% rename from plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java rename to plugin/zbs/src/main/java/org/zstack/storage/zbs/MdsInfo.java index a41fff09303..4085e6657af 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/MdsInfo.java @@ -1,6 +1,9 @@ -package org.zstack.cbd; +package org.zstack.storage.zbs; +import java.util.Collection; +import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; /** * @author Xingwei Yu @@ -78,4 +81,18 @@ public MdsStatus getStatus() { public void setStatus(MdsStatus status) { this.status = status; } + + public static MdsInfo valueOf(String mdsUrl) { + MdsUri uri = new MdsUri(mdsUrl); + MdsInfo mdsInfo = new MdsInfo(); + mdsInfo.setUsername(uri.getUsername()); + mdsInfo.setPassword(uri.getPassword()); + mdsInfo.setPort(uri.getSshPort()); + mdsInfo.setAddr(uri.getHostname()); + return mdsInfo; + } + + public static List valueOf(Collection mdsUrls) { + return mdsUrls.stream().map(MdsInfo::valueOf).collect(Collectors.toList()); + } } diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/MdsStatus.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/MdsStatus.java similarity index 80% rename from plugin/cbd/src/main/java/org/zstack/cbd/MdsStatus.java rename to plugin/zbs/src/main/java/org/zstack/storage/zbs/MdsStatus.java index 7ed70af64c4..279d2605ebd 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/MdsStatus.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/MdsStatus.java @@ -1,4 +1,4 @@ -package org.zstack.cbd; +package org.zstack.storage.zbs; /** * @author Xingwei Yu diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/MdsUri.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/MdsUri.java similarity index 95% rename from plugin/cbd/src/main/java/org/zstack/cbd/MdsUri.java rename to plugin/zbs/src/main/java/org/zstack/storage/zbs/MdsUri.java index 9fef3451b01..9fa1e00f38c 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/MdsUri.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/MdsUri.java @@ -1,4 +1,4 @@ -package org.zstack.cbd; +package org.zstack.storage.zbs; import org.apache.http.NameValuePair; import org.apache.http.client.utils.URLEncodedUtils; @@ -30,8 +30,10 @@ public class MdsUri { private static final Integer DEFAULT_SSH_PORT = 22; private static List allowedQueryParameter; + + private static final String MDS_PARAM_MDS_PORT = "mdsPort"; static { - allowedQueryParameter = list(CbdConstants.MDS_PARAM_MDS_PORT); + allowedQueryParameter = list(MDS_PARAM_MDS_PORT); } public static String getQueryValue(URI uri, String name) { @@ -90,7 +92,7 @@ public MdsUri(String url) { " in format of %s", url, MDS_URL_FORMAT) ); } - String v = getQueryValue(uri, CbdConstants.MDS_PARAM_MDS_PORT); + String v = getQueryValue(uri, MDS_PARAM_MDS_PORT); mdsPort = v == null ? mdsPort : Integer.parseInt(v); } catch (URISyntaxException e) { throw new CloudRuntimeException(e); diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsListPoolResult.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsListPoolResult.java new file mode 100644 index 00000000000..6a7b2f106c4 --- /dev/null +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsListPoolResult.java @@ -0,0 +1,277 @@ +package org.zstack.storage.zbs; + +import java.util.List; + +/** + * example: + * { + * "error": { + * "code": 0, + * "message": "success" + * }, + * "result": [ + * { + * "statusCode": 0, + * "logicalPoolInfos": [ + * { + * "logicalPoolID": 6, + * "logicalPoolName": "pool-4676f61e5c4c456891cc3ec22ef118c3", + * "physicalPoolID": 6, + * "physicalPoolName": "pool-4676f61e5c4c456891cc3ec22ef118c3_physical", + * "type": 0, + * "createTime": 1765855781, + * "redundanceAndPlaceMentPolicy": "eyJjb3B5c2V0TnVtIjoyMDAsInJlcGxpY2FOdW0iOjMsInpvbmVOdW0iOjN9Cg==", + * "userPolicy": "eyJwb2xpY3kiIDogMX0=", + * "allocateStatus": 0, + * "capacity": 390607142912, + * "usedSize": 2617245696, + * "allocatedSize": 4294967296, + * "rawUsedSize": 7851737088, + * "rawWalUsedSize": 533196800, + * "quota": 0, + * "ioPriority": 0 + * } + * ] + * }, + * { + * "statusCode": 0, + * "logicalPoolInfos": [ + * { + * "logicalPoolID": 5, + * "logicalPoolName": "pool-a65b5d3a96f44dfc95971a4fa8032a4f", + * "physicalPoolID": 5, + * "physicalPoolName": "pool-a65b5d3a96f44dfc95971a4fa8032a4f_physical", + * "type": 0, + * "createTime": 1765855755, + * "redundanceAndPlaceMentPolicy": "eyJjb3B5c2V0TnVtIjoyMDAsInJlcGxpY2FOdW0iOjMsInpvbmVOdW0iOjN9Cg==", + * "userPolicy": "eyJwb2xpY3kiIDogMX0=", + * "allocateStatus": 0, + * "capacity": 390607142912, + * "usedSize": 3162505216, + * "allocatedSize": 9663676416, + * "rawUsedSize": 9487515648, + * "rawWalUsedSize": 608768000, + * "quota": 0, + * "ioPriority": 0 + * } + * ] + * } + * ] + * } + */ + + +public class ZbsListPoolResult { + private ErrorInfo error; + private List result; + + public ErrorInfo getError() { + return error; + } + + public void setError(ErrorInfo error) { + this.error = error; + } + + public List getResult() { + return result; + } + + public void setResult(List result) { + this.result = result; + } + + public static class ErrorInfo { + private int code; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + } + + public static class Result { + private int statusCode; + private List logicalPoolInfos; + + public int getStatusCode() { + return statusCode; + } + + public void setStatusCode(int statusCode) { + this.statusCode = statusCode; + } + + public List getLogicalPoolInfos() { + return logicalPoolInfos; + } + + public void setLogicalPoolInfos(List logicalPoolInfos) { + this.logicalPoolInfos = logicalPoolInfos; + } + } + + public boolean isSuccess() { + return error == null || error.getCode() == 0; + } + + public static class LogicalPoolInfo { + private int logicalPoolID; + private String logicalPoolName; + private int physicalPoolID; + private String physicalPoolName; + private int type; + private long createTime; + private String redundanceAndPlaceMentPolicy; + private String userPolicy; + private int allocateStatus; + private long capacity; + private long usedSize; + private long allocatedSize; + private long rawUsedSize; + private long rawWalUsedSize; + private long quota; + private int ioPriority; + + public int getLogicalPoolID() { + return logicalPoolID; + } + + public void setLogicalPoolID(int logicalPoolID) { + this.logicalPoolID = logicalPoolID; + } + + public String getLogicalPoolName() { + return logicalPoolName; + } + + public void setLogicalPoolName(String logicalPoolName) { + this.logicalPoolName = logicalPoolName; + } + + public int getPhysicalPoolID() { + return physicalPoolID; + } + + public void setPhysicalPoolID(int physicalPoolID) { + this.physicalPoolID = physicalPoolID; + } + + + public String getPhysicalPoolName() { + return physicalPoolName; + } + + public void setPhysicalPoolName(String physicalPoolName) { + this.physicalPoolName = physicalPoolName; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public long getCreateTime() { + return createTime; + } + + public void setCreateTime(long createTime) { + this.createTime = createTime; + } + + public String getRedundanceAndPlaceMentPolicy() { + return redundanceAndPlaceMentPolicy; + } + + public void setRedundanceAndPlaceMentPolicy(String redundanceAndPlaceMentPolicy) { + this.redundanceAndPlaceMentPolicy = redundanceAndPlaceMentPolicy; + } + + public String getUserPolicy() { + return userPolicy; + } + + public void setUserPolicy(String userPolicy) { + this.userPolicy = userPolicy; + } + + public int getAllocateStatus() { + return allocateStatus; + } + + public void setAllocateStatus(int allocateStatus) { + this.allocateStatus = allocateStatus; + } + + public long getCapacity() { + return capacity; + } + + public void setCapacity(long capacity) { + this.capacity = capacity; + } + + public long getUsedSize() { + return usedSize; + } + + public void setUsedSize(long usedSize) { + this.usedSize = usedSize; + } + + public long getAllocatedSize() { + return allocatedSize; + } + + public void setAllocatedSize(long allocatedSize) { + this.allocatedSize = allocatedSize; + } + + public long getRawUsedSize() { + return rawUsedSize; + } + + public void setRawUsedSize(long rawUsedSize) { + this.rawUsedSize = rawUsedSize; + } + + public long getRawWalUsedSize() { + return rawWalUsedSize; + } + + public void setRawWalUsedSize(long rawWalUsedSize) { + this.rawWalUsedSize = rawWalUsedSize; + } + + public long getQuota() { + return quota; + } + + public void setQuota(long quota) { + this.quota = quota; + } + + public int getIoPriority() { + return ioPriority; + } + + public void setIoPriority(int ioPriority) { + this.ioPriority = ioPriority; + } + } +} diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java index 80d3f96e7d2..ecdd3d65e18 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java @@ -3,7 +3,6 @@ import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; -import org.zstack.cbd.MdsInfo; import org.zstack.core.db.DatabaseFacade; import org.zstack.header.core.Completion; import org.zstack.header.core.ReturnValueCompletion; diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java index 25bbcec8204..cdcef665eb7 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java @@ -1,8 +1,6 @@ package org.zstack.storage.zbs; import org.springframework.beans.factory.annotation.Autowired; -import org.zstack.cbd.MdsInfo; -import org.zstack.cbd.MdsStatus; import org.zstack.compute.host.HostGlobalConfig; import org.zstack.core.CoreGlobalProperty; import org.zstack.core.Platform; diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index b41d219a02a..fd6446f6bcb 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -4,7 +4,6 @@ import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; -import org.zstack.cbd.*; import org.zstack.cbd.kvm.CbdHeartbeatVolumeTO; import org.zstack.cbd.kvm.CbdVolumeTo; import org.zstack.compute.host.HostGlobalConfig; @@ -58,7 +57,6 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; -import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -354,7 +352,7 @@ public String getIdentity() { public void connect(String cfg, String url, ReturnValueCompletion completion) { AddonInfo newAddonInfo = new AddonInfo(); Config current = JSONObjectUtil.toObject(cfg, Config.class); - List mdsInfos = parseMdsInfos(current.getMdsUrls()); + List mdsInfos = MdsInfo.valueOf(current.getMdsUrls()); newAddonInfo.setMdsInfos(mdsInfos); final List mdsList = CollectionUtils.transformToList(newAddonInfo.getMdsInfos(), ZbsPrimaryStorageMdsBase::new); @@ -1137,7 +1135,7 @@ public String validateConfig(String config) throws ApiMessageInterceptionExcepti throw new ApiMessageInterceptionException(argerr("ensure at least one MDS is configured")); } - List newMdsInfos = parseMdsInfos(current.getMdsUrls()); + List newMdsInfos = MdsInfo.valueOf(current.getMdsUrls()); List duplicateMdsInfos = newMdsInfos.stream().collect(Collectors.groupingBy(MdsInfo::getAddr)) .values().stream().filter(addr -> addr.size() > 1).flatMap(List::stream).collect(Collectors.toList()); if (!duplicateMdsInfos.isEmpty()) { @@ -1146,7 +1144,7 @@ public String validateConfig(String config) throws ApiMessageInterceptionExcepti )); } - List oldMdsInfos = parseMdsInfos(old.getMdsUrls()); + List oldMdsInfos = MdsInfo.valueOf(old.getMdsUrls()); List changedMdsInfos = newMdsInfos.stream().filter(n -> oldMdsInfos.stream().noneMatch(o -> o.equals(n))).collect(Collectors.toList()); if (!changedMdsInfos.isEmpty() && !CoreGlobalProperty.UNIT_TEST_ON) { List mdsList = CollectionUtils.transformToList(changedMdsInfos, ZbsPrimaryStorageMdsBase::new); @@ -1202,18 +1200,6 @@ private void reloadDbInfo() { .collect(Collectors.toMap(LogicalPoolInfo::getLogicalPoolName, LogicalPoolInfo::getPhysicalPoolName) ); } - private List parseMdsInfos(List mdsUrls) { - return mdsUrls.stream().map(mdsUrl -> { - MdsUri uri = new MdsUri(mdsUrl); - MdsInfo mdsInfo = new MdsInfo(); - mdsInfo.setUsername(uri.getUsername()); - mdsInfo.setPassword(uri.getPassword()); - mdsInfo.setPort(uri.getSshPort()); - mdsInfo.setAddr(uri.getHostname()); - return mdsInfo; - }).collect(Collectors.toList()); - } - protected String getPhysicalPoolName(String logicalPoolName) { if (physicalPoolByLogicalPool.containsKey(logicalPoolName)) { return physicalPoolByLogicalPool.get(logicalPoolName); @@ -1898,4 +1884,11 @@ public ZbsStorageController(ExternalPrimaryStorageVO self) { this.self = self; this.reloadDbInfo(); } + + public ZbsStorageController(String config) { + this.self = new ExternalPrimaryStorageVO(); + this.self.setConfig(config); + this.config = StringUtils.isEmpty(self.getConfig()) ? new Config() : JSONObjectUtil.toObject(self.getConfig(), Config.class); + this.addonInfo = new AddonInfo(); + } } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java index df9fb479a2c..0602c4dea88 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java @@ -3,6 +3,7 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.ansible.SshFileMd5Checker; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.db.Q; import org.zstack.core.trash.StorageTrash; @@ -18,8 +19,13 @@ import org.zstack.header.volume.VolumeProtocol; import org.zstack.header.volume.VolumeVO; import org.zstack.header.volume.VolumeVO_; +import org.zstack.utils.ShellResult; +import org.zstack.utils.ShellUtils; import org.zstack.utils.Utils; +import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; +import org.zstack.utils.ssh.Ssh; +import org.zstack.utils.ssh.SshResult; import java.util.LinkedHashMap; import java.util.List; @@ -52,7 +58,53 @@ public PrimaryStorageNodeSvc buildNodeSvc(ExternalPrimaryStorageVO vo) { @Override public void discover(String url, String config, ReturnValueCompletion completion) { - completion.fail(operr("zbs not support discover yet")); + AddonInfo addonInfo = new AddonInfo(); + + Config conf = JSONObjectUtil.toObject(config, Config.class); + + if (CollectionUtils.isEmpty(conf.getMdsUrls())) { + completion.fail(operr("mdsUrls cannot be null or empty")); + return; + } + + String errInfo = ""; + for (MdsInfo mdsInfo : MdsInfo.valueOf(conf.getMdsUrls())) { + Ssh ssh = new Ssh(); + ssh.setUsername(mdsInfo.getUsername()) + .setPassword(mdsInfo.getPassword()).setPort(mdsInfo.getPort()) + .setHostname(mdsInfo.getAddr()) + .setTimeout(5); + try { + ssh.sudoCommand("/usr/bin/zbs list logical-pool --format json"); + SshResult ret = ssh.run(); + if (ret.getReturnCode() != 0) { + errInfo += String.format("failed to list logical pools from MDS[%s], because %s\n", mdsInfo.getAddr(), ret.getStderr()); + continue; + } + + ssh.reset(); + + String poolStr = ret.getStdout(); + ZbsListPoolResult result = JSONObjectUtil.toObject(poolStr, ZbsListPoolResult.class); + if (!result.isSuccess()) { + errInfo += String.format("failed to list logical pools from MDS[%s], because %s\n", mdsInfo.getAddr(), result.getError().getMessage()); + continue; + } + + for (ZbsListPoolResult.Result poolRet : result.getResult()) { + if (poolRet.getStatusCode() == 0) { + poolRet.getLogicalPoolInfos().forEach(it -> + addonInfo.addLogicalPoolInfo(LogicalPoolInfo.valueOf(it))); + } + } + completion.success(JSONObjectUtil.rehashObject(addonInfo, LinkedHashMap.class)); + return; + } finally { + ssh.close(); + } + } + + completion.fail(operr("unable to discover logical pools from all MDSs, details: %s", errInfo)); } public void setPreferBackupStorageTypes(List preferBackupStorageTypes) { diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index af306654ed0..b546772215b 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -11,7 +11,7 @@ import org.zstack.header.storage.primary.PrimaryStorageCapacityVO_ import org.zstack.header.storage.primary.PrimaryStorageHostRefVO import org.zstack.header.storage.primary.PrimaryStorageHostRefVO_ import org.zstack.header.storage.primary.PrimaryStorageStatus -import org.zstack.cbd.MdsUri +import org.zstack.storage.zbs.MdsUri import org.zstack.sdk.* import org.zstack.storage.addon.primary.ExternalPrimaryStorageSystemTags import org.zstack.storage.primary.PrimaryStorageGlobalConfig From a5436296b01e3fd864e70f224dded07076e5fa47 Mon Sep 17 00:00:00 2001 From: J M Date: Tue, 16 Dec 2025 22:47:41 +0800 Subject: [PATCH 647/737] [storage]: support multi pool heartbeat volume Resolves: ZSTAC-80625 Change-Id: I796e6c6d626e637578746c6861796f7479717663 --- .../primary/HeartbeatVolumeTopology.java | 26 +++++++ .../addon/primary/PrimaryStorageNodeSvc.java | 4 +- .../org/zstack/cbd/kvm/KvmCbdCommands.java | 4 +- .../org/zstack/cbd/kvm/KvmCbdNodeServer.java | 20 ++--- .../zstack/expon/ExponStorageController.java | 13 +++- .../primary/ExternalStorageFencerType.java | 1 + .../zstack/iscsi/kvm/KvmIscsiNodeServer.java | 9 ++- .../kvm/KvmSetupSelfFencerExtensionPoint.java | 10 +++ .../xinfini/XInfiniStorageController.java | 14 +++- .../storage/zbs/ZbsStorageController.java | 75 ++++++++++++------- .../addon/primary/ExternalPrimaryStorage.java | 9 ++- 11 files changed, 133 insertions(+), 52 deletions(-) create mode 100644 header/src/main/java/org/zstack/header/storage/addon/primary/HeartbeatVolumeTopology.java diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/HeartbeatVolumeTopology.java b/header/src/main/java/org/zstack/header/storage/addon/primary/HeartbeatVolumeTopology.java new file mode 100644 index 00000000000..fb5023c03df --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/HeartbeatVolumeTopology.java @@ -0,0 +1,26 @@ +package org.zstack.header.storage.addon.primary; + +import java.util.HashMap; +import java.util.Map; + +public class HeartbeatVolumeTopology { + /** + * key: storage space url + * value: heartbeat volume covering the storage space, if the volume has no heartbeat, we should + * treat the storage space as disconnected too. one storage space can only be covered by one heartbeat volume. + * and one heartbeat volume can cover multiple storage spaces. + */ + private Map heartbeatVolumeByCoveringPaths = new HashMap<>(); + + public Map getHeartbeatVolumeByCoveringPaths() { + return heartbeatVolumeByCoveringPaths; + } + + public void setHeartbeatVolumeByCoveringPaths(Map heartbeatVolumeByCoveringPaths) { + this.heartbeatVolumeByCoveringPaths = heartbeatVolumeByCoveringPaths; + } + + public void putHeartbeatVolume(String coveringPath, HeartbeatVolumeTO heartbeatVolumeTO) { + this.heartbeatVolumeByCoveringPaths.put(coveringPath, heartbeatVolumeTO); + } +} diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageNodeSvc.java b/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageNodeSvc.java index f292e694183..d7a6207cbc8 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageNodeSvc.java +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageNodeSvc.java @@ -25,11 +25,11 @@ public interface PrimaryStorageNodeSvc { void deployClient(HostInventory h, Completion comp); - void activateHeartbeatVolume(HostInventory h, ReturnValueCompletion comp); + void activateHeartbeatVolume(HostInventory h, ReturnValueCompletion comp); void deactivateHeartbeatVolume(HostInventory h, Completion comp); - HeartbeatVolumeTO getHeartbeatVolumeActiveInfo(HostInventory h); + HeartbeatVolumeTopology getHeartbeatVolumeActiveInfo(HostInventory h); String getIdentity(); } diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java index 8ff948fc8ca..e761c331930 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java @@ -3,6 +3,7 @@ import org.zstack.kvm.KVMAgentCommands; import java.util.List; +import java.util.Map; /** * @author Xingwei Yu @@ -21,8 +22,7 @@ public static class AgentRsp { public static class KvmSetupSelfFencerCmd extends AgentCmd { public long interval; public int maxAttempts; - public List coveringPaths; - public String heartbeatUrl; + public Map heartbeatPathByCoveringPaths; public int storageCheckerTimeout; public String hostUuid; public Integer hostId; diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java index 8c3e60e68f7..d53cfa3bb97 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java @@ -15,7 +15,6 @@ import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; -import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.host.HostConstant; import org.zstack.header.host.HostInventory; import org.zstack.header.host.HostVO; @@ -35,8 +34,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; -import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; /** @@ -76,7 +75,7 @@ public void kvmSetupSelfFencer(KvmSetupSelfFencerParam param, Completion complet FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setName(String.format("setup-self-fencer-for-external-primary-storage-%s-on-kvm-%s", param.getPrimaryStorage().getUuid(), host.getUuid())); chain.then(new ShareFlow() { - HeartbeatVolumeTO heartbeatVol; + HeartbeatVolumeTopology heartbeatVolumeTopology; @Override public void setup() { @@ -104,10 +103,10 @@ public void fail(ErrorCode errorCode) { @Override public void run(FlowTrigger trigger, Map data) { - nodeSvc.activateHeartbeatVolume(host, new ReturnValueCompletion(trigger) { + nodeSvc.activateHeartbeatVolume(host, new ReturnValueCompletion(trigger) { @Override - public void success(HeartbeatVolumeTO returnValue) { - heartbeatVol = returnValue; + public void success(HeartbeatVolumeTopology topology) { + heartbeatVolumeTopology = topology; trigger.next(); } @@ -136,10 +135,13 @@ public void run(FlowTrigger trigger, Map data) { KvmSetupSelfFencerCmd cmd = new KvmSetupSelfFencerCmd(); cmd.interval = param.getInterval(); cmd.maxAttempts = param.getMaxAttempts(); - cmd.coveringPaths = heartbeatVol.getCoveringPaths(); - cmd.heartbeatUrl = heartbeatVol.getInstallPath(); + cmd.heartbeatPathByCoveringPaths = heartbeatVolumeTopology + .getHeartbeatVolumeByCoveringPaths().entrySet().stream().collect(Collectors.toMap( + Map.Entry::getKey, it -> it.getValue().getInstallPath() + )); cmd.storageCheckerTimeout = param.getStorageCheckerTimeout(); - cmd.heartbeatRequiredSpace = heartbeatVol.getHeartbeatRequiredSpace(); + cmd.heartbeatRequiredSpace = heartbeatVolumeTopology.getHeartbeatVolumeByCoveringPaths() + .values().iterator().next().getHeartbeatRequiredSpace(); cmd.hostUuid = param.getHostUuid(); cmd.hostId = ref.getHostId(); cmd.strategy = param.getStrategy(); diff --git a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java index 2528ddeb27b..8092ce34d61 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java +++ b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java @@ -625,7 +625,7 @@ public void blacklist(String installPath, String protocol, HostInventory h, Comp } @Override - public synchronized void activateHeartbeatVolume(HostInventory h, ReturnValueCompletion comp) { + public synchronized void activateHeartbeatVolume(HostInventory h, ReturnValueCompletion comp) { String clientIqn = IscsiUtils.getHostInitiatorName(h.getUuid()); if (clientIqn == null) { throw new RuntimeException(String.format("cannot get host[uuid:%s] initiator name", h.getUuid())); @@ -662,7 +662,9 @@ public synchronized void activateHeartbeatVolume(HostInventory h, ReturnValueCom to.setHostId(getHostId(h)); to.setHeartbeatRequiredSpace(SizeUnit.MEGABYTE.toByte(1)); to.setCoveringPaths(Collections.singletonList(vhostSocketDir)); - comp.success(to); + HeartbeatVolumeTopology topology = new HeartbeatVolumeTopology(); + topology.setHeartbeatVolumeByCoveringPaths(Collections.singletonMap(vhostSocketDir, to)); + comp.success(topology); } // hardcode @@ -704,7 +706,7 @@ public void deactivateHeartbeatVolume(HostInventory h, Completion comp) { } @Override - public HeartbeatVolumeTO getHeartbeatVolumeActiveInfo(HostInventory h) { + public HeartbeatVolumeTopology getHeartbeatVolumeActiveInfo(HostInventory h) { String tianshuId = addonInfo.getClusters().get(0).getId(); List nodes = getIscsiServers(tianshuId); @@ -730,7 +732,10 @@ public HeartbeatVolumeTO getHeartbeatVolumeActiveInfo(HostInventory h) { to.setHostId(getHostId(h)); to.setHeartbeatRequiredSpace(SizeUnit.MEGABYTE.toByte(1)); to.setCoveringPaths(Collections.singletonList(vhostSocketDir)); - return to; + + HeartbeatVolumeTopology topology = new HeartbeatVolumeTopology(); + topology.setHeartbeatVolumeByCoveringPaths(Collections.singletonMap(vhostSocketDir, to)); + return topology; } private void deactivateVhost(String installPath, HostInventory h) { diff --git a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/ExternalStorageFencerType.java b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/ExternalStorageFencerType.java index 7c0e17cd173..5213c814826 100644 --- a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/ExternalStorageFencerType.java +++ b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/ExternalStorageFencerType.java @@ -15,6 +15,7 @@ public class ExternalStorageFencerType { private final String identity; private final String protocol; + // TODO: refactor it, remove protocol public ExternalStorageFencerType(String identity, String protocol) { if (types.containsKey(identity)) { throw new IllegalArgumentException(String.format("duplicate ExternalStorageNodeServer for identity[%s]", identity)); diff --git a/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java b/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java index 31dddaa0789..5ed3af6d289 100644 --- a/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java +++ b/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java @@ -9,7 +9,6 @@ import org.zstack.core.db.Q; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; -import org.zstack.externalStorage.primary.ExternalStorageConstant; import org.zstack.header.Component; import org.zstack.header.core.Completion; import org.zstack.header.core.ReturnValueCompletion; @@ -23,6 +22,7 @@ import org.zstack.header.message.MessageReply; import org.zstack.header.storage.addon.primary.BaseVolumeInfo; import org.zstack.header.storage.addon.primary.HeartbeatVolumeTO; +import org.zstack.header.storage.addon.primary.HeartbeatVolumeTopology; import org.zstack.header.storage.addon.primary.PrimaryStorageNodeSvc; import org.zstack.header.vm.VmInstanceInventory; import org.zstack.header.vm.VmInstanceMigrateExtensionPoint; @@ -213,10 +213,11 @@ public void setup() { @Override public void run(FlowTrigger trigger, Map data) { - nodeSvc.activateHeartbeatVolume(host, new ReturnValueCompletion(trigger) { + nodeSvc.activateHeartbeatVolume(host, new ReturnValueCompletion(trigger) { @Override - public void success(HeartbeatVolumeTO vol) { - heartbeatVol = vol; + public void success(HeartbeatVolumeTopology topology) { + // TODO handle multiple heartbeat volumes + heartbeatVol = topology.getHeartbeatVolumeByCoveringPaths().values().iterator().next(); trigger.next(); } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KvmSetupSelfFencerExtensionPoint.java b/plugin/kvm/src/main/java/org/zstack/kvm/KvmSetupSelfFencerExtensionPoint.java index 48ae2f68823..a202505f708 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KvmSetupSelfFencerExtensionPoint.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KvmSetupSelfFencerExtensionPoint.java @@ -38,6 +38,8 @@ class KvmSetupSelfFencerParam { private PrimaryStorageInventory primaryStorage; private String strategy; private List fencers; + // all previous self-fencer configurations on the ps will be removed after applying the new one + private boolean flushPrevious = true; public String getHostUuid() { return hostUuid; @@ -94,6 +96,14 @@ public List getFencers() { public void setFencers(List fencers) { this.fencers = fencers; } + + public boolean isFlushPrevious() { + return flushPrevious; + } + + public void setFlushPrevious(boolean flushPrevious) { + this.flushPrevious = flushPrevious; + } } String kvmSetupSelfFencerStorageType(); diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index 92224dc1e47..4fb920421a7 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -414,7 +414,7 @@ public void deployClient(HostInventory h, Completion comp) { } @Override - public synchronized void activateHeartbeatVolume(HostInventory h, ReturnValueCompletion comp) { + public synchronized void activateHeartbeatVolume(HostInventory h, ReturnValueCompletion comp) { String clientIqn = IscsiUtils.getHostInitiatorName(h.getUuid()); if (clientIqn == null) { throw new RuntimeException(String.format("cannot get host[uuid:%s] initiator name", h.getUuid())); @@ -431,7 +431,10 @@ public synchronized void activateHeartbeatVolume(HostInventory h, ReturnValueCom to.setHostId(apiHelper.queryBdcByIp(h.getManagementIp()).getSpec().getId()); to.setHeartbeatRequiredSpace(SizeUnit.MEGABYTE.toByte(1)); to.setCoveringPaths(Collections.singletonList(getVhostSocketDir())); - comp.success(to); + + HeartbeatVolumeTopology topology = new HeartbeatVolumeTopology(); + topology.setHeartbeatVolumeByCoveringPaths(Collections.singletonMap(getVhostSocketDir(), to)); + comp.success(topology); } @Override @@ -460,7 +463,7 @@ public void deactivateHeartbeatVolume(HostInventory h, Completion comp) { } @Override - public HeartbeatVolumeTO getHeartbeatVolumeActiveInfo(HostInventory h) { + public HeartbeatVolumeTopology getHeartbeatVolumeActiveInfo(HostInventory h) { VolumeModule heartbeatVol = apiHelper.queryVolumeByName(iscsiHeartbeatVolumeName); if (heartbeatVol == null) { throw new RuntimeException("heartbeat volume not found"); @@ -477,7 +480,10 @@ public HeartbeatVolumeTO getHeartbeatVolumeActiveInfo(HostInventory h) { to.setHostId(apiHelper.queryBdcByIp(h.getManagementIp()).getSpec().getId()); to.setHeartbeatRequiredSpace(SizeUnit.MEGABYTE.toByte(1)); to.setCoveringPaths(Collections.singletonList(getVhostSocketDir())); - return to; + + HeartbeatVolumeTopology topology = new HeartbeatVolumeTopology(); + topology.setHeartbeatVolumeByCoveringPaths(Collections.singletonMap(getVhostSocketDir(), to)); + return topology; } private VolumeModule getVolumeModule(BaseVolumeInfo vol) { diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index fd6446f6bcb..38e082da095 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -292,31 +292,47 @@ public void handle(ErrorCode errCode, Map data) { } @Override - public synchronized void activateHeartbeatVolume(HostInventory h, ReturnValueCompletion comp) { + public synchronized void activateHeartbeatVolume(HostInventory h, ReturnValueCompletion completion) { if (config == null) { reloadDbInfo(); } - CreateVolumeCmd cmd = new CreateVolumeCmd(); - cmd.setLogicalPool(config.getLogicalPoolName()); - cmd.setVolume(ZbsConstants.ZBS_HEARTBEAT_VOLUME_NAME); - cmd.setSize(ZbsConstants.ZBS_HEARTBEAT_VOLUME_SIZE_IN_GIGABYTE); - cmd.setSkipIfExisting(true); + // TODO: split by physical pool not logical pool, handle logical pool deletion + HeartbeatVolumeTopology topology = new HeartbeatVolumeTopology(); + new While<>(config.getPoolNames()).each((poolName, comp) -> { + CreateVolumeCmd cmd = new CreateVolumeCmd(); + cmd.setLogicalPool(poolName); + cmd.setVolume(ZbsConstants.ZBS_HEARTBEAT_VOLUME_NAME); + cmd.setSize(ZbsConstants.ZBS_HEARTBEAT_VOLUME_SIZE_IN_GIGABYTE); + cmd.setSkipIfExisting(true); - httpCall(CREATE_VOLUME_PATH, cmd, CreateVolumeRsp.class, new ReturnValueCompletion(comp) { - @Override - public void success(CreateVolumeRsp returnValue) { - CbdHeartbeatVolumeTO to = new CbdHeartbeatVolumeTO(); - String zbsPath = returnValue.installPath; - to.setInstallPath(ZbsHelper.convertZbsPathToCbdPath(zbsPath, ZbsStorageController.this::getPhysicalPoolName)); - to.setHeartbeatRequiredSpace(SizeUnit.MEGABYTE.toByte(1)); - to.setCoveringPaths(config.getPoolNames()); - comp.success(to); - } + httpCall(CREATE_VOLUME_PATH, cmd, CreateVolumeRsp.class, new ReturnValueCompletion(comp) { + @Override + public void success(CreateVolumeRsp returnValue) { + CbdHeartbeatVolumeTO to = new CbdHeartbeatVolumeTO(); + String zbsPath = returnValue.installPath; + to.setInstallPath(ZbsHelper.convertZbsPathToCbdPath(zbsPath, ZbsStorageController.this::getPhysicalPoolName)); + to.setHeartbeatRequiredSpace(SizeUnit.MEGABYTE.toByte(1)); + to.setCoveringPaths(config.getPoolNames()); + topology.putHeartbeatVolume(poolName, to); + comp.done(); + } + @Override + public void fail(ErrorCode errorCode) { + comp.addError(errorCode); + comp.allDone(); + } + }); + }).run(new WhileDoneCompletion(completion) { @Override - public void fail(ErrorCode errorCode) { - comp.fail(errorCode); + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + completion.fail(errorCodeList.getCauses().get(0)); + return; + } + + completion.success(topology); } }); } @@ -327,20 +343,27 @@ public void deactivateHeartbeatVolume(HostInventory h, Completion comp) { } @Override - public HeartbeatVolumeTO getHeartbeatVolumeActiveInfo(HostInventory h) { + public HeartbeatVolumeTopology getHeartbeatVolumeActiveInfo(HostInventory h) { if (config == null) { reloadDbInfo(); } - String zbsPath = buildHeartbeatVolumePath(config.getLogicalPoolName()); - String cbdPath = ZbsHelper.convertZbsPathToCbdPath(zbsPath, this::getPhysicalPoolName); + HeartbeatVolumeTopology topology = new HeartbeatVolumeTopology(); + Map map = new HashMap<>(); + for (String poolName : config.getPoolNames()) { + String zbsPath = buildHeartbeatVolumePath(poolName); - CbdHeartbeatVolumeTO to = new CbdHeartbeatVolumeTO(); - to.setInstallPath(cbdPath); - to.setHeartbeatRequiredSpace(SizeUnit.MEGABYTE.toByte(1)); - to.setCoveringPaths(config.getPoolNames()); + String cbdPath = ZbsHelper.convertZbsPathToCbdPath(zbsPath, this::getPhysicalPoolName); + CbdHeartbeatVolumeTO to = new CbdHeartbeatVolumeTO(); + to.setInstallPath(cbdPath); + to.setHeartbeatRequiredSpace(SizeUnit.MEGABYTE.toByte(1)); + to.setCoveringPaths(config.getPoolNames()); + + map.put(poolName, to); + } - return to; + topology.setHeartbeatVolumeByCoveringPaths(map); + return topology; } @Override diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index 18fc2af1f16..72021693157 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -182,6 +182,7 @@ private void handle(APIUpdateExternalPrimaryStorageMsg msg) { externalVO.setDefaultProtocol(msg.getDefaultProtocol()); } boolean needReconnect = false; + String oldConfig = externalVO.getConfig(); if (msg.getConfig() != null) { String config = controller.validateConfig(msg.getConfig()); externalVO.setConfig(config); @@ -200,7 +201,13 @@ public void run(MessageReply reply) { evt.setError(reply.getError()); } else { self = dbf.reload(self); - evt.setInventory(externalVO.toInventory()); + ExternalPrimaryStorageInventory inv = externalVO.toInventory(); + evt.setInventory(inv); + + // TODO: use controller not extension point + for (UpdatePrimaryStorageExtensionPoint ext : pluginRgty.getExtensionList(UpdatePrimaryStorageExtensionPoint.class)) { + ext.afterUpdatePrimaryStorage(inv); + } } bus.publish(evt); From cfb74be1860330924b67c2745f91af1221ab6ae0 Mon Sep 17 00:00:00 2001 From: J M Date: Thu, 18 Dec 2025 14:58:57 +0800 Subject: [PATCH 648/737] [zbs]: support copy volume to another pool Resolves: ZSTAC-80718 Change-Id: I706369637978617661746173786d637069677061 --- .../zstack/storage/zbs/ZbsStorageController.java | 14 ++++++++------ .../addon/primary/ExternalPrimaryStorage.java | 9 ++++++++- .../testlib/ExternalPrimaryStorageSpec.groovy | 7 ++++++- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 38e082da095..1812808c2a6 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -853,7 +853,9 @@ public void copyVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValueC CopyCmd cmd = new CopyCmd(); cmd.setPath(srcInstallPath); cmd.setDstVolume(dst.getName()); - cmd.setDstSize(dst.getSize() / (1L << 30)); + if (dst.getAllocatedUrl() != null) { + cmd.setDstPool(getPoolFromVolumePath(dst.getAllocatedUrl())); + } httpCall(COPY_PATH, cmd, CopyRsp.class, new ReturnValueCompletion(comp) { @Override @@ -1536,7 +1538,7 @@ public void setPath(String path) { public static class CopyCmd extends VolumeCommand implements HasThreadContext { private String dstVolume; - private long dstSize; + private String dstPool; public String getDstVolume() { return dstVolume; @@ -1546,12 +1548,12 @@ public void setDstVolume(String dstVolume) { this.dstVolume = dstVolume; } - public long getDstSize() { - return dstSize; + public void setDstPool(String dstPool) { + this.dstPool = dstPool; } - public void setDstSize(long dstSize) { - this.dstSize = dstSize; + public String getDstPool() { + return dstPool; } } diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index 72021693157..b650356c7d8 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -779,7 +779,9 @@ private void createImageCacheFromSnapshot(CreateImageCacheFromVolumeSnapshotOnPr ImageCacheInventory inventory; - ImageInventory image = msg.getImageInventory(); + final ImageInventory image = msg.getImageInventory(); + + final String requiredUrlTag = msg.getSystemTag(ExternalPrimaryStorageSystemTags.REQUIRED_INSTALL_URL::isMatch); @Override public void setup() { @@ -792,6 +794,11 @@ public void run(FlowTrigger trigger, Map data) { spec.setName(buildImageName(image.getUuid())); spec.setUuid(msg.getImageInventory().getUuid()); spec.setSize(msg.getImageInventory().getSize()); + if (requiredUrlTag != null) { + String requiredUrl = ExternalPrimaryStorageSystemTags.REQUIRED_INSTALL_URL.getTokenByTag( + requiredUrlTag, ExternalPrimaryStorageSystemTags.REQUIRED_INSTALL_URL_TOKEN); + spec.setAllocatedUrl(requiredUrl); + } controller.copyVolume(msg.getVolumeSnapshot().getPrimaryStorageInstallPath(), spec, new ReturnValueCompletion(trigger) { @Override public void success(VolumeStats dst) { diff --git a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy index 67092a73bb8..ca2b74ea492 100644 --- a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy @@ -227,7 +227,12 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { assert zspec != null: "cannot found zbs primary storage[uuid:${cmd.uuid}], check your environment()." def rsp = new ZbsStorageController.CopyRsp() - rsp.setInstallPath(cmd.path.replaceAll("([^/]+)\$", cmd.dstVolume)) + if (cmd.dstPool != null) { + // lpool1 physical pool is pool1 + rsp.installPath = "cbd:${cmd.dstPool.substring(1)}/${cmd.dstPool}/${cmd.dstVolume}" + } else { + rsp.setInstallPath(cmd.path.replaceAll("([^/]+)\$", cmd.dstVolume)) + } rsp.setSize(actualSize) return rsp From 4f7be587a2908ae437ec0c59941936042cb9bf41 Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Tue, 18 Nov 2025 15:30:21 +0800 Subject: [PATCH 649/737] [mevoco]: correct ARM and VMware add-ons not consuming main license quota Resolves: ZSTAC-79237 Change-Id: I646365206a7923767067706e7a6e667a796f686d --- conf/db/upgrade/V5.5.0__schema.sql | 2 ++ .../license/api/server/RequestLicenseCapacityAction.java | 3 +++ .../header/server/LicenseAuthorizedCapacityInventory.java | 8 ++++++++ 3 files changed, 13 insertions(+) diff --git a/conf/db/upgrade/V5.5.0__schema.sql b/conf/db/upgrade/V5.5.0__schema.sql index f6f376c5729..9c0de3f5918 100644 --- a/conf/db/upgrade/V5.5.0__schema.sql +++ b/conf/db/upgrade/V5.5.0__schema.sql @@ -1,4 +1,6 @@ CALL ADD_COLUMN('VmVfNicVO', 'secondaryPciDeviceUuid', 'VARCHAR(32)', 1, NULL); ALTER TABLE `zstack`.`VmVfNicVO` ADD CONSTRAINT `fkVmVfNicVOSecondaryPciDeviceVO` FOREIGN KEY (`secondaryPciDeviceUuid`) REFERENCES `zstack`.`PciDeviceVO` (`uuid`) ON DELETE SET NULL; +CALL ADD_COLUMN('LicenseAuthorizedCapacityVO', 'resourceInfo', 'text', 1, NULL); + CALL ADD_COLUMN('PciDeviceVO', 'dependentDevices', 'varchar(255)', 1, NULL); diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityAction.java index 0f42eedfe4f..8e632d9428c 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityAction.java @@ -40,6 +40,9 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String licenseType; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String resourceInfo; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityInventory.java b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityInventory.java index cb5184b0207..744932d801f 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityInventory.java @@ -28,6 +28,14 @@ public java.lang.String getResourceUuid() { return this.resourceUuid; } + public java.lang.String resourceInfo; + public void setResourceInfo(java.lang.String resourceInfo) { + this.resourceInfo = resourceInfo; + } + public java.lang.String getResourceInfo() { + return this.resourceInfo; + } + public java.lang.String quotaType; public void setQuotaType(java.lang.String quotaType) { this.quotaType = quotaType; From efb1d9aed5161b11bd15a3770060fb06d4c5f562 Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Mon, 1 Dec 2025 16:56:14 +0800 Subject: [PATCH 650/737] [conf]: support comparing remote and local quota info in RegisterLicenseServer Resolves: ZSTAC-79953 Change-Id: I646379953a7923767067706e7a6e667a796f686d --- conf/errorCodes/license.xml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/conf/errorCodes/license.xml b/conf/errorCodes/license.xml index fa1db7d837a..feaa70a2beb 100755 --- a/conf/errorCodes/license.xml +++ b/conf/errorCodes/license.xml @@ -76,6 +76,21 @@ License public key error + + 3005 + The remote license has expired + + + + 3006 + The remote license expires earlier than the local license + + + + 3007 + The remote license available capacity is lower than the local license + + 3100 License server generic error From 1ae8682a020222b540c81f6b30e34850cf15d4fd Mon Sep 17 00:00:00 2001 From: lianghy Date: Wed, 26 Nov 2025 16:36:21 +0800 Subject: [PATCH 651/737] [mevoco]: correct capacity check under addon overuse Fix inaccurate capacity validation caused by incorrect arm addon or vmware addon overuse Resolves: ZSTAC-79237 Change-Id: I646365206a7923767067706e7a6e667a796f686d --- .../header/server/TotalLicenseAuthorizedCapacityView.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/license/header/server/TotalLicenseAuthorizedCapacityView.java b/sdk/src/main/java/org/zstack/sdk/license/header/server/TotalLicenseAuthorizedCapacityView.java index 7860523e8b8..582857bcae5 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/header/server/TotalLicenseAuthorizedCapacityView.java +++ b/sdk/src/main/java/org/zstack/sdk/license/header/server/TotalLicenseAuthorizedCapacityView.java @@ -45,4 +45,12 @@ public java.util.List getAddOns() { return this.addOns; } + public java.util.Map extensions; + public void setExtensions(java.util.Map extensions) { + this.extensions = extensions; + } + public java.util.Map getExtensions() { + return this.extensions; + } + } From 93144910af7d9c9e7b768a024b561661f1fa589f Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Tue, 9 Dec 2025 05:01:51 -0500 Subject: [PATCH 652/737] [mevoco]: support retrieving self-usage information in getLicenseInfo Resolves: ZSTAC-80504 Change-Id: I6c6880504661647274666b76786c766a12346b66 --- sdk/src/main/java/SourceClassMap.java | 2 ++ .../header/server/LicenseUsageDetailView.java | 31 +++++++++++++++++++ .../header/server/LicenseUsageView.java | 8 +++++ 3 files changed, 41 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseUsageDetailView.java diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 976ae5d4e48..f741eb4d579 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -504,6 +504,7 @@ public class SourceClassMap { put("org.zstack.license.header.server.LicenseAuthorizedCapacityServerUsageView", "org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityServerUsageView"); put("org.zstack.license.header.server.LicenseAuthorizedCapacityUsageDetailView", "org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityUsageDetailView"); put("org.zstack.license.header.server.LicenseAuthorizedNodeInventory", "org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory"); + put("org.zstack.license.header.server.LicenseUsageDetailView", "org.zstack.sdk.license.header.server.LicenseUsageDetailView"); put("org.zstack.license.header.server.LicenseUsageView", "org.zstack.sdk.license.header.server.LicenseUsageView"); put("org.zstack.license.header.server.TotalLicenseAuthorizedCapacityView", "org.zstack.sdk.license.header.server.TotalLicenseAuthorizedCapacityView"); put("org.zstack.log.server.LogCategory", "org.zstack.sdk.LogCategory"); @@ -1622,6 +1623,7 @@ public class SourceClassMap { put("org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityServerUsageView", "org.zstack.license.header.server.LicenseAuthorizedCapacityServerUsageView"); put("org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityUsageDetailView", "org.zstack.license.header.server.LicenseAuthorizedCapacityUsageDetailView"); put("org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory", "org.zstack.license.header.server.LicenseAuthorizedNodeInventory"); + put("org.zstack.sdk.license.header.server.LicenseUsageDetailView", "org.zstack.license.header.server.LicenseUsageDetailView"); put("org.zstack.sdk.license.header.server.LicenseUsageView", "org.zstack.license.header.server.LicenseUsageView"); put("org.zstack.sdk.license.header.server.TotalLicenseAuthorizedCapacityView", "org.zstack.license.header.server.TotalLicenseAuthorizedCapacityView"); put("org.zstack.sdk.sns.SNSAliyunSmsEndpointInventory", "org.zstack.sns.SNSAliyunSmsEndpointInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseUsageDetailView.java b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseUsageDetailView.java new file mode 100644 index 00000000000..53bca0260b6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseUsageDetailView.java @@ -0,0 +1,31 @@ +package org.zstack.sdk.license.header.server; + + + +public class LicenseUsageDetailView { + + public java.lang.String usedBy; + public void setUsedBy(java.lang.String usedBy) { + this.usedBy = usedBy; + } + public java.lang.String getUsedBy() { + return this.usedBy; + } + + public long usage; + public void setUsage(long usage) { + this.usage = usage; + } + public long getUsage() { + return this.usage; + } + + public java.lang.String resourceInfo; + public void setResourceInfo(java.lang.String resourceInfo) { + this.resourceInfo = resourceInfo; + } + public java.lang.String getResourceInfo() { + return this.resourceInfo; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseUsageView.java b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseUsageView.java index dd713fdddfa..d6d36112517 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseUsageView.java +++ b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseUsageView.java @@ -36,4 +36,12 @@ public long getAvailable() { return this.available; } + public java.util.List usageDetails; + public void setUsageDetails(java.util.List usageDetails) { + this.usageDetails = usageDetails; + } + public java.util.List getUsageDetails() { + return this.usageDetails; + } + } From 30f8a35c8f463d374654aec8cb5909a0f296fe80 Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Mon, 1 Dec 2025 21:49:24 +0800 Subject: [PATCH 653/737] [hygon]: Hygon CCP Device Passthrough CCP = Cryptographic Co-Processor Resolves: ZSTAC-79099 Change-Id: I746a686d6179677875656c786464676475676370 --- build/deploydb.sh | 26 ++-- .../zstack/compute/host/HostSystemTags.java | 3 + .../org/zstack/compute/vm/VmInstanceBase.java | 9 ++ .../compute/vm/VmInstanceManagerImpl.java | 29 +++-- .../org/zstack/compute/vm/VmSystemTags.java | 4 + conf/db/upgrade/V5.5.0__schema.sql | 52 ++++++++ conf/zstack.xml | 1 + .../org/zstack/header/vm/VmInstanceSpec.java | 9 ++ .../java/org/zstack/kvm/KVMAgentCommands.java | 12 ++ .../src/main/java/org/zstack/kvm/KVMHost.java | 3 + .../scripts/RestDocumentationGenerator.groovy | 1 + sdk/src/main/java/SourceClassMap.java | 6 + .../sdk/GenerateHygonMdevDevicesAction.java | 104 ++++++++++++++++ .../sdk/GenerateHygonMdevDevicesResult.java | 7 ++ .../zstack/sdk/HygonCcpDeviceInventory.java | 112 ++++++++++++++++++ .../java/org/zstack/sdk/HygonDeviceState.java | 6 + .../java/org/zstack/sdk/HygonDeviceType.java | 6 + .../zstack/sdk/QueryHygonDeviceAction.java | 75 ++++++++++++ .../zstack/sdk/QueryHygonDeviceResult.java | 22 ++++ .../sdk/SetVmInstanceHygonMdevAction.java | 104 ++++++++++++++++ .../sdk/SetVmInstanceHygonMdevResult.java | 7 ++ .../sdk/UngenerateHygonMdevDevicesAction.java | 101 ++++++++++++++++ .../sdk/UngenerateHygonMdevDevicesResult.java | 7 ++ .../java/org/zstack/testlib/ApiHelper.groovy | 110 +++++++++++++++++ 24 files changed, 798 insertions(+), 18 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/GenerateHygonMdevDevicesAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/GenerateHygonMdevDevicesResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/HygonCcpDeviceInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/HygonDeviceState.java create mode 100644 sdk/src/main/java/org/zstack/sdk/HygonDeviceType.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryHygonDeviceAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryHygonDeviceResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SetVmInstanceHygonMdevAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SetVmInstanceHygonMdevResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UngenerateHygonMdevDevicesAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UngenerateHygonMdevDevicesResult.java diff --git a/build/deploydb.sh b/build/deploydb.sh index b0d922475bc..dc9c5478d23 100755 --- a/build/deploydb.sh +++ b/build/deploydb.sh @@ -27,7 +27,12 @@ else loginCmd="--user=$user --password=$password --host=$host --port=$port" fi -if command -v greatdb &> /dev/null; then +# Detect MySQL version +# Extract major version number from various MySQL/MariaDB/GreatDB output formats +db_version=$(${MYSQL} --version 2>/dev/null | grep -oP '\d+\.\d+\.\d+' | head -1 | cut -d'.' -f1 || echo "5") + +# GreatDB and MySQL 8.0+ require CREATE USER before GRANT +if command -v greatdb &> /dev/null || [ "$db_version" -ge 8 ] 2>/dev/null; then ${MYSQL} ${loginCmd} << EOF set global log_bin_trust_function_creators=1; DROP DATABASE IF EXISTS zstack; @@ -42,16 +47,17 @@ if command -v greatdb &> /dev/null; then grant all privileges on zstack_rest.* to root@'127.0.0.1'; EOF else + # MySQL 5.x: GRANT with IDENTIFIED BY auto-creates users ${MYSQL} ${loginCmd} << EOF - set global log_bin_trust_function_creators=1; - DROP DATABASE IF EXISTS zstack; - CREATE DATABASE zstack; - DROP DATABASE IF EXISTS zstack_rest; - CREATE DATABASE zstack_rest; - grant all privileges on zstack.* to root@'%' identified by "${password}"; - grant all privileges on zstack_rest.* to root@'%' identified by "${password}"; - grant all privileges on zstack.* to root@'127.0.0.1' identified by "${password}"; - grant all privileges on zstack_rest.* to root@'127.0.0.1' identified by "${password}"; + set global log_bin_trust_function_creators=1; + DROP DATABASE IF EXISTS zstack; + CREATE DATABASE zstack; + DROP DATABASE IF EXISTS zstack_rest; + CREATE DATABASE zstack_rest; + grant all privileges on zstack.* to root@'%' identified by "${password}"; + grant all privileges on zstack_rest.* to root@'%' identified by "${password}"; + grant all privileges on zstack.* to root@'127.0.0.1' identified by "${password}"; + grant all privileges on zstack_rest.* to root@'127.0.0.1' identified by "${password}"; EOF fi diff --git a/compute/src/main/java/org/zstack/compute/host/HostSystemTags.java b/compute/src/main/java/org/zstack/compute/host/HostSystemTags.java index 8de3693633c..f5a061c3780 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostSystemTags.java +++ b/compute/src/main/java/org/zstack/compute/host/HostSystemTags.java @@ -109,4 +109,7 @@ public class HostSystemTags { public static String DEPLOY_MODE_TOKEN = "deployMode"; public static PatternedSystemTag DEPLOY_MODE = new PatternedSystemTag(String.format("deployMode::{%s}", DEPLOY_MODE_TOKEN), HostVO.class); + + public static String HYGON_MDEV_MAX_QEMU_NUM_TOKEN = "hygonMdevMaxQemuNum"; + public static PatternedSystemTag HYGON_MDEV_MAX_QEMU_NUM = new PatternedSystemTag(String.format("hygonMdevMaxQemuNum::{%s}", HYGON_MDEV_MAX_QEMU_NUM_TOKEN), HostVO.class); } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java index 1c4834f9379..68c50b7947a 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java @@ -7368,6 +7368,10 @@ public DiskOfferingVO call(DiskOfferingVO arg) { getTokenByResourceUuid(self.getUuid(), VmSystemTags.CONSOLE_PASSWORD_TOKEN)); spec.setUsbRedirect(Boolean.parseBoolean(VmSystemTags.USB_REDIRECT.getTokenByResourceUuid(self.getUuid(), VmSystemTags.USB_REDIRECT_TOKEN))); spec.setEnableSecurityElement(Boolean.parseBoolean(VmSystemTags.SECURITY_ELEMENT_ENABLE.getTokenByResourceUuid(self.getUuid(), VmSystemTags.SECURITY_ELEMENT_ENABLE_TOKEN))); + String hygonToken = VmSystemTags.HYGON_SECURITY_ELEMENT_ENABLE.getTokenByResourceUuid(self.getUuid(), VmSystemTags.HYGON_SECURITY_ELEMENT_ENABLE_TOKEN); + if (StringUtils.isNotBlank(hygonToken) && "true".equalsIgnoreCase(hygonToken)) { + spec.setEnableHygonSecurityElement(Boolean.TRUE); + } if (struct.getStrategy() == VmCreationStrategy.CreateStopped || struct.getStrategy() == VmCreationStrategy.CreatedPaused) { spec.setCreatePaused(true); } @@ -7852,12 +7856,17 @@ public String call(VmNicInventory arg) { } spec.setCurrentVmOperation(operation); + selectBootOrder(spec); spec.setConsolePassword(VmSystemTags.CONSOLE_PASSWORD. getTokenByResourceUuid(self.getUuid(), VmSystemTags.CONSOLE_PASSWORD_TOKEN)); spec.setVDIMonitorNumber(VmSystemTags.VDI_MONITOR_NUMBER.getTokenByResourceUuid(self.getUuid(), VmSystemTags.VDI_MONITOR_NUMBER_TOKEN)); spec.setUsbRedirect(Boolean.parseBoolean(VmSystemTags.USB_REDIRECT.getTokenByResourceUuid(self.getUuid(), VmSystemTags.USB_REDIRECT_TOKEN))); spec.setEnableSecurityElement(Boolean.parseBoolean(VmSystemTags.SECURITY_ELEMENT_ENABLE.getTokenByResourceUuid(self.getUuid(), VmSystemTags.SECURITY_ELEMENT_ENABLE_TOKEN))); + String hygonToken = VmSystemTags.HYGON_SECURITY_ELEMENT_ENABLE.getTokenByResourceUuid(self.getUuid(), VmSystemTags.HYGON_SECURITY_ELEMENT_ENABLE_TOKEN); + if (StringUtils.isNotBlank(hygonToken) && "true".equalsIgnoreCase(hygonToken)) { + spec.setEnableHygonSecurityElement(Boolean.TRUE); + } for (BuildVmSpecExtensionPoint ext : pluginRgty.getExtensionList(BuildVmSpecExtensionPoint.class)) { ext.afterBuildVmSpec(spec); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java index 8ed1ba2e943..db203212e81 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java @@ -2078,18 +2078,18 @@ private void validateL3NetworkAttachSecurityGroup(String l3Uuid, List se VmSystemTags.L3_NETWORK_SECURITY_GROUP_UUIDS_REF.installValidator(validator); } - private void installSeDeviceValidator() { - VmSystemTags.SECURITY_ELEMENT_ENABLE.installValidator(new SystemTagValidator() { + private void installBooleanTagValidator(PatternedSystemTag tag, String tokenName, String tagDescription) { + tag.installValidator(new SystemTagValidator() { @Override public void validateSystemTag(String resourceUuid, Class resourceType, String systemTag) { - String SecurityElementEnableTokenByTag = null; - if (VmSystemTags.SECURITY_ELEMENT_ENABLE.isMatch(systemTag)) { - SecurityElementEnableTokenByTag = VmSystemTags.SECURITY_ELEMENT_ENABLE.getTokenByTag(systemTag, VmSystemTags.SECURITY_ELEMENT_ENABLE_TOKEN); + String tokenValue = null; + if (tag.isMatch(systemTag)) { + tokenValue = tag.getTokenByTag(systemTag, tokenName); } else { - throw new OperationFailureException(argerr("invalid securityElementEnable[%s], %s is not securityElementEnable tag", systemTag, SecurityElementEnableTokenByTag)); + throw new OperationFailureException(argerr("invalid %s tag[%s]", tagDescription, systemTag)); } - if (!isBoolean(SecurityElementEnableTokenByTag)) { - throw new OperationFailureException(argerr("invalid securityElementEnable[%s], %s is not boolean class", systemTag, SecurityElementEnableTokenByTag)); + if (!isBoolean(tokenValue)) { + throw new OperationFailureException(argerr("invalid %s[%s], value [%s] is not boolean", tagDescription, systemTag, tokenValue)); } } private boolean isBoolean(String param) { @@ -2098,6 +2098,18 @@ private boolean isBoolean(String param) { }); } + private void installSeDeviceValidator() { + installBooleanTagValidator(VmSystemTags.SECURITY_ELEMENT_ENABLE, + VmSystemTags.SECURITY_ELEMENT_ENABLE_TOKEN, + "securityElementEnable"); + } + + private void installHygonSeDeviceValidator() { + installBooleanTagValidator(VmSystemTags.HYGON_SECURITY_ELEMENT_ENABLE, + VmSystemTags.HYGON_SECURITY_ELEMENT_ENABLE_TOKEN, + "hygonSecurityElementEnable"); + } + private void installSystemTagValidator() { installHostnameValidator(); installUserdataValidator(); @@ -2107,6 +2119,7 @@ private void installSystemTagValidator() { installUsbRedirectValidator(); installL3NetworkSecurityGroupValidator(); installSeDeviceValidator(); + installHygonSeDeviceValidator(); new StaticIpOperator().installStaticIpValidator(); } private void installUsbRedirectValidator() { diff --git a/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java b/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java index 21c9668175a..713c64890ee 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java @@ -99,6 +99,10 @@ public class VmSystemTags { public static String SECURITY_ELEMENT_ENABLE_TOKEN = "securityElementEnable"; public static PatternedSystemTag SECURITY_ELEMENT_ENABLE = new PatternedSystemTag(String.format("securityElementEnable::{%s}", SECURITY_ELEMENT_ENABLE_TOKEN),VmInstanceVO.class); + // set hygonSecurityElementEnable::true to enable hygon se redirect + public static String HYGON_SECURITY_ELEMENT_ENABLE_TOKEN = "hygonSecurityElementEnable"; + public static PatternedSystemTag HYGON_SECURITY_ELEMENT_ENABLE = new PatternedSystemTag(String.format("hygonSecurityElementEnable::{%s}", HYGON_SECURITY_ELEMENT_ENABLE_TOKEN),VmInstanceVO.class); + // set rdpEnable::true to enable RDP tag public static String RDP_ENABLE_TOKEN = "RDPEnable"; public static PatternedSystemTag RDP_ENABLE = new PatternedSystemTag(String.format("RDPEnable::{%s}",RDP_ENABLE_TOKEN),VmInstanceVO.class); diff --git a/conf/db/upgrade/V5.5.0__schema.sql b/conf/db/upgrade/V5.5.0__schema.sql index a0bad3311c2..cc9ca4ddda3 100644 --- a/conf/db/upgrade/V5.5.0__schema.sql +++ b/conf/db/upgrade/V5.5.0__schema.sql @@ -69,3 +69,55 @@ DELIMITER ; CALL UpdateVolumeInstallPathForZbs(); ALTER TABLE `zstack`.`ExternalPrimaryStorageVO` MODIFY `addonInfo` TEXT DEFAULT NULL; + +-- ----------------------------------- +-- BEGIN OF HYGON CCP DEVICE VIRTUALIZATION +-- ----------------------------------- +CREATE TABLE IF NOT EXISTS `zstack`.`HygonCcpDeviceVO` ( + `uuid` varchar(32) NOT NULL UNIQUE COMMENT 'uuid', + `name` varchar(255) NOT NULL, + `description` text DEFAULT NULL, + `hostUuid` varchar(32) NOT NULL, + `pciBdf` varchar(32) NOT NULL, + `deviceType` varchar(32) NOT NULL, + `deviceId` varchar(32) NOT NULL, + `driverStatus` varchar(32) NOT NULL, + `isMasterPsp` tinyint(1) DEFAULT 0, + `vendorIdx` INT DEFAULT NULL, + `state` varchar(32) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`), + INDEX `idxHygonCCPDeviceVOhostUuid` (`hostUuid`), + INDEX `idxHygonCCPDeviceVOdeviceType` (`deviceType`), + INDEX `idxHygonCCPDeviceVOpciBdf` (`pciBdf`), + CONSTRAINT `fkHygonCCPDeviceVOHostEO` FOREIGN KEY (`hostUuid`) REFERENCES `zstack`.`HostEO` (`uuid`) ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`HygonCcpMdevVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(128) NOT NULL, + `description` text DEFAULT NULL, + `hostUuid` varchar(32) NOT NULL, + `ccpDeviceUuid` varchar(32) NOT NULL, + `mdevUuid` varchar(64) NOT NULL UNIQUE, + `vendorIdx` INT DEFAULT NULL, + `useFlag` tinyint(1) NOT NULL DEFAULT 0, + `vmInstanceUuid` varchar(32) DEFAULT NULL, + `status` varchar(32) NOT NULL, + `state` varchar(32) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`), + INDEX `idxHygonCcpMdevVOhostUuid` (`hostUuid`), + INDEX `idxHygonCcpMdevVOccpDeviceUuid` (`ccpDeviceUuid`), + INDEX `idxHygonCcpMdevVOmdevUuid` (`mdevUuid`), + INDEX `idxHygonCcpMdevVOvmInstanceUuid` (`vmInstanceUuid`), + INDEX `idxHygonCcpMdevVOuseFlag` (`useFlag`), + CONSTRAINT `fkHygonCcpMdevVOHostEO` FOREIGN KEY (`hostUuid`) REFERENCES `zstack`.`HostEO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkHygonCcpMdevVOHygonCCPDeviceVO` FOREIGN KEY (`ccpDeviceUuid`) REFERENCES `zstack`.`HygonCcpDeviceVO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkHygonCcpMdevVOVmInstanceEO` FOREIGN KEY (`vmInstanceUuid`) REFERENCES `zstack`.`VmInstanceEO` (`uuid`) ON DELETE SET NULL + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +-- --------------------------------- +-- END OF HYGON CCP DEVICE VIRTUALIZATION +-- --------------------------------- diff --git a/conf/zstack.xml b/conf/zstack.xml index ed752bf46ba..5a5dbc3e248 100755 --- a/conf/zstack.xml +++ b/conf/zstack.xml @@ -120,4 +120,5 @@ + diff --git a/header/src/main/java/org/zstack/header/vm/VmInstanceSpec.java b/header/src/main/java/org/zstack/header/vm/VmInstanceSpec.java index c182acd19ce..7007c592aea 100755 --- a/header/src/main/java/org/zstack/header/vm/VmInstanceSpec.java +++ b/header/src/main/java/org/zstack/header/vm/VmInstanceSpec.java @@ -353,6 +353,7 @@ public void setHostname(String hostname) { private boolean ignoreResourceReleaseFailure; private boolean usbRedirect = false; private boolean enableSecurityElement = false; + private Boolean enableHygonSecurityElement; private String enableRDP = "false"; private String VDIMonitorNumber = "1"; @NoLogging @@ -461,6 +462,14 @@ public void setEnableSecurityElement(boolean enableSecurityElement) { this.enableSecurityElement = enableSecurityElement; } + public Boolean isEnableHygonSecurityElement() { + return enableHygonSecurityElement; + } + + public void setEnableHygonSecurityElement(Boolean enableHygonSecurityElement) { + this.enableHygonSecurityElement = enableHygonSecurityElement; + } + public void setCreatePaused(boolean createPaused) { this.createPaused = createPaused; } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index f15d44d9ce1..606a572b25a 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -2317,6 +2317,9 @@ public static class StartVmCmd extends vdiCmd implements VmAddOnsCmd { @GrayVersion(value = "5.0.0") private Boolean qemu64BitPciMmioSetup; + @GrayVersion(value = "5.5.0") + private Boolean enableHygonSecurityElement; + public Boolean getQemu64BitPciMmioSetup() { return qemu64BitPciMmioSetup; } @@ -2520,6 +2523,15 @@ public boolean isEnableSecurityElement() { public void setEnableSecurityElement(boolean enableSecurityElement) { this.enableSecurityElement = enableSecurityElement; } + + public Boolean isEnableHygonSecurityElement() { + return enableHygonSecurityElement; + } + + public void setEnableHygonSecurityElement(Boolean enableHygonSecurityElement) { + this.enableHygonSecurityElement = enableHygonSecurityElement; + } + public boolean isUseNuma() { return useNuma; } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 423f9820827..bf29073a460 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -4521,6 +4521,9 @@ protected void startVm(final VmInstanceSpec spec, final NeedReplyMessage msg, fi cmd.setConsolePassword(spec.getConsolePassword()); cmd.setUsbRedirect(spec.isUsbRedirect()); cmd.setEnableSecurityElement(spec.isEnableSecurityElement()); + if (spec.isEnableHygonSecurityElement() != null) { + cmd.setEnableHygonSecurityElement(spec.isEnableHygonSecurityElement()); + } cmd.setVDIMonitorNumber(Integer.valueOf(spec.getVDIMonitorNumber())); cmd.setVmPortOff(rcf.getResourceConfigValue(VmGlobalConfig.VM_PORT_OFF, spec.getVmInventory().getUuid(), Boolean.class)); cmd.setConsoleMode("vnc"); diff --git a/rest/src/main/resources/scripts/RestDocumentationGenerator.groovy b/rest/src/main/resources/scripts/RestDocumentationGenerator.groovy index 3bad534aa29..c11a35e40a7 100755 --- a/rest/src/main/resources/scripts/RestDocumentationGenerator.groovy +++ b/rest/src/main/resources/scripts/RestDocumentationGenerator.groovy @@ -832,6 +832,7 @@ class RestDocumentationGenerator implements DocumentGenerator { && md.globalConfig.valueRange == "{true, false}") if (validatorString != null || !useBooleanValidator) { logger.info("valueRange of ${mdPath} is not latest") + logger.info("valueRange = ${md.globalConfig.valueRange} validatorString = ${validatorString}") flag = false } } diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index f741eb4d579..665630290f1 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -445,6 +445,9 @@ public class SourceClassMap { put("org.zstack.header.zwatch.AuditDataV2", "org.zstack.sdk.AuditDataV2"); put("org.zstack.hybrid.account.HybridAccountInventory", "org.zstack.sdk.HybridAccountInventory"); put("org.zstack.hybrid.core.HybridType", "org.zstack.sdk.HybridType"); + put("org.zstack.hygon.HygonCcpDeviceInventory", "org.zstack.sdk.HygonCcpDeviceInventory"); + put("org.zstack.hygon.HygonDeviceState", "org.zstack.sdk.HygonDeviceState"); + put("org.zstack.hygon.HygonDeviceType", "org.zstack.sdk.HygonDeviceType"); put("org.zstack.iam2.api.APIGetIAM2VirtualIDAPIPermissionMsg$APIPermissionStruct", "org.zstack.sdk.iam2.api.APIPermissionStruct"); put("org.zstack.iam2.api.APIGetIAM2VirtualIDAPIPermissionReply$Permission", "org.zstack.sdk.iam2.api.Permission"); put("org.zstack.iam2.api.Attribute", "org.zstack.sdk.iam2.api.Attribute"); @@ -1104,6 +1107,9 @@ public class SourceClassMap { put("org.zstack.sdk.HybridEipAddressInventory", "org.zstack.header.hybrid.network.eip.HybridEipAddressInventory"); put("org.zstack.sdk.HybridEipStatus", "org.zstack.header.hybrid.network.eip.HybridEipStatus"); put("org.zstack.sdk.HybridType", "org.zstack.hybrid.core.HybridType"); + put("org.zstack.sdk.HygonCcpDeviceInventory", "org.zstack.hygon.HygonCcpDeviceInventory"); + put("org.zstack.sdk.HygonDeviceState", "org.zstack.hygon.HygonDeviceState"); + put("org.zstack.sdk.HygonDeviceType", "org.zstack.hygon.HygonDeviceType"); put("org.zstack.sdk.HypervisorVersionState", "org.zstack.kvm.hypervisor.datatype.HypervisorVersionState"); put("org.zstack.sdk.IPsecConnectionInventory", "org.zstack.ipsec.IPsecConnectionInventory"); put("org.zstack.sdk.IPsecL3NetworkRefInventory", "org.zstack.ipsec.IPsecL3NetworkRefInventory"); diff --git a/sdk/src/main/java/org/zstack/sdk/GenerateHygonMdevDevicesAction.java b/sdk/src/main/java/org/zstack/sdk/GenerateHygonMdevDevicesAction.java new file mode 100644 index 00000000000..32bf2196017 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GenerateHygonMdevDevicesAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GenerateHygonMdevDevicesAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.GenerateHygonMdevDevicesResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {1L,1024L}, noTrim = false) + public java.lang.Integer maxQemuNum; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.GenerateHygonMdevDevicesResult value = res.getResult(org.zstack.sdk.GenerateHygonMdevDevicesResult.class); + ret.value = value == null ? new org.zstack.sdk.GenerateHygonMdevDevicesResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/hygon-devices/{hostUuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "generateHygonMdevDevices"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GenerateHygonMdevDevicesResult.java b/sdk/src/main/java/org/zstack/sdk/GenerateHygonMdevDevicesResult.java new file mode 100644 index 00000000000..e8ee3052e91 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GenerateHygonMdevDevicesResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class GenerateHygonMdevDevicesResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/HygonCcpDeviceInventory.java b/sdk/src/main/java/org/zstack/sdk/HygonCcpDeviceInventory.java new file mode 100644 index 00000000000..fead1fac8fd --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/HygonCcpDeviceInventory.java @@ -0,0 +1,112 @@ +package org.zstack.sdk; + +import org.zstack.sdk.HygonDeviceType; +import org.zstack.sdk.HygonDeviceState; + +public class HygonCcpDeviceInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public java.lang.String hostUuid; + public void setHostUuid(java.lang.String hostUuid) { + this.hostUuid = hostUuid; + } + public java.lang.String getHostUuid() { + return this.hostUuid; + } + + public java.lang.String pciBdf; + public void setPciBdf(java.lang.String pciBdf) { + this.pciBdf = pciBdf; + } + public java.lang.String getPciBdf() { + return this.pciBdf; + } + + public HygonDeviceType deviceType; + public void setDeviceType(HygonDeviceType deviceType) { + this.deviceType = deviceType; + } + public HygonDeviceType getDeviceType() { + return this.deviceType; + } + + public java.lang.String deviceId; + public void setDeviceId(java.lang.String deviceId) { + this.deviceId = deviceId; + } + public java.lang.String getDeviceId() { + return this.deviceId; + } + + public java.lang.String driverStatus; + public void setDriverStatus(java.lang.String driverStatus) { + this.driverStatus = driverStatus; + } + public java.lang.String getDriverStatus() { + return this.driverStatus; + } + + public java.lang.Boolean isMasterPsp; + public void setIsMasterPsp(java.lang.Boolean isMasterPsp) { + this.isMasterPsp = isMasterPsp; + } + public java.lang.Boolean getIsMasterPsp() { + return this.isMasterPsp; + } + + public java.lang.Integer vendorIdx; + public void setVendorIdx(java.lang.Integer vendorIdx) { + this.vendorIdx = vendorIdx; + } + public java.lang.Integer getVendorIdx() { + return this.vendorIdx; + } + + public HygonDeviceState state; + public void setState(HygonDeviceState state) { + this.state = state; + } + public HygonDeviceState getState() { + return this.state; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/HygonDeviceState.java b/sdk/src/main/java/org/zstack/sdk/HygonDeviceState.java new file mode 100644 index 00000000000..3e50b7c4582 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/HygonDeviceState.java @@ -0,0 +1,6 @@ +package org.zstack.sdk; + +public enum HygonDeviceState { + Enabled, + Disabled, +} diff --git a/sdk/src/main/java/org/zstack/sdk/HygonDeviceType.java b/sdk/src/main/java/org/zstack/sdk/HygonDeviceType.java new file mode 100644 index 00000000000..2784ddf7414 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/HygonDeviceType.java @@ -0,0 +1,6 @@ +package org.zstack.sdk; + +public enum HygonDeviceType { + NTBCCP, + PSPCCP, +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryHygonDeviceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryHygonDeviceAction.java new file mode 100644 index 00000000000..e7526e87cdf --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryHygonDeviceAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryHygonDeviceAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryHygonDeviceResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryHygonDeviceResult value = res.getResult(org.zstack.sdk.QueryHygonDeviceResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryHygonDeviceResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/hygon-devices"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryHygonDeviceResult.java b/sdk/src/main/java/org/zstack/sdk/QueryHygonDeviceResult.java new file mode 100644 index 00000000000..7ec08b49480 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryHygonDeviceResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryHygonDeviceResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmInstanceHygonMdevAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmInstanceHygonMdevAction.java new file mode 100644 index 00000000000..2e28156ae6d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SetVmInstanceHygonMdevAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class SetVmInstanceHygonMdevAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.SetVmInstanceHygonMdevResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = true, validValues = {"true","false"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hygonSecurityElementEnable; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.SetVmInstanceHygonMdevResult value = res.getResult(org.zstack.sdk.SetVmInstanceHygonMdevResult.class); + ret.value = value == null ? new org.zstack.sdk.SetVmInstanceHygonMdevResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/vm-instances/{uuid}/hygon-mdev"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmInstanceHygonMdevResult.java b/sdk/src/main/java/org/zstack/sdk/SetVmInstanceHygonMdevResult.java new file mode 100644 index 00000000000..03b0c8ee04b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SetVmInstanceHygonMdevResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class SetVmInstanceHygonMdevResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UngenerateHygonMdevDevicesAction.java b/sdk/src/main/java/org/zstack/sdk/UngenerateHygonMdevDevicesAction.java new file mode 100644 index 00000000000..bb355602a10 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UngenerateHygonMdevDevicesAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UngenerateHygonMdevDevicesAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UngenerateHygonMdevDevicesResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UngenerateHygonMdevDevicesResult value = res.getResult(org.zstack.sdk.UngenerateHygonMdevDevicesResult.class); + ret.value = value == null ? new org.zstack.sdk.UngenerateHygonMdevDevicesResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/hygon-devices/{hostUuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "ungenerateHygonMdevDevices"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UngenerateHygonMdevDevicesResult.java b/sdk/src/main/java/org/zstack/sdk/UngenerateHygonMdevDevicesResult.java new file mode 100644 index 00000000000..cd83aa57ea4 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UngenerateHygonMdevDevicesResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class UngenerateHygonMdevDevicesResult { + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 1fb130443cc..deae4ea042c 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -19997,6 +19997,33 @@ abstract class ApiHelper { } + def generateHygonMdevDevices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GenerateHygonMdevDevicesAction.class) Closure c) { + def a = new org.zstack.sdk.GenerateHygonMdevDevicesAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def generateMdevDevices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GenerateMdevDevicesAction.class) Closure c) { def a = new org.zstack.sdk.GenerateMdevDevicesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -31239,6 +31266,35 @@ abstract class ApiHelper { } + def queryHygonDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryHygonDeviceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryHygonDeviceAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryIAM2LdapBinding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryIAM2LdapBindingAction.class) Closure c) { def a = new org.zstack.sdk.QueryIAM2LdapBindingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -39471,6 +39527,33 @@ abstract class ApiHelper { } + def setVmInstanceHygonMdev(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmInstanceHygonMdevAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmInstanceHygonMdevAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def setVmMonitorNumber(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmMonitorNumberAction.class) Closure c) { def a = new org.zstack.sdk.SetVmMonitorNumberAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -41442,6 +41525,33 @@ abstract class ApiHelper { } + def ungenerateHygonMdevDevices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UngenerateHygonMdevDevicesAction.class) Closure c) { + def a = new org.zstack.sdk.UngenerateHygonMdevDevicesAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def ungenerateMdevDevices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UngenerateMdevDevicesAction.class) Closure c) { def a = new org.zstack.sdk.UngenerateMdevDevicesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From d30cc1c70757d55c549508800d18da9f0f571a82 Mon Sep 17 00:00:00 2001 From: zhangjianjun Date: Mon, 17 Nov 2025 18:37:27 +0800 Subject: [PATCH 654/737] [sdnHa]: add ha for sdn controller 1. add nfv inst group framework 2. add ha for sdn controller Resolves: ZSTAC-79204 Change-Id: I766b696461657977696c6b676d636f6f62637467 Signed-off-by: zhangjianjun --- build/pom.xml | 10 + .../SysComponentMemUsageExtensionPoint.java | 17 + .../compute/vm/VmNicQosConfigBackend.java | 9 + conf/db/upgrade/V5.5.0__schema.sql | 350 ++++++++++++ .../l3/L3NetworkUpdateExtensionPoint.java | 5 - .../l3/SdnControllerDisableDHCPMsg.java | 46 ++ .../l3/SdnControllerDisableDHCPReply.java | 6 + .../l3/SdnControllerEnableDHCPMsg.java | 26 + .../l3/SdnControllerEnableDHCPReply.java | 6 + .../l3/SdnControllerUpdateDHCPMsg.java | 37 ++ .../l3/SdnControllerUpdateDHCPReply.java | 6 + .../network/service/SdnControllerDhcp.java | 10 +- .../network/l2/L2NetworkApiInterceptor.java | 75 ++- .../zstack/network/l2/L2NoVlanNetwork.java | 57 +- .../org/zstack/network/l3/L3BasicNetwork.java | 122 ++-- .../network/l3/L3NetworkManagerImpl.java | 39 +- .../network/l3/NormalIpRangeFactory.java | 44 +- .../zstack/network/service/DhcpExtension.java | 61 +- .../zstack/appliancevm/ApplianceVmBase.java | 10 +- .../appliancevm/ApplianceVmFacadeImpl.java | 1 + .../appliancevm/ApplianceVmHaStatus.java | 3 +- .../ApplianceVmInventoryDoc_zh_cn.groovy | 24 + .../ApplianceVmSubTypeFactory.java | 2 + .../network/service/flat/FlatDhcpBackend.java | 27 +- .../java/org/zstack/kvm/KVMAgentCommands.java | 77 ++- .../main/java/org/zstack/kvm/KVMConstant.java | 4 + .../java/org/zstack/kvm/KVMGlobalConfig.java | 5 + .../src/main/java/org/zstack/kvm/KVMHost.java | 21 + .../SdnControllerApiInterceptor.java | 71 --- .../sdnController/SdnControllerBase.java | 42 ++ .../SdnControllerManagerImpl.java | 7 + .../h3cVcfc/H3cVcfcSdnController.java | 22 + .../header/SyncSdnControllerDataMsg.java | 22 + .../header/SyncSdnControllerDataReply.java | 7 + .../controller/SugonSdnController.java | 25 +- .../service/virtualrouter/VirtualRouter.java | 2 +- sdk/src/main/java/SourceClassMap.java | 26 + .../zstack/sdk/AddL3NetworkToGroupAction.java | 110 ++++ .../zstack/sdk/AddL3NetworkToGroupResult.java | 7 + .../sdk/AttachNfvInstToGroupAction.java | 104 ++++ .../sdk/AttachNfvInstToGroupResult.java | 14 + ...ChangeNfvInstGroupOperationModeAction.java | 104 ++++ ...ChangeNfvInstGroupOperationModeResult.java | 14 + .../org/zstack/sdk/CreateNfvInstAction.java | 122 ++++ .../zstack/sdk/CreateNfvInstGroupAction.java | 152 +++++ .../zstack/sdk/CreateNfvInstGroupResult.java | 14 + .../sdk/CreateNfvInstOfferingAction.java | 137 +++++ .../org/zstack/sdk/CreateNfvInstResult.java | 14 + .../zstack/sdk/DeleteNfvInstGroupAction.java | 104 ++++ .../zstack/sdk/DeleteNfvInstGroupResult.java | 7 + .../sdk/DetachNfvInstFromGroupAction.java | 104 ++++ .../sdk/DetachNfvInstFromGroupResult.java | 14 + .../main/java/org/zstack/sdk/FuncType.java | 5 + .../main/java/org/zstack/sdk/InstType.java | 7 + .../org/zstack/sdk/NfvInstClusterStatus.java | 12 + .../sdk/NfvInstGroupConfigTaskInventory.java | 71 +++ .../org/zstack/sdk/NfvInstGroupInventory.java | 210 +++++++ .../NfvInstGroupL3NetworkRefInventory.java | 71 +++ .../sdk/NfvInstGroupMonitorIpInventory.java | 47 ++ ...fvInstGroupNetworkServiceRefInventory.java | 55 ++ .../zstack/sdk/NfvInstGroupOperationMode.java | 6 + .../org/zstack/sdk/NfvInstGroupStatus.java | 9 + .../java/org/zstack/sdk/NfvInstInventory.java | 55 ++ .../zstack/sdk/NfvInstOfferingInventory.java | 31 ++ .../zstack/sdk/OvnControllerInventory.java | 15 + .../sdk/OvnControllerVmInstanceInventory.java | 18 +- .../sdk/ProvisionNfvInstConfigAction.java | 101 ++++ .../sdk/ProvisionNfvInstConfigResult.java | 14 + .../sdk/ProvisionNfvInstGroupAction.java | 101 ++++ .../sdk/ProvisionNfvInstGroupResult.java | 14 + .../org/zstack/sdk/QueryNfvInstAction.java | 75 +++ .../zstack/sdk/QueryNfvInstGroupAction.java | 75 +++ .../zstack/sdk/QueryNfvInstGroupResult.java | 22 + .../sdk/QueryNfvInstOfferingAction.java | 75 +++ .../sdk/QueryNfvInstOfferingResult.java | 22 + .../org/zstack/sdk/QueryNfvInstResult.java | 22 + .../zstack/sdk/QueryOvnControllerAction.java | 75 +++ .../zstack/sdk/QueryOvnControllerResult.java | 22 + .../QueryOvnControllerVmInstanceAction.java | 75 +++ .../QueryOvnControllerVmInstanceResult.java | 22 + .../zstack/sdk/ReconnectNfvInstAction.java | 101 ++++ .../zstack/sdk/ReconnectNfvInstResult.java | 14 + .../zstack/sdk/SyncNfvInstGroupAction.java | 101 ++++ .../zstack/sdk/SyncNfvInstGroupResult.java | 14 + .../zstack/sdk/UpdateNfvInstGroupAction.java | 107 ++++ .../zstack/sdk/UpdateNfvInstGroupResult.java | 14 + .../UpdateNfvInstProvisionConfigAction.java | 101 ++++ .../UpdateNfvInstProvisionConfigResult.java | 14 + .../java/org/zstack/testlib/ApiHelper.groovy | 523 ++++++++++++++++++ .../org/zstack/testlib/KVMSimulator.groovy | 16 + .../java/org/zstack/testlib/VipSpec.groovy | 57 ++ .../java/org/zstack/testlib/ZoneSpec.groovy | 9 + 92 files changed, 4482 insertions(+), 261 deletions(-) create mode 100644 compute/src/main/java/org/zstack/compute/allocator/SysComponentMemUsageExtensionPoint.java delete mode 100644 header/src/main/java/org/zstack/header/network/l3/L3NetworkUpdateExtensionPoint.java create mode 100644 header/src/main/java/org/zstack/header/network/l3/SdnControllerDisableDHCPMsg.java create mode 100644 header/src/main/java/org/zstack/header/network/l3/SdnControllerDisableDHCPReply.java create mode 100644 header/src/main/java/org/zstack/header/network/l3/SdnControllerEnableDHCPMsg.java create mode 100644 header/src/main/java/org/zstack/header/network/l3/SdnControllerEnableDHCPReply.java create mode 100644 header/src/main/java/org/zstack/header/network/l3/SdnControllerUpdateDHCPMsg.java create mode 100644 header/src/main/java/org/zstack/header/network/l3/SdnControllerUpdateDHCPReply.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/SyncSdnControllerDataMsg.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/SyncSdnControllerDataReply.java create mode 100644 sdk/src/main/java/org/zstack/sdk/AddL3NetworkToGroupAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/AddL3NetworkToGroupResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/AttachNfvInstToGroupAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/AttachNfvInstToGroupResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ChangeNfvInstGroupOperationModeAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ChangeNfvInstGroupOperationModeResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateNfvInstAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateNfvInstGroupAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateNfvInstGroupResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateNfvInstOfferingAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateNfvInstResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteNfvInstGroupAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteNfvInstGroupResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DetachNfvInstFromGroupAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DetachNfvInstFromGroupResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/FuncType.java create mode 100644 sdk/src/main/java/org/zstack/sdk/InstType.java create mode 100644 sdk/src/main/java/org/zstack/sdk/NfvInstClusterStatus.java create mode 100644 sdk/src/main/java/org/zstack/sdk/NfvInstGroupConfigTaskInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/NfvInstGroupInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/NfvInstGroupL3NetworkRefInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/NfvInstGroupMonitorIpInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/NfvInstGroupNetworkServiceRefInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/NfvInstGroupOperationMode.java create mode 100644 sdk/src/main/java/org/zstack/sdk/NfvInstGroupStatus.java create mode 100644 sdk/src/main/java/org/zstack/sdk/NfvInstInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/NfvInstOfferingInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/OvnControllerInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstConfigAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstConfigResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstGroupAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstGroupResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryNfvInstAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryNfvInstGroupAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryNfvInstGroupResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryNfvInstOfferingAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryNfvInstOfferingResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryNfvInstResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryOvnControllerAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryOvnControllerResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryOvnControllerVmInstanceAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryOvnControllerVmInstanceResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ReconnectNfvInstAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ReconnectNfvInstResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SyncNfvInstGroupAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SyncNfvInstGroupResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateNfvInstGroupAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateNfvInstGroupResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateNfvInstProvisionConfigAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateNfvInstProvisionConfigResult.java create mode 100644 testlib/src/main/java/org/zstack/testlib/VipSpec.groovy diff --git a/build/pom.xml b/build/pom.xml index 504841e00b9..c2eb9f2cbbc 100755 --- a/build/pom.xml +++ b/build/pom.xml @@ -495,6 +495,16 @@ vpc ${project.version} + + org.zstack + nfvInstGroup + ${project.version} + + + org.zstack + nfvInst + ${project.version} + org.zstack diff --git a/compute/src/main/java/org/zstack/compute/allocator/SysComponentMemUsageExtensionPoint.java b/compute/src/main/java/org/zstack/compute/allocator/SysComponentMemUsageExtensionPoint.java new file mode 100644 index 00000000000..8503295269d --- /dev/null +++ b/compute/src/main/java/org/zstack/compute/allocator/SysComponentMemUsageExtensionPoint.java @@ -0,0 +1,17 @@ +package org.zstack.compute.allocator; + +public interface SysComponentMemUsageExtensionPoint { + /** + * Retrieves the amount of huge page memory used by the system component (in byte). + * + * @return the number of byte of huge page memory in use + */ + long getHugePageMemoryUsage(String hostUuid); + + /** + * Retrieves the amount of normal memory used by the system component (in byte). + * + * @return the number of byte of normal memory in use + */ + long getNormalMemoryUsage(String hostUuid); +} diff --git a/compute/src/main/java/org/zstack/compute/vm/VmNicQosConfigBackend.java b/compute/src/main/java/org/zstack/compute/vm/VmNicQosConfigBackend.java index 422a4fa9d7e..e00e4b0496f 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmNicQosConfigBackend.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmNicQosConfigBackend.java @@ -1,11 +1,20 @@ package org.zstack.compute.vm; +import java.util.List; + public interface VmNicQosConfigBackend { String getVmInstanceType(); void addNicQos(String vmUuid, String vmNicUuid, Long outboundBandwidth, Long inboundBandwidth); void deleteNicQos(String vmUuid, String vmNicUuid,String direction); VmNicQosStruct getNicQos(String vmUuid, String vmNicUuid); + /** + * Batch version: return QoS struct for provided NIC UUIDs in the same order. + */ + default List getNicQosBatch(List vmNicUuids) { + throw new UnsupportedOperationException("getNicQosBatch is not supported"); + } + void addVmQos(String vmUuid, Long outboundBandwidth, Long inboundBandwidth); void deleteVmQos(String vmUuid, String direction); VmNicQosStruct getVmQos(String vmUuid); diff --git a/conf/db/upgrade/V5.5.0__schema.sql b/conf/db/upgrade/V5.5.0__schema.sql index cc9ca4ddda3..e76e26d5d71 100644 --- a/conf/db/upgrade/V5.5.0__schema.sql +++ b/conf/db/upgrade/V5.5.0__schema.sql @@ -121,3 +121,353 @@ CREATE TABLE IF NOT EXISTS `zstack`.`HygonCcpMdevVO` ( -- --------------------------------- -- END OF HYGON CCP DEVICE VIRTUALIZATION -- --------------------------------- + +CREATE TABLE IF NOT EXISTS `zstack`.`NfvInstOfferingVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `managementNetworkUuid` varchar(32) NOT NULL, + `imageUuid` varchar(32) NOT NULL, + `zoneUuid` varchar(32) NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT fkNfvInstOfferingVOL3NetworkEO FOREIGN KEY (managementNetworkUuid) REFERENCES `zstack`.`L3NetworkEO` (uuid) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`NfvInstGroupVO` ( + `uuid` VARCHAR(32) NOT NULL UNIQUE, + `name` VARCHAR(255) NOT NULL, + `description` VARCHAR(2048) DEFAULT NULL, + `nfvInstOfferingUuid` VARCHAR(32) DEFAULT NULL, + `instType` VARCHAR(64) NOT NULL, + `funcType` VARCHAR(64) NOT NULL, + `configVersion` int unsigned DEFAULT 0, + `netOsDistro` VARCHAR(128) DEFAULT NULL, + `baseOsDistro` VARCHAR(128) DEFAULT NULL, + `status` VARCHAR(32) DEFAULT 'Initializing', + `statusDetail` VARCHAR(255) DEFAULT NULL, + `operationMode` VARCHAR(32) DEFAULT 'Normal', + `vipUuid` VARCHAR(32) DEFAULT NULL, + `ipv6VipUuid` VARCHAR(32) DEFAULT NULL, + `primaryStorageUuid` VARCHAR(32) DEFAULT NULL, + `primaryStoragePoolUuid` VARCHAR(32) DEFAULT NULL, + `clusterUuid` VARCHAR(32) DEFAULT NULL, + `zoneUuid` VARCHAR(32) DEFAULT NULL, + `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkNfvInstGroupVONfvInstOfferingVO` FOREIGN KEY (`nfvInstOfferingUuid`) REFERENCES `zstack`.`NfvInstOfferingVO` (uuid) ON DELETE SET NULL, + CONSTRAINT `fkNfvInstGroupVOPrimaryStorageEO` FOREIGN KEY (`primaryStorageUuid`) REFERENCES `zstack`.`PrimaryStorageEO` (uuid) ON DELETE SET NULL, + CONSTRAINT `fkNfvInstGroupVOClusterEO` FOREIGN KEY (`clusterUuid`) REFERENCES `zstack`.`ClusterEO` (uuid) ON DELETE SET NULL, + CONSTRAINT `fkNfvInstGroupVOZoneEO` FOREIGN KEY (`zoneUuid`) REFERENCES `zstack`.`ZoneEO` (uuid) ON DELETE SET NULL, + KEY `idx_nfv_inst_group_status_mode` (`status`, `operationMode`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`NfvInstGroupMonitorIpVO` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `nfvInstGroupUuid` varchar(32) NOT NULL, + `monitorIp` varchar(255) NOT NULL, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + CONSTRAINT fkNfvInstGroupMonitorIpVONfvInstGroupVO FOREIGN KEY (nfvInstGroupUuid) REFERENCES NfvInstGroupVO (uuid) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`NfvInstGroupNetworkServiceRefVO` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `nfvInstGroupUuid` varchar(32) NOT NULL, + `networkServiceName` VARCHAR(255) NOT NULL, + `networkServiceUuid` varchar(32) NOT NULL, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + CONSTRAINT fkNfvInstGroupNetworkServiceRefVONfvInstGroupVO FOREIGN KEY (nfvInstGroupUuid) REFERENCES NfvInstGroupVO (uuid) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`NfvInstGroupL3NetworkRefVO` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `nfvInstGroupUuid` varchar(32) NOT NULL, + `networkServiceUuid` VARCHAR(32) NOT NULL, + `l3NetworkUuid` varchar(32) NOT NULL, + `type` varchar(255) NOT NULL, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + CONSTRAINT fkNfvInstGroupL3NetworkRefVONfvInstGroupVO FOREIGN KEY (nfvInstGroupUuid) REFERENCES NfvInstGroupVO (uuid) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`NfvInstVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `nfvInstGroupUuid` varchar(32) NOT NULL, + `configVersion` int unsigned NOT NULL DEFAULT 0, + `netOsDistro` VARCHAR(128) NOT NULL, + `baseOsDistro` VARCHAR(128) NOT NULL, + `clusterStatus` VARCHAR(32) DEFAULT 'Unknown', + `statusDetail` VARCHAR(255) DEFAULT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT fkNfvInstVONfvInstGroupVO FOREIGN KEY (nfvInstGroupUuid) REFERENCES NfvInstGroupVO (uuid) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`NfvInstMetaDataVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `agentVersion` varchar(32) DEFAULT NULL, + `netOsVersion` varchar(32) DEFAULT NULL, + `baseOsVersion` varchar(32) DEFAULT NULL, + `kernelVersion` varchar(256) DEFAULT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkNfvInstMetadataVONfvInstVO` FOREIGN KEY (`uuid`) REFERENCES `NfvInstVO` (`uuid`) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`NfvInstGroupConfigTaskVO` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `nfvInstGroupUuid` varchar(32) NOT NULL, + `configVersion` int unsigned DEFAULT 0, + `serviceUuid` varchar(32) NOT NULL, + `taskName` VARCHAR(255) NOT NULL, + `path` VARCHAR(255) NOT NULL, + `taskData` text DEFAULT NULL, + `checkStatus` BOOLEAN DEFAULT FALSE, + PRIMARY KEY (`id`), + CONSTRAINT fkNfvInstGroupConfigTaskVONfvInstGroupVO FOREIGN KEY (nfvInstGroupUuid) REFERENCES NfvInstGroupVO (uuid) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CALL ADD_COLUMN('OvnControllerVmInstanceVO', 'nbClusterStatus', 'VARCHAR(32)', 1, 'Unknown'); +CALL ADD_COLUMN('OvnControllerVmInstanceVO', 'sbClusterStatus', 'VARCHAR(32)', 1, 'Unknown'); + +-- ======================================== +-- Upgrade OvnControllerVmOfferingVO and OvnControllerVmInstanceVO hierarchy +-- Only execute if NOT already upgraded +-- ======================================== + +DELIMITER $$ + +DROP PROCEDURE IF EXISTS upgrade_ovn_controller_to_nfv_inst$$ + +CREATE PROCEDURE upgrade_ovn_controller_to_nfv_inst() +BEGIN + DECLARE already_upgraded INT DEFAULT 0; + DECLARE has_management_network_column INT DEFAULT 0; + DECLARE offering_count INT DEFAULT 0; + DECLARE offering_migrated_count INT DEFAULT 0; + DECLARE instance_in_nfv_inst_count INT DEFAULT 0; + DECLARE instance_in_nfv_group_count INT DEFAULT 0; + + -- Check if upgrade has already been done by checking any of these conditions: + -- a. OvnControllerVmOfferingVO no longer has managementNetworkUuid column + SELECT COUNT(*) INTO has_management_network_column + FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = 'zstack' + AND TABLE_NAME = 'OvnControllerVmOfferingVO' + AND COLUMN_NAME = 'managementNetworkUuid'; + + IF has_management_network_column = 0 THEN + SET already_upgraded = 1; + END IF; + + -- b. Check if OvnControllerVmOfferingVO records exist in NfvInstOfferingVO + IF already_upgraded = 0 THEN + SELECT COUNT(*) INTO offering_count FROM OvnControllerVmOfferingVO; + + IF offering_count > 0 THEN + SELECT COUNT(*) INTO offering_migrated_count + FROM OvnControllerVmOfferingVO ovo + INNER JOIN NfvInstOfferingVO nivo ON ovo.uuid = nivo.uuid; + + IF offering_migrated_count = offering_count THEN + SET already_upgraded = 1; + END IF; + END IF; + END IF; + + -- c. Check if OvnControllerVmInstanceVO records exist in NfvInstVO + IF already_upgraded = 0 THEN + SELECT COUNT(*) INTO instance_in_nfv_inst_count + FROM OvnControllerVmInstanceVO ovi + INNER JOIN NfvInstVO niv ON ovi.uuid = niv.uuid; + + IF instance_in_nfv_inst_count > 0 THEN + SET already_upgraded = 1; + END IF; + END IF; + + -- d. Check if NfvInstGroupVO created for OvnControllerVmInstanceVO + IF already_upgraded = 0 THEN + SELECT COUNT(*) INTO instance_in_nfv_group_count + FROM OvnControllerVmInstanceVO ovi + INNER JOIN NfvInstVO niv ON ovi.uuid = niv.uuid + INNER JOIN NfvInstGroupVO nig ON niv.nfvInstGroupUuid = nig.uuid + WHERE nig.funcType = 'OVN_SDN_CONTROLLER'; + + IF instance_in_nfv_group_count > 0 THEN + SET already_upgraded = 1; + END IF; + END IF; + + -- If any condition is met, skip the upgrade + IF already_upgraded = 1 THEN + SELECT 'Upgrade already completed, skipping OVN Controller to NFV Instance migration' AS message; + ELSE + -- ======================================== + -- Step 1: Create NfvInstOfferingVO records for existing OvnControllerVmOfferingVO + -- This must be done BEFORE dropping columns to preserve data + -- ======================================== + INSERT INTO NfvInstOfferingVO (uuid, managementNetworkUuid, imageUuid, zoneUuid) + SELECT + ovo.uuid, + ovo.managementNetworkUuid, + ovo.imageUuid, + ovo.zoneUuid + FROM OvnControllerVmOfferingVO ovo + WHERE NOT EXISTS ( + SELECT 1 FROM NfvInstOfferingVO nivo WHERE nivo.uuid = ovo.uuid + ); + + -- ======================================== + -- Step 2: Now safe to drop foreign key from OvnControllerVmOfferingVO + -- (Columns will be dropped after procedure execution) + -- ======================================== + IF has_management_network_column > 0 THEN + -- Check if foreign key exists before dropping + IF EXISTS ( + SELECT 1 FROM information_schema.TABLE_CONSTRAINTS + WHERE TABLE_SCHEMA = 'zstack' + AND TABLE_NAME = 'OvnControllerVmOfferingVO' + AND CONSTRAINT_NAME = 'fkOvnControllerVmOfferingVOL3NetworkEO' + ) THEN + ALTER TABLE OvnControllerVmOfferingVO DROP FOREIGN KEY fkOvnControllerVmOfferingVOL3NetworkEO; + END IF; + END IF; + + -- ======================================== + -- Step 3: Create NfvInstGroupVO for each OvnControllerVmInstanceVO + -- ======================================== + + -- First, create a temporary table to store the mapping between instance UUID and generated group UUID + CREATE TEMPORARY TABLE IF NOT EXISTS temp_ovn_inst_group_mapping ( + inst_uuid VARCHAR(32) NOT NULL PRIMARY KEY, + group_uuid VARCHAR(32) NOT NULL, + group_name VARCHAR(255) NOT NULL + ); + + -- Generate random UUIDs for each OVN instance and store the mapping + INSERT INTO temp_ovn_inst_group_mapping (inst_uuid, group_uuid, group_name) + SELECT + ovn.uuid AS inst_uuid, + REPLACE(UUID(), '-', '') AS group_uuid, + LEFT(CONCAT('OVN-Controller-Group-', vm.name), 255) AS group_name + FROM OvnControllerVmInstanceVO ovn + INNER JOIN VmInstanceVO vm ON ovn.uuid = vm.uuid + WHERE NOT EXISTS ( + SELECT 1 FROM NfvInstGroupVO nfv_grp WHERE nfv_grp.uuid = ovn.uuid + ); + + -- Insert ResourceVO records for each NfvInstGroup + INSERT INTO ResourceVO (uuid, resourceName, resourceType, concreteResourceType) + SELECT + mapping.group_uuid AS uuid, + mapping.group_name AS resourceName, + 'NfvInstGroupVO' AS resourceType, + 'org.zstack.network.service.nfvinstgroup.NfvInstGroupVO' AS concreteResourceType + FROM temp_ovn_inst_group_mapping mapping + WHERE NOT EXISTS ( + SELECT 1 FROM ResourceVO res WHERE res.uuid = mapping.group_uuid + ); + + -- Insert NfvInstGroupVO records + INSERT INTO NfvInstGroupVO ( + uuid, + name, + description, + nfvInstOfferingUuid, + instType, + funcType, + configVersion, + netOsDistro, + baseOsDistro, + status, + operationMode, + vipUuid, + primaryStorageUuid, + clusterUuid, + zoneUuid, + createDate, + lastOpDate + ) + SELECT + mapping.group_uuid AS group_uuid, -- group uuid: randomly generated + mapping.group_name AS name, -- group name (limit to 255 chars) + CONCAT('Auto-created group for OVN controller ', vm.name) AS description, + ovn_off.uuid AS offering_uuid, -- nfvInstOfferingUuid + 'KVM' AS inst_type, -- instType + 'OVN_SDN_CONTROLLER' AS func_type, -- funcType + 0 AS config_version, -- configVersion + 'euler' AS net_os_distro, -- netOsDistro + 'euler' AS base_os_distro, -- baseOsDistro + 'Initializing' AS status, -- status + 'Normal' AS operation_mode, -- operationMode + NULL AS vip_uuid, -- vipUuid (will be set later if needed) + vol.primaryStorageUuid AS ps_uuid, -- primaryStorageUuid (from VolumeVO via rootVolumeUuid) + vm.clusterUuid AS cluster_uuid, -- clusterUuid + vm.zoneUuid AS zone_uuid, -- zoneUuid + vm.createDate AS create_date, -- createDate + vm.lastOpDate AS last_op_date -- lastOpDate + FROM temp_ovn_inst_group_mapping mapping + INNER JOIN OvnControllerVmInstanceVO ovn ON mapping.inst_uuid = ovn.uuid + INNER JOIN VmInstanceVO vm ON ovn.uuid = vm.uuid + LEFT JOIN VolumeVO vol ON vm.rootVolumeUuid = vol.uuid + LEFT JOIN OvnControllerVmOfferingVO ovn_off ON vm.instanceOfferingUuid = ovn_off.uuid + WHERE NOT EXISTS ( + SELECT 1 FROM NfvInstGroupVO nfv_grp WHERE nfv_grp.uuid = mapping.group_uuid + ); + + -- ======================================== + -- Step 4: Create NfvInstVO records for each OvnControllerVmInstanceVO + -- ======================================== + INSERT INTO NfvInstVO ( + uuid, + nfvInstGroupUuid, + configVersion, + netOsDistro, + baseOsDistro, + clusterStatus, + statusDetail + ) + SELECT + ovn.uuid AS inst_uuid, + mapping.group_uuid AS group_uuid, -- link to the group we created (using mapping) + 0 AS config_version, -- configVersion + 'euler' AS net_os_distro, -- netOsDistro (required field) + 'euler' AS base_os_distro, -- baseOsDistro (required field) + 'Unknown' AS cluster_status, -- clusterStatus + NULL AS status_detail -- statusDetail + FROM OvnControllerVmInstanceVO ovn + INNER JOIN temp_ovn_inst_group_mapping mapping ON ovn.uuid = mapping.inst_uuid + WHERE NOT EXISTS ( + SELECT 1 FROM NfvInstVO nfv WHERE nfv.uuid = ovn.uuid + ); + + -- Clean up temporary table + DROP TEMPORARY TABLE IF EXISTS temp_ovn_inst_group_mapping; + + SELECT 'OVN Controller to NFV Instance migration completed successfully' AS message; + + -- Drop columns after data migration (if not already dropped) + CALL DROP_COLUMN('OvnControllerVmOfferingVO', 'managementNetworkUuid'); + CALL DROP_COLUMN('OvnControllerVmOfferingVO', 'imageUuid'); + CALL DROP_COLUMN('OvnControllerVmOfferingVO', 'zoneUuid'); + END IF; +END$$ + +DELIMITER ; + +-- Execute the upgrade procedure +CALL upgrade_ovn_controller_to_nfv_inst(); + +-- Drop the procedure after execution +DROP PROCEDURE IF EXISTS upgrade_ovn_controller_to_nfv_inst; + +CREATE TABLE IF NOT EXISTS `OvnControllerVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `remoteOvn` tinyint(1) NOT NULL DEFAULT 0, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT IGNORE INTO OvnControllerVO (uuid, remoteOvn) +SELECT uuid, 0 FROM SdnControllerVO where vendorType = 'Ovn'; diff --git a/header/src/main/java/org/zstack/header/network/l3/L3NetworkUpdateExtensionPoint.java b/header/src/main/java/org/zstack/header/network/l3/L3NetworkUpdateExtensionPoint.java deleted file mode 100644 index 6699c0b0021..00000000000 --- a/header/src/main/java/org/zstack/header/network/l3/L3NetworkUpdateExtensionPoint.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.zstack.header.network.l3; - -public interface L3NetworkUpdateExtensionPoint { - void updateL3NetworkMtu(L3NetworkInventory inventory); -} diff --git a/header/src/main/java/org/zstack/header/network/l3/SdnControllerDisableDHCPMsg.java b/header/src/main/java/org/zstack/header/network/l3/SdnControllerDisableDHCPMsg.java new file mode 100644 index 00000000000..7d0e0c9dcb7 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/l3/SdnControllerDisableDHCPMsg.java @@ -0,0 +1,46 @@ +package org.zstack.header.network.l3; + +import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; +import org.zstack.utils.network.IPv6Constants; + +public class SdnControllerDisableDHCPMsg extends NeedReplyMessage implements SdnControllerMessage { + private String l3NetworkUuid; + private Integer ipVersion = IPv6Constants.DUAL_STACK; + private String sdnControllerUuid; + private boolean checkIpRange = false; + + public Integer getIpVersion() { + return ipVersion; + } + + public void setIpVersion(Integer ipVersion) { + this.ipVersion = ipVersion; + } + + public String getL3NetworkUuid() { + return l3NetworkUuid; + } + + public void setL3NetworkUuid(String l3NetworkUuid) { + this.l3NetworkUuid = l3NetworkUuid; + } + + @Override + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public boolean isCheckIpRange() { + return checkIpRange; + } + + public void setCheckIpRange(boolean checkIpRange) { + this.checkIpRange = checkIpRange; + } +} + diff --git a/header/src/main/java/org/zstack/header/network/l3/SdnControllerDisableDHCPReply.java b/header/src/main/java/org/zstack/header/network/l3/SdnControllerDisableDHCPReply.java new file mode 100644 index 00000000000..990833e6a72 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/l3/SdnControllerDisableDHCPReply.java @@ -0,0 +1,6 @@ +package org.zstack.header.network.l3; + +import org.zstack.header.message.MessageReply; + +public class SdnControllerDisableDHCPReply extends MessageReply { +} diff --git a/header/src/main/java/org/zstack/header/network/l3/SdnControllerEnableDHCPMsg.java b/header/src/main/java/org/zstack/header/network/l3/SdnControllerEnableDHCPMsg.java new file mode 100644 index 00000000000..ade67404bd8 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/l3/SdnControllerEnableDHCPMsg.java @@ -0,0 +1,26 @@ +package org.zstack.header.network.l3; + +import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; + +public class SdnControllerEnableDHCPMsg extends NeedReplyMessage implements SdnControllerMessage { + private String l3NetworkUuid; + private String sdnControllerUuid; + + public String getL3NetworkUuid() { + return l3NetworkUuid; + } + + public void setL3NetworkUuid(String l3NetworkUuid) { + this.l3NetworkUuid = l3NetworkUuid; + } + + @Override + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } +} diff --git a/header/src/main/java/org/zstack/header/network/l3/SdnControllerEnableDHCPReply.java b/header/src/main/java/org/zstack/header/network/l3/SdnControllerEnableDHCPReply.java new file mode 100644 index 00000000000..15cf0701b0a --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/l3/SdnControllerEnableDHCPReply.java @@ -0,0 +1,6 @@ +package org.zstack.header.network.l3; + +import org.zstack.header.message.MessageReply; + +public class SdnControllerEnableDHCPReply extends MessageReply { +} diff --git a/header/src/main/java/org/zstack/header/network/l3/SdnControllerUpdateDHCPMsg.java b/header/src/main/java/org/zstack/header/network/l3/SdnControllerUpdateDHCPMsg.java new file mode 100644 index 00000000000..3cc193a7d20 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/l3/SdnControllerUpdateDHCPMsg.java @@ -0,0 +1,37 @@ +package org.zstack.header.network.l3; + +import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; +import org.zstack.utils.network.IPv6Constants; + +public class SdnControllerUpdateDHCPMsg extends NeedReplyMessage implements SdnControllerMessage { + private String l3NetworkUuid; + private String sdnControllerUuid; + private Integer ipVersion = IPv6Constants.DUAL_STACK; + + @Override + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getL3NetworkUuid() { + return l3NetworkUuid; + } + + public void setL3NetworkUuid(String l3NetworkUuid) { + this.l3NetworkUuid = l3NetworkUuid; + } + + public Integer getIpVersion() { + return ipVersion; + } + + public void setIpVersion(Integer ipVersion) { + this.ipVersion = ipVersion; + } +} + diff --git a/header/src/main/java/org/zstack/header/network/l3/SdnControllerUpdateDHCPReply.java b/header/src/main/java/org/zstack/header/network/l3/SdnControllerUpdateDHCPReply.java new file mode 100644 index 00000000000..ddda3d65551 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/l3/SdnControllerUpdateDHCPReply.java @@ -0,0 +1,6 @@ +package org.zstack.header.network.l3; + +import org.zstack.header.message.MessageReply; + +public class SdnControllerUpdateDHCPReply extends MessageReply { +} diff --git a/header/src/main/java/org/zstack/header/network/service/SdnControllerDhcp.java b/header/src/main/java/org/zstack/header/network/service/SdnControllerDhcp.java index 065d90e17d9..c4a482b426d 100644 --- a/header/src/main/java/org/zstack/header/network/service/SdnControllerDhcp.java +++ b/header/src/main/java/org/zstack/header/network/service/SdnControllerDhcp.java @@ -24,14 +24,14 @@ public interface SdnControllerDhcp { /** * 启用指定 L3 网络的 DHCP 服务 - * @param l3_min L3 网络索引 - * @param l3_max L3 网络索引 + * @param l3Min L3 网络索引 + * @param l3Max L3 网络索引 * @param invs L3 网络清单列表 * @param sync 是否同步操作 * @param completion 操作完成后的回调 * */ - void enableDhcp(long l3Min, long l3Max, List invs, boolean sync, Completion completion); + void enableDhcp(long l3Min, long l3Max, List invs, Integer ipversion, boolean sync, Completion completion); /** * 启用指定 L3 网络的 DHCP 服务 @@ -39,7 +39,7 @@ public interface SdnControllerDhcp { * @param completion 操作完成后的回调 * */ - void enableDhcp(List invs, Completion completion); + void enableDhcp(List invs, Integer ipversion, Completion completion); /** * 禁用指定 L3 网络的 DHCP 服务 @@ -48,5 +48,5 @@ public interface SdnControllerDhcp { * @param completion 操作完成后的回调 * */ - void disableDhcp(List invs, int ipversion, Completion completion); + void disableDhcp(List invs, Integer ipversion, Completion completion); } diff --git a/network/src/main/java/org/zstack/network/l2/L2NetworkApiInterceptor.java b/network/src/main/java/org/zstack/network/l2/L2NetworkApiInterceptor.java index b67aea2b6ef..b8b017f1d44 100755 --- a/network/src/main/java/org/zstack/network/l2/L2NetworkApiInterceptor.java +++ b/network/src/main/java/org/zstack/network/l2/L2NetworkApiInterceptor.java @@ -27,6 +27,8 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.CollectionDSL.e; +import static org.zstack.utils.CollectionDSL.map; /** * Created with IntelliJ IDEA. @@ -141,6 +143,8 @@ private void validate(APIChangeL2NetworkVlanIdMsg msg) { throw new ApiMessageInterceptionException(argerr("cannot change vlan for l2Network[uuid:%s]" + " because this l2Network is isolated", l2.getUuid())); } + String sdnControllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID + .getTokenByResourceUuid(msg.getL2NetworkUuid(), L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); if (msg.getType().equals(L2NetworkConstant.L2_VLAN_NETWORK_TYPE)) { if (msg.getVlan() == null) { throw new ApiMessageInterceptionException(argerr("vlan is required for " + @@ -151,15 +155,35 @@ private void validate(APIChangeL2NetworkVlanIdMsg msg) { } List attachedClusters = l2.getAttachedClusterRefs().stream() .map(L2NetworkClusterRefVO::getClusterUuid).collect(Collectors.toList()); - List l2s = SQL.New("select l2" + - " from L2NetworkVO l2, L2NetworkClusterRefVO ref" + - " where l2.virtualNetworkId = :virtualNetworkId" + - " and l2.physicalInterface = :physicalInterface" + - " and ref.clusterUuid in (:clusterUuids)" + - " and l2.type = 'L2VlanNetwork'") - .param("virtualNetworkId", msg.getVlan()) - .param("physicalInterface", l2.getPhysicalInterface()) - .param("clusterUuids", attachedClusters).list(); + List l2s; + if (sdnControllerUuid == null) { + l2s = SQL.New("select l2" + + " from L2NetworkVO l2, L2NetworkClusterRefVO ref" + + " where l2.uuid = ref.l2NetworkUuid" + + " and l2.virtualNetworkId = :virtualNetworkId" + + " and l2.physicalInterface = :physicalInterface" + + " and ref.clusterUuid in (:clusterUuids)" + + " and l2.type = 'L2VlanNetwork'") + .param("virtualNetworkId", msg.getVlan()) + .param("physicalInterface", l2.getPhysicalInterface()) + .param("clusterUuids", attachedClusters).list(); + } else { + l2s = SQL.New("select l2" + + " from L2NetworkVO l2, L2NetworkClusterRefVO ref, SystemTagVO tag" + + " where l2.uuid = ref.l2NetworkUuid" + + " and l2.virtualNetworkId = :virtualNetworkId" + + " and l2.physicalInterface = :physicalInterface" + + " and ref.clusterUuid in (:clusterUuids)" + + " and l2.type = 'L2VlanNetwork'" + + " and tag.resourceUuid=l2.uuid " + + " and tag.resourceType='L2NetworkVO' " + + " and tag.tag=:tag") + .param("virtualNetworkId", msg.getVlan()) + .param("physicalInterface", l2.getPhysicalInterface()) + .param("tag", L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.instantiateTag( + map(e(L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN, sdnControllerUuid)))) + .param("clusterUuids", attachedClusters).list(); + } l2s = l2s.stream().filter(l -> !l.getUuid().equals(msg.getUuid())).collect(Collectors.toList()); if (!l2s.isEmpty()) { throw new ApiMessageInterceptionException(argerr("There has been a l2Network attached to cluster with virtual network id[%s] and physical interface[%s]. Failed to change L2 network[uuid:%s]", @@ -172,14 +196,31 @@ private void validate(APIChangeL2NetworkVlanIdMsg msg) { } List attachedClusters = l2.getAttachedClusterRefs().stream() .map(L2NetworkClusterRefVO::getClusterUuid).collect(Collectors.toList()); - List l2s = SQL.New("select l2" + - " from L2NetworkVO l2, L2NetworkClusterRefVO ref" + - " where l2.uuid = ref.l2NetworkUuid" + - " and l2.physicalInterface = :physicalInterface" + - " and ref.clusterUuid in (:clusterUuids)" + - " and type = 'L2NoVlanNetwork'") - .param("physicalInterface", l2.getPhysicalInterface()) - .param("clusterUuids", attachedClusters).list(); + List l2s; + if (sdnControllerUuid != null) { + l2s = SQL.New("select l2" + + " from L2NetworkVO l2, L2NetworkClusterRefVO ref, SystemTagVO tag" + + " where l2.uuid = ref.l2NetworkUuid" + + " and l2.physicalInterface = :physicalInterface" + + " and ref.clusterUuid in (:clusterUuids)" + + " and l2.type = 'L2NoVlanNetwork'" + + " and tag.resourceUuid=l2.uuid " + + " and tag.resourceType='L2NetworkVO' " + + " and tag.tag=:tag") + .param("physicalInterface", l2.getPhysicalInterface()) + .param("tag", L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.instantiateTag( + map(e(L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN, sdnControllerUuid)))) + .param("clusterUuids", attachedClusters).list(); + } else { + l2s = SQL.New("select l2" + + " from L2NetworkVO l2, L2NetworkClusterRefVO ref" + + " where l2.uuid = ref.l2NetworkUuid" + + " and l2.physicalInterface = :physicalInterface" + + " and ref.clusterUuid in (:clusterUuids)" + + " and l2.type = 'L2NoVlanNetwork'") + .param("physicalInterface", l2.getPhysicalInterface()) + .param("clusterUuids", attachedClusters).list(); + } l2s = l2s.stream().filter(l -> !l.getUuid().equals(msg.getUuid())).collect(Collectors.toList()); if (!l2s.isEmpty()) { throw new ApiMessageInterceptionException(argerr("There has been a l2Network attached to cluster that has physical interface[%s]. Failed to change l2Network[uuid:%s]", diff --git a/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java b/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java index c3449db0145..6adceecec88 100755 --- a/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java +++ b/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java @@ -50,6 +50,8 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.*; +import static org.zstack.utils.CollectionDSL.e; +import static org.zstack.utils.CollectionDSL.map; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class L2NoVlanNetwork implements L2Network { @@ -935,14 +937,30 @@ private void attachL2NetworkToCluster(final AttachL2NetworkToClusterMsg msg, fi protected void scripts() { String type = Q.New(L2NetworkVO.class).select(L2NetworkVO_.type).eq(L2NetworkVO_.uuid, msg.getL2NetworkUuid()).findValue(); - + String sdnControllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID + .getTokenByResourceUuid(msg.getL2NetworkUuid(), L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); if (L2NetworkConstant.L2_NO_VLAN_NETWORK_TYPE.equals(type)) { - List l2s = SQL.New("select l2" + - " from L2NetworkVO l2, L2NetworkClusterRefVO ref" + - " where l2.uuid = ref.l2NetworkUuid" + - " and ref.clusterUuid = :clusterUuid" + - " and type = 'L2NoVlanNetwork'") - .param("clusterUuid", msg.getClusterUuid()).list(); + List l2s; + if (sdnControllerUuid == null) { + l2s = SQL.New("select l2" + + " from L2NetworkVO l2, L2NetworkClusterRefVO ref" + + " where l2.uuid = ref.l2NetworkUuid" + + " and ref.clusterUuid = :clusterUuid" + + " and type = 'L2NoVlanNetwork'") + .param("clusterUuid", msg.getClusterUuid()).list(); + } else { + l2s = SQL.New("select l2" + + " from L2NetworkVO l2, L2NetworkClusterRefVO ref, SystemTagVO tag" + + " where l2.uuid = ref.l2NetworkUuid" + + " and ref.clusterUuid = :clusterUuid" + + " and l2.type = 'L2NoVlanNetwork'" + + " and tag.resourceUuid=l2.uuid " + + " and tag.resourceType='L2NetworkVO' " + + " and tag.tag=:tag") + .param("tag", L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.instantiateTag( + map(e(L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN, sdnControllerUuid)))) + .param("clusterUuid", msg.getClusterUuid()).list(); + } if (l2s.isEmpty()) { return; @@ -956,11 +974,26 @@ protected void scripts() { } } } else if (L2NetworkConstant.L2_VLAN_NETWORK_TYPE.equals(type)) { - List l2s = SQL.New("select l2" + - " from L2VlanNetworkVO l2, L2NetworkClusterRefVO ref" + - " where l2.uuid = ref.l2NetworkUuid" + - " and ref.clusterUuid = :clusterUuid") - .param("clusterUuid", msg.getClusterUuid()).list(); + List l2s; + if (sdnControllerUuid == null) { + l2s = SQL.New("select l2" + + " from L2VlanNetworkVO l2, L2NetworkClusterRefVO ref" + + " where l2.uuid = ref.l2NetworkUuid" + + " and ref.clusterUuid = :clusterUuid") + .param("clusterUuid", msg.getClusterUuid()).list(); + } else { + l2s = SQL.New("select l2" + + " from L2VlanNetworkVO l2, L2NetworkClusterRefVO ref, SystemTagVO tag" + + " where l2.uuid = ref.l2NetworkUuid" + + " and ref.clusterUuid = :clusterUuid" + + " and tag.resourceUuid=l2.uuid " + + " and tag.resourceType='L2NetworkVO' " + + " and tag.tag=:tag") + .param("tag", L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.instantiateTag( + map(e(L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN, sdnControllerUuid)))) + .param("clusterUuid", msg.getClusterUuid()).list(); + } + if (l2s.isEmpty()) { return; } diff --git a/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java b/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java index 19b9e530a59..4b12079e6e7 100755 --- a/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java +++ b/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java @@ -13,7 +13,6 @@ import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.*; import org.zstack.core.db.SimpleQuery.Op; -import org.zstack.core.defer.Defer; import org.zstack.core.defer.Deferred; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.core.retry.Retry; @@ -42,6 +41,7 @@ import org.zstack.header.network.l2.L2NetworkConstant; import org.zstack.header.network.l2.L2NetworkVO; import org.zstack.header.network.l3.*; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.network.service.*; import org.zstack.identity.AccountManager; import org.zstack.network.service.NetworkServiceManager; @@ -62,10 +62,8 @@ import javax.persistence.Tuple; import java.math.BigInteger; import java.util.*; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import static org.codehaus.groovy.runtime.InvokerHelper.asList; import static org.zstack.core.Platform.err; import static org.zstack.utils.CollectionDSL.*; @@ -262,36 +260,28 @@ public void run(IpRangeDeletionExtensionPoint arg) { @Override public void run(FlowTrigger trigger, Map data) { - boolean isLastIpRange = isLastNormalIpRangeOfVersion(msg.getIpRangeUuid(), inv.getIpVersion()); - data.put("isLastIpRange", isLastIpRange); - - if (!self.enableIpAddressAllocation()) { - trigger.next(); - return; - } - - SdnControllerDhcp sdnDhcp = l3NwMgr.getSdnControllerDhcp(self.getUuid()); - if (sdnDhcp == null) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(self.getUuid()); + if (sdnControllerUuid == null) { trigger.next(); return; } - if (isLastIpRange) { - sdnDhcp.disableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(self)), inv.getIpVersion(), - new Completion(trigger) { - @Override - public void success() { - trigger.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - trigger.fail(errorCode); - } - }); - } else { - trigger.next(); - } + SdnControllerDisableDHCPMsg msg = new SdnControllerDisableDHCPMsg(); + msg.setL3NetworkUuid(self.getUuid()); + msg.setIpVersion(iprvo.getIpVersion()); + msg.setSdnControllerUuid(sdnControllerUuid); + msg.setCheckIpRange(true); + bus.makeTargetServiceIdByResourceUuid(msg, SdnControllerConstant.SERVICE_ID, sdnControllerUuid); + bus.send(msg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + } else { + trigger.next(); + } + } + }); } }).then(new NoRollbackFlow() { String __name__ = "delete-ip-range"; @@ -304,7 +294,7 @@ public void run(FlowTrigger trigger, Map data) { return; } - boolean isLastIpRange = (boolean) data.get("isLastIpRange"); + boolean isLastIpRange = isLastNormalIpRangeOfVersion(msg.getIpRangeUuid(), inv.getIpVersion()); if (isLastIpRange) { sdnL3.deleteIpRange(inv, new Completion(trigger) { @Override @@ -1237,31 +1227,29 @@ public void run(FlowTrigger trigger, Map data) { @Override public void run(FlowTrigger trigger, Map data) { - if (!self.enableIpAddressAllocation()) { - trigger.next(); - return; - } - - if (sdnDhcp == null) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(self.getUuid()); + if (sdnControllerUuid == null) { trigger.next(); return; } - List iprs = IpRangeHelper.getNormalIpRanges(self); - if (iprs.isEmpty()) { - trigger.next(); - return; + SdnControllerUpdateDHCPMsg dmsg = new SdnControllerUpdateDHCPMsg(); + if (NetworkUtils.isIpv4Address(msg.getDns())) { + dmsg.setIpVersion(IPv6Constants.IPv4); + } else { + dmsg.setIpVersion(IPv6Constants.IPv6); } - - sdnDhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(self)), new Completion(trigger) { + dmsg.setL3NetworkUuid(self.getUuid()); + dmsg.setSdnControllerUuid(sdnControllerUuid); + bus.makeTargetServiceIdByResourceUuid(dmsg, SdnControllerConstant.SERVICE_ID, sdnControllerUuid); + bus.send(dmsg, new CloudBusCallBack(trigger) { @Override - public void success() { - trigger.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - trigger.fail(errorCode); + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + } else { + trigger.next(); + } } }); } @@ -1355,31 +1343,29 @@ public void rollback(FlowRollback trigger, Map data) { @Override public void run(FlowTrigger trigger, Map data) { - if (!self.enableIpAddressAllocation()) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(self.getUuid()); + if (sdnControllerUuid == null) { trigger.next(); return; } - if (sdnDhcp == null) { - trigger.next(); - return; - } - - List iprs = IpRangeHelper.getNormalIpRanges(self); - if (iprs.isEmpty()) { - trigger.next(); - return; + SdnControllerUpdateDHCPMsg dmsg = new SdnControllerUpdateDHCPMsg(); + if (NetworkUtils.isIpv4Address(msg.getDns())) { + dmsg.setIpVersion(IPv6Constants.IPv4); + } else { + dmsg.setIpVersion(IPv6Constants.IPv6); } - - sdnDhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(self)), new Completion(trigger) { - @Override - public void success() { - trigger.next(); - } - + dmsg.setL3NetworkUuid(self.getUuid()); + dmsg.setSdnControllerUuid(sdnControllerUuid); + bus.makeTargetServiceIdByResourceUuid(dmsg, SdnControllerConstant.SERVICE_ID, sdnControllerUuid); + bus.send(dmsg, new CloudBusCallBack(trigger) { @Override - public void fail(ErrorCode errorCode) { - trigger.fail(errorCode); + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + } else { + trigger.next(); + } } }); } diff --git a/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java b/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java index 7c1ee6da361..80ba293281b 100755 --- a/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java +++ b/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java @@ -36,7 +36,9 @@ import org.zstack.header.network.l3.datatypes.IpCapacityData; import org.zstack.header.network.service.GetSdnControllerExtensionPoint; import org.zstack.header.network.service.SdnControllerDhcp; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.vm.VmNicInventory; + import org.zstack.header.vm.VmNicVO; import org.zstack.header.vm.VmNicVO_; import org.zstack.header.zone.ZoneVO; @@ -53,7 +55,6 @@ import org.zstack.utils.ExceptionDSL; import org.zstack.utils.ObjectUtils; import org.zstack.utils.Utils; -import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; import org.zstack.utils.network.IPv6Constants; import org.zstack.utils.network.IPv6NetworkUtils; @@ -65,7 +66,6 @@ import java.math.BigInteger; import java.util.*; import java.util.concurrent.Callable; -import java.util.stream.Collectors; import static org.zstack.core.Platform.err; import static org.zstack.utils.CollectionDSL.*; @@ -157,38 +157,29 @@ private void handle(final APISetL3NetworkMtuMsg msg) { ); creator.create(); - L3NetworkVO l3Vo = dbf.findByUuid(msg.getL3NetworkUuid(), L3NetworkVO.class); FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); chain.setName("change-l3-network-mtu"); chain.then(new NoRollbackFlow() { @Override public void run(FlowTrigger trigger, Map data) { - if (!l3Vo.enableIpAddressAllocation()) { - trigger.next(); - return; - } - - SdnControllerDhcp dhcp = getSdnControllerDhcp(msg.getL3NetworkUuid()); - if (dhcp == null) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(msg.getL3NetworkUuid()); + if (sdnControllerUuid == null) { trigger.next(); return; } - List iprs = IpRangeHelper.getNormalIpRanges(l3Vo); - if (iprs.isEmpty()) { - trigger.next(); - return; - } - - dhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(l3Vo)), new Completion(trigger) { + SdnControllerUpdateDHCPMsg dmsg = new SdnControllerUpdateDHCPMsg(); + dmsg.setL3NetworkUuid(msg.getL3NetworkUuid()); + dmsg.setSdnControllerUuid(sdnControllerUuid); + bus.makeTargetServiceIdByResourceUuid(dmsg, SdnControllerConstant.SERVICE_ID, sdnControllerUuid); + bus.send(dmsg, new CloudBusCallBack(trigger) { @Override - public void success() { - trigger.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - trigger.fail(errorCode); + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + } else { + trigger.next(); + } } }); } diff --git a/network/src/main/java/org/zstack/network/l3/NormalIpRangeFactory.java b/network/src/main/java/org/zstack/network/l3/NormalIpRangeFactory.java index b27778e644a..6b7d70d45eb 100644 --- a/network/src/main/java/org/zstack/network/l3/NormalIpRangeFactory.java +++ b/network/src/main/java/org/zstack/network/l3/NormalIpRangeFactory.java @@ -1,30 +1,31 @@ package org.zstack.network.l3; import org.springframework.beans.factory.annotation.Autowired; -import org.zstack.core.asyncbatch.While; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.componentloader.PluginRegistry; + import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.core.db.SQLBatchWithReturn; import org.zstack.core.workflow.SimpleFlowChain; import org.zstack.header.core.Completion; -import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.core.ReturnValueCompletion; -import org.zstack.header.core.WhileDoneCompletion; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; -import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.message.APICreateMessage; +import org.zstack.header.message.MessageReply; import org.zstack.header.network.l3.*; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.network.service.SdnControllerDhcp; import org.zstack.utils.CollectionUtils; + import org.zstack.utils.function.ForEachFunction; import org.zstack.utils.network.IPv6Constants; import org.zstack.utils.network.IPv6NetworkUtils; import org.zstack.utils.network.NetworkUtils; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Map; @@ -35,6 +36,9 @@ public class NormalIpRangeFactory implements IpRangeFactory { protected PluginRegistry pluginRgty; @Autowired protected L3NetworkManager l3Mgr; + @Autowired + private CloudBus bus; + @Override public IpRangeType getType() { @@ -113,27 +117,25 @@ public void rollback(FlowRollback trigger, Map data) { @Override public void run(FlowTrigger trigger, Map data) { - L3NetworkVO l3vo = dbf.findByUuid(iprs.get(0).getL3NetworkUuid(), L3NetworkVO.class); - if (!l3vo.enableIpAddressAllocation()) { - trigger.next(); - return; - } - - SdnControllerDhcp sdnDhcp = l3Mgr.getSdnControllerDhcp(l3vo.getUuid()); - if (sdnDhcp == null) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(iprs.get(0).getL3NetworkUuid()); + if (sdnControllerUuid == null) { trigger.next(); return; } - sdnDhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(l3vo)), new Completion(trigger) { + SdnControllerUpdateDHCPMsg dmsg = new SdnControllerUpdateDHCPMsg(); + dmsg.setL3NetworkUuid(iprs.get(0).getL3NetworkUuid()); + dmsg.setIpVersion(iprs.get(0).getIpVersion()); + dmsg.setSdnControllerUuid(sdnControllerUuid); + bus.makeTargetServiceIdByResourceUuid(dmsg, SdnControllerConstant.SERVICE_ID, sdnControllerUuid); + bus.send(dmsg, new CloudBusCallBack(trigger) { @Override - public void success() { - trigger.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - trigger.fail(errorCode); + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + } else { + trigger.next(); + } } }); } diff --git a/network/src/main/java/org/zstack/network/service/DhcpExtension.java b/network/src/main/java/org/zstack/network/service/DhcpExtension.java index 0dfbb39c1a5..90e78646d59 100755 --- a/network/src/main/java/org/zstack/network/service/DhcpExtension.java +++ b/network/src/main/java/org/zstack/network/service/DhcpExtension.java @@ -2,8 +2,11 @@ import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.Q; + import org.zstack.core.db.SimpleQuery; import org.zstack.core.db.SimpleQuery.Op; import org.zstack.header.Component; @@ -12,11 +15,16 @@ import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.network.l3.*; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.network.service.*; import org.zstack.header.vm.*; +import org.zstack.header.message.MessageReply; + import org.zstack.header.vm.VmInstanceSpec.HostName; import org.zstack.network.l3.IpRangeHelper; import org.zstack.network.l3.L3NetworkGlobalConfig; +import org.zstack.network.l3.L3NetworkHelper; + import org.zstack.network.l3.L3NetworkManager; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; @@ -43,6 +51,9 @@ public class DhcpExtension extends AbstractNetworkServiceExtension implements Co private PluginRegistry pluginRgty; @Autowired private L3NetworkManager l3Mgr; + @Autowired + private CloudBus bus; + private final Map dhcpBackends = new HashMap(); @@ -395,15 +406,22 @@ public void fail(ErrorCode errorCode) { @Override public void enableNetworkService(L3NetworkVO l3VO, NetworkServiceProviderType providerType, List systemTags, Completion completion) { - SdnControllerDhcp sdnDhcp = l3Mgr.getSdnControllerDhcp(l3VO.getUuid()); - if (sdnDhcp != null) { - List normalIpRange = IpRangeHelper.getNormalIpRanges(l3VO); - if (normalIpRange.isEmpty()) { - completion.success(); - return; - } - - sdnDhcp.allocateDhcpAndEnableDhcp(l3VO, systemTags, completion); + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(l3VO.getUuid()); + if (sdnControllerUuid != null) { + SdnControllerEnableDHCPMsg msg = new SdnControllerEnableDHCPMsg(); + msg.setL3NetworkUuid(l3VO.getUuid()); + msg.setSdnControllerUuid(sdnControllerUuid); + bus.makeTargetServiceIdByResourceUuid(msg, SdnControllerConstant.SERVICE_ID, sdnControllerUuid); + bus.send(msg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + completion.fail(reply.getError()); + } else { + completion.success(); + } + } + }); return; } @@ -418,15 +436,22 @@ public void enableNetworkService(L3NetworkVO l3VO, NetworkServiceProviderType pr @Override public void disableNetworkService(L3NetworkVO l3VO, NetworkServiceProviderType providerType, Completion completion) { - SdnControllerDhcp sdnDhcp = l3Mgr.getSdnControllerDhcp(l3VO.getUuid()); - if (sdnDhcp != null) { - List normalIpRange = IpRangeHelper.getNormalIpRanges(l3VO); - if (normalIpRange.isEmpty()) { - completion.success(); - return; - } - - sdnDhcp.disableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(l3VO)), IPv6Constants.DUAL_STACK, completion); + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(l3VO.getUuid()); + if (sdnControllerUuid != null) { + SdnControllerDisableDHCPMsg msg = new SdnControllerDisableDHCPMsg(); + msg.setL3NetworkUuid(l3VO.getUuid()); + msg.setSdnControllerUuid(sdnControllerUuid); + bus.makeTargetServiceIdByResourceUuid(msg, SdnControllerConstant.SERVICE_ID, sdnControllerUuid); + bus.send(msg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + completion.fail(reply.getError()); + } else { + completion.success(); + } + } + }); return; } diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmBase.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmBase.java index 6f3f6e09242..8d039b0e697 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmBase.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmBase.java @@ -96,7 +96,7 @@ protected List createBootstrapFlows(HypervisorType hvType) { return flows; } - protected List createAfterConnectNewCreatedVirtualRouterFlows() { + protected List createAfterConnectNewCreatedFlows() { return new ArrayList<>(); } @@ -796,8 +796,8 @@ private FlowChain addBootstrapFlows(FlowChain chain, HypervisorType hvType) { return chain; } - private FlowChain addAfterConnectNewCreatedVirtualRouterFlows(FlowChain chain) { - for (Flow flow : createAfterConnectNewCreatedVirtualRouterFlows()) { + private FlowChain addAfterConnectNewCreatedFlows(FlowChain chain) { + for (Flow flow : createAfterConnectNewCreatedFlows()) { chain.then(flow); } @@ -836,7 +836,7 @@ public void run(FlowTrigger trigger, Map data) { } }); - addAfterConnectNewCreatedVirtualRouterFlows(chain); + addAfterConnectNewCreatedFlows(chain); boolean noRollbackOnFailure = ApplianceVmGlobalProperty.NO_ROLLBACK_ON_POST_FAILURE; chain.noRollback(noRollbackOnFailure); @@ -960,7 +960,7 @@ public void run(FlowTrigger trigger, Map data) { } }); - addAfterConnectNewCreatedVirtualRouterFlows(chain); + addAfterConnectNewCreatedFlows(chain); } boolean noRollbackOnFailure = ApplianceVmGlobalProperty.NO_ROLLBACK_ON_POST_FAILURE; diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacadeImpl.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacadeImpl.java index 871479f13ac..4f760dde458 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacadeImpl.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacadeImpl.java @@ -648,6 +648,7 @@ public void attachApplianceVmToHaGroup(String vmUuid, String haGroupUuid) { } } + @Override public void detachVirtualRouterFromHaGroup(String vmUuid, String haGroupUuid) { for (ApplianceVmHaExtensionPoint ext : pluginRgty.getExtensionList(ApplianceVmHaExtensionPoint.class)) { ext.detachVirtualRouterFromHaGroup(vmUuid, haGroupUuid); diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmHaStatus.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmHaStatus.java index 99a1fd4c7c7..9fdf9da37cd 100644 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmHaStatus.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmHaStatus.java @@ -3,5 +3,6 @@ public enum ApplianceVmHaStatus { NoHa, Master, - Backup + Backup, + Fault } diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmInventoryDoc_zh_cn.groovy b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmInventoryDoc_zh_cn.groovy index 18d5a20dbf9..f8bce85f6b0 100644 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmInventoryDoc_zh_cn.groovy +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmInventoryDoc_zh_cn.groovy @@ -43,6 +43,12 @@ doc { type "Integer" since "0.6" } + field { + name "haStatus" + desc "" + type "String" + since "5.4.2" + } field { name "uuid" desc "资源的UUID,唯一标示该资源" @@ -109,6 +115,12 @@ doc { type "String" since "0.6" } + field { + name "architecture" + desc "" + type "String" + since "5.4.2" + } field { name "defaultL3NetworkUuid" desc "" @@ -133,6 +145,12 @@ doc { type "Long" since "0.6" } + field { + name "reservedMemorySize" + desc "" + type "Long" + since "5.4.2" + } field { name "cpuNum" desc "" @@ -185,4 +203,10 @@ doc { since "0.6" clz VolumeInventory.class } + field { + name "guestOsType" + desc "" + type "String" + since "5.4.2" + } } diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmSubTypeFactory.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmSubTypeFactory.java index 0f4a9d892f6..b0bc0470c7a 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmSubTypeFactory.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmSubTypeFactory.java @@ -10,4 +10,6 @@ public interface ApplianceVmSubTypeFactory { ApplianceVmVO persistApplianceVm(ApplianceVmSpec spec, ApplianceVmVO apvm); void removeApplianceVm(ApplianceVmSpec spec, ApplianceVmVO apvm); + + default void createApplianceNicSpec(ApplianceVmSpec spec) {} } diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java index 2300f17cae2..7daff5e7b4f 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java @@ -39,7 +39,11 @@ import org.zstack.header.network.l2.L2NetworkInventory; import org.zstack.header.network.l2.L2NetworkVO; import org.zstack.header.network.l3.*; +import org.zstack.header.network.l3.SdnControllerUpdateDHCPMsg; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.network.service.*; +import org.zstack.network.l3.L3NetworkHelper; + import org.zstack.header.vm.*; import org.zstack.header.vm.VmAbnormalLifeCycleStruct.VmAbnormalLifeCycleOperation; import org.zstack.identity.AccountManager; @@ -363,21 +367,24 @@ public void fail(ErrorCode errorCode) { @Override public void run(FlowTrigger trigger, Map data) { - if (sdnDhcp == null) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(l3VO.getUuid()); + if (sdnControllerUuid == null) { trigger.next(); return; } - sdnDhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(l3VO)), - new Completion(trigger) { + SdnControllerUpdateDHCPMsg dmsg = new SdnControllerUpdateDHCPMsg(); + dmsg.setL3NetworkUuid(l3VO.getUuid()); + dmsg.setSdnControllerUuid(sdnControllerUuid); + bus.makeTargetServiceIdByResourceUuid(dmsg, SdnControllerConstant.SERVICE_ID, sdnControllerUuid); + bus.send(dmsg, new CloudBusCallBack(trigger) { @Override - public void success() { - trigger.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - trigger.fail(errorCode); + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + } else { + trigger.next(); + } } }); } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index 606a572b25a..cf977cf23df 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -1,6 +1,7 @@ package org.zstack.kvm; import com.fasterxml.jackson.annotation.JsonAnySetter; +import org.jetbrains.annotations.NotNull; import org.zstack.core.upgrade.GrayUpgradeAgent; import org.zstack.core.upgrade.GrayVersion; import org.zstack.core.validation.ConditionalValidation; @@ -2309,6 +2310,9 @@ public static class StartVmCmd extends vdiCmd implements VmAddOnsCmd { @GrayVersion(value = "5.0.0") private List oemStrings = new ArrayList<>(); + @GrayVersion(value = "5.4.0") + private Long HostMinimumFreeMemorySize; + // TODO: only for test @GrayVersion(value = "5.0.0") private boolean useColoBinary; @@ -2888,6 +2892,14 @@ public String getVmCpuVendorId() { public void setVmCpuVendorId(String vmCpuVendorId) { this.vmCpuVendorId = vmCpuVendorId; } + + public Long getHostMinimumFreeMemorySize() { + return HostMinimumFreeMemorySize; + } + + public void setHostMinimumFreeMemorySize(Long hostMinimumFreeMemorySize) { + HostMinimumFreeMemorySize = hostMinimumFreeMemorySize; + } } public static class StartVmResponse extends VmDevicesInfoResponse { @@ -4880,14 +4892,28 @@ public static class OvsAddPortCmd extends AgentCommand { public Boolean reInstall; @GrayVersion(value = "5.4.0") public Map nicMap = new HashMap<>(); + @GrayVersion(value = "5.4.0") + public Map nicVmInstanceUuidMap = new HashMap<>(); } public static class OvsAddPortRsp extends AgentResponse { } + public static class OvsSyncPortCmd extends AgentCommand { + @GrayVersion(value = "5.4.0") + public String vSwitchType; + @GrayVersion(value = "5.4.0") + public Map nicMap = new HashMap<>(); + @GrayVersion(value = "5.4.0") + public String vmUuid; + } + + public static class OvsSyncPortRsp extends AgentResponse { + } + public static class OvsDelPortCmd extends AgentCommand { @GrayVersion(value = "5.4.0") - public String vswitchType; + public String vSwitchType; @GrayVersion(value = "5.4.0") public Map nicMap = new HashMap<>(); } @@ -4895,6 +4921,55 @@ public static class OvsDelPortCmd extends AgentCommand { public static class OvsDelPortRsp extends AgentResponse { } + public static class OvsSetDbConnectionCmd extends AgentCommand { + @GrayVersion(value = "5.5.0") + public boolean refreshCache; + @GrayVersion(value = "5.5.0") + public List nodes; + } + + public static class OvsSetDbConnectionRsp extends AgentResponse { + } + + public static class OvsCheckPortCmd extends AgentCommand { + @GrayVersion(value = "5.4.0") + public String vSwitchType; + // TODO: only for test + @GrayVersion(value = "5.4.0") + public String hostUuid; + } + + public static class OvsCheckPortRsp extends AgentResponse { + //vm uuid to all of its nics in the ovs bridge of the host + @GrayVersion(value = "5.4.0") + public Map> vmNicsMap = new HashMap<>(); + //vnic name to vm uuid map + @GrayVersion(value = "5.4.0") + public Map vnicVmMap = new HashMap<>(); + @GrayVersion(value = "5.4.0") + public Map> lspRequestedChassisMap = new HashMap<>(); + } + + public static class OvsSetRequestedChassisCmd extends AgentCommand { + @GrayVersion(value = "5.4.0") + public String vSwitchType; + @GrayVersion(value = "5.4.0") + public Map> lspRequestedChassisMap = new HashMap<>(); + } + + public static class OvsSetRequestedChassisRsp extends AgentResponse {} + + public static class OvsSyncVmPortsCmd extends AgentCommand { + @GrayVersion(value = "5.4.0") + public String vSwitchType; + @GrayVersion(value = "5.4.0") + public Map nicVmInstanceUuidMap = new HashMap<>(); + @GrayVersion(value = "5.4.0") + public Map nicNamePciAddressMap = new HashMap<>(); + @GrayVersion(value = "5.4.0") + public Map nicNameDriverMap = new HashMap<>(); + } + public static class HardwareMonitorCmd extends KVMAgentCommands.AgentCommand { } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java index f8a224c3151..1b2df9f8f2a 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java @@ -41,7 +41,11 @@ public interface KVMConstant { String KVM_START_OVS_SERVICE_PATH = "/network/ovn/start"; String KVM_STOP_OVS_SERVICE_PATH = "/network/ovn/stop"; String KVM_OVS_ADD_PORT_PATH = "/network/ovn/addport"; + String KVM_OVS_SYNC_PORT_PATH = "/network/ovn/syncports"; String KVM_OVS_DEL_PORT_PATH = "/network/ovn/delport"; + String KVM_OVS_SET_DB_CONNECTION_PATH = "/network/ovn/controller/setConnection"; + String KVM_OVS_CHECK_LOCAL_PORT_PATH = "/network/ovn/checklocalport"; + String KVM_OVS_SET_REQUESTED_CHASSIS_PATH = "/network/ovn/setrequestedchassis"; String KVM_ATTACH_ISO_PATH = "/vm/iso/attach"; String KVM_DETACH_ISO_PATH = "/vm/iso/detach"; String KVM_SYNC_VM_DEVICEINFO_PATH = "/sync/vm/deviceinfo"; diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalConfig.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalConfig.java index aa0fd787bed..f4691e6fb0c 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalConfig.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalConfig.java @@ -140,4 +140,9 @@ public class KVMGlobalConfig { @GlobalConfigValidation public static GlobalConfig KVMAGENT_PHYSICAL_MEMORY_USAGE_HARD_LIMIT = new GlobalConfig(CATEGORY, "kvmagent.physicalmemory.usage.hardlimit"); + + @GlobalConfigDef(defaultValue = "0G", description = "minimum free memory size to start vm, size in GB") + @BindResourceConfig({HostVO.class, ClusterVO.class}) + public static GlobalConfig MINIMUM_MEMORY_SIZE_BEFORE_START_VM = new GlobalConfig(CATEGORY, "min.free.memory.size"); + } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index bf29073a460..c82a8ba8aee 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -4366,6 +4366,27 @@ protected void startVm(final VmInstanceSpec spec, final NeedReplyMessage msg, fi cmd.setUseNuma(rcf.getResourceConfigValue(VmGlobalConfig.NUMA, spec.getVmInventory().getUuid(), Boolean.class)); setStartVmCpuTopology(spec, cmd, platform); + String value = KVMGlobalConfig.MINIMUM_MEMORY_SIZE_BEFORE_START_VM.value(); + value = value.toUpperCase(); + if (value.endsWith("GB")) { + value = value.substring(0, value.length() - 2); + } else if (value.endsWith("G")) { + value = value.substring(0, value.length() - 1); + } + + Long minMemSize = 0L; + try { + minMemSize = Long.parseLong(value); + // Convert GB to bytes (1GB = 1024 * 1024 * 1024 bytes) + minMemSize = minMemSize * 1024 * 1024 * 1024; + } catch (NumberFormatException e) { + logger.warn(String.format("Invalid memory size format: %s, using default", + KVMGlobalConfig.MINIMUM_MEMORY_SIZE_BEFORE_START_VM.value())); + } + if (minMemSize != 0L) { + cmd.setHostMinimumFreeMemorySize(minMemSize); + } + cmd.setImagePlatform(platform); cmd.setImageArchitecture(architecture); cmd.setVmName(spec.getVmInventory().getName()); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java index 741a99cdb70..a9caed4b7e6 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java @@ -15,9 +15,6 @@ import org.zstack.header.network.l3.L3NetworkVO; import org.zstack.header.network.l3.L3NetworkVO_; import org.zstack.header.network.sdncontroller.*; -import org.zstack.header.vm.APIAttachL3NetworkToVmMsg; -import org.zstack.header.vm.APIChangeVmNicNetworkMsg; -import org.zstack.header.vm.VmInstanceVO; import org.zstack.header.vm.VmNicVO; import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO_; @@ -61,8 +58,6 @@ public List getMessageClassToIntercept() { ret.add(APIAddVmNicToSecurityGroupMsg.class); ret.add(APISetVmNicSecurityGroupMsg.class); ret.add(APIAddSecurityGroupRuleMsg.class); - ret.add(APIAttachL3NetworkToVmMsg.class); - ret.add(APIChangeVmNicNetworkMsg.class); ret.add(APIPullSdnControllerTenantMsg.class); return ret; @@ -87,8 +82,6 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti validate((APISetVmNicSecurityGroupMsg) msg); } else if (msg instanceof APIAddSecurityGroupRuleMsg) { validate((APIAddSecurityGroupRuleMsg) msg); - } else if (msg instanceof APIChangeVmNicNetworkMsg) { - validate((APIChangeVmNicNetworkMsg) msg); } else if (msg instanceof APIPullSdnControllerTenantMsg) { validate((APIPullSdnControllerTenantMsg) msg); } else if (msg instanceof APIChangeSdnControllerMsg) { @@ -100,70 +93,6 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti return msg; } - private void validate(APIAttachL3NetworkToVmMsg msg) { - String sdnControlerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(msg.getL3NetworkUuid()); - if (sdnControlerUuid == null) { - return; - } - - SdnControllerVO controllerVO = dbf.findByUuid(sdnControlerUuid, SdnControllerVO.class); - if (controllerVO == null) { - throw new ApiMessageInterceptionException(argerr("could not attach l3network to vm, " + - "because sdn controller[uuid:%s] is not find", sdnControlerUuid)); - } - - if (SdnControllerConstant.H3C_VCFC_CONTROLLER.equals(controllerVO.getVendorType()) && - SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2.equals(controllerVO.getVendorVersion())) { - validateH3cTenantStatus(msg.getL3NetworkUuid(), sdnControlerUuid); - return; - } - - if (SdnControllerConstant.H3C_VCFC_CONTROLLER.equals(controllerVO.getVendorType())) { - return; - } - - VmInstanceVO vmVo = dbf.findByUuid(msg.getVmInstanceUuid(), VmInstanceVO.class); - boolean found = false; - for (SdnControllerHostRefVO ref : controllerVO.getHostRefVOS()) { - if (ref.getHostUuid().equals(vmVo.getHostUuid())) { - found = true; - break; - } - } - if (!found) { - throw new ApiMessageInterceptionException(argerr("could not attach l3network to vm, " + - "because host[uuid:%s] of vm is not attached to sdn controller[uuid:%s]", - vmVo.getHostUuid(), sdnControlerUuid)); - } - } - - private void validate(APIChangeVmNicNetworkMsg msg) { - String sdnControlerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(msg.getDestL3NetworkUuid()); - if (sdnControlerUuid == null) { - return; - } - - SdnControllerVO controllerVO = dbf.findByUuid(sdnControlerUuid, SdnControllerVO.class); - if (controllerVO == null) { - throw new ApiMessageInterceptionException(argerr("could not change vmnic to l3network[uuid:%s], " + - "because sdn controller[uuid:%s] is not find", msg.getDestL3NetworkUuid(), sdnControlerUuid)); - } - - VmInstanceVO vmVo = dbf.findByUuid(msg.getVmInstanceUuid(), VmInstanceVO.class); - boolean found = false; - for (SdnControllerHostRefVO ref : controllerVO.getHostRefVOS()) { - if (ref.getHostUuid().equals(vmVo.getHostUuid())) { - found = true; - break; - } - } - if (!found) { - throw new ApiMessageInterceptionException(argerr("could not change vmnic to l3network[uuid:%s], " + - "because host[uuid:%s] of vm is not attached to sdn controller[uuid:%s]", - msg.getDestL3NetworkUuid(), vmVo.getHostUuid(), sdnControlerUuid)); - } - } - private void validate(APISetVmNicSecurityGroupMsg msg) { VmNicVO nicVO = dbf.findByUuid(msg.getVmNicUuid(), VmNicVO.class); String nicControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(nicVO.getL3NetworkUuid()); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java index f4733f6a833..a193fded62a 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java @@ -126,12 +126,54 @@ public void handleMessage(SdnControllerMessage msg) { handle((PullSdnControllerTenantMsg) msg); } else if (msg instanceof ReconnectSdnControllerMsg) { handle((ReconnectSdnControllerMsg) msg); + } else if (msg instanceof SyncSdnControllerDataMsg) { + handle((SyncSdnControllerDataMsg) msg); } else { SdnController controller = getSdnController(); controller.handleMessage(msg); } } + private void handle(SyncSdnControllerDataMsg msg) { + SyncSdnControllerDataReply reply = new SyncSdnControllerDataReply(); + // Run a sync chain that only syncs data, without touching connection status + thdf.chainSubmit(new ChainTask(reply) { + @Override + public String getSyncSignature() { + return getSdnControllerSignature(); + } + + @Override + public void run(SyncTaskChain chain) { + FlowChain flowChain = sdnMgr.getSyncChain(self); + flowChain.getData().put(SDN_CONTROLLER_UUID, self.getUuid()); + flowChain.setName(String.format("sync-sdn-controller-data-%s-%s", self.getUuid(), self.getName())); + + // Start the chain; flows in factory-provided chain should perform data sync operations + flowChain.done(new FlowDoneHandler(msg) { + @Override + public void handle(Map data) { + bus.reply(msg, reply); + chain.next(); + } + }).error(new FlowErrorHandler(msg) { + @Override + public void handle(ErrorCode errCode, Map data) { + SyncSdnControllerDataReply r = new SyncSdnControllerDataReply(); + r.setError(errCode); + bus.reply(msg, r); + chain.next(); + } + }).start(); + } + + @Override + public String getName() { + return String.format("sync-sdn-controller-data-%s", self.getUuid()); + } + }); + } + public void changeSdnControllerStatus(SdnControllerStatus status) { if (status == self.getStatus()) { return; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java index c9e939b63f4..35bb7badead 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java @@ -637,6 +637,13 @@ public void preInstantiateVmResource(VmInstanceSpec spec, Completion completion) @Override public void preReleaseVmResource(VmInstanceSpec spec, Completion completion) { + // create/start/reboot vm failed, code will go here VmInstantiateResourcePreFlow.rollack() + // vm change image failed, + if (VmInstanceConstant.VmOperation.NewCreate != spec.getCurrentVmOperation()) { + completion.success(); + return; + } + if (spec.getL3Networks() == null || spec.getL3Networks().isEmpty()) { completion.success(); return; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java index f9afed355d9..9ac04a5f084 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java @@ -15,6 +15,7 @@ import org.zstack.header.message.Message; import org.zstack.header.network.l2.APICreateL2NetworkMsg; import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.network.l3.*; import org.zstack.header.network.sdncontroller.*; import org.zstack.header.rest.RESTFacade; import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; @@ -221,6 +222,12 @@ public void handle(ErrorCode errCode, Map data) { public void handleMessage(SdnControllerMessage msg) { if (msg instanceof SdnControllerPingMsg) { handle((SdnControllerPingMsg)msg); + } else if (msg instanceof SdnControllerEnableDHCPMsg) { + handle((SdnControllerEnableDHCPMsg) msg); + } else if (msg instanceof SdnControllerDisableDHCPMsg) { + handle((SdnControllerDisableDHCPMsg) msg); + } else if (msg instanceof SdnControllerUpdateDHCPMsg) { + handle((SdnControllerUpdateDHCPMsg) msg); } else { bus.dealWithUnknownMessage((Message) msg); } @@ -499,6 +506,21 @@ public void getH3cControllerToken(Completion completion) { } } + void handle(SdnControllerEnableDHCPMsg msg) { + SdnControllerEnableDHCPReply reply = new SdnControllerEnableDHCPReply(); + bus.reply(msg, reply); + } + + void handle(SdnControllerDisableDHCPMsg msg) { + SdnControllerDisableDHCPReply reply = new SdnControllerDisableDHCPReply(); + bus.reply(msg, reply); + } + + void handle(SdnControllerUpdateDHCPMsg msg) { + SdnControllerUpdateDHCPReply reply = new SdnControllerUpdateDHCPReply(); + bus.reply(msg, reply); + } + void handle(SdnControllerPingMsg msg) { SdnControllerPingReply reply = new SdnControllerPingReply(); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SyncSdnControllerDataMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SyncSdnControllerDataMsg.java new file mode 100644 index 00000000000..299d71867dc --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SyncSdnControllerDataMsg.java @@ -0,0 +1,22 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; + +public class SyncSdnControllerDataMsg extends NeedReplyMessage implements SdnControllerMessage { + private String controllerUuid; + + public String getControllerUuid() { + return controllerUuid; + } + + public void setControllerUuid(String controllerUuid) { + this.controllerUuid = controllerUuid; + } + + @Override + public String getSdnControllerUuid() { + return controllerUuid; + } +} + diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SyncSdnControllerDataReply.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SyncSdnControllerDataReply.java new file mode 100644 index 00000000000..eec719bfb59 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SyncSdnControllerDataReply.java @@ -0,0 +1,7 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.MessageReply; + +public class SyncSdnControllerDataReply extends MessageReply { +} + diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java index 45a68537e38..ebcf1433be3 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java @@ -56,7 +56,30 @@ public SugonSdnController(SdnControllerVO vo) { @Override public void handleMessage(SdnControllerMessage msg) { - bus.dealWithUnknownMessage((Message) msg); + if (msg instanceof SdnControllerEnableDHCPMsg) { + handMessage((SdnControllerEnableDHCPMsg) msg); + } else if (msg instanceof SdnControllerDisableDHCPMsg) { + handMessage((SdnControllerDisableDHCPMsg) msg); + } else if (msg instanceof SdnControllerUpdateDHCPMsg) { + handMessage((SdnControllerUpdateDHCPMsg) msg); + } else { + bus.dealWithUnknownMessage((Message) msg); + } + } + + void handMessage(SdnControllerEnableDHCPMsg msg) { + SdnControllerEnableDHCPReply reply = new SdnControllerEnableDHCPReply(); + bus.reply(msg, reply); + } + + void handMessage(SdnControllerDisableDHCPMsg msg) { + SdnControllerDisableDHCPReply reply = new SdnControllerDisableDHCPReply(); + bus.reply(msg, reply); + } + + void handMessage(SdnControllerUpdateDHCPMsg msg) { + SdnControllerUpdateDHCPReply reply = new SdnControllerUpdateDHCPReply(); + bus.reply(msg, reply); } @Override diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java index 32a4448b686..427a32cb6cb 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java @@ -141,7 +141,7 @@ protected FlowChain getProvisionConfigChain() { } @Override - protected List createAfterConnectNewCreatedVirtualRouterFlows() { + protected List createAfterConnectNewCreatedFlows() { List flows = new ArrayList<>(); flows.add(new TrackVirtualRouterVmFlow()); return flows; diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 665630290f1..4bbd9238f98 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -555,6 +555,7 @@ public class SourceClassMap { put("org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory", "org.zstack.sdk.L2VxlanNetworkInventory"); put("org.zstack.network.l2.vxlan.vxlanNetworkPool.L2VxlanNetworkPoolInventory", "org.zstack.sdk.L2VxlanNetworkPoolInventory"); put("org.zstack.network.l2.vxlan.vxlanNetworkPool.VniRangeInventory", "org.zstack.sdk.VniRangeInventory"); + put("org.zstack.network.ovn.OvnControllerInventory", "org.zstack.sdk.OvnControllerInventory"); put("org.zstack.network.ovn.OvnControllerVmInstanceInventory", "org.zstack.sdk.OvnControllerVmInstanceInventory"); put("org.zstack.network.ovn.OvnControllerVmOfferingInventory", "org.zstack.sdk.OvnControllerVmOfferingInventory"); put("org.zstack.network.securitygroup.SecurityGroupIngressRuleTO", "org.zstack.sdk.SecurityGroupIngressRuleTO"); @@ -564,6 +565,14 @@ public class SourceClassMap { put("org.zstack.network.securitygroup.VmNicSecurityPolicyInventory", "org.zstack.sdk.VmNicSecurityPolicyInventory"); put("org.zstack.network.service.eip.EipInventory", "org.zstack.sdk.EipInventory"); put("org.zstack.network.service.flat.IpStatisticData", "org.zstack.sdk.IpStatisticData"); + put("org.zstack.network.service.header.nfvinstgroup.NfvInstClusterStatus", "org.zstack.sdk.NfvInstClusterStatus"); + put("org.zstack.network.service.header.nfvinstgroup.NfvInstGroupConfigTaskInventory", "org.zstack.sdk.NfvInstGroupConfigTaskInventory"); + put("org.zstack.network.service.header.nfvinstgroup.NfvInstGroupConstants$FuncType", "org.zstack.sdk.FuncType"); + put("org.zstack.network.service.header.nfvinstgroup.NfvInstGroupConstants$InstType", "org.zstack.sdk.InstType"); + put("org.zstack.network.service.header.nfvinstgroup.NfvInstGroupOperationMode", "org.zstack.sdk.NfvInstGroupOperationMode"); + put("org.zstack.network.service.header.nfvinstgroup.NfvInstGroupStatus", "org.zstack.sdk.NfvInstGroupStatus"); + put("org.zstack.network.service.header.nfvinstgroup.NfvInstInventory", "org.zstack.sdk.NfvInstInventory"); + put("org.zstack.network.service.header.nfvinstgroup.NfvInstOfferingInventory", "org.zstack.sdk.NfvInstOfferingInventory"); put("org.zstack.network.service.lb.APIChangeAccessControlListServerGroupEvent$LoadBalancerListerAcl", "org.zstack.sdk.LoadBalancerListerAcl"); put("org.zstack.network.service.lb.CertificateInventory", "org.zstack.sdk.CertificateInventory"); put("org.zstack.network.service.lb.LoadBalancerInventory", "org.zstack.sdk.LoadBalancerInventory"); @@ -575,6 +584,10 @@ public class SourceClassMap { put("org.zstack.network.service.lb.LoadBalancerServerGroupInventory", "org.zstack.sdk.LoadBalancerServerGroupInventory"); put("org.zstack.network.service.lb.LoadBalancerServerGroupServerIpInventory", "org.zstack.sdk.LoadBalancerServerGroupServerIpInventory"); put("org.zstack.network.service.lb.LoadBalancerServerGroupVmNicRefInventory", "org.zstack.sdk.LoadBalancerServerGroupVmNicRefInventory"); + put("org.zstack.network.service.nfvinstgroup.NfvInstGroupInventory", "org.zstack.sdk.NfvInstGroupInventory"); + put("org.zstack.network.service.nfvinstgroup.NfvInstGroupL3NetworkRefInventory", "org.zstack.sdk.NfvInstGroupL3NetworkRefInventory"); + put("org.zstack.network.service.nfvinstgroup.NfvInstGroupMonitorIpInventory", "org.zstack.sdk.NfvInstGroupMonitorIpInventory"); + put("org.zstack.network.service.nfvinstgroup.NfvInstGroupNetworkServiceRefInventory", "org.zstack.sdk.NfvInstGroupNetworkServiceRefInventory"); put("org.zstack.network.service.portforwarding.PortForwardingRuleInventory", "org.zstack.sdk.PortForwardingRuleInventory"); put("org.zstack.network.service.slb.SlbGroupInventory", "org.zstack.sdk.SlbGroupInventory"); put("org.zstack.network.service.slb.SlbGroupL3NetworkRefInventory", "org.zstack.sdk.SlbGroupL3NetworkRefInventory"); @@ -1063,6 +1076,7 @@ public class SourceClassMap { put("org.zstack.sdk.FlowCounter", "org.zstack.header.flowMeter.FlowCounter"); put("org.zstack.sdk.FlowMeterInventory", "org.zstack.header.flowMeter.FlowMeterInventory"); put("org.zstack.sdk.FreeIpInventory", "org.zstack.header.network.l3.FreeIpInventory"); + put("org.zstack.sdk.FuncType", "org.zstack.network.service.header.nfvinstgroup.NfvInstGroupConstants$FuncType"); put("org.zstack.sdk.GarbageCollectorInventory", "org.zstack.core.gc.GarbageCollectorInventory"); put("org.zstack.sdk.GlobalConfigInventory", "org.zstack.core.config.GlobalConfigInventory"); put("org.zstack.sdk.GlobalConfigOptions", "org.zstack.core.config.GlobalConfigOptions"); @@ -1131,6 +1145,7 @@ public class SourceClassMap { put("org.zstack.sdk.InfoSecSecretResourcePoolInventory", "org.zstack.crypto.securitymachine.thirdparty.infoSec.InfoSecSecretResourcePoolInventory"); put("org.zstack.sdk.InfoSecSecurityMachineInventory", "org.zstack.crypto.securitymachine.thirdparty.infoSec.InfoSecSecurityMachineInventory"); put("org.zstack.sdk.InputType", "org.zstack.abstraction.OptionType$InputType"); + put("org.zstack.sdk.InstType", "org.zstack.network.service.header.nfvinstgroup.NfvInstGroupConstants$InstType"); put("org.zstack.sdk.InstallPathRecycleInventory", "org.zstack.header.core.trash.InstallPathRecycleInventory"); put("org.zstack.sdk.InstanceOfferingInventory", "org.zstack.header.configuration.InstanceOfferingInventory"); put("org.zstack.sdk.InvocationRecord", "org.zstack.guesttools.InvocationRecord"); @@ -1253,6 +1268,16 @@ public class SourceClassMap { put("org.zstack.sdk.NetworkRouterFlowMeterRefInventory", "org.zstack.header.flowMeter.NetworkRouterFlowMeterRefInventory"); put("org.zstack.sdk.NetworkServiceL3NetworkRefInventory", "org.zstack.header.network.service.NetworkServiceL3NetworkRefInventory"); put("org.zstack.sdk.NetworkServiceProviderInventory", "org.zstack.header.network.service.NetworkServiceProviderInventory"); + put("org.zstack.sdk.NfvInstClusterStatus", "org.zstack.network.service.header.nfvinstgroup.NfvInstClusterStatus"); + put("org.zstack.sdk.NfvInstGroupConfigTaskInventory", "org.zstack.network.service.header.nfvinstgroup.NfvInstGroupConfigTaskInventory"); + put("org.zstack.sdk.NfvInstGroupInventory", "org.zstack.network.service.nfvinstgroup.NfvInstGroupInventory"); + put("org.zstack.sdk.NfvInstGroupL3NetworkRefInventory", "org.zstack.network.service.nfvinstgroup.NfvInstGroupL3NetworkRefInventory"); + put("org.zstack.sdk.NfvInstGroupMonitorIpInventory", "org.zstack.network.service.nfvinstgroup.NfvInstGroupMonitorIpInventory"); + put("org.zstack.sdk.NfvInstGroupNetworkServiceRefInventory", "org.zstack.network.service.nfvinstgroup.NfvInstGroupNetworkServiceRefInventory"); + put("org.zstack.sdk.NfvInstGroupOperationMode", "org.zstack.network.service.header.nfvinstgroup.NfvInstGroupOperationMode"); + put("org.zstack.sdk.NfvInstGroupStatus", "org.zstack.network.service.header.nfvinstgroup.NfvInstGroupStatus"); + put("org.zstack.sdk.NfvInstInventory", "org.zstack.network.service.header.nfvinstgroup.NfvInstInventory"); + put("org.zstack.sdk.NfvInstOfferingInventory", "org.zstack.network.service.header.nfvinstgroup.NfvInstOfferingInventory"); put("org.zstack.sdk.NginxRedirectRule", "org.zstack.ai.NginxRedirectRule"); put("org.zstack.sdk.NicTO", "org.zstack.kvm.KVMAgentCommands$NicTO"); put("org.zstack.sdk.NormalIpRangeInventory", "org.zstack.header.network.l3.NormalIpRangeInventory"); @@ -1279,6 +1304,7 @@ public class SourceClassMap { put("org.zstack.sdk.OvfOSInfo", "org.zstack.ovf.datatype.OvfOSInfo"); put("org.zstack.sdk.OvfSystemInfo", "org.zstack.ovf.datatype.OvfSystemInfo"); put("org.zstack.sdk.OvfVolumeInfo", "org.zstack.ovf.datatype.OvfVolumeInfo"); + put("org.zstack.sdk.OvnControllerInventory", "org.zstack.network.ovn.OvnControllerInventory"); put("org.zstack.sdk.OvnControllerVmInstanceInventory", "org.zstack.network.ovn.OvnControllerVmInstanceInventory"); put("org.zstack.sdk.OvnControllerVmOfferingInventory", "org.zstack.network.ovn.OvnControllerVmOfferingInventory"); put("org.zstack.sdk.PacketsForwardType", "org.zstack.vpcfirewall.entity.PacketsForwardType"); diff --git a/sdk/src/main/java/org/zstack/sdk/AddL3NetworkToGroupAction.java b/sdk/src/main/java/org/zstack/sdk/AddL3NetworkToGroupAction.java new file mode 100644 index 00000000000..6debe676630 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddL3NetworkToGroupAction.java @@ -0,0 +1,110 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class AddL3NetworkToGroupAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.AddL3NetworkToGroupResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String nfvInstGroupUuid; + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String networkServiceUuid; + + @Param(required = true, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String frontEndL3NetworkUuid; + + @Param(required = true, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.util.List backendL3NetworkUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.AddL3NetworkToGroupResult value = res.getResult(org.zstack.sdk.AddL3NetworkToGroupResult.class); + ret.value = value == null ? new org.zstack.sdk.AddL3NetworkToGroupResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/nfvinstgroup/group/{nfvInstGroupUuid}/service/{networkServiceUuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AddL3NetworkToGroupResult.java b/sdk/src/main/java/org/zstack/sdk/AddL3NetworkToGroupResult.java new file mode 100644 index 00000000000..1978cd77ee1 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddL3NetworkToGroupResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class AddL3NetworkToGroupResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AttachNfvInstToGroupAction.java b/sdk/src/main/java/org/zstack/sdk/AttachNfvInstToGroupAction.java new file mode 100644 index 00000000000..fd8e59ca2d8 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AttachNfvInstToGroupAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class AttachNfvInstToGroupAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.AttachNfvInstToGroupResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String groupUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String nfvInstUuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.AttachNfvInstToGroupResult value = res.getResult(org.zstack.sdk.AttachNfvInstToGroupResult.class); + ret.value = value == null ? new org.zstack.sdk.AttachNfvInstToGroupResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/nfvinstgroup/group/{groupUuid}/instances/{nfvInstUuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "attachNfvInstToGroup"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AttachNfvInstToGroupResult.java b/sdk/src/main/java/org/zstack/sdk/AttachNfvInstToGroupResult.java new file mode 100644 index 00000000000..06f1ad1a31a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AttachNfvInstToGroupResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.NfvInstGroupInventory; + +public class AttachNfvInstToGroupResult { + public NfvInstGroupInventory inventory; + public void setInventory(NfvInstGroupInventory inventory) { + this.inventory = inventory; + } + public NfvInstGroupInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeNfvInstGroupOperationModeAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeNfvInstGroupOperationModeAction.java new file mode 100644 index 00000000000..216987116a1 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ChangeNfvInstGroupOperationModeAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class ChangeNfvInstGroupOperationModeAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.ChangeNfvInstGroupOperationModeResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = true, validValues = {"Normal","Maintenance"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String operationMode; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.ChangeNfvInstGroupOperationModeResult value = res.getResult(org.zstack.sdk.ChangeNfvInstGroupOperationModeResult.class); + ret.value = value == null ? new org.zstack.sdk.ChangeNfvInstGroupOperationModeResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/nfvinstgroup/group/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "changeNfvInstGroupOperationMode"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeNfvInstGroupOperationModeResult.java b/sdk/src/main/java/org/zstack/sdk/ChangeNfvInstGroupOperationModeResult.java new file mode 100644 index 00000000000..85478533422 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ChangeNfvInstGroupOperationModeResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.NfvInstGroupInventory; + +public class ChangeNfvInstGroupOperationModeResult { + public NfvInstGroupInventory inventory; + public void setInventory(NfvInstGroupInventory inventory) { + this.inventory = inventory; + } + public NfvInstGroupInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateNfvInstAction.java b/sdk/src/main/java/org/zstack/sdk/CreateNfvInstAction.java new file mode 100644 index 00000000000..c120ee97ece --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateNfvInstAction.java @@ -0,0 +1,122 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateNfvInstAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.CreateNfvInstResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String nfvInstGroupUuid; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clusterUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.CreateNfvInstResult value = res.getResult(org.zstack.sdk.CreateNfvInstResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateNfvInstResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/nfvinstgroup/inst"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateNfvInstGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateNfvInstGroupAction.java new file mode 100644 index 00000000000..3055d319f1b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateNfvInstGroupAction.java @@ -0,0 +1,152 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateNfvInstGroupAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.CreateNfvInstGroupResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = true, validValues = {"KVM"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String instType; + + @Param(required = true, validValues = {"DEDICATED_SLB","OVN_SDN_CONTROLLER"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String funcType; + + @Param(required = false, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.util.List monitorIps; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String nfvInstOfferingUuid; + + @Param(required = false, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String frontEndL3NetworkUuid; + + @Param(required = false, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.util.List backendL3NetworkUuids; + + @Param(required = false, maxLength = 128, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String netOsDistro; + + @Param(required = false, maxLength = 128, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String baseOsDistro; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vipUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ipv6VipUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String primaryStorageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String primaryStoragePoolUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clusterUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.CreateNfvInstGroupResult value = res.getResult(org.zstack.sdk.CreateNfvInstGroupResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateNfvInstGroupResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/nfvinstgroup/group"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateNfvInstGroupResult.java b/sdk/src/main/java/org/zstack/sdk/CreateNfvInstGroupResult.java new file mode 100644 index 00000000000..906a8779478 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateNfvInstGroupResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.NfvInstGroupInventory; + +public class CreateNfvInstGroupResult { + public NfvInstGroupInventory inventory; + public void setInventory(NfvInstGroupInventory inventory) { + this.inventory = inventory; + } + public NfvInstGroupInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateNfvInstOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/CreateNfvInstOfferingAction.java new file mode 100644 index 00000000000..33267766ff5 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateNfvInstOfferingAction.java @@ -0,0 +1,137 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateNfvInstOfferingAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.CreateInstanceOfferingResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String managementNetworkUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String imageUuid; + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {1L,1024L}, noTrim = false) + public int cpuNum = 0; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {1L,9223372036854775807L}, numberRangeUnit = {"byte", "bytes"}, noTrim = false) + public long memorySize = 0L; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {0L,9223372036854775807L}, numberRangeUnit = {"byte", "bytes"}, noTrim = false) + public long reservedMemorySize = 0L; + + @Param(required = false) + public java.lang.String allocatorStrategy; + + @Param(required = false) + public int sortKey = 0; + + @Param(required = false) + public java.lang.String type; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.CreateInstanceOfferingResult value = res.getResult(org.zstack.sdk.CreateInstanceOfferingResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateInstanceOfferingResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/instance-offerings/nfvinst"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateNfvInstResult.java b/sdk/src/main/java/org/zstack/sdk/CreateNfvInstResult.java new file mode 100644 index 00000000000..adf8ae3f1ad --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateNfvInstResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.NfvInstInventory; + +public class CreateNfvInstResult { + public NfvInstInventory inventory; + public void setInventory(NfvInstInventory inventory) { + this.inventory = inventory; + } + public NfvInstInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteNfvInstGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteNfvInstGroupAction.java new file mode 100644 index 00000000000..87d07827ae4 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteNfvInstGroupAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteNfvInstGroupAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DeleteNfvInstGroupResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DeleteNfvInstGroupResult value = res.getResult(org.zstack.sdk.DeleteNfvInstGroupResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteNfvInstGroupResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/nfvinstgroup/group/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteNfvInstGroupResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteNfvInstGroupResult.java new file mode 100644 index 00000000000..f453cb866a2 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteNfvInstGroupResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteNfvInstGroupResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DetachNfvInstFromGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DetachNfvInstFromGroupAction.java new file mode 100644 index 00000000000..06a5eaebc71 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DetachNfvInstFromGroupAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DetachNfvInstFromGroupAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.DetachNfvInstFromGroupResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String groupUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String nfvInstUuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.DetachNfvInstFromGroupResult value = res.getResult(org.zstack.sdk.DetachNfvInstFromGroupResult.class); + ret.value = value == null ? new org.zstack.sdk.DetachNfvInstFromGroupResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/nfvinstgroup/group/{groupUuid}/instances/{nfvInstUuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "detachNfvInstFromGroup"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DetachNfvInstFromGroupResult.java b/sdk/src/main/java/org/zstack/sdk/DetachNfvInstFromGroupResult.java new file mode 100644 index 00000000000..677e4585133 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DetachNfvInstFromGroupResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.NfvInstGroupInventory; + +public class DetachNfvInstFromGroupResult { + public NfvInstGroupInventory inventory; + public void setInventory(NfvInstGroupInventory inventory) { + this.inventory = inventory; + } + public NfvInstGroupInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/FuncType.java b/sdk/src/main/java/org/zstack/sdk/FuncType.java new file mode 100644 index 00000000000..51c1cd4f5d7 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/FuncType.java @@ -0,0 +1,5 @@ +package org.zstack.sdk; + +public enum FuncType { + OVN_SDN_CONTROLLER, +} diff --git a/sdk/src/main/java/org/zstack/sdk/InstType.java b/sdk/src/main/java/org/zstack/sdk/InstType.java new file mode 100644 index 00000000000..401d988a3bd --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/InstType.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + +public enum InstType { + KVM, + CONTAINER, + HOST, +} diff --git a/sdk/src/main/java/org/zstack/sdk/NfvInstClusterStatus.java b/sdk/src/main/java/org/zstack/sdk/NfvInstClusterStatus.java new file mode 100644 index 00000000000..f0964862707 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/NfvInstClusterStatus.java @@ -0,0 +1,12 @@ +package org.zstack.sdk; + +public enum NfvInstClusterStatus { + Follower, + Candidate, + Leader, + Joining, + Leaving, + Unknown, + Available, + Unavailable, +} diff --git a/sdk/src/main/java/org/zstack/sdk/NfvInstGroupConfigTaskInventory.java b/sdk/src/main/java/org/zstack/sdk/NfvInstGroupConfigTaskInventory.java new file mode 100644 index 00000000000..eb1ef267ed6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/NfvInstGroupConfigTaskInventory.java @@ -0,0 +1,71 @@ +package org.zstack.sdk; + + + +public class NfvInstGroupConfigTaskInventory { + + public long id; + public void setId(long id) { + this.id = id; + } + public long getId() { + return this.id; + } + + public java.lang.String nfvInstGroupUuid; + public void setNfvInstGroupUuid(java.lang.String nfvInstGroupUuid) { + this.nfvInstGroupUuid = nfvInstGroupUuid; + } + public java.lang.String getNfvInstGroupUuid() { + return this.nfvInstGroupUuid; + } + + public int configVersion; + public void setConfigVersion(int configVersion) { + this.configVersion = configVersion; + } + public int getConfigVersion() { + return this.configVersion; + } + + public java.lang.String serviceUuid; + public void setServiceUuid(java.lang.String serviceUuid) { + this.serviceUuid = serviceUuid; + } + public java.lang.String getServiceUuid() { + return this.serviceUuid; + } + + public java.lang.String taskName; + public void setTaskName(java.lang.String taskName) { + this.taskName = taskName; + } + public java.lang.String getTaskName() { + return this.taskName; + } + + public java.lang.String taskData; + public void setTaskData(java.lang.String taskData) { + this.taskData = taskData; + } + public java.lang.String getTaskData() { + return this.taskData; + } + + public java.lang.String path; + public void setPath(java.lang.String path) { + this.path = path; + } + public java.lang.String getPath() { + return this.path; + } + + public boolean checkStatus; + public void setCheckStatus(boolean checkStatus) { + this.checkStatus = checkStatus; + } + public boolean getCheckStatus() { + return this.checkStatus; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/NfvInstGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/NfvInstGroupInventory.java new file mode 100644 index 00000000000..ff44f5c5e32 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/NfvInstGroupInventory.java @@ -0,0 +1,210 @@ +package org.zstack.sdk; + +import org.zstack.sdk.InstType; +import org.zstack.sdk.FuncType; +import org.zstack.sdk.NfvInstGroupStatus; +import org.zstack.sdk.NfvInstGroupOperationMode; + +public class NfvInstGroupInventory { + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public java.lang.String nfvInstOfferingUuid; + public void setNfvInstOfferingUuid(java.lang.String nfvInstOfferingUuid) { + this.nfvInstOfferingUuid = nfvInstOfferingUuid; + } + public java.lang.String getNfvInstOfferingUuid() { + return this.nfvInstOfferingUuid; + } + + public InstType instType; + public void setInstType(InstType instType) { + this.instType = instType; + } + public InstType getInstType() { + return this.instType; + } + + public FuncType funcType; + public void setFuncType(FuncType funcType) { + this.funcType = funcType; + } + public FuncType getFuncType() { + return this.funcType; + } + + public int configVersion; + public void setConfigVersion(int configVersion) { + this.configVersion = configVersion; + } + public int getConfigVersion() { + return this.configVersion; + } + + public java.lang.String netOsDistro; + public void setNetOsDistro(java.lang.String netOsDistro) { + this.netOsDistro = netOsDistro; + } + public java.lang.String getNetOsDistro() { + return this.netOsDistro; + } + + public java.lang.String baseOsDistro; + public void setBaseOsDistro(java.lang.String baseOsDistro) { + this.baseOsDistro = baseOsDistro; + } + public java.lang.String getBaseOsDistro() { + return this.baseOsDistro; + } + + public NfvInstGroupStatus status; + public void setStatus(NfvInstGroupStatus status) { + this.status = status; + } + public NfvInstGroupStatus getStatus() { + return this.status; + } + + public java.lang.String statusDetail; + public void setStatusDetail(java.lang.String statusDetail) { + this.statusDetail = statusDetail; + } + public java.lang.String getStatusDetail() { + return this.statusDetail; + } + + public NfvInstGroupOperationMode operationMode; + public void setOperationMode(NfvInstGroupOperationMode operationMode) { + this.operationMode = operationMode; + } + public NfvInstGroupOperationMode getOperationMode() { + return this.operationMode; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + + public java.util.List instances; + public void setInstances(java.util.List instances) { + this.instances = instances; + } + public java.util.List getInstances() { + return this.instances; + } + + public java.util.List monitors; + public void setMonitors(java.util.List monitors) { + this.monitors = monitors; + } + public java.util.List getMonitors() { + return this.monitors; + } + + public java.util.List services; + public void setServices(java.util.List services) { + this.services = services; + } + public java.util.List getServices() { + return this.services; + } + + public java.util.List configTasks; + public void setConfigTasks(java.util.List configTasks) { + this.configTasks = configTasks; + } + public java.util.List getConfigTasks() { + return this.configTasks; + } + + public java.util.List l3Networks; + public void setL3Networks(java.util.List l3Networks) { + this.l3Networks = l3Networks; + } + public java.util.List getL3Networks() { + return this.l3Networks; + } + + public java.lang.String vipUuid; + public void setVipUuid(java.lang.String vipUuid) { + this.vipUuid = vipUuid; + } + public java.lang.String getVipUuid() { + return this.vipUuid; + } + + public java.lang.String ipv6VipUuid; + public void setIpv6VipUuid(java.lang.String ipv6VipUuid) { + this.ipv6VipUuid = ipv6VipUuid; + } + public java.lang.String getIpv6VipUuid() { + return this.ipv6VipUuid; + } + + public java.lang.String primaryStorageUuid; + public void setPrimaryStorageUuid(java.lang.String primaryStorageUuid) { + this.primaryStorageUuid = primaryStorageUuid; + } + public java.lang.String getPrimaryStorageUuid() { + return this.primaryStorageUuid; + } + + public java.lang.String primaryStoragePoolUuid; + public void setPrimaryStoragePoolUuid(java.lang.String primaryStoragePoolUuid) { + this.primaryStoragePoolUuid = primaryStoragePoolUuid; + } + public java.lang.String getPrimaryStoragePoolUuid() { + return this.primaryStoragePoolUuid; + } + + public java.lang.String clusterUuid; + public void setClusterUuid(java.lang.String clusterUuid) { + this.clusterUuid = clusterUuid; + } + public java.lang.String getClusterUuid() { + return this.clusterUuid; + } + + public java.lang.String zoneUuid; + public void setZoneUuid(java.lang.String zoneUuid) { + this.zoneUuid = zoneUuid; + } + public java.lang.String getZoneUuid() { + return this.zoneUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/NfvInstGroupL3NetworkRefInventory.java b/sdk/src/main/java/org/zstack/sdk/NfvInstGroupL3NetworkRefInventory.java new file mode 100644 index 00000000000..803c948a30c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/NfvInstGroupL3NetworkRefInventory.java @@ -0,0 +1,71 @@ +package org.zstack.sdk; + + + +public class NfvInstGroupL3NetworkRefInventory { + + public java.lang.String nfvInstGroupUuid; + public void setNfvInstGroupUuid(java.lang.String nfvInstGroupUuid) { + this.nfvInstGroupUuid = nfvInstGroupUuid; + } + public java.lang.String getNfvInstGroupUuid() { + return this.nfvInstGroupUuid; + } + + public java.lang.String networkServiceUuid; + public void setNetworkServiceUuid(java.lang.String networkServiceUuid) { + this.networkServiceUuid = networkServiceUuid; + } + public java.lang.String getNetworkServiceUuid() { + return this.networkServiceUuid; + } + + public java.lang.String l3NetworkUuid; + public void setL3NetworkUuid(java.lang.String l3NetworkUuid) { + this.l3NetworkUuid = l3NetworkUuid; + } + public java.lang.String getL3NetworkUuid() { + return this.l3NetworkUuid; + } + + public java.lang.String l3NetworkCategory; + public void setL3NetworkCategory(java.lang.String l3NetworkCategory) { + this.l3NetworkCategory = l3NetworkCategory; + } + public java.lang.String getL3NetworkCategory() { + return this.l3NetworkCategory; + } + + public java.lang.String l3NetworkType; + public void setL3NetworkType(java.lang.String l3NetworkType) { + this.l3NetworkType = l3NetworkType; + } + public java.lang.String getL3NetworkType() { + return this.l3NetworkType; + } + + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/NfvInstGroupMonitorIpInventory.java b/sdk/src/main/java/org/zstack/sdk/NfvInstGroupMonitorIpInventory.java new file mode 100644 index 00000000000..d6fe52906a0 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/NfvInstGroupMonitorIpInventory.java @@ -0,0 +1,47 @@ +package org.zstack.sdk; + + + +public class NfvInstGroupMonitorIpInventory { + + public java.lang.Long id; + public void setId(java.lang.Long id) { + this.id = id; + } + public java.lang.Long getId() { + return this.id; + } + + public java.lang.String nfvInstGroupUuid; + public void setNfvInstGroupUuid(java.lang.String nfvInstGroupUuid) { + this.nfvInstGroupUuid = nfvInstGroupUuid; + } + public java.lang.String getNfvInstGroupUuid() { + return this.nfvInstGroupUuid; + } + + public java.lang.String monitorIp; + public void setMonitorIp(java.lang.String monitorIp) { + this.monitorIp = monitorIp; + } + public java.lang.String getMonitorIp() { + return this.monitorIp; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/NfvInstGroupNetworkServiceRefInventory.java b/sdk/src/main/java/org/zstack/sdk/NfvInstGroupNetworkServiceRefInventory.java new file mode 100644 index 00000000000..43b5a53c688 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/NfvInstGroupNetworkServiceRefInventory.java @@ -0,0 +1,55 @@ +package org.zstack.sdk; + + + +public class NfvInstGroupNetworkServiceRefInventory { + + public java.lang.Long id; + public void setId(java.lang.Long id) { + this.id = id; + } + public java.lang.Long getId() { + return this.id; + } + + public java.lang.String nfvInstGroupUuid; + public void setNfvInstGroupUuid(java.lang.String nfvInstGroupUuid) { + this.nfvInstGroupUuid = nfvInstGroupUuid; + } + public java.lang.String getNfvInstGroupUuid() { + return this.nfvInstGroupUuid; + } + + public java.lang.String networkServiceName; + public void setNetworkServiceName(java.lang.String networkServiceName) { + this.networkServiceName = networkServiceName; + } + public java.lang.String getNetworkServiceName() { + return this.networkServiceName; + } + + public java.lang.String networkServiceUuid; + public void setNetworkServiceUuid(java.lang.String networkServiceUuid) { + this.networkServiceUuid = networkServiceUuid; + } + public java.lang.String getNetworkServiceUuid() { + return this.networkServiceUuid; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/NfvInstGroupOperationMode.java b/sdk/src/main/java/org/zstack/sdk/NfvInstGroupOperationMode.java new file mode 100644 index 00000000000..1c692e49f1d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/NfvInstGroupOperationMode.java @@ -0,0 +1,6 @@ +package org.zstack.sdk; + +public enum NfvInstGroupOperationMode { + Normal, + Maintenance, +} diff --git a/sdk/src/main/java/org/zstack/sdk/NfvInstGroupStatus.java b/sdk/src/main/java/org/zstack/sdk/NfvInstGroupStatus.java new file mode 100644 index 00000000000..fc9c165afa3 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/NfvInstGroupStatus.java @@ -0,0 +1,9 @@ +package org.zstack.sdk; + +public enum NfvInstGroupStatus { + Initializing, + Healthy, + Degraded, + Operating, + Unavailable, +} diff --git a/sdk/src/main/java/org/zstack/sdk/NfvInstInventory.java b/sdk/src/main/java/org/zstack/sdk/NfvInstInventory.java new file mode 100644 index 00000000000..d84863093a1 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/NfvInstInventory.java @@ -0,0 +1,55 @@ +package org.zstack.sdk; + + + +public class NfvInstInventory extends org.zstack.sdk.ApplianceVmInventory { + + public int configVersion; + public void setConfigVersion(int configVersion) { + this.configVersion = configVersion; + } + public int getConfigVersion() { + return this.configVersion; + } + + public java.lang.String nfvInstGroupUuid; + public void setNfvInstGroupUuid(java.lang.String nfvInstGroupUuid) { + this.nfvInstGroupUuid = nfvInstGroupUuid; + } + public java.lang.String getNfvInstGroupUuid() { + return this.nfvInstGroupUuid; + } + + public java.lang.String netOsDistro; + public void setNetOsDistro(java.lang.String netOsDistro) { + this.netOsDistro = netOsDistro; + } + public java.lang.String getNetOsDistro() { + return this.netOsDistro; + } + + public java.lang.String baseOsDistro; + public void setBaseOsDistro(java.lang.String baseOsDistro) { + this.baseOsDistro = baseOsDistro; + } + public java.lang.String getBaseOsDistro() { + return this.baseOsDistro; + } + + public java.lang.String clusterStatus; + public void setClusterStatus(java.lang.String clusterStatus) { + this.clusterStatus = clusterStatus; + } + public java.lang.String getClusterStatus() { + return this.clusterStatus; + } + + public java.lang.String statusDetail; + public void setStatusDetail(java.lang.String statusDetail) { + this.statusDetail = statusDetail; + } + public java.lang.String getStatusDetail() { + return this.statusDetail; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/NfvInstOfferingInventory.java b/sdk/src/main/java/org/zstack/sdk/NfvInstOfferingInventory.java new file mode 100644 index 00000000000..42f92383fab --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/NfvInstOfferingInventory.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + + + +public class NfvInstOfferingInventory extends org.zstack.sdk.InstanceOfferingInventory { + + public java.lang.String managementNetworkUuid; + public void setManagementNetworkUuid(java.lang.String managementNetworkUuid) { + this.managementNetworkUuid = managementNetworkUuid; + } + public java.lang.String getManagementNetworkUuid() { + return this.managementNetworkUuid; + } + + public java.lang.String zoneUuid; + public void setZoneUuid(java.lang.String zoneUuid) { + this.zoneUuid = zoneUuid; + } + public java.lang.String getZoneUuid() { + return this.zoneUuid; + } + + public java.lang.String imageUuid; + public void setImageUuid(java.lang.String imageUuid) { + this.imageUuid = imageUuid; + } + public java.lang.String getImageUuid() { + return this.imageUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/OvnControllerInventory.java b/sdk/src/main/java/org/zstack/sdk/OvnControllerInventory.java new file mode 100644 index 00000000000..7b5a4d95046 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/OvnControllerInventory.java @@ -0,0 +1,15 @@ +package org.zstack.sdk; + + + +public class OvnControllerInventory extends org.zstack.sdk.SdnControllerInventory { + + public boolean remoteOvn; + public void setRemoteOvn(boolean remoteOvn) { + this.remoteOvn = remoteOvn; + } + public boolean getRemoteOvn() { + return this.remoteOvn; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/OvnControllerVmInstanceInventory.java b/sdk/src/main/java/org/zstack/sdk/OvnControllerVmInstanceInventory.java index 3a68e782b29..dcee2e7aafe 100644 --- a/sdk/src/main/java/org/zstack/sdk/OvnControllerVmInstanceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/OvnControllerVmInstanceInventory.java @@ -1,8 +1,24 @@ package org.zstack.sdk; +import org.zstack.sdk.NfvInstClusterStatus; +import org.zstack.sdk.NfvInstClusterStatus; +public class OvnControllerVmInstanceInventory extends org.zstack.sdk.NfvInstInventory { -public class OvnControllerVmInstanceInventory extends org.zstack.sdk.ApplianceVmInventory { + public NfvInstClusterStatus nbClusterStatus; + public void setNbClusterStatus(NfvInstClusterStatus nbClusterStatus) { + this.nbClusterStatus = nbClusterStatus; + } + public NfvInstClusterStatus getNbClusterStatus() { + return this.nbClusterStatus; + } + public NfvInstClusterStatus sbClusterStatus; + public void setSbClusterStatus(NfvInstClusterStatus sbClusterStatus) { + this.sbClusterStatus = sbClusterStatus; + } + public NfvInstClusterStatus getSbClusterStatus() { + return this.sbClusterStatus; + } } diff --git a/sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstConfigAction.java b/sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstConfigAction.java new file mode 100644 index 00000000000..700bce6a76c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstConfigAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class ProvisionNfvInstConfigAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.ProvisionNfvInstConfigResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmInstanceUuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.ProvisionNfvInstConfigResult value = res.getResult(org.zstack.sdk.ProvisionNfvInstConfigResult.class); + ret.value = value == null ? new org.zstack.sdk.ProvisionNfvInstConfigResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/vm-instances/appliances/nfvinst/{vmInstanceUuid}/provision"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "provisionNfvInstConfig"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstConfigResult.java b/sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstConfigResult.java new file mode 100644 index 00000000000..273aa074174 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstConfigResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ApplianceVmInventory; + +public class ProvisionNfvInstConfigResult { + public ApplianceVmInventory inventory; + public void setInventory(ApplianceVmInventory inventory) { + this.inventory = inventory; + } + public ApplianceVmInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstGroupAction.java b/sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstGroupAction.java new file mode 100644 index 00000000000..c26afa190f4 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstGroupAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class ProvisionNfvInstGroupAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.ProvisionNfvInstGroupResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.ProvisionNfvInstGroupResult value = res.getResult(org.zstack.sdk.ProvisionNfvInstGroupResult.class); + ret.value = value == null ? new org.zstack.sdk.ProvisionNfvInstGroupResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/nfvinstgroup/group/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "provisionNfvInstGroup"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstGroupResult.java b/sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstGroupResult.java new file mode 100644 index 00000000000..c73096795c1 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstGroupResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.NfvInstGroupInventory; + +public class ProvisionNfvInstGroupResult { + public NfvInstGroupInventory inventory; + public void setInventory(NfvInstGroupInventory inventory) { + this.inventory = inventory; + } + public NfvInstGroupInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNfvInstAction.java b/sdk/src/main/java/org/zstack/sdk/QueryNfvInstAction.java new file mode 100644 index 00000000000..99f1c66b110 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryNfvInstAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryNfvInstAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryNfvInstResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryNfvInstResult value = res.getResult(org.zstack.sdk.QueryNfvInstResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryNfvInstResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/vm-instances/appliances/nfvinst"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNfvInstGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryNfvInstGroupAction.java new file mode 100644 index 00000000000..a04db2a92dd --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryNfvInstGroupAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryNfvInstGroupAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryNfvInstGroupResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryNfvInstGroupResult value = res.getResult(org.zstack.sdk.QueryNfvInstGroupResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryNfvInstGroupResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/nfvinstgroup/group"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNfvInstGroupResult.java b/sdk/src/main/java/org/zstack/sdk/QueryNfvInstGroupResult.java new file mode 100644 index 00000000000..25fa3ebffa5 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryNfvInstGroupResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryNfvInstGroupResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNfvInstOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/QueryNfvInstOfferingAction.java new file mode 100644 index 00000000000..da56a1e225c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryNfvInstOfferingAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryNfvInstOfferingAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryNfvInstOfferingResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryNfvInstOfferingResult value = res.getResult(org.zstack.sdk.QueryNfvInstOfferingResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryNfvInstOfferingResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/instance-offerings/nfvinst"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNfvInstOfferingResult.java b/sdk/src/main/java/org/zstack/sdk/QueryNfvInstOfferingResult.java new file mode 100644 index 00000000000..544d8b36ed0 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryNfvInstOfferingResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryNfvInstOfferingResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNfvInstResult.java b/sdk/src/main/java/org/zstack/sdk/QueryNfvInstResult.java new file mode 100644 index 00000000000..361b8130fa4 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryNfvInstResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryNfvInstResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryOvnControllerAction.java b/sdk/src/main/java/org/zstack/sdk/QueryOvnControllerAction.java new file mode 100644 index 00000000000..8ced685f215 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryOvnControllerAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryOvnControllerAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryOvnControllerResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryOvnControllerResult value = res.getResult(org.zstack.sdk.QueryOvnControllerResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryOvnControllerResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/ovn-controllers"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryOvnControllerResult.java b/sdk/src/main/java/org/zstack/sdk/QueryOvnControllerResult.java new file mode 100644 index 00000000000..f146fb9042e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryOvnControllerResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryOvnControllerResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryOvnControllerVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryOvnControllerVmInstanceAction.java new file mode 100644 index 00000000000..46e2d887fb5 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryOvnControllerVmInstanceAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryOvnControllerVmInstanceAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryOvnControllerVmInstanceResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryOvnControllerVmInstanceResult value = res.getResult(org.zstack.sdk.QueryOvnControllerVmInstanceResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryOvnControllerVmInstanceResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/vm-instances/appliances/ovn-controller"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryOvnControllerVmInstanceResult.java b/sdk/src/main/java/org/zstack/sdk/QueryOvnControllerVmInstanceResult.java new file mode 100644 index 00000000000..f0051c0e6b4 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryOvnControllerVmInstanceResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryOvnControllerVmInstanceResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectNfvInstAction.java b/sdk/src/main/java/org/zstack/sdk/ReconnectNfvInstAction.java new file mode 100644 index 00000000000..47379eb43d9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectNfvInstAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class ReconnectNfvInstAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.ReconnectNfvInstResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmInstanceUuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.ReconnectNfvInstResult value = res.getResult(org.zstack.sdk.ReconnectNfvInstResult.class); + ret.value = value == null ? new org.zstack.sdk.ReconnectNfvInstResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/vm-instances/appliances/nfvinst/{vmInstanceUuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "reconnectNfvInst"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectNfvInstResult.java b/sdk/src/main/java/org/zstack/sdk/ReconnectNfvInstResult.java new file mode 100644 index 00000000000..74b0f10a6b9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectNfvInstResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ApplianceVmInventory; + +public class ReconnectNfvInstResult { + public ApplianceVmInventory inventory; + public void setInventory(ApplianceVmInventory inventory) { + this.inventory = inventory; + } + public ApplianceVmInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SyncNfvInstGroupAction.java b/sdk/src/main/java/org/zstack/sdk/SyncNfvInstGroupAction.java new file mode 100644 index 00000000000..0b6504ba3a8 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SyncNfvInstGroupAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class SyncNfvInstGroupAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.SyncNfvInstGroupResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.SyncNfvInstGroupResult value = res.getResult(org.zstack.sdk.SyncNfvInstGroupResult.class); + ret.value = value == null ? new org.zstack.sdk.SyncNfvInstGroupResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/nfvinstgroup/group/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "syncNfvInstGroup"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SyncNfvInstGroupResult.java b/sdk/src/main/java/org/zstack/sdk/SyncNfvInstGroupResult.java new file mode 100644 index 00000000000..3bf973cbc9d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SyncNfvInstGroupResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.NfvInstGroupInventory; + +public class SyncNfvInstGroupResult { + public NfvInstGroupInventory inventory; + public void setInventory(NfvInstGroupInventory inventory) { + this.inventory = inventory; + } + public NfvInstGroupInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateNfvInstGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateNfvInstGroupAction.java new file mode 100644 index 00000000000..a6bd5fbcf6a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateNfvInstGroupAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateNfvInstGroupAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UpdateNfvInstGroupResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UpdateNfvInstGroupResult value = res.getResult(org.zstack.sdk.UpdateNfvInstGroupResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateNfvInstGroupResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/nfvinstgroup/group/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateNfvInstGroup"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateNfvInstGroupResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateNfvInstGroupResult.java new file mode 100644 index 00000000000..b58ee147be7 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateNfvInstGroupResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.NfvInstGroupInventory; + +public class UpdateNfvInstGroupResult { + public NfvInstGroupInventory inventory; + public void setInventory(NfvInstGroupInventory inventory) { + this.inventory = inventory; + } + public NfvInstGroupInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateNfvInstProvisionConfigAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateNfvInstProvisionConfigAction.java new file mode 100644 index 00000000000..c89a64d662f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateNfvInstProvisionConfigAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateNfvInstProvisionConfigAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UpdateNfvInstProvisionConfigResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmInstanceUuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UpdateNfvInstProvisionConfigResult value = res.getResult(org.zstack.sdk.UpdateNfvInstProvisionConfigResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateNfvInstProvisionConfigResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/vm-instances/appliances/nfvinst/{vmInstanceUuid}/provision/update"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateNfvInstProvisionConfig"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateNfvInstProvisionConfigResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateNfvInstProvisionConfigResult.java new file mode 100644 index 00000000000..466ab13f06f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateNfvInstProvisionConfigResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ApplianceVmInventory; + +public class UpdateNfvInstProvisionConfigResult { + public ApplianceVmInventory inventory; + public void setInventory(ApplianceVmInventory inventory) { + this.inventory = inventory; + } + public ApplianceVmInventory getInventory() { + return this.inventory; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index deae4ea042c..745e26949e6 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -1853,6 +1853,33 @@ abstract class ApiHelper { } + def addL3NetworkToGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddL3NetworkToGroupAction.class) Closure c) { + def a = new org.zstack.sdk.AddL3NetworkToGroupAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def addLdapServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddLdapServerAction.class) Closure c) { def a = new org.zstack.sdk.AddLdapServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -3986,6 +4013,33 @@ abstract class ApiHelper { } + def attachNfvInstToGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AttachNfvInstToGroupAction.class) Closure c) { + def a = new org.zstack.sdk.AttachNfvInstToGroupAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def attachNicToBonding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AttachNicToBondingAction.class) Closure c) { def a = new org.zstack.sdk.AttachNicToBondingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -5957,6 +6011,33 @@ abstract class ApiHelper { } + def changeNfvInstGroupOperationMode(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ChangeNfvInstGroupOperationModeAction.class) Closure c) { + def a = new org.zstack.sdk.ChangeNfvInstGroupOperationModeAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def changePortForwardingRuleState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ChangePortForwardingRuleStateAction.class) Closure c) { def a = new org.zstack.sdk.ChangePortForwardingRuleStateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -10331,6 +10412,87 @@ abstract class ApiHelper { } + def createNfvInst(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateNfvInstAction.class) Closure c) { + def a = new org.zstack.sdk.CreateNfvInstAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def createNfvInstGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateNfvInstGroupAction.class) Closure c) { + def a = new org.zstack.sdk.CreateNfvInstGroupAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def createNfvInstOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateNfvInstOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.CreateNfvInstOfferingAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def createOAuthClient(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateOAuthClientAction.class) Closure c) { def a = new org.zstack.sdk.CreateOAuthClientAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -15677,6 +15839,33 @@ abstract class ApiHelper { } + def deleteNfvInstGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteNfvInstGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteNfvInstGroupAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def deleteNicQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteNicQosAction.class) Closure c) { def a = new org.zstack.sdk.DeleteNicQosAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -18647,6 +18836,33 @@ abstract class ApiHelper { } + def detachNfvInstFromGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachNfvInstFromGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DetachNfvInstFromGroupAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def detachNicFromBonding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachNicFromBondingAction.class) Closure c) { def a = new org.zstack.sdk.DetachNicFromBondingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -27854,6 +28070,60 @@ abstract class ApiHelper { } + def provisionNfvInstConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ProvisionNfvInstConfigAction.class) Closure c) { + def a = new org.zstack.sdk.ProvisionNfvInstConfigAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def provisionNfvInstGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ProvisionNfvInstGroupAction.class) Closure c) { + def a = new org.zstack.sdk.ProvisionNfvInstGroupAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def provisionSlbInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ProvisionSlbInstanceAction.class) Closure c) { def a = new org.zstack.sdk.ProvisionSlbInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -32919,6 +33189,93 @@ abstract class ApiHelper { } + def queryNfvInst(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNfvInstAction.class) Closure c) { + def a = new org.zstack.sdk.QueryNfvInstAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def queryNfvInstGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNfvInstGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryNfvInstGroupAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def queryNfvInstOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNfvInstOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.QueryNfvInstOfferingAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryNvmeLun(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNvmeLunAction.class) Closure c) { def a = new org.zstack.sdk.QueryNvmeLunAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -33035,6 +33392,64 @@ abstract class ApiHelper { } + def queryOvnController(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryOvnControllerAction.class) Closure c) { + def a = new org.zstack.sdk.QueryOvnControllerAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def queryOvnControllerVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryOvnControllerVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryOvnControllerVmInstanceAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def queryPciDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPciDeviceAction.class) Closure c) { def a = new org.zstack.sdk.QueryPciDeviceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -36692,6 +37107,33 @@ abstract class ApiHelper { } + def reconnectNfvInst(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectNfvInstAction.class) Closure c) { + def a = new org.zstack.sdk.ReconnectNfvInstAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def reconnectPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectPrimaryStorageAction.class) Closure c) { def a = new org.zstack.sdk.ReconnectPrimaryStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -41093,6 +41535,33 @@ abstract class ApiHelper { } + def syncNfvInstGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncNfvInstGroupAction.class) Closure c) { + def a = new org.zstack.sdk.SyncNfvInstGroupAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def syncPrimaryStorageCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncPrimaryStorageCapacityAction.class) Closure c) { def a = new org.zstack.sdk.SyncPrimaryStorageCapacityAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -45089,6 +45558,60 @@ abstract class ApiHelper { } + def updateNfvInstGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateNfvInstGroupAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateNfvInstGroupAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def updateNfvInstProvisionConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateNfvInstProvisionConfigAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateNfvInstProvisionConfigAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def updateOAuthClient(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateOAuthClientAction.class) Closure c) { def a = new org.zstack.sdk.UpdateOAuthClientAction() a.sessionId = Test.currentEnvSpec?.session?.uuid diff --git a/testlib/src/main/java/org/zstack/testlib/KVMSimulator.groovy b/testlib/src/main/java/org/zstack/testlib/KVMSimulator.groovy index 6e77c2dfeda..81bd88ac6bf 100755 --- a/testlib/src/main/java/org/zstack/testlib/KVMSimulator.groovy +++ b/testlib/src/main/java/org/zstack/testlib/KVMSimulator.groovy @@ -463,6 +463,22 @@ class KVMSimulator implements Simulator { return new KVMAgentCommands.AgentResponse() } + spec.simulator(KVMConstant.KVM_OVS_CHECK_LOCAL_PORT_PATH) { + return new KVMAgentCommands.OvsCheckPortRsp() + } + + spec.simulator(KVMConstant.KVM_OVS_SYNC_PORT_PATH) { + return new KVMAgentCommands.OvsSyncPortRsp() + } + + spec.simulator(KVMConstant.KVM_OVS_SET_REQUESTED_CHASSIS_PATH) { + return new KVMAgentCommands.OvsSetRequestedChassisRsp() + } + + spec.simulator(KVMConstant.KVM_OVS_SET_DB_CONNECTION_PATH) { + return new KVMAgentCommands.OvsSetDbConnectionRsp() + } + spec.simulator(KVMConstant.KVM_SYNC_VM_DEVICEINFO_PATH) { HttpEntity e -> SyncVmDeviceInfoCmd cmd = JSONObjectUtil.toObject(e.body, SyncVmDeviceInfoCmd.class) def rsp = new SyncVmDeviceInfoResponse() diff --git a/testlib/src/main/java/org/zstack/testlib/VipSpec.groovy b/testlib/src/main/java/org/zstack/testlib/VipSpec.groovy new file mode 100644 index 00000000000..8490372cdcb --- /dev/null +++ b/testlib/src/main/java/org/zstack/testlib/VipSpec.groovy @@ -0,0 +1,57 @@ +package org.zstack.testlib + +import org.zstack.sdk.VipInventory +import org.zstack.sdk.VmNicInventory + +/** + * Created by shixin.ruan on 2025/12/10. + */ +class VipSpec extends Spec implements HasSession { + @SpecParam(required = true) + String name + @SpecParam(required = true) + String l3NetworkUuid + @SpecParam + String description + @SpecParam + String requiredIp + + VipInventory inventory + + VipSpec(EnvSpec envSpec) { + super(envSpec) + } + + SpecID create(String uuid, String sessionId) { + inventory = createVip { + delegate.resourceUuid = uuid + delegate.name = name + delegate.l3NetworkUuid = l3NetworkUuid + delegate.description = description + delegate.requiredIp = requiredIp + delegate.userTags = userTags + delegate.systemTags = systemTags + delegate.sessionId = sessionId + } + + postCreate { + inventory = queryVip { + conditions=["uuid=${inventory.uuid}".toString()] + }[0] + } + + return id(name, inventory.uuid) + } + + @Override + void delete(String sessionId) { + if (inventory != null) { + deleteVip { + delegate.uuid = inventory.uuid + delegate.sessionId = sessionId + } + + inventory = null + } + } +} diff --git a/testlib/src/main/java/org/zstack/testlib/ZoneSpec.groovy b/testlib/src/main/java/org/zstack/testlib/ZoneSpec.groovy index 9d78316d8d4..0404637ddb1 100755 --- a/testlib/src/main/java/org/zstack/testlib/ZoneSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ZoneSpec.groovy @@ -139,6 +139,15 @@ class ZoneSpec extends Spec { return spec } + VipSpec vip(@DelegatesTo(strategy = Closure.DELEGATE_FIRST, value = VipSpec.class) Closure c) { + def spec = new VipSpec(envSpec) + c.delegate = spec + c.resolveStrategy = Closure.DELEGATE_FIRST + c() + addChild(spec) + return spec + } + EipSpec eip(@DelegatesTo(strategy = Closure.DELEGATE_FIRST, value = EipSpec.class) Closure c) { def spec = new EipSpec(envSpec) c.delegate = spec From 22cfe0429acd4ec95608e48676d8c33e50cfa2dd Mon Sep 17 00:00:00 2001 From: "zhong.xian" Date: Sun, 14 Dec 2025 21:01:19 +0800 Subject: [PATCH 655/737] [conf]: Add fields to ModelServiceInstance Add architecture and gpuVendor fields to ModelServiceInstance DBImpact Resolves: ZSTAC-75598 Change-Id: I796d627a746b6866766d76626b666c6168637774 --- conf/db/upgrade/V5.5.0__schema.sql | 3 +++ .../sdk/ModelServiceInstanceInventory.java | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/conf/db/upgrade/V5.5.0__schema.sql b/conf/db/upgrade/V5.5.0__schema.sql index e76e26d5d71..bb8bcdcf139 100644 --- a/conf/db/upgrade/V5.5.0__schema.sql +++ b/conf/db/upgrade/V5.5.0__schema.sql @@ -471,3 +471,6 @@ CREATE TABLE IF NOT EXISTS `OvnControllerVO` ( INSERT IGNORE INTO OvnControllerVO (uuid, remoteOvn) SELECT uuid, 0 FROM SdnControllerVO where vendorType = 'Ovn'; + +CALL ADD_COLUMN('ModelServiceInstanceVO', 'architecture', 'VARCHAR(32)', 1, NULL); +CALL ADD_COLUMN('ModelServiceInstanceVO', 'gpuVendor', 'VARCHAR(128)', 1, NULL); diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java index 13cf707f507..02ba10afbba 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java @@ -108,6 +108,22 @@ public java.lang.String getAccountUuid() { return this.accountUuid; } + public java.lang.String architecture; + public void setArchitecture(java.lang.String architecture) { + this.architecture = architecture; + } + public java.lang.String getArchitecture() { + return this.architecture; + } + + public java.lang.String gpuVendor; + public void setGpuVendor(java.lang.String gpuVendor) { + this.gpuVendor = gpuVendor; + } + public java.lang.String getGpuVendor() { + return this.gpuVendor; + } + public VmInstanceInventory vm; public void setVm(VmInstanceInventory vm) { this.vm = vm; From fbb2eaee5c41afe48fa92df496877409626d0ab9 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 22 Dec 2025 11:14:01 +0800 Subject: [PATCH 656/737] [conf]: Fix V5.4.6__schema.sql when upgrade templates - Fix default value of cpuArch when upgrade existing records - Set date to valid value to avoid zero date failed to start mn DBImpact Resolves: ZSTAC-80776 Change-Id: I6873776363706d6b76726679666d6c6663676d6e --- conf/db/upgrade/V5.4.6__schema.sql | 4 ++-- conf/db/upgrade/beforeValidate.sql | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/conf/db/upgrade/V5.4.6__schema.sql b/conf/db/upgrade/V5.4.6__schema.sql index c487fde82d6..17bc4ae92bf 100644 --- a/conf/db/upgrade/V5.4.6__schema.sql +++ b/conf/db/upgrade/V5.4.6__schema.sql @@ -291,8 +291,8 @@ BEGIN WHERE `modelServiceUuid` = service_uuid; SELECT CONCAT('INFO: Updated ModelServiceTemplateVO for service_uuid=', service_uuid, ', updated_rows=', ROW_COUNT()) AS msg; ELSE - INSERT INTO `zstack`.`ModelServiceTemplateVO` (`uuid`, `modelServiceUuid`, `pythonVersionSemver`, `cudaVersion`, `cannVersion`, `frameworkVersionSemver`, `gpuVendor`) - VALUES (REPLACE(UUID(),'-',''), service_uuid, py_version, cuda_version, cann_version, fw_version, gpu_vendor_name); + INSERT INTO `zstack`.`ModelServiceTemplateVO` (`uuid`, `modelServiceUuid`, `cpuArchitecture`, `pythonVersionSemver`, `cudaVersion`, `cannVersion`, `frameworkVersionSemver`, `gpuVendor`, `createDate`, `lastOpDate`) + VALUES (REPLACE(UUID(),'-',''), service_uuid, 'x86_64', py_version, cuda_version, cann_version, fw_version, gpu_vendor_name, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); SELECT CONCAT('INFO: Inserted ModelServiceTemplateVO for service_uuid=', service_uuid, ', inserted_rows=', ROW_COUNT()) AS msg; END IF; diff --git a/conf/db/upgrade/beforeValidate.sql b/conf/db/upgrade/beforeValidate.sql index 0de10ef5711..1f3cbfc36cc 100644 --- a/conf/db/upgrade/beforeValidate.sql +++ b/conf/db/upgrade/beforeValidate.sql @@ -39,6 +39,7 @@ BEGIN update `zstack`.`schema_version` set `checksum`=613548663 where `script`='V5.3.6__schema.sql' and `checksum` <> 613548663; update `zstack`.`schema_version` set `checksum`=1489363540 where `script`='V5.3.22__schema.sql' and `checksum` <> 1489363540; update `zstack`.`schema_version` set `checksum`=1648524318 where `script`='V4.4.0__schema.sql' and `checksum` <> 1648524318; + update `zstack`.`schema_version` set `checksum`=-1622195975 where `script`='V5.4.6__schema.sql' and `checksum` <> 1381616852; END IF; END $$ From 05eac88d5ce7b5f56cccfca6f3b6dcd6fc31e2f3 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Mon, 22 Dec 2025 14:29:05 +0800 Subject: [PATCH 657/737] [compute]: use console proxyip for mac address Resolves: ZSTAC-72279 Change-Id: I6f6e69736c7a6e63656479726f6e766263716776 --- .../main/java/org/zstack/compute/vm/MacOperator.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/compute/src/main/java/org/zstack/compute/vm/MacOperator.java b/compute/src/main/java/org/zstack/compute/vm/MacOperator.java index 5d500f451b5..113ea410f66 100644 --- a/compute/src/main/java/org/zstack/compute/vm/MacOperator.java +++ b/compute/src/main/java/org/zstack/compute/vm/MacOperator.java @@ -2,9 +2,7 @@ import com.google.common.collect.Lists; import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.zstack.core.Platform; -import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.CoreGlobalProperty; import org.zstack.core.db.Q; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.network.l3.L3NetworkVO; @@ -142,8 +140,8 @@ public static String generateMacWithDeviceId(short deviceId) { } public static String generateMacWithDeviceIdIp(short deviceId) { - String mgtIp = Platform.getManagementServerIp(); - if (!NetworkUtils.isIpv4Address(mgtIp)) { + String consoleProxyIp = CoreGlobalProperty.CONSOLE_PROXY_OVERRIDDEN_IP;//Platform.getManagementServerIp(); + if (!NetworkUtils.isIpv4Address(consoleProxyIp) || "0.0.0.0".equals(consoleProxyIp)) { return generateMacWithDeviceIdRandom(deviceId); } @@ -151,7 +149,7 @@ public static String generateMacWithDeviceIdIp(short deviceId) { * mgt ip is: 172.24.0.81, its hex string: AC 18 00 51, * so mac address will look like: fa:00:51:xx:xx:yy * xx:xx are random. yy is device ID */ - int mgtIpL = (int)NetworkUtils.ipv4StringToLong(mgtIp); + int mgtIpL = (int)NetworkUtils.ipv4StringToLong(consoleProxyIp); String mgtIpStr = Integer.toHexString(mgtIpL); if (mgtIpStr.length() < 8) { String compensate = StringUtils.repeat("0", 8 - mgtIpStr.length()); From 2ef761d0222ee0b39166d636e190e729ee45966c Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Mon, 22 Dec 2025 19:37:55 +0800 Subject: [PATCH 658/737] [sdnController]: put sdn host crud in seperate queue Resolves: ZSTAC-79353 Change-Id: I63706d727173706e796b64666963776a74736c61 --- .../org/zstack/sdnController/SdnControllerBase.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java index a193fded62a..252efe7098c 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java @@ -86,6 +86,10 @@ public String getSdnControllerSignature() { return "sdn-controller-" + self.getUuid(); } + public String getSdnControllerHostSignature(String hostUuid) { + return "sdn-controller-" + self.getUuid() + "-host-" + hostUuid; + } + protected SdnController getSdnController() { SdnControllerFactory factory = sdnMgr.getSdnControllerFactory(self.getVendorType()); return factory.getSdnController(self); @@ -469,7 +473,7 @@ private void sdnControllerAddHost(APISdnControllerAddHostMsg msg, Completion com thdf.chainSubmit(new ChainTask(completion) { @Override public String getSyncSignature() { - return getSdnControllerSignature(); + return getSdnControllerHostSignature(msg.getHostUuid()); } @Override @@ -550,7 +554,7 @@ private void sdnControllerRemoveHostInQueue(SdnControllerRemoveHostMsg msg, Comp thdf.chainSubmit(new ChainTask(completion) { @Override public String getSyncSignature() { - return getSdnControllerSignature(); + return getSdnControllerHostSignature(msg.getHostUuid()); } @Override @@ -636,7 +640,7 @@ private void doControllerChangeHost(APISdnControllerChangeHostMsg msg, Completio thdf.chainSubmit(new ChainTask(completion) { @Override public String getSyncSignature() { - return getSdnControllerSignature(); + return getSdnControllerHostSignature(msg.getHostUuid()); } @Override From 4bbcccfa97327e5717e1768f132595f22376ee63 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 23 Dec 2025 14:02:43 +0800 Subject: [PATCH 659/737] [conf]: Fix V5.4.6 schema upgrade issue DBImpact Resolves: ZSTAC-80856 Change-Id: I6b706c647276786f796a65666578667079796179 --- conf/db/upgrade/beforeValidate.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/db/upgrade/beforeValidate.sql b/conf/db/upgrade/beforeValidate.sql index 1f3cbfc36cc..21f947e6289 100644 --- a/conf/db/upgrade/beforeValidate.sql +++ b/conf/db/upgrade/beforeValidate.sql @@ -39,7 +39,7 @@ BEGIN update `zstack`.`schema_version` set `checksum`=613548663 where `script`='V5.3.6__schema.sql' and `checksum` <> 613548663; update `zstack`.`schema_version` set `checksum`=1489363540 where `script`='V5.3.22__schema.sql' and `checksum` <> 1489363540; update `zstack`.`schema_version` set `checksum`=1648524318 where `script`='V4.4.0__schema.sql' and `checksum` <> 1648524318; - update `zstack`.`schema_version` set `checksum`=-1622195975 where `script`='V5.4.6__schema.sql' and `checksum` <> 1381616852; + update `zstack`.`schema_version` set `checksum`=-3265430 where `script`='V5.4.6__schema.sql' and `checksum` <> -3265430; END IF; END $$ From 2be051050f874d5b3d6c294f7a384c24f19d9c10 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 24 Dec 2025 11:35:21 +0800 Subject: [PATCH 660/737] [conf]: Add dtype to ModelVO DBImpact Resolves: ZSTAC-79823 Change-Id: I6c6963776475616e67616b6a6e63727069757670 --- conf/db/upgrade/V5.5.0__schema.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/db/upgrade/V5.5.0__schema.sql b/conf/db/upgrade/V5.5.0__schema.sql index bb8bcdcf139..df39632e993 100644 --- a/conf/db/upgrade/V5.5.0__schema.sql +++ b/conf/db/upgrade/V5.5.0__schema.sql @@ -474,3 +474,5 @@ SELECT uuid, 0 FROM SdnControllerVO where vendorType = 'Ovn'; CALL ADD_COLUMN('ModelServiceInstanceVO', 'architecture', 'VARCHAR(32)', 1, NULL); CALL ADD_COLUMN('ModelServiceInstanceVO', 'gpuVendor', 'VARCHAR(128)', 1, NULL); + +CALL ADD_COLUMN('ModelVO', 'dtype', 'varchar(32)', 1, NULL); From 1f4e47dfb2dadfa03c1d6c99089889a3e9b1d0a0 Mon Sep 17 00:00:00 2001 From: "haidong.pang" Date: Wed, 24 Dec 2025 09:52:22 +0000 Subject: [PATCH 661/737] [storage]: Set the actual image format for ExternalPrimaryStorage 1. Creating an image from a volume defaults to the source format, which may be unexpected. 2. Use the actual format from backup storage reply. Resolves: ZSTAC-78094 Change-Id: I716d747961666979766372626d7679716262667a --- .../zstack/storage/addon/primary/ExternalPrimaryStorage.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index b650356c7d8..3e73527469c 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -949,6 +949,7 @@ protected void handle(CreateTemplateFromVolumeOnPrimaryStorageMsg msg) { String snapshotPath; String bsInstallPath; + String actualFormat; long templateSize; @@ -1077,6 +1078,7 @@ public void run(MessageReply reply) { DownloadImageFromRemoteTargetReply r = reply.castReply(); bsInstallPath = r.getInstallPath(); templateSize = r.getSize(); + actualFormat = r.getFormat(); trigger.next(); } } @@ -1109,7 +1111,7 @@ public void fail(ErrorCode errorCode) { @Override public void handle(Map data) { reply.setTemplateBackupStorageInstallPath(bsInstallPath); - reply.setFormat(msg.getVolumeInventory().getFormat()); + reply.setFormat(actualFormat); reply.setActualSize(templateSize); bus.reply(msg, reply); } From 612d1d6e7c3aa290b5e1c71fc4d075ebe33082af Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Wed, 24 Dec 2025 19:34:30 +0800 Subject: [PATCH 662/737] [securityGroup]: ovn vm don't check host sg rule Resolves: ZSTAC-80893 Change-Id: I666c646a6a686379737877726469787572636562 --- .../network/securitygroup/SecurityGroupManagerImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java index ba7a4d41d7d..7883007254c 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java @@ -1064,6 +1064,10 @@ private void handle(RefreshSecurityGroupRulesOnVmMsg msg) { refreshVmSecurityGroupRulesBySdn(sdnNicUuidsMap, msg, new Completion(new NopeCompletion()) { @Override public void success() { + if (otherNicUuids.isEmpty()) { + bus.reply(msg, reply); + return; + } refreshVmSecurityGroupRules(otherNicUuids, msg); bus.reply(msg, reply); } From 3ca3879f78c7493a154c7dd3db61c8a616533115 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 24 Dec 2025 11:31:23 +0800 Subject: [PATCH 663/737] [sdk]: Update sdk Resolves: ZSTAC-80894 Change-Id: I63757a626c766578796c796e6c6e736a73736b70 --- sdk/src/main/java/org/zstack/sdk/GpuVendor.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/src/main/java/org/zstack/sdk/GpuVendor.java b/sdk/src/main/java/org/zstack/sdk/GpuVendor.java index d5f4842085e..0918b690289 100644 --- a/sdk/src/main/java/org/zstack/sdk/GpuVendor.java +++ b/sdk/src/main/java/org/zstack/sdk/GpuVendor.java @@ -8,4 +8,5 @@ public enum GpuVendor { Huawei, TianShu, Other, + Alibaba, } From afcfc090602d6c5a337a5cac6ba806da18ee2459 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 24 Dec 2025 15:23:56 +0800 Subject: [PATCH 664/737] [testlib]: Bump servlet to 3.1 Resolves: ZSTAC-41284 Change-Id: I76726765796c6b7167617a666c68797668736a75 --- conf/web.xml | 6 +- core/pom.xml | 3 +- header/pom.xml | 309 +++++++------- pom.xml | 4 +- portal/pom.xml | 209 +++++----- rest/pom.xml | 3 +- sdk/pom.xml | 3 +- search/pom.xml | 391 +++++++++--------- simulator/pom.xml | 199 ++++----- testlib/pom.xml | 13 +- .../org/zstack/testlib/TestLibController.java | 29 +- utils/pom.xml | 4 +- 12 files changed, 604 insertions(+), 569 deletions(-) diff --git a/conf/web.xml b/conf/web.xml index ac49958c393..26867d09831 100755 --- a/conf/web.xml +++ b/conf/web.xml @@ -1,7 +1,7 @@ - @@ -14,6 +14,7 @@ /WEB-INF/classes/zstack-servlet-context.xml 1 + true @@ -47,6 +48,7 @@ UrlRewriteFilter org.tuckey.web.filters.urlrewrite.UrlRewriteFilter + true UrlRewriteFilter diff --git a/core/pom.xml b/core/pom.xml index 2f9c5be27f1..0afa4e8b387 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -28,7 +28,8 @@ javax.servlet - servlet-api + javax.servlet-api + 3.1.0 provided diff --git a/header/pom.xml b/header/pom.xml index d31a8194b15..fcd0550be05 100755 --- a/header/pom.xml +++ b/header/pom.xml @@ -1,156 +1,157 @@ - - 4.0.0 - - zstack - org.zstack + + 4.0.0 + + zstack + org.zstack 5.4.0 - .. - - header - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${project.compiler.version} - - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source - true - - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - - - - org.codehaus.mojo - aspectj-maven-plugin - ${aspectj.plugin.version} - - - - compile - test-compile - - - - - - ${project.java.version} - ${project.java.version} - ${project.java.version} - true - true - - - org.springframework - spring-aspects - - - - - - - - - - org.hibernate.javax.persistence - hibernate-jpa-2.1-api - - - org.hibernate - hibernate-search-orm - - - org.apache.avro - avro - 1.11.4 - - - org.hibernate - hibernate-search-serialization-avro - - - org.apache.avro - avro - - - - - org.hibernate - hibernate-search-backend-jgroups - - - com.google.protobuf - protobuf-java - 3.21.9 - - - org.infinispan - infinispan-directory-provider - - - com.google.protobuf - protobuf-java - - - - - com.rabbitmq - amqp-client - - - org.springframework.security - spring-security-core - - - javax.servlet - servlet-api - provided - - - org.springframework - spring-aspects - - - org.springframework - spring-tx - - - org.aspectj - aspectjrt - - - org.aspectj - aspectjweaver - - - - org.zstack - utils - ${project.version} - - - org.apache.httpcomponents - httpclient - - - org.zstack - abstraction + .. + + header + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${project.compiler.version} + + groovy-eclipse-compiler + ${project.java.version} + ${project.java.version} + lines,vars,source + true + + + + org.codehaus.groovy + groovy-eclipse-compiler + ${groovy.eclipse.compiler} + + + org.codehaus.groovy + groovy-eclipse-batch + ${groovy.eclipse.batch} + + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj.plugin.version} + + + + compile + test-compile + + + + + + ${project.java.version} + ${project.java.version} + ${project.java.version} + true + true + + + org.springframework + spring-aspects + + + + + + + + + + org.hibernate.javax.persistence + hibernate-jpa-2.1-api + + + org.hibernate + hibernate-search-orm + + + org.apache.avro + avro + 1.11.4 + + + org.hibernate + hibernate-search-serialization-avro + + + org.apache.avro + avro + + + + + org.hibernate + hibernate-search-backend-jgroups + + + com.google.protobuf + protobuf-java + 3.21.9 + + + org.infinispan + infinispan-directory-provider + + + com.google.protobuf + protobuf-java + + + + + com.rabbitmq + amqp-client + + + org.springframework.security + spring-security-core + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + org.springframework + spring-aspects + + + org.springframework + spring-tx + + + org.aspectj + aspectjrt + + + org.aspectj + aspectjweaver + + + + org.zstack + utils + ${project.version} + + + org.apache.httpcomponents + httpclient + + + org.zstack + abstraction 5.4.0 - - - + + + diff --git a/pom.xml b/pom.xml index 7eb089349a4..245744f9eb7 100755 --- a/pom.xml +++ b/pom.xml @@ -268,8 +268,8 @@ javax.servlet - servlet-api - 2.5 + javax.servlet-api + 3.1.0 provided diff --git a/portal/pom.xml b/portal/pom.xml index 8a8775d4c5c..73c0b97f049 100755 --- a/portal/pom.xml +++ b/portal/pom.xml @@ -1,105 +1,106 @@ - - 4.0.0 - - zstack - org.zstack + + 4.0.0 + + zstack + org.zstack 5.4.0 - .. - - portal - - - org.zstack - utils - ${project.version} - - - org.zstack - core - ${project.version} - - - org.zstack - header - ${project.version} - - - org.zstack - search - ${project.version} - - - org.zstack - tag - ${project.version} - - - - javax.servlet - servlet-api - provided - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${project.compiler.version} - - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source - true - - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - - - - org.codehaus.mojo - aspectj-maven-plugin - ${aspectj.plugin.version} - - - - compile - test-compile - - - - - ${project.java.version} - ${project.java.version} - ${project.java.version} - true - - - org.springframework - spring-aspects - - - org.zstack - core - - - org.zstack - header - - - - - - - + .. + + portal + + + org.zstack + utils + ${project.version} + + + org.zstack + core + ${project.version} + + + org.zstack + header + ${project.version} + + + org.zstack + search + ${project.version} + + + org.zstack + tag + ${project.version} + + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${project.compiler.version} + + groovy-eclipse-compiler + ${project.java.version} + ${project.java.version} + lines,vars,source + true + + + + org.codehaus.groovy + groovy-eclipse-compiler + ${groovy.eclipse.compiler} + + + org.codehaus.groovy + groovy-eclipse-batch + ${groovy.eclipse.batch} + + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj.plugin.version} + + + + compile + test-compile + + + + + ${project.java.version} + ${project.java.version} + ${project.java.version} + true + + + org.springframework + spring-aspects + + + org.zstack + core + + + org.zstack + header + + + + + + + diff --git a/rest/pom.xml b/rest/pom.xml index 1a79e191c0f..ba0292f6404 100755 --- a/rest/pom.xml +++ b/rest/pom.xml @@ -34,7 +34,8 @@ javax.servlet - servlet-api + javax.servlet-api + 3.1.0 provided diff --git a/sdk/pom.xml b/sdk/pom.xml index 72ed68dd8ab..94d50ffced6 100755 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -26,7 +26,8 @@ javax.servlet - servlet-api + javax.servlet-api + 3.1.0 provided diff --git a/search/pom.xml b/search/pom.xml index b765e61e0f1..bf0a6227a2f 100755 --- a/search/pom.xml +++ b/search/pom.xml @@ -1,196 +1,197 @@ - - 4.0.0 - - zstack - org.zstack + + 4.0.0 + + zstack + org.zstack 5.4.0 - .. - - search - - - org.zstack - core - ${project.version} - - - org.zstack - header - ${project.version} - - - org.zstack - utils - ${project.version} - - - - org.hibernate - hibernate-core - - - org.objenesis - objenesis - - - org.kohsuke - groovy-sandbox - 1.19 - - - org.codehaus.groovy - groovy-all - - - org.antlr - antlr4 - - - org.antlr - antlr4-runtime - - - org.antlr - antlr4-maven-plugin - - - javax.servlet - servlet-api - provided - - - - - - zql - - - - org.antlr - antlr4-maven-plugin - 4.7 - - - - true - - run-antlr - generate-sources - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - antlr-add-source - generate-sources - - - - - - - - - - - - org.antlr - antlr4-maven-plugin - 4.7 - - - run-antlr - none - - antlr4 - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - ${aspectj.plugin.version} - - - antlr-add-source - none - - add-source - - - - ${basedir}/target/generated-sources/antlr4 - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${project.compiler.version} - - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source - true - - - - org.codehaus.groovy - groovy-eclipse-compiler - 2.9.2-01 - - - org.codehaus.groovy - groovy-eclipse-batch - 2.4.3-01 - - - - - - org.codehaus.mojo - aspectj-maven-plugin - ${aspectj.plugin.version} - - - - compile - test-compile - - - - - ${project.java.version} - ${project.java.version} - ${project.java.version} - true - - - org.springframework - spring-aspects - - - org.zstack - core - - - org.zstack - header - - - - - - - + .. + + search + + + org.zstack + core + ${project.version} + + + org.zstack + header + ${project.version} + + + org.zstack + utils + ${project.version} + + + + org.hibernate + hibernate-core + + + org.objenesis + objenesis + + + org.kohsuke + groovy-sandbox + 1.19 + + + org.codehaus.groovy + groovy-all + + + org.antlr + antlr4 + + + org.antlr + antlr4-runtime + + + org.antlr + antlr4-maven-plugin + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + + + + zql + + + + org.antlr + antlr4-maven-plugin + 4.7 + + + + true + + run-antlr + generate-sources + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + antlr-add-source + generate-sources + + + + + + + + + + + + org.antlr + antlr4-maven-plugin + 4.7 + + + run-antlr + none + + antlr4 + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + ${aspectj.plugin.version} + + + antlr-add-source + none + + add-source + + + + ${basedir}/target/generated-sources/antlr4 + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${project.compiler.version} + + groovy-eclipse-compiler + ${project.java.version} + ${project.java.version} + lines,vars,source + true + + + + org.codehaus.groovy + groovy-eclipse-compiler + 2.9.2-01 + + + org.codehaus.groovy + groovy-eclipse-batch + 2.4.3-01 + + + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj.plugin.version} + + + + compile + test-compile + + + + + ${project.java.version} + ${project.java.version} + ${project.java.version} + true + + + org.springframework + spring-aspects + + + org.zstack + core + + + org.zstack + header + + + + + + + diff --git a/simulator/pom.xml b/simulator/pom.xml index d2e22ea6592..67ff1b0ed55 100755 --- a/simulator/pom.xml +++ b/simulator/pom.xml @@ -1,100 +1,101 @@ - - 4.0.0 - - zstack - org.zstack + + 4.0.0 + + zstack + org.zstack 5.4.0 - .. - - simulator - pom - - simulatorHeader - simulatorImpl - - - - org.zstack - core - ${project.version} - - - org.zstack - utils - ${project.version} - - - org.zstack - header - ${project.version} - - - - javax.servlet - servlet-api - provided - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${project.compiler.version} - - groovy-eclipse-compiler - ${project.java.version} - ${project.java.version} - lines,vars,source - true - - - - org.codehaus.groovy - groovy-eclipse-compiler - ${groovy.eclipse.compiler} - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.eclipse.batch} - - - - - org.codehaus.mojo - aspectj-maven-plugin - ${aspectj.plugin.version} - - - - compile - test-compile - - - - - 1.6 - 1.6 - true - - - org.springframework - spring-aspects - - - org.zstack - core - - - org.zstack - header - - - - - - - + .. + + simulator + pom + + simulatorHeader + simulatorImpl + + + + org.zstack + core + ${project.version} + + + org.zstack + utils + ${project.version} + + + org.zstack + header + ${project.version} + + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${project.compiler.version} + + groovy-eclipse-compiler + ${project.java.version} + ${project.java.version} + lines,vars,source + true + + + + org.codehaus.groovy + groovy-eclipse-compiler + ${groovy.eclipse.compiler} + + + org.codehaus.groovy + groovy-eclipse-batch + ${groovy.eclipse.batch} + + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj.plugin.version} + + + + compile + test-compile + + + + + 1.6 + 1.6 + true + + + org.springframework + spring-aspects + + + org.zstack + core + + + org.zstack + header + + + + + + + diff --git a/testlib/pom.xml b/testlib/pom.xml index 2c8e374fce4..cc79b811265 100644 --- a/testlib/pom.xml +++ b/testlib/pom.xml @@ -25,11 +25,6 @@ mockito-core 4.11.0 - - javax.servlet - servlet-api - provided - org.eclipse.jetty jetty-webapp @@ -50,8 +45,6 @@ javaparser-core 3.0.1 - - org.zstack core @@ -220,6 +213,12 @@ org.jasig.cas.client cas-client-core + + javax.servlet + javax.servlet-api + 3.1.0 + provided + diff --git a/testlib/src/main/java/org/zstack/testlib/TestLibController.java b/testlib/src/main/java/org/zstack/testlib/TestLibController.java index 3b8ac96d5f2..9805c84f1f8 100755 --- a/testlib/src/main/java/org/zstack/testlib/TestLibController.java +++ b/testlib/src/main/java/org/zstack/testlib/TestLibController.java @@ -3,18 +3,26 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; +import javax.servlet.AsyncContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.InvocationTargetException; -import java.util.Objects; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** * Created by xing5 on 2017/2/12. */ @Controller public class TestLibController { + private static final CLogger logger = Utils.getLogger(TestLibController.class); + + private static final ExecutorService pool = Executors.newFixedThreadPool(10); + @RequestMapping( value = "/**", method = { @@ -28,6 +36,23 @@ public void handle(HttpServletRequest request, HttpServletResponse response) thr return; } - Test.handleHttp(request, response); + final AsyncContext asyncContext = request.startAsync(); + asyncContext.setTimeout(120000); + + pool.submit(() -> { + try { + Test.handleHttp((HttpServletRequest) asyncContext.getRequest(), + (HttpServletResponse) asyncContext.getResponse()); + } catch (Throwable t) { + logger.error(t.getMessage(), t); + try { + ((HttpServletResponse) asyncContext.getResponse()).sendError(500); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + } finally { + asyncContext.complete(); + } + }); } } diff --git a/utils/pom.xml b/utils/pom.xml index 55be08113bb..393c975e67d 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -136,7 +136,9 @@ javax.servlet - servlet-api + javax.servlet-api + 3.1.0 + provided From 7eb7b7cdbc038a33215098267da393f0b6501120 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 24 Dec 2025 16:24:34 +0800 Subject: [PATCH 665/737] [testlib]: Introduce async context for controller - Fix code issue Resolves: ZSTAC-41284 Change-Id: I6f68736d656f676d796974706777646f6a75767a --- .../main/java/org/zstack/testlib/Test.groovy | 21 ++------------ .../org/zstack/testlib/TestLibController.java | 22 ++++++++++++-- .../zstack/testlib/WebBeanConstructor.groovy | 3 +- .../testlib/util/TestConfigUtils.groovy | 29 +++++++++++++++++++ 4 files changed, 54 insertions(+), 21 deletions(-) create mode 100644 testlib/src/main/java/org/zstack/testlib/util/TestConfigUtils.groovy diff --git a/testlib/src/main/java/org/zstack/testlib/Test.groovy b/testlib/src/main/java/org/zstack/testlib/Test.groovy index 553d3084959..1dcb02c54e9 100755 --- a/testlib/src/main/java/org/zstack/testlib/Test.groovy +++ b/testlib/src/main/java/org/zstack/testlib/Test.groovy @@ -25,6 +25,7 @@ import org.zstack.sdk.ZSClient import org.zstack.testlib.collectstrategy.SubCaseCollectionStrategy import org.zstack.testlib.collectstrategy.SubCaseCollectionStrategyFactory import org.zstack.testlib.util.Retry +import org.zstack.testlib.util.TestConfigUtils import org.zstack.utils.ShellUtils import org.zstack.utils.Utils import org.zstack.utils.gson.JSONObjectUtil @@ -49,7 +50,6 @@ abstract class Test extends ApiHelper implements Retry { static Object deployer static Map apiPaths = new ConcurrentHashMap<>() - private final static long DEFAULT_MESSAGE_TIMEOUT_SECS = TimeUnit.SECONDS.toMillis(25) static Map functionForMockTestObjectFactory = new ConcurrentHashMap<>() protected List methodsOnClean = [] @@ -81,21 +81,6 @@ abstract class Test extends ApiHelper implements Retry { } } - static long getMessageTimeoutMillsConfig(){ - String msgTimeoutStr = System.getProperty("msgTimeoutMins") - - if(System.getProperty("maven.surefire.debug") != null && msgTimeoutStr == null){ - return TimeUnit.MINUTES.toMillis(30) - } - - if(msgTimeoutStr == null || msgTimeoutStr.isEmpty()){ - return DEFAULT_MESSAGE_TIMEOUT_SECS - } - - long msgTimeout = Long.parseLong(msgTimeoutStr) - return TimeUnit.MINUTES.toMillis(msgTimeout) - } - private final int PHASE_NONE = 0 private final int PHASE_SETUP = 1 private final int PHASE_ENV = 2 @@ -318,8 +303,8 @@ abstract class Test extends ApiHelper implements Retry { private void hijackService() { CloudBus bus = bean(CloudBus.class) if(bus instanceof CloudBusImpl2){ - logger.info(String.format("CloudBus message timeout: %s mills", getMessageTimeoutMillsConfig())) - ((CloudBusImpl2)bus).setDEFAULT_MESSAGE_TIMEOUT(getMessageTimeoutMillsConfig()) + logger.info(String.format("CloudBus message timeout: %s mills", TestConfigUtils.getMessageTimeoutMillisConfig())) + ((CloudBusImpl2)bus).setDEFAULT_MESSAGE_TIMEOUT(TestConfigUtils.getMessageTimeoutMillisConfig()) } def serviceId = "test.hijack.service" diff --git a/testlib/src/main/java/org/zstack/testlib/TestLibController.java b/testlib/src/main/java/org/zstack/testlib/TestLibController.java index 9805c84f1f8..286eae91b04 100755 --- a/testlib/src/main/java/org/zstack/testlib/TestLibController.java +++ b/testlib/src/main/java/org/zstack/testlib/TestLibController.java @@ -3,9 +3,11 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import org.zstack.testlib.util.TestConfigUtils; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; +import javax.annotation.PreDestroy; import javax.servlet.AsyncContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -13,6 +15,7 @@ import java.lang.reflect.InvocationTargetException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; /** * Created by xing5 on 2017/2/12. @@ -21,7 +24,7 @@ public class TestLibController { private static final CLogger logger = Utils.getLogger(TestLibController.class); - private static final ExecutorService pool = Executors.newFixedThreadPool(10); + private static final ExecutorService pool = Executors.newFixedThreadPool(32); @RequestMapping( value = "/**", @@ -37,7 +40,7 @@ public void handle(HttpServletRequest request, HttpServletResponse response) thr } final AsyncContext asyncContext = request.startAsync(); - asyncContext.setTimeout(120000); + asyncContext.setTimeout(TestConfigUtils.getMessageTimeoutMillisConfig()); pool.submit(() -> { try { @@ -55,4 +58,19 @@ public void handle(HttpServletRequest request, HttpServletResponse response) thr } }); } + + @PreDestroy + public void shutdownPool() { + logger.info("Shutting down TestLibController pool"); + pool.shutdown(); + try { + if (!pool.awaitTermination(10, TimeUnit.SECONDS)) { + logger.warn("Pool did not terminate within timeout, forcing shutdown"); + pool.shutdownNow(); + } + } catch (InterruptedException e) { + pool.shutdownNow(); + Thread.currentThread().interrupt(); + } + } } diff --git a/testlib/src/main/java/org/zstack/testlib/WebBeanConstructor.groovy b/testlib/src/main/java/org/zstack/testlib/WebBeanConstructor.groovy index 9d64f8d65ef..6c507dd8eb8 100755 --- a/testlib/src/main/java/org/zstack/testlib/WebBeanConstructor.groovy +++ b/testlib/src/main/java/org/zstack/testlib/WebBeanConstructor.groovy @@ -14,6 +14,7 @@ import org.zstack.network.service.virtualrouter.VirtualRouterGlobalProperty import org.zstack.sdk.ZSClient import org.zstack.sdk.ZSConfig import org.zstack.storage.backup.sftp.SftpBackupStorageGlobalProperty +import org.zstack.testlib.util.TestConfigUtils import org.zstack.utils.Utils import java.util.concurrent.TimeUnit @@ -85,7 +86,7 @@ class WebBeanConstructor extends BeanConstructor { .setPort(port) .setWebHook(WEB_HOOK_PATH) .setDefaultPollingInterval(100, TimeUnit.MILLISECONDS) - .setDefaultPollingTimeout(Test.getMessageTimeoutMillsConfig(), TimeUnit.MILLISECONDS) + .setDefaultPollingTimeout(TestConfigUtils.getMessageTimeoutMillisConfig(), TimeUnit.MILLISECONDS) .setReadTimeout(10, TimeUnit.MINUTES) .setWriteTimeout(10, TimeUnit.MINUTES) .build() diff --git a/testlib/src/main/java/org/zstack/testlib/util/TestConfigUtils.groovy b/testlib/src/main/java/org/zstack/testlib/util/TestConfigUtils.groovy new file mode 100644 index 00000000000..f71282c36d2 --- /dev/null +++ b/testlib/src/main/java/org/zstack/testlib/util/TestConfigUtils.groovy @@ -0,0 +1,29 @@ +package org.zstack.testlib.util + + +import java.util.concurrent.TimeUnit + +class TestConfigUtils { + private final static long DEFAULT_MESSAGE_TIMEOUT_SECS = TimeUnit.SECONDS.toMillis(25) + + static long getMessageTimeoutMillisConfig(){ + String msgTimeoutStr = System.getProperty("msgTimeoutMins") + + if(System.getProperty("maven.surefire.debug") != null && msgTimeoutStr == null){ + return TimeUnit.MINUTES.toMillis(30) + } + + if(msgTimeoutStr == null || msgTimeoutStr.isEmpty()){ + return DEFAULT_MESSAGE_TIMEOUT_SECS + } + + long msgTimeout + try { + msgTimeout = Long.parseLong(msgTimeoutStr) + } catch (NumberFormatException e) { + throw new RuntimeException("wrong format for msgTimeoutMins system property, it should be a number representing minutes", e) + } + + return TimeUnit.MINUTES.toMillis(msgTimeout) + } +} From c7260898553e2dca64d660d6d9fbe379d15ba833 Mon Sep 17 00:00:00 2001 From: zhangjianjun Date: Thu, 25 Dec 2025 14:20:58 +0800 Subject: [PATCH 666/737] [nfvInstGroup]: specify pool to create nfv inst group DBImpact Resolves: ZSTAC-80931 Change-Id: I7674666c786c6c6c636b616d6c7670616e776177 Signed-off-by: zhangjianjun --- conf/db/upgrade/V5.5.0__schema.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.5.0__schema.sql b/conf/db/upgrade/V5.5.0__schema.sql index df39632e993..cc43f8f2d40 100644 --- a/conf/db/upgrade/V5.5.0__schema.sql +++ b/conf/db/upgrade/V5.5.0__schema.sql @@ -147,7 +147,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`NfvInstGroupVO` ( `vipUuid` VARCHAR(32) DEFAULT NULL, `ipv6VipUuid` VARCHAR(32) DEFAULT NULL, `primaryStorageUuid` VARCHAR(32) DEFAULT NULL, - `primaryStoragePoolUuid` VARCHAR(32) DEFAULT NULL, + `primaryStoragePoolUuid` VARCHAR(255) DEFAULT NULL, `clusterUuid` VARCHAR(32) DEFAULT NULL, `zoneUuid` VARCHAR(32) DEFAULT NULL, `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, From b232001f64532283711927dcae12b482072719a8 Mon Sep 17 00:00:00 2001 From: zhangjianjun Date: Thu, 25 Dec 2025 15:25:26 +0800 Subject: [PATCH 667/737] [sdnController]: set lacp mode when change host Resolves: ZSTAC-76537 Change-Id: I726264716466627a646b727671736a656a776b6e Signed-off-by: zhangjianjun --- .../zstack/sdnController/SdnControllerApiInterceptor.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java index a9caed4b7e6..999c34ecd07 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java @@ -203,6 +203,14 @@ private void validate(APISdnControllerChangeHostMsg msg) { if (msg.getNicNames().size() > 1 && msg.getBondMode() == null) { msg.setBondMode(refVO.getBondMode()); } + + if (msg.getLacpMode() == null) { + msg.setLacpMode(refVO.getLacpMode()); + } + + if (msg.getBondMode() != null && msg.getBondMode().equals(L2NetworkConstant.BONDING_MODE_TCP) && msg.getLacpMode() == null) { + msg.setLacpMode(L2NetworkConstant.LACP_MODE_ACTIVE); + } } private void validateH3cTenantStatus(String l3NetworkUuid, String sdnControllerUuid) { From 305f75e5f6fee58de6cd7cfe64283051bd992434 Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Fri, 26 Dec 2025 16:22:33 +0800 Subject: [PATCH 668/737] [guesttools]: support runtime params for script execution 1. Add runtimeParams field to APIExecuteGuestVmScriptMsg for dynamic parameter passing 2. Add mergeRenderParams() method to merge script default params with runtime params 3. Add validation for runtimeParams JSON format in GuestToolsApiInterceptor 4. Add validation to ensure all script placeholders have corresponding params 5. Store merged params in execution record for traceability 6. Add unit tests for runtime params functionality Resolves: ZSTAC-79185 Change-Id: I7377637968707664656b74727665746a6f7a6a65 --- .../main/java/org/zstack/sdk/ExecuteGuestVmScriptAction.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/ExecuteGuestVmScriptAction.java b/sdk/src/main/java/org/zstack/sdk/ExecuteGuestVmScriptAction.java index 0902980b9b1..0579ba28812 100644 --- a/sdk/src/main/java/org/zstack/sdk/ExecuteGuestVmScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ExecuteGuestVmScriptAction.java @@ -40,6 +40,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String recordUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String runtimeParams; + @Param(required = false) public java.util.List systemTags; From ac6778da30e5ced9a95d05c5491ade2a2e4c9ee5 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Sat, 27 Dec 2025 10:38:46 +0800 Subject: [PATCH 669/737] [zbs]: convert expand volume path to cbd format Resolves: ZSTAC-80990 Change-Id: I6473766578787265637969776365756d6a7a6f63 --- .../main/java/org/zstack/storage/zbs/ZbsStorageController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 1812808c2a6..d379f170399 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -954,7 +954,7 @@ public void fail(ErrorCode errorCode) { @Override public void expandVolume(String installPath, long size, ReturnValueCompletion comp) { ExpandVolumeCmd cmd = new ExpandVolumeCmd(); - cmd.setPath(installPath); + cmd.setPath(convertZbsPathToCbdPath(installPath, ZbsStorageController.this::getPhysicalPoolName)); cmd.setUnit(getSizeUnit(addonInfo.getClusterInfo().getVersion())); cmd.setSize(alignSizeTo(size, cmd.getUnit())); From 1407260a5cd567c29e6a1a32b5a699910df830ec Mon Sep 17 00:00:00 2001 From: zhangjianjun Date: Fri, 26 Dec 2025 18:08:12 +0800 Subject: [PATCH 670/737] [sdnController]: set lacp mode when change host Resolves: ZSTAC-76537 Change-Id: I61636a6e78746b7166796572677a7a746c6d7469 Signed-off-by: zhangjianjun --- .../sdnController/SdnControllerApiInterceptor.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java index 999c34ecd07..35173af3236 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java @@ -200,16 +200,24 @@ private void validate(APISdnControllerChangeHostMsg msg) { msg.setNicNames(new ArrayList<>(nicNamePciAddressMap.keySet())); } - if (msg.getNicNames().size() > 1 && msg.getBondMode() == null) { + if (msg.getBondMode() == null) { msg.setBondMode(refVO.getBondMode()); } - if (msg.getLacpMode() == null) { + if (msg.getBondMode().equals(refVO.getBondMode())) { msg.setLacpMode(refVO.getLacpMode()); } - if (msg.getBondMode() != null && msg.getBondMode().equals(L2NetworkConstant.BONDING_MODE_TCP) && msg.getLacpMode() == null) { + if (msg.getBondMode().equals(L2NetworkConstant.BONDING_MODE_TCP)) { msg.setLacpMode(L2NetworkConstant.LACP_MODE_ACTIVE); + } else if (msg.getBondMode().equals(L2NetworkConstant.BONDING_MODE_SLB)) { + if (msg.getLacpMode() == null) { + msg.setLacpMode(L2NetworkConstant.LACP_MODE_OFF); + } else if (!(msg.getLacpMode().equals(L2NetworkConstant.LACP_MODE_PASSIVE))) { + msg.setLacpMode(L2NetworkConstant.LACP_MODE_OFF); + } + } else { + msg.setLacpMode(L2NetworkConstant.LACP_MODE_OFF); } } From 93940b9d499f9669a3e877997542fed12db7b08b Mon Sep 17 00:00:00 2001 From: J M Date: Thu, 11 Dec 2025 18:45:44 +0800 Subject: [PATCH 671/737] [xinfini]: fix ping addon info sync between mn do use refresh db. use event notify after addon info changed by ping. Resolves: ZSTAC-80578 Change-Id: I7463686d6f736879726976706c736e6a63626d6b --- .../storage/addon/primary/AddonInfo.java | 15 ++++++ .../ExternalPrimaryStorageSvcBuilder.java | 2 +- .../storage/addon/primary/PingResult.java | 41 ++++++++++++++++ .../primary/PrimaryStorageControllerSvc.java | 31 ++++++++++-- .../java/org/zstack/expon/ExponAddonInfo.java | 3 +- .../zstack/expon/ExponStorageController.java | 18 +++++-- .../org/zstack/expon/ExponStorageFactory.java | 2 +- .../org/zstack/xinfini/XInfiniAddonInfo.java | 13 ++++- .../org/zstack/xinfini/XInfiniConfig.java | 9 ---- .../xinfini/XInfiniStorageController.java | 48 +++++++++++------- .../zstack/xinfini/XInfiniStorageFactory.java | 2 +- .../org/zstack/xinfini/sdk/XInfiniClient.java | 10 +--- .../xinfini/sdk/XInfiniConnectConfig.java | 3 +- .../org/zstack/storage/zbs/AddonInfo.java | 9 +++- .../storage/zbs/ZbsStorageController.java | 30 ++++++++---- .../zstack/storage/zbs/ZbsStorageFactory.java | 25 +--------- .../addon/primary/ExternalPrimaryStorage.java | 47 ++++++++++++++++-- .../ExternalPrimaryStorageCanonicalEvent.java | 26 ++++++++++ .../ExternalPrimaryStorageFactory.java | 49 ++++++++++++++++--- .../ExternalPrimaryStorageManagerImpl.java | 12 ++--- .../addon/zbs/ZbsPrimaryStorageCase.groovy | 23 ++++++++- 21 files changed, 316 insertions(+), 102 deletions(-) create mode 100644 header/src/main/java/org/zstack/header/storage/addon/primary/AddonInfo.java create mode 100644 header/src/main/java/org/zstack/header/storage/addon/primary/PingResult.java create mode 100644 storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageCanonicalEvent.java diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/AddonInfo.java b/header/src/main/java/org/zstack/header/storage/addon/primary/AddonInfo.java new file mode 100644 index 00000000000..f14f5828ce0 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/AddonInfo.java @@ -0,0 +1,15 @@ +package org.zstack.header.storage.addon.primary; + +import org.zstack.utils.gson.JSONObjectUtil; + +import java.io.Serializable; + +public interface AddonInfo extends Serializable { + default boolean changed(String infoJson) { + return !this.serialize().equals(infoJson); + } + + default String serialize() { + return JSONObjectUtil.toJsonString(this); + } +} diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageSvcBuilder.java b/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageSvcBuilder.java index 041438d7420..b2eb78ab2fc 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageSvcBuilder.java +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageSvcBuilder.java @@ -9,7 +9,7 @@ public interface ExternalPrimaryStorageSvcBuilder { PrimaryStorageNodeSvc buildNodeSvc(ExternalPrimaryStorageVO vo); - void discover(String url, String config, ReturnValueCompletion completion); + void discover(String url, String config, ReturnValueCompletion completion); String getIdentity(); } diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/PingResult.java b/header/src/main/java/org/zstack/header/storage/addon/primary/PingResult.java new file mode 100644 index 00000000000..aefc52de2ac --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/PingResult.java @@ -0,0 +1,41 @@ +package org.zstack.header.storage.addon.primary; + +public class PingResult { + private AddonInfo addonInfo; + private boolean success = true; + private String error; + + public PingResult(AddonInfo addonInfo, String error) { + this.addonInfo = addonInfo; + this.success = false; + this.error = error; + } + + public PingResult(AddonInfo addonInfo) { + this.addonInfo = addonInfo; + } + + public AddonInfo getAddonInfo() { + return addonInfo; + } + + public void setAddonInfo(AddonInfo addonInfo) { + this.addonInfo = addonInfo; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java b/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java index 48d9b290688..feb4c5c11c7 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java @@ -10,13 +10,38 @@ import org.zstack.header.volume.VolumeStats; import java.util.Collection; -import java.util.LinkedHashMap; import java.util.List; public interface PrimaryStorageControllerSvc { String getIdentity(); - void connect(String config, String url, ReturnValueCompletion comp); - void ping(Completion completion); + + /** + * connect to storage system, and the AddonInfo may be changed after connection, + * report the latest AddonInfo via the completion, ZStack will persist it on all management nodes. + * @param config + * @param url + * @param comp + */ + void connect(String config, String url, ReturnValueCompletion comp); + + /** + * ping the storage system, and report the latest AddonInfo and result via the completion, + * ZStack will persist AddonInfo on all management nodes. + * @param completion + */ + void ping(ReturnValueCompletion completion); + + /** + * sync the addon info from other management node to this svc + * @param addonInfo + */ + void syncAddonInfo(String addonInfo); + + /** + * sync the config from other management node to this svc + * @param config + */ + void syncConfig(String config); void getCapacity(List requiredUrls, ReturnValueCompletion comp); void reportCapacity(ReturnValueCompletion comp); diff --git a/plugin/expon/src/main/java/org/zstack/expon/ExponAddonInfo.java b/plugin/expon/src/main/java/org/zstack/expon/ExponAddonInfo.java index 07259255377..77c5be249af 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/ExponAddonInfo.java +++ b/plugin/expon/src/main/java/org/zstack/expon/ExponAddonInfo.java @@ -2,12 +2,13 @@ import org.zstack.expon.sdk.cluster.TianshuClusterModule; import org.zstack.expon.sdk.pool.FailureDomainModule; +import org.zstack.header.storage.addon.primary.AddonInfo; import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; -public class ExponAddonInfo { +public class ExponAddonInfo implements AddonInfo { private List clusters = new ArrayList<>(); private List pools = new ArrayList<>(); diff --git a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java index 8092ce34d61..616206b9d32 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java +++ b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java @@ -845,7 +845,7 @@ public String getIdentity() { } @Override - public void connect(String config, String url, ReturnValueCompletion comp) { + public void connect(String config, String url, ReturnValueCompletion comp) { apiHelper.login(); ExponAddonInfo info = new ExponAddonInfo(); @@ -876,12 +876,22 @@ public void connect(String config, String url, ReturnValueCompletion completion) { + completion.success(new PingResult(addonInfo)); + } + + @Override + public void syncAddonInfo(String addonInfo) { + this.addonInfo = StringUtils.isEmpty(addonInfo) ? new ExponAddonInfo() : JSONObjectUtil.toObject(addonInfo, ExponAddonInfo.class); + } + + @Override + public void syncConfig(String config) { + this.config = StringUtils.isEmpty(config) ? new ExponConfig() : JSONObjectUtil.toObject(config, ExponConfig.class); } private void reloadDbInfo() { diff --git a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageFactory.java b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageFactory.java index 6d24fbe824a..4086058d198 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageFactory.java +++ b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageFactory.java @@ -35,7 +35,7 @@ public PrimaryStorageNodeSvc buildNodeSvc(ExternalPrimaryStorageVO vo) { } @Override - public void discover(String url, String config, ReturnValueCompletion completion) { + public void discover(String url, String config, ReturnValueCompletion completion) { ExponStorageController controller = new ExponStorageController(url); MultiNodeSingleFlightImpl.register(controller.apiHelper); controller.connect(config, url, completion); diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniAddonInfo.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniAddonInfo.java index e522a99fd38..4d35f379e74 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniAddonInfo.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniAddonInfo.java @@ -1,5 +1,6 @@ package org.zstack.xinfini; +import org.zstack.header.storage.addon.primary.AddonInfo; import org.zstack.xinfini.sdk.node.NodeModule; import org.zstack.xinfini.sdk.pool.BsPolicyModule; import org.zstack.xinfini.sdk.pool.PoolCapacity; @@ -9,7 +10,7 @@ import java.util.ArrayList; import java.util.List; -public class XInfiniAddonInfo { +public class XInfiniAddonInfo implements AddonInfo { private List nodes; private List pools = new ArrayList<>(); @@ -72,6 +73,7 @@ public static class Node { private int id; private String ip; private String state; + private NodeStatus status; public String getIp() { return ip; @@ -97,6 +99,14 @@ public void setState(String state) { this.state = state; } + public NodeStatus getStatus() { + return status; + } + + public void setStatus(NodeStatus status) { + this.status = status; + } + public static Node valueOf(NodeModule nodeModule) { Node node = new Node(); node.setIp(nodeModule.getSpec().getAdminIp()); @@ -104,6 +114,7 @@ public static Node valueOf(NodeModule nodeModule) { node.setState(nodeModule.getMetadata().getState().getState()); return node; } + } public static class Pool { diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniConfig.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniConfig.java index 88b498ce9ef..bc1fc53c597 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniConfig.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniConfig.java @@ -52,15 +52,6 @@ public void setId(int id) { public static class Node { private String ip; private int port; - private NodeStatus status = NodeStatus.Connected; - - public NodeStatus getStatus() { - return status; - } - - public void setStatus(NodeStatus status) { - this.status = status; - } public String getIp() { return ip; diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index 4fb920421a7..fc9760ac341 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -1,7 +1,6 @@ package org.zstack.xinfini; import org.apache.commons.lang.StringUtils; -import org.apache.lucene.util.packed.DirectMonotonicReader; import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; @@ -9,7 +8,6 @@ import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.core.db.SQL; -import org.zstack.core.thread.ThreadFacade; import org.zstack.header.core.Completion; import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.errorcode.OperationFailureException; @@ -26,8 +24,6 @@ import org.zstack.iscsi.kvm.IscsiHeartbeatVolumeTO; import org.zstack.iscsi.kvm.IscsiVolumeTO; import org.zstack.kvm.KVMConstant; -import org.zstack.resourceconfig.ResourceConfigFacade; -import org.zstack.storage.addon.primary.ExternalPrimaryStorageFactory; import org.zstack.storage.volume.VolumeConfigsGetter; import org.zstack.utils.CollectionUtils; import org.zstack.utils.DebugUtils; @@ -69,15 +65,13 @@ public class XInfiniStorageController implements PrimaryStorageControllerSvc, Pr private static CLogger logger = Utils.getLogger(XInfiniStorageController.class); @Autowired + @Deprecated private DatabaseFacade dbf; - @Autowired - private ThreadFacade thdf; + private ExternalPrimaryStorageVO self; private XInfiniConfig config; private XInfiniAddonInfo addonInfo; private final XInfiniApiHelper apiHelper; - @Autowired - private ResourceConfigFacade rcf; private String vhostSocketDir; @@ -122,11 +116,20 @@ public XInfiniStorageController(ExternalPrimaryStorageVO self) { public XInfiniStorageController(String configStr) { config = JSONObjectUtil.toObject(configStr, XInfiniConfig.class); + XInfiniConnectConfig clientConfig = new XInfiniConnectConfig(); clientConfig.readTimeout = TimeUnit.MINUTES.toMillis(10); clientConfig.writeTimeout = TimeUnit.MINUTES.toMillis(10); clientConfig.token = config.getToken(); - clientConfig.xInfiniConfig = config; + clientConfig.connectedNodeProvider = () -> { + Set connectedIps = this.addonInfo.getNodes().stream() + .filter(it -> it.getStatus() == NodeStatus.Connected) + .map(XInfiniAddonInfo.Node::getIp) + .collect(Collectors.toSet()); + return this.config.getNodes().stream() + .filter(it -> connectedIps.contains(it.getIp())) + .findFirst().orElse(null); + }; XInfiniClient client = new XInfiniClient(); client.configure(clientConfig); @@ -505,20 +508,17 @@ public String getIdentity() { } @Override - public void ping(Completion completion) { + public void ping(ReturnValueCompletion completion) { reloadDbInfo(); Map nodesStatus = apiHelper.checkNodesConnection(config.getNodes()); logger.info(String.format("get nodes status: %s", nodesStatus)); - config.getNodes().forEach(it -> it.setStatus(nodesStatus.getOrDefault(it.getIp(), NodeStatus.Disconnected))); - SQL.New(ExternalPrimaryStorageVO.class).eq(ExternalPrimaryStorageVO_.uuid, self.getUuid()) - .set(ExternalPrimaryStorageVO_.config, JSONObjectUtil.toJsonString(config)) - .update(); - completion.success(); + addonInfo.getNodes().forEach(it -> it.setStatus(nodesStatus.getOrDefault(it.getIp(), NodeStatus.Disconnected))); + completion.success(new PingResult(addonInfo)); } @Override - public void connect(String config, String url, ReturnValueCompletion comp) { + public void connect(String config, String url, ReturnValueCompletion comp) { DebugUtils.Assert(StringUtils.isNotEmpty(config), "config cannot be none"); XInfiniAddonInfo info = new XInfiniAddonInfo(); XInfiniConfig xConfig = JSONObjectUtil.toObject(config, XInfiniConfig.class); @@ -534,6 +534,8 @@ public void connect(String config, String url, ReturnValueCompletion new OperationFailureException(operr("fail to get node %s details, check ip address and role config", it.getIp())))); info.setNodes(nodes.stream().map(XInfiniAddonInfo.Node::valueOf).collect(Collectors.toList())); + Map nodeIpStatus = apiHelper.checkNodesConnection(xConfig.getNodes()); + info.getNodes().forEach(it -> it.setStatus(nodeIpStatus.get(it.getIp()))); List pools = apiHelper.queryPools(); if (CollectionUtils.isEmpty(pools)) { @@ -549,7 +551,7 @@ public void connect(String config, String url, ReturnValueCompletion requiredUrls, ReturnValueCompletion comp) { - reloadDbInfo(); List pools = refreshPoolCapacity() .stream() .filter(it -> config.getPoolIds().contains(it.getId())) diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageFactory.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageFactory.java index 4faa1988e18..a21b84bf43d 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageFactory.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageFactory.java @@ -36,7 +36,7 @@ public PrimaryStorageNodeSvc buildNodeSvc(ExternalPrimaryStorageVO vo) { } @Override - public void discover(String url, String config, ReturnValueCompletion completion) { + public void discover(String url, String config, ReturnValueCompletion completion) { // xinfini must set config if (StringUtils.isEmpty(config)) { completion.fail(operr("empty config, cannot discover xinfini")); diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java index 8b486289dc7..3f15165b18f 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java @@ -6,15 +6,12 @@ import org.springframework.http.HttpMethod; import org.zstack.core.Platform; import org.zstack.externalStorage.sdk.ExternalStorageApiClient; -import org.zstack.externalStorage.sdk.ExternalStorageParam; import org.zstack.header.rest.DefaultSSLVerifier; import org.zstack.header.xinfini.XInfiniConstants; import org.zstack.utils.Utils; import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; -import org.zstack.xinfini.NodeStatus; import org.zstack.xinfini.XInfiniConfig; -import org.zstack.xinfini.sdk.volume.FlattenVolumeRequest; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.X509TrustManager; @@ -139,12 +136,7 @@ XinfiniApiResult doCallWithNode(XInfiniConfig.Node withNode) { if (withNode != null) { node = withNode; } else { - node = config.xInfiniConfig - .getNodes() - .stream() - .filter(it -> it.getStatus() == NodeStatus.Connected) - .findAny() - .orElseThrow(() -> new XInfiniApiException("No connected node found")); + node = config.connectedNodeProvider.get(); } try { diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniConnectConfig.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniConnectConfig.java index 43668787513..dc42fe54473 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniConnectConfig.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniConnectConfig.java @@ -3,6 +3,7 @@ import org.zstack.xinfini.XInfiniConfig; import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; public class XInfiniConnectConfig { public String hostname = "localhost"; @@ -12,7 +13,7 @@ public class XInfiniConnectConfig { public Long readTimeout; public Long writeTimeout; public String token; - public XInfiniConfig xInfiniConfig; + public Supplier connectedNodeProvider; public void setPort(int port) { this.port = port; diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/AddonInfo.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/AddonInfo.java index fba2dd72a67..1c72e7eaab5 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/AddonInfo.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/AddonInfo.java @@ -1,5 +1,7 @@ package org.zstack.storage.zbs; +import org.zstack.utils.gson.JSONObjectUtil; + import java.util.ArrayList; import java.util.List; @@ -7,7 +9,7 @@ * @author Xingwei Yu * @date 2024/4/1 18:12 */ -public class AddonInfo { +public class AddonInfo implements org.zstack.header.storage.addon.primary.AddonInfo { private ClusterInfo clusterInfo; private List mdsInfos = new ArrayList<>(); private List logicalPoolInfos = new ArrayList<>(); @@ -39,4 +41,9 @@ public void setLogicalPoolInfos(List logicalPoolInfos) { public void addLogicalPoolInfo(LogicalPoolInfo logicalPoolInfo) { this.logicalPoolInfos.add(logicalPoolInfo); } + + @Override + public boolean changed(String infoJson) { + return !JSONObjectUtil.toJsonString(this).equals(infoJson); + } } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 1812808c2a6..44c0b7337a7 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; +import org.zstack.cbd.*; import org.zstack.cbd.kvm.CbdHeartbeatVolumeTO; import org.zstack.cbd.kvm.CbdVolumeTo; import org.zstack.compute.host.HostGlobalConfig; @@ -74,6 +75,7 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar private static final CLogger logger = Utils.getLogger(ZbsStorageController.class); @Autowired + @Deprecated private DatabaseFacade dbf; @Autowired protected RESTFacade restf; @@ -372,7 +374,7 @@ public String getIdentity() { } @Override - public void connect(String cfg, String url, ReturnValueCompletion completion) { + public void connect(String cfg, String url, ReturnValueCompletion completion) { AddonInfo newAddonInfo = new AddonInfo(); Config current = JSONObjectUtil.toObject(cfg, Config.class); List mdsInfos = MdsInfo.valueOf(current.getMdsUrls()); @@ -526,7 +528,7 @@ public void done(ErrorCodeList errorCodeList) { @Override public void handle(Map data) { addonInfo = newAddonInfo; - completion.success(JSONObjectUtil.rehashObject(newAddonInfo, LinkedHashMap.class)); + completion.success(newAddonInfo); } }); @@ -541,7 +543,7 @@ public void handle(ErrorCode errCode, Map data) { } @Override - public void ping(Completion completion) { + public void ping(ReturnValueCompletion completion) { reloadDbInfo(); if (addonInfo == null || addonInfo.getClusterInfo() == null) { @@ -565,10 +567,6 @@ public void fail(ErrorCode errorCode) { })).run(new WhileDoneCompletion(completion) { @Override public void done(ErrorCodeList errorCodeList) { - SQL.New(ExternalPrimaryStorageVO.class).eq(ExternalPrimaryStorageVO_.uuid, self.getUuid()) - .set(ExternalPrimaryStorageVO_.addonInfo, JSONObjectUtil.toJsonString(addonInfo)) - .update(); - boolean isConnected = addonInfo.getMdsInfos().stream().anyMatch(mdsInfo -> MdsStatus.Connected.equals(mdsInfo.getStatus())); if (!isConnected) { String notConnectedIps = addonInfo.getMdsInfos().stream() @@ -576,10 +574,10 @@ public void done(ErrorCodeList errorCodeList) { .map(MdsInfo::getAddr) .collect(Collectors.joining(", ")); - completion.fail(operr("no MDS is Connected, the following MDS[%s] are not Connected.", notConnectedIps)); + completion.success(new PingResult(addonInfo, String.format("all MDS are not connected, disconnected MDS addresses: %s", notConnectedIps))); return; } - completion.success(); + completion.success(new PingResult(addonInfo)); } }); } @@ -592,7 +590,6 @@ public void getCapacity(List requiredUrls, ReturnValueCompletion comp) { - reloadDbInfo(); getPoolCapacities(config.getPoolNames(), comp); } @@ -603,6 +600,7 @@ private void getPoolCapacities(List poolNames, ReturnValueCompletion(comp) { @Override public void success(GetCapacityRsp returnValue) { + reloadDbInfo(); addonInfo.setLogicalPoolInfos(returnValue.getLogicalPoolInfos()); SQL.New(ExternalPrimaryStorageVO.class).eq(ExternalPrimaryStorageVO_.uuid, self.getUuid()) .set(ExternalPrimaryStorageVO_.addonInfo, JSONObjectUtil.toJsonString(addonInfo)) @@ -1217,6 +1215,18 @@ public void fail(ErrorCode errorCode) { }); } + + @Override + public void syncAddonInfo(String addonInfo) { + this.addonInfo = StringUtils.isEmpty(addonInfo) ? new AddonInfo() : JSONObjectUtil.toObject(addonInfo, AddonInfo.class); + } + + @Override + public void syncConfig(String config) { + this.config = StringUtils.isEmpty(config) ? new Config() : JSONObjectUtil.toObject(config, Config.class); + } + + @Deprecated private void reloadDbInfo() { self = dbf.reload(self); addonInfo = StringUtils.isEmpty(self.getAddonInfo()) ? new AddonInfo() : JSONObjectUtil.toObject(self.getAddonInfo(), AddonInfo.class); diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java index 0602c4dea88..9dab35c3ed0 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java @@ -1,38 +1,17 @@ package org.zstack.storage.zbs; import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.zstack.core.ansible.SshFileMd5Checker; -import org.zstack.core.cloudbus.CloudBus; -import org.zstack.core.db.Q; -import org.zstack.core.trash.StorageTrash; import org.zstack.externalStorage.primary.ExternalStorageFencerType; -import org.zstack.header.core.Completion; -import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.storage.addon.primary.*; -import org.zstack.header.storage.primary.DeleteVolumeBitsOnPrimaryStorageMsg; -import org.zstack.header.storage.primary.PrimaryStorageConstant; -import org.zstack.header.storage.snapshot.VolumeSnapshotAfterDeleteExtensionPoint; -import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; import org.zstack.header.volume.VolumeProtocol; -import org.zstack.header.volume.VolumeVO; -import org.zstack.header.volume.VolumeVO_; -import org.zstack.utils.ShellResult; -import org.zstack.utils.ShellUtils; import org.zstack.utils.Utils; import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; import org.zstack.utils.ssh.Ssh; import org.zstack.utils.ssh.SshResult; -import java.util.LinkedHashMap; import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import static org.zstack.storage.zbs.ZbsHelper.*; import static org.zstack.core.Platform.operr; @@ -57,7 +36,7 @@ public PrimaryStorageNodeSvc buildNodeSvc(ExternalPrimaryStorageVO vo) { } @Override - public void discover(String url, String config, ReturnValueCompletion completion) { + public void discover(String url, String config, ReturnValueCompletion completion) { AddonInfo addonInfo = new AddonInfo(); Config conf = JSONObjectUtil.toObject(config, Config.class); @@ -97,7 +76,7 @@ public void discover(String url, String config, ReturnValueCompletion(completion) { + controller.connect(config, self.getUrl(), new ReturnValueCompletion(completion) { @Override - public void success(LinkedHashMap addonInfo) { + public void success(AddonInfo addonInfo) { if (param.isNewAdded()) { controller.onFirstAdditionConfigure(new NopeCompletion()); } @@ -2007,6 +2011,19 @@ public void success(LinkedHashMap addonInfo) { .set(ExternalPrimaryStorageVO_.url, StringUtils.isEmpty(self.getUrl()) ? externalVO.getIdentity() + "://" + self.getUuid() : self.getUrl()) .update(); + + if (addonInfo != null && addonInfo.changed(externalVO.getAddonInfo())) { + String newAddonInfo = addonInfo.serialize(); + SQL.New(ExternalPrimaryStorageVO.class).eq(ExternalPrimaryStorageVO_.uuid, self.getUuid()) + .set(ExternalPrimaryStorageVO_.addonInfo, newAddonInfo) + .update(); + externalVO.setAddonInfo(newAddonInfo); + // fire event when addonInfo changed + ExternalPrimaryStorageCanonicalEvent.AddonInfoChangedData evtData = new org.zstack.storage.addon.primary.ExternalPrimaryStorageCanonicalEvent.AddonInfoChangedData(); + evtData.setUuid(self.getUuid()); + evtData.setAddonInfo(newAddonInfo); + evtf.fire(ExternalPrimaryStorageCanonicalEvent.ADDON_INFO_CHANGED_PATH, evtData); + } controller.setTrashExpireTime(PrimaryStorageGlobalConfig.TRASH_EXPIRATION_TIME.value(Integer.class), new NopeCompletion()); pingHook(completion); } @@ -2030,12 +2047,34 @@ public void setup() { @Override public void run(FlowTrigger trigger, Map data) { - controller.ping(new Completion(trigger) { + controller.ping(new ReturnValueCompletion(trigger) { @Override - public void success() { + public void success(PingResult ret) { + if (ret.getAddonInfo() != null && ret.getAddonInfo().changed(externalVO.getAddonInfo())) { + updateAddonInfo(ret.getAddonInfo()); + } + + if (!ret.isSuccess()) { + trigger.fail(operr("ping external primary storage[%s] failed, %s", self.getUuid(), ret.getError())); + return; + } + trigger.next(); } + private void updateAddonInfo(AddonInfo newAddonInfo) { + String newAddonInfoStr = newAddonInfo.serialize(); + externalVO.setAddonInfo(newAddonInfoStr); + SQL.New(ExternalPrimaryStorageVO.class).eq(ExternalPrimaryStorageVO_.uuid, self.getUuid()) + .set(ExternalPrimaryStorageVO_.addonInfo, newAddonInfoStr) + .update(); + + ExternalPrimaryStorageCanonicalEvent.AddonInfoChangedData evtData = new ExternalPrimaryStorageCanonicalEvent.AddonInfoChangedData(); + evtData.setUuid(self.getUuid()); + evtData.setAddonInfo(newAddonInfoStr); + evtf.fire(ExternalPrimaryStorageCanonicalEvent.ADDON_INFO_CHANGED_PATH, evtData); + } + @Override public void fail(ErrorCode errorCode) { trigger.fail(errorCode); diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageCanonicalEvent.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageCanonicalEvent.java new file mode 100644 index 00000000000..5fc99f89834 --- /dev/null +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageCanonicalEvent.java @@ -0,0 +1,26 @@ +package org.zstack.storage.addon.primary; + +public class ExternalPrimaryStorageCanonicalEvent { + public static final String ADDON_INFO_CHANGED_PATH = "/externalPrimaryStorage/addonInfo/changed"; + + public static class AddonInfoChangedData { + private String uuid; + private String addonInfo; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getAddonInfo() { + return addonInfo; + } + + public void setAddonInfo(String addonInfo) { + this.addonInfo = addonInfo; + } + } +} diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java index 8e715f6a6f5..f39e7bf60bb 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java @@ -6,10 +6,7 @@ import org.springframework.transaction.annotation.Transactional; import org.zstack.core.Platform; import org.zstack.core.asyncbatch.While; -import org.zstack.core.cloudbus.CloudBus; -import org.zstack.core.cloudbus.CloudBusCallBack; -import org.zstack.core.cloudbus.EventCallback; -import org.zstack.core.cloudbus.EventFacade; +import org.zstack.core.cloudbus.*; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; @@ -55,6 +52,7 @@ import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; +import javax.persistence.Tuple; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -132,11 +130,46 @@ public void beforeDeliveryMessage(Message msg) { return false; }, new APIAddPrimaryStorageEvent()); - evtf.on(PrimaryStorageCanonicalEvent.PRIMARY_STORAGE_DELETED_PATH, new EventCallback() { + bus.subscribeEvent(e -> { + if (e instanceof APIUpdateExternalPrimaryStorageEvent) { + APIUpdateExternalPrimaryStorageEvent evt = (APIUpdateExternalPrimaryStorageEvent) e; + if (evt.isSuccess() && evt.getInventory() != null) { + logger.debug("receive event, update external ps controller config."); + PrimaryStorageControllerSvc controller = controllers.get(evt.getInventory().getUuid()); + ExternalPrimaryStorageVO vo = dbf.findByUuid(evt.getInventory().getUuid(), ExternalPrimaryStorageVO.class); + if (controller != null) { + controller.syncConfig(vo.getConfig()); + controller.syncAddonInfo(vo.getAddonInfo()); + } else { + saveControllerIfNeed(vo); + } + } + } + + return false; + }, new APIUpdateExternalPrimaryStorageEvent()); + + evtf.on(PrimaryStorageCanonicalEvent.PRIMARY_STORAGE_DELETED_PATH, new EventCallback() { @Override - protected void run(Map tokens, Object data) { - PrimaryStorageCanonicalEvent.PrimaryStorageDeletedData d = (PrimaryStorageCanonicalEvent.PrimaryStorageDeletedData) data; - MultiNodeSingleFlightImpl.unregister(d.getPrimaryStorageUuid()); + protected void run(Map tokens, PrimaryStorageCanonicalEvent.PrimaryStorageDeletedData data) { + MultiNodeSingleFlightImpl.unregister(data.getPrimaryStorageUuid()); + } + }); + evtf.on(ExternalPrimaryStorageCanonicalEvent.ADDON_INFO_CHANGED_PATH, new EventCallback() { + @Override + protected void run(Map tokens, ExternalPrimaryStorageCanonicalEvent.AddonInfoChangedData data) { + if (evtf.isFromThisManagementNode(tokens)) { + return; + } + + PrimaryStorageControllerSvc controller = controllers.get(data.getUuid()); + Tuple t = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.config, ExternalPrimaryStorageVO_.addonInfo) + .eq(ExternalPrimaryStorageVO_.uuid, data.getUuid()) + .findTuple(); + if (controller != null) { + controller.syncConfig(t.get(0, String.class)); + controller.syncAddonInfo(t.get(1, String.class)); + } } }); diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageManagerImpl.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageManagerImpl.java index 0881cefa572..591f7c8982e 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageManagerImpl.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageManagerImpl.java @@ -83,11 +83,11 @@ private void handle(APIDiscoverExternalPrimaryStorageMsg msg) { if (msg.getIdentity() != null) { ExternalPrimaryStorageSvcBuilder builder = pluginRgty.getExtensionFromMap(msg.getIdentity(), ExternalPrimaryStorageSvcBuilder.class); - builder.discover(msg.getUrl(), msg.getConfig(), new ReturnValueCompletion(msg) { + builder.discover(msg.getUrl(), msg.getConfig(), new ReturnValueCompletion(msg) { @Override - public void success(LinkedHashMap addonInfo) { + public void success(AddonInfo addonInfo) { inventory.setIdentity(msg.getIdentity()); - inventory.setAddonInfo(addonInfo); + inventory.setAddonInfo(JSONObjectUtil.rehashObject(addonInfo, LinkedHashMap.class)); event.setInventory(inventory); bus.publish(event); } @@ -102,11 +102,11 @@ public void fail(ErrorCode errorCode) { } new While<>(pluginRgty.getExtensionList(ExternalPrimaryStorageSvcBuilder.class)).each((builder, comp) -> { - builder.discover(msg.getUrl(), msg.getConfig(), new ReturnValueCompletion(comp) { + builder.discover(msg.getUrl(), msg.getConfig(), new ReturnValueCompletion(comp) { @Override - public void success(LinkedHashMap addonInfo) { + public void success(AddonInfo addonInfo) { inventory.setIdentity(builder.getIdentity()); - inventory.setAddonInfo(addonInfo); + inventory.setAddonInfo(JSONObjectUtil.rehashObject(addonInfo, LinkedHashMap.class)); event.setInventory(inventory); comp.allDone(); } diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index b546772215b..703d4ce3dde 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -1,6 +1,8 @@ package org.zstack.test.integration.storage.primary.addon.zbs import org.springframework.http.HttpEntity +import org.zstack.core.cloudbus.EventCallback +import org.zstack.core.cloudbus.EventFacade import org.zstack.core.db.Q import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageSpaceVO @@ -14,6 +16,7 @@ import org.zstack.header.storage.primary.PrimaryStorageStatus import org.zstack.storage.zbs.MdsUri import org.zstack.sdk.* import org.zstack.storage.addon.primary.ExternalPrimaryStorageSystemTags +import org.zstack.storage.addon.primary.ExternalPrimaryStorageCanonicalEvent import org.zstack.storage.primary.PrimaryStorageGlobalConfig import org.zstack.header.storage.primary.PrimaryStorageHostStatus import org.zstack.storage.volume.VolumeGlobalConfig @@ -41,6 +44,7 @@ class ZbsPrimaryStorageCase extends SubCase { DiskOfferingInventory diskOffering VolumeInventory vol, vol2 KVMHostInventory kvm + EventFacade evtf @Override void clean() { @@ -158,6 +162,7 @@ class ZbsPrimaryStorageCase extends SubCase { ps = env.inventoryByName("zbs-1") as PrimaryStorageInventory diskOffering = env.inventoryByName("diskOffering") as DiskOfferingInventory kvm = env.inventoryByName("kvm-1") as KVMHostInventory + evtf = bean(EventFacade.class) testDefaultConfig() testUpdateExternalPrimaryStorage() @@ -363,6 +368,17 @@ class ZbsPrimaryStorageCase extends SubCase { } void testMdsPing() { + ExternalPrimaryStorageCanonicalEvent.AddonInfoChangedData data = null + long count = 0 + EventCallback callback = new EventCallback() { + @Override + protected void run(Map tokens, ExternalPrimaryStorageCanonicalEvent.AddonInfoChangedData d) { + data = d + count++ + } + } + + evtf.on(ExternalPrimaryStorageCanonicalEvent.ADDON_INFO_CHANGED_PATH, callback) PrimaryStorageGlobalConfig.PING_INTERVAL.updateValue(1) Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Connected @@ -375,6 +391,7 @@ class ZbsPrimaryStorageCase extends SubCase { "{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"}]," + "\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}," + "{\"physicalPoolID\":2,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":2,\"usedSize\":123456789,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":123456789,\"physicalPoolName\":\"pool2\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool2\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":987654321}]}" + assert data == null env.afterSimulator(ZbsPrimaryStorageMdsBase.PING_PATH) { rsp, HttpEntity e -> def cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) @@ -399,6 +416,8 @@ class ZbsPrimaryStorageCase extends SubCase { "{\"physicalPoolID\":2,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":2,\"usedSize\":123456789,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":123456789,\"physicalPoolName\":\"pool2\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool2\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":987654321}]}" assert Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Connected + assert count == 1 + assert data.uuid == ps.uuid env.afterSimulator(ZbsPrimaryStorageMdsBase.PING_PATH) { rsp, HttpEntity e -> def cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) @@ -417,7 +436,7 @@ class ZbsPrimaryStorageCase extends SubCase { return pingRsp } - sleep(2000) + sleep(2500) addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() @@ -429,6 +448,8 @@ class ZbsPrimaryStorageCase extends SubCase { "{\"physicalPoolID\":2,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":2,\"usedSize\":123456789,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":123456789,\"physicalPoolName\":\"pool2\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool2\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":987654321}]}" assert Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Disconnected + assert count == 2 + assert data.uuid == ps.uuid env.cleanAfterSimulatorHandlers() From bcf3380ebb7ba324e0a5feb28a1e8ede587ec14a Mon Sep 17 00:00:00 2001 From: J M Date: Mon, 29 Dec 2025 16:18:48 +0800 Subject: [PATCH 672/737] [zbs]: fix mds connect failed partially 1. addon info must be timely after mds connect failed 2. ping agent should return mds agent version. Resolves: ZSTAC-80930 Change-Id: I62636a6c7266686572756b6b66756f71746d7a66 --- .../storage/zbs/ZbsPrimaryStorageMdsBase.java | 43 +++++++++- .../storage/zbs/ZbsStorageController.java | 6 +- .../addon/zbs/ZbsPrimaryStorageCase.groovy | 78 +++++++++++++++---- .../testlib/ExternalPrimaryStorageSpec.groovy | 15 +++- 4 files changed, 123 insertions(+), 19 deletions(-) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java index cdcef665eb7..86a57a6ab6e 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java @@ -7,6 +7,7 @@ import org.zstack.core.ansible.*; import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.CloudBusGlobalProperty; +import org.zstack.core.db.DatabaseFacade; import org.zstack.core.thread.ChainTask; import org.zstack.core.thread.SyncTaskChain; import org.zstack.core.thread.ThreadFacade; @@ -43,8 +44,13 @@ public class ZbsPrimaryStorageMdsBase extends ZbsMdsBase { private String syncId; @Autowired + @Deprecated private ThreadFacade thdf; + @Autowired + @Deprecated + private DatabaseFacade dbf; + public static final String ECHO_PATH = "/zbs/primarystorage/echo"; public static final String PING_PATH = "/zbs/primarystorage/ping"; public static final String SYNC_METADATA_PATH = "/zbs/primarystorage/metadata/sync"; @@ -199,10 +205,18 @@ public void fail(ErrorCode errorCode) { public void run(FlowTrigger trigger, Map data) { SyncMetadataCmd cmd = new SyncMetadataCmd(); cmd.setAddr(getSelf().getAddr()); + // TODO: use agent version not zstack version + cmd.setAgentVersion(dbf.getDbVersion()); restf.asyncJsonPost(ZbsAgentUrl.primaryStorageUrl(getSelf().getAddr(), SYNC_METADATA_PATH), cmd, new JsonAsyncRESTCallback(trigger) { @Override public void success(SyncMetadataRsp ret) { + if (!ret.isSuccess()) { + trigger.fail(operr("unable to sync metadata from ZBS primary storage MDS[%s], because %s", + getSelf().getAddr(), ret.getError())); + return; + } + getSelf().setExternalAddr(ret.getExternalAddr()); trigger.next(); } @@ -310,6 +324,7 @@ private void pingMds(ClusterInfo clusterInfo, final Completion completion) { stepCount.add(i); } + String[] version = new String[1]; new While<>(stepCount).each((step, comp) -> { PingCmd cmd = new PingCmd(); cmd.setClusterInfo(clusterInfo); @@ -318,7 +333,8 @@ private void pingMds(ClusterInfo clusterInfo, final Completion completion) { cmd, new JsonAsyncRESTCallback(completion) { @Override public void success(PingRsp rsp) { - if (rsp.isSuccess()){ + if (rsp.isSuccess()) { + version[0] = rsp.agentVersion; comp.allDone(); return; } @@ -358,12 +374,28 @@ public void done(ErrorCodeList errorCodeList) { completion.fail(errorCodeList.getCauses().get(0)); return; } + + if (!dbf.getDbVersion().equals(version[0])) { + completion.fail(operr("ZBS primary storage MDS[%s] version[%s] is different" + + " from management node[%s], please reconnect the MDS and check SSH connection", + getSelf().getAddr(), version[0], dbf.getDbVersion())); + return; + } completion.success(); } }); } public static class PingRsp extends ZbsMdsBase.AgentResponse { + private String agentVersion; + + public void setAgentVersion(String agentVersion) { + this.agentVersion = agentVersion; + } + + public String getAgentVersion() { + return agentVersion; + } } public static class PingCmd extends ZbsMdsBase.AgentCommand { @@ -391,6 +423,15 @@ public void setExternalAddr(String externalAddr) { } public static class SyncMetadataCmd extends ZbsMdsBase.AgentCommand { + private String agentVersion; + + public void setAgentVersion(String agentVersion) { + this.agentVersion = agentVersion; + } + + public String getAgentVersion() { + return agentVersion; + } } @Override diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 9a0bdef17e7..f89c3c95d3d 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -78,10 +78,10 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar @Deprecated private DatabaseFacade dbf; @Autowired - protected RESTFacade restf; - @Autowired + @Deprecated private ResourceConfigFacade rcf; @Autowired + @Deprecated private CloudBus bus; private ExternalPrimaryStorageVO self; @@ -403,6 +403,7 @@ void connect(final FlowTrigger trigger) { trigger.fail(operr("ZBS primary storage[uuid:%s] may have been deleted", self.getUuid())); } else { self = vo; + addonInfo = newAddonInfo; trigger.next(); } } @@ -436,7 +437,6 @@ public void setup() { @Override public void run(FlowTrigger trigger, Map data) { new Connector().connect(trigger); - addonInfo = newAddonInfo; } }); diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index 703d4ce3dde..b4e6a09db13 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -166,6 +166,7 @@ class ZbsPrimaryStorageCase extends SubCase { testDefaultConfig() testUpdateExternalPrimaryStorage() + testMdsConnectFailed() testLifecycle() testDataVolumeLifecycle() testMdsPing() @@ -291,13 +292,13 @@ class ZbsPrimaryStorageCase extends SubCase { Q.New(ExternalPrimaryStorageVO.class) .select(ExternalPrimaryStorageVO_.config) .eq(ExternalPrimaryStorageVO_.uuid, ps.uuid) - .findValue(), + .findValue().toString(), Config.class) AddonInfo info = JSONObjectUtil.toObject( Q.New(ExternalPrimaryStorageVO.class) .select(ExternalPrimaryStorageVO_.addonInfo) .eq(ExternalPrimaryStorageVO_.uuid, ps.uuid) - .findValue(), + .findValue().toString(), AddonInfo.class) assert config.pools.size() == 2 assert info.logicalPoolInfos.size() == 2 @@ -306,6 +307,59 @@ class ZbsPrimaryStorageCase extends SubCase { } } + void testMdsConnectFailed() { + env.afterSimulator(ZbsPrimaryStorageMdsBase.SYNC_METADATA_PATH) { rsp, HttpEntity e -> + def cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.SyncMetadataCmd.class) + if (!cmd.addr.equals("127.0.1.1")) { + rsp.setError("on purpose") + } + return rsp + } + + env.afterSimulator(ZbsStorageController.GET_CAPACITY_PATH) { rsp, HttpEntity e -> + def cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.GetCapacityCmd) + if (!cmd.addr.equals("127.0.1.1")) { + rsp.setError("on purpose") + } + return rsp + } + + env.afterSimulator(ZbsPrimaryStorageMdsBase.PING_PATH) { rsp, HttpEntity e -> + def cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) + if (!cmd.addr.equals("127.0.1.1")) { + rsp.agentVersion = null + } + + return rsp + } + + reconnectPrimaryStorage { + uuid = ps.uuid + } + + AddonInfo addonInfo = JSONObjectUtil.toObject( + Q.New(ExternalPrimaryStorageVO.class) + .select(ExternalPrimaryStorageVO_.addonInfo) + .eq(ExternalPrimaryStorageVO_.uuid, ps.uuid) + .findValue().toString(), + AddonInfo.class) + assert addonInfo.mdsInfos.findAll { it.status.toString() == "Disconnected" }.size() == 2 + + env.cleanAfterSimulatorHandlers() + + reconnectPrimaryStorage { + uuid = ps.uuid + } + + addonInfo = JSONObjectUtil.toObject( + Q.New(ExternalPrimaryStorageVO.class) + .select(ExternalPrimaryStorageVO_.addonInfo) + .eq(ExternalPrimaryStorageVO_.uuid, ps.uuid) + .findValue().toString(), + AddonInfo.class) + assert addonInfo.mdsInfos.findAll { it.status.toString() == "Connected" }.size() == 3 + } + void testDefaultConfig() { def rc = getResourceConfig { category = VolumeGlobalConfig.CATEGORY @@ -395,13 +449,12 @@ class ZbsPrimaryStorageCase extends SubCase { env.afterSimulator(ZbsPrimaryStorageMdsBase.PING_PATH) { rsp, HttpEntity e -> def cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) - ZbsPrimaryStorageMdsBase.PingRsp pingRsp = new ZbsPrimaryStorageMdsBase.PingRsp() if (cmd.addr.equals("127.0.1.1")) { - pingRsp.success = false - pingRsp.error = "on purpose" + rsp.success = false + rsp.error = "on purpose" } - return pingRsp + return rsp } sleep(2000) @@ -421,16 +474,15 @@ class ZbsPrimaryStorageCase extends SubCase { env.afterSimulator(ZbsPrimaryStorageMdsBase.PING_PATH) { rsp, HttpEntity e -> def cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) - ZbsPrimaryStorageMdsBase.PingRsp pingRsp = new ZbsPrimaryStorageMdsBase.PingRsp() if (cmd.addr.equals("127.0.1.1")) { - pingRsp.success = false - pingRsp.error = "on purpose" + rsp.success = false + rsp.error = "on purpose" } else if (cmd.addr.equals("127.0.1.2")) { - pingRsp.success = false - pingRsp.error = "on purpose" + rsp.success = false + rsp.error = "on purpose" } else if (cmd.addr.equals("127.0.1.3")) { - pingRsp.success = false - pingRsp.error = "on purpose" + rsp.success = false + rsp.error = "on purpose" } return pingRsp diff --git a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy index ca2b74ea492..ef70f3e7ad3 100644 --- a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy @@ -1,6 +1,8 @@ package org.zstack.testlib import org.springframework.http.HttpEntity +import org.zstack.core.db.DatabaseFacade +import org.zstack.kvm.KVMAgentCommands import org.zstack.storage.zbs.LogicalPoolInfo import org.zstack.cbd.kvm.KvmCbdCommands import org.zstack.sdk.PrimaryStorageInventory @@ -11,6 +13,8 @@ import org.zstack.utils.data.SizeUnit import org.zstack.utils.logging.CLogger import org.zstack.utils.gson.JSONObjectUtil +import java.util.concurrent.ConcurrentHashMap + /** * @author Xingwei Yu * @date 2024/4/19 下午2:28 @@ -18,6 +22,9 @@ import org.zstack.utils.gson.JSONObjectUtil class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { private static final CLogger logger = Utils.getLogger(ExternalPrimaryStorageSpec.class); + + static ConcurrentHashMap mdsAddrVersionHashMap = new ConcurrentHashMap<>() + @SpecParam(required = true) String identity @SpecParam(required = true) @@ -46,16 +53,20 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { return [:] } - simulator(ZbsPrimaryStorageMdsBase.PING_PATH) { + simulator(ZbsPrimaryStorageMdsBase.PING_PATH) { HttpEntity e -> + def cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) ZbsPrimaryStorageMdsBase.PingRsp rsp = new ZbsPrimaryStorageMdsBase.PingRsp() rsp.success = true + rsp.agentVersion = mdsAddrVersionHashMap.get(cmd.addr) return rsp } - simulator(ZbsPrimaryStorageMdsBase.SYNC_METADATA_PATH) { + simulator(ZbsPrimaryStorageMdsBase.SYNC_METADATA_PATH) { HttpEntity e -> + def cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.SyncMetadataCmd.class) ZbsPrimaryStorageMdsBase.SyncMetadataRsp rsp = new ZbsPrimaryStorageMdsBase.SyncMetadataRsp() rsp.success = true rsp.externalAddr = "127.0.0.1" + mdsAddrVersionHashMap.put(cmd.addr, cmd.agentVersion) return rsp } From 4f7b55044636c1e2c35712a617f31f03c9382f49 Mon Sep 17 00:00:00 2001 From: lianghy Date: Tue, 30 Dec 2025 17:19:20 +0800 Subject: [PATCH 673/737] [mevoco]: add API to retrieve detailed license config for nodes Resolves: ZSTAC-80883 Change-Id: I697a80883c71676c657a6b786570637862626b66 --- .../GetLicenseNodeUsageDetailsAction.java | 95 +++++++++++++++++++ .../GetLicenseNodeUsageDetailsResult.java | 31 ++++++ .../java/org/zstack/testlib/ApiHelper.groovy | 27 ++++++ 3 files changed, 153 insertions(+) create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseNodeUsageDetailsAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseNodeUsageDetailsResult.java diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseNodeUsageDetailsAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseNodeUsageDetailsAction.java new file mode 100644 index 00000000000..68d804723ff --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseNodeUsageDetailsAction.java @@ -0,0 +1,95 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetLicenseNodeUsageDetailsAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.license.api.server.GetLicenseNodeUsageDetailsResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String nodeUuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.license.api.server.GetLicenseNodeUsageDetailsResult value = res.getResult(org.zstack.sdk.license.api.server.GetLicenseNodeUsageDetailsResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.GetLicenseNodeUsageDetailsResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/license/node/usage/details"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseNodeUsageDetailsResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseNodeUsageDetailsResult.java new file mode 100644 index 00000000000..506fe633a69 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseNodeUsageDetailsResult.java @@ -0,0 +1,31 @@ +package org.zstack.sdk.license.api.server; + +import org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory; +import org.zstack.sdk.LicenseInventory; + +public class GetLicenseNodeUsageDetailsResult { + public LicenseAuthorizedNodeInventory nodeInventory; + public void setNodeInventory(LicenseAuthorizedNodeInventory nodeInventory) { + this.nodeInventory = nodeInventory; + } + public LicenseAuthorizedNodeInventory getNodeInventory() { + return this.nodeInventory; + } + + public LicenseInventory platformLicense; + public void setPlatformLicense(LicenseInventory platformLicense) { + this.platformLicense = platformLicense; + } + public LicenseInventory getPlatformLicense() { + return this.platformLicense; + } + + public java.util.List addOns; + public void setAddOns(java.util.List addOns) { + this.addOns = addOns; + } + public java.util.List getAddOns() { + return this.addOns; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 745e26949e6..a77924c67b7 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -51345,6 +51345,33 @@ abstract class ApiHelper { } + def getLicenseNodeUsageDetails(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.GetLicenseNodeUsageDetailsAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.GetLicenseNodeUsageDetailsAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def isLicenseServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.IsLicenseServerAction.class) Closure c) { def a = new org.zstack.sdk.license.api.server.IsLicenseServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid From bb55f16d9388622352a56434b6397cba0141dc76 Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Mon, 29 Dec 2025 16:22:16 +0800 Subject: [PATCH 674/737] [virtualRouterProvider]: fix backup lb vip create after migrate Resolves: ZSTAC-80297 Change-Id: I6868776ca97e4ba3764a4f288f2824421c9e891e --- .../appliancevm/ApplianceVmConstant.java | 2 ++ .../VirtualRouterManagerImpl.java | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmConstant.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmConstant.java index 7aaa282d77d..1d3f453f312 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmConstant.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmConstant.java @@ -10,6 +10,8 @@ public class ApplianceVmConstant { public static final String APPLIANCE_VM_TYPE = "ApplianceVm"; public static final String SERVICE_ID = "applianceVm"; + public static final String APPLIANCE_VM_TYPE_SLB = "SLB"; + public static final String KVM_CHANNEL_AGENT_PATH = "/var/lib/zstack/kvm/agentSocket"; public static final String KVM_CHANNEL_QEMU_GA_PATH = "/var/lib/libvirt/qemu"; diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java index e5880b3f835..44a997a68ed 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java @@ -91,6 +91,7 @@ import java.util.stream.Collectors; import static java.util.Arrays.asList; +import static org.zstack.appliancevm.ApplianceVmConstant.APPLIANCE_VM_TYPE_SLB; import static org.zstack.compute.vm.VmSystemTags.MACHINE_TYPE_TOKEN; import static org.zstack.core.Platform.*; import static org.zstack.core.progress.ProgressReportService.createSubTaskProgress; @@ -2662,7 +2663,13 @@ public void afterMigrateVm(VmInstanceInventory inv, String srcHostUuid, NoErrorC completion.done(); return; } - List vips = findVipsOnVirtualRouter(vfNics, inv.getUuid()); + boolean skipSlbServiceProviderVip = false; + ApplianceVmVO apvm = dbf.findByUuid(inv.getUuid(), ApplianceVmVO.class); + if (apvm != null + && APPLIANCE_VM_TYPE_SLB.equals(apvm.getApplianceVmType())) { + skipSlbServiceProviderVip = true; + } + List vips = findVipsOnVirtualRouter(vfNics, inv.getUuid(), skipSlbServiceProviderVip); if (vips.isEmpty()) { completion.done(); return; @@ -2717,7 +2724,7 @@ public void run(MessageReply reply) { }); } - private List findVipsOnVirtualRouter(List vfNics, String vrUuid) { + private List findVipsOnVirtualRouter(List vfNics, String vrUuid, boolean skipSlbServiceProviderVip) { List l3Uuids = vfNics.stream().map(VmNicInventory::getL3NetworkUuid).collect(Collectors.toList()); List l3Networks = Q.New(L3NetworkVO.class).in(L3NetworkVO_.uuid, l3Uuids).list(); @@ -2781,6 +2788,14 @@ private List findVipsOnVirtualRouter(List vfNics, String } List vips = Q.New(VipVO.class).in(VipVO_.uuid, filteredVipUuids).list(); + if (skipSlbServiceProviderVip) { + vips = vips.stream() + .filter(vip -> !APPLIANCE_VM_TYPE_SLB.equals(vip.getServiceProvider())) + .collect(Collectors.toList()); + if (vips.isEmpty()) { + return new ArrayList<>(); + } + } VirtualRouterVmInventory vr = VirtualRouterVmInventory.valueOf((VirtualRouterVmVO) Q.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, vrUuid).find()); From 341d548fb56c1f1e85b12323e7aba4a4209a14f6 Mon Sep 17 00:00:00 2001 From: lianghy Date: Tue, 30 Dec 2025 18:20:51 +0800 Subject: [PATCH 675/737] [conf]: bump version to 5.5.0 DBImpact Resolves: ZSTAC-80878 Change-Id: I6f75717a68626f7165696f6f646f68686e64646e --- VERSION | 4 ++-- abstraction/pom.xml | 2 +- build/pom.xml | 2 +- compute/pom.xml | 2 +- configuration/pom.xml | 2 +- console/pom.xml | 2 +- .../main/java/org/zstack/console/ConsoleGlobalProperty.java | 2 +- core/pom.xml | 2 +- .../java/org/zstack/core/ansible/AnsibleGlobalProperty.java | 2 +- externalservice/pom.xml | 2 +- header/pom.xml | 4 ++-- identity/pom.xml | 2 +- image/pom.xml | 2 +- longjob/pom.xml | 2 +- network/pom.xml | 2 +- plugin/acl/pom.xml | 2 +- plugin/applianceVm/pom.xml | 2 +- .../org/zstack/appliancevm/ApplianceVmGlobalProperty.java | 2 +- plugin/cbd/pom.xml | 2 +- plugin/ceph/pom.xml | 2 +- .../main/java/org/zstack/storage/ceph/CephGlobalProperty.java | 4 ++-- plugin/directory/pom.xml | 2 +- plugin/eip/pom.xml | 2 +- plugin/expon/pom.xml | 2 +- plugin/externalStorage/pom.xml | 2 +- plugin/flatNetworkProvider/pom.xml | 2 +- plugin/hostNetworkInterface/pom.xml | 2 +- plugin/iscsi/pom.xml | 2 +- plugin/kvm/pom.xml | 2 +- .../kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java | 2 +- plugin/ldap/pom.xml | 2 +- plugin/loadBalancer/pom.xml | 2 +- plugin/localstorage/pom.xml | 2 +- plugin/loginPlugin/pom.xml | 2 +- plugin/mediator/pom.xml | 2 +- plugin/nfsPrimaryStorage/pom.xml | 2 +- plugin/pom.xml | 2 +- plugin/portForwarding/pom.xml | 2 +- plugin/sdnController/pom.xml | 2 +- plugin/securityGroup/pom.xml | 2 +- plugin/sftpBackupStorage/pom.xml | 2 +- .../storage/backup/sftp/SftpBackupStorageGlobalProperty.java | 2 +- plugin/sharedMountPointPrimaryStorage/pom.xml | 2 +- plugin/sshKeyPair/pom.xml | 2 +- plugin/sugonSdnController/pom.xml | 2 +- plugin/vhost/pom.xml | 2 +- plugin/vip/pom.xml | 2 +- plugin/virtualRouterProvider/pom.xml | 2 +- .../service/virtualrouter/VirtualRouterGlobalProperty.java | 2 +- plugin/vxlan/pom.xml | 2 +- plugin/xinfini/pom.xml | 2 +- plugin/zbs/pom.xml | 2 +- .../main/java/org/zstack/storage/zbs/ZbsGlobalProperty.java | 2 +- pom.xml | 2 +- portal/pom.xml | 2 +- resourceconfig/pom.xml | 2 +- rest/pom.xml | 2 +- sdk/pom.xml | 2 +- search/pom.xml | 2 +- simulator/pom.xml | 2 +- simulator/simulatorHeader/pom.xml | 2 +- simulator/simulatorImpl/pom.xml | 2 +- storage/pom.xml | 2 +- tag/pom.xml | 2 +- test/pom.xml | 2 +- testlib/pom.xml | 2 +- utils/pom.xml | 2 +- 67 files changed, 70 insertions(+), 70 deletions(-) diff --git a/VERSION b/VERSION index 8577c9efcfb..61dd093f04e 100755 --- a/VERSION +++ b/VERSION @@ -1,3 +1,3 @@ MAJOR=5 -MINOR=4 -UPDATE=6 +MINOR=5 +UPDATE=0 diff --git a/abstraction/pom.xml b/abstraction/pom.xml index 4e18325c587..f43ae6f7e96 100644 --- a/abstraction/pom.xml +++ b/abstraction/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 .. 4.0.0 diff --git a/build/pom.xml b/build/pom.xml index c2eb9f2cbbc..4e3d0cf35ca 100755 --- a/build/pom.xml +++ b/build/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 .. build diff --git a/compute/pom.xml b/compute/pom.xml index e87ed4a4b12..d7543119ad7 100755 --- a/compute/pom.xml +++ b/compute/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 .. compute diff --git a/configuration/pom.xml b/configuration/pom.xml index 8ce34186f80..d8e7e387489 100755 --- a/configuration/pom.xml +++ b/configuration/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 .. configuration diff --git a/console/pom.xml b/console/pom.xml index 47806cb4219..48ea5bcd42c 100755 --- a/console/pom.xml +++ b/console/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java b/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java index 418f30ba433..89be0f362d0 100644 --- a/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java +++ b/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java @@ -9,7 +9,7 @@ */ @GlobalPropertyDefinition public class ConsoleGlobalProperty { - @GlobalProperty(name="ConsoleProxy.agentPackageName", defaultValue = "consoleproxy-5.4.0.tar.gz") + @GlobalProperty(name="ConsoleProxy.agentPackageName", defaultValue = "consoleproxy-5.5.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="MN.network.", defaultValue = "") public static List MN_NETWORKS; diff --git a/core/pom.xml b/core/pom.xml index 0afa4e8b387..f25d426bb85 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.zstack - 5.4.0 + 5.5.0 .. zstack diff --git a/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java b/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java index 0dfc6c0d2da..aa45130e138 100755 --- a/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java +++ b/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java @@ -9,7 +9,7 @@ public class AnsibleGlobalProperty { @GlobalProperty(name = "Ansible.executable", defaultValue = "python") public static String EXECUTABLE; - @GlobalProperty(name = "Ansible.zstacklibPackageName", defaultValue = "zstacklib-5.4.0.tar.gz") + @GlobalProperty(name = "Ansible.zstacklibPackageName", defaultValue = "zstacklib-5.5.0.tar.gz") public static String ZSTACKLIB_PACKAGE_NAME; @GlobalProperty(name = "Ansible.zstackRoot", defaultValue = "/var/lib/zstack") public static String ZSTACK_ROOT; diff --git a/externalservice/pom.xml b/externalservice/pom.xml index 5059f579ce7..9346a6ff780 100755 --- a/externalservice/pom.xml +++ b/externalservice/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/header/pom.xml b/header/pom.xml index fcd0550be05..9c7bb823e76 100755 --- a/header/pom.xml +++ b/header/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 .. header @@ -151,7 +151,7 @@ org.zstack abstraction - 5.4.0 + 5.5.0 diff --git a/identity/pom.xml b/identity/pom.xml index 2f06a0008cb..8f963f0e697 100755 --- a/identity/pom.xml +++ b/identity/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 .. identity diff --git a/image/pom.xml b/image/pom.xml index 917fbc74fac..63bdc6a064f 100755 --- a/image/pom.xml +++ b/image/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 .. image diff --git a/longjob/pom.xml b/longjob/pom.xml index 867476237b4..3006e2f90a4 100755 --- a/longjob/pom.xml +++ b/longjob/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 .. longjob diff --git a/network/pom.xml b/network/pom.xml index 009efab142c..d51e13e2245 100755 --- a/network/pom.xml +++ b/network/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 .. network diff --git a/plugin/acl/pom.xml b/plugin/acl/pom.xml index 1af18880f15..9653ec4e982 100644 --- a/plugin/acl/pom.xml +++ b/plugin/acl/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/plugin/applianceVm/pom.xml b/plugin/applianceVm/pom.xml index d6529929856..72613eb9881 100755 --- a/plugin/applianceVm/pom.xml +++ b/plugin/applianceVm/pom.xml @@ -6,7 +6,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 .. applianceVm diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java index 6658e2608fe..2f0f9f542d2 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java @@ -11,7 +11,7 @@ public class ApplianceVmGlobalProperty { public static boolean NO_ROLLBACK_ON_POST_FAILURE; @GlobalProperty(name = "ApplianceVm.connectVerbose", defaultValue = "false") public static boolean CONNECT_VERBOSE; - @GlobalProperty(name="ApplianceVm.agentPackageName", defaultValue = "appliancevm-5.4.0.tar.gz") + @GlobalProperty(name="ApplianceVm.agentPackageName", defaultValue = "appliancevm-5.5.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="ApplianceVm.agentPort", defaultValue = "7759") public static int AGENT_PORT; diff --git a/plugin/cbd/pom.xml b/plugin/cbd/pom.xml index cdd77c86b4b..119a099cab4 100644 --- a/plugin/cbd/pom.xml +++ b/plugin/cbd/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.4.0 + 5.5.0 cbd diff --git a/plugin/ceph/pom.xml b/plugin/ceph/pom.xml index 4bf8fde202f..6370dc22be9 100755 --- a/plugin/ceph/pom.xml +++ b/plugin/ceph/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java index 4219f67cc33..5cc5b1a5da3 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java @@ -18,13 +18,13 @@ public class CephGlobalProperty { public static String PRIMARY_STORAGE_AGENT_URL_ROOT_PATH; @GlobalProperty(name="Ceph.primaryStorageAgent.port", defaultValue = "7762") public static int PRIMARY_STORAGE_AGENT_PORT; - @GlobalProperty(name="Ceph.backupStorage.agentPackageName", defaultValue = "cephbackupstorage-5.4.0.tar.gz") + @GlobalProperty(name="Ceph.backupStorage.agentPackageName", defaultValue = "cephbackupstorage-5.5.0.tar.gz") public static String BACKUP_STORAGE_PACKAGE_NAME; @GlobalProperty(name="Ceph.backupStorage.ansiblePlaybook", defaultValue = "cephb.py") public static String BACKUP_STORAGE_PLAYBOOK_NAME; @GlobalProperty(name="Ceph.backupStorage.ansibleModulePath", defaultValue = "ansible/cephb") public static String BACKUP_STORAGE_MODULE_PATH; - @GlobalProperty(name="Ceph.primaryStorage.agentPackageName", defaultValue = "cephprimarystorage-5.4.0.tar.gz") + @GlobalProperty(name="Ceph.primaryStorage.agentPackageName", defaultValue = "cephprimarystorage-5.5.0.tar.gz") public static String PRIMARY_STORAGE_PACKAGE_NAME; @GlobalProperty(name="Ceph.primaryStorage.ansiblePlaybook", defaultValue = "cephp.py") public static String PRIMARY_STORAGE_PLAYBOOK_NAME; diff --git a/plugin/directory/pom.xml b/plugin/directory/pom.xml index 17d8f511076..ae7c46506f2 100644 --- a/plugin/directory/pom.xml +++ b/plugin/directory/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/plugin/eip/pom.xml b/plugin/eip/pom.xml index 08aa87feb87..3102f1b8735 100755 --- a/plugin/eip/pom.xml +++ b/plugin/eip/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/plugin/expon/pom.xml b/plugin/expon/pom.xml index 48c98522980..316de64b651 100644 --- a/plugin/expon/pom.xml +++ b/plugin/expon/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/plugin/externalStorage/pom.xml b/plugin/externalStorage/pom.xml index 76c238c9c2b..cd633512dd1 100644 --- a/plugin/externalStorage/pom.xml +++ b/plugin/externalStorage/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 .. diff --git a/plugin/flatNetworkProvider/pom.xml b/plugin/flatNetworkProvider/pom.xml index 1e768f5b2ea..788c095401b 100755 --- a/plugin/flatNetworkProvider/pom.xml +++ b/plugin/flatNetworkProvider/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/plugin/hostNetworkInterface/pom.xml b/plugin/hostNetworkInterface/pom.xml index bb0d6ab3596..9519574c0fe 100644 --- a/plugin/hostNetworkInterface/pom.xml +++ b/plugin/hostNetworkInterface/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.4.0 + 5.5.0 hostNetworkInterface diff --git a/plugin/iscsi/pom.xml b/plugin/iscsi/pom.xml index bb7bacea0e7..46dd095fe15 100644 --- a/plugin/iscsi/pom.xml +++ b/plugin/iscsi/pom.xml @@ -6,7 +6,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 .. diff --git a/plugin/kvm/pom.xml b/plugin/kvm/pom.xml index 12ca68055a9..73e4c81afe3 100755 --- a/plugin/kvm/pom.xml +++ b/plugin/kvm/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 .. kvm diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java index 7ee841b5051..9e06238c1cc 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java @@ -10,7 +10,7 @@ */ @GlobalPropertyDefinition public class KVMGlobalProperty { - @GlobalProperty(name="KvmAgent.agentPackageName", defaultValue = "kvmagent-5.4.0.tar.gz") + @GlobalProperty(name="KvmAgent.agentPackageName", defaultValue = "kvmagent-5.5.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="KvmAgent.agentUrlRootPath", defaultValue = "") public static String AGENT_URL_ROOT_PATH; diff --git a/plugin/ldap/pom.xml b/plugin/ldap/pom.xml index ccfa2ca138d..dd2b61b30f1 100755 --- a/plugin/ldap/pom.xml +++ b/plugin/ldap/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/plugin/loadBalancer/pom.xml b/plugin/loadBalancer/pom.xml index 65f09eeb277..c16119dec18 100755 --- a/plugin/loadBalancer/pom.xml +++ b/plugin/loadBalancer/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/plugin/localstorage/pom.xml b/plugin/localstorage/pom.xml index 2fa49de85a0..24bb83bd960 100755 --- a/plugin/localstorage/pom.xml +++ b/plugin/localstorage/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/plugin/loginPlugin/pom.xml b/plugin/loginPlugin/pom.xml index 3be14fc3082..7b58aa30f8a 100644 --- a/plugin/loginPlugin/pom.xml +++ b/plugin/loginPlugin/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 .. loginPlugin diff --git a/plugin/mediator/pom.xml b/plugin/mediator/pom.xml index c98247a956f..ea2e6d03ebf 100755 --- a/plugin/mediator/pom.xml +++ b/plugin/mediator/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/plugin/nfsPrimaryStorage/pom.xml b/plugin/nfsPrimaryStorage/pom.xml index 2d63182f8e1..36bb5f3fcc5 100755 --- a/plugin/nfsPrimaryStorage/pom.xml +++ b/plugin/nfsPrimaryStorage/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 .. nfsPrimaryStorage diff --git a/plugin/pom.xml b/plugin/pom.xml index c97c9a24421..22f39138fc7 100755 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 .. plugin diff --git a/plugin/portForwarding/pom.xml b/plugin/portForwarding/pom.xml index 051e60a74e7..114f0dfd147 100755 --- a/plugin/portForwarding/pom.xml +++ b/plugin/portForwarding/pom.xml @@ -4,7 +4,7 @@ org.zstack plugin - 5.4.0 + 5.5.0 portForwarding diff --git a/plugin/sdnController/pom.xml b/plugin/sdnController/pom.xml index c6fb7c3f735..68773594b02 100644 --- a/plugin/sdnController/pom.xml +++ b/plugin/sdnController/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/plugin/securityGroup/pom.xml b/plugin/securityGroup/pom.xml index f3651c37eba..35211774744 100755 --- a/plugin/securityGroup/pom.xml +++ b/plugin/securityGroup/pom.xml @@ -4,7 +4,7 @@ org.zstack plugin - 5.4.0 + 5.5.0 securityGroup diff --git a/plugin/sftpBackupStorage/pom.xml b/plugin/sftpBackupStorage/pom.xml index 94f4a9a2b3a..fb467ba83b9 100755 --- a/plugin/sftpBackupStorage/pom.xml +++ b/plugin/sftpBackupStorage/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 .. sftpBackupStorage diff --git a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java index ec01923a4fd..ffc6758c3a2 100755 --- a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java +++ b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java @@ -10,7 +10,7 @@ @GlobalPropertyDefinition public class SftpBackupStorageGlobalProperty { - @GlobalProperty(name="SftpBackupStorage.agentPackageName", defaultValue = "sftpbackupstorage-5.4.0.tar.gz") + @GlobalProperty(name="SftpBackupStorage.agentPackageName", defaultValue = "sftpbackupstorage-5.5.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="SftpBackupStorage.agentPort", defaultValue = "7171") public static int AGENT_PORT; diff --git a/plugin/sharedMountPointPrimaryStorage/pom.xml b/plugin/sharedMountPointPrimaryStorage/pom.xml index 20695c58859..1f5fcef5d50 100755 --- a/plugin/sharedMountPointPrimaryStorage/pom.xml +++ b/plugin/sharedMountPointPrimaryStorage/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/plugin/sshKeyPair/pom.xml b/plugin/sshKeyPair/pom.xml index 51e8e74c9a0..f73868c7fec 100644 --- a/plugin/sshKeyPair/pom.xml +++ b/plugin/sshKeyPair/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.4.0 + 5.5.0 sshKeyPair diff --git a/plugin/sugonSdnController/pom.xml b/plugin/sugonSdnController/pom.xml index a45fbb7638f..f9e83fa4468 100644 --- a/plugin/sugonSdnController/pom.xml +++ b/plugin/sugonSdnController/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/plugin/vhost/pom.xml b/plugin/vhost/pom.xml index a132e6b2567..2c3ae284b8c 100644 --- a/plugin/vhost/pom.xml +++ b/plugin/vhost/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/plugin/vip/pom.xml b/plugin/vip/pom.xml index ec953869f29..828acd6c537 100755 --- a/plugin/vip/pom.xml +++ b/plugin/vip/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/plugin/virtualRouterProvider/pom.xml b/plugin/virtualRouterProvider/pom.xml index a8eb705f54f..c50ab0511cb 100755 --- a/plugin/virtualRouterProvider/pom.xml +++ b/plugin/virtualRouterProvider/pom.xml @@ -4,7 +4,7 @@ org.zstack plugin - 5.4.0 + 5.5.0 virtualRouterProvider diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java index 7dad8ffaf39..1adff4ad7f0 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java @@ -9,7 +9,7 @@ */ @GlobalPropertyDefinition public class VirtualRouterGlobalProperty { - @GlobalProperty(name="VirtualRouter.agentPackageName", defaultValue = "virtualrouter-5.4.0.tar.gz") + @GlobalProperty(name="VirtualRouter.agentPackageName", defaultValue = "virtualrouter-5.5.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="VirtualRouter.agentPort", defaultValue = "7272") public static int AGENT_PORT; diff --git a/plugin/vxlan/pom.xml b/plugin/vxlan/pom.xml index 8d601d112a6..31668f4bdcf 100755 --- a/plugin/vxlan/pom.xml +++ b/plugin/vxlan/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/plugin/xinfini/pom.xml b/plugin/xinfini/pom.xml index ae8dd2713b4..89c1f6c5a7d 100644 --- a/plugin/xinfini/pom.xml +++ b/plugin/xinfini/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/plugin/zbs/pom.xml b/plugin/zbs/pom.xml index 611473553b8..15bae057d4c 100644 --- a/plugin/zbs/pom.xml +++ b/plugin/zbs/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.4.0 + 5.5.0 zbs diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsGlobalProperty.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsGlobalProperty.java index 16cd549cdf6..b597b4bf1ea 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsGlobalProperty.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsGlobalProperty.java @@ -15,7 +15,7 @@ public class ZbsGlobalProperty { public static String PRIMARY_STORAGE_MODULE_PATH; @GlobalProperty(name = "Zbs.primaryStorage.ansiblePlaybook", defaultValue = "zbsp.py") public static String PRIMARY_STORAGE_PLAYBOOK_NAME; - @GlobalProperty(name = "Zbs.primaryStorage.agentPackageName", defaultValue = "zbsprimarystorage-5.4.0.tar.gz") + @GlobalProperty(name = "Zbs.primaryStorage.agentPackageName", defaultValue = "zbsprimarystorage-5.5.0.tar.gz") public static String PRIMARY_STORAGE_PACKAGE_NAME; @GlobalProperty(name = "Zbs.primaryStorageAgent.port", defaultValue = "7763") public static int PRIMARY_STORAGE_AGENT_PORT; diff --git a/pom.xml b/pom.xml index 245744f9eb7..8a56650efa4 100755 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ 4.0.0 org.zstack zstack - 5.4.0 + 5.5.0 pom zstack diff --git a/portal/pom.xml b/portal/pom.xml index 73c0b97f049..e174dfe5f45 100755 --- a/portal/pom.xml +++ b/portal/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 .. portal diff --git a/resourceconfig/pom.xml b/resourceconfig/pom.xml index 52e0a5ec525..f28c3c820db 100644 --- a/resourceconfig/pom.xml +++ b/resourceconfig/pom.xml @@ -6,7 +6,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 .. resourceconfig diff --git a/rest/pom.xml b/rest/pom.xml index ba0292f6404..5f87d780fa5 100755 --- a/rest/pom.xml +++ b/rest/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/sdk/pom.xml b/sdk/pom.xml index 94d50ffced6..988b8f7d7c0 100755 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/search/pom.xml b/search/pom.xml index bf0a6227a2f..a2735c3e583 100755 --- a/search/pom.xml +++ b/search/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 .. search diff --git a/simulator/pom.xml b/simulator/pom.xml index 67ff1b0ed55..4e2d713b293 100755 --- a/simulator/pom.xml +++ b/simulator/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 .. simulator diff --git a/simulator/simulatorHeader/pom.xml b/simulator/simulatorHeader/pom.xml index 8ed6ccc130d..42ec3205da5 100755 --- a/simulator/simulatorHeader/pom.xml +++ b/simulator/simulatorHeader/pom.xml @@ -4,7 +4,7 @@ simulator org.zstack - 5.4.0 + 5.5.0 .. simulatorHeader diff --git a/simulator/simulatorImpl/pom.xml b/simulator/simulatorImpl/pom.xml index 488fb34922d..dee2cfb4b07 100755 --- a/simulator/simulatorImpl/pom.xml +++ b/simulator/simulatorImpl/pom.xml @@ -4,7 +4,7 @@ simulator org.zstack - 5.4.0 + 5.5.0 .. simulatorImpl diff --git a/storage/pom.xml b/storage/pom.xml index d5fe306aec3..9aaddc0626c 100755 --- a/storage/pom.xml +++ b/storage/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 .. storage diff --git a/tag/pom.xml b/tag/pom.xml index 1ea0b24c986..b7351a5c699 100755 --- a/tag/pom.xml +++ b/tag/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/test/pom.xml b/test/pom.xml index 9a40ae9864c..7dfbb0bbcac 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -9,7 +9,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 .. test diff --git a/testlib/pom.xml b/testlib/pom.xml index cc79b811265..4d1688012a6 100644 --- a/testlib/pom.xml +++ b/testlib/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 4.0.0 diff --git a/utils/pom.xml b/utils/pom.xml index 393c975e67d..59355a3e183 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.4.0 + 5.5.0 .. utils From 91a0e6318e54aea1987410b47fd627c40457e645 Mon Sep 17 00:00:00 2001 From: zhangjianjun Date: Tue, 30 Dec 2025 21:03:50 +0800 Subject: [PATCH 676/737] [compute]: sub hugepage memory used by ovs-dpdk Resolves: ZSTAC-80934 Change-Id: I6f787462786f62706a6d6e667679636e63656d67 Signed-off-by: zhangjianjun --- .../compute/allocator/HostAllocatorManagerImpl.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorManagerImpl.java b/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorManagerImpl.java index c1eb12ba209..1eebdea0f97 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorManagerImpl.java @@ -213,6 +213,15 @@ public List call() { } s.usedMemory = ratioMgr.calculateMemoryByRatio(s.hostUuid, t.get(0, Long.class)); + long usedMemBySysCom = 0L; + final List extps = + pluginRgty.getExtensionList(SysComponentMemUsageExtensionPoint.class); + for (SysComponentMemUsageExtensionPoint extp : extps) { + long hugePageMemUsage = Math.max(0L, extp.getHugePageMemoryUsage(s.hostUuid)); + long normalMemUsage = Math.max(0L, extp.getNormalMemoryUsage(s.hostUuid)); + usedMemBySysCom += hugePageMemUsage + normalMemUsage; + } + s.usedMemory = usedMemBySysCom + ratioMgr.calculateMemoryByRatio(s.hostUuid, t.get(0, Long.class)); s.usedCpu = t.get(2, Long.class); ret.add(s); } From ef9b90caa8cbdf5d0766e1028dd61f547ce81a76 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Fri, 30 May 2025 16:04:59 +0800 Subject: [PATCH 677/737] [cloudbus]: Introduce sentry support Usage: change `sentry.properties` dsn to your own sentry dsn Then enable setry tracing in `zstack.properties` with `CloudBus.sentryOn = true` Finally restart cloud node with `zstack-ctl restart_node` GlobalPropertyImpact Resolves: ZSTAC-74888 Change-Id: I7573736c7a726f777a72786e64706b726a6b7a72 Signed-off-by: AlanJager --- core/pom.xml | 5 ++ .../main/java/org/zstack/core/Platform.java | 18 +++++++ .../core/cloudbus/CloudBusGlobalConfig.java | 1 + .../core/cloudbus/CloudBusGlobalProperty.java | 2 + .../zstack/core/cloudbus/CloudBusImpl3.java | 50 +++++++++++++++++-- 5 files changed, 72 insertions(+), 4 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index f25d426bb85..0b97fb621e3 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -137,6 +137,11 @@ blade-patchca 1.1.0 + + io.sentry + sentry + 8.29.0 + diff --git a/core/src/main/java/org/zstack/core/Platform.java b/core/src/main/java/org/zstack/core/Platform.java index a8d8ae191ed..530c5446924 100755 --- a/core/src/main/java/org/zstack/core/Platform.java +++ b/core/src/main/java/org/zstack/core/Platform.java @@ -1,5 +1,6 @@ package org.zstack.core; +import io.sentry.Sentry; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.LocaleUtils; import org.apache.commons.lang.RandomStringUtils; @@ -10,6 +11,7 @@ import org.springframework.context.NoSuchMessageException; import org.springframework.web.context.WebApplicationContext; import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.cloudbus.CloudBusGlobalProperty; import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.componentloader.ComponentLoaderImpl; import org.zstack.core.config.GlobalConfigFacade; @@ -393,6 +395,21 @@ private static void prepareDefaultDbProperties() { } } + private static void setUpSentry() { + if (!CloudBusGlobalProperty.SENTRY_ON) { + logger.debug("Sentry is disabled"); + return; + } + + try { + logger.info("Initializing Sentry error tracking..."); + Sentry.init(); + logger.info("Sentry error tracking initialized successfully"); + } catch (Exception e) { + logger.warn("Failed to initialize Sentry error tracking, continuing without it", e); + } + } + private static void prepareHibernateSearchProperties() { if (!SearchGlobalProperty.SearchAutoRegister) { System.setProperty("Search.autoRegister", "false"); @@ -501,6 +518,7 @@ private static void prepareHibernateSearchProperties() { validateGlobalProperty(); prepareDefaultDbProperties(); prepareHibernateSearchProperties(); + setUpSentry(); callStaticInitMethods(); encryptedMethodsMap = getAllEncryptPassword(); writePidFile(); diff --git a/core/src/main/java/org/zstack/core/cloudbus/CloudBusGlobalConfig.java b/core/src/main/java/org/zstack/core/cloudbus/CloudBusGlobalConfig.java index 19570be4eda..5331c14c85f 100755 --- a/core/src/main/java/org/zstack/core/cloudbus/CloudBusGlobalConfig.java +++ b/core/src/main/java/org/zstack/core/cloudbus/CloudBusGlobalConfig.java @@ -13,6 +13,7 @@ public class CloudBusGlobalConfig { @GlobalConfigValidation public static GlobalConfig STATISTICS_ON = new GlobalConfig(CATEGORY, "statistics.on"); + @GlobalConfigValidation(numberGreaterThan = 0) public static GlobalConfig MAX_MANAGEMENTNODE_NOTFOUND_ERROR_HANDLER_NUM = new GlobalConfig(CATEGORY, "managementNodeNotFoundHandler.maxNum"); @GlobalConfigValidation(numberGreaterThan = 0) diff --git a/core/src/main/java/org/zstack/core/cloudbus/CloudBusGlobalProperty.java b/core/src/main/java/org/zstack/core/cloudbus/CloudBusGlobalProperty.java index e83cc30257e..28930a3c2ac 100755 --- a/core/src/main/java/org/zstack/core/cloudbus/CloudBusGlobalProperty.java +++ b/core/src/main/java/org/zstack/core/cloudbus/CloudBusGlobalProperty.java @@ -57,4 +57,6 @@ public class CloudBusGlobalProperty { // Unit of SYNC_CALL_TIMEOUT: millisecond @GlobalProperty(name="Cloudbus.syncCallTimeout", defaultValue = "900000") public static int SYNC_CALL_TIMEOUT; + @GlobalProperty(name="CloudBus.sentryOn", defaultValue = "false") + public static boolean SENTRY_ON; } diff --git a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java index 1a228ef7af7..856535f23ab 100755 --- a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java +++ b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java @@ -1,8 +1,13 @@ package org.zstack.core.cloudbus; +import io.sentry.Sentry; import org.apache.logging.log4j.ThreadContext; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.*; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestClientException; import org.zstack.core.CoreGlobalProperty; @@ -13,7 +18,12 @@ import org.zstack.core.log.LogUtils; import org.zstack.core.retry.Retry; import org.zstack.core.retry.RetryCondition; -import org.zstack.core.thread.*; +import org.zstack.core.thread.AsyncThread; +import org.zstack.core.thread.ChainTask; +import org.zstack.core.thread.SyncTask; +import org.zstack.core.thread.SyncTaskChain; +import org.zstack.core.thread.ThreadFacade; +import org.zstack.core.thread.ThreadFacadeImpl; import org.zstack.core.timeout.ApiTimeoutManager; import org.zstack.header.Constants; import org.zstack.header.Service; @@ -26,7 +36,18 @@ import org.zstack.header.errorcode.SysErrors; import org.zstack.header.exception.CloudConfigureFailException; import org.zstack.header.exception.CloudRuntimeException; -import org.zstack.header.message.*; +import org.zstack.header.message.APIEvent; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIReply; +import org.zstack.header.message.APISyncCallMessage; +import org.zstack.header.message.BeforeDeliveryMessageInterceptor; +import org.zstack.header.message.BeforePublishEventInterceptor; +import org.zstack.header.message.BeforeSendMessageInterceptor; +import org.zstack.header.message.Event; +import org.zstack.header.message.JsonSchemaBuilder; +import org.zstack.header.message.Message; +import org.zstack.header.message.MessageReply; +import org.zstack.header.message.NeedReplyMessage; import org.zstack.header.rest.RESTFacade; import org.zstack.header.rest.RestAPIExtensionPoint; import org.zstack.header.rest.TimeoutRestTemplate; @@ -40,7 +61,15 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.TimeUnit; @@ -830,6 +859,19 @@ public Void call() { replyErrorByMessageType(msg, ((OperationFailureException) t).getErrorCode()); } else { replyErrorByMessageType(msg, inerr(t.getMessage())); + + if (CloudBusGlobalProperty.SENTRY_ON) { + try { + // Add message context to Sentry before capturing the exception + Sentry.configureScope(scope -> { + scope.setExtra("message.dump", dumpMessage(msg)); + scope.setTag("service.id", serv.getId()); + scope.setTag("message.class", msg.getClass().getSimpleName()); + }); + } catch (Exception sentryEx) { + logger.warn("Failed to capture exception with Sentry", sentryEx); + } + } } } From bd5f6d644a7dc92f2d9576d62113608478efeeff Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Wed, 31 Dec 2025 13:47:26 +0800 Subject: [PATCH 678/737] [mevoco]: correct CPU model and MAC retrieval in license check Resolves: ZSTAC-79487 Change-Id: I646379678a7923767067706e7a6e667a796f686d --- utils/src/main/java/org/zstack/utils/network/NetworkUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/src/main/java/org/zstack/utils/network/NetworkUtils.java b/utils/src/main/java/org/zstack/utils/network/NetworkUtils.java index 8ebb2f754d8..3a7859fec8d 100755 --- a/utils/src/main/java/org/zstack/utils/network/NetworkUtils.java +++ b/utils/src/main/java/org/zstack/utils/network/NetworkUtils.java @@ -502,7 +502,7 @@ public static List getFreeIpv6InRange(String startIp, String endIp, List } public static List getAllMac() { - ShellResult res = ShellUtils.runAndReturn("ip a | awk '/ether/ {print $2}' | sort -u"); + ShellResult res = ShellUtils.runAndReturn("ip a | awk '/link\\// && !/loopback/ {print $2}' | sort -u"); if (!res.isReturnCode(0)) { throw new RuntimeException("Fail to get mac address"); From 03d5d45bcdb37f7b7c93d908dc4d526e2828b673 Mon Sep 17 00:00:00 2001 From: "haidong.pang" Date: Sat, 3 Jan 2026 16:23:24 +0000 Subject: [PATCH 679/737] [cbd]: convert iso path to cbd format Resolves: ZSTAC-81025 Change-Id: I766976637272776372646a6a616d787467647272 --- .../org/zstack/cbd/kvm/KvmCbdNodeServer.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java index d53cfa3bb97..4602d97237b 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java @@ -234,6 +234,15 @@ private PrimaryStorageNodeSvc getNodeService(VolumeInventory volumeInventory) { return extPsFactory.getNodeSvc(volumeInventory.getPrimaryStorageUuid()); } + private PrimaryStorageNodeSvc getNodeService(VmInstanceSpec.CdRomSpec cdRomSpec) { + String identity = cdRomSpec.getInstallPath().split("://")[0]; + if (!extPsFactory.support(identity)) { + return null; + } + + return extPsFactory.getNodeSvc(cdRomSpec.getPrimaryStorageUuid()); + } + private VolumeTO convertVolumeIfNeeded(VolumeInventory volumeInventory, HostInventory host, VolumeTO volumeTO) { if (!VolumeProtocol.CBD.name().equals(volumeInventory.getProtocol())) { return volumeTO; @@ -249,6 +258,19 @@ private VolumeTO convertVolumeIfNeeded(VolumeInventory volumeInventory, HostInve return volumeTO; } + private KVMAgentCommands.CdRomTO convertCdRomIfNeeded(VmInstanceSpec.CdRomSpec cdRomSpec, HostInventory host, KVMAgentCommands.CdRomTO cdRomTO) { + if (!VolumeProtocol.CBD.name().equals(cdRomSpec.getProtocol())){ + return cdRomTO; + } + PrimaryStorageNodeSvc nodeSvc = getNodeService(cdRomSpec); + if (nodeSvc == null) { + return cdRomTO; + } + String path = nodeSvc.getActivePath(BaseVolumeInfo.valueOf(cdRomSpec), host,false); + cdRomTO.setPath(path); + return cdRomTO; + } + @Override public void beforeAttachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, KVMAgentCommands.AttachDataVolumeCmd cmd, Map data) { cmd.setVolume(convertVolumeIfNeeded(volume, host, cmd.getVolume())); @@ -298,6 +320,18 @@ public void beforeStartVmOnKvm(KVMHostInventory host, VmInstanceSpec spec, KVMAg } cmd.setDataVolumes(dtos); + + List ctos = new ArrayList<>(); + for (KVMAgentCommands.CdRomTO cto : cmd.getCdRoms()){ + for (VmInstanceSpec.CdRomSpec cdRom : spec.getCdRomSpecs()){ + if (cdRom.getUuid().equals(cto.getResourceUuid())){ + ctos.add(convertCdRomIfNeeded(cdRom, host, cto)); + break; + } + } + } + cmd.setCdRoms(ctos); + } @Override From 69cb6717b291906caf71559966623b0d3e3573c4 Mon Sep 17 00:00:00 2001 From: qiuyu <2094801894@qq.com> Date: Wed, 31 Dec 2025 10:46:32 +0800 Subject: [PATCH 680/737] [portal]: Resolve the phantom lock issue In dual-node mode, the VIP failover combined with an uncaught exception during lock.unlock() led to a phantom lock issue. Resolves: ZSTAC-80498 Change-Id: I6c62646a7666676564786e7a6f61746f6a75627a [portal]: Resolve the phantom lock issue In dual-node mode, the VIP failover combined with an uncaught exception during lock.unlock() led to a phantom lock issue. Resolves: ZSTAC-80498 Change-Id: I716368786e776c61677463777767667967786664 --- .../portal/managementnode/ManagementNodeManagerImpl.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java b/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java index 747a154919b..3b10563e9af 100755 --- a/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java +++ b/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java @@ -613,7 +613,13 @@ public void handle(ErrorCode errCode, Map data) { } }).start(); } finally { - lock.unlock(); + try { + lock.unlock(); + } catch (Exception e) { + ErrorCode errCode = Platform.inerr(e.getMessage()); + new BootErrorLog().write(errCode.toString()); + ret.success = false; + } } if (!ret.success || !Platform.IS_RUNNING) { From a65c3b7234382e6c97c2be7ef8e2b1f30565251f Mon Sep 17 00:00:00 2001 From: "shan.wu" Date: Wed, 31 Dec 2025 15:41:21 +0800 Subject: [PATCH 681/737] [migration]: fix batch migration error queuing operations to sync the same primary storage capacity. Resolves/Related: ZSTAC-81028 Change-Id: I73726668696e6a68756b726c6f6c637273706774 --- .../storage/zbs/ZbsStorageController.java | 7 +-- .../storage/primary/PrimaryStorageBase.java | 48 ++++++++++++------- .../addon/zbs/ZbsPrimaryStorageCase.groovy | 19 ++++++++ 3 files changed, 52 insertions(+), 22 deletions(-) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index f89c3c95d3d..7abfdef366e 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -4,7 +4,6 @@ import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; -import org.zstack.cbd.*; import org.zstack.cbd.kvm.CbdHeartbeatVolumeTO; import org.zstack.cbd.kvm.CbdVolumeTo; import org.zstack.compute.host.HostGlobalConfig; @@ -32,7 +31,6 @@ import org.zstack.header.host.HostVO; import org.zstack.header.image.ImageConstant; import org.zstack.header.message.MessageReply; -import org.zstack.header.rest.RESTFacade; import org.zstack.header.storage.addon.*; import org.zstack.header.storage.addon.primary.*; import org.zstack.header.storage.primary.*; @@ -711,9 +709,8 @@ private LogicalPoolInfo allocateFreePool(long size, Predicate f } private List getSelfPools() { - List logicalPoolInfos = addonInfo.getLogicalPoolInfos(); - logicalPoolInfos.removeIf(it -> !config.getPoolNames().contains(it.getLogicalPoolName())); - return logicalPoolInfos; + return addonInfo.getLogicalPoolInfos().stream().filter(pool -> + config.getPoolNames().contains(pool.getLogicalPoolName())).collect(Collectors.toList()); } @Override diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java index 6edcc530840..7bb2a705fda 100755 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java @@ -2,6 +2,7 @@ import com.google.common.collect.Interner; import com.google.common.collect.Interners; +import java.util.function.Consumer; import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; @@ -19,6 +20,9 @@ import org.zstack.core.job.JobQueueFacade; import org.zstack.core.thread.ChainTask; import org.zstack.core.thread.MergeQueue; +import org.zstack.core.thread.SingleFlightTask; +import org.zstack.core.thread.SingleFlightTask.SingleFlightDone; +import org.zstack.core.thread.SingleFlightTaskResult; import org.zstack.core.thread.SyncTaskChain; import org.zstack.core.thread.ThreadFacade; import org.zstack.core.trash.StorageTrash; @@ -1244,23 +1248,33 @@ public void setup() { @Override public void run(final FlowTrigger trigger, Map data) { - syncPhysicalCapacity(new ReturnValueCompletion(trigger) { - @Override - public void success(PhysicalCapacityUsage returnValue) { - PrimaryStorageCapacityUpdater updater = new PrimaryStorageCapacityUpdater(self.getUuid()); - updater.run(cap -> { - cap.setAvailablePhysicalCapacity(returnValue.availablePhysicalSize < 0 ? 0 : returnValue.availablePhysicalSize); - cap.setTotalPhysicalCapacity(returnValue.totalPhysicalSize); - return cap; - }); - trigger.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - trigger.fail(errorCode); - } - }); + thdf.singleFlightSubmit(new SingleFlightTask(trigger) + .setSyncSignature("sync-physical-capacity-on-ps-" + self.getUuid()) + .run(completion -> { + syncPhysicalCapacity(new ReturnValueCompletion(completion) { + @Override + public void success(PhysicalCapacityUsage returnValue) { + PrimaryStorageCapacityUpdater updater = new PrimaryStorageCapacityUpdater(self.getUuid()); + updater.run(cap -> { + cap.setAvailablePhysicalCapacity(returnValue.availablePhysicalSize < 0 ? 0 : returnValue.availablePhysicalSize); + cap.setTotalPhysicalCapacity(returnValue.totalPhysicalSize); + return cap; + }); + completion.success(null); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + }).done(result -> { + if (!result.isSuccess()) { + trigger.fail(result.getErrorCode()); + } else { + trigger.next(); + } + })); } }); diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index b4e6a09db13..d085ecec661 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -32,6 +32,8 @@ import org.zstack.testlib.SubCase import org.zstack.utils.data.SizeUnit import org.zstack.utils.gson.JSONObjectUtil +import java.util.concurrent.atomic.AtomicInteger + /** * @author Xingwei Yu * @date 2024/4/19 10:09 @@ -164,6 +166,7 @@ class ZbsPrimaryStorageCase extends SubCase { kvm = env.inventoryByName("kvm-1") as KVMHostInventory evtf = bean(EventFacade.class) + testSyncPrimaryStorageCapacityConcurrently() testDefaultConfig() testUpdateExternalPrimaryStorage() testMdsConnectFailed() @@ -177,6 +180,22 @@ class ZbsPrimaryStorageCase extends SubCase { } } + void testSyncPrimaryStorageCapacityConcurrently() { + def threads = new ArrayList<>() + def success_cnt = new AtomicInteger(0) + (1..20).forEach { + threads.add(Thread.start { + syncPrimaryStorageCapacity { + primaryStorageUuid = ps.uuid + } + success_cnt.incrementAndGet() + }) + } + + threads.each { it.join() } + assert success_cnt.get() == 20 + } + void testCheckHostStorageConnection() { attachPrimaryStorageToCluster { primaryStorageUuid = ps.uuid From 9b550525514f04f1fbc4167b3d618e2e4d3630e6 Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Sun, 4 Jan 2026 11:51:31 +0800 Subject: [PATCH 682/737] [conf]: fix database migration failure from 4.8.36 to 5.1.4+ Resolves: ZSTAC-81060 Change-Id: I6f708106077068657a627774746365626c6b636a --- conf/db/upgrade/V5.1.4__schema.sql | 5 ++--- conf/db/upgrade/V5.4.0__schema.sql | 2 +- conf/db/upgrade/beforeValidate.sql | 2 ++ 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/conf/db/upgrade/V5.1.4__schema.sql b/conf/db/upgrade/V5.1.4__schema.sql index 9e40ddae1c2..553fd49bde3 100644 --- a/conf/db/upgrade/V5.1.4__schema.sql +++ b/conf/db/upgrade/V5.1.4__schema.sql @@ -1,3 +1,2 @@ -ALTER TABLE `zstack`.`OAuth2ClientVO` ADD COLUMN `scope` varchar(255) default 'openid'; - -ALTER TABLE `zstack`.`OAuth2ClientVO` ADD COLUMN `identityProvider` varchar(32) default 'default'; \ No newline at end of file +CALL ADD_COLUMN('OAuth2ClientVO', 'scope', 'varchar(255)', 1, 'openid'); +CALL ADD_COLUMN('OAuth2ClientVO', 'identityProvider', 'varchar(32)', 1, 'default'); \ No newline at end of file diff --git a/conf/db/upgrade/V5.4.0__schema.sql b/conf/db/upgrade/V5.4.0__schema.sql index 693b0f60b6a..f9f877d98f4 100644 --- a/conf/db/upgrade/V5.4.0__schema.sql +++ b/conf/db/upgrade/V5.4.0__schema.sql @@ -1,4 +1,4 @@ -CREATE TABLE `SSOClientAttributeVO` ( +CREATE TABLE IF NOT EXISTS `SSOClientAttributeVO` ( `uuid` VARCHAR(32) NOT NULL, `name` TEXT NOT NULL, `value` TEXT DEFAULT NULL, diff --git a/conf/db/upgrade/beforeValidate.sql b/conf/db/upgrade/beforeValidate.sql index 21f947e6289..1ecbf9febdc 100644 --- a/conf/db/upgrade/beforeValidate.sql +++ b/conf/db/upgrade/beforeValidate.sql @@ -40,6 +40,8 @@ BEGIN update `zstack`.`schema_version` set `checksum`=1489363540 where `script`='V5.3.22__schema.sql' and `checksum` <> 1489363540; update `zstack`.`schema_version` set `checksum`=1648524318 where `script`='V4.4.0__schema.sql' and `checksum` <> 1648524318; update `zstack`.`schema_version` set `checksum`=-3265430 where `script`='V5.4.6__schema.sql' and `checksum` <> -3265430; + update `zstack`.`schema_version` set `checksum`=-1455020895 where `script`='V5.1.4__schema.sql' and `checksum` <> -1455020895; + update `zstack`.`schema_version` set `checksum`=569762641 where `script`='V5.4.0__schema.sql' and `checksum` <> 569762641; END IF; END $$ From 21ab06ab90ee88dae7a6fb27021df26b3197a3a3 Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Thu, 8 Jan 2026 12:17:24 +0800 Subject: [PATCH 683/737] [xinfini]: connect xinfini with designed node Resolves: ZSTAC-81205 Change-Id: I7a64667073646c726c6e78796c7578656c72686b --- .../org/zstack/xinfini/XInfiniApiHelper.java | 54 ++++++++++++++++++- .../xinfini/XInfiniStorageController.java | 28 ++++++++-- 2 files changed, 75 insertions(+), 7 deletions(-) diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java index 3a90db3b043..b0990b0790d 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java @@ -57,6 +57,12 @@ public T callWithNode(XInfiniRequest req, Class c return client.call(req, clz, node); } + public T callErrorOutWithNode(XInfiniRequest req, Class clz, XInfiniConfig.Node node) { + T rsp = client.call(req, clz, node); + errorOut(rsp); + return rsp; + } + public T callErrorOut(XInfiniRequest req, Class clz) { T rsp = client.call(req, clz); errorOut(rsp); @@ -107,11 +113,21 @@ public T query(XInfiniQueryRequest req, Class T queryErrorOut(XInfiniQueryRequest req, Class clz) { return callErrorOut(req, clz); } + + public T queryErrorOut(XInfiniQueryRequest req, Class clz, XInfiniConfig.Node node) { + return callErrorOutWithNode(req, clz, node); + } + public List queryPools() { QueryPoolRequest req = new QueryPoolRequest(); return queryErrorOut(req, QueryPoolResponse.class).getItems(); } + public List queryPools(XInfiniConfig.Node node) { + QueryPoolRequest req = new QueryPoolRequest(); + return queryErrorOut(req, QueryPoolResponse.class, node).getItems(); + } + public PoolModule getPool(int id) { GetPoolRequest req = new GetPoolRequest(); req.setId(id); @@ -123,6 +139,11 @@ public String getClusterUuid() { return queryErrorOut(req, QueryClusterResponse.class).toModule().getUuid(); } + public String getClusterUuid(XInfiniConfig.Node node) { + QueryClusterRequest req = new QueryClusterRequest(); + return queryErrorOut(req, QueryClusterResponse.class, node).toModule().getUuid(); + } + public Map checkNodesConnection(List nodes) { Map nodesStatus = Maps.newConcurrentMap(); for (XInfiniConfig.Node node : nodes) { @@ -140,9 +161,9 @@ public Map checkNodesConnection(List nod return nodesStatus; } - public List queryNodes() { + public List queryNodes(XInfiniConfig.Node node) { QueryNodeRequest req = new QueryNodeRequest(); - return queryErrorOut(req, QueryNodeResponse.class).getItems(); + return callErrorOutWithNode(req, QueryNodeResponse.class, node).getItems(); } public NodeModule getNode(int id) { @@ -192,6 +213,12 @@ public BsPolicyModule getBsPolicy(int id) { return callErrorOut(req, GetBsPolicyResponse.class).toModule(); } + public BsPolicyModule getBsPolicy(int id, XInfiniConfig.Node node) { + GetBsPolicyRequest req = new GetBsPolicyRequest(); + req.setId(id); + return callErrorOutWithNode(req, GetBsPolicyResponse.class, node).toModule(); + } + public PoolCapacity getPoolCapacity(PoolModule pool) { PoolCapacity capacity = new PoolCapacity(); long usedCapacity = SizeUnit.KILOBYTE.toByte(getPoolMetricValue(PoolMetrics.DATA_KBYTES, pool)); @@ -202,6 +229,16 @@ public PoolCapacity getPoolCapacity(PoolModule pool) { return capacity; } + public PoolCapacity getPoolCapacity(PoolModule pool, XInfiniConfig.Node node) { + PoolCapacity capacity = new PoolCapacity(); + long usedCapacity = SizeUnit.KILOBYTE.toByte(getPoolMetricValue(PoolMetrics.DATA_KBYTES, pool, node)); + long totalCapacity = SizeUnit.KILOBYTE.toByte(getPoolMetricValue(PoolMetrics.ACTUAL_KBYTES, pool, node)); + long reservedCapacity = (long) (totalCapacity * POOL_RESERVED_SIZE_RATIO); + capacity.setTotalCapacity(totalCapacity); + capacity.setAvailableCapacity(totalCapacity - usedCapacity - reservedCapacity); + return capacity; + } + public long getPoolMetricValue(String metricName, PoolModule pool) { QueryMetricRequest req = new QueryMetricRequest(); req.metric = metricName; @@ -215,6 +252,19 @@ public long getPoolMetricValue(String metricName, PoolModule pool) { return rsp.getData().getResult().get(0).getValue(); } + public long getPoolMetricValue(String metricName, PoolModule pool, XInfiniConfig.Node node) { + QueryMetricRequest req = new QueryMetricRequest(); + req.metric = metricName; + req.lables = String.format("pool_id=%s", pool.getSpec().getId()); + QueryMetricResponse rsp = callErrorOutWithNode(req, QueryMetricResponse.class, node); + if (rsp.getData() == null || CollectionUtils.isEmpty(rsp.getData().getResult())) { + logger.warn(String.format("get pool[id=%s, name=%s] metric %s value failed", pool.getSpec().getId(), pool.getSpec().getName(), metricName)); + return 0; + } + + return rsp.getData().getResult().get(0).getValue(); + } + public VolumeModule queryVolumeByName(String name) { QueryVolumeRequest req = new QueryVolumeRequest(); req.q = String.format("spec.name:%s", name); diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index fc9760ac341..c1e5d855d3a 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -523,7 +523,20 @@ public void connect(String config, String url, ReturnValueCompletion XInfiniAddonInfo info = new XInfiniAddonInfo(); XInfiniConfig xConfig = JSONObjectUtil.toObject(config, XInfiniConfig.class); - List nodes = apiHelper.queryNodes(); + XInfiniConfig.Node connectedNode; + + Map nodeIpStatus = apiHelper.checkNodesConnection(xConfig.getNodes()); + connectedNode = xConfig.getNodes().stream() + .filter(it -> nodeIpStatus.get(it.getIp()) == NodeStatus.Connected) + .findAny() + .orElse(null); + + if (connectedNode == null) { + comp.fail(operr("no connected node found")); + return; + } + + List nodes = apiHelper.queryNodes(connectedNode); if (CollectionUtils.isEmpty(nodes)) { comp.fail(operr("no node found")); return; @@ -534,10 +547,9 @@ public void connect(String config, String url, ReturnValueCompletion .findAny() .orElseThrow(() -> new OperationFailureException(operr("fail to get node %s details, check ip address and role config", it.getIp())))); info.setNodes(nodes.stream().map(XInfiniAddonInfo.Node::valueOf).collect(Collectors.toList())); - Map nodeIpStatus = apiHelper.checkNodesConnection(xConfig.getNodes()); info.getNodes().forEach(it -> it.setStatus(nodeIpStatus.get(it.getIp()))); - List pools = apiHelper.queryPools(); + List pools = apiHelper.queryPools(connectedNode); if (CollectionUtils.isEmpty(pools)) { comp.fail(operr("no pool found")); return; @@ -549,8 +561,8 @@ public void connect(String config, String url, ReturnValueCompletion .findAny() .orElseThrow(() -> new OperationFailureException(operr("fail to get pool[id:%d, name:%s] %s details", it.getId(), it.getName())))); } - info.setPools(pools.stream().map(this::getPoolAddonInfo).collect(Collectors.toList())); - vhostSocketDir = String.format("/var/run/bdc-%s/", apiHelper.getClusterUuid()); + info.setPools(pools.stream().map(v -> getPoolAddonInfo(v, connectedNode)).collect(Collectors.toList())); + vhostSocketDir = String.format("/var/run/bdc-%s/", apiHelper.getClusterUuid(connectedNode)); comp.success(info); } @@ -560,6 +572,12 @@ private XInfiniAddonInfo.Pool getPoolAddonInfo(PoolModule pool) { return XInfiniAddonInfo.Pool.valueOf(pool, bsPolicy, capacity); } + private XInfiniAddonInfo.Pool getPoolAddonInfo(PoolModule pool, XInfiniConfig.Node node) { + BsPolicyModule bsPolicy = apiHelper.getBsPolicy(pool.getSpec().getDefaultBsPolicyId(), node); + PoolCapacity capacity = apiHelper.getPoolCapacity(pool, node); + return XInfiniAddonInfo.Pool.valueOf(pool, bsPolicy, capacity); + } + @Override public void syncAddonInfo(String addonInfo) { this.addonInfo = StringUtils.isEmpty(addonInfo) ? new XInfiniAddonInfo() : JSONObjectUtil.toObject(addonInfo, XInfiniAddonInfo.class); From 963fad59e6101687bc31c81d5ec44736d54eea66 Mon Sep 17 00:00:00 2001 From: "haidong.pang" Date: Thu, 8 Jan 2026 07:05:53 +0000 Subject: [PATCH 684/737] [cbd]: Convert CBD path in preAttachIsoExtensionPoint Resolves: ZSTAC-81204 Change-Id: I7a6f76746276796879786e7770726a786e6d6a65 --- conf/springConfigXml/cbd.xml | 1 + .../storage/addon/primary/BaseVolumeInfo.java | 11 +++ .../org/zstack/cbd/kvm/KvmCbdNodeServer.java | 77 ++++++++++++------- .../java/org/zstack/kvm/KVMAgentCommands.java | 8 ++ 4 files changed, 69 insertions(+), 28 deletions(-) diff --git a/conf/springConfigXml/cbd.xml b/conf/springConfigXml/cbd.xml index fc95b60b6b7..1cd6fbf490c 100644 --- a/conf/springConfigXml/cbd.xml +++ b/conf/springConfigXml/cbd.xml @@ -20,6 +20,7 @@ + diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/BaseVolumeInfo.java b/header/src/main/java/org/zstack/header/storage/addon/primary/BaseVolumeInfo.java index f75a3b2a3b3..ae6cb8785a8 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/primary/BaseVolumeInfo.java +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/BaseVolumeInfo.java @@ -124,6 +124,17 @@ public static BaseVolumeInfo valueOf(VmCdRomVO image) { return info; } + public static BaseVolumeInfo valueOf(VmInstanceSpec.IsoSpec iso) { + BaseVolumeInfo info = new BaseVolumeInfo(); + info.uuid = iso.getImageUuid(); + info.setInstallPath(iso.getInstallPath()); + info.setProtocol(iso.getProtocol()); + info.setShareable(true); + info.setPrimaryStorageUuid(iso.getPrimaryStorageUuid()); + info.setType("image"); + return info; + } + public static List valueOf(Collection vols) { return vols.stream().map(BaseVolumeInfo::valueOf).collect(java.util.stream.Collectors.toList()); } diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java index 4602d97237b..4dca4465c33 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java @@ -42,8 +42,14 @@ * @author Xingwei Yu * @date 2024/4/9 16:22 */ + +@FunctionalInterface +interface PathSetter { + void setPath(T target, String path); +} + public class KvmCbdNodeServer implements Component, KvmSetupSelfFencerExtensionPoint, KVMStartVmExtensionPoint, - KVMConvertVolumeExtensionPoint, KVMDetachVolumeExtensionPoint, KVMAttachVolumeExtensionPoint { + KVMConvertVolumeExtensionPoint, KVMDetachVolumeExtensionPoint, KVMAttachVolumeExtensionPoint, KVMPreAttachIsoExtensionPoint { private static final CLogger logger = Utils.getLogger(KvmCbdNodeServer.class); @Autowired @@ -225,52 +231,55 @@ public void run(MessageReply reply) { }); } - private PrimaryStorageNodeSvc getNodeService(VolumeInventory volumeInventory) { - String identity = volumeInventory.getInstallPath().split("://")[0]; - if (!extPsFactory.support(identity)) { - return null; + private String convertPathIfNeeded(BaseVolumeInfo volumeInfo, HostInventory host){ + if (!VolumeProtocol.CBD.name().equals(volumeInfo.getProtocol())){ + return volumeInfo.getInstallPath(); } - return extPsFactory.getNodeSvc(volumeInventory.getPrimaryStorageUuid()); + PrimaryStorageNodeSvc nodeSvc = getNodeService(volumeInfo); + if (nodeSvc == null) { + return volumeInfo.getInstallPath(); + } + + return nodeSvc.getActivePath(volumeInfo, host, false); + } + + private void convertAndSetPathIfNeeded(BaseVolumeInfo volumeInfo, HostInventory host, T target, PathSetter setter) { + String newInstallPath = convertPathIfNeeded(volumeInfo, host); + setter.setPath(target, newInstallPath); } - private PrimaryStorageNodeSvc getNodeService(VmInstanceSpec.CdRomSpec cdRomSpec) { - String identity = cdRomSpec.getInstallPath().split("://")[0]; + + private PrimaryStorageNodeSvc getNodeService(BaseVolumeInfo volumeInfo) { + String identity = volumeInfo.getInstallPath().split("://")[0]; if (!extPsFactory.support(identity)) { return null; } - return extPsFactory.getNodeSvc(cdRomSpec.getPrimaryStorageUuid()); + return extPsFactory.getNodeSvc(volumeInfo.getPrimaryStorageUuid()); } private VolumeTO convertVolumeIfNeeded(VolumeInventory volumeInventory, HostInventory host, VolumeTO volumeTO) { - if (!VolumeProtocol.CBD.name().equals(volumeInventory.getProtocol())) { - return volumeTO; - } + BaseVolumeInfo volumeInfo = BaseVolumeInfo.valueOf(volumeInventory); + convertAndSetPathIfNeeded(volumeInfo, host, volumeTO, VolumeTO::setInstallPath); - PrimaryStorageNodeSvc nodeSvc = getNodeService(volumeInventory); - if (nodeSvc == null) { - return volumeTO; - } - - String path = nodeSvc.getActivePath(BaseVolumeInfo.valueOf(volumeInventory), host,false); - volumeTO.setInstallPath(path); return volumeTO; } private KVMAgentCommands.CdRomTO convertCdRomIfNeeded(VmInstanceSpec.CdRomSpec cdRomSpec, HostInventory host, KVMAgentCommands.CdRomTO cdRomTO) { - if (!VolumeProtocol.CBD.name().equals(cdRomSpec.getProtocol())){ - return cdRomTO; - } - PrimaryStorageNodeSvc nodeSvc = getNodeService(cdRomSpec); - if (nodeSvc == null) { - return cdRomTO; - } - String path = nodeSvc.getActivePath(BaseVolumeInfo.valueOf(cdRomSpec), host,false); - cdRomTO.setPath(path); + BaseVolumeInfo cdRomInfo = BaseVolumeInfo.valueOf(cdRomSpec); + convertAndSetPathIfNeeded(cdRomInfo, host, cdRomTO, KVMAgentCommands.CdRomTO::setPath); + return cdRomTO; } + private KVMAgentCommands.IsoTO convertIsoIfNeeded( VmInstanceSpec.IsoSpec isoSpec ,HostInventory host, KVMAgentCommands.IsoTO isoTO) { + BaseVolumeInfo isoInfo = BaseVolumeInfo.valueOf(isoSpec); + convertAndSetPathIfNeeded(isoInfo, host, isoTO, KVMAgentCommands.IsoTO::setPath); + + return isoTO; + } + @Override public void beforeAttachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, KVMAgentCommands.AttachDataVolumeCmd cmd, Map data) { cmd.setVolume(convertVolumeIfNeeded(volume, host, cmd.getVolume())); @@ -343,4 +352,16 @@ public void startVmOnKvmSuccess(KVMHostInventory host, VmInstanceSpec spec) { public void startVmOnKvmFailed(KVMHostInventory host, VmInstanceSpec spec, ErrorCode err) { } + + @Override + public void preAttachIsoExtensionPoint(KVMHostInventory host, KVMAgentCommands.AttachIsoCmd cmd) { + KVMAgentCommands.IsoTO isoTO = cmd.getIso(); + VmInstanceSpec.IsoSpec isoSpec = new VmInstanceSpec.IsoSpec(); + isoSpec.setDeviceId(isoTO.getDeviceId()); + isoSpec.setImageUuid(isoTO.getImageUuid()); + isoSpec.setInstallPath(isoTO.getPath()); + isoSpec.setPrimaryStorageUuid(isoTO.getPrimaryStorageUuid()); + isoSpec.setProtocol(isoTO.getProtocol()); + cmd.setIso(convertIsoIfNeeded(isoSpec, host, isoTO)); + } } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index cf977cf23df..c023774c968 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -4447,6 +4447,14 @@ public static class AttachIsoCmd extends AgentCommand { public IsoTO iso; @GrayVersion(value = "5.0.0") public String vmUuid; + + public IsoTO getIso() { return iso; } + + public void setIso(IsoTO iso) { this.iso = iso; } + + public String getVmUuid() { return vmUuid; } + + public void setVmUuid(String vmUuid) { this.vmUuid = vmUuid; } } public static class AttachIsoRsp extends AgentResponse { From 05e9ceb0ddf3f53f7b0b21b77f65ec2902947e84 Mon Sep 17 00:00:00 2001 From: qiuyu <2094801894@qq.com> Date: Thu, 8 Jan 2026 13:58:29 +0800 Subject: [PATCH 685/737] [compute]: vm lacks state transition handling vm is displayed as "Paused" and the control plane is missing the state transition logic from "Paused" to "NoState" Resolves: ZSTAC-80897 Change-Id: I697465636f646b6368686d71696d706b6e676e67 --- .../org/zstack/compute/vm/VmInstanceBase.java | 3 +- .../header/vm/VmAbnormalLifeCycleStruct.java | 8 +++ .../vm/CreateVmWithSameHostnameCase.groovy | 53 +++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java index 68c50b7947a..a0c66a59d27 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java @@ -1511,7 +1511,8 @@ private void vmStateChangeOnHost(final VmStateChangedOnHostMsg msg, final NoErro return; } else if (operation == VmAbnormalLifeCycleOperation.VmNoStateFromRunningStateHostNotChanged || operation == VmAbnormalLifeCycleOperation.VmNoStateFromCrashedStateHostNotChanged - || operation == VmAbnormalLifeCycleOperation.VmNoStateFromUnknownStateHostNotChanged) { + || operation == VmAbnormalLifeCycleOperation.VmNoStateFromUnknownStateHostNotChanged + || operation == VmAbnormalLifeCycleOperation.VmNoStateFromPausedStateHostNotChanged) { // the vm is detected on the host again. It's largely because the host disconnected before // and now reconnected changeVmStateInDb(VmInstanceStateEvent.noState, () -> self.setHostUuid(msg.getHostUuid())); diff --git a/header/src/main/java/org/zstack/header/vm/VmAbnormalLifeCycleStruct.java b/header/src/main/java/org/zstack/header/vm/VmAbnormalLifeCycleStruct.java index a268e6421dc..43023821394 100755 --- a/header/src/main/java/org/zstack/header/vm/VmAbnormalLifeCycleStruct.java +++ b/header/src/main/java/org/zstack/header/vm/VmAbnormalLifeCycleStruct.java @@ -171,6 +171,14 @@ boolean match(VmAbnormalLifeCycleStruct struct) { && Objects.equals(struct.getCurrentHostUuid(), struct.getOriginalHostUuid()); } }, + VmNoStateFromPausedStateHostNotChanged { + @Override + boolean match(VmAbnormalLifeCycleStruct struct) { + return struct.getOriginalState() == VmInstanceState.Paused + && struct.getCurrentState() == VmInstanceState.NoState + && Objects.equals(struct.getCurrentHostUuid(), struct.getOriginalHostUuid()); + } + }, VmNoStateFromCrashedStateHostNotChanged { @Override boolean match(VmAbnormalLifeCycleStruct struct) { diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/CreateVmWithSameHostnameCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/CreateVmWithSameHostnameCase.groovy index 9ecec349152..73e2af855f4 100644 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/CreateVmWithSameHostnameCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/CreateVmWithSameHostnameCase.groovy @@ -1,5 +1,13 @@ package org.zstack.test.integration.kvm.vm +import org.zstack.core.cloudbus.CloudBus +import org.zstack.core.cloudbus.EventCallback +import org.zstack.core.cloudbus.EventFacade +import org.zstack.header.vm.VmInstanceConstant +import org.zstack.header.vm.VmInstanceState +import org.zstack.header.vm.VmInstanceVO +import org.zstack.header.vm.VmStateChangedOnHostMsg +import org.zstack.header.vm.VmTracerCanonicalEvents import org.zstack.sdk.ImageInventory import org.zstack.sdk.InstanceOfferingInventory import org.zstack.sdk.L3NetworkInventory @@ -9,6 +17,8 @@ import org.zstack.test.integration.kvm.KvmTest import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase +import java.util.concurrent.atomic.AtomicBoolean + /** * @Author: fubang * @Date: 2018/7/9 @@ -35,6 +45,7 @@ class CreateVmWithSameHostnameCase extends SubCase{ void test() { env.create { testCreateVmWithSameHostname() + testVmStateChangedFromPausedToNoState() } } @@ -67,4 +78,46 @@ class CreateVmWithSameHostnameCase extends SubCase{ } assert vms.size() == 2 } + + void testVmStateChangedFromPausedToNoState() { + VmInstanceInventory vm = env.inventoryByName("vm") as VmInstanceInventory + String hostUuid = vm.getHostUuid() + assert hostUuid != null + pauseVmInstance { + uuid = vm.uuid + } + VmInstanceVO vmVO = dbFindByUuid(vm.uuid, VmInstanceVO.class) + assert vmVO.state == VmInstanceState.Paused + assert vmVO.hostUuid == hostUuid + AtomicBoolean eventReceived = new AtomicBoolean(false) + EventFacade evtf = bean(EventFacade.class) + evtf.on(VmTracerCanonicalEvents.VM_STATE_CHANGED_PATH, new EventCallback() { + @Override + void run(Map tokens, Object data) { + VmTracerCanonicalEvents.VmStateChangedOnHostData d = (VmTracerCanonicalEvents.VmStateChangedOnHostData) data + if (d.getVmUuid().equals(vm.uuid) + && d.getFrom() == VmInstanceState.Paused + && d.getTo() == VmInstanceState.NoState + && d.getOriginalHostUuid().equals(hostUuid) + && d.getCurrentHostUuid().equals(hostUuid)) { + eventReceived.set(true) + } + } + }) + CloudBus bus = bean(CloudBus.class) + VmStateChangedOnHostMsg msg = new VmStateChangedOnHostMsg() + msg.setVmStateAtTracingMoment(VmInstanceState.Paused) + msg.setVmInstanceUuid(vm.uuid) + msg.setStateOnHost(VmInstanceState.NoState) + msg.setHostUuid(hostUuid) + msg.setFromSync(true) + bus.makeTargetServiceIdByResourceUuid(msg, VmInstanceConstant.SERVICE_ID, vm.uuid) + bus.send(msg) + retryInSecs { + vmVO = dbFindByUuid(vm.uuid, VmInstanceVO.class) + assert vmVO.state == VmInstanceState.NoState + assert vmVO.hostUuid == hostUuid + assert eventReceived.get() : "VmStateChangedOnHostData event should be fired" + } + } } From 10147e4fc37302ef25c06c6f5b6ce1cf3b6f52dd Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Mon, 12 Jan 2026 09:40:58 +0800 Subject: [PATCH 686/737] [error code]: global error code Resolves: ZSTAC-66343 Change-Id: I6e6b6f76676c7671786e79696f70746268717864 --- .../java/org/zstack/compute/VmNicUtils.java | 17 +- .../AttachedL2NetworkAllocatorFlow.java | 3 +- .../AttachedPrimaryStorageAllocatorFlow.java | 3 +- ...chedVolumePrimaryStorageAllocatorFlow.java | 5 +- .../allocator/AvoidHostAllocatorFlow.java | 3 +- ...rageSelectPrimaryStorageAllocatorFlow.java | 9 +- .../DesignatedHostAllocatorFlow.java | 3 +- .../zstack/compute/allocator/FilterFlow.java | 3 +- .../HostAllocatorApiInterceptor.java | 5 +- .../compute/allocator/HostAllocatorChain.java | 9 +- .../allocator/HostAllocatorManagerImpl.java | 5 +- .../allocator/HostCapacityAllocatorFlow.java | 3 +- .../allocator/HostOsVersionAllocatorFlow.java | 3 +- .../HostPrimaryStorageAllocatorFlow.java | 5 +- .../compute/allocator/HostSortorChain.java | 5 +- .../HostStateAndHypervisorAllocatorFlow.java | 13 +- .../ImageBackupStorageAllocatorFlow.java | 7 +- .../ResourceBindingAllocatorFlow.java | 5 +- .../compute/allocator/TagAllocatorFlow.java | 5 +- .../cluster/ClusterApiInterceptor.java | 11 +- .../zstack/compute/cluster/ClusterBase.java | 5 +- .../cluster/ClusterCascadeExtension.java | 3 +- .../cluster/ClusterExtensionPointEmitter.java | 3 +- .../compute/host/HostApiInterceptor.java | 15 +- .../org/zstack/compute/host/HostBase.java | 25 +- .../compute/host/HostCascadeExtension.java | 3 +- .../compute/host/HostIpmiPowerExecutor.java | 23 +- .../zstack/compute/host/HostManagerImpl.java | 15 +- .../zstack/compute/vm/AbstractVmInstance.java | 5 +- .../org/zstack/compute/vm/CpuTopology.java | 3 +- .../org/zstack/compute/vm/DeleteVmGC.java | 3 +- ...nitializeResourceConfigExtensionPoint.java | 3 +- .../org/zstack/compute/vm/IsoOperator.java | 5 +- .../org/zstack/compute/vm/MacOperator.java | 9 +- .../zstack/compute/vm/StaticIpOperator.java | 19 +- .../org/zstack/compute/vm/TfVmNicFactory.java | 3 +- .../compute/vm/VmAllocateCdRomFlow.java | 3 +- .../VmAllocateHostAndPrimaryStorageFlow.java | 7 +- .../zstack/compute/vm/VmAllocateNicFlow.java | 5 +- .../compute/vm/VmAllocateNicIpFlow.java | 3 +- ...atePrimaryStorageForAttachingDiskFlow.java | 3 +- .../zstack/compute/vm/VmDownloadIsoFlow.java | 3 +- .../vm/VmImageSelectBackupStorageFlow.java | 7 +- .../compute/vm/VmInstanceApiInterceptor.java | 261 +- .../org/zstack/compute/vm/VmInstanceBase.java | 87 +- .../vm/VmInstanceExtensionPointEmitter.java | 9 +- .../compute/vm/VmInstanceManagerImpl.java | 65 +- .../zstack/compute/vm/VmInstanceUtils.java | 15 +- .../vm/VmInstantiateAttachingVolumeFlow.java | 3 +- .../vm/VmInstantiateOtherDiskFlow.java | 5 +- .../org/zstack/compute/vm/VmNicFactory.java | 3 +- .../zstack/compute/vm/VmNicManagerImpl.java | 3 +- .../zstack/compute/vm/VmQuotaOperator.java | 7 +- .../devices/VmInstanceDeviceManagerImpl.java | 19 +- .../org/zstack/compute/zone/ZoneBase.java | 5 +- .../compute/zone/ZoneCascadeExtension.java | 3 +- .../zstack/compute/zone/ZoneManagerImpl.java | 3 +- .../ConfigurationApiInterceptor.java | 15 +- .../ConfigurationManagerImpl.java | 9 +- .../configuration/DiskOfferingBase.java | 3 +- .../configuration/InstanceOfferingBase.java | 3 +- .../console/AbstractConsoleProxyBackend.java | 5 +- .../zstack/console/ConsoleApiInterceptor.java | 3 +- .../org/zstack/console/ConsoleProxyBase.java | 11 +- .../console/DeleteConsoleProxyGcJob.java | 3 +- .../ManagementServerConsoleProxyBackend.java | 11 +- .../java/org/zstack/core/CoreManagerImpl.java | 3 +- .../main/java/org/zstack/core/Platform.java | 47 +- core/src/main/java/org/zstack/core/With.java | 5 +- .../core/ansible/AnsibleFacadeImpl.java | 7 +- .../zstack/core/ansible/AnsibleRunner.java | 3 +- .../core/ansible/CallBackNetworkChecker.java | 3 +- .../zstack/core/ansible/PrepareAnsible.java | 3 +- .../core/ansible/SshFolderMd5Checker.java | 5 +- ...oudBus3ManagementNodeLifeCycleTracker.java | 3 +- .../zstack/core/cloudbus/CloudBusImpl2.java | 29 +- .../zstack/core/cloudbus/CloudBusImpl3.java | 29 +- .../zstack/core/cloudbus/EventFacadeImpl.java | 3 +- .../org/zstack/core/config/GlobalConfig.java | 3 +- .../core/config/GlobalConfigFacadeImpl.java | 9 +- .../zstack/core/debug/DebugManagerImpl.java | 3 +- .../core/encrypt/EncryptFacadeImpl.java | 3 +- .../errorcode/ElaborationManagerImpl.java | 17 +- .../ExternalServiceManagerImpl.java | 9 +- .../org/zstack/core/gc/GarbageCollector.java | 3 +- .../core/gc/GarbageCollectorManagerImpl.java | 3 +- .../zstack/core/job/JobQueueFacadeImpl2.java | 9 +- .../zstack/core/plugin/PluginManagerImpl.java | 5 +- .../core/progress/ProgressApiInterceptor.java | 3 +- .../org/zstack/core/rest/RESTFacadeImpl.java | 27 +- .../java/org/zstack/core/salt/SaltRunner.java | 5 +- .../zstack/core/salt/SaltSetupMinionJob.java | 7 +- .../singleflight/AbstractSingleFlight.java | 3 +- .../MultiNodeSingleFlightImpl.java | 3 +- .../zstack/core/thread/DispatchQueueImpl.java | 7 +- .../core/timeout/ApiTimeoutManagerImpl.java | 3 +- .../zstack/core/trash/StorageRecycleImpl.java | 5 +- .../zstack/core/upgrade/UpgradeChecker.java | 11 +- .../core/validation/ValidationFacadeImpl.java | 3 +- .../core/webhook/WebhookApiInterceptor.java | 3 +- .../core/workflow/AsyncWorkFlowChain.java | 3 +- .../zstack/core/workflow/SimpleFlowChain.java | 3 +- .../zstack/core/workflow/WorkFlowChain.java | 3 +- .../externalservice/cronjob/CronJobImpl.java | 5 +- .../zstack/header/errorcode/ErrorCode.java | 9 + .../identity/AccountAPIRequestChecker.java | 3 +- .../java/org/zstack/identity/AccountBase.java | 9 +- .../zstack/identity/AccountInterceptor.java | 5 +- .../zstack/identity/AccountLoginBackend.java | 3 +- .../zstack/identity/AccountManagerImpl.java | 103 +- .../identity/AccountQuotaUpdateChecker.java | 5 +- .../zstack/identity/AuthorizationManager.java | 7 +- .../identity/DefaultAuthorizationBackend.java | 3 +- .../java/org/zstack/identity/QuotaUtil.java | 9 +- .../java/org/zstack/identity/Session.java | 7 +- .../identity/SessionAPIRequestChecker.java | 5 +- .../identity/login/LoginManagerImpl.java | 3 +- .../OperationTargetAPIRequestChecker.java | 9 +- .../identity/rbac/RBACAPIRequestChecker.java | 9 +- .../identity/rbac/RBACApiInterceptor.java | 13 +- .../org/zstack/image/AddImageLongJob.java | 3 +- .../image/BackupStorageDeleteBitGC.java | 3 +- .../org/zstack/image/ImageApiInterceptor.java | 29 +- .../main/java/org/zstack/image/ImageBase.java | 21 +- .../org/zstack/image/ImageManagerImpl.java | 33 +- .../org/zstack/image/UploadImageTracker.java | 9 +- .../zstack/longjob/LongJobApiInterceptor.java | 13 +- .../zstack/longjob/LongJobFactoryImpl.java | 3 +- .../zstack/longjob/LongJobManagerImpl.java | 13 +- .../java/org/zstack/longjob/LongJobUtils.java | 9 +- .../network/l2/L2NetworkApiInterceptor.java | 27 +- .../network/l2/L2NetworkCascadeExtension.java | 3 +- .../network/l2/L2NetworkManagerImpl.java | 5 +- .../zstack/network/l2/L2NoVlanNetwork.java | 11 +- .../l3/AbstractIpAllocatorStrategy.java | 5 +- .../org/zstack/network/l3/L3BasicNetwork.java | 3 +- .../network/l3/L3NetworkApiInterceptor.java | 149 +- .../network/l3/L3NetworkCascadeExtension.java | 5 +- .../network/l3/L3NetworkManagerImpl.java | 3 +- .../zstack/network/service/DhcpExtension.java | 5 +- .../network/service/HostRouteExtension.java | 5 +- .../service/NetworkServiceApiInterceptor.java | 15 +- .../service/NetworkServiceManagerImpl.java | 9 +- .../acl/AccessControlListApiInterceptor.java | 31 +- .../zstack/appliancevm/ApplianceVmBase.java | 5 +- .../appliancevm/ApplianceVmConnectFlow.java | 7 +- .../ApplianceVmDeployAgentFlow.java | 3 +- .../ApplianceVmKvmBootstrapFlow.java | 3 +- .../ApplianceVmManagementIpChecker.java | 3 +- .../org/zstack/cbd/kvm/KvmCbdNodeServer.java | 3 +- .../storage/ceph/CephApiInterceptor.java | 33 +- .../org/zstack/storage/ceph/CephMonBase.java | 9 +- .../java/org/zstack/storage/ceph/MonUri.java | 13 +- .../ceph/backup/CephBackupStorageBase.java | 25 +- .../ceph/backup/CephBackupStorageMonBase.java | 9 +- .../ceph/primary/CephDeleteVolumeChainGC.java | 3 +- .../ceph/primary/CephPrimaryStorageBase.java | 69 +- .../primary/CephPrimaryStorageFactory.java | 25 +- .../primary/CephPrimaryStorageMonBase.java | 9 +- .../ceph/primary/CephRequiredUrlParser.java | 3 +- .../ceph/primary/CephSnapshotProtector.java | 3 +- .../capacity/CephOsdGroupCapacityHelper.java | 5 +- .../directory/DirectoryApiInterceptor.java | 9 +- .../org/zstack/directory/DirectoryBase.java | 5 +- .../directory/DirectoryManagerImpl.java | 9 +- .../zstack/directory/VmDirectoryChecker.java | 3 +- .../service/eip/EipApiInterceptor.java | 41 +- .../network/service/eip/EipManagerImpl.java | 9 +- .../java/org/zstack/expon/ExponApiHelper.java | 9 +- .../zstack/expon/ExponStorageController.java | 17 +- .../org/zstack/expon/sdk/ExponResponse.java | 3 +- .../ExternalPrimaryStorageAllocator.java | 3 +- .../kvm/ExternalPrimaryStorageKvmFactory.java | 7 +- .../network/service/flat/DhcpApply.java | 9 +- .../service/flat/FlatApiInterceptor.java | 5 +- .../flat/FlatDHCPDeleteNamespaceGC.java | 3 +- .../network/service/flat/FlatDhcpBackend.java | 67 +- .../flat/FlatDhcpUpgradeExtension.java | 3 +- .../service/flat/FlatEipApiInterceptor.java | 7 +- .../network/service/flat/FlatEipBackend.java | 11 +- .../network/service/flat/FlatEipGC.java | 3 +- .../service/flat/FlatUserdataBackend.java | 13 +- .../lldp/LldpApiInterceptor.java | 5 +- .../lldp/LldpManagerImpl.java | 5 +- .../zstack/iscsi/kvm/KvmIscsiNodeServer.java | 3 +- .../org/zstack/kvm/KVMApiInterceptor.java | 13 +- .../kvm/KVMConsoleHypervisorBackend.java | 7 +- .../src/main/java/org/zstack/kvm/KVMHost.java | 245 +- .../zstack/kvm/KVMHostAsyncHttpCallReply.java | 7 +- .../zstack/kvm/KVMHostDeployArguments.java | 3 +- .../java/org/zstack/kvm/KVMHostFactory.java | 23 +- .../kvm/KVMRealizeL2NoVlanNetworkBackend.java | 9 +- .../kvm/KVMRealizeL2VlanNetworkBackend.java | 9 +- .../zstack/kvm/KVMSecurityGroupBackend.java | 11 +- .../KvmVmHardwareVerifyExtensionPoint.java | 3 +- .../org/zstack/kvm/KvmVmSyncPingTask.java | 7 +- .../KvmHypervisorInfoExtensions.java | 3 +- .../org/zstack/kvm/xmlhook/XmlHookBase.java | 3 +- .../kvm/xmlhook/XmlHookManagerImpl.java | 3 +- .../org/zstack/ldap/LdapApiInterceptor.java | 15 +- .../java/org/zstack/ldap/LdapManagerImpl.java | 17 +- .../main/java/org/zstack/ldap/LdapUtil.java | 11 +- .../ldap/externalSearch/AggregateSearch.java | 3 +- .../lb/LoadBalancerApiInterceptor.java | 289 +- .../network/service/lb/LoadBalancerBase.java | 21 +- .../service/lb/LoadBalancerManagerImpl.java | 35 +- .../lb/LoadBalancerWeightOperator.java | 3 +- ...ocatePrimaryStorageForVmMigrationFlow.java | 3 +- .../local/LocalStorageAllocatorFactory.java | 9 +- .../local/LocalStorageApiInterceptor.java | 37 +- .../primary/local/LocalStorageBase.java | 35 +- ...calStorageDefaultAllocateCapacityFlow.java | 7 +- ...StorageDesignatedAllocateCapacityFlow.java | 5 +- .../primary/local/LocalStorageFactory.java | 27 +- .../primary/local/LocalStorageKvmBackend.java | 29 +- .../primary/local/LocalStorageKvmFactory.java | 5 +- .../local/LocalStorageKvmMigrateVmFlow.java | 5 +- ...orageKvmSftpBackupStorageMediatorImpl.java | 5 +- .../local/LocalStorageMainAllocatorFlow.java | 7 +- ...LocalStorageSnapshotDeletionProtector.java | 3 +- .../primary/local/LocalStorageUtils.java | 9 +- .../login/plugin/LoginPluginBackend.java | 7 +- .../org/zstack/mediator/ApiValidator.java | 17 +- .../primary/nfs/NfsApiParamChecker.java | 13 +- .../primary/nfs/NfsPrimaryStorage.java | 59 +- .../primary/nfs/NfsPrimaryStorageFactory.java | 13 +- .../nfs/NfsPrimaryStorageKVMBackend.java | 69 +- .../nfs/NfsPrimaryToSftpBackupKVMBackend.java | 5 +- .../nfs/NfsVolumeSnapshotProtector.java | 3 +- .../PortForwardingApiInterceptor.java | 39 +- .../PortForwardingManagerImpl.java | 13 +- .../SdnControllerApiInterceptor.java | 37 +- .../sdnController/SdnControllerBase.java | 9 +- .../SdnControllerManagerImpl.java | 19 +- .../h3cVcfc/H3cVcfcApiInterceptor.java | 21 +- .../h3cVcfc/H3cVcfcSdnController.java | 29 +- .../h3cVcfc/H3cVcfcV2SdnController.java | 31 +- .../hardwareVxlan/HardwareVxlanNetwork.java | 3 +- .../HardwareVxlanNetworkFactory.java | 5 +- .../HardwareVxlanNetworkPool.java | 3 +- .../HardwareVxlanNetworkPoolFactory.java | 13 +- ...KVMRealizeHardwareVxlanNetworkBackend.java | 7 +- ...ealizeHardwareVxlanPoolNetworkBackend.java | 3 +- .../SecurityGroupApiInterceptor.java | 245 +- .../SecurityGroupManagerImpl.java | 13 +- .../SecurityGroupNetworkServiceExtension.java | 5 +- .../backup/sftp/SftpBackupStorage.java | 27 +- .../sftp/SftpBackupStorageApiInterceptor.java | 11 +- .../backup/sftp/SftpBackupStorageFactory.java | 5 +- .../sftp/SftpBackupStorageMetaDataMaker.java | 11 +- .../smp/KvmAgentCommandDispatcher.java | 5 +- .../storage/primary/smp/KvmBackend.java | 29 +- .../primary/smp/SMPPrimaryStorageBase.java | 15 +- .../primary/smp/SMPPrimaryStorageFactory.java | 7 +- .../smp/SMPSnapshotDeletionProtector.java | 3 +- .../smp/SharedMountPointApiInterceptor.java | 3 +- .../sshkeypair/SshKeyPairAPIInterceptor.java | 13 +- .../org/zstack/sshkeypair/SshKeyPairBase.java | 5 +- .../sshkeypair/SshKeyPairManagerImpl.java | 9 +- .../controller/SugonSdnController.java | 69 +- .../header/SugonApiInterceptor.java | 7 +- .../network/TfL2Network.java | 7 +- .../network/TfL3Network.java | 33 +- .../network/TfMigrateVmBackend.java | 5 +- .../userdata/TfUserdataBackend.java | 11 +- .../zstack/vhost/kvm/KvmVhostNodeServer.java | 5 +- .../service/vip/VipApiInterceptor.java | 23 +- .../zstack/network/service/vip/VipBase.java | 11 +- .../network/service/vip/VipManagerImpl.java | 3 +- .../service/virtualrouter/VirtualRouter.java | 11 +- .../VirtualRouterApiInterceptor.java | 39 +- .../VirtualRouterKvmBackend.java | 5 +- .../VirtualRouterManagerImpl.java | 29 +- .../dhcp/VirtualRouterDhcpBackend.java | 5 +- .../VirtualRouterSyncDHCPOnStartFlow.java | 3 +- .../dns/VirtualRouterDnsBackend.java | 7 +- .../dns/VirtualRouterSyncDnsOnStartFlow.java | 3 +- .../eip/VirtualRouterEipBackend.java | 9 +- .../eip/VirtualRouterSyncEipOnStartFlow.java | 3 +- .../ha/VirtualRouterHaBackendImpl.java | 3 +- .../lb/VirtualRouterLoadBalancerBackend.java | 23 +- .../VirtualRouterDeployAgentFlow.java | 5 +- .../nat/VirtualRouterSnatBackend.java | 5 +- .../nat/VirtualRouterSyncSNATOnStartFlow.java | 3 +- ...rtforwardingRuleOnVirtualRouterVmFlow.java | 3 +- ...rtForwardingRuleOnVirtualRouterVmFlow.java | 3 +- .../VirtualRouterPortForwardingBackend.java | 9 +- ...terSyncPortForwardingRulesOnStartFlow.java | 3 +- .../vip/VirtualRouterVipBackend.java | 7 +- .../vip/VirtualRouterVipBaseBackend.java | 9 +- ...L3FirewallDefaultActionExtensionPoint.java | 3 +- .../virtualrouter/vyos/VyosConfigSshFlow.java | 5 +- .../virtualrouter/vyos/VyosConnectFlow.java | 3 +- .../vyos/VyosDeployAgentFlow.java | 3 +- .../virtualrouter/vyos/VyosDhcpBackend.java | 7 +- .../service/virtualrouter/vyos/VyosVm.java | 3 +- .../vxlanNetwork/VxlanNetworkFactory.java | 3 +- .../AbstractVniAllocatorStrategy.java | 5 +- .../KVMRealizeL2VxlanNetworkBackend.java | 13 +- .../KVMRealizeL2VxlanNetworkPoolBackend.java | 5 +- .../VxlanNetworkCheckerImpl.java | 17 +- .../vxlanNetworkPool/VxlanNetworkPool.java | 11 +- .../VxlanPoolApiInterceptor.java | 19 +- .../org/zstack/xinfini/XInfiniApiHelper.java | 21 +- .../xinfini/XInfiniStorageController.java | 37 +- .../zstack/xinfini/XInfiniStorageFactory.java | 3 +- .../zstack/xinfini/sdk/XInfiniResponse.java | 3 +- .../zstack/xinfini/sdk/XinfiniApiResult.java | 3 +- .../java/org/zstack/storage/zbs/MdsUri.java | 13 +- .../org/zstack/storage/zbs/ZbsMdsBase.java | 7 +- .../storage/zbs/ZbsPrimaryStorageMdsBase.java | 9 +- .../storage/zbs/ZbsStorageController.java | 55 +- .../zstack/storage/zbs/ZbsStorageFactory.java | 5 +- .../portal/apimediator/ApiMediatorImpl.java | 9 +- .../portal/apimediator/ApiParamValidator.java | 5 +- .../portal/apimediator/PortApiValidator.java | 11 +- .../ManagementNodeManagerImpl.java | 3 +- .../zstack/resourceconfig/ResourceConfig.java | 7 +- .../ResourceConfigApiInterceptor.java | 13 +- .../ResourceConfigFacadeImpl.java | 3 +- .../resources/scripts/SdkApiTemplate.groovy | 2 +- ...reateDataVolumeFromVolumeBackupAction.java | 2 +- ...aVolumeTemplateFromVolumeBackupAction.java | 2 +- ...tVolumeTemplateFromVolumeBackupAction.java | 2 +- .../volume/backup/CreateVmBackupAction.java | 2 +- .../backup/CreateVmFromVmBackupAction.java | 2 +- .../CreateVmFromVolumeBackupAction.java | 2 +- .../backup/CreateVolumeBackupAction.java | 2 +- .../volume/backup/DeleteVmBackupAction.java | 2 +- .../backup/DeleteVolumeBackupAction.java | 2 +- .../backup/QueryVolumeBackupAction.java | 2 +- ...ckupFromImageStoreBackupStorageAction.java | 2 +- ...ckupFromImageStoreBackupStorageAction.java | 2 +- .../backup/RevertVmFromVmBackupAction.java | 2 +- .../RevertVolumeFromVolumeBackupAction.java | 2 +- ...ckupFromImageStoreBackupStorageAction.java | 2 +- .../volume/backup/SyncVmBackupAction.java | 2 +- ...ckupFromImageStoreBackupStorageAction.java | 2 +- .../volume/backup/SyncVolumeBackupAction.java | 2 +- .../sdk/AddAccessControlListEntryAction.java | 2 +- ...ddAccessControlListRedirectRuleAction.java | 2 +- ...AccessControlListToLoadBalancerAction.java | 2 +- .../sdk/AddAccessControlRuleAction.java | 2 +- .../sdk/AddAliyunEbsBackupStorageAction.java | 2 +- .../sdk/AddAliyunEbsPrimaryStorageAction.java | 2 +- .../zstack/sdk/AddAliyunKeySecretAction.java | 2 +- .../sdk/AddAliyunNasAccessGroupAction.java | 2 +- .../sdk/AddAliyunNasFileSystemAction.java | 2 +- .../sdk/AddAliyunNasMountTargetAction.java | 2 +- .../sdk/AddAliyunNasPrimaryStorageAction.java | 2 +- .../sdk/AddAliyunPanguPartitionAction.java | 2 +- .../zstack/sdk/AddAppBuildSystemAction.java | 2 +- .../AddBackendServerToServerGroupAction.java | 2 +- ...ackupStoragesToReplicationGroupAction.java | 2 +- .../sdk/AddBareMetal2GatewayAction.java | 2 +- .../sdk/AddBareMetal2IpmiChassisAction.java | 2 +- .../sdk/AddBlockPrimaryStorageAction.java | 2 +- .../org/zstack/sdk/AddBuildAppAction.java | 2 +- .../zstack/sdk/AddCCSCertificateAction.java | 2 +- .../sdk/AddCephBackupStorageAction.java | 2 +- .../sdk/AddCephPrimaryStorageAction.java | 2 +- .../sdk/AddCephPrimaryStoragePoolAction.java | 2 +- ...rtificateToLoadBalancerListenerAction.java | 2 +- ...ConnectionAccessPointFromRemoteAction.java | 2 +- .../AddContainerManagementEndpointAction.java | 2 +- .../sdk/AddDataCenterFromRemoteAction.java | 2 +- ...DisasterImageStoreBackupStorageAction.java | 2 +- .../zstack/sdk/AddDnsToL3NetworkAction.java | 2 +- .../zstack/sdk/AddDnsToVpcRouterAction.java | 2 +- .../sdk/AddExternalBackupStorageAction.java | 2 +- .../sdk/AddExternalPrimaryStorageAction.java | 2 +- .../sdk/AddFiSecSecurityMachineAction.java | 2 +- .../sdk/AddFlkSecSecurityMachineAction.java | 2 +- .../sdk/AddHostRouteToL3NetworkAction.java | 2 +- ...ddHostToHostSchedulingRuleGroupAction.java | 2 +- .../zstack/sdk/AddHybridKeySecretAction.java | 2 +- .../sdk/AddIdentityZoneFromRemoteAction.java | 2 +- .../java/org/zstack/sdk/AddImageAction.java | 2 +- .../sdk/AddImageStoreBackupStorageAction.java | 2 +- .../sdk/AddInfoSecSecurityMachineAction.java | 2 +- .../sdk/AddIntegrityResourceAction.java | 2 +- .../java/org/zstack/sdk/AddIpRangeAction.java | 2 +- .../sdk/AddIpRangeByNetworkCidrAction.java | 2 +- .../org/zstack/sdk/AddIpv6RangeAction.java | 2 +- .../sdk/AddIpv6RangeByNetworkCidrAction.java | 2 +- .../org/zstack/sdk/AddIscsiServerAction.java | 2 +- .../sdk/AddJitSecurityMachineAction.java | 2 +- .../java/org/zstack/sdk/AddKVMHostAction.java | 2 +- .../sdk/AddKVMHostFromConfigFileAction.java | 2 +- .../zstack/sdk/AddL3NetworkToGroupAction.java | 2 +- .../org/zstack/sdk/AddLdapServerAction.java | 2 +- .../sdk/AddLocalPrimaryStorageAction.java | 2 +- .../zstack/sdk/AddLogConfigurationAction.java | 2 +- .../org/zstack/sdk/AddLogServerAction.java | 2 +- .../AddMdevDeviceSpecToVmInstanceAction.java | 2 +- .../org/zstack/sdk/AddMiniStorageAction.java | 2 +- .../java/org/zstack/sdk/AddModelAction.java | 2 +- .../org/zstack/sdk/AddModelCenterAction.java | 2 +- .../org/zstack/sdk/AddModelServiceAction.java | 2 +- .../sdk/AddMonToCephBackupStorageAction.java | 2 +- .../sdk/AddMonToCephPrimaryStorageAction.java | 2 +- .../sdk/AddNfsPrimaryStorageAction.java | 2 +- .../org/zstack/sdk/AddNvmeServerAction.java | 2 +- .../sdk/AddOssBucketFromRemoteAction.java | 2 +- .../AddPciDeviceSpecToVmInstanceAction.java | 2 +- .../AddPreconfigurationTemplateAction.java | 2 +- .../zstack/sdk/AddProxyToResourceAction.java | 2 +- ...AddRemoteCidrsToIPsecConnectionAction.java | 2 +- ...endezvousPointToMulticastRouterAction.java | 2 +- .../zstack/sdk/AddReservedIpRangeAction.java | 2 +- .../AddResourceStackVmPortMonitorAction.java | 2 +- .../sdk/AddResourcesToDirectoryAction.java | 2 +- .../sdk/AddSanSecSecurityMachineAction.java | 2 +- ...dulerJobGroupToSchedulerTriggerAction.java | 2 +- ...dSchedulerJobToSchedulerTriggerAction.java | 2 +- ...chedulerJobsToSchedulerJobGroupAction.java | 2 +- .../zstack/sdk/AddSdnControllerAction.java | 2 +- .../sdk/AddSecurityGroupRuleAction.java | 2 +- ...rverGroupToLoadBalancerListenerAction.java | 2 +- .../sdk/AddSftpBackupStorageAction.java | 2 +- ...dSharedBlockGroupPrimaryStorageAction.java | 2 +- ...ddSharedBlockToSharedBlockGroupAction.java | 2 +- ...dSharedMountPointPrimaryStorageAction.java | 2 +- .../sdk/AddSimulatorBackupStorageAction.java | 2 +- .../zstack/sdk/AddSimulatorHostAction.java | 2 +- .../sdk/AddSimulatorPrimaryStorageAction.java | 2 +- .../zstack/sdk/AddStackTemplateAction.java | 2 +- .../zstack/sdk/AddStorageProtocolAction.java | 2 +- .../org/zstack/sdk/AddUserToGroupAction.java | 2 +- .../sdk/AddV2VConversionHostAction.java | 2 +- .../java/org/zstack/sdk/AddVCenterAction.java | 2 +- .../AddVRouterNetworksToFlowMeterAction.java | 2 +- .../AddVRouterNetworksToOspfAreaAction.java | 2 +- .../sdk/AddVRouterRouteEntryAction.java | 2 +- .../sdk/AddVmNicToLoadBalancerAction.java | 2 +- .../sdk/AddVmNicToSecurityGroupAction.java | 2 +- .../sdk/AddVmToAffinityGroupAction.java | 2 +- .../AddVmToVmSchedulingRuleGroupAction.java | 2 +- .../org/zstack/sdk/AddXDragonHostAction.java | 2 +- .../java/org/zstack/sdk/AddZBoxAction.java | 2 +- .../sdk/AllocateHostResourceAction.java | 2 +- .../org/zstack/sdk/ApplyDRSAdviceAction.java | 2 +- .../zstack/sdk/ApplyRuleSetChangesAction.java | 2 +- .../zstack/sdk/ApplyTemplateConfigAction.java | 2 +- .../sdk/AttachAliyunDiskToEcsAction.java | 2 +- .../org/zstack/sdk/AttachAliyunKeyAction.java | 2 +- .../sdk/AttachAppBuildSystemToZoneAction.java | 2 +- ...ttachAutoScalingTemplateToGroupAction.java | 2 +- .../sdk/AttachBackupStorageToZoneAction.java | 2 +- ...ttachBareMetal2GatewayToClusterAction.java | 2 +- ...Metal2ProvisionNetworkToClusterAction.java | 2 +- ...tachBaremetalPxeServerToClusterAction.java | 2 +- .../sdk/AttachCCSCertificateToUserAction.java | 2 +- .../sdk/AttachDataVolumeToHostAction.java | 2 +- .../sdk/AttachDataVolumeToVmAction.java | 2 +- .../java/org/zstack/sdk/AttachEipAction.java | 2 +- .../sdk/AttachFirewallRuleSetToL3Action.java | 2 +- .../sdk/AttachGuestToolsIsoToVmAction.java | 2 +- .../sdk/AttachHybridEipToEcsAction.java | 2 +- .../org/zstack/sdk/AttachHybridKeyAction.java | 2 +- .../sdk/AttachIscsiServerToClusterAction.java | 2 +- .../sdk/AttachIsoToVmInstanceAction.java | 2 +- .../sdk/AttachL2NetworkToClusterAction.java | 2 +- .../zstack/sdk/AttachL3NetworkToVmAction.java | 2 +- .../sdk/AttachL3NetworkToVmNicAction.java | 2 +- ...tachL3NetworksToIPsecConnectionAction.java | 2 +- .../sdk/AttachMdevDeviceToVmAction.java | 2 +- ...chMonitorTriggerActionToTriggerAction.java | 2 +- ...AttachNetworkServiceToL3NetworkAction.java | 2 +- .../sdk/AttachNfvInstToGroupAction.java | 2 +- .../zstack/sdk/AttachNicToBondingAction.java | 2 +- .../sdk/AttachNvmeServerToClusterAction.java | 2 +- .../AttachOssBucketToEcsDataCenterAction.java | 2 +- .../zstack/sdk/AttachPciDeviceToVmAction.java | 2 +- .../sdk/AttachPoliciesToUserAction.java | 2 +- .../AttachPolicyRouteRuleSetToL3Action.java | 2 +- .../zstack/sdk/AttachPolicyToUserAction.java | 2 +- .../sdk/AttachPolicyToUserGroupAction.java | 2 +- .../sdk/AttachPortForwardingRuleAction.java | 2 +- .../sdk/AttachPriceTableToAccountAction.java | 2 +- .../AttachPrimaryStorageToClusterAction.java | 2 +- .../AttachProvisionNicToBondingAction.java | 2 +- .../sdk/AttachScsiLunToVmInstanceAction.java | 2 +- .../AttachSecurityGroupToL3NetworkAction.java | 2 +- ...achServiceToObservabilityServerAction.java | 2 +- .../AttachSshKeyPairToVmInstanceAction.java | 2 +- .../sdk/AttachTagToResourcesAction.java | 2 +- .../zstack/sdk/AttachUsbDeviceToVmAction.java | 2 +- ...achUserDefinedXmlHookScriptToVmAction.java | 2 +- ...ttachVRouterRouteTableToVRouterAction.java | 2 +- .../sdk/AttachVipToLoadBalancerAction.java | 2 +- .../sdk/AttachVipToVpcSharedQosAction.java | 2 +- .../org/zstack/sdk/AttachVmNicToVmAction.java | 2 +- .../BackupDatabaseToPublicCloudAction.java | 2 +- .../sdk/BackupStorageMigrateImageAction.java | 2 +- .../BatchAddBareMetal2IpmiChassisAction.java | 2 +- .../BatchCreateBaremetalChassisAction.java | 2 +- .../sdk/BatchDeleteVolumeSnapshotAction.java | 2 +- .../java/org/zstack/sdk/BatchQueryAction.java | 2 +- .../zstack/sdk/BatchSyncVolumeSizeAction.java | 2 +- .../zstack/sdk/BindModelToServiceAction.java | 2 +- .../zstack/sdk/BootstrapMiniHostAction.java | 2 +- ...CalculateAccountBillingSpendingAction.java | 2 +- .../sdk/CalculateAccountSpendingAction.java | 2 +- .../zstack/sdk/CalculateImageHashAction.java | 2 +- .../sdk/CalculateResourceSpendingAction.java | 2 +- .../org/zstack/sdk/CancelLongJobAction.java | 2 +- ...geAccessControlListRedirectRuleAction.java | 2 +- ...ngeAccessControlListServerGroupAction.java | 2 +- .../sdk/ChangeAccessKeyStateAction.java | 2 +- .../ChangeAccountPriceTableBindingAction.java | 2 +- .../sdk/ChangeAffinityGroupStateAction.java | 2 +- .../sdk/ChangeAppBuildSystemStateAction.java | 2 +- .../ChangeAutoScalingGroupStateAction.java | 2 +- .../sdk/ChangeBackupStorageStateAction.java | 2 +- ...eBareMetal2ChassisOfferingStateAction.java | 2 +- .../ChangeBareMetal2ChassisStateAction.java | 2 +- .../ChangeBareMetal2GatewayClusterAction.java | 2 +- .../ChangeBareMetal2GatewayStateAction.java | 2 +- ...hangeBareMetal2InstancePasswordAction.java | 2 +- ...BareMetal2ProvisionNetworkStateAction.java | 2 +- .../ChangeBaremetalChassisStateAction.java | 2 +- .../zstack/sdk/ChangeClusterStateAction.java | 2 +- .../sdk/ChangeDiskOfferingStateAction.java | 2 +- .../org/zstack/sdk/ChangeEipStateAction.java | 2 +- .../sdk/ChangeFirewallRuleStateAction.java | 2 +- ...ngeHostNetworkInterfaceLldpModeAction.java | 2 +- .../zstack/sdk/ChangeHostPasswordAction.java | 2 +- .../org/zstack/sdk/ChangeHostStateAction.java | 2 +- .../sdk/ChangeIPSecConnectionStateAction.java | 2 +- .../sdk/ChangeIPsecConnectionAction.java | 2 +- .../zstack/sdk/ChangeImageStateAction.java | 2 +- .../sdk/ChangeInstanceOfferingAction.java | 2 +- .../ChangeInstanceOfferingStateAction.java | 2 +- .../sdk/ChangeL2NetworkVlanIdAction.java | 2 +- .../ChangeL3NetworkDhcpIpAddressAction.java | 2 +- .../sdk/ChangeL3NetworkStateAction.java | 2 +- ...ChangeLoadBalancerBackendServerAction.java | 2 +- .../sdk/ChangeLoadBalancerListenerAction.java | 2 +- .../zstack/sdk/ChangeMediaStateAction.java | 2 +- ...ChangeMonitorTriggerActionStateAction.java | 2 +- .../sdk/ChangeMonitorTriggerStateAction.java | 2 +- .../sdk/ChangeMulticastRouterStateAction.java | 2 +- ...ChangeNfvInstGroupOperationModeAction.java | 2 +- .../ChangePortForwardingRuleStateAction.java | 2 +- .../sdk/ChangePortMirrorStateAction.java | 2 +- ...gePreconfigurationTemplateStateAction.java | 2 +- .../sdk/ChangePrimaryStorageStateAction.java | 2 +- .../zstack/sdk/ChangeResourceOwnerAction.java | 2 +- .../sdk/ChangeSchedulerStateAction.java | 2 +- .../zstack/sdk/ChangeSdnControllerAction.java | 2 +- .../ChangeSecretResourcePoolStateAction.java | 2 +- .../sdk/ChangeSecurityGroupRuleAction.java | 2 +- .../ChangeSecurityGroupRuleStateAction.java | 2 +- .../sdk/ChangeSecurityGroupStateAction.java | 2 +- .../sdk/ChangeSecurityMachineStateAction.java | 2 +- .../sdk/ChangeSlbGroupDeployTypeAction.java | 2 +- .../sdk/ChangeSlbGroupMonitorIpsAction.java | 2 +- .../ChangeV2VConversionHostStateAction.java | 2 +- .../zstack/sdk/ChangeVfNicHaStateAction.java | 2 +- .../org/zstack/sdk/ChangeVipStateAction.java | 2 +- .../org/zstack/sdk/ChangeVmImageAction.java | 2 +- .../zstack/sdk/ChangeVmNicNetworkAction.java | 2 +- .../sdk/ChangeVmNicSecurityPolicyAction.java | 2 +- .../zstack/sdk/ChangeVmNicStateAction.java | 2 +- .../org/zstack/sdk/ChangeVmNicTypeAction.java | 2 +- .../zstack/sdk/ChangeVmPasswordAction.java | 2 +- .../ChangeVmSchedulingRuleStateAction.java | 2 +- .../zstack/sdk/ChangeVolumeStateAction.java | 2 +- .../sdk/ChangeVpcHaGroupMonitorIpsAction.java | 2 +- .../ChangeVpcSharedQosBandwidthAction.java | 2 +- .../org/zstack/sdk/ChangeZoneStateAction.java | 2 +- .../zstack/sdk/CheckApiPermissionAction.java | 2 +- ...BareMetal2IpmiChassisConfigFileAction.java | 2 +- ...CheckBaremetalChassisConfigFileAction.java | 2 +- .../sdk/CheckBatchDataIntegrityAction.java | 2 +- .../sdk/CheckBuildAppParametersAction.java | 2 +- .../sdk/CheckElaborationContentAction.java | 2 +- .../CheckFirewallRuleConfigFileAction.java | 2 +- .../zstack/sdk/CheckIpAvailabilityAction.java | 2 +- .../sdk/CheckKVMHostConfigFileAction.java | 2 +- .../sdk/CheckNetworkReachableAction.java | 2 +- .../sdk/CheckResourcePermissionAction.java | 2 +- .../sdk/CheckScsiLunClusterStatusAction.java | 2 +- .../CheckStackTemplateParametersAction.java | 2 +- .../sdk/CheckStaticProvisionIpAction.java | 2 +- .../sdk/CheckVipPortAvailabilityAction.java | 2 +- ...VolumeSnapshotGroupAvailabilityAction.java | 2 +- .../sdk/CleanInvalidLdapBindingAction.java | 2 +- .../CleanInvalidLdapIAM2BindingAction.java | 2 +- .../org/zstack/sdk/CleanLongJobAction.java | 2 +- .../java/org/zstack/sdk/CleanQueueAction.java | 2 +- .../sdk/CleanUpBareMetal2BondingAction.java | 2 +- .../CleanUpBaremetalChassisBondingAction.java | 2 +- ...eanUpImageCacheOnPrimaryStorageAction.java | 2 +- ...nUpStorageTrashOnPrimaryStorageAction.java | 2 +- .../CleanUpTrashOnBackupStorageAction.java | 2 +- .../CleanUpTrashOnPrimaryStorageAction.java | 2 +- .../sdk/CleanV2VConversionCacheAction.java | 2 +- .../zstack/sdk/CleanupBillingUsageAction.java | 2 +- .../java/org/zstack/sdk/CloneImageAction.java | 2 +- .../zstack/sdk/CloneModelServiceAction.java | 2 +- .../org/zstack/sdk/CloneVmInstanceAction.java | 2 +- .../ConvertVmFromForeignHypervisorAction.java | 2 +- .../sdk/CreateAccessControlListAction.java | 2 +- .../org/zstack/sdk/CreateAccessKeyAction.java | 2 +- .../org/zstack/sdk/CreateAccountAction.java | 2 +- .../zstack/sdk/CreateAffinityGroupAction.java | 2 +- .../CreateAiSiNoSecretResourcePoolAction.java | 2 +- .../sdk/CreateAliyunDiskFromRemoteAction.java | 2 +- .../sdk/CreateAliyunNasAccessGroupAction.java | 2 +- .../CreateAliyunNasAccessGroupRuleAction.java | 2 +- .../sdk/CreateAliyunNasFileSystemAction.java | 2 +- .../sdk/CreateAliyunNasMountTargetAction.java | 2 +- .../sdk/CreateAliyunProxyVSwitchAction.java | 2 +- .../sdk/CreateAliyunProxyVpcAction.java | 2 +- ...eateAliyunRouterInterfaceRemoteAction.java | 2 +- .../sdk/CreateAliyunSnapshotRemoteAction.java | 2 +- ...iyunVpcVirtualRouterEntryRemoteAction.java | 2 +- .../sdk/CreateAutoScalingGroupAction.java | 2 +- ...alingGroupAddingNewInstanceRuleAction.java | 2 +- ...ScalingGroupRemovalInstanceRuleAction.java | 2 +- ...eateAutoScalingRuleAlarmTriggerAction.java | 2 +- ...oScalingRuleSchedulerJobTriggerAction.java | 2 +- .../CreateAutoScalingVmTemplateAction.java | 2 +- .../sdk/CreateBareMetal2BondingAction.java | 2 +- .../sdk/CreateBareMetal2InstanceAction.java | 2 +- ...reMetal2IpmiChassisHardwareInfoAction.java | 2 +- ...reateBareMetal2ProvisionNetworkAction.java | 2 +- .../sdk/CreateBaremetalBondingAction.java | 2 +- .../sdk/CreateBaremetalChassisAction.java | 2 +- .../sdk/CreateBaremetalInstanceAction.java | 2 +- .../sdk/CreateBaremetalPxeServerAction.java | 2 +- .../zstack/sdk/CreateBlockVolumeAction.java | 2 +- .../org/zstack/sdk/CreateBondingAction.java | 2 +- .../org/zstack/sdk/CreateBuildAppAction.java | 2 +- .../CreateCSPSecretResourcePoolAction.java | 2 +- .../org/zstack/sdk/CreateCasClientAction.java | 2 +- .../org/zstack/sdk/CreateCbtTaskAction.java | 2 +- .../org/zstack/sdk/CreateCdpPolicyAction.java | 2 +- .../org/zstack/sdk/CreateCdpTaskAction.java | 2 +- .../zstack/sdk/CreateCertificateAction.java | 2 +- .../org/zstack/sdk/CreateClusterAction.java | 2 +- .../zstack/sdk/CreateClusterDRSAction.java | 2 +- ...etweenL3NetworkAndAliyunVSwitchAction.java | 2 +- .../zstack/sdk/CreateDataVolumeAction.java | 2 +- ...ateDataVolumeFromVolumeSnapshotAction.java | 2 +- ...ateDataVolumeFromVolumeTemplateAction.java | 2 +- ...ateDataVolumeTemplateFromVolumeAction.java | 2 +- ...olumeTemplateFromVolumeSnapshotAction.java | 2 +- .../org/zstack/sdk/CreateDatasetAction.java | 2 +- .../org/zstack/sdk/CreateDirectoryAction.java | 2 +- .../zstack/sdk/CreateDiskOfferingAction.java | 2 +- .../CreateEcsImageFromEcsSnapshotAction.java | 2 +- .../CreateEcsImageFromLocalImageAction.java | 2 +- .../CreateEcsInstanceFromEcsImageAction.java | 2 +- .../CreateEcsSecurityGroupRemoteAction.java | 2 +- ...reateEcsSecurityGroupRuleRemoteAction.java | 2 +- .../sdk/CreateEcsVSwitchRemoteAction.java | 2 +- .../zstack/sdk/CreateEcsVpcRemoteAction.java | 2 +- .../java/org/zstack/sdk/CreateEipAction.java | 2 +- .../zstack/sdk/CreateEmailMediaAction.java | 2 +- ...CreateEmailMonitorTriggerActionAction.java | 2 +- .../CreateFaultToleranceVmInstanceAction.java | 2 +- .../CreateFiSecSecretResourcePoolAction.java | 2 +- .../CreateFirewallIpSetTemplateAction.java | 2 +- .../zstack/sdk/CreateFirewallRuleAction.java | 2 +- ...reateFirewallRuleFromConfigFileAction.java | 2 +- .../sdk/CreateFirewallRuleSetAction.java | 2 +- .../sdk/CreateFirewallRuleTemplateAction.java | 2 +- .../CreateFlkSecSecretResourcePoolAction.java | 2 +- .../zstack/sdk/CreateFlowCollectorAction.java | 2 +- .../org/zstack/sdk/CreateFlowMeterAction.java | 2 +- .../zstack/sdk/CreateGuestVmScriptAction.java | 2 +- .../CreateHaiTaiSecretResourcePoolAction.java | 2 +- .../CreateHostNetworkServiceTypeAction.java | 2 +- .../CreateHostSchedulingRuleGroupAction.java | 2 +- .../org/zstack/sdk/CreateHybridEipAction.java | 2 +- .../CreateIAM2VirtualIDFromLdapUidAction.java | 2 +- .../CreateIAM2VirtualIDLdapBindingAction.java | 2 +- .../sdk/CreateIPsecConnectionAction.java | 2 +- .../sdk/CreateImageGroupFromImageAction.java | 2 +- .../CreateImageGroupFromSnapshotAction.java | 2 +- .../CreateImageGroupFromVmInstanceAction.java | 2 +- .../CreateImageReplicationGroupAction.java | 2 +- ...CreateInfoSecSecretResourcePoolAction.java | 2 +- .../sdk/CreateInstanceOfferingAction.java | 2 +- .../CreateJitSecretResourcePoolAction.java | 2 +- .../CreateKoAlSecretResourcePoolAction.java | 2 +- .../CreateL2HardwareVxlanNetworkAction.java | 2 +- ...reateL2HardwareVxlanNetworkPoolAction.java | 2 +- .../sdk/CreateL2NoVlanNetworkAction.java | 2 +- .../zstack/sdk/CreateL2PortGroupAction.java | 2 +- .../zstack/sdk/CreateL2TfNetworkAction.java | 2 +- .../sdk/CreateL2VirtualSwitchAction.java | 2 +- .../zstack/sdk/CreateL2VlanNetworkAction.java | 2 +- .../sdk/CreateL2VxlanNetworkAction.java | 2 +- .../sdk/CreateL2VxlanNetworkPoolAction.java | 2 +- .../org/zstack/sdk/CreateL3NetworkAction.java | 2 +- .../zstack/sdk/CreateLdapBindingAction.java | 2 +- .../zstack/sdk/CreateLoadBalancerAction.java | 2 +- .../sdk/CreateLoadBalancerListenerAction.java | 2 +- .../CreateLoadBalancerServerGroupAction.java | 2 +- .../zstack/sdk/CreateMiniClusterAction.java | 2 +- .../sdk/CreateMonitorTriggerAction.java | 2 +- .../sdk/CreateMulticastRouterAction.java | 2 +- .../org/zstack/sdk/CreateNfvInstAction.java | 2 +- .../zstack/sdk/CreateNfvInstGroupAction.java | 2 +- .../sdk/CreateNfvInstOfferingAction.java | 2 +- .../zstack/sdk/CreateOAuthClientAction.java | 2 +- .../sdk/CreateObservabilityServerAction.java | 2 +- ...eateObservabilityServerOfferingAction.java | 2 +- .../CreateOssBackupBucketRemoteAction.java | 2 +- .../sdk/CreateOssBucketRemoteAction.java | 2 +- .../CreateOvnControllerOfferingAction.java | 2 +- .../sdk/CreateOvnControllerVmAction.java | 2 +- .../sdk/CreatePciDeviceOfferingAction.java | 2 +- .../CreatePluginSecretResourcePoolAction.java | 2 +- .../org/zstack/sdk/CreatePolicyAction.java | 2 +- .../sdk/CreatePolicyRouteRuleAction.java | 2 +- .../sdk/CreatePolicyRouteRuleSetAction.java | 2 +- .../sdk/CreatePolicyRouteTableAction.java | 2 +- ...reatePolicyRouteTableRouteEntryAction.java | 2 +- .../sdk/CreatePortForwardingRuleAction.java | 2 +- .../zstack/sdk/CreatePortMirrorAction.java | 2 +- .../sdk/CreatePortMirrorSessionAction.java | 2 +- .../zstack/sdk/CreatePriceTableAction.java | 2 +- .../zstack/sdk/CreateResourcePriceAction.java | 2 +- .../zstack/sdk/CreateResourceStackAction.java | 2 +- .../sdk/CreateResourceStackFromAppAction.java | 2 +- ...ootVolumeTemplateFromRootVolumeAction.java | 2 +- ...olumeTemplateFromVolumeSnapshotAction.java | 2 +- .../zstack/sdk/CreateSAML2ClientAction.java | 2 +- .../sdk/CreateSSORedirectTemplateAction.java | 2 +- .../CreateSanSecSecretResourcePoolAction.java | 2 +- .../zstack/sdk/CreateSchedulerJobAction.java | 2 +- .../sdk/CreateSchedulerJobGroupAction.java | 2 +- .../sdk/CreateSchedulerTriggerAction.java | 2 +- .../zstack/sdk/CreateSecurityGroupAction.java | 2 +- .../org/zstack/sdk/CreateSlbGroupAction.java | 2 +- .../zstack/sdk/CreateSlbInstanceAction.java | 2 +- .../zstack/sdk/CreateSlbOfferingAction.java | 2 +- .../org/zstack/sdk/CreateSnmpAgentAction.java | 2 +- .../zstack/sdk/CreateSshKeyPairAction.java | 2 +- .../org/zstack/sdk/CreateSystemTagAction.java | 2 +- .../zstack/sdk/CreateSystemTagsAction.java | 2 +- .../java/org/zstack/sdk/CreateTagAction.java | 2 +- .../java/org/zstack/sdk/CreateUserAction.java | 2 +- .../org/zstack/sdk/CreateUserGroupAction.java | 2 +- .../sdk/CreateUserProxyConfigAction.java | 2 +- .../org/zstack/sdk/CreateUserTagAction.java | 2 +- .../sdk/CreateVRouterOspfAreaAction.java | 2 +- .../sdk/CreateVRouterRouteTableAction.java | 2 +- .../java/org/zstack/sdk/CreateVipAction.java | 2 +- .../CreateVirtualRouterOfferingAction.java | 2 +- .../org/zstack/sdk/CreateVmCdRomAction.java | 2 +- .../sdk/CreateVmFromCdpBackupAction.java | 2 +- .../zstack/sdk/CreateVmInstanceAction.java | 2 +- .../sdk/CreateVmInstanceFromOvfAction.java | 2 +- .../sdk/CreateVmInstanceFromVolumeAction.java | 2 +- ...ateVmInstanceFromVolumeSnapshotAction.java | 2 +- ...InstanceFromVolumeSnapshotGroupAction.java | 2 +- .../org/zstack/sdk/CreateVmNicAction.java | 2 +- .../sdk/CreateVmSchedulingRuleAction.java | 2 +- .../CreateVmSchedulingRuleGroupAction.java | 2 +- ...reateVmUserDefinedXmlHookScriptAction.java | 2 +- .../org/zstack/sdk/CreateVniRangeAction.java | 2 +- .../sdk/CreateVolumeSnapshotAction.java | 2 +- .../sdk/CreateVolumeSnapshotGroupAction.java | 2 +- .../sdk/CreateVolumesSnapshotAction.java | 2 +- .../zstack/sdk/CreateVpcFirewallAction.java | 2 +- .../zstack/sdk/CreateVpcHaGroupAction.java | 2 +- .../zstack/sdk/CreateVpcSharedQosAction.java | 2 +- .../CreateVpcUserVpnGatewayRemoteAction.java | 2 +- .../zstack/sdk/CreateVpcVRouterAction.java | 2 +- .../CreateVpcVpnConnectionRemoteAction.java | 2 +- .../zstack/sdk/CreateVpnIkeConfigAction.java | 2 +- .../sdk/CreateVpnIpsecConfigAction.java | 2 +- .../sdk/CreateVxlanPoolRemoteVtepAction.java | 2 +- .../org/zstack/sdk/CreateVxlanVtepAction.java | 2 +- .../org/zstack/sdk/CreateWebhookAction.java | 2 +- .../zstack/sdk/CreateZBoxBackupAction.java | 2 +- .../java/org/zstack/sdk/CreateZoneAction.java | 2 +- .../org/zstack/sdk/DebugSignalAction.java | 2 +- .../zstack/sdk/DecodeStackTemplateAction.java | 2 +- .../sdk/DeleteAccessControlListAction.java | 2 +- .../sdk/DeleteAccessControlRuleAction.java | 2 +- .../org/zstack/sdk/DeleteAccessKeyAction.java | 2 +- .../org/zstack/sdk/DeleteAccountAction.java | 2 +- .../zstack/sdk/DeleteAffinityGroupAction.java | 2 +- .../org/zstack/sdk/DeleteAlertAction.java | 2 +- .../sdk/DeleteAliyunDiskFromLocalAction.java | 2 +- .../sdk/DeleteAliyunDiskFromRemoteAction.java | 2 +- .../sdk/DeleteAliyunKeySecretAction.java | 2 +- .../sdk/DeleteAliyunNasAccessGroupAction.java | 2 +- .../DeleteAliyunNasAccessGroupRuleAction.java | 2 +- .../sdk/DeleteAliyunPanguPartitionAction.java | 2 +- .../sdk/DeleteAliyunProxyVSwitchAction.java | 2 +- .../sdk/DeleteAliyunProxyVpcAction.java | 2 +- .../DeleteAliyunRouteEntryRemoteAction.java | 2 +- ...eleteAliyunRouterInterfaceLocalAction.java | 2 +- ...leteAliyunRouterInterfaceRemoteAction.java | 2 +- .../DeleteAliyunSnapshotFromLocalAction.java | 2 +- .../DeleteAliyunSnapshotFromRemoteAction.java | 2 +- ...teAllEcsInstancesFromDataCenterAction.java | 2 +- .../sdk/DeleteAppBuildSystemAction.java | 2 +- .../sdk/DeleteAutoScalingGroupAction.java | 2 +- .../DeleteAutoScalingGroupInstanceAction.java | 2 +- .../sdk/DeleteAutoScalingRuleAction.java | 2 +- .../DeleteAutoScalingRuleTriggerAction.java | 2 +- .../sdk/DeleteAutoScalingTemplateAction.java | 2 +- .../sdk/DeleteBackupFileInPublicAction.java | 2 +- .../zstack/sdk/DeleteBackupStorageAction.java | 2 +- .../sdk/DeleteBareMetal2ChassisAction.java | 2 +- .../sdk/DeleteBareMetal2GatewayAction.java | 2 +- ...eleteBareMetal2ProvisionNetworkAction.java | 2 +- .../sdk/DeleteBaremetalChassisAction.java | 2 +- .../sdk/DeleteBaremetalPxeServerAction.java | 2 +- .../org/zstack/sdk/DeleteBillingAction.java | 2 +- .../org/zstack/sdk/DeleteBondingAction.java | 2 +- .../org/zstack/sdk/DeleteBuildAppAction.java | 2 +- .../DeleteBuildAppExportHistoryAction.java | 2 +- .../sdk/DeleteCCSCertificateAction.java | 2 +- .../org/zstack/sdk/DeleteCbtTaskAction.java | 2 +- .../org/zstack/sdk/DeleteCdpPolicyAction.java | 2 +- .../org/zstack/sdk/DeleteCdpTaskAction.java | 2 +- .../zstack/sdk/DeleteCdpTaskDataAction.java | 2 +- .../DeleteCephPrimaryStoragePoolAction.java | 2 +- .../zstack/sdk/DeleteCertificateAction.java | 2 +- .../org/zstack/sdk/DeleteClusterAction.java | 2 +- .../zstack/sdk/DeleteClusterDRSAction.java | 2 +- ...eleteConnectionAccessPointLocalAction.java | 2 +- ...etweenL3NetWorkAndAliyunVSwitchAction.java | 2 +- ...leteContainerManagementEndpointAction.java | 2 +- ...teContainerResourceFromEndpointAction.java | 2 +- .../sdk/DeleteDataCenterInLocalAction.java | 2 +- .../zstack/sdk/DeleteDataVolumeAction.java | 2 +- .../org/zstack/sdk/DeleteDatasetAction.java | 2 +- .../org/zstack/sdk/DeleteDatasetsAction.java | 2 +- .../org/zstack/sdk/DeleteDirectoryAction.java | 2 +- .../zstack/sdk/DeleteDiskOfferingAction.java | 2 +- .../zstack/sdk/DeleteEcsImageLocalAction.java | 2 +- .../sdk/DeleteEcsImageRemoteAction.java | 2 +- .../zstack/sdk/DeleteEcsInstanceAction.java | 2 +- .../sdk/DeleteEcsInstanceLocalAction.java | 2 +- .../DeleteEcsSecurityGroupInLocalAction.java | 2 +- .../DeleteEcsSecurityGroupRemoteAction.java | 2 +- ...eleteEcsSecurityGroupRuleRemoteAction.java | 2 +- .../sdk/DeleteEcsVSwitchInLocalAction.java | 2 +- .../sdk/DeleteEcsVSwitchRemoteAction.java | 2 +- .../zstack/sdk/DeleteEcsVpcInLocalAction.java | 2 +- .../zstack/sdk/DeleteEcsVpcRemoteAction.java | 2 +- .../java/org/zstack/sdk/DeleteEipAction.java | 2 +- ...eExportedImageFromBackupStorageAction.java | 2 +- .../sdk/DeleteExternalBackupAction.java | 2 +- .../org/zstack/sdk/DeleteFirewallAction.java | 2 +- .../DeleteFirewallIpSetTemplateAction.java | 2 +- .../zstack/sdk/DeleteFirewallRuleAction.java | 2 +- .../sdk/DeleteFirewallRuleSetAction.java | 2 +- .../sdk/DeleteFirewallRuleTemplateAction.java | 2 +- .../zstack/sdk/DeleteFlowCollectorAction.java | 2 +- .../org/zstack/sdk/DeleteFlowMeterAction.java | 2 +- .../org/zstack/sdk/DeleteGCJobAction.java | 2 +- .../zstack/sdk/DeleteGuestVmScriptAction.java | 2 +- .../java/org/zstack/sdk/DeleteHostAction.java | 2 +- .../DeleteHostNetworkServiceTypeAction.java | 2 +- .../DeleteHostSchedulingRuleGroupAction.java | 2 +- .../sdk/DeleteHybridEipFromLocalAction.java | 2 +- .../sdk/DeleteHybridEipRemoteAction.java | 2 +- .../sdk/DeleteHybridKeySecretAction.java | 2 +- .../DeleteIAM2VirtualIDLdapBindingAction.java | 2 +- .../sdk/DeleteIPsecConnectionAction.java | 2 +- .../sdk/DeleteIdentityZoneInLocalAction.java | 2 +- .../org/zstack/sdk/DeleteImageAction.java | 2 +- .../zstack/sdk/DeleteImagePackageAction.java | 2 +- .../DeleteImageReplicationGroupAction.java | 2 +- .../sdk/DeleteInstanceOfferingAction.java | 2 +- .../org/zstack/sdk/DeleteIpAddressAction.java | 2 +- .../org/zstack/sdk/DeleteIpRangeAction.java | 2 +- .../zstack/sdk/DeleteIscsiServerAction.java | 2 +- .../org/zstack/sdk/DeleteL2NetworkAction.java | 2 +- .../org/zstack/sdk/DeleteL3NetworkAction.java | 2 +- .../zstack/sdk/DeleteLdapBindingAction.java | 2 +- .../zstack/sdk/DeleteLdapServerAction.java | 2 +- .../org/zstack/sdk/DeleteLicenseAction.java | 2 +- .../zstack/sdk/DeleteLoadBalancerAction.java | 2 +- .../sdk/DeleteLoadBalancerListenerAction.java | 2 +- .../DeleteLoadBalancerServerGroupAction.java | 2 +- .../sdk/DeleteLogConfigurationAction.java | 2 +- .../org/zstack/sdk/DeleteLogServerAction.java | 2 +- .../org/zstack/sdk/DeleteLongJobAction.java | 2 +- .../zstack/sdk/DeleteMdevDeviceAction.java | 2 +- .../org/zstack/sdk/DeleteMediaAction.java | 2 +- .../org/zstack/sdk/DeleteModelAction.java | 2 +- .../zstack/sdk/DeleteModelCenterAction.java | 2 +- .../sdk/DeleteModelEvaluationTaskAction.java | 2 +- .../sdk/DeleteModelEvaluationTasksAction.java | 2 +- .../zstack/sdk/DeleteModelServiceAction.java | 2 +- ...DeleteModelServiceInstanceGroupAction.java | 2 +- ...eleteModelServiceInstanceGroupsAction.java | 2 +- .../zstack/sdk/DeleteModelServicesAction.java | 2 +- .../org/zstack/sdk/DeleteModelsAction.java | 2 +- .../sdk/DeleteMonitorTriggerAction.java | 2 +- .../sdk/DeleteMonitorTriggerActionAction.java | 2 +- .../sdk/DeleteMulticastRouterAction.java | 2 +- .../zstack/sdk/DeleteNasFileSystemAction.java | 2 +- .../sdk/DeleteNasMountTargetAction.java | 2 +- .../zstack/sdk/DeleteNfvInstGroupAction.java | 2 +- .../org/zstack/sdk/DeleteNicQosAction.java | 2 +- .../zstack/sdk/DeleteNvmeServerAction.java | 2 +- .../sdk/DeleteOssBucketFileRemoteAction.java | 2 +- .../sdk/DeleteOssBucketNameLocalAction.java | 2 +- .../sdk/DeleteOssBucketRemoteAction.java | 2 +- .../org/zstack/sdk/DeletePciDeviceAction.java | 2 +- .../sdk/DeletePciDeviceOfferingAction.java | 2 +- .../zstack/sdk/DeletePluginDriversAction.java | 2 +- .../org/zstack/sdk/DeletePolicyAction.java | 2 +- .../sdk/DeletePolicyRouteRuleAction.java | 2 +- .../sdk/DeletePolicyRouteRuleSetAction.java | 2 +- .../sdk/DeletePolicyRouteTableAction.java | 2 +- ...eletePolicyRouteTableRouteEntryAction.java | 2 +- .../sdk/DeletePortForwardingRuleAction.java | 2 +- .../zstack/sdk/DeletePortMirrorAction.java | 2 +- .../sdk/DeletePortMirrorSessionAction.java | 2 +- .../DeletePreconfigurationTemplateAction.java | 2 +- .../zstack/sdk/DeletePriceTableAction.java | 2 +- .../sdk/DeletePrimaryStorageAction.java | 2 +- .../zstack/sdk/DeletePublishAppAction.java | 2 +- .../sdk/DeleteReservedIpRangeAction.java | 2 +- .../sdk/DeleteResourceConfigAction.java | 2 +- .../zstack/sdk/DeleteResourcePriceAction.java | 2 +- .../zstack/sdk/DeleteResourceStackAction.java | 2 +- ...eleteResourceStackVmPortMonitorAction.java | 2 +- .../org/zstack/sdk/DeleteSSOClientAction.java | 2 +- .../sdk/DeleteSSORedirectTemplateAction.java | 2 +- .../zstack/sdk/DeleteSchedulerJobAction.java | 2 +- .../sdk/DeleteSchedulerJobGroupAction.java | 2 +- .../sdk/DeleteSchedulerTriggerAction.java | 2 +- .../sdk/DeleteSecretResourcePoolAction.java | 2 +- .../zstack/sdk/DeleteSecurityGroupAction.java | 2 +- .../sdk/DeleteSecurityGroupRuleAction.java | 2 +- .../sdk/DeleteSecurityMachineAction.java | 2 +- .../org/zstack/sdk/DeleteSlbGroupAction.java | 2 +- .../zstack/sdk/DeleteSshKeyPairAction.java | 2 +- .../zstack/sdk/DeleteStackTemplateAction.java | 2 +- .../java/org/zstack/sdk/DeleteTagAction.java | 2 +- .../java/org/zstack/sdk/DeleteUserAction.java | 2 +- .../org/zstack/sdk/DeleteUserGroupAction.java | 2 +- .../sdk/DeleteUserProxyConfigAction.java | 2 +- .../sdk/DeleteV2VConversionHostAction.java | 2 +- .../org/zstack/sdk/DeleteVCenterAction.java | 2 +- .../sdk/DeleteVRouterOspfAreaAction.java | 2 +- .../sdk/DeleteVRouterRouteEntryAction.java | 2 +- .../sdk/DeleteVRouterRouteTableAction.java | 2 +- .../java/org/zstack/sdk/DeleteVipAction.java | 2 +- .../org/zstack/sdk/DeleteVipQosAction.java | 2 +- .../DeleteVirtualBorderRouterLocalAction.java | 2 +- .../sdk/DeleteVirtualRouterLocalAction.java | 2 +- .../zstack/sdk/DeleteVmBootModeAction.java | 2 +- .../org/zstack/sdk/DeleteVmCdRomAction.java | 2 +- .../sdk/DeleteVmConsolePasswordAction.java | 2 +- .../zstack/sdk/DeleteVmHostnameAction.java | 2 +- .../sdk/DeleteVmInstanceHaLevelAction.java | 2 +- .../org/zstack/sdk/DeleteVmNicAction.java | 2 +- .../DeleteVmNicFromSecurityGroupAction.java | 2 +- .../DeleteVmSchedulingRuleGroupAction.java | 2 +- .../org/zstack/sdk/DeleteVmSshKeyAction.java | 2 +- .../zstack/sdk/DeleteVmStaticIpAction.java | 2 +- .../sdk/DeleteVmUserDefinedXmlAction.java | 2 +- ...eleteVmUserDefinedXmlHookScriptAction.java | 2 +- .../org/zstack/sdk/DeleteVniRangeAction.java | 2 +- .../org/zstack/sdk/DeleteVolumeQosAction.java | 2 +- .../sdk/DeleteVolumeSnapshotAction.java | 2 +- .../sdk/DeleteVolumeSnapshotGroupAction.java | 2 +- .../zstack/sdk/DeleteVpcHaGroupAction.java | 2 +- .../sdk/DeleteVpcIkeConfigLocalAction.java | 2 +- .../sdk/DeleteVpcIpSecConfigLocalAction.java | 2 +- .../zstack/sdk/DeleteVpcSharedQosAction.java | 2 +- .../DeleteVpcUserVpnGatewayLocalAction.java | 2 +- .../DeleteVpcUserVpnGatewayRemoteAction.java | 2 +- .../DeleteVpcVpnConnectionLocalAction.java | 2 +- .../DeleteVpcVpnConnectionRemoteAction.java | 2 +- .../sdk/DeleteVpcVpnGatewayLocalAction.java | 2 +- .../sdk/DeleteVxlanL2NetworkAction.java | 2 +- .../sdk/DeleteVxlanPoolRemoteVtepAction.java | 2 +- .../org/zstack/sdk/DeleteWebhookAction.java | 2 +- .../java/org/zstack/sdk/DeleteZoneAction.java | 2 +- .../DeployAppDevelopmentServiceAction.java | 2 +- .../DeployDistributedModelServiceAction.java | 2 +- .../sdk/DeployModelEvalServiceAction.java | 2 +- .../zstack/sdk/DeployModelServiceAction.java | 2 +- ...DescribeVmInstanceRecoveryPointAction.java | 2 +- .../sdk/DestroyBaremetalInstanceAction.java | 2 +- .../zstack/sdk/DestroyVmInstanceAction.java | 2 +- .../sdk/DetachAliyunDiskFromEcsAction.java | 2 +- .../org/zstack/sdk/DetachAliyunKeyAction.java | 2 +- .../sdk/DetachAppBuildSystemToZoneAction.java | 2 +- ...achAutoScalingTemplateFromGroupAction.java | 2 +- .../DetachBackupStorageFromZoneAction.java | 2 +- ...achBareMetal2GatewayFromClusterAction.java | 2 +- ...tal2ProvisionNetworkFromClusterAction.java | 2 +- ...chBaremetalPxeServerFromClusterAction.java | 2 +- .../DetachCCSCertificateFromUserAction.java | 2 +- .../sdk/DetachDataVolumeFromHostAction.java | 2 +- .../sdk/DetachDataVolumeFromVmAction.java | 2 +- .../java/org/zstack/sdk/DetachEipAction.java | 2 +- .../DetachFirewallRuleSetFromL3Action.java | 2 +- ...HostFromHostSchedulingRuleGroupAction.java | 2 +- .../sdk/DetachHybridEipFromEcsAction.java | 2 +- .../org/zstack/sdk/DetachHybridKeyAction.java | 2 +- .../DetachIscsiServerFromClusterAction.java | 2 +- .../sdk/DetachIsoFromVmInstanceAction.java | 2 +- .../sdk/DetachL2NetworkFromClusterAction.java | 2 +- .../sdk/DetachL3NetworkFromVmAction.java | 2 +- ...chL3NetworksFromIPsecConnectionAction.java | 2 +- .../sdk/DetachMdevDeviceFromVmAction.java | 2 +- ...MonitorTriggerActionFromTriggerAction.java | 2 +- ...tachNetworkServiceFromL3NetworkAction.java | 2 +- .../sdk/DetachNfvInstFromGroupAction.java | 2 +- .../sdk/DetachNicFromBondingAction.java | 2 +- .../DetachNvmeServerFromClusterAction.java | 2 +- ...etachOssBucketFromEcsDataCenterAction.java | 2 +- .../sdk/DetachPciDeviceFromVmAction.java | 2 +- .../sdk/DetachPoliciesFromUserAction.java | 2 +- .../sdk/DetachPolicyFromUserAction.java | 2 +- .../sdk/DetachPolicyFromUserGroupAction.java | 2 +- .../DetachPolicyRouteRuleSetFromL3Action.java | 2 +- .../sdk/DetachPortForwardingRuleAction.java | 2 +- .../DetachPriceTableFromAccountAction.java | 2 +- ...DetachPrimaryStorageFromClusterAction.java | 2 +- .../DetachProvisionNicFromBondingAction.java | 2 +- .../sdk/DetachScsiLunFromHostAction.java | 2 +- .../DetachScsiLunFromVmInstanceAction.java | 2 +- ...etachSecurityGroupFromL3NetworkAction.java | 2 +- ...hServiceFromObservabilityServerAction.java | 2 +- .../DetachSshKeyPairFromVmInstanceAction.java | 2 +- .../sdk/DetachTagFromResourcesAction.java | 2 +- .../sdk/DetachUsbDeviceFromVmAction.java | 2 +- ...hUserDefinedXmlHookScriptFromVmAction.java | 2 +- ...achVRouterRouteTableFromVRouterAction.java | 2 +- .../sdk/DetachVipFromVpcSharedQosAction.java | 2 +- ...tachVmFromVmSchedulingRuleGroupAction.java | 2 +- .../org/zstack/sdk/DisableCbtTaskAction.java | 2 +- .../org/zstack/sdk/DisableCdpTaskAction.java | 2 +- .../DiscoverExternalPrimaryStorageAction.java | 2 +- ...wnloadBackupFileFromPublicCloudAction.java | 2 +- .../java/org/zstack/sdk/EjectZBoxAction.java | 2 +- .../org/zstack/sdk/EnableCbtTaskAction.java | 2 +- .../org/zstack/sdk/EnableCdpTaskAction.java | 2 +- .../main/java/org/zstack/sdk/ErrorCode.java | 8 + .../sdk/ExecuteAutoScalingRuleAction.java | 2 +- .../sdk/ExecuteDRSSchedulingAction.java | 2 +- .../sdk/ExecuteGuestVmCommandAction.java | 2 +- .../sdk/ExecuteGuestVmScriptAction.java | 2 +- .../org/zstack/sdk/ExportBuildAppAction.java | 2 +- .../ExportImageFromBackupStorageAction.java | 2 +- .../zstack/sdk/ExportNbdVolumesAction.java | 2 +- .../zstack/sdk/ExportVmOvaPackageAction.java | 2 +- .../sdk/ExpungeBaremetalInstanceAction.java | 2 +- .../zstack/sdk/ExpungeDataVolumeAction.java | 2 +- .../org/zstack/sdk/ExpungeImageAction.java | 2 +- .../zstack/sdk/ExpungeImageGroupAction.java | 2 +- .../zstack/sdk/ExpungeVmInstanceAction.java | 2 +- ...pungeVmUserDefinedXmlHookScriptAction.java | 2 +- .../sdk/FailoverFaultToleranceVmAction.java | 2 +- .../zstack/sdk/FlattenVmInstanceAction.java | 2 +- .../org/zstack/sdk/FlattenVolumeAction.java | 2 +- .../java/org/zstack/sdk/FstrimVmAction.java | 2 +- .../sdk/GCAliyunSnapshotRemoteAction.java | 2 +- .../sdk/GenerateAccountBillingAction.java | 2 +- .../sdk/GenerateHygonMdevDevicesAction.java | 2 +- .../zstack/sdk/GenerateMdevDevicesAction.java | 2 +- .../sdk/GenerateModelMetadataAction.java | 2 +- .../sdk/GenerateSeMdevDevicesAction.java | 2 +- .../sdk/GenerateSriovPciDevicesAction.java | 2 +- .../zstack/sdk/GenerateSshKeyPairAction.java | 2 +- .../org/zstack/sdk/GetAccessPathAction.java | 2 +- .../sdk/GetAccountPriceTableRefAction.java | 2 +- .../sdk/GetAccountQuotaUsageAction.java | 2 +- .../GetAliyunNasAccessGroupRemoteAction.java | 2 +- .../GetAliyunNasFileSystemRemoteAction.java | 2 +- .../GetAliyunNasMountTargetRemoteAction.java | 2 +- .../sdk/GetAppBuildSystemCapacityAction.java | 2 +- ...GetAttachablePublicL3ForVRouterAction.java | 2 +- .../sdk/GetAttachableVpcL3NetworkAction.java | 2 +- .../sdk/GetAvailableTriggersAction.java | 2 +- .../sdk/GetAvailableVpcL3NetworkAction.java | 2 +- ...rageCandidatesForImageMigrationAction.java | 2 +- .../sdk/GetBackupStorageCapacityAction.java | 2 +- ...orageForCreatingImageFromVolumeAction.java | 2 +- ...CreatingImageFromVolumeSnapshotAction.java | 2 +- .../sdk/GetBackupStorageTypesAction.java | 2 +- ...GetBareMetal2ChassisPowerStatusAction.java | 2 +- ...etal2GatewayAllocatorStrategiesAction.java | 2 +- ...ovisionNetworkIpAddressCapacityAction.java | 2 +- .../GetBareMetal2SupportedBootModeAction.java | 2 +- .../GetBaremetalChassisPowerStatusAction.java | 2 +- .../GetBlockPrimaryStorageMetadataAction.java | 2 +- ...dateAffinityGroupForAttachingVmAction.java | 2 +- ...idateAffinityGroupForCreatingVmAction.java | 2 +- ...teBackupStorageForCreatingImageAction.java | 2 +- ...teClustersForAttachingL2NetworkAction.java | 2 +- .../GetCandidateInterfaceVlanIdsAction.java | 2 +- .../GetCandidateIsoForAttachingVmAction.java | 2 +- ...teL2NetworksForAttachingClusterAction.java | 2 +- ...L3NetworksForChangeVmNicNetworkAction.java | 2 +- ...ateL3NetworksForIpSecConnectionAction.java | 2 +- ...didateL3NetworksForLoadBalancerAction.java | 2 +- ...ndidateL3NetworksForServerGroupAction.java | 2 +- ...GetCandidateLdapEntryForBindingAction.java | 2 +- ...andidateLdapEntryForIAM2BindingAction.java | 2 +- .../sdk/GetCandidateMiniHostsAction.java | 2 +- .../GetCandidateNetworkInterfacesAction.java | 2 +- ...atePrimaryStoragesForCreatingVmAction.java | 2 +- ...dateVMForAttachingAffinityGroupAction.java | 2 +- .../GetCandidateVmForAttachingIsoAction.java | 2 +- ...tCandidateVmNicForSecurityGroupAction.java | 2 +- ...tCandidateVmNicsForLoadBalancerAction.java | 2 +- ...mNicsForLoadBalancerServerGroupAction.java | 2 +- ...GetCandidateVmNicsForPortMirrorAction.java | 2 +- ...ZonesClustersHostsForCreatingVmAction.java | 2 +- .../GetCdpBackupStorageRequirementAction.java | 2 +- .../org/zstack/sdk/GetChainTaskAction.java | 2 +- .../zstack/sdk/GetChronyServersAction.java | 2 +- .../zstack/sdk/GetClusterDRSStatusAction.java | 2 +- .../sdk/GetClusterHostNetworkFactsAction.java | 2 +- ...ConnectionAccessPointFromRemoteAction.java | 2 +- ...etweenL3NetworkAndAliyunVSwitchAction.java | 2 +- .../zstack/sdk/GetContainerUsageAction.java | 2 +- .../sdk/GetCpuMemoryCapacityAction.java | 2 +- .../sdk/GetCreateEcsImageProgressAction.java | 2 +- .../org/zstack/sdk/GetCurrentTimeAction.java | 2 +- .../sdk/GetDataCenterFromRemoteAction.java | 2 +- .../sdk/GetDataVolumeAttachableVmAction.java | 2 +- .../org/zstack/sdk/GetDebugSignalAction.java | 2 +- .../zstack/sdk/GetEcsInstanceTypeAction.java | 2 +- .../sdk/GetEcsInstanceVncUrlAction.java | 2 +- .../sdk/GetEipAttachableVmNicsAction.java | 2 +- .../sdk/GetElaborationCategoriesAction.java | 2 +- .../org/zstack/sdk/GetElaborationsAction.java | 2 +- .../zstack/sdk/GetEncryptedFieldAction.java | 2 +- .../zstack/sdk/GetExternalServicesAction.java | 2 +- .../zstack/sdk/GetFactoryModeStateAction.java | 2 +- .../sdk/GetFaultToleranceVmsAction.java | 2 +- .../sdk/GetFlowMeterRouterIdAction.java | 2 +- .../java/org/zstack/sdk/GetFreeIpAction.java | 2 +- .../zstack/sdk/GetFreeIpOfIpRangeAction.java | 2 +- .../sdk/GetFreeIpOfL3NetworkAction.java | 2 +- .../sdk/GetGlobalConfigOptionsAction.java | 2 +- .../sdk/GetGpuDeviceSpecCandidatesAction.java | 2 +- .../zstack/sdk/GetGuestOsMetadataAction.java | 2 +- .../sdk/GetHostAllocatorStrategiesAction.java | 2 +- ...GetHostCandidatesForVmMigrationAction.java | 2 +- .../zstack/sdk/GetHostIommuStateAction.java | 2 +- .../zstack/sdk/GetHostIommuStatusAction.java | 2 +- .../sdk/GetHostMultipathTopologyAction.java | 2 +- .../zstack/sdk/GetHostNUMATopologyAction.java | 2 +- .../zstack/sdk/GetHostNetworkFactsAction.java | 2 +- .../GetHostNetworkInterfaceLldpAction.java | 2 +- .../sdk/GetHostPhysicalMemoryFactsAction.java | 2 +- .../zstack/sdk/GetHostPowerStatusAction.java | 2 +- .../sdk/GetHostResourceAllocationAction.java | 2 +- .../org/zstack/sdk/GetHostTaskAction.java | 2 +- .../zstack/sdk/GetHostWebSshUrlAction.java | 2 +- .../zstack/sdk/GetHypervisorTypesAction.java | 2 +- .../sdk/GetIdentityZoneFromRemoteAction.java | 2 +- ...GetImageCandidatesForVmToChangeAction.java | 2 +- .../org/zstack/sdk/GetImageQgaAction.java | 2 +- ...agesFromImageStoreBackupStorageAction.java | 2 +- ...pendentL3NetworksBackupStoragesAction.java | 2 +- ...tInterdependentL3NetworksImagesAction.java | 2 +- ...etInterfaceServiceTypeStatisticAction.java | 2 +- .../sdk/GetInvocationRecordsAction.java | 2 +- .../sdk/GetIpAddressCapacityAction.java | 2 +- .../zstack/sdk/GetL2NetworkTypesAction.java | 2 +- .../sdk/GetL3NetworkDhcpIpAddressAction.java | 2 +- .../sdk/GetL3NetworkIpStatisticAction.java | 2 +- .../org/zstack/sdk/GetL3NetworkMtuAction.java | 2 +- .../GetL3NetworkRouterInterfaceIpAction.java | 2 +- .../zstack/sdk/GetL3NetworkTypesAction.java | 2 +- .../sdk/GetLatestGuestToolsForVmAction.java | 2 +- .../org/zstack/sdk/GetLdapEntryAction.java | 2 +- ...etLdapServerAvailableAttributesAction.java | 2 +- .../zstack/sdk/GetLicenseAddOnsAction.java | 2 +- .../sdk/GetLicenseCapabilitiesAction.java | 2 +- .../org/zstack/sdk/GetLicenseInfoAction.java | 2 +- .../zstack/sdk/GetLicenseRecordsAction.java | 2 +- .../sdk/GetLicenseUKeyStatusAction.java | 2 +- ...tLoadBalancerListenerACLEntriesAction.java | 2 +- .../sdk/GetLoadBalancerOwnerAction.java | 2 +- .../GetLocalRaidPhysicalDriveSmartAction.java | 2 +- ...GetLocalStorageHostDiskCapacityAction.java | 2 +- .../zstack/sdk/GetLogConfigurationAction.java | 2 +- .../org/zstack/sdk/GetLoginCaptchaAction.java | 2 +- .../zstack/sdk/GetLoginProceduresAction.java | 2 +- .../org/zstack/sdk/GetMaaSUsageAction.java | 2 +- .../sdk/GetManagementNodeArchAction.java | 2 +- .../zstack/sdk/GetManagementNodeOSAction.java | 2 +- .../sdk/GetMdevDeviceCandidatesAction.java | 2 +- .../GetMdevDeviceSpecCandidatesAction.java | 2 +- ...GetMemorySnapshotGroupReferenceAction.java | 2 +- .../sdk/GetModelCenterServicesAction.java | 2 +- .../org/zstack/sdk/GetMonitorItemAction.java | 2 +- .../sdk/GetNetworkServiceTypesAction.java | 2 +- .../java/org/zstack/sdk/GetNicQosAction.java | 2 +- .../sdk/GetNoTriggerSchedulerJobsAction.java | 2 +- .../org/zstack/sdk/GetOAuth2TokenAction.java | 2 +- ...tObservabilityServerServiceDataAction.java | 2 +- .../GetOssBackupBucketFromRemoteAction.java | 2 +- .../sdk/GetOssBucketFileFromRemoteAction.java | 2 +- .../sdk/GetOssBucketNameFromRemoteAction.java | 2 +- ...iDeviceCandidatesForAttachingVmAction.java | 2 +- ...iDeviceCandidatesForNewCreateVmAction.java | 2 +- .../sdk/GetPciDeviceSpecCandidatesAction.java | 2 +- .../zstack/sdk/GetPlatformTimeZoneAction.java | 2 +- ...cyRouteRuleSetFromVirtualRouterAction.java | 2 +- ...tPortForwardingAttachableVmNicsAction.java | 2 +- ...imaryStorageAllocatorStrategiesAction.java | 2 +- ...StorageCandidatesForVmMigrationAction.java | 2 +- ...ageCandidatesForVolumeMigrationAction.java | 2 +- .../sdk/GetPrimaryStorageCapacityAction.java | 2 +- .../GetPrimaryStorageLicenseInfoAction.java | 2 +- .../sdk/GetPrimaryStorageTypesAction.java | 2 +- .../GetPrimaryStorageUsageReportAction.java | 2 +- .../zstack/sdk/GetResourceAccountAction.java | 2 +- .../sdk/GetResourceBindableConfigAction.java | 2 +- .../zstack/sdk/GetResourceConfigAction.java | 2 +- .../zstack/sdk/GetResourceConfigsAction.java | 2 +- .../sdk/GetResourceFromPublishAppAction.java | 2 +- .../GetResourceFromResourceStackAction.java | 2 +- .../zstack/sdk/GetResourceNamesAction.java | 2 +- .../GetResourceStackFromResourceAction.java | 2 +- .../sdk/GetResourceStackVmStatusAction.java | 2 +- ...etRouteTableVpcVRouterCandidateAction.java | 2 +- .../org/zstack/sdk/GetSSOClientAction.java | 2 +- .../GetSchedulerExecutionReportAction.java | 2 +- ...ScsiLunCandidatesForAttachingVmAction.java | 2 +- .../sdk/GetSharedBlockCandidateAction.java | 2 +- ...SignatureServerEncryptPublicKeyAction.java | 2 +- .../sdk/GetSpiceCertificatesAction.java | 2 +- .../org/zstack/sdk/GetSupportAPIsAction.java | 2 +- ...upportedCloudFormationResourcesAction.java | 2 +- .../sdk/GetSupportedIdentityModelsAction.java | 2 +- .../org/zstack/sdk/GetTaskProgressAction.java | 2 +- .../sdk/GetTrashOnBackupStorageAction.java | 2 +- .../sdk/GetTrashOnPrimaryStorageAction.java | 2 +- ...etTwoFactorAuthenticationSecretAction.java | 2 +- ...GetTwoFactorAuthenticationStateAction.java | 2 +- .../sdk/GetUploadImageJobDetailsAction.java | 2 +- ...bDeviceCandidatesForAttachingVmAction.java | 2 +- .../sdk/GetVRouterFlowCounterAction.java | 2 +- .../sdk/GetVRouterOspfNeighborAction.java | 2 +- .../sdk/GetVRouterRouteTableAction.java | 2 +- .../zstack/sdk/GetVRouterRouterIdAction.java | 2 +- .../org/zstack/sdk/GetVSwitchTypesAction.java | 2 +- .../java/org/zstack/sdk/GetVersionAction.java | 2 +- ...VfPciDeviceAvailableInL2NetworkAction.java | 2 +- .../zstack/sdk/GetVipAvailablePortAction.java | 2 +- .../java/org/zstack/sdk/GetVipQosAction.java | 2 +- .../org/zstack/sdk/GetVipUsedPortsAction.java | 2 +- ...GetVirtualRouterSoftwareVersionAction.java | 2 +- .../zstack/sdk/GetVirtualizerInfoAction.java | 2 +- .../sdk/GetVmAttachableDataVolumeAction.java | 2 +- .../sdk/GetVmAttachableL3NetworkAction.java | 2 +- .../org/zstack/sdk/GetVmBootOrderAction.java | 2 +- .../zstack/sdk/GetVmCapabilitiesAction.java | 2 +- .../zstack/sdk/GetVmConsoleAddressAction.java | 2 +- .../sdk/GetVmConsolePasswordAction.java | 2 +- .../zstack/sdk/GetVmDeviceAddressAction.java | 2 +- .../sdk/GetVmEmulatorPinningAction.java | 2 +- .../zstack/sdk/GetVmGuestToolsInfoAction.java | 2 +- .../org/zstack/sdk/GetVmHostnameAction.java | 2 +- .../GetVmInstanceFirstBootDeviceAction.java | 2 +- .../sdk/GetVmInstanceHaLevelAction.java | 2 +- ...InstanceProtectedRecoveryPointsAction.java | 2 +- .../GetVmInstanceRecoveryPointsAction.java | 2 +- .../GetVmMigrationCandidateHostsAction.java | 2 +- .../zstack/sdk/GetVmMonitorNumberAction.java | 2 +- .../sdk/GetVmNicAttachableEipsAction.java | 2 +- .../GetVmNicAttachedNetworkServiceAction.java | 2 +- .../java/org/zstack/sdk/GetVmNumaAction.java | 2 +- .../java/org/zstack/sdk/GetVmQgaAction.java | 2 +- .../java/org/zstack/sdk/GetVmRDPAction.java | 2 +- ...etVmSchedulingRulesExecuteStateAction.java | 2 +- .../org/zstack/sdk/GetVmSshKeyAction.java | 2 +- ...mStartingCandidateClustersHostsAction.java | 2 +- .../java/org/zstack/sdk/GetVmTaskAction.java | 2 +- .../zstack/sdk/GetVmUsbRedirectAction.java | 2 +- .../java/org/zstack/sdk/GetVmXmlAction.java | 2 +- .../zstack/sdk/GetVmXmlHookScriptAction.java | 2 +- .../zstack/sdk/GetVmsCapabilitiesAction.java | 2 +- ...hedulingStateFromSchedulingRuleAction.java | 2 +- .../zstack/sdk/GetVmvNUMATopologyAction.java | 2 +- .../sdk/GetVolumeCapabilitiesAction.java | 2 +- .../org/zstack/sdk/GetVolumeFormatAction.java | 2 +- .../sdk/GetVolumeIoThreadPinAction.java | 2 +- .../org/zstack/sdk/GetVolumeQosAction.java | 2 +- .../sdk/GetVolumeSnapshotSizeAction.java | 2 +- .../zstack/sdk/GetVpcAttachedEipAction.java | 2 +- .../zstack/sdk/GetVpcAttachedIpsecAction.java | 2 +- .../sdk/GetVpcAttachedLoadBalancerAction.java | 2 +- .../sdk/GetVpcAttachedNetflowAction.java | 2 +- .../zstack/sdk/GetVpcAttachedOspfAction.java | 2 +- ...tVpcAttachedPortForwardingRulesAction.java | 2 +- .../zstack/sdk/GetVpcAttachedVipAction.java | 2 +- .../org/zstack/sdk/GetVpcIPsecLogAction.java | 2 +- .../sdk/GetVpcMulticastRouteAction.java | 2 +- ...erDistributedRoutingConnectionsAction.java | 2 +- ...RouterDistributedRoutingEnabledAction.java | 2 +- ...etVpcVRouterNetworkServiceStateAction.java | 2 +- ...etVpcVpnConfigurationFromRemoteAction.java | 2 +- .../sdk/GetZBoxBackupDetailsAction.java | 2 +- .../java/org/zstack/sdk/GetZoneAction.java | 2 +- .../org/zstack/sdk/IdentifyHostAction.java | 2 +- .../sdk/InspectBareMetal2ChassisAction.java | 2 +- ...pectBareMetal2ChassisByInstanceAction.java | 2 +- .../sdk/InspectBaremetalChassisAction.java | 2 +- .../zstack/sdk/IsOpensourceVersionAction.java | 2 +- .../org/zstack/sdk/IsReadyToGoAction.java | 2 +- .../IsVfNicAvailableInL3NetworkAction.java | 2 +- .../org/zstack/sdk/KvmRunShellAction.java | 2 +- .../zstack/sdk/ListVMsFromKVMHostAction.java | 2 +- ...SchedulingRulesFromExecuteStateAction.java | 2 +- .../sdk/ListVmsFromSchedulingStateAction.java | 2 +- ...StorageGetVolumeMigratableHostsAction.java | 2 +- .../sdk/LocalStorageMigrateVolumeAction.java | 2 +- .../sdk/LocateHostNetworkInterfaceAction.java | 2 +- .../LocateLocalRaidPhysicalDriveAction.java | 2 +- .../main/java/org/zstack/sdk/LogInAction.java | 2 +- .../org/zstack/sdk/LogInByAccountAction.java | 2 +- .../org/zstack/sdk/LogInByLdapAction.java | 2 +- .../org/zstack/sdk/LogInByUserAction.java | 2 +- .../java/org/zstack/sdk/LogOutAction.java | 2 +- .../java/org/zstack/sdk/LoginByCasAction.java | 2 +- .../sdk/LoginIAM2VirtualIDWithLdapAction.java | 2 +- ...chModelServiceTemplateWithModelAction.java | 2 +- .../sdk/MergeDataOnBackupStorageAction.java | 2 +- .../java/org/zstack/sdk/MigrateVmAction.java | 2 +- .../MountVmInstanceRecoveryPointAction.java | 2 +- .../org/zstack/sdk/MoveDirectoryAction.java | 2 +- .../sdk/MoveResourcesToDirectoryAction.java | 2 +- .../java/org/zstack/sdk/ParseOvfAction.java | 2 +- .../org/zstack/sdk/PauseVmInstanceAction.java | 2 +- .../sdk/PowerOffBareMetal2ChassisAction.java | 2 +- .../sdk/PowerOffBaremetalChassisAction.java | 2 +- .../org/zstack/sdk/PowerOffHostAction.java | 2 +- .../sdk/PowerOnBareMetal2ChassisAction.java | 2 +- .../sdk/PowerOnBaremetalChassisAction.java | 2 +- .../org/zstack/sdk/PowerOnHostAction.java | 2 +- .../PowerResetBareMetal2ChassisAction.java | 2 +- .../sdk/PowerResetBaremetalChassisAction.java | 2 +- .../org/zstack/sdk/PowerResetHostAction.java | 2 +- .../sdk/PreviewResourceFromAppAction.java | 2 +- .../sdk/PreviewResourceStackAction.java | 2 +- .../sdk/PrimaryStorageMigrateVmAction.java | 2 +- .../PrimaryStorageMigrateVolumeAction.java | 2 +- .../sdk/PrometheusQueryLabelValuesAction.java | 2 +- .../sdk/PrometheusQueryMetadataAction.java | 2 +- .../sdk/PrometheusQueryPassThroughAction.java | 2 +- ...PrometheusQueryVmMonitoringDataAction.java | 2 +- .../ProtectVmInstanceRecoveryPointAction.java | 2 +- .../sdk/ProvisionNfvInstConfigAction.java | 2 +- .../sdk/ProvisionNfvInstGroupAction.java | 2 +- .../sdk/ProvisionSlbInstanceAction.java | 2 +- .../ProvisionVirtualRouterConfigAction.java | 2 +- .../java/org/zstack/sdk/PublishAppAction.java | 2 +- .../sdk/PullSdnControllerTenantAction.java | 2 +- .../sdk/PushLicenseAddOnsUsageAction.java | 2 +- .../sdk/QueryAccessControlListAction.java | 2 +- .../sdk/QueryAccessControlRuleAction.java | 2 +- .../org/zstack/sdk/QueryAccessKeyAction.java | 2 +- .../org/zstack/sdk/QueryAccountAction.java | 2 +- .../zstack/sdk/QueryAccountBillingAction.java | 2 +- .../sdk/QueryAccountPriceTableRefAction.java | 2 +- .../sdk/QueryAccountResourceRefAction.java | 2 +- .../zstack/sdk/QueryAddressPoolAction.java | 2 +- .../zstack/sdk/QueryAffinityGroupAction.java | 2 +- .../zstack/sdk/QueryAgentVersionAction.java | 2 +- .../java/org/zstack/sdk/QueryAlertAction.java | 2 +- .../sdk/QueryAliyunDiskFromLocalAction.java | 2 +- .../QueryAliyunEbsBackupStorageAction.java | 2 +- .../QueryAliyunEbsPrimaryStorageAction.java | 2 +- .../sdk/QueryAliyunNasAccessGroupAction.java | 2 +- .../sdk/QueryAliyunPanguPartitionAction.java | 2 +- .../sdk/QueryAliyunProxyVSwitchAction.java | 2 +- .../zstack/sdk/QueryAliyunProxyVpcAction.java | 2 +- .../QueryAliyunRouteEntryFromLocalAction.java | 2 +- ...yAliyunRouterInterfaceFromLocalAction.java | 2 +- .../QueryAliyunSnapshotFromLocalAction.java | 2 +- ...eryAliyunVirtualRouterFromLocalAction.java | 2 +- .../zstack/sdk/QueryAppBuildSystemAction.java | 2 +- .../zstack/sdk/QueryApplianceVmAction.java | 2 +- ...ryApplicationDevelopmentServiceAction.java | 2 +- .../sdk/QueryAutoScalingGroupAction.java | 2 +- .../QueryAutoScalingGroupActivityAction.java | 2 +- .../QueryAutoScalingGroupInstanceAction.java | 2 +- .../sdk/QueryAutoScalingRuleAction.java | 2 +- .../QueryAutoScalingRuleTriggerAction.java | 2 +- .../sdk/QueryAutoScalingVmTemplateAction.java | 2 +- .../zstack/sdk/QueryBackupStorageAction.java | 2 +- .../sdk/QueryBareMetal2BondingAction.java | 2 +- .../QueryBareMetal2BondingNicRefAction.java | 2 +- .../sdk/QueryBareMetal2ChassisAction.java | 2 +- ...QueryBareMetal2ChassisGpuDeviceAction.java | 2 +- .../QueryBareMetal2ChassisOfferingAction.java | 2 +- ...QueryBareMetal2ChassisPciDeviceAction.java | 2 +- .../sdk/QueryBareMetal2GatewayAction.java | 2 +- .../sdk/QueryBareMetal2InstanceAction.java | 2 +- ...QueryBareMetal2ProvisionNetworkAction.java | 2 +- .../sdk/QueryBaremetalBondingAction.java | 2 +- .../sdk/QueryBaremetalChassisAction.java | 2 +- .../sdk/QueryBaremetalInstanceAction.java | 2 +- .../sdk/QueryBaremetalPxeServerAction.java | 2 +- .../sdk/QueryBlockPrimaryStorageAction.java | 2 +- .../zstack/sdk/QueryBlockVolumeAction.java | 2 +- .../org/zstack/sdk/QueryBuildAppAction.java | 2 +- .../sdk/QueryBuildAppExportHistoryAction.java | 2 +- .../zstack/sdk/QueryCCSCertificateAction.java | 2 +- .../org/zstack/sdk/QueryCbtTaskAction.java | 2 +- .../org/zstack/sdk/QueryCdpPolicyAction.java | 2 +- .../org/zstack/sdk/QueryCdpTaskAction.java | 2 +- .../sdk/QueryCephBackupStorageAction.java | 2 +- .../zstack/sdk/QueryCephOsdGroupAction.java | 2 +- .../sdk/QueryCephPrimaryStorageAction.java | 2 +- .../QueryCephPrimaryStoragePoolAction.java | 2 +- .../zstack/sdk/QueryCertificateAction.java | 2 +- .../org/zstack/sdk/QueryClusterAction.java | 2 +- .../org/zstack/sdk/QueryClusterDRSAction.java | 2 +- ...yConnectionAccessPointFromLocalAction.java | 2 +- ...etweenL3NetworkAndAliyunVSwitchAction.java | 2 +- .../sdk/QueryConsoleProxyAgentAction.java | 2 +- .../zstack/sdk/QueryContainerImageAction.java | 2 +- ...ueryContainerManagementEndpointAction.java | 2 +- .../org/zstack/sdk/QueryDRSAdviceAction.java | 2 +- .../QueryDRSVmMigrationActivityAction.java | 2 +- .../sdk/QueryDataCenterFromLocalAction.java | 2 +- .../org/zstack/sdk/QueryDatasetAction.java | 2 +- .../org/zstack/sdk/QueryDirectoryAction.java | 2 +- .../zstack/sdk/QueryDiskOfferingAction.java | 2 +- .../sdk/QueryEcsImageFromLocalAction.java | 2 +- .../sdk/QueryEcsInstanceFromLocalAction.java | 2 +- .../QueryEcsSecurityGroupFromLocalAction.java | 2 +- ...ryEcsSecurityGroupRuleFromLocalAction.java | 2 +- .../sdk/QueryEcsVSwitchFromLocalAction.java | 2 +- .../sdk/QueryEcsVpcFromLocalAction.java | 2 +- .../java/org/zstack/sdk/QueryEipAction.java | 2 +- .../org/zstack/sdk/QueryEmailMediaAction.java | 2 +- .../sdk/QueryEmailTriggerActionAction.java | 2 +- .../org/zstack/sdk/QueryEthernetVFAction.java | 2 +- .../QueryEventFromResourceStackAction.java | 2 +- .../org/zstack/sdk/QueryEventLogAction.java | 2 +- .../sdk/QueryExponBlockVolumeAction.java | 2 +- .../zstack/sdk/QueryExternalBackupAction.java | 2 +- .../sdk/QueryFaultToleranceVmAction.java | 2 +- .../zstack/sdk/QueryFcHbaDeviceAction.java | 2 +- .../sdk/QueryFiberChannelLunAction.java | 2 +- .../sdk/QueryFiberChannelStorageAction.java | 2 +- .../sdk/QueryFirewallIpSetTemplateAction.java | 2 +- .../zstack/sdk/QueryFirewallRuleAction.java | 2 +- .../sdk/QueryFirewallRuleSetAction.java | 2 +- .../sdk/QueryFirewallRuleSetL3RefAction.java | 2 +- .../sdk/QueryFirewallRuleTemplateAction.java | 2 +- .../zstack/sdk/QueryFlowCollectorAction.java | 2 +- .../org/zstack/sdk/QueryFlowMeterAction.java | 2 +- .../java/org/zstack/sdk/QueryGCJobAction.java | 2 +- .../zstack/sdk/QueryGlobalConfigAction.java | 2 +- .../sdk/QueryGlobalConfigTemplateAction.java | 2 +- .../org/zstack/sdk/QueryGpuDeviceAction.java | 2 +- .../sdk/QueryGuestToolsStateAction.java | 2 +- .../zstack/sdk/QueryGuestVmScriptAction.java | 2 +- ...ueryGuestVmScriptExecutedRecordAction.java | 2 +- ...estVmScriptExecutedRecordDetailAction.java | 2 +- .../java/org/zstack/sdk/QueryHostAction.java | 2 +- .../sdk/QueryHostNetworkBondingAction.java | 2 +- .../sdk/QueryHostNetworkInterfaceAction.java | 2 +- .../QueryHostNetworkInterfaceLldpAction.java | 2 +- .../zstack/sdk/QueryHostOsCategoryAction.java | 2 +- .../sdk/QueryHostPhysicalMemoryAction.java | 2 +- .../QueryHostSchedulingRuleGroupAction.java | 2 +- .../sdk/QueryHybridEipFromLocalAction.java | 2 +- .../sdk/QueryHybridKeySecretAction.java | 2 +- .../zstack/sdk/QueryHygonDeviceAction.java | 2 +- .../sdk/QueryIAM2LdapBindingAction.java | 2 +- .../sdk/QueryIPSecConnectionAction.java | 2 +- .../sdk/QueryIdentityZoneFromLocalAction.java | 2 +- .../java/org/zstack/sdk/QueryImageAction.java | 2 +- .../org/zstack/sdk/QueryImageCacheAction.java | 2 +- .../org/zstack/sdk/QueryImageGroupAction.java | 2 +- .../zstack/sdk/QueryImageGroupRefAction.java | 2 +- .../zstack/sdk/QueryImagePackageAction.java | 2 +- .../sdk/QueryImageReplicationGroupAction.java | 2 +- .../QueryImageStoreBackupStorageAction.java | 2 +- .../sdk/QueryInstanceOfferingAction.java | 2 +- .../org/zstack/sdk/QueryIpAddressAction.java | 2 +- .../org/zstack/sdk/QueryIpRangeAction.java | 2 +- .../org/zstack/sdk/QueryIscsiLunAction.java | 2 +- .../zstack/sdk/QueryIscsiServerAction.java | 2 +- .../sdk/QueryKvmHypervisorInfoAction.java | 2 +- .../org/zstack/sdk/QueryL2NetworkAction.java | 2 +- .../sdk/QueryL2PortGroupNetworkAction.java | 2 +- .../QueryL2VirtualSwitchNetworkAction.java | 2 +- .../zstack/sdk/QueryL2VlanNetworkAction.java | 2 +- .../zstack/sdk/QueryL2VxlanNetworkAction.java | 2 +- .../sdk/QueryL2VxlanNetworkPoolAction.java | 2 +- .../org/zstack/sdk/QueryL3NetworkAction.java | 2 +- .../zstack/sdk/QueryLdapBindingAction.java | 2 +- .../org/zstack/sdk/QueryLdapServerAction.java | 2 +- .../zstack/sdk/QueryLoadBalancerAction.java | 2 +- .../sdk/QueryLoadBalancerListenerAction.java | 2 +- .../QueryLoadBalancerServerGroupAction.java | 2 +- .../sdk/QueryLocalRaidControllerAction.java | 2 +- .../QueryLocalRaidPhysicalDriveAction.java | 2 +- .../QueryLocalStorageResourceRefAction.java | 2 +- .../org/zstack/sdk/QueryLogServerAction.java | 2 +- .../org/zstack/sdk/QueryLongJobAction.java | 2 +- .../zstack/sdk/QueryManagementNodeAction.java | 2 +- .../org/zstack/sdk/QueryMdevDeviceAction.java | 2 +- .../zstack/sdk/QueryMdevDeviceSpecAction.java | 2 +- .../java/org/zstack/sdk/QueryMediaAction.java | 2 +- .../zstack/sdk/QueryMiniStorageAction.java | 2 +- .../sdk/QueryMiniStorageHostRefAction.java | 2 +- ...yMiniStorageResourceReplicationAction.java | 2 +- .../java/org/zstack/sdk/QueryModelAction.java | 2 +- .../zstack/sdk/QueryModelCenterAction.java | 2 +- ...ryModelEvalServiceInstanceGroupAction.java | 2 +- .../sdk/QueryModelEvaluationTaskAction.java | 2 +- .../zstack/sdk/QueryModelServiceAction.java | 2 +- .../QueryModelServiceInstanceGroupAction.java | 2 +- .../zstack/sdk/QueryMonitorTriggerAction.java | 2 +- .../sdk/QueryMonitorTriggerActionAction.java | 2 +- .../org/zstack/sdk/QueryMttyDeviceAction.java | 2 +- .../sdk/QueryMulticastRouterAction.java | 2 +- .../zstack/sdk/QueryNasFileSystemAction.java | 2 +- .../zstack/sdk/QueryNasMountTargetAction.java | 2 +- .../zstack/sdk/QueryNativeClusterAction.java | 2 +- .../org/zstack/sdk/QueryNativeHostAction.java | 2 +- ...QueryNetworkServiceL3NetworkRefAction.java | 2 +- .../QueryNetworkServiceProviderAction.java | 2 +- .../org/zstack/sdk/QueryNfvInstAction.java | 2 +- .../zstack/sdk/QueryNfvInstGroupAction.java | 2 +- .../sdk/QueryNfvInstOfferingAction.java | 2 +- .../org/zstack/sdk/QueryNvmeLunAction.java | 2 +- .../org/zstack/sdk/QueryNvmeServerAction.java | 2 +- .../org/zstack/sdk/QueryNvmeTargetAction.java | 2 +- .../sdk/QueryOssBucketFileNameAction.java | 2 +- .../zstack/sdk/QueryOvnControllerAction.java | 2 +- .../QueryOvnControllerVmInstanceAction.java | 2 +- .../org/zstack/sdk/QueryPciDeviceAction.java | 2 +- .../sdk/QueryPciDeviceOfferingAction.java | 2 +- ...QueryPciDevicePciDeviceOfferingAction.java | 2 +- .../zstack/sdk/QueryPciDeviceSpecAction.java | 2 +- ...eryPhysicalDriveSelfTestHistoryAction.java | 2 +- .../zstack/sdk/QueryPhysicalSwitchAction.java | 2 +- .../zstack/sdk/QueryPluginDriversAction.java | 2 +- .../org/zstack/sdk/QueryPolicyAction.java | 2 +- .../sdk/QueryPolicyRouteRuleAction.java | 2 +- .../sdk/QueryPolicyRouteRuleSetAction.java | 2 +- .../QueryPolicyRouteRuleSetL3RefAction.java | 2 +- ...eryPolicyRouteRuleSetVRouterRefAction.java | 2 +- .../sdk/QueryPolicyRouteTableAction.java | 2 +- ...QueryPolicyRouteTableRouteEntryAction.java | 2 +- ...QueryPolicyRouteTableVRouterRefAction.java | 2 +- .../sdk/QueryPortForwardingRuleAction.java | 2 +- .../org/zstack/sdk/QueryPortMirrorAction.java | 2 +- .../QueryPortMirrorNetworkUsedIpAction.java | 2 +- .../sdk/QueryPortMirrorSessionAction.java | 2 +- .../QueryPreconfigurationTemplateAction.java | 2 +- .../org/zstack/sdk/QueryPriceTableAction.java | 2 +- .../zstack/sdk/QueryPrimaryStorageAction.java | 2 +- .../org/zstack/sdk/QueryPublishAppAction.java | 2 +- .../java/org/zstack/sdk/QueryQuotaAction.java | 2 +- .../zstack/sdk/QueryResourceConfigAction.java | 2 +- .../zstack/sdk/QueryResourcePriceAction.java | 2 +- .../zstack/sdk/QueryResourceStackAction.java | 2 +- .../zstack/sdk/QuerySchedulerJobAction.java | 2 +- .../sdk/QuerySchedulerJobGroupAction.java | 2 +- .../sdk/QuerySchedulerJobHistoryAction.java | 2 +- .../sdk/QuerySchedulerTriggerAction.java | 2 +- .../org/zstack/sdk/QueryScsiLunAction.java | 2 +- .../zstack/sdk/QuerySdnControllerAction.java | 2 +- .../sdk/QuerySecretResourcePoolAction.java | 2 +- .../zstack/sdk/QuerySecurityGroupAction.java | 2 +- .../sdk/QuerySecurityGroupRuleAction.java | 2 +- .../sdk/QuerySecurityMachineAction.java | 2 +- .../sdk/QuerySftpBackupStorageAction.java | 2 +- ...eryShareableVolumeVmInstanceRefAction.java | 2 +- .../zstack/sdk/QuerySharedBlockAction.java | 2 +- ...ySharedBlockGroupPrimaryStorageAction.java | 2 +- ...BlockGroupPrimaryStorageHostRefAction.java | 2 +- .../zstack/sdk/QuerySharedResourceAction.java | 2 +- .../org/zstack/sdk/QuerySlbGroupAction.java | 2 +- .../zstack/sdk/QuerySlbOfferingAction.java | 2 +- .../zstack/sdk/QuerySlbVmInstanceAction.java | 2 +- .../org/zstack/sdk/QuerySnmpAgentAction.java | 2 +- .../org/zstack/sdk/QuerySshKeyPairAction.java | 2 +- .../zstack/sdk/QueryStackTemplateAction.java | 2 +- .../org/zstack/sdk/QuerySystemTagAction.java | 2 +- .../java/org/zstack/sdk/QueryTagAction.java | 2 +- .../zstack/sdk/QueryTemplateConfigAction.java | 2 +- .../sdk/QueryTrainedModelRecordAction.java | 2 +- .../QueryTwoFactorAuthenticationAction.java | 2 +- .../org/zstack/sdk/QueryUsbDeviceAction.java | 2 +- .../java/org/zstack/sdk/QueryUserAction.java | 2 +- .../org/zstack/sdk/QueryUserGroupAction.java | 2 +- .../sdk/QueryUserProxyConfigAction.java | 2 +- .../org/zstack/sdk/QueryUserTagAction.java | 2 +- .../sdk/QueryV2VConversionHostAction.java | 2 +- .../org/zstack/sdk/QueryVCenterAction.java | 2 +- .../sdk/QueryVCenterBackupStorageAction.java | 2 +- .../zstack/sdk/QueryVCenterClusterAction.java | 2 +- .../sdk/QueryVCenterDatacenterAction.java | 2 +- .../sdk/QueryVCenterPrimaryStorageAction.java | 2 +- .../sdk/QueryVCenterResourcePoolAction.java | 2 +- .../QueryVRouterFlowMeterNetworkAction.java | 2 +- .../sdk/QueryVRouterOspfAreaAction.java | 2 +- .../sdk/QueryVRouterOspfNetworkAction.java | 2 +- .../sdk/QueryVRouterRouteEntryAction.java | 2 +- .../sdk/QueryVRouterRouteTableAction.java | 2 +- .../java/org/zstack/sdk/QueryVipAction.java | 2 +- ...eryVirtualBorderRouterFromLocalAction.java | 2 +- .../sdk/QueryVirtualRouterOfferingAction.java | 2 +- ...rtualRouterVRouterRouteTableRefAction.java | 2 +- .../sdk/QueryVirtualRouterVmAction.java | 2 +- .../org/zstack/sdk/QueryVmCdRomAction.java | 2 +- .../org/zstack/sdk/QueryVmInstanceAction.java | 2 +- ...yVmInstanceDeviceAddressArchiveAction.java | 2 +- ...eryVmInstanceDeviceAddressGroupAction.java | 2 +- ...ueryVmInstanceMdevDeviceSpecRefAction.java | 2 +- ...QueryVmInstancePciDeviceSpecRefAction.java | 2 +- .../java/org/zstack/sdk/QueryVmNicAction.java | 2 +- .../sdk/QueryVmNicInSecurityGroupAction.java | 2 +- .../sdk/QueryVmNicSecurityPolicyAction.java | 2 +- .../sdk/QueryVmPriorityConfigAction.java | 2 +- .../zstack/sdk/QueryVmSchedHistoryAction.java | 2 +- .../sdk/QueryVmSchedulingRuleAction.java | 2 +- .../sdk/QueryVmSchedulingRuleGroupAction.java | 2 +- ...QueryVmUserDefinedXmlHookScriptAction.java | 2 +- .../org/zstack/sdk/QueryVniRangeAction.java | 2 +- .../org/zstack/sdk/QueryVolumeAction.java | 2 +- .../zstack/sdk/QueryVolumeSnapshotAction.java | 2 +- .../sdk/QueryVolumeSnapshotGroupAction.java | 2 +- .../sdk/QueryVolumeSnapshotTreeAction.java | 2 +- .../zstack/sdk/QueryVpcFirewallAction.java | 2 +- .../sdk/QueryVpcFirewallVRouterRefAction.java | 2 +- .../org/zstack/sdk/QueryVpcHaGroupAction.java | 2 +- ...ueryVpcHaGroupNetworkServiceRefAction.java | 2 +- .../sdk/QueryVpcIkeConfigFromLocalAction.java | 2 +- .../QueryVpcIpSecConfigFromLocalAction.java | 2 +- .../org/zstack/sdk/QueryVpcRouterAction.java | 2 +- .../zstack/sdk/QueryVpcSharedQosAction.java | 2 +- .../zstack/sdk/QueryVpcSnatStateAction.java | 2 +- ...QueryVpcUserVpnGatewayFromLocalAction.java | 2 +- .../QueryVpcVpnConnectionFromLocalAction.java | 2 +- .../QueryVpcVpnGatewayFromLocalAction.java | 2 +- .../java/org/zstack/sdk/QueryVtepAction.java | 2 +- .../org/zstack/sdk/QueryWebhookAction.java | 2 +- .../sdk/QueryXskyBlockVolumeAction.java | 2 +- .../java/org/zstack/sdk/QueryZBoxAction.java | 2 +- .../org/zstack/sdk/QueryZBoxBackupAction.java | 2 +- .../java/org/zstack/sdk/QueryZdfsAction.java | 2 +- .../java/org/zstack/sdk/QueryZoneAction.java | 2 +- .../sdk/RebootBaremetalInstanceAction.java | 2 +- .../zstack/sdk/RebootEcsInstanceAction.java | 2 +- .../zstack/sdk/RebootVmInstanceAction.java | 2 +- .../sdk/ReclaimSpaceFromImageStoreAction.java | 2 +- .../sdk/ReconnectAppBuildSystemAction.java | 2 +- .../sdk/ReconnectBackupStorageAction.java | 2 +- .../sdk/ReconnectBareMetal2GatewayAction.java | 2 +- .../ReconnectBareMetal2InstanceAction.java | 2 +- .../ReconnectBaremetalPxeServerAction.java | 2 +- .../sdk/ReconnectConsoleProxyAgentAction.java | 2 +- .../org/zstack/sdk/ReconnectHostAction.java | 2 +- .../sdk/ReconnectIPsecConnectionAction.java | 2 +- ...econnectImageStoreBackupStorageAction.java | 2 +- .../zstack/sdk/ReconnectNfvInstAction.java | 2 +- .../sdk/ReconnectPrimaryStorageAction.java | 2 +- .../sdk/ReconnectSdnControllerAction.java | 2 +- .../sdk/ReconnectSftpBackupStorageAction.java | 2 +- .../sdk/ReconnectVirtualRouterAction.java | 2 +- .../org/zstack/sdk/ReconnectZdfsAction.java | 2 +- .../sdk/RecoverBaremetalInstanceAction.java | 2 +- .../zstack/sdk/RecoverDataVolumeAction.java | 2 +- .../org/zstack/sdk/RecoverImageAction.java | 2 +- .../sdk/RecoverResourceSplitBrainAction.java | 2 +- .../zstack/sdk/RecoverVmInstanceAction.java | 2 +- ...mageFromImageStoreBackupStorageAction.java | 2 +- ...coveryVirtualBorderRouterRemoteAction.java | 2 +- .../org/zstack/sdk/RefreshCaptchaAction.java | 2 +- .../sdk/RefreshFiberChannelStorageAction.java | 2 +- .../org/zstack/sdk/RefreshFirewallAction.java | 2 +- .../sdk/RefreshGuestOsMetadataAction.java | 2 +- .../zstack/sdk/RefreshIscsiServerAction.java | 2 +- .../zstack/sdk/RefreshLoadBalancerAction.java | 2 +- .../zstack/sdk/RefreshLocalRaidAction.java | 2 +- .../zstack/sdk/RefreshNvmeTargetAction.java | 2 +- .../sdk/RefreshPluginDriversAction.java | 2 +- .../sdk/RefreshSSOServerTokenAction.java | 2 +- .../sdk/RefreshSearchIndexesAction.java | 2 +- ...efreshSharedblockDeviceCapacityAction.java | 2 +- ...sterLicenseRequestedApplicationAction.java | 2 +- .../zstack/sdk/ReimageVmInstanceAction.java | 2 +- .../zstack/sdk/ReloadElaborationAction.java | 2 +- .../sdk/ReloadExternalServiceAction.java | 2 +- .../org/zstack/sdk/ReloadLicenseAction.java | 2 +- .../RemoveAccessControlListEntryAction.java | 2 +- ...cessControlListFromLoadBalancerAction.java | 2 +- ...oveBackendServerFromServerGroupAction.java | 2 +- ...ificateFromLoadBalancerListenerAction.java | 2 +- .../sdk/RemoveDnsFromL3NetworkAction.java | 2 +- .../sdk/RemoveDnsFromVpcRouterAction.java | 2 +- .../RemoveHostRouteFromL3NetworkAction.java | 2 +- ...oveMdevDeviceSpecFromVmInstanceAction.java | 2 +- .../RemoveMonFromCephBackupStorageAction.java | 2 +- ...RemoveMonFromCephPrimaryStorageAction.java | 2 +- ...movePciDeviceSpecFromVmInstanceAction.java | 2 +- ...eRemoteCidrsFromIPsecConnectionAction.java | 2 +- ...dezvousPointFromMulticastRouterAction.java | 2 +- .../RemoveResourcesFromDirectoryAction.java | 2 +- ...chedulerJobFromSchedulerTriggerAction.java | 2 +- ...lerJobGroupFromSchedulerTriggerAction.java | 2 +- ...edulerJobsFromSchedulerJobGroupAction.java | 2 +- .../zstack/sdk/RemoveSdnControllerAction.java | 2 +- ...erGroupFromLoadBalancerListenerAction.java | 2 +- .../zstack/sdk/RemoveUserFromGroupAction.java | 2 +- ...oveVRouterNetworksFromFlowMeterAction.java | 2 +- ...moveVRouterNetworksFromOspfAreaAction.java | 2 +- .../sdk/RemoveVmFromAffinityGroupAction.java | 2 +- .../RemoveVmNicFromLoadBalancerAction.java | 2 +- .../sdk/RemoveVmSchedulingRuleAction.java | 2 +- .../org/zstack/sdk/RenewSessionAction.java | 2 +- .../sdk/RequestConsoleAccessAction.java | 2 +- .../org/zstack/sdk/RerunLongJobAction.java | 2 +- .../zstack/sdk/ResetGlobalConfigAction.java | 2 +- .../zstack/sdk/ResetTemplateConfigAction.java | 2 +- ...etTwoFactorAuthenticationSecretAction.java | 2 +- .../zstack/sdk/ResizeDataVolumeAction.java | 2 +- .../zstack/sdk/ResizeRootVolumeAction.java | 2 +- .../sdk/RestartModelServiceGroupsAction.java | 2 +- .../sdk/RestartResourceStackAction.java | 2 +- .../org/zstack/sdk/ResumeLongJobAction.java | 2 +- .../zstack/sdk/ResumeVmInstanceAction.java | 2 +- .../sdk/RevertTemplateConfigAction.java | 2 +- .../sdk/RevertVmFromCdpBackupAction.java | 2 +- .../sdk/RevertVmFromSnapshotGroupAction.java | 2 +- .../sdk/RevertVolumeFromSnapshotAction.java | 2 +- .../sdk/RevokeResourceSharingAction.java | 2 +- .../org/zstack/sdk/RunIAM2ScriptAction.java | 2 +- .../zstack/sdk/RunSchedulerTriggerAction.java | 2 +- .../sdk/SdnControllerAddHostAction.java | 2 +- .../sdk/SdnControllerChangeHostAction.java | 2 +- .../sdk/SdnControllerRemoveHostAction.java | 2 +- .../sdk/SecurityMachineDetectSyncAction.java | 2 +- .../sdk/SecurityMachineEncryptAction.java | 2 +- .../zstack/sdk/SelfTestLocalRaidAction.java | 2 +- .../sdk/SetFlowMeterRouterIdAction.java | 2 +- .../zstack/sdk/SetImageBootModeAction.java | 2 +- .../org/zstack/sdk/SetImageQgaAction.java | 2 +- .../sdk/SetImageSecurityLevelAction.java | 2 +- ...SetImageStoreBackupStorageQuotaAction.java | 2 +- .../sdk/SetIpOnHostNetworkBondingAction.java | 2 +- .../SetIpOnHostNetworkInterfaceAction.java | 2 +- .../org/zstack/sdk/SetL3NetworkMtuAction.java | 2 +- .../SetL3NetworkRouterInterfaceIpAction.java | 2 +- .../java/org/zstack/sdk/SetNicQosAction.java | 2 +- .../sdk/SetSecurityMachineKeyAction.java | 2 +- ...ServiceTypeOnHostNetworkBondingAction.java | 2 +- ...rviceTypeOnHostNetworkInterfaceAction.java | 2 +- .../zstack/sdk/SetVRouterRouterIdAction.java | 2 +- .../java/org/zstack/sdk/SetVipQosAction.java | 2 +- .../org/zstack/sdk/SetVmBootModeAction.java | 2 +- .../org/zstack/sdk/SetVmBootOrderAction.java | 2 +- .../org/zstack/sdk/SetVmBootVolumeAction.java | 2 +- .../zstack/sdk/SetVmCleanTrafficAction.java | 2 +- .../org/zstack/sdk/SetVmClockTrackAction.java | 2 +- .../zstack/sdk/SetVmConsoleModeAction.java | 2 +- .../sdk/SetVmConsolePasswordAction.java | 2 +- .../sdk/SetVmEmulatorPinningAction.java | 2 +- .../org/zstack/sdk/SetVmHostnameAction.java | 2 +- .../sdk/SetVmInstanceDefaultCdRomAction.java | 2 +- .../sdk/SetVmInstanceHaLevelAction.java | 2 +- .../sdk/SetVmInstanceHygonMdevAction.java | 2 +- .../zstack/sdk/SetVmMonitorNumberAction.java | 2 +- .../sdk/SetVmNicSecurityGroupAction.java | 2 +- .../java/org/zstack/sdk/SetVmNumaAction.java | 2 +- .../java/org/zstack/sdk/SetVmQgaAction.java | 2 +- .../org/zstack/sdk/SetVmQxlMemoryAction.java | 2 +- .../java/org/zstack/sdk/SetVmRDPAction.java | 2 +- .../zstack/sdk/SetVmSecurityLevelAction.java | 2 +- .../org/zstack/sdk/SetVmSoundTypeAction.java | 2 +- .../org/zstack/sdk/SetVmSshKeyAction.java | 2 +- .../org/zstack/sdk/SetVmStaticIpAction.java | 2 +- .../zstack/sdk/SetVmUsbRedirectAction.java | 2 +- .../zstack/sdk/SetVmUserDefinedXmlAction.java | 2 +- .../SetVmUserDefinedXmlHookScriptAction.java | 2 +- .../sdk/SetVolumeIoThreadPinAction.java | 2 +- .../org/zstack/sdk/SetVolumeQosAction.java | 2 +- ...RouterDistributedRoutingEnabledAction.java | 2 +- ...etVpcVRouterNetworkServiceStateAction.java | 2 +- .../org/zstack/sdk/ShareResourceAction.java | 2 +- .../sdk/ShrinkVolumeSnapshotAction.java | 2 +- .../org/zstack/sdk/ShutdownHostAction.java | 2 +- .../zstack/sdk/SsoClientPushDataAction.java | 2 +- .../sdk/StartBareMetal2InstanceAction.java | 2 +- .../sdk/StartBaremetalInstanceAction.java | 2 +- .../sdk/StartBaremetalPxeServerAction.java | 2 +- ...ionBetweenAliyunRouterInterfaceAction.java | 2 +- .../zstack/sdk/StartDataProtectionAction.java | 2 +- .../zstack/sdk/StartEcsInstanceAction.java | 2 +- .../org/zstack/sdk/StartSnmpAgentAction.java | 2 +- .../org/zstack/sdk/StartVmInstanceAction.java | 2 +- .../sdk/StopBaremetalInstanceAction.java | 2 +- .../sdk/StopBaremetalPxeServerAction.java | 2 +- .../org/zstack/sdk/StopEcsInstanceAction.java | 2 +- .../org/zstack/sdk/StopSnmpAgentAction.java | 2 +- .../org/zstack/sdk/StopVmInstanceAction.java | 2 +- .../org/zstack/sdk/SubmitLongJobAction.java | 2 +- .../sdk/SyncAINginxConfigurationAction.java | 2 +- .../SyncAliyunRouteEntryFromRemoteAction.java | 2 +- ...AliyunRouterInterfaceFromRemoteAction.java | 2 +- .../sdk/SyncAliyunSnapshotRemoteAction.java | 2 +- ...ncAliyunVirtualRouterFromRemoteAction.java | 2 +- .../zstack/sdk/SyncChronyServersAction.java | 2 +- ...ConnectionAccessPointFromRemoteAction.java | 2 +- ...SyncContainerManagementEndpointAction.java | 2 +- .../sdk/SyncDataCenterFromRemoteAction.java | 2 +- .../SyncDiskFromAliyunFromRemoteAction.java | 2 +- .../sdk/SyncEcsImageFromRemoteAction.java | 2 +- .../sdk/SyncEcsInstanceFromRemoteAction.java | 2 +- .../SyncEcsSecurityGroupFromRemoteAction.java | 2 +- ...cEcsSecurityGroupRuleFromRemoteAction.java | 2 +- .../sdk/SyncEcsVSwitchFromRemoteAction.java | 2 +- .../sdk/SyncEcsVpcFromRemoteAction.java | 2 +- .../sdk/SyncHybridEipFromRemoteAction.java | 2 +- .../sdk/SyncIdentityFromRemoteAction.java | 2 +- .../java/org/zstack/sdk/SyncImageAction.java | 2 +- ...mageFromImageStoreBackupStorageAction.java | 2 +- .../org/zstack/sdk/SyncImageSizeAction.java | 2 +- .../org/zstack/sdk/SyncLdapServerAction.java | 2 +- .../zstack/sdk/SyncNfvInstGroupAction.java | 2 +- .../sdk/SyncPrimaryStorageCapacityAction.java | 2 +- .../org/zstack/sdk/SyncVCenterAction.java | 2 +- ...ncVirtualBorderRouterFromRemoteAction.java | 2 +- .../org/zstack/sdk/SyncVmClockAction.java | 2 +- .../org/zstack/sdk/SyncVolumeSizeAction.java | 2 +- ...SyncVpcUserVpnGatewayFromRemoteAction.java | 2 +- .../SyncVpcVpnConnectionFromRemoteAction.java | 2 +- .../SyncVpcVpnGatewayFromRemoteAction.java | 2 +- .../zstack/sdk/SyncZBoxCapacityAction.java | 2 +- .../sdk/TakeVmConsoleScreenshotAction.java | 2 +- ...minateVirtualBorderRouterRemoteAction.java | 2 +- .../zstack/sdk/TokenIntrospectionAction.java | 2 +- .../org/zstack/sdk/TriggerGCJobAction.java | 2 +- .../sdk/UnbindModelFromServiceAction.java | 2 +- .../sdk/UndoSnapshotCreationAction.java | 2 +- .../zstack/sdk/UnexportNbdVolumesAction.java | 2 +- .../sdk/UngenerateHygonMdevDevicesAction.java | 2 +- .../sdk/UngenerateMdevDevicesAction.java | 2 +- .../sdk/UngenerateSeMdevDevicesAction.java | 2 +- .../sdk/UngenerateSriovPciDevicesAction.java | 2 +- .../sdk/UngroupVolumeSnapshotGroupAction.java | 2 +- .../org/zstack/sdk/UnlockIdentityAction.java | 2 +- .../UnmountVmInstanceRecoveryPointAction.java | 2 +- ...nprotectVmInstanceRecoveryPointAction.java | 2 +- .../sdk/UpdateAccessControlListAction.java | 2 +- .../sdk/UpdateAccessControlRuleAction.java | 2 +- .../org/zstack/sdk/UpdateAccountAction.java | 2 +- .../zstack/sdk/UpdateAffinityGroupAction.java | 2 +- .../zstack/sdk/UpdateAliyunDiskAction.java | 2 +- .../UpdateAliyunEbsBackupStorageAction.java | 2 +- .../UpdateAliyunEbsPrimaryStorageAction.java | 2 +- .../sdk/UpdateAliyunKeySecretAction.java | 2 +- .../sdk/UpdateAliyunMountTargetAction.java | 2 +- .../sdk/UpdateAliyunNasAccessGroupAction.java | 2 +- .../sdk/UpdateAliyunPanguPartitionAction.java | 2 +- .../sdk/UpdateAliyunProxyVSwitchAction.java | 2 +- .../sdk/UpdateAliyunProxyVpcAction.java | 2 +- ...pdateAliyunRouteInterfaceRemoteAction.java | 2 +- .../sdk/UpdateAliyunSnapshotAction.java | 2 +- .../sdk/UpdateAliyunVirtualRouterAction.java | 2 +- .../sdk/UpdateAppBuildSystemAction.java | 2 +- .../sdk/UpdateAutoScalingGroupAction.java | 2 +- ...alingGroupAddingNewInstanceRuleAction.java | 2 +- .../UpdateAutoScalingGroupInstanceAction.java | 2 +- ...ScalingGroupRemovalInstanceRuleAction.java | 2 +- .../sdk/UpdateAutoScalingRuleAction.java | 2 +- .../UpdateAutoScalingVmTemplateAction.java | 2 +- .../zstack/sdk/UpdateBackupStorageAction.java | 2 +- .../sdk/UpdateBareMetal2ChassisAction.java | 2 +- ...UpdateBareMetal2ChassisOfferingAction.java | 2 +- ...pdateBareMetal2ChassisPciDeviceAction.java | 2 +- .../sdk/UpdateBareMetal2GatewayAction.java | 2 +- .../sdk/UpdateBareMetal2InstanceAction.java | 2 +- .../UpdateBareMetal2IpmiChassisAction.java | 2 +- ...pdateBareMetal2ProvisionNetworkAction.java | 2 +- .../sdk/UpdateBaremetalChassisAction.java | 2 +- .../sdk/UpdateBaremetalInstanceAction.java | 2 +- .../sdk/UpdateBaremetalPxeServerAction.java | 2 +- .../sdk/UpdateBlockPrimaryStorageAction.java | 2 +- .../zstack/sdk/UpdateBlockVolumeAction.java | 2 +- .../org/zstack/sdk/UpdateBondingAction.java | 2 +- .../org/zstack/sdk/UpdateBuildAppAction.java | 2 +- .../UpdateCCSCertificateUserStateAction.java | 2 +- .../UpdateCSPSecretResourcePoolAction.java | 2 +- .../org/zstack/sdk/UpdateCasClientAction.java | 2 +- .../org/zstack/sdk/UpdateCdpPolicyAction.java | 2 +- .../org/zstack/sdk/UpdateCdpTaskAction.java | 2 +- .../sdk/UpdateCephBackupStorageMonAction.java | 2 +- .../UpdateCephPrimaryStorageMonAction.java | 2 +- .../UpdateCephPrimaryStoragePoolAction.java | 2 +- .../zstack/sdk/UpdateCertificateAction.java | 2 +- .../zstack/sdk/UpdateChronyServersAction.java | 2 +- .../org/zstack/sdk/UpdateClusterAction.java | 2 +- .../zstack/sdk/UpdateClusterDRSAction.java | 2 +- .../org/zstack/sdk/UpdateClusterOSAction.java | 2 +- ...etweenL3NetWorkAndAliyunVSwitchAction.java | 2 +- .../sdk/UpdateConsolePasswordAction.java | 2 +- .../sdk/UpdateConsoleProxyAgentAction.java | 2 +- ...dateContainerManagementEndpointAction.java | 2 +- .../org/zstack/sdk/UpdateDatasetAction.java | 2 +- .../org/zstack/sdk/UpdateDatasetsAction.java | 2 +- .../org/zstack/sdk/UpdateDirectoryAction.java | 2 +- .../zstack/sdk/UpdateDiskOfferingAction.java | 2 +- .../org/zstack/sdk/UpdateEcsImageAction.java | 2 +- .../zstack/sdk/UpdateEcsInstanceAction.java | 2 +- .../UpdateEcsInstanceVncPasswordAction.java | 2 +- .../sdk/UpdateEcsSecurityGroupAction.java | 2 +- .../zstack/sdk/UpdateEcsVSwitchAction.java | 2 +- .../org/zstack/sdk/UpdateEcsVpcAction.java | 2 +- .../java/org/zstack/sdk/UpdateEipAction.java | 2 +- .../zstack/sdk/UpdateEmailMediaAction.java | 2 +- ...UpdateEmailMonitorTriggerActionAction.java | 2 +- .../UpdateExternalPrimaryStorageAction.java | 2 +- .../sdk/UpdateFactoryModeStateAction.java | 2 +- .../UpdateFiSecSecretResourcePoolAction.java | 2 +- .../sdk/UpdateFiSecSecurityMachineAction.java | 2 +- .../UpdateFirewallIpSetTemplateAction.java | 2 +- .../zstack/sdk/UpdateFirewallRuleAction.java | 2 +- .../sdk/UpdateFirewallRuleSetAction.java | 2 +- .../sdk/UpdateFirewallRuleTemplateAction.java | 2 +- .../UpdateFlkSecSecretResourcePoolAction.java | 2 +- .../UpdateFlkSecSecurityMachineAction.java | 2 +- .../zstack/sdk/UpdateFlowCollectorAction.java | 2 +- .../org/zstack/sdk/UpdateFlowMeterAction.java | 2 +- .../zstack/sdk/UpdateGlobalConfigAction.java | 2 +- .../sdk/UpdateGuestToolsStateAction.java | 2 +- .../zstack/sdk/UpdateGuestVmScriptAction.java | 2 +- .../sdk/UpdateHaStrategyConditionAction.java | 2 +- .../java/org/zstack/sdk/UpdateHostAction.java | 2 +- .../sdk/UpdateHostIommuStateAction.java | 2 +- .../org/zstack/sdk/UpdateHostIpmiAction.java | 2 +- .../sdk/UpdateHostNetworkInterfaceAction.java | 2 +- .../UpdateHostNetworkServiceTypeAction.java | 2 +- .../UpdateHostSchedulingRuleGroupAction.java | 2 +- .../org/zstack/sdk/UpdateHybridEipAction.java | 2 +- .../sdk/UpdateHybridKeySecretAction.java | 2 +- .../sdk/UpdateIPsecConnectionAction.java | 2 +- .../org/zstack/sdk/UpdateImageAction.java | 2 +- .../zstack/sdk/UpdateImagePackageAction.java | 2 +- .../UpdateImageStoreBackupStorageAction.java | 2 +- ...UpdateInfoSecSecretResourcePoolAction.java | 2 +- .../UpdateInfoSecSecurityMachineAction.java | 2 +- .../sdk/UpdateInstanceOfferingAction.java | 2 +- .../org/zstack/sdk/UpdateIpRangeAction.java | 2 +- .../zstack/sdk/UpdateIscsiServerAction.java | 2 +- .../sdk/UpdateJitSecurityMachineAction.java | 2 +- .../org/zstack/sdk/UpdateKVMHostAction.java | 2 +- .../UpdateKoAlSecretResourcePoolAction.java | 2 +- .../org/zstack/sdk/UpdateL2NetworkAction.java | 2 +- .../org/zstack/sdk/UpdateL3NetworkAction.java | 2 +- .../zstack/sdk/UpdateLdapServerAction.java | 2 +- .../org/zstack/sdk/UpdateLicenseAction.java | 2 +- .../zstack/sdk/UpdateLoadBalancerAction.java | 2 +- .../sdk/UpdateLoadBalancerListenerAction.java | 2 +- .../UpdateLoadBalancerServerGroupAction.java | 2 +- .../sdk/UpdateLogConfigurationAction.java | 2 +- .../org/zstack/sdk/UpdateLogServerAction.java | 2 +- .../org/zstack/sdk/UpdateLongJobAction.java | 2 +- .../zstack/sdk/UpdateMdevDeviceAction.java | 2 +- .../sdk/UpdateMdevDeviceSpecAction.java | 2 +- .../org/zstack/sdk/UpdateModelAction.java | 2 +- .../zstack/sdk/UpdateModelCenterAction.java | 2 +- .../sdk/UpdateModelEvaluationTaskAction.java | 2 +- .../zstack/sdk/UpdateModelServiceAction.java | 2 +- ...UpdateModelServiceInstanceGroupAction.java | 2 +- .../sdk/UpdateMonitorTriggerAction.java | 2 +- .../zstack/sdk/UpdateNasFileSystemAction.java | 2 +- .../sdk/UpdateNasMountTargetAction.java | 2 +- .../zstack/sdk/UpdateNfvInstGroupAction.java | 2 +- .../UpdateNfvInstProvisionConfigAction.java | 2 +- .../zstack/sdk/UpdateOAuthClientAction.java | 2 +- .../org/zstack/sdk/UpdateOssBucketAction.java | 2 +- .../org/zstack/sdk/UpdatePciDeviceAction.java | 2 +- .../zstack/sdk/UpdatePciDeviceSpecAction.java | 2 +- .../UpdatePluginSecretResourcePoolAction.java | 2 +- .../sdk/UpdatePolicyRouteRuleSetAction.java | 2 +- .../sdk/UpdatePortForwardingRuleAction.java | 2 +- .../zstack/sdk/UpdatePortMirrorAction.java | 2 +- .../UpdatePreconfigurationTemplateAction.java | 2 +- .../zstack/sdk/UpdatePriceTableAction.java | 2 +- .../sdk/UpdatePrimaryStorageAction.java | 2 +- .../sdk/UpdatePriorityConfigAction.java | 2 +- .../zstack/sdk/UpdatePublishAppAction.java | 2 +- .../org/zstack/sdk/UpdateQuotaAction.java | 2 +- .../sdk/UpdateResourceConfigAction.java | 2 +- .../sdk/UpdateResourceConfigsAction.java | 2 +- .../zstack/sdk/UpdateResourcePriceAction.java | 2 +- .../zstack/sdk/UpdateResourceStackAction.java | 2 +- .../zstack/sdk/UpdateSAML2ClientAction.java | 2 +- .../sdk/UpdateSSOClientAttributeAction.java | 2 +- .../sdk/UpdateSSORedirectTemplateAction.java | 2 +- .../UpdateSanSecSecretResourcePoolAction.java | 2 +- .../UpdateSanSecSecurityMachineAction.java | 2 +- .../zstack/sdk/UpdateSchedulerJobAction.java | 2 +- .../sdk/UpdateSchedulerJobGroupAction.java | 2 +- .../sdk/UpdateSchedulerTriggerAction.java | 2 +- .../org/zstack/sdk/UpdateScsiLunAction.java | 2 +- .../zstack/sdk/UpdateSdnControllerAction.java | 2 +- .../sdk/UpdateSecretResourcePoolAction.java | 2 +- .../zstack/sdk/UpdateSecurityGroupAction.java | 2 +- ...UpdateSecurityGroupRulePriorityAction.java | 2 +- .../sdk/UpdateSecurityMachineAction.java | 2 +- .../sdk/UpdateSftpBackupStorageAction.java | 2 +- .../zstack/sdk/UpdateSharedBlockAction.java | 2 +- .../org/zstack/sdk/UpdateSlbGroupAction.java | 2 +- .../org/zstack/sdk/UpdateSnmpAgentAction.java | 2 +- .../zstack/sdk/UpdateSshKeyPairAction.java | 2 +- .../zstack/sdk/UpdateStackTemplateAction.java | 2 +- .../org/zstack/sdk/UpdateSystemTagAction.java | 2 +- .../java/org/zstack/sdk/UpdateTagAction.java | 2 +- .../sdk/UpdateTemplateConfigAction.java | 2 +- .../org/zstack/sdk/UpdateUsbDeviceAction.java | 2 +- .../java/org/zstack/sdk/UpdateUserAction.java | 2 +- .../org/zstack/sdk/UpdateUserGroupAction.java | 2 +- .../sdk/UpdateUserProxyConfigAction.java | 2 +- .../sdk/UpdateV2VConversionHostAction.java | 2 +- .../org/zstack/sdk/UpdateVCenterAction.java | 2 +- .../sdk/UpdateVRouterOspfAreaAction.java | 2 +- .../sdk/UpdateVRouterRouteTableAction.java | 2 +- .../java/org/zstack/sdk/UpdateVipAction.java | 2 +- ...UpdateVirtualBorderRouterRemoteAction.java | 2 +- .../zstack/sdk/UpdateVirtualRouterAction.java | 2 +- .../UpdateVirtualRouterOfferingAction.java | 2 +- ...ateVirtualRouterSoftwareVersionAction.java | 2 +- .../org/zstack/sdk/UpdateVmCdRomAction.java | 2 +- .../zstack/sdk/UpdateVmInstanceAction.java | 2 +- .../sdk/UpdateVmNetworkConfigAction.java | 2 +- .../zstack/sdk/UpdateVmNicDriverAction.java | 2 +- .../org/zstack/sdk/UpdateVmNicMacAction.java | 2 +- .../zstack/sdk/UpdateVmPriorityAction.java | 2 +- .../sdk/UpdateVmSchedulingRuleAction.java | 2 +- .../UpdateVmSchedulingRuleGroupAction.java | 2 +- ...pdateVmUserDefinedXmlHookScriptAction.java | 2 +- .../org/zstack/sdk/UpdateVniRangeAction.java | 2 +- .../org/zstack/sdk/UpdateVolumeAction.java | 2 +- .../sdk/UpdateVolumeSnapshotAction.java | 2 +- .../sdk/UpdateVolumeSnapshotGroupAction.java | 2 +- .../zstack/sdk/UpdateVpcFirewallAction.java | 2 +- .../zstack/sdk/UpdateVpcHaGroupAction.java | 2 +- .../zstack/sdk/UpdateVpcSharedQosAction.java | 2 +- .../sdk/UpdateVpcUserVpnGatewayAction.java | 2 +- .../UpdateVpcVpnConnectionRemoteAction.java | 2 +- .../zstack/sdk/UpdateVpcVpnGatewayAction.java | 2 +- .../org/zstack/sdk/UpdateWebhookAction.java | 2 +- .../sdk/UpdateXskyBlockVolumeAction.java | 2 +- .../java/org/zstack/sdk/UpdateZoneAction.java | 2 +- .../UpgradeBackupStorageCdpTasksAction.java | 2 +- .../org/zstack/sdk/UploadFileToVmAction.java | 2 +- .../sdk/ValidateClusterSupportDRSAction.java | 2 +- .../ValidateDiskOfferingUserConfigAction.java | 2 +- ...idateInstanceOfferingUserConfigAction.java | 2 +- .../zstack/sdk/ValidatePasswordAction.java | 2 +- .../sdk/ValidatePriceUserConfigAction.java | 2 +- .../sdk/ValidateSecurityGroupRuleAction.java | 2 +- .../org/zstack/sdk/ValidateSessionAction.java | 2 +- .../sdk/ValidateVmSchedulingRuleAction.java | 2 +- .../ValidateVolumeSnapshotChainAction.java | 2 +- .../java/org/zstack/sdk/ZQLQueryAction.java | 2 +- .../CreateDatabaseBackupAction.java | 2 +- .../DeleteDatabaseBackupAction.java | 2 +- ...DatabaseBackupFromBackupStorageAction.java | 2 +- ...DatabaseBackupFromBackupStorageAction.java | 2 +- ...GetDatabaseBackupFromImageStoreAction.java | 2 +- .../QueryDatabaseBackupAction.java | 2 +- .../RecoverDatabaseFromBackupAction.java | 2 +- .../SyncDatabaseBackupAction.java | 2 +- ...ckupFromImageStoreBackupStorageAction.java | 2 +- .../CreateHuaweiIMasterVRouterAction.java | 2 +- .../DeleteHuaweiIMasterFabricAction.java | 2 +- .../DeleteHuaweiIMasterTenantAction.java | 2 +- .../DeleteHuaweiIMasterVRouterAction.java | 2 +- .../imaster/DeleteHuaweiIMasterVpcAction.java | 2 +- .../PullHuaweiIMasterControllerAction.java | 2 +- .../QueryHuaweiIMasterFabricAction.java | 2 +- .../QueryHuaweiIMasterTenantAction.java | 2 +- .../QueryHuaweiIMasterVRouterAction.java | 2 +- .../imaster/QueryHuaweiIMasterVpcAction.java | 2 +- ...AddAttributesToIAM2OrganizationAction.java | 2 +- .../api/AddAttributesToIAM2ProjectAction.java | 2 +- .../AddAttributesToIAM2VirtualIDAction.java | 2 +- ...dAttributesToIAM2VirtualIDGroupAction.java | 2 +- ...AddIAM2VirtualIDGroupToProjectsAction.java | 2 +- .../api/AddIAM2VirtualIDsToGroupAction.java | 2 +- ...AddIAM2VirtualIDsToOrganizationAction.java | 2 +- .../api/AddIAM2VirtualIDsToProjectAction.java | 2 +- .../AddIAM2VirtualIDsToProjectsAction.java | 2 +- .../api/AddResourceToIAM2ProjectAction.java | 2 +- .../api/AddRolesToIAM2VirtualIDAction.java | 2 +- .../AddRolesToIAM2VirtualIDGroupAction.java | 2 +- ...chIAM2ProjectToIAM2OrganizationAction.java | 2 +- ...eateIAM2VirtualIDFromConfigFileAction.java | 2 +- .../ChangeIAM2OrganizationParentAction.java | 2 +- .../ChangeIAM2OrganizationStateAction.java | 2 +- .../api/ChangeIAM2ProjectStateAction.java | 2 +- .../ChangeIAM2VirtualIDGroupStateAction.java | 2 +- .../api/ChangeIAM2VirtualIDStateAction.java | 2 +- .../api/ChangeIAM2VirtualIDTypeAction.java | 2 +- ...eckIAM2OrganizationAvailabilityAction.java | 2 +- .../CheckIAM2VirtualIDConfigFileAction.java | 2 +- .../api/CreateIAM2OrganizationAction.java | 2 +- .../sdk/iam2/api/CreateIAM2ProjectAction.java | 2 +- .../CreateIAM2ProjectFromTemplateAction.java | 2 +- .../iam2/api/CreateIAM2ProjectRoleAction.java | 2 +- .../api/CreateIAM2ProjectTemplateAction.java | 2 +- ...eIAM2ProjectTemplateFromProjectAction.java | 2 +- .../iam2/api/CreateIAM2VirtualIDAction.java | 2 +- .../api/CreateIAM2VirtualIDGroupAction.java | 2 +- .../api/DeleteIAM2OrganizationAction.java | 2 +- .../sdk/iam2/api/DeleteIAM2ProjectAction.java | 2 +- .../api/DeleteIAM2ProjectTemplateAction.java | 2 +- .../iam2/api/DeleteIAM2VirtualIDAction.java | 2 +- .../api/DeleteIAM2VirtualIDGroupAction.java | 2 +- ...IAM2ProjectFromIAM2OrganizationAction.java | 2 +- .../iam2/api/ExpungeIAM2ProjectAction.java | 2 +- ...IAM2OrganizationVirtualIDNumberAction.java | 2 +- .../api/GetIAM2ProjectsOfVirtualIDAction.java | 2 +- .../api/GetIAM2SystemAttributesAction.java | 2 +- .../GetIAM2VirtualIDAPIPermissionAction.java | 2 +- .../api/GetIAM2VirtualIDInGroupAction.java | 2 +- .../api/GetOrganizationQuotaUsageAction.java | 2 +- .../sdk/iam2/api/LoginIAM2PlatformAction.java | 2 +- .../sdk/iam2/api/LoginIAM2ProjectAction.java | 2 +- .../iam2/api/LoginIAM2VirtualIDAction.java | 2 +- .../iam2/api/QueryIAM2OrganizationAction.java | 2 +- .../QueryIAM2OrganizationAttributeAction.java | 2 +- ...QueryIAM2OrganizationProjectRefAction.java | 2 +- .../api/QueryIAM2ProjectAccountRefAction.java | 2 +- .../sdk/iam2/api/QueryIAM2ProjectAction.java | 2 +- .../api/QueryIAM2ProjectAttributeAction.java | 2 +- .../iam2/api/QueryIAM2ProjectRoleAction.java | 2 +- .../api/QueryIAM2ProjectTemplateAction.java | 2 +- .../iam2/api/QueryIAM2VirtualIDAction.java | 2 +- .../QueryIAM2VirtualIDAttributeAction.java | 2 +- .../api/QueryIAM2VirtualIDGroupAction.java | 2 +- ...ueryIAM2VirtualIDGroupAttributeAction.java | 2 +- .../iam2/api/RecoverIAM2ProjectAction.java | 2 +- ...eAttributesFromIAM2OrganizationAction.java | 2 +- ...RemoveAttributesFromIAM2ProjectAction.java | 2 +- ...moveAttributesFromIAM2VirtualIDAction.java | 2 +- ...ttributesFromIAM2VirtualIDGroupAction.java | 2 +- .../RemoveIAM2ProjectLoginExpiredAction.java | 2 +- ...eIAM2VirtualIDGroupFromProjectsAction.java | 2 +- .../RemoveIAM2VirtualIDsFromGroupAction.java | 2 +- ...eIAM2VirtualIDsFromOrganizationAction.java | 2 +- ...RemoveIAM2VirtualIDsFromProjectAction.java | 2 +- ...emoveIAM2VirtualIDsFromProjectsAction.java | 2 +- .../RemoveRolesFromIAM2VirtualIDAction.java | 2 +- ...moveRolesFromIAM2VirtualIDGroupAction.java | 2 +- .../api/SetIAM2ProjectLoginExpiredAction.java | 2 +- .../api/SetIAM2ProjectRetirePolicyAction.java | 2 +- .../api/SetOrganizationOperationAction.java | 2 +- .../api/SetOrganizationSupervisorAction.java | 2 +- .../StopAllResourcesInIAM2ProjectAction.java | 2 +- .../api/UpdateIAM2OrganizationAction.java | 2 +- ...UpdateIAM2OrganizationAttributeAction.java | 2 +- .../sdk/iam2/api/UpdateIAM2ProjectAction.java | 2 +- .../api/UpdateIAM2ProjectAttributeAction.java | 2 +- .../api/UpdateIAM2ProjectTemplateAction.java | 2 +- .../iam2/api/UpdateIAM2VirtualIDAction.java | 2 +- .../UpdateIAM2VirtualIDAttributeAction.java | 2 +- .../api/UpdateIAM2VirtualIDGroupAction.java | 2 +- ...dateIAM2VirtualIDGroupAttributeAction.java | 2 +- .../api/UpdateOrganizationQuotaAction.java | 2 +- ...ojectContainerClusterCandidatesAction.java | 2 +- ...etIAM2ProjectContainerImageTagsAction.java | 2 +- .../GetIAM2ProjectContainerImagesAction.java | 2 +- .../GetIAM2ProjectRepositoryAction.java | 2 +- .../SetIAM2ProjectContainerClusterAction.java | 2 +- .../api/AddPolicyStatementsToRoleAction.java | 2 +- .../role/api/AttachPolicyToRoleAction.java | 2 +- .../role/api/AttachRoleToAccountAction.java | 2 +- .../role/api/ChangeRoleStateAction.java | 2 +- .../identity/role/api/CreateRoleAction.java | 2 +- .../identity/role/api/DeleteRoleAction.java | 2 +- .../role/api/DetachPolicyFromRoleAction.java | 2 +- .../role/api/DetachRoleFromAccountAction.java | 2 +- .../identity/role/api/QueryRoleAction.java | 2 +- .../RemovePolicyStatementsFromRoleAction.java | 2 +- .../identity/role/api/UpdateRoleAction.java | 2 +- .../DegradeFromLicenseServerAction.java | 2 +- .../GetLicenseAuthorizedCapacityAction.java | 2 +- .../GetLicenseNodeUsageDetailsAction.java | 2 +- .../api/server/IsLicenseServerAction.java | 2 +- .../QueryLicenseAuthorizedNodeAction.java | 2 +- .../server/RegisterLicenseServerAction.java | 2 +- .../server/RequestLicenseCapacityAction.java | 2 +- .../api/server/SyncLicenseCapacityAction.java | 2 +- ...sterLicenseRequestedApplicationAction.java | 2 +- .../server/UnregisterLicenseServerAction.java | 2 +- .../server/UpgradeToLicenseServerAction.java | 2 +- .../api/server/VerifyLicenseServerAction.java | 2 +- ...hdrawLicenseCapacityApplicationAction.java | 2 +- .../sdk/sns/AddSNSSmsReceiverAction.java | 2 +- ...angeSNSApplicationEndpointStateAction.java | 2 +- ...angeSNSApplicationPlatformStateAction.java | 2 +- .../sdk/sns/ChangeSNSTopicStateAction.java | 2 +- .../zstack/sdk/sns/CreateSNSTopicAction.java | 2 +- .../DeleteSNSApplicationEndpointAction.java | 2 +- .../DeleteSNSApplicationPlatformAction.java | 2 +- .../zstack/sdk/sns/DeleteSNSTopicAction.java | 2 +- .../QuerySNSApplicationEndpointAction.java | 2 +- .../QuerySNSApplicationPlatformAction.java | 2 +- .../sdk/sns/QuerySNSSmsEndpointAction.java | 2 +- .../zstack/sdk/sns/QuerySNSTopicAction.java | 2 +- .../sns/QuerySNSTopicSubscriberAction.java | 2 +- .../sdk/sns/RemoveSNSSmsReceiverAction.java | 2 +- .../sdk/sns/SubscribeSNSTopicAction.java | 2 +- .../sdk/sns/UnsubscribeSNSTopicAction.java | 2 +- .../UpdateSNSApplicationEndpointAction.java | 2 +- .../UpdateSNSApplicationPlatformAction.java | 2 +- .../zstack/sdk/sns/UpdateSNSTopicAction.java | 2 +- .../CreateSNSAliyunSmsEndpointAction.java | 2 +- .../ValidateSNSAliyunSmsEndpointAction.java | 2 +- .../AddSNSDingTalkAtPersonAction.java | 2 +- .../CreateSNSDingTalkEndpointAction.java | 2 +- .../QuerySNSDingTalkAtPersonAction.java | 2 +- .../QuerySNSDingTalkEndpointAction.java | 2 +- .../RemoveSNSDingTalkAtPersonAction.java | 2 +- .../SNSDingTalkTestConnectionAction.java | 2 +- ...ateAtPersonOfAtDingTalkEndpointAction.java | 2 +- .../UpdateSNSDingTalkEndpointAction.java | 2 +- ...dEmailAddressToSNSEmailEndpointAction.java | 2 +- .../email/CreateSNSEmailEndpointAction.java | 2 +- .../email/CreateSNSEmailPlatformAction.java | 2 +- ...eEmailAddressOfSNSEmailEndpointAction.java | 2 +- .../email/QuerySNSEmailAddressAction.java | 2 +- .../email/QuerySNSEmailEndpointAction.java | 2 +- .../email/QuerySNSEmailPlatformAction.java | 2 +- .../email/SNSEmailTestConnectionAction.java | 2 +- ...eEmailAddressOfSNSEmailEndpointAction.java | 2 +- .../email/ValidateSNSEmailPlatformAction.java | 2 +- .../feishu/AddSNSFeiShuAtPersonAction.java | 2 +- .../feishu/CreateSNSFeiShuEndpointAction.java | 2 +- .../feishu/QuerySNSFeiShuAtPersonAction.java | 2 +- .../feishu/QuerySNSFeiShuEndpointAction.java | 2 +- .../feishu/RemoveSNSFeiShuAtPersonAction.java | 2 +- .../feishu/SNSFeiShuTestConnectionAction.java | 2 +- ...pdateAtPersonOfAtFeiShuEndpointAction.java | 2 +- .../feishu/UpdateSNSFeiShuEndpointAction.java | 2 +- .../http/CreateSNSHttpEndpointAction.java | 2 +- .../http/QuerySNSHttpEndpointAction.java | 2 +- .../http/SNSHttpTestConnectionAction.java | 2 +- .../http/UpdateSNSHttpEndpointAction.java | 2 +- ...CreateSNSMicrosoftTeamsEndpointAction.java | 2 +- .../QuerySNSMicrosoftTeamsEndpointAction.java | 2 +- ...SNSMicrosoftTeamsTestConnectionAction.java | 2 +- ...UpdateSNSMicrosoftTeamsEndpointAction.java | 2 +- .../plugin/CreateSNSPluginEndpointAction.java | 2 +- .../plugin/QuerySNSPluginEndpointAction.java | 2 +- .../snmp/CreateSNSSnmpEndpointAction.java | 2 +- .../snmp/CreateSNSSnmpPlatformAction.java | 2 +- .../snmp/QuerySNSSnmpPlatformAction.java | 2 +- .../snmp/SNSSnmpTestConnectionAction.java | 2 +- .../snmp/UpdateSNSSnmpPlatformAction.java | 2 +- .../CreateSNSUniversalSmsEndpointAction.java | 2 +- .../QuerySNSUniversalSmsEndpointAction.java | 2 +- .../UpdateSNSUniversalSmsEndpointAction.java | 2 +- ...ValidateSNSUniversalSmsEndpointAction.java | 2 +- .../wecom/AddSNSWeComAtPersonAction.java | 2 +- .../wecom/CreateSNSWeComEndpointAction.java | 2 +- .../wecom/QuerySNSWeComAtPersonAction.java | 2 +- .../wecom/QuerySNSWeComEndpointAction.java | 2 +- .../wecom/RemoveSNSWeComAtPersonAction.java | 2 +- .../wecom/SNSWeComTestConnectionAction.java | 2 +- ...UpdateAtPersonOfAtWeComEndpointAction.java | 2 +- .../wecom/UpdateSNSWeComEndpointAction.java | 2 +- ...cketTypesToTicketFlowCollectionAction.java | 2 +- ...ChangeTicketFlowCollectionStateAction.java | 2 +- .../ticket/api/ChangeTicketStatusAction.java | 2 +- .../sdk/ticket/api/CreateTicketAction.java | 2 +- .../sdk/ticket/api/DeleteTicketAction.java | 2 +- .../api/DeleteTicketFlowCollectionAction.java | 2 +- .../ticket/api/QueryArchiveTicketAction.java | 2 +- .../api/QueryArchiveTicketHistoryAction.java | 2 +- .../sdk/ticket/api/QueryTicketAction.java | 2 +- .../sdk/ticket/api/QueryTicketFlowAction.java | 2 +- .../api/QueryTicketFlowCollectionAction.java | 2 +- .../ticket/api/QueryTicketHistoryAction.java | 2 +- .../sdk/ticket/api/QueryTicketTypeAction.java | 2 +- ...etTypesFromTicketFlowCollectionAction.java | 2 +- .../ticket/api/UpdateTicketRequestAction.java | 2 +- .../iam2/api/AddIAM2TicketFlowAction.java | 2 +- .../CreateIAM2TickFlowCollectionAction.java | 2 +- .../iam2/api/DeleteIAM2TicketFlowAction.java | 2 +- .../iam2/api/UpdateIAM2TicketFlowAction.java | 2 +- .../UpdateIAM2TicketFlowCollectionAction.java | 2 +- .../sdk/zwatch/alarm/AckAlarmDataAction.java | 2 +- .../sdk/zwatch/alarm/AckEventDataAction.java | 2 +- .../zwatch/alarm/AddActionToAlarmAction.java | 2 +- .../AddActionToEventSubscriptionAction.java | 2 +- .../zwatch/alarm/AddLabelToAlarmAction.java | 2 +- .../AddLabelToEventSubscriptionAction.java | 2 +- .../zwatch/alarm/ChangeAlarmStateAction.java | 2 +- .../ChangeEventSubscriptionStateAction.java | 2 +- .../sdk/zwatch/alarm/CreateAlarmAction.java | 2 +- .../sdk/zwatch/alarm/DeleteAlarmAction.java | 2 +- .../alarm/GetTextTemplateArgAction.java | 2 +- .../sdk/zwatch/alarm/QueryAlarmAction.java | 2 +- .../zwatch/alarm/QueryAlertDataAckAction.java | 2 +- .../alarm/QueryEventSubscriptionAction.java | 2 +- .../alarm/RemoveActionFromAlarmAction.java | 2 +- ...moveActionFromEventSubscriptionAction.java | 2 +- .../alarm/RemoveLabelFromAlarmAction.java | 2 +- ...emoveLabelFromEventSubscriptionAction.java | 2 +- .../zwatch/alarm/SubscribeEventAction.java | 2 +- .../zwatch/alarm/UnsubscribeEventAction.java | 2 +- .../sdk/zwatch/alarm/UpdateAlarmAction.java | 2 +- .../zwatch/alarm/UpdateAlarmLabelAction.java | 2 +- .../alarm/UpdateAlertDataAckAction.java | 2 +- .../UpdateEventSubscriptionLabelAction.java | 2 +- .../alarm/UpdateSubscribeEventAction.java | 2 +- .../api/ChangeActiveAlarmStateAction.java | 2 +- .../api/GetActiveAlarmStatusAction.java | 2 +- .../api/QueryActiveAlarmAction.java | 2 +- .../api/QueryActiveAlarmTemplateAction.java | 2 +- .../api/UpdateActiveAlarmTemplateAction.java | 2 +- .../sns/CreateSNSTextTemplateAction.java | 2 +- .../sns/DeleteSNSTextTemplateAction.java | 2 +- .../alarm/sns/QuerySNSTextTemplateAction.java | 2 +- .../sns/UpdateSNSTextTemplateAction.java | 2 +- .../CreateAliyunSmsSNSTextTemplateAction.java | 2 +- .../QueryAliyunSmsSNSTextTemplateAction.java | 2 +- .../UpdateAliyunSmsSNSTextTemplateAction.java | 2 +- .../CreateMetricDataHttpReceiverAction.java | 2 +- .../api/CreateMetricTemplateAction.java | 2 +- .../zwatch/api/DeleteMetricDataAction.java | 2 +- .../DeleteMetricDataHttpReceiverAction.java | 2 +- .../api/DeleteMetricTemplateAction.java | 2 +- .../sdk/zwatch/api/GetAlarmDataAction.java | 2 +- .../zwatch/api/GetAllEventMetadataAction.java | 2 +- .../api/GetAllMetricMetadataAction.java | 2 +- .../sdk/zwatch/api/GetAuditDataAction.java | 2 +- .../sdk/zwatch/api/GetEventDataAction.java | 2 +- .../GetManagementNodeDirCapacityAction.java | 2 +- .../sdk/zwatch/api/GetMetricDataAction.java | 2 +- .../zwatch/api/GetMetricLabelValueAction.java | 2 +- .../GetPrometheusMetricLabelValueAction.java | 2 +- .../api/GetZWatchAlertHistogramAction.java | 2 +- .../sdk/zwatch/api/PutMetricDataAction.java | 2 +- .../zwatch/api/QueryAlarmRecordAction.java | 2 +- .../sdk/zwatch/api/QueryAuditAction.java | 2 +- .../zwatch/api/QueryEventRecordAction.java | 2 +- .../QueryMetricDataHttpReceiverAction.java | 2 +- .../zwatch/api/QueryMetricTemplateAction.java | 2 +- .../sdk/zwatch/api/UpdateAlarmDataAction.java | 2 +- .../sdk/zwatch/api/UpdateEventDataAction.java | 2 +- .../api/AddEventRuleTemplateAction.java | 2 +- .../api/AddInstanceToMonitorGroupAction.java | 2 +- .../api/AddMetricRuleTemplateAction.java | 2 +- ...lyMonitorTemplateToMonitorGroupAction.java | 2 +- .../api/CloneMonitorTemplateAction.java | 2 +- .../api/CreateMonitorGroupAction.java | 2 +- .../api/CreateMonitorTemplateAction.java | 2 +- .../api/DeleteEventRuleTemplateAction.java | 2 +- .../api/DeleteMetricRuleTemplateAction.java | 2 +- .../api/DeleteMonitorGroupAction.java | 2 +- .../api/DeleteMonitorTemplateAction.java | 2 +- .../api/QueryEventRuleTemplateAction.java | 2 +- .../api/QueryMetricRuleTemplateAction.java | 2 +- .../api/QueryMonitorGroupAction.java | 2 +- .../api/QueryMonitorGroupAlarmAction.java | 2 +- ...ryMonitorGroupEventSubscriptionAction.java | 2 +- .../api/QueryMonitorGroupInstanceAction.java | 2 +- .../QueryMonitorGroupTemplateRefAction.java | 2 +- .../api/QueryMonitorTemplateAction.java | 2 +- .../RemoveInstanceFromMonitorGroupAction.java | 2 +- ...MonitorTemplateFromMonitorGroupAction.java | 2 +- .../api/UpdateEventRuleTemplateAction.java | 2 +- .../api/UpdateMetricRuleTemplateAction.java | 2 +- .../api/UpdateMonitorGroupAction.java | 2 +- .../api/UpdateMonitorTemplateAction.java | 2 +- .../api/AddThirdpartyPlatformAction.java | 2 +- .../api/DeleteThirdpartyPlatformAction.java | 2 +- ...SEndpointThirdpartyAlertHistoryAction.java | 2 +- .../api/QueryThirdpartyAlertAction.java | 2 +- .../api/QueryThirdpartyPlatformAction.java | 2 +- .../api/UpdateThirdpartyAlertsAction.java | 2 +- .../api/UpdateThirdpartyPlatformAction.java | 2 +- .../java/org/zstack/query/BatchQuery.groovy | 16 +- .../zstack/query/MysqlQueryBuilderImpl3.java | 9 +- .../org/zstack/query/QueryFacadeImpl.java | 13 +- search/src/main/java/org/zstack/zql/ZQL.java | 3 +- .../parser/visitors/JoinClauseVisitor.java | 3 +- .../zql/ast/parser/visitors/ValueVisitor.java | 11 +- .../zql/ast/visitors/FunctionVisitor.java | 3 +- .../zql/ast/visitors/JoinClauseVisitor.java | 5 +- .../zql/ast/visitors/JoinExprVisitor.java | 5 +- .../zql/ast/visitors/plugin/SumPlugin.java | 3 +- .../org/zstack/simulator/SimulatorHost.java | 9 +- .../SimulatorSecurityGroupBackend.java | 3 +- .../primary/SimulatorPrimaryStorage.java | 3 +- .../addon/backup/ExternalBackupStorage.java | 5 +- .../backup/ExternalBackupStorageFactory.java | 5 +- .../addon/primary/ExternalPrimaryStorage.java | 13 +- .../ExternalPrimaryStorageFactory.java | 9 +- .../ExternalPrimaryStorageManagerImpl.java | 5 +- ...rnalPrimaryStorageSpaceCapacityHelper.java | 5 +- .../ExternalPrimaryStorageSpaceHelper.java | 3 +- .../backup/BackupStorageApiInterceptor.java | 11 +- .../storage/backup/BackupStorageBase.java | 29 +- .../backup/BackupStorageCapacityUpdater.java | 3 +- .../backup/BackupStorageCascadeExtension.java | 3 +- .../BackupStorageMainAllocatorFlow.java | 3 +- .../backup/BackupStorageManagerImpl.java | 9 +- ...kupStoragePrimaryStorageAllocatorFlow.java | 5 +- ...pStorageReservedCapacityAllocatorFlow.java | 3 +- ...DefaultBackupStorageAllocatorStrategy.java | 3 +- .../primary/PrimaryStorageApiInterceptor.java | 17 +- .../PrimaryStorageAvoidAllocatorFlow.java | 3 +- .../storage/primary/PrimaryStorageBase.java | 35 +- .../PrimaryStorageCapacityUpdater.java | 3 +- .../PrimaryStorageCascadeExtension.java | 3 +- .../primary/PrimaryStorageDeleteBitGC.java | 3 +- .../PrimaryStorageFeatureAllocatorFlow.java | 3 +- .../PrimaryStorageMainAllocatorFlow.java | 5 +- .../primary/PrimaryStorageManagerImpl.java | 31 +- ...yStorageReservedCapacityAllocatorFlow.java | 3 +- .../PrimaryStorageTagAllocatorExtension.java | 9 +- .../PrimaryStorageTagAllocatorFlow.java | 3 +- .../snapshot/DeleteVolumeSnapshotLongJob.java | 9 +- .../VolumeSnapshotApiInterceptor.java | 13 +- .../snapshot/VolumeSnapshotManagerImpl.java | 21 +- .../snapshot/VolumeSnapshotTreeBase.java | 21 +- .../group/VolumeSnapshotGroupBase.java | 3 +- .../VolumeSnapshotReferenceUtils.java | 3 +- .../zstack/storage/volume/AbstractVolume.java | 5 +- .../volume/DownloadIsoForVmExtension.java | 3 +- .../storage/volume/VolumeApiInterceptor.java | 93 +- .../org/zstack/storage/volume/VolumeBase.java | 15 +- .../storage/volume/VolumeManagerImpl.java | 19 +- .../org/zstack/tag/TagApiInterceptor.java | 15 +- .../java/org/zstack/tag/TagManagerImpl.java | 19 +- .../core/DistanceElaborationCase.groovy | 4 +- .../integration/core/ElaborationCase.groovy | 34 +- .../core/ElaborationMigrateVmCase.groovy | 4 +- .../core/ElaborationReconnectHostCase.groovy | 12 +- .../integration/core/ErrorCodeHashCase.groovy | 8 +- .../core/RegexElaborationCase.groovy | 30 +- .../core/cloudbus/CloudBusCase.groovy | 4 +- .../gc/EventBasedGarbageCollectorCase.groovy | 14 +- .../gc/TimeBasedGarbageCollectorCase.groovy | 8 +- .../kvm/host/BatchAddHostCase.groovy | 4 +- .../kvm/host/MaintainHostCase.groovy | 4 +- .../kvm/vm/RebootVmInstanceCase.groovy | 4 +- .../kvm/vm/VmLastHostUuidCase.groovy | 6 +- .../integration/kvm/vm/VmVolumeGCCase.groovy | 4 +- .../eip/StartFlatNetworkVmWithEipCase.groovy | 4 +- .../VirtualRouterCreateFailedCase.groovy | 4 +- .../local/datavolume/MigrateVolumeCase.groovy | 4 +- .../CreateDataVolumeFromTemplateCase.groovy | 4 +- .../test/java/org/zstack/test/ApiSender.java | 3 +- .../java/org/zstack/test/TestSafeWhile.java | 19 +- .../test/aop/ManInTheMiddleService.java | 3 +- .../test/aop/TestFutureCompletion1.java | 3 +- .../test/aop/TestFutureCompletion3.java | 3 +- .../aop/TestFutureReturnValueCompletion1.java | 3 +- .../hostallocator/HostAllocateExtension.java | 3 +- .../core/asyncbackup/TestSafeCompletion.java | 7 +- .../test/core/errorcode/TestErrorCode.java | 5 +- .../test/core/workflow/TestSimpleFlow13.java | 3 +- .../kvm/KVMPingAgentExtensionForTest.java | 3 +- .../controller/BackupStorageController.groovy | 6 +- .../PrimaryStorageController.groovy | 6 +- .../CloudOperationsErrorCode.java | 15842 ++++++++++++++++ 2483 files changed, 20859 insertions(+), 4575 deletions(-) create mode 100644 utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java diff --git a/compute/src/main/java/org/zstack/compute/VmNicUtils.java b/compute/src/main/java/org/zstack/compute/VmNicUtils.java index 6d001bdfb86..484bdfe2958 100644 --- a/compute/src/main/java/org/zstack/compute/VmNicUtils.java +++ b/compute/src/main/java/org/zstack/compute/VmNicUtils.java @@ -13,6 +13,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.header.vm.VmInstanceConstant.VM_NIC_QOS_MAX; import static org.zstack.header.vm.VmInstanceConstant.VM_NIC_QOS_MIN; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class VmNicUtils { public static void validateVmParms(List vmNicParms, List l3Uuids, List supportNicDriverTypes) { @@ -22,45 +23,45 @@ public static void validateVmParms(List vmNicParms, List l3U List l3UuidsInParms = vmNicParms.stream().map(VmNicParam::getL3NetworkUuid).distinct().collect(Collectors.toList()); if (l3UuidsInParms.size() != vmNicParms.size()) { - throw new ApiMessageInterceptionException(argerr("duplicate nic params")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_10000, "duplicate nic params")); } for (VmNicParam nic : vmNicParms) { String l3 = nic.getL3NetworkUuid(); if (StringUtils.isEmpty(l3)) { - throw new ApiMessageInterceptionException(argerr("l3NetworkUuid of vm nic can not be null")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_10001, "l3NetworkUuid of vm nic can not be null")); } if (!CollectionUtils.isEmpty(l3Uuids) && !l3Uuids.contains(nic.getL3NetworkUuid())) { - throw new ApiMessageInterceptionException(argerr("l3NetworkUuid of vm nic is not in l3[%s]", l3Uuids)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_10002, "l3NetworkUuid of vm nic is not in l3[%s]", l3Uuids)); } if (nic.getOutboundBandwidth() != null) { if (nic.getOutboundBandwidth() < VM_NIC_QOS_MIN || nic.getOutboundBandwidth() > VM_NIC_QOS_MAX) { - throw new ApiMessageInterceptionException(argerr("outbound bandwidth[%d] of vm nic is out of [8192, 32212254720]", nic.getOutboundBandwidth())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_10003, "outbound bandwidth[%d] of vm nic is out of [8192, 32212254720]", nic.getOutboundBandwidth())); } } if (nic.getInboundBandwidth() != null) { if (nic.getInboundBandwidth() < VM_NIC_QOS_MIN || nic.getInboundBandwidth() > VM_NIC_QOS_MAX) { - throw new ApiMessageInterceptionException(argerr("inbound bandwidth[%d] of vm nic is out of [8192, 32212254720]", nic.getInboundBandwidth())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_10004, "inbound bandwidth[%d] of vm nic is out of [8192, 32212254720]", nic.getInboundBandwidth())); } } if (nic.getMultiQueueNum() != null ) { if (nic.getMultiQueueNum() < 1 || nic.getMultiQueueNum() > 256) { - throw new ApiMessageInterceptionException(argerr("multi queue num[%d] of vm nic is out of [1,256]", nic.getMultiQueueNum())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_10005, "multi queue num[%d] of vm nic is out of [1,256]", nic.getMultiQueueNum())); } } if (nic.getState() != null) { if (!asList(VmNicState.enable.toString(), VmNicState.disable.toString()).contains(nic.getState())) { - throw new ApiMessageInterceptionException(argerr("vm nic of l3[uuid:%s] state[%s] is not %s or %s ", nic.getL3NetworkUuid(), nic.getState(), VmNicState.enable.toString(), VmNicState.disable.toString())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_10006, "vm nic of l3[uuid:%s] state[%s] is not %s or %s ", nic.getL3NetworkUuid(), nic.getState(), VmNicState.enable.toString(), VmNicState.disable.toString())); } } String driverType = nic.getDriverType(); if (!StringUtils.isEmpty(driverType) && !CollectionUtils.isEmpty(supportNicDriverTypes) && !supportNicDriverTypes.contains(driverType)){ - throw new ApiMessageInterceptionException(argerr("vm nic driver %s not support yet", driverType)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_10007, "vm nic driver %s not support yet", driverType)); } } } diff --git a/compute/src/main/java/org/zstack/compute/allocator/AttachedL2NetworkAllocatorFlow.java b/compute/src/main/java/org/zstack/compute/allocator/AttachedL2NetworkAllocatorFlow.java index cd986023bd1..4ff56bb51ac 100644 --- a/compute/src/main/java/org/zstack/compute/allocator/AttachedL2NetworkAllocatorFlow.java +++ b/compute/src/main/java/org/zstack/compute/allocator/AttachedL2NetworkAllocatorFlow.java @@ -21,6 +21,7 @@ import org.zstack.utils.logging.CLogger; import org.zstack.utils.Utils; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) @@ -172,7 +173,7 @@ public void allocate() { } if (candidates.isEmpty()) { - fail(Platform.operr("no host found in clusters that has attached to L2Networks which have L3Networks%s", spec.getL3NetworkUuids())); + fail(Platform.operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10027, "no host found in clusters that has attached to L2Networks which have L3Networks%s", spec.getL3NetworkUuids())); } else { next(candidates); } diff --git a/compute/src/main/java/org/zstack/compute/allocator/AttachedPrimaryStorageAllocatorFlow.java b/compute/src/main/java/org/zstack/compute/allocator/AttachedPrimaryStorageAllocatorFlow.java index a18e46a088d..743f85f04a7 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/AttachedPrimaryStorageAllocatorFlow.java +++ b/compute/src/main/java/org/zstack/compute/allocator/AttachedPrimaryStorageAllocatorFlow.java @@ -20,6 +20,7 @@ import javax.persistence.TypedQuery; import java.util.List; import java.util.Set; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class AttachedPrimaryStorageAllocatorFlow extends AbstractHostAllocatorFlow { private static final CLogger logger = Utils.getLogger(AttachedPrimaryStorageAllocatorFlow.class); @@ -76,7 +77,7 @@ public String call(VolumeInventory arg) { candidates = allocate(psuuids, vm); if (candidates.isEmpty()) { - fail(Platform.operr("no host found in clusters that have attached to primary storage %s", psuuids)); + fail(Platform.operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10014, "no host found in clusters that have attached to primary storage %s", psuuids)); } else { next(candidates); } diff --git a/compute/src/main/java/org/zstack/compute/allocator/AttachedVolumePrimaryStorageAllocatorFlow.java b/compute/src/main/java/org/zstack/compute/allocator/AttachedVolumePrimaryStorageAllocatorFlow.java index ed8ff7c9e05..e9ffde6e721 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/AttachedVolumePrimaryStorageAllocatorFlow.java +++ b/compute/src/main/java/org/zstack/compute/allocator/AttachedVolumePrimaryStorageAllocatorFlow.java @@ -19,6 +19,7 @@ import org.zstack.utils.function.Function; import java.util.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -38,7 +39,7 @@ public void allocate() { VmInstanceInventory vm = spec.getVmInstance(); if (vm.getRootVolume() == null || !VolumeStatus.Ready.toString().equals(vm.getRootVolume().getStatus())) { - fail(Platform.operr("cannot find root volume of vm[uuid:%s]", vm.getUuid())); + fail(Platform.operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10022, "cannot find root volume of vm[uuid:%s]", vm.getUuid())); } List requiredPsUuids = CollectionUtils.transformToList(vm.getAllVolumes(), new Function() { @@ -81,7 +82,7 @@ public String call(VolumeInventory arg) { } if (candidates.isEmpty()) { - fail(Platform.operr("no host found in clusters which have attached to all primary storage %s where vm[uuid:%s]'s volumes locate", + fail(Platform.operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10023, "no host found in clusters which have attached to all primary storage %s where vm[uuid:%s]'s volumes locate", requiredPsUuids, vm.getUuid())); } else { next(candidates); diff --git a/compute/src/main/java/org/zstack/compute/allocator/AvoidHostAllocatorFlow.java b/compute/src/main/java/org/zstack/compute/allocator/AvoidHostAllocatorFlow.java index e135d1d4fed..34ad9ca063d 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/AvoidHostAllocatorFlow.java +++ b/compute/src/main/java/org/zstack/compute/allocator/AvoidHostAllocatorFlow.java @@ -9,6 +9,7 @@ import org.zstack.utils.function.Function; import java.util.List; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class AvoidHostAllocatorFlow extends AbstractHostAllocatorFlow { @@ -27,7 +28,7 @@ public HostVO call(HostVO arg) { }); if (ret.isEmpty()) { - fail(Platform.operr("after rule out avoided host%s, there is no host left in candidates", spec.getAvoidHostUuids())); + fail(Platform.operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10026, "after rule out avoided host%s, there is no host left in candidates", spec.getAvoidHostUuids())); } else { next(ret); } diff --git a/compute/src/main/java/org/zstack/compute/allocator/BackupStorageSelectPrimaryStorageAllocatorFlow.java b/compute/src/main/java/org/zstack/compute/allocator/BackupStorageSelectPrimaryStorageAllocatorFlow.java index 277ef4c8503..70d748c98c9 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/BackupStorageSelectPrimaryStorageAllocatorFlow.java +++ b/compute/src/main/java/org/zstack/compute/allocator/BackupStorageSelectPrimaryStorageAllocatorFlow.java @@ -23,6 +23,7 @@ import static org.zstack.core.Platform.inerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by xing5 on 2016/8/17. @@ -59,7 +60,7 @@ public void allocate() { List possiblePrimaryStorageTypes = spec.getBackupStoragePrimaryStorageMetrics().get(type); if (possiblePrimaryStorageTypes == null) { throw new OperationFailureException(inerr( - "the image[uuid:%s] is on the backup storage[uuid:%s, type:%s] that doesn't have metrics defined" + + ORG_ZSTACK_COMPUTE_ALLOCATOR_10006, "the image[uuid:%s] is on the backup storage[uuid:%s, type:%s] that doesn't have metrics defined" + " in conf/springConfigXml/HostAllocatorManager.xml. The developer should add its primary storage metrics", spec.getImage().getUuid(), spec.getRequiredBackupStorageUuid(), type )); @@ -69,7 +70,7 @@ public void allocate() { if (result.isEmpty()) { String name = spec.getImage().getName(); throw new OperationFailureException(operr( - "The image[uuid:%s, name:%s] is on the backup storage[uuid:%s, type:%s] that requires to work with primary storage[types:%s]," + + ORG_ZSTACK_COMPUTE_ALLOCATOR_10007, "The image[uuid:%s, name:%s] is on the backup storage[uuid:%s, type:%s] that requires to work with primary storage[types:%s]," + "however, no host found suitable to work with those primary storage", spec.getImage().getUuid(), name, spec.getRequiredBackupStorageUuid(),spec.getImage().getType(), possiblePrimaryStorageTypes )); @@ -78,13 +79,13 @@ public void allocate() { result = findHostsByPrimaryStorageUuids(psUuids); if (result.isEmpty()) { throw new OperationFailureException(operr( - "The image[uuid:%s] is on the backup storage[uuid:%s, type:%s] that requires to work with primary storage[uuids:%s]," + + ORG_ZSTACK_COMPUTE_ALLOCATOR_10008, "The image[uuid:%s] is on the backup storage[uuid:%s, type:%s] that requires to work with primary storage[uuids:%s]," + "however, no host found suitable to work with those primary storage", spec.getImage().getUuid(), spec.getRequiredBackupStorageUuid(), type, psUuids) ); } } else { - throw new OperationFailureException(operr("the backup storage[uuid:%s, type:%s] requires bound" + + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10009, "the backup storage[uuid:%s, type:%s] requires bound" + " primary storage, however, the primary storage has not been added", spec.getRequiredBackupStorageUuid(), bsType)); } diff --git a/compute/src/main/java/org/zstack/compute/allocator/DesignatedHostAllocatorFlow.java b/compute/src/main/java/org/zstack/compute/allocator/DesignatedHostAllocatorFlow.java index 869f09b81c0..72386b3dd3e 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/DesignatedHostAllocatorFlow.java +++ b/compute/src/main/java/org/zstack/compute/allocator/DesignatedHostAllocatorFlow.java @@ -18,6 +18,7 @@ import javax.persistence.TypedQuery; import java.util.ArrayList; import java.util.List; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class DesignatedHostAllocatorFlow extends AbstractHostAllocatorFlow { private static final CLogger logger = Utils.getLogger(DesignatedHostAllocatorFlow.class); @@ -105,7 +106,7 @@ public void allocate() { if (spec.getHypervisorType() != null) { args.append(String.format("hypervisorType=%s", spec.getHypervisorType())).append(" "); } - fail(Platform.operr("No host with %s found", args)); + fail(Platform.operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10036, "No host with %s found", args)); } else { next(candidates); } diff --git a/compute/src/main/java/org/zstack/compute/allocator/FilterFlow.java b/compute/src/main/java/org/zstack/compute/allocator/FilterFlow.java index 9aae0ea18f8..18c450bd3b5 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/FilterFlow.java +++ b/compute/src/main/java/org/zstack/compute/allocator/FilterFlow.java @@ -8,6 +8,7 @@ import org.zstack.header.errorcode.OperationFailureException; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 7/2/2015. @@ -33,7 +34,7 @@ public void allocate() { logger.debug(String.format("after being filtered by HostAllocatorFilterExtensionPoint[%s], candidates num: %s", filter.getClass(), candidates.size())); if (candidates.isEmpty()) { - fail(Platform.operr("after filtering, HostAllocatorFilterExtensionPoint[%s] returns zero candidate host, it means: %s", filter.getClass().getSimpleName(), filter.filterErrorReason())); + fail(Platform.operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10037, "after filtering, HostAllocatorFilterExtensionPoint[%s] returns zero candidate host, it means: %s", filter.getClass().getSimpleName(), filter.filterErrorReason())); } } diff --git a/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorApiInterceptor.java b/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorApiInterceptor.java index f6bb3372c32..78b020e09b6 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorApiInterceptor.java +++ b/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorApiInterceptor.java @@ -20,6 +20,7 @@ import static org.zstack.core.Platform.argerr; import java.util.List; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -54,7 +55,7 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti private void validate(APIGetCandidateBackupStorageForCreatingImageMsg msg) { if (msg.getVolumeSnapshotUuid() == null && msg.getVolumeUuid() == null) { throw new ApiMessageInterceptionException(argerr( - "either volumeUuid or volumeSnapshotUuid must be set" + ORG_ZSTACK_COMPUTE_ALLOCATOR_10024, "either volumeUuid or volumeSnapshotUuid must be set" )); } } @@ -72,7 +73,7 @@ private void validate(APIGetCpuMemoryCapacityMsg msg) { } if (!pass && !msg.isAll()) { - throw new ApiMessageInterceptionException(argerr("zoneUuids, clusterUuids, hostUuids must at least have one be none-empty list, or all is set to true")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10025, "zoneUuids, clusterUuids, hostUuids must at least have one be none-empty list, or all is set to true")); } if (msg.isAll() && (msg.getZoneUuids() == null || msg.getZoneUuids().isEmpty())) { diff --git a/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorChain.java b/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorChain.java index a334126224b..2262251d02e 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorChain.java +++ b/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorChain.java @@ -26,6 +26,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.core.Platform.inerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -101,10 +102,10 @@ private void done() { // in case a wrong flow returns an empty result set if (result.isEmpty()) { if (isDryRun) { - dryRunCompletion.fail(err(HostAllocatorError.NO_AVAILABLE_HOST, + dryRunCompletion.fail(err(ORG_ZSTACK_COMPUTE_ALLOCATOR_10017, HostAllocatorError.NO_AVAILABLE_HOST, "host allocation flow doesn't indicate any details")); } else { - completion.fail(err(HostAllocatorError.NO_AVAILABLE_HOST, + completion.fail(err(ORG_ZSTACK_COMPUTE_ALLOCATOR_10018, HostAllocatorError.NO_AVAILABLE_HOST, "host allocation flow doesn't indicate any details")); } return; @@ -145,7 +146,7 @@ private void runFlow(AbstractHostAllocatorFlow flow) { } } catch (Throwable t) { logger.warn("unhandled throwable", t); - completion.fail(inerr(t.toString())); + completion.fail(inerr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10019, t.toString())); } } @@ -228,7 +229,7 @@ public void fail(ErrorCode errorCode) { lastFlow.getClass().getName(), errorCode.getDetails())); this.errorCode = errorCode; } else { - this.errorCode = err(HostAllocatorError.NO_AVAILABLE_HOST, seriesErrorWhenPagination.iterator().next(), "unable to allocate hosts; due to pagination is enabled, " + + this.errorCode = err(ORG_ZSTACK_COMPUTE_ALLOCATOR_10020, HostAllocatorError.NO_AVAILABLE_HOST, seriesErrorWhenPagination.iterator().next(), "unable to allocate hosts; due to pagination is enabled, " + "there might be several allocation failures happened before;" + " the error list is %s", seriesErrorWhenPagination.stream().map(ErrorCode::getDetails).collect(Collectors.toList())); logger.debug(this.errorCode.getDetails()); diff --git a/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorManagerImpl.java b/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorManagerImpl.java index 1eebdea0f97..48544a68333 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorManagerImpl.java @@ -53,6 +53,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class HostAllocatorManagerImpl extends AbstractService implements HostAllocatorManager, VmAbnormalLifeCycleExtensionPoint { private static final CLogger logger = Utils.getLogger(HostAllocatorManagerImpl.class); @@ -956,7 +957,7 @@ public void run() { trigger.next(); } catch (UnableToReserveHostCapacityException e) { - trigger.fail(operr(e.getMessage())); + trigger.fail(operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10012, e.getMessage())); } } @@ -979,7 +980,7 @@ public void run() { trigger.next(); } catch (UnableToReserveHostCapacityException e) { - trigger.fail(operr(e.getMessage())); + trigger.fail(operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10013, e.getMessage())); } } diff --git a/compute/src/main/java/org/zstack/compute/allocator/HostCapacityAllocatorFlow.java b/compute/src/main/java/org/zstack/compute/allocator/HostCapacityAllocatorFlow.java index 906901b20eb..dce335e7efd 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/HostCapacityAllocatorFlow.java +++ b/compute/src/main/java/org/zstack/compute/allocator/HostCapacityAllocatorFlow.java @@ -14,6 +14,7 @@ import java.util.List; import java.util.stream.Collectors; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class HostCapacityAllocatorFlow extends AbstractHostAllocatorFlow { @@ -62,7 +63,7 @@ public void allocate() { ret = reserveMgr.filterOutHostsByReservedCapacity(ret, spec.getCpuCapacity(), spec.getMemoryCapacity()); if (ret.isEmpty()) { - fail(Platform.operr("no host having cpu[%s], memory[%s bytes] found", + fail(Platform.operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10021, "no host having cpu[%s], memory[%s bytes] found", spec.getCpuCapacity(), spec.getMemoryCapacity())); } else { next(ret); diff --git a/compute/src/main/java/org/zstack/compute/allocator/HostOsVersionAllocatorFlow.java b/compute/src/main/java/org/zstack/compute/allocator/HostOsVersionAllocatorFlow.java index 30ac288c8dd..41fc0c0b3af 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/HostOsVersionAllocatorFlow.java +++ b/compute/src/main/java/org/zstack/compute/allocator/HostOsVersionAllocatorFlow.java @@ -20,6 +20,7 @@ import java.util.stream.Collectors; import static org.zstack.utils.CollectionUtils.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Filter out hosts that do not match the operating system of the specific host @@ -69,7 +70,7 @@ public void allocate() { .collect(Collectors.toList()); if (matchedHosts.isEmpty()) { - fail(Platform.operr("no candidate host has version[%s]", currentHostOs)); + fail(Platform.operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10000, "no candidate host has version[%s]", currentHostOs)); } else { next(matchedHosts); } diff --git a/compute/src/main/java/org/zstack/compute/allocator/HostPrimaryStorageAllocatorFlow.java b/compute/src/main/java/org/zstack/compute/allocator/HostPrimaryStorageAllocatorFlow.java index b2ace6d403b..c229cde82ad 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/HostPrimaryStorageAllocatorFlow.java +++ b/compute/src/main/java/org/zstack/compute/allocator/HostPrimaryStorageAllocatorFlow.java @@ -22,6 +22,7 @@ import javax.persistence.TypedQuery; import java.util.*; import java.util.stream.Collectors; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class HostPrimaryStorageAllocatorFlow extends AbstractHostAllocatorFlow { @@ -283,11 +284,11 @@ public void allocate() { if (candidates.isEmpty()) { if (spec.getVmOperation().equals(VmOperation.NewCreate.toString())) { - fail(Platform.operr("cannot find available primary storage[state: %s, status: %s, available capacity %s bytes]." + + fail(Platform.operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10015, "cannot find available primary storage[state: %s, status: %s, available capacity %s bytes]." + " Check the state/status of primary storage and make sure they have been attached to clusters", PrimaryStorageState.Enabled, PrimaryStorageStatus.Connected, spec.getDiskSize())); } else { - fail(Platform.operr("cannot find available primary storage[state: %s or %s, status: %s]." + + fail(Platform.operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10016, "cannot find available primary storage[state: %s or %s, status: %s]." + " Check the state/status of primary storage and make sure they have been attached to clusters", PrimaryStorageState.Enabled, PrimaryStorageState.Disabled, PrimaryStorageStatus.Connected)); } diff --git a/compute/src/main/java/org/zstack/compute/allocator/HostSortorChain.java b/compute/src/main/java/org/zstack/compute/allocator/HostSortorChain.java index cbffe137617..28c36ff5d51 100644 --- a/compute/src/main/java/org/zstack/compute/allocator/HostSortorChain.java +++ b/compute/src/main/java/org/zstack/compute/allocator/HostSortorChain.java @@ -27,6 +27,7 @@ import java.util.concurrent.atomic.AtomicReference; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by mingjian.deng on 2017/11/6. @@ -133,7 +134,7 @@ public void run(FlowTrigger trigger, Map data) { logger.debug(String.format("[Host Allocation]: %s on host[uuid:%s]. try next one", e.getMessage(), host.getUuid()), e); trigger.fail(operr( - "[Host Allocation]: %s on host[uuid:%s]. try next one. %s", e.getMessage(), host.getUuid(), e.getMessage())); + ORG_ZSTACK_COMPUTE_ALLOCATOR_10034, "[Host Allocation]: %s on host[uuid:%s]. try next one. %s", e.getMessage(), host.getUuid(), e.getMessage())); } } @@ -198,7 +199,7 @@ public void done(ErrorCodeList errorCodeList) { if (!errorCodeList.getCauses().isEmpty()) { completion.fail(errorCodeList.getCauses().get(0)); } else { - completion.fail(operr("failed to reserve host capacity for all candidate hosts")); + completion.fail(operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10035, "failed to reserve host capacity for all candidate hosts")); } return; } diff --git a/compute/src/main/java/org/zstack/compute/allocator/HostStateAndHypervisorAllocatorFlow.java b/compute/src/main/java/org/zstack/compute/allocator/HostStateAndHypervisorAllocatorFlow.java index 2eac9c8abd8..7d3e680a5c9 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/HostStateAndHypervisorAllocatorFlow.java +++ b/compute/src/main/java/org/zstack/compute/allocator/HostStateAndHypervisorAllocatorFlow.java @@ -20,6 +20,7 @@ import java.util.List; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class HostStateAndHypervisorAllocatorFlow extends AbstractHostAllocatorFlow { @@ -81,23 +82,23 @@ public void allocate() { if (ret.isEmpty()) { if (CollectionUtils.isEmpty(candidates)) { - fail(operr("no host having state=Enabled status=Connected hypervisorType=%s found", + fail(operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10028, "no host having state=Enabled status=Connected hypervisorType=%s found", spec.getHypervisorType())); return; } ErrorCode error; if (isNoConnectedHost()) { - error = operr("no Connected hosts found in the [%s] candidate hosts", candidates.size()); + error = operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10029, "no Connected hosts found in the [%s] candidate hosts", candidates.size()); } else if (isNoEnabledHost()) { - error = operr("no Enabled hosts found in the [%s] candidate hosts", candidates.size()); + error = operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10030, "no Enabled hosts found in the [%s] candidate hosts", candidates.size()); } else if (isNoHypervisor(spec.getHypervisorType())) { - error = operr("no Enabled hosts found in the [%s] candidate hosts having the hypervisor type [%s]", candidates.size(), spec.getHypervisorType()); + error = operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10031, "no Enabled hosts found in the [%s] candidate hosts having the hypervisor type [%s]", candidates.size(), spec.getHypervisorType()); } else { if (spec.getHypervisorType() != null) { - error = operr("no host having state=Enabled status=Connected hypervisorType=%s found", spec.getHypervisorType()); + error = operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10032, "no host having state=Enabled status=Connected hypervisorType=%s found", spec.getHypervisorType()); } else { - error = operr("no host having state=Enabled status=Connected found"); + error = operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10033, "no host having state=Enabled status=Connected found"); } } diff --git a/compute/src/main/java/org/zstack/compute/allocator/ImageBackupStorageAllocatorFlow.java b/compute/src/main/java/org/zstack/compute/allocator/ImageBackupStorageAllocatorFlow.java index cdad3fe03ee..0bdf96f01de 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/ImageBackupStorageAllocatorFlow.java +++ b/compute/src/main/java/org/zstack/compute/allocator/ImageBackupStorageAllocatorFlow.java @@ -33,6 +33,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -108,7 +109,7 @@ public String call(ImageBackupStorageRefInventory arg) { if (bsUuids.isEmpty()) { throw new OperationFailureException(operr( - "the image[uuid:%s, name:%s] is deleted on all backup storage", spec.getImage().getUuid(), spec.getImage().getName() + ORG_ZSTACK_COMPUTE_ALLOCATOR_10001, "the image[uuid:%s, name:%s] is deleted on all backup storage", spec.getImage().getUuid(), spec.getImage().getName() )); } @@ -119,7 +120,7 @@ public String call(ImageBackupStorageRefInventory arg) { bsUuids = bq.listValue(); if (bsUuids.isEmpty()) { // we stop allocation on purpose, to prevent further pagination proceeding - throw new OperationFailureException(err(HostAllocatorError.NO_AVAILABLE_HOST, + throw new OperationFailureException(err(ORG_ZSTACK_COMPUTE_ALLOCATOR_10002, HostAllocatorError.NO_AVAILABLE_HOST, "all backup storage that image[uuid:%s] is on can not satisfy conditions[status = %s]", spec.getImage().getUuid(), BackupStorageStatus.Connected.toString() )); @@ -141,7 +142,7 @@ public HostVO call(HostVO arg) { }); if (candidates.isEmpty()) { - fail(Platform.operr("no host found in zones[uuids:%s] that attaches to backup storage where image[%s] is on", zoneUuids, spec.getImage().getUuid())); + fail(Platform.operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10003, "no host found in zones[uuids:%s] that attaches to backup storage where image[%s] is on", zoneUuids, spec.getImage().getUuid())); } else { next(candidates); } diff --git a/compute/src/main/java/org/zstack/compute/allocator/ResourceBindingAllocatorFlow.java b/compute/src/main/java/org/zstack/compute/allocator/ResourceBindingAllocatorFlow.java index 5cb565683f4..596ecd20e04 100644 --- a/compute/src/main/java/org/zstack/compute/allocator/ResourceBindingAllocatorFlow.java +++ b/compute/src/main/java/org/zstack/compute/allocator/ResourceBindingAllocatorFlow.java @@ -18,6 +18,7 @@ import java.util.*; import java.util.stream.Collectors; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * @ Author : yh.w @@ -113,7 +114,7 @@ public void allocate() { for (Map.Entry> entry : resources.entrySet()) { ResourceBindingCollector collector = collectors.get(entry.getKey()); if (collector == null) { - fail(Platform.operr("resource binding not support type %s yet", entry.getKey())); + fail(Platform.operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10004, "resource binding not support type %s yet", entry.getKey())); return; } availableHost.addAll(collector.collect(entry.getValue())); @@ -132,7 +133,7 @@ public void allocate() { .equals(ResourceBindingStrategy.Soft.toString())) { next(candidates); } else { - fail(Platform.operr("no available host found with binded resource %s", resources)); + fail(Platform.operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10005, "no available host found with binded resource %s", resources)); } } } diff --git a/compute/src/main/java/org/zstack/compute/allocator/TagAllocatorFlow.java b/compute/src/main/java/org/zstack/compute/allocator/TagAllocatorFlow.java index 776bfd0ae1e..0d046d2cc7e 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/TagAllocatorFlow.java +++ b/compute/src/main/java/org/zstack/compute/allocator/TagAllocatorFlow.java @@ -24,6 +24,7 @@ import org.zstack.utils.logging.CLogger; import java.util.List; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -65,7 +66,7 @@ public void allocate() { tmp = ret; if (tmp.isEmpty()) { - fail(Platform.operr("InstanceOfferingTagAllocatorExtensionPoint[%s] return zero candidate host", extp.getClass().getName())); + fail(Platform.operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10010, "InstanceOfferingTagAllocatorExtensionPoint[%s] return zero candidate host", extp.getClass().getName())); return; } else { logger.debug(String.format("[Host Allocation]: InstanceOfferingTagAllocatorExtensionPoint[%s] successfully found %s candidate hosts for vm[uuid:%s, name:%s]", @@ -101,7 +102,7 @@ public String call(DiskOfferingInventory arg) { tmp = ret; if (tmp.isEmpty()) { - fail(Platform.operr("DiskOfferingTagAllocatorExtensionPoint[%s] return zero candidate host", extp.getClass().getName())); + fail(Platform.operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10011, "DiskOfferingTagAllocatorExtensionPoint[%s] return zero candidate host", extp.getClass().getName())); return; } else { logger.debug(String.format("[Host Allocation]: DiskOfferingTagAllocatorExtensionPoint[%s] successfully found %s candidate hosts for vm[uuid:%s, name:%s]", diff --git a/compute/src/main/java/org/zstack/compute/cluster/ClusterApiInterceptor.java b/compute/src/main/java/org/zstack/compute/cluster/ClusterApiInterceptor.java index e835cdaf27a..5c6209a2cc8 100755 --- a/compute/src/main/java/org/zstack/compute/cluster/ClusterApiInterceptor.java +++ b/compute/src/main/java/org/zstack/compute/cluster/ClusterApiInterceptor.java @@ -14,6 +14,7 @@ import org.zstack.header.host.HostVO; import org.zstack.header.host.HostVO_; import org.zstack.header.message.APIMessage; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -53,7 +54,7 @@ private void validate(APICreateClusterMsg msg) { if ((msg.getType() != null && msg.getType().equals("baremetal") && !msg.getHypervisorType().equals("baremetal")) || (msg.getHypervisorType().equals("baremetal") && msg.getType() != null && !msg.getType().equals("baremetal"))) { throw new ApiMessageInterceptionException(Platform.argerr( - "if cluster type is baremetal, then hypervisorType must be baremetal too, or vice versa" + ORG_ZSTACK_COMPUTE_CLUSTER_10005, "if cluster type is baremetal, then hypervisorType must be baremetal too, or vice versa" )); } } @@ -69,7 +70,7 @@ protected void scripts() { .findValue(); if (type != null && !type.equals("KVM")) { throw new ApiMessageInterceptionException(Platform.argerr( - "only kvm hosts' operating system can be updated, for now" + ORG_ZSTACK_COMPUTE_CLUSTER_10006, "only kvm hosts' operating system can be updated, for now" )); } @@ -79,7 +80,7 @@ protected void scripts() { .eq(HostVO_.uuid, msg.getHostUuid()) .isExists()) { throw new ApiMessageInterceptionException(Platform.argerr( - "The host[uuid: %s] is not part of the cluster[uuid: %s]. Please verify the host uuid and ensure it belongs to this cluster.", + ORG_ZSTACK_COMPUTE_CLUSTER_10007, "The host[uuid: %s] is not part of the cluster[uuid: %s]. Please verify the host uuid and ensure it belongs to this cluster.", msg.getHostUuid(), msg.getUuid() )); @@ -92,7 +93,7 @@ protected void scripts() { .count(); if (premaintain != 0) { throw new ApiMessageInterceptionException(Platform.argerr( - "there are hosts in cluster[uuid:%s] in the PreMaintenance state, cannot update cluster os right now", + ORG_ZSTACK_COMPUTE_CLUSTER_10008, "there are hosts in cluster[uuid:%s] in the PreMaintenance state, cannot update cluster os right now", msg.getUuid() )); } @@ -104,7 +105,7 @@ protected void scripts() { .count(); if (notConnected != 0) { throw new ApiMessageInterceptionException(Platform.argerr( - "not all hosts in cluster[uuid:%s] are in the Connected status, cannot update cluster os right now", + ORG_ZSTACK_COMPUTE_CLUSTER_10009, "not all hosts in cluster[uuid:%s] are in the Connected status, cannot update cluster os right now", msg.getUuid() )); } diff --git a/compute/src/main/java/org/zstack/compute/cluster/ClusterBase.java b/compute/src/main/java/org/zstack/compute/cluster/ClusterBase.java index 5d3da5d0ab6..59becb09e23 100755 --- a/compute/src/main/java/org/zstack/compute/cluster/ClusterBase.java +++ b/compute/src/main/java/org/zstack/compute/cluster/ClusterBase.java @@ -55,6 +55,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.header.Constants.THREAD_CONTEXT_API; import static org.zstack.header.Constants.THREAD_CONTEXT_TASK_NAME; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class ClusterBase extends AbstractCluster { @@ -238,7 +239,7 @@ public void handle(Map data) { }).error(new FlowErrorHandler(msg) { @Override public void handle(ErrorCode errCode, Map data) { - evt.setError(err(SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); + evt.setError(err(ORG_ZSTACK_COMPUTE_CLUSTER_10002, SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); bus.publish(evt); } }).start(); @@ -250,7 +251,7 @@ protected void changeStateByApiMsg(APIChangeClusterStateMsg msg) { try { extpEmitter.preChange(self, stateEvent); } catch (ClusterException e) { - evt.setError(err(SysErrors.CHANGE_RESOURCE_STATE_ERROR, e.getMessage())); + evt.setError(err(ORG_ZSTACK_COMPUTE_CLUSTER_10003, SysErrors.CHANGE_RESOURCE_STATE_ERROR, e.getMessage())); bus.publish(evt); return; } diff --git a/compute/src/main/java/org/zstack/compute/cluster/ClusterCascadeExtension.java b/compute/src/main/java/org/zstack/compute/cluster/ClusterCascadeExtension.java index 27604f08e37..b994678181e 100755 --- a/compute/src/main/java/org/zstack/compute/cluster/ClusterCascadeExtension.java +++ b/compute/src/main/java/org/zstack/compute/cluster/ClusterCascadeExtension.java @@ -22,6 +22,7 @@ import java.util.List; import static org.zstack.core.Platform.inerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -117,7 +118,7 @@ private void handleDeletionCheck(CascadeAction action, Completion completion) { completion.success(); } catch (ClusterException e) { - completion.fail(inerr(e.getMessage())); + completion.fail(inerr(ORG_ZSTACK_COMPUTE_CLUSTER_10004, e.getMessage())); } } diff --git a/compute/src/main/java/org/zstack/compute/cluster/ClusterExtensionPointEmitter.java b/compute/src/main/java/org/zstack/compute/cluster/ClusterExtensionPointEmitter.java index 7f975ac3e97..0492a66741f 100755 --- a/compute/src/main/java/org/zstack/compute/cluster/ClusterExtensionPointEmitter.java +++ b/compute/src/main/java/org/zstack/compute/cluster/ClusterExtensionPointEmitter.java @@ -13,6 +13,7 @@ import java.util.List; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; class ClusterExtensionPointEmitter implements Component { private static final CLogger logger = Utils.getLogger(ClusterExtensionPointEmitter.class); @@ -108,7 +109,7 @@ ErrorCode preUpdateOS(UpdateClusterOSStruct updateClusterOSStruct) { for (ClusterUpdateOSExtensionPoint ext : updateOSExts) { String error = ext.preUpdateClusterOS(updateClusterOSStruct); if (error != null) { - return operr(error); + return operr(ORG_ZSTACK_COMPUTE_CLUSTER_10010, error); } } return null; diff --git a/compute/src/main/java/org/zstack/compute/host/HostApiInterceptor.java b/compute/src/main/java/org/zstack/compute/host/HostApiInterceptor.java index cc21cfb257a..0bbbe166d1c 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostApiInterceptor.java +++ b/compute/src/main/java/org/zstack/compute/host/HostApiInterceptor.java @@ -19,6 +19,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -69,20 +70,20 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti private void validate(APIDeleteHostNetworkServiceTypeMsg msg) { if (Q.New(HostNetworkLabelVO.class).eq(HostNetworkLabelVO_.uuid, msg.getUuid()) .eq(HostNetworkLabelVO_.system, Boolean.TRUE).isExists()) { - throw new ApiMessageInterceptionException(argerr("system host network service type[%s] cannot be deleted", msg.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_HOST_10108, "system host network service type[%s] cannot be deleted", msg.getUuid())); } } private void validate(APIUpdateHostNetworkServiceTypeMsg msg) { if (Q.New(HostNetworkLabelVO.class).eq(HostNetworkLabelVO_.uuid, msg.getUuid()) .eq(HostNetworkLabelVO_.system, Boolean.TRUE).isExists()) { - throw new ApiMessageInterceptionException(argerr("system host network service type[%s] cannot be updated", msg.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_HOST_10109, "system host network service type[%s] cannot be updated", msg.getUuid())); } } private void validate(APICreateHostNetworkServiceTypeMsg msg) { if (Q.New(HostNetworkLabelVO.class).eq(HostNetworkLabelVO_.serviceType, msg.getServiceType()).isExists()) { - throw new ApiMessageInterceptionException(argerr("there has been a host network service type[%s]", msg.getServiceType())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_HOST_10110, "there has been a host network service type[%s]", msg.getServiceType())); } } @@ -97,7 +98,7 @@ private void validate(APIGetHostWebSshUrlMsg msg) { ret.setRetCode(0); } if (!ret.isReturnCode(0)) { - throw new ApiMessageInterceptionException(operr("webssh server is not running.")); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_HOST_10111, "webssh server is not running.")); } } @@ -114,14 +115,14 @@ private void validate(APIUpdateHostMsg msg) { SimpleQuery q = dbf.createQuery(HostVO.class); q.add(HostVO_.managementIp, Op.EQ, msg.getManagementIp()); if (q.isExists()) { - throw new ApiMessageInterceptionException(argerr("there has been a host having managementIp[%s]", msg.getManagementIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_HOST_10112, "there has been a host having managementIp[%s]", msg.getManagementIp())); } } } private void validate(APIAddHostMsg msg) { if (!NetworkUtils.isIpv4Address(msg.getManagementIp()) && !NetworkUtils.isHostname(msg.getManagementIp())) { - throw new ApiMessageInterceptionException(argerr("managementIp[%s] is neither an IPv4 address nor a valid hostname", msg.getManagementIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_HOST_10113, "managementIp[%s] is neither an IPv4 address nor a valid hostname", msg.getManagementIp())); } } @@ -131,7 +132,7 @@ private void validate(APIChangeHostStateMsg msg){ .eq(HostVO_.uuid,msg.getHostUuid()) .findValue(); if (hostStatus != HostStatus.Connected && msg.getStateEvent().equals(HostStateEvent.maintain.toString())){ - throw new ApiMessageInterceptionException(operr("can not maintain host[uuid:%s, status:%s]which is not Connected", msg.getHostUuid(), hostStatus)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_HOST_10114, "can not maintain host[uuid:%s, status:%s]which is not Connected", msg.getHostUuid(), hostStatus)); } } } diff --git a/compute/src/main/java/org/zstack/compute/host/HostBase.java b/compute/src/main/java/org/zstack/compute/host/HostBase.java index 2d2d3ed64ce..38eb654804f 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostBase.java +++ b/compute/src/main/java/org/zstack/compute/host/HostBase.java @@ -59,6 +59,7 @@ import static org.zstack.core.Platform.*; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public abstract class HostBase extends AbstractHost { @@ -150,14 +151,14 @@ public String getId() { protected void checkStatus() { if (HostStatus.Connected != self.getStatus()) { - ErrorCode cause = err(HostErrors.HOST_IS_DISCONNECTED, "host[uuid:%s, name:%s] is in status[%s], cannot perform required operation", self.getUuid(), self.getName(), self.getStatus()); - throw new OperationFailureException(err(HostErrors.OPERATION_FAILURE_GC_ELIGIBLE, cause, "unable to do the operation because the host is in status of Disconnected")); + ErrorCode cause = err(ORG_ZSTACK_COMPUTE_HOST_10116, HostErrors.HOST_IS_DISCONNECTED, "host[uuid:%s, name:%s] is in status[%s], cannot perform required operation", self.getUuid(), self.getName(), self.getStatus()); + throw new OperationFailureException(err(ORG_ZSTACK_COMPUTE_HOST_10117, HostErrors.OPERATION_FAILURE_GC_ELIGIBLE, cause, "unable to do the operation because the host is in status of Disconnected")); } } protected void checkState() { if (HostState.PreMaintenance == self.getState() || HostState.Maintenance == self.getState()) { - throw new OperationFailureException(operr("host[uuid:%s, name:%s] is in state[%s], cannot perform required operation", self.getUuid(), self.getName(), self.getState())); + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_HOST_10118, "host[uuid:%s, name:%s] is in state[%s], cannot perform required operation", self.getUuid(), self.getName(), self.getState())); } } @@ -287,7 +288,7 @@ private void handle(APIUpdateHostIpmiMsg msg) { HostIpmiVO ipmi = dbf.findByUuid(msg.getHostUuid(), HostIpmiVO.class); if (null == ipmi.getIpmiAddress()) { event.setSuccess(false); - event.setError(operr("host[%s] does not have ipmi device or ipmi does not have address." + + event.setError(operr(ORG_ZSTACK_COMPUTE_HOST_10119, "host[%s] does not have ipmi device or ipmi does not have address." + "After config ipmi address, please reconnect host to refresh " + "host ipmi information", msg.getHostUuid())); bus.publish(event); @@ -453,7 +454,7 @@ public void run(MessageReply reply) { public void done(ErrorCodeList errorCodeList) { if (!vmFailedToMigrate.isEmpty()) { if (HostMaintenancePolicyManager.HostMaintenancePolicy.JustMigrate.equals(hostMaintenancePolicyMgr.getHostMaintenancePolicy(self.getUuid()))) { - trigger.fail(operr("failed to migrate vm[uuids:%s] on host[uuid:%s, name:%s, ip:%s], will try stopping it.", + trigger.fail(operr(ORG_ZSTACK_COMPUTE_HOST_10120, "failed to migrate vm[uuids:%s] on host[uuid:%s, name:%s, ip:%s], will try stopping it.", vmFailedToMigrate.keySet(), self.getUuid(), self.getName(), self.getManagementIp())); return; } @@ -596,7 +597,7 @@ private void handle(final APIReconnectHostMsg msg) { public void run(MessageReply reply) { APIReconnectHostEvent evt = new APIReconnectHostEvent(msg.getId()); if (!reply.isSuccess()) { - evt.setError(err(HostErrors.UNABLE_TO_RECONNECT_HOST, reply.getError(), reply.getError().getDetails())); + evt.setError(err(ORG_ZSTACK_COMPUTE_HOST_10121, HostErrors.UNABLE_TO_RECONNECT_HOST, reply.getError(), reply.getError().getDetails())); logger.debug(String.format("failed to reconnect host[uuid:%s] because %s", self.getUuid(), reply.getError())); } else { self = dbf.reload(self); @@ -714,7 +715,7 @@ public void fail(ErrorCode errorCode) { }).error(new FlowErrorHandler(msg) { @Override public void handle(ErrorCode errCode, Map data) { - evt.setError(err(SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); + evt.setError(err(ORG_ZSTACK_COMPUTE_HOST_10122, SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); bus.publish(evt); } }).start(); @@ -752,7 +753,7 @@ protected void handle(final APIChangeHostStateMsg msg) { try { extpEmitter.preChange(self, stateEvent); } catch (HostException he) { - evt.setError(err(SysErrors.CHANGE_RESOURCE_STATE_ERROR, he.getMessage())); + evt.setError(err(ORG_ZSTACK_COMPUTE_HOST_10123, SysErrors.CHANGE_RESOURCE_STATE_ERROR, he.getMessage())); bus.publish(evt); return; } @@ -884,7 +885,7 @@ private void handle(final ScanVmPortMsg msg) { private void doPingHost(final PingHostMsg msg, ReturnValueCompletion completion) { final PingHostReply reply = new PingHostReply(); if (self.getStatus() == HostStatus.Connecting) { - completion.fail(operr("host is connecting, ping failed")); + completion.fail(operr(ORG_ZSTACK_COMPUTE_HOST_10124, "host is connecting, ping failed")); return; } @@ -1071,7 +1072,7 @@ public void run(MessageReply reply) { if (reply.isSuccess()) { logger.debug(String.format("Successfully reconnect host[uuid:%s]", self.getUuid())); } else { - r.setError(err(HostErrors.UNABLE_TO_RECONNECT_HOST, reply.getError(), reply.getError().getDetails())); + r.setError(err(ORG_ZSTACK_COMPUTE_HOST_10125, HostErrors.UNABLE_TO_RECONNECT_HOST, reply.getError(), reply.getError().getDetails())); logger.debug(String.format("Failed to reconnect host[uuid:%s] because %s", self.getUuid(), reply.getError())); } @@ -1151,7 +1152,7 @@ private void reestablishConnection() { try { extpEmitter.connectionReestablished(HypervisorType.valueOf(self.getHypervisorType()), getSelfInventory()); } catch (HostException e) { - throw new OperationFailureException(operr(e.getMessage())); + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_HOST_10126, e.getMessage())); } } @@ -1510,7 +1511,7 @@ public void fail(ErrorCode errorCode) { HostStateEvent rollbackEvent = dbf.reload(self).getState().getTargetStateDrivenEvent(originState); DebugUtils.Assert(rollbackEvent != null, "rollbackEvent not found!"); changeState(rollbackEvent); - completion.fail(err(HostErrors.UNABLE_TO_ENTER_MAINTENANCE_MODE, errorCode, errorCode.getDetails())); + completion.fail(err(ORG_ZSTACK_COMPUTE_HOST_10127, HostErrors.UNABLE_TO_ENTER_MAINTENANCE_MODE, errorCode, errorCode.getDetails())); } }); } else { diff --git a/compute/src/main/java/org/zstack/compute/host/HostCascadeExtension.java b/compute/src/main/java/org/zstack/compute/host/HostCascadeExtension.java index 6b25e517edc..6924580062b 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostCascadeExtension.java +++ b/compute/src/main/java/org/zstack/compute/host/HostCascadeExtension.java @@ -33,6 +33,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.inerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -137,7 +138,7 @@ private void handleDeletionCheck(CascadeAction action, Completion completion) { completion.success(); } catch (HostException e) { - completion.fail(inerr(e.getMessage())); + completion.fail(inerr(ORG_ZSTACK_COMPUTE_HOST_10115, e.getMessage())); } } diff --git a/compute/src/main/java/org/zstack/compute/host/HostIpmiPowerExecutor.java b/compute/src/main/java/org/zstack/compute/host/HostIpmiPowerExecutor.java index f81aaa0eaf7..161894c91b5 100644 --- a/compute/src/main/java/org/zstack/compute/host/HostIpmiPowerExecutor.java +++ b/compute/src/main/java/org/zstack/compute/host/HostIpmiPowerExecutor.java @@ -19,6 +19,7 @@ import org.zstack.utils.path.PathUtil; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * @Author : jingwang @@ -59,7 +60,7 @@ public void powerOff(HostVO host, Boolean force, Completion completion, boolean private ErrorCode powerOff(HostVO host, Boolean force) { if (CoreGlobalProperty.UNIT_TEST_ON) { if (mockFail) { - return operr("mock power off host[%s] by ipmi failed.", host.getUuid()); + return operr(ORG_ZSTACK_COMPUTE_HOST_10090, "mock power off host[%s] by ipmi failed.", host.getUuid()); } return null; } @@ -75,7 +76,7 @@ private ErrorCode powerOff(HostVO host, Boolean force) { if (0 == ret) { return null; } else { - return operr("power off host[%s] by ipmi failed.", host.getUuid()); + return operr(ORG_ZSTACK_COMPUTE_HOST_10091, "power off host[%s] by ipmi failed.", host.getUuid()); } } @@ -117,7 +118,7 @@ public void powerOn(HostVO host, Completion completion) { private ErrorCode powerOn(HostVO host) { if (CoreGlobalProperty.UNIT_TEST_ON) { if (mockFail) { - return operr("mock power on host[%s] by ipmi failed.", host.getUuid()); + return operr(ORG_ZSTACK_COMPUTE_HOST_10092, "mock power on host[%s] by ipmi failed.", host.getUuid()); } return null; } @@ -127,14 +128,14 @@ private ErrorCode powerOn(HostVO host) { if (0 == ret) { return null; } else { - return operr("power on host[%s] by ipmi failed.", host.getUuid()); + return operr(ORG_ZSTACK_COMPUTE_HOST_10093, "power on host[%s] by ipmi failed.", host.getUuid()); } } @Override public void powerReset(HostVO host, Completion completion, boolean returnEarly) { if (HostPowerStatus.POWER_OFF.equals(refreshHostPowerStatus(host).getIpmiPowerStatus())) { - ErrorCode err = operr(String.format("reboot host[%s:%d] failed. because host is already powered off", + ErrorCode err = operr(ORG_ZSTACK_COMPUTE_HOST_10094, String.format("reboot host[%s:%d] failed. because host is already powered off", host.getIpmi().getIpmiAddress(), host.getIpmi().getIpmiPort())); completion.fail(err); return; @@ -157,7 +158,7 @@ public void powerReset(HostVO host, Completion completion, boolean returnEarly) private ErrorCode powerReset(HostVO host) { if (CoreGlobalProperty.UNIT_TEST_ON) { if (mockFail) { - return operr("mock power reset host[%s] by ipmi failed.", host.getUuid()); + return operr(ORG_ZSTACK_COMPUTE_HOST_10095, "mock power reset host[%s] by ipmi failed.", host.getUuid()); } return null; } @@ -167,7 +168,7 @@ private ErrorCode powerReset(HostVO host) { if (0 == ret) { return null; } else { - return operr("power reset host[%s] by ipmi failed.", host.getUuid()); + return operr(ORG_ZSTACK_COMPUTE_HOST_10096, "power reset host[%s] by ipmi failed.", host.getUuid()); } } @@ -188,7 +189,7 @@ public static Pair getPowerStatusWithErrorCode(HostI if (isIpmiUnConfigured(ipmi)) { return new Pair(HostPowerStatus.UN_CONFIGURED, - operr("ipmi information is not complete.")); + operr(ORG_ZSTACK_COMPUTE_HOST_10097, "ipmi information is not complete.")); } ShellResult rst = IPMIToolCaller.fromHostIpmiVo(ipmi).status(); @@ -198,10 +199,10 @@ public static Pair getPowerStatusWithErrorCode(HostI } else if (rst.getStdout().trim().equals("Chassis Power is off")) { return new Pair(HostPowerStatus.POWER_OFF, null); } else { - return new Pair(HostPowerStatus.POWER_UNKNOWN, operr("host[%s] got unexpected return value", ipmi.getUuid())); + return new Pair(HostPowerStatus.POWER_UNKNOWN, operr(ORG_ZSTACK_COMPUTE_HOST_10098, "host[%s] got unexpected return value", ipmi.getUuid())); } } else { - return new Pair(HostPowerStatus.POWER_UNKNOWN, operr("host[%s] can not connect ipmi[%s], because:%s", + return new Pair(HostPowerStatus.POWER_UNKNOWN, operr(ORG_ZSTACK_COMPUTE_HOST_10099, "host[%s] can not connect ipmi[%s], because:%s", ipmi.getUuid(), ipmi.getIpmiAddress(), rst.getStderr())); @@ -219,7 +220,7 @@ public static ErrorCode isIpmiReachable(HostIpmiVO ipmi) { if (rst.getRetCode() == 0) { return null; } else { - return operr("host ipmi[%s] is not reachable.because %s", + return operr(ORG_ZSTACK_COMPUTE_HOST_10100, "host ipmi[%s] is not reachable.because %s", ipmi.getIpmiAddress(), rst.getStderr()); } diff --git a/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java b/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java index 10dfe6049d1..a15ac71e227 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java @@ -58,6 +58,7 @@ import static org.zstack.core.Platform.*; import static org.zstack.longjob.LongJobUtils.noncancelableErr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class HostManagerImpl extends AbstractService implements HostManager, ManagementNodeChangeListener, ManagementNodeReadyExtensionPoint, FindSameNodeExtensionPoint { @@ -267,7 +268,7 @@ private void passThrough(HostMessage msg) { } if (vo == null) { - ErrorCode err = Platform.err(SysErrors.RESOURCE_NOT_FOUND, "cannot find host[uuid:%s], it may have been deleted", msg.getHostUuid()); + ErrorCode err = Platform.err(ORG_ZSTACK_COMPUTE_HOST_10101, SysErrors.RESOURCE_NOT_FOUND, "cannot find host[uuid:%s], it may have been deleted", msg.getHostUuid()); throw new OperationFailureException(err); } @@ -372,13 +373,13 @@ public String getName() { private void doAddHost(final AddHostMessage msg, ReturnValueCompletion completion) { final ClusterVO cluster = findClusterByUuid(msg.getClusterUuid()); if (cluster == null) { - completion.fail(argerr("cluster[uuid:%s] is not existing", msg.getClusterUuid())); + completion.fail(argerr(ORG_ZSTACK_COMPUTE_HOST_10102, "cluster[uuid:%s] is not existing", msg.getClusterUuid())); return; } String hvType = cluster.getHypervisorType(); if (hvType == null) { - completion.fail(argerr("cluster[uuid:%s] has null hypervisorType", msg.getClusterUuid())); + completion.fail(argerr(ORG_ZSTACK_COMPUTE_HOST_10103, "cluster[uuid:%s] has null hypervisorType", msg.getClusterUuid())); return; } @@ -386,7 +387,7 @@ private void doAddHost(final AddHostMessage msg, ReturnValueCompletion isoList = getIsoUuidByVmUuid(vmUuid); if (isoList.contains(isoUuid)) { - throw new OperationFailureException(operr("VM[uuid:%s] has attached ISO[uuid:%s]", vmUuid, isoUuid)); + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_10077, "VM[uuid:%s] has attached ISO[uuid:%s]", vmUuid, isoUuid)); } long emptyCdRomNum = Q.New(VmCdRomVO.class) @@ -45,7 +46,7 @@ static void checkAttachIsoToVm(String vmUuid, String isoUuid) { .isNull(VmCdRomVO_.isoUuid) .count(); if (emptyCdRomNum == 0) { - throw new OperationFailureException(operr("All vm[uuid:%s] CD-ROMs have mounted ISO", vmUuid)); + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_10078, "All vm[uuid:%s] CD-ROMs have mounted ISO", vmUuid)); } } diff --git a/compute/src/main/java/org/zstack/compute/vm/MacOperator.java b/compute/src/main/java/org/zstack/compute/vm/MacOperator.java index 113ea410f66..1d8bbf81e89 100644 --- a/compute/src/main/java/org/zstack/compute/vm/MacOperator.java +++ b/compute/src/main/java/org/zstack/compute/vm/MacOperator.java @@ -23,6 +23,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by camile on 2017/12/14. @@ -74,7 +75,7 @@ public void deleteCustomMacSystemTag(String vmUuid, String l3uuid, String mac) { private boolean isMulticastMac(String mac) { if (!pattern.matcher(mac.toLowerCase()).matches()){ - throw new OperationFailureException(operr("This is not a valid MAC address [%s]", mac)); + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_10225, "This is not a valid MAC address [%s]", mac)); } String binaryString = new BigInteger(mac.substring(0,2), 16).toString(2); return binaryString.substring(binaryString.length() - 1).equals("1"); @@ -84,13 +85,13 @@ public void validateAvailableMac(String mac) { String lowercaseMac = mac.toLowerCase(); Matcher matcher = pattern.matcher(lowercaseMac); if (!matcher.matches()) { - throw new OperationFailureException(operr("Not a valid MAC address [%s]", mac)); + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_10226, "Not a valid MAC address [%s]", mac)); } if ("00:00:00:00:00:00".equals(lowercaseMac) || "ff:ff:ff:ff:ff:ff".equals(lowercaseMac)) { - throw new OperationFailureException(operr("Disallowed address")); + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_10227, "Disallowed address")); } if (isMulticastMac(lowercaseMac)){ - throw new OperationFailureException(operr("Expected unicast mac address, found multicast MAC address [%s]", mac)); + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_10228, "Expected unicast mac address, found multicast MAC address [%s]", mac)); } } diff --git a/compute/src/main/java/org/zstack/compute/vm/StaticIpOperator.java b/compute/src/main/java/org/zstack/compute/vm/StaticIpOperator.java index 0fe152196f5..86ca327ae93 100755 --- a/compute/src/main/java/org/zstack/compute/vm/StaticIpOperator.java +++ b/compute/src/main/java/org/zstack/compute/vm/StaticIpOperator.java @@ -37,6 +37,7 @@ import static org.zstack.core.Platform.*; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by xing5 on 2016/5/25. @@ -91,7 +92,7 @@ public Map getNicNetworkInfoBySystemTag(List s } else if (IPv6NetworkUtils.isIpv6Address(ip)) { ret.get(l3Uuid).ipv6Address = ip; } else { - throw new ApiMessageInterceptionException(argerr("the static IP[%s] format error", ip)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10307, "the static IP[%s] format error", ip)); } } } @@ -303,12 +304,12 @@ public void checkIpAvailability(String l3Uuid, String ip) { bus.makeLocalServiceId(cmsg, L3NetworkConstant.SERVICE_ID); MessageReply r = bus.call(cmsg); if (!r.isSuccess()) { - throw new ApiMessageInterceptionException(argerr(r.getError().getDetails())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10308, r.getError().getDetails())); } CheckIpAvailabilityReply cr = r.castReply(); if (!cr.isAvailable()) { - throw new ApiMessageInterceptionException(argerr("IP[%s] is not available on the L3 network[uuid:%s] because: %s", ip, l3Uuid, cr.getReason())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10309, "IP[%s] is not available on the L3 network[uuid:%s] because: %s", ip, l3Uuid, cr.getReason())); } } @@ -339,7 +340,7 @@ public List fillUpStaticIpInfoToVmNics(Map sta .limit(1).find(); if (ipRangeVO == null) { if (StringUtils.isEmpty(nicIp.ipv4Netmask)) { - throw new ApiMessageInterceptionException(operr("netmask must be set")); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10310, "netmask must be set")); } } else { if (StringUtils.isEmpty(nicIp.ipv4Netmask)) { @@ -348,7 +349,7 @@ public List fillUpStaticIpInfoToVmNics(Map sta e(VmSystemTags.IPV4_NETMASK_TOKEN, ipRangeVO.getNetmask())) )); } else if (!nicIp.ipv4Netmask.equals(ipRangeVO.getNetmask())) { - throw new ApiMessageInterceptionException(operr("netmask error, expect: %s, got: %s", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10311, "netmask error, expect: %s, got: %s", ipRangeVO.getNetmask(), nicIp.ipv4Netmask)); } @@ -358,7 +359,7 @@ public List fillUpStaticIpInfoToVmNics(Map sta e(VmSystemTags.IPV4_GATEWAY_TOKEN, ipRangeVO.getGateway())) )); } else if (!nicIp.ipv4Gateway.equals(ipRangeVO.getGateway())) { - throw new ApiMessageInterceptionException(operr("gateway error, expect: %s, got: %s", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10312, "gateway error, expect: %s, got: %s", ipRangeVO.getGateway(), nicIp.ipv4Gateway)); } } @@ -371,7 +372,7 @@ public List fillUpStaticIpInfoToVmNics(Map sta .limit(1).find(); if (ipRangeVO == null) { if (StringUtils.isEmpty(nicIp.ipv6Prefix)) { - throw new ApiMessageInterceptionException(operr("ipv6 prefix length must be set")); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10313, "ipv6 prefix length must be set")); } } else { if (StringUtils.isEmpty(nicIp.ipv6Prefix)) { @@ -380,7 +381,7 @@ public List fillUpStaticIpInfoToVmNics(Map sta e(VmSystemTags.IPV6_PREFIX_TOKEN, ipRangeVO.getPrefixLen())) )); } else if (!nicIp.ipv6Prefix.equals(ipRangeVO.getPrefixLen().toString())) { - throw new ApiMessageInterceptionException(operr("ipv6 prefix length error, expect: %s, got: %s", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10314, "ipv6 prefix length error, expect: %s, got: %s", ipRangeVO.getPrefixLen(), nicIp.ipv6Prefix)); } @@ -391,7 +392,7 @@ public List fillUpStaticIpInfoToVmNics(Map sta IPv6NetworkUtils.ipv6AddressToTagValue(ipRangeVO.getGateway()))) )); } else if (!nicIp.ipv6Gateway.equals(ipRangeVO.getGateway())) { - throw new ApiMessageInterceptionException(operr("gateway error, expect: %s, got: %s", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10315, "gateway error, expect: %s, got: %s", ipRangeVO.getGateway(), nicIp.ipv6Gateway)); } } diff --git a/compute/src/main/java/org/zstack/compute/vm/TfVmNicFactory.java b/compute/src/main/java/org/zstack/compute/vm/TfVmNicFactory.java index 89631335ea4..1f3ef72b1ec 100644 --- a/compute/src/main/java/org/zstack/compute/vm/TfVmNicFactory.java +++ b/compute/src/main/java/org/zstack/compute/vm/TfVmNicFactory.java @@ -13,6 +13,7 @@ import static org.zstack.core.Platform.err; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class TfVmNicFactory extends VmNicFactory { @@ -41,7 +42,7 @@ public VmNicVO createVmNic(VmNicInventory nic, VmInstanceSpec spec) { vnic.setAccountUuid(acntUuid); vnic = persistAndRetryIfMacCollision(vnic); if (vnic == null) { - throw new FlowException(err(VmErrors.ALLOCATE_MAC_ERROR, "unable to find an available mac address after re-try 5 times, too many collisions")); + throw new FlowException(err(ORG_ZSTACK_COMPUTE_VM_10091, VmErrors.ALLOCATE_MAC_ERROR, "unable to find an available mac address after re-try 5 times, too many collisions")); } vnic = dbf.reload(vnic); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAllocateCdRomFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAllocateCdRomFlow.java index 8483fe64969..3a689ddd9c4 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmAllocateCdRomFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAllocateCdRomFlow.java @@ -27,6 +27,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.core.progress.ProgressReportService.taskProgress; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Create by lining at 2018/12/26 @@ -53,7 +54,7 @@ public void run(final FlowTrigger trigger, final Map data) { List deviceIds = cdRomSpecs.stream().map(CdRomSpec::getDeviceId).distinct().collect(Collectors.toList()); if (deviceIds.size() < cdRomSpecs.size()) { - trigger.fail(operr("vm[uuid:%s] cdRom deviceId repetition",spec.getVmInventory().getUuid())); + trigger.fail(operr(ORG_ZSTACK_COMPUTE_VM_10080, "vm[uuid:%s] cdRom deviceId repetition",spec.getVmInventory().getUuid())); return; } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAllocateHostAndPrimaryStorageFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAllocateHostAndPrimaryStorageFlow.java index 6aeaaac09aa..0bf4d044535 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmAllocateHostAndPrimaryStorageFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAllocateHostAndPrimaryStorageFlow.java @@ -40,6 +40,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Create by lining at 2020/08/17 @@ -69,7 +70,7 @@ public void run(final FlowTrigger trigger, final Map data) { .eq(ImageCacheVO_.imageUuid, imageUuid) .listValues(); if (!CollectionUtils.isEmpty(requirdPsUuids) && Collections.disjoint(requirdPsUuids, cachedPsUuids)) { - trigger.fail(operr("creation rely on image cache[uuid:%s, locate ps uuids: [%s]], cannot create other places.", imageUuid, cachedPsUuids)); + trigger.fail(operr(ORG_ZSTACK_COMPUTE_VM_10081, "creation rely on image cache[uuid:%s, locate ps uuids: [%s]], cannot create other places.", imageUuid, cachedPsUuids)); return; } else if (!CollectionUtils.isEmpty(requirdPsUuids)) { requirdPsUuids.retainAll(cachedPsUuids); @@ -143,7 +144,7 @@ public void run(final FlowTrigger trigger, final Map data) { if (!CollectionUtils.isEmpty(spec.getCandidatePrimaryStorageUuidsForRootVolume())) { List filterPsUuids = spec.getCandidatePrimaryStorageUuidsForRootVolume().stream().filter(availablePsUuids::contains).collect(Collectors.toList()); if (filterPsUuids.isEmpty()) { - trigger.fail(Platform.operr(String.format("none of the specified primary storages%s are available", spec.getCandidatePrimaryStorageUuidsForRootVolume()))); + trigger.fail(Platform.operr(ORG_ZSTACK_COMPUTE_VM_10082, String.format("none of the specified primary storages%s are available", spec.getCandidatePrimaryStorageUuidsForRootVolume()))); return; } spec.setCandidatePrimaryStorageUuidsForRootVolume(filterPsUuids); @@ -151,7 +152,7 @@ public void run(final FlowTrigger trigger, final Map data) { if (needCreateDataVolume(spec) && !CollectionUtils.isEmpty(spec.getCandidatePrimaryStorageUuidsForDataVolume())) { List filterPsUuids = spec.getCandidatePrimaryStorageUuidsForDataVolume().stream().filter(availablePsUuids::contains).collect(Collectors.toList()); if (filterPsUuids.isEmpty()) { - trigger.fail(Platform.operr(String.format("none of the specified primary storages%s are available", spec.getCandidatePrimaryStorageUuidsForDataVolume()))); + trigger.fail(Platform.operr(ORG_ZSTACK_COMPUTE_VM_10083, String.format("none of the specified primary storages%s are available", spec.getCandidatePrimaryStorageUuidsForDataVolume()))); return; } spec.setCandidatePrimaryStorageUuidsForDataVolume(filterPsUuids); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java index 3589d8c7307..db5da3e3ce8 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java @@ -36,6 +36,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.core.progress.ProgressReportService.taskProgress; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VmAllocateNicFlow implements Flow { @@ -110,7 +111,7 @@ public void run(final FlowTrigger trigger, final Map data) { // choose vnic factory based on enableSRIOV system tag & enableVhostUser globalConfig VmNicType type = nicManager.getVmNicType(spec.getVmInventory().getUuid(), nw); if (type == null) { - errs.add(Platform.operr("there is no available nicType on L3 network [%s]", nw.getUuid())); + errs.add(Platform.operr(ORG_ZSTACK_COMPUTE_VM_10068, "there is no available nicType on L3 network [%s]", nw.getUuid())); wcomp.allDone(); } VmInstanceNicFactory vnicFactory = vmMgr.getVmInstanceNicFactory(type); @@ -129,7 +130,7 @@ public void run(final FlowTrigger trigger, final Map data) { nic.setHypervisorType(spec.getDestHost() == null ? spec.getVmInventory().getHypervisorType() : spec.getDestHost().getHypervisorType()); if (mo.checkDuplicateMac(nic.getHypervisorType(), nic.getL3NetworkUuid(), nic.getMac())) { - trigger.fail(operr("Duplicate mac address [%s]", nic.getMac())); + trigger.fail(operr(ORG_ZSTACK_COMPUTE_VM_10069, "Duplicate mac address [%s]", nic.getMac())); return; } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicIpFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicIpFlow.java index bb0fdafcb01..b7a10d05ece 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicIpFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicIpFlow.java @@ -31,6 +31,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.core.progress.ProgressReportService.taskProgress; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VmAllocateNicIpFlow implements Flow { @@ -99,7 +100,7 @@ public void run(final FlowTrigger trigger, final Map data) { if (!Q.New(NormalIpRangeVO.class) .eq(NormalIpRangeVO_.l3NetworkUuid, v.getL3Invs().get(0).getUuid()) .isExists()) { - throw new OperationFailureException(Platform.operr("there is no available ipRange on L3 network [%s]", v.getL3Invs().get(0).getUuid())); + throw new OperationFailureException(Platform.operr(ORG_ZSTACK_COMPUTE_VM_10079, "there is no available ipRange on L3 network [%s]", v.getL3Invs().get(0).getUuid())); } }) .collect(Collectors.toList()); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAllocatePrimaryStorageForAttachingDiskFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAllocatePrimaryStorageForAttachingDiskFlow.java index bc2f59d6cdc..03ddab15b76 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmAllocatePrimaryStorageForAttachingDiskFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAllocatePrimaryStorageForAttachingDiskFlow.java @@ -23,6 +23,7 @@ import java.util.Map; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VmAllocatePrimaryStorageForAttachingDiskFlow implements Flow { @@ -42,7 +43,7 @@ public void run(final FlowTrigger chain, final Map data) { String hostUuid = spec.getVmInventory().getHostUuid() == null ? spec.getVmInventory().getLastHostUuid() : spec.getVmInventory().getHostUuid(); if(hostUuid == null){ - ErrorCode errorCode = operr(" Can not find the vm's host, please start the vm[%s], then mount the disk", spec.getVmInventory().getUuid()); + ErrorCode errorCode = operr(ORG_ZSTACK_COMPUTE_VM_10316, " Can not find the vm's host, please start the vm[%s], then mount the disk", spec.getVmInventory().getUuid()); chain.fail(errorCode); return; } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmDownloadIsoFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmDownloadIsoFlow.java index b060a48e3c6..aa9ccb65a29 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmDownloadIsoFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmDownloadIsoFlow.java @@ -27,6 +27,7 @@ import java.util.Map; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 10/17/2015. @@ -58,7 +59,7 @@ public void run(final FlowTrigger trigger, Map data) { final String bsUuid = selector.select(); if (bsUuid == null) { - throw new OperationFailureException(operr("cannot find the iso[uuid:%s] in any connected backup storage attached to the zone[uuid:%s]. check below:\n" + + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_10084, "cannot find the iso[uuid:%s] in any connected backup storage attached to the zone[uuid:%s]. check below:\n" + "1. if the backup storage is attached to the zone where the VM[name: %s, uuid:%s] is running\n" + "2. if the backup storage is in connected status, if not, try reconnecting it", iso.getUuid(), host.getZoneUuid(), spec.getVmInventory().getName(), spec.getVmInventory().getUuid()) diff --git a/compute/src/main/java/org/zstack/compute/vm/VmImageSelectBackupStorageFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmImageSelectBackupStorageFlow.java index 098b0b5ace5..893020ea582 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmImageSelectBackupStorageFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmImageSelectBackupStorageFlow.java @@ -30,6 +30,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.core.progress.ProgressReportService.taskProgress; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -76,13 +77,13 @@ private String findBackupStorage(VmInstanceSpec spec, String imageUuid) { } if (spec.getVmInventory().getZoneUuid() != null) { - throw new OperationFailureException(operr("cannot find the image[uuid:%s] in any connected backup storage attached to the zone[uuid:%s]. check below:\n" + + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_10085, "cannot find the image[uuid:%s] in any connected backup storage attached to the zone[uuid:%s]. check below:\n" + "1. if the backup storage is attached to the zone where the VM[name: %s, uuid:%s] is in\n" + "2. if the backup storage is in connected status, if not, try reconnecting it", imageUuid, spec.getVmInventory().getZoneUuid(), spec.getVmInventory().getName(), spec.getVmInventory().getUuid()) ); } else { - throw new OperationFailureException(operr("cannot find the image[uuid:%s] in any connected backup storage. check below:\n" + + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_10086, "cannot find the image[uuid:%s] in any connected backup storage. check below:\n" + "1. if the backup storage is attached to the zone where the VM[name: %s, uuid:%s] is in\n" + "2. if the backup storage is in connected status, if not, try reconnecting it", imageUuid, spec.getVmInventory().getName(), spec.getVmInventory().getUuid()) @@ -125,7 +126,7 @@ private String findIsoBsUuidInTheZone(final String isoImageUuid, final String zo q.setMaxResults(1); List ret = q.getResultList(); if (ret.isEmpty()) { - throw new OperationFailureException(operr("no backup storage attached to the zone[uuid:%s] contains the ISO[uuid:%s]", + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_10087, "no backup storage attached to the zone[uuid:%s] contains the ISO[uuid:%s]", zoneUuid, isoImageUuid)); } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceApiInterceptor.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceApiInterceptor.java index e598163a5a9..ab57c1845ad 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceApiInterceptor.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceApiInterceptor.java @@ -62,6 +62,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.list; import static org.zstack.utils.CollectionUtils.getDuplicateElementsOfList; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -175,13 +176,13 @@ private void validate(APITakeVmConsoleScreenshotMsg msg) { VmInstanceVO vm = Q.New(VmInstanceVO.class).eq(VmInstanceVO_.uuid, msg.getVmInstanceUuid()).find(); if (!vm.getState().equals(VmInstanceState.Running)) { throw new ApiMessageInterceptionException(operr( - "can not take vm console screenshot for vm[uuid:%s] which is not Running", msg.getVmInstanceUuid())); + ORG_ZSTACK_COMPUTE_VM_10092, "can not take vm console screenshot for vm[uuid:%s] which is not Running", msg.getVmInstanceUuid())); } } private void validate(APIGetInterdependentL3NetworksBackupStoragesMsg msg) { if (msg.getL3NetworkUuids() == null && msg.getBackupStorageUuid() == null) { - throw new ApiMessageInterceptionException(argerr("either l3NetworkUuids or backupStorageUuid must be set")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10093, "either l3NetworkUuids or backupStorageUuid must be set")); } } @@ -200,7 +201,7 @@ private void validate(APIChangeVmNicNetworkMsg msg) { .param("l3Uuids", Arrays.asList(nicVO.getL3NetworkUuid(), msg.getDestL3NetworkUuid())) .find(); if (count > 1) { - throw new ApiMessageInterceptionException(operr("could not change to L3 network, the l2 of l3[uuid:%s, %s] use different vswitch", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10094, "could not change to L3 network, the l2 of l3[uuid:%s, %s] use different vswitch", nicVO.getL3NetworkUuid(), msg.getDestL3NetworkUuid())); } for (VmNicChangeNetworkExtensionPoint extension : pluginRgty.getExtensionList(VmNicChangeNetworkExtensionPoint.class)) { @@ -213,7 +214,7 @@ private void validate(APIChangeVmNicNetworkMsg msg) { if (!networkServices.isEmpty()) { String error = "vm nic [%s] attached network services, please detach manually/n" + networkServices.toString(); - throw new ApiMessageInterceptionException(operr(error, msg.getVmNicUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10095, error, msg.getVmNicUuid())); } String sql = "select vm.uuid, vm.state, vm.type, nic.l3NetworkUuid from VmInstanceVO vm, VmNicVO nic where vm.uuid = nic.vmInstanceUuid and nic.uuid = :uuid"; @@ -227,13 +228,13 @@ private void validate(APIChangeVmNicNetworkMsg msg) { msg.setVmInstanceUuid(vmUuid); if (!VmInstanceState.Stopped.equals(state) && !VmInstanceState.Running.equals(state)) { - throw new ApiMessageInterceptionException(operr("unable to change to L3 network. The vm[uuid: %s] is not Running or Stopped; the current state is %s", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10096, "unable to change to L3 network. The vm[uuid: %s] is not Running or Stopped; the current state is %s", msg.getVmInstanceUuid(), state)); } L3NetworkVO l3NetworkVO = dbf.findByUuid(msg.getDestL3NetworkUuid(), L3NetworkVO.class); if (l3NetworkVO.enableIpAddressAllocation() && l3NetworkVO.getIpRanges().isEmpty()) { - throw new ApiMessageInterceptionException(operr("unable to change to L3 network. The L3 network[uuid:%s] doesn't has have ip range", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10097, "unable to change to L3 network. The L3 network[uuid:%s] doesn't has have ip range", msg.getDestL3NetworkUuid())); } @@ -243,14 +244,14 @@ private void validate(APIChangeVmNicNetworkMsg msg) { List l2Uuids = Q.New(L3NetworkVO.class).in(L3NetworkVO_.uuid, newAddedL3Uuids).select(L3NetworkVO_.l2NetworkUuid).listValues(); l2Uuids = l2Uuids.stream().distinct().collect(Collectors.toList()); if(l2Uuids.size() > 1) { - throw new ApiMessageInterceptionException(operr("unable to change to L3 network. The L3 network[uuid:%s] are belonged to different l2 networks [uuids:%s]", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10098, "unable to change to L3 network. The L3 network[uuid:%s] are belonged to different l2 networks [uuids:%s]", newAddedL3Uuids, l2Uuids)); } List clusterUuids = Q.New(L2NetworkClusterRefVO.class).eq(L2NetworkClusterRefVO_.l2NetworkUuid, l2Uuids.get(0)) .select(L2NetworkClusterRefVO_.clusterUuid).listValues(); if (clusterUuids.isEmpty()) { - throw new ApiMessageInterceptionException(operr("unable to change to L3 network. The L3 network[uuid:%s] are belonged to l2 networks [uuids:%s] that have not been attached to any cluster", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10099, "unable to change to L3 network. The L3 network[uuid:%s] are belonged to l2 networks [uuids:%s] that have not been attached to any cluster", newAddedL3Uuids, l2Uuids)); } @@ -262,14 +263,14 @@ private void validate(APIChangeVmNicNetworkMsg msg) { if (attachedL3Uuids != null && !attachedL3Uuids.isEmpty()) { if (!VmGlobalConfig.MULTI_VNIC_SUPPORT.value(Boolean.class) || !VmInstanceConstant.USER_VM_TYPE.equals(type)) { - throw new ApiMessageInterceptionException(operr("unable to change to L3 network. The L3 network[uuid:%s] is already attached to the vm[uuid: %s]", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10100, "unable to change to L3 network. The L3 network[uuid:%s] is already attached to the vm[uuid: %s]", attachedL3Uuids, msg.getVmInstanceUuid())); } List attachedNonGuestL3Uuids = Q.New(L3NetworkVO.class).select(L3NetworkVO_.uuid). notEq(L3NetworkVO_.category, L3NetworkCategory.Private).in(L3NetworkVO_.uuid, attachedL3Uuids).listValues(); if (attachedNonGuestL3Uuids != null && !attachedNonGuestL3Uuids.isEmpty()) { - throw new ApiMessageInterceptionException(operr("unable to change to a non-guest L3 network. The L3 network[uuid:%s] is already attached to the vm[uuid: %s]", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10101, "unable to change to a non-guest L3 network. The L3 network[uuid:%s] is already attached to the vm[uuid: %s]", attachedL3Uuids, msg.getVmInstanceUuid())); } } @@ -277,10 +278,10 @@ private void validate(APIChangeVmNicNetworkMsg msg) { for (String l3Uuid : newAddedL3Uuids) { L3NetworkVO l3Vo = dbf.findByUuid(l3Uuid, L3NetworkVO.class); if (l3Vo.getState() == L3NetworkState.Disabled) { - throw new ApiMessageInterceptionException(operr("unable to change to L3 network. The L3 network[uuid:%s] is disabled", l3Uuid)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10102, "unable to change to L3 network. The L3 network[uuid:%s] is disabled", l3Uuid)); } if (VmInstanceConstant.USER_VM_TYPE.equals(type) && l3Vo.isSystem()) { - throw new ApiMessageInterceptionException(operr("unable to change to L3 network. The L3 network[uuid:%s] is a system network and vm is a user vm", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10103, "unable to change to L3 network. The L3 network[uuid:%s] is a system network and vm is a user vm", l3Uuid)); } } @@ -310,20 +311,20 @@ private void validate(APIChangeVmNicNetworkMsg msg) { } if (!found) { - throw new ApiMessageInterceptionException(argerr("the static IP[%s] is not in any IP range of the L3 network[uuid:%s]", msg.getStaticIp(), msg.getDestL3NetworkUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10104, "the static IP[%s] is not in any IP range of the L3 network[uuid:%s]", msg.getStaticIp(), msg.getDestL3NetworkUuid())); } SimpleQuery uq = dbf.createQuery(UsedIpVO.class); uq.add(UsedIpVO_.l3NetworkUuid, Op.EQ, msg.getDestL3NetworkUuid()); uq.add(UsedIpVO_.ip, Op.EQ, msg.getStaticIp()); if (uq.isExists()) { - throw new ApiMessageInterceptionException(operr("the static IP[%s] has been occupied on the L3 network[uuid:%s]", msg.getStaticIp(), msg.getDestL3NetworkUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10105, "the static IP[%s] has been occupied on the L3 network[uuid:%s]", msg.getStaticIp(), msg.getDestL3NetworkUuid())); } } for (Map.Entry> e : staticIps.entrySet()) { if (!newAddedL3Uuids.contains(e.getKey())) { - throw new ApiMessageInterceptionException(argerr("static ip l3 uuid[%s] is not included in nic l3 [%s]", e.getKey(), newAddedL3Uuids)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10106, "static ip l3 uuid[%s] is not included in nic l3 [%s]", e.getKey(), newAddedL3Uuids)); } String l3Uuid = e.getKey(); @@ -353,14 +354,14 @@ private void validate(APIChangeVmNicNetworkMsg msg) { } if (!found) { - throw new ApiMessageInterceptionException(argerr("the static IP[%s] is not in any IP range of the L3 network[uuid:%s]", staticIp, l3Uuid)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10107, "the static IP[%s] is not in any IP range of the L3 network[uuid:%s]", staticIp, l3Uuid)); } SimpleQuery uq = dbf.createQuery(UsedIpVO.class); uq.add(UsedIpVO_.l3NetworkUuid, Op.EQ, msg.getDestL3NetworkUuid()); uq.add(UsedIpVO_.ip, Op.EQ, msg.getStaticIp()); if (uq.isExists()) { - throw new ApiMessageInterceptionException(operr("the static IP[%s] has been occupied on the L3 network[uuid:%s]", staticIp, l3Uuid)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10108, "the static IP[%s] has been occupied on the L3 network[uuid:%s]", staticIp, l3Uuid)); } } } @@ -375,10 +376,10 @@ private void validate(APIChangeVmNicNetworkMsg msg) { NicIpAddressInfo nicIpAddressInfo = nicNetworkInfo.get(msg.getDestL3NetworkUuid()); if (nicIpAddressInfo != null) { if (!nicIpAddressInfo.ipv4Address.isEmpty() && Q.New(UsedIpVO.class).eq(UsedIpVO_.ip, nicIpAddressInfo.ipv4Address).eq(UsedIpVO_.l3NetworkUuid, msg.getDestL3NetworkUuid()).isExists()) { - throw new ApiMessageInterceptionException(argerr("the static IP[%s] has been occupied on the L3 network[uuid:%s]", nicIpAddressInfo.ipv4Address, msg.getDestL3NetworkUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10109, "the static IP[%s] has been occupied on the L3 network[uuid:%s]", nicIpAddressInfo.ipv4Address, msg.getDestL3NetworkUuid())); } if (!nicIpAddressInfo.ipv6Address.isEmpty() && Q.New(UsedIpVO.class).eq(UsedIpVO_.ip, IPv6NetworkUtils.getIpv6AddressCanonicalString(nicIpAddressInfo.ipv6Address)).eq(UsedIpVO_.l3NetworkUuid, msg.getDestL3NetworkUuid()).isExists()) { - throw new ApiMessageInterceptionException(argerr("the static IP[%s] has been occupied on the L3 network[uuid:%s]", nicIpAddressInfo.ipv6Address, msg.getDestL3NetworkUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10110, "the static IP[%s] has been occupied on the L3 network[uuid:%s]", nicIpAddressInfo.ipv6Address, msg.getDestL3NetworkUuid())); } } } @@ -388,7 +389,7 @@ private void validate(APIGetCandidateZonesClustersHostsForCreatingVmMsg msg) { if (instanceOfferingUuid == null) { if (msg.getCpuNum() == null || msg.getMemorySize() == null) { - throw new ApiMessageInterceptionException(operr("Missing CPU/memory settings")); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10111, "Missing CPU/memory settings")); } } @@ -396,7 +397,7 @@ private void validate(APIGetCandidateZonesClustersHostsForCreatingVmMsg msg) { if (image != null && image.getMediaType() == ImageMediaType.ISO) { if (msg.getRootDiskOfferingUuid() == null) { if (msg.getRootDiskSize() == null || msg.getRootDiskSize() <= 0) { - throw new OperationFailureException(argerr("the image[name:%s, uuid:%s] is an ISO, rootDiskSize must be set", + throw new OperationFailureException(argerr(ORG_ZSTACK_COMPUTE_VM_10112, "the image[name:%s, uuid:%s] is an ISO, rootDiskSize must be set", image.getName(), image.getUuid())); } } @@ -407,7 +408,7 @@ private void validate(final APICreateVmCdRomMsg msg) { VmInstanceVO vo = dbf.findByUuid(msg.getVmInstanceUuid(), VmInstanceVO.class); if (!vo.getState().equals(VmInstanceState.Stopped)) { throw new ApiMessageInterceptionException(argerr( - "Can not create CD-ROM for vm[uuid:%s] which is in state[%s] ", msg.getVmInstanceUuid(), vo.getState().toString())); + ORG_ZSTACK_COMPUTE_VM_10113, "Can not create CD-ROM for vm[uuid:%s] which is in state[%s] ", msg.getVmInstanceUuid(), vo.getState().toString())); } } @@ -415,13 +416,13 @@ private void validate(final APIUpdateVmNicDriverMsg msg) { VmInstanceVO vo = dbf.findByUuid(msg.getVmInstanceUuid(), VmInstanceVO.class); if (vo.getPlatform().equals(ImagePlatform.Other.toString())) { throw new ApiMessageInterceptionException(argerr( - "Current platform %s not support update nic driver yet", vo.getPlatform())); + ORG_ZSTACK_COMPUTE_VM_10114, "Current platform %s not support update nic driver yet", vo.getPlatform())); } List supportNicDriverTypes = nicManager.getSupportNicDriverTypes(); if (!supportNicDriverTypes.contains(msg.getDriverType())) { throw new ApiMessageInterceptionException(argerr( - "Nic driver %s not support yet", msg.getDriverType())); + ORG_ZSTACK_COMPUTE_VM_10115, "Nic driver %s not support yet", msg.getDriverType())); } } @@ -430,7 +431,7 @@ private void validate(final APIGetCandidatePrimaryStoragesForCreatingVmMsg msg) if (ImageMediaType.ISO == mediaType) { if (msg.getRootDiskOfferingUuid() == null) { if (msg.getRootDiskSize() == null || msg.getRootDiskSize() <= 0) { - throw new ApiMessageInterceptionException(argerr("rootDiskSize is needed when image media type is ISO")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10116, "rootDiskSize is needed when image media type is ISO")); } } } @@ -443,13 +444,13 @@ protected void scripts() { VmInstanceVO vo = findByUuid(msg.getVmInstanceUuid(), VmInstanceVO.class); if (vo.getState().equals(VmInstanceState.Running) && vo.getHostUuid().equals(msg.getHostUuid())) { throw new ApiMessageInterceptionException(argerr( - "the vm[uuid:%s] is already on host[uuid:%s]", msg.getVmInstanceUuid(), msg.getHostUuid() + ORG_ZSTACK_COMPUTE_VM_10117, "the vm[uuid:%s] is already on host[uuid:%s]", msg.getVmInstanceUuid(), msg.getHostUuid() )); } if (vo.getState() == VmInstanceState.Paused && VmSystemTags.VM_STATE_PAUSED_AFTER_MIGRATE.hasTag(msg.getVmInstanceUuid())) { throw new ApiMessageInterceptionException(argerr( - "the vm[uuid:%s] is still paused after the last migration, please resume it before migrate.", msg.getVmInstanceUuid())); + ORG_ZSTACK_COMPUTE_VM_10118, "the vm[uuid:%s] is still paused after the last migration, please resume it before migrate.", msg.getVmInstanceUuid())); } } }.execute(); @@ -465,12 +466,12 @@ protected void scripts() { boolean numa = rcf.getResourceConfigValue(VmGlobalConfig.NUMA, msg.getVmInstanceUuid(), Boolean.class); if (!numa && !VmInstanceState.Stopped.equals(vo.getState())) { throw new ApiMessageInterceptionException(argerr( - "the VM cannot do online cpu/memory update because of disabling Instance Offering Online Modification. Please stop the VM then do the cpu/memory update again" + ORG_ZSTACK_COMPUTE_VM_10119, "the VM cannot do online cpu/memory update because of disabling Instance Offering Online Modification. Please stop the VM then do the cpu/memory update again" )); } if (!VmInstanceState.Stopped.equals(vo.getState()) && !VmInstanceState.Running.equals(vo.getState())) { - throw new OperationFailureException(operr("The state of vm[uuid:%s] is %s. Only these state[%s] is allowed to update cpu or memory.", + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_10120, "The state of vm[uuid:%s] is %s. Only these state[%s] is allowed to update cpu or memory.", vo.getUuid(), vo.getState(), StringUtils.join(list(VmInstanceState.Running, VmInstanceState.Stopped), ","))); } @@ -481,7 +482,7 @@ protected void scripts() { if (instanceOfferingVO.getCpuNum() < vo.getCpuNum() || instanceOfferingVO.getMemorySize() < vo.getMemorySize()) { throw new ApiMessageInterceptionException(argerr( - "can't decrease capacity when vm[uuid:%s] is running", vo.getUuid() + ORG_ZSTACK_COMPUTE_VM_10121, "can't decrease capacity when vm[uuid:%s] is running", vo.getUuid() )); } } @@ -498,7 +499,7 @@ protected void scripts() { Long memorySize = msg.getMemorySize() == null ? vo.getMemorySize() : msg.getMemorySize(); if (msg.getReservedMemorySize() > memorySize) { throw new ApiMessageInterceptionException(argerr( - "reservedMemorySize[%s] is greater than memorySize[%s]", msg.getReservedMemorySize(), memorySize + ORG_ZSTACK_COMPUTE_VM_10122, "reservedMemorySize[%s] is greater than memorySize[%s]", msg.getReservedMemorySize(), memorySize )); } } @@ -509,7 +510,7 @@ protected void scripts() { boolean uniqueVmName = VmGlobalConfig.UNIQUE_VM_NAME.value(Boolean.class); if (uniqueVmName && Q.New(VmInstanceVO.class).eq(VmInstanceVO_.name, msg.getName()).notEq(VmInstanceVO_.uuid, msg.getUuid()).isExists()) { - throw new ApiMessageInterceptionException(operr("could not create vm, a vm with the name [%s] already exists", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10123, "could not create vm, a vm with the name [%s] already exists", msg.getName())); } @@ -521,19 +522,19 @@ protected void scripts() { if (!numa && !VmInstanceState.Stopped.equals(vmState)) { if (cpuSum != null && cpuSum != vo.getCpuNum()) { throw new ApiMessageInterceptionException(argerr( - "the VM cannot do cpu hot plug because of disabling cpu hot plug. Please stop the VM then do the cpu hot plug again" + ORG_ZSTACK_COMPUTE_VM_10124, "the VM cannot do cpu hot plug because of disabling cpu hot plug. Please stop the VM then do the cpu hot plug again" )); } if (memorySize != null && memorySize != vo.getMemorySize()) { throw new ApiMessageInterceptionException(argerr( - "the VM cannot do memory hot plug because of disabling memory hot plug. Please stop the VM then do the memory hot plug again" + ORG_ZSTACK_COMPUTE_VM_10125, "the VM cannot do memory hot plug because of disabling memory hot plug. Please stop the VM then do the memory hot plug again" )); } } if (!VmInstanceState.Stopped.equals(vo.getState()) && !VmInstanceState.Running.equals(vo.getState())) { - throw new OperationFailureException(operr("The state of vm[uuid:%s] is %s. Only these state[%s] is allowed to update cpu or memory.", + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_10126, "The state of vm[uuid:%s] is %s. Only these state[%s] is allowed to update cpu or memory.", vo.getUuid(), vo.getState(), StringUtils.join(list(VmInstanceState.Running, VmInstanceState.Stopped), ","))); } @@ -544,13 +545,13 @@ protected void scripts() { if (msg.getCpuNum() != null && msg.getCpuNum() < vo.getCpuNum()) { throw new ApiMessageInterceptionException(argerr( - "can't decrease cpu of vm[uuid:%s] when it is running", vo.getUuid() + ORG_ZSTACK_COMPUTE_VM_10127, "can't decrease cpu of vm[uuid:%s] when it is running", vo.getUuid() )); } if (msg.getMemorySize() != null && msg.getMemorySize() < vo.getMemorySize()) { throw new ApiMessageInterceptionException(argerr( - "can't decrease memory size of vm[uuid:%s] when it is running", vo.getUuid() + ORG_ZSTACK_COMPUTE_VM_10128, "can't decrease memory size of vm[uuid:%s] when it is running", vo.getUuid() )); } } @@ -570,7 +571,7 @@ private void validate(APIStartVmInstanceMsg msg) { private void validateStaticIPv4(VmNicVO vmNicVO, L3NetworkVO l3NetworkVO, String ip) { if (!NetworkUtils.isIpv4Address(ip)) { - throw new ApiMessageInterceptionException(argerr("%s is not a valid IPv4 address", ip)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10129, "%s is not a valid IPv4 address", ip)); } for (UsedIpVO ipVo : vmNicVO.getUsedIps()) { @@ -580,7 +581,7 @@ private void validateStaticIPv4(VmNicVO vmNicVO, L3NetworkVO l3NetworkVO, String if (ipVo.getL3NetworkUuid().equals(l3NetworkVO.getUuid())) { if (ipVo.getIp().equals(ip)) { - throw new ApiMessageInterceptionException(argerr("ip address [%s] already set to vmNic [uuid:%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10130, "ip address [%s] already set to vmNic [uuid:%s]", ip, vmNicVO.getUuid())); } if (!l3NetworkVO.enableIpAddressAllocation()) { @@ -589,7 +590,7 @@ private void validateStaticIPv4(VmNicVO vmNicVO, L3NetworkVO l3NetworkVO, String // check if the ip is in the ip range when ipam is enabled NormalIpRangeVO rangeVO = dbf.findByUuid(ipVo.getIpRangeUuid(), NormalIpRangeVO.class); if (!NetworkUtils.isIpv4InCidr(ip, rangeVO.getNetworkCidr())) { - throw new ApiMessageInterceptionException(argerr("ip address [%s] is not in ip range [%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10131, "ip address [%s] is not in ip range [%s]", ip, rangeVO.getNetworkCidr())); } } @@ -598,7 +599,7 @@ private void validateStaticIPv4(VmNicVO vmNicVO, L3NetworkVO l3NetworkVO, String private void validateStaticIPv6(VmNicVO vmNicVO, L3NetworkVO l3NetworkVO, String ip) { if (!IPv6NetworkUtils.isIpv6Address(ip)) { - throw new ApiMessageInterceptionException(argerr("%s is not a valid IPv6 address", ip)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10132, "%s is not a valid IPv6 address", ip)); } for (UsedIpVO ipVo : vmNicVO.getUsedIps()) { @@ -608,7 +609,7 @@ private void validateStaticIPv6(VmNicVO vmNicVO, L3NetworkVO l3NetworkVO, String if (ipVo.getL3NetworkUuid().equals(l3NetworkVO.getUuid())) { if (ip.equals(ipVo.getIp())) { - throw new ApiMessageInterceptionException(argerr("ip address [%s] already set to vmNic [uuid:%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10133, "ip address [%s] already set to vmNic [uuid:%s]", ip, vmNicVO.getUuid())); } if (!l3NetworkVO.enableIpAddressAllocation()) { @@ -616,7 +617,7 @@ private void validateStaticIPv6(VmNicVO vmNicVO, L3NetworkVO l3NetworkVO, String } NormalIpRangeVO rangeVO = dbf.findByUuid(ipVo.getIpRangeUuid(), NormalIpRangeVO.class); if (!IPv6NetworkUtils.isIpv6InRange(ip, rangeVO.getStartIp(), rangeVO.getEndIp())) { - throw new ApiMessageInterceptionException(argerr("ip address [%s] is not in ip range [startIp %s, endIp %s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10134, "ip address [%s] is not in ip range [startIp %s, endIp %s]", ip, rangeVO.getStartIp(), rangeVO.getEndIp())); } } @@ -627,7 +628,7 @@ private void validate(APISetVmStaticIpMsg msg) { L3NetworkVO l3NetworkVO = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.uuid, msg.getL3NetworkUuid()).find(); if (msg.getIp() == null && msg.getIp6() == null) { if(l3NetworkVO.enableIpAddressAllocation()) { - throw new ApiMessageInterceptionException(argerr("could not set ip address, due to no ip address is specified")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10135, "could not set ip address, due to no ip address is specified")); } } List ipv4Ranges = Q.New(NormalIpRangeVO.class) @@ -648,7 +649,7 @@ private void validate(APISetVmStaticIpMsg msg) { validateStaticIPv6(nic, l3NetworkVO, ip); msg.setIp(ip); } else { - throw new ApiMessageInterceptionException(argerr("static ip [%s] format error", msg.getIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10136, "static ip [%s] format error", msg.getIp())); } } if (msg.getIp6() != null) { @@ -661,7 +662,7 @@ private void validate(APISetVmStaticIpMsg msg) { l3Found = true; if (msg.getNetmask() == null) { if (ipv4Ranges.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("ipv4 address need a netmask")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10137, "ipv4 address need a netmask")); } else { msg.setNetmask(ipv4Ranges.get(0).getNetmask()); } @@ -674,14 +675,14 @@ private void validate(APISetVmStaticIpMsg msg) { } } if (Q.New(UsedIpVO.class).eq(UsedIpVO_.ip, msg.getIp()).eq(UsedIpVO_.l3NetworkUuid, msg.getL3NetworkUuid()).isExists()) { - throw new ApiMessageInterceptionException(argerr("ip address [%s] already set to vmNic", msg.getIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10138, "ip address [%s] already set to vmNic", msg.getIp())); } } if (msg.getIp6() != null && !l3NetworkVO.enableIpAddressAllocation()) { l3Found = true; if (msg.getIpv6Prefix() == null) { if (ipv6Ranges.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("ipv6 address need a prefix")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10139, "ipv6 address need a prefix")); } else { msg.setIpv6Prefix(ipv6Ranges.get(0).getPrefixLen().toString()); } @@ -694,11 +695,11 @@ private void validate(APISetVmStaticIpMsg msg) { } } if (Q.New(UsedIpVO.class).eq(UsedIpVO_.ip, msg.getIp6()).eq(UsedIpVO_.l3NetworkUuid, msg.getL3NetworkUuid()).isExists()) { - throw new ApiMessageInterceptionException(argerr("ip address [%s] already set to vmNic", msg.getIp6())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10140, "ip address [%s] already set to vmNic", msg.getIp6())); } } if (!l3Found) { - throw new ApiMessageInterceptionException(argerr("the VM[uuid:%s] has no nic on the L3 network[uuid:%s]", msg.getVmInstanceUuid(), + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10141, "the VM[uuid:%s] has no nic on the L3 network[uuid:%s]", msg.getVmInstanceUuid(), msg.getL3NetworkUuid())); } } @@ -708,14 +709,14 @@ private void validate(APIDeleteVmStaticIpMsg msg) { q.add(VmNicVO_.vmInstanceUuid, Op.EQ, msg.getVmInstanceUuid()); q.add(VmNicVO_.l3NetworkUuid, Op.EQ, msg.getL3NetworkUuid()); if (!q.isExists()) { - throw new ApiMessageInterceptionException(argerr("the VM[uuid:%s] has no nic on the L3 network[uuid:%s]", msg.getVmInstanceUuid(), + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10142, "the VM[uuid:%s] has no nic on the L3 network[uuid:%s]", msg.getVmInstanceUuid(), msg.getL3NetworkUuid())); } if (msg.getStaticIp() != null) { if (!Q.New(UsedIpVO.class).eq(UsedIpVO_.l3NetworkUuid, msg.getL3NetworkUuid()) .eq(UsedIpVO_.ip, msg.getStaticIp()).isExists()) { - throw new ApiMessageInterceptionException(argerr("could not delete static ip [%s] for vm [uuid:%s] " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10143, "could not delete static ip [%s] for vm [uuid:%s] " + "because it doesn't existed", msg.getStaticIp(), msg.getVmInstanceUuid())); } } @@ -727,7 +728,7 @@ private void validate(APISetVmBootOrderMsg msg) { try { VmBootDevice.valueOf(o); } catch (IllegalArgumentException e) { - throw new ApiMessageInterceptionException(argerr("invalid boot device[%s] in boot order%s", o, msg.getBootOrder())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10144, "invalid boot device[%s] in boot order%s", o, msg.getBootOrder())); } } } @@ -750,16 +751,16 @@ private boolean isVmHasMemorySnapshotGroup(String vmUuid) { private void validate(APISetVmBootVolumeMsg msg) { VolumeVO volume = Q.New(VolumeVO.class).eq(VolumeVO_.uuid, msg.getVolumeUuid()).find(); if (volume.isShareable()) { - throw new ApiMessageInterceptionException(argerr("boot volume cannot be shareable.")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10145, "boot volume cannot be shareable.")); } if (!msg.getVmInstanceUuid().equals(volume.getVmInstanceUuid())) { - throw new ApiMessageInterceptionException(argerr("volume[uuid:%s] must be attached to vm[uuid:%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10146, "volume[uuid:%s] must be attached to vm[uuid:%s]", msg.getVolumeUuid(), msg.getVmInstanceUuid())); } if (isVmHasMemorySnapshotGroup(msg.getVmInstanceUuid())) { - throw new ApiMessageInterceptionException(argerr("the vm %s with memory snapshots do not support setting boot volume", msg.getVmInstanceUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10147, "the vm %s with memory snapshots do not support setting boot volume", msg.getVmInstanceUuid())); } } @@ -767,12 +768,12 @@ private void validate(APISetVmBootVolumeMsg msg) { private void validate(APIAttachIsoToVmInstanceMsg msg) { List isoUuids = IsoOperator.getIsoUuidByVmUuid(msg.getVmInstanceUuid()); if (isoUuids.contains(msg.getIsoUuid())) { - throw new ApiMessageInterceptionException(operr("VM[uuid:%s] already has an ISO[uuid:%s] attached", msg.getVmInstanceUuid(), msg.getIsoUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10148, "VM[uuid:%s] already has an ISO[uuid:%s] attached", msg.getVmInstanceUuid(), msg.getIsoUuid())); } ImageConstant.ImageMediaType type = Q.New(ImageVO.class).eq(ImageVO_.uuid, msg.getIsoUuid()).select(ImageVO_.mediaType).findValue(); if (type != ImageConstant.ImageMediaType.ISO) { - throw new ApiMessageInterceptionException(argerr("Unsupported Image Media Type: [%s] ", type)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10149, "Unsupported Image Media Type: [%s] ", type)); } validateCdRomUuid(msg); @@ -787,11 +788,11 @@ private void validateCdRomUuid(APIAttachIsoToVmInstanceMsg msg) { if (cdRomUuid != null) { VmCdRomVO cdRomVO = dbf.findByUuid(cdRomUuid, VmCdRomVO.class); if (cdRomVO == null) { - throw new ApiMessageInterceptionException(operr("The cdRom[uuid:%s] does not exist", cdRomUuid)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10150, "The cdRom[uuid:%s] does not exist", cdRomUuid)); } if (StringUtils.isNotEmpty(cdRomVO.getIsoUuid())){ - throw new ApiMessageInterceptionException(operr("VM[uuid:%s] cdRom[uuid:%s] has mounted the ISO", msg.getVmInstanceUuid(), cdRomUuid)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10151, "VM[uuid:%s] cdRom[uuid:%s] has mounted the ISO", msg.getVmInstanceUuid(), cdRomUuid)); } msg.setCdRomUuid(cdRomUuid); @@ -809,7 +810,7 @@ private void validate(APIDetachIsoFromVmInstanceMsg msg) { List isoUuids = IsoOperator.getIsoUuidByVmUuid(msg.getVmInstanceUuid()); if (isoUuids.size() > 1 && msg.getIsoUuid() == null) { - throw new ApiMessageInterceptionException(operr("VM[uuid:%s] has multiple ISOs attached, specify the isoUuid when detaching", msg.getVmInstanceUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10152, "VM[uuid:%s] has multiple ISOs attached, specify the isoUuid when detaching", msg.getVmInstanceUuid())); } if (msg.getIsoUuid() == null) { @@ -820,7 +821,7 @@ private void validate(APIDetachIsoFromVmInstanceMsg msg) { private void validate(APICreateVmNicMsg msg) { L3NetworkVO l3VO = dbf.findByUuid(msg.getL3NetworkUuid(), L3NetworkVO.class); if (l3VO.getState() == L3NetworkState.Disabled) { - throw new ApiMessageInterceptionException(operr("unable to attach a L3 network. The L3 network[uuid:%s] is disabled", msg.getL3NetworkUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10153, "unable to attach a L3 network. The L3 network[uuid:%s] is disabled", msg.getL3NetworkUuid())); } if (msg.getIp() != null) { @@ -841,14 +842,14 @@ private void validate(APICreateVmNicMsg msg) { } if (!found) { - throw new ApiMessageInterceptionException(argerr("the static IP[%s] is not in any IP range of the L3 network[uuid:%s]", msg.getIp(), msg.getL3NetworkUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10154, "the static IP[%s] is not in any IP range of the L3 network[uuid:%s]", msg.getIp(), msg.getL3NetworkUuid())); } SimpleQuery uq = dbf.createQuery(UsedIpVO.class); uq.add(UsedIpVO_.l3NetworkUuid, Op.EQ, msg.getL3NetworkUuid()); uq.add(UsedIpVO_.ip, Op.EQ, msg.getIp()); if (uq.isExists()) { - throw new ApiMessageInterceptionException(operr("the static IP[%s] has been occupied on the L3 network[uuid:%s]", msg.getIp(), msg.getL3NetworkUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10155, "the static IP[%s] has been occupied on the L3 network[uuid:%s]", msg.getIp(), msg.getL3NetworkUuid())); } } } @@ -862,13 +863,13 @@ private void validate(APIAttachL3NetworkToVmMsg msg) { VmInstanceState state = t.get(1, VmInstanceState.class); if (!VmInstanceState.Running.equals(state) && !VmInstanceState.Stopped.equals(state)) { - throw new ApiMessageInterceptionException(operr("unable to attach a L3 network. The vm[uuid: %s] is not Running or Stopped; the current state is %s", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10156, "unable to attach a L3 network. The vm[uuid: %s] is not Running or Stopped; the current state is %s", msg.getVmInstanceUuid(), state)); } L3NetworkVO l3NetworkVO = dbf.findByUuid(msg.getL3NetworkUuid(), L3NetworkVO.class); if (l3NetworkVO.getIpRanges().isEmpty() && l3NetworkVO.enableIpAddressAllocation()) { - throw new ApiMessageInterceptionException(operr("unable to attach a L3 network. The L3 network[uuid:%s] doesn't has have ip range", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10157, "unable to attach a L3 network. The L3 network[uuid:%s] doesn't has have ip range", msg.getL3NetworkUuid())); } @@ -878,7 +879,7 @@ private void validate(APIAttachL3NetworkToVmMsg msg) { List l2Uuids = Q.New(L3NetworkVO.class).in(L3NetworkVO_.uuid, newAddedL3Uuids).select(L3NetworkVO_.l2NetworkUuid).listValues(); l2Uuids = l2Uuids.stream().distinct().collect(Collectors.toList()); if(l2Uuids.size() > 1) { - throw new ApiMessageInterceptionException(operr("unable to attach a L3 network. The L3 network[uuid:%s] are belonged to different l2 networks [uuids:%s]", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10158, "unable to attach a L3 network. The L3 network[uuid:%s] are belonged to different l2 networks [uuids:%s]", newAddedL3Uuids, l2Uuids)); } @@ -891,7 +892,7 @@ private void validate(APIAttachL3NetworkToVmMsg msg) { List clusterUuids = Q.New(L2NetworkClusterRefVO.class).eq(L2NetworkClusterRefVO_.l2NetworkUuid, l2Uuids.get(0)) .select(L2NetworkClusterRefVO_.clusterUuid).listValues(); if (clusterUuids.isEmpty()) { - throw new ApiMessageInterceptionException(operr("unable to attach a L3 network. The L3 network[uuid:%s] are belonged to l2 networks [uuids:%s] that have not been attached to any cluster", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10159, "unable to attach a L3 network. The L3 network[uuid:%s] are belonged to l2 networks [uuids:%s] that have not been attached to any cluster", newAddedL3Uuids, l2Uuids)); } } @@ -904,14 +905,14 @@ private void validate(APIAttachL3NetworkToVmMsg msg) { if (attachedL3Uuids != null && !attachedL3Uuids.isEmpty()) { if (!VmGlobalConfig.MULTI_VNIC_SUPPORT.value(Boolean.class) || !VmInstanceConstant.USER_VM_TYPE.equals(type)) { - throw new ApiMessageInterceptionException(operr("unable to attach a L3 network. The L3 network[uuid:%s] is already attached to the vm[uuid: %s]", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10160, "unable to attach a L3 network. The L3 network[uuid:%s] is already attached to the vm[uuid: %s]", attachedL3Uuids, msg.getVmInstanceUuid())); } List attachedNonGuestL3Uuids = Q.New(L3NetworkVO.class).select(L3NetworkVO_.uuid). notEq(L3NetworkVO_.category, L3NetworkCategory.Private).in(L3NetworkVO_.uuid, attachedL3Uuids).listValues(); if (attachedNonGuestL3Uuids != null && !attachedNonGuestL3Uuids.isEmpty()) { - throw new ApiMessageInterceptionException(operr("unable to attach a non-guest L3 network. The L3 network[uuid:%s] is already attached to the vm[uuid: %s]", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10161, "unable to attach a non-guest L3 network. The L3 network[uuid:%s] is already attached to the vm[uuid: %s]", attachedL3Uuids, msg.getVmInstanceUuid())); } } @@ -919,10 +920,10 @@ private void validate(APIAttachL3NetworkToVmMsg msg) { for (String l3Uuid : newAddedL3Uuids) { L3NetworkVO l3Vo = dbf.findByUuid(l3Uuid, L3NetworkVO.class); if (l3Vo.getState() == L3NetworkState.Disabled) { - throw new ApiMessageInterceptionException(operr("unable to attach a L3 network. The L3 network[uuid:%s] is disabled", l3Uuid)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10162, "unable to attach a L3 network. The L3 network[uuid:%s] is disabled", l3Uuid)); } if (VmInstanceConstant.USER_VM_TYPE.equals(type) && l3Vo.isSystem()) { - throw new ApiMessageInterceptionException(operr("unable to attach a L3 network. The L3 network[uuid:%s] is a system network and vm is a user vm", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10163, "unable to attach a L3 network. The L3 network[uuid:%s] is a system network and vm is a user vm", l3Uuid)); } } @@ -956,20 +957,20 @@ private void validate(APIAttachL3NetworkToVmMsg msg) { } if (!found) { - throw new ApiMessageInterceptionException(argerr("the static IP[%s] is not in any IP range of the L3 network[uuid:%s]", msg.getStaticIp(), msg.getL3NetworkUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10164, "the static IP[%s] is not in any IP range of the L3 network[uuid:%s]", msg.getStaticIp(), msg.getL3NetworkUuid())); } SimpleQuery uq = dbf.createQuery(UsedIpVO.class); uq.add(UsedIpVO_.l3NetworkUuid, Op.EQ, msg.getL3NetworkUuid()); uq.add(UsedIpVO_.ip, Op.EQ, msg.getStaticIp()); if (uq.isExists()) { - throw new ApiMessageInterceptionException(operr("the static IP[%s] has been occupied on the L3 network[uuid:%s]", msg.getStaticIp(), msg.getL3NetworkUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10165, "the static IP[%s] has been occupied on the L3 network[uuid:%s]", msg.getStaticIp(), msg.getL3NetworkUuid())); } } for (Map.Entry> e : staticIps.entrySet()) { if (!newAddedL3Uuids.contains(e.getKey())) { - throw new ApiMessageInterceptionException(argerr("static ip l3 uuid[%s] is not included in nic l3 [%s]", e.getKey(), newAddedL3Uuids)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10166, "static ip l3 uuid[%s] is not included in nic l3 [%s]", e.getKey(), newAddedL3Uuids)); } String l3Uuid = e.getKey(); @@ -999,14 +1000,14 @@ private void validate(APIAttachL3NetworkToVmMsg msg) { } if (!found) { - throw new ApiMessageInterceptionException(argerr("the static IP[%s] is not in any IP range of the L3 network[uuid:%s]", staticIp, l3Uuid)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10167, "the static IP[%s] is not in any IP range of the L3 network[uuid:%s]", staticIp, l3Uuid)); } SimpleQuery uq = dbf.createQuery(UsedIpVO.class); uq.add(UsedIpVO_.l3NetworkUuid, Op.EQ, msg.getL3NetworkUuid()); uq.add(UsedIpVO_.ip, Op.EQ, staticIp); if (uq.isExists()) { - throw new ApiMessageInterceptionException(operr("the static IP[%s] has been occupied on the L3 network[uuid:%s]", staticIp, l3Uuid)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10168, "the static IP[%s] has been occupied on the L3 network[uuid:%s]", staticIp, l3Uuid)); } } } @@ -1030,7 +1031,7 @@ private void validate(APIAttachL3NetworkToVmMsg msg) { try { vmNicParam = JSONObjectUtil.toObject(msg.getVmNicParams(), VmNicParam.class); } catch (JsonSyntaxException e) { - throw new OperationFailureException(operr("invalid json format, causes: %s", e.getMessage())); + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_10169, "invalid json format, causes: %s", e.getMessage())); } VmNicUtils.validateVmParms(Arrays.asList(vmNicParam), Arrays.asList(msg.getL3NetworkUuid()), supportNicDriverTypes); @@ -1043,14 +1044,14 @@ private void validate(APIAttachVmNicToVmMsg msg) { VmInstanceState state = vmInstanceVO.getState(); if (!VmInstanceState.Running.equals(state) && !VmInstanceState.Stopped.equals(state)) { - throw new ApiMessageInterceptionException(operr("unable to attach the nic. The vm[uuid: %s] is not Running or Stopped; the current state is %s", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10170, "unable to attach the nic. The vm[uuid: %s] is not Running or Stopped; the current state is %s", msg.getVmInstanceUuid(), state)); } VmNicVO vmNicVO = dbf.findByUuid(msg.getVmNicUuid(), VmNicVO.class); if (vmNicVO.getVmInstanceUuid() != null) { - throw new ApiMessageInterceptionException(operr("unable to attach the nic. The nic has been attached with vm[uuid: %s]", vmNicVO.getVmInstanceUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10171, "unable to attach the nic. The nic has been attached with vm[uuid: %s]", vmNicVO.getVmInstanceUuid())); } boolean exist = Q.New(VmNicVO.class) @@ -1061,12 +1062,12 @@ private void validate(APIAttachVmNicToVmMsg msg) { if (exist) { if (!VmGlobalConfig.MULTI_VNIC_SUPPORT.value(Boolean.class) || !VmInstanceConstant.USER_VM_TYPE.equals(type)) { - throw new ApiMessageInterceptionException(operr("unable to attach the nic. Its L3 network[uuid:%s] is already attached to the vm[uuid: %s]", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10172, "unable to attach the nic. Its L3 network[uuid:%s] is already attached to the vm[uuid: %s]", vmNicVO.getL3NetworkUuid(), msg.getVmInstanceUuid())); } if (!L3NetworkCategory.Private.equals(l3NetworkVO.getCategory())) { - throw new ApiMessageInterceptionException(operr("unable to attach the nic with a non-guest L3 network. Its L3 network[uuid:%s] is already attached to the vm[uuid: %s]", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10173, "unable to attach the nic with a non-guest L3 network. Its L3 network[uuid:%s] is already attached to the vm[uuid: %s]", vmNicVO.getL3NetworkUuid(), msg.getVmInstanceUuid())); } } @@ -1075,17 +1076,17 @@ private void validate(APIAttachVmNicToVmMsg msg) { boolean system = l3NetworkVO.isSystem(); if (l3state == L3NetworkState.Disabled) { - throw new ApiMessageInterceptionException(operr("unable to attach the nic. Its L3 network[uuid:%s] is disabled", l3NetworkVO.getUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10174, "unable to attach the nic. Its L3 network[uuid:%s] is disabled", l3NetworkVO.getUuid())); } if (VmInstanceConstant.USER_VM_TYPE.equals(type) && system) { - throw new ApiMessageInterceptionException(operr("unable to attach the nic. Its L3 network[uuid:%s] is a system network and vm is a user vm", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10175, "unable to attach the nic. Its L3 network[uuid:%s] is a system network and vm is a user vm", l3NetworkVO.getUuid())); } List clusterUuids = Q.New(L2NetworkClusterRefVO.class).eq(L2NetworkClusterRefVO_.l2NetworkUuid, l3NetworkVO.getL2NetworkUuid()) .select(L2NetworkClusterRefVO_.clusterUuid).listValues(); if (clusterUuids.isEmpty()) { - throw new ApiMessageInterceptionException(operr("unable to attach the nic. Its l2 network [uuid:%s] that have not been attached to any cluster", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10176, "unable to attach the nic. Its l2 network [uuid:%s] that have not been attached to any cluster", l3NetworkVO.getL2NetworkUuid())); } } @@ -1097,12 +1098,12 @@ private void validate(APIChangeVmNicStateMsg msg) { MacOperator mo = new MacOperator(); if (mo.checkDuplicateMac(nicVO.getHypervisorType(), nicVO.getL3NetworkUuid(), nicVO.getMac())) { - throw new ApiMessageInterceptionException(Platform.argerr("Duplicate mac address [%s]", nicVO.getMac())); + throw new ApiMessageInterceptionException(Platform.argerr(ORG_ZSTACK_COMPUTE_VM_10177, "Duplicate mac address [%s]", nicVO.getMac())); } } if (!nicVO.getType().equals(VmInstanceConstant.VIRTUAL_NIC_TYPE)) { - throw new ApiMessageInterceptionException(operr("could not update nic[uuid: %s] state, due to nic type[%s] not support", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10178, "could not update nic[uuid: %s] state, due to nic type[%s] not support", msg.getVmNicUuid(), nicVO.getType())); } msg.setVmInstanceUuid(nicVO.getVmInstanceUuid()); @@ -1119,7 +1120,7 @@ private void validate(APIDetachL3NetworkFromVmMsg msg) { VmInstanceState state = t.get(1, VmInstanceState.class); if (!VmInstanceState.Running.equals(state) && !VmInstanceState.Stopped.equals(state)) { - throw new ApiMessageInterceptionException(operr("unable to detach a L3 network. The vm[uuid: %s] is not Running or Stopped; the current state is %s", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10179, "unable to detach a L3 network. The vm[uuid: %s] is not Running or Stopped; the current state is %s", vmUuid, state)); } @@ -1134,7 +1135,7 @@ private void validate(APIGetVmAttachableDataVolumeMsg msg) { q.add(VmInstanceVO_.uuid, Op.EQ, msg.getVmInstanceUuid()); VmInstanceState state = q.findValue(); if (state != VmInstanceState.Stopped && state != VmInstanceState.Running) { - throw new ApiMessageInterceptionException(operr("vm[uuid:%s] can only attach volume when state is Running or Stopped, current state is %s", msg.getVmInstanceUuid(), state)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10180, "vm[uuid:%s] can only attach volume when state is Running or Stopped, current state is %s", msg.getVmInstanceUuid(), state)); } } @@ -1142,11 +1143,11 @@ private void validateRootDiskOffering(ImageMediaType imgFormat, APICreateVmInsta if (imgFormat == ImageMediaType.ISO) { if (msg.getRootDiskOfferingUuid() == null) { if (msg.getRootDiskSize() == null) { - throw new ApiMessageInterceptionException(argerr("image mediaType is ISO but missing root disk settings")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10181, "image mediaType is ISO but missing root disk settings")); } if (msg.getRootDiskSize() <= 0) { - throw new ApiMessageInterceptionException(operr("Unexpected root disk settings")); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10182, "Unexpected root disk settings")); } } } @@ -1167,14 +1168,14 @@ private void validatePsWhetherSameCluster(APICreateVmInstanceMsg msg) { clusterUuidsForRootVolume.retainAll(clusterUuidsForDataVolume); if (clusterUuidsForRootVolume.isEmpty()) { - throw new ApiMessageInterceptionException(operr("the primary storage[%s] of the root volume and the primary storage[%s] of the data volume are not in the same cluster", msg.getPrimaryStorageUuidForRootVolume(), primaryStorageUuidForDataVolume)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10183, "the primary storage[%s] of the root volume and the primary storage[%s] of the data volume are not in the same cluster", msg.getPrimaryStorageUuidForRootVolume(), primaryStorageUuidForDataVolume)); } } private void validateZoneOrClusterOrHostOrL3Exist(NewVmInstanceMessage2 msg) { if (CollectionUtils.isEmpty(msg.getL3NetworkUuids()) && StringUtils.isEmpty(msg.getZoneUuid()) && StringUtils.isEmpty(msg.getClusterUuid()) && StringUtils.isEmpty(msg.getHostUuid())) { - throw new ApiMessageInterceptionException(operr("could not create vm, because at least one of field (l3NetworkUuids,zoneUuid,clusterUuid,hostUuid) should be set")); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10184, "could not create vm, because at least one of field (l3NetworkUuids,zoneUuid,clusterUuid,hostUuid) should be set")); } } @@ -1184,7 +1185,7 @@ private void validateDataDiskSizes(APICreateVmInstanceMsg msg) throws ApiMessage } msg.getDataDiskSizes().forEach(dataDiskSize -> { if (dataDiskSize <= 0) { - throw new ApiMessageInterceptionException(operr("Unexpected data disk settings. dataDiskSizes need to be greater than 0")); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10185, "Unexpected data disk settings. dataDiskSizes need to be greater than 0")); } }); } @@ -1196,7 +1197,7 @@ private void validate(APICreateVmInstanceMsg msg) { APICreateVmInstanceMsg.DiskAO rootDiskAO = msg.getDiskAOs().stream() .filter(APICreateVmInstanceMsg.DiskAO::isBoot).findFirst().orElse(null); if (rootDiskAO == null) { - throw new ApiMessageInterceptionException(argerr("missing root disk")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10186, "missing root disk")); } msg.setPlatform(rootDiskAO.getPlatform()); msg.setGuestOsType(rootDiskAO.getGuestOsType()); @@ -1230,39 +1231,39 @@ private void validate(APICreateVmInstanceMsg msg) { } if (!err.isEmpty()) { - throw new ApiMessageInterceptionException(argerr(String.format("when imageUuid is null, %s", err))); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10187, String.format("when imageUuid is null, %s", err))); } } else { ImageState imgState = image.getState(); if (imgState == ImageState.Disabled) { - throw new ApiMessageInterceptionException(operr("image[uuid:%s] is Disabled, can't create vm from it", msg.getImageUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10188, "image[uuid:%s] is Disabled, can't create vm from it", msg.getImageUuid())); } ImageStatus imgStatus = image.getStatus(); if (imgStatus != ImageStatus.Ready) { - throw new ApiMessageInterceptionException(operr("image[uuid:%s] is not ready yet, can't create vm from it", msg.getImageUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10189, "image[uuid:%s] is not ready yet, can't create vm from it", msg.getImageUuid())); } ImageMediaType imgFormat = image.getMediaType(); if (imgFormat != ImageMediaType.RootVolumeTemplate && imgFormat != ImageMediaType.ISO) { - throw new ApiMessageInterceptionException(argerr("image[uuid:%s] is of mediaType: %s, only RootVolumeTemplate and ISO can be used to create vm", msg.getImageUuid(), imgFormat)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10190, "image[uuid:%s] is of mediaType: %s, only RootVolumeTemplate and ISO can be used to create vm", msg.getImageUuid(), imgFormat)); } boolean isSystemImage = image.isSystem(); if (isSystemImage && (msg.getType() == null || VmInstanceConstant.USER_VM_TYPE.equals(msg.getType()))) { - throw new ApiMessageInterceptionException(argerr("image[uuid:%s] is system image, can't be used to create user vm", msg.getImageUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10191, "image[uuid:%s] is system image, can't be used to create user vm", msg.getImageUuid())); } if (msg.getPlatform() == null && image.getPlatform() == null) { - throw new ApiMessageInterceptionException(operr("at least one of field platform in msg or image[uuid:%s] should be set", msg.getImageUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10192, "at least one of field platform in msg or image[uuid:%s] should be set", msg.getImageUuid())); } if (msg.getGuestOsType() == null && image.getGuestOsType() == null) { - throw new ApiMessageInterceptionException(operr("at least one of field guestOsType in msg or image[uuid:%s] should be set", msg.getImageUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10193, "at least one of field guestOsType in msg or image[uuid:%s] should be set", msg.getImageUuid())); } if (msg.getArchitecture() == null && image.getArchitecture() == null) { - throw new ApiMessageInterceptionException(operr("at least one of field architecture in msg or image[uuid:%s] should be set", msg.getImageUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10194, "at least one of field architecture in msg or image[uuid:%s] should be set", msg.getImageUuid())); } validateRootDiskOffering(imgFormat, msg); @@ -1293,7 +1294,7 @@ private void validate(APICreateVmInstanceMsg msg) { dq.add(DiskOfferingVO_.uuid, Op.IN, allDiskOfferingUuids); List diskUuids = dq.listValue(); if (!diskUuids.isEmpty()) { - throw new ApiMessageInterceptionException(operr("disk offerings[uuids:%s] are Disabled, can not create vm from it", diskUuids)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10195, "disk offerings[uuids:%s] are Disabled, can not create vm from it", diskUuids)); } } @@ -1329,7 +1330,7 @@ public void checkMutualExclusion(APICreateVmInstanceMsg.DiskAO diskAO) { } if (count > 1) { - throw new ApiMessageInterceptionException(operr("Cannot set the following properties at the same time: %s", errorMsg)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10196, "Cannot set the following properties at the same time: %s", errorMsg)); } if (count == 0) { @@ -1337,7 +1338,7 @@ public void checkMutualExclusion(APICreateVmInstanceMsg.DiskAO diskAO) { for (String key : map.keySet()) { properties.add(key); } - throw new ApiMessageInterceptionException(operr("Need to set one of the following properties, and can only be one of them: %s", properties)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10197, "Need to set one of the following properties, and can only be one of them: %s", properties)); } } @@ -1346,15 +1347,15 @@ private void validate(APICreateVmInstanceFromVolumeMsg msg) { VolumeVO volume = dbf.findByUuid(msg.getVolumeUuid(), VolumeVO.class); if (volume.isShareable()) { - throw new ApiMessageInterceptionException(operr("cannot create vm instance from a shareable volume.")); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10198, "cannot create vm instance from a shareable volume.")); } if (volume.isAttached()) { - throw new ApiMessageInterceptionException(operr("could not create vm instance from a attached volume.")); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10199, "could not create vm instance from a attached volume.")); } if (volume.getStatus() != VolumeStatus.Ready || volume.getState() != VolumeState.Enabled) { - throw new ApiMessageInterceptionException(operr("volume[uuid:%s] could not satisfy conditions[state:Enabled status:Ready]", msg.getVolumeUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10200, "volume[uuid:%s] could not satisfy conditions[state:Enabled status:Ready]", msg.getVolumeUuid())); } } @@ -1371,7 +1372,7 @@ private void validate(NewVmInstanceMessage2 msg) { boolean uniqueVmName = VmGlobalConfig.UNIQUE_VM_NAME.value(Boolean.class); if (uniqueVmName && Q.New(VmInstanceVO.class).eq(VmInstanceVO_.name, msg.getName()).isExists()) { - throw new ApiMessageInterceptionException(operr("could not create vm, a vm with the name [%s] already exists", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10201, "could not create vm, a vm with the name [%s] already exists", msg.getName())); } @@ -1384,21 +1385,21 @@ private void validate(NewVmInstanceMessage2 msg) { .findAny(); if (duplicateMac.isPresent()){ throw new ApiMessageInterceptionException(operr( - "Not allowed same mac [%s]", duplicateMac.get())); + ORG_ZSTACK_COMPUTE_VM_10202, "Not allowed same mac [%s]", duplicateMac.get())); } } if (msg.getVmNicParams() != null && !msg.getVmNicParams().isEmpty()) { List supportNicDriverTypes = nicManager.getSupportNicDriverTypes(); if (msg.getL3NetworkUuids() == null || msg.getL3NetworkUuids().isEmpty()) { - throw new ApiMessageInterceptionException(argerr("l3NetworkUuids and vmNicInventories mustn't both be empty or both be set")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10203, "l3NetworkUuids and vmNicInventories mustn't both be empty or both be set")); } List vmNicInventories; try { vmNicInventories = JSONObjectUtil.toCollection(msg.getVmNicParams(), ArrayList.class, VmNicParam.class); } catch (JsonSyntaxException e) { - throw new OperationFailureException(operr("invalid json format, causes: %s", e.getMessage())); + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_10204, "invalid json format, causes: %s", e.getMessage())); } VmNicUtils.validateVmParms(vmNicInventories, msg.getL3NetworkUuids(), supportNicDriverTypes); @@ -1410,7 +1411,7 @@ private void validate(NewVmInstanceMessage2 msg) { List uuids = new ArrayList<>(msg.getL3NetworkUuids()); List duplicateElements = getDuplicateElementsOfList(uuids); if (duplicateElements.size() > 0) { - throw new ApiMessageInterceptionException(operr("Can't add same uuid in the l3Network,uuid: %s", duplicateElements.get(0))); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10205, "Can't add same uuid in the l3Network,uuid: %s", duplicateElements.get(0))); } l3q.add(L3NetworkVO_.uuid, Op.IN, msg.getL3NetworkUuids()); @@ -1420,10 +1421,10 @@ private void validate(NewVmInstanceMessage2 msg) { Boolean system = t.get(1, Boolean.class); L3NetworkState state = t.get(2, L3NetworkState.class); if (state != L3NetworkState.Enabled) { - throw new ApiMessageInterceptionException(operr("l3Network[uuid:%s] is Disabled, can not create vm on it", l3Uuid)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10206, "l3Network[uuid:%s] is Disabled, can not create vm on it", l3Uuid)); } if (system && (msg.getType() == null || VmInstanceConstant.USER_VM_TYPE.equals(msg.getType()))) { - throw new ApiMessageInterceptionException(operr("l3Network[uuid:%s] is system network, can not create user vm on it", l3Uuid)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10207, "l3Network[uuid:%s] is system network, can not create user vm on it", l3Uuid)); } } } @@ -1442,7 +1443,7 @@ private void validate(NewVmInstanceMessage2 msg) { zq.add(ZoneVO_.uuid, Op.EQ, msg.getZoneUuid()); ZoneState zoneState = zq.findValue(); if (zoneState == ZoneState.Disabled) { - throw new ApiMessageInterceptionException(operr("zone[uuid:%s] is specified but it's Disabled, can not create vm from it", msg.getZoneUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10208, "zone[uuid:%s] is specified but it's Disabled, can not create vm from it", msg.getZoneUuid())); } } @@ -1452,7 +1453,7 @@ private void validate(NewVmInstanceMessage2 msg) { cq.add(ClusterVO_.uuid, Op.EQ, msg.getClusterUuid()); ClusterState clusterState = cq.findValue(); if (clusterState == ClusterState.Disabled) { - throw new ApiMessageInterceptionException(operr("cluster[uuid:%s] is specified but it's Disabled, can not create vm from it", msg.getClusterUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10209, "cluster[uuid:%s] is specified but it's Disabled, can not create vm from it", msg.getClusterUuid())); } } @@ -1463,12 +1464,12 @@ private void validate(NewVmInstanceMessage2 msg) { Tuple t = hq.findTuple(); HostState hostState = t.get(0, HostState.class); if (hostState == HostState.Disabled) { - throw new ApiMessageInterceptionException(operr("host[uuid:%s] is specified but it's Disabled, can not create vm from it", msg.getHostUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10210, "host[uuid:%s] is specified but it's Disabled, can not create vm from it", msg.getHostUuid())); } HostStatus connectionState = t.get(1, HostStatus.class); if (connectionState != HostStatus.Connected) { - throw new ApiMessageInterceptionException(operr("host[uuid:%s] is specified but it's connection status is %s, can not create vm from it", msg.getHostUuid(), connectionState)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10211, "host[uuid:%s] is specified but it's connection status is %s, can not create vm from it", msg.getHostUuid(), connectionState)); } } @@ -1478,11 +1479,11 @@ private void validate(NewVmInstanceMessage2 msg) { if (VmInstanceConstant.USER_VM_TYPE.equals(msg.getType())) { if (msg.getDefaultL3NetworkUuid() == null && (!CollectionUtils.isEmpty(msg.getL3NetworkUuids()) && msg.getL3NetworkUuids().size() != 1)) { - throw new ApiMessageInterceptionException(argerr("there are more than one L3 network specified in l3NetworkUuids, but defaultL3NetworkUuid is null")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10212, "there are more than one L3 network specified in l3NetworkUuids, but defaultL3NetworkUuid is null")); } else if (msg.getDefaultL3NetworkUuid() == null && (msg.getL3NetworkUuids()!= null &&msg.getL3NetworkUuids().size() == 1)) { msg.setDefaultL3NetworkUuid(msg.getL3NetworkUuids().get(0)); } else if (msg.getDefaultL3NetworkUuid() != null && !msg.getL3NetworkUuids().contains(msg.getDefaultL3NetworkUuid())) { - throw new ApiMessageInterceptionException(argerr("defaultL3NetworkUuid[uuid:%s] is not in l3NetworkUuids%s", msg.getDefaultL3NetworkUuid(), msg.getL3NetworkUuids())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10213, "defaultL3NetworkUuid[uuid:%s] is not in l3NetworkUuids%s", msg.getDefaultL3NetworkUuid(), msg.getL3NetworkUuids())); } } @@ -1513,12 +1514,12 @@ private void validateCdRomsTag(NewVmInstanceMessage msg) { for (String cdRomIsoUuid : cdRoms) { ImageVO imageVO = dbf.findByUuid(cdRomIsoUuid, ImageVO.class); if (imageVO == null) { - throw new ApiMessageInterceptionException(argerr("The image[uuid=%s] does not exist", cdRomIsoUuid)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10214, "The image[uuid=%s] does not exist", cdRomIsoUuid)); } } if (cdRoms.size() != new HashSet<>(cdRoms).size()) { - throw new ApiMessageInterceptionException(argerr("Do not allow to mount duplicate ISO")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10215, "Do not allow to mount duplicate ISO")); } } @@ -1533,7 +1534,7 @@ private void validate(APIDestroyVmInstanceMsg msg) { private void validate(APISetVmConsolePasswordMsg msg) { String pwd = msg.getConsolePassword(); if (pwd.startsWith("password")){ - throw new ApiMessageInterceptionException(argerr("The console password cannot start with 'password' which may trigger a VNC security issue")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10216, "The console password cannot start with 'password' which may trigger a VNC security issue")); } } @@ -1541,21 +1542,21 @@ private void validate(APIUpdateConsolePasswordMsg msg) { VmInstanceVO vm = dbf.findByUuid(msg.getUuid(), VmInstanceVO.class); if (vm.getState() != VmInstanceState.Running) { throw new ApiMessageInterceptionException(operr( - "Cannot update console password for VM[uuid:%s] because it is not in 'Running' state. Current state is '%s'.", + ORG_ZSTACK_COMPUTE_VM_10217, "Cannot update console password for VM[uuid:%s] because it is not in 'Running' state. Current state is '%s'.", vm.getUuid(), vm.getState() )); } boolean hasPassword = VmSystemTags.CONSOLE_PASSWORD.hasTag(vm.getUuid()); if (!hasPassword) { throw new ApiMessageInterceptionException(operr( - "Cannot update the console password for VM[uuid:%s] because no console password is currently set. ", + ORG_ZSTACK_COMPUTE_VM_10218, "Cannot update the console password for VM[uuid:%s] because no console password is currently set. ", vm.getUuid() )); } } private void validate(APIAttachL3NetworkToVmNicMsg msg) { - throw new ApiMessageInterceptionException(argerr("can not call this api because it's Deprecated")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10219, "can not call this api because it's Deprecated")); } private void validate(APIDeleteVmCdRomMsg msg) { @@ -1572,7 +1573,7 @@ private void validate(APISetVmInstanceDefaultCdRomMsg msg) { VmCdRomVO vmCdRomVO = dbf.findByUuid(msg.getUuid(), VmCdRomVO.class); if (vmCdRomVO.getDeviceId() == 0) { - throw new ApiMessageInterceptionException(argerr("The CdRom[%s] Already the default", vmCdRomVO.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10220, "The CdRom[%s] Already the default", vmCdRomVO.getUuid())); } } @@ -1584,7 +1585,7 @@ private void validate(APIFstrimVmMsg msg) { if (state != VmInstanceState.Running) { throw new ApiMessageInterceptionException(operr( - "vm[uuid:%s] can only fstrim when state is Running, current state is %s", msg.getUuid(), state)); + ORG_ZSTACK_COMPUTE_VM_10221, "vm[uuid:%s] can only fstrim when state is Running, current state is %s", msg.getUuid(), state)); } msg.setHostUuid(t.get(1, String.class)); } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java index 68c50b7947a..2b3c5be7dfb 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java @@ -94,6 +94,7 @@ import static org.zstack.core.Platform.*; import static org.zstack.core.progress.ProgressReportService.*; import static org.zstack.utils.CollectionDSL.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class VmInstanceBase extends AbstractVmInstance { protected static final CLogger logger = Utils.getLogger(VmInstanceBase.class); @@ -266,7 +267,7 @@ protected VmInstanceVO refreshVO(boolean noException) { } if (self == null) { - throw new OperationFailureException(operr("vm[uuid:%s, name:%s] has been deleted", vo.getUuid(), vo.getName())); + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_10264, "vm[uuid:%s, name:%s] has been deleted", vo.getUuid(), vo.getName())); } originalCopy = ObjectUtils.newAndCopy(vo, vo.getClass()); @@ -431,7 +432,7 @@ public void run(MessageReply r) { it.getKey(), it.getValue().getRunningTask().get(0).getName())) .collect(Collectors.toList()); if (!hasTaskVols.isEmpty()) { - bus.replyErrorByMessageType((Message) msg, operr(Strings.join(hasTaskVols, ';'))); + bus.replyErrorByMessageType((Message) msg, operr(ORG_ZSTACK_COMPUTE_VM_10265, Strings.join(hasTaskVols, ';'))); return; } @@ -642,7 +643,7 @@ public void success() { @Override public void fail(ErrorCode errorCode) { ExecuteCrashStrategyReply reply = new ExecuteCrashStrategyReply(); - reply.setError(err(VmErrors.REBOOT_ERROR, errorCode, errorCode.getDetails())); + reply.setError(err(ORG_ZSTACK_COMPUTE_VM_10266, VmErrors.REBOOT_ERROR, errorCode, errorCode.getDetails())); bus.reply(msg, reply); chain.next(); } @@ -664,14 +665,14 @@ protected void executeCrashStrategy(final Message fmsg, final Completion complet @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { - completion.fail(operr("failed to check state of the vm[uuid:%s] on the host[uuid:%s], %s", vmInv.getUuid(), vmInv.getHostUuid(), reply.getError())); + completion.fail(operr(ORG_ZSTACK_COMPUTE_VM_10267, "failed to check state of the vm[uuid:%s] on the host[uuid:%s], %s", vmInv.getUuid(), vmInv.getHostUuid(), reply.getError())); return; } CheckVmStateOnHypervisorReply r = reply.castReply(); String state = r.getStates().get(vmInv.getUuid()); if (state == null) { - completion.fail(operr("got an unrecognized state of the vm[uuid:%s] on the host[uuid:%s]", vmInv.getUuid(), vmInv.getHostUuid())); + completion.fail(operr(ORG_ZSTACK_COMPUTE_VM_10268, "got an unrecognized state of the vm[uuid:%s] on the host[uuid:%s]", vmInv.getUuid(), vmInv.getHostUuid())); return; } if (!state.equals(VmInstanceState.Crashed.toString())) { @@ -1059,7 +1060,7 @@ public VmNicVO call(VmNicVO arg) { }); if (targetNic == null) { - throw new OperationFailureException(operr("the vm[uuid:%s] has no nic on the L3 network[uuid:%s]", self.getUuid(), l3Uuid)); + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_10269, "the vm[uuid:%s] has no nic on the L3 network[uuid:%s]", self.getUuid(), l3Uuid)); } /* if static ip is same to nic, do nothing */ @@ -1421,7 +1422,7 @@ private void vmStateChangeOnHost(final VmStateChangedOnHostMsg msg, final NoErro final VmStateChangedOnHostReply reply = new VmStateChangedOnHostReply(); if (refreshVO(true) == null) { // the vm has been deleted - reply.setError(operr("the vm has been deleted")); + reply.setError(operr(ORG_ZSTACK_COMPUTE_VM_10270, "the vm has been deleted")); bus.reply(msg, reply); completion.done(); return; @@ -2752,7 +2753,7 @@ public void success() { @Override public void fail(ErrorCode errorCode) { RebootVmInstanceReply reply = new RebootVmInstanceReply(); - reply.setError(err(VmErrors.REBOOT_ERROR, errorCode, errorCode.getDetails())); + reply.setError(err(ORG_ZSTACK_COMPUTE_VM_10271, VmErrors.REBOOT_ERROR, errorCode, errorCode.getDetails())); bus.reply(msg, reply); chain.next(); } @@ -2792,7 +2793,7 @@ public void success() { @Override public void fail(ErrorCode errorCode) { StopVmInstanceReply reply = new StopVmInstanceReply(); - reply.setError(err(VmErrors.STOP_ERROR, errorCode, errorCode.getDetails())); + reply.setError(err(ORG_ZSTACK_COMPUTE_VM_10272, VmErrors.STOP_ERROR, errorCode, errorCode.getDetails())); bus.reply(msg, reply); chain.next(); } @@ -2844,7 +2845,7 @@ private void createTemplateFromRootVolume(final CreateTemplateFromRootVolumeVmMs msg.getRootVolumeInventory().getPrimaryStorageUuid()); bus.send(cmsg, new CloudBusCallBack(chain) { private void fail(ErrorCode errorCode) { - reply.setError(operr(errorCode, "failed to create template from root volume[uuid:%s] on primary storage[uuid:%s]", + reply.setError(operr(ORG_ZSTACK_COMPUTE_VM_10273, errorCode, "failed to create template from root volume[uuid:%s] on primary storage[uuid:%s]", msg.getRootVolumeInventory().getUuid(), msg.getRootVolumeInventory().getPrimaryStorageUuid())); logger.warn(reply.getError().getDetails()); bus.reply(msg, reply); @@ -2915,7 +2916,7 @@ public void run(MessageReply reply) { AttachNicToVmReply r = new AttachNicToVmReply(); if (!reply.isSuccess()) { - r.setError(err(VmErrors.ATTACH_NETWORK_ERROR, r.getError(), r.getError().getDetails())); + r.setError(err(ORG_ZSTACK_COMPUTE_VM_10274, VmErrors.ATTACH_NETWORK_ERROR, r.getError(), r.getError().getDetails())); } bus.reply(msg, r); } @@ -3916,7 +3917,7 @@ private void handle(APIGetVmDeviceAddressMsg msg) { APIGetVmDeviceAddressReply reply = new APIGetVmDeviceAddressReply(); GetVmDeviceAddressMsg gmsg = new GetVmDeviceAddressMsg(); if (self.getHostUuid() == null || self.getState() != VmInstanceState.Running) { - reply.setError(operr("VM[uuid:%s] state is not Running.", msg.getUuid())); + reply.setError(operr(ORG_ZSTACK_COMPUTE_VM_10275, "VM[uuid:%s] state is not Running.", msg.getUuid())); bus.reply(msg, reply); return; } @@ -4224,7 +4225,7 @@ public void run(SyncTaskChain chain) { if (self.getHostUuid() == null) { throw new OperationFailureException(operr( - "cannot update console password of vm[uuid:%s], the vm is not running on any host", + ORG_ZSTACK_COMPUTE_VM_10276, "cannot update console password of vm[uuid:%s], the vm is not running on any host", self.getUuid() )); } @@ -5111,7 +5112,7 @@ private void checkIfIsoAttachable(String isoUuid) { } } - throw new OperationFailureException(operr("the ISO[uuid:%s] is on backup storage that is not compatible of the primary storage[uuid:%s]" + + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_10277, "the ISO[uuid:%s] is on backup storage that is not compatible of the primary storage[uuid:%s]" + " where the VM[name:%s, uuid:%s] is on", isoUuid, psUuid, self.getName(), self.getUuid())); } @@ -5504,7 +5505,7 @@ private void changeOffering(APIChangeInstanceOfferingMsg msg, final Completion c @Override public void run(MessageReply innerReply) { if (!innerReply.isSuccess()) { - completion.fail(Platform.operr(innerReply.getError(), + completion.fail(Platform.operr(ORG_ZSTACK_COMPUTE_VM_10278, innerReply.getError(), "Failed to update vm[uuid=%s] on hypervisor.", self.getUuid())); return; } @@ -5522,7 +5523,7 @@ public void run(MessageReply innerReply) { } final ErrorCodeList list = new ErrorCodeList(); list.getCauses().addAll(casedReply.getIgnoredErrors()); - completion.fail(Platform.operr(list, + completion.fail(Platform.operr(ORG_ZSTACK_COMPUTE_VM_10279, list, "Failed to update vm[uuid=%s] on hypervisor: The modification of some properties failed", self.getUuid())); } @@ -5552,7 +5553,7 @@ public void run(FlowTrigger trigger, Map data) { Boolean unique = VmGlobalConfig.UNIQUE_VM_NAME.value(Boolean.class); boolean exists = Q.New(VmInstanceVO.class).eq(VmInstanceVO_.name, msg.getName()).notEq(VmInstanceVO_.uuid, self.getUuid()).isExists(); if (unique && exists) { - trigger.fail(operr("could not create vm, a vm with the name [%s] already exists", msg.getName())); + trigger.fail(operr(ORG_ZSTACK_COMPUTE_VM_10280, "could not create vm, a vm with the name [%s] already exists", msg.getName())); return; } self.setName(msg.getName()); @@ -5652,7 +5653,7 @@ public void run(FlowTrigger trigger, Map data) { @Override public void run(MessageReply innerReply) { if (!innerReply.isSuccess()) { - trigger.fail(Platform.operr(innerReply.getError(), + trigger.fail(Platform.operr(ORG_ZSTACK_COMPUTE_VM_10281, innerReply.getError(), "failed to update vm[uuid=%s] on hypervisor", self.getUuid())); return; } @@ -5666,7 +5667,7 @@ public void run(MessageReply innerReply) { } final ErrorCodeList list = new ErrorCodeList(); list.getCauses().addAll(casedReply.getIgnoredErrors()); - trigger.fail(Platform.operr(list, + trigger.fail(Platform.operr(ORG_ZSTACK_COMPUTE_VM_10282, list, "failed to update vm[uuid=%s] on hypervisor: The modification of some properties failed", self.getUuid())); } @@ -5775,7 +5776,7 @@ private void updateVmIsoFirstOrder(List systemTags) { String vmUuid = self.getUuid(); List isoList = IsoOperator.getIsoUuidByVmUuid(vmUuid); if (!isoList.contains(isoUuid)) { - throw new OperationFailureException(operr("ISO[uuid:%s] is not attached to VM[uuid:%s]", isoUuid, self.getUuid())); + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_10283, "ISO[uuid:%s] is not attached to VM[uuid:%s]", isoUuid, self.getUuid())); } List cdRomVOS = Q.New(VmCdRomVO.class) @@ -6693,7 +6694,7 @@ private void detachVolume(final DetachDataVolumeFromVmMsg msg, final Completion ErrorCode allowed = validateOperationByState(msg, self.getState(), VmErrors.DETACH_VOLUME_ERROR); if (allowed != null) { - completion.fail(operr("Detaching volume is not allowed when VM[uuid=%s] is in state[%s]", + completion.fail(operr(ORG_ZSTACK_COMPUTE_VM_10284, "Detaching volume is not allowed when VM[uuid=%s] is in state[%s]", self.getUuid(), self.getState())); return; } @@ -6811,7 +6812,7 @@ public void handle(Map data) { }).error(new FlowErrorHandler(completion) { @Override public void handle(ErrorCode errCode, Map data) { - completion.fail(operr(errCode, "Failed to detach volume[uuid=%s] of VM[uuid=%s]", + completion.fail(operr(ORG_ZSTACK_COMPUTE_VM_10285, errCode, "Failed to detach volume[uuid=%s] of VM[uuid=%s]", msg.getVolume().getUuid(), self.getUuid())); } }).start(); @@ -6902,7 +6903,7 @@ private void sendEvent() { @Override public void handle(final ErrorCode errCode, Map data) { extEmitter.failedToAttachVolume(getSelfInventory(), volume, errCode, data); - reply.setError(err(VmErrors.ATTACH_VOLUME_ERROR, errCode, errCode.getDetails())); + reply.setError(err(ORG_ZSTACK_COMPUTE_VM_10286, VmErrors.ATTACH_VOLUME_ERROR, errCode, errCode.getDetails())); bus.reply(msg, reply); completion.done(); } @@ -7300,7 +7301,7 @@ public L3NetworkInventory call(L3NetworkInventory arg) { if (l3 == null) { throw new OperationFailureException(operr( - "Unable to find L3Network[uuid:%s] to start the current vm, it may have been deleted, " + + ORG_ZSTACK_COMPUTE_VM_10287, "Unable to find L3Network[uuid:%s] to start the current vm, it may have been deleted, " + "Operation suggestion: delete this vm, recreate a new vm", inv.getUuid())); } l3s.add(l3); @@ -7453,7 +7454,7 @@ private List buildVmCdRomSpecsForNewCreated(VmInstanceSpec vmSpec) { int max = VmGlobalConfig.MAXIMUM_CD_ROM_NUM.value(Integer.class); if (cdRomSpecs.size() > max) { - throw new OperationFailureException(operr("One vm cannot create %s CDROMs, vm can only add %s CDROMs", cdRomSpecs.size(), max)); + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_10288, "One vm cannot create %s CDROMs, vm can only add %s CDROMs", cdRomSpecs.size(), max)); } return cdRomSpecs; @@ -7544,7 +7545,7 @@ public void handle(final ErrorCode errCode, Map data) { logger.warn(e.getMessage()); } - completion.fail(operr(errCode, errCode.getDetails())); + completion.fail(operr(ORG_ZSTACK_COMPUTE_VM_10289, errCode, errCode.getDetails())); } }).start(); } @@ -7563,7 +7564,7 @@ public void success() { @Override public void fail(ErrorCode errorCode) { StartVmInstanceReply reply = new StartVmInstanceReply(); - reply.setError(err(VmErrors.START_ERROR, errorCode, errorCode.getDetails())); + reply.setError(err(ORG_ZSTACK_COMPUTE_VM_10290, VmErrors.START_ERROR, errorCode, errorCode.getDetails())); bus.reply(msg, reply); taskChain.next(); } @@ -7587,7 +7588,7 @@ public void success() { @Override public void fail(ErrorCode errorCode) { APIStartVmInstanceEvent evt = new APIStartVmInstanceEvent(msg.getId()); - evt.setError(err(VmErrors.START_ERROR, errorCode, errorCode.getDetails())); + evt.setError(err(ORG_ZSTACK_COMPUTE_VM_10291, VmErrors.START_ERROR, errorCode, errorCode.getDetails())); bus.publish(evt); taskChain.next(); } @@ -7699,7 +7700,7 @@ public void handle(Map data) { }).error(new FlowErrorHandler(msg) { @Override public void handle(ErrorCode errCode, Map data) { - completion.fail(err(SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); + completion.fail(err(ORG_ZSTACK_COMPUTE_VM_10292, SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); } }).start(); } @@ -7733,7 +7734,7 @@ protected void buildImageSpec(VmInstanceSpec spec) { .listValues(); if (resultList.isEmpty()) { - throw new OperationFailureException(operr("no way to get image size of %s, report exception.", spec.getVmInventory().getImageUuid())); + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_10293, "no way to get image size of %s, report exception.", spec.getVmInventory().getImageUuid())); } } @@ -8002,7 +8003,7 @@ public void success() { @Override public void fail(ErrorCode errorCode) { APIRebootVmInstanceEvent evt = new APIRebootVmInstanceEvent(msg.getId()); - evt.setError(err(VmErrors.REBOOT_ERROR, errorCode, errorCode.getDetails())); + evt.setError(err(ORG_ZSTACK_COMPUTE_VM_10294, VmErrors.REBOOT_ERROR, errorCode, errorCode.getDetails())); bus.publish(evt); taskChain.next(); } @@ -8019,7 +8020,7 @@ protected void handle(final APIRebootVmInstanceMsg msg) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { - evt.setError(err(VmErrors.REBOOT_ERROR, reply.getError(), reply.getError().getDetails())); + evt.setError(err(ORG_ZSTACK_COMPUTE_VM_10295, VmErrors.REBOOT_ERROR, reply.getError(), reply.getError().getDetails())); } else { refreshVO(); evt.setInventory(getSelfInventory()); @@ -8044,7 +8045,7 @@ public void success() { @Override public void fail(ErrorCode errorCode) { APIStopVmInstanceEvent evt = new APIStopVmInstanceEvent(msg.getId()); - evt.setError(err(VmErrors.STOP_ERROR, errorCode, errorCode.getDetails())); + evt.setError(err(ORG_ZSTACK_COMPUTE_VM_10296, VmErrors.STOP_ERROR, errorCode, errorCode.getDetails())); bus.publish(evt); taskChain.next(); } @@ -8181,7 +8182,7 @@ public void success() { @Override public void fail(ErrorCode errorCode) { APIPauseVmInstanceEvent evt = new APIPauseVmInstanceEvent(msg.getId()); - evt.setError(err(VmErrors.SUSPEND_ERROR, errorCode, errorCode.getDetails())); + evt.setError(err(ORG_ZSTACK_COMPUTE_VM_10297, VmErrors.SUSPEND_ERROR, errorCode, errorCode.getDetails())); bus.publish(evt); taskChain.next(); } @@ -8261,7 +8262,7 @@ public void success() { @Override public void fail(ErrorCode errorCode) { APIResumeVmInstanceEvent evt = new APIResumeVmInstanceEvent(msg.getId()); - evt.setError(err(VmErrors.RESUME_ERROR, errorCode, errorCode.getDetails())); + evt.setError(err(ORG_ZSTACK_COMPUTE_VM_10298, VmErrors.RESUME_ERROR, errorCode, errorCode.getDetails())); bus.publish(evt); taskChain.next(); } @@ -8282,7 +8283,7 @@ public void success() { @Override public void fail(ErrorCode errorCode) { CheckAndStartVmInstanceReply reply = new CheckAndStartVmInstanceReply(); - reply.setError(err(VmErrors.START_ERROR, errorCode, errorCode.getDetails())); + reply.setError(err(ORG_ZSTACK_COMPUTE_VM_10299, VmErrors.START_ERROR, errorCode, errorCode.getDetails())); bus.reply(msg, reply); taskChain.next(); } @@ -8482,7 +8483,7 @@ private void doCreateVmCdRom(CreateVmCdRomMsg msg, ReturnValueCompletion= max) { - completion.fail(operr("VM[uuid:%s] can only add %s CDROMs", msg.getVmInstanceUuid(), max)); + completion.fail(operr(ORG_ZSTACK_COMPUTE_VM_10302, "VM[uuid:%s] can only add %s CDROMs", msg.getVmInstanceUuid(), max)); return; } @@ -8609,7 +8610,7 @@ private void updateVmPriority(APIUpdateVmPriorityMsg msg, Completion completion) @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { - ErrorCode err = operr("update vm[%s] priority to [%s] failed,because %s", + ErrorCode err = operr(ORG_ZSTACK_COMPUTE_VM_10303, "update vm[%s] priority to [%s] failed,because %s", self.getUuid(), msg.getPriority(), reply.getError()); completion.fail(err); return; @@ -8823,7 +8824,7 @@ private void handle(ReimageVmInstanceMsg msg) { { if (self.getState() != VmInstanceState.Stopped) { throw new ApiMessageInterceptionException(err( - VmErrors.RE_IMAGE_VM_NOT_IN_STOPPED_STATE, + ORG_ZSTACK_COMPUTE_VM_10304, VmErrors.RE_IMAGE_VM_NOT_IN_STOPPED_STATE, "unable to reset volume[uuid:%s] to origin image[uuid:%s]," + " the vm[uuid:%s] volume attached to is not in Stopped state, current state is %s", self.getRootVolumeUuid(), self.getImageUuid(), @@ -8841,7 +8842,7 @@ private void handle(ReimageVmInstanceMsg msg) { ImageConstant.ImageMediaType imageMediaType = q.findValue(); if (imageMediaType == null) { throw new OperationFailureException(err( - VmErrors.RE_IMAGE_CANNOT_FIND_IMAGE_CACHE, + ORG_ZSTACK_COMPUTE_VM_10305, VmErrors.RE_IMAGE_CANNOT_FIND_IMAGE_CACHE, "unable to reset volume[uuid:%s] to origin image[uuid:%s]," + " cannot find image cache.", rootVolume.getUuid(), rootVolume.getRootImageUuid() @@ -8849,7 +8850,7 @@ private void handle(ReimageVmInstanceMsg msg) { } if (imageMediaType.toString().equals("ISO")) { throw new OperationFailureException(err( - VmErrors.RE_IMAGE_IMAGE_MEDIA_TYPE_SHOULD_NOT_BE_ISO, + ORG_ZSTACK_COMPUTE_VM_10306, VmErrors.RE_IMAGE_IMAGE_MEDIA_TYPE_SHOULD_NOT_BE_ISO, "unable to reset volume[uuid:%s] to origin image[uuid:%s]," + " for image type is ISO", rootVolume.getUuid(), rootVolume.getRootImageUuid() diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceExtensionPointEmitter.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceExtensionPointEmitter.java index e45294b5fa3..b4e66919d1d 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceExtensionPointEmitter.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceExtensionPointEmitter.java @@ -25,6 +25,7 @@ import java.util.Map; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class VmInstanceExtensionPointEmitter implements Component { private static final CLogger logger = Utils.getLogger(VmInstanceExtensionPointEmitter.class); @@ -67,7 +68,7 @@ public ErrorCode preStartNewCreatedVm(VmInstanceInventory inv) { try { String err = ext.preStartNewCreatedVm(inv); if (err != null) { - return operr("VmInstanceStartNewCreatedVmExtensionPoint[%s] refuses to create vm[uuid:%s] because %s", + return operr(ORG_ZSTACK_COMPUTE_VM_10317, "VmInstanceStartNewCreatedVmExtensionPoint[%s] refuses to create vm[uuid:%s] because %s", ext.getClass().getName(), inv.getUuid(), err); } } catch (Exception e) { @@ -194,7 +195,7 @@ public ErrorCode preRebootVm(final VmInstanceInventory inv) { try { String err = ext.preRebootVm(inv); if (err != null) { - return operr("VmInstanceRebootExtensionPoint[%s] refuses to reboot vm[uuid:%s] because %s", ext.getClass().getName(), + return operr(ORG_ZSTACK_COMPUTE_VM_10318, "VmInstanceRebootExtensionPoint[%s] refuses to reboot vm[uuid:%s] because %s", ext.getClass().getName(), inv.getUuid(), err); } } catch (Exception e) { @@ -236,7 +237,7 @@ public ErrorCode preDestroyVm(VmInstanceInventory inv) { try { String err = ext.preDestroyVm(inv); if (err != null) { - return operr("VmInstanceDestroyVmExtensionPoint[%s] refuses to destroy vm[uuid:%s] because %s", ext.getClass().getName(), inv.getUuid(), err); + return operr(ORG_ZSTACK_COMPUTE_VM_10319, "VmInstanceDestroyVmExtensionPoint[%s] refuses to destroy vm[uuid:%s] because %s", ext.getClass().getName(), inv.getUuid(), err); } } catch (Exception e) { logger.warn(String.format("Unhandled exception while calling %s", ext.getClass().getName()), e); @@ -286,7 +287,7 @@ public ErrorCode preStartVm(VmInstanceInventory inv) { try { String err = ext.preStartVm(inv); if (err != null) { - return operr("VmInstanceStartExtensionPoint[%s] refuses to start vm[uuid:%s] because %s", ext.getClass().getName(), + return operr(ORG_ZSTACK_COMPUTE_VM_10320, "VmInstanceStartExtensionPoint[%s] refuses to start vm[uuid:%s] because %s", ext.getClass().getName(), inv.getUuid(), err); } } catch (Exception e) { diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java index db203212e81..34f2219d193 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java @@ -98,6 +98,7 @@ import static org.zstack.utils.CollectionDSL.*; import static org.zstack.utils.CollectionUtils.merge; import static org.zstack.utils.CollectionUtils.transformToList; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class VmInstanceManagerImpl extends AbstractService implements VmInstanceManager, @@ -304,7 +305,7 @@ private void handle(APIGetSpiceCertificatesMsg msg) { if (StringUtils.isNotEmpty(certificateStr)) { reply.setCertificateStr(certificateStr); } else { - reply.setError(operr("Spice certificate does not exist, Please check if spice tls is enabled")); + reply.setError(operr(ORG_ZSTACK_COMPUTE_VM_10232, "Spice certificate does not exist, Please check if spice tls is enabled")); } bus.reply(msg, reply); } @@ -527,7 +528,7 @@ private List getInterdependentL3NetworksByImageUuid(APIGetIn } if (bss.isEmpty()) { - throw new OperationFailureException(argerr("the image[uuid:%s] is not on any backup storage that has been attached to the zone[uuid:%s]", + throw new OperationFailureException(argerr(ORG_ZSTACK_COMPUTE_VM_10233, "the image[uuid:%s] is not on any backup storage that has been attached to the zone[uuid:%s]", msg.getImageUuid(), msg.getZoneUuid())); } @@ -599,7 +600,7 @@ private List getInterdependentL3NetworksByBackupStorageUuids if (l3s.isEmpty()) { if (psUuids.isEmpty()) { if (raiseException) { - throw new OperationFailureException(argerr("no primary storage accessible to the backup storage[uuid:%s, type:%s] is found", + throw new OperationFailureException(argerr(ORG_ZSTACK_COMPUTE_VM_10234, "no primary storage accessible to the backup storage[uuid:%s, type:%s] is found", bss.get(0).getUuid(), bss.get(0).getType())); } logger.warn(String.format("no primary storage accessible to the backup storage[uuid:%s, type:%s] is found", @@ -620,7 +621,7 @@ private List getInterdependentL3NetworksByBackupStorageUuids if (clusterNum == null || clusterNum == 0) { if (raiseException) { - throw new OperationFailureException(argerr("the primary storages[uuids:%s] has not attached any cluster on the zone[uuid:%s]", + throw new OperationFailureException(argerr(ORG_ZSTACK_COMPUTE_VM_10235, "the primary storages[uuids:%s] has not attached any cluster on the zone[uuid:%s]", psUuids, zoneUuid)); } logger.warn(String.format("the primary storages[uuids:%s] has not attached any cluster on the zone[uuid:%s]", psUuids, zoneUuid)); @@ -639,7 +640,7 @@ private List getInterdependentL3NetworksByBackupStorageUuids .find(); if (l2Num == null || l2Num == 0) { if (raiseException) { - throw new OperationFailureException(argerr("no l2Networks found in clusters that have attached to primary storages[uuids:%s]", + throw new OperationFailureException(argerr(ORG_ZSTACK_COMPUTE_VM_10236, "no l2Networks found in clusters that have attached to primary storages[uuids:%s]", psUuids)); } logger.warn(String.format("no l2Networks found in clusters that have attached to primary storages[uuids:%s]", psUuids)); @@ -712,7 +713,7 @@ private void handle(APIGetCandidateZonesClustersHostsForCreatingVmMsg msg) { amsg.setRequiredBackupStorageUuid(image.getBackupStorageRefs().iterator().next().getBackupStorageUuid()); } else { if (msg.getZoneUuid() == null) { - throw new OperationFailureException(argerr("zoneUuid must be set because the image[name:%s, uuid:%s] is on multiple backup storage", + throw new OperationFailureException(argerr(ORG_ZSTACK_COMPUTE_VM_10237, "zoneUuid must be set because the image[name:%s, uuid:%s] is on multiple backup storage", image.getName(), image.getUuid())); } @@ -1145,7 +1146,7 @@ private void instantiateTagsForCreateMessage(final CreateVmInstanceMsg msg, fina private List extEmitterHandleSystemTag(final CreateVmInstanceMsg msg, final APICreateMessage cmsg, VmInstanceVO finalVo) { List result = Collections.emptyList(); if (msg == null) { - result.add(operr("CreateVmInstanceMsg cannot be null")); + result.add(operr(ORG_ZSTACK_COMPUTE_VM_10238, "CreateVmInstanceMsg cannot be null")); return result; } else if (cmsg != null && cmsg.getSystemTags() != null && !cmsg.getSystemTags().isEmpty()) { return extEmitter.handleSystemTag(finalVo.getUuid(), cmsg.getSystemTags()); @@ -1158,7 +1159,7 @@ private List extEmitterHandleSystemTag(final CreateVmInstanceMsg msg, private List extEmitterHandleSshKeyPair(final CreateVmInstanceMsg msg, final APICreateMessage cmsg, VmInstanceVO finalVo) { List result = Collections.emptyList(); if (msg == null) { - result.add(operr("CreateVmInstanceMsg cannot be null")); + result.add(operr(ORG_ZSTACK_COMPUTE_VM_10239, "CreateVmInstanceMsg cannot be null")); return result; } else if (msg.getSshKeyPairUuids() != null && !msg.getSshKeyPairUuids().isEmpty()) { return extEmitter.associateSshKeyPair(finalVo.getUuid(), msg.getSshKeyPairUuids()); @@ -1234,7 +1235,7 @@ public void run(FlowTrigger trigger, Map data) { try { instantiateTagsForCreateMessage(msg, cmsg, finalVo); } catch (Exception e) { - errorCodes.add(operr("instantiate system tag for vm failed because %s", e.getMessage())); + errorCodes.add(operr(ORG_ZSTACK_COMPUTE_VM_10240, "instantiate system tag for vm failed because %s", e.getMessage())); } if (!errorCodes.isEmpty()) { trigger.fail(errorCodes.get(0)); @@ -1243,7 +1244,7 @@ public void run(FlowTrigger trigger, Map data) { errorCodes = extEmitterHandleSystemTag(msg, cmsg, finalVo); if (!errorCodes.isEmpty()) { - trigger.fail(operr("handle system tag fail when creating vm because [%s]", + trigger.fail(operr(ORG_ZSTACK_COMPUTE_VM_10241, "handle system tag fail when creating vm because [%s]", StringUtils.join(errorCodes.stream().map(ErrorCode::getDescription).collect(Collectors.toList()), ", "))); return; @@ -1268,7 +1269,7 @@ public void rollback(FlowRollback trigger, Map data) { public void run(FlowTrigger trigger, Map data) { errorCodes = extEmitterHandleSshKeyPair(msg, cmsg, finalVo); if (!errorCodes.isEmpty()) { - trigger.fail(operr("handle sshkeypair fail when creating vm because [%s]", + trigger.fail(operr(ORG_ZSTACK_COMPUTE_VM_10242, "handle sshkeypair fail when creating vm because [%s]", StringUtils.join(errorCodes.stream().map(ErrorCode::getDetails).collect(Collectors.toList()), ", "))); return; @@ -1715,7 +1716,7 @@ public void beforeUpdateExtensionPoint(GlobalConfig oldConfig, String newValue) } for (Tuple tuple: tuples) { if (tuple.get(2, Long.class) > 1) { - throw new ApiMessageInterceptionException(operr("unable to enable this function. There are multi nics of L3 network[uuid:%s] in the vm[uuid: %s]", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10243, "unable to enable this function. There are multi nics of L3 network[uuid:%s] in the vm[uuid: %s]", tuple.get(0, String.class), tuple.get(1, String.class))); } } @@ -1749,7 +1750,7 @@ class HostNameValidator implements SystemTagCreateMessageValidator, SystemTagVal private void validateHostname(String tag, String hostname) { DomainValidator domainValidator = DomainValidator.getInstance(true); if (!domainValidator.isValid(hostname)) { - throw new ApiMessageInterceptionException(argerr("hostname[%s] specified in system tag[%s] is not a valid domain name", hostname, tag)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10244, "hostname[%s] specified in system tag[%s] is not a valid domain name", hostname, tag)); } } @@ -1761,7 +1762,7 @@ public void validateSystemTagInCreateMessage(APICreateMessage cmsg) { for (String sysTag : msg.getSystemTags()) { if (VmSystemTags.HOSTNAME.isMatch(sysTag)) { if (++hostnameCount > 1) { - throw new ApiMessageInterceptionException(argerr("only one hostname system tag is allowed, but %s got", hostnameCount)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10245, "only one hostname system tag is allowed, but %s got", hostnameCount)); } String hostname = VmSystemTags.HOSTNAME.getTokenByTag(sysTag, VmSystemTags.HOSTNAME_TOKEN); @@ -1790,7 +1791,7 @@ private void validateHostNameOnDefaultL3Network(String tag, String hostname, Str if (!vos.isEmpty()) { SystemTagVO sameTag = vos.get(0); - throw new ApiMessageInterceptionException(argerr("conflict hostname in system tag[%s];" + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10246, "conflict hostname in system tag[%s];" + " there has been a VM[uuid:%s] having hostname[%s] on L3 network[uuid:%s]", tag, sameTag.getResourceUuid(), hostname, l3Uuid)); } @@ -1817,7 +1818,7 @@ private void validateBootOrder(String systemTag) { try { VmBootDevice.valueOf(o); } catch (IllegalArgumentException e) { - throw new OperationFailureException(argerr("invalid boot device[%s] in boot order[%s]", o, order)); + throw new OperationFailureException(argerr(ORG_ZSTACK_COMPUTE_VM_10247, "invalid boot device[%s] in boot order[%s]", o, order)); } } } @@ -1833,7 +1834,7 @@ private void validateBootOrder(String systemTag) { try { Integer.valueOf(sockets); } catch (NumberFormatException e) { - throw new ApiMessageInterceptionException(argerr("cpuSockets must be an integer")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10248, "cpuSockets must be an integer")); } }); @@ -1842,7 +1843,7 @@ private void validateBootOrder(String systemTag) { try { Integer.valueOf(cores); } catch (NumberFormatException e) { - throw new ApiMessageInterceptionException(argerr("cpuCores must be an integer")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10249, "cpuCores must be an integer")); } }); @@ -1851,7 +1852,7 @@ private void validateBootOrder(String systemTag) { try { Integer.valueOf(threads); } catch (NumberFormatException e) { - throw new ApiMessageInterceptionException(argerr("cpuThreads must be an integer")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10250, "cpuThreads must be an integer")); } }); } @@ -1863,7 +1864,7 @@ private void check(String resourceUuid, Class resourceType) { int existUserdataTagCount = VmSystemTags.USERDATA.getTags(resourceUuid, resourceType).size(); if (existUserdataTagCount > 0) { throw new OperationFailureException(argerr( - "Already have one userdata systemTag for vm[uuid: %s].", + ORG_ZSTACK_COMPUTE_VM_10251, "Already have one userdata systemTag for vm[uuid: %s].", resourceUuid)); } } @@ -1896,7 +1897,7 @@ public void validateSystemTagInCreateMessage(APICreateMessage msg) { if (VmSystemTags.USERDATA.isMatch(sysTag)) { if (userdataTagCount > 0) { throw new OperationFailureException(argerr( - "Shouldn't be more than one userdata systemTag for one vm.")); + ORG_ZSTACK_COMPUTE_VM_10252, "Shouldn't be more than one userdata systemTag for one vm.")); } userdataTagCount++; @@ -1941,7 +1942,7 @@ public void validateSystemTagInCreateMessage(APICreateMessage msg) { for (String systemTag : msg.getSystemTags()) { if (VmSystemTags.BOOT_MODE.isMatch(systemTag)) { if (++bootModeCount > 1) { - throw new ApiMessageInterceptionException(argerr("only one bootMode system tag is allowed, but %d got", bootModeCount)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10253, "only one bootMode system tag is allowed, but %d got", bootModeCount)); } String bootMode = VmSystemTags.BOOT_MODE.getTokenByTag(systemTag, VmSystemTags.BOOT_MODE_TOKEN); @@ -1960,7 +1961,7 @@ private void validateBootMode(String systemTag, String bootMode) { } if (!valid) { throw new ApiMessageInterceptionException(argerr( - "[%s] specified in system tag [%s] is not a valid boot mode", bootMode, systemTag) + ORG_ZSTACK_COMPUTE_VM_10254, "[%s] specified in system tag [%s] is not a valid boot mode", bootMode, systemTag) ); } } @@ -1996,7 +1997,7 @@ private void validateVmType(String vmUuid, String vmType) { if (!VmInstanceConstant.USER_VM_TYPE.equals(vmType)) { throw new ApiMessageInterceptionException(argerr( - "clean traffic is not supported for vm type [%s]", vmType) + ORG_ZSTACK_COMPUTE_VM_10255, "clean traffic is not supported for vm type [%s]", vmType) ); } } @@ -2026,7 +2027,7 @@ private void validateMachineType(String systemTag) { String type = VmSystemTags.MACHINE_TYPE.getTokenByTag(systemTag, VmSystemTags.MACHINE_TYPE_TOKEN); if (VmMachineType.get(type) == null) { - throw new ApiMessageInterceptionException(argerr("vm machine type requires [q35, pc, virt], but get [%s]", type)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10256, "vm machine type requires [q35, pc, virt], but get [%s]", type)); } } } @@ -2086,10 +2087,10 @@ public void validateSystemTag(String resourceUuid, Class resourceType, String sy if (tag.isMatch(systemTag)) { tokenValue = tag.getTokenByTag(systemTag, tokenName); } else { - throw new OperationFailureException(argerr("invalid %s tag[%s]", tagDescription, systemTag)); + throw new OperationFailureException(argerr(ORG_ZSTACK_COMPUTE_VM_10257, "invalid %s tag[%s]", tagDescription, systemTag)); } if (!isBoolean(tokenValue)) { - throw new OperationFailureException(argerr("invalid %s[%s], value [%s] is not boolean", tagDescription, systemTag, tokenValue)); + throw new OperationFailureException(argerr(ORG_ZSTACK_COMPUTE_VM_10258, "invalid %s[%s], value [%s] is not boolean", tagDescription, systemTag, tokenValue)); } } private boolean isBoolean(String param) { @@ -2130,10 +2131,10 @@ public void validateSystemTag(String resourceUuid, Class resourceType, String sy if (VmSystemTags.USB_REDIRECT.isMatch(systemTag)) { usbRedirectTokenByTag = VmSystemTags.USB_REDIRECT.getTokenByTag(systemTag, VmSystemTags.USB_REDIRECT_TOKEN); } else { - throw new OperationFailureException(argerr("invalid usbRedirect[%s], %s is not usbRedirect tag", systemTag, usbRedirectTokenByTag)); + throw new OperationFailureException(argerr(ORG_ZSTACK_COMPUTE_VM_10259, "invalid usbRedirect[%s], %s is not usbRedirect tag", systemTag, usbRedirectTokenByTag)); } if (!isBoolean(usbRedirectTokenByTag)) { - throw new OperationFailureException(argerr("invalid usbRedirect[%s], %s is not boolean class", systemTag, usbRedirectTokenByTag)); + throw new OperationFailureException(argerr(ORG_ZSTACK_COMPUTE_VM_10260, "invalid usbRedirect[%s], %s is not boolean class", systemTag, usbRedirectTokenByTag)); } } private boolean isBoolean(String param) { @@ -2349,7 +2350,7 @@ public List reportQuota() { } else if (msg.getRootDiskSize() != null) { allVolumeSizeAsked += msg.getRootDiskSize(); } else { - throw new ApiMessageInterceptionException(argerr("rootDiskOfferingUuid cannot be null when image mediaType is ISO")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10261, "rootDiskOfferingUuid cannot be null when image mediaType is ISO")); } } else { if (msg.getRootDiskOfferingUuid() != null) { @@ -2357,7 +2358,7 @@ public List reportQuota() { } else if (msg.getRootDiskSize() != null) { allVolumeSizeAsked += msg.getRootDiskSize(); } else { - throw new ApiMessageInterceptionException(argerr("rootDiskOfferingUuid cannot be null when create vm without image")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10262, "rootDiskOfferingUuid cannot be null when create vm without image")); } } @@ -2673,7 +2674,7 @@ private void validateAPIChangeResourceOwnerMsg(APIChangeResourceOwnerMsg msg) { vq.add(VolumeVO_.uuid, Op.EQ, ref.getResourceUuid()); vq.add(VolumeVO_.type, Op.EQ, VolumeType.Root); if (vq.isExists()) { - throw new OperationFailureException(operr("the resource[uuid:%s] is a ROOT volume, you cannot change its owner, instead," + + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_10263, "the resource[uuid:%s] is a ROOT volume, you cannot change its owner, instead," + "change the owner of the VM the root volume belongs to", ref.getResourceUuid())); } } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceUtils.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceUtils.java index ab72be07771..f0bdeded2af 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceUtils.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceUtils.java @@ -20,6 +20,7 @@ import static java.util.Objects.requireNonNull; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by Wenhao.Zhang on 22/03/10 @@ -94,7 +95,7 @@ public static UpdateVmInstanceSpec convertToSpec(UpdateVmInstanceMsg message, Vm } else if (vm.getLastHostUuid() != null) { spec.setHostUuid(vm.getLastHostUuid()); } else { - throw new OperationFailureException(Platform.operr("failed to find host of vm[uuid=%s]", vmUuid)); + throw new OperationFailureException(Platform.operr(ORG_ZSTACK_COMPUTE_VM_10070, "failed to find host of vm[uuid=%s]", vmUuid)); } if (!Objects.equals(vm.getName(), message.getName())) { @@ -127,7 +128,7 @@ public static UpdateVmInstanceSpec convertToSpec(APIChangeInstanceOfferingMsg me } else if (vm.getLastHostUuid() != null) { spec.setHostUuid(vm.getLastHostUuid()); } else { - throw new OperationFailureException(Platform.operr("failed to find host of vm[uuid=%s]", vmUuid)); + throw new OperationFailureException(Platform.operr(ORG_ZSTACK_COMPUTE_VM_10071, "failed to find host of vm[uuid=%s]", vmUuid)); } if (!Objects.equals(vm.getCpuNum(), inv.getCpuNum())) { @@ -145,16 +146,16 @@ public static void validateInstanceSettings(NewVmInstanceMessage2 msg) { if (instanceOfferingUuid == null) { if (msg.getCpuNum() == null || msg.getMemorySize() == null) { - throw new ApiMessageInterceptionException(operr("Missing CPU/memory settings")); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10072, "Missing CPU/memory settings")); } if (msg.getCpuNum() <= 0 || msg.getMemorySize() <= 0) { - throw new ApiMessageInterceptionException(operr("Unexpected CPU/memory settings")); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10073, "Unexpected CPU/memory settings")); } if (msg.getReservedMemorySize() != null) { if (msg.getReservedMemorySize() > msg.getMemorySize()) { - throw new ApiMessageInterceptionException(operr("reserved memory[%s] is greater than memory size[%s]", msg.getReservedMemorySize(), msg.getMemorySize())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10074, "reserved memory[%s] is greater than memory size[%s]", msg.getReservedMemorySize(), msg.getMemorySize())); } } else { msg.setReservedMemorySize(0L); @@ -167,11 +168,11 @@ public static void validateInstanceSettings(NewVmInstanceMessage2 msg) { InstanceOfferingVO ivo = Q.New(InstanceOfferingVO.class).eq(InstanceOfferingVO_.uuid, instanceOfferingUuid).find(); if (ivo.getState() == InstanceOfferingState.Disabled) { - throw new ApiMessageInterceptionException(operr("instance offering[uuid:%s] is Disabled, can't create vm from it", instanceOfferingUuid)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10075, "instance offering[uuid:%s] is Disabled, can't create vm from it", instanceOfferingUuid)); } if (!ivo.getType().equals(VmInstanceConstant.USER_VM_TYPE)){ - throw new ApiMessageInterceptionException(operr("instance offering[uuid:%s, type:%s] is not UserVm type, can't create vm from it", instanceOfferingUuid, ivo.getType())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_COMPUTE_VM_10076, "instance offering[uuid:%s, type:%s] is not UserVm type, can't create vm from it", instanceOfferingUuid, ivo.getType())); } msg.setCpuNum(ivo.getCpuNum()); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstantiateAttachingVolumeFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmInstantiateAttachingVolumeFlow.java index c4a42c3c551..c9dd7885386 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstantiateAttachingVolumeFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstantiateAttachingVolumeFlow.java @@ -25,6 +25,7 @@ import java.util.Map; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VmInstantiateAttachingVolumeFlow extends NoRollbackFlow { @@ -51,7 +52,7 @@ public void run(final FlowTrigger chain, final Map ctx) { .select(PrimaryStorageHostRefVO_.status) .findValue(); if (status != null && !PrimaryStorageHostStatus.Connected.equals(status)) { - chain.fail(operr("Failed to instantiate volume. Because vm's" + + chain.fail(operr(ORG_ZSTACK_COMPUTE_VM_10090, "Failed to instantiate volume. Because vm's" + " host[uuid: %s] and allocated primary storage[uuid: %s] is not connected.", spec.getDestHost().getUuid(), pinv.getUuid())); return; diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstantiateOtherDiskFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmInstantiateOtherDiskFlow.java index 26b6ce34560..19a715c9a87 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstantiateOtherDiskFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstantiateOtherDiskFlow.java @@ -35,6 +35,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) @@ -92,7 +93,7 @@ public void setup() { } else if (diskAO.getSourceUuid() != null && diskAO.getSourceType() != null) { setupAttachOtherDiskFlows(); } else { - trigger.fail(operr("the diskAO parameter is incorrect. need to set one of the following properties, " + + trigger.fail(operr(ORG_ZSTACK_COMPUTE_VM_10060, "the diskAO parameter is incorrect. need to set one of the following properties, " + "and can only be one of them: size, templateUuid, diskOfferingUuid, sourceUuid-sourceType")); } @@ -408,7 +409,7 @@ public void run(final FlowTrigger innerTrigger, Map data) { VmAttachOtherDiskExtensionPoint vmAttachOtherDiskExtensionPoint = pluginRgty .getExtensionFromMap(diskAO.getSourceType(), VmAttachOtherDiskExtensionPoint.class); if (vmAttachOtherDiskExtensionPoint == null) { - innerTrigger.fail(operr("the disk does not support attachment. disk type is %s", diskAO.getSourceType())); + innerTrigger.fail(operr(ORG_ZSTACK_COMPUTE_VM_10061, "the disk does not support attachment. disk type is %s", diskAO.getSourceType())); return; } vmAttachOtherDiskExtensionPoint.attachOtherDiskToVm(diskAO, vmUuid, new Completion(innerTrigger) { diff --git a/compute/src/main/java/org/zstack/compute/vm/VmNicFactory.java b/compute/src/main/java/org/zstack/compute/vm/VmNicFactory.java index 73193da3c37..758d217c39c 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmNicFactory.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmNicFactory.java @@ -16,6 +16,7 @@ import java.sql.SQLIntegrityConstraintViolationException; import static org.zstack.core.Platform.err; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class VmNicFactory implements VmInstanceNicFactory { private static final CLogger logger = Utils.getLogger(VmNicFactory.class); @@ -42,7 +43,7 @@ public VmNicVO createVmNic(VmNicInventory nic, VmInstanceSpec spec) { vnic.setAccountUuid(acntUuid); vnic = persistAndRetryIfMacCollision(vnic); if (vnic == null) { - throw new FlowException(err(VmErrors.ALLOCATE_MAC_ERROR, "unable to find an available mac address after re-try 5 times, too many collisions")); + throw new FlowException(err(ORG_ZSTACK_COMPUTE_VM_10089, VmErrors.ALLOCATE_MAC_ERROR, "unable to find an available mac address after re-try 5 times, too many collisions")); } vnic = dbf.reload(vnic); spec.getDestNics().add(VmNicInventory.valueOf(vnic)); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmNicManagerImpl.java b/compute/src/main/java/org/zstack/compute/vm/VmNicManagerImpl.java index df2bc6bcaf7..25c0b005d71 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmNicManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmNicManagerImpl.java @@ -34,6 +34,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VmNicManagerImpl implements VmNicManager, VmNicExtensionPoint, PrepareDbInitialValueExtensionPoint, VmPlatformChangedExtensionPoint, Component { @@ -328,7 +329,7 @@ public void validateSystemTag(String resourceUuid, Class resourceType, String sy .findValue(); if (state == VmInstanceState.Running || state == VmInstanceState.Unknown) { - throw new OperationFailureException(argerr("vm current state[%s], " + + throw new OperationFailureException(argerr(ORG_ZSTACK_COMPUTE_VM_10088, "vm current state[%s], " + "modify virtio requires the vm state[%s]", state, VmInstanceState.Stopped)); } } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmQuotaOperator.java b/compute/src/main/java/org/zstack/compute/vm/VmQuotaOperator.java index 52e10ec6cfd..10dfb0d7610 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmQuotaOperator.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmQuotaOperator.java @@ -29,6 +29,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.err; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VmQuotaOperator implements Quota.QuotaOperator { @@ -320,7 +321,7 @@ private void check(APIChangeResourceOwnerMsg msg, Map p && !vmInstanceVO.getState().equals(VmInstanceState.Running) && !vmInstanceVO.getState().equals(VmInstanceState.Paused) && !vmInstanceVO.getState().equals(VmInstanceState.Starting)) { - throw new ApiMessageInterceptionException(err(VmErrors.NOT_IN_CORRECT_STATE, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_COMPUTE_VM_10229, VmErrors.NOT_IN_CORRECT_STATE, "Incorrect VM State.VM[uuid:%s] current state:%s. ", msg.getResourceUuid(), vmInstanceVO.getState() )); @@ -534,7 +535,7 @@ private void check(APICreateVmInstanceMsg msg, Map pair } else if (msg.getRootDiskSize() != null) { allVolumeSizeAsked += msg.getRootDiskSize(); } else { - throw new ApiMessageInterceptionException(argerr("rootDiskOfferingUuid cannot be null when image mediaType is ISO")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10230, "rootDiskOfferingUuid cannot be null when image mediaType is ISO")); } } else { if (msg.getRootDiskOfferingUuid() != null) { @@ -542,7 +543,7 @@ private void check(APICreateVmInstanceMsg msg, Map pair } else if (msg.getRootDiskSize() != null) { allVolumeSizeAsked += msg.getRootDiskSize(); } else { - throw new ApiMessageInterceptionException(argerr("rootDiskOfferingUuid cannot be null when create vm without image")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_COMPUTE_VM_10231, "rootDiskOfferingUuid cannot be null when create vm without image")); } } diff --git a/compute/src/main/java/org/zstack/compute/vm/devices/VmInstanceDeviceManagerImpl.java b/compute/src/main/java/org/zstack/compute/vm/devices/VmInstanceDeviceManagerImpl.java index 6a18f251c2c..96bd11d0b37 100644 --- a/compute/src/main/java/org/zstack/compute/vm/devices/VmInstanceDeviceManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/vm/devices/VmInstanceDeviceManagerImpl.java @@ -25,6 +25,7 @@ import java.util.Map; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class VmInstanceDeviceManagerImpl implements VmInstanceDeviceManager { private static final CLogger logger = Utils.getLogger(VmInstanceDeviceManagerImpl.class); @@ -42,7 +43,7 @@ public VmInstanceDeviceAddressVO createOrUpdateVmDeviceAddress(String resourceUu } if (resourceUuid == null || vmInstanceUuid == null) { - throw new OperationFailureException(operr("missing parameter, resourceUuid: %s, vmInstanceUuid: %s is requested", resourceUuid, vmInstanceUuid)); + throw new OperationFailureException(operr(ORG_ZSTACK_COMPUTE_VM_DEVICES_10000, "missing parameter, resourceUuid: %s, vmInstanceUuid: %s is requested", resourceUuid, vmInstanceUuid)); } ErrorCode errorCode = checkParams(vmInstanceUuid, resourceUuid); @@ -114,7 +115,7 @@ public DeviceAddress getVmDeviceAddress(String resourceUuid, String vmInstanceUu @Override public ErrorCode deleteVmDeviceAddress(String resourceUuid, String vmInstanceUuid) { if (resourceUuid == null || vmInstanceUuid == null) { - return operr("missing parameter, resourceUuid: %s, vmInstanceUuid: %s is requested", resourceUuid, vmInstanceUuid); + return operr(ORG_ZSTACK_COMPUTE_VM_DEVICES_10001, "missing parameter, resourceUuid: %s, vmInstanceUuid: %s is requested", resourceUuid, vmInstanceUuid); } ErrorCode errorCode = checkParams(vmInstanceUuid, resourceUuid); @@ -133,7 +134,7 @@ public ErrorCode deleteVmDeviceAddress(String resourceUuid, String vmInstanceUui @Override public ErrorCode deleteVmDeviceAddress(String resourceUuid) { if (resourceUuid == null) { - return operr("missing parameter, resourceUuid is requested"); + return operr(ORG_ZSTACK_COMPUTE_VM_DEVICES_10002, "missing parameter, resourceUuid is requested"); } SQL.New(VmInstanceDeviceAddressVO.class) @@ -146,11 +147,11 @@ public ErrorCode deleteVmDeviceAddress(String resourceUuid) { @Override public ErrorCode deleteAllDeviceAddressesByVm(String vmInstanceUuid) { if (vmInstanceUuid == null) { - return operr("missing parameter, vmInstanceUuid: %s is requested", vmInstanceUuid); + return operr(ORG_ZSTACK_COMPUTE_VM_DEVICES_10003, "missing parameter, vmInstanceUuid: %s is requested", vmInstanceUuid); } if (!vmExists(vmInstanceUuid)) { - return operr("cannot find vm with uuid: %s", vmInstanceUuid); + return operr(ORG_ZSTACK_COMPUTE_VM_DEVICES_10004, "cannot find vm with uuid: %s", vmInstanceUuid); } SQL.New(VmInstanceDeviceAddressVO.class) @@ -163,11 +164,11 @@ public ErrorCode deleteAllDeviceAddressesByVm(String vmInstanceUuid) { @Override public ErrorCode deleteDeviceAddressesByVmModifyVirtIO(String vmInstanceUuid) { if (vmInstanceUuid == null) { - return operr("missing parameter, vmInstanceUuid: %s is requested", vmInstanceUuid); + return operr(ORG_ZSTACK_COMPUTE_VM_DEVICES_10005, "missing parameter, vmInstanceUuid: %s is requested", vmInstanceUuid); } if (!vmExists(vmInstanceUuid)) { - return operr("cannot find vm with uuid: %s", vmInstanceUuid); + return operr(ORG_ZSTACK_COMPUTE_VM_DEVICES_10006, "cannot find vm with uuid: %s", vmInstanceUuid); } VmInstanceVO vo = Q.New(VmInstanceVO.class).eq(VmInstanceVO_.uuid, vmInstanceUuid).find(); @@ -367,11 +368,11 @@ private ErrorCode checkParams(String vmInstanceUuid, String resourceUuid) { } if (!vmExists(vmInstanceUuid)) { - return operr("cannot find vm with uuid: %s", vmInstanceUuid); + return operr(ORG_ZSTACK_COMPUTE_VM_DEVICES_10007, "cannot find vm with uuid: %s", vmInstanceUuid); } if (!vmDeviceExists(resourceUuid)) { - return operr("cannot find vm device with uuid: %s", resourceUuid); + return operr(ORG_ZSTACK_COMPUTE_VM_DEVICES_10008, "cannot find vm device with uuid: %s", resourceUuid); } return null; diff --git a/compute/src/main/java/org/zstack/compute/zone/ZoneBase.java b/compute/src/main/java/org/zstack/compute/zone/ZoneBase.java index 378aa44ac94..ba1f889a46f 100755 --- a/compute/src/main/java/org/zstack/compute/zone/ZoneBase.java +++ b/compute/src/main/java/org/zstack/compute/zone/ZoneBase.java @@ -32,6 +32,7 @@ import java.util.Map; import static org.zstack.core.Platform.err; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = true) @@ -66,7 +67,7 @@ protected void handle(APIChangeZoneStateMsg msg) { try { extpEmitter.preChange(self, stateEvt); } catch (ZoneException e) { - evt.setError(err(SysErrors.CHANGE_RESOURCE_STATE_ERROR, e.getMessage())); + evt.setError(err(ORG_ZSTACK_COMPUTE_ZONE_10001, SysErrors.CHANGE_RESOURCE_STATE_ERROR, e.getMessage())); bus.publish(evt); return; } @@ -239,7 +240,7 @@ public void handle(Map data) { }).error(new FlowErrorHandler(msg) { @Override public void handle(ErrorCode errCode, Map data) { - evt.setError(err(SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); + evt.setError(err(ORG_ZSTACK_COMPUTE_ZONE_10002, SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); bus.publish(evt); } }).start(); diff --git a/compute/src/main/java/org/zstack/compute/zone/ZoneCascadeExtension.java b/compute/src/main/java/org/zstack/compute/zone/ZoneCascadeExtension.java index 12ad20dbb2c..f888a0a86cd 100755 --- a/compute/src/main/java/org/zstack/compute/zone/ZoneCascadeExtension.java +++ b/compute/src/main/java/org/zstack/compute/zone/ZoneCascadeExtension.java @@ -17,6 +17,7 @@ import java.util.List; import static org.zstack.core.Platform.inerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -97,7 +98,7 @@ private void handleDeletionCheck(CascadeAction action, Completion completion) { completion.success(); } catch (ZoneException e) { - completion.fail(inerr(e.getMessage())); + completion.fail(inerr(ORG_ZSTACK_COMPUTE_ZONE_10003, e.getMessage())); } } diff --git a/compute/src/main/java/org/zstack/compute/zone/ZoneManagerImpl.java b/compute/src/main/java/org/zstack/compute/zone/ZoneManagerImpl.java index 794c34a92fa..e450fa75f9b 100755 --- a/compute/src/main/java/org/zstack/compute/zone/ZoneManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/zone/ZoneManagerImpl.java @@ -31,6 +31,7 @@ import static org.zstack.core.Platform.err; import static java.util.Arrays.asList; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class ZoneManagerImpl extends AbstractService implements ZoneManager { @@ -108,7 +109,7 @@ private void passThrough(ZoneMessage msg) { } if (vo == null) { - ErrorCode err = err(SysErrors.RESOURCE_NOT_FOUND, "unable to find zone[uuid:%s], it may have been deleted", msg.getZoneUuid()); + ErrorCode err = err(ORG_ZSTACK_COMPUTE_ZONE_10000, SysErrors.RESOURCE_NOT_FOUND, "unable to find zone[uuid:%s], it may have been deleted", msg.getZoneUuid()); bus.replyErrorByMessageType((Message)msg, err); return; } diff --git a/configuration/src/main/java/org/zstack/configuration/ConfigurationApiInterceptor.java b/configuration/src/main/java/org/zstack/configuration/ConfigurationApiInterceptor.java index dda0df86524..4a706a88b55 100755 --- a/configuration/src/main/java/org/zstack/configuration/ConfigurationApiInterceptor.java +++ b/configuration/src/main/java/org/zstack/configuration/ConfigurationApiInterceptor.java @@ -14,6 +14,7 @@ import org.zstack.header.storage.primary.PrimaryStorageAllocatorStrategyType; import org.zstack.utils.data.SizeUnit; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -65,35 +66,35 @@ private void validate(APIDeleteDiskOfferingMsg msg) { private void validate(APICreateInstanceOfferingMsg msg) { if (msg.getAllocatorStrategy() != null && !HostAllocatorStrategyType.hasType(msg.getAllocatorStrategy())) { - throw new ApiMessageInterceptionException(argerr("unsupported host allocation strategy[%s]", msg.getAllocatorStrategy())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_CONFIGURATION_10005, "unsupported host allocation strategy[%s]", msg.getAllocatorStrategy())); } if (msg.getType() != null && !InstanceOfferingType.hasType(msg.getType())) { - throw new ApiMessageInterceptionException(argerr("unsupported instance offering type[%s]", msg.getType())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_CONFIGURATION_10006, "unsupported instance offering type[%s]", msg.getType())); } if (msg.getCpuNum() < 1) { - throw new ApiMessageInterceptionException(argerr("cpu num[%s] is less than 1", msg.getCpuNum())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_CONFIGURATION_10007, "cpu num[%s] is less than 1", msg.getCpuNum())); } if (msg.getMemorySize() < SizeUnit.MEGABYTE.toByte(16)) { - throw new ApiMessageInterceptionException(argerr("memory size[%s bytes] is less than 16M, no modern operating system is likely able to boot with such small memory size", msg.getMemorySize())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_CONFIGURATION_10008, "memory size[%s bytes] is less than 16M, no modern operating system is likely able to boot with such small memory size", msg.getMemorySize())); } if (msg.getReservedMemorySize() > msg.getMemorySize()) { - throw new ApiMessageInterceptionException(argerr("reserved memory size[%s bytes] is greater than memory size[%s bytes]", msg.getReservedMemorySize(), msg.getMemorySize())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_CONFIGURATION_10009, "reserved memory size[%s bytes] is greater than memory size[%s bytes]", msg.getReservedMemorySize(), msg.getMemorySize())); } } private void validate(APIUpdateInstanceOfferingMsg msg) { if (msg.getAllocatorStrategy() != null && !HostAllocatorStrategyType.hasType(msg.getAllocatorStrategy())) { - throw new ApiMessageInterceptionException(argerr("unsupported host allocation strategy[%s]", msg.getAllocatorStrategy())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_CONFIGURATION_10010, "unsupported host allocation strategy[%s]", msg.getAllocatorStrategy())); } } private void validate(APICreateDiskOfferingMsg msg) { if (msg.getAllocationStrategy() != null && !PrimaryStorageAllocatorStrategyType.hasType(msg.getAllocationStrategy())) { - throw new ApiMessageInterceptionException(argerr("unsupported primary storage allocation strategy[%s]", msg.getAllocationStrategy())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_CONFIGURATION_10011, "unsupported primary storage allocation strategy[%s]", msg.getAllocationStrategy())); } } } diff --git a/configuration/src/main/java/org/zstack/configuration/ConfigurationManagerImpl.java b/configuration/src/main/java/org/zstack/configuration/ConfigurationManagerImpl.java index 525bf33229d..ad0aa1efb24 100755 --- a/configuration/src/main/java/org/zstack/configuration/ConfigurationManagerImpl.java +++ b/configuration/src/main/java/org/zstack/configuration/ConfigurationManagerImpl.java @@ -63,6 +63,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class ConfigurationManagerImpl extends AbstractService implements ConfigurationManager { private static final CLogger logger = Utils.getLogger(ConfigurationManagerImpl.class); @@ -1043,7 +1044,7 @@ private void check(String resourceUuid, String systemTag) { int existUserdataTagCount = InstanceOfferingSystemTags.INSTANCE_OFFERING_USER_CONFIG.getTags(resourceUuid, InstanceOfferingVO.class).size(); if (existUserdataTagCount > 0) { throw new OperationFailureException(argerr( - "Already have one userdata systemTag for instanceOffering[uuid: %s].", + ORG_ZSTACK_CONFIGURATION_10001, "Already have one userdata systemTag for instanceOffering[uuid: %s].", resourceUuid)); } @@ -1066,7 +1067,7 @@ public void validateSystemTagInCreateMessage(APICreateMessage msg) { if (InstanceOfferingSystemTags.INSTANCE_OFFERING_USER_CONFIG.isMatch(sysTag)) { if (userdataTagCount > 0) { throw new OperationFailureException(argerr( - "Shouldn't be more than one systemTag for one instanceOffering.")); + ORG_ZSTACK_CONFIGURATION_10002, "Shouldn't be more than one systemTag for one instanceOffering.")); } userdataTagCount++; @@ -1085,7 +1086,7 @@ private void check(String resourceUuid, String systemTag) { int existUserdataTagCount = DiskOfferingSystemTags.DISK_OFFERING_USER_CONFIG.getTags(resourceUuid, DiskOfferingVO.class).size(); if (existUserdataTagCount > 0) { throw new OperationFailureException(argerr( - "Already have one userdata systemTag for diskOffering[uuid: %s].", + ORG_ZSTACK_CONFIGURATION_10003, "Already have one userdata systemTag for diskOffering[uuid: %s].", resourceUuid)); } @@ -1108,7 +1109,7 @@ public void validateSystemTagInCreateMessage(APICreateMessage msg) { if (InstanceOfferingSystemTags.INSTANCE_OFFERING_USER_CONFIG.isMatch(sysTag)) { if (userdataTagCount > 0) { throw new OperationFailureException(argerr( - "Shouldn't be more than one systemTag for one instanceOffering.")); + ORG_ZSTACK_CONFIGURATION_10004, "Shouldn't be more than one systemTag for one instanceOffering.")); } userdataTagCount++; diff --git a/configuration/src/main/java/org/zstack/configuration/DiskOfferingBase.java b/configuration/src/main/java/org/zstack/configuration/DiskOfferingBase.java index 59a89cd6a54..7055b40e46e 100755 --- a/configuration/src/main/java/org/zstack/configuration/DiskOfferingBase.java +++ b/configuration/src/main/java/org/zstack/configuration/DiskOfferingBase.java @@ -26,6 +26,7 @@ import java.util.Map; import static org.zstack.core.Platform.err; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class DiskOfferingBase implements DiskOffering { @@ -188,7 +189,7 @@ public void handle(Map data) { }).error(new FlowErrorHandler(msg) { @Override public void handle(ErrorCode errCode, Map data) { - evt.setError(err(SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); + evt.setError(err(ORG_ZSTACK_CONFIGURATION_10012, SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); bus.publish(evt); } }).start(); diff --git a/configuration/src/main/java/org/zstack/configuration/InstanceOfferingBase.java b/configuration/src/main/java/org/zstack/configuration/InstanceOfferingBase.java index b64ebb04a01..2c017583f43 100755 --- a/configuration/src/main/java/org/zstack/configuration/InstanceOfferingBase.java +++ b/configuration/src/main/java/org/zstack/configuration/InstanceOfferingBase.java @@ -24,6 +24,7 @@ import java.util.Map; import static org.zstack.core.Platform.err; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -192,7 +193,7 @@ public void handle(Map data) { }).error(new FlowErrorHandler(msg) { @Override public void handle(ErrorCode errCode, Map data) { - evt.setError(err(SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); + evt.setError(err(ORG_ZSTACK_CONFIGURATION_10000, SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); bus.publish(evt); } }).start(); diff --git a/console/src/main/java/org/zstack/console/AbstractConsoleProxyBackend.java b/console/src/main/java/org/zstack/console/AbstractConsoleProxyBackend.java index fc1c3e72377..c9091daac28 100755 --- a/console/src/main/java/org/zstack/console/AbstractConsoleProxyBackend.java +++ b/console/src/main/java/org/zstack/console/AbstractConsoleProxyBackend.java @@ -49,6 +49,7 @@ import java.util.concurrent.TimeUnit; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -119,7 +120,7 @@ public void fail(ErrorCode errorCode) { @Override public void grantConsoleAccess(final SessionInventory session, final VmInstanceInventory vm, final ReturnValueCompletion complete) { if (!isAgentConnected()) { - complete.fail(operr("the console agent is not connected; it's mostly like the management node just starts, " + + complete.fail(operr(ORG_ZSTACK_CONSOLE_10011, "the console agent is not connected; it's mostly like the management node just starts, " + "please wait for the console agent connected, or you can reconnect it manually if disconnected for a long time." )); return; @@ -146,7 +147,7 @@ public void grantConsoleAccess(final SessionInventory session, final VmInstanceI String hostIp = getHostIp(vm); if (hostIp == null) { - throw new OperationFailureException(operr("cannot find host IP of the vm[uuid:%s], is the vm running???", vm.getUuid())); + throw new OperationFailureException(operr(ORG_ZSTACK_CONSOLE_10012, "cannot find host IP of the vm[uuid:%s], is the vm running???", vm.getUuid())); } if (vo.getTargetHostname().equals(hostIp)) { diff --git a/console/src/main/java/org/zstack/console/ConsoleApiInterceptor.java b/console/src/main/java/org/zstack/console/ConsoleApiInterceptor.java index 8a62df54981..87677b52700 100755 --- a/console/src/main/java/org/zstack/console/ConsoleApiInterceptor.java +++ b/console/src/main/java/org/zstack/console/ConsoleApiInterceptor.java @@ -19,6 +19,7 @@ import java.util.List; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -57,7 +58,7 @@ private void validate(APIRequestConsoleAccessMsg msg) { q.add(VmInstanceVO_.uuid, Op.EQ, msg.getVmInstanceUuid()); VmInstanceState state = q.findValue(); if (!consoleAvailableStates.contains(state)) { - throw new ApiMessageInterceptionException(operr("vm[uuid:%s] is not in state of %s, current state is %s", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_CONSOLE_10010, "vm[uuid:%s] is not in state of %s, current state is %s", msg.getVmInstanceUuid(), consoleAvailableStates, state)); } bus.makeTargetServiceIdByResourceUuid(msg, ConsoleConstants.SERVICE_ID, msg.getVmInstanceUuid()); diff --git a/console/src/main/java/org/zstack/console/ConsoleProxyBase.java b/console/src/main/java/org/zstack/console/ConsoleProxyBase.java index 4af9bbacbdb..c61a211655e 100755 --- a/console/src/main/java/org/zstack/console/ConsoleProxyBase.java +++ b/console/src/main/java/org/zstack/console/ConsoleProxyBase.java @@ -24,6 +24,7 @@ import java.sql.Timestamp; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -65,7 +66,7 @@ private void doEstablishConsoleProxyConnection(ConsoleUrl consoleUrl, final Retu final int targetPort = uri.getPort(); if (targetHostname == null || targetPort < 0) { - completion.fail(operr("establish VNC: unexpected uri: %s", uri.toString())); + completion.fail(operr(ORG_ZSTACK_CONSOLE_10005, "establish VNC: unexpected uri: %s", uri.toString())); return; } @@ -113,7 +114,7 @@ public void success(ConsoleProxyCommands.EstablishProxyRsp ret) { self.setExpiredDate(new Timestamp(expiredDate)); completion.success(self); } else { - completion.fail(operr("operation error, because:%s", ret.getError())); + completion.fail(operr(ORG_ZSTACK_CONSOLE_10006, "operation error, because:%s", ret.getError())); } } @@ -133,7 +134,7 @@ void doEstablishDirectConsoleConnection(ConsoleUrl consoleUrl, final ReturnValue final int targetPort = uri.getPort(); if (targetHostname == null || targetPort < 0) { - completion.fail(operr("establish VNC: unexpected uri: %s", uri.toString())); + completion.fail(operr(ORG_ZSTACK_CONSOLE_10007, "establish VNC: unexpected uri: %s", uri.toString())); return; } @@ -198,7 +199,7 @@ public void success(ConsoleProxyCommands.CheckAvailabilityRsp ret) { if (ret.isSuccess()) { completion.success(ret.getAvailable()); } else { - completion.fail(operr("unable to check console proxy availability, because %s", ret.getError())); + completion.fail(operr(ORG_ZSTACK_CONSOLE_10008, "unable to check console proxy availability, because %s", ret.getError())); } } @@ -237,7 +238,7 @@ public void success(DeleteProxyRsp ret) { if (ret.isSuccess()) { completion.success(); } else { - completion.fail(operr("operation error, because:%s", ret.getError())); + completion.fail(operr(ORG_ZSTACK_CONSOLE_10009, "operation error, because:%s", ret.getError())); } } diff --git a/console/src/main/java/org/zstack/console/DeleteConsoleProxyGcJob.java b/console/src/main/java/org/zstack/console/DeleteConsoleProxyGcJob.java index 5b747aa0c74..bc7e9212541 100644 --- a/console/src/main/java/org/zstack/console/DeleteConsoleProxyGcJob.java +++ b/console/src/main/java/org/zstack/console/DeleteConsoleProxyGcJob.java @@ -16,6 +16,7 @@ import org.zstack.utils.logging.CLogger; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class DeleteConsoleProxyGcJob extends TimeBasedGarbageCollector { private static final CLogger logger = Utils.getLogger(DeleteConsoleProxyGcJob.class); @@ -50,7 +51,7 @@ protected void triggerNow(GCCompletion completion) { } if (status != ConsoleProxyAgentStatus.Connected) { - completion.fail(operr("console proxy[uuid: %s, status: %s] on agent[ip: %s]" + + completion.fail(operr(ORG_ZSTACK_CONSOLE_10013, "console proxy[uuid: %s, status: %s] on agent[ip: %s]" + " is not Connected, fail to delete it", consoleProxy.getUuid(), status, diff --git a/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java b/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java index 5a84fbca1ea..b909b98be60 100755 --- a/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java +++ b/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java @@ -48,6 +48,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -202,7 +203,7 @@ public void run() { setupPublicKey(); File privKeyFile = PathUtil.findFileOnClassPath("ansible/rsaKeys/id_rsa"); if (privKeyFile == null) { - completion.fail(operr("Ansible private key not found.")); + completion.fail(operr(ORG_ZSTACK_CONSOLE_10000, "Ansible private key not found.")); chain.next(); return; } @@ -406,7 +407,7 @@ private void handle(final APIReconnectConsoleProxyAgentMsg msg) { if (msg.getAgentUuids() != null) { for (String uuid : msg.getAgentUuids()) { if (!mgmtNodeUuids.contains(uuid)) { - errors.put(uuid, argerr("invalid management node UUID[%s]", uuid)); + errors.put(uuid, argerr(ORG_ZSTACK_CONSOLE_10001, "invalid management node UUID[%s]", uuid)); } } } @@ -508,7 +509,7 @@ public void run(FlowTrigger trigger, Map data) { ShellResult res = runner.run(); String stdout = res.getStdout(); if (res.getRetCode() == 0) { - trigger.fail(argerr("there is other process using the port: %s", stdout)); + trigger.fail(argerr(ORG_ZSTACK_CONSOLE_10002, "there is other process using the port: %s", stdout)); } else { trigger.next(); } @@ -567,7 +568,7 @@ public void run(FlowTrigger trigger, Map data) { if (rst == 0) { trigger.next(); } else { - trigger.fail(operr("failed to configure consoleProxyOverriddenIp[code:%d] or consoleProxyPort[code:%d]")); + trigger.fail(operr(ORG_ZSTACK_CONSOLE_10003, "failed to configure consoleProxyOverriddenIp[code:%d] or consoleProxyPort[code:%d]")); } } @@ -590,7 +591,7 @@ public void run(FlowTrigger trigger, Map data) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { - trigger.fail(operr("failed to reconnect console proxy")); + trigger.fail(operr(ORG_ZSTACK_CONSOLE_10004, "failed to reconnect console proxy")); } else { trigger.next(); } diff --git a/core/src/main/java/org/zstack/core/CoreManagerImpl.java b/core/src/main/java/org/zstack/core/CoreManagerImpl.java index dd8fd8a394d..f8e172cd41c 100644 --- a/core/src/main/java/org/zstack/core/CoreManagerImpl.java +++ b/core/src/main/java/org/zstack/core/CoreManagerImpl.java @@ -29,6 +29,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class CoreManagerImpl extends AbstractService implements CoreManager { private static final CLogger logger = Utils.getLogger(CoreManagerImpl.class); @@ -68,7 +69,7 @@ private void handleLocalMessage(Message msg) { private void handle(ExternalSingleFlightMsg msg) { SingleFlightExecutor executor = MultiNodeSingleFlightImpl.getExecutor(msg.getResourceUuid()); if (executor == null) { - bus.replyErrorByMessageType(msg, operr("no executor found for resourceUuid[%s]", msg.getResourceUuid())); + bus.replyErrorByMessageType(msg, operr(ORG_ZSTACK_CORE_10000, "no executor found for resourceUuid[%s]", msg.getResourceUuid())); return; } diff --git a/core/src/main/java/org/zstack/core/Platform.java b/core/src/main/java/org/zstack/core/Platform.java index 530c5446924..a48fc6a43f8 100755 --- a/core/src/main/java/org/zstack/core/Platform.java +++ b/core/src/main/java/org/zstack/core/Platform.java @@ -975,11 +975,11 @@ private static ErrorCodeElaboration elaborate(String fmt, Object...args) { private static List allowCode = CollectionDSL.list(IdentityErrors.INVALID_SESSION); - public static ErrorCode err(Enum errCode, String fmt, Object...args) { - return err(errCode, null, fmt, args); + public static ErrorCode err(String globalErrorCode, Enum errCode, String fmt, Object...args) { + return err(globalErrorCode, errCode, null, fmt, args); } - public static ErrorCode err(Enum errCode, ErrorCode cause, String fmt, Object...args) { + public static ErrorCode err(String globalErrorCode, Enum errCode, ErrorCode cause, String fmt, Object...args) { ErrorFacade errf = getComponentLoader().getComponent(ErrorFacade.class); String details = null; if (fmt != null) { @@ -995,6 +995,7 @@ public static ErrorCode err(Enum errCode, ErrorCode cause, String fmt, Object... ErrorCode result = errf.instantiateErrorCode(errCode, details, cause); handleErrorElaboration(errCode, fmt, result, cause, args); addErrorCounter(result); + result.setGlobalErrorCode(globalErrorCode); return result; } @@ -1129,45 +1130,45 @@ public static String missingVariables(Object...args) { return sb.append("are required").toString(); } - public static ErrorCode inerr(String fmt, Object...args) { - return err(SysErrors.INTERNAL, fmt, args); + public static ErrorCode inerr(String globalErrorCode, String fmt, Object...args) { + return err(globalErrorCode, SysErrors.INTERNAL, fmt, args); } // format error code from expand components - public static ErrorCode experr(String fmt, String err, Object...args) { - return operr(fmt, err, args); + public static ErrorCode experr(String globalErrorCode, String fmt, String err, Object...args) { + return operr(globalErrorCode, fmt, err, args); } - public static ErrorCode operr(String fmt, Object...args) { - return err(SysErrors.OPERATION_ERROR, fmt, args); + public static ErrorCode operr(String globalErrorCode, String fmt, Object...args) { + return err(globalErrorCode, SysErrors.OPERATION_ERROR, fmt, args); } - public static ErrorCode operr(ErrorCode cause, String fmt, Object...args) { - return err(SysErrors.OPERATION_ERROR, cause, fmt, args); + public static ErrorCode operr(String globalErrorCode, ErrorCode cause, String fmt, Object...args) { + return err(globalErrorCode, SysErrors.OPERATION_ERROR, cause, fmt, args); } - public static ErrorCode canerr(String fmt, Object...args) { - return err(SysErrors.CANCEL_ERROR, fmt, args); + public static ErrorCode canerr(String globalErrorCode, String fmt, Object...args) { + return err(globalErrorCode, SysErrors.CANCEL_ERROR, fmt, args); } - public static ErrorCode argerr(String fmt, Object...args) { - return err(SysErrors.INVALID_ARGUMENT_ERROR, fmt, args); + public static ErrorCode argerr(String globalErrorCode, String fmt, Object...args) { + return err(globalErrorCode, SysErrors.INVALID_ARGUMENT_ERROR, fmt, args); } - public static ErrorCode touterr(String fmt, Object...args) { - return err(SysErrors.TIMEOUT, fmt, args); + public static ErrorCode touterr(String globalErrorCode, String fmt, Object...args) { + return err(globalErrorCode, SysErrors.TIMEOUT, fmt, args); } - public static ErrorCode touterr(ErrorCode cause, String fmt, Object...args) { - return err(SysErrors.TIMEOUT, cause, fmt, args); + public static ErrorCode touterr(String globalErrorCode, ErrorCode cause, String fmt, Object...args) { + return err(globalErrorCode, SysErrors.TIMEOUT, cause, fmt, args); } - public static ErrorCode ioerr(String fmt, Object...args) { - return err(SysErrors.IO_ERROR, fmt, args); + public static ErrorCode ioerr(String globalErrorCode, String fmt, Object...args) { + return err(globalErrorCode, SysErrors.IO_ERROR, fmt, args); } - public static ErrorCode httperr(String fmt, Object...args) { - return err(SysErrors.HTTP_ERROR, fmt, args); + public static ErrorCode httperr(String globalErrorCode, String fmt, Object...args) { + return err(globalErrorCode, SysErrors.HTTP_ERROR, fmt, args); } public static Function functionForMockTestObject = (Supplier t) -> t.get(); diff --git a/core/src/main/java/org/zstack/core/With.java b/core/src/main/java/org/zstack/core/With.java index af4817b3842..775e27312f4 100755 --- a/core/src/main/java/org/zstack/core/With.java +++ b/core/src/main/java/org/zstack/core/With.java @@ -18,8 +18,9 @@ import org.zstack.utils.logging.CLogger; import static org.zstack.core.Platform.inerr; -/** +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*;/** */ + @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class With { private static final CLogger logger = Utils.getLogger(With.class); @@ -51,7 +52,7 @@ private void backup(Throwable t) { logger.warn(String.format("unhandled exception happened"), t); } - ErrorCode err = inerr(t.getMessage()); + ErrorCode err = inerr(ORG_ZSTACK_CORE_10001, t.getMessage()); if (backup instanceof Completion) { ((Completion)backup).fail(err); } else if (backup instanceof ReturnValueCompletion) { diff --git a/core/src/main/java/org/zstack/core/ansible/AnsibleFacadeImpl.java b/core/src/main/java/org/zstack/core/ansible/AnsibleFacadeImpl.java index dc3eb335337..d9e40575833 100755 --- a/core/src/main/java/org/zstack/core/ansible/AnsibleFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/ansible/AnsibleFacadeImpl.java @@ -40,6 +40,7 @@ import java.util.concurrent.TimeUnit; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -103,7 +104,7 @@ void init() { } if (!invFile.exists() && !invFile.createNewFile()) { - throw new OperationFailureException(operr("fail to create new File[%s]", invFile)); + throw new OperationFailureException(operr(ORG_ZSTACK_CORE_ANSIBLE_10005, "fail to create new File[%s]", invFile)); } Wini ini = new Wini(invFile); Map cfgs = Platform.getGlobalPropertiesStartWith("Ansible.cfg."); @@ -269,13 +270,13 @@ private void run(Completion completion) { } if (output.contains("skipping: no hosts matched")) { - throw new OperationFailureException(operr(output)); + throw new OperationFailureException(operr(ORG_ZSTACK_CORE_ANSIBLE_10006, output)); } } catch (ShellException se) { String errMsg = hidePassword(se.getMessage()); logger.warn(errMsg, se); - throw new OperationFailureException(operr(errMsg)); + throw new OperationFailureException(operr(ORG_ZSTACK_CORE_ANSIBLE_10007, errMsg)); } completion.success(); diff --git a/core/src/main/java/org/zstack/core/ansible/AnsibleRunner.java b/core/src/main/java/org/zstack/core/ansible/AnsibleRunner.java index 58a22ebceca..b05e66ef2ff 100755 --- a/core/src/main/java/org/zstack/core/ansible/AnsibleRunner.java +++ b/core/src/main/java/org/zstack/core/ansible/AnsibleRunner.java @@ -33,6 +33,7 @@ import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; import static org.zstack.utils.StringDSL.ln; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -407,7 +408,7 @@ public void run(ReturnValueCompletion completion) { callAnsible(completion); } catch (SshException e) { - throw new OperationFailureException(operr("User name or password or port number may be problematic")); + throw new OperationFailureException(operr(ORG_ZSTACK_CORE_ANSIBLE_10000, "User name or password or port number may be problematic")); } catch (Exception e) { throw new CloudRuntimeException(e); } diff --git a/core/src/main/java/org/zstack/core/ansible/CallBackNetworkChecker.java b/core/src/main/java/org/zstack/core/ansible/CallBackNetworkChecker.java index ad7be7f7bb9..d2661d5cab8 100644 --- a/core/src/main/java/org/zstack/core/ansible/CallBackNetworkChecker.java +++ b/core/src/main/java/org/zstack/core/ansible/CallBackNetworkChecker.java @@ -13,6 +13,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.utils.StringDSL.ln; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by mingjian.deng on 2019/6/12. @@ -70,7 +71,7 @@ public ErrorCode stopAnsible() { try { return useNcatAndNmapToTestConnection(ssh); } catch (SshException e) { - return operr(e.getMessage()); + return operr(ORG_ZSTACK_CORE_ANSIBLE_10004, e.getMessage()); } } diff --git a/core/src/main/java/org/zstack/core/ansible/PrepareAnsible.java b/core/src/main/java/org/zstack/core/ansible/PrepareAnsible.java index cd46233ef34..b62954bd58b 100755 --- a/core/src/main/java/org/zstack/core/ansible/PrepareAnsible.java +++ b/core/src/main/java/org/zstack/core/ansible/PrepareAnsible.java @@ -17,6 +17,7 @@ import java.util.concurrent.locks.ReentrantLock; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 7/22/2015. @@ -34,7 +35,7 @@ public class PrepareAnsible { static { try { if (!hostsFile.exists() && !hostsFile.createNewFile()) { - throw new OperationFailureException(operr("fail to create new File[%s]", hostsFile)); + throw new OperationFailureException(operr(ORG_ZSTACK_CORE_ANSIBLE_10001, "fail to create new File[%s]", hostsFile)); } if (AnsibleGlobalProperty.KEEP_HOSTS_FILE_IN_MEMORY) { diff --git a/core/src/main/java/org/zstack/core/ansible/SshFolderMd5Checker.java b/core/src/main/java/org/zstack/core/ansible/SshFolderMd5Checker.java index e9d7e318b17..42cf2e88068 100755 --- a/core/src/main/java/org/zstack/core/ansible/SshFolderMd5Checker.java +++ b/core/src/main/java/org/zstack/core/ansible/SshFolderMd5Checker.java @@ -20,6 +20,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.utils.StringDSL.ln; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 12/6/2015. @@ -104,7 +105,7 @@ public boolean needDeploy() { String srcScript = script.format(srcFolder); ShellResult srcRes = ShellUtils.runAndReturn(srcScript, false); if (!srcRes.isReturnCode(0)) { - throw new OperationFailureException(operr("cannot check md5sum of files in the folder[%s].\nstdout:%s\nstderr:%s", srcFolder, + throw new OperationFailureException(operr(ORG_ZSTACK_CORE_ANSIBLE_10002, "cannot check md5sum of files in the folder[%s].\nstdout:%s\nstderr:%s", srcFolder, srcRes.getStdout(), srcRes.getStderr())); } @@ -119,7 +120,7 @@ public boolean needDeploy() { // dst folder doesn't existing return true; } else if (dstRes.getReturnCode() != 0) { - throw new OperationFailureException(operr("cannot check md5sum of files in the folder[%s] on the host[ip:%s].\nstdout:%s\nstderr:%s", + throw new OperationFailureException(operr(ORG_ZSTACK_CORE_ANSIBLE_10003, "cannot check md5sum of files in the folder[%s] on the host[ip:%s].\nstdout:%s\nstderr:%s", dstFolder, hostname, dstRes.getStdout(), dstRes.getStderr())); } diff --git a/core/src/main/java/org/zstack/core/cloudbus/CloudBus3ManagementNodeLifeCycleTracker.java b/core/src/main/java/org/zstack/core/cloudbus/CloudBus3ManagementNodeLifeCycleTracker.java index 7c5e41f4c74..5914d88b051 100755 --- a/core/src/main/java/org/zstack/core/cloudbus/CloudBus3ManagementNodeLifeCycleTracker.java +++ b/core/src/main/java/org/zstack/core/cloudbus/CloudBus3ManagementNodeLifeCycleTracker.java @@ -20,6 +20,7 @@ import java.util.concurrent.TimeUnit; import static org.zstack.core.Platform.err; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class CloudBus3ManagementNodeLifeCycleTracker implements BeforeSendMessageInterceptor, BeforeDeliveryMessageInterceptor, ManagementNodeChangeListener, Component { @@ -100,7 +101,7 @@ boolean nodeLeft(String nodeUUID) { return false; } - ErrorCode err = err(SysErrors.MANAGEMENT_NODE_UNAVAILABLE_ERROR, + ErrorCode err = err(ORG_ZSTACK_CORE_CLOUDBUS_10000, SysErrors.MANAGEMENT_NODE_UNAVAILABLE_ERROR, "management node[uuid:%s] is unavailable", nodeUUID); if (message instanceof APISyncCallMessage) { diff --git a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl2.java b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl2.java index 579a78e4860..85e16f1e39f 100755 --- a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl2.java +++ b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl2.java @@ -58,6 +58,7 @@ import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; import static org.zstack.utils.ExceptionDSL.throwableSafe; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -193,7 +194,7 @@ public void handleReturn(int i, String s, String s2, String s3, AMQP.BasicProper msg.getServiceId(), wire.dumpMessage(msg))); } else { MessageReply reply = new MessageReply(); - reply.setError(err(SysErrors.UNDELIVERABLE_ERROR, + reply.setError(err(ORG_ZSTACK_CORE_CLOUDBUS_10016, SysErrors.UNDELIVERABLE_ERROR, "unable to deliver the message; the destination service[%s] is dead; please use rabbitmqctl to check if the queue is existing and if any consumers on that queue", msg.getServiceId())); e.ack(reply); } @@ -307,17 +308,17 @@ private void handleNoRouteLetter(Message msg) { if (msg instanceof APIIsReadyToGoMsg) { APIIsReadyToGoReply reply = new APIIsReadyToGoReply(); reply.setManagementNodeId(Platform.getManagementServerId()); - reply.setError(err(SysErrors.NOT_READY_ERROR, "management node[uuid:%s] is no ready", Platform.getManagementServerId())); + reply.setError(err(ORG_ZSTACK_CORE_CLOUDBUS_10017, SysErrors.NOT_READY_ERROR, "management node[uuid:%s] is no ready", Platform.getManagementServerId())); reply(msg, reply); return; } String err = null; if (msg instanceof MessageReply) { - replyErrorByMessageType(msg, err(SysErrors.NO_ROUTE_ERROR, "No route found for the reply[%s], the service[id:%s] waiting for this reply may have been quit. %s", + replyErrorByMessageType(msg, err(ORG_ZSTACK_CORE_CLOUDBUS_10018, SysErrors.NO_ROUTE_ERROR, "No route found for the reply[%s], the service[id:%s] waiting for this reply may have been quit. %s", msg.getClass().getName(), msg.getServiceId(), wire.dumpMessage(msg))); } else { - replyErrorByMessageType(msg, err(SysErrors.NO_ROUTE_ERROR, "No route found for the message[%s], the service[id:%s] may not be running. Checking Spring xml to make sure you have loaded it. Message dump:\n %s", + replyErrorByMessageType(msg, err(ORG_ZSTACK_CORE_CLOUDBUS_10019, SysErrors.NO_ROUTE_ERROR, "No route found for the message[%s], the service[id:%s] may not be running. Checking Spring xml to make sure you have loaded it. Message dump:\n %s", msg.getClass().getName(), msg.getServiceId(), wire.dumpMessage(msg))); } } @@ -328,7 +329,7 @@ private void handleDeadLetter(Message msg) { CloudBusGlobalProperty.MESSAGE_TTL, wire.dumpMessage(msg)); logger.warn(err); } else { - ErrorCode err = err(SysErrors.NO_ROUTE_ERROR, "the message becomes a dead letter; the possible reason is the service[%s] it sends to has been dead", msg.getServiceId()); + ErrorCode err = err(ORG_ZSTACK_CORE_CLOUDBUS_10020, SysErrors.NO_ROUTE_ERROR, "the message becomes a dead letter; the possible reason is the service[%s] it sends to has been dead", msg.getServiceId()); logger.warn(String.format("%s; message dump:%s", err.getDetails(), wire.dumpMessage(msg))); replyErrorByMessageType(msg, err); } @@ -687,7 +688,7 @@ private void tryBestToReplyError(byte[] binary, String errMsg) { Message msgInstance = (Message) msgClass.newInstance(); msgInstance.setHeaders(headers); msgInstance.setId((String) msg.get("id")); - replyErrorByMessageType(msgInstance, argerr("message is not in corrected JSON mediaType, %s", errMsg)); + replyErrorByMessageType(msgInstance, argerr(ORG_ZSTACK_CORE_CLOUDBUS_10021, "message is not in corrected JSON mediaType, %s", errMsg)); } catch (Exception e) { logger.warn(String.format("unable to handle JsonSyntaxException of message: %s", msgStr), e); } @@ -1123,7 +1124,7 @@ private void replyError() { return; } - ErrorCode err = err(SysErrors.MANAGEMENT_NODE_UNAVAILABLE_ERROR, + ErrorCode err = err(ORG_ZSTACK_CORE_CLOUDBUS_10022, SysErrors.MANAGEMENT_NODE_UNAVAILABLE_ERROR, "management node[uuid:%s] is unavailable", mgmtNodeId); logger.warn(String.format("management node[uuid:%s] becomes unavailable, reply %s to message[%s]. Message metadata dump: %s", @@ -1424,7 +1425,7 @@ private MessageReply createTimeoutReply(NeedReplyMessage m) { r.putHeaderEntry(CloudBus.HEADER_CORRELATION_ID, m.getId()); AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder(); r.setAMQPProperties(builder.deliveryMode(1).build()); - r.setError(touterr(m.toErrorString())); + r.setError(touterr(ORG_ZSTACK_CORE_CLOUDBUS_10023, m.toErrorString())); return r; } @@ -2072,7 +2073,7 @@ public Void call() throws Exception { if (t instanceof OperationFailureException) { replyErrorByMessageType(msg, ((OperationFailureException) t).getErrorCode()); } else { - replyErrorByMessageType(msg, inerr(t.getMessage())); + replyErrorByMessageType(msg, inerr(ORG_ZSTACK_CORE_CLOUDBUS_10024, t.getMessage())); } } @@ -2202,16 +2203,16 @@ public void dealWithUnknownMessage(Message msg) { String details = String.format("No service deals with message: %s", wire.dumpMessage(msg)); if (msg instanceof APISyncCallMessage) { APIReply reply = new APIReply(); - reply.setError(err(SysErrors.UNKNOWN_MESSAGE_ERROR, details)); + reply.setError(err(ORG_ZSTACK_CORE_CLOUDBUS_10025, SysErrors.UNKNOWN_MESSAGE_ERROR, details)); reply.setSuccess(false); this.reply(msg, reply); } else if (msg instanceof APIMessage) { APIEvent evt = new APIEvent(msg.getId()); - evt.setError(err(SysErrors.UNKNOWN_MESSAGE_ERROR, details)); + evt.setError(err(ORG_ZSTACK_CORE_CLOUDBUS_10026, SysErrors.UNKNOWN_MESSAGE_ERROR, details)); this.publish(evt); } else if (msg instanceof NeedReplyMessage) { MessageReply reply = new MessageReply(); - reply.setError(err(SysErrors.UNKNOWN_MESSAGE_ERROR, details)); + reply.setError(err(ORG_ZSTACK_CORE_CLOUDBUS_10027, SysErrors.UNKNOWN_MESSAGE_ERROR, details)); reply.setSuccess(false); this.reply(msg, reply); } @@ -2221,7 +2222,7 @@ public void dealWithUnknownMessage(Message msg) { private void replyErrorIfMessageNeedReply(Message msg, String errStr) { if (msg instanceof NeedReplyMessage) { - ErrorCode err = inerr(errStr); + ErrorCode err = inerr(ORG_ZSTACK_CORE_CLOUDBUS_10028, errStr); replyErrorIfMessageNeedReply(msg, err); } else { DebugUtils.dumpStackTrace(String.format("An error happened when dealing with message[%s], because this message doesn't need a reply, we call it out loudly\nerror: %s\nmessage dump: %s", msg.getClass().getName(), errStr, wire.dumpMessage(msg))); @@ -2238,7 +2239,7 @@ private void replyErrorIfMessageNeedReply(Message msg, ErrorCode code) { } private void replyErrorToApiMessage(APIMessage msg, String err) { - replyErrorToApiMessage(msg, inerr(err)); + replyErrorToApiMessage(msg, inerr(ORG_ZSTACK_CORE_CLOUDBUS_10029, err)); } private void replyErrorToApiMessage(APIMessage msg, ErrorCode err) { diff --git a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java index 856535f23ab..f532ca2efa0 100755 --- a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java +++ b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java @@ -80,6 +80,7 @@ import static org.zstack.core.cloudbus.CloudBusGlobalProperty.SYNC_CALL_TIMEOUT; import static org.zstack.utils.BeanUtils.getProperty; import static org.zstack.utils.BeanUtils.setProperty; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class CloudBusImpl3 implements CloudBus, CloudBusIN { private static final CLogger logger = Utils.getLogger(CloudBusImpl3.class); @@ -325,7 +326,7 @@ private MessageReply createErrorReply(NeedReplyMessage m, ErrorCode err) { } private MessageReply createTimeoutReply(NeedReplyMessage m) { - return createErrorReply(m, touterr(m.toErrorString())); + return createErrorReply(m, touterr(ORG_ZSTACK_CORE_CLOUDBUS_10002, m.toErrorString())); } @Override @@ -367,7 +368,7 @@ void cancel(String error) { timeoutTaskReceipt.cancel(); - callback.run(createErrorReply(msg, canerr(error))); + callback.run(createErrorReply(msg, canerr(ORG_ZSTACK_CORE_CLOUDBUS_10003, error))); } @Override @@ -492,7 +493,7 @@ public void reply(Message request, MessageReply reply) { callReplyPreSendingExtensions(reply, (NeedReplyMessage) request); } catch (Exception e) { logger.error("failed to call pre-sending reply extension:", e); - reply.setError(operr(e.getMessage())); + reply.setError(operr(ORG_ZSTACK_CORE_CLOUDBUS_10004, e.getMessage())); } } @@ -568,7 +569,7 @@ FutureCompletion send() { try { return doSend(); } catch (Throwable th) { - ErrorCode err = operr(th.getMessage()); + ErrorCode err = operr(ORG_ZSTACK_CORE_CLOUDBUS_10005, th.getMessage()); replyErrorIfNeeded(err); FutureCompletion c = new FutureCompletion(null); @@ -662,12 +663,12 @@ protected ResponseEntity call() { }.run(); if (!rsp.getStatusCode().is2xxSuccessful()) { - replyErrorIfNeeded(operr("HTTP ERROR, status code: %s, body: %s", rsp.getStatusCode(), rsp.getBody())); + replyErrorIfNeeded(operr(ORG_ZSTACK_CORE_CLOUDBUS_10006, "HTTP ERROR, status code: %s, body: %s", rsp.getStatusCode(), rsp.getBody())); } } catch (OperationFailureException e) { replyErrorIfNeeded(e.getErrorCode()); } catch (Throwable e) { - replyErrorIfNeeded(operr(e.getMessage())); + replyErrorIfNeeded(operr(ORG_ZSTACK_CORE_CLOUDBUS_10007, e.getMessage())); } } @@ -858,7 +859,7 @@ public Void call() { if (t instanceof OperationFailureException) { replyErrorByMessageType(msg, ((OperationFailureException) t).getErrorCode()); } else { - replyErrorByMessageType(msg, inerr(t.getMessage())); + replyErrorByMessageType(msg, inerr(ORG_ZSTACK_CORE_CLOUDBUS_10008, t.getMessage())); if (CloudBusGlobalProperty.SENTRY_ON) { try { @@ -948,16 +949,16 @@ public void dealWithUnknownMessage(Message msg) { String details = String.format("No service deals with message: %s", dumpMessage(msg)); if (msg instanceof APISyncCallMessage) { APIReply reply = new APIReply(); - reply.setError(err(SysErrors.UNKNOWN_MESSAGE_ERROR, details)); + reply.setError(err(ORG_ZSTACK_CORE_CLOUDBUS_10009, SysErrors.UNKNOWN_MESSAGE_ERROR, details)); reply.setSuccess(false); reply(msg, reply); } else if (msg instanceof APIMessage) { APIEvent evt = new APIEvent(msg.getId()); - evt.setError(err(SysErrors.UNKNOWN_MESSAGE_ERROR, details)); + evt.setError(err(ORG_ZSTACK_CORE_CLOUDBUS_10010, SysErrors.UNKNOWN_MESSAGE_ERROR, details)); publish(evt); } else if (msg instanceof NeedReplyMessage) { MessageReply reply = new MessageReply(); - reply.setError(err(SysErrors.UNKNOWN_MESSAGE_ERROR, details)); + reply.setError(err(ORG_ZSTACK_CORE_CLOUDBUS_10011, SysErrors.UNKNOWN_MESSAGE_ERROR, details)); reply.setSuccess(false); reply(msg, reply); } @@ -985,7 +986,7 @@ public void replyErrorByMessageType(Message msg, Exception e) { private void replyErrorIfMessageNeedReply(Message msg, String errStr) { if (msg instanceof NeedReplyMessage) { - ErrorCode err = inerr(errStr); + ErrorCode err = inerr(ORG_ZSTACK_CORE_CLOUDBUS_10012, errStr); replyErrorIfMessageNeedReply(msg, err); } else { DebugUtils.dumpStackTrace(String.format("An error happened when dealing with message[%s], because this message doesn't need a reply, we call it out loudly\nerror: %s\nmessage dump: %s", msg.getClass().getName(), errStr, dumpMessage(msg))); @@ -993,7 +994,7 @@ private void replyErrorIfMessageNeedReply(Message msg, String errStr) { } private void replyErrorExistingApiEvent(APIEvent evt, String err) { - replyErrorExistingApiEvent(evt, inerr(err)); + replyErrorExistingApiEvent(evt, inerr(ORG_ZSTACK_CORE_CLOUDBUS_10013, err)); } private void replyErrorExistingApiEvent(APIEvent evt, ErrorCode err) { @@ -1022,7 +1023,7 @@ private void replyErrorToApiMessage(APIMessage msg, ErrorCode err) { } private void replyErrorToApiMessage(APIMessage msg, String err) { - replyErrorToApiMessage(msg, inerr(err)); + replyErrorToApiMessage(msg, inerr(ORG_ZSTACK_CORE_CLOUDBUS_10014, err)); } @Override @@ -1051,7 +1052,7 @@ public void replyErrorByMessageType(Message msg, ErrorCode err) { public void logExceptionWithMessageDump(Message msg, Throwable e) { if (!(e instanceof OperationFailureException)) { String errMsg = String.format("unhandled throwable happened when dealing with message[%s], dump: %s", msg.getClass().getName(), dumpMessage(msg)); - Platform.addErrorCounter(inerr(errMsg)); + Platform.addErrorCounter(inerr(ORG_ZSTACK_CORE_CLOUDBUS_10015, errMsg)); logger.warn(errMsg, e); } } diff --git a/core/src/main/java/org/zstack/core/cloudbus/EventFacadeImpl.java b/core/src/main/java/org/zstack/core/cloudbus/EventFacadeImpl.java index 10d4bebdaaa..be38ed18737 100755 --- a/core/src/main/java/org/zstack/core/cloudbus/EventFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/cloudbus/EventFacadeImpl.java @@ -25,6 +25,7 @@ import java.util.stream.Collectors; import static java.util.Arrays.asList; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -66,7 +67,7 @@ private void validate(APICreateWebhookMsg msg) { } if (msg.getOpaque() == null) { - throw new ApiMessageInterceptionException(argerr("for webhooks with type[%s], the field opaque cannot be null", EventFacade.WEBHOOK_TYPE)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_CORE_CLOUDBUS_10001, "for webhooks with type[%s], the field opaque cannot be null", EventFacade.WEBHOOK_TYPE)); } } diff --git a/core/src/main/java/org/zstack/core/config/GlobalConfig.java b/core/src/main/java/org/zstack/core/config/GlobalConfig.java index ca6292d7241..32b377c995b 100755 --- a/core/src/main/java/org/zstack/core/config/GlobalConfig.java +++ b/core/src/main/java/org/zstack/core/config/GlobalConfig.java @@ -32,6 +32,7 @@ import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; import static org.zstack.utils.StringDSL.s; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -427,7 +428,7 @@ public GlobalConfigOptions getOptions() { public void updateValueSkipValidation(Object val) { if (!CoreGlobalProperty.UNIT_TEST_ON) { - throw new OperationFailureException(operr("do not allow skip verification")); + throw new OperationFailureException(operr(ORG_ZSTACK_CORE_CONFIG_10004, "do not allow skip verification")); } if (TypeUtils.nullSafeEquals(value, val)) { diff --git a/core/src/main/java/org/zstack/core/config/GlobalConfigFacadeImpl.java b/core/src/main/java/org/zstack/core/config/GlobalConfigFacadeImpl.java index a1879c38d1a..2e551e9c0d7 100755 --- a/core/src/main/java/org/zstack/core/config/GlobalConfigFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/config/GlobalConfigFacadeImpl.java @@ -45,6 +45,7 @@ import java.util.regex.Pattern; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class GlobalConfigFacadeImpl extends AbstractService implements GlobalConfigFacade { private static final CLogger logger = Utils.getLogger(GlobalConfigFacadeImpl.class); @@ -175,7 +176,7 @@ private void handle(APIUpdateGlobalConfigMsg msg) { APIUpdateGlobalConfigEvent evt = new APIUpdateGlobalConfigEvent(msg.getId()); GlobalConfig globalConfig = allConfig.get(msg.getIdentity()); if (globalConfig == null) { - ErrorCode err = argerr("Unable to find GlobalConfig[category: %s, name: %s]", msg.getCategory(), msg.getName()); + ErrorCode err = argerr(ORG_ZSTACK_CORE_CONFIG_10000, "Unable to find GlobalConfig[category: %s, name: %s]", msg.getCategory(), msg.getName()); evt.setError(err); bus.publish(evt); return; @@ -188,7 +189,7 @@ private void handle(APIUpdateGlobalConfigMsg msg) { pluginRgty.getExtensionList(AfterUpdateClobalConfigExtensionPoint.class).forEach(point -> point.saveSaveEncryptAfterUpdateClobalConfig(inv)); evt.setInventory(inv); } catch (GlobalConfigException e) { - evt.setError(argerr(e.getMessage())); + evt.setError(argerr(ORG_ZSTACK_CORE_CONFIG_10001, e.getMessage())); logger.warn(e.getMessage(), e); } @@ -199,7 +200,7 @@ private void handle(APIGetGlobalConfigOptionsMsg msg) { APIGetGlobalConfigOptionsReply reply = new APIGetGlobalConfigOptionsReply(); GlobalConfig globalConfig = allConfig.get(msg.getIdentity()); if (globalConfig == null) { - ErrorCode err = argerr("Unable to find GlobalConfig[category: %s, name: %s]", msg.getCategory(), msg.getName()); + ErrorCode err = argerr(ORG_ZSTACK_CORE_CONFIG_10002, "Unable to find GlobalConfig[category: %s, name: %s]", msg.getCategory(), msg.getName()); reply.setError(err); bus.reply(msg, reply); return; @@ -208,7 +209,7 @@ private void handle(APIGetGlobalConfigOptionsMsg msg) { try { reply.setOptions(globalConfig.getOptions()); } catch (GlobalConfigException e) { - reply.setError(argerr(e.getMessage())); + reply.setError(argerr(ORG_ZSTACK_CORE_CONFIG_10003, e.getMessage())); logger.warn(e.getMessage(), e); } diff --git a/core/src/main/java/org/zstack/core/debug/DebugManagerImpl.java b/core/src/main/java/org/zstack/core/debug/DebugManagerImpl.java index 888a6870ac0..f9b3fcb5e9e 100755 --- a/core/src/main/java/org/zstack/core/debug/DebugManagerImpl.java +++ b/core/src/main/java/org/zstack/core/debug/DebugManagerImpl.java @@ -19,6 +19,7 @@ import java.util.Map; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by xing5 on 2016/7/25. @@ -90,7 +91,7 @@ private void handle(CleanQueueMsg msg) { CleanQueueReply reply = new CleanQueueReply(); ChainInfo taskInfo = thdf.cleanChainTaskInfo(msg.getSignatureName(), msg.getTaskIndex(), msg.getCleanUp(), msg.getRunningTask()); if (taskInfo == null) { - reply.setError(operr("taskInfo was not found")); + reply.setError(operr(ORG_ZSTACK_CORE_DEBUG_10000, "taskInfo was not found")); bus.reply(msg, reply); return; } diff --git a/core/src/main/java/org/zstack/core/encrypt/EncryptFacadeImpl.java b/core/src/main/java/org/zstack/core/encrypt/EncryptFacadeImpl.java index 9580f9bebb3..92b0e2c7178 100644 --- a/core/src/main/java/org/zstack/core/encrypt/EncryptFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/encrypt/EncryptFacadeImpl.java @@ -30,6 +30,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by kayo on 2018/9/7. @@ -217,7 +218,7 @@ protected void scripts() { ErrorableValue encrypt = encrypt(decryptedString, key); if (encrypt.error != null) { logger.error(String.format("Encryption error : %s", encrypt.error)); - throw new OperationFailureException(operr("Encryption error : %s", encrypt.error)); + throw new OperationFailureException(operr(ORG_ZSTACK_CORE_ENCRYPT_10000, "Encryption error : %s", encrypt.error)); } String sql = String.format("update %s set %s = :encrypted where uuid = :uuid", className, field.getName()); diff --git a/core/src/main/java/org/zstack/core/errorcode/ElaborationManagerImpl.java b/core/src/main/java/org/zstack/core/errorcode/ElaborationManagerImpl.java index e155d7f4403..b5f2d6f200a 100644 --- a/core/src/main/java/org/zstack/core/errorcode/ElaborationManagerImpl.java +++ b/core/src/main/java/org/zstack/core/errorcode/ElaborationManagerImpl.java @@ -38,6 +38,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by mingjian.deng on 2018/12/1. @@ -68,12 +69,12 @@ public void handleMessage(Message msg) { private void preCheckElaborationContent(String filename, String jsonContent, ReturnValueCompletion> completion) { if (filename == null && jsonContent == null) { - completion.fail(argerr("non file or jsoncontent input")); + completion.fail(argerr(ORG_ZSTACK_CORE_ERRORCODE_10000, "non file or jsoncontent input")); return; } if (filename != null && jsonContent != null) { - completion.fail(argerr("file or jsoncontent cannot both nonempty")); + completion.fail(argerr(ORG_ZSTACK_CORE_ERRORCODE_10001, "file or jsoncontent cannot both nonempty")); return; } @@ -105,11 +106,11 @@ public void run(FlowTrigger trigger, Map data) { PathUtil.scanFolder(files, folder.getAbsolutePath()); } } catch (Exception e) { - trigger.fail(operr("Unable to scan folder: %s", e.getMessage())); + trigger.fail(operr(ORG_ZSTACK_CORE_ERRORCODE_10002, "Unable to scan folder: %s", e.getMessage())); return; } if (files.isEmpty()) { - trigger.fail(argerr("%s is not existed or is empty folder", filename)); + trigger.fail(argerr(ORG_ZSTACK_CORE_ERRORCODE_10003, "%s is not existed or is empty folder", filename)); } else { trigger.next(); } @@ -145,7 +146,7 @@ public void run(FlowTrigger trigger, Map data) { List errs = JSONObjectUtil.toCollection(content, ArrayList.class, ErrorCodeElaboration.class); contents.put(file, errs); } catch (IOException e) { - trigger.fail(Platform.operr(String.format("read error elaboration template files [%s] failed, due to: %s", templateFile, e.getMessage()))); + trigger.fail(Platform.operr(ORG_ZSTACK_CORE_ERRORCODE_10004, String.format("read error elaboration template files [%s] failed, due to: %s", templateFile, e.getMessage()))); return; } catch (JsonSyntaxException e) { results.add(new ElaborationCheckResult(file, null, ElaborationFailedReason.InValidJsonSchema.toString())); @@ -246,7 +247,7 @@ public void run(FlowTrigger trigger, Map data) { } if (!NumberUtils.isNumber(err.getCode())) { - trigger.fail(operr("elaboration code must be number!")); + trigger.fail(operr(ORG_ZSTACK_CORE_ERRORCODE_10005, "elaboration code must be number!")); return; } String code = err.getCategory() + "." + err.getCode(); @@ -315,7 +316,7 @@ public void success(List returnValue) { if (returnValue.isEmpty()) { trigger.next(); } else { - trigger.fail(operr("%s: %s", returnValue.get(0).getContent(), returnValue.get(0).getReason())); + trigger.fail(operr(ORG_ZSTACK_CORE_ERRORCODE_10006, "%s: %s", returnValue.get(0).getContent(), returnValue.get(0).getReason())); } } @@ -412,7 +413,7 @@ private void handle(final APIGetElaborationsMsg msg) { if (msg.getCategory() == null && msg.getRegex() == null){ - throw new OperationFailureException(Platform.argerr("input args 'regex' or 'category' must be set")); + throw new OperationFailureException(Platform.argerr(ORG_ZSTACK_CORE_ERRORCODE_10007, "input args 'regex' or 'category' must be set")); } Collections.sort(reply.getContents()); diff --git a/core/src/main/java/org/zstack/core/externalservice/ExternalServiceManagerImpl.java b/core/src/main/java/org/zstack/core/externalservice/ExternalServiceManagerImpl.java index b953329dc39..4f4ad548dad 100755 --- a/core/src/main/java/org/zstack/core/externalservice/ExternalServiceManagerImpl.java +++ b/core/src/main/java/org/zstack/core/externalservice/ExternalServiceManagerImpl.java @@ -19,6 +19,7 @@ import java.util.function.Supplier; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class ExternalServiceManagerImpl extends AbstractService implements ExternalServiceManager { @Autowired @@ -29,7 +30,7 @@ public class ExternalServiceManagerImpl extends AbstractService implements Exter @Override public ExternalService registerService(ExternalService service) { if (services.containsKey(service.getName())) { - throw new OperationFailureException(operr("service[%s] has been registered", service.getName())); + throw new OperationFailureException(operr(ORG_ZSTACK_CORE_EXTERNALSERVICE_10000, "service[%s] has been registered", service.getName())); } services.put(service.getName(), service); @@ -90,19 +91,19 @@ private void handle(APIReloadExternalServiceMsg msg) { APIReloadExternalServiceEvent event = new APIReloadExternalServiceEvent(msg.getId()); ExternalService service = services.get(msg.getName()); if (service == null) { - event.setError(operr("service[%s] is not registered", msg.getName())); + event.setError(operr(ORG_ZSTACK_CORE_EXTERNALSERVICE_10001, "service[%s] is not registered", msg.getName())); bus.publish(event); return; } if (!service.getExternalServiceCapabilities().isReloadConfig()) { - event.setError(operr("service[%s] does not support reload config", msg.getName())); + event.setError(operr(ORG_ZSTACK_CORE_EXTERNALSERVICE_10002, "service[%s] does not support reload config", msg.getName())); } if (service.isAlive()) { service.reload(); } else { - event.setError(operr("service[%s] is not running", msg.getName())); + event.setError(operr(ORG_ZSTACK_CORE_EXTERNALSERVICE_10003, "service[%s] is not running", msg.getName())); } bus.publish(event); diff --git a/core/src/main/java/org/zstack/core/gc/GarbageCollector.java b/core/src/main/java/org/zstack/core/gc/GarbageCollector.java index a27b2c5a073..bdfc8c859d8 100755 --- a/core/src/main/java/org/zstack/core/gc/GarbageCollector.java +++ b/core/src/main/java/org/zstack/core/gc/GarbageCollector.java @@ -27,6 +27,7 @@ import java.util.function.Consumer; import static org.zstack.core.Platform.inerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by xing5 on 2017/3/3. @@ -233,7 +234,7 @@ public void fail(ErrorCode errorCode) { } catch (Throwable t) { logger.warn(String.format("[GC] unhandled exception happened when" + " running a GC job[name:%s, id:%s]", NAME, uuid), t); - fail(inerr(t.getMessage())); + fail(inerr(ORG_ZSTACK_CORE_GC_10000, t.getMessage())); } } diff --git a/core/src/main/java/org/zstack/core/gc/GarbageCollectorManagerImpl.java b/core/src/main/java/org/zstack/core/gc/GarbageCollectorManagerImpl.java index 9cbc35b3217..e3564021a3a 100755 --- a/core/src/main/java/org/zstack/core/gc/GarbageCollectorManagerImpl.java +++ b/core/src/main/java/org/zstack/core/gc/GarbageCollectorManagerImpl.java @@ -35,6 +35,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by xing5 on 2017/3/1. @@ -312,7 +313,7 @@ private void triggerGC(String gcUuid) { } else { GarbageCollectorVO vo = dbf.findByUuid(gcUuid, GarbageCollectorVO.class); if (vo.getStatus() == GCStatus.Done) { - throw new OperationFailureException(operr("cannot trigger a finished GC job[uuid:%s, name:%s]", + throw new OperationFailureException(operr(ORG_ZSTACK_CORE_GC_10001, "cannot trigger a finished GC job[uuid:%s, name:%s]", vo.getUuid(), vo.getName())); } diff --git a/core/src/main/java/org/zstack/core/job/JobQueueFacadeImpl2.java b/core/src/main/java/org/zstack/core/job/JobQueueFacadeImpl2.java index fc1ce743d31..0fd6d66953c 100755 --- a/core/src/main/java/org/zstack/core/job/JobQueueFacadeImpl2.java +++ b/core/src/main/java/org/zstack/core/job/JobQueueFacadeImpl2.java @@ -39,6 +39,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.core.Platform.inerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -124,7 +125,7 @@ private void restartQueue(JobQueueVO qvo, String mgmtId) { if (e.getState() == JobState.Processing && !e.isRestartable()) { dbf.remove(e); JobEvent evt = new JobEvent(); - evt.setErrorCode(err(SysErrors.MANAGEMENT_NODE_UNAVAILABLE_ERROR, + evt.setErrorCode(err(ORG_ZSTACK_CORE_JOB_10000, SysErrors.MANAGEMENT_NODE_UNAVAILABLE_ERROR, "management node[id:%s] becomes unavailable, job[name:%s, id:%s] is not restartable", mgmtId, e.getName(), e.getId())); bus.publish(evt); logger.debug(String.format("[Job Removed]: job[id:%s, name:%s] because it's not restartable", @@ -290,7 +291,7 @@ private Bucket takeJob(final JobQueueVO qvo) { jobe = dbf.updateAndRefresh(jobe); return Bucket.newBucket(jobe, theJob); } catch (Exception e1) { - ErrorCode ierr = inerr("[Job de-serialize failed, the job will be marked as Error] queue name: %s, job id: %s, %s", qvo.getName(), + ErrorCode ierr = inerr(ORG_ZSTACK_CORE_JOB_10001, "[Job de-serialize failed, the job will be marked as Error] queue name: %s, job id: %s, %s", qvo.getName(), jobe.getId(), e1.getMessage()); jobFail(jobe, ierr); logger.warn(ierr.getDetails(), e1); @@ -326,7 +327,7 @@ public void success(Object returnValue) { logger.debug(String.format("[Job Success] job[id:%s, name:%s] succeed", e.getId(), e.getName())); } catch (Throwable t){ logger.warn(String.format("unhandled exception happened when calling %s", job.getClass().getName()), t); - jobFail(e, inerr(t.getMessage())); + jobFail(e, inerr(ORG_ZSTACK_CORE_JOB_10002, t.getMessage())); } finally { process(qvo); } @@ -339,7 +340,7 @@ public void fail(ErrorCode errorCode) { logger.debug(String.format("[Job Failure] job[id:%s, name:%s] failed", e.getId(), e.getName())); } catch (Throwable t){ logger.warn(String.format("unhandled exception happened when calling %s", job.getClass().getName()), t); - jobFail(e, inerr(t.getMessage())); + jobFail(e, inerr(ORG_ZSTACK_CORE_JOB_10003, t.getMessage())); } finally { process(qvo); } diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java index 823a3ea91e9..619d960edae 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java +++ b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java @@ -47,6 +47,7 @@ import java.util.jar.JarFile; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * PluginManagerImpl implementation of PluginManager. @@ -190,14 +191,14 @@ private void loadPluginsFromMetadata() { private void verifyPluginProduct(PluginDriver pluginDriver) { if (!PluginGlobalConfig.ALLOW_UNKNOWN_PRODUCT_PLUGIN.value(Boolean.class) && pluginDriver.uuid() == null) { - throw new OperationFailureException(operr("unknown product plugin name: %s", + throw new OperationFailureException(operr(ORG_ZSTACK_CORE_PLUGIN_10000, "unknown product plugin name: %s", pluginDriver.name())); } if (pluginDriver.name() == null || pluginDriver.uuid() == null || pluginDriver.vendor() == null) { - throw new OperationFailureException(operr("plugin[%s] name," + + throw new OperationFailureException(operr(ORG_ZSTACK_CORE_PLUGIN_10001, "plugin[%s] name," + " productKey and vendor cannot be null", pluginDriver.getClass())); } diff --git a/core/src/main/java/org/zstack/core/progress/ProgressApiInterceptor.java b/core/src/main/java/org/zstack/core/progress/ProgressApiInterceptor.java index 7b92266e564..665fedad32b 100644 --- a/core/src/main/java/org/zstack/core/progress/ProgressApiInterceptor.java +++ b/core/src/main/java/org/zstack/core/progress/ProgressApiInterceptor.java @@ -12,6 +12,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.utils.StringDSL.isApiId; import static org.zstack.utils.StringDSL.isZStackUuid; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by miao on 17-5-16. @@ -35,7 +36,7 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti private void validate(APIGetTaskProgressMsg msg) { if (!isApiId(msg.getApiId())) { - throw new ApiMessageInterceptionException(argerr("parameter apiId[%s] is not a valid uuid.", msg.getApiId())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_CORE_PROGRESS_10000, "parameter apiId[%s] is not a valid uuid.", msg.getApiId())); } } } diff --git a/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java b/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java index 4f2157deca2..4ec0f462d3c 100755 --- a/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java @@ -49,6 +49,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import static org.zstack.core.Platform.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class RESTFacadeImpl implements RESTFacade { private static final CLogger logger = Utils.getSafeLogger(RESTFacadeImpl.class); @@ -309,7 +310,7 @@ public void asyncJson(final String url, final String body, Map h } if (unit.toMillis(timeout) <= 1) { - callback.fail(touterr("url: %s, current timeout: %s, api message timeout, skip post async call", + callback.fail(touterr(ORG_ZSTACK_CORE_REST_10000, "url: %s, current timeout: %s, api message timeout, skip post async call", url, unit.toMillis(timeout))); return; } @@ -350,7 +351,7 @@ public void asyncJson(final String url, final String body, Map h @Override public void run() { self.fail(touterr( - "[Async Http Timeout] url: %s, timeout after %s[%s], command: %s", + ORG_ZSTACK_CORE_REST_10001, "[Async Http Timeout] url: %s, timeout after %s[%s], command: %s", url, timeout, unit.toString(), body )); } @@ -402,7 +403,7 @@ public void success(HttpEntity responseEntity) { } } catch (Throwable t) { logger.warn(t.getMessage(), t); - callback.fail(inerr(t.getMessage())); + callback.fail(inerr(ORG_ZSTACK_CORE_REST_10002, t.getMessage())); } } else { callback.success(responseEntity); @@ -446,10 +447,10 @@ public void success(HttpEntity responseEntity) { } ListenableFuture> f = asyncRestTemplate.exchange(url, method, req, String.class); - f.addCallback(rsp -> {}, e -> wrapper.fail(err(SysErrors.HTTP_ERROR, e.getLocalizedMessage()))); + f.addCallback(rsp -> {}, e -> wrapper.fail(err(ORG_ZSTACK_CORE_REST_10003, SysErrors.HTTP_ERROR, e.getLocalizedMessage()))); } catch (RestClientException e) { logger.warn(String.format("Unable to %s to %s: %s", method.toString(), url, e.getMessage())); - wrapper.fail(ExceptionDSL.isCausedBy(e, ResourceAccessException.class) ? err(SysErrors.IO_ERROR, e.getMessage()) : inerr(e.getMessage())); + wrapper.fail(ExceptionDSL.isCausedBy(e, ResourceAccessException.class) ? err(ORG_ZSTACK_CORE_REST_10004, SysErrors.IO_ERROR, e.getMessage()) : inerr(ORG_ZSTACK_CORE_REST_10005, e.getMessage())); } } @@ -532,15 +533,15 @@ public RestHttp http(Class returnClass) { return http .withHandler(this::syncJson) - .withErrorCodeBuilder((e, http2) -> { + .withErrorCodeBuilder((Exception e, RestHttphttp2) -> { if (e instanceof HttpStatusCodeException) { final HttpStatusCodeException exception = (HttpStatusCodeException) e; - return operr("failed to %s to %s, status code: %s, response body: %s", + return operr(ORG_ZSTACK_CORE_REST_10006, "failed to %s to %s, status code: %s, response body: %s", http2.getMethod().toString().toLowerCase(), http2.getPath(), exception.getStatusCode(), exception.getResponseBodyAsString()); } else if (e instanceof ResourceAccessException) { - return operr("failed to %s to %s, IO Error: %s", + return operr(ORG_ZSTACK_CORE_REST_10007, "failed to %s to %s, IO Error: %s", http2.getMethod().toString().toLowerCase(), http2.getPath(), e.getMessage()); @@ -618,7 +619,7 @@ protected ResponseEntity call() { } if (!valid) { - throw new OperationFailureException(operr("failed to %s to %s, status code: %s, response body: %s", method.toString().toLowerCase(), url, rsp.getStatusCode(), rsp.getBody())); + throw new OperationFailureException(operr(ORG_ZSTACK_CORE_REST_10008, "failed to %s to %s, status code: %s, response body: %s", method.toString().toLowerCase(), url, rsp.getStatusCode(), rsp.getBody())); } return rsp; @@ -728,9 +729,9 @@ protected ResponseEntity call() { }.run(); } } catch (HttpStatusCodeException e) { - throw new OperationFailureException(operr("failed to %s to %s, status code: %s, response body: %s", method.toString().toLowerCase(), url, e.getStatusCode(), e.getResponseBodyAsString())); + throw new OperationFailureException(operr(ORG_ZSTACK_CORE_REST_10009, "failed to %s to %s, status code: %s, response body: %s", method.toString().toLowerCase(), url, e.getStatusCode(), e.getResponseBodyAsString())); } catch (ResourceAccessException e) { - throw new OperationFailureException(operr("failed to %s to %s, IO Error: %s", method.toString().toLowerCase(), url, e.getMessage())); + throw new OperationFailureException(operr(ORG_ZSTACK_CORE_REST_10010, "failed to %s to %s, IO Error: %s", method.toString().toLowerCase(), url, e.getMessage())); } boolean valid = false; @@ -745,7 +746,7 @@ protected ResponseEntity call() { } if (!valid) { - throw new OperationFailureException(operr("failed to %s to %s, status code: %s, response body: %s", method.toString().toLowerCase(), url, rsp.getStatusCode(), rsp.getBody())); + throw new OperationFailureException(operr(ORG_ZSTACK_CORE_REST_10011, "failed to %s to %s, status code: %s, response body: %s", method.toString().toLowerCase(), url, rsp.getStatusCode(), rsp.getBody())); } return rsp; @@ -779,7 +780,7 @@ public boolean run() { logger.debug(info); if (now > expired) { - completion.fail(operr("unable to echo %s in %sms", url, finalTimeout)); + completion.fail(operr(ORG_ZSTACK_CORE_REST_10012, "unable to echo %s in %sms", url, finalTimeout)); return true; } } diff --git a/core/src/main/java/org/zstack/core/salt/SaltRunner.java b/core/src/main/java/org/zstack/core/salt/SaltRunner.java index 1397a14ccac..a09d23cad8e 100755 --- a/core/src/main/java/org/zstack/core/salt/SaltRunner.java +++ b/core/src/main/java/org/zstack/core/salt/SaltRunner.java @@ -30,6 +30,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.utils.DebugUtils.Assert; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -294,7 +295,7 @@ public void success() { } if (!ret) { - completion.fail(operr("failed to run salt state[%s] on system[%s], failed after %s retries", stateName, targetIp, retry)); + completion.fail(operr(ORG_ZSTACK_CORE_SALT_10003, "failed to run salt state[%s] on system[%s], failed after %s retries", stateName, targetIp, retry)); return; } @@ -302,7 +303,7 @@ public void success() { completion.success(); } catch (Exception e) { logger.warn(String.format("failed to run salt state[%s] on system[%s], %s", stateName, targetIp, e.getMessage())); - completion.fail(operr(e.getMessage())); + completion.fail(operr(ORG_ZSTACK_CORE_SALT_10004, e.getMessage())); Thread.currentThread().interrupt(); } } diff --git a/core/src/main/java/org/zstack/core/salt/SaltSetupMinionJob.java b/core/src/main/java/org/zstack/core/salt/SaltSetupMinionJob.java index 55bb1a922b5..f2b40a50ad2 100755 --- a/core/src/main/java/org/zstack/core/salt/SaltSetupMinionJob.java +++ b/core/src/main/java/org/zstack/core/salt/SaltSetupMinionJob.java @@ -26,6 +26,7 @@ import static org.zstack.core.Platform.inerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -81,7 +82,7 @@ public void run(ReturnValueCompletion completion) { .setUsername(username).setPort(port); SshResult ret = ssh.checkTool("scp").run(); if (ret.getReturnCode() != 0) { - completion.fail(operr("scp is not found on system[%s], unable to setup salt", targetIp)); + completion.fail(operr(ORG_ZSTACK_CORE_SALT_10000, "scp is not found on system[%s], unable to setup salt", targetIp)); return; } @@ -136,11 +137,11 @@ public void run(ReturnValueCompletion completion) { } catch (SshException e) { String err = String.format("failed to setup minion on target system[%s], because %s", targetIp, e.getMessage()); logger.warn(err, e); - completion.fail(operr(e.getMessage())); + completion.fail(operr(ORG_ZSTACK_CORE_SALT_10001, e.getMessage())); } catch (IOException ie) { String err = String.format("failed to setup minion on target system[%s], because %s", targetIp, ie.getMessage()); logger.warn(err, ie); - completion.fail(inerr(ie.getMessage())); + completion.fail(inerr(ORG_ZSTACK_CORE_SALT_10002, ie.getMessage())); } finally { if (tmpt != null && !tmpt.delete()) { logger.warn(String.format("failed to delete file[%s]", tmpt)); diff --git a/core/src/main/java/org/zstack/core/singleflight/AbstractSingleFlight.java b/core/src/main/java/org/zstack/core/singleflight/AbstractSingleFlight.java index a4c86e51f0a..38e5d8e5528 100644 --- a/core/src/main/java/org/zstack/core/singleflight/AbstractSingleFlight.java +++ b/core/src/main/java/org/zstack/core/singleflight/AbstractSingleFlight.java @@ -7,6 +7,7 @@ import java.util.*; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by Wenhao.Zhang on 20/11/10 @@ -50,7 +51,7 @@ protected void fail(ReturnValueCompletion consumer, ErrorCode errorCode) { @AsyncThread protected void fail(ReturnValueCompletion consumer, Exception ex) { - consumer.fail(operr(ex.getMessage())); + consumer.fail(operr(ORG_ZSTACK_CORE_SINGLEFLIGHT_10001, ex.getMessage())); } protected void notifyResult(Collection> consumers, final V v) { diff --git a/core/src/main/java/org/zstack/core/singleflight/MultiNodeSingleFlightImpl.java b/core/src/main/java/org/zstack/core/singleflight/MultiNodeSingleFlightImpl.java index 4ce39ce2f00..9ab35aaf996 100644 --- a/core/src/main/java/org/zstack/core/singleflight/MultiNodeSingleFlightImpl.java +++ b/core/src/main/java/org/zstack/core/singleflight/MultiNodeSingleFlightImpl.java @@ -23,6 +23,7 @@ import java.util.concurrent.ConcurrentHashMap; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class MultiNodeSingleFlightImpl { private static final CLogger logger = Utils.getLogger(MultiNodeSingleFlightImpl.class); @@ -85,7 +86,7 @@ public void run(SingleFlightExecutor executor, String method, Object... args) { args[args.length - 1] = outCompletion; consumer.invoke(executor, args); } catch (IllegalAccessException | InvocationTargetException e) { - outCompletion.fail(operr(e.getMessage())); + outCompletion.fail(operr(ORG_ZSTACK_CORE_SINGLEFLIGHT_10000, e.getMessage())); } }) .done(result -> { diff --git a/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java b/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java index 7b608783816..08aaa25644e 100755 --- a/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java +++ b/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java @@ -31,6 +31,7 @@ import java.util.concurrent.atomic.AtomicInteger; import static org.zstack.core.Platform.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = true) class DispatchQueueImpl implements DispatchQueue, DebugSignalHandler { @@ -511,7 +512,7 @@ public boolean cancel(boolean mayInterruptIfRunning) { void singleFlightRun(final ReturnValueCompletion completion) { if (isCancelled()) { - completion.fail(err(SysErrors.CANCEL_ERROR, "task failed due to cancelled")); + completion.fail(err(ORG_ZSTACK_CORE_THREAD_10000, SysErrors.CANCEL_ERROR, "task failed due to cancelled")); return; } @@ -526,9 +527,9 @@ void singleFlightRun(final ReturnValueCompletion completion) { done(); } finally { if (t instanceof OperationFailureException) { - completion.fail(operr(t.getMessage())); + completion.fail(operr(ORG_ZSTACK_CORE_THREAD_10001, t.getMessage())); } else { - completion.fail(inerr(t.getMessage())); + completion.fail(inerr(ORG_ZSTACK_CORE_THREAD_10002, t.getMessage())); } } } diff --git a/core/src/main/java/org/zstack/core/timeout/ApiTimeoutManagerImpl.java b/core/src/main/java/org/zstack/core/timeout/ApiTimeoutManagerImpl.java index fb7e1eed346..e1a6697918f 100755 --- a/core/src/main/java/org/zstack/core/timeout/ApiTimeoutManagerImpl.java +++ b/core/src/main/java/org/zstack/core/timeout/ApiTimeoutManagerImpl.java @@ -19,6 +19,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 2/17/2016. @@ -73,7 +74,7 @@ private void installValidatorToGlobalConfig() { GlobalConfigValidatorExtensionPoint validator = (category, name, oldValue, newValue) -> { long minimal = parseTimeout(ApiTimeoutGlobalProperty.MINIMAL_TIMEOUT); if (parseTimeout(newValue) < minimal) { - throw new OperationFailureException(argerr("api timeout cannot be set smaller than %s", ApiTimeoutGlobalProperty.MINIMAL_TIMEOUT)); + throw new OperationFailureException(argerr(ORG_ZSTACK_CORE_TIMEOUT_10000, "api timeout cannot be set smaller than %s", ApiTimeoutGlobalProperty.MINIMAL_TIMEOUT)); } }; diff --git a/core/src/main/java/org/zstack/core/trash/StorageRecycleImpl.java b/core/src/main/java/org/zstack/core/trash/StorageRecycleImpl.java index eb6c1a76d00..7fe37198856 100644 --- a/core/src/main/java/org/zstack/core/trash/StorageRecycleImpl.java +++ b/core/src/main/java/org/zstack/core/trash/StorageRecycleImpl.java @@ -46,6 +46,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.inerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by mingjian.deng on 2019/9/19. @@ -66,7 +67,7 @@ public class StorageRecycleImpl implements StorageTrash, VolumeSnapshotAfterDele private String getResourceType(String resourceUuid) { ResourceVO vo = dbf.findByUuid(resourceUuid, ResourceVO.class); if (vo == null) { - throw new OperationFailureException(inerr("cannot find ResourceVO for resourceUuid: %s, maybe it has been deleted", resourceUuid)); + throw new OperationFailureException(inerr(ORG_ZSTACK_CORE_TRASH_10000, "cannot find ResourceVO for resourceUuid: %s, maybe it has been deleted", resourceUuid)); } return vo.getResourceType(); } @@ -142,7 +143,7 @@ public InstallPathRecycleInventory createTrash(TrashType type, boolean isFolder, } else if (o instanceof VolumeSnapshotInventory) { return createRecycleFromVolumeSnapshot(type, isFolder, (VolumeSnapshotInventory)o); } else { - throw new OperationFailureException(inerr("non support resourceType to create trash")); + throw new OperationFailureException(inerr(ORG_ZSTACK_CORE_TRASH_10001, "non support resourceType to create trash")); } } diff --git a/core/src/main/java/org/zstack/core/upgrade/UpgradeChecker.java b/core/src/main/java/org/zstack/core/upgrade/UpgradeChecker.java index 160b32b7864..90639caf24c 100644 --- a/core/src/main/java/org/zstack/core/upgrade/UpgradeChecker.java +++ b/core/src/main/java/org/zstack/core/upgrade/UpgradeChecker.java @@ -42,6 +42,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class UpgradeChecker implements Component, GlobalApiMessageInterceptor { private static final CLogger logger = Utils.getLogger(UpgradeChecker.class); @@ -207,7 +208,7 @@ public ErrorCode checkAgentHttpParamChanges(String agentUuid, String commandName if (className != null && grayScaleApiWhiteList .stream() .noneMatch(className::contains)) { - return operr("Api: %s is not allowed by allowedApiListGrayscaleUpgrading: %s.", + return operr(ORG_ZSTACK_CORE_UPGRADE_10000, "Api: %s is not allowed by allowedApiListGrayscaleUpgrading: %s.", className, grayScaleApiWhiteList); } @@ -292,7 +293,7 @@ public ErrorCode checkAgentHttpParamChanges(String agentUuid, String commandName StringBuilder sb = new StringBuilder(); sb.append(String.format("This operation is not allowed on host[uuid:%s] during grayscale upgrade: \n", agentUuid)); entries.forEach(entry -> sb.append(String.format("field: %s, current agent version %s, support version: %s\n", entry.getKey(), agentVersionVO.getCurrentVersion(), entry.getValue()))); - return operr(sb.toString()); + return operr(ORG_ZSTACK_CORE_UPGRADE_10001, sb.toString()); } return null; @@ -391,7 +392,7 @@ private void validate(APIUpdateClusterOSMsg msg) { if (msg.getHostUuid() == null) { throw new ApiMessageInterceptionException( - argerr("Disable grayscale upgrade by %s \n before you want to update whole cluster's hosts' os." + + argerr(ORG_ZSTACK_CORE_UPGRADE_10002, "Disable grayscale upgrade by %s \n before you want to update whole cluster's hosts' os." + " Or try update cluster os with specific hostUuid instead.", UpgradeGlobalConfig.GRAYSCALE_UPGRADE.toString()) ); } @@ -402,7 +403,7 @@ private void validate(APIUpdateClusterOSMsg msg) { if (agent == null) { throw new ApiMessageInterceptionException( - argerr("Can not found agent version, upgrade cluster os is not supported during grayscale upgrade") + argerr(ORG_ZSTACK_CORE_UPGRADE_10003, "Can not found agent version, upgrade cluster os is not supported during grayscale upgrade") ); } @@ -411,7 +412,7 @@ private void validate(APIUpdateClusterOSMsg msg) { } throw new ApiMessageInterceptionException( - argerr("Host[uuid: %s] agent version is not upgraded, please reconnect host before update os", msg.getHostUuid()) + argerr(ORG_ZSTACK_CORE_UPGRADE_10004, "Host[uuid: %s] agent version is not upgraded, please reconnect host before update os", msg.getHostUuid()) ); } diff --git a/core/src/main/java/org/zstack/core/validation/ValidationFacadeImpl.java b/core/src/main/java/org/zstack/core/validation/ValidationFacadeImpl.java index 90466a6ba9f..3e20e1b129d 100755 --- a/core/src/main/java/org/zstack/core/validation/ValidationFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/validation/ValidationFacadeImpl.java @@ -15,6 +15,7 @@ import java.util.Map; import static org.zstack.core.Platform.inerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -54,7 +55,7 @@ public ErrorCode validateErrorByErrorCode(Object obj) { for (Validator v : vs) { String err = v.validate(obj); if (err != null) { - return inerr(err); + return inerr(ORG_ZSTACK_CORE_VALIDATION_10000, err); } } } diff --git a/core/src/main/java/org/zstack/core/webhook/WebhookApiInterceptor.java b/core/src/main/java/org/zstack/core/webhook/WebhookApiInterceptor.java index 65bb9c071e0..41fec97f708 100755 --- a/core/src/main/java/org/zstack/core/webhook/WebhookApiInterceptor.java +++ b/core/src/main/java/org/zstack/core/webhook/WebhookApiInterceptor.java @@ -7,6 +7,7 @@ import org.zstack.header.core.webhooks.APIUpdateWebhookMsg; import org.zstack.header.message.APIMessage; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by xing5 on 2017/5/7. @@ -25,7 +26,7 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti private void validateUrl(String url) { if (!new UrlValidator().isValid(url)) { - throw new ApiMessageInterceptionException(argerr("Invalid url[%s]", url)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_CORE_WEBHOOK_10000, "Invalid url[%s]", url)); } } diff --git a/core/src/main/java/org/zstack/core/workflow/AsyncWorkFlowChain.java b/core/src/main/java/org/zstack/core/workflow/AsyncWorkFlowChain.java index f0499f12038..7cee5e173e3 100755 --- a/core/src/main/java/org/zstack/core/workflow/AsyncWorkFlowChain.java +++ b/core/src/main/java/org/zstack/core/workflow/AsyncWorkFlowChain.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class AsyncWorkFlowChain { protected static final CLogger logger = Utils.getLogger(WorkFlowChain.class); @@ -151,7 +152,7 @@ protected void processFlow(AsyncWorkFlow flow, WorkFlowContext ctx, WorkFlowVO v } } catch (Throwable t) { logger.warn(String.format("workflow[%s] in chain[%s] failed because of an unhandle exception", flow.getName(), getName()), t); - ErrorCode err = inerr(t.getMessage()); + ErrorCode err = inerr(ORG_ZSTACK_CORE_WORKFLOW_10002, t.getMessage()); try { fail(vo, err); } catch (Throwable t1) { diff --git a/core/src/main/java/org/zstack/core/workflow/SimpleFlowChain.java b/core/src/main/java/org/zstack/core/workflow/SimpleFlowChain.java index 73ab3cfdd32..e326f4f654b 100755 --- a/core/src/main/java/org/zstack/core/workflow/SimpleFlowChain.java +++ b/core/src/main/java/org/zstack/core/workflow/SimpleFlowChain.java @@ -26,6 +26,7 @@ import java.util.concurrent.ConcurrentHashMap; import static org.zstack.core.Platform.inerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -385,7 +386,7 @@ private void runFlow(Flow flow) { logger.warn(String.format("unhandled exception call backtrace %s", DebugUtils.getStackTrace(t))); logger.warn(String.format("[FlowChain(%s): %s] unhandled exception when executing flow[%s], start to rollback", id, name, flow.getClass().getName()), t); - fail(inerr(t.getMessage())); + fail(inerr(ORG_ZSTACK_CORE_WORKFLOW_10001, t.getMessage())); } } diff --git a/core/src/main/java/org/zstack/core/workflow/WorkFlowChain.java b/core/src/main/java/org/zstack/core/workflow/WorkFlowChain.java index 2698934e4ee..0af494c792f 100755 --- a/core/src/main/java/org/zstack/core/workflow/WorkFlowChain.java +++ b/core/src/main/java/org/zstack/core/workflow/WorkFlowChain.java @@ -20,6 +20,7 @@ import java.util.UUID; import static org.zstack.core.Platform.inerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class WorkFlowChain { @@ -152,7 +153,7 @@ protected ErrorCode processFlow(WorkFlow flow, WorkFlowVO vo, int position) { dbf.update(vo); return e.getErrorCode(); } catch (Throwable t) { - ErrorCode err = inerr(t.getMessage()); + ErrorCode err = inerr(ORG_ZSTACK_CORE_WORKFLOW_10000, t.getMessage()); vo.setReason(err.toString()); vo.setState(flowState.getNextState(vo.getState(), WorkFlowStateEvent.failed)); logger.debug(String.format("workflow[%s] in chain[%s] failed because of an unhandle exception", flow.getName(), getName()), t); diff --git a/externalservice/src/main/java/org/zstack/externalservice/cronjob/CronJobImpl.java b/externalservice/src/main/java/org/zstack/externalservice/cronjob/CronJobImpl.java index 4bd6c1d7788..38e061312d4 100755 --- a/externalservice/src/main/java/org/zstack/externalservice/cronjob/CronJobImpl.java +++ b/externalservice/src/main/java/org/zstack/externalservice/cronjob/CronJobImpl.java @@ -17,6 +17,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.Set; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class CronJobImpl extends AbstractLocalExternalService implements CronJob { ExternalServiceCapabilities capabilities = ExternalServiceCapabilitiesBuilder @@ -62,7 +63,7 @@ public ExternalServiceCapabilities getExternalServiceCapabilities() { @Override public void reload() { if (!isAlive()) { - throw new OperationFailureException(operr("crond is not running")); + throw new OperationFailureException(operr(ORG_ZSTACK_EXTERNALSERVICE_CRONJOB_10000, "crond is not running")); } new Bash() { @@ -78,7 +79,7 @@ protected void scripts() { @Override public void addJob(String job) { if (!isAlive()) { - throw new OperationFailureException(operr("crond is not running")); + throw new OperationFailureException(operr(ORG_ZSTACK_EXTERNALSERVICE_CRONJOB_10001, "crond is not running")); } new Bash() { diff --git a/header/src/main/java/org/zstack/header/errorcode/ErrorCode.java b/header/src/main/java/org/zstack/header/errorcode/ErrorCode.java index 0d1dbf94bba..1b9e9eba7a6 100755 --- a/header/src/main/java/org/zstack/header/errorcode/ErrorCode.java +++ b/header/src/main/java/org/zstack/header/errorcode/ErrorCode.java @@ -23,6 +23,15 @@ public class ErrorCode implements Serializable, Cloneable { private ErrorCode cause; @NoJsonSchema private LinkedHashMap opaque; + private String globalErrorCode; + + public String getGlobalErrorCode() { + return globalErrorCode; + } + + public void setGlobalErrorCode(String globalErrorCode) { + this.globalErrorCode = globalErrorCode; + } public LinkedHashMap getOpaque() { return opaque; diff --git a/identity/src/main/java/org/zstack/identity/AccountAPIRequestChecker.java b/identity/src/main/java/org/zstack/identity/AccountAPIRequestChecker.java index caa814a299c..5266998a6ef 100755 --- a/identity/src/main/java/org/zstack/identity/AccountAPIRequestChecker.java +++ b/identity/src/main/java/org/zstack/identity/AccountAPIRequestChecker.java @@ -17,6 +17,7 @@ import javax.persistence.Tuple; import java.lang.reflect.Field; import java.util.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class AccountAPIRequestChecker implements APIRequestChecker { @@ -146,7 +147,7 @@ protected void scripts() { String resourceUuid = t.get(2, String.class); String resourceType = t.get(3, String.class); if (!session.getAccountUuid().equals(resourceOwnerAccountUuid)) { - throw new OperationFailureException(err(IdentityErrors.PERMISSION_DENIED, "operation denied. The resource[uuid: %s, type: %s,ownerAccountName:%s, ownerAccountUuid:%s] doesn't belong to the account[uuid: %s]", + throw new OperationFailureException(err(ORG_ZSTACK_IDENTITY_10018, IdentityErrors.PERMISSION_DENIED, "operation denied. The resource[uuid: %s, type: %s,ownerAccountName:%s, ownerAccountUuid:%s] doesn't belong to the account[uuid: %s]", resourceUuid, resourceType, resourceOwnerName, resourceOwnerAccountUuid, session.getAccountUuid() )); } diff --git a/identity/src/main/java/org/zstack/identity/AccountBase.java b/identity/src/main/java/org/zstack/identity/AccountBase.java index ca4d7c59ed0..20f072628c4 100755 --- a/identity/src/main/java/org/zstack/identity/AccountBase.java +++ b/identity/src/main/java/org/zstack/identity/AccountBase.java @@ -55,6 +55,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class AccountBase extends AbstractAccount { @@ -342,7 +343,7 @@ private void handle(APIUpdateUserGroupMsg msg) { if (!AccountConstant.INITIAL_SYSTEM_ADMIN_UUID.equals(msg.getAccountUuid()) && !group.getAccountUuid().equals(msg.getAccountUuid())) { - throw new OperationFailureException(argerr("the user group[uuid:%s] does not belong to the account[uuid:%s]", group.getUuid(), msg.getAccountUuid())); + throw new OperationFailureException(argerr(ORG_ZSTACK_IDENTITY_10008, "the user group[uuid:%s] does not belong to the account[uuid:%s]", group.getUuid(), msg.getAccountUuid())); } boolean update = false; @@ -547,7 +548,7 @@ private void handle(APIShareResourceMsg msg) { for (String ruuid : msg.getResourceUuids()) { if (!uuidType.containsKey(ruuid)) { - throw new OperationFailureException(argerr("the account[uuid: %s] doesn't have a resource[uuid: %s]", self.getUuid(), ruuid)); + throw new OperationFailureException(argerr(ORG_ZSTACK_IDENTITY_10009, "the account[uuid: %s] doesn't have a resource[uuid: %s]", self.getUuid(), ruuid)); } } @@ -609,12 +610,12 @@ private void handle(APIUpdateUserMsg msg) { UserVO user = dbf.findByUuid(msg.getUuid(), UserVO.class); if (!AccountConstant.INITIAL_SYSTEM_ADMIN_UUID.equals(msg.getAccountUuid()) && !user.getAccountUuid().equals(msg.getAccountUuid())) { - throw new OperationFailureException(argerr("the user[uuid:%s] does not belong to the" + + throw new OperationFailureException(argerr(ORG_ZSTACK_IDENTITY_10010, "the user[uuid:%s] does not belong to the" + " account[uuid:%s]", user.getUuid(), msg.getAccountUuid())); } if (msg.getOldPassword() != null && !msg.getOldPassword().equals(user.getPassword())){ - throw new OperationFailureException(argerr("old password is not equal to the original password, cannot update the password of user[uuid:%s]", user.getUuid())); + throw new OperationFailureException(argerr(ORG_ZSTACK_IDENTITY_10011, "old password is not equal to the original password, cannot update the password of user[uuid:%s]", user.getUuid())); } boolean update = false; diff --git a/identity/src/main/java/org/zstack/identity/AccountInterceptor.java b/identity/src/main/java/org/zstack/identity/AccountInterceptor.java index 1e3909a817b..e6683bb2732 100644 --- a/identity/src/main/java/org/zstack/identity/AccountInterceptor.java +++ b/identity/src/main/java/org/zstack/identity/AccountInterceptor.java @@ -17,6 +17,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.err; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by MaJin on 2019/7/4. @@ -43,7 +44,7 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti private void validate(APICheckPasswordMessage msg) { SessionInventory session = Session.getSession(msg.getSession().getUuid()); if (session == null) { - throw new ApiMessageInterceptionException(err(IdentityErrors.INVALID_SESSION, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_IDENTITY_10000, IdentityErrors.INVALID_SESSION, "Session expired")); } @@ -52,7 +53,7 @@ private void validate(APICheckPasswordMessage msg) { .eq(AccountVO_.password, msg.getPassword()) .isExists(); if (!correct) { - throw new ApiMessageInterceptionException(argerr("wrong password")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_10001, "wrong password")); } } } diff --git a/identity/src/main/java/org/zstack/identity/AccountLoginBackend.java b/identity/src/main/java/org/zstack/identity/AccountLoginBackend.java index 0cbaf8b45aa..f23e3ade43b 100644 --- a/identity/src/main/java/org/zstack/identity/AccountLoginBackend.java +++ b/identity/src/main/java/org/zstack/identity/AccountLoginBackend.java @@ -12,6 +12,7 @@ import java.util.*; import static org.zstack.core.Platform.err; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by kayo on 2018/7/10. @@ -58,7 +59,7 @@ public void login(LoginContext loginContext, ReturnValueCompletion refs = q.getResultList(); if (refs.isEmpty()) { - throw new OperationFailureException(argerr("cannot find the resource[uuid:%s]; wrong resourceUuid or the resource is admin resource", + throw new OperationFailureException(argerr(ORG_ZSTACK_IDENTITY_10022, "cannot find the resource[uuid:%s]; wrong resourceUuid or the resource is admin resource", resourceUuid)); } @@ -212,7 +213,7 @@ public boolean isAdmin(SessionInventory session) { private void passThrough(AccountMessage msg) { AccountVO vo = dbf.findByUuid(msg.getAccountUuid(), AccountVO.class); if (vo == null) { - bus.replyErrorByMessageType((Message) msg, err(SysErrors.RESOURCE_NOT_FOUND, "unable to find account[uuid=%s]", msg.getAccountUuid())); + bus.replyErrorByMessageType((Message) msg, err(ORG_ZSTACK_IDENTITY_10023, SysErrors.RESOURCE_NOT_FOUND, "unable to find account[uuid=%s]", msg.getAccountUuid())); return; } @@ -324,7 +325,7 @@ public void run(FlowTrigger trigger, Map data) { AccountResourceRefVO accResRefVO = queryAccResRefVO.find(); String resourceOriginalOwnerAccountUuid = accResRefVO.getOwnerAccountUuid(); if (resourceTargetOwnerAccountUuid.equals(resourceOriginalOwnerAccountUuid)) { - trigger.fail(err(IdentityErrors.QUOTA_INVALID_OP, + trigger.fail(err(ORG_ZSTACK_IDENTITY_10024, IdentityErrors.QUOTA_INVALID_OP, "Invalid ChangeResourceOwner operation." + "Original owner is the same as target owner." + "Current account is [uuid: %s]." + @@ -404,7 +405,7 @@ private void handle(APICheckApiPermissionMsg msg) { if (!isAdmin && !isMine) { throw new OperationFailureException(operr( - "the user specified by the userUuid[%s] does not belong to the current account, and the" + + ORG_ZSTACK_IDENTITY_10025, "the user specified by the userUuid[%s] does not belong to the current account, and the" + " current account is not an admin account, so it has no permission to check the user's" + "permissions", msg.getUserUuid() )); @@ -436,7 +437,7 @@ private void handle(APICheckApiPermissionMsg msg) { ret.put(apiName, PolicyStatementEffect.Deny.toString()); } } catch (ClassNotFoundException e) { - throw new OperationFailureException(argerr("%s is not an API", apiName)); + throw new OperationFailureException(argerr(ORG_ZSTACK_IDENTITY_10026, "%s is not an API", apiName)); } catch (Exception e) { throw new CloudRuntimeException(e); } @@ -499,7 +500,7 @@ private void handle(APILogInByUserMsg msg) { accountq.add(AccountVO_.name, Op.EQ, msg.getAccountName()); accountUuid = accountq.findValue(); if (accountUuid == null) { - reply.setError(err(IdentityErrors.AUTHENTICATION_ERROR, "wrong account or username or password")); + reply.setError(err(ORG_ZSTACK_IDENTITY_10027, IdentityErrors.AUTHENTICATION_ERROR, "wrong account or username or password")); bus.reply(msg, reply); return; } @@ -512,7 +513,7 @@ private void handle(APILogInByUserMsg msg) { UserVO user = q.find(); if (user == null) { - reply.setError(err(IdentityErrors.AUTHENTICATION_ERROR, + reply.setError(err(ORG_ZSTACK_IDENTITY_10028, IdentityErrors.AUTHENTICATION_ERROR, "wrong account or username or password" )); bus.reply(msg, reply); @@ -1063,7 +1064,7 @@ public List getResourceUuidsCanAccessByAccount(String accountUuid, Class q.setParameter("auuid", accountUuid); List types = q.getResultList(); if (types.isEmpty()) { - throw new OperationFailureException(argerr("cannot find the account[uuid:%s]", accountUuid)); + throw new OperationFailureException(argerr(ORG_ZSTACK_IDENTITY_10029, "cannot find the account[uuid:%s]", accountUuid)); } AccountType atype = types.get(0); @@ -1248,7 +1249,7 @@ private void accountFieldCheck() throws IllegalAccessException { String resourceUuid = t.get(2, String.class); String resourceType = t.get(3, String.class); if (!session.getAccountUuid().equals(resourceOwnerAccountUuid)) { - throw new ApiMessageInterceptionException(err(IdentityErrors.PERMISSION_DENIED, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_IDENTITY_10030, IdentityErrors.PERMISSION_DENIED, "operation denied. The resource[uuid: %s, type: %s,ownerAccountName:%s, ownerAccountUuid:%s] doesn't belong to the account[uuid: %s]", resourceUuid, resourceType, resourceOwnerName, resourceOwnerAccountUuid, session.getAccountUuid() )); @@ -1273,7 +1274,7 @@ private void useDecision(Decision d, boolean userPolicy) { " statement[name: %s, action: %s]", msg.getClass().getSimpleName(), d.action, policyCategory, d.policy.getName(), d.policy.getUuid(), d.statement.getName(), d.actionRule)); - throw new ApiMessageInterceptionException(err(IdentityErrors.PERMISSION_DENIED, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_IDENTITY_10031, IdentityErrors.PERMISSION_DENIED, "%s denied. user[name: %s, uuid: %s] is denied to execute API[%s]", policyCategory, username, session.getUuid(), msg.getClass().getSimpleName() )); @@ -1286,12 +1287,12 @@ private void policyCheck() { } if (action.adminOnly) { - throw new ApiMessageInterceptionException(err(IdentityErrors.PERMISSION_DENIED, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_IDENTITY_10032, IdentityErrors.PERMISSION_DENIED, "API[%s] is admin only", msg.getClass().getSimpleName())); } if (action.accountOnly && !session.isAccountSession()) { - throw new ApiMessageInterceptionException(err(IdentityErrors.PERMISSION_DENIED, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_IDENTITY_10033, IdentityErrors.PERMISSION_DENIED, "API[%s] can only be called by an account, the current session is a user session[user uuid:%s]", msg.getClass().getSimpleName(), session.getUserUuid() )); @@ -1326,7 +1327,7 @@ private void policyCheck() { } if (!allow) { - throw new ApiMessageInterceptionException(err(IdentityErrors.PERMISSION_DENIED, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_IDENTITY_10034, IdentityErrors.PERMISSION_DENIED, "the API[%s] is not allowed for normal accounts", msg.getClass() )); } @@ -1355,7 +1356,7 @@ private void policyCheck() { return; } - throw new ApiMessageInterceptionException(err(IdentityErrors.PERMISSION_DENIED, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_IDENTITY_10035, IdentityErrors.PERMISSION_DENIED, "user[name: %s, uuid: %s] has no policy set for this operation, API[%s] is denied by default. You may either create policies for this user" + " or add the user into a group with polices set", username, session.getUserUuid(), msg.getClass().getSimpleName() )); @@ -1423,18 +1424,18 @@ private List getUserPolicies() { private void sessionCheck() { if (msg.getSession() == null) { - throw new ApiMessageInterceptionException(err(IdentityErrors.INVALID_SESSION, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_IDENTITY_10036, IdentityErrors.INVALID_SESSION, "session of message[%s] is null", msg.getMessageName())); } if (msg.getSession().getUuid() == null) { - throw new ApiMessageInterceptionException(err(IdentityErrors.INVALID_SESSION, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_IDENTITY_10037, IdentityErrors.INVALID_SESSION, "session uuid is null")); } SessionInventory session = Session.getSession(msg.getSession().getUuid()); if (session == null) { - throw new ApiMessageInterceptionException(err(IdentityErrors.INVALID_SESSION, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_IDENTITY_10038, IdentityErrors.INVALID_SESSION, "Session expired")); } @@ -1443,7 +1444,7 @@ private void sessionCheck() { logger.debug(String.format("session expired[%s < %s] for account[uuid:%s]", curr, session.getExpiredDate(), session.getAccountUuid())); logOutSession(session.getUuid()); - throw new ApiMessageInterceptionException(err(IdentityErrors.INVALID_SESSION, "Session expired")); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_IDENTITY_10039, IdentityErrors.INVALID_SESSION, "Session expired")); } this.session = session; @@ -1504,7 +1505,7 @@ private void validate(APIGetAccountQuotaUsageMsg msg) { private void validate(APILogInByUserMsg msg) { if (msg.getAccountName() == null && msg.getAccountUuid() == null) { throw new ApiMessageInterceptionException(argerr( - "accountName and accountUuid cannot both be null, you must specify at least one" + ORG_ZSTACK_IDENTITY_10040, "accountName and accountUuid cannot both be null, you must specify at least one" )); } } @@ -1514,7 +1515,7 @@ private void validate(APICreateUserGroupMsg msg) { q.add(UserGroupVO_.accountUuid, Op.EQ, msg.getAccountUuid()); q.add(UserGroupVO_.name, Op.EQ, msg.getName()); if (q.isExists()) { - throw new ApiMessageInterceptionException(argerr("unable to create a group. A group called %s is already under the account[uuid:%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_10041, "unable to create a group. A group called %s is already under the account[uuid:%s]", msg.getName(), msg.getAccountUuid())); } } @@ -1524,7 +1525,7 @@ private void validate(APICreateUserMsg msg) { q.add(UserVO_.accountUuid, Op.EQ, msg.getAccountUuid()); q.add(UserVO_.name, Op.EQ, msg.getName()); if (q.isExists()) { - throw new ApiMessageInterceptionException(argerr("unable to create a user. A user called %s is already under the account[uuid:%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_10042, "unable to create a user. A user called %s is already under the account[uuid:%s]", msg.getName(), msg.getAccountUuid())); } } @@ -1533,7 +1534,7 @@ private void validate(APICreateAccountMsg msg) { SimpleQuery q = dbf.createQuery(AccountVO.class); q.add(AccountVO_.name, Op.EQ, msg.getName()); if (q.isExists()) { - throw new ApiMessageInterceptionException(argerr("unable to create an account. An account already called %s", msg.getName())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_10043, "unable to create an account. An account already called %s", msg.getName())); } } @@ -1541,19 +1542,19 @@ private void validate(APIDeleteAccountMsg msg) { if (new QuotaUtil().isAdminAccount(msg.getUuid())) { if (msg.getAccountUuid().equals(msg.getSession().getAccountUuid())) { throw new ApiMessageInterceptionException(argerr( - "account cannot delete itself" + ORG_ZSTACK_IDENTITY_10044, "account cannot delete itself" )); } if (msg.getAccountUuid().equals(AccountConstant.INITIAL_SYSTEM_ADMIN_UUID)) { throw new ApiMessageInterceptionException(argerr( - "cannot delete builtin admin account." + ORG_ZSTACK_IDENTITY_10045, "cannot delete builtin admin account." )); } } if(!new QuotaUtil().isAdminAccount(msg.getSession().getAccountUuid())){ throw new ApiMessageInterceptionException(argerr( - "Only admin can delete account." + ORG_ZSTACK_IDENTITY_10046, "Only admin can delete account." )); } } @@ -1561,7 +1562,7 @@ private void validate(APIDeleteAccountMsg msg) { private void validate(APIUpdateUserMsg msg) { if (msg.getUuid() == null && msg.getSession().isAccountSession()) { throw new ApiMessageInterceptionException(argerr( - "the current session is an account session. You need to specify the field 'uuid' of the user" + + ORG_ZSTACK_IDENTITY_10047, "the current session is an account session. You need to specify the field 'uuid' of the user" + " you want to update" )); } @@ -1575,7 +1576,7 @@ private void validate(APIUpdateUserMsg msg) { } if (msg.getUuid() != null && !msg.getSession().getUserUuid().equals(msg.getUuid())) { - throw new ApiMessageInterceptionException(argerr("your are login as a user, you cannot another user[uuid:%s]", msg.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_10048, "your are login as a user, you cannot another user[uuid:%s]", msg.getUuid())); } msg.setUuid(msg.getSession().getUserUuid()); @@ -1584,7 +1585,7 @@ private void validate(APIUpdateUserMsg msg) { private void validate(APIRevokeResourceSharingMsg msg) { if (!msg.isAll() && (msg.getAccountUuids() == null || msg.getAccountUuids().isEmpty())) { throw new ApiMessageInterceptionException(argerr( - "all is set to false, accountUuids cannot be null or empty" + ORG_ZSTACK_IDENTITY_10049, "all is set to false, accountUuids cannot be null or empty" )); } } @@ -1592,7 +1593,7 @@ private void validate(APIRevokeResourceSharingMsg msg) { private void validate(APIShareResourceMsg msg) { if (!msg.isToPublic() && (msg.getAccountUuids() == null || msg.getAccountUuids().isEmpty())) { throw new ApiMessageInterceptionException(argerr( - "toPublic is set to false, accountUuids cannot be null or empty" + ORG_ZSTACK_IDENTITY_10050, "toPublic is set to false, accountUuids cannot be null or empty" )); } } @@ -1601,11 +1602,11 @@ private void validate(APIDetachPolicyFromUserMsg msg) { PolicyVO policy = dbf.findByUuid(msg.getPolicyUuid(), PolicyVO.class); UserVO user = dbf.findByUuid(msg.getUserUuid(), UserVO.class); if (!policy.getAccountUuid().equals(msg.getAccountUuid())) { - throw new ApiMessageInterceptionException(argerr("policy[name: %s, uuid: %s] doesn't belong to the account[uuid: %s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_10051, "policy[name: %s, uuid: %s] doesn't belong to the account[uuid: %s]", policy.getName(), policy.getUuid(), msg.getSession().getAccountUuid())); } if (!user.getAccountUuid().equals(msg.getAccountUuid())) { - throw new ApiMessageInterceptionException(argerr("user[name: %s, uuid: %s] doesn't belong to the account[uuid: %s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_10052, "user[name: %s, uuid: %s] doesn't belong to the account[uuid: %s]", user.getName(), user.getUuid(), msg.getSession().getAccountUuid())); } } @@ -1614,11 +1615,11 @@ private void validate(APIDetachPolicyFromUserGroupMsg msg) { PolicyVO policy = dbf.findByUuid(msg.getPolicyUuid(), PolicyVO.class); UserGroupVO group = dbf.findByUuid(msg.getGroupUuid(), UserGroupVO.class); if (!policy.getAccountUuid().equals(msg.getAccountUuid())) { - throw new ApiMessageInterceptionException(argerr("policy[name: %s, uuid: %s] doesn't belong to the account[uuid: %s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_10053, "policy[name: %s, uuid: %s] doesn't belong to the account[uuid: %s]", policy.getName(), policy.getUuid(), msg.getSession().getAccountUuid())); } if (!group.getAccountUuid().equals(msg.getAccountUuid())) { - throw new ApiMessageInterceptionException(argerr("group[name: %s, uuid: %s] doesn't belong to the account[uuid: %s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_10054, "group[name: %s, uuid: %s] doesn't belong to the account[uuid: %s]", group.getName(), group.getUuid(), msg.getSession().getAccountUuid())); } } @@ -1627,11 +1628,11 @@ private void validate(APIAttachPolicyToUserMsg msg) { PolicyVO policy = dbf.findByUuid(msg.getPolicyUuid(), PolicyVO.class); UserVO user = dbf.findByUuid(msg.getUserUuid(), UserVO.class); if (!policy.getAccountUuid().equals(msg.getAccountUuid())) { - throw new ApiMessageInterceptionException(argerr("policy[name: %s, uuid: %s] doesn't belong to the account[uuid: %s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_10055, "policy[name: %s, uuid: %s] doesn't belong to the account[uuid: %s]", policy.getName(), policy.getUuid(), msg.getSession().getAccountUuid())); } if (!user.getAccountUuid().equals(msg.getAccountUuid())) { - throw new ApiMessageInterceptionException(argerr("user[name: %s, uuid: %s] doesn't belong to the account[uuid: %s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_10056, "user[name: %s, uuid: %s] doesn't belong to the account[uuid: %s]", user.getName(), user.getUuid(), msg.getSession().getAccountUuid())); } } @@ -1640,12 +1641,12 @@ private void validate(APIAttachPolicyToUserGroupMsg msg) { PolicyVO policy = dbf.findByUuid(msg.getPolicyUuid(), PolicyVO.class); UserGroupVO group = dbf.findByUuid(msg.getGroupUuid(), UserGroupVO.class); if (!policy.getAccountUuid().equals(msg.getAccountUuid())) { - throw new ApiMessageInterceptionException(argerr("policy[name: %s, uuid: %s] doesn't belong to the account[uuid: %s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_10057, "policy[name: %s, uuid: %s] doesn't belong to the account[uuid: %s]", policy.getName(), policy.getUuid(), msg.getSession().getAccountUuid())); } if (!group.getAccountUuid().equals(msg.getAccountUuid())) { - throw new ApiMessageInterceptionException(argerr("group[name: %s, uuid: %s] doesn't belong to the account[uuid: %s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_10058, "group[name: %s, uuid: %s] doesn't belong to the account[uuid: %s]", group.getName(), group.getUuid(), msg.getSession().getAccountUuid())); } } @@ -1654,11 +1655,11 @@ private void validate(APIAddUserToGroupMsg msg) { UserVO user = dbf.findByUuid(msg.getUserUuid(), UserVO.class); UserGroupVO group = dbf.findByUuid(msg.getGroupUuid(), UserGroupVO.class); if (!user.getAccountUuid().equals(msg.getAccountUuid())) { - throw new ApiMessageInterceptionException(argerr("user[name: %s, uuid: %s] doesn't belong to the account[uuid: %s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_10059, "user[name: %s, uuid: %s] doesn't belong to the account[uuid: %s]", user.getName(), user.getUuid(), msg.getSession().getAccountUuid())); } if (!group.getAccountUuid().equals(msg.getSession().getAccountUuid())) { - throw new ApiMessageInterceptionException(argerr("group[name: %s, uuid: %s] doesn't belong to the account[uuid: %s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_10060, "group[name: %s, uuid: %s] doesn't belong to the account[uuid: %s]", group.getName(), group.getUuid(), msg.getSession().getAccountUuid())); } } @@ -1668,13 +1669,13 @@ private void validate(APICreatePolicyMsg msg) { for (PolicyStatement s : msg.getStatements()) { if (s.getEffect() == null) { - throw new ApiMessageInterceptionException(argerr("a statement must have effect field. Invalid statement[%s]", JSONObjectUtil.toJsonString(s))); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_10061, "a statement must have effect field. Invalid statement[%s]", JSONObjectUtil.toJsonString(s))); } if (s.getActions() == null) { - throw new ApiMessageInterceptionException(argerr("a statement must have action field. Invalid statement[%s]", JSONObjectUtil.toJsonString(s))); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_10062, "a statement must have action field. Invalid statement[%s]", JSONObjectUtil.toJsonString(s))); } if (s.getActions().isEmpty()) { - throw new ApiMessageInterceptionException(argerr("a statement must have a non-empty action field. Invalid statement[%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_10063, "a statement must have a non-empty action field. Invalid statement[%s]", JSONObjectUtil.toJsonString(s))); } @@ -1685,7 +1686,7 @@ private void validate(APICreatePolicyMsg msg) { if (s.getActions() != null) { s.getActions().forEach(as -> { if (PolicyUtils.isAdminOnlyAction(as)) { - throw new OperationFailureException(err(IdentityErrors.PERMISSION_DENIED, "normal accounts can't create admin-only action polices[%s]", as)); + throw new OperationFailureException(err(ORG_ZSTACK_IDENTITY_10064, IdentityErrors.PERMISSION_DENIED, "normal accounts can't create admin-only action polices[%s]", as)); } }); } @@ -1699,7 +1700,7 @@ private void validate(APIUpdateAccountMsg msg) { SimpleQuery q = dbf.createQuery(AccountVO.class); q.add(AccountVO_.name, Op.EQ, msg.getName()); if (q.isExists()) { - throw new ApiMessageInterceptionException(argerr("unable to update name. An account already called %s", msg.getName())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_10065, "unable to update name. An account already called %s", msg.getName())); } } @@ -1710,25 +1711,25 @@ private void validate(APIUpdateAccountMsg msg) { if (msg.getOldPassword() != null && !msg.getOldPassword().equals(account.getPassword())) { - throw new OperationFailureException(operr("old password is not equal to the original password, cannot update the password of account[uuid: %s]", msg.getUuid())); + throw new OperationFailureException(operr(ORG_ZSTACK_IDENTITY_10066, "old password is not equal to the original password, cannot update the password of account[uuid: %s]", msg.getUuid())); } if (a.getType() == AccountType.SystemAdmin) { if (msg.getName() != null && (msg.getUuid() == null || msg.getUuid().equals(AccountConstant.INITIAL_SYSTEM_ADMIN_UUID))) { throw new OperationFailureException(operr( - "the name of admin account cannot be updated" + ORG_ZSTACK_IDENTITY_10067, "the name of admin account cannot be updated" )); } if (msg.getPassword() != null && (!AccountConstant.isAdminPermission(msg.getSession()))) { - throw new OperationFailureException(operr("only admin account can update it's password")); + throw new OperationFailureException(operr(ORG_ZSTACK_IDENTITY_10068, "only admin account can update it's password")); } return; } if (!account.getUuid().equals(a.getUuid())) { - throw new OperationFailureException(operr("account[uuid: %s, name: %s] is a normal account, it cannot reset the password of another account[uuid: %s]", + throw new OperationFailureException(operr(ORG_ZSTACK_IDENTITY_10069, "account[uuid: %s, name: %s] is a normal account, it cannot reset the password of another account[uuid: %s]", account.getUuid(), account.getName(), msg.getUuid())); } } @@ -1739,14 +1740,14 @@ private void validate(APIUpdateQuotaMsg msg) { .eq(QuotaVO_.name, msg.getName()) .find(); if (quota == null) { - throw new OperationFailureException(argerr("cannot find Quota[name: %s] for the account[uuid: %s]", msg.getName(), msg.getIdentityUuid())); + throw new OperationFailureException(argerr(ORG_ZSTACK_IDENTITY_10070, "cannot find Quota[name: %s] for the account[uuid: %s]", msg.getName(), msg.getIdentityUuid())); } List checkers = quotaChangeCheckers.stream() .filter(checker -> checker.type().contains(quota.getIdentityType())).collect(Collectors.toList()); if (checkers.isEmpty()) { throw new ApiMessageInterceptionException( - argerr("can not find quota update checker for quota[uuid:%s, type:%s]", quota.getIdentityUuid(), quota.getIdentityType())); + argerr(ORG_ZSTACK_IDENTITY_10071, "can not find quota update checker for quota[uuid:%s, type:%s]", quota.getIdentityUuid(), quota.getIdentityType())); } for (QuotaUpdateChecker checker : checkers) { @@ -1755,7 +1756,7 @@ private void validate(APIUpdateQuotaMsg msg) { ErrorCode errorCode = checker.check(quota, msg.getValue()); if (errorCode != null) { throw new ApiMessageInterceptionException( - operr(errorCode, "cannot update Quota[name: %s] for the account[uuid: %s]", msg.getName(), msg.getIdentityUuid())); + operr(ORG_ZSTACK_IDENTITY_10072, errorCode, "cannot update Quota[name: %s] for the account[uuid: %s]", msg.getName(), msg.getIdentityUuid())); } } diff --git a/identity/src/main/java/org/zstack/identity/AccountQuotaUpdateChecker.java b/identity/src/main/java/org/zstack/identity/AccountQuotaUpdateChecker.java index b56d11c65cd..44f28cdb2eb 100644 --- a/identity/src/main/java/org/zstack/identity/AccountQuotaUpdateChecker.java +++ b/identity/src/main/java/org/zstack/identity/AccountQuotaUpdateChecker.java @@ -11,6 +11,7 @@ import java.util.Set; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by Wenhao.Zhang on 21/12/22 @@ -29,7 +30,7 @@ public Set type() { @Override public ErrorCode check(QuotaVO quota, long updatedValue) { if (updatedValue < 0) { - return argerr("the quota[name:%s] of account[uuid:%s] can not be %d", + return argerr(ORG_ZSTACK_IDENTITY_10016, "the quota[name:%s] of account[uuid:%s] can not be %d", quota.getName(), quota.getIdentityUuid(), updatedValue); } return checkQuotaChangeForAccount(quota.getIdentityUuid(), quota.getName(), updatedValue); @@ -51,7 +52,7 @@ private ErrorCode checkQuotaChangeForAccount(String accountUuid, String quotaNam } if (used > updatedValue) { - return argerr("the account[uuid:%s] used [name:%s, usedValue:%s] exceeds request quota: %d", + return argerr(ORG_ZSTACK_IDENTITY_10017, "the account[uuid:%s] used [name:%s, usedValue:%s] exceeds request quota: %d", accountUuid, quotaName, used, updatedValue); } diff --git a/identity/src/main/java/org/zstack/identity/AuthorizationManager.java b/identity/src/main/java/org/zstack/identity/AuthorizationManager.java index fe7f727b7ce..fa50e2b9e8d 100755 --- a/identity/src/main/java/org/zstack/identity/AuthorizationManager.java +++ b/identity/src/main/java/org/zstack/identity/AuthorizationManager.java @@ -26,6 +26,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.err; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class AuthorizationManager implements GlobalApiMessageInterceptor, Component, ZQLQueryExtensionPoint { private static final CLogger logger = Utils.getLogger(AuthorizationManager.class); @@ -62,12 +63,12 @@ void init() { private SessionInventory evaluateSession(APIMessage msg) { if (msg.getSession() == null) { - throw new ApiMessageInterceptionException(err(IdentityErrors.INVALID_SESSION, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_IDENTITY_10012, IdentityErrors.INVALID_SESSION, "session of message[%s] is null", msg.getMessageName())); } if (msg.getSession().getUuid() == null) { - throw new ApiMessageInterceptionException(err(IdentityErrors.INVALID_SESSION, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_IDENTITY_10013, IdentityErrors.INVALID_SESSION, "session uuid is null")); } @@ -155,6 +156,6 @@ public static ErrorCode createAdditionAuthErrorCode(Map properti Arrays.asList(authentications).forEach(authArray::add); o.add("authentications", authArray); properties.forEach(o::addProperty); - return err(IdentityErrors.NEED_ADDITION_AUTHENTICATION, "%s", o.toString()); + return err(ORG_ZSTACK_IDENTITY_10014, IdentityErrors.NEED_ADDITION_AUTHENTICATION, "%s", o.toString()); } } diff --git a/identity/src/main/java/org/zstack/identity/DefaultAuthorizationBackend.java b/identity/src/main/java/org/zstack/identity/DefaultAuthorizationBackend.java index 7fc4f11ff01..9add92a8817 100755 --- a/identity/src/main/java/org/zstack/identity/DefaultAuthorizationBackend.java +++ b/identity/src/main/java/org/zstack/identity/DefaultAuthorizationBackend.java @@ -20,6 +20,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class DefaultAuthorizationBackend implements AuthorizationBackend { private static final CLogger logger = Utils.getLogger(DefaultAuthorizationBackend.class); @@ -63,7 +64,7 @@ public void validatePermission(List classes, SessionInventory session) { List deniedApis = permissionResult.entrySet().stream().filter(entry -> !entry.getValue()).map(Map.Entry::getKey).collect(Collectors.toList()); if (!deniedApis.isEmpty()) { - throw new OperationFailureException(operr("the operations[%s] is denied", deniedApis)); + throw new OperationFailureException(operr(ORG_ZSTACK_IDENTITY_10005, "the operations[%s] is denied", deniedApis)); } } } diff --git a/identity/src/main/java/org/zstack/identity/QuotaUtil.java b/identity/src/main/java/org/zstack/identity/QuotaUtil.java index 94313ab1915..e39ee6aab2b 100644 --- a/identity/src/main/java/org/zstack/identity/QuotaUtil.java +++ b/identity/src/main/java/org/zstack/identity/QuotaUtil.java @@ -32,9 +32,10 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.err; -/** +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*;/** * Created by miao on 16-10-9. */ + @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class QuotaUtil { private static final CLogger logger = Utils.getLogger(QuotaUtil.class); @@ -79,7 +80,7 @@ public void CheckQuota(QuotaCompareInfo quotaCompareInfo) { .eq(AccountVO_.uuid, quotaCompareInfo.resourceTargetOwnerAccountUuid) .findValue(); if (quotaCompareInfo.currentUsed + quotaCompareInfo.request > quotaCompareInfo.quotaValue) { - throw new ApiMessageInterceptionException(err(IdentityErrors.QUOTA_EXCEEDING, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_IDENTITY_10002, IdentityErrors.QUOTA_EXCEEDING, "quota exceeding." + "The resource owner(or target resource owner) account[uuid: %s name: %s] exceeds a quota[name: %s, value: %s], " + "Current used:%s, Request:%s. Please contact the administrator.", @@ -129,14 +130,14 @@ public String getResourceType(String resourceUuid) { } public ErrorCode buildQuataExceedError(String currentAccountUuid, String quotaName, long quotaValue){ - return err(IdentityErrors.QUOTA_EXCEEDING, + return err(ORG_ZSTACK_IDENTITY_10003, IdentityErrors.QUOTA_EXCEEDING, "quota exceeding. The account[uuid: %s] exceeds a quota[name: %s, value: %s]. Please contact the administrator.", currentAccountUuid, quotaName, quotaValue); } public ErrorCode buildQuataExceedError(String currentAccountUuid, String quotaName, long quotaValue, long currentUsed, long request){ - return err(IdentityErrors.QUOTA_EXCEEDING, + return err(ORG_ZSTACK_IDENTITY_10004, IdentityErrors.QUOTA_EXCEEDING, "quota exceeding. The account[uuid: %s] exceeds a quota[name: %s, value: %s]," + " Current used:%s, Request:%s. Please contact the administrator.", currentAccountUuid, quotaName, quotaValue, currentUsed, request); diff --git a/identity/src/main/java/org/zstack/identity/Session.java b/identity/src/main/java/org/zstack/identity/Session.java index 2b27931beef..0f48c5d639a 100755 --- a/identity/src/main/java/org/zstack/identity/Session.java +++ b/identity/src/main/java/org/zstack/identity/Session.java @@ -30,6 +30,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class Session implements Component { private static final CLogger logger = Utils.getLogger(Session.class); @@ -83,7 +84,7 @@ private Timestamp getCurrentSqlDate() { @Override protected SessionInventory scripts() { if (q(SessionVO.class).eq(SessionVO_.userUuid, userUuid).count() >= IdentityGlobalConfig.MAX_CONCURRENT_SESSION.value(Integer.class)) { - throw new OperationFailureException(err(IdentityErrors.MAX_CONCURRENT_SESSION_EXCEEDED, "Login sessions hit limit of max allowed concurrent login sessions")); + throw new OperationFailureException(err(ORG_ZSTACK_IDENTITY_10019, IdentityErrors.MAX_CONCURRENT_SESSION_EXCEEDED, "Login sessions hit limit of max allowed concurrent login sessions")); } SessionVO vo = new SessionVO(); @@ -206,7 +207,7 @@ private Timestamp getCurrentSqlDate() { protected ErrorCode scripts() { SessionInventory s = getSession(uuid); if (s == null) { - return err(IdentityErrors.INVALID_SESSION, "Session expired"); + return err(ORG_ZSTACK_IDENTITY_10020, IdentityErrors.INVALID_SESSION, "Session expired"); } Timestamp curr = getCurrentSqlDate(); @@ -230,7 +231,7 @@ protected ErrorCode scripts() { ext.beforeLogout(s); } - return err(IdentityErrors.INVALID_SESSION, "Session expired"); + return err(ORG_ZSTACK_IDENTITY_10021, IdentityErrors.INVALID_SESSION, "Session expired"); } return null; diff --git a/identity/src/main/java/org/zstack/identity/SessionAPIRequestChecker.java b/identity/src/main/java/org/zstack/identity/SessionAPIRequestChecker.java index ec1413996f2..7f3f375e0f9 100755 --- a/identity/src/main/java/org/zstack/identity/SessionAPIRequestChecker.java +++ b/identity/src/main/java/org/zstack/identity/SessionAPIRequestChecker.java @@ -4,17 +4,18 @@ import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.rbac.RBACEntity; import static org.zstack.core.Platform.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class SessionAPIRequestChecker implements APIRequestChecker { @Override public void check(RBACEntity entity) { if (entity.getApiMessage().getSession() == null) { - throw new ApiMessageInterceptionException(err(IdentityErrors.INVALID_SESSION, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_IDENTITY_10006, IdentityErrors.INVALID_SESSION, "session of message[%s] is null", entity.getApiMessage().getMessageName())); } if (entity.getApiMessage().getSession().getUuid() == null) { - throw new ApiMessageInterceptionException(err(IdentityErrors.INVALID_SESSION, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_IDENTITY_10007, IdentityErrors.INVALID_SESSION, "session uuid is null")); } diff --git a/identity/src/main/java/org/zstack/identity/login/LoginManagerImpl.java b/identity/src/main/java/org/zstack/identity/login/LoginManagerImpl.java index 42b127de4cd..45086320dba 100644 --- a/identity/src/main/java/org/zstack/identity/login/LoginManagerImpl.java +++ b/identity/src/main/java/org/zstack/identity/login/LoginManagerImpl.java @@ -25,6 +25,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class LoginManagerImpl extends AbstractService implements LoginManager { private static final CLogger logger = Utils.getLogger(LoginManagerImpl.class); @@ -43,7 +44,7 @@ public LoginBackend getLoginBackend(String loginType) { LoginBackend loginBackend = loginBackends.get(loginType); if (loginBackend == null) { - throw new OperationFailureException(operr("unsupported login type %s", loginType)); + throw new OperationFailureException(operr(ORG_ZSTACK_IDENTITY_LOGIN_10000, "unsupported login type %s", loginType)); } return loginBackend; diff --git a/identity/src/main/java/org/zstack/identity/rbac/OperationTargetAPIRequestChecker.java b/identity/src/main/java/org/zstack/identity/rbac/OperationTargetAPIRequestChecker.java index a9fbd8bf1c3..943cf9df470 100755 --- a/identity/src/main/java/org/zstack/identity/rbac/OperationTargetAPIRequestChecker.java +++ b/identity/src/main/java/org/zstack/identity/rbac/OperationTargetAPIRequestChecker.java @@ -18,6 +18,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class OperationTargetAPIRequestChecker implements APIRequestChecker { @@ -161,7 +162,7 @@ private void checkIfTheAccountOperationItSelf(APIMessage.FieldParam param) throw String accountUuid = rbacEntity.getApiMessage().getSession().getAccountUuid(); if (uuids.isEmpty()) { - throw new OperationFailureException(operr("permission denied, the account[uuid:%s] is not the owner of the resource[uuid:%s, type:%s]", + throw new OperationFailureException(operr(ORG_ZSTACK_IDENTITY_RBAC_10006, "permission denied, the account[uuid:%s] is not the owner of the resource[uuid:%s, type:%s]", accountUuid, accountUuid, resourceType.getSimpleName())); } } @@ -177,7 +178,7 @@ private void checkIfTheAccountOwnTheResource(APIMessage.FieldParam param) throws uuids.forEach(uuid -> { Optional opt = bundles.stream().filter(b -> b.accountUuid.equals(rbacEntity.getApiMessage().getSession().getAccountUuid()) && b.resourceUuid.equals(uuid)).findFirst(); if (!opt.isPresent()) { - throw new OperationFailureException(operr("permission denied, the account[uuid:%s] is not the owner of the resource[uuid:%s, type:%s]", + throw new OperationFailureException(operr(ORG_ZSTACK_IDENTITY_RBAC_10007, "permission denied, the account[uuid:%s] is not the owner of the resource[uuid:%s, type:%s]", rbacEntity.getApiMessage().getSession().getAccountUuid(), uuid, resourceType.getSimpleName())); } }); @@ -225,7 +226,7 @@ private void checkIfTheAccountOwnTheTaggedResource(APIMessage.FieldParam param) .filter(b -> b.accountUuid.equals(rbacEntity.getApiMessage().getSession().getAccountUuid()) && b.resourceUuid.equals(uuid)) .findFirst(); if (!opt.isPresent()) { - throw new OperationFailureException(operr("permission denied, the account[uuid:%s] is not the owner of the tagged resource[uuid:%s, type:%s]", + throw new OperationFailureException(operr(ORG_ZSTACK_IDENTITY_RBAC_10008, "permission denied, the account[uuid:%s] is not the owner of the tagged resource[uuid:%s, type:%s]", rbacEntity.getApiMessage().getSession().getAccountUuid(), uuid, type)); } }); @@ -248,7 +249,7 @@ private void checkIfTheAccountCanAccessTheResource(APIMessage.FieldParam param) List resourceWithNoAccess = CheckIfAccountCanAccessResource.check(uuids, rbacEntity.getApiMessage().getSession().getAccountUuid()); if (!resourceWithNoAccess.isEmpty()) { - throw new OperationFailureException(operr("the account[uuid:%s] has no access to the resources[uuid:%s, type:%s]", + throw new OperationFailureException(operr(ORG_ZSTACK_IDENTITY_RBAC_10009, "the account[uuid:%s] has no access to the resources[uuid:%s, type:%s]", rbacEntity.getApiMessage().getSession().getAccountUuid(), resourceWithNoAccess, resourceType.getSimpleName())); } diff --git a/identity/src/main/java/org/zstack/identity/rbac/RBACAPIRequestChecker.java b/identity/src/main/java/org/zstack/identity/rbac/RBACAPIRequestChecker.java index c2eb1e54b08..3a1afc1e537 100755 --- a/identity/src/main/java/org/zstack/identity/rbac/RBACAPIRequestChecker.java +++ b/identity/src/main/java/org/zstack/identity/rbac/RBACAPIRequestChecker.java @@ -18,6 +18,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class RBACAPIRequestChecker implements APIRequestChecker { protected static final CLogger logger = Utils.getLogger(RBACAPIRequestChecker.class); @@ -37,7 +38,7 @@ public void check(RBACEntity entity) { } if (!AccountConstant.isAdminPermission(entity.getApiMessage().getSession()) && PolicyUtils.isAdminOnlyAction(entity.getApiName())) { - throw new OperationFailureException(err(IdentityErrors.PERMISSION_DENIED, + throw new OperationFailureException(err(ORG_ZSTACK_IDENTITY_RBAC_10010, IdentityErrors.PERMISSION_DENIED, "request api[name: %s] is admin only, can not be executed by current user", entity.getApiName())); } @@ -77,7 +78,7 @@ protected void check() { } // no polices applied to the operation, deny by default - throw new OperationFailureException(operr("operation[API:%s] is denied by default, please contact admin to correct it", rbacEntity.getApiMessage().getClass().getName())); + throw new OperationFailureException(operr(ORG_ZSTACK_IDENTITY_RBAC_10011, "operation[API:%s] is denied by default, please contact admin to correct it", rbacEntity.getApiMessage().getClass().getName())); } private String jsonMessage() { @@ -184,7 +185,7 @@ protected void evalDenyStatements(Map> de p.getUuid(), statement, jsonMessage())); } - throw new OperationFailureException(operr("the operation is denied by the policy[name:%s uuid:%s]", p.getName(), p.getUuid())); + throw new OperationFailureException(operr(ORG_ZSTACK_IDENTITY_RBAC_10012, "the operation is denied by the policy[name:%s uuid:%s]", p.getName(), p.getUuid())); } Entity entity = Entity.getEntity(rbacEntity.getApiMessage().getClass()); @@ -197,7 +198,7 @@ protected void evalDenyStatements(Map> de logger.trace(String.format("[RBAC] policy[name:%s, uuid:%s]'s statement[%s] denies the API:\n%s", p.getName(), p.getUuid(), statement, jsonMessage())); } - throw new OperationFailureException(operr("the operation is denied by the policy[name:%s, uuid:%s], field[%s] is not permitted to set", p.getName(), p.getUuid(), fname)); + throw new OperationFailureException(operr(ORG_ZSTACK_IDENTITY_RBAC_10013, "the operation is denied by the policy[name:%s, uuid:%s], field[%s] is not permitted to set", p.getName(), p.getUuid(), fname)); } } catch (IllegalAccessException e) { throw new CloudRuntimeException(e); diff --git a/identity/src/main/java/org/zstack/identity/rbac/RBACApiInterceptor.java b/identity/src/main/java/org/zstack/identity/rbac/RBACApiInterceptor.java index f491aa0d9b6..911bacf4aaf 100755 --- a/identity/src/main/java/org/zstack/identity/rbac/RBACApiInterceptor.java +++ b/identity/src/main/java/org/zstack/identity/rbac/RBACApiInterceptor.java @@ -24,6 +24,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.err; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class RBACApiInterceptor implements ApiMessageInterceptor { @Autowired @@ -63,13 +64,13 @@ private void validate(APIAddPolicyStatementsToRoleMsg msg) { for (PolicyStatement s : msg.getStatements()) { if (s.getEffect() == null) { - throw new ApiMessageInterceptionException(argerr("a statement must have effect field. Invalid statement[%s]", JSONObjectUtil.toJsonString(s))); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_RBAC_10000, "a statement must have effect field. Invalid statement[%s]", JSONObjectUtil.toJsonString(s))); } if (s.getActions() == null) { - throw new ApiMessageInterceptionException(argerr("a statement must have action field. Invalid statement[%s]", JSONObjectUtil.toJsonString(s))); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_RBAC_10001, "a statement must have action field. Invalid statement[%s]", JSONObjectUtil.toJsonString(s))); } if (s.getActions().isEmpty()) { - throw new ApiMessageInterceptionException(argerr("a statement must have a non-empty action field. Invalid statement[%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_RBAC_10002, "a statement must have a non-empty action field. Invalid statement[%s]", JSONObjectUtil.toJsonString(s))); } @@ -80,7 +81,7 @@ private void validate(APIAddPolicyStatementsToRoleMsg msg) { if (s.getActions() != null) { s.getActions().forEach(as -> { if (PolicyUtils.isAdminOnlyAction(as)) { - throw new OperationFailureException(err(IdentityErrors.PERMISSION_DENIED, "normal accounts can't create admin-only action polices[%s]", as)); + throw new OperationFailureException(err(ORG_ZSTACK_IDENTITY_RBAC_10003, IdentityErrors.PERMISSION_DENIED, "normal accounts can't create admin-only action polices[%s]", as)); } }); } @@ -89,7 +90,7 @@ private void validate(APIAddPolicyStatementsToRoleMsg msg) { private void validate(APIUpdateRoleMsg msg) { if (Q.New(RoleVO.class).in(RoleVO_.type, list(RoleType.Predefined, RoleType.System)).eq(RoleVO_.uuid, msg.getUuid()).isExists()) { - throw new ApiMessageInterceptionException(argerr("cannot update a system or predefined role")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_RBAC_10004, "cannot update a system or predefined role")); } RoleVO vo = Q.New(RoleVO.class).eq(RoleVO_.uuid, msg.getRoleUuid()).find(); @@ -105,7 +106,7 @@ private void validate(APIUpdateRoleMsg msg) { private void validate(APIDeleteRoleMsg msg) { if (Q.New(RoleVO.class).in(RoleVO_.type, list(RoleType.Predefined, RoleType.System)).eq(RoleVO_.uuid, msg.getUuid()).isExists()) { - throw new ApiMessageInterceptionException(argerr("cannot delete a system or predefined role")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IDENTITY_RBAC_10005, "cannot delete a system or predefined role")); } } } diff --git a/image/src/main/java/org/zstack/image/AddImageLongJob.java b/image/src/main/java/org/zstack/image/AddImageLongJob.java index a47c51e015d..b2db55f5a67 100644 --- a/image/src/main/java/org/zstack/image/AddImageLongJob.java +++ b/image/src/main/java/org/zstack/image/AddImageLongJob.java @@ -34,6 +34,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.longjob.LongJobUtils.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** @@ -198,7 +199,7 @@ public void run(MessageReply reply) { logger.warn(String.format("delete image [%s] failed after management node restarted", msg.getResourceUuid())); } - completion.fail(operr("Failed because management node restarted.")); + completion.fail(operr(ORG_ZSTACK_IMAGE_10016, "Failed because management node restarted.")); } }); } diff --git a/image/src/main/java/org/zstack/image/BackupStorageDeleteBitGC.java b/image/src/main/java/org/zstack/image/BackupStorageDeleteBitGC.java index 035a904bb2e..add5edea468 100755 --- a/image/src/main/java/org/zstack/image/BackupStorageDeleteBitGC.java +++ b/image/src/main/java/org/zstack/image/BackupStorageDeleteBitGC.java @@ -8,6 +8,7 @@ import org.zstack.header.message.MessageReply; import org.zstack.header.storage.backup.*; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by xing5 on 2017/3/5. @@ -32,7 +33,7 @@ protected void triggerNow(GCCompletion completion) { } if (bsStatus != BackupStorageStatus.Connected) { - completion.fail(operr("the backup storage[uuid:%s] is not in status of" + + completion.fail(operr(ORG_ZSTACK_IMAGE_10021, "the backup storage[uuid:%s] is not in status of" + " Connected, current status is %s", backupStorageUuid, bsStatus)); return; } diff --git a/image/src/main/java/org/zstack/image/ImageApiInterceptor.java b/image/src/main/java/org/zstack/image/ImageApiInterceptor.java index 80436927522..0794433d1e7 100755 --- a/image/src/main/java/org/zstack/image/ImageApiInterceptor.java +++ b/image/src/main/java/org/zstack/image/ImageApiInterceptor.java @@ -34,6 +34,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -98,29 +99,29 @@ private void validate(APISetImageBootModeMsg msg){ ImageVO vo = dbf.findByUuid(msg.getImageUuid(), ImageVO.class); if (ImageBootMode.Legacy.toString().equals(msg.getBootMode()) && ImageArchitecture.aarch64.toString().equals(vo.getArchitecture())) { - throw new ApiMessageInterceptionException(argerr("The aarch64 architecture does not support legacy.")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IMAGE_10002, "The aarch64 architecture does not support legacy.")); } } private void validate(APICreateDataVolumeTemplateFromVolumeMsg msg) { VolumeVO vol = dbf.findByUuid(msg.getVolumeUuid(), VolumeVO.class); if (VolumeStatus.Ready != vol.getStatus()) { - throw new ApiMessageInterceptionException(operr("volume[uuid:%s] is not Ready, it's %s", vol.getUuid(), vol.getStatus())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_IMAGE_10003, "volume[uuid:%s] is not Ready, it's %s", vol.getUuid(), vol.getStatus())); } if (VolumeState.Enabled != vol.getState()) { - throw new ApiMessageInterceptionException(operr("volume[uuid:%s] is not Enabled, it's %s", vol.getUuid(), vol.getState())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_IMAGE_10004, "volume[uuid:%s] is not Enabled, it's %s", vol.getUuid(), vol.getState())); } } private void validate(APICreateDataVolumeTemplateFromVolumeSnapshotMsg msg) { VolumeSnapshotVO vsvo = dbf.findByUuid(msg.getSnapshotUuid(), VolumeSnapshotVO.class); if (VolumeSnapshotStatus.Ready != vsvo.getStatus()) { - throw new ApiMessageInterceptionException(operr("volume snapshot[uuid:%s] is not Ready, it's %s", vsvo.getUuid(), vsvo.getStatus())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_IMAGE_10005, "volume snapshot[uuid:%s] is not Ready, it's %s", vsvo.getUuid(), vsvo.getStatus())); } if (VolumeSnapshotState.Enabled != vsvo.getState()) { - throw new ApiMessageInterceptionException(operr("volume snapshot[uuid:%s] is not Enabled, it's %s", vsvo.getUuid(), vsvo.getState())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_IMAGE_10006, "volume snapshot[uuid:%s] is not Enabled, it's %s", vsvo.getUuid(), vsvo.getState())); } } @@ -140,16 +141,16 @@ private void validate(APIAddImageMsg msg) { if (msg.isSystem() && (ImageMediaType.ISO.toString().equals(msg.getMediaType()) || ImageConstant.ISO_FORMAT_STRING.equals(msg.getFormat()))) { throw new ApiMessageInterceptionException(argerr( - "ISO cannot be used as system image" + ORG_ZSTACK_IMAGE_10007, "ISO cannot be used as system image" )); } if (!VolumeFormat.hasType(msg.getFormat())) { - throw new ApiMessageInterceptionException(argerr("unknown format[%s]", msg.getFormat())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IMAGE_10008, "unknown format[%s]", msg.getFormat())); } if (msg.getType() != null && !ImageType.hasType(msg.getType())) { - throw new ApiMessageInterceptionException(argerr("unsupported image type[%s]", msg.getType())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IMAGE_10009, "unsupported image type[%s]", msg.getType())); } if (msg.getMediaType() == null) { @@ -166,7 +167,7 @@ private void validate(APIAddImageMsg msg) { q.add(BackupStorageVO_.uuid, Op.IN, msg.getBackupStorageUuids()); List bsUuids = q.listValue(); if (bsUuids.isEmpty()) { - throw new ApiMessageInterceptionException(operr("no backup storage specified in uuids%s is available for adding this image; they are not in status %s or not in state %s, or the uuid is invalid backup storage uuid", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_IMAGE_10010, "no backup storage specified in uuids%s is available for adding this image; they are not in status %s or not in state %s, or the uuid is invalid backup storage uuid", msg.getBackupStorageUuids(), BackupStorageStatus.Connected, BackupStorageState.Enabled)); } isValidBS(bsUuids); @@ -177,7 +178,7 @@ private void validate(APIAddImageMsg msg) { if (msg.getUrl().startsWith("/")) { msg.setUrl(String.format("file://%s", msg.getUrl())); } else if (!isValidProtocol(msg.getUrl())) { - throw new ApiMessageInterceptionException(argerr("url must starts with 'file:///', 'http://', 'https://', 'ftp://', 'sftp://' or '/'")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IMAGE_10011, "url must starts with 'file:///', 'http://', 'https://', 'ftp://', 'sftp://' or '/'")); } if (msg.getUrl().startsWith("file://")) { @@ -188,7 +189,7 @@ private void validate(APIAddImageMsg msg) { private void validateLocalPath(String url) { String path = url.substring("file://".length()); if (!path.startsWith("/")) { - throw new ApiMessageInterceptionException(argerr("absolute path must be used", path)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IMAGE_10012, "absolute path must be used", path)); } for (String filterName : ImageGlobalConfig.DOWNLOAD_LOCALPATH_CUSTOMFILTER.value().split(";")) { @@ -211,7 +212,7 @@ void validate(String path) { String[] bl = blackList.value().split(";"); boolean inBlackList = Arrays.stream(bl).anyMatch(pattern -> antPathMatcher.match(pattern, path)); if (inBlackList) { - throw new ApiMessageInterceptionException(argerr("image path [%s] is in black list %s", path, blackList.value())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IMAGE_10013, "image path [%s] is in black list %s", path, blackList.value())); } } }; @@ -220,12 +221,12 @@ void validate(String path) { void validate(String path) { GlobalConfig whiteList = ImageGlobalConfig.DOWNLOAD_LOCALPATH_WHITELIST; if (StringUtils.isBlank(whiteList.value())) { - throw new ApiMessageInterceptionException(argerr("all images on this server cannot be used")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IMAGE_10014, "all images on this server cannot be used")); } String[] wl = whiteList.value().split(";"); boolean inWhiteList = Arrays.stream(wl).anyMatch(pattern -> antPathMatcher.match(pattern, path)); if (!inWhiteList) { - throw new ApiMessageInterceptionException(argerr("image path is not in white list: %s", whiteList.value())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IMAGE_10015, "image path is not in white list: %s", whiteList.value())); } } }; diff --git a/image/src/main/java/org/zstack/image/ImageBase.java b/image/src/main/java/org/zstack/image/ImageBase.java index c4ca5fcb840..7f0649a19c2 100755 --- a/image/src/main/java/org/zstack/image/ImageBase.java +++ b/image/src/main/java/org/zstack/image/ImageBase.java @@ -50,6 +50,7 @@ import static org.zstack.core.Platform.*; import static org.zstack.utils.CollectionDSL.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -238,7 +239,7 @@ public String call(ImageBackupStorageRefVO arg) { }); if (bsUuids.isEmpty()) { - throw new OperationFailureException(operr("the image[uuid:%s, name:%s] is not on any backup storage", self.getUuid(), self.getName())); + throw new OperationFailureException(operr(ORG_ZSTACK_IMAGE_10038, "the image[uuid:%s, name:%s] is not on any backup storage", self.getUuid(), self.getName())); } SimpleQuery q = dbf.createQuery(BackupStorageVO.class); @@ -248,7 +249,7 @@ public String call(ImageBackupStorageRefVO arg) { q.setLimit(1); backupStorageUuid = q.findValue(); if (backupStorageUuid == null) { - completion.fail(operr("No connected backup storage found for image[uuid:%s, name:%s]", + completion.fail(operr(ORG_ZSTACK_IMAGE_10039, "No connected backup storage found for image[uuid:%s, name:%s]", self.getUuid(), self.getName())); return; } @@ -440,7 +441,7 @@ public void run(MessageReply rly) { @Override public void done(ErrorCodeList errorCodeList) { if (errors.size() != 0) { - trigger.fail(operr("detach iso[uuid=%s] from vm failed, errors are %s" + trigger.fail(operr(ORG_ZSTACK_IMAGE_10040, "detach iso[uuid=%s] from vm failed, errors are %s" ,msg.getImageUuid(), JSONObjectUtil.toJsonString(errors))); return; } @@ -753,7 +754,7 @@ public String call(ImageBackupStorageRefVO arg) { }); if (toRecoverBsUuids.isEmpty()) { - throw new OperationFailureException(operr("the image[uuid:%s, name:%s] is not deleted on any backup storage", + throw new OperationFailureException(operr(ORG_ZSTACK_IMAGE_10041, "the image[uuid:%s, name:%s] is not deleted on any backup storage", self.getUuid(), self.getName())); } } else { @@ -767,12 +768,12 @@ public ImageBackupStorageRefVO call(ImageBackupStorageRefVO arg) { }); if (ref == null) { - throw new OperationFailureException(argerr("the image[uuid:%s, name:%s] is not on the backup storage[uuid:%s]", + throw new OperationFailureException(argerr(ORG_ZSTACK_IMAGE_10042, "the image[uuid:%s, name:%s] is not on the backup storage[uuid:%s]", self.getUuid(), self.getName(), bsUuid)); } if (ref.getStatus() != ImageStatus.Deleted) { - throw new OperationFailureException(argerr("the image[uuid:%s, name:%s]'s status[%s] is not Deleted on the backup storage[uuid:%s]", + throw new OperationFailureException(argerr(ORG_ZSTACK_IMAGE_10043, "the image[uuid:%s, name:%s]'s status[%s] is not Deleted on the backup storage[uuid:%s]", self.getUuid(), self.getName(), ref.getStatus(), bsUuid)); } @@ -814,7 +815,7 @@ public String call(ImageBackupStorageRefVO arg) { ); if (bsUuids.isEmpty()) { - throw new OperationFailureException(operr("the image[uuid:%s, name:%s] is not deleted on any backup storage", + throw new OperationFailureException(operr(ORG_ZSTACK_IMAGE_10044, "the image[uuid:%s, name:%s] is not deleted on any backup storage", self.getUuid(), self.getName())); } } else { @@ -830,12 +831,12 @@ public ImageBackupStorageRefVO call(ImageBackupStorageRefVO arg) { ); if (ref == null) { - throw new OperationFailureException(argerr("the image[uuid:%s, name:%s] is not on the backup storage[uuid:%s]", + throw new OperationFailureException(argerr(ORG_ZSTACK_IMAGE_10045, "the image[uuid:%s, name:%s] is not on the backup storage[uuid:%s]", self.getUuid(), self.getName(), bsUuid)); } if (ref.getStatus() != ImageStatus.Deleted) { - throw new OperationFailureException(argerr("the image[uuid:%s, name:%s] is not deleted on the backup storage[uuid:%s]", + throw new OperationFailureException(argerr(ORG_ZSTACK_IMAGE_10046, "the image[uuid:%s, name:%s] is not deleted on the backup storage[uuid:%s]", self.getUuid(), self.getName(), bsUuid)); } @@ -1024,7 +1025,7 @@ public void handle(Map data) { }).error(new FlowErrorHandler(msg) { @Override public void handle(ErrorCode errCode, Map data) { - evt.setError(err(SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); + evt.setError(err(ORG_ZSTACK_IMAGE_10047, SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); bus.publish(evt); } }).start(); diff --git a/image/src/main/java/org/zstack/image/ImageManagerImpl.java b/image/src/main/java/org/zstack/image/ImageManagerImpl.java index 0f1f87975d0..08e8b92a552 100755 --- a/image/src/main/java/org/zstack/image/ImageManagerImpl.java +++ b/image/src/main/java/org/zstack/image/ImageManagerImpl.java @@ -97,6 +97,7 @@ import static org.zstack.longjob.LongJobUtils.buildErrIfCanceled; import static org.zstack.longjob.LongJobUtils.noncancelableErr; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class ImageManagerImpl extends AbstractService implements ImageManager, ManagementNodeReadyExtensionPoint, ReportQuotaExtensionPoint, ResourceOwnerPreChangeExtensionPoint, HostAllocatorFilterExtensionPoint { @@ -889,7 +890,7 @@ public void setup() { public void run(FlowTrigger trigger, Map data) { List volumes = Q.New(VolumeVO.class).eq(VolumeVO_.vmInstanceUuid, vmUuid).list(); if (CollectionUtils.isEmpty(volumes)) { - trigger.fail(operr("vm instance[uuid:%s] has no volume", vmUuid)); + trigger.fail(operr(ORG_ZSTACK_IMAGE_10022, "vm instance[uuid:%s] has no volume", vmUuid)); return; } @@ -902,7 +903,7 @@ public void run(FlowTrigger trigger, Map data) { } if (rootVolumeUuid == null) { - trigger.fail(operr("vm instance[uuid:%s] has no root volume", vmUuid)); + trigger.fail(operr(ORG_ZSTACK_IMAGE_10023, "vm instance[uuid:%s] has no root volume", vmUuid)); return; } @@ -1351,7 +1352,7 @@ private void passThrough(ImageMessage msg) { } if (vo == null) { - ErrorCode err = err(SysErrors.RESOURCE_NOT_FOUND, "Cannot find image[uuid:%s], it may have been deleted", msg.getImageUuid()); + ErrorCode err = err(ORG_ZSTACK_IMAGE_10024, SysErrors.RESOURCE_NOT_FOUND, "Cannot find image[uuid:%s], it may have been deleted", msg.getImageUuid()); logger.warn(err.getDetails()); bus.replyErrorByMessageType((Message) msg, err); return; @@ -1396,10 +1397,10 @@ private void handle(final APICloneImageMsg msg) { Set copiedRefs; ImageVO sourceImage = dbf.findByUuid(msg.getImageUuid(), ImageVO.class); if (sourceImage == null) { - throw new OperationFailureException(operr("source image [%s] not existed", msg.getImageUuid())); + throw new OperationFailureException(operr(ORG_ZSTACK_IMAGE_10025, "source image [%s] not existed", msg.getImageUuid())); } if (sourceImage.getStatus() != ImageStatus.Ready) { - throw new OperationFailureException(operr("cannot clone image, because image [%s] status is not ready", msg.getImageUuid())); + throw new OperationFailureException(operr(ORG_ZSTACK_IMAGE_10026, "cannot clone image, because image [%s] status is not ready", msg.getImageUuid())); } ImageVO vo = new ImageVO(); @@ -1526,7 +1527,7 @@ public void validateSystemTagInCreateMessage(APICreateMessage msg) { for (String systemTag : msg.getSystemTags()) { if (ImageSystemTags.BOOT_MODE.isMatch(systemTag)) { if (++bootModeCount > 1) { - throw new ApiMessageInterceptionException(argerr("only one bootMode system tag is allowed, but %d got", bootModeCount)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_IMAGE_10027, "only one bootMode system tag is allowed, but %d got", bootModeCount)); } String bootMode = ImageSystemTags.BOOT_MODE.getTokenByTag(systemTag, ImageSystemTags.BOOT_MODE_TOKEN); @@ -1545,7 +1546,7 @@ private void validateBootMode(String systemTag, String bootMode) { } if (!valid) { throw new ApiMessageInterceptionException(argerr( - "[%s] specified in system tag [%s] is not a valid boot mode", bootMode, systemTag) + ORG_ZSTACK_IMAGE_10028, "[%s] specified in system tag [%s] is not a valid boot mode", bootMode, systemTag) ); } } @@ -1993,7 +1994,7 @@ protected void done() { ImageVO vo = dbf.reload(ivo); InnerEvent event = new InnerEvent(); if (vo == null) { - event.error = (operr("image [uuid:%s] has been deleted", ivo.getUuid())); + event.error = (operr(ORG_ZSTACK_IMAGE_10029, "image [uuid:%s] has been deleted", ivo.getUuid())); SQL.New("delete from ImageBackupStorageRefVO where imageUuid = :uuid") .param("uuid", ivo.getUuid()) .execute(); @@ -2013,10 +2014,10 @@ protected void done() { } else { final ErrorCode err; if (errors.isEmpty()) { - err = err(SysErrors.CREATE_RESOURCE_ERROR, "Failed to download image[name:%s] on all backup storage%s.", + err = err(ORG_ZSTACK_IMAGE_10030, SysErrors.CREATE_RESOURCE_ERROR, "Failed to download image[name:%s] on all backup storage%s.", inv.getName(), msgData.getBackupStorageUuids()); } else { - err = err(SysErrors.CREATE_RESOURCE_ERROR, errors.get(0), "Failed to download image[name:%s] on all backup storage%s.", + err = err(ORG_ZSTACK_IMAGE_10031, SysErrors.CREATE_RESOURCE_ERROR, errors.get(0), "Failed to download image[name:%s] on all backup storage%s.", inv.getName(), msgData.getBackupStorageUuids()); } @@ -2166,7 +2167,7 @@ public void run(List replies) { } if (targetBackupStorages.isEmpty()) { - trigger.fail(operr("unable to allocate backup storage specified by uuids%s, list errors are: %s", + trigger.fail(operr(ORG_ZSTACK_IMAGE_10032, "unable to allocate backup storage specified by uuids%s, list errors are: %s", msgData.getBackupStorageUuids(), JSONObjectUtil.toJsonString(errs))); } else { saveRefVOByBsInventorys(targetBackupStorages, imageVO.getUuid()); @@ -2261,7 +2262,7 @@ public void run(List replies) { SQL.New("delete from ImageBackupStorageRefVO where imageUuid = :uuid") .param("uuid", imageVO.getUuid()) .execute(); - trigger.fail(operr("image [uuid:%s] has been deleted", imageVO.getUuid())); + trigger.fail(operr(ORG_ZSTACK_IMAGE_10033, "image [uuid:%s] has been deleted", imageVO.getUuid())); return; } @@ -2292,7 +2293,7 @@ public void run(List replies) { if (success) { trigger.next(); } else { - trigger.fail(operr("failed to create image from root volume[uuid:%s] on all backup storage, see cause for one of errors", + trigger.fail(operr(ORG_ZSTACK_IMAGE_10034, "failed to create image from root volume[uuid:%s] on all backup storage, see cause for one of errors", rootVolumeUuid).causedBy(err)); } } @@ -2490,7 +2491,7 @@ public void run(MessageReply reply) { saveRefVOByBsInventorys(backupStorages, image.getUuid()); trigger.next(); } else { - trigger.fail(operr("cannot find proper backup storage").causedBy(reply.getError())); + trigger.fail(operr(ORG_ZSTACK_IMAGE_10035, "cannot find proper backup storage").causedBy(reply.getError())); } } }); @@ -2520,7 +2521,7 @@ public void run(List replies) { } if (backupStorages.isEmpty()) { - trigger.fail(operr("failed to allocate all backup storage[uuid:%s], a list of error: %s", + trigger.fail(operr(ORG_ZSTACK_IMAGE_10036, "failed to allocate all backup storage[uuid:%s], a list of error: %s", msgData.getBackupStorageUuids(), JSONObjectUtil.toJsonString(errs))); } else { saveRefVOByBsInventorys(backupStorages, image.getUuid()); @@ -2633,7 +2634,7 @@ public void run(List replies) { int backupStorageNum = msgData.getBackupStorageUuids() == null ? 1 : msgData.getBackupStorageUuids().size(); if (fail == backupStorageNum) { - ErrorCode errCode = operr("failed to create data volume template from volume[uuid:%s] on all backup storage%s. See cause for one of errors", + ErrorCode errCode = operr(ORG_ZSTACK_IMAGE_10037, "failed to create data volume template from volume[uuid:%s] on all backup storage%s. See cause for one of errors", volumeUuid, msgData.getBackupStorageUuids()).causedBy(err); trigger.fail(errCode); diff --git a/image/src/main/java/org/zstack/image/UploadImageTracker.java b/image/src/main/java/org/zstack/image/UploadImageTracker.java index 5541a64577e..388d226c23a 100644 --- a/image/src/main/java/org/zstack/image/UploadImageTracker.java +++ b/image/src/main/java/org/zstack/image/UploadImageTracker.java @@ -39,6 +39,7 @@ import static org.zstack.core.progress.ProgressReportService.reportProgress; import static org.zstack.header.Constants.THREAD_CONTEXT_API; import static org.zstack.header.Constants.THREAD_CONTEXT_TASK_NAME; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) @@ -72,7 +73,7 @@ void addTrackTask(ImageVO image, ImageBackupStorageRefVO ref) { try { addTrackTask(image.getName(), image.getUuid(), ref.getBackupStorageUuid(), new URI(ref.getInstallPath()).getHost()); } catch (URISyntaxException e) { - throw new OperationFailureException(operr(e.getMessage())); + throw new OperationFailureException(operr(ORG_ZSTACK_IMAGE_10017, e.getMessage())); } } @@ -95,7 +96,7 @@ void trackUpload(ImageVO image, ImageBackupStorageRefVO ref) { try { trackUpload(image.getName(), image.getUuid(), ref.getBackupStorageUuid(), new URI(ref.getInstallPath()).getHost()); } catch (URISyntaxException e) { - throw new OperationFailureException(operr(e.getMessage())); + throw new OperationFailureException(operr(ORG_ZSTACK_IMAGE_10018, e.getMessage())); } } @@ -195,7 +196,7 @@ public boolean run() { } if (ivo.getActualSize() == 0 && overMaxIdleTime(createdTime)) { - markFailure(operr("upload session expired")); + markFailure(operr(ORG_ZSTACK_IMAGE_10019, "upload session expired")); return true; } @@ -211,7 +212,7 @@ public boolean run() { boolean downloadingImageSuspendedTooLong = !reply.isDownloadComplete() && overMaxIdleTime(reply.getLastOpTime()) ; if (downloadingImageSuspendedTooLong && reply.isSupportSuspend()) { - markFailure(err(ImageErrors.UPLOAD_IMAGE_INTERRUPTED, reply.getError(), + markFailure(err(ORG_ZSTACK_IMAGE_10020, ImageErrors.UPLOAD_IMAGE_INTERRUPTED, reply.getError(), "uploading has been inactive more than %d sec", maxIdleSecond)); return true; } diff --git a/longjob/src/main/java/org/zstack/longjob/LongJobApiInterceptor.java b/longjob/src/main/java/org/zstack/longjob/LongJobApiInterceptor.java index e4e020a8065..9f50d1bcb96 100755 --- a/longjob/src/main/java/org/zstack/longjob/LongJobApiInterceptor.java +++ b/longjob/src/main/java/org/zstack/longjob/LongJobApiInterceptor.java @@ -28,6 +28,7 @@ import java.util.TreeMap; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by GuoYi on 12/6/17. @@ -87,7 +88,7 @@ private void routeMsg(LongJobMessage msg) { private void validate(APISubmitLongJobMsg msg) { Class apiClass = apiMsgOfLongJob.get(msg.getJobName()); if (null == apiClass) { - throw new ApiMessageInterceptionException(argerr("%s is not an API", msg.getJobName())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_LONGJOB_10006, "%s is not an API", msg.getJobName())); } APIMessage jobMsg = JSONObjectUtil.toObject(msg.getJobData(), apiClass); jobMsg.setSession(msg.getSession()); @@ -149,10 +150,10 @@ private void validate(APICancelLongJobMsg msg) { .findValue(); if (state == LongJobState.Succeeded) { - throw new ApiMessageInterceptionException(argerr("cannot cancel longjob that is succeeded")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_LONGJOB_10007, "cannot cancel longjob that is succeeded")); } if (state == LongJobState.Failed) { - throw new ApiMessageInterceptionException(argerr("cannot cancel longjob that is failed")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_LONGJOB_10008, "cannot cancel longjob that is failed")); } } @@ -163,7 +164,7 @@ private void validate(APIDeleteLongJobMsg msg) { .findValue(); if (state != LongJobState.Succeeded && state != LongJobState.Canceled && state != LongJobState.Failed) { - throw new ApiMessageInterceptionException(argerr("delete longjob only when it's succeeded, canceled, or failed")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_LONGJOB_10009, "delete longjob only when it's succeeded, canceled, or failed")); } } @@ -174,7 +175,7 @@ private void validate(APIRerunLongJobMsg msg) { LongJobState state = vo.getState(); if (state != LongJobState.Succeeded && state != LongJobState.Canceled && state != LongJobState.Failed) { - throw new ApiMessageInterceptionException(argerr("rerun longjob only when it's succeeded, canceled, or failed")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_LONGJOB_10010, "rerun longjob only when it's succeeded, canceled, or failed")); } Class apiClass = apiMsgOfLongJob.get(vo.getJobName()); @@ -203,7 +204,7 @@ private void validate(APIResumeLongJobMsg msg) { .findTuple(); if (t.get(0, LongJobState.class) != LongJobState.Suspended) { - throw new ApiMessageInterceptionException(argerr("can only resume longjob that is Suspended")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_LONGJOB_10011, "can only resume longjob that is Suspended")); } Optional.ofNullable(t.get(1, String.class)).ifPresent(mnId -> diff --git a/longjob/src/main/java/org/zstack/longjob/LongJobFactoryImpl.java b/longjob/src/main/java/org/zstack/longjob/LongJobFactoryImpl.java index f30bf3bcd17..15dc68c76a3 100755 --- a/longjob/src/main/java/org/zstack/longjob/LongJobFactoryImpl.java +++ b/longjob/src/main/java/org/zstack/longjob/LongJobFactoryImpl.java @@ -16,6 +16,7 @@ import java.util.TreeMap; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by GuoYi on 11/14/17. @@ -36,7 +37,7 @@ public class LongJobFactoryImpl implements LongJobFactory, Component { public LongJob getLongJob(String jobName) { LongJob job = allLongJob.get(jobName); if (null == job) { - throw new OperationFailureException(operr("%s has no corresponding longjob", jobName)); + throw new OperationFailureException(operr(ORG_ZSTACK_LONGJOB_10012, "%s has no corresponding longjob", jobName)); } return ObjectUtils.newAndCopy(job, job.getClass()); } diff --git a/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java b/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java index a755a0b9270..c74b43909c2 100755 --- a/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java +++ b/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java @@ -58,6 +58,7 @@ import static org.zstack.core.progress.ProgressReportService.reportProgress; import static org.zstack.header.longjob.LongJobConstants.LongJobOperation; import static org.zstack.longjob.LongJobUtils.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by GuoYi on 11/14/17. @@ -309,7 +310,7 @@ private void cancelLongJob(String uuid, Completion completion) { } if (!longJobFactory.supportCancel(t.get(1, String.class))) { - completion.fail(err(LongJobErrors.NOT_SUPPORTED, "not supported")); + completion.fail(err(ORG_ZSTACK_LONGJOB_10000, LongJobErrors.NOT_SUPPORTED, "not supported")); return; } @@ -361,7 +362,7 @@ public void run(SyncTaskChain chain) { LongJobVO vo = Q.New(LongJobVO.class).eq(LongJobVO_.uuid, msg.getUuid()).find(); if (!longJobFactory.supportClean(vo.getJobName()) || vo.getState() != LongJobState.Canceling) { - evt.setError(err(LongJobErrors.NOT_SUPPORTED, "not supported or state is not Canceling")); + evt.setError(err(ORG_ZSTACK_LONGJOB_10001, LongJobErrors.NOT_SUPPORTED, "not supported or state is not Canceling")); bus.publish(evt); chain.next(); return; @@ -465,7 +466,7 @@ private void resumeLongJob(String uuid, ReturnValueCompletion complet if (longJobFactory.supportResume(jobName)) { completion.success(doResumeJob(uuid, new NopeCompletion())); } else { - completion.fail(err(LongJobErrors.NOT_SUPPORTED, "not supported")); + completion.fail(err(ORG_ZSTACK_LONGJOB_10002, LongJobErrors.NOT_SUPPORTED, "not supported")); } } @@ -865,7 +866,7 @@ private void doLoadLongJob(LongJobVO vo, LongJobOperation operation) { if (!longJobFactory.supportClean(vo.getJobName())) { changeState(vo.getUuid(), LongJobStateEvent.fail); - runLongJobCallBack(vo, err(SysErrors.MANAGEMENT_NODE_UNAVAILABLE_ERROR, + runLongJobCallBack(vo, err(ORG_ZSTACK_LONGJOB_10003, SysErrors.MANAGEMENT_NODE_UNAVAILABLE_ERROR, "management node is unavailable")); return; } @@ -873,13 +874,13 @@ private void doLoadLongJob(LongJobVO vo, LongJobOperation operation) { doCleanJob(vo, new Completion(null) { @Override public void success() { - runLongJobCallBack(vo, err(SysErrors.MANAGEMENT_NODE_UNAVAILABLE_ERROR, + runLongJobCallBack(vo, err(ORG_ZSTACK_LONGJOB_10004, SysErrors.MANAGEMENT_NODE_UNAVAILABLE_ERROR, "management node is unavailable")); } @Override public void fail(ErrorCode errorCode) { - runLongJobCallBack(vo, err(SysErrors.MANAGEMENT_NODE_UNAVAILABLE_ERROR, + runLongJobCallBack(vo, err(ORG_ZSTACK_LONGJOB_10005, SysErrors.MANAGEMENT_NODE_UNAVAILABLE_ERROR, "management node is unavailable")); } }); diff --git a/longjob/src/main/java/org/zstack/longjob/LongJobUtils.java b/longjob/src/main/java/org/zstack/longjob/LongJobUtils.java index c99cd6589e0..89691955a14 100644 --- a/longjob/src/main/java/org/zstack/longjob/LongJobUtils.java +++ b/longjob/src/main/java/org/zstack/longjob/LongJobUtils.java @@ -25,6 +25,7 @@ import java.util.function.Consumer; import static org.zstack.core.Platform.err; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class LongJobUtils { @@ -38,16 +39,16 @@ public class LongJobUtils { private static List canceledStates = Arrays.asList(LongJobState.Canceled, LongJobState.Canceling); public static ErrorCode cancelErr(String longJobUuid) { - return Platform.err(LongJobErrors.CANCELED, "long job[uuid:%s] has been canceled", longJobUuid); + return Platform.err(ORG_ZSTACK_LONGJOB_10013, LongJobErrors.CANCELED, "long job[uuid:%s] has been canceled", longJobUuid); } public static ErrorCode cancelErr(String longJobUuid, ErrorCode cause) { - return err(LongJobErrors.CANCELED, cause, + return err(ORG_ZSTACK_LONGJOB_10014, LongJobErrors.CANCELED, cause, "long job[uuid:%s] has been canceled", longJobUuid); } public static ErrorCode noncancelableErr(String error) { - return err(LongJobErrors.NONCANCELABLE, error); + return err(ORG_ZSTACK_LONGJOB_10015, LongJobErrors.NONCANCELABLE, error); } public static ErrorCode noncancelableErr(String error, List causes) { @@ -59,7 +60,7 @@ public static ErrorCode noncancelableErr(String error, List causes) { } public static ErrorCode interruptedErr(String longJobUuid, ErrorCode cause) { - return err(LongJobErrors.INTERRUPTED, cause, "some error interrupt long job[uuid:%s]," + + return err(ORG_ZSTACK_LONGJOB_10016, LongJobErrors.INTERRUPTED, cause, "some error interrupt long job[uuid:%s]," + " analysis the cause to fix it and resume long job if you want to continue.", longJobUuid); } diff --git a/network/src/main/java/org/zstack/network/l2/L2NetworkApiInterceptor.java b/network/src/main/java/org/zstack/network/l2/L2NetworkApiInterceptor.java index b8b017f1d44..6f0b796e5b8 100755 --- a/network/src/main/java/org/zstack/network/l2/L2NetworkApiInterceptor.java +++ b/network/src/main/java/org/zstack/network/l2/L2NetworkApiInterceptor.java @@ -29,6 +29,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -74,7 +75,7 @@ private void validate(final APIAttachL2NetworkToClusterMsg msg) { q.add(L2NetworkClusterRefVO_.clusterUuid, Op.EQ, msg.getClusterUuid()); q.add(L2NetworkClusterRefVO_.l2NetworkUuid, Op.EQ, msg.getL2NetworkUuid()); if (q.isExists()) { - throw new ApiMessageInterceptionException(operr("l2Network[uuid:%s] has attached to cluster[uuid:%s], can't attach again", msg.getL2NetworkUuid(), msg.getClusterUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_L2_10008, "l2Network[uuid:%s] has attached to cluster[uuid:%s], can't attach again", msg.getL2NetworkUuid(), msg.getClusterUuid())); } /* current ovs only support vlan, vxlan*/ @@ -87,7 +88,7 @@ private void validate(final APIAttachL2NetworkToClusterMsg msg) { if (!otherL2s.isEmpty()) { if (Q.New(L2NetworkClusterRefVO.class).eq(L2NetworkClusterRefVO_.clusterUuid, msg.getClusterUuid()) .in(L2NetworkClusterRefVO_.l2NetworkUuid, otherL2s).isExists()) { - throw new ApiMessageInterceptionException(argerr("could not attach l2 network, because there " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_10009, "could not attach l2 network, because there " + "is another network [uuid:%s] on physical interface [%s] with different vswitch type", otherL2s.get(0), l2.getPhysicalInterface())); } @@ -100,7 +101,7 @@ private void validate(APIDetachL2NetworkFromClusterMsg msg) { q.add(L2NetworkClusterRefVO_.clusterUuid, Op.EQ, msg.getClusterUuid()); q.add(L2NetworkClusterRefVO_.l2NetworkUuid, Op.EQ, msg.getL2NetworkUuid()); if (!q.isExists()) { - throw new ApiMessageInterceptionException(operr("l2Network[uuid:%s] has not attached to cluster[uuid:%s]", msg.getL2NetworkUuid(), msg.getClusterUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_L2_10010, "l2Network[uuid:%s] has not attached to cluster[uuid:%s]", msg.getL2NetworkUuid(), msg.getClusterUuid())); } } @@ -114,13 +115,13 @@ private void validate(APIDeleteL2NetworkMsg msg) { private void validate(APICreateL2NetworkMsg msg) { if (!L2NetworkType.hasType(msg.getType())) { - throw new ApiMessageInterceptionException(argerr("unsupported l2Network type[%s]", msg.getType())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_10011, "unsupported l2Network type[%s]", msg.getType())); } try { VSwitchType.valueOf(msg.getvSwitchType()); } catch (Exception e) { - throw new ApiMessageInterceptionException(argerr("unsupported vSwitch type[%s]", msg.getvSwitchType())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_10012, "unsupported vSwitch type[%s]", msg.getvSwitchType())); } } @@ -129,29 +130,29 @@ private void validate(APIChangeL2NetworkVlanIdMsg msg) { l2.getAttachedClusterRefs().forEach(ref -> { if (Q.New(HostVO.class).eq(HostVO_.clusterUuid, ref.getClusterUuid()) .notEq(HostVO_.status, HostStatus.Connected).isExists()) { - throw new ApiMessageInterceptionException(operr("cannot change vlan for l2Network[uuid:%s]" + + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_L2_10013, "cannot change vlan for l2Network[uuid:%s]" + " because there are hosts status in Connecting or Disconnected", l2.getUuid())); } if (!Q.New(ClusterVO.class).eq(ClusterVO_.uuid, ref.getClusterUuid()) .eq(ClusterVO_.hypervisorType, L2NetworkConstant.KVM_HYPERVISOR_TYPE).isExists()) { - throw new ApiMessageInterceptionException(operr("cannot change vlan for l2Network[uuid:%s]" + + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_L2_10014, "cannot change vlan for l2Network[uuid:%s]" + " because it only supports an L2Network that is exclusively attached to a kvm cluster", l2.getUuid())); } }); // pvlan isolated not support change vlan if (l2.getIsolated()) { - throw new ApiMessageInterceptionException(argerr("cannot change vlan for l2Network[uuid:%s]" + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_10015, "cannot change vlan for l2Network[uuid:%s]" + " because this l2Network is isolated", l2.getUuid())); } String sdnControllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID .getTokenByResourceUuid(msg.getL2NetworkUuid(), L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); if (msg.getType().equals(L2NetworkConstant.L2_VLAN_NETWORK_TYPE)) { if (msg.getVlan() == null) { - throw new ApiMessageInterceptionException(argerr("vlan is required for " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_10016, "vlan is required for " + "ChangeL2NetworkVlanId with type[%s]", msg.getType())); } if (!NetworkUtils.isValidVlan(msg.getVlan())) { - throw new ApiMessageInterceptionException(argerr("vlan[%s] is invalid", msg.getVlan())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_10017, "vlan[%s] is invalid", msg.getVlan())); } List attachedClusters = l2.getAttachedClusterRefs().stream() .map(L2NetworkClusterRefVO::getClusterUuid).collect(Collectors.toList()); @@ -186,12 +187,12 @@ private void validate(APIChangeL2NetworkVlanIdMsg msg) { } l2s = l2s.stream().filter(l -> !l.getUuid().equals(msg.getUuid())).collect(Collectors.toList()); if (!l2s.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("There has been a l2Network attached to cluster with virtual network id[%s] and physical interface[%s]. Failed to change L2 network[uuid:%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_10018, "There has been a l2Network attached to cluster with virtual network id[%s] and physical interface[%s]. Failed to change L2 network[uuid:%s]", msg.getVlan(), l2.getPhysicalInterface(), l2.getUuid())); } } else if (msg.getType().equals(L2NetworkConstant.L2_NO_VLAN_NETWORK_TYPE)) { if (msg.getVlan() != null) { - throw new ApiMessageInterceptionException(argerr("vlan is not allowed for " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_10019, "vlan is not allowed for " + "ChangeL2NetworkVlanId with type[%s]", msg.getType())); } List attachedClusters = l2.getAttachedClusterRefs().stream() @@ -223,7 +224,7 @@ private void validate(APIChangeL2NetworkVlanIdMsg msg) { } l2s = l2s.stream().filter(l -> !l.getUuid().equals(msg.getUuid())).collect(Collectors.toList()); if (!l2s.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("There has been a l2Network attached to cluster that has physical interface[%s]. Failed to change l2Network[uuid:%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_10020, "There has been a l2Network attached to cluster that has physical interface[%s]. Failed to change l2Network[uuid:%s]", l2.getPhysicalInterface(), l2.getUuid())); } } diff --git a/network/src/main/java/org/zstack/network/l2/L2NetworkCascadeExtension.java b/network/src/main/java/org/zstack/network/l2/L2NetworkCascadeExtension.java index 309fb83477e..1c78cb16f67 100755 --- a/network/src/main/java/org/zstack/network/l2/L2NetworkCascadeExtension.java +++ b/network/src/main/java/org/zstack/network/l2/L2NetworkCascadeExtension.java @@ -33,6 +33,7 @@ import java.util.concurrent.Callable; import static org.zstack.core.Platform.inerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -175,7 +176,7 @@ private void handleDeletionCheck(CascadeAction action, Completion completion) { completion.success(); } catch (L2NetworkException e) { - completion.fail(inerr(e.getMessage())); + completion.fail(inerr(ORG_ZSTACK_NETWORK_L2_10000, e.getMessage())); } } diff --git a/network/src/main/java/org/zstack/network/l2/L2NetworkManagerImpl.java b/network/src/main/java/org/zstack/network/l2/L2NetworkManagerImpl.java index 78b64e5ee7a..a62e87ddc4f 100755 --- a/network/src/main/java/org/zstack/network/l2/L2NetworkManagerImpl.java +++ b/network/src/main/java/org/zstack/network/l2/L2NetworkManagerImpl.java @@ -34,6 +34,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.err; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class L2NetworkManagerImpl extends AbstractService implements L2NetworkManager { private static final CLogger logger = Utils.getLogger(L2NetworkManagerImpl.class); @@ -405,7 +406,7 @@ private void passThrough(L2NetworkMessage msg) { } if (vo == null) { - ErrorCode errCode = err(SysErrors.RESOURCE_NOT_FOUND, "unable to find L2Network[uuid:%s], it may have been deleted", msg.getL2NetworkUuid()); + ErrorCode errCode = err(ORG_ZSTACK_NETWORK_L2_10001, SysErrors.RESOURCE_NOT_FOUND, "unable to find L2Network[uuid:%s], it may have been deleted", msg.getL2NetworkUuid()); bus.replyErrorByMessageType((Message)msg, errCode); return; } @@ -421,7 +422,7 @@ private void handle(APICreateL2NetworkMsg msg) { extp.beforeCreateL2Network(msg); } catch (NetworkException e) { APICreateL2NetworkEvent evt = new APICreateL2NetworkEvent(msg.getId()); - evt.setError(err(SysErrors.CREATE_RESOURCE_ERROR, "unable to create l2network[name:%s, type:%s], %s", msg.getName(), msg.getType(), e.getMessage())); + evt.setError(err(ORG_ZSTACK_NETWORK_L2_10002, SysErrors.CREATE_RESOURCE_ERROR, "unable to create l2network[name:%s, type:%s], %s", msg.getName(), msg.getType(), e.getMessage())); logger.warn(evt.getError().getDetails(), e); bus.publish(evt); return; diff --git a/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java b/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java index 6adceecec88..821a76ad462 100755 --- a/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java +++ b/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java @@ -52,6 +52,7 @@ import static org.zstack.core.Platform.*; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class L2NoVlanNetwork implements L2Network { @@ -217,7 +218,7 @@ public void handle(Map data) { }).error(new FlowErrorHandler(msg) { @Override public void handle(ErrorCode errCode, Map data) { - reply.setError(err(SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); + reply.setError(err(ORG_ZSTACK_NETWORK_L2_10003, SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); bus.reply(msg, reply); } }).start(); @@ -808,7 +809,7 @@ public void run(MessageReply reply) { evt.setInventory(getSelfInventory()); bus.publish(evt); } else { - evt.setError(err(L2Errors.ATTACH_ERROR, reply.getError(),"attach l2 network failed:%s", reply.getError())); + evt.setError(err(ORG_ZSTACK_NETWORK_L2_10004, L2Errors.ATTACH_ERROR, reply.getError(),"attach l2 network failed:%s", reply.getError())); bus.publish(evt); } } @@ -917,7 +918,7 @@ public void handle(Map data) { }).error(new FlowErrorHandler(msg) { @Override public void handle(ErrorCode errCode, Map data) { - evt.setError(err(SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); + evt.setError(err(ORG_ZSTACK_NETWORK_L2_10005, SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); bus.publish(evt); } }).start(); @@ -969,7 +970,7 @@ protected void scripts() { L2NetworkVO tl2 = Q.New(L2NetworkVO.class).eq(L2NetworkVO_.uuid, msg.getL2NetworkUuid()).find(); for (L2NetworkVO l2 : l2s) { if (l2.getPhysicalInterface().equals(tl2.getPhysicalInterface())) { - throw new ApiMessageInterceptionException(argerr("There has been a l2Network[uuid:%s, name:%s] attached to cluster[uuid:%s] that has physical interface[%s]. Failed to attach l2Network[uuid:%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_10006, "There has been a l2Network[uuid:%s, name:%s] attached to cluster[uuid:%s] that has physical interface[%s]. Failed to attach l2Network[uuid:%s]", l2.getUuid(), l2.getName(), msg.getClusterUuid(), l2.getPhysicalInterface(), tl2.getUuid())); } } @@ -1002,7 +1003,7 @@ protected void scripts() { for (L2VlanNetworkVO vl2 : l2s) { if (vl2.getVlan() == tl2.getVlan() && vl2.getPhysicalInterface().equals(tl2.getPhysicalInterface())) { - throw new OperationFailureException(argerr("There has been a L2VlanNetwork[uuid:%s, name:%s] attached to cluster[uuid:%s] that has physical interface[%s], vlan[%s]. Failed to attach L2VlanNetwork[uuid:%s]", + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_L2_10007, "There has been a L2VlanNetwork[uuid:%s, name:%s] attached to cluster[uuid:%s] that has physical interface[%s], vlan[%s]. Failed to attach L2VlanNetwork[uuid:%s]", vl2.getUuid(), vl2.getName(), msg.getClusterUuid(), vl2.getPhysicalInterface(), vl2.getVlan(), tl2.getUuid())); } } diff --git a/network/src/main/java/org/zstack/network/l3/AbstractIpAllocatorStrategy.java b/network/src/main/java/org/zstack/network/l3/AbstractIpAllocatorStrategy.java index cdc688470d1..490408c5c93 100755 --- a/network/src/main/java/org/zstack/network/l3/AbstractIpAllocatorStrategy.java +++ b/network/src/main/java/org/zstack/network/l3/AbstractIpAllocatorStrategy.java @@ -21,6 +21,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.err; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -101,7 +102,7 @@ public IpRangeVO call(IpRangeVO arg) { } if (ipr == null) { - throw new OperationFailureException(err(L3Errors.ALLOCATE_IP_ERROR, + throw new OperationFailureException(err(ORG_ZSTACK_NETWORK_L3_10074, L3Errors.ALLOCATE_IP_ERROR, "cannot find ip range that has ip[%s] in l3Network[uuid:%s]", msg.getRequiredIp(), msg.getL3NetworkUuid() )); } @@ -132,7 +133,7 @@ public IpRangeVO call(IpRangeVO arg) { } if (ipr == null) { - throw new OperationFailureException(err(L3Errors.ALLOCATE_IP_ERROR, + throw new OperationFailureException(err(ORG_ZSTACK_NETWORK_L3_10075, L3Errors.ALLOCATE_IP_ERROR, "cannot find ip range that has ip[%s] in l3Network[uuid:%s]", msg.getRequiredIp(), msg.getL3NetworkUuid() )); } diff --git a/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java b/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java index 4b12079e6e7..5536a5fc487 100755 --- a/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java +++ b/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java @@ -66,6 +66,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.utils.CollectionDSL.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class L3BasicNetwork implements L3Network { @@ -547,7 +548,7 @@ public void run(SyncTaskChain chain) { String reason = msg.getRequiredIp() == null ? String.format("no ip is available in this l3Network[name:%s, uuid:%s]", self.getName(), self.getUuid()) : String.format("IP[%s] is not available", msg.getRequiredIp()); - reply.setError(err(L3Errors.ALLOCATE_IP_ERROR, + reply.setError(err(ORG_ZSTACK_NETWORK_L3_10078, L3Errors.ALLOCATE_IP_ERROR, "IP allocator strategy[%s] failed, because %s", strategyType, reason)); bus.reply(msg, reply); chain.next(); diff --git a/network/src/main/java/org/zstack/network/l3/L3NetworkApiInterceptor.java b/network/src/main/java/org/zstack/network/l3/L3NetworkApiInterceptor.java index 267f67f1aa4..d4dfa4dc8d6 100755 --- a/network/src/main/java/org/zstack/network/l3/L3NetworkApiInterceptor.java +++ b/network/src/main/java/org/zstack/network/l3/L3NetworkApiInterceptor.java @@ -35,6 +35,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -124,7 +125,7 @@ private void validate(APIDeleteIpAddressMsg msg) { for (String uuid : msg.getUsedIpUuids()) { UsedIpVO vo = dbf.findByUuid(uuid, UsedIpVO.class); if (vo.getVmNicUuid() != null) { - throw new ApiMessageInterceptionException(argerr("could delete ip address, " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10000, "could delete ip address, " + "because it's used by vmnic[uuid:%s]", vo.getVmNicUuid())); } } @@ -133,27 +134,27 @@ private void validate(APIDeleteIpAddressMsg msg) { private void validate(APIAddReservedIpRangeMsg msg) { L3NetworkVO l3NetworkVO = dbf.findByUuid(msg.getL3NetworkUuid(), L3NetworkVO.class); if (!NetworkUtils.isValidIPAddress(msg.getStartIp())) { - throw new ApiMessageInterceptionException(argerr("could not reserve ip range, " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10001, "could not reserve ip range, " + "because start ip[%s] is not valid ip address", msg.getStartIp())); } if (!NetworkUtils.isValidIPAddress(msg.getEndIp())) { - throw new ApiMessageInterceptionException(argerr("could not reserve ip range, " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10002, "could not reserve ip range, " + "because start ip[%s] is not valid ip address", msg.getStartIp())); } if (NetworkUtils.isIpv4Address(msg.getStartIp()) && !NetworkUtils.isIpv4Address(msg.getEndIp())) { - throw new ApiMessageInterceptionException(argerr("could not reserve ip range, " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10003, "could not reserve ip range, " + "because end ip[%s] is not ipv4 address", msg.getEndIp())); } if (IPv6NetworkUtils.isIpv6Address(msg.getStartIp()) && !IPv6NetworkUtils.isIpv6Address(msg.getEndIp())) { - throw new ApiMessageInterceptionException(argerr("could not reserve ip range, " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10004, "could not reserve ip range, " + "because end ip[%s] is not ipv6 address", msg.getEndIp())); } if (!IPv6NetworkUtils.isValidIpRange(msg.getStartIp(), msg.getEndIp())) { - throw new ApiMessageInterceptionException(argerr("could not reserve ip range, " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10005, "could not reserve ip range, " + "because end ip[%s] is less than start ip[%s]", msg.getEndIp(), msg.getStartIp())); } @@ -162,13 +163,13 @@ private void validate(APIAddReservedIpRangeMsg msg) { .filter(ipr -> (ipr.getIpVersion() == IPv6Constants.IPv4)) .collect(Collectors.toList()); if (ipv4Ranges.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("could not reserve ip range, " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10006, "could not reserve ip range, " + "because there is no ipv4 range")); } if (!NetworkUtils.isIpv4InCidr(msg.getStartIp(), ipv4Ranges.get(0).getNetworkCidr()) || !NetworkUtils.isIpv4InCidr(msg.getEndIp(), ipv4Ranges.get(0).getNetworkCidr())) { - throw new ApiMessageInterceptionException(argerr("could not reserve ip range, " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10007, "could not reserve ip range, " + "because reserve ip is not in ip range[%s]", ipv4Ranges.get(0).getNetworkCidr())); } @@ -178,7 +179,7 @@ private void validate(APIAddReservedIpRangeMsg msg) { for (ReservedIpRangeVO reserveRange : reservedIpv4Ranges) { if (NetworkUtils.isIpv4RangeOverlap(msg.getStartIp(), msg.getEndIp(), reserveRange.getStartIp(), reserveRange.getEndIp())) { - throw new ApiMessageInterceptionException(argerr("could not reserve ip range, " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10008, "could not reserve ip range, " + "because new range [%s:%s] is overlapped with old range", msg.getStartIp(), msg.getEndIp(), reserveRange.getStartIp(), reserveRange.getEndIp())); @@ -191,13 +192,13 @@ private void validate(APIAddReservedIpRangeMsg msg) { .filter(ipr -> ipr.getIpVersion() == IPv6Constants.IPv6) .collect(Collectors.toList()); if (ipv6Ranges.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("could not reserve ip range, " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10009, "could not reserve ip range, " + "because there is no ipv6 range")); } if (!IPv6NetworkUtils.isIpv6InCidrRange(msg.getStartIp(), ipv6Ranges.get(0).getNetworkCidr()) || !IPv6NetworkUtils.isIpv6InCidrRange(msg.getEndIp(), ipv6Ranges.get(0).getNetworkCidr())) { - throw new ApiMessageInterceptionException(argerr("could not reserve ip range, " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10010, "could not reserve ip range, " + "because reserve ip is not in ip range[%s]", ipv6Ranges.get(0).getNetworkCidr())); } @@ -207,7 +208,7 @@ private void validate(APIAddReservedIpRangeMsg msg) { for (ReservedIpRangeVO reserveRange : reservedIpv6Ranges) { if (IPv6NetworkUtils.isIpv6RangeOverlap(msg.getStartIp(), msg.getEndIp(), reserveRange.getStartIp(), reserveRange.getEndIp())) { - throw new ApiMessageInterceptionException(argerr("could not reserve ip range, " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10011, "could not reserve ip range, " + "because new range [%s:%s] is overlapped with old range", msg.getStartIp(), msg.getEndIp(), reserveRange.getStartIp(), reserveRange.getEndIp())); @@ -230,7 +231,7 @@ private void validate(APISetL3NetworkMtuMsg msg) { if (novlanL2Vos.isEmpty()) { Integer defaultMtu = NetworkServiceGlobalConfig.DHCP_MTU_NO_VLAN.value(Integer.class); if (msg.getMtu() > defaultMtu) { - throw new ApiMessageInterceptionException(argerr("could not set mtu because l2 network[uuid:%s] of " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10012, "could not set mtu because l2 network[uuid:%s] of " + "l3 network [uuid:%s] mtu can not be bigger than the novlan network", l2VO.getUuid(), msg.getL3NetworkUuid())); } } @@ -262,7 +263,7 @@ private void validate(APISetL3NetworkMtuMsg msg) { } if (noVlanMax != null && msg.getMtu() > noVlanMax) { - throw new ApiMessageInterceptionException(argerr("could not set mtu because l2 network[uuid:%s] of " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10013, "could not set mtu because l2 network[uuid:%s] of " + "l3 network [uuid:%s] mtu can not be bigger than the novlan network", l2VO.getUuid(), msg.getL3NetworkUuid())); } } @@ -278,7 +279,7 @@ private void validate(APIDeleteIpRangeMsg msg) { .eq(NormalIpRangeVO_.ipVersion, IPv6Constants.IPv4).count(); long addressPoolCnt = Q.New(AddressPoolVO.class).eq(AddressPoolVO_.l3NetworkUuid, ipr.getL3NetworkUuid()).count(); if (addressPoolCnt > 0 && normaCnt == 1) { - throw new ApiMessageInterceptionException(argerr("can not delete the last normal ip range because there is still has address pool")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10014, "can not delete the last normal ip range because there is still has address pool")); } } @@ -293,7 +294,7 @@ private void validate(APIUpdateL3NetworkMsg msg) { .eq(L3NetworkVO_.uuid, msg.getL3NetworkUuid()) .findValue(); if (msg.getSystem() != null && msg.getCategory() == null && !msg.getSystem().equals(currentSystem)) { - throw new ApiMessageInterceptionException(argerr("you must update system and category both")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10015, "you must update system and category both")); } List validNetworkCategory = Arrays.asList(L3NetworkCategory.values()); @@ -310,7 +311,7 @@ private void validate(APIUpdateL3NetworkMsg msg) { if (L3NetworkCategory.checkSystemAndCategory(msg.getSystem(), L3NetworkCategory.valueOf(msg.getCategory()))) { return; } else { - throw new ApiMessageInterceptionException(argerr("not valid combination of system and category," + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10016, "not valid combination of system and category," + "only %s are valid", L3NetworkCategory.validCombination)); } } @@ -318,21 +319,21 @@ private void validate(APIUpdateL3NetworkMsg msg) { private void validate(APISetL3NetworkRouterInterfaceIpMsg msg) { if (!NetworkUtils.isIpv4Address(msg.getRouterInterfaceIp())) { - throw new ApiMessageInterceptionException(argerr("invalid IP[%s]", msg.getRouterInterfaceIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10017, "invalid IP[%s]", msg.getRouterInterfaceIp())); } /* this API only related ipv4 */ List ipRangeVOS = Q.New(NormalIpRangeVO.class).eq(NormalIpRangeVO_.l3NetworkUuid, msg.getL3NetworkUuid()) .eq(NormalIpRangeVO_.ipVersion, IPv6Constants.IPv4).list(); if (ipRangeVOS == null || ipRangeVOS.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("no ip range in l3[%s]", msg.getL3NetworkUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10018, "no ip range in l3[%s]", msg.getL3NetworkUuid())); } for (NormalIpRangeVO ipr : ipRangeVOS) { if (!NetworkUtils.isIpv4InCidr(msg.getRouterInterfaceIp(), ipr.getNetworkCidr())) { - throw new ApiMessageInterceptionException(argerr("ip[%s] is not in the cidr of ip range[uuid:%s, cidr:%s] which l3 network[%s] attached", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10019, "ip[%s] is not in the cidr of ip range[uuid:%s, cidr:%s] which l3 network[%s] attached", msg.getRouterInterfaceIp(), ipr.getUuid(), ipr.getNetworkCidr(), msg.getL3NetworkUuid())); } if (NetworkUtils.isInRange(msg.getRouterInterfaceIp(), ipr.getStartIp(), ipr.getEndIp())) { - throw new ApiMessageInterceptionException(argerr("ip[%s] in ip range[uuid:%s, startIp:%s, endIp:%s] which l3 network[%s] attached, this is not allowed", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10020, "ip[%s] in ip range[uuid:%s, startIp:%s, endIp:%s] which l3 network[%s] attached, this is not allowed", msg.getRouterInterfaceIp(), ipr.getUuid(), ipr.getStartIp(), ipr.getEndIp(), msg.getL3NetworkUuid())); } } @@ -340,14 +341,14 @@ private void validate(APISetL3NetworkRouterInterfaceIpMsg msg) { private void validate(APICheckIpAvailabilityMsg msg) { if (!NetworkUtils.isValidIPAddress(msg.getIp())) { - throw new ApiMessageInterceptionException(argerr("invalid IP[%s]", msg.getIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10021, "invalid IP[%s]", msg.getIp())); } } private void validate(APIGetFreeIpMsg msg) { if (msg.getIpRangeUuid() == null && msg.getL3NetworkUuid() == null) { throw new ApiMessageInterceptionException(argerr( - "ipRangeUuid and l3NetworkUuid cannot both be null; you must set either one." + ORG_ZSTACK_NETWORK_L3_10022, "ipRangeUuid and l3NetworkUuid cannot both be null; you must set either one." )); } @@ -375,18 +376,18 @@ private void validate(APIGetFreeIpMsg msg) { if (msg.getStart() != null) { if (msg.getIpVersion() == IPv6Constants.DUAL_STACK) { - throw new ApiMessageInterceptionException(argerr("could not get free ip with start[ip:%s],because l3Network[uuid:%s] is dual stack", msg.getStart(), msg.getL3NetworkUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10023, "could not get free ip with start[ip:%s],because l3Network[uuid:%s] is dual stack", msg.getStart(), msg.getL3NetworkUuid())); } else if (msg.getIpVersion() == IPv6Constants.IPv4 && !NetworkUtils.isIpv4Address(msg.getStart())) { - throw new ApiMessageInterceptionException(argerr("could not get free ip with start[ip:%s],because start[ip:%s] is not a correct ipv4 address", msg.getStart(), msg.getStart())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10024, "could not get free ip with start[ip:%s],because start[ip:%s] is not a correct ipv4 address", msg.getStart(), msg.getStart())); } else if (msg.getIpVersion() == IPv6Constants.IPv6 && !IPv6NetworkUtils.isIpv6Address(msg.getStart())) { - throw new ApiMessageInterceptionException(argerr("could not get free ip with start[ip:%s],because start[ip:%s] is not a correct ipv6 address", msg.getStart(), msg.getStart())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10025, "could not get free ip with start[ip:%s],because start[ip:%s] is not a correct ipv6 address", msg.getStart(), msg.getStart())); } } } private void validate(APIAddIpv6RangeByNetworkCidrMsg msg) { if (!IPv6NetworkUtils.isValidUnicastNetworkCidr(msg.getNetworkCidr())) { - throw new ApiMessageInterceptionException(argerr("%s is not a valid network cidr", msg.getNetworkCidr())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10026, "%s is not a valid network cidr", msg.getNetworkCidr())); } if (msg.getIpRangeType() == null) { @@ -399,19 +400,19 @@ private void validate(APIAddIpv6RangeByNetworkCidrMsg msg) { private void validate(APIAddIpv6RangeMsg msg) { if (!IPv6NetworkUtils.isIpv6UnicastAddress(msg.getStartIp())) { - throw new ApiMessageInterceptionException(argerr("%s is not a valid ipv6 address", msg.getStartIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10027, "%s is not a valid ipv6 address", msg.getStartIp())); } if (!IPv6NetworkUtils.isIpv6UnicastAddress(msg.getEndIp())) { - throw new ApiMessageInterceptionException(argerr("%s is not a valid ipv6 address", msg.getEndIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10028, "%s is not a valid ipv6 address", msg.getEndIp())); } if (!IPv6NetworkUtils.isIpv6UnicastAddress(msg.getGateway())) { - throw new ApiMessageInterceptionException(argerr("%s is not a valid ipv6 address", msg.getGateway())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10029, "%s is not a valid ipv6 address", msg.getGateway())); } if (!IPv6NetworkUtils.isValidUnicastIpv6Range(msg.getStartIp(), msg.getEndIp(), msg.getGateway(), msg.getPrefixLen())) { - throw new ApiMessageInterceptionException(argerr("[startIp %s, endIp %s, prefixLen %d, gateway %s] is not a valid ipv6 range", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10030, "[startIp %s, endIp %s, prefixLen %d, gateway %s] is not a valid ipv6 range", msg.getStartIp(), msg.getEndIp(), msg.getPrefixLen(), msg.getGateway())); } @@ -422,12 +423,12 @@ private void validate(APIAddIpv6RangeMsg msg) { /* normal ip range must has netmask and gateway */ if (msg.getIpRangeType().equals(IpRangeType.Normal.toString())) { if (msg.getGateway() == null) { - throw new ApiMessageInterceptionException(argerr("adding normal ip range must specify gateway ip address")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10031, "adding normal ip range must specify gateway ip address")); } } if (msg.getIpRangeType().equals(IpRangeType.AddressPool.toString())) { - throw new ApiMessageInterceptionException(argerr("can not add ip range, because ipv6 address pool is not supported")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10032, "can not add ip range, because ipv6 address pool is not supported")); /* fake gateway msg.setGateway(msg.getStartIp()); */ } @@ -438,26 +439,26 @@ private void validate(APIAddIpv6RangeMsg msg) { private void validateIpv6Range(IpRangeInventory ipr) { if (ipr.getPrefixLen() > IPv6Constants.IPV6_PREFIX_LEN_MAX || ipr.getPrefixLen() < IPv6Constants.IPV6_PREFIX_LEN_MIN) { - throw new ApiMessageInterceptionException(argerr("ip range prefix length is out of range [%d - %d] ", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10033, "ip range prefix length is out of range [%d - %d] ", IPv6Constants.IPV6_PREFIX_LEN_MIN, IPv6Constants.IPV6_PREFIX_LEN_MAX)); } L3NetworkVO l3Vo = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.uuid, ipr.getL3NetworkUuid()).find(); if (l3Vo.getCategory().equals(L3NetworkCategory.System)) { - throw new ApiMessageInterceptionException(argerr("can not add ip range, because system network doesn't support ipv6 yet")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10034, "can not add ip range, because system network doesn't support ipv6 yet")); } List rangeVOS = Q.New(NormalIpRangeVO.class).eq(NormalIpRangeVO_.l3NetworkUuid, ipr.getL3NetworkUuid()).eq(NormalIpRangeVO_.ipVersion, IPv6Constants.IPv6).list(); if (rangeVOS != null && !rangeVOS.isEmpty()) { if (!rangeVOS.get(0).getAddressMode().equals(ipr.getAddressMode())) { - throw new ApiMessageInterceptionException(argerr("addressMode[%s] is different from L3Netowork address mode[%s]", ipr.getAddressMode(), + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10035, "addressMode[%s] is different from L3Netowork address mode[%s]", ipr.getAddressMode(), rangeVOS.get(0).getAddressMode())); } } if (!ipr.getAddressMode().equals(IPv6Constants.Stateful_DHCP) && ipr.getPrefixLen() != IPv6Constants.IPV6_STATELESS_PREFIX_LEN) { - throw new ApiMessageInterceptionException(argerr("ipv6 prefix length must be %d for Stateless-DHCP or SLAAC", IPv6Constants.IPV6_STATELESS_PREFIX_LEN)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10036, "ipv6 prefix length must be %d for Stateless-DHCP or SLAAC", IPv6Constants.IPV6_STATELESS_PREFIX_LEN)); } List l3Uuids = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.l2NetworkUuid, l3Vo.getL2NetworkUuid()).select(L3NetworkVO_.uuid).listValues(); @@ -467,7 +468,7 @@ private void validateIpv6Range(IpRangeInventory ipr) { List ranges = q.list(); for (NormalIpRangeVO r : ranges) { if (IPv6NetworkUtils.isIpv6RangeOverlap(ipr.getStartIp(), ipr.getEndIp(), r.getStartIp(), r.getEndIp())) { - throw new ApiMessageInterceptionException(argerr("new ip range [startip :%s, endip :%s] is overlaped with old ip range[startip :%s, endip :%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10037, "new ip range [startip :%s, endip :%s] is overlaped with old ip range[startip :%s, endip :%s]", ipr.getStartIp(), ipr.getEndIp(), r.getStartIp(), r.getEndIp())); } @@ -477,7 +478,7 @@ private void validateIpv6Range(IpRangeInventory ipr) { /* same l3 network can have only 1 cidr (exclude address pool iprange) */ if ((ipr.getIpRangeType() != IpRangeType.AddressPool) && (!r.getNetworkCidr().equals(ipr.getNetworkCidr()))) { - throw new ApiMessageInterceptionException(argerr("new network CIDR [%s] is different from old network cidr [%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10038, "new network CIDR [%s] is different from old network cidr [%s]", r.getNetworkCidr(), ipr.getNetworkCidr())); } } @@ -487,13 +488,13 @@ private void validateIpv6Range(IpRangeInventory ipr) { .eq(NormalIpRangeVO_.ipVersion, IPv6Constants.IPv6).list(); for (NormalIpRangeVO r : l3IpRanges) { if (!r.getGateway().equals(ipr.getGateway())) { - throw new ApiMessageInterceptionException(argerr("new add ip range gateway %s is different from old gateway %s", ipr.getGateway(), r.getGateway())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10039, "new add ip range gateway %s is different from old gateway %s", ipr.getGateway(), r.getGateway())); } } if (ipr.getIpRangeType() == IpRangeType.Normal) { if (NetworkUtils.isInIpv6Range(ipr.getStartIp(), ipr.getEndIp(), ipr.getGateway())) { - throw new ApiMessageInterceptionException(argerr("gateway[%s] can not be part of range[%s, %s]", ipr.getGateway(), ipr.getStartIp(), ipr.getEndIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10040, "gateway[%s] can not be part of range[%s, %s]", ipr.getGateway(), ipr.getStartIp(), ipr.getEndIp())); } } } @@ -504,13 +505,13 @@ private void validate(APIAddIpRangeByNetworkCidrMsg msg) { utils.setInclusiveHostCount(false); SubnetInfo subnet = utils.getInfo(); if (subnet.getAddressCount() == 0) { - throw new ApiMessageInterceptionException(argerr("%s is not an allowed network cidr, because it doesn't have usable ip range", msg.getNetworkCidr())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10041, "%s is not an allowed network cidr, because it doesn't have usable ip range", msg.getNetworkCidr())); } if (msg.getGateway() != null && !subnet.isInRange(msg.getGateway())) { - throw new ApiMessageInterceptionException(argerr("the gateway[%s] is not in the subnet %s", msg.getGateway(), subnet.getCidrSignature())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10042, "the gateway[%s] is not in the subnet %s", msg.getGateway(), subnet.getCidrSignature())); } } catch (IllegalArgumentException e) { - throw new ApiMessageInterceptionException(argerr("%s is not a valid network cidr", msg.getNetworkCidr())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10043, "%s is not a valid network cidr", msg.getNetworkCidr())); } if (msg.getIpRangeType() == null) { @@ -537,7 +538,7 @@ private void validate(APIGetIpAddressCapacityMsg msg) { if (!pass && !msg.isAll()) { throw new ApiMessageInterceptionException(argerr( - "ipRangeUuids, L3NetworkUuids, zoneUuids must have at least one be none-empty list, or all is set to true" + ORG_ZSTACK_NETWORK_L3_10044, "ipRangeUuids, L3NetworkUuids, zoneUuids must have at least one be none-empty list, or all is set to true" )); } @@ -557,13 +558,13 @@ private void validate(APIGetIpAddressCapacityMsg msg) { private void validate(APICreateL3NetworkMsg msg) { if (!L3NetworkType.hasType(msg.getType())) { - throw new ApiMessageInterceptionException(argerr("unsupported l3network type[%s]", msg.getType())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10045, "unsupported l3network type[%s]", msg.getType())); } if (msg.getDnsDomain() != null) { DomainValidator validator = DomainValidator.getInstance(); if (!validator.isValid(msg.getDnsDomain())) { - throw new ApiMessageInterceptionException(argerr("%s is not a valid domain name", msg.getDnsDomain())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10046, "%s is not a valid domain name", msg.getDnsDomain())); } } @@ -578,7 +579,7 @@ private void validate(APICreateL3NetworkMsg msg) { if (L3NetworkCategory.checkSystemAndCategory(msg.isSystem(), L3NetworkCategory.valueOf(msg.getCategory()))) { return; } else { - throw new ApiMessageInterceptionException(argerr("not valid combination of system and category," + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10047, "not valid combination of system and category," + "only %s are valid", L3NetworkCategory.validCombination)); } } @@ -618,7 +619,7 @@ private void validateAddressPool(IpRangeInventory ipr) { List ranges = q.list(); for (AddressPoolVO r : ranges) { if (NetworkUtils.isIpv4RangeOverlap(ipr.getStartIp(), ipr.getEndIp(), r.getStartIp(), r.getEndIp())) { - throw new ApiMessageInterceptionException(argerr("overlap with ip range[uuid:%s, start ip:%s, end ip: %s]", r.getUuid(), r.getStartIp(), r.getEndIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10048, "overlap with ip range[uuid:%s, start ip:%s, end ip: %s]", r.getUuid(), r.getStartIp(), r.getEndIp())); } } } @@ -627,53 +628,53 @@ private void validate(IpRangeInventory ipr) { L3NetworkVO l3Vo = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.uuid, ipr.getL3NetworkUuid()).find(); if (ipr.getIpRangeType() == IpRangeType.AddressPool && l3Vo.getCategory() != L3NetworkCategory.Public) { - throw new ApiMessageInterceptionException(argerr("l3 network [uuid %s: name %s] is not a public network, address pool range can not be added", l3Vo.getUuid(), l3Vo.getName())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10049, "l3 network [uuid %s: name %s] is not a public network, address pool range can not be added", l3Vo.getUuid(), l3Vo.getName())); } if (NetworkUtils.isIpv4RangeOverlap("224.0.0.0", "239.255.255.255", ipr.getStartIp(), ipr.getEndIp())) { - throw new ApiMessageInterceptionException(argerr("the IP range[%s ~ %s] contains D class addresses which are for multicast", ipr.getStartIp(), ipr.getEndIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10050, "the IP range[%s ~ %s] contains D class addresses which are for multicast", ipr.getStartIp(), ipr.getEndIp())); } if (NetworkUtils.isIpv4RangeOverlap("240.0.0.0", "255.255.255.255", ipr.getStartIp(), ipr.getEndIp())) { - throw new ApiMessageInterceptionException(argerr("the IP range[%s ~ %s] contains E class addresses which are reserved", ipr.getStartIp(), ipr.getEndIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10051, "the IP range[%s ~ %s] contains E class addresses which are reserved", ipr.getStartIp(), ipr.getEndIp())); } if (NetworkUtils.isIpv4RangeOverlap("169.254.1.0", "169.254.254.255", ipr.getStartIp(), ipr.getEndIp())) { - throw new ApiMessageInterceptionException(argerr("the IP range[%s ~ %s] contains link local addresses which are reserved", ipr.getStartIp(), ipr.getEndIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10052, "the IP range[%s ~ %s] contains link local addresses which are reserved", ipr.getStartIp(), ipr.getEndIp())); } SubnetUtils sub = new SubnetUtils(ipr.getStartIp(), ipr.getNetmask()); SubnetInfo info = sub.getInfo(); if (!info.isInRange(ipr.getGateway())) { - throw new ApiMessageInterceptionException(argerr("the gateway[%s] is not in the subnet %s/%s", ipr.getGateway(), ipr.getStartIp(), ipr.getNetmask())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10053, "the gateway[%s] is not in the subnet %s/%s", ipr.getGateway(), ipr.getStartIp(), ipr.getNetmask())); } if (ipr.getStartIp().equals(info.getNetworkAddress()) || ipr.getEndIp().equals(info.getBroadcastAddress())) { throw new ApiMessageInterceptionException(argerr( - "ip allocation can not contain network address or broadcast address") + ORG_ZSTACK_NETWORK_L3_10054, "ip allocation can not contain network address or broadcast address") ); } if (!NetworkUtils.isIpv4Address(ipr.getStartIp())) { - throw new ApiMessageInterceptionException(argerr("start ip[%s] is not a IPv4 address", ipr.getStartIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10055, "start ip[%s] is not a IPv4 address", ipr.getStartIp())); } if (!NetworkUtils.isIpv4Address(ipr.getEndIp())) { - throw new ApiMessageInterceptionException(argerr("end ip[%s] is not a IPv4 address", ipr.getEndIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10056, "end ip[%s] is not a IPv4 address", ipr.getEndIp())); } if (!NetworkUtils.isIpv4Address(ipr.getGateway())) { - throw new ApiMessageInterceptionException(argerr("gateway[%s] is not a IPv4 address", ipr.getGateway())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10057, "gateway[%s] is not a IPv4 address", ipr.getGateway())); } if (!NetworkUtils.isNetmaskExcept(ipr.getNetmask(), "0.0.0.0")) { - throw new ApiMessageInterceptionException(argerr("netmask[%s] is not a netmask, and the IP range netmask cannot be 0.0.0.0", ipr.getNetmask())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10058, "netmask[%s] is not a netmask, and the IP range netmask cannot be 0.0.0.0", ipr.getNetmask())); } long startip = NetworkUtils.ipv4StringToLong(ipr.getStartIp()); long endip = NetworkUtils.ipv4StringToLong(ipr.getEndIp()); if (startip > endip) { - throw new ApiMessageInterceptionException(argerr("start ip[%s] is behind end ip[%s]", ipr.getStartIp(), ipr.getEndIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10059, "start ip[%s] is behind end ip[%s]", ipr.getStartIp(), ipr.getEndIp())); } String cidr = ipr.toSubnetUtils().getInfo().getCidrSignature(); @@ -684,7 +685,7 @@ private void validate(IpRangeInventory ipr) { List ranges = q.list(); for (IpRangeVO r : ranges) { if (NetworkUtils.isIpv4RangeOverlap(ipr.getStartIp(), ipr.getEndIp(), r.getStartIp(), r.getEndIp())) { - throw new ApiMessageInterceptionException(argerr("overlap with ip range[uuid:%s, start ip:%s, end ip: %s]", r.getUuid(), r.getStartIp(), r.getEndIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10060, "overlap with ip range[uuid:%s, start ip:%s, end ip: %s]", r.getUuid(), r.getStartIp(), r.getEndIp())); } if (!r.getL3NetworkUuid().equals(ipr.getL3NetworkUuid())) { @@ -700,7 +701,7 @@ private void validate(IpRangeInventory ipr) { /* same l3 network can have only 1 cidr */ String rcidr = IpRangeInventory.valueOf(r).toSubnetUtils().getInfo().getCidrSignature(); if (!cidr.equals(rcidr)) { - throw new ApiMessageInterceptionException(argerr("multiple CIDR on the same L3 network is not allowed. There has been a IP" + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10061, "multiple CIDR on the same L3 network is not allowed. There has been a IP" + " range[uuid:%s, CIDR:%s], the new IP range[CIDR:%s] is not in the CIDR with the existing one", r.getUuid(), rcidr, cidr)); } @@ -710,19 +711,19 @@ private void validate(IpRangeInventory ipr) { /* normal ip ranges of same l3 network must have same gateway */ if (ipr.getIpRangeType() == IpRangeType.Normal) { if (!info.isInRange(ipr.getEndIp())) { - throw new ApiMessageInterceptionException(argerr("the endip[%s] is not in the subnet %s/%s", ipr.getEndIp(), ipr.getStartIp(), ipr.getNetmask())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10062, "the endip[%s] is not in the subnet %s/%s", ipr.getEndIp(), ipr.getStartIp(), ipr.getNetmask())); } long gw = NetworkUtils.ipv4StringToLong(ipr.getGateway()); if (startip <= gw && gw <= endip) { - throw new ApiMessageInterceptionException(argerr("gateway[%s] can not be part of range[%s, %s]", ipr.getGateway(), ipr.getStartIp(), ipr.getEndIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10063, "gateway[%s] can not be part of range[%s, %s]", ipr.getGateway(), ipr.getStartIp(), ipr.getEndIp())); } List l3IpRanges = Q.New(NormalIpRangeVO.class).eq(NormalIpRangeVO_.l3NetworkUuid, ipr.getL3NetworkUuid()) .eq(NormalIpRangeVO_.ipVersion, IPv6Constants.IPv4).list(); for (NormalIpRangeVO r : l3IpRanges) { if (!r.getGateway().equals(ipr.getGateway())) { - throw new ApiMessageInterceptionException(argerr("new add ip range gateway %s is different from old gateway %s", ipr.getGateway(), r.getGateway())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10064, "new add ip range gateway %s is different from old gateway %s", ipr.getGateway(), r.getGateway())); } } } else if (ipr.getIpRangeType() == IpRangeType.AddressPool) { @@ -737,7 +738,7 @@ private void validate(APIAddIpRangeMsg msg) { /* normal ip range must has netmask and gateway */ if (msg.getIpRangeType().equals(IpRangeType.Normal.toString())) { if (msg.getGateway() == null) { - throw new ApiMessageInterceptionException(argerr("adding normal ip range must specify gateway ip address")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10065, "adding normal ip range must specify gateway ip address")); } } @@ -752,7 +753,7 @@ private void validate(APIAddIpRangeMsg msg) { private void validate(APIAddDnsToL3NetworkMsg msg) { if (!NetworkUtils.isIpAddress(msg.getDns())) { - throw new ApiMessageInterceptionException(argerr("dns[%s] is not a IP address", msg.getDns())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10066, "dns[%s] is not a IP address", msg.getDns())); } List l3NetworkDnsVOS = Q.New(L3NetworkDnsVO.class).eq(L3NetworkDnsVO_.l3NetworkUuid, msg.getL3NetworkUuid()).list(); @@ -763,7 +764,7 @@ private void validate(APIAddDnsToL3NetworkMsg msg) { if (NetworkUtils.isIpv4Address(msg.getDns())) { boolean exist = l3NetworkDnsVOS.stream().anyMatch(l3NetworkDnsVO -> msg.getDns().equals(l3NetworkDnsVO.getDns())); if (exist) { - throw new ApiMessageInterceptionException(operr("there has been a DNS[%s] on L3 network[uuid:%s]", msg.getDns(), msg.getL3NetworkUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_L3_10067, "there has been a DNS[%s] on L3 network[uuid:%s]", msg.getDns(), msg.getL3NetworkUuid())); } } else { for (L3NetworkDnsVO l3NetworkDnsVO : l3NetworkDnsVOS) { @@ -771,7 +772,7 @@ private void validate(APIAddDnsToL3NetworkMsg msg) { continue; } if (IPv6Address.fromString(msg.getDns()).toBigInteger().equals(IPv6Address.fromString(l3NetworkDnsVO.getDns()).toBigInteger())) { - throw new ApiMessageInterceptionException(operr("there has been a DNS[%s] on L3 network[uuid:%s]", msg.getDns(), msg.getL3NetworkUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_L3_10068, "there has been a DNS[%s] on L3 network[uuid:%s]", msg.getDns(), msg.getL3NetworkUuid())); } } } @@ -779,31 +780,31 @@ private void validate(APIAddDnsToL3NetworkMsg msg) { private void validate(APIAddHostRouteToL3NetworkMsg msg) { if (!NetworkUtils.isCidr(msg.getPrefix())) { - throw new ApiMessageInterceptionException(argerr("prefix [%s] is not a IPv4 network cidr", msg.getL3NetworkUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10069, "prefix [%s] is not a IPv4 network cidr", msg.getL3NetworkUuid())); } if (!NetworkUtils.isIpv4Address(msg.getNexthop())) { - throw new ApiMessageInterceptionException(argerr("nexthop[%s] is not a IPv4 address", msg.getNexthop())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10070, "nexthop[%s] is not a IPv4 address", msg.getNexthop())); } SimpleQuery q = dbf.createQuery(L3NetworkHostRouteVO.class); q.add(L3NetworkHostRouteVO_.l3NetworkUuid, Op.EQ, msg.getL3NetworkUuid()); q.add(L3NetworkHostRouteVO_.prefix, Op.EQ, msg.getPrefix()); if (q.isExists()) { - throw new ApiMessageInterceptionException(operr("there has been a hostroute for prefix[%s] on L3 network[uuid:%s]", msg.getPrefix(), msg.getL3NetworkUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_L3_10071, "there has been a hostroute for prefix[%s] on L3 network[uuid:%s]", msg.getPrefix(), msg.getL3NetworkUuid())); } } private void validate(APIRemoveHostRouteFromL3NetworkMsg msg) { if (!NetworkUtils.isCidr(msg.getPrefix())) { - throw new ApiMessageInterceptionException(argerr("prefix [%s] is not a IPv4 network cidr", msg.getL3NetworkUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L3_10072, "prefix [%s] is not a IPv4 network cidr", msg.getL3NetworkUuid())); } SimpleQuery q = dbf.createQuery(L3NetworkHostRouteVO.class); q.add(L3NetworkHostRouteVO_.l3NetworkUuid, Op.EQ, msg.getL3NetworkUuid()); q.add(L3NetworkHostRouteVO_.prefix, Op.EQ, msg.getPrefix()); if (!q.isExists()) { - throw new ApiMessageInterceptionException(operr("there is no hostroute for prefix[%s] on L3 network[uuid:%s]", msg.getPrefix(), msg.getL3NetworkUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_L3_10073, "there is no hostroute for prefix[%s] on L3 network[uuid:%s]", msg.getPrefix(), msg.getL3NetworkUuid())); } } } diff --git a/network/src/main/java/org/zstack/network/l3/L3NetworkCascadeExtension.java b/network/src/main/java/org/zstack/network/l3/L3NetworkCascadeExtension.java index f298e0f9dff..1d8a5359327 100755 --- a/network/src/main/java/org/zstack/network/l3/L3NetworkCascadeExtension.java +++ b/network/src/main/java/org/zstack/network/l3/L3NetworkCascadeExtension.java @@ -29,8 +29,9 @@ import java.util.concurrent.Callable; import static org.zstack.core.Platform.inerr; -/** +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*;/** */ + public class L3NetworkCascadeExtension extends AbstractAsyncCascadeExtension { private static final CLogger logger = Utils.getLogger(L3NetworkCascadeExtension.class); @@ -129,7 +130,7 @@ private void handleDeletionCheck(CascadeAction action, Completion completion) { completion.success(); } catch (L3NetworkException e) { - completion.fail(inerr(e.getMessage())); + completion.fail(inerr(ORG_ZSTACK_NETWORK_L3_10077, e.getMessage())); } } diff --git a/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java b/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java index 80ba293281b..384a5d2c1df 100755 --- a/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java +++ b/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java @@ -69,6 +69,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.utils.CollectionDSL.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class L3NetworkManagerImpl extends AbstractService implements L3NetworkManager, ReportQuotaExtensionPoint, ResourceOwnerPreChangeExtensionPoint, PrepareDbInitialValueExtensionPoint, ResourceSharingExtensionPoint, CheckIpAddressAvailabilityExtensionPoint { @@ -457,7 +458,7 @@ private void passThrough(String l3NetworkUuid, Message msg) { } if (vo == null) { - ErrorCode err = err(SysErrors.RESOURCE_NOT_FOUND, + ErrorCode err = err(ORG_ZSTACK_NETWORK_L3_10076, SysErrors.RESOURCE_NOT_FOUND, "Unable to find L3Network[uuid:%s], it may have been deleted", l3NetworkUuid); bus.replyErrorByMessageType(msg, err); return; diff --git a/network/src/main/java/org/zstack/network/service/DhcpExtension.java b/network/src/main/java/org/zstack/network/service/DhcpExtension.java index 90e78646d59..782c5d96544 100755 --- a/network/src/main/java/org/zstack/network/service/DhcpExtension.java +++ b/network/src/main/java/org/zstack/network/service/DhcpExtension.java @@ -37,6 +37,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -427,7 +428,7 @@ public void run(MessageReply reply) { NetworkServiceDhcpBackend bkd = dhcpBackends.get(providerType); if (bkd == null) { - completion.fail(operr("unable to find NetworkServiceDhcpBackend[provider type: %s]", providerType)); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_10013, "unable to find NetworkServiceDhcpBackend[provider type: %s]", providerType)); return; } @@ -457,7 +458,7 @@ public void run(MessageReply reply) { NetworkServiceDhcpBackend bkd = dhcpBackends.get(providerType); if (bkd == null) { - completion.fail(operr("unable to find NetworkServiceDhcpBackend[provider type: %s]", providerType)); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_10014, "unable to find NetworkServiceDhcpBackend[provider type: %s]", providerType)); return; } diff --git a/network/src/main/java/org/zstack/network/service/HostRouteExtension.java b/network/src/main/java/org/zstack/network/service/HostRouteExtension.java index 78985e07d6e..cd04a5ba509 100755 --- a/network/src/main/java/org/zstack/network/service/HostRouteExtension.java +++ b/network/src/main/java/org/zstack/network/service/HostRouteExtension.java @@ -22,6 +22,7 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class HostRouteExtension extends AbstractNetworkServiceExtension implements Component, Service { @@ -85,7 +86,7 @@ private void handle(final RemoveHostRouteMsg msg) { L3NetworkInventory l3 = L3NetworkInventory.valueOf(dbf.findByUuid(msg.getL3NetworkUuid(), L3NetworkVO.class)); NetworkServiceProviderType ptype = getNetworkServiceProviderType(NetworkServiceType.HostRoute, l3); if (ptype == null) { - reply.setError(operr("L3Network [uuid: %s] provide type null", msg.getL3NetworkUuid())); + reply.setError(operr(ORG_ZSTACK_NETWORK_SERVICE_10000, "L3Network [uuid: %s] provide type null", msg.getL3NetworkUuid())); bus.reply(msg, reply); return; } @@ -110,7 +111,7 @@ private void handle(final AddHostRouteMsg msg) { L3NetworkInventory l3 = L3NetworkInventory.valueOf(dbf.findByUuid(msg.getL3NetworkUuid(), L3NetworkVO.class)); NetworkServiceProviderType ptype = getNetworkServiceProviderType(NetworkServiceType.HostRoute, l3); if (ptype == null) { - reply.setError(operr("L3Network [uuid: %s] does not have host route service", msg.getL3NetworkUuid())); + reply.setError(operr(ORG_ZSTACK_NETWORK_SERVICE_10001, "L3Network [uuid: %s] does not have host route service", msg.getL3NetworkUuid())); bus.reply(msg, reply); return; } diff --git a/network/src/main/java/org/zstack/network/service/NetworkServiceApiInterceptor.java b/network/src/main/java/org/zstack/network/service/NetworkServiceApiInterceptor.java index 3ae0dd90750..dad5d87781a 100755 --- a/network/src/main/java/org/zstack/network/service/NetworkServiceApiInterceptor.java +++ b/network/src/main/java/org/zstack/network/service/NetworkServiceApiInterceptor.java @@ -25,6 +25,7 @@ import java.util.*; import java.util.stream.Collectors; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -60,7 +61,7 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti private void validate(APIAttachNetworkServiceToL3NetworkMsg msg) { if (msg.getNetworkServices().isEmpty()) { - throw new ApiMessageInterceptionException(argerr("networkServices cannot be empty")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_10006, "networkServices cannot be empty")); } SimpleQuery q = dbf.createQuery(NetworkServiceTypeVO.class); @@ -81,12 +82,12 @@ private void validate(APIAttachNetworkServiceToL3NetworkMsg msg) { String puuid = e.getKey(); List types = e.getValue(); if (types == null || types.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("network service for provider[uuid:%s] must be specified", puuid)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_10007, "network service for provider[uuid:%s] must be specified", puuid)); } final Set actualTypes = actual.get(puuid); if (actualTypes == null) { - throw new ApiMessageInterceptionException(argerr("cannot find network service provider[uuid:%s] or it provides no services", puuid)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_10008, "cannot find network service provider[uuid:%s] or it provides no services", puuid)); } if (!actualTypes.containsAll(types)) { @@ -100,7 +101,7 @@ public String call(String type) { } }); - throw new ApiMessageInterceptionException(argerr("network service provider[uuid:%s] doesn't provide services%s", puuid, notSupported)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_10009, "network service provider[uuid:%s] doesn't provide services%s", puuid, notSupported)); } } @@ -112,7 +113,7 @@ public String call(String type) { for (List types : msg.getNetworkServices().values()) { for (String type : types) { if (existingNwsTypes.contains(type)) { - throw new ApiMessageInterceptionException(operr("there has been a network service[%s] attached to L3 network[uuid:%s]", type, msg.getL3NetworkUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_10010, "there has been a network service[%s] attached to L3 network[uuid:%s]", type, msg.getL3NetworkUuid())); } if (type.equals(NetworkServiceType.DHCP.toString())) { @@ -148,7 +149,7 @@ public String call(String type) { } if ((isUseForUserVm && freeIpInventories.isEmpty())) { - throw new ApiMessageInterceptionException(operr("there are not enough IPs for allocation when attaching the DHCP service to L3 network[uuid:%s].", msg.getL3NetworkUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_10011, "there are not enough IPs for allocation when attaching the DHCP service to L3 network[uuid:%s].", msg.getL3NetworkUuid())); } } } @@ -157,7 +158,7 @@ public String call(String type) { private Map> convertNetworkProviderTypeToUuid(Map> map){ if (map.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("networkServices cannot be empty")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_10012, "networkServices cannot be empty")); } Map> mapNew = new HashMap<>(map); diff --git a/network/src/main/java/org/zstack/network/service/NetworkServiceManagerImpl.java b/network/src/main/java/org/zstack/network/service/NetworkServiceManagerImpl.java index 787ee313cd6..5e353fa1ff2 100755 --- a/network/src/main/java/org/zstack/network/service/NetworkServiceManagerImpl.java +++ b/network/src/main/java/org/zstack/network/service/NetworkServiceManagerImpl.java @@ -33,6 +33,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class NetworkServiceManagerImpl extends AbstractService implements NetworkServiceManager, PreVmInstantiateResourceExtensionPoint, VmReleaseResourceExtensionPoint, PostVmInstantiateResourceExtensionPoint, ReleaseNetworkServiceOnDetachingNicExtensionPoint, @@ -143,7 +144,7 @@ private void handle(APIDetachNetworkServiceProviderFromL2NetworkMsg msg) { try { provider.detachFromL2Network(L2NetworkInventory.valueOf(l2vo), msg); } catch (NetworkException e) { - evt.setError(err(NetworkServiceErrors.DETACH_NETWORK_SERVICE_PROVIDER_ERROR, "unable to detach network service provider[uuid:%s, name:%s, type:%s] to l2network[uuid:%s, name:%s, type:%s], %s", + evt.setError(err(ORG_ZSTACK_NETWORK_SERVICE_10002, NetworkServiceErrors.DETACH_NETWORK_SERVICE_PROVIDER_ERROR, "unable to detach network service provider[uuid:%s, name:%s, type:%s] to l2network[uuid:%s, name:%s, type:%s], %s", vo.getUuid(), vo.getName(), vo.getType(), l2vo.getUuid(), l2vo.getName(), l2vo.getType(), e.getMessage())); logger.warn(evt.getError().getDetails(), e); bus.publish(evt); @@ -177,7 +178,7 @@ private void handle(APIAttachNetworkServiceProviderToL2NetworkMsg msg) { try { provider.attachToL2Network(L2NetworkInventory.valueOf(l2vo), msg); } catch (NetworkException e) { - evt.setError(err(NetworkServiceErrors.ATTACH_NETWORK_SERVICE_PROVIDER_ERROR, "unable to attach network service provider[uuid:%s, name:%s, type:%s] to l2network[uuid:%s, name:%s, type:%s], %s", + evt.setError(err(ORG_ZSTACK_NETWORK_SERVICE_10003, NetworkServiceErrors.ATTACH_NETWORK_SERVICE_PROVIDER_ERROR, "unable to attach network service provider[uuid:%s, name:%s, type:%s] to l2network[uuid:%s, name:%s, type:%s], %s", vo.getUuid(), vo.getName(), vo.getType(), l2vo.getUuid(), l2vo.getName(), l2vo.getType(), e.getMessage())); logger.warn(evt.getError().getDetails(), e); bus.publish(evt); @@ -277,7 +278,7 @@ public void success() { @Override public void fail(ErrorCode errorCode) { - chain.fail(operr("Failed to apply network service[%s] to vm[uuid: %s]", + chain.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_10004, "Failed to apply network service[%s] to vm[uuid: %s]", ns.getNetworkServiceType(), spec.getVmInventory().getUuid()) .causedBy(errorCode)); @@ -331,7 +332,7 @@ public NetworkServiceProviderType getTypeOfNetworkServiceProviderForService(Stri } if (targetRef == null) { - throw new OperationFailureException(operr("L3Network[uuid:%s] doesn't have network service[type:%s] enabled or no provider provides this network service", + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_10005, "L3Network[uuid:%s] doesn't have network service[type:%s] enabled or no provider provides this network service", l3NetworkUuid, serviceType)); } diff --git a/plugin/acl/src/main/java/org/zstack/acl/AccessControlListApiInterceptor.java b/plugin/acl/src/main/java/org/zstack/acl/AccessControlListApiInterceptor.java index 9183191d59c..52816d25062 100644 --- a/plugin/acl/src/main/java/org/zstack/acl/AccessControlListApiInterceptor.java +++ b/plugin/acl/src/main/java/org/zstack/acl/AccessControlListApiInterceptor.java @@ -27,6 +27,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * @author: zhanyong.miao @@ -89,31 +90,31 @@ private void validateIp(String ips, AccessControlListVO acl) { DebugUtils.Assert(acl != null, "the invalide null AccessControlListVO"); Integer ipVer = acl.getIpVersion(); if (!ipVer.equals(IPv6Constants.IPv4)) { - throw new ApiMessageInterceptionException(argerr("not support the ip version %d", ipVer)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_ACL_10000, "not support the ip version %d", ipVer)); } try { RangeSet ipRanges = IpRangeSet.listAllRanges(ips); String[] ipcount = ips.split(IP_SPLIT); if (ipRanges.asRanges().size() < ipcount.length) { - throw new ApiMessageInterceptionException(argerr("%s duplicate/overlap ip entry with access-control-list group:%s", ips, acl.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_ACL_10001, "%s duplicate/overlap ip entry with access-control-list group:%s", ips, acl.getUuid())); } for (Range range : ipRanges.asRanges()) { final Range frange = ContiguousSet.create(range, DiscreteDomain.longs()).range(); String startIp = NetworkUtils.longToIpv4String(frange.lowerEndpoint()); String endIp = NetworkUtils.longToIpv4String(frange.upperEndpoint()); if (!validateIpRange(startIp, endIp)) { - throw new ApiMessageInterceptionException(argerr("ip format only supports ip/iprange/cidr, but find %s", ips)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_ACL_10002, "ip format only supports ip/iprange/cidr, but find %s", ips)); } ipRanges.asRanges().stream().forEach(r -> { if (!frange.equals(r) && NetworkUtils.isIpv4RangeOverlap(startIp, endIp, NetworkUtils.longToIpv4String(r.lowerEndpoint()), NetworkUtils.longToIpv4String(r.upperEndpoint()))) { - throw new ApiMessageInterceptionException(argerr("ip range[%s, %s] is overlap with [%s, %s] in access-control-list group:%s", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_ACL_10003, "ip range[%s, %s] is overlap with [%s, %s] in access-control-list group:%s", startIp, endIp, NetworkUtils.longToIpv4String(r.lowerEndpoint()), NetworkUtils.longToIpv4String(r.upperEndpoint()), acl.getUuid())); } }); } } catch (IllegalArgumentException e) { - throw new ApiMessageInterceptionException(argerr("Invalid rule expression, the detail: %s", e.getMessage())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_ACL_10004, "Invalid rule expression, the detail: %s", e.getMessage())); } } @@ -124,18 +125,18 @@ private void validate (APIAddAccessControlListEntryMsg msg) { boolean redirectRuleExisted = acl.getEntries().stream().anyMatch(entry -> entry.getType().equals(AclEntryType.RedirectRule.toString())); if (redirectRuleExisted) { - throw new ApiMessageInterceptionException(operr("the access-control-list groups[%s] already own redirect rule, can not add IP Entry", acl.getUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_ACL_10005, "the access-control-list groups[%s] already own redirect rule, can not add IP Entry", acl.getUuid())); } /*check if the entry is exist*/ if (acl.getEntries()!= null && !acl.getEntries().isEmpty()) { if (acl.getEntries().size() >= AccessControlListConstants.MAX_ENTRY_COUNT_PER_GROUP) { - throw new ApiMessageInterceptionException(argerr("the access-control-list groups[%s] can't be added more than %d ip entries", acl.getUuid(), AccessControlListConstants.MAX_ENTRY_COUNT_PER_GROUP)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_ACL_10006, "the access-control-list groups[%s] can't be added more than %d ip entries", acl.getUuid(), AccessControlListConstants.MAX_ENTRY_COUNT_PER_GROUP)); } boolean redirectRuleExsit = acl.getEntries().stream().anyMatch(entry -> entry.getType().equals(AclEntryType.RedirectRule.toString())); if (redirectRuleExsit) { - throw new ApiMessageInterceptionException(operr("the access-control-list groups[%s] already own redirect rule, can not add ip entry", acl.getUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_ACL_10007, "the access-control-list groups[%s] already own redirect rule, can not add ip entry", acl.getUuid())); } List ipentries = acl.getEntries().stream().map(entry -> entry.getIpEntries()).collect(Collectors.toList()); ipentries.add(msg.getEntries()); @@ -151,20 +152,20 @@ private void validate (APIAddAccessControlListRedirectRuleMsg msg) { boolean ipEntryExisted = acl.getEntries().stream().anyMatch(entry -> entry.getType().equals(AclEntryType.IpEntry.toString())); boolean redirectRuleExisted = acl.getEntries().stream().anyMatch(entry -> entry.getType().equals(AclEntryType.RedirectRule.toString())); if (ipEntryExisted) { - throw new ApiMessageInterceptionException(operr("the access-control-list groups[%s] already own ip entry, can not add redirect rule", acl.getUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_ACL_10008, "the access-control-list groups[%s] already own ip entry, can not add redirect rule", acl.getUuid())); } if (redirectRuleExisted) { - throw new ApiMessageInterceptionException(operr("the access-control-list groups[%s] already own one redirect rule, can not add redirect rule", acl.getUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_ACL_10009, "the access-control-list groups[%s] already own one redirect rule, can not add redirect rule", acl.getUuid())); } if (StringUtils.isBlank(msg.getDomain()) && (StringUtils.isBlank(msg.getUrl()) || msg.getUrl().length() == 1)) { - throw new ApiMessageInterceptionException(operr("domain and url can not both empty")); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_ACL_10010, "domain and url can not both empty")); } if (StringUtils.isNotBlank(msg.getDomain())) { if (!AccessControlListUtils.isValidateDomain(msg.getDomain())) { - throw new ApiMessageInterceptionException(argerr("domain[%s] is not validate domain", msg.getDomain())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_ACL_10011, "domain[%s] is not validate domain", msg.getDomain())); } if (msg.getDomain().contains("*")) { @@ -175,19 +176,19 @@ private void validate (APIAddAccessControlListRedirectRuleMsg msg) { if (StringUtils.isNotBlank(msg.getUrl()) && msg.getUrl().length() > 1) { if (!AccessControlListUtils.isValidateUrl(msg.getUrl())) { - throw new ApiMessageInterceptionException(argerr("url[%s] is not validate url", msg.getUrl())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_ACL_10012, "url[%s] is not validate url", msg.getUrl())); } msg.setMatchMethod("DomainAndUrl"); } else { if (msg.getUrl().length() == 1 && !msg.getUrl().equals("/")) { - throw new ApiMessageInterceptionException(argerr("url[%s] is not validate url", msg.getUrl())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_ACL_10013, "url[%s] is not validate url", msg.getUrl())); } msg.setUrl("/"); msg.setMatchMethod("Domain"); } } else { if (!AccessControlListUtils.isValidateUrl(msg.getUrl())) { - throw new ApiMessageInterceptionException(argerr("url[%s] is not validate url", msg.getDomain())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_ACL_10014, "url[%s] is not validate url", msg.getDomain())); } msg.setMatchMethod("Url"); } diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmBase.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmBase.java index 8d039b0e697..b506da2aceb 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmBase.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmBase.java @@ -44,6 +44,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public abstract class ApplianceVmBase extends VmInstanceBase implements ApplianceVm { @Autowired @@ -137,7 +138,7 @@ public String getSyncSignature() { public void run(final SyncTaskChain chain) { final ApplianceVmAsyncHttpCallReply reply = new ApplianceVmAsyncHttpCallReply(); if (msg.isCheckStatus() && getSelf().getStatus() != ApplianceVmStatus.Connected) { - reply.setError(operr("appliance vm[uuid:%s] is in status of %s that cannot make http call to %s", + reply.setError(operr(ORG_ZSTACK_APPLIANCEVM_10006, "appliance vm[uuid:%s] is in status of %s that cannot make http call to %s", self.getUuid(), getSelf().getStatus(), msg.getPath())); bus.reply(msg, reply); chain.next(); @@ -375,7 +376,7 @@ public void success(RefreshFirewallRsp ret) { if (!ret.isSuccess()) { logger.warn(String.format("failed to refresh firewall rules on appliance vm[uuid:%s, name:%s], %s", self.getUuid(), self.getName(), ret.getError())); - reply.setError(operr("operation error, because:%s", ret.getError())); + reply.setError(operr(ORG_ZSTACK_APPLIANCEVM_10007, "operation error, because:%s", ret.getError())); } bus.reply(msg, reply); diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmConnectFlow.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmConnectFlow.java index be67c45a9f2..e5d3e7fbdfb 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmConnectFlow.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmConnectFlow.java @@ -30,6 +30,7 @@ import static org.zstack.core.Platform.touterr; import static org.zstack.core.Platform.err; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -90,7 +91,7 @@ class Retry { private boolean countDown(String msg) { retry.value--; if (retry.value <= 0) { - ErrorCode toutErr = touterr("connecting appliance vm[uuid:%s, name:%s, ip:%s] timeout, unable to ssh in[%s]", spec.getVmInventory().getUuid(), spec.getVmInventory().getName(), mgmtIp, msg); + ErrorCode toutErr = touterr(ORG_ZSTACK_APPLIANCEVM_10003, "connecting appliance vm[uuid:%s, name:%s, ip:%s] timeout, unable to ssh in[%s]", spec.getVmInventory().getUuid(), spec.getVmInventory().getName(), mgmtIp, msg); logger.warn(toutErr.getDetails()); chain.fail(toutErr); return true; @@ -142,7 +143,7 @@ public boolean run() { } } catch (Throwable e1) { logger.warn(e1.getMessage(), e1); - ErrorCode err = e1 instanceof OperationFailureException ? ((OperationFailureException)e1).getErrorCode() : err(ApplianceVmErrors.UNABLE_TO_START, e1.getMessage()); + ErrorCode err = e1 instanceof OperationFailureException ? ((OperationFailureException)e1).getErrorCode() : err(ORG_ZSTACK_APPLIANCEVM_10004, ApplianceVmErrors.UNABLE_TO_START, e1.getMessage()); chain.fail(err); Thread.currentThread().interrupt(); return true; @@ -153,7 +154,7 @@ private void checkError() { SshResult ret = new Ssh().setHostname(mgmtIp).setUsername(username).setPrivateKey(privKey).setPort(sshPort) .command(String.format("if [ -f %s ]; then cat %s; exit 1; else exit 0; fi", ERROR_LOG_PATH, ERROR_LOG_PATH)).setTimeout(60).runAndClose(); if (ret.getReturnCode() != 0) { - throw new OperationFailureException(err(ApplianceVmErrors.UNABLE_TO_START, ret.getStdout())); + throw new OperationFailureException(err(ORG_ZSTACK_APPLIANCEVM_10005, ApplianceVmErrors.UNABLE_TO_START, ret.getStdout())); } } diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmDeployAgentFlow.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmDeployAgentFlow.java index 63e1b72f9d2..63ba7bdf8f4 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmDeployAgentFlow.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmDeployAgentFlow.java @@ -35,6 +35,7 @@ import java.util.Map; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -102,7 +103,7 @@ public void run(MessageReply reply) { ApplianceVmAsyncHttpCallReply ar = reply.castReply(); InitRsp rsp = ar.toResponse(InitRsp.class); if (!rsp.isSuccess()) { - trigger.fail(operr("operation error, because:%s", rsp.getError())); + trigger.fail(operr(ORG_ZSTACK_APPLIANCEVM_10001, "operation error, because:%s", rsp.getError())); return; } diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmKvmBootstrapFlow.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmKvmBootstrapFlow.java index 43f3cc2c047..95d94fbf012 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmKvmBootstrapFlow.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmKvmBootstrapFlow.java @@ -20,6 +20,7 @@ import static org.zstack.core.Platform.operr; import java.util.Map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -61,7 +62,7 @@ public void run(MessageReply reply) { if (rsp.isSuccess()) { chain.next(); } else { - chain.fail(operr("set appliance bootstrapinfo error, because:%s", rsp.getError())); + chain.fail(operr(ORG_ZSTACK_APPLIANCEVM_10000, "set appliance bootstrapinfo error, because:%s", rsp.getError())); } } } diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmManagementIpChecker.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmManagementIpChecker.java index 7767c8a7fa5..aaf9e7cb21f 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmManagementIpChecker.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmManagementIpChecker.java @@ -15,6 +15,7 @@ import org.zstack.utils.network.NetworkUtils; import static org.zstack.core.Platform.err; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -53,7 +54,7 @@ public VmNicInventory call(VmNicInventory arg) { ShellResult ret = ShellUtils.runAndReturn(String.format("ping -c 1 -W 1 %s", mgmtNic.getIp())); if (ret.isReturnCode(0) || NetworkUtils.isReachable(mgmtNic.getIp(), 1000)) { - throw new OperationFailureException(err(ApplianceVmErrors.MANAGEMENT_IP_OCCUPIED, + throw new OperationFailureException(err(ORG_ZSTACK_APPLIANCEVM_10002, ApplianceVmErrors.MANAGEMENT_IP_OCCUPIED, "the management nic IP[%s] has been occupied by another device in the data center, we can ping it", mgmtNic.getIp() )); } diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java index 4dca4465c33..fe0f69a848a 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java @@ -37,6 +37,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * @author Xingwei Yu @@ -223,7 +224,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply rep = reply.castReply(); final T rsp = rep.toResponse(respType); if (!rsp.success) { - completion.fail(operr("operation error, because:%s", rsp.error)); + completion.fail(operr(ORG_ZSTACK_CBD_KVM_10000, "operation error, because:%s", (String) rsp.error)); return; } completion.success(rsp); diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephApiInterceptor.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephApiInterceptor.java index 5c0ca0c39d5..7d334680e97 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephApiInterceptor.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephApiInterceptor.java @@ -29,6 +29,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 7/29/2015. @@ -79,7 +80,7 @@ private void validate(APIUpdateCephPrimaryStoragePoolMsg msg) { private void validate(APIAddCephPrimaryStoragePoolMsg msg) { if (!CharacterUtils.checkCharacter(msg.getPoolName())){ - throw new ApiMessageInterceptionException(argerr("operation failure, because the poolName[poolName:%s] can not include unprintable ascii characters.", msg.getPoolName())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_CEPH_10006, "operation failure, because the poolName[poolName:%s] can not include unprintable ascii characters.", msg.getPoolName())); } String duplicatePoolUuid = Q.New(CephPrimaryStoragePoolVO.class) @@ -89,12 +90,12 @@ private void validate(APIAddCephPrimaryStoragePoolMsg msg) { .select(CephPrimaryStoragePoolVO_.uuid).findValue(); if (duplicatePoolUuid != null && msg.isCreate()) { throw new ApiMessageInterceptionException(argerr( - "creation failure, duplicate poolName[%s]. There has been a pool[uuid:%s] with the same name existing.", + ORG_ZSTACK_STORAGE_CEPH_10007, "creation failure, duplicate poolName[%s]. There has been a pool[uuid:%s] with the same name existing.", msg.getPoolName(), duplicatePoolUuid)); } else if (duplicatePoolUuid != null && !msg.isCreate()) { throw new ApiMessageInterceptionException(argerr( - "Ceph pool[uuid:%s] with this name is already added into ZStack and used elsewhere, cannot reuse the ceph pool.", + ORG_ZSTACK_STORAGE_CEPH_10008, "Ceph pool[uuid:%s] with this name is already added into ZStack and used elsewhere, cannot reuse the ceph pool.", duplicatePoolUuid)); } @@ -121,7 +122,7 @@ public String call(String url) { q.add(CephPrimaryStorageMonVO_.hostname, Op.IN, hostnames); List existing = q.listValue(); if (!existing.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("cannot add ceph primary storage, there has been some ceph primary storage using mon[hostnames:%s]", existing)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_CEPH_10009, "cannot add ceph primary storage, there has been some ceph primary storage using mon[hostnames:%s]", existing)); } } @@ -132,7 +133,7 @@ private void distinctMons(List mons) { if (!monUrls.contains(uri.getHostname())) { monUrls.add(uri.getHostname()); } else { - throw new ApiMessageInterceptionException(argerr("Cannot add same host[%s] in mons", uri.getHostname())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_CEPH_10010, "Cannot add same host[%s] in mons", uri.getHostname())); } } } @@ -145,7 +146,7 @@ private void validate(APIAddMonToCephPrimaryStorageMsg msg) { .collect(Collectors.toList()); if (Q.New(CephPrimaryStorageMonVO.class).in(CephPrimaryStorageMonVO_.hostname, hostnames).isExists()){ - throw new ApiMessageInterceptionException(argerr("Adding the same Mon node is not allowed")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_CEPH_10011, "Adding the same Mon node is not allowed")); } } @@ -158,12 +159,12 @@ private void validate(APIAddMonToCephBackupStorageMsg msg) { .collect(Collectors.toList()); if (Q.New(CephBackupStorageMonVO.class).in(CephBackupStorageMonVO_.hostname, hostnames).isExists()){ - throw new ApiMessageInterceptionException(argerr("Adding the same Mon node is not allowed")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_CEPH_10012, "Adding the same Mon node is not allowed")); } } private void validate(APIUpdateCephBackupStorageMonMsg msg) { if (msg.getHostname() != null && !NetworkUtils.isIpv4Address(msg.getHostname()) && !NetworkUtils.isHostname(msg.getHostname())) { - throw new ApiMessageInterceptionException(argerr("hostname[%s] is neither an IPv4 address nor a valid hostname", msg.getHostname())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_CEPH_10013, "hostname[%s] is neither an IPv4 address nor a valid hostname", msg.getHostname())); } SimpleQuery q = dbf.createQuery(CephBackupStorageMonVO.class); q.select(CephBackupStorageMonVO_.backupStorageUuid); @@ -175,7 +176,7 @@ private void validate(APIUpdateCephBackupStorageMonMsg msg) { private void validate(APIUpdateCephPrimaryStorageMonMsg msg) { if (msg.getHostname() != null && !NetworkUtils.isIpv4Address(msg.getHostname()) && !NetworkUtils.isHostname(msg.getHostname())) { throw new ApiMessageInterceptionException(argerr( - String.format("hostname[%s] is neither an IPv4 address nor a valid hostname", msg.getHostname()) + ORG_ZSTACK_STORAGE_CEPH_10014, String.format("hostname[%s] is neither an IPv4 address nor a valid hostname", msg.getHostname()) )); } @@ -197,7 +198,7 @@ private void checkMonUrls(List monUrls) { throw new ApiMessageInterceptionException(ae.getErrorCode()); } catch (Exception e) { logger.warn(e.getMessage(), e); - throw new ApiMessageInterceptionException(argerr("invalid monUrl[%s]. A valid url is in format of %s", monUrl, MON_URL_FORMAT)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_CEPH_10015, "invalid monUrl[%s]. A valid url is in format of %s", monUrl, MON_URL_FORMAT)); } } } @@ -205,17 +206,17 @@ private void checkMonUrls(List monUrls) { private void validate(APIAddCephPrimaryStorageMsg msg) { if (msg.getDataVolumePoolName() != null && msg.getDataVolumePoolName().isEmpty()) { throw new ApiMessageInterceptionException(argerr( - "dataVolumePoolName can be null but cannot be an empty string" + ORG_ZSTACK_STORAGE_CEPH_10016, "dataVolumePoolName can be null but cannot be an empty string" )); } if (msg.getRootVolumePoolName() != null && msg.getRootVolumePoolName().isEmpty()) { throw new ApiMessageInterceptionException(argerr( - "rootVolumePoolName can be null but cannot be an empty string" + ORG_ZSTACK_STORAGE_CEPH_10017, "rootVolumePoolName can be null but cannot be an empty string" )); } if (msg.getImageCachePoolName() != null && msg.getImageCachePoolName().isEmpty()) { throw new ApiMessageInterceptionException(argerr( - "imageCachePoolName can be null but cannot be an empty string" + ORG_ZSTACK_STORAGE_CEPH_10018, "imageCachePoolName can be null but cannot be an empty string" )); } @@ -237,15 +238,15 @@ public String call(String url) { q.add(CephBackupStorageMonVO_.hostname, Op.IN, hostnames); List existing = q.listValue(); if (!existing.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("cannot add ceph backup storage, there has been some ceph backup storage using mon[hostnames:%s]", existing)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_CEPH_10019, "cannot add ceph backup storage, there has been some ceph backup storage using mon[hostnames:%s]", existing)); } } private void validate(APIAddCephBackupStorageMsg msg) { if (msg.getPoolName() != null && msg.getPoolName().isEmpty()) { - throw new ApiMessageInterceptionException(argerr("poolName can be null but cannot be an empty string")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_CEPH_10020, "poolName can be null but cannot be an empty string")); }else if(msg.isImportImages() && msg.getPoolName() == null){ - throw new ApiMessageInterceptionException(argerr("poolName is required when importImages is true")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_CEPH_10021, "poolName is required when importImages is true")); } checkMonUrls(msg.getMonUrls()); diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephMonBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephMonBase.java index dca3dce6f48..870d94bf79c 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephMonBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephMonBase.java @@ -17,6 +17,7 @@ import java.util.concurrent.TimeUnit; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 7/27/2015. @@ -52,7 +53,7 @@ protected void checkTools() { ssh.setHostname(self.getHostname()).setUsername(self.getSshUsername()).setPassword(self.getSshPassword()).setPort(self.getSshPort()) .checkTool("ceph", "rbd").setTimeout(60).runErrorByExceptionAndClose(); } catch (SshException e) { - throw new OperationFailureException(operr("The problem may be caused by an incorrect user name or password or SSH port or unstable network environment")); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_10022, "The problem may be caused by an incorrect user name or password or SSH port or unstable network environment")); } } @@ -63,7 +64,7 @@ protected void checkHealth() { ret = ssh.setHostname(self.getHostname()).setUsername(self.getSshUsername()).setPassword(self.getSshPassword()).setPort(self.getSshPort()) .shell("ceph health").setTimeout(60).runAndClose(); } catch (SshException e) { - throw new OperationFailureException(operr("The problem may be caused by an incorrect user name or password or SSH port or unstable network environment")); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_10023, "The problem may be caused by an incorrect user name or password or SSH port or unstable network environment")); } if(ret.getReturnCode() != 0){ @@ -138,7 +139,7 @@ public ErrorCode buildErrorCode() { if (success) { return null; } - return operr("operation error, because:%s", error); + return operr(ORG_ZSTACK_STORAGE_CEPH_10024, "operation error, because:%s", error); } } @@ -154,7 +155,7 @@ public void success(AgentResponse ret) { if (ret.isSuccess()) { completion.success(); } else { - completion.fail(Platform.operr("operation error, because:%s", ret.getError())); + completion.fail(Platform.operr(ORG_ZSTACK_STORAGE_CEPH_10025, "operation error, because:%s", ret.getError())); } } diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/MonUri.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/MonUri.java index b60166d657c..7a7fdad4d57 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/MonUri.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/MonUri.java @@ -13,6 +13,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 7/27/2015. @@ -56,27 +57,27 @@ public static String getQueryValue(URI uri, String name) { private static final String MON_URL_FORMAT = "sshUsername:sshPassword@hostname:[sshPort]/?[monPort=]"; private ErrorCode errorCode(String err) { - return argerr(err); + return argerr(ORG_ZSTACK_STORAGE_CEPH_10000, err); } public MonUri(String url) { try { int at = url.lastIndexOf("@"); if (at == -1) { - throw new OperationFailureException(operr("invalid monUrl[%s], the sshUsername:sshPassword part is invalid. A valid monUrl is" + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_10001, "invalid monUrl[%s], the sshUsername:sshPassword part is invalid. A valid monUrl is" + " in format of %s", url, MON_URL_FORMAT)); } String userInfo = url.substring(0, at); if (!userInfo.contains(":")) { - throw new OperationFailureException(operr("invalid monUrl[%s], the sshUsername:sshPassword part is invalid. A valid monUrl is" + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_10002, "invalid monUrl[%s], the sshUsername:sshPassword part is invalid. A valid monUrl is" + " in format of %s", url, MON_URL_FORMAT)); } String rest = url.substring(at+1); String[] ssh = userInfo.split(":", 2); if (ssh.length != 2 || ssh[0].isEmpty() || ssh[1].isEmpty()) { - throw new OperationFailureException(operr("invalid monUrl[%s]. SSH username and password must be separated by ':' and cannot be empty. A valid monUrl format is %s", url, MON_URL_FORMAT)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_10003, "invalid monUrl[%s]. SSH username and password must be separated by ':' and cannot be empty. A valid monUrl format is %s", url, MON_URL_FORMAT)); } sshUsername = ssh[0]; @@ -85,14 +86,14 @@ public MonUri(String url) { URI uri = new URI(String.format("ssh://%s", rest)); hostname = uri.getHost(); if (hostname == null) { - throw new OperationFailureException(operr("invalid monUrl[%s], hostname cannot be null. A valid monUrl is" + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_10004, "invalid monUrl[%s], hostname cannot be null. A valid monUrl is" + " in format of %s", url, MON_URL_FORMAT) ); } sshPort = uri.getPort() == -1 ? sshPort : uri.getPort(); if (sshPort < 1 || sshPort > 65535) { - throw new OperationFailureException(operr("invalid monUrl[%s], the ssh port is greater than 65535 or smaller than 1. A valid monUrl is" + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_10005, "invalid monUrl[%s], the ssh port is greater than 65535 or smaller than 1. A valid monUrl is" + " in format of %s", url, MON_URL_FORMAT) ); } diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/CephBackupStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/CephBackupStorageBase.java index 9dba4c22ad4..e4de089aaa0 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/CephBackupStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/CephBackupStorageBase.java @@ -64,6 +64,7 @@ import static org.zstack.header.storage.backup.BackupStorageConstant.IMPORT_IMAGES_FAKE_RESOURCE_UUID; import static org.zstack.header.storage.backup.BackupStorageConstant.RESTORE_IMAGES_BACKUP_STORAGE_METADATA_TO_DATABASE; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 7/27/2015. @@ -757,7 +758,7 @@ private List prepareMons() { mons.removeIf(it -> it.getSelf().getStatus() != MonStatus.Connected); if (mons.isEmpty()) { throw new OperationFailureException( - operr("all ceph mons are Disconnected in ceph backup storage[uuid:%s]", self.getUuid()) + operr(ORG_ZSTACK_STORAGE_CEPH_BACKUP_10000, "all ceph mons are Disconnected in ceph backup storage[uuid:%s]", self.getUuid()) ); } return mons; @@ -765,7 +766,7 @@ private List prepareMons() { private void doCall() { if (!it.hasNext()) { - callback.fail(operr("all monitors cannot execute http call[%s]", path)); + callback.fail(operr(ORG_ZSTACK_STORAGE_CEPH_BACKUP_10001, "all monitors cannot execute http call[%s]", path)); return; } @@ -864,7 +865,7 @@ protected void handle(final GetImageDownloadProgressMsg msg) { .find(); if (monvo == null) { r.setError(operr( - "CephMon[hostname:%s] not found on backup storage[uuid:%s]", + ORG_ZSTACK_STORAGE_CEPH_BACKUP_10002, "CephMon[hostname:%s] not found on backup storage[uuid:%s]", msg.getHostname(), msg.getBackupStorageUuid())); bus.reply(msg, r); return; @@ -1271,7 +1272,7 @@ class Connector { void connect(final FlowTrigger trigger) { if (!it.hasNext()) { if (errorCodes.getCauses().size() == mons.size()) { - trigger.fail(operr(errorCodes, "unable to connect to the ceph backup storage[uuid:%s], failed to connect all ceph monitors.", + trigger.fail(operr(ORG_ZSTACK_STORAGE_CEPH_BACKUP_10003, errorCodes, "unable to connect to the ceph backup storage[uuid:%s], failed to connect all ceph monitors.", self.getUuid())); } else { // reload because mon status changed @@ -1372,7 +1373,7 @@ public void done(ErrorCodeList errorCodeList) { sb.append(String.format("%s (mon ip) --> %s (fsid)\n", mon.getSelf().getHostname(), fsid)); } - throw new OperationFailureException(operr(sb.toString())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_BACKUP_10004, sb.toString())); } // check if there is another ceph setup having the same fsid @@ -1384,7 +1385,7 @@ public void done(ErrorCodeList errorCodeList) { CephBackupStorageVO otherCeph = q.find(); if (otherCeph != null) { throw new OperationFailureException( - operr("there is another CEPH backup storage[name:%s, uuid:%s] with the same" + + operr(ORG_ZSTACK_STORAGE_CEPH_BACKUP_10005, "there is another CEPH backup storage[name:%s, uuid:%s] with the same" + " FSID[%s], you cannot add the same CEPH setup as two different backup storage", otherCeph.getName(), otherCeph.getUuid(), fsId) ); @@ -1611,7 +1612,7 @@ public void success(PingResult res) { backupStorageDown(); } else if (!res.success || PingOperationFailure.MonAddrChanged.toString().equals(res.failure)) { // this mon is down(success == false), but the backup storage may still work as other mons may work - ErrorCode errorCode = operr("operation error, because:%s", res.error); + ErrorCode errorCode = operr(ORG_ZSTACK_STORAGE_CEPH_BACKUP_10006, "operation error, because:%s", res.error); thisMonIsDown(errorCode); } } @@ -1755,7 +1756,7 @@ protected void exportImage(ExportImageFromBackupStorageMsg msg) { .eq(ImageBackupStorageRefVO_.imageUuid, msg.getImageUuid()) .findTuple(); if (t == null) { - reply.setError(operr("image[uuid: %s] is not on backup storage[uuid:%s, name:%s]", + reply.setError(operr(ORG_ZSTACK_STORAGE_CEPH_BACKUP_10007, "image[uuid: %s] is not on backup storage[uuid:%s, name:%s]", msg.getImageUuid(), self.getUuid(), self.getName())); bus.reply(msg, reply); return; @@ -1897,7 +1898,7 @@ public CephBackupStorageMonBase call(CephBackupStorageMonVO arg) { @Override public void done() { if (!errorCodes.isEmpty()) { - trigger.fail(operr(new ErrorCodeList().causedBy(errorCodes), "unable to connect mons")); + trigger.fail(operr(ORG_ZSTACK_STORAGE_CEPH_BACKUP_10008, new ErrorCodeList().causedBy(errorCodes), "unable to connect mons")); } else { trigger.next(); } @@ -1940,7 +1941,7 @@ public CephBackupStorageMonBase call(CephBackupStorageMonVO arg) { public void done() { // one fail, all fail if (!errors.isEmpty()) { - trigger.fail(operr(new ErrorCodeList().causedBy(errors), "unable to add mon to ceph backup storage")); + trigger.fail(operr(ORG_ZSTACK_STORAGE_CEPH_BACKUP_10009, new ErrorCodeList().causedBy(errors), "unable to add mon to ceph backup storage")); } else { trigger.next(); } @@ -1956,7 +1957,7 @@ public void done() { public void success(GetFactsRsp rsp) { String fsid = rsp.fsid; if (!getSelf().getFsid().equals(fsid)) { - errors.add(operr("the mon[ip:%s] returns a fsid[%s] different from the current fsid[%s] of the cep cluster," + + errors.add(operr(ORG_ZSTACK_STORAGE_CEPH_BACKUP_10010, "the mon[ip:%s] returns a fsid[%s] different from the current fsid[%s] of the cep cluster," + "are you adding a mon not belonging to current cluster mistakenly?", base.getSelf().getHostname(), fsid, getSelf().getFsid())); } @@ -2045,7 +2046,7 @@ protected void handle(RestoreImagesBackupStorageMetadataToDatabaseMsg msg) { @Override protected void handle(CalculateImageHashOnBackupStorageMsg msg) { CalculateImageHashOnBackupStorageReply reply = new CalculateImageHashOnBackupStorageReply(); - reply.setError(operr("ceph backup storage do not support calculate image hash")); + reply.setError(operr(ORG_ZSTACK_STORAGE_CEPH_BACKUP_10011, "ceph backup storage do not support calculate image hash")); bus.reply(msg, reply); } diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/CephBackupStorageMonBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/CephBackupStorageMonBase.java index bcdb5453f3c..6bf2c810034 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/CephBackupStorageMonBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/CephBackupStorageMonBase.java @@ -39,6 +39,7 @@ import java.util.concurrent.TimeUnit; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 7/27/2015. @@ -101,7 +102,7 @@ public void changeStatus(MonStatus status) { self = dbf.reload(self); if (self == null) { throw new OperationFailureException( - operr("cannot update status of the ceph backup storage mon[uuid:%s], it has been deleted." + + operr(ORG_ZSTACK_STORAGE_CEPH_BACKUP_10012, "cannot update status of the ceph backup storage mon[uuid:%s], it has been deleted." + "This error can be ignored", uuid) ); } @@ -294,7 +295,7 @@ public void run(FlowTrigger trigger, Map data) { .setHostname(self.getHostname()) .setPort(self.getSshPort()).runErrorByExceptionAndClose(); } catch (SshException ex) { - throw new OperationFailureException(operr(ex.toString())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_BACKUP_10013, ex.toString())); } trigger.next(); @@ -376,7 +377,7 @@ public void fail(ErrorCode err) { @Override public void success(T ret) { if (!ret.isSuccess()) { - completion.fail(Platform.operr("operation error, because:%s", ret.getError())); + completion.fail(Platform.operr(ORG_ZSTACK_STORAGE_CEPH_BACKUP_10014, "operation error, because:%s", ret.getError())); return; } completion.success(ret); @@ -488,7 +489,7 @@ public void doPing(final ReturnValueCompletion completion) { q.add(CephBackupStorageVO_.uuid, Op.EQ, getSelf().getBackupStorageUuid()); String poolName = q.findValue(); if (poolName == null) { - completion.fail(operr("Ceph bs[uuid=%s] pool name not found", getSelf().getBackupStorageUuid())); + completion.fail(operr(ORG_ZSTACK_STORAGE_CEPH_BACKUP_10015, "Ceph bs[uuid=%s] pool name not found", getSelf().getBackupStorageUuid())); return; } diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeChainGC.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeChainGC.java index 4d09485cd95..d774cc2aff9 100644 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeChainGC.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeChainGC.java @@ -15,6 +15,7 @@ import org.zstack.utils.logging.CLogger; import java.util.List; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class CephDeleteVolumeChainGC extends TimeBasedGarbageCollector { @GC @@ -52,7 +53,7 @@ public void run(MessageReply reply) { } else { installPaths = r.getUndeletedInstallPaths(); updateContext(); - completion.fail(Platform.operr("delete volume chain error, continue to delete")); + completion.fail(Platform.operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10052, "delete volume chain error, continue to delete")); } } }); diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java index 00dcaebe022..d8349cd8f2a 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java @@ -98,6 +98,7 @@ import static org.zstack.core.progress.ProgressReportService.*; import static org.zstack.longjob.LongJobUtils.buildErrIfCanceled; import static org.zstack.utils.CollectionDSL.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 7/28/2015. @@ -453,7 +454,7 @@ public static class DeleteRsp extends AgentResponse { public boolean inUse; public ErrorCode buildErrorCode() { if (inUse) { - return Platform.err(VolumeErrors.VOLUME_IN_USE, getError()); + return Platform.err(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10000, VolumeErrors.VOLUME_IN_USE, getError()); } return super.buildErrorCode(); } @@ -1660,7 +1661,7 @@ public void checkParam() { String bsFsid = q.findValue(); if (!getSelf().getFsid().equals(bsFsid)) { throw new OperationFailureException(operr( - "the backup storage[uuid:%s, name:%s, fsid:%s] is not in the same ceph cluster" + + ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10001, "the backup storage[uuid:%s, name:%s, fsid:%s] is not in the same ceph cluster" + " with the primary storage[uuid:%s, name:%s, fsid:%s]", backupStorage.getUuid(), backupStorage.getName(), bsFsid, self.getUuid(), self.getName(), getSelf().getFsid()) ); @@ -1797,7 +1798,7 @@ private void cleanTrash(Long trashId, final ReturnValueCompletion(trashs).step((inv, coml) -> { String details = trash.makeSureInstallPathNotUsed(inv); if (details != null) { - results.add(new TrashCleanupResult(inv.getResourceUuid(), inv.getTrashId(), operr(details))); + results.add(new TrashCleanupResult(inv.getResourceUuid(), inv.getTrashId(), operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10003, details))); coml.done(); return; } @@ -2447,7 +2448,7 @@ public void fail(ErrorCode errorCode) { @Override public void done(ErrorCodeList errorCodeList) { if (!errorCodeList.getCauses().isEmpty()) { - trigger.fail(operr(String.format("failed to saveEncryptAfterCreateImageCache: %s", errorCodeList.getCauses().get(0)))); + trigger.fail(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10004, String.format("failed to saveEncryptAfterCreateImageCache: %s", errorCodeList.getCauses().get(0)))); return; } trigger.next(); @@ -2821,7 +2822,7 @@ private void checkCephFsId(String psUuid, String bsUuid) { DebugUtils.Assert(cephBS.getFsid() != null, String.format("fsid cannot be null in ceph bs:[%s]", bsUuid)); if (!cephPS.getFsid().equals(cephBS.getFsid())) { throw new OperationFailureException(operr( - "fsid is not same between ps[%s] and bs[%s], create template is forbidden.", psUuid, bsUuid)); + ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10005, "fsid is not same between ps[%s] and bs[%s], create template is forbidden.", psUuid, bsUuid)); } } } @@ -3546,7 +3547,7 @@ private List prepareMons() { mons.removeIf(it -> it.getStatus() != MonStatus.Connected); if (mons.isEmpty()) { throw new OperationFailureException(operr( - "all ceph mons of primary storage[uuid:%s] are not in Connected state", self.getUuid()) + ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10006, "all ceph mons of primary storage[uuid:%s] are not in Connected state", self.getUuid()) ); } @@ -3559,7 +3560,7 @@ private void prepareMonsIterator() { private void doCall() { if (!it.hasNext()) { - callback.fail(operr(errorCodes, "all monitors cannot execute http call[%s]", path) + callback.fail(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10007, errorCodes, "all monitors cannot execute http call[%s]", path) ); return; @@ -3625,10 +3626,10 @@ void connect(final FlowTrigger trigger) { if (!it.hasNext()) { if (errorCodes.getCauses().size() == mons.size()) { if (errorCodes.getCauses().isEmpty()) { - trigger.fail(operr("unable to connect to the ceph primary storage[uuid:%s]," + + trigger.fail(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10008, "unable to connect to the ceph primary storage[uuid:%s]," + " failed to connect all ceph monitors.", self.getUuid())); } else { - trigger.fail(operr(errorCodes, "unable to connect to the ceph primary storage[uuid:%s]," + + trigger.fail(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10009, errorCodes, "unable to connect to the ceph primary storage[uuid:%s]," + " failed to connect all ceph monitors.", self.getUuid())); } @@ -3641,7 +3642,7 @@ void connect(final FlowTrigger trigger) { dbf.removeCollection(getSelf().getMons(), CephPrimaryStorageMonVO.class); } } - trigger.fail(operr("ceph primary storage[uuid:%s] may have been deleted.", self.getUuid())); + trigger.fail(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10010, "ceph primary storage[uuid:%s] may have been deleted.", self.getUuid())); } else { self = vo; trigger.next(); @@ -3748,7 +3749,7 @@ public void done(ErrorCodeList errorCodeList) { sb.append(String.format("%s (mon ip) --> %s (fsid)\n", mon.getSelf().getHostname(), fsid)); } - throw new OperationFailureException(operr(sb.toString())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10011, sb.toString())); } // check if there is another ceph setup having the same fsid @@ -3760,7 +3761,7 @@ public void done(ErrorCodeList errorCodeList) { CephPrimaryStorageVO otherCeph = q.find(); if (otherCeph != null) { throw new OperationFailureException( - operr("there is another CEPH primary storage[name:%s, uuid:%s] with the same" + + operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10012, "there is another CEPH primary storage[name:%s, uuid:%s] with the same" + " FSID[%s], you cannot add the same CEPH setup as two different primary storage", otherCeph.getName(), otherCeph.getUuid(), fsId) ); @@ -4032,13 +4033,13 @@ public void success(PingResult res) { } else if (PingOperationFailure.UnableToCreateFile.toString().equals(res.failure)) { // as long as there is one mon saying the ceph not working, the primary storage goes down - ErrorCode err = operr("the ceph primary storage[uuid:%s, name:%s] is down, as one mon[uuid:%s] reports" + + ErrorCode err = operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10013, "the ceph primary storage[uuid:%s, name:%s] is down, as one mon[uuid:%s] reports" + " an operation failure[%s]", self.getUuid(), self.getName(), mon.getSelf().getUuid(), res.error); errors.add(err); primaryStorageDown(); } else if (!res.success || PingOperationFailure.MonAddrChanged.toString().equals(res.failure)) { // this mon is down(success == false, operationFailure == false), but the primary storage may still work as other mons may work - ErrorCode errorCode = operr("operation error, because:%s", res.error); + ErrorCode errorCode = operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10014, "operation error, because:%s", res.error); thisMonIsDown(errorCode); } else { throw new CloudRuntimeException("should not be here"); @@ -4332,7 +4333,7 @@ public void run(final FlowTrigger trigger, Map data) { @Override public void done() { if (!errorCodes.isEmpty()) { - trigger.fail(operr( new ErrorCodeList().causedBy(errorCodes), "unable to connect mons")); + trigger.fail(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10015, new ErrorCodeList().causedBy(errorCodes), "unable to connect mons")); } else { trigger.next(); } @@ -4371,7 +4372,7 @@ public void run(final FlowTrigger trigger, Map data) { public void done() { // one fail, all fail if (!errors.isEmpty()) { - trigger.fail(operr(new ErrorCodeList().causedBy(errors), "unable to add mon to ceph primary storage")); + trigger.fail(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10016, new ErrorCodeList().causedBy(errors), "unable to add mon to ceph primary storage")); } else { trigger.next(); } @@ -4387,7 +4388,7 @@ public void done() { public void success(GetFactsRsp rsp) { String fsid = rsp.fsid; if (!getSelf().getFsid().equals(fsid)) { - errors.add(operr("the mon[ip:%s] returns a fsid[%s] different from the current fsid[%s] of the cep cluster," + + errors.add(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10017, "the mon[ip:%s] returns a fsid[%s] different from the current fsid[%s] of the cep cluster," + "are you adding a mon not belonging to current cluster mistakenly?", base.getSelf().getHostname(), fsid, getSelf().getFsid()) ); } @@ -4572,7 +4573,7 @@ public void success(DownloadBitsFromKVMHostRsp returnValue) { reply.setFormat(returnValue.format); } else { logger.error(String.format("failed to download bits %s from kvm host %s to primary storage %s", cmd.getBackupStorageInstallPath(), msg.getSrcHostUuid(), msg.getPrimaryStorageUuid())); - reply.setError(Platform.operr("operation error, because:%s", returnValue.getError())); + reply.setError(Platform.operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10018, "operation error, because:%s", returnValue.getError())); } bus.reply(msg, reply); completion.done(); @@ -4613,7 +4614,7 @@ public void success(AgentResponse returnValue) { logger.info(String.format("successfully cancel downloaded bits to primary storage %s", msg.getPrimaryStorageUuid())); } else { logger.error(String.format("failed to cancel download bits to primary storage %s",msg.getPrimaryStorageUuid())); - reply.setError(Platform.operr("operation error, because:%s", returnValue.getError())); + reply.setError(Platform.operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10019, "operation error, because:%s", returnValue.getError())); } bus.reply(msg, reply); completion.done(); @@ -4642,7 +4643,7 @@ public void success(GetDownloadBitsFromKVMHostProgressRsp rsp) { reply.setTotalSize(rsp.totalSize); } else { logger.error(String.format("failed to get download progress from primary storage %s",msg.getPrimaryStorageUuid())); - reply.setError(Platform.operr("operation error, because:%s", rsp.getError())); + reply.setError(Platform.operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10020, "operation error, because:%s", rsp.getError())); } bus.reply(msg, reply); } @@ -4668,7 +4669,7 @@ private void handle(DownloadBitsFromNbdToPrimaryStorageMsg msg) { @Override public void success(DownloadBitsFromNbdRsp rsp) { if (!rsp.isSuccess()) { - reply.setError(operr("%s", rsp.getError())); + reply.setError(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10021, "%s", rsp.getError())); } else { reply.setDiskSize(rsp.diskSize); } @@ -4694,7 +4695,7 @@ private void handle(DownloadBitsFromRemoteTargetOnPrimaryStorageMsg msg) { @Override public void success(DownloadBitsFromRemoteTargetRsp rsp) { if (!rsp.isSuccess()) { - reply.setError(operr("%s", rsp.getError())); + reply.setError(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10022, "%s", rsp.getError())); } else { reply.setDiskSize(rsp.diskSize); } @@ -4732,7 +4733,7 @@ private void deleteImageCacheOnPrimaryStorage(DeleteImageCacheOnPrimaryStorageMs @Override public void success(AgentResponse rsp) { if (!rsp.isSuccess()) { - reply.setError(operr("operation error, because:%s", rsp.getError())); + reply.setError(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10023, "operation error, because:%s", rsp.getError())); } bus.reply(msg, reply); @@ -4769,7 +4770,7 @@ private void cancelSelfFencerOnKvmHost(CancelSelfFencerOnKvmHostMsg msg, final N CancelSelfFencerOnKvmHostReply reply = new CancelSelfFencerOnKvmHostReply(); new KvmCommandSender(param.getHostUuid()).send(cmd, KVM_HA_CANCEL_SELF_FENCER, wrapper -> { AgentResponse rsp = wrapper.getResponse(AgentResponse.class); - return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10024, "operation error, because:%s", rsp.getError()); }, new ReturnValueCompletion(msg) { @Override public void success(KvmResponseWrapper w) { @@ -4830,7 +4831,7 @@ public String call(CephPrimaryStorageMonVO arg) { @Override public ErrorCode getError(KvmResponseWrapper wrapper) { AgentResponse rsp = wrapper.getResponse(AgentResponse.class); - return rsp.isSuccess() ? null : operr("%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10025, "%s", rsp.getError()); } }, new ReturnValueCompletion(msg) { @Override @@ -5007,12 +5008,12 @@ public void run(MessageReply reply) { CheckHostStorageConnectionRsp rsp = kr.toResponse(CheckHostStorageConnectionRsp.class); if (rsp == null) { - wc.addError(operr("operation error, because: failed to get response")); + wc.addError(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10026, "operation error, because: failed to get response")); umsg.setStatus(PrimaryStorageHostStatus.Disconnected); } else { ErrorCode errorCode = rsp.buildErrorCode(); if (errorCode != null) { - wc.addError(operr("operation error, because:%s", errorCode)); + wc.addError(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10027, "operation error, because:%s", errorCode)); umsg.setStatus(PrimaryStorageHostStatus.Disconnected); } else { umsg.setStatus(PrimaryStorageHostStatus.Connected); @@ -5055,7 +5056,7 @@ public void fail(ErrorCode errorCode) { private void handle(BackupVolumeSnapshotFromPrimaryStorageToBackupStorageMsg msg) { BackupVolumeSnapshotFromPrimaryStorageToBackupStorageReply reply = new BackupVolumeSnapshotFromPrimaryStorageToBackupStorageReply(); - reply.setError(operr("backing up snapshots to backup storage is a depreciated feature, which will be removed in future version")); + reply.setError(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10028, "backing up snapshots to backup storage is a depreciated feature, which will be removed in future version")); bus.reply(msg, reply); } @@ -5270,7 +5271,7 @@ public void handle(ErrorCode errCode, Map data) { private ImageSpec makeImageSpec(VolumeInventory volume) { ImageVO image = dbf.findByUuid(volume.getRootImageUuid(), ImageVO.class); if (image == null) { - throw new OperationFailureException(operr("cannot reinit rootvolume [%s] because image [%s] has been deleted and imagecache cannot be found", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10029, "cannot reinit rootvolume [%s] because image [%s] has been deleted and imagecache cannot be found", volume.getUuid(), volume.getRootImageUuid())); } @@ -5297,7 +5298,7 @@ private ImageSpec makeImageSpec(VolumeInventory volume) { } else { return 1; } - })).orElseThrow(() -> new OperationFailureException(operr("cannot find backupstorage to download image [%s] " + + })).orElseThrow(() -> new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10030, "cannot find backupstorage to download image [%s] " + "to primarystorage [%s] due to lack of Ready and accessible image", volume.getRootImageUuid(), getSelf().getUuid()))); imageSpec.setSelectedBackupStorage(ref); @@ -5669,7 +5670,7 @@ public void run(List replies) { KVMHostAsyncHttpCallReply kr = r.castReply(); CreateKvmSecretRsp rsp = kr.toResponse(CreateKvmSecretRsp.class); if (!rsp.isSuccess()) { - completion.fail(operr("operation error, because:%s", rsp.getError())); + completion.fail(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10031, "operation error, because:%s", rsp.getError())); return; } } @@ -6164,12 +6165,12 @@ private static String getVolumePathFromSnapshot(String snapshotPath) { protected String getTargetPoolNameFromAllocatedUrl(String allocatedUrl) { if (allocatedUrl == null) { - throw new OperationFailureException(operr("allocated url not found")); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10032, "allocated url not found")); } if (!allocatedUrl.startsWith("ceph://")) { - throw new OperationFailureException(operr("invalid allocated url:%s", allocatedUrl)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10033, "invalid allocated url:%s", allocatedUrl)); } String path = allocatedUrl.replaceFirst("ceph://", ""); diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java index a3906011ef0..e9602e0159b 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java @@ -80,6 +80,7 @@ import static org.zstack.core.progress.ProgressReportService.markTaskStage; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 7/28/2015. @@ -334,7 +335,7 @@ public KvmCephIsoTO.MonInfo call(CephPrimaryStorageMonVO arg) { if (cto.getMonInfo().isEmpty()) { throw new OperationFailureException(operr( - "cannot find any Connected ceph mon for the primary storage[uuid:%s]", pri.getUuid() + ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10035, "cannot find any Connected ceph mon for the primary storage[uuid:%s]", pri.getUuid() )); } @@ -381,7 +382,7 @@ public KvmCephCdRomTO.MonInfo call(CephPrimaryStorageMonVO arg) { if (cto.getMonInfo().isEmpty()) { throw new OperationFailureException(operr( - "cannot find any Connected ceph mon for the primary storage[uuid:%s]", pri.getUuid() + ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10036, "cannot find any Connected ceph mon for the primary storage[uuid:%s]", pri.getUuid() )); } @@ -401,7 +402,7 @@ private VolumeTO convertVolumeToCephIfNeeded(VolumeInventory vol, VolumeTO to) { if (ts.isEmpty() || ts.stream().noneMatch(t -> t.get(2, MonStatus.class) == MonStatus.Connected)) { throw new OperationFailureException(operr( - "cannot find any Connected ceph mon for the primary storage[uuid:%s]", vol.getPrimaryStorageUuid()) + ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10037, "cannot find any Connected ceph mon for the primary storage[uuid:%s]", vol.getPrimaryStorageUuid()) ); } @@ -747,7 +748,7 @@ public void beforeTakeLiveSnapshotsOnVolumes(CreateVolumesSnapshotOverlayInnerMs flowData.put(VolumeSnapshotConstant.NEED_BLOCK_STREAM_ON_HYPERVISOR, false); flowData.put(VolumeSnapshotConstant.NEED_TAKE_SNAPSHOTS_ON_HYPERVISOR, false); } else if (msg.getConsistentType() != ConsistentType.None) { - completion.fail(operr("not support take volumes snapshots " + + completion.fail(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10038, "not support take volumes snapshots " + "on multiple ps when including ceph")); return; } @@ -842,7 +843,7 @@ private void settingRootVolume(CreateVmInstanceMsg msg) { String cephPoolName = SystemTagUtils.findTagValue(msg.getRootVolumeSystemTags(), CephSystemTags.USE_CEPH_ROOT_POOL, CephSystemTags.USE_CEPH_ROOT_POOL_TOKEN); String targetCephPoolName = primaryStorageAllocateConfig.getPoolNames().get(0); if (cephPoolName != null && !cephPoolName.equals(targetCephPoolName)) { - throw new OperationFailureException(operr("ceph pool conflict, the ceph pool specified by the instance offering is %s, and the ceph pool specified in the creation parameter is %s" + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10039, "ceph pool conflict, the ceph pool specified by the instance offering is %s, and the ceph pool specified in the creation parameter is %s" ,targetCephPoolName, cephPoolName)); } @@ -891,7 +892,7 @@ private void settingRootVolume(CreateVmInstanceMsg msg) { String cephPoolName = SystemTagUtils.findTagValue(msg.getRootVolumeSystemTags(), CephSystemTags.USE_CEPH_ROOT_POOL, CephSystemTags.USE_CEPH_ROOT_POOL_TOKEN); String targetCephPoolName = primaryStorageAllocateConfig.getPoolNames().get(0); if (cephPoolName != null && !cephPoolName.equals(targetCephPoolName)) { - throw new OperationFailureException(operr("ceph pool conflict, the ceph pool specified by the disk offering is %s, and the ceph pool specified in the creation parameter is %s" + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10040, "ceph pool conflict, the ceph pool specified by the disk offering is %s, and the ceph pool specified in the creation parameter is %s" ,targetCephPoolName, cephPoolName)); } @@ -968,7 +969,7 @@ public void preCreateVolume(VolumeCreateMessage msg) { String cephPoolName = SystemTagUtils.findTagValue(msg.getSystemTags(), CephSystemTags.USE_CEPH_ROOT_POOL, CephSystemTags.USE_CEPH_ROOT_POOL_TOKEN); String targetCephPoolName = primaryStorageAllocateConfig.getPoolNames().get(0); if (cephPoolName != null && !cephPoolName.equals(targetCephPoolName)) { - throw new OperationFailureException(operr("ceph pool conflict, the ceph pool specified by the disk offering is %s, and the ceph pool specified in the creation parameter is %s" + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10041, "ceph pool conflict, the ceph pool specified by the disk offering is %s, and the ceph pool specified in the creation parameter is %s" ,targetCephPoolName, cephPoolName)); } @@ -1221,7 +1222,7 @@ public void preInstantiateVmResource(VmInstanceSpec spec, Completion completion) @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { - completion.fail(operr("get rootVolume[%s] rbd image watchers fail, %s", + completion.fail(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10042, "get rootVolume[%s] rbd image watchers fail, %s", rootVolume.getInstallPath(), reply.getError().getDetails())); return; } @@ -1237,7 +1238,7 @@ public void run(MessageReply reply) { .eq(VolumeVO_.uuid, msg.getVolumeUuid()) .select(VolumeVO_.installPath) .findValue(); - completion.fail(operr("rootVolume[%s] is already in use(ceph rbd image[%s] already has watchers), in order to prevent brain splitting, Starting VM is prohibited.", + completion.fail(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10043, "rootVolume[%s] is already in use(ceph rbd image[%s] already has watchers), in order to prevent brain splitting, Starting VM is prohibited.", msg.getVolumeUuid(), installPath)); } }); @@ -1347,7 +1348,7 @@ private CephPrimaryStoragePoolVO getPoolFromPoolName(String poolName, String psU List poolVOS = q.list(); if (poolVOS.size() == 0) { - throw new OperationFailureException(operr("cannot find cephPrimaryStorage pool[poolName=%s]", poolName)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10044, "cannot find cephPrimaryStorage pool[poolName=%s]", poolName)); } return poolVOS.get(0); @@ -1357,7 +1358,7 @@ private void checkCephPoolCapacityForNewVolume(String poolName, long volumeSize, CephPrimaryStoragePoolVO poolVO = getPoolFromPoolName(poolName, psUuid, null); if (!new CephOsdGroupCapacityHelper(psUuid).checkVirtualSizeByRatio(poolVO.getUuid(), volumeSize)) { - throw new OperationFailureException(operr("cephPrimaryStorage pool[poolName=%s] available virtual capacity not enough for size %s", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10045, "cephPrimaryStorage pool[poolName=%s] available virtual capacity not enough for size %s", poolName, volumeSize)); } } @@ -1405,7 +1406,7 @@ private String getPreAllocatedInstallUrl(AllocatePrimaryStorageSpaceMsg msg, Str return makePreAllocatedInstallUrl(getImageCachePoolTargetPoolName(psUuid, msg.getSize())); } - throw new OperationFailureException(operr("cannot allocate pool for primaryStorage[%s], purpose: %s", psUuid, purpose)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10046, "cannot allocate pool for primaryStorage[%s], purpose: %s", psUuid, purpose)); } private String makePreAllocatedInstallUrl(String poolName) { diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageMonBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageMonBase.java index 2719c6cb77d..90b6220d53a 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageMonBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageMonBase.java @@ -37,6 +37,7 @@ import java.util.concurrent.TimeUnit; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 7/28/2015. @@ -98,7 +99,7 @@ public void changeStatus(MonStatus status) { self = dbf.reload(self); if (self == null) { throw new OperationFailureException(operr( - "cannot update status of the ceph primary storage mon[uuid:%s], it has been deleted." + + ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10047, "cannot update status of the ceph primary storage mon[uuid:%s], it has been deleted." + "This error can be ignored", uuid )); } @@ -296,7 +297,7 @@ public void run(FlowTrigger trigger, Map data) { .setHostname(self.getHostname()) .setPort(self.getSshPort()).runErrorByExceptionAndClose(); } catch (SshException ex) { - throw new OperationFailureException(operr(ex.toString())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10048, ex.toString())); } trigger.next(); @@ -379,7 +380,7 @@ public void fail(ErrorCode err) { @Override public void success(T ret) { if (!ret.isSuccess()) { - completion.fail(Platform.operr("operation error, because:%s", ret.getError())); + completion.fail(Platform.operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10049, "operation error, because:%s", ret.getError())); return; } completion.success(ret); @@ -497,7 +498,7 @@ private void doPing(final ReturnValueCompletion completion) { .limit(1) .findValue(); if (poolName == null) { - completion.fail(operr("Ceph ps[uuid=%s] root pool name not found", primaryStorageUuid)); + completion.fail(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10050, "Ceph ps[uuid=%s] root pool name not found", primaryStorageUuid)); return; } diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephRequiredUrlParser.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephRequiredUrlParser.java index d9b37f5cac5..aa87969fded 100644 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephRequiredUrlParser.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephRequiredUrlParser.java @@ -11,6 +11,7 @@ import java.util.HashMap; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * @ Author : yh.w @@ -29,7 +30,7 @@ public static InstallPath getInstallPathFromUri(String requiredUrl) { protocol = new URI(requiredUrl).getScheme(); } catch (URISyntaxException e) { throw new OperationFailureException( - argerr("invalid uri, correct example is ceph://$POOLNAME/$VOLUMEUUID or volume://$VOLUMEUUID")); + argerr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10051, "invalid uri, correct example is ceph://$POOLNAME/$VOLUMEUUID or volume://$VOLUMEUUID")); } return uriParsers.get(protocol).parseUri(requiredUrl); diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephSnapshotProtector.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephSnapshotProtector.java index c08a1528399..cdf9ed2cfe6 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephSnapshotProtector.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephSnapshotProtector.java @@ -11,6 +11,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.inerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class CephSnapshotProtector implements VolumeSnapshotDeletionProtector { @Override @@ -29,7 +30,7 @@ public void protect(VolumeSnapshotInventory snapshot, Completion completion) { } if (volUuids.stream().noneMatch(it -> snapshot.getPrimaryStorageInstallPath().contains(it)) && !VolumeSystemTags.FAST_REVERT.hasTag(snapshot.getVolumeUuid())) { - completion.fail(inerr("the snapshot[name:%s, uuid:%s, path: %s] seems not belong to the volume[uuid:%s]", + completion.fail(inerr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10034, "the snapshot[name:%s, uuid:%s, path: %s] seems not belong to the volume[uuid:%s]", snapshot.getName(), snapshot.getUuid(), snapshot.getPrimaryStorageInstallPath(), snapshot.getVolumeUuid())); return; } diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/capacity/CephOsdGroupCapacityHelper.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/capacity/CephOsdGroupCapacityHelper.java index 1ca0a262c1d..e39514e4ad7 100644 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/capacity/CephOsdGroupCapacityHelper.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/capacity/CephOsdGroupCapacityHelper.java @@ -38,6 +38,7 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * @ Author : yh.w @@ -173,7 +174,7 @@ private long _reserve(String installPath, long size) { CephOsdGroupVO osdGroupVO = dbf.findByUuid(pool.getOsdGroup().getUuid(), CephOsdGroupVO.class); long originAvailableCapacity = osdGroupVO.getAvailableCapacity(); if (originAvailableCapacity < size) { - throw new OperationFailureException(operr("required ceph pool[uuid:%s] cannot satisfy conditions [availableSize > %s bytes], " + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10000, "required ceph pool[uuid:%s] cannot satisfy conditions [availableSize > %s bytes], " + "current available size %s", poolUuid, size, originAvailableCapacity)); } @@ -201,7 +202,7 @@ public void recalculateAvailableCapacity() { public boolean checkVirtualSizeByRatio(String poolUuid, long requiredSize) { CephPrimaryStoragePoolVO pool = dbf.findByUuid(poolUuid, CephPrimaryStoragePoolVO.class); if (pool.getOsdGroup() == null) { - throw new OperationFailureException(operr("cannot find ceph pool [%s] related osdgroup", poolUuid)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10001, "cannot find ceph pool [%s] related osdgroup", poolUuid)); } CephOsdGroupVO osdGroupVO = dbf.findByUuid(pool.getOsdGroup().getUuid(), CephOsdGroupVO.class); diff --git a/plugin/directory/src/main/java/org/zstack/directory/DirectoryApiInterceptor.java b/plugin/directory/src/main/java/org/zstack/directory/DirectoryApiInterceptor.java index e9749deb12a..43cddd3514f 100644 --- a/plugin/directory/src/main/java/org/zstack/directory/DirectoryApiInterceptor.java +++ b/plugin/directory/src/main/java/org/zstack/directory/DirectoryApiInterceptor.java @@ -20,6 +20,7 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * @author shenjin @@ -102,21 +103,21 @@ private void validate(APIAddResourcesToDirectoryMsg msg) { List resources = Q.New(ResourceDirectoryRefVO.class).in(ResourceDirectoryRefVO_.resourceUuid, resourceUuids).list(); if (!resources.isEmpty()) { List list = resources.stream().map(ResourceDirectoryRefVO::getResourceUuid).collect(Collectors.toList()); - throw new ApiMessageInterceptionException(argerr("resources %s has already been bound to directory uuid[%s] , multiple paths are not supported", list, msg.getDirectoryUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_DIRECTORY_10000, "resources %s has already been bound to directory uuid[%s] , multiple paths are not supported", list, msg.getDirectoryUuid())); } } private void checkType(List types) { if (!ALLOW_RESOURCE_TYPES.containsAll(types)) { List list = types.stream().filter(s -> !ALLOW_RESOURCE_TYPES.contains(s)).collect(Collectors.toList()); - throw new ApiMessageInterceptionException(argerr("resource types %s are not supported by directory, allowed types are %s", list, ALLOW_RESOURCE_TYPES)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_DIRECTORY_10001, "resource types %s are not supported by directory, allowed types are %s", list, ALLOW_RESOURCE_TYPES)); } } private void validate(APIUpdateDirectoryMsg msg) { boolean result = CharacterUtils.checkCharactersByRegex(regex, msg.getName()); if (!result) { - throw new ApiMessageInterceptionException(argerr("name contains unsupported characters," + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_DIRECTORY_10002, "name contains unsupported characters," + " name can only contain Chinese characters, English letters, " + "numbers, spaces, and the following characters: ()()【】@._-+ ")); } @@ -126,7 +127,7 @@ private void validate(APICreateDirectoryMsg msg) { //judge whether special characters are included boolean result = CharacterUtils.checkCharactersByRegex(regex, msg.getName()); if (!result) { - throw new ApiMessageInterceptionException(argerr("name contains unsupported characters," + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_DIRECTORY_10003, "name contains unsupported characters," + " name can only contain Chinese characters, English letters, " + "numbers, spaces, and the following characters: ()()【】@._-+ ")); } diff --git a/plugin/directory/src/main/java/org/zstack/directory/DirectoryBase.java b/plugin/directory/src/main/java/org/zstack/directory/DirectoryBase.java index 02ff0f69ec9..26147f224e9 100644 --- a/plugin/directory/src/main/java/org/zstack/directory/DirectoryBase.java +++ b/plugin/directory/src/main/java/org/zstack/directory/DirectoryBase.java @@ -26,6 +26,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * @author shenjin @@ -271,7 +272,7 @@ private void updateDirectory(APIUpdateDirectoryMsg msg, APIUpdateDirectoryEvent .filter(s -> s.getName().equals(msg.getName()) && s.getType().equals(vo.getType())) .collect(Collectors.toList()); if (!list.isEmpty()) { - completion.fail(operr("duplicate directory name, directory[uuid: %s] with name %s already exists", list.get(0).getUuid(), msg.getName())); + completion.fail(operr(ORG_ZSTACK_DIRECTORY_10005, "duplicate directory name, directory[uuid: %s] with name %s already exists", list.get(0).getUuid(), msg.getName())); return; } updateGroupName(msg, vo); @@ -353,7 +354,7 @@ private void moveDirectory(APIMoveDirectoryMsg msg, Completion completion) { findSubUuids(uuids, list); } if (list.contains(msg.getTargetParentUuid())) { - completion.fail(operr("circular dependency detected, directory %s and directory %s will cause circular dependency", msg.getDirectoryUuid(), msg.getTargetParentUuid())); + completion.fail(operr(ORG_ZSTACK_DIRECTORY_10006, "circular dependency detected, directory %s and directory %s will cause circular dependency", msg.getDirectoryUuid(), msg.getTargetParentUuid())); return; } vo.setParentUuid(msg.getTargetParentUuid()); diff --git a/plugin/directory/src/main/java/org/zstack/directory/DirectoryManagerImpl.java b/plugin/directory/src/main/java/org/zstack/directory/DirectoryManagerImpl.java index 9901798bcab..b6ec6bee8e9 100644 --- a/plugin/directory/src/main/java/org/zstack/directory/DirectoryManagerImpl.java +++ b/plugin/directory/src/main/java/org/zstack/directory/DirectoryManagerImpl.java @@ -30,6 +30,7 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.err; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * @author shenjin @@ -76,7 +77,7 @@ private void handleApiMessage(APIMessage msg) { private void passThrough(DirectoryMessage msg) { DirectoryVO vo = dbf.findByUuid(msg.getDirectoryUuid(), DirectoryVO.class); if (vo == null) { - bus.replyErrorByMessageType((Message) msg, err(SysErrors.RESOURCE_NOT_FOUND, "unable to find directory[uuid=%s]", msg.getDirectoryUuid())); + bus.replyErrorByMessageType((Message) msg, err(ORG_ZSTACK_DIRECTORY_10007, SysErrors.RESOURCE_NOT_FOUND, "unable to find directory[uuid=%s]", msg.getDirectoryUuid())); return; } @@ -144,18 +145,18 @@ private void createDirectory(APICreateDirectoryMsg msg, APICreateDirectoryEvent .filter(s -> s.getName().equals(name) && s.getType().equals(msg.getType())) .collect(Collectors.toList()); if (!list.isEmpty()) { - completion.fail(operr("duplicate directory name, directory[uuid: %s] with name %s already exists", list.get(0).getUuid(), msg.getName())); + completion.fail(operr(ORG_ZSTACK_DIRECTORY_10008, "duplicate directory name, directory[uuid: %s] with name %s already exists", list.get(0).getUuid(), msg.getName())); return; } //judge whether the maximum level is exceeded String[] split = vo.getGroupName().split("/"); // the directory cannot exceed 4 floors (contains the default directory) if(split.length > 3) { - completion.fail(operr("fail to create directory, directories are up to four levels")); + completion.fail(operr(ORG_ZSTACK_DIRECTORY_10009, "fail to create directory, directories are up to four levels")); return; } if (!DIRECTORY_TYPES.contains(msg.getType())) { - completion.fail(operr("the type of directory %s is not supported, the supported directory types are %s", msg.getType(), DIRECTORY_TYPES)); + completion.fail(operr(ORG_ZSTACK_DIRECTORY_10010, "the type of directory %s is not supported, the supported directory types are %s", msg.getType(), DIRECTORY_TYPES)); return; } vo.setType(msg.getType()); diff --git a/plugin/directory/src/main/java/org/zstack/directory/VmDirectoryChecker.java b/plugin/directory/src/main/java/org/zstack/directory/VmDirectoryChecker.java index 6b017522d9d..b16f9651024 100644 --- a/plugin/directory/src/main/java/org/zstack/directory/VmDirectoryChecker.java +++ b/plugin/directory/src/main/java/org/zstack/directory/VmDirectoryChecker.java @@ -8,6 +8,7 @@ import java.util.List; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * @author shenjin @@ -24,7 +25,7 @@ public ErrorCode check(String directoryUuid, List resourceUuids) { if(zoneUuids.stream().allMatch(s -> s.equals(vo.getZoneUuid()))) { return null; } else { - return argerr("all resources zoneUuid must be consistent with the directory zoneUuid[%s]", vo.getZoneUuid()); + return argerr(ORG_ZSTACK_DIRECTORY_10004, "all resources zoneUuid must be consistent with the directory zoneUuid[%s]", vo.getZoneUuid()); } } diff --git a/plugin/eip/src/main/java/org/zstack/network/service/eip/EipApiInterceptor.java b/plugin/eip/src/main/java/org/zstack/network/service/eip/EipApiInterceptor.java index 9fc0614c5d0..85e9a357a06 100755 --- a/plugin/eip/src/main/java/org/zstack/network/service/eip/EipApiInterceptor.java +++ b/plugin/eip/src/main/java/org/zstack/network/service/eip/EipApiInterceptor.java @@ -41,6 +41,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -85,19 +86,19 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti private void validate(APIGetVmNicAttachableEipsMsg msg){ String vmInstanceUuid = Q.New(VmNicVO.class).select(VmNicVO_.vmInstanceUuid).eq(VmNicVO_.uuid,msg.getVmNicUuid()).findValue(); if (vmInstanceUuid == null) { - throw new ApiMessageInterceptionException(operr("vmNic[uuid:%s] is not attached to vmInstance, cannot get attachable eips", msg.getVmNicUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10004, "vmNic[uuid:%s] is not attached to vmInstance, cannot get attachable eips", msg.getVmNicUuid())); } } private void validate(APIGetEipAttachableVmNicsMsg msg) { if (msg.getVipUuid() == null && msg.getEipUuid() == null) { - throw new ApiMessageInterceptionException(argerr("either eipUuid or vipUuid must be set")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10005, "either eipUuid or vipUuid must be set")); } if (msg.getEipUuid() != null) { EipState state = Q.New(EipVO.class).select(EipVO_.state).eq(EipVO_.uuid,msg.getEipUuid()).findValue(); if (state != EipState.Enabled) { - throw new ApiMessageInterceptionException(operr("eip[uuid:%s] is not in state of Enabled, cannot get attachable vm nic", msg.getEipUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10006, "eip[uuid:%s] is not in state of Enabled, cannot get attachable vm nic", msg.getEipUuid())); } } @@ -125,7 +126,7 @@ private void validateEipGuestIpUuid(String vmNicUuid, String guestIpUuid){ } } if (!found) { - throw new ApiMessageInterceptionException(argerr("ip [uuid:%s] is attached to vm nic [%s]", guestIpUuid, vmNicUuid)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10007, "ip [uuid:%s] is attached to vm nic [%s]", guestIpUuid, vmNicUuid)); } } @@ -136,13 +137,13 @@ private void validate(final APIAttachEipMsg msg) { Tuple t = q.findTuple(); String vmNicUuid = t.get(1, String.class); if (vmNicUuid != null) { - throw new ApiMessageInterceptionException(operr("eip[uuid:%s] has attached to another vm nic[uuid:%s], can't attach again", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10008, "eip[uuid:%s] has attached to another vm nic[uuid:%s], can't attach again", msg.getEipUuid(), vmNicUuid)); } EipState state = t.get(0, EipState.class); if (state != EipState.Enabled) { - throw new ApiMessageInterceptionException(operr("eip[uuid: %s] can only be attached when state is %s, current state is %s", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10009, "eip[uuid: %s] can only be attached when state is %s, current state is %s", msg.getEipUuid(), EipState.Enabled, state)); } @@ -165,7 +166,7 @@ public VipVO call() { UsedIpVO usedIp = nic.getUsedIps().stream() .filter(usedIpVO -> usedIpVO.getIpVersion().equals(NetworkUtils.getIpversion(vip.getIp()))) .findFirst() - .orElseThrow(() -> new ApiMessageInterceptionException(argerr("vm nic[uuid:%s] does not have a compatible usedIp for eip[uuid:%s]", + .orElseThrow(() -> new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10010, "vm nic[uuid:%s] does not have a compatible usedIp for eip[uuid:%s]", msg.getVmNicUuid(), msg.getEipUuid()))); msg.setUsedIpUuid(usedIp.getUuid()); } else { @@ -177,7 +178,7 @@ public VipVO call() { VmNicVO nic = dbf.findByUuid(msg.getVmNicUuid(), VmNicVO.class); if (VmNicHelper.getL3Uuids(nic).contains(vip.getL3NetworkUuid())){ - throw new ApiMessageInterceptionException(argerr("guest l3Network of vm nic[uuid:%s] and vip l3Network of EIP[uuid:%s] are the same network", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10011, "guest l3Network of vm nic[uuid:%s] and vip l3Network of EIP[uuid:%s] are the same network", msg.getVmNicUuid(), msg.getEipUuid())); } @@ -196,7 +197,7 @@ public VipVO call() { } } if (!found) { - throw new ApiMessageInterceptionException(argerr("Ip address [uuid:%s] is not belonged to nic [uuid:%s]", msg.getEipUuid(), msg.getVmNicUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10012, "Ip address [uuid:%s] is not belonged to nic [uuid:%s]", msg.getEipUuid(), msg.getVmNicUuid())); } } else { msg.setUsedIpUuid(nic.getUsedIpUuid()); @@ -209,7 +210,7 @@ private void validate(APIDetachEipMsg msg) { q.add(EipVO_.uuid, Op.EQ, msg.getUuid()); String vmNicUuid = q.findValue(); if (vmNicUuid == null) { - throw new ApiMessageInterceptionException(operr("eip[uuid:%s] has not attached to any vm nic", msg.getUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10013, "eip[uuid:%s] has not attached to any vm nic", msg.getUuid())); } msg.vmNicUuid = vmNicUuid; @@ -230,7 +231,7 @@ private void isVipInVmNicSubnet(String vipUuid, String guestIpUuid) { UsedIpVO guestIp = dbf.findByUuid(guestIpUuid, UsedIpVO.class); if (!vipIp.getIpVersion().equals(guestIp.getIpVersion())) { - throw new ApiMessageInterceptionException(operr("vip ipVersion [%d] is different from guestIp ipVersion [%d].", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10014, "vip ipVersion [%d] is different from guestIp ipVersion [%d].", vipIp.getIpVersion(), guestIp.getIpVersion())); } @@ -239,12 +240,12 @@ private void isVipInVmNicSubnet(String vipUuid, String guestIpUuid) { if (vipIp.getIpVersion() == IPv6Constants.IPv4) { SubnetUtils guestSub = new SubnetUtils(guestRange.getGateway(), guestRange.getNetmask()); if (guestSub.getInfo().isInRange(vipIp.getIp())) { - throw new ApiMessageInterceptionException(operr("Vip[%s] is in the guest ip range [%s, %s]", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10015, "Vip[%s] is in the guest ip range [%s, %s]", vipIp.getIp(), guestRange.getStartIp(), guestRange.getEndIp())); } } else { if (IPv6NetworkUtils.isIpv6InCidrRange(vipIp.getIp(), guestRange.getNetworkCidr())){ - throw new ApiMessageInterceptionException(operr("Vip[%s] is in the guest ip range [%s, %s]", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10016, "Vip[%s] is in the guest ip range [%s, %s]", vipIp.getIp(), guestRange.getStartIp(), guestRange.getEndIp())); } } @@ -260,7 +261,7 @@ private void checkIfVmAlreadyHasVipNetwork(String vmUuid, VipVO vip) { q.setParameter("vipL3Uuid", vip.getL3NetworkUuid()); Long c = q.getSingleResult(); if (c > 0) { - throw new ApiMessageInterceptionException(argerr("the vm[uuid:%s] that the EIP is about to attach is already on the public network[uuid:%s] from which" + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10017, "the vm[uuid:%s] that the EIP is about to attach is already on the public network[uuid:%s] from which" + " the vip[uuid:%s, name:%s, ip:%s] comes", vmUuid, vip.getL3NetworkUuid(), vip.getUuid(), vip.getName(), vip.getIp())); } } @@ -271,16 +272,16 @@ private void validate(APICreateEipMsg msg) { if(useFor != null && !useFor.isEmpty()){ VipUseForList useForList = new VipUseForList(useFor); if(!useForList.validateNewAdded(EipConstant.EIP_NETWORK_SERVICE_TYPE)) { - throw new ApiMessageInterceptionException(operr("vip[uuid:%s] has been occupied other network service entity[%s]", msg.getVipUuid(), useForList.toString())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10018, "vip[uuid:%s] has been occupied other network service entity[%s]", msg.getVipUuid(), useForList.toString())); } } if (vip.isSystem()) { - throw new ApiMessageInterceptionException(operr("eip can not be created on system vip")); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10019, "eip can not be created on system vip")); } if (vip.getState() != VipState.Enabled) { - throw new ApiMessageInterceptionException(operr("vip[uuid:%s] is not in state[%s], current state is %s", msg.getVipUuid(), VipState.Enabled, vip.getState())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10020, "vip[uuid:%s] is not in state[%s], current state is %s", msg.getVipUuid(), VipState.Enabled, vip.getState())); } if (msg.getVmNicUuid() != null) { @@ -288,7 +289,7 @@ private void validate(APICreateEipMsg msg) { nicq.add(VmNicVO_.uuid, Op.EQ, msg.getVmNicUuid()); VmNicVO nic = nicq.find(); if (VmNicHelper.getL3Uuids(nic).contains(vip.getL3NetworkUuid())) { - throw new ApiMessageInterceptionException(argerr("guest l3Network of vm nic[uuid:%s] and vip l3Network of vip[uuid: %s] are the same network", msg.getVmNicUuid(), msg.getVipUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10021, "guest l3Network of vm nic[uuid:%s] and vip l3Network of vip[uuid: %s] are the same network", msg.getVmNicUuid(), msg.getVipUuid())); } if (msg.getUsedIpUuid() == null) { @@ -318,7 +319,7 @@ private void checkVmState(String vmNicUuid){ .param("vmNicUuid", vmNicUuid).find(); if (state != null && !EipConstant.attachableVmStates.contains(state)){ throw new ApiMessageInterceptionException(operr( - "vm state[%s] is not allowed to operate eip, maybe you should wait the vm process complete", + ORG_ZSTACK_NETWORK_SERVICE_EIP_10022, "vm state[%s] is not allowed to operate eip, maybe you should wait the vm process complete", state.toString())); } } @@ -332,7 +333,7 @@ private void checkNicRule(String vmNicUuid){ if (!cidrs.isEmpty()) { throw new ApiMessageInterceptionException(operr( - "vmNic uuid[%s] is not allowed add eip, because vmNic exist portForwarding with allowedCidr rule", + ORG_ZSTACK_NETWORK_SERVICE_EIP_10023, "vmNic uuid[%s] is not allowed add eip, because vmNic exist portForwarding with allowedCidr rule", vmNicUuid)); } } diff --git a/plugin/eip/src/main/java/org/zstack/network/service/eip/EipManagerImpl.java b/plugin/eip/src/main/java/org/zstack/network/service/eip/EipManagerImpl.java index a44fc71f75a..8e23e2a9175 100755 --- a/plugin/eip/src/main/java/org/zstack/network/service/eip/EipManagerImpl.java +++ b/plugin/eip/src/main/java/org/zstack/network/service/eip/EipManagerImpl.java @@ -53,6 +53,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -1171,7 +1172,7 @@ public String getSyncSignature() { @Override public void run(SyncTaskChain chain) { if (!dbf.isExist(struct.getEip().getUuid(), EipVO.class)) { - completion.fail(operr("eip [uuid:%s] is deleted", struct.getEip().getUuid())); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10000, "eip [uuid:%s] is deleted", struct.getEip().getUuid())); chain.next(); return; } @@ -1319,7 +1320,7 @@ private void doAttachEip(final EipStruct struct, final String providerType, fina if (guestIp == null) { /* fix http://jira.zstack.io/browse/ZSTAC-16343 */ List nicIps = nic.getUsedIps().stream().map(UsedIpInventory::getIp).collect(Collectors.toList()); - completion.fail(operr("cannot find Eip guest ip: %s in vmNic ips :%s", eip.getGuestIp(), nicIps)); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10001, "cannot find Eip guest ip: %s in vmNic ips :%s", eip.getGuestIp(), nicIps)); return; } @@ -1466,7 +1467,7 @@ public String getSyncSignature() { @Override public void run(SyncTaskChain chain) { if (!dbf.isExist(struct.getEip().getUuid(), EipVO.class)) { - completion.fail(operr("eip [uuid:%s] is deleted", struct.getEip().getUuid())); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10002, "eip [uuid:%s] is deleted", struct.getEip().getUuid())); chain.next(); return; } @@ -1625,7 +1626,7 @@ public void run() { q.setParameter("nicUuids", nicUuids); Long count = q.getSingleResult(); if (count > 0) { - throw new OperationFailureException(operr("unable to attach the L3 network[uuid:%s, name:%s] to the vm[uuid:%s, name:%s]," + + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_EIP_10003, "unable to attach the L3 network[uuid:%s, name:%s] to the vm[uuid:%s, name:%s]," + " because the L3 network is providing EIP to one of the vm's nic", l3.getUuid(), l3.getName(), vm.getUuid(), vm.getName())); } diff --git a/plugin/expon/src/main/java/org/zstack/expon/ExponApiHelper.java b/plugin/expon/src/main/java/org/zstack/expon/ExponApiHelper.java index a75fb54f7fc..0bf3df33f8d 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/ExponApiHelper.java +++ b/plugin/expon/src/main/java/org/zstack/expon/ExponApiHelper.java @@ -39,6 +39,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class ExponApiHelper implements SingleFlightExecutor { @@ -152,7 +153,7 @@ public void call(ExponRequest req, Completion completi } if (!result.error.sessionExpired()) { - completion.fail(operr("expon request failed, code %s, message: %s.", result.error.getRetCode(), result.error.getMessage())); + completion.fail(operr(ORG_ZSTACK_EXPON_10000, "expon request failed, code %s, message: %s.", result.error.getRetCode(), result.error.getMessage())); return; } @@ -160,7 +161,7 @@ public void call(ExponRequest req, Completion completi req.setSessionId(sessionId); client.call(req, retryRes -> { if (retryRes.error != null) { - completion.fail(operr("expon request failed, code %s, message: %s.", retryRes.error.getRetCode(), retryRes.error.getMessage())); + completion.fail(operr(ORG_ZSTACK_EXPON_10001, "expon request failed, code %s, message: %s.", retryRes.error.getRetCode(), retryRes.error.getMessage())); return; } @@ -171,7 +172,7 @@ public void call(ExponRequest req, Completion completi public void errorOut(ExponResponse rsp) { if (!rsp.isSuccess()) { - throw new OperationFailureException(operr("expon request failed, code %s, message: %s.", rsp.getRetCode(), rsp.getMessage())); + throw new OperationFailureException(operr(ORG_ZSTACK_EXPON_10002, "expon request failed, code %s, message: %s.", rsp.getRetCode(), rsp.getMessage())); } } @@ -367,7 +368,7 @@ public void copySnapshot(String snapId, String poolId, String name, ExponVolumeQ public void success() { VolumeModule vol = queryVolume(name); if (vol == null) { - completion.fail(operr("cannot find volume[name:%s] after copy snapshot", name)); + completion.fail(operr(ORG_ZSTACK_EXPON_10003, "cannot find volume[name:%s] after copy snapshot", name)); return; } diff --git a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java index 616206b9d32..43b2aad3e3f 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java +++ b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java @@ -65,6 +65,7 @@ import static org.zstack.expon.ExponNameHelper.*; import static org.zstack.iscsi.IscsiUtils.getHostMnIpFromInitiatorName; import static org.zstack.storage.addon.primary.ExternalPrimaryStorageNameHelper.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class ExponStorageController implements PrimaryStorageControllerSvc, PrimaryStorageNodeSvc { @@ -181,7 +182,7 @@ public void activate(BaseVolumeInfo v, HostInventory h, boolean shareable, Retur return; } - comp.fail(operr("not supported protocol[%s]", v.getProtocol())); + comp.fail(operr(ORG_ZSTACK_EXPON_10004, "not supported protocol[%s]", v.getProtocol())); } @@ -464,7 +465,7 @@ public String getActivePath(BaseVolumeInfo v, HostInventory h, boolean shareable return target.getResourceURI(); } - throw new OperationFailureException(operr("not supported protocol[%s]", v.getProtocol())); + throw new OperationFailureException(operr(ORG_ZSTACK_EXPON_10005, "not supported protocol[%s]", v.getProtocol())); } @Override @@ -542,7 +543,7 @@ public List getActiveClients(String installPath, String prot return c; }).collect(Collectors.toList()); } else { - throw new OperationFailureException(operr("not supported protocol[%s] for active", protocol)); + throw new OperationFailureException(operr(ORG_ZSTACK_EXPON_10006, "not supported protocol[%s] for active", protocol)); } } @@ -579,7 +580,7 @@ public void deactivate(String installPath, String protocol, HostInventory h, Com return; } - comp.fail(operr("not supported protocol[%s] for deactivate", protocol)); + comp.fail(operr(ORG_ZSTACK_EXPON_10007, "not supported protocol[%s] for deactivate", protocol)); } @Override @@ -851,7 +852,7 @@ public void connect(String config, String url, ReturnValueCompletion List pools = apiHelper.queryPools(); if (CollectionUtils.isEmpty(pools)) { - comp.fail(operr("no pool found")); + comp.fail(operr(ORG_ZSTACK_EXPON_10008, "no pool found")); return; } @@ -1032,7 +1033,7 @@ public String allocateSpace(AllocateSpaceSpec aspec) { // TODO allocate pool FailureDomainModule pool = allocateFreePool(aspec.getSize()); if (pool == null) { - throw new OperationFailureException(operr("no available pool with enough space[%d] and healthy status", aspec.getSize())); + throw new OperationFailureException(operr(ORG_ZSTACK_EXPON_10009, "no available pool with enough space[%d] and healthy status", aspec.getSize())); } return buildExponPath(pool.getFailureDomainName(), ""); @@ -1054,7 +1055,7 @@ public void createVolume(CreateVolumeSpec v, ReturnValueCompletion if (v.getAllocatedUrl() == null) { FailureDomainModule pool = allocateFreePool(v.getSize()); if (pool == null) { - comp.fail(operr("no available pool with enough space[%d] and healthy status", v.getSize())); + comp.fail(operr(ORG_ZSTACK_EXPON_10010, "no available pool with enough space[%d] and healthy status", v.getSize())); return; } poolName = pool.getFailureDomainName(); @@ -1256,7 +1257,7 @@ public void unexport(ExportSpec espec, RemoteTarget remoteTarget, VolumeProtocol } else if (protocol == VolumeProtocol.iSCSI) { unexportIscsi(espec.getInstallPath(), espec.getClientMnIp()); } else { - comp.fail(operr("unsupported protocol %s", protocol.name())); + comp.fail(operr(ORG_ZSTACK_EXPON_10011, "unsupported protocol %s", protocol.name())); return; } comp.success(); diff --git a/plugin/expon/src/main/java/org/zstack/expon/sdk/ExponResponse.java b/plugin/expon/src/main/java/org/zstack/expon/sdk/ExponResponse.java index 12e8cc3c5fa..80f37868d79 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/sdk/ExponResponse.java +++ b/plugin/expon/src/main/java/org/zstack/expon/sdk/ExponResponse.java @@ -4,6 +4,7 @@ import org.zstack.header.expon.ExponError; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class ExponResponse { protected String retCode; @@ -30,7 +31,7 @@ public boolean isSuccess() { } public ErrorCode getError() { - return operr(message); + return operr(ORG_ZSTACK_EXPON_SDK_10000, message); } public boolean sessionExpired() { diff --git a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/ExternalPrimaryStorageAllocator.java b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/ExternalPrimaryStorageAllocator.java index 99b5849d1f8..41a0b090fc5 100644 --- a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/ExternalPrimaryStorageAllocator.java +++ b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/ExternalPrimaryStorageAllocator.java @@ -32,6 +32,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class ExternalPrimaryStorageAllocator implements MarshalVmOperationFlowExtensionPoint { private static final CLogger logger = Utils.getLogger(ExternalPrimaryStorageAllocator.class); @@ -111,7 +112,7 @@ public Flow marshalVmOperationFlow(String previousFlowName, String nextFlowName, return new NoRollbackFlow() { @Override public void run(FlowTrigger trigger, Map data) { - trigger.fail(operr("creation relies on image cache[uuid:%s, locate urls: [%s]], cannot create other places.", spec.getImageSpec().getInventory().getUuid(), candidateUrls)); + trigger.fail(operr(ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_10000, "creation relies on image cache[uuid:%s, locate urls: [%s]], cannot create other places.", spec.getImageSpec().getInventory().getUuid(), candidateUrls)); } }; diff --git a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/kvm/ExternalPrimaryStorageKvmFactory.java b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/kvm/ExternalPrimaryStorageKvmFactory.java index c6eb04a8557..6e5c0c591b8 100644 --- a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/kvm/ExternalPrimaryStorageKvmFactory.java +++ b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/kvm/ExternalPrimaryStorageKvmFactory.java @@ -42,6 +42,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class ExternalPrimaryStorageKvmFactory implements KVMHostConnectExtensionPoint, KVMPingAgentNoFailureExtensionPoint, KvmVmActiveVolumeSyncExtensionPoint, KVMStartVmExtensionPoint { @@ -200,8 +201,8 @@ public void success(NodeHealthy returnValue) { status = PrimaryStorageHostStatus.Connected; } else { status = PrimaryStorageHostStatus.Disconnected; - err = operr("external primary storage[uuid:%s, name:%s] returns unhealthy status: %s", - extPs.getUuid(), extPs.getName(), returnValue.getHealthy()); + err = operr(ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10000, "external primary storage[uuid:%s, name:%s] returns unhealthy status: %s", + ((ExternalPrimaryStorageVO) extPs).getUuid(), ((ExternalPrimaryStorageVO) extPs).getName(), returnValue.getHealthy()); compl.addError(err); } @@ -346,7 +347,7 @@ public void beforeStartVmOnKvm(KVMHostInventory host, VmInstanceSpec spec, KVMAg if (!client.getManagerIp().equals(host.getManagementIp()) && !client.isInBlacklist()) { // hard code for zbs, zbs not support deactive and blacklist yet if (vol.getProtocol().equals(ExternalStorageConstant.CBD_PROTOCOL)) { - throw new OperationFailureException(operr("find active clients for volume[uuid:%s, installPath %s, client:%s]", + throw new OperationFailureException(operr(ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10001, "find active clients for volume[uuid:%s, installPath %s, client:%s]", vol.getUuid(), vol.getInstallPath(), client.getManagerIp())); } // TODO use async call diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/DhcpApply.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/DhcpApply.java index 018d0f0d59e..5e5c3d6a464 100644 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/DhcpApply.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/DhcpApply.java @@ -26,6 +26,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class DhcpApply { CloudBus bus; @@ -70,11 +71,11 @@ public void run(MessageReply reply) { } } if (!info4.isEmpty() && dhcp4Server == null) { - completion.fail(operr("could not get dhcp4 server ip for l3 network [uuid:%s]", msg.getL3NetworkUuid())); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10009, "could not get dhcp4 server ip for l3 network [uuid:%s]", msg.getL3NetworkUuid())); return; } if (!info6.isEmpty() && dhcp6Server == null) { - completion.fail(operr("could not get dhcp6 server ip for l3 network [uuid:%s]", msg.getL3NetworkUuid())); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10010, "could not get dhcp6 server ip for l3 network [uuid:%s]", msg.getL3NetworkUuid())); return; } @@ -211,7 +212,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply ar = reply.castReply(); FlatDhcpBackend.PrepareDhcpRsp rsp = ar.toResponse(FlatDhcpBackend.PrepareDhcpRsp.class); if (!rsp.isSuccess()) { - c.addError(operr("operation error, because:%s", rsp.getError())); + c.addError(operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10011, "operation error, because:%s", rsp.getError())); c.allDone(); return; } @@ -269,7 +270,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply ar = reply.castReply(); FlatDhcpBackend.ApplyDhcpRsp rsp = ar.toResponse(FlatDhcpBackend.ApplyDhcpRsp.class); if (!rsp.isSuccess()) { - c.addError(operr("operation error, because:%s", rsp.getError())); + c.addError(operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10012, "operation error, because:%s", rsp.getError())); c.allDone(); return; } diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatApiInterceptor.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatApiInterceptor.java index 0a82224bf7b..7108b877a1c 100644 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatApiInterceptor.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatApiInterceptor.java @@ -12,6 +12,7 @@ import java.util.Collections; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by Qi Le on 2019/9/9 @@ -36,11 +37,11 @@ private void validate(APIGetL3NetworkIpStatisticMsg msg) { } String accountUuid = msg.getSession().getAccountUuid(); if (StringUtils.isBlank(accountUuid)) { - throw new ApiMessageInterceptionException(Platform.argerr("Session/account uuid is not valid.")); + throw new ApiMessageInterceptionException(Platform.argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10021, "Session/account uuid is not valid.")); } if (!CheckIfAccountCanAccessResource.check(Collections.singletonList(msg.getL3NetworkUuid()), accountUuid).isEmpty()) { throw new ApiMessageInterceptionException( - operr("the account[uuid:%s] has no access to the resource[uuid:%s, type:L3NetworkVO]", + operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10022, "the account[uuid:%s] has no access to the resource[uuid:%s, type:L3NetworkVO]", accountUuid, msg.getL3NetworkUuid())); } } diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDHCPDeleteNamespaceGC.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDHCPDeleteNamespaceGC.java index 15f6bca7a7f..7871a0304c8 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDHCPDeleteNamespaceGC.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDHCPDeleteNamespaceGC.java @@ -11,6 +11,7 @@ import org.zstack.kvm.KvmCommandSender; import org.zstack.kvm.KvmResponseWrapper; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by xing5 on 2017/3/6. @@ -34,7 +35,7 @@ protected void triggerNow(GCCompletion completion) { new KvmCommandSender(hostUuid).send(command, path, wrapper -> { FlatDhcpBackend.DeleteNamespaceRsp rsp = wrapper.getResponse(FlatDhcpBackend.DeleteNamespaceRsp.class); - return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10013, "operation error, because:%s", rsp.getError()); }, new ReturnValueCompletion(completion) { diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java index 7daff5e7b4f..962be8fe4ef 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java @@ -90,6 +90,7 @@ import static org.zstack.network.service.flat.IpStatisticConstants.ResourceType; import static org.zstack.network.service.flat.IpStatisticConstants.SortBy; import static org.zstack.utils.CollectionDSL.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 9/15/2015. @@ -306,7 +307,7 @@ public void run(FlowTrigger trigger, Map data) { String dhcpIp = allocateDhcpIp(msg.getL3NetworkUuid(), IPv6Constants.IPv4, allocate_ip, msg.getDhcpServerIp(), null); if (dhcpIp == null || !dhcpIp.equals(msg.getDhcpServerIp())) { - trigger.fail(operr("change dhcp server ip to [%s], but got [%s]", msg.getDhcpServerIp(), dhcpIp)); + trigger.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10023, "change dhcp server ip to [%s], but got [%s]", msg.getDhcpServerIp(), dhcpIp)); return; } } @@ -322,7 +323,7 @@ public void run(FlowTrigger trigger, Map data) { String dhcpIp = allocateDhcpIp(msg.getL3NetworkUuid(), IPv6Constants.IPv6, allocate_ip, msg.getDhcpv6ServerIp(), null); if (dhcpIp == null || !dhcpIp.equals(msg.getDhcpv6ServerIp())) { - trigger.fail(operr("change dhcp server ip to [%s], but got [%s]", msg.getDhcpv6ServerIp(), dhcpIp)); + trigger.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10024, "change dhcp server ip to [%s], but got [%s]", msg.getDhcpv6ServerIp(), dhcpIp)); } } trigger.next(); @@ -896,7 +897,7 @@ private void handle(APIGetL3NetworkDhcpIpAddressMsg msg) { APIGetL3NetworkDhcpIpAddressReply reply = new APIGetL3NetworkDhcpIpAddressReply(); if (msg.getL3NetworkUuid() == null) { - reply.setError(argerr("l3 network uuid cannot be null")); + reply.setError(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10025, "l3 network uuid cannot be null")); bus.reply(msg, reply); return; } @@ -1295,7 +1296,7 @@ public List call() { if (rsp == null) { return null; } - return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10026, "operation error, because:%s", rsp.getError()); }, new SteppingSendCallback() { @Override public void success(KvmResponseWrapper w) { @@ -1400,7 +1401,7 @@ public void success() { @Override public void fail(ErrorCode errorCode) { - completion.fail(operr("cannot configure DHCP for vm[uuid:%s] on the destination host[uuid:%s]", + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10027, "cannot configure DHCP for vm[uuid:%s] on the destination host[uuid:%s]", inv.getUuid(), destHostUuid).causedBy(errorCode)); } }); @@ -2178,7 +2179,7 @@ public void vmDefaultL3NetworkChanged(VmInstanceInventory vm, String previousL3, KvmCommandSender sender = new KvmCommandSender(vm.getHostUuid()); sender.send(cmd, RESET_DEFAULT_GATEWAY_PATH, wrapper -> { ResetDefaultGatewayRsp rsp = wrapper.getResponse(ResetDefaultGatewayRsp.class); - return rsp.isSuccess() ? null : operr(rsp.getError(), "operation error, because:%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10028, rsp.getError(), "operation error, because:%s", rsp.getError()); }, new ReturnValueCompletion(completion) { @Override public void success(KvmResponseWrapper returnValue) { @@ -2287,7 +2288,7 @@ private void validateIpv6PrefixLength(IpRangeInventory inv) { } if (inv.getPrefixLen() < IPv6Constants.IPV6_PREFIX_LEN_MIN_DNSMASQ) { - throw new ApiMessageInterceptionException(argerr("minimum ip range prefix length of flat network is %d", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10029, "minimum ip range prefix length of flat network is %d", IPv6Constants.IPV6_PREFIX_LEN_MIN_DNSMASQ)); } } @@ -2308,37 +2309,37 @@ private void validateDhcpServerIp(IpRangeInventory inv, List systemTags) if (inv.getIpVersion() == IPv6Constants.IPv4) { if (!NetworkUtils.isIpv4Address(dhcpServerIp)) { - throw new ApiMessageInterceptionException(argerr("DHCP server ip [%s] is not a IPv4 address", dhcpServerIp)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10030, "DHCP server ip [%s] is not a IPv4 address", dhcpServerIp)); } if (!NetworkUtils.isIpv4InCidr(dhcpServerIp, inv.getNetworkCidr())) { - throw new ApiMessageInterceptionException(argerr("DHCP server ip [%s] is not in the cidr [%s]", dhcpServerIp, inv.getNetworkCidr())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10031, "DHCP server ip [%s] is not in the cidr [%s]", dhcpServerIp, inv.getNetworkCidr())); } } else { if (!IPv6NetworkUtils.isIpv6Address(dhcpServerIp)) { - throw new ApiMessageInterceptionException(argerr("DHCP server ip [%s] is not a IPv6 address", dhcpServerIp)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10032, "DHCP server ip [%s] is not a IPv6 address", dhcpServerIp)); } if (!IPv6NetworkUtils.isIpv6InCidrRange(dhcpServerIp, inv.getNetworkCidr())) { - throw new ApiMessageInterceptionException(argerr("DHCP server ip [%s] is not in the cidr [%s]", dhcpServerIp, inv.getNetworkCidr())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10033, "DHCP server ip [%s] is not in the cidr [%s]", dhcpServerIp, inv.getNetworkCidr())); } } Map oldDhcpServerMap = getExistingDhcpServerIp(inv.getL3NetworkUuid(), inv.getIpVersion()); if (!oldDhcpServerMap.isEmpty()) { Map.Entry entry = oldDhcpServerMap.entrySet().iterator().next(); - throw new ApiMessageInterceptionException(argerr("DHCP server ip [%s] is already existed in l3 network [%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10034, "DHCP server ip [%s] is already existed in l3 network [%s]", entry.getKey(), inv.getL3NetworkUuid())); } if (dhcpServerIp.equals(inv.getGateway())) { - throw new ApiMessageInterceptionException(argerr("DHCP server ip [%s] can not be equaled to gateway ip", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10035, "DHCP server ip [%s] can not be equaled to gateway ip", dhcpServerIp)); } L3NetworkVO l3Vo = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.uuid, inv.getL3NetworkUuid()).find(); if (l3Vo.isSystem()) { - throw new ApiMessageInterceptionException(argerr("DHCP server ip [%s] can not be configured to system l3", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10036, "DHCP server ip [%s] can not be configured to system l3", dhcpServerIp)); } } @@ -2378,7 +2379,7 @@ private void validate(APIDeleteIpAddressMsg msg) { UsedIpVO vo = dbf.findByUuid(uuid, UsedIpVO.class); Map dhcpMap = getExistingDhcpServerIp(vo.getL3NetworkUuid(), vo.getIpVersion()); if (!dhcpMap.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("could delete ip address, " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10037, "could delete ip address, " + "because ip [%s] is dhcp server ip", vo.getIp())); } } @@ -2387,7 +2388,7 @@ private void validate(APIDeleteIpAddressMsg msg) { private void validate(APIAttachNetworkServiceToL3NetworkMsg msg) { String owner = acntMgr.getOwnerAccountUuidOfResource(msg.getL3NetworkUuid()); if (!acntMgr.isAdmin(msg.getSession()) && !msg.getSession().getAccountUuid().equals(owner)) { - throw new ApiMessageInterceptionException(argerr("could change dhcp server ip, because %s is not the owner of l3 network[uuid:%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10038, "could change dhcp server ip, because %s is not the owner of l3 network[uuid:%s]", msg.getSession().getAccountUuid(), msg.getL3NetworkUuid())); } @@ -2415,23 +2416,23 @@ private void validate(APIAttachNetworkServiceToL3NetworkMsg msg) { } if (dhcpIp != null && ipv4Ranges.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("could set dhcp v4 server ip, because there is no ipv4 range")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10039, "could set dhcp v4 server ip, because there is no ipv4 range")); } if (dhcpIp != null) { if (!NetworkUtils.isIpv4InCidr(dhcpIp, ipv4Ranges.get(0).getNetworkCidr())) { - throw new ApiMessageInterceptionException(argerr("could set dhcp v4 server ip, because ip[%s] is not the cidr of l3 [%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10040, "could set dhcp v4 server ip, because ip[%s] is not the cidr of l3 [%s]", dhcpIp, ipv4Ranges.get(0).getNetworkCidr())); } } if (dhcp6Ip != null && ipv6Ranges.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("could set dhcp v6 server ip, because there is no ipv6 range")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10041, "could set dhcp v6 server ip, because there is no ipv6 range")); } if (dhcp6Ip != null) { if (!IPv6NetworkUtils.isIpv6InCidrRange(dhcp6Ip, ipv6Ranges.get(0).getNetworkCidr())) { - throw new ApiMessageInterceptionException(argerr("could set dhcp v6 server ip, because ip[%s] is not the cidr of l3 [%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10042, "could set dhcp v6 server ip, because ip[%s] is not the cidr of l3 [%s]", dhcpIp, ipv6Ranges.get(0).getNetworkCidr())); } } @@ -2440,19 +2441,19 @@ private void validate(APIAttachNetworkServiceToL3NetworkMsg msg) { private void validate(APIDetachNetworkServiceFromL3NetworkMsg msg) { String owner = acntMgr.getOwnerAccountUuidOfResource(msg.getL3NetworkUuid()); if (!acntMgr.isAdmin(msg.getSession()) && !msg.getSession().getAccountUuid().equals(owner)) { - throw new ApiMessageInterceptionException(argerr("could change dhcp server ip, because %s is not the owner of l3 network[uuid:%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10043, "could change dhcp server ip, because %s is not the owner of l3 network[uuid:%s]", msg.getSession().getAccountUuid(), msg.getL3NetworkUuid())); } } private void validate(APIChangeL3NetworkDhcpIpAddressMsg msg) { if (!isAllocateDhcpServerIp(msg.getL3NetworkUuid())) { - throw new ApiMessageInterceptionException(argerr("could change dhcp server ip, because flat dhcp is not enabled")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10044, "could change dhcp server ip, because flat dhcp is not enabled")); } String owner = acntMgr.getOwnerAccountUuidOfResource(msg.getL3NetworkUuid()); if (!acntMgr.isAdmin(msg.getSession()) && !msg.getSession().getAccountUuid().equals(owner)) { - throw new ApiMessageInterceptionException(argerr("could change dhcp server ip, because %s is not the owner of l3 network[uuid:%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10045, "could change dhcp server ip, because %s is not the owner of l3 network[uuid:%s]", msg.getSession().getAccountUuid(), msg.getL3NetworkUuid())); } @@ -2461,23 +2462,23 @@ private void validate(APIChangeL3NetworkDhcpIpAddressMsg msg) { List ipv6Ranges = l3VO.getIpRanges().stream().filter(ipr -> ipr.getIpVersion() == IPv6Constants.IPv6).collect(Collectors.toList()); if (msg.getDhcpServerIp() != null && ipv4Ranges.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("could change dhcp v4 server ip, because there is no ipv4 range")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10046, "could change dhcp v4 server ip, because there is no ipv4 range")); } if (msg.getDhcpServerIp() != null) { if (!NetworkUtils.isIpv4InCidr(msg.getDhcpServerIp(), ipv4Ranges.get(0).getNetworkCidr())) { - throw new ApiMessageInterceptionException(argerr("could set dhcp v4 server ip, because ip[%s] is not the cidr of l3 [%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10047, "could set dhcp v4 server ip, because ip[%s] is not the cidr of l3 [%s]", msg.getDhcpServerIp(), ipv4Ranges.get(0).getNetworkCidr())); } } if (msg.getDhcpv6ServerIp() != null && ipv6Ranges.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("could change dhcp v6 server ip, because there is no ipv6 range")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10048, "could change dhcp v6 server ip, because there is no ipv6 range")); } if (msg.getDhcpv6ServerIp() != null) { if (!IPv6NetworkUtils.isIpv6InCidrRange(msg.getDhcpv6ServerIp(), ipv6Ranges.get(0).getNetworkCidr())) { - throw new ApiMessageInterceptionException(argerr("could set dhcp v6 server ip, because ip[%s] is not the cidr of l3 [%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10049, "could set dhcp v6 server ip, because ip[%s] is not the cidr of l3 [%s]", msg.getDhcpv6ServerIp(), ipv6Ranges.get(0).getNetworkCidr())); } } @@ -2485,7 +2486,7 @@ private void validate(APIChangeL3NetworkDhcpIpAddressMsg msg) { if (msg.getDhcpServerIp() != null) { if (Q.New(UsedIpVO.class).eq(UsedIpVO_.ip, msg.getDhcpServerIp()) .eq(UsedIpVO_.l3NetworkUuid, msg.getL3NetworkUuid()).isExists()) { - throw new ApiMessageInterceptionException(argerr("could set dhcp server ip, because ip[%s] is used", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10050, "could set dhcp server ip, because ip[%s] is used", msg.getDhcpServerIp())); } } @@ -2493,7 +2494,7 @@ private void validate(APIChangeL3NetworkDhcpIpAddressMsg msg) { if (msg.getDhcpv6ServerIp() != null) { if (Q.New(UsedIpVO.class).eq(UsedIpVO_.ip, msg.getDhcpv6ServerIp()) .eq(UsedIpVO_.l3NetworkUuid, msg.getL3NetworkUuid()).isExists()) { - throw new ApiMessageInterceptionException(argerr("could set dhcp v6 server ip, because ip[%s] is used", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10051, "could set dhcp v6 server ip, because ip[%s] is used", msg.getDhcpServerIp())); } } @@ -2749,7 +2750,7 @@ public void enableNetworkService(L3NetworkVO l3VO, List systemTags, Comp } dhcpIp = allocateDhcpIp(l3VO.getUuid(), IPv6Constants.IPv4, allocate_ip, dhcpIp, null); if (dhcpIp == null) { - completion.fail(argerr("allocated dhcp server ip failed")); + completion.fail(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10052, "allocated dhcp server ip failed")); return; } } @@ -2768,7 +2769,7 @@ public void enableNetworkService(L3NetworkVO l3VO, List systemTags, Comp } dhcp6Ip = allocateDhcpIp(l3VO.getUuid(), IPv6Constants.IPv6, allocate_ip, dhcp6Ip, null); if (dhcp6Ip == null) { - completion.fail(argerr("allocated dhcp server ip failed")); + completion.fail(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10053, "allocated dhcp server ip failed")); return; } } @@ -2821,7 +2822,7 @@ public List call() { if (rsp == null) { return null; } - return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10054, "operation error, because:%s", rsp.getError()); }, new SteppingSendCallback() { @Override public void success(KvmResponseWrapper w) { @@ -2887,7 +2888,7 @@ private void doArpingOnHost(CheckIpAvailabilityMsg msg, HostInventory host, L2Ne KvmCommandSender sender = new KvmCommandSender(host.getUuid()); sender.send(cmd, ARPING_NAMESPACE_PATH, wrapper -> { ArpingRsp rsp = wrapper.getResponse(ArpingRsp.class); - return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10055, "operation error, because:%s", rsp.getError()); }, new ReturnValueCompletion(completion) { @Override public void success(KvmResponseWrapper returnValue) { diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpUpgradeExtension.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpUpgradeExtension.java index 7b58c1b34c1..2bd0ce08dc0 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpUpgradeExtension.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpUpgradeExtension.java @@ -31,6 +31,7 @@ import java.util.Map; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by xing5 on 2016/6/25. @@ -124,7 +125,7 @@ protected boolean run(Map tokens, Object data) { new KvmCommandSender(l3Host.hostUuid).send(cmd, FlatDhcpBackend.DHCP_DELETE_NAMESPACE_PATH, wrapper -> { DeleteNamespaceRsp rsp = wrapper.getResponse(DeleteNamespaceRsp.class); - return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10020, "operation error, because:%s", rsp.getError()); }, new SteppingSendCallback() { @Override public void success(KvmResponseWrapper w) { diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipApiInterceptor.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipApiInterceptor.java index 834ded414e6..b05ee6c2cc7 100644 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipApiInterceptor.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipApiInterceptor.java @@ -26,6 +26,7 @@ import java.util.List; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by MaJin on 2017/12/21. @@ -75,7 +76,7 @@ void validateNicGateway(String vipUuid, String nicUuid) { } if (StringUtils.isEmpty(gateway)) { - throw new ApiMessageInterceptionException(argerr("could not attach eip because there is no gateway for nic[uuid:%s]", nicUuid)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10000, "could not attach eip because there is no gateway for nic[uuid:%s]", nicUuid)); } } @@ -138,7 +139,7 @@ private void checkVipPublicL3Network(String vmNicUuid, String pubL3Uuid){ .param("publicL3Uuid", pubL3Uuid) .find() > 0; if (!isPublicL2NetworkAttachedVmCluster){ - throw new ApiMessageInterceptionException(argerr("L2Network where vip's L3Network based hasn't attached" + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10001, "L2Network where vip's L3Network based hasn't attached" + " the cluster where vmNic[uuid:%s] located", vmNicUuid)); } } @@ -163,7 +164,7 @@ private void checkFlatVmNicAlreadyHasEip(String vmNicUuid, String eipUuid, Strin boolean oldVipVersion = NetworkUtils.isIpv4Address(oldVipIp); if (oldVipVersion == newVipVersion) { String version = oldVipVersion ? "ipv4" : "ipv6"; - throw new ApiMessageInterceptionException(argerr("can not bound more than 1 %s eip to a vm nic[uuid:%s] of flat ", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10002, "can not bound more than 1 %s eip to a vm nic[uuid:%s] of flat ", version, vmNicUuid)); } } diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipBackend.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipBackend.java index 69dbf627c28..5f0b1fb23e7 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipBackend.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipBackend.java @@ -61,6 +61,7 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by xing5 on 2016/4/4. @@ -502,7 +503,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply ar = reply.castReply(); AgentRsp rsp = ar.toResponse(AgentRsp.class); if (!rsp.success) { - completion.fail(operr("operation error, because:%s", rsp.error)); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10015, "operation error, because:%s", rsp.error)); return; } @@ -536,7 +537,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply ar = reply.castReply(); AgentRsp rsp = ar.toResponse(AgentRsp.class); if (!rsp.success) { - completion.fail(operr("operation error, because:%s", rsp.error)); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10016, "operation error, because:%s", rsp.error)); return; } @@ -606,7 +607,7 @@ private String getHostUuidByVmUuid(String vmUuid) { if (vm == null) { throw new CloudRuntimeException(String.format("cannot find the vm[uuid:%s]", vmUuid)); } else { - throw new OperationFailureException(operr("unable to apply the EIP operation for the the vm[uuid:%s, state:%s], because cannot find the VM's hostUUid", + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10017, "unable to apply the EIP operation for the the vm[uuid:%s, state:%s], because cannot find the VM's hostUUid", vmUuid, vm.getState())); } } @@ -676,7 +677,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply ar = reply.castReply(); AgentRsp rsp = ar.toResponse(AgentRsp.class); if (!rsp.success) { - completion.fail(operr("operation error, because:%s", rsp.error)); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10018, "operation error, because:%s", rsp.error)); return; } @@ -739,7 +740,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply ar = reply.castReply(); AgentRsp rsp = ar.toResponse(AgentRsp.class); if (!rsp.success) { - completion.fail(operr("operation error, because:%s", rsp.error)); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10019, "operation error, because:%s", rsp.error)); return; } diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipGC.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipGC.java index 9add2213b4c..6def0a322f2 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipGC.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipGC.java @@ -16,6 +16,7 @@ import static org.zstack.core.Platform.operr; import java.util.List; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by xing5 on 2017/3/6. @@ -41,7 +42,7 @@ protected void triggerNow(GCCompletion completion) { @Override public ErrorCode getError(KvmResponseWrapper wrapper) { KVMAgentCommands.AgentResponse rsp = wrapper.getResponse(KVMAgentCommands.AgentResponse.class); - return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10014, "operation error, because:%s", rsp.getError()); } }, diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java index c7b9181da1b..f6d15a229aa 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java @@ -56,6 +56,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 10/13/2015. @@ -358,7 +359,7 @@ public void run(final FlowTrigger trigger, Map data) { @Override public ErrorCode getError(KvmResponseWrapper wrapper) { AgentResponse rsp = wrapper.getResponse(AgentResponse.class); - return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10003, "operation error, because:%s", rsp.getError()); } }, new ReturnValueCompletion(trigger) { @Override @@ -423,7 +424,7 @@ public List call() { @Override public ErrorCode getError(KvmResponseWrapper w) { CleanupUserdataRsp rsp = w.getResponse(CleanupUserdataRsp.class); - return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10004, "operation error, because:%s", rsp.getError()); } }, new ReturnValueCompletion(null) { @Override @@ -500,7 +501,7 @@ protected void triggerNow(GCCompletion completion) { } if (status != HostStatus.Connected) { - completion.fail(operr("host[uuid:%s] is not connected", struct.getHostUuid())); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10005, "host[uuid:%s] is not connected", struct.getHostUuid())); return; } @@ -532,7 +533,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply r = reply.castReply(); ReleaseUserdataRsp rsp = r.toResponse(ReleaseUserdataRsp.class); if (!rsp.isSuccess()) { - completion.fail(operr("operation error, because:%s", rsp.getError())); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10006, "operation error, because:%s", rsp.getError())); return; } @@ -817,7 +818,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply r = reply.castReply(); ApplyUserdataRsp rsp = r.toResponse(ApplyUserdataRsp.class); if (!rsp.isSuccess()) { - trigger.fail(operr("operation error, because:%s", rsp.getError())); + trigger.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10007, "operation error, because:%s", rsp.getError())); return; } @@ -903,7 +904,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply r = reply.castReply(); ReleaseUserdataRsp rsp = r.toResponse(ReleaseUserdataRsp.class); if (!rsp.isSuccess()) { - trigger.fail(operr("operation error, because:%s", rsp.getError())); + trigger.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_FLAT_10008, "operation error, because:%s", rsp.getError())); return; } diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpApiInterceptor.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpApiInterceptor.java index 23e7c487019..0ad08baac35 100644 --- a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpApiInterceptor.java +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpApiInterceptor.java @@ -21,6 +21,7 @@ import java.util.Set; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class LldpApiInterceptor implements ApiMessageInterceptor { @Autowired @@ -47,14 +48,14 @@ private void validate(APIChangeHostNetworkInterfaceLldpModeMsg msg) { .listValues(); Set set = new HashSet<>(hostUuids); if (set.size() > 1) { - throw new ApiMessageInterceptionException((argerr("could not change lldp mode for the interfaces of different hosts"))); + throw new ApiMessageInterceptionException((argerr(ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10000, "could not change lldp mode for the interfaces of different hosts"))); } } private void validate(APIGetHostNetworkInterfaceLldpMsg msg) { String mode = Q.New(HostNetworkInterfaceLldpVO.class).select(HostNetworkInterfaceLldpVO_.mode).eq(HostNetworkInterfaceLldpVO_.interfaceUuid, msg.getInterfaceUuid()).findValue(); if (mode != null && !mode.contains("rx")) { - throw new ApiMessageInterceptionException((argerr("could not get interface lldp info which is not in receive mode"))); + throw new ApiMessageInterceptionException((argerr(ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10001, "could not get interface lldp info which is not in receive mode"))); } } } diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpManagerImpl.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpManagerImpl.java index 420a6ef544a..1688bfe5796 100644 --- a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpManagerImpl.java +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpManagerImpl.java @@ -35,6 +35,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class LldpManagerImpl extends AbstractService implements HostAfterConnectedExtensionPoint, HostDeleteExtensionPoint, KVMPingAgentNoFailureExtensionPoint { @@ -267,7 +268,7 @@ public void run(MessageReply reply) { LldpKvmAgentCommands.GetLldpInfoResponse rsp = r.toResponse(LldpKvmAgentCommands.GetLldpInfoResponse.class); getNeighbourStateMap.put(interfaceUuid, LLDPGetNeighbourState.Done); if (!rsp.isSuccess()) { - completion.fail(operr("operation error, because %s", rsp.getError())); + completion.fail(operr(ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10002, "operation error, because %s", rsp.getError())); } else { HostNetworkInterfaceLldpVO vo = Q.New(HostNetworkInterfaceLldpVO.class) .eq(HostNetworkInterfaceLldpVO_.interfaceUuid, interfaceUuid).find(); @@ -278,7 +279,7 @@ public void run(MessageReply reply) { if (lldpRefVO != null) { completion.success(HostNetworkInterfaceLldpRefInventory.valueOf(lldpRefVO)); } else { - completion.fail(operr("get lldp ref for[%s] failed", interfaceUuid)); + completion.fail(operr(ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10003, "get lldp ref for[%s] failed", interfaceUuid)); } } } diff --git a/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java b/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java index 5ed3af6d289..66936e05dc0 100644 --- a/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java +++ b/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java @@ -44,6 +44,7 @@ import java.util.Map; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class KvmIscsiNodeServer implements Component, KVMStartVmExtensionPoint, VmInstanceMigrateExtensionPoint, KVMConvertVolumeExtensionPoint, KVMDetachVolumeExtensionPoint, KVMAttachVolumeExtensionPoint, @@ -345,7 +346,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply rep = reply.castReply(); final T rsp = rep.toResponse(respType); if (!rsp.success) { - completion.fail(operr("operation error, because:%s", rsp.error)); + completion.fail(operr(ORG_ZSTACK_ISCSI_KVM_10000, "operation error, because:%s", (String) rsp.error)); return; } completion.success(rsp); diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMApiInterceptor.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMApiInterceptor.java index ca955e5d648..93fd688935b 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMApiInterceptor.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMApiInterceptor.java @@ -25,6 +25,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -58,7 +59,7 @@ private void validate(APIExpungeVmUserDefinedXmlHookScriptMsg msg) { List vmUuids = refVOs.stream() .map(XmlHookVmInstanceRefVO::getVmInstanceUuid) .collect(Collectors.toList()); - throw new ApiMessageInterceptionException(operr("the xml hook[%s] has been set to vm %s," + + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_KVM_10134, "the xml hook[%s] has been set to vm %s," + " so unbind it before deleting it", msg.getUuid(), vmUuids)); } } @@ -70,14 +71,14 @@ private void validate(APIUpdateVmUserDefinedXmlHookScriptMsg msg) { .notEq(XmlHookVO_.uuid, msg.getUuid()) .findValue(); if (StringUtils.isNotEmpty(name)) { - throw new ApiMessageInterceptionException(argerr("the xml hook name[%s] already exists", msg.getName())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_KVM_10135, "the xml hook name[%s] already exists", msg.getName())); } } private static void failIfChangeSystemDefinedHook(XmlHookMessage msg) { XmlHookVO vo = Q.New(XmlHookVO.class).eq(XmlHookVO_.uuid, msg.getXmlHookUuid()).find(); if (XmlHookType.System.equals(vo.getType())) { - throw new ApiMessageInterceptionException(operr("System-type xml hooks are not allowed to be operated")); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_KVM_10136, "System-type xml hooks are not allowed to be operated")); } } @@ -85,7 +86,7 @@ private void validate(APICreateVmUserDefinedXmlHookScriptMsg msg) { String name = Q.New(XmlHookVO.class).select(XmlHookVO_.name) .eq(XmlHookVO_.name, msg.getName()).findValue(); if (StringUtils.isNotEmpty(name)) { - throw new ApiMessageInterceptionException(argerr("the xml hook name[%s] already exists", msg.getName())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_KVM_10137, "the xml hook name[%s] already exists", msg.getName())); } } @@ -94,7 +95,7 @@ private void validate(APIAddKVMHostMsg msg) { SimpleQuery q = dbf.createQuery(KVMHostVO.class); q.add(KVMHostVO_.managementIp, Op.EQ, msg.getManagementIp()); if (q.isExists()) { - throw new ApiMessageInterceptionException(argerr("there has been a kvm host having management ip[%s]", msg.getManagementIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_KVM_10138, "there has been a kvm host having management ip[%s]", msg.getManagementIp())); } } @@ -112,7 +113,7 @@ private void validate(APIAttachL2NetworkToClusterMsg msg) { if (NetworkUtils.generateVlanDeviceName(l2.getPhysicalInterface(), l2.getVlan()).length() > L2NetworkConstant.LINUX_IF_NAME_MAX_SIZE) { - throw new ApiMessageInterceptionException(argerr("cannot create vlan-device on %s because it's too long" + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_KVM_10139, "cannot create vlan-device on %s because it's too long" , l2.getPhysicalInterface())); } } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConsoleHypervisorBackend.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConsoleHypervisorBackend.java index 46092d74bc3..3e8ab0c26a3 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConsoleHypervisorBackend.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConsoleHypervisorBackend.java @@ -22,6 +22,7 @@ import static org.zstack.core.Platform.inerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -62,12 +63,12 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply kreply = reply.castReply(); GetVncPortResponse rsp = kreply.toResponse(GetVncPortResponse.class); if (!rsp.isSuccess()) { - complete.fail(operr("operation error, because:%s", rsp.getError())); + complete.fail(operr(ORG_ZSTACK_KVM_10160, "operation error, because:%s", rsp.getError())); return; } if (rsp.getPort() < 0) { - complete.fail(operr("unexpected VNC port number[%d] for VM [uuid:%s]", rsp.getPort(), vm.getUuid())); + complete.fail(operr(ORG_ZSTACK_KVM_10161, "unexpected VNC port number[%d] for VM [uuid:%s]", rsp.getPort(), vm.getUuid())); return; } @@ -83,7 +84,7 @@ public void run(MessageReply reply) { consoleUrl.setVersion(dbf.getDbVersion()); complete.success(consoleUrl); } catch (URISyntaxException e) { - complete.fail(inerr(e.getMessage())); + complete.fail(inerr(ORG_ZSTACK_KVM_10162, e.getMessage())); } } }); diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index c82a8ba8aee..558aded6380 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -119,6 +119,7 @@ import static org.zstack.kvm.KvmHostUpdateOsExtensionPoint.UPDATE_OS_RSP; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class KVMHost extends HostBase implements Host { private static final CLogger logger = Utils.getLogger(KVMHost.class); @@ -510,7 +511,7 @@ public void success(T ret) { if (dbf.isExist(self.getUuid(), HostVO.class)) { completion.success(ret); } else { - completion.fail(operr("host[uuid:%s] has been deleted", self.getUuid())); + completion.fail(operr(ORG_ZSTACK_KVM_10012, "host[uuid:%s] has been deleted", self.getUuid())); } } @@ -531,7 +532,7 @@ public void success(T ret) { if (dbf.isExist(self.getUuid(), HostVO.class)) { completion.success(ret); } else { - completion.fail(operr("host[uuid:%s] has been deleted", self.getUuid())); + completion.fail(operr(ORG_ZSTACK_KVM_10013, "host[uuid:%s] has been deleted", self.getUuid())); } } @@ -712,7 +713,7 @@ private void handle(RestartKvmAgentMsg msg) { .setSyncSignature(String.format("restart-kvmagent-on-host-%s", msg.getHostUuid())) .run(completion -> { if (!destMaker.isManagedByUs(msg.getHostUuid())) { - completion.fail(operr("host %s is not managed by current mn node", msg.getHostUuid())); + completion.fail(operr(ORG_ZSTACK_KVM_10014, "host %s is not managed by current mn node", msg.getHostUuid())); return; } @@ -794,7 +795,7 @@ private void restartKvmAgentOnHost(boolean force, Completion completion) { @Override public void run(FlowTrigger trigger, Map data) { if (self.getStatus() != HostStatus.Connected) { - trigger.fail(operr("host %s is not connected, skip to restart kvmagent", self.getUuid())); + trigger.fail(operr(ORG_ZSTACK_KVM_10015, "host %s is not connected, skip to restart kvmagent", self.getUuid())); return; } changeConnectionState(HostStatusEvent.connecting); @@ -823,7 +824,7 @@ public void success(Boolean noTask) { if (noTask) { trigger.next(); } else { - trigger.fail(operr("running task exists on host %s", self.getUuid())); + trigger.fail(operr(ORG_ZSTACK_KVM_10016, "running task exists on host %s", self.getUuid())); } } @@ -850,7 +851,7 @@ public void run(FlowTrigger trigger, Map data) { SshResult ret = sshShell.runCommand("sudo service zstack-kvmagent restart"); if (ret.isSshFailure() || ret.getReturnCode() != 0) { - trigger.fail(operr(ret.getExitErrorMessage())); + trigger.fail(operr(ORG_ZSTACK_KVM_10017, ret.getExitErrorMessage())); } else { trigger.next(); } @@ -971,7 +972,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply r = reply.castReply(); TakeVmConsoleScreenshotRsp rsp = r.toResponse(TakeVmConsoleScreenshotRsp.class); if (!rsp.isSuccess()) { - completion.fail(operr(rsp.getError())); + completion.fail(operr(ORG_ZSTACK_KVM_10018, rsp.getError())); } else { completion.success(r.toResponse(TakeVmConsoleScreenshotRsp.class)); } @@ -1034,7 +1035,7 @@ public void run(FlowTrigger trigger, Map data) { @Override public void success(BlockCommitResponse ret) { if (!ret.isSuccess()) { - ErrorCode err = operr("operation error, because:%s", ret.getError()); + ErrorCode err = operr(ORG_ZSTACK_KVM_10019, "operation error, because:%s", ret.getError()); extEmitter.failedToCommitVolume((KVMHostInventory) getSelfInventory(), msg, cmd, ret, err); trigger.fail(err); return; @@ -1146,7 +1147,7 @@ public void run(FlowTrigger trigger, Map data) { @Override public void success(BlockPullResponse ret) { if (!ret.isSuccess()) { - ErrorCode err = operr("operation error, because:%s", ret.getError()); + ErrorCode err = operr(ORG_ZSTACK_KVM_10020, "operation error, because:%s", ret.getError()); extEmitter.failedToPullVolume((KVMHostInventory) getSelfInventory(), msg, cmd, ret, err); trigger.fail(err); return; @@ -1255,7 +1256,7 @@ private void handle(GetHostWebSshUrlMsg msg) { try (Response r = hb.callWithException()) { // 1. webssh maybe is not running if (!r.isSuccessful()) { - reply.setError(inerr("webssh server is unreachable for %s", r.message())); + reply.setError(inerr(ORG_ZSTACK_KVM_10021, "webssh server is unreachable for %s", r.message())); reply.setSuccess(false); bus.reply(msg, reply); return; @@ -1264,7 +1265,7 @@ private void handle(GetHostWebSshUrlMsg msg) { WebSshResponseStruct webSsh = JSONObjectUtil.toObject(Objects.requireNonNull(r.body()).string(), WebSshResponseStruct.class); // 2. return id is null, because authentication fail or connections is full if (null == webSsh.id) { - reply.setError(operr("ssh connect to host[%s] username[%s] on port[%s] failed, because %s", host.getUuid(), host.getUsername(), host.getPort(), webSsh.status)); + reply.setError(operr(ORG_ZSTACK_KVM_10022, "ssh connect to host[%s] username[%s] on port[%s] failed, because %s", host.getUuid(), host.getUsername(), host.getPort(), webSsh.status)); reply.setSuccess(false); bus.reply(msg, reply); return; @@ -1335,7 +1336,7 @@ private void submitTaskWaitHostPowerOnByIpmi() { @Override public boolean run() { if (timeHelper.getCurrentTimeMillis() > deadline) { - reply.setError(operr(String.format("Host[%s] has not been power on within %d seconds for an unknown reason. Please check host status in BMC[%s]", msg.getHostUuid(), timeoutInSec, host.getIpmi().getIpmiAddress()))); + reply.setError(operr(ORG_ZSTACK_KVM_10023, String.format("Host[%s] has not been power on within %d seconds for an unknown reason. Please check host status in BMC[%s]", msg.getHostUuid(), timeoutInSec, host.getIpmi().getIpmiAddress()))); reply.setSuccess(false); bus.reply(msg, reply); HostIpmiVO ipmi = host.getIpmi(); @@ -1421,7 +1422,7 @@ public boolean run() { HostIpmiVO ipmi = host.getIpmi(); kvmHostIpmiPowerExecutor.updateIpmiPowerStatusInDB(ipmi, HostPowerStatus.POWER_ON); if (!msg.isReturnEarly()) { - reply.setError(operr(String.format("Host[%s] has not been shut down within %d seconds for an unknown reason. Please check host status in BMC[%s]", msg.getHostUuid(), timeoutInSec, host.getIpmi().getIpmiAddress()))); + reply.setError(operr(ORG_ZSTACK_KVM_10024, String.format("Host[%s] has not been shut down within %d seconds for an unknown reason. Please check host status in BMC[%s]", msg.getHostUuid(), timeoutInSec, host.getIpmi().getIpmiAddress()))); reply.setSuccess(false); bus.reply(msg, reply); } @@ -1504,7 +1505,7 @@ private void handleRebootHostByAgent(RebootHostMsg msg, NoErrorCompletion comple @Override public void success(RebootHostResponse returnValue) { if (!returnValue.isSuccess()) { - reply.setError(operr("operation error, because:%s", returnValue.getError())); + reply.setError(operr(ORG_ZSTACK_KVM_10025, "operation error, because:%s", returnValue.getError())); bus.reply(msg, reply); completion.done(); return; @@ -1533,7 +1534,7 @@ private void handle(SyncVmDeviceInfoMsg msg) { @Override public void success(SyncVmDeviceInfoResponse ret) { if (!ret.isSuccess()) { - ErrorCode err = Platform.err(SysErrors.OPERATION_ERROR, ret.getError()); + ErrorCode err = Platform.err(ORG_ZSTACK_KVM_10026, SysErrors.OPERATION_ERROR, ret.getError()); reply.setError(err); } @@ -1561,7 +1562,7 @@ private void handle(GetHostNumaTopologyMsg msg) { @Override public void success(GetHostNUMATopologyResponse ret) { if (!ret.isSuccess()) { - ErrorCode err = Platform.err(SysErrors.OPERATION_ERROR, ret.getError()); + ErrorCode err = Platform.err(ORG_ZSTACK_KVM_10027, SysErrors.OPERATION_ERROR, ret.getError()); reply.setError(err); } else { reply.setNuma(ret.getTopology()); @@ -1612,7 +1613,7 @@ private void compareCpuFunctionOnHost(final CompareCpuFunctionOnHostMsg msg, Ret @Override public void success(VmCompareCpuFunctionResponse ret) { if (!ret.isSuccess()) { - completion.fail(operr(ret.getError())); + completion.fail(operr(ORG_ZSTACK_KVM_10028, ret.getError())); return; } completion.success(ret); @@ -1636,7 +1637,7 @@ private void getCpuFunctionXml(final GetCpuFunctionXmlOnHostMsg msg, ReturnValue @Override public void success(VmGetCpuXmlResponse ret) { if (!ret.isSuccess()) { - completion.fail(operr(ret.getError())); + completion.fail(operr(ORG_ZSTACK_KVM_10029, ret.getError())); return; } reply.setCpuXml(ret.getCpuXml()); @@ -1769,18 +1770,18 @@ private void handle(CheckHostCapacityMsg msg) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { - throw new OperationFailureException(operr("check host capacity failed, because:%s", reply.getError())); + throw new OperationFailureException(operr(ORG_ZSTACK_KVM_10030, "check host capacity failed, because:%s", reply.getError())); } KVMHostAsyncHttpCallReply r = reply.castReply(); HostCapacityResponse rsp = r.toResponse(HostCapacityResponse.class); if (!rsp.isSuccess()) { - throw new OperationFailureException(operr("operation error, because:%s", rsp.getError())); + throw new OperationFailureException(operr(ORG_ZSTACK_KVM_10031, "operation error, because:%s", rsp.getError())); } long reservedSize = SizeUtils.sizeStringToBytes(rcf.getResourceConfigValue(KVMGlobalConfig.RESERVED_MEMORY_CAPACITY, msg.getHostUuid(), String.class)); if (rsp.getTotalMemory() < reservedSize) { - throw new OperationFailureException(operr("The host[uuid:%s]'s available memory capacity[%s] is lower than the reserved capacity[%s]", + throw new OperationFailureException(operr(ORG_ZSTACK_KVM_10032, "The host[uuid:%s]'s available memory capacity[%s] is lower than the reserved capacity[%s]", msg.getHostUuid(), rsp.getTotalMemory(), reservedSize)); } @@ -1836,7 +1837,7 @@ private void registerPrimaryVmHeartbeat(RegisterColoPrimaryCheckMsg msg, NoError public void success(AgentResponse ret) { final StartColoSyncReply reply = new StartColoSyncReply(); if (!ret.isSuccess()) { - reply.setError(operr("unable to register colo heartbeat for vm[uuid:%s] on kvm host [uuid:%s, ip:%s], because %s", + reply.setError(operr(ORG_ZSTACK_KVM_10033, "unable to register colo heartbeat for vm[uuid:%s] on kvm host [uuid:%s, ip:%s], because %s", msg.getVmInstanceUuid(), self.getUuid(), self.getManagementIp(), ret.getError())); } else { logger.debug(String.format("unable to register colo heartbeat for vm[uuid:%s] on kvm host[uuid:%s] success", msg.getVmInstanceUuid(), self.getUuid())); @@ -1894,7 +1895,7 @@ private void startColoSync(StartColoSyncMsg msg, NoErrorCompletion completion) { public void success(AgentResponse ret) { final StartColoSyncReply reply = new StartColoSyncReply(); if (!ret.isSuccess()) { - reply.setError(operr("unable to start colo sync vm[uuid:%s] on kvm host [uuid:%s, ip:%s], because %s", + reply.setError(operr(ORG_ZSTACK_KVM_10034, "unable to start colo sync vm[uuid:%s] on kvm host [uuid:%s, ip:%s], because %s", msg.getVmInstanceUuid(), self.getUuid(), self.getManagementIp(), ret.getError())); } else { logger.debug(String.format("unable to start colo sync vm[uuid:%s] on kvm host[uuid:%s] success", msg.getVmInstanceUuid(), self.getUuid())); @@ -1949,7 +1950,7 @@ private void configSecondaryVm(ConfigSecondaryVmMsg msg, NoErrorCompletion compl public void success(AgentResponse ret) { final ConfigPrimaryVmReply reply = new ConfigPrimaryVmReply(); if (!ret.isSuccess()) { - reply.setError(operr("unable to config secondary vm[uuid:%s] on kvm host [uuid:%s, ip:%s], because %s", + reply.setError(operr(ORG_ZSTACK_KVM_10035, "unable to config secondary vm[uuid:%s] on kvm host [uuid:%s, ip:%s], because %s", msg.getVmInstanceUuid(), self.getUuid(), self.getManagementIp(), ret.getError())); } else { logger.debug(String.format("config secondary vm[uuid:%s] on kvm host[uuid:%s] success", msg.getVmInstanceUuid(), self.getUuid())); @@ -1981,7 +1982,7 @@ private void configPrimaryVm(ConfigPrimaryVmMsg msg, NoErrorCompletion completio public void success(AgentResponse ret) { final ConfigPrimaryVmReply reply = new ConfigPrimaryVmReply(); if (!ret.isSuccess()) { - reply.setError(operr("unable to config primary vm[uuid:%s] on kvm host [uuid:%s, ip:%s], because %s", + reply.setError(operr(ORG_ZSTACK_KVM_10036, "unable to config primary vm[uuid:%s] on kvm host [uuid:%s, ip:%s], because %s", msg.getVmInstanceUuid(), self.getUuid(), self.getManagementIp(), ret.getError())); } else { logger.debug(String.format("config primary vm[uuid:%s] on kvm host[uuid:%s] success", msg.getVmInstanceUuid(), self.getUuid())); @@ -2022,7 +2023,7 @@ private void getVmFirstBootDevice(final GetVmFirstBootDeviceOnHypervisorMsg msg, public void success(GetVmFirstBootDeviceResponse ret) { final GetVmFirstBootDeviceOnHypervisorReply reply = new GetVmFirstBootDeviceOnHypervisorReply(); if (!ret.isSuccess()) { - reply.setError(operr("unable to get first boot dev of vm[uuid:%s] on kvm host [uuid:%s, ip:%s], because %s", + reply.setError(operr(ORG_ZSTACK_KVM_10037, "unable to get first boot dev of vm[uuid:%s] on kvm host [uuid:%s, ip:%s], because %s", msg.getVmInstanceUuid(), self.getUuid(), self.getManagementIp(), ret.getError())); } else { reply.setFirstBootDevice(ret.getFirstBootDevice()); @@ -2071,7 +2072,7 @@ private void getVmDeviceAddress(final GetVmDeviceAddressMsg msg, final NoErrorCo @Override public void success(GetVmDeviceAddressRsp rsp) { if (!rsp.isSuccess()) { - reply.setError(operr("failed to get vm[uuid:%s] device address, because:%s", msg.getVmInstanceUuid(), rsp.getError())); + reply.setError(operr(ORG_ZSTACK_KVM_10038, "failed to get vm[uuid:%s] device address, because:%s", msg.getVmInstanceUuid(), rsp.getError())); bus.reply(msg, reply); completion.done(); return; @@ -2126,7 +2127,7 @@ private void getVirtualizerInfo(final GetVirtualizerInfoMsg msg, final NoErrorCo @Override public void success(GetVirtualizerInfoRsp rsp) { if (!rsp.isSuccess()) { - reply.setError(operr("failed to get host[uuid:%s] virtualizer info, because:%s", msg.getHostUuid(), rsp.getError())); + reply.setError(operr(ORG_ZSTACK_KVM_10039, "failed to get host[uuid:%s] virtualizer info, because:%s", msg.getHostUuid(), rsp.getError())); bus.reply(msg, reply); completion.done(); return; @@ -2208,7 +2209,7 @@ private void handle(final IncreaseVmCpuMsg msg) { @Override public void success(IncreaseCpuResponse ret) { if (!ret.isSuccess()) { - reply.setError(operr("failed to increase vm cpu, error details: %s", ret.getError())); + reply.setError(operr(ORG_ZSTACK_KVM_10040, "failed to increase vm cpu, error details: %s", ret.getError())); } else { reply.setCpuNum(ret.getCpuNum()); } @@ -2233,7 +2234,7 @@ private void handle(final IncreaseVmMemoryMsg msg) { @Override public void success(IncreaseMemoryResponse ret) { if (!ret.isSuccess()) { - reply.setError(operr("operation error, because:%s", ret.getError())); + reply.setError(operr(ORG_ZSTACK_KVM_10041, "operation error, because:%s", ret.getError())); } else { reply.setMemorySize(ret.getMemorySize()); } @@ -2260,7 +2261,7 @@ private void directlyDestroy(final VmDirectlyDestroyOnHypervisorMsg msg, final N @Override public void success(DestroyVmResponse ret) { if (!ret.isSuccess()) { - reply.setError(err(HostErrors.FAILED_TO_DESTROY_VM_ON_HYPERVISOR, ret.getError())); + reply.setError(err(ORG_ZSTACK_KVM_10042, HostErrors.FAILED_TO_DESTROY_VM_ON_HYPERVISOR, ret.getError())); } bus.reply(msg, reply); @@ -2310,7 +2311,7 @@ private void handle(KvmRunShellMsg msg) { KvmRunShellReply reply = new KvmRunShellReply(); if (result.isSshFailure()) { - reply.setError(operr("unable to connect to KVM[ip:%s, username:%s, sshPort:%d ] to do DNS check," + + reply.setError(operr(ORG_ZSTACK_KVM_10043, "unable to connect to KVM[ip:%s, username:%s, sshPort:%d ] to do DNS check," + " please check if username/password is wrong; %s", self.getManagementIp(), getSelf().getUsername(), getSelf().getPort(), result.getExitErrorMessage())); @@ -2332,7 +2333,7 @@ private void handle(final GetVmConsoleAddressFromHostMsg msg) { @Override public void success(GetVncPortResponse ret) { if (!ret.isSuccess()) { - reply.setError(operr("operation error, because:%s", ret.getError())); + reply.setError(operr(ORG_ZSTACK_KVM_10044, "operation error, because:%s", ret.getError())); } else { reply.setHostIp(self.getManagementIp()); reply.setProtocol(ret.getProtocol()); @@ -2364,7 +2365,7 @@ public void fail(ErrorCode errorCode) { private void handle(final UpdateVmPriorityMsg msg) { final UpdateVmPriorityReply reply = new UpdateVmPriorityReply(); if (self.getStatus() != HostStatus.Connected) { - reply.setError(operr("the host[uuid:%s, status:%s] is not Connected", self.getUuid(), self.getStatus())); + reply.setError(operr(ORG_ZSTACK_KVM_10045, "the host[uuid:%s, status:%s] is not Connected", self.getUuid(), self.getStatus())); bus.reply(msg, reply); return; } @@ -2375,7 +2376,7 @@ private void handle(final UpdateVmPriorityMsg msg) { @Override public void success(UpdateVmPriorityRsp ret) { if (!ret.isSuccess()) { - reply.setError(operr("operation error, because:%s", ret.getError())); + reply.setError(operr(ORG_ZSTACK_KVM_10046, "operation error, because:%s", ret.getError())); } bus.reply(msg, reply); @@ -2392,7 +2393,7 @@ public void fail(ErrorCode errorCode) { protected void handle(final CheckVmStateOnHypervisorMsg msg) { final CheckVmStateOnHypervisorReply reply = new CheckVmStateOnHypervisorReply(); if (self.getStatus() != HostStatus.Connected) { - reply.setError(operr("the host[uuid:%s, status:%s] is not Connected", self.getUuid(), self.getStatus())); + reply.setError(operr(ORG_ZSTACK_KVM_10047, "the host[uuid:%s, status:%s] is not Connected", self.getUuid(), self.getStatus())); bus.reply(msg, reply); return; } @@ -2410,7 +2411,7 @@ protected void handle(final CheckVmStateOnHypervisorMsg msg) { @Override public void success(CheckVmStateRsp ret) { if (!ret.isSuccess()) { - reply.setError(operr("operation error, because:%s", ret.getError())); + reply.setError(operr(ORG_ZSTACK_KVM_10048, "operation error, because:%s", ret.getError())); } else { Map m = new HashMap<>(); for (Map.Entry e : ret.states.entrySet()) { @@ -2462,7 +2463,7 @@ private void detachIso(final DetachIsoOnHypervisorMsg msg, final NoErrorCompleti @Override public void success(DetachIsoRsp ret) { if (!ret.isSuccess()) { - reply.setError(operr("operation error, because:%s", ret.getError())); + reply.setError(operr(ORG_ZSTACK_KVM_10049, "operation error, because:%s", ret.getError())); } bus.reply(msg, reply); @@ -2514,7 +2515,7 @@ private void attachIso(final AttachIsoOnHypervisorMsg msg, final NoErrorCompleti @Override public void success(AttachIsoRsp ret) { if (!ret.isSuccess()) { - reply.setError(operr("operation error, because:%s", ret.getError())); + reply.setError(operr(ORG_ZSTACK_KVM_10050, "operation error, because:%s", ret.getError())); } bus.reply(msg, reply); @@ -2553,7 +2554,7 @@ protected void changeVmNicState(final ChangeVmNicStateOnHypervisorMsg msg, final @Override public void success(ChangeVmNicStateRsp ret) { if (!ret.isSuccess()) { - reply.setError(operr("operation error, because:%s", ret.getError())); + reply.setError(operr(ORG_ZSTACK_KVM_10051, "operation error, because:%s", ret.getError())); } bus.reply(msg, reply); completion.done(); @@ -2616,7 +2617,7 @@ protected void detachNic(final DetachNicFromVmOnHypervisorMsg msg, final NoError @Override public void success(DetachNicRsp ret) { if (!ret.isSuccess()) { - reply.setError(operr("operation error, because:%s", ret.getError())); + reply.setError(operr(ORG_ZSTACK_KVM_10052, "operation error, because:%s", ret.getError())); } bus.reply(msg, reply); completion.done(); @@ -2724,7 +2725,7 @@ public void success(LinkedHashMap ret) { public void fail(ErrorCode err) { KVMHostAsyncHttpCallReply reply = new KVMHostAsyncHttpCallReply(); if (err.isError(SysErrors.HTTP_ERROR, SysErrors.IO_ERROR)) { - reply.setError(err(HostErrors.OPERATION_FAILURE_GC_ELIGIBLE, err, "cannot do the operation on the KVM host")); + reply.setError(err(ORG_ZSTACK_KVM_10053, HostErrors.OPERATION_FAILURE_GC_ELIGIBLE, err, "cannot do the operation on the KVM host")); } else { reply.setError(err); } @@ -2759,14 +2760,14 @@ private void mergeVolumeSnapshot(final MergeVolumeSnapshotOnKvmMsg msg, final No q.add(VmInstanceVO_.uuid, Op.EQ, volume.getVmInstanceUuid()); VmInstanceState state = q.findValue(); if (state != VmInstanceState.Stopped && state != VmInstanceState.Running && state != VmInstanceState.Paused && state != VmInstanceState.Destroyed) { - throw new OperationFailureException(operr("cannot do volume snapshot merge when vm[uuid:%s] is in state of %s." + + throw new OperationFailureException(operr(ORG_ZSTACK_KVM_10054, "cannot do volume snapshot merge when vm[uuid:%s] is in state of %s." + " The operation is only allowed when vm is Running or Stopped", volume.getUuid(), state)); } if (state == VmInstanceState.Running) { String libvirtVersion = KVMSystemTags.LIBVIRT_VERSION.getTokenByResourceUuid(self.getUuid(), KVMSystemTags.LIBVIRT_VERSION_TOKEN); if (new VersionComparator(KVMConstant.MIN_LIBVIRT_LIVE_BLOCK_COMMIT_VERSION).compare(libvirtVersion) > 0) { - throw new OperationFailureException(operr("live volume snapshot merge needs libvirt version greater than %s," + + throw new OperationFailureException(operr(ORG_ZSTACK_KVM_10055, "live volume snapshot merge needs libvirt version greater than %s," + " current libvirt version is %s. Please stop vm and redo the operation or detach the volume if it's data volume", KVMConstant.MIN_LIBVIRT_LIVE_BLOCK_COMMIT_VERSION, libvirtVersion)); } @@ -2786,7 +2787,7 @@ private void mergeVolumeSnapshot(final MergeVolumeSnapshotOnKvmMsg msg, final No @Override public void success(MergeSnapshotRsp ret) { if (!ret.isSuccess()) { - reply.setError(operr("operation error, because:%s", ret.getError())); + reply.setError(operr(ORG_ZSTACK_KVM_10056, "operation error, because:%s", ret.getError())); extEmitter.afterMergeSnapshotFailed((KVMHostInventory) getSelfInventory(), msg, cmd, reply.getError()); } extEmitter.afterMergeSnapshot((KVMHostInventory) getSelfInventory(), msg, cmd); @@ -2861,7 +2862,7 @@ private void doCheckSnapshot(final CheckSnapshotOnHypervisorMsg msg, final Compl q.add(VmInstanceVO_.uuid, SimpleQuery.Op.EQ, msg.getVmUuid()); VmInstanceState vmState = q.findValue(); if (vmState != VmInstanceState.Running && vmState != VmInstanceState.Stopped && vmState != VmInstanceState.Paused) { - throw new OperationFailureException(operr("vm[uuid:%s] is not Running or Stopped, current state[%s]", msg.getVmUuid(), vmState)); + throw new OperationFailureException(operr(ORG_ZSTACK_KVM_10057, "vm[uuid:%s] is not Running or Stopped, current state[%s]", msg.getVmUuid(), vmState)); } } @@ -2898,7 +2899,7 @@ public void run(FlowTrigger trigger, Map data) { @Override public void success(CheckSnapshotResponse ret) { if (!ret.isSuccess()) { - trigger.fail(operr("operation error, because:%s", ret.getError())); + trigger.fail(operr(ORG_ZSTACK_KVM_10058, "operation error, because:%s", ret.getError())); return; } @@ -2978,12 +2979,12 @@ private void doTakeSnapshot(final TakeSnapshotOnHypervisorMsg msg, final NoError q.add(VmInstanceVO_.uuid, SimpleQuery.Op.EQ, msg.getVmUuid()); VmInstanceState vmState = q.findValue(); if (vmState != VmInstanceState.Running && vmState != VmInstanceState.Stopped && vmState != VmInstanceState.Paused) { - throw new OperationFailureException(operr("vm[uuid:%s] is not Running or Stopped, current state[%s]", msg.getVmUuid(), vmState)); + throw new OperationFailureException(operr(ORG_ZSTACK_KVM_10059, "vm[uuid:%s] is not Running or Stopped, current state[%s]", msg.getVmUuid(), vmState)); } if (!HostSystemTags.LIVE_SNAPSHOT.hasTag(self.getUuid())) { if (vmState != VmInstanceState.Stopped) { - reply.setError(err(SysErrors.NO_CAPABILITY_ERROR, + reply.setError(err(ORG_ZSTACK_KVM_10060, SysErrors.NO_CAPABILITY_ERROR, "kvm host[uuid:%s, name:%s, ip:%s] doesn't not support live snapshot. please stop vm[uuid:%s] and try again", self.getUuid(), self.getName(), self.getManagementIp(), msg.getVmUuid() )); @@ -3036,7 +3037,7 @@ public void run(FlowTrigger trigger, Map data) { public void success(TakeSnapshotResponse ret) { if (ret.isSuccess()) { if (Objects.equals(ret.getNewVolumeInstallPath(), ret.getSnapshotInstallPath())) { - throw new OperationFailureException(Platform.inerr("SERIOUS BUG: the agent returns the " + + throw new OperationFailureException(Platform.inerr(ORG_ZSTACK_KVM_10061, "SERIOUS BUG: the agent returns the " + "same newVolumeInstallPath and snapshotInstallPath [%s], call for support immediately otherwise" + " data corruption may happen", ret.getNewVolumeInstallPath())); } @@ -3046,7 +3047,7 @@ public void success(TakeSnapshotResponse ret) { reply.setSnapshotInstallPath(ret.getSnapshotInstallPath()); reply.setSize(ret.getSize()); } else { - ErrorCode err = operr("operation error, because:%s", ret.getError()); + ErrorCode err = operr(ORG_ZSTACK_KVM_10062, "operation error, because:%s", ret.getError()); extEmitter.afterTakeSnapshotFailed((KVMHostInventory) getSelfInventory(), msg, cmd, ret, err); reply.setError(err); } @@ -3196,7 +3197,7 @@ protected void scripts() { @Override public void success(MigrateVmResponse ret) { if (!ret.isSuccess()) { - ErrorCode err = err(HostErrors.FAILED_TO_MIGRATE_VM_ON_HYPERVISOR, + ErrorCode err = err(ORG_ZSTACK_KVM_10063, HostErrors.FAILED_TO_MIGRATE_VM_ON_HYPERVISOR, "failed to migrate vm[uuid:%s] from kvm host[uuid:%s, ip:%s] to dest host[ip:%s], %s", vmUuid, srcHostUuid, srcHostMigrateIp, dstHostMigrateIp, ret.getError() ); @@ -3434,7 +3435,7 @@ private void updateNic(VmUpdateNicOnHypervisorMsg msg, NoErrorCompletion complet @Override public void success(AttachNicResponse ret) { if (!ret.isSuccess()) { - reply.setError(operr("failed to update nic[vm:%s] on kvm host[uuid:%s, ip:%s]," + + reply.setError(operr(ORG_ZSTACK_KVM_10064, "failed to update nic[vm:%s] on kvm host[uuid:%s, ip:%s]," + "because %s", msg.getVmInstanceUuid(), self.getUuid(), self.getManagementIp(), ret.getError())); } @@ -3496,11 +3497,11 @@ protected void attachNic(final VmAttachNicOnHypervisorMsg msg, final NoErrorComp public void success(AttachNicResponse ret) { if (!ret.isSuccess()) { if (ret.getError().contains("Device or resource busy")) { - reply.setError(operr("failed to attach nic[uuid:%s, vm:%s] on kvm host[uuid:%s, ip:%s]," + + reply.setError(operr(ORG_ZSTACK_KVM_10065, "failed to attach nic[uuid:%s, vm:%s] on kvm host[uuid:%s, ip:%s]," + "because %s, please try again or delete device[%s] by yourself", msg.getNicInventory().getUuid(), msg.getNicInventory().getVmInstanceUuid(), self.getUuid(), self.getManagementIp(), ret.getError(), msg.getNicInventory().getInternalName())); } else { - reply.setError(operr("failed to attach nic[uuid:%s, vm:%s] on kvm host[uuid:%s, ip:%s]," + + reply.setError(operr(ORG_ZSTACK_KVM_10066, "failed to attach nic[uuid:%s, vm:%s] on kvm host[uuid:%s, ip:%s]," + "because %s", msg.getNicInventory().getUuid(), msg.getNicInventory().getVmInstanceUuid(), self.getUuid(), self.getManagementIp(), ret.getError())); } @@ -3566,7 +3567,7 @@ protected void detachVolume(final DetachVolumeFromVmOnHypervisorMsg msg, final N @Override public void success(DetachDataVolumeResponse ret) { if (!ret.isSuccess()) { - ErrorCode err = operr("failed to detach data volume[uuid:%s, installPath:%s] from vm[uuid:%s, name:%s] on kvm host[uuid:%s, ip:%s], because %s", + ErrorCode err = operr(ORG_ZSTACK_KVM_10067, "failed to detach data volume[uuid:%s, installPath:%s] from vm[uuid:%s, name:%s] on kvm host[uuid:%s, ip:%s], because %s", vol.getUuid(), vol.getInstallPath(), vm.getUuid(), vm.getName(), getSelf().getUuid(), getSelf().getManagementIp(), ret.getError()); reply.setError(err); extEmitter.detachVolumeFailed((KVMHostInventory) getSelfInventory(), vm, vol, cmd, reply.getError()); @@ -3617,7 +3618,7 @@ private boolean allowToAttachVolumeOnHypervisor(AttachVolumeToVmOnHypervisorMsg boolean allowed = allowedOperations.isOperationAllowed(msg.getClass().getName(), state); if (!allowed) { - ErrorCode errorCode = err(VmErrors.ATTACH_VOLUME_ERROR, + ErrorCode errorCode = err(ORG_ZSTACK_KVM_10068, VmErrors.ATTACH_VOLUME_ERROR, "In the hypervisorType[%s], attach volume is not allowed in the current vm instance state[%s].", self.getHypervisorType(), state); throw new OperationFailureException(errorCode); @@ -3679,7 +3680,7 @@ protected void attachVolume(final AttachVolumeToVmOnHypervisorMsg msg, final NoE @Override public void success(AttachDataVolumeResponse ret) { if (!ret.isSuccess()) { - reply.setError(operr("failed to attach data volume[uuid:%s, installPath:%s] to vm[uuid:%s, name:%s]" + + reply.setError(operr(ORG_ZSTACK_KVM_10069, "failed to attach data volume[uuid:%s, installPath:%s] to vm[uuid:%s, name:%s]" + " on kvm host[uuid:%s, ip:%s], because %s", vol.getUuid(), vol.getInstallPath(), vm.getUuid(), vm.getName(), getSelf().getUuid(), getSelf().getManagementIp(), ret.getError())); extEmitter.attachVolumeFailed((KVMHostInventory) getSelfInventory(), vm, vol, cmd, reply.getError(), data); @@ -3724,7 +3725,7 @@ protected void destroyVm(final DestroyVmOnHypervisorMsg msg, final NoErrorComple try { extEmitter.beforeDestroyVmOnKvm(KVMHostInventory.valueOf(getSelf()), vminv, cmd); } catch (KVMException e) { - ErrorCode err = operr("failed to destroy vm[uuid:%s name:%s] on kvm host[uuid:%s, ip:%s], because %s", vminv.getUuid(), vminv.getName(), + ErrorCode err = operr(ORG_ZSTACK_KVM_10070, "failed to destroy vm[uuid:%s name:%s] on kvm host[uuid:%s, ip:%s], because %s", vminv.getUuid(), vminv.getName(), self.getUuid(), self.getManagementIp(), e.getMessage()); throw new OperationFailureException(err); } @@ -3734,7 +3735,7 @@ protected void destroyVm(final DestroyVmOnHypervisorMsg msg, final NoErrorComple public void success(DestroyVmResponse ret) { DestroyVmOnHypervisorReply reply = new DestroyVmOnHypervisorReply(); if (!ret.isSuccess()) { - reply.setError(err(HostErrors.FAILED_TO_DESTROY_VM_ON_HYPERVISOR, "unable to destroy vm[uuid:%s, name:%s] on kvm host [uuid:%s, ip:%s], because %s", vminv.getUuid(), + reply.setError(err(ORG_ZSTACK_KVM_10071, HostErrors.FAILED_TO_DESTROY_VM_ON_HYPERVISOR, "unable to destroy vm[uuid:%s, name:%s] on kvm host [uuid:%s, ip:%s], because %s", vminv.getUuid(), vminv.getName(), self.getUuid(), self.getManagementIp(), ret.getError())); extEmitter.destroyVmOnKvmFailed(KVMHostInventory.valueOf(getSelf()), vminv, reply.getError()); } else { @@ -3750,7 +3751,7 @@ public void fail(ErrorCode err) { DestroyVmOnHypervisorReply reply = new DestroyVmOnHypervisorReply(); if (err.isError(SysErrors.HTTP_ERROR, SysErrors.IO_ERROR, SysErrors.TIMEOUT)) { - err = err(HostErrors.OPERATION_FAILURE_GC_ELIGIBLE, err, "unable to destroy a vm"); + err = err(ORG_ZSTACK_KVM_10072, HostErrors.OPERATION_FAILURE_GC_ELIGIBLE, err, "unable to destroy a vm"); } reply.setError(err); @@ -3799,7 +3800,7 @@ private void rebootVm(final RebootVmOnHypervisorMsg msg, final NoErrorCompletion String err = String.format("failed to reboot vm[uuid:%s name:%s] on kvm host[uuid:%s, ip:%s], because %s", vminv.getUuid(), vminv.getName(), self.getUuid(), self.getManagementIp(), e.getMessage()); logger.warn(err, e); - throw new OperationFailureException(operr(err)); + throw new OperationFailureException(operr(ORG_ZSTACK_KVM_10073, err)); } RebootVmCmd cmd = new RebootVmCmd(); @@ -3812,7 +3813,7 @@ private void rebootVm(final RebootVmOnHypervisorMsg msg, final NoErrorCompletion public void success(RebootVmResponse ret) { RebootVmOnHypervisorReply reply = new RebootVmOnHypervisorReply(); if (!ret.isSuccess()) { - reply.setError(err(HostErrors.FAILED_TO_REBOOT_VM_ON_HYPERVISOR, "unable to reboot vm[uuid:%s, name:%s] on kvm host[uuid:%s, ip:%s], because %s", vminv.getUuid(), + reply.setError(err(ORG_ZSTACK_KVM_10074, HostErrors.FAILED_TO_REBOOT_VM_ON_HYPERVISOR, "unable to reboot vm[uuid:%s, name:%s] on kvm host[uuid:%s, ip:%s], because %s", vminv.getUuid(), vminv.getName(), self.getUuid(), self.getManagementIp(), ret.getError())); extEmitter.rebootVmOnKvmFailed(KVMHostInventory.valueOf(getSelf()), vminv, reply.getError()); } else { @@ -3857,7 +3858,7 @@ protected void stopVm(final StopVmOnHypervisorMsg msg, final NoErrorCompletion c try { extEmitter.beforeStopVmOnKvm(KVMHostInventory.valueOf(getSelf()), vminv, cmd); } catch (KVMException e) { - ErrorCode err = operr("failed to stop vm[uuid:%s name:%s] on kvm host[uuid:%s, ip:%s], because %s", vminv.getUuid(), vminv.getName(), + ErrorCode err = operr(ORG_ZSTACK_KVM_10075, "failed to stop vm[uuid:%s name:%s] on kvm host[uuid:%s, ip:%s], because %s", vminv.getUuid(), vminv.getName(), self.getUuid(), self.getManagementIp(), e.getMessage()); throw new OperationFailureException(err); } @@ -3867,7 +3868,7 @@ protected void stopVm(final StopVmOnHypervisorMsg msg, final NoErrorCompletion c public void success(StopVmResponse ret) { StopVmOnHypervisorReply reply = new StopVmOnHypervisorReply(); if (!ret.isSuccess()) { - reply.setError(err(HostErrors.FAILED_TO_STOP_VM_ON_HYPERVISOR, "unable to stop vm[uuid:%s, name:%s] on kvm host[uuid:%s, ip:%s], because %s", vminv.getUuid(), + reply.setError(err(ORG_ZSTACK_KVM_10076, HostErrors.FAILED_TO_STOP_VM_ON_HYPERVISOR, "unable to stop vm[uuid:%s, name:%s] on kvm host[uuid:%s, ip:%s], because %s", vminv.getUuid(), vminv.getName(), self.getUuid(), self.getManagementIp(), ret.getError())); logger.warn(reply.getError().getDetails()); extEmitter.stopVmOnKvmFailed(KVMHostInventory.valueOf(getSelf()), vminv, reply.getError()); @@ -3882,7 +3883,7 @@ public void success(StopVmResponse ret) { public void fail(ErrorCode err) { StopVmOnHypervisorReply reply = new StopVmOnHypervisorReply(); if (err.isError(SysErrors.IO_ERROR, SysErrors.HTTP_ERROR)) { - err = err(HostErrors.OPERATION_FAILURE_GC_ELIGIBLE, err, "unable to stop a vm"); + err = err(ORG_ZSTACK_KVM_10077, HostErrors.OPERATION_FAILURE_GC_ELIGIBLE, err, "unable to stop a vm"); } reply.setError(err); @@ -4039,7 +4040,7 @@ public void run(FlowTrigger chain, Map data) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { - ErrorCode err = operr("host[uuid:%s] capacity is not enough to offer cpu[%s], memory[%s bytes]", + ErrorCode err = operr(ORG_ZSTACK_KVM_10078, "host[uuid:%s] capacity is not enough to offer cpu[%s], memory[%s bytes]", vm.getUuid(), cpuChangeTo - oldCpuNum, alignedMemory.get() - oldMemorySize); err.setCause(reply.getError()); chain.fail(err); @@ -4147,7 +4148,7 @@ private void handle(final UpdateSpiceChannelConfigMsg msg) { @Override public void success(UpdateSpiceChannelConfigResponse ret) { if (!ret.isSuccess()) { - reply.setError(operr("Host[%s] update spice channel config faild, because %s", msg.getHostUuid(), ret.getError())); + reply.setError(operr(ORG_ZSTACK_KVM_10079, "Host[%s] update spice channel config faild, because %s", msg.getHostUuid(), ret.getError())); logger.warn(reply.getError().getDetails()); } reply.setRestartLibvirt(ret.restartLibvirt); @@ -4275,7 +4276,7 @@ static String getVolumeTOType(VolumeInventory vol) { private void checkPlatformWithOther(VmInstanceSpec spec) { int total = spec.getDestDataVolumes().size() + spec.getDestCacheVolumes().size() + spec.getCdRomSpecs().size(); if (total > 3) { - throw new OperationFailureException(operr("when the vm platform is Other, the number of dataVolumes and cdroms cannot exceed 3, currently %s", total)); + throw new OperationFailureException(operr(ORG_ZSTACK_KVM_10080, "when the vm platform is Other, the number of dataVolumes and cdroms cannot exceed 3, currently %s", total)); } } @@ -4594,7 +4595,7 @@ public void success(StartVmResponse ret) { logger.debug(info); extEmitter.startVmOnKvmSuccess(KVMHostInventory.valueOf(getSelf()), spec); } else { - reply.setError(err(HostErrors.FAILED_TO_START_VM_ON_HYPERVISOR, "failed to start vm[uuid:%s name:%s] on kvm host[uuid:%s, ip:%s], because %s", + reply.setError(err(ORG_ZSTACK_KVM_10081, HostErrors.FAILED_TO_START_VM_ON_HYPERVISOR, "failed to start vm[uuid:%s name:%s] on kvm host[uuid:%s, ip:%s], because %s", spec.getVmInventory().getUuid(), spec.getVmInventory().getName(), self.getUuid(), self.getManagementIp(), ret.getError())); logger.warn(reply.getError().getDetails()); @@ -4627,7 +4628,7 @@ public void success(StartVmResponse ret) { @Override public void fail(ErrorCode err) { StartVmOnHypervisorReply reply = new StartVmOnHypervisorReply(); - reply.setError(err(HostErrors.FAILED_TO_START_VM_ON_HYPERVISOR, "failed to start vm[uuid: %s] on kvm host[uuid: %s], because %s", + reply.setError(err(ORG_ZSTACK_KVM_10082, HostErrors.FAILED_TO_START_VM_ON_HYPERVISOR, "failed to start vm[uuid: %s] on kvm host[uuid: %s], because %s", spec.getVmInventory().getUuid(), self.getUuid(), err)); extEmitter.startVmOnKvmFailed(KVMHostInventory.valueOf(getSelf()), spec, err); bus.reply(msg, reply); @@ -4718,7 +4719,7 @@ private void pauseVm(final PauseVmOnHypervisorMsg msg, final NoErrorCompletion c @Override public void success(PauseVmResponse ret) { if (!ret.isSuccess()) { - reply.setError(err(HostErrors.FAILED_TO_STOP_VM_ON_HYPERVISOR, "unable to pause vm[uuid:%s, name:%s] on kvm host[uuid:%s, ip:%s], because %s", vminv.getUuid(), + reply.setError(err(ORG_ZSTACK_KVM_10083, HostErrors.FAILED_TO_STOP_VM_ON_HYPERVISOR, "unable to pause vm[uuid:%s, name:%s] on kvm host[uuid:%s, ip:%s], because %s", vminv.getUuid(), vminv.getName(), self.getUuid(), self.getManagementIp(), ret.getError())); logger.warn(reply.getError().getDetails()); } @@ -4769,7 +4770,7 @@ private void resumeVm(final ResumeVmOnHypervisorMsg msg, final NoErrorCompletion @Override public void success(ResumeVmResponse ret) { if (!ret.isSuccess()) { - reply.setError(err(HostErrors.FAILED_TO_STOP_VM_ON_HYPERVISOR, "unable to resume vm[uuid:%s, name:%s] on kvm host[uuid:%s, ip:%s], because %s", vminv.getUuid(), + reply.setError(err(ORG_ZSTACK_KVM_10084, HostErrors.FAILED_TO_STOP_VM_ON_HYPERVISOR, "unable to resume vm[uuid:%s, name:%s] on kvm host[uuid:%s, ip:%s], because %s", vminv.getUuid(), vminv.getName(), self.getUuid(), self.getManagementIp(), ret.getError())); logger.warn(reply.getError().getDetails()); } @@ -4794,9 +4795,9 @@ private void batchCheckPhysicalInterface(BatchCheckNetworkPhysicalInterfaceMsg m CheckPhysicalNetworkInterfaceResponse rsp = restf.syncJsonPost(checkPhysicalNetworkInterfacePath, cmd, CheckPhysicalNetworkInterfaceResponse.class); if (!rsp.isSuccess()) { if (rsp.getFailedInterfaceNames().isEmpty()) { - reply.setError(operr("operation error, because:%s", rsp.getError())); + reply.setError(operr(ORG_ZSTACK_KVM_10085, "operation error, because:%s", rsp.getError())); } else { - reply.setError(operr("failed to check physical network interfaces[names : %s] on kvm host[uuid:%s, ip:%s]", + reply.setError(operr(ORG_ZSTACK_KVM_10086, "failed to check physical network interfaces[names : %s] on kvm host[uuid:%s, ip:%s]", rsp.getFailedInterfaceNames(), context.getInventory().getUuid(), context.getInventory().getManagementIp())); } } @@ -4812,9 +4813,9 @@ private void checkPhysicalInterface(CheckNetworkPhysicalInterfaceMsg msg, NoErro CheckPhysicalNetworkInterfaceResponse rsp = restf.syncJsonPost(checkPhysicalNetworkInterfacePath, cmd, CheckPhysicalNetworkInterfaceResponse.class); if (!rsp.isSuccess()) { if (rsp.getFailedInterfaceNames().isEmpty()) { - reply.setError(operr("operation error, because:%s", rsp.getError())); + reply.setError(operr(ORG_ZSTACK_KVM_10087, "operation error, because:%s", rsp.getError())); } else { - reply.setError(operr("failed to check physical network interfaces[names : %s] on kvm host[uuid:%s, ip:%s]", + reply.setError(operr(ORG_ZSTACK_KVM_10088, "failed to check physical network interfaces[names : %s] on kvm host[uuid:%s, ip:%s]", msg.getPhysicalInterface(), context.getInventory().getUuid(), context.getInventory().getManagementIp())); } } @@ -4873,7 +4874,7 @@ private void doReconnectHostDueToPingResult(PingResponse ret) { } changeConnectionState(HostStatusEvent.disconnected); - new HostDisconnectedCanonicalEvent(self.getUuid(), argerr(info)).fire(); + new HostDisconnectedCanonicalEvent(self.getUuid(), argerr(ORG_ZSTACK_KVM_10089, info)).fire(); ReconnectHostMsg rmsg = new ReconnectHostMsg(); rmsg.setHostUuid(self.getUuid()); @@ -4900,7 +4901,7 @@ public void fail(ErrorCode err) { logger.warn(info); changeConnectionState(HostStatusEvent.disconnected); - new HostDisconnectedCanonicalEvent(self.getUuid(), argerr(info)).fire(); + new HostDisconnectedCanonicalEvent(self.getUuid(), argerr(ORG_ZSTACK_KVM_10090, info)).fire(); ReconnectHostMsg rmsg = new ReconnectHostMsg(); rmsg.setHostUuid(self.getUuid()); @@ -5004,7 +5005,7 @@ public void fail(ErrorCode err) { @Override public void success(PingResponse ret) { if (!ret.isSuccess()) { - trigger.fail(operr("%s", ret.getError())); + trigger.fail(operr(ORG_ZSTACK_KVM_10091, "%s", ret.getError())); return; } @@ -5138,7 +5139,7 @@ protected void deleteTakeOverFlag(Completion completion) { sshShell.setPort(getSelf().getPort()); SshResult ret = sshShell.runCommand(String.format("sudo /bin/sh -c \"rm -rf %s\"", hostTakeOverFlagPath)); if (ret.isSshFailure() || ret.getReturnCode() != 0) { - completion.fail(operr(ret.getExitErrorMessage())); + completion.fail(operr(ORG_ZSTACK_KVM_10092, ret.getExitErrorMessage())); return; } completion.success(); @@ -5165,7 +5166,7 @@ private ErrorCode connectToAgent() { } ConnectResponse rsp = restf.syncJsonPost(connectPath, cmd, ConnectResponse.class); if (!rsp.isSuccess()) { - errCode = operr("unable to connect to kvm host[uuid:%s, ip:%s, url:%s], because %s", + errCode = operr(ORG_ZSTACK_KVM_10093, "unable to connect to kvm host[uuid:%s, ip:%s, url:%s], because %s", self.getUuid(), self.getManagementIp(), connectPath, rsp.getError()); } else { VersionComparator libvirtVersion = new VersionComparator(rsp.getLibvirtVersion()); @@ -5185,11 +5186,11 @@ private ErrorCode connectToAgent() { } } } catch (RestClientException e) { - errCode = operr("unable to connect to kvm host[uuid:%s, ip:%s, url:%s], because %s", self.getUuid(), self.getManagementIp(), + errCode = operr(ORG_ZSTACK_KVM_10094, "unable to connect to kvm host[uuid:%s, ip:%s, url:%s], because %s", self.getUuid(), self.getManagementIp(), connectPath, e.getMessage()); } catch (Throwable t) { logger.warn(t.getMessage(), t); - errCode = inerr(t.getMessage()); + errCode = inerr(ORG_ZSTACK_KVM_10095, t.getMessage()); } return errCode; @@ -5224,7 +5225,7 @@ private void continueConnect(final ConnectHostInfo info, final Completion comple public void handle(Map data) { if (noStorageAccessible()) { ErrorCodeList errorCodeList = (ErrorCodeList) data.get(KVMConstant.CONNECT_HOST_PRIMARYSTORAGE_ERROR); - completion.fail(operr("host can not access any primary storage, %s", errorCodeList != null && StringUtils.isNotEmpty(errorCodeList.getReadableDetails()) ? errorCodeList.getReadableDetails() : "please check network")); + completion.fail(operr(ORG_ZSTACK_KVM_10096, "host can not access any primary storage, %s", errorCodeList != null && StringUtils.isNotEmpty(errorCodeList.getReadableDetails()) ? errorCodeList.getReadableDetails() : "please check network")); } else { if (CoreGlobalProperty.UNIT_TEST_ON) { completion.success(); @@ -5239,7 +5240,7 @@ public void handle(Map data) { SshResult ret = sshShell.runCommand(String.format("sudo /bin/sh -c \"echo uuid:%s > %s\"", self.getUuid(), hostTakeOverFlagPath)); if (ret.isSshFailure() || ret.getReturnCode() != 0) { - completion.fail(operr(ret.getExitErrorMessage())); + completion.fail(operr(ORG_ZSTACK_KVM_10097, ret.getExitErrorMessage())); return; } completion.success(); @@ -5248,7 +5249,7 @@ public void handle(Map data) { }).error(new FlowErrorHandler(completion) { @Override public void handle(ErrorCode errCode, Map data) { - completion.fail(err(HostErrors.CONNECTION_ERROR, errCode, "connection error for KVM host[uuid:%s, ip:%s]", self.getUuid(), + completion.fail(err(ORG_ZSTACK_KVM_10098, HostErrors.CONNECTION_ERROR, errCode, "connection error for KVM host[uuid:%s, ip:%s]", self.getUuid(), self.getManagementIp())); } }).start(); @@ -5351,7 +5352,7 @@ private boolean testPort() { private boolean ifTimeout() { if (System.currentTimeMillis() > timeout) { - trigger.fail(operr("the host[%s] ssh port[%s] not open after %s seconds, connect timeout", getSelf().getManagementIp(), getSelf().getPort(), TimeUnit.MILLISECONDS.toSeconds(sshTimeout))); + trigger.fail(operr(ORG_ZSTACK_KVM_10099, "the host[%s] ssh port[%s] not open after %s seconds, connect timeout", getSelf().getManagementIp(), getSelf().getPort(), TimeUnit.MILLISECONDS.toSeconds(sshTimeout))); return true; } else { return false; @@ -5391,7 +5392,7 @@ public void run(FlowTrigger trigger, Map data) { final ErrorCode privateKeyError = connectWithPrivateKey(); if (privateKeyError == null) { - trigger.fail(err(HostErrors.HOST_PASSWORD_HAS_BEEN_CHANGED, + trigger.fail(err(ORG_ZSTACK_KVM_10100, HostErrors.HOST_PASSWORD_HAS_BEEN_CHANGED, "host password has been changed. " + "Please update host password in management node by UpdateKVMHostAction with host UUID[%s]", self.getUuid())); @@ -5410,7 +5411,7 @@ ErrorCode connectWithSSHPassword() { final String cmd = "echo hello"; SshResult ret = sshShell.runCommand(cmd); if (ret.isSshFailure()) { - return err(HostErrors.UNABLE_TO_RECONNECT_HOST, + return err(ORG_ZSTACK_KVM_10101, HostErrors.UNABLE_TO_RECONNECT_HOST, "failed to connect host[UUID=%s] with SSH password", self.getUuid()); } return null; @@ -5426,7 +5427,7 @@ ErrorCode connectWithPrivateKey() { final String cmd = "echo hello"; SshResult ret = sshShell.runCommand(cmd); if (ret.isSshFailure()) { - return err(HostErrors.UNABLE_TO_RECONNECT_HOST, + return err(ORG_ZSTACK_KVM_10102, HostErrors.UNABLE_TO_RECONNECT_HOST, "failed to connect host[UUID=%s] with private key", self.getUuid()); } return null; @@ -5469,9 +5470,9 @@ public void run(FlowTrigger trigger, Map data) { map(e("dnsCheckList", checkList))); if (ret.isSshFailure()) { - trigger.fail(operr("unable to connect to KVM[ip:%s, username:%s, sshPort: %d, ] to do DNS check, please check if username/password is wrong; %s", self.getManagementIp(), getSelf().getUsername(), getSelf().getPort(), ret.getExitErrorMessage())); + trigger.fail(operr(ORG_ZSTACK_KVM_10103, "unable to connect to KVM[ip:%s, username:%s, sshPort: %d, ] to do DNS check, please check if username/password is wrong; %s", self.getManagementIp(), getSelf().getUsername(), getSelf().getPort(), ret.getExitErrorMessage())); } else if (ret.getReturnCode() != 0) { - trigger.fail(operr("failed to ping all DNS/IP in %s; please check /etc/resolv.conf to make sure your host is able to reach public internet", checkList)); + trigger.fail(operr(ORG_ZSTACK_KVM_10104, "failed to ping all DNS/IP in %s; please check /etc/resolv.conf to make sure your host is able to reach public internet", checkList)); } else { trigger.next(); } @@ -5506,10 +5507,10 @@ public void run(FlowTrigger trigger, Map data) { } if (ret.isSshFailure()) { - throw new OperationFailureException(operr("unable to connect to KVM[ip:%s, username:%s, sshPort:%d] to check the management node connectivity," + + throw new OperationFailureException(operr(ORG_ZSTACK_KVM_10105, "unable to connect to KVM[ip:%s, username:%s, sshPort:%d] to check the management node connectivity," + "please check if username/password is wrong; %s", self.getManagementIp(), getSelf().getUsername(), getSelf().getPort(), ret.getExitErrorMessage())); } else if (ret.getReturnCode() != 0) { - throw new OperationFailureException(operr("the KVM host[ip:%s] cannot access the management node's callback url. It seems" + + throw new OperationFailureException(operr(ORG_ZSTACK_KVM_10106, "the KVM host[ip:%s] cannot access the management node's callback url. It seems" + " that the KVM host cannot reach the management IP[%s]. %s %s", restf.getHostName(), self.getManagementIp(), ret.getStderr(), ret.getExitErrorMessage())); } @@ -5561,7 +5562,7 @@ public void run(FlowTrigger trigger, Map data) { ssh.command(String.format("grep -i ^uuid %s | sed 's/uuid://g'", hostTakeOverFlagPath)); SshResult hostRet = ssh.run(); if (hostRet.isSshFailure() || hostRet.getReturnCode() != 0) { - trigger.fail(operr("unable to Check whether the host is taken over, because %s", hostRet.getExitErrorMessage())); + trigger.fail(operr(ORG_ZSTACK_KVM_10107, "unable to Check whether the host is taken over, because %s", hostRet.getExitErrorMessage())); return; } String hostOutput = hostRet.getStdout().replaceAll("\r|\n",""); @@ -5575,7 +5576,7 @@ public void run(FlowTrigger trigger, Map data) { SshResult timeRet = ssh.run(); logger.debug(String.format("Timestamp of the flag is %s ", timeRet.getStdout())); if (timeRet.isSshFailure() || timeRet.getReturnCode() != 0) { - trigger.fail(operr("Unable to get the timestamp of the flag, because %s", timeRet.getExitErrorMessage())); + trigger.fail(operr(ORG_ZSTACK_KVM_10108, "Unable to get the timestamp of the flag, because %s", timeRet.getExitErrorMessage())); return; } String timestampOutput = timeRet.getStdout().replaceAll("\r|\n",""); @@ -5590,7 +5591,7 @@ public void run(FlowTrigger trigger, Map data) { logger.debug(String.format("hostOutput is %s ,The time difference is %d(s) ", hostOutput, diff)); if (diff < HostGlobalConfig.PING_HOST_INTERVAL.value(int.class)) { - trigger.fail(operr("the host[ip:%s] has been taken over, because the takeover flag[HostUuid:%s] already exists and utime[%d] has not exceeded host ping interval[%d]", + trigger.fail(operr(ORG_ZSTACK_KVM_10109, "the host[ip:%s] has been taken over, because the takeover flag[HostUuid:%s] already exists and utime[%d] has not exceeded host ping interval[%d]", self.getManagementIp(), hostOutput, diff, HostGlobalConfig.PING_HOST_INTERVAL.value(int.class))); return; } @@ -5599,7 +5600,7 @@ public void run(FlowTrigger trigger, Map data) { if (lastHostInv == null) { trigger.next(); } else { - trigger.fail(operr("the host[ip:%s] has been taken over, because flag[HostUuid:%s] exists in the database", + trigger.fail(operr(ORG_ZSTACK_KVM_10110, "the host[ip:%s] has been taken over, because flag[HostUuid:%s] exists in the database", self.getManagementIp(), lastHostInv.getUuid())); } } catch (Exception e) { @@ -5622,7 +5623,7 @@ private Object getHostCpuArchitectureBySsh() { SshResult ret = sshShell.runCommand("uname -m"); if (ret.isSshFailure() || ret.getReturnCode() != 0) { - return operr("unable to get host cpu architecture, please check if username/password is wrong; %s", ret.getExitErrorMessage()); + return operr(ORG_ZSTACK_KVM_10111, "unable to get host cpu architecture, please check if username/password is wrong; %s", ret.getExitErrorMessage()); } return ret.getStdout().trim(); } @@ -5649,7 +5650,7 @@ public void run(FlowTrigger trigger, Map data) { dbf.update(host); self.setArchitecture(hostArchitecture); if (cluster.getArchitecture() != null && !hostArchitecture.equals(cluster.getArchitecture()) && !cluster.getHypervisorType().equals("baremetal2")) { - trigger.fail(operr("host cpu architecture[%s] is not matched the cluster[%s]", hostArchitecture, cluster.getArchitecture())); + trigger.fail(operr(ORG_ZSTACK_KVM_10112, "host cpu architecture[%s] is not matched the cluster[%s]", hostArchitecture, cluster.getArchitecture())); return; } @@ -5866,7 +5867,7 @@ public void run(FlowTrigger trigger, Map data) { .sudoCommand(builder.toString()) .runErrorByExceptionAndClose(); } catch (SshException ex) { - throw new OperationFailureException(operr(ex.toString())); + throw new OperationFailureException(operr(ORG_ZSTACK_KVM_10113, ex.toString())); } trigger.next(); @@ -5970,7 +5971,7 @@ public void success(UpdateDependencyRsp ret) { if (ret.isSuccess()) { trigger.next(); } else { - trigger.fail(Platform.operr("%s", ret.getError())); + trigger.fail(Platform.operr(ORG_ZSTACK_KVM_10114, "%s", ret.getError())); } } @@ -5991,7 +5992,7 @@ public void fail(ErrorCode errorCode) { @Override public void run(FlowTrigger trigger, Map data) { if (!checkQemuLibvirtVersionOfHost()) { - trigger.fail(operr("host [uuid:%s] cannot be added to cluster [uuid:%s] because qemu/libvirt version does not match", + trigger.fail(operr(ORG_ZSTACK_KVM_10115, "host [uuid:%s] cannot be added to cluster [uuid:%s] because qemu/libvirt version does not match", self.getUuid(), self.getClusterUuid())); return; } @@ -6001,7 +6002,7 @@ public void run(FlowTrigger trigger, Map data) { .getTokenByResourceUuid(self.getClusterUuid(), KVMSystemTags.CHECK_CLUSTER_CPU_MODEL_TOKEN) .equals("true") && !checkCpuModelOfHost()) { - trigger.fail(operr("host [uuid:%s] cannot be added to cluster [uuid:%s] because cpu model name does not match", + trigger.fail(operr(ORG_ZSTACK_KVM_10116, "host [uuid:%s] cannot be added to cluster [uuid:%s] because cpu model name does not match", self.getUuid(), self.getClusterUuid())); return; } @@ -6011,7 +6012,7 @@ public void run(FlowTrigger trigger, Map data) { } if (KVMGlobalConfig.CHECK_HOST_CPU_MODEL_NAME.value(Boolean.class) && !checkCpuModelOfHost()) { - trigger.fail(operr("host [uuid:%s] cannot be added to cluster [uuid:%s] because cpu model name does not match", + trigger.fail(operr(ORG_ZSTACK_KVM_10117, "host [uuid:%s] cannot be added to cluster [uuid:%s] because cpu model name does not match", self.getUuid(), self.getClusterUuid())); return; } @@ -6066,12 +6067,12 @@ public void run(final FlowTrigger trigger, Map data) { @Override public void success(HostFactResponse ret) { if (!ret.isSuccess()) { - trigger.fail(operr("operation error, because:%s", ret.getError())); + trigger.fail(operr(ORG_ZSTACK_KVM_10118, "operation error, because:%s", ret.getError())); return; } if (!checkVirtualizationEnabled(ret)) { - trigger.fail(operr("cannot find either 'vmx' or 'svm' in /proc/cpuinfo, please make sure you have enabled virtualization in your BIOS setting")); + trigger.fail(operr(ORG_ZSTACK_KVM_10119, "cannot find either 'vmx' or 'svm' in /proc/cpuinfo, please make sure you have enabled virtualization in your BIOS setting")); return; } @@ -6106,7 +6107,7 @@ private void recordHardwareChangesAndCreateTag(PatternedSystemTag systemTag, Str return; } - errorCodeList.getCauses().add(operr("host[uuid:%s]'s %s changed, old:%s, new:%s", + errorCodeList.getCauses().add(operr(ORG_ZSTACK_KVM_10120, "host[uuid:%s]'s %s changed, old:%s, new:%s", self.getUuid(), systemTag.getTagFormat(), oldValue, newValue)); @@ -6223,7 +6224,7 @@ private void handle(final ShutdownHostMsg msg) { .run(chain -> handleShutdownHost(msg, new NoErrorCompletion(chain) { @Override public void done() { - new HostBase.HostDisconnectedCanonicalEvent(msg.getHostUuid(), operr("host[uuid:%s] becomes power off, send notify", + new HostBase.HostDisconnectedCanonicalEvent(msg.getHostUuid(), operr(ORG_ZSTACK_KVM_10121, "host[uuid:%s] becomes power off, send notify", msg.getHostUuid())).fire(); chain.next(); } @@ -6262,7 +6263,7 @@ public void fail(ErrorCode err) { @Override public void success(KVMAgentCommands.ShutdownHostResponse ret) { if (!ret.isSuccess()) { - reply.setError(operr("operation error, because:%s", ret.getError())); + reply.setError(operr(ORG_ZSTACK_KVM_10122, "operation error, because:%s", ret.getError())); bus.reply(msg, reply); completion.done(); return; @@ -6301,7 +6302,7 @@ public boolean run() { if (isTimeout()) { if (!msg.isReturnEarly()) { reply.setSuccess(false); - reply.setError(operr("host[%s] not shutdown in %d seconds", msg.getHostUuid(), ctimeout)); + reply.setError(operr(ORG_ZSTACK_KVM_10123, "host[%s] not shutdown in %d seconds", msg.getHostUuid(), ctimeout)); bus.reply(msg, reply); noErrorCompletion.done(); } @@ -6377,7 +6378,7 @@ public void success(CancelRsp ret) { if (ret.isSuccess()) { completion.success(); } else { - completion.fail(Platform.operr("%s", ret.getError())); + completion.fail(Platform.operr(ORG_ZSTACK_KVM_10124, "%s", ret.getError())); } } @@ -6401,7 +6402,7 @@ public void success(CheckFileOnHostResponse response) { reply.setExistPaths(response.existPaths == null ? Collections.emptyMap() : new HashMap<>(response.existPaths)); } else { logger.warn(String.format("failed to check file %s on host[uuid:%s]", msg.getPaths(), msg.getHostUuid())); - reply.setError(Platform.operr(response.getError(), + reply.setError(Platform.operr(ORG_ZSTACK_KVM_10125, response.getError(), "fail to check file %s on host[uuid:%s]", msg.getPaths(), msg.getHostUuid())); } bus.reply(msg, reply); @@ -6465,9 +6466,9 @@ public void setup() { @Override public void run(FlowTrigger trigger, Map data) { if (self.getState() == HostState.PreMaintenance) { - trigger.fail(Platform.operr("host is in the premaintenance state, cannot update os")); + trigger.fail(Platform.operr(ORG_ZSTACK_KVM_10126, "host is in the premaintenance state, cannot update os")); } else if (self.getStatus() != HostStatus.Connected) { - trigger.fail(Platform.operr("host is not in the connected status, cannot update os")); + trigger.fail(Platform.operr(ORG_ZSTACK_KVM_10127, "host is not in the connected status, cannot update os")); } else { trigger.next(); } @@ -6538,7 +6539,7 @@ public void success(UpdateHostOSRsp ret) { data.put(UPDATE_OS_RSP, ret); trigger.next(); } else { - trigger.fail(Platform.operr("%s", ret.getError())); + trigger.fail(Platform.operr(ORG_ZSTACK_KVM_10128, "%s", ret.getError())); } } @@ -6735,7 +6736,7 @@ protected void scanVmPorts(ScanVmPortMsg msg) { @Override public void success(ScanVmPortResponse ret) { if (!ret.isSuccess()) { - reply.setError(operr("operation error, because:%s", ret.getError())); + reply.setError(operr(ORG_ZSTACK_KVM_10129, "operation error, because:%s", ret.getError())); } else { reply.setStatus(ret.getPortStatus()); } @@ -6773,7 +6774,7 @@ private void doAttachVolume(AttachDataVolumeToHostMsg msg, NoErrorCompletion com @Override public void success(AttachVolumeRsp rsp) { if (!rsp.isSuccess()) { - reply.setError(operr("failed to attach volume to host, because:%s", rsp.getError())); + reply.setError(operr(ORG_ZSTACK_KVM_10130, "failed to attach volume to host, because:%s", rsp.getError())); bus.reply(msg, reply); completion.done(); return; @@ -6834,7 +6835,7 @@ private void doDetachVolume(DetachDataVolumeFromHostMsg msg, NoErrorCompletion c @Override public void success(DetachVolumeRsp rsp) { if (!rsp.isSuccess()) { - reply.setError(operr("failed to detach volume from host, because:%s", rsp.getError())); + reply.setError(operr(ORG_ZSTACK_KVM_10131, "failed to detach volume from host, because:%s", rsp.getError())); } else { new SQLBatch() { @Override @@ -6900,7 +6901,7 @@ private void doFstrimVm(FstrimVmMsg msg, NoErrorCompletion completion) { @Override public void success(VmFstrimRsp rsp) { if (!rsp.isSuccess()) { - reply.setError(operr("vm[%s] failed to fstrim, because:%s", msg.getVmUuid(), rsp.getError())); + reply.setError(operr(ORG_ZSTACK_KVM_10132, "vm[%s] failed to fstrim, because:%s", msg.getVmUuid(), rsp.getError())); } bus.reply(msg, reply); completion.done(); @@ -6972,7 +6973,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply r = reply.castReply(); AgentResponse rsp = r.toResponse(AgentResponse.class); if (!rsp.isSuccess()) { - completion.fail(operr(rsp.getError())); + completion.fail(operr(ORG_ZSTACK_KVM_10133, rsp.getError())); } else { completion.success(new UpdateVmConsolePasswordOnHypervisorReply()); } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostAsyncHttpCallReply.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostAsyncHttpCallReply.java index 09f9ee37eff..8808ce4241b 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostAsyncHttpCallReply.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostAsyncHttpCallReply.java @@ -9,6 +9,7 @@ import java.util.LinkedHashMap; import static org.zstack.core.Platform.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -39,19 +40,19 @@ public static ErrorableValue unwrap(MessageReply re if (!(reply instanceof KVMHostAsyncHttpCallReply)) { return ErrorableValue.ofErrorCode( - operr("reply[%s] is not a KVMHostAsyncHttpCallReply", reply.getClass().getSimpleName())); + operr(ORG_ZSTACK_KVM_10157, "reply[%s] is not a KVMHostAsyncHttpCallReply", reply.getClass().getSimpleName())); } final KVMHostAsyncHttpCallReply castReply = (KVMHostAsyncHttpCallReply) reply; if (castReply.response == null) { return ErrorableValue.ofErrorCode( - operr("reply[%s] return with empty response", reply.getClass().getSimpleName())); + operr(ORG_ZSTACK_KVM_10158, "reply[%s] return with empty response", reply.getClass().getSimpleName())); } final T response = castReply.toResponse(responseClass); if (!response.isSuccess()) { return ErrorableValue.ofErrorCode( - operr("%s operation failed: %s", response.getClass().getSimpleName(), response.getError())); + operr(ORG_ZSTACK_KVM_10159, "%s operation failed: %s", response.getClass().getSimpleName(), response.getError())); } return ErrorableValue.of(response); } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostDeployArguments.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostDeployArguments.java index 13e929c1d5d..71fb8a9769e 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostDeployArguments.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostDeployArguments.java @@ -6,6 +6,7 @@ import org.zstack.header.errorcode.OperationFailureException; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class KVMHostDeployArguments extends SyncTimeRequestedDeployArguments { @SerializedName("pkg_kvmagent") @@ -169,7 +170,7 @@ public void setForceRun(boolean forceRun) { public void enableForceRunWithReason(String reason) { this.forceRun = true; if (StringUtils.isEmpty(reason)) { - throw new OperationFailureException(operr("the reason must be stated when setting force run")); + throw new OperationFailureException(operr(ORG_ZSTACK_KVM_10011, "the reason must be stated when setting force run")); } logger.info(String.format("set ansible to force run, because %s", reason)); } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java index 4d4fa167b7e..acb129fe6dc 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java @@ -112,6 +112,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.kvm.KVMAgentCommands.*; import static org.zstack.kvm.KVMConstant.CPU_MODE_NONE; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class KVMHostFactory extends AbstractService implements HypervisorFactory, Component, @@ -171,7 +172,7 @@ public class KVMHostFactory extends AbstractService implements HypervisorFactory @Override public HostVO createHost(HostVO vo, AddHostMessage msg) { if (!(msg instanceof AddKVMHostMessage)) { - throw new OperationFailureException(operr("cluster[uuid:%s] hypervisorType is not %s", msg.getClusterUuid(), KVMConstant.KVM_HYPERVISOR_TYPE)); + throw new OperationFailureException(operr(ORG_ZSTACK_KVM_10000, "cluster[uuid:%s] hypervisorType is not %s", msg.getClusterUuid(), KVMConstant.KVM_HYPERVISOR_TYPE)); } AddKVMHostMessage amsg = (AddKVMHostMessage) msg; @@ -190,7 +191,7 @@ public List buildMessageFromFile(String content, ValidateFunction getHostOsMap(Collection hostUuid public ErrorCode checkNewAddedHost(HostVO vo) { final HostOperationSystem os = getHostOS(vo.getUuid()); if (!os.isValid()) { - return operr("the operation system[%s] of host[name:%s, ip:%s] is invalid", + return operr(ORG_ZSTACK_KVM_10002, "the operation system[%s] of host[name:%s, ip:%s] is invalid", os, vo.getName(), vo.getManagementIp()); } @@ -351,7 +352,7 @@ public ErrorCode checkNewAddedHost(HostVO vo) { return null; } - return operr("cluster[uuid:%s] already has host with os version[%s], but new added host[name:%s ip:%s] has different host os version[%s]", + return operr(ORG_ZSTACK_KVM_10003, "cluster[uuid:%s] already has host with os version[%s], but new added host[name:%s ip:%s] has different host os version[%s]", vo.getClusterUuid(), otherOs, vo.getName(), vo.getManagementIp(), os); } @@ -613,7 +614,7 @@ public String handleSyncHttpCall(TransmitVmOperationToMnCmd cmd) { } VmCanonicalEvents.VmCrashReportData cData = new VmCanonicalEvents.VmCrashReportData(); cData.setVmUuid(cmd.vmUuid); - cData.setReason(operr("vm[uuid:%s] crashes due to kernel error", cmd.vmUuid)); + cData.setReason(operr(ORG_ZSTACK_KVM_10004, "vm[uuid:%s] crashes due to kernel error", cmd.vmUuid)); evf.fire(VmCanonicalEvents.VM_LIBVIRT_REPORT_CRASH, cData); return null; }); @@ -747,7 +748,7 @@ public String handleSyncHttpCall(TransmitVmOperationToMnCmd cmd) { restf.registerSyncHttpCallHandler(KVMConstant.HOST_PHYSICAL_MEMORY_ECC_ERROR_ALARM_EVENT, PhysicalMemoryEccErrorAlarmEventCmd.class, cmd -> { HostCanonicalEvents.HostPhysicalMemoryEccErrorData cdata = new HostCanonicalEvents.HostPhysicalMemoryEccErrorData(); - cdata.setDetail(operr("host[uuid: %s] memory ecc triggered, detail: %s", cmd.host, cmd.detail)); + cdata.setDetail(operr(ORG_ZSTACK_KVM_10005, "host[uuid: %s] memory ecc triggered, detail: %s", cmd.host, cmd.detail)); cdata.setHostUuid(cmd.host); evf.fire(HostCanonicalEvents.HOST_PHYSICAL_MEMORY_ECC_ERROR_TRIGGERED, cdata); return null; @@ -772,7 +773,7 @@ public String handleSyncHttpCall(TransmitVmOperationToMnCmd cmd) { str.append(String.format("host[uuid:%s]'s cpu model is %s ;\n", entry.getKey(), entry.getValue())); } - throw new OperationFailureException(operr("there are still hosts not have the same cpu model, details: %s", str.toString())); + throw new OperationFailureException(operr(ORG_ZSTACK_KVM_10006, "there are still hosts not have the same cpu model, details: %s", str.toString())); } })); @@ -782,11 +783,11 @@ public String handleSyncHttpCall(TransmitVmOperationToMnCmd cmd) { try { num = Integer.parseInt(check); } catch (Exception e) { - throw new ApiMessageInterceptionException(argerr("%s must be a number", KVMSystemTags.VM_PREDEFINED_PCI_BRIDGE_NUM_TOKEN)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_KVM_10007, "%s must be a number", KVMSystemTags.VM_PREDEFINED_PCI_BRIDGE_NUM_TOKEN)); } if (num <= 0 || num > 31) { - throw new ApiMessageInterceptionException(argerr("pci bridge need a value greater than 0 and lower than 32", KVMSystemTags.VM_PREDEFINED_PCI_BRIDGE_NUM_TOKEN)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_KVM_10008, "pci bridge need a value greater than 0 and lower than 32", KVMSystemTags.VM_PREDEFINED_PCI_BRIDGE_NUM_TOKEN)); } })); @@ -829,7 +830,7 @@ public void validateSystemTag(String resourceUuid, Class resourceType, String sy .find(); if (vm != null && (vm.getState() == VmInstanceState.Running || vm.getState() == VmInstanceState.Unknown)) { - throw new OperationFailureException(argerr("vm current state[%s], " + + throw new OperationFailureException(argerr(ORG_ZSTACK_KVM_10009, "vm current state[%s], " + "modify virtioSCSI requires the vm state[%s]", vm.getState(), VmInstanceState.Stopped)); } @@ -989,7 +990,7 @@ private Map getHostsWithDiffModel(String clusterUuid) { String hostCpuModel = KVMSystemTags.CPU_MODEL_NAME.getTokenByResourceUuid(hostUuid, KVMSystemTags.CPU_MODEL_NAME_TOKEN); if (hostCpuModel == null) { - throw new OperationFailureException(operr("host[uuid:%s] does not have cpu model information, you can reconnect the host to fix it", hostUuid)); + throw new OperationFailureException(operr(ORG_ZSTACK_KVM_10010, "host[uuid:%s] does not have cpu model information, you can reconnect the host to fix it", hostUuid)); } if (diffMap.values().stream().distinct().noneMatch(model -> model.equals(hostCpuModel))) { diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2NoVlanNetworkBackend.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2NoVlanNetworkBackend.java index 9ec57078f6e..1ed462ecfcd 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2NoVlanNetworkBackend.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2NoVlanNetworkBackend.java @@ -35,6 +35,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class KVMRealizeL2NoVlanNetworkBackend implements L2NetworkRealizationExtensionPoint, KVMCompleteNicInformationExtensionPoint { private static final CLogger logger = Utils.getLogger(KVMRealizeL2NoVlanNetworkBackend.class); @@ -78,7 +79,7 @@ public void run(MessageReply reply) { CreateBridgeResponse rsp = hreply.toResponse(CreateBridgeResponse.class); if (!rsp.isSuccess()) { ErrorCode err = operr( - "failed to create bridge[%s] for l2Network[uuid:%s, type:%s] on kvm host[uuid:%s], because %s", cmd + ORG_ZSTACK_KVM_10153, "failed to create bridge[%s] for l2Network[uuid:%s, type:%s] on kvm host[uuid:%s], because %s", cmd .getBridgeName(), l2Network.getUuid(), l2Network.getType(), hostUuid, rsp.getError()); completion.fail(err); return; @@ -151,7 +152,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply hreply = reply.castReply(); KVMAgentCommands.UpdateL2NetworkResponse rsp = hreply.toResponse(KVMAgentCommands.UpdateL2NetworkResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("failed to update bridge[%s] for l2Network[uuid:%s, name:%s] on kvm host[uuid: %s], %s", + ErrorCode err = operr(ORG_ZSTACK_KVM_10154, "failed to update bridge[%s] for l2Network[uuid:%s, name:%s] on kvm host[uuid: %s], %s", cmd.getBridgeName(), newL2.getUuid(), newL2.getName(), hostUuid, rsp.getError()); completion.fail(err); return; @@ -187,7 +188,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply hreply = reply.castReply(); CheckBridgeResponse rsp = hreply.toResponse(CheckBridgeResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("failed to check bridge[%s] for l2NoVlanNetwork[uuid:%s, name:%s] on kvm host[uuid: %s], %s", + ErrorCode err = operr(ORG_ZSTACK_KVM_10155, "failed to check bridge[%s] for l2NoVlanNetwork[uuid:%s, name:%s] on kvm host[uuid: %s], %s", cmd.getBridgeName(), l2Network.getUuid(), l2Network.getName(), hostUuid, rsp.getError()); completion.fail(err); return; @@ -271,7 +272,7 @@ public void run(MessageReply reply) { DeleteBridgeResponse rsp = hreply.toResponse(DeleteBridgeResponse.class); if (!rsp.isSuccess()) { ErrorCode err = operr( - "failed to delete bridge[%s] for l2Network[uuid:%s, type:%s] on kvm host[uuid:%s], because %s", cmd + ORG_ZSTACK_KVM_10156, "failed to delete bridge[%s] for l2Network[uuid:%s, type:%s] on kvm host[uuid:%s], because %s", cmd .getBridgeName(), l2Network.getUuid(), l2Network.getType(), hostUuid, rsp.getError()); completion.fail(err); return; diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2VlanNetworkBackend.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2VlanNetworkBackend.java index 15c0214c538..74e700dd9f6 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2VlanNetworkBackend.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2VlanNetworkBackend.java @@ -31,6 +31,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class KVMRealizeL2VlanNetworkBackend implements L2NetworkRealizationExtensionPoint, KVMCompleteNicInformationExtensionPoint { private static final CLogger logger = Utils.getLogger(KVMRealizeL2VlanNetworkBackend.class); @@ -81,7 +82,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply hreply = reply.castReply(); CreateVlanBridgeResponse rsp = hreply.toResponse(CreateVlanBridgeResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("failed to create bridge[%s] for l2Network[uuid:%s, type:%s, vlan:%s] on kvm host[uuid:%s], because %s", + ErrorCode err = operr(ORG_ZSTACK_KVM_10140, "failed to create bridge[%s] for l2Network[uuid:%s, type:%s, vlan:%s] on kvm host[uuid:%s], because %s", cmd.getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2vlan.getVlan(), hostUuid, rsp.getError()); completion.fail(err); return; @@ -141,7 +142,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply hreply = reply.castReply(); CheckVlanBridgeResponse rsp = hreply.toResponse(CheckVlanBridgeResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("failed to check bridge[%s] for l2VlanNetwork[uuid:%s, name:%s] on kvm host[uuid:%s], %s", + ErrorCode err = operr(ORG_ZSTACK_KVM_10141, "failed to check bridge[%s] for l2VlanNetwork[uuid:%s, name:%s] on kvm host[uuid:%s], %s", cmd.getBridgeName(), l2vlan.getUuid(), l2vlan.getName(), hostUuid, rsp.getError()); completion.fail(err); return; @@ -192,7 +193,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply hreply = reply.castReply(); KVMAgentCommands.UpdateL2NetworkResponse rsp = hreply.toResponse(KVMAgentCommands.UpdateL2NetworkResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("failed to update bridge[%s] for l2Network[uuid:%s, name:%s] on kvm host[uuid: %s], %s", + ErrorCode err = operr(ORG_ZSTACK_KVM_10142, "failed to update bridge[%s] for l2Network[uuid:%s, name:%s] on kvm host[uuid: %s], %s", cmd.getBridgeName(), newL2.getUuid(), newL2.getName(), hostUuid, rsp.getError()); completion.fail(err); return; @@ -292,7 +293,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply hreply = reply.castReply(); DeleteVlanBridgeResponse rsp = hreply.toResponse(DeleteVlanBridgeResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("failed to delete bridge[%s] for l2Network[uuid:%s, type:%s, vlan:%s] on kvm host[uuid:%s], because %s", + ErrorCode err = operr(ORG_ZSTACK_KVM_10143, "failed to delete bridge[%s] for l2Network[uuid:%s, type:%s, vlan:%s] on kvm host[uuid:%s], because %s", cmd.getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2vlan.getVlan(), hostUuid, rsp.getError()); completion.fail(err); return; diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMSecurityGroupBackend.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMSecurityGroupBackend.java index 410c23dbc7b..f0be9f261bc 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMSecurityGroupBackend.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMSecurityGroupBackend.java @@ -22,6 +22,7 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class KVMSecurityGroupBackend implements SecurityGroupHypervisorBackend, HostAfterConnectedExtensionPoint { private static CLogger logger = Utils.getLogger(KVMSecurityGroupBackend.class); @@ -63,7 +64,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply hreply = reply.castReply(); ApplySecurityGroupRuleResponse rsp = hreply.toResponse(ApplySecurityGroupRuleResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("failed to apply rules of security group rules to kvm host[uuid:%s], because %s", hto.getHostUuid(), rsp.getError()); + ErrorCode err = operr(ORG_ZSTACK_KVM_10145, "failed to apply rules of security group rules to kvm host[uuid:%s], because %s", hto.getHostUuid(), rsp.getError()); complete.fail(err); return; } @@ -100,7 +101,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply hreply = reply.castReply(); ApplySecurityGroupRuleResponse rsp = hreply.toResponse(ApplySecurityGroupRuleResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("failed to apply rules of security group rules to kvm host[uuid:%s], because %s", hto.getHostUuid(), rsp.getError()); + ErrorCode err = operr(ORG_ZSTACK_KVM_10146, "failed to apply rules of security group rules to kvm host[uuid:%s], because %s", hto.getHostUuid(), rsp.getError()); complete.fail(err); return; } @@ -143,7 +144,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply hreply = reply.castReply(); CheckDefaultSecurityGroupResponse rsp = hreply.toResponse(CheckDefaultSecurityGroupResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("failed to check default rules of security group on kvm host[uuid:%s], because %s", hostUuid, rsp.getError()); + ErrorCode err = operr(ORG_ZSTACK_KVM_10147, "failed to check default rules of security group on kvm host[uuid:%s], because %s", hostUuid, rsp.getError()); completion.fail(err); return; } @@ -176,7 +177,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply hreply = reply.castReply(); KVMAgentCommands.UpdateGroupMemberResponse rsp = hreply.toResponse(KVMAgentCommands.UpdateGroupMemberResponse.class); if (!rsp.isSuccess()) { - completion.fail(operr("operation error, because:%s", rsp.getError())); + completion.fail(operr(ORG_ZSTACK_KVM_10148, "operation error, because:%s", rsp.getError())); return; } @@ -205,7 +206,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply hreply = reply.castReply(); CleanupUnusedRulesOnHostResponse rsp = hreply.toResponse(CleanupUnusedRulesOnHostResponse.class); if (!rsp.isSuccess()) { - completion.fail(operr("operation error, because:%s", rsp.getError())); + completion.fail(operr(ORG_ZSTACK_KVM_10149, "operation error, because:%s", rsp.getError())); return; } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KvmVmHardwareVerifyExtensionPoint.java b/plugin/kvm/src/main/java/org/zstack/kvm/KvmVmHardwareVerifyExtensionPoint.java index cf751787430..126a36bd3c5 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KvmVmHardwareVerifyExtensionPoint.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KvmVmHardwareVerifyExtensionPoint.java @@ -9,6 +9,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.kvm.KVMConstant.CPU_MODE_NONE; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class KvmVmHardwareVerifyExtensionPoint implements VmBeforeStartOnHypervisorExtensionPoint { @Autowired @@ -28,7 +29,7 @@ public void beforeStartVmOnHypervisor(VmInstanceSpec spec) { ResourceConfig cpuMode = rcf.getResourceConfig(KVMGlobalConfig.NESTED_VIRTUALIZATION.getIdentity()); if (CPU_MODE_NONE.equals(cpuMode.getResourceConfigValue(spec.getVmInventory().getUuid(), String.class))) { - throw new OperationFailureException(operr("Failed to start vm," + + throw new OperationFailureException(operr(ORG_ZSTACK_KVM_10144, "Failed to start vm," + " because can not disable vm.cpu.hypervisor.feature with vm.cpuMode none")); } } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KvmVmSyncPingTask.java b/plugin/kvm/src/main/java/org/zstack/kvm/KvmVmSyncPingTask.java index af1a8718800..b02525b99d2 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KvmVmSyncPingTask.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KvmVmSyncPingTask.java @@ -42,6 +42,7 @@ import static org.zstack.core.Platform.getReflections; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class KvmVmSyncPingTask extends VmTracer implements KVMPingAgentNoFailureExtensionPoint, KVMHostConnectExtensionPoint, MarshalReplyMessageExtensionPoint, HostConnectionReestablishExtensionPoint, HostAfterConnectedExtensionPoint, Component, @@ -92,7 +93,7 @@ public void beforeDeliveryMessage(Message msg) { if (msg instanceof VmInstanceMessage) { vmUuid = ((VmInstanceMessage) msg).getVmInstanceUuid(); } else { - throw new OperationFailureException(operr("cannot get vmUuid from msg %s", msg.getMessageName())); + throw new OperationFailureException(operr(ORG_ZSTACK_KVM_10150, "cannot get vmUuid from msg %s", msg.getMessageName())); } VmTracerCanonicalEvents.VmSkipTraceData data = new VmTracerCanonicalEvents.VmSkipTraceData(); @@ -259,7 +260,7 @@ public void run(MessageReply reply) { reportVmState(host.getUuid(), states, vmsToSkipSetHostSide, mgmtSideStates); completion.success(); } else { - ErrorCode errorCode = operr("unable to do vm sync on host[uuid:%s, ip:%s] because %s", host.getUuid(), host.getManagementIp(), ret.getError()); + ErrorCode errorCode = operr(ORG_ZSTACK_KVM_10151, "unable to do vm sync on host[uuid:%s, ip:%s] because %s", host.getUuid(), host.getManagementIp(), ret.getError()); completion.fail(errorCode); } } @@ -288,7 +289,7 @@ private void checkVmInShutdown(final List vmInShutdowns, final Map systemTags){ if(!(LdapConstant.OpenLdap.TYPE.equals(type) || LdapConstant.WindowsAD.TYPE.equals(type))){ throw new ApiMessageInterceptionException( - argerr("Wrong LdapServerType[%s], valid values: [%,%s]", type, LdapConstant.OpenLdap.TYPE, LdapConstant.WindowsAD.TYPE) + argerr(ORG_ZSTACK_LDAP_10010, "Wrong LdapServerType[%s], valid values: [%,%s]", type, LdapConstant.OpenLdap.TYPE, LdapConstant.WindowsAD.TYPE) ); } } private void validateLdapServerExist(){ if(!Q.New(LdapServerVO.class).isExists()){ - throw new ApiMessageInterceptionException(argerr("There is no LDAP/AD server in the system, Please add a LDAP/AD server first.")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_LDAP_10011, "There is no LDAP/AD server in the system, Please add a LDAP/AD server first.")); } } @@ -150,13 +151,13 @@ public ErrorCode testAddLdapServerConnection(LdapServerInventory inv) { logger.info("LDAP connection was successful"); } catch (AuthenticationException e) { logger.debug("Cannot connect to LDAP/AD server, Invalid Credentials, please checkout User DN and password", e); - return operr("Cannot connect to LDAP/AD server, Invalid Credentials, please checkout User DN and password"); + return operr(ORG_ZSTACK_LDAP_10012, "Cannot connect to LDAP/AD server, Invalid Credentials, please checkout User DN and password"); } catch (CommunicationException e) { logger.debug("Cannot connect to LDAP/AD server, communication false, please checkout IP, port and Base DN", e); - return operr("Cannot connect to LDAP/AD server, communication false, please checkout IP, port and Base DN"); + return operr(ORG_ZSTACK_LDAP_10013, "Cannot connect to LDAP/AD server, communication false, please checkout IP, port and Base DN"); } catch (Exception e) { logger.debug("Cannot connect to LDAP/AD server", e); - return operr("Cannot connect to LDAP/AD server, %s", e.toString()); + return operr(ORG_ZSTACK_LDAP_10014, "Cannot connect to LDAP/AD server, %s", e.toString()); } return null; diff --git a/plugin/ldap/src/main/java/org/zstack/ldap/LdapManagerImpl.java b/plugin/ldap/src/main/java/org/zstack/ldap/LdapManagerImpl.java index 233460005a1..e6fc66d3d70 100755 --- a/plugin/ldap/src/main/java/org/zstack/ldap/LdapManagerImpl.java +++ b/plugin/ldap/src/main/java/org/zstack/ldap/LdapManagerImpl.java @@ -49,6 +49,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by miao on 16-9-6. @@ -180,7 +181,7 @@ private void handle(APIAddLdapServerMsg msg) { if (Q.New(LdapServerVO.class) .eq(LdapServerVO_.scope, msg.getScope()) .count() == 1) { - evt.setError(err(LdapErrors.MORE_THAN_ONE_LDAP_SERVER, + evt.setError(err(ORG_ZSTACK_LDAP_10000, LdapErrors.MORE_THAN_ONE_LDAP_SERVER, "There has been a LDAP/AD server record. " + "You'd better remove it before adding a new one!")); bus.publish(evt); @@ -385,7 +386,7 @@ private void handle(APICreateLdapBindingMsg msg) { sq.add(AccountVO_.uuid, SimpleQuery.Op.EQ, msg.getAccountUuid()); AccountVO avo = sq.find(); if (avo == null) { - evt.setError(err(LdapErrors.CANNOT_FIND_ACCOUNT, + evt.setError(err(ORG_ZSTACK_LDAP_10001, LdapErrors.CANNOT_FIND_ACCOUNT, String.format("cannot find the specified account[uuid:%s]", msg.getAccountUuid()))); bus.publish(evt); return; @@ -397,7 +398,7 @@ private void handle(APICreateLdapBindingMsg msg) { LdapTemplateContextSource ldapTemplateContextSource = ldapUtil.readLdapServerConfiguration(); String fullDn = msg.getLdapUid(); if (!ldapUtil.validateDnExist(ldapTemplateContextSource, fullDn)) { - throw new OperationFailureException(err(LdapErrors.UNABLE_TO_GET_SPECIFIED_LDAP_UID, + throw new OperationFailureException(err(ORG_ZSTACK_LDAP_10002, LdapErrors.UNABLE_TO_GET_SPECIFIED_LDAP_UID, "cannot find dn[%s] on LDAP/AD server[Address:%s, BaseDN:%s].", fullDn, String.join(", ", ldapTemplateContextSource.getLdapContextSource().getUrls()), ldapTemplateContextSource.getLdapContextSource().getBaseLdapPathAsString())); @@ -407,7 +408,7 @@ private void handle(APICreateLdapBindingMsg msg) { logger.info(String.format("create ldap binding[ldapUid=%s, ldapUseAsLoginName=%s] success", fullDn, ldapUseAsLoginName)); } catch (PersistenceException e) { if (ExceptionDSL.isCausedBy(e, SQLIntegrityConstraintViolationException.class)) { - evt.setError(err(LdapErrors.BIND_SAME_LDAP_UID_TO_MULTI_ACCOUNT, + evt.setError(err(ORG_ZSTACK_LDAP_10003, LdapErrors.BIND_SAME_LDAP_UID_TO_MULTI_ACCOUNT, "The ldap uid has been bound to an account. ")); } else { throw e; @@ -485,7 +486,7 @@ private void handle(APIUpdateLdapServerMsg msg) { LdapServerVO ldapServerVO = dbf.findByUuid(msg.getLdapServerUuid(), LdapServerVO.class); if (ldapServerVO == null) { - evt.setError(err(LdapErrors.UNABLE_TO_GET_SPECIFIED_LDAP_SERVER_RECORD, + evt.setError(err(ORG_ZSTACK_LDAP_10004, LdapErrors.UNABLE_TO_GET_SPECIFIED_LDAP_SERVER_RECORD, "Cannot find the specified LDAP/AD server[uuid:%s] in database.", msg.getLdapServerUuid())); bus.publish(evt); @@ -538,7 +539,7 @@ public LoginType getLoginType() { public void login(LoginContext loginContext, ReturnValueCompletion completion) { String ldapLoginName = loginContext.getUsername(); if (!isValid(ldapLoginName, loginContext.getPassword())) { - completion.fail(err(IdentityErrors.AUTHENTICATION_ERROR, + completion.fail(err(ORG_ZSTACK_LDAP_10005, IdentityErrors.AUTHENTICATION_ERROR, "Login validation failed in LDAP")); return; } @@ -548,7 +549,7 @@ public void login(LoginContext loginContext, ReturnValueCompletion searchLdapEntry(String ldapServerUuid, String filter, Intege } } - throw new OperationFailureException(operr("query ldap entry[filter: %s] fail, because %s", filter, errorMessage)); + throw new OperationFailureException(operr(ORG_ZSTACK_LDAP_10017, "query ldap entry[filter: %s] fail, because %s", filter, errorMessage)); } /** @@ -799,7 +800,7 @@ protected Object doMapFromContext(DirContextOperations ctx) { dn = result.get(0).toString(); } else if (result.size() > 1) { throw new OperationFailureException(err( - LdapErrors.UNABLE_TO_GET_SPECIFIED_LDAP_UID, "More than one ldap search result")); + ORG_ZSTACK_LDAP_10018, LdapErrors.UNABLE_TO_GET_SPECIFIED_LDAP_UID, "More than one ldap search result")); } else { return ""; } @@ -807,7 +808,7 @@ protected Object doMapFromContext(DirContextOperations ctx) { } catch (NamingException e) { LdapServerVO ldapServerVO = getLdapServer(); throw new OperationFailureException(err( - LdapErrors.UNABLE_TO_GET_SPECIFIED_LDAP_UID, "You'd better check the LDAP/AD server[url:%s, baseDN:%s, encryption:%s, username:%s, password:******]" + + ORG_ZSTACK_LDAP_10019, LdapErrors.UNABLE_TO_GET_SPECIFIED_LDAP_UID, "You'd better check the LDAP/AD server[url:%s, baseDN:%s, encryption:%s, username:%s, password:******]" + " configuration and test connection first.getDn error filter:%s", ldapServerVO.getUrl(), ldapServerVO.getBase(), ldapServerVO.getEncryption(), ldapServerVO.getUsername(), filter)); diff --git a/plugin/ldap/src/main/java/org/zstack/ldap/externalSearch/AggregateSearch.java b/plugin/ldap/src/main/java/org/zstack/ldap/externalSearch/AggregateSearch.java index 27a46b42ce2..9f8d4a8b620 100644 --- a/plugin/ldap/src/main/java/org/zstack/ldap/externalSearch/AggregateSearch.java +++ b/plugin/ldap/src/main/java/org/zstack/ldap/externalSearch/AggregateSearch.java @@ -18,6 +18,7 @@ import java.util.*; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class AggregateSearch implements LdapExternalSearchExtensionPoint { private static final CLogger logger = Utils.getLogger(AggregateSearch.class); @@ -49,7 +50,7 @@ protected Object doMapFromContext(DirContextOperations ctx) { } } catch (javax.naming.NamingException e){ logger.error("query ldap entry attributes fail", e.getCause()); - throw new OperationFailureException(operr("query ldap entry fail, %s", e.toString())); + throw new OperationFailureException(operr(ORG_ZSTACK_LDAP_EXTERNALSEARCH_10000, "query ldap entry fail, %s", e.toString())); } return result; diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerApiInterceptor.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerApiInterceptor.java index ea1168da036..97b88c919c2 100755 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerApiInterceptor.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerApiInterceptor.java @@ -56,6 +56,7 @@ import static org.zstack.network.service.lb.LoadBalancerConstants.*; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 8/12/2015. @@ -177,7 +178,7 @@ private void validate(APIGetCandidateVmNicsForLoadBalancerServerGroupMsg msg) { msg.setLoadBalancerUuid(groupVO.getLoadBalancerUuid()); } else if (msg.getLoadBalancerUuid() == null) { throw new ApiMessageInterceptionException( - operr("could not get candidate vmnic, because both load balancer uuid and server group uuid are not specified")); + operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10028, "could not get candidate vmnic, because both load balancer uuid and server group uuid are not specified")); } if (msg.getIpVersion() == null) { @@ -199,7 +200,7 @@ private void validate(APIGetCandidateL3NetworksForServerGroupMsg msg) { msg.setLoadBalancerUuid(groupVO.getLoadBalancerUuid()); } else if (msg.getLoadBalancerUuid() == null) { throw new ApiMessageInterceptionException( - operr("could not get candidate l3 network, because both load balancer uuid and server group uuid are not specified")); + operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10029, "could not get candidate l3 network, because both load balancer uuid and server group uuid are not specified")); } } @@ -223,7 +224,7 @@ private void validate(APIRemoveVmNicFromLoadBalancerMsg msg) { LoadBalancerServerGroupVO groupVO = lbMgr.getDefaultServerGroup(listenerVO); if (groupVO == null) { throw new ApiMessageInterceptionException( - operr("could not detach vm nic to load balancer listener[uuid:%s], because default server group for listener has been deleted", + operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10030, "could not detach vm nic to load balancer listener[uuid:%s], because default server group for listener has been deleted", msg.getListenerUuid())); } @@ -232,13 +233,13 @@ private void validate(APIRemoveVmNicFromLoadBalancerMsg msg) { private void validate(APICreateLoadBalancerMsg msg) { if (StringUtils.isEmpty(msg.getVipUuid()) && StringUtils.isEmpty(msg.getIpv6VipUuid())) { - throw new ApiMessageInterceptionException(argerr("could not create loadbalancer, because param of vip and ipv6 vip is empty")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10031, "could not create loadbalancer, because param of vip and ipv6 vip is empty")); } List l3Uuids = Q.New(VipVO.class).select(VipVO_.l3NetworkUuid).in(VipVO_.uuid, Arrays.asList(msg.getIpv6VipUuid(), msg.getVipUuid())).listValues(); int countOfL3 = l3Uuids.stream().distinct().collect(Collectors.toList()).size(); if (countOfL3 > 1) { - throw new ApiMessageInterceptionException(argerr("could not create loadbalancer, because l3 network of vip and ipv6 vip are not the same l3 network")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10032, "could not create loadbalancer, because l3 network of vip and ipv6 vip are not the same l3 network")); } if (!StringUtils.isEmpty(msg.getVipUuid())) { @@ -255,7 +256,7 @@ private void validateVipOfLoadBalancer(int vipIpVersion, String vipUuid) { if(useFor != null && !useFor.isEmpty()){ VipUseForList useForList = new VipUseForList(useFor); if(!useForList.validateNewAdded(LoadBalancerConstants.LB_NETWORK_SERVICE_TYPE_STRING)){ - throw new ApiMessageInterceptionException(argerr("the vip[uuid:%s] has been occupied other network service entity[%s]", vipUuid, useForList.toString())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10033, "the vip[uuid:%s] has been occupied other network service entity[%s]", vipUuid, useForList.toString())); } } @@ -273,14 +274,14 @@ private void validateVipOfLoadBalancer(int vipIpVersion, String vipUuid) { String firstIp = NetworkUtils.longToIpv4String(NetworkUtils.ipv4StringToLong(subnet.getLowAddress()) - 1); String lastIp = NetworkUtils.longToIpv4String(NetworkUtils.ipv4StringToLong(subnet.getHighAddress()) + 1); if (vipVO.getIp().equals(firstIp) || vipVO.getIp().equals(lastIp)) { - throw new ApiMessageInterceptionException(argerr("Load balancer VIP [%s] cannot be the first or the last IP of the CIDR with the public address pool type", vipVO.getIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10034, "Load balancer VIP [%s] cannot be the first or the last IP of the CIDR with the public address pool type", vipVO.getIp())); } } else { - throw new ApiMessageInterceptionException(argerr("cloud not create loadbalancer, because param vipUuid point to VIP[%s] is not ipv4 VIP", vipVO.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10035, "cloud not create loadbalancer, because param vipUuid point to VIP[%s] is not ipv4 VIP", vipVO.getUuid())); } } else if (IPv6Constants.IPv6 == vipIpVersion) { if (!IPv6NetworkUtils.isIpv6Address(vipVO.getIp())) { - throw new ApiMessageInterceptionException(argerr("cloud not create loadbalancer, because param ipv6VipUuid point to VIP[%s] is not ipv6 VIP", vipVO.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10036, "cloud not create loadbalancer, because param ipv6VipUuid point to VIP[%s] is not ipv6 VIP", vipVO.getUuid())); } } } @@ -310,31 +311,31 @@ private void validateIp(String ips, AccessControlListVO acl) { DebugUtils.Assert(acl != null, "the invalide null AccessControlListVO"); Integer ipVer = acl.getIpVersion(); if (!ipVer.equals(IPv6Constants.IPv4)) { - throw new ApiMessageInterceptionException(argerr("operation failure, not support the ip version %d", ipVer)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10037, "operation failure, not support the ip version %d", ipVer)); } try { RangeSet ipRanges = IpRangeSet.listAllRanges(ips); String[] ipcount = ips.split(IP_SPLIT); if (ipRanges.asRanges().size() < ipcount.length) { - throw new ApiMessageInterceptionException(argerr("operation failure, duplicate/overlap ip entry in %s of accesscontrol list group:%s", ips, acl.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10038, "operation failure, duplicate/overlap ip entry in %s of accesscontrol list group:%s", ips, acl.getUuid())); } for (Range range : ipRanges.asRanges()) { final Range frange = ContiguousSet.create(range, DiscreteDomain.longs()).range(); String startIp = NetworkUtils.longToIpv4String(frange.lowerEndpoint()); String endIp = NetworkUtils.longToIpv4String(frange.upperEndpoint()); if (!validateIpRange(startIp, endIp)) { - throw new ApiMessageInterceptionException(argerr("operation failure, ip format only supports ip/iprange/cidr, but find %s", ips)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10039, "operation failure, ip format only supports ip/iprange/cidr, but find %s", ips)); } ipRanges.asRanges().stream().forEach(r -> { if (!frange.equals(r) && NetworkUtils.isIpv4RangeOverlap(startIp, endIp, NetworkUtils.longToIpv4String(r.lowerEndpoint()), NetworkUtils.longToIpv4String(r.upperEndpoint()))) { - throw new ApiMessageInterceptionException(argerr("ip range[%s, %s] is overlap with start ip:%s, end ip: %s of access-control-list group:%s", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10040, "ip range[%s, %s] is overlap with start ip:%s, end ip: %s of access-control-list group:%s", startIp, endIp, NetworkUtils.longToIpv4String(r.lowerEndpoint()), NetworkUtils.longToIpv4String(r.upperEndpoint()), acl.getUuid())); } }); } } catch (IllegalArgumentException e) { - throw new ApiMessageInterceptionException(argerr("Invalid rule expression, the detail: %s", e.getMessage())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10041, "Invalid rule expression, the detail: %s", e.getMessage())); } } @@ -349,7 +350,7 @@ private void validateAcl(List newAclUuids, List oriAclUuids, Str /*check if the ip version is same*/ List aclUuids = acls.stream().filter(acl -> !acl.getIpVersion().equals(NetworkUtils.getIpversion(vip.getIp()))).map(AccessControlListVO::getUuid).collect(Collectors.toList()); if (!aclUuids.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("Can't attach the type access-control-list group[%s] whose ip version is different with LoadBalancer[%s]", aclUuids, lbUuid)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10042, "Can't attach the type access-control-list group[%s] whose ip version is different with LoadBalancer[%s]", aclUuids, lbUuid)); } List allAcl = acls; @@ -424,7 +425,7 @@ private void validate(APIAddAccessControlListRedirectRuleMsg msg) { for (AccessControlListEntryVO aclEntry : aclEntries) { if (StringDSL.equals(msg.getDomain(), aclEntry.getDomain())) { if (StringDSL.equals(msg.getUrl(), aclEntry.getUrl())) { - throw new ApiMessageInterceptionException(argerr("domian[%s], url[%s] duplicate/overlap redirect rule with access-control-list group:%s", aclEntry.getDomain(), aclEntry.getUrl(), acl.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10043, "domian[%s], url[%s] duplicate/overlap redirect rule with access-control-list group:%s", aclEntry.getDomain(), aclEntry.getUrl(), acl.getUuid())); } } } @@ -442,17 +443,17 @@ private void validate(APIAddAccessControlListToLoadBalancerMsg msg) { if (!aclEntriesType.isEmpty()) { boolean ipEntryExsit = aclEntriesType.stream().anyMatch(entry -> entry.equals(AclEntryType.IpEntry.toString())); if (ipEntryExsit) { - throw new ApiMessageInterceptionException(argerr("access-control-list groups[uuid:%s] use to redirect, but there some access-control-list not has redirect rule but ip entry", msg.getAclUuids())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10044, "access-control-list groups[uuid:%s] use to redirect, but there some access-control-list not has redirect rule but ip entry", msg.getAclUuids())); } } if (msg.getServerGroupUuids() == null || msg.getServerGroupUuids().isEmpty()) { - throw new ApiMessageInterceptionException(argerr("redirect access-control-list groups[uuid:%s] cannot only attach to load balancer listener, must assign server group", msg.getAclUuids())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10045, "redirect access-control-list groups[uuid:%s] cannot only attach to load balancer listener, must assign server group", msg.getAclUuids())); } String protocol = Q.New(LoadBalancerListenerVO.class).select(LoadBalancerListenerVO_.protocol).eq(LoadBalancerListenerVO_.uuid, msg.getListenerUuid()).findValue(); if (StringUtils.isBlank(protocol) || (!protocol.equals(LB_PROTOCOL_HTTPS) && !protocol.equals(LB_PROTOCOL_HTTP))) { - throw new ApiMessageInterceptionException(argerr("access-control-list groups[uuid:%s] attach to load balancer listener[uuid:%s] not https or http", msg.getAclUuids(), msg.getListenerUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10046, "access-control-list groups[uuid:%s] attach to load balancer listener[uuid:%s] not https or http", msg.getAclUuids(), msg.getListenerUuid())); } /*filter the server group own acl and server group not attach to listen*/ @@ -460,7 +461,7 @@ private void validate(APIAddAccessControlListToLoadBalancerMsg msg) { List sgUuids = Q.New(LoadBalancerListenerServerGroupRefVO.class).eq(LoadBalancerListenerServerGroupRefVO_.listenerUuid, msg.getListenerUuid()).select(LoadBalancerListenerServerGroupRefVO_.serverGroupUuid).listValues(); List newSgUuids = msg.getServerGroupUuids().stream().filter(sg -> sgUuids.contains(sg)).collect(Collectors.toList()); if (newSgUuids.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("server group[%s] not attach to load balancer listener[%s]", msg.getServerGroupUuids(), msg.getListenerUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10047, "server group[%s] not attach to load balancer listener[%s]", msg.getServerGroupUuids(), msg.getListenerUuid())); } msg.setServerGroupUuids(newSgUuids); @@ -471,7 +472,7 @@ private void validate(APIAddAccessControlListToLoadBalancerMsg msg) { List aclTmp = Q.New(AccessControlListEntryVO.class).in(AccessControlListEntryVO_.aclUuid, msg.getAclUuids()).select(AccessControlListEntryVO_.aclUuid).eq(AccessControlListEntryVO_.type, AclEntryType.RedirectRule.toString()).listValues(); List aclOwnRedirectRuleUuids = msg.getAclUuids().stream().filter(aclUuid -> aclTmp.contains(aclUuid)).collect(Collectors.toList()); if (aclOwnRedirectRuleUuids.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("access-control-list groups[uuid:%s] has no redirect rule", msg.getAclUuids())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10048, "access-control-list groups[uuid:%s] has no redirect rule", msg.getAclUuids())); } msg.setAclUuids(aclOwnRedirectRuleUuids); @@ -484,7 +485,7 @@ private void validate(APIAddAccessControlListToLoadBalancerMsg msg) { } if (msg.getAclUuids().isEmpty()) { - throw new ApiMessageInterceptionException(argerr("access-control-list groups[uuid:%s] has attach to another load balancer listener[uuid:%s]", msg.getAclUuids(), msg.getListenerUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10049, "access-control-list groups[uuid:%s] has attach to another load balancer listener[uuid:%s]", msg.getAclUuids(), msg.getListenerUuid())); } List aclUuids = Q.New(LoadBalancerListenerACLRefVO.class).eq(LoadBalancerListenerACLRefVO_.listenerUuid, msg.getListenerUuid()) @@ -496,7 +497,7 @@ private void validate(APIAddAccessControlListToLoadBalancerMsg msg) { List newAclUuids = msg.getAclUuids().stream().filter(aclUuid -> !aclUuids.contains(aclUuid)).collect(Collectors.toList()); if (!newAclUuids.isEmpty()) { if (newAclUuids.size() + size > LoadBalancerGlobalConfig.ACL_REDIRECT_MAX_COUNT.value(Long.class)) { - throw new ApiMessageInterceptionException(argerr("the load balancer listener[uuid:%s] can't attach more than %d redirect rule access-control-list groups", msg.getListenerUuid(), LoadBalancerGlobalConfig.ACL_REDIRECT_MAX_COUNT.value(Long.class))); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10050, "the load balancer listener[uuid:%s] can't attach more than %d redirect rule access-control-list groups", msg.getListenerUuid(), LoadBalancerGlobalConfig.ACL_REDIRECT_MAX_COUNT.value(Long.class))); } //check if exist duplicate rule @@ -522,19 +523,19 @@ private void validate(APIAddAccessControlListToLoadBalancerMsg msg) { } } if (msg.getAclUuids().isEmpty()) { - throw new ApiMessageInterceptionException(argerr("load balancer listener [uuid:%s] had redirect rule of access-control-list groups[uuid:%s]", msg.getListenerUuid(), redireRuleExistAclUuid)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10051, "load balancer listener [uuid:%s] had redirect rule of access-control-list groups[uuid:%s]", msg.getListenerUuid(), redireRuleExistAclUuid)); } } } else { if (msg.getAclUuids().size() + size > LoadBalancerGlobalConfig.ACL_REDIRECT_MAX_COUNT.value(Long.class)) { - throw new ApiMessageInterceptionException(argerr("the load balancer listener[uuid:%s] can't attach more than %d redirect rule access-control-list groups", msg.getListenerUuid(), LoadBalancerGlobalConfig.ACL_REDIRECT_MAX_COUNT.value(Long.class))); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10052, "the load balancer listener[uuid:%s] can't attach more than %d redirect rule access-control-list groups", msg.getListenerUuid(), LoadBalancerGlobalConfig.ACL_REDIRECT_MAX_COUNT.value(Long.class))); } } } else { if (!aclEntriesType.isEmpty()) { boolean ipEntryExsit = aclEntriesType.stream().anyMatch(entry -> entry.equals(AclEntryType.RedirectRule.toString())); if (ipEntryExsit) { - throw new ApiMessageInterceptionException(argerr("access-control-list groups[uuid:%s] use to %s, but there some access-control-list not has ip entry but redirect rule", msg.getAclType(), msg.getAclUuids())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10053, "access-control-list groups[uuid:%s] use to %s, but there some access-control-list not has ip entry but redirect rule", msg.getAclType(), msg.getAclUuids())); } } @@ -543,18 +544,18 @@ private void validate(APIAddAccessControlListToLoadBalancerMsg msg) { /*check if duplicated*/ List existingAcls = refVOs.stream().filter(vo -> msg.getAclUuids().contains(vo.getAclUuid())).map(vo -> vo.getAclUuid()).collect(Collectors.toList()); if (!existingAcls.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("the access-control-list groups[uuid:%s] are already on the load balancer listener[uuid:%s]", existingAcls, msg.getListenerUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10054, "the access-control-list groups[uuid:%s] are already on the load balancer listener[uuid:%s]", existingAcls, msg.getListenerUuid())); } /*when use for white list or black list, check if type is same*/ LoadBalancerAclType type = refVOs.get(0).getType(); if (!type.equals(LoadBalancerAclType.valueOf(msg.getAclType()))) { - throw new ApiMessageInterceptionException(argerr("the load balancer listener[uuid:%s] just only attach the %s type access-control-list group", msg.getListenerUuid(), type.toString())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10055, "the load balancer listener[uuid:%s] just only attach the %s type access-control-list group", msg.getListenerUuid(), type.toString())); } } if (msg.getAclUuids().size() + refVOs.size() > LoadBalancerGlobalConfig.ACL_MAX_COUNT.value(Long.class)) { - throw new ApiMessageInterceptionException(argerr("the load balancer listener[uuid:%s] can't attach more than %d access-control-list groups", msg.getListenerUuid(), LoadBalancerGlobalConfig.ACL_MAX_COUNT.value(Long.class))); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10056, "the load balancer listener[uuid:%s] can't attach more than %d access-control-list groups", msg.getListenerUuid(), LoadBalancerGlobalConfig.ACL_MAX_COUNT.value(Long.class))); } String lbUuid = Q.New(LoadBalancerListenerVO.class).select(LoadBalancerListenerVO_.loadBalancerUuid).eq(LoadBalancerListenerVO_.uuid, msg.getListenerUuid()).findValue(); @@ -575,7 +576,7 @@ private void validate(APIChangeAccessControlListServerGroupMsg msg) { List newSgUuids = msg.getServerGroupUuids().stream().filter(sg -> sgUuids.contains(sg)).collect(Collectors.toList()); if (newSgUuids.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("server group[%s] not attach to load balancer listener[%s]", msg.getServerGroupUuids(), msg.getListenerUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10057, "server group[%s] not attach to load balancer listener[%s]", msg.getServerGroupUuids(), msg.getListenerUuid())); } msg.setServerGroupUuids(newSgUuids); @@ -583,7 +584,7 @@ private void validate(APIChangeAccessControlListServerGroupMsg msg) { for (LoadBalancerListenerACLRefVO ref : refVOs) { if (!ref.getListenerUuid().equals(msg.getListenerUuid())) { - throw new ApiMessageInterceptionException(argerr("acl[%s] not attach to load balancer listener[%s]", msg.getAclUuid(), msg.getListenerUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10058, "acl[%s] not attach to load balancer listener[%s]", msg.getAclUuid(), msg.getListenerUuid())); } } } @@ -605,7 +606,7 @@ private void validate(APIAddVmNicToLoadBalancerMsg msg) { l3Uuids.removeAll(networksAttachedLbService); if (l3Uuids.size() > 0) { throw new ApiMessageInterceptionException( - operr("L3 networks[uuids:%s] of the vm nics has no network service[%s] enabled", + operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10059, "L3 networks[uuids:%s] of the vm nics has no network service[%s] enabled", l3Uuids, LoadBalancerConstants.LB_NETWORK_SERVICE_TYPE_STRING)); } @@ -615,7 +616,7 @@ private void validate(APIAddVmNicToLoadBalancerMsg msg) { List oldL3Uuids = groupVO.getLoadBalancerServerGroupVmNicRefs().stream().map(LoadBalancerServerGroupVmNicRefVO::getVmNicUuid).collect(Collectors.toList()); for (String nicUuid : msg.getVmNicUuids()) { if (oldL3Uuids.contains(nicUuid)) { - throw new ApiMessageInterceptionException(operr("could not attach vm nic to load balancer listener, because the vm nic[uuid:%s] are already on the default server group [uuid:%s]", nicUuid, groupVO.getUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10060, "could not attach vm nic to load balancer listener, because the vm nic[uuid:%s] are already on the default server group [uuid:%s]", nicUuid, groupVO.getUuid())); } } } @@ -687,7 +688,7 @@ private void validate(APICreateLoadBalancerListenerMsg msg) { if (msg.getProtocol().equals(LB_PROTOCOL_UDP)) { if (!StringUtils.isEmpty(lbVO.getVipUuid()) && !StringUtils.isEmpty(lbVO.getIpv6VipUuid())) { throw new ApiMessageInterceptionException( - operr("can not create listener because udp listener can not have both ipv4 and ipv6 vip", + operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10061, "can not create listener because udp listener can not have both ipv4 and ipv6 vip", msg.getProtocol(), msg.getHealthCheckProtocol())); } } @@ -701,13 +702,13 @@ private void validate(APICreateLoadBalancerListenerMsg msg) { if (LoadBalancerConstants.LB_PROTOCOL_UDP.equals(msg.getProtocol()) && !LoadBalancerConstants.HEALTH_CHECK_TARGET_PROTOCL_UDP.equals(msg.getHealthCheckProtocol()) || !LoadBalancerConstants.LB_PROTOCOL_UDP.equals(msg.getProtocol()) && LoadBalancerConstants.HEALTH_CHECK_TARGET_PROTOCL_UDP.equals(msg.getHealthCheckProtocol())) { throw new ApiMessageInterceptionException( - operr("the listener with protocol [%s] doesn't support this health check:[%s]", + operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10062, "the listener with protocol [%s] doesn't support this health check:[%s]", msg.getProtocol(), msg.getHealthCheckProtocol())); } if (LoadBalancerConstants.HEALTH_CHECK_TARGET_PROTOCL_HTTP.equals(msg.getHealthCheckProtocol())) { if (msg.getHealthCheckURI() == null) { throw new ApiMessageInterceptionException( - operr("the http health check protocol must be specified its healthy checking parameter healthCheckURI")); + operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10063, "the http health check protocol must be specified its healthy checking parameter healthCheckURI")); } if (msg.getHealthCheckMethod() == null) { @@ -716,7 +717,7 @@ private void validate(APICreateLoadBalancerListenerMsg msg) { } if (msg.getHealthCheckHttpCode() != null && !verifyHttpCode(msg.getHealthCheckHttpCode())) { throw new ApiMessageInterceptionException( - operr("the http health check protocol's expecting code [%s] is invalidate", msg.getHealthCheckHttpCode())); + operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10064, "the http health check protocol's expecting code [%s] is invalidate", msg.getHealthCheckHttpCode())); } } @@ -735,7 +736,7 @@ private void validate(APICreateLoadBalancerListenerMsg msg) { if (msg.getAclUuids() != null) { if (msg.getAclUuids().size() > LoadBalancerGlobalConfig.ACL_MAX_COUNT.value(Long.class)) { - throw new ApiMessageInterceptionException(argerr("Can't attach more than %d access-control-list groups to a listener", LoadBalancerGlobalConfig.ACL_MAX_COUNT.value(Long.class))); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10065, "Can't attach more than %d access-control-list groups to a listener", LoadBalancerGlobalConfig.ACL_MAX_COUNT.value(Long.class))); } validateAcl(msg.getAclUuids(),new ArrayList<>(), msg.getLoadBalancerUuid()); } @@ -824,7 +825,7 @@ private void validate(APICreateLoadBalancerListenerMsg msg) { if (LoadBalancerConstants.LB_PROTOCOL_UDP.equals(msg.getProtocol()) || LoadBalancerConstants.LB_PROTOCOL_TCP.equals(msg.getProtocol())) { for (String tag : msg.getSystemTags()) { if (LoadBalancerSystemTags.SESSION_PERSISTENCE.isMatch(tag) || LoadBalancerSystemTags.SESSION_IDLE_TIMEOUT.isMatch(tag) || LoadBalancerSystemTags.COOKIE_NAME.isMatch(tag)) { - throw new ApiMessageInterceptionException(argerr("l4[%s] loadBalancer listener[%s] doesn't support assigning session persistence state", msg.getProtocol(), msg.getName())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10066, "l4[%s] loadBalancer listener[%s] doesn't support assigning session persistence state", msg.getProtocol(), msg.getName())); } } } @@ -854,22 +855,22 @@ private void validate(APICreateLoadBalancerListenerMsg msg) { } if ((redirectPort != null || statusCode != null) && (httpRedirectHttps == null || HttpRedirectHttps.disable.toString().equals(httpRedirectHttps))) { - throw new ApiMessageInterceptionException(argerr("could not assign redirect port or status code without specifying http redirect https")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10067, "could not assign redirect port or status code without specifying http redirect https")); } List validRedirectValues = Arrays.asList("disable", "enable"); if (httpRedirectHttps != null && !validRedirectValues.contains(httpRedirectHttps)) { - throw new ApiMessageInterceptionException(argerr("invalid redirect status [%s], it only support %s", httpRedirectHttps, validRedirectValues)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10068, "invalid redirect status [%s], it only support %s", httpRedirectHttps, validRedirectValues)); } List validCodeValues = Arrays.asList("301", "302", "303", "307", "308"); if (statusCode != null && !validCodeValues.contains(statusCode)) { - throw new ApiMessageInterceptionException(argerr("invalid status code [%s], it only support %s", statusCode, validCodeValues)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10069, "invalid status code [%s], it only support %s", statusCode, validCodeValues)); } if (HttpRedirectHttps.enable.toString().equals(httpRedirectHttps)) { if (!LB_PROTOCOL_HTTP.equals(msg.getProtocol())) { - throw new ApiMessageInterceptionException(argerr("could not support protocols other than HTTP when specifying http redirect https")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10070, "could not support protocols other than HTTP when specifying http redirect https")); } if (redirectPort == null) { insertTagIfNotExisting( @@ -888,20 +889,20 @@ private void validate(APICreateLoadBalancerListenerMsg msg) { ); } if (seessionPersistence != null && !LoadBalancerSessionPersistence.disable.toString().equals(seessionPersistence)) { - throw new ApiMessageInterceptionException(argerr("could not support both HTTP redirect HTTPS and session persistence at the same time")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10071, "could not support both HTTP redirect HTTPS and session persistence at the same time")); } } List validPersistenceValues = Arrays.asList("disable", "iphash", "insert", "rewrite"); if (seessionPersistence != null && !validPersistenceValues.contains(seessionPersistence)) { - throw new ApiMessageInterceptionException(argerr("invalid session persistence status [%s], it only support %s", seessionPersistence, validPersistenceValues)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10072, "invalid session persistence status [%s], it only support %s", seessionPersistence, validPersistenceValues)); } /*can not modify session persistence when the listener algorithm is leastconn except disable*/ if (LoadBalancerConstants.BALANCE_ALGORITHM_LEAST_CONN.equals(algorithm)) { for (String tag : msg.getSystemTags()) { if ((!LoadBalancerSessionPersistence.disable.toString().equals(seessionPersistence) && seessionPersistence != null) || LoadBalancerSystemTags.SESSION_IDLE_TIMEOUT.isMatch(tag) || LoadBalancerSystemTags.COOKIE_NAME.isMatch(tag)) { - throw new ApiMessageInterceptionException(argerr("loadBalancer[%s] listener[%s] %s algorithm doesn't support assigning session persistence state except assigning disable explicitly", msg.getLoadBalancerUuid(), msg.getName(), algorithm)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10073, "loadBalancer[%s] listener[%s] %s algorithm doesn't support assigning session persistence state except assigning disable explicitly", msg.getLoadBalancerUuid(), msg.getName(), algorithm)); } } insertTagIfNotExisting( @@ -916,7 +917,7 @@ private void validate(APICreateLoadBalancerListenerMsg msg) { if (LoadBalancerConstants.BALANCE_ALGORITHM_LEAST_SOURCE.equals(algorithm)) { for (String tag : msg.getSystemTags()) { if ((!LoadBalancerSessionPersistence.iphash.toString().equals(seessionPersistence) && seessionPersistence != null) || LoadBalancerSystemTags.SESSION_IDLE_TIMEOUT.isMatch(tag) || LoadBalancerSystemTags.COOKIE_NAME.isMatch(tag)) { - throw new ApiMessageInterceptionException(argerr("loadBalancer[%s] listener[%s] %s algorithm doesn't support assigning session persistence state except assigning iphash explicitly", msg.getLoadBalancerUuid(), msg.getName(), algorithm)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10074, "loadBalancer[%s] listener[%s] %s algorithm doesn't support assigning session persistence state except assigning iphash explicitly", msg.getLoadBalancerUuid(), msg.getName(), algorithm)); } } insertTagIfNotExisting( @@ -942,38 +943,38 @@ private void validate(APICreateLoadBalancerListenerMsg msg) { try { LoadBalancerSessionPersistence.valueOf(LoadBalancerSessionPersistence.class, enableSession); } catch (Exception e) { - throw new ApiMessageInterceptionException(argerr("invalid session persistence type[%s], it only support %s", enableSession, Arrays.toString(LoadBalancerSessionPersistence.values()))); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10075, "invalid session persistence type[%s], it only support %s", enableSession, Arrays.toString(LoadBalancerSessionPersistence.values()))); } } if (LoadBalancerSystemTags.SESSION_IDLE_TIMEOUT.isMatch(tag)) { timeout = LoadBalancerSystemTags.SESSION_IDLE_TIMEOUT.getTokenByTag(tag, LoadBalancerSystemTags.SESSION_IDLE_TIMEOUT_TOKEN); if (Long.parseLong(timeout) < LoadBalancerConstants.SESSION_IDLE_TIMEOUT_MIN || Long.parseLong(timeout) > LoadBalancerConstants.SESSION_IDLE_TIMEOUT_MAX) { - throw new ApiMessageInterceptionException(argerr("invalid session idle timeout[%s], it must be the number between[%s~%s] ", timeout, LoadBalancerConstants.SESSION_IDLE_TIMEOUT_MIN, LoadBalancerConstants.SESSION_IDLE_TIMEOUT_MAX)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10076, "invalid session idle timeout[%s], it must be the number between[%s~%s] ", timeout, LoadBalancerConstants.SESSION_IDLE_TIMEOUT_MIN, LoadBalancerConstants.SESSION_IDLE_TIMEOUT_MAX)); } } if (LoadBalancerSystemTags.COOKIE_NAME.isMatch(tag)) { cookieName = LoadBalancerSystemTags.COOKIE_NAME.getTokenByTag(tag, LoadBalancerSystemTags.COOKIE_NAME_TOKEN); if (cookieName.length() > 20) { - throw new ApiMessageInterceptionException(argerr("invalid session cookie name[%s], it must be shorter than [%s] characters", cookieName, COOKIE_NAME_MAX)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10077, "invalid session cookie name[%s], it must be shorter than [%s] characters", cookieName, COOKIE_NAME_MAX)); } if (!cookieName.matches(COOKIE_NAME_REGEX)) { - throw new ApiMessageInterceptionException(argerr("invalid session cookie name[%s], it must only contains letters, numbers and underscores", cookieName)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10078, "invalid session cookie name[%s], it must only contains letters, numbers and underscores", cookieName)); } } if (enableSession != null && timeout != null && cookieName != null) { - throw new ApiMessageInterceptionException(argerr("loadBalancer[%s] listener[%s] doesn't support assigning idle timeout and cookie name at the same time", msg.getLoadBalancerUuid(), msg.getName())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10079, "loadBalancer[%s] listener[%s] doesn't support assigning idle timeout and cookie name at the same time", msg.getLoadBalancerUuid(), msg.getName())); } } /*can not assign session idle timeout and cookie name without specifying session persistence*/ if (enableSession == null && (timeout != null || cookieName != null)) { - throw new ApiMessageInterceptionException(argerr("loadBalancer[%s] listener[%s] doesn't support assigning idle timeout and cookie name, it must specify session persistence", msg.getLoadBalancerUuid(), msg.getName())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10080, "loadBalancer[%s] listener[%s] doesn't support assigning idle timeout and cookie name, it must specify session persistence", msg.getLoadBalancerUuid(), msg.getName())); } if (LoadBalancerSessionPersistence.disable.toString().equals(enableSession) && (timeout != null || cookieName != null)) { - throw new ApiMessageInterceptionException(argerr("loadBalancer[%s] listener[%s] doesn't support assigning idle timeout and cookie name when the session persistence is disabled", msg.getLoadBalancerUuid(), msg.getName())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10081, "loadBalancer[%s] listener[%s] doesn't support assigning idle timeout and cookie name when the session persistence is disabled", msg.getLoadBalancerUuid(), msg.getName())); } if (LoadBalancerSessionPersistence.insert.toString().equals(enableSession) && timeout == null) { @@ -987,17 +988,17 @@ private void validate(APICreateLoadBalancerListenerMsg msg) { /*can not assign session persistence rewrite without cookie name*/ if (LoadBalancerSessionPersistence.rewrite.toString().equals(enableSession) && cookieName == null) { - throw new ApiMessageInterceptionException(argerr("loadBalancer[%s] listener[%s] doesn't support assigning session persistence rewrite without assigning cookie name", msg.getLoadBalancerUuid(), msg.getName())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10082, "loadBalancer[%s] listener[%s] doesn't support assigning session persistence rewrite without assigning cookie name", msg.getLoadBalancerUuid(), msg.getName())); } /*can not assign session persistence idle timeout without insert mode*/ if (LoadBalancerSessionPersistence.rewrite.toString().equals(enableSession) && timeout != null) { - throw new ApiMessageInterceptionException(argerr("loadBalancer[%s] listener[%s] doesn't support assigning session persistence idle timeout without assigning rewrite mode", msg.getLoadBalancerUuid(), msg.getName())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10083, "loadBalancer[%s] listener[%s] doesn't support assigning session persistence idle timeout without assigning rewrite mode", msg.getLoadBalancerUuid(), msg.getName())); } /*can not assign session persistence cookie name without rewrite mode*/ if (LoadBalancerSessionPersistence.insert.toString().equals(enableSession) && cookieName != null) { - throw new ApiMessageInterceptionException(argerr("loadBalancer[%s] listener[%s] doesn't support assigning session persistence cookieName without assigning insert mode", msg.getLoadBalancerUuid(), msg.getName())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10084, "loadBalancer[%s] listener[%s] doesn't support assigning session persistence cookieName without assigning insert mode", msg.getLoadBalancerUuid(), msg.getName())); } } @@ -1008,7 +1009,7 @@ private void validate(APICreateLoadBalancerListenerMsg msg) { LoadBalancerSystemTags.SESSION_PERSISTENCE_TOKEN); if (!LoadBalancerSessionPersistence.iphash.toString().equals(enableSession)) { /*can not assign other session persistence with source algorithm*/ - throw new ApiMessageInterceptionException(argerr("loadBalancer[%s] listener[%s] doesn't support assigning other session persistence when the source balancer algorithm is source", msg.getLoadBalancerUuid(), msg.getName())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10085, "loadBalancer[%s] listener[%s] doesn't support assigning other session persistence when the source balancer algorithm is source", msg.getLoadBalancerUuid(), msg.getName())); } } } @@ -1020,7 +1021,7 @@ private void validate(APICreateLoadBalancerListenerMsg msg) { if (LoadBalancerSessionPersistence.iphash.toString().equals(enableSession)) { if (!LoadBalancerConstants.BALANCE_ALGORITHM_LEAST_SOURCE.equals(algorithm)) { /*can not assign session persistence iphash without source algorithm*/ - throw new ApiMessageInterceptionException(argerr("loadBalancer[%s] listener[%s] doesn't support assigning session persistence iphash", msg.getLoadBalancerUuid(), msg.getName())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10086, "loadBalancer[%s] listener[%s] doesn't support assigning session persistence iphash", msg.getLoadBalancerUuid(), msg.getName())); } } } @@ -1038,7 +1039,7 @@ private void validate(APICreateLoadBalancerListenerMsg msg) { String s = LoadBalancerSystemTags.MAX_CONNECTION.getTokenByTag(tag, LoadBalancerSystemTags.MAX_CONNECTION_TOKEN); if (Long.parseLong(s) > LoadBalancerConstants.MAX_CONNECTION_LIMIT) { - throw new OperationFailureException(argerr("invalid max connection[%s], %s is larger than upper threshold %d", tag, s, LoadBalancerConstants.MAX_CONNECTION_LIMIT)); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10087, "invalid max connection[%s], %s is larger than upper threshold %d", tag, s, LoadBalancerConstants.MAX_CONNECTION_LIMIT)); } } } catch (OperationFailureException oe) { @@ -1060,25 +1061,25 @@ private void validate(APICreateLoadBalancerListenerMsg msg) { } String luuid = q.findValue(); if (luuid != null) { - throw new ApiMessageInterceptionException(argerr("conflict loadBalancerPort[%s], a listener[uuid:%s] has used that port", msg.getLoadBalancerPort(), luuid)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10088, "conflict loadBalancerPort[%s], a listener[uuid:%s] has used that port", msg.getLoadBalancerPort(), luuid)); } if (msg.getSecurityPolicyType() != null) { if (!msg.getProtocol().equals(LB_PROTOCOL_HTTPS)) { - throw new ApiMessageInterceptionException(operr("the listener with protocol [%s] doesn't support select security policy", msg.getProtocol(), msg.getHealthCheckProtocol())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10089, "the listener with protocol [%s] doesn't support select security policy", msg.getProtocol(), msg.getHealthCheckProtocol())); } } if (!CollectionUtils.isEmpty(msg.getHttpVersions())) { if (!LoadBalancerConstants.LB_PROTOCOL_HTTPS.equals(msg.getProtocol())) { throw new ApiMessageInterceptionException( - argerr("cloud not change the loadbalancer listener, because the listener with protocol [%s] doesn't support select http version:[%s]", + argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10090, "cloud not change the loadbalancer listener, because the listener with protocol [%s] doesn't support select http version:[%s]", msg.getProtocol(), msg.getHttpVersions())); } if (hasNotSupportedHttpVersion(msg.getHttpVersions())) { throw new ApiMessageInterceptionException( - argerr("cloud not create the loadbalancer listener, because the listener with protocol https only support http version:[h1, h2]")); + argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10091, "cloud not create the loadbalancer listener, because the listener with protocol https only support http version:[h1, h2]")); } String httpVersions = String.join(",", msg.getHttpVersions()); @@ -1093,12 +1094,12 @@ private void validate(APICreateLoadBalancerListenerMsg msg) { if (!StringUtils.isEmpty(msg.getTcpProxyProtocol())) { if (!LoadBalancerConstants.LB_PROTOCOL_TCP.equals(msg.getProtocol())) { throw new ApiMessageInterceptionException( - argerr("cloud not create the loadbalancer listener, because the listener with protocol tcp only support tcp proxy protocol param")); + argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10092, "cloud not create the loadbalancer listener, because the listener with protocol tcp only support tcp proxy protocol param")); } if (!LbSupportTcpProxyProtocol.contains(msg.getTcpProxyProtocol())) { throw new ApiMessageInterceptionException( - argerr("cloud not create the loadbalancer listener, because only support tcp proxy protocol %s", LbSupportTcpProxyProtocol)); + argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10093, "cloud not create the loadbalancer listener, because only support tcp proxy protocol %s", LbSupportTcpProxyProtocol)); } if (!msg.getTcpProxyProtocol().equals(DisableLbSupportTcpProxyProtocol)) { @@ -1114,13 +1115,13 @@ private void validate(APICreateLoadBalancerListenerMsg msg) { if (!CollectionUtils.isEmpty(msg.getHttpCompressAlgos())) { if (!LoadBalancerConstants.LB_PROTOCOL_HTTPS.equals(msg.getProtocol()) && !LB_PROTOCOL_HTTP.equals(msg.getProtocol())) { throw new ApiMessageInterceptionException( - argerr("cloud not create the loadbalancer listener, because the listener with protocol [%s] doesn't support compress content", + argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10094, "cloud not create the loadbalancer listener, because the listener with protocol [%s] doesn't support compress content", msg.getProtocol(), msg.getHttpVersions())); } if (hasNotSupportedHttpCompressAlgos(msg.getHttpCompressAlgos())) { throw new ApiMessageInterceptionException( - argerr("cloud not create the loadbalancer listener, because only support compress algos[%s]", LbSupportHttpCompressAlgos)); + argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10095, "cloud not create the loadbalancer listener, because only support compress algos[%s]", LbSupportHttpCompressAlgos)); } if (!msg.getHttpCompressAlgos().contains(DisableLbSupportHttpCompressAlgos)) { @@ -1157,11 +1158,11 @@ private void validate(APIUpdateLoadBalancerListenerMsg msg) { private void validate(APIAddCertificateToLoadBalancerListenerMsg msg) { LoadBalancerListenerVO vo = dbf.findByUuid(msg.getListenerUuid(), LoadBalancerListenerVO.class); if (!vo.getProtocol().equals(LoadBalancerConstants.LB_PROTOCOL_HTTPS)) { - throw new ApiMessageInterceptionException(argerr("loadbalancer listener with type %s does not need certificate", vo.getProtocol())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10096, "loadbalancer listener with type %s does not need certificate", vo.getProtocol())); } if (Q.New(LoadBalancerListenerCertificateRefVO.class).eq(LoadBalancerListenerCertificateRefVO_.listenerUuid, msg.getListenerUuid()).isExists()) { - throw new ApiMessageInterceptionException(argerr("loadbalancer listener [uuid:%s] already had certificate[uuid:%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10097, "loadbalancer listener [uuid:%s] already had certificate[uuid:%s]", msg.getListenerUuid(),msg.getCertificateUuid())); } @@ -1171,7 +1172,7 @@ private void validate(APIAddCertificateToLoadBalancerListenerMsg msg) { private void validate(APIRemoveCertificateFromLoadBalancerListenerMsg msg) { if (!Q.New(LoadBalancerListenerCertificateRefVO.class).eq(LoadBalancerListenerCertificateRefVO_.listenerUuid, msg.getListenerUuid()) .eq(LoadBalancerListenerCertificateRefVO_.certificateUuid, msg.getCertificateUuid()).isExists()) { - throw new ApiMessageInterceptionException(argerr("certificate [uuid:%s] is not added to loadbalancer listener [uuid:%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10098, "certificate [uuid:%s] is not added to loadbalancer listener [uuid:%s]", msg.getCertificateUuid(), msg.getListenerUuid())); } @@ -1186,11 +1187,11 @@ private void validate(APIChangeLoadBalancerListenerMsg msg) { try { int port = Integer.parseInt(target); if (port < 1 || port > 65535) { - throw new ApiMessageInterceptionException(argerr("healthCheck target [%s] error, it must be 'default' or number between[1~65535] ", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10099, "healthCheck target [%s] error, it must be 'default' or number between[1~65535] ", target)); } } catch (Exception e) { - throw new ApiMessageInterceptionException(argerr("healthCheck target [%s] error, it must be 'default' or number between[1~65535] ", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10100, "healthCheck target [%s] error, it must be 'default' or number between[1~65535] ", target)); } } @@ -1201,12 +1202,12 @@ private void validate(APIChangeLoadBalancerListenerMsg msg) { .find(); if ((msg.getRedirectPort() != null || msg.getStatusCode() != null) && (msg.getHttpRedirectHttps() == null || HttpRedirectHttps.disable.toString().equals(msg.getHttpRedirectHttps()))) { - throw new ApiMessageInterceptionException(argerr("could not assign redirect port or status code without specifying http redirect https")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10101, "could not assign redirect port or status code without specifying http redirect https")); } if (HttpRedirectHttps.enable.toString().equals(msg.getHttpRedirectHttps())) { if (!LB_PROTOCOL_HTTP.equals(listener.getProtocol())) { - throw new ApiMessageInterceptionException(argerr("could not support protocols other than HTTP when specifying http redirect https")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10102, "could not support protocols other than HTTP when specifying http redirect https")); } if (msg.getRedirectPort() == null) { @@ -1221,14 +1222,14 @@ private void validate(APIChangeLoadBalancerListenerMsg msg) { .in(SystemTagVO_.tag, Arrays.asList("sessionPersistence::rewrite", "sessionPersistence::insert", "sessionPersistence::iphash")) .eq(SystemTagVO_.resourceUuid, listener.getUuid()).isExists(); if (sessionPersistence || (msg.getSessionPersistence() != null && !LoadBalancerSessionPersistence.disable.toString().equals(msg.getSessionPersistence()))) { - throw new ApiMessageInterceptionException(argerr("could not support both HTTP redirect HTTPS and session persistence at the same time")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10103, "could not support both HTTP redirect HTTPS and session persistence at the same time")); } } /*can not modify l4's session persistence*/ if (LoadBalancerConstants.LB_PROTOCOL_UDP.equals(listener.getProtocol()) || LoadBalancerConstants.LB_PROTOCOL_TCP.equals(listener.getProtocol())) { if (msg.getSessionPersistence() != null || msg.getSessionIdleTimeout() != null || msg.getCookieName() != null) { - throw new ApiMessageInterceptionException(argerr("l4[%s] loadBalancer listener[%s] doesn't support modifying session persistence state", listener.getProtocol(), listener.getName())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10104, "l4[%s] loadBalancer listener[%s] doesn't support modifying session persistence state", listener.getProtocol(), listener.getName())); } } @@ -1238,32 +1239,32 @@ private void validate(APIChangeLoadBalancerListenerMsg msg) { .eq(SystemTagVO_.tag, "httpRedirectHttps::enable") .eq(SystemTagVO_.resourceUuid, listener.getUuid()).isExists(); if (httpRedirectHttps && (msg.getSessionPersistence() != null && !LoadBalancerSessionPersistence.disable.toString().equals(msg.getSessionPersistence()))) { - throw new ApiMessageInterceptionException(argerr("could not support both HTTP redirect HTTPS and session persistence at the same time")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10105, "could not support both HTTP redirect HTTPS and session persistence at the same time")); } if (LoadBalancerSessionPersistence.rewrite.toString().equals(msg.getSessionPersistence()) && msg.getHttpMode() == null) { Boolean httpModeTunnel = Q.New(SystemTagVO.class).eq(SystemTagVO_.resourceType, LoadBalancerListenerVO.class.getSimpleName()) .eq(SystemTagVO_.tag, "httpMode::http-tunnel") .eq(SystemTagVO_.resourceUuid, listener.getUuid()).isExists(); if (httpModeTunnel) { - throw new ApiMessageInterceptionException(argerr("listener[%s] can not modifying session persistence rewrite when the http mode is http-tunnel", msg.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10106, "listener[%s] can not modifying session persistence rewrite when the http mode is http-tunnel", msg.getUuid())); } } } /*can not assign session persistence iphash without source algorithm*/ if (!LoadBalancerConstants.BALANCE_ALGORITHM_LEAST_SOURCE.equals(msg.getBalancerAlgorithm()) && LoadBalancerSessionPersistence.iphash.toString().equals(msg.getSessionPersistence())) { - throw new ApiMessageInterceptionException(argerr("listener[%s] changes session persistence to iphash, it must specify source balancer algorithm", msg.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10107, "listener[%s] changes session persistence to iphash, it must specify source balancer algorithm", msg.getUuid())); } /*can not modify session persistence without specifying balancer algorithm*/ if (msg.getBalancerAlgorithm() == null && (msg.getSessionPersistence() != null || msg.getSessionIdleTimeout() != null || msg.getCookieName() != null)) { - throw new ApiMessageInterceptionException(argerr("listener[%s] modifies session persistence, it must specify balancer algorithm", msg.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10108, "listener[%s] modifies session persistence, it must specify balancer algorithm", msg.getUuid())); } /*can not modify session persistence except iphash when the listener algorithm is source*/ if (LoadBalancerConstants.BALANCE_ALGORITHM_LEAST_SOURCE.equals(msg.getBalancerAlgorithm())) { if ((!LoadBalancerSessionPersistence.iphash.toString().equals(msg.getSessionPersistence()) && msg.getSessionPersistence() != null) || msg.getSessionIdleTimeout() != null || msg.getCookieName() != null) { - throw new ApiMessageInterceptionException(argerr("listener[%s] %s algorithm doesn't support modifying session persistence except assigning iphash explicitly", msg.getUuid(), msg.getBalancerAlgorithm())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10109, "listener[%s] %s algorithm doesn't support modifying session persistence except assigning iphash explicitly", msg.getUuid(), msg.getBalancerAlgorithm())); } msg.setSessionPersistence(LoadBalancerSessionPersistence.iphash.toString()); } @@ -1271,7 +1272,7 @@ private void validate(APIChangeLoadBalancerListenerMsg msg) { /*can not modify session persistence except disable when the listener algorithm is leastconn*/ if (LoadBalancerConstants.BALANCE_ALGORITHM_LEAST_CONN.equals(msg.getBalancerAlgorithm())) { if ((!LoadBalancerSessionPersistence.disable.toString().equals(msg.getSessionPersistence()) && msg.getSessionPersistence() != null) || msg.getSessionIdleTimeout() != null || msg.getCookieName() != null) { - throw new ApiMessageInterceptionException(argerr("listener[%s] %s algorithm doesn't support modifying session persistence except assigning disable explicitly", msg.getUuid(), msg.getBalancerAlgorithm())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10110, "listener[%s] %s algorithm doesn't support modifying session persistence except assigning disable explicitly", msg.getUuid(), msg.getBalancerAlgorithm())); } msg.setSessionPersistence(LoadBalancerSessionPersistence.disable.toString()); } @@ -1279,19 +1280,19 @@ private void validate(APIChangeLoadBalancerListenerMsg msg) { if (BALANCE_ALGORITHM_ROUND_ROBIN.equals(msg.getBalancerAlgorithm()) || BALANCE_ALGORITHM_WEIGHT_ROUND_ROBIN.equals(msg.getBalancerAlgorithm())) { /*can not modify session idle timeout and cookie name without specifying session persistence*/ if (msg.getSessionPersistence() == null && (msg.getSessionIdleTimeout() != null || msg.getCookieName() != null)) { - throw new ApiMessageInterceptionException(argerr("listener[%s] doesn't support modifying idle timeout and cookie name, it must specify session persistence", msg.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10111, "listener[%s] doesn't support modifying idle timeout and cookie name, it must specify session persistence", msg.getUuid())); } /*can not modify session idle timeout without specifying session persistence insert*/ if (!LoadBalancerSessionPersistence.insert.toString().equals(msg.getSessionPersistence()) && msg.getSessionIdleTimeout() != null) { - throw new ApiMessageInterceptionException(argerr("listener[%s] doesn't support modifying idle timeout when the session persistence is not insert", msg.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10112, "listener[%s] doesn't support modifying idle timeout when the session persistence is not insert", msg.getUuid())); } /*can not modify session cookie name without specifying session persistence rewrite*/ if (!LoadBalancerSessionPersistence.rewrite.toString().equals(msg.getSessionPersistence()) && msg.getCookieName() != null) { - throw new ApiMessageInterceptionException(argerr("listener[%s] doesn't support modifying cookie name when the session persistence is not rewrite", msg.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10113, "listener[%s] doesn't support modifying cookie name when the session persistence is not rewrite", msg.getUuid())); } /*can not modify session persistence rewrite without modifying session cookie name*/ if (LoadBalancerSessionPersistence.rewrite.toString().equals(msg.getSessionPersistence()) && msg.getCookieName() == null) { - throw new ApiMessageInterceptionException(argerr("listener[%s] doesn't support modifying session rewrite without modifying cookie name", msg.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10114, "listener[%s] doesn't support modifying session rewrite without modifying cookie name", msg.getUuid())); } if (LoadBalancerSessionPersistence.insert.toString().equals(msg.getSessionPersistence()) && msg.getSessionIdleTimeout() == null) { msg.setSessionIdleTimeout(LoadBalancerConstants.SESSION_IDLE_TIMEOUT_DEFAULT); @@ -1305,7 +1306,7 @@ private void validate(APIChangeLoadBalancerListenerMsg msg) { Integer timeout = msg.getSessionIdleTimeout(); if (timeout != null) { if (timeout < LoadBalancerConstants.SESSION_IDLE_TIMEOUT_MIN || timeout > LoadBalancerConstants.SESSION_IDLE_TIMEOUT_MAX) { - throw new ApiMessageInterceptionException(argerr("invalid session idle timeout[%s], it must be the number between[%s~%s]", timeout, LoadBalancerConstants.SESSION_IDLE_TIMEOUT_MIN, LoadBalancerConstants.SESSION_IDLE_TIMEOUT_MAX)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10115, "invalid session idle timeout[%s], it must be the number between[%s~%s]", timeout, LoadBalancerConstants.SESSION_IDLE_TIMEOUT_MIN, LoadBalancerConstants.SESSION_IDLE_TIMEOUT_MAX)); } } @@ -1318,14 +1319,14 @@ private void validate(APIChangeLoadBalancerListenerMsg msg) { String[] ts = tg.split(":"); if (!msg.getHealthCheckProtocol().equals(ts[0]) && msg.getHealthCheckURI() == null) { throw new ApiMessageInterceptionException( - operr("the http health check protocol must be specified its healthy checking parameter healthCheckURI")); + operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10116, "the http health check protocol must be specified its healthy checking parameter healthCheckURI")); } } if (msg.getHealthCheckHttpCode() != null) { if (!verifyHttpCode(msg.getHealthCheckHttpCode())) { throw new ApiMessageInterceptionException( - operr("the http health check protocol's expecting code [%s] is invalidate", msg.getHealthCheckHttpCode())); + operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10117, "the http health check protocol's expecting code [%s] is invalidate", msg.getHealthCheckHttpCode())); } } @@ -1334,7 +1335,7 @@ private void validate(APIChangeLoadBalancerListenerMsg msg) { if (msg.getSecurityPolicyType() != null) { if (!listenerVO.getProtocol().equals(LB_PROTOCOL_HTTPS)) { - throw new ApiMessageInterceptionException(operr("the listener with protocol [%s] doesn't support select security policy", listenerVO.getProtocol(), msg.getHealthCheckProtocol())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10118, "the listener with protocol [%s] doesn't support select security policy", listenerVO.getProtocol(), msg.getHealthCheckProtocol())); } } if (LoadBalancerConstants.HEALTH_CHECK_TARGET_PROTOCL_HTTP.equals(msg.getHealthCheckProtocol())) { @@ -1343,56 +1344,56 @@ private void validate(APIChangeLoadBalancerListenerMsg msg) { String[] ts = healthTarget.split(":"); if (ts.length != 2) { - throw new OperationFailureException(argerr("invalid health target[%s], the format is targetCheckProtocol:port, for example, tcp:default", target)); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10119, "invalid health target[%s], the format is targetCheckProtocol:port, for example, tcp:default", target)); } if (LoadBalancerConstants.LB_PROTOCOL_UDP.equals(listenerVO.getProtocol()) && !LoadBalancerConstants.HEALTH_CHECK_TARGET_PROTOCL_UDP.equals(msg.getHealthCheckProtocol()) || !LoadBalancerConstants.LB_PROTOCOL_UDP.equals(listenerVO.getProtocol()) && LoadBalancerConstants.HEALTH_CHECK_TARGET_PROTOCL_UDP.equals(msg.getHealthCheckProtocol())) { throw new ApiMessageInterceptionException( - operr("the listener with protocol [%s] doesn't support this health check:[%s]", + operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10120, "the listener with protocol [%s] doesn't support this health check:[%s]", listenerVO.getProtocol(), msg.getHealthCheckProtocol())); } if (LoadBalancerConstants.HEALTH_CHECK_TARGET_PROTOCL_TCP.equals(ts[0]) && (msg.getHealthCheckMethod() == null || msg.getHealthCheckURI() == null)) { throw new ApiMessageInterceptionException( - operr("the http health check protocol must be specified its healthy checking parameters including healthCheckMethod and healthCheckURI")); + operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10121, "the http health check protocol must be specified its healthy checking parameters including healthCheckMethod and healthCheckURI")); } } if (!CollectionUtils.isEmpty(msg.getHttpVersions())) { if (!LoadBalancerConstants.LB_PROTOCOL_HTTPS.equals(listener.getProtocol())) { throw new ApiMessageInterceptionException( - argerr("cloud not change the loadbalancer listener, because the listener with protocol [%s] doesn't support select http version:[%s]", + argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10122, "cloud not change the loadbalancer listener, because the listener with protocol [%s] doesn't support select http version:[%s]", listenerVO.getProtocol(), msg.getHttpVersions())); } if (hasNotSupportedHttpVersion(msg.getHttpVersions())) { throw new ApiMessageInterceptionException( - argerr("cloud not change the loadbalancer listener, because the listener with protocol https only support http version:[%s]", LbSupportHttpVersion)); + argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10123, "cloud not change the loadbalancer listener, because the listener with protocol https only support http version:[%s]", LbSupportHttpVersion)); } } if (!StringUtils.isEmpty(msg.getTcpProxyProtocol())) { if (!LoadBalancerConstants.LB_PROTOCOL_TCP.equals(listener.getProtocol())) { throw new ApiMessageInterceptionException( - argerr("cloud not change the loadbalancer listener, because the listener with protocol tcp only support tcp proxy protocol for param")); + argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10124, "cloud not change the loadbalancer listener, because the listener with protocol tcp only support tcp proxy protocol for param")); } if (!LbSupportTcpProxyProtocol.contains(msg.getTcpProxyProtocol())) { throw new ApiMessageInterceptionException( - argerr("cloud not change the loadbalancer listener, because only support tcp proxy protocol %s", LbSupportTcpProxyProtocol)); + argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10125, "cloud not change the loadbalancer listener, because only support tcp proxy protocol %s", LbSupportTcpProxyProtocol)); } } if (!CollectionUtils.isEmpty(msg.getHttpCompressAlgos())) { if (!LoadBalancerConstants.LB_PROTOCOL_HTTPS.equals(listener.getProtocol()) && !LB_PROTOCOL_HTTP.equals(listener.getProtocol())) { throw new ApiMessageInterceptionException( - argerr("cloud not change the loadbalancer listener, because the listener with protocol [%s] doesn't support compress content", + argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10126, "cloud not change the loadbalancer listener, because the listener with protocol [%s] doesn't support compress content", listenerVO.getProtocol(), msg.getHttpVersions())); } if (hasNotSupportedHttpCompressAlgos(msg.getHttpCompressAlgos())) { throw new ApiMessageInterceptionException( - argerr("cloud not change the loadbalancer listener, because only support compress algos[%s]", LbSupportHttpCompressAlgos)); + argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10127, "cloud not change the loadbalancer listener, because only support compress algos[%s]", LbSupportHttpCompressAlgos)); } } @@ -1422,7 +1423,7 @@ private void validate(APICreateLoadBalancerServerGroupMsg msg){ if (msg.getIpVersion() == null) { msg.setIpVersion(IPv6Constants.IPv4); } else if (!msg.getIpVersion().equals(IPv6Constants.IPv4) && !msg.getIpVersion().equals(IPv6Constants.IPv6)) { - throw new ApiMessageInterceptionException(argerr("invalid ip version[%s], it must be %s or %s", msg.getIpVersion(), IPv6Constants.IPv4, IPv6Constants.IPv6)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10128, "invalid ip version[%s], it must be %s or %s", msg.getIpVersion(), IPv6Constants.IPv4, IPv6Constants.IPv6)); } } @@ -1436,7 +1437,7 @@ private void validate(APIDeleteLoadBalancerServerGroupMsg msg){ if(Q.New(LoadBalancerVO.class) .eq(LoadBalancerVO_.serverGroupUuid,msg.getUuid()) .isExists()){ - throw new ApiMessageInterceptionException(argerr("could not allow to delete default serverGroup[uuid:%s]",msg.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10129, "could not allow to delete default serverGroup[uuid:%s]",msg.getUuid())); } } @@ -1455,7 +1456,7 @@ private void validate(APIAddBackendServerToServerGroupMsg msg){ .eq(LoadBalancerServerGroupVO_.uuid, msg.getServerGroupUuid()) .findValue(); if (loadBalancerUuid == null ) { - throw new ApiMessageInterceptionException(argerr("loadbalacerServerGroup [%s] is non-existent", msg.getServerGroupUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10130, "loadbalacerServerGroup [%s] is non-existent", msg.getServerGroupUuid())); } LoadBalancerVO lbVO = dbf.findByUuid(loadBalancerUuid, LoadBalancerVO.class); @@ -1488,25 +1489,25 @@ private void validate(APIAddBackendServerToServerGroupMsg msg){ if(vmNic.containsKey("uuid")){ vmNicUuids.add(vmNic.get("uuid")); }else{ - throw new ApiMessageInterceptionException(argerr("could not add backend server vmnic to serverGroup[uuid:%s],because vmnic uuid is null",msg.getServerGroupUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10131, "could not add backend server vmnic to serverGroup[uuid:%s],because vmnic uuid is null",msg.getServerGroupUuid())); } boolean isVmNicExist = Q.New(VmNicVO.class) .eq(VmNicVO_.uuid,vmNic.get("uuid")) .isExists(); if(!isVmNicExist){ - throw new ApiMessageInterceptionException(argerr("could not add backend server vmnic[uuid:%s] to serverGroup[uuid:%s],because vmnic uuid is not exist",vmNic.get("uuid"),msg.getServerGroupUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10132, "could not add backend server vmnic[uuid:%s] to serverGroup[uuid:%s],because vmnic uuid is not exist",vmNic.get("uuid"),msg.getServerGroupUuid())); } if(vmNic.containsKey("weight") && vmNic.get("weight")!=null){ try{ Long vmNicWeight = Long.valueOf(vmNic.get("weight")); if (vmNicWeight < LoadBalancerConstants.BALANCER_WEIGHT_MIN || vmNicWeight > LoadBalancerConstants.BALANCER_WEIGHT_MAX) { - throw new ApiMessageInterceptionException(argerr("invalid balancer weight[vimNic:%s,weight:%s], weight is not in the range [%d, %d]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10133, "invalid balancer weight[vimNic:%s,weight:%s], weight is not in the range [%d, %d]", vmNic.get("uuid"), vmNicWeight, LoadBalancerConstants.BALANCER_WEIGHT_MIN, LoadBalancerConstants.BALANCER_WEIGHT_MAX)); } }catch (Exception e) { - throw new ApiMessageInterceptionException(argerr("could not add backend server vmnic to serverGroup[uuid:%s] ,because vmnic weight[%s] not a correct number",vmNic.get("weight"))); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10134, "could not add backend server vmnic to serverGroup[uuid:%s] ,because vmnic weight[%s] not a correct number",vmNic.get("weight"))); } } @@ -1526,7 +1527,7 @@ private void validate(APIAddBackendServerToServerGroupMsg msg){ l3Uuids.removeAll(networksAttachedLbService); if (l3Uuids.size() > 0) { throw new ApiMessageInterceptionException( - operr("L3 networks[uuids:%s] of the vm nics has no network service[%s] enabled", + operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10135, "L3 networks[uuids:%s] of the vm nics has no network service[%s] enabled", l3Uuids, LoadBalancerConstants.LB_NETWORK_SERVICE_TYPE_STRING)); } @@ -1536,7 +1537,7 @@ private void validate(APIAddBackendServerToServerGroupMsg msg){ .eq(LoadBalancerServerGroupVmNicRefVO_.serverGroupUuid,msg.getServerGroupUuid()) .listValues(); if (!existingNics.isEmpty()) { - throw new ApiMessageInterceptionException(operr("the vm nics[uuid:%s] are already on the load balancer servegroup [uuid:%s]", existingNics, msg.getServerGroupUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10136, "the vm nics[uuid:%s] are already on the load balancer servegroup [uuid:%s]", existingNics, msg.getServerGroupUuid())); } List vmNicIps = Q.New(UsedIpVO.class) @@ -1545,7 +1546,7 @@ private void validate(APIAddBackendServerToServerGroupMsg msg){ .listValues(); if(!Collections.disjoint(usedIps,vmNicIps)){ - throw new ApiMessageInterceptionException(operr("could not add backend server vmnic to serverGroup [uuid:%s], because vmnic ip [ipAddress:%s] is repeated",msg.getServerGroupUuid(),vmNicIps)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10137, "could not add backend server vmnic to serverGroup [uuid:%s], because vmnic ip [ipAddress:%s] is repeated",msg.getServerGroupUuid(),vmNicIps)); }else{ usedIps.addAll(vmNicIps); } @@ -1557,7 +1558,7 @@ private void validate(APIAddBackendServerToServerGroupMsg msg){ .in(LoadBalancerListenerVO_.uuid, listenerUuids).list(); for (LoadBalancerListenerVO listenerVO : listenerVOS) { if (listenerVO.getAttachedVmNics().stream().anyMatch(uuid -> vmNicUuids.contains(uuid))) { - throw new ApiMessageInterceptionException(operr("could not add vm nic [uuid:%s] to server group" + + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10138, "could not add vm nic [uuid:%s] to server group" + " [uuid:%s] because listener [uuid:%s] attached this server group already the nic to be added", vmNicUuids, msg.getServerGroupUuid(), listenerVO.getUuid())); } @@ -1573,22 +1574,22 @@ private void validate(APIAddBackendServerToServerGroupMsg msg){ for(Map server:servers){ if(server.containsKey("ipAddress") && NetworkUtils.isIpAddress(server.get("ipAddress"))){ if(usedIps.contains(server.get("ipAddress"))){ - throw new ApiMessageInterceptionException(operr("could not add backend server ip to serverGroup [uuid:%s], because ip [ipAddress:%s] is repeated",msg.getServerGroupUuid(),server.get("ipAddress"))); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10139, "could not add backend server ip to serverGroup [uuid:%s], because ip [ipAddress:%s] is repeated",msg.getServerGroupUuid(),server.get("ipAddress"))); } serverIps.add(server.get("ipAddress")); }else{ - throw new ApiMessageInterceptionException(operr("could not add backend server ip to serverGroup [uuid:%s], because ip [ipAddress:%s] is invalid",msg.getServerGroupUuid(),serverIps)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10140, "could not add backend server ip to serverGroup [uuid:%s], because ip [ipAddress:%s] is invalid",msg.getServerGroupUuid(),serverIps)); } if(server.containsKey("weight") && server.get("weight")!=null){ try{ Long serverIpWeight = Long.valueOf(server.get("weight")); if (serverIpWeight < LoadBalancerConstants.BALANCER_WEIGHT_MIN || serverIpWeight > LoadBalancerConstants.BALANCER_WEIGHT_MAX) { - throw new ApiMessageInterceptionException(argerr("invalid weight[serverIp:%s,weight:%s], weight is not in the range [%d, %d]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10141, "invalid weight[serverIp:%s,weight:%s], weight is not in the range [%d, %d]", server.get("ipAddress"), serverIpWeight, LoadBalancerConstants.BALANCER_WEIGHT_MIN, LoadBalancerConstants.BALANCER_WEIGHT_MAX)); } }catch (Exception e) { - throw new ApiMessageInterceptionException(argerr("could not add backend server ip to serverGroup[uuid:%s] ,because vmnic weight[%s] not a correct number",server.get("weight"))); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10142, "could not add backend server ip to serverGroup[uuid:%s] ,because vmnic weight[%s] not a correct number",server.get("weight"))); } } } @@ -1599,11 +1600,11 @@ private void validate(APIAddBackendServerToServerGroupMsg msg){ .eq(LoadBalancerServerGroupServerIpVO_.serverGroupUuid,msg.getServerGroupUuid()) .listValues()); if (!existingServerIps.isEmpty()) { - throw new ApiMessageInterceptionException(operr("the server ips [uuid:%s] are already on the load balancer servegroup [uuid:%s]", existingServerIps, msg.getServerGroupUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10143, "the server ips [uuid:%s] are already on the load balancer servegroup [uuid:%s]", existingServerIps, msg.getServerGroupUuid())); } if (lbVO.getType() == LoadBalancerType.Shared) { - throw new ApiMessageInterceptionException(argerr("could not add server ip to share load balancer server group")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10144, "could not add server ip to share load balancer server group")); } canAddServerIp = true; } @@ -1611,7 +1612,7 @@ private void validate(APIAddBackendServerToServerGroupMsg msg){ if( canAddVmNic || canAddServerIp){ msg.setLoadBalancerUuid(loadBalancerUuid); } else{ - throw new ApiMessageInterceptionException(argerr("vmnic or ip is null")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10145, "vmnic or ip is null")); } } @@ -1629,7 +1630,7 @@ private void validate(APIRemoveBackendServerFromServerGroupMsg msg){ ); if(existingNics.isEmpty()) { - throw new ApiMessageInterceptionException(operr("vmnics are all not in servergroup [%s]",msg.getServerGroupUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10146, "vmnics are all not in servergroup [%s]",msg.getServerGroupUuid())); }else{ isNicExist = true; msg.setVmNicUuids(new ArrayList<>(existingNics)); @@ -1646,7 +1647,7 @@ private void validate(APIRemoveBackendServerFromServerGroupMsg msg){ .eq(LoadBalancerServerGroupVmNicRefVO_.serverGroupUuid,msg.getServerGroupUuid()) .listValues()); if(existingServerIps.isEmpty()){ - throw new ApiMessageInterceptionException(operr("serverips are all not in servergroup [%s]", msg.getServerGroupUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10147, "serverips are all not in servergroup [%s]", msg.getServerGroupUuid())); }else{ isIpExist = true; msg.setServerIps(new ArrayList<>(existingServerIps)); @@ -1661,11 +1662,11 @@ private void validate(APIRemoveBackendServerFromServerGroupMsg msg){ .eq(LoadBalancerServerGroupVO_.uuid,msg.getServerGroupUuid()) .findValue(); if (loadBalancerUuid == null) { - throw new ApiMessageInterceptionException(argerr("loadbalacerServerGroup [%s] is non-existent", msg.getServerGroupUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10148, "loadbalacerServerGroup [%s] is non-existent", msg.getServerGroupUuid())); } msg.setLoadBalancerUuid(loadBalancerUuid); }else{ - throw new ApiMessageInterceptionException(argerr("vmnic or ip is null")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10149, "vmnic or ip is null")); } } @@ -1676,7 +1677,7 @@ private void validate(APIAddServerGroupToLoadBalancerListenerMsg msg){ .eq(LoadBalancerListenerServerGroupRefVO_.listenerUuid, msg.getlistenerUuid()) .list(); if(existingRefs != null && !existingRefs.isEmpty()){ - throw new ApiMessageInterceptionException(operr("could not add server group[uuid:%s} to listener [uuid:%s] because it is already added ", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10150, "could not add server group[uuid:%s} to listener [uuid:%s] because it is already added ", msg.getServerGroupUuid(),msg.getlistenerUuid())); } @@ -1693,7 +1694,7 @@ private void validate(APIAddServerGroupToLoadBalancerListenerMsg msg){ if (!newVmNicUuids.isEmpty() && !oldVmNicUuids.isEmpty()) { for (String nicUuid : newVmNicUuids) { if (oldVmNicUuids.contains(nicUuid)) { - throw new ApiMessageInterceptionException(operr("could not add server group[uuid:%s} to listener [uuid:%s] because nic [uuid:%s] is already added", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10151, "could not add server group[uuid:%s} to listener [uuid:%s] because nic [uuid:%s] is already added", msg.getServerGroupUuid(),msg.getlistenerUuid(), nicUuid)); } } @@ -1708,7 +1709,7 @@ private void validate(APIAddServerGroupToLoadBalancerListenerMsg msg){ if (!newServerIps.isEmpty() && !oldServerIps.isEmpty()) { for (String ipAddress : newServerIps) { if (oldServerIps.contains(ipAddress)) { - throw new ApiMessageInterceptionException(operr("could not add server group[uuid:%s} to listener [uuid:%s] because server ip [%s] is already added", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10152, "could not add server group[uuid:%s} to listener [uuid:%s] because server ip [%s] is already added", msg.getServerGroupUuid(),msg.getlistenerUuid(), ipAddress)); } } @@ -1730,21 +1731,21 @@ private void validate(APIAddServerGroupToLoadBalancerListenerMsg msg){ if (!StringUtils.isEmpty(lbVO.getVipUuid()) && !StringUtils.isEmpty(lbVO.getIpv6VipUuid())) { throw new ApiMessageInterceptionException(operr( - "could not add server group[uuid:%s} to listener [uuid:%s], " + + ORG_ZSTACK_NETWORK_SERVICE_LB_10153, "could not add server group[uuid:%s} to listener [uuid:%s], " + "because udp listener can not has both ipv4 and ipv6 vip", msg.getServerGroupUuid(),msg.getlistenerUuid())); } if (groupVO.getIpVersion() == IPv6Constants.IPv4 && !StringUtils.isEmpty(lbVO.getIpv6VipUuid())) { throw new ApiMessageInterceptionException(operr( - "could not add server group[uuid:%s} to listener [uuid:%s], " + + ORG_ZSTACK_NETWORK_SERVICE_LB_10154, "could not add server group[uuid:%s} to listener [uuid:%s], " + "because udp listener can not map ipv6 to ipv4 backend", msg.getServerGroupUuid(),msg.getlistenerUuid())); } if (groupVO.getIpVersion() == IPv6Constants.IPv6 && !StringUtils.isEmpty(lbVO.getVipUuid())) { throw new ApiMessageInterceptionException(operr( - "could not add server group[uuid:%s} to listener [uuid:%s], " + + ORG_ZSTACK_NETWORK_SERVICE_LB_10155, "could not add server group[uuid:%s} to listener [uuid:%s], " + "because udp listener can not map ipv4 to ipv6 backend", msg.getServerGroupUuid(),msg.getlistenerUuid())); } @@ -1757,7 +1758,7 @@ private void validate(APIRemoveServerGroupFromLoadBalancerListenerMsg msg){ .eq(SystemTagVO_.tag, "httpRedirectHttps::enable") .eq(SystemTagVO_.resourceUuid, msg.getListenerUuid()).isExists(); if (httpRedirectHttps) { - throw new ApiMessageInterceptionException(argerr("could not remove server groups[uuid:%s} from listener [uuid:%s] because it has enable HTTP redirect HTTPS", msg.getServerGroupUuid(), msg.getListenerUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10156, "could not remove server groups[uuid:%s} from listener [uuid:%s] because it has enable HTTP redirect HTTPS", msg.getServerGroupUuid(), msg.getListenerUuid())); } List existingRefs @@ -1766,7 +1767,7 @@ private void validate(APIRemoveServerGroupFromLoadBalancerListenerMsg msg){ .eq(LoadBalancerListenerServerGroupRefVO_.listenerUuid, msg.getListenerUuid()) .list(); if(existingRefs == null || existingRefs.isEmpty()){ - throw new ApiMessageInterceptionException(operr("could not remove server group[uuid:%s} from listener [uuid:%s] because it is not added",msg.getServerGroupUuid(),msg.getListenerUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10157, "could not remove server group[uuid:%s} from listener [uuid:%s] because it is not added",msg.getServerGroupUuid(),msg.getListenerUuid())); } String loadBalancerUuid = Q.New(LoadBalancerServerGroupVO.class) @@ -1781,7 +1782,7 @@ private boolean isExist(String loadBalancerUuid){ .eq(LoadBalancerVO_.uuid,loadBalancerUuid) .count(); if(count == 0){ - throw new ApiMessageInterceptionException(argerr("loadbalacerUuid [%s] is non-existent",loadBalancerUuid)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10158, "loadbalacerUuid [%s] is non-existent",loadBalancerUuid)); }else{ return true; } @@ -1796,7 +1797,7 @@ private void validate(APIChangeLoadBalancerBackendServerMsg msg){ .eq(LoadBalancerServerGroupVO_.uuid, msg.getServerGroupUuid()) .findValue(); if (loadBalancerUuid == null) { - throw new ApiMessageInterceptionException(argerr("could not find loadBalancer with serverGroup [uuid:%s]",msg.getServerGroupUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10159, "could not find loadBalancer with serverGroup [uuid:%s]",msg.getServerGroupUuid())); } LoadBalancerVO lbVO = dbf.findByUuid(loadBalancerUuid, LoadBalancerVO.class); @@ -1812,7 +1813,7 @@ private void validate(APIChangeLoadBalancerBackendServerMsg msg){ .eq(LoadBalancerServerGroupVmNicRefVO_.serverGroupUuid,msg.getServerGroupUuid()) .find(); if(serverGroupVmNicRefVO == null){ - throw new ApiMessageInterceptionException(argerr("could not update backend server vmnic of serverGroup,because serverGroup[uuid:%s] don not have vmnic [uuid:%s] ",msg.getServerGroupUuid(),vmNic.containsKey("uuid"))); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10160, "could not update backend server vmnic of serverGroup,because serverGroup[uuid:%s] don not have vmnic [uuid:%s] ",msg.getServerGroupUuid(),vmNic.containsKey("uuid"))); } vmNicUuids.add(vmNic.get("uuid")); @@ -1822,22 +1823,22 @@ private void validate(APIChangeLoadBalancerBackendServerMsg msg){ try{ Long vmNicWeight = Long.valueOf(vmNic.get("weight")); if (vmNicWeight < LoadBalancerConstants.BALANCER_WEIGHT_MIN || vmNicWeight > LoadBalancerConstants.BALANCER_WEIGHT_MAX) { - throw new ApiMessageInterceptionException(argerr("invalid balancer weight[vimNic:%s,weight:%s], weight is not in the range [%d, %d]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10161, "invalid balancer weight[vimNic:%s,weight:%s], weight is not in the range [%d, %d]", vmNic.get("uuid"), vmNicWeight, LoadBalancerConstants.BALANCER_WEIGHT_MIN, LoadBalancerConstants.BALANCER_WEIGHT_MAX)); } canChangeVmNic = true; }catch (Exception e) { - throw new ApiMessageInterceptionException(argerr("could not change backend server vmnic to serverGroup[uuid:%s] ,because vmnic weight[%s] not a correct number",vmNic.get("weight"))); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10162, "could not change backend server vmnic to serverGroup[uuid:%s] ,because vmnic weight[%s] not a correct number",vmNic.get("weight"))); } } }else{ - throw new ApiMessageInterceptionException(argerr("invalid balancer weight[vimNic:%s], weight is null",vmNic.get("uuid"))); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10163, "invalid balancer weight[vimNic:%s], weight is null",vmNic.get("uuid"))); } }else{ - throw new ApiMessageInterceptionException(argerr("could not update backend server vmnic of serverGroup[uuid:%s],because vmnic uuid is null",msg.getServerGroupUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10164, "could not update backend server vmnic of serverGroup[uuid:%s],because vmnic uuid is null",msg.getServerGroupUuid())); } } } @@ -1853,7 +1854,7 @@ private void validate(APIChangeLoadBalancerBackendServerMsg msg){ .eq(LoadBalancerServerGroupServerIpVO_.serverGroupUuid,msg.getServerGroupUuid()) .find(); if(serverIpVO == null){ - throw new ApiMessageInterceptionException(argerr("could not update backend server ip of serverGroup,because serverGroup[uuid:%s] don not have ip [ipAddress:%s] ",msg.getServerGroupUuid(),ipAddress)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10165, "could not update backend server ip of serverGroup,because serverGroup[uuid:%s] don not have ip [ipAddress:%s] ",msg.getServerGroupUuid(),ipAddress)); } serverIps.add(ipAddress); @@ -1862,33 +1863,33 @@ private void validate(APIChangeLoadBalancerBackendServerMsg msg){ try{ Long serverIpWeight = Long.valueOf(server.get("weight")); if (serverIpWeight < LoadBalancerConstants.BALANCER_WEIGHT_MIN || serverIpWeight > LoadBalancerConstants.BALANCER_WEIGHT_MAX) { - throw new ApiMessageInterceptionException(argerr("invalid balancer weight[serverIp:%s,weight:%s], weight is not in the range [%d, %d]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10166, "invalid balancer weight[serverIp:%s,weight:%s], weight is not in the range [%d, %d]", server.get("ipAddress"), serverIpWeight, LoadBalancerConstants.BALANCER_WEIGHT_MIN, LoadBalancerConstants.BALANCER_WEIGHT_MAX)); } canChangeServerIp = true; }catch (Exception e) { - throw new ApiMessageInterceptionException(argerr("could not add backend server ip to serverGroup[uuid:%s] ,because vmnic weight[%s] not a correct number",server.get("weight"))); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10167, "could not add backend server ip to serverGroup[uuid:%s] ,because vmnic weight[%s] not a correct number",server.get("weight"))); } }else{ - throw new ApiMessageInterceptionException(argerr("invalid balancer weight[serverIp:%s], weight is null",server.get("ipAddress"))); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10168, "invalid balancer weight[serverIp:%s], weight is null",server.get("ipAddress"))); } }else{ - throw new ApiMessageInterceptionException(operr("could not add backend server ip to serverGroup [uuid:%s], because ip [ipAddress:%s] is invalid",msg.getServerGroupUuid(),serverIps)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10169, "could not add backend server ip to serverGroup [uuid:%s], because ip [ipAddress:%s] is invalid",msg.getServerGroupUuid(),serverIps)); } } if (lbVO.getType() == LoadBalancerType.Shared) { - throw new ApiMessageInterceptionException(argerr("could not add server ip to share load balancer server group")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10170, "could not add server ip to share load balancer server group")); } } if( canChangeVmNic || canChangeServerIp){ msg.setLoadBalancerUuid(loadBalancerUuid); }else{ - throw new ApiMessageInterceptionException(argerr("could not change backendserver, beacause vmincs and serverips is null")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10171, "could not change backendserver, beacause vmincs and serverips is null")); } } diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerBase.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerBase.java index d8b43fa7464..53afe9abec6 100755 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerBase.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerBase.java @@ -63,6 +63,7 @@ import static org.zstack.core.Platform.*; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 8/8/2015. @@ -764,17 +765,17 @@ public void run(SyncTaskChain chain) { VipVO vipVO = Q.New(VipVO.class).eq(VipVO_.uuid, msg.getVipUuid()).find(); if (StringUtils.isEmpty(vipVO.getIp())) { - throw new OperationFailureException(operr("fail to attach vip to lb , because vip[%s] has no ip", vipVO.getUuid())); + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10017, "fail to attach vip to lb , because vip[%s] has no ip", vipVO.getUuid())); } if (NetworkUtils.isIpv4Address(vipVO.getIp())) { if (!StringUtils.isEmpty(self.getVipUuid())) { - throw new OperationFailureException(operr("fail to attach ipv4 vip to lb , because lb[%s] has ipv4 vip[%s]", self.getUuid(), self.getVipUuid())); + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10018, "fail to attach ipv4 vip to lb , because lb[%s] has ipv4 vip[%s]", self.getUuid(), self.getVipUuid())); } self.setVipUuid(vipVO.getUuid()); } else { if (!StringUtils.isEmpty(self.getIpv6VipUuid())) { - throw new OperationFailureException(operr("fail to attach ipv6 vip to lb , because lb[%s] has ipv6 vip[%s]", self.getUuid(), self.getVipUuid())); + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10019, "fail to attach ipv6 vip to lb , because lb[%s] has ipv6 vip[%s]", self.getUuid(), self.getVipUuid())); } self.setIpv6VipUuid(vipVO.getUuid()); } @@ -851,7 +852,7 @@ public void run(SyncTaskChain chain) { if (bkd != null) { if (!bkd.canDetachVipFromLb(lbStruct, vipVO)) { - reply.setError(operr("cloud not delete vip[%s]", vipVO.getUuid())); + reply.setError(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10020, "cloud not delete vip[%s]", vipVO.getUuid())); bus.reply(msg, reply); chain.next(); return; @@ -1175,7 +1176,7 @@ public void handle(Map data) { error(new FlowErrorHandler(msg) { @Override public void handle(ErrorCode errCode, Map data) { - evt.setError(err(SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); + evt.setError(err(ORG_ZSTACK_NETWORK_SERVICE_LB_10021, SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); bus.publish(evt); } }); @@ -1652,7 +1653,7 @@ private void addVmNicToListener(final AttachServerGroupToListenerStruct struct, List nicUuids = new ArrayList<>(struct.getVmNicWeight().keySet()); final String providerType = f.getProviderTypeByVmNicUuid(nicUuids.isEmpty() ? null : nicUuids.get(0)); if (providerType == null) { - throw new OperationFailureException(operr("can not get service providerType for load balancer listener [uuid:%s]", struct.listenerUuid)); + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10022, "can not get service providerType for load balancer listener [uuid:%s]", struct.listenerUuid)); } final List nics = new ArrayList<>(); @@ -1681,7 +1682,7 @@ public void run(FlowTrigger trigger, Map data) { init = true; } else { if (!providerType.equals(self.getProviderType())) { - throw new OperationFailureException(operr("service provider type mismatching. The load balancer[uuid:%s] is provided by the service provider[type:%s]," + + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10023, "service provider type mismatching. The load balancer[uuid:%s] is provided by the service provider[type:%s]," + " but new service provider is [type: %s]", self.getUuid(), self.getProviderType(),providerType)); } } @@ -1783,7 +1784,7 @@ public void run(final SyncTaskChain chain) { .eq(LoadBalancerListenerVO_.protocol, msg.getProtocol()) .eq(LoadBalancerListenerVO_.loadBalancerPort, msg.getLoadBalancerPort()).isExists()) { APICreateLoadBalancerListenerEvent evt = new APICreateLoadBalancerListenerEvent(msg.getId()); - evt.setError(argerr("there is listener with same port [%s] and same load balancer [uuid:%s]", + evt.setError(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10024, "there is listener with same port [%s] and same load balancer [uuid:%s]", msg.getLoadBalancerPort(), msg.getLoadBalancerUuid())); bus.publish(evt); @@ -2169,7 +2170,7 @@ private String[] getHeathCheckTarget(String ListenerUuid) { String[] ts = target.split(":"); if (ts.length != 2) { - throw new OperationFailureException(argerr("invalid health target[%s], the format is targetCheckProtocol:port, for example, tcp:default", target)); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10025, "invalid health target[%s], the format is targetCheckProtocol:port, for example, tcp:default", target)); } return ts; } @@ -2341,7 +2342,7 @@ public void run(SyncTaskChain chain) { LoadBalancerSystemTags.HEALTH_PARAMETER_TOKEN); String[] pm = param.split(":"); if (pm.length != 3) { - throw new OperationFailureException(argerr("invalid health checking parameters[%s], the format is method:URI:code, for example, GET:/index.html:http_2xx", param)); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10026, "invalid health checking parameters[%s], the format is method:URI:code, for example, GET:/index.html:http_2xx", param)); } if (msg.getHealthCheckMethod() != null) { diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerManagerImpl.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerManagerImpl.java index a250c07afcd..ba27d6efb38 100755 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerManagerImpl.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerManagerImpl.java @@ -62,6 +62,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 8/8/2015. @@ -98,7 +99,7 @@ public void handleMessage(Message msg) { private void passThrough(LoadBalancerMessage msg) { LoadBalancerVO vo = dbf.findByUuid(msg.getLoadBalancerUuid(), LoadBalancerVO.class); if (vo == null) { - throw new OperationFailureException(operr("cannot find the load balancer[uuid:%s]", msg.getLoadBalancerUuid())); + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10000, "cannot find the load balancer[uuid:%s]", msg.getLoadBalancerUuid())); } LoadBalancerBase base = new LoadBalancerBase(vo); @@ -503,7 +504,7 @@ private void prepareSystemTags() { AbstractSystemTagOperationJudger judger = new AbstractSystemTagOperationJudger() { @Override public void tagPreDeleted(SystemTagInventory tag) { - throw new OperationFailureException(operr("cannot delete the system tag[%s]. The load balancer plugin relies on it, you can only update it", tag.getTag())); + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_LB_10001, "cannot delete the system tag[%s]. The load balancer plugin relies on it, you can only update it", tag.getTag())); } }; LoadBalancerSystemTags.BALANCER_ALGORITHM.installJudger(judger); @@ -522,7 +523,7 @@ public void validateSystemTag(String resourceUuid, Class resourceType, String sy Map tokens = LoadBalancerSystemTags.BALANCER_WEIGHT.getTokensByTag(systemTag); String nicUuid = tokens.get(LoadBalancerSystemTags.BALANCER_NIC_TOKEN); if (!dbf.isExist(nicUuid, VmNicVO.class)) { - throw new ApiMessageInterceptionException(argerr("nic[uuid:%s] not found. Please correct your system tag[%s] of loadbalancer", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10002, "nic[uuid:%s] not found. Please correct your system tag[%s] of loadbalancer", nicUuid, systemTag)); } @@ -530,11 +531,11 @@ public void validateSystemTag(String resourceUuid, Class resourceType, String sy try { long weight = Long.parseLong(s); if (weight < LoadBalancerConstants.BALANCER_WEIGHT_MIN || weight > LoadBalancerConstants.BALANCER_WEIGHT_MAX) { - throw new OperationFailureException(argerr("invalid balancer weight[%s], %s is not in the range [%d, %d]", + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10003, "invalid balancer weight[%s], %s is not in the range [%d, %d]", systemTag, s, LoadBalancerConstants.BALANCER_WEIGHT_MIN, LoadBalancerConstants.BALANCER_WEIGHT_MAX)); } } catch (NumberFormatException e) { - throw new OperationFailureException(argerr("invalid balancer weight[%s], %s is not a number", systemTag, s)); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10004, "invalid balancer weight[%s], %s is not a number", systemTag, s)); } } }); @@ -546,7 +547,7 @@ public void validateSystemTag(String resourceUuid, Class resourceType, String sy LoadBalancerSystemTags.BALANCER_ALGORITHM_TOKEN); if (!LoadBalancerConstants.BALANCE_ALGORITHMS.contains(algorithm)) { - throw new OperationFailureException(argerr("invalid balance algorithm[%s], valid algorithms are %s", algorithm, LoadBalancerConstants.BALANCE_ALGORITHMS)); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10005, "invalid balance algorithm[%s], valid algorithms are %s", algorithm, LoadBalancerConstants.BALANCE_ALGORITHMS)); } } }); @@ -622,7 +623,7 @@ public void validateSystemTag(String resourceUuid, Class resourceType, String sy try { Long.parseLong(s); } catch (NumberFormatException e) { - throw new OperationFailureException(argerr("invalid unhealthy threshold[%s], %s is not a number", systemTag, s)); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10006, "invalid unhealthy threshold[%s], %s is not a number", systemTag, s)); } } }); @@ -636,7 +637,7 @@ public void validateSystemTag(String resourceUuid, Class resourceType, String sy try { Long.parseLong(s); } catch (NumberFormatException e) { - throw new OperationFailureException(argerr("invalid healthy threshold[%s], %s is not a number", systemTag, s)); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10007, "invalid healthy threshold[%s], %s is not a number", systemTag, s)); } } }); @@ -650,7 +651,7 @@ public void validateSystemTag(String resourceUuid, Class resourceType, String sy try { Long.parseLong(s); } catch (NumberFormatException e) { - throw new OperationFailureException(argerr("invalid healthy timeout[%s], %s is not a number", systemTag, s)); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10008, "invalid healthy timeout[%s], %s is not a number", systemTag, s)); } } }); @@ -664,7 +665,7 @@ public void validateSystemTag(String resourceUuid, Class resourceType, String sy try { Long.parseLong(s); } catch (NumberFormatException e) { - throw new OperationFailureException(argerr("invalid connection idle timeout[%s], %s is not a number", systemTag, s)); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10009, "invalid connection idle timeout[%s], %s is not a number", systemTag, s)); } } }); @@ -678,7 +679,7 @@ public void validateSystemTag(String resourceUuid, Class resourceType, String sy try { Long.parseLong(s); } catch (NumberFormatException e) { - throw new OperationFailureException(argerr("invalid health check interval[%s], %s is not a number", systemTag, s)); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10010, "invalid health check interval[%s], %s is not a number", systemTag, s)); } } }); @@ -692,7 +693,7 @@ public void validateSystemTag(String resourceUuid, Class resourceType, String sy try { Long.parseLong(s); } catch (NumberFormatException e) { - throw new OperationFailureException(argerr("invalid max connection[%s], %s is not a number", systemTag, s)); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10011, "invalid max connection[%s], %s is not a number", systemTag, s)); } } }); @@ -706,7 +707,7 @@ public void validateSystemTag(String resourceUuid, Class resourceType, String sy try { Long.parseLong(s); } catch (NumberFormatException e) { - throw new OperationFailureException(argerr("invalid process number[%s], %s is not a number", systemTag, s)); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10012, "invalid process number[%s], %s is not a number", systemTag, s)); } } }); @@ -719,12 +720,12 @@ public void validateSystemTag(String resourceUuid, Class resourceType, String sy String[] ts = target.split(":"); if (ts.length != 2) { - throw new OperationFailureException(argerr("invalid health target[%s], the format is targetCheckProtocol:port, for example, tcp:default", systemTag)); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10013, "invalid health target[%s], the format is targetCheckProtocol:port, for example, tcp:default", systemTag)); } String protocol = ts[0]; if (!LoadBalancerConstants.HEALTH_CHECK_TARGET_PROTOCOLS.contains(protocol)) { - throw new OperationFailureException(argerr("invalid health target[%s], the target checking protocol[%s] is invalid, valid protocols are %s", + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10014, "invalid health target[%s], the target checking protocol[%s] is invalid, valid protocols are %s", systemTag, protocol, LoadBalancerConstants.HEALTH_CHECK_TARGET_PROTOCOLS)); } @@ -733,10 +734,10 @@ public void validateSystemTag(String resourceUuid, Class resourceType, String sy try { int p = Integer.parseInt(port); if (p < 1 || p > 65535) { - throw new OperationFailureException(argerr("invalid invalid health target[%s], port[%s] is not in the range of [1, 65535]", systemTag, port)); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10015, "invalid invalid health target[%s], port[%s] is not in the range of [1, 65535]", systemTag, port)); } } catch (NumberFormatException e) { - throw new OperationFailureException(argerr("invalid invalid health target[%s], port[%s] is not a number", systemTag, port)); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10016, "invalid invalid health target[%s], port[%s] is not a number", systemTag, port)); } } } diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerWeightOperator.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerWeightOperator.java index bc2e9d6e4e5..dadb6fb969a 100644 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerWeightOperator.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerWeightOperator.java @@ -23,6 +23,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * @author: zhanyong.miao @@ -109,7 +110,7 @@ public void setWeight(String listenerUuid, String nicUuid, Long weight) { DebugUtils.Assert(listenerUuid != null && nicUuid != null, String.format("invalid parameter listener uuid:%s nicUuid:%s", listenerUuid, nicUuid)); if ( weight < LoadBalancerConstants.BALANCER_WEIGHT_MIN || weight > LoadBalancerConstants.BALANCER_WEIGHT_MAX) { - throw new OperationFailureException(argerr("invalid balancer weight for nic:%s, %d is not in the range [%d, %d]", nicUuid, weight, LoadBalancerConstants.BALANCER_WEIGHT_MIN, LoadBalancerConstants.BALANCER_WEIGHT_MAX)); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SERVICE_LB_10027, "invalid balancer weight for nic:%s, %d is not in the range [%d, %d]", nicUuid, weight, LoadBalancerConstants.BALANCER_WEIGHT_MIN, LoadBalancerConstants.BALANCER_WEIGHT_MAX)); } SimpleQuery q = dbf.createQuery(SystemTagVO.class); diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/AllocatePrimaryStorageForVmMigrationFlow.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/AllocatePrimaryStorageForVmMigrationFlow.java index 360f9e437ad..20797a43813 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/AllocatePrimaryStorageForVmMigrationFlow.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/AllocatePrimaryStorageForVmMigrationFlow.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.List; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 10/24/2015. @@ -82,7 +83,7 @@ public HostVO call(HostVO arg) { }); if (candidates.isEmpty()) { - fail(Platform.operr("no hosts can provide %s bytes for all volumes of the vm[uuid:%s]", volumeSize, spec.getVmInstance().getUuid())); + fail(Platform.operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10000, "no hosts can provide %s bytes for all volumes of the vm[uuid:%s]", volumeSize, spec.getVmInstance().getUuid())); } else { next(candidates); } diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageAllocatorFactory.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageAllocatorFactory.java index 3d3a2c7f473..b72673df10a 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageAllocatorFactory.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageAllocatorFactory.java @@ -45,6 +45,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.err; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 7/1/2015. @@ -152,7 +153,7 @@ public HostVO call(HostVO arg) { }); if (candidates.isEmpty()) { - throw new OperationFailureException(err(HostAllocatorError.NO_AVAILABLE_HOST, + throw new OperationFailureException(err(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10020, HostAllocatorError.NO_AVAILABLE_HOST, "the local primary storage has no hosts with enough disk capacity[%s bytes] required by the vm[uuid:%s]", spec.getDiskSize(), spec.getVmInstance().getUuid() )); @@ -199,7 +200,7 @@ private void checkLocalStorageForVmStart(VmInstanceInventory vm, List ca if (hostUuid != null) { candidates.removeIf(h -> !hostUuid.equals(h.getUuid())); if (candidates.isEmpty()) { - throw new OperationFailureException(err(HostAllocatorError.NO_AVAILABLE_HOST, + throw new OperationFailureException(err(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10021, HostAllocatorError.NO_AVAILABLE_HOST, "the vm[uuid: %s] using local primary storage can only be started on the host[uuid: %s], but the host is either not having enough CPU/memory/GPU/VFNIC or in" + " the state[Enabled] or status[Connected] to start the vm", vm.getUuid(), hostUuid )); @@ -350,7 +351,7 @@ public String allocateSpaceDryRun(AllocatePrimaryStorageSpaceMsg msg, PrimarySto String hostUuid = getHostUuidFromAllocateMsg(msg); if (hostUuid == null) { - throw new OperationFailureException(argerr("To create volume on the local primary storage, " + + throw new OperationFailureException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10022, "To create volume on the local primary storage, " + "you must specify the host that the volume is going to be created using the system tag [%s]", LocalStorageSystemTags.DEST_HOST_FOR_CREATING_DATA_VOLUME.getTagFormat())); } @@ -382,7 +383,7 @@ private String getHostUuidFromAllocateMsg(AllocatePrimaryStorageSpaceMsg msg) { protocol = new URI(msg.getRequiredInstallUri()).getScheme(); } catch (URISyntaxException e) { throw new OperationFailureException( - argerr("invalid uri, correct example is file://$URL;hostUuid://$HOSTUUID or volume://$VOLUMEUUID ")); + argerr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10023, "invalid uri, correct example is file://$URL;hostUuid://$HOSTUUID or volume://$VOLUMEUUID ")); } hostUuid = uriParsers.get(protocol).parseUri(msg.getRequiredInstallUri()).hostUuid; } diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageApiInterceptor.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageApiInterceptor.java index a009eb7c3af..a4f135aafff 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageApiInterceptor.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageApiInterceptor.java @@ -32,6 +32,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 7/1/2015. @@ -86,22 +87,22 @@ protected void scripts() { .eq(LocalStorageResourceRefVO_.resourceType,VolumeVO.class.getSimpleName()) .eq(LocalStorageResourceRefVO_.resourceUuid,msg.getVolumeUuid()).find(); if (ref == null) { - throw new ApiMessageInterceptionException(argerr("the volume[uuid:%s] is not on any local primary storage", msg.getVolumeUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10001, "the volume[uuid:%s] is not on any local primary storage", msg.getVolumeUuid())); } msg.setPrimaryStorageUuid(ref.getPrimaryStorageUuid()); if (ref.getHostUuid().equals(msg.getDestHostUuid())) { - throw new ApiMessageInterceptionException(argerr("the volume[uuid:%s] is already on the host[uuid:%s]", msg.getVolumeUuid(), msg.getDestHostUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10002, "the volume[uuid:%s] is already on the host[uuid:%s]", msg.getVolumeUuid(), msg.getDestHostUuid())); } //2.confirm primary storage is available. PrimaryStorageVO vo = Q.New(PrimaryStorageVO.class).eq(PrimaryStorageVO_.uuid,ref.getPrimaryStorageUuid()).find(); if (vo == null) { - throw new ApiMessageInterceptionException(argerr("the primary storage[uuid:%s] is not found", msg.getPrimaryStorageUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10003, "the primary storage[uuid:%s] is not found", msg.getPrimaryStorageUuid())); } if (vo.getState() == PrimaryStorageState.Disabled || vo.getState() == PrimaryStorageState.Maintenance) { - throw new ApiMessageInterceptionException(argerr("the primary storage[uuid:%s] is disabled or maintenance cold migrate is not allowed", ref.getPrimaryStorageUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10004, "the primary storage[uuid:%s] is disabled or maintenance cold migrate is not allowed", ref.getPrimaryStorageUuid())); } //3.confirm the dest host belong to the local storage where the volume locates and physical capacity is enough @@ -110,25 +111,25 @@ protected void scripts() { .eq(LocalStorageHostRefVO_.primaryStorageUuid,ref.getPrimaryStorageUuid()) .find(); if (refVO == null) { - throw new ApiMessageInterceptionException(argerr("the dest host[uuid:%s] doesn't belong to the local primary storage[uuid:%s] where the" + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10005, "the dest host[uuid:%s] doesn't belong to the local primary storage[uuid:%s] where the" + " volume[uuid:%s] locates", msg.getDestHostUuid(), ref.getPrimaryStorageUuid(), msg.getVolumeUuid())); } double physicalThreshold = physicalCapacityMgr.getRatio(msg.getPrimaryStorageUuid()); if (!((refVO.getTotalPhysicalCapacity() * (1.0 - physicalThreshold)) <= refVO.getAvailablePhysicalCapacity())) { - throw new ApiMessageInterceptionException(argerr("the dest host[uuid:%s] doesn't have enough physical capacity due to the threshold of " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10006, "the dest host[uuid:%s] doesn't have enough physical capacity due to the threshold of " + "primary storage[uuid:%s] is %f but available physical capacity is %d", msg.getDestHostUuid(), msg.getPrimaryStorageUuid(), physicalThreshold, refVO.getAvailablePhysicalCapacity())); } //4.confirm primary storage is available. VolumeVO vol = Q.New(VolumeVO.class).eq(VolumeVO_.uuid,msg.getVolumeUuid()).find(); if (VolumeStatus.Ready != vol.getStatus()) { - throw new ApiMessageInterceptionException(argerr("the volume[uuid:%s] is not in status of Ready, cannot migrate it", msg.getVolumeUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10007, "the volume[uuid:%s] is not in status of Ready, cannot migrate it", msg.getVolumeUuid())); } //5.confirm that the data volume and iso has detach the vm and the root volume will migrate to appropriate cluster. if (vol.getType() == VolumeType.Data && vol.getVmInstanceUuid() != null) { - throw new ApiMessageInterceptionException(argerr("the data volume[uuid:%s, name: %s] is still attached to the VM[uuid:%s]. Please detach" + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10008, "the data volume[uuid:%s, name: %s] is still attached to the VM[uuid:%s]. Please detach" + " it before migration", vol.getUuid(), vol.getName(), vol.getVmInstanceUuid())); } else if (vol.getType() == VolumeType.Root) { msg.setVmInstanceUuid(vol.getVmInstanceUuid()); @@ -136,7 +137,7 @@ protected void scripts() { .select(VmInstanceVO_.state) .eq(VmInstanceVO_.uuid,vol.getVmInstanceUuid()).findValue(); if (VmInstanceState.Stopped != vmstate) { - throw new ApiMessageInterceptionException(operr("the volume[uuid:%s] is the root volume of the vm[uuid:%s]. Currently the vm is in" + + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10009, "the volume[uuid:%s] is the root volume of the vm[uuid:%s]. Currently the vm is in" + " state of %s, please stop it before migration", vol.getUuid(), vol.getVmInstanceUuid(), vmstate)); } @@ -144,12 +145,12 @@ protected void scripts() { .eq(VolumeVO_.type,VolumeType.Data) .eq(VolumeVO_.vmInstanceUuid,vol.getVmInstanceUuid()).count(); if (count != 0) { - throw new ApiMessageInterceptionException(operr("the volume[uuid:%s] is the root volume of the vm[uuid:%s]. Currently the vm still" + + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10010, "the volume[uuid:%s] is the root volume of the vm[uuid:%s]. Currently the vm still" + " has %s data volumes attached, please detach them before migration", vol.getUuid(), vol.getVmInstanceUuid(), count)); } if (IsoOperator.isIsoAttachedToVm(vol.getVmInstanceUuid())) { - throw new ApiMessageInterceptionException(operr("the volume[uuid:%s] is the root volume of the vm[uuid:%s]. Currently the vm still" + + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10011, "the volume[uuid:%s] is the root volume of the vm[uuid:%s]. Currently the vm still" + " has ISO attached, please detach it before migration", vol.getUuid(), vol.getVmInstanceUuid())); } @@ -161,7 +162,7 @@ protected void scripts() { .eq(VmInstanceVO_.uuid, vol.getVmInstanceUuid()).findValue(); if(originClusterUuid == null){ throw new ApiMessageInterceptionException( - err(SysErrors.INTERNAL,"The clusterUuid of vm[uuid:%s] cannot be null when migrate the root volume[uuid:%s, name: %s]",vol.getVmInstanceUuid(),vol.getUuid(),vol.getName())); + err(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10012, SysErrors.INTERNAL,"The clusterUuid of vm[uuid:%s] cannot be null when migrate the root volume[uuid:%s, name: %s]",vol.getVmInstanceUuid(),vol.getUuid(),vol.getName())); } if(!originClusterUuid.equals(clusterUuid)){ @@ -174,7 +175,7 @@ protected void scripts() { for(String l2:originL2NetworkList){ if(!l2NetworkList.contains(l2)){ throw new ApiMessageInterceptionException( - operr("The two clusters[uuid:%s,uuid:%s] cannot access each other in l2 network when migrate the vm[uuid:%s] to another cluster", originClusterUuid, clusterUuid, vol.getVmInstanceUuid())); + operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10013, "The two clusters[uuid:%s,uuid:%s] cannot access each other in l2 network when migrate the vm[uuid:%s] to another cluster", originClusterUuid, clusterUuid, vol.getVmInstanceUuid())); } } } @@ -188,10 +189,10 @@ protected void scripts() { private void validate(APIAddLocalPrimaryStorageMsg msg) { String url = msg.getUrl(); if (!url.startsWith("/")) { - throw new ApiMessageInterceptionException(argerr("the url[%s] is not an absolute path starting with '/'", msg.getUrl())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10014, "the url[%s] is not an absolute path starting with '/'", msg.getUrl())); } if (url.startsWith("/dev") || url.startsWith("/proc") || url.startsWith("/sys")) { - throw new ApiMessageInterceptionException(argerr(" the url contains an invalid folder[/dev or /proc or /sys]")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10015, " the url contains an invalid folder[/dev or /proc or /sys]")); } } @@ -212,7 +213,7 @@ private void validate(APIAttachDataVolumeToVmMsg msg) { } if (vmHostUuid != null && !Objects.equals(vmHostUuid, volumeHostUuid)) { - throw new ApiMessageInterceptionException(operr("the host of the vm[hostUuid:%s] is different from " + + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10016, "the host of the vm[hostUuid:%s] is different from " + "that of the volume[hostUuid:%s]. the volume cannot attach to the vm.", vmHostUuid, volumeHostUuid)); } @@ -234,11 +235,11 @@ private void validate(APIAttachDataVolumeToVmMsg msg) { List vmVolumes = vmVolumeHostUuidTuples.stream() .map(t -> String.format("volume[%s] is on host[%s]", t.get(0, String.class), t.get(1, String.class))).collect(Collectors.toList()); throw new ApiMessageInterceptionException( - operr("the vm has multiple local volumes on different hosts[%s]. " + + operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10017, "the vm has multiple local volumes on different hosts[%s]. " + "please check the abnormal vm local volumes", vmVolumes.toString())); } if (!Objects.equals(vmVolumeHostUuids.get(0), volumeHostUuid)) { - throw new ApiMessageInterceptionException(operr("the volume on a host[hostUuid:%s] cannot be attached to the vm, " + + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10018, "the volume on a host[hostUuid:%s] cannot be attached to the vm, " + "because the vm has local volumes on other host[hostUuid:%s]", volumeHostUuid, vmVolumeHostUuids.get(0))); } } diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java index 5e4697ac8f5..ed98d99747a 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java @@ -67,6 +67,7 @@ import static org.zstack.core.progress.ProgressReportService.createSubTaskProgress; import static org.zstack.storage.primary.local.LocalStorageUtils.getHostUuidFromInstallUrl; import static org.zstack.utils.CollectionDSL.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 6/30/2015. @@ -225,7 +226,7 @@ protected void scripts() { String originVmUuid = tuple.get(1, String.class); if (originClusterUuid == null) { throw new ApiMessageInterceptionException( - err(SysErrors.INTERNAL, "The clusterUuid of vm cannot be null when migrate the vm")); + err(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10024, SysErrors.INTERNAL, "The clusterUuid of vm cannot be null when migrate the vm")); } @@ -267,7 +268,7 @@ private void handle(final APILocalStorageMigrateVolumeMsg msg) { final APILocalStorageMigrateVolumeEvent evt = new APILocalStorageMigrateVolumeEvent(msg.getId()); if (self.getState() == PrimaryStorageState.Disabled) { - evt.setError(operr("The primary storage[uuid:%s] is disabled cold migrate is not allowed", msg.getPrimaryStorageUuid())); + evt.setError(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10025, "The primary storage[uuid:%s] is disabled cold migrate is not allowed", msg.getPrimaryStorageUuid())); bus.publish(evt); return; } @@ -546,7 +547,7 @@ private void migrateVolume(MigrateVolumeOnLocalStorageMsg msg, NoErrorCompletion refq.add(LocalStorageResourceRefVO_.resourceType, Op.EQ, VolumeVO.class.getSimpleName()); LocalStorageResourceRefVO ref = refq.find(); if (ref == null) { - reply.setError(operr("volume[uuid:%s] is not on the local storage anymore," + + reply.setError(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10026, "volume[uuid:%s] is not on the local storage anymore," + "it may have been deleted", msg.getVolumeUuid())); bus.reply(msg, reply); completion.done(); @@ -1096,7 +1097,7 @@ private void handle(APIGetLocalStorageHostDiskCapacityMsg msg) { HostStatus status = Q.New(HostVO.class).select(HostVO_.status) .eq(HostVO_.uuid, msg.getHostUuid()).findValue(); if (status == HostStatus.Connected) { - reply.setError(err(SysErrors.RESOURCE_NOT_FOUND, + reply.setError(err(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10027, SysErrors.RESOURCE_NOT_FOUND, "local primary storage[uuid:%s] doesn't have the host[uuid:%s]", self.getUuid(), msg.getHostUuid())); bus.reply(msg, reply); @@ -1192,7 +1193,7 @@ synchronized void addError(HostError err) { @Override public void done() { if (ret.errorCodes.size() == hostUuids.size()) { - reply.setError(operr("failed to download image[uuid:%s] to all hosts in the local storage[uuid:%s]" + + reply.setError(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10028, "failed to download image[uuid:%s] to all hosts in the local storage[uuid:%s]" + ". %s", msg.getImage().getUuid(), self.getUuid(), JSONObjectUtil.toJsonString(ret.errorCodes))); } else if (!ret.errorCodes.isEmpty()) { for (HostError err : ret.errorCodes) { @@ -1303,7 +1304,7 @@ private void handle(final CreateVolumeFromVolumeSnapshotOnPrimaryStorageMsg msg) final String hostUuid = getHostUuidByResourceUuid(sinv.getUuid()); if (hostUuid == null) { throw new OperationFailureException(inerr( - "the volume snapshot[uuid:%s] is not on the local primary storage[uuid: %s]; the local primary storage" + + ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10029, "the volume snapshot[uuid:%s] is not on the local primary storage[uuid: %s]; the local primary storage" + " doesn't support the manner of downloading snapshots and creating the volume", sinv.getUuid(), self.getUuid() )); } @@ -1437,10 +1438,10 @@ protected String scripts() { .param("resUuid", resUuid) .find(); if (uuid == null) { - throw new OperationFailureException(operr("cannot find any host which has resource[uuid:%s]", resUuid)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10030, "cannot find any host which has resource[uuid:%s]", resUuid)); } else if (findHostByUuid(uuid) == null) { throw new OperationFailureException( - operr("Resource[uuid:%s] can only be operated on host[uuid:%s], but the host has been deleted", + operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10031, "Resource[uuid:%s] can only be operated on host[uuid:%s], but the host has been deleted", resUuid, uuid)); } return uuid; @@ -2323,7 +2324,7 @@ public void fail(ErrorCode errorCode) { @Override protected void handle(final DownloadDataVolumeToPrimaryStorageMsg msg) { if (msg.getHostUuid() == null && msg.getAllocatedInstallUrl() == null) { - throw new OperationFailureException(operr("unable to create the data volume[uuid: %s] on a local primary storage[uuid:%s], because the hostUuid is not specified.", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10032, "unable to create the data volume[uuid: %s] on a local primary storage[uuid:%s], because the hostUuid is not specified.", msg.getVolumeUuid(), self.getUuid())); } @@ -2386,7 +2387,7 @@ public void handle(ErrorCode errCode, Map data) { @Override protected void handle(GetInstallPathForDataVolumeDownloadMsg msg) { if (msg.getHostUuid() == null && msg.getAllocatedInstallUrl() == null) { - throw new OperationFailureException(operr("unable to create the data volume[uuid: %s] on a local primary storage[uuid:%s], because the hostUuid is not specified.", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10033, "unable to create the data volume[uuid: %s] on a local primary storage[uuid:%s], because the hostUuid is not specified.", msg.getVolumeUuid(), self.getUuid())); } @@ -2996,7 +2997,7 @@ private boolean hostHasInitializedTag(String hostUuid) { private void checkLocalStoragePrimaryStorageInitilized(LocalStorageInitParam param, Completion completion) { List hosts = getLocalStorageHosts(); if (!param.isNewAdded && hosts.size() == 0) { - completion.fail(operr("No Host state is Enabled, Please check the availability of the host")); + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10034, "No Host state is Enabled, Please check the availability of the host")); } else { checkLocalStoragePrimaryStorageInitilized(param, hosts, completion); } @@ -3137,7 +3138,7 @@ protected LocalStorageHypervisorFactory getHypervisorBackendFactoryByHostUuid(St if (checkPsRef && !Q.New(LocalStorageHostRefVO.class) .eq(LocalStorageHostRefVO_.hostUuid, hostUuid) .eq(LocalStorageHostRefVO_.primaryStorageUuid, self.getUuid()).isExists()) { - throw new OperationFailureException(operr("host[uuid:%s] cannot access local storage[uuid:%s], maybe it is detached", hostUuid, self.getUuid())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10035, "host[uuid:%s] cannot access local storage[uuid:%s], maybe it is detached", hostUuid, self.getUuid())); } SimpleQuery q = dbf.createQuery(HostVO.class); @@ -3161,12 +3162,12 @@ private LocalStorageHypervisorFactory getHypervisorBackendFactoryByResourceUuid( List ret = q.getResultList(); if (ret.isEmpty()) { throw new OperationFailureException( - operr("resource[uuid:%s, type: %s] is not on the local primary storage[uuid:%s]", + operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10036, "resource[uuid:%s, type: %s] is not on the local primary storage[uuid:%s]", resUuid, resourceType, self.getUuid())); } if (ret.size() != 1) { throw new OperationFailureException( - operr("resource[uuid:%s, type: %s] on the local primary storage[uuid:%s] maps to multiple hypervisor%s", + operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10037, "resource[uuid:%s, type: %s] on the local primary storage[uuid:%s] maps to multiple hypervisor%s", resUuid, resourceType, self.getUuid(), ret)); } @@ -3210,7 +3211,7 @@ protected void checkImageIfNeedToDownload(DownloadIsoToPrimaryStorageMsg msg) { .isExists()) { throw new OperationFailureException(operr( - "cannot attach ISO to a primary storage[uuid:%s] which is disabled", + ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10038, "cannot attach ISO to a primary storage[uuid:%s] which is disabled", self.getUuid())); } } @@ -3263,7 +3264,7 @@ protected void handle(CheckVolumeSnapshotOperationOnPrimaryStorageMsg msg) { .param("volUuids", msg.getVolumeUuids()) .list(); if (!disconnectHostUuids.isEmpty()) { - r.setError(err(HostErrors.HOST_IS_DISCONNECTED, "host(s)[uuids: %s] volume locate is not Connected.", disconnectHostUuids)); + r.setError(err(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10039, HostErrors.HOST_IS_DISCONNECTED, "host(s)[uuids: %s] volume locate is not Connected.", disconnectHostUuids)); } bus.reply(msg, r); @@ -3276,7 +3277,7 @@ private ErrorCode checkChangeVolumeType(String volumeUuid) { } List infos = refVols.stream().map(v -> String.format("uuid:%s, name:%s", v.getUuid(), v.getName())).collect(Collectors.toList()); - return operr("volume[uuid:%s] has reference volume[%s], can not change volume type before flatten " + + return operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10040, "volume[uuid:%s] has reference volume[%s], can not change volume type before flatten " + "them and their descendants", volumeUuid, infos.toString()); } diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageDefaultAllocateCapacityFlow.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageDefaultAllocateCapacityFlow.java index 8db3bb843b3..743153fb1de 100644 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageDefaultAllocateCapacityFlow.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageDefaultAllocateCapacityFlow.java @@ -43,6 +43,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 7/2/2015. @@ -97,7 +98,7 @@ private String getMostFreeLocalStorageUuid(String hostUuid) { if(result.isEmpty()){ String clusterUuid = Q.New(HostVO.class).select(HostVO_.clusterUuid) .eq(HostVO_.uuid, hostUuid).findValue(); - throw new OperationFailureException(operr("There is no LocalStorage primary storage[state=%s,status=%s] on the cluster[%s], when the cluster mounts multiple primary storage, the system uses the local primary storage by default. Check the state/status of primary storage and make sure they have been attached to clusters" + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10083, "There is no LocalStorage primary storage[state=%s,status=%s] on the cluster[%s], when the cluster mounts multiple primary storage, the system uses the local primary storage by default. Check the state/status of primary storage and make sure they have been attached to clusters" , PrimaryStorageState.Enabled, PrimaryStorageStatus.Connected, clusterUuid)); } return result.get(0); @@ -116,7 +117,7 @@ private String getRequiredStorageUuid(String hostUuid, String psUuid){ .eq(PrimaryStorageVO_.uuid, psUuid) .eq(PrimaryStorageVO_.type, LocalStorageConstants.LOCAL_STORAGE_TYPE) .isExists()){ - throw new OperationFailureException(argerr("the type of primary storage[uuid:%s] chosen is not local storage, " + + throw new OperationFailureException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10084, "the type of primary storage[uuid:%s] chosen is not local storage, " + "check if the resource can be created on other storage when cluster has attached local primary storage", psUuid)); }else { return getMostFreeLocalStorageUuid(hostUuid); @@ -184,7 +185,7 @@ public void run(final FlowTrigger trigger, Map data) { PrimaryStorageVO requiredPrimaryStorageUuidForDataVolume = dbf.findByUuid(spec.getRequiredPrimaryStorageUuidForDataVolume(), PrimaryStorageVO.class); // data volume ps set local if(requiredPrimaryStorageUuidForDataVolume.getType().equals(LocalStorageConstants.LOCAL_STORAGE_TYPE)){ - ErrorCode errorCode = operr("The cluster mounts multiple primary storage[%s(%s), other non-LocalStorage primary storage], primaryStorageUuidForDataVolume cannot be specified %s", + ErrorCode errorCode = operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10085, "The cluster mounts multiple primary storage[%s(%s), other non-LocalStorage primary storage], primaryStorageUuidForDataVolume cannot be specified %s", requiredPrimaryStorageUuidForDataVolume.getUuid(), requiredPrimaryStorageUuidForDataVolume.getType(), LocalStorageConstants.LOCAL_STORAGE_TYPE); trigger.fail(errorCode); diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageDesignatedAllocateCapacityFlow.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageDesignatedAllocateCapacityFlow.java index 2c7b909827f..4ef7989fda7 100644 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageDesignatedAllocateCapacityFlow.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageDesignatedAllocateCapacityFlow.java @@ -39,6 +39,7 @@ import java.util.Map; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by lining on 2017/09/29. @@ -124,13 +125,13 @@ protected void error(ErrorCode errorCode) { private ErrorCode checkIfSpecifyPrimaryStorage(VmInstanceSpec spec) { if (spec.getRequiredPrimaryStorageUuidForRootVolume() == null) { - ErrorCode errorCode = operr("The cluster[uuid=%s] mounts multiple primary storage[LocalStorage, other non-LocalStorage primary storage], You must specify the primary storage where the root disk is located", + ErrorCode errorCode = operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10067, "The cluster[uuid=%s] mounts multiple primary storage[LocalStorage, other non-LocalStorage primary storage], You must specify the primary storage where the root disk is located", spec.getDestHost().getClusterUuid()); return errorCode; } if(spec.getDataDiskOfferings() != null && !spec.getDataDiskOfferings().isEmpty() && spec.getRequiredPrimaryStorageUuidForDataVolume() == null){ - ErrorCode errorCode = operr("The cluster[uuid=%s] mounts multiple primary storage[LocalStorage, other non-LocalStorage primary storage], You must specify the primary storage where the data disk is located", + ErrorCode errorCode = operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10068, "The cluster[uuid=%s] mounts multiple primary storage[LocalStorage, other non-LocalStorage primary storage], You must specify the primary storage where the data disk is located", spec.getDestHost().getClusterUuid()); return errorCode; } diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageFactory.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageFactory.java index c2ebefbc5c8..573b1957a8e 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageFactory.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageFactory.java @@ -68,6 +68,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 6/30/2015. @@ -301,7 +302,7 @@ private String makeMediatorKey(String hvType, String bsType) { public LocalStorageBackupStorageMediator getBackupStorageMediator(String hvType, String bsType) { LocalStorageBackupStorageMediator m = backupStorageMediatorMap.get(makeMediatorKey(hvType, bsType)); if (m == null) { - throw new OperationFailureException(operr("no LocalStorageBackupStorageMediator supporting hypervisor[%s] and backup storage type[%s] ", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10043, "no LocalStorageBackupStorageMediator supporting hypervisor[%s] and backup storage type[%s] ", hvType, bsType)); } @@ -410,7 +411,7 @@ public Flow marshalVmOperationFlow(String previousFlowName, String nextFlowName, return new NoRollbackFlow() { @Override public void run(FlowTrigger trigger, Map data) { - trigger.fail(operr("creation rely on image cache[uuid:%s, locate host uuids: [%s]], cannot create other places.", imageUuid, cachedHostUuids)); + trigger.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10044, "creation rely on image cache[uuid:%s, locate host uuids: [%s]], cannot create other places.", imageUuid, cachedHostUuids)); } }; @@ -468,7 +469,7 @@ public void run(FlowTrigger trigger, Map data) { if (KVMConstant.KVM_HYPERVISOR_TYPE.equals(spec.getVmInventory().getHypervisorType())) { return new LocalStorageKvmMigrateVmFlow(); } else { - throw new OperationFailureException(operr("local storage doesn't support live migration for hypervisor[%s]", spec.getVmInventory().getHypervisorType())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10045, "local storage doesn't support live migration for hypervisor[%s]", spec.getVmInventory().getHypervisorType())); } } @@ -686,7 +687,7 @@ public void preAttachVolume(VmInstanceInventory vm, final VolumeInventory volume if (!Q.New(HostVO.class) .eq(HostVO_.uuid, volumeHostUuid) .eq(HostVO_.clusterUuid, vmClusterUuid).isExists()) { - throw new OperationFailureException(operr("Can't attach volume to VM, no qualified cluster")); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10046, "Can't attach volume to VM, no qualified cluster")); } } @@ -702,7 +703,7 @@ public void preAttachVolume(VmInstanceInventory vm, final VolumeInventory volume String dataHost = q.findValue(); if (!rootHost.equals(dataHost)) { - throw new OperationFailureException(operr("cannot attach the data volume[uuid:%s] to the vm[uuid:%s]." + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10047, "cannot attach the data volume[uuid:%s] to the vm[uuid:%s]." + " Both vm's root volume and the data volume are" + " on local primary storage, but they are on different hosts." + " The root volume[uuid:%s] is on the host[uuid:%s] but the data volume[uuid: %s]" + @@ -920,7 +921,7 @@ public void preRecoverDataVolume(VolumeInventory vol) { rq.add(LocalStorageResourceRefVO_.resourceUuid, Op.EQ, vol.getUuid()); rq.add(LocalStorageResourceRefVO_.resourceType, Op.EQ, VolumeVO.class.getSimpleName()); if (!rq.isExists()) { - throw new OperationFailureException(operr("the data volume[name:%s, uuid:%s] is on the local storage[uuid:%s]; however," + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10048, "the data volume[name:%s, uuid:%s] is on the local storage[uuid:%s]; however," + "the host on which the data volume is has been deleted. Unable to recover this volume", vol.getName(), vol.getUuid(), vol.getPrimaryStorageUuid())); } @@ -962,7 +963,7 @@ public void preRecoverVm(VmInstanceInventory vm) { rq.setParameter("rtype", VolumeVO.class.getSimpleName()); long count = rq.getSingleResult(); if (count == 0) { - throw new OperationFailureException(operr("unable to recover the vm[uuid:%s, name:%s]. The vm's root volume is on the local" + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10049, "unable to recover the vm[uuid:%s, name:%s]. The vm's root volume is on the local" + " storage[uuid:%s]; however, the host on which the root volume is has been deleted", vm.getUuid(), vm.getName(), psuuid)); } @@ -996,17 +997,17 @@ private ErrorCode checkVmMigrationCapability(VmInstanceInventory vm) { // forbid live migration with data volumes for local storage if (vm.getAllDiskVolumes().size() > 1) { - return operr("unable to live migrate vm[uuid:%s] with data volumes on local storage." + + return operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10050, "unable to live migrate vm[uuid:%s] with data volumes on local storage." + " Need detach all data volumes first.", vm.getUuid()); } if (!ImagePlatform.Linux.toString().equals(vm.getPlatform())) { - return operr("unable to live migrate vm[uuid:%s] with local storage." + + return operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10051, "unable to live migrate vm[uuid:%s] with local storage." + " Only linux guest is supported. Current platform is [%s]", vm.getUuid(), vm.getPlatform()); } if (IsoOperator.isIsoAttachedToVm(vm.getUuid())) { - return operr("unable to live migrate vm[uuid:%s] with ISO on local storage." + + return operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10052, "unable to live migrate vm[uuid:%s] with ISO on local storage." + " Need detach all ISO first.", vm.getUuid()); } @@ -1082,7 +1083,7 @@ public void instantiateDataVolumeOnCreation(InstantiateVolumeMsg msg, VolumeInve } if (hostUuid == null) { - throw new OperationFailureException(argerr("To create data volume on the local primary storage, you must specify the host that" + + throw new OperationFailureException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10053, "To create data volume on the local primary storage, you must specify the host that" + " the data volume is going to be created using the system tag [%s]", LocalStorageSystemTags.DEST_HOST_FOR_CREATING_DATA_VOLUME.getTagFormat())); } @@ -1092,7 +1093,7 @@ public void instantiateDataVolumeOnCreation(InstantiateVolumeMsg msg, VolumeInve q.add(LocalStorageHostRefVO_.hostUuid, Op.EQ, hostUuid); q.add(LocalStorageHostRefVO_.primaryStorageUuid, Op.EQ, msg.getPrimaryStorageUuid()); if (!q.isExists()) { - throw new OperationFailureException(argerr("the host[uuid:%s] doesn't belong to the local primary storage[uuid:%s]", hostUuid, msg.getPrimaryStorageUuid())); + throw new OperationFailureException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10054, "the host[uuid:%s] doesn't belong to the local primary storage[uuid:%s]", hostUuid, msg.getPrimaryStorageUuid())); } InstantiateVolumeOnPrimaryStorageMsg imsg; @@ -1345,7 +1346,7 @@ public void preCreateVolume(VolumeCreateMessage msg) { .checkRequiredSize(msg.getDiskSize()), 10); if (filterRefs.isEmpty()) { - throw new OperationFailureException(err(HostAllocatorError.NO_AVAILABLE_HOST, + throw new OperationFailureException(err(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10055, HostAllocatorError.NO_AVAILABLE_HOST, "the local primary storage[uuid:%s] has no hosts with enough disk capacity[%s bytes] required by the disk offering[uuid:%s]", psUuid, msg.getDiskSize(), diskOffering )); diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java index 86d521b1a94..3b78ffab51b 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java @@ -73,6 +73,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.core.progress.ProgressReportService.*; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 6/30/2015. @@ -140,7 +141,7 @@ protected ErrorCode buildErrorCode() { if (success) { return null; } - return operr("operation error, because:%s", error); + return operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10069, "operation error, because:%s", error); } } @@ -382,7 +383,7 @@ public static class DeleteBitsRsp extends AgentResponse { public boolean inUse; public ErrorCode buildErrorCode() { if (inUse) { - return Platform.err(VolumeErrors.VOLUME_IN_USE, getError()); + return Platform.err(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10070, VolumeErrors.VOLUME_IN_USE, getError()); } return super.buildErrorCode(); } @@ -1259,7 +1260,7 @@ public void success(AgentResponse rsp) { @Override public void fail(ErrorCode errorCode) { - completion.fail(operr("unable to create an empty volume[uuid:%s, name:%s] on the kvm host[uuid:%s]", + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10071, "unable to create an empty volume[uuid:%s, name:%s] on the kvm host[uuid:%s]", volume.getUuid(), volume.getName(), msg.getDestHost().getUuid()).causedBy(errorCode)); } }); @@ -1287,7 +1288,7 @@ void handle(DownloadVolumeTemplateToPrimaryStorageMsg msg, ReturnValueCompletion final String bsUuid = selector.select(); if (bsUuid == null) { throw new OperationFailureException(operr( - "the image[uuid:%s, name: %s] is not available to download on any backup storage:\n" + + ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10072, "the image[uuid:%s, name: %s] is not available to download on any backup storage:\n" + "1. check if image is in status of Deleted\n" + "2. check if the backup storage on which the image is shown as Ready is attached to the zone[uuid:%s]", ispec.getInventory().getUuid(), ispec.getInventory().getName(), self.getZoneUuid())); @@ -1394,7 +1395,7 @@ public void success(CreateEmptyVolumeRsp returnValue) { @Override public void fail(ErrorCode errorCode) { - completion.fail(operr("unable to create an empty volume[uuid:%s, name:%s] on the kvm host[uuid:%s]", + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10073, "unable to create an empty volume[uuid:%s, name:%s] on the kvm host[uuid:%s]", volume.getUuid(), volume.getName(), hostUuid).causedBy(errorCode)); } }); @@ -2189,12 +2190,12 @@ void handle(ReInitRootVolumeFromTemplateOnPrimaryStorageMsg msg, String hostUuid public void run(FlowTrigger trigger, Map data) { ReinitImageCmd cmd = new ReinitImageCmd(); if (msg.getVolume().getRootImageUuid() == null) { - completion.fail(operr("root image has been deleted, cannot reimage now")); + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10074, "root image has been deleted, cannot reimage now")); return; } if (!dbf.isExist(msg.getVolume().getRootImageUuid(), ImageVO.class)) { - completion.fail(operr("root image has been deleted, cannot reimage now")); + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10075, "root image has been deleted, cannot reimage now")); return; } cmd.imagePath = makeCachedImageInstallUrlFromImageUuidForTemplate(msg.getVolume().getRootImageUuid()); @@ -2337,7 +2338,7 @@ void stream(VolumeSnapshotInventory from, VolumeInventory to, boolean fullRebase if (state != VmInstanceState.Stopped && state != VmInstanceState.Running && state != VmInstanceState.Destroyed && state != VmInstanceState.Paused) { - throw new OperationFailureException(operr("the volume[uuid;%s] is attached to a VM[uuid:%s] which is in state of %s, cannot do the snapshot merge", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10076, "the volume[uuid;%s] is attached to a VM[uuid:%s] which is in state of %s, cannot do the snapshot merge", volume.getUuid(), volume.getVmInstanceUuid(), state)); } @@ -2454,7 +2455,7 @@ void handle(SyncVolumeSizeOnPrimaryStorageMsg msg, String hostUuid, final Return @Override public ErrorCode getError(KvmResponseWrapper wrapper) { GetVolumeSizeRsp rsp = wrapper.getResponse(GetVolumeSizeRsp.class); - return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10077, "operation error, because:%s", rsp.getError()); } }, new ReturnValueCompletion(completion) { @Override @@ -2665,7 +2666,7 @@ public void run(final FlowTrigger trigger, Map data) { @Override public ErrorCode getError(KvmResponseWrapper wrapper) { GetQCOW2ReferenceRsp rsp = wrapper.getResponse(GetQCOW2ReferenceRsp.class); - return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10078, "operation error, because:%s", rsp.getError()); } }, new ReturnValueCompletion(trigger) { @Override @@ -2674,7 +2675,7 @@ public void success(KvmResponseWrapper w) { if (rsp.referencePaths == null || rsp.referencePaths.isEmpty()) { trigger.next(); } else { - trigger.fail(inerr("[THIS IS A BUG NEEDED TO BE FIXED RIGHT NOW, PLEASE REPORT TO US ASAP] the image cache file[%s] is still referenced by" + + trigger.fail(inerr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10079, "[THIS IS A BUG NEEDED TO BE FIXED RIGHT NOW, PLEASE REPORT TO US ASAP] the image cache file[%s] is still referenced by" + " below QCOW2 files:\n%s", msg.getInstallPath(), StringUtils.join(rsp.referencePaths, "\n"))); } } @@ -3728,7 +3729,7 @@ void handle(ChangeVolumeTypeOnPrimaryStorageMsg msg, ReturnValueCompletion iterator, @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { - trigger.fail(operr("KVM host[uuid: %s] fails to be added into local primary storage[uuid: %s], %s", + trigger.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10060, "KVM host[uuid: %s] fails to be added into local primary storage[uuid: %s], %s", context.getInventory().getUuid(), priUuid, reply.getError())); } else { initLocalStorage(iterator, trigger, data, context); @@ -203,7 +204,7 @@ public void success(VolumeStats returnValue) { @Override public void fail(ErrorCode errorCode) { - ErrorCode err = operr("unable to create empty snapshot volume[name:%s, installpath: %s] on kvm host[uuid:%s, ip:%s], because %s", + ErrorCode err = operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10061, "unable to create empty snapshot volume[name:%s, installpath: %s] on kvm host[uuid:%s, ip:%s], because %s", msg.getSnapshotName(), msg.getInstallPath(), host.getUuid(), host.getManagementIp(), errorCode); completion.fail(err); } diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmMigrateVmFlow.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmMigrateVmFlow.java index 789924c6d8e..514e9eb998e 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmMigrateVmFlow.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmMigrateVmFlow.java @@ -58,6 +58,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 10/24/2015. @@ -939,7 +940,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply r = reply.castReply(); T rsp = r.toResponse(rspType); if (!rsp.isSuccess()) { - completion.fail(operr("operation error, because:%s", rsp.getError())); + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10041, "operation error, because:%s", rsp.getError())); return; } @@ -1206,7 +1207,7 @@ public void success(CreateEmptyVolumeRsp returnValue) { @Override public void fail(ErrorCode errorCode) { - trigger.fail(operr("unable to create an empty volume[uuid:%s, name:%s] on the kvm host[uuid:%s]", + trigger.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10042, "unable to create an empty volume[uuid:%s, name:%s] on the kvm host[uuid:%s]", p.volume.getUuid(), p.volume.getName(), dstHostUuid).causedBy(errorCode)); } }); diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmSftpBackupStorageMediatorImpl.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmSftpBackupStorageMediatorImpl.java index 528d5a446e5..94a0e2b18f3 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmSftpBackupStorageMediatorImpl.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmSftpBackupStorageMediatorImpl.java @@ -26,6 +26,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 7/1/2015. @@ -215,7 +216,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply kr = reply.castReply(); SftpDownloadBitsRsp rsp = kr.toResponse(SftpDownloadBitsRsp.class); if (!rsp.isSuccess()) { - completion.fail(operr("failed to download bits from the SFTP backup storage[hostname:%s, path: %s] to the local primary storage[uuid:%s, path: %s], %s", + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10062, "failed to download bits from the SFTP backup storage[hostname:%s, path: %s] to the local primary storage[uuid:%s, path: %s], %s", greply.getHostname(), backupStorageInstallPath, pinv.getUuid(), primaryStorageInstallPath, rsp.getError())); } else { completion.success(); @@ -264,7 +265,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply kr = reply.castReply(); SftpUploadBitsRsp rsp = kr.toResponse(SftpUploadBitsRsp.class); if (!rsp.isSuccess()) { - completion.fail(operr("failed to upload bits from the local storage[uuid:%s, path:%s] to the SFTP backup storage[hostname:%s, path:%s], %s", + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10063, "failed to upload bits from the local storage[uuid:%s, path:%s] to the SFTP backup storage[hostname:%s, path:%s], %s", pinv.getUuid(), primaryStorageInstallPath, r.getHostname(), backupStorageInstallPath, rsp.getError())); return; } diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageMainAllocatorFlow.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageMainAllocatorFlow.java index f73ea0e9c74..35d8c1cf331 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageMainAllocatorFlow.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageMainAllocatorFlow.java @@ -26,6 +26,7 @@ import static org.zstack.core.Platform.i18n; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 7/1/2015. @@ -175,7 +176,7 @@ private Result allocate(Map data) { LocalStorageHostRefVO ref = it.next(); if (!physicalCapacityMgr.checkCapacityByRatio(ref.getPrimaryStorageUuid(), ref.getTotalPhysicalCapacity(), ref.getAvailablePhysicalCapacity()) || !physicalCapacityMgr.checkRequiredCapacityByRatio(ref.getPrimaryStorageUuid(), ref.getTotalPhysicalCapacity(), spec.getTotalSize())) { - ret.causes.add(operr("{the physical capacity usage of the host[uuid:%s] has exceeded the threshold[%s]}", + ret.causes.add(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10064, "{the physical capacity usage of the host[uuid:%s] has exceeded the threshold[%s]}", ref.getHostUuid(), physicalCapacityMgr.getRatio(ref.getPrimaryStorageUuid()))); it.remove(); } @@ -291,8 +292,8 @@ public void run(FlowTrigger trigger, Map data) { return; } - ErrorCode err = ret.causes.isEmpty() ? operr(ret.errStr) : - operr(new ErrorCodeList().causedBy(ret.causes), ret.errStr); + ErrorCode err = ret.causes.isEmpty() ? operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10065, ret.errStr) : + operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10066, new ErrorCodeList().causedBy(ret.causes), ret.errStr); trigger.fail(err); } } diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageSnapshotDeletionProtector.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageSnapshotDeletionProtector.java index 2e59d6d8620..b7418375f54 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageSnapshotDeletionProtector.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageSnapshotDeletionProtector.java @@ -11,6 +11,7 @@ import java.nio.file.Path; import java.nio.file.Paths; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class LocalStorageSnapshotDeletionProtector implements VolumeSnapshotDeletionProtector { @Override @@ -22,7 +23,7 @@ public String getPrimaryStorageType() { public void protect(VolumeSnapshotInventory snapshot, Completion completion) { Path path = Paths.get(snapshot.getPrimaryStorageInstallPath()); if (!path.getParent().toString().contains(snapshot.getVolumeUuid())) { - completion.fail(inerr("the snapshot[name:%s, uuid:%s, path: %s] seems not belong to the volume[uuid:%s]", + completion.fail(inerr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10019, "the snapshot[name:%s, uuid:%s, path: %s] seems not belong to the volume[uuid:%s]", snapshot.getName(), snapshot.getUuid(), snapshot.getPrimaryStorageInstallPath(), snapshot.getVolumeUuid())); return; } diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageUtils.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageUtils.java index 00ecbaea373..95f2002d6e5 100644 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageUtils.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageUtils.java @@ -27,6 +27,7 @@ import java.util.List; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by lining on 2017/11/26. @@ -115,7 +116,7 @@ public void reserveCapacityOnHost(String hostUuid, long size, String psUuid, Pri self.getUuid(), ref.getTotalPhysicalCapacity(), ref.getAvailablePhysicalCapacity())) { - throw new OperationFailureException(operr("cannot reserve enough space for primary storage[uuid: %s] on host[uuid: %s], not enough physical capacity", self.getUuid(), hostUuid)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10056, "cannot reserve enough space for primary storage[uuid: %s] on host[uuid: %s], not enough physical capacity", self.getUuid(), hostUuid)); } LocalStorageHostCapacityStruct s = new LocalStorageHostCapacityStruct(); @@ -134,7 +135,7 @@ public void reserveCapacityOnHost(String hostUuid, long size, String psUuid, Pri if (ignoreError) { avail = 0; } else { - throw new OperationFailureException(operr("host[uuid: %s] of local primary storage[uuid: %s] doesn't have enough capacity" + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10057, "host[uuid: %s] of local primary storage[uuid: %s] doesn't have enough capacity" + "[current: %s bytes, needed: %s]", hostUuid, self.getUuid(), ref.getAvailableCapacity(), size)); } @@ -201,10 +202,10 @@ protected String scripts() { .param("resUuid", resUuid) .find(); if (uuid == null) { - throw new OperationFailureException(operr("cannot find any host which has resource[uuid:%s]", resUuid)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10058, "cannot find any host which has resource[uuid:%s]", resUuid)); } else if (findHostByUuid(uuid) == null) { throw new OperationFailureException( - operr("Resource[uuid:%s] can only be operated on host[uuid:%s], but the host has been deleted", + operr(ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10059, "Resource[uuid:%s] can only be operated on host[uuid:%s], but the host has been deleted", resUuid, uuid)); } return uuid; diff --git a/plugin/loginPlugin/src/main/java/org/zstack/login/plugin/LoginPluginBackend.java b/plugin/loginPlugin/src/main/java/org/zstack/login/plugin/LoginPluginBackend.java index 840b7d357f4..ce6e7f5a3f1 100644 --- a/plugin/loginPlugin/src/main/java/org/zstack/login/plugin/LoginPluginBackend.java +++ b/plugin/loginPlugin/src/main/java/org/zstack/login/plugin/LoginPluginBackend.java @@ -15,6 +15,7 @@ import java.util.Map; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class LoginPluginBackend implements LoginBackend { LoginType loginType = new LoginType("plugin"); @@ -51,17 +52,17 @@ public LoginType getLoginType() { @Override public void login(LoginContext loginContext, ReturnValueCompletion completion) { if (loginContext.getLoginPluginName() == null) { - throw new OperationFailureException(operr("missing loginPluginName")); + throw new OperationFailureException(operr(ORG_ZSTACK_LOGIN_PLUGIN_10000, "missing loginPluginName")); } LoginPluginExtension ext = loginPluginExtensionMap.get(loginContext.getLoginPluginName()); if (ext == null) { - throw new OperationFailureException(operr("no login plugin named %s", loginContext.getLoginPluginName())); + throw new OperationFailureException(operr(ORG_ZSTACK_LOGIN_PLUGIN_10001, "no login plugin named %s", loginContext.getLoginPluginName())); } LoginUserInfo info = ext.login(loginContext.getUsername(), loginContext.getPassword()); if (info == null || info.getUsername() == null) { - completion.fail(operr("missing LoginUserInfo when use plugin login", loginContext.getLoginPluginName())); + completion.fail(operr(ORG_ZSTACK_LOGIN_PLUGIN_10002, "missing LoginUserInfo when use plugin login", loginContext.getLoginPluginName())); return; } diff --git a/plugin/mediator/src/main/java/org/zstack/mediator/ApiValidator.java b/plugin/mediator/src/main/java/org/zstack/mediator/ApiValidator.java index a548c15a278..7a9a70be8a1 100755 --- a/plugin/mediator/src/main/java/org/zstack/mediator/ApiValidator.java +++ b/plugin/mediator/src/main/java/org/zstack/mediator/ApiValidator.java @@ -41,6 +41,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -102,7 +103,7 @@ private void validateIpRangeOverlapWithVm(String l3NetworkUuid, String vmInstanc List vmNicVOS = Q.New(VmNicVO.class).eq(VmNicVO_.vmInstanceUuid, vmInstanceUuid).list(); List newIpRangeVOS = Q.New(IpRangeVO.class).eq(IpRangeVO_.l3NetworkUuid, l3NetworkUuid).list(); if (newIpRangeVOS == null || newIpRangeVOS.isEmpty()) { - throw new ApiMessageInterceptionException(operr("no ip ranges attached with l3 network[uuid:%s]", l3NetworkUuid)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_MEDIATOR_10000, "no ip ranges attached with l3 network[uuid:%s]", l3NetworkUuid)); } List newIp4RangeVOS = newIpRangeVOS.stream().filter(ipr -> ipr.getIpVersion() == IPv6Constants.IPv4).collect(Collectors.toList()); @@ -114,13 +115,13 @@ private void validateIpRangeOverlapWithVm(String l3NetworkUuid, String vmInstanc .eq(IpRangeVO_.ipVersion, IPv6Constants.IPv6).limit(1).list(); if (!newIp4RangeVOS.isEmpty() && !ip4RangeVOS.isEmpty()) { if (NetworkUtils.isCidrOverlap(newIp4RangeVOS.get(0).getNetworkCidr(), ip4RangeVOS.get(0).getNetworkCidr())) { - throw new ApiMessageInterceptionException(operr("unable to attach a L3 network. The cidr of l3[%s] to attach overlapped with l3[%s] already attached to vm", l3NetworkUuid, vmNicVO.getL3NetworkUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_MEDIATOR_10001, "unable to attach a L3 network. The cidr of l3[%s] to attach overlapped with l3[%s] already attached to vm", l3NetworkUuid, vmNicVO.getL3NetworkUuid())); } } if (!newIp6RangeVOS.isEmpty() && !ip6RangeVOS.isEmpty()) { if (IPv6NetworkUtils.isIpv6RangeOverlap(ip6RangeVOS.get(0).getStartIp(), ip6RangeVOS.get(0).getEndIp(), newIp6RangeVOS.get(0).getStartIp(), newIp6RangeVOS.get(0).getEndIp())) { - throw new ApiMessageInterceptionException(operr("unable to attach a L3 network. The cidr of l3[%s] to attach overlapped with l3[%s] already attached to vm", l3NetworkUuid, vmNicVO.getL3NetworkUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_MEDIATOR_10002, "unable to attach a L3 network. The cidr of l3[%s] to attach overlapped with l3[%s] already attached to vm", l3NetworkUuid, vmNicVO.getL3NetworkUuid())); } } } @@ -152,7 +153,7 @@ private void isVmNicUsedByPortForwarding(String vmNicUuid) { List pfStr = pfs.stream().map(pf -> String.format("(name:%s, ip:%s)", pf.getName(), pf.getVipIp())).collect(Collectors.toList()); - throw new ApiMessageInterceptionException(operr("the vm[name:%s, uuid:%s] already has some port forwarding rules%s attached", vm.getName(), vm.getUuid(), + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_MEDIATOR_10003, "the vm[name:%s, uuid:%s] already has some port forwarding rules%s attached", vm.getName(), vm.getUuid(), StringUtils.join(pfStr, ","))); } } @@ -173,7 +174,7 @@ private void isVmNicUsedByEip(String vmNicUuid) { List eipStr = eips.stream().map(eip -> String.format("(name:%s, ip:%s)", eip.getName(), eip.getVipIp())).collect(Collectors.toList()); - throw new ApiMessageInterceptionException(operr("the vm[name:%s, uuid:%s] already has some EIPs%s attached", vm.getName(), vm.getUuid(), + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_MEDIATOR_10004, "the vm[name:%s, uuid:%s] already has some EIPs%s attached", vm.getName(), vm.getUuid(), StringUtils.join(eipStr, ","))); } } @@ -188,7 +189,7 @@ private void validate(APICreateEipMsg msg) { if(useFor != null && !useFor.isEmpty()) { VipUseForList useForList = new VipUseForList(useFor); if (!useForList.validateNewAdded(EipConstant.EIP_NETWORK_SERVICE_TYPE)) { - throw new ApiMessageInterceptionException(operr("the vip[uuid:%s] already has bound to other service[%s]", msg.getVipUuid(), useForList.toString())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_MEDIATOR_10005, "the vip[uuid:%s] already has bound to other service[%s]", msg.getVipUuid(), useForList.toString())); } } } @@ -232,10 +233,10 @@ private void checkVipPortConfliction(String vipUuid, String protocol, RangeSet.R RangeSet.Range cur = it.next(); if (cur.isOverlap(range) || range.isOverlap(cur)){ if (cur.getSystem()) { - throw new ApiMessageInterceptionException(operr("Current port range[%s, %s] is conflicted with system service port range [%s, %s] with vip[uuid: %s] protocol: %s ", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_MEDIATOR_10006, "Current port range[%s, %s] is conflicted with system service port range [%s, %s] with vip[uuid: %s] protocol: %s ", Long.toString(range.getStart()), Long.toString(range.getEnd()), Long.toString(cur.getStart()), Long.toString(cur.getEnd()), vipUuid, protocol)); } else { - throw new ApiMessageInterceptionException(operr("Current port range[%s, %s] is conflicted with used port range [%s, %s] with vip[uuid: %s] protocol: %s ", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_MEDIATOR_10007, "Current port range[%s, %s] is conflicted with used port range [%s, %s] with vip[uuid: %s] protocol: %s ", Long.toString(range.getStart()), Long.toString(range.getEnd()), Long.toString(cur.getStart()), Long.toString(cur.getEnd()), vipUuid, protocol)); } } diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsApiParamChecker.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsApiParamChecker.java index e9c8c3445ab..00f43fcf595 100755 --- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsApiParamChecker.java +++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsApiParamChecker.java @@ -28,6 +28,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class NfsApiParamChecker { @@ -43,13 +44,13 @@ public void checkUrl(String zoneUuid, List systemTags, String url) { q.add(PrimaryStorageVO_.url, Op.EQ, url); q.add(PrimaryStorageVO_.zoneUuid, Op.EQ, zoneUuid); if (q.isExists()) { - throw new ApiMessageInterceptionException(argerr("there has been a nfs primary storage having url as %s in zone[uuid:%s]", url, zoneUuid)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10006, "there has been a nfs primary storage having url as %s in zone[uuid:%s]", url, zoneUuid)); } String[] results = url.split(":"); if (results.length == 2 && ( results[1].startsWith("/dev") || results[1].startsWith("/proc") || results[1].startsWith("/sys"))) { - throw new ApiMessageInterceptionException(argerr(" the url contains an invalid folder[/dev or /proc or /sys]")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10007, " the url contains an invalid folder[/dev or /proc or /sys]")); } validateUrl(systemTags, results[0]); @@ -62,7 +63,7 @@ private void validateUrl(List systemTags, String ipAddr) { for (String sysTag: systemTags) { if (PrimaryStorageSystemTags.PRIMARY_STORAGE_GATEWAY.isMatch(sysTag)) { if (found) { - throw new ApiMessageInterceptionException(argerr("found multiple CIDR")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10008, "found multiple CIDR")); } validateCidrTag(sysTag, ipAddr); @@ -75,11 +76,11 @@ private void validateCidrTag(String sysTag, String ipAddr) { String cidr = PrimaryStorageSystemTags.PRIMARY_STORAGE_GATEWAY.getTokenByTag( sysTag, PrimaryStorageSystemTags.PRIMARY_STORAGE_GATEWAY_TOKEN); if (!NetworkUtils.isCidr(cidr)) { - throw new ApiMessageInterceptionException(argerr("invalid CIDR: %s", cidr)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10009, "invalid CIDR: %s", cidr)); } if (!NetworkUtils.isIpv4InCidr(ipAddr, cidr)) { - throw new ApiMessageInterceptionException(argerr("IP address[%s] is not in CIDR[%s]", ipAddr, cidr)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10010, "IP address[%s] is not in CIDR[%s]", ipAddr, cidr)); } } @@ -93,7 +94,7 @@ public void checkRunningVmForUpdateUrl(String psuuid) { if (!ts.isEmpty()) { List vms = ts.stream().map(v -> String.format("VM[name:%s, uuid:%s]", v.get(0, String.class), v.get(1, String.class))).collect(Collectors.toList()); - throw new ApiMessageInterceptionException(operr("there are %s running VMs on the NFS primary storage, please" + + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10011, "there are %s running VMs on the NFS primary storage, please" + " stop them and try again:\n%s\n", vms.size(), StringUtils.join(vms, "\n"))); } } diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java index 1a1f39a18c0..8be0ee64bed 100755 --- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java +++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java @@ -70,6 +70,7 @@ import static org.zstack.core.progress.ProgressReportService.*; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class NfsPrimaryStorage extends PrimaryStorageBase { private static final CLogger logger = Utils.getLogger(NfsPrimaryStorage.class); @@ -245,7 +246,7 @@ protected void handle(APICleanUpImageCacheOnPrimaryStorageMsg msg) { private void handle(final DeleteImageCacheOnPrimaryStorageMsg msg) { NfsPrimaryStorageBackend bkd = getUsableBackend(); if (bkd == null) { - throw new OperationFailureException(operr("cannot find usable backend")); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10049, "cannot find usable backend")); } DeleteImageCacheOnPrimaryStorageReply sreply = new DeleteImageCacheOnPrimaryStorageReply(); FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); @@ -304,7 +305,7 @@ private String selectRandomHostFromPS(PrimaryStorageInventory ps) { private void handle(final GetVolumeRootImageUuidFromPrimaryStorageMsg msg) { NfsPrimaryStorageBackend bkd = getUsableBackend(); if (bkd == null) { - throw new OperationFailureException(operr("no usable backend found")); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10050, "no usable backend found")); } bkd.handle(getSelfInventory(), msg, new ReturnValueCompletion(msg) { @@ -462,7 +463,7 @@ protected void handle(final RevertVolumeFromSnapshotOnPrimaryStorageMsg msg) { try { destHost = factory.getConnectedHostForOperation(PrimaryStorageInventory.valueOf(self)).get(0); } catch (OperationFailureException e) { - reply.setError(operr("no host in Connected status to which nfs primary storage[uuid:%s, name:%s] attached" + + reply.setError(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10051, "no host in Connected status to which nfs primary storage[uuid:%s, name:%s] attached" + " found to revert volume[uuid:%s] to snapshot[uuid:%s, name:%s]", self.getUuid(), self.getName(), msg.getVolume().getUuid(), msg.getSnapshot().getUuid(), msg.getSnapshot().getName())); @@ -493,7 +494,7 @@ protected void handle(final ReInitRootVolumeFromTemplateOnPrimaryStorageMsg msg) HostInventory destHost = factory.getConnectedHostForOperation(PrimaryStorageInventory.valueOf(self)).get(0); if (destHost == null) { - reply.setError(operr("no host in Connected status to which nfs primary storage[uuid:%s, name:%s] attached" + + reply.setError(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10052, "no host in Connected status to which nfs primary storage[uuid:%s, name:%s] attached" + " found to revert volume[uuid:%s] to image[uuid:%s]", self.getUuid(), self.getName(), msg.getVolume().getUuid(), msg.getVolume().getRootImageUuid())); @@ -572,7 +573,7 @@ private void handle(final CheckSnapshotMsg msg) { } else if (state == VmInstanceState.Stopped) { huuid = connectedHostUuid; } else { - reply.setError(operr("vm[uuid:%s] is not Running, Paused or Stopped, current state is %s", + reply.setError(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10053, "vm[uuid:%s] is not Running, Paused or Stopped, current state is %s", vol.getVmInstanceUuid(), state)); bus.reply(msg, reply); return; @@ -637,7 +638,7 @@ private void handle(final TakeSnapshotMsg msg) { } else if (state == VmInstanceState.Stopped) { huuid = connectedHostUuid; } else { - reply.setError(operr("vm[uuid:%s] is not Running, Paused or Stopped, current state is %s", + reply.setError(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10054, "vm[uuid:%s] is not Running, Paused or Stopped, current state is %s", vol.getVmInstanceUuid(), state)); bus.reply(msg, reply); return; @@ -680,7 +681,7 @@ public void run(MessageReply ret) { private void handle(PrimaryStorageRemoveCachedImageMsg msg) { if (self.getAttachedClusterRefs().isEmpty()) { PrimaryStorageRemoveCachedImageReply reply = new PrimaryStorageRemoveCachedImageReply(); - reply.setError(operr("primary storage[uuid:%s] doesn't attach to any cluster", self.getUuid())); + reply.setError(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10055, "primary storage[uuid:%s] doesn't attach to any cluster", self.getUuid())); bus.reply(msg, reply); return; } @@ -763,7 +764,7 @@ public void detachHook(String clusterUuid, Completion completion) { backend.detachFromCluster(PrimaryStorageInventory.valueOf(self), clusterUuid); completion.success(); } catch (NfsPrimaryStorageException e) { - completion.fail(operr(e.getMessage())); + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10056, e.getMessage())); } } @@ -871,7 +872,7 @@ private void createMemoryVolume(InstantiateMemoryVolumeOnPrimaryStorageMsg msg) } else { backend = getUsableBackend(); if (backend == null) { - throw new OperationFailureException(operr("the NFS primary storage[uuid:%s, name:%s] cannot find any usable host to" + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10057, "the NFS primary storage[uuid:%s, name:%s] cannot find any usable host to" + " create the data volume[uuid:%s, name:%s]", self.getUuid(), self.getName(), msg.getVolume().getUuid(), msg.getVolume().getName())); } @@ -915,7 +916,7 @@ private void createEmptyVolume(final InstantiateVolumeOnPrimaryStorageMsg msg) { } else { backend = getUsableBackend(); if (backend == null) { - throw new OperationFailureException(operr("the NFS primary storage[uuid:%s, name:%s] cannot find any usable host to" + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10058, "the NFS primary storage[uuid:%s, name:%s] cannot find any usable host to" + " create the data volume[uuid:%s, name:%s]", self.getUuid(), self.getName(), msg.getVolume().getUuid(), msg.getVolume().getName())); } @@ -1356,7 +1357,7 @@ protected void handle(AskVolumeSnapshotCapabilityMsg msg) { protected void handle(final SyncVolumeSizeOnPrimaryStorageMsg msg) { NfsPrimaryStorageBackend backend = getUsableBackend(); if (backend == null) { - throw new OperationFailureException(operr("the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10059, "the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", self.getUuid(), self.getName())); } @@ -1380,7 +1381,7 @@ public void fail(ErrorCode errorCode) { protected void handle(EstimateVolumeTemplateSizeOnPrimaryStorageMsg msg) { NfsPrimaryStorageBackend backend = getUsableBackend(); if (backend == null) { - throw new OperationFailureException(operr("the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10060, "the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", self.getUuid(), self.getName())); } @@ -1439,7 +1440,7 @@ public String getSyncSignature() { public void run(SyncTaskChain chain) { NfsPrimaryStorageBackend backend = getUsableBackend(); if (backend == null) { - throw new OperationFailureException(operr("the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10061, "the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", self.getUuid(), self.getName())); } @@ -1470,7 +1471,7 @@ public String getName() { private void handle(DownloadBitsFromKVMHostToPrimaryStorageMsg msg) { NfsPrimaryStorageBackend backend = getUsableBackend(); if (backend == null) { - throw new OperationFailureException(operr("the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10062, "the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", self.getUuid(), self.getName())); } @@ -1492,7 +1493,7 @@ public void fail(ErrorCode errorCode) { private void handle(CancelDownloadBitsFromKVMHostToPrimaryStorageMsg msg) { NfsPrimaryStorageBackend backend = getUsableBackend(); if (backend == null) { - throw new OperationFailureException(operr("the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10063, "the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", self.getUuid(), self.getName())); } @@ -1514,7 +1515,7 @@ public void fail(ErrorCode errorCode) { private void handle(GetDownloadBitsFromKVMHostProgressMsg msg) { NfsPrimaryStorageBackend backend = getUsableBackend(); if (backend == null) { - throw new OperationFailureException(operr("the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10064, "the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", self.getUuid(), self.getName())); } @@ -1536,7 +1537,7 @@ public void fail(ErrorCode errorCode) { private void handle(NfsRebaseVolumeBackingFileMsg msg) { NfsPrimaryStorageBackend backend = getUsableBackend(); if (backend == null) { - throw new OperationFailureException(operr("the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10065, "the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", self.getUuid(), self.getName())); } backend.handle(getSelfInventory(), msg, new ReturnValueCompletion(msg) { @@ -1557,7 +1558,7 @@ public void fail(ErrorCode errorCode) { private void handle(GetVolumeBackingChainFromPrimaryStorageMsg msg) { NfsPrimaryStorageBackend backend = getUsableBackend(); if (backend == null) { - throw new OperationFailureException(operr("the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10066, "the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", self.getUuid(), self.getName())); } backend.handle(getSelfInventory(), msg, new ReturnValueCompletion(msg) { @@ -1633,7 +1634,7 @@ protected void connectHook(ConnectParam param, final Completion completion) { final NfsPrimaryStorageBackend backend = getUsableBackend(); if (backend == null) { // the nfs primary storage has not been attached to any clusters, or no connected hosts - completion.fail(err(PrimaryStorageErrors.DISCONNECTED, + completion.fail(err(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10067, PrimaryStorageErrors.DISCONNECTED, "the NFS primary storage[uuid:%s, name:%s] has not attached to any clusters, or no hosts in the" + " attached clusters are connected", self.getUuid(), self.getName() )); @@ -1703,7 +1704,7 @@ protected void pingHook(Completion completion) { NfsPrimaryStorageBackend bkd = getUsableBackend(); if (bkd == null) { // the nfs primary storage has not been attached to any clusters, or no connected hosts - completion.fail(operr("the NFS primary storage[uuid:%s, name:%s] has not attached to any clusters, or no hosts in the" + + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10068, "the NFS primary storage[uuid:%s, name:%s] has not attached to any clusters, or no hosts in the" + " attached clusters are connected", self.getUuid(), self.getName())); } else { bkd.ping(getSelfInventory(), completion); @@ -1719,7 +1720,7 @@ protected void handle(ShrinkVolumeSnapshotOnPrimaryStorageMsg msg) { protected void handle(GetVolumeSnapshotEncryptedOnPrimaryStorageMsg msg) { NfsPrimaryStorageBackend backend = getUsableBackend(); if (backend == null) { - throw new OperationFailureException(operr("the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10069, "the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", self.getUuid(), self.getName())); } @@ -1764,7 +1765,7 @@ private String getAvailableHostUuidForOperation() { public void handle(AskInstallPathForNewSnapshotMsg msg) { NfsPrimaryStorageBackend bkd = getUsableBackend(); if (bkd == null) { - throw new OperationFailureException(operr("the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10070, "the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", self.getUuid(), self.getName())); } @@ -1799,10 +1800,10 @@ protected void handle(CheckVolumeSnapshotOperationOnPrimaryStorageMsg msg) { .param("vmUuid", msg.getVmInstanceUuid()) .find(); if (hostStatus == null && getAvailableHostUuidForOperation() == null) { - reply.setError(err(HostErrors.HOST_IS_DISCONNECTED, "cannot find available host for operation on" + + reply.setError(err(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10071, HostErrors.HOST_IS_DISCONNECTED, "cannot find available host for operation on" + " primary storage[uuid:%s].", self.getUuid())); } else if (hostStatus != HostStatus.Connected && hostStatus != null) { - reply.setError(err(HostErrors.HOST_IS_DISCONNECTED, "host where vm[uuid:%s] locate is not Connected.", msg.getVmInstanceUuid())); + reply.setError(err(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10072, HostErrors.HOST_IS_DISCONNECTED, "host where vm[uuid:%s] locate is not Connected.", msg.getVmInstanceUuid())); } } @@ -1816,7 +1817,7 @@ private ErrorCode checkChangeVolumeType(String volumeUuid) { } List infos = refVols.stream().map(v -> String.format("uuid:%s, name:%s", v.getUuid(), v.getName())).collect(Collectors.toList()); - return operr("volume[uuid:%s] has reference volume[%s], can not change volume type before flatten " + + return operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10073, "volume[uuid:%s] has reference volume[%s], can not change volume type before flatten " + "them and their descendants", volumeUuid, infos.toString()); } @@ -1843,7 +1844,7 @@ protected void handle(ChangeVolumeTypeOnPrimaryStorageMsg msg) { NfsPrimaryStorageBackend backend = getUsableBackend(); if (backend == null) { - throw new OperationFailureException(operr("the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10074, "the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", self.getUuid(), self.getName())); } @@ -1866,7 +1867,7 @@ protected void handle(UnlinkBitsOnPrimaryStorageMsg msg) { UnlinkBitsOnPrimaryStorageReply reply = new UnlinkBitsOnPrimaryStorageReply(); NfsPrimaryStorageBackend backend = getUsableBackend(); if (backend == null) { - throw new OperationFailureException(operr("the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10075, "the NFS primary storage[uuid:%s, name:%s] cannot find hosts in attached clusters to perform the operation", self.getUuid(), self.getName())); } @@ -1889,7 +1890,7 @@ protected void handle(CommitVolumeSnapshotOnPrimaryStorageMsg msg) { String hostUuid = getHostUuidFromVolume(msg.getVolume().getUuid()); if (hostUuid == null || hostUuid.isEmpty()) { - reply.setError(operr("no host found for volume[uuid:%s]", msg.getVolume().getUuid())); + reply.setError(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10076, "no host found for volume[uuid:%s]", msg.getVolume().getUuid())); bus.reply(msg, reply); return; } @@ -1916,7 +1917,7 @@ protected void handle(PullVolumeSnapshotOnPrimaryStorageMsg msg) { String hostUuid = getHostUuidFromVolume(msg.getVolume().getUuid()); if (hostUuid == null || hostUuid.isEmpty()) { - reply.setError(operr("no host found for volume[uuid:%s]", msg.getVolume().getUuid())); + reply.setError(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10077, "no host found for volume[uuid:%s]", msg.getVolume().getUuid())); bus.reply(msg, reply); return; } diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageFactory.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageFactory.java index 19a4ece30a3..c8398bdfe1b 100755 --- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageFactory.java +++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageFactory.java @@ -60,6 +60,7 @@ import static org.zstack.header.Constants.THREAD_CONTEXT_API; import static org.zstack.utils.CollectionDSL.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class NfsPrimaryStorageFactory implements NfsPrimaryStorageManager, PrimaryStorageFactory, Component, CreateTemplateFromVolumeSnapshotExtensionPoint, RecalculatePrimaryStorageCapacityExtensionPoint, PrimaryStorageDetachExtensionPoint, PrimaryStorageAttachExtensionPoint, HostDeleteExtensionPoint, PostMarkRootVolumeAsSnapshotExtension, ClusterUpdateOSExtensionPoint, AfterInstantiateVolumeExtensionPoint { @@ -113,7 +114,7 @@ protected void scripts() { } if (!q(PrimaryStorageClusterRefVO.class).eq(PrimaryStorageClusterRefVO_.primaryStorageUuid, psUuid).isExists()) { - throw new OperationFailureException(operr("the NFS primary storage[uuid:%s] is not attached" + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10000, "the NFS primary storage[uuid:%s] is not attached" + " to any clusters, and cannot expunge the root volume[uuid:%s] of the VM[uuid:%s]", psUuid, vmUuid, volumeUuid)); } } @@ -263,7 +264,7 @@ public NfsPrimaryStorageBackend getHypervisorBackend(HypervisorType hvType) { public List getConnectedHostForPing(PrimaryStorageInventory pri) { if (pri.getAttachedClusterUuids().isEmpty()) { - throw new OperationFailureException(operr("cannot find a Connected host to execute command for nfs primary storage[uuid:%s]", pri.getUuid())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10001, "cannot find a Connected host to execute command for nfs primary storage[uuid:%s]", pri.getUuid())); } String sql = "select h from HostVO h " + @@ -275,7 +276,7 @@ public List getConnectedHostForPing(PrimaryStorageInventory pri) List ret = q.getResultList(); if (ret.isEmpty()) { throw new OperationFailureException( - operr("cannot find a connected host in cluster which ps [uuid: %s] attached", pri.getUuid())); + operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10002, "cannot find a connected host in cluster which ps [uuid: %s] attached", pri.getUuid())); } else { Collections.shuffle(ret); return HostInventory.valueOf(ret); @@ -284,7 +285,7 @@ public List getConnectedHostForPing(PrimaryStorageInventory pri) public List getConnectedHostForOperation(PrimaryStorageInventory pri) { if (pri.getAttachedClusterUuids().isEmpty()) { - throw new OperationFailureException(operr("cannot find a Connected host to execute command for nfs primary storage[uuid:%s]", pri.getUuid())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10003, "cannot find a Connected host to execute command for nfs primary storage[uuid:%s]", pri.getUuid())); } //we need to filter out the non-enabled host in case of host maintained but kvmagent downed @@ -303,7 +304,7 @@ public List getConnectedHostForOperation(PrimaryStorageInventory List ret = q.getResultList(); if (ret.isEmpty()) { throw new OperationFailureException( - operr("cannot find a host which has Connected host-NFS connection to execute command " + + operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10004, "cannot find a host which has Connected host-NFS connection to execute command " + "for nfs primary storage[uuid:%s]", pri.getUuid())); } else { String apiId = ThreadContext.get(THREAD_CONTEXT_API); @@ -400,7 +401,7 @@ public String call() { return HypervisorType.valueOf(type); } - throw new OperationFailureException(operr("cannot find proper hypervisorType for primary storage[uuid:%s] to handle image format or volume format[%s]", psUuid, imageFormat)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10005, "cannot find proper hypervisorType for primary storage[uuid:%s] to handle image format or volume format[%s]", psUuid, imageFormat)); } @Override diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackend.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackend.java index 5ad1919dd0f..a1341ef4449 100755 --- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackend.java +++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackend.java @@ -70,6 +70,7 @@ import static java.lang.Integer.min; import static org.zstack.core.Platform.operr; import static org.zstack.core.Platform.touterr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class NfsPrimaryStorageKVMBackend implements NfsPrimaryStorageBackend, KVMHostConnectExtensionPoint, HostConnectionReestablishExtensionPoint, @@ -161,7 +162,7 @@ public void success(MountAgentResponse returnValue) { public void fail(ErrorCode errorCode) { if (errorCode.getDetails().contains("java.net.SocketTimeoutException: Read timed out")) { // socket read timeout is caused by timeout of mounting a wrong URL - errorCode = touterr(errorCode, "mount timeout. Please the check if the URL[%s] is" + + errorCode = touterr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10015, errorCode, "mount timeout. Please the check if the URL[%s] is" + " valid to mount", inv.getUrl()); } completion.fail(errorCode); @@ -251,7 +252,7 @@ public List call() { if ((versionInCluster.compareTo(QCOW3_QEMU_IMG_VERSION) >= 0 && otherVersion.compareTo(QCOW3_QEMU_IMG_VERSION) < 0) || (versionInCluster.compareTo(QCOW3_QEMU_IMG_VERSION) < 0 && otherVersion.compareTo(QCOW3_QEMU_IMG_VERSION) >= 0)) { ErrorCode err = operr( - "unable to attach a primary storage[uuid:%s, name:%s] to cluster[uuid:%s]. Kvm host in the cluster has qemu-img " + ORG_ZSTACK_STORAGE_PRIMARY_NFS_10016, "unable to attach a primary storage[uuid:%s, name:%s] to cluster[uuid:%s]. Kvm host in the cluster has qemu-img " + "with version[%s]; but the primary storage has attached to another cluster that has kvm host which has qemu-img with " + "version[%s]. qemu-img version greater than %s is incompatible with versions less than %s, this will causes volume snapshot operation " + "to fail. Please avoid attaching a primary storage to clusters that have different Linux distributions, in order to prevent qemu-img version mismatch", @@ -325,7 +326,7 @@ public void run(MessageReply reply) { NfsPrimaryStorageAgentResponse rsp = ((KVMHostAsyncHttpCallReply) reply).toResponse(NfsPrimaryStorageAgentResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("unable to create folder[installUrl:%s] on kvm host[uuid:%s, ip:%s], because %s", + ErrorCode err = operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10017, "unable to create folder[installUrl:%s] on kvm host[uuid:%s, ip:%s], because %s", cmd.getInstallUrl(), host.getUuid(), host.getManagementIp(), rsp.getError()); completion.fail(err); return; @@ -403,7 +404,7 @@ private void pingAll(PrimaryStorageInventory inv, int limit, final Completion co .listValues(); if(huuids.size() == 0){ - completion.fail(operr("no host in is Connected or primary storage[uuid:%s] attach no cluster", inv.getUuid())); + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10018, "no host in is Connected or primary storage[uuid:%s] attach no cluster", inv.getUuid())); return; } @@ -451,7 +452,7 @@ public void run(MessageReply reply) { updatePrimaryStorageCapacity(psInv.getUuid(), rsp); } } else { - ErrorCode err = operr("failed to ping nfs primary storage[uuid:%s] from host[uuid:%s],because %s. " + + ErrorCode err = operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10019, "failed to ping nfs primary storage[uuid:%s] from host[uuid:%s],because %s. " + "disconnect this host-ps connection", psInv.getUuid(), huuid, reply.isSuccess() ? rsp.getError() : reply.getError()); errs.add(err); @@ -492,7 +493,7 @@ public void handle(PrimaryStorageInventory inv, CreateTemporaryVolumeFromSnapsho @Override public ErrorCode getError(KvmResponseWrapper wrapper) { MergeSnapshotResponse rsp = wrapper.getResponse(MergeSnapshotResponse.class); - return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10020, "operation error, because:%s", rsp.getError()); } }, new ReturnValueCompletion(completion) { @Override @@ -548,7 +549,7 @@ public void run(MessageReply rly) { @Override public ErrorCode getError(KvmResponseWrapper wrapper) { DownloadBitsFromKVMHostRsp rsp = wrapper.getResponse(DownloadBitsFromKVMHostRsp.class); - return rsp.isSuccess() ? null : operr("%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10021, "%s", rsp.getError()); } }, new ReturnValueCompletion(completion) { @Override @@ -579,7 +580,7 @@ public void handle(PrimaryStorageInventory inv, CancelDownloadBitsFromKVMHostToP @Override public ErrorCode getError(KvmResponseWrapper wrapper) { MergeSnapshotResponse rsp = wrapper.getResponse(MergeSnapshotResponse.class); - return rsp.isSuccess() ? null : operr("%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10022, "%s", rsp.getError()); } }, new ReturnValueCompletion(completion) { @Override @@ -605,7 +606,7 @@ public void handle(PrimaryStorageInventory inv, GetDownloadBitsFromKVMHostProgre @Override public ErrorCode getError(KvmResponseWrapper wrapper) { GetDownloadBitsFromKVMHostProgressRsp rsp = wrapper.getResponse(GetDownloadBitsFromKVMHostProgressRsp.class); - return rsp.isSuccess() ? null : operr("%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10023, "%s", rsp.getError()); } }, new ReturnValueCompletion(completion) { @Override @@ -648,7 +649,7 @@ private void createNormalVolumeFromSnapshot(VolumeSnapshotInventory sp, String v @Override public ErrorCode getError(KvmResponseWrapper wrapper) { MergeSnapshotResponse rsp = wrapper.getResponse(MergeSnapshotResponse.class); - return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10024, "operation error, because:%s", rsp.getError()); } }, new ReturnValueCompletion(completion) { @Override @@ -684,7 +685,7 @@ private void createIncrementalVolumeFromSnapshot(VolumeSnapshotInventory sp, Str new KvmCommandSender(host.getUuid()).send(cmd, CREATE_VOLUME_WITH_BACKING_PATH, wrapper -> { CreateVolumeWithBackingRsp rsp = wrapper.getResponse(CreateVolumeWithBackingRsp.class); - return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10025, "operation error, because:%s", rsp.getError()); }, new ReturnValueCompletion(completion) { @Override public void success(KvmResponseWrapper wrapper) { @@ -737,7 +738,7 @@ public void handle(PrimaryStorageInventory inv, SyncVolumeSizeOnPrimaryStorageMs @Override public ErrorCode getError(KvmResponseWrapper wrapper) { GetVolumeActualSizeRsp rsp = wrapper.getResponse(GetVolumeActualSizeRsp.class); - return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10026, "operation error, because:%s", rsp.getError()); } }, new ReturnValueCompletion(completion) { @Override @@ -848,7 +849,7 @@ public void handle(PrimaryStorageInventory inv, GetVolumeBackingChainFromPrimary @Override public ErrorCode getError(KvmResponseWrapper wrapper) { GetBackingChainRsp rsp = wrapper.getResponse(GetBackingChainRsp.class); - return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10027, "operation error, because:%s", rsp.getError()); } }, new ReturnValueCompletion(completion) { @Override @@ -886,7 +887,7 @@ public void done(ErrorCodeList err) { public void handle(PrimaryStorageInventory dstPsInv, NfsToNfsMigrateBitsMsg msg, ReturnValueCompletion completion) { HostVO hostVO = dbf.findByUuid(msg.getHostUuid(), HostVO.class); if (hostVO == null) { - throw new OperationFailureException(operr("The chosen host[uuid:%s] to perform storage migration is lost", msg.getHostUuid())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10028, "The chosen host[uuid:%s] to perform storage migration is lost", msg.getHostUuid())); } HostInventory host = HostInventory.valueOf(hostVO); @@ -920,7 +921,7 @@ public void handle(PrimaryStorageInventory dstPsInv, NfsToNfsMigrateBitsMsg msg, new KvmCommandSender(host.getUuid()).send(cmd, NFS_TO_NFS_MIGRATE_BITS_PATH, wrapper -> { NfsToNfsMigrateBitsRsp rsp = wrapper.getResponse(NfsToNfsMigrateBitsRsp.class); - return rsp.isSuccess() ? null : operr("%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10029, "%s", rsp.getError()); }, msg.getTimeout(), new ReturnValueCompletion(completion) { @Override public void success(KvmResponseWrapper w) { @@ -951,7 +952,7 @@ public void handle(PrimaryStorageInventory inv, NfsRebaseVolumeBackingFileMsg ms @Override public ErrorCode getError(KvmResponseWrapper wrapper) { NfsRebaseVolumeBackingFileRsp rsp = wrapper.getResponse(NfsRebaseVolumeBackingFileRsp.class); - return rsp.isSuccess() ? null : operr("%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10030, "%s", rsp.getError()); } }, new ReturnValueCompletion(completion) { @Override @@ -993,7 +994,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply r = reply.castReply(); GetCapacityResponse rsp = r.toResponse(GetCapacityResponse.class); if (!r.isSuccess()) { - completion.fail(operr("operation error, because:%s", rsp.getError())); + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10031, "operation error, because:%s", rsp.getError())); return; } @@ -1028,7 +1029,7 @@ public void run(MessageReply reply) { CheckIsBitsExistingRsp rsp = ((KVMHostAsyncHttpCallReply) reply).toResponse(CheckIsBitsExistingRsp.class); if (!rsp.isSuccess()) { - completion.fail(operr("failed to check existence of %s on nfs primary storage[uuid:%s], %s", + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10032, "failed to check existence of %s on nfs primary storage[uuid:%s], %s", installPath, inv.getUuid(), rsp.getError())); return; } @@ -1087,7 +1088,7 @@ public List call() { (version.compareTo(QCOW3_QEMU_IMG_VERSION) < 0 && mine.compareTo(QCOW3_QEMU_IMG_VERSION) >= 0) ) { ErrorCode err = operr( - "unable to attach a primary storage to cluster. Kvm host[uuid:%s, name:%s] in cluster has qemu-img " + ORG_ZSTACK_STORAGE_PRIMARY_NFS_10033, "unable to attach a primary storage to cluster. Kvm host[uuid:%s, name:%s] in cluster has qemu-img " + "with version[%s]; but the primary storage has attached to a cluster that has kvm host[uuid:%s], which has qemu-img with " + "version[%s]. qemu-img version greater than %s is incompatible with versions less than %s, this will causes volume snapshot operation " + "to fail. Please avoid attaching a primary storage to clusters that have different Linux distributions, in order to prevent qemu-img version mismatch", @@ -1142,7 +1143,7 @@ public void run(MessageReply reply) { CreateEmptyVolumeResponse rsp = ((KVMHostAsyncHttpCallReply) reply).toResponse(CreateEmptyVolumeResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("unable to create empty volume[uuid:%s, name:%s] on kvm host[uuid:%s, ip:%s], because %s", + ErrorCode err = operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10034, "unable to create empty volume[uuid:%s, name:%s] on kvm host[uuid:%s, ip:%s], because %s", volume.getUuid(), volume.getName(), host.getUuid(), host.getManagementIp(), rsp.getError()); complete.fail(err); return; @@ -1249,12 +1250,12 @@ public void run(MessageReply reply) { DeleteResponse rsp = ((KVMHostAsyncHttpCallReply) reply).toResponse(DeleteResponse.class); if (!rsp.isSuccess()) { if (rsp.inUse) { - completion.fail(Platform.err(VolumeErrors.VOLUME_IN_USE, rsp.getError())); + completion.fail(Platform.err(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10035, VolumeErrors.VOLUME_IN_USE, rsp.getError())); return; } logger.warn(String.format("failed to delete bits[%s] on nfs primary storage[uuid:%s], %s, will clean up", installPath, pinv.getUuid(), rsp.getError())); - completion.fail(operr("failed to delete bits[%s] on nfs primary storage[uuid:%s], %s, will clean up " + + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10036, "failed to delete bits[%s] on nfs primary storage[uuid:%s], %s, will clean up " + "installPath, pinv.getUuid(), rsp.getError()", installPath, pinv.getUuid(), rsp.getError())); return; @@ -1316,7 +1317,7 @@ public void run(MessageReply reply) { RevertVolumeFromSnapshotResponse rsp = ((KVMHostAsyncHttpCallReply) reply).toResponse(RevertVolumeFromSnapshotResponse.class); if (!rsp.isSuccess()) { - completion.fail(operr("failed to revert volume[uuid:%s] to snapshot[uuid:%s] on kvm host[uuid:%s, ip:%s], %s", + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10037, "failed to revert volume[uuid:%s] to snapshot[uuid:%s] on kvm host[uuid:%s, ip:%s], %s", vol.getUuid(), sinv.getUuid(), host.getUuid(), host.getManagementIp(), rsp.getError())); return; } @@ -1353,7 +1354,7 @@ public void run(MessageReply reply) { ReInitImageRsp rsp = ((KVMHostAsyncHttpCallReply) reply).toResponse(ReInitImageRsp.class); if (!rsp.isSuccess()) { - completion.fail(operr("failed to revert volume[uuid:%s] to image[uuid:%s] on kvm host[uuid:%s, ip:%s], %s", + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10038, "failed to revert volume[uuid:%s] to image[uuid:%s] on kvm host[uuid:%s, ip:%s], %s", vol.getUuid(), vol.getRootImageUuid(), host.getUuid(), host.getManagementIp(), rsp.getError())); return; } @@ -1397,7 +1398,7 @@ public void run(MessageReply reply) { CreateRootVolumeFromTemplateResponse rsp = ((KVMHostAsyncHttpCallReply)reply).toResponse(CreateRootVolumeFromTemplateResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("fails to create root volume[uuid:%s] from cached image[path:%s] because %s", + ErrorCode err = operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10039, "fails to create root volume[uuid:%s] from cached image[path:%s] because %s", volume.getUuid(), imageCache.getImageUuid(), rsp.getError()); completion.fail(err); return; @@ -1457,7 +1458,7 @@ public void run(MessageReply reply) { String.format("\nvolume resource:%s", volumeResourceInstallPath) + String.format("\nnfs primary storage uuid:%s", primaryStorage.getUuid()) + String.format("\nKVM host uuid:%s, management ip:%s", destHost.getUuid(), destHost.getManagementIp()); - completion.fail(operr(sb)); + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10040, sb)); return; } @@ -1519,7 +1520,7 @@ public void run(MessageReply reply) { OfflineMergeSnapshotRsp rsp = ((KVMHostAsyncHttpCallReply) reply).toResponse(OfflineMergeSnapshotRsp.class); if (!rsp.isSuccess()) { - completion.fail(operr("operation error, because:%s", rsp.getError())); + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10041, "operation error, because:%s", rsp.getError())); return; } @@ -1564,7 +1565,7 @@ public void remount(PrimaryStorageInventory pinv, String clusterUuid, NfsPrimary } if (huuids.isEmpty()) { - completion.fail(operr("no hosts in the cluster[uuid:%s] are connected", clusterUuid)); + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10042, "no hosts in the cluster[uuid:%s] are connected", clusterUuid)); return; } @@ -1684,7 +1685,7 @@ public void handle(PrimaryStorageInventory pinv, ChangeVolumeTypeOnPrimaryStorag cmd.setUuid(pinv.getUuid()); if (!msg.getVolume().getInstallPath().startsWith(cmd.srcDir)) { - completion.fail(operr("why volume[uuid:%s, installPath:%s] not in directory %s", + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10043, "why volume[uuid:%s, installPath:%s] not in directory %s", cmd.volumeUuid, msg.getVolume().getInstallPath(), cmd.srcDir)); return; } @@ -1818,7 +1819,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply r = reply.castReply(); final T rsp = r.toResponse(rspType); if (!rsp.isSuccess()) { - completion.fail(operr("operation error, because:%s", rsp.getError())); + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10044, "operation error, because:%s", rsp.getError())); return; } @@ -1849,7 +1850,7 @@ public void run(MessageReply reply) { KVMHostSyncHttpCallReply r = reply.castReply(); final T rsp = r.toResponse(rspType); if (!rsp.isSuccess()) { - completion.fail(operr("operation error, because:%s", rsp.getError())); + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10045, "operation error, because:%s", rsp.getError())); return; } @@ -1951,7 +1952,7 @@ public void run(MessageReply reply) { CreateEmptyVolumeResponse rsp = ((KVMHostAsyncHttpCallReply) reply).toResponse(CreateEmptyVolumeResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("unable to create empty snapshot volume[name:%s, installpath: %s] on kvm host[uuid:%s, ip:%s], because %s", + ErrorCode err = operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10046, "unable to create empty snapshot volume[name:%s, installpath: %s] on kvm host[uuid:%s, ip:%s], because %s", scmd.getName(), scmd.getInstallUrl(), host.getUuid(), host.getManagementIp(), rsp.getError()); completion.fail(err); return; @@ -2034,7 +2035,7 @@ public void run(MessageReply r) { OfflineMergeSnapshotRsp rsp = ((KVMHostAsyncHttpCallReply) r).toResponse(OfflineMergeSnapshotRsp.class); if (!rsp.isSuccess()) { - completion.fail(operr("operation error, because:%s", rsp.getError())); + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10047, "operation error, because:%s", rsp.getError())); return; } @@ -2067,7 +2068,7 @@ public void run(MessageReply r) { OfflineCommitSnapshotRsp rsp = ((KVMHostAsyncHttpCallReply) r).toResponse(OfflineCommitSnapshotRsp.class); if (!rsp.isSuccess()) { - completion.fail(operr("operation error, because:%s", rsp.getError())); + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10048, "operation error, because:%s", rsp.getError())); return; } diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryToSftpBackupKVMBackend.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryToSftpBackupKVMBackend.java index 31000d64b3a..13f52feb14c 100755 --- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryToSftpBackupKVMBackend.java +++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryToSftpBackupKVMBackend.java @@ -30,6 +30,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class NfsPrimaryToSftpBackupKVMBackend implements NfsPrimaryToBackupStorageMediator { private static final CLogger logger = Utils.getLogger(NfsPrimaryToSftpBackupKVMBackend.class); @@ -106,7 +107,7 @@ public void run(MessageReply reply) { DownloadBitsFromSftpBackupStorageResponse rsp = ((KVMHostAsyncHttpCallReply)reply).toResponse(DownloadBitsFromSftpBackupStorageResponse.class); if (!rsp.isSuccess()) { - completion.fail(operr("failed to download[%s] from SftpBackupStorage[hostname:%s] to nfs primary storage[uuid:%s, path:%s], %s", + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10013, "failed to download[%s] from SftpBackupStorage[hostname:%s] to nfs primary storage[uuid:%s, path:%s], %s", backupStorageInstallPath, greply.getHostname(), pinv.getUuid(), primaryStorageInstallPath, rsp.getError())); return; } @@ -162,7 +163,7 @@ public void run(MessageReply reply) { UploadToSftpResponse rsp = ((KVMHostAsyncHttpCallReply)reply).toResponse(UploadToSftpResponse.class); if (!rsp.isSuccess()) { - completion.fail(operr("failed to upload bits from nfs primary storage[uuid:%s, path:%s] to SFTP backup storage[hostname:%s, path: %s], %s", + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10014, "failed to upload bits from nfs primary storage[uuid:%s, path:%s] to SFTP backup storage[hostname:%s, path: %s], %s", pinv.getUuid(), primaryStorageInstallPath, hostname, backupStorageInstallPath, rsp.getError())); return; } diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsVolumeSnapshotProtector.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsVolumeSnapshotProtector.java index 38ae46a9770..4e0f1576dcc 100755 --- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsVolumeSnapshotProtector.java +++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsVolumeSnapshotProtector.java @@ -11,6 +11,7 @@ import java.nio.file.Path; import java.nio.file.Paths; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class NfsVolumeSnapshotProtector implements VolumeSnapshotDeletionProtector { @Override @@ -22,7 +23,7 @@ public String getPrimaryStorageType() { public void protect(VolumeSnapshotInventory snapshot, Completion completion) { Path path = Paths.get(snapshot.getPrimaryStorageInstallPath()); if (!path.getParent().toString().contains(snapshot.getVolumeUuid())) { - completion.fail(inerr("the snapshot[name:%s, uuid:%s, path: %s] seems not belong to the volume[uuid:%s]", + completion.fail(inerr(ORG_ZSTACK_STORAGE_PRIMARY_NFS_10012, "the snapshot[name:%s, uuid:%s, path: %s] seems not belong to the volume[uuid:%s]", snapshot.getName(), snapshot.getUuid(), snapshot.getPrimaryStorageInstallPath(), snapshot.getVolumeUuid())); return; } diff --git a/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/PortForwardingApiInterceptor.java b/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/PortForwardingApiInterceptor.java index e520c63ab60..43a2a4d10e7 100755 --- a/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/PortForwardingApiInterceptor.java +++ b/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/PortForwardingApiInterceptor.java @@ -32,6 +32,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -68,7 +69,7 @@ private void validate(APIGetPortForwardingAttachableVmNicsMsg msg) { PortForwardingRuleState state = t.get(0, PortForwardingRuleState.class); if (state != PortForwardingRuleState.Enabled) { - throw new ApiMessageInterceptionException(operr("Port forwarding rule[uuid:%s] is not in state of Enabled, current state is %s", msg.getRuleUuid(), state)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10006, "Port forwarding rule[uuid:%s] is not in state of Enabled, current state is %s", msg.getRuleUuid(), state)); } String vmNicUuid = t.get(1, String.class); @@ -83,7 +84,7 @@ private void validate(APIDetachPortForwardingRuleMsg msg) { q.add(PortForwardingRuleVO_.uuid, Op.EQ, msg.getUuid()); String vmNicUuid = q.findValue(); if (vmNicUuid == null) { - throw new ApiMessageInterceptionException(operr("port forwarding rule rule[uuid:%s] has not been attached to any vm nic, can't detach", msg.getUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10007, "port forwarding rule rule[uuid:%s] has not been attached to any vm nic, can't detach", msg.getUuid())); } msg.vmNicUuid = vmNicUuid; @@ -99,12 +100,12 @@ private void validate(final APIAttachPortForwardingRuleMsg msg) { String vmNicUuid = t.get(0, String.class); if (vmNicUuid != null) { - throw new ApiMessageInterceptionException(operr("port forwarding rule[uuid:%s] has been attached to vm nic[uuid:%s], can't attach again", msg.getRuleUuid(), vmNicUuid)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10008, "port forwarding rule[uuid:%s] has been attached to vm nic[uuid:%s], can't attach again", msg.getRuleUuid(), vmNicUuid)); } PortForwardingRuleState state = t.get(1, PortForwardingRuleState.class); if (state != PortForwardingRuleState.Enabled) { - throw new ApiMessageInterceptionException(operr("port forwarding rule[uuid:%s] is not in state of Enabled, current state is %s. A rule can only be attached when its state is Enabled", msg.getRuleUuid(), state)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10009, "port forwarding rule[uuid:%s] is not in state of Enabled, current state is %s. A rule can only be attached when its state is Enabled", msg.getRuleUuid(), state)); } VipVO vip = new Callable() { @@ -123,7 +124,7 @@ public VipVO call() { vq.add(VmNicVO_.uuid, Op.EQ, msg.getVmNicUuid()); String guestL3Uuid = vq.findValue(); if (guestL3Uuid.equals(vip.getL3NetworkUuid())) { - throw new ApiMessageInterceptionException(argerr("guest l3Network of vm nic[uuid:%s] and vip l3Network of port forwarding rule[uuid:%s] are the same network", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10010, "guest l3Network of vm nic[uuid:%s] and vip l3Network of port forwarding rule[uuid:%s] are the same network", msg.getVmNicUuid(), msg.getRuleUuid())); } @@ -144,7 +145,7 @@ public VipVO call() { try { vipBase.checkPeerL3Additive(guestL3Uuid); } catch (CloudRuntimeException e) { - throw new ApiMessageInterceptionException(operr(e.getMessage())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10011, e.getMessage())); } } @@ -167,7 +168,7 @@ private void validate(APICreatePortForwardingRuleMsg msg) { msg.setPrivatePortEnd(msg.getPrivatePortStart()); } if (msg.getVipPortEnd()-msg.getVipPortStart() != msg.getPrivatePortEnd()-msg.getPrivatePortStart()) { - throw new ApiMessageInterceptionException(argerr("could not create port forwarding rule, because vip port range[vipStartPort:%s, vipEndPort:%s] is incompatible with private port range[privateStartPort:%s, privateEndPort:%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10012, "could not create port forwarding rule, because vip port range[vipStartPort:%s, vipEndPort:%s] is incompatible with private port range[privateStartPort:%s, privateEndPort:%s]", msg.getVipPortStart(), msg.getVipPortEnd(), msg.getPrivatePortStart(), msg.getPrivatePortEnd())); } @@ -184,16 +185,16 @@ private void validate(APICreatePortForwardingRuleMsg msg) { if (!msg.getVipPortStart().equals(msg.getVipPortEnd())) { // it's a port range if (msg.getVipPortEnd() - msg.getVipPortStart() != msg.getPrivatePortEnd() - msg.getPrivatePortStart()) { - throw new ApiMessageInterceptionException(argerr("for range port forwarding, the port range size must match; vip range[%s, %s]'s size doesn't match range[%s, %s]'s size", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10013, "for range port forwarding, the port range size must match; vip range[%s, %s]'s size doesn't match range[%s, %s]'s size", msg.getVipPortStart(), msg.getVipPortEnd(), msg.getPrivatePortStart(), msg.getPrivatePortEnd())); } } if (msg.getAllowedCidr() != null) { if (!NetworkUtils.isCidr(msg.getAllowedCidr())) { - throw new ApiMessageInterceptionException(argerr("invalid CIDR[%s]", msg.getAllowedCidr())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10014, "invalid CIDR[%s]", msg.getAllowedCidr())); } else if (!NetworkUtils.isCidr(msg.getAllowedCidr(), IPv6Constants.IPv4)) { - throw new ApiMessageInterceptionException(argerr("invalid CIDR[%s], only ipv4 is supported", msg.getAllowedCidr())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10015, "invalid CIDR[%s], only ipv4 is supported", msg.getAllowedCidr())); } } @@ -201,7 +202,7 @@ private void validate(APICreatePortForwardingRuleMsg msg) { if(useFor != null && !useFor.isEmpty()){ VipUseForList useForList = new VipUseForList(useFor); if(!useForList.validateNewAdded(PortForwardingConstant.PORTFORWARDING_NETWORK_SERVICE_TYPE)){ - throw new ApiMessageInterceptionException(argerr("the vip[uuid:%s] has been occupied other network service entity[%s]", msg.getVipUuid(), useForList.toString())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10016, "the vip[uuid:%s] has been occupied other network service entity[%s]", msg.getVipUuid(), useForList.toString())); } } @@ -211,7 +212,7 @@ private void validate(APICreatePortForwardingRuleMsg msg) { for (PortForwardingRuleVO vo : vos) { if (vo.getProtocolType().toString().equals(msg.getProtocolType())) { if (rangeOverlap(vipStart, vipEnd, vo.getVipPortStart(), vo.getVipPortEnd())) { - throw new ApiMessageInterceptionException(argerr("vip port range[vipStartPort:%s, vipEndPort:%s] overlaps with rule[uuid:%s, vipStartPort:%s, vipEndPort:%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10017, "vip port range[vipStartPort:%s, vipEndPort:%s] overlaps with rule[uuid:%s, vipStartPort:%s, vipEndPort:%s]", vipStart, vipEnd, vo.getUuid(), vo.getVipPortStart(), vo.getVipPortEnd())); } } @@ -226,7 +227,7 @@ private void validate(APICreatePortForwardingRuleMsg msg) { nicq.add(VmNicVO_.uuid, Op.EQ, msg.getVmNicUuid()); String nicL3Uuid = nicq.findValue(); if (nicL3Uuid.equals(vipL3Uuid)) { - throw new ApiMessageInterceptionException(argerr("guest l3Network of vm nic[uuid:%s] and vip l3Network of vip[uuid: %s] are the same network", msg.getVmNicUuid(), msg.getVipUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10018, "guest l3Network of vm nic[uuid:%s] and vip l3Network of vip[uuid: %s] are the same network", msg.getVmNicUuid(), msg.getVipUuid())); } if (vipVO.getPeerL3NetworkUuids() != null && !vipVO.getPeerL3NetworkUuids().contains(nicL3Uuid)) { @@ -235,7 +236,7 @@ private void validate(APICreatePortForwardingRuleMsg msg) { try { vipBase.checkPeerL3Additive(nicL3Uuid); } catch (CloudRuntimeException e) { - throw new ApiMessageInterceptionException(operr(e.getMessage())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10019, e.getMessage())); } } @@ -270,12 +271,12 @@ private void checkIfAnotherVip(String vipUuid, String vmNicUuid) { if (StringUtils.isNotEmpty(vmUuid)) { VmInstanceVO vm = Q.New(VmInstanceVO.class).eq(VmInstanceVO_.uuid, vmUuid).find(); - throw new ApiMessageInterceptionException(operr("the VM[name:%s uuid:%s] already has port forwarding rules that have different VIPs than the one[uuid:%s]", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10020, "the VM[name:%s uuid:%s] already has port forwarding rules that have different VIPs than the one[uuid:%s]", vm.getName(), vm.getUuid(), vipUuid)); } else { VmNicVO vmNic = Q.New(VmNicVO.class).eq(VmNicVO_.uuid, vmNicUuid).find(); - throw new ApiMessageInterceptionException(operr("the VmNic[uuid:%s] already has port forwarding rules that have different VIPs than the one[uuid:%s]", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10021, "the VmNic[uuid:%s] already has port forwarding rules that have different VIPs than the one[uuid:%s]", vmNic.getUuid(), vipUuid)); } } @@ -289,7 +290,7 @@ private void checkNicRule(String vmNicUuid) { if (!uuids.isEmpty()) { throw new ApiMessageInterceptionException(operr( - "vmNic uuid[%s] is not allowed add portForwarding with allowedCidr rule, because vmNic exist eip", + ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10022, "vmNic uuid[%s] is not allowed add portForwarding with allowedCidr rule, because vmNic exist eip", vmNicUuid)); } } @@ -313,7 +314,7 @@ private void checkForConflictsWithOtherRules(String vmNicUuid, Integer privatePo if (allowedCidr != null){ if (q.isExists()) { throw new ApiMessageInterceptionException(operr( - "could not attach port forwarding rule with allowedCidr, because vmNic[uuid:%s] " + + ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10023, "could not attach port forwarding rule with allowedCidr, because vmNic[uuid:%s] " + "already has rules that overlap the target private port ranges[%s, %s] " + "and have the same protocol type[%s]", vmNicUuid, privatePortStart, privatePortEnd, protocolType)); @@ -323,7 +324,7 @@ private void checkForConflictsWithOtherRules(String vmNicUuid, Integer privatePo q = q.notNull(PortForwardingRuleVO_.allowedCidr); if (q.isExists()) { throw new ApiMessageInterceptionException(operr( - "could not attach port forwarding rule, because vmNic[uuid:%s] already has a rule " + + ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10024, "could not attach port forwarding rule, because vmNic[uuid:%s] already has a rule " + "that overlaps the target private port ranges[%s, %s], " + "has the same protocol type[%s] and has AllowedCidr", vmNicUuid, privatePortStart, privatePortEnd, protocolType)); diff --git a/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/PortForwardingManagerImpl.java b/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/PortForwardingManagerImpl.java index 96e51bc6d86..ce34e098021 100755 --- a/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/PortForwardingManagerImpl.java +++ b/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/PortForwardingManagerImpl.java @@ -57,6 +57,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class PortForwardingManagerImpl extends AbstractService implements PortForwardingManager, VipReleaseExtensionPoint, AddExpandedQueryExtensionPoint, ReportQuotaExtensionPoint, VipGetUsedPortRangeExtensionPoint, @@ -516,7 +517,7 @@ public void fail(ErrorCode errorCode) { } catch (PortForwardingException e) { String err = String.format("unable to revoke port forwarding rule[uuid:%s]", inv.getUuid()); logger.warn(err, e); - complete.fail(operr(e.getMessage())); + complete.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10000, e.getMessage())); return; } } @@ -787,7 +788,7 @@ public void run(FlowTrigger trigger, Map data) { try { extp.preAttachPortForwardingRule(ruleInv, providerType); } catch (PortForwardingException e) { - ErrorCode err = err(SysErrors.CREATE_RESOURCE_ERROR, "unable to create port forwarding rule, extension[%s] refused it because %s", extp.getClass().getName(), e.getMessage()); + ErrorCode err = err(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10001, SysErrors.CREATE_RESOURCE_ERROR, "unable to create port forwarding rule, extension[%s] refused it because %s", extp.getClass().getName(), e.getMessage()); logger.warn(err.getDetails(), e); trigger.fail(err); return; @@ -843,7 +844,7 @@ public void fail(ErrorCode errorCode) { Vip v = new Vip(struct.getVip().getUuid()); v.setStruct(vipStruct); v.release(new NopeCompletion()); - trigger.fail(err(SysErrors.CREATE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); + trigger.fail(err(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10002, SysErrors.CREATE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); } }); } @@ -913,7 +914,7 @@ public String getSyncSignature() { @Override public void run(SyncTaskChain chain) { if (!dbf.isExist(pf.getUuid(), PortForwardingRuleVO.class)) { - completion.fail(operr("port forwarding rule [uuid:%s] is deleted", pf.getUuid())); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10003, "port forwarding rule [uuid:%s] is deleted", pf.getUuid())); chain.next(); return; } @@ -1092,7 +1093,7 @@ public String getSyncSignature() { @Override public void run(SyncTaskChain chain) { if (!dbf.isExist(struct.getRule().getUuid(), PortForwardingRuleVO.class)) { - completion.fail(operr("port forwarding rule [uuid:%s] is deleted", struct.getRule().getUuid())); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10004, "port forwarding rule [uuid:%s] is deleted", struct.getRule().getUuid())); chain.next(); return; } @@ -1218,7 +1219,7 @@ public String getSyncSignature() { @Override public void run(SyncTaskChain chain) { if (!dbf.isExist(struct.getRule().getUuid(), PortForwardingRuleVO.class)) { - completion.fail(operr("port forwarding rule [uuid:%s] is deleted", struct.getRule().getUuid())); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10005, "port forwarding rule [uuid:%s] is deleted", struct.getRule().getUuid())); chain.next(); return; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java index 35173af3236..97840150a1e 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java @@ -32,6 +32,7 @@ import java.util.Map; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by shixin.ruan on 09/17/2019 @@ -99,7 +100,7 @@ private void validate(APISetVmNicSecurityGroupMsg msg) { for (APISetVmNicSecurityGroupMsg.VmNicSecurityGroupRefAO ref : msg.getRefs()) { String sgControllerUuid = SecurityGroupHelper.getSdnControllerUuid(ref.getSecurityGroupUuid()); if (!StringUtils.equals(sgControllerUuid, nicControllerUuid)) { - throw new ApiMessageInterceptionException(argerr("could not add vmnic to securityGroup, " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_10013, "could not add vmnic to securityGroup, " + "because they have different sdn controller[nic controller uuid:%s, security group controller uuid:%s]", nicControllerUuid, sgControllerUuid)); } @@ -114,7 +115,7 @@ private void validate(APIAddSecurityGroupRuleMsg msg) { } String remoteControllerUuid = SecurityGroupHelper.getSdnControllerUuid(rule.getRemoteSecurityGroupUuid()); if (!StringUtils.equals(sgControllerUuid, remoteControllerUuid)) { - throw new ApiMessageInterceptionException(argerr("could not add securityGroup rule, " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_10014, "could not add securityGroup rule, " + "because rule remote security group sdn controller uuid[:%s] is different from security group controller uuid[:%s]", remoteControllerUuid, sgControllerUuid)); } @@ -123,16 +124,16 @@ private void validate(APIAddSecurityGroupRuleMsg msg) { private void validate(APIAddSdnControllerMsg msg) { if (!SdnControllerType.getAllTypeNames().contains(msg.getVendorType())) { - throw new ApiMessageInterceptionException(argerr("could not add sdn controller because type: %s in not in the supported list: %s", msg.getVendorType(), SdnControllerType.getAllTypeNames())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_10015, "could not add sdn controller because type: %s in not in the supported list: %s", msg.getVendorType(), SdnControllerType.getAllTypeNames())); } if (!NetworkUtils.isUnicastIPAddress(msg.getIp())) { - throw new ApiMessageInterceptionException(argerr("could not add sdn controller because ip[%s] is not an unicast address", msg.getIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_10016, "could not add sdn controller because ip[%s] is not an unicast address", msg.getIp())); } boolean existed = Q.New(SdnControllerVO.class).eq(SdnControllerVO_.ip, msg.getIp()).isExists(); if (existed) { - throw new ApiMessageInterceptionException(argerr("could not add sdn controller because controller [ip:%s] is already added", msg.getIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_10017, "could not add sdn controller because controller [ip:%s] is already added", msg.getIp())); } } @@ -140,12 +141,12 @@ private void validate(APISdnControllerAddHostMsg msg) { if (Q.New(SdnControllerHostRefVO.class) .eq(SdnControllerHostRefVO_.vSwitchType, msg.getvSwitchType()) .eq(SdnControllerHostRefVO_.hostUuid, msg.getHostUuid()).isExists()) { - throw new ApiMessageInterceptionException(argerr("could not add host[uuid:%s] to sdn controller[uuid:%s], " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_10018, "could not add host[uuid:%s] to sdn controller[uuid:%s], " + " because host already attached to sdn controller", msg.getHostUuid(), msg.getSdnControllerUuid())); } if (msg.getVtepIp() != null && msg.getNetmask() == null) { - throw new ApiMessageInterceptionException(argerr("could not add host[uuid:%s] to sdn controller[uuid:%s], " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_10019, "could not add host[uuid:%s] to sdn controller[uuid:%s], " + " because netmask is not specified", msg.getHostUuid(), msg.getSdnControllerUuid())); } @@ -155,7 +156,7 @@ private void validate(APISdnControllerAddHostMsg msg) { .eq(SdnControllerHostRefVO_.vSwitchType, msg.getvSwitchType()) .eq(SdnControllerHostRefVO_.vtepIp, msg.getVtepIp()).find(); if (refvo != null) { - throw new ApiMessageInterceptionException(argerr("could not add host[uuid:%s] to sdn controller[uuid:%s], " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_10020, "could not add host[uuid:%s] to sdn controller[uuid:%s], " + " because vtepip is used by host[uuid:%s]", msg.getHostUuid(), msg.getSdnControllerUuid(), refvo.getHostUuid())); } @@ -174,7 +175,7 @@ private void validate(APISdnControllerRemoveHostMsg msg) { if (!Q.New(SdnControllerHostRefVO.class) .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) .eq(SdnControllerHostRefVO_.hostUuid, msg.getHostUuid()).isExists()) { - throw new ApiMessageInterceptionException(argerr("could not remove host[uuid:%s] from sdn controller[uuid:%s], " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_10021, "could not remove host[uuid:%s] from sdn controller[uuid:%s], " + " because host has not been added to sdn controller", msg.getHostUuid(), msg.getSdnControllerUuid())); } } @@ -184,12 +185,12 @@ private void validate(APISdnControllerChangeHostMsg msg) { .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) .eq(SdnControllerHostRefVO_.hostUuid, msg.getHostUuid()).find(); if (refVO == null) { - throw new ApiMessageInterceptionException(argerr("could not change host[uuid:%s] of sdn controller[uuid:%s], " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_10022, "could not change host[uuid:%s] of sdn controller[uuid:%s], " + " because host has not been added to sdn controller", msg.getHostUuid(), msg.getSdnControllerUuid())); } if (msg.getVtepIp() != null && msg.getNetmask() == null) { - throw new ApiMessageInterceptionException(argerr("could not change host[uuid:%s] of sdn controller[uuid:%s], " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_10023, "could not change host[uuid:%s] of sdn controller[uuid:%s], " + " because netmask is specified", msg.getHostUuid(), msg.getSdnControllerUuid())); } @@ -246,7 +247,7 @@ private void validateH3cTenantStatus(String l3NetworkUuid, String sdnControllerU .eq(H3cSdnControllerTenantVO_.state, SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_DISABLE) .isExists(); if (hasDisabledTenants) { - throw new ApiMessageInterceptionException(argerr("Cannot attach L3 network to VM because some tenants in SDN controller[uuid:%s] have been deleted. " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_10024, "Cannot attach L3 network to VM because some tenants in SDN controller[uuid:%s] have been deleted. " + "Please run tenant synchronization first to update tenant status", sdnControllerUuid)); } } @@ -254,13 +255,13 @@ private void validateH3cTenantStatus(String l3NetworkUuid, String sdnControllerU private void validate(APIPullSdnControllerTenantMsg msg) { SdnControllerVO sdnControllerVO = dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class); if (sdnControllerVO == null) { - throw new ApiMessageInterceptionException(argerr("SDN controller[uuid:%s] not found", msg.getSdnControllerUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_10025, "SDN controller[uuid:%s] not found", msg.getSdnControllerUuid())); } // Only H3C_VCFC_CONTROLLER with vendorVersion H3C_VCFC_VENDOR_VERSION_V2 supports pull tenant operation if (!SdnControllerConstant.H3C_VCFC_CONTROLLER.equals(sdnControllerVO.getVendorType()) || !SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2.equals(sdnControllerVO.getVendorVersion())) { - throw new ApiMessageInterceptionException(argerr("Pull tenant operation is not supported for SDN controller[uuid:%s, vendorType:%s, vendorVersion:%s]. " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_10026, "Pull tenant operation is not supported for SDN controller[uuid:%s, vendorType:%s, vendorVersion:%s]. " + "Only H3C VCFC V2 controllers support this operation", msg.getSdnControllerUuid(), sdnControllerVO.getVendorType(), sdnControllerVO.getVendorVersion())); } @@ -271,7 +272,7 @@ private void validateVlanRanges(List ranges) { for (String range : ranges) { List vlans = Arrays.asList(range.split("-")); if (vlans.size() != 2) { - throw new ApiMessageInterceptionException(argerr("could not change sdn controller, " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_10027, "could not change sdn controller, " + "because vlan range[%s] is not in the correct format", range)); } @@ -279,13 +280,13 @@ private void validateVlanRanges(List ranges) { int start = Integer.parseInt(vlans.get(0)); int end = Integer.parseInt(vlans.get(1)); if (start > end) { - throw new ApiMessageInterceptionException(argerr("could not change sdn controller, " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_10028, "could not change sdn controller, " + "because vlan range[%s] is not in the correct format", range)); } for (SdnVlanRange vrange : sdnVlanRanges) { if (isOverlappedVlanRange(start, end, vrange.startVlan, vrange.endVlan)) { - throw new ApiMessageInterceptionException(argerr("could not change sdn controller, " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_10029, "could not change sdn controller, " + "because vlan range[%s] is overlapped with other vlan range", range)); } } @@ -294,7 +295,7 @@ private void validateVlanRanges(List ranges) { vlanRange.endVlan = end; sdnVlanRanges.add(vlanRange); } catch (Exception e) { - throw new ApiMessageInterceptionException(argerr("could not change sdn controller, " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_10030, "could not change sdn controller, " + "because vlan range[%s] is not in the correct format", range)); } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java index 252efe7098c..f1d1f11829b 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java @@ -55,6 +55,7 @@ import static org.zstack.sdnController.header.SdnControllerFlowDataParam.*; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class SdnControllerBase { @@ -280,7 +281,7 @@ public void run(FlowTrigger trigger, Map data) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { - trigger.fail(operr("ping sdn controller failed, error: %s", reply.getError().getDetails())); + trigger.fail(operr(ORG_ZSTACK_SDNCONTROLLER_10009, "ping sdn controller failed, error: %s", reply.getError().getDetails())); } else { trigger.next(); } @@ -483,7 +484,7 @@ public void run(SyncTaskChain chain) { .eq(SdnControllerHostRefVO_.vSwitchType, msg.getvSwitchType()) .eq(SdnControllerHostRefVO_.vtepIp, msg.getVtepIp()).find(); if (refvo != null) { - completion.fail(argerr("could not add host[uuid:%s] to sdn controller[uuid:%s], " + + completion.fail(argerr(ORG_ZSTACK_SDNCONTROLLER_10010, "could not add host[uuid:%s] to sdn controller[uuid:%s], " + " because vtepip is used by host[uuid:%s]", msg.getHostUuid(), msg.getSdnControllerUuid(), refvo.getHostUuid())); return; @@ -1100,7 +1101,7 @@ private void pullSdnControllerTenant(PullSdnControllerTenantMsg msg, Completion // But confirm again here to ensure type safety if (!SdnControllerConstant.H3C_VCFC_CONTROLLER.equals(self.getVendorType()) || !SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2.equals(self.getVendorVersion())) { - completion.fail(operr("Pull tenant operation is only supported for H3C VCFC V2 controllers")); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_10011, "Pull tenant operation is only supported for H3C VCFC V2 controllers")); return; } @@ -1131,7 +1132,7 @@ public void fail(ErrorCode errorCode) { } }); } catch (Exception e) { - trigger.fail(operr("Failed to pull tenant data: %s", e.getMessage())); + trigger.fail(operr(ORG_ZSTACK_SDNCONTROLLER_10012, "Failed to pull tenant data: %s", e.getMessage())); } } }).then(new NoRollbackFlow() { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java index 35bb7badead..874f148e9fd 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java @@ -42,6 +42,7 @@ import java.util.*; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class SdnControllerManagerImpl extends AbstractService implements SdnControllerManager, L2NetworkCreateExtensionPoint, L2NetworkDeleteExtensionPoint, InstantiateResourceOnAttachingNicExtensionPoint, @@ -271,7 +272,7 @@ public void postCreateL2Network(L2NetworkInventory l2Network, APICreateL2Network String sdnControllerUuid = null; List sysTags = msg.getSystemTags(); if (sysTags == null || sysTags.isEmpty()) { - completion.fail(operr("cannot create sdn l2 network because sdn controller uuid is missing from systemTags in API message")); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_10000, "cannot create sdn l2 network because sdn controller uuid is missing from systemTags in API message")); return; } for (String systag : sysTags) { @@ -282,12 +283,12 @@ public void postCreateL2Network(L2NetworkInventory l2Network, APICreateL2Network } if (sdnControllerUuid == null) { - completion.fail(operr("cannot create sdn l2 network because sdn controller uuid is missing from API message")); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_10001, "cannot create sdn l2 network because sdn controller uuid is missing from API message")); return; } sdnControllerVO = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); if (sdnControllerVO == null) { - completion.fail(operr("cannot find sdn controller for l2 network[uuid:%s, vswitchType:%s]", + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_10002, "cannot find sdn controller for l2 network[uuid:%s, vswitchType:%s]", l2Network.getUuid(), l2Network.getvSwitchType())); return; } @@ -356,7 +357,7 @@ private void sdnAddVmNic(String sdnControllerUuid, List nics, Co SdnControllerVO vo = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); SdnControllerFactory factory = getSdnControllerFactory(vo.getVendorType()); if (factory == null) { - completion.fail(operr("there is no sdn controller factory for sdn controller type:%s", vo.getVendorType())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_10003, "there is no sdn controller factory for sdn controller type:%s", vo.getVendorType())); return; } @@ -394,7 +395,7 @@ private void removeOvnLogicalPorts(String controllerUuid, List n SdnControllerVO vo = dbf.findByUuid(controllerUuid, SdnControllerVO.class); SdnControllerFactory factory = getSdnControllerFactory(vo.getVendorType()); if (factory == null) { - completion.fail(operr("there is no sdn controller factory for sdn controller type:%s", vo.getVendorType())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_10004, "there is no sdn controller factory for sdn controller type:%s", vo.getVendorType())); return; } @@ -468,7 +469,7 @@ public void releaseVmResource(VmInstanceSpec spec, Completion completion) { String controllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByResourceUuid( l2VO.getUuid(), L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); if (controllerUuid == null) { - completion.fail(operr("sdn l2 network[uuid:%s] is not attached controller", l2VO.getUuid())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_10005, "sdn l2 network[uuid:%s] is not attached controller", l2VO.getUuid())); return; } @@ -495,7 +496,7 @@ public void instantiateResourceOnAttachingNic(VmInstanceSpec spec, L3NetworkInve String controllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByResourceUuid( l2NetworkVO.getUuid(), L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); if (controllerUuid == null) { - completion.fail(operr("sdn l2 network[uuid:%s] is not attached controller", l2NetworkVO.getUuid())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_10006, "sdn l2 network[uuid:%s] is not attached controller", l2NetworkVO.getUuid())); return; } @@ -620,7 +621,7 @@ public void preInstantiateVmResource(VmInstanceSpec spec, Completion completion) String controllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByResourceUuid( l2VO.getUuid(), L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); if (controllerUuid == null) { - completion.fail(operr("sdn l2 network[uuid:%s] is not attached controller", l2VO.getUuid())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_10007, "sdn l2 network[uuid:%s] is not attached controller", l2VO.getUuid())); return; } @@ -676,7 +677,7 @@ public void preReleaseVmResource(VmInstanceSpec spec, Completion completion) { String controllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByResourceUuid( l2VO.getUuid(), L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); if (controllerUuid == null) { - completion.fail(operr("sdn l2 network[uuid:%s] is not attached controller", l2VO.getUuid())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_10008, "sdn l2 network[uuid:%s] is not attached controller", l2VO.getUuid())); return; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java index 8583a8b07ee..da02b955ebc 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java @@ -31,6 +31,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class H3cVcfcApiInterceptor implements ApiMessageInterceptor, GlobalApiMessageInterceptor { private static final CLogger logger = Utils.getLogger(H3cVcfcApiInterceptor.class); @@ -117,7 +118,7 @@ public static boolean isOverlappedVniRange(Integer startVni1, Integer endVni1, I private void validate(APICreateVniRangeMsg msg) { VxlanNetworkPoolVO pool = dbf.findByUuid(msg.getL2NetworkUuid(), VxlanNetworkPoolVO.class); if ( pool == null ) { - throw new ApiMessageInterceptionException(argerr("Could not create VNI range because the specified L2 network [uuid:%s] is not a VXLAN network pool", msg.getL2NetworkUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10015, "Could not create VNI range because the specified L2 network [uuid:%s] is not a VXLAN network pool", msg.getL2NetworkUuid())); } HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(msg.getL2NetworkUuid(), HardwareL2VxlanNetworkPoolVO.class); @@ -132,7 +133,7 @@ private void validate(APICreateVniRangeMsg msg) { // user's vni must <= 4094 if (msg.getStartVni() > 4094 || msg.getEndVni() > 4094) { - throw new ApiMessageInterceptionException(argerr("Could not create VNI range [%s-%s] because H3C controllers use VNI as VLAN ID and the range must be within 1-4094", msg.getStartVni(), msg.getEndVni())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10016, "Could not create VNI range [%s-%s] because H3C controllers use VNI as VLAN ID and the range must be within 1-4094", msg.getStartVni(), msg.getEndVni())); } SdnControllerL2 sdnController = sdnControllerManager.getSdnControllerL2(vo); @@ -147,7 +148,7 @@ private void validate(APICreateVniRangeMsg msg) { return; } } - throw new ApiMessageInterceptionException(argerr("Could not create VNI range [%s-%s] because it is not covered by any of the SDN controller's configured VNI ranges", userVniRange.startVni, userVniRange.endVni)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10017, "Could not create VNI range [%s-%s] because it is not covered by any of the SDN controller's configured VNI ranges", userVniRange.startVni, userVniRange.endVni)); } private void validate(APIAddIpv6RangeMsg msg) { @@ -163,7 +164,7 @@ private void validate(APIAddIpv6RangeMsg msg) { return; } if (vo.getStatus() != SdnControllerStatus.Connected) { - throw new ApiMessageInterceptionException(argerr("Could not add IPv6 range because the SDN controller [uuid:%s] is not connected. Current status: %s", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10018, "Could not add IPv6 range because the SDN controller [uuid:%s] is not connected. Current status: %s", sdnControllerUuid, vo.getStatus())); } } @@ -181,7 +182,7 @@ private void validate(APIAddIpv6RangeByNetworkCidrMsg msg) { return; } if (vo.getStatus() != SdnControllerStatus.Connected) { - throw new ApiMessageInterceptionException(argerr("Could not add IPv6 range by network CIDR because the SDN controller [uuid:%s] is not connected. Current status: %s", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10019, "Could not add IPv6 range by network CIDR because the SDN controller [uuid:%s] is not connected. Current status: %s", sdnControllerUuid, vo.getStatus())); } } @@ -199,7 +200,7 @@ private void validate(APIAddIpRangeMsg msg) { return; } if (vo.getStatus() != SdnControllerStatus.Connected) { - throw new ApiMessageInterceptionException(argerr("Could not add IP range because the SDN controller [uuid:%s] is not connected. Current status: %s", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10020, "Could not add IP range because the SDN controller [uuid:%s] is not connected. Current status: %s", sdnControllerUuid, vo.getStatus())); } } @@ -217,7 +218,7 @@ private void validate(APIAddIpRangeByNetworkCidrMsg msg) { return; } if (vo.getStatus() != SdnControllerStatus.Connected) { - throw new ApiMessageInterceptionException(argerr("Could not add IP range by network CIDR because the SDN controller [uuid:%s] is not connected. Current status: %s", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10021, "Could not add IP range by network CIDR because the SDN controller [uuid:%s] is not connected. Current status: %s", sdnControllerUuid, vo.getStatus())); } } @@ -231,7 +232,7 @@ private void validate(APICreateL3NetworkMsg msg) { if (SdnControllerConstant.H3C_VCFC_CONTROLLER.equals(vo.getVendorType()) && SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2.equals(vo.getVendorVersion()) && L3NetworkCategory.Public.toString().equals(msg.getCategory())) { - throw new ApiMessageInterceptionException(argerr("can not create l3 network" + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10022, "can not create l3 network" + "because H3C VCFC V2 SDN controller does not support l3[type:%s, category:%s]", msg.getType(), msg.getCategory())); } } @@ -260,7 +261,7 @@ private void validate(APICreateL2HardwareVxlanNetworkMsg msg) { .isExists(); if (!tenantExist) { throw new ApiMessageInterceptionException(argerr( - "Could not create hardware VXLAN network because tenant UUID is a mandatory parameter for the H3C VCFC V2 controller")); + ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10023, "Could not create hardware VXLAN network because tenant UUID is a mandatory parameter for the H3C VCFC V2 controller")); } } @@ -307,7 +308,7 @@ private void validate(APIAddSdnControllerMsg msg) { return; } if (!validateH3cController(msg) && msg.getVendorVersion().equals(SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V1)) { - throw new ApiMessageInterceptionException(argerr("Could not add H3C VCFC controller because VDS UUID system tag is required for H3C VCFC V1 controllers")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10024, "Could not add H3C VCFC controller because VDS UUID system tag is required for H3C VCFC V1 controllers")); } } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java index 9ac04a5f084..711d682eb40 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java @@ -31,6 +31,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class H3cVcfcSdnController implements SdnController, SdnControllerL2 { @@ -88,7 +89,7 @@ public void getH3cVniRanges(Completion completion) { H3cVcfcCommands.GetH3cVniRangeRsp rsp = new H3cVcfcHttpClient<>(getGetH3cVniRangeRspClass()) .syncCall(HttpMethod.GET.name(), self.getIp(), getH3cVcfcVniRangesPath(), cmd, getH3cHeaders(token)); if (rsp == null) { - completion.fail(operr("Could not retrieve VNI ranges because the SDN controller [ip:%s] did not respond", self.getIp())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10025, "Could not retrieve VNI ranges because the SDN controller [ip:%s] did not respond", self.getIp())); return; } @@ -112,13 +113,13 @@ public void getH3cVniRanges(Completion completion) { } if (count == 0) { - completion.fail(operr("Could not initialize SDN controller because no VNI ranges are configured on controller [ip:%s]", self.getIp())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10026, "Could not initialize SDN controller because no VNI ranges are configured on controller [ip:%s]", self.getIp())); return; } completion.success(); } catch (Exception e) { - completion.fail(operr("Could not retrieve VNI ranges from SDN controller [ip:%s] because %s", self.getIp(), e.getLocalizedMessage())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10027, "Could not retrieve VNI ranges from SDN controller [ip:%s] because %s", self.getIp(), e.getLocalizedMessage())); } } @@ -128,7 +129,7 @@ private void getH3cDefaultTenant(Completion completion) { H3cVcfcCommands.GetH3cTenantsRsp rsp = new H3cVcfcHttpClient<>(getGetH3cTenantsRspClass()) .syncCall(HttpMethod.GET.name(), self.getIp(), getH3cVcfcTenantsPath(), cmd, getH3cHeaders(token)); if (rsp == null) { - completion.fail(operr("Could not retrieve tenants because the SDN controller [ip:%s] did not respond", self.getIp())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10028, "Could not retrieve tenants because the SDN controller [ip:%s] did not respond", self.getIp())); return; } @@ -151,13 +152,13 @@ private void getH3cDefaultTenant(Completion completion) { } if (!found) { - completion.fail(operr("Could not initialize SDN controller because no default tenant is configured on controller [ip:%s]", self.getIp())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10029, "Could not initialize SDN controller because no default tenant is configured on controller [ip:%s]", self.getIp())); return; } completion.success(); } catch (Exception e) { - completion.fail(operr("Could not retrieve default tenant from SDN controller [ip:%s] because of a communication error", self.getIp())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10030, "Could not retrieve default tenant from SDN controller [ip:%s] because of a communication error", self.getIp())); } } @@ -314,7 +315,7 @@ private void doCreateVxlanNetworkOnController(L2NetworkInventory vxlan, Completi H3cVcfcCommands.CreateH3cNetworksRsp rsp = new H3cVcfcHttpClient<>(getCreateH3cNetworksRspClass()) .syncCall(HttpMethod.POST.name(), leaderIp, getH3cVcfcL2NetworksPath(), cmd, getH3cHeaders(token)); if (rsp == null) { - completion.fail(operr("Could not create VXLAN network because the SDN controller [ip:%s] did not respond", self.getIp())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10031, "Could not create VXLAN network because the SDN controller [ip:%s] did not respond", self.getIp())); return; } H3cVcfcCommands.NetworkCmd network = rsp.networks.get(0); @@ -330,7 +331,7 @@ private void doCreateVxlanNetworkOnController(L2NetworkInventory vxlan, Completi completion.success(); } catch (Exception e) { - completion.fail(operr("Could not create VXLAN network on SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10032, "Could not create VXLAN network on SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); } } @@ -409,13 +410,13 @@ private void doDeleteVxlanNetworkOnController(L2NetworkInventory vxlan, Completi H3cVcfcCommands.DeleteH3cNetworksRsp rsp = new H3cVcfcHttpClient<>(getDeleteH3cNetworksRspClass()) .syncCall(HttpMethod.DELETE.name(), leaderIp, String.format("%s/%s", getH3cVcfcL2NetworksPath(), h3cL2NetworkUuid), cmd, getH3cHeaders(token)); if (rsp == null) { - completion.fail(operr("Could not delete VXLAN network because the SDN controller [ip:%s] did not respond", self.getIp())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10033, "Could not delete VXLAN network because the SDN controller [ip:%s] did not respond", self.getIp())); return; } completion.success(); } catch (Exception e) { - completion.fail(operr("Could not delete VXLAN network on SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10034, "Could not delete VXLAN network on SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); } } @@ -472,14 +473,14 @@ private void getH3cControllerLeaderIp(Completion completion) { H3cVcfcCommands.GetH3cTeamLederIpReply rsp = new H3cVcfcHttpClient<>(getGetH3cTeamLederIpReplyClass()) .syncCall(HttpMethod.GET.name(), self.getIp(), getH3cVcfcTeamLeaderIpPath(), cmd, getH3cHeaders(token)); if (rsp == null) { - completion.fail(operr("Could not determine cluster leader because the SDN controller [ip:%s] did not respond", self.getIp())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10035, "Could not determine cluster leader because the SDN controller [ip:%s] did not respond", self.getIp())); return; } leaderIp = rsp.ip; completion.success(); } catch (Exception e) { - completion.fail(operr("Could not determine cluster leader for SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10036, "Could not determine cluster leader for SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); } } @@ -494,7 +495,7 @@ public void getH3cControllerToken(Completion completion) { H3cVcfcCommands.LoginRsp rsp = new H3cVcfcHttpClient<>(getLoginRspClass()) .syncCall(HttpMethod.POST.name(), self.getIp(), getH3cVcfcGetTokenPath(), cmd, getH3cHeaders()); if (rsp == null) { - completion.fail(operr("Could not authenticate with SDN controller because controller [ip:%s] did not respond", self.getIp())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10037, "Could not authenticate with SDN controller because controller [ip:%s] did not respond", self.getIp())); return; } @@ -502,7 +503,7 @@ public void getH3cControllerToken(Completion completion) { completion.success(); } catch (Exception e) { - completion.fail(operr("Could not authenticate with SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10038, "Could not authenticate with SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java index 778d641c5e4..78e2f7e3cbb 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java @@ -34,6 +34,7 @@ import static org.zstack.sdnController.h3cVcfc.H3cVcfcSdnControllerGlobalProperty.H3C_MGT_IP_IS_LEADER_IP; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * H3C VCFC SDN Controller V2 Implementation. @@ -173,7 +174,7 @@ private void addL3NetworkIpRangeOnController(L3NetworkInventory inv, IpRangeInve subnet = (H3cVcfcV2Commands.SubnetCmd) createSubnets(asList(newSubnet)).get(0); } if (subnet == null) { - completion.fail(operr("Could not add IP range because subnet creation failed on the SDN controller")); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10000, "Could not add IP range because subnet creation failed on the SDN controller")); return; } if (!Q.New(H3cSdnSubnetIpRangeRefVO.class) @@ -195,7 +196,7 @@ private void addL3NetworkIpRangeOnController(L3NetworkInventory inv, IpRangeInve } completion.success(); } catch (Exception e) { - completion.fail(operr("Could not add IP range to L3 network because %s", e.getMessage())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10001, "Could not add IP range to L3 network because %s", e.getMessage())); } } @@ -229,7 +230,7 @@ private void deleteL3NetworkIpRangeOnController(L3NetworkInventory inv, IpRangeI } completion.success(); } catch (Exception e) { - completion.fail(operr("Could not delete IP range from L3 network because %s", e.getMessage())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10002, "Could not delete IP range from L3 network because %s", e.getMessage())); } } @@ -260,14 +261,14 @@ private void getH3cControllerLeaderIp(Completion completion) { H3cVcfcV2Commands.GetH3cTeamLederIpReply rsp = new H3cVcfcHttpClient<>(getGetH3cTeamLederIpReplyClass()) .syncCall(HttpMethod.GET.name(), self.getIp(), getH3cVcfcTeamLeaderIpPath(), cmd, getH3cHeaders(token)); if (rsp == null) { - completion.fail(operr("Could not determine cluster leader because the SDN controller [ip:%s] did not respond", self.getIp())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10003, "Could not determine cluster leader because the SDN controller [ip:%s] did not respond", self.getIp())); return; } leaderIp = rsp.ip; completion.success(); } catch (Exception e) { - completion.fail(operr("Could not determine cluster leader for SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10004, "Could not determine cluster leader for SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); } } @@ -283,7 +284,7 @@ public void getH3cControllerToken(Completion completion) { H3cVcfcV2Commands.LoginRsp rsp = new H3cVcfcHttpClient<>(getLoginRspClass()) .syncCall(HttpMethod.POST.name(), self.getIp(), getH3cVcfcGetTokenPath(), cmd, getH3cHeaders()); if (rsp == null) { - completion.fail(operr("Could not authenticate with SDN controller because controller [ip:%s] did not respond", self.getIp())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10005, "Could not authenticate with SDN controller because controller [ip:%s] did not respond", self.getIp())); return; } @@ -291,7 +292,7 @@ public void getH3cControllerToken(Completion completion) { completion.success(); } catch (Exception e) { - completion.fail(operr("Could not authenticate with SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10006, "Could not authenticate with SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); } } @@ -302,7 +303,7 @@ public void getH3cVniRanges(Completion completion) { H3cVcfcV2Commands.GetH3cVniRangeRsp rsp = new H3cVcfcHttpClient<>(getGetH3cVniRangeRspClass()) .syncCall(HttpMethod.GET.name(), self.getIp(), getH3cVcfcVniRangesPath(), cmd, getH3cHeaders(token)); if (rsp == null) { - completion.fail(operr("Could not retrieve VNI ranges because the SDN controller [ip:%s] did not respond", self.getIp())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10007, "Could not retrieve VNI ranges because the SDN controller [ip:%s] did not respond", self.getIp())); return; } // Delete previous inherent VNI range tags before creating new ones @@ -325,13 +326,13 @@ public void getH3cVniRanges(Completion completion) { } if (count == 0) { - completion.fail(operr("Could not initialize SDN controller because no VNI ranges are configured on controller [ip:%s]", self.getIp())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10008, "Could not initialize SDN controller because no VNI ranges are configured on controller [ip:%s]", self.getIp())); return; } completion.success(); } catch (Exception e) { - completion.fail(operr("Could not retrieve VNI ranges from SDN controller [ip:%s] because %s", self.getIp(), e.getLocalizedMessage())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10009, "Could not retrieve VNI ranges from SDN controller [ip:%s] because %s", self.getIp(), e.getLocalizedMessage())); } } @@ -388,7 +389,7 @@ public void handle(ErrorCode errCode, Map data) { private void doCreateVxlanNetworkOnController(L2NetworkInventory vxlan, APICreateL2HardwareVxlanNetworkMsg msg, Completion completion) { VxlanNetworkVO vo = dbf.findByUuid(vxlan.getUuid(), VxlanNetworkVO.class); if (msg.getH3cTenantUuid() == null) { - completion.fail(operr("Could not create hardware VXLAN network because H3C tenant UUID is a mandatory parameter for the H3C VCFC V2 controller")); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10010, "Could not create hardware VXLAN network because H3C tenant UUID is a mandatory parameter for the H3C VCFC V2 controller")); return; } H3cSdnControllerTenantVO tenantVO = Q.New(H3cSdnControllerTenantVO.class) @@ -397,7 +398,7 @@ private void doCreateVxlanNetworkOnController(L2NetworkInventory vxlan, APICreat .limit(1) .find(); if (tenantVO == null) { - completion.fail(operr("Could not create hardware VXLAN network because the specified tenant does not exist in the SDN controller")); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10011, "Could not create hardware VXLAN network because the specified tenant does not exist in the SDN controller")); return; } @@ -418,7 +419,7 @@ private void doCreateVxlanNetworkOnController(L2NetworkInventory vxlan, APICreat H3cVcfcV2Commands.CreateH3cNetworksRsp rsp = new H3cVcfcHttpClient<>(getCreateH3cNetworksRspClass()) .syncCall(HttpMethod.POST.name(), leaderIp, getH3cVcfcL2NetworksPath(), cmd, getH3cHeaders(token)); if (rsp == null) { - completion.fail(operr("Could not create VXLAN network because the SDN controller [ip:%s] did not respond", self.getIp())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10012, "Could not create VXLAN network because the SDN controller [ip:%s] did not respond", self.getIp())); return; } H3cVcfcV2Commands.NetworkCmd network = rsp.networks.get(0); @@ -450,7 +451,7 @@ private void doCreateVxlanNetworkOnController(L2NetworkInventory vxlan, APICreat } completion.success(); } catch (Exception e) { - completion.fail(operr("Could not create VXLAN network on SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10013, "Could not create VXLAN network on SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); } } @@ -482,7 +483,7 @@ private void doDeleteVxlanNetworkOnController(L2NetworkInventory vxlan, Completi completion.success(); } catch (Exception e) { - completion.fail(operr("Could not delete VXLAN network on SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10014, "Could not delete VXLAN network on SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java index b21d317c240..16a9d06767b 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java @@ -23,6 +23,7 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by shixin.ruan on 09/19/2019. @@ -50,7 +51,7 @@ public void createVxlanNetworkOnSdnController(L2VxlanNetworkInventory vxlan, API public void deleteVxlanNetworkOnSdnController(VxlanNetworkVO vo, Completion completion) { HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(vo.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); if (poolVO == null || poolVO.getSdnControllerUuid() == null) { - completion.fail(argerr("there is no sdn controller for vxlan pool [uuid:%s]", vo.getPoolUuid())); + completion.fail(argerr(ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10000, "there is no sdn controller for vxlan pool [uuid:%s]", vo.getPoolUuid())); return; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java index bc356a6a4c5..e88f0dd1178 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java @@ -57,6 +57,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by shixin.ruan on 09/17/2019. @@ -90,7 +91,7 @@ public void createL2Network(L2NetworkVO ovo, APICreateL2NetworkMsg msg, ReturnVa HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(amsg.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); if (sdn == null) { - completion.fail(operr("can not find sdn controller %s", poolVO.getSdnControllerUuid())); + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10005, "can not find sdn controller %s", poolVO.getSdnControllerUuid())); return; } SdnControllerL2 controller = sdnControllerManager.getSdnControllerL2(sdn); @@ -425,7 +426,7 @@ public void run(MessageReply reply) { @Override public void done(ErrorCodeList errorCodeList) { if (!errList.getCauses().isEmpty()) { - completion.fail(operr("cannot configure hardware vxlan network for vm[uuid:%s] on the destination host[uuid:%s]", + completion.fail(operr(ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10006, "cannot configure hardware vxlan network for vm[uuid:%s] on the destination host[uuid:%s]", inv.getUuid(), destHostUuid).causedBy(errorCodeList.getCauses())); return; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPool.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPool.java index f16da37a90e..933c8055564 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPool.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPool.java @@ -34,6 +34,7 @@ import java.util.*; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by shixin.ruan on 09/17/2019. @@ -90,7 +91,7 @@ public void prepareL2NetworkOnHosts(final String l2NetworkUuid, final List L2NetworkConstant.LINUX_IF_NAME_MAX_SIZE) { - throw new ApiMessageInterceptionException(argerr("cannot create vlan-device on %s because it's too long" + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10013, "cannot create vlan-device on %s because it's too long" , msg.getPhysicalInterface())); } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanNetworkBackend.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanNetworkBackend.java index 71ccb7db63d..e886764f4e9 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanNetworkBackend.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanNetworkBackend.java @@ -31,6 +31,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class KVMRealizeHardwareVxlanNetworkBackend implements L2NetworkRealizationExtensionPoint, KVMCompleteNicInformationExtensionPoint { private static final CLogger logger = Utils.getLogger(KVMRealizeHardwareVxlanNetworkBackend.class); @@ -82,7 +83,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply hreply = reply.castReply(); CreateVlanBridgeResponse rsp = hreply.toResponse(CreateVlanBridgeResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("failed to create bridge[%s] for hardwareVxlan[uuid:%s, type:%s, vlan:%s] on kvm host[uuid:%s], because %s", + ErrorCode err = operr(ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10002, "failed to create bridge[%s] for hardwareVxlan[uuid:%s, type:%s, vlan:%s] on kvm host[uuid:%s], because %s", cmd.getBridgeName(), l2Network.getUuid(), l2Network.getType(), finalVlanId, hostUuid, rsp.getError()); completion.fail(err); return; @@ -141,7 +142,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply hreply = reply.castReply(); CheckVlanBridgeResponse rsp = hreply.toResponse(CheckVlanBridgeResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("failed to check bridge[%s] for hardwareVxlan[uuid:%s, name:%s] on kvm host[uuid:%s], %s", + ErrorCode err = operr(ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10003, "failed to check bridge[%s] for hardwareVxlan[uuid:%s, name:%s] on kvm host[uuid:%s], %s", cmd.getBridgeName(), vxlan.getUuid(), vxlan.getName(), hostUuid, rsp.getError()); completion.fail(err); return; @@ -233,7 +234,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply hreply = reply.castReply(); KVMAgentCommands.DeleteVlanBridgeResponse rsp = hreply.toResponse(KVMAgentCommands.DeleteVlanBridgeResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("failed to delete bridge[%s] for l2Network[uuid:%s, type:%s, vlan:%s] on kvm host[uuid:%s], because %s", + ErrorCode err = operr(ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10004, "failed to delete bridge[%s] for l2Network[uuid:%s, type:%s, vlan:%s] on kvm host[uuid:%s], because %s", cmd.getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2Vxlan.getVlan(), hostUuid, rsp.getError()); completion.fail(err); return; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanPoolNetworkBackend.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanPoolNetworkBackend.java index df44da2ee64..9c73c852308 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanPoolNetworkBackend.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanPoolNetworkBackend.java @@ -25,6 +25,7 @@ import org.zstack.utils.logging.CLogger; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class KVMRealizeHardwareVxlanPoolNetworkBackend implements L2NetworkRealizationExtensionPoint, KVMCompleteNicInformationExtensionPoint { private static final CLogger logger = Utils.getLogger(KVMRealizeHardwareVxlanPoolNetworkBackend.class); @@ -62,7 +63,7 @@ public void run(MessageReply reply) { CheckNetworkPhysicalInterfaceReply rsp = reply.castReply(); if (!rsp.isSuccess()) { - ErrorCode err = operr("failed to check physical interface for HardwareVxlanPool[uuid:%s, name:%s] on kvm host[uuid: %s], %s", + ErrorCode err = operr(ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10007, "failed to check physical interface for HardwareVxlanPool[uuid:%s, name:%s] on kvm host[uuid: %s], %s", l2Network.getUuid(), l2Network.getName(), hostUuid, rsp.getError()); completion.fail(err); return; diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java index 3bd2f78aa36..135ad3886aa 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java @@ -49,6 +49,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -145,19 +146,19 @@ private void validate(APIChangeResourceOwnerMsg msg) { .param("vmUuid", ref.getResourceUuid()) .list(); if (!nics.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("could not change resource owner, because the resource[uuid:%s, type:VmInstance] has already attached security group", msg.getResourceUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10000, "could not change resource owner, because the resource[uuid:%s, type:VmInstance] has already attached security group", msg.getResourceUuid())); } } } private void validate(APIValidateSecurityGroupRuleMsg msg) { if (!Q.New(SecurityGroupVO.class).eq(SecurityGroupVO_.uuid, msg.getSecurityGroupUuid()).isExists()) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RESOURCE_NOT_EXIST_ERROR, "invalid security group rule, because security group[uuid:%s] not found", msg.getSecurityGroupUuid())); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10001, SecurityGroupErrors.RESOURCE_NOT_EXIST_ERROR, "invalid security group rule, because security group[uuid:%s] not found", msg.getSecurityGroupUuid())); } if (msg.getRemoteSecurityGroupUuid() != null) { if (!Q.New(SecurityGroupVO.class).eq(SecurityGroupVO_.uuid, msg.getRemoteSecurityGroupUuid()).isExists()) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RESOURCE_NOT_EXIST_ERROR, "invalid security group rule, because remote security group[uuid:%s] not found", msg.getRemoteSecurityGroupUuid())); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10002, SecurityGroupErrors.RESOURCE_NOT_EXIST_ERROR, "invalid security group rule, because remote security group[uuid:%s] not found", msg.getRemoteSecurityGroupUuid())); } } @@ -201,48 +202,48 @@ private void validate(APIValidateSecurityGroupRuleMsg msg) { if (SecurityGroupRuleProtocolType.ALL.toString().equals(msg.getProtocol()) || SecurityGroupRuleProtocolType.ICMP.toString().equals(msg.getProtocol())) { if (msg.getStartPort() != -1 || msg.getEndPort() != -1) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid security group rule, because startPort and endPort must be -1 when protocol is ALL or ICMP")); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10003, SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid security group rule, because startPort and endPort must be -1 when protocol is ALL or ICMP")); } } else { if (msg.getStartPort() > msg.getEndPort()) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid security group rule, because invalid endPort[%d], endPort must be greater than or equal to startPort[%d]", msg.getEndPort(), msg.getStartPort())); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10004, SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid security group rule, because invalid endPort[%d], endPort must be greater than or equal to startPort[%d]", msg.getEndPort(), msg.getStartPort())); } if (msg.getStartPort() > 65535) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid security group rule, because startPort[%d] must less than 65535 when protocol is[%s]", msg.getStartPort(), msg.getProtocol())); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10005, SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid security group rule, because startPort[%d] must less than 65535 when protocol is[%s]", msg.getStartPort(), msg.getProtocol())); } } if (msg.getRemoteSecurityGroupUuid() != null) { if (msg.getSrcIpRange() != null || msg.getDstIpRange() != null) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_FILED_CONFLICT_ERROR, "remoteSecurityGroupUuid[%s] and srcIpRange/dstIpRange cannot be set at the same time", msg.getRemoteSecurityGroupUuid())); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10006, SecurityGroupErrors.RULE_FILED_CONFLICT_ERROR, "remoteSecurityGroupUuid[%s] and srcIpRange/dstIpRange cannot be set at the same time", msg.getRemoteSecurityGroupUuid())); } if (!SecurityGroupConstant.WORLD_OPEN_CIDR.equals(msg.getAllowedCidr()) && !SecurityGroupConstant.WORLD_OPEN_CIDR_IPV6.equals(msg.getAllowedCidr())) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_FILED_CONFLICT_ERROR, "remoteSecurityGroupUuid[%s] and allowedCidr[%s] cannot be set at the same time", msg.getRemoteSecurityGroupUuid(), msg.getAllowedCidr())); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10007, SecurityGroupErrors.RULE_FILED_CONFLICT_ERROR, "remoteSecurityGroupUuid[%s] and allowedCidr[%s] cannot be set at the same time", msg.getRemoteSecurityGroupUuid(), msg.getAllowedCidr())); } } if (msg.getSrcIpRange() != null) { if (msg.getDstIpRange() != null) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_FILED_CONFLICT_ERROR, "srcIpRange[%s] and dstIpRange[%s] cannot be set at the same time", msg.getSrcIpRange(), msg.getDstIpRange())); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10008, SecurityGroupErrors.RULE_FILED_CONFLICT_ERROR, "srcIpRange[%s] and dstIpRange[%s] cannot be set at the same time", msg.getSrcIpRange(), msg.getDstIpRange())); } if (SecurityGroupRuleType.Egress.toString().equals(msg.getType())) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_FILED_NOT_SUPPORT_ERROR, "srcIpRange cannot be set in Egress rule")); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10009, SecurityGroupErrors.RULE_FILED_NOT_SUPPORT_ERROR, "srcIpRange cannot be set in Egress rule")); } } if (msg.getDstIpRange() != null) { if (SecurityGroupRuleType.Ingress.toString().equals(msg.getType())) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_FILED_NOT_SUPPORT_ERROR, "dstIpRange cannot be set in Ingress rule")); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10010, SecurityGroupErrors.RULE_FILED_NOT_SUPPORT_ERROR, "dstIpRange cannot be set in Ingress rule")); } } if (msg.getDstPortRange() != null) { if (SecurityGroupRuleProtocolType.ALL.toString().equals(msg.getProtocol()) || SecurityGroupRuleProtocolType.ICMP.toString().equals(msg.getProtocol())) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_FILED_NOT_SUPPORT_ERROR, "dstPortRange cannot be set when rule protocol is ALL or ICMP")); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10011, SecurityGroupErrors.RULE_FILED_NOT_SUPPORT_ERROR, "dstPortRange cannot be set when rule protocol is ALL or ICMP")); } if (msg.getStartPort() != -1 || msg.getEndPort() != -1) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_FILED_CONFLICT_ERROR, "dstPortRange and startPort/endPort cannot be set at the same time")); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10012, SecurityGroupErrors.RULE_FILED_CONFLICT_ERROR, "dstPortRange and startPort/endPort cannot be set at the same time")); } } else if (msg.getStartPort() >= 0) { if (msg.getStartPort().equals(msg.getEndPort())) { @@ -254,7 +255,7 @@ private void validate(APIValidateSecurityGroupRuleMsg msg) { if (!SecurityGroupConstant.WORLD_OPEN_CIDR.equals(msg.getAllowedCidr()) && !SecurityGroupConstant.WORLD_OPEN_CIDR_IPV6.equals(msg.getAllowedCidr())) { if (msg.getSrcIpRange() != null || msg.getDstIpRange() != null) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_FILED_CONFLICT_ERROR, "allowCidr and srcIpRange/dstIpRange cannot be set at the same time")); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10013, SecurityGroupErrors.RULE_FILED_CONFLICT_ERROR, "allowCidr and srcIpRange/dstIpRange cannot be set at the same time")); } if (SecurityGroupRuleType.Ingress.toString().equals(msg.getType())) { @@ -288,7 +289,7 @@ private void validate(APIValidateSecurityGroupRuleMsg msg) { ao.setDstIpRange(vo.getDstIpRange()); ao.setDstPortRange(vo.getDstPortRange()); if (ao.equals(targetRule)) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_DUPLICATE_ERROR, "duplicated to rule[uuid:%s] in datebase", vo.getUuid())); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10014, SecurityGroupErrors.RULE_DUPLICATE_ERROR, "duplicated to rule[uuid:%s] in datebase", vo.getUuid())); } } } @@ -296,13 +297,13 @@ private void validate(APIValidateSecurityGroupRuleMsg msg) { private void validate(APISetVmNicSecurityGroupMsg msg) { VmNicVO nic = Q.New(VmNicVO.class).eq(VmNicVO_.uuid, msg.getVmNicUuid()).find(); if (nic == null) { - throw new ApiMessageInterceptionException(argerr("could no set vm nic security group, because vm nic[uuid:%s] not found", msg.getVmNicUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10015, "could no set vm nic security group, because vm nic[uuid:%s] not found", msg.getVmNicUuid())); } List refs = Q.New(VmNicSecurityGroupRefVO.class).eq(VmNicSecurityGroupRefVO_.vmNicUuid, msg.getVmNicUuid()).list(); if (msg.getRefs().isEmpty() && refs.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("could no set vm nic security group, because the vm nic[uuid:%s] not attached to any security group", msg.getVmNicUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10016, "could no set vm nic security group, because the vm nic[uuid:%s] not attached to any security group", msg.getVmNicUuid())); } Map aoMap = new HashMap(); @@ -311,19 +312,19 @@ private void validate(APISetVmNicSecurityGroupMsg msg) { for (APISetVmNicSecurityGroupMsg.VmNicSecurityGroupRefAO ao : msg.getRefs()) { if (!Q.New(SecurityGroupVO.class).eq(SecurityGroupVO_.uuid, ao.getSecurityGroupUuid()).isExists()) { - throw new ApiMessageInterceptionException(argerr("could no set vm nic security group, because security group[uuid:%s] not found", ao.getSecurityGroupUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10017, "could no set vm nic security group, because security group[uuid:%s] not found", ao.getSecurityGroupUuid())); } Integer priority = ao.getPriority(); if (priority < 1) { - throw new ApiMessageInterceptionException(argerr("could no set vm nic security group, because invalid priority, priority[%d] cannot be less than 1", priority)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10018, "could no set vm nic security group, because invalid priority, priority[%d] cannot be less than 1", priority)); } if (aoMap.containsKey(priority)) { - throw new ApiMessageInterceptionException(argerr("could no set vm nic security group, because duplicate priority, both security group %s and %s have priority[%d]", aoMap.get(priority), ao.getSecurityGroupUuid(), priority)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10019, "could no set vm nic security group, because duplicate priority, both security group %s and %s have priority[%d]", aoMap.get(priority), ao.getSecurityGroupUuid(), priority)); } if (aoMap.containsValue(ao.getSecurityGroupUuid())) { - throw new ApiMessageInterceptionException(argerr("could no set vm nic security group, because duplicate security group[uuid:%s]", ao.getSecurityGroupUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10020, "could no set vm nic security group, because duplicate security group[uuid:%s]", ao.getSecurityGroupUuid())); } aoMap.put(priority, ao.getSecurityGroupUuid()); @@ -333,7 +334,7 @@ private void validate(APISetVmNicSecurityGroupMsg msg) { String sgOwnerAccountUuid = new QuotaUtil().getResourceOwnerAccountUuid(ao.getSecurityGroupUuid()); if (!AccountConstant.isAdminPermission(sgOwnerAccountUuid) && !AccountConstant.isAdminPermission(vmAccountUuid) && !sgOwnerAccountUuid.equals(vmAccountUuid)) { - throw new ApiMessageInterceptionException(argerr("could no set vm nic security group, because security group[uuid:%s] is not owned by account[uuid:%s] or admin", ao.getSecurityGroupUuid(), vmAccountUuid)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10021, "could no set vm nic security group, because security group[uuid:%s] is not owned by account[uuid:%s] or admin", ao.getSecurityGroupUuid(), vmAccountUuid)); } if (AccountConstant.isAdminPermission(sgOwnerAccountUuid)) { adminIntegers.add(priority); @@ -343,11 +344,11 @@ private void validate(APISetVmNicSecurityGroupMsg msg) { Integer[] priorities = aoMap.keySet().toArray(new Integer[aoMap.size()]); Arrays.sort(priorities); if (priorities[0] != 1) { - throw new ApiMessageInterceptionException(argerr("could no set vm nic security group, because invalid priority, priority expects to start at 1, but [%d]", priorities[0])); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10022, "could no set vm nic security group, because invalid priority, priority expects to start at 1, but [%d]", priorities[0])); } for (int i = 0; i < priorities.length - 1; i++) { if (priorities[i] + 1 != priorities[i + 1]) { - throw new ApiMessageInterceptionException(argerr("could no set vm nic security group, because invalid priority, priority[%d] and priority[%d] expected to be consecutive", priorities[i], priorities[i + 1])); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10023, "could no set vm nic security group, because invalid priority, priority[%d] and priority[%d] expected to be consecutive", priorities[i], priorities[i + 1])); } } } @@ -390,11 +391,11 @@ private void validate(APISetVmNicSecurityGroupMsg msg) { Integer[] priorities = adminIntegers.toArray(new Integer[adminIntegers.size()]); Arrays.sort(priorities); if (priorities[0] != 1) { - throw new ApiMessageInterceptionException(argerr("could no set vm nic security group, because admin security group priority[%d] must be higher than users", priorities[0])); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10024, "could no set vm nic security group, because admin security group priority[%d] must be higher than users", priorities[0])); } for (int i = 0; i < priorities.length - 1; i++) { if (priorities[i] + 1 != priorities[i + 1]) { - throw new ApiMessageInterceptionException(argerr("could no set vm nic security group, because admin security group priority[%d] must be higher than users", priorities[i + 1])); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10025, "could no set vm nic security group, because admin security group priority[%d] must be higher than users", priorities[i + 1])); } } } @@ -403,11 +404,11 @@ private void validate(APISetVmNicSecurityGroupMsg msg) { private void validate(APIChangeSecurityGroupRuleStateMsg msg) { if (msg.getRuleUuids().isEmpty()) { - throw new ApiMessageInterceptionException(argerr("could no change security group rule state, because ruleUuids is empty")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10026, "could no change security group rule state, because ruleUuids is empty")); } if (!Q.New(SecurityGroupVO.class).eq(SecurityGroupVO_.uuid, msg.getSecurityGroupUuid()).isExists()) { - throw new ApiMessageInterceptionException(argerr("could no change security group rule state, because security group[uuid:%s] not found", msg.getSecurityGroupUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10027, "could no change security group rule state, because security group[uuid:%s] not found", msg.getSecurityGroupUuid())); } List toChange = new ArrayList<>(); @@ -415,7 +416,7 @@ private void validate(APIChangeSecurityGroupRuleStateMsg msg) { msg.getRuleUuids().stream().forEach(r -> { SecurityGroupRuleVO vo = rvos.stream().filter(rvo -> rvo.getUuid().equals(r)).findAny().get(); if (vo == null) { - throw new ApiMessageInterceptionException(argerr("could no change security group rule state, because security group rule[uuid:%s] not found", r)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10028, "could no change security group rule state, because security group rule[uuid:%s] not found", r)); } if (!vo.getState().toString().equals(msg.getState())) { @@ -424,7 +425,7 @@ private void validate(APIChangeSecurityGroupRuleStateMsg msg) { }); if (toChange.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("could no change security group rule state, because no security group rule state need to change")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10029, "could no change security group rule state, because no security group rule state need to change")); } else { msg.setRuleUuids(toChange); } @@ -432,23 +433,23 @@ private void validate(APIChangeSecurityGroupRuleStateMsg msg) { private void validate(APIChangeVmNicSecurityPolicyMsg msg) { if (msg.getIngressPolicy() == null && msg.getEgressPolicy() == null) { - throw new ApiMessageInterceptionException(argerr("could no change vm nic security policy, because ingress policy and egress policy cannot be both null")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10030, "could no change vm nic security policy, because ingress policy and egress policy cannot be both null")); } if (msg.getIngressPolicy() != null && !VmNicSecurityPolicy.isValid(msg.getIngressPolicy())) { - throw new ApiMessageInterceptionException(argerr("could no change vm nic security policy, because invalid ingress policy[%s]", msg.getIngressPolicy())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10031, "could no change vm nic security policy, because invalid ingress policy[%s]", msg.getIngressPolicy())); } if (msg.getEgressPolicy() != null && !VmNicSecurityPolicy.isValid(msg.getEgressPolicy())) { - throw new ApiMessageInterceptionException(argerr("could no change vm nic security policy, because invalid egress policy[%s]", msg.getEgressPolicy())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10032, "could no change vm nic security policy, because invalid egress policy[%s]", msg.getEgressPolicy())); } if (!Q.New(VmNicVO.class).eq(VmNicVO_.uuid, msg.getVmNicUuid()).isExists()) { - throw new ApiMessageInterceptionException(argerr("could no change vm nic security policy, because vm nic[uuid:%s] not found", msg.getVmNicUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10033, "could no change vm nic security policy, because vm nic[uuid:%s] not found", msg.getVmNicUuid())); } VmNicSecurityPolicyVO policy = Q.New(VmNicSecurityPolicyVO.class).eq(VmNicSecurityPolicyVO_.vmNicUuid, msg.getVmNicUuid()).find(); if (policy == null) { - throw new ApiMessageInterceptionException(argerr("could no change vm nic security policy, because vm nic[uuid:%s] has no security policy", msg.getVmNicUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10034, "could no change vm nic security policy, because vm nic[uuid:%s] has no security policy", msg.getVmNicUuid())); } if (policy.getIngressPolicy().equals(msg.getIngressPolicy())) { @@ -462,16 +463,16 @@ private void validate(APIChangeVmNicSecurityPolicyMsg msg) { private void validate(APIUpdateSecurityGroupRulePriorityMsg msg) { if (!SecurityGroupRuleType.isValid(msg.getType())) { - throw new ApiMessageInterceptionException(argerr("could not update security group rule priority, because invalid type[%s]", msg.getType())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10035, "could not update security group rule priority, because invalid type[%s]", msg.getType())); } SecurityGroupVO sgvo = dbf.findByUuid(msg.getSecurityGroupUuid(), SecurityGroupVO.class); if (sgvo == null) { - throw new ApiMessageInterceptionException(argerr("could not update security group rule priority, because security group[uuid:%s] is not exist", msg.getSecurityGroupUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10036, "could not update security group rule priority, because security group[uuid:%s] is not exist", msg.getSecurityGroupUuid())); } if (msg.getRules().isEmpty()) { - throw new ApiMessageInterceptionException(argerr("could not update security group rule priority, because rules is empty")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10037, "could not update security group rule priority, because rules is empty")); } HashMap priorityMap = new HashMap(); @@ -481,48 +482,48 @@ private void validate(APIUpdateSecurityGroupRulePriorityMsg msg) { .notEq(SecurityGroupRuleVO_.priority, SecurityGroupConstant.DEFAULT_RULE_PRIORITY) .list(); if (rvos.size() != msg.getRules().size()) { - throw new ApiMessageInterceptionException(argerr("could not update security group rule priority, because security group[uuid:%s] rules size not match", msg.getSecurityGroupUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10038, "could not update security group rule priority, because security group[uuid:%s] rules size not match", msg.getSecurityGroupUuid())); } for (APIUpdateSecurityGroupRulePriorityMsg.SecurityGroupRulePriorityAO ao : msg.getRules()) { if (ao.getPriority() == SecurityGroupConstant.DEFAULT_RULE_PRIORITY) { - throw new ApiMessageInterceptionException(argerr("could not update security group rule priority, because rule priority[%d] is invalid", ao.getPriority())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10039, "could not update security group rule priority, because rule priority[%d] is invalid", ao.getPriority())); } if (priorityMap.containsKey(ao.getPriority())) { - throw new ApiMessageInterceptionException(argerr("could not update security group rule priority, because priority[%d] has duplicate", ao.getPriority())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10040, "could not update security group rule priority, because priority[%d] has duplicate", ao.getPriority())); } else { priorityMap.put(ao.getPriority(), ao.getRuleUuid()); } rvos.stream().filter(rvo -> rvo.getUuid().equals(ao.getRuleUuid())).findFirst().orElseThrow(() -> - new ApiMessageInterceptionException(argerr("could not update security group rule priority, because rule[uuid:%s] not in security group[uuid:%s]", ao.getRuleUuid(), msg.getSecurityGroupUuid()))); + new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10041, "could not update security group rule priority, because rule[uuid:%s] not in security group[uuid:%s]", ao.getRuleUuid(), msg.getSecurityGroupUuid()))); rvos.stream().filter(rvo -> rvo.getPriority() == ao.getPriority()).findFirst().orElseThrow(() -> - new ApiMessageInterceptionException(argerr("could not update security group rule priority, because priority[%d] not in security group[uuid:%s]", ao.getPriority(), msg.getSecurityGroupUuid()))); + new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10042, "could not update security group rule priority, because priority[%d] not in security group[uuid:%s]", ao.getPriority(), msg.getSecurityGroupUuid()))); } List uuidList = new ArrayList<>(priorityMap.values()); if ((int)uuidList.stream().distinct().count() != uuidList.size()) { - throw new ApiMessageInterceptionException(argerr("could not update security group rule priority, because rule uuid duplicate")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10043, "could not update security group rule priority, because rule uuid duplicate")); } } private void validate(APIChangeSecurityGroupRuleMsg msg) { SecurityGroupRuleVO vo = Q.New(SecurityGroupRuleVO.class).eq((SecurityGroupRuleVO_.uuid), msg.getUuid()).find(); if (vo == null) { - throw new ApiMessageInterceptionException(argerr("could not change security group rule, because security group rule uuid[%s] is not exist", msg.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10044, "could not change security group rule, because security group rule uuid[%s] is not exist", msg.getUuid())); } if (vo.getPriority() == 0) { if (msg.getProtocol() != null || msg.getAction() != null || msg.getRemoteSecurityGroupUuid() != null || msg.getSrcIpRange() != null || msg.getDstIpRange() != null || msg.getDstPortRange() != null || msg.getPriority() != null) { - throw new ApiMessageInterceptionException(argerr("could not change security group rule, because security group rule[%s] is default rule, only the description and status can be set", msg.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10045, "could not change security group rule, because security group rule[%s] is default rule, only the description and status can be set", msg.getUuid())); } } if (msg.getPriority() != null) { if (msg.getPriority() == SecurityGroupConstant.DEFAULT_RULE_PRIORITY) { - throw new ApiMessageInterceptionException(argerr("could not change security group rule, because security group rule[%s] priority cannot be set to default rule priority[%d]", msg.getUuid(), SecurityGroupConstant.DEFAULT_RULE_PRIORITY)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10046, "could not change security group rule, because security group rule[%s] priority cannot be set to default rule priority[%d]", msg.getUuid(), SecurityGroupConstant.DEFAULT_RULE_PRIORITY)); } Long count = Q.New(SecurityGroupRuleVO.class) @@ -531,10 +532,10 @@ private void validate(APIChangeSecurityGroupRuleMsg msg) { .notEq(SecurityGroupRuleVO_.priority, SecurityGroupConstant.DEFAULT_RULE_PRIORITY) .count(); if (count.intValue() > SecurityGroupGlobalConfig.SECURITY_GROUP_RULES_NUM_LIMIT.value(Integer.class)) { - throw new ApiMessageInterceptionException(argerr("could not change security group rule, because security group %s rules number[%d] is out of max limit[%d]", vo.getType(), count.intValue(), SecurityGroupGlobalConfig.SECURITY_GROUP_RULES_NUM_LIMIT.value(Integer.class))); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10047, "could not change security group rule, because security group %s rules number[%d] is out of max limit[%d]", vo.getType(), count.intValue(), SecurityGroupGlobalConfig.SECURITY_GROUP_RULES_NUM_LIMIT.value(Integer.class))); } if (msg.getPriority() > count.intValue()) { - throw new ApiMessageInterceptionException(argerr("could not change security group rule, because the maximum priority of %s rule is [%d]", vo.getType().toString(), count.intValue())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10048, "could not change security group rule, because the maximum priority of %s rule is [%d]", vo.getType().toString(), count.intValue())); } if (msg.getPriority() < 0) { msg.setPriority(SecurityGroupConstant.LOWEST_RULE_PRIORITY); @@ -543,7 +544,7 @@ private void validate(APIChangeSecurityGroupRuleMsg msg) { if (msg.getState() != null) { if (!SecurityGroupRuleState.isValid(msg.getState())) { - throw new ApiMessageInterceptionException(argerr("could not change security group rule, because invalid state[%s]", msg.getState())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10049, "could not change security group rule, because invalid state[%s]", msg.getState())); } } else { msg.setState(vo.getState().toString()); @@ -551,7 +552,7 @@ private void validate(APIChangeSecurityGroupRuleMsg msg) { if (msg.getAction() != null) { if (!SecurityGroupRuleAction.isValid(msg.getAction())) { - throw new ApiMessageInterceptionException(argerr("could not change security group rule, because invalid action[%s]", msg.getAction())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10050, "could not change security group rule, because invalid action[%s]", msg.getAction())); } } else { msg.setAction(vo.getAction()); @@ -559,7 +560,7 @@ private void validate(APIChangeSecurityGroupRuleMsg msg) { if (msg.getProtocol() != null) { if (!SecurityGroupRuleProtocolType.isValid(msg.getProtocol())) { - throw new ApiMessageInterceptionException(argerr("could not change security group rule, because invalid protocol[%s]", msg.getProtocol())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10051, "could not change security group rule, because invalid protocol[%s]", msg.getProtocol())); } } else { msg.setProtocol(vo.getProtocol().toString()); @@ -575,13 +576,13 @@ private void validate(APIChangeSecurityGroupRuleMsg msg) { if (StringUtils.isNotEmpty(msg.getSrcIpRange())) { if (SecurityGroupRuleType.Egress.equals(vo.getType())) { - throw new ApiMessageInterceptionException(argerr("could not change security group rule, because security group rule[%s] type is Egress, srcIpRange[%s] cannot be set", msg.getUuid(), msg.getSrcIpRange())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10052, "could not change security group rule, because security group rule[%s] type is Egress, srcIpRange[%s] cannot be set", msg.getUuid(), msg.getSrcIpRange())); } if (StringUtils.isNotEmpty(msg.getDstIpRange())) { - throw new ApiMessageInterceptionException(argerr("could not change security group rule, because security group rule[%s] type is Ingress, dstIpRange[%s] cannot be set", msg.getUuid(), msg.getDstIpRange())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10053, "could not change security group rule, because security group rule[%s] type is Ingress, dstIpRange[%s] cannot be set", msg.getUuid(), msg.getDstIpRange())); } if (StringUtils.isNotEmpty(msg.getRemoteSecurityGroupUuid())) { - throw new ApiMessageInterceptionException(argerr("could not change security group rule, because srcIpRange[%s] is set, remoteSecurityGroupUuid[%s] must be empty", msg.getSrcIpRange(), msg.getRemoteSecurityGroupUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10054, "could not change security group rule, because srcIpRange[%s] is set, remoteSecurityGroupUuid[%s] must be empty", msg.getSrcIpRange(), msg.getRemoteSecurityGroupUuid())); } msg.setSrcIpRange(normalizeIpOrPort(msg.getSrcIpRange())); @@ -590,13 +591,13 @@ private void validate(APIChangeSecurityGroupRuleMsg msg) { if (StringUtils.isNotEmpty(msg.getDstIpRange())) { if (SecurityGroupRuleType.Ingress.equals(vo.getType())) { - throw new ApiMessageInterceptionException(argerr("could not change security group rule, because security group rule[%s] type is Ingress, dstIpRange[%s] cannot be set", msg.getUuid(), msg.getDstIpRange())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10055, "could not change security group rule, because security group rule[%s] type is Ingress, dstIpRange[%s] cannot be set", msg.getUuid(), msg.getDstIpRange())); } if (StringUtils.isNotEmpty(msg.getSrcIpRange())) { - throw new ApiMessageInterceptionException(argerr("could not change security group rule, because security group rule[%s] type is Egress, srcIpRange[%s] cannot be set", msg.getUuid(), msg.getSrcIpRange())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10056, "could not change security group rule, because security group rule[%s] type is Egress, srcIpRange[%s] cannot be set", msg.getUuid(), msg.getSrcIpRange())); } if (StringUtils.isNotEmpty(msg.getRemoteSecurityGroupUuid())) { - throw new ApiMessageInterceptionException(argerr("could not change security group rule, because dstIpRange[%s] is set, remoteSecurityGroupUuid[%s] must be empty", msg.getDstIpRange(), msg.getRemoteSecurityGroupUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10057, "could not change security group rule, because dstIpRange[%s] is set, remoteSecurityGroupUuid[%s] must be empty", msg.getDstIpRange(), msg.getRemoteSecurityGroupUuid())); } msg.setDstIpRange(normalizeIpOrPort(msg.getDstIpRange())); @@ -605,10 +606,10 @@ private void validate(APIChangeSecurityGroupRuleMsg msg) { if (StringUtils.isNotEmpty(msg.getRemoteSecurityGroupUuid())) { if (!Q.New(SecurityGroupVO.class).eq(SecurityGroupVO_.uuid, msg.getRemoteSecurityGroupUuid()).isExists()) { - throw new ApiMessageInterceptionException(argerr("could not change security group rule, because remote security group[uuid:%s] not found", msg.getRemoteSecurityGroupUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10058, "could not change security group rule, because remote security group[uuid:%s] not found", msg.getRemoteSecurityGroupUuid())); } if (StringUtils.isNotEmpty(msg.getSrcIpRange()) || StringUtils.isNotEmpty(msg.getDstIpRange())) { - throw new ApiMessageInterceptionException(argerr("could not change security group rule, because remote security group[uuid:%s] is set, srcIpRange and dstIpRange must be empty", msg.getRemoteSecurityGroupUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10059, "could not change security group rule, because remote security group[uuid:%s] is set, srcIpRange and dstIpRange must be empty", msg.getRemoteSecurityGroupUuid())); } } @@ -648,13 +649,13 @@ private void validate(APIChangeSecurityGroupRuleMsg msg) { if (StringUtils.isNotEmpty(msg.getDstPortRange())) { if (SecurityGroupRuleProtocolType.ICMP.toString().equals(msg.getProtocol()) || SecurityGroupRuleProtocolType.ALL.toString().equals(msg.getProtocol())) { - throw new ApiMessageInterceptionException(argerr("could not change security group rule, because rule protocol is [%s], dstPortRange cannot be set", msg.getProtocol())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10060, "could not change security group rule, because rule protocol is [%s], dstPortRange cannot be set", msg.getProtocol())); } msg.setDstPortRange(normalizeIpOrPort(msg.getDstPortRange())); validatePorts(msg.getDstPortRange()); } else if (msg.getDstPortRange() != null) { if (SecurityGroupRuleProtocolType.TCP.toString().equals(msg.getProtocol()) || SecurityGroupRuleProtocolType.UDP.toString().equals(msg.getProtocol())) { - throw new ApiMessageInterceptionException(argerr("could not change security group rule, because rule protocol is [%s], dstPortRange cannot be empty", msg.getProtocol())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10061, "could not change security group rule, because rule protocol is [%s], dstPortRange cannot be empty", msg.getProtocol())); } msg.setDstPortRange(null); } else { @@ -662,7 +663,7 @@ private void validate(APIChangeSecurityGroupRuleMsg msg) { msg.setDstPortRange(null); } else { if (vo.getDstPortRange() == null) { - throw new ApiMessageInterceptionException(argerr("could not change security group rule, because rule protocol is [%s], dstPortRange must be set", msg.getProtocol())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10062, "could not change security group rule, because rule protocol is [%s], dstPortRange must be set", msg.getProtocol())); } msg.setDstPortRange(vo.getDstPortRange()); } @@ -693,27 +694,27 @@ private void validate(APIChangeSecurityGroupRuleMsg msg) { ao.setDstIpRange(o.getDstIpRange()); ao.setDstPortRange(o.getDstPortRange()); if (sao.equals(ao)) { - throw new ApiMessageInterceptionException(argerr("could not change security group rule, because rule[%s] is duplicated to rule[uuid:%s] in datebase", JSONObjectUtil.toJsonString(sao), o.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10063, "could not change security group rule, because rule[%s] is duplicated to rule[uuid:%s] in datebase", JSONObjectUtil.toJsonString(sao), o.getUuid())); } } } private void validatePorts(String ports) { if (ports.isEmpty() || ports.startsWith(SecurityGroupConstant.IP_SPLIT) || ports.endsWith(SecurityGroupConstant.IP_SPLIT)) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid ports[%s]", ports)); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10064, SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid ports[%s]", ports)); } String portArray[]; if (ports.contains(SecurityGroupConstant.IP_SPLIT)) { // The port range in iptables, such as 10-20, will occupy the number of two multiports String[] tmpPorts = ports.split(String.format("%s|%s", SecurityGroupConstant.IP_SPLIT, SecurityGroupConstant.RANGE_SPLIT)); if (tmpPorts.length > SecurityGroupGlobalProperty.PORT_GROUP_NUMBER_LIMIT) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid ports[%s], port range[%s] number[%d] is out of max limit[%d]", ports, Arrays.toString(tmpPorts), tmpPorts.length, SecurityGroupGlobalProperty.PORT_GROUP_NUMBER_LIMIT)); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10065, SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid ports[%s], port range[%s] number[%d] is out of max limit[%d]", ports, Arrays.toString(tmpPorts), tmpPorts.length, SecurityGroupGlobalProperty.PORT_GROUP_NUMBER_LIMIT)); } portArray = ports.split(SecurityGroupConstant.IP_SPLIT); Stream stream = Stream.of(portArray).distinct(); if (portArray.length != stream.count()) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid ports[%s], port duplicate", ports)); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10066, SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid ports[%s], port duplicate", ports)); } } else { portArray = new String[]{ports}; @@ -721,12 +722,12 @@ private void validatePorts(String ports) { for (String port : portArray) { if (port.isEmpty()) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid ports[%s]", ports)); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10067, SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid ports[%s]", ports)); } if (port.contains(SecurityGroupConstant.RANGE_SPLIT)) { String portRange[] = port.split(SecurityGroupConstant.RANGE_SPLIT); if (portRange.length != 2) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid port range[%s]", port)); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10068, SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid port range[%s]", port)); } try { @@ -734,20 +735,20 @@ private void validatePorts(String ports) { Integer endPort = Integer.valueOf(portRange[1]); if (startPort >= endPort || startPort < SecurityGroupConstant.PORT_NUMBER_MIN || endPort > SecurityGroupConstant.PORT_NUMBER_MAX) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid port range[%s]", port)); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10069, SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid port range[%s]", port)); } } catch (NumberFormatException e) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid port range[%s]", port)); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10070, SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid port range[%s]", port)); } } else { try { Integer.valueOf(port); if (Integer.valueOf(port) < SecurityGroupConstant.PORT_NUMBER_MIN || Integer.valueOf(port) > SecurityGroupConstant.PORT_NUMBER_MAX) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid port[%s]", port)); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10071, SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid port[%s]", port)); } } catch (NumberFormatException e) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid port[%s]", port)); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10072, SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid port[%s]", port)); } } } @@ -755,22 +756,22 @@ private void validatePorts(String ports) { private void validateIps(String ips, Integer ipVersion) { if (ips.isEmpty() || ips.startsWith(SecurityGroupConstant.IP_SPLIT) || ips.endsWith(SecurityGroupConstant.IP_SPLIT)) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ips[%s]", ips)); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10073, SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ips[%s]", ips)); } String ipArray[]; if (ips.contains(SecurityGroupConstant.IP_SPLIT)) { ipArray = ips.split(SecurityGroupConstant.IP_SPLIT); if (ipArray.length > SecurityGroupGlobalProperty.IP_GROUP_NUMBER_LIMIT) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ips[%s], ip number[%d] is out of max limit[%d]", ips, ipArray.length, SecurityGroupGlobalProperty.IP_GROUP_NUMBER_LIMIT)); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10074, SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ips[%s], ip number[%d] is out of max limit[%d]", ips, ipArray.length, SecurityGroupGlobalProperty.IP_GROUP_NUMBER_LIMIT)); } Stream stream = Stream.of(ipArray).distinct(); if (ipArray.length != stream.count()) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ips[%s], ip duplicate", ips)); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10075, SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ips[%s], ip duplicate", ips)); } if (ipVersion == IPv6Constants.IPv6) { List ipv6List = Stream.of(ipArray).filter(ip -> ip.contains(SecurityGroupConstant.RANGE_SPLIT)).collect(Collectors.toList()); if (!ipv6List.isEmpty()) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ips[%s], ip range cannot be used when specifying multiple ipv6 addresses", ips)); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10076, SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ips[%s], ip range cannot be used when specifying multiple ipv6 addresses", ips)); } } } else { @@ -779,23 +780,23 @@ private void validateIps(String ips, Integer ipVersion) { for (String ip : ipArray) { if (ip.isEmpty()) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ips[%s]", ips)); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10077, SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ips[%s]", ips)); } if (ip.contains(SecurityGroupConstant.CIDR_SPLIT)) { if (!NetworkUtils.isCidr(ip, ipVersion)) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid cidr[%s], ipVersion[%d]", ip, ipVersion)); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10078, SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid cidr[%s], ipVersion[%d]", ip, ipVersion)); } if (ipVersion == IPv6Constants.IPv4 && NetworkUtils.isFullCidr(ip)) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "ipv4 cidr can not be 0.0.0.0/0")); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10079, SecurityGroupErrors.RULE_IP_FIELD_ERROR, "ipv4 cidr can not be 0.0.0.0/0")); } if (ipVersion == IPv6Constants.IPv6 && IPv6NetworkUtils.isFullCidr(ip)) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "ipv6 cidr can not be ::/0")); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10080, SecurityGroupErrors.RULE_IP_FIELD_ERROR, "ipv6 cidr can not be ::/0")); } continue; } if (ip.contains(SecurityGroupConstant.RANGE_SPLIT)) { String[] ipRangeArray = ip.split(SecurityGroupConstant.RANGE_SPLIT); if (ipRangeArray.length != 2) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ip range[%s]", ip)); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10081, SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ip range[%s]", ip)); } String startIp = ipRangeArray[0]; String endIp = ipRangeArray[1]; @@ -803,18 +804,18 @@ private void validateIps(String ips, Integer ipVersion) { NetworkUtils.validateIpRange(startIp, endIp); } else { if (!IPv6NetworkUtils.isIpv6Address(startIp) || !IPv6NetworkUtils.isIpv6Address(endIp) || startIp.compareTo(endIp) > 0) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ip range[%s]", ip)); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10082, SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ip range[%s]", ip)); } } continue; } if (ipVersion == IPv6Constants.IPv4) { if (!NetworkUtils.isIpv4Address(ip)) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ip[%s], ipVersion[%d]", ip, ipVersion)); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10083, SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ip[%s], ipVersion[%d]", ip, ipVersion)); } } else { if (!IPv6NetworkUtils.isValidIpv6(ip)) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ip[%s], ipVersion[%d]", ip, ipVersion)); + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10084, SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ip[%s], ipVersion[%d]", ip, ipVersion)); } } } @@ -825,7 +826,7 @@ private void validate(APIDetachSecurityGroupFromL3NetworkMsg msg) { q.add(SecurityGroupL3NetworkRefVO_.l3NetworkUuid, Op.EQ, msg.getL3NetworkUuid()); q.add(SecurityGroupL3NetworkRefVO_.securityGroupUuid, Op.EQ, msg.getSecurityGroupUuid()); if (!q.isExists()) { - throw new ApiMessageInterceptionException(operr("security group[uuid:%s] has not attached to l3Network[uuid:%s], can't detach", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10085, "security group[uuid:%s] has not attached to l3Network[uuid:%s], can't detach", msg.getSecurityGroupUuid(), msg.getL3NetworkUuid())); } } @@ -861,10 +862,10 @@ private void validate(APIDeleteSecurityGroupRuleMsg msg) { String sguuid = vos.get(0).getSecurityGroupUuid(); vos.stream().forEach(vo -> { if (!sguuid.equals(vo.getSecurityGroupUuid())) { - throw new ApiMessageInterceptionException(argerr("can't delete rules of different security group")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10086, "can't delete rules of different security group")); } if (vo.getPriority() == SecurityGroupConstant.DEFAULT_RULE_PRIORITY) { - throw new ApiMessageInterceptionException(argerr("can't delete default rule[uuid:%s]", vo.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10087, "can't delete default rule[uuid:%s]", vo.getUuid())); } }); @@ -884,7 +885,7 @@ private void validate(APIAttachSecurityGroupToL3NetworkMsg msg) { q.add(SecurityGroupL3NetworkRefVO_.l3NetworkUuid, Op.EQ, msg.getL3NetworkUuid()); q.add(SecurityGroupL3NetworkRefVO_.securityGroupUuid, Op.EQ, msg.getSecurityGroupUuid()); if (q.isExists()) { - throw new ApiMessageInterceptionException(operr("security group[uuid:%s] has attached to l3Network[uuid:%s], can't attach again", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10088, "security group[uuid:%s] has attached to l3Network[uuid:%s], can't attach again", msg.getSecurityGroupUuid(), msg.getL3NetworkUuid())); } @@ -892,7 +893,7 @@ private void validate(APIAttachSecurityGroupToL3NetworkMsg msg) { nq.add(NetworkServiceL3NetworkRefVO_.l3NetworkUuid, Op.EQ, msg.getL3NetworkUuid()); nq.add(NetworkServiceL3NetworkRefVO_.networkServiceType, Op.EQ, SecurityGroupConstant.SECURITY_GROUP_NETWORK_SERVICE_TYPE); if (!nq.isExists()) { - throw new ApiMessageInterceptionException(argerr("the L3 network[uuid:%s] doesn't have the network service type[%s] enabled", msg.getL3NetworkUuid(), SecurityGroupConstant.SECURITY_GROUP_NETWORK_SERVICE_TYPE)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10089, "the L3 network[uuid:%s] doesn't have the network service type[%s] enabled", msg.getL3NetworkUuid(), SecurityGroupConstant.SECURITY_GROUP_NETWORK_SERVICE_TYPE)); } } @@ -903,7 +904,7 @@ private void validate(APIAddVmNicToSecurityGroupMsg msg) { List uuids = q.listValue(); if (!uuids.containsAll(msg.getVmNicUuids())) { msg.getVmNicUuids().removeAll(uuids); - throw new ApiMessageInterceptionException(err(SysErrors.RESOURCE_NOT_FOUND, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10090, SysErrors.RESOURCE_NOT_FOUND, "cannot find vm nics[uuids:%s]", msg.getVmNicUuids() )); } @@ -912,7 +913,7 @@ private void validate(APIAddVmNicToSecurityGroupMsg msg) { if (!refs.isEmpty()) { refs.stream().forEach(ref -> { if (uuids.contains(ref.getVmNicUuid())) { - throw new ApiMessageInterceptionException(argerr("vm nic[uuid:%s] has been attach to security group[uuid:%s]", ref.getVmNicUuid(), msg.getSecurityGroupUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10091, "vm nic[uuid:%s] has been attach to security group[uuid:%s]", ref.getVmNicUuid(), msg.getSecurityGroupUuid())); } }); } @@ -932,7 +933,7 @@ private void checkIfL3NetworkSupportSecurityGroup(List vmNicUuids) { for(VmNicVO nic : nics) { if (!Q.New(NetworkServiceL3NetworkRefVO.class).eq(NetworkServiceL3NetworkRefVO_.l3NetworkUuid, nic.getL3NetworkUuid()) .eq(NetworkServiceL3NetworkRefVO_.networkServiceType, SecurityGroupConstant.SECURITY_GROUP_NETWORK_SERVICE_TYPE).isExists()) { - throw new ApiMessageInterceptionException(argerr("the netwotk service[type:%s] not enabled on the l3Network[uuid:%s] of nic[uuid:%s]", SecurityGroupConstant.SECURITY_GROUP_NETWORK_SERVICE_TYPE, nic.getL3NetworkUuid(), nic.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10092, "the netwotk service[type:%s] not enabled on the l3Network[uuid:%s] of nic[uuid:%s]", SecurityGroupConstant.SECURITY_GROUP_NETWORK_SERVICE_TYPE, nic.getL3NetworkUuid(), nic.getUuid())); } } } @@ -954,7 +955,7 @@ private void checkIfVmNicFromAttachedL3Networks(String securityGroupUuid, List rules = msg.getRules(); if (!Q.New(SecurityGroupVO.class).eq(SecurityGroupVO_.uuid, sgUuid).isExists()) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because security group[uuid:%s] does not exist", sgUuid)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10094, "could not add security group rule, because security group[uuid:%s] does not exist", sgUuid)); } if (rules.isEmpty() || rules.size() > SecurityGroupConstant.ONE_API_RULES_MAX_NUM) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because the rules cannot be empty or exceed the max number %d", SecurityGroupConstant.ONE_API_RULES_MAX_NUM)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10095, "could not add security group rule, because the rules cannot be empty or exceed the max number %d", SecurityGroupConstant.ONE_API_RULES_MAX_NUM)); } if (msg.getRemoteSecurityGroupUuids() != null && !msg.getRemoteSecurityGroupUuids().isEmpty()) { if (msg.getRemoteSecurityGroupUuids().stream().distinct().count() != msg.getRemoteSecurityGroupUuids().size()) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because duplicate uuid in remoteSecurityGroupUuids: %s", msg.getRemoteSecurityGroupUuids())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10096, "could not add security group rule, because duplicate uuid in remoteSecurityGroupUuids: %s", msg.getRemoteSecurityGroupUuids())); } List sgUuids = Q.New(SecurityGroupVO.class).select(SecurityGroupVO_.uuid).in(SecurityGroupVO_.uuid, msg.getRemoteSecurityGroupUuids()).listValues(); msg.getRemoteSecurityGroupUuids().stream().forEach(uuid -> { sgUuids.stream().filter(s -> s.equals(uuid)).findFirst().orElseThrow(() -> - new ApiMessageInterceptionException(argerr("could not add security group rule, because security group[uuid:%s] does not exist", uuid))); + new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10097, "could not add security group rule, because security group[uuid:%s] does not exist", uuid))); }); rules.stream().forEach(r -> { if (r.getRemoteSecurityGroupUuid() != null) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because the remote security group uuid is conflict")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10098, "could not add security group rule, because the remote security group uuid is conflict")); } }); @@ -1032,7 +1033,7 @@ private void validate(APIAddSecurityGroupRuleMsg msg) { } if (msg.getPriority() == SecurityGroupConstant.DEFAULT_RULE_PRIORITY) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because rule priority must greater than %d or equals %d", SecurityGroupConstant.DEFAULT_RULE_PRIORITY, SecurityGroupConstant.LOWEST_RULE_PRIORITY)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10099, "could not add security group rule, because rule priority must greater than %d or equals %d", SecurityGroupConstant.DEFAULT_RULE_PRIORITY, SecurityGroupConstant.LOWEST_RULE_PRIORITY)); } List newRules = msg.getRules(); @@ -1040,14 +1041,14 @@ private void validate(APIAddSecurityGroupRuleMsg msg) { // Basic check for (APIAddSecurityGroupRuleMsg.SecurityGroupRuleAO ao : newRules) { if (!SecurityGroupRuleProtocolType.isValid(ao.getProtocol())) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because invalid rule protocol[%s], valid protocols are %s", ao.getProtocol(), SecurityGroupRuleProtocolType.getAllProtocol())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10100, "could not add security group rule, because invalid rule protocol[%s], valid protocols are %s", ao.getProtocol(), SecurityGroupRuleProtocolType.getAllProtocol())); } if (ao.getAction() == null) { ao.setAction(SecurityGroupRuleAction.ACCEPT.toString()); } else { if (!SecurityGroupRuleAction.isValid(ao.getAction())) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because invalid rule action[%s], valid actions are %s", ao.getAction(), SecurityGroupRuleAction.getAllAction())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10101, "could not add security group rule, because invalid rule action[%s], valid actions are %s", ao.getAction(), SecurityGroupRuleAction.getAllAction())); } } @@ -1055,7 +1056,7 @@ private void validate(APIAddSecurityGroupRuleMsg msg) { ao.setIpVersion(IPv6Constants.IPv4); } else { if (ao.getIpVersion() != IPv6Constants.IPv4 && ao.getIpVersion() != IPv6Constants.IPv6) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because invalid rule ipVersion[%d], valid ipVersions are %d/%d", ao.getIpVersion(), IPv6Constants.IPv4, IPv6Constants.IPv6)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10102, "could not add security group rule, because invalid rule ipVersion[%d], valid ipVersions are %d/%d", ao.getIpVersion(), IPv6Constants.IPv4, IPv6Constants.IPv6)); } } @@ -1065,38 +1066,38 @@ private void validate(APIAddSecurityGroupRuleMsg msg) { if (SecurityGroupRuleType.Egress.toString().equals(ao.getType())) { if (ao.getSrcIpRange() != null) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because the srcIpRange[%s] is not allowed to set for egress rule", ao.getSrcIpRange())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10103, "could not add security group rule, because the srcIpRange[%s] is not allowed to set for egress rule", ao.getSrcIpRange())); } if (checkAllowedCidrValid(ao.getAllowedCidr())) { if (ao.getDstIpRange() != null) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because the allowedCidr[%s] and dstIpRange[%s] are in conflict", ao.getAllowedCidr(), ao.getDstIpRange())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10104, "could not add security group rule, because the allowedCidr[%s] and dstIpRange[%s] are in conflict", ao.getAllowedCidr(), ao.getDstIpRange())); } ao.setDstIpRange(ao.getAllowedCidr()); } if (ao.getDstIpRange() != null) { if (ao.getRemoteSecurityGroupUuid() != null) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because the ip range[%s] and remoteSecurityGroupUuid[%s] are in conflict", ao.getDstIpRange(), ao.getRemoteSecurityGroupUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10105, "could not add security group rule, because the ip range[%s] and remoteSecurityGroupUuid[%s] are in conflict", ao.getDstIpRange(), ao.getRemoteSecurityGroupUuid())); } ao.setDstIpRange(normalizeIpOrPort(ao.getDstIpRange())); validateIps(ao.getDstIpRange(), ao.getIpVersion()); } } else { if (ao.getDstIpRange() != null) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because the dstIpRange[%s] is not allowed to set for ingress rule", ao.getDstIpRange())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10106, "could not add security group rule, because the dstIpRange[%s] is not allowed to set for ingress rule", ao.getDstIpRange())); } if (checkAllowedCidrValid(ao.getAllowedCidr())) { if (ao.getSrcIpRange() != null) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because the allowedCidr[%s] and srcIpRange[%s] are in conflict", ao.getAllowedCidr(), ao.getSrcIpRange())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10107, "could not add security group rule, because the allowedCidr[%s] and srcIpRange[%s] are in conflict", ao.getAllowedCidr(), ao.getSrcIpRange())); } ao.setSrcIpRange(ao.getAllowedCidr()); } if (ao.getSrcIpRange() != null) { if (ao.getRemoteSecurityGroupUuid() != null) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because the ip range[%s] and remoteSecurityGroupUuid[%s] are in conflict", ao.getSrcIpRange(), ao.getRemoteSecurityGroupUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10108, "could not add security group rule, because the ip range[%s] and remoteSecurityGroupUuid[%s] are in conflict", ao.getSrcIpRange(), ao.getRemoteSecurityGroupUuid())); } ao.setSrcIpRange(normalizeIpOrPort(ao.getSrcIpRange())); validateIps(ao.getSrcIpRange(), ao.getIpVersion()); @@ -1113,18 +1114,18 @@ private void validate(APIAddSecurityGroupRuleMsg msg) { if (SecurityGroupRuleProtocolType.ALL.toString().equals(ao.getProtocol()) || SecurityGroupRuleProtocolType.ICMP.toString().equals(ao.getProtocol())) { if (ao.getDstPortRange() != null) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because the protocol type ALL or ICMP cant not set dstPortRange[%s]", ao.getDstPortRange())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10109, "could not add security group rule, because the protocol type ALL or ICMP cant not set dstPortRange[%s]", ao.getDstPortRange())); } if (ao.getStartPort() != -1 || ao.getEndPort() != -1) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because the protocol type ALL or ICMP cant not set startPort or endPort")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10110, "could not add security group rule, because the protocol type ALL or ICMP cant not set startPort or endPort")); } } else { if (ao.getStartPort() >= SecurityGroupConstant.PORT_NUMBER_MIN && ao.getEndPort() <= SecurityGroupConstant.PORT_NUMBER_MAX) { if (ao.getStartPort() > ao.getEndPort()) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because invalid rule endPort[%d], endPort must be greater than or equal to startPort[%d]", ao.getEndPort(), ao.getStartPort())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10111, "could not add security group rule, because invalid rule endPort[%d], endPort must be greater than or equal to startPort[%d]", ao.getEndPort(), ao.getStartPort())); } if (ao.getDstPortRange() != null) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because dstPortRange[%s] and starPort[%s] are in conflict", ao.getDstPortRange(), ao.getStartPort())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10112, "could not add security group rule, because dstPortRange[%s] and starPort[%s] are in conflict", ao.getDstPortRange(), ao.getStartPort())); } @@ -1136,7 +1137,7 @@ private void validate(APIAddSecurityGroupRuleMsg msg) { } if (ao.getDstPortRange() == null) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because the protocol type TCP/UDP must set dstPortRange")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10113, "could not add security group rule, because the protocol type TCP/UDP must set dstPortRange")); } ao.setDstPortRange(normalizeIpOrPort(ao.getDstPortRange())); validatePorts(ao.getDstPortRange()); @@ -1147,7 +1148,7 @@ private void validate(APIAddSecurityGroupRuleMsg msg) { for (int i = 0; i < newRules.size() - 1; i++) { for (int j = newRules.size() - 1; j > i; j--) { if (newRules.get(i).equals(newRules.get(j))) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because rule[%s] and rule[%s] are dupilicated", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10114, "could not add security group rule, because rule[%s] and rule[%s] are dupilicated", JSONObjectUtil.toJsonString(newRules.get(i)), JSONObjectUtil.toJsonString(newRules.get(j)))); } } @@ -1171,7 +1172,7 @@ private void validate(APIAddSecurityGroupRuleMsg msg) { ao.setDstPortRange(vo.getDstPortRange()); for (APIAddSecurityGroupRuleMsg.SecurityGroupRuleAO sao : newRules) { if (ao.equals(sao)) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because rule[%s] is duplicated to rule[uuid:%s] in datebase", JSONObjectUtil.toJsonString(sao), vo.getUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10115, "could not add security group rule, because rule[%s] is duplicated to rule[uuid:%s] in datebase", JSONObjectUtil.toJsonString(sao), vo.getUuid())); } } } @@ -1182,26 +1183,26 @@ private void validate(APIAddSecurityGroupRuleMsg msg) { int toCreateEgressRuleCount = newRules.stream().filter(ao -> SecurityGroupRuleType.Egress.toString().equals(ao.getType())).collect(Collectors.toList()).size(); if (ingressRuleCount >= SecurityGroupGlobalConfig.SECURITY_GROUP_RULES_NUM_LIMIT.value(Integer.class) && toCreateIngressRuleCount > 0) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because security group %s rules has reached the maximum limit[%d]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10116, "could not add security group rule, because security group %s rules has reached the maximum limit[%d]", SecurityGroupRuleType.Ingress, SecurityGroupGlobalConfig.SECURITY_GROUP_RULES_NUM_LIMIT.value(Integer.class))); } if (egressRuleCount >= SecurityGroupGlobalConfig.SECURITY_GROUP_RULES_NUM_LIMIT.value(Integer.class) && toCreateEgressRuleCount > 0) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because security group %s rules has reached the maximum limit[%d]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10117, "could not add security group rule, because security group %s rules has reached the maximum limit[%d]", SecurityGroupRuleType.Egress, SecurityGroupGlobalConfig.SECURITY_GROUP_RULES_NUM_LIMIT.value(Integer.class))); } if ((ingressRuleCount + toCreateIngressRuleCount) > SecurityGroupGlobalConfig.SECURITY_GROUP_RULES_NUM_LIMIT.value(Integer.class)) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because security group %s rules number[%d] is out of max limit[%d]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10118, "could not add security group rule, because security group %s rules number[%d] is out of max limit[%d]", SecurityGroupRuleType.Ingress, (ingressRuleCount + toCreateIngressRuleCount), SecurityGroupGlobalConfig.SECURITY_GROUP_RULES_NUM_LIMIT.value(Integer.class))); } if ((egressRuleCount + toCreateEgressRuleCount) > SecurityGroupGlobalConfig.SECURITY_GROUP_RULES_NUM_LIMIT.value(Integer.class)) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because security group %s rules number[%d] is out of max limit[%d]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10119, "could not add security group rule, because security group %s rules number[%d] is out of max limit[%d]", SecurityGroupRuleType.Egress, (egressRuleCount + toCreateEgressRuleCount), SecurityGroupGlobalConfig.SECURITY_GROUP_RULES_NUM_LIMIT.value(Integer.class))); } if (msg.getPriority() > (ingressRuleCount + 1) && toCreateIngressRuleCount > 0) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because priority[%d] must be consecutive, the ingress rule maximum priority is [%d]", msg.getPriority(), ingressRuleCount)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10120, "could not add security group rule, because priority[%d] must be consecutive, the ingress rule maximum priority is [%d]", msg.getPriority(), ingressRuleCount)); } if (msg.getPriority() > (egressRuleCount + 1) && toCreateEgressRuleCount > 0) { - throw new ApiMessageInterceptionException(argerr("could not add security group rule, because priority[%d] must be consecutive, the egress rule maximum priority is [%d]", msg.getPriority(), egressRuleCount)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10121, "could not add security group rule, because priority[%d] must be consecutive, the egress rule maximum priority is [%d]", msg.getPriority(), egressRuleCount)); } } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java index 7883007254c..8e660f52d1c 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java @@ -96,6 +96,7 @@ import static org.zstack.network.securitygroup.SecurityGroupConstant.Param.*; import static org.zstack.network.securitygroup.SecurityGroupMembersTO.ACTION_CODE_DELETE_GROUP; import static org.zstack.utils.CollectionDSL.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class SecurityGroupManagerImpl extends AbstractService implements SecurityGroupManager, ManagementNodeReadyExtensionPoint, VmInstanceMigrateExtensionPoint, AddExpandedQueryExtensionPoint, ReportQuotaExtensionPoint, ValidateL3SecurityGroupExtensionPoint, @@ -161,7 +162,7 @@ public void managementNodeReady() { public void validateSystemtagL3SecurityGroup(String l3Uuid, List securityGroupUuids) { if (!Q.New(NetworkServiceL3NetworkRefVO.class).eq(NetworkServiceL3NetworkRefVO_.l3NetworkUuid, l3Uuid) .eq(NetworkServiceL3NetworkRefVO_.networkServiceType, SecurityGroupConstant.SECURITY_GROUP_NETWORK_SERVICE_TYPE).isExists()) { - throw new ApiMessageInterceptionException(argerr("the netwotk service[type:%s] not enabled on the l3Network[uuid:%s]", SecurityGroupConstant.SECURITY_GROUP_NETWORK_SERVICE_TYPE, l3Uuid)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10124, "the netwotk service[type:%s] not enabled on the l3Network[uuid:%s]", SecurityGroupConstant.SECURITY_GROUP_NETWORK_SERVICE_TYPE, l3Uuid)); } } @@ -1549,7 +1550,7 @@ public void run(FlowTrigger trigger, Map data) { for (SecurityGroupRulePriorityAO ao : msg.getRules()) { SecurityGroupRuleVO vo = rvos.stream().filter(r -> r.getUuid().equals(ao.getRuleUuid())).findFirst().orElse(null); if (vo == null) { - throw new OperationFailureException(operr("failed to chenge rule[uuid:%s] priority, beacuse it's not found", ao.getRuleUuid())); + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10125, "failed to chenge rule[uuid:%s] priority, beacuse it's not found", ao.getRuleUuid())); } if (ao.getPriority() != vo.getPriority()) { vo.setPriority(ao.getPriority()); @@ -2733,7 +2734,7 @@ private void validate(AddVmNicToSecurityGroupMsg msg) { .listValues(); if (!new HashSet<>(uuids).containsAll(msg.getVmNicUuids())) { msg.getVmNicUuids().removeAll(uuids); - throw new OperationFailureException(err(SysErrors.RESOURCE_NOT_FOUND, + throw new OperationFailureException(err(ORG_ZSTACK_NETWORK_SECURITYGROUP_10126, SysErrors.RESOURCE_NOT_FOUND, "cannot find vm nics[uuids:%s]", msg.getVmNicUuids() )); } @@ -2742,7 +2743,7 @@ private void validate(AddVmNicToSecurityGroupMsg msg) { if (!refs.isEmpty()) { refs.stream().forEach(ref -> { if (uuids.contains(ref.getVmNicUuid())) { - throw new OperationFailureException(argerr("vm nic[uuid:%s] has been attach to security group[uuid:%s]", ref.getVmNicUuid(), msg.getSecurityGroupUuid())); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10127, "vm nic[uuid:%s] has been attach to security group[uuid:%s]", ref.getVmNicUuid(), msg.getSecurityGroupUuid())); } }); } @@ -2752,12 +2753,12 @@ private void validate(AddVmNicToSecurityGroupMsg msg) { for(VmNicVO nic : nics) { if (!Q.New(NetworkServiceL3NetworkRefVO.class).eq(NetworkServiceL3NetworkRefVO_.l3NetworkUuid, nic.getL3NetworkUuid()) .eq(NetworkServiceL3NetworkRefVO_.networkServiceType, SecurityGroupConstant.SECURITY_GROUP_NETWORK_SERVICE_TYPE).isExists()) { - throw new OperationFailureException(argerr("the netwotk service[type:%s] not enabled on the l3Network[uuid:%s] of nic[uuid:%s]", SecurityGroupConstant.SECURITY_GROUP_NETWORK_SERVICE_TYPE, nic.getL3NetworkUuid(), nic.getUuid())); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10128, "the netwotk service[type:%s] not enabled on the l3Network[uuid:%s] of nic[uuid:%s]", SecurityGroupConstant.SECURITY_GROUP_NETWORK_SERVICE_TYPE, nic.getL3NetworkUuid(), nic.getUuid())); } String vmAccountUuid = new QuotaUtil().getResourceOwnerAccountUuid(nic.getVmInstanceUuid()); if (!AccountConstant.isAdminPermission(sgOwnerAccountUuid) && !AccountConstant.isAdminPermission(vmAccountUuid) && !sgOwnerAccountUuid.equals(vmAccountUuid)) { - throw new OperationFailureException(argerr("security group[uuid:%s] is not owned by account[uuid:%s] or admin", msg.getSecurityGroupUuid(), vmAccountUuid)); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10129, "security group[uuid:%s] is not owned by account[uuid:%s] or admin", msg.getSecurityGroupUuid(), vmAccountUuid)); } } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupNetworkServiceExtension.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupNetworkServiceExtension.java index e8ab05e84c3..eb0f79132bf 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupNetworkServiceExtension.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupNetworkServiceExtension.java @@ -31,6 +31,7 @@ import java.util.stream.Collectors; import javax.persistence.Query; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -194,7 +195,7 @@ public void run(MessageReply reply) { if (reply.isSuccess()) { trigger.next(); } else { - trigger.fail(operr("Failed to apply security group rules to current VM[uuid:%s]", + trigger.fail(operr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10122, "Failed to apply security group rules to current VM[uuid:%s]", servedVm.getVmInventory().getUuid()) .causedBy(reply.getError())); } @@ -252,7 +253,7 @@ public void done(ErrorCodeList errorCodeList) { if (errs.isEmpty()) { trigger.next(); } else { - trigger.fail(operr("Failed to apply security group rules to some VMs")); + trigger.fail(operr(ORG_ZSTACK_NETWORK_SECURITYGROUP_10123, "Failed to apply security group rules to some VMs")); } } }); diff --git a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorage.java b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorage.java index e6cc338873a..f4aa59c4e41 100755 --- a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorage.java +++ b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorage.java @@ -43,6 +43,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.core.Platform.operr; import static org.zstack.header.storage.backup.BackupStorageConstant.RESTORE_IMAGES_BACKUP_STORAGE_METADATA_TO_DATABASE; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class SftpBackupStorage extends BackupStorageBase { private static final CLogger logger = Utils.getLogger(SftpBackupStorage.class); @@ -105,7 +106,7 @@ private void download(String url, String installPath, String uuid, final ReturnV URI uri = new URI(url); String scheme = uri.getScheme(); if (!SftpBackupStorageFactory.type.getSupportedSchemes().contains(scheme)) { - throw new OperationFailureException(operr("SftpBackupStorage doesn't support scheme[%s] in url[%s]", scheme, url)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10000, "SftpBackupStorage doesn't support scheme[%s] in url[%s]", scheme, url)); } DownloadCmd cmd = new DownloadCmd(); @@ -134,7 +135,7 @@ public void success(DownloadResponse ret) { completion.success(res); } else { completion.fail( - operr("failed to download image[url: %s] on backup storage[uuid: %s], because: %s", + operr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10001, "failed to download image[url: %s] on backup storage[uuid: %s], because: %s", url, self.getUuid(), ret.getError()) ); } @@ -170,7 +171,7 @@ public void fail(ErrorCode err) { @Override public void success(GetImageSizeRsp rsp) { if (!rsp.isSuccess()) { - reply.setError(operr("operation error, because:%s", rsp.getError())); + reply.setError(operr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10002, "operation error, because:%s", rsp.getError())); } else { reply.setSize(rsp.size); } @@ -236,7 +237,7 @@ public void fail(ErrorCode err) { @Override public void success(AgentResponse rsp) { if (!rsp.isSuccess()) { - reply.setError(operr("fail to cancel download image, because %s", rsp.getError())); + reply.setError(operr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10003, "fail to cancel download image, because %s", rsp.getError())); } bus.reply(msg, reply); } @@ -310,14 +311,14 @@ public void fail(ErrorCode err) { @Override public void success(PingResponse ret) { if (ret.isSuccess() && !self.getUuid().equals(ret.getUuid())) { - ErrorCode err = operr("the uuid of sftpBackupStorage agent changed[expected:%s, actual:%s], it's most likely" + + ErrorCode err = operr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10004, "the uuid of sftpBackupStorage agent changed[expected:%s, actual:%s], it's most likely" + " the agent was manually restarted. Issue a reconnect to sync the status", self.getUuid(), ret.getUuid()); completion.fail(err); } else if (ret.isSuccess()) { completion.success(); } else { - completion.fail(operr("operation error, because:%s", ret.getError())); + completion.fail(operr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10005, "operation error, because:%s", ret.getError())); } } @@ -339,7 +340,7 @@ public void success() { cmd.setSendCommandUrl(restf.getSendCommandUrl()); ConnectResponse rsp = restf.syncJsonPost(url, cmd, ConnectResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("unable to connect to SimpleHttpBackupStorage[url:%s], because %s", url, rsp.getError()); + ErrorCode err = operr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10006, "unable to connect to SimpleHttpBackupStorage[url:%s], because %s", url, rsp.getError()); complete.fail(err); return; } @@ -429,7 +430,7 @@ public void success(Boolean deployed) { .setHostname(getSelf().getHostname()) .setPort(getSelf().getSshPort()).runErrorByExceptionAndClose(); } catch (SshException ex) { - throw new OperationFailureException(operr(ex.toString())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10007, ex.toString())); } continueConnect(complete); @@ -538,7 +539,7 @@ public void fail(ErrorCode err) { @Override public void success(GetImageSizeRsp rsp) { if (!rsp.isSuccess()) { - reply.setError(operr("operation error, because:%s", rsp.getError())); + reply.setError(operr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10008, "operation error, because:%s", rsp.getError())); } else { reply.setActualSize(rsp.actualSize); reply.setSize(rsp.size); @@ -570,7 +571,7 @@ public void fail(ErrorCode err) { @Override public void success(GetLocalFileSizeRsp rsp) { if (!rsp.isSuccess()) { - reply.setError(operr("operation error, because:%s", rsp.getError())); + reply.setError(operr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10009, "operation error, because:%s", rsp.getError())); } else { reply.setSize(rsp.size); } @@ -606,7 +607,7 @@ public void fail(ErrorCode err) { @Override public void success(GetImageHashRsp rsp) { if (!rsp.isSuccess()) { - reply.setError(operr("operation error, because:%s", rsp.getError())); + reply.setError(operr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10010, "operation error, because:%s", rsp.getError())); } else { reply.setEncrypted(rsp.hash); } @@ -650,7 +651,7 @@ public void done() { @Override public void fail(ErrorCode errorCode) { - evt.setError(err(SftpBackupStorageErrors.RECONNECT_ERROR, errorCode, errorCode.getDetails())); + evt.setError(err(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10011, SftpBackupStorageErrors.RECONNECT_ERROR, errorCode, errorCode.getDetails())); bus.publish(evt); } }); @@ -692,7 +693,7 @@ protected void handle(RestoreImagesBackupStorageMetadataToDatabaseMsg msg) { @Override protected void handle(CalculateImageHashOnBackupStorageMsg msg) { CalculateImageHashOnBackupStorageReply reply = new CalculateImageHashOnBackupStorageReply(); - reply.setError(operr("sftp backup storage do not support calculate image hash")); + reply.setError(operr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10012, "sftp backup storage do not support calculate image hash")); } protected void handle(GetBackupStorageManagerHostnameMsg msg) { diff --git a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageApiInterceptor.java b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageApiInterceptor.java index 70c107e21c7..6ca26f76a88 100755 --- a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageApiInterceptor.java +++ b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageApiInterceptor.java @@ -28,6 +28,7 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -67,7 +68,7 @@ private void validate(APICreateRootVolumeTemplateFromRootVolumeMsg msg) { .select(BackupStorageVO_.type).findValue(); if (bsType.equals(SftpBackupStorageConstant.SFTP_BACKUP_STORAGE_TYPE)) { - throw new ApiMessageInterceptionException(argerr("Please stop the vm before create volume template to sftp backup storage %s", bsUuid)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10020, "Please stop the vm before create volume template to sftp backup storage %s", bsUuid)); } } } @@ -75,7 +76,7 @@ private void validate(APICreateRootVolumeTemplateFromRootVolumeMsg msg) { private void validate(APIUpdateSftpBackupStorageMsg msg) { if (msg.getHostname() != null && !NetworkUtils.isIpv4Address(msg.getHostname()) && !NetworkUtils.isHostname(msg.getHostname())) { - throw new ApiMessageInterceptionException(argerr("hostname[%s] is neither an IPv4 address nor a valid hostname", msg.getHostname())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10021, "hostname[%s] is neither an IPv4 address nor a valid hostname", msg.getHostname())); } } @@ -97,17 +98,17 @@ private void validate(APIQuerySftpBackupStorageMsg msg) { private void validate(APIAddSftpBackupStorageMsg msg) { if (!NetworkUtils.isIpv4Address(msg.getHostname()) && !NetworkUtils.isHostname(msg.getHostname())) { - throw new ApiMessageInterceptionException(argerr("hostname[%s] is neither an IPv4 address nor a valid hostname", msg.getHostname())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10022, "hostname[%s] is neither an IPv4 address nor a valid hostname", msg.getHostname())); } SimpleQuery q = dbf.createQuery(SftpBackupStorageVO.class); q.add(SftpBackupStorageVO_.hostname, Op.EQ, msg.getHostname()); if (q.isExists()) { - throw new ApiMessageInterceptionException(operr("duplicate backup storage. There has been a sftp backup storage[hostname:%s] existing", msg.getHostname())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10023, "duplicate backup storage. There has been a sftp backup storage[hostname:%s] existing", msg.getHostname())); } String dir = msg.getUrl(); if (dir.startsWith("/proc")||dir.startsWith("/dev") || dir.startsWith("/sys")) { - throw new ApiMessageInterceptionException(argerr(" the url contains an invalid folder[/dev or /proc or /sys]")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10024, " the url contains an invalid folder[/dev or /proc or /sys]")); } } diff --git a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageFactory.java b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageFactory.java index 3360d7c848a..2d27bcd3ac5 100755 --- a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageFactory.java +++ b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageFactory.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.List; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class SftpBackupStorageFactory implements BackupStorageFactory, GlobalApiMessageInterceptor, Component { private static final CLogger logger = Utils.getLogger(SftpBackupStorageFactory.class); @@ -81,7 +82,7 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti APIAddSftpBackupStorageMsg amsg = (APIAddSftpBackupStorageMsg) msg; String url = amsg.getUrl(); if (!url.startsWith("/")) { - ErrorCode err = argerr("invalid url[%s], the url must be an absolute path starting with '/'", amsg.getUrl()); + ErrorCode err = argerr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10013, "invalid url[%s], the url must be an absolute path starting with '/'", amsg.getUrl()); throw new ApiMessageInterceptionException(err); } @@ -90,7 +91,7 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti query.add(SftpBackupStorageVO_.hostname, Op.EQ, hostname); long count = query.count(); if (count != 0) { - ErrorCode err = argerr("existing SimpleHttpBackupStorage with hostname[%s] found", hostname); + ErrorCode err = argerr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10014, "existing SimpleHttpBackupStorage with hostname[%s] found", hostname); throw new ApiMessageInterceptionException(err); } } diff --git a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageMetaDataMaker.java b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageMetaDataMaker.java index d14e57c8c1f..e142fe80945 100755 --- a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageMetaDataMaker.java +++ b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageMetaDataMaker.java @@ -41,6 +41,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.header.storage.backup.BackupStorageConstant.IMPORT_IMAGES_FAKE_RESOURCE_UUID; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by Mei Lei on 11/3/16. @@ -352,7 +353,7 @@ public void fail(ErrorCode err) { public void success(SftpBackupStorageCommands.CheckImageMetaDataFileExistRsp rsp) { if (!rsp.isSuccess()) { logger.error(String.format("check image metadata file: %s failed", rsp.getBackupStorageMetaFileName())); - ErrorCode ec = operr("check image metadata file: %s failed", rsp.getBackupStorageMetaFileName()); + ErrorCode ec = operr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10015, "check image metadata file: %s failed", rsp.getBackupStorageMetaFileName()); trigger.fail(ec); } else { if (!rsp.getExist()) { @@ -396,7 +397,7 @@ public void fail(ErrorCode err) { @Override public void success(SftpBackupStorageCommands.GenerateImageMetaDataFileRsp rsp) { if (!rsp.isSuccess()) { - ErrorCode ec = operr("create image metadata file : %s failed", rsp.getBackupStorageMetaFileName()); + ErrorCode ec = operr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10016, "create image metadata file : %s failed", rsp.getBackupStorageMetaFileName()); trigger.fail(ec); } else { logger.info("create image metadata file successfully"); @@ -551,12 +552,12 @@ public void fail(ErrorCode err) { public void success(SftpBackupStorageCommands.CheckImageMetaDataFileExistRsp rsp) { if (!rsp.isSuccess()) { logger.error(String.format("check image metadata file: %s failed", rsp.getBackupStorageMetaFileName())); - ErrorCode ec = operr("check image metadata file: %s failed", rsp.getBackupStorageMetaFileName()); + ErrorCode ec = operr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10017, "check image metadata file: %s failed", rsp.getBackupStorageMetaFileName()); trigger.fail(ec); } else { if (!rsp.getExist()) { logger.info(String.format("image metadata file %s is not exist", rsp.getBackupStorageMetaFileName())); - ErrorCode ec = operr("image metadata file: %s is not exist", rsp.getBackupStorageMetaFileName()); + ErrorCode ec = operr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10018, "image metadata file: %s is not exist", rsp.getBackupStorageMetaFileName()); trigger.fail(ec); } else { logger.info(String.format("image metadata file %s exist", rsp.getBackupStorageMetaFileName())); @@ -593,7 +594,7 @@ public void fail(ErrorCode err) { @Override public void success(SftpBackupStorageCommands.DeleteImageInfoFromMetaDataFileRsp rsp) { if (!rsp.isSuccess()) { - ErrorCode ec = operr("delete image metadata file failed: %s", rsp.getError()); + ErrorCode ec = operr(ORG_ZSTACK_STORAGE_BACKUP_SFTP_10019, "delete image metadata file failed: %s", rsp.getError()); trigger.fail(ec); } else { if (rsp.getRet() != 0) { diff --git a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/KvmAgentCommandDispatcher.java b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/KvmAgentCommandDispatcher.java index f4757ed1230..ec6274c6b1c 100644 --- a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/KvmAgentCommandDispatcher.java +++ b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/KvmAgentCommandDispatcher.java @@ -35,6 +35,7 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by david on 7/22/16. @@ -66,7 +67,7 @@ public KvmAgentCommandDispatcher(String psUuid) { this.primaryStorageUuid = psUuid; hostUuids = findConnectedHosts(50); if (hostUuids.isEmpty()) { - throw new OperationFailureException(operr("cannot find any connected host to perform the operation, it seems all KVM hosts" + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_SMP_10011, "cannot find any connected host to perform the operation, it seems all KVM hosts" + " in the clusters attached with the shared mount point storage[uuid:%s] are disconnected", this.primaryStorageUuid)); } @@ -99,7 +100,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply r = reply.castReply(); final T rsp = r.toResponse(rspType); if (!rsp.success) { - completion.fail(operr("operation error, because:%s", rsp.error)); + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_SMP_10012, "operation error, because:%s", (String) rsp.error)); return; } diff --git a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/KvmBackend.java b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/KvmBackend.java index 1a0351c76af..97a16810f69 100755 --- a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/KvmBackend.java +++ b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/KvmBackend.java @@ -66,6 +66,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; import static org.zstack.core.progress.ProgressReportService.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by xing5 on 2016/3/26. @@ -103,7 +104,7 @@ protected ErrorCode buildErrorCode() { if (success) { return null; } - return operr("operation error, because:%s", error); + return operr(ORG_ZSTACK_STORAGE_PRIMARY_SMP_10014, "operation error, because:%s", error); } } @@ -156,7 +157,7 @@ public static class DeleteRsp extends AgentRsp { public boolean inUse; public ErrorCode buildErrorCode() { if (inUse) { - return Platform.err(VolumeErrors.VOLUME_IN_USE, error); + return Platform.err(ORG_ZSTACK_STORAGE_PRIMARY_SMP_10015, VolumeErrors.VOLUME_IN_USE, error); } return super.buildErrorCode(); } @@ -531,7 +532,7 @@ private List findConnectedHostByClusterUuid(String clusterUuid, boolean q.add(HostVO_.status, Op.EQ, HostStatus.Connected); List hostUuids = q.listValue(); if (hostUuids.isEmpty() && exceptionOnNotFound) { - throw new OperationFailureException(operr("no connected host found in the cluster[uuid:%s]", clusterUuid)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_SMP_10016, "no connected host found in the cluster[uuid:%s]", clusterUuid)); } return hostUuids; @@ -1202,7 +1203,7 @@ public Do() { List hinvs = primaryStorageFactory.getConnectedHostForOperation(getSelfInventory(),0,50); hinvs.forEach(it -> hostUuids.add(it.getUuid())); if (hostUuids.isEmpty()) { - throw new OperationFailureException(operr("cannot find any connected host to perform the operation, it seems all KVM hosts" + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_SMP_10017, "cannot find any connected host to perform the operation, it seems all KVM hosts" + " in the clusters attached with the shared mount point storage[uuid:%s] are disconnected", self.getUuid())); } @@ -1380,7 +1381,7 @@ void handle(CheckSnapshotMsg msg, Completion completion) { } else if (state == VmInstanceState.Stopped){ hostUuid = connectedHostUuid; } else { - completion.fail(operr("vm[uuid:%s] is not Running, Paused or Stopped, current state[%s]", + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_SMP_10018, "vm[uuid:%s] is not Running, Paused or Stopped, current state[%s]", vol.getVmInstanceUuid(), state)); return; } @@ -1444,7 +1445,7 @@ void handle(TakeSnapshotMsg msg, final ReturnValueCompletion } else if (state == VmInstanceState.Stopped){ hostUuid = connectedHostUuid; } else { - completion.fail(operr("vm[uuid:%s] is not Running, Paused or Stopped, current state[%s]", + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_SMP_10019, "vm[uuid:%s] is not Running, Paused or Stopped, current state[%s]", vol.getVmInstanceUuid(), state)); return; } @@ -1649,7 +1650,7 @@ void stream(VolumeSnapshotInventory from, VolumeInventory to, boolean fullRebase if (state != VmInstanceState.Stopped && state != VmInstanceState.Running && state != VmInstanceState.Destroyed && state != VmInstanceState.Paused) { - throw new OperationFailureException(operr("the volume[uuid;%s] is attached to a VM[uuid:%s] which is in state of %s, cannot do the snapshot merge", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_SMP_10020, "the volume[uuid;%s] is attached to a VM[uuid:%s] which is in state of %s, cannot do the snapshot merge", volume.getUuid(), volume.getVmInstanceUuid(), state)); } @@ -1775,7 +1776,7 @@ void downloadImageToCache(ImageSpec img, final ReturnValueCompletion(completion) { @Override @@ -2166,7 +2167,7 @@ private BackupStorageKvmUploader getBackupStorageKvmUploader(String backupStorag String bsType = q.findValue(); if (bsType == null) { - throw new OperationFailureException(operr("cannot find backup storage[uuid:%s]", backupStorageUuid)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_SMP_10023, "cannot find backup storage[uuid:%s]", backupStorageUuid)); } @@ -2239,7 +2240,7 @@ public void done() { if(ret.firstAccessHostUuids.size() > 1){ ret.huuids.addAll(ret.firstAccessHostUuids); ret.errorCodes.add(operr( - "hosts[uuid:%s] have the same mount path, but actually mount different storage.", + ORG_ZSTACK_STORAGE_PRIMARY_SMP_10024, "hosts[uuid:%s] have the same mount path, but actually mount different storage.", ret.firstAccessHostUuids )); } @@ -2298,7 +2299,7 @@ void handle(SyncVolumeSizeOnPrimaryStorageMsg msg, final ReturnValueCompletion(completion) { @Override @@ -2426,7 +2427,7 @@ public void run(SyncTaskChain chain) { @Override public void success(Boolean isFirst) { if (isFirst && !isFirstAccessPS) { - reply.setError(argerr("host[uuid:%s] might mount storage which is different from SMP[uuid:%s], please check it", msg.getHostUuid(), msg.getPrimaryStorageUuid())); + reply.setError(argerr(ORG_ZSTACK_STORAGE_PRIMARY_SMP_10026, "host[uuid:%s] might mount storage which is different from SMP[uuid:%s], please check it", msg.getHostUuid(), msg.getPrimaryStorageUuid())); cleanInvalidIdFile(Collections.singletonList(msg.getHostUuid())); } bus.reply(msg, reply); @@ -2469,7 +2470,7 @@ void handle(ChangeVolumeTypeOnPrimaryStorageMsg msg, ReturnValueCompletion completion) { - completion.fail(operr("not supported operation")); + completion.fail(operr(ORG_ZSTACK_STORAGE_PRIMARY_SMP_10006, "not supported operation")); } @Override @@ -1126,7 +1127,7 @@ public String call() { return HypervisorType.valueOf(type); } - throw new OperationFailureException(operr("cannot find proper hypervisorType for primary storage[uuid:%s] to handle image format or volume format[%s]", psUuid, imageFormat)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_SMP_10007, "cannot find proper hypervisorType for primary storage[uuid:%s] to handle image format or volume format[%s]", psUuid, imageFormat)); } @Override @@ -1139,10 +1140,10 @@ protected void handle(CheckVolumeSnapshotOperationOnPrimaryStorageMsg msg) { .param("vmUuid", msg.getVmInstanceUuid()) .find(); if (hostStatus == null && getAvailableHostUuidForOperation() == null) { - reply.setError(err(HostErrors.HOST_IS_DISCONNECTED, "cannot find available host for operation on" + + reply.setError(err(ORG_ZSTACK_STORAGE_PRIMARY_SMP_10008, HostErrors.HOST_IS_DISCONNECTED, "cannot find available host for operation on" + " primary storage[uuid:%s].", self.getUuid())); } else if (hostStatus != HostStatus.Connected && hostStatus != null) { - reply.setError(err(HostErrors.HOST_IS_DISCONNECTED, "host where vm[uuid:%s] locate is not Connected.", msg.getVmInstanceUuid())); + reply.setError(err(ORG_ZSTACK_STORAGE_PRIMARY_SMP_10009, HostErrors.HOST_IS_DISCONNECTED, "host where vm[uuid:%s] locate is not Connected.", msg.getVmInstanceUuid())); } } @@ -1156,7 +1157,7 @@ private ErrorCode checkChangeVolumeType(String volumeUuid) { } List infos = refVols.stream().map(v -> String.format("uuid:%s, name:%s", v.getUuid(), v.getName())).collect(Collectors.toList()); - return operr("volume[uuid:%s] has reference volume[%s], can not change volume type before flatten " + + return operr(ORG_ZSTACK_STORAGE_PRIMARY_SMP_10010, "volume[uuid:%s] has reference volume[%s], can not change volume type before flatten " + "them and their descendants", volumeUuid, infos.toString()); } diff --git a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageFactory.java b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageFactory.java index 76425ea21cb..aec81ddb844 100755 --- a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageFactory.java +++ b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageFactory.java @@ -38,6 +38,7 @@ import java.util.Map; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by xing5 on 2016/3/26. @@ -111,7 +112,7 @@ protected void scripts() { } if (!q(PrimaryStorageClusterRefVO.class).eq(PrimaryStorageClusterRefVO_.primaryStorageUuid, psUuid).isExists()) { - throw new OperationFailureException(operr("the SMP primary storage[uuid:%s] is not attached" + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_SMP_10001, "the SMP primary storage[uuid:%s] is not attached" + " to any clusters, and cannot expunge the root volume[uuid:%s] of the VM[uuid:%s]", psUuid, vmUuid, volumeUuid)); } } @@ -305,7 +306,7 @@ private List getSMPPrimaryStorageInCluster(String clusterUuid) { @Transactional public List getConnectedHostForOperation(PrimaryStorageInventory pri, int startPage, int pageLimit) { if (pri.getAttachedClusterUuids().isEmpty()) { - throw new OperationFailureException(operr("cannot find a Connected host to execute command for smp primary storage[uuid:%s]", pri.getUuid())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_SMP_10002, "cannot find a Connected host to execute command for smp primary storage[uuid:%s]", pri.getUuid())); } String sql = "select h from HostVO h " + @@ -326,7 +327,7 @@ public List getConnectedHostForOperation(PrimaryStorageInventory List ret = q.getResultList(); if (ret.isEmpty() && startPage == 0) { //check is first page throw new OperationFailureException(operr( - "cannot find a host which has Connected host-SMP connection to execute command for smp primary storage[uuid:%s]", + ORG_ZSTACK_STORAGE_PRIMARY_SMP_10003, "cannot find a host which has Connected host-SMP connection to execute command for smp primary storage[uuid:%s]", pri.getUuid())); } else { Collections.shuffle(ret); diff --git a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPSnapshotDeletionProtector.java b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPSnapshotDeletionProtector.java index 31286f96c51..845de3cc25b 100755 --- a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPSnapshotDeletionProtector.java +++ b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPSnapshotDeletionProtector.java @@ -10,6 +10,7 @@ import java.nio.file.Path; import java.nio.file.Paths; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class SMPSnapshotDeletionProtector implements VolumeSnapshotDeletionProtector { @Override @@ -21,7 +22,7 @@ public String getPrimaryStorageType() { public void protect(VolumeSnapshotInventory snapshot, Completion completion) { Path path = Paths.get(snapshot.getPrimaryStorageInstallPath()); if (!path.getParent().toString().contains(snapshot.getVolumeUuid())) { - completion.fail(inerr("the snapshot[name:%s, uuid:%s, path: %s] seems not belong to the volume[uuid:%s]", + completion.fail(inerr(ORG_ZSTACK_STORAGE_PRIMARY_SMP_10000, "the snapshot[name:%s, uuid:%s, path: %s] seems not belong to the volume[uuid:%s]", snapshot.getName(), snapshot.getUuid(), snapshot.getPrimaryStorageInstallPath(), snapshot.getVolumeUuid())); return; } diff --git a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SharedMountPointApiInterceptor.java b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SharedMountPointApiInterceptor.java index d8e7d564660..949b9d81089 100644 --- a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SharedMountPointApiInterceptor.java +++ b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SharedMountPointApiInterceptor.java @@ -5,6 +5,7 @@ import org.zstack.header.message.APIMessage; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by camile on 2017/4/18. @@ -22,7 +23,7 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti private void validate(APIAddSharedMountPointPrimaryStorageMsg msg) { String url = msg.getUrl(); if (url.startsWith("/dev") || url.startsWith("/proc") || url.startsWith("/sys")) { - throw new ApiMessageInterceptionException(argerr(" the url contains an invalid folder[/dev or /proc or /sys]")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_SMP_10013, " the url contains an invalid folder[/dev or /proc or /sys]")); } } } diff --git a/plugin/sshKeyPair/src/main/java/org/zstack/sshkeypair/SshKeyPairAPIInterceptor.java b/plugin/sshKeyPair/src/main/java/org/zstack/sshkeypair/SshKeyPairAPIInterceptor.java index 421044ef306..d53fb6db1a9 100644 --- a/plugin/sshKeyPair/src/main/java/org/zstack/sshkeypair/SshKeyPairAPIInterceptor.java +++ b/plugin/sshKeyPair/src/main/java/org/zstack/sshkeypair/SshKeyPairAPIInterceptor.java @@ -21,6 +21,7 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class SshKeyPairAPIInterceptor implements ApiMessageInterceptor { @@ -66,7 +67,7 @@ private void validate(APICreateSshKeyPairMsg msg) { .in(AccountResourceRefVO_.resourceUuid, sshKeyPairUuids) .isExists(); if (isExist) { - throw new ApiMessageInterceptionException(argerr("The sshKeyPair already upload")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SSHKEYPAIR_10006, "The sshKeyPair already upload")); } } @@ -75,7 +76,7 @@ private void validate(APIDeleteSshKeyPairMsg msg) { .eq(SshKeyPairRefVO_.sshKeyPairUuid, msg.getUuid()) .isExists(); if (exists) { - throw new ApiMessageInterceptionException((argerr("The sshKeyPair[uuid:%s] was in using.", msg.getSshKeyPairUuid()))); + throw new ApiMessageInterceptionException((argerr(ORG_ZSTACK_SSHKEYPAIR_10007, "The sshKeyPair[uuid:%s] was in using.", msg.getSshKeyPairUuid()))); } } @@ -92,7 +93,7 @@ private void validate(APIAttachSshKeyPairToVmInstanceMsg msg) { .eq(SshKeyPairRefVO_.resourceType, VmInstanceVO.class.getSimpleName()) .isExists(); if (isExist) { - throw new ApiMessageInterceptionException((argerr("The sshKeyPair[uuid:%s] was already attached on vm[uuid:].", + throw new ApiMessageInterceptionException((argerr(ORG_ZSTACK_SSHKEYPAIR_10008, "The sshKeyPair[uuid:%s] was already attached on vm[uuid:].", msg.getSshKeyPairUuid(), msg.getVmInstanceUuid()))); } validateVmInstanceRunning(Q.New(VmInstanceVO.class).eq(VmInstanceVO_.uuid, msg.getVmInstanceUuid()).find()); @@ -111,7 +112,7 @@ private void validate(APIDetachSshKeyPairFromVmInstanceMsg msg) { .eq(SshKeyPairRefVO_.resourceType, VmInstanceVO.class.getSimpleName()) .isExists(); if (!isExist) { - throw new ApiMessageInterceptionException((argerr("The sshKeyPair[uuid:%s] was not attached on vm[uuid:%s].", + throw new ApiMessageInterceptionException((argerr(ORG_ZSTACK_SSHKEYPAIR_10009, "The sshKeyPair[uuid:%s] was not attached on vm[uuid:%s].", msg.getSshKeyPairUuid(), msg.getVmInstanceUuid()))); } validateVmInstanceRunning(Q.New(VmInstanceVO.class).eq(VmInstanceVO_.uuid, msg.getVmInstanceUuid()).find()); @@ -120,13 +121,13 @@ private void validate(APIDetachSshKeyPairFromVmInstanceMsg msg) { private void validateVmInstanceRunning(VmInstanceVO vmInstanceVO) { if (!vmInstanceVO.getState().equals(VmInstanceState.Running)) { throw new ApiMessageInterceptionException((argerr( - "The vmInstance[uuid:%s] not in running state.", vmInstanceVO.getUuid()))); + ORG_ZSTACK_SSHKEYPAIR_10010, "The vmInstance[uuid:%s] not in running state.", vmInstanceVO.getUuid()))); } } private void checkType(String type) { if (!ALLOW_RESOURCE_TYPES.contains(type)) { - throw new ApiMessageInterceptionException(argerr("resource types %s are not supported to attach sshKeyPair, allowed types are %s", type, ALLOW_RESOURCE_TYPES)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_SSHKEYPAIR_10011, "resource types %s are not supported to attach sshKeyPair, allowed types are %s", type, ALLOW_RESOURCE_TYPES)); } } } diff --git a/plugin/sshKeyPair/src/main/java/org/zstack/sshkeypair/SshKeyPairBase.java b/plugin/sshKeyPair/src/main/java/org/zstack/sshkeypair/SshKeyPairBase.java index 2a638bb703d..462aec792c4 100644 --- a/plugin/sshKeyPair/src/main/java/org/zstack/sshkeypair/SshKeyPairBase.java +++ b/plugin/sshKeyPair/src/main/java/org/zstack/sshkeypair/SshKeyPairBase.java @@ -28,6 +28,7 @@ import java.util.Date; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class SshKeyPairBase { @@ -188,7 +189,7 @@ public void run(MessageReply reply) { if (rsp.isSuccess()) { attachSshKeyPairToVmInDB(); } else { - reply.setError(operr("operation error, because: %s", rsp.getError())); + reply.setError(operr(ORG_ZSTACK_SSHKEYPAIR_10004, "operation error, because: %s", rsp.getError())); event.setError(reply.getError()); } } else { @@ -285,7 +286,7 @@ public void run(MessageReply reply) { if (rsp.isSuccess()) { detachSshKeyPairFromVmInDB(); } else { - reply.setError(operr("operation error, because: %s", rsp.getError())); + reply.setError(operr(ORG_ZSTACK_SSHKEYPAIR_10005, "operation error, because: %s", rsp.getError())); event.setError(reply.getError()); } } else { diff --git a/plugin/sshKeyPair/src/main/java/org/zstack/sshkeypair/SshKeyPairManagerImpl.java b/plugin/sshKeyPair/src/main/java/org/zstack/sshkeypair/SshKeyPairManagerImpl.java index 5a0fc16d9d6..450262ab550 100644 --- a/plugin/sshKeyPair/src/main/java/org/zstack/sshkeypair/SshKeyPairManagerImpl.java +++ b/plugin/sshKeyPair/src/main/java/org/zstack/sshkeypair/SshKeyPairManagerImpl.java @@ -42,6 +42,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class SshKeyPairManagerImpl extends AbstractService implements SshKeyPairManager, @@ -84,7 +85,7 @@ public void handleAPIMessage(APIMessage msg) { public void passThrough(SshKeyPairMessage msg) { SshKeyPairVO vo = dbf.findByUuid(msg.getSshKeyPairUuid(), SshKeyPairVO.class); if (vo == null) { - bus.replyErrorByMessageType((Message) msg, err(SysErrors.RESOURCE_NOT_FOUND, "unable to find sshKeyPair[uuid=%s]", msg.getSshKeyPairUuid())); + bus.replyErrorByMessageType((Message) msg, err(ORG_ZSTACK_SSHKEYPAIR_10000, SysErrors.RESOURCE_NOT_FOUND, "unable to find sshKeyPair[uuid=%s]", msg.getSshKeyPairUuid())); return; } @@ -139,7 +140,7 @@ public void handle(APIGenerateSshKeyPairMsg msg) { jschKeyPair.writePublicKey(pubKey, null); } catch (JSchException e) { bus.replyErrorByMessageType((Message) msg, err( - SysErrors.INTERNAL, + ORG_ZSTACK_SSHKEYPAIR_10001, SysErrors.INTERNAL, "Cannot generate sshKeyPair, error: %s", e.toString())); } @@ -169,7 +170,7 @@ public void createSshKeyPair(APICreateSshKeyPairMsg msg, APICreateSshKeyPairEven KeyPair publicKey = KeyPair.load(jsch, null, keyContent.getBytes()); String fg = publicKey.getFingerPrint(); } catch (Exception e) { - completion.fail(operr("failed to load the public key: %s, err: %s", keyContent, e.toString())); + completion.fail(operr(ORG_ZSTACK_SSHKEYPAIR_10002, "failed to load the public key: %s, err: %s", keyContent, e.toString())); return; } @@ -226,7 +227,7 @@ public ErrorCode associateSshKeyPair(String vmUuid, List keyPairUuids) { .eq(SshKeyPairVO_.uuid, uuid) .isExists(); if(!isExist) { - return operr("ssh key pair[uuid:%s] can not associated to vm[uuid:%s] due to the key not found", + return operr(ORG_ZSTACK_SSHKEYPAIR_10003, "ssh key pair[uuid:%s] can not associated to vm[uuid:%s] due to the key not found", uuid, vmUuid); } SshKeyPairRefVO refVo = new SshKeyPairRefVO(); diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java index ebcf1433be3..b428116d302 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java @@ -35,6 +35,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.utils.network.NetworkUtils.getSubnetInfo; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class SugonSdnController implements TfSdnController, SdnController, SdnControllerL2 { @@ -87,19 +88,19 @@ public void preInitSdnController(APIAddSdnControllerMsg msg, Completion completi try { long count = Q.New(SdnControllerVO.class).eq(SdnControllerVO_.vendorType, SugonSdnControllerConstant.TF_CONTROLLER).count(); if(count > 0) { - completion.fail(operr("tf sdn controller already exists.")); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10000, "tf sdn controller already exists.")); return; } AccountVO accountVO = Q.New(AccountVO.class).eq(AccountVO_.name, SugonSdnControllerConstant.ZSTACK_DEFAULT_ACCOUNT).find(); if(accountVO == null) { - completion.fail(operr("get default admin account from zstack db failed")); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10001, "get default admin account from zstack db failed")); return; } String accountUuid = StringDSL.transToTfUuid(accountVO.getUuid()); client = new TfHttpClient(msg.getIp()); Domain domain = (Domain) client.getDomain(); if(domain == null){ - completion.fail(operr("get default domain on tf controller failed")); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10002, "get default domain on tf controller failed")); return; } Project defaultProject = (Project) client.findById(Project.class, accountUuid); @@ -114,7 +115,7 @@ public void preInitSdnController(APIAddSdnControllerMsg msg, Completion completi logger.info("create tf project for zstack admin success"); completion.success(); }else{ - completion.fail(operr("create tf project for zstack admin on tf controller failed")); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10003, "create tf project for zstack admin on tf controller failed")); } }else{ logger.warn("tf project for zstack admin already exists: " + accountUuid); @@ -123,7 +124,7 @@ public void preInitSdnController(APIAddSdnControllerMsg msg, Completion completi } catch (Exception e) { String message = String.format("create tf project for zstack admin on tf controller failed due to: %s", e.getMessage()); logger.error(message, e); - completion.fail(operr(message)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10004, message)); } } @@ -188,7 +189,7 @@ public void createL2Network(L2NetworkVO l2NetworkVO, APICreateL2NetworkMsg msg, APICreateL2TfNetworkMsg l2TfNetworkMsg = (APICreateL2TfNetworkMsg) msg; Project project = (Project) client.findById(Project.class, accountUuid); if(project == null) { - completion.fail(operr("get project[uuid:%s] on tf controller failed ", accountUuid)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10005, "get project[uuid:%s] on tf controller failed ", accountUuid)); }else{ VirtualNetwork virtualNetwork = new VirtualNetwork(); virtualNetwork.setParent(project); @@ -204,13 +205,13 @@ public void createL2Network(L2NetworkVO l2NetworkVO, APICreateL2NetworkMsg msg, logger.info("create tf l2 network success, name:" + name); completion.success(); }else{ - completion.fail(operr("create tf l2 network[name:%s] on tf controller failed ", name)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10006, "create tf l2 network[name:%s] on tf controller failed ", name)); } } } catch (Exception e) { String message = String.format("create tf l2 network[name:%s] on tf controller failed due to: %s", name, e.getMessage()); logger.error(message, e); - completion.fail(operr(message)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10007, message)); } } @@ -221,7 +222,7 @@ public void updateL2Network(L2NetworkVO l2NetworkVO, List systemTags, Co try { VirtualNetwork virtualNetwork = (VirtualNetwork) client.findById(VirtualNetwork.class, uuid); if(virtualNetwork == null){ - completion.fail(operr("get virtual network[uuid:%s] on tf controller failed ", uuid)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10008, "get virtual network[uuid:%s] on tf controller failed ", uuid)); }else{ virtualNetwork.setDisplayName(name); Status status = client.update(virtualNetwork); @@ -229,13 +230,13 @@ public void updateL2Network(L2NetworkVO l2NetworkVO, List systemTags, Co logger.info("update tf l2 network success, name:" + name); completion.success(); }else{ - completion.fail(operr("update tf l2 network[name:%s] on tf controller failed ", name)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10009, "update tf l2 network[name:%s] on tf controller failed ", name)); } } } catch (Exception e) { String message = String.format("update tf l2 network[name:%s] on tf controller failed due to: %s ", name, e.getMessage()); logger.error(message, e); - completion.fail(operr(message)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10010, message)); } } @@ -248,12 +249,12 @@ public void deleteL2Network(L2NetworkVO l2NetworkVO, List systemTags, Co logger.info("delete tf l2 network success, uuid:" + uuid); completion.success(); }else{ - completion.fail(operr("delete tf l2 network[uuid:%s] on tf controller failed ", uuid)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10011, "delete tf l2 network[uuid:%s] on tf controller failed ", uuid)); } } catch (Exception e) { String message = String.format("delete tf l2 network[uuid:%s] on tf controller failed due to: %s", uuid, e.getMessage()); logger.error(message, e); - completion.fail(operr(message)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10012, message)); } } @@ -362,7 +363,7 @@ public void deleteL3Network(L3NetworkVO l3NetworkVO, Completion completion) { // 更新 tf 网络信息 Status status = client.update(vn); if(!status.isSuccess()){ - completion.fail(operr("delete tf l3 network[name:%s] on tf controller failed due to:%s", l3NetworkVO.getName(),status.getMsg())); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10013, "delete tf l3 network[name:%s] on tf controller failed due to:%s", l3NetworkVO.getName(),status.getMsg())); // completion.fail(operr("delete tf l3 network[name:%s] on tf controller failed due to:%s", l3NetworkVO.getName(),"tf api call failed")); } else{ completion.success(); @@ -375,12 +376,12 @@ public void deleteL3Network(L3NetworkVO l3NetworkVO, Completion completion) { } else{ String message = String.format("delete tf l3 network[name:%s] on tf controller failed due to: %s ",l3NetworkVO.getName(), "tf virtual network is missing"); logger.error(message); - completion.fail(operr(message)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10014, message)); } } catch (Exception e){ String message = String.format("delete tf l3 network[name:%s] on tf controller failed due to: %s ",l3NetworkVO.getName(), e.getMessage()); logger.error(message, e); - completion.fail(operr(message)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10015, message)); } } @@ -410,7 +411,7 @@ public void updateL3Network(L3NetworkVO l3NetworkVO, APIUpdateL3NetworkMsg msg, // 更新 tf 网络信息 Status status = client.update(vn); if(!status.isSuccess()){ - completion.fail(operr("update tf l3 network[name:%s] on tf controller failed due to:%s", l3NetworkVO.getName(),status.getMsg())); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10016, "update tf l3 network[name:%s] on tf controller failed due to:%s", l3NetworkVO.getName(),status.getMsg())); } else{ completion.success(); } @@ -425,12 +426,12 @@ public void updateL3Network(L3NetworkVO l3NetworkVO, APIUpdateL3NetworkMsg msg, } else{ String message = String.format("update tf l3 network[name:%s] on tf controller failed due to: %s ",l3NetworkVO.getName(), "tf virtual network is missing"); logger.error(message); - completion.fail(operr(message)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10017, message)); } } catch (Exception e){ String message = String.format("update tf l3 network[name:%s] on tf controller failed due to: %s ",l3NetworkVO.getName(), e.getMessage()); logger.error(message, e); - completion.fail(operr(message)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10018, message)); } } @@ -494,7 +495,7 @@ public void addL3IpRangeByCidr(L3NetworkVO l3NetworkVO, APIAddIpRangeByNetworkCi // 更新 tf 网络信息 Status status = client.update(vn); if(!status.isSuccess()){ - completion.fail(operr("add tf l3 subnet[name:%s] on tf controller failed due to:%s", l3NetworkVO.getName(),status.getMsg())); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10019, "add tf l3 subnet[name:%s] on tf controller failed due to:%s", l3NetworkVO.getName(),status.getMsg())); // completion.fail(operr("add tf l3 subnet[name:%s] on tf controller failed due to:%s", l3NetworkVO.getName(),"tf api call failed")); } else{ completion.success(); @@ -502,12 +503,12 @@ public void addL3IpRangeByCidr(L3NetworkVO l3NetworkVO, APIAddIpRangeByNetworkCi } else{ String message = String.format("add tf l3 subnet[name:%s] on tf controller failed due to: %s ",l3NetworkVO.getName(), "tf virtual network is missing"); logger.error(message); - completion.fail(operr(message)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10020, message)); } } catch (Exception e){ String message = String.format("add tf l3 subnet[name:%s] on tf controller failed due to: %s ",l3NetworkVO.getName(), e.getMessage()); logger.error(message, e); - completion.fail(operr(message)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10021, message)); } } @@ -538,7 +539,7 @@ public void addL3HostRoute(L3NetworkVO l3NetworkVO, APIAddHostRouteToL3NetworkMs // 更新 tf 网络信息 Status status = client.update(vn); if(!status.isSuccess()){ - completion.fail(operr("add host router to l3 network[name:%s] on tf controller failed due to:%s", l3NetworkVO.getName(),status.getMsg())); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10022, "add host router to l3 network[name:%s] on tf controller failed due to:%s", l3NetworkVO.getName(),status.getMsg())); // completion.fail(operr("add host router to l3 network[name:%s] on tf controller failed due to:%s", l3NetworkVO.getName(),"tf api call failed")); } else{ completion.success(); @@ -554,12 +555,12 @@ public void addL3HostRoute(L3NetworkVO l3NetworkVO, APIAddHostRouteToL3NetworkMs } else{ String message = String.format("add host router to l3 network[name:%s] on tf controller failed due to: %s ",l3NetworkVO.getName(), "tf virtual network is missing"); logger.error(message); - completion.fail(operr(message)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10023, message)); } } catch (Exception e){ String message = String.format("add host router to l3 network[name:%s] on tf controller failed due to: %s ",l3NetworkVO.getName(), e.getMessage()); logger.error(message, e); - completion.fail(operr(message)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10024, message)); } } @@ -591,7 +592,7 @@ public void deleteL3HostRoute(L3NetworkVO l3NetworkVO, APIRemoveHostRouteFromL3N // 更新 tf 网络信息 Status status = client.update(vn); if(!status.isSuccess()){ - completion.fail(operr("delete host route from l3 network[name:%s] on tf controller failed due to:%s", l3NetworkVO.getName(),status.getMsg())); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10025, "delete host route from l3 network[name:%s] on tf controller failed due to:%s", l3NetworkVO.getName(),status.getMsg())); // completion.fail(operr("delete host route from l3 network[name:%s] on tf controller failed due to:%s", l3NetworkVO.getName(),"tf api call failed")); } else{ completion.success(); @@ -607,12 +608,12 @@ public void deleteL3HostRoute(L3NetworkVO l3NetworkVO, APIRemoveHostRouteFromL3N } else{ String message = String.format("delete host route from l3 network[name:%s] on tf controller failed due to: %s ",l3NetworkVO.getName(), "tf virtual network is missing"); logger.error(message); - completion.fail(operr(message)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10026, message)); } } catch (Exception e){ String message = String.format("delete host route from l3 network[name:%s] on tf controller failed due to: %s ",l3NetworkVO.getName(), e.getMessage()); logger.error(message, e); - completion.fail(operr(message)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10027, message)); } } @@ -648,7 +649,7 @@ public void addL3Dns(L3NetworkVO l3NetworkVO, APIAddDnsToL3NetworkMsg msg, Compl // 更新 tf 网络信息 Status status = client.update(vn); if(!status.isSuccess()){ - completion.fail(operr("add dns to l3 network[name:%s] on tf controller failed due to:%s", l3NetworkVO.getName(),status.getMsg())); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10028, "add dns to l3 network[name:%s] on tf controller failed due to:%s", l3NetworkVO.getName(),status.getMsg())); // completion.fail(operr("add dns to l3 network[name:%s] on tf controller failed due to:%s", l3NetworkVO.getName(),"tf api call failed")); } else{ completion.success(); @@ -664,12 +665,12 @@ public void addL3Dns(L3NetworkVO l3NetworkVO, APIAddDnsToL3NetworkMsg msg, Compl } else{ String message = String.format("add dns to l3 network[name:%s] on tf controller failed due to: %s ",l3NetworkVO.getName(), "tf virtual network is missing"); logger.error(message); - completion.fail(operr(message)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10029, message)); } } catch (Exception e){ String message = String.format("add dns to l3 network[name:%s] on tf controller failed due to: %s ",l3NetworkVO.getName(), e.getMessage()); logger.error(message, e); - completion.fail(operr(message)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10030, message)); } } @@ -693,7 +694,7 @@ public void deleteL3Dns(L3NetworkVO l3NetworkVO, APIRemoveDnsFromL3NetworkMsg ms // 更新 tf 网络信息 Status status = client.update(vn); if (!status.isSuccess()) { - completion.fail(operr("delete dns from to l3 network[name:%s] on tf controller failed due to:%s", l3NetworkVO.getName(),status.getMsg())); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10031, "delete dns from to l3 network[name:%s] on tf controller failed due to:%s", l3NetworkVO.getName(),status.getMsg())); // completion.fail(operr("delete dns from to l3 network[name:%s] on tf controller failed due to:%s", l3NetworkVO.getName(),"tf api call failed")); } else { completion.success(); @@ -709,12 +710,12 @@ public void deleteL3Dns(L3NetworkVO l3NetworkVO, APIRemoveDnsFromL3NetworkMsg ms } else{ String message = String.format("delete dns from to l3 network[name:%s] on tf controller failed due to: %s ",l3NetworkVO.getName(), "tf virtual network is missing"); logger.error(message); - completion.fail(operr(message)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10032, message)); } } catch (Exception e){ String message = String.format("delete dns from l3 network[name:%s] on tf controller failed due to: %s ",l3NetworkVO.getName(), e.getMessage()); logger.error(message, e); - completion.fail(operr(message)); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10033, message)); } } diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/header/SugonApiInterceptor.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/header/SugonApiInterceptor.java index 18294d7463a..3f550c1146c 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/header/SugonApiInterceptor.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/header/SugonApiInterceptor.java @@ -21,6 +21,7 @@ import java.util.List; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class SugonApiInterceptor implements ApiMessageInterceptor, GlobalApiMessageInterceptor { @@ -46,7 +47,7 @@ private void validate(APIDeleteL2NetworkMsg msg) { .eq(L3NetworkVO_.type, SugonSdnControllerConstant.L3_TF_NETWORK_TYPE).count() > 0){ String error = String.format("L2Network[%s] still has some L3Networks, please delete L3Networks first.", msg.getL2NetworkUuid()); - evt.setError(operr(error)); + evt.setError(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_HEADER_10000, error)); bus.publish(evt); throw new StopRoutingException(); } @@ -58,7 +59,7 @@ private void validate(APIDeleteL3NetworkMsg msg) { .eq(VmNicVO_.type, VmInstanceConstant.TF_VIRTUAL_NIC_TYPE).count() > 0){ String error = String.format("L3Network[%s] still has some Nics, please delete all Nics first.", msg.getId()); - evt.setError(operr(error)); + evt.setError(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_HEADER_10001, error)); bus.publish(evt); throw new StopRoutingException(); } @@ -69,7 +70,7 @@ private void validate(APIRemoveSdnControllerMsg msg) { if(Q.New(L2NetworkVO.class).eq(L2NetworkVO_.type, SugonSdnControllerConstant.L2_TF_NETWORK_TYPE).count() > 0){ String error = String.format("There are some TfL2Networks exists, please delete all TfL2Networks first.", msg.getId()); - evt.setError(operr(error)); + evt.setError(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_HEADER_10002, error)); bus.publish(evt); throw new StopRoutingException(); } diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL2Network.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL2Network.java index 1855c797a32..b2c861251dc 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL2Network.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL2Network.java @@ -19,6 +19,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class TfL2Network extends L2NoVlanNetwork implements TfL2NetworkExtensionPoint{ @@ -80,7 +81,7 @@ public void success() { @Override public void fail(ErrorCode errorCode) { - reply.setError(err(SysErrors.DELETE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); + reply.setError(err(ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10016, SysErrors.DELETE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); bus.reply(msg, reply); } }); @@ -117,7 +118,7 @@ public void success() { @Override public void fail(ErrorCode errorCode) { - reply.setError(err(SysErrors.DELETE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); + reply.setError(err(ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10017, SysErrors.DELETE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); bus.reply(msg, reply); } }); @@ -200,7 +201,7 @@ public void success() { @Override public void fail(ErrorCode errorCode) { - evt.setError(err(SysErrors.DELETE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); + evt.setError(err(ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10018, SysErrors.DELETE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); bus.publish(evt); } }); diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL3Network.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL3Network.java index 8d9531ede52..af00595b93a 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL3Network.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL3Network.java @@ -26,6 +26,7 @@ import java.io.IOException; import static org.zstack.core.Platform.err; import static org.zstack.utils.network.NetworkUtils.getSubnetInfo; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * @description: @@ -112,13 +113,13 @@ public void success() { @Override public void fail(ErrorCode errorCode) { - evt.setError(err(SysErrors.DELETE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); + evt.setError(err(ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10000, SysErrors.DELETE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); bus.publish(evt); } }); } else{ - evt.setError(err(SysErrors.DELETE_RESOURCE_ERROR, "L3 Network is missing")); + evt.setError(err(ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10001, SysErrors.DELETE_RESOURCE_ERROR, "L3 Network is missing")); bus.publish(evt); } } @@ -137,13 +138,13 @@ public void success() { @Override public void fail(ErrorCode errorCode) { - evt.setError(err(SysErrors.DELETE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); + evt.setError(err(ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10002, SysErrors.DELETE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); bus.publish(evt); } }); } else{ - evt.setError(err(SysErrors.DELETE_RESOURCE_ERROR, "L3 Network is missing")); + evt.setError(err(ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10003, SysErrors.DELETE_RESOURCE_ERROR, "L3 Network is missing")); bus.publish(evt); } @@ -164,12 +165,12 @@ public void success() { @Override public void fail(ErrorCode errorCode) { - evt.setError(err(SysErrors.CREATE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); + evt.setError(err(ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10004, SysErrors.CREATE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); bus.publish(evt); } }); } else{ - evt.setError(err(SysErrors.CREATE_RESOURCE_ERROR, "L3 Network is missing")); + evt.setError(err(ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10005, SysErrors.CREATE_RESOURCE_ERROR, "L3 Network is missing")); bus.publish(evt); } } @@ -188,13 +189,13 @@ public void success() { @Override public void fail(ErrorCode errorCode) { - evt.setError(err(SysErrors.DELETE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); + evt.setError(err(ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10006, SysErrors.DELETE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); bus.publish(evt); } }); } else{ - evt.setError(err(SysErrors.DELETE_RESOURCE_ERROR, "L3 Network is missing")); + evt.setError(err(ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10007, SysErrors.DELETE_RESOURCE_ERROR, "L3 Network is missing")); bus.publish(evt); } } @@ -213,13 +214,13 @@ public void success() { @Override public void fail(ErrorCode errorCode) { - evt.setError(err(SysErrors.CREATE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); + evt.setError(err(ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10008, SysErrors.CREATE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); bus.publish(evt); } }); } else{ - evt.setError(err(SysErrors.CREATE_RESOURCE_ERROR, "L3 Network is missing")); + evt.setError(err(ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10009, SysErrors.CREATE_RESOURCE_ERROR, "L3 Network is missing")); bus.publish(evt); } } @@ -238,13 +239,13 @@ public void success() { @Override public void fail(ErrorCode errorCode) { - evt.setError(err(SysErrors.CREATE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); + evt.setError(err(ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10010, SysErrors.CREATE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); bus.publish(evt); } }); } else{ - evt.setError(err(SysErrors.CREATE_RESOURCE_ERROR, "L3 Network is missing")); + evt.setError(err(ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10011, SysErrors.CREATE_RESOURCE_ERROR, "L3 Network is missing")); bus.publish(evt); } } @@ -263,13 +264,13 @@ public void success() { @Override public void fail(ErrorCode errorCode) { - evt.setError(err(SysErrors.CREATE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); + evt.setError(err(ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10012, SysErrors.CREATE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); bus.publish(evt); } }); } else{ - evt.setError(err(SysErrors.CREATE_RESOURCE_ERROR, "L3 Network is missing")); + evt.setError(err(ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10013, SysErrors.CREATE_RESOURCE_ERROR, "L3 Network is missing")); bus.publish(evt); } } @@ -289,13 +290,13 @@ public void success() { @Override public void fail(ErrorCode errorCode) { - evt.setError(err(SysErrors.DELETE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); + evt.setError(err(ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10014, SysErrors.DELETE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); bus.publish(evt); } }); } else{ - evt.setError(err(SysErrors.DELETE_RESOURCE_ERROR, "L3 Network is missing")); + evt.setError(err(ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10015, SysErrors.DELETE_RESOURCE_ERROR, "L3 Network is missing")); bus.publish(evt); } } diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfMigrateVmBackend.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfMigrateVmBackend.java index a470ea272af..91a9728d824 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfMigrateVmBackend.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfMigrateVmBackend.java @@ -27,6 +27,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class TfMigrateVmBackend implements VmInstanceMigrateExtensionPoint, VmPreMigrationExtensionPoint { @@ -153,7 +154,7 @@ private void notifySugonSdn(VmInstanceInventory inv, String destHostUuid, String if (!reply.isSuccess()) { logger.error(String.format("notifySugonSdn: failed to notify sugon sdn to %s vrouter for vm [uuid:%s], %s", operate, inv.getUuid(), reply.getError())); - throw new OperationFailureException(operr("notifySugonSdn: failed to notify sugon sdn to %s vrouter for vm [uuid:%s], on the destination host[uuid:%s]", + throw new OperationFailureException(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10019, "notifySugonSdn: failed to notify sugon sdn to %s vrouter for vm [uuid:%s], on the destination host[uuid:%s]", operate, inv.getUuid(), destHostUuid).causedBy(reply.getError())); } @@ -162,7 +163,7 @@ private void notifySugonSdn(VmInstanceInventory inv, String destHostUuid, String if (!rsp.isSuccess()) { logger.error(String.format("notifySugonSdn: failed to notify sugon sdn to %s vrouter for vm [uuid:%s], %s", operate, inv.getUuid(), rsp.getError())); - throw new OperationFailureException(operr("notifySugonSdn: failed to notify sugon sdn to %s vrouter for vm [uuid:%s], on the destination host[uuid:%s], error is:%s", + throw new OperationFailureException(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10020, "notifySugonSdn: failed to notify sugon sdn to %s vrouter for vm [uuid:%s], on the destination host[uuid:%s], error is:%s", operate, inv.getUuid(), destHostUuid, rsp.getError())); } logger.info(String.format("notifySugonSdn: successfully to notify sugon sdn to %s vrouter for vm[uuid:%s]", operate, inv.getUuid())); diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/userdata/TfUserdataBackend.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/userdata/TfUserdataBackend.java index ff2c5189a0a..fd91daf5e63 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/userdata/TfUserdataBackend.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/userdata/TfUserdataBackend.java @@ -44,6 +44,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by fuwei on 11/15/2022. @@ -188,7 +189,7 @@ public void run(final FlowTrigger trigger, Map data) { @Override public ErrorCode getError(KvmResponseWrapper wrapper) { AgentResponse rsp = wrapper.getResponse(AgentResponse.class); - return rsp.isSuccess() ? null : operr("operation error, because:%s", rsp.getError()); + return rsp.isSuccess() ? null : operr(ORG_ZSTACK_SUGONSDNCONTROLLER_USERDATA_10000, "operation error, because:%s", rsp.getError()); } }, new ReturnValueCompletion(trigger) { @Override @@ -263,7 +264,7 @@ protected void triggerNow(GCCompletion completion) { } if (status != HostStatus.Connected) { - completion.fail(operr("host[uuid:%s] is not connected", struct.getHostUuid())); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_USERDATA_10001, "host[uuid:%s] is not connected", struct.getHostUuid())); return; } @@ -288,7 +289,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply r = reply.castReply(); ReleaseUserdataRsp rsp = r.toResponse(ReleaseUserdataRsp.class); if (!rsp.isSuccess()) { - completion.fail(operr("operation error, because:%s", rsp.getError())); + completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_USERDATA_10002, "operation error, because:%s", rsp.getError())); return; } @@ -469,7 +470,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply r = reply.castReply(); ApplyUserdataRsp rsp = r.toResponse(ApplyUserdataRsp.class); if (!rsp.isSuccess()) { - trigger.fail(operr("operation error, because:%s", rsp.getError())); + trigger.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_USERDATA_10003, "operation error, because:%s", rsp.getError())); return; } @@ -535,7 +536,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply r = reply.castReply(); ReleaseUserdataRsp rsp = r.toResponse(ReleaseUserdataRsp.class); if (!rsp.isSuccess()) { - trigger.fail(operr("operation error, because:%s", rsp.getError())); + trigger.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_USERDATA_10004, "operation error, because:%s", rsp.getError())); return; } diff --git a/plugin/vhost/src/main/java/org/zstack/vhost/kvm/KvmVhostNodeServer.java b/plugin/vhost/src/main/java/org/zstack/vhost/kvm/KvmVhostNodeServer.java index 4e7ed6425a9..8de40283c07 100644 --- a/plugin/vhost/src/main/java/org/zstack/vhost/kvm/KvmVhostNodeServer.java +++ b/plugin/vhost/src/main/java/org/zstack/vhost/kvm/KvmVhostNodeServer.java @@ -25,6 +25,7 @@ import java.util.Map; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class KvmVhostNodeServer implements Component, KVMStartVmExtensionPoint, KVMConvertVolumeExtensionPoint, KVMDetachVolumeExtensionPoint, KVMAttachVolumeExtensionPoint { @@ -115,12 +116,12 @@ private VolumeTO convertVolumeIfNeeded(VolumeInventory volumeInventory, HostInve if (!volumeTO.isUseVirtio()) { throw new OperationFailureException( - argerr("vhostuser disk only support virtio mode, check image platform has virtio driver or not")); + argerr(ORG_ZSTACK_VHOST_KVM_10000, "vhostuser disk only support virtio mode, check image platform has virtio driver or not")); } if (volumeTO.isUseVirtioSCSI()) { throw new OperationFailureException( - argerr("vhostuser disk not support virtio-scsi mode, please turn off virtio-scsi mode")); + argerr(ORG_ZSTACK_VHOST_KVM_10001, "vhostuser disk not support virtio-scsi mode, please turn off virtio-scsi mode")); } PrimaryStorageNodeSvc nodeSvc = getNodeService(volumeInventory); diff --git a/plugin/vip/src/main/java/org/zstack/network/service/vip/VipApiInterceptor.java b/plugin/vip/src/main/java/org/zstack/network/service/vip/VipApiInterceptor.java index b4ca7a267c0..ae04da5813e 100755 --- a/plugin/vip/src/main/java/org/zstack/network/service/vip/VipApiInterceptor.java +++ b/plugin/vip/src/main/java/org/zstack/network/service/vip/VipApiInterceptor.java @@ -30,8 +30,9 @@ import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; -/** +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*;/** */ + public class VipApiInterceptor implements ApiMessageInterceptor, GlobalApiMessageInterceptor { @Autowired private ErrorFacade errf; @@ -78,10 +79,10 @@ private void checkVipBelongToAccount(String vipUuid, String accountUuid) { List accessibleUuids = acntMgr.getResourceUuidsCanAccessByAccount(accountUuid, VipVO.class); if (accessibleUuids == null || accessibleUuids.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("account have no vips")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIP_10001, "account have no vips")); } if (!accessibleUuids.contains(vipUuid)) { - throw new ApiMessageInterceptionException(argerr("vip can not be accessed by this account")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIP_10002, "vip can not be accessed by this account")); } } } @@ -101,7 +102,7 @@ private void validate(APIDeleteIpAddressMsg msg) { UsedIpVO ip = dbf.findByUuid(uuid, UsedIpVO.class); if (Q.New(VipVO.class).eq(VipVO_.l3NetworkUuid, ip.getL3NetworkUuid()) .eq(VipVO_.ip, ip.getIp()).isExists()) { - throw new ApiMessageInterceptionException(argerr("could delete ip, because ip[uuid:%s] is a vip", ip.getIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIP_10003, "could delete ip, because ip[uuid:%s] is a vip", ip.getIp())); } } } @@ -109,35 +110,35 @@ private void validate(APIDeleteIpAddressMsg msg) { private void validate(APIDeleteVipMsg msg) { VipVO vipVO = dbf.findByUuid(msg.getVipUuid(), VipVO.class); if (vipMgr.isSystemVip(vipVO)) { - throw new ApiMessageInterceptionException(argerr("system vip can not be deleted by API message")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIP_10004, "system vip can not be deleted by API message")); } } private void validate(APICreateVipMsg msg) { if (msg.getAllocatorStrategy() != null && !IpAllocatorType.hasType(msg.getAllocatorStrategy())) { - throw new ApiMessageInterceptionException(argerr("unsupported ip allocation strategy[%s]", msg.getAllocatorStrategy())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIP_10005, "unsupported ip allocation strategy[%s]", msg.getAllocatorStrategy())); } L3NetworkVO l3NetworkVO = dbf.findByUuid(msg.getL3NetworkUuid(), L3NetworkVO.class); if (msg.getRequiredIp() != null) { if (NetworkUtils.isIpv4Address(msg.getRequiredIp()) && !l3NetworkVO.getIpVersions().contains(IPv6Constants.IPv4)) { - throw new ApiMessageInterceptionException(argerr("requiredIp[%s] is not in valid IPv4 mediaType", msg.getRequiredIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIP_10006, "requiredIp[%s] is not in valid IPv4 mediaType", msg.getRequiredIp())); } if (IPv6NetworkUtils.isIpv6Address(msg.getRequiredIp()) && !l3NetworkVO.getIpVersions().contains(IPv6Constants.IPv6)) { - throw new ApiMessageInterceptionException(argerr("requiredIp[%s] is not in valid IPv4 mediaType", msg.getRequiredIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIP_10007, "requiredIp[%s] is not in valid IPv4 mediaType", msg.getRequiredIp())); } SimpleQuery q = dbf.createQuery(VipVO.class); q.add(VipVO_.ip, Op.EQ, msg.getRequiredIp()); q.add(VipVO_.l3NetworkUuid, Op.EQ, msg.getL3NetworkUuid()); if (q.isExists()) { - throw new ApiMessageInterceptionException(operr("there is already a vip[%s] on l3Network[uuid:%s]", msg.getRequiredIp(), msg.getL3NetworkUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_VIP_10008, "there is already a vip[%s] on l3Network[uuid:%s]", msg.getRequiredIp(), msg.getL3NetworkUuid())); } UsedIpVO usedIpVO = Q.New(UsedIpVO.class).eq(UsedIpVO_.ip, msg.getRequiredIp()) .eq(UsedIpVO_.l3NetworkUuid, msg.getL3NetworkUuid()).find(); if (usedIpVO != null && !msg.isSystem()) { - throw new ApiMessageInterceptionException(operr("required ip address [%s] is already used", msg.getRequiredIp())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_VIP_10009, "required ip address [%s] is already used", msg.getRequiredIp())); } if (NetworkUtils.isIpv4Address(msg.getRequiredIp())) { @@ -161,7 +162,7 @@ private void validate(APICreateVipMsg msg) { } if (msg.getIpVersion() == null) { - throw new ApiMessageInterceptionException(operr("could not create vip, because can not determine the vip version")); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_VIP_10010, "could not create vip, because can not determine the vip version")); } } } diff --git a/plugin/vip/src/main/java/org/zstack/network/service/vip/VipBase.java b/plugin/vip/src/main/java/org/zstack/network/service/vip/VipBase.java index 866c5220760..2a8e4df5cce 100755 --- a/plugin/vip/src/main/java/org/zstack/network/service/vip/VipBase.java +++ b/plugin/vip/src/main/java/org/zstack/network/service/vip/VipBase.java @@ -54,6 +54,7 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.err; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by xing5 on 2016/11/19. @@ -100,7 +101,7 @@ public VipBase(VipVO self) { protected void refresh() { VipVO vo = dbf.reload(self); if (vo == null) { - throw new OperationFailureException(err(SysErrors.RESOURCE_NOT_FOUND, + throw new OperationFailureException(err(ORG_ZSTACK_NETWORK_SERVICE_VIP_10011, SysErrors.RESOURCE_NOT_FOUND, "cannot find the vip[name:%s, uuid:%s, ip:%s], it may have been deleted", self.getName(), self.getUuid(), self.getIp() )); @@ -153,7 +154,7 @@ protected boolean acquireCheckModifyVipAttributeStruct(ModifyVipAttributesStruct if (s.isServiceProvider()) { if (self.getServiceProvider() != null && s.getServiceProvider() != null && !s.getServiceProvider().equals(self.getServiceProvider())) { - throw new OperationFailureException(operr("service provider of the vip[uuid:%s, name:%s, ip: %s] has been set to %s", + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_VIP_10012, "service provider of the vip[uuid:%s, name:%s, ip: %s] has been set to %s", self.getUuid(), self.getName(), self.getIp(), self.getServiceProvider())); } self.setServiceProvider(s.getServiceProvider()); @@ -165,7 +166,7 @@ protected boolean acquireCheckModifyVipAttributeStruct(ModifyVipAttributesStruct s.getPeerL3NetworkUuids().forEach(this::addPeerL3NetworkUuid); } } catch (CloudRuntimeException e) { - throw new OperationFailureException(operr(e.getMessage())); + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_VIP_10013, e.getMessage())); } } @@ -362,7 +363,7 @@ protected void releaseVip(ModifyVipAttributesStruct s, Boolean releaseServices, s.getPeerL3NetworkUuids().forEach(this::deletePeerL3Network); } } catch (CloudRuntimeException e) { - throw new OperationFailureException(operr(e.getMessage())); + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_VIP_10014, e.getMessage())); } /* no need to remove vip from backend */ completion.success(); @@ -806,7 +807,7 @@ public void handle(Map data) { error(new FlowErrorHandler(msg) { @Override public void handle(ErrorCode errCode, Map data) { - evt.setError(err(SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); + evt.setError(err(ORG_ZSTACK_NETWORK_SERVICE_VIP_10015, SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); bus.publish(evt); } }); diff --git a/plugin/vip/src/main/java/org/zstack/network/service/vip/VipManagerImpl.java b/plugin/vip/src/main/java/org/zstack/network/service/vip/VipManagerImpl.java index f363dadb162..c4d1e40fbcf 100755 --- a/plugin/vip/src/main/java/org/zstack/network/service/vip/VipManagerImpl.java +++ b/plugin/vip/src/main/java/org/zstack/network/service/vip/VipManagerImpl.java @@ -56,6 +56,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -160,7 +161,7 @@ public void handleMessage(Message msg) { private void passThrough(VipMessage msg) { VipVO vip = dbf.findByUuid(msg.getVipUuid(), VipVO.class); if (vip == null) { - throw new OperationFailureException(err(SysErrors.RESOURCE_NOT_FOUND, + throw new OperationFailureException(err(ORG_ZSTACK_NETWORK_SERVICE_VIP_10000, SysErrors.RESOURCE_NOT_FOUND, "cannot find the vip[uuid:%s], it may have been deleted", msg.getVipUuid() )); } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java index 427a32cb6cb..de4468664dd 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java @@ -60,6 +60,7 @@ import static org.zstack.network.service.virtualrouter.VirtualRouterConstant.VR_CHANGE_DEFAULT_ROUTE_JOB; import static org.zstack.network.service.virtualrouter.VirtualRouterNicMetaData.ADDITIONAL_PUBLIC_NIC_MASK; import static org.zstack.network.service.virtualrouter.VirtualRouterNicMetaData.GUEST_NIC_MASK; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -225,7 +226,7 @@ public void success(PingRsp ret) { reply.setConnected(connected); reply.setHaStatus(ret.getHaStatus()); if ((ret.getHealthy() != null) && (!ret.getHealthy()) && (ret.getHealthDetail() != null)) { - fireServiceUnhealthyCanonicalEvent(inerr("virtual router %s unhealthy, detail %s", getSelf().getUuid(), ret.getHealthDetail())); + fireServiceUnhealthyCanonicalEvent(inerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10016, "virtual router %s unhealthy, detail %s", getSelf().getUuid(), ret.getHealthDetail())); } else { fireServicehealthyCanonicalEvent(); } @@ -670,17 +671,17 @@ public void run(final SyncTaskChain chain) { final VirtualRouterAsyncHttpCallReply reply = new VirtualRouterAsyncHttpCallReply(); if (msg.isCheckStatus() && getSelf().getState() != VmInstanceState.Running) { - throw new OperationFailureException(operr("the virtual router[name:%s, uuid:%s, current state:%s] is not running," + + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10017, "the virtual router[name:%s, uuid:%s, current state:%s] is not running," + "and cannot perform required operation. Please retry your operation later once it is running", self.getName(), self.getUuid(), self.getState())); } if (msg.isCheckStatus() && getSelf().getStatus() != ApplianceVmStatus.Connected) { - throw new OperationFailureException(operr("virtual router[uuid:%s] is in status of %s that cannot make http call to %s", + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10018, "virtual router[uuid:%s] is in status of %s that cannot make http call to %s", self.getUuid(), getSelf().getStatus(), msg.getPath())); } if (vr.getManagementNic() == null) { - throw new OperationFailureException(operr("virtual router[uuid:%s] has no management nic that cannot make http call to %s", + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10019, "virtual router[uuid:%s] has no management nic that cannot make http call to %s", self.getUuid(), msg.getPath())); } @@ -1027,7 +1028,7 @@ public void run(MessageReply reply) { info.getIp(), info.getIp6(), info.getMac(), vr.getUuid(), vr.getManagementNic().getIp())); trigger.next(); } else { - ErrorCode err = operr("unable to add nic[ip:%s, ip6:%s, mac:%s] to virtual router vm[uuid:%s ip:%s], because %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10020, "unable to add nic[ip:%s, ip6:%s, mac:%s] to virtual router vm[uuid:%s ip:%s], because %s", info.getIp(), info.getIp6(), info.getMac(), vr.getUuid(), vr.getManagementNic().getIp(), rsp.getError()); trigger.fail(err); } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterApiInterceptor.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterApiInterceptor.java index e448363b030..ea2e5ba66bb 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterApiInterceptor.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterApiInterceptor.java @@ -45,6 +45,7 @@ import static org.zstack.core.Platform.*; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -102,7 +103,7 @@ private void validate(APIAddBackendServerToServerGroupMsg msg) { if (msg.getVmNics().isEmpty()) { boolean vrExist = Q.New(VirtualRouterLoadBalancerRefVO.class).eq(VirtualRouterLoadBalancerRefVO_.loadBalancerUuid, msg.getLoadBalancerUuid()).isExists(); if (!vrExist) { - throw new ApiMessageInterceptionException(argerr("could not add server ip to load balancer server group, because share lb has no service provider, please add vmnic first")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10021, "could not add server ip to load balancer server group, because share lb has no service provider, please add vmnic first")); } } } @@ -111,7 +112,7 @@ private void validate(APIUpdateVirtualRouterMsg msg) { VirtualRouterVmVO vrVO = dbf.findByUuid(msg.getVmInstanceUuid(), VirtualRouterVmVO.class); if (msg.getDefaultRouteL3NetworkUuid().equals(vrVO.getDefaultRouteL3NetworkUuid())) { - throw new ApiMessageInterceptionException(argerr("l3 uuid[:%s] is same to default network of virtual router [uuid:%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10022, "l3 uuid[:%s] is same to default network of virtual router [uuid:%s]", msg.getDefaultRouteL3NetworkUuid(), msg.getVmInstanceUuid())); } @@ -124,14 +125,14 @@ private void validate(APIUpdateVirtualRouterMsg msg) { } if (target == null) { - throw new ApiMessageInterceptionException(argerr("l3 uuid[:%s] is not attached to virtual router [uuid:%s]", msg.getDefaultRouteL3NetworkUuid(), msg.getVmInstanceUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10023, "l3 uuid[:%s] is not attached to virtual router [uuid:%s]", msg.getDefaultRouteL3NetworkUuid(), msg.getVmInstanceUuid())); } if (!VirtualRouterNicMetaData.isPublicNic(target) && !VirtualRouterNicMetaData.isAddinitionalPublicNic(target)) { if (VirtualRouterNicMetaData.isManagementNic(target)) { - throw new ApiMessageInterceptionException(argerr("could not set the default network, because l3 uuid[:%s] is management network", msg.getDefaultRouteL3NetworkUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10024, "could not set the default network, because l3 uuid[:%s] is management network", msg.getDefaultRouteL3NetworkUuid())); } else { - throw new ApiMessageInterceptionException(argerr("could not set the default network, because l3 uuid[:%s] is not public network", msg.getDefaultRouteL3NetworkUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10025, "could not set the default network, because l3 uuid[:%s] is not public network", msg.getDefaultRouteL3NetworkUuid())); } } } @@ -139,7 +140,7 @@ private void validate(APIUpdateVirtualRouterMsg msg) { private void validate(APIUpdateVirtualRouterOfferingMsg msg) { if (msg.getIsDefault() != null) { if (!new QuotaUtil().isAdminAccount(msg.getSession().getAccountUuid())) { - throw new ApiMessageInterceptionException(err(IdentityErrors.PERMISSION_DENIED, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10026, IdentityErrors.PERMISSION_DENIED, "cannot change the default field of a virtual router offering; only admin can do the operation" )); } @@ -154,12 +155,12 @@ private void validate(APIUpdateVirtualRouterOfferingMsg msg) { String format = t.get(1, String.class); if (type != ImageMediaType.RootVolumeTemplate) { - throw new ApiMessageInterceptionException(argerr("image[uuid:%s]'s mediaType is %s, the mediaType of a virtual router image must be %s", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10027, "image[uuid:%s]'s mediaType is %s, the mediaType of a virtual router image must be %s", msg.getImageUuid(), type, ImageMediaType.RootVolumeTemplate)); } if (ImageConstant.ISO_FORMAT_STRING.equals(format)) { - throw new ApiMessageInterceptionException(argerr("image[uuid:%s] is of format %s, cannot be used for virtual router", msg.getImageUuid(), format)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10028, "image[uuid:%s] is of format %s, cannot be used for virtual router", msg.getImageUuid(), format)); } } } @@ -196,7 +197,7 @@ private boolean isNetworkAddressInCidr(String networkUuid1, String networkUuid2) private void validate(APICreateVirtualRouterOfferingMsg msg) { if (msg.isDefault() != null) { if (!new QuotaUtil().isAdminAccount(msg.getSession().getAccountUuid())) { - throw new ApiMessageInterceptionException(err(IdentityErrors.PERMISSION_DENIED, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10029, IdentityErrors.PERMISSION_DENIED, "cannot create a virtual router offering with the default field set; only admin can do the operation" )); } @@ -208,12 +209,12 @@ private void validate(APICreateVirtualRouterOfferingMsg msg) { L3NetworkVO mgtL3 = dbf.findByUuid(msg.getManagementNetworkUuid(), L3NetworkVO.class); if (!mgtL3.getZoneUuid().equals(msg.getZoneUuid())) { - throw new ApiMessageInterceptionException(argerr("management network[uuid:%s] is not in the same zone[uuid:%s] this offering is going to create", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10030, "management network[uuid:%s] is not in the same zone[uuid:%s] this offering is going to create", msg.getManagementNetworkUuid(), msg.getZoneUuid())); } /* mgt network does not support ipv6 yet, TODO, will be implemented soon */ if (mgtL3.getIpVersions().contains(IPv6Constants.IPv6) && !mgtL3.getIpVersions().contains(IPv6Constants.IPv4)) { - throw new ApiMessageInterceptionException(argerr("can not create virtual router offering, because management network doesn't support ipv6 yet")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10031, "can not create virtual router offering, because management network doesn't support ipv6 yet")); } if (!CoreGlobalProperty.UNIT_TEST_ON) { @@ -225,7 +226,7 @@ private void validate(APICreateVirtualRouterOfferingMsg msg) { q.add(L3NetworkVO_.uuid, Op.EQ, msg.getPublicNetworkUuid()); String zoneUuid = q.findValue(); if (!zoneUuid.equals(msg.getZoneUuid())) { - throw new ApiMessageInterceptionException(argerr("public network[uuid:%s] is not in the same zone[uuid:%s] this offering is going to create", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10032, "public network[uuid:%s] is not in the same zone[uuid:%s] this offering is going to create", msg.getManagementNetworkUuid(), msg.getZoneUuid())); } @@ -236,13 +237,13 @@ private void validate(APICreateVirtualRouterOfferingMsg msg) { ImageMediaType type = t.get(0, ImageMediaType.class); if (type != ImageMediaType.RootVolumeTemplate) { - throw new ApiMessageInterceptionException(argerr("image[uuid:%s]'s mediaType is %s, the mediaType of a virtual router image must be %s", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10033, "image[uuid:%s]'s mediaType is %s, the mediaType of a virtual router image must be %s", msg.getImageUuid(), type, ImageMediaType.RootVolumeTemplate)); } String format = t.get(1, String.class); if (ImageConstant.ISO_FORMAT_STRING.equals(format)) { - throw new ApiMessageInterceptionException(argerr("image[uuid:%s] is of format %s, cannot be used for virtual router", msg.getImageUuid(), format)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10034, "image[uuid:%s] is of format %s, cannot be used for virtual router", msg.getImageUuid(), format)); } SimpleQuery nq = dbf.createQuery(NetworkServiceL3NetworkRefVO.class); @@ -251,16 +252,16 @@ private void validate(APICreateVirtualRouterOfferingMsg msg) { for (NetworkServiceL3NetworkRefVO nref : nrefs) { if (NetworkServiceType.SNAT.toString().equals(nref.getNetworkServiceType())) { if (nref.getL3NetworkUuid().equals(msg.getManagementNetworkUuid())) { - throw new ApiMessageInterceptionException(argerr("the L3 network[uuid: %s] has the SNAT service enabled, it cannot be used as a management network", msg.getManagementNetworkUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10035, "the L3 network[uuid: %s] has the SNAT service enabled, it cannot be used as a management network", msg.getManagementNetworkUuid())); } else if (nref.getL3NetworkUuid().equals(msg.getPublicNetworkUuid())) { - throw new ApiMessageInterceptionException(argerr("the L3 network[uuid: %s] has the SNAT service enabled, it cannot be used as a public network", msg.getPublicNetworkUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10036, "the L3 network[uuid: %s] has the SNAT service enabled, it cannot be used as a public network", msg.getPublicNetworkUuid())); } } } if (!msg.getManagementNetworkUuid().equals(msg.getPublicNetworkUuid())) { if (isNetworkAddressInCidr(msg.getManagementNetworkUuid(), msg.getPublicNetworkUuid())) { - throw new ApiMessageInterceptionException(argerr("the L3 network[uuid: %s] is same network address with [uuid: %s], it cannot be used for virtual router", msg.getManagementNetworkUuid(),msg.getPublicNetworkUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10037, "the L3 network[uuid: %s] is same network address with [uuid: %s], it cannot be used for virtual router", msg.getManagementNetworkUuid(),msg.getPublicNetworkUuid())); } } } @@ -270,7 +271,7 @@ private void checkIfManagementNetworkReachable(String managementNetworkUuid) { q.add(NormalIpRangeVO_.l3NetworkUuid, Op.EQ, managementNetworkUuid); List iprs = q.list(); if (iprs.isEmpty()) { - throw new ApiMessageInterceptionException(operr("the management network[uuid:%s] doesn't have any IP range", managementNetworkUuid)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10038, "the management network[uuid:%s] doesn't have any IP range", managementNetworkUuid)); } String startIp = iprs.get(0).getStartIp(); @@ -291,7 +292,7 @@ private void checkIfManagementNetworkReachable(String managementNetworkUuid) { } } - throw new ApiMessageInterceptionException(argerr("the management network[uuid:%s, gateway:%s] is not reachable", managementNetworkUuid, gateway)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10039, "the management network[uuid:%s, gateway:%s] is not reachable", managementNetworkUuid, gateway)); } private void validate(APIQueryVirtualRouterOfferingMsg msg) { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterKvmBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterKvmBackend.java index 546ad88148b..8081388db58 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterKvmBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterKvmBackend.java @@ -26,6 +26,7 @@ import java.util.List; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class VirtualRouterKvmBackend implements VirtualRouterHypervisorBackend { private static final CLogger logger = Utils.getLogger(VirtualRouterKvmBackend.class); @@ -100,7 +101,7 @@ public void run(MessageReply reply) { CreateVritualRouterBootstrapIsoRsp rsp = ((KVMHostAsyncHttpCallReply)reply).toResponse(CreateVritualRouterBootstrapIsoRsp.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("failed to create VirtualRouterBootstrapIso[%s] on kvm host[uuid:%s, ip:%s] for virtual router[uuid:%s], because %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10000, "failed to create VirtualRouterBootstrapIso[%s] on kvm host[uuid:%s, ip:%s] for virtual router[uuid:%s], because %s", iso.getIsoPath(), vrSpec.getDestHost().getUuid(), vrSpec.getDestHost().getManagementIp(), iso.getVirtualRouterUuid(), rsp.getError()); complete.fail(err); @@ -133,7 +134,7 @@ public void run(MessageReply reply) { DeleteVirtualRouterBootstrapIsoRsp rsp = ((KVMHostAsyncHttpCallReply)reply).toResponse(DeleteVirtualRouterBootstrapIsoRsp.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("failed to delete VirtualRouterBootstrapIso[%s] on kvm host[uuid:%s] for virtual router[uuid:%s], because %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10001, "failed to delete VirtualRouterBootstrapIso[%s] on kvm host[uuid:%s] for virtual router[uuid:%s], because %s", iso.getIsoPath(), hostUuid, iso.getVirtualRouterUuid(), rsp.getError()); complete.fail(err); diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java index 44a997a68ed..610331e5f6c 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java @@ -102,6 +102,7 @@ import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; import static org.zstack.utils.VipUseForList.SNAT_NETWORK_SERVICE_TYPE; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class VirtualRouterManagerImpl extends AbstractService implements VirtualRouterManager, PrepareDbInitialValueExtensionPoint, L2NetworkCreateExtensionPoint, @@ -284,7 +285,7 @@ private void checkIsIpRangeOverlap(){ pubEndIp = pubIprange.getEndIp(); if(NetworkUtils.isIpv4RangeOverlap(priStartIp,priEndIp,pubStartIp,pubEndIp)){ - throw new OperationFailureException(argerr("cannot create virtual Router vm while virtual router network overlaps with private network in ip ")); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10002, "cannot create virtual Router vm while virtual router network overlaps with private network in ip ")); } } @@ -303,7 +304,7 @@ public String call() { }.call()); if (neededService.contains(NetworkServiceType.SNAT.toString()) && offering.getPublicNetworkUuid() == null) { - ErrorCode err = err(VirtualRouterErrors.NO_PUBLIC_NETWORK_IN_OFFERING, "L3Network[uuid:%s, name:%s] requires SNAT service, but default virtual router offering[uuid:%s, name:%s] doesn't have a public network", l3Network.getUuid(), l3Network.getName(), offering.getUuid(), offering.getName()); + ErrorCode err = err(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10003, VirtualRouterErrors.NO_PUBLIC_NETWORK_IN_OFFERING, "L3Network[uuid:%s, name:%s] requires SNAT service, but default virtual router offering[uuid:%s, name:%s] doesn't have a public network", l3Network.getUuid(), l3Network.getName(), offering.getUuid(), offering.getName()); logger.warn(err.getDetails()); failAndReply(err); return; @@ -729,11 +730,11 @@ private void validateVirtualRouterOffering(String sysTag, String resourceUuid) { String offeringUuid = VirtualRouterSystemTags.VIRTUAL_ROUTER_OFFERING.getTokenByTag(sysTag, VirtualRouterSystemTags.VIRTUAL_ROUTER_OFFERING_TOKEN); VirtualRouterOfferingVO offeringVO = dbf.findByUuid(offeringUuid, VirtualRouterOfferingVO.class); if (offeringVO == null) { - throw new ApiMessageInterceptionException(argerr("No virtual router instance offering with uuid:%s is found", offeringUuid)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10004, "No virtual router instance offering with uuid:%s is found", offeringUuid)); } if (resourceUuid != null && resourceUuid.equals(offeringVO.getPublicNetworkUuid())) { - throw new ApiMessageInterceptionException(argerr("the network of virtual router instance offering with uuid:%s can't be same with private l3 network uuid:%s", offeringUuid, resourceUuid)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10005, "the network of virtual router instance offering with uuid:%s can't be same with private l3 network uuid:%s", offeringUuid, resourceUuid)); } } @@ -1161,7 +1162,7 @@ public void done(ErrorCodeList errorCodeList) { List offerings = findOfferingByGuestL3Network(l3Nw); if (offerings == null) { - ErrorCode err = err(VirtualRouterErrors.NO_DEFAULT_OFFERING, "unable to find a virtual router offering for l3Network[uuid:%s] in zone[uuid:%s], please at least create a default virtual router offering in that zone", + ErrorCode err = err(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10006, VirtualRouterErrors.NO_DEFAULT_OFFERING, "unable to find a virtual router offering for l3Network[uuid:%s] in zone[uuid:%s], please at least create a default virtual router offering in that zone", l3Nw.getUuid(), l3Nw.getZoneUuid()); logger.warn(err.getDetails()); completion.fail(err); @@ -1238,7 +1239,7 @@ public void success(VirtualRouterVmInventory returnValue) { @Override public void fail(ErrorCode errorCode) { lock.unlock(); - completion.fail(operr("Failed to start vr l3[uuid: %s]", struct.getL3Network().getUuid()).causedBy(errorCode)); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10007, "Failed to start vr l3[uuid: %s]", struct.getL3Network().getUuid()).causedBy(errorCode)); chain.next(); } }); @@ -1452,12 +1453,12 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti void validateIpv6Range(String l3NetworkUuid) { if (Q.New(VirtualRouterOfferingVO.class).eq(VirtualRouterOfferingVO_.managementNetworkUuid, l3NetworkUuid).isExists()) { - throw new ApiMessageInterceptionException(argerr("cannot add ip range, because l3 network[uuid:%s] is " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10008, "cannot add ip range, because l3 network[uuid:%s] is " + "management network of virtual router offering",l3NetworkUuid)); } if (Q.New(VmNicVO.class).eq(VmNicVO_.l3NetworkUuid, l3NetworkUuid).in(VmNicVO_.metaData, VirtualRouterNicMetaData.MANAGEMENT_NIC_MASK_STRING_LIST).isExists()) { - throw new ApiMessageInterceptionException(argerr("cannot add ip range, because l3 network[uuid:%s] is " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10009, "cannot add ip range, because l3 network[uuid:%s] is " + "management network of virtual router", l3NetworkUuid)); } } @@ -1484,7 +1485,7 @@ private void validate(APIAddImageMsg msg) { try { ApplianceVmType.valueOf(type); } catch (Exception e) { - throw new ApiMessageInterceptionException(argerr("couldn't add image, because systemTag [%s] " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10010, "couldn't add image, because systemTag [%s] " + "includes invalid appliance image type [%s]", tag, type)); } } @@ -1522,11 +1523,11 @@ private void validate(APIAttachNetworkServiceToL3NetworkMsg msg) { } if (!snat && eip) { - throw new ApiMessageInterceptionException(argerr("failed tot attach virtual router network services to l3Network[uuid:%s]. When eip is selected, snat must be selected too", msg.getL3NetworkUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10011, "failed tot attach virtual router network services to l3Network[uuid:%s]. When eip is selected, snat must be selected too", msg.getL3NetworkUuid())); } if (!snat && portForwarding) { - throw new ApiMessageInterceptionException(argerr("failed tot attach virtual router network services to l3Network[uuid:%s]. When port forwarding is selected, snat must be selected too", msg.getL3NetworkUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10012, "failed tot attach virtual router network services to l3Network[uuid:%s]. When port forwarding is selected, snat must be selected too", msg.getL3NetworkUuid())); } } @@ -2473,7 +2474,7 @@ public void run(MessageReply reply) { VirtualRouterAsyncHttpCallReply re = reply.castReply(); VirtualRouterCommands.SetSNATRsp ret = re.toResponse(VirtualRouterCommands.SetSNATRsp.class); if (!ret.isSuccess()) { - ErrorCode err = operr("update virtual router [uuid:%s] default network failed, because %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10013, "update virtual router [uuid:%s] default network failed, because %s", vrUuid, ret.getError()); completion.fail(err); } else { @@ -2573,7 +2574,7 @@ public String convertFilterNameToZQL(String filterName) { ApplianceVmType.valueOf(ss[1]); return String.format("has ('applianceType::%s')", ss[1]); } catch (Exception e) { - throw new OperationFailureException(argerr("invalid ApplianceVmType %s", ss[1])); + throw new OperationFailureException(argerr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10014, "invalid ApplianceVmType %s", ss[1])); } } @@ -2704,7 +2705,7 @@ public void run(MessageReply reply) { VirtualRouterAsyncHttpCallReply re = reply.castReply(); CreateVipRsp ret = re.toResponse(CreateVipRsp.class); if (!ret.isSuccess()) { - ErrorCode err = operr("failed to sync vips[ips: %s] on virtual router[uuid:%s]" + + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10015, "failed to sync vips[ips: %s] on virtual router[uuid:%s]" + " for vr hot mirage, because %s", vips.stream().map(VipTO::getIp).collect(Collectors.toList()), inv.getUuid(), ret.getError()); diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/dhcp/VirtualRouterDhcpBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/dhcp/VirtualRouterDhcpBackend.java index b8c7d8f0b21..8f8f105b84d 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/dhcp/VirtualRouterDhcpBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/dhcp/VirtualRouterDhcpBackend.java @@ -41,6 +41,7 @@ import java.util.List; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class VirtualRouterDhcpBackend extends AbstractVirtualRouterBackend implements NetworkServiceDhcpBackend, VirtualRouterHaGetCallbackExtensionPoint { private final CLogger logger = Utils.getLogger(VirtualRouterDhcpBackend.class); @@ -91,7 +92,7 @@ public void run(MessageReply reply) { JSONObjectUtil.toJsonString(info), vr.getUuid(), vr.getManagementNic().getIp())); completion.success(); } else { - ErrorCode err = operr("unable to add dhcp entries to virtual router vm[uuid:%s ip:%s], because %s, dhcp entry[%s]", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10001, "unable to add dhcp entries to virtual router vm[uuid:%s ip:%s], because %s, dhcp entry[%s]", vr.getUuid(), vr.getManagementNic().getIp(), rsp.getError(), JSONObjectUtil.toJsonString(info)); completion.fail(err); } @@ -373,7 +374,7 @@ private void acquireVirtualRouterVmForDhcp(VirtualRouterStruct dhcpStruct, Retur if (vyosDhcpOnPublicNetwork) { VirtualRouterVmInventory vrInv = getVirtualRouterForVyosDhcp(l3Nw); if (vrInv == null) { - completion.fail(Platform.operr("no virtual router is configured for vyos dhcp")); + completion.fail(Platform.operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10002, "no virtual router is configured for vyos dhcp")); } else { completion.success(vrInv); } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/dhcp/VirtualRouterSyncDHCPOnStartFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/dhcp/VirtualRouterSyncDHCPOnStartFlow.java index d49a6b68c0d..4f48c6df73d 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/dhcp/VirtualRouterSyncDHCPOnStartFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/dhcp/VirtualRouterSyncDHCPOnStartFlow.java @@ -40,6 +40,7 @@ import java.util.*; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VirtualRouterSyncDHCPOnStartFlow implements Flow { @@ -205,7 +206,7 @@ public void run(MessageReply reply) { VirtualRouterAsyncHttpCallReply re = reply.castReply(); AddDhcpEntryRsp ret = re.toResponse(AddDhcpEntryRsp.class); if (!ret.isSuccess()) { - ErrorCode err = operr("unable to program dhcp entries served by virtual router[uuid:%s, ip:%s], %s", vr.getUuid(), vr.getManagementNic().getIp(), ret.getError()); + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10000, "unable to program dhcp entries served by virtual router[uuid:%s, ip:%s], %s", vr.getUuid(), vr.getManagementNic().getIp(), ret.getError()); chain.fail(err); } else { logger.debug(String.format("successfully programmed dhcp entries served by virtual router[uuid:%s, ip:%s]", vr.getUuid(), vr.getManagementNic().getIp())); diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/dns/VirtualRouterDnsBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/dns/VirtualRouterDnsBackend.java index e353dd052b8..33f5a4942e5 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/dns/VirtualRouterDnsBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/dns/VirtualRouterDnsBackend.java @@ -27,6 +27,7 @@ import java.util.*; import javax.persistence.Tuple; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -119,7 +120,7 @@ public void run(MessageReply reply) { VirtualRouterAsyncHttpCallReply r = reply.castReply(); SetDnsRsp rsp = r.toResponse(SetDnsRsp.class); if (!rsp.isSuccess()) { - completion.fail(operr("operation error, because:%s", rsp.getError())); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10001, "operation error, because:%s", rsp.getError())); return; } @@ -158,7 +159,7 @@ public void run(MessageReply reply) { VirtualRouterAsyncHttpCallReply r = reply.castReply(); RemoveDnsRsp rsp = r.toResponse(RemoveDnsRsp.class); if (!rsp.isSuccess()) { - completion.fail(operr("operation error, because:%s", rsp.getError())); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10002, "operation error, because:%s", rsp.getError())); return; } @@ -207,7 +208,7 @@ public void run(MessageReply reply) { .getIp())); applyDns(it, spec, completion); } else { - ErrorCode err = operr("virtual router[uuid:%s, ip:%s] failed to configure dns%s for L3Network[uuid:%s, name:%s], %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10003, "virtual router[uuid:%s, ip:%s] failed to configure dns%s for L3Network[uuid:%s, name:%s], %s", vr.getUuid(), vr.getManagementNic().getIp(), struct, l3.getUuid(), l3.getName(), ret.getError()); completion.fail(err); } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/dns/VirtualRouterSyncDnsOnStartFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/dns/VirtualRouterSyncDnsOnStartFlow.java index d7e1b8131c1..5f1095515ef 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/dns/VirtualRouterSyncDnsOnStartFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/dns/VirtualRouterSyncDnsOnStartFlow.java @@ -33,6 +33,7 @@ import static org.zstack.core.Platform.operr; import java.util.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VirtualRouterSyncDnsOnStartFlow extends NoRollbackFlow { @@ -124,7 +125,7 @@ public void run(MessageReply reply) { if (ret.isSuccess()) { chain.next(); } else { - ErrorCode err = operr("virtual router[name: %s, uuid: %s] failed to configure dns%s, %s ", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10000, "virtual router[name: %s, uuid: %s] failed to configure dns%s, %s ", vr.getName(), vr.getUuid(), JSONObjectUtil.toJsonString(dns), ret.getError()); chain.fail(err); } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterEipBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterEipBackend.java index 9c789ca1501..ffa18009a9c 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterEipBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterEipBackend.java @@ -43,6 +43,7 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -168,7 +169,7 @@ public void run(MessageReply reply) { fireFirewallEvent(vr.getUuid()); trigger.next(); } else { - trigger.fail(operr("failed to create eip[uuid:%s, name:%s, ip:%s] for vm nic[uuid:%s] on virtual router[uuid:%s], %s", + trigger.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10000, "failed to create eip[uuid:%s, name:%s, ip:%s] for vm nic[uuid:%s] on virtual router[uuid:%s], %s", struct.getEip().getUuid(), struct.getEip().getName(), struct.getVip().getIp(), struct.getNic().getUuid(), vr.getUuid(), ret.getError())); } @@ -226,7 +227,7 @@ public void applyEip(final EipStruct struct, final Completion completion) { @Override public void validate(VirtualRouterOfferingInventory offering) throws OperationFailureException { if (!offering.getPublicNetworkUuid().equals(struct.getVip().getL3NetworkUuid())) { - throw new OperationFailureException(operr("found a virtual router offering[uuid:%s] for L3Network[uuid:%s] in zone[uuid:%s]; however, the network's public network[uuid:%s] is not the same to EIP[uuid:%s]'s; you may need to use system tag" + + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10001, "found a virtual router offering[uuid:%s] for L3Network[uuid:%s] in zone[uuid:%s]; however, the network's public network[uuid:%s] is not the same to EIP[uuid:%s]'s; you may need to use system tag" + " guestL3Network::l3NetworkUuid to specify a particular virtual router offering for the L3Network", offering.getUuid(), l3inv.getUuid(), l3inv.getZoneUuid(), struct.getVip().getL3NetworkUuid(), struct.getEip().getUuid())); } } @@ -320,7 +321,7 @@ public void run(MessageReply reply) { VirtualRouterAsyncHttpCallReply re = reply.castReply(); RemoveEipRsp ret = re.toResponse(RemoveEipRsp.class); if (!ret.isSuccess()) { - ErrorCode err = operr("failed to remove eip[uuid:%s, name:%s, ip:%s] for vm nic[uuid:%s] on virtual router[uuid:%s], %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10002, "failed to remove eip[uuid:%s, name:%s, ip:%s] for vm nic[uuid:%s] on virtual router[uuid:%s], %s", struct.getEip().getUuid(), struct.getEip().getName(), struct.getVip().getIp(), struct.getNic().getUuid(), vr.getUuid(), ret.getError()); trigger.setError(err); @@ -481,7 +482,7 @@ public void run(MessageReply reply) { VirtualRouterAsyncHttpCallReply re = reply.castReply(); VirtualRouterCommands.SyncEipRsp ret = re.toResponse(VirtualRouterCommands.SyncEipRsp.class); if (!ret.isSuccess()) { - ErrorCode err = operr("failed to sync eip on virtual router[uuid:%s], %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10003, "failed to sync eip on virtual router[uuid:%s], %s", vr.getUuid(), ret.getError()); completion.fail(err); } else { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterSyncEipOnStartFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterSyncEipOnStartFlow.java index 6fdb051df5b..74d1ba7ed0e 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterSyncEipOnStartFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterSyncEipOnStartFlow.java @@ -39,6 +39,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -213,7 +214,7 @@ public void run(MessageReply reply) { VirtualRouterAsyncHttpCallReply re = reply.castReply(); SyncEipRsp ret = re.toResponse(SyncEipRsp.class); if (!ret.isSuccess()) { - ErrorCode err = operr("failed to sync eip on virtual router[uuid:%s], %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10004, "failed to sync eip on virtual router[uuid:%s], %s", vr.getUuid(), ret.getError()); trigger.fail(err); } else { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/ha/VirtualRouterHaBackendImpl.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/ha/VirtualRouterHaBackendImpl.java index e2356e811b6..cef2cd08b3a 100644 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/ha/VirtualRouterHaBackendImpl.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/ha/VirtualRouterHaBackendImpl.java @@ -20,6 +20,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class VirtualRouterHaBackendImpl implements VirtualRouterHaBackend, Component { @Autowired @@ -60,7 +61,7 @@ public void fail(ErrorCode errorCode) { public void virtualRouterOverlayMsgHandle(OverlayMessage message, Completion completion) { List exps = pluginRgty.getExtensionList(VirtualRouterHaGroupExtensionPoint.class); if (exps.isEmpty()) { - completion.fail(operr("ha group extension point nil")); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_HA_10000, "ha group extension point nil")); return; } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterLoadBalancerBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterLoadBalancerBackend.java index 3ee3d33449f..18706f859e7 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterLoadBalancerBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterLoadBalancerBackend.java @@ -72,6 +72,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 8/9/2015. @@ -174,7 +175,7 @@ private void validate(APIAddVmNicToLoadBalancerMsg msg) { } if (!valid) { throw new ApiMessageInterceptionException(argerr( - "new add vm nics[uuids:%s] and attached vmnics are not on the same vrouter, " + + ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10000, "new add vm nics[uuids:%s] and attached vmnics are not on the same vrouter, " + "they are on vrouters[uuids:%s]", msg.getVmNicUuids(), vrUuids)); } @@ -204,7 +205,7 @@ private void validate(APIAddVmNicToLoadBalancerMsg msg) { if (vrUuids.size() > 1 && !isVirtualRouterHaPair(new ArrayList<>(vrUuids))) { throw new ApiMessageInterceptionException(argerr( - "new add vm nics[uuids:%s] and peer l3s[uuids:%s] of loadbalancer[uuid: %s]'s vip are not on the same vrouter, " + + ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10001, "new add vm nics[uuids:%s] and peer l3s[uuids:%s] of loadbalancer[uuid: %s]'s vip are not on the same vrouter, " + "they are on vrouters[uuids:%s]", msg.getVmNicUuids(), peerL3NetworkUuids, msg.getLoadBalancerUuid(), vrUuids)); } } @@ -1086,7 +1087,7 @@ public void run(MessageReply reply) { if (rsp.isSuccess()) { wcmpl.done(); } else { - errors.add(operr("operation error, because:%s", rsp.getError())); + errors.add(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10002, "operation error, because:%s", rsp.getError())); wcmpl.allDone(); } } else { @@ -1160,7 +1161,7 @@ public void run(MessageReply reply) { new VirtualRouterRoleManager().makeLoadBalancerRole(vr.getUuid()); completion.success(); } else { - completion.fail(operr("operation error, because:%s", rsp.getError())); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10003, "operation error, because:%s", rsp.getError())); } } else { completion.fail(reply.getError()); @@ -1304,7 +1305,7 @@ public void run(MessageReply reply) { if (rsp.isSuccess()) { trigger.next(); } else { - trigger.fail(operr("refresh load balancer certificate, because:%s", rsp.getError())); + trigger.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10004, "refresh load balancer certificate, because:%s", rsp.getError())); } } else { trigger.fail(reply.getError()); @@ -1339,7 +1340,7 @@ public void run(MessageReply reply) { if (rsp.isSuccess()) { trigger.next(); } else { - trigger.fail(operr("refresh load balancer listener, because:%s", rsp.getError())); + trigger.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10005, "refresh load balancer listener, because:%s", rsp.getError())); } } else { trigger.fail(reply.getError()); @@ -1689,7 +1690,7 @@ public void handle(ErrorCode errCode, Map data) { @Override public void addVmNics(final LoadBalancerStruct struct, List nics, final Completion completion) { if (struct.getLb().getType().equals(LoadBalancerType.Shared.toString()) && nics.isEmpty()) { - completion.fail(operr("vmnic must be specified for share loadbalancer")); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10006, "vmnic must be specified for share loadbalancer")); return; } @@ -2156,7 +2157,7 @@ public void handle(ErrorCode errCode, Map data) { public void addListener(LoadBalancerStruct struct, LoadBalancerListenerInventory listener, Completion completion) { VirtualRouterVmInventory vr = findVirtualRouterVm(struct.getLb().getUuid()); if (vr == null) { - throw new OperationFailureException(operr("cannot find virtual router for load balancer [uuid:%s]", struct.getLb().getUuid())); + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10007, "cannot find virtual router for load balancer [uuid:%s]", struct.getLb().getUuid())); } startVrIfNeededAndRefresh(vr, struct, completion); @@ -2414,7 +2415,7 @@ public void run(MessageReply reply) { if (rsp.isSuccess()) { trigger.next(); } else { - trigger.fail(operr("operation error, because:%s", rsp.getError())); + trigger.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10008, "operation error, because:%s", rsp.getError())); } } else { trigger.fail(reply.getError()); @@ -2477,7 +2478,7 @@ public void run(MessageReply reply) { if (rsp.isSuccess()) { completion.success(); } else { - completion.fail(operr("operation error, because:%s", rsp.getError())); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10009, "operation error, because:%s", rsp.getError())); } } else { completion.fail(reply.getError()); @@ -2507,7 +2508,7 @@ public void run(MessageReply reply) { if (rsp.isSuccess()) { completion.success(); } else { - completion.fail(operr("operation error, because:%s", rsp.getError())); + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10010, "operation error, because:%s", rsp.getError())); } } else { completion.fail(reply.getError()); diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lifecycle/VirtualRouterDeployAgentFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lifecycle/VirtualRouterDeployAgentFlow.java index 8d9f6b176ee..903f53d18d7 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lifecycle/VirtualRouterDeployAgentFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lifecycle/VirtualRouterDeployAgentFlow.java @@ -38,6 +38,7 @@ import java.util.concurrent.TimeUnit; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VirtualRouterDeployAgentFlow extends NoRollbackFlow { @@ -120,7 +121,7 @@ public void success(InitRsp ret) { if (ret.isSuccess()) { trigger.next(); } else { - trigger.fail(operr("operation error, because:%s", ret.getError())); + trigger.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LIFECYCLE_10000, "operation error, because:%s", ret.getError())); } } @@ -141,7 +142,7 @@ public void success(InitRsp ret) { if (ret.isSuccess()) { trigger.next(); } else { - trigger.fail(operr("operation error, because:%s", ret.getError())); + trigger.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LIFECYCLE_10001, "operation error, because:%s", ret.getError())); } } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSnatBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSnatBackend.java index 73439479aa4..472fe6bfc4f 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSnatBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSnatBackend.java @@ -38,6 +38,7 @@ import java.util.List; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -89,7 +90,7 @@ private void applySnat(final Iterator it, final VmInstanceSpec spec, @Override public void validate(VirtualRouterOfferingInventory offering) throws OperationFailureException { if (offering.getPublicNetworkUuid().equals(guestL3.getUuid())) { - throw new OperationFailureException(operr("guest l3Network[uuid:%s, name:%s] needs SNAT service provided by virtual router, but public l3Network[uuid:%s] of virtual router offering[uuid: %s, name:%s] is the same to this guest l3Network", + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10001, "guest l3Network[uuid:%s, name:%s] needs SNAT service provided by virtual router, but public l3Network[uuid:%s] of virtual router offering[uuid: %s, name:%s] is the same to this guest l3Network", guestL3.getUuid(), guestL3.getName(), offering.getPublicNetworkUuid(), offering.getUuid(), offering.getName())); } } @@ -423,7 +424,7 @@ public void run(MessageReply reply) { VirtualRouterAsyncHttpCallReply re = reply.castReply(); VirtualRouterCommands.SyncSNATRsp ret = re.toResponse(VirtualRouterCommands.SyncSNATRsp.class); if (!ret.isSuccess()) { - ErrorCode err = operr("virtual router[name: %s, uuid: %s] failed to sync snat%s, %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10002, "virtual router[name: %s, uuid: %s] failed to sync snat%s, %s", vr.getName(), vr.getUuid(), JSONObjectUtil.toJsonString(snatInfo), ret.getError()); completion.fail(err); return; diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSyncSNATOnStartFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSyncSNATOnStartFlow.java index 037c12098f3..2cbacd4c4e9 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSyncSNATOnStartFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSyncSNATOnStartFlow.java @@ -39,6 +39,7 @@ import java.util.Map; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VirtualRouterSyncSNATOnStartFlow implements Flow { @@ -144,7 +145,7 @@ public void run(MessageReply reply) { VirtualRouterAsyncHttpCallReply re = reply.castReply(); SyncSNATRsp ret = re.toResponse(SyncSNATRsp.class); if (!ret.isSuccess()) { - ErrorCode err = operr("virtual router[name: %s, uuid: %s] failed to sync snat%s, %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10000, "virtual router[name: %s, uuid: %s] failed to sync snat%s, %s", vr.getName(), vr.getUuid(), JSONObjectUtil.toJsonString(snatInfo), ret.getError()); chain.fail(err); } else { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/ApplyPortforwardingRuleOnVirtualRouterVmFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/ApplyPortforwardingRuleOnVirtualRouterVmFlow.java index 9c83ea5bb93..2cac3f1f0b8 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/ApplyPortforwardingRuleOnVirtualRouterVmFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/ApplyPortforwardingRuleOnVirtualRouterVmFlow.java @@ -27,6 +27,7 @@ import java.util.Arrays; import java.util.Map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class ApplyPortforwardingRuleOnVirtualRouterVmFlow implements Flow { @@ -82,7 +83,7 @@ public void run(MessageReply reply) { chain.next(); fireFirewallEvent(vr.getUuid()); } else { - ErrorCode err = operr("failed to create port forwarding rule[vip ip: %s, private ip: %s, vip start port: %s, vip end port: %s, private start port: %s, private end port: %s], because %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10000, "failed to create port forwarding rule[vip ip: %s, private ip: %s, vip start port: %s, vip end port: %s, private start port: %s, private end port: %s], because %s", to.getVipIp(), to.getPrivateIp(), to.getVipPortStart(), to.getVipPortEnd(), to.getPrivatePortStart(), to.getPrivatePortEnd(), ret.getError()); chain.fail(err); diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/ReleasePortForwardingRuleOnVirtualRouterVmFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/ReleasePortForwardingRuleOnVirtualRouterVmFlow.java index b1cab99534a..f92ef2a3f21 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/ReleasePortForwardingRuleOnVirtualRouterVmFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/ReleasePortForwardingRuleOnVirtualRouterVmFlow.java @@ -26,6 +26,7 @@ import java.util.Arrays; import java.util.Map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class ReleasePortForwardingRuleOnVirtualRouterVmFlow extends NoRollbackFlow { @@ -79,7 +80,7 @@ public void run(MessageReply reply) { data.setVirtualRouterUuid(vr.getUuid()); evtf.fire(FirewallCanonicalEvents.FIREWALL_RULE_CHANGED_PATH, data); } else { - ErrorCode err = operr("failed to revoke port forwarding rules %s, because %s", JSONObjectUtil.toJsonString(to), ret.getError()); + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10001, "failed to revoke port forwarding rules %s, because %s", JSONObjectUtil.toJsonString(to), ret.getError()); chain.fail(err); } } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterPortForwardingBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterPortForwardingBackend.java index 6451b4b781d..55e4484d00d 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterPortForwardingBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterPortForwardingBackend.java @@ -43,6 +43,7 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class VirtualRouterPortForwardingBackend extends AbstractVirtualRouterBackend implements PortForwardingBackend, Component, VirtualRouterAfterAttachNicExtensionPoint, VirtualRouterBeforeDetachNicExtensionPoint, @@ -181,7 +182,7 @@ private void applyRule(final Iterator it, final Completion @Override public void validate(VirtualRouterOfferingInventory offering) throws OperationFailureException { if (!offering.getPublicNetworkUuid().equals(struct.getVip().getL3NetworkUuid())) { - throw new OperationFailureException(operr("found a virtual router offering[uuid:%s] for L3Network[uuid:%s] in zone[uuid:%s]; however, the network's public network[uuid:%s] is not the same to PortForwarding rule[uuid:%s]'s; you may need to use system tag" + + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10003, "found a virtual router offering[uuid:%s] for L3Network[uuid:%s] in zone[uuid:%s]; however, the network's public network[uuid:%s] is not the same to PortForwarding rule[uuid:%s]'s; you may need to use system tag" + " guestL3Network::l3NetworkUuid to specify a particular virtual router offering for the L3Network", offering.getUuid(), struct.getGuestL3Network().getUuid(), struct.getGuestL3Network().getZoneUuid(), struct.getVip().getL3NetworkUuid(), struct.getRule().getUuid())); } } @@ -246,7 +247,7 @@ public void handle(ErrorCode errCode, Map data) { public void applyPortForwardingRule(PortForwardingStruct struct, Completion completion) { PortForwardingRuleInventory rule = struct.getRule(); if ((rule.getVipPortStart() != rule.getPrivatePortStart() || rule.getVipPortEnd() != rule.getPrivatePortEnd()) && (rule.getVipPortStart() != rule.getVipPortEnd()) && (rule.getPrivatePortStart() != rule.getPrivatePortEnd())) { - throw new OperationFailureException(operr("virtual router doesn't support port forwarding range redirection, the vipPortStart must be equals to privatePortStart and vipPortEnd must be equals to privatePortEnd;" + + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10004, "virtual router doesn't support port forwarding range redirection, the vipPortStart must be equals to privatePortStart and vipPortEnd must be equals to privatePortEnd;" + "but this rule rule has a mismatching range: vip port[%s, %s], private port[%s, %s]", rule.getVipPortStart(), rule.getVipPortEnd(), rule.getPrivatePortStart(), rule.getPrivatePortEnd())); } @@ -404,7 +405,7 @@ public void run(MessageReply reply) { VirtualRouterAsyncHttpCallReply re = reply.castReply(); VirtualRouterCommands.SyncEipRsp ret = re.toResponse(VirtualRouterCommands.SyncEipRsp.class); if (!ret.isSuccess()) { - ErrorCode err = operr("failed to add portforwardings on virtual router[uuid:%s], %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10005, "failed to add portforwardings on virtual router[uuid:%s], %s", vrVO.getUuid(), ret.getError()); completion.fail(err); } else { @@ -480,7 +481,7 @@ public void run(MessageReply reply) { VirtualRouterAsyncHttpCallReply re = reply.castReply(); VirtualRouterCommands.RevokePortForwardingRuleRsp ret = re.toResponse(VirtualRouterCommands.RevokePortForwardingRuleRsp.class); if (!ret.isSuccess()) { - ErrorCode err = operr("failed to revoke port forwardings on virtual router[uuid:%s], %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10006, "failed to revoke port forwardings on virtual router[uuid:%s], %s", vrVO.getUuid(), ret.getError()); completion.fail(err); } else { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterSyncPortForwardingRulesOnStartFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterSyncPortForwardingRulesOnStartFlow.java index c0bac709904..9ae269fae94 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterSyncPortForwardingRulesOnStartFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterSyncPortForwardingRulesOnStartFlow.java @@ -31,6 +31,7 @@ import javax.persistence.TypedQuery; import java.util.*; import java.util.stream.Collectors; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VirtualRouterSyncPortForwardingRulesOnStartFlow implements Flow { @@ -207,7 +208,7 @@ public void run(MessageReply reply) { logger.debug(info); chain.next(); } else { - ErrorCode err = operr("failed to sync port forwarding rules served by virtual router[name: %s, uuid: %s], because %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10002, "failed to sync port forwarding rules served by virtual router[name: %s, uuid: %s], because %s", vr.getName(), vr.getUuid(), ret.getError()); chain.fail(err); } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterVipBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterVipBackend.java index e672e1ed4fa..bbdf0c8cd41 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterVipBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterVipBackend.java @@ -35,6 +35,7 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class VirtualRouterVipBackend extends AbstractVirtualRouterBackend implements VirtualRouterHaGetCallbackExtensionPoint, VipBackend, VirtualRouterAfterAttachNicExtensionPoint, VirtualRouterBeforeDetachNicExtensionPoint, PreVipReleaseExtensionPoint, @@ -114,7 +115,7 @@ public void run(MessageReply reply) { VirtualRouterAsyncHttpCallReply re = reply.castReply(); CreateVipRsp ret = re.toResponse(CreateVipRsp.class); if (!ret.isSuccess()) { - ErrorCode err = operr("failed to create vip%s on virtual router[uuid:%s], because %s", tos, vr.getUuid(), ret.getError()); + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10000, "failed to create vip%s on virtual router[uuid:%s], because %s", tos, vr.getUuid(), ret.getError()); completion.fail(err); } else { completion.success(); @@ -168,7 +169,7 @@ public void run(MessageReply reply) { if (ret.isSuccess()) { completion.success(); } else { - ErrorCode err = operr("failed to remove vip%s, because %s", tos, ret.getError()); + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10001, "failed to remove vip%s, because %s", tos, ret.getError()); completion.fail(err); } } @@ -234,7 +235,7 @@ public void run(MessageReply reply) { VirtualRouterAsyncHttpCallReply re = reply.castReply(); CreateVipRsp ret = re.toResponse(CreateVipRsp.class); if (!ret.isSuccess()) { - ErrorCode err = operr("failed to sync vips[ips: %s] on virtual router[uuid:%s]" + + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10002, "failed to sync vips[ips: %s] on virtual router[uuid:%s]" + " for attaching nic[uuid: %s, ip: %s], because %s", vips.stream().map(VipTO::getIp).collect(Collectors.toList()), nic.getVmInstanceUuid(), nic.getUuid(), nic.getIp(), ret.getError()); diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterVipBaseBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterVipBaseBackend.java index 614b565ee3b..70fdf675924 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterVipBaseBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterVipBaseBackend.java @@ -44,6 +44,7 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by xing5 on 2016/11/20. @@ -171,7 +172,7 @@ public void run(MessageReply reply) { if (ret.isSuccess()) { completion.success(); } else { - ErrorCode err = operr("failed to remove vip%s, because %s", tos, ret.getError()); + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10003, "failed to remove vip%s, because %s", tos, ret.getError()); completion.fail(err); } } @@ -215,7 +216,7 @@ public void run(MessageReply reply) { VirtualRouterAsyncHttpCallReply re = reply.castReply(); VirtualRouterCommands.CreateVipRsp ret = re.toResponse(VirtualRouterCommands.CreateVipRsp.class); if (!ret.isSuccess()) { - ErrorCode err = operr("failed to create vip%s on virtual router[uuid:%s], because %s", tos, vr.getUuid(), ret.getError()); + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10004, "failed to create vip%s on virtual router[uuid:%s], because %s", tos, vr.getUuid(), ret.getError()); completion.fail(err); } else { completion.success(); @@ -248,7 +249,7 @@ private void acquireVip(String specificVrUuid, Completion completion) { VmInstanceState vrState = q.findValue(); if (VmInstanceState.Running != vrState) { - completion.fail(operr("virtual router[uuid:%s, state:%s] is not running", + completion.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10005, "virtual router[uuid:%s, state:%s] is not running", vrUuid, vrState)); } else { CollectionUtils.safeForEach(pluginRgty.getExtensionList(AfterAcquireVipExtensionPoint.class), @@ -296,7 +297,7 @@ public void run(final FlowTrigger trigger, final Map data) { s.setProviderType(self.getServiceProvider()); s.setOfferingValidator(offering -> { if (!offering.getPublicNetworkUuid().equals(self.getL3NetworkUuid())) { - throw new OperationFailureException(operr("found a virtual router offering[uuid:%s] for L3Network[uuid:%s] in zone[uuid:%s]; however, the network's public network[uuid:%s] is not the same to VIP[uuid:%s]'s; you may need to use system tag" + + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10006, "found a virtual router offering[uuid:%s] for L3Network[uuid:%s] in zone[uuid:%s]; however, the network's public network[uuid:%s] is not the same to VIP[uuid:%s]'s; you may need to use system tag" + " guestL3Network::l3NetworkUuid to specify a particular virtual router offering for the L3Network", offering.getUuid(), s.getL3Network().getUuid(), s.getL3Network().getZoneUuid(), self.getL3NetworkUuid(), self.getUuid())); diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosChangePrivateL3FirewallDefaultActionExtensionPoint.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosChangePrivateL3FirewallDefaultActionExtensionPoint.java index a1600bb9b97..983ea55f55d 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosChangePrivateL3FirewallDefaultActionExtensionPoint.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosChangePrivateL3FirewallDefaultActionExtensionPoint.java @@ -17,6 +17,7 @@ import java.util.Collections; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class VyosChangePrivateL3FirewallDefaultActionExtensionPoint implements VirtualRouterAfterAttachNicExtensionPoint { @Autowired @@ -64,7 +65,7 @@ public void run(MessageReply reply) { nic.getIp(), nic.getMac(), nic.getVmInstanceUuid())); completion.success(); } else { - ErrorCode err = operr("failed to change nic[ip:%s, mac:%s] firewall default action of virtual router vm[uuid:%s], because %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10003, "failed to change nic[ip:%s, mac:%s] firewall default action of virtual router vm[uuid:%s], because %s", nic.getIp(), nic.getMac(), nic.getVmInstanceUuid(), rsp.getError()); completion.fail(err); } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConfigSshFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConfigSshFlow.java index e94a8d2b5f1..481dd22205b 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConfigSshFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConfigSshFlow.java @@ -34,6 +34,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by zhanyong.miao 2018/10/08 @@ -94,7 +95,7 @@ public boolean run() { try { long now = System.currentTimeMillis(); if (now > timeout) { - trigger.fail(err(ApplianceVmErrors.UNABLE_TO_START, "the SSH port is not" + + trigger.fail(err(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10000, ApplianceVmErrors.UNABLE_TO_START, "the SSH port is not" + " open after %s seconds. Failed to login the virtual router[ip:%s]", timeoutInSeconds, mgmtNicIp)); return true; } @@ -153,7 +154,7 @@ protected Boolean call() { trigger.next(); } catch (Exception e) { - trigger.fail(operr("unable to ssh in to the virtual router[%s] after configure ssh", mgmtNicIp)); + trigger.fail(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10001, "unable to ssh in to the virtual router[%s] after configure ssh", mgmtNicIp)); } } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConnectFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConnectFlow.java index d890e10ed33..23299dd34b5 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConnectFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConnectFlow.java @@ -47,6 +47,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by xing5 on 2016/10/31. @@ -241,7 +242,7 @@ public void success(InitRsp ret) { errs.clear(); wcompl.allDone(); } else { - errs.add(operr("vyos init command failed, because:%s", ret.getError())); + errs.add(operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10002, "vyos init command failed, because:%s", ret.getError())); wcompl.done(); } } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosDeployAgentFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosDeployAgentFlow.java index 7437e6728ab..163fd4d22d2 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosDeployAgentFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosDeployAgentFlow.java @@ -34,6 +34,7 @@ import java.util.concurrent.TimeUnit; import static org.zstack.core.Platform.err; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by xing5 on 2016/10/31. @@ -149,7 +150,7 @@ public boolean run() { boolean forceReboot = false; long now = System.currentTimeMillis(); if (now > timeout) { - trigger.fail(err(ApplianceVmErrors.UNABLE_TO_START, "virtual router deploy agent failed, because %s", + trigger.fail(err(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10004, ApplianceVmErrors.UNABLE_TO_START, "virtual router deploy agent failed, because %s", errors.get(errors.size() -1))); return true; } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosDhcpBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosDhcpBackend.java index 099fa77ffbc..2abef0b5ad2 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosDhcpBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosDhcpBackend.java @@ -34,6 +34,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by xing5 on 2016/10/31. @@ -153,7 +154,7 @@ public void run(MessageReply reply) { if (rsp.isSuccess()) { completion.success(); } else { - ErrorCode err = operr("unable to start dhcp server on virtual router vm[uuid:%s], because %s", vrUuid, rsp.getError()); + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10005, "unable to start dhcp server on virtual router vm[uuid:%s], because %s", vrUuid, rsp.getError()); completion.fail(err); } } @@ -243,7 +244,7 @@ public void run(MessageReply reply) { if (rsp.isSuccess()) { completion.success(); } else { - ErrorCode err = operr("unable to start dhcp server on virtual router vm[uuid:%s], because %s", nic.getVmInstanceUuid(), rsp.getError()); + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10006, "unable to start dhcp server on virtual router vm[uuid:%s], because %s", nic.getVmInstanceUuid(), rsp.getError()); completion.fail(err); } } @@ -279,7 +280,7 @@ public void run(MessageReply reply) { if (rsp.isSuccess()) { completion.success(); } else { - ErrorCode err = operr("unable to stop dhcp server on virtual router vm[uuid:%s], because %s", nic.getVmInstanceUuid(), rsp.getError()); + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10007, "unable to stop dhcp server on virtual router vm[uuid:%s], because %s", nic.getVmInstanceUuid(), rsp.getError()); completion.fail(err); } } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosVm.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosVm.java index 8dc1e4a947d..80823bd623b 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosVm.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosVm.java @@ -27,6 +27,7 @@ import java.util.List; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by xing5 on 2016/10/31. @@ -129,7 +130,7 @@ public void run(MessageReply reply) { VirtualRouterAsyncHttpCallReply re = reply.castReply(); VyosKeepalivedCommands.VyosHaEnableRsp ret = re.toResponse(VyosKeepalivedCommands.VyosHaEnableRsp.class); if (!ret.isSuccess()) { - ErrorCode err = operr("failed to enable ha on virtual router[uuid:%s], %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10008, "failed to enable ha on virtual router[uuid:%s], %s", vr.getUuid(), ret.getError()); completion.fail(err); } else { diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkFactory.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkFactory.java index 101ac6cbdd4..6f62ca923b4 100755 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkFactory.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkFactory.java @@ -52,6 +52,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by weiwang on 02/03/2017. @@ -220,7 +221,7 @@ public void run(MessageReply reply) { @Override public void done(ErrorCodeList errorCodeList) { if (!errList.getCauses().isEmpty()) { - completion.fail(operr("cannot configure vxlan network for vm[uuid:%s] on the destination host[uuid:%s]", + completion.fail(operr(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORK_10000, "cannot configure vxlan network for vm[uuid:%s] on the destination host[uuid:%s]", inv.getUuid(), destHostUuid).causedBy(errList.getCauses())); return; } diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/AbstractVniAllocatorStrategy.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/AbstractVniAllocatorStrategy.java index c565ca20626..a7386e4c039 100644 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/AbstractVniAllocatorStrategy.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/AbstractVniAllocatorStrategy.java @@ -14,6 +14,7 @@ import org.zstack.utils.function.Function; import java.util.List; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by weiwang on 10/03/2017. @@ -43,11 +44,11 @@ public VniRangeVO call(VniRangeVO arg) { String duplicate = Q.New(VxlanNetworkVO.class).select(VxlanNetworkVO_.uuid).eq(VxlanNetworkVO_.vni, msg.getRequiredVni()).eq(VxlanNetworkVO_.poolUuid, msg.getL2NetworkUuid()).findValue(); if (vnir == null) { - throw new OperationFailureException(Platform.err(L2Errors.ALLOCATE_VNI_ERROR, + throw new OperationFailureException(Platform.err(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10000, L2Errors.ALLOCATE_VNI_ERROR, "cannot allocate vni[%s] in l2Network[uuid:%s], out of vni range", msg.getRequiredVni(), msg.getL2NetworkUuid() )); } else if (duplicate != null) { - throw new OperationFailureException(Platform.err(L2Errors.ALLOCATE_VNI_ERROR, + throw new OperationFailureException(Platform.err(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10001, L2Errors.ALLOCATE_VNI_ERROR, "cannot allocate vni[%s] in l2Network[uuid:%s], duplicate with l2Network[uuid:%s]", msg.getRequiredVni(), msg.getL2NetworkUuid(), duplicate)); } diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkBackend.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkBackend.java index 0fba2988fcf..293e078c4a9 100755 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkBackend.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkBackend.java @@ -48,6 +48,7 @@ import static org.zstack.network.l2.vxlan.vxlanNetworkPool.VxlanNetworkPoolConstant.*; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by weiwang on 17/04/2017. @@ -78,12 +79,12 @@ public void realize(final L2NetworkInventory l2Network, final String hostUuid, b final L2VxlanNetworkInventory l2vxlan = (L2VxlanNetworkInventory) l2Network; final List vtepIps = Q.New(VtepVO.class).select(VtepVO_.vtepIp).eq(VtepVO_.hostUuid, hostUuid).eq(VtepVO_.poolUuid, l2vxlan.getPoolUuid()).listValues(); if (vtepIps.size() > 1) { - throw new OperationFailureException(operr("find multiple vtep ips[%s] for one host[uuid:%s], need to delete host and add again", + throw new OperationFailureException(operr(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10002, "find multiple vtep ips[%s] for one host[uuid:%s], need to delete host and add again", vtepIps, hostUuid)); } if (vtepIps.size() == 0) { - ErrorCode err = operr("failed to find vtep on host[uuid: %s], please re-attach vxlanpool[uuid: %s] to cluster.", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10003, "failed to find vtep on host[uuid: %s], please re-attach vxlanpool[uuid: %s] to cluster.", hostUuid, l2vxlan.getPoolUuid()); completion.fail(err); return; @@ -145,7 +146,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply hreply = reply.castReply(); VxlanKvmAgentCommands.CreateVxlanBridgeResponse rsp = hreply.toResponse(VxlanKvmAgentCommands.CreateVxlanBridgeResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("failed to create bridge[%s] for l2Network[uuid:%s, type:%s, vni:%s] on kvm host[uuid:%s], because %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10004, "failed to create bridge[%s] for l2Network[uuid:%s, type:%s, vni:%s] on kvm host[uuid:%s], because %s", cmd.getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2vxlan.getVirtualNetworkId(), hostUuid, rsp.getError()); completion.fail(err); return; @@ -202,7 +203,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply hreply = reply.castReply(); KVMAgentCommands.UpdateL2NetworkResponse rsp = hreply.toResponse(KVMAgentCommands.UpdateL2NetworkResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("failed to update bridge[%s] for l2Network[uuid:%s, name:%s] on kvm host[uuid: %s], %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10005, "failed to update bridge[%s] for l2Network[uuid:%s, name:%s] on kvm host[uuid: %s], %s", cmd.getBridgeName(), newL2.getUuid(), newL2.getName(), hostUuid, rsp.getError()); completion.fail(err); return; @@ -259,7 +260,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply hreply = reply.castReply(); VxlanKvmAgentCommands.CheckVxlanCidrResponse rsp = hreply.toResponse(VxlanKvmAgentCommands.CheckVxlanCidrResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("failed to check cidr[%s] for l2VxlanNetwork[uuid:%s, name:%s] on kvm host[uuid:%s], %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10006, "failed to check cidr[%s] for l2VxlanNetwork[uuid:%s, name:%s] on kvm host[uuid:%s], %s", cmd.getCidr(), l2vxlan.getUuid(), l2vxlan.getName(), hostUuid, rsp.getError()); trigger.fail(err); return; @@ -547,7 +548,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply hreply = reply.castReply(); VxlanKvmAgentCommands.DeleteVxlanBridgeResponse rsp = hreply.toResponse(VxlanKvmAgentCommands.DeleteVxlanBridgeResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("failed to delete bridge[%s] for l2Network[uuid:%s, type:%s, vni:%s] on kvm host[uuid:%s], because %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10007, "failed to delete bridge[%s] for l2Network[uuid:%s, type:%s, vni:%s] on kvm host[uuid:%s], because %s", cmd.getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2vxlan.getVirtualNetworkId(), hostUuid, rsp.getError()); completion.fail(err); return; diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkPoolBackend.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkPoolBackend.java index 728e49bff18..f52acab7dab 100755 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkPoolBackend.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkPoolBackend.java @@ -37,6 +37,7 @@ import static org.zstack.network.l2.vxlan.vxlanNetworkPool.VxlanNetworkPoolConstant.*; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by weiwang on 20/03/2017. @@ -103,7 +104,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply hreply = reply.castReply(); VxlanKvmAgentCommands.CheckVxlanCidrResponse rsp = hreply.toResponse(VxlanKvmAgentCommands.CheckVxlanCidrResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("failed to check cidr[%s] for l2VxlanNetworkPool[uuid:%s, name:%s] on kvm host[uuid:%s], %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10008, "failed to check cidr[%s] for l2VxlanNetworkPool[uuid:%s, name:%s] on kvm host[uuid:%s], %s", cmd.getCidr(), vxlanPool.getUuid(), vxlanPool.getName(), hostUuid, rsp.getError()); completion.fail(err); return; @@ -262,7 +263,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply hreply = reply.castReply(); VxlanKvmAgentCommands.CreateVxlanBridgeResponse rsp = hreply.toResponse(VxlanKvmAgentCommands.CreateVxlanBridgeResponse.class); if (!rsp.isSuccess()) { - ErrorCode err = operr("failed to realize vxlan network pool[uuid:%s, type:%s] on kvm host[uuid:%s], because %s", + ErrorCode err = operr(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10009, "failed to realize vxlan network pool[uuid:%s, type:%s] on kvm host[uuid:%s], because %s", l2Network.getUuid(), l2Network.getType(), hostUuid, rsp.getError()); trigger.fail(err); return; diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanNetworkCheckerImpl.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanNetworkCheckerImpl.java index 00513d4342a..d3a46ed8d78 100644 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanNetworkCheckerImpl.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanNetworkCheckerImpl.java @@ -18,6 +18,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by weiwang on 02/05/2017. @@ -41,11 +42,11 @@ private void validate(APIChangeL2NetworkVlanIdMsg msg) { return; } if (!NetworkUtils.isValidVni(msg.getVlan())) { - throw new ApiMessageInterceptionException(argerr("vlan[%s] is not a valid vni", msg.getVlan())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10024, "vlan[%s] is not a valid vni", msg.getVlan())); } VxlanNetworkVO vxlanVO = Q.New(VxlanNetworkVO.class).eq(VxlanNetworkVO_.uuid, msg.getL2NetworkUuid()).find(); if (vxlanVO == null || !vxlanVO.getType().equals(VxlanNetworkConstant.VXLAN_NETWORK_TYPE)) { - throw new ApiMessageInterceptionException(argerr("L2Network[uuid:%s] is not L2VxlanNetwork type", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10025, "L2Network[uuid:%s] is not L2VxlanNetwork type", msg.getL2NetworkUuid())); } @@ -53,7 +54,7 @@ private void validate(APIChangeL2NetworkVlanIdMsg msg) { .eq(VxlanNetworkVO_.vni, msg.getVlan()).eq(VxlanNetworkVO_.poolUuid, vxlanVO.getPoolUuid()).listValues(); duplicate = duplicate.stream().filter(d -> !d.equals(msg.getL2NetworkUuid())).collect(Collectors.toList()); if (!duplicate.isEmpty()) { - throw new OperationFailureException(Platform.err(L2Errors.ALLOCATE_VNI_ERROR, + throw new OperationFailureException(Platform.err(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10026, L2Errors.ALLOCATE_VNI_ERROR, "cannot allocate vni[%s] in l2Network[uuid:%s], duplicate with l2Network[uuid:%s]", msg.getVlan(), msg.getL2NetworkUuid(), duplicate.get(0))); } @@ -66,7 +67,7 @@ private void validate(APIAttachL2NetworkToClusterMsg msg) { } if (msg.getSystemTags() == null) { - throw new ApiMessageInterceptionException(argerr("need to input one system tag like : [%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10027, "need to input one system tag like : [%s]", VxlanSystemTags.VXLAN_POOL_CLUSTER_VTEP_CIDR.getTagFormat())); } @@ -78,13 +79,13 @@ private void validate(APIAttachL2NetworkToClusterMsg msg) { public void validateSystemTagFormat(List systemTags) { for (String tag : systemTags) { if (!VxlanSystemTags.VXLAN_POOL_CLUSTER_VTEP_CIDR.isMatch(tag)) { - throw new ApiMessageInterceptionException(argerr("wrong system tag [%s], should be like : [%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10028, "wrong system tag [%s], should be like : [%s]", tag, VxlanSystemTags.VXLAN_POOL_CLUSTER_VTEP_CIDR.getTagFormat())); } List cidr = Arrays.asList(VxlanSystemTags.VXLAN_POOL_CLUSTER_VTEP_CIDR.getTokenByTag(tag, VxlanSystemTags.VTEP_CIDR_TOKEN).split("[{}]")); boolean isCidr = cidr.size() > 1 && NetworkUtils.isCidr(cidr.get(1)); if (!isCidr) { - throw new ApiMessageInterceptionException(argerr("wrong cidr format in system tag [%s]", tag)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10029, "wrong cidr format in system tag [%s]", tag)); } } } @@ -93,7 +94,7 @@ public void validateSystemTagFormat(List systemTags) { public void validateVniRangeOverlap(L2NetworkInventory inv, String clusterUuid) { String overlappedPool = getOverlapVniRangePool(inv, clusterUuid); if (overlappedPool != null) { - throw new ApiMessageInterceptionException(argerr("overlap vni range with %s [%s]", inv.getType(), overlappedPool)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10030, "overlap vni range with %s [%s]", inv.getType(), overlappedPool)); } } @@ -128,7 +129,7 @@ private static boolean isVniRangeOverlap(Integer startVni1, Integer endVni1, Int private void validate(APICreateL3NetworkMsg msg) { String type = Q.New(L2NetworkVO.class).select(L2NetworkVO_.type).eq(L2NetworkVO_.uuid, msg.getL2NetworkUuid()).findValue(); if (type.equals(VxlanNetworkPoolConstant.VXLAN_NETWORK_POOL_TYPE)) { - throw new ApiMessageInterceptionException(argerr("vxlan network pool doesn't support create l3 network")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10031, "vxlan network pool doesn't support create l3 network")); } } } diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanNetworkPool.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanNetworkPool.java index 68d20f08df8..e8166a9873b 100755 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanNetworkPool.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanNetworkPool.java @@ -58,6 +58,7 @@ import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; import static org.zstack.core.Platform.err; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by weiwang on 01/03/2017. @@ -303,7 +304,7 @@ private void handle(AllocateVniMsg msg) { AllocateVniReply reply = new AllocateVniReply(); Integer vni = vas.allocateVni(msg); if (vni == null) { - reply.setError(err(L2Errors.ALLOCATE_VNI_ERROR, "Vni allocator strategy[%s] returns nothing, because no vni is available in this VxlanNetwork[name:%s, uuid:%s]", strategyType, self.getName(), self.getUuid())); + reply.setError(err(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10010, L2Errors.ALLOCATE_VNI_ERROR, "Vni allocator strategy[%s] returns nothing, because no vni is available in this VxlanNetwork[name:%s, uuid:%s]", strategyType, self.getName(), self.getUuid())); } else { logger.debug(String.format("Vni allocator strategy[%s] successfully allocates an vni[%s]", strategyType, vni)); reply.setVni(vni); @@ -554,7 +555,7 @@ private void handle(final APICreateVxlanPoolRemoteVtepMsg msg) { rq.add(L2NetworkClusterRefVO_.l2NetworkUuid, SimpleQuery.Op.EQ, msg.getL2NetworkUuid()); long count = rq.count(); if (count == 0) { - evt.setError(err(SysErrors.RESOURCE_NOT_FOUND, "Cannot find L2NetworkClusterRefVO item for l2NetworkUuid[%s] clusterUuid[%s]", msg.getL2NetworkUuid(), msg.getClusterUuid())); + evt.setError(err(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10011, SysErrors.RESOURCE_NOT_FOUND, "Cannot find L2NetworkClusterRefVO item for l2NetworkUuid[%s] clusterUuid[%s]", msg.getL2NetworkUuid(), msg.getClusterUuid())); bus.publish(evt); return; } @@ -565,7 +566,7 @@ private void handle(final APICreateVxlanPoolRemoteVtepMsg msg) { rqVtep.add(RemoteVtepVO_.vtepIp, SimpleQuery.Op.EQ, msg.getRemoteVtepIp()); count = rqVtep.count(); if (count > 0) { - evt.setError(err(SysErrors.OPERATION_ERROR, "ip[%s] l2NetworkUuid[%s] clusterUuid[%s] exist", msg.getRemoteVtepIp(), msg.getL2NetworkUuid(), msg.getClusterUuid())); + evt.setError(err(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10012, SysErrors.OPERATION_ERROR, "ip[%s] l2NetworkUuid[%s] clusterUuid[%s] exist", msg.getRemoteVtepIp(), msg.getL2NetworkUuid(), msg.getClusterUuid())); bus.publish(evt); return; } @@ -601,7 +602,7 @@ public void success() { @Override public void fail(ErrorCode errorCode) { - evt.setError(err(L2Errors.ATTACH_ERROR, errorCode, errorCode.getDetails())); + evt.setError(err(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10013, L2Errors.ATTACH_ERROR, errorCode, errorCode.getDetails())); bus.publish(evt); } }); @@ -899,7 +900,7 @@ public void success() { @Override public void fail(ErrorCode errorCode) { afterAttachVxlanPoolFromClusterFailed(msg); - evt.setError(err(L2Errors.ATTACH_ERROR, errorCode, errorCode.getDetails())); + evt.setError(err(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10014, L2Errors.ATTACH_ERROR, errorCode, errorCode.getDetails())); bus.publish(evt); } }); diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanPoolApiInterceptor.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanPoolApiInterceptor.java index 0ce7e3ae9ff..6629d0f7def 100644 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanPoolApiInterceptor.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanPoolApiInterceptor.java @@ -25,6 +25,7 @@ import java.util.stream.Collectors; import org.zstack.core.db.SimpleQuery; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by weiwang on 02/05/2017. @@ -57,7 +58,7 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti private void validate(APICreateVxlanPoolRemoteVtepMsg msg) { boolean isIpv4 = NetworkUtils.isIpv4Address(msg.getRemoteVtepIp()); if (!isIpv4) { - throw new ApiMessageInterceptionException(argerr("%s:is not ipv4", msg.getRemoteVtepIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10015, "%s:is not ipv4", msg.getRemoteVtepIp())); } SimpleQuery rqv = dbf.createQuery(VtepVO.class); @@ -66,7 +67,7 @@ private void validate(APICreateVxlanPoolRemoteVtepMsg msg) { rqv.add(VtepVO_.vtepIp, SimpleQuery.Op.EQ, msg.getRemoteVtepIp()); long count = rqv.count(); if (count > 0) { - throw new ApiMessageInterceptionException(argerr("ip[%s] l2NetworkUuid[%s] clusterUuid[%s] ip exist in local vtep", msg.getRemoteVtepIp(), msg.getL2NetworkUuid(), msg.getClusterUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10016, "ip[%s] l2NetworkUuid[%s] clusterUuid[%s] ip exist in local vtep", msg.getRemoteVtepIp(), msg.getL2NetworkUuid(), msg.getClusterUuid())); } } @@ -74,7 +75,7 @@ private void validate(APICreateVxlanPoolRemoteVtepMsg msg) { private void validate(APIDeleteVxlanPoolRemoteVtepMsg msg) { boolean isIpv4 = NetworkUtils.isIpv4Address(msg.getRemoteVtepIp()); if (!isIpv4) { - throw new ApiMessageInterceptionException(argerr("%s:is not ipv4", msg.getRemoteVtepIp())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10017, "%s:is not ipv4", msg.getRemoteVtepIp())); } } @@ -82,7 +83,7 @@ private void validate(APIDeleteVxlanPoolRemoteVtepMsg msg) { private void validate(APICreateVxlanVtepMsg msg) { long count = Q.New(VtepVO.class).eq(VtepVO_.hostUuid, msg.getHostUuid()).eq(VtepVO_.poolUuid, msg.getPoolUuid()).count(); if (count > 0) { - throw new ApiMessageInterceptionException(argerr("vxlan vtep address for host [uuid : %s] and pool [uuid : %s] pair already existed", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10018, "vxlan vtep address for host [uuid : %s] and pool [uuid : %s] pair already existed", msg.getHostUuid(), msg.getPoolUuid()) ); } @@ -101,7 +102,7 @@ private void validate(APIUpdateVniRangeMsg msg) { private void validate(APICreateL2VxlanNetworkMsg msg) { VxlanNetworkPoolVO vo = Q.New(VxlanNetworkPoolVO.class).eq(VxlanNetworkPoolVO_.uuid, msg.getPoolUuid()).find(); if (msg.getZoneUuid() != null && !msg.getZoneUuid().equals(vo.getZoneUuid())) { - throw new ApiMessageInterceptionException(Platform.err(SysErrors.INVALID_ARGUMENT_ERROR, + throw new ApiMessageInterceptionException(Platform.err(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10019, SysErrors.INVALID_ARGUMENT_ERROR, String.format("the zone uuid provided not equals to zone uuid of pool [%s], please correct it or do not fill it", msg.getPoolUuid()) )); @@ -112,7 +113,7 @@ private void validate(APICreateL2VxlanNetworkMsg msg) { private void validate(APICreateVniRangeMsg msg) { if (msg.getStartVni() > msg.getEndVni()) { - throw new ApiMessageInterceptionException(Platform.err(SysErrors.INVALID_ARGUMENT_ERROR, + throw new ApiMessageInterceptionException(Platform.err(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10020, SysErrors.INVALID_ARGUMENT_ERROR, String.format("start number [%s] of vni range is bigger than end number [%s]", msg.getStartVni(), msg.getStartVni()) )); @@ -121,7 +122,7 @@ private void validate(APICreateVniRangeMsg msg) { VxlanNetworkPoolVO pool = dbf.findByUuid(msg.getL2NetworkUuid(), VxlanNetworkPoolVO.class); if ( pool == null ) { - throw new ApiMessageInterceptionException(argerr("unable create vni range, because l2 uuid[%s] is not vxlan network pool",msg.getL2NetworkUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10021, "unable create vni range, because l2 uuid[%s] is not vxlan network pool",msg.getL2NetworkUuid())); } List> tokenList = VxlanSystemTags.VXLAN_POOL_CLUSTER_VTEP_CIDR.getTokensOfTagsByResourceUuid(msg.getL2NetworkUuid()); @@ -160,7 +161,7 @@ private void validate(APICreateVniRangeMsg msg) { for (VniRangeVO e : p.getAttachedVniRanges()) { if (checkOverlap(msg.getStartVni(), msg.getEndVni(), e.getStartVni(), e.getEndVni()) == true) { - throw new ApiMessageInterceptionException(Platform.err(SysErrors.INVALID_ARGUMENT_ERROR, + throw new ApiMessageInterceptionException(Platform.err(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10022, SysErrors.INVALID_ARGUMENT_ERROR, String.format("this vni range[start:%s, end:%s] has overlapped with vni range [%s], which start vni is [%s], end vni is [%s]", msg.getStartVni(), msg.getEndVni(), e.getUuid(), e.getStartVni(), e.getEndVni()) )); @@ -170,7 +171,7 @@ private void validate(APICreateVniRangeMsg msg) { } else if (pool.getAttachedVniRanges() != null && !pool.getAttachedVniRanges().isEmpty()) { for (VniRangeVO e : pool.getAttachedVniRanges()) { if (checkOverlap(msg.getStartVni(), msg.getEndVni(), e.getStartVni(), e.getEndVni()) == true) { - throw new ApiMessageInterceptionException(Platform.err(SysErrors.INVALID_ARGUMENT_ERROR, + throw new ApiMessageInterceptionException(Platform.err(ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10023, SysErrors.INVALID_ARGUMENT_ERROR, String.format("this vni range[start:%s, end:%s] has overlapped with vni range [%s], which start vni is [%s], end vni is [%s]", msg.getStartVni(), msg.getEndVni(), e.getUuid(), e.getStartVni(), e.getEndVni()) )); diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java index b0990b0790d..e11196568ca 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java @@ -37,6 +37,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class XInfiniApiHelper { @@ -81,7 +82,7 @@ public T callErrorOutWithRetry(XInfiniRequest req, C } } - throw new OperationFailureException(operr("xinfini request failed, message: %s.", + throw new OperationFailureException(operr(ORG_ZSTACK_XINFINI_10000, "xinfini request failed, message: %s.", req.getClass().getSimpleName())); } @@ -96,13 +97,13 @@ public void call(XInfiniRequest req, Completion comp return; } - completion.fail(operr("xinfini request failed, message: %s.", result.getMessage())); + completion.fail(operr(ORG_ZSTACK_XINFINI_10001, "xinfini request failed, message: %s.", result.getMessage())); }); } public void errorOut(XInfiniResponse rsp) { if (!rsp.isSuccess()) { - throw new OperationFailureException(operr("xinfini request failed, message: %s.", rsp.getMessage())); + throw new OperationFailureException(operr(ORG_ZSTACK_XINFINI_10002, "xinfini request failed, message: %s.", rsp.getMessage())); } } @@ -188,7 +189,7 @@ public BdcModule queryBdcByIp(String ip, boolean errorIfNotExist) { QueryBdcResponse rsp = queryErrorOut(req, QueryBdcResponse.class); if (rsp.getMetadata().getPagination().getCount() == 0) { if (errorIfNotExist) { - throw new OperationFailureException(operr("bdc with ip %s not found.", ip)); + throw new OperationFailureException(operr(ORG_ZSTACK_XINFINI_10003, "bdc with ip %s not found.", ip)); } return null; @@ -509,7 +510,7 @@ public void deleteBdcBdev(int bdevId, int bdcId) { return; } - throw new OperationFailureException(operr("delete bdev failed %s", rsp.getMessage())); + throw new OperationFailureException(operr(ORG_ZSTACK_XINFINI_10004, "delete bdev failed %s", rsp.getMessage())); } GetBdcBdevRequest gReq = new GetBdcBdevRequest(); @@ -553,7 +554,7 @@ public void deleteVolume(int volId, boolean force) { return; } - throw new OperationFailureException(operr("delete volume failed %s", rsp.getMessage())); + throw new OperationFailureException(operr(ORG_ZSTACK_XINFINI_10005, "delete volume failed %s", rsp.getMessage())); } GetVolumeRequest gReq = new GetVolumeRequest(); @@ -587,7 +588,7 @@ public void deleteVolumeSnapshot(int snapShotId) { if (exist) { VolumeSnapshotModule snap = getVolumeSnapshot(snapShotId); - throw new OperationFailureException(operr("snapshot [id:%s, name:%s] has %d cloned volumes, volumes names: %s", snapShotId, snap.getSpec().getName(), vRsp.getMetadata().getPagination().getCount(), volNames)); + throw new OperationFailureException(operr(ORG_ZSTACK_XINFINI_10006, "snapshot [id:%s, name:%s] has %d cloned volumes, volumes names: %s", snapShotId, snap.getSpec().getName(), vRsp.getMetadata().getPagination().getCount(), volNames)); } logger.info("all cloned volumes not exist in database, try to delete them"); // try to delete cloned volumes if not exist in db @@ -606,7 +607,7 @@ public void deleteVolumeSnapshot(int snapShotId) { return; } - throw new OperationFailureException(operr("delete volume snapshot failed %s", rsp.getMessage())); + throw new OperationFailureException(operr(ORG_ZSTACK_XINFINI_10007, "delete volume snapshot failed %s", rsp.getMessage())); } GetVolumeSnapshotRequest gReq = new GetVolumeSnapshotRequest(); gReq.setId(snapShotId); @@ -717,7 +718,7 @@ public void deleteVolumeClientGroupMapping(int mapId) { return; } - throw new OperationFailureException(operr("delete volume-client-group-mapping failed %s", rsp.getMessage())); + throw new OperationFailureException(operr(ORG_ZSTACK_XINFINI_10008, "delete volume-client-group-mapping failed %s", rsp.getMessage())); } GetVolumeClientGroupMappingRequest gReq = new GetVolumeClientGroupMappingRequest(); @@ -764,7 +765,7 @@ public void deleteIscsiClient(int iscsiClientId) { return; } - throw new OperationFailureException(operr("delete iscsi client failed %s", rsp.getMessage())); + throw new OperationFailureException(operr(ORG_ZSTACK_XINFINI_10009, "delete iscsi client failed %s", rsp.getMessage())); } GetIscsiClientRequest gReq = new GetIscsiClientRequest(); diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index c1e5d855d3a..0626b00ba7a 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -59,6 +59,7 @@ import static org.zstack.xinfini.XInfiniIscsiHelper.buildIscsiClientGroupName; import static org.zstack.xinfini.XInfiniIscsiHelper.iscsiHeartbeatVolumeName; import static org.zstack.xinfini.XInfiniPathHelper.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class XInfiniStorageController implements PrimaryStorageControllerSvc, PrimaryStorageNodeSvc { @@ -161,7 +162,7 @@ public void activate(BaseVolumeInfo v, HostInventory h, boolean shareable, Retur return; } - comp.fail(operr("not supported protocol[%s]", v.getProtocol())); + comp.fail(operr(ORG_ZSTACK_XINFINI_10011, "not supported protocol[%s]", v.getProtocol())); } private ActiveVolumeTO activeVhostVolume(HostInventory h, BaseVolumeInfo vol) { @@ -169,7 +170,7 @@ private ActiveVolumeTO activeVhostVolume(HostInventory h, BaseVolumeInfo vol) { BdcModule bdc = apiHelper.queryBdcByIp(h.getManagementIp()); VolumeModule volModule = getVolumeModule(vol); if (volModule == null) { - throw new OperationFailureException(operr("cannot get volume[%s] details, maybe it has been deleted", vol.getInstallPath())); + throw new OperationFailureException(operr(ORG_ZSTACK_XINFINI_10012, "cannot get volume[%s] details, maybe it has been deleted", vol.getInstallPath())); } VhostVolumeTO to = new VhostVolumeTO(); @@ -216,7 +217,7 @@ public void deactivate(String installPath, String protocol, HostInventory h, Com return; } - comp.fail(operr("not supported protocol[%s] for deactivate", protocol)); + comp.fail(operr(ORG_ZSTACK_XINFINI_10013, "not supported protocol[%s] for deactivate", protocol)); } private void deactivateIscsi(String installPath, HostInventory h) { @@ -332,7 +333,7 @@ public String getActivePath(BaseVolumeInfo v, HostInventory h, boolean shareable return target.getResourceURI(); } - throw new OperationFailureException(operr("not supported protocol[%s]", v.getProtocol())); + throw new OperationFailureException(operr(ORG_ZSTACK_XINFINI_10014, "not supported protocol[%s]", v.getProtocol())); } @Override @@ -346,7 +347,7 @@ public BaseVolumeInfo getActiveVolumeInfo(String activePath, HostInventory h, bo info.setShareable(shareable); } else { // TODO support other protocols - throw new OperationFailureException(operr("not supported get volume info from [%s]", activePath)); + throw new OperationFailureException(operr(ORG_ZSTACK_XINFINI_10015, "not supported get volume info from [%s]", activePath)); } VolumeModule vol = apiHelper.queryVolumeByName(buildVolumeName(volUuid)); @@ -402,7 +403,7 @@ public List getActiveClients(String installPath, String prot return c; }).collect(Collectors.toList()); } else { - throw new OperationFailureException(operr("not supported protocol[%s] for active", protocol)); + throw new OperationFailureException(operr(ORG_ZSTACK_XINFINI_10016, "not supported protocol[%s] for active", protocol)); } } @@ -532,26 +533,26 @@ public void connect(String config, String url, ReturnValueCompletion .orElse(null); if (connectedNode == null) { - comp.fail(operr("no connected node found")); + comp.fail(operr(ORG_ZSTACK_XINFINI_10017, "no connected node found")); return; } List nodes = apiHelper.queryNodes(connectedNode); if (CollectionUtils.isEmpty(nodes)) { - comp.fail(operr("no node found")); + comp.fail(operr(ORG_ZSTACK_XINFINI_10018, "no node found")); return; } xConfig.getNodes().forEach(it -> nodes.stream() .filter(it1 -> it1.getSpec().getAdminIp().equals(it.getIp()) && it1.getSpec().isRoleAfaAdmin()) .findAny() - .orElseThrow(() -> new OperationFailureException(operr("fail to get node %s details, check ip address and role config", it.getIp())))); + .orElseThrow(() -> new OperationFailureException(operr(ORG_ZSTACK_XINFINI_10019, "fail to get node %s details, check ip address and role config", it.getIp())))); info.setNodes(nodes.stream().map(XInfiniAddonInfo.Node::valueOf).collect(Collectors.toList())); info.getNodes().forEach(it -> it.setStatus(nodeIpStatus.get(it.getIp()))); List pools = apiHelper.queryPools(connectedNode); if (CollectionUtils.isEmpty(pools)) { - comp.fail(operr("no pool found")); + comp.fail(operr(ORG_ZSTACK_XINFINI_10020, "no pool found")); return; } @@ -559,7 +560,7 @@ public void connect(String config, String url, ReturnValueCompletion xConfig.getPools().forEach(it -> pools.stream() .filter(it1 -> it1.getSpec().getId() == it.getId()) .findAny() - .orElseThrow(() -> new OperationFailureException(operr("fail to get pool[id:%d, name:%s] %s details", it.getId(), it.getName())))); + .orElseThrow(() -> new OperationFailureException(operr(ORG_ZSTACK_XINFINI_10021, "fail to get pool[id:%d, name:%s] %s details", it.getId(), it.getName())))); } info.setPools(pools.stream().map(v -> getPoolAddonInfo(v, connectedNode)).collect(Collectors.toList())); vhostSocketDir = String.format("/var/run/bdc-%s/", apiHelper.getClusterUuid(connectedNode)); @@ -727,7 +728,7 @@ public StorageCapabilities reportCapabilities() { public String allocateSpace(AllocateSpaceSpec aspec) { PoolModule pool = allocateFreePool(aspec.getSize()); if (pool == null) { - throw new OperationFailureException(operr("no available pool with enough space[%d] and healthy status", aspec.getSize())); + throw new OperationFailureException(operr(ORG_ZSTACK_XINFINI_10022, "no available pool with enough space[%d] and healthy status", aspec.getSize())); } return buildXInfiniPath(pool.getSpec().getId(), null); @@ -751,7 +752,7 @@ public void createVolume(CreateVolumeSpec v, ReturnValueCompletion if (v.getAllocatedUrl() == null) { PoolModule pool = allocateFreePool(v.getSize()); if (pool == null) { - comp.fail(operr("no available pool with enough space[%d] and healthy status", v.getSize())); + comp.fail(operr(ORG_ZSTACK_XINFINI_10023, "no available pool with enough space[%d] and healthy status", v.getSize())); return; } poolId = pool.getSpec().getId(); @@ -897,7 +898,7 @@ public void setVolumeQos(BaseVolumeInfo v, Completion comp) { || (v.getQos().getWriteBandwidth() != null && v.getQos().getWriteBandwidth() > 0) || (v.getQos().getReadIOPS() != null && v.getQos().getReadIOPS() > 0) || v.getQos().getWriteIOPS() != null && v.getQos().getWriteIOPS() > 0) { - throw new OperationFailureException(operr("xinfini only support set total qos")); + throw new OperationFailureException(operr(ORG_ZSTACK_XINFINI_10024, "xinfini only support set total qos")); } apiHelper.setVolumeQos(getVolIdFromPath(v.getInstallPath()), XinfiniVolumeQos.valueOf(v.getQos())); @@ -914,7 +915,7 @@ public void deleteVolumeQos(BaseVolumeInfo v, Completion comp) { public void export(ExportSpec espec, VolumeProtocol protocol, ReturnValueCompletion comp) { if (protocol == VolumeProtocol.NVMEoF) { // TODO - comp.fail(operr("not support export nvmeof yet")); + comp.fail(operr(ORG_ZSTACK_XINFINI_10025, "not support export nvmeof yet")); } else if (protocol == VolumeProtocol.iSCSI) { IscsiRemoteTarget target = exportIscsi(espec); comp.success(target); @@ -976,7 +977,7 @@ private IscsiRemoteTarget createIscsiRemoteTarget(String clientIp, String client .collect(Collectors.toList()); if (groupRelatedGateways.isEmpty()) { - throw new OperationFailureException(operr("no active gateway found for client[%s]", clientIqn)); + throw new OperationFailureException(operr(ORG_ZSTACK_XINFINI_10026, "no active gateway found for client[%s]", clientIqn)); } // refresh client @@ -995,11 +996,11 @@ private IscsiRemoteTarget createIscsiRemoteTarget(String clientIp, String client @Override public void unexport(ExportSpec espec, RemoteTarget remoteTarget, VolumeProtocol protocol, Completion comp) { if (protocol == VolumeProtocol.NVMEoF) { - comp.fail(operr("not support unexport nvmeof yet")); + comp.fail(operr(ORG_ZSTACK_XINFINI_10027, "not support unexport nvmeof yet")); } else if (protocol == VolumeProtocol.iSCSI) { unexportIscsi(espec.getInstallPath(), espec.getClientQualifiedName()); } else { - comp.fail(operr("unsupported protocol %s", protocol.name())); + comp.fail(operr(ORG_ZSTACK_XINFINI_10028, "unsupported protocol %s", protocol.name())); return; } comp.success(); diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageFactory.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageFactory.java index a21b84bf43d..70d33ea08d0 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageFactory.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageFactory.java @@ -15,6 +15,7 @@ import java.util.List; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class XInfiniStorageFactory implements ExternalPrimaryStorageSvcBuilder, BackupStorageSelector, VolumeAfterExpungeExtensionPoint { @@ -39,7 +40,7 @@ public PrimaryStorageNodeSvc buildNodeSvc(ExternalPrimaryStorageVO vo) { public void discover(String url, String config, ReturnValueCompletion completion) { // xinfini must set config if (StringUtils.isEmpty(config)) { - completion.fail(operr("empty config, cannot discover xinfini")); + completion.fail(operr(ORG_ZSTACK_XINFINI_10010, "empty config, cannot discover xinfini")); return; } diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniResponse.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniResponse.java index dd24e94ec9e..15971c9c5d7 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniResponse.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniResponse.java @@ -4,6 +4,7 @@ import org.zstack.header.errorcode.ErrorCode; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class XInfiniResponse { protected String message; @@ -30,7 +31,7 @@ public boolean isSuccess() { } public ErrorCode getError() { - return operr(message); + return operr(ORG_ZSTACK_XINFINI_SDK_10000, message); } public boolean resourceIsDeleted() { diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XinfiniApiResult.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XinfiniApiResult.java index a3304c22667..58063bf6dc1 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XinfiniApiResult.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XinfiniApiResult.java @@ -14,6 +14,7 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class XinfiniApiResult { private static final CLogger logger = Utils.getLogger(XinfiniApiResult.class); @@ -105,7 +106,7 @@ public T getResult(Class clz) { try { ret = XInfiniClient.gson.fromJson(resultString, clz); } catch (Exception e) { - throw new OperationFailureException(operr("format api result to class[%s] failed, resultString: %s, exception: %s", clz.getName(), resultString, e.getMessage())); + throw new OperationFailureException(operr(ORG_ZSTACK_XINFINI_SDK_10001, "format api result to class[%s] failed, resultString: %s, exception: %s", clz.getName(), resultString, e.getMessage())); } return ret; } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/MdsUri.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/MdsUri.java index 9fa1e00f38c..d0c990d6826 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/MdsUri.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/MdsUri.java @@ -13,6 +13,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * @author Xingwei Yu @@ -52,27 +53,27 @@ public static String getQueryValue(URI uri, String name) { } private ErrorCode errorCode(String err) { - return argerr(err); + return argerr(ORG_ZSTACK_STORAGE_ZBS_10000, err); } public MdsUri(String url) { try { int at = url.lastIndexOf("@"); if (at == -1) { - throw new OperationFailureException(operr("invalid mdsUrl[%s], the sshUsername:sshPassword part is invalid. A valid mdsUrl is" + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_ZBS_10001, "invalid mdsUrl[%s], the sshUsername:sshPassword part is invalid. A valid mdsUrl is" + " in format of %s", url, MDS_URL_FORMAT)); } String userInfo = url.substring(0, at); if (!userInfo.contains(":")) { - throw new OperationFailureException(operr("invalid mdsUrl[%s], the sshUsername:sshPassword part is invalid. A valid mdsUrl is" + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_ZBS_10002, "invalid mdsUrl[%s], the sshUsername:sshPassword part is invalid. A valid mdsUrl is" + " in format of %s", url, MDS_URL_FORMAT)); } String rest = url.substring(at+1); String[] ssh = userInfo.split(":", 2); if (ssh.length != 2 || ssh[0].isEmpty() || ssh[1].isEmpty()) { - throw new OperationFailureException(operr("invalid mdsUrl[%s]. SSH username and password must be separated by ':' and cannot be empty. A valid monUrl format is %s", url, MDS_URL_FORMAT)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_ZBS_10003, "invalid mdsUrl[%s]. SSH username and password must be separated by ':' and cannot be empty. A valid monUrl format is %s", url, MDS_URL_FORMAT)); } username = ssh[0]; @@ -81,14 +82,14 @@ public MdsUri(String url) { URI uri = new URI(String.format("ssh://%s", rest)); hostname = uri.getHost(); if (hostname == null) { - throw new OperationFailureException(operr("invalid mdsUrl[%s], hostname cannot be null. A valid mdsUrl is" + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_ZBS_10004, "invalid mdsUrl[%s], hostname cannot be null. A valid mdsUrl is" + " in format of %s", url, MDS_URL_FORMAT) ); } sshPort = uri.getPort() == -1 ? sshPort : uri.getPort(); if (sshPort < 1 || sshPort > 65535) { - throw new OperationFailureException(operr("invalid mdsUrl[%s], the ssh port is greater than 65535 or smaller than 1. A valid mdsUrl is" + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_ZBS_10005, "invalid mdsUrl[%s], the ssh port is greater than 65535 or smaller than 1. A valid mdsUrl is" + " in format of %s", url, MDS_URL_FORMAT) ); } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java index ecdd3d65e18..7016205561c 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java @@ -17,6 +17,7 @@ import java.util.concurrent.TimeUnit; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * @author Xingwei Yu @@ -49,7 +50,7 @@ protected void checkSshAndTools() { ssh.setHostname(self.getAddr()).setUsername(self.getUsername()).setPassword(self.getPassword()).setPort(self.getPort()) .checkTool("zbs").setTimeout(60).runErrorByExceptionAndClose(); } catch (SshException e) { - throw new OperationFailureException(operr("failed to SSH or zbs-tools was not installed in MDS[%s], you need to check the SSH configuration and dependencies", self.getAddr())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_ZBS_10039, "failed to SSH or zbs-tools was not installed in MDS[%s], you need to check the SSH configuration and dependencies", self.getAddr())); } } @@ -60,7 +61,7 @@ protected void checkStorageHealth() { ret = ssh.setHostname(self.getAddr()).setUsername(self.getUsername()).setPassword(self.getPassword()).setPort(self.getPort()) .shell("zbs status mds --format json").setTimeout(60).runAndClose(); } catch (SshException e) { - throw new OperationFailureException(operr("failed to get MDS[%s] metadata, you need to check the ZBS configuration", self.getAddr())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_ZBS_10040, "failed to get MDS[%s] metadata, you need to check the ZBS configuration", self.getAddr())); } if (ret.getReturnCode() != 0) { @@ -137,7 +138,7 @@ public ErrorCode buildErrorCode() { if (success) { return null; } - return operr("operation error, because:%s", error); + return operr(ORG_ZSTACK_STORAGE_ZBS_10041, "operation error, because:%s", error); } } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java index 86a57a6ab6e..7f75ace1eef 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java @@ -33,6 +33,7 @@ import java.util.concurrent.TimeUnit; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * @author Xingwei Yu @@ -171,7 +172,7 @@ public void run(FlowTrigger trigger, Map data) { .setHostname(getSelf().getAddr()) .setPort(getSelf().getPort()).runErrorByExceptionAndClose(); } catch (SshException ex) { - throw new OperationFailureException(operr(ex.toString())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_ZBS_10033, ex.toString())); } trigger.next(); @@ -212,7 +213,7 @@ public void run(FlowTrigger trigger, Map data) { @Override public void success(SyncMetadataRsp ret) { if (!ret.isSuccess()) { - trigger.fail(operr("unable to sync metadata from ZBS primary storage MDS[%s], because %s", + trigger.fail(operr(ORG_ZSTACK_STORAGE_ZBS_10034, "unable to sync metadata from ZBS primary storage MDS[%s], because %s", getSelf().getAddr(), ret.getError())); return; } @@ -339,7 +340,7 @@ public void success(PingRsp rsp) { return; } - comp.addError(operr("%s", rsp.getError())); + comp.addError(operr(ORG_ZSTACK_STORAGE_ZBS_10035, "%s", rsp.getError())); if (step.equals(MAX_PING_CNT)) { comp.allDone(); @@ -376,7 +377,7 @@ public void done(ErrorCodeList errorCodeList) { } if (!dbf.getDbVersion().equals(version[0])) { - completion.fail(operr("ZBS primary storage MDS[%s] version[%s] is different" + + completion.fail(operr(ORG_ZSTACK_STORAGE_ZBS_10036, "ZBS primary storage MDS[%s] version[%s] is different" + " from management node[%s], please reconnect the MDS and check SSH connection", getSelf().getAddr(), version[0], dbf.getDbVersion())); return; diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 7abfdef366e..b38b8cfc237 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -63,6 +63,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; import static org.zstack.storage.zbs.ZbsHelper.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * @author Xingwei Yu @@ -138,7 +139,7 @@ public void activate(BaseVolumeInfo v, HostInventory h, boolean shareable, Retur return; } - comp.fail(operr("not supported protocol[%s]", v.getProtocol())); + comp.fail(operr(ORG_ZSTACK_STORAGE_ZBS_10006, "not supported protocol[%s]", v.getProtocol())); } @Override @@ -162,7 +163,7 @@ public String getActivePath(BaseVolumeInfo v, HostInventory h, boolean shareable if (VolumeProtocol.CBD.toString().equals(v.getProtocol())) { return convertZbsPathToCbdPath(v.getInstallPath(), this::getPhysicalPoolName); } else { - throw new OperationFailureException(operr("not supported protocol[%s] for active", v.getProtocol())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_ZBS_10007, "not supported protocol[%s] for active", v.getProtocol())); } } @@ -180,7 +181,7 @@ public List getActiveClients(String installPath, String prot List clients = new ArrayList<>(); if (!rsp.isSuccess()) { - throw new OperationFailureException(operr(rsp.getError())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_ZBS_10008, rsp.getError())); } if (rsp.getClients() != null) { @@ -192,7 +193,7 @@ public List getActiveClients(String installPath, String prot } return clients; } else { - throw new OperationFailureException(operr("not supported protocol[%s] for active", protocol)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_ZBS_10009, "not supported protocol[%s] for active", protocol)); } } @@ -215,7 +216,7 @@ public void setup() { public void run(FlowTrigger trigger, Map data) { KVMHostVO host = Q.New(KVMHostVO.class).eq(KVMHostVO_.uuid, h.getUuid()).find(); if (host == null) { - trigger.fail(operr("cannot found kvm host[uuid:%s], unable to deploy client", h.getUuid())); + trigger.fail(operr(ORG_ZSTACK_STORAGE_ZBS_10010, "cannot found kvm host[uuid:%s], unable to deploy client", h.getUuid())); return; } @@ -264,7 +265,7 @@ public void run(MessageReply reply) { KVMHostAsyncHttpCallReply hreply = reply.castReply(); UpdateHostDependencyRsp rsp = hreply.toResponse(UpdateHostDependencyRsp.class); if (!rsp.isSuccess()) { - trigger.fail(operr(rsp.getError())); + trigger.fail(operr(ORG_ZSTACK_STORAGE_ZBS_10011, rsp.getError())); return; } @@ -388,17 +389,17 @@ void connect(final FlowTrigger trigger) { if (!it.hasNext()) { if (errorCodes.getCauses().size() == mdsList.size()) { if (errorCodes.getCauses().isEmpty()) { - trigger.fail(operr("unable to connect to the ZBS primary storage[uuid:%s]," + + trigger.fail(operr(ORG_ZSTACK_STORAGE_ZBS_10012, "unable to connect to the ZBS primary storage[uuid:%s]," + " failed to connect all MDS", self.getUuid())); } else { - trigger.fail(operr(errorCodes, "unable to connect to the ZBS primary storage[uuid:%s]," + + trigger.fail(operr(ORG_ZSTACK_STORAGE_ZBS_10013, errorCodes, "unable to connect to the ZBS primary storage[uuid:%s]," + " failed to connect all MDS", self.getUuid())); } } else { ExternalPrimaryStorageVO vo = dbf.reload(self); if (vo == null) { - trigger.fail(operr("ZBS primary storage[uuid:%s] may have been deleted", self.getUuid())); + trigger.fail(operr(ORG_ZSTACK_STORAGE_ZBS_10014, "ZBS primary storage[uuid:%s] may have been deleted", self.getUuid())); } else { self = vo; addonInfo = newAddonInfo; @@ -486,7 +487,7 @@ public void run(FlowTrigger trigger, Map data) { new While<>(hosts).each((h, comp) -> { KVMHostVO host = Q.New(KVMHostVO.class).eq(KVMHostVO_.uuid, h.getUuid()).find(); if (host == null) { - comp.addError(operr("cannot found kvm host[uuid:%s], unable to deploy client", h.getUuid())); + comp.addError(operr(ORG_ZSTACK_STORAGE_ZBS_10015, "cannot found kvm host[uuid:%s], unable to deploy client", ((HostVO) h).getUuid())); comp.allDone(); return; } @@ -545,7 +546,7 @@ public void ping(ReturnValueCompletion completion) { reloadDbInfo(); if (addonInfo == null || addonInfo.getClusterInfo() == null) { - completion.fail(operr(String.format("addon info is null, primary storage[uuid:%s] is not ready, skip ping task", self.getUuid()))); + completion.fail(operr(ORG_ZSTACK_STORAGE_ZBS_10016, String.format("addon info is null, primary storage[uuid:%s] is not ready, skip ping task", self.getUuid()))); return; } @@ -690,7 +691,7 @@ public String allocateSpace(AllocateSpaceSpec aspec) { LogicalPoolInfo logicalPoolInfo = allocateFreePool(aspec.getSize(), p); if (logicalPoolInfo == null) { - throw new OperationFailureException(operr("no available logical pool with enough space[%d] and required url: %s", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_ZBS_10017, "no available logical pool with enough space[%d] and required url: %s", aspec.getSize(), aspec.getRequiredUrl())); } @@ -990,7 +991,7 @@ public void export(ExportSpec espec, VolumeProtocol protocol, ReturnValueComplet } if (protocol != VolumeProtocol.NBD) { - comp.fail(operr("unsupported protocol %s", protocol.name())); + comp.fail(operr(ORG_ZSTACK_STORAGE_ZBS_10018, "unsupported protocol %s", protocol.name())); return; } @@ -1022,7 +1023,7 @@ public void unexport(ExportSpec espec, RemoteTarget remoteTarget, VolumeProtocol } if (protocol != VolumeProtocol.NBD) { - comp.fail(operr("unsupported protocol %s", protocol.name())); + comp.fail(operr(ORG_ZSTACK_STORAGE_ZBS_10019, "unsupported protocol %s", protocol.name())); return; } @@ -1050,7 +1051,7 @@ public void fail(ErrorCode errorCode) { } }).setTargetMds(uri.getHost()).call(); } catch (URISyntaxException e) { - comp.fail(operr("invalid URI syntax: %s", e.getMessage())); + comp.fail(operr(ORG_ZSTACK_STORAGE_ZBS_10020, "invalid URI syntax: %s", e.getMessage())); } } @@ -1140,26 +1141,26 @@ public String validateConfig(String config) throws ApiMessageInterceptionExcepti } if (current.getLogicalPoolName().contains("/")) { - throw new ApiMessageInterceptionException(argerr("invalid logical pool name[%s]", current.getLogicalPoolName())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_ZBS_10021, "invalid logical pool name[%s]", current.getLogicalPoolName())); } if (!current.getPoolNames().contains(current.getLogicalPoolName())) { - throw new ApiMessageInterceptionException(argerr("invalid pool name[%s]", current.getLogicalPoolName())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_ZBS_10022, "invalid pool name[%s]", current.getLogicalPoolName())); } if (CollectionUtils.isEmpty(current.getPoolNames())) { - throw new ApiMessageInterceptionException(argerr("ensure at least one pool is configured")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_ZBS_10023, "ensure at least one pool is configured")); } if (CollectionUtils.isEmpty(current.getMdsUrls())) { - throw new ApiMessageInterceptionException(argerr("ensure at least one MDS is configured")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_ZBS_10024, "ensure at least one MDS is configured")); } List newMdsInfos = MdsInfo.valueOf(current.getMdsUrls()); List duplicateMdsInfos = newMdsInfos.stream().collect(Collectors.groupingBy(MdsInfo::getAddr)) .values().stream().filter(addr -> addr.size() > 1).flatMap(List::stream).collect(Collectors.toList()); if (!duplicateMdsInfos.isEmpty()) { - throw new ApiMessageInterceptionException(argerr("do not allow to add duplicate MDS[%s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_ZBS_10025, "do not allow to add duplicate MDS[%s]", duplicateMdsInfos.stream().map(MdsInfo::getAddr).distinct().collect(Collectors.joining(", ")) )); } @@ -1239,7 +1240,7 @@ protected String getPhysicalPoolName(String logicalPoolName) { reloadDbInfo(); String physicalPool = physicalPoolByLogicalPool.get(logicalPoolName); if (physicalPool == null) { - throw new OperationFailureException(operr("cannot find physical pool for logical pool[%s]", logicalPoolName)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_ZBS_10026, "cannot find physical pool for logical pool[%s]", logicalPoolName)); } return physicalPool; } @@ -1309,7 +1310,7 @@ HttpCaller setTargetMds(String mdsAddr) { mdsInfos.removeIf(it -> !it.getAddr().equals(mdsAddr)); if (mdsInfos.isEmpty()) { throw new OperationFailureException(operr( - "not found MDS[%s] of zbs primary storage[uuid:%s] node", mdsAddr, self.getUuid()) + ORG_ZSTACK_STORAGE_ZBS_10027, "not found MDS[%s] of zbs primary storage[uuid:%s] node", mdsAddr, self.getUuid()) ); } @@ -1332,7 +1333,7 @@ private List prepareMds() { mds.removeIf(it -> it.getStatus() != MdsStatus.Connected); if (mds.isEmpty()) { throw new OperationFailureException(operr( - "all MDS of ZBS primary storage[uuid:%s] are not in Connected state", self.getUuid()) + ORG_ZSTACK_STORAGE_ZBS_10028, "all MDS of ZBS primary storage[uuid:%s] are not in Connected state", self.getUuid()) ); } @@ -1345,7 +1346,7 @@ private void prepareMdsIterator() { private T doSyncCall() { if (!it.hasNext()) { - throw new OperationFailureException(operr(errorCodes, "all MDS cannot execute http call[%s]", path)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_ZBS_10029, errorCodes, "all MDS cannot execute http call[%s]", path)); } ZbsPrimaryStorageMdsBase base = it.next(); @@ -1355,11 +1356,11 @@ private T doSyncCall() { if (!ret.isSuccess()) { logger.warn(String.format("failed to execute http call[%s] on MDS[%s], error is: %s", path, base.getSelf().getAddr(), JSONObjectUtil.toJsonString(ret.getError()))); - errorCodes.getCauses().add(operr(ret.getError())); + errorCodes.getCauses().add(operr(ORG_ZSTACK_STORAGE_ZBS_10030, ret.getError())); if (tryNext) { return doSyncCall(); } else { - throw new OperationFailureException(operr(errorCodes, "all MDS cannot execute http call[%s]", path)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_ZBS_10031, errorCodes, "all MDS cannot execute http call[%s]", path)); } } @@ -1368,7 +1369,7 @@ private T doSyncCall() { private void doCall() { if (!it.hasNext()) { - callback.fail(operr(errorCodes, "all MDS cannot execute http call[%s]", path)); + callback.fail(operr(ORG_ZSTACK_STORAGE_ZBS_10032, errorCodes, "all MDS cannot execute http call[%s]", path)); return; } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java index 9dab35c3ed0..5b7c491814e 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java @@ -14,6 +14,7 @@ import java.util.List; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * @author Xingwei Yu @@ -42,7 +43,7 @@ public void discover(String url, String config, ReturnValueCompletion preferBackupStorageTypes) { diff --git a/portal/src/main/java/org/zstack/portal/apimediator/ApiMediatorImpl.java b/portal/src/main/java/org/zstack/portal/apimediator/ApiMediatorImpl.java index 7409fbc5df1..7c41e6c174f 100755 --- a/portal/src/main/java/org/zstack/portal/apimediator/ApiMediatorImpl.java +++ b/portal/src/main/java/org/zstack/portal/apimediator/ApiMediatorImpl.java @@ -61,6 +61,7 @@ import static org.zstack.core.Platform.*; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class ApiMediatorImpl extends AbstractService implements @@ -97,7 +98,7 @@ private void dispatchMessage(APIMessage msg) { ApiMessageDescriptor desc = processor.getApiMessageDescriptor(msg); if (desc == null) { Map message = map(e(msg.getClass().getName(), msg)); - ErrorCode err = err(PortalErrors.NO_SERVICE_FOR_MESSAGE, "no service configuration file declares message: %s", JSONObjectUtil.toJsonString(message)); + ErrorCode err = err(ORG_ZSTACK_PORTAL_APIMEDIATOR_10005, PortalErrors.NO_SERVICE_FOR_MESSAGE, "no service configuration file declares message: %s", JSONObjectUtil.toJsonString(message)); logger.warn(err.getDetails()); bus.replyErrorByMessageType(msg, err); return; @@ -120,7 +121,7 @@ private void dispatchMessage(APIMessage msg) { } if (msg.getServiceId() == null) { - ErrorCode err = inerr("No service id found for API message[%s], message dump: %s", msg.getMessageName(), JSONObjectUtil.toJsonString(msg)); + ErrorCode err = inerr(ORG_ZSTACK_PORTAL_APIMEDIATOR_10006, "No service id found for API message[%s], message dump: %s", msg.getMessageName(), JSONObjectUtil.toJsonString(msg)); logger.warn(err.getDetails()); bus.replyErrorByMessageType(msg, err); return; @@ -403,7 +404,7 @@ public void run(MessageReply reply) { } else { IsManagementNodeReadyReply r = (IsManagementNodeReadyReply) reply; if (!r.isReady()) { - areply.setError(err(SysErrors.NOT_READY_ERROR, + areply.setError(err(ORG_ZSTACK_PORTAL_APIMEDIATOR_10007, SysErrors.NOT_READY_ERROR, "management node[uuid:%s] is not ready yet", fnodeId)); } } @@ -490,7 +491,7 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti APICreateMessage cmsg = (APICreateMessage) msg; if (cmsg.getResourceUuid() != null) { if (!StringDSL.isZStackUuid(cmsg.getResourceUuid())) { - throw new ApiMessageInterceptionException(argerr("resourceUuid[%s] is not a valid uuid. A valid uuid is a UUID(v4 recommended) with '-' stripped. " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_PORTAL_APIMEDIATOR_10008, "resourceUuid[%s] is not a valid uuid. A valid uuid is a UUID(v4 recommended) with '-' stripped. " + "see http://en.wikipedia.org/wiki/Universally_unique_identifier for format of UUID, the regular expression uses" + " to validate a UUID is '[0-9a-f]{8}[0-9a-f]{4}[1-5][0-9a-f]{3}[89ab][0-9a-f]{3}[0-9a-f]{12}'", cmsg.getResourceUuid())); } diff --git a/portal/src/main/java/org/zstack/portal/apimediator/ApiParamValidator.java b/portal/src/main/java/org/zstack/portal/apimediator/ApiParamValidator.java index cb586757019..76e7912024b 100644 --- a/portal/src/main/java/org/zstack/portal/apimediator/ApiParamValidator.java +++ b/portal/src/main/java/org/zstack/portal/apimediator/ApiParamValidator.java @@ -13,6 +13,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.inerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by Wenhao.Zhang on 22/11/22 @@ -47,10 +48,10 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti if (logger.isTraceEnabled()) { logger.trace(ie.getMessage(), ie); } - throw new ApiMessageInterceptionException(argerr(ie.getMessage(), ie.getArguments())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_PORTAL_APIMEDIATOR_10003, ie.getMessage(), ie.getArguments())); } catch (Exception e) { logger.warn(e.getMessage(), e); - throw new ApiMessageInterceptionException(inerr(e.getMessage())); + throw new ApiMessageInterceptionException(inerr(ORG_ZSTACK_PORTAL_APIMEDIATOR_10004, e.getMessage())); } return msg; } diff --git a/portal/src/main/java/org/zstack/portal/apimediator/PortApiValidator.java b/portal/src/main/java/org/zstack/portal/apimediator/PortApiValidator.java index e8fc939cbd6..cd0ae744c99 100755 --- a/portal/src/main/java/org/zstack/portal/apimediator/PortApiValidator.java +++ b/portal/src/main/java/org/zstack/portal/apimediator/PortApiValidator.java @@ -25,6 +25,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import static org.zstack.core.Platform.err; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class PortApiValidator implements ApiMessageValidator, Ordered { @Autowired @@ -60,8 +61,8 @@ protected List scripts() { } if (!invalids.isEmpty()) { - throw new ApiMessageInterceptionException(err(SysErrors.RESOURCE_NOT_FOUND, - "invalid field[%s], resource[uuids:%s, type:%s] not found", f.getName(), invalids, at.resourceType().getSimpleName() + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_PORTAL_APIMEDIATOR_10000, SysErrors.RESOURCE_NOT_FOUND, + "invalid field[%s], resource[uuids:%s, type:%s] not found", f.getName(), invalids, (String) at.resourceType().getSimpleName() )); } } @@ -81,7 +82,7 @@ protected List scripts() { Pattern p = Pattern.compile("[0-9a-f]{8}[0-9a-f]{4}[1-5][0-9a-f]{3}[89ab][0-9a-f]{3}[0-9a-f]{12}"); Matcher mt = p.matcher(value.toString()); if (!mt.matches()){ - throw new ApiMessageInterceptionException(err(SysErrors.RESOURCE_NOT_FOUND, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_PORTAL_APIMEDIATOR_10001, SysErrors.RESOURCE_NOT_FOUND, "invalid value[%s] of field [%s]", value, f.getName())); } @@ -95,8 +96,8 @@ protected List scripts() { bus.publish(evt); throw new StopRoutingException(); } else { - throw new ApiMessageInterceptionException(err(SysErrors.RESOURCE_NOT_FOUND, - "invalid field[%s], resource[uuid:%s, type:%s] not found", f.getName(), value, at.resourceType().getSimpleName() + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_PORTAL_APIMEDIATOR_10002, SysErrors.RESOURCE_NOT_FOUND, + "invalid field[%s], resource[uuid:%s, type:%s] not found", f.getName(), value, (String) at.resourceType().getSimpleName() )); } } diff --git a/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java b/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java index 3b10563e9af..a945ab77274 100755 --- a/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java +++ b/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java @@ -86,6 +86,7 @@ import java.util.stream.Collectors; import static org.zstack.utils.ExceptionDSL.throwableSafe; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class ManagementNodeManagerImpl extends AbstractService implements ManagementNodeManager, FindSameNodeExtensionPoint { private static final CLogger logger = Utils.getLogger(ManagementNodeManager.class); @@ -616,7 +617,7 @@ public void handle(ErrorCode errCode, Map data) { try { lock.unlock(); } catch (Exception e) { - ErrorCode errCode = Platform.inerr(e.getMessage()); + ErrorCode errCode = Platform.inerr(ORG_ZSTACK_PORTAL_MANAGEMENTNODE_10000, e.getMessage()); new BootErrorLog().write(errCode.toString()); ret.success = false; } diff --git a/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfig.java b/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfig.java index cbec4e64dde..276ca6bd35d 100644 --- a/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfig.java +++ b/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfig.java @@ -25,6 +25,7 @@ import static org.zstack.utils.CollectionDSL.map; import static org.zstack.utils.StringDSL.s; import static org.zstack.resourceconfig.ResourceConfigCanonicalEvents.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by MaJin on 2019/2/23. @@ -268,7 +269,7 @@ protected Map getResourceConfigValues(List resourceUuids if (typeByResourceUuids.keySet().size() >= 2) { throw new OperationFailureException( - operr("resources has inconsistent resourceTypes. Details: %s", typeByResourceUuids.toString())); + operr(ORG_ZSTACK_RESOURCECONFIG_10000, "resources has inconsistent resourceTypes. Details: %s", typeByResourceUuids.toString())); } typeByResourceUuids.forEach((resourceType, resUuids) -> { @@ -428,11 +429,11 @@ protected void deleteInDb(String resourceUuid) { private String getResourceType(String resourceUuid) { String resourceType = Q.New(ResourceVO.class).eq(ResourceVO_.uuid, resourceUuid).select(ResourceVO_.resourceType).findValue(); if (resourceType == null) { - throw new OperationFailureException(operr("cannot find resource[uuid: %s]", resourceUuid)); + throw new OperationFailureException(operr(ORG_ZSTACK_RESOURCECONFIG_10001, "cannot find resource[uuid: %s]", resourceUuid)); } if (!configGetter.containsKey(resourceType)) { - throw new OperationFailureException(operr("ResourceConfig [category:%s, name:%s]" + + throw new OperationFailureException(operr(ORG_ZSTACK_RESOURCECONFIG_10002, "ResourceConfig [category:%s, name:%s]" + " cannot bind to resourceType: %s", globalConfig.getCategory(), globalConfig.getName(), resourceType)); } return resourceType; diff --git a/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigApiInterceptor.java b/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigApiInterceptor.java index 90a92d1e744..c508a16f7cf 100644 --- a/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigApiInterceptor.java +++ b/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigApiInterceptor.java @@ -21,6 +21,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class ResourceConfigApiInterceptor implements ApiMessageInterceptor { @@ -53,13 +54,13 @@ private void validate(APIUpdateResourceConfigsMsg msg) { GlobalConfig gc = gcf.getAllConfig().get(identity); if (gc == null) { - throw new ApiMessageInterceptionException(argerr("no global config[category:%s, name:%s] found", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_RESOURCECONFIG_10004, "no global config[category:%s, name:%s] found", resourceConfigAO.getCategory(), identity)); } ResourceConfig rc = rcf.getResourceConfig(gc.getIdentity()); if (rc == null) { - throw new ApiMessageInterceptionException(argerr("global config[category:%s, name:%s] cannot bind resource", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_RESOURCECONFIG_10005, "global config[category:%s, name:%s] cannot bind resource", resourceConfigAO.getCategory(), identity)); } rc.validateNewValue(msg.getResourceUuid(), resourceConfigAO.getValue()); @@ -82,13 +83,13 @@ private void validate(ResourceConfigMessage msg) { for (String identity : identities) { GlobalConfig gc = gcf.getAllConfig().get(identity); if (gc == null) { - throw new ApiMessageInterceptionException(argerr("no global config[category:%s, name:%s] found", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_RESOURCECONFIG_10006, "no global config[category:%s, name:%s] found", msg.getCategory(), identity)); } ResourceConfig rc = rcf.getResourceConfig(gc.getIdentity()); if (rc == null) { - throw new ApiMessageInterceptionException(argerr("global config[category:%s, name:%s] cannot bind resource", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_RESOURCECONFIG_10007, "global config[category:%s, name:%s] cannot bind resource", msg.getCategory(), identity)); } } @@ -100,7 +101,7 @@ private void validate(APIGetResourceConfigMsg msg) { } if (!CheckIfAccountCanAccessResource.check(Collections.singletonList(msg.getResourceUuid()), msg.getSession().getAccountUuid()).isEmpty()) { - throw new ApiMessageInterceptionException(argerr("account has no access to the resource[uuid: %s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_RESOURCECONFIG_10008, "account has no access to the resource[uuid: %s]", msg.getResourceUuid())); } } @@ -111,7 +112,7 @@ private void validate(APIGetResourceConfigsMsg msg) { } if (!CheckIfAccountCanAccessResource.check(Collections.singletonList(msg.getResourceUuid()), msg.getSession().getAccountUuid()).isEmpty()) { - throw new ApiMessageInterceptionException(argerr("account has no access to the resource[uuid: %s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_RESOURCECONFIG_10009, "account has no access to the resource[uuid: %s]", msg.getResourceUuid())); } } diff --git a/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigFacadeImpl.java b/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigFacadeImpl.java index 2c5fa2aa959..db3c696392c 100644 --- a/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigFacadeImpl.java +++ b/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigFacadeImpl.java @@ -20,6 +20,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class ResourceConfigFacadeImpl extends AbstractService implements ResourceConfigFacade { private static final CLogger logger = Utils.getLogger(ResourceConfigFacadeImpl.class); @@ -79,7 +80,7 @@ private void handle(APIUpdateResourceConfigMsg msg) { rc.updateValue(msg.getResourceUuid(), msg.getValue()); evt.setInventory(ResourceConfigInventory.valueOf(rc.loadConfig(msg.getResourceUuid()))); } catch (GlobalConfigException e) { - evt.setError(operr(e.getMessage())); + evt.setError(operr(ORG_ZSTACK_RESOURCECONFIG_10003, e.getMessage())); } bus.publish(evt); diff --git a/rest/src/main/resources/scripts/SdkApiTemplate.groovy b/rest/src/main/resources/scripts/SdkApiTemplate.groovy index 7ff5e238cee..4c3a23fd573 100755 --- a/rest/src/main/resources/scripts/SdkApiTemplate.groovy +++ b/rest/src/main/resources/scripts/SdkApiTemplate.groovy @@ -317,7 +317,7 @@ public class ${clzName} extends ${isQueryApi ? "QueryAction" : "AbstractAction"} public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateDataVolumeFromVolumeBackupAction.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateDataVolumeFromVolumeBackupAction.java index 9fee7489e87..243cf299c3a 100644 --- a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateDataVolumeFromVolumeBackupAction.java +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateDataVolumeFromVolumeBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateDataVolumeTemplateFromVolumeBackupAction.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateDataVolumeTemplateFromVolumeBackupAction.java index 444f12d7f9b..9f118bf4b54 100644 --- a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateDataVolumeTemplateFromVolumeBackupAction.java +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateDataVolumeTemplateFromVolumeBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateRootVolumeTemplateFromVolumeBackupAction.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateRootVolumeTemplateFromVolumeBackupAction.java index caab3b443e9..a87113aa081 100644 --- a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateRootVolumeTemplateFromVolumeBackupAction.java +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateRootVolumeTemplateFromVolumeBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateVmBackupAction.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateVmBackupAction.java index 667edc6652b..235a8f31b99 100644 --- a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateVmBackupAction.java +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateVmBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateVmFromVmBackupAction.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateVmFromVmBackupAction.java index 8af22e3fe97..0701c56bb4d 100644 --- a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateVmFromVmBackupAction.java +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateVmFromVmBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateVmFromVolumeBackupAction.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateVmFromVolumeBackupAction.java index 6d044b4a4b1..ebc015f3576 100644 --- a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateVmFromVolumeBackupAction.java +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateVmFromVolumeBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateVolumeBackupAction.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateVolumeBackupAction.java index c31fa27c8ce..bca24131ea0 100644 --- a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateVolumeBackupAction.java +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateVolumeBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/DeleteVmBackupAction.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/DeleteVmBackupAction.java index c93eaafa589..69279fee8f6 100644 --- a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/DeleteVmBackupAction.java +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/DeleteVmBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/DeleteVolumeBackupAction.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/DeleteVolumeBackupAction.java index cdcbe5f3a6f..f180f88d8f8 100644 --- a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/DeleteVolumeBackupAction.java +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/DeleteVolumeBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/QueryVolumeBackupAction.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/QueryVolumeBackupAction.java index b7c72bc5540..161e0c4a61c 100644 --- a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/QueryVolumeBackupAction.java +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/QueryVolumeBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/RecoverBackupFromImageStoreBackupStorageAction.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/RecoverBackupFromImageStoreBackupStorageAction.java index bce36f48049..788c9fe8650 100644 --- a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/RecoverBackupFromImageStoreBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/RecoverBackupFromImageStoreBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/RecoverVmBackupFromImageStoreBackupStorageAction.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/RecoverVmBackupFromImageStoreBackupStorageAction.java index d2a1a36a192..a9c33fc13cf 100644 --- a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/RecoverVmBackupFromImageStoreBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/RecoverVmBackupFromImageStoreBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/RevertVmFromVmBackupAction.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/RevertVmFromVmBackupAction.java index c0e3ebecb1f..f17b8414eb8 100644 --- a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/RevertVmFromVmBackupAction.java +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/RevertVmFromVmBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/RevertVolumeFromVolumeBackupAction.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/RevertVolumeFromVolumeBackupAction.java index 604e57bedec..7a435deb23d 100644 --- a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/RevertVolumeFromVolumeBackupAction.java +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/RevertVolumeFromVolumeBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/SyncBackupFromImageStoreBackupStorageAction.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/SyncBackupFromImageStoreBackupStorageAction.java index 7b51737f55b..1e0d759c675 100644 --- a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/SyncBackupFromImageStoreBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/SyncBackupFromImageStoreBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/SyncVmBackupAction.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/SyncVmBackupAction.java index d7158c75116..d6cc070f291 100644 --- a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/SyncVmBackupAction.java +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/SyncVmBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/SyncVmBackupFromImageStoreBackupStorageAction.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/SyncVmBackupFromImageStoreBackupStorageAction.java index 2eb6d8d86a0..6710b732a92 100644 --- a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/SyncVmBackupFromImageStoreBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/SyncVmBackupFromImageStoreBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/SyncVolumeBackupAction.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/SyncVolumeBackupAction.java index 76c4b8a8a43..2f16f93fee8 100644 --- a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/SyncVolumeBackupAction.java +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/SyncVolumeBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddAccessControlListEntryAction.java b/sdk/src/main/java/org/zstack/sdk/AddAccessControlListEntryAction.java index de5ec19d8e0..a67bfb2a0a4 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddAccessControlListEntryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddAccessControlListEntryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddAccessControlListRedirectRuleAction.java b/sdk/src/main/java/org/zstack/sdk/AddAccessControlListRedirectRuleAction.java index 859d5cee3da..741043fc2a3 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddAccessControlListRedirectRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddAccessControlListRedirectRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddAccessControlListToLoadBalancerAction.java b/sdk/src/main/java/org/zstack/sdk/AddAccessControlListToLoadBalancerAction.java index 518b0ae281e..b1e8ddca945 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddAccessControlListToLoadBalancerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddAccessControlListToLoadBalancerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddAccessControlRuleAction.java b/sdk/src/main/java/org/zstack/sdk/AddAccessControlRuleAction.java index 97838b36c3b..6c5aba6afa3 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddAccessControlRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddAccessControlRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddAliyunEbsBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/AddAliyunEbsBackupStorageAction.java index 80bdc635df7..06bc5e33302 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddAliyunEbsBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddAliyunEbsBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddAliyunEbsPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/AddAliyunEbsPrimaryStorageAction.java index 74b2d6076e0..8b8d70f6aa7 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddAliyunEbsPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddAliyunEbsPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddAliyunKeySecretAction.java b/sdk/src/main/java/org/zstack/sdk/AddAliyunKeySecretAction.java index f8003388687..aede97d79b2 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddAliyunKeySecretAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddAliyunKeySecretAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddAliyunNasAccessGroupAction.java b/sdk/src/main/java/org/zstack/sdk/AddAliyunNasAccessGroupAction.java index aae5db2f8c0..3d34604b129 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddAliyunNasAccessGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddAliyunNasAccessGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddAliyunNasFileSystemAction.java b/sdk/src/main/java/org/zstack/sdk/AddAliyunNasFileSystemAction.java index b0462f50eb2..f10e56b7145 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddAliyunNasFileSystemAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddAliyunNasFileSystemAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddAliyunNasMountTargetAction.java b/sdk/src/main/java/org/zstack/sdk/AddAliyunNasMountTargetAction.java index 5e072492fdb..d9ea76e6aa5 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddAliyunNasMountTargetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddAliyunNasMountTargetAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddAliyunNasPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/AddAliyunNasPrimaryStorageAction.java index 81ee38555da..8c408bd89d4 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddAliyunNasPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddAliyunNasPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddAliyunPanguPartitionAction.java b/sdk/src/main/java/org/zstack/sdk/AddAliyunPanguPartitionAction.java index 3552e1c18d1..78962feba2a 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddAliyunPanguPartitionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddAliyunPanguPartitionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddAppBuildSystemAction.java b/sdk/src/main/java/org/zstack/sdk/AddAppBuildSystemAction.java index 31d3f28b501..4d8efdd9b9d 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddAppBuildSystemAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddAppBuildSystemAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddBackendServerToServerGroupAction.java b/sdk/src/main/java/org/zstack/sdk/AddBackendServerToServerGroupAction.java index 297e459f50e..1f35fb0f987 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddBackendServerToServerGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddBackendServerToServerGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddBackupStoragesToReplicationGroupAction.java b/sdk/src/main/java/org/zstack/sdk/AddBackupStoragesToReplicationGroupAction.java index 2ae96c162bd..d7bbe62ce8c 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddBackupStoragesToReplicationGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddBackupStoragesToReplicationGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddBareMetal2GatewayAction.java b/sdk/src/main/java/org/zstack/sdk/AddBareMetal2GatewayAction.java index 403bc4a49ff..c8e1ffc062c 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddBareMetal2GatewayAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddBareMetal2GatewayAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddBareMetal2IpmiChassisAction.java b/sdk/src/main/java/org/zstack/sdk/AddBareMetal2IpmiChassisAction.java index 894047d687d..38648d3f5df 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddBareMetal2IpmiChassisAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddBareMetal2IpmiChassisAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddBlockPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/AddBlockPrimaryStorageAction.java index 1d3ab53b80a..30ae56e5201 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddBlockPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddBlockPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddBuildAppAction.java b/sdk/src/main/java/org/zstack/sdk/AddBuildAppAction.java index 3beba6ff956..32d467da81d 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddBuildAppAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddBuildAppAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddCCSCertificateAction.java b/sdk/src/main/java/org/zstack/sdk/AddCCSCertificateAction.java index 5956212ddc8..66b2808253c 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddCCSCertificateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddCCSCertificateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddCephBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/AddCephBackupStorageAction.java index b23c91f4dde..cd2540093f2 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddCephBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddCephBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddCephPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/AddCephPrimaryStorageAction.java index 37d858336b3..d06a986b1c6 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddCephPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddCephPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddCephPrimaryStoragePoolAction.java b/sdk/src/main/java/org/zstack/sdk/AddCephPrimaryStoragePoolAction.java index 8261e41d8e9..cfe72255f1f 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddCephPrimaryStoragePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddCephPrimaryStoragePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddCertificateToLoadBalancerListenerAction.java b/sdk/src/main/java/org/zstack/sdk/AddCertificateToLoadBalancerListenerAction.java index c66cab0f8e2..ddc3312e790 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddCertificateToLoadBalancerListenerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddCertificateToLoadBalancerListenerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddConnectionAccessPointFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/AddConnectionAccessPointFromRemoteAction.java index 61bb46ccfbf..3562ba0d098 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddConnectionAccessPointFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddConnectionAccessPointFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddContainerManagementEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/AddContainerManagementEndpointAction.java index 08e28d31657..0ff0c6f9334 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddContainerManagementEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddContainerManagementEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddDataCenterFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/AddDataCenterFromRemoteAction.java index d7b0f177060..b1eacea931b 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddDataCenterFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddDataCenterFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddDisasterImageStoreBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/AddDisasterImageStoreBackupStorageAction.java index 39e7c95d633..da48815b8fc 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddDisasterImageStoreBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddDisasterImageStoreBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddDnsToL3NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/AddDnsToL3NetworkAction.java index 803cf50bc0b..a4eaf940c01 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddDnsToL3NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddDnsToL3NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddDnsToVpcRouterAction.java b/sdk/src/main/java/org/zstack/sdk/AddDnsToVpcRouterAction.java index 8258221fa58..86254e3a414 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddDnsToVpcRouterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddDnsToVpcRouterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddExternalBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/AddExternalBackupStorageAction.java index 33c9ef0d12b..e947cf54f04 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddExternalBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddExternalBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddExternalPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/AddExternalPrimaryStorageAction.java index ec57c540ad4..5b014a9a3f4 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddExternalPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddExternalPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddFiSecSecurityMachineAction.java b/sdk/src/main/java/org/zstack/sdk/AddFiSecSecurityMachineAction.java index d21ee19c2db..5519342acc0 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddFiSecSecurityMachineAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddFiSecSecurityMachineAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddFlkSecSecurityMachineAction.java b/sdk/src/main/java/org/zstack/sdk/AddFlkSecSecurityMachineAction.java index 9e9cda9a097..1065bf1143d 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddFlkSecSecurityMachineAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddFlkSecSecurityMachineAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddHostRouteToL3NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/AddHostRouteToL3NetworkAction.java index 89e35d22f64..2210553ee51 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddHostRouteToL3NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddHostRouteToL3NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddHostToHostSchedulingRuleGroupAction.java b/sdk/src/main/java/org/zstack/sdk/AddHostToHostSchedulingRuleGroupAction.java index 8078c947a99..840d81026dd 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddHostToHostSchedulingRuleGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddHostToHostSchedulingRuleGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddHybridKeySecretAction.java b/sdk/src/main/java/org/zstack/sdk/AddHybridKeySecretAction.java index 2ff52e39747..f7d646bae0e 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddHybridKeySecretAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddHybridKeySecretAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddIdentityZoneFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/AddIdentityZoneFromRemoteAction.java index 93351fca14f..f59f0fd57ee 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddIdentityZoneFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddIdentityZoneFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddImageAction.java b/sdk/src/main/java/org/zstack/sdk/AddImageAction.java index 32b25bdee43..8227eef112c 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddImageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddImageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddImageStoreBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/AddImageStoreBackupStorageAction.java index eb7d39c417c..30d5ba641af 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddImageStoreBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddImageStoreBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddInfoSecSecurityMachineAction.java b/sdk/src/main/java/org/zstack/sdk/AddInfoSecSecurityMachineAction.java index e925ca1b3da..27990138745 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddInfoSecSecurityMachineAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddInfoSecSecurityMachineAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddIntegrityResourceAction.java b/sdk/src/main/java/org/zstack/sdk/AddIntegrityResourceAction.java index b886f52741c..4e4203b7a00 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddIntegrityResourceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddIntegrityResourceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddIpRangeAction.java b/sdk/src/main/java/org/zstack/sdk/AddIpRangeAction.java index b1daf461024..fa72e885954 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddIpRangeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddIpRangeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddIpRangeByNetworkCidrAction.java b/sdk/src/main/java/org/zstack/sdk/AddIpRangeByNetworkCidrAction.java index 05854dce059..11f5ea12d68 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddIpRangeByNetworkCidrAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddIpRangeByNetworkCidrAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddIpv6RangeAction.java b/sdk/src/main/java/org/zstack/sdk/AddIpv6RangeAction.java index 3024e9d5a05..86c95b5379a 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddIpv6RangeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddIpv6RangeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddIpv6RangeByNetworkCidrAction.java b/sdk/src/main/java/org/zstack/sdk/AddIpv6RangeByNetworkCidrAction.java index 58a7e7801c3..1d293bbc21b 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddIpv6RangeByNetworkCidrAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddIpv6RangeByNetworkCidrAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddIscsiServerAction.java b/sdk/src/main/java/org/zstack/sdk/AddIscsiServerAction.java index 1c3820822a0..abcc53b033e 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddIscsiServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddIscsiServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddJitSecurityMachineAction.java b/sdk/src/main/java/org/zstack/sdk/AddJitSecurityMachineAction.java index 87f3fd6f2ce..4f6b423e718 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddJitSecurityMachineAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddJitSecurityMachineAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddKVMHostAction.java b/sdk/src/main/java/org/zstack/sdk/AddKVMHostAction.java index 4e37f02e2c4..4430b124651 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddKVMHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddKVMHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddKVMHostFromConfigFileAction.java b/sdk/src/main/java/org/zstack/sdk/AddKVMHostFromConfigFileAction.java index 1a397cdce23..ae38c1f6ad8 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddKVMHostFromConfigFileAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddKVMHostFromConfigFileAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddL3NetworkToGroupAction.java b/sdk/src/main/java/org/zstack/sdk/AddL3NetworkToGroupAction.java index 6debe676630..161f7bae770 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddL3NetworkToGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddL3NetworkToGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddLdapServerAction.java b/sdk/src/main/java/org/zstack/sdk/AddLdapServerAction.java index 51597ccfd80..22cf93254ce 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddLdapServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddLdapServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddLocalPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/AddLocalPrimaryStorageAction.java index 2767e8211c3..6945f8cbc2f 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddLocalPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddLocalPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddLogConfigurationAction.java b/sdk/src/main/java/org/zstack/sdk/AddLogConfigurationAction.java index 8538477d4e9..8c4075aa20d 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddLogConfigurationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddLogConfigurationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddLogServerAction.java b/sdk/src/main/java/org/zstack/sdk/AddLogServerAction.java index f938f7534db..54344e22dc4 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddLogServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddLogServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddMdevDeviceSpecToVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/AddMdevDeviceSpecToVmInstanceAction.java index 1354204a287..b5d6402560c 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddMdevDeviceSpecToVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddMdevDeviceSpecToVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddMiniStorageAction.java b/sdk/src/main/java/org/zstack/sdk/AddMiniStorageAction.java index 3a3daba0f35..d4fa38b0b8c 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddMiniStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddMiniStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelAction.java index a43fcee825b..d05730e861d 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java index a702c54b525..5ec8f02097c 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java index 3062782ee51..eee64c65704 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddMonToCephBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/AddMonToCephBackupStorageAction.java index 9190c7c900c..d755a7c4bf4 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddMonToCephBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddMonToCephBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddMonToCephPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/AddMonToCephPrimaryStorageAction.java index f26ed4696d2..11fe2f5a519 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddMonToCephPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddMonToCephPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddNfsPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/AddNfsPrimaryStorageAction.java index 875c311f3f1..5b76d055d89 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddNfsPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddNfsPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddNvmeServerAction.java b/sdk/src/main/java/org/zstack/sdk/AddNvmeServerAction.java index aff935db2de..7b25c48a7b8 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddNvmeServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddNvmeServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddOssBucketFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/AddOssBucketFromRemoteAction.java index c6f45779f0d..1e96fcd3460 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddOssBucketFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddOssBucketFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddPciDeviceSpecToVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/AddPciDeviceSpecToVmInstanceAction.java index de2094d99ef..5cc6b5059ff 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddPciDeviceSpecToVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddPciDeviceSpecToVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddPreconfigurationTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/AddPreconfigurationTemplateAction.java index 65513ccadaa..f3ed71a0b5e 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddPreconfigurationTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddPreconfigurationTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddProxyToResourceAction.java b/sdk/src/main/java/org/zstack/sdk/AddProxyToResourceAction.java index 81fe1172958..c6a04d0444a 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddProxyToResourceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddProxyToResourceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddRemoteCidrsToIPsecConnectionAction.java b/sdk/src/main/java/org/zstack/sdk/AddRemoteCidrsToIPsecConnectionAction.java index 2007997616b..842e397bdcc 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddRemoteCidrsToIPsecConnectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddRemoteCidrsToIPsecConnectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddRendezvousPointToMulticastRouterAction.java b/sdk/src/main/java/org/zstack/sdk/AddRendezvousPointToMulticastRouterAction.java index b57ad1033af..7d092725ce1 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddRendezvousPointToMulticastRouterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddRendezvousPointToMulticastRouterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddReservedIpRangeAction.java b/sdk/src/main/java/org/zstack/sdk/AddReservedIpRangeAction.java index c61ed0bc9ee..b2a8daa8179 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddReservedIpRangeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddReservedIpRangeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddResourceStackVmPortMonitorAction.java b/sdk/src/main/java/org/zstack/sdk/AddResourceStackVmPortMonitorAction.java index 0065fe937ae..01a0b469827 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddResourceStackVmPortMonitorAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddResourceStackVmPortMonitorAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddResourcesToDirectoryAction.java b/sdk/src/main/java/org/zstack/sdk/AddResourcesToDirectoryAction.java index 4d0f3485e83..43845f6b30d 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddResourcesToDirectoryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddResourcesToDirectoryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddSanSecSecurityMachineAction.java b/sdk/src/main/java/org/zstack/sdk/AddSanSecSecurityMachineAction.java index 7a9106dc798..144c7c90a06 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddSanSecSecurityMachineAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddSanSecSecurityMachineAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddSchedulerJobGroupToSchedulerTriggerAction.java b/sdk/src/main/java/org/zstack/sdk/AddSchedulerJobGroupToSchedulerTriggerAction.java index 5c339e8dbdb..7d6b8fd0417 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddSchedulerJobGroupToSchedulerTriggerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddSchedulerJobGroupToSchedulerTriggerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddSchedulerJobToSchedulerTriggerAction.java b/sdk/src/main/java/org/zstack/sdk/AddSchedulerJobToSchedulerTriggerAction.java index 55ededaa5f5..62faa36cbbf 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddSchedulerJobToSchedulerTriggerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddSchedulerJobToSchedulerTriggerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddSchedulerJobsToSchedulerJobGroupAction.java b/sdk/src/main/java/org/zstack/sdk/AddSchedulerJobsToSchedulerJobGroupAction.java index 1c180310df7..e1181356525 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddSchedulerJobsToSchedulerJobGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddSchedulerJobsToSchedulerJobGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddSdnControllerAction.java b/sdk/src/main/java/org/zstack/sdk/AddSdnControllerAction.java index 8a03256cd95..fdb8eb51860 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddSdnControllerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddSdnControllerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddSecurityGroupRuleAction.java b/sdk/src/main/java/org/zstack/sdk/AddSecurityGroupRuleAction.java index c910f68be7d..6a035e9d6cb 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddSecurityGroupRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddSecurityGroupRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddServerGroupToLoadBalancerListenerAction.java b/sdk/src/main/java/org/zstack/sdk/AddServerGroupToLoadBalancerListenerAction.java index 55e54a65c3f..a847704e468 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddServerGroupToLoadBalancerListenerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddServerGroupToLoadBalancerListenerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddSftpBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/AddSftpBackupStorageAction.java index 4210713ef2c..2b699c67d1b 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddSftpBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddSftpBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddSharedBlockGroupPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/AddSharedBlockGroupPrimaryStorageAction.java index 7216cfbdbdf..b7de3c93729 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddSharedBlockGroupPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddSharedBlockGroupPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddSharedBlockToSharedBlockGroupAction.java b/sdk/src/main/java/org/zstack/sdk/AddSharedBlockToSharedBlockGroupAction.java index 9ad317a1312..6ed50ef8034 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddSharedBlockToSharedBlockGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddSharedBlockToSharedBlockGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddSharedMountPointPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/AddSharedMountPointPrimaryStorageAction.java index 0fa587c9e39..aa453d76285 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddSharedMountPointPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddSharedMountPointPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddSimulatorBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/AddSimulatorBackupStorageAction.java index 116604449c5..f85ea1d3ec4 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddSimulatorBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddSimulatorBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddSimulatorHostAction.java b/sdk/src/main/java/org/zstack/sdk/AddSimulatorHostAction.java index f5e051213d9..6f0d87c81b6 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddSimulatorHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddSimulatorHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddSimulatorPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/AddSimulatorPrimaryStorageAction.java index 2fd594b4e6e..939ce801373 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddSimulatorPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddSimulatorPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddStackTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/AddStackTemplateAction.java index 8acd3acca1f..d801fa72c45 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddStackTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddStackTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddStorageProtocolAction.java b/sdk/src/main/java/org/zstack/sdk/AddStorageProtocolAction.java index 09fa979834e..b4d59f101a5 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddStorageProtocolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddStorageProtocolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddUserToGroupAction.java b/sdk/src/main/java/org/zstack/sdk/AddUserToGroupAction.java index 4af7e354ddc..e86f933140e 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddUserToGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddUserToGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddV2VConversionHostAction.java b/sdk/src/main/java/org/zstack/sdk/AddV2VConversionHostAction.java index 65401b9b09d..2d2db221e1a 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddV2VConversionHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddV2VConversionHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddVCenterAction.java b/sdk/src/main/java/org/zstack/sdk/AddVCenterAction.java index 5a1bee15ca5..82fdaf932a9 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddVCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddVCenterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddVRouterNetworksToFlowMeterAction.java b/sdk/src/main/java/org/zstack/sdk/AddVRouterNetworksToFlowMeterAction.java index 6eceddb20f7..ed98080d49b 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddVRouterNetworksToFlowMeterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddVRouterNetworksToFlowMeterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddVRouterNetworksToOspfAreaAction.java b/sdk/src/main/java/org/zstack/sdk/AddVRouterNetworksToOspfAreaAction.java index b18fa8e7a28..67db69554e6 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddVRouterNetworksToOspfAreaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddVRouterNetworksToOspfAreaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddVRouterRouteEntryAction.java b/sdk/src/main/java/org/zstack/sdk/AddVRouterRouteEntryAction.java index 02f26acca1d..8f22393580a 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddVRouterRouteEntryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddVRouterRouteEntryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddVmNicToLoadBalancerAction.java b/sdk/src/main/java/org/zstack/sdk/AddVmNicToLoadBalancerAction.java index 1509c645ea6..aaca96ff7f2 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddVmNicToLoadBalancerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddVmNicToLoadBalancerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddVmNicToSecurityGroupAction.java b/sdk/src/main/java/org/zstack/sdk/AddVmNicToSecurityGroupAction.java index bd0b132a7c1..44701a7cc8c 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddVmNicToSecurityGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddVmNicToSecurityGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddVmToAffinityGroupAction.java b/sdk/src/main/java/org/zstack/sdk/AddVmToAffinityGroupAction.java index ea0ed694e49..580478de7df 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddVmToAffinityGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddVmToAffinityGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddVmToVmSchedulingRuleGroupAction.java b/sdk/src/main/java/org/zstack/sdk/AddVmToVmSchedulingRuleGroupAction.java index fec23569bf6..f1532aca893 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddVmToVmSchedulingRuleGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddVmToVmSchedulingRuleGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddXDragonHostAction.java b/sdk/src/main/java/org/zstack/sdk/AddXDragonHostAction.java index aa72b258376..9c45f805097 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddXDragonHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddXDragonHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AddZBoxAction.java b/sdk/src/main/java/org/zstack/sdk/AddZBoxAction.java index 6580b1d19b7..5b0745b00ac 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddZBoxAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddZBoxAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AllocateHostResourceAction.java b/sdk/src/main/java/org/zstack/sdk/AllocateHostResourceAction.java index 756d4f5dff0..41f3fdfbfc3 100644 --- a/sdk/src/main/java/org/zstack/sdk/AllocateHostResourceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AllocateHostResourceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ApplyDRSAdviceAction.java b/sdk/src/main/java/org/zstack/sdk/ApplyDRSAdviceAction.java index ad577e5b7d5..ac165ec53d1 100644 --- a/sdk/src/main/java/org/zstack/sdk/ApplyDRSAdviceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ApplyDRSAdviceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ApplyRuleSetChangesAction.java b/sdk/src/main/java/org/zstack/sdk/ApplyRuleSetChangesAction.java index 973e2b494fd..bf25a2424f9 100644 --- a/sdk/src/main/java/org/zstack/sdk/ApplyRuleSetChangesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ApplyRuleSetChangesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ApplyTemplateConfigAction.java b/sdk/src/main/java/org/zstack/sdk/ApplyTemplateConfigAction.java index fd1b73f10ee..490540684e4 100644 --- a/sdk/src/main/java/org/zstack/sdk/ApplyTemplateConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ApplyTemplateConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachAliyunDiskToEcsAction.java b/sdk/src/main/java/org/zstack/sdk/AttachAliyunDiskToEcsAction.java index b8482631319..2273f09d27c 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachAliyunDiskToEcsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachAliyunDiskToEcsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachAliyunKeyAction.java b/sdk/src/main/java/org/zstack/sdk/AttachAliyunKeyAction.java index 3aba129500f..97336decf90 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachAliyunKeyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachAliyunKeyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachAppBuildSystemToZoneAction.java b/sdk/src/main/java/org/zstack/sdk/AttachAppBuildSystemToZoneAction.java index 155d3a082f4..b254f09d8da 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachAppBuildSystemToZoneAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachAppBuildSystemToZoneAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachAutoScalingTemplateToGroupAction.java b/sdk/src/main/java/org/zstack/sdk/AttachAutoScalingTemplateToGroupAction.java index cfbe89091a8..22d6b49d59b 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachAutoScalingTemplateToGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachAutoScalingTemplateToGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachBackupStorageToZoneAction.java b/sdk/src/main/java/org/zstack/sdk/AttachBackupStorageToZoneAction.java index a5cd45c94d6..291f018fd86 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachBackupStorageToZoneAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachBackupStorageToZoneAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachBareMetal2GatewayToClusterAction.java b/sdk/src/main/java/org/zstack/sdk/AttachBareMetal2GatewayToClusterAction.java index 783b1fcfb30..314d89784f5 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachBareMetal2GatewayToClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachBareMetal2GatewayToClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachBareMetal2ProvisionNetworkToClusterAction.java b/sdk/src/main/java/org/zstack/sdk/AttachBareMetal2ProvisionNetworkToClusterAction.java index 0e49aceb0ee..3cc10284c9d 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachBareMetal2ProvisionNetworkToClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachBareMetal2ProvisionNetworkToClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachBaremetalPxeServerToClusterAction.java b/sdk/src/main/java/org/zstack/sdk/AttachBaremetalPxeServerToClusterAction.java index 213c63181ea..004925f8227 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachBaremetalPxeServerToClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachBaremetalPxeServerToClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachCCSCertificateToUserAction.java b/sdk/src/main/java/org/zstack/sdk/AttachCCSCertificateToUserAction.java index 24739810ad2..8942851c626 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachCCSCertificateToUserAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachCCSCertificateToUserAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachDataVolumeToHostAction.java b/sdk/src/main/java/org/zstack/sdk/AttachDataVolumeToHostAction.java index 3d9e12234c5..e55fe8b0e82 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachDataVolumeToHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachDataVolumeToHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachDataVolumeToVmAction.java b/sdk/src/main/java/org/zstack/sdk/AttachDataVolumeToVmAction.java index f3c8d2e3288..d7aa87181df 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachDataVolumeToVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachDataVolumeToVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachEipAction.java b/sdk/src/main/java/org/zstack/sdk/AttachEipAction.java index 10be102fc8f..62d6bd20ce7 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachEipAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachEipAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachFirewallRuleSetToL3Action.java b/sdk/src/main/java/org/zstack/sdk/AttachFirewallRuleSetToL3Action.java index 0d999b0bfa3..16a9c5b5bcb 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachFirewallRuleSetToL3Action.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachFirewallRuleSetToL3Action.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachGuestToolsIsoToVmAction.java b/sdk/src/main/java/org/zstack/sdk/AttachGuestToolsIsoToVmAction.java index 9828ceaa943..15d15afb7be 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachGuestToolsIsoToVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachGuestToolsIsoToVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachHybridEipToEcsAction.java b/sdk/src/main/java/org/zstack/sdk/AttachHybridEipToEcsAction.java index 0438797c9f5..205843a79d3 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachHybridEipToEcsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachHybridEipToEcsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachHybridKeyAction.java b/sdk/src/main/java/org/zstack/sdk/AttachHybridKeyAction.java index 067c8dcb8ff..5e8809c8c58 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachHybridKeyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachHybridKeyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachIscsiServerToClusterAction.java b/sdk/src/main/java/org/zstack/sdk/AttachIscsiServerToClusterAction.java index df3b3b41497..eb5a3001f1a 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachIscsiServerToClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachIscsiServerToClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachIsoToVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/AttachIsoToVmInstanceAction.java index e4fd5ceaaa0..793e45e1391 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachIsoToVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachIsoToVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachL2NetworkToClusterAction.java b/sdk/src/main/java/org/zstack/sdk/AttachL2NetworkToClusterAction.java index 014b1709a57..cf289f990f5 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachL2NetworkToClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachL2NetworkToClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachL3NetworkToVmAction.java b/sdk/src/main/java/org/zstack/sdk/AttachL3NetworkToVmAction.java index 99b44666c58..f2ab3247b7b 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachL3NetworkToVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachL3NetworkToVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachL3NetworkToVmNicAction.java b/sdk/src/main/java/org/zstack/sdk/AttachL3NetworkToVmNicAction.java index a4e9975bac7..80c471e3e61 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachL3NetworkToVmNicAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachL3NetworkToVmNicAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachL3NetworksToIPsecConnectionAction.java b/sdk/src/main/java/org/zstack/sdk/AttachL3NetworksToIPsecConnectionAction.java index acf6d971faf..bfd533eac2a 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachL3NetworksToIPsecConnectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachL3NetworksToIPsecConnectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachMdevDeviceToVmAction.java b/sdk/src/main/java/org/zstack/sdk/AttachMdevDeviceToVmAction.java index ead62c95ec9..00e2ca56e04 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachMdevDeviceToVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachMdevDeviceToVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachMonitorTriggerActionToTriggerAction.java b/sdk/src/main/java/org/zstack/sdk/AttachMonitorTriggerActionToTriggerAction.java index 6f64a2a1126..e246d599c0a 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachMonitorTriggerActionToTriggerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachMonitorTriggerActionToTriggerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachNetworkServiceToL3NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/AttachNetworkServiceToL3NetworkAction.java index 02f17f3eadd..53c52f35fb3 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachNetworkServiceToL3NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachNetworkServiceToL3NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachNfvInstToGroupAction.java b/sdk/src/main/java/org/zstack/sdk/AttachNfvInstToGroupAction.java index fd8e59ca2d8..8a85974445a 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachNfvInstToGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachNfvInstToGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachNicToBondingAction.java b/sdk/src/main/java/org/zstack/sdk/AttachNicToBondingAction.java index c44eb3457ae..12f689ce484 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachNicToBondingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachNicToBondingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachNvmeServerToClusterAction.java b/sdk/src/main/java/org/zstack/sdk/AttachNvmeServerToClusterAction.java index 41c39fcaab4..169532e2160 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachNvmeServerToClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachNvmeServerToClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachOssBucketToEcsDataCenterAction.java b/sdk/src/main/java/org/zstack/sdk/AttachOssBucketToEcsDataCenterAction.java index 3fb5e6cb32f..1f58599b9e8 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachOssBucketToEcsDataCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachOssBucketToEcsDataCenterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachPciDeviceToVmAction.java b/sdk/src/main/java/org/zstack/sdk/AttachPciDeviceToVmAction.java index 788c1739f0d..93091e3836c 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachPciDeviceToVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachPciDeviceToVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachPoliciesToUserAction.java b/sdk/src/main/java/org/zstack/sdk/AttachPoliciesToUserAction.java index 6ca7d79addc..7396c598bc3 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachPoliciesToUserAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachPoliciesToUserAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachPolicyRouteRuleSetToL3Action.java b/sdk/src/main/java/org/zstack/sdk/AttachPolicyRouteRuleSetToL3Action.java index 64d2a4a3047..19afc40e7d7 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachPolicyRouteRuleSetToL3Action.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachPolicyRouteRuleSetToL3Action.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachPolicyToUserAction.java b/sdk/src/main/java/org/zstack/sdk/AttachPolicyToUserAction.java index 69a909de01f..8dad18fcbc8 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachPolicyToUserAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachPolicyToUserAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachPolicyToUserGroupAction.java b/sdk/src/main/java/org/zstack/sdk/AttachPolicyToUserGroupAction.java index a39f01118f4..0fab39e7183 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachPolicyToUserGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachPolicyToUserGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachPortForwardingRuleAction.java b/sdk/src/main/java/org/zstack/sdk/AttachPortForwardingRuleAction.java index 4833f188cab..ca1801a8d60 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachPortForwardingRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachPortForwardingRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachPriceTableToAccountAction.java b/sdk/src/main/java/org/zstack/sdk/AttachPriceTableToAccountAction.java index 30e153c5b95..326823314cf 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachPriceTableToAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachPriceTableToAccountAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachPrimaryStorageToClusterAction.java b/sdk/src/main/java/org/zstack/sdk/AttachPrimaryStorageToClusterAction.java index 59f786f9dab..0fdc5b9fd24 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachPrimaryStorageToClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachPrimaryStorageToClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachProvisionNicToBondingAction.java b/sdk/src/main/java/org/zstack/sdk/AttachProvisionNicToBondingAction.java index ab3f6e5889f..5555347343a 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachProvisionNicToBondingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachProvisionNicToBondingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachScsiLunToVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/AttachScsiLunToVmInstanceAction.java index 14a0fc62a5a..87c87d78666 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachScsiLunToVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachScsiLunToVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachSecurityGroupToL3NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/AttachSecurityGroupToL3NetworkAction.java index 65db1fd10d6..e3e5523fce9 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachSecurityGroupToL3NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachSecurityGroupToL3NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachServiceToObservabilityServerAction.java b/sdk/src/main/java/org/zstack/sdk/AttachServiceToObservabilityServerAction.java index 55aef430174..cff61d5ad9b 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachServiceToObservabilityServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachServiceToObservabilityServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachSshKeyPairToVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/AttachSshKeyPairToVmInstanceAction.java index e6db901c3a6..1eec8dc78ab 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachSshKeyPairToVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachSshKeyPairToVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachTagToResourcesAction.java b/sdk/src/main/java/org/zstack/sdk/AttachTagToResourcesAction.java index 332b9d9eb28..b9570ee2690 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachTagToResourcesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachTagToResourcesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachUsbDeviceToVmAction.java b/sdk/src/main/java/org/zstack/sdk/AttachUsbDeviceToVmAction.java index e97c337785f..f5004b15d02 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachUsbDeviceToVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachUsbDeviceToVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachUserDefinedXmlHookScriptToVmAction.java b/sdk/src/main/java/org/zstack/sdk/AttachUserDefinedXmlHookScriptToVmAction.java index 2e5eb000f01..d06df7a48d9 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachUserDefinedXmlHookScriptToVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachUserDefinedXmlHookScriptToVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachVRouterRouteTableToVRouterAction.java b/sdk/src/main/java/org/zstack/sdk/AttachVRouterRouteTableToVRouterAction.java index 3c941732918..a656087ecde 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachVRouterRouteTableToVRouterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachVRouterRouteTableToVRouterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachVipToLoadBalancerAction.java b/sdk/src/main/java/org/zstack/sdk/AttachVipToLoadBalancerAction.java index e3539f8d051..84b2dbe9958 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachVipToLoadBalancerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachVipToLoadBalancerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachVipToVpcSharedQosAction.java b/sdk/src/main/java/org/zstack/sdk/AttachVipToVpcSharedQosAction.java index 881de60ae20..28beb5d5c50 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachVipToVpcSharedQosAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachVipToVpcSharedQosAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/AttachVmNicToVmAction.java b/sdk/src/main/java/org/zstack/sdk/AttachVmNicToVmAction.java index c53842d5ed8..ff852b8676b 100644 --- a/sdk/src/main/java/org/zstack/sdk/AttachVmNicToVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AttachVmNicToVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/BackupDatabaseToPublicCloudAction.java b/sdk/src/main/java/org/zstack/sdk/BackupDatabaseToPublicCloudAction.java index ab6244dfcdf..02e2ff50b43 100644 --- a/sdk/src/main/java/org/zstack/sdk/BackupDatabaseToPublicCloudAction.java +++ b/sdk/src/main/java/org/zstack/sdk/BackupDatabaseToPublicCloudAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/BackupStorageMigrateImageAction.java b/sdk/src/main/java/org/zstack/sdk/BackupStorageMigrateImageAction.java index a6de86dd6aa..0bebcc09146 100644 --- a/sdk/src/main/java/org/zstack/sdk/BackupStorageMigrateImageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/BackupStorageMigrateImageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/BatchAddBareMetal2IpmiChassisAction.java b/sdk/src/main/java/org/zstack/sdk/BatchAddBareMetal2IpmiChassisAction.java index 0883d2294ed..3183a3e56fe 100644 --- a/sdk/src/main/java/org/zstack/sdk/BatchAddBareMetal2IpmiChassisAction.java +++ b/sdk/src/main/java/org/zstack/sdk/BatchAddBareMetal2IpmiChassisAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/BatchCreateBaremetalChassisAction.java b/sdk/src/main/java/org/zstack/sdk/BatchCreateBaremetalChassisAction.java index 4137d683661..6507cc0f07d 100644 --- a/sdk/src/main/java/org/zstack/sdk/BatchCreateBaremetalChassisAction.java +++ b/sdk/src/main/java/org/zstack/sdk/BatchCreateBaremetalChassisAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/BatchDeleteVolumeSnapshotAction.java b/sdk/src/main/java/org/zstack/sdk/BatchDeleteVolumeSnapshotAction.java index 711cd8743ae..e7ccc3d0eed 100644 --- a/sdk/src/main/java/org/zstack/sdk/BatchDeleteVolumeSnapshotAction.java +++ b/sdk/src/main/java/org/zstack/sdk/BatchDeleteVolumeSnapshotAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/BatchQueryAction.java b/sdk/src/main/java/org/zstack/sdk/BatchQueryAction.java index 24a64f27f8b..55f9427381b 100755 --- a/sdk/src/main/java/org/zstack/sdk/BatchQueryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/BatchQueryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/BatchSyncVolumeSizeAction.java b/sdk/src/main/java/org/zstack/sdk/BatchSyncVolumeSizeAction.java index 4b42cdb2e44..4ae7500cd3b 100644 --- a/sdk/src/main/java/org/zstack/sdk/BatchSyncVolumeSizeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/BatchSyncVolumeSizeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/BindModelToServiceAction.java b/sdk/src/main/java/org/zstack/sdk/BindModelToServiceAction.java index bead77e8f0a..adde31623d4 100644 --- a/sdk/src/main/java/org/zstack/sdk/BindModelToServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/BindModelToServiceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/BootstrapMiniHostAction.java b/sdk/src/main/java/org/zstack/sdk/BootstrapMiniHostAction.java index e366cf0111c..41bd0bcb971 100644 --- a/sdk/src/main/java/org/zstack/sdk/BootstrapMiniHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/BootstrapMiniHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CalculateAccountBillingSpendingAction.java b/sdk/src/main/java/org/zstack/sdk/CalculateAccountBillingSpendingAction.java index 2a39bffe527..ffa53a983c5 100644 --- a/sdk/src/main/java/org/zstack/sdk/CalculateAccountBillingSpendingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CalculateAccountBillingSpendingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CalculateAccountSpendingAction.java b/sdk/src/main/java/org/zstack/sdk/CalculateAccountSpendingAction.java index 0103e3567cc..59353ffd58d 100644 --- a/sdk/src/main/java/org/zstack/sdk/CalculateAccountSpendingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CalculateAccountSpendingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CalculateImageHashAction.java b/sdk/src/main/java/org/zstack/sdk/CalculateImageHashAction.java index 5375a4031e2..4aac840d210 100644 --- a/sdk/src/main/java/org/zstack/sdk/CalculateImageHashAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CalculateImageHashAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CalculateResourceSpendingAction.java b/sdk/src/main/java/org/zstack/sdk/CalculateResourceSpendingAction.java index 30c8dfdc54b..09a374d09b4 100644 --- a/sdk/src/main/java/org/zstack/sdk/CalculateResourceSpendingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CalculateResourceSpendingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CancelLongJobAction.java b/sdk/src/main/java/org/zstack/sdk/CancelLongJobAction.java index 90df280a3d4..01980e85491 100644 --- a/sdk/src/main/java/org/zstack/sdk/CancelLongJobAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CancelLongJobAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeAccessControlListRedirectRuleAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeAccessControlListRedirectRuleAction.java index b207479d437..4c92b2722dc 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeAccessControlListRedirectRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeAccessControlListRedirectRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeAccessControlListServerGroupAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeAccessControlListServerGroupAction.java index b972583059a..90f604c2665 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeAccessControlListServerGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeAccessControlListServerGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeAccessKeyStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeAccessKeyStateAction.java index f80d6bb8f8e..b2c79a85bd9 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeAccessKeyStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeAccessKeyStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeAccountPriceTableBindingAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeAccountPriceTableBindingAction.java index 05725ecebfa..c8bb5e8e0ec 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeAccountPriceTableBindingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeAccountPriceTableBindingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeAffinityGroupStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeAffinityGroupStateAction.java index 0216d761b81..dc6019f3cee 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeAffinityGroupStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeAffinityGroupStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeAppBuildSystemStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeAppBuildSystemStateAction.java index 60b4e8d77cd..0fc20e5d796 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeAppBuildSystemStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeAppBuildSystemStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeAutoScalingGroupStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeAutoScalingGroupStateAction.java index b537fea8cbd..9cc3f1ca856 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeAutoScalingGroupStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeAutoScalingGroupStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeBackupStorageStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeBackupStorageStateAction.java index b10ef4ea0ee..849aab9d3a4 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeBackupStorageStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeBackupStorageStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2ChassisOfferingStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2ChassisOfferingStateAction.java index 80b734938be..a2015aaab69 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2ChassisOfferingStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2ChassisOfferingStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2ChassisStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2ChassisStateAction.java index 723daa68d15..b3378b673a4 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2ChassisStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2ChassisStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2GatewayClusterAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2GatewayClusterAction.java index 53ea7d402a2..d1c22a38058 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2GatewayClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2GatewayClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2GatewayStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2GatewayStateAction.java index 0a550516cf5..4a90cc3ef4c 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2GatewayStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2GatewayStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2InstancePasswordAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2InstancePasswordAction.java index 1e8f6234994..a468c24de3c 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2InstancePasswordAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2InstancePasswordAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2ProvisionNetworkStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2ProvisionNetworkStateAction.java index 57a23fdc643..45b96a37eb9 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2ProvisionNetworkStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeBareMetal2ProvisionNetworkStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeBaremetalChassisStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeBaremetalChassisStateAction.java index a3b1c764a82..6ff010809f3 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeBaremetalChassisStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeBaremetalChassisStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeClusterStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeClusterStateAction.java index 415f16f87ef..86921895e7c 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeClusterStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeClusterStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeDiskOfferingStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeDiskOfferingStateAction.java index a98f27edb6e..e30fb116023 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeDiskOfferingStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeDiskOfferingStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeEipStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeEipStateAction.java index a7fc649ff48..0023957c276 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeEipStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeEipStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeFirewallRuleStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeFirewallRuleStateAction.java index 30509537cb4..40d7f2681d2 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeFirewallRuleStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeFirewallRuleStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeHostNetworkInterfaceLldpModeAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeHostNetworkInterfaceLldpModeAction.java index a7c417ec5a7..5765f0cbae9 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeHostNetworkInterfaceLldpModeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeHostNetworkInterfaceLldpModeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeHostPasswordAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeHostPasswordAction.java index e6361d8fba5..59b2a8deabc 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeHostPasswordAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeHostPasswordAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeHostStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeHostStateAction.java index 6ce2a3cd9b9..deb26724d05 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeHostStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeHostStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeIPSecConnectionStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeIPSecConnectionStateAction.java index e3a309ae77c..222ee17d670 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeIPSecConnectionStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeIPSecConnectionStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeIPsecConnectionAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeIPsecConnectionAction.java index ce0f793340e..241935ba255 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeIPsecConnectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeIPsecConnectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeImageStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeImageStateAction.java index a39870d82c7..f29f042c9f2 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeImageStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeImageStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeInstanceOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeInstanceOfferingAction.java index a4c7feb7dc4..abf7f0289df 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeInstanceOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeInstanceOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeInstanceOfferingStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeInstanceOfferingStateAction.java index a0304bf51af..bb863537ff1 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeInstanceOfferingStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeInstanceOfferingStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeL2NetworkVlanIdAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeL2NetworkVlanIdAction.java index 605fd9d9544..33c8be9f02b 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeL2NetworkVlanIdAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeL2NetworkVlanIdAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeL3NetworkDhcpIpAddressAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeL3NetworkDhcpIpAddressAction.java index 030b115fc9f..0929e3ac2ed 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeL3NetworkDhcpIpAddressAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeL3NetworkDhcpIpAddressAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeL3NetworkStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeL3NetworkStateAction.java index abaf16b52de..567350d3546 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeL3NetworkStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeL3NetworkStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeLoadBalancerBackendServerAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeLoadBalancerBackendServerAction.java index ea63aef7482..018acceaca1 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeLoadBalancerBackendServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeLoadBalancerBackendServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeLoadBalancerListenerAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeLoadBalancerListenerAction.java index 4c88a13d4e4..3c056c8af77 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeLoadBalancerListenerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeLoadBalancerListenerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeMediaStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeMediaStateAction.java index 994bd2590c7..cba62f60e22 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeMediaStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeMediaStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeMonitorTriggerActionStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeMonitorTriggerActionStateAction.java index 934eb41a860..55520ed239f 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeMonitorTriggerActionStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeMonitorTriggerActionStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeMonitorTriggerStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeMonitorTriggerStateAction.java index 9298fb72c3d..641f391397a 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeMonitorTriggerStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeMonitorTriggerStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeMulticastRouterStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeMulticastRouterStateAction.java index bc593e2f25c..ae0404cca06 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeMulticastRouterStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeMulticastRouterStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeNfvInstGroupOperationModeAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeNfvInstGroupOperationModeAction.java index 216987116a1..e1879385368 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeNfvInstGroupOperationModeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeNfvInstGroupOperationModeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangePortForwardingRuleStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangePortForwardingRuleStateAction.java index 82fabf12d8d..4eb1dfd34f8 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangePortForwardingRuleStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangePortForwardingRuleStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangePortMirrorStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangePortMirrorStateAction.java index 58eb69d29bc..aeeb5d912cc 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangePortMirrorStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangePortMirrorStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangePreconfigurationTemplateStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangePreconfigurationTemplateStateAction.java index 397d8413080..38bf22ca152 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangePreconfigurationTemplateStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangePreconfigurationTemplateStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangePrimaryStorageStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangePrimaryStorageStateAction.java index 7b6b6b5f9e4..7afa2f684de 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangePrimaryStorageStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangePrimaryStorageStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeResourceOwnerAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeResourceOwnerAction.java index 94bbf3409b7..21c17080585 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeResourceOwnerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeResourceOwnerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeSchedulerStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeSchedulerStateAction.java index 09fec5124c5..249fdb95d21 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeSchedulerStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeSchedulerStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeSdnControllerAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeSdnControllerAction.java index 39edbc03474..450ed3dc787 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeSdnControllerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeSdnControllerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeSecretResourcePoolStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeSecretResourcePoolStateAction.java index 1785b0b9acc..92f1805f16a 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeSecretResourcePoolStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeSecretResourcePoolStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeSecurityGroupRuleAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeSecurityGroupRuleAction.java index 2a4845068d5..fe0266a6915 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeSecurityGroupRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeSecurityGroupRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeSecurityGroupRuleStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeSecurityGroupRuleStateAction.java index 0f66d324b88..c15e6d6ab61 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeSecurityGroupRuleStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeSecurityGroupRuleStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeSecurityGroupStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeSecurityGroupStateAction.java index 591be1741ff..2d98d637f25 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeSecurityGroupStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeSecurityGroupStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeSecurityMachineStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeSecurityMachineStateAction.java index 3f35c13863e..3380e56a8a8 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeSecurityMachineStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeSecurityMachineStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeSlbGroupDeployTypeAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeSlbGroupDeployTypeAction.java index 214bcbebadd..5d95b6600fa 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeSlbGroupDeployTypeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeSlbGroupDeployTypeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeSlbGroupMonitorIpsAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeSlbGroupMonitorIpsAction.java index d314ee9878e..80e3f459d35 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeSlbGroupMonitorIpsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeSlbGroupMonitorIpsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeV2VConversionHostStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeV2VConversionHostStateAction.java index e1ae9d9e2fa..b3fe12d47ed 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeV2VConversionHostStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeV2VConversionHostStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeVfNicHaStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeVfNicHaStateAction.java index 369cb8e7da6..8bcc4da351d 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeVfNicHaStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeVfNicHaStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeVipStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeVipStateAction.java index f89c1fa1389..b6746d287de 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeVipStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeVipStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeVmImageAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeVmImageAction.java index 343440651f5..28c5a9d2066 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeVmImageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeVmImageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeVmNicNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeVmNicNetworkAction.java index 0f93c23a13b..ffec933f2cc 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeVmNicNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeVmNicNetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeVmNicSecurityPolicyAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeVmNicSecurityPolicyAction.java index 211d011d9c8..b68db5c4cf8 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeVmNicSecurityPolicyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeVmNicSecurityPolicyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeVmNicStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeVmNicStateAction.java index f66b3546bd7..dc9a26cb602 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeVmNicStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeVmNicStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeVmNicTypeAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeVmNicTypeAction.java index 005adeda0f6..0f89171ee71 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeVmNicTypeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeVmNicTypeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeVmPasswordAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeVmPasswordAction.java index 58a39283dd4..6a8ccd54144 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeVmPasswordAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeVmPasswordAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeVmSchedulingRuleStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeVmSchedulingRuleStateAction.java index b066bda69b1..ef30d1bdfd1 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeVmSchedulingRuleStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeVmSchedulingRuleStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeVolumeStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeVolumeStateAction.java index 063cc91751a..67f422c0bb7 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeVolumeStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeVolumeStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeVpcHaGroupMonitorIpsAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeVpcHaGroupMonitorIpsAction.java index f81ec1c8e43..eb1a0abc735 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeVpcHaGroupMonitorIpsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeVpcHaGroupMonitorIpsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeVpcSharedQosBandwidthAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeVpcSharedQosBandwidthAction.java index 05caa351fa2..a0425d021f7 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeVpcSharedQosBandwidthAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeVpcSharedQosBandwidthAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeZoneStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeZoneStateAction.java index 8a14103310e..9c3a089e219 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeZoneStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeZoneStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CheckApiPermissionAction.java b/sdk/src/main/java/org/zstack/sdk/CheckApiPermissionAction.java index a09fc5e93b2..38baec501ad 100644 --- a/sdk/src/main/java/org/zstack/sdk/CheckApiPermissionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CheckApiPermissionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CheckBareMetal2IpmiChassisConfigFileAction.java b/sdk/src/main/java/org/zstack/sdk/CheckBareMetal2IpmiChassisConfigFileAction.java index 9b8def068a5..84555cacd4e 100644 --- a/sdk/src/main/java/org/zstack/sdk/CheckBareMetal2IpmiChassisConfigFileAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CheckBareMetal2IpmiChassisConfigFileAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CheckBaremetalChassisConfigFileAction.java b/sdk/src/main/java/org/zstack/sdk/CheckBaremetalChassisConfigFileAction.java index ebd317b2638..bf69fc07b64 100644 --- a/sdk/src/main/java/org/zstack/sdk/CheckBaremetalChassisConfigFileAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CheckBaremetalChassisConfigFileAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CheckBatchDataIntegrityAction.java b/sdk/src/main/java/org/zstack/sdk/CheckBatchDataIntegrityAction.java index e4b2a24dee1..9391a16635b 100644 --- a/sdk/src/main/java/org/zstack/sdk/CheckBatchDataIntegrityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CheckBatchDataIntegrityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CheckBuildAppParametersAction.java b/sdk/src/main/java/org/zstack/sdk/CheckBuildAppParametersAction.java index 64f4eca4853..e6a83c76b10 100644 --- a/sdk/src/main/java/org/zstack/sdk/CheckBuildAppParametersAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CheckBuildAppParametersAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CheckElaborationContentAction.java b/sdk/src/main/java/org/zstack/sdk/CheckElaborationContentAction.java index 3fd64925e9c..6f864505b54 100644 --- a/sdk/src/main/java/org/zstack/sdk/CheckElaborationContentAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CheckElaborationContentAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CheckFirewallRuleConfigFileAction.java b/sdk/src/main/java/org/zstack/sdk/CheckFirewallRuleConfigFileAction.java index 299d43afd19..db8a6915ef8 100644 --- a/sdk/src/main/java/org/zstack/sdk/CheckFirewallRuleConfigFileAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CheckFirewallRuleConfigFileAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CheckIpAvailabilityAction.java b/sdk/src/main/java/org/zstack/sdk/CheckIpAvailabilityAction.java index cf99f5cef10..7c3f63e5505 100644 --- a/sdk/src/main/java/org/zstack/sdk/CheckIpAvailabilityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CheckIpAvailabilityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CheckKVMHostConfigFileAction.java b/sdk/src/main/java/org/zstack/sdk/CheckKVMHostConfigFileAction.java index 336459592b1..f7de86b90ab 100644 --- a/sdk/src/main/java/org/zstack/sdk/CheckKVMHostConfigFileAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CheckKVMHostConfigFileAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CheckNetworkReachableAction.java b/sdk/src/main/java/org/zstack/sdk/CheckNetworkReachableAction.java index 1953c7f55d6..b34595afdbb 100644 --- a/sdk/src/main/java/org/zstack/sdk/CheckNetworkReachableAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CheckNetworkReachableAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CheckResourcePermissionAction.java b/sdk/src/main/java/org/zstack/sdk/CheckResourcePermissionAction.java index 1498a10c17e..e369abfaa85 100644 --- a/sdk/src/main/java/org/zstack/sdk/CheckResourcePermissionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CheckResourcePermissionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CheckScsiLunClusterStatusAction.java b/sdk/src/main/java/org/zstack/sdk/CheckScsiLunClusterStatusAction.java index e0b5f0a67d5..1d1275d53a7 100644 --- a/sdk/src/main/java/org/zstack/sdk/CheckScsiLunClusterStatusAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CheckScsiLunClusterStatusAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CheckStackTemplateParametersAction.java b/sdk/src/main/java/org/zstack/sdk/CheckStackTemplateParametersAction.java index bf7be0ddcd0..39f5d3cce55 100644 --- a/sdk/src/main/java/org/zstack/sdk/CheckStackTemplateParametersAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CheckStackTemplateParametersAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CheckStaticProvisionIpAction.java b/sdk/src/main/java/org/zstack/sdk/CheckStaticProvisionIpAction.java index 8eab965e760..32f3e645c3b 100644 --- a/sdk/src/main/java/org/zstack/sdk/CheckStaticProvisionIpAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CheckStaticProvisionIpAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CheckVipPortAvailabilityAction.java b/sdk/src/main/java/org/zstack/sdk/CheckVipPortAvailabilityAction.java index d4e20435f9a..7a638dabac2 100644 --- a/sdk/src/main/java/org/zstack/sdk/CheckVipPortAvailabilityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CheckVipPortAvailabilityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CheckVolumeSnapshotGroupAvailabilityAction.java b/sdk/src/main/java/org/zstack/sdk/CheckVolumeSnapshotGroupAvailabilityAction.java index f2a40d5e5f9..606812294bf 100644 --- a/sdk/src/main/java/org/zstack/sdk/CheckVolumeSnapshotGroupAvailabilityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CheckVolumeSnapshotGroupAvailabilityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CleanInvalidLdapBindingAction.java b/sdk/src/main/java/org/zstack/sdk/CleanInvalidLdapBindingAction.java index 13df7c2017d..59c5acb0118 100644 --- a/sdk/src/main/java/org/zstack/sdk/CleanInvalidLdapBindingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CleanInvalidLdapBindingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CleanInvalidLdapIAM2BindingAction.java b/sdk/src/main/java/org/zstack/sdk/CleanInvalidLdapIAM2BindingAction.java index 63c09d8cccf..d29b6c0a768 100644 --- a/sdk/src/main/java/org/zstack/sdk/CleanInvalidLdapIAM2BindingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CleanInvalidLdapIAM2BindingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CleanLongJobAction.java b/sdk/src/main/java/org/zstack/sdk/CleanLongJobAction.java index 055bb321695..6418cc56b31 100644 --- a/sdk/src/main/java/org/zstack/sdk/CleanLongJobAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CleanLongJobAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CleanQueueAction.java b/sdk/src/main/java/org/zstack/sdk/CleanQueueAction.java index b05f24c161e..7b4c31282bb 100644 --- a/sdk/src/main/java/org/zstack/sdk/CleanQueueAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CleanQueueAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CleanUpBareMetal2BondingAction.java b/sdk/src/main/java/org/zstack/sdk/CleanUpBareMetal2BondingAction.java index bf7d3b1982a..009c6e0398d 100644 --- a/sdk/src/main/java/org/zstack/sdk/CleanUpBareMetal2BondingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CleanUpBareMetal2BondingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CleanUpBaremetalChassisBondingAction.java b/sdk/src/main/java/org/zstack/sdk/CleanUpBaremetalChassisBondingAction.java index 34820617202..9f0c70a82be 100644 --- a/sdk/src/main/java/org/zstack/sdk/CleanUpBaremetalChassisBondingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CleanUpBaremetalChassisBondingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CleanUpImageCacheOnPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/CleanUpImageCacheOnPrimaryStorageAction.java index 74779ce4c69..11a94f4a405 100644 --- a/sdk/src/main/java/org/zstack/sdk/CleanUpImageCacheOnPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CleanUpImageCacheOnPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CleanUpStorageTrashOnPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/CleanUpStorageTrashOnPrimaryStorageAction.java index 37607ae6da3..f36ffe08fcd 100644 --- a/sdk/src/main/java/org/zstack/sdk/CleanUpStorageTrashOnPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CleanUpStorageTrashOnPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CleanUpTrashOnBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/CleanUpTrashOnBackupStorageAction.java index e75ec3d5f03..0c6f5e9c956 100644 --- a/sdk/src/main/java/org/zstack/sdk/CleanUpTrashOnBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CleanUpTrashOnBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CleanUpTrashOnPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/CleanUpTrashOnPrimaryStorageAction.java index 11c2b1d3082..e4676239160 100644 --- a/sdk/src/main/java/org/zstack/sdk/CleanUpTrashOnPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CleanUpTrashOnPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CleanV2VConversionCacheAction.java b/sdk/src/main/java/org/zstack/sdk/CleanV2VConversionCacheAction.java index e83ac3c84da..a0ba71c7f59 100644 --- a/sdk/src/main/java/org/zstack/sdk/CleanV2VConversionCacheAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CleanV2VConversionCacheAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CleanupBillingUsageAction.java b/sdk/src/main/java/org/zstack/sdk/CleanupBillingUsageAction.java index 3dd91c6c9f2..8d35d1f56e8 100644 --- a/sdk/src/main/java/org/zstack/sdk/CleanupBillingUsageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CleanupBillingUsageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CloneImageAction.java b/sdk/src/main/java/org/zstack/sdk/CloneImageAction.java index a4020c83ca8..d1b1c189a69 100644 --- a/sdk/src/main/java/org/zstack/sdk/CloneImageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CloneImageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java index d8a876b518c..a43cafa046e 100644 --- a/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CloneVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/CloneVmInstanceAction.java index 122b7a6d773..68bb4ca0f6a 100644 --- a/sdk/src/main/java/org/zstack/sdk/CloneVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CloneVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ConvertVmFromForeignHypervisorAction.java b/sdk/src/main/java/org/zstack/sdk/ConvertVmFromForeignHypervisorAction.java index 73298f73c76..8657c2498ef 100644 --- a/sdk/src/main/java/org/zstack/sdk/ConvertVmFromForeignHypervisorAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ConvertVmFromForeignHypervisorAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAccessControlListAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAccessControlListAction.java index 0bb6624fde1..dcd97602032 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAccessControlListAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAccessControlListAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAccessKeyAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAccessKeyAction.java index 4d2bda3af95..b76d75eee41 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAccessKeyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAccessKeyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAccountAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAccountAction.java index e6003930447..d022aafae9e 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAccountAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAffinityGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAffinityGroupAction.java index a01268e08e5..d6b2e99b94f 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAffinityGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAffinityGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAiSiNoSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAiSiNoSecretResourcePoolAction.java index ddbea965e89..8e407c64223 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAiSiNoSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAiSiNoSecretResourcePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAliyunDiskFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAliyunDiskFromRemoteAction.java index 0dfa98ec045..d9a82f3095a 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAliyunDiskFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAliyunDiskFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAliyunNasAccessGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAliyunNasAccessGroupAction.java index bd18cba3fb8..abcfa554098 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAliyunNasAccessGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAliyunNasAccessGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAliyunNasAccessGroupRuleAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAliyunNasAccessGroupRuleAction.java index 72ceaae46ff..38160bd5440 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAliyunNasAccessGroupRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAliyunNasAccessGroupRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAliyunNasFileSystemAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAliyunNasFileSystemAction.java index 8c52729f2d2..4fcd75b79f7 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAliyunNasFileSystemAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAliyunNasFileSystemAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAliyunNasMountTargetAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAliyunNasMountTargetAction.java index 5796b622df2..a5bbfca4eca 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAliyunNasMountTargetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAliyunNasMountTargetAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAliyunProxyVSwitchAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAliyunProxyVSwitchAction.java index 488bfbb64ad..80ceb5be2e2 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAliyunProxyVSwitchAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAliyunProxyVSwitchAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAliyunProxyVpcAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAliyunProxyVpcAction.java index 6a59d4e9a33..c8ea8d1db61 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAliyunProxyVpcAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAliyunProxyVpcAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAliyunRouterInterfaceRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAliyunRouterInterfaceRemoteAction.java index 4066160f9d6..cc1ecdd7d96 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAliyunRouterInterfaceRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAliyunRouterInterfaceRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAliyunSnapshotRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAliyunSnapshotRemoteAction.java index c438637007b..1f8c79f9896 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAliyunSnapshotRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAliyunSnapshotRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAliyunVpcVirtualRouterEntryRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAliyunVpcVirtualRouterEntryRemoteAction.java index a28807fe44d..0c36e7466ec 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAliyunVpcVirtualRouterEntryRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAliyunVpcVirtualRouterEntryRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingGroupAction.java index 3cb88f41ce9..b1cd78a80fe 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingGroupAddingNewInstanceRuleAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingGroupAddingNewInstanceRuleAction.java index 2d8fd78596a..ea0808fb871 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingGroupAddingNewInstanceRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingGroupAddingNewInstanceRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingGroupRemovalInstanceRuleAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingGroupRemovalInstanceRuleAction.java index 1765b743503..b42794b232f 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingGroupRemovalInstanceRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingGroupRemovalInstanceRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingRuleAlarmTriggerAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingRuleAlarmTriggerAction.java index 9edc78c5cac..0dd5b1b0fde 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingRuleAlarmTriggerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingRuleAlarmTriggerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingRuleSchedulerJobTriggerAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingRuleSchedulerJobTriggerAction.java index 1b192e341c2..185b9cac0b9 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingRuleSchedulerJobTriggerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingRuleSchedulerJobTriggerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingVmTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingVmTemplateAction.java index b24838fa865..02170087560 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingVmTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAutoScalingVmTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateBareMetal2BondingAction.java b/sdk/src/main/java/org/zstack/sdk/CreateBareMetal2BondingAction.java index c67c2dd83c3..cfb7711053f 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateBareMetal2BondingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateBareMetal2BondingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateBareMetal2InstanceAction.java b/sdk/src/main/java/org/zstack/sdk/CreateBareMetal2InstanceAction.java index bb817dd411e..755fb104476 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateBareMetal2InstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateBareMetal2InstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateBareMetal2IpmiChassisHardwareInfoAction.java b/sdk/src/main/java/org/zstack/sdk/CreateBareMetal2IpmiChassisHardwareInfoAction.java index d45a12ac4b8..55ca353cee3 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateBareMetal2IpmiChassisHardwareInfoAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateBareMetal2IpmiChassisHardwareInfoAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateBareMetal2ProvisionNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/CreateBareMetal2ProvisionNetworkAction.java index 5d6ebd801e3..3f12d5d17e1 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateBareMetal2ProvisionNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateBareMetal2ProvisionNetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateBaremetalBondingAction.java b/sdk/src/main/java/org/zstack/sdk/CreateBaremetalBondingAction.java index 5587cb938ff..3f8138c2527 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateBaremetalBondingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateBaremetalBondingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateBaremetalChassisAction.java b/sdk/src/main/java/org/zstack/sdk/CreateBaremetalChassisAction.java index 9a31ed57fd4..637270fc638 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateBaremetalChassisAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateBaremetalChassisAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateBaremetalInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/CreateBaremetalInstanceAction.java index b78a59c4ca6..183bef011ba 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateBaremetalInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateBaremetalInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateBaremetalPxeServerAction.java b/sdk/src/main/java/org/zstack/sdk/CreateBaremetalPxeServerAction.java index 2da898945a1..c3ecaaa12de 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateBaremetalPxeServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateBaremetalPxeServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateBlockVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/CreateBlockVolumeAction.java index c5df9897414..0a920e43166 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateBlockVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateBlockVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateBondingAction.java b/sdk/src/main/java/org/zstack/sdk/CreateBondingAction.java index 89511fa0318..636d0bcba67 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateBondingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateBondingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateBuildAppAction.java b/sdk/src/main/java/org/zstack/sdk/CreateBuildAppAction.java index b9ed01a1b75..88afb58eba5 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateBuildAppAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateBuildAppAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateCSPSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateCSPSecretResourcePoolAction.java index 9e35e8f2243..bee0c0212dc 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateCSPSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateCSPSecretResourcePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateCasClientAction.java b/sdk/src/main/java/org/zstack/sdk/CreateCasClientAction.java index 6dd4d9b91f8..966562dbd2c 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateCasClientAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateCasClientAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateCbtTaskAction.java b/sdk/src/main/java/org/zstack/sdk/CreateCbtTaskAction.java index c9249b92997..1d6b4a9720f 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateCbtTaskAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateCbtTaskAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateCdpPolicyAction.java b/sdk/src/main/java/org/zstack/sdk/CreateCdpPolicyAction.java index 73e9791ebd5..8cf1b54dba7 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateCdpPolicyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateCdpPolicyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateCdpTaskAction.java b/sdk/src/main/java/org/zstack/sdk/CreateCdpTaskAction.java index 4d4caa81785..5d1dccde7da 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateCdpTaskAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateCdpTaskAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateCertificateAction.java b/sdk/src/main/java/org/zstack/sdk/CreateCertificateAction.java index 41d55aa5df4..50a32903338 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateCertificateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateCertificateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateClusterAction.java b/sdk/src/main/java/org/zstack/sdk/CreateClusterAction.java index b57f9d00863..4d489de2ea8 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateClusterDRSAction.java b/sdk/src/main/java/org/zstack/sdk/CreateClusterDRSAction.java index 2cdcdfa3c33..d40784efc65 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateClusterDRSAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateClusterDRSAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateConnectionBetweenL3NetworkAndAliyunVSwitchAction.java b/sdk/src/main/java/org/zstack/sdk/CreateConnectionBetweenL3NetworkAndAliyunVSwitchAction.java index 77a03c809ba..ceb9f00107a 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateConnectionBetweenL3NetworkAndAliyunVSwitchAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateConnectionBetweenL3NetworkAndAliyunVSwitchAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateDataVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/CreateDataVolumeAction.java index 1284384357e..190079d6da1 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateDataVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateDataVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateDataVolumeFromVolumeSnapshotAction.java b/sdk/src/main/java/org/zstack/sdk/CreateDataVolumeFromVolumeSnapshotAction.java index 8189ef78422..3a4710ce37e 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateDataVolumeFromVolumeSnapshotAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateDataVolumeFromVolumeSnapshotAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateDataVolumeFromVolumeTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/CreateDataVolumeFromVolumeTemplateAction.java index 85997ccdbde..c67c39ab785 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateDataVolumeFromVolumeTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateDataVolumeFromVolumeTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateDataVolumeTemplateFromVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/CreateDataVolumeTemplateFromVolumeAction.java index f7332a8e30e..c0df719588f 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateDataVolumeTemplateFromVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateDataVolumeTemplateFromVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateDataVolumeTemplateFromVolumeSnapshotAction.java b/sdk/src/main/java/org/zstack/sdk/CreateDataVolumeTemplateFromVolumeSnapshotAction.java index 9d9c2cd594b..0e8e2986ab3 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateDataVolumeTemplateFromVolumeSnapshotAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateDataVolumeTemplateFromVolumeSnapshotAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateDatasetAction.java b/sdk/src/main/java/org/zstack/sdk/CreateDatasetAction.java index 25f3d108230..43e687db337 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateDatasetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateDatasetAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateDirectoryAction.java b/sdk/src/main/java/org/zstack/sdk/CreateDirectoryAction.java index e6068b7ee4d..bf64a14f435 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateDirectoryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateDirectoryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateDiskOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/CreateDiskOfferingAction.java index 9047fd3ab64..b8b511fca18 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateDiskOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateDiskOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateEcsImageFromEcsSnapshotAction.java b/sdk/src/main/java/org/zstack/sdk/CreateEcsImageFromEcsSnapshotAction.java index 0ec8f00752b..f361d0d13bb 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateEcsImageFromEcsSnapshotAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateEcsImageFromEcsSnapshotAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateEcsImageFromLocalImageAction.java b/sdk/src/main/java/org/zstack/sdk/CreateEcsImageFromLocalImageAction.java index 317f404e75a..435e8e33623 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateEcsImageFromLocalImageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateEcsImageFromLocalImageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateEcsInstanceFromEcsImageAction.java b/sdk/src/main/java/org/zstack/sdk/CreateEcsInstanceFromEcsImageAction.java index 49fc5994dbf..44225d684e3 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateEcsInstanceFromEcsImageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateEcsInstanceFromEcsImageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateEcsSecurityGroupRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/CreateEcsSecurityGroupRemoteAction.java index 48b152f17ff..d06083d51f5 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateEcsSecurityGroupRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateEcsSecurityGroupRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateEcsSecurityGroupRuleRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/CreateEcsSecurityGroupRuleRemoteAction.java index ae100a6c194..b6a7e4371b9 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateEcsSecurityGroupRuleRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateEcsSecurityGroupRuleRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateEcsVSwitchRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/CreateEcsVSwitchRemoteAction.java index 3c72f9aa741..cb1bc3b3fe7 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateEcsVSwitchRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateEcsVSwitchRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateEcsVpcRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/CreateEcsVpcRemoteAction.java index 001d457ebc6..74736b0a428 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateEcsVpcRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateEcsVpcRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateEipAction.java b/sdk/src/main/java/org/zstack/sdk/CreateEipAction.java index 87e395b6853..37d12dd9f08 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateEipAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateEipAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateEmailMediaAction.java b/sdk/src/main/java/org/zstack/sdk/CreateEmailMediaAction.java index 34269646a9c..1eb3b903ade 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateEmailMediaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateEmailMediaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateEmailMonitorTriggerActionAction.java b/sdk/src/main/java/org/zstack/sdk/CreateEmailMonitorTriggerActionAction.java index f8acc36de8e..8a7086b28e8 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateEmailMonitorTriggerActionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateEmailMonitorTriggerActionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateFaultToleranceVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/CreateFaultToleranceVmInstanceAction.java index ad502df50e6..878e624a7fe 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateFaultToleranceVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateFaultToleranceVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateFiSecSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateFiSecSecretResourcePoolAction.java index c9b526ce64b..433f8d35489 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateFiSecSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateFiSecSecretResourcePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateFirewallIpSetTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/CreateFirewallIpSetTemplateAction.java index dc64b172b59..27dc305ec1d 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateFirewallIpSetTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateFirewallIpSetTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateFirewallRuleAction.java b/sdk/src/main/java/org/zstack/sdk/CreateFirewallRuleAction.java index bb0db361731..b9ad775bbd2 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateFirewallRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateFirewallRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateFirewallRuleFromConfigFileAction.java b/sdk/src/main/java/org/zstack/sdk/CreateFirewallRuleFromConfigFileAction.java index f55a1012f02..ed579a60660 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateFirewallRuleFromConfigFileAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateFirewallRuleFromConfigFileAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateFirewallRuleSetAction.java b/sdk/src/main/java/org/zstack/sdk/CreateFirewallRuleSetAction.java index f32b74ad9c2..7861a509734 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateFirewallRuleSetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateFirewallRuleSetAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateFirewallRuleTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/CreateFirewallRuleTemplateAction.java index aa25c866247..fb651fd1f09 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateFirewallRuleTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateFirewallRuleTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateFlkSecSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateFlkSecSecretResourcePoolAction.java index 32fea8d96e5..b8a756a27d8 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateFlkSecSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateFlkSecSecretResourcePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateFlowCollectorAction.java b/sdk/src/main/java/org/zstack/sdk/CreateFlowCollectorAction.java index f53ed50bd87..f4796a84b41 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateFlowCollectorAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateFlowCollectorAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateFlowMeterAction.java b/sdk/src/main/java/org/zstack/sdk/CreateFlowMeterAction.java index e761782acad..61a0c5cd3db 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateFlowMeterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateFlowMeterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateGuestVmScriptAction.java b/sdk/src/main/java/org/zstack/sdk/CreateGuestVmScriptAction.java index fbc8c74c75e..c57727981f0 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateGuestVmScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateGuestVmScriptAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateHaiTaiSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateHaiTaiSecretResourcePoolAction.java index 328f7318e51..f4810d2fdd6 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateHaiTaiSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateHaiTaiSecretResourcePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateHostNetworkServiceTypeAction.java b/sdk/src/main/java/org/zstack/sdk/CreateHostNetworkServiceTypeAction.java index 83211eb4a06..6cfacc1622e 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateHostNetworkServiceTypeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateHostNetworkServiceTypeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateHostSchedulingRuleGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateHostSchedulingRuleGroupAction.java index a98eb084466..8bd2440bc37 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateHostSchedulingRuleGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateHostSchedulingRuleGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateHybridEipAction.java b/sdk/src/main/java/org/zstack/sdk/CreateHybridEipAction.java index dddabeafb0c..3545efd4960 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateHybridEipAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateHybridEipAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateIAM2VirtualIDFromLdapUidAction.java b/sdk/src/main/java/org/zstack/sdk/CreateIAM2VirtualIDFromLdapUidAction.java index 29a018ba423..8acc1d1d234 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateIAM2VirtualIDFromLdapUidAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateIAM2VirtualIDFromLdapUidAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateIAM2VirtualIDLdapBindingAction.java b/sdk/src/main/java/org/zstack/sdk/CreateIAM2VirtualIDLdapBindingAction.java index 370b62e3311..8a160ac6634 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateIAM2VirtualIDLdapBindingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateIAM2VirtualIDLdapBindingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateIPsecConnectionAction.java b/sdk/src/main/java/org/zstack/sdk/CreateIPsecConnectionAction.java index 706f5f14bcd..4b3d016f0c2 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateIPsecConnectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateIPsecConnectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageAction.java b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageAction.java index 36958dbf1ee..eed20143595 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotAction.java b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotAction.java index 35f84d7b83e..3b4eeac4302 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromVmInstanceAction.java index 8c68c3496fd..95e46920a0d 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateImageReplicationGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateImageReplicationGroupAction.java index 1b58886753b..fb3c4afb612 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateImageReplicationGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateImageReplicationGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateInfoSecSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateInfoSecSecretResourcePoolAction.java index fc2c435101a..192d1fbe546 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateInfoSecSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateInfoSecSecretResourcePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateInstanceOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/CreateInstanceOfferingAction.java index 9b3b1812aab..3c9950a8cb8 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateInstanceOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateInstanceOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateJitSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateJitSecretResourcePoolAction.java index 75a4e95b3b3..6b954ec0022 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateJitSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateJitSecretResourcePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateKoAlSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateKoAlSecretResourcePoolAction.java index 2a9614a5347..bc5f007833a 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateKoAlSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateKoAlSecretResourcePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkAction.java index 7b6b891307a..8803abc9704 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkPoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkPoolAction.java index 0f7fa343e3b..2430126593a 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkPoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkPoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2NoVlanNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2NoVlanNetworkAction.java index 2ac4abbb515..d63765f2e31 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2NoVlanNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2NoVlanNetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2PortGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2PortGroupAction.java index 981e1585b7d..ce41d9913e5 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2PortGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2PortGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2TfNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2TfNetworkAction.java index 7a6c60d0147..de47831bfd1 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2TfNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2TfNetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2VirtualSwitchAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2VirtualSwitchAction.java index 9bf1c6db389..0d21e156a33 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2VirtualSwitchAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2VirtualSwitchAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2VlanNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2VlanNetworkAction.java index 76d3bed2ec6..6c8d53a01a7 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2VlanNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2VlanNetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkAction.java index 638c8256942..d6343c3a721 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkPoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkPoolAction.java index b6af5df6ebc..2e3b9023b1f 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkPoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkPoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL3NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL3NetworkAction.java index 770854a9221..cfd0c213806 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL3NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL3NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateLdapBindingAction.java b/sdk/src/main/java/org/zstack/sdk/CreateLdapBindingAction.java index 0cc63f0e340..8b88896280a 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateLdapBindingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateLdapBindingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateLoadBalancerAction.java b/sdk/src/main/java/org/zstack/sdk/CreateLoadBalancerAction.java index e8b00cb7fa3..f4650813bae 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateLoadBalancerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateLoadBalancerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateLoadBalancerListenerAction.java b/sdk/src/main/java/org/zstack/sdk/CreateLoadBalancerListenerAction.java index dd33fcda104..a886703d0b9 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateLoadBalancerListenerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateLoadBalancerListenerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateLoadBalancerServerGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateLoadBalancerServerGroupAction.java index ac7071832b1..80f149a44f8 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateLoadBalancerServerGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateLoadBalancerServerGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateMiniClusterAction.java b/sdk/src/main/java/org/zstack/sdk/CreateMiniClusterAction.java index db8887c8d15..47f0d51ab0c 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateMiniClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateMiniClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateMonitorTriggerAction.java b/sdk/src/main/java/org/zstack/sdk/CreateMonitorTriggerAction.java index f17026bb960..a799e916de1 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateMonitorTriggerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateMonitorTriggerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateMulticastRouterAction.java b/sdk/src/main/java/org/zstack/sdk/CreateMulticastRouterAction.java index 2cf8664831d..b464473b069 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateMulticastRouterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateMulticastRouterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateNfvInstAction.java b/sdk/src/main/java/org/zstack/sdk/CreateNfvInstAction.java index c120ee97ece..e99ef531899 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateNfvInstAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateNfvInstAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateNfvInstGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateNfvInstGroupAction.java index 3055d319f1b..83115046dd9 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateNfvInstGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateNfvInstGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateNfvInstOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/CreateNfvInstOfferingAction.java index 33267766ff5..6f4b19f80a4 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateNfvInstOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateNfvInstOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateOAuthClientAction.java b/sdk/src/main/java/org/zstack/sdk/CreateOAuthClientAction.java index 95d00dc0678..b37db333ae0 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateOAuthClientAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateOAuthClientAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerAction.java b/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerAction.java index 1718256febd..ef8aa4dc65a 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerOfferingAction.java index 4c8ac995430..eb53139f516 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateOssBackupBucketRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/CreateOssBackupBucketRemoteAction.java index 1885cec9dfd..3684e6a6388 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateOssBackupBucketRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateOssBackupBucketRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateOssBucketRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/CreateOssBucketRemoteAction.java index f5a5bd45566..b5b8762eb8e 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateOssBucketRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateOssBucketRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerOfferingAction.java index 2df361d1b18..cf5b9888e85 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmAction.java b/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmAction.java index a7980599395..c7ccc7e2c19 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreatePciDeviceOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/CreatePciDeviceOfferingAction.java index 99e76afcd6e..da0a4611ccb 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreatePciDeviceOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreatePciDeviceOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreatePluginSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreatePluginSecretResourcePoolAction.java index 1f16a69d019..8874d47201c 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreatePluginSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreatePluginSecretResourcePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreatePolicyAction.java b/sdk/src/main/java/org/zstack/sdk/CreatePolicyAction.java index 93e3698cd11..e40faccc112 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreatePolicyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreatePolicyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreatePolicyRouteRuleAction.java b/sdk/src/main/java/org/zstack/sdk/CreatePolicyRouteRuleAction.java index ece9ed396d2..73316699361 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreatePolicyRouteRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreatePolicyRouteRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreatePolicyRouteRuleSetAction.java b/sdk/src/main/java/org/zstack/sdk/CreatePolicyRouteRuleSetAction.java index 6c34a4b7ae4..53691d9bc11 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreatePolicyRouteRuleSetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreatePolicyRouteRuleSetAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreatePolicyRouteTableAction.java b/sdk/src/main/java/org/zstack/sdk/CreatePolicyRouteTableAction.java index bc2e87e68a0..39a68da9f87 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreatePolicyRouteTableAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreatePolicyRouteTableAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreatePolicyRouteTableRouteEntryAction.java b/sdk/src/main/java/org/zstack/sdk/CreatePolicyRouteTableRouteEntryAction.java index 2c38b5aa62a..07d0e38ad7a 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreatePolicyRouteTableRouteEntryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreatePolicyRouteTableRouteEntryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreatePortForwardingRuleAction.java b/sdk/src/main/java/org/zstack/sdk/CreatePortForwardingRuleAction.java index 23c79e39d78..16cfb2679cb 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreatePortForwardingRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreatePortForwardingRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreatePortMirrorAction.java b/sdk/src/main/java/org/zstack/sdk/CreatePortMirrorAction.java index 64f085dedd7..7e9964bcf41 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreatePortMirrorAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreatePortMirrorAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreatePortMirrorSessionAction.java b/sdk/src/main/java/org/zstack/sdk/CreatePortMirrorSessionAction.java index 71aa76004c4..b0105333a0a 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreatePortMirrorSessionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreatePortMirrorSessionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreatePriceTableAction.java b/sdk/src/main/java/org/zstack/sdk/CreatePriceTableAction.java index 62b30f8195d..187f2af3e9e 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreatePriceTableAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreatePriceTableAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateResourcePriceAction.java b/sdk/src/main/java/org/zstack/sdk/CreateResourcePriceAction.java index cba0db29a48..6fc1ddb04ab 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateResourcePriceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateResourcePriceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateResourceStackAction.java b/sdk/src/main/java/org/zstack/sdk/CreateResourceStackAction.java index b203170de7d..97d8535da12 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateResourceStackAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateResourceStackAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateResourceStackFromAppAction.java b/sdk/src/main/java/org/zstack/sdk/CreateResourceStackFromAppAction.java index 5d00cb57304..90d2f19bc86 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateResourceStackFromAppAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateResourceStackFromAppAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateRootVolumeTemplateFromRootVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/CreateRootVolumeTemplateFromRootVolumeAction.java index 533ff5222b2..4041f6b8546 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateRootVolumeTemplateFromRootVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateRootVolumeTemplateFromRootVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateRootVolumeTemplateFromVolumeSnapshotAction.java b/sdk/src/main/java/org/zstack/sdk/CreateRootVolumeTemplateFromVolumeSnapshotAction.java index d02410456a2..09929727931 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateRootVolumeTemplateFromVolumeSnapshotAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateRootVolumeTemplateFromVolumeSnapshotAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSAML2ClientAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSAML2ClientAction.java index 1198122f6a2..a1d29c7b656 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSAML2ClientAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSAML2ClientAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSSORedirectTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSSORedirectTemplateAction.java index 7f03954b543..5b9d31b3d4c 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSSORedirectTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSSORedirectTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSanSecSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSanSecSecretResourcePoolAction.java index 6ccfbcdd68c..41bc7528142 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSanSecSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSanSecSecretResourcePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobAction.java index f3a21a715a1..136ce6f6c10 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobGroupAction.java index f114b014280..ca45d868565 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSchedulerTriggerAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSchedulerTriggerAction.java index 3999037031a..b17d7987860 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSchedulerTriggerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSchedulerTriggerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSecurityGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSecurityGroupAction.java index 44282d9e374..d9184a41f19 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSecurityGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSecurityGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSlbGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSlbGroupAction.java index a44ec4d236f..e27c7f0e40e 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSlbGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSlbGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSlbInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSlbInstanceAction.java index 4be292428e7..a920e65b9c6 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSlbInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSlbInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSlbOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSlbOfferingAction.java index c9997317363..dd2dc1b9a13 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSlbOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSlbOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSnmpAgentAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSnmpAgentAction.java index 0de5311b732..dcd03534ae8 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSnmpAgentAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSnmpAgentAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSshKeyPairAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSshKeyPairAction.java index 4012cb35f52..7b8ec5bbb17 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSshKeyPairAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSshKeyPairAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSystemTagAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSystemTagAction.java index 6eb6ca9e0ee..d7922f660c0 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSystemTagAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSystemTagAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSystemTagsAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSystemTagsAction.java index f54bedb094d..48b67f37966 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSystemTagsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSystemTagsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateTagAction.java b/sdk/src/main/java/org/zstack/sdk/CreateTagAction.java index fbdf54363c1..a3843497dbd 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateTagAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateTagAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateUserAction.java b/sdk/src/main/java/org/zstack/sdk/CreateUserAction.java index c19005d7a27..888ecaf454d 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateUserAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateUserAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateUserGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateUserGroupAction.java index 70d8734a95e..a8f472b26fa 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateUserGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateUserGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateUserProxyConfigAction.java b/sdk/src/main/java/org/zstack/sdk/CreateUserProxyConfigAction.java index bdebdbba383..63b76c4383d 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateUserProxyConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateUserProxyConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateUserTagAction.java b/sdk/src/main/java/org/zstack/sdk/CreateUserTagAction.java index 690df56a023..cafcdb8fefb 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateUserTagAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateUserTagAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVRouterOspfAreaAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVRouterOspfAreaAction.java index 8f9b1bf055d..6fa6b2676f1 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVRouterOspfAreaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVRouterOspfAreaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVRouterRouteTableAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVRouterRouteTableAction.java index e16ff129e5a..bc2cd5e9275 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVRouterRouteTableAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVRouterRouteTableAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVipAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVipAction.java index 1d4f9221647..5070bff4ab9 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVipAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVipAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVirtualRouterOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVirtualRouterOfferingAction.java index 199cdba5d6d..9b8de0245c3 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVirtualRouterOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVirtualRouterOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVmCdRomAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVmCdRomAction.java index a7d0f99ec93..270c23e2112 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVmCdRomAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVmCdRomAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVmFromCdpBackupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVmFromCdpBackupAction.java index 6162f25f3bd..ccf1d235984 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVmFromCdpBackupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVmFromCdpBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceAction.java index 52ee1fee210..a6c9c4cd2c4 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceFromOvfAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceFromOvfAction.java index 0923b12e405..6d4e4c6fefe 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceFromOvfAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceFromOvfAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceFromVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceFromVolumeAction.java index 666c30f9303..f146791e710 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceFromVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceFromVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceFromVolumeSnapshotAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceFromVolumeSnapshotAction.java index 1e42ee6fda2..525e6d6784d 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceFromVolumeSnapshotAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceFromVolumeSnapshotAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceFromVolumeSnapshotGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceFromVolumeSnapshotGroupAction.java index becdf70334a..2ef24418b33 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceFromVolumeSnapshotGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceFromVolumeSnapshotGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVmNicAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVmNicAction.java index b047b1b0fe9..b8b0b2ef09f 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVmNicAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVmNicAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVmSchedulingRuleAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVmSchedulingRuleAction.java index 0048901d95e..8bc662b4bdf 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVmSchedulingRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVmSchedulingRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVmSchedulingRuleGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVmSchedulingRuleGroupAction.java index fa0faa26360..1c0cf5f31a0 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVmSchedulingRuleGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVmSchedulingRuleGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVmUserDefinedXmlHookScriptAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVmUserDefinedXmlHookScriptAction.java index efe4a81483c..046b4b7b1b6 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVmUserDefinedXmlHookScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVmUserDefinedXmlHookScriptAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVniRangeAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVniRangeAction.java index 0821df218d5..394e81e9bad 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVniRangeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVniRangeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVolumeSnapshotAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVolumeSnapshotAction.java index 9151c756238..c3fc7c3b19b 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVolumeSnapshotAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVolumeSnapshotAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVolumeSnapshotGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVolumeSnapshotGroupAction.java index 0d40d7667fe..ec66afbdd96 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVolumeSnapshotGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVolumeSnapshotGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVolumesSnapshotAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVolumesSnapshotAction.java index 908ff400544..f054d0a752b 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVolumesSnapshotAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVolumesSnapshotAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVpcFirewallAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVpcFirewallAction.java index b3a5d2ea327..6c117bdbfc8 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVpcFirewallAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVpcFirewallAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVpcHaGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVpcHaGroupAction.java index 0ec60f29d85..c2798f9c530 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVpcHaGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVpcHaGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVpcSharedQosAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVpcSharedQosAction.java index 4c8041fc78c..ebe30b11809 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVpcSharedQosAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVpcSharedQosAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVpcUserVpnGatewayRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVpcUserVpnGatewayRemoteAction.java index c00ff0db31b..ed4a559dcff 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVpcUserVpnGatewayRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVpcUserVpnGatewayRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVpcVRouterAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVpcVRouterAction.java index c6150f8c28b..e4b04f33754 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVpcVRouterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVpcVRouterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVpcVpnConnectionRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVpcVpnConnectionRemoteAction.java index 5739e688c53..fa6b2f9e1b7 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVpcVpnConnectionRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVpcVpnConnectionRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVpnIkeConfigAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVpnIkeConfigAction.java index 3486f075a5e..19548bc33d2 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVpnIkeConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVpnIkeConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVpnIpsecConfigAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVpnIpsecConfigAction.java index 0adcd55ca8f..48465850e1d 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVpnIpsecConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVpnIpsecConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVxlanPoolRemoteVtepAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVxlanPoolRemoteVtepAction.java index 7beae75a2c7..1c36ba12518 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVxlanPoolRemoteVtepAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVxlanPoolRemoteVtepAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVxlanVtepAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVxlanVtepAction.java index ab9caa02b3d..65ce8a39e98 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVxlanVtepAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVxlanVtepAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateWebhookAction.java b/sdk/src/main/java/org/zstack/sdk/CreateWebhookAction.java index 600936484c4..0d219d4ec0c 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateWebhookAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateWebhookAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateZBoxBackupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateZBoxBackupAction.java index d39f208f38e..835f5213d3b 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateZBoxBackupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateZBoxBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateZoneAction.java b/sdk/src/main/java/org/zstack/sdk/CreateZoneAction.java index 7cb5a519977..c8867d3919a 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateZoneAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateZoneAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DebugSignalAction.java b/sdk/src/main/java/org/zstack/sdk/DebugSignalAction.java index b1d2f61994e..41155a71f35 100644 --- a/sdk/src/main/java/org/zstack/sdk/DebugSignalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DebugSignalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DecodeStackTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/DecodeStackTemplateAction.java index 9b8a6aeeb97..d71e4043d05 100644 --- a/sdk/src/main/java/org/zstack/sdk/DecodeStackTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DecodeStackTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAccessControlListAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAccessControlListAction.java index 246e342a9eb..de736b5af41 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAccessControlListAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAccessControlListAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAccessControlRuleAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAccessControlRuleAction.java index ca5f8133317..2c1e4e02180 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAccessControlRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAccessControlRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAccessKeyAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAccessKeyAction.java index 4de6201a43c..724f43105d1 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAccessKeyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAccessKeyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAccountAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAccountAction.java index 613571787f4..aa759fd4756 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAccountAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAffinityGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAffinityGroupAction.java index 02547c69158..d50f22c1671 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAffinityGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAffinityGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAlertAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAlertAction.java index 8fc595416af..2f8e601b056 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAlertAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAlertAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunDiskFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunDiskFromLocalAction.java index 71c9a888219..dc04e2b13d0 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunDiskFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunDiskFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunDiskFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunDiskFromRemoteAction.java index 32b99685834..52a5d6e9000 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunDiskFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunDiskFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunKeySecretAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunKeySecretAction.java index c9340f3a22b..8feb74ba471 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunKeySecretAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunKeySecretAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunNasAccessGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunNasAccessGroupAction.java index c7d59904741..a4d3256e6d1 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunNasAccessGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunNasAccessGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunNasAccessGroupRuleAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunNasAccessGroupRuleAction.java index 6232cfd9876..745ee17fae8 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunNasAccessGroupRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunNasAccessGroupRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunPanguPartitionAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunPanguPartitionAction.java index a9f024f228c..8fad7e028b6 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunPanguPartitionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunPanguPartitionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunProxyVSwitchAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunProxyVSwitchAction.java index 3dc93f1cd86..daa50db0b65 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunProxyVSwitchAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunProxyVSwitchAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunProxyVpcAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunProxyVpcAction.java index 516c2f94939..e450a768363 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunProxyVpcAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunProxyVpcAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunRouteEntryRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunRouteEntryRemoteAction.java index 2d21c799f99..960cef33379 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunRouteEntryRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunRouteEntryRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunRouterInterfaceLocalAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunRouterInterfaceLocalAction.java index 6f28178ac96..81ad2ede28a 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunRouterInterfaceLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunRouterInterfaceLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunRouterInterfaceRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunRouterInterfaceRemoteAction.java index fc994a41b8c..39c1aee002a 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunRouterInterfaceRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunRouterInterfaceRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunSnapshotFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunSnapshotFromLocalAction.java index 77ebbb92adf..1c2bcbf8d8e 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunSnapshotFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunSnapshotFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunSnapshotFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunSnapshotFromRemoteAction.java index 9135e47f4cf..29c83a5f2db 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAliyunSnapshotFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAliyunSnapshotFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAllEcsInstancesFromDataCenterAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAllEcsInstancesFromDataCenterAction.java index c0d6e0e44f0..3c94c00c340 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAllEcsInstancesFromDataCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAllEcsInstancesFromDataCenterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAppBuildSystemAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAppBuildSystemAction.java index bda8e54af98..7d19940f296 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAppBuildSystemAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAppBuildSystemAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAutoScalingGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAutoScalingGroupAction.java index 617afedb7a4..d4af49b5b49 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAutoScalingGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAutoScalingGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAutoScalingGroupInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAutoScalingGroupInstanceAction.java index 695572b8938..91296cbaa04 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAutoScalingGroupInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAutoScalingGroupInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAutoScalingRuleAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAutoScalingRuleAction.java index 0d4a99aacc5..8b133d672df 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAutoScalingRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAutoScalingRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAutoScalingRuleTriggerAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAutoScalingRuleTriggerAction.java index bdd13c768c1..3d2c02dfa1e 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAutoScalingRuleTriggerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAutoScalingRuleTriggerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteAutoScalingTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAutoScalingTemplateAction.java index 73c80a8b395..915ed63c0c5 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAutoScalingTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAutoScalingTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteBackupFileInPublicAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteBackupFileInPublicAction.java index db094f0d4e2..fcbbb7ed1b4 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteBackupFileInPublicAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteBackupFileInPublicAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteBackupStorageAction.java index 0825af2cfb5..8da3b147824 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteBareMetal2ChassisAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteBareMetal2ChassisAction.java index e2606fa9d7c..8a87acedff3 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteBareMetal2ChassisAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteBareMetal2ChassisAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteBareMetal2GatewayAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteBareMetal2GatewayAction.java index ae3edb05387..607cfabbded 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteBareMetal2GatewayAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteBareMetal2GatewayAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteBareMetal2ProvisionNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteBareMetal2ProvisionNetworkAction.java index d5731081c88..5a6fe5ea4b5 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteBareMetal2ProvisionNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteBareMetal2ProvisionNetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteBaremetalChassisAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteBaremetalChassisAction.java index 546cdec7b0c..66c1433383d 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteBaremetalChassisAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteBaremetalChassisAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteBaremetalPxeServerAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteBaremetalPxeServerAction.java index 6f1397518e8..6455e529e2d 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteBaremetalPxeServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteBaremetalPxeServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteBillingAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteBillingAction.java index 84b22eea103..57edb4bc701 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteBillingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteBillingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteBondingAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteBondingAction.java index 9a3e606a58c..1d57db7c35d 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteBondingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteBondingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteBuildAppAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteBuildAppAction.java index 13cefd2d01f..40bdee62058 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteBuildAppAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteBuildAppAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteBuildAppExportHistoryAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteBuildAppExportHistoryAction.java index a081055a915..e52ff8478ab 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteBuildAppExportHistoryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteBuildAppExportHistoryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteCCSCertificateAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteCCSCertificateAction.java index e87fa5b2c60..f7c548f123d 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteCCSCertificateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteCCSCertificateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteCbtTaskAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteCbtTaskAction.java index d0c3b70c57b..d8a2f8304e3 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteCbtTaskAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteCbtTaskAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteCdpPolicyAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteCdpPolicyAction.java index 6b6d74a460a..b1883cf3172 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteCdpPolicyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteCdpPolicyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteCdpTaskAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteCdpTaskAction.java index 437978c512e..4215068a3af 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteCdpTaskAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteCdpTaskAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteCdpTaskDataAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteCdpTaskDataAction.java index d215e01e882..085d3255acc 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteCdpTaskDataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteCdpTaskDataAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteCephPrimaryStoragePoolAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteCephPrimaryStoragePoolAction.java index 3496de55ddb..fcdd59ee47e 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteCephPrimaryStoragePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteCephPrimaryStoragePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteCertificateAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteCertificateAction.java index fddcdab3590..7f9406a99f2 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteCertificateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteCertificateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteClusterAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteClusterAction.java index cc5925cfc46..d0cddec75b7 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteClusterDRSAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteClusterDRSAction.java index 7873ddfc9e2..2942d107349 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteClusterDRSAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteClusterDRSAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteConnectionAccessPointLocalAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteConnectionAccessPointLocalAction.java index 53ce73f364b..250b892842e 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteConnectionAccessPointLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteConnectionAccessPointLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteConnectionBetweenL3NetWorkAndAliyunVSwitchAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteConnectionBetweenL3NetWorkAndAliyunVSwitchAction.java index 81d4b3d243e..5636a4fe406 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteConnectionBetweenL3NetWorkAndAliyunVSwitchAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteConnectionBetweenL3NetWorkAndAliyunVSwitchAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementEndpointAction.java index 1029c2aae8b..caf0fef4528 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteContainerResourceFromEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteContainerResourceFromEndpointAction.java index c1ec0b8112e..c182964cc7b 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteContainerResourceFromEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteContainerResourceFromEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteDataCenterInLocalAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteDataCenterInLocalAction.java index 4fc05fe824a..eefa50410a4 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteDataCenterInLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteDataCenterInLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteDataVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteDataVolumeAction.java index 44d62660c9f..2fb4886362e 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteDataVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteDataVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteDatasetAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteDatasetAction.java index e7882d00fbf..63950693b38 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteDatasetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteDatasetAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteDatasetsAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteDatasetsAction.java index f17d73b43a2..2e9b0083d10 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteDatasetsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteDatasetsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteDirectoryAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteDirectoryAction.java index 013724b9301..84187d47611 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteDirectoryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteDirectoryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteDiskOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteDiskOfferingAction.java index a42f18f9964..3c35c36f682 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteDiskOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteDiskOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteEcsImageLocalAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteEcsImageLocalAction.java index 39b101f2ff9..719f6150292 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteEcsImageLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteEcsImageLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteEcsImageRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteEcsImageRemoteAction.java index f738ffc5967..54490111916 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteEcsImageRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteEcsImageRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteEcsInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteEcsInstanceAction.java index 379507ddae1..ffc5249f7eb 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteEcsInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteEcsInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteEcsInstanceLocalAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteEcsInstanceLocalAction.java index 980a38fc2bf..9b1ea5ab91f 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteEcsInstanceLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteEcsInstanceLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteEcsSecurityGroupInLocalAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteEcsSecurityGroupInLocalAction.java index 973081d5084..8e75dc52da6 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteEcsSecurityGroupInLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteEcsSecurityGroupInLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteEcsSecurityGroupRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteEcsSecurityGroupRemoteAction.java index 0bf1e9e553a..3d425361433 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteEcsSecurityGroupRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteEcsSecurityGroupRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteEcsSecurityGroupRuleRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteEcsSecurityGroupRuleRemoteAction.java index 032fc4a9b77..a341057b695 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteEcsSecurityGroupRuleRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteEcsSecurityGroupRuleRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteEcsVSwitchInLocalAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteEcsVSwitchInLocalAction.java index d6aa36afa50..60ddc20458b 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteEcsVSwitchInLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteEcsVSwitchInLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteEcsVSwitchRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteEcsVSwitchRemoteAction.java index 1375daa91f3..ab8cda25720 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteEcsVSwitchRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteEcsVSwitchRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteEcsVpcInLocalAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteEcsVpcInLocalAction.java index 78288a9521d..264238087f2 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteEcsVpcInLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteEcsVpcInLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteEcsVpcRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteEcsVpcRemoteAction.java index 4d6f1720c00..d568348a67d 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteEcsVpcRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteEcsVpcRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteEipAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteEipAction.java index 388bd12b797..6eedecccf05 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteEipAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteEipAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteExportedImageFromBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteExportedImageFromBackupStorageAction.java index 379f365ce40..2f177961193 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteExportedImageFromBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteExportedImageFromBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteExternalBackupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteExternalBackupAction.java index aa475e19d2c..16119e17435 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteExternalBackupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteExternalBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteFirewallAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteFirewallAction.java index 89df32ff378..bdeee9fad2e 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteFirewallAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteFirewallAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteFirewallIpSetTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteFirewallIpSetTemplateAction.java index 9240ff937b9..b9beefbdc43 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteFirewallIpSetTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteFirewallIpSetTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteFirewallRuleAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteFirewallRuleAction.java index 678022e04c6..d1542f19cbc 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteFirewallRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteFirewallRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteFirewallRuleSetAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteFirewallRuleSetAction.java index 0969c353dbd..e3bef83c4bb 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteFirewallRuleSetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteFirewallRuleSetAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteFirewallRuleTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteFirewallRuleTemplateAction.java index 7a363c36d5b..e19827755cf 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteFirewallRuleTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteFirewallRuleTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteFlowCollectorAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteFlowCollectorAction.java index ead4bb9229a..759a53a9707 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteFlowCollectorAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteFlowCollectorAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteFlowMeterAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteFlowMeterAction.java index acee92413c7..aa168bba05b 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteFlowMeterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteFlowMeterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteGCJobAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteGCJobAction.java index de0ab1baa67..585e1e796e0 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteGCJobAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteGCJobAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteGuestVmScriptAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteGuestVmScriptAction.java index 74f87c5470a..90edd2e91c4 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteGuestVmScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteGuestVmScriptAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteHostAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteHostAction.java index 4515cf070f3..7f39d04a800 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteHostNetworkServiceTypeAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteHostNetworkServiceTypeAction.java index 63244fb2abf..5ae190b6090 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteHostNetworkServiceTypeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteHostNetworkServiceTypeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteHostSchedulingRuleGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteHostSchedulingRuleGroupAction.java index d2150032e2c..d9d5469eeb4 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteHostSchedulingRuleGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteHostSchedulingRuleGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteHybridEipFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteHybridEipFromLocalAction.java index af5604e9fe9..fb238be9a88 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteHybridEipFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteHybridEipFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteHybridEipRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteHybridEipRemoteAction.java index 30decd8cec4..f48f3dd9291 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteHybridEipRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteHybridEipRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteHybridKeySecretAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteHybridKeySecretAction.java index c5a2de8cb48..1f92a966100 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteHybridKeySecretAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteHybridKeySecretAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteIAM2VirtualIDLdapBindingAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteIAM2VirtualIDLdapBindingAction.java index 22d0edc76e8..759a1753fed 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteIAM2VirtualIDLdapBindingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteIAM2VirtualIDLdapBindingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteIPsecConnectionAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteIPsecConnectionAction.java index cb9a0d9ab81..4c1beba927c 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteIPsecConnectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteIPsecConnectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteIdentityZoneInLocalAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteIdentityZoneInLocalAction.java index b2fe8bc50e7..6f619639f65 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteIdentityZoneInLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteIdentityZoneInLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteImageAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteImageAction.java index 18f5d4ec87e..f2850fbfae3 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteImageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteImageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteImagePackageAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteImagePackageAction.java index 4616a456348..d1783125aa8 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteImagePackageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteImagePackageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteImageReplicationGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteImageReplicationGroupAction.java index e06ad3e29db..8a3aabb45f0 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteImageReplicationGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteImageReplicationGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteInstanceOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteInstanceOfferingAction.java index 09f05a8d370..d9486403273 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteInstanceOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteInstanceOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteIpAddressAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteIpAddressAction.java index 7010ae51d7d..68f70463d7a 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteIpAddressAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteIpAddressAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteIpRangeAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteIpRangeAction.java index 2077d890341..bd9b3c15cd3 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteIpRangeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteIpRangeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteIscsiServerAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteIscsiServerAction.java index ca3b151f94d..16bd3c17ea3 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteIscsiServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteIscsiServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteL2NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteL2NetworkAction.java index 2296188e779..9edaf418351 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteL2NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteL2NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteL3NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteL3NetworkAction.java index 9d4b30b9d4e..9d54bd6e1f1 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteL3NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteL3NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteLdapBindingAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteLdapBindingAction.java index 1af2fdd01e6..6b82cfc198b 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteLdapBindingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteLdapBindingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteLdapServerAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteLdapServerAction.java index 507b429a914..a60fb03b090 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteLdapServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteLdapServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteLicenseAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteLicenseAction.java index 89c6b6abf27..d233c4ca966 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteLicenseAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteLicenseAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteLoadBalancerAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteLoadBalancerAction.java index d1b4987d69c..28928a2911a 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteLoadBalancerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteLoadBalancerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteLoadBalancerListenerAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteLoadBalancerListenerAction.java index 41e20af5031..ecf76ef525b 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteLoadBalancerListenerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteLoadBalancerListenerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteLoadBalancerServerGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteLoadBalancerServerGroupAction.java index 0ef2d8cae5c..64554b15a56 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteLoadBalancerServerGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteLoadBalancerServerGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteLogConfigurationAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteLogConfigurationAction.java index 2da3dbadd48..5d1d7b11466 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteLogConfigurationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteLogConfigurationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteLogServerAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteLogServerAction.java index 57fbf96daad..016f85eb26e 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteLogServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteLogServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteLongJobAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteLongJobAction.java index 7fa88f5075a..2cfb00de4b6 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteLongJobAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteLongJobAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteMdevDeviceAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteMdevDeviceAction.java index 01a938a8ca1..e91b562d1a5 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteMdevDeviceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteMdevDeviceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteMediaAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteMediaAction.java index 34ac8a7da4e..831243f08f9 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteMediaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteMediaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelAction.java index 1780cbfbd32..52fd7cb9c58 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteModelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelCenterAction.java index 32701153611..6013cced27b 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteModelCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelCenterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTaskAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTaskAction.java index bc292a0fbce..2494d17d6b7 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTaskAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTaskAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksAction.java index 37deb38410a..ce5f5a0ab4d 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceAction.java index 1126bcc2fad..fe388fadf51 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupAction.java index 91655983c29..18a0527be36 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupsAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupsAction.java index ffaf6fb2630..6ad0201532b 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelServicesAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelServicesAction.java index d8097c94c08..84ed763bdf4 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteModelServicesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelServicesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelsAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelsAction.java index 7a97a4c55ee..8bb66ac3748 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteModelsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteMonitorTriggerAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteMonitorTriggerAction.java index 4a685557817..25bfbb4c0bb 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteMonitorTriggerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteMonitorTriggerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteMonitorTriggerActionAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteMonitorTriggerActionAction.java index c95faeed61c..eb98ef3768a 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteMonitorTriggerActionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteMonitorTriggerActionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteMulticastRouterAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteMulticastRouterAction.java index 05c6308c37e..3a47b18596d 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteMulticastRouterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteMulticastRouterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteNasFileSystemAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteNasFileSystemAction.java index 27534775cba..4d0ddfd60ae 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteNasFileSystemAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteNasFileSystemAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteNasMountTargetAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteNasMountTargetAction.java index 33f36bbe0fa..a76292bc692 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteNasMountTargetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteNasMountTargetAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteNfvInstGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteNfvInstGroupAction.java index 87d07827ae4..c4a2d6a3e5e 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteNfvInstGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteNfvInstGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteNicQosAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteNicQosAction.java index 0862cc0506a..76a5998f12d 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteNicQosAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteNicQosAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteNvmeServerAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteNvmeServerAction.java index 669c8cf3d5a..782f32c7336 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteNvmeServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteNvmeServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteOssBucketFileRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteOssBucketFileRemoteAction.java index 2c3b00195b3..b87a49af168 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteOssBucketFileRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteOssBucketFileRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteOssBucketNameLocalAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteOssBucketNameLocalAction.java index 7ed41c909da..df9572aa076 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteOssBucketNameLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteOssBucketNameLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteOssBucketRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteOssBucketRemoteAction.java index f1ea1c37fdc..c586395aa16 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteOssBucketRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteOssBucketRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePciDeviceAction.java b/sdk/src/main/java/org/zstack/sdk/DeletePciDeviceAction.java index 3c0f223e810..1404bc145b6 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeletePciDeviceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeletePciDeviceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePciDeviceOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/DeletePciDeviceOfferingAction.java index 43b81c81c22..126f537f2a4 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeletePciDeviceOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeletePciDeviceOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePluginDriversAction.java b/sdk/src/main/java/org/zstack/sdk/DeletePluginDriversAction.java index 82c84c6b842..bdd070ea837 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeletePluginDriversAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeletePluginDriversAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePolicyAction.java b/sdk/src/main/java/org/zstack/sdk/DeletePolicyAction.java index 8082295e2dd..7b97b1df921 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeletePolicyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeletePolicyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePolicyRouteRuleAction.java b/sdk/src/main/java/org/zstack/sdk/DeletePolicyRouteRuleAction.java index 53d0ef09b73..69393aaa689 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeletePolicyRouteRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeletePolicyRouteRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePolicyRouteRuleSetAction.java b/sdk/src/main/java/org/zstack/sdk/DeletePolicyRouteRuleSetAction.java index 2d4db1ca1a0..f7286cabdb4 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeletePolicyRouteRuleSetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeletePolicyRouteRuleSetAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePolicyRouteTableAction.java b/sdk/src/main/java/org/zstack/sdk/DeletePolicyRouteTableAction.java index f31de30285f..2147af68706 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeletePolicyRouteTableAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeletePolicyRouteTableAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePolicyRouteTableRouteEntryAction.java b/sdk/src/main/java/org/zstack/sdk/DeletePolicyRouteTableRouteEntryAction.java index f1124d98c98..fb93e7ffba6 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeletePolicyRouteTableRouteEntryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeletePolicyRouteTableRouteEntryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePortForwardingRuleAction.java b/sdk/src/main/java/org/zstack/sdk/DeletePortForwardingRuleAction.java index aab457256bd..7e70273df36 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeletePortForwardingRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeletePortForwardingRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePortMirrorAction.java b/sdk/src/main/java/org/zstack/sdk/DeletePortMirrorAction.java index 0f737ba6cfb..a21b91f2013 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeletePortMirrorAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeletePortMirrorAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePortMirrorSessionAction.java b/sdk/src/main/java/org/zstack/sdk/DeletePortMirrorSessionAction.java index 3defbc8ff17..1ac3c9e97a5 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeletePortMirrorSessionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeletePortMirrorSessionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePreconfigurationTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/DeletePreconfigurationTemplateAction.java index 82e994d061d..b2fca3d1a85 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeletePreconfigurationTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeletePreconfigurationTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePriceTableAction.java b/sdk/src/main/java/org/zstack/sdk/DeletePriceTableAction.java index a0dfa6e254c..462d07da04e 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeletePriceTableAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeletePriceTableAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/DeletePrimaryStorageAction.java index 80174ea6440..eb566fa63ab 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeletePrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeletePrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePublishAppAction.java b/sdk/src/main/java/org/zstack/sdk/DeletePublishAppAction.java index dfdfd0bed77..d7520384483 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeletePublishAppAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeletePublishAppAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteReservedIpRangeAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteReservedIpRangeAction.java index 35d0b46178e..f33cfd45347 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteReservedIpRangeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteReservedIpRangeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteResourceConfigAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteResourceConfigAction.java index 2aa2cec5cd1..6d32ca12807 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteResourceConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteResourceConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteResourcePriceAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteResourcePriceAction.java index 02e0f8693dc..4050e3c3352 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteResourcePriceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteResourcePriceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteResourceStackAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteResourceStackAction.java index 32bfe4ce8fa..5c43c5973f2 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteResourceStackAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteResourceStackAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteResourceStackVmPortMonitorAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteResourceStackVmPortMonitorAction.java index 8363ff9edd4..d1b2bf5108e 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteResourceStackVmPortMonitorAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteResourceStackVmPortMonitorAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteSSOClientAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteSSOClientAction.java index 62b0bd2f395..f53df63fefb 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteSSOClientAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteSSOClientAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteSSORedirectTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteSSORedirectTemplateAction.java index 131af94807d..107e069035a 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteSSORedirectTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteSSORedirectTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteSchedulerJobAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteSchedulerJobAction.java index 3e79e5c21eb..4844a7ac7fe 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteSchedulerJobAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteSchedulerJobAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteSchedulerJobGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteSchedulerJobGroupAction.java index 624ed38ecb6..b6bf9c42d14 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteSchedulerJobGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteSchedulerJobGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteSchedulerTriggerAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteSchedulerTriggerAction.java index 34c707c1042..59af1d4bfc8 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteSchedulerTriggerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteSchedulerTriggerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteSecretResourcePoolAction.java index b30bdda0fff..41400152ab5 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteSecretResourcePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteSecurityGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteSecurityGroupAction.java index 410250f33cf..ae1dca5440d 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteSecurityGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteSecurityGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteSecurityGroupRuleAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteSecurityGroupRuleAction.java index 9614074703d..5d17d3187c1 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteSecurityGroupRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteSecurityGroupRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteSecurityMachineAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteSecurityMachineAction.java index d5d9d6187c7..7cd260f167f 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteSecurityMachineAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteSecurityMachineAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteSlbGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteSlbGroupAction.java index 93d53e343e3..f6b55a4d135 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteSlbGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteSlbGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteSshKeyPairAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteSshKeyPairAction.java index e2e2867a954..eb0b9424a11 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteSshKeyPairAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteSshKeyPairAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteStackTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteStackTemplateAction.java index 16d5fe08870..b69348caae0 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteStackTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteStackTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteTagAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteTagAction.java index 315a7e65984..417158f0c82 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteTagAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteTagAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteUserAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteUserAction.java index 319676cc0a2..99384705ca2 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteUserAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteUserAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteUserGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteUserGroupAction.java index fc46673cbfa..312cc291299 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteUserGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteUserGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteUserProxyConfigAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteUserProxyConfigAction.java index 1d3f4d29657..59390d1cc14 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteUserProxyConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteUserProxyConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteV2VConversionHostAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteV2VConversionHostAction.java index fff7e8e493e..3251f7cedfe 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteV2VConversionHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteV2VConversionHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVCenterAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVCenterAction.java index e661eb54a4b..f8ca7bcee40 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVCenterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVRouterOspfAreaAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVRouterOspfAreaAction.java index 09bf4959ad5..5a837772884 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVRouterOspfAreaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVRouterOspfAreaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVRouterRouteEntryAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVRouterRouteEntryAction.java index 5aced9d259c..4f50a33c948 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVRouterRouteEntryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVRouterRouteEntryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVRouterRouteTableAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVRouterRouteTableAction.java index 5a8984e909e..b4dc5d4d80c 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVRouterRouteTableAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVRouterRouteTableAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVipAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVipAction.java index 3e960e31634..5703c0dd77e 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVipAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVipAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVipQosAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVipQosAction.java index 848e308ea47..d4a24ee5748 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVipQosAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVipQosAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVirtualBorderRouterLocalAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVirtualBorderRouterLocalAction.java index 293cb4221ab..6ac9ae5133f 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVirtualBorderRouterLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVirtualBorderRouterLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVirtualRouterLocalAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVirtualRouterLocalAction.java index 3794d92271d..086763862e6 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVirtualRouterLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVirtualRouterLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVmBootModeAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVmBootModeAction.java index fd4e5ea7086..98738d0bfc1 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVmBootModeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVmBootModeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVmCdRomAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVmCdRomAction.java index 0b32f9d69bf..e6d89305af6 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVmCdRomAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVmCdRomAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVmConsolePasswordAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVmConsolePasswordAction.java index f5a5c354349..d8e76883fab 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVmConsolePasswordAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVmConsolePasswordAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVmHostnameAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVmHostnameAction.java index d3c4e475ba1..b988b030dc8 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVmHostnameAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVmHostnameAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVmInstanceHaLevelAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVmInstanceHaLevelAction.java index d82953b91e4..917adbaaa9b 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVmInstanceHaLevelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVmInstanceHaLevelAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVmNicAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVmNicAction.java index 6235bc157d5..552c80454c8 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVmNicAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVmNicAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVmNicFromSecurityGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVmNicFromSecurityGroupAction.java index 67f88787218..a833b982cdf 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVmNicFromSecurityGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVmNicFromSecurityGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVmSchedulingRuleGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVmSchedulingRuleGroupAction.java index 026443d083d..34ef5dd7660 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVmSchedulingRuleGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVmSchedulingRuleGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVmSshKeyAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVmSshKeyAction.java index 01c689112f1..0427b9356b1 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVmSshKeyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVmSshKeyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVmStaticIpAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVmStaticIpAction.java index 9dd668ad546..11f8ad17180 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVmStaticIpAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVmStaticIpAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVmUserDefinedXmlAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVmUserDefinedXmlAction.java index 93c84551c2d..ade565ca8c5 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVmUserDefinedXmlAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVmUserDefinedXmlAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVmUserDefinedXmlHookScriptAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVmUserDefinedXmlHookScriptAction.java index 21d7266381b..bde921ede58 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVmUserDefinedXmlHookScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVmUserDefinedXmlHookScriptAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVniRangeAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVniRangeAction.java index aa377e1ed2c..90bd172a081 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVniRangeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVniRangeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVolumeQosAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVolumeQosAction.java index c10d8365d96..9ae9d85d634 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVolumeQosAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVolumeQosAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotAction.java index f582c762165..7b8cdd907f1 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotGroupAction.java index e4a183f38b0..c2b3f67550d 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVpcHaGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVpcHaGroupAction.java index e88b9158105..aabaa22c259 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVpcHaGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVpcHaGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVpcIkeConfigLocalAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVpcIkeConfigLocalAction.java index 05c705f6c29..ccfe9580e7c 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVpcIkeConfigLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVpcIkeConfigLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVpcIpSecConfigLocalAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVpcIpSecConfigLocalAction.java index 185aad7de99..53183447c89 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVpcIpSecConfigLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVpcIpSecConfigLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVpcSharedQosAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVpcSharedQosAction.java index 2aa6b1e2f9a..be49363e8d3 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVpcSharedQosAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVpcSharedQosAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVpcUserVpnGatewayLocalAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVpcUserVpnGatewayLocalAction.java index f0b6877744f..800e2f3f0a5 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVpcUserVpnGatewayLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVpcUserVpnGatewayLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVpcUserVpnGatewayRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVpcUserVpnGatewayRemoteAction.java index 5b3ee797bf9..9b31fb19758 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVpcUserVpnGatewayRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVpcUserVpnGatewayRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVpcVpnConnectionLocalAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVpcVpnConnectionLocalAction.java index a99809d411d..9fe32e06445 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVpcVpnConnectionLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVpcVpnConnectionLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVpcVpnConnectionRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVpcVpnConnectionRemoteAction.java index 004f39febff..f980d1575fc 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVpcVpnConnectionRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVpcVpnConnectionRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVpcVpnGatewayLocalAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVpcVpnGatewayLocalAction.java index 97593f5ec0b..1f396fa2eee 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVpcVpnGatewayLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVpcVpnGatewayLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVxlanL2NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVxlanL2NetworkAction.java index 08d5543126c..4b43c92a076 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVxlanL2NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVxlanL2NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVxlanPoolRemoteVtepAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVxlanPoolRemoteVtepAction.java index dc8743cfdb9..610726bc31b 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVxlanPoolRemoteVtepAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVxlanPoolRemoteVtepAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteWebhookAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteWebhookAction.java index 0926213d93c..d8c7ce689ca 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteWebhookAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteWebhookAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteZoneAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteZoneAction.java index fc86698a904..3af168b907c 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteZoneAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteZoneAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java index 2ab7e2b846e..73ded5ce784 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceAction.java index 82c263bde6d..5b40f929cc2 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java index bf4c6abc18b..17b8d940062 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java index 61ee4158818..1b195ea5674 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DescribeVmInstanceRecoveryPointAction.java b/sdk/src/main/java/org/zstack/sdk/DescribeVmInstanceRecoveryPointAction.java index 8eb2fb9b389..a046ba595e2 100644 --- a/sdk/src/main/java/org/zstack/sdk/DescribeVmInstanceRecoveryPointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DescribeVmInstanceRecoveryPointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DestroyBaremetalInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/DestroyBaremetalInstanceAction.java index 2025bd9e670..fc3335915ca 100644 --- a/sdk/src/main/java/org/zstack/sdk/DestroyBaremetalInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DestroyBaremetalInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DestroyVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/DestroyVmInstanceAction.java index ee3d525f88e..ff10d06109c 100644 --- a/sdk/src/main/java/org/zstack/sdk/DestroyVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DestroyVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachAliyunDiskFromEcsAction.java b/sdk/src/main/java/org/zstack/sdk/DetachAliyunDiskFromEcsAction.java index cd83be09be5..ad931413ff7 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachAliyunDiskFromEcsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachAliyunDiskFromEcsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachAliyunKeyAction.java b/sdk/src/main/java/org/zstack/sdk/DetachAliyunKeyAction.java index d76c9d77322..0c1d69875a0 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachAliyunKeyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachAliyunKeyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachAppBuildSystemToZoneAction.java b/sdk/src/main/java/org/zstack/sdk/DetachAppBuildSystemToZoneAction.java index 29ba5c1be0b..0bdff3ccaf5 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachAppBuildSystemToZoneAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachAppBuildSystemToZoneAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachAutoScalingTemplateFromGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DetachAutoScalingTemplateFromGroupAction.java index 49661d3044c..41afdb7096b 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachAutoScalingTemplateFromGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachAutoScalingTemplateFromGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachBackupStorageFromZoneAction.java b/sdk/src/main/java/org/zstack/sdk/DetachBackupStorageFromZoneAction.java index 5c6b2bec3b3..d760e48760b 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachBackupStorageFromZoneAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachBackupStorageFromZoneAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachBareMetal2GatewayFromClusterAction.java b/sdk/src/main/java/org/zstack/sdk/DetachBareMetal2GatewayFromClusterAction.java index 228160d1077..e995f9d9fec 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachBareMetal2GatewayFromClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachBareMetal2GatewayFromClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachBareMetal2ProvisionNetworkFromClusterAction.java b/sdk/src/main/java/org/zstack/sdk/DetachBareMetal2ProvisionNetworkFromClusterAction.java index 7e131fcfeb5..37ac6f82d5e 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachBareMetal2ProvisionNetworkFromClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachBareMetal2ProvisionNetworkFromClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachBaremetalPxeServerFromClusterAction.java b/sdk/src/main/java/org/zstack/sdk/DetachBaremetalPxeServerFromClusterAction.java index 554dd19ccbe..d0b4ab8f577 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachBaremetalPxeServerFromClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachBaremetalPxeServerFromClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachCCSCertificateFromUserAction.java b/sdk/src/main/java/org/zstack/sdk/DetachCCSCertificateFromUserAction.java index a60f160dffc..31ab0c6f009 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachCCSCertificateFromUserAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachCCSCertificateFromUserAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachDataVolumeFromHostAction.java b/sdk/src/main/java/org/zstack/sdk/DetachDataVolumeFromHostAction.java index 91559cea8fc..f42ea708cb4 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachDataVolumeFromHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachDataVolumeFromHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachDataVolumeFromVmAction.java b/sdk/src/main/java/org/zstack/sdk/DetachDataVolumeFromVmAction.java index d1e63f7348f..224ae34c5d9 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachDataVolumeFromVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachDataVolumeFromVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachEipAction.java b/sdk/src/main/java/org/zstack/sdk/DetachEipAction.java index e6d318e6b43..0d8d433d79f 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachEipAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachEipAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachFirewallRuleSetFromL3Action.java b/sdk/src/main/java/org/zstack/sdk/DetachFirewallRuleSetFromL3Action.java index fc99195aca1..576a1f0f3ee 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachFirewallRuleSetFromL3Action.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachFirewallRuleSetFromL3Action.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachHostFromHostSchedulingRuleGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DetachHostFromHostSchedulingRuleGroupAction.java index 1914841ebc9..378140bbb27 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachHostFromHostSchedulingRuleGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachHostFromHostSchedulingRuleGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachHybridEipFromEcsAction.java b/sdk/src/main/java/org/zstack/sdk/DetachHybridEipFromEcsAction.java index f07c224f194..c4567b20276 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachHybridEipFromEcsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachHybridEipFromEcsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachHybridKeyAction.java b/sdk/src/main/java/org/zstack/sdk/DetachHybridKeyAction.java index 4a4aadf4303..d9a8f3a2a77 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachHybridKeyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachHybridKeyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachIscsiServerFromClusterAction.java b/sdk/src/main/java/org/zstack/sdk/DetachIscsiServerFromClusterAction.java index df5e4d58b75..9f2ba8c13fb 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachIscsiServerFromClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachIscsiServerFromClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachIsoFromVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/DetachIsoFromVmInstanceAction.java index 4583303bb74..497aef12620 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachIsoFromVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachIsoFromVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachL2NetworkFromClusterAction.java b/sdk/src/main/java/org/zstack/sdk/DetachL2NetworkFromClusterAction.java index 44b0850fa35..c09ca9f7873 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachL2NetworkFromClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachL2NetworkFromClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachL3NetworkFromVmAction.java b/sdk/src/main/java/org/zstack/sdk/DetachL3NetworkFromVmAction.java index ee08e5ac7ee..44688799945 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachL3NetworkFromVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachL3NetworkFromVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachL3NetworksFromIPsecConnectionAction.java b/sdk/src/main/java/org/zstack/sdk/DetachL3NetworksFromIPsecConnectionAction.java index 6217ff1ae53..ccc42fc4902 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachL3NetworksFromIPsecConnectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachL3NetworksFromIPsecConnectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachMdevDeviceFromVmAction.java b/sdk/src/main/java/org/zstack/sdk/DetachMdevDeviceFromVmAction.java index 56a835e090f..27708d1cfb1 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachMdevDeviceFromVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachMdevDeviceFromVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachMonitorTriggerActionFromTriggerAction.java b/sdk/src/main/java/org/zstack/sdk/DetachMonitorTriggerActionFromTriggerAction.java index 4b68945913a..218e5ca584e 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachMonitorTriggerActionFromTriggerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachMonitorTriggerActionFromTriggerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachNetworkServiceFromL3NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/DetachNetworkServiceFromL3NetworkAction.java index 495404d4be5..3e44fdd50c6 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachNetworkServiceFromL3NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachNetworkServiceFromL3NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachNfvInstFromGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DetachNfvInstFromGroupAction.java index 06a5eaebc71..ab452b04a46 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachNfvInstFromGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachNfvInstFromGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachNicFromBondingAction.java b/sdk/src/main/java/org/zstack/sdk/DetachNicFromBondingAction.java index 27d33aac108..a55a7436943 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachNicFromBondingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachNicFromBondingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachNvmeServerFromClusterAction.java b/sdk/src/main/java/org/zstack/sdk/DetachNvmeServerFromClusterAction.java index 390753a7b92..182849912c3 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachNvmeServerFromClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachNvmeServerFromClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachOssBucketFromEcsDataCenterAction.java b/sdk/src/main/java/org/zstack/sdk/DetachOssBucketFromEcsDataCenterAction.java index 1c42e8ab3e8..f135b876b71 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachOssBucketFromEcsDataCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachOssBucketFromEcsDataCenterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachPciDeviceFromVmAction.java b/sdk/src/main/java/org/zstack/sdk/DetachPciDeviceFromVmAction.java index 23bf062363f..7db1b50a0e7 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachPciDeviceFromVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachPciDeviceFromVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachPoliciesFromUserAction.java b/sdk/src/main/java/org/zstack/sdk/DetachPoliciesFromUserAction.java index 9f957830910..f78cebe9406 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachPoliciesFromUserAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachPoliciesFromUserAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachPolicyFromUserAction.java b/sdk/src/main/java/org/zstack/sdk/DetachPolicyFromUserAction.java index 67df6490b2c..85c4f51670e 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachPolicyFromUserAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachPolicyFromUserAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachPolicyFromUserGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DetachPolicyFromUserGroupAction.java index dbcb1052298..bfcc9e9c985 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachPolicyFromUserGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachPolicyFromUserGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachPolicyRouteRuleSetFromL3Action.java b/sdk/src/main/java/org/zstack/sdk/DetachPolicyRouteRuleSetFromL3Action.java index 213501023be..dc9b7c92c93 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachPolicyRouteRuleSetFromL3Action.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachPolicyRouteRuleSetFromL3Action.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachPortForwardingRuleAction.java b/sdk/src/main/java/org/zstack/sdk/DetachPortForwardingRuleAction.java index 31d324c2965..72f031630fb 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachPortForwardingRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachPortForwardingRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachPriceTableFromAccountAction.java b/sdk/src/main/java/org/zstack/sdk/DetachPriceTableFromAccountAction.java index 4279f0a6b6a..b4bb1094d33 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachPriceTableFromAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachPriceTableFromAccountAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachPrimaryStorageFromClusterAction.java b/sdk/src/main/java/org/zstack/sdk/DetachPrimaryStorageFromClusterAction.java index 498d52131f1..6e75a5a4406 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachPrimaryStorageFromClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachPrimaryStorageFromClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachProvisionNicFromBondingAction.java b/sdk/src/main/java/org/zstack/sdk/DetachProvisionNicFromBondingAction.java index af2c52389a8..3ddf97467f0 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachProvisionNicFromBondingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachProvisionNicFromBondingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachScsiLunFromHostAction.java b/sdk/src/main/java/org/zstack/sdk/DetachScsiLunFromHostAction.java index 887fa40d47d..cc608b92f27 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachScsiLunFromHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachScsiLunFromHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachScsiLunFromVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/DetachScsiLunFromVmInstanceAction.java index be1fb12e65b..8ebb806c15c 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachScsiLunFromVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachScsiLunFromVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachSecurityGroupFromL3NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/DetachSecurityGroupFromL3NetworkAction.java index fd266be6b27..f96a3aaf14c 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachSecurityGroupFromL3NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachSecurityGroupFromL3NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachServiceFromObservabilityServerAction.java b/sdk/src/main/java/org/zstack/sdk/DetachServiceFromObservabilityServerAction.java index 7e4761f8d5e..7d26e0318aa 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachServiceFromObservabilityServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachServiceFromObservabilityServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachSshKeyPairFromVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/DetachSshKeyPairFromVmInstanceAction.java index 57036321aee..4f8aa8b33f5 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachSshKeyPairFromVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachSshKeyPairFromVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachTagFromResourcesAction.java b/sdk/src/main/java/org/zstack/sdk/DetachTagFromResourcesAction.java index 88b591918a5..ab61ff6d28b 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachTagFromResourcesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachTagFromResourcesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachUsbDeviceFromVmAction.java b/sdk/src/main/java/org/zstack/sdk/DetachUsbDeviceFromVmAction.java index a30e7a9cec3..89f18879c1b 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachUsbDeviceFromVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachUsbDeviceFromVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachUserDefinedXmlHookScriptFromVmAction.java b/sdk/src/main/java/org/zstack/sdk/DetachUserDefinedXmlHookScriptFromVmAction.java index 4d047b07598..8d3674252a7 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachUserDefinedXmlHookScriptFromVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachUserDefinedXmlHookScriptFromVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachVRouterRouteTableFromVRouterAction.java b/sdk/src/main/java/org/zstack/sdk/DetachVRouterRouteTableFromVRouterAction.java index 8e3d61c3c8c..4bedbbe2629 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachVRouterRouteTableFromVRouterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachVRouterRouteTableFromVRouterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachVipFromVpcSharedQosAction.java b/sdk/src/main/java/org/zstack/sdk/DetachVipFromVpcSharedQosAction.java index 3c71934d013..782f8a64244 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachVipFromVpcSharedQosAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachVipFromVpcSharedQosAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachVmFromVmSchedulingRuleGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DetachVmFromVmSchedulingRuleGroupAction.java index 061c8b938f1..479484749cf 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachVmFromVmSchedulingRuleGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachVmFromVmSchedulingRuleGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DisableCbtTaskAction.java b/sdk/src/main/java/org/zstack/sdk/DisableCbtTaskAction.java index dd9ed92dddc..700ba52615e 100644 --- a/sdk/src/main/java/org/zstack/sdk/DisableCbtTaskAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DisableCbtTaskAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DisableCdpTaskAction.java b/sdk/src/main/java/org/zstack/sdk/DisableCdpTaskAction.java index 4b4f219dd35..743404fe4bb 100644 --- a/sdk/src/main/java/org/zstack/sdk/DisableCdpTaskAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DisableCdpTaskAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DiscoverExternalPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/DiscoverExternalPrimaryStorageAction.java index b0dd06337c5..ddeef9a5dd6 100644 --- a/sdk/src/main/java/org/zstack/sdk/DiscoverExternalPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DiscoverExternalPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/DownloadBackupFileFromPublicCloudAction.java b/sdk/src/main/java/org/zstack/sdk/DownloadBackupFileFromPublicCloudAction.java index cbc9c9e4c71..679bf54f8c5 100644 --- a/sdk/src/main/java/org/zstack/sdk/DownloadBackupFileFromPublicCloudAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DownloadBackupFileFromPublicCloudAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/EjectZBoxAction.java b/sdk/src/main/java/org/zstack/sdk/EjectZBoxAction.java index 483730e0df9..6bb2dbd748b 100644 --- a/sdk/src/main/java/org/zstack/sdk/EjectZBoxAction.java +++ b/sdk/src/main/java/org/zstack/sdk/EjectZBoxAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/EnableCbtTaskAction.java b/sdk/src/main/java/org/zstack/sdk/EnableCbtTaskAction.java index c49c3fc39b8..cf52f9c9684 100644 --- a/sdk/src/main/java/org/zstack/sdk/EnableCbtTaskAction.java +++ b/sdk/src/main/java/org/zstack/sdk/EnableCbtTaskAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/EnableCdpTaskAction.java b/sdk/src/main/java/org/zstack/sdk/EnableCdpTaskAction.java index 36c754e013f..e0634a03ca7 100644 --- a/sdk/src/main/java/org/zstack/sdk/EnableCdpTaskAction.java +++ b/sdk/src/main/java/org/zstack/sdk/EnableCdpTaskAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ErrorCode.java b/sdk/src/main/java/org/zstack/sdk/ErrorCode.java index 3a661082fd1..68f2b843c67 100755 --- a/sdk/src/main/java/org/zstack/sdk/ErrorCode.java +++ b/sdk/src/main/java/org/zstack/sdk/ErrorCode.java @@ -68,4 +68,12 @@ public java.util.LinkedHashMap getOpaque() { return this.opaque; } + public java.lang.String globalErrorCode; + public void setGlobalErrorCode(java.lang.String globalErrorCode) { + this.globalErrorCode = globalErrorCode; + } + public java.lang.String getGlobalErrorCode() { + return this.globalErrorCode; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/ExecuteAutoScalingRuleAction.java b/sdk/src/main/java/org/zstack/sdk/ExecuteAutoScalingRuleAction.java index 4d8cbf1d963..c747c86b23a 100644 --- a/sdk/src/main/java/org/zstack/sdk/ExecuteAutoScalingRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ExecuteAutoScalingRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ExecuteDRSSchedulingAction.java b/sdk/src/main/java/org/zstack/sdk/ExecuteDRSSchedulingAction.java index 759c4261598..f1375c19df4 100644 --- a/sdk/src/main/java/org/zstack/sdk/ExecuteDRSSchedulingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ExecuteDRSSchedulingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ExecuteGuestVmCommandAction.java b/sdk/src/main/java/org/zstack/sdk/ExecuteGuestVmCommandAction.java index 74eb599607e..8155f36c63d 100644 --- a/sdk/src/main/java/org/zstack/sdk/ExecuteGuestVmCommandAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ExecuteGuestVmCommandAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ExecuteGuestVmScriptAction.java b/sdk/src/main/java/org/zstack/sdk/ExecuteGuestVmScriptAction.java index 0579ba28812..0b6439d8e41 100644 --- a/sdk/src/main/java/org/zstack/sdk/ExecuteGuestVmScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ExecuteGuestVmScriptAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ExportBuildAppAction.java b/sdk/src/main/java/org/zstack/sdk/ExportBuildAppAction.java index 958ebd60033..43164b70a77 100644 --- a/sdk/src/main/java/org/zstack/sdk/ExportBuildAppAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ExportBuildAppAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ExportImageFromBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/ExportImageFromBackupStorageAction.java index ba7ff75cca3..f795708ac0d 100644 --- a/sdk/src/main/java/org/zstack/sdk/ExportImageFromBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ExportImageFromBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ExportNbdVolumesAction.java b/sdk/src/main/java/org/zstack/sdk/ExportNbdVolumesAction.java index 271065e4312..53d642e0061 100644 --- a/sdk/src/main/java/org/zstack/sdk/ExportNbdVolumesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ExportNbdVolumesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ExportVmOvaPackageAction.java b/sdk/src/main/java/org/zstack/sdk/ExportVmOvaPackageAction.java index 62f302b59b1..6fd443f7b81 100644 --- a/sdk/src/main/java/org/zstack/sdk/ExportVmOvaPackageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ExportVmOvaPackageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ExpungeBaremetalInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/ExpungeBaremetalInstanceAction.java index c864af65d03..4baeded461d 100644 --- a/sdk/src/main/java/org/zstack/sdk/ExpungeBaremetalInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ExpungeBaremetalInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ExpungeDataVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/ExpungeDataVolumeAction.java index 4a3e144a595..e0a0e858ca0 100644 --- a/sdk/src/main/java/org/zstack/sdk/ExpungeDataVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ExpungeDataVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ExpungeImageAction.java b/sdk/src/main/java/org/zstack/sdk/ExpungeImageAction.java index 4240266cd3d..6e6426cc82f 100644 --- a/sdk/src/main/java/org/zstack/sdk/ExpungeImageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ExpungeImageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupAction.java b/sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupAction.java index 721a4fd529a..531e4d61c49 100644 --- a/sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ExpungeVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/ExpungeVmInstanceAction.java index 9b9c2df3c23..9166a58de04 100644 --- a/sdk/src/main/java/org/zstack/sdk/ExpungeVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ExpungeVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ExpungeVmUserDefinedXmlHookScriptAction.java b/sdk/src/main/java/org/zstack/sdk/ExpungeVmUserDefinedXmlHookScriptAction.java index 43903c96df6..209324b79d4 100644 --- a/sdk/src/main/java/org/zstack/sdk/ExpungeVmUserDefinedXmlHookScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ExpungeVmUserDefinedXmlHookScriptAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/FailoverFaultToleranceVmAction.java b/sdk/src/main/java/org/zstack/sdk/FailoverFaultToleranceVmAction.java index 1a564cb54b2..354f1fb46d9 100644 --- a/sdk/src/main/java/org/zstack/sdk/FailoverFaultToleranceVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/FailoverFaultToleranceVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/FlattenVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/FlattenVmInstanceAction.java index ebbc00547f7..acfe0ebbc7d 100644 --- a/sdk/src/main/java/org/zstack/sdk/FlattenVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/FlattenVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/FlattenVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/FlattenVolumeAction.java index 9029a6345ed..1a971c9c067 100644 --- a/sdk/src/main/java/org/zstack/sdk/FlattenVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/FlattenVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/FstrimVmAction.java b/sdk/src/main/java/org/zstack/sdk/FstrimVmAction.java index f7be4e82710..5c180974aab 100644 --- a/sdk/src/main/java/org/zstack/sdk/FstrimVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/FstrimVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GCAliyunSnapshotRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/GCAliyunSnapshotRemoteAction.java index 6774a7d5137..c97434435af 100644 --- a/sdk/src/main/java/org/zstack/sdk/GCAliyunSnapshotRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GCAliyunSnapshotRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GenerateAccountBillingAction.java b/sdk/src/main/java/org/zstack/sdk/GenerateAccountBillingAction.java index 19a76cbfef1..5caad470dde 100644 --- a/sdk/src/main/java/org/zstack/sdk/GenerateAccountBillingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GenerateAccountBillingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GenerateHygonMdevDevicesAction.java b/sdk/src/main/java/org/zstack/sdk/GenerateHygonMdevDevicesAction.java index 32bf2196017..89fe169616f 100644 --- a/sdk/src/main/java/org/zstack/sdk/GenerateHygonMdevDevicesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GenerateHygonMdevDevicesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GenerateMdevDevicesAction.java b/sdk/src/main/java/org/zstack/sdk/GenerateMdevDevicesAction.java index 3fe26f31609..6d2bae15bac 100644 --- a/sdk/src/main/java/org/zstack/sdk/GenerateMdevDevicesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GenerateMdevDevicesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataAction.java b/sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataAction.java index 435e738b095..d2a12acecf0 100644 --- a/sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GenerateSeMdevDevicesAction.java b/sdk/src/main/java/org/zstack/sdk/GenerateSeMdevDevicesAction.java index e7aefc1d971..852bc21cced 100644 --- a/sdk/src/main/java/org/zstack/sdk/GenerateSeMdevDevicesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GenerateSeMdevDevicesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GenerateSriovPciDevicesAction.java b/sdk/src/main/java/org/zstack/sdk/GenerateSriovPciDevicesAction.java index e360004d808..267ec714b46 100644 --- a/sdk/src/main/java/org/zstack/sdk/GenerateSriovPciDevicesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GenerateSriovPciDevicesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GenerateSshKeyPairAction.java b/sdk/src/main/java/org/zstack/sdk/GenerateSshKeyPairAction.java index 3474b8e4d23..42a04bbee8d 100644 --- a/sdk/src/main/java/org/zstack/sdk/GenerateSshKeyPairAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GenerateSshKeyPairAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetAccessPathAction.java b/sdk/src/main/java/org/zstack/sdk/GetAccessPathAction.java index 5f04ed38db1..0d153a0a6b4 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetAccessPathAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetAccessPathAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetAccountPriceTableRefAction.java b/sdk/src/main/java/org/zstack/sdk/GetAccountPriceTableRefAction.java index 6db7347e8b2..6b1b9f710d3 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetAccountPriceTableRefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetAccountPriceTableRefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetAccountQuotaUsageAction.java b/sdk/src/main/java/org/zstack/sdk/GetAccountQuotaUsageAction.java index f11c68c4a08..dcf0784d190 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetAccountQuotaUsageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetAccountQuotaUsageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetAliyunNasAccessGroupRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/GetAliyunNasAccessGroupRemoteAction.java index f235e6363e7..c270d461e46 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetAliyunNasAccessGroupRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetAliyunNasAccessGroupRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetAliyunNasFileSystemRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/GetAliyunNasFileSystemRemoteAction.java index 6c19bff5a2c..8ceba0534c4 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetAliyunNasFileSystemRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetAliyunNasFileSystemRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetAliyunNasMountTargetRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/GetAliyunNasMountTargetRemoteAction.java index b32697cb444..3d8253f976e 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetAliyunNasMountTargetRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetAliyunNasMountTargetRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetAppBuildSystemCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/GetAppBuildSystemCapacityAction.java index 8c85cc31108..84930dc417c 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetAppBuildSystemCapacityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetAppBuildSystemCapacityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetAttachablePublicL3ForVRouterAction.java b/sdk/src/main/java/org/zstack/sdk/GetAttachablePublicL3ForVRouterAction.java index 7ef03aacbc9..96921088ea1 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetAttachablePublicL3ForVRouterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetAttachablePublicL3ForVRouterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetAttachableVpcL3NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/GetAttachableVpcL3NetworkAction.java index 1ad92e76417..aa486809bde 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetAttachableVpcL3NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetAttachableVpcL3NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetAvailableTriggersAction.java b/sdk/src/main/java/org/zstack/sdk/GetAvailableTriggersAction.java index 6ab6871f28f..76367f05a66 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetAvailableTriggersAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetAvailableTriggersAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetAvailableVpcL3NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/GetAvailableVpcL3NetworkAction.java index a4cfdf4ba2b..21992f614e8 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetAvailableVpcL3NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetAvailableVpcL3NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetBackupStorageCandidatesForImageMigrationAction.java b/sdk/src/main/java/org/zstack/sdk/GetBackupStorageCandidatesForImageMigrationAction.java index ebea41b193e..4d0453de35b 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetBackupStorageCandidatesForImageMigrationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetBackupStorageCandidatesForImageMigrationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetBackupStorageCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/GetBackupStorageCapacityAction.java index 75f80c705c9..5fee1a4479a 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetBackupStorageCapacityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetBackupStorageCapacityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetBackupStorageForCreatingImageFromVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/GetBackupStorageForCreatingImageFromVolumeAction.java index 4bb89c1a0a5..7144af347a2 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetBackupStorageForCreatingImageFromVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetBackupStorageForCreatingImageFromVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetBackupStorageForCreatingImageFromVolumeSnapshotAction.java b/sdk/src/main/java/org/zstack/sdk/GetBackupStorageForCreatingImageFromVolumeSnapshotAction.java index 63470163a8a..b95137e6557 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetBackupStorageForCreatingImageFromVolumeSnapshotAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetBackupStorageForCreatingImageFromVolumeSnapshotAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetBackupStorageTypesAction.java b/sdk/src/main/java/org/zstack/sdk/GetBackupStorageTypesAction.java index 44da0eeed61..4237915acd8 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetBackupStorageTypesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetBackupStorageTypesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetBareMetal2ChassisPowerStatusAction.java b/sdk/src/main/java/org/zstack/sdk/GetBareMetal2ChassisPowerStatusAction.java index adba01d5b1d..a7baecd176f 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetBareMetal2ChassisPowerStatusAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetBareMetal2ChassisPowerStatusAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetBareMetal2GatewayAllocatorStrategiesAction.java b/sdk/src/main/java/org/zstack/sdk/GetBareMetal2GatewayAllocatorStrategiesAction.java index 097ae476f17..303115a1b51 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetBareMetal2GatewayAllocatorStrategiesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetBareMetal2GatewayAllocatorStrategiesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetBareMetal2ProvisionNetworkIpAddressCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/GetBareMetal2ProvisionNetworkIpAddressCapacityAction.java index b123bc9dd82..a99979b08d2 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetBareMetal2ProvisionNetworkIpAddressCapacityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetBareMetal2ProvisionNetworkIpAddressCapacityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetBareMetal2SupportedBootModeAction.java b/sdk/src/main/java/org/zstack/sdk/GetBareMetal2SupportedBootModeAction.java index 76438a96203..dd1d947aaed 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetBareMetal2SupportedBootModeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetBareMetal2SupportedBootModeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetBaremetalChassisPowerStatusAction.java b/sdk/src/main/java/org/zstack/sdk/GetBaremetalChassisPowerStatusAction.java index 1603770cd70..b625a621dfb 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetBaremetalChassisPowerStatusAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetBaremetalChassisPowerStatusAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetBlockPrimaryStorageMetadataAction.java b/sdk/src/main/java/org/zstack/sdk/GetBlockPrimaryStorageMetadataAction.java index b811949616c..eda1d2f8a62 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetBlockPrimaryStorageMetadataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetBlockPrimaryStorageMetadataAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateAffinityGroupForAttachingVmAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateAffinityGroupForAttachingVmAction.java index e9f32b2eb85..517e185f899 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateAffinityGroupForAttachingVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateAffinityGroupForAttachingVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateAffinityGroupForCreatingVmAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateAffinityGroupForCreatingVmAction.java index 581450e8ea1..c121ef26aec 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateAffinityGroupForCreatingVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateAffinityGroupForCreatingVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateBackupStorageForCreatingImageAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateBackupStorageForCreatingImageAction.java index d7c1afae517..bafaaeece70 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateBackupStorageForCreatingImageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateBackupStorageForCreatingImageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateClustersForAttachingL2NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateClustersForAttachingL2NetworkAction.java index 32ef96e31b3..69fc6f27119 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateClustersForAttachingL2NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateClustersForAttachingL2NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateInterfaceVlanIdsAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateInterfaceVlanIdsAction.java index ee2c51c0709..21bdcdae54e 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateInterfaceVlanIdsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateInterfaceVlanIdsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateIsoForAttachingVmAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateIsoForAttachingVmAction.java index 15fa37f0853..40cbc5c07e0 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateIsoForAttachingVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateIsoForAttachingVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateL2NetworksForAttachingClusterAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateL2NetworksForAttachingClusterAction.java index b7a91e7e01c..4f6c71e5f14 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateL2NetworksForAttachingClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateL2NetworksForAttachingClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateL3NetworksForChangeVmNicNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateL3NetworksForChangeVmNicNetworkAction.java index bd0df6b2289..848bf1f249d 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateL3NetworksForChangeVmNicNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateL3NetworksForChangeVmNicNetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateL3NetworksForIpSecConnectionAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateL3NetworksForIpSecConnectionAction.java index a734d3eba72..a0bdaebbf09 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateL3NetworksForIpSecConnectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateL3NetworksForIpSecConnectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateL3NetworksForLoadBalancerAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateL3NetworksForLoadBalancerAction.java index cd3e19fccad..5f38f36fe1a 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateL3NetworksForLoadBalancerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateL3NetworksForLoadBalancerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateL3NetworksForServerGroupAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateL3NetworksForServerGroupAction.java index 673cc51e396..dcc366199c9 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateL3NetworksForServerGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateL3NetworksForServerGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateLdapEntryForBindingAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateLdapEntryForBindingAction.java index 4c9ef952845..5cc1cadecbf 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateLdapEntryForBindingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateLdapEntryForBindingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateLdapEntryForIAM2BindingAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateLdapEntryForIAM2BindingAction.java index d398701b303..8ea7a538e46 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateLdapEntryForIAM2BindingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateLdapEntryForIAM2BindingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateMiniHostsAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateMiniHostsAction.java index 1a05e8d5ce1..a2faa2bb0a8 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateMiniHostsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateMiniHostsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateNetworkInterfacesAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateNetworkInterfacesAction.java index 6f16483d49c..29e6a439f0c 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateNetworkInterfacesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateNetworkInterfacesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidatePrimaryStoragesForCreatingVmAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidatePrimaryStoragesForCreatingVmAction.java index 086394f1989..f0be66cd48b 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidatePrimaryStoragesForCreatingVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidatePrimaryStoragesForCreatingVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateVMForAttachingAffinityGroupAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateVMForAttachingAffinityGroupAction.java index b9d714da289..64db9e97243 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateVMForAttachingAffinityGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateVMForAttachingAffinityGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateVmForAttachingIsoAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateVmForAttachingIsoAction.java index 168b95da16e..31f7a743ec1 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateVmForAttachingIsoAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateVmForAttachingIsoAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateVmNicForSecurityGroupAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateVmNicForSecurityGroupAction.java index 4eef9c7c99e..818e43d92ad 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateVmNicForSecurityGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateVmNicForSecurityGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateVmNicsForLoadBalancerAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateVmNicsForLoadBalancerAction.java index c17b6ecd41f..93779de194b 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateVmNicsForLoadBalancerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateVmNicsForLoadBalancerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateVmNicsForLoadBalancerServerGroupAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateVmNicsForLoadBalancerServerGroupAction.java index c8185d5c9f6..9b6900f678e 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateVmNicsForLoadBalancerServerGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateVmNicsForLoadBalancerServerGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateVmNicsForPortMirrorAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateVmNicsForPortMirrorAction.java index 315de7011af..c2f932da1bf 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateVmNicsForPortMirrorAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateVmNicsForPortMirrorAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidateZonesClustersHostsForCreatingVmAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidateZonesClustersHostsForCreatingVmAction.java index 65ad8f36f26..18886687019 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidateZonesClustersHostsForCreatingVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidateZonesClustersHostsForCreatingVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCdpBackupStorageRequirementAction.java b/sdk/src/main/java/org/zstack/sdk/GetCdpBackupStorageRequirementAction.java index 537b18c7c6e..f0255f20ac5 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCdpBackupStorageRequirementAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCdpBackupStorageRequirementAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetChainTaskAction.java b/sdk/src/main/java/org/zstack/sdk/GetChainTaskAction.java index 29a0b1b3042..c580724d52d 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetChainTaskAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetChainTaskAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetChronyServersAction.java b/sdk/src/main/java/org/zstack/sdk/GetChronyServersAction.java index 1906014efb9..d3c9a15e239 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetChronyServersAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetChronyServersAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetClusterDRSStatusAction.java b/sdk/src/main/java/org/zstack/sdk/GetClusterDRSStatusAction.java index 178a8d512b2..a1b76e96945 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetClusterDRSStatusAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetClusterDRSStatusAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetClusterHostNetworkFactsAction.java b/sdk/src/main/java/org/zstack/sdk/GetClusterHostNetworkFactsAction.java index 79fbd745138..aeeae0bba5b 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetClusterHostNetworkFactsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetClusterHostNetworkFactsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetConnectionAccessPointFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/GetConnectionAccessPointFromRemoteAction.java index 47af5688e16..828a349e8f4 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetConnectionAccessPointFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetConnectionAccessPointFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetConnectionBetweenL3NetworkAndAliyunVSwitchAction.java b/sdk/src/main/java/org/zstack/sdk/GetConnectionBetweenL3NetworkAndAliyunVSwitchAction.java index 132b5d62cf4..b4b4ac944c6 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetConnectionBetweenL3NetworkAndAliyunVSwitchAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetConnectionBetweenL3NetworkAndAliyunVSwitchAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetContainerUsageAction.java b/sdk/src/main/java/org/zstack/sdk/GetContainerUsageAction.java index e5bfe629b9b..9e7d7f9e533 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetContainerUsageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetContainerUsageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCpuMemoryCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/GetCpuMemoryCapacityAction.java index 03e6ab89e4a..31c62f8741d 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCpuMemoryCapacityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCpuMemoryCapacityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCreateEcsImageProgressAction.java b/sdk/src/main/java/org/zstack/sdk/GetCreateEcsImageProgressAction.java index 6357e0737cb..f7bcc09a747 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCreateEcsImageProgressAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCreateEcsImageProgressAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetCurrentTimeAction.java b/sdk/src/main/java/org/zstack/sdk/GetCurrentTimeAction.java index cbb272f1ff4..be9cf0b6e88 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCurrentTimeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCurrentTimeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetDataCenterFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/GetDataCenterFromRemoteAction.java index 260b40e61ab..8bcfd31ec1b 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetDataCenterFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetDataCenterFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetDataVolumeAttachableVmAction.java b/sdk/src/main/java/org/zstack/sdk/GetDataVolumeAttachableVmAction.java index 4f1402ac981..cf996d8d99e 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetDataVolumeAttachableVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetDataVolumeAttachableVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetDebugSignalAction.java b/sdk/src/main/java/org/zstack/sdk/GetDebugSignalAction.java index 7b50fa3a697..35e08b8595e 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetDebugSignalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetDebugSignalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetEcsInstanceTypeAction.java b/sdk/src/main/java/org/zstack/sdk/GetEcsInstanceTypeAction.java index b370d0de857..11d111452b1 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetEcsInstanceTypeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetEcsInstanceTypeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetEcsInstanceVncUrlAction.java b/sdk/src/main/java/org/zstack/sdk/GetEcsInstanceVncUrlAction.java index 1881de55a38..469cdcbd5fa 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetEcsInstanceVncUrlAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetEcsInstanceVncUrlAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetEipAttachableVmNicsAction.java b/sdk/src/main/java/org/zstack/sdk/GetEipAttachableVmNicsAction.java index 5209ffef16c..3531ab2d01a 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetEipAttachableVmNicsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetEipAttachableVmNicsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetElaborationCategoriesAction.java b/sdk/src/main/java/org/zstack/sdk/GetElaborationCategoriesAction.java index 782f2d21cf8..050dd63b5ac 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetElaborationCategoriesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetElaborationCategoriesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetElaborationsAction.java b/sdk/src/main/java/org/zstack/sdk/GetElaborationsAction.java index 25989dddbee..ac97a537123 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetElaborationsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetElaborationsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetEncryptedFieldAction.java b/sdk/src/main/java/org/zstack/sdk/GetEncryptedFieldAction.java index 69384a1c1b0..6a8c62b0af6 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetEncryptedFieldAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetEncryptedFieldAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetExternalServicesAction.java b/sdk/src/main/java/org/zstack/sdk/GetExternalServicesAction.java index 0da686c84f5..01af5ac3956 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetExternalServicesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetExternalServicesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetFactoryModeStateAction.java b/sdk/src/main/java/org/zstack/sdk/GetFactoryModeStateAction.java index 574ac6f28f2..b6fe93ced3e 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetFactoryModeStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetFactoryModeStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetFaultToleranceVmsAction.java b/sdk/src/main/java/org/zstack/sdk/GetFaultToleranceVmsAction.java index 55ca3c7147c..9f5304671ab 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetFaultToleranceVmsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetFaultToleranceVmsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetFlowMeterRouterIdAction.java b/sdk/src/main/java/org/zstack/sdk/GetFlowMeterRouterIdAction.java index 124ec952b0d..92c59c34489 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetFlowMeterRouterIdAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetFlowMeterRouterIdAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetFreeIpAction.java b/sdk/src/main/java/org/zstack/sdk/GetFreeIpAction.java index 0fff6ad38bf..13b1a9974f4 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetFreeIpAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetFreeIpAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetFreeIpOfIpRangeAction.java b/sdk/src/main/java/org/zstack/sdk/GetFreeIpOfIpRangeAction.java index a6a8707095a..64a7efab150 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetFreeIpOfIpRangeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetFreeIpOfIpRangeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetFreeIpOfL3NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/GetFreeIpOfL3NetworkAction.java index 8e8bc2d5605..3da84c6e2d7 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetFreeIpOfL3NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetFreeIpOfL3NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetGlobalConfigOptionsAction.java b/sdk/src/main/java/org/zstack/sdk/GetGlobalConfigOptionsAction.java index 32bdd76d013..021e4ceefa6 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetGlobalConfigOptionsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetGlobalConfigOptionsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesAction.java b/sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesAction.java index 382a27fd969..3b32815e973 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetGuestOsMetadataAction.java b/sdk/src/main/java/org/zstack/sdk/GetGuestOsMetadataAction.java index 248154837a3..9b25a9998da 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetGuestOsMetadataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetGuestOsMetadataAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetHostAllocatorStrategiesAction.java b/sdk/src/main/java/org/zstack/sdk/GetHostAllocatorStrategiesAction.java index 82bea6f1f39..2f7c6997ec3 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetHostAllocatorStrategiesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetHostAllocatorStrategiesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetHostCandidatesForVmMigrationAction.java b/sdk/src/main/java/org/zstack/sdk/GetHostCandidatesForVmMigrationAction.java index b83ccb6fb4f..f7e9e7cd7c4 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetHostCandidatesForVmMigrationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetHostCandidatesForVmMigrationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetHostIommuStateAction.java b/sdk/src/main/java/org/zstack/sdk/GetHostIommuStateAction.java index 8ae4e9ac743..6e7d5a4a0c5 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetHostIommuStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetHostIommuStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetHostIommuStatusAction.java b/sdk/src/main/java/org/zstack/sdk/GetHostIommuStatusAction.java index bbfaba42e31..e4ba26e8079 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetHostIommuStatusAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetHostIommuStatusAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetHostMultipathTopologyAction.java b/sdk/src/main/java/org/zstack/sdk/GetHostMultipathTopologyAction.java index f4dbe5bbe3a..08734e90960 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetHostMultipathTopologyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetHostMultipathTopologyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetHostNUMATopologyAction.java b/sdk/src/main/java/org/zstack/sdk/GetHostNUMATopologyAction.java index d81d37149a8..f2c1c0475a2 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetHostNUMATopologyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetHostNUMATopologyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetHostNetworkFactsAction.java b/sdk/src/main/java/org/zstack/sdk/GetHostNetworkFactsAction.java index 61c42bda154..4130c734f7f 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetHostNetworkFactsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetHostNetworkFactsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetHostNetworkInterfaceLldpAction.java b/sdk/src/main/java/org/zstack/sdk/GetHostNetworkInterfaceLldpAction.java index 85519923919..a8c374ba4b6 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetHostNetworkInterfaceLldpAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetHostNetworkInterfaceLldpAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetHostPhysicalMemoryFactsAction.java b/sdk/src/main/java/org/zstack/sdk/GetHostPhysicalMemoryFactsAction.java index 84ba3d67607..314399d6425 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetHostPhysicalMemoryFactsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetHostPhysicalMemoryFactsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetHostPowerStatusAction.java b/sdk/src/main/java/org/zstack/sdk/GetHostPowerStatusAction.java index 36a7ef0656a..18688aaa331 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetHostPowerStatusAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetHostPowerStatusAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetHostResourceAllocationAction.java b/sdk/src/main/java/org/zstack/sdk/GetHostResourceAllocationAction.java index e2721014951..a1825cc5741 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetHostResourceAllocationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetHostResourceAllocationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetHostTaskAction.java b/sdk/src/main/java/org/zstack/sdk/GetHostTaskAction.java index d5460b00a35..e927d69b569 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetHostTaskAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetHostTaskAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetHostWebSshUrlAction.java b/sdk/src/main/java/org/zstack/sdk/GetHostWebSshUrlAction.java index 98f61e86607..f95eb5e71e0 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetHostWebSshUrlAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetHostWebSshUrlAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetHypervisorTypesAction.java b/sdk/src/main/java/org/zstack/sdk/GetHypervisorTypesAction.java index 2187df195c8..8b4e5a01324 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetHypervisorTypesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetHypervisorTypesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetIdentityZoneFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/GetIdentityZoneFromRemoteAction.java index 4622485d55d..416881bef36 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetIdentityZoneFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetIdentityZoneFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetImageCandidatesForVmToChangeAction.java b/sdk/src/main/java/org/zstack/sdk/GetImageCandidatesForVmToChangeAction.java index bf1f6208b05..c1a52398bee 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetImageCandidatesForVmToChangeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetImageCandidatesForVmToChangeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetImageQgaAction.java b/sdk/src/main/java/org/zstack/sdk/GetImageQgaAction.java index 9f7e76cb2d1..abdf4d52a5d 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetImageQgaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetImageQgaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetImagesFromImageStoreBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/GetImagesFromImageStoreBackupStorageAction.java index d6ecd641ebe..47dd050e96e 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetImagesFromImageStoreBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetImagesFromImageStoreBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetInterdependentL3NetworksBackupStoragesAction.java b/sdk/src/main/java/org/zstack/sdk/GetInterdependentL3NetworksBackupStoragesAction.java index ffce85ac1cd..c3beabdda1d 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetInterdependentL3NetworksBackupStoragesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetInterdependentL3NetworksBackupStoragesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetInterdependentL3NetworksImagesAction.java b/sdk/src/main/java/org/zstack/sdk/GetInterdependentL3NetworksImagesAction.java index 3856d59b61b..d407ab39389 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetInterdependentL3NetworksImagesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetInterdependentL3NetworksImagesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetInterfaceServiceTypeStatisticAction.java b/sdk/src/main/java/org/zstack/sdk/GetInterfaceServiceTypeStatisticAction.java index 67bb4ab48f1..9c339fa5a80 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetInterfaceServiceTypeStatisticAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetInterfaceServiceTypeStatisticAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetInvocationRecordsAction.java b/sdk/src/main/java/org/zstack/sdk/GetInvocationRecordsAction.java index 750279d5f0d..7482365361c 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetInvocationRecordsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetInvocationRecordsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetIpAddressCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/GetIpAddressCapacityAction.java index 0aa717c3994..33910597323 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetIpAddressCapacityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetIpAddressCapacityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetL2NetworkTypesAction.java b/sdk/src/main/java/org/zstack/sdk/GetL2NetworkTypesAction.java index 7134a0f6fd6..b54bcf4b96e 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetL2NetworkTypesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetL2NetworkTypesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetL3NetworkDhcpIpAddressAction.java b/sdk/src/main/java/org/zstack/sdk/GetL3NetworkDhcpIpAddressAction.java index b42c870a2a9..a9fce7af8a1 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetL3NetworkDhcpIpAddressAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetL3NetworkDhcpIpAddressAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetL3NetworkIpStatisticAction.java b/sdk/src/main/java/org/zstack/sdk/GetL3NetworkIpStatisticAction.java index 15f2edfaa5a..0c513cbc029 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetL3NetworkIpStatisticAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetL3NetworkIpStatisticAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetL3NetworkMtuAction.java b/sdk/src/main/java/org/zstack/sdk/GetL3NetworkMtuAction.java index 792f97f744d..e39aca47758 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetL3NetworkMtuAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetL3NetworkMtuAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetL3NetworkRouterInterfaceIpAction.java b/sdk/src/main/java/org/zstack/sdk/GetL3NetworkRouterInterfaceIpAction.java index 685337ea130..3c87f6af3fe 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetL3NetworkRouterInterfaceIpAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetL3NetworkRouterInterfaceIpAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetL3NetworkTypesAction.java b/sdk/src/main/java/org/zstack/sdk/GetL3NetworkTypesAction.java index 2ae83ce80cf..9c3ea9df0db 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetL3NetworkTypesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetL3NetworkTypesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetLatestGuestToolsForVmAction.java b/sdk/src/main/java/org/zstack/sdk/GetLatestGuestToolsForVmAction.java index 7df90bf0d00..3e976244772 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetLatestGuestToolsForVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetLatestGuestToolsForVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetLdapEntryAction.java b/sdk/src/main/java/org/zstack/sdk/GetLdapEntryAction.java index 2de38d0a9ec..b42d004b69c 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetLdapEntryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetLdapEntryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetLdapServerAvailableAttributesAction.java b/sdk/src/main/java/org/zstack/sdk/GetLdapServerAvailableAttributesAction.java index 6131e7621e8..1f70afc71d2 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetLdapServerAvailableAttributesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetLdapServerAvailableAttributesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetLicenseAddOnsAction.java b/sdk/src/main/java/org/zstack/sdk/GetLicenseAddOnsAction.java index ab98b4bc54b..be2295a884e 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetLicenseAddOnsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetLicenseAddOnsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetLicenseCapabilitiesAction.java b/sdk/src/main/java/org/zstack/sdk/GetLicenseCapabilitiesAction.java index ca78bdf1b44..225d0dff2cc 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetLicenseCapabilitiesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetLicenseCapabilitiesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetLicenseInfoAction.java b/sdk/src/main/java/org/zstack/sdk/GetLicenseInfoAction.java index ad4702728fb..2709b2a752f 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetLicenseInfoAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetLicenseInfoAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetLicenseRecordsAction.java b/sdk/src/main/java/org/zstack/sdk/GetLicenseRecordsAction.java index 0025a574aca..0193e0a41ee 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetLicenseRecordsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetLicenseRecordsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetLicenseUKeyStatusAction.java b/sdk/src/main/java/org/zstack/sdk/GetLicenseUKeyStatusAction.java index 9f2b9bdc30d..36363fa0290 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetLicenseUKeyStatusAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetLicenseUKeyStatusAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetLoadBalancerListenerACLEntriesAction.java b/sdk/src/main/java/org/zstack/sdk/GetLoadBalancerListenerACLEntriesAction.java index e414418d61d..fff642e7939 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetLoadBalancerListenerACLEntriesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetLoadBalancerListenerACLEntriesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetLoadBalancerOwnerAction.java b/sdk/src/main/java/org/zstack/sdk/GetLoadBalancerOwnerAction.java index 962f66ce122..3777153b24f 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetLoadBalancerOwnerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetLoadBalancerOwnerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetLocalRaidPhysicalDriveSmartAction.java b/sdk/src/main/java/org/zstack/sdk/GetLocalRaidPhysicalDriveSmartAction.java index 8ee65320609..ba5ca8ac377 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetLocalRaidPhysicalDriveSmartAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetLocalRaidPhysicalDriveSmartAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetLocalStorageHostDiskCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/GetLocalStorageHostDiskCapacityAction.java index 477a01a5d5c..12e6f88805d 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetLocalStorageHostDiskCapacityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetLocalStorageHostDiskCapacityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetLogConfigurationAction.java b/sdk/src/main/java/org/zstack/sdk/GetLogConfigurationAction.java index 545fc6ca18c..a7ac4d94543 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetLogConfigurationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetLogConfigurationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetLoginCaptchaAction.java b/sdk/src/main/java/org/zstack/sdk/GetLoginCaptchaAction.java index 7c5e820c0b0..f41ed7d4580 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetLoginCaptchaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetLoginCaptchaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetLoginProceduresAction.java b/sdk/src/main/java/org/zstack/sdk/GetLoginProceduresAction.java index b37b5670511..da624a4de1f 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetLoginProceduresAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetLoginProceduresAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetMaaSUsageAction.java b/sdk/src/main/java/org/zstack/sdk/GetMaaSUsageAction.java index 013282deab6..33221496ec7 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetMaaSUsageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetMaaSUsageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetManagementNodeArchAction.java b/sdk/src/main/java/org/zstack/sdk/GetManagementNodeArchAction.java index c6d7c5e5b17..23b9a6ba925 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetManagementNodeArchAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetManagementNodeArchAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetManagementNodeOSAction.java b/sdk/src/main/java/org/zstack/sdk/GetManagementNodeOSAction.java index 518656effdc..de12dba64cd 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetManagementNodeOSAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetManagementNodeOSAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetMdevDeviceCandidatesAction.java b/sdk/src/main/java/org/zstack/sdk/GetMdevDeviceCandidatesAction.java index 8f98f870348..512a7682c84 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetMdevDeviceCandidatesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetMdevDeviceCandidatesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetMdevDeviceSpecCandidatesAction.java b/sdk/src/main/java/org/zstack/sdk/GetMdevDeviceSpecCandidatesAction.java index 4549d3ba29e..86919559812 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetMdevDeviceSpecCandidatesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetMdevDeviceSpecCandidatesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetMemorySnapshotGroupReferenceAction.java b/sdk/src/main/java/org/zstack/sdk/GetMemorySnapshotGroupReferenceAction.java index 3a2897c13db..126c5bbb26e 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetMemorySnapshotGroupReferenceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetMemorySnapshotGroupReferenceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetModelCenterServicesAction.java b/sdk/src/main/java/org/zstack/sdk/GetModelCenterServicesAction.java index 8b187275870..20093fc6092 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetModelCenterServicesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetModelCenterServicesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetMonitorItemAction.java b/sdk/src/main/java/org/zstack/sdk/GetMonitorItemAction.java index ec54ae3deb2..4ce7589299b 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetMonitorItemAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetMonitorItemAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetNetworkServiceTypesAction.java b/sdk/src/main/java/org/zstack/sdk/GetNetworkServiceTypesAction.java index fa2064ea145..85b9d429097 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetNetworkServiceTypesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetNetworkServiceTypesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetNicQosAction.java b/sdk/src/main/java/org/zstack/sdk/GetNicQosAction.java index 40668f6c1f2..077e233a94b 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetNicQosAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetNicQosAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetNoTriggerSchedulerJobsAction.java b/sdk/src/main/java/org/zstack/sdk/GetNoTriggerSchedulerJobsAction.java index 49d8850fe36..8df0120c747 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetNoTriggerSchedulerJobsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetNoTriggerSchedulerJobsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetOAuth2TokenAction.java b/sdk/src/main/java/org/zstack/sdk/GetOAuth2TokenAction.java index 88164709f1b..df810b1e9e1 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetOAuth2TokenAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetOAuth2TokenAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetObservabilityServerServiceDataAction.java b/sdk/src/main/java/org/zstack/sdk/GetObservabilityServerServiceDataAction.java index 78366a1748e..fb78f5b38fc 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetObservabilityServerServiceDataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetObservabilityServerServiceDataAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetOssBackupBucketFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/GetOssBackupBucketFromRemoteAction.java index 75d5184f9a8..c4aee69d487 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetOssBackupBucketFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetOssBackupBucketFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetOssBucketFileFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/GetOssBucketFileFromRemoteAction.java index a68cfb49198..c419677619a 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetOssBucketFileFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetOssBucketFileFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetOssBucketNameFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/GetOssBucketNameFromRemoteAction.java index 8fbe0c919e3..5f08f5a6e41 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetOssBucketNameFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetOssBucketNameFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetPciDeviceCandidatesForAttachingVmAction.java b/sdk/src/main/java/org/zstack/sdk/GetPciDeviceCandidatesForAttachingVmAction.java index 11443a033a8..5b10897d215 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetPciDeviceCandidatesForAttachingVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetPciDeviceCandidatesForAttachingVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetPciDeviceCandidatesForNewCreateVmAction.java b/sdk/src/main/java/org/zstack/sdk/GetPciDeviceCandidatesForNewCreateVmAction.java index fca0599b827..08212e3f515 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetPciDeviceCandidatesForNewCreateVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetPciDeviceCandidatesForNewCreateVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetPciDeviceSpecCandidatesAction.java b/sdk/src/main/java/org/zstack/sdk/GetPciDeviceSpecCandidatesAction.java index 6bde12e9574..d68b63c5812 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetPciDeviceSpecCandidatesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetPciDeviceSpecCandidatesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetPlatformTimeZoneAction.java b/sdk/src/main/java/org/zstack/sdk/GetPlatformTimeZoneAction.java index 073fd79c680..a6c963575c1 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetPlatformTimeZoneAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetPlatformTimeZoneAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetPolicyRouteRuleSetFromVirtualRouterAction.java b/sdk/src/main/java/org/zstack/sdk/GetPolicyRouteRuleSetFromVirtualRouterAction.java index fe06072ccf6..c9811abe8b9 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetPolicyRouteRuleSetFromVirtualRouterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetPolicyRouteRuleSetFromVirtualRouterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetPortForwardingAttachableVmNicsAction.java b/sdk/src/main/java/org/zstack/sdk/GetPortForwardingAttachableVmNicsAction.java index 3f3a6063dc3..a624dd45b0f 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetPortForwardingAttachableVmNicsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetPortForwardingAttachableVmNicsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageAllocatorStrategiesAction.java b/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageAllocatorStrategiesAction.java index a9eeee6c7f3..dbc84d549ca 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageAllocatorStrategiesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageAllocatorStrategiesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageCandidatesForVmMigrationAction.java b/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageCandidatesForVmMigrationAction.java index 6e2cbb38191..da7aec63cad 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageCandidatesForVmMigrationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageCandidatesForVmMigrationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageCandidatesForVolumeMigrationAction.java b/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageCandidatesForVolumeMigrationAction.java index c85f8d79365..4af9bac713b 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageCandidatesForVolumeMigrationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageCandidatesForVolumeMigrationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageCapacityAction.java index c74f5036942..391b38cb23f 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageCapacityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageCapacityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageLicenseInfoAction.java b/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageLicenseInfoAction.java index d3f99370a84..2852213db9d 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageLicenseInfoAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageLicenseInfoAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageTypesAction.java b/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageTypesAction.java index 0f3f1c3e0a1..66ad1894e39 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageTypesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageTypesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageUsageReportAction.java b/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageUsageReportAction.java index d1757caf0a3..e7ee5e17b44 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageUsageReportAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetPrimaryStorageUsageReportAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetResourceAccountAction.java b/sdk/src/main/java/org/zstack/sdk/GetResourceAccountAction.java index afbee7f312e..3634ba4fc0d 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetResourceAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetResourceAccountAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetResourceBindableConfigAction.java b/sdk/src/main/java/org/zstack/sdk/GetResourceBindableConfigAction.java index 1f575192cff..b974987a6ba 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetResourceBindableConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetResourceBindableConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetResourceConfigAction.java b/sdk/src/main/java/org/zstack/sdk/GetResourceConfigAction.java index ac6ed65dd79..1699a8cf40b 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetResourceConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetResourceConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetResourceConfigsAction.java b/sdk/src/main/java/org/zstack/sdk/GetResourceConfigsAction.java index 7a786ca9f6a..8b8d9710f50 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetResourceConfigsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetResourceConfigsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetResourceFromPublishAppAction.java b/sdk/src/main/java/org/zstack/sdk/GetResourceFromPublishAppAction.java index a7a6354c72e..5669e572f0a 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetResourceFromPublishAppAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetResourceFromPublishAppAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetResourceFromResourceStackAction.java b/sdk/src/main/java/org/zstack/sdk/GetResourceFromResourceStackAction.java index 42980271348..29d9beb36c4 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetResourceFromResourceStackAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetResourceFromResourceStackAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetResourceNamesAction.java b/sdk/src/main/java/org/zstack/sdk/GetResourceNamesAction.java index 2985afe10f2..1a60a33d2b0 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetResourceNamesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetResourceNamesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetResourceStackFromResourceAction.java b/sdk/src/main/java/org/zstack/sdk/GetResourceStackFromResourceAction.java index bd6ee5cd8d5..5c1b10ee2bb 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetResourceStackFromResourceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetResourceStackFromResourceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetResourceStackVmStatusAction.java b/sdk/src/main/java/org/zstack/sdk/GetResourceStackVmStatusAction.java index 15a27969509..7c3bfd6f970 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetResourceStackVmStatusAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetResourceStackVmStatusAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetRouteTableVpcVRouterCandidateAction.java b/sdk/src/main/java/org/zstack/sdk/GetRouteTableVpcVRouterCandidateAction.java index 31a135f39b9..bd88579e932 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetRouteTableVpcVRouterCandidateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetRouteTableVpcVRouterCandidateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetSSOClientAction.java b/sdk/src/main/java/org/zstack/sdk/GetSSOClientAction.java index eb36f0c070f..496bc133ce3 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetSSOClientAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetSSOClientAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetSchedulerExecutionReportAction.java b/sdk/src/main/java/org/zstack/sdk/GetSchedulerExecutionReportAction.java index 17608069c2a..ea6cac63066 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetSchedulerExecutionReportAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetSchedulerExecutionReportAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetScsiLunCandidatesForAttachingVmAction.java b/sdk/src/main/java/org/zstack/sdk/GetScsiLunCandidatesForAttachingVmAction.java index 378c6ff70ff..869516f5986 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetScsiLunCandidatesForAttachingVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetScsiLunCandidatesForAttachingVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetSharedBlockCandidateAction.java b/sdk/src/main/java/org/zstack/sdk/GetSharedBlockCandidateAction.java index e0c551d5aac..a9d21ff6773 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetSharedBlockCandidateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetSharedBlockCandidateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetSignatureServerEncryptPublicKeyAction.java b/sdk/src/main/java/org/zstack/sdk/GetSignatureServerEncryptPublicKeyAction.java index eedce6b27a4..57fa39c6d75 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetSignatureServerEncryptPublicKeyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetSignatureServerEncryptPublicKeyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetSpiceCertificatesAction.java b/sdk/src/main/java/org/zstack/sdk/GetSpiceCertificatesAction.java index 054f589c35b..eaea90b199d 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetSpiceCertificatesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetSpiceCertificatesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetSupportAPIsAction.java b/sdk/src/main/java/org/zstack/sdk/GetSupportAPIsAction.java index 2e6d4df13f6..df72d24b59e 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetSupportAPIsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetSupportAPIsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetSupportedCloudFormationResourcesAction.java b/sdk/src/main/java/org/zstack/sdk/GetSupportedCloudFormationResourcesAction.java index 7ed427ebc17..5e2669a7c77 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetSupportedCloudFormationResourcesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetSupportedCloudFormationResourcesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetSupportedIdentityModelsAction.java b/sdk/src/main/java/org/zstack/sdk/GetSupportedIdentityModelsAction.java index 63f31dd2bcc..72ec080f455 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetSupportedIdentityModelsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetSupportedIdentityModelsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetTaskProgressAction.java b/sdk/src/main/java/org/zstack/sdk/GetTaskProgressAction.java index 2db2225f33f..7f09926d4a4 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetTaskProgressAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetTaskProgressAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetTrashOnBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/GetTrashOnBackupStorageAction.java index 84d3e8a7fa0..89dd829b094 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetTrashOnBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetTrashOnBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetTrashOnPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/GetTrashOnPrimaryStorageAction.java index 8ad8fb10332..88904573774 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetTrashOnPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetTrashOnPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetTwoFactorAuthenticationSecretAction.java b/sdk/src/main/java/org/zstack/sdk/GetTwoFactorAuthenticationSecretAction.java index 6023de48038..8e5305653b9 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetTwoFactorAuthenticationSecretAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetTwoFactorAuthenticationSecretAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetTwoFactorAuthenticationStateAction.java b/sdk/src/main/java/org/zstack/sdk/GetTwoFactorAuthenticationStateAction.java index 2b6241e6c01..cab073712a0 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetTwoFactorAuthenticationStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetTwoFactorAuthenticationStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetUploadImageJobDetailsAction.java b/sdk/src/main/java/org/zstack/sdk/GetUploadImageJobDetailsAction.java index 654bdbeeb56..0bafbbcf1df 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetUploadImageJobDetailsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetUploadImageJobDetailsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetUsbDeviceCandidatesForAttachingVmAction.java b/sdk/src/main/java/org/zstack/sdk/GetUsbDeviceCandidatesForAttachingVmAction.java index b426ea9ed3d..71899e088f8 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetUsbDeviceCandidatesForAttachingVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetUsbDeviceCandidatesForAttachingVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVRouterFlowCounterAction.java b/sdk/src/main/java/org/zstack/sdk/GetVRouterFlowCounterAction.java index a71c16322d5..ffc2d62bda7 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVRouterFlowCounterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVRouterFlowCounterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVRouterOspfNeighborAction.java b/sdk/src/main/java/org/zstack/sdk/GetVRouterOspfNeighborAction.java index 6cc06de7cc7..1a3655150a6 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVRouterOspfNeighborAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVRouterOspfNeighborAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVRouterRouteTableAction.java b/sdk/src/main/java/org/zstack/sdk/GetVRouterRouteTableAction.java index 0f1fb3150bd..47972ebea29 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVRouterRouteTableAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVRouterRouteTableAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVRouterRouterIdAction.java b/sdk/src/main/java/org/zstack/sdk/GetVRouterRouterIdAction.java index 8eb001ba884..8695a7da204 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVRouterRouterIdAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVRouterRouterIdAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVSwitchTypesAction.java b/sdk/src/main/java/org/zstack/sdk/GetVSwitchTypesAction.java index 8b2f1d0a3dd..4b83b595720 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVSwitchTypesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVSwitchTypesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVersionAction.java b/sdk/src/main/java/org/zstack/sdk/GetVersionAction.java index d9bcd4b8b2b..4312e161c01 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVersionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVersionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVfPciDeviceAvailableInL2NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/GetVfPciDeviceAvailableInL2NetworkAction.java index 1425944c4a4..755a87991c4 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVfPciDeviceAvailableInL2NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVfPciDeviceAvailableInL2NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVipAvailablePortAction.java b/sdk/src/main/java/org/zstack/sdk/GetVipAvailablePortAction.java index f1ffa40e365..42b832430aa 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVipAvailablePortAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVipAvailablePortAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVipQosAction.java b/sdk/src/main/java/org/zstack/sdk/GetVipQosAction.java index d3309b56fff..9f9144b20c1 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVipQosAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVipQosAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVipUsedPortsAction.java b/sdk/src/main/java/org/zstack/sdk/GetVipUsedPortsAction.java index fd2bc768e63..eded77a571b 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVipUsedPortsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVipUsedPortsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVirtualRouterSoftwareVersionAction.java b/sdk/src/main/java/org/zstack/sdk/GetVirtualRouterSoftwareVersionAction.java index 0f977d8e455..37cf11c4200 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVirtualRouterSoftwareVersionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVirtualRouterSoftwareVersionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVirtualizerInfoAction.java b/sdk/src/main/java/org/zstack/sdk/GetVirtualizerInfoAction.java index 1d9e0967673..6032e9077a3 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVirtualizerInfoAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVirtualizerInfoAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmAttachableDataVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmAttachableDataVolumeAction.java index 2c6351e1a8c..6c9d96b6fa7 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmAttachableDataVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmAttachableDataVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmAttachableL3NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmAttachableL3NetworkAction.java index f84b78551e6..b00ba07ce81 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmAttachableL3NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmAttachableL3NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmBootOrderAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmBootOrderAction.java index 4104f5fc2e7..3082b168d11 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmBootOrderAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmBootOrderAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmCapabilitiesAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmCapabilitiesAction.java index d71fb195ca7..208beb32d77 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmCapabilitiesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmCapabilitiesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmConsoleAddressAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmConsoleAddressAction.java index dfe0618c2a1..a79e826313d 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmConsoleAddressAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmConsoleAddressAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmConsolePasswordAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmConsolePasswordAction.java index 5926667b8c4..49a3ef01402 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmConsolePasswordAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmConsolePasswordAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmDeviceAddressAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmDeviceAddressAction.java index 6bf71844a9b..37270b90aa9 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmDeviceAddressAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmDeviceAddressAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmEmulatorPinningAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmEmulatorPinningAction.java index a4f00472d69..9a08c3ac6bf 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmEmulatorPinningAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmEmulatorPinningAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmGuestToolsInfoAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmGuestToolsInfoAction.java index 80c20ba8d91..e6e3ae40ea6 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmGuestToolsInfoAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmGuestToolsInfoAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmHostnameAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmHostnameAction.java index c071a4a1132..c905e761584 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmHostnameAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmHostnameAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmInstanceFirstBootDeviceAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmInstanceFirstBootDeviceAction.java index f0ed0aa98f3..eb51d484e10 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmInstanceFirstBootDeviceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmInstanceFirstBootDeviceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmInstanceHaLevelAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmInstanceHaLevelAction.java index 9d9a65222b1..7967a3b3cf1 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmInstanceHaLevelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmInstanceHaLevelAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmInstanceProtectedRecoveryPointsAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmInstanceProtectedRecoveryPointsAction.java index 5b5bac1ec3b..29ca3b4ee58 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmInstanceProtectedRecoveryPointsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmInstanceProtectedRecoveryPointsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmInstanceRecoveryPointsAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmInstanceRecoveryPointsAction.java index d96020a4d14..3d587a75da0 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmInstanceRecoveryPointsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmInstanceRecoveryPointsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmMigrationCandidateHostsAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmMigrationCandidateHostsAction.java index 020134cfabb..5fbfe2323c4 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmMigrationCandidateHostsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmMigrationCandidateHostsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmMonitorNumberAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmMonitorNumberAction.java index 8ed118e433e..083b478729d 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmMonitorNumberAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmMonitorNumberAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmNicAttachableEipsAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmNicAttachableEipsAction.java index b609bf33248..130d4ea26c7 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmNicAttachableEipsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmNicAttachableEipsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmNicAttachedNetworkServiceAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmNicAttachedNetworkServiceAction.java index 392b1d33784..80927f45c50 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmNicAttachedNetworkServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmNicAttachedNetworkServiceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmNumaAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmNumaAction.java index 6438cffad7e..05174a8b3e7 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmNumaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmNumaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmQgaAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmQgaAction.java index 7ac87962130..4ff4c433a83 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmQgaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmQgaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmRDPAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmRDPAction.java index e3bf3c82a23..7eefa38006f 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmRDPAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmRDPAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmSchedulingRulesExecuteStateAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmSchedulingRulesExecuteStateAction.java index a71c0acd13d..6a15d7c436e 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmSchedulingRulesExecuteStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmSchedulingRulesExecuteStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmSshKeyAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmSshKeyAction.java index 7875af7b14c..d6472d23c51 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmSshKeyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmSshKeyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmStartingCandidateClustersHostsAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmStartingCandidateClustersHostsAction.java index 3f43733cf01..424dc60ab1f 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmStartingCandidateClustersHostsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmStartingCandidateClustersHostsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmTaskAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmTaskAction.java index 93262c4123a..9b31261495f 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmTaskAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmTaskAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmUsbRedirectAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmUsbRedirectAction.java index de582583289..1eeedf775a4 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmUsbRedirectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmUsbRedirectAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmXmlAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmXmlAction.java index cd9d5df6697..118ce0a8c36 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmXmlAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmXmlAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmXmlHookScriptAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmXmlHookScriptAction.java index e77cf523dd5..3b26d4ab41d 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmXmlHookScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmXmlHookScriptAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmsCapabilitiesAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmsCapabilitiesAction.java index b85d11e6400..eaf342a5662 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmsCapabilitiesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmsCapabilitiesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmsSchedulingStateFromSchedulingRuleAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmsSchedulingStateFromSchedulingRuleAction.java index 916a4926453..83ae01b33e5 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmsSchedulingStateFromSchedulingRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmsSchedulingStateFromSchedulingRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVmvNUMATopologyAction.java b/sdk/src/main/java/org/zstack/sdk/GetVmvNUMATopologyAction.java index 7ab1b252fc4..1b5881b482e 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVmvNUMATopologyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVmvNUMATopologyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVolumeCapabilitiesAction.java b/sdk/src/main/java/org/zstack/sdk/GetVolumeCapabilitiesAction.java index 29be91f1b14..4d4a692fd6b 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVolumeCapabilitiesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVolumeCapabilitiesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVolumeFormatAction.java b/sdk/src/main/java/org/zstack/sdk/GetVolumeFormatAction.java index 3eff51150e2..2c7f8f0ebe1 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVolumeFormatAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVolumeFormatAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVolumeIoThreadPinAction.java b/sdk/src/main/java/org/zstack/sdk/GetVolumeIoThreadPinAction.java index 47e22f57127..160d7568521 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVolumeIoThreadPinAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVolumeIoThreadPinAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVolumeQosAction.java b/sdk/src/main/java/org/zstack/sdk/GetVolumeQosAction.java index 7b84d226e29..8bdf86f1078 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVolumeQosAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVolumeQosAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVolumeSnapshotSizeAction.java b/sdk/src/main/java/org/zstack/sdk/GetVolumeSnapshotSizeAction.java index 0fb6e844e4d..284ae80a1a9 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVolumeSnapshotSizeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVolumeSnapshotSizeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedEipAction.java b/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedEipAction.java index 699c85dd547..be6360a6ace 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedEipAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedEipAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedIpsecAction.java b/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedIpsecAction.java index a5955b998e1..aeeb126201a 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedIpsecAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedIpsecAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedLoadBalancerAction.java b/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedLoadBalancerAction.java index 0ebc37eaa39..6c1c88384a7 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedLoadBalancerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedLoadBalancerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedNetflowAction.java b/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedNetflowAction.java index 0f182469804..e5b31514d2c 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedNetflowAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedNetflowAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedOspfAction.java b/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedOspfAction.java index f002facbb4b..44634f69b96 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedOspfAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedOspfAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedPortForwardingRulesAction.java b/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedPortForwardingRulesAction.java index 98492349b39..c29efe6128f 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedPortForwardingRulesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedPortForwardingRulesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedVipAction.java b/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedVipAction.java index 09f06110d22..c7ae5e6d767 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedVipAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVpcAttachedVipAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVpcIPsecLogAction.java b/sdk/src/main/java/org/zstack/sdk/GetVpcIPsecLogAction.java index 23cf77f79aa..129de0d0f61 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVpcIPsecLogAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVpcIPsecLogAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVpcMulticastRouteAction.java b/sdk/src/main/java/org/zstack/sdk/GetVpcMulticastRouteAction.java index 36190800cd4..e9351de181a 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVpcMulticastRouteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVpcMulticastRouteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVpcVRouterDistributedRoutingConnectionsAction.java b/sdk/src/main/java/org/zstack/sdk/GetVpcVRouterDistributedRoutingConnectionsAction.java index 3fa80f00cd9..5abe00e0a01 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVpcVRouterDistributedRoutingConnectionsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVpcVRouterDistributedRoutingConnectionsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVpcVRouterDistributedRoutingEnabledAction.java b/sdk/src/main/java/org/zstack/sdk/GetVpcVRouterDistributedRoutingEnabledAction.java index 2c9a4297fa1..f91b413329b 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVpcVRouterDistributedRoutingEnabledAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVpcVRouterDistributedRoutingEnabledAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVpcVRouterNetworkServiceStateAction.java b/sdk/src/main/java/org/zstack/sdk/GetVpcVRouterNetworkServiceStateAction.java index 87dd8da432a..82e91fcc9c3 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVpcVRouterNetworkServiceStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVpcVRouterNetworkServiceStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetVpcVpnConfigurationFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/GetVpcVpnConfigurationFromRemoteAction.java index e9477352080..2b02f717e64 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetVpcVpnConfigurationFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetVpcVpnConfigurationFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetZBoxBackupDetailsAction.java b/sdk/src/main/java/org/zstack/sdk/GetZBoxBackupDetailsAction.java index a906667c383..3eb6b405d19 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetZBoxBackupDetailsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetZBoxBackupDetailsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/GetZoneAction.java b/sdk/src/main/java/org/zstack/sdk/GetZoneAction.java index 604629b4f32..b29abe9ef18 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetZoneAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetZoneAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/IdentifyHostAction.java b/sdk/src/main/java/org/zstack/sdk/IdentifyHostAction.java index fda1a799a4c..79f6726c757 100644 --- a/sdk/src/main/java/org/zstack/sdk/IdentifyHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/IdentifyHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/InspectBareMetal2ChassisAction.java b/sdk/src/main/java/org/zstack/sdk/InspectBareMetal2ChassisAction.java index 33860678c3d..5972a7c98c5 100644 --- a/sdk/src/main/java/org/zstack/sdk/InspectBareMetal2ChassisAction.java +++ b/sdk/src/main/java/org/zstack/sdk/InspectBareMetal2ChassisAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/InspectBareMetal2ChassisByInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/InspectBareMetal2ChassisByInstanceAction.java index 6834785d032..6b26468b29c 100644 --- a/sdk/src/main/java/org/zstack/sdk/InspectBareMetal2ChassisByInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/InspectBareMetal2ChassisByInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/InspectBaremetalChassisAction.java b/sdk/src/main/java/org/zstack/sdk/InspectBaremetalChassisAction.java index ff5d0b37d8a..aff95ee5ec2 100644 --- a/sdk/src/main/java/org/zstack/sdk/InspectBaremetalChassisAction.java +++ b/sdk/src/main/java/org/zstack/sdk/InspectBaremetalChassisAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/IsOpensourceVersionAction.java b/sdk/src/main/java/org/zstack/sdk/IsOpensourceVersionAction.java index 7edfe5f0988..dfe0dc0f34b 100644 --- a/sdk/src/main/java/org/zstack/sdk/IsOpensourceVersionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/IsOpensourceVersionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/IsReadyToGoAction.java b/sdk/src/main/java/org/zstack/sdk/IsReadyToGoAction.java index 49b16166d69..732db54370c 100644 --- a/sdk/src/main/java/org/zstack/sdk/IsReadyToGoAction.java +++ b/sdk/src/main/java/org/zstack/sdk/IsReadyToGoAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/IsVfNicAvailableInL3NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/IsVfNicAvailableInL3NetworkAction.java index a245b8b6d68..759b730f60f 100644 --- a/sdk/src/main/java/org/zstack/sdk/IsVfNicAvailableInL3NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/IsVfNicAvailableInL3NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/KvmRunShellAction.java b/sdk/src/main/java/org/zstack/sdk/KvmRunShellAction.java index 935346922fc..54708fb5248 100644 --- a/sdk/src/main/java/org/zstack/sdk/KvmRunShellAction.java +++ b/sdk/src/main/java/org/zstack/sdk/KvmRunShellAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ListVMsFromKVMHostAction.java b/sdk/src/main/java/org/zstack/sdk/ListVMsFromKVMHostAction.java index c4e2c3c61f5..040e793f963 100644 --- a/sdk/src/main/java/org/zstack/sdk/ListVMsFromKVMHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ListVMsFromKVMHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ListVmSchedulingRulesFromExecuteStateAction.java b/sdk/src/main/java/org/zstack/sdk/ListVmSchedulingRulesFromExecuteStateAction.java index 716a71960a1..d72f6857b9a 100644 --- a/sdk/src/main/java/org/zstack/sdk/ListVmSchedulingRulesFromExecuteStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ListVmSchedulingRulesFromExecuteStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ListVmsFromSchedulingStateAction.java b/sdk/src/main/java/org/zstack/sdk/ListVmsFromSchedulingStateAction.java index b07ca188873..b638ddd3a09 100644 --- a/sdk/src/main/java/org/zstack/sdk/ListVmsFromSchedulingStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ListVmsFromSchedulingStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/LocalStorageGetVolumeMigratableHostsAction.java b/sdk/src/main/java/org/zstack/sdk/LocalStorageGetVolumeMigratableHostsAction.java index fcba544070e..64fef455dd6 100644 --- a/sdk/src/main/java/org/zstack/sdk/LocalStorageGetVolumeMigratableHostsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/LocalStorageGetVolumeMigratableHostsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/LocalStorageMigrateVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/LocalStorageMigrateVolumeAction.java index 783a4bd2dd8..3de08af169a 100644 --- a/sdk/src/main/java/org/zstack/sdk/LocalStorageMigrateVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/LocalStorageMigrateVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/LocateHostNetworkInterfaceAction.java b/sdk/src/main/java/org/zstack/sdk/LocateHostNetworkInterfaceAction.java index 464e65184f0..c97d7e503fc 100644 --- a/sdk/src/main/java/org/zstack/sdk/LocateHostNetworkInterfaceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/LocateHostNetworkInterfaceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/LocateLocalRaidPhysicalDriveAction.java b/sdk/src/main/java/org/zstack/sdk/LocateLocalRaidPhysicalDriveAction.java index 31f22652419..be20b04c87b 100644 --- a/sdk/src/main/java/org/zstack/sdk/LocateLocalRaidPhysicalDriveAction.java +++ b/sdk/src/main/java/org/zstack/sdk/LocateLocalRaidPhysicalDriveAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/LogInAction.java b/sdk/src/main/java/org/zstack/sdk/LogInAction.java index 06a48ac1a56..8533cc8d3e0 100644 --- a/sdk/src/main/java/org/zstack/sdk/LogInAction.java +++ b/sdk/src/main/java/org/zstack/sdk/LogInAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/LogInByAccountAction.java b/sdk/src/main/java/org/zstack/sdk/LogInByAccountAction.java index f99ca80a7c6..32c11da802b 100644 --- a/sdk/src/main/java/org/zstack/sdk/LogInByAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/LogInByAccountAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/LogInByLdapAction.java b/sdk/src/main/java/org/zstack/sdk/LogInByLdapAction.java index d0fc258ec49..6d52a086434 100644 --- a/sdk/src/main/java/org/zstack/sdk/LogInByLdapAction.java +++ b/sdk/src/main/java/org/zstack/sdk/LogInByLdapAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/LogInByUserAction.java b/sdk/src/main/java/org/zstack/sdk/LogInByUserAction.java index 3b1a18edac5..a574137bb82 100644 --- a/sdk/src/main/java/org/zstack/sdk/LogInByUserAction.java +++ b/sdk/src/main/java/org/zstack/sdk/LogInByUserAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/LogOutAction.java b/sdk/src/main/java/org/zstack/sdk/LogOutAction.java index 68cd35d4dcd..74bca14f5f1 100644 --- a/sdk/src/main/java/org/zstack/sdk/LogOutAction.java +++ b/sdk/src/main/java/org/zstack/sdk/LogOutAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/LoginByCasAction.java b/sdk/src/main/java/org/zstack/sdk/LoginByCasAction.java index 59298425f1a..61394059c81 100644 --- a/sdk/src/main/java/org/zstack/sdk/LoginByCasAction.java +++ b/sdk/src/main/java/org/zstack/sdk/LoginByCasAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/LoginIAM2VirtualIDWithLdapAction.java b/sdk/src/main/java/org/zstack/sdk/LoginIAM2VirtualIDWithLdapAction.java index 26c37563989..8eff436b64e 100644 --- a/sdk/src/main/java/org/zstack/sdk/LoginIAM2VirtualIDWithLdapAction.java +++ b/sdk/src/main/java/org/zstack/sdk/LoginIAM2VirtualIDWithLdapAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java b/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java index be243bba4d3..6214024011c 100644 --- a/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/MergeDataOnBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/MergeDataOnBackupStorageAction.java index a33c649db8e..5d105374e23 100644 --- a/sdk/src/main/java/org/zstack/sdk/MergeDataOnBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/MergeDataOnBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/MigrateVmAction.java b/sdk/src/main/java/org/zstack/sdk/MigrateVmAction.java index dac09c8977f..c1cefebb45c 100644 --- a/sdk/src/main/java/org/zstack/sdk/MigrateVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/MigrateVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/MountVmInstanceRecoveryPointAction.java b/sdk/src/main/java/org/zstack/sdk/MountVmInstanceRecoveryPointAction.java index 8a98d497804..2b9114c5627 100644 --- a/sdk/src/main/java/org/zstack/sdk/MountVmInstanceRecoveryPointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/MountVmInstanceRecoveryPointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/MoveDirectoryAction.java b/sdk/src/main/java/org/zstack/sdk/MoveDirectoryAction.java index 7cb19b7fb0e..3b1a83cc160 100644 --- a/sdk/src/main/java/org/zstack/sdk/MoveDirectoryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/MoveDirectoryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/MoveResourcesToDirectoryAction.java b/sdk/src/main/java/org/zstack/sdk/MoveResourcesToDirectoryAction.java index 16a93be7227..3dcb4af2554 100644 --- a/sdk/src/main/java/org/zstack/sdk/MoveResourcesToDirectoryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/MoveResourcesToDirectoryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ParseOvfAction.java b/sdk/src/main/java/org/zstack/sdk/ParseOvfAction.java index 02b0b4e8624..fb21e4a3ce3 100644 --- a/sdk/src/main/java/org/zstack/sdk/ParseOvfAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ParseOvfAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/PauseVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/PauseVmInstanceAction.java index 5231fa9c5a9..ad0fb1f5cff 100644 --- a/sdk/src/main/java/org/zstack/sdk/PauseVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PauseVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/PowerOffBareMetal2ChassisAction.java b/sdk/src/main/java/org/zstack/sdk/PowerOffBareMetal2ChassisAction.java index 97d630b0dd6..58eaf6ae551 100644 --- a/sdk/src/main/java/org/zstack/sdk/PowerOffBareMetal2ChassisAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PowerOffBareMetal2ChassisAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/PowerOffBaremetalChassisAction.java b/sdk/src/main/java/org/zstack/sdk/PowerOffBaremetalChassisAction.java index e0c21b9bc75..3049df83ce9 100644 --- a/sdk/src/main/java/org/zstack/sdk/PowerOffBaremetalChassisAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PowerOffBaremetalChassisAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/PowerOffHostAction.java b/sdk/src/main/java/org/zstack/sdk/PowerOffHostAction.java index 4121ad1c532..aca8708662b 100644 --- a/sdk/src/main/java/org/zstack/sdk/PowerOffHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PowerOffHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/PowerOnBareMetal2ChassisAction.java b/sdk/src/main/java/org/zstack/sdk/PowerOnBareMetal2ChassisAction.java index 2f4fb9a91af..57500b85202 100644 --- a/sdk/src/main/java/org/zstack/sdk/PowerOnBareMetal2ChassisAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PowerOnBareMetal2ChassisAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/PowerOnBaremetalChassisAction.java b/sdk/src/main/java/org/zstack/sdk/PowerOnBaremetalChassisAction.java index c6a00736d4c..aadb3df4910 100644 --- a/sdk/src/main/java/org/zstack/sdk/PowerOnBaremetalChassisAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PowerOnBaremetalChassisAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/PowerOnHostAction.java b/sdk/src/main/java/org/zstack/sdk/PowerOnHostAction.java index 2086eb0ca67..0cfd7394772 100644 --- a/sdk/src/main/java/org/zstack/sdk/PowerOnHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PowerOnHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/PowerResetBareMetal2ChassisAction.java b/sdk/src/main/java/org/zstack/sdk/PowerResetBareMetal2ChassisAction.java index b94038a1fa4..458098fa52b 100644 --- a/sdk/src/main/java/org/zstack/sdk/PowerResetBareMetal2ChassisAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PowerResetBareMetal2ChassisAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/PowerResetBaremetalChassisAction.java b/sdk/src/main/java/org/zstack/sdk/PowerResetBaremetalChassisAction.java index 404e73f95a4..03219026451 100644 --- a/sdk/src/main/java/org/zstack/sdk/PowerResetBaremetalChassisAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PowerResetBaremetalChassisAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/PowerResetHostAction.java b/sdk/src/main/java/org/zstack/sdk/PowerResetHostAction.java index ea6d832f433..901531764f6 100644 --- a/sdk/src/main/java/org/zstack/sdk/PowerResetHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PowerResetHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/PreviewResourceFromAppAction.java b/sdk/src/main/java/org/zstack/sdk/PreviewResourceFromAppAction.java index 22dcd054912..ab8139ee7a4 100644 --- a/sdk/src/main/java/org/zstack/sdk/PreviewResourceFromAppAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PreviewResourceFromAppAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/PreviewResourceStackAction.java b/sdk/src/main/java/org/zstack/sdk/PreviewResourceStackAction.java index a9a64542f3e..71260633cfc 100644 --- a/sdk/src/main/java/org/zstack/sdk/PreviewResourceStackAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PreviewResourceStackAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVmAction.java b/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVmAction.java index 49641300f27..49113fa0a24 100644 --- a/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVolumeAction.java index 7ed53f5ebce..e39b073ca44 100644 --- a/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/PrometheusQueryLabelValuesAction.java b/sdk/src/main/java/org/zstack/sdk/PrometheusQueryLabelValuesAction.java index 2aee7b6fdb9..84e599f6b95 100644 --- a/sdk/src/main/java/org/zstack/sdk/PrometheusQueryLabelValuesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PrometheusQueryLabelValuesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/PrometheusQueryMetadataAction.java b/sdk/src/main/java/org/zstack/sdk/PrometheusQueryMetadataAction.java index fa976404fa8..96154da1c97 100644 --- a/sdk/src/main/java/org/zstack/sdk/PrometheusQueryMetadataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PrometheusQueryMetadataAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/PrometheusQueryPassThroughAction.java b/sdk/src/main/java/org/zstack/sdk/PrometheusQueryPassThroughAction.java index 6a517f9d3e8..978bad45f35 100644 --- a/sdk/src/main/java/org/zstack/sdk/PrometheusQueryPassThroughAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PrometheusQueryPassThroughAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/PrometheusQueryVmMonitoringDataAction.java b/sdk/src/main/java/org/zstack/sdk/PrometheusQueryVmMonitoringDataAction.java index a8068ea37c7..cf5c0d89772 100644 --- a/sdk/src/main/java/org/zstack/sdk/PrometheusQueryVmMonitoringDataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PrometheusQueryVmMonitoringDataAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ProtectVmInstanceRecoveryPointAction.java b/sdk/src/main/java/org/zstack/sdk/ProtectVmInstanceRecoveryPointAction.java index fcb9121d0e1..68be6280f22 100644 --- a/sdk/src/main/java/org/zstack/sdk/ProtectVmInstanceRecoveryPointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ProtectVmInstanceRecoveryPointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstConfigAction.java b/sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstConfigAction.java index 700bce6a76c..cf7439b5dbc 100644 --- a/sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstGroupAction.java b/sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstGroupAction.java index c26afa190f4..75970bd0fad 100644 --- a/sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ProvisionNfvInstGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ProvisionSlbInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/ProvisionSlbInstanceAction.java index 651073aee18..55f47489206 100644 --- a/sdk/src/main/java/org/zstack/sdk/ProvisionSlbInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ProvisionSlbInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ProvisionVirtualRouterConfigAction.java b/sdk/src/main/java/org/zstack/sdk/ProvisionVirtualRouterConfigAction.java index 38cc57ae1bc..2a18646f7fc 100644 --- a/sdk/src/main/java/org/zstack/sdk/ProvisionVirtualRouterConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ProvisionVirtualRouterConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/PublishAppAction.java b/sdk/src/main/java/org/zstack/sdk/PublishAppAction.java index 66b2162eb76..dd1b7ac610c 100644 --- a/sdk/src/main/java/org/zstack/sdk/PublishAppAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PublishAppAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/PullSdnControllerTenantAction.java b/sdk/src/main/java/org/zstack/sdk/PullSdnControllerTenantAction.java index 615aeedd813..a57a2cc241e 100644 --- a/sdk/src/main/java/org/zstack/sdk/PullSdnControllerTenantAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PullSdnControllerTenantAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/PushLicenseAddOnsUsageAction.java b/sdk/src/main/java/org/zstack/sdk/PushLicenseAddOnsUsageAction.java index 66c6f962062..01423dd9ee4 100644 --- a/sdk/src/main/java/org/zstack/sdk/PushLicenseAddOnsUsageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PushLicenseAddOnsUsageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAccessControlListAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAccessControlListAction.java index f5de17a21eb..c28228ca188 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAccessControlListAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAccessControlListAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAccessControlRuleAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAccessControlRuleAction.java index 490723f1992..2bc1eff98ca 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAccessControlRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAccessControlRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAccessKeyAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAccessKeyAction.java index 1cfeab1234b..89256d70dfb 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAccessKeyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAccessKeyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAccountAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAccountAction.java index 6da6a132acd..7232afe7462 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAccountAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAccountBillingAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAccountBillingAction.java index daae3322129..a7ea9bcd4d3 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAccountBillingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAccountBillingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAccountPriceTableRefAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAccountPriceTableRefAction.java index f8d208af1c0..c73911ab79a 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAccountPriceTableRefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAccountPriceTableRefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAccountResourceRefAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAccountResourceRefAction.java index 9343515c94d..f2608884dd7 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAccountResourceRefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAccountResourceRefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAddressPoolAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAddressPoolAction.java index 87d58519453..3851fa60b15 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAddressPoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAddressPoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAffinityGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAffinityGroupAction.java index 731e1152c69..317a35bd084 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAffinityGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAffinityGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAgentVersionAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAgentVersionAction.java index b777e440887..efe06132ff7 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAgentVersionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAgentVersionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAlertAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAlertAction.java index ff26a10cf0f..3e87e74c526 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAlertAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAlertAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAliyunDiskFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAliyunDiskFromLocalAction.java index db6029eced2..0ad5f8eff5f 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAliyunDiskFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAliyunDiskFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAliyunEbsBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAliyunEbsBackupStorageAction.java index 374841344ab..c2323ded187 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAliyunEbsBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAliyunEbsBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAliyunEbsPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAliyunEbsPrimaryStorageAction.java index 8c141b538fb..96ed6adcbb2 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAliyunEbsPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAliyunEbsPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAliyunNasAccessGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAliyunNasAccessGroupAction.java index 29fc49160f0..1786c2d1a7a 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAliyunNasAccessGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAliyunNasAccessGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAliyunPanguPartitionAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAliyunPanguPartitionAction.java index 08cd5c90d9e..fee99e135a9 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAliyunPanguPartitionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAliyunPanguPartitionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAliyunProxyVSwitchAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAliyunProxyVSwitchAction.java index a693ee1f075..79321dc2735 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAliyunProxyVSwitchAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAliyunProxyVSwitchAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAliyunProxyVpcAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAliyunProxyVpcAction.java index f94c6adf6c2..afb7f88b07d 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAliyunProxyVpcAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAliyunProxyVpcAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAliyunRouteEntryFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAliyunRouteEntryFromLocalAction.java index 05707092a5e..d8fd04d6fec 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAliyunRouteEntryFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAliyunRouteEntryFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAliyunRouterInterfaceFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAliyunRouterInterfaceFromLocalAction.java index 47c077627f6..e017f320879 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAliyunRouterInterfaceFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAliyunRouterInterfaceFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAliyunSnapshotFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAliyunSnapshotFromLocalAction.java index 544069019cf..c0ea310375f 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAliyunSnapshotFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAliyunSnapshotFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAliyunVirtualRouterFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAliyunVirtualRouterFromLocalAction.java index 0bdcecbd4d1..7442e91a535 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAliyunVirtualRouterFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAliyunVirtualRouterFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAppBuildSystemAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAppBuildSystemAction.java index ee882ac60c7..458958564ab 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAppBuildSystemAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAppBuildSystemAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryApplianceVmAction.java b/sdk/src/main/java/org/zstack/sdk/QueryApplianceVmAction.java index 917d5b1c05b..d8032cbb9ca 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryApplianceVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryApplianceVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceAction.java index f6248226fc0..d53be39aa1d 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingGroupAction.java index dc346869091..a9628b456c3 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingGroupActivityAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingGroupActivityAction.java index 2bc5febd109..78d3dcb4fa8 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingGroupActivityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingGroupActivityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingGroupInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingGroupInstanceAction.java index b29746b9a10..cc5a9a96353 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingGroupInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingGroupInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingRuleAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingRuleAction.java index bcd640455fe..2a4c86201cf 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingRuleTriggerAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingRuleTriggerAction.java index a107ad488ae..256754210f7 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingRuleTriggerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingRuleTriggerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingVmTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingVmTemplateAction.java index 273482d6818..42c76767ac1 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingVmTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryAutoScalingVmTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/QueryBackupStorageAction.java index 25fa0c9e97f..8f47bb5072a 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2BondingAction.java b/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2BondingAction.java index 6a142c89395..2de8587f9ed 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2BondingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2BondingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2BondingNicRefAction.java b/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2BondingNicRefAction.java index 98ad06d6249..a07a4b4e963 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2BondingNicRefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2BondingNicRefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2ChassisAction.java b/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2ChassisAction.java index cdf8267a2d9..5c881cdee8c 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2ChassisAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2ChassisAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2ChassisGpuDeviceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2ChassisGpuDeviceAction.java index d3a49c042ed..bfdce89c26f 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2ChassisGpuDeviceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2ChassisGpuDeviceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2ChassisOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2ChassisOfferingAction.java index f034c68c9e6..9f72a7d2862 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2ChassisOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2ChassisOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2ChassisPciDeviceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2ChassisPciDeviceAction.java index 6f333552935..a3bf4dcf587 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2ChassisPciDeviceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2ChassisPciDeviceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2GatewayAction.java b/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2GatewayAction.java index a8c29bf9809..c1f17094cfa 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2GatewayAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2GatewayAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2InstanceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2InstanceAction.java index 4097b91f95d..078d3bdc0de 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2InstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2InstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2ProvisionNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2ProvisionNetworkAction.java index 45a26dff172..ecebba9a464 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2ProvisionNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryBareMetal2ProvisionNetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryBaremetalBondingAction.java b/sdk/src/main/java/org/zstack/sdk/QueryBaremetalBondingAction.java index a8f40163d1d..40debda6a8a 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryBaremetalBondingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryBaremetalBondingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryBaremetalChassisAction.java b/sdk/src/main/java/org/zstack/sdk/QueryBaremetalChassisAction.java index 1f2aa5eb80b..91c7fd571da 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryBaremetalChassisAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryBaremetalChassisAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryBaremetalInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryBaremetalInstanceAction.java index bb95880fda5..6d25373a8be 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryBaremetalInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryBaremetalInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryBaremetalPxeServerAction.java b/sdk/src/main/java/org/zstack/sdk/QueryBaremetalPxeServerAction.java index 3ef4a2eb5aa..3a7a7949172 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryBaremetalPxeServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryBaremetalPxeServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryBlockPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/QueryBlockPrimaryStorageAction.java index 8ba2d149f34..6dd8284abef 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryBlockPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryBlockPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryBlockVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/QueryBlockVolumeAction.java index 58e1e36b4c1..0a99897d5f3 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryBlockVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryBlockVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryBuildAppAction.java b/sdk/src/main/java/org/zstack/sdk/QueryBuildAppAction.java index b175ff6b90f..be648884772 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryBuildAppAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryBuildAppAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryBuildAppExportHistoryAction.java b/sdk/src/main/java/org/zstack/sdk/QueryBuildAppExportHistoryAction.java index c2c4a943b0c..dc731160b91 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryBuildAppExportHistoryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryBuildAppExportHistoryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryCCSCertificateAction.java b/sdk/src/main/java/org/zstack/sdk/QueryCCSCertificateAction.java index d8f625131ea..00df69f522f 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryCCSCertificateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryCCSCertificateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryCbtTaskAction.java b/sdk/src/main/java/org/zstack/sdk/QueryCbtTaskAction.java index 7ba3a86c7f4..cdfa9df8e48 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryCbtTaskAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryCbtTaskAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryCdpPolicyAction.java b/sdk/src/main/java/org/zstack/sdk/QueryCdpPolicyAction.java index 608f969b2b2..24f3203688a 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryCdpPolicyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryCdpPolicyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryCdpTaskAction.java b/sdk/src/main/java/org/zstack/sdk/QueryCdpTaskAction.java index fdc4a3a5f8a..b511557623e 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryCdpTaskAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryCdpTaskAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryCephBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/QueryCephBackupStorageAction.java index 0ab4528aee8..3dc03004d12 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryCephBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryCephBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryCephOsdGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryCephOsdGroupAction.java index 19a36566a07..c92539c5f76 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryCephOsdGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryCephOsdGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryCephPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/QueryCephPrimaryStorageAction.java index 2b7d6c78c1f..d33c88bb96e 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryCephPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryCephPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryCephPrimaryStoragePoolAction.java b/sdk/src/main/java/org/zstack/sdk/QueryCephPrimaryStoragePoolAction.java index e1331f86e34..79aaf46c3d0 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryCephPrimaryStoragePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryCephPrimaryStoragePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryCertificateAction.java b/sdk/src/main/java/org/zstack/sdk/QueryCertificateAction.java index fe40807526c..a9afcc29957 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryCertificateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryCertificateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryClusterAction.java b/sdk/src/main/java/org/zstack/sdk/QueryClusterAction.java index 67510dd7774..b62766ae187 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryClusterDRSAction.java b/sdk/src/main/java/org/zstack/sdk/QueryClusterDRSAction.java index abe4fcd4718..c961160bf78 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryClusterDRSAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryClusterDRSAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryConnectionAccessPointFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/QueryConnectionAccessPointFromLocalAction.java index 36988a11d3c..ce157fd000f 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryConnectionAccessPointFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryConnectionAccessPointFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryConnectionBetweenL3NetworkAndAliyunVSwitchAction.java b/sdk/src/main/java/org/zstack/sdk/QueryConnectionBetweenL3NetworkAndAliyunVSwitchAction.java index d937d2f5cff..35351947e8e 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryConnectionBetweenL3NetworkAndAliyunVSwitchAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryConnectionBetweenL3NetworkAndAliyunVSwitchAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryConsoleProxyAgentAction.java b/sdk/src/main/java/org/zstack/sdk/QueryConsoleProxyAgentAction.java index 08bce6fd600..8a8cc8a5f3a 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryConsoleProxyAgentAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryConsoleProxyAgentAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryContainerImageAction.java b/sdk/src/main/java/org/zstack/sdk/QueryContainerImageAction.java index 3938fbcdec4..e7506e60429 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryContainerImageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryContainerImageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementEndpointAction.java index 21ad927e2b6..07db45a652c 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryDRSAdviceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryDRSAdviceAction.java index 4bf5bde5328..76fb4c41c8a 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryDRSAdviceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryDRSAdviceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryDRSVmMigrationActivityAction.java b/sdk/src/main/java/org/zstack/sdk/QueryDRSVmMigrationActivityAction.java index 938c364a1b4..19d07dbf23a 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryDRSVmMigrationActivityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryDRSVmMigrationActivityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryDataCenterFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/QueryDataCenterFromLocalAction.java index 31fdc0622e6..fb3953e6bd0 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryDataCenterFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryDataCenterFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryDatasetAction.java b/sdk/src/main/java/org/zstack/sdk/QueryDatasetAction.java index 54a94e20af7..f92255b01dd 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryDatasetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryDatasetAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryDirectoryAction.java b/sdk/src/main/java/org/zstack/sdk/QueryDirectoryAction.java index b054d6e2b9a..6107de38a70 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryDirectoryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryDirectoryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryDiskOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/QueryDiskOfferingAction.java index d5db565e8f5..f8f36685613 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryDiskOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryDiskOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryEcsImageFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/QueryEcsImageFromLocalAction.java index 7aff336730e..c588ee38cfa 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryEcsImageFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryEcsImageFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryEcsInstanceFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/QueryEcsInstanceFromLocalAction.java index 43c69a35627..19fef731486 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryEcsInstanceFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryEcsInstanceFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryEcsSecurityGroupFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/QueryEcsSecurityGroupFromLocalAction.java index 8b9d7cd87ae..30db1f9892b 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryEcsSecurityGroupFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryEcsSecurityGroupFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryEcsSecurityGroupRuleFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/QueryEcsSecurityGroupRuleFromLocalAction.java index c1c2283685a..8087f7820a9 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryEcsSecurityGroupRuleFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryEcsSecurityGroupRuleFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryEcsVSwitchFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/QueryEcsVSwitchFromLocalAction.java index 21a623a6ce1..fbc198dc898 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryEcsVSwitchFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryEcsVSwitchFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryEcsVpcFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/QueryEcsVpcFromLocalAction.java index 16cfaade1dc..a8e3f250dad 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryEcsVpcFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryEcsVpcFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryEipAction.java b/sdk/src/main/java/org/zstack/sdk/QueryEipAction.java index 0c3b2419a5a..c1f9896013a 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryEipAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryEipAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryEmailMediaAction.java b/sdk/src/main/java/org/zstack/sdk/QueryEmailMediaAction.java index 50361b56f4b..8550b86309d 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryEmailMediaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryEmailMediaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryEmailTriggerActionAction.java b/sdk/src/main/java/org/zstack/sdk/QueryEmailTriggerActionAction.java index 455a93e44bc..9cc4ac28839 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryEmailTriggerActionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryEmailTriggerActionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryEthernetVFAction.java b/sdk/src/main/java/org/zstack/sdk/QueryEthernetVFAction.java index d09bdc9a52c..4645c05179c 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryEthernetVFAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryEthernetVFAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryEventFromResourceStackAction.java b/sdk/src/main/java/org/zstack/sdk/QueryEventFromResourceStackAction.java index fc35a99ddbe..10cbb5a1339 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryEventFromResourceStackAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryEventFromResourceStackAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryEventLogAction.java b/sdk/src/main/java/org/zstack/sdk/QueryEventLogAction.java index c286348305c..c701b3ab9f9 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryEventLogAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryEventLogAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryExponBlockVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/QueryExponBlockVolumeAction.java index 284da33dede..ce63366423d 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryExponBlockVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryExponBlockVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryExternalBackupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryExternalBackupAction.java index d67528a0433..2874a4f165b 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryExternalBackupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryExternalBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryFaultToleranceVmAction.java b/sdk/src/main/java/org/zstack/sdk/QueryFaultToleranceVmAction.java index aebcf66d2d2..43086baa61d 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryFaultToleranceVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryFaultToleranceVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryFcHbaDeviceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryFcHbaDeviceAction.java index 0d1335eaaab..df9fd320947 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryFcHbaDeviceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryFcHbaDeviceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryFiberChannelLunAction.java b/sdk/src/main/java/org/zstack/sdk/QueryFiberChannelLunAction.java index bbd5a65d989..ed071e9e240 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryFiberChannelLunAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryFiberChannelLunAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryFiberChannelStorageAction.java b/sdk/src/main/java/org/zstack/sdk/QueryFiberChannelStorageAction.java index 02350cbe0c7..71de6f36ebe 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryFiberChannelStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryFiberChannelStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryFirewallIpSetTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/QueryFirewallIpSetTemplateAction.java index 1e921567a61..a1fc9ea77ab 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryFirewallIpSetTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryFirewallIpSetTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryFirewallRuleAction.java b/sdk/src/main/java/org/zstack/sdk/QueryFirewallRuleAction.java index 46b8dea0d2f..a0e0dd7aa92 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryFirewallRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryFirewallRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryFirewallRuleSetAction.java b/sdk/src/main/java/org/zstack/sdk/QueryFirewallRuleSetAction.java index db6e54045e3..dee274124d0 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryFirewallRuleSetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryFirewallRuleSetAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryFirewallRuleSetL3RefAction.java b/sdk/src/main/java/org/zstack/sdk/QueryFirewallRuleSetL3RefAction.java index 4ee6bacc707..d5c79f198d7 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryFirewallRuleSetL3RefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryFirewallRuleSetL3RefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryFirewallRuleTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/QueryFirewallRuleTemplateAction.java index ce60e9cb330..bfc5d51c71e 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryFirewallRuleTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryFirewallRuleTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryFlowCollectorAction.java b/sdk/src/main/java/org/zstack/sdk/QueryFlowCollectorAction.java index 3ca71329ead..eeef82919a3 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryFlowCollectorAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryFlowCollectorAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryFlowMeterAction.java b/sdk/src/main/java/org/zstack/sdk/QueryFlowMeterAction.java index ad08a6dad21..dfe7a3a8e74 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryFlowMeterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryFlowMeterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryGCJobAction.java b/sdk/src/main/java/org/zstack/sdk/QueryGCJobAction.java index b476784083a..06ab957281e 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryGCJobAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryGCJobAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryGlobalConfigAction.java b/sdk/src/main/java/org/zstack/sdk/QueryGlobalConfigAction.java index 4ecc14299e7..5e681094d80 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryGlobalConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryGlobalConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryGlobalConfigTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/QueryGlobalConfigTemplateAction.java index 3863b07666d..5d14a43f2f7 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryGlobalConfigTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryGlobalConfigTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryGpuDeviceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryGpuDeviceAction.java index eb8a9db29d8..c4f8341fa91 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryGpuDeviceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryGpuDeviceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryGuestToolsStateAction.java b/sdk/src/main/java/org/zstack/sdk/QueryGuestToolsStateAction.java index 6ea5d1a5d42..f54a1d276a5 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryGuestToolsStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryGuestToolsStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryGuestVmScriptAction.java b/sdk/src/main/java/org/zstack/sdk/QueryGuestVmScriptAction.java index 353fcfd6b2a..fb4e15512dd 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryGuestVmScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryGuestVmScriptAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryGuestVmScriptExecutedRecordAction.java b/sdk/src/main/java/org/zstack/sdk/QueryGuestVmScriptExecutedRecordAction.java index df50ab13747..f977cd29afc 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryGuestVmScriptExecutedRecordAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryGuestVmScriptExecutedRecordAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryGuestVmScriptExecutedRecordDetailAction.java b/sdk/src/main/java/org/zstack/sdk/QueryGuestVmScriptExecutedRecordDetailAction.java index 041bca38c5c..af7ac7e3300 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryGuestVmScriptExecutedRecordDetailAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryGuestVmScriptExecutedRecordDetailAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryHostAction.java b/sdk/src/main/java/org/zstack/sdk/QueryHostAction.java index ea3475159c7..6267352138b 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryHostNetworkBondingAction.java b/sdk/src/main/java/org/zstack/sdk/QueryHostNetworkBondingAction.java index c7f9b4473e6..46af8cb25de 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryHostNetworkBondingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryHostNetworkBondingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryHostNetworkInterfaceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryHostNetworkInterfaceAction.java index d61a46fe9c5..b7567fbe120 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryHostNetworkInterfaceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryHostNetworkInterfaceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryHostNetworkInterfaceLldpAction.java b/sdk/src/main/java/org/zstack/sdk/QueryHostNetworkInterfaceLldpAction.java index 815ee399106..ebb3ff8b8e5 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryHostNetworkInterfaceLldpAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryHostNetworkInterfaceLldpAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryHostOsCategoryAction.java b/sdk/src/main/java/org/zstack/sdk/QueryHostOsCategoryAction.java index cafd055f0b2..0616043ccf6 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryHostOsCategoryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryHostOsCategoryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryHostPhysicalMemoryAction.java b/sdk/src/main/java/org/zstack/sdk/QueryHostPhysicalMemoryAction.java index 3a32b21002e..9edb147781c 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryHostPhysicalMemoryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryHostPhysicalMemoryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryHostSchedulingRuleGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryHostSchedulingRuleGroupAction.java index 09d33ca01cd..b0a1e9ae510 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryHostSchedulingRuleGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryHostSchedulingRuleGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryHybridEipFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/QueryHybridEipFromLocalAction.java index b08d28cb65b..2342c223a38 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryHybridEipFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryHybridEipFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryHybridKeySecretAction.java b/sdk/src/main/java/org/zstack/sdk/QueryHybridKeySecretAction.java index 43ec2fce024..fe696152f0a 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryHybridKeySecretAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryHybridKeySecretAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryHygonDeviceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryHygonDeviceAction.java index e7526e87cdf..bd569cbb7e2 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryHygonDeviceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryHygonDeviceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryIAM2LdapBindingAction.java b/sdk/src/main/java/org/zstack/sdk/QueryIAM2LdapBindingAction.java index 418d843f4d4..215d897dc01 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryIAM2LdapBindingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryIAM2LdapBindingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryIPSecConnectionAction.java b/sdk/src/main/java/org/zstack/sdk/QueryIPSecConnectionAction.java index 5d07a052470..038ff478118 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryIPSecConnectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryIPSecConnectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryIdentityZoneFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/QueryIdentityZoneFromLocalAction.java index 9f4fda9fd29..490386f4a27 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryIdentityZoneFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryIdentityZoneFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryImageAction.java b/sdk/src/main/java/org/zstack/sdk/QueryImageAction.java index 7a5a449efe5..c10bc508519 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryImageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryImageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryImageCacheAction.java b/sdk/src/main/java/org/zstack/sdk/QueryImageCacheAction.java index d78265ddb75..f6f8a30e5ca 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryImageCacheAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryImageCacheAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryImageGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryImageGroupAction.java index 609b52d35cc..8ed8f0b1e63 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryImageGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryImageGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryImageGroupRefAction.java b/sdk/src/main/java/org/zstack/sdk/QueryImageGroupRefAction.java index 970ca5d3e29..fe7993c8f1a 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryImageGroupRefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryImageGroupRefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryImagePackageAction.java b/sdk/src/main/java/org/zstack/sdk/QueryImagePackageAction.java index 18896f7a460..e005f7ac77a 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryImagePackageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryImagePackageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryImageReplicationGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryImageReplicationGroupAction.java index b386768ba81..698b544a2b7 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryImageReplicationGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryImageReplicationGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryImageStoreBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/QueryImageStoreBackupStorageAction.java index c066d2d74dd..25b0ccd1d15 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryImageStoreBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryImageStoreBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryInstanceOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/QueryInstanceOfferingAction.java index 583e4e4a856..1db38efa35b 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryInstanceOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryInstanceOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryIpAddressAction.java b/sdk/src/main/java/org/zstack/sdk/QueryIpAddressAction.java index 5605c408233..db3318b4606 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryIpAddressAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryIpAddressAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryIpRangeAction.java b/sdk/src/main/java/org/zstack/sdk/QueryIpRangeAction.java index df7b52b704f..287fcd58cb3 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryIpRangeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryIpRangeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryIscsiLunAction.java b/sdk/src/main/java/org/zstack/sdk/QueryIscsiLunAction.java index 94bbe318966..823220c3823 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryIscsiLunAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryIscsiLunAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryIscsiServerAction.java b/sdk/src/main/java/org/zstack/sdk/QueryIscsiServerAction.java index 37ee4bebadb..cd346b83baf 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryIscsiServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryIscsiServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryKvmHypervisorInfoAction.java b/sdk/src/main/java/org/zstack/sdk/QueryKvmHypervisorInfoAction.java index 5504e0102e8..2eef7cdae72 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryKvmHypervisorInfoAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryKvmHypervisorInfoAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryL2NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/QueryL2NetworkAction.java index 4f82e1f6b59..9d221350cbe 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryL2NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryL2NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryL2PortGroupNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/QueryL2PortGroupNetworkAction.java index 19f97cb2a8b..1ab6d212558 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryL2PortGroupNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryL2PortGroupNetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryL2VirtualSwitchNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/QueryL2VirtualSwitchNetworkAction.java index e876fe873d4..d247874dff6 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryL2VirtualSwitchNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryL2VirtualSwitchNetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryL2VlanNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/QueryL2VlanNetworkAction.java index 945ccc2dc56..36d59dcf9d4 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryL2VlanNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryL2VlanNetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryL2VxlanNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/QueryL2VxlanNetworkAction.java index bc829e0f790..95784a0ca2d 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryL2VxlanNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryL2VxlanNetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryL2VxlanNetworkPoolAction.java b/sdk/src/main/java/org/zstack/sdk/QueryL2VxlanNetworkPoolAction.java index a1537d789f2..1aa024a1c4a 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryL2VxlanNetworkPoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryL2VxlanNetworkPoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryL3NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/QueryL3NetworkAction.java index 9661390163b..1a5c3d61628 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryL3NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryL3NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryLdapBindingAction.java b/sdk/src/main/java/org/zstack/sdk/QueryLdapBindingAction.java index 615173a286b..6001ae8d369 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryLdapBindingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryLdapBindingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryLdapServerAction.java b/sdk/src/main/java/org/zstack/sdk/QueryLdapServerAction.java index 0aaa21ef026..097c4802cd3 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryLdapServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryLdapServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryLoadBalancerAction.java b/sdk/src/main/java/org/zstack/sdk/QueryLoadBalancerAction.java index 1180096b22f..d6de1f6633c 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryLoadBalancerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryLoadBalancerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryLoadBalancerListenerAction.java b/sdk/src/main/java/org/zstack/sdk/QueryLoadBalancerListenerAction.java index 48a3b432097..0d245037d42 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryLoadBalancerListenerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryLoadBalancerListenerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryLoadBalancerServerGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryLoadBalancerServerGroupAction.java index 77b287a3b2f..3aeb0f55c9e 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryLoadBalancerServerGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryLoadBalancerServerGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryLocalRaidControllerAction.java b/sdk/src/main/java/org/zstack/sdk/QueryLocalRaidControllerAction.java index a0b63847ed8..1315f3ab51f 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryLocalRaidControllerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryLocalRaidControllerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryLocalRaidPhysicalDriveAction.java b/sdk/src/main/java/org/zstack/sdk/QueryLocalRaidPhysicalDriveAction.java index 042caaf4566..b4721d95a41 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryLocalRaidPhysicalDriveAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryLocalRaidPhysicalDriveAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryLocalStorageResourceRefAction.java b/sdk/src/main/java/org/zstack/sdk/QueryLocalStorageResourceRefAction.java index 274edcda59f..8a56ad7af9c 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryLocalStorageResourceRefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryLocalStorageResourceRefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryLogServerAction.java b/sdk/src/main/java/org/zstack/sdk/QueryLogServerAction.java index 7c0b3dc9563..cde49c289e2 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryLogServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryLogServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryLongJobAction.java b/sdk/src/main/java/org/zstack/sdk/QueryLongJobAction.java index 1a7a81a86de..9948dc13e74 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryLongJobAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryLongJobAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryManagementNodeAction.java b/sdk/src/main/java/org/zstack/sdk/QueryManagementNodeAction.java index ade0bf4d366..c5472c4a1fd 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryManagementNodeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryManagementNodeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryMdevDeviceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryMdevDeviceAction.java index eb052bbead1..5e075ddf87e 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryMdevDeviceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryMdevDeviceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryMdevDeviceSpecAction.java b/sdk/src/main/java/org/zstack/sdk/QueryMdevDeviceSpecAction.java index abea969044c..bfa60647c7f 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryMdevDeviceSpecAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryMdevDeviceSpecAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryMediaAction.java b/sdk/src/main/java/org/zstack/sdk/QueryMediaAction.java index f7e4b747947..b5f6e3541b3 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryMediaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryMediaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryMiniStorageAction.java b/sdk/src/main/java/org/zstack/sdk/QueryMiniStorageAction.java index 800523d9c64..03d24db8a55 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryMiniStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryMiniStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryMiniStorageHostRefAction.java b/sdk/src/main/java/org/zstack/sdk/QueryMiniStorageHostRefAction.java index a7404a8ad28..cf3f2d71eb2 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryMiniStorageHostRefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryMiniStorageHostRefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryMiniStorageResourceReplicationAction.java b/sdk/src/main/java/org/zstack/sdk/QueryMiniStorageResourceReplicationAction.java index 81082e7a64b..69ae5988347 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryMiniStorageResourceReplicationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryMiniStorageResourceReplicationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelAction.java b/sdk/src/main/java/org/zstack/sdk/QueryModelAction.java index e93b4f4a03a..c7727800ba8 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryModelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/QueryModelCenterAction.java index dd08be13bb9..d5155418460 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryModelCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelCenterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelEvalServiceInstanceGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryModelEvalServiceInstanceGroupAction.java index 303ffd940e9..873fd41b61f 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryModelEvalServiceInstanceGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelEvalServiceInstanceGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelEvaluationTaskAction.java b/sdk/src/main/java/org/zstack/sdk/QueryModelEvaluationTaskAction.java index 54aca235a7d..022af7031d3 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryModelEvaluationTaskAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelEvaluationTaskAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryModelServiceAction.java index 362ca8d1d80..93bc20d685a 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelServiceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelServiceInstanceGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryModelServiceInstanceGroupAction.java index e49163d2a00..9ad38a68cfd 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryModelServiceInstanceGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelServiceInstanceGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryMonitorTriggerAction.java b/sdk/src/main/java/org/zstack/sdk/QueryMonitorTriggerAction.java index 54395ec9404..106da618a8e 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryMonitorTriggerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryMonitorTriggerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryMonitorTriggerActionAction.java b/sdk/src/main/java/org/zstack/sdk/QueryMonitorTriggerActionAction.java index e18c68f0bee..18a1ffeb342 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryMonitorTriggerActionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryMonitorTriggerActionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryMttyDeviceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryMttyDeviceAction.java index 930283ebd9f..34564c9087b 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryMttyDeviceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryMttyDeviceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryMulticastRouterAction.java b/sdk/src/main/java/org/zstack/sdk/QueryMulticastRouterAction.java index 4711afb772a..30c4fdeaf2a 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryMulticastRouterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryMulticastRouterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNasFileSystemAction.java b/sdk/src/main/java/org/zstack/sdk/QueryNasFileSystemAction.java index d6c66cf7751..a2a9e77a1c6 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryNasFileSystemAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryNasFileSystemAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNasMountTargetAction.java b/sdk/src/main/java/org/zstack/sdk/QueryNasMountTargetAction.java index 01ecc7fc64c..42c5185b25c 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryNasMountTargetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryNasMountTargetAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNativeClusterAction.java b/sdk/src/main/java/org/zstack/sdk/QueryNativeClusterAction.java index 36c955da9ff..1c157cbb3fa 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryNativeClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryNativeClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNativeHostAction.java b/sdk/src/main/java/org/zstack/sdk/QueryNativeHostAction.java index 59f4c4141f8..ae0e2e11ccf 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryNativeHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryNativeHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNetworkServiceL3NetworkRefAction.java b/sdk/src/main/java/org/zstack/sdk/QueryNetworkServiceL3NetworkRefAction.java index 3e9a90d6af4..5b21dc9207e 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryNetworkServiceL3NetworkRefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryNetworkServiceL3NetworkRefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNetworkServiceProviderAction.java b/sdk/src/main/java/org/zstack/sdk/QueryNetworkServiceProviderAction.java index 8ef6f0b20a4..afee6d16479 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryNetworkServiceProviderAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryNetworkServiceProviderAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNfvInstAction.java b/sdk/src/main/java/org/zstack/sdk/QueryNfvInstAction.java index 99f1c66b110..d21088a9d38 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryNfvInstAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryNfvInstAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNfvInstGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryNfvInstGroupAction.java index a04db2a92dd..e58872ed0e2 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryNfvInstGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryNfvInstGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNfvInstOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/QueryNfvInstOfferingAction.java index da56a1e225c..cb60b1a9285 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryNfvInstOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryNfvInstOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNvmeLunAction.java b/sdk/src/main/java/org/zstack/sdk/QueryNvmeLunAction.java index bf8062ef0b2..3ed95feaca4 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryNvmeLunAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryNvmeLunAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNvmeServerAction.java b/sdk/src/main/java/org/zstack/sdk/QueryNvmeServerAction.java index b314eb65c16..5075572def5 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryNvmeServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryNvmeServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNvmeTargetAction.java b/sdk/src/main/java/org/zstack/sdk/QueryNvmeTargetAction.java index 9298c30a9af..992d9f99ce0 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryNvmeTargetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryNvmeTargetAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryOssBucketFileNameAction.java b/sdk/src/main/java/org/zstack/sdk/QueryOssBucketFileNameAction.java index faa583adaa7..ea4d31bfc35 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryOssBucketFileNameAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryOssBucketFileNameAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryOvnControllerAction.java b/sdk/src/main/java/org/zstack/sdk/QueryOvnControllerAction.java index 8ced685f215..5430ae9c3c7 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryOvnControllerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryOvnControllerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryOvnControllerVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryOvnControllerVmInstanceAction.java index 46e2d887fb5..048f1102231 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryOvnControllerVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryOvnControllerVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPciDeviceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPciDeviceAction.java index e6b13d787ee..5c2586b2c98 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPciDeviceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPciDeviceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPciDeviceOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPciDeviceOfferingAction.java index e4c5c31ebdb..d73a80febf9 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPciDeviceOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPciDeviceOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPciDevicePciDeviceOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPciDevicePciDeviceOfferingAction.java index e506f69c47f..ff3aef7b710 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPciDevicePciDeviceOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPciDevicePciDeviceOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPciDeviceSpecAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPciDeviceSpecAction.java index f596f03f693..99c90592f33 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPciDeviceSpecAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPciDeviceSpecAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPhysicalDriveSelfTestHistoryAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPhysicalDriveSelfTestHistoryAction.java index ddfd70e94d0..14824fb3ccf 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPhysicalDriveSelfTestHistoryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPhysicalDriveSelfTestHistoryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPhysicalSwitchAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPhysicalSwitchAction.java index 50e7691813e..5905fecf0e0 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPhysicalSwitchAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPhysicalSwitchAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPluginDriversAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPluginDriversAction.java index 6625e97f9e7..71bfa4f9315 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPluginDriversAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPluginDriversAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPolicyAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPolicyAction.java index a5b76babb15..f7dfd1a9913 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPolicyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPolicyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteRuleAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteRuleAction.java index 00454f57951..8c2dc82c271 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteRuleSetAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteRuleSetAction.java index bd89d843a7a..f7be9489192 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteRuleSetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteRuleSetAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteRuleSetL3RefAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteRuleSetL3RefAction.java index 81b81bffdf4..6440404d2ea 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteRuleSetL3RefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteRuleSetL3RefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteRuleSetVRouterRefAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteRuleSetVRouterRefAction.java index ae52d52f65b..d3f1b542282 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteRuleSetVRouterRefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteRuleSetVRouterRefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteTableAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteTableAction.java index 593f4998f83..642bc0450da 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteTableAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteTableAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteTableRouteEntryAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteTableRouteEntryAction.java index d2be0fcef05..082011bb9d8 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteTableRouteEntryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteTableRouteEntryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteTableVRouterRefAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteTableVRouterRefAction.java index ec686dd5717..cd2aecaf879 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteTableVRouterRefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPolicyRouteTableVRouterRefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPortForwardingRuleAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPortForwardingRuleAction.java index f6d48e388a2..eaafc4b09cf 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPortForwardingRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPortForwardingRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPortMirrorAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPortMirrorAction.java index 1d7ac00a308..396e131b941 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPortMirrorAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPortMirrorAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPortMirrorNetworkUsedIpAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPortMirrorNetworkUsedIpAction.java index 8ca0e91382a..f8f3e9f8e0a 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPortMirrorNetworkUsedIpAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPortMirrorNetworkUsedIpAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPortMirrorSessionAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPortMirrorSessionAction.java index 7e9108fe322..3dfe12a31ea 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPortMirrorSessionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPortMirrorSessionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPreconfigurationTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPreconfigurationTemplateAction.java index ad23e34adea..3716aa6b6e0 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPreconfigurationTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPreconfigurationTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPriceTableAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPriceTableAction.java index f08bdcad941..aeee724a3b0 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPriceTableAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPriceTableAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPrimaryStorageAction.java index bed619e86f7..3d61237d641 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPublishAppAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPublishAppAction.java index 251f5b627da..144b1a7f2b9 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryPublishAppAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryPublishAppAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryQuotaAction.java b/sdk/src/main/java/org/zstack/sdk/QueryQuotaAction.java index af8429c2045..8add2d8e244 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryQuotaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryQuotaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryResourceConfigAction.java b/sdk/src/main/java/org/zstack/sdk/QueryResourceConfigAction.java index a3d5d4278f7..3a4c4db4627 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryResourceConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryResourceConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryResourcePriceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryResourcePriceAction.java index d758d407c9a..92fab79db83 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryResourcePriceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryResourcePriceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryResourceStackAction.java b/sdk/src/main/java/org/zstack/sdk/QueryResourceStackAction.java index d946c2c7aff..ad7e48c98a9 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryResourceStackAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryResourceStackAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QuerySchedulerJobAction.java b/sdk/src/main/java/org/zstack/sdk/QuerySchedulerJobAction.java index 4d63f52f6b7..f427789808b 100644 --- a/sdk/src/main/java/org/zstack/sdk/QuerySchedulerJobAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QuerySchedulerJobAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QuerySchedulerJobGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QuerySchedulerJobGroupAction.java index 9c2cf0f9298..0b1091b0c90 100644 --- a/sdk/src/main/java/org/zstack/sdk/QuerySchedulerJobGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QuerySchedulerJobGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QuerySchedulerJobHistoryAction.java b/sdk/src/main/java/org/zstack/sdk/QuerySchedulerJobHistoryAction.java index 6ec4fa7d31b..e344c6bbf43 100644 --- a/sdk/src/main/java/org/zstack/sdk/QuerySchedulerJobHistoryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QuerySchedulerJobHistoryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QuerySchedulerTriggerAction.java b/sdk/src/main/java/org/zstack/sdk/QuerySchedulerTriggerAction.java index 6d64cd58255..0d6e18f5fa6 100644 --- a/sdk/src/main/java/org/zstack/sdk/QuerySchedulerTriggerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QuerySchedulerTriggerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryScsiLunAction.java b/sdk/src/main/java/org/zstack/sdk/QueryScsiLunAction.java index 863e705032e..258fe9149e2 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryScsiLunAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryScsiLunAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QuerySdnControllerAction.java b/sdk/src/main/java/org/zstack/sdk/QuerySdnControllerAction.java index ff44249f24c..418fa2770df 100644 --- a/sdk/src/main/java/org/zstack/sdk/QuerySdnControllerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QuerySdnControllerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QuerySecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/QuerySecretResourcePoolAction.java index bfa1a7f6bb0..ef150b328a8 100644 --- a/sdk/src/main/java/org/zstack/sdk/QuerySecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QuerySecretResourcePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QuerySecurityGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QuerySecurityGroupAction.java index 79eddd64d94..6f2f8958948 100644 --- a/sdk/src/main/java/org/zstack/sdk/QuerySecurityGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QuerySecurityGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QuerySecurityGroupRuleAction.java b/sdk/src/main/java/org/zstack/sdk/QuerySecurityGroupRuleAction.java index 2d5a3eadd41..8d913cfb9e8 100644 --- a/sdk/src/main/java/org/zstack/sdk/QuerySecurityGroupRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QuerySecurityGroupRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QuerySecurityMachineAction.java b/sdk/src/main/java/org/zstack/sdk/QuerySecurityMachineAction.java index 6589561bca8..cb3cc752ce6 100644 --- a/sdk/src/main/java/org/zstack/sdk/QuerySecurityMachineAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QuerySecurityMachineAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QuerySftpBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/QuerySftpBackupStorageAction.java index 765837315db..eb2d9343e18 100644 --- a/sdk/src/main/java/org/zstack/sdk/QuerySftpBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QuerySftpBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryShareableVolumeVmInstanceRefAction.java b/sdk/src/main/java/org/zstack/sdk/QueryShareableVolumeVmInstanceRefAction.java index 544ae7b86e0..470a52758bc 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryShareableVolumeVmInstanceRefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryShareableVolumeVmInstanceRefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QuerySharedBlockAction.java b/sdk/src/main/java/org/zstack/sdk/QuerySharedBlockAction.java index 59923bfa3c6..e52410e937e 100644 --- a/sdk/src/main/java/org/zstack/sdk/QuerySharedBlockAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QuerySharedBlockAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QuerySharedBlockGroupPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/QuerySharedBlockGroupPrimaryStorageAction.java index 30d717a39e6..5e964ed0994 100644 --- a/sdk/src/main/java/org/zstack/sdk/QuerySharedBlockGroupPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QuerySharedBlockGroupPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QuerySharedBlockGroupPrimaryStorageHostRefAction.java b/sdk/src/main/java/org/zstack/sdk/QuerySharedBlockGroupPrimaryStorageHostRefAction.java index 6fb1cdaded7..a10887bb171 100644 --- a/sdk/src/main/java/org/zstack/sdk/QuerySharedBlockGroupPrimaryStorageHostRefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QuerySharedBlockGroupPrimaryStorageHostRefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QuerySharedResourceAction.java b/sdk/src/main/java/org/zstack/sdk/QuerySharedResourceAction.java index 391c68bb223..b7fbadeb425 100644 --- a/sdk/src/main/java/org/zstack/sdk/QuerySharedResourceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QuerySharedResourceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QuerySlbGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QuerySlbGroupAction.java index 0dbaa59a07a..d53e255b381 100644 --- a/sdk/src/main/java/org/zstack/sdk/QuerySlbGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QuerySlbGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QuerySlbOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/QuerySlbOfferingAction.java index c4cf2b13b4b..81bc707f470 100644 --- a/sdk/src/main/java/org/zstack/sdk/QuerySlbOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QuerySlbOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QuerySlbVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/QuerySlbVmInstanceAction.java index a0c27689e09..496836283ad 100644 --- a/sdk/src/main/java/org/zstack/sdk/QuerySlbVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QuerySlbVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QuerySnmpAgentAction.java b/sdk/src/main/java/org/zstack/sdk/QuerySnmpAgentAction.java index b614cc63c7e..65c6721a3c1 100644 --- a/sdk/src/main/java/org/zstack/sdk/QuerySnmpAgentAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QuerySnmpAgentAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QuerySshKeyPairAction.java b/sdk/src/main/java/org/zstack/sdk/QuerySshKeyPairAction.java index 3100eb03725..6e932dc874f 100644 --- a/sdk/src/main/java/org/zstack/sdk/QuerySshKeyPairAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QuerySshKeyPairAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryStackTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/QueryStackTemplateAction.java index 61c58de37da..12974c9a499 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryStackTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryStackTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QuerySystemTagAction.java b/sdk/src/main/java/org/zstack/sdk/QuerySystemTagAction.java index 16640ae1d56..2876c684af1 100644 --- a/sdk/src/main/java/org/zstack/sdk/QuerySystemTagAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QuerySystemTagAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryTagAction.java b/sdk/src/main/java/org/zstack/sdk/QueryTagAction.java index ca9338e1897..f71b898f457 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryTagAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryTagAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryTemplateConfigAction.java b/sdk/src/main/java/org/zstack/sdk/QueryTemplateConfigAction.java index 60e385fd81e..1278eeb0a9f 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryTemplateConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryTemplateConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryTrainedModelRecordAction.java b/sdk/src/main/java/org/zstack/sdk/QueryTrainedModelRecordAction.java index 97c03cc82c5..3dae4f8cf8d 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryTrainedModelRecordAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryTrainedModelRecordAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryTwoFactorAuthenticationAction.java b/sdk/src/main/java/org/zstack/sdk/QueryTwoFactorAuthenticationAction.java index 98eca1f9acb..f575930ae8b 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryTwoFactorAuthenticationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryTwoFactorAuthenticationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryUsbDeviceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryUsbDeviceAction.java index 7fc86ee4c12..8d1bba63000 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryUsbDeviceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryUsbDeviceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryUserAction.java b/sdk/src/main/java/org/zstack/sdk/QueryUserAction.java index 01ebfdd29f6..aa53e89de12 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryUserAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryUserAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryUserGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryUserGroupAction.java index ada397ddaaa..0d080feaf21 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryUserGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryUserGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryUserProxyConfigAction.java b/sdk/src/main/java/org/zstack/sdk/QueryUserProxyConfigAction.java index e53372d80e1..af489c5ba74 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryUserProxyConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryUserProxyConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryUserTagAction.java b/sdk/src/main/java/org/zstack/sdk/QueryUserTagAction.java index 24ace733492..491f47ca169 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryUserTagAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryUserTagAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryV2VConversionHostAction.java b/sdk/src/main/java/org/zstack/sdk/QueryV2VConversionHostAction.java index 1abc8126eff..30f7cbfd134 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryV2VConversionHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryV2VConversionHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVCenterAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVCenterAction.java index 85791bee5e6..f5021f64f33 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVCenterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVCenterBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVCenterBackupStorageAction.java index 276e8fbf7b2..dffc8743704 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVCenterBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVCenterBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVCenterClusterAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVCenterClusterAction.java index bb964e316a8..a6ba181c6cc 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVCenterClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVCenterClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVCenterDatacenterAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVCenterDatacenterAction.java index 5c72ea87d6d..1001a0738c7 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVCenterDatacenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVCenterDatacenterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVCenterPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVCenterPrimaryStorageAction.java index a7c591c9522..e15c8f3afa0 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVCenterPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVCenterPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVCenterResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVCenterResourcePoolAction.java index 0973d34d1fa..d1efd0b3ba1 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVCenterResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVCenterResourcePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVRouterFlowMeterNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVRouterFlowMeterNetworkAction.java index b521b88b58e..5547aea65ba 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVRouterFlowMeterNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVRouterFlowMeterNetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVRouterOspfAreaAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVRouterOspfAreaAction.java index 7a65de157d4..38372f932ea 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVRouterOspfAreaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVRouterOspfAreaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVRouterOspfNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVRouterOspfNetworkAction.java index 2d1760f5391..09e918b254d 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVRouterOspfNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVRouterOspfNetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVRouterRouteEntryAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVRouterRouteEntryAction.java index 46918ae28ed..f2c1cd5f991 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVRouterRouteEntryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVRouterRouteEntryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVRouterRouteTableAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVRouterRouteTableAction.java index 89e412c4635..25dd6643de4 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVRouterRouteTableAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVRouterRouteTableAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVipAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVipAction.java index a05a70e2c49..3c176f77222 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVipAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVipAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVirtualBorderRouterFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVirtualBorderRouterFromLocalAction.java index 557c11bc2a7..71c623ef886 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVirtualBorderRouterFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVirtualBorderRouterFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVirtualRouterOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVirtualRouterOfferingAction.java index 45661aaac5c..0a5565f7b85 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVirtualRouterOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVirtualRouterOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVirtualRouterVRouterRouteTableRefAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVirtualRouterVRouterRouteTableRefAction.java index 3810f42a7ce..3ed804af39e 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVirtualRouterVRouterRouteTableRefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVirtualRouterVRouterRouteTableRefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVirtualRouterVmAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVirtualRouterVmAction.java index e37173c8f92..2db8ed4dd90 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVirtualRouterVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVirtualRouterVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVmCdRomAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVmCdRomAction.java index 61b96328e82..686517178af 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVmCdRomAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVmCdRomAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVmInstanceAction.java index 0fab66ce6b2..faae05612bd 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVmInstanceDeviceAddressArchiveAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVmInstanceDeviceAddressArchiveAction.java index 9a79a189c95..65466b51c4b 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVmInstanceDeviceAddressArchiveAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVmInstanceDeviceAddressArchiveAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVmInstanceDeviceAddressGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVmInstanceDeviceAddressGroupAction.java index 21a5c65e707..0c681e9e1ed 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVmInstanceDeviceAddressGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVmInstanceDeviceAddressGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVmInstanceMdevDeviceSpecRefAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVmInstanceMdevDeviceSpecRefAction.java index b2f9f77fad2..3ab928c0490 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVmInstanceMdevDeviceSpecRefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVmInstanceMdevDeviceSpecRefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVmInstancePciDeviceSpecRefAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVmInstancePciDeviceSpecRefAction.java index 2cd8d9416f8..d809fb52648 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVmInstancePciDeviceSpecRefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVmInstancePciDeviceSpecRefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVmNicAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVmNicAction.java index 858d684dd12..d33d8260248 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVmNicAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVmNicAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVmNicInSecurityGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVmNicInSecurityGroupAction.java index 00313bd91c3..f5df0b554ea 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVmNicInSecurityGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVmNicInSecurityGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVmNicSecurityPolicyAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVmNicSecurityPolicyAction.java index a277f646a85..6edc60a4995 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVmNicSecurityPolicyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVmNicSecurityPolicyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVmPriorityConfigAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVmPriorityConfigAction.java index 92265a1ece9..87f3fa3f368 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVmPriorityConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVmPriorityConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVmSchedHistoryAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVmSchedHistoryAction.java index 7e66b890a99..0f9133de739 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVmSchedHistoryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVmSchedHistoryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVmSchedulingRuleAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVmSchedulingRuleAction.java index 075b5856f3b..05aacc97ef2 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVmSchedulingRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVmSchedulingRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVmSchedulingRuleGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVmSchedulingRuleGroupAction.java index 83a9107738e..b6fbe4fde4f 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVmSchedulingRuleGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVmSchedulingRuleGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVmUserDefinedXmlHookScriptAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVmUserDefinedXmlHookScriptAction.java index 5d64dd8d25d..0bda1c59196 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVmUserDefinedXmlHookScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVmUserDefinedXmlHookScriptAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVniRangeAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVniRangeAction.java index 679e2eaf93d..dc141fdc3e2 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVniRangeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVniRangeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVolumeAction.java index 4c21f2c424b..b4939c99ed1 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVolumeSnapshotAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVolumeSnapshotAction.java index 0452e874a7a..347c7127375 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVolumeSnapshotAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVolumeSnapshotAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVolumeSnapshotGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVolumeSnapshotGroupAction.java index 5a7c0cb56cd..c71544a67ac 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVolumeSnapshotGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVolumeSnapshotGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVolumeSnapshotTreeAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVolumeSnapshotTreeAction.java index 65a06647dbc..d708dd54411 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVolumeSnapshotTreeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVolumeSnapshotTreeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVpcFirewallAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVpcFirewallAction.java index 908f732d867..cbc10d55477 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVpcFirewallAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVpcFirewallAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVpcFirewallVRouterRefAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVpcFirewallVRouterRefAction.java index 4d71deb4d0b..cee46e7fa3e 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVpcFirewallVRouterRefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVpcFirewallVRouterRefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVpcHaGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVpcHaGroupAction.java index a2f74a6b7f9..98dbaa9dd0e 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVpcHaGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVpcHaGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVpcHaGroupNetworkServiceRefAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVpcHaGroupNetworkServiceRefAction.java index cec52d3be77..b2277e31b52 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVpcHaGroupNetworkServiceRefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVpcHaGroupNetworkServiceRefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVpcIkeConfigFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVpcIkeConfigFromLocalAction.java index d9bf309bd48..d8346fa0df3 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVpcIkeConfigFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVpcIkeConfigFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVpcIpSecConfigFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVpcIpSecConfigFromLocalAction.java index d8de3965cf9..8afec25800e 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVpcIpSecConfigFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVpcIpSecConfigFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVpcRouterAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVpcRouterAction.java index 421359c5bd8..e7347d73e4e 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVpcRouterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVpcRouterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVpcSharedQosAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVpcSharedQosAction.java index 7a3c2c554b8..b9465db619e 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVpcSharedQosAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVpcSharedQosAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVpcSnatStateAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVpcSnatStateAction.java index e3a3b3e7e24..9cb5d6bb6de 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVpcSnatStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVpcSnatStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVpcUserVpnGatewayFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVpcUserVpnGatewayFromLocalAction.java index 6f265e48cc1..73343b70a42 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVpcUserVpnGatewayFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVpcUserVpnGatewayFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVpcVpnConnectionFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVpcVpnConnectionFromLocalAction.java index 5da411a5504..8f5e1c764d8 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVpcVpnConnectionFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVpcVpnConnectionFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVpcVpnGatewayFromLocalAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVpcVpnGatewayFromLocalAction.java index 79e5e7716b9..0e8a974b99c 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVpcVpnGatewayFromLocalAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVpcVpnGatewayFromLocalAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVtepAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVtepAction.java index fd39c035ba4..055fca6dc11 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryVtepAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryVtepAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryWebhookAction.java b/sdk/src/main/java/org/zstack/sdk/QueryWebhookAction.java index a3489ca5de7..06e04d915d4 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryWebhookAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryWebhookAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryXskyBlockVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/QueryXskyBlockVolumeAction.java index 8b57b56be7f..786e3dfa0a7 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryXskyBlockVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryXskyBlockVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryZBoxAction.java b/sdk/src/main/java/org/zstack/sdk/QueryZBoxAction.java index ffe296337d1..384814eef60 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryZBoxAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryZBoxAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryZBoxBackupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryZBoxBackupAction.java index ccbb624b57a..ffed902af8d 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryZBoxBackupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryZBoxBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryZdfsAction.java b/sdk/src/main/java/org/zstack/sdk/QueryZdfsAction.java index 638883de716..ae6f34bdf23 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryZdfsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryZdfsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/QueryZoneAction.java b/sdk/src/main/java/org/zstack/sdk/QueryZoneAction.java index 40d3b1b94ef..2c6ea8deef1 100644 --- a/sdk/src/main/java/org/zstack/sdk/QueryZoneAction.java +++ b/sdk/src/main/java/org/zstack/sdk/QueryZoneAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RebootBaremetalInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/RebootBaremetalInstanceAction.java index 3fb518eebcb..be6a7e9ae86 100644 --- a/sdk/src/main/java/org/zstack/sdk/RebootBaremetalInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RebootBaremetalInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RebootEcsInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/RebootEcsInstanceAction.java index 739321e6d36..d07fe8f9155 100644 --- a/sdk/src/main/java/org/zstack/sdk/RebootEcsInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RebootEcsInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RebootVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/RebootVmInstanceAction.java index 9d4e9d4193d..10cbc3be754 100644 --- a/sdk/src/main/java/org/zstack/sdk/RebootVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RebootVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ReclaimSpaceFromImageStoreAction.java b/sdk/src/main/java/org/zstack/sdk/ReclaimSpaceFromImageStoreAction.java index b8b4cccc7e9..31ce9651416 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReclaimSpaceFromImageStoreAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReclaimSpaceFromImageStoreAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectAppBuildSystemAction.java b/sdk/src/main/java/org/zstack/sdk/ReconnectAppBuildSystemAction.java index 78a8c776903..d25f2469da8 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReconnectAppBuildSystemAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectAppBuildSystemAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/ReconnectBackupStorageAction.java index fa2898a658f..b9f33d7eb09 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReconnectBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectBareMetal2GatewayAction.java b/sdk/src/main/java/org/zstack/sdk/ReconnectBareMetal2GatewayAction.java index 9768c5b1500..66a4b798eda 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReconnectBareMetal2GatewayAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectBareMetal2GatewayAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectBareMetal2InstanceAction.java b/sdk/src/main/java/org/zstack/sdk/ReconnectBareMetal2InstanceAction.java index b775ce60de8..76b5db34662 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReconnectBareMetal2InstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectBareMetal2InstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectBaremetalPxeServerAction.java b/sdk/src/main/java/org/zstack/sdk/ReconnectBaremetalPxeServerAction.java index 8fb007ff7ed..a2b02b4cea4 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReconnectBaremetalPxeServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectBaremetalPxeServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectConsoleProxyAgentAction.java b/sdk/src/main/java/org/zstack/sdk/ReconnectConsoleProxyAgentAction.java index 8ebe262bf5f..83db26b2c2a 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReconnectConsoleProxyAgentAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectConsoleProxyAgentAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectHostAction.java b/sdk/src/main/java/org/zstack/sdk/ReconnectHostAction.java index f402d3f383b..525badd60ce 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReconnectHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectIPsecConnectionAction.java b/sdk/src/main/java/org/zstack/sdk/ReconnectIPsecConnectionAction.java index 5317ee1f6e4..3e1a62c9edd 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReconnectIPsecConnectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectIPsecConnectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectImageStoreBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/ReconnectImageStoreBackupStorageAction.java index f11c7709e69..c9009758d92 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReconnectImageStoreBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectImageStoreBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectNfvInstAction.java b/sdk/src/main/java/org/zstack/sdk/ReconnectNfvInstAction.java index 47379eb43d9..60eaa8b2cb4 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReconnectNfvInstAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectNfvInstAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/ReconnectPrimaryStorageAction.java index 4d80d7deb37..417c7039384 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReconnectPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectSdnControllerAction.java b/sdk/src/main/java/org/zstack/sdk/ReconnectSdnControllerAction.java index f0e74e26df5..5b6d97f20e4 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReconnectSdnControllerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectSdnControllerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectSftpBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/ReconnectSftpBackupStorageAction.java index 03f84363bc1..70154cf09a0 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReconnectSftpBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectSftpBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectVirtualRouterAction.java b/sdk/src/main/java/org/zstack/sdk/ReconnectVirtualRouterAction.java index 24afed9af5e..dc4e6fb1856 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReconnectVirtualRouterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectVirtualRouterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectZdfsAction.java b/sdk/src/main/java/org/zstack/sdk/ReconnectZdfsAction.java index 10324cbb46a..bd8aa1e2b93 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReconnectZdfsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectZdfsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RecoverBaremetalInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/RecoverBaremetalInstanceAction.java index be621345b26..e55d4414e07 100644 --- a/sdk/src/main/java/org/zstack/sdk/RecoverBaremetalInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RecoverBaremetalInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RecoverDataVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/RecoverDataVolumeAction.java index d9e8ad77949..ab461fc73c0 100644 --- a/sdk/src/main/java/org/zstack/sdk/RecoverDataVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RecoverDataVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RecoverImageAction.java b/sdk/src/main/java/org/zstack/sdk/RecoverImageAction.java index 1dbcad79da9..de237587393 100644 --- a/sdk/src/main/java/org/zstack/sdk/RecoverImageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RecoverImageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RecoverResourceSplitBrainAction.java b/sdk/src/main/java/org/zstack/sdk/RecoverResourceSplitBrainAction.java index fb20eeef3ad..e06a82d36ee 100644 --- a/sdk/src/main/java/org/zstack/sdk/RecoverResourceSplitBrainAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RecoverResourceSplitBrainAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RecoverVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/RecoverVmInstanceAction.java index 28e4c9ac064..520dae0b7d6 100644 --- a/sdk/src/main/java/org/zstack/sdk/RecoverVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RecoverVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RecoveryImageFromImageStoreBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/RecoveryImageFromImageStoreBackupStorageAction.java index e384341947a..e89d2c37a4d 100644 --- a/sdk/src/main/java/org/zstack/sdk/RecoveryImageFromImageStoreBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RecoveryImageFromImageStoreBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RecoveryVirtualBorderRouterRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/RecoveryVirtualBorderRouterRemoteAction.java index 2462802173c..cdbfb97455d 100644 --- a/sdk/src/main/java/org/zstack/sdk/RecoveryVirtualBorderRouterRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RecoveryVirtualBorderRouterRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshCaptchaAction.java b/sdk/src/main/java/org/zstack/sdk/RefreshCaptchaAction.java index 633b8a66b47..14c22d0d083 100644 --- a/sdk/src/main/java/org/zstack/sdk/RefreshCaptchaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RefreshCaptchaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshFiberChannelStorageAction.java b/sdk/src/main/java/org/zstack/sdk/RefreshFiberChannelStorageAction.java index 9315f10a39d..aa1a0620a31 100644 --- a/sdk/src/main/java/org/zstack/sdk/RefreshFiberChannelStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RefreshFiberChannelStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshFirewallAction.java b/sdk/src/main/java/org/zstack/sdk/RefreshFirewallAction.java index ff3586736c3..d8e8021bf3a 100644 --- a/sdk/src/main/java/org/zstack/sdk/RefreshFirewallAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RefreshFirewallAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshGuestOsMetadataAction.java b/sdk/src/main/java/org/zstack/sdk/RefreshGuestOsMetadataAction.java index 7595ce18a88..dae4537495d 100644 --- a/sdk/src/main/java/org/zstack/sdk/RefreshGuestOsMetadataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RefreshGuestOsMetadataAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshIscsiServerAction.java b/sdk/src/main/java/org/zstack/sdk/RefreshIscsiServerAction.java index 47692106366..468a5931323 100644 --- a/sdk/src/main/java/org/zstack/sdk/RefreshIscsiServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RefreshIscsiServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshLoadBalancerAction.java b/sdk/src/main/java/org/zstack/sdk/RefreshLoadBalancerAction.java index 7fdccb3c3f3..7c4110c582a 100644 --- a/sdk/src/main/java/org/zstack/sdk/RefreshLoadBalancerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RefreshLoadBalancerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshLocalRaidAction.java b/sdk/src/main/java/org/zstack/sdk/RefreshLocalRaidAction.java index f63d8c9b439..1889c9be4a0 100644 --- a/sdk/src/main/java/org/zstack/sdk/RefreshLocalRaidAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RefreshLocalRaidAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshNvmeTargetAction.java b/sdk/src/main/java/org/zstack/sdk/RefreshNvmeTargetAction.java index e789f15476f..adadf98a9e5 100644 --- a/sdk/src/main/java/org/zstack/sdk/RefreshNvmeTargetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RefreshNvmeTargetAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversAction.java b/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversAction.java index c68eb5f9909..5a7c5e000c4 100644 --- a/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshSSOServerTokenAction.java b/sdk/src/main/java/org/zstack/sdk/RefreshSSOServerTokenAction.java index e9bafeb0065..1eaf5857dc1 100644 --- a/sdk/src/main/java/org/zstack/sdk/RefreshSSOServerTokenAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RefreshSSOServerTokenAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshSearchIndexesAction.java b/sdk/src/main/java/org/zstack/sdk/RefreshSearchIndexesAction.java index dcdfea4618e..ac706d802d1 100644 --- a/sdk/src/main/java/org/zstack/sdk/RefreshSearchIndexesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RefreshSearchIndexesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshSharedblockDeviceCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/RefreshSharedblockDeviceCapacityAction.java index 7df251f544e..0bbf29967cd 100644 --- a/sdk/src/main/java/org/zstack/sdk/RefreshSharedblockDeviceCapacityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RefreshSharedblockDeviceCapacityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RegisterLicenseRequestedApplicationAction.java b/sdk/src/main/java/org/zstack/sdk/RegisterLicenseRequestedApplicationAction.java index 4133773a938..1558bce40d9 100644 --- a/sdk/src/main/java/org/zstack/sdk/RegisterLicenseRequestedApplicationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RegisterLicenseRequestedApplicationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ReimageVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/ReimageVmInstanceAction.java index 37d79b83de9..2d55be71477 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReimageVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReimageVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ReloadElaborationAction.java b/sdk/src/main/java/org/zstack/sdk/ReloadElaborationAction.java index a4cb1566bdf..725d86aa421 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReloadElaborationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReloadElaborationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ReloadExternalServiceAction.java b/sdk/src/main/java/org/zstack/sdk/ReloadExternalServiceAction.java index 8fe9ac703c5..1a58e296b5a 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReloadExternalServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReloadExternalServiceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ReloadLicenseAction.java b/sdk/src/main/java/org/zstack/sdk/ReloadLicenseAction.java index 050873aae34..5fe226e0eca 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReloadLicenseAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReloadLicenseAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveAccessControlListEntryAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveAccessControlListEntryAction.java index 551b4686189..96e4dd8985b 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveAccessControlListEntryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveAccessControlListEntryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveAccessControlListFromLoadBalancerAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveAccessControlListFromLoadBalancerAction.java index 801d8a4347f..cf0b9dbde40 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveAccessControlListFromLoadBalancerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveAccessControlListFromLoadBalancerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveBackendServerFromServerGroupAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveBackendServerFromServerGroupAction.java index cf69c77463a..3d3d738d276 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveBackendServerFromServerGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveBackendServerFromServerGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveCertificateFromLoadBalancerListenerAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveCertificateFromLoadBalancerListenerAction.java index 703c61401c8..05f92c47613 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveCertificateFromLoadBalancerListenerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveCertificateFromLoadBalancerListenerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveDnsFromL3NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveDnsFromL3NetworkAction.java index 68f69c1da32..53f42a8fc95 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveDnsFromL3NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveDnsFromL3NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveDnsFromVpcRouterAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveDnsFromVpcRouterAction.java index 21279f3ca90..05e86184577 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveDnsFromVpcRouterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveDnsFromVpcRouterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveHostRouteFromL3NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveHostRouteFromL3NetworkAction.java index c3e492f5958..d4f29fc4b8b 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveHostRouteFromL3NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveHostRouteFromL3NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveMdevDeviceSpecFromVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveMdevDeviceSpecFromVmInstanceAction.java index 8a7e90fa40e..2e061e0a3fb 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveMdevDeviceSpecFromVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveMdevDeviceSpecFromVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveMonFromCephBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveMonFromCephBackupStorageAction.java index af98941181c..1883c3ec0e2 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveMonFromCephBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveMonFromCephBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveMonFromCephPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveMonFromCephPrimaryStorageAction.java index 8231fc0256e..83eda5d2c13 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveMonFromCephPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveMonFromCephPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemovePciDeviceSpecFromVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/RemovePciDeviceSpecFromVmInstanceAction.java index c32c31165fb..02cac6e66a1 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemovePciDeviceSpecFromVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemovePciDeviceSpecFromVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveRemoteCidrsFromIPsecConnectionAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveRemoteCidrsFromIPsecConnectionAction.java index 0bf0e599599..75c833b875d 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveRemoteCidrsFromIPsecConnectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveRemoteCidrsFromIPsecConnectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveRendezvousPointFromMulticastRouterAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveRendezvousPointFromMulticastRouterAction.java index 43afc9e3390..8fb21d3d4c8 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveRendezvousPointFromMulticastRouterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveRendezvousPointFromMulticastRouterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveResourcesFromDirectoryAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveResourcesFromDirectoryAction.java index 19dec1d121e..9729fe233a2 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveResourcesFromDirectoryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveResourcesFromDirectoryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveSchedulerJobFromSchedulerTriggerAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveSchedulerJobFromSchedulerTriggerAction.java index 41126b554af..5faf02eae7b 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveSchedulerJobFromSchedulerTriggerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveSchedulerJobFromSchedulerTriggerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveSchedulerJobGroupFromSchedulerTriggerAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveSchedulerJobGroupFromSchedulerTriggerAction.java index 679427ff3a7..166d10b0012 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveSchedulerJobGroupFromSchedulerTriggerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveSchedulerJobGroupFromSchedulerTriggerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveSchedulerJobsFromSchedulerJobGroupAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveSchedulerJobsFromSchedulerJobGroupAction.java index 1b82f11cd42..8b4d7eafabe 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveSchedulerJobsFromSchedulerJobGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveSchedulerJobsFromSchedulerJobGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveSdnControllerAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveSdnControllerAction.java index cbb42565705..703bc39cb2b 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveSdnControllerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveSdnControllerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveServerGroupFromLoadBalancerListenerAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveServerGroupFromLoadBalancerListenerAction.java index 807f119cd82..18cbf67736e 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveServerGroupFromLoadBalancerListenerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveServerGroupFromLoadBalancerListenerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveUserFromGroupAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveUserFromGroupAction.java index 95dad21a337..1ce78bddca5 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveUserFromGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveUserFromGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveVRouterNetworksFromFlowMeterAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveVRouterNetworksFromFlowMeterAction.java index 8093f92a83a..0d795563e55 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveVRouterNetworksFromFlowMeterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveVRouterNetworksFromFlowMeterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveVRouterNetworksFromOspfAreaAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveVRouterNetworksFromOspfAreaAction.java index a5f2321e1e3..c78cc33c484 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveVRouterNetworksFromOspfAreaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveVRouterNetworksFromOspfAreaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveVmFromAffinityGroupAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveVmFromAffinityGroupAction.java index 29ba972b255..856bc2815b5 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveVmFromAffinityGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveVmFromAffinityGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveVmNicFromLoadBalancerAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveVmNicFromLoadBalancerAction.java index f15ea6af112..65483c9e344 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveVmNicFromLoadBalancerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveVmNicFromLoadBalancerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveVmSchedulingRuleAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveVmSchedulingRuleAction.java index b0afbad90f1..a49a90820a3 100644 --- a/sdk/src/main/java/org/zstack/sdk/RemoveVmSchedulingRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RemoveVmSchedulingRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RenewSessionAction.java b/sdk/src/main/java/org/zstack/sdk/RenewSessionAction.java index 03609e40627..757b46d1dd4 100644 --- a/sdk/src/main/java/org/zstack/sdk/RenewSessionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RenewSessionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RequestConsoleAccessAction.java b/sdk/src/main/java/org/zstack/sdk/RequestConsoleAccessAction.java index 9624aaf8c45..4f1a16455be 100644 --- a/sdk/src/main/java/org/zstack/sdk/RequestConsoleAccessAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RequestConsoleAccessAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RerunLongJobAction.java b/sdk/src/main/java/org/zstack/sdk/RerunLongJobAction.java index d49d926779c..60ab207923c 100644 --- a/sdk/src/main/java/org/zstack/sdk/RerunLongJobAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RerunLongJobAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ResetGlobalConfigAction.java b/sdk/src/main/java/org/zstack/sdk/ResetGlobalConfigAction.java index 6132abfb30b..7ab7357a7a1 100644 --- a/sdk/src/main/java/org/zstack/sdk/ResetGlobalConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ResetGlobalConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ResetTemplateConfigAction.java b/sdk/src/main/java/org/zstack/sdk/ResetTemplateConfigAction.java index 0ea7f884b44..98be58f1ac7 100644 --- a/sdk/src/main/java/org/zstack/sdk/ResetTemplateConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ResetTemplateConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ResetTwoFactorAuthenticationSecretAction.java b/sdk/src/main/java/org/zstack/sdk/ResetTwoFactorAuthenticationSecretAction.java index f3633f18b77..42af4e43f3a 100644 --- a/sdk/src/main/java/org/zstack/sdk/ResetTwoFactorAuthenticationSecretAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ResetTwoFactorAuthenticationSecretAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ResizeDataVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/ResizeDataVolumeAction.java index c2abfc57896..106739ff669 100644 --- a/sdk/src/main/java/org/zstack/sdk/ResizeDataVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ResizeDataVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ResizeRootVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/ResizeRootVolumeAction.java index 3205d9ef435..1404557d666 100644 --- a/sdk/src/main/java/org/zstack/sdk/ResizeRootVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ResizeRootVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RestartModelServiceGroupsAction.java b/sdk/src/main/java/org/zstack/sdk/RestartModelServiceGroupsAction.java index 44c882a6a5f..a751d3c1be4 100644 --- a/sdk/src/main/java/org/zstack/sdk/RestartModelServiceGroupsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RestartModelServiceGroupsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RestartResourceStackAction.java b/sdk/src/main/java/org/zstack/sdk/RestartResourceStackAction.java index 17eb1924db0..82a79e04c74 100644 --- a/sdk/src/main/java/org/zstack/sdk/RestartResourceStackAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RestartResourceStackAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ResumeLongJobAction.java b/sdk/src/main/java/org/zstack/sdk/ResumeLongJobAction.java index 8fb624155ac..ac590d42b8c 100644 --- a/sdk/src/main/java/org/zstack/sdk/ResumeLongJobAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ResumeLongJobAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ResumeVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/ResumeVmInstanceAction.java index 3bb9e1b5c42..e5caf488851 100644 --- a/sdk/src/main/java/org/zstack/sdk/ResumeVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ResumeVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RevertTemplateConfigAction.java b/sdk/src/main/java/org/zstack/sdk/RevertTemplateConfigAction.java index 6b5cbd4a1c2..f7fd7d43124 100644 --- a/sdk/src/main/java/org/zstack/sdk/RevertTemplateConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RevertTemplateConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RevertVmFromCdpBackupAction.java b/sdk/src/main/java/org/zstack/sdk/RevertVmFromCdpBackupAction.java index 178340c84c1..081876f73d2 100644 --- a/sdk/src/main/java/org/zstack/sdk/RevertVmFromCdpBackupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RevertVmFromCdpBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RevertVmFromSnapshotGroupAction.java b/sdk/src/main/java/org/zstack/sdk/RevertVmFromSnapshotGroupAction.java index e13117261d5..7cd773de3ef 100644 --- a/sdk/src/main/java/org/zstack/sdk/RevertVmFromSnapshotGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RevertVmFromSnapshotGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RevertVolumeFromSnapshotAction.java b/sdk/src/main/java/org/zstack/sdk/RevertVolumeFromSnapshotAction.java index c3f4b89f78f..0f5acbfa18e 100644 --- a/sdk/src/main/java/org/zstack/sdk/RevertVolumeFromSnapshotAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RevertVolumeFromSnapshotAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RevokeResourceSharingAction.java b/sdk/src/main/java/org/zstack/sdk/RevokeResourceSharingAction.java index 1c050a1c05f..445d7f94e00 100644 --- a/sdk/src/main/java/org/zstack/sdk/RevokeResourceSharingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RevokeResourceSharingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RunIAM2ScriptAction.java b/sdk/src/main/java/org/zstack/sdk/RunIAM2ScriptAction.java index 546c8b74a26..305d81f38b6 100644 --- a/sdk/src/main/java/org/zstack/sdk/RunIAM2ScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RunIAM2ScriptAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/RunSchedulerTriggerAction.java b/sdk/src/main/java/org/zstack/sdk/RunSchedulerTriggerAction.java index 7e56682d633..5d0e5119fe6 100644 --- a/sdk/src/main/java/org/zstack/sdk/RunSchedulerTriggerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RunSchedulerTriggerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerAddHostAction.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerAddHostAction.java index f38a2a2e586..ed476b5e380 100644 --- a/sdk/src/main/java/org/zstack/sdk/SdnControllerAddHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerAddHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerChangeHostAction.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerChangeHostAction.java index 2a79c889b76..575cd3df108 100644 --- a/sdk/src/main/java/org/zstack/sdk/SdnControllerChangeHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerChangeHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerRemoveHostAction.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerRemoveHostAction.java index 44fb47d5a2e..7ec42b863e2 100644 --- a/sdk/src/main/java/org/zstack/sdk/SdnControllerRemoveHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerRemoveHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SecurityMachineDetectSyncAction.java b/sdk/src/main/java/org/zstack/sdk/SecurityMachineDetectSyncAction.java index 625b22b4cc7..936df6cd485 100644 --- a/sdk/src/main/java/org/zstack/sdk/SecurityMachineDetectSyncAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SecurityMachineDetectSyncAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SecurityMachineEncryptAction.java b/sdk/src/main/java/org/zstack/sdk/SecurityMachineEncryptAction.java index 824c4660aaa..e7f18cd7e36 100644 --- a/sdk/src/main/java/org/zstack/sdk/SecurityMachineEncryptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SecurityMachineEncryptAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SelfTestLocalRaidAction.java b/sdk/src/main/java/org/zstack/sdk/SelfTestLocalRaidAction.java index ad508d6c345..931c8a4a14f 100644 --- a/sdk/src/main/java/org/zstack/sdk/SelfTestLocalRaidAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SelfTestLocalRaidAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetFlowMeterRouterIdAction.java b/sdk/src/main/java/org/zstack/sdk/SetFlowMeterRouterIdAction.java index 4f8a3e39dec..092fbff7b7a 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetFlowMeterRouterIdAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetFlowMeterRouterIdAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetImageBootModeAction.java b/sdk/src/main/java/org/zstack/sdk/SetImageBootModeAction.java index 4f0c8aaf5dd..51bba8517c1 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetImageBootModeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetImageBootModeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetImageQgaAction.java b/sdk/src/main/java/org/zstack/sdk/SetImageQgaAction.java index db7e732c4c2..4ea81f4d2aa 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetImageQgaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetImageQgaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetImageSecurityLevelAction.java b/sdk/src/main/java/org/zstack/sdk/SetImageSecurityLevelAction.java index 51a4139f595..293dac5939f 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetImageSecurityLevelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetImageSecurityLevelAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetImageStoreBackupStorageQuotaAction.java b/sdk/src/main/java/org/zstack/sdk/SetImageStoreBackupStorageQuotaAction.java index b3d15b586b5..ce058f34ee1 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetImageStoreBackupStorageQuotaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetImageStoreBackupStorageQuotaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetIpOnHostNetworkBondingAction.java b/sdk/src/main/java/org/zstack/sdk/SetIpOnHostNetworkBondingAction.java index ea395bdbd93..65468df298c 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetIpOnHostNetworkBondingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetIpOnHostNetworkBondingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetIpOnHostNetworkInterfaceAction.java b/sdk/src/main/java/org/zstack/sdk/SetIpOnHostNetworkInterfaceAction.java index 527b154e51e..87fa11c3400 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetIpOnHostNetworkInterfaceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetIpOnHostNetworkInterfaceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetL3NetworkMtuAction.java b/sdk/src/main/java/org/zstack/sdk/SetL3NetworkMtuAction.java index da1a08add14..4e6d73642c2 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetL3NetworkMtuAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetL3NetworkMtuAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetL3NetworkRouterInterfaceIpAction.java b/sdk/src/main/java/org/zstack/sdk/SetL3NetworkRouterInterfaceIpAction.java index e79e95ed56c..4c7702f2ece 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetL3NetworkRouterInterfaceIpAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetL3NetworkRouterInterfaceIpAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetNicQosAction.java b/sdk/src/main/java/org/zstack/sdk/SetNicQosAction.java index bf839d354f1..fb2b59d0faf 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetNicQosAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetNicQosAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetSecurityMachineKeyAction.java b/sdk/src/main/java/org/zstack/sdk/SetSecurityMachineKeyAction.java index bb9ccc2b022..b88d6174c30 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetSecurityMachineKeyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetSecurityMachineKeyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkBondingAction.java b/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkBondingAction.java index 10006e8719d..767d0495aa6 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkBondingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkBondingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkInterfaceAction.java b/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkInterfaceAction.java index 1866d621f36..bc70d543b81 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkInterfaceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkInterfaceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVRouterRouterIdAction.java b/sdk/src/main/java/org/zstack/sdk/SetVRouterRouterIdAction.java index 4e691491a49..ad158c9477e 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVRouterRouterIdAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVRouterRouterIdAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVipQosAction.java b/sdk/src/main/java/org/zstack/sdk/SetVipQosAction.java index 52e08a9916e..f583c88d589 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVipQosAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVipQosAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmBootModeAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmBootModeAction.java index 3ecd4a276fd..1d5616c3882 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmBootModeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmBootModeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmBootOrderAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmBootOrderAction.java index a855a4c6c83..50531779ce0 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmBootOrderAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmBootOrderAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmBootVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmBootVolumeAction.java index e6250d7a8cd..5d4e8d3c665 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmBootVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmBootVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmCleanTrafficAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmCleanTrafficAction.java index d7624ee740c..4895c80af48 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmCleanTrafficAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmCleanTrafficAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmClockTrackAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmClockTrackAction.java index bac93caa899..2f1a7664b0c 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmClockTrackAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmClockTrackAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmConsoleModeAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmConsoleModeAction.java index 34a56d3766d..c0231effc55 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmConsoleModeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmConsoleModeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmConsolePasswordAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmConsolePasswordAction.java index deacd2aef47..a707a0e1723 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmConsolePasswordAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmConsolePasswordAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmEmulatorPinningAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmEmulatorPinningAction.java index 36f69aafea8..8d47fd0adcc 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmEmulatorPinningAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmEmulatorPinningAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmHostnameAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmHostnameAction.java index 1106dc15516..77402fb8182 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmHostnameAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmHostnameAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmInstanceDefaultCdRomAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmInstanceDefaultCdRomAction.java index 60c15515c1c..f8fa0225833 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmInstanceDefaultCdRomAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmInstanceDefaultCdRomAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmInstanceHaLevelAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmInstanceHaLevelAction.java index 47a0356765d..6f1422277b6 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmInstanceHaLevelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmInstanceHaLevelAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmInstanceHygonMdevAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmInstanceHygonMdevAction.java index 2e28156ae6d..9d6af35a282 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmInstanceHygonMdevAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmInstanceHygonMdevAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmMonitorNumberAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmMonitorNumberAction.java index f3ffccde4b8..bb73809e315 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmMonitorNumberAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmMonitorNumberAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmNicSecurityGroupAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmNicSecurityGroupAction.java index c3e061ae43b..9dcc46a310d 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmNicSecurityGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmNicSecurityGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmNumaAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmNumaAction.java index 09452993df0..7e6f7dd8b4b 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmNumaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmNumaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmQgaAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmQgaAction.java index b6d171a35fc..bfdb610b6d1 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmQgaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmQgaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmQxlMemoryAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmQxlMemoryAction.java index da517920d2e..54ed57b85b0 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmQxlMemoryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmQxlMemoryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmRDPAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmRDPAction.java index 3c6a62566d1..f84d3e311a2 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmRDPAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmRDPAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmSecurityLevelAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmSecurityLevelAction.java index 5aca28fbc67..f87cbd5e1ca 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmSecurityLevelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmSecurityLevelAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmSoundTypeAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmSoundTypeAction.java index ff973a5ffd0..a6afceed2f6 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmSoundTypeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmSoundTypeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmSshKeyAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmSshKeyAction.java index d51be4d685d..0a7237217bb 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmSshKeyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmSshKeyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmStaticIpAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmStaticIpAction.java index 7094c2d6b17..8240899d354 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmStaticIpAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmStaticIpAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmUsbRedirectAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmUsbRedirectAction.java index 3896e243b79..dc053f44fde 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmUsbRedirectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmUsbRedirectAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmUserDefinedXmlAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmUserDefinedXmlAction.java index f99a50fc1bf..4a5e2990927 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmUserDefinedXmlAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmUserDefinedXmlAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVmUserDefinedXmlHookScriptAction.java b/sdk/src/main/java/org/zstack/sdk/SetVmUserDefinedXmlHookScriptAction.java index a637b22386a..16a90999334 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVmUserDefinedXmlHookScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVmUserDefinedXmlHookScriptAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVolumeIoThreadPinAction.java b/sdk/src/main/java/org/zstack/sdk/SetVolumeIoThreadPinAction.java index 5bdbab32e02..cfca62848f7 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVolumeIoThreadPinAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVolumeIoThreadPinAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVolumeQosAction.java b/sdk/src/main/java/org/zstack/sdk/SetVolumeQosAction.java index 4d97d409903..c38f51ee1a3 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVolumeQosAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVolumeQosAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVpcVRouterDistributedRoutingEnabledAction.java b/sdk/src/main/java/org/zstack/sdk/SetVpcVRouterDistributedRoutingEnabledAction.java index a7cd3f7afae..ad0d11ac552 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVpcVRouterDistributedRoutingEnabledAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVpcVRouterDistributedRoutingEnabledAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SetVpcVRouterNetworkServiceStateAction.java b/sdk/src/main/java/org/zstack/sdk/SetVpcVRouterNetworkServiceStateAction.java index 0993b4f03e0..936fa09483a 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetVpcVRouterNetworkServiceStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetVpcVRouterNetworkServiceStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ShareResourceAction.java b/sdk/src/main/java/org/zstack/sdk/ShareResourceAction.java index 72ce5137e75..bf82b680978 100644 --- a/sdk/src/main/java/org/zstack/sdk/ShareResourceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ShareResourceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ShrinkVolumeSnapshotAction.java b/sdk/src/main/java/org/zstack/sdk/ShrinkVolumeSnapshotAction.java index 6dd7fcb967c..a1ca84bc3a6 100644 --- a/sdk/src/main/java/org/zstack/sdk/ShrinkVolumeSnapshotAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ShrinkVolumeSnapshotAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ShutdownHostAction.java b/sdk/src/main/java/org/zstack/sdk/ShutdownHostAction.java index 49726abbe2f..8fb35d00ccf 100644 --- a/sdk/src/main/java/org/zstack/sdk/ShutdownHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ShutdownHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SsoClientPushDataAction.java b/sdk/src/main/java/org/zstack/sdk/SsoClientPushDataAction.java index 5ca300579e1..af81f4d1cf1 100644 --- a/sdk/src/main/java/org/zstack/sdk/SsoClientPushDataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SsoClientPushDataAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/StartBareMetal2InstanceAction.java b/sdk/src/main/java/org/zstack/sdk/StartBareMetal2InstanceAction.java index a7971ac8ef4..4563ac62512 100644 --- a/sdk/src/main/java/org/zstack/sdk/StartBareMetal2InstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/StartBareMetal2InstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/StartBaremetalInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/StartBaremetalInstanceAction.java index 228a32bf2b0..1102990f5fa 100644 --- a/sdk/src/main/java/org/zstack/sdk/StartBaremetalInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/StartBaremetalInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/StartBaremetalPxeServerAction.java b/sdk/src/main/java/org/zstack/sdk/StartBaremetalPxeServerAction.java index 2f797a90dfa..cb856f67f34 100644 --- a/sdk/src/main/java/org/zstack/sdk/StartBaremetalPxeServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/StartBaremetalPxeServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/StartConnectionBetweenAliyunRouterInterfaceAction.java b/sdk/src/main/java/org/zstack/sdk/StartConnectionBetweenAliyunRouterInterfaceAction.java index a62cf14a219..2cdc9d5b608 100644 --- a/sdk/src/main/java/org/zstack/sdk/StartConnectionBetweenAliyunRouterInterfaceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/StartConnectionBetweenAliyunRouterInterfaceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/StartDataProtectionAction.java b/sdk/src/main/java/org/zstack/sdk/StartDataProtectionAction.java index 71934345d9e..b5da05d2702 100644 --- a/sdk/src/main/java/org/zstack/sdk/StartDataProtectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/StartDataProtectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/StartEcsInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/StartEcsInstanceAction.java index 16d7613d2c1..5b26cb0ee8c 100644 --- a/sdk/src/main/java/org/zstack/sdk/StartEcsInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/StartEcsInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/StartSnmpAgentAction.java b/sdk/src/main/java/org/zstack/sdk/StartSnmpAgentAction.java index de5c2d54373..5189357474a 100644 --- a/sdk/src/main/java/org/zstack/sdk/StartSnmpAgentAction.java +++ b/sdk/src/main/java/org/zstack/sdk/StartSnmpAgentAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/StartVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/StartVmInstanceAction.java index f95d7834a44..97d4c8eaa1b 100644 --- a/sdk/src/main/java/org/zstack/sdk/StartVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/StartVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/StopBaremetalInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/StopBaremetalInstanceAction.java index b99b6a063b4..bbed937abea 100644 --- a/sdk/src/main/java/org/zstack/sdk/StopBaremetalInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/StopBaremetalInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/StopBaremetalPxeServerAction.java b/sdk/src/main/java/org/zstack/sdk/StopBaremetalPxeServerAction.java index 73bafd96138..5209ea42203 100644 --- a/sdk/src/main/java/org/zstack/sdk/StopBaremetalPxeServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/StopBaremetalPxeServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/StopEcsInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/StopEcsInstanceAction.java index bbb81a4b237..0f70172a916 100644 --- a/sdk/src/main/java/org/zstack/sdk/StopEcsInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/StopEcsInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/StopSnmpAgentAction.java b/sdk/src/main/java/org/zstack/sdk/StopSnmpAgentAction.java index 5134b40d1d7..e8badcb3697 100644 --- a/sdk/src/main/java/org/zstack/sdk/StopSnmpAgentAction.java +++ b/sdk/src/main/java/org/zstack/sdk/StopSnmpAgentAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/StopVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/StopVmInstanceAction.java index 6f925f9f185..4728fc308d4 100644 --- a/sdk/src/main/java/org/zstack/sdk/StopVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/StopVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SubmitLongJobAction.java b/sdk/src/main/java/org/zstack/sdk/SubmitLongJobAction.java index 562ae8d3d96..8325352e80b 100644 --- a/sdk/src/main/java/org/zstack/sdk/SubmitLongJobAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SubmitLongJobAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java b/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java index d14229a47a5..b787cea4c03 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncAliyunRouteEntryFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/SyncAliyunRouteEntryFromRemoteAction.java index 97a616e3b61..22bf0f94276 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncAliyunRouteEntryFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncAliyunRouteEntryFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncAliyunRouterInterfaceFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/SyncAliyunRouterInterfaceFromRemoteAction.java index bee59ee2051..044b127cc6d 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncAliyunRouterInterfaceFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncAliyunRouterInterfaceFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncAliyunSnapshotRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/SyncAliyunSnapshotRemoteAction.java index 3e63bb06c84..ce3fd77cf61 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncAliyunSnapshotRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncAliyunSnapshotRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncAliyunVirtualRouterFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/SyncAliyunVirtualRouterFromRemoteAction.java index 81017d66bfe..ac1c85fec3a 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncAliyunVirtualRouterFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncAliyunVirtualRouterFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncChronyServersAction.java b/sdk/src/main/java/org/zstack/sdk/SyncChronyServersAction.java index da35b7134f0..59be1e6a121 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncChronyServersAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncChronyServersAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncConnectionAccessPointFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/SyncConnectionAccessPointFromRemoteAction.java index 51cda9dd0bb..8501d1e41bb 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncConnectionAccessPointFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncConnectionAccessPointFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointAction.java index abb9dace419..1d47e08552a 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncDataCenterFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/SyncDataCenterFromRemoteAction.java index 9e9d96d54c0..5fa1ab809f1 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncDataCenterFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncDataCenterFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncDiskFromAliyunFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/SyncDiskFromAliyunFromRemoteAction.java index a3dc85af757..0ced76f2591 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncDiskFromAliyunFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncDiskFromAliyunFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncEcsImageFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/SyncEcsImageFromRemoteAction.java index 3b026eb7806..b9d5a2a7496 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncEcsImageFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncEcsImageFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncEcsInstanceFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/SyncEcsInstanceFromRemoteAction.java index dc71b868780..7677ba7e28d 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncEcsInstanceFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncEcsInstanceFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncEcsSecurityGroupFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/SyncEcsSecurityGroupFromRemoteAction.java index 06ef4a2d054..1d54efa1bb2 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncEcsSecurityGroupFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncEcsSecurityGroupFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncEcsSecurityGroupRuleFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/SyncEcsSecurityGroupRuleFromRemoteAction.java index c1f890ff5a0..d16a4ae95b7 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncEcsSecurityGroupRuleFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncEcsSecurityGroupRuleFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncEcsVSwitchFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/SyncEcsVSwitchFromRemoteAction.java index 25f9c5bbf8b..fc1bb884ad8 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncEcsVSwitchFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncEcsVSwitchFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncEcsVpcFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/SyncEcsVpcFromRemoteAction.java index e84e7fab09f..df75fbe90aa 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncEcsVpcFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncEcsVpcFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncHybridEipFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/SyncHybridEipFromRemoteAction.java index 54ed7ec23ee..1a0ad057444 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncHybridEipFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncHybridEipFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncIdentityFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/SyncIdentityFromRemoteAction.java index aeabcbef436..9596e28eec7 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncIdentityFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncIdentityFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncImageAction.java b/sdk/src/main/java/org/zstack/sdk/SyncImageAction.java index 22da44f7824..4e58bf8e62f 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncImageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncImageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncImageFromImageStoreBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/SyncImageFromImageStoreBackupStorageAction.java index f9038a7860e..b89db2e1b93 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncImageFromImageStoreBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncImageFromImageStoreBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncImageSizeAction.java b/sdk/src/main/java/org/zstack/sdk/SyncImageSizeAction.java index 9b7795571c6..7cb7df87275 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncImageSizeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncImageSizeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncLdapServerAction.java b/sdk/src/main/java/org/zstack/sdk/SyncLdapServerAction.java index e8fb4fddf75..73c95828cf4 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncLdapServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncLdapServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncNfvInstGroupAction.java b/sdk/src/main/java/org/zstack/sdk/SyncNfvInstGroupAction.java index 0b6504ba3a8..5ceac19dbcd 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncNfvInstGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncNfvInstGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncPrimaryStorageCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/SyncPrimaryStorageCapacityAction.java index 55c3006fb29..144c6dda146 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncPrimaryStorageCapacityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncPrimaryStorageCapacityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncVCenterAction.java b/sdk/src/main/java/org/zstack/sdk/SyncVCenterAction.java index cf077c72cc9..31cbd74c773 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncVCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncVCenterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncVirtualBorderRouterFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/SyncVirtualBorderRouterFromRemoteAction.java index 8ed39fbb325..094f07072c5 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncVirtualBorderRouterFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncVirtualBorderRouterFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncVmClockAction.java b/sdk/src/main/java/org/zstack/sdk/SyncVmClockAction.java index e33768cc095..94e5728f157 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncVmClockAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncVmClockAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncVolumeSizeAction.java b/sdk/src/main/java/org/zstack/sdk/SyncVolumeSizeAction.java index b4f8e80e444..6b416a47f79 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncVolumeSizeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncVolumeSizeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncVpcUserVpnGatewayFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/SyncVpcUserVpnGatewayFromRemoteAction.java index 6e54ad4a954..8ee7022c1af 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncVpcUserVpnGatewayFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncVpcUserVpnGatewayFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncVpcVpnConnectionFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/SyncVpcVpnConnectionFromRemoteAction.java index 3dd08637af4..6270f807132 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncVpcVpnConnectionFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncVpcVpnConnectionFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncVpcVpnGatewayFromRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/SyncVpcVpnGatewayFromRemoteAction.java index 9e6f274771f..360bba4d93f 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncVpcVpnGatewayFromRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncVpcVpnGatewayFromRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/SyncZBoxCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/SyncZBoxCapacityAction.java index ff830296157..a7b07fd2ed4 100644 --- a/sdk/src/main/java/org/zstack/sdk/SyncZBoxCapacityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SyncZBoxCapacityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/TakeVmConsoleScreenshotAction.java b/sdk/src/main/java/org/zstack/sdk/TakeVmConsoleScreenshotAction.java index 71875d61db3..2b0ab325d56 100644 --- a/sdk/src/main/java/org/zstack/sdk/TakeVmConsoleScreenshotAction.java +++ b/sdk/src/main/java/org/zstack/sdk/TakeVmConsoleScreenshotAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/TerminateVirtualBorderRouterRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/TerminateVirtualBorderRouterRemoteAction.java index 71629387f60..55d8aeda0ff 100644 --- a/sdk/src/main/java/org/zstack/sdk/TerminateVirtualBorderRouterRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/TerminateVirtualBorderRouterRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/TokenIntrospectionAction.java b/sdk/src/main/java/org/zstack/sdk/TokenIntrospectionAction.java index 58c54e47f11..ab794320d15 100644 --- a/sdk/src/main/java/org/zstack/sdk/TokenIntrospectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/TokenIntrospectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/TriggerGCJobAction.java b/sdk/src/main/java/org/zstack/sdk/TriggerGCJobAction.java index 8aeb52308f2..3cfbdf0ee88 100644 --- a/sdk/src/main/java/org/zstack/sdk/TriggerGCJobAction.java +++ b/sdk/src/main/java/org/zstack/sdk/TriggerGCJobAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UnbindModelFromServiceAction.java b/sdk/src/main/java/org/zstack/sdk/UnbindModelFromServiceAction.java index 45c136ae210..5fcbca49168 100644 --- a/sdk/src/main/java/org/zstack/sdk/UnbindModelFromServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UnbindModelFromServiceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UndoSnapshotCreationAction.java b/sdk/src/main/java/org/zstack/sdk/UndoSnapshotCreationAction.java index 4ec35eeddf2..69f25ba8839 100644 --- a/sdk/src/main/java/org/zstack/sdk/UndoSnapshotCreationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UndoSnapshotCreationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UnexportNbdVolumesAction.java b/sdk/src/main/java/org/zstack/sdk/UnexportNbdVolumesAction.java index d73e1c0dbc9..04fa68c7444 100644 --- a/sdk/src/main/java/org/zstack/sdk/UnexportNbdVolumesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UnexportNbdVolumesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UngenerateHygonMdevDevicesAction.java b/sdk/src/main/java/org/zstack/sdk/UngenerateHygonMdevDevicesAction.java index bb355602a10..8213789563d 100644 --- a/sdk/src/main/java/org/zstack/sdk/UngenerateHygonMdevDevicesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UngenerateHygonMdevDevicesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UngenerateMdevDevicesAction.java b/sdk/src/main/java/org/zstack/sdk/UngenerateMdevDevicesAction.java index 9776a4d38ae..da82b76d932 100644 --- a/sdk/src/main/java/org/zstack/sdk/UngenerateMdevDevicesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UngenerateMdevDevicesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UngenerateSeMdevDevicesAction.java b/sdk/src/main/java/org/zstack/sdk/UngenerateSeMdevDevicesAction.java index c29e16ae099..dfdaaf10735 100644 --- a/sdk/src/main/java/org/zstack/sdk/UngenerateSeMdevDevicesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UngenerateSeMdevDevicesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UngenerateSriovPciDevicesAction.java b/sdk/src/main/java/org/zstack/sdk/UngenerateSriovPciDevicesAction.java index 91534e89af5..82f33ff7ee5 100644 --- a/sdk/src/main/java/org/zstack/sdk/UngenerateSriovPciDevicesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UngenerateSriovPciDevicesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UngroupVolumeSnapshotGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UngroupVolumeSnapshotGroupAction.java index 9392d75caa9..002c1e1e1c1 100644 --- a/sdk/src/main/java/org/zstack/sdk/UngroupVolumeSnapshotGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UngroupVolumeSnapshotGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UnlockIdentityAction.java b/sdk/src/main/java/org/zstack/sdk/UnlockIdentityAction.java index 88d627d18d0..364e53222d4 100644 --- a/sdk/src/main/java/org/zstack/sdk/UnlockIdentityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UnlockIdentityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UnmountVmInstanceRecoveryPointAction.java b/sdk/src/main/java/org/zstack/sdk/UnmountVmInstanceRecoveryPointAction.java index c7fa890e408..3db34735ab5 100644 --- a/sdk/src/main/java/org/zstack/sdk/UnmountVmInstanceRecoveryPointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UnmountVmInstanceRecoveryPointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UnprotectVmInstanceRecoveryPointAction.java b/sdk/src/main/java/org/zstack/sdk/UnprotectVmInstanceRecoveryPointAction.java index cd1f6f2f9f6..5da95a3e314 100644 --- a/sdk/src/main/java/org/zstack/sdk/UnprotectVmInstanceRecoveryPointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UnprotectVmInstanceRecoveryPointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAccessControlListAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAccessControlListAction.java index 3c930a245ac..fedb4c7a7f1 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAccessControlListAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAccessControlListAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAccessControlRuleAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAccessControlRuleAction.java index 6a003466e9c..f404a48e285 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAccessControlRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAccessControlRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAccountAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAccountAction.java index 3d593e20b84..76a2fc54fde 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAccountAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAffinityGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAffinityGroupAction.java index b49c6d0b4c6..24ed7f4f400 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAffinityGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAffinityGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunDiskAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunDiskAction.java index a216f96a846..ccb114d2136 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunDiskAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunDiskAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunEbsBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunEbsBackupStorageAction.java index 796d5136881..1f87ea4ceb7 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunEbsBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunEbsBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunEbsPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunEbsPrimaryStorageAction.java index 04d119ec8b6..c6daa0f182f 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunEbsPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunEbsPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunKeySecretAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunKeySecretAction.java index 1761d7a02b7..ae6e0ffeb6a 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunKeySecretAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunKeySecretAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunMountTargetAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunMountTargetAction.java index 24e119e1c72..747b01cc3bc 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunMountTargetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunMountTargetAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunNasAccessGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunNasAccessGroupAction.java index 77245dd77d7..92fdf314284 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunNasAccessGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunNasAccessGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunPanguPartitionAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunPanguPartitionAction.java index 8d3345cd647..0dd5c350447 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunPanguPartitionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunPanguPartitionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunProxyVSwitchAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunProxyVSwitchAction.java index 4f1714faaa2..7e5a50f06c0 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunProxyVSwitchAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunProxyVSwitchAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunProxyVpcAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunProxyVpcAction.java index a4b94ef2ad2..75f9df9af9b 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunProxyVpcAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunProxyVpcAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunRouteInterfaceRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunRouteInterfaceRemoteAction.java index 830951aec61..74bcfad1d88 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunRouteInterfaceRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunRouteInterfaceRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunSnapshotAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunSnapshotAction.java index 1a5354ae231..30215339f68 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunSnapshotAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunSnapshotAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunVirtualRouterAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunVirtualRouterAction.java index 6d721a97ea2..74aa45c83bc 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAliyunVirtualRouterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAliyunVirtualRouterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAppBuildSystemAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAppBuildSystemAction.java index 721516015da..6495c6ba12a 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAppBuildSystemAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAppBuildSystemAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingGroupAction.java index 7d038ee7915..18fb22ed46b 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingGroupAddingNewInstanceRuleAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingGroupAddingNewInstanceRuleAction.java index 5486689e1b4..f145a803fd0 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingGroupAddingNewInstanceRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingGroupAddingNewInstanceRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingGroupInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingGroupInstanceAction.java index 5419abb1e69..a13fe4ba161 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingGroupInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingGroupInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingGroupRemovalInstanceRuleAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingGroupRemovalInstanceRuleAction.java index dd19dadc639..0fba481e546 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingGroupRemovalInstanceRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingGroupRemovalInstanceRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingRuleAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingRuleAction.java index 57ef30b0cc1..da749a37162 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingVmTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingVmTemplateAction.java index 3d6b1054838..eb28865b8be 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingVmTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAutoScalingVmTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateBackupStorageAction.java index 6d75d703bae..cc9689d009d 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2ChassisAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2ChassisAction.java index 205a4c9e458..c01714882d4 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2ChassisAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2ChassisAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2ChassisOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2ChassisOfferingAction.java index e5eb3a05234..c62b4050fc2 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2ChassisOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2ChassisOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2ChassisPciDeviceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2ChassisPciDeviceAction.java index 8d3db3ed1cc..2c180477a46 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2ChassisPciDeviceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2ChassisPciDeviceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2GatewayAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2GatewayAction.java index 7496a80065a..224e5844513 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2GatewayAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2GatewayAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2InstanceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2InstanceAction.java index d8a17f0f983..3fe9c40de59 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2InstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2InstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2IpmiChassisAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2IpmiChassisAction.java index fc65555cd6f..54857bc1512 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2IpmiChassisAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2IpmiChassisAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2ProvisionNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2ProvisionNetworkAction.java index cd2877c8bd6..a721df380c6 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2ProvisionNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateBareMetal2ProvisionNetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateBaremetalChassisAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateBaremetalChassisAction.java index fc64dcf4139..d7eb6d10ed5 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateBaremetalChassisAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateBaremetalChassisAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateBaremetalInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateBaremetalInstanceAction.java index 5644728262a..f134e7c5256 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateBaremetalInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateBaremetalInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateBaremetalPxeServerAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateBaremetalPxeServerAction.java index 3563c447f09..3766962f41d 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateBaremetalPxeServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateBaremetalPxeServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateBlockPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateBlockPrimaryStorageAction.java index 1c3e645d110..380b47362af 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateBlockPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateBlockPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateBlockVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateBlockVolumeAction.java index 828d8e47cf8..9fd7badc87f 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateBlockVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateBlockVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateBondingAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateBondingAction.java index 89aca7200f4..86d620d12cc 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateBondingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateBondingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateBuildAppAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateBuildAppAction.java index 632d33d3376..0dbb394b1d4 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateBuildAppAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateBuildAppAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateCCSCertificateUserStateAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateCCSCertificateUserStateAction.java index 936b447b1b8..5309e41338e 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateCCSCertificateUserStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateCCSCertificateUserStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateCSPSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateCSPSecretResourcePoolAction.java index cfb5fe80737..6e17878bead 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateCSPSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateCSPSecretResourcePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateCasClientAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateCasClientAction.java index 15e95e6b894..2b608ba6eaf 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateCasClientAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateCasClientAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateCdpPolicyAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateCdpPolicyAction.java index 1098854b4ce..44048e15281 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateCdpPolicyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateCdpPolicyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateCdpTaskAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateCdpTaskAction.java index 346b52d0358..0287cf21382 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateCdpTaskAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateCdpTaskAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateCephBackupStorageMonAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateCephBackupStorageMonAction.java index 7c4a47dbc03..520407ca4d1 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateCephBackupStorageMonAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateCephBackupStorageMonAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateCephPrimaryStorageMonAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateCephPrimaryStorageMonAction.java index 80376adbf07..0721b5c9da9 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateCephPrimaryStorageMonAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateCephPrimaryStorageMonAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateCephPrimaryStoragePoolAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateCephPrimaryStoragePoolAction.java index d35c1ee4b2f..3e2fea12425 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateCephPrimaryStoragePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateCephPrimaryStoragePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateCertificateAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateCertificateAction.java index 11fd2fb9fac..4cb7f44bde6 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateCertificateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateCertificateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateChronyServersAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateChronyServersAction.java index bb5244319f4..bc6461dcbf6 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateChronyServersAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateChronyServersAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateClusterAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateClusterAction.java index 243c8150d41..f9b3c328367 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateClusterDRSAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateClusterDRSAction.java index fb76409dcfd..f1c955ce1ce 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateClusterDRSAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateClusterDRSAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateClusterOSAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateClusterOSAction.java index dd77ab33d8a..1c44a0a935c 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateClusterOSAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateClusterOSAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateConnectionBetweenL3NetWorkAndAliyunVSwitchAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateConnectionBetweenL3NetWorkAndAliyunVSwitchAction.java index 549732c2441..85d8d1a7c5b 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateConnectionBetweenL3NetWorkAndAliyunVSwitchAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateConnectionBetweenL3NetWorkAndAliyunVSwitchAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateConsolePasswordAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateConsolePasswordAction.java index c3398dbbe07..ad60a519fbd 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateConsolePasswordAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateConsolePasswordAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateConsoleProxyAgentAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateConsoleProxyAgentAction.java index da6a400c4b6..106cc13629c 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateConsoleProxyAgentAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateConsoleProxyAgentAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementEndpointAction.java index d2675c1a78f..8047999ecc5 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java index 5a2b0988f43..a8406604e2b 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateDatasetsAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetsAction.java index 7cae036b324..a75d018b831 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateDatasetsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateDirectoryAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateDirectoryAction.java index a9bd4f381bd..a2e48a38c61 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateDirectoryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateDirectoryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateDiskOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateDiskOfferingAction.java index 12c88867a3d..2431693dba3 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateDiskOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateDiskOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateEcsImageAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateEcsImageAction.java index 1f3c6797dc2..79d5f2e2b88 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateEcsImageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateEcsImageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateEcsInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateEcsInstanceAction.java index db946f4b212..c695bccdaef 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateEcsInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateEcsInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateEcsInstanceVncPasswordAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateEcsInstanceVncPasswordAction.java index cf0187f5b20..cb2de743283 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateEcsInstanceVncPasswordAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateEcsInstanceVncPasswordAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateEcsSecurityGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateEcsSecurityGroupAction.java index 28c147a7965..5d716dba5c2 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateEcsSecurityGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateEcsSecurityGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateEcsVSwitchAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateEcsVSwitchAction.java index be914692e31..1e9748fa82e 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateEcsVSwitchAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateEcsVSwitchAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateEcsVpcAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateEcsVpcAction.java index 1e54843e9df..fc8ef953333 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateEcsVpcAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateEcsVpcAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateEipAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateEipAction.java index 36a008f4dd3..1b7022b9787 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateEipAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateEipAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateEmailMediaAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateEmailMediaAction.java index 1e67474a1d3..564644766e8 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateEmailMediaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateEmailMediaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateEmailMonitorTriggerActionAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateEmailMonitorTriggerActionAction.java index 67f5e6b77a0..5c861c825f0 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateEmailMonitorTriggerActionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateEmailMonitorTriggerActionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateExternalPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateExternalPrimaryStorageAction.java index b1950a316c1..353dd69837b 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateExternalPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateExternalPrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateFactoryModeStateAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateFactoryModeStateAction.java index dd90148902d..3ca438c956b 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateFactoryModeStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateFactoryModeStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateFiSecSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateFiSecSecretResourcePoolAction.java index d3af21f2c54..af32c382f03 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateFiSecSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateFiSecSecretResourcePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateFiSecSecurityMachineAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateFiSecSecurityMachineAction.java index 424388a71fa..af68c3b4a73 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateFiSecSecurityMachineAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateFiSecSecurityMachineAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateFirewallIpSetTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateFirewallIpSetTemplateAction.java index d2c60aa6795..56601add63d 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateFirewallIpSetTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateFirewallIpSetTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateFirewallRuleAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateFirewallRuleAction.java index 173a0a9ede0..dd6ff20d284 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateFirewallRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateFirewallRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateFirewallRuleSetAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateFirewallRuleSetAction.java index 8eadc9975dd..f8892a11573 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateFirewallRuleSetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateFirewallRuleSetAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateFirewallRuleTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateFirewallRuleTemplateAction.java index 28722832db1..613a930c29c 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateFirewallRuleTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateFirewallRuleTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateFlkSecSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateFlkSecSecretResourcePoolAction.java index c541687f743..1551f54ce98 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateFlkSecSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateFlkSecSecretResourcePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateFlkSecSecurityMachineAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateFlkSecSecurityMachineAction.java index 48605b48daf..d8a5399a46a 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateFlkSecSecurityMachineAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateFlkSecSecurityMachineAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateFlowCollectorAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateFlowCollectorAction.java index 44198be3205..1faedf03ad3 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateFlowCollectorAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateFlowCollectorAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateFlowMeterAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateFlowMeterAction.java index c90d8bc55e7..c40e95d24e3 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateFlowMeterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateFlowMeterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateGlobalConfigAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateGlobalConfigAction.java index f4909f7d297..5a535463246 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateGlobalConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateGlobalConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateGuestToolsStateAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateGuestToolsStateAction.java index fc119a1454e..88bd49cfa9c 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateGuestToolsStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateGuestToolsStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateGuestVmScriptAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateGuestVmScriptAction.java index ad9a2c9e625..ad7574a6c7a 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateGuestVmScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateGuestVmScriptAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateHaStrategyConditionAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateHaStrategyConditionAction.java index 916734260df..02094a11fd3 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateHaStrategyConditionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateHaStrategyConditionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateHostAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateHostAction.java index 4a554e45480..88cdf2d3dec 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateHostIommuStateAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateHostIommuStateAction.java index 0c8d0651a1f..d761eaffb98 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateHostIommuStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateHostIommuStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateHostIpmiAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateHostIpmiAction.java index 05fbe585d63..6baf035f03f 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateHostIpmiAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateHostIpmiAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkInterfaceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkInterfaceAction.java index e453b8e2737..fe09dd2de28 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkInterfaceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkInterfaceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkServiceTypeAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkServiceTypeAction.java index 7842f4d353f..b575fee8934 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkServiceTypeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkServiceTypeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateHostSchedulingRuleGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateHostSchedulingRuleGroupAction.java index 12cefebf541..dd1fa4bf971 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateHostSchedulingRuleGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateHostSchedulingRuleGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateHybridEipAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateHybridEipAction.java index 176a5d60cef..a3efdbf1e28 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateHybridEipAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateHybridEipAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateHybridKeySecretAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateHybridKeySecretAction.java index 339e4654ce8..99871145bd8 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateHybridKeySecretAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateHybridKeySecretAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateIPsecConnectionAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateIPsecConnectionAction.java index 11679d1ccb6..8253a62e68b 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateIPsecConnectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateIPsecConnectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateImageAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateImageAction.java index d1c334ea54f..5d791302ff6 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateImageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateImageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateImagePackageAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateImagePackageAction.java index 40b2fa1d0d7..0147cd84c76 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateImagePackageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateImagePackageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateImageStoreBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateImageStoreBackupStorageAction.java index 1aa44c79d8f..0513233d59d 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateImageStoreBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateImageStoreBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateInfoSecSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateInfoSecSecretResourcePoolAction.java index a9a3f34a353..436b3682e44 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateInfoSecSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateInfoSecSecretResourcePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateInfoSecSecurityMachineAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateInfoSecSecurityMachineAction.java index 910fc7260c6..8cb3e6492b8 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateInfoSecSecurityMachineAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateInfoSecSecurityMachineAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateInstanceOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateInstanceOfferingAction.java index 881575e8986..b9f425b6f98 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateInstanceOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateInstanceOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateIpRangeAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateIpRangeAction.java index 3f30465ce3a..7df3f5d5645 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateIpRangeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateIpRangeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateIscsiServerAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateIscsiServerAction.java index 729a47a599e..dd1bf14454c 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateIscsiServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateIscsiServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateJitSecurityMachineAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateJitSecurityMachineAction.java index 22e7700cbe7..7bbafa5fef1 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateJitSecurityMachineAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateJitSecurityMachineAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateKVMHostAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateKVMHostAction.java index 68bd4a35100..2c10de8650b 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateKVMHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateKVMHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateKoAlSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateKoAlSecretResourcePoolAction.java index e7f36e3ea42..c04cc4b3c12 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateKoAlSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateKoAlSecretResourcePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateL2NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateL2NetworkAction.java index d746c5a5b90..b12cf0bb0b7 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateL2NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateL2NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateL3NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateL3NetworkAction.java index db3a173ed45..14fe92e1739 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateL3NetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateL3NetworkAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateLdapServerAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateLdapServerAction.java index dad56a281df..21af4f00433 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateLdapServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateLdapServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateLicenseAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateLicenseAction.java index a512789f546..3896be909e6 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateLicenseAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateLicenseAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateLoadBalancerAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateLoadBalancerAction.java index f6fc845e83a..ad218a02f93 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateLoadBalancerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateLoadBalancerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateLoadBalancerListenerAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateLoadBalancerListenerAction.java index d8f72b419b6..eb1c93faa3b 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateLoadBalancerListenerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateLoadBalancerListenerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateLoadBalancerServerGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateLoadBalancerServerGroupAction.java index 984a17e78e6..e0b7ddc204b 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateLoadBalancerServerGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateLoadBalancerServerGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateLogConfigurationAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateLogConfigurationAction.java index 92d04f38be1..1024fa34618 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateLogConfigurationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateLogConfigurationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateLogServerAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateLogServerAction.java index e2853cb1f16..4e71f4952fe 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateLogServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateLogServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateLongJobAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateLongJobAction.java index d7ea24051eb..1c79f8f2b97 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateLongJobAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateLongJobAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateMdevDeviceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateMdevDeviceAction.java index 68c0636165b..ac2740f07f5 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateMdevDeviceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateMdevDeviceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateMdevDeviceSpecAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateMdevDeviceSpecAction.java index ad0e83b845d..15a6539ef83 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateMdevDeviceSpecAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateMdevDeviceSpecAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java index 1d440e5787b..108cfa2e382 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java index 9bc5590ef92..95cddcf3b8e 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelEvaluationTaskAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelEvaluationTaskAction.java index 98f1015d91a..99b70f9143d 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelEvaluationTaskAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelEvaluationTaskAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java index 131e4e3b9f4..34a782331a9 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java index 18e3b183092..6e64701e11a 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateMonitorTriggerAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateMonitorTriggerAction.java index b8507f9de10..d94d14d2224 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateMonitorTriggerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateMonitorTriggerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateNasFileSystemAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateNasFileSystemAction.java index 5ed3bb480b0..8ed4c025129 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateNasFileSystemAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateNasFileSystemAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateNasMountTargetAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateNasMountTargetAction.java index 13a4c973882..1503920553a 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateNasMountTargetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateNasMountTargetAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateNfvInstGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateNfvInstGroupAction.java index a6bd5fbcf6a..b4ed16801a9 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateNfvInstGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateNfvInstGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateNfvInstProvisionConfigAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateNfvInstProvisionConfigAction.java index c89a64d662f..d80a5216f06 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateNfvInstProvisionConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateNfvInstProvisionConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateOAuthClientAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateOAuthClientAction.java index a17f2fe1d00..d72a528d92b 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateOAuthClientAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateOAuthClientAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateOssBucketAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateOssBucketAction.java index 1be7702d819..6899d63b656 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateOssBucketAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateOssBucketAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdatePciDeviceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdatePciDeviceAction.java index 9d3b2787213..d8d01431a6b 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdatePciDeviceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdatePciDeviceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdatePciDeviceSpecAction.java b/sdk/src/main/java/org/zstack/sdk/UpdatePciDeviceSpecAction.java index 5bc3e795521..e64f87dede8 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdatePciDeviceSpecAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdatePciDeviceSpecAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdatePluginSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/UpdatePluginSecretResourcePoolAction.java index f90210e0adc..ec7ab2e278c 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdatePluginSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdatePluginSecretResourcePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdatePolicyRouteRuleSetAction.java b/sdk/src/main/java/org/zstack/sdk/UpdatePolicyRouteRuleSetAction.java index f73e1876e5e..400024a2aa5 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdatePolicyRouteRuleSetAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdatePolicyRouteRuleSetAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdatePortForwardingRuleAction.java b/sdk/src/main/java/org/zstack/sdk/UpdatePortForwardingRuleAction.java index 7611e0dd347..546637b51dc 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdatePortForwardingRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdatePortForwardingRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdatePortMirrorAction.java b/sdk/src/main/java/org/zstack/sdk/UpdatePortMirrorAction.java index f8aa8b0108e..c5ea410a680 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdatePortMirrorAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdatePortMirrorAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdatePreconfigurationTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/UpdatePreconfigurationTemplateAction.java index 1fd613de5d2..38fcaa4c7e8 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdatePreconfigurationTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdatePreconfigurationTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdatePriceTableAction.java b/sdk/src/main/java/org/zstack/sdk/UpdatePriceTableAction.java index f475efa2747..1b13912f0b2 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdatePriceTableAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdatePriceTableAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdatePrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/UpdatePrimaryStorageAction.java index d1ff1f64030..35227c0be92 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdatePrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdatePrimaryStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdatePriorityConfigAction.java b/sdk/src/main/java/org/zstack/sdk/UpdatePriorityConfigAction.java index adab463eb21..c56aac15a7a 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdatePriorityConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdatePriorityConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdatePublishAppAction.java b/sdk/src/main/java/org/zstack/sdk/UpdatePublishAppAction.java index c3d71d3a0c3..36b44f3004c 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdatePublishAppAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdatePublishAppAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateQuotaAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateQuotaAction.java index 12f2b6efe12..d95f331efd2 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateQuotaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateQuotaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateResourceConfigAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateResourceConfigAction.java index 70cb42ca5a2..69a026da9de 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateResourceConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateResourceConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateResourceConfigsAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateResourceConfigsAction.java index 3cb6a9c5acb..627a8d3da10 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateResourceConfigsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateResourceConfigsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateResourcePriceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateResourcePriceAction.java index de602dc0dfc..3e25fb6932f 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateResourcePriceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateResourcePriceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateResourceStackAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateResourceStackAction.java index 1422f1f0583..a92e9e61ef3 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateResourceStackAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateResourceStackAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSAML2ClientAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSAML2ClientAction.java index 73bb94a429d..eeb6dc5aef0 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateSAML2ClientAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSAML2ClientAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSSOClientAttributeAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSSOClientAttributeAction.java index c59c63aeea8..6415bada713 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateSSOClientAttributeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSSOClientAttributeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSSORedirectTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSSORedirectTemplateAction.java index 34dfd73e502..d2b8c77c766 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateSSORedirectTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSSORedirectTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSanSecSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSanSecSecretResourcePoolAction.java index 3ede6bc7a27..853677b1fe1 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateSanSecSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSanSecSecretResourcePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSanSecSecurityMachineAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSanSecSecurityMachineAction.java index 9dc47e68b05..c4c783c602b 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateSanSecSecurityMachineAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSanSecSecurityMachineAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSchedulerJobAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSchedulerJobAction.java index e45bd6cc086..624f7a266b6 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateSchedulerJobAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSchedulerJobAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSchedulerJobGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSchedulerJobGroupAction.java index 8325bd1b7b6..6735e76bc08 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateSchedulerJobGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSchedulerJobGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSchedulerTriggerAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSchedulerTriggerAction.java index 6afe258edb3..aeec2223898 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateSchedulerTriggerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSchedulerTriggerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateScsiLunAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateScsiLunAction.java index 80b74f4c175..15a3c87623a 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateScsiLunAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateScsiLunAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSdnControllerAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSdnControllerAction.java index 2ebcb637887..ae0b1e81a33 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateSdnControllerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSdnControllerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSecretResourcePoolAction.java index da5dda7bf9a..e8a4726646f 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSecretResourcePoolAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSecurityGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSecurityGroupAction.java index 2ab5cc0efa4..fb6547cf379 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateSecurityGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSecurityGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSecurityGroupRulePriorityAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSecurityGroupRulePriorityAction.java index b750d86eb6f..3376ca96bd7 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateSecurityGroupRulePriorityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSecurityGroupRulePriorityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSecurityMachineAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSecurityMachineAction.java index 15d2606ccb9..46a4b5a1d94 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateSecurityMachineAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSecurityMachineAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSftpBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSftpBackupStorageAction.java index dd1a6da9ae0..7df60bfe1f8 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateSftpBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSftpBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSharedBlockAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSharedBlockAction.java index 6631d0ee1d4..c636a32f363 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateSharedBlockAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSharedBlockAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSlbGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSlbGroupAction.java index c888d3d4d75..261fce8341d 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateSlbGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSlbGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSnmpAgentAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSnmpAgentAction.java index 6ecc72480a8..8093f74135d 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateSnmpAgentAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSnmpAgentAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSshKeyPairAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSshKeyPairAction.java index f1d8039064b..88086e1edcb 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateSshKeyPairAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSshKeyPairAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateStackTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateStackTemplateAction.java index 75284c07aae..44da5cbcaae 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateStackTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateStackTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSystemTagAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSystemTagAction.java index 6d7c6a24ed8..4a577b0919f 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateSystemTagAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSystemTagAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateTagAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateTagAction.java index 15728631a7b..087b4e6c1ed 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateTagAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateTagAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateTemplateConfigAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateTemplateConfigAction.java index 6c1fca0bfe7..3328d40bf8c 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateTemplateConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateTemplateConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateUsbDeviceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateUsbDeviceAction.java index 830321098b5..49fedbfa54f 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateUsbDeviceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateUsbDeviceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateUserAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateUserAction.java index 3136c7fd7c6..0a8f17d0aad 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateUserAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateUserAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateUserGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateUserGroupAction.java index 9e0c47bdeaf..c9453586d51 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateUserGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateUserGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateUserProxyConfigAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateUserProxyConfigAction.java index a5fda8afd1a..dca42b9aa60 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateUserProxyConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateUserProxyConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateV2VConversionHostAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateV2VConversionHostAction.java index 60de61344fb..c2541ab9c82 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateV2VConversionHostAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateV2VConversionHostAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVCenterAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVCenterAction.java index 64ca0ef1f59..248992416ea 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVCenterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVCenterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVRouterOspfAreaAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVRouterOspfAreaAction.java index d70756a7456..41b644af9c8 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVRouterOspfAreaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVRouterOspfAreaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVRouterRouteTableAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVRouterRouteTableAction.java index 846705a76fe..ccb61cfb1d6 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVRouterRouteTableAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVRouterRouteTableAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVipAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVipAction.java index 4000b12da16..85abb55d849 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVipAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVipAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVirtualBorderRouterRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVirtualBorderRouterRemoteAction.java index 43bc8e720bf..50d1df94222 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVirtualBorderRouterRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVirtualBorderRouterRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVirtualRouterAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVirtualRouterAction.java index 162f4d4d70a..fa650ca2261 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVirtualRouterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVirtualRouterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVirtualRouterOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVirtualRouterOfferingAction.java index ecdd4b0538c..2e09be1d0ef 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVirtualRouterOfferingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVirtualRouterOfferingAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVirtualRouterSoftwareVersionAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVirtualRouterSoftwareVersionAction.java index 5170b33803a..815714e9198 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVirtualRouterSoftwareVersionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVirtualRouterSoftwareVersionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVmCdRomAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVmCdRomAction.java index 849d8ce4956..04c527dad6c 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVmCdRomAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVmCdRomAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVmInstanceAction.java index 3e825297523..e5a5b72e346 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVmInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVmNetworkConfigAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVmNetworkConfigAction.java index 3a9542063d5..9d09235a1ed 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVmNetworkConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVmNetworkConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVmNicDriverAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVmNicDriverAction.java index f4f053763db..c1238161430 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVmNicDriverAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVmNicDriverAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVmNicMacAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVmNicMacAction.java index 3bb570ca25f..ea7fc86166a 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVmNicMacAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVmNicMacAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVmPriorityAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVmPriorityAction.java index dcc80492d7e..91928bba31d 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVmPriorityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVmPriorityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVmSchedulingRuleAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVmSchedulingRuleAction.java index a1be77af68e..461e9fdc8b9 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVmSchedulingRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVmSchedulingRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVmSchedulingRuleGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVmSchedulingRuleGroupAction.java index 67029dfe520..e7d84614135 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVmSchedulingRuleGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVmSchedulingRuleGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVmUserDefinedXmlHookScriptAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVmUserDefinedXmlHookScriptAction.java index 9e5cf8ce15f..04b0c792965 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVmUserDefinedXmlHookScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVmUserDefinedXmlHookScriptAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVniRangeAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVniRangeAction.java index c5208c9e6f5..d8aa97925fb 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVniRangeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVniRangeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVolumeAction.java index ee9bbd3330e..3a13c55dccd 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVolumeSnapshotAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVolumeSnapshotAction.java index a71a208f304..3d075e7c146 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVolumeSnapshotAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVolumeSnapshotAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVolumeSnapshotGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVolumeSnapshotGroupAction.java index 7e552255433..f450901f661 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVolumeSnapshotGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVolumeSnapshotGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVpcFirewallAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVpcFirewallAction.java index 28ba0a34fda..18c3f4a2fd1 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVpcFirewallAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVpcFirewallAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVpcHaGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVpcHaGroupAction.java index 3f84c3a35b6..c1c1c346c19 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVpcHaGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVpcHaGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVpcSharedQosAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVpcSharedQosAction.java index 60f32aa0d18..ba096422b22 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVpcSharedQosAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVpcSharedQosAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVpcUserVpnGatewayAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVpcUserVpnGatewayAction.java index b17a44ac919..5b407d508ae 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVpcUserVpnGatewayAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVpcUserVpnGatewayAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVpcVpnConnectionRemoteAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVpcVpnConnectionRemoteAction.java index ba48c88c42e..53645ff0483 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVpcVpnConnectionRemoteAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVpcVpnConnectionRemoteAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVpcVpnGatewayAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVpcVpnGatewayAction.java index 1cd12890b81..5d513d0ce0c 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateVpcVpnGatewayAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVpcVpnGatewayAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateWebhookAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateWebhookAction.java index 65f06e38ab8..e0585c8f21a 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateWebhookAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateWebhookAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateXskyBlockVolumeAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateXskyBlockVolumeAction.java index c08d3e312a6..d93f5df2af5 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateXskyBlockVolumeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateXskyBlockVolumeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateZoneAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateZoneAction.java index 74d8ab46b9a..27d3eb39b4d 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateZoneAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateZoneAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UpgradeBackupStorageCdpTasksAction.java b/sdk/src/main/java/org/zstack/sdk/UpgradeBackupStorageCdpTasksAction.java index 4abb6210e11..9732860a278 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpgradeBackupStorageCdpTasksAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpgradeBackupStorageCdpTasksAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/UploadFileToVmAction.java b/sdk/src/main/java/org/zstack/sdk/UploadFileToVmAction.java index fb9c77ce378..43cca98f911 100644 --- a/sdk/src/main/java/org/zstack/sdk/UploadFileToVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UploadFileToVmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ValidateClusterSupportDRSAction.java b/sdk/src/main/java/org/zstack/sdk/ValidateClusterSupportDRSAction.java index 012b2b92672..5f6da751420 100644 --- a/sdk/src/main/java/org/zstack/sdk/ValidateClusterSupportDRSAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ValidateClusterSupportDRSAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ValidateDiskOfferingUserConfigAction.java b/sdk/src/main/java/org/zstack/sdk/ValidateDiskOfferingUserConfigAction.java index 8e4cc267d42..9ee1b37b00c 100644 --- a/sdk/src/main/java/org/zstack/sdk/ValidateDiskOfferingUserConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ValidateDiskOfferingUserConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ValidateInstanceOfferingUserConfigAction.java b/sdk/src/main/java/org/zstack/sdk/ValidateInstanceOfferingUserConfigAction.java index 9f39699d37e..00d6c413221 100644 --- a/sdk/src/main/java/org/zstack/sdk/ValidateInstanceOfferingUserConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ValidateInstanceOfferingUserConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ValidatePasswordAction.java b/sdk/src/main/java/org/zstack/sdk/ValidatePasswordAction.java index c11a62f89e1..76de5d4c58c 100644 --- a/sdk/src/main/java/org/zstack/sdk/ValidatePasswordAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ValidatePasswordAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ValidatePriceUserConfigAction.java b/sdk/src/main/java/org/zstack/sdk/ValidatePriceUserConfigAction.java index 126d16433c4..7631b371681 100644 --- a/sdk/src/main/java/org/zstack/sdk/ValidatePriceUserConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ValidatePriceUserConfigAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ValidateSecurityGroupRuleAction.java b/sdk/src/main/java/org/zstack/sdk/ValidateSecurityGroupRuleAction.java index 6d31c030d61..b5fdf5682d5 100644 --- a/sdk/src/main/java/org/zstack/sdk/ValidateSecurityGroupRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ValidateSecurityGroupRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ValidateSessionAction.java b/sdk/src/main/java/org/zstack/sdk/ValidateSessionAction.java index 9842a9cab6a..87b19a20dad 100644 --- a/sdk/src/main/java/org/zstack/sdk/ValidateSessionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ValidateSessionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ValidateVmSchedulingRuleAction.java b/sdk/src/main/java/org/zstack/sdk/ValidateVmSchedulingRuleAction.java index 6b8eb32df75..9dbd9780f83 100644 --- a/sdk/src/main/java/org/zstack/sdk/ValidateVmSchedulingRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ValidateVmSchedulingRuleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ValidateVolumeSnapshotChainAction.java b/sdk/src/main/java/org/zstack/sdk/ValidateVolumeSnapshotChainAction.java index d4d844ab922..21725fc8d48 100644 --- a/sdk/src/main/java/org/zstack/sdk/ValidateVolumeSnapshotChainAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ValidateVolumeSnapshotChainAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ZQLQueryAction.java b/sdk/src/main/java/org/zstack/sdk/ZQLQueryAction.java index 7864b7c2017..693e9716844 100644 --- a/sdk/src/main/java/org/zstack/sdk/ZQLQueryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ZQLQueryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/databasebackup/CreateDatabaseBackupAction.java b/sdk/src/main/java/org/zstack/sdk/databasebackup/CreateDatabaseBackupAction.java index ead81d60920..8d4efec3a46 100644 --- a/sdk/src/main/java/org/zstack/sdk/databasebackup/CreateDatabaseBackupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/databasebackup/CreateDatabaseBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/databasebackup/DeleteDatabaseBackupAction.java b/sdk/src/main/java/org/zstack/sdk/databasebackup/DeleteDatabaseBackupAction.java index aaa99d25c15..8587bb628f6 100644 --- a/sdk/src/main/java/org/zstack/sdk/databasebackup/DeleteDatabaseBackupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/databasebackup/DeleteDatabaseBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/databasebackup/DeleteExportedDatabaseBackupFromBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/databasebackup/DeleteExportedDatabaseBackupFromBackupStorageAction.java index 77ac868db92..4d2b17e23b1 100644 --- a/sdk/src/main/java/org/zstack/sdk/databasebackup/DeleteExportedDatabaseBackupFromBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/databasebackup/DeleteExportedDatabaseBackupFromBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/databasebackup/ExportDatabaseBackupFromBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/databasebackup/ExportDatabaseBackupFromBackupStorageAction.java index 208a5bbeae4..596306728a7 100644 --- a/sdk/src/main/java/org/zstack/sdk/databasebackup/ExportDatabaseBackupFromBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/databasebackup/ExportDatabaseBackupFromBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/databasebackup/GetDatabaseBackupFromImageStoreAction.java b/sdk/src/main/java/org/zstack/sdk/databasebackup/GetDatabaseBackupFromImageStoreAction.java index ae3be65ef98..6d644866ae5 100644 --- a/sdk/src/main/java/org/zstack/sdk/databasebackup/GetDatabaseBackupFromImageStoreAction.java +++ b/sdk/src/main/java/org/zstack/sdk/databasebackup/GetDatabaseBackupFromImageStoreAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/databasebackup/QueryDatabaseBackupAction.java b/sdk/src/main/java/org/zstack/sdk/databasebackup/QueryDatabaseBackupAction.java index 48738043a7f..4fb7f1f362b 100644 --- a/sdk/src/main/java/org/zstack/sdk/databasebackup/QueryDatabaseBackupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/databasebackup/QueryDatabaseBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/databasebackup/RecoverDatabaseFromBackupAction.java b/sdk/src/main/java/org/zstack/sdk/databasebackup/RecoverDatabaseFromBackupAction.java index acca7f018b7..95ed1fc27bf 100644 --- a/sdk/src/main/java/org/zstack/sdk/databasebackup/RecoverDatabaseFromBackupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/databasebackup/RecoverDatabaseFromBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/databasebackup/SyncDatabaseBackupAction.java b/sdk/src/main/java/org/zstack/sdk/databasebackup/SyncDatabaseBackupAction.java index 58cf0b6e0af..0dc94eefc4c 100644 --- a/sdk/src/main/java/org/zstack/sdk/databasebackup/SyncDatabaseBackupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/databasebackup/SyncDatabaseBackupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/databasebackup/SyncDatabaseBackupFromImageStoreBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/databasebackup/SyncDatabaseBackupFromImageStoreBackupStorageAction.java index 8a57c7a1bc5..d85091f958f 100644 --- a/sdk/src/main/java/org/zstack/sdk/databasebackup/SyncDatabaseBackupFromImageStoreBackupStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/databasebackup/SyncDatabaseBackupFromImageStoreBackupStorageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/CreateHuaweiIMasterVRouterAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/CreateHuaweiIMasterVRouterAction.java index 40808907cbe..5bbb5e8198d 100644 --- a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/CreateHuaweiIMasterVRouterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/CreateHuaweiIMasterVRouterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterFabricAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterFabricAction.java index dac79b20065..62db619041b 100644 --- a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterFabricAction.java +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterFabricAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterTenantAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterTenantAction.java index 8f42501e563..464cc058c7a 100644 --- a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterTenantAction.java +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterTenantAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVRouterAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVRouterAction.java index b901c8c9526..0b30b8e6429 100644 --- a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVRouterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVRouterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVpcAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVpcAction.java index e61f3a56f21..bf24d196b6e 100644 --- a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVpcAction.java +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVpcAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/PullHuaweiIMasterControllerAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/PullHuaweiIMasterControllerAction.java index c8cab63f3fa..55d2df3ae38 100644 --- a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/PullHuaweiIMasterControllerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/PullHuaweiIMasterControllerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterFabricAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterFabricAction.java index 52ab2e1b5cd..571800c6393 100644 --- a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterFabricAction.java +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterFabricAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterTenantAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterTenantAction.java index ef20f29f9d9..edccd925b15 100644 --- a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterTenantAction.java +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterTenantAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVRouterAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVRouterAction.java index 1ea349fce1a..a89167421f9 100644 --- a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVRouterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVRouterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVpcAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVpcAction.java index 877f4bd0feb..a3f58639ece 100644 --- a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVpcAction.java +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVpcAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2OrganizationAction.java index f00de1952fb..0c570d33934 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2OrganizationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2ProjectAction.java index 53bb36c5b6f..95f1b7d9d35 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2ProjectAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDAction.java index 188581aa6bb..f5188d43558 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDGroupAction.java index ea4ea41d38a..cc9ec996a74 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDGroupToProjectsAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDGroupToProjectsAction.java index d9d9ae5e33b..9b852b2e89b 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDGroupToProjectsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDGroupToProjectsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToGroupAction.java index 095e3ee8378..1222b1ca945 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToOrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToOrganizationAction.java index 6659e146a43..3bdca3a22ad 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToOrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToOrganizationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectAction.java index 5958bcbdc30..414cd7dd847 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectsAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectsAction.java index 7320a5c6fc4..87300bb812a 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddResourceToIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddResourceToIAM2ProjectAction.java index 90aec660595..47c6e0c3b11 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddResourceToIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddResourceToIAM2ProjectAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDAction.java index 08da2267a85..ba09da2dce1 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDGroupAction.java index c82beaf94e2..1e68e5cdea9 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AttachIAM2ProjectToIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AttachIAM2ProjectToIAM2OrganizationAction.java index 59ed9c8c863..a3bcec666af 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AttachIAM2ProjectToIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AttachIAM2ProjectToIAM2OrganizationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/BatchCreateIAM2VirtualIDFromConfigFileAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/BatchCreateIAM2VirtualIDFromConfigFileAction.java index d8979de3cca..e2a6df552fe 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/BatchCreateIAM2VirtualIDFromConfigFileAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/BatchCreateIAM2VirtualIDFromConfigFileAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationParentAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationParentAction.java index 190291ad557..bf14ca4ee6d 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationParentAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationParentAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationStateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationStateAction.java index 69c87a49009..2209c924370 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2ProjectStateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2ProjectStateAction.java index c4ae6821a67..657662a6190 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2ProjectStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2ProjectStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDGroupStateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDGroupStateAction.java index fc59203fdcd..40ba96818b6 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDGroupStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDGroupStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDStateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDStateAction.java index 46dff445083..f1512995f65 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDTypeAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDTypeAction.java index 945ae077534..21b8193d4cb 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDTypeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDTypeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CheckIAM2OrganizationAvailabilityAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CheckIAM2OrganizationAvailabilityAction.java index 5b9cbba11c4..bf2282d4e20 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CheckIAM2OrganizationAvailabilityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CheckIAM2OrganizationAvailabilityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CheckIAM2VirtualIDConfigFileAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CheckIAM2VirtualIDConfigFileAction.java index 94ea71721ca..41387001be8 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CheckIAM2VirtualIDConfigFileAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CheckIAM2VirtualIDConfigFileAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2OrganizationAction.java index 0eeec742bbb..408f404b359 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2OrganizationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectAction.java index ba48f0c2e9d..bac3f209d3c 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectFromTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectFromTemplateAction.java index 24c59d1109f..2a8df9ff6e7 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectFromTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectFromTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectRoleAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectRoleAction.java index b70638444fd..a16e5c3570f 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectRoleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectRoleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateAction.java index afc0334c75b..28aae6e7d99 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateFromProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateFromProjectAction.java index 7d87d108777..ca7affb4dce 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateFromProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateFromProjectAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDAction.java index 40cd014b6d4..79801383b91 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDGroupAction.java index 5db10864bdc..907ef2b9096 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2OrganizationAction.java index 02a9b82fd91..db4b7eb7383 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2OrganizationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectAction.java index bce7d3914c6..6a593328d41 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectTemplateAction.java index 93dda594247..21130d32ae0 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDAction.java index 22c842115ef..6d31daead21 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDGroupAction.java index 177696a16c0..c0cd5ba2a02 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/DetachIAM2ProjectFromIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/DetachIAM2ProjectFromIAM2OrganizationAction.java index 5ee8e5a63ce..408d0b27eb0 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/DetachIAM2ProjectFromIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/DetachIAM2ProjectFromIAM2OrganizationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/ExpungeIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/ExpungeIAM2ProjectAction.java index 911d0b7a958..f933b2b18ac 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/ExpungeIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/ExpungeIAM2ProjectAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/GetIAM2OrganizationVirtualIDNumberAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/GetIAM2OrganizationVirtualIDNumberAction.java index 66bb78f9a78..4b79f35663f 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/GetIAM2OrganizationVirtualIDNumberAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/GetIAM2OrganizationVirtualIDNumberAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/GetIAM2ProjectsOfVirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/GetIAM2ProjectsOfVirtualIDAction.java index 2bdef6d7461..95a34fcb87d 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/GetIAM2ProjectsOfVirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/GetIAM2ProjectsOfVirtualIDAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/GetIAM2SystemAttributesAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/GetIAM2SystemAttributesAction.java index c72643bcae7..4497f7019ff 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/GetIAM2SystemAttributesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/GetIAM2SystemAttributesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/GetIAM2VirtualIDAPIPermissionAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/GetIAM2VirtualIDAPIPermissionAction.java index 84aa96ee950..b9fae7f6016 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/GetIAM2VirtualIDAPIPermissionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/GetIAM2VirtualIDAPIPermissionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/GetIAM2VirtualIDInGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/GetIAM2VirtualIDInGroupAction.java index 9fd8469a455..c84a4c052e0 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/GetIAM2VirtualIDInGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/GetIAM2VirtualIDInGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/GetOrganizationQuotaUsageAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/GetOrganizationQuotaUsageAction.java index 5ee45da0c93..6ae10e354be 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/GetOrganizationQuotaUsageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/GetOrganizationQuotaUsageAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/LoginIAM2PlatformAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/LoginIAM2PlatformAction.java index 7f2c5560620..97326e3efcd 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/LoginIAM2PlatformAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/LoginIAM2PlatformAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/LoginIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/LoginIAM2ProjectAction.java index 83e73332d24..82dbfc80181 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/LoginIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/LoginIAM2ProjectAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/LoginIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/LoginIAM2VirtualIDAction.java index 6eaf9e0db5f..9623be1cbca 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/LoginIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/LoginIAM2VirtualIDAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2OrganizationAction.java index 9f6bbcd17a6..789c20dedb8 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2OrganizationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2OrganizationAttributeAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2OrganizationAttributeAction.java index 0bd3d937bf9..c01b1ffb56f 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2OrganizationAttributeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2OrganizationAttributeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2OrganizationProjectRefAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2OrganizationProjectRefAction.java index 3994afc84cd..09e7cebe2ac 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2OrganizationProjectRefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2OrganizationProjectRefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2ProjectAccountRefAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2ProjectAccountRefAction.java index fbbaa06a078..5581dd6fcaa 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2ProjectAccountRefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2ProjectAccountRefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2ProjectAction.java index 9bb22c61b82..0a5d78a7351 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2ProjectAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2ProjectAttributeAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2ProjectAttributeAction.java index f2f5ca3496f..a4379626e91 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2ProjectAttributeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2ProjectAttributeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2ProjectRoleAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2ProjectRoleAction.java index d8d5b2df962..e52b9ed887b 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2ProjectRoleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2ProjectRoleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2ProjectTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2ProjectTemplateAction.java index 0ccb30fb24d..38b455feada 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2ProjectTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2ProjectTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2VirtualIDAction.java index 55308268eae..c12553b5ca7 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2VirtualIDAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2VirtualIDAttributeAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2VirtualIDAttributeAction.java index 4b7adaf95a5..006f1198750 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2VirtualIDAttributeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2VirtualIDAttributeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2VirtualIDGroupAction.java index b862489eb2f..d908c268ec1 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2VirtualIDGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2VirtualIDGroupAttributeAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2VirtualIDGroupAttributeAction.java index 7a8223472e2..31b581b38c3 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2VirtualIDGroupAttributeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/QueryIAM2VirtualIDGroupAttributeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RecoverIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RecoverIAM2ProjectAction.java index 9dd2a44f60c..9e338de6b9b 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RecoverIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RecoverIAM2ProjectAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2OrganizationAction.java index 583e1c74023..61c706ec1a0 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2OrganizationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2ProjectAction.java index 3e6df585357..9b3028f4211 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2ProjectAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDAction.java index a60560db14d..2742de57a60 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDGroupAction.java index dfb19368649..38aa9cbb42e 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2ProjectLoginExpiredAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2ProjectLoginExpiredAction.java index 83cae324e0a..c4d29fa0b2c 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2ProjectLoginExpiredAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2ProjectLoginExpiredAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDGroupFromProjectsAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDGroupFromProjectsAction.java index a670804f856..1e9c7a844df 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDGroupFromProjectsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDGroupFromProjectsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromGroupAction.java index 51b54bde2de..059eaadd64b 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromOrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromOrganizationAction.java index c1eae738074..73fbace48d0 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromOrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromOrganizationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectAction.java index 96f9b59ebcf..b6c8cc5d1e4 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectsAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectsAction.java index 97a67ee6b23..4af1b5dd3e5 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDAction.java index f5c1b087c54..c68621731c0 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDGroupAction.java index 16d4eaaead0..e2a0093e973 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectLoginExpiredAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectLoginExpiredAction.java index 38df38a70e7..62801d2a863 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectLoginExpiredAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectLoginExpiredAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectRetirePolicyAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectRetirePolicyAction.java index 24f903ce22b..2da9ff69f14 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectRetirePolicyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectRetirePolicyAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationOperationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationOperationAction.java index a712dc663b2..5a37e7ba0b6 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationOperationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationOperationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationSupervisorAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationSupervisorAction.java index 97cc2963cc6..7becf8890a6 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationSupervisorAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationSupervisorAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/StopAllResourcesInIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/StopAllResourcesInIAM2ProjectAction.java index c63aa50b88d..7d67375a787 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/StopAllResourcesInIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/StopAllResourcesInIAM2ProjectAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAction.java index ad6506acf8c..1a1b54b6674 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAttributeAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAttributeAction.java index 83a66ee2d3b..a5c443fb0f9 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAttributeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAttributeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAction.java index c69898d3ef8..2f0a74e0512 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAttributeAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAttributeAction.java index cf980b8e938..23c9d3f5b19 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAttributeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAttributeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectTemplateAction.java index 2e91ce544b4..9aa845c8cf3 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAction.java index 053860e40bd..0d2ff845d36 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAttributeAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAttributeAction.java index 252aba3c19f..4f4b27d556a 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAttributeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAttributeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAction.java index 757210c6de1..a99c327fd18 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAttributeAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAttributeAction.java index 09b8eae4bd4..ec0e6d632c0 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAttributeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAttributeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateOrganizationQuotaAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateOrganizationQuotaAction.java index 5c2293bf9db..4120588a601 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateOrganizationQuotaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateOrganizationQuotaAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerClusterCandidatesAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerClusterCandidatesAction.java index c8b4ba46056..833cae3a426 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerClusterCandidatesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerClusterCandidatesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsAction.java index 07f4dd84749..729ac3eee72 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesAction.java index 8bd4638d381..fca77c8c9c1 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectRepositoryAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectRepositoryAction.java index cba3da80379..f7d21280770 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectRepositoryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectRepositoryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/SetIAM2ProjectContainerClusterAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/SetIAM2ProjectContainerClusterAction.java index 10ea4c31d00..0abbe00ba87 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/container/SetIAM2ProjectContainerClusterAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/SetIAM2ProjectContainerClusterAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/identity/role/api/AddPolicyStatementsToRoleAction.java b/sdk/src/main/java/org/zstack/sdk/identity/role/api/AddPolicyStatementsToRoleAction.java index e832bb48d6c..d6ce00fe8ff 100644 --- a/sdk/src/main/java/org/zstack/sdk/identity/role/api/AddPolicyStatementsToRoleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/identity/role/api/AddPolicyStatementsToRoleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/identity/role/api/AttachPolicyToRoleAction.java b/sdk/src/main/java/org/zstack/sdk/identity/role/api/AttachPolicyToRoleAction.java index d49a3425f04..d03fc7eb7e1 100644 --- a/sdk/src/main/java/org/zstack/sdk/identity/role/api/AttachPolicyToRoleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/identity/role/api/AttachPolicyToRoleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/identity/role/api/AttachRoleToAccountAction.java b/sdk/src/main/java/org/zstack/sdk/identity/role/api/AttachRoleToAccountAction.java index 2f2dad88fe8..ff8cf2db9c2 100644 --- a/sdk/src/main/java/org/zstack/sdk/identity/role/api/AttachRoleToAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/identity/role/api/AttachRoleToAccountAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/identity/role/api/ChangeRoleStateAction.java b/sdk/src/main/java/org/zstack/sdk/identity/role/api/ChangeRoleStateAction.java index 59c6f30d19d..462e907d110 100644 --- a/sdk/src/main/java/org/zstack/sdk/identity/role/api/ChangeRoleStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/identity/role/api/ChangeRoleStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/identity/role/api/CreateRoleAction.java b/sdk/src/main/java/org/zstack/sdk/identity/role/api/CreateRoleAction.java index 0afc3d658ad..7ff86d554e7 100644 --- a/sdk/src/main/java/org/zstack/sdk/identity/role/api/CreateRoleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/identity/role/api/CreateRoleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/identity/role/api/DeleteRoleAction.java b/sdk/src/main/java/org/zstack/sdk/identity/role/api/DeleteRoleAction.java index 41a8424a486..4964f795dd8 100644 --- a/sdk/src/main/java/org/zstack/sdk/identity/role/api/DeleteRoleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/identity/role/api/DeleteRoleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/identity/role/api/DetachPolicyFromRoleAction.java b/sdk/src/main/java/org/zstack/sdk/identity/role/api/DetachPolicyFromRoleAction.java index b6ebf312817..e01ba299d0e 100644 --- a/sdk/src/main/java/org/zstack/sdk/identity/role/api/DetachPolicyFromRoleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/identity/role/api/DetachPolicyFromRoleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/identity/role/api/DetachRoleFromAccountAction.java b/sdk/src/main/java/org/zstack/sdk/identity/role/api/DetachRoleFromAccountAction.java index 346d675e7ee..c62494b9dae 100644 --- a/sdk/src/main/java/org/zstack/sdk/identity/role/api/DetachRoleFromAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/identity/role/api/DetachRoleFromAccountAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/identity/role/api/QueryRoleAction.java b/sdk/src/main/java/org/zstack/sdk/identity/role/api/QueryRoleAction.java index b5e16e6ccce..52c53501044 100644 --- a/sdk/src/main/java/org/zstack/sdk/identity/role/api/QueryRoleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/identity/role/api/QueryRoleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/identity/role/api/RemovePolicyStatementsFromRoleAction.java b/sdk/src/main/java/org/zstack/sdk/identity/role/api/RemovePolicyStatementsFromRoleAction.java index 4933cfb8415..129342a317f 100644 --- a/sdk/src/main/java/org/zstack/sdk/identity/role/api/RemovePolicyStatementsFromRoleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/identity/role/api/RemovePolicyStatementsFromRoleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/identity/role/api/UpdateRoleAction.java b/sdk/src/main/java/org/zstack/sdk/identity/role/api/UpdateRoleAction.java index 28ab46551cd..11ee40df702 100644 --- a/sdk/src/main/java/org/zstack/sdk/identity/role/api/UpdateRoleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/identity/role/api/UpdateRoleAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/DegradeFromLicenseServerAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/DegradeFromLicenseServerAction.java index 63c9e9edc32..7458c9d5558 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/DegradeFromLicenseServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/DegradeFromLicenseServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityAction.java index 510d48226c1..d52df9eecd9 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseNodeUsageDetailsAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseNodeUsageDetailsAction.java index 68d804723ff..61cff2ffd47 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseNodeUsageDetailsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseNodeUsageDetailsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/IsLicenseServerAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/IsLicenseServerAction.java index e590a853801..33d48e4d0b9 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/IsLicenseServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/IsLicenseServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/QueryLicenseAuthorizedNodeAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/QueryLicenseAuthorizedNodeAction.java index b4d633f3d96..1e6d26c5bc1 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/QueryLicenseAuthorizedNodeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/QueryLicenseAuthorizedNodeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/RegisterLicenseServerAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/RegisterLicenseServerAction.java index 14ddda4da72..2cc464d187b 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/RegisterLicenseServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/RegisterLicenseServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityAction.java index 8e632d9428c..9a9453bd400 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/SyncLicenseCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/SyncLicenseCapacityAction.java index 7610c600282..52e6044ce06 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/SyncLicenseCapacityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/SyncLicenseCapacityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseRequestedApplicationAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseRequestedApplicationAction.java index 727c9605895..9aaf5bf6ab8 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseRequestedApplicationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseRequestedApplicationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseServerAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseServerAction.java index 8c9669b4fd6..2c9041f8c4d 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerAction.java index f3ea01c77e7..17ef63f0ee4 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerAction.java index 7cce409fdbf..3c7f9838661 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/WithdrawLicenseCapacityApplicationAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/WithdrawLicenseCapacityApplicationAction.java index 6334e2ec530..1672026488a 100644 --- a/sdk/src/main/java/org/zstack/sdk/license/api/server/WithdrawLicenseCapacityApplicationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/WithdrawLicenseCapacityApplicationAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/AddSNSSmsReceiverAction.java b/sdk/src/main/java/org/zstack/sdk/sns/AddSNSSmsReceiverAction.java index 35324213240..0b61ff5c9a1 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/AddSNSSmsReceiverAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/AddSNSSmsReceiverAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/ChangeSNSApplicationEndpointStateAction.java b/sdk/src/main/java/org/zstack/sdk/sns/ChangeSNSApplicationEndpointStateAction.java index 64c16ec4b97..0eb9d778eec 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/ChangeSNSApplicationEndpointStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/ChangeSNSApplicationEndpointStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/ChangeSNSApplicationPlatformStateAction.java b/sdk/src/main/java/org/zstack/sdk/sns/ChangeSNSApplicationPlatformStateAction.java index 1479afeb011..72023e49b30 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/ChangeSNSApplicationPlatformStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/ChangeSNSApplicationPlatformStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/ChangeSNSTopicStateAction.java b/sdk/src/main/java/org/zstack/sdk/sns/ChangeSNSTopicStateAction.java index 13b357987d5..988c59188f1 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/ChangeSNSTopicStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/ChangeSNSTopicStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/CreateSNSTopicAction.java b/sdk/src/main/java/org/zstack/sdk/sns/CreateSNSTopicAction.java index bb015db72fa..c546ec97872 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/CreateSNSTopicAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/CreateSNSTopicAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/DeleteSNSApplicationEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/DeleteSNSApplicationEndpointAction.java index 0c15298903d..06a32b87325 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/DeleteSNSApplicationEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/DeleteSNSApplicationEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/DeleteSNSApplicationPlatformAction.java b/sdk/src/main/java/org/zstack/sdk/sns/DeleteSNSApplicationPlatformAction.java index 243b476f807..130f23ec4bb 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/DeleteSNSApplicationPlatformAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/DeleteSNSApplicationPlatformAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/DeleteSNSTopicAction.java b/sdk/src/main/java/org/zstack/sdk/sns/DeleteSNSTopicAction.java index 973e03c8682..5c8b62d6ea5 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/DeleteSNSTopicAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/DeleteSNSTopicAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/QuerySNSApplicationEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/QuerySNSApplicationEndpointAction.java index d7628ae0c5e..a95c6a5b443 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/QuerySNSApplicationEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/QuerySNSApplicationEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/QuerySNSApplicationPlatformAction.java b/sdk/src/main/java/org/zstack/sdk/sns/QuerySNSApplicationPlatformAction.java index 41a58d9227d..18d57b28ce7 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/QuerySNSApplicationPlatformAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/QuerySNSApplicationPlatformAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/QuerySNSSmsEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/QuerySNSSmsEndpointAction.java index 74efa5b9e9c..5a21b6e1a54 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/QuerySNSSmsEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/QuerySNSSmsEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/QuerySNSTopicAction.java b/sdk/src/main/java/org/zstack/sdk/sns/QuerySNSTopicAction.java index a440ce5a183..1bcdd3859f0 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/QuerySNSTopicAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/QuerySNSTopicAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/QuerySNSTopicSubscriberAction.java b/sdk/src/main/java/org/zstack/sdk/sns/QuerySNSTopicSubscriberAction.java index c7ddc4c142d..036b8d98db5 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/QuerySNSTopicSubscriberAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/QuerySNSTopicSubscriberAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/RemoveSNSSmsReceiverAction.java b/sdk/src/main/java/org/zstack/sdk/sns/RemoveSNSSmsReceiverAction.java index b96e5cb3fa7..4d17d3b41ff 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/RemoveSNSSmsReceiverAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/RemoveSNSSmsReceiverAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/SubscribeSNSTopicAction.java b/sdk/src/main/java/org/zstack/sdk/sns/SubscribeSNSTopicAction.java index 9adabbe3ec8..1496c3c985c 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/SubscribeSNSTopicAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/SubscribeSNSTopicAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/UnsubscribeSNSTopicAction.java b/sdk/src/main/java/org/zstack/sdk/sns/UnsubscribeSNSTopicAction.java index dc978bc9657..411972f64e9 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/UnsubscribeSNSTopicAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/UnsubscribeSNSTopicAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/UpdateSNSApplicationEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/UpdateSNSApplicationEndpointAction.java index 8f1855de02c..95470935887 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/UpdateSNSApplicationEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/UpdateSNSApplicationEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/UpdateSNSApplicationPlatformAction.java b/sdk/src/main/java/org/zstack/sdk/sns/UpdateSNSApplicationPlatformAction.java index ba5f3ce0c41..302c40f073e 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/UpdateSNSApplicationPlatformAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/UpdateSNSApplicationPlatformAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/UpdateSNSTopicAction.java b/sdk/src/main/java/org/zstack/sdk/sns/UpdateSNSTopicAction.java index dd1c531979e..9c9e2ad234e 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/UpdateSNSTopicAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/UpdateSNSTopicAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/aliyunsms/CreateSNSAliyunSmsEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/aliyunsms/CreateSNSAliyunSmsEndpointAction.java index 0c0fdc89887..413beeeaf13 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/aliyunsms/CreateSNSAliyunSmsEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/aliyunsms/CreateSNSAliyunSmsEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/aliyunsms/ValidateSNSAliyunSmsEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/aliyunsms/ValidateSNSAliyunSmsEndpointAction.java index 1c570b67a56..1a52405ccb7 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/aliyunsms/ValidateSNSAliyunSmsEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/aliyunsms/ValidateSNSAliyunSmsEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/AddSNSDingTalkAtPersonAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/AddSNSDingTalkAtPersonAction.java index 39637a75f03..ef6a0762cf7 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/AddSNSDingTalkAtPersonAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/AddSNSDingTalkAtPersonAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/CreateSNSDingTalkEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/CreateSNSDingTalkEndpointAction.java index 5f8947f9d09..0abefdb1b3b 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/CreateSNSDingTalkEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/CreateSNSDingTalkEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/QuerySNSDingTalkAtPersonAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/QuerySNSDingTalkAtPersonAction.java index 63cbff2db04..a2d53a01142 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/QuerySNSDingTalkAtPersonAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/QuerySNSDingTalkAtPersonAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/QuerySNSDingTalkEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/QuerySNSDingTalkEndpointAction.java index 4ad87bc27ed..f319905e4e5 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/QuerySNSDingTalkEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/QuerySNSDingTalkEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/RemoveSNSDingTalkAtPersonAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/RemoveSNSDingTalkAtPersonAction.java index 094764be42b..6c6aaf8d751 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/RemoveSNSDingTalkAtPersonAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/RemoveSNSDingTalkAtPersonAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/SNSDingTalkTestConnectionAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/SNSDingTalkTestConnectionAction.java index 2dbb1bc6474..2663fe2309b 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/SNSDingTalkTestConnectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/SNSDingTalkTestConnectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/UpdateAtPersonOfAtDingTalkEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/UpdateAtPersonOfAtDingTalkEndpointAction.java index cef26806645..733229cd630 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/UpdateAtPersonOfAtDingTalkEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/UpdateAtPersonOfAtDingTalkEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/UpdateSNSDingTalkEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/UpdateSNSDingTalkEndpointAction.java index 2ba9e03a747..787a0c79f21 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/UpdateSNSDingTalkEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/dingtalk/UpdateSNSDingTalkEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/AddEmailAddressToSNSEmailEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/AddEmailAddressToSNSEmailEndpointAction.java index 69d85314a6b..af2822d6de9 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/AddEmailAddressToSNSEmailEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/AddEmailAddressToSNSEmailEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/CreateSNSEmailEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/CreateSNSEmailEndpointAction.java index 9aaf51049c7..17934b45d06 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/CreateSNSEmailEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/CreateSNSEmailEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/CreateSNSEmailPlatformAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/CreateSNSEmailPlatformAction.java index 609c5327014..a3dac206fbe 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/CreateSNSEmailPlatformAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/CreateSNSEmailPlatformAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/DeleteEmailAddressOfSNSEmailEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/DeleteEmailAddressOfSNSEmailEndpointAction.java index 4903a2bb836..2241c01cfe1 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/DeleteEmailAddressOfSNSEmailEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/DeleteEmailAddressOfSNSEmailEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/QuerySNSEmailAddressAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/QuerySNSEmailAddressAction.java index dab16a12a82..bc255e0da52 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/QuerySNSEmailAddressAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/QuerySNSEmailAddressAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/QuerySNSEmailEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/QuerySNSEmailEndpointAction.java index a00dd2844d3..0948aa18ae3 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/QuerySNSEmailEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/QuerySNSEmailEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/QuerySNSEmailPlatformAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/QuerySNSEmailPlatformAction.java index 7a3820165da..555165fd56a 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/QuerySNSEmailPlatformAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/QuerySNSEmailPlatformAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/SNSEmailTestConnectionAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/SNSEmailTestConnectionAction.java index 6da8fc35baf..505b83fdefc 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/SNSEmailTestConnectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/SNSEmailTestConnectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/UpdateEmailAddressOfSNSEmailEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/UpdateEmailAddressOfSNSEmailEndpointAction.java index 5746ebacd86..116c6b1f8ca 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/UpdateEmailAddressOfSNSEmailEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/UpdateEmailAddressOfSNSEmailEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/ValidateSNSEmailPlatformAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/ValidateSNSEmailPlatformAction.java index 5b0914bc88f..aca533801de 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/ValidateSNSEmailPlatformAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/ValidateSNSEmailPlatformAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/AddSNSFeiShuAtPersonAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/AddSNSFeiShuAtPersonAction.java index 895ded49891..99713b00c57 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/AddSNSFeiShuAtPersonAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/AddSNSFeiShuAtPersonAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/CreateSNSFeiShuEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/CreateSNSFeiShuEndpointAction.java index 40ffa9bd6bb..7f2e86d28ae 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/CreateSNSFeiShuEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/CreateSNSFeiShuEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/QuerySNSFeiShuAtPersonAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/QuerySNSFeiShuAtPersonAction.java index 11fefcd7ffa..bc912fb2de5 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/QuerySNSFeiShuAtPersonAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/QuerySNSFeiShuAtPersonAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/QuerySNSFeiShuEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/QuerySNSFeiShuEndpointAction.java index 80a107d9b2a..af1e1414f21 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/QuerySNSFeiShuEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/QuerySNSFeiShuEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/RemoveSNSFeiShuAtPersonAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/RemoveSNSFeiShuAtPersonAction.java index f1e2b8d6c9f..33fa7142aea 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/RemoveSNSFeiShuAtPersonAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/RemoveSNSFeiShuAtPersonAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/SNSFeiShuTestConnectionAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/SNSFeiShuTestConnectionAction.java index 835b4442f91..ebf92c289f7 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/SNSFeiShuTestConnectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/SNSFeiShuTestConnectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/UpdateAtPersonOfAtFeiShuEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/UpdateAtPersonOfAtFeiShuEndpointAction.java index b4aabb43ec9..ab5fed1c8e1 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/UpdateAtPersonOfAtFeiShuEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/UpdateAtPersonOfAtFeiShuEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/UpdateSNSFeiShuEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/UpdateSNSFeiShuEndpointAction.java index 68b6c2cd9f1..d457ed476a5 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/UpdateSNSFeiShuEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/feishu/UpdateSNSFeiShuEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/http/CreateSNSHttpEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/http/CreateSNSHttpEndpointAction.java index 254a4535b5d..d8ed35c5150 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/http/CreateSNSHttpEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/http/CreateSNSHttpEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/http/QuerySNSHttpEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/http/QuerySNSHttpEndpointAction.java index ffbce0cec63..d991568b8b3 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/http/QuerySNSHttpEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/http/QuerySNSHttpEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/http/SNSHttpTestConnectionAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/http/SNSHttpTestConnectionAction.java index e09630c166b..8f283b06731 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/http/SNSHttpTestConnectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/http/SNSHttpTestConnectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/http/UpdateSNSHttpEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/http/UpdateSNSHttpEndpointAction.java index 0f89264ac22..ff95150bff0 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/http/UpdateSNSHttpEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/http/UpdateSNSHttpEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/microsoftteams/CreateSNSMicrosoftTeamsEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/microsoftteams/CreateSNSMicrosoftTeamsEndpointAction.java index 3dbff3c1891..552965979d0 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/microsoftteams/CreateSNSMicrosoftTeamsEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/microsoftteams/CreateSNSMicrosoftTeamsEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/microsoftteams/QuerySNSMicrosoftTeamsEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/microsoftteams/QuerySNSMicrosoftTeamsEndpointAction.java index f26a3466cbe..8deb8496bf4 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/microsoftteams/QuerySNSMicrosoftTeamsEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/microsoftteams/QuerySNSMicrosoftTeamsEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/microsoftteams/SNSMicrosoftTeamsTestConnectionAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/microsoftteams/SNSMicrosoftTeamsTestConnectionAction.java index 146c2b4860a..f850d5e4bd1 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/microsoftteams/SNSMicrosoftTeamsTestConnectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/microsoftteams/SNSMicrosoftTeamsTestConnectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/microsoftteams/UpdateSNSMicrosoftTeamsEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/microsoftteams/UpdateSNSMicrosoftTeamsEndpointAction.java index e05c877d54b..2b0d7e52e39 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/microsoftteams/UpdateSNSMicrosoftTeamsEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/microsoftteams/UpdateSNSMicrosoftTeamsEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointAction.java index 88c0b681aff..b4f3740153e 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/QuerySNSPluginEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/QuerySNSPluginEndpointAction.java index 296635f110b..19b95497093 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/QuerySNSPluginEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/QuerySNSPluginEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/snmp/CreateSNSSnmpEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/snmp/CreateSNSSnmpEndpointAction.java index 010aa44fe7f..85d45bcd371 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/snmp/CreateSNSSnmpEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/snmp/CreateSNSSnmpEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/snmp/CreateSNSSnmpPlatformAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/snmp/CreateSNSSnmpPlatformAction.java index 6ce4f3e1c4d..c6e9b0df754 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/snmp/CreateSNSSnmpPlatformAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/snmp/CreateSNSSnmpPlatformAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/snmp/QuerySNSSnmpPlatformAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/snmp/QuerySNSSnmpPlatformAction.java index c7847ee16fe..7744f1ed930 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/snmp/QuerySNSSnmpPlatformAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/snmp/QuerySNSSnmpPlatformAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/snmp/SNSSnmpTestConnectionAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/snmp/SNSSnmpTestConnectionAction.java index 89820d7d833..4ec51af18b0 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/snmp/SNSSnmpTestConnectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/snmp/SNSSnmpTestConnectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/snmp/UpdateSNSSnmpPlatformAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/snmp/UpdateSNSSnmpPlatformAction.java index 56c5ee91a2f..42e125d79b3 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/snmp/UpdateSNSSnmpPlatformAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/snmp/UpdateSNSSnmpPlatformAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/universalsms/CreateSNSUniversalSmsEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/universalsms/CreateSNSUniversalSmsEndpointAction.java index 787c7cf1349..530fc37c584 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/universalsms/CreateSNSUniversalSmsEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/universalsms/CreateSNSUniversalSmsEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/universalsms/QuerySNSUniversalSmsEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/universalsms/QuerySNSUniversalSmsEndpointAction.java index 250241796f2..87fd7f32975 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/universalsms/QuerySNSUniversalSmsEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/universalsms/QuerySNSUniversalSmsEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/universalsms/UpdateSNSUniversalSmsEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/universalsms/UpdateSNSUniversalSmsEndpointAction.java index daf739c45f2..a8d4da24a60 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/universalsms/UpdateSNSUniversalSmsEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/universalsms/UpdateSNSUniversalSmsEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/universalsms/ValidateSNSUniversalSmsEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/universalsms/ValidateSNSUniversalSmsEndpointAction.java index c257c3b7329..6420cb53aa0 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/universalsms/ValidateSNSUniversalSmsEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/universalsms/ValidateSNSUniversalSmsEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/AddSNSWeComAtPersonAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/AddSNSWeComAtPersonAction.java index dfcf0f8cf80..58a59b17841 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/AddSNSWeComAtPersonAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/AddSNSWeComAtPersonAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/CreateSNSWeComEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/CreateSNSWeComEndpointAction.java index f62b4a8ffe4..c07c4b8213d 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/CreateSNSWeComEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/CreateSNSWeComEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/QuerySNSWeComAtPersonAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/QuerySNSWeComAtPersonAction.java index 23f48b592ba..dedcf738601 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/QuerySNSWeComAtPersonAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/QuerySNSWeComAtPersonAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/QuerySNSWeComEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/QuerySNSWeComEndpointAction.java index 3b778d31ce0..1ac8a6722c9 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/QuerySNSWeComEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/QuerySNSWeComEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/RemoveSNSWeComAtPersonAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/RemoveSNSWeComAtPersonAction.java index 40ab12a7298..72ef1289008 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/RemoveSNSWeComAtPersonAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/RemoveSNSWeComAtPersonAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/SNSWeComTestConnectionAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/SNSWeComTestConnectionAction.java index 0e01e29bd4b..973181cac35 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/SNSWeComTestConnectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/SNSWeComTestConnectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/UpdateAtPersonOfAtWeComEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/UpdateAtPersonOfAtWeComEndpointAction.java index 8682af91990..20d0707e855 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/UpdateAtPersonOfAtWeComEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/UpdateAtPersonOfAtWeComEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/UpdateSNSWeComEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/UpdateSNSWeComEndpointAction.java index 20034054e65..f73fa911cee 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/UpdateSNSWeComEndpointAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/wecom/UpdateSNSWeComEndpointAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ticket/api/AddTicketTypesToTicketFlowCollectionAction.java b/sdk/src/main/java/org/zstack/sdk/ticket/api/AddTicketTypesToTicketFlowCollectionAction.java index 441b7390f31..c1cdadc8285 100644 --- a/sdk/src/main/java/org/zstack/sdk/ticket/api/AddTicketTypesToTicketFlowCollectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ticket/api/AddTicketTypesToTicketFlowCollectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ticket/api/ChangeTicketFlowCollectionStateAction.java b/sdk/src/main/java/org/zstack/sdk/ticket/api/ChangeTicketFlowCollectionStateAction.java index c3e53209657..595771f41b5 100644 --- a/sdk/src/main/java/org/zstack/sdk/ticket/api/ChangeTicketFlowCollectionStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ticket/api/ChangeTicketFlowCollectionStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ticket/api/ChangeTicketStatusAction.java b/sdk/src/main/java/org/zstack/sdk/ticket/api/ChangeTicketStatusAction.java index fe627a40a68..60d8d3ea2bb 100644 --- a/sdk/src/main/java/org/zstack/sdk/ticket/api/ChangeTicketStatusAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ticket/api/ChangeTicketStatusAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ticket/api/CreateTicketAction.java b/sdk/src/main/java/org/zstack/sdk/ticket/api/CreateTicketAction.java index 8a8c907558a..ac8bd3c7b38 100644 --- a/sdk/src/main/java/org/zstack/sdk/ticket/api/CreateTicketAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ticket/api/CreateTicketAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ticket/api/DeleteTicketAction.java b/sdk/src/main/java/org/zstack/sdk/ticket/api/DeleteTicketAction.java index 95ef5c87d68..6aab00c1d17 100644 --- a/sdk/src/main/java/org/zstack/sdk/ticket/api/DeleteTicketAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ticket/api/DeleteTicketAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ticket/api/DeleteTicketFlowCollectionAction.java b/sdk/src/main/java/org/zstack/sdk/ticket/api/DeleteTicketFlowCollectionAction.java index 40fd796b65e..5ff06769fa1 100644 --- a/sdk/src/main/java/org/zstack/sdk/ticket/api/DeleteTicketFlowCollectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ticket/api/DeleteTicketFlowCollectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryArchiveTicketAction.java b/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryArchiveTicketAction.java index c9d6c8856c0..7219b127872 100644 --- a/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryArchiveTicketAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryArchiveTicketAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryArchiveTicketHistoryAction.java b/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryArchiveTicketHistoryAction.java index 751079db434..4c2b141c971 100644 --- a/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryArchiveTicketHistoryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryArchiveTicketHistoryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryTicketAction.java b/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryTicketAction.java index 6e802e1838e..18ade169f7b 100644 --- a/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryTicketAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryTicketAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryTicketFlowAction.java b/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryTicketFlowAction.java index d447bbf75ed..d7cd2cc90bc 100644 --- a/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryTicketFlowAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryTicketFlowAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryTicketFlowCollectionAction.java b/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryTicketFlowCollectionAction.java index 740b2339ca4..db83e87ad23 100644 --- a/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryTicketFlowCollectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryTicketFlowCollectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryTicketHistoryAction.java b/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryTicketHistoryAction.java index 0b95d9ec94e..f99d5fe7a57 100644 --- a/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryTicketHistoryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryTicketHistoryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryTicketTypeAction.java b/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryTicketTypeAction.java index db6335e6436..ce4138c2087 100644 --- a/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryTicketTypeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ticket/api/QueryTicketTypeAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ticket/api/RemoveTicketTypesFromTicketFlowCollectionAction.java b/sdk/src/main/java/org/zstack/sdk/ticket/api/RemoveTicketTypesFromTicketFlowCollectionAction.java index 397a3baf729..983475b24e5 100644 --- a/sdk/src/main/java/org/zstack/sdk/ticket/api/RemoveTicketTypesFromTicketFlowCollectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ticket/api/RemoveTicketTypesFromTicketFlowCollectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ticket/api/UpdateTicketRequestAction.java b/sdk/src/main/java/org/zstack/sdk/ticket/api/UpdateTicketRequestAction.java index a4cef75fbb4..39ae12e350e 100644 --- a/sdk/src/main/java/org/zstack/sdk/ticket/api/UpdateTicketRequestAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ticket/api/UpdateTicketRequestAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ticket/iam2/api/AddIAM2TicketFlowAction.java b/sdk/src/main/java/org/zstack/sdk/ticket/iam2/api/AddIAM2TicketFlowAction.java index 1995014c803..1cc0c916ec0 100644 --- a/sdk/src/main/java/org/zstack/sdk/ticket/iam2/api/AddIAM2TicketFlowAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ticket/iam2/api/AddIAM2TicketFlowAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ticket/iam2/api/CreateIAM2TickFlowCollectionAction.java b/sdk/src/main/java/org/zstack/sdk/ticket/iam2/api/CreateIAM2TickFlowCollectionAction.java index 7f61494eca6..05ea0189fe7 100644 --- a/sdk/src/main/java/org/zstack/sdk/ticket/iam2/api/CreateIAM2TickFlowCollectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ticket/iam2/api/CreateIAM2TickFlowCollectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ticket/iam2/api/DeleteIAM2TicketFlowAction.java b/sdk/src/main/java/org/zstack/sdk/ticket/iam2/api/DeleteIAM2TicketFlowAction.java index 64689218122..cfe39b250ff 100644 --- a/sdk/src/main/java/org/zstack/sdk/ticket/iam2/api/DeleteIAM2TicketFlowAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ticket/iam2/api/DeleteIAM2TicketFlowAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ticket/iam2/api/UpdateIAM2TicketFlowAction.java b/sdk/src/main/java/org/zstack/sdk/ticket/iam2/api/UpdateIAM2TicketFlowAction.java index 33a8548336e..a87c3ecd80c 100644 --- a/sdk/src/main/java/org/zstack/sdk/ticket/iam2/api/UpdateIAM2TicketFlowAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ticket/iam2/api/UpdateIAM2TicketFlowAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/ticket/iam2/api/UpdateIAM2TicketFlowCollectionAction.java b/sdk/src/main/java/org/zstack/sdk/ticket/iam2/api/UpdateIAM2TicketFlowCollectionAction.java index e3ddf352383..91adf0266ac 100644 --- a/sdk/src/main/java/org/zstack/sdk/ticket/iam2/api/UpdateIAM2TicketFlowCollectionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ticket/iam2/api/UpdateIAM2TicketFlowCollectionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AckAlarmDataAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AckAlarmDataAction.java index cef7ef4838a..4a27325fe0f 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AckAlarmDataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AckAlarmDataAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AckEventDataAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AckEventDataAction.java index 981caa40099..b6cb6c99758 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AckEventDataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AckEventDataAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AddActionToAlarmAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AddActionToAlarmAction.java index 9fdf8626123..d11251e92f5 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AddActionToAlarmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AddActionToAlarmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AddActionToEventSubscriptionAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AddActionToEventSubscriptionAction.java index b812bfe7281..245cc69b434 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AddActionToEventSubscriptionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AddActionToEventSubscriptionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AddLabelToAlarmAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AddLabelToAlarmAction.java index c77bbb562f4..95b4d5c6283 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AddLabelToAlarmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AddLabelToAlarmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AddLabelToEventSubscriptionAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AddLabelToEventSubscriptionAction.java index e0345a1a608..8ccf1dab133 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AddLabelToEventSubscriptionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AddLabelToEventSubscriptionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/ChangeAlarmStateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/ChangeAlarmStateAction.java index 1073da702e8..212c254eda7 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/ChangeAlarmStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/ChangeAlarmStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/ChangeEventSubscriptionStateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/ChangeEventSubscriptionStateAction.java index 723f190c944..9806b03ab7a 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/ChangeEventSubscriptionStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/ChangeEventSubscriptionStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/CreateAlarmAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/CreateAlarmAction.java index 01fbc19860f..e61033eabf4 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/CreateAlarmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/CreateAlarmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/DeleteAlarmAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/DeleteAlarmAction.java index 0633bd9453e..1cc6f8c5470 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/DeleteAlarmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/DeleteAlarmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/GetTextTemplateArgAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/GetTextTemplateArgAction.java index a8201fc47fa..8b0daa4bc86 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/GetTextTemplateArgAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/GetTextTemplateArgAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/QueryAlarmAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/QueryAlarmAction.java index 589b8d07764..4b37d062aa8 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/QueryAlarmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/QueryAlarmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/QueryAlertDataAckAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/QueryAlertDataAckAction.java index 53066bb329a..80f29378cc7 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/QueryAlertDataAckAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/QueryAlertDataAckAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/QueryEventSubscriptionAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/QueryEventSubscriptionAction.java index a396095182b..e02f1e07ff8 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/QueryEventSubscriptionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/QueryEventSubscriptionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/RemoveActionFromAlarmAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/RemoveActionFromAlarmAction.java index a3dd078830f..f85611f9d7d 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/RemoveActionFromAlarmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/RemoveActionFromAlarmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/RemoveActionFromEventSubscriptionAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/RemoveActionFromEventSubscriptionAction.java index fb34e9523f4..90963c04481 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/RemoveActionFromEventSubscriptionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/RemoveActionFromEventSubscriptionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/RemoveLabelFromAlarmAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/RemoveLabelFromAlarmAction.java index c3d3e219e9b..f17a40e4fdf 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/RemoveLabelFromAlarmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/RemoveLabelFromAlarmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/RemoveLabelFromEventSubscriptionAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/RemoveLabelFromEventSubscriptionAction.java index b6bd3afb776..f7ee545a60c 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/RemoveLabelFromEventSubscriptionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/RemoveLabelFromEventSubscriptionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/SubscribeEventAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/SubscribeEventAction.java index 78512035bec..0cebac7f92a 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/SubscribeEventAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/SubscribeEventAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UnsubscribeEventAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UnsubscribeEventAction.java index 73bca886e94..756da9efb03 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UnsubscribeEventAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UnsubscribeEventAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateAlarmAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateAlarmAction.java index ee64ddbf58c..29656c5c256 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateAlarmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateAlarmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateAlarmLabelAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateAlarmLabelAction.java index 23246bc1077..a953f33e32b 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateAlarmLabelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateAlarmLabelAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateAlertDataAckAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateAlertDataAckAction.java index fc81682d8bd..64e141d1a3b 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateAlertDataAckAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateAlertDataAckAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateEventSubscriptionLabelAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateEventSubscriptionLabelAction.java index 252929e308e..72ca93b90bf 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateEventSubscriptionLabelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateEventSubscriptionLabelAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateSubscribeEventAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateSubscribeEventAction.java index 3da70032b13..7bec488aaf6 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateSubscribeEventAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateSubscribeEventAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/activealarm/api/ChangeActiveAlarmStateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/activealarm/api/ChangeActiveAlarmStateAction.java index 94b745954bd..f97d68d88f6 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/activealarm/api/ChangeActiveAlarmStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/activealarm/api/ChangeActiveAlarmStateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/activealarm/api/GetActiveAlarmStatusAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/activealarm/api/GetActiveAlarmStatusAction.java index 40b3ed81472..224b8c1c85c 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/activealarm/api/GetActiveAlarmStatusAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/activealarm/api/GetActiveAlarmStatusAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/activealarm/api/QueryActiveAlarmAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/activealarm/api/QueryActiveAlarmAction.java index ff0a24d4289..f9e42861421 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/activealarm/api/QueryActiveAlarmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/activealarm/api/QueryActiveAlarmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/activealarm/api/QueryActiveAlarmTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/activealarm/api/QueryActiveAlarmTemplateAction.java index 333120ce5f8..c1464e72525 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/activealarm/api/QueryActiveAlarmTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/activealarm/api/QueryActiveAlarmTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/activealarm/api/UpdateActiveAlarmTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/activealarm/api/UpdateActiveAlarmTemplateAction.java index 1ce16249266..b029b468a6b 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/activealarm/api/UpdateActiveAlarmTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/activealarm/api/UpdateActiveAlarmTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/CreateSNSTextTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/CreateSNSTextTemplateAction.java index f89a0449d43..af00f0fefce 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/CreateSNSTextTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/CreateSNSTextTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/DeleteSNSTextTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/DeleteSNSTextTemplateAction.java index 74683946d1a..dc68a3741f3 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/DeleteSNSTextTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/DeleteSNSTextTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/QuerySNSTextTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/QuerySNSTextTemplateAction.java index 704c952373f..469abe3e3f7 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/QuerySNSTextTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/QuerySNSTextTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/UpdateSNSTextTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/UpdateSNSTextTemplateAction.java index 5b269c8b833..f2a277bec24 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/UpdateSNSTextTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/UpdateSNSTextTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/template/aliyunsms/CreateAliyunSmsSNSTextTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/template/aliyunsms/CreateAliyunSmsSNSTextTemplateAction.java index 69422bcadfa..831bc6e9f38 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/template/aliyunsms/CreateAliyunSmsSNSTextTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/template/aliyunsms/CreateAliyunSmsSNSTextTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/template/aliyunsms/QueryAliyunSmsSNSTextTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/template/aliyunsms/QueryAliyunSmsSNSTextTemplateAction.java index b2acb875708..940ff12a010 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/template/aliyunsms/QueryAliyunSmsSNSTextTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/template/aliyunsms/QueryAliyunSmsSNSTextTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/template/aliyunsms/UpdateAliyunSmsSNSTextTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/template/aliyunsms/UpdateAliyunSmsSNSTextTemplateAction.java index d752406bcb0..27fc9c7d38c 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/template/aliyunsms/UpdateAliyunSmsSNSTextTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/sns/template/aliyunsms/UpdateAliyunSmsSNSTextTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/CreateMetricDataHttpReceiverAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/CreateMetricDataHttpReceiverAction.java index 44bdc41c98a..9c1b0e055a6 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/CreateMetricDataHttpReceiverAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/CreateMetricDataHttpReceiverAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/CreateMetricTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/CreateMetricTemplateAction.java index 9f7a9979fca..3aa5c5dde60 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/CreateMetricTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/CreateMetricTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/DeleteMetricDataAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/DeleteMetricDataAction.java index 24affc9750a..da805b8e61e 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/DeleteMetricDataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/DeleteMetricDataAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/DeleteMetricDataHttpReceiverAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/DeleteMetricDataHttpReceiverAction.java index 58511047277..4511f99ff02 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/DeleteMetricDataHttpReceiverAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/DeleteMetricDataHttpReceiverAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/DeleteMetricTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/DeleteMetricTemplateAction.java index 8ac195b6c5f..2f6034aadd4 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/DeleteMetricTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/DeleteMetricTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetAlarmDataAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetAlarmDataAction.java index 692886da32e..8a049ed71ec 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetAlarmDataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetAlarmDataAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetAllEventMetadataAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetAllEventMetadataAction.java index 6be9bf7c0f1..7df3372222a 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetAllEventMetadataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetAllEventMetadataAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetAllMetricMetadataAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetAllMetricMetadataAction.java index 2d63c01b841..6753233c1d5 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetAllMetricMetadataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetAllMetricMetadataAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetAuditDataAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetAuditDataAction.java index 9f1e272b1a8..c9cf1e1cdd4 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetAuditDataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetAuditDataAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetEventDataAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetEventDataAction.java index 9896538ea03..d9cbf4c26aa 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetEventDataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetEventDataAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetManagementNodeDirCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetManagementNodeDirCapacityAction.java index 45189fbe8b1..7cbf5b3da91 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetManagementNodeDirCapacityAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetManagementNodeDirCapacityAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetMetricDataAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetMetricDataAction.java index 41f913832a1..18e9bdc144e 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetMetricDataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetMetricDataAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetMetricLabelValueAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetMetricLabelValueAction.java index 8cd44121287..4820be8b0b3 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetMetricLabelValueAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetMetricLabelValueAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetPrometheusMetricLabelValueAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetPrometheusMetricLabelValueAction.java index 966d8ed7114..51160b16e02 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetPrometheusMetricLabelValueAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetPrometheusMetricLabelValueAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetZWatchAlertHistogramAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetZWatchAlertHistogramAction.java index f4db6a405f5..07f8127ec17 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetZWatchAlertHistogramAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetZWatchAlertHistogramAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/PutMetricDataAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/PutMetricDataAction.java index af1f2e04c48..4d83a41fd33 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/PutMetricDataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/PutMetricDataAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/QueryAlarmRecordAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/QueryAlarmRecordAction.java index 5ba7bebb147..f077d7edac4 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/QueryAlarmRecordAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/QueryAlarmRecordAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/QueryAuditAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/QueryAuditAction.java index dfee3116bef..eab75445492 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/QueryAuditAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/QueryAuditAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/QueryEventRecordAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/QueryEventRecordAction.java index e5c885ae426..945e696c32e 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/QueryEventRecordAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/QueryEventRecordAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/QueryMetricDataHttpReceiverAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/QueryMetricDataHttpReceiverAction.java index 1ac2445f06e..15e844ebbcc 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/QueryMetricDataHttpReceiverAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/QueryMetricDataHttpReceiverAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/QueryMetricTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/QueryMetricTemplateAction.java index 5ca5618ab46..7a8ff903981 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/QueryMetricTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/QueryMetricTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/UpdateAlarmDataAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/UpdateAlarmDataAction.java index f8224eb1886..2e7634d412b 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/UpdateAlarmDataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/UpdateAlarmDataAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/UpdateEventDataAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/UpdateEventDataAction.java index 9d89ae13e28..b77016b7f52 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/api/UpdateEventDataAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/UpdateEventDataAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/AddEventRuleTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/AddEventRuleTemplateAction.java index 34e3a071322..49dedf0bb15 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/AddEventRuleTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/AddEventRuleTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/AddInstanceToMonitorGroupAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/AddInstanceToMonitorGroupAction.java index 3f613025fad..e65320b8db6 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/AddInstanceToMonitorGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/AddInstanceToMonitorGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/AddMetricRuleTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/AddMetricRuleTemplateAction.java index d668b41938f..cd3e690f2c3 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/AddMetricRuleTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/AddMetricRuleTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/ApplyMonitorTemplateToMonitorGroupAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/ApplyMonitorTemplateToMonitorGroupAction.java index a0c97e352e5..a0f7c885873 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/ApplyMonitorTemplateToMonitorGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/ApplyMonitorTemplateToMonitorGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/CloneMonitorTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/CloneMonitorTemplateAction.java index 2e13e8bdfd6..14cddb1820e 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/CloneMonitorTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/CloneMonitorTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/CreateMonitorGroupAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/CreateMonitorGroupAction.java index 11db3e7374f..d51045f45a1 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/CreateMonitorGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/CreateMonitorGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/CreateMonitorTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/CreateMonitorTemplateAction.java index 01bee36b72e..ef2b96cdca2 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/CreateMonitorTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/CreateMonitorTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/DeleteEventRuleTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/DeleteEventRuleTemplateAction.java index 776223afc93..67fd273464f 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/DeleteEventRuleTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/DeleteEventRuleTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/DeleteMetricRuleTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/DeleteMetricRuleTemplateAction.java index 6c5b3367b55..5f488fc3892 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/DeleteMetricRuleTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/DeleteMetricRuleTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/DeleteMonitorGroupAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/DeleteMonitorGroupAction.java index 6c618a1fefb..c163dd79514 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/DeleteMonitorGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/DeleteMonitorGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/DeleteMonitorTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/DeleteMonitorTemplateAction.java index 033fb778ff4..dcd25ba4af2 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/DeleteMonitorTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/DeleteMonitorTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryEventRuleTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryEventRuleTemplateAction.java index ad6d2e51a75..27274b0ed9c 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryEventRuleTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryEventRuleTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMetricRuleTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMetricRuleTemplateAction.java index e32e5373512..387a66f1ff5 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMetricRuleTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMetricRuleTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorGroupAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorGroupAction.java index 0c44a3ad79a..47fe427cfac 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorGroupAlarmAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorGroupAlarmAction.java index 9994bd858b6..942ac124bf3 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorGroupAlarmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorGroupAlarmAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorGroupEventSubscriptionAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorGroupEventSubscriptionAction.java index a992f9091c4..d310b98a891 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorGroupEventSubscriptionAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorGroupEventSubscriptionAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorGroupInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorGroupInstanceAction.java index f27681eca1e..7fc5121111d 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorGroupInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorGroupInstanceAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorGroupTemplateRefAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorGroupTemplateRefAction.java index ebda18abdd9..23f79f0b79d 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorGroupTemplateRefAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorGroupTemplateRefAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorTemplateAction.java index 3a960ad435e..c84bbb6ef02 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/QueryMonitorTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/RemoveInstanceFromMonitorGroupAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/RemoveInstanceFromMonitorGroupAction.java index 7cf65c387b8..b88e9cd1120 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/RemoveInstanceFromMonitorGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/RemoveInstanceFromMonitorGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/RevokeMonitorTemplateFromMonitorGroupAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/RevokeMonitorTemplateFromMonitorGroupAction.java index 82be3fad8be..647e88da7b8 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/RevokeMonitorTemplateFromMonitorGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/RevokeMonitorTemplateFromMonitorGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/UpdateEventRuleTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/UpdateEventRuleTemplateAction.java index 1fb45a4d64f..e155ac5b9de 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/UpdateEventRuleTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/UpdateEventRuleTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/UpdateMetricRuleTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/UpdateMetricRuleTemplateAction.java index 58dd52d8dfc..e9db09a9e13 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/UpdateMetricRuleTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/UpdateMetricRuleTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/UpdateMonitorGroupAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/UpdateMonitorGroupAction.java index 3a4967be2ae..4d44e1cbba5 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/UpdateMonitorGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/UpdateMonitorGroupAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/UpdateMonitorTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/UpdateMonitorTemplateAction.java index 62d18147c6c..36c35e4d54f 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/UpdateMonitorTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/monitorgroup/api/UpdateMonitorTemplateAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/AddThirdpartyPlatformAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/AddThirdpartyPlatformAction.java index 2aa0bfcf9eb..81fb7522900 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/AddThirdpartyPlatformAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/AddThirdpartyPlatformAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/DeleteThirdpartyPlatformAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/DeleteThirdpartyPlatformAction.java index 0e48f09b04e..138f3a8f059 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/DeleteThirdpartyPlatformAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/DeleteThirdpartyPlatformAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/QuerySNSEndpointThirdpartyAlertHistoryAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/QuerySNSEndpointThirdpartyAlertHistoryAction.java index b382733d9f9..114e08bc895 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/QuerySNSEndpointThirdpartyAlertHistoryAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/QuerySNSEndpointThirdpartyAlertHistoryAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/QueryThirdpartyAlertAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/QueryThirdpartyAlertAction.java index 620d7a0c193..501b72d0401 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/QueryThirdpartyAlertAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/QueryThirdpartyAlertAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/QueryThirdpartyPlatformAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/QueryThirdpartyPlatformAction.java index 2878b6c9adf..d4d646fc165 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/QueryThirdpartyPlatformAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/QueryThirdpartyPlatformAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/UpdateThirdpartyAlertsAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/UpdateThirdpartyAlertsAction.java index 8f7899f182b..3150cb84476 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/UpdateThirdpartyAlertsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/UpdateThirdpartyAlertsAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/UpdateThirdpartyPlatformAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/UpdateThirdpartyPlatformAction.java index 26e16069c69..753c33a0eb5 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/UpdateThirdpartyPlatformAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/UpdateThirdpartyPlatformAction.java @@ -17,7 +17,7 @@ public static class Result { public Result throwExceptionIfError() { if (error != null) { throw new ApiException( - String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) ); } diff --git a/search/src/main/java/org/zstack/query/BatchQuery.groovy b/search/src/main/java/org/zstack/query/BatchQuery.groovy index 86020e8cae6..f4f9cafb7dd 100755 --- a/search/src/main/java/org/zstack/query/BatchQuery.groovy +++ b/search/src/main/java/org/zstack/query/BatchQuery.groovy @@ -1,4 +1,6 @@ -package org.zstack.query +package org.zstack.query + +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; import org.apache.commons.lang.StringUtils import org.codehaus.groovy.control.CompilerConfiguration @@ -257,7 +259,7 @@ class BatchQuery { private Map syncApiCall(String apiname, String jstr) { Class msgClz = queryMessageClass[apiname] if (msgClz == null) { - throw new OperationFailureException(Platform.argerr("no query API found for %s", apiname)) + throw new OperationFailureException(org.zstack.core.Platform.argerr(ORG_ZSTACK_QUERY_10006, "no query API found for %s", apiname)) } APISyncCallMessage msg = JSONObjectUtil.toObject(jstr, msgClz) @@ -290,13 +292,13 @@ class BatchQuery { List words = qstr.split(" ") words = words.findAll { !it.isEmpty() } if (words.isEmpty()) { - throw new OperationFailureException(Platform.argerr("invalid query string: %s", qstr)) + throw new OperationFailureException(org.zstack.core.Platform.argerr(ORG_ZSTACK_QUERY_10007, "invalid query string: %s", qstr)) } String api = words[0].toLowerCase() Class msgClz = queryMessageClass[api] if (msgClz == null) { - throw new OperationFailureException(Platform.argerr("no query API found for %s", words[0])) + throw new OperationFailureException(org.zstack.core.Platform.argerr(ORG_ZSTACK_QUERY_10008, "no query API found for %s", words[0])) } APIQueryMessage msg = msgClz.newInstance() as APIQueryMessage @@ -357,7 +359,7 @@ class BatchQuery { } if (OP == null) { - throw new OperationFailureException(Platform.argerr("invalid query string[%s], word[%s] doesn't have a valid operator", qstr, word)) + throw new OperationFailureException(org.zstack.core.Platform.argerr(ORG_ZSTACK_QUERY_10009, "invalid query string[%s], word[%s] doesn't have a valid operator", qstr, word)) } List ks = word.split(Pattern.quote(delimiter), 2) @@ -367,7 +369,7 @@ class BatchQuery { cond.op = OP } else { if (ks.size() != 2) { - throw new OperationFailureException(Platform.argerr("invalid query string[%s], word[%s] doesn't has key-value pair", qstr, word)) + throw new OperationFailureException(org.zstack.core.Platform.argerr(ORG_ZSTACK_QUERY_10010, "invalid query string[%s], word[%s] doesn't has key-value pair", qstr, word)) } cond.name = ks[0] cond.op = OP @@ -463,7 +465,7 @@ class BatchQuery { } catch (Throwable t) { logger.warn(t.message, t) sandbox.unregister() - throw new OperationFailureException(Platform.operr("${errorLine(msg.script, t)}")) + throw new OperationFailureException(org.zstack.core.Platform.operr(ORG_ZSTACK_QUERY_10011, "${errorLine(msg.script, t)}")) } finally { sandbox.unregister() shell.resetLoadedClasses() diff --git a/search/src/main/java/org/zstack/query/MysqlQueryBuilderImpl3.java b/search/src/main/java/org/zstack/query/MysqlQueryBuilderImpl3.java index 101684ad18c..1f1c2abd816 100755 --- a/search/src/main/java/org/zstack/query/MysqlQueryBuilderImpl3.java +++ b/search/src/main/java/org/zstack/query/MysqlQueryBuilderImpl3.java @@ -40,6 +40,7 @@ import java.util.stream.Collectors; import static org.zstack.utils.StringDSL.s; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -429,12 +430,12 @@ String toJpql() { if (!skipInventoryCheck) { if (inventoryField == null || inventoryField.isAnnotationPresent(APINoSee.class)) { - throw new OperationFailureException(argerr("condition name[%s] is invalid, no such field on inventory class[%s]", + throw new OperationFailureException(argerr(ORG_ZSTACK_QUERY_10018, "condition name[%s] is invalid, no such field on inventory class[%s]", attr, inventoryClass.getName())); } if (inventoryField.isAnnotationPresent(Unqueryable.class)) { - throw new OperationFailureException(argerr("condition name[%s] is invalid, field[%s] of inventory[%s] is annotated as @Unqueryable field", + throw new OperationFailureException(argerr(ORG_ZSTACK_QUERY_10019, "condition name[%s] is invalid, field[%s] of inventory[%s] is annotated as @Unqueryable field", attr, attr, inventoryClass.getName())); } } @@ -445,7 +446,7 @@ String toJpql() { if (at == null) { Field metaField = FieldUtils.getField(attr, info.jpaMetaClass); if (metaField == null) { - throw new OperationFailureException(argerr("entity meta class[%s] has no field[%s]", + throw new OperationFailureException(argerr(ORG_ZSTACK_QUERY_10020, "entity meta class[%s] has no field[%s]", info.jpaMetaClass.getName(), attr)); } @@ -997,7 +998,7 @@ private void validateFields() { EntityInfo info = entityInfos.get(inventoryClass); for (String f : msg.getFields()) { if (!info.premitiveFieldNames.contains(f)) { - throw new OperationFailureException(argerr("field[%s] is not a primitive of the inventory %s; you cannot specify it in the parameter 'fields';" + + throw new OperationFailureException(argerr(ORG_ZSTACK_QUERY_10021, "field[%s] is not a primitive of the inventory %s; you cannot specify it in the parameter 'fields';" + "valid fields are %s", f, info.inventoryClass.getSimpleName(), info.premitiveFieldNames)); } } diff --git a/search/src/main/java/org/zstack/query/QueryFacadeImpl.java b/search/src/main/java/org/zstack/query/QueryFacadeImpl.java index 59aa7ce7e7d..3a0a291b1bc 100755 --- a/search/src/main/java/org/zstack/query/QueryFacadeImpl.java +++ b/search/src/main/java/org/zstack/query/QueryFacadeImpl.java @@ -45,6 +45,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.inerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class QueryFacadeImpl extends AbstractService implements QueryFacade, GlobalApiMessageInterceptor, MarshalReplyMessageExtensionPoint { private static CLogger logger = Utils.getLogger(QueryFacadeImpl.class); @@ -331,7 +332,7 @@ private Method getReplySetter(AutoQuery at) { setter = replyClass.getDeclaredMethod("setInventories", List.class); if (setter == null) { throw new OperationFailureException(inerr( - "query reply[%s] has no method setInventories()", replyClass.getName() + ORG_ZSTACK_QUERY_10012, "query reply[%s] has no method setInventories()", replyClass.getName() )); } setter.setAccessible(true); @@ -343,7 +344,7 @@ private Method getReplySetter(AutoQuery at) { throw of; } catch (Exception e) { logger.warn(e.getMessage(), e); - throw new OperationFailureException(inerr(e.getMessage())); + throw new OperationFailureException(inerr(ORG_ZSTACK_QUERY_10013, e.getMessage())); } } @@ -353,7 +354,7 @@ private void handle(APIQueryMessage msg) { at = msg.getClass().getAnnotation(AutoQuery.class); if (at == null) { throw new OperationFailureException(inerr( - "message[%s] is not annotated by @AutoQuery", msg.getClass() + ORG_ZSTACK_QUERY_10014, "message[%s] is not annotated by @AutoQuery", msg.getClass() )); } autoQueryMap.put(msg.getClass(), at); @@ -516,7 +517,7 @@ public ZQLQueryReturn queryUseZQL(APIQueryMessage msg, Class inventoryClass) { private QueryBelongFilter validateFilterNameAndGetExp(String filterName) { if (filterName.split(":").length < 2) { - throw new OperationFailureException(argerr("filterName must be formatted as [filterType:condition(s)]")); + throw new OperationFailureException(argerr(ORG_ZSTACK_QUERY_10015, "filterName must be formatted as [filterType:condition(s)]")); } return getBelongFilter(filterName); } @@ -652,11 +653,11 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti try { QueryOp.valueOf(cond.getOp()); } catch (IllegalArgumentException e) { - throw new ApiMessageInterceptionException(argerr(e.getMessage())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_QUERY_10016, e.getMessage())); } if (!QueryOp.NOT_NULL.equals(cond.getOp()) && !QueryOp.IS_NULL.equals(cond.getOp()) && cond.getValue() == null) { - throw new ApiMessageInterceptionException(argerr("'value' of query condition %s cannot be null", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_QUERY_10017, "'value' of query condition %s cannot be null", JSONObjectUtil.toJsonString(cond))); } } diff --git a/search/src/main/java/org/zstack/zql/ZQL.java b/search/src/main/java/org/zstack/zql/ZQL.java index 127bd3576cb..53a2aa7b2ff 100755 --- a/search/src/main/java/org/zstack/zql/ZQL.java +++ b/search/src/main/java/org/zstack/zql/ZQL.java @@ -54,6 +54,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.zql.ast.visitors.constants.MySqlKeyword.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class ZQL { @@ -403,7 +404,7 @@ protected void scripts() { clean.run(); } else if (ctx instanceof ZQLParser.SearchGrammarContext) { if (!SearchGlobalProperty.SearchAutoRegister) { - throw new OperationFailureException(err(SearchErrors.SEARCH_MODULE_DISABLED, "search module disabled")); + throw new OperationFailureException(err(ORG_ZSTACK_ZQL_10000, SearchErrors.SEARCH_MODULE_DISABLED, "search module disabled")); } ASTNode.Search search = ((ZQLParser.SearchGrammarContext) ctx).search().accept(new SearchVisitor()); diff --git a/search/src/main/java/org/zstack/zql/ast/parser/visitors/JoinClauseVisitor.java b/search/src/main/java/org/zstack/zql/ast/parser/visitors/JoinClauseVisitor.java index 8db22f844c3..efac24234a7 100644 --- a/search/src/main/java/org/zstack/zql/ast/parser/visitors/JoinClauseVisitor.java +++ b/search/src/main/java/org/zstack/zql/ast/parser/visitors/JoinClauseVisitor.java @@ -7,6 +7,7 @@ import org.zstack.zql.antlr4.ZQLParser; import java.util.stream.Collectors; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class JoinClauseVisitor extends ZQLBaseVisitor { @@ -20,7 +21,7 @@ public ASTNode.JoinClause visitJoinTable(ZQLParser.JoinTableContext ctx) { } else if (ctx.RIGHT() != null) { joinType = ctx.RIGHT().getText(); } else { - throw new OperationFailureException(Platform.operr("can not find JoinType")); + throw new OperationFailureException(Platform.operr(ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10005, "can not find JoinType")); } ASTNode.JoinClause outerJoin = new ASTNode.JoinClause(); diff --git a/search/src/main/java/org/zstack/zql/ast/parser/visitors/ValueVisitor.java b/search/src/main/java/org/zstack/zql/ast/parser/visitors/ValueVisitor.java index 71f90539341..08cfae13e86 100755 --- a/search/src/main/java/org/zstack/zql/ast/parser/visitors/ValueVisitor.java +++ b/search/src/main/java/org/zstack/zql/ast/parser/visitors/ValueVisitor.java @@ -21,6 +21,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class ValueVisitor extends ZQLBaseVisitor { private static final CLogger logger = Utils.getLogger(ValueVisitor.class); @@ -137,7 +138,7 @@ private Object getParamsByType(ZQLParser.ValueContext context) { private Object callAction(String apiStr, String outputStr, Map params) { List o = Arrays.asList(outputStr.split("\\.")); if (o.isEmpty()) { - throw new OperationFailureException(Platform.operr("output from [%s] is empty", apiStr)); + throw new OperationFailureException(Platform.operr(ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10000, "output from [%s] is empty", apiStr)); } String apiName = "org.zstack.sdk." + apiStr + "Action"; @@ -156,7 +157,7 @@ private Object callAction(String apiStr, String outputStr, Map p err.setAccessible(true); Object ob = err.get(result); if (ob != null) { - throw new OperationFailureException(operr("call action[%s] failed, cause: %s", apiName, JSONObjectUtil.toJsonString(ob))); + throw new OperationFailureException(operr(ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10001, "call action[%s] failed, cause: %s", apiName, JSONObjectUtil.toJsonString(ob))); } else { Field field = result.getClass().getField("value"); field.setAccessible(true); @@ -168,10 +169,10 @@ private Object callAction(String apiStr, String outputStr, Map p // InvocationTargetException contains actual exception in its target // but no error message in itself if (e instanceof InvocationTargetException) { - throw new OperationFailureException(operr(((InvocationTargetException) e).getTargetException().getMessage())); + throw new OperationFailureException(operr(ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10002, ((InvocationTargetException) e).getTargetException().getMessage())); } - throw new OperationFailureException(operr(e.getMessage())); + throw new OperationFailureException(operr(ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10003, e.getMessage())); } } @@ -207,7 +208,7 @@ private void setField(Object o, String key, Object value) { f.set(o, value); } } catch (Exception e) { - throw new OperationFailureException(operr(e.getMessage())); + throw new OperationFailureException(operr(ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10004, e.getMessage())); } } diff --git a/search/src/main/java/org/zstack/zql/ast/visitors/FunctionVisitor.java b/search/src/main/java/org/zstack/zql/ast/visitors/FunctionVisitor.java index 96fc8f515b6..a558a2d29c1 100644 --- a/search/src/main/java/org/zstack/zql/ast/visitors/FunctionVisitor.java +++ b/search/src/main/java/org/zstack/zql/ast/visitors/FunctionVisitor.java @@ -8,6 +8,7 @@ import java.util.Optional; import static org.zstack.zql.ast.visitors.constants.MySqlKeyword.keywordMap; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by MaJin on 2019/6/3. @@ -16,7 +17,7 @@ public class FunctionVisitor implements ASTVisitor { @Override public String visit(ASTNode.Function function) { if (function == null) { - throw new OperationFailureException(Platform.operr("function cannot be null")); + throw new OperationFailureException(Platform.operr(ORG_ZSTACK_ZQL_AST_VISITORS_10004, "function cannot be null")); } Optional result = keywordMap.keySet().stream() diff --git a/search/src/main/java/org/zstack/zql/ast/visitors/JoinClauseVisitor.java b/search/src/main/java/org/zstack/zql/ast/visitors/JoinClauseVisitor.java index 3dfd798ef0b..8f49778c872 100644 --- a/search/src/main/java/org/zstack/zql/ast/visitors/JoinClauseVisitor.java +++ b/search/src/main/java/org/zstack/zql/ast/visitors/JoinClauseVisitor.java @@ -10,12 +10,13 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class JoinClauseVisitor implements ASTVisitor { @Override public String visit(ASTNode.JoinClause node) { if (node.getConditions() == null) { - throw new OperationFailureException(Platform.operr("join condition is missing")); + throw new OperationFailureException(Platform.operr(ORG_ZSTACK_ZQL_AST_VISITORS_10000, "join condition is missing")); } String tableNameAndAlias = (String) node.getQueryTarget().accept(tableNameVisitor()); @@ -45,7 +46,7 @@ private static ASTVisitor tableNameVisitor() { @Override public String visit(ASTNode.QueryTarget queryTarget) { if (StringUtils.isBlank(queryTarget.getEntity())) { - throw new OperationFailureException(Platform.operr("entity is empty, cannot get TableName")); + throw new OperationFailureException(Platform.operr(ORG_ZSTACK_ZQL_AST_VISITORS_10001, "entity is empty, cannot get TableName")); } String entity = queryTarget.getEntity(); diff --git a/search/src/main/java/org/zstack/zql/ast/visitors/JoinExprVisitor.java b/search/src/main/java/org/zstack/zql/ast/visitors/JoinExprVisitor.java index e882e1aab65..d1417691d88 100755 --- a/search/src/main/java/org/zstack/zql/ast/visitors/JoinExprVisitor.java +++ b/search/src/main/java/org/zstack/zql/ast/visitors/JoinExprVisitor.java @@ -7,6 +7,7 @@ import org.zstack.header.zql.ASTVisitor; import org.zstack.utils.CollectionUtils; import org.zstack.zql.ast.ZQLMetadata; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class JoinExprVisitor implements ASTVisitor { @Override @@ -22,10 +23,10 @@ private static ASTVisitor columnVisitor() { @Override public String visit(ASTNode.QueryTarget queryTarget) { if (StringUtils.isBlank(queryTarget.getEntity())) { - throw new OperationFailureException(Platform.operr("entity is empty, cannot get columnName")); + throw new OperationFailureException(Platform.operr(ORG_ZSTACK_ZQL_AST_VISITORS_10002, "entity is empty, cannot get columnName")); } if (CollectionUtils.isEmpty(queryTarget.getFields())) { - throw new OperationFailureException(Platform.operr("fieldList is empty, cannot get columnName")); + throw new OperationFailureException(Platform.operr(ORG_ZSTACK_ZQL_AST_VISITORS_10003, "fieldList is empty, cannot get columnName")); } String entity = queryTarget.getEntity(); String field = queryTarget.getFields().get(0); diff --git a/search/src/main/java/org/zstack/zql/ast/visitors/plugin/SumPlugin.java b/search/src/main/java/org/zstack/zql/ast/visitors/plugin/SumPlugin.java index e30289ebd05..86e92884ca3 100755 --- a/search/src/main/java/org/zstack/zql/ast/visitors/plugin/SumPlugin.java +++ b/search/src/main/java/org/zstack/zql/ast/visitors/plugin/SumPlugin.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.stream.Collectors; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class SumPlugin extends AbstractQueryVisitorPlugin { public SumPlugin() { @@ -28,7 +29,7 @@ public String selectTarget() { List fields = targetFields(); if (fields.isEmpty()) { - throw new OperationFailureException(argerr("the field to sum must be specified")); + throw new OperationFailureException(argerr(ORG_ZSTACK_ZQL_AST_VISITORS_PLUGIN_10000, "the field to sum must be specified")); } String sumFields = StringUtils.join(fields.stream().map(f->String.format("SUM(%s.%s) as %s", entityAlias, f, f)).collect(Collectors.toList()), ","); diff --git a/simulator/simulatorImpl/src/main/java/org/zstack/simulator/SimulatorHost.java b/simulator/simulatorImpl/src/main/java/org/zstack/simulator/SimulatorHost.java index 9bcb5a34fc2..e72e6addb30 100755 --- a/simulator/simulatorImpl/src/main/java/org/zstack/simulator/SimulatorHost.java +++ b/simulator/simulatorImpl/src/main/java/org/zstack/simulator/SimulatorHost.java @@ -24,6 +24,7 @@ import java.util.List; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) class SimulatorHost extends HostBase { @@ -60,7 +61,7 @@ public void connectHook(ConnectHostInfo info, Completion complete) { String err = sc.connect(conn); if (err != null) { logger.warn(err); - complete.fail(operr(err)); + complete.fail(operr(ORG_ZSTACK_SIMULATOR_10001, err)); return; } } @@ -89,7 +90,7 @@ protected void pingHook(Completion completion) { if (!isDisconnected) { completion.success(); } else { - completion.fail(operr("set to disconnected")); + completion.fail(operr(ORG_ZSTACK_SIMULATOR_10002, "set to disconnected")); } } @@ -167,7 +168,7 @@ private void handle(UpdateVmOnHypervisorMsg msg) { private void handle(MigrateVmOnHypervisorMsg msg) { MigrateVmOnHypervisorReply reply = new MigrateVmOnHypervisorReply(); if (!config.migrateSuccess) { - reply.setError(operr("on purpose")); + reply.setError(operr(ORG_ZSTACK_SIMULATOR_10003, "on purpose")); } else { logger.debug(String.format("Successfully migrate vm[uuid:%s] on simulator host[uuid:%s] to host[uuid:%s]", msg.getVmInventory().getUuid(), self.getUuid(), msg.getDestHostInventory().getUuid())); config.removeVm(msg.getSrcHostUuid(), msg.getVmInventory().getUuid()); @@ -188,7 +189,7 @@ private void handle(DetachNicFromVmOnHypervisorMsg msg) { private void handle(TakeSnapshotOnHypervisorMsg msg) { TakeSnapshotOnHypervisorReply reply = new TakeSnapshotOnHypervisorReply(); if (!config.snapshotSuccess) { - reply.setError(operr("on purpose")); + reply.setError(operr(ORG_ZSTACK_SIMULATOR_10004, "on purpose")); bus.reply(msg, reply); return; } diff --git a/simulator/simulatorImpl/src/main/java/org/zstack/simulator/SimulatorSecurityGroupBackend.java b/simulator/simulatorImpl/src/main/java/org/zstack/simulator/SimulatorSecurityGroupBackend.java index 733eb019bff..b46eaf6656b 100755 --- a/simulator/simulatorImpl/src/main/java/org/zstack/simulator/SimulatorSecurityGroupBackend.java +++ b/simulator/simulatorImpl/src/main/java/org/zstack/simulator/SimulatorSecurityGroupBackend.java @@ -21,6 +21,7 @@ import java.util.*; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class SimulatorSecurityGroupBackend implements @@ -42,7 +43,7 @@ public class SimulatorSecurityGroupBackend implements public void applyRules(HostRuleTO hto, Completion complete) { logger.debug(String.format("apply security rules to simulator host[uuid:%s], ipv4:\n%s\nipv6:\n%s", hto.getHostUuid(), JSONObjectUtil.toJsonString(hto.getRules()), JSONObjectUtil.toJsonString(hto.getIp6Rules()))); if (!securityGroupSuccess) { - ErrorCode errorCode = operr("on purpose"); + ErrorCode errorCode = operr(ORG_ZSTACK_SIMULATOR_10000, "on purpose"); complete.fail(errorCode); return; } diff --git a/simulator/simulatorImpl/src/main/java/org/zstack/simulator/storage/primary/SimulatorPrimaryStorage.java b/simulator/simulatorImpl/src/main/java/org/zstack/simulator/storage/primary/SimulatorPrimaryStorage.java index 45cf8612a3c..0efb78db682 100755 --- a/simulator/simulatorImpl/src/main/java/org/zstack/simulator/storage/primary/SimulatorPrimaryStorage.java +++ b/simulator/simulatorImpl/src/main/java/org/zstack/simulator/storage/primary/SimulatorPrimaryStorage.java @@ -22,6 +22,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.err; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class SimulatorPrimaryStorage extends PrimaryStorageBase { @@ -267,7 +268,7 @@ protected void handle(CheckVolumeSnapshotOperationOnPrimaryStorageMsg msg) { .param("vmUuid", msg.getVmInstanceUuid()) .find(); if (hostStatus != HostStatus.Connected && hostStatus != null) { - reply.setError(err(HostErrors.HOST_IS_DISCONNECTED, "host where vm[uuid:%s] locate is not Connected.", msg.getVmInstanceUuid())); + reply.setError(err(ORG_ZSTACK_SIMULATOR_STORAGE_PRIMARY_10000, HostErrors.HOST_IS_DISCONNECTED, "host where vm[uuid:%s] locate is not Connected.", msg.getVmInstanceUuid())); } } diff --git a/storage/src/main/java/org/zstack/storage/addon/backup/ExternalBackupStorage.java b/storage/src/main/java/org/zstack/storage/addon/backup/ExternalBackupStorage.java index de4e84d1b4e..4014afc51a1 100755 --- a/storage/src/main/java/org/zstack/storage/addon/backup/ExternalBackupStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/backup/ExternalBackupStorage.java @@ -18,6 +18,7 @@ import org.zstack.utils.logging.CLogger; import java.util.List; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; // ExternalBackupStorage is an Addon Backup Storage Instance (`absi'). // @@ -50,7 +51,7 @@ protected void handle(final DownloadImageMsg msg) { @Override public void success(ImageDescriptor d) { if (d.getInstallPath() == null) { - r.setError(Platform.operr("null installPath returned from driver: %s", controller.getIdentity())); + r.setError(Platform.operr(ORG_ZSTACK_STORAGE_ADDON_BACKUP_10000, "null installPath returned from driver: %s", controller.getIdentity())); } else { r.setFormat(d.getFormat()); r.setInstallPath(d.getInstallPath()); @@ -108,7 +109,7 @@ public void success(StorageHealthy healthy) { return; } - completion.fail(Platform.operr("%s: health state: %s", getSelf().getIdentity(), healthy)); + completion.fail(Platform.operr(ORG_ZSTACK_STORAGE_ADDON_BACKUP_10001, "%s: health state: %s", getSelf().getIdentity(), healthy)); } @Override diff --git a/storage/src/main/java/org/zstack/storage/addon/backup/ExternalBackupStorageFactory.java b/storage/src/main/java/org/zstack/storage/addon/backup/ExternalBackupStorageFactory.java index d6c403684f1..f1818fc75d3 100755 --- a/storage/src/main/java/org/zstack/storage/addon/backup/ExternalBackupStorageFactory.java +++ b/storage/src/main/java/org/zstack/storage/addon/backup/ExternalBackupStorageFactory.java @@ -13,6 +13,7 @@ import org.zstack.header.storage.backup.*; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class ExternalBackupStorageFactory implements BackupStorageFactory, Component { private static final CLogger logger = Utils.getLogger(ExternalBackupStorageFactory.class); @@ -37,7 +38,7 @@ public BackupStorageInventory createBackupStorage(BackupStorageVO vo, APIAddBack APIAddExternalBackupStorageMsg amsg = (APIAddExternalBackupStorageMsg) msg; if (findBackupStorageController(amsg.getIdentity()) == null) { throw new OperationFailureException( - Platform.operr("No backup storage plugin registered with identity: %s", amsg.getIdentity()) + Platform.operr(ORG_ZSTACK_STORAGE_ADDON_BACKUP_10002, "No backup storage plugin registered with identity: %s", amsg.getIdentity()) ); } @@ -53,7 +54,7 @@ public BackupStorage getBackupStorage(BackupStorageVO vo) { BackupStorageController c = findBackupStorageController(lvo.getIdentity()); if (c == null) { throw new OperationFailureException( - Platform.operr("No backup storage plugin registered with identity: %s", vo.getType()) + Platform.operr(ORG_ZSTACK_STORAGE_ADDON_BACKUP_10003, "No backup storage plugin registered with identity: %s", vo.getType()) ); } return new ExternalBackupStorage(lvo, c); diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index 0ddcb2e0500..689c2510d93 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -62,6 +62,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.storage.addon.primary.ExternalPrimaryStorageNameHelper.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = true) @@ -155,7 +156,7 @@ private void handle(GetAccessPathMsg msg) { .eq(BlockVolumeVO_.uuid, msg.getVolumeUuid()).find(); if (blockVolumeVO == null) { GetAccessPathReply reply = new GetAccessPathReply(); - reply.setError(operr("can not found block volume, access path only for block volume")); + reply.setError(operr(ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10009, "can not found block volume, access path only for block volume")); return; } BlockExternalPrimaryStorageBackend backend = getBlockBackend(blockVolumeVO.getVendor()); @@ -469,7 +470,7 @@ private void handle(final SelectBackupStorageMsg msg) { } if (CollectionUtils.isEmpty(preferBsTypes)) { - reply.setError(operr("no backup storage type specified support to primary storage[uuid:%s]", self.getUuid())); + reply.setError(operr(ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10010, "no backup storage type specified support to primary storage[uuid:%s]", self.getUuid())); bus.reply(msg, reply); return; } @@ -1858,7 +1859,7 @@ public void setup() { public void run(final FlowTrigger trigger, Map data) { ImageVO ivo = dbf.findByUuid(msg.getVolume().getRootImageUuid(), ImageVO.class); if (ivo == null) { - throw new OperationFailureException(operr("cannot reinit rootvolume [%s] because image [%s] has been deleted and imagecache cannot be found", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10011, "cannot reinit rootvolume [%s] because image [%s] has been deleted and imagecache cannot be found", msg.getVolume().getUuid(), msg.getVolume().getRootImageUuid())); } @@ -1976,7 +1977,7 @@ protected void handle(GetOwningVolumePathFromInternalSnapshotMsg msg) { String volumePath = matcher.group(); reply.putOwningVolumePath(snapshotPath, volumePath); } else { - reply.setError(operr("cannot find owning volume path from internal snapshot path[%s], " + + reply.setError(operr(ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012, "cannot find owning volume path from internal snapshot path[%s], " + "because the regex[%s] does not match the snapshot path", snapshotPath, scap.getVolumePathFromInternalSnapshotRegex())); break; } @@ -2057,7 +2058,7 @@ public void success(PingResult ret) { } if (!ret.isSuccess()) { - trigger.fail(operr("ping external primary storage[%s] failed, %s", self.getUuid(), ret.getError())); + trigger.fail(operr(ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10013, "ping external primary storage[%s] failed, %s", self.getUuid(), ret.getError())); return; } @@ -2109,7 +2110,7 @@ public void success(StorageCapacity capacity) { new ExternalPrimaryStorageSpaceCapacityHelper(externalVO).updateStorageSpace(capacity); trigger.next(); } else { - trigger.fail(operr("storage is not healthy:%s", capacity.getHealthy().toString())); + trigger.fail(operr(ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014, "storage is not healthy:%s", capacity.getHealthy().toString())); } } diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java index f39e7bf60bb..dc60d149196 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java @@ -60,6 +60,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class ExternalPrimaryStorageFactory implements PrimaryStorageFactory, Component, PSCapacityExtensionPoint, PreVmInstantiateResourceExtensionPoint, VmReleaseResourceExtensionPoint, @@ -221,7 +222,7 @@ private String getRequiredUrl(ExternalPrimaryStorageSpaceCapacityHelper helper, String volumePath = Q.New(VolumeVO.class).eq(VolumeVO_.uuid, volUuid).select(VolumeVO_.installPath).findValue(); if (volumePath == null) { throw new OperationFailureException( - Platform.operr("cannot find volume[uuid:%s] install path", volUuid) + Platform.operr(ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10004, "cannot find volume[uuid:%s] install path", volUuid) ); } @@ -305,7 +306,7 @@ public PrimaryStorageInventory createPrimaryStorage(PrimaryStorageVO vo, APIAddP ExternalPrimaryStorageSvcBuilder builder = getSvcBuilder(identity); if (builder == null) { throw new OperationFailureException( - Platform.operr("No primary storage plugin registered with identity: %s", identity) + Platform.operr(ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10005, "No primary storage plugin registered with identity: %s", identity) ); } @@ -355,7 +356,7 @@ public PrimaryStorageInventory getInventory(String uuid) { @Override public void validateStorageProtocol(String protocol) { if (!SUPPORT_PROTOCOL.contains(protocol)) { - throw new ApiMessageInterceptionException(argerr("not support protocol[%s] " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10006, "not support protocol[%s] " + "on type[%s] primary storage", protocol, getPrimaryStorageType())); } } @@ -648,7 +649,7 @@ public void beforeTakeLiveSnapshotsOnVolumes(CreateVolumesSnapshotOverlayInnerMs flowData.put(VolumeSnapshotConstant.NEED_BLOCK_STREAM_ON_HYPERVISOR, false); flowData.put(VolumeSnapshotConstant.NEED_TAKE_SNAPSHOTS_ON_HYPERVISOR, false); } else if (msg.getConsistentType() != ConsistentType.None) { - completion.fail(operr("not support take volumes snapshots " + + completion.fail(operr(ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10007, "not support take volumes snapshots " + "on multiple ps when including storage snapshot")); return; } diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageManagerImpl.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageManagerImpl.java index 591f7c8982e..1fcdc1e90b4 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageManagerImpl.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageManagerImpl.java @@ -25,6 +25,7 @@ import java.util.LinkedHashMap; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class ExternalPrimaryStorageManagerImpl extends AbstractService { private static final CLogger logger = Utils.getLogger(ExternalPrimaryStorageManagerImpl.class); @@ -54,7 +55,7 @@ public void handleMessage(Message msg) { private void passThrough(PrimaryStorageMessage msg) { ExternalPrimaryStorageVO vo = dbf.findByUuid(msg.getPrimaryStorageUuid(), ExternalPrimaryStorageVO.class); if (vo == null) { - throw new OperationFailureException(operr("cannot find ExternalPrimaryStorage[uuid:%s]", msg.getPrimaryStorageUuid())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10000, "cannot find ExternalPrimaryStorage[uuid:%s]", msg.getPrimaryStorageUuid())); } PrimaryStorage ext = factory.getPrimaryStorage(vo); @@ -121,7 +122,7 @@ public void fail(ErrorCode errorCode) { @Override public void done(ErrorCodeList errorCodeList) { if (event.getInventory() == null) { - event.setError(operr(errorCodeList, "cannot connect any external storage")); + event.setError(operr(ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10001, errorCodeList, "cannot connect any external storage")); } bus.publish(event); diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSpaceCapacityHelper.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSpaceCapacityHelper.java index 9fa5f2269bc..b766789fc43 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSpaceCapacityHelper.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSpaceCapacityHelper.java @@ -32,6 +32,7 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) @@ -117,7 +118,7 @@ protected void updateStorageSpace(StorageCapacity cap) { private ExternalPrimaryStorageSpaceVO getSpaceFromInstallUrl(String installPath) { Map spacesByUrl = getStorageSpacesByUrl(); String spaceUrl = spacesByUrl.keySet().stream().filter(installPath::startsWith) - .findFirst().orElseThrow(() -> new OperationFailureException(operr("cannot find storage space for installPath[%s]", installPath))); + .findFirst().orElseThrow(() -> new OperationFailureException(operr(ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10002, "cannot find storage space for installPath[%s]", installPath))); return spacesByUrl.get(spaceUrl); } @@ -168,7 +169,7 @@ protected long _reserve(String installPath, long size) { ExternalPrimaryStorageSpaceVO space = getSpaceFromInstallUrl(installPath); long originAvailableCapacity = space.getAvailableCapacity(); if (originAvailableCapacity < size) { - throw new OperationFailureException(operr("required space[locationUrl:%s] cannot satisfy conditions [availableSize > %s bytes], " + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10003, "required space[locationUrl:%s] cannot satisfy conditions [availableSize > %s bytes], " + "current available size %s", space.getLocationUrl(), size, originAvailableCapacity)); } diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSpaceHelper.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSpaceHelper.java index ee176db2244..cebbd227cf9 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSpaceHelper.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSpaceHelper.java @@ -14,6 +14,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class ExternalPrimaryStorageSpaceHelper { protected String primaryStorageUuid; @@ -51,6 +52,6 @@ public Map getStorageSpacesByUrl() { public String getLocationSpaceUrl(String installUrl) { Set spaceUrls = getStorageSpacesByUrl().keySet(); return spaceUrls.stream().filter(installUrl::startsWith).findFirst() - .orElseThrow(() -> new OperationFailureException(operr("cannot find storage space for installUrl[%s]", installUrl))); + .orElseThrow(() -> new OperationFailureException(operr(ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10008, "cannot find storage space for installUrl[%s]", installUrl))); } } diff --git a/storage/src/main/java/org/zstack/storage/backup/BackupStorageApiInterceptor.java b/storage/src/main/java/org/zstack/storage/backup/BackupStorageApiInterceptor.java index eb99afae4ca..a7f4ee4ae76 100755 --- a/storage/src/main/java/org/zstack/storage/backup/BackupStorageApiInterceptor.java +++ b/storage/src/main/java/org/zstack/storage/backup/BackupStorageApiInterceptor.java @@ -16,6 +16,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -62,7 +63,7 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti private void checkNull(final String name, final String val) { if (val == null) { - throw new ApiMessageInterceptionException(argerr("%s should not be null", name)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_BACKUP_10003, "%s should not be null", name)); } } private void validate(APIDeleteExportedImageFromBackupStorageMsg msg) { @@ -85,7 +86,7 @@ private void validate(APIGetBackupStorageCapacityMsg msg) { } if (!pass && !msg.isAll()) { - throw new ApiMessageInterceptionException(argerr("zoneUuids, backupStorageUuids must have at least one be none-empty list, or all is set to true")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_BACKUP_10004, "zoneUuids, backupStorageUuids must have at least one be none-empty list, or all is set to true")); } if (msg.isAll() && (msg.getBackupStorageUuids() == null || msg.getBackupStorageUuids().isEmpty())) { @@ -115,7 +116,7 @@ private void validate(APIDetachBackupStorageFromZoneMsg msg) { q.add(BackupStorageZoneRefVO_.backupStorageUuid, Op.EQ, msg.getBackupStorageUuid()); q.add(BackupStorageZoneRefVO_.zoneUuid, Op.EQ, msg.getZoneUuid()); if (!q.isExists()) { - throw new ApiMessageInterceptionException(operr("backup storage[uuid:%s] has not been attached to zone[uuid:%s]", msg.getBackupStorageUuid(), msg.getZoneUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_BACKUP_10005, "backup storage[uuid:%s] has not been attached to zone[uuid:%s]", msg.getBackupStorageUuid(), msg.getZoneUuid())); } } @@ -124,13 +125,13 @@ private void validate(APIAttachBackupStorageToZoneMsg msg) { q.add(BackupStorageZoneRefVO_.backupStorageUuid, Op.EQ, msg.getBackupStorageUuid()); q.add(BackupStorageZoneRefVO_.zoneUuid, Op.EQ, msg.getZoneUuid()); if (q.isExists()) { - throw new ApiMessageInterceptionException(operr("backup storage[uuid:%s] has been attached to zone[uuid:%s]", msg.getBackupStorageUuid(), msg.getZoneUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_BACKUP_10006, "backup storage[uuid:%s] has been attached to zone[uuid:%s]", msg.getBackupStorageUuid(), msg.getZoneUuid())); } } private void validate(final APIGetTrashOnBackupStorageMsg msg) { if ((msg.getResourceType() != null) ^ (msg.getResourceUuid() != null)) { - throw new ApiMessageInterceptionException((argerr("'resourceUuid' and 'resourceType' must be set both or neither!"))); + throw new ApiMessageInterceptionException((argerr(ORG_ZSTACK_STORAGE_BACKUP_10007, "'resourceUuid' and 'resourceType' must be set both or neither!"))); } } } diff --git a/storage/src/main/java/org/zstack/storage/backup/BackupStorageBase.java b/storage/src/main/java/org/zstack/storage/backup/BackupStorageBase.java index ca9b35898fc..db0a9e35240 100755 --- a/storage/src/main/java/org/zstack/storage/backup/BackupStorageBase.java +++ b/storage/src/main/java/org/zstack/storage/backup/BackupStorageBase.java @@ -56,6 +56,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public abstract class BackupStorageBase extends AbstractBackupStorage { @@ -152,11 +153,11 @@ private long getContentLength(String url) { try { header = restf.syncHead(url); } catch (Exception e) { - throw new OperationFailureException(operr("failed to get header of image url %s: %s", url, e.toString())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_BACKUP_10073, "failed to get header of image url %s: %s", url, e.toString())); } if (header == null) { - throw new OperationFailureException(operr("failed to get header of image url %s", url)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_BACKUP_10074, "failed to get header of image url %s", url)); } return header.getContentLength(); @@ -178,10 +179,10 @@ protected void exceptionIfImageSizeGreaterThanAvailableCapacity(String url) { if (size == -1) { logger.error(String.format("failed to get image size from url %s, but ignore this error and proceed", url)); } else if (size < ImageConstant.MINI_IMAGE_SIZE_IN_BYTE) { - throw new OperationFailureException(operr("the image size get from url %s is %d bytes, " + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_BACKUP_10075, "the image size get from url %s is %d bytes, " + "it's too small for an image, please check the url again.", url, size)); } else if (size > available) { - throw new OperationFailureException(operr("the backup storage[uuid:%s, name:%s] has not enough capacity to download the image[%s]." + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_BACKUP_10076, "the backup storage[uuid:%s, name:%s] has not enough capacity to download the image[%s]." + "Required size:%s, available size:%s", self.getUuid(), self.getName(), url, size, available)); } } @@ -196,13 +197,13 @@ protected BackupStorageInventory getSelfInventory() { protected void checkStatus(Message msg) { if (!statusChecker.isOperationAllowed(msg.getClass().getName(), self.getStatus().toString())) { - throw new OperationFailureException(operr("backup storage cannot proceed message[%s] because its status is %s", msg.getClass().getName(), self.getStatus())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_BACKUP_10077, "backup storage cannot proceed message[%s] because its status is %s", msg.getClass().getName(), self.getStatus())); } } protected void checkState(Message msg) { if (!stateChecker.isOperationAllowed(msg.getClass().getName(), self.getState().toString())) { - throw new OperationFailureException(operr("backup storage cannot proceed message[%s] because its state is %s", msg.getClass().getName(), self.getState())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_BACKUP_10078, "backup storage cannot proceed message[%s] because its state is %s", msg.getClass().getName(), self.getState())); } } @@ -549,7 +550,7 @@ private void cleanTrash(Long trashId, final ReturnValueCompletion(trashs).all((inv, coml) -> { String details = trash.makeSureInstallPathNotUsed(inv); if (details != null) { - results.add(new TrashCleanupResult(inv.getResourceUuid(), inv.getTrashId(), operr(details))); + results.add(new TrashCleanupResult(inv.getResourceUuid(), inv.getTrashId(), operr(ORG_ZSTACK_STORAGE_BACKUP_10080, details))); coml.done(); return; } @@ -742,7 +743,7 @@ protected void handle(final APIDetachBackupStorageFromZoneMsg msg) { try { extpEmitter.preDetach(self, msg.getZoneUuid()); } catch (BackupStorageException e) { - evt.setError(err(BackupStorageErrors.DETACH_ERROR, e.getMessage())); + evt.setError(err(ORG_ZSTACK_STORAGE_BACKUP_10081, BackupStorageErrors.DETACH_ERROR, e.getMessage())); bus.publish(evt); return; } @@ -775,7 +776,7 @@ public void success() { public void fail(ErrorCode errorCode) { logger.warn(errorCode.getDetails()); extpEmitter.failToDetach(self, msg.getZoneUuid()); - evt.setError(err(BackupStorageErrors.DETACH_ERROR, errorCode, errorCode.getDetails())); + evt.setError(err(ORG_ZSTACK_STORAGE_BACKUP_10082, BackupStorageErrors.DETACH_ERROR, errorCode, errorCode.getDetails())); bus.publish(evt); } }); @@ -787,7 +788,7 @@ protected void handle(final APIAttachBackupStorageToZoneMsg msg) { String errStr = extpEmitter.preAttach(svo, msg.getZoneUuid()); if (errStr != null) { - evt.setError(err(BackupStorageErrors.ATTACH_ERROR, errStr)); + evt.setError(err(ORG_ZSTACK_STORAGE_BACKUP_10083, BackupStorageErrors.ATTACH_ERROR, errStr)); bus.publish(evt); return; } @@ -813,7 +814,7 @@ public void success() { public void fail(ErrorCode errorCode) { logger.warn(errorCode.toString()); extpEmitter.failToAttach(svo, msg.getZoneUuid()); - evt.setError(err(BackupStorageErrors.ATTACH_ERROR, errorCode, errorCode.getDetails())); + evt.setError(err(ORG_ZSTACK_STORAGE_BACKUP_10084, BackupStorageErrors.ATTACH_ERROR, errorCode, errorCode.getDetails())); bus.publish(evt); } }); @@ -829,7 +830,7 @@ protected void handle(APIChangeBackupStorageStateMsg msg) { try { extpEmitter.preChange(self, event); } catch (BackupStorageException e) { - evt.setError(err(SysErrors.CHANGE_RESOURCE_STATE_ERROR, e.getMessage())); + evt.setError(err(ORG_ZSTACK_STORAGE_BACKUP_10085, SysErrors.CHANGE_RESOURCE_STATE_ERROR, e.getMessage())); bus.publish(evt); return; } @@ -910,7 +911,7 @@ public void handle(Map data) { }).error(new FlowErrorHandler(msg) { @Override public void handle(ErrorCode errCode, Map data) { - evt.setError(err(SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); + evt.setError(err(ORG_ZSTACK_STORAGE_BACKUP_10086, SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); bus.publish(evt); } }).start(); diff --git a/storage/src/main/java/org/zstack/storage/backup/BackupStorageCapacityUpdater.java b/storage/src/main/java/org/zstack/storage/backup/BackupStorageCapacityUpdater.java index 85352718e09..b5df99f87cb 100755 --- a/storage/src/main/java/org/zstack/storage/backup/BackupStorageCapacityUpdater.java +++ b/storage/src/main/java/org/zstack/storage/backup/BackupStorageCapacityUpdater.java @@ -18,6 +18,7 @@ import javax.persistence.LockModeType; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by xing5 on 2016/4/28. @@ -136,7 +137,7 @@ private boolean _reserveCapacity(long size, boolean exceptionOnFailure) { if (!exceptionOnFailure) { return false; } else { - throw new OperationFailureException(operr("cannot reserve %s on the backup storage[uuid:%s], it only has %s available", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_BACKUP_10015, "cannot reserve %s on the backup storage[uuid:%s], it only has %s available", size, backupStorageUuid, capacityVO.getAvailableCapacity())); } } diff --git a/storage/src/main/java/org/zstack/storage/backup/BackupStorageCascadeExtension.java b/storage/src/main/java/org/zstack/storage/backup/BackupStorageCascadeExtension.java index 8ccfe7c5c22..32b64b58886 100755 --- a/storage/src/main/java/org/zstack/storage/backup/BackupStorageCascadeExtension.java +++ b/storage/src/main/java/org/zstack/storage/backup/BackupStorageCascadeExtension.java @@ -17,6 +17,7 @@ import java.util.List; import static org.zstack.core.Platform.inerr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -107,7 +108,7 @@ private void handleDeletionCheck(CascadeAction action, Completion completion) { completion.success(); } catch (BackupStorageException e) { - completion.fail(inerr(e.getMessage())); + completion.fail(inerr(ORG_ZSTACK_STORAGE_BACKUP_10001, e.getMessage())); } } diff --git a/storage/src/main/java/org/zstack/storage/backup/BackupStorageMainAllocatorFlow.java b/storage/src/main/java/org/zstack/storage/backup/BackupStorageMainAllocatorFlow.java index f8c812ae2c5..5646f9a2939 100755 --- a/storage/src/main/java/org/zstack/storage/backup/BackupStorageMainAllocatorFlow.java +++ b/storage/src/main/java/org/zstack/storage/backup/BackupStorageMainAllocatorFlow.java @@ -17,6 +17,7 @@ import javax.persistence.TypedQuery; import java.util.List; import java.util.Map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -85,7 +86,7 @@ private Result allocate(Map data) { public void run(FlowTrigger trigger, Map data) { Result ret = allocate(data); if (ret.result.isEmpty()) { - throw new OperationFailureException(operr("%s", ret.error)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_BACKUP_10002, "%s", ret.error)); } data.put(AllocatorParams.CANDIDATES, ret.result); diff --git a/storage/src/main/java/org/zstack/storage/backup/BackupStorageManagerImpl.java b/storage/src/main/java/org/zstack/storage/backup/BackupStorageManagerImpl.java index 9e8e4ee62b3..ce08df36a2b 100755 --- a/storage/src/main/java/org/zstack/storage/backup/BackupStorageManagerImpl.java +++ b/storage/src/main/java/org/zstack/storage/backup/BackupStorageManagerImpl.java @@ -45,6 +45,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class BackupStorageManagerImpl extends AbstractService implements BackupStorageManager, ManagementNodeChangeListener, ManagementNodeReadyExtensionPoint { @@ -198,7 +199,7 @@ public void run(AddBackupStorageExtensionPoint ext) { } else { dbf.removeByPrimaryKey(inv.getUuid(), BackupStorageVO.class); - evt.setError(err(SysErrors.CREATE_RESOURCE_ERROR, reply.getError(), reply.getError().getDetails())); + evt.setError(err(ORG_ZSTACK_STORAGE_BACKUP_10009, SysErrors.CREATE_RESOURCE_ERROR, reply.getError(), reply.getError().getDetails())); bus.publish(evt); } } @@ -273,7 +274,7 @@ private void handle(AllocateBackupStorageMsg msg) { } if (target == null) { - reply.setError(operr("capacity reservation on all backup storage failed")); + reply.setError(operr(ORG_ZSTACK_STORAGE_BACKUP_10010, "capacity reservation on all backup storage failed")); } else { reply.setInventory(target); } @@ -317,7 +318,7 @@ private void check(APIAddBackupStorageMsg msg) { } if (backupStorageDataNetworkTags.size() > 1) { - throw new ApiMessageInterceptionException(argerr("only one backup storage data network system tag is allowed, but %s got", backupStorageDataNetworkTags.size())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_BACKUP_10011, "only one backup storage data network system tag is allowed, but %s got", backupStorageDataNetworkTags.size())); } validateDataNetworkSystemTag(backupStorageDataNetworkTags.get(0)); @@ -333,7 +334,7 @@ private void validateDataNetworkSystemTag(String systemTag) { BackupStorageSystemTags.BACKUP_STORAGE_DATA_NETWORK_TOKEN); String fmtCidr = NetworkUtils.fmtCidr(cidr); if (!fmtCidr.equals(cidr)) { - throw new ApiMessageInterceptionException(argerr("[%s] is not a standard cidr, do you mean [%s]?", cidr, fmtCidr)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_BACKUP_10012, "[%s] is not a standard cidr, do you mean [%s]?", cidr, fmtCidr)); } } } diff --git a/storage/src/main/java/org/zstack/storage/backup/BackupStoragePrimaryStorageAllocatorFlow.java b/storage/src/main/java/org/zstack/storage/backup/BackupStoragePrimaryStorageAllocatorFlow.java index 601beda979d..0c45a5952a5 100644 --- a/storage/src/main/java/org/zstack/storage/backup/BackupStoragePrimaryStorageAllocatorFlow.java +++ b/storage/src/main/java/org/zstack/storage/backup/BackupStoragePrimaryStorageAllocatorFlow.java @@ -18,9 +18,10 @@ import java.util.Map; import static org.zstack.core.Platform.operr; -/** +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*;/** * Created by MaJin on 2020/7/30. */ + @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class BackupStoragePrimaryStorageAllocatorFlow extends NoRollbackFlow { @@ -43,7 +44,7 @@ public void run(FlowTrigger trigger, Map data) { candidates.removeIf(it -> !supportBsUuids.contains(it.getUuid())); if (candidates.isEmpty()) { - trigger.fail(operr("required primary storage[uuid:%s, type:%s] could not support any backup storage.", + trigger.fail(operr(ORG_ZSTACK_STORAGE_BACKUP_10013, "required primary storage[uuid:%s, type:%s] could not support any backup storage.", spec.getRequiredPrimaryStorageUuid(), psTypeName)); return; } diff --git a/storage/src/main/java/org/zstack/storage/backup/BackupStorageReservedCapacityAllocatorFlow.java b/storage/src/main/java/org/zstack/storage/backup/BackupStorageReservedCapacityAllocatorFlow.java index 09628b9322a..29c93c89991 100755 --- a/storage/src/main/java/org/zstack/storage/backup/BackupStorageReservedCapacityAllocatorFlow.java +++ b/storage/src/main/java/org/zstack/storage/backup/BackupStorageReservedCapacityAllocatorFlow.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -52,7 +53,7 @@ public void run(FlowTrigger trigger, Map data) { } if (ret.isEmpty()) { - throw new OperationFailureException(operr("after subtracting reserved capacity, no backup storage has required capacity[%s bytes]", spec.getSize())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_BACKUP_10008, "after subtracting reserved capacity, no backup storage has required capacity[%s bytes]", spec.getSize())); } data.put(AllocatorParams.CANDIDATES, ret); diff --git a/storage/src/main/java/org/zstack/storage/backup/DefaultBackupStorageAllocatorStrategy.java b/storage/src/main/java/org/zstack/storage/backup/DefaultBackupStorageAllocatorStrategy.java index d89705d8fa6..bfd855f80bc 100755 --- a/storage/src/main/java/org/zstack/storage/backup/DefaultBackupStorageAllocatorStrategy.java +++ b/storage/src/main/java/org/zstack/storage/backup/DefaultBackupStorageAllocatorStrategy.java @@ -18,6 +18,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) @@ -59,7 +60,7 @@ public void handle(ErrorCode errCode, Map data) { }).start(); if (ret.errorCode != null) { - throw new BackupStorageException(err(BackupStorageErrors.ALLOCATE_ERROR, ret.errorCode, "unable to allocate a backup storage")); + throw new BackupStorageException(err(ORG_ZSTACK_STORAGE_BACKUP_10000, BackupStorageErrors.ALLOCATE_ERROR, ret.errorCode, "unable to allocate a backup storage")); } else { Collections.shuffle(ret.results); return BackupStorageInventory.valueOf(ret.results); diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageApiInterceptor.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageApiInterceptor.java index 54b59efd08f..53fa4e6a4a5 100755 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageApiInterceptor.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageApiInterceptor.java @@ -34,6 +34,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -87,7 +88,7 @@ private void validate(APIAddStorageProtocolMsg msg) { .eq(PrimaryStorageOutputProtocolRefVO_.primaryStorageUuid, msg.getUuid()) .eq(PrimaryStorageOutputProtocolRefVO_.outputProtocol, msg.getOutputProtocol()) .isExists()) { - throw new ApiMessageInterceptionException(argerr("outputProtocol[%s] is exist on primary storage[%s]" + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_10017, "outputProtocol[%s] is exist on primary storage[%s]" + "no need to add again", msg.getOutputProtocol(), msg.getPrimaryStorageUuid())); } PrimaryStorageVO vo = Q.New(PrimaryStorageVO.class).eq(PrimaryStorageVO_.uuid, msg.getPrimaryStorageUuid()).find(); @@ -108,7 +109,7 @@ private void validate(APIGetPrimaryStorageCapacityMsg msg) { } if (!pass && !msg.isAll()) { - throw new ApiMessageInterceptionException(argerr("zoneUuids, clusterUuids, primaryStorageUuids must have at least one be none-empty list, or all is set to true")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_10018, "zoneUuids, clusterUuids, primaryStorageUuids must have at least one be none-empty list, or all is set to true")); } if (msg.isAll() && (msg.getZoneUuids() == null || msg.getZoneUuids().isEmpty())) { @@ -130,7 +131,7 @@ private void validate(APIDetachPrimaryStorageFromClusterMsg msg) { q.add(PrimaryStorageClusterRefVO_.clusterUuid, Op.EQ, msg.getClusterUuid()); q.add(PrimaryStorageClusterRefVO_.primaryStorageUuid, Op.EQ, msg.getPrimaryStorageUuid()); if (!q.isExists()) { - throw new ApiMessageInterceptionException(argerr("primary storage[uuid:%s] has not been attached to cluster[uuid:%s] yet", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_10019, "primary storage[uuid:%s] has not been attached to cluster[uuid:%s] yet", msg.getPrimaryStorageUuid(), msg.getClusterUuid())); } } @@ -147,7 +148,7 @@ private void validate(APIAttachPrimaryStorageToClusterMsg msg) { q.setParameter("clusterUuid", msg.getClusterUuid()); long count = q.getSingleResult(); if (count != 0) { - throw new ApiMessageInterceptionException(operr("primary storage[uuid:%s] has been attached to cluster[uuid:%s]", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_PRIMARY_10020, "primary storage[uuid:%s] has been attached to cluster[uuid:%s]", msg.getPrimaryStorageUuid(), msg.getClusterUuid())); } } @@ -162,7 +163,7 @@ private void validate(APIAttachPrimaryStorageToClusterMsg msg) { jq.setParameter("clusterUuid", msg.getClusterUuid()); long count = jq.getSingleResult(); if (count == 0) { - throw new ApiMessageInterceptionException(argerr("primary storage[uuid:%s] and cluster[uuid:%s] are not in the same zone", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_10021, "primary storage[uuid:%s] and cluster[uuid:%s] are not in the same zone", msg.getPrimaryStorageUuid(), msg.getClusterUuid())); } } @@ -184,7 +185,7 @@ private void validate(APIAttachPrimaryStorageToClusterMsg msg) { if(count > 0){ throw new ApiMessageInterceptionException( - argerr("url[%s] has been occupied, it cannot be duplicate in same cluster", + argerr(ORG_ZSTACK_STORAGE_PRIMARY_10022, "url[%s] has been occupied, it cannot be duplicate in same cluster", url)); } } @@ -219,7 +220,7 @@ private void validate(APIDeletePrimaryStorageMsg msg) { private void validate(final APIGetTrashOnPrimaryStorageMsg msg) { if ((msg.getResourceType() != null) ^ (msg.getResourceUuid() != null)) { - throw new ApiMessageInterceptionException((argerr("'resourceUuid' and 'resourceType' must be set both or neither!"))); + throw new ApiMessageInterceptionException((argerr(ORG_ZSTACK_STORAGE_PRIMARY_10023, "'resourceUuid' and 'resourceType' must be set both or neither!"))); } } @@ -236,7 +237,7 @@ private void validate(final APICreateVolumeSnapshotGroupMsg msg) { psUuids.removeAll(allowedPsUuids); if (!psUuids.isEmpty()) { - throw new ApiMessageInterceptionException(operr("primary storage(s) [uuid: %s] where volume(s) locate" + + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_PRIMARY_10024, "primary storage(s) [uuid: %s] where volume(s) locate" + " is not Enabled or Connected", psUuids)); } } diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageAvoidAllocatorFlow.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageAvoidAllocatorFlow.java index 293cf1802b5..f333cac2a7c 100755 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageAvoidAllocatorFlow.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageAvoidAllocatorFlow.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.Map; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 7/4/2015. @@ -47,7 +48,7 @@ public PrimaryStorageVO call(PrimaryStorageVO arg) { }); if (candidates.isEmpty()) { - throw new OperationFailureException(operr("after removing primary storage%s to avoid," + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_10030, "after removing primary storage%s to avoid," + " there is no candidate primary storage anymore. " + "please check primary storage status and state in the cluster.", spec.getAvoidPrimaryStorageUuids())); } diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java index 7bb2a705fda..312d3c20d3f 100755 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java @@ -67,6 +67,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = true) public abstract class PrimaryStorageBase extends AbstractPrimaryStorage { @@ -241,7 +242,7 @@ protected void checkImageIfNeedToDownload(DownloadIsoToPrimaryStorageMsg msg){ .isExists()){ throw new OperationFailureException(operr( - "cannot attach ISO to a primary storage[uuid:%s] which is disabled", + ORG_ZSTACK_STORAGE_PRIMARY_10000, "cannot attach ISO to a primary storage[uuid:%s] which is disabled", self.getUuid())); } } @@ -459,7 +460,7 @@ public void done(ErrorCodeList errorCodeList) { } protected void handle(CleanUpStorageTrashOnPrimaryStorageMsg msg) { - throw new OperationFailureException(operr("operation not supported")); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_10001, "operation not supported")); } protected void handle(final CleanUpTrashOnPrimaryStroageMsg msg) { @@ -726,7 +727,7 @@ public void fail(ErrorCode errorCode) { private void handleBase(CheckVolumeSnapshotOperationOnPrimaryStorageMsg msg) { if (self.getStatus() != PrimaryStorageStatus.Connected) { CheckVolumeSnapshotOperationOnPrimaryStorageReply reply = new CheckVolumeSnapshotOperationOnPrimaryStorageReply(); - reply.setError(err(PrimaryStorageErrors.DISCONNECTED, "primary storage[uuid:%s] is not Connected", self.getUuid())); + reply.setError(err(ORG_ZSTACK_STORAGE_PRIMARY_10002, PrimaryStorageErrors.DISCONNECTED, "primary storage[uuid:%s] is not Connected", self.getUuid())); bus.reply(msg, reply); return; } @@ -782,7 +783,7 @@ private void checkIfBackupStorageAttachedToMyZone(String bsUuid) { q.setParameter("zoneUuid", self.getZoneUuid()); q.setParameter("bsUuid", bsUuid); if (q.getResultList().isEmpty()) { - throw new OperationFailureException(operr("backup storage[uuid:%s] is not attached to zone[uuid:%s] the primary storage[uuid:%s] belongs to", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_10003, "backup storage[uuid:%s] is not attached to zone[uuid:%s] the primary storage[uuid:%s] belongs to", bsUuid, self.getZoneUuid(), self.getUuid())); } } @@ -802,7 +803,7 @@ private void checkVolumeNotActive(String volUuid) { .param("volUuid", volUuid) .find(); if (vmState != null && vmState != VmInstanceState.Stopped) { - throw new ApiMessageInterceptionException(operr("volume[uuid:%s] has been attached a %s VM. VM should be Stopped.", volUuid, vmState)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_PRIMARY_10004, "volume[uuid:%s] has been attached a %s VM. VM should be Stopped.", volUuid, vmState)); } } @@ -871,7 +872,7 @@ public void success() { public void fail(ErrorCode errorCode) { extpEmitter.failToDetach(self, msg.getClusterUuid()); logger.warn(errorCode.toString()); - reply.setError(err(PrimaryStorageErrors.DETACH_ERROR, errorCode, errorCode.getDetails())); + reply.setError(err(ORG_ZSTACK_STORAGE_PRIMARY_10005, PrimaryStorageErrors.DETACH_ERROR, errorCode, errorCode.getDetails())); bus.reply(msg, reply); chain.next(); } @@ -1005,7 +1006,7 @@ protected void doAddProtocol(APIAddStorageProtocolMsg msg, Completion completion } protected void handle(APICleanUpImageCacheOnPrimaryStorageMsg msg) { - throw new OperationFailureException(operr("operation not supported")); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_10006, "operation not supported")); } private void handle(final APIGetTrashOnPrimaryStorageMsg msg) { @@ -1026,7 +1027,7 @@ private void handle(final APIGetTrashOnPrimaryStorageMsg msg) { } protected void handle(APICleanUpStorageTrashOnPrimaryStorageMsg msg) { - throw new OperationFailureException(operr("operation not supported")); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_10007, "operation not supported")); } protected synchronized void updateTrashSize(CleanTrashResult result, Long size) { @@ -1043,7 +1044,7 @@ private void cleanTrash(Long trashId, final ReturnValueCompletion considerImageBackupStorageRef(PrimaryStorageAlloc public void run(FlowTrigger trigger, Map data) { Result ret = allocate(data); if (ret.result.isEmpty()) { - throw new OperationFailureException(operr("%s", ret.error)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_10027, "%s", ret.error)); } logger.debug(String.format("PrimaryStorageMainAllocatorFlow: %s", ret.result.size())); diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageManagerImpl.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageManagerImpl.java index 41667e71f2a..ca4e6ac05f6 100755 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageManagerImpl.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageManagerImpl.java @@ -75,6 +75,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class PrimaryStorageManagerImpl extends AbstractService implements PrimaryStorageManager, ManagementNodeChangeListener, ManagementNodeReadyExtensionPoint, VmInstanceStartExtensionPoint, @@ -123,11 +124,11 @@ public void validateSystemTag(String resourceUuid, Class resourceType, String sy String uuid = PrimaryStorageSystemTags.PRIMARY_STORAGE_ALLOCATOR_UUID_TAG.getTokenByTag( systemTag, PrimaryStorageSystemTags.PRIMARY_STORAGE_ALLOCATOR_UUID_TAG_TOKEN); if (!StringDSL.isZStackUuid(uuid)) { - throw new ApiMessageInterceptionException(argerr("%s is invalid. %s is not a valid zstack uuid", systemTag, uuid)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_10038, "%s is invalid. %s is not a valid zstack uuid", systemTag, uuid)); } if (!dbf.isExist(uuid, PrimaryStorageVO.class)) { - throw new ApiMessageInterceptionException(argerr("no primary storage[uuid:%s] found", resourceUuid)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_10039, "no primary storage[uuid:%s] found", resourceUuid)); } } }); @@ -157,7 +158,7 @@ private void handle(APIGetPrimaryStorageLicenseInfoMsg msg) { APIGetPrimaryStorageLicenseInfoReply sreply = new APIGetPrimaryStorageLicenseInfoReply(); PrimaryStorageVO vo = dbf.findByUuid(msg.getUuid(), PrimaryStorageVO.class); if (vo == null) { - sreply.setError(operr("primaryStorage[uuid=%s] does not exist", msg.getUuid())); + sreply.setError(operr(ORG_ZSTACK_STORAGE_PRIMARY_10040, "primaryStorage[uuid=%s] does not exist", msg.getUuid())); bus.reply(msg, sreply); return; } @@ -298,7 +299,7 @@ private void passThrough(PrimaryStorageMessage pmsg) { Message msg = (Message) pmsg; if (vo == null) { - bus.replyErrorByMessageType(msg, err(SysErrors.RESOURCE_NOT_FOUND, "Cannot find primary storage[uuid:%s], it may have been deleted", pmsg.getPrimaryStorageUuid())); + bus.replyErrorByMessageType(msg, err(ORG_ZSTACK_STORAGE_PRIMARY_10041, SysErrors.RESOURCE_NOT_FOUND, "Cannot find primary storage[uuid:%s], it may have been deleted", pmsg.getPrimaryStorageUuid())); return; } @@ -550,7 +551,7 @@ private void allocatePrimaryStoreSpace(AllocatePrimaryStorageSpaceMsg msg, NoErr AllocatePrimaryStorageSpaceReply reply = new AllocatePrimaryStorageSpaceReply(null); if (msg.getRequiredInstallUri() == null && msg.getPurpose() == null) { throw new OperationFailureException( - argerr("please specify the purpose before allocating space")); + argerr(ORG_ZSTACK_STORAGE_PRIMARY_10042, "please specify the purpose before allocating space")); } if (msg.getRequiredInstallUri() != null && msg.isForce()) { @@ -615,7 +616,7 @@ private void allocatePrimaryStoreSpace(AllocatePrimaryStorageSpaceMsg msg, NoErr } if (target == null) { - throw new OperationFailureException(operr("cannot find any qualified primary storage, errors are %s", errs)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_10043, "cannot find any qualified primary storage, errors are %s", errs)); } reply.setPrimaryStorageInventory(target); @@ -670,7 +671,7 @@ private void allocatePrimaryStore(AllocatePrimaryStorageMsg msg, NoErrorCompleti } if (target == null) { - throw new OperationFailureException(operr("cannot find any qualified primary storage, errors are %s", errs)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_10044, "cannot find any qualified primary storage, errors are %s", errs)); } reply.setPrimaryStorageInventory(target); @@ -887,7 +888,7 @@ public void validateSystemTag(String resourceUuid, Class resourceType, String sy String cidr = PrimaryStorageSystemTags.PRIMARY_STORAGE_GATEWAY.getTokenByTag(systemTag, PrimaryStorageSystemTags.PRIMARY_STORAGE_GATEWAY_TOKEN); if (!NetworkUtils.isCidr(cidr)) { throw new ApiMessageInterceptionException(argerr( - "cidr[%s] Input Format Error", cidr)); + ORG_ZSTACK_STORAGE_PRIMARY_10045, "cidr[%s] Input Format Error", cidr)); } } } @@ -902,12 +903,12 @@ public void validateSystemTagInCreateMessage(APICreateMessage msg) { for (String systemTag : msg.getSystemTags()) { if (PrimaryStorageSystemTags.PRIMARY_STORAGE_GATEWAY.isMatch(systemTag)) { if (++cidrCount > 1) { - throw new ApiMessageInterceptionException(argerr("only one primaryStorage cidr system tag is allowed, but %d got", cidrCount)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_10046, "only one primaryStorage cidr system tag is allowed, but %d got", cidrCount)); } String cidr = PrimaryStorageSystemTags.PRIMARY_STORAGE_GATEWAY.getTokenByTag(systemTag, PrimaryStorageSystemTags.PRIMARY_STORAGE_GATEWAY_TOKEN); if (!NetworkUtils.isCidr(cidr)) { throw new ApiMessageInterceptionException(argerr( - "cidr[%s] Input Format Error", cidr)); + ORG_ZSTACK_STORAGE_PRIMARY_10047, "cidr[%s] Input Format Error", cidr)); } } } @@ -1351,7 +1352,7 @@ private void checkVmAllVolumePrimaryStorageState(String vmUuid) { .param("psState", PrimaryStorageState.Maintenance) .list(); if (result != null && !result.isEmpty()) { - throw new OperationFailureException(argerr("the VM[uuid:%s] volume stored location primary storage is in a state of maintenance", vmUuid)); + throw new OperationFailureException(argerr(ORG_ZSTACK_STORAGE_PRIMARY_10048, "the VM[uuid:%s] volume stored location primary storage is in a state of maintenance", vmUuid)); } } @@ -1400,7 +1401,7 @@ public void preCreateVmInstance(CreateVmInstanceMsg msg) { } if (msg.getClusterUuid() != null && !msg.getClusterUuid().equals(clusterUuid)) { - throw new OperationFailureException(operr("clusterUuid conflict, the cluster specified by the instance offering is %s, and the cluster specified in the creation parameter is %s" + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_10049, "clusterUuid conflict, the cluster specified by the instance offering is %s, and the cluster specified in the creation parameter is %s" , clusterUuid, msg.getClusterUuid())); } @@ -1415,7 +1416,7 @@ private void settingRootVolume(CreateVmInstanceMsg msg) { if (config.getAllocate() != null && config.getAllocate().getPrimaryStorage() != null) { String psUuid = config.getAllocate().getPrimaryStorage().getUuid(); if (!msg.getCandidatePrimaryStorageUuidsForRootVolume().isEmpty() && !msg.getCandidatePrimaryStorageUuidsForRootVolume().contains(psUuid)) { - throw new OperationFailureException(operr("primaryStorageUuid conflict, the primary storage specified by the instance offering is %s, and the primary storage specified in the creation parameter is %s" + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_10050, "primaryStorageUuid conflict, the primary storage specified by the instance offering is %s, and the primary storage specified in the creation parameter is %s" , psUuid, msg.getCandidatePrimaryStorageUuidsForRootVolume())); } msg.setPrimaryStorageUuidForRootVolume(psUuid); @@ -1436,7 +1437,7 @@ private void settingRootVolume(CreateVmInstanceMsg msg) { List requiredPrimaryStorageUuids = config.getAllocate().getAllPrimaryStorages().stream() .map(PrimaryStorageAllocateConfig::getUuid).collect(Collectors.toList()); if (!msg.getCandidatePrimaryStorageUuidsForRootVolume().isEmpty() && Collections.disjoint(requiredPrimaryStorageUuids, msg.getCandidatePrimaryStorageUuidsForRootVolume())) { - throw new OperationFailureException(operr("primaryStorageUuid conflict, the primary storage specified by the disk offering are %s, and the primary storage specified in the creation parameter is %s", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_10051, "primaryStorageUuid conflict, the primary storage specified by the disk offering are %s, and the primary storage specified in the creation parameter is %s", requiredPrimaryStorageUuids, msg.getCandidatePrimaryStorageUuidsForRootVolume())); } else if (msg.getCandidatePrimaryStorageUuidsForRootVolume().isEmpty()) { msg.setCandidatePrimaryStorageUuidsForRootVolume(requiredPrimaryStorageUuids); @@ -1463,7 +1464,7 @@ private void settingDataVolume(CreateVmInstanceMsg msg) { List requiredPrimaryStorageUuids = config.getAllocate().getAllPrimaryStorages().stream() .map(PrimaryStorageAllocateConfig::getUuid).collect(Collectors.toList()); if (!msg.getCandidatePrimaryStorageUuidsForDataVolume().isEmpty() && Collections.disjoint(requiredPrimaryStorageUuids, msg.getCandidatePrimaryStorageUuidsForDataVolume())) { - throw new OperationFailureException(operr("primaryStorageUuid conflict, the primary storage specified by the disk offering are %s, and the primary storage specified in the creation parameter is %s", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_10052, "primaryStorageUuid conflict, the primary storage specified by the disk offering are %s, and the primary storage specified in the creation parameter is %s", requiredPrimaryStorageUuids, msg.getCandidatePrimaryStorageUuidsForDataVolume())); } else if (msg.getCandidatePrimaryStorageUuidsForDataVolume().isEmpty()) { msg.setCandidatePrimaryStorageUuidsForDataVolume(requiredPrimaryStorageUuids); diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageReservedCapacityAllocatorFlow.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageReservedCapacityAllocatorFlow.java index 3e88b0af7ac..f2a45c780b3 100755 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageReservedCapacityAllocatorFlow.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageReservedCapacityAllocatorFlow.java @@ -20,6 +20,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -45,7 +46,7 @@ public void run(FlowTrigger trigger, Map data) { ).collect(Collectors.toList()); if (ret.isEmpty()) { - throw new OperationFailureException(operr("after subtracting reserved capacity[%s], there is no primary storage having required size[%s bytes], may be the threshold of primary storage physical capacity setting is lower", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_10028, "after subtracting reserved capacity[%s], there is no primary storage having required size[%s bytes], may be the threshold of primary storage physical capacity setting is lower", PrimaryStorageGlobalConfig.RESERVED_CAPACITY.value(), spec.getSize())); } diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageTagAllocatorExtension.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageTagAllocatorExtension.java index 3446af78de2..045f3393f99 100755 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageTagAllocatorExtension.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageTagAllocatorExtension.java @@ -24,6 +24,7 @@ import static org.zstack.core.Platform.err; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -50,7 +51,7 @@ public String call(HostVO arg) { candidates = q.getResultList(); if (candidates.isEmpty()) { - throw new OperationFailureException(err(HostAllocatorError.NO_AVAILABLE_HOST, + throw new OperationFailureException(err(ORG_ZSTACK_STORAGE_PRIMARY_10031, HostAllocatorError.NO_AVAILABLE_HOST, "cannot find host whose cluster has attached to primary storage[uuid:%s]. The primary storage uuid is specified in instance offering tag", psUuid )); } @@ -101,7 +102,7 @@ public String call(HostVO arg) { List vos = q.getResultList(); if (vos.isEmpty() && required) { - throw new OperationFailureException(err(HostAllocatorError.NO_AVAILABLE_HOST, + throw new OperationFailureException(err(ORG_ZSTACK_STORAGE_PRIMARY_10032, HostAllocatorError.NO_AVAILABLE_HOST, "cannot find host whose cluster has attached to primary storage having user tag[%s]. The user tag is specified in instance offering tag", tag )); } else if (vos.isEmpty()) { @@ -124,7 +125,7 @@ public PrimaryStorageVO call(PrimaryStorageVO arg) { }); if (pvo == null) { - throw new OperationFailureException(operr("cannot find primary storage[uuid:%s], the uuid is specified in instance offering or disk offering", uuid)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_10033, "cannot find primary storage[uuid:%s], the uuid is specified in instance offering or disk offering", uuid)); } List psvos = new ArrayList(); @@ -164,7 +165,7 @@ public String call(PrimaryStorageVO arg) { List vos = q.getResultList(); if (vos.isEmpty() && required) { - throw new OperationFailureException(operr("cannot find primary storage having user tag[%s]. The user tag is specified in instance offering or disk offering", tag)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_10034, "cannot find primary storage having user tag[%s]. The user tag is specified in instance offering or disk offering", tag)); } else if (vos.isEmpty()) { return candidates; } else { diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageTagAllocatorFlow.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageTagAllocatorFlow.java index 26595c4b199..eb65bd7e051 100755 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageTagAllocatorFlow.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageTagAllocatorFlow.java @@ -26,6 +26,7 @@ import java.util.Map; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -77,7 +78,7 @@ protected List callTagExtensions(List tags } if (ret.isEmpty()) { - throw new OperationFailureException(operr("PrimaryStorageTagAllocatorExtensionPoint[%s] returns zero primary storage candidate", extp.getClass().getName())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_PRIMARY_10036, "PrimaryStorageTagAllocatorExtensionPoint[%s] returns zero primary storage candidate", extp.getClass().getName())); } candidates = ret; diff --git a/storage/src/main/java/org/zstack/storage/snapshot/DeleteVolumeSnapshotLongJob.java b/storage/src/main/java/org/zstack/storage/snapshot/DeleteVolumeSnapshotLongJob.java index 1b7864807d5..65e4e36c924 100644 --- a/storage/src/main/java/org/zstack/storage/snapshot/DeleteVolumeSnapshotLongJob.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/DeleteVolumeSnapshotLongJob.java @@ -22,6 +22,7 @@ import org.zstack.header.vm.*; import org.zstack.header.volume.VolumeVO; import org.zstack.utils.gson.JSONObjectUtil; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by kayo on 2018/5/9. @@ -95,22 +96,22 @@ public void run(MessageReply reply) { private ErrorCode checkIfVolumeSnapshotSupportCancel(String volumeUuid) { VolumeVO volume = dbf.findByUuid(volumeUuid, VolumeVO.class); if (volume == null) { - return Platform.operr("failed to cancel deletion job. Volume[uuid:%s] not exists."); + return Platform.operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10026, "failed to cancel deletion job. Volume[uuid:%s] not exists."); } if (volume.getVmInstanceUuid() == null) { - return Platform.operr("failed to cancel deletion job. Volume[uuid:%s] not attached to any vm," + + return Platform.operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10027, "failed to cancel deletion job. Volume[uuid:%s] not attached to any vm," + " offline snapshot deletion do not support cancel."); } VmInstanceVO vmInstance = dbf.findByUuid(volume.getVmInstanceUuid(), VmInstanceVO.class); if (vmInstance == null) { - return Platform.operr("failed to cancel deletion job. Volume[uuid:%s] attached vm not exists," + + return Platform.operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10028, "failed to cancel deletion job. Volume[uuid:%s] attached vm not exists," + " offline snapshot deletion do not support cancel."); } if (!vmInstance.getState().equals(VmInstanceState.Running)) { - return Platform.operr("failed to cancel deletion job. Volume[uuid:%s] attached vm not in state %s" + + return Platform.operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10029, "failed to cancel deletion job. Volume[uuid:%s] attached vm not in state %s" + " offline snapshot deletion do not support cancel.", VmInstanceState.Running); } diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotApiInterceptor.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotApiInterceptor.java index 1da009fc2d9..33205212024 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotApiInterceptor.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotApiInterceptor.java @@ -32,6 +32,7 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** @@ -98,7 +99,7 @@ private void validate(APIRevertVmFromSnapshotGroupMsg msg) { if (!disabledSnapshotUuids.isEmpty()) { throw new ApiMessageInterceptionException(operr( - "volume snapshot[uuids:%s] is in state Disabled, cannot revert volume to it", disabledSnapshotUuids) + ORG_ZSTACK_STORAGE_SNAPSHOT_10020, "volume snapshot[uuids:%s] is in state Disabled, cannot revert volume to it", disabledSnapshotUuids) ); } @@ -118,7 +119,7 @@ private void validate(APIRevertVmFromSnapshotGroupMsg msg) { .eq(VmInstanceVO_.uuid, group.getVmInstanceUuid()) .in(VmInstanceVO_.state, Arrays.asList(VmInstanceState.Running, VmInstanceState.Paused)) .isExists()) { - throw new ApiMessageInterceptionException(argerr("Can not take memory snapshot, expected vm states are [%s, %s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_SNAPSHOT_10021, "Can not take memory snapshot, expected vm states are [%s, %s]", VmInstanceState.Running.toString(), VmInstanceState.Paused.toString())); } @@ -187,12 +188,12 @@ private void validate(APIRevertVolumeFromSnapshotMsg msg) { Tuple t = q.findTuple(); VolumeSnapshotState state = t.get(0, VolumeSnapshotState.class); if (state != VolumeSnapshotState.Enabled) { - throw new ApiMessageInterceptionException(operr("volume snapshot[uuid:%s] is in state %s, cannot revert volume to it", msg.getUuid(), state)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10022, "volume snapshot[uuid:%s] is in state %s, cannot revert volume to it", msg.getUuid(), state)); } String volUuid = t.get(1, String.class); if (volUuid == null) { - throw new ApiMessageInterceptionException(operr("original volume for snapshot[uuid:%s] has been deleted, cannot revert volume to it", msg.getUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10023, "original volume for snapshot[uuid:%s] has been deleted, cannot revert volume to it", msg.getUuid())); } } @@ -210,11 +211,11 @@ private void validate(APIBatchDeleteVolumeSnapshotMsg msg) { if (msg.getVolumeUuid() == null) { msg.setVolumeUuid(snapshotVO.getVolumeUuid()); } else if (!snapshotVO.getVolumeUuid().equals(msg.getVolumeUuid())) { - throw new ApiMessageInterceptionException(operr("not support delete snapshots on different volumes[uuid: %s, %s]", msg.getVolumeUuid(), snapshotVO.getVolumeUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10024, "not support delete snapshots on different volumes[uuid: %s, %s]", msg.getVolumeUuid(), snapshotVO.getVolumeUuid())); } } if (msg.getVolumeUuid() == null) { - throw new ApiMessageInterceptionException(operr("can not find volume uuid for snapshosts[uuid: %s]", msg.getUuids())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10025, "can not find volume uuid for snapshosts[uuid: %s]", msg.getUuids())); } } } diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java index 7488f23e178..6ac46abd7d8 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java @@ -63,6 +63,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.core.progress.ProgressReportService.reportProgress; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -106,7 +107,7 @@ public class VolumeSnapshotManagerImpl extends AbstractService implements private void passThrough(VolumeSnapshotMessage msg) { VolumeSnapshotVO vo = dbf.findByUuid(msg.getSnapshotUuid(), VolumeSnapshotVO.class); if (vo == null) { - throw new OperationFailureException(err(SysErrors.RESOURCE_NOT_FOUND, + throw new OperationFailureException(err(ORG_ZSTACK_STORAGE_SNAPSHOT_10010, SysErrors.RESOURCE_NOT_FOUND, "cannot find volume snapshot[uuid:%s]", msg.getSnapshotUuid() )); } @@ -126,7 +127,7 @@ private void passThrough(VolumeSnapshotMessage msg) { private void passThrough(VolumeSnapshotGroupMessage msg) { VolumeSnapshotGroupVO vo = dbf.findByUuid(msg.getGroupUuid(), VolumeSnapshotGroupVO.class); if (vo == null) { - throw new OperationFailureException(err(SysErrors.RESOURCE_NOT_FOUND, + throw new OperationFailureException(err(ORG_ZSTACK_STORAGE_SNAPSHOT_10011, SysErrors.RESOURCE_NOT_FOUND, "cannot find volume snapshot[uuid:%s]", msg.getGroupUuid() )); } @@ -618,7 +619,7 @@ private VolumeSnapshotStruct saveChainTypeSnapshot(VolumeSnapshotVO vo, Snapshot final Integer maxIncrementalSnapshotNum = getMaxIncrementalSnapshotNum(vo.getVolumeUuid()); if (!CoreGlobalProperty.UNIT_TEST_ON) { if (maxIncrementalSnapshotNum <= 1) { - throw new OperationFailureException(operr("Unsupported maximum snapshot number (%d) for volume [uuid:%s]", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10012, "Unsupported maximum snapshot number (%d) for volume [uuid:%s]", maxIncrementalSnapshotNum, vo.getVolumeUuid() )); } @@ -719,13 +720,13 @@ private VolumeSnapshotStruct getVolumeSnapshotStruct(CreateVolumeSnapshotMsg msg bus.makeLocalServiceId(askMsg, PrimaryStorageConstant.SERVICE_ID); MessageReply reply = bus.call(askMsg); if (!reply.isSuccess()) { - throw new OperationFailureException(operr("cannot ask primary storage[uuid:%s] for volume snapshot capability, see detail [%s]", vol.getUuid(),reply.getError())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10013, "cannot ask primary storage[uuid:%s] for volume snapshot capability, see detail [%s]", vol.getUuid(),reply.getError())); } AskVolumeSnapshotCapabilityReply areply = reply.castReply(); VolumeSnapshotCapability capability = areply.getCapability(); if (!capability.isSupport()) { - throw new OperationFailureException(operr("primary storage[uuid:%s] doesn't support volume snapshot;" + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10014, "primary storage[uuid:%s] doesn't support volume snapshot;" + " cannot create snapshot for volume[uuid:%s]", primaryStorageUuid, vol.getUuid())); } @@ -1050,7 +1051,7 @@ private void handle(MarkRootVolumeAsSnapshotMsg msg) { String psType = Q.New(PrimaryStorageVO.class).select(PrimaryStorageVO_.type).eq(PrimaryStorageVO_.uuid, vol.getPrimaryStorageUuid()).findValue(); if (psType == null) { - ret.setError(operr("cannot find type for primaryStorage [%s]", vol.getPrimaryStorageUuid())); + ret.setError(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10015, "cannot find type for primaryStorage [%s]", vol.getPrimaryStorageUuid())); bus.reply(msg, ret); return; } @@ -1073,7 +1074,7 @@ public void run(FlowTrigger trigger, Map data) { bus.makeTargetServiceIdByResourceUuid(askMsg, PrimaryStorageConstant.SERVICE_ID, primaryStorageUuid); MessageReply reply = bus.call(askMsg); if (!reply.isSuccess()) { - ret.setError(operr(reply.getError(), + ret.setError(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10016, reply.getError(), "cannot ask primary storage[uuid:%s] for volume snapshot capability", vol.getUuid())); bus.reply(msg, ret); @@ -1084,7 +1085,7 @@ public void run(FlowTrigger trigger, Map data) { AskVolumeSnapshotCapabilityReply areply = reply.castReply(); capability = areply.getCapability(); if (!capability.isSupport()) { - ret.setError(operr("primary storage[uuid:%s] doesn't support volume snapshot;" + + ret.setError(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10017, "primary storage[uuid:%s] doesn't support volume snapshot;" + " cannot create snapshot for volume[uuid:%s]", primaryStorageUuid, vol.getUuid())); bus.reply(msg, ret); trigger.fail(ret.getError()); @@ -1147,7 +1148,7 @@ public void run(FlowTrigger trigger, Map data) { String uuid = vo.getUuid(); vo = dbf.findByUuid(uuid, VolumeSnapshotVO.class); if (vo == null) { - trigger.fail(operr("cannot find snapshot: %s", uuid)); + trigger.fail(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10018, "cannot find snapshot: %s", uuid)); return; } List extensions = pluginRgty.getExtensionList(PostMarkRootVolumeAsSnapshotExtension.class); @@ -1216,7 +1217,7 @@ private void handle(APIGetMemorySnapshotGroupReferenceMsg msg) { return; } - reply.setError(operr("this resource type %s does not support querying memory snapshot references", msg.getResourceType())); + reply.setError(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10019, "this resource type %s does not support querying memory snapshot references", msg.getResourceType())); bus.reply(msg, reply); } diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java index f1c85050361..13a67af0970 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java @@ -73,6 +73,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.core.progress.ProgressReportService.reportProgress; import static org.zstack.utils.CollectionDSL.e; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -144,7 +145,7 @@ private ErrorCode isOperationAllowed(Message msg) { if (allowedStatus.isOperationAllowed(msg.getClass().getName(), currentRoot.getStatus().toString())) { return null; } else { - return err(VolumeSnapshotErrors.NOT_IN_CORRECT_STATE, + return err(ORG_ZSTACK_STORAGE_SNAPSHOT_10000, VolumeSnapshotErrors.NOT_IN_CORRECT_STATE, "snapshot[uuid:%s, name:%s]'s status[%s] is not allowed for message[%s], allowed status%s", currentRoot.getUuid(), currentRoot.getName(), currentRoot.getStatus(), msg.getClass().getName(), allowedStatus.getStatesForOperation(msg.getClass().getName())); } @@ -153,7 +154,7 @@ private ErrorCode isOperationAllowed(Message msg) { private void refreshVO() { VolumeSnapshotVO vo = dbf.reload(currentRoot); if (vo == null) { - throw new OperationFailureException(operr("cannot find volume snapshot[uuid:%s, name:%s], it may have been deleted by previous operation", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10001, "cannot find volume snapshot[uuid:%s, name:%s], it may have been deleted by previous operation", currentRoot.getUuid(), currentRoot.getName())); } @@ -399,7 +400,7 @@ public void run(FlowTrigger trigger, Map data) { return; } - trigger.fail(operr("snapshot or its desendant has reference volume[uuids:%s]", refVolUuids)); + trigger.fail(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10002, "snapshot or its desendant has reference volume[uuids:%s]", refVolUuids)); } }); flow(new NoRollbackFlow() { @@ -773,7 +774,7 @@ private void deleteSingleFlows() { public void run(final FlowTrigger trigger, Map data) { if (volume == null) { - trigger.fail(operr("volume not found for volumeUuid: %s", msg.getVolumeUuid())); + trigger.fail(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10003, "volume not found for volumeUuid: %s", msg.getVolumeUuid())); return; } @@ -797,7 +798,7 @@ public void fail(ErrorCode errorCode) { vmState = Q.New(VmInstanceVO.class).eq(VmInstanceVO_.uuid, volume.getVmInstanceUuid()).select(VmInstanceVO_.state).findValue(); if (vmState != VmInstanceState.Running && vmState != VmInstanceState.Paused && vmState != VmInstanceState.Destroyed && vmState != VmInstanceState.Stopped && vmState != VmInstanceState.Destroying) { - trigger.fail(operr("vm[uuid:%s] is not Running, Paused or Destroyed, Stopped, Destroying, " + + trigger.fail(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10004, "vm[uuid:%s] is not Running, Paused or Destroyed, Stopped, Destroying, " + "current state[%s]", volume.getVmInstanceUuid(), vmState)); return; } @@ -889,7 +890,7 @@ public void run(FlowTrigger trigger, Map data) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { - trigger.fail(operr(String.format("failed to get volume[uuid:%s, installPath:%s] size " + + trigger.fail(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10005, String.format("failed to get volume[uuid:%s, installPath:%s] size " + "on primary storage[uuid:%s], %s", volume.getUuid(), volume.getInstallPath(), volume.getPrimaryStorageUuid(), reply.getError().getDetails()))); return; @@ -1149,7 +1150,7 @@ public void run(FlowTrigger trigger, Map data) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { - trigger.fail(operr(String.format("failed to get volume[uuid:%s, installPath:%s] size on primary storage[uuid:%s], because %s", + trigger.fail(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10006, String.format("failed to get volume[uuid:%s, installPath:%s] size on primary storage[uuid:%s], because %s", volume.getUuid(), volume.getInstallPath(), volume.getPrimaryStorageUuid(), reply.getError().getDetails()))); return; } @@ -1638,7 +1639,7 @@ public void run(List replies) { } if (err != null) { - completion.fail(operr("failed to change status of volume snapshot[uuid:%s, name:%s] by status event[%s]", + completion.fail(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10007, "failed to change status of volume snapshot[uuid:%s, name:%s] by status event[%s]", failSnapshot.getUuid(), failSnapshot.getName(), evt).causedBy(err)); } else { completion.success(); @@ -2546,7 +2547,7 @@ public void run(FlowTrigger trigger, Map data) { q.add(VmInstanceVO_.uuid, Op.EQ, vmUuid); VmInstanceState state = q.findValue(); if (state != VmInstanceState.Stopped) { - trigger.fail(operr("unable to reset volume[uuid:%s] to snapshot[uuid:%s]," + + trigger.fail(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_10008, "unable to reset volume[uuid:%s] to snapshot[uuid:%s]," + " the vm[uuid:%s] volume attached to is not in Stopped state," + " current state is %s", volumeInventory.getUuid(), @@ -2897,7 +2898,7 @@ public void handle(Map data) { }).error(new FlowErrorHandler(completion) { @Override public void handle(ErrorCode errCode, Map data) { - completion.fail(err(SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); + completion.fail(err(ORG_ZSTACK_STORAGE_SNAPSHOT_10009, SysErrors.DELETE_RESOURCE_ERROR, errCode, errCode.getDetails())); } }).start(); } diff --git a/storage/src/main/java/org/zstack/storage/snapshot/group/VolumeSnapshotGroupBase.java b/storage/src/main/java/org/zstack/storage/snapshot/group/VolumeSnapshotGroupBase.java index 4463fe97847..6208b3f9bf4 100644 --- a/storage/src/main/java/org/zstack/storage/snapshot/group/VolumeSnapshotGroupBase.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/group/VolumeSnapshotGroupBase.java @@ -48,6 +48,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.storage.snapshot.VolumeSnapshotMessageRouter.getResourceIdToRouteMsg; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by MaJin on 2019/7/9. @@ -357,7 +358,7 @@ private void handle(RevertVmFromSnapshotGroupInnerMsg msg) { VolumeSnapshotGroupAvailability availability = VolumeSnapshotGroupChecker.getAvailability(self); if (!availability.isAvailable()) { - reply.setError(operr(availability.getReason())); + reply.setError(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_GROUP_10000, availability.getReason())); bus.reply(msg, reply); return; } diff --git a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java index 49662466a46..39293324faa 100644 --- a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java @@ -30,6 +30,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class VolumeSnapshotReferenceUtils { private static final CLogger logger = Utils.getLogger(VolumeSnapshotReferenceUtils.class); @@ -423,7 +424,7 @@ public static void handleVolumeInstallUrlChange(String volumeUuid, Map refVols = getReferenceVolume(volumeUuid); if (!refVols.isEmpty()) { List infos = refVols.stream().map(v -> String.format("uuid:%s, name:%s", v.getUuid(), v.getName())).collect(Collectors.toList()); - throw new OperationFailureException(operr(" volume[uuid: %s] has been referenced by other volumes [%s], " + + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_SNAPSHOT_REFERENCE_10000, " volume[uuid: %s] has been referenced by other volumes [%s], " + "can not change install path before flatten them and their descendants ", volumeUuid, infos.toString())); } diff --git a/storage/src/main/java/org/zstack/storage/volume/AbstractVolume.java b/storage/src/main/java/org/zstack/storage/volume/AbstractVolume.java index c96b6ca2ea9..3528ba8f62a 100644 --- a/storage/src/main/java/org/zstack/storage/volume/AbstractVolume.java +++ b/storage/src/main/java/org/zstack/storage/volume/AbstractVolume.java @@ -16,6 +16,7 @@ import org.zstack.utils.message.OperationChecker; import java.util.Set; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public abstract class AbstractVolume { @@ -89,10 +90,10 @@ private ErrorCode validateOperationByState(OperationChecker checker, Message msg return null; } - ErrorCode cause = Platform.err(VmErrors.NOT_IN_CORRECT_STATE, "current volume state[%s] doesn't allow to proceed message[%s]", currentState, + ErrorCode cause = Platform.err(ORG_ZSTACK_STORAGE_VOLUME_10094, VmErrors.NOT_IN_CORRECT_STATE, "current volume state[%s] doesn't allow to proceed message[%s]", currentState, msg.getMessageName()); if (errorCode != null) { - return Platform.err(errorCode, cause, cause.getDetails()); + return Platform.err(ORG_ZSTACK_STORAGE_VOLUME_10095, errorCode, cause, cause.getDetails()); } return cause; } diff --git a/storage/src/main/java/org/zstack/storage/volume/DownloadIsoForVmExtension.java b/storage/src/main/java/org/zstack/storage/volume/DownloadIsoForVmExtension.java index 99768b2cdae..7a747fc5093 100755 --- a/storage/src/main/java/org/zstack/storage/volume/DownloadIsoForVmExtension.java +++ b/storage/src/main/java/org/zstack/storage/volume/DownloadIsoForVmExtension.java @@ -41,6 +41,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by frank on 5/23/2015. @@ -163,7 +164,7 @@ public void done(ErrorCodeList errorCodeList) { return; } - ErrorCode ec = operr(new ErrorCodeList().causedBy(errorCodes), "unable to download iso to primary storage, becasue: %s", + ErrorCode ec = operr(ORG_ZSTACK_STORAGE_VOLUME_10096, new ErrorCodeList().causedBy(errorCodes), "unable to download iso to primary storage, becasue: %s", errorCodes.get(0).getDetails()); completion.fail(ec); diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeApiInterceptor.java b/storage/src/main/java/org/zstack/storage/volume/VolumeApiInterceptor.java index 2cc740aa4d4..d1485039388 100755 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeApiInterceptor.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeApiInterceptor.java @@ -90,6 +90,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -172,7 +173,7 @@ private void validate(VolumeCreateMessage msg) { List requiredPrimaryStorageUuids = config.getAllocate().getAllPrimaryStorages().stream() .map(PrimaryStorageAllocateConfig::getUuid).collect(Collectors.toList()); if (msg.getPrimaryStorageUuid() != null && !requiredPrimaryStorageUuids.contains(msg.getPrimaryStorageUuid())) { - throw new ApiMessageInterceptionException(operr("primary storage uuid conflict, the primary storage specified by the disk offering are %s, and the primary storage specified in the creation parameter is %s", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10039, "primary storage uuid conflict, the primary storage specified by the disk offering are %s, and the primary storage specified in the creation parameter is %s", requiredPrimaryStorageUuids, msg.getPrimaryStorageUuid())); } } @@ -185,17 +186,17 @@ private void validate(APICreateVolumeSnapshotMsg msg) { Tuple tuple = q.findTuple(); VolumeStatus status = (VolumeStatus) tuple.get(0); if (status != VolumeStatus.Ready) { - throw new ApiMessageInterceptionException(operr("volume[uuid:%s] is not in status Ready, current is %s, can't create snapshot", msg.getVolumeUuid(), status)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10040, "volume[uuid:%s] is not in status Ready, current is %s, can't create snapshot", msg.getVolumeUuid(), status)); } VolumeType type = (VolumeType) tuple.get(1); if (type != VolumeType.Root && type != VolumeType.Data) { - throw new ApiMessageInterceptionException(operr("volume[uuid:%s, type:%s], can't create snapshot", msg.getVolumeUuid(), type)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10041, "volume[uuid:%s, type:%s], can't create snapshot", msg.getVolumeUuid(), type)); } VolumeState state = (VolumeState) tuple.get(2); if (state != VolumeState.Enabled) { - throw new ApiMessageInterceptionException(operr("volume[uuid:%s] is not in state Enabled, " + + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10042, "volume[uuid:%s] is not in state Enabled, " + "current is %s, can't create snapshot", msg.getVolumeUuid(), state)); } } @@ -210,17 +211,17 @@ private void validate(APICreateVolumeSnapshotGroupMsg msg) { .find(); if (vmvo == null) { - throw new ApiMessageInterceptionException(argerr("volume[uuid:%s] is not root volume", msg.getRootVolumeUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_VOLUME_10043, "volume[uuid:%s] is not root volume", msg.getRootVolumeUuid())); } if (msg.isWithMemory() && !(vmvo.getState().equals(VmInstanceState.Running) || (vmvo.getState().equals(VmInstanceState.Paused)))) { - throw new ApiMessageInterceptionException(argerr("Can not take memory snapshot, vm current state[%s], but expect state are [%s, %s]", + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_VOLUME_10044, "Can not take memory snapshot, vm current state[%s], but expect state are [%s, %s]", vmvo.getState().toString(), VmInstanceState.Running.toString(), VmInstanceState.Paused.toString())); } for (VolumeVO vol : vmvo.getAllVolumes()) { if (vol.getStatus() != VolumeStatus.Ready) { - throw new ApiMessageInterceptionException(operr("volume[uuid:%s] is not in status Ready, " + + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10045, "volume[uuid:%s] is not in status Ready, " + "current is %s, can't create snapshot", vol.getUuid(), vol.getStatus())); } } @@ -247,7 +248,7 @@ private void validate(APIRecoverDataVolumeMsg msg) { q.add(VolumeVO_.uuid, Op.EQ, msg.getVolumeUuid()); q.add(VolumeVO_.status, Op.EQ, VolumeStatus.Deleted); if (!q.isExists()) { - throw new ApiMessageInterceptionException(operr("the volume[uuid:%s] is not in status of deleted. This is operation is to recover a deleted data volume", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10046, "the volume[uuid:%s] is not in status of deleted. This is operation is to recover a deleted data volume", msg.getVolumeUuid())); } } @@ -257,7 +258,7 @@ private void exceptionIsVolumeIsDeleted(String volumeUuid) { q.add(VolumeVO_.uuid, Op.EQ, volumeUuid); q.add(VolumeVO_.status, Op.EQ, VolumeStatus.Deleted); if (q.isExists()) { - throw new ApiMessageInterceptionException(operr("the volume[uuid:%s] is in status of deleted, cannot do the operation", volumeUuid)); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10047, "the volume[uuid:%s] is in status of deleted, cannot do the operation", volumeUuid)); } } @@ -265,15 +266,15 @@ private void validate(APICreateDataVolumeFromVolumeTemplateMsg msg) { ImageVO img = dbf.findByUuid(msg.getImageUuid(), ImageVO.class); ImageMediaType type = img.getMediaType(); if (ImageMediaType.DataVolumeTemplate != type) { - throw new ApiMessageInterceptionException(argerr("image[uuid:%s] is not %s, it's %s", msg.getImageUuid(), ImageMediaType.DataVolumeTemplate, type)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_VOLUME_10048, "image[uuid:%s] is not %s, it's %s", msg.getImageUuid(), ImageMediaType.DataVolumeTemplate, type)); } if (ImageState.Enabled != img.getState()) { - throw new ApiMessageInterceptionException(operr("image[uuid:%s] is not Enabled, it's %s", img.getUuid(), img.getState())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10049, "image[uuid:%s] is not Enabled, it's %s", img.getUuid(), img.getState())); } if (ImageStatus.Ready != img.getStatus()) { - throw new ApiMessageInterceptionException(operr("image[uuid:%s] is not Ready, it's %s", img.getUuid(), img.getStatus())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10050, "image[uuid:%s] is not Ready, it's %s", img.getUuid(), img.getStatus())); } } @@ -285,35 +286,35 @@ private void validate(APIGetDataVolumeAttachableVmMsg msg) { VolumeType type = t.get(3, VolumeType.class); if (type == VolumeType.Root) { - throw new ApiMessageInterceptionException(argerr("volume[uuid:%s] is Root volume, can not be attach to vm", msg.getVolumeUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_VOLUME_10051, "volume[uuid:%s] is Root volume, can not be attach to vm", msg.getVolumeUuid())); } // As per issue #1696, we do not report error if the volume has been attached. // Instead, an empty list will be returned later when handling this message. VolumeState state = t.get(1, VolumeState.class); if (state != VolumeState.Enabled) { - throw new ApiMessageInterceptionException(argerr("volume[uuid:%s] is in state[%s], data volume can only be attached when state is %s", msg.getVolumeUuid(), state, VolumeState.Enabled)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_VOLUME_10052, "volume[uuid:%s] is in state[%s], data volume can only be attached when state is %s", msg.getVolumeUuid(), state, VolumeState.Enabled)); } VolumeStatus status = t.get(2, VolumeStatus.class); if (status != VolumeStatus.Ready && status != VolumeStatus.NotInstantiated) { - throw new ApiMessageInterceptionException(argerr("volume[uuid:%s] is in status[%s], data volume can only be attached when status is %s or %S", msg.getVolumeUuid(), status, VolumeStatus.Ready, VolumeStatus.NotInstantiated)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_VOLUME_10053, "volume[uuid:%s] is in status[%s], data volume can only be attached when status is %s or %S", msg.getVolumeUuid(), status, VolumeStatus.Ready, VolumeStatus.NotInstantiated)); } } private void validate(APIDetachDataVolumeFromVmMsg msg) { VolumeVO vol = dbf.findByUuid(msg.getVolumeUuid(), VolumeVO.class); if (!vol.isShareable() && vol.getVmInstanceUuid() == null) { - throw new ApiMessageInterceptionException(operr("data volume[uuid:%s] is not attached to any vm, can't detach", msg.getVolumeUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10054, "data volume[uuid:%s] is not attached to any vm, can't detach", msg.getVolumeUuid())); } if (vol.isShareable() && msg.getVmUuid() == null) { - throw new ApiMessageInterceptionException(operr("to detach shareable data volume[uuid:%s], vm uuid is needed.", msg.getVolumeUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10055, "to detach shareable data volume[uuid:%s], vm uuid is needed.", msg.getVolumeUuid())); } if (vol.getType() != VolumeType.Data) { - throw new ApiMessageInterceptionException(operr("the volume[uuid:%s, name:%s, type:%s] can't detach it", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10056, "the volume[uuid:%s, name:%s, type:%s] can't detach it", vol.getUuid(), vol.getName(), vol.getType())); } } @@ -351,7 +352,7 @@ protected void scripts() { .param("vmState", VmInstanceState.Stopped) .param("platformType", ImagePlatform.Other.toString()).find(); if (count > 0) { - throw new ApiMessageInterceptionException(operr("the vm[uuid:%s] doesn't support to online attach volume[%s] on the basis of that the image platform type of the vm is other ", msg.getVmInstanceUuid(), msg.getVolumeUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10057, "the vm[uuid:%s] doesn't support to online attach volume[%s] on the basis of that the image platform type of the vm is other ", msg.getVmInstanceUuid(), msg.getVolumeUuid())); } String hvType = q(VmInstanceVO.class).eq(VmInstanceVO_.uuid, msg.getVmInstanceUuid()).select(VmInstanceVO_.hypervisorType).findValue(); @@ -379,23 +380,23 @@ protected void scripts() { private ErrorCode checkDataVolume(VolumeVO volumeVO, String hvType, long attachedDataVolumeNum) { if (volumeVO.getType() == VolumeType.Root) { - return operr("the volume[uuid:%s, name:%s] is Root Volume, can't attach it", volumeVO.getUuid(), volumeVO.getName()); + return operr(ORG_ZSTACK_STORAGE_VOLUME_10058, "the volume[uuid:%s, name:%s] is Root Volume, can't attach it", volumeVO.getUuid(), volumeVO.getName()); } if (volumeVO.getState() == VolumeState.Disabled) { - return operr("data volume[uuid:%s] is Disabled, can't attach", volumeVO.getUuid()); + return operr(ORG_ZSTACK_STORAGE_VOLUME_10059, "data volume[uuid:%s] is Disabled, can't attach", volumeVO.getUuid()); } if (volumeVO.getStatus() == VolumeStatus.Deleted) { - return operr("the volume[uuid:%s] is in status of deleted, cannot do the operation", volumeVO.getUuid()); + return operr(ORG_ZSTACK_STORAGE_VOLUME_10060, "the volume[uuid:%s] is in status of deleted, cannot do the operation", volumeVO.getUuid()); } if (volumeVO.isAttached() && !volumeVO.isShareable()) { - return operr("data volume[uuid:%s] has been attached to some vm, can't attach again", volumeVO.getUuid()); + return operr(ORG_ZSTACK_STORAGE_VOLUME_10061, "data volume[uuid:%s] has been attached to some vm, can't attach again", volumeVO.getUuid()); } if (VolumeStatus.Ready != volumeVO.getStatus() && VolumeStatus.NotInstantiated != volumeVO.getStatus()) { - return operr("data volume can only be attached when status is [%s, %s], current is %s", + return operr(ORG_ZSTACK_STORAGE_VOLUME_10062, "data volume can only be attached when status is [%s, %s], current is %s", VolumeStatus.Ready, VolumeStatus.NotInstantiated, volumeVO.getStatus()); } @@ -403,11 +404,11 @@ private ErrorCode checkDataVolume(VolumeVO volumeVO, String hvType, long attache List hvTypes = VolumeFormat.valueOf(volumeVO.getFormat()).getHypervisorTypesSupportingThisVolumeFormatInString(); if (hvTypes.isEmpty()) { - return operr("data volume[uuid:%s] of format[%s] is not supported for attach to any hypervisor.", volumeVO.getUuid(), volumeVO.getFormat()); + return operr(ORG_ZSTACK_STORAGE_VOLUME_10063, "data volume[uuid:%s] of format[%s] is not supported for attach to any hypervisor.", volumeVO.getUuid(), volumeVO.getFormat()); } if (!hvTypes.contains(hvType)) { - return operr("data volume[uuid:%s] has format[%s] that can only be attached to hypervisor[%s], " + + return operr(ORG_ZSTACK_STORAGE_VOLUME_10064, "data volume[uuid:%s] has format[%s] that can only be attached to hypervisor[%s], " + "but vm has hypervisor type[%s]. Can't attach", volumeVO.getUuid(), volumeVO.getFormat(), hvTypes, hvType); } } @@ -429,7 +430,7 @@ private ErrorCode checkClusterAccessible(VolumeVO volumeVO, List vmInsta // if there is no cluster contains both vm root volume and data volume, the data volume won't be attachable if (vmInstanceClusterUuids.isEmpty() && !volumeClusterUuids.isEmpty()) { - return operr("Can't attach volume to VM, no qualified cluster"); + return operr(ORG_ZSTACK_STORAGE_VOLUME_10065, "Can't attach volume to VM, no qualified cluster"); } return null; @@ -446,7 +447,7 @@ private ErrorCode checkHostAccessible(VolumeVO volumeVO, String hostUuid) { .select(PrimaryStorageHostRefVO_.status) .findValue(); if (primaryStorageHostStatus == PrimaryStorageHostStatus.Disconnected) { - return operr("Can not attach volume to vm runs on host[uuid: %s] which is disconnected " + + return operr(ORG_ZSTACK_STORAGE_VOLUME_10066, "Can not attach volume to vm runs on host[uuid: %s] which is disconnected " + "with volume's storage[uuid: %s]", hostUuid, volumeVO.getPrimaryStorageUuid()); } @@ -455,7 +456,7 @@ private ErrorCode checkHostAccessible(VolumeVO volumeVO, String hostUuid) { private void validate(APIBackupDataVolumeMsg msg) { if (isRootVolume(msg.getUuid())) { - throw new ApiMessageInterceptionException(operr("it's not allowed to backup root volume, uuid:%s", msg.getUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10067, "it's not allowed to backup root volume, uuid:%s", msg.getUuid())); } exceptionIsVolumeIsDeleted(msg.getVolumeUuid()); @@ -464,7 +465,7 @@ private void validate(APIBackupDataVolumeMsg msg) { private void validate(APICreateDataVolumeMsg msg) { if (msg.getDiskOfferingUuid() == null) { if (msg.getDiskSize() < 0) { - throw new ApiMessageInterceptionException(argerr("unexpected disk size settings")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_VOLUME_10068, "unexpected disk size settings")); } } else { Long diskSize = Q.New(DiskOfferingVO.class).eq(DiskOfferingVO_.uuid, msg.getDiskOfferingUuid()).select(DiskOfferingVO_.diskSize).findValue(); @@ -485,18 +486,18 @@ private void validate(APIDeleteDataVolumeMsg msg) { Tuple t = q.findTuple(); VolumeType type = t.get(0, VolumeType.class); if (type != VolumeType.Data) { - throw new ApiMessageInterceptionException(argerr("volume[uuid:%s, type:%s] can't be deleted", msg.getVolumeUuid(), type)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_VOLUME_10069, "volume[uuid:%s, type:%s] can't be deleted", msg.getVolumeUuid(), type)); } VolumeStatus status = t.get(1, VolumeStatus.class); if (status == VolumeStatus.Deleted) { - throw new ApiMessageInterceptionException(operr("volume[uuid:%s] is already in status of deleted", msg.getVolumeUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10070, "volume[uuid:%s] is already in status of deleted", msg.getVolumeUuid())); } String hostUuid = Q.New(VolumeHostRefVO.class).select(VolumeHostRefVO_.hostUuid) .eq(VolumeHostRefVO_.volumeUuid, msg.getUuid()).findValue(); if (hostUuid != null) { - throw new ApiMessageInterceptionException(argerr("can not delete volume[%s], " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_VOLUME_10071, "can not delete volume[%s], " + "because volume attach to host[%s]", msg.getVolumeUuid(), hostUuid)); } } @@ -511,7 +512,7 @@ private boolean isRootVolume(String uuid) { private void validate(APIChangeVolumeStateMsg msg) { if (isRootVolume(msg.getUuid())) { - throw new ApiMessageInterceptionException(operr("it's not allowed to change state of root volume, uuid:%s", msg.getUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10072, "it's not allowed to change state of root volume, uuid:%s", msg.getUuid())); } exceptionIsVolumeIsDeleted(msg.getVolumeUuid()); @@ -519,7 +520,7 @@ private void validate(APIChangeVolumeStateMsg msg) { String hostUuid = Q.New(VolumeHostRefVO.class).select(VolumeHostRefVO_.hostUuid) .eq(VolumeHostRefVO_.volumeUuid, msg.getUuid()).findValue(); if (hostUuid != null) { - throw new ApiMessageInterceptionException(argerr("can not change volume[%s] state, " + + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_VOLUME_10073, "can not change volume[%s] state, " + "because volume attach to host[%s]", msg.getVolumeUuid(), hostUuid)); } } @@ -527,12 +528,12 @@ private void validate(APIChangeVolumeStateMsg msg) { private void validate(APIAttachDataVolumeToHostMsg msg) { HostStatus hostStatus = Q.New(HostVO.class).select(HostVO_.status).eq(HostVO_.uuid, msg.getHostUuid()).findValue(); if (hostStatus != HostStatus.Connected) { - throw new ApiMessageInterceptionException(operr("can not attach volume[%s] to host[%s], because host[status:%s] is not connected", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10074, "can not attach volume[%s] to host[%s], because host[status:%s] is not connected", msg.getVolumeUuid(), msg.getHostUuid(), hostStatus)); } if (!msg.getMountPath().startsWith("/")) { - throw new ApiMessageInterceptionException(argerr("mount path must be absolute path")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_VOLUME_10075, "mount path must be absolute path")); } Tuple hostAndMountPath = Q.New(VolumeHostRefVO.class) @@ -549,11 +550,11 @@ private void doValidateAttachedVolume(Tuple hostAndMountPath, APIAttachDataVolum String hostUuid = hostAndMountPath.get(0, String.class); String mountPath = hostAndMountPath.get(1, String.class); if (!hostUuid.equals(msg.getHostUuid())) { - throw new ApiMessageInterceptionException(operr("can not attach volume[%s] to host[%s], because volume is attaching to host[%s]", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10076, "can not attach volume[%s] to host[%s], because volume is attaching to host[%s]", msg.getVolumeUuid(), msg.getHostUuid(), hostUuid)); } if (!mountPath.equals(msg.getMountPath())) { - throw new ApiMessageInterceptionException(operr("can not attach volume[%s] to host[%s], because the volume[%s] occupies the mount path[%s] on host[%s]", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10077, "can not attach volume[%s] to host[%s], because the volume[%s] occupies the mount path[%s] on host[%s]", msg.getVolumeUuid(), msg.getHostUuid(), msg.getVolumeUuid(), mountPath, hostUuid)); } } @@ -563,14 +564,14 @@ private void checkMountPathOnHost(APIAttachDataVolumeToHostMsg msg) { .eq(VolumeHostRefVO_.hostUuid, msg.getHostUuid()) .select(VolumeHostRefVO_.mountPath).listValues(); if (mountPaths.contains(msg.getMountPath())) { - throw new ApiMessageInterceptionException(operr("can not attach volume[%s] to host[%s], because the another volume occupies the mount path[%s]", + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10078, "can not attach volume[%s] to host[%s], because the another volume occupies the mount path[%s]", msg.getVolumeUuid(), msg.getHostUuid(), msg.getMountPath())); } } private void validate(APIDetachDataVolumeFromHostMsg msg) { if (!Q.New(VolumeHostRefVO.class).eq(VolumeHostRefVO_.volumeUuid, msg.getVolumeUuid()).isExists()) { - throw new ApiMessageInterceptionException(operr("can not detach volume[%s] from host. " + + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10079, "can not detach volume[%s] from host. " + "it may have been detached", msg.getVolumeUuid())); } } @@ -578,7 +579,7 @@ private void validate(APIDetachDataVolumeFromHostMsg msg) { private void validate(APIFlattenVolumeMsg msg) { boolean isShareable = Q.New(VolumeVO.class).eq(VolumeVO_.uuid, msg.getVolumeUuid()).select(VolumeVO_.isShareable).findValue(); if (isShareable) { - throw new ApiMessageInterceptionException(argerr("cannot flatten a shareable volume[uuid:%s]", msg.getVolumeUuid())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_VOLUME_10080, "cannot flatten a shareable volume[uuid:%s]", msg.getVolumeUuid())); } } @@ -589,7 +590,7 @@ private void validate(APIUndoSnapshotCreationMsg msg) { .eq(VolumeSnapshotTreeVO_.volumeUuid, msg.getUuid()) .findValue(); if (currentTreeUuid == null) { - throw new ApiMessageInterceptionException(operr("can not found in used snapshot tree of volume[uuid: %s]", msg.getUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10081, "can not found in used snapshot tree of volume[uuid: %s]", msg.getUuid())); } boolean isLatest = Q.New(VolumeSnapshotVO.class) @@ -599,7 +600,7 @@ private void validate(APIUndoSnapshotCreationMsg msg) { .isExists(); if (!isLatest) { - throw new ApiMessageInterceptionException(argerr("cannot undo not latest snapshot")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_VOLUME_10082, "cannot undo not latest snapshot")); } } @@ -620,7 +621,7 @@ protected void validate(APICreateVmInstanceMsg msg) { .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) .entrySet().stream().filter(entry -> entry.getValue() > 1).map(Map.Entry::getKey).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(duplicateVolumeUuids)) { - throw new ApiMessageInterceptionException(operr("duplicate volume uuids: %s", duplicateVolumeUuids.toString())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_STORAGE_VOLUME_10083, "duplicate volume uuids: %s", duplicateVolumeUuids.toString())); } List clusterUuids = new ArrayList<>(); @@ -657,7 +658,7 @@ protected void validate(APICreateVmInstanceMsg msg) { } if (!errors.isEmpty()) { - throw new ApiMessageInterceptionException(argerr(errors.toString())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_STORAGE_VOLUME_10084, errors.toString())); } } diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java b/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java index af6c1f72328..d75fb654a3e 100755 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java @@ -69,6 +69,7 @@ import static org.zstack.storage.volume.VolumeSystemTags.VOLUME_PROVISIONING_STRATEGY; import static org.zstack.storage.volume.VolumeSystemTags.VOLUME_PROVISIONING_STRATEGY_TOKEN; import static org.zstack.utils.CollectionDSL.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created with IntelliJ IDEA. @@ -204,7 +205,7 @@ public void run(FlowTrigger trigger, Map data) { boolean imageExists = Q.New(ImageVO.class).eq(ImageVO_.uuid, self.getRootImageUuid()).isExists(); if (!cacheExists && !imageExists) { - trigger.fail(operr("cannot find image cache[imageUuid: %s] for reinit volume", self.getRootImageUuid())); + trigger.fail(operr(ORG_ZSTACK_STORAGE_VOLUME_10032, "cannot find image cache[imageUuid: %s] for reinit volume", self.getRootImageUuid())); return; } @@ -893,7 +894,7 @@ private void expunge(final Completion completion) { } if (self.getStatus() != VolumeStatus.Deleted) { - completion.fail(operr("the volume[uuid:%s, name:%s] is not deleted yet, can't expunge it", + completion.fail(operr(ORG_ZSTACK_STORAGE_VOLUME_10033, "the volume[uuid:%s, name:%s] is not deleted yet, can't expunge it", self.getUuid(), self.getName())); return; } @@ -1848,7 +1849,7 @@ protected void scripts() { VolumeVO oldRootVolumeVO = vm.getRootVolume(); VolumeVO newRootVolumeVO = vm.getAllVolumes().stream().filter(it -> it.getUuid().equals(msg.getVolumeUuid())) .findFirst().orElseThrow(() -> new OperationFailureException( - operr("volume[uuid%s] should be attached.") + operr(ORG_ZSTACK_STORAGE_VOLUME_10034, "volume[uuid%s] should be attached.") )); oldRootVolOldAndNewInstallPaths.put(oldRootVolumeVO.getInstallPath(), oldRootVol.getInstallPath()); @@ -1951,7 +1952,7 @@ public void handle(Map data) { private void handle(ChangeVolumeTypeMsg msg) { if (self.isAttached()) { ChangeVolumeTypeReply reply = new ChangeVolumeTypeReply(); - reply.setError(operr("only support detached volume, use SetVmBootVolumeMsg instead.")); + reply.setError(operr(ORG_ZSTACK_STORAGE_VOLUME_10035, "only support detached volume, use SetVmBootVolumeMsg instead.")); bus.reply(msg, reply); return; } @@ -2707,7 +2708,7 @@ public void success() { @Override public void fail(ErrorCode errorCode) { - evt.setError(err(SysErrors.DELETE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); + evt.setError(err(ORG_ZSTACK_STORAGE_VOLUME_10036, SysErrors.DELETE_RESOURCE_ERROR, errorCode, errorCode.getDetails())); bus.publish(evt); } }); @@ -3225,7 +3226,7 @@ public void success() { @Override public void fail(ErrorCode errorCode) { - reply.setError(err(VolumeErrors.FLATTEN_ERROR, errorCode, "failed to flatten volume[uuid:%s]", self.getUuid())); + reply.setError(err(ORG_ZSTACK_STORAGE_VOLUME_10037, VolumeErrors.FLATTEN_ERROR, errorCode, "failed to flatten volume[uuid:%s]", self.getUuid())); bus.reply(msg, reply); chain.next(); } @@ -3278,7 +3279,7 @@ static void vmAttachVolumeValidator(VmInstanceInventory vmInv, String volumeUuid .eq(VolumeVO_.vmInstanceUuid, vmUuid) .count(); if (vmDataVolumeUsage + 1 > maxDataVolumeNum) { - throw new OperationFailureException(operr("hypervisor[%s] only allows max %s data volumes to be attached to a single vm; there have been %s data volumes attached to vm[uuid:%s]", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_VOLUME_10038, "hypervisor[%s] only allows max %s data volumes to be attached to a single vm; there have been %s data volumes attached to vm[uuid:%s]", hypervisorType, maxDataVolumeNum, vmDataVolumeUsage, vmUuid)); } } diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java b/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java index 76e8bc229a8..248ff279765 100755 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java @@ -68,6 +68,7 @@ import static org.zstack.core.Platform.operr; import static org.zstack.header.host.HostStatus.Connected; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class VolumeManagerImpl extends AbstractService implements VolumeManager, ManagementNodeReadyExtensionPoint, ResourceOwnerAfterChangeExtensionPoint, VmStateChangedExtensionPoint, VmDetachVolumeExtensionPoint, @@ -168,11 +169,11 @@ private boolean getShareableCapabilityFromMsg(CreateDataVolumeFromVolumeTemplate .findValue(); if (StringUtils.isEmpty(psType)) { - throw new OperationFailureException(operr("get primaryStorage %s type failed", msg.getPrimaryStorageUuid())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_VOLUME_10085, "get primaryStorage %s type failed", msg.getPrimaryStorageUuid())); } if (!PrimaryStorageType.getSupportFeaturesTypes(PrimaryStorageType::isSupportSharedVolume).contains(psType)) { - throw new OperationFailureException(operr("primaryStorage type [%s] not support shared volume yet", psType)); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_VOLUME_10086, "primaryStorage type [%s] not support shared volume yet", psType)); } } @@ -299,7 +300,7 @@ public String call(ImageBackupStorageRefVO arg) { }); if (bsUuids.isEmpty()) { - throw new OperationFailureException(operr("the image[uuid:%s, name:%s] has been deleted on all backup storage", template.getUuid(), template.getName())); + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_VOLUME_10087, "the image[uuid:%s, name:%s] has been deleted on all backup storage", template.getUuid(), template.getName())); } String sql = "select bs.uuid from BackupStorageVO bs, BackupStorageZoneRefVO zref, PrimaryStorageVO ps where zref.zoneUuid = ps.zoneUuid and bs.status = :bsStatus and bs.state = :bsState and ps.uuid = :psUuid and zref.backupStorageUuid = bs.uuid and bs.uuid in (:bsUuids)"; @@ -316,7 +317,7 @@ public String call(ImageBackupStorageRefVO arg) { if (bsUuids.isEmpty()) { - trigger.fail(operr("cannot find a backup storage on which the image[uuid:%s] is that satisfies all conditions of: 1. has state Enabled 2. has status Connected. 3 has attached to zone in which primary storage[uuid:%s] is", + trigger.fail(operr(ORG_ZSTACK_STORAGE_VOLUME_10088, "cannot find a backup storage on which the image[uuid:%s] is that satisfies all conditions of: 1. has state Enabled 2. has status Connected. 3 has attached to zone in which primary storage[uuid:%s] is", template.getUuid(), msg.getPrimaryStorageUuid())); return; } @@ -477,7 +478,7 @@ public void rollback(FlowRollback trigger, Map data) { public void run(FlowTrigger trigger, Map data) { VolumeVO vo = dbf.reload(vol); if (vo == null) { - trigger.fail(operr("target volume is expunged during volume creation")); + trigger.fail(operr(ORG_ZSTACK_STORAGE_VOLUME_10089, "target volume is expunged during volume creation")); return; } vo.setInstallPath(primaryStorageInstallPath); @@ -513,7 +514,7 @@ public void run(MessageReply reply) { public void handle(Map data) { VolumeVO vo = dbf.reload(vol); if (vo == null) { - reply.setError(operr("target volume is expunged during volume creation")); + reply.setError(operr(ORG_ZSTACK_STORAGE_VOLUME_10090, "target volume is expunged during volume creation")); bus.reply(msg, reply); return; } @@ -569,7 +570,7 @@ public static void preCheckPrimaryStorage(VolumeCreateMessage msg) { List requiredPrimaryStorageUuids = config.getAllocate().getAllPrimaryStorages().stream() .map(PrimaryStorageAllocateConfig::getUuid).collect(Collectors.toList()); if (!requiredPrimaryStorageUuids.contains(msg.getPrimaryStorageUuid())) { - throw new OperationFailureException(operr("primary storage uuid conflict, the primary storage specified by the disk offering are %s, and the primary storage specified in the creation parameter is %s", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_VOLUME_10091, "primary storage uuid conflict, the primary storage specified by the disk offering are %s, and the primary storage specified in the creation parameter is %s", requiredPrimaryStorageUuids, msg.getPrimaryStorageUuid())); } } @@ -899,7 +900,7 @@ private void instantiateDataVolumeFromSnapshot(VolumeVO vo, String snapshotUuid, public void run(MessageReply reply) { VolumeVO vvo = dbf.reload(vo); if (vvo == null) { - reply.setError(operr("target volume is expunged during volume creation")); + reply.setError(operr(ORG_ZSTACK_STORAGE_VOLUME_10092, "target volume is expunged during volume creation")); } if (reply.isSuccess()) { @@ -1179,7 +1180,7 @@ public Object call(InstantiateDataVolumeOnCreationExtensionPoint arg) { List exts = pluginRgty.getExtensionList( VolumeFactory.class); if (exts.size() > 1) { - throw new OperationFailureException(operr("there should not be more than one %s implementation.", + throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_VOLUME_10093, "there should not be more than one %s implementation.", VolumeFactory.class.getSimpleName())); } } diff --git a/tag/src/main/java/org/zstack/tag/TagApiInterceptor.java b/tag/src/main/java/org/zstack/tag/TagApiInterceptor.java index d6965e3fe5d..357a88b1ba5 100755 --- a/tag/src/main/java/org/zstack/tag/TagApiInterceptor.java +++ b/tag/src/main/java/org/zstack/tag/TagApiInterceptor.java @@ -17,6 +17,7 @@ import javax.persistence.TypedQuery; import static org.zstack.core.Platform.*; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -45,7 +46,7 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti private void validate(APICreateSystemTagsMsg msg) { if (!tagMgr.getManagedEntityNames().contains(msg.getResourceType())) { - throw new ApiMessageInterceptionException(argerr("no resource type[%s] found in tag system", msg.getResourceType())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_TAG_10009, "no resource type[%s] found in tag system", msg.getResourceType())); } for (String tag : msg.getTags()) { @@ -76,7 +77,7 @@ private void validate(APIUpdateSystemTagMsg msg) { private void validate(APIAbstractCreateTagMsg msg) { if (!tagMgr.getManagedEntityNames().contains(msg.getResourceType())) { - throw new ApiMessageInterceptionException(argerr("no resource type[%s] found in tag system", msg.getResourceType())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_TAG_10010, "no resource type[%s] found in tag system", msg.getResourceType())); } if (msg instanceof APICreateSystemTagMsg) { @@ -99,7 +100,7 @@ private void validate(APIDeleteTagMsg msg) { q.add(SystemTagVO_.uuid, Op.EQ, msg.getUuid()); q.add(SystemTagVO_.inherent, Op.EQ, true); if (q.isExists()) { - throw new ApiMessageInterceptionException(operr("tag[uuid:%s] is an inherent system tag, can not be removed", msg.getUuid())); + throw new ApiMessageInterceptionException(operr(ORG_ZSTACK_TAG_10011, "tag[uuid:%s] is an inherent system tag, can not be removed", msg.getUuid())); } boolean userTag = dbf.isExist(msg.getUuid(), UserTagVO.class); @@ -125,7 +126,7 @@ private void checkIfResourceHasThisTagType(String resourceUuid, String resourceT Long size = q.getSingleResult(); if (size <= 0) { - throw new ApiMessageInterceptionException(argerr("The argument :'resourceType' doesn't match uuid")); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_TAG_10012, "The argument :'resourceType' doesn't match uuid")); } } @@ -140,7 +141,7 @@ private void checkAccountForSystemTag(APIDeleteTagMsg msg) { q.setParameter("tuuid", msg.getUuid()); String accountUuid = q.getSingleResult(); if (!msg.getSession().getAccountUuid().equals(accountUuid)) { - throw new ApiMessageInterceptionException(err(IdentityErrors.PERMISSION_DENIED, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_TAG_10013, IdentityErrors.PERMISSION_DENIED, "permission denied. The system tag[uuid: %s] refer to a resource not belonging to the account[uuid: %s]", msg.getUuid(), msg.getSession().getAccountUuid() )); @@ -154,7 +155,7 @@ private void checkAccountForUserTag(APIDeleteTagMsg msg) { q.setParameter("tuuid", msg.getUuid()); String accountUuid = q.getSingleResult(); if (!msg.getSession().getAccountUuid().equals(accountUuid)) { - throw new ApiMessageInterceptionException(err(IdentityErrors.PERMISSION_DENIED, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_TAG_10014, IdentityErrors.PERMISSION_DENIED, "permission denied. The user tag[uuid: %s] refer to a resource not belonging to the account[uuid: %s]", msg.getUuid(), msg.getSession().getAccountUuid() )); @@ -167,7 +168,7 @@ private void checkAccountForTagPattern(APIDeleteTagMsg msg) { q.setParameter("tuuid", msg.getUuid()); String accountUuid = q.getSingleResult(); if (!msg.getSession().getAccountUuid().equals(accountUuid)) { - throw new ApiMessageInterceptionException(err(IdentityErrors.PERMISSION_DENIED, + throw new ApiMessageInterceptionException(err(ORG_ZSTACK_TAG_10015, IdentityErrors.PERMISSION_DENIED, "permission denied. The tag pattern[uuid: %s] refer to a resource not belonging to the account[uuid: %s]", msg.getUuid(), msg.getSession().getAccountUuid() )); diff --git a/tag/src/main/java/org/zstack/tag/TagManagerImpl.java b/tag/src/main/java/org/zstack/tag/TagManagerImpl.java index b3c916391a2..7f4825f5d2a 100755 --- a/tag/src/main/java/org/zstack/tag/TagManagerImpl.java +++ b/tag/src/main/java/org/zstack/tag/TagManagerImpl.java @@ -42,6 +42,7 @@ import static org.zstack.core.Platform.*; import static org.zstack.utils.CollectionDSL.list; import static org.zstack.utils.CollectionUtils.removeDuplicateFromList; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class TagManagerImpl extends AbstractService implements TagManager, SoftDeleteEntityExtensionPoint, GlobalApiMessageInterceptor, SystemTagLifeCycleExtension, @@ -242,7 +243,7 @@ private TagInventory createTag(String resourceUuid, String tag, TagType type, St } if (isTagExisting(resourceUuid, tag, type, resourceType)) { - throw new OperationFailureException(operr("Duplicated Tag[tag:%s, type:%s, resourceType:%s, resourceUuid:%s]", + throw new OperationFailureException(operr(ORG_ZSTACK_TAG_10000, "Duplicated Tag[tag:%s, type:%s, resourceType:%s, resourceUuid:%s]", tag, type, resourceType, resourceUuid)); } @@ -283,7 +284,7 @@ private SystemTagInventory createResourceConfigFromTag(String resourceUuid, Stri resourceConfigSystemTag.newResourceConfig(resourceUuid, tag); } catch (GlobalConfigException e) { logger.debug(String.format("Failed to create resource config, because %s", e.getMessage())); - throw new ApiMessageInterceptionException(argerr(e.getMessage())); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_TAG_10001, e.getMessage())); } return null; @@ -657,7 +658,7 @@ private void handle(APICreateSystemTagsMsg msg) { if (resourceConfigSystemTag.isMatch(tag)) { throw new ApiMessageInterceptionException( - argerr("no system tag matches[%s] for resourceType[%s]", tag, msg.getResourceType())); + argerr(ORG_ZSTACK_TAG_10002, "no system tag matches[%s] for resourceType[%s]", tag, msg.getResourceType())); } } @@ -695,7 +696,7 @@ private void handle(APICreateSystemTagMsg msg) { if (resourceConfigSystemTag.isMatch(msg.getTag())) { throw new ApiMessageInterceptionException( - argerr("no system tag matches[%s] for resourceType[%s]", msg.getTag(), msg.getResourceType())); + argerr(ORG_ZSTACK_TAG_10003, "no system tag matches[%s] for resourceType[%s]", msg.getTag(), msg.getResourceType())); } SystemTagInventory inv = createNonInherentSystemTag(msg.getResourceUuid(), msg.getTag(), msg.getResourceType()); @@ -758,13 +759,13 @@ private boolean isValidSystemTag(String resourceUuid, String resourceType, Strin public void validateSystemTag(String resourceUuid, String resourceType, String tag) { if (!isValidSystemTag(resourceUuid, resourceType, tag)) { throw new ApiMessageInterceptionException( - argerr("no system tag matches[%s] for resourceType[%s]", tag, resourceType)); + argerr(ORG_ZSTACK_TAG_10004, "no system tag matches[%s] for resourceType[%s]", tag, resourceType)); } for (ValidateSystemTagExtensionPoint exp: pluginRgty.getExtensionList(ValidateSystemTagExtensionPoint.class)) { if (!exp.validateSystemTag(resourceUuid, resourceType, tag)) { throw new ApiMessageInterceptionException( - argerr("validate system tag [%s] for resourceType[%s] failed", tag, resourceType)); + argerr(ORG_ZSTACK_TAG_10005, "validate system tag [%s] for resourceType[%s] failed", tag, resourceType)); } } } @@ -947,7 +948,7 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti } if (!matchSystemTag && !matchResourceTag) { - throw new ApiMessageInterceptionException(argerr("no system tag matches %s", tag)); + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_TAG_10006, "no system tag matches %s", tag)); } // resource config system tag will create new resource config @@ -960,7 +961,7 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti Class resourceType = resourceTypeCreateMessageMap.get(cmsg.getClass()); if (resourceType == null) { throw new ApiMessageInterceptionException(inerr( - "API message[%s] doesn't define resource type by @TagResourceType", + ORG_ZSTACK_TAG_10007, "API message[%s] doesn't define resource type by @TagResourceType", cmsg.getClass().getName() )); } @@ -982,7 +983,7 @@ private ErrorCode checkPemission(String tag, SessionInventory session){ } if (adminOnlySystemTags.stream().anyMatch(it -> it.isMatch(tag))) { - return operr("tag[%s] is only for admin", tag); + return operr(ORG_ZSTACK_TAG_10008, "tag[%s] is only for admin", tag); } return null; } diff --git a/test/src/test/groovy/org/zstack/test/integration/core/DistanceElaborationCase.groovy b/test/src/test/groovy/org/zstack/test/integration/core/DistanceElaborationCase.groovy index dc19af53f20..0688de08b6b 100644 --- a/test/src/test/groovy/org/zstack/test/integration/core/DistanceElaborationCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/DistanceElaborationCase.groovy @@ -1,5 +1,7 @@ package org.zstack.test.integration.core +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; + import org.zstack.core.Platform import org.zstack.header.errorcode.ErrorCode import org.zstack.header.errorcode.ErrorCodeList @@ -37,7 +39,7 @@ class DistanceElaborationCase extends SubCase { } void testElaboration1() { - def err = Platform.operr("arg 'startTime' should format like 'yyyy-MM-dd HH:mm:ss' or '1545380003000'") as ErrorCode + def err = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10000, "arg 'startTime' should format like 'yyyy-MM-dd HH:mm:ss' or '1545380003000'") as ErrorCode assert err.messages != null assert err.messages.method == ElaborationSearchMethod.distance assert err.messages.message_cn == "输入参数中 'startTime' 的格式应该类似 'yyyy-MM-dd HH:mm:ss' 或 '1545380003000'。" diff --git a/test/src/test/groovy/org/zstack/test/integration/core/ElaborationCase.groovy b/test/src/test/groovy/org/zstack/test/integration/core/ElaborationCase.groovy index a15b6ca72f0..fc91aeb1400 100644 --- a/test/src/test/groovy/org/zstack/test/integration/core/ElaborationCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/ElaborationCase.groovy @@ -1,5 +1,7 @@ package org.zstack.test.integration.core +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; + import org.zstack.core.Platform import org.zstack.header.errorcode.ErrorCode import org.zstack.header.errorcode.ErrorCodeList @@ -47,24 +49,24 @@ class ElaborationCase extends SubCase { } void testElaborationWithLongName() { - def err = operr("host[uuid:%s, name:%s] is in status[%s], cannot perform required operation", Platform.uuid, "long long long long long long long long long host name", "Connecting") as ErrorCode + def err = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10009, "host[uuid:%s, name:%s] is in status[%s], cannot perform required operation", Platform.uuid, "long long long long long long long long long host name", "Connecting") as ErrorCode assert err.elaboration != null assert err.elaboration.trim() == "错误信息: 物理机 [long long long long long long long long long host name] 正处于 [Connecting] 状态,当前状态不允许进行该操作。" } void testElaboration() { - def err = operr("certificate has expired or is not yet valid") as ErrorCode + def err = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10010, "certificate has expired or is not yet valid") as ErrorCode assert err.elaboration != null assert err.elaboration.trim() == "错误信息: 当前系统时间不在镜像仓库证书有效期内,可能因为镜像仓库服务器的系统时间被调整,或者证书被修改。" - err = operr("The state of vm[uuid:%s] is %s. Only these state[Running,Stopped] is allowed to update cpu or memory.", Platform.uuid, "Rebooting") as ErrorCode + err = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10011, "The state of vm[uuid:%s] is %s. Only these state[Running,Stopped] is allowed to update cpu or memory.", Platform.uuid, "Rebooting") as ErrorCode assert err.elaboration != null assert err.elaboration.trim() == "错误信息: 云主机的状态为 Rebooting,只有状态 [Running,Stopped] 允许升级 CPU/内存。" - err = operr("test for missed error") as ErrorCode + err = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10012, "test for missed error") as ErrorCode assert err.elaboration == null - err = Platform.err(IdentityErrors.INVALID_SESSION, "xxxxxxxxx") as ErrorCode + err = org.zstack.core.Platform.err(ORG_ZSTACK_TEST_INTEGRATION_CORE_10013, IdentityErrors.INVALID_SESSION, "xxxxxxxxx") as ErrorCode assert err.elaboration != null } @@ -83,22 +85,22 @@ class ElaborationCase extends SubCase { } void testElaborationEnglish() { - def err = operr("certificate has expired or is not yet valid") as ErrorCode + def err = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10014, "certificate has expired or is not yet valid") as ErrorCode assert err.elaboration != null assert err.elaboration.trim() == "Error message: The current system time has expired for ImageStore certificate. Possible reason: ImageStore server system time or certificate is modified." assert err.messages.message_en != null assert err.messages.message_cn == null - err = operr("The state of vm[uuid:%s] is %s. Only these state[Running,Stopped] is allowed to update cpu or memory.", Platform.uuid, "Rebooting") as ErrorCode + err = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10015, "The state of vm[uuid:%s] is %s. Only these state[Running,Stopped] is allowed to update cpu or memory.", Platform.uuid, "Rebooting") as ErrorCode assert err.elaboration != null assert err.elaboration.trim() == "Error message: Only VMs with the status [Running, Stopped] support CPU/memory update. Current status: Rebooting." assert err.messages.message_en != null assert err.messages.message_cn == null - err = operr("test for missed error") as ErrorCode + err = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10016, "test for missed error") as ErrorCode assert err.elaboration == null - err = Platform.err(IdentityErrors.INVALID_SESSION, "xxxxxxxxx") as ErrorCode + err = org.zstack.core.Platform.err(ORG_ZSTACK_TEST_INTEGRATION_CORE_10017, IdentityErrors.INVALID_SESSION, "xxxxxxxxx") as ErrorCode assert err.elaboration != null } @@ -160,37 +162,37 @@ class ElaborationCase extends SubCase { } void testElaborationWithUnknownFormatConversion() { - def err = operr("%!s(int=0) %!s(bytes.readOp=0)", "nowadays") as ErrorCode + def err = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10018, "%!s(int=0) %!s(bytes.readOp=0)", "nowadays") as ErrorCode assert err.elaboration == null assert err.details == "%!s(int=0) %!s(bytes.readOp=0)" } void testErrorList() { def list = new ArrayList() - def err1 = operr("host[uuid:%s, name:%s] is in state[%s], cannot perform required operation", Platform.uuid, "host-1", "Maintenance") as ErrorCode - def err2 = operr("host[uuid:%s, name:%s] is in state[%s], cannot perform required operation", Platform.uuid, "host-2", "Maintenance") as ErrorCode + def err1 = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10019, "host[uuid:%s, name:%s] is in state[%s], cannot perform required operation", Platform.uuid, "host-1", "Maintenance") as ErrorCode + def err2 = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10020, "host[uuid:%s, name:%s] is in state[%s], cannot perform required operation", Platform.uuid, "host-2", "Maintenance") as ErrorCode list.addAll([err1, err2]) def errlist = new ErrorCodeList().causedBy(list) - def err = operr(errlist, "unable to commit backup storage because: %s", err1.details) + def err = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10021, errlist, "unable to commit backup storage because: %s", err1.details) assert err.messages.message_cn == "物理机 [host-1] 正处于 [Maintenance] 状态,当前状态不允许进行该操作。,物理机 [host-2] 正处于 [Maintenance] 状态,当前状态不允许进行该操作。" } void testNestedError() { // VM.1004 def str = "no Connected hosts found in the [%d] candidate hosts" - def err = operr(str, 3) + def err = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10022, str, 3) assert err.elaboration != null def errEla = err.elaboration def errCn = err.messages.message_cn - def err1 = operr(err, "test %s err", String.format(str, 3)) + def err1 = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10023, err, "test %s err", String.format(str, 3)) assert err1.elaboration == errEla assert err1.messages.message_cn == errCn - def err2 = operr("test %s err", String.format(str, 3)) + def err2 = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10024, "test %s err", String.format(str, 3)) assert err2.messages.message_cn != null assert err2.elaboration == "错误信息: no Connected hosts found in the [3] candidate hosts" } diff --git a/test/src/test/groovy/org/zstack/test/integration/core/ElaborationMigrateVmCase.groovy b/test/src/test/groovy/org/zstack/test/integration/core/ElaborationMigrateVmCase.groovy index 2fa6c00d3f5..3bfd51e2794 100644 --- a/test/src/test/groovy/org/zstack/test/integration/core/ElaborationMigrateVmCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/ElaborationMigrateVmCase.groovy @@ -1,5 +1,7 @@ package org.zstack.test.integration.core +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; + import org.zstack.core.Platform import org.zstack.header.errorcode.ErrorCode import org.zstack.header.errorcode.SysErrors @@ -31,7 +33,7 @@ class ElaborationMigrateVmCase extends SubCase { } void testElaboration() { - def err = Platform.operr("failed to migrate vm[uuid:54a8af3843094c53a8fd2b87bbbf95c4] from kvm host[uuid:f3712c38be0742f6b9c815b305685e98, ip:172.24.197.225] to dest host[ip:172.24.193.169], No enough physical memory for guest") as ErrorCode + def err = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10036, "failed to migrate vm[uuid:54a8af3843094c53a8fd2b87bbbf95c4] from kvm host[uuid:f3712c38be0742f6b9c815b305685e98, ip:172.24.197.225] to dest host[ip:172.24.193.169], No enough physical memory for guest") as ErrorCode assert err.elaboration != null assert err.elaboration.trim() == "错误信息: 在物理机上迁移云主机失败,因为物理机已经没有足够的物理内存可供云主机使用。" } diff --git a/test/src/test/groovy/org/zstack/test/integration/core/ElaborationReconnectHostCase.groovy b/test/src/test/groovy/org/zstack/test/integration/core/ElaborationReconnectHostCase.groovy index 6e23385ea1f..1c7746e9d83 100644 --- a/test/src/test/groovy/org/zstack/test/integration/core/ElaborationReconnectHostCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/ElaborationReconnectHostCase.groovy @@ -1,5 +1,7 @@ package org.zstack.test.integration.core +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; + import org.zstack.core.Platform import org.zstack.header.errorcode.ErrorCode import org.zstack.header.errorcode.SysErrors @@ -32,20 +34,20 @@ class ElaborationReconnectHostCase extends SubCase { void testElaboration() { - def err = Platform.operr("Unable to reconnect host") as ErrorCode + def err = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10004, "Unable to reconnect host") as ErrorCode assert err.elaboration != null assert err.elaboration.trim() == "错误信息: 无法重连物理机。" - def err1 = Platform.operr("failed to create bridge") as ErrorCode + def err1 = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10005, "failed to create bridge") as ErrorCode assert err1.elaboration == null - def err2 = Platform.err(HostErrors.CONNECTION_ERROR, err1, "connection error for KVM host[uuid:%s, ip:%s]", Platform.getUuid(), "127.0.0.1") as ErrorCode + def err2 = org.zstack.core.Platform.err(ORG_ZSTACK_TEST_INTEGRATION_CORE_10006, HostErrors.CONNECTION_ERROR, err1, "connection error for KVM host[uuid:%s, ip:%s]", Platform.getUuid(), "127.0.0.1") as ErrorCode assert err2.getElaboration() == null - def err3 = Platform.err(HostErrors.CONNECTION_ERROR, err2, "connection error for KVM host[uuid:%s, ip:%s]", Platform.getUuid(), "127.0.0.1") as ErrorCode + def err3 = org.zstack.core.Platform.err(ORG_ZSTACK_TEST_INTEGRATION_CORE_10007, HostErrors.CONNECTION_ERROR, err2, "connection error for KVM host[uuid:%s, ip:%s]", Platform.getUuid(), "127.0.0.1") as ErrorCode assert err3.getElaboration() == null - def err4 = Platform.err(SysErrors.OPERATION_ERROR, err, "failed to create bridge") as ErrorCode + def err4 = org.zstack.core.Platform.err(ORG_ZSTACK_TEST_INTEGRATION_CORE_10008, SysErrors.OPERATION_ERROR, err, "failed to create bridge") as ErrorCode assert err4.getElaboration() != null assert err4.elaboration.trim() == "错误信息: 无法重连物理机。" } diff --git a/test/src/test/groovy/org/zstack/test/integration/core/ErrorCodeHashCase.groovy b/test/src/test/groovy/org/zstack/test/integration/core/ErrorCodeHashCase.groovy index 2ec7643fe98..8cf1c5db551 100644 --- a/test/src/test/groovy/org/zstack/test/integration/core/ErrorCodeHashCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/ErrorCodeHashCase.groovy @@ -1,5 +1,7 @@ package org.zstack.test.integration.core +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; + import org.springframework.beans.factory.annotation.Autowired import org.zstack.core.errorcode.ErrorFacade import org.zstack.core.errorcode.ErrorFacadeImpl @@ -29,9 +31,9 @@ class ErrorCodeHashCase extends SubCase{ ErrorFacade errf = bean(ErrorFacade.class) ErrorCode err1, err2, err3 ErrorCodeList errl1, errl2, errl3, errl4 - err1 = operr("test error") - err2 = operr("test error") - err3 = argerr("test error") + err1 = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10001, "test error") + err2 = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10002, "test error") + err3 = org.zstack.core.Platform.argerr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10003, "test error") assert err1.hashCode() == err1.hashCode() assert err1.hashCode() == err2.hashCode() diff --git a/test/src/test/groovy/org/zstack/test/integration/core/RegexElaborationCase.groovy b/test/src/test/groovy/org/zstack/test/integration/core/RegexElaborationCase.groovy index 13535134c55..93f572ecf98 100644 --- a/test/src/test/groovy/org/zstack/test/integration/core/RegexElaborationCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/RegexElaborationCase.groovy @@ -1,5 +1,7 @@ package org.zstack.test.integration.core +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; + import org.zstack.core.Platform import org.zstack.header.errorcode.ErrorCode import org.zstack.header.errorcode.ErrorCodeList @@ -45,14 +47,14 @@ class RegexElaborationCase extends SubCase { } void testElaboration1() { - def err = Platform.operr("Fn::Join must be array and contain 2 params, array[0] must be String, array[1] must be array!") as ErrorCode + def err = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10028, "Fn::Join must be array and contain 2 params, array[0] must be String, array[1] must be array!") as ErrorCode assert err.messages != null assert err.messages.method == ElaborationSearchMethod.regex assert err.messages.message_cn == "Fn::Join 后面的参数出错,该参数应包含 2 个参数,第一个为 String,第二个为数组。" } void testElaboration2() { - def err = Platform.operr("Param [%s] has no value or default value found!", "ImageUuid") as ErrorCode + def err = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10030, "Param [%s] has no value or default value found!", "ImageUuid") as ErrorCode assert err.messages != null assert err.messages.method == ElaborationSearchMethod.regex assert err.messages.method == ElaborationSearchMethod.regex @@ -60,28 +62,28 @@ class RegexElaborationCase extends SubCase { } void testElaboration3() { - def err = Platform.operr("no host having cpu[%s], memory[%s bytes] found", 4, 8589934592) as ErrorCode + def err = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10031, "no host having cpu[%s], memory[%s bytes] found", 4, 8589934592) as ErrorCode assert err.messages != null assert err.messages.method == ElaborationSearchMethod.regex assert err.messages.message_cn == "找不到合适的物理机来启动云主机,因为可以用于分配云主机的物理机都没有足够的资源:CPU [4],内存 [8589934592 字节]。" } void testElaboration4() { - def err = Platform.operr("no Connected hosts found in the [%s] candidate hosts having the hypervisor type [%s]", 4, "KVM") as ErrorCode + def err = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10032, "no Connected hosts found in the [%s] candidate hosts having the hypervisor type [%s]", 4, "KVM") as ErrorCode assert err.messages != null assert err.messages.method == ElaborationSearchMethod.regex assert err.messages.message_cn == "找不到合适的物理机来启动云主机,因为满足分配条件的 4 个物理机都不是 KVM 的虚拟化类型。" } void testElaboration5() { - def err = Platform.operr("no Connected hosts found in the [%s] candidate hosts", 2) as ErrorCode + def err = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10033, "no Connected hosts found in the [%s] candidate hosts", 2) as ErrorCode assert err.messages != null assert err.messages.method == ElaborationSearchMethod.regex assert err.messages.message_cn == "找不到合适的物理机来启动云主机,因为满足分配条件的 2 个物理机都不处于 Connected 状态。" } void testElaboration6() { - def err = Platform.operr("shell command[sudo PYTHONPATH=/usr/local/zstack/ansible/files/zstacklib timeout 1800 python /usr/local/zstack/ansible/kvm.py -i /usr/local/zstack/ansible/hosts --private-key /usr/local/zstack/apache-tomcat-7.0.35/webapps/zstack/WEB-INF/classes/ansible/rsaKeys/id_rsa -e '{\"chrony_servers\":\"\",\"trusted_host\":\"\",\"remote_port\":\"22\",\"update_packages\":\"false\",\"zstack_root\":\"/var/lib/zstack\",\"remote_user\":\"root\",\"hostname\":\"10-0-121-175.zstack.org\",\"pkg_kvmagent\":\"kvmagent-3.2.0.tar.gz\",\"post_url\":\"http://172.20.11.235:8080/zstack/kvm/ansiblelog/%s\\n\",\"remote_pass\":\"******\",\"host\":\"172.20.11.235\",\"pip_url\":\"http://172.20.11.235:8080/zstack/static/pypi/simple\",\"zstack_repo\":\"\\\"zstack-mn,qemu-kvm-ev-mn\\\"\",\"yum_server\":\"172.20.11.235:8080\",\"pkg_zstacklib\":\"zstacklib-3.2.0.tar.gz\"}'] failed\n ret code: 1", Platform.uuid) + def err = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10034, "shell command[sudo PYTHONPATH=/usr/local/zstack/ansible/files/zstacklib timeout 1800 python /usr/local/zstack/ansible/kvm.py -i /usr/local/zstack/ansible/hosts --private-key /usr/local/zstack/apache-tomcat-7.0.35/webapps/zstack/WEB-INF/classes/ansible/rsaKeys/id_rsa -e '{\"chrony_servers\":\"\",\"trusted_host\":\"\",\"remote_port\":\"22\",\"update_packages\":\"false\",\"zstack_root\":\"/var/lib/zstack\",\"remote_user\":\"root\",\"hostname\":\"10-0-121-175.zstack.org\",\"pkg_kvmagent\":\"kvmagent-3.2.0.tar.gz\",\"post_url\":\"http://172.20.11.235:8080/zstack/kvm/ansiblelog/%s\\n\",\"remote_pass\":\"******\",\"host\":\"172.20.11.235\",\"pip_url\":\"http://172.20.11.235:8080/zstack/static/pypi/simple\",\"zstack_repo\":\"\\\"zstack-mn,qemu-kvm-ev-mn\\\"\",\"yum_server\":\"172.20.11.235:8080\",\"pkg_zstacklib\":\"zstacklib-3.2.0.tar.gz\"}'] failed\n ret code: 1", Platform.uuid) assert err.elaboration != null assert err.messages.method == ElaborationSearchMethod.regex assert err.messages.message_cn == "pip 安装失败。可能因为 pip 安装文件不完整,或者 pip 版本不正确。" @@ -91,28 +93,28 @@ class RegexElaborationCase extends SubCase { ErrorCode errorCodes = new ErrorCodeList() List causes = Collections.synchronizedList(new ArrayList<>()) - def errCode1 = Platform.operr("operation error, because:%s", ".*can not find vg .* and create vg with forceWipw=.*") as ErrorCode - def errCode2 = Platform.operr("operation error, because:%s", ".*can not find vg .* and create vg with forceWipw=.*") as ErrorCode + def errCode1 = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10040, "operation error, because:%s", ".*can not find vg .* and create vg with forceWipw=.*") as ErrorCode + def errCode2 = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10045, "operation error, because:%s", ".*can not find vg .* and create vg with forceWipw=.*") as ErrorCode causes.add(errCode1) causes.add(errCode2) errorCodes.setCauses(causes) - ErrorCode result = err(PrimaryStorageErrors.ATTACH_ERROR, errorCodes, errorCodes.getDetails()) + ErrorCode result = org.zstack.core.Platform.err(ORG_ZSTACK_TEST_INTEGRATION_CORE_10048, PrimaryStorageErrors.ATTACH_ERROR, errorCodes, errorCodes.getDetails()) assert result.elaboration.trim().equals("错误信息: .*can not find vg .* and create vg with forceWipw=.*") assert result.messages.message_cn.trim().equals("无法将物理机上的共享块主存储加载到集群,因为存在原有数据,请勾选清理块设备并重试。") assert result.messages.message_en.trim().equals("Could not attach shared block storage to cluster, because device is not empty. Please select the checkbox \"Clear LUN\" and try again.") - errCode1 = Platform.operr("operation error, because:.*can not find vg .* and create vg with forceWipw=.*") as ErrorCode - errCode2 = Platform.operr("operation error, because:.*can not find vg .* and create vg with forceWipw=.*") as ErrorCode + errCode1 = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10049, "operation error, because:.*can not find vg .* and create vg with forceWipw=.*") as ErrorCode + errCode2 = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10051, "operation error, because:.*can not find vg .* and create vg with forceWipw=.*") as ErrorCode causes.clear() causes.add(errCode1) causes.add(errCode2) errorCodes.setCauses(causes) - result = err(PrimaryStorageErrors.ATTACH_ERROR, errorCodes, errorCodes.getDetails()) + result = org.zstack.core.Platform.err(ORG_ZSTACK_TEST_INTEGRATION_CORE_10052, PrimaryStorageErrors.ATTACH_ERROR, errorCodes, errorCodes.getDetails()) assert result.elaboration.trim().equals("错误信息: 无法将物理机上的共享块主存储加载到集群,因为存在原有数据,请勾选清理块设备并重试。") assert result.messages.message_cn.trim().equals("无法将物理机上的共享块主存储加载到集群,因为存在原有数据,请勾选清理块设备并重试。") assert result.messages.message_en.trim().equals("Could not attach shared block storage to cluster, because device is not empty. Please select the checkbox \"Clear LUN\" and try again.") @@ -123,8 +125,8 @@ class RegexElaborationCase extends SubCase { * test error do not match wrong elaboration */ void testElaboration8() { - ErrorCode errorCode = Platform.operr("operation error, because:%s", "failed to execute bash") - ErrorCode result = err(VmErrors.START_ERROR, errorCode, errorCode.getDetails()) + ErrorCode errorCode = org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_10053, "operation error, because:%s", "failed to execute bash") + ErrorCode result = org.zstack.core.Platform.err(ORG_ZSTACK_TEST_INTEGRATION_CORE_10054, VmErrors.START_ERROR, errorCode, errorCode.getDetails()) // current error do not match elaboration assert result.elaboration == null } diff --git a/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/CloudBusCase.groovy b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/CloudBusCase.groovy index e3ab4170478..ef921a0da03 100644 --- a/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/CloudBusCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/CloudBusCase.groovy @@ -1,5 +1,7 @@ package org.zstack.test.integration.core.cloudbus +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; + import org.zstack.core.Platform import org.zstack.core.cloudbus.CloudBusCallBack import org.zstack.core.cloudbus.CloudBusGlobalProperty @@ -76,7 +78,7 @@ class CloudBusCase extends SubCase{ }) } else if (msg instanceof FakeNeedReplyMessage3) { def r = new MessageReply() - r.setError(errf.stringToOperationError("fake first error", [operr("origin error")])) + r.setError(errf.stringToOperationError("fake first error", [org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_CLOUDBUS_10000, "origin error")])) bus.reply(msg, r) } else if (msg instanceof FakeNeedReplyMessage4) { // no reply diff --git a/test/src/test/groovy/org/zstack/test/integration/core/gc/EventBasedGarbageCollectorCase.groovy b/test/src/test/groovy/org/zstack/test/integration/core/gc/EventBasedGarbageCollectorCase.groovy index 1e20aafcabc..0bc76b3d065 100755 --- a/test/src/test/groovy/org/zstack/test/integration/core/gc/EventBasedGarbageCollectorCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/gc/EventBasedGarbageCollectorCase.groovy @@ -1,4 +1,6 @@ -package org.zstack.test.integration.core.gc +package org.zstack.test.integration.core.gc + +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; import org.apache.commons.collections.map.HashedMap import org.zstack.core.Platform @@ -114,7 +116,7 @@ class EventBasedGarbageCollectorCase extends SubCase { if (ret == EventBasedGCInDbBehavior.SUCCESS) { completion.success() } else if (ret == EventBasedGCInDbBehavior.FAIL) { - completion.fail(operr("on purpose")) + completion.fail(org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10007, "on purpose")) } else if (ret == EventBasedGCInDbBehavior.CANCEL) { completion.cancel() } else { @@ -154,7 +156,7 @@ class EventBasedGarbageCollectorCase extends SubCase { if (ret == EventBasedGCInDbBehavior.SUCCESS) { completion.success() } else if (ret == EventBasedGCInDbBehavior.FAIL) { - completion.fail(operr("on purpose")) + completion.fail(org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10008, "on purpose")) } else if (ret == EventBasedGCInDbBehavior.CANCEL) { completion.cancel() } else { @@ -214,7 +216,7 @@ class EventBasedGarbageCollectorCase extends SubCase { def gc = new EventBasedGC1() gc.testLogic = { GCCompletion completion -> - completion.fail(operr("testEventBasedGCFailure")) + completion.fail(org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10009, "testEventBasedGCFailure")) latch.countDown() } gc.NAME = "testEventBasedGCFailure" @@ -336,7 +338,7 @@ class EventBasedGarbageCollectorCase extends SubCase { gc.testLogic = { GCCompletion completion -> count ++ if (count == 1) { - completion.fail(operr("testTwoEventsTriggeredGC")) + completion.fail(org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10010, "testTwoEventsTriggeredGC")) } else { completion.success() } @@ -562,7 +564,7 @@ class EventBasedGarbageCollectorCase extends SubCase { gc.testLogic = { GCCompletion completion -> if (count == 0) { assert !TaskContext.getTaskContextItem("test") - completion.fail(operr("mock failure")) + completion.fail(org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10011, "mock failure")) count++ return } diff --git a/test/src/test/groovy/org/zstack/test/integration/core/gc/TimeBasedGarbageCollectorCase.groovy b/test/src/test/groovy/org/zstack/test/integration/core/gc/TimeBasedGarbageCollectorCase.groovy index f63a6871e51..0d187bca6a6 100755 --- a/test/src/test/groovy/org/zstack/test/integration/core/gc/TimeBasedGarbageCollectorCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/gc/TimeBasedGarbageCollectorCase.groovy @@ -1,4 +1,6 @@ -package org.zstack.test.integration.core.gc +package org.zstack.test.integration.core.gc + +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; import org.zstack.core.db.DatabaseFacade import org.zstack.core.db.SQL @@ -43,7 +45,7 @@ class TimeBasedGarbageCollectorCase extends SubCase { if (ret == Behavior.SUCCESS) { completion.success() } else if (ret == Behavior.FAILURE) { - completion.fail(operr("failure")) + completion.fail(org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10012, "failure")) } else if (ret == Behavior.CANCEL) { completion.cancel() } else { @@ -61,7 +63,7 @@ class TimeBasedGarbageCollectorCase extends SubCase { if (ret == Behavior.SUCCESS) { completion.success() } else if (ret == Behavior.FAILURE) { - completion.fail(operr("failure")) + completion.fail(org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10013, "failure")) } else if (ret == Behavior.CANCEL) { completion.cancel() } else { diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/host/BatchAddHostCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/host/BatchAddHostCase.groovy index de3fd6eea25..0b744a57e65 100644 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/host/BatchAddHostCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/host/BatchAddHostCase.groovy @@ -1,5 +1,7 @@ package org.zstack.test.integration.kvm.host +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; + import org.zstack.core.cloudbus.CloudBus import org.zstack.core.db.Q import org.zstack.header.host.ConnectHostMsg @@ -39,7 +41,7 @@ class BatchAddHostCase extends SubCase { while (!over) { sleep(1000) } - reply.setError(operr("on purpose")) + reply.setError(org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_KVM_HOST_10001, "on purpose")) bus.reply(msg, reply) } diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/host/MaintainHostCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/host/MaintainHostCase.groovy index 49153d5b7ff..4c22cfa47ba 100644 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/host/MaintainHostCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/host/MaintainHostCase.groovy @@ -1,5 +1,7 @@ package org.zstack.test.integration.kvm.host +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; + import org.springframework.http.HttpEntity import org.zstack.core.cloudbus.CloudBus @@ -227,7 +229,7 @@ class MaintainHostCase extends SubCase{ env.message(StopVmInstanceMsg){ StopVmInstanceMsg msg, CloudBus bus -> def r = new StopVmInstanceReply() - r.setError(operr("on purpose")) + r.setError(org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_KVM_HOST_10000, "on purpose")) bus.reply(msg, r) } diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/RebootVmInstanceCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/RebootVmInstanceCase.groovy index 2766d626c04..1acab3675ce 100644 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/RebootVmInstanceCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/RebootVmInstanceCase.groovy @@ -1,5 +1,7 @@ package org.zstack.test.integration.kvm.vm +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; + import org.zstack.core.cloudbus.CloudBus import org.zstack.core.db.SQL import org.zstack.header.vm.StartVmOnHypervisorMsg @@ -50,7 +52,7 @@ class RebootVmInstanceCase extends SubCase{ .update() StartVmOnHypervisorReply reply = new StartVmOnHypervisorReply() - reply.setError(operr("start fail on purpose")) + reply.setError(org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_KVM_VM_10000, "start fail on purpose")) bus.reply(msg, reply) } diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmLastHostUuidCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmLastHostUuidCase.groovy index 522af2a43f8..6016c206264 100644 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmLastHostUuidCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmLastHostUuidCase.groovy @@ -1,5 +1,7 @@ package org.zstack.test.integration.kvm.vm +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; + import org.zstack.core.cloudbus.CloudBus import org.zstack.core.db.Q import org.zstack.header.allocator.AllocateHostMsg @@ -180,7 +182,7 @@ class VmLastHostUuidCase extends SubCase{ void testStartVmAllocateHostFailHostUuid(){ env.message(AllocateHostMsg.class) { AllocateHostMsg msg, CloudBus bus -> def reply = new AllocateHostReply() - reply.setError(operr("allocate host fail")) + reply.setError(org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_KVM_VM_10001, "allocate host fail")) bus.reply(msg, reply) } testStartVmExpect(false, host1.uuid, null, host2.uuid) @@ -210,7 +212,7 @@ class VmLastHostUuidCase extends SubCase{ void testMigrateVmAllocateHostFailHostUuid(){ env.message(AllocateHostMsg.class) { AllocateHostMsg msg, CloudBus bus -> def reply = new AllocateHostReply() - reply.setError(operr("allocate host fail")) + reply.setError(org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_KVM_VM_10002, "allocate host fail")) bus.reply(msg, reply) } testMigrateVmExpect(false, host1.uuid, host2.uuid, host1.uuid) diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmVolumeGCCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmVolumeGCCase.groovy index 1817076e8b2..f0f0f8b8c2d 100644 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmVolumeGCCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmVolumeGCCase.groovy @@ -1,5 +1,7 @@ package org.zstack.test.integration.kvm.vm +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; + import org.springframework.http.HttpEntity import org.zstack.compute.vm.DeleteVolumeGC import org.zstack.core.cloudbus.CloudBus @@ -149,7 +151,7 @@ class VmVolumeGCCase extends SubCase { DeleteVolumeReply reply = new DeleteVolumeReply() reply.success = false - reply.setError(operr("ase mock error")) + reply.setError(org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_KVM_VM_10003, "ase mock error")) bus.reply(msg, reply) } diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/eip/StartFlatNetworkVmWithEipCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/eip/StartFlatNetworkVmWithEipCase.groovy index ac5cfa42337..0a3506b94d2 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/eip/StartFlatNetworkVmWithEipCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/eip/StartFlatNetworkVmWithEipCase.groovy @@ -1,5 +1,7 @@ package org.zstack.test.integration.networkservice.provider.flat.eip +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; + import org.springframework.http.HttpEntity import org.zstack.core.cloudbus.CloudBus import org.zstack.header.network.service.NetworkServiceType @@ -213,7 +215,7 @@ class StartFlatNetworkVmWithEipCase extends SubCase { env.message(StopVipMsg.class) { StopVipMsg msg, CloudBus bus -> def reply = new StopVipReply() - reply.setError(operr("on purpose")) + reply.setError(org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_NETWORKSERVICE_PROVIDER_FLAT_EIP_10000, "on purpose")) bus.reply(msg, reply) } diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/VirtualRouterCreateFailedCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/VirtualRouterCreateFailedCase.groovy index c35ef5fbf12..9e8159b425a 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/VirtualRouterCreateFailedCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/VirtualRouterCreateFailedCase.groovy @@ -1,5 +1,7 @@ package org.zstack.test.integration.networkservice.provider.virtualrouter +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; + import org.zstack.appliancevm.ApplianceVmVO import org.zstack.appliancevm.StartNewCreatedApplianceVmMsg import org.zstack.core.cloudbus.CloudBus @@ -51,7 +53,7 @@ class VirtualRouterCreateFailedCase extends SubCase { env.message(StartNewCreatedApplianceVmMsg.class) { StartNewCreatedApplianceVmMsg msg, CloudBus bus -> InstantiateNewCreatedVmInstanceReply reply = new InstantiateNewCreatedVmInstanceReply() - reply.setError(operr("on purpose")) + reply.setError(org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_NETWORKSERVICE_PROVIDER_VIRTUALROUTER_10000, "on purpose")) bus.reply(msg, reply) } diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/local/datavolume/MigrateVolumeCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/local/datavolume/MigrateVolumeCase.groovy index 954d9293aea..ce322a6282f 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/local/datavolume/MigrateVolumeCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/local/datavolume/MigrateVolumeCase.groovy @@ -1,5 +1,7 @@ package org.zstack.test.integration.storage.primary.local.datavolume +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; + import org.springframework.beans.BeanUtils import org.springframework.http.HttpEntity import org.zstack.compute.vm.VmGlobalConfig @@ -343,7 +345,7 @@ class MigrateVolumeCase extends SubCase { env.message(LocalStorageCreateEmptyVolumeMsg.class) { LocalStorageCreateEmptyVolumeMsg msg, CloudBus bus -> def reply = new LocalStorageCreateEmptyVolumeReply() run.run() - reply.setError(operr("on purpose")) + reply.setError(org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_STORAGE_PRIMARY_LOCAL_DATAVOLUME_10000, "on purpose")) context.called = true bus.reply(msg, reply) } diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/volume/CreateDataVolumeFromTemplateCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/volume/CreateDataVolumeFromTemplateCase.groovy index 5ed0fece887..dc96e8362e9 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/volume/CreateDataVolumeFromTemplateCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/volume/CreateDataVolumeFromTemplateCase.groovy @@ -1,5 +1,7 @@ package org.zstack.test.integration.storage.volume +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; + import org.zstack.core.Platform import org.zstack.core.cloudbus.CloudBus import org.zstack.core.db.Q @@ -123,7 +125,7 @@ class CreateDataVolumeFromTemplateCase extends SubCase{ env.message(DownloadDataVolumeToPrimaryStorageMsg.class){DownloadDataVolumeToPrimaryStorageMsg msg, CloudBus bus -> def reply = new DownloadDataVolumeToPrimaryStorageReply() - reply.setError(operr("on purpose")) + reply.setError(org.zstack.core.Platform.operr(ORG_ZSTACK_TEST_INTEGRATION_STORAGE_VOLUME_10000, "on purpose")) installPath = PathUtil.join(ps.getUrl(), PrimaryStoragePathMaker.makeDataVolumeInstallPath(volumeUuid)) bus.reply(msg, reply) } diff --git a/test/src/test/java/org/zstack/test/ApiSender.java b/test/src/test/java/org/zstack/test/ApiSender.java index f3b1d0cb883..e4b2e35bd7b 100755 --- a/test/src/test/java/org/zstack/test/ApiSender.java +++ b/test/src/test/java/org/zstack/test/ApiSender.java @@ -18,6 +18,7 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.touterr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class ApiSender { @@ -82,7 +83,7 @@ public boolean handleEvent(Event e) { bus.send(dmsg); TimeUnit.SECONDS.sleep(2); - throw new ApiSenderException(touterr("%s[uuid:%s] timeout after %s seconds", msg.getMessageName(), msg.getId(), timeout)); + throw new ApiSenderException(touterr(ORG_ZSTACK_TEST_10000, "%s[uuid:%s] timeout after %s seconds", msg.getMessageName(), msg.getId(), timeout)); } } catch (InterruptedException e1) { throw new CloudRuntimeException("", e1); diff --git a/test/src/test/java/org/zstack/test/TestSafeWhile.java b/test/src/test/java/org/zstack/test/TestSafeWhile.java index 4a4e01b2d97..b134dde4230 100644 --- a/test/src/test/java/org/zstack/test/TestSafeWhile.java +++ b/test/src/test/java/org/zstack/test/TestSafeWhile.java @@ -11,6 +11,7 @@ import java.util.concurrent.atomic.AtomicInteger; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by MaJin on 2021/1/27. @@ -20,7 +21,7 @@ public void testSafeWhile() { // *(.., WhileCompletion, ..) will catch the exception, and call the addError. FutureCompletion fc = new FutureCompletion(null); new While<>(Arrays.asList(1, 2, 3)).each((item, completion) -> { - throw new OperationFailureException(operr("on purpose %d", item)); + throw new OperationFailureException(operr(ORG_ZSTACK_TEST_10001, "on purpose %d", item)); }).run(new WhileDoneCompletion(fc) { @Override public void done(ErrorCodeList errs) { @@ -35,9 +36,9 @@ public void done(ErrorCodeList errs) { // *(.., WhileCompletion, ..) will catch the exception, but addError will only be called once. FutureCompletion fc2 = new FutureCompletion(null); new While<>(Arrays.asList(1, 2, 3)).each((item, completion) -> { - completion.addError(operr("on purpose %d", item)); - completion.addError(operr("I should not be in error list %d", item)); - throw new OperationFailureException(operr("I should not be in error list either %d", item)); + completion.addError(operr(ORG_ZSTACK_TEST_10002, "on purpose %d", item)); + completion.addError(operr(ORG_ZSTACK_TEST_10003, "I should not be in error list %d", item)); + throw new OperationFailureException(operr(ORG_ZSTACK_TEST_10004, "I should not be in error list either %d", item)); }).run(new WhileDoneCompletion(fc2) { @Override public void done(ErrorCodeList errs) { @@ -53,14 +54,14 @@ public void done(ErrorCodeList errs) { // WhileDoneCompletion(asyncBackup async).done() will handle the exception and asyncBackup will be called. FutureCompletion fc3 = new FutureCompletion(null); new While<>(Arrays.asList(1, 2, 3)).each((item, completion) -> { - completion.addError(operr("on purpose %d", item)); + completion.addError(operr(ORG_ZSTACK_TEST_10005, "on purpose %d", item)); completion.done(); }).run(new WhileDoneCompletion(fc3) { @Override public void done(ErrorCodeList errs) { assert errs.getCauses().size() == 3 : "errors:" + errs.getCauses().toString(); assert errs.getCauses().stream().allMatch(it -> it.getDetails().startsWith("on purpose")); - throw new OperationFailureException(operr("done, on purpose")); + throw new OperationFailureException(operr(ORG_ZSTACK_TEST_10006, "done, on purpose")); } }); @@ -77,9 +78,9 @@ public void done(ErrorCodeList errs) { }).run(new WhileDoneCompletion(completion) { @Override public void done(ErrorCodeList errorCodeList) { - completion.addError(operr("on purpose")); - completion.addError(operr("I should not be errs list")); - throw new OperationFailureException(operr("I should not be errs list either.")); + completion.addError(operr(ORG_ZSTACK_TEST_10007, "on purpose")); + completion.addError(operr(ORG_ZSTACK_TEST_10008, "I should not be errs list")); + throw new OperationFailureException(operr(ORG_ZSTACK_TEST_10009, "I should not be errs list either.")); } }); }).run(new WhileDoneCompletion(fc4) { diff --git a/test/src/test/java/org/zstack/test/aop/ManInTheMiddleService.java b/test/src/test/java/org/zstack/test/aop/ManInTheMiddleService.java index 625a453acf6..95e79c183b7 100755 --- a/test/src/test/java/org/zstack/test/aop/ManInTheMiddleService.java +++ b/test/src/test/java/org/zstack/test/aop/ManInTheMiddleService.java @@ -10,6 +10,7 @@ import org.zstack.utils.logging.CLogger; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class ManInTheMiddleService extends AbstractService { private static final CLogger logger = Utils.getLogger(ManInTheMiddleService.class); @@ -37,7 +38,7 @@ public boolean stop() { public void handleMessage(Message msg) { String behavior = msg.getHeaderEntry(CloudBusAopProxy.MESSAGE_BEHAVIOR); if (CloudBusAopProxy.Behavior.FAIL.toString().equals(behavior)) { - ErrorCode err = operr("unit test asks it to fail"); + ErrorCode err = operr(ORG_ZSTACK_TEST_AOP_10001, "unit test asks it to fail"); bus.replyErrorByMessageType(msg, err); } else if (CloudBusAopProxy.Behavior.TIMEOUT.toString().equals(behavior)) { logger.debug(String.format("drop message[%s, %s] as unit test ask it to time out", msg.getMessageName(), msg.getId())); diff --git a/test/src/test/java/org/zstack/test/aop/TestFutureCompletion1.java b/test/src/test/java/org/zstack/test/aop/TestFutureCompletion1.java index 63e6a2c5fa0..a52e9057f58 100755 --- a/test/src/test/java/org/zstack/test/aop/TestFutureCompletion1.java +++ b/test/src/test/java/org/zstack/test/aop/TestFutureCompletion1.java @@ -14,6 +14,7 @@ import org.zstack.utils.logging.CLogger; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -31,7 +32,7 @@ public void setUp() throws Exception { } private void complete(Completion completion) { - completion.fail(operr("on purpose")); + completion.fail(operr(ORG_ZSTACK_TEST_AOP_10003, "on purpose")); } @Test diff --git a/test/src/test/java/org/zstack/test/aop/TestFutureCompletion3.java b/test/src/test/java/org/zstack/test/aop/TestFutureCompletion3.java index db45506dba9..e7ff22ce0ea 100755 --- a/test/src/test/java/org/zstack/test/aop/TestFutureCompletion3.java +++ b/test/src/test/java/org/zstack/test/aop/TestFutureCompletion3.java @@ -16,6 +16,7 @@ import java.util.concurrent.TimeUnit; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -33,7 +34,7 @@ public void setUp() throws Exception { } private void complete(Completion completion) { - throw new OperationFailureException(operr("on purpose")); + throw new OperationFailureException(operr(ORG_ZSTACK_TEST_AOP_10002, "on purpose")); } @Test diff --git a/test/src/test/java/org/zstack/test/aop/TestFutureReturnValueCompletion1.java b/test/src/test/java/org/zstack/test/aop/TestFutureReturnValueCompletion1.java index 0885160839a..473a369df7a 100755 --- a/test/src/test/java/org/zstack/test/aop/TestFutureReturnValueCompletion1.java +++ b/test/src/test/java/org/zstack/test/aop/TestFutureReturnValueCompletion1.java @@ -14,6 +14,7 @@ import org.zstack.utils.logging.CLogger; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** */ @@ -32,7 +33,7 @@ public void setUp() throws Exception { } private void complete(ReturnValueCompletion completion) { - completion.fail(operr("on purpose")); + completion.fail(operr(ORG_ZSTACK_TEST_AOP_10000, "on purpose")); } @Test diff --git a/test/src/test/java/org/zstack/test/compute/hostallocator/HostAllocateExtension.java b/test/src/test/java/org/zstack/test/compute/hostallocator/HostAllocateExtension.java index a9d6f64060d..09e652d94a2 100644 --- a/test/src/test/java/org/zstack/test/compute/hostallocator/HostAllocateExtension.java +++ b/test/src/test/java/org/zstack/test/compute/hostallocator/HostAllocateExtension.java @@ -4,6 +4,7 @@ import org.zstack.header.allocator.HostAllocatorSpec; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.host.HostAllocateExtensionPoint; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class HostAllocateExtension implements HostAllocateExtensionPoint { private boolean errorOut = false; @@ -19,7 +20,7 @@ public void setErrorOut(boolean errorOut) { @Override public void beforeAllocateHostSuccessReply(HostAllocatorSpec spec, String replyHostUuid) { if (isErrorOut()) { - throw new OperationFailureException(Platform.operr("On purpose")); + throw new OperationFailureException(Platform.operr(ORG_ZSTACK_TEST_COMPUTE_HOSTALLOCATOR_10000, "On purpose")); } } } diff --git a/test/src/test/java/org/zstack/test/core/asyncbackup/TestSafeCompletion.java b/test/src/test/java/org/zstack/test/core/asyncbackup/TestSafeCompletion.java index c9d43790983..df676c36bbb 100644 --- a/test/src/test/java/org/zstack/test/core/asyncbackup/TestSafeCompletion.java +++ b/test/src/test/java/org/zstack/test/core/asyncbackup/TestSafeCompletion.java @@ -10,6 +10,7 @@ import org.zstack.utils.logging.CLogger; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by MaJin on 2021/11/1. @@ -64,7 +65,7 @@ public void testSafeCompletion() { @Override public void run(MessageReply reply) { haCompletion.success(null); - throw new OperationFailureException(operr("on purpose 3")); + throw new OperationFailureException(operr(ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10000, "on purpose 3")); } }.run(null); assert succCount == 1; @@ -72,7 +73,7 @@ public void run(MessageReply reply) { } private void throwException(HaCheckerCompletion completion) { - throw new OperationFailureException(operr("on purpose 1")); + throw new OperationFailureException(operr(ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10001, "on purpose 1")); } private void throwExceptionAndCallSucc(HaCheckerCompletion completion) { @@ -80,7 +81,7 @@ private void throwExceptionAndCallSucc(HaCheckerCompletion completion) { completion.noWay(); completion.fail(null); completion.notStable(); - throw new OperationFailureException(operr("on purpose 2")); + throw new OperationFailureException(operr(ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10002, "on purpose 2")); } private void reset() { diff --git a/test/src/test/java/org/zstack/test/core/errorcode/TestErrorCode.java b/test/src/test/java/org/zstack/test/core/errorcode/TestErrorCode.java index fe93d3e967a..7b45941a7a0 100755 --- a/test/src/test/java/org/zstack/test/core/errorcode/TestErrorCode.java +++ b/test/src/test/java/org/zstack/test/core/errorcode/TestErrorCode.java @@ -11,6 +11,7 @@ import static org.zstack.core.Platform.inerr; import static org.zstack.core.Platform.touterr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; public class TestErrorCode { CLogger logger = Utils.getLogger(TestErrorCode.class); @@ -26,9 +27,9 @@ public void setUp() throws Exception { @Test public void test() { - ErrorCode err = inerr("on purpose"); + ErrorCode err = inerr(ORG_ZSTACK_TEST_CORE_ERRORCODE_10000, "on purpose"); logger.debug(err.toString()); - err = touterr("on purpose"); + err = touterr(ORG_ZSTACK_TEST_CORE_ERRORCODE_10001, "on purpose"); logger.debug(err.toString()); } } diff --git a/test/src/test/java/org/zstack/test/core/workflow/TestSimpleFlow13.java b/test/src/test/java/org/zstack/test/core/workflow/TestSimpleFlow13.java index 202ce6d89b3..8e385eb3d99 100644 --- a/test/src/test/java/org/zstack/test/core/workflow/TestSimpleFlow13.java +++ b/test/src/test/java/org/zstack/test/core/workflow/TestSimpleFlow13.java @@ -11,6 +11,7 @@ import java.util.Map; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /* @@ -59,7 +60,7 @@ public void rollback(FlowRollback trigger, Map data) { @Override public void run(FlowTrigger chain, Map data) { count[0] = count[0] + 1; - throw new OperationFailureException(operr("on purpose")); + throw new OperationFailureException(operr(ORG_ZSTACK_TEST_CORE_WORKFLOW_10000, "on purpose")); } @Override diff --git a/test/src/test/java/org/zstack/test/kvm/KVMPingAgentExtensionForTest.java b/test/src/test/java/org/zstack/test/kvm/KVMPingAgentExtensionForTest.java index b9ede71d7e4..3ed62287007 100755 --- a/test/src/test/java/org/zstack/test/kvm/KVMPingAgentExtensionForTest.java +++ b/test/src/test/java/org/zstack/test/kvm/KVMPingAgentExtensionForTest.java @@ -9,6 +9,7 @@ import org.zstack.kvm.KVMPingAgentExtensionPoint; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** * Created by xing5 on 2016/8/6. @@ -24,7 +25,7 @@ public void kvmPingAgent(KVMHostInventory host, Completion completion) { if (success) { completion.success(); } else { - ErrorCode err = operr("on purpose"); + ErrorCode err = operr(ORG_ZSTACK_TEST_KVM_10000, "on purpose"); err.putToOpaque(Opaque.NO_RECONNECT_AFTER_PING_FAILURE.toString(), true); completion.fail(err); } diff --git a/testlib/src/main/java/org/zstack/testlib/controller/BackupStorageController.groovy b/testlib/src/main/java/org/zstack/testlib/controller/BackupStorageController.groovy index f565838a5b6..069444222d9 100755 --- a/testlib/src/main/java/org/zstack/testlib/controller/BackupStorageController.groovy +++ b/testlib/src/main/java/org/zstack/testlib/controller/BackupStorageController.groovy @@ -1,4 +1,6 @@ -package org.zstack.testlib.controller +package org.zstack.testlib.controller + +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; import org.zstack.core.Platform import org.zstack.core.db.Q @@ -32,7 +34,7 @@ class BackupStorageController { def proxy = new TProxy(bs) proxy.mockMethod("connectHook") { invokeSuper, boolean newAdd, Completion completion -> if (disconnectedUuids.contains(bs.self.uuid)) { - completion.fail(Platform.operr("BackupStorageController puts it down")) + completion.fail(org.zstack.core.Platform.operr(ORG_ZSTACK_TESTLIB_CONTROLLER_10002, "BackupStorageController puts it down")) } else { return invokeSuper() } diff --git a/testlib/src/main/java/org/zstack/testlib/controller/PrimaryStorageController.groovy b/testlib/src/main/java/org/zstack/testlib/controller/PrimaryStorageController.groovy index be99c9f1bdc..cc411f582c9 100755 --- a/testlib/src/main/java/org/zstack/testlib/controller/PrimaryStorageController.groovy +++ b/testlib/src/main/java/org/zstack/testlib/controller/PrimaryStorageController.groovy @@ -1,4 +1,6 @@ -package org.zstack.testlib.controller +package org.zstack.testlib.controller + +import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; import org.zstack.core.Platform import org.zstack.core.db.Q @@ -31,7 +33,7 @@ class PrimaryStorageController { TProxy proxy = new TProxy(ps) proxy.mockMethod("connectHook") { Closure invokeSuper, PrimaryStorageBase.ConnectParam param, Completion completion -> if (disconnectedUuids.contains(ps.self.uuid)) { - completion.fail(Platform.operr("PrimaryStorageController puts it down")) + completion.fail(org.zstack.core.Platform.operr(ORG_ZSTACK_TESTLIB_CONTROLLER_10003, "PrimaryStorageController puts it down")) } else { return invokeSuper() } diff --git a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java new file mode 100644 index 00000000000..d4d030c64f6 --- /dev/null +++ b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java @@ -0,0 +1,15842 @@ +package org.zstack.utils.clouderrorcode; + +public class CloudOperationsErrorCode { + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_PUSHGATEWAY_10000 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_PUSHGATEWAY_10000"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_PUSHGATEWAY_10001 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_PUSHGATEWAY_10001"; + + public static final String ORG_ZSTACK_AUTOSCALING_10000 = "ORG_ZSTACK_AUTOSCALING_10000"; + + public static final String ORG_ZSTACK_AUTOSCALING_10001 = "ORG_ZSTACK_AUTOSCALING_10001"; + + public static final String ORG_ZSTACK_AUTOSCALING_10002 = "ORG_ZSTACK_AUTOSCALING_10002"; + + public static final String ORG_ZSTACK_AUTOSCALING_10003 = "ORG_ZSTACK_AUTOSCALING_10003"; + + public static final String ORG_ZSTACK_AUTOSCALING_10004 = "ORG_ZSTACK_AUTOSCALING_10004"; + + public static final String ORG_ZSTACK_AUTOSCALING_10005 = "ORG_ZSTACK_AUTOSCALING_10005"; + + public static final String ORG_ZSTACK_AUTOSCALING_10006 = "ORG_ZSTACK_AUTOSCALING_10006"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_BACKUP_10000 = "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10000"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_BACKUP_10001 = "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10001"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_BACKUP_10002 = "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10002"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_BACKUP_10003 = "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10003"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_BACKUP_10004 = "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10004"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_BACKUP_10005 = "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10005"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_BACKUP_10006 = "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10006"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_BACKUP_10007 = "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10007"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_BACKUP_10008 = "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10008"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_BACKUP_10009 = "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10009"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_BACKUP_10010 = "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10010"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_BACKUP_10011 = "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10011"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_BACKUP_10012 = "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10012"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_BACKUP_10013 = "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10013"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_BACKUP_10014 = "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10014"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_BACKUP_10015 = "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10015"; + + public static final String ORG_ZSTACK_APPLIANCEVM_10000 = "ORG_ZSTACK_APPLIANCEVM_10000"; + + public static final String ORG_ZSTACK_APPLIANCEVM_10001 = "ORG_ZSTACK_APPLIANCEVM_10001"; + + public static final String ORG_ZSTACK_APPLIANCEVM_10002 = "ORG_ZSTACK_APPLIANCEVM_10002"; + + public static final String ORG_ZSTACK_APPLIANCEVM_10003 = "ORG_ZSTACK_APPLIANCEVM_10003"; + + public static final String ORG_ZSTACK_APPLIANCEVM_10004 = "ORG_ZSTACK_APPLIANCEVM_10004"; + + public static final String ORG_ZSTACK_APPLIANCEVM_10005 = "ORG_ZSTACK_APPLIANCEVM_10005"; + + public static final String ORG_ZSTACK_APPLIANCEVM_10006 = "ORG_ZSTACK_APPLIANCEVM_10006"; + + public static final String ORG_ZSTACK_APPLIANCEVM_10007 = "ORG_ZSTACK_APPLIANCEVM_10007"; + + public static final String ORG_ZSTACK_PORTAL_APIMEDIATOR_10000 = "ORG_ZSTACK_PORTAL_APIMEDIATOR_10000"; + + public static final String ORG_ZSTACK_PORTAL_APIMEDIATOR_10001 = "ORG_ZSTACK_PORTAL_APIMEDIATOR_10001"; + + public static final String ORG_ZSTACK_PORTAL_APIMEDIATOR_10002 = "ORG_ZSTACK_PORTAL_APIMEDIATOR_10002"; + + public static final String ORG_ZSTACK_PORTAL_APIMEDIATOR_10003 = "ORG_ZSTACK_PORTAL_APIMEDIATOR_10003"; + + public static final String ORG_ZSTACK_PORTAL_APIMEDIATOR_10004 = "ORG_ZSTACK_PORTAL_APIMEDIATOR_10004"; + + public static final String ORG_ZSTACK_PORTAL_APIMEDIATOR_10005 = "ORG_ZSTACK_PORTAL_APIMEDIATOR_10005"; + + public static final String ORG_ZSTACK_PORTAL_APIMEDIATOR_10006 = "ORG_ZSTACK_PORTAL_APIMEDIATOR_10006"; + + public static final String ORG_ZSTACK_PORTAL_APIMEDIATOR_10007 = "ORG_ZSTACK_PORTAL_APIMEDIATOR_10007"; + + public static final String ORG_ZSTACK_PORTAL_APIMEDIATOR_10008 = "ORG_ZSTACK_PORTAL_APIMEDIATOR_10008"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10000 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10000"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10001 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10001"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10002 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10002"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10003 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10003"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10004 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10004"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10005 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10005"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10006 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10006"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10007 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10007"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10008 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10008"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10009 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10009"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10010 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10010"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10011 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10011"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10012 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10012"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10013 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10013"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10014 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10014"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10015 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10015"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10016 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10016"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10017 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10017"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10018 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10018"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10019 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10019"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10020 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10020"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10021 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10021"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10022 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10022"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10023 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10023"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10024 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10024"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10025 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10025"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10026 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10026"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10027 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10027"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10028 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10028"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10029 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10029"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10030 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10030"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10031 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10031"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10032 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10032"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10033 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10033"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10034 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10034"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10035 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10035"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10036 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10036"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10037 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10037"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10038 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10038"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10039 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10039"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10040 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10040"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10041 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10041"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10042 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10042"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10043 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10043"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10044 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10044"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10045 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10045"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10046 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10046"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10047 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10047"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10048 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10048"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10049 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10049"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10050 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10050"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10051 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10051"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10052 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10052"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10053 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10053"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10054 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10054"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10055 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10055"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10056 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10056"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10057 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10057"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10058 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10058"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10059 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10059"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10060 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10060"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10061 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10061"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10062 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10062"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10063 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10063"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10064 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10064"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10065 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10065"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10066 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10066"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10067 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10067"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10068 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10068"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10069 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10069"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10070 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10070"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10071 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10071"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10072 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10072"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10073 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10073"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10074 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10074"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10075 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10075"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10076 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10076"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10077 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10077"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10078 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10078"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10079 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10079"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10080 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10080"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10081 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10081"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10082 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10082"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10083 = "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10083"; + + public static final String ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10000 = "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10000"; + + public static final String ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10001 = "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10001"; + + public static final String ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10002 = "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10002"; + + public static final String ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10003 = "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10003"; + + public static final String ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10004 = "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10004"; + + public static final String ORG_ZSTACK_ISCSI_KVM_10000 = "ORG_ZSTACK_ISCSI_KVM_10000"; + + public static final String ORG_ZSTACK_ALIYUN_PANGU_10000 = "ORG_ZSTACK_ALIYUN_PANGU_10000"; + + public static final String ORG_ZSTACK_ALIYUN_PANGU_10001 = "ORG_ZSTACK_ALIYUN_PANGU_10001"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10000 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10000"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10001 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10001"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10002 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10002"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10003 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10003"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10004 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10004"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10005 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10005"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10006 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10006"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10007 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10007"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10008 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10008"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10009 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10009"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10010 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10010"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10011 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10011"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10012 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10012"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10013 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10013"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10014 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10014"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10015 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10015"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10016 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10016"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10017 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10017"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10018 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10018"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10019 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10019"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10020 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10020"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10021 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10021"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10022 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10022"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10023 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10023"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10024 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10024"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10025 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10025"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10026 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10026"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10027 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10027"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10028 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10028"; + + public static final String ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10029 = "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10029"; + + public static final String ORG_ZSTACK_VPC_HA_VYOS_10000 = "ORG_ZSTACK_VPC_HA_VYOS_10000"; + + public static final String ORG_ZSTACK_ZBOX_10000 = "ORG_ZSTACK_ZBOX_10000"; + + public static final String ORG_ZSTACK_ZBOX_10001 = "ORG_ZSTACK_ZBOX_10001"; + + public static final String ORG_ZSTACK_ZBOX_10002 = "ORG_ZSTACK_ZBOX_10002"; + + public static final String ORG_ZSTACK_ZBOX_10003 = "ORG_ZSTACK_ZBOX_10003"; + + public static final String ORG_ZSTACK_ZBOX_10004 = "ORG_ZSTACK_ZBOX_10004"; + + public static final String ORG_ZSTACK_ZBOX_10005 = "ORG_ZSTACK_ZBOX_10005"; + + public static final String ORG_ZSTACK_ZBOX_10006 = "ORG_ZSTACK_ZBOX_10006"; + + public static final String ORG_ZSTACK_ZBOX_10007 = "ORG_ZSTACK_ZBOX_10007"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_LICENSE_SERVER_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_LICENSE_SERVER_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_LICENSE_SERVER_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_LICENSE_SERVER_10001"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_VPN_10000 = "ORG_ZSTACK_ALIYUN_NETWORK_VPN_10000"; + + public static final String ORG_ZSTACK_ZWATCH_10000 = "ORG_ZSTACK_ZWATCH_10000"; + + public static final String ORG_ZSTACK_ZWATCH_10001 = "ORG_ZSTACK_ZWATCH_10001"; + + public static final String ORG_ZSTACK_ZWATCH_10002 = "ORG_ZSTACK_ZWATCH_10002"; + + public static final String ORG_ZSTACK_ZWATCH_10003 = "ORG_ZSTACK_ZWATCH_10003"; + + public static final String ORG_ZSTACK_ZWATCH_10004 = "ORG_ZSTACK_ZWATCH_10004"; + + public static final String ORG_ZSTACK_SSO_SAML2_SERVICE_10000 = "ORG_ZSTACK_SSO_SAML2_SERVICE_10000"; + + public static final String ORG_ZSTACK_SSO_SAML2_SERVICE_10001 = "ORG_ZSTACK_SSO_SAML2_SERVICE_10001"; + + public static final String ORG_ZSTACK_ZWATCH_UTILS_10000 = "ORG_ZSTACK_ZWATCH_UTILS_10000"; + + public static final String ORG_ZSTACK_ZWATCH_UTILS_10001 = "ORG_ZSTACK_ZWATCH_UTILS_10001"; + + public static final String ORG_ZSTACK_ROUTEPROTOCOL_10000 = "ORG_ZSTACK_ROUTEPROTOCOL_10000"; + + public static final String ORG_ZSTACK_ROUTEPROTOCOL_10001 = "ORG_ZSTACK_ROUTEPROTOCOL_10001"; + + public static final String ORG_ZSTACK_ROUTEPROTOCOL_10002 = "ORG_ZSTACK_ROUTEPROTOCOL_10002"; + + public static final String ORG_ZSTACK_ROUTEPROTOCOL_10003 = "ORG_ZSTACK_ROUTEPROTOCOL_10003"; + + public static final String ORG_ZSTACK_ROUTEPROTOCOL_10004 = "ORG_ZSTACK_ROUTEPROTOCOL_10004"; + + public static final String ORG_ZSTACK_ROUTEPROTOCOL_10005 = "ORG_ZSTACK_ROUTEPROTOCOL_10005"; + + public static final String ORG_ZSTACK_ROUTEPROTOCOL_10006 = "ORG_ZSTACK_ROUTEPROTOCOL_10006"; + + public static final String ORG_ZSTACK_ROUTEPROTOCOL_10007 = "ORG_ZSTACK_ROUTEPROTOCOL_10007"; + + public static final String ORG_ZSTACK_ROUTEPROTOCOL_10008 = "ORG_ZSTACK_ROUTEPROTOCOL_10008"; + + public static final String ORG_ZSTACK_ROUTEPROTOCOL_10009 = "ORG_ZSTACK_ROUTEPROTOCOL_10009"; + + public static final String ORG_ZSTACK_ROUTEPROTOCOL_10010 = "ORG_ZSTACK_ROUTEPROTOCOL_10010"; + + public static final String ORG_ZSTACK_ROUTEPROTOCOL_10011 = "ORG_ZSTACK_ROUTEPROTOCOL_10011"; + + public static final String ORG_ZSTACK_ROUTEPROTOCOL_10012 = "ORG_ZSTACK_ROUTEPROTOCOL_10012"; + + public static final String ORG_ZSTACK_ROUTEPROTOCOL_10013 = "ORG_ZSTACK_ROUTEPROTOCOL_10013"; + + public static final String ORG_ZSTACK_ROUTEPROTOCOL_10014 = "ORG_ZSTACK_ROUTEPROTOCOL_10014"; + + public static final String ORG_ZSTACK_ROUTEPROTOCOL_10015 = "ORG_ZSTACK_ROUTEPROTOCOL_10015"; + + public static final String ORG_ZSTACK_ROUTEPROTOCOL_10016 = "ORG_ZSTACK_ROUTEPROTOCOL_10016"; + + public static final String ORG_ZSTACK_ROUTEPROTOCOL_10017 = "ORG_ZSTACK_ROUTEPROTOCOL_10017"; + + public static final String ORG_ZSTACK_VPC_10000 = "ORG_ZSTACK_VPC_10000"; + + public static final String ORG_ZSTACK_VPC_10001 = "ORG_ZSTACK_VPC_10001"; + + public static final String ORG_ZSTACK_VPC_10002 = "ORG_ZSTACK_VPC_10002"; + + public static final String ORG_ZSTACK_VPC_10003 = "ORG_ZSTACK_VPC_10003"; + + public static final String ORG_ZSTACK_VPC_10004 = "ORG_ZSTACK_VPC_10004"; + + public static final String ORG_ZSTACK_VPC_10005 = "ORG_ZSTACK_VPC_10005"; + + public static final String ORG_ZSTACK_VPC_10006 = "ORG_ZSTACK_VPC_10006"; + + public static final String ORG_ZSTACK_VPC_10007 = "ORG_ZSTACK_VPC_10007"; + + public static final String ORG_ZSTACK_VPC_10008 = "ORG_ZSTACK_VPC_10008"; + + public static final String ORG_ZSTACK_VPC_10009 = "ORG_ZSTACK_VPC_10009"; + + public static final String ORG_ZSTACK_VPC_10010 = "ORG_ZSTACK_VPC_10010"; + + public static final String ORG_ZSTACK_VPC_10011 = "ORG_ZSTACK_VPC_10011"; + + public static final String ORG_ZSTACK_VPC_10012 = "ORG_ZSTACK_VPC_10012"; + + public static final String ORG_ZSTACK_VPC_10013 = "ORG_ZSTACK_VPC_10013"; + + public static final String ORG_ZSTACK_VPC_10014 = "ORG_ZSTACK_VPC_10014"; + + public static final String ORG_ZSTACK_VPC_10015 = "ORG_ZSTACK_VPC_10015"; + + public static final String ORG_ZSTACK_VPC_10016 = "ORG_ZSTACK_VPC_10016"; + + public static final String ORG_ZSTACK_VPC_10017 = "ORG_ZSTACK_VPC_10017"; + + public static final String ORG_ZSTACK_VPC_10018 = "ORG_ZSTACK_VPC_10018"; + + public static final String ORG_ZSTACK_VPC_10019 = "ORG_ZSTACK_VPC_10019"; + + public static final String ORG_ZSTACK_VPC_10020 = "ORG_ZSTACK_VPC_10020"; + + public static final String ORG_ZSTACK_VPC_10021 = "ORG_ZSTACK_VPC_10021"; + + public static final String ORG_ZSTACK_VPC_10022 = "ORG_ZSTACK_VPC_10022"; + + public static final String ORG_ZSTACK_VPC_10023 = "ORG_ZSTACK_VPC_10023"; + + public static final String ORG_ZSTACK_VPC_10024 = "ORG_ZSTACK_VPC_10024"; + + public static final String ORG_ZSTACK_VPC_10025 = "ORG_ZSTACK_VPC_10025"; + + public static final String ORG_ZSTACK_VPC_10026 = "ORG_ZSTACK_VPC_10026"; + + public static final String ORG_ZSTACK_VPC_10027 = "ORG_ZSTACK_VPC_10027"; + + public static final String ORG_ZSTACK_VPC_10028 = "ORG_ZSTACK_VPC_10028"; + + public static final String ORG_ZSTACK_VPC_10029 = "ORG_ZSTACK_VPC_10029"; + + public static final String ORG_ZSTACK_VPC_10030 = "ORG_ZSTACK_VPC_10030"; + + public static final String ORG_ZSTACK_VPC_10031 = "ORG_ZSTACK_VPC_10031"; + + public static final String ORG_ZSTACK_VPC_10032 = "ORG_ZSTACK_VPC_10032"; + + public static final String ORG_ZSTACK_VPC_10033 = "ORG_ZSTACK_VPC_10033"; + + public static final String ORG_ZSTACK_VPC_10034 = "ORG_ZSTACK_VPC_10034"; + + public static final String ORG_ZSTACK_VPC_10035 = "ORG_ZSTACK_VPC_10035"; + + public static final String ORG_ZSTACK_VPC_10036 = "ORG_ZSTACK_VPC_10036"; + + public static final String ORG_ZSTACK_VPC_10037 = "ORG_ZSTACK_VPC_10037"; + + public static final String ORG_ZSTACK_VPC_10038 = "ORG_ZSTACK_VPC_10038"; + + public static final String ORG_ZSTACK_VPC_10039 = "ORG_ZSTACK_VPC_10039"; + + public static final String ORG_ZSTACK_VPC_10040 = "ORG_ZSTACK_VPC_10040"; + + public static final String ORG_ZSTACK_VPC_10041 = "ORG_ZSTACK_VPC_10041"; + + public static final String ORG_ZSTACK_VPC_10042 = "ORG_ZSTACK_VPC_10042"; + + public static final String ORG_ZSTACK_VPC_10043 = "ORG_ZSTACK_VPC_10043"; + + public static final String ORG_ZSTACK_VPC_10044 = "ORG_ZSTACK_VPC_10044"; + + public static final String ORG_ZSTACK_VPC_10045 = "ORG_ZSTACK_VPC_10045"; + + public static final String ORG_ZSTACK_VPC_10046 = "ORG_ZSTACK_VPC_10046"; + + public static final String ORG_ZSTACK_VPC_10047 = "ORG_ZSTACK_VPC_10047"; + + public static final String ORG_ZSTACK_VPC_10048 = "ORG_ZSTACK_VPC_10048"; + + public static final String ORG_ZSTACK_VPC_10049 = "ORG_ZSTACK_VPC_10049"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_CLOUDBUS_10000 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_CLOUDBUS_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_CLOUDBUS_10001 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_CLOUDBUS_10001"; + + public static final String ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10000 = "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10000"; + + public static final String ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10001 = "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10001"; + + public static final String ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10002 = "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10002"; + + public static final String ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10003 = "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10003"; + + public static final String ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10004 = "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10004"; + + public static final String ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10005 = "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10005"; + + public static final String ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10006 = "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10006"; + + public static final String ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10007 = "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10007"; + + public static final String ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10008 = "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10008"; + + public static final String ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10009 = "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10009"; + + public static final String ORG_ZSTACK_SSO_SAML2_10000 = "ORG_ZSTACK_SSO_SAML2_10000"; + + public static final String ORG_ZSTACK_SSO_SAML2_10001 = "ORG_ZSTACK_SSO_SAML2_10001"; + + public static final String ORG_ZSTACK_SSO_SAML2_10002 = "ORG_ZSTACK_SSO_SAML2_10002"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10000 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10000"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10001 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10001"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10002 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10002"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10003 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10003"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10004 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10004"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10005 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10005"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10006 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10006"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10007 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10007"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10008 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10008"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10009 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10009"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10010 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10010"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10011 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10011"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10012 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10012"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10013 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10013"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10014 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10014"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10015 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10015"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10016 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10016"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10017 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10017"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10018 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10018"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10019 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10019"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10020 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10020"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10021 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10021"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10022 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10022"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10023 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10023"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10024 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10024"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10025 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10025"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10026 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10026"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10027 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10027"; + + public static final String ORG_ZSTACK_SCHEDULER_VM_10000 = "ORG_ZSTACK_SCHEDULER_VM_10000"; + + public static final String ORG_ZSTACK_SCHEDULER_VM_10001 = "ORG_ZSTACK_SCHEDULER_VM_10001"; + + public static final String ORG_ZSTACK_SCHEDULER_VM_10002 = "ORG_ZSTACK_SCHEDULER_VM_10002"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10000 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10000"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10001 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10001"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10002 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10002"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10003 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10003"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10004 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10004"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10005 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10005"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10006 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10006"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10007 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10007"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10008 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10008"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10009 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10009"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10010 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10010"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10011 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10011"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10012 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10012"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10013 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10013"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10014 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10014"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10015 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10015"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10016 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10016"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10017 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10017"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10018 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10018"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10019 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10019"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10020 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10020"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10021 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10021"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10022 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10022"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10023 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10023"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10024 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10024"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10025 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10025"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10026 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10026"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10027 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10027"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10028 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10028"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10029 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10029"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10030 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10030"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10031 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10031"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10032 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10032"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10033 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10033"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10034 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10034"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_IDENTITYZONE_10000 = "ORG_ZSTACK_ALIYUN_CORE_IDENTITYZONE_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_KVM_VM_10000 = "ORG_ZSTACK_TEST_INTEGRATION_KVM_VM_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_KVM_VM_10001 = "ORG_ZSTACK_TEST_INTEGRATION_KVM_VM_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_KVM_VM_10002 = "ORG_ZSTACK_TEST_INTEGRATION_KVM_VM_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_KVM_VM_10003 = "ORG_ZSTACK_TEST_INTEGRATION_KVM_VM_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_KVM_VM_10004 = "ORG_ZSTACK_TEST_INTEGRATION_KVM_VM_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_KVM_VM_10005 = "ORG_ZSTACK_TEST_INTEGRATION_KVM_VM_10005"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_KVM_VM_10006 = "ORG_ZSTACK_TEST_INTEGRATION_KVM_VM_10006"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_KVM_VM_10007 = "ORG_ZSTACK_TEST_INTEGRATION_KVM_VM_10007"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_UNIVERSALSMS_10000 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_UNIVERSALSMS_10000"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_UNIVERSALSMS_10001 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_UNIVERSALSMS_10001"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_UNIVERSALSMS_10002 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_UNIVERSALSMS_10002"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10000 = "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10000"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10001 = "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10001"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10002 = "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10002"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10000 = "ORG_ZSTACK_ALIYUN_CORE_10000"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10001 = "ORG_ZSTACK_ALIYUN_CORE_10001"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10002 = "ORG_ZSTACK_ALIYUN_CORE_10002"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10003 = "ORG_ZSTACK_ALIYUN_CORE_10003"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10004 = "ORG_ZSTACK_ALIYUN_CORE_10004"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10005 = "ORG_ZSTACK_ALIYUN_CORE_10005"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10006 = "ORG_ZSTACK_ALIYUN_CORE_10006"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10007 = "ORG_ZSTACK_ALIYUN_CORE_10007"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10008 = "ORG_ZSTACK_ALIYUN_CORE_10008"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10009 = "ORG_ZSTACK_ALIYUN_CORE_10009"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10010 = "ORG_ZSTACK_ALIYUN_CORE_10010"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10011 = "ORG_ZSTACK_ALIYUN_CORE_10011"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10012 = "ORG_ZSTACK_ALIYUN_CORE_10012"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10013 = "ORG_ZSTACK_ALIYUN_CORE_10013"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10014 = "ORG_ZSTACK_ALIYUN_CORE_10014"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10015 = "ORG_ZSTACK_ALIYUN_CORE_10015"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10016 = "ORG_ZSTACK_ALIYUN_CORE_10016"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10017 = "ORG_ZSTACK_ALIYUN_CORE_10017"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10018 = "ORG_ZSTACK_ALIYUN_CORE_10018"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10019 = "ORG_ZSTACK_ALIYUN_CORE_10019"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10020 = "ORG_ZSTACK_ALIYUN_CORE_10020"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10021 = "ORG_ZSTACK_ALIYUN_CORE_10021"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10022 = "ORG_ZSTACK_ALIYUN_CORE_10022"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10023 = "ORG_ZSTACK_ALIYUN_CORE_10023"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10024 = "ORG_ZSTACK_ALIYUN_CORE_10024"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10025 = "ORG_ZSTACK_ALIYUN_CORE_10025"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10026 = "ORG_ZSTACK_ALIYUN_CORE_10026"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10027 = "ORG_ZSTACK_ALIYUN_CORE_10027"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10028 = "ORG_ZSTACK_ALIYUN_CORE_10028"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10029 = "ORG_ZSTACK_ALIYUN_CORE_10029"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10030 = "ORG_ZSTACK_ALIYUN_CORE_10030"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10031 = "ORG_ZSTACK_ALIYUN_CORE_10031"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10032 = "ORG_ZSTACK_ALIYUN_CORE_10032"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10033 = "ORG_ZSTACK_ALIYUN_CORE_10033"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10034 = "ORG_ZSTACK_ALIYUN_CORE_10034"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10035 = "ORG_ZSTACK_ALIYUN_CORE_10035"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10036 = "ORG_ZSTACK_ALIYUN_CORE_10036"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10037 = "ORG_ZSTACK_ALIYUN_CORE_10037"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10038 = "ORG_ZSTACK_ALIYUN_CORE_10038"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10039 = "ORG_ZSTACK_ALIYUN_CORE_10039"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10040 = "ORG_ZSTACK_ALIYUN_CORE_10040"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_10041 = "ORG_ZSTACK_ALIYUN_CORE_10041"; + + public static final String ORG_ZSTACK_CONFIGURATION_10000 = "ORG_ZSTACK_CONFIGURATION_10000"; + + public static final String ORG_ZSTACK_CONFIGURATION_10001 = "ORG_ZSTACK_CONFIGURATION_10001"; + + public static final String ORG_ZSTACK_CONFIGURATION_10002 = "ORG_ZSTACK_CONFIGURATION_10002"; + + public static final String ORG_ZSTACK_CONFIGURATION_10003 = "ORG_ZSTACK_CONFIGURATION_10003"; + + public static final String ORG_ZSTACK_CONFIGURATION_10004 = "ORG_ZSTACK_CONFIGURATION_10004"; + + public static final String ORG_ZSTACK_CONFIGURATION_10005 = "ORG_ZSTACK_CONFIGURATION_10005"; + + public static final String ORG_ZSTACK_CONFIGURATION_10006 = "ORG_ZSTACK_CONFIGURATION_10006"; + + public static final String ORG_ZSTACK_CONFIGURATION_10007 = "ORG_ZSTACK_CONFIGURATION_10007"; + + public static final String ORG_ZSTACK_CONFIGURATION_10008 = "ORG_ZSTACK_CONFIGURATION_10008"; + + public static final String ORG_ZSTACK_CONFIGURATION_10009 = "ORG_ZSTACK_CONFIGURATION_10009"; + + public static final String ORG_ZSTACK_CONFIGURATION_10010 = "ORG_ZSTACK_CONFIGURATION_10010"; + + public static final String ORG_ZSTACK_CONFIGURATION_10011 = "ORG_ZSTACK_CONFIGURATION_10011"; + + public static final String ORG_ZSTACK_CONFIGURATION_10012 = "ORG_ZSTACK_CONFIGURATION_10012"; + + public static final String ORG_ZSTACK_NETWORK_L3_10000 = "ORG_ZSTACK_NETWORK_L3_10000"; + + public static final String ORG_ZSTACK_NETWORK_L3_10001 = "ORG_ZSTACK_NETWORK_L3_10001"; + + public static final String ORG_ZSTACK_NETWORK_L3_10002 = "ORG_ZSTACK_NETWORK_L3_10002"; + + public static final String ORG_ZSTACK_NETWORK_L3_10003 = "ORG_ZSTACK_NETWORK_L3_10003"; + + public static final String ORG_ZSTACK_NETWORK_L3_10004 = "ORG_ZSTACK_NETWORK_L3_10004"; + + public static final String ORG_ZSTACK_NETWORK_L3_10005 = "ORG_ZSTACK_NETWORK_L3_10005"; + + public static final String ORG_ZSTACK_NETWORK_L3_10006 = "ORG_ZSTACK_NETWORK_L3_10006"; + + public static final String ORG_ZSTACK_NETWORK_L3_10007 = "ORG_ZSTACK_NETWORK_L3_10007"; + + public static final String ORG_ZSTACK_NETWORK_L3_10008 = "ORG_ZSTACK_NETWORK_L3_10008"; + + public static final String ORG_ZSTACK_NETWORK_L3_10009 = "ORG_ZSTACK_NETWORK_L3_10009"; + + public static final String ORG_ZSTACK_NETWORK_L3_10010 = "ORG_ZSTACK_NETWORK_L3_10010"; + + public static final String ORG_ZSTACK_NETWORK_L3_10011 = "ORG_ZSTACK_NETWORK_L3_10011"; + + public static final String ORG_ZSTACK_NETWORK_L3_10012 = "ORG_ZSTACK_NETWORK_L3_10012"; + + public static final String ORG_ZSTACK_NETWORK_L3_10013 = "ORG_ZSTACK_NETWORK_L3_10013"; + + public static final String ORG_ZSTACK_NETWORK_L3_10014 = "ORG_ZSTACK_NETWORK_L3_10014"; + + public static final String ORG_ZSTACK_NETWORK_L3_10015 = "ORG_ZSTACK_NETWORK_L3_10015"; + + public static final String ORG_ZSTACK_NETWORK_L3_10016 = "ORG_ZSTACK_NETWORK_L3_10016"; + + public static final String ORG_ZSTACK_NETWORK_L3_10017 = "ORG_ZSTACK_NETWORK_L3_10017"; + + public static final String ORG_ZSTACK_NETWORK_L3_10018 = "ORG_ZSTACK_NETWORK_L3_10018"; + + public static final String ORG_ZSTACK_NETWORK_L3_10019 = "ORG_ZSTACK_NETWORK_L3_10019"; + + public static final String ORG_ZSTACK_NETWORK_L3_10020 = "ORG_ZSTACK_NETWORK_L3_10020"; + + public static final String ORG_ZSTACK_NETWORK_L3_10021 = "ORG_ZSTACK_NETWORK_L3_10021"; + + public static final String ORG_ZSTACK_NETWORK_L3_10022 = "ORG_ZSTACK_NETWORK_L3_10022"; + + public static final String ORG_ZSTACK_NETWORK_L3_10023 = "ORG_ZSTACK_NETWORK_L3_10023"; + + public static final String ORG_ZSTACK_NETWORK_L3_10024 = "ORG_ZSTACK_NETWORK_L3_10024"; + + public static final String ORG_ZSTACK_NETWORK_L3_10025 = "ORG_ZSTACK_NETWORK_L3_10025"; + + public static final String ORG_ZSTACK_NETWORK_L3_10026 = "ORG_ZSTACK_NETWORK_L3_10026"; + + public static final String ORG_ZSTACK_NETWORK_L3_10027 = "ORG_ZSTACK_NETWORK_L3_10027"; + + public static final String ORG_ZSTACK_NETWORK_L3_10028 = "ORG_ZSTACK_NETWORK_L3_10028"; + + public static final String ORG_ZSTACK_NETWORK_L3_10029 = "ORG_ZSTACK_NETWORK_L3_10029"; + + public static final String ORG_ZSTACK_NETWORK_L3_10030 = "ORG_ZSTACK_NETWORK_L3_10030"; + + public static final String ORG_ZSTACK_NETWORK_L3_10031 = "ORG_ZSTACK_NETWORK_L3_10031"; + + public static final String ORG_ZSTACK_NETWORK_L3_10032 = "ORG_ZSTACK_NETWORK_L3_10032"; + + public static final String ORG_ZSTACK_NETWORK_L3_10033 = "ORG_ZSTACK_NETWORK_L3_10033"; + + public static final String ORG_ZSTACK_NETWORK_L3_10034 = "ORG_ZSTACK_NETWORK_L3_10034"; + + public static final String ORG_ZSTACK_NETWORK_L3_10035 = "ORG_ZSTACK_NETWORK_L3_10035"; + + public static final String ORG_ZSTACK_NETWORK_L3_10036 = "ORG_ZSTACK_NETWORK_L3_10036"; + + public static final String ORG_ZSTACK_NETWORK_L3_10037 = "ORG_ZSTACK_NETWORK_L3_10037"; + + public static final String ORG_ZSTACK_NETWORK_L3_10038 = "ORG_ZSTACK_NETWORK_L3_10038"; + + public static final String ORG_ZSTACK_NETWORK_L3_10039 = "ORG_ZSTACK_NETWORK_L3_10039"; + + public static final String ORG_ZSTACK_NETWORK_L3_10040 = "ORG_ZSTACK_NETWORK_L3_10040"; + + public static final String ORG_ZSTACK_NETWORK_L3_10041 = "ORG_ZSTACK_NETWORK_L3_10041"; + + public static final String ORG_ZSTACK_NETWORK_L3_10042 = "ORG_ZSTACK_NETWORK_L3_10042"; + + public static final String ORG_ZSTACK_NETWORK_L3_10043 = "ORG_ZSTACK_NETWORK_L3_10043"; + + public static final String ORG_ZSTACK_NETWORK_L3_10044 = "ORG_ZSTACK_NETWORK_L3_10044"; + + public static final String ORG_ZSTACK_NETWORK_L3_10045 = "ORG_ZSTACK_NETWORK_L3_10045"; + + public static final String ORG_ZSTACK_NETWORK_L3_10046 = "ORG_ZSTACK_NETWORK_L3_10046"; + + public static final String ORG_ZSTACK_NETWORK_L3_10047 = "ORG_ZSTACK_NETWORK_L3_10047"; + + public static final String ORG_ZSTACK_NETWORK_L3_10048 = "ORG_ZSTACK_NETWORK_L3_10048"; + + public static final String ORG_ZSTACK_NETWORK_L3_10049 = "ORG_ZSTACK_NETWORK_L3_10049"; + + public static final String ORG_ZSTACK_NETWORK_L3_10050 = "ORG_ZSTACK_NETWORK_L3_10050"; + + public static final String ORG_ZSTACK_NETWORK_L3_10051 = "ORG_ZSTACK_NETWORK_L3_10051"; + + public static final String ORG_ZSTACK_NETWORK_L3_10052 = "ORG_ZSTACK_NETWORK_L3_10052"; + + public static final String ORG_ZSTACK_NETWORK_L3_10053 = "ORG_ZSTACK_NETWORK_L3_10053"; + + public static final String ORG_ZSTACK_NETWORK_L3_10054 = "ORG_ZSTACK_NETWORK_L3_10054"; + + public static final String ORG_ZSTACK_NETWORK_L3_10055 = "ORG_ZSTACK_NETWORK_L3_10055"; + + public static final String ORG_ZSTACK_NETWORK_L3_10056 = "ORG_ZSTACK_NETWORK_L3_10056"; + + public static final String ORG_ZSTACK_NETWORK_L3_10057 = "ORG_ZSTACK_NETWORK_L3_10057"; + + public static final String ORG_ZSTACK_NETWORK_L3_10058 = "ORG_ZSTACK_NETWORK_L3_10058"; + + public static final String ORG_ZSTACK_NETWORK_L3_10059 = "ORG_ZSTACK_NETWORK_L3_10059"; + + public static final String ORG_ZSTACK_NETWORK_L3_10060 = "ORG_ZSTACK_NETWORK_L3_10060"; + + public static final String ORG_ZSTACK_NETWORK_L3_10061 = "ORG_ZSTACK_NETWORK_L3_10061"; + + public static final String ORG_ZSTACK_NETWORK_L3_10062 = "ORG_ZSTACK_NETWORK_L3_10062"; + + public static final String ORG_ZSTACK_NETWORK_L3_10063 = "ORG_ZSTACK_NETWORK_L3_10063"; + + public static final String ORG_ZSTACK_NETWORK_L3_10064 = "ORG_ZSTACK_NETWORK_L3_10064"; + + public static final String ORG_ZSTACK_NETWORK_L3_10065 = "ORG_ZSTACK_NETWORK_L3_10065"; + + public static final String ORG_ZSTACK_NETWORK_L3_10066 = "ORG_ZSTACK_NETWORK_L3_10066"; + + public static final String ORG_ZSTACK_NETWORK_L3_10067 = "ORG_ZSTACK_NETWORK_L3_10067"; + + public static final String ORG_ZSTACK_NETWORK_L3_10068 = "ORG_ZSTACK_NETWORK_L3_10068"; + + public static final String ORG_ZSTACK_NETWORK_L3_10069 = "ORG_ZSTACK_NETWORK_L3_10069"; + + public static final String ORG_ZSTACK_NETWORK_L3_10070 = "ORG_ZSTACK_NETWORK_L3_10070"; + + public static final String ORG_ZSTACK_NETWORK_L3_10071 = "ORG_ZSTACK_NETWORK_L3_10071"; + + public static final String ORG_ZSTACK_NETWORK_L3_10072 = "ORG_ZSTACK_NETWORK_L3_10072"; + + public static final String ORG_ZSTACK_NETWORK_L3_10073 = "ORG_ZSTACK_NETWORK_L3_10073"; + + public static final String ORG_ZSTACK_NETWORK_L3_10074 = "ORG_ZSTACK_NETWORK_L3_10074"; + + public static final String ORG_ZSTACK_NETWORK_L3_10075 = "ORG_ZSTACK_NETWORK_L3_10075"; + + public static final String ORG_ZSTACK_NETWORK_L3_10076 = "ORG_ZSTACK_NETWORK_L3_10076"; + + public static final String ORG_ZSTACK_NETWORK_L3_10077 = "ORG_ZSTACK_NETWORK_L3_10077"; + + public static final String ORG_ZSTACK_NETWORK_L3_10078 = "ORG_ZSTACK_NETWORK_L3_10078"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_SUPPLIER_EMAY_10000 = "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_SUPPLIER_EMAY_10000"; + + public static final String ORG_ZSTACK_CORE_VALIDATION_10000 = "ORG_ZSTACK_CORE_VALIDATION_10000"; + + public static final String ORG_ZSTACK_NETWORK_L2_10000 = "ORG_ZSTACK_NETWORK_L2_10000"; + + public static final String ORG_ZSTACK_NETWORK_L2_10001 = "ORG_ZSTACK_NETWORK_L2_10001"; + + public static final String ORG_ZSTACK_NETWORK_L2_10002 = "ORG_ZSTACK_NETWORK_L2_10002"; + + public static final String ORG_ZSTACK_NETWORK_L2_10003 = "ORG_ZSTACK_NETWORK_L2_10003"; + + public static final String ORG_ZSTACK_NETWORK_L2_10004 = "ORG_ZSTACK_NETWORK_L2_10004"; + + public static final String ORG_ZSTACK_NETWORK_L2_10005 = "ORG_ZSTACK_NETWORK_L2_10005"; + + public static final String ORG_ZSTACK_NETWORK_L2_10006 = "ORG_ZSTACK_NETWORK_L2_10006"; + + public static final String ORG_ZSTACK_NETWORK_L2_10007 = "ORG_ZSTACK_NETWORK_L2_10007"; + + public static final String ORG_ZSTACK_NETWORK_L2_10008 = "ORG_ZSTACK_NETWORK_L2_10008"; + + public static final String ORG_ZSTACK_NETWORK_L2_10009 = "ORG_ZSTACK_NETWORK_L2_10009"; + + public static final String ORG_ZSTACK_NETWORK_L2_10010 = "ORG_ZSTACK_NETWORK_L2_10010"; + + public static final String ORG_ZSTACK_NETWORK_L2_10011 = "ORG_ZSTACK_NETWORK_L2_10011"; + + public static final String ORG_ZSTACK_NETWORK_L2_10012 = "ORG_ZSTACK_NETWORK_L2_10012"; + + public static final String ORG_ZSTACK_NETWORK_L2_10013 = "ORG_ZSTACK_NETWORK_L2_10013"; + + public static final String ORG_ZSTACK_NETWORK_L2_10014 = "ORG_ZSTACK_NETWORK_L2_10014"; + + public static final String ORG_ZSTACK_NETWORK_L2_10015 = "ORG_ZSTACK_NETWORK_L2_10015"; + + public static final String ORG_ZSTACK_NETWORK_L2_10016 = "ORG_ZSTACK_NETWORK_L2_10016"; + + public static final String ORG_ZSTACK_NETWORK_L2_10017 = "ORG_ZSTACK_NETWORK_L2_10017"; + + public static final String ORG_ZSTACK_NETWORK_L2_10018 = "ORG_ZSTACK_NETWORK_L2_10018"; + + public static final String ORG_ZSTACK_NETWORK_L2_10019 = "ORG_ZSTACK_NETWORK_L2_10019"; + + public static final String ORG_ZSTACK_NETWORK_L2_10020 = "ORG_ZSTACK_NETWORK_L2_10020"; + + public static final String ORG_ZSTACK_CONSOLE_10000 = "ORG_ZSTACK_CONSOLE_10000"; + + public static final String ORG_ZSTACK_CONSOLE_10001 = "ORG_ZSTACK_CONSOLE_10001"; + + public static final String ORG_ZSTACK_CONSOLE_10002 = "ORG_ZSTACK_CONSOLE_10002"; + + public static final String ORG_ZSTACK_CONSOLE_10003 = "ORG_ZSTACK_CONSOLE_10003"; + + public static final String ORG_ZSTACK_CONSOLE_10004 = "ORG_ZSTACK_CONSOLE_10004"; + + public static final String ORG_ZSTACK_CONSOLE_10005 = "ORG_ZSTACK_CONSOLE_10005"; + + public static final String ORG_ZSTACK_CONSOLE_10006 = "ORG_ZSTACK_CONSOLE_10006"; + + public static final String ORG_ZSTACK_CONSOLE_10007 = "ORG_ZSTACK_CONSOLE_10007"; + + public static final String ORG_ZSTACK_CONSOLE_10008 = "ORG_ZSTACK_CONSOLE_10008"; + + public static final String ORG_ZSTACK_CONSOLE_10009 = "ORG_ZSTACK_CONSOLE_10009"; + + public static final String ORG_ZSTACK_CONSOLE_10010 = "ORG_ZSTACK_CONSOLE_10010"; + + public static final String ORG_ZSTACK_CONSOLE_10011 = "ORG_ZSTACK_CONSOLE_10011"; + + public static final String ORG_ZSTACK_CONSOLE_10012 = "ORG_ZSTACK_CONSOLE_10012"; + + public static final String ORG_ZSTACK_CONSOLE_10013 = "ORG_ZSTACK_CONSOLE_10013"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORK_10000 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORK_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_HEADER_NFVINSTGROUP_10000 = "ORG_ZSTACK_NETWORK_SERVICE_HEADER_NFVINSTGROUP_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10000 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10001 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10002 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10003 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10003"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10004 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10004"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10005 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10005"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10006 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10006"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10007 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10007"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10008 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10008"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10009 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10009"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10010 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10010"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10011 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10011"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10012 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10012"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10013 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10013"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10014 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10014"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10015 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10015"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10016 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10016"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10017 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10017"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10018 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10018"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10019 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10019"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10020 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10020"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10021 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10021"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10022 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10022"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10023 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10023"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10024 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10024"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10025 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10025"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10026 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10026"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10027 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10027"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10028 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10028"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10029 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10029"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10030 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10030"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10031 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10031"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10032 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10032"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10033 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10033"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10034 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10034"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10035 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10035"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10036 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10036"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10037 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10037"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10038 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10038"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10039 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10039"; + + public static final String ORG_ZSTACK_MONITORING_10000 = "ORG_ZSTACK_MONITORING_10000"; + + public static final String ORG_ZSTACK_MONITORING_10001 = "ORG_ZSTACK_MONITORING_10001"; + + public static final String ORG_ZSTACK_MONITORING_10002 = "ORG_ZSTACK_MONITORING_10002"; + + public static final String ORG_ZSTACK_MONITORING_10003 = "ORG_ZSTACK_MONITORING_10003"; + + public static final String ORG_ZSTACK_MONITORING_10004 = "ORG_ZSTACK_MONITORING_10004"; + + public static final String ORG_ZSTACK_MONITORING_10005 = "ORG_ZSTACK_MONITORING_10005"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10000 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10000"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10001 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10001"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10002 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10002"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10003 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10003"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10004 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10004"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10005 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10005"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10006 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10006"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10007 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10007"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10008 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10008"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10009 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10009"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10010 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10010"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10011 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10011"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10012 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10012"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10013 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10013"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10014 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10014"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10015 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10015"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10016 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10016"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10017 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10017"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10018 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10018"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10019 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10019"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10020 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10020"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10021 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10021"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10022 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10022"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10023 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10023"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10024 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10024"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10025 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10025"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10026 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10026"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10027 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10027"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10028 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10028"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10029 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10029"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10030 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10030"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10031 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10031"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10032 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10032"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10033 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10033"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10034 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10034"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10035 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10035"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10036 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10036"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10037 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10037"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10038 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10038"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10039 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10039"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10040 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10040"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10041 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10041"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10042 = "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10042"; + + public static final String ORG_ZSTACK_TICKET_API_10000 = "ORG_ZSTACK_TICKET_API_10000"; + + public static final String ORG_ZSTACK_TICKET_API_10001 = "ORG_ZSTACK_TICKET_API_10001"; + + public static final String ORG_ZSTACK_TICKET_API_10002 = "ORG_ZSTACK_TICKET_API_10002"; + + public static final String ORG_ZSTACK_TICKET_API_10003 = "ORG_ZSTACK_TICKET_API_10003"; + + public static final String ORG_ZSTACK_TICKET_API_10004 = "ORG_ZSTACK_TICKET_API_10004"; + + public static final String ORG_ZSTACK_TICKET_API_10005 = "ORG_ZSTACK_TICKET_API_10005"; + + public static final String ORG_ZSTACK_TICKET_API_10006 = "ORG_ZSTACK_TICKET_API_10006"; + + public static final String ORG_ZSTACK_TICKET_API_10007 = "ORG_ZSTACK_TICKET_API_10007"; + + public static final String ORG_ZSTACK_TICKET_API_10008 = "ORG_ZSTACK_TICKET_API_10008"; + + public static final String ORG_ZSTACK_TICKET_API_10009 = "ORG_ZSTACK_TICKET_API_10009"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_10000 = "ORG_ZSTACK_IAM2_ATTRIBUTE_10000"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10000 = "ORG_ZSTACK_STORAGE_CBT_10000"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10001 = "ORG_ZSTACK_STORAGE_CBT_10001"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10002 = "ORG_ZSTACK_STORAGE_CBT_10002"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10003 = "ORG_ZSTACK_STORAGE_CBT_10003"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10004 = "ORG_ZSTACK_STORAGE_CBT_10004"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10005 = "ORG_ZSTACK_STORAGE_CBT_10005"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10006 = "ORG_ZSTACK_STORAGE_CBT_10006"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10007 = "ORG_ZSTACK_STORAGE_CBT_10007"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10008 = "ORG_ZSTACK_STORAGE_CBT_10008"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10009 = "ORG_ZSTACK_STORAGE_CBT_10009"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10010 = "ORG_ZSTACK_STORAGE_CBT_10010"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10011 = "ORG_ZSTACK_STORAGE_CBT_10011"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10012 = "ORG_ZSTACK_STORAGE_CBT_10012"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10013 = "ORG_ZSTACK_STORAGE_CBT_10013"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10014 = "ORG_ZSTACK_STORAGE_CBT_10014"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10015 = "ORG_ZSTACK_STORAGE_CBT_10015"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10016 = "ORG_ZSTACK_STORAGE_CBT_10016"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10017 = "ORG_ZSTACK_STORAGE_CBT_10017"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10018 = "ORG_ZSTACK_STORAGE_CBT_10018"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10019 = "ORG_ZSTACK_STORAGE_CBT_10019"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10020 = "ORG_ZSTACK_STORAGE_CBT_10020"; + + public static final String ORG_ZSTACK_STORAGE_CBT_10021 = "ORG_ZSTACK_STORAGE_CBT_10021"; + + public static final String ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10000 = "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10000"; + + public static final String ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10001 = "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10001"; + + public static final String ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10002 = "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10002"; + + public static final String ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10003 = "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10003"; + + public static final String ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10004 = "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10004"; + + public static final String ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10005 = "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10005"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10000 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10000"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10001 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10001"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10002 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10002"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10003 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10003"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10004 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10004"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10005 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10005"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10006 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10006"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10007 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10007"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10008 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10008"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10009 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10009"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10010 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10010"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10011 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10011"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10012 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10012"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10013 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10013"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10014 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10014"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10015 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10015"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10016 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10016"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10017 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10017"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10018 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10018"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10019 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10019"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10020 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10020"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10021 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10021"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10022 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10022"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10023 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10023"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10024 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10024"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10025 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10025"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10026 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10026"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10027 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10027"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10028 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10028"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_10029 = "ORG_ZSTACK_STORAGE_SNAPSHOT_10029"; + + public static final String ORG_ZSTACK_ZWATCH_NAMESPACE_10000 = "ORG_ZSTACK_ZWATCH_NAMESPACE_10000"; + + public static final String ORG_ZSTACK_ZWATCH_NAMESPACE_10001 = "ORG_ZSTACK_ZWATCH_NAMESPACE_10001"; + + public static final String ORG_ZSTACK_ZWATCH_NAMESPACE_10002 = "ORG_ZSTACK_ZWATCH_NAMESPACE_10002"; + + public static final String ORG_ZSTACK_USBDEVICE_10000 = "ORG_ZSTACK_USBDEVICE_10000"; + + public static final String ORG_ZSTACK_USBDEVICE_10001 = "ORG_ZSTACK_USBDEVICE_10001"; + + public static final String ORG_ZSTACK_USBDEVICE_10002 = "ORG_ZSTACK_USBDEVICE_10002"; + + public static final String ORG_ZSTACK_USBDEVICE_10003 = "ORG_ZSTACK_USBDEVICE_10003"; + + public static final String ORG_ZSTACK_USBDEVICE_10004 = "ORG_ZSTACK_USBDEVICE_10004"; + + public static final String ORG_ZSTACK_USBDEVICE_10005 = "ORG_ZSTACK_USBDEVICE_10005"; + + public static final String ORG_ZSTACK_USBDEVICE_10006 = "ORG_ZSTACK_USBDEVICE_10006"; + + public static final String ORG_ZSTACK_USBDEVICE_10007 = "ORG_ZSTACK_USBDEVICE_10007"; + + public static final String ORG_ZSTACK_USBDEVICE_10008 = "ORG_ZSTACK_USBDEVICE_10008"; + + public static final String ORG_ZSTACK_USBDEVICE_10009 = "ORG_ZSTACK_USBDEVICE_10009"; + + public static final String ORG_ZSTACK_USBDEVICE_10010 = "ORG_ZSTACK_USBDEVICE_10010"; + + public static final String ORG_ZSTACK_USBDEVICE_10011 = "ORG_ZSTACK_USBDEVICE_10011"; + + public static final String ORG_ZSTACK_USBDEVICE_10012 = "ORG_ZSTACK_USBDEVICE_10012"; + + public static final String ORG_ZSTACK_USBDEVICE_10013 = "ORG_ZSTACK_USBDEVICE_10013"; + + public static final String ORG_ZSTACK_USBDEVICE_10014 = "ORG_ZSTACK_USBDEVICE_10014"; + + public static final String ORG_ZSTACK_USBDEVICE_10015 = "ORG_ZSTACK_USBDEVICE_10015"; + + public static final String ORG_ZSTACK_USBDEVICE_10016 = "ORG_ZSTACK_USBDEVICE_10016"; + + public static final String ORG_ZSTACK_USBDEVICE_10017 = "ORG_ZSTACK_USBDEVICE_10017"; + + public static final String ORG_ZSTACK_USBDEVICE_10018 = "ORG_ZSTACK_USBDEVICE_10018"; + + public static final String ORG_ZSTACK_USBDEVICE_10019 = "ORG_ZSTACK_USBDEVICE_10019"; + + public static final String ORG_ZSTACK_USBDEVICE_10020 = "ORG_ZSTACK_USBDEVICE_10020"; + + public static final String ORG_ZSTACK_USBDEVICE_10021 = "ORG_ZSTACK_USBDEVICE_10021"; + + public static final String ORG_ZSTACK_USBDEVICE_10022 = "ORG_ZSTACK_USBDEVICE_10022"; + + public static final String ORG_ZSTACK_USBDEVICE_10023 = "ORG_ZSTACK_USBDEVICE_10023"; + + public static final String ORG_ZSTACK_USBDEVICE_10024 = "ORG_ZSTACK_USBDEVICE_10024"; + + public static final String ORG_ZSTACK_USBDEVICE_10025 = "ORG_ZSTACK_USBDEVICE_10025"; + + public static final String ORG_ZSTACK_USBDEVICE_10026 = "ORG_ZSTACK_USBDEVICE_10026"; + + public static final String ORG_ZSTACK_NAS_10000 = "ORG_ZSTACK_NAS_10000"; + + public static final String ORG_ZSTACK_NAS_10001 = "ORG_ZSTACK_NAS_10001"; + + public static final String ORG_ZSTACK_NAS_10002 = "ORG_ZSTACK_NAS_10002"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10000 = "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10000"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10001 = "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10001"; + + public static final String ORG_ZSTACK_BILLING_10000 = "ORG_ZSTACK_BILLING_10000"; + + public static final String ORG_ZSTACK_BILLING_10001 = "ORG_ZSTACK_BILLING_10001"; + + public static final String ORG_ZSTACK_BILLING_10002 = "ORG_ZSTACK_BILLING_10002"; + + public static final String ORG_ZSTACK_BILLING_10003 = "ORG_ZSTACK_BILLING_10003"; + + public static final String ORG_ZSTACK_BILLING_10004 = "ORG_ZSTACK_BILLING_10004"; + + public static final String ORG_ZSTACK_BILLING_10005 = "ORG_ZSTACK_BILLING_10005"; + + public static final String ORG_ZSTACK_BILLING_10006 = "ORG_ZSTACK_BILLING_10006"; + + public static final String ORG_ZSTACK_BILLING_10007 = "ORG_ZSTACK_BILLING_10007"; + + public static final String ORG_ZSTACK_BILLING_10008 = "ORG_ZSTACK_BILLING_10008"; + + public static final String ORG_ZSTACK_BILLING_10009 = "ORG_ZSTACK_BILLING_10009"; + + public static final String ORG_ZSTACK_BILLING_10010 = "ORG_ZSTACK_BILLING_10010"; + + public static final String ORG_ZSTACK_BILLING_10011 = "ORG_ZSTACK_BILLING_10011"; + + public static final String ORG_ZSTACK_BILLING_10012 = "ORG_ZSTACK_BILLING_10012"; + + public static final String ORG_ZSTACK_BILLING_10013 = "ORG_ZSTACK_BILLING_10013"; + + public static final String ORG_ZSTACK_BILLING_10014 = "ORG_ZSTACK_BILLING_10014"; + + public static final String ORG_ZSTACK_BILLING_10015 = "ORG_ZSTACK_BILLING_10015"; + + public static final String ORG_ZSTACK_BILLING_10016 = "ORG_ZSTACK_BILLING_10016"; + + public static final String ORG_ZSTACK_BILLING_10017 = "ORG_ZSTACK_BILLING_10017"; + + public static final String ORG_ZSTACK_BILLING_10018 = "ORG_ZSTACK_BILLING_10018"; + + public static final String ORG_ZSTACK_BILLING_10019 = "ORG_ZSTACK_BILLING_10019"; + + public static final String ORG_ZSTACK_BILLING_10020 = "ORG_ZSTACK_BILLING_10020"; + + public static final String ORG_ZSTACK_BILLING_10021 = "ORG_ZSTACK_BILLING_10021"; + + public static final String ORG_ZSTACK_BILLING_10022 = "ORG_ZSTACK_BILLING_10022"; + + public static final String ORG_ZSTACK_BILLING_10023 = "ORG_ZSTACK_BILLING_10023"; + + public static final String ORG_ZSTACK_BILLING_10024 = "ORG_ZSTACK_BILLING_10024"; + + public static final String ORG_ZSTACK_BILLING_10025 = "ORG_ZSTACK_BILLING_10025"; + + public static final String ORG_ZSTACK_BILLING_10026 = "ORG_ZSTACK_BILLING_10026"; + + public static final String ORG_ZSTACK_BILLING_10027 = "ORG_ZSTACK_BILLING_10027"; + + public static final String ORG_ZSTACK_CRYPTO_CCS_10000 = "ORG_ZSTACK_CRYPTO_CCS_10000"; + + public static final String ORG_ZSTACK_CRYPTO_CCS_10001 = "ORG_ZSTACK_CRYPTO_CCS_10001"; + + public static final String ORG_ZSTACK_CRYPTO_CCS_10002 = "ORG_ZSTACK_CRYPTO_CCS_10002"; + + public static final String ORG_ZSTACK_CRYPTO_CCS_10003 = "ORG_ZSTACK_CRYPTO_CCS_10003"; + + public static final String ORG_ZSTACK_CRYPTO_CCS_10004 = "ORG_ZSTACK_CRYPTO_CCS_10004"; + + public static final String ORG_ZSTACK_CRYPTO_CCS_10005 = "ORG_ZSTACK_CRYPTO_CCS_10005"; + + public static final String ORG_ZSTACK_CRYPTO_CCS_10006 = "ORG_ZSTACK_CRYPTO_CCS_10006"; + + public static final String ORG_ZSTACK_CRYPTO_CCS_10007 = "ORG_ZSTACK_CRYPTO_CCS_10007"; + + public static final String ORG_ZSTACK_CRYPTO_CCS_10008 = "ORG_ZSTACK_CRYPTO_CCS_10008"; + + public static final String ORG_ZSTACK_CRYPTO_CCS_10009 = "ORG_ZSTACK_CRYPTO_CCS_10009"; + + public static final String ORG_ZSTACK_CRYPTO_CCS_10010 = "ORG_ZSTACK_CRYPTO_CCS_10010"; + + public static final String ORG_ZSTACK_CRYPTO_CCS_10011 = "ORG_ZSTACK_CRYPTO_CCS_10011"; + + public static final String ORG_ZSTACK_CRYPTO_CCS_10012 = "ORG_ZSTACK_CRYPTO_CCS_10012"; + + public static final String ORG_ZSTACK_CRYPTO_CCS_10013 = "ORG_ZSTACK_CRYPTO_CCS_10013"; + + public static final String ORG_ZSTACK_CRYPTO_CCS_10014 = "ORG_ZSTACK_CRYPTO_CCS_10014"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10000 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10000"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10001 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10001"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10002 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10002"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10003 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10003"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10004 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10004"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10005 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10005"; + + public static final String ORG_ZSTACK_LICENSE_CUBE_10000 = "ORG_ZSTACK_LICENSE_CUBE_10000"; + + public static final String ORG_ZSTACK_LICENSE_CUBE_10001 = "ORG_ZSTACK_LICENSE_CUBE_10001"; + + public static final String ORG_ZSTACK_LICENSE_CUBE_10002 = "ORG_ZSTACK_LICENSE_CUBE_10002"; + + public static final String ORG_ZSTACK_LICENSE_CUBE_10003 = "ORG_ZSTACK_LICENSE_CUBE_10003"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10000 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10000"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10001 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10001"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10002 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10002"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10003 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10003"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10004 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10004"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10005 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10005"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10006 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10006"; + + public static final String ORG_ZSTACK_HYBRID_BACKUP_10000 = "ORG_ZSTACK_HYBRID_BACKUP_10000"; + + public static final String ORG_ZSTACK_ALIYUN_IDENTITYZONE_10000 = "ORG_ZSTACK_ALIYUN_IDENTITYZONE_10000"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10000 = "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10000"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10001 = "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10001"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10002 = "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10002"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10003 = "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10003"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10004 = "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10004"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10005 = "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10005"; + + public static final String ORG_ZSTACK_CORE_10000 = "ORG_ZSTACK_CORE_10000"; + + public static final String ORG_ZSTACK_CORE_10001 = "ORG_ZSTACK_CORE_10001"; + + public static final String ORG_ZSTACK_VMWARE_CASCADE_10000 = "ORG_ZSTACK_VMWARE_CASCADE_10000"; + + public static final String ORG_ZSTACK_VMWARE_CASCADE_10001 = "ORG_ZSTACK_VMWARE_CASCADE_10001"; + + public static final String ORG_ZSTACK_VMWARE_CASCADE_10002 = "ORG_ZSTACK_VMWARE_CASCADE_10002"; + + public static final String ORG_ZSTACK_VMWARE_CASCADE_10003 = "ORG_ZSTACK_VMWARE_CASCADE_10003"; + + public static final String ORG_ZSTACK_VMWARE_CASCADE_10004 = "ORG_ZSTACK_VMWARE_CASCADE_10004"; + + public static final String ORG_ZSTACK_VMWARE_CASCADE_10005 = "ORG_ZSTACK_VMWARE_CASCADE_10005"; + + public static final String ORG_ZSTACK_LOGIN_PLUGIN_10000 = "ORG_ZSTACK_LOGIN_PLUGIN_10000"; + + public static final String ORG_ZSTACK_LOGIN_PLUGIN_10001 = "ORG_ZSTACK_LOGIN_PLUGIN_10001"; + + public static final String ORG_ZSTACK_LOGIN_PLUGIN_10002 = "ORG_ZSTACK_LOGIN_PLUGIN_10002"; + + public static final String ORG_ZSTACK_STORAGE_ADDON_BACKUP_10000 = "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10000"; + + public static final String ORG_ZSTACK_STORAGE_ADDON_BACKUP_10001 = "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10001"; + + public static final String ORG_ZSTACK_STORAGE_ADDON_BACKUP_10002 = "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10002"; + + public static final String ORG_ZSTACK_STORAGE_ADDON_BACKUP_10003 = "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10003"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10000 = "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10000"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10001 = "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10001"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10002 = "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10002"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10003 = "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10003"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10004 = "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10004"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10005 = "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10005"; + + public static final String ORG_ZSTACK_MULTICAST_ROUTER_BACKEND_10000 = "ORG_ZSTACK_MULTICAST_ROUTER_BACKEND_10000"; + + public static final String ORG_ZSTACK_LDAP_10000 = "ORG_ZSTACK_LDAP_10000"; + + public static final String ORG_ZSTACK_LDAP_10001 = "ORG_ZSTACK_LDAP_10001"; + + public static final String ORG_ZSTACK_LDAP_10002 = "ORG_ZSTACK_LDAP_10002"; + + public static final String ORG_ZSTACK_LDAP_10003 = "ORG_ZSTACK_LDAP_10003"; + + public static final String ORG_ZSTACK_LDAP_10004 = "ORG_ZSTACK_LDAP_10004"; + + public static final String ORG_ZSTACK_LDAP_10005 = "ORG_ZSTACK_LDAP_10005"; + + public static final String ORG_ZSTACK_LDAP_10006 = "ORG_ZSTACK_LDAP_10006"; + + public static final String ORG_ZSTACK_LDAP_10007 = "ORG_ZSTACK_LDAP_10007"; + + public static final String ORG_ZSTACK_LDAP_10008 = "ORG_ZSTACK_LDAP_10008"; + + public static final String ORG_ZSTACK_LDAP_10009 = "ORG_ZSTACK_LDAP_10009"; + + public static final String ORG_ZSTACK_LDAP_10010 = "ORG_ZSTACK_LDAP_10010"; + + public static final String ORG_ZSTACK_LDAP_10011 = "ORG_ZSTACK_LDAP_10011"; + + public static final String ORG_ZSTACK_LDAP_10012 = "ORG_ZSTACK_LDAP_10012"; + + public static final String ORG_ZSTACK_LDAP_10013 = "ORG_ZSTACK_LDAP_10013"; + + public static final String ORG_ZSTACK_LDAP_10014 = "ORG_ZSTACK_LDAP_10014"; + + public static final String ORG_ZSTACK_LDAP_10015 = "ORG_ZSTACK_LDAP_10015"; + + public static final String ORG_ZSTACK_LDAP_10016 = "ORG_ZSTACK_LDAP_10016"; + + public static final String ORG_ZSTACK_LDAP_10017 = "ORG_ZSTACK_LDAP_10017"; + + public static final String ORG_ZSTACK_LDAP_10018 = "ORG_ZSTACK_LDAP_10018"; + + public static final String ORG_ZSTACK_LDAP_10019 = "ORG_ZSTACK_LDAP_10019"; + + public static final String ORG_ZSTACK_IMAGE_10000 = "ORG_ZSTACK_IMAGE_10000"; + + public static final String ORG_ZSTACK_IMAGE_10001 = "ORG_ZSTACK_IMAGE_10001"; + + public static final String ORG_ZSTACK_IMAGE_10002 = "ORG_ZSTACK_IMAGE_10002"; + + public static final String ORG_ZSTACK_IMAGE_10003 = "ORG_ZSTACK_IMAGE_10003"; + + public static final String ORG_ZSTACK_IMAGE_10004 = "ORG_ZSTACK_IMAGE_10004"; + + public static final String ORG_ZSTACK_IMAGE_10005 = "ORG_ZSTACK_IMAGE_10005"; + + public static final String ORG_ZSTACK_IMAGE_10006 = "ORG_ZSTACK_IMAGE_10006"; + + public static final String ORG_ZSTACK_IMAGE_10007 = "ORG_ZSTACK_IMAGE_10007"; + + public static final String ORG_ZSTACK_IMAGE_10008 = "ORG_ZSTACK_IMAGE_10008"; + + public static final String ORG_ZSTACK_IMAGE_10009 = "ORG_ZSTACK_IMAGE_10009"; + + public static final String ORG_ZSTACK_IMAGE_10010 = "ORG_ZSTACK_IMAGE_10010"; + + public static final String ORG_ZSTACK_IMAGE_10011 = "ORG_ZSTACK_IMAGE_10011"; + + public static final String ORG_ZSTACK_IMAGE_10012 = "ORG_ZSTACK_IMAGE_10012"; + + public static final String ORG_ZSTACK_IMAGE_10013 = "ORG_ZSTACK_IMAGE_10013"; + + public static final String ORG_ZSTACK_IMAGE_10014 = "ORG_ZSTACK_IMAGE_10014"; + + public static final String ORG_ZSTACK_IMAGE_10015 = "ORG_ZSTACK_IMAGE_10015"; + + public static final String ORG_ZSTACK_IMAGE_10016 = "ORG_ZSTACK_IMAGE_10016"; + + public static final String ORG_ZSTACK_IMAGE_10017 = "ORG_ZSTACK_IMAGE_10017"; + + public static final String ORG_ZSTACK_IMAGE_10018 = "ORG_ZSTACK_IMAGE_10018"; + + public static final String ORG_ZSTACK_IMAGE_10019 = "ORG_ZSTACK_IMAGE_10019"; + + public static final String ORG_ZSTACK_IMAGE_10020 = "ORG_ZSTACK_IMAGE_10020"; + + public static final String ORG_ZSTACK_IMAGE_10021 = "ORG_ZSTACK_IMAGE_10021"; + + public static final String ORG_ZSTACK_IMAGE_10022 = "ORG_ZSTACK_IMAGE_10022"; + + public static final String ORG_ZSTACK_IMAGE_10023 = "ORG_ZSTACK_IMAGE_10023"; + + public static final String ORG_ZSTACK_IMAGE_10024 = "ORG_ZSTACK_IMAGE_10024"; + + public static final String ORG_ZSTACK_IMAGE_10025 = "ORG_ZSTACK_IMAGE_10025"; + + public static final String ORG_ZSTACK_IMAGE_10026 = "ORG_ZSTACK_IMAGE_10026"; + + public static final String ORG_ZSTACK_IMAGE_10027 = "ORG_ZSTACK_IMAGE_10027"; + + public static final String ORG_ZSTACK_IMAGE_10028 = "ORG_ZSTACK_IMAGE_10028"; + + public static final String ORG_ZSTACK_IMAGE_10029 = "ORG_ZSTACK_IMAGE_10029"; + + public static final String ORG_ZSTACK_IMAGE_10030 = "ORG_ZSTACK_IMAGE_10030"; + + public static final String ORG_ZSTACK_IMAGE_10031 = "ORG_ZSTACK_IMAGE_10031"; + + public static final String ORG_ZSTACK_IMAGE_10032 = "ORG_ZSTACK_IMAGE_10032"; + + public static final String ORG_ZSTACK_IMAGE_10033 = "ORG_ZSTACK_IMAGE_10033"; + + public static final String ORG_ZSTACK_IMAGE_10034 = "ORG_ZSTACK_IMAGE_10034"; + + public static final String ORG_ZSTACK_IMAGE_10035 = "ORG_ZSTACK_IMAGE_10035"; + + public static final String ORG_ZSTACK_IMAGE_10036 = "ORG_ZSTACK_IMAGE_10036"; + + public static final String ORG_ZSTACK_IMAGE_10037 = "ORG_ZSTACK_IMAGE_10037"; + + public static final String ORG_ZSTACK_IMAGE_10038 = "ORG_ZSTACK_IMAGE_10038"; + + public static final String ORG_ZSTACK_IMAGE_10039 = "ORG_ZSTACK_IMAGE_10039"; + + public static final String ORG_ZSTACK_IMAGE_10040 = "ORG_ZSTACK_IMAGE_10040"; + + public static final String ORG_ZSTACK_IMAGE_10041 = "ORG_ZSTACK_IMAGE_10041"; + + public static final String ORG_ZSTACK_IMAGE_10042 = "ORG_ZSTACK_IMAGE_10042"; + + public static final String ORG_ZSTACK_IMAGE_10043 = "ORG_ZSTACK_IMAGE_10043"; + + public static final String ORG_ZSTACK_IMAGE_10044 = "ORG_ZSTACK_IMAGE_10044"; + + public static final String ORG_ZSTACK_IMAGE_10045 = "ORG_ZSTACK_IMAGE_10045"; + + public static final String ORG_ZSTACK_IMAGE_10046 = "ORG_ZSTACK_IMAGE_10046"; + + public static final String ORG_ZSTACK_IMAGE_10047 = "ORG_ZSTACK_IMAGE_10047"; + + public static final String ORG_ZSTACK_QUERY_10000 = "ORG_ZSTACK_QUERY_10000"; + + public static final String ORG_ZSTACK_QUERY_10001 = "ORG_ZSTACK_QUERY_10001"; + + public static final String ORG_ZSTACK_QUERY_10002 = "ORG_ZSTACK_QUERY_10002"; + + public static final String ORG_ZSTACK_QUERY_10003 = "ORG_ZSTACK_QUERY_10003"; + + public static final String ORG_ZSTACK_QUERY_10004 = "ORG_ZSTACK_QUERY_10004"; + + public static final String ORG_ZSTACK_QUERY_10005 = "ORG_ZSTACK_QUERY_10005"; + + public static final String ORG_ZSTACK_QUERY_10006 = "ORG_ZSTACK_QUERY_10006"; + + public static final String ORG_ZSTACK_QUERY_10007 = "ORG_ZSTACK_QUERY_10007"; + + public static final String ORG_ZSTACK_QUERY_10008 = "ORG_ZSTACK_QUERY_10008"; + + public static final String ORG_ZSTACK_QUERY_10009 = "ORG_ZSTACK_QUERY_10009"; + + public static final String ORG_ZSTACK_QUERY_10010 = "ORG_ZSTACK_QUERY_10010"; + + public static final String ORG_ZSTACK_QUERY_10011 = "ORG_ZSTACK_QUERY_10011"; + + public static final String ORG_ZSTACK_QUERY_10012 = "ORG_ZSTACK_QUERY_10012"; + + public static final String ORG_ZSTACK_QUERY_10013 = "ORG_ZSTACK_QUERY_10013"; + + public static final String ORG_ZSTACK_QUERY_10014 = "ORG_ZSTACK_QUERY_10014"; + + public static final String ORG_ZSTACK_QUERY_10015 = "ORG_ZSTACK_QUERY_10015"; + + public static final String ORG_ZSTACK_QUERY_10016 = "ORG_ZSTACK_QUERY_10016"; + + public static final String ORG_ZSTACK_QUERY_10017 = "ORG_ZSTACK_QUERY_10017"; + + public static final String ORG_ZSTACK_QUERY_10018 = "ORG_ZSTACK_QUERY_10018"; + + public static final String ORG_ZSTACK_QUERY_10019 = "ORG_ZSTACK_QUERY_10019"; + + public static final String ORG_ZSTACK_QUERY_10020 = "ORG_ZSTACK_QUERY_10020"; + + public static final String ORG_ZSTACK_QUERY_10021 = "ORG_ZSTACK_QUERY_10021"; + + public static final String ORG_ZSTACK_ALIYUN_IMAGE_10000 = "ORG_ZSTACK_ALIYUN_IMAGE_10000"; + + public static final String ORG_ZSTACK_ALIYUN_IMAGE_10001 = "ORG_ZSTACK_ALIYUN_IMAGE_10001"; + + public static final String ORG_ZSTACK_ALIYUN_IMAGE_10002 = "ORG_ZSTACK_ALIYUN_IMAGE_10002"; + + public static final String ORG_ZSTACK_ALIYUN_IMAGE_10003 = "ORG_ZSTACK_ALIYUN_IMAGE_10003"; + + public static final String ORG_ZSTACK_ALIYUN_IMAGE_10004 = "ORG_ZSTACK_ALIYUN_IMAGE_10004"; + + public static final String ORG_ZSTACK_ALIYUN_IMAGE_10005 = "ORG_ZSTACK_ALIYUN_IMAGE_10005"; + + public static final String ORG_ZSTACK_ALIYUN_IMAGE_10006 = "ORG_ZSTACK_ALIYUN_IMAGE_10006"; + + public static final String ORG_ZSTACK_ALIYUN_IMAGE_10007 = "ORG_ZSTACK_ALIYUN_IMAGE_10007"; + + public static final String ORG_ZSTACK_ALIYUN_IMAGE_10008 = "ORG_ZSTACK_ALIYUN_IMAGE_10008"; + + public static final String ORG_ZSTACK_ALIYUN_IMAGE_10009 = "ORG_ZSTACK_ALIYUN_IMAGE_10009"; + + public static final String ORG_ZSTACK_ALIYUN_IMAGE_10010 = "ORG_ZSTACK_ALIYUN_IMAGE_10010"; + + public static final String ORG_ZSTACK_ALIYUN_IMAGE_10011 = "ORG_ZSTACK_ALIYUN_IMAGE_10011"; + + public static final String ORG_ZSTACK_ALIYUN_IMAGE_10012 = "ORG_ZSTACK_ALIYUN_IMAGE_10012"; + + public static final String ORG_ZSTACK_HA_10000 = "ORG_ZSTACK_HA_10000"; + + public static final String ORG_ZSTACK_HA_10001 = "ORG_ZSTACK_HA_10001"; + + public static final String ORG_ZSTACK_HA_10002 = "ORG_ZSTACK_HA_10002"; + + public static final String ORG_ZSTACK_HA_10003 = "ORG_ZSTACK_HA_10003"; + + public static final String ORG_ZSTACK_HA_10004 = "ORG_ZSTACK_HA_10004"; + + public static final String ORG_ZSTACK_HA_10005 = "ORG_ZSTACK_HA_10005"; + + public static final String ORG_ZSTACK_HA_10006 = "ORG_ZSTACK_HA_10006"; + + public static final String ORG_ZSTACK_HA_10007 = "ORG_ZSTACK_HA_10007"; + + public static final String ORG_ZSTACK_HA_10008 = "ORG_ZSTACK_HA_10008"; + + public static final String ORG_ZSTACK_HA_10009 = "ORG_ZSTACK_HA_10009"; + + public static final String ORG_ZSTACK_HA_10010 = "ORG_ZSTACK_HA_10010"; + + public static final String ORG_ZSTACK_HA_10011 = "ORG_ZSTACK_HA_10011"; + + public static final String ORG_ZSTACK_HA_10012 = "ORG_ZSTACK_HA_10012"; + + public static final String ORG_ZSTACK_HA_10013 = "ORG_ZSTACK_HA_10013"; + + public static final String ORG_ZSTACK_HA_10014 = "ORG_ZSTACK_HA_10014"; + + public static final String ORG_ZSTACK_HA_10015 = "ORG_ZSTACK_HA_10015"; + + public static final String ORG_ZSTACK_HA_10016 = "ORG_ZSTACK_HA_10016"; + + public static final String ORG_ZSTACK_HA_10017 = "ORG_ZSTACK_HA_10017"; + + public static final String ORG_ZSTACK_HA_10018 = "ORG_ZSTACK_HA_10018"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10000 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10001 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10002 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10003 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10003"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10004 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10004"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10005 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10005"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10006 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10006"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10007 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10007"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10008 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10008"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10009 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10009"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10010 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10010"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10011 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10011"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10012 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10012"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10013 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10013"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10014 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10014"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10015 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10015"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10016 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10016"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10017 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10017"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10018 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10018"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10019 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10019"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10020 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10020"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10021 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10021"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10022 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10022"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10023 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10023"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10024 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10024"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10025 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10025"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10026 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10026"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10027 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10027"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10028 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10028"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10029 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10029"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10030 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10030"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10031 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10031"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10032 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10032"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10033 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10033"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10034 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10034"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10035 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10035"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10036 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10036"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10037 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10037"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10038 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10038"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10039 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10039"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10040 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10040"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10041 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10041"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10042 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10042"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10043 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10043"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10044 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10044"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10045 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10045"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10046 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10046"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10047 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10047"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10048 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10048"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10049 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10049"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10050 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10050"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10051 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10051"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10052 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10052"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10053 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10053"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10054 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10054"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10055 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10055"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10056 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10056"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_10057 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_10057"; + + public static final String ORG_ZSTACK_VMWARE_10000 = "ORG_ZSTACK_VMWARE_10000"; + + public static final String ORG_ZSTACK_VMWARE_10001 = "ORG_ZSTACK_VMWARE_10001"; + + public static final String ORG_ZSTACK_VMWARE_10002 = "ORG_ZSTACK_VMWARE_10002"; + + public static final String ORG_ZSTACK_VMWARE_10003 = "ORG_ZSTACK_VMWARE_10003"; + + public static final String ORG_ZSTACK_VMWARE_10004 = "ORG_ZSTACK_VMWARE_10004"; + + public static final String ORG_ZSTACK_VMWARE_10005 = "ORG_ZSTACK_VMWARE_10005"; + + public static final String ORG_ZSTACK_VMWARE_10006 = "ORG_ZSTACK_VMWARE_10006"; + + public static final String ORG_ZSTACK_VMWARE_10007 = "ORG_ZSTACK_VMWARE_10007"; + + public static final String ORG_ZSTACK_VMWARE_10008 = "ORG_ZSTACK_VMWARE_10008"; + + public static final String ORG_ZSTACK_VMWARE_10009 = "ORG_ZSTACK_VMWARE_10009"; + + public static final String ORG_ZSTACK_VMWARE_10010 = "ORG_ZSTACK_VMWARE_10010"; + + public static final String ORG_ZSTACK_VMWARE_10011 = "ORG_ZSTACK_VMWARE_10011"; + + public static final String ORG_ZSTACK_VMWARE_10012 = "ORG_ZSTACK_VMWARE_10012"; + + public static final String ORG_ZSTACK_VMWARE_10013 = "ORG_ZSTACK_VMWARE_10013"; + + public static final String ORG_ZSTACK_VMWARE_10014 = "ORG_ZSTACK_VMWARE_10014"; + + public static final String ORG_ZSTACK_VMWARE_10015 = "ORG_ZSTACK_VMWARE_10015"; + + public static final String ORG_ZSTACK_VMWARE_10016 = "ORG_ZSTACK_VMWARE_10016"; + + public static final String ORG_ZSTACK_VMWARE_10017 = "ORG_ZSTACK_VMWARE_10017"; + + public static final String ORG_ZSTACK_VMWARE_10018 = "ORG_ZSTACK_VMWARE_10018"; + + public static final String ORG_ZSTACK_VMWARE_10019 = "ORG_ZSTACK_VMWARE_10019"; + + public static final String ORG_ZSTACK_VMWARE_10020 = "ORG_ZSTACK_VMWARE_10020"; + + public static final String ORG_ZSTACK_VMWARE_10021 = "ORG_ZSTACK_VMWARE_10021"; + + public static final String ORG_ZSTACK_VMWARE_10022 = "ORG_ZSTACK_VMWARE_10022"; + + public static final String ORG_ZSTACK_VMWARE_10023 = "ORG_ZSTACK_VMWARE_10023"; + + public static final String ORG_ZSTACK_VMWARE_10024 = "ORG_ZSTACK_VMWARE_10024"; + + public static final String ORG_ZSTACK_VMWARE_10025 = "ORG_ZSTACK_VMWARE_10025"; + + public static final String ORG_ZSTACK_VMWARE_10026 = "ORG_ZSTACK_VMWARE_10026"; + + public static final String ORG_ZSTACK_VMWARE_10027 = "ORG_ZSTACK_VMWARE_10027"; + + public static final String ORG_ZSTACK_VMWARE_10028 = "ORG_ZSTACK_VMWARE_10028"; + + public static final String ORG_ZSTACK_VMWARE_10029 = "ORG_ZSTACK_VMWARE_10029"; + + public static final String ORG_ZSTACK_VMWARE_10030 = "ORG_ZSTACK_VMWARE_10030"; + + public static final String ORG_ZSTACK_VMWARE_10031 = "ORG_ZSTACK_VMWARE_10031"; + + public static final String ORG_ZSTACK_VMWARE_10032 = "ORG_ZSTACK_VMWARE_10032"; + + public static final String ORG_ZSTACK_VMWARE_10033 = "ORG_ZSTACK_VMWARE_10033"; + + public static final String ORG_ZSTACK_VMWARE_10034 = "ORG_ZSTACK_VMWARE_10034"; + + public static final String ORG_ZSTACK_VMWARE_10035 = "ORG_ZSTACK_VMWARE_10035"; + + public static final String ORG_ZSTACK_VMWARE_10036 = "ORG_ZSTACK_VMWARE_10036"; + + public static final String ORG_ZSTACK_VMWARE_10037 = "ORG_ZSTACK_VMWARE_10037"; + + public static final String ORG_ZSTACK_VMWARE_10038 = "ORG_ZSTACK_VMWARE_10038"; + + public static final String ORG_ZSTACK_VMWARE_10039 = "ORG_ZSTACK_VMWARE_10039"; + + public static final String ORG_ZSTACK_VMWARE_10040 = "ORG_ZSTACK_VMWARE_10040"; + + public static final String ORG_ZSTACK_VMWARE_10041 = "ORG_ZSTACK_VMWARE_10041"; + + public static final String ORG_ZSTACK_VMWARE_10042 = "ORG_ZSTACK_VMWARE_10042"; + + public static final String ORG_ZSTACK_VMWARE_10043 = "ORG_ZSTACK_VMWARE_10043"; + + public static final String ORG_ZSTACK_VMWARE_10044 = "ORG_ZSTACK_VMWARE_10044"; + + public static final String ORG_ZSTACK_VMWARE_10045 = "ORG_ZSTACK_VMWARE_10045"; + + public static final String ORG_ZSTACK_VMWARE_10046 = "ORG_ZSTACK_VMWARE_10046"; + + public static final String ORG_ZSTACK_VMWARE_10047 = "ORG_ZSTACK_VMWARE_10047"; + + public static final String ORG_ZSTACK_VMWARE_10048 = "ORG_ZSTACK_VMWARE_10048"; + + public static final String ORG_ZSTACK_VMWARE_10049 = "ORG_ZSTACK_VMWARE_10049"; + + public static final String ORG_ZSTACK_VMWARE_10050 = "ORG_ZSTACK_VMWARE_10050"; + + public static final String ORG_ZSTACK_VMWARE_10051 = "ORG_ZSTACK_VMWARE_10051"; + + public static final String ORG_ZSTACK_VMWARE_10052 = "ORG_ZSTACK_VMWARE_10052"; + + public static final String ORG_ZSTACK_VMWARE_10053 = "ORG_ZSTACK_VMWARE_10053"; + + public static final String ORG_ZSTACK_VMWARE_10054 = "ORG_ZSTACK_VMWARE_10054"; + + public static final String ORG_ZSTACK_VMWARE_10055 = "ORG_ZSTACK_VMWARE_10055"; + + public static final String ORG_ZSTACK_VMWARE_10056 = "ORG_ZSTACK_VMWARE_10056"; + + public static final String ORG_ZSTACK_VMWARE_10057 = "ORG_ZSTACK_VMWARE_10057"; + + public static final String ORG_ZSTACK_VMWARE_10058 = "ORG_ZSTACK_VMWARE_10058"; + + public static final String ORG_ZSTACK_VMWARE_10059 = "ORG_ZSTACK_VMWARE_10059"; + + public static final String ORG_ZSTACK_VMWARE_10060 = "ORG_ZSTACK_VMWARE_10060"; + + public static final String ORG_ZSTACK_VMWARE_10061 = "ORG_ZSTACK_VMWARE_10061"; + + public static final String ORG_ZSTACK_VMWARE_10062 = "ORG_ZSTACK_VMWARE_10062"; + + public static final String ORG_ZSTACK_VMWARE_10063 = "ORG_ZSTACK_VMWARE_10063"; + + public static final String ORG_ZSTACK_VMWARE_10064 = "ORG_ZSTACK_VMWARE_10064"; + + public static final String ORG_ZSTACK_VMWARE_10065 = "ORG_ZSTACK_VMWARE_10065"; + + public static final String ORG_ZSTACK_VMWARE_10066 = "ORG_ZSTACK_VMWARE_10066"; + + public static final String ORG_ZSTACK_VMWARE_10067 = "ORG_ZSTACK_VMWARE_10067"; + + public static final String ORG_ZSTACK_VMWARE_10068 = "ORG_ZSTACK_VMWARE_10068"; + + public static final String ORG_ZSTACK_VMWARE_10069 = "ORG_ZSTACK_VMWARE_10069"; + + public static final String ORG_ZSTACK_VMWARE_10070 = "ORG_ZSTACK_VMWARE_10070"; + + public static final String ORG_ZSTACK_VMWARE_10071 = "ORG_ZSTACK_VMWARE_10071"; + + public static final String ORG_ZSTACK_VMWARE_10072 = "ORG_ZSTACK_VMWARE_10072"; + + public static final String ORG_ZSTACK_VMWARE_10073 = "ORG_ZSTACK_VMWARE_10073"; + + public static final String ORG_ZSTACK_VMWARE_10074 = "ORG_ZSTACK_VMWARE_10074"; + + public static final String ORG_ZSTACK_VMWARE_10075 = "ORG_ZSTACK_VMWARE_10075"; + + public static final String ORG_ZSTACK_VMWARE_10076 = "ORG_ZSTACK_VMWARE_10076"; + + public static final String ORG_ZSTACK_VMWARE_10077 = "ORG_ZSTACK_VMWARE_10077"; + + public static final String ORG_ZSTACK_VMWARE_10078 = "ORG_ZSTACK_VMWARE_10078"; + + public static final String ORG_ZSTACK_VMWARE_10079 = "ORG_ZSTACK_VMWARE_10079"; + + public static final String ORG_ZSTACK_VMWARE_10080 = "ORG_ZSTACK_VMWARE_10080"; + + public static final String ORG_ZSTACK_VMWARE_10081 = "ORG_ZSTACK_VMWARE_10081"; + + public static final String ORG_ZSTACK_VMWARE_10082 = "ORG_ZSTACK_VMWARE_10082"; + + public static final String ORG_ZSTACK_VMWARE_10083 = "ORG_ZSTACK_VMWARE_10083"; + + public static final String ORG_ZSTACK_VMWARE_10084 = "ORG_ZSTACK_VMWARE_10084"; + + public static final String ORG_ZSTACK_VMWARE_10085 = "ORG_ZSTACK_VMWARE_10085"; + + public static final String ORG_ZSTACK_VMWARE_10086 = "ORG_ZSTACK_VMWARE_10086"; + + public static final String ORG_ZSTACK_VMWARE_10087 = "ORG_ZSTACK_VMWARE_10087"; + + public static final String ORG_ZSTACK_VMWARE_10088 = "ORG_ZSTACK_VMWARE_10088"; + + public static final String ORG_ZSTACK_VMWARE_10089 = "ORG_ZSTACK_VMWARE_10089"; + + public static final String ORG_ZSTACK_VMWARE_10090 = "ORG_ZSTACK_VMWARE_10090"; + + public static final String ORG_ZSTACK_VMWARE_10091 = "ORG_ZSTACK_VMWARE_10091"; + + public static final String ORG_ZSTACK_VMWARE_10092 = "ORG_ZSTACK_VMWARE_10092"; + + public static final String ORG_ZSTACK_VMWARE_10093 = "ORG_ZSTACK_VMWARE_10093"; + + public static final String ORG_ZSTACK_VMWARE_10094 = "ORG_ZSTACK_VMWARE_10094"; + + public static final String ORG_ZSTACK_VMWARE_10095 = "ORG_ZSTACK_VMWARE_10095"; + + public static final String ORG_ZSTACK_VMWARE_10096 = "ORG_ZSTACK_VMWARE_10096"; + + public static final String ORG_ZSTACK_VMWARE_10097 = "ORG_ZSTACK_VMWARE_10097"; + + public static final String ORG_ZSTACK_VMWARE_10098 = "ORG_ZSTACK_VMWARE_10098"; + + public static final String ORG_ZSTACK_VMWARE_10099 = "ORG_ZSTACK_VMWARE_10099"; + + public static final String ORG_ZSTACK_VMWARE_10100 = "ORG_ZSTACK_VMWARE_10100"; + + public static final String ORG_ZSTACK_VMWARE_10101 = "ORG_ZSTACK_VMWARE_10101"; + + public static final String ORG_ZSTACK_VMWARE_10102 = "ORG_ZSTACK_VMWARE_10102"; + + public static final String ORG_ZSTACK_VMWARE_10103 = "ORG_ZSTACK_VMWARE_10103"; + + public static final String ORG_ZSTACK_VMWARE_10104 = "ORG_ZSTACK_VMWARE_10104"; + + public static final String ORG_ZSTACK_VMWARE_10105 = "ORG_ZSTACK_VMWARE_10105"; + + public static final String ORG_ZSTACK_VMWARE_10106 = "ORG_ZSTACK_VMWARE_10106"; + + public static final String ORG_ZSTACK_VMWARE_10107 = "ORG_ZSTACK_VMWARE_10107"; + + public static final String ORG_ZSTACK_VMWARE_10108 = "ORG_ZSTACK_VMWARE_10108"; + + public static final String ORG_ZSTACK_VMWARE_10109 = "ORG_ZSTACK_VMWARE_10109"; + + public static final String ORG_ZSTACK_VMWARE_10110 = "ORG_ZSTACK_VMWARE_10110"; + + public static final String ORG_ZSTACK_VMWARE_10111 = "ORG_ZSTACK_VMWARE_10111"; + + public static final String ORG_ZSTACK_VMWARE_10112 = "ORG_ZSTACK_VMWARE_10112"; + + public static final String ORG_ZSTACK_VMWARE_10113 = "ORG_ZSTACK_VMWARE_10113"; + + public static final String ORG_ZSTACK_VMWARE_10114 = "ORG_ZSTACK_VMWARE_10114"; + + public static final String ORG_ZSTACK_VMWARE_10115 = "ORG_ZSTACK_VMWARE_10115"; + + public static final String ORG_ZSTACK_VMWARE_10116 = "ORG_ZSTACK_VMWARE_10116"; + + public static final String ORG_ZSTACK_VMWARE_10117 = "ORG_ZSTACK_VMWARE_10117"; + + public static final String ORG_ZSTACK_VMWARE_10118 = "ORG_ZSTACK_VMWARE_10118"; + + public static final String ORG_ZSTACK_VMWARE_10119 = "ORG_ZSTACK_VMWARE_10119"; + + public static final String ORG_ZSTACK_VMWARE_10120 = "ORG_ZSTACK_VMWARE_10120"; + + public static final String ORG_ZSTACK_VMWARE_10121 = "ORG_ZSTACK_VMWARE_10121"; + + public static final String ORG_ZSTACK_VMWARE_10122 = "ORG_ZSTACK_VMWARE_10122"; + + public static final String ORG_ZSTACK_VMWARE_10123 = "ORG_ZSTACK_VMWARE_10123"; + + public static final String ORG_ZSTACK_VMWARE_10124 = "ORG_ZSTACK_VMWARE_10124"; + + public static final String ORG_ZSTACK_VMWARE_10125 = "ORG_ZSTACK_VMWARE_10125"; + + public static final String ORG_ZSTACK_VMWARE_10126 = "ORG_ZSTACK_VMWARE_10126"; + + public static final String ORG_ZSTACK_VMWARE_10127 = "ORG_ZSTACK_VMWARE_10127"; + + public static final String ORG_ZSTACK_VMWARE_10128 = "ORG_ZSTACK_VMWARE_10128"; + + public static final String ORG_ZSTACK_VMWARE_10129 = "ORG_ZSTACK_VMWARE_10129"; + + public static final String ORG_ZSTACK_VMWARE_10130 = "ORG_ZSTACK_VMWARE_10130"; + + public static final String ORG_ZSTACK_VMWARE_10131 = "ORG_ZSTACK_VMWARE_10131"; + + public static final String ORG_ZSTACK_VMWARE_10132 = "ORG_ZSTACK_VMWARE_10132"; + + public static final String ORG_ZSTACK_VMWARE_10133 = "ORG_ZSTACK_VMWARE_10133"; + + public static final String ORG_ZSTACK_VMWARE_10134 = "ORG_ZSTACK_VMWARE_10134"; + + public static final String ORG_ZSTACK_VMWARE_10135 = "ORG_ZSTACK_VMWARE_10135"; + + public static final String ORG_ZSTACK_TEST_UNITTEST_MEVOCO_10000 = "ORG_ZSTACK_TEST_UNITTEST_MEVOCO_10000"; + + public static final String ORG_ZSTACK_CORE_EXTERNALSERVICE_10000 = "ORG_ZSTACK_CORE_EXTERNALSERVICE_10000"; + + public static final String ORG_ZSTACK_CORE_EXTERNALSERVICE_10001 = "ORG_ZSTACK_CORE_EXTERNALSERVICE_10001"; + + public static final String ORG_ZSTACK_CORE_EXTERNALSERVICE_10002 = "ORG_ZSTACK_CORE_EXTERNALSERVICE_10002"; + + public static final String ORG_ZSTACK_CORE_EXTERNALSERVICE_10003 = "ORG_ZSTACK_CORE_EXTERNALSERVICE_10003"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10000 = "ORG_ZSTACK_GUESTTOOLS_10000"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10001 = "ORG_ZSTACK_GUESTTOOLS_10001"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10002 = "ORG_ZSTACK_GUESTTOOLS_10002"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10003 = "ORG_ZSTACK_GUESTTOOLS_10003"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10004 = "ORG_ZSTACK_GUESTTOOLS_10004"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10005 = "ORG_ZSTACK_GUESTTOOLS_10005"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10006 = "ORG_ZSTACK_GUESTTOOLS_10006"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10007 = "ORG_ZSTACK_GUESTTOOLS_10007"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10008 = "ORG_ZSTACK_GUESTTOOLS_10008"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10009 = "ORG_ZSTACK_GUESTTOOLS_10009"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10010 = "ORG_ZSTACK_GUESTTOOLS_10010"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10011 = "ORG_ZSTACK_GUESTTOOLS_10011"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10012 = "ORG_ZSTACK_GUESTTOOLS_10012"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10013 = "ORG_ZSTACK_GUESTTOOLS_10013"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10014 = "ORG_ZSTACK_GUESTTOOLS_10014"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10015 = "ORG_ZSTACK_GUESTTOOLS_10015"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10016 = "ORG_ZSTACK_GUESTTOOLS_10016"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10017 = "ORG_ZSTACK_GUESTTOOLS_10017"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10018 = "ORG_ZSTACK_GUESTTOOLS_10018"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10019 = "ORG_ZSTACK_GUESTTOOLS_10019"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10020 = "ORG_ZSTACK_GUESTTOOLS_10020"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10021 = "ORG_ZSTACK_GUESTTOOLS_10021"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10022 = "ORG_ZSTACK_GUESTTOOLS_10022"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10023 = "ORG_ZSTACK_GUESTTOOLS_10023"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10024 = "ORG_ZSTACK_GUESTTOOLS_10024"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10025 = "ORG_ZSTACK_GUESTTOOLS_10025"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10026 = "ORG_ZSTACK_GUESTTOOLS_10026"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10027 = "ORG_ZSTACK_GUESTTOOLS_10027"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10028 = "ORG_ZSTACK_GUESTTOOLS_10028"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10029 = "ORG_ZSTACK_GUESTTOOLS_10029"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10030 = "ORG_ZSTACK_GUESTTOOLS_10030"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10031 = "ORG_ZSTACK_GUESTTOOLS_10031"; + + public static final String ORG_ZSTACK_GUESTTOOLS_10032 = "ORG_ZSTACK_GUESTTOOLS_10032"; + + public static final String ORG_ZSTACK_CORE_ERRORCODE_10000 = "ORG_ZSTACK_CORE_ERRORCODE_10000"; + + public static final String ORG_ZSTACK_CORE_ERRORCODE_10001 = "ORG_ZSTACK_CORE_ERRORCODE_10001"; + + public static final String ORG_ZSTACK_CORE_ERRORCODE_10002 = "ORG_ZSTACK_CORE_ERRORCODE_10002"; + + public static final String ORG_ZSTACK_CORE_ERRORCODE_10003 = "ORG_ZSTACK_CORE_ERRORCODE_10003"; + + public static final String ORG_ZSTACK_CORE_ERRORCODE_10004 = "ORG_ZSTACK_CORE_ERRORCODE_10004"; + + public static final String ORG_ZSTACK_CORE_ERRORCODE_10005 = "ORG_ZSTACK_CORE_ERRORCODE_10005"; + + public static final String ORG_ZSTACK_CORE_ERRORCODE_10006 = "ORG_ZSTACK_CORE_ERRORCODE_10006"; + + public static final String ORG_ZSTACK_CORE_ERRORCODE_10007 = "ORG_ZSTACK_CORE_ERRORCODE_10007"; + + public static final String ORG_ZSTACK_KVM_10000 = "ORG_ZSTACK_KVM_10000"; + + public static final String ORG_ZSTACK_KVM_10001 = "ORG_ZSTACK_KVM_10001"; + + public static final String ORG_ZSTACK_KVM_10002 = "ORG_ZSTACK_KVM_10002"; + + public static final String ORG_ZSTACK_KVM_10003 = "ORG_ZSTACK_KVM_10003"; + + public static final String ORG_ZSTACK_KVM_10004 = "ORG_ZSTACK_KVM_10004"; + + public static final String ORG_ZSTACK_KVM_10005 = "ORG_ZSTACK_KVM_10005"; + + public static final String ORG_ZSTACK_KVM_10006 = "ORG_ZSTACK_KVM_10006"; + + public static final String ORG_ZSTACK_KVM_10007 = "ORG_ZSTACK_KVM_10007"; + + public static final String ORG_ZSTACK_KVM_10008 = "ORG_ZSTACK_KVM_10008"; + + public static final String ORG_ZSTACK_KVM_10009 = "ORG_ZSTACK_KVM_10009"; + + public static final String ORG_ZSTACK_KVM_10010 = "ORG_ZSTACK_KVM_10010"; + + public static final String ORG_ZSTACK_KVM_10011 = "ORG_ZSTACK_KVM_10011"; + + public static final String ORG_ZSTACK_KVM_10012 = "ORG_ZSTACK_KVM_10012"; + + public static final String ORG_ZSTACK_KVM_10013 = "ORG_ZSTACK_KVM_10013"; + + public static final String ORG_ZSTACK_KVM_10014 = "ORG_ZSTACK_KVM_10014"; + + public static final String ORG_ZSTACK_KVM_10015 = "ORG_ZSTACK_KVM_10015"; + + public static final String ORG_ZSTACK_KVM_10016 = "ORG_ZSTACK_KVM_10016"; + + public static final String ORG_ZSTACK_KVM_10017 = "ORG_ZSTACK_KVM_10017"; + + public static final String ORG_ZSTACK_KVM_10018 = "ORG_ZSTACK_KVM_10018"; + + public static final String ORG_ZSTACK_KVM_10019 = "ORG_ZSTACK_KVM_10019"; + + public static final String ORG_ZSTACK_KVM_10020 = "ORG_ZSTACK_KVM_10020"; + + public static final String ORG_ZSTACK_KVM_10021 = "ORG_ZSTACK_KVM_10021"; + + public static final String ORG_ZSTACK_KVM_10022 = "ORG_ZSTACK_KVM_10022"; + + public static final String ORG_ZSTACK_KVM_10023 = "ORG_ZSTACK_KVM_10023"; + + public static final String ORG_ZSTACK_KVM_10024 = "ORG_ZSTACK_KVM_10024"; + + public static final String ORG_ZSTACK_KVM_10025 = "ORG_ZSTACK_KVM_10025"; + + public static final String ORG_ZSTACK_KVM_10026 = "ORG_ZSTACK_KVM_10026"; + + public static final String ORG_ZSTACK_KVM_10027 = "ORG_ZSTACK_KVM_10027"; + + public static final String ORG_ZSTACK_KVM_10028 = "ORG_ZSTACK_KVM_10028"; + + public static final String ORG_ZSTACK_KVM_10029 = "ORG_ZSTACK_KVM_10029"; + + public static final String ORG_ZSTACK_KVM_10030 = "ORG_ZSTACK_KVM_10030"; + + public static final String ORG_ZSTACK_KVM_10031 = "ORG_ZSTACK_KVM_10031"; + + public static final String ORG_ZSTACK_KVM_10032 = "ORG_ZSTACK_KVM_10032"; + + public static final String ORG_ZSTACK_KVM_10033 = "ORG_ZSTACK_KVM_10033"; + + public static final String ORG_ZSTACK_KVM_10034 = "ORG_ZSTACK_KVM_10034"; + + public static final String ORG_ZSTACK_KVM_10035 = "ORG_ZSTACK_KVM_10035"; + + public static final String ORG_ZSTACK_KVM_10036 = "ORG_ZSTACK_KVM_10036"; + + public static final String ORG_ZSTACK_KVM_10037 = "ORG_ZSTACK_KVM_10037"; + + public static final String ORG_ZSTACK_KVM_10038 = "ORG_ZSTACK_KVM_10038"; + + public static final String ORG_ZSTACK_KVM_10039 = "ORG_ZSTACK_KVM_10039"; + + public static final String ORG_ZSTACK_KVM_10040 = "ORG_ZSTACK_KVM_10040"; + + public static final String ORG_ZSTACK_KVM_10041 = "ORG_ZSTACK_KVM_10041"; + + public static final String ORG_ZSTACK_KVM_10042 = "ORG_ZSTACK_KVM_10042"; + + public static final String ORG_ZSTACK_KVM_10043 = "ORG_ZSTACK_KVM_10043"; + + public static final String ORG_ZSTACK_KVM_10044 = "ORG_ZSTACK_KVM_10044"; + + public static final String ORG_ZSTACK_KVM_10045 = "ORG_ZSTACK_KVM_10045"; + + public static final String ORG_ZSTACK_KVM_10046 = "ORG_ZSTACK_KVM_10046"; + + public static final String ORG_ZSTACK_KVM_10047 = "ORG_ZSTACK_KVM_10047"; + + public static final String ORG_ZSTACK_KVM_10048 = "ORG_ZSTACK_KVM_10048"; + + public static final String ORG_ZSTACK_KVM_10049 = "ORG_ZSTACK_KVM_10049"; + + public static final String ORG_ZSTACK_KVM_10050 = "ORG_ZSTACK_KVM_10050"; + + public static final String ORG_ZSTACK_KVM_10051 = "ORG_ZSTACK_KVM_10051"; + + public static final String ORG_ZSTACK_KVM_10052 = "ORG_ZSTACK_KVM_10052"; + + public static final String ORG_ZSTACK_KVM_10053 = "ORG_ZSTACK_KVM_10053"; + + public static final String ORG_ZSTACK_KVM_10054 = "ORG_ZSTACK_KVM_10054"; + + public static final String ORG_ZSTACK_KVM_10055 = "ORG_ZSTACK_KVM_10055"; + + public static final String ORG_ZSTACK_KVM_10056 = "ORG_ZSTACK_KVM_10056"; + + public static final String ORG_ZSTACK_KVM_10057 = "ORG_ZSTACK_KVM_10057"; + + public static final String ORG_ZSTACK_KVM_10058 = "ORG_ZSTACK_KVM_10058"; + + public static final String ORG_ZSTACK_KVM_10059 = "ORG_ZSTACK_KVM_10059"; + + public static final String ORG_ZSTACK_KVM_10060 = "ORG_ZSTACK_KVM_10060"; + + public static final String ORG_ZSTACK_KVM_10061 = "ORG_ZSTACK_KVM_10061"; + + public static final String ORG_ZSTACK_KVM_10062 = "ORG_ZSTACK_KVM_10062"; + + public static final String ORG_ZSTACK_KVM_10063 = "ORG_ZSTACK_KVM_10063"; + + public static final String ORG_ZSTACK_KVM_10064 = "ORG_ZSTACK_KVM_10064"; + + public static final String ORG_ZSTACK_KVM_10065 = "ORG_ZSTACK_KVM_10065"; + + public static final String ORG_ZSTACK_KVM_10066 = "ORG_ZSTACK_KVM_10066"; + + public static final String ORG_ZSTACK_KVM_10067 = "ORG_ZSTACK_KVM_10067"; + + public static final String ORG_ZSTACK_KVM_10068 = "ORG_ZSTACK_KVM_10068"; + + public static final String ORG_ZSTACK_KVM_10069 = "ORG_ZSTACK_KVM_10069"; + + public static final String ORG_ZSTACK_KVM_10070 = "ORG_ZSTACK_KVM_10070"; + + public static final String ORG_ZSTACK_KVM_10071 = "ORG_ZSTACK_KVM_10071"; + + public static final String ORG_ZSTACK_KVM_10072 = "ORG_ZSTACK_KVM_10072"; + + public static final String ORG_ZSTACK_KVM_10073 = "ORG_ZSTACK_KVM_10073"; + + public static final String ORG_ZSTACK_KVM_10074 = "ORG_ZSTACK_KVM_10074"; + + public static final String ORG_ZSTACK_KVM_10075 = "ORG_ZSTACK_KVM_10075"; + + public static final String ORG_ZSTACK_KVM_10076 = "ORG_ZSTACK_KVM_10076"; + + public static final String ORG_ZSTACK_KVM_10077 = "ORG_ZSTACK_KVM_10077"; + + public static final String ORG_ZSTACK_KVM_10078 = "ORG_ZSTACK_KVM_10078"; + + public static final String ORG_ZSTACK_KVM_10079 = "ORG_ZSTACK_KVM_10079"; + + public static final String ORG_ZSTACK_KVM_10080 = "ORG_ZSTACK_KVM_10080"; + + public static final String ORG_ZSTACK_KVM_10081 = "ORG_ZSTACK_KVM_10081"; + + public static final String ORG_ZSTACK_KVM_10082 = "ORG_ZSTACK_KVM_10082"; + + public static final String ORG_ZSTACK_KVM_10083 = "ORG_ZSTACK_KVM_10083"; + + public static final String ORG_ZSTACK_KVM_10084 = "ORG_ZSTACK_KVM_10084"; + + public static final String ORG_ZSTACK_KVM_10085 = "ORG_ZSTACK_KVM_10085"; + + public static final String ORG_ZSTACK_KVM_10086 = "ORG_ZSTACK_KVM_10086"; + + public static final String ORG_ZSTACK_KVM_10087 = "ORG_ZSTACK_KVM_10087"; + + public static final String ORG_ZSTACK_KVM_10088 = "ORG_ZSTACK_KVM_10088"; + + public static final String ORG_ZSTACK_KVM_10089 = "ORG_ZSTACK_KVM_10089"; + + public static final String ORG_ZSTACK_KVM_10090 = "ORG_ZSTACK_KVM_10090"; + + public static final String ORG_ZSTACK_KVM_10091 = "ORG_ZSTACK_KVM_10091"; + + public static final String ORG_ZSTACK_KVM_10092 = "ORG_ZSTACK_KVM_10092"; + + public static final String ORG_ZSTACK_KVM_10093 = "ORG_ZSTACK_KVM_10093"; + + public static final String ORG_ZSTACK_KVM_10094 = "ORG_ZSTACK_KVM_10094"; + + public static final String ORG_ZSTACK_KVM_10095 = "ORG_ZSTACK_KVM_10095"; + + public static final String ORG_ZSTACK_KVM_10096 = "ORG_ZSTACK_KVM_10096"; + + public static final String ORG_ZSTACK_KVM_10097 = "ORG_ZSTACK_KVM_10097"; + + public static final String ORG_ZSTACK_KVM_10098 = "ORG_ZSTACK_KVM_10098"; + + public static final String ORG_ZSTACK_KVM_10099 = "ORG_ZSTACK_KVM_10099"; + + public static final String ORG_ZSTACK_KVM_10100 = "ORG_ZSTACK_KVM_10100"; + + public static final String ORG_ZSTACK_KVM_10101 = "ORG_ZSTACK_KVM_10101"; + + public static final String ORG_ZSTACK_KVM_10102 = "ORG_ZSTACK_KVM_10102"; + + public static final String ORG_ZSTACK_KVM_10103 = "ORG_ZSTACK_KVM_10103"; + + public static final String ORG_ZSTACK_KVM_10104 = "ORG_ZSTACK_KVM_10104"; + + public static final String ORG_ZSTACK_KVM_10105 = "ORG_ZSTACK_KVM_10105"; + + public static final String ORG_ZSTACK_KVM_10106 = "ORG_ZSTACK_KVM_10106"; + + public static final String ORG_ZSTACK_KVM_10107 = "ORG_ZSTACK_KVM_10107"; + + public static final String ORG_ZSTACK_KVM_10108 = "ORG_ZSTACK_KVM_10108"; + + public static final String ORG_ZSTACK_KVM_10109 = "ORG_ZSTACK_KVM_10109"; + + public static final String ORG_ZSTACK_KVM_10110 = "ORG_ZSTACK_KVM_10110"; + + public static final String ORG_ZSTACK_KVM_10111 = "ORG_ZSTACK_KVM_10111"; + + public static final String ORG_ZSTACK_KVM_10112 = "ORG_ZSTACK_KVM_10112"; + + public static final String ORG_ZSTACK_KVM_10113 = "ORG_ZSTACK_KVM_10113"; + + public static final String ORG_ZSTACK_KVM_10114 = "ORG_ZSTACK_KVM_10114"; + + public static final String ORG_ZSTACK_KVM_10115 = "ORG_ZSTACK_KVM_10115"; + + public static final String ORG_ZSTACK_KVM_10116 = "ORG_ZSTACK_KVM_10116"; + + public static final String ORG_ZSTACK_KVM_10117 = "ORG_ZSTACK_KVM_10117"; + + public static final String ORG_ZSTACK_KVM_10118 = "ORG_ZSTACK_KVM_10118"; + + public static final String ORG_ZSTACK_KVM_10119 = "ORG_ZSTACK_KVM_10119"; + + public static final String ORG_ZSTACK_KVM_10120 = "ORG_ZSTACK_KVM_10120"; + + public static final String ORG_ZSTACK_KVM_10121 = "ORG_ZSTACK_KVM_10121"; + + public static final String ORG_ZSTACK_KVM_10122 = "ORG_ZSTACK_KVM_10122"; + + public static final String ORG_ZSTACK_KVM_10123 = "ORG_ZSTACK_KVM_10123"; + + public static final String ORG_ZSTACK_KVM_10124 = "ORG_ZSTACK_KVM_10124"; + + public static final String ORG_ZSTACK_KVM_10125 = "ORG_ZSTACK_KVM_10125"; + + public static final String ORG_ZSTACK_KVM_10126 = "ORG_ZSTACK_KVM_10126"; + + public static final String ORG_ZSTACK_KVM_10127 = "ORG_ZSTACK_KVM_10127"; + + public static final String ORG_ZSTACK_KVM_10128 = "ORG_ZSTACK_KVM_10128"; + + public static final String ORG_ZSTACK_KVM_10129 = "ORG_ZSTACK_KVM_10129"; + + public static final String ORG_ZSTACK_KVM_10130 = "ORG_ZSTACK_KVM_10130"; + + public static final String ORG_ZSTACK_KVM_10131 = "ORG_ZSTACK_KVM_10131"; + + public static final String ORG_ZSTACK_KVM_10132 = "ORG_ZSTACK_KVM_10132"; + + public static final String ORG_ZSTACK_KVM_10133 = "ORG_ZSTACK_KVM_10133"; + + public static final String ORG_ZSTACK_KVM_10134 = "ORG_ZSTACK_KVM_10134"; + + public static final String ORG_ZSTACK_KVM_10135 = "ORG_ZSTACK_KVM_10135"; + + public static final String ORG_ZSTACK_KVM_10136 = "ORG_ZSTACK_KVM_10136"; + + public static final String ORG_ZSTACK_KVM_10137 = "ORG_ZSTACK_KVM_10137"; + + public static final String ORG_ZSTACK_KVM_10138 = "ORG_ZSTACK_KVM_10138"; + + public static final String ORG_ZSTACK_KVM_10139 = "ORG_ZSTACK_KVM_10139"; + + public static final String ORG_ZSTACK_KVM_10140 = "ORG_ZSTACK_KVM_10140"; + + public static final String ORG_ZSTACK_KVM_10141 = "ORG_ZSTACK_KVM_10141"; + + public static final String ORG_ZSTACK_KVM_10142 = "ORG_ZSTACK_KVM_10142"; + + public static final String ORG_ZSTACK_KVM_10143 = "ORG_ZSTACK_KVM_10143"; + + public static final String ORG_ZSTACK_KVM_10144 = "ORG_ZSTACK_KVM_10144"; + + public static final String ORG_ZSTACK_KVM_10145 = "ORG_ZSTACK_KVM_10145"; + + public static final String ORG_ZSTACK_KVM_10146 = "ORG_ZSTACK_KVM_10146"; + + public static final String ORG_ZSTACK_KVM_10147 = "ORG_ZSTACK_KVM_10147"; + + public static final String ORG_ZSTACK_KVM_10148 = "ORG_ZSTACK_KVM_10148"; + + public static final String ORG_ZSTACK_KVM_10149 = "ORG_ZSTACK_KVM_10149"; + + public static final String ORG_ZSTACK_KVM_10150 = "ORG_ZSTACK_KVM_10150"; + + public static final String ORG_ZSTACK_KVM_10151 = "ORG_ZSTACK_KVM_10151"; + + public static final String ORG_ZSTACK_KVM_10152 = "ORG_ZSTACK_KVM_10152"; + + public static final String ORG_ZSTACK_KVM_10153 = "ORG_ZSTACK_KVM_10153"; + + public static final String ORG_ZSTACK_KVM_10154 = "ORG_ZSTACK_KVM_10154"; + + public static final String ORG_ZSTACK_KVM_10155 = "ORG_ZSTACK_KVM_10155"; + + public static final String ORG_ZSTACK_KVM_10156 = "ORG_ZSTACK_KVM_10156"; + + public static final String ORG_ZSTACK_KVM_10157 = "ORG_ZSTACK_KVM_10157"; + + public static final String ORG_ZSTACK_KVM_10158 = "ORG_ZSTACK_KVM_10158"; + + public static final String ORG_ZSTACK_KVM_10159 = "ORG_ZSTACK_KVM_10159"; + + public static final String ORG_ZSTACK_KVM_10160 = "ORG_ZSTACK_KVM_10160"; + + public static final String ORG_ZSTACK_KVM_10161 = "ORG_ZSTACK_KVM_10161"; + + public static final String ORG_ZSTACK_KVM_10162 = "ORG_ZSTACK_KVM_10162"; + + public static final String ORG_ZSTACK_ZSV_10000 = "ORG_ZSTACK_ZSV_10000"; + + public static final String ORG_ZSTACK_ZSV_10001 = "ORG_ZSTACK_ZSV_10001"; + + public static final String ORG_ZSTACK_ZSV_10002 = "ORG_ZSTACK_ZSV_10002"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10000 = "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10000"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10001 = "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10001"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10002 = "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10002"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10003 = "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10003"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10004 = "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10004"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10005 = "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10005"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10006 = "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10006"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10007 = "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10007"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10008 = "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10008"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10009 = "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10009"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10010 = "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10010"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10011 = "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10011"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10012 = "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10012"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10013 = "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10013"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10014 = "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10014"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10015 = "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10015"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10016 = "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10016"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10017 = "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10017"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10018 = "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10018"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10019 = "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10019"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10020 = "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10020"; + + public static final String ORG_ZSTACK_XINFINI_10000 = "ORG_ZSTACK_XINFINI_10000"; + + public static final String ORG_ZSTACK_XINFINI_10001 = "ORG_ZSTACK_XINFINI_10001"; + + public static final String ORG_ZSTACK_XINFINI_10002 = "ORG_ZSTACK_XINFINI_10002"; + + public static final String ORG_ZSTACK_XINFINI_10003 = "ORG_ZSTACK_XINFINI_10003"; + + public static final String ORG_ZSTACK_XINFINI_10004 = "ORG_ZSTACK_XINFINI_10004"; + + public static final String ORG_ZSTACK_XINFINI_10005 = "ORG_ZSTACK_XINFINI_10005"; + + public static final String ORG_ZSTACK_XINFINI_10006 = "ORG_ZSTACK_XINFINI_10006"; + + public static final String ORG_ZSTACK_XINFINI_10007 = "ORG_ZSTACK_XINFINI_10007"; + + public static final String ORG_ZSTACK_XINFINI_10008 = "ORG_ZSTACK_XINFINI_10008"; + + public static final String ORG_ZSTACK_XINFINI_10009 = "ORG_ZSTACK_XINFINI_10009"; + + public static final String ORG_ZSTACK_XINFINI_10010 = "ORG_ZSTACK_XINFINI_10010"; + + public static final String ORG_ZSTACK_XINFINI_10011 = "ORG_ZSTACK_XINFINI_10011"; + + public static final String ORG_ZSTACK_XINFINI_10012 = "ORG_ZSTACK_XINFINI_10012"; + + public static final String ORG_ZSTACK_XINFINI_10013 = "ORG_ZSTACK_XINFINI_10013"; + + public static final String ORG_ZSTACK_XINFINI_10014 = "ORG_ZSTACK_XINFINI_10014"; + + public static final String ORG_ZSTACK_XINFINI_10015 = "ORG_ZSTACK_XINFINI_10015"; + + public static final String ORG_ZSTACK_XINFINI_10016 = "ORG_ZSTACK_XINFINI_10016"; + + public static final String ORG_ZSTACK_XINFINI_10017 = "ORG_ZSTACK_XINFINI_10017"; + + public static final String ORG_ZSTACK_XINFINI_10018 = "ORG_ZSTACK_XINFINI_10018"; + + public static final String ORG_ZSTACK_XINFINI_10019 = "ORG_ZSTACK_XINFINI_10019"; + + public static final String ORG_ZSTACK_XINFINI_10020 = "ORG_ZSTACK_XINFINI_10020"; + + public static final String ORG_ZSTACK_XINFINI_10021 = "ORG_ZSTACK_XINFINI_10021"; + + public static final String ORG_ZSTACK_XINFINI_10022 = "ORG_ZSTACK_XINFINI_10022"; + + public static final String ORG_ZSTACK_XINFINI_10023 = "ORG_ZSTACK_XINFINI_10023"; + + public static final String ORG_ZSTACK_XINFINI_10024 = "ORG_ZSTACK_XINFINI_10024"; + + public static final String ORG_ZSTACK_XINFINI_10025 = "ORG_ZSTACK_XINFINI_10025"; + + public static final String ORG_ZSTACK_XINFINI_10026 = "ORG_ZSTACK_XINFINI_10026"; + + public static final String ORG_ZSTACK_XINFINI_10027 = "ORG_ZSTACK_XINFINI_10027"; + + public static final String ORG_ZSTACK_XINFINI_10028 = "ORG_ZSTACK_XINFINI_10028"; + + public static final String ORG_ZSTACK_COMPUTE_ZONE_10000 = "ORG_ZSTACK_COMPUTE_ZONE_10000"; + + public static final String ORG_ZSTACK_COMPUTE_ZONE_10001 = "ORG_ZSTACK_COMPUTE_ZONE_10001"; + + public static final String ORG_ZSTACK_COMPUTE_ZONE_10002 = "ORG_ZSTACK_COMPUTE_ZONE_10002"; + + public static final String ORG_ZSTACK_COMPUTE_ZONE_10003 = "ORG_ZSTACK_COMPUTE_ZONE_10003"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10000 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10000"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10001 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10001"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10002 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10002"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10003 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10003"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10004 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10004"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10005 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10005"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10006 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10006"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10007 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10007"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10008 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10008"; + + public static final String ORG_ZSTACK_EXTERNALBACKUP_10000 = "ORG_ZSTACK_EXTERNALBACKUP_10000"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_USERDATA_10000 = "ORG_ZSTACK_SUGONSDNCONTROLLER_USERDATA_10000"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_USERDATA_10001 = "ORG_ZSTACK_SUGONSDNCONTROLLER_USERDATA_10001"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_USERDATA_10002 = "ORG_ZSTACK_SUGONSDNCONTROLLER_USERDATA_10002"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_USERDATA_10003 = "ORG_ZSTACK_SUGONSDNCONTROLLER_USERDATA_10003"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_USERDATA_10004 = "ORG_ZSTACK_SUGONSDNCONTROLLER_USERDATA_10004"; + + public static final String ORG_ZSTACK_VROUTERROUTE_10000 = "ORG_ZSTACK_VROUTERROUTE_10000"; + + public static final String ORG_ZSTACK_VROUTERROUTE_10001 = "ORG_ZSTACK_VROUTERROUTE_10001"; + + public static final String ORG_ZSTACK_VROUTERROUTE_10002 = "ORG_ZSTACK_VROUTERROUTE_10002"; + + public static final String ORG_ZSTACK_VROUTERROUTE_10003 = "ORG_ZSTACK_VROUTERROUTE_10003"; + + public static final String ORG_ZSTACK_VROUTERROUTE_10004 = "ORG_ZSTACK_VROUTERROUTE_10004"; + + public static final String ORG_ZSTACK_VROUTERROUTE_10005 = "ORG_ZSTACK_VROUTERROUTE_10005"; + + public static final String ORG_ZSTACK_VROUTERROUTE_10006 = "ORG_ZSTACK_VROUTERROUTE_10006"; + + public static final String ORG_ZSTACK_VROUTERROUTE_10007 = "ORG_ZSTACK_VROUTERROUTE_10007"; + + public static final String ORG_ZSTACK_VROUTERROUTE_10008 = "ORG_ZSTACK_VROUTERROUTE_10008"; + + public static final String ORG_ZSTACK_VROUTERROUTE_10009 = "ORG_ZSTACK_VROUTERROUTE_10009"; + + public static final String ORG_ZSTACK_VROUTERROUTE_10010 = "ORG_ZSTACK_VROUTERROUTE_10010"; + + public static final String ORG_ZSTACK_VROUTERROUTE_10011 = "ORG_ZSTACK_VROUTERROUTE_10011"; + + public static final String ORG_ZSTACK_VROUTERROUTE_10012 = "ORG_ZSTACK_VROUTERROUTE_10012"; + + public static final String ORG_ZSTACK_VROUTERROUTE_10013 = "ORG_ZSTACK_VROUTERROUTE_10013"; + + public static final String ORG_ZSTACK_VROUTERROUTE_10014 = "ORG_ZSTACK_VROUTERROUTE_10014"; + + public static final String ORG_ZSTACK_VROUTERROUTE_10015 = "ORG_ZSTACK_VROUTERROUTE_10015"; + + public static final String ORG_ZSTACK_VROUTERROUTE_10016 = "ORG_ZSTACK_VROUTERROUTE_10016"; + + public static final String ORG_ZSTACK_CORE_ANSIBLE_10000 = "ORG_ZSTACK_CORE_ANSIBLE_10000"; + + public static final String ORG_ZSTACK_CORE_ANSIBLE_10001 = "ORG_ZSTACK_CORE_ANSIBLE_10001"; + + public static final String ORG_ZSTACK_CORE_ANSIBLE_10002 = "ORG_ZSTACK_CORE_ANSIBLE_10002"; + + public static final String ORG_ZSTACK_CORE_ANSIBLE_10003 = "ORG_ZSTACK_CORE_ANSIBLE_10003"; + + public static final String ORG_ZSTACK_CORE_ANSIBLE_10004 = "ORG_ZSTACK_CORE_ANSIBLE_10004"; + + public static final String ORG_ZSTACK_CORE_ANSIBLE_10005 = "ORG_ZSTACK_CORE_ANSIBLE_10005"; + + public static final String ORG_ZSTACK_CORE_ANSIBLE_10006 = "ORG_ZSTACK_CORE_ANSIBLE_10006"; + + public static final String ORG_ZSTACK_CORE_ANSIBLE_10007 = "ORG_ZSTACK_CORE_ANSIBLE_10007"; + + public static final String ORG_ZSTACK_SCHEDULER_10000 = "ORG_ZSTACK_SCHEDULER_10000"; + + public static final String ORG_ZSTACK_SCHEDULER_10001 = "ORG_ZSTACK_SCHEDULER_10001"; + + public static final String ORG_ZSTACK_SCHEDULER_10002 = "ORG_ZSTACK_SCHEDULER_10002"; + + public static final String ORG_ZSTACK_SCHEDULER_10003 = "ORG_ZSTACK_SCHEDULER_10003"; + + public static final String ORG_ZSTACK_SCHEDULER_10004 = "ORG_ZSTACK_SCHEDULER_10004"; + + public static final String ORG_ZSTACK_SCHEDULER_10005 = "ORG_ZSTACK_SCHEDULER_10005"; + + public static final String ORG_ZSTACK_SCHEDULER_10006 = "ORG_ZSTACK_SCHEDULER_10006"; + + public static final String ORG_ZSTACK_SCHEDULER_10007 = "ORG_ZSTACK_SCHEDULER_10007"; + + public static final String ORG_ZSTACK_SCHEDULER_10008 = "ORG_ZSTACK_SCHEDULER_10008"; + + public static final String ORG_ZSTACK_SCHEDULER_10009 = "ORG_ZSTACK_SCHEDULER_10009"; + + public static final String ORG_ZSTACK_SCHEDULER_10010 = "ORG_ZSTACK_SCHEDULER_10010"; + + public static final String ORG_ZSTACK_SCHEDULER_10011 = "ORG_ZSTACK_SCHEDULER_10011"; + + public static final String ORG_ZSTACK_SCHEDULER_10012 = "ORG_ZSTACK_SCHEDULER_10012"; + + public static final String ORG_ZSTACK_SCHEDULER_10013 = "ORG_ZSTACK_SCHEDULER_10013"; + + public static final String ORG_ZSTACK_SCHEDULER_10014 = "ORG_ZSTACK_SCHEDULER_10014"; + + public static final String ORG_ZSTACK_SCHEDULER_10015 = "ORG_ZSTACK_SCHEDULER_10015"; + + public static final String ORG_ZSTACK_SCHEDULER_10016 = "ORG_ZSTACK_SCHEDULER_10016"; + + public static final String ORG_ZSTACK_SCHEDULER_10017 = "ORG_ZSTACK_SCHEDULER_10017"; + + public static final String ORG_ZSTACK_SCHEDULER_10018 = "ORG_ZSTACK_SCHEDULER_10018"; + + public static final String ORG_ZSTACK_SCHEDULER_10019 = "ORG_ZSTACK_SCHEDULER_10019"; + + public static final String ORG_ZSTACK_SCHEDULER_10020 = "ORG_ZSTACK_SCHEDULER_10020"; + + public static final String ORG_ZSTACK_SCHEDULER_10021 = "ORG_ZSTACK_SCHEDULER_10021"; + + public static final String ORG_ZSTACK_SCHEDULER_10022 = "ORG_ZSTACK_SCHEDULER_10022"; + + public static final String ORG_ZSTACK_SCHEDULER_10023 = "ORG_ZSTACK_SCHEDULER_10023"; + + public static final String ORG_ZSTACK_SCHEDULER_10024 = "ORG_ZSTACK_SCHEDULER_10024"; + + public static final String ORG_ZSTACK_SCHEDULER_10025 = "ORG_ZSTACK_SCHEDULER_10025"; + + public static final String ORG_ZSTACK_SCHEDULER_10026 = "ORG_ZSTACK_SCHEDULER_10026"; + + public static final String ORG_ZSTACK_SCHEDULER_10027 = "ORG_ZSTACK_SCHEDULER_10027"; + + public static final String ORG_ZSTACK_SCHEDULER_10028 = "ORG_ZSTACK_SCHEDULER_10028"; + + public static final String ORG_ZSTACK_SCHEDULER_10029 = "ORG_ZSTACK_SCHEDULER_10029"; + + public static final String ORG_ZSTACK_SCHEDULER_10030 = "ORG_ZSTACK_SCHEDULER_10030"; + + public static final String ORG_ZSTACK_SCHEDULER_10031 = "ORG_ZSTACK_SCHEDULER_10031"; + + public static final String ORG_ZSTACK_SCHEDULER_10032 = "ORG_ZSTACK_SCHEDULER_10032"; + + public static final String ORG_ZSTACK_SCHEDULER_10033 = "ORG_ZSTACK_SCHEDULER_10033"; + + public static final String ORG_ZSTACK_SCHEDULER_10034 = "ORG_ZSTACK_SCHEDULER_10034"; + + public static final String ORG_ZSTACK_SCHEDULER_10035 = "ORG_ZSTACK_SCHEDULER_10035"; + + public static final String ORG_ZSTACK_SCHEDULER_10036 = "ORG_ZSTACK_SCHEDULER_10036"; + + public static final String ORG_ZSTACK_SCHEDULER_10037 = "ORG_ZSTACK_SCHEDULER_10037"; + + public static final String ORG_ZSTACK_SCHEDULER_10038 = "ORG_ZSTACK_SCHEDULER_10038"; + + public static final String ORG_ZSTACK_SCHEDULER_10039 = "ORG_ZSTACK_SCHEDULER_10039"; + + public static final String ORG_ZSTACK_SCHEDULER_10040 = "ORG_ZSTACK_SCHEDULER_10040"; + + public static final String ORG_ZSTACK_SCHEDULER_10041 = "ORG_ZSTACK_SCHEDULER_10041"; + + public static final String ORG_ZSTACK_SCHEDULER_10042 = "ORG_ZSTACK_SCHEDULER_10042"; + + public static final String ORG_ZSTACK_SCHEDULER_10043 = "ORG_ZSTACK_SCHEDULER_10043"; + + public static final String ORG_ZSTACK_SCHEDULER_10044 = "ORG_ZSTACK_SCHEDULER_10044"; + + public static final String ORG_ZSTACK_SCHEDULER_10045 = "ORG_ZSTACK_SCHEDULER_10045"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10000 = "ORG_ZSTACK_HYBRID_CORE_10000"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10001 = "ORG_ZSTACK_HYBRID_CORE_10001"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10002 = "ORG_ZSTACK_HYBRID_CORE_10002"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10003 = "ORG_ZSTACK_HYBRID_CORE_10003"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10004 = "ORG_ZSTACK_HYBRID_CORE_10004"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10005 = "ORG_ZSTACK_HYBRID_CORE_10005"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10006 = "ORG_ZSTACK_HYBRID_CORE_10006"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10007 = "ORG_ZSTACK_HYBRID_CORE_10007"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10008 = "ORG_ZSTACK_HYBRID_CORE_10008"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10009 = "ORG_ZSTACK_HYBRID_CORE_10009"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10010 = "ORG_ZSTACK_HYBRID_CORE_10010"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10011 = "ORG_ZSTACK_HYBRID_CORE_10011"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10012 = "ORG_ZSTACK_HYBRID_CORE_10012"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10013 = "ORG_ZSTACK_HYBRID_CORE_10013"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10014 = "ORG_ZSTACK_HYBRID_CORE_10014"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10015 = "ORG_ZSTACK_HYBRID_CORE_10015"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10016 = "ORG_ZSTACK_HYBRID_CORE_10016"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10017 = "ORG_ZSTACK_HYBRID_CORE_10017"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10018 = "ORG_ZSTACK_HYBRID_CORE_10018"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10019 = "ORG_ZSTACK_HYBRID_CORE_10019"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10020 = "ORG_ZSTACK_HYBRID_CORE_10020"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10021 = "ORG_ZSTACK_HYBRID_CORE_10021"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10022 = "ORG_ZSTACK_HYBRID_CORE_10022"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10023 = "ORG_ZSTACK_HYBRID_CORE_10023"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10024 = "ORG_ZSTACK_HYBRID_CORE_10024"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10025 = "ORG_ZSTACK_HYBRID_CORE_10025"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10026 = "ORG_ZSTACK_HYBRID_CORE_10026"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10027 = "ORG_ZSTACK_HYBRID_CORE_10027"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10028 = "ORG_ZSTACK_HYBRID_CORE_10028"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10029 = "ORG_ZSTACK_HYBRID_CORE_10029"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10030 = "ORG_ZSTACK_HYBRID_CORE_10030"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10031 = "ORG_ZSTACK_HYBRID_CORE_10031"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10032 = "ORG_ZSTACK_HYBRID_CORE_10032"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10033 = "ORG_ZSTACK_HYBRID_CORE_10033"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10034 = "ORG_ZSTACK_HYBRID_CORE_10034"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10035 = "ORG_ZSTACK_HYBRID_CORE_10035"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10036 = "ORG_ZSTACK_HYBRID_CORE_10036"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10037 = "ORG_ZSTACK_HYBRID_CORE_10037"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10038 = "ORG_ZSTACK_HYBRID_CORE_10038"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10039 = "ORG_ZSTACK_HYBRID_CORE_10039"; + + public static final String ORG_ZSTACK_HYBRID_CORE_10040 = "ORG_ZSTACK_HYBRID_CORE_10040"; + + public static final String ORG_ZSTACK_IDENTITY_RBAC_10000 = "ORG_ZSTACK_IDENTITY_RBAC_10000"; + + public static final String ORG_ZSTACK_IDENTITY_RBAC_10001 = "ORG_ZSTACK_IDENTITY_RBAC_10001"; + + public static final String ORG_ZSTACK_IDENTITY_RBAC_10002 = "ORG_ZSTACK_IDENTITY_RBAC_10002"; + + public static final String ORG_ZSTACK_IDENTITY_RBAC_10003 = "ORG_ZSTACK_IDENTITY_RBAC_10003"; + + public static final String ORG_ZSTACK_IDENTITY_RBAC_10004 = "ORG_ZSTACK_IDENTITY_RBAC_10004"; + + public static final String ORG_ZSTACK_IDENTITY_RBAC_10005 = "ORG_ZSTACK_IDENTITY_RBAC_10005"; + + public static final String ORG_ZSTACK_IDENTITY_RBAC_10006 = "ORG_ZSTACK_IDENTITY_RBAC_10006"; + + public static final String ORG_ZSTACK_IDENTITY_RBAC_10007 = "ORG_ZSTACK_IDENTITY_RBAC_10007"; + + public static final String ORG_ZSTACK_IDENTITY_RBAC_10008 = "ORG_ZSTACK_IDENTITY_RBAC_10008"; + + public static final String ORG_ZSTACK_IDENTITY_RBAC_10009 = "ORG_ZSTACK_IDENTITY_RBAC_10009"; + + public static final String ORG_ZSTACK_IDENTITY_RBAC_10010 = "ORG_ZSTACK_IDENTITY_RBAC_10010"; + + public static final String ORG_ZSTACK_IDENTITY_RBAC_10011 = "ORG_ZSTACK_IDENTITY_RBAC_10011"; + + public static final String ORG_ZSTACK_IDENTITY_RBAC_10012 = "ORG_ZSTACK_IDENTITY_RBAC_10012"; + + public static final String ORG_ZSTACK_IDENTITY_RBAC_10013 = "ORG_ZSTACK_IDENTITY_RBAC_10013"; + + public static final String ORG_ZSTACK_ZWATCH_MYSQL_10000 = "ORG_ZSTACK_ZWATCH_MYSQL_10000"; + + public static final String ORG_ZSTACK_ZWATCH_MYSQL_10001 = "ORG_ZSTACK_ZWATCH_MYSQL_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_SHAREDBLOCK_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_SHAREDBLOCK_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_SHAREDBLOCK_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_SHAREDBLOCK_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10000 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10001 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10002 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10003 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10003"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10004 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10004"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10005 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10005"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10006 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10006"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10007 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10007"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10008 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10008"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10009 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10009"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10010 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10010"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10011 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10011"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10012 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10012"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10013 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10013"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10014 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10014"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10015 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10015"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10016 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10016"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10017 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10017"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10018 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10018"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10019 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10019"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10020 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10020"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10021 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10021"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10022 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10022"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10023 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10023"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10024 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10024"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10025 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10025"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10026 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10026"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10027 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10027"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10028 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10028"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10029 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10029"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10030 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10030"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10031 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10031"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10032 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10032"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10033 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10033"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10034 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10034"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10035 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10035"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10036 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10036"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10037 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10037"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10038 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10038"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10039 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10039"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10040 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10040"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10041 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10041"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10042 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10042"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10043 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10043"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10044 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10044"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10045 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10045"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10046 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10046"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10047 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10047"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10048 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10048"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10049 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10049"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10050 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10050"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10051 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10051"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10052 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10052"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10053 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10053"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10054 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10054"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_FLAT_10055 = "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10055"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10000 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10001 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10002 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10003 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10003"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10004 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10004"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10005 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10005"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10006 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10006"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10007 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10007"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10008 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10008"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10009 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10009"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10010 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10010"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10011 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10011"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10012 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10012"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10013 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10013"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10014 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10014"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10015 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10015"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10016 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10016"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10017 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10017"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10018 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10018"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10019 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10019"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10020 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10020"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10021 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10021"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10022 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10022"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10023 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10023"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10024 = "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10024"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10000 = "ORG_ZSTACK_STORAGE_DEVICE_10000"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10001 = "ORG_ZSTACK_STORAGE_DEVICE_10001"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10002 = "ORG_ZSTACK_STORAGE_DEVICE_10002"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10003 = "ORG_ZSTACK_STORAGE_DEVICE_10003"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10004 = "ORG_ZSTACK_STORAGE_DEVICE_10004"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10005 = "ORG_ZSTACK_STORAGE_DEVICE_10005"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10006 = "ORG_ZSTACK_STORAGE_DEVICE_10006"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10007 = "ORG_ZSTACK_STORAGE_DEVICE_10007"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10008 = "ORG_ZSTACK_STORAGE_DEVICE_10008"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10009 = "ORG_ZSTACK_STORAGE_DEVICE_10009"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10010 = "ORG_ZSTACK_STORAGE_DEVICE_10010"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10011 = "ORG_ZSTACK_STORAGE_DEVICE_10011"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10012 = "ORG_ZSTACK_STORAGE_DEVICE_10012"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10013 = "ORG_ZSTACK_STORAGE_DEVICE_10013"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10014 = "ORG_ZSTACK_STORAGE_DEVICE_10014"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10015 = "ORG_ZSTACK_STORAGE_DEVICE_10015"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10016 = "ORG_ZSTACK_STORAGE_DEVICE_10016"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10017 = "ORG_ZSTACK_STORAGE_DEVICE_10017"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10018 = "ORG_ZSTACK_STORAGE_DEVICE_10018"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10019 = "ORG_ZSTACK_STORAGE_DEVICE_10019"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10020 = "ORG_ZSTACK_STORAGE_DEVICE_10020"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10021 = "ORG_ZSTACK_STORAGE_DEVICE_10021"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10022 = "ORG_ZSTACK_STORAGE_DEVICE_10022"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10023 = "ORG_ZSTACK_STORAGE_DEVICE_10023"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10024 = "ORG_ZSTACK_STORAGE_DEVICE_10024"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10025 = "ORG_ZSTACK_STORAGE_DEVICE_10025"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10026 = "ORG_ZSTACK_STORAGE_DEVICE_10026"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10027 = "ORG_ZSTACK_STORAGE_DEVICE_10027"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10028 = "ORG_ZSTACK_STORAGE_DEVICE_10028"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10029 = "ORG_ZSTACK_STORAGE_DEVICE_10029"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10030 = "ORG_ZSTACK_STORAGE_DEVICE_10030"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10031 = "ORG_ZSTACK_STORAGE_DEVICE_10031"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10032 = "ORG_ZSTACK_STORAGE_DEVICE_10032"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10033 = "ORG_ZSTACK_STORAGE_DEVICE_10033"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10034 = "ORG_ZSTACK_STORAGE_DEVICE_10034"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10035 = "ORG_ZSTACK_STORAGE_DEVICE_10035"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10036 = "ORG_ZSTACK_STORAGE_DEVICE_10036"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10037 = "ORG_ZSTACK_STORAGE_DEVICE_10037"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10038 = "ORG_ZSTACK_STORAGE_DEVICE_10038"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10039 = "ORG_ZSTACK_STORAGE_DEVICE_10039"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10040 = "ORG_ZSTACK_STORAGE_DEVICE_10040"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10041 = "ORG_ZSTACK_STORAGE_DEVICE_10041"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10042 = "ORG_ZSTACK_STORAGE_DEVICE_10042"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10043 = "ORG_ZSTACK_STORAGE_DEVICE_10043"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10044 = "ORG_ZSTACK_STORAGE_DEVICE_10044"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10045 = "ORG_ZSTACK_STORAGE_DEVICE_10045"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10046 = "ORG_ZSTACK_STORAGE_DEVICE_10046"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10047 = "ORG_ZSTACK_STORAGE_DEVICE_10047"; + + public static final String ORG_ZSTACK_STORAGE_DEVICE_10048 = "ORG_ZSTACK_STORAGE_DEVICE_10048"; + + public static final String ORG_ZSTACK_CORE_GC_10000 = "ORG_ZSTACK_CORE_GC_10000"; + + public static final String ORG_ZSTACK_CORE_GC_10001 = "ORG_ZSTACK_CORE_GC_10001"; + + public static final String ORG_ZSTACK_CORE_CONFIG_10000 = "ORG_ZSTACK_CORE_CONFIG_10000"; + + public static final String ORG_ZSTACK_CORE_CONFIG_10001 = "ORG_ZSTACK_CORE_CONFIG_10001"; + + public static final String ORG_ZSTACK_CORE_CONFIG_10002 = "ORG_ZSTACK_CORE_CONFIG_10002"; + + public static final String ORG_ZSTACK_CORE_CONFIG_10003 = "ORG_ZSTACK_CORE_CONFIG_10003"; + + public static final String ORG_ZSTACK_CORE_CONFIG_10004 = "ORG_ZSTACK_CORE_CONFIG_10004"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_DISK_10000 = "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10000"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_DISK_10001 = "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10001"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_DISK_10002 = "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10002"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_DISK_10003 = "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10003"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_DISK_10004 = "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10004"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_DISK_10005 = "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10005"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_DISK_10006 = "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10006"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_DISK_10007 = "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10007"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_DISK_10008 = "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10008"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_DISK_10009 = "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10009"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_DISK_10010 = "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10010"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_DISK_10011 = "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10011"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_DISK_10012 = "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10012"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_DISK_10013 = "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10013"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_DISK_10014 = "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10014"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_DISK_10015 = "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10015"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_DISK_10016 = "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10016"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_DISK_10017 = "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10017"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_DISK_10018 = "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10018"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_DISK_10019 = "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10019"; + + public static final String ORG_ZSTACK_LOGINCONTROL_10000 = "ORG_ZSTACK_LOGINCONTROL_10000"; + + public static final String ORG_ZSTACK_LOGINCONTROL_10001 = "ORG_ZSTACK_LOGINCONTROL_10001"; + + public static final String ORG_ZSTACK_LOGINCONTROL_10002 = "ORG_ZSTACK_LOGINCONTROL_10002"; + + public static final String ORG_ZSTACK_LOGINCONTROL_10003 = "ORG_ZSTACK_LOGINCONTROL_10003"; + + public static final String ORG_ZSTACK_LOGINCONTROL_10004 = "ORG_ZSTACK_LOGINCONTROL_10004"; + + public static final String ORG_ZSTACK_LOGINCONTROL_10005 = "ORG_ZSTACK_LOGINCONTROL_10005"; + + public static final String ORG_ZSTACK_LOGINCONTROL_10006 = "ORG_ZSTACK_LOGINCONTROL_10006"; + + public static final String ORG_ZSTACK_LOGINCONTROL_10007 = "ORG_ZSTACK_LOGINCONTROL_10007"; + + public static final String ORG_ZSTACK_LOGINCONTROL_10008 = "ORG_ZSTACK_LOGINCONTROL_10008"; + + public static final String ORG_ZSTACK_LOGINCONTROL_10009 = "ORG_ZSTACK_LOGINCONTROL_10009"; + + public static final String ORG_ZSTACK_LOGINCONTROL_10010 = "ORG_ZSTACK_LOGINCONTROL_10010"; + + public static final String ORG_ZSTACK_LOGINCONTROL_10011 = "ORG_ZSTACK_LOGINCONTROL_10011"; + + public static final String ORG_ZSTACK_LOGINCONTROL_10012 = "ORG_ZSTACK_LOGINCONTROL_10012"; + + public static final String ORG_ZSTACK_LOGINCONTROL_10013 = "ORG_ZSTACK_LOGINCONTROL_10013"; + + public static final String ORG_ZSTACK_LOGINCONTROL_10014 = "ORG_ZSTACK_LOGINCONTROL_10014"; + + public static final String ORG_ZSTACK_LOGINCONTROL_10015 = "ORG_ZSTACK_LOGINCONTROL_10015"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10000 = "ORG_ZSTACK_STORAGE_PRIMARY_10000"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10001 = "ORG_ZSTACK_STORAGE_PRIMARY_10001"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10002 = "ORG_ZSTACK_STORAGE_PRIMARY_10002"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10003 = "ORG_ZSTACK_STORAGE_PRIMARY_10003"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10004 = "ORG_ZSTACK_STORAGE_PRIMARY_10004"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10005 = "ORG_ZSTACK_STORAGE_PRIMARY_10005"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10006 = "ORG_ZSTACK_STORAGE_PRIMARY_10006"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10007 = "ORG_ZSTACK_STORAGE_PRIMARY_10007"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10008 = "ORG_ZSTACK_STORAGE_PRIMARY_10008"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10009 = "ORG_ZSTACK_STORAGE_PRIMARY_10009"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10010 = "ORG_ZSTACK_STORAGE_PRIMARY_10010"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10011 = "ORG_ZSTACK_STORAGE_PRIMARY_10011"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10012 = "ORG_ZSTACK_STORAGE_PRIMARY_10012"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10013 = "ORG_ZSTACK_STORAGE_PRIMARY_10013"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10014 = "ORG_ZSTACK_STORAGE_PRIMARY_10014"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10015 = "ORG_ZSTACK_STORAGE_PRIMARY_10015"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10016 = "ORG_ZSTACK_STORAGE_PRIMARY_10016"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10017 = "ORG_ZSTACK_STORAGE_PRIMARY_10017"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10018 = "ORG_ZSTACK_STORAGE_PRIMARY_10018"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10019 = "ORG_ZSTACK_STORAGE_PRIMARY_10019"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10020 = "ORG_ZSTACK_STORAGE_PRIMARY_10020"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10021 = "ORG_ZSTACK_STORAGE_PRIMARY_10021"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10022 = "ORG_ZSTACK_STORAGE_PRIMARY_10022"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10023 = "ORG_ZSTACK_STORAGE_PRIMARY_10023"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10024 = "ORG_ZSTACK_STORAGE_PRIMARY_10024"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10025 = "ORG_ZSTACK_STORAGE_PRIMARY_10025"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10026 = "ORG_ZSTACK_STORAGE_PRIMARY_10026"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10027 = "ORG_ZSTACK_STORAGE_PRIMARY_10027"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10028 = "ORG_ZSTACK_STORAGE_PRIMARY_10028"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10029 = "ORG_ZSTACK_STORAGE_PRIMARY_10029"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10030 = "ORG_ZSTACK_STORAGE_PRIMARY_10030"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10031 = "ORG_ZSTACK_STORAGE_PRIMARY_10031"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10032 = "ORG_ZSTACK_STORAGE_PRIMARY_10032"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10033 = "ORG_ZSTACK_STORAGE_PRIMARY_10033"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10034 = "ORG_ZSTACK_STORAGE_PRIMARY_10034"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10035 = "ORG_ZSTACK_STORAGE_PRIMARY_10035"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10036 = "ORG_ZSTACK_STORAGE_PRIMARY_10036"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10037 = "ORG_ZSTACK_STORAGE_PRIMARY_10037"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10038 = "ORG_ZSTACK_STORAGE_PRIMARY_10038"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10039 = "ORG_ZSTACK_STORAGE_PRIMARY_10039"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10040 = "ORG_ZSTACK_STORAGE_PRIMARY_10040"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10041 = "ORG_ZSTACK_STORAGE_PRIMARY_10041"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10042 = "ORG_ZSTACK_STORAGE_PRIMARY_10042"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10043 = "ORG_ZSTACK_STORAGE_PRIMARY_10043"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10044 = "ORG_ZSTACK_STORAGE_PRIMARY_10044"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10045 = "ORG_ZSTACK_STORAGE_PRIMARY_10045"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10046 = "ORG_ZSTACK_STORAGE_PRIMARY_10046"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10047 = "ORG_ZSTACK_STORAGE_PRIMARY_10047"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10048 = "ORG_ZSTACK_STORAGE_PRIMARY_10048"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10049 = "ORG_ZSTACK_STORAGE_PRIMARY_10049"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10050 = "ORG_ZSTACK_STORAGE_PRIMARY_10050"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10051 = "ORG_ZSTACK_STORAGE_PRIMARY_10051"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_10052 = "ORG_ZSTACK_STORAGE_PRIMARY_10052"; + + public static final String ORG_ZSTACK_CORE_ENCRYPT_10000 = "ORG_ZSTACK_CORE_ENCRYPT_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_NETWORKSERVICE_SLB_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_NETWORKSERVICE_SLB_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_NETWORKSERVICE_SLB_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_NETWORKSERVICE_SLB_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_NETWORKSERVICE_SLB_10002 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_NETWORKSERVICE_SLB_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_NETWORKSERVICE_SLB_10003 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_NETWORKSERVICE_SLB_10003"; + + public static final String ORG_ZSTACK_KVM_XMLHOOK_10000 = "ORG_ZSTACK_KVM_XMLHOOK_10000"; + + public static final String ORG_ZSTACK_KVM_XMLHOOK_10001 = "ORG_ZSTACK_KVM_XMLHOOK_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10000 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10001 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10002 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10003 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10003"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10004 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10004"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10005 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10005"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10006 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10006"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10007 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10007"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10008 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10008"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10009 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10009"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10010 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10010"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10011 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10011"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10012 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10012"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10013 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10013"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10014 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10014"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10015 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10015"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10016 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10016"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10017 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10017"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10018 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10018"; + + public static final String ORG_ZSTACK_ACL_10000 = "ORG_ZSTACK_ACL_10000"; + + public static final String ORG_ZSTACK_ACL_10001 = "ORG_ZSTACK_ACL_10001"; + + public static final String ORG_ZSTACK_ACL_10002 = "ORG_ZSTACK_ACL_10002"; + + public static final String ORG_ZSTACK_ACL_10003 = "ORG_ZSTACK_ACL_10003"; + + public static final String ORG_ZSTACK_ACL_10004 = "ORG_ZSTACK_ACL_10004"; + + public static final String ORG_ZSTACK_ACL_10005 = "ORG_ZSTACK_ACL_10005"; + + public static final String ORG_ZSTACK_ACL_10006 = "ORG_ZSTACK_ACL_10006"; + + public static final String ORG_ZSTACK_ACL_10007 = "ORG_ZSTACK_ACL_10007"; + + public static final String ORG_ZSTACK_ACL_10008 = "ORG_ZSTACK_ACL_10008"; + + public static final String ORG_ZSTACK_ACL_10009 = "ORG_ZSTACK_ACL_10009"; + + public static final String ORG_ZSTACK_ACL_10010 = "ORG_ZSTACK_ACL_10010"; + + public static final String ORG_ZSTACK_ACL_10011 = "ORG_ZSTACK_ACL_10011"; + + public static final String ORG_ZSTACK_ACL_10012 = "ORG_ZSTACK_ACL_10012"; + + public static final String ORG_ZSTACK_ACL_10013 = "ORG_ZSTACK_ACL_10013"; + + public static final String ORG_ZSTACK_ACL_10014 = "ORG_ZSTACK_ACL_10014"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_DATABASEBACKUP_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_DATABASEBACKUP_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_DATABASEBACKUP_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_DATABASEBACKUP_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_DATABASEBACKUP_10002 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_DATABASEBACKUP_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_DATABASEBACKUP_10003 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_DATABASEBACKUP_10003"; + + public static final String ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10000 = "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10000"; + + public static final String ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10001 = "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_ZWATCH_10000 = "ORG_ZSTACK_TEST_INTEGRATION_ZWATCH_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_ZWATCH_10001 = "ORG_ZSTACK_TEST_INTEGRATION_ZWATCH_10001"; + + public static final String ORG_ZSTACK_SCHEDULER_SNAPSHOT_10000 = "ORG_ZSTACK_SCHEDULER_SNAPSHOT_10000"; + + public static final String ORG_ZSTACK_SCHEDULER_SNAPSHOT_10001 = "ORG_ZSTACK_SCHEDULER_SNAPSHOT_10001"; + + public static final String ORG_ZSTACK_IAM2_API_10000 = "ORG_ZSTACK_IAM2_API_10000"; + + public static final String ORG_ZSTACK_IAM2_API_10001 = "ORG_ZSTACK_IAM2_API_10001"; + + public static final String ORG_ZSTACK_IAM2_API_10002 = "ORG_ZSTACK_IAM2_API_10002"; + + public static final String ORG_ZSTACK_IAM2_API_10003 = "ORG_ZSTACK_IAM2_API_10003"; + + public static final String ORG_ZSTACK_IAM2_API_10004 = "ORG_ZSTACK_IAM2_API_10004"; + + public static final String ORG_ZSTACK_IAM2_API_10005 = "ORG_ZSTACK_IAM2_API_10005"; + + public static final String ORG_ZSTACK_IAM2_API_10006 = "ORG_ZSTACK_IAM2_API_10006"; + + public static final String ORG_ZSTACK_IAM2_API_10007 = "ORG_ZSTACK_IAM2_API_10007"; + + public static final String ORG_ZSTACK_IAM2_API_10008 = "ORG_ZSTACK_IAM2_API_10008"; + + public static final String ORG_ZSTACK_IAM2_API_10009 = "ORG_ZSTACK_IAM2_API_10009"; + + public static final String ORG_ZSTACK_IAM2_API_10010 = "ORG_ZSTACK_IAM2_API_10010"; + + public static final String ORG_ZSTACK_IAM2_API_10011 = "ORG_ZSTACK_IAM2_API_10011"; + + public static final String ORG_ZSTACK_IAM2_API_10012 = "ORG_ZSTACK_IAM2_API_10012"; + + public static final String ORG_ZSTACK_IAM2_API_10013 = "ORG_ZSTACK_IAM2_API_10013"; + + public static final String ORG_ZSTACK_IAM2_API_10014 = "ORG_ZSTACK_IAM2_API_10014"; + + public static final String ORG_ZSTACK_IAM2_API_10015 = "ORG_ZSTACK_IAM2_API_10015"; + + public static final String ORG_ZSTACK_IAM2_API_10016 = "ORG_ZSTACK_IAM2_API_10016"; + + public static final String ORG_ZSTACK_IAM2_API_10017 = "ORG_ZSTACK_IAM2_API_10017"; + + public static final String ORG_ZSTACK_IAM2_API_10018 = "ORG_ZSTACK_IAM2_API_10018"; + + public static final String ORG_ZSTACK_IAM2_API_10019 = "ORG_ZSTACK_IAM2_API_10019"; + + public static final String ORG_ZSTACK_IAM2_API_10020 = "ORG_ZSTACK_IAM2_API_10020"; + + public static final String ORG_ZSTACK_IAM2_API_10021 = "ORG_ZSTACK_IAM2_API_10021"; + + public static final String ORG_ZSTACK_IAM2_API_10022 = "ORG_ZSTACK_IAM2_API_10022"; + + public static final String ORG_ZSTACK_IAM2_API_10023 = "ORG_ZSTACK_IAM2_API_10023"; + + public static final String ORG_ZSTACK_IAM2_API_10024 = "ORG_ZSTACK_IAM2_API_10024"; + + public static final String ORG_ZSTACK_IAM2_API_10025 = "ORG_ZSTACK_IAM2_API_10025"; + + public static final String ORG_ZSTACK_IAM2_API_10026 = "ORG_ZSTACK_IAM2_API_10026"; + + public static final String ORG_ZSTACK_IAM2_API_10027 = "ORG_ZSTACK_IAM2_API_10027"; + + public static final String ORG_ZSTACK_IAM2_API_10028 = "ORG_ZSTACK_IAM2_API_10028"; + + public static final String ORG_ZSTACK_IAM2_API_10029 = "ORG_ZSTACK_IAM2_API_10029"; + + public static final String ORG_ZSTACK_IAM2_API_10030 = "ORG_ZSTACK_IAM2_API_10030"; + + public static final String ORG_ZSTACK_IAM2_API_10031 = "ORG_ZSTACK_IAM2_API_10031"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_VMWARE_10000 = "ORG_ZSTACK_TEST_INTEGRATION_VMWARE_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_VMWARE_10001 = "ORG_ZSTACK_TEST_INTEGRATION_VMWARE_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_VMWARE_10002 = "ORG_ZSTACK_TEST_INTEGRATION_VMWARE_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_VMWARE_10003 = "ORG_ZSTACK_TEST_INTEGRATION_VMWARE_10003"; + + public static final String ORG_ZSTACK_TEST_AOP_10000 = "ORG_ZSTACK_TEST_AOP_10000"; + + public static final String ORG_ZSTACK_TEST_AOP_10001 = "ORG_ZSTACK_TEST_AOP_10001"; + + public static final String ORG_ZSTACK_TEST_AOP_10002 = "ORG_ZSTACK_TEST_AOP_10002"; + + public static final String ORG_ZSTACK_TEST_AOP_10003 = "ORG_ZSTACK_TEST_AOP_10003"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_HEADER_10000 = "ORG_ZSTACK_SUGONSDNCONTROLLER_HEADER_10000"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_HEADER_10001 = "ORG_ZSTACK_SUGONSDNCONTROLLER_HEADER_10001"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_HEADER_10002 = "ORG_ZSTACK_SUGONSDNCONTROLLER_HEADER_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10000 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10001 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10002 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10003 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10003"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10004 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10004"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10005 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10005"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10006 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10006"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10007 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10007"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10008 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10008"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10009 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10009"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10010 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10010"; + + public static final String ORG_ZSTACK_ZWATCH_MIGRATEDB_10000 = "ORG_ZSTACK_ZWATCH_MIGRATEDB_10000"; + + public static final String ORG_ZSTACK_ZWATCH_MIGRATEDB_10001 = "ORG_ZSTACK_ZWATCH_MIGRATEDB_10001"; + + public static final String ORG_ZSTACK_ZWATCH_MIGRATEDB_10002 = "ORG_ZSTACK_ZWATCH_MIGRATEDB_10002"; + + public static final String ORG_ZSTACK_ZWATCH_MIGRATEDB_10003 = "ORG_ZSTACK_ZWATCH_MIGRATEDB_10003"; + + public static final String ORG_ZSTACK_ZWATCH_MIGRATEDB_10004 = "ORG_ZSTACK_ZWATCH_MIGRATEDB_10004"; + + public static final String ORG_ZSTACK_ZWATCH_MIGRATEDB_10005 = "ORG_ZSTACK_ZWATCH_MIGRATEDB_10005"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10000 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10000"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10001 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10001"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10002 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10002"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10003 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10003"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10004 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10004"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10005 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10005"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10006 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10006"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10007 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10007"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10008 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10008"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10009 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10009"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10010 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10010"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10011 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10011"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10012 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10012"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10013 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10013"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10014 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10014"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10015 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10015"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10016 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10016"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10017 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10017"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10018 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10018"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10019 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10019"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10020 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10020"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10021 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10021"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10022 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10022"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10023 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10023"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10024 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10024"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10025 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10025"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10026 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10026"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10027 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10027"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10028 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10028"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10029 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10029"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10030 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10030"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10031 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10031"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10032 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10032"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10033 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10033"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10034 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10034"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10035 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10035"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10036 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10036"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10037 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10037"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10038 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10038"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10039 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10039"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10040 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10040"; + + public static final String ORG_ZSTACK_COMPUTE_OVS_10000 = "ORG_ZSTACK_COMPUTE_OVS_10000"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10000 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10000"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10001 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10001"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10002 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10002"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10003 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10003"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10004 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10004"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10005 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10005"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10006 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10006"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10007 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10007"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10008 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10008"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10009 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10009"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10010 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10010"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10011 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10011"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10012 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10012"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10013 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10013"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10014 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10014"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10015 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10015"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10016 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10016"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10017 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10017"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10018 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10018"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10019 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10019"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10020 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10020"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10021 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10021"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10022 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10022"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10023 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10023"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10024 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10024"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10025 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10025"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10026 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10026"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10027 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10027"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10028 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10028"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10029 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10029"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10030 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10030"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10031 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10031"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10032 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10032"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10033 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10033"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10034 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10034"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10035 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10035"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10036 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10036"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10037 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10037"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10038 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10038"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10039 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10039"; + + public static final String ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10040 = "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10040"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10000 = "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10000"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10001 = "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10001"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10002 = "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10002"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10003 = "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10003"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10004 = "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10004"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10005 = "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10005"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10006 = "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10006"; + + public static final String ORG_ZSTACK_PORTAL_MANAGEMENTNODE_10000 = "ORG_ZSTACK_PORTAL_MANAGEMENTNODE_10000"; + + public static final String ORG_ZSTACK_MTTYDEVICE_10000 = "ORG_ZSTACK_MTTYDEVICE_10000"; + + public static final String ORG_ZSTACK_MTTYDEVICE_10001 = "ORG_ZSTACK_MTTYDEVICE_10001"; + + public static final String ORG_ZSTACK_MTTYDEVICE_10002 = "ORG_ZSTACK_MTTYDEVICE_10002"; + + public static final String ORG_ZSTACK_MTTYDEVICE_10003 = "ORG_ZSTACK_MTTYDEVICE_10003"; + + public static final String ORG_ZSTACK_MTTYDEVICE_10004 = "ORG_ZSTACK_MTTYDEVICE_10004"; + + public static final String ORG_ZSTACK_GUESTTOOLS_KVM_10000 = "ORG_ZSTACK_GUESTTOOLS_KVM_10000"; + + public static final String ORG_ZSTACK_GUESTTOOLS_KVM_10001 = "ORG_ZSTACK_GUESTTOOLS_KVM_10001"; + + public static final String ORG_ZSTACK_GUESTTOOLS_KVM_10002 = "ORG_ZSTACK_GUESTTOOLS_KVM_10002"; + + public static final String ORG_ZSTACK_GUESTTOOLS_KVM_10003 = "ORG_ZSTACK_GUESTTOOLS_KVM_10003"; + + public static final String ORG_ZSTACK_GUESTTOOLS_KVM_10004 = "ORG_ZSTACK_GUESTTOOLS_KVM_10004"; + + public static final String ORG_ZSTACK_GUESTTOOLS_KVM_10005 = "ORG_ZSTACK_GUESTTOOLS_KVM_10005"; + + public static final String ORG_ZSTACK_GUESTTOOLS_KVM_10006 = "ORG_ZSTACK_GUESTTOOLS_KVM_10006"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10000 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10000"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10001 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10001"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10002 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10002"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10003 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10003"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10004 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10004"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10005 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10005"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10006 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10006"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10007 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10007"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10008 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10008"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10009 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10009"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10010 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10010"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10011 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10011"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10012 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10012"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10013 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10013"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10014 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10014"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10015 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10015"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10016 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10016"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10017 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10017"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10018 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10018"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10019 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10019"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10020 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10020"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10021 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10021"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10022 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10022"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10023 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10023"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10024 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10024"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10025 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10025"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10026 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10026"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10027 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10027"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10028 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10028"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10029 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10029"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10030 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10030"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10031 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10031"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10032 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10032"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10033 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10033"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10034 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10034"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10035 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10035"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10036 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10036"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10037 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10037"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10038 = "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10038"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_PRIMARY_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_PRIMARY_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_PRIMARY_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_PRIMARY_10001"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_ACTIVEALARM_10000 = "ORG_ZSTACK_ZWATCH_ALARM_ACTIVEALARM_10000"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10000 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10000"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10001 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10001"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10002 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10002"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10003 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10003"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10004 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10004"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10005 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10005"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10006 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10006"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10007 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10007"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10008 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10008"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10009 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10009"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10010 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10010"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10011 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10011"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10012 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10012"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10013 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10013"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10014 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10014"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10015 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10015"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10016 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10016"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10017 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10017"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10018 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10018"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10019 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10019"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10020 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10020"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10021 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10021"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10022 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10022"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10023 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10023"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10024 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10024"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10025 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10025"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10026 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10026"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SMP_10027 = "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10027"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_IAM2_10000 = "ORG_ZSTACK_TEST_INTEGRATION_IAM2_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_IAM2_10001 = "ORG_ZSTACK_TEST_INTEGRATION_IAM2_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_IAM2_10002 = "ORG_ZSTACK_TEST_INTEGRATION_IAM2_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_IAM2_10003 = "ORG_ZSTACK_TEST_INTEGRATION_IAM2_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_IAM2_10004 = "ORG_ZSTACK_TEST_INTEGRATION_IAM2_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_IAM2_10005 = "ORG_ZSTACK_TEST_INTEGRATION_IAM2_10005"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_IAM2_10006 = "ORG_ZSTACK_TEST_INTEGRATION_IAM2_10006"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_IAM2_10007 = "ORG_ZSTACK_TEST_INTEGRATION_IAM2_10007"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_IAM2_10008 = "ORG_ZSTACK_TEST_INTEGRATION_IAM2_10008"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_IAM2_10009 = "ORG_ZSTACK_TEST_INTEGRATION_IAM2_10009"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_IAM2_10010 = "ORG_ZSTACK_TEST_INTEGRATION_IAM2_10010"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_IAM2_10011 = "ORG_ZSTACK_TEST_INTEGRATION_IAM2_10011"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_IAM2_10012 = "ORG_ZSTACK_TEST_INTEGRATION_IAM2_10012"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_IAM2_10013 = "ORG_ZSTACK_TEST_INTEGRATION_IAM2_10013"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_IAM2_10014 = "ORG_ZSTACK_TEST_INTEGRATION_IAM2_10014"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_IAM2_10015 = "ORG_ZSTACK_TEST_INTEGRATION_IAM2_10015"; + + public static final String ORG_ZSTACK_MEVOCO_10000 = "ORG_ZSTACK_MEVOCO_10000"; + + public static final String ORG_ZSTACK_MEVOCO_10001 = "ORG_ZSTACK_MEVOCO_10001"; + + public static final String ORG_ZSTACK_MEVOCO_10002 = "ORG_ZSTACK_MEVOCO_10002"; + + public static final String ORG_ZSTACK_MEVOCO_10003 = "ORG_ZSTACK_MEVOCO_10003"; + + public static final String ORG_ZSTACK_MEVOCO_10004 = "ORG_ZSTACK_MEVOCO_10004"; + + public static final String ORG_ZSTACK_MEVOCO_10005 = "ORG_ZSTACK_MEVOCO_10005"; + + public static final String ORG_ZSTACK_MEVOCO_10006 = "ORG_ZSTACK_MEVOCO_10006"; + + public static final String ORG_ZSTACK_MEVOCO_10007 = "ORG_ZSTACK_MEVOCO_10007"; + + public static final String ORG_ZSTACK_MEVOCO_10008 = "ORG_ZSTACK_MEVOCO_10008"; + + public static final String ORG_ZSTACK_MEVOCO_10009 = "ORG_ZSTACK_MEVOCO_10009"; + + public static final String ORG_ZSTACK_MEVOCO_10010 = "ORG_ZSTACK_MEVOCO_10010"; + + public static final String ORG_ZSTACK_MEVOCO_10011 = "ORG_ZSTACK_MEVOCO_10011"; + + public static final String ORG_ZSTACK_MEVOCO_10012 = "ORG_ZSTACK_MEVOCO_10012"; + + public static final String ORG_ZSTACK_MEVOCO_10013 = "ORG_ZSTACK_MEVOCO_10013"; + + public static final String ORG_ZSTACK_MEVOCO_10014 = "ORG_ZSTACK_MEVOCO_10014"; + + public static final String ORG_ZSTACK_MEVOCO_10015 = "ORG_ZSTACK_MEVOCO_10015"; + + public static final String ORG_ZSTACK_MEVOCO_10016 = "ORG_ZSTACK_MEVOCO_10016"; + + public static final String ORG_ZSTACK_MEVOCO_10017 = "ORG_ZSTACK_MEVOCO_10017"; + + public static final String ORG_ZSTACK_MEVOCO_10018 = "ORG_ZSTACK_MEVOCO_10018"; + + public static final String ORG_ZSTACK_MEVOCO_10019 = "ORG_ZSTACK_MEVOCO_10019"; + + public static final String ORG_ZSTACK_MEVOCO_10020 = "ORG_ZSTACK_MEVOCO_10020"; + + public static final String ORG_ZSTACK_MEVOCO_10021 = "ORG_ZSTACK_MEVOCO_10021"; + + public static final String ORG_ZSTACK_MEVOCO_10022 = "ORG_ZSTACK_MEVOCO_10022"; + + public static final String ORG_ZSTACK_MEVOCO_10023 = "ORG_ZSTACK_MEVOCO_10023"; + + public static final String ORG_ZSTACK_MEVOCO_10024 = "ORG_ZSTACK_MEVOCO_10024"; + + public static final String ORG_ZSTACK_MEVOCO_10025 = "ORG_ZSTACK_MEVOCO_10025"; + + public static final String ORG_ZSTACK_MEVOCO_10026 = "ORG_ZSTACK_MEVOCO_10026"; + + public static final String ORG_ZSTACK_MEVOCO_10027 = "ORG_ZSTACK_MEVOCO_10027"; + + public static final String ORG_ZSTACK_MEVOCO_10028 = "ORG_ZSTACK_MEVOCO_10028"; + + public static final String ORG_ZSTACK_MEVOCO_10029 = "ORG_ZSTACK_MEVOCO_10029"; + + public static final String ORG_ZSTACK_MEVOCO_10030 = "ORG_ZSTACK_MEVOCO_10030"; + + public static final String ORG_ZSTACK_MEVOCO_10031 = "ORG_ZSTACK_MEVOCO_10031"; + + public static final String ORG_ZSTACK_MEVOCO_10032 = "ORG_ZSTACK_MEVOCO_10032"; + + public static final String ORG_ZSTACK_MEVOCO_10033 = "ORG_ZSTACK_MEVOCO_10033"; + + public static final String ORG_ZSTACK_MEVOCO_10034 = "ORG_ZSTACK_MEVOCO_10034"; + + public static final String ORG_ZSTACK_MEVOCO_10035 = "ORG_ZSTACK_MEVOCO_10035"; + + public static final String ORG_ZSTACK_MEVOCO_10036 = "ORG_ZSTACK_MEVOCO_10036"; + + public static final String ORG_ZSTACK_MEVOCO_10037 = "ORG_ZSTACK_MEVOCO_10037"; + + public static final String ORG_ZSTACK_MEVOCO_10038 = "ORG_ZSTACK_MEVOCO_10038"; + + public static final String ORG_ZSTACK_MEVOCO_10039 = "ORG_ZSTACK_MEVOCO_10039"; + + public static final String ORG_ZSTACK_MEVOCO_10040 = "ORG_ZSTACK_MEVOCO_10040"; + + public static final String ORG_ZSTACK_MEVOCO_10041 = "ORG_ZSTACK_MEVOCO_10041"; + + public static final String ORG_ZSTACK_MEVOCO_10042 = "ORG_ZSTACK_MEVOCO_10042"; + + public static final String ORG_ZSTACK_MEVOCO_10043 = "ORG_ZSTACK_MEVOCO_10043"; + + public static final String ORG_ZSTACK_MEVOCO_10044 = "ORG_ZSTACK_MEVOCO_10044"; + + public static final String ORG_ZSTACK_MEVOCO_10045 = "ORG_ZSTACK_MEVOCO_10045"; + + public static final String ORG_ZSTACK_MEVOCO_10046 = "ORG_ZSTACK_MEVOCO_10046"; + + public static final String ORG_ZSTACK_MEVOCO_10047 = "ORG_ZSTACK_MEVOCO_10047"; + + public static final String ORG_ZSTACK_MEVOCO_10048 = "ORG_ZSTACK_MEVOCO_10048"; + + public static final String ORG_ZSTACK_MEVOCO_10049 = "ORG_ZSTACK_MEVOCO_10049"; + + public static final String ORG_ZSTACK_MEVOCO_10050 = "ORG_ZSTACK_MEVOCO_10050"; + + public static final String ORG_ZSTACK_MEVOCO_10051 = "ORG_ZSTACK_MEVOCO_10051"; + + public static final String ORG_ZSTACK_MEVOCO_10052 = "ORG_ZSTACK_MEVOCO_10052"; + + public static final String ORG_ZSTACK_MEVOCO_10053 = "ORG_ZSTACK_MEVOCO_10053"; + + public static final String ORG_ZSTACK_MEVOCO_10054 = "ORG_ZSTACK_MEVOCO_10054"; + + public static final String ORG_ZSTACK_MEVOCO_10055 = "ORG_ZSTACK_MEVOCO_10055"; + + public static final String ORG_ZSTACK_MEVOCO_10056 = "ORG_ZSTACK_MEVOCO_10056"; + + public static final String ORG_ZSTACK_MEVOCO_10057 = "ORG_ZSTACK_MEVOCO_10057"; + + public static final String ORG_ZSTACK_MEVOCO_10058 = "ORG_ZSTACK_MEVOCO_10058"; + + public static final String ORG_ZSTACK_MEVOCO_10059 = "ORG_ZSTACK_MEVOCO_10059"; + + public static final String ORG_ZSTACK_MEVOCO_10060 = "ORG_ZSTACK_MEVOCO_10060"; + + public static final String ORG_ZSTACK_MEVOCO_10061 = "ORG_ZSTACK_MEVOCO_10061"; + + public static final String ORG_ZSTACK_MEVOCO_10062 = "ORG_ZSTACK_MEVOCO_10062"; + + public static final String ORG_ZSTACK_MEVOCO_10063 = "ORG_ZSTACK_MEVOCO_10063"; + + public static final String ORG_ZSTACK_MEVOCO_10064 = "ORG_ZSTACK_MEVOCO_10064"; + + public static final String ORG_ZSTACK_MEVOCO_10065 = "ORG_ZSTACK_MEVOCO_10065"; + + public static final String ORG_ZSTACK_MEVOCO_10066 = "ORG_ZSTACK_MEVOCO_10066"; + + public static final String ORG_ZSTACK_MEVOCO_10067 = "ORG_ZSTACK_MEVOCO_10067"; + + public static final String ORG_ZSTACK_MEVOCO_10068 = "ORG_ZSTACK_MEVOCO_10068"; + + public static final String ORG_ZSTACK_MEVOCO_10069 = "ORG_ZSTACK_MEVOCO_10069"; + + public static final String ORG_ZSTACK_MEVOCO_10070 = "ORG_ZSTACK_MEVOCO_10070"; + + public static final String ORG_ZSTACK_MEVOCO_10071 = "ORG_ZSTACK_MEVOCO_10071"; + + public static final String ORG_ZSTACK_MEVOCO_10072 = "ORG_ZSTACK_MEVOCO_10072"; + + public static final String ORG_ZSTACK_MEVOCO_10073 = "ORG_ZSTACK_MEVOCO_10073"; + + public static final String ORG_ZSTACK_MEVOCO_10074 = "ORG_ZSTACK_MEVOCO_10074"; + + public static final String ORG_ZSTACK_MEVOCO_10075 = "ORG_ZSTACK_MEVOCO_10075"; + + public static final String ORG_ZSTACK_MEVOCO_10076 = "ORG_ZSTACK_MEVOCO_10076"; + + public static final String ORG_ZSTACK_MEVOCO_10077 = "ORG_ZSTACK_MEVOCO_10077"; + + public static final String ORG_ZSTACK_MEVOCO_10078 = "ORG_ZSTACK_MEVOCO_10078"; + + public static final String ORG_ZSTACK_MEVOCO_10079 = "ORG_ZSTACK_MEVOCO_10079"; + + public static final String ORG_ZSTACK_MEVOCO_10080 = "ORG_ZSTACK_MEVOCO_10080"; + + public static final String ORG_ZSTACK_MEVOCO_10081 = "ORG_ZSTACK_MEVOCO_10081"; + + public static final String ORG_ZSTACK_MEVOCO_10082 = "ORG_ZSTACK_MEVOCO_10082"; + + public static final String ORG_ZSTACK_MEVOCO_10083 = "ORG_ZSTACK_MEVOCO_10083"; + + public static final String ORG_ZSTACK_MEVOCO_10084 = "ORG_ZSTACK_MEVOCO_10084"; + + public static final String ORG_ZSTACK_MEVOCO_10085 = "ORG_ZSTACK_MEVOCO_10085"; + + public static final String ORG_ZSTACK_MEVOCO_10086 = "ORG_ZSTACK_MEVOCO_10086"; + + public static final String ORG_ZSTACK_MEVOCO_10087 = "ORG_ZSTACK_MEVOCO_10087"; + + public static final String ORG_ZSTACK_MEVOCO_10088 = "ORG_ZSTACK_MEVOCO_10088"; + + public static final String ORG_ZSTACK_MEVOCO_10089 = "ORG_ZSTACK_MEVOCO_10089"; + + public static final String ORG_ZSTACK_MEVOCO_10090 = "ORG_ZSTACK_MEVOCO_10090"; + + public static final String ORG_ZSTACK_MEVOCO_10091 = "ORG_ZSTACK_MEVOCO_10091"; + + public static final String ORG_ZSTACK_MEVOCO_10092 = "ORG_ZSTACK_MEVOCO_10092"; + + public static final String ORG_ZSTACK_MEVOCO_10093 = "ORG_ZSTACK_MEVOCO_10093"; + + public static final String ORG_ZSTACK_MEVOCO_10094 = "ORG_ZSTACK_MEVOCO_10094"; + + public static final String ORG_ZSTACK_MEVOCO_10095 = "ORG_ZSTACK_MEVOCO_10095"; + + public static final String ORG_ZSTACK_MEVOCO_10096 = "ORG_ZSTACK_MEVOCO_10096"; + + public static final String ORG_ZSTACK_MEVOCO_10097 = "ORG_ZSTACK_MEVOCO_10097"; + + public static final String ORG_ZSTACK_MEVOCO_10098 = "ORG_ZSTACK_MEVOCO_10098"; + + public static final String ORG_ZSTACK_MEVOCO_10099 = "ORG_ZSTACK_MEVOCO_10099"; + + public static final String ORG_ZSTACK_MEVOCO_10100 = "ORG_ZSTACK_MEVOCO_10100"; + + public static final String ORG_ZSTACK_MEVOCO_10101 = "ORG_ZSTACK_MEVOCO_10101"; + + public static final String ORG_ZSTACK_MEVOCO_10102 = "ORG_ZSTACK_MEVOCO_10102"; + + public static final String ORG_ZSTACK_MEVOCO_10103 = "ORG_ZSTACK_MEVOCO_10103"; + + public static final String ORG_ZSTACK_MEVOCO_10104 = "ORG_ZSTACK_MEVOCO_10104"; + + public static final String ORG_ZSTACK_MEVOCO_10105 = "ORG_ZSTACK_MEVOCO_10105"; + + public static final String ORG_ZSTACK_MEVOCO_10106 = "ORG_ZSTACK_MEVOCO_10106"; + + public static final String ORG_ZSTACK_MEVOCO_10107 = "ORG_ZSTACK_MEVOCO_10107"; + + public static final String ORG_ZSTACK_MEVOCO_10108 = "ORG_ZSTACK_MEVOCO_10108"; + + public static final String ORG_ZSTACK_MEVOCO_10109 = "ORG_ZSTACK_MEVOCO_10109"; + + public static final String ORG_ZSTACK_MEVOCO_10110 = "ORG_ZSTACK_MEVOCO_10110"; + + public static final String ORG_ZSTACK_MEVOCO_10111 = "ORG_ZSTACK_MEVOCO_10111"; + + public static final String ORG_ZSTACK_MEVOCO_10112 = "ORG_ZSTACK_MEVOCO_10112"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10000 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10000"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10001 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10001"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10002 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10002"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10003 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10003"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10004 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10004"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10005 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10005"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10006 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10006"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10007 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10007"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10008 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10008"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10009 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10009"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10010 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10010"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10011 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10011"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10012 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10012"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10013 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10013"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10014 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10014"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10015 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10015"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10016 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10016"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10017 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10017"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10018 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10018"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10019 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10019"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10020 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10020"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10021 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10021"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10022 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10022"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10023 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10023"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10024 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10024"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10025 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10025"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10026 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10026"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10027 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10027"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10028 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10028"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10029 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10029"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10030 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10030"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10031 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10031"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10032 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10032"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10033 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10033"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10034 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10034"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10035 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10035"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10036 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10036"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10037 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10037"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10038 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10038"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10039 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10039"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10040 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10040"; + + public static final String ORG_ZSTACK_COMPUTE_EMULATORPINNING_10000 = "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10000"; + + public static final String ORG_ZSTACK_COMPUTE_EMULATORPINNING_10001 = "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10000 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10001 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10002 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10003 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10004 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10005 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10005"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10006 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10006"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10007 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10007"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10008 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10008"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10009 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10009"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10010 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10010"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10011 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10011"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10012 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10012"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10013 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10013"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10014 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10014"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10015 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10015"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10016 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10016"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10017 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10017"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10018 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10018"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10019 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10019"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10020 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10020"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10021 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10021"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10022 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10022"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10023 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10023"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10024 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10024"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10025 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10025"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10026 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10026"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10027 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10027"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10028 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10028"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10029 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10029"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10030 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10030"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10031 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10031"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10032 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10032"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10033 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10033"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10034 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10034"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10035 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10035"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10036 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10036"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10037 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10037"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10038 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10038"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10039 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10039"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10040 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10040"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10041 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10041"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10042 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10042"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10043 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10043"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10044 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10044"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10045 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10045"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10046 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10046"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10047 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10047"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10048 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10048"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10049 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10049"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10050 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10050"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10051 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10051"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10052 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10052"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10053 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10053"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10054 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10054"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10055 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10055"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10056 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10056"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10057 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10057"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10058 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10058"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10059 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10059"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10060 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10060"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10061 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10061"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10062 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10062"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10063 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10063"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10064 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10064"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10065 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10065"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10066 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10066"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10067 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10067"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10068 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10068"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10069 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10069"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10070 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10070"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10071 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10071"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10072 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10072"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10073 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10073"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10074 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10074"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10075 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10075"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10076 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10076"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10077 = "ORG_ZSTACK_TEST_INTEGRATION_CRYPTO_10077"; + + public static final String ORG_ZSTACK_ZQL_AST_VISITORS_PLUGIN_10000 = "ORG_ZSTACK_ZQL_AST_VISITORS_PLUGIN_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_IMAGESTORE_IMAGECACHE_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_IMAGESTORE_IMAGECACHE_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_IMAGESTORE_IMAGECACHE_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_IMAGESTORE_IMAGECACHE_10001"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10000 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10000"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10001 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10001"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10002 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10002"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10003 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10003"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10004 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10004"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10005 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10005"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10006 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10006"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10007 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10007"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10008 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10008"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10009 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10009"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10010 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10010"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10011 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10011"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10012 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10012"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10013 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10013"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10014 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10014"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10015 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10015"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10016 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10016"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10017 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10017"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10018 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10018"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10019 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10019"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10020 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10020"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10021 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10021"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10022 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10022"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10023 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10023"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10024 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10024"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10025 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10025"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10026 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10026"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10027 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10027"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10028 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10028"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10029 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10029"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10030 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10030"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10031 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10031"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10032 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10032"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10033 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10033"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10034 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10034"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10035 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10035"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10036 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10036"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10037 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10037"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10038 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10038"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10039 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10039"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10040 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10040"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10041 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10041"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10042 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10042"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10043 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10043"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10044 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10044"; + + public static final String ORG_ZSTACK_VPC_HA_VPCHAGC_10000 = "ORG_ZSTACK_VPC_HA_VPCHAGC_10000"; + + public static final String ORG_ZSTACK_VPC_HA_VPCHAGC_10001 = "ORG_ZSTACK_VPC_HA_VPCHAGC_10001"; + + public static final String ORG_ZSTACK_TICKET_IAM2_API_10000 = "ORG_ZSTACK_TICKET_IAM2_API_10000"; + + public static final String ORG_ZSTACK_TICKET_IAM2_API_10001 = "ORG_ZSTACK_TICKET_IAM2_API_10001"; + + public static final String ORG_ZSTACK_TICKET_IAM2_API_10002 = "ORG_ZSTACK_TICKET_IAM2_API_10002"; + + public static final String ORG_ZSTACK_TICKET_IAM2_API_10003 = "ORG_ZSTACK_TICKET_IAM2_API_10003"; + + public static final String ORG_ZSTACK_TICKET_IAM2_API_10004 = "ORG_ZSTACK_TICKET_IAM2_API_10004"; + + public static final String ORG_ZSTACK_TICKET_IAM2_API_10005 = "ORG_ZSTACK_TICKET_IAM2_API_10005"; + + public static final String ORG_ZSTACK_TICKET_IAM2_API_10006 = "ORG_ZSTACK_TICKET_IAM2_API_10006"; + + public static final String ORG_ZSTACK_TICKET_IAM2_API_10007 = "ORG_ZSTACK_TICKET_IAM2_API_10007"; + + public static final String ORG_ZSTACK_TICKET_IAM2_API_10008 = "ORG_ZSTACK_TICKET_IAM2_API_10008"; + + public static final String ORG_ZSTACK_TICKET_IAM2_API_10009 = "ORG_ZSTACK_TICKET_IAM2_API_10009"; + + public static final String ORG_ZSTACK_TICKET_IAM2_API_10010 = "ORG_ZSTACK_TICKET_IAM2_API_10010"; + + public static final String ORG_ZSTACK_TICKET_IAM2_API_10011 = "ORG_ZSTACK_TICKET_IAM2_API_10011"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10000 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10001 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10002 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10003 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10003"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10004 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10004"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10005 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10005"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10006 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10006"; + + public static final String ORG_ZSTACK_COMPUTE_VM_VIRTIO_10000 = "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10000"; + + public static final String ORG_ZSTACK_COMPUTE_VM_VIRTIO_10001 = "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10001"; + + public static final String ORG_ZSTACK_COMPUTE_VM_VIRTIO_10002 = "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10002"; + + public static final String ORG_ZSTACK_COMPUTE_VM_VIRTIO_10003 = "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10003"; + + public static final String ORG_ZSTACK_COMPUTE_VM_VIRTIO_10004 = "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10004"; + + public static final String ORG_ZSTACK_COMPUTE_VM_VIRTIO_10005 = "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10005"; + + public static final String ORG_ZSTACK_PORTMIRROR_10000 = "ORG_ZSTACK_PORTMIRROR_10000"; + + public static final String ORG_ZSTACK_PORTMIRROR_10001 = "ORG_ZSTACK_PORTMIRROR_10001"; + + public static final String ORG_ZSTACK_PORTMIRROR_10002 = "ORG_ZSTACK_PORTMIRROR_10002"; + + public static final String ORG_ZSTACK_PORTMIRROR_10003 = "ORG_ZSTACK_PORTMIRROR_10003"; + + public static final String ORG_ZSTACK_PORTMIRROR_10004 = "ORG_ZSTACK_PORTMIRROR_10004"; + + public static final String ORG_ZSTACK_PORTMIRROR_10005 = "ORG_ZSTACK_PORTMIRROR_10005"; + + public static final String ORG_ZSTACK_PORTMIRROR_10006 = "ORG_ZSTACK_PORTMIRROR_10006"; + + public static final String ORG_ZSTACK_PORTMIRROR_10007 = "ORG_ZSTACK_PORTMIRROR_10007"; + + public static final String ORG_ZSTACK_PORTMIRROR_10008 = "ORG_ZSTACK_PORTMIRROR_10008"; + + public static final String ORG_ZSTACK_PORTMIRROR_10009 = "ORG_ZSTACK_PORTMIRROR_10009"; + + public static final String ORG_ZSTACK_PORTMIRROR_10010 = "ORG_ZSTACK_PORTMIRROR_10010"; + + public static final String ORG_ZSTACK_PORTMIRROR_10011 = "ORG_ZSTACK_PORTMIRROR_10011"; + + public static final String ORG_ZSTACK_PORTMIRROR_10012 = "ORG_ZSTACK_PORTMIRROR_10012"; + + public static final String ORG_ZSTACK_PORTMIRROR_10013 = "ORG_ZSTACK_PORTMIRROR_10013"; + + public static final String ORG_ZSTACK_PORTMIRROR_10014 = "ORG_ZSTACK_PORTMIRROR_10014"; + + public static final String ORG_ZSTACK_PORTMIRROR_10015 = "ORG_ZSTACK_PORTMIRROR_10015"; + + public static final String ORG_ZSTACK_PORTMIRROR_10016 = "ORG_ZSTACK_PORTMIRROR_10016"; + + public static final String ORG_ZSTACK_PORTMIRROR_10017 = "ORG_ZSTACK_PORTMIRROR_10017"; + + public static final String ORG_ZSTACK_PORTMIRROR_10018 = "ORG_ZSTACK_PORTMIRROR_10018"; + + public static final String ORG_ZSTACK_PORTMIRROR_10019 = "ORG_ZSTACK_PORTMIRROR_10019"; + + public static final String ORG_ZSTACK_V2V_VMWARE_10000 = "ORG_ZSTACK_V2V_VMWARE_10000"; + + public static final String ORG_ZSTACK_V2V_VMWARE_10001 = "ORG_ZSTACK_V2V_VMWARE_10001"; + + public static final String ORG_ZSTACK_V2V_VMWARE_10002 = "ORG_ZSTACK_V2V_VMWARE_10002"; + + public static final String ORG_ZSTACK_V2V_VMWARE_10003 = "ORG_ZSTACK_V2V_VMWARE_10003"; + + public static final String ORG_ZSTACK_V2V_VMWARE_10004 = "ORG_ZSTACK_V2V_VMWARE_10004"; + + public static final String ORG_ZSTACK_V2V_VMWARE_10005 = "ORG_ZSTACK_V2V_VMWARE_10005"; + + public static final String ORG_ZSTACK_V2V_VMWARE_10006 = "ORG_ZSTACK_V2V_VMWARE_10006"; + + public static final String ORG_ZSTACK_V2V_VMWARE_10007 = "ORG_ZSTACK_V2V_VMWARE_10007"; + + public static final String ORG_ZSTACK_V2V_VMWARE_10008 = "ORG_ZSTACK_V2V_VMWARE_10008"; + + public static final String ORG_ZSTACK_V2V_VMWARE_10009 = "ORG_ZSTACK_V2V_VMWARE_10009"; + + public static final String ORG_ZSTACK_V2V_VMWARE_10010 = "ORG_ZSTACK_V2V_VMWARE_10010"; + + public static final String ORG_ZSTACK_V2V_VMWARE_10011 = "ORG_ZSTACK_V2V_VMWARE_10011"; + + public static final String ORG_ZSTACK_V2V_VMWARE_10012 = "ORG_ZSTACK_V2V_VMWARE_10012"; + + public static final String ORG_ZSTACK_V2V_VMWARE_10013 = "ORG_ZSTACK_V2V_VMWARE_10013"; + + public static final String ORG_ZSTACK_V2V_VMWARE_10014 = "ORG_ZSTACK_V2V_VMWARE_10014"; + + public static final String ORG_ZSTACK_V2V_VMWARE_10015 = "ORG_ZSTACK_V2V_VMWARE_10015"; + + public static final String ORG_ZSTACK_V2V_VMWARE_10016 = "ORG_ZSTACK_V2V_VMWARE_10016"; + + public static final String ORG_ZSTACK_V2V_VMWARE_10017 = "ORG_ZSTACK_V2V_VMWARE_10017"; + + public static final String ORG_ZSTACK_LDAP_EXTERNALSEARCH_10000 = "ORG_ZSTACK_LDAP_EXTERNALSEARCH_10000"; + + public static final String ORG_ZSTACK_IDENTITY_10000 = "ORG_ZSTACK_IDENTITY_10000"; + + public static final String ORG_ZSTACK_IDENTITY_10001 = "ORG_ZSTACK_IDENTITY_10001"; + + public static final String ORG_ZSTACK_IDENTITY_10002 = "ORG_ZSTACK_IDENTITY_10002"; + + public static final String ORG_ZSTACK_IDENTITY_10003 = "ORG_ZSTACK_IDENTITY_10003"; + + public static final String ORG_ZSTACK_IDENTITY_10004 = "ORG_ZSTACK_IDENTITY_10004"; + + public static final String ORG_ZSTACK_IDENTITY_10005 = "ORG_ZSTACK_IDENTITY_10005"; + + public static final String ORG_ZSTACK_IDENTITY_10006 = "ORG_ZSTACK_IDENTITY_10006"; + + public static final String ORG_ZSTACK_IDENTITY_10007 = "ORG_ZSTACK_IDENTITY_10007"; + + public static final String ORG_ZSTACK_IDENTITY_10008 = "ORG_ZSTACK_IDENTITY_10008"; + + public static final String ORG_ZSTACK_IDENTITY_10009 = "ORG_ZSTACK_IDENTITY_10009"; + + public static final String ORG_ZSTACK_IDENTITY_10010 = "ORG_ZSTACK_IDENTITY_10010"; + + public static final String ORG_ZSTACK_IDENTITY_10011 = "ORG_ZSTACK_IDENTITY_10011"; + + public static final String ORG_ZSTACK_IDENTITY_10012 = "ORG_ZSTACK_IDENTITY_10012"; + + public static final String ORG_ZSTACK_IDENTITY_10013 = "ORG_ZSTACK_IDENTITY_10013"; + + public static final String ORG_ZSTACK_IDENTITY_10014 = "ORG_ZSTACK_IDENTITY_10014"; + + public static final String ORG_ZSTACK_IDENTITY_10015 = "ORG_ZSTACK_IDENTITY_10015"; + + public static final String ORG_ZSTACK_IDENTITY_10016 = "ORG_ZSTACK_IDENTITY_10016"; + + public static final String ORG_ZSTACK_IDENTITY_10017 = "ORG_ZSTACK_IDENTITY_10017"; + + public static final String ORG_ZSTACK_IDENTITY_10018 = "ORG_ZSTACK_IDENTITY_10018"; + + public static final String ORG_ZSTACK_IDENTITY_10019 = "ORG_ZSTACK_IDENTITY_10019"; + + public static final String ORG_ZSTACK_IDENTITY_10020 = "ORG_ZSTACK_IDENTITY_10020"; + + public static final String ORG_ZSTACK_IDENTITY_10021 = "ORG_ZSTACK_IDENTITY_10021"; + + public static final String ORG_ZSTACK_IDENTITY_10022 = "ORG_ZSTACK_IDENTITY_10022"; + + public static final String ORG_ZSTACK_IDENTITY_10023 = "ORG_ZSTACK_IDENTITY_10023"; + + public static final String ORG_ZSTACK_IDENTITY_10024 = "ORG_ZSTACK_IDENTITY_10024"; + + public static final String ORG_ZSTACK_IDENTITY_10025 = "ORG_ZSTACK_IDENTITY_10025"; + + public static final String ORG_ZSTACK_IDENTITY_10026 = "ORG_ZSTACK_IDENTITY_10026"; + + public static final String ORG_ZSTACK_IDENTITY_10027 = "ORG_ZSTACK_IDENTITY_10027"; + + public static final String ORG_ZSTACK_IDENTITY_10028 = "ORG_ZSTACK_IDENTITY_10028"; + + public static final String ORG_ZSTACK_IDENTITY_10029 = "ORG_ZSTACK_IDENTITY_10029"; + + public static final String ORG_ZSTACK_IDENTITY_10030 = "ORG_ZSTACK_IDENTITY_10030"; + + public static final String ORG_ZSTACK_IDENTITY_10031 = "ORG_ZSTACK_IDENTITY_10031"; + + public static final String ORG_ZSTACK_IDENTITY_10032 = "ORG_ZSTACK_IDENTITY_10032"; + + public static final String ORG_ZSTACK_IDENTITY_10033 = "ORG_ZSTACK_IDENTITY_10033"; + + public static final String ORG_ZSTACK_IDENTITY_10034 = "ORG_ZSTACK_IDENTITY_10034"; + + public static final String ORG_ZSTACK_IDENTITY_10035 = "ORG_ZSTACK_IDENTITY_10035"; + + public static final String ORG_ZSTACK_IDENTITY_10036 = "ORG_ZSTACK_IDENTITY_10036"; + + public static final String ORG_ZSTACK_IDENTITY_10037 = "ORG_ZSTACK_IDENTITY_10037"; + + public static final String ORG_ZSTACK_IDENTITY_10038 = "ORG_ZSTACK_IDENTITY_10038"; + + public static final String ORG_ZSTACK_IDENTITY_10039 = "ORG_ZSTACK_IDENTITY_10039"; + + public static final String ORG_ZSTACK_IDENTITY_10040 = "ORG_ZSTACK_IDENTITY_10040"; + + public static final String ORG_ZSTACK_IDENTITY_10041 = "ORG_ZSTACK_IDENTITY_10041"; + + public static final String ORG_ZSTACK_IDENTITY_10042 = "ORG_ZSTACK_IDENTITY_10042"; + + public static final String ORG_ZSTACK_IDENTITY_10043 = "ORG_ZSTACK_IDENTITY_10043"; + + public static final String ORG_ZSTACK_IDENTITY_10044 = "ORG_ZSTACK_IDENTITY_10044"; + + public static final String ORG_ZSTACK_IDENTITY_10045 = "ORG_ZSTACK_IDENTITY_10045"; + + public static final String ORG_ZSTACK_IDENTITY_10046 = "ORG_ZSTACK_IDENTITY_10046"; + + public static final String ORG_ZSTACK_IDENTITY_10047 = "ORG_ZSTACK_IDENTITY_10047"; + + public static final String ORG_ZSTACK_IDENTITY_10048 = "ORG_ZSTACK_IDENTITY_10048"; + + public static final String ORG_ZSTACK_IDENTITY_10049 = "ORG_ZSTACK_IDENTITY_10049"; + + public static final String ORG_ZSTACK_IDENTITY_10050 = "ORG_ZSTACK_IDENTITY_10050"; + + public static final String ORG_ZSTACK_IDENTITY_10051 = "ORG_ZSTACK_IDENTITY_10051"; + + public static final String ORG_ZSTACK_IDENTITY_10052 = "ORG_ZSTACK_IDENTITY_10052"; + + public static final String ORG_ZSTACK_IDENTITY_10053 = "ORG_ZSTACK_IDENTITY_10053"; + + public static final String ORG_ZSTACK_IDENTITY_10054 = "ORG_ZSTACK_IDENTITY_10054"; + + public static final String ORG_ZSTACK_IDENTITY_10055 = "ORG_ZSTACK_IDENTITY_10055"; + + public static final String ORG_ZSTACK_IDENTITY_10056 = "ORG_ZSTACK_IDENTITY_10056"; + + public static final String ORG_ZSTACK_IDENTITY_10057 = "ORG_ZSTACK_IDENTITY_10057"; + + public static final String ORG_ZSTACK_IDENTITY_10058 = "ORG_ZSTACK_IDENTITY_10058"; + + public static final String ORG_ZSTACK_IDENTITY_10059 = "ORG_ZSTACK_IDENTITY_10059"; + + public static final String ORG_ZSTACK_IDENTITY_10060 = "ORG_ZSTACK_IDENTITY_10060"; + + public static final String ORG_ZSTACK_IDENTITY_10061 = "ORG_ZSTACK_IDENTITY_10061"; + + public static final String ORG_ZSTACK_IDENTITY_10062 = "ORG_ZSTACK_IDENTITY_10062"; + + public static final String ORG_ZSTACK_IDENTITY_10063 = "ORG_ZSTACK_IDENTITY_10063"; + + public static final String ORG_ZSTACK_IDENTITY_10064 = "ORG_ZSTACK_IDENTITY_10064"; + + public static final String ORG_ZSTACK_IDENTITY_10065 = "ORG_ZSTACK_IDENTITY_10065"; + + public static final String ORG_ZSTACK_IDENTITY_10066 = "ORG_ZSTACK_IDENTITY_10066"; + + public static final String ORG_ZSTACK_IDENTITY_10067 = "ORG_ZSTACK_IDENTITY_10067"; + + public static final String ORG_ZSTACK_IDENTITY_10068 = "ORG_ZSTACK_IDENTITY_10068"; + + public static final String ORG_ZSTACK_IDENTITY_10069 = "ORG_ZSTACK_IDENTITY_10069"; + + public static final String ORG_ZSTACK_IDENTITY_10070 = "ORG_ZSTACK_IDENTITY_10070"; + + public static final String ORG_ZSTACK_IDENTITY_10071 = "ORG_ZSTACK_IDENTITY_10071"; + + public static final String ORG_ZSTACK_IDENTITY_10072 = "ORG_ZSTACK_IDENTITY_10072"; + + public static final String ORG_ZSTACK_CAS_10000 = "ORG_ZSTACK_CAS_10000"; + + public static final String ORG_ZSTACK_CAS_10001 = "ORG_ZSTACK_CAS_10001"; + + public static final String ORG_ZSTACK_CAS_10002 = "ORG_ZSTACK_CAS_10002"; + + public static final String ORG_ZSTACK_CAS_10003 = "ORG_ZSTACK_CAS_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10002 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10003 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10004 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10005 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10005"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10006 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10006"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10007 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10007"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10008 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10008"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10009 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10009"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10010 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10010"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10011 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10011"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10012 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10012"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10013 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HA_10013"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10000 = "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10000"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10001 = "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10001"; + + public static final String ORG_ZSTACK_IAM2_CONTAINER_10000 = "ORG_ZSTACK_IAM2_CONTAINER_10000"; + + public static final String ORG_ZSTACK_IAM2_CONTAINER_10001 = "ORG_ZSTACK_IAM2_CONTAINER_10001"; + + public static final String ORG_ZSTACK_IAM2_CONTAINER_10002 = "ORG_ZSTACK_IAM2_CONTAINER_10002"; + + public static final String ORG_ZSTACK_IAM2_CONTAINER_10003 = "ORG_ZSTACK_IAM2_CONTAINER_10003"; + + public static final String ORG_ZSTACK_IAM2_CONTAINER_10004 = "ORG_ZSTACK_IAM2_CONTAINER_10004"; + + public static final String ORG_ZSTACK_IAM2_CONTAINER_10005 = "ORG_ZSTACK_IAM2_CONTAINER_10005"; + + public static final String ORG_ZSTACK_IAM2_CONTAINER_10006 = "ORG_ZSTACK_IAM2_CONTAINER_10006"; + + public static final String ORG_ZSTACK_IAM2_CONTAINER_10007 = "ORG_ZSTACK_IAM2_CONTAINER_10007"; + + public static final String ORG_ZSTACK_IAM2_CONTAINER_10008 = "ORG_ZSTACK_IAM2_CONTAINER_10008"; + + public static final String ORG_ZSTACK_IAM2_CONTAINER_10009 = "ORG_ZSTACK_IAM2_CONTAINER_10009"; + + public static final String ORG_ZSTACK_CORE_SALT_10000 = "ORG_ZSTACK_CORE_SALT_10000"; + + public static final String ORG_ZSTACK_CORE_SALT_10001 = "ORG_ZSTACK_CORE_SALT_10001"; + + public static final String ORG_ZSTACK_CORE_SALT_10002 = "ORG_ZSTACK_CORE_SALT_10002"; + + public static final String ORG_ZSTACK_CORE_SALT_10003 = "ORG_ZSTACK_CORE_SALT_10003"; + + public static final String ORG_ZSTACK_CORE_SALT_10004 = "ORG_ZSTACK_CORE_SALT_10004"; + + public static final String ORG_ZSTACK_MEDIATOR_10000 = "ORG_ZSTACK_MEDIATOR_10000"; + + public static final String ORG_ZSTACK_MEDIATOR_10001 = "ORG_ZSTACK_MEDIATOR_10001"; + + public static final String ORG_ZSTACK_MEDIATOR_10002 = "ORG_ZSTACK_MEDIATOR_10002"; + + public static final String ORG_ZSTACK_MEDIATOR_10003 = "ORG_ZSTACK_MEDIATOR_10003"; + + public static final String ORG_ZSTACK_MEDIATOR_10004 = "ORG_ZSTACK_MEDIATOR_10004"; + + public static final String ORG_ZSTACK_MEDIATOR_10005 = "ORG_ZSTACK_MEDIATOR_10005"; + + public static final String ORG_ZSTACK_MEDIATOR_10006 = "ORG_ZSTACK_MEDIATOR_10006"; + + public static final String ORG_ZSTACK_MEDIATOR_10007 = "ORG_ZSTACK_MEDIATOR_10007"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_DINGTALK_10000 = "ORG_ZSTACK_SNS_PLATFORM_DINGTALK_10000"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10000 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10000"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10001 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10001"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10002 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10002"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10003 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10003"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10004 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10004"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10005 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10005"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10006 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10006"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10007 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10007"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10008 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10008"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10009 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10009"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10010 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10010"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10011 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10011"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10012 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10012"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10013 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10013"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10014 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10014"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10015 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10015"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10016 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10016"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10017 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10017"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10018 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10018"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10019 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10019"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10020 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10020"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10021 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10021"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10022 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10022"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10023 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10023"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10024 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10024"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10025 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10025"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10026 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10026"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10027 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10027"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10028 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10028"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10029 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10029"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10030 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10030"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10031 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10031"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10032 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10032"; + + public static final String ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10033 = "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10033"; + + public static final String ORG_ZSTACK_UTILS_10000 = "ORG_ZSTACK_UTILS_10000"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10000 = "ORG_ZSTACK_ZWATCH_ALARM_10000"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10001 = "ORG_ZSTACK_ZWATCH_ALARM_10001"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10002 = "ORG_ZSTACK_ZWATCH_ALARM_10002"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10003 = "ORG_ZSTACK_ZWATCH_ALARM_10003"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10004 = "ORG_ZSTACK_ZWATCH_ALARM_10004"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10005 = "ORG_ZSTACK_ZWATCH_ALARM_10005"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10006 = "ORG_ZSTACK_ZWATCH_ALARM_10006"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10007 = "ORG_ZSTACK_ZWATCH_ALARM_10007"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10008 = "ORG_ZSTACK_ZWATCH_ALARM_10008"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10009 = "ORG_ZSTACK_ZWATCH_ALARM_10009"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10010 = "ORG_ZSTACK_ZWATCH_ALARM_10010"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10011 = "ORG_ZSTACK_ZWATCH_ALARM_10011"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10012 = "ORG_ZSTACK_ZWATCH_ALARM_10012"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10013 = "ORG_ZSTACK_ZWATCH_ALARM_10013"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10014 = "ORG_ZSTACK_ZWATCH_ALARM_10014"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10015 = "ORG_ZSTACK_ZWATCH_ALARM_10015"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10016 = "ORG_ZSTACK_ZWATCH_ALARM_10016"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10017 = "ORG_ZSTACK_ZWATCH_ALARM_10017"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10018 = "ORG_ZSTACK_ZWATCH_ALARM_10018"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10019 = "ORG_ZSTACK_ZWATCH_ALARM_10019"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10020 = "ORG_ZSTACK_ZWATCH_ALARM_10020"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10021 = "ORG_ZSTACK_ZWATCH_ALARM_10021"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10022 = "ORG_ZSTACK_ZWATCH_ALARM_10022"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10023 = "ORG_ZSTACK_ZWATCH_ALARM_10023"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10024 = "ORG_ZSTACK_ZWATCH_ALARM_10024"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10025 = "ORG_ZSTACK_ZWATCH_ALARM_10025"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10026 = "ORG_ZSTACK_ZWATCH_ALARM_10026"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10027 = "ORG_ZSTACK_ZWATCH_ALARM_10027"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10028 = "ORG_ZSTACK_ZWATCH_ALARM_10028"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_10029 = "ORG_ZSTACK_ZWATCH_ALARM_10029"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_FEISHU_10000 = "ORG_ZSTACK_SNS_PLATFORM_FEISHU_10000"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_10000 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_10000"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_10001 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_10001"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_10002 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_10002"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_10003 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_10003"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_10004 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_10004"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_10005 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_10005"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_10006 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_10006"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_10007 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_10007"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_10008 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_10008"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_10009 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_10009"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_10010 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_10010"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_10011 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_10011"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_10012 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_10012"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_10013 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_10013"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_10014 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_10014"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_10015 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_10015"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_10016 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_10016"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_10017 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_10017"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_10018 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_10018"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_10019 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_10019"; + + public static final String ORG_ZSTACK_HYBRID_ACCOUNT_10000 = "ORG_ZSTACK_HYBRID_ACCOUNT_10000"; + + public static final String ORG_ZSTACK_HYBRID_ACCOUNT_10001 = "ORG_ZSTACK_HYBRID_ACCOUNT_10001"; + + public static final String ORG_ZSTACK_HYBRID_ACCOUNT_10002 = "ORG_ZSTACK_HYBRID_ACCOUNT_10002"; + + public static final String ORG_ZSTACK_HYBRID_ACCOUNT_10003 = "ORG_ZSTACK_HYBRID_ACCOUNT_10003"; + + public static final String ORG_ZSTACK_HYBRID_ACCOUNT_10004 = "ORG_ZSTACK_HYBRID_ACCOUNT_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_OVF_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_OVF_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_OVF_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_OVF_10001"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10000 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10000"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10001 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10001"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10002 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10002"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10003 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10003"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10004 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10004"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10005 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10005"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10006 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10006"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10007 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10007"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10008 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10008"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10009 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10009"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10010 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10010"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10011 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10011"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10012 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10012"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10013 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10013"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10014 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10014"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10015 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10015"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10016 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10016"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10017 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10017"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10018 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10018"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10019 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10019"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10020 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10020"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10021 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10021"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10022 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10022"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10023 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10023"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10024 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10024"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10025 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10025"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10026 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10026"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10027 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10027"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10028 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10028"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10029 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10029"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10030 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10030"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10031 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10031"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10032 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10032"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10033 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10033"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10034 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10034"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10000 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10000"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10001 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10001"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10002 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10002"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10003 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10003"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10004 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10004"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10005 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10005"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10006 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10006"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10007 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10007"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10008 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10008"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10009 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10009"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10010 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10010"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10011 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10011"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10012 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10012"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10013 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10013"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10014 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10014"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10015 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10015"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10016 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10016"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10017 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10017"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10018 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10018"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10019 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10019"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10020 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10020"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10021 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10021"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10022 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10022"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10023 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10023"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10024 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10024"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10025 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10025"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10026 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10026"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10027 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10027"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10028 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10028"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10029 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10029"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10030 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10030"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10031 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10031"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10032 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10032"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10033 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10033"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10034 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10034"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10035 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10035"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10036 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10036"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10037 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10037"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10038 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10038"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10039 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10039"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10040 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10040"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10041 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10041"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10042 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10042"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10043 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10043"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10044 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10044"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10045 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10045"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10046 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10046"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10047 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10047"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10048 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10048"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10049 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10049"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10050 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10050"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10051 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10051"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10052 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10052"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10053 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10053"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10054 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10054"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10055 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10055"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10056 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10056"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10057 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10057"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10058 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10058"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10059 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10059"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10060 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10060"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10061 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10061"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10062 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10062"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10063 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10063"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10064 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10064"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10065 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10065"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10066 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10066"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10067 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10067"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10068 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10068"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10069 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10069"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10070 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10070"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10071 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10071"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10072 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10072"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10073 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10073"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10074 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10074"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10075 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10075"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10076 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10076"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10077 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10077"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10078 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10078"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10079 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10079"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10080 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10080"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10081 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10081"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10082 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10082"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_10083 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_10083"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10000 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10000"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10001 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10001"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10002 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10002"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10003 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10003"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10004 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10004"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10005 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10005"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10006 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10006"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10007 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10007"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10008 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10008"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10009 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10009"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10010 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10010"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10011 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10011"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10012 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10012"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10013 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10013"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10014 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10014"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10015 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10015"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10016 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10016"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10017 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10017"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10018 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10018"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10019 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10019"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10020 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10020"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10021 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10021"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10022 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10022"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10023 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10023"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10024 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10024"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10025 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10025"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10026 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10026"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10027 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10027"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10028 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10028"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10029 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10029"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10030 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10030"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10031 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10031"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10032 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10032"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10033 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10033"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10034 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10034"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10035 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10035"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10036 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10036"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10037 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10037"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10038 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10038"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10039 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10039"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10040 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10040"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10041 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10041"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10042 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10042"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10043 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10043"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10044 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10044"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10045 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10045"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10046 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10046"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10047 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10047"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10048 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10048"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10049 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10049"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10050 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10050"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10051 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10051"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10052 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10052"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10053 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10053"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10054 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10054"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10055 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10055"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10056 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10056"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10057 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10057"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10058 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10058"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10059 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10059"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10060 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10060"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10061 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10061"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10062 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10062"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10063 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10063"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10064 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10064"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10065 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10065"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10066 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10066"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10067 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10067"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10068 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10068"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10069 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10069"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10070 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10070"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10071 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10071"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10072 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10072"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10073 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10073"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10074 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10074"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10075 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10075"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10076 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10076"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10077 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10077"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10078 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10078"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10079 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10079"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10080 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10080"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10081 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10081"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10082 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10082"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10083 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10083"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10084 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10084"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10085 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10085"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10086 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10086"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10000 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10000"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10001 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10001"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10002 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10002"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10003 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10003"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10004 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10004"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10005 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10005"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10006 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10006"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10007 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10007"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10008 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10008"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10009 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10009"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10010 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10010"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10011 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10011"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10012 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10012"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10013 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10013"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10014 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10014"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10015 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10015"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10016 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10016"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10017 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10017"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10018 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10018"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10019 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10019"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10020 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10020"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10021 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10021"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10022 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10022"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10023 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10023"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10024 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10024"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10025 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10025"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10026 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10026"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10027 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10027"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10028 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10028"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10029 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10029"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10030 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10030"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10031 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10031"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10032 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10032"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10033 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10033"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10034 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10034"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10035 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10035"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10036 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10036"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10037 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10037"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10038 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10038"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10039 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10039"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10040 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10040"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10041 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10041"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10042 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10042"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10043 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10043"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10044 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10044"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10045 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10045"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10046 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10046"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10047 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10047"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10048 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10048"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10049 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10049"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10050 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10050"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10051 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10051"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10052 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10052"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10053 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10053"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10054 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10054"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10055 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10055"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10056 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10056"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10057 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10057"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10058 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10058"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10059 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10059"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10060 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10060"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10061 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10061"; + + public static final String ORG_ZSTACK_DIRECTORY_10000 = "ORG_ZSTACK_DIRECTORY_10000"; + + public static final String ORG_ZSTACK_DIRECTORY_10001 = "ORG_ZSTACK_DIRECTORY_10001"; + + public static final String ORG_ZSTACK_DIRECTORY_10002 = "ORG_ZSTACK_DIRECTORY_10002"; + + public static final String ORG_ZSTACK_DIRECTORY_10003 = "ORG_ZSTACK_DIRECTORY_10003"; + + public static final String ORG_ZSTACK_DIRECTORY_10004 = "ORG_ZSTACK_DIRECTORY_10004"; + + public static final String ORG_ZSTACK_DIRECTORY_10005 = "ORG_ZSTACK_DIRECTORY_10005"; + + public static final String ORG_ZSTACK_DIRECTORY_10006 = "ORG_ZSTACK_DIRECTORY_10006"; + + public static final String ORG_ZSTACK_DIRECTORY_10007 = "ORG_ZSTACK_DIRECTORY_10007"; + + public static final String ORG_ZSTACK_DIRECTORY_10008 = "ORG_ZSTACK_DIRECTORY_10008"; + + public static final String ORG_ZSTACK_DIRECTORY_10009 = "ORG_ZSTACK_DIRECTORY_10009"; + + public static final String ORG_ZSTACK_DIRECTORY_10010 = "ORG_ZSTACK_DIRECTORY_10010"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10000 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10000"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10001 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10001"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10002 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10002"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10003 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10003"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10004 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10004"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10005 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10005"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10006 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10006"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10007 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10007"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10008 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10008"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10009 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10009"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10010 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10010"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10011 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10011"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10012 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10012"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10013 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10013"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10014 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10014"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10015 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10015"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10016 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10016"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10017 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10017"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10018 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10018"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10019 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10019"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10020 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10020"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10021 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10021"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10022 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10022"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10023 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10023"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10024 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10024"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10025 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10025"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10026 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10026"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10027 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10027"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10028 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10028"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10029 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10029"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10030 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10030"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10031 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10031"; + + public static final String ORG_ZSTACK_SSO_OAUTH2_SERVICE_10032 = "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10032"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10000 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10000"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10001 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10001"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10002 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10002"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10003 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10003"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10004 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10004"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10005 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10005"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10006 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10006"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10007 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10007"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10008 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10008"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10009 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10009"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10010 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10010"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10011 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10011"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10012 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10012"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10013 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_HAITAI_10013"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10000 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10000"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10001 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10001"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10002 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10002"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10003 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10003"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10004 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10004"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10005 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10005"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10006 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10006"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10007 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10007"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10008 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10008"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10009 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10009"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10010 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10010"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10000 = "ORG_ZSTACK_HYBRID_NETWORK_10000"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10001 = "ORG_ZSTACK_HYBRID_NETWORK_10001"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10002 = "ORG_ZSTACK_HYBRID_NETWORK_10002"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10003 = "ORG_ZSTACK_HYBRID_NETWORK_10003"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10004 = "ORG_ZSTACK_HYBRID_NETWORK_10004"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10005 = "ORG_ZSTACK_HYBRID_NETWORK_10005"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10006 = "ORG_ZSTACK_HYBRID_NETWORK_10006"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10007 = "ORG_ZSTACK_HYBRID_NETWORK_10007"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10008 = "ORG_ZSTACK_HYBRID_NETWORK_10008"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10009 = "ORG_ZSTACK_HYBRID_NETWORK_10009"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10010 = "ORG_ZSTACK_HYBRID_NETWORK_10010"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10011 = "ORG_ZSTACK_HYBRID_NETWORK_10011"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10012 = "ORG_ZSTACK_HYBRID_NETWORK_10012"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10013 = "ORG_ZSTACK_HYBRID_NETWORK_10013"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10014 = "ORG_ZSTACK_HYBRID_NETWORK_10014"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10015 = "ORG_ZSTACK_HYBRID_NETWORK_10015"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10016 = "ORG_ZSTACK_HYBRID_NETWORK_10016"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10017 = "ORG_ZSTACK_HYBRID_NETWORK_10017"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10018 = "ORG_ZSTACK_HYBRID_NETWORK_10018"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10019 = "ORG_ZSTACK_HYBRID_NETWORK_10019"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10020 = "ORG_ZSTACK_HYBRID_NETWORK_10020"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10021 = "ORG_ZSTACK_HYBRID_NETWORK_10021"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10022 = "ORG_ZSTACK_HYBRID_NETWORK_10022"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10023 = "ORG_ZSTACK_HYBRID_NETWORK_10023"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10024 = "ORG_ZSTACK_HYBRID_NETWORK_10024"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10025 = "ORG_ZSTACK_HYBRID_NETWORK_10025"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10026 = "ORG_ZSTACK_HYBRID_NETWORK_10026"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10027 = "ORG_ZSTACK_HYBRID_NETWORK_10027"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10028 = "ORG_ZSTACK_HYBRID_NETWORK_10028"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10029 = "ORG_ZSTACK_HYBRID_NETWORK_10029"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10030 = "ORG_ZSTACK_HYBRID_NETWORK_10030"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10031 = "ORG_ZSTACK_HYBRID_NETWORK_10031"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10032 = "ORG_ZSTACK_HYBRID_NETWORK_10032"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10033 = "ORG_ZSTACK_HYBRID_NETWORK_10033"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10034 = "ORG_ZSTACK_HYBRID_NETWORK_10034"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10035 = "ORG_ZSTACK_HYBRID_NETWORK_10035"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10036 = "ORG_ZSTACK_HYBRID_NETWORK_10036"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10037 = "ORG_ZSTACK_HYBRID_NETWORK_10037"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10038 = "ORG_ZSTACK_HYBRID_NETWORK_10038"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10039 = "ORG_ZSTACK_HYBRID_NETWORK_10039"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_10040 = "ORG_ZSTACK_HYBRID_NETWORK_10040"; + + public static final String ORG_ZSTACK_ZWATCH_PROMETHEUS_10000 = "ORG_ZSTACK_ZWATCH_PROMETHEUS_10000"; + + public static final String ORG_ZSTACK_ZWATCH_PROMETHEUS_10001 = "ORG_ZSTACK_ZWATCH_PROMETHEUS_10001"; + + public static final String ORG_ZSTACK_ZWATCH_PROMETHEUS_10002 = "ORG_ZSTACK_ZWATCH_PROMETHEUS_10002"; + + public static final String ORG_ZSTACK_ZQL_10000 = "ORG_ZSTACK_ZQL_10000"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_CEPH_10000 = "ORG_ZSTACK_STORAGE_PRIMARY_CEPH_10000"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10000 = "ORG_ZSTACK_STORAGE_BACKUP_10000"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10001 = "ORG_ZSTACK_STORAGE_BACKUP_10001"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10002 = "ORG_ZSTACK_STORAGE_BACKUP_10002"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10003 = "ORG_ZSTACK_STORAGE_BACKUP_10003"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10004 = "ORG_ZSTACK_STORAGE_BACKUP_10004"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10005 = "ORG_ZSTACK_STORAGE_BACKUP_10005"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10006 = "ORG_ZSTACK_STORAGE_BACKUP_10006"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10007 = "ORG_ZSTACK_STORAGE_BACKUP_10007"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10008 = "ORG_ZSTACK_STORAGE_BACKUP_10008"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10009 = "ORG_ZSTACK_STORAGE_BACKUP_10009"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10010 = "ORG_ZSTACK_STORAGE_BACKUP_10010"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10011 = "ORG_ZSTACK_STORAGE_BACKUP_10011"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10012 = "ORG_ZSTACK_STORAGE_BACKUP_10012"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10013 = "ORG_ZSTACK_STORAGE_BACKUP_10013"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10014 = "ORG_ZSTACK_STORAGE_BACKUP_10014"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10015 = "ORG_ZSTACK_STORAGE_BACKUP_10015"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10016 = "ORG_ZSTACK_STORAGE_BACKUP_10016"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10017 = "ORG_ZSTACK_STORAGE_BACKUP_10017"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10018 = "ORG_ZSTACK_STORAGE_BACKUP_10018"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10019 = "ORG_ZSTACK_STORAGE_BACKUP_10019"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10020 = "ORG_ZSTACK_STORAGE_BACKUP_10020"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10021 = "ORG_ZSTACK_STORAGE_BACKUP_10021"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10022 = "ORG_ZSTACK_STORAGE_BACKUP_10022"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10023 = "ORG_ZSTACK_STORAGE_BACKUP_10023"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10024 = "ORG_ZSTACK_STORAGE_BACKUP_10024"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10025 = "ORG_ZSTACK_STORAGE_BACKUP_10025"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10026 = "ORG_ZSTACK_STORAGE_BACKUP_10026"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10027 = "ORG_ZSTACK_STORAGE_BACKUP_10027"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10028 = "ORG_ZSTACK_STORAGE_BACKUP_10028"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10029 = "ORG_ZSTACK_STORAGE_BACKUP_10029"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10030 = "ORG_ZSTACK_STORAGE_BACKUP_10030"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10031 = "ORG_ZSTACK_STORAGE_BACKUP_10031"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10032 = "ORG_ZSTACK_STORAGE_BACKUP_10032"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10033 = "ORG_ZSTACK_STORAGE_BACKUP_10033"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10034 = "ORG_ZSTACK_STORAGE_BACKUP_10034"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10035 = "ORG_ZSTACK_STORAGE_BACKUP_10035"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10036 = "ORG_ZSTACK_STORAGE_BACKUP_10036"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10037 = "ORG_ZSTACK_STORAGE_BACKUP_10037"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10038 = "ORG_ZSTACK_STORAGE_BACKUP_10038"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10039 = "ORG_ZSTACK_STORAGE_BACKUP_10039"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10040 = "ORG_ZSTACK_STORAGE_BACKUP_10040"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10041 = "ORG_ZSTACK_STORAGE_BACKUP_10041"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10042 = "ORG_ZSTACK_STORAGE_BACKUP_10042"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10043 = "ORG_ZSTACK_STORAGE_BACKUP_10043"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10044 = "ORG_ZSTACK_STORAGE_BACKUP_10044"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10045 = "ORG_ZSTACK_STORAGE_BACKUP_10045"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10046 = "ORG_ZSTACK_STORAGE_BACKUP_10046"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10047 = "ORG_ZSTACK_STORAGE_BACKUP_10047"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10048 = "ORG_ZSTACK_STORAGE_BACKUP_10048"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10049 = "ORG_ZSTACK_STORAGE_BACKUP_10049"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10050 = "ORG_ZSTACK_STORAGE_BACKUP_10050"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10051 = "ORG_ZSTACK_STORAGE_BACKUP_10051"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10052 = "ORG_ZSTACK_STORAGE_BACKUP_10052"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10053 = "ORG_ZSTACK_STORAGE_BACKUP_10053"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10054 = "ORG_ZSTACK_STORAGE_BACKUP_10054"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10055 = "ORG_ZSTACK_STORAGE_BACKUP_10055"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10056 = "ORG_ZSTACK_STORAGE_BACKUP_10056"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10057 = "ORG_ZSTACK_STORAGE_BACKUP_10057"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10058 = "ORG_ZSTACK_STORAGE_BACKUP_10058"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10059 = "ORG_ZSTACK_STORAGE_BACKUP_10059"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10060 = "ORG_ZSTACK_STORAGE_BACKUP_10060"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10061 = "ORG_ZSTACK_STORAGE_BACKUP_10061"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10062 = "ORG_ZSTACK_STORAGE_BACKUP_10062"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10063 = "ORG_ZSTACK_STORAGE_BACKUP_10063"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10064 = "ORG_ZSTACK_STORAGE_BACKUP_10064"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10065 = "ORG_ZSTACK_STORAGE_BACKUP_10065"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10066 = "ORG_ZSTACK_STORAGE_BACKUP_10066"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10067 = "ORG_ZSTACK_STORAGE_BACKUP_10067"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10068 = "ORG_ZSTACK_STORAGE_BACKUP_10068"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10069 = "ORG_ZSTACK_STORAGE_BACKUP_10069"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10070 = "ORG_ZSTACK_STORAGE_BACKUP_10070"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10071 = "ORG_ZSTACK_STORAGE_BACKUP_10071"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10072 = "ORG_ZSTACK_STORAGE_BACKUP_10072"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10073 = "ORG_ZSTACK_STORAGE_BACKUP_10073"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10074 = "ORG_ZSTACK_STORAGE_BACKUP_10074"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10075 = "ORG_ZSTACK_STORAGE_BACKUP_10075"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10076 = "ORG_ZSTACK_STORAGE_BACKUP_10076"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10077 = "ORG_ZSTACK_STORAGE_BACKUP_10077"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10078 = "ORG_ZSTACK_STORAGE_BACKUP_10078"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10079 = "ORG_ZSTACK_STORAGE_BACKUP_10079"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10080 = "ORG_ZSTACK_STORAGE_BACKUP_10080"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10081 = "ORG_ZSTACK_STORAGE_BACKUP_10081"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10082 = "ORG_ZSTACK_STORAGE_BACKUP_10082"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10083 = "ORG_ZSTACK_STORAGE_BACKUP_10083"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10084 = "ORG_ZSTACK_STORAGE_BACKUP_10084"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10085 = "ORG_ZSTACK_STORAGE_BACKUP_10085"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10086 = "ORG_ZSTACK_STORAGE_BACKUP_10086"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10087 = "ORG_ZSTACK_STORAGE_BACKUP_10087"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10088 = "ORG_ZSTACK_STORAGE_BACKUP_10088"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10089 = "ORG_ZSTACK_STORAGE_BACKUP_10089"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10090 = "ORG_ZSTACK_STORAGE_BACKUP_10090"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10091 = "ORG_ZSTACK_STORAGE_BACKUP_10091"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10092 = "ORG_ZSTACK_STORAGE_BACKUP_10092"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10093 = "ORG_ZSTACK_STORAGE_BACKUP_10093"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10094 = "ORG_ZSTACK_STORAGE_BACKUP_10094"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10095 = "ORG_ZSTACK_STORAGE_BACKUP_10095"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10096 = "ORG_ZSTACK_STORAGE_BACKUP_10096"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10097 = "ORG_ZSTACK_STORAGE_BACKUP_10097"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10098 = "ORG_ZSTACK_STORAGE_BACKUP_10098"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10099 = "ORG_ZSTACK_STORAGE_BACKUP_10099"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10100 = "ORG_ZSTACK_STORAGE_BACKUP_10100"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10101 = "ORG_ZSTACK_STORAGE_BACKUP_10101"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10102 = "ORG_ZSTACK_STORAGE_BACKUP_10102"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10103 = "ORG_ZSTACK_STORAGE_BACKUP_10103"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10104 = "ORG_ZSTACK_STORAGE_BACKUP_10104"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10105 = "ORG_ZSTACK_STORAGE_BACKUP_10105"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10106 = "ORG_ZSTACK_STORAGE_BACKUP_10106"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10107 = "ORG_ZSTACK_STORAGE_BACKUP_10107"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10108 = "ORG_ZSTACK_STORAGE_BACKUP_10108"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10109 = "ORG_ZSTACK_STORAGE_BACKUP_10109"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10110 = "ORG_ZSTACK_STORAGE_BACKUP_10110"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10111 = "ORG_ZSTACK_STORAGE_BACKUP_10111"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10112 = "ORG_ZSTACK_STORAGE_BACKUP_10112"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10113 = "ORG_ZSTACK_STORAGE_BACKUP_10113"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10114 = "ORG_ZSTACK_STORAGE_BACKUP_10114"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10115 = "ORG_ZSTACK_STORAGE_BACKUP_10115"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10116 = "ORG_ZSTACK_STORAGE_BACKUP_10116"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10117 = "ORG_ZSTACK_STORAGE_BACKUP_10117"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10118 = "ORG_ZSTACK_STORAGE_BACKUP_10118"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10119 = "ORG_ZSTACK_STORAGE_BACKUP_10119"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10120 = "ORG_ZSTACK_STORAGE_BACKUP_10120"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10121 = "ORG_ZSTACK_STORAGE_BACKUP_10121"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10122 = "ORG_ZSTACK_STORAGE_BACKUP_10122"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10123 = "ORG_ZSTACK_STORAGE_BACKUP_10123"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10124 = "ORG_ZSTACK_STORAGE_BACKUP_10124"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10125 = "ORG_ZSTACK_STORAGE_BACKUP_10125"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10126 = "ORG_ZSTACK_STORAGE_BACKUP_10126"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10127 = "ORG_ZSTACK_STORAGE_BACKUP_10127"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10128 = "ORG_ZSTACK_STORAGE_BACKUP_10128"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10129 = "ORG_ZSTACK_STORAGE_BACKUP_10129"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10130 = "ORG_ZSTACK_STORAGE_BACKUP_10130"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10131 = "ORG_ZSTACK_STORAGE_BACKUP_10131"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10132 = "ORG_ZSTACK_STORAGE_BACKUP_10132"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_10133 = "ORG_ZSTACK_STORAGE_BACKUP_10133"; + + public static final String ORG_ZSTACK_COMPUTE_10000 = "ORG_ZSTACK_COMPUTE_10000"; + + public static final String ORG_ZSTACK_COMPUTE_10001 = "ORG_ZSTACK_COMPUTE_10001"; + + public static final String ORG_ZSTACK_COMPUTE_10002 = "ORG_ZSTACK_COMPUTE_10002"; + + public static final String ORG_ZSTACK_COMPUTE_10003 = "ORG_ZSTACK_COMPUTE_10003"; + + public static final String ORG_ZSTACK_COMPUTE_10004 = "ORG_ZSTACK_COMPUTE_10004"; + + public static final String ORG_ZSTACK_COMPUTE_10005 = "ORG_ZSTACK_COMPUTE_10005"; + + public static final String ORG_ZSTACK_COMPUTE_10006 = "ORG_ZSTACK_COMPUTE_10006"; + + public static final String ORG_ZSTACK_COMPUTE_10007 = "ORG_ZSTACK_COMPUTE_10007"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10000 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10001 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10002 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10000 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10001 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10002 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10003 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10003"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10004 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10004"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10005 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10005"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10006 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10006"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10007 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10007"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10008 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10008"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10009 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10009"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10010 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10010"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10011 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10011"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10012 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10012"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10013 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10013"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10014 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10014"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10015 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10015"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10016 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10016"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10017 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10017"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10018 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10018"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10019 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10019"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10020 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10020"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10021 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10021"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10022 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10022"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10023 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10023"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10024 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10024"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10025 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10025"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10026 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10026"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10027 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10027"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10028 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10028"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10029 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10029"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10030 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10030"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10031 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10031"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10032 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10032"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10000 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10001 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10002 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10003 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10003"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10004 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10004"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10005 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10005"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10006 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10006"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10007 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10007"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10008 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10008"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_AI_10000 = "ORG_ZSTACK_TEST_INTEGRATION_AI_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_AI_10001 = "ORG_ZSTACK_TEST_INTEGRATION_AI_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_AI_10002 = "ORG_ZSTACK_TEST_INTEGRATION_AI_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_AI_10003 = "ORG_ZSTACK_TEST_INTEGRATION_AI_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_AI_10004 = "ORG_ZSTACK_TEST_INTEGRATION_AI_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_AI_10005 = "ORG_ZSTACK_TEST_INTEGRATION_AI_10005"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_AI_10006 = "ORG_ZSTACK_TEST_INTEGRATION_AI_10006"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_AI_10007 = "ORG_ZSTACK_TEST_INTEGRATION_AI_10007"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_AI_10008 = "ORG_ZSTACK_TEST_INTEGRATION_AI_10008"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_AI_10009 = "ORG_ZSTACK_TEST_INTEGRATION_AI_10009"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_AI_10010 = "ORG_ZSTACK_TEST_INTEGRATION_AI_10010"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_AI_10011 = "ORG_ZSTACK_TEST_INTEGRATION_AI_10011"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_AI_10012 = "ORG_ZSTACK_TEST_INTEGRATION_AI_10012"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_AI_10013 = "ORG_ZSTACK_TEST_INTEGRATION_AI_10013"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_AI_10014 = "ORG_ZSTACK_TEST_INTEGRATION_AI_10014"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_AI_10015 = "ORG_ZSTACK_TEST_INTEGRATION_AI_10015"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_AI_10016 = "ORG_ZSTACK_TEST_INTEGRATION_AI_10016"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_AI_10017 = "ORG_ZSTACK_TEST_INTEGRATION_AI_10017"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_AI_10018 = "ORG_ZSTACK_TEST_INTEGRATION_AI_10018"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_AI_10019 = "ORG_ZSTACK_TEST_INTEGRATION_AI_10019"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_AI_10020 = "ORG_ZSTACK_TEST_INTEGRATION_AI_10020"; + + public static final String ORG_ZSTACK_SSO_SERVICE_10000 = "ORG_ZSTACK_SSO_SERVICE_10000"; + + public static final String ORG_ZSTACK_SSO_SERVICE_10001 = "ORG_ZSTACK_SSO_SERVICE_10001"; + + public static final String ORG_ZSTACK_SSO_SERVICE_10002 = "ORG_ZSTACK_SSO_SERVICE_10002"; + + public static final String ORG_ZSTACK_SSO_SERVICE_10003 = "ORG_ZSTACK_SSO_SERVICE_10003"; + + public static final String ORG_ZSTACK_SSO_SERVICE_10004 = "ORG_ZSTACK_SSO_SERVICE_10004"; + + public static final String ORG_ZSTACK_SSO_SERVICE_10005 = "ORG_ZSTACK_SSO_SERVICE_10005"; + + public static final String ORG_ZSTACK_SSO_SERVICE_10006 = "ORG_ZSTACK_SSO_SERVICE_10006"; + + public static final String ORG_ZSTACK_SSO_SERVICE_10007 = "ORG_ZSTACK_SSO_SERVICE_10007"; + + public static final String ORG_ZSTACK_SSO_SERVICE_10008 = "ORG_ZSTACK_SSO_SERVICE_10008"; + + public static final String ORG_ZSTACK_SSO_SERVICE_10009 = "ORG_ZSTACK_SSO_SERVICE_10009"; + + public static final String ORG_ZSTACK_SSO_SERVICE_10010 = "ORG_ZSTACK_SSO_SERVICE_10010"; + + public static final String ORG_ZSTACK_SSO_SERVICE_10011 = "ORG_ZSTACK_SSO_SERVICE_10011"; + + public static final String ORG_ZSTACK_SSO_SERVICE_10012 = "ORG_ZSTACK_SSO_SERVICE_10012"; + + public static final String ORG_ZSTACK_SSO_SERVICE_10013 = "ORG_ZSTACK_SSO_SERVICE_10013"; + + public static final String ORG_ZSTACK_SSO_SERVICE_10014 = "ORG_ZSTACK_SSO_SERVICE_10014"; + + public static final String ORG_ZSTACK_SNS_SYSTEM_10000 = "ORG_ZSTACK_SNS_SYSTEM_10000"; + + public static final String ORG_ZSTACK_SNS_SYSTEM_10001 = "ORG_ZSTACK_SNS_SYSTEM_10001"; + + public static final String ORG_ZSTACK_SNS_SYSTEM_10002 = "ORG_ZSTACK_SNS_SYSTEM_10002"; + + public static final String ORG_ZSTACK_ZQL_AST_VISITORS_10000 = "ORG_ZSTACK_ZQL_AST_VISITORS_10000"; + + public static final String ORG_ZSTACK_ZQL_AST_VISITORS_10001 = "ORG_ZSTACK_ZQL_AST_VISITORS_10001"; + + public static final String ORG_ZSTACK_ZQL_AST_VISITORS_10002 = "ORG_ZSTACK_ZQL_AST_VISITORS_10002"; + + public static final String ORG_ZSTACK_ZQL_AST_VISITORS_10003 = "ORG_ZSTACK_ZQL_AST_VISITORS_10003"; + + public static final String ORG_ZSTACK_ZQL_AST_VISITORS_10004 = "ORG_ZSTACK_ZQL_AST_VISITORS_10004"; + + public static final String ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10000 = "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10000"; + + public static final String ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10001 = "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10001"; + + public static final String ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10002 = "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10002"; + + public static final String ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10003 = "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10003"; + + public static final String ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10004 = "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10004"; + + public static final String ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10005 = "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10005"; + + public static final String ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10006 = "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10006"; + + public static final String ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10007 = "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10007"; + + public static final String ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10008 = "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10008"; + + public static final String ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10009 = "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10009"; + + public static final String ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10010 = "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10010"; + + public static final String ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10011 = "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10011"; + + public static final String ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012 = "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012"; + + public static final String ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10013 = "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10013"; + + public static final String ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014 = "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014"; + + public static final String ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10000 = "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10000"; + + public static final String ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10001 = "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10001"; + + public static final String ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10002 = "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10002"; + + public static final String ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10003 = "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10003"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10000 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10000"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10001 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10001"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10002 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10002"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10003 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10003"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10004 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10004"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10005 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10005"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10006 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10006"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10007 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10007"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10008 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10008"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10009 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10009"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10010 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10010"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10011 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10011"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10012 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10012"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10013 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10013"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10014 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10014"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10015 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10015"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10016 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10016"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10017 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10017"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10018 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10018"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10019 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10019"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10020 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10020"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10021 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10021"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10022 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10022"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10023 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10023"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10024 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10024"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10025 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10025"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10026 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10026"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10027 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10027"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10028 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10028"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10029 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10029"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10030 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10030"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10031 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10031"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10000 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10000"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10001 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10001"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10002 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10002"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10003 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10003"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10004 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10004"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10005 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10005"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10006 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10006"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10007 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10007"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10008 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10008"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10009 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10009"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10010 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10010"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10011 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10011"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10012 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10012"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10013 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10013"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10014 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10014"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10015 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10015"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10016 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10016"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10017 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10017"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10018 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10018"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10019 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10019"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10020 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10020"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10021 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10021"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10022 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10022"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10023 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10023"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10024 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10024"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10025 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10025"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10026 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10026"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10027 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10027"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10028 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10028"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10029 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10029"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10030 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10030"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10031 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10031"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10032 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10032"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10033 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10033"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10034 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10034"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10035 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10035"; + + public static final String ORG_ZSTACK_BAREMETAL_PXESERVER_10036 = "ORG_ZSTACK_BAREMETAL_PXESERVER_10036"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_V2V_10000 = "ORG_ZSTACK_TEST_INTEGRATION_V2V_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_V2V_10001 = "ORG_ZSTACK_TEST_INTEGRATION_V2V_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_V2V_10002 = "ORG_ZSTACK_TEST_INTEGRATION_V2V_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_V2V_10003 = "ORG_ZSTACK_TEST_INTEGRATION_V2V_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_V2V_10004 = "ORG_ZSTACK_TEST_INTEGRATION_V2V_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_V2V_10005 = "ORG_ZSTACK_TEST_INTEGRATION_V2V_10005"; + + public static final String ORG_ZSTACK_ZWATCH_DATATYPE_10000 = "ORG_ZSTACK_ZWATCH_DATATYPE_10000"; + + public static final String ORG_ZSTACK_ZWATCH_DATATYPE_10001 = "ORG_ZSTACK_ZWATCH_DATATYPE_10001"; + + public static final String ORG_ZSTACK_ZWATCH_DATATYPE_10002 = "ORG_ZSTACK_ZWATCH_DATATYPE_10002"; + + public static final String ORG_ZSTACK_ZWATCH_DATATYPE_10003 = "ORG_ZSTACK_ZWATCH_DATATYPE_10003"; + + public static final String ORG_ZSTACK_ZWATCH_DATATYPE_10004 = "ORG_ZSTACK_ZWATCH_DATATYPE_10004"; + + public static final String ORG_ZSTACK_ZWATCH_DATATYPE_10005 = "ORG_ZSTACK_ZWATCH_DATATYPE_10005"; + + public static final String ORG_ZSTACK_ZWATCH_DATATYPE_10006 = "ORG_ZSTACK_ZWATCH_DATATYPE_10006"; + + public static final String ORG_ZSTACK_ZWATCH_DATATYPE_10007 = "ORG_ZSTACK_ZWATCH_DATATYPE_10007"; + + public static final String ORG_ZSTACK_ZWATCH_DATATYPE_10008 = "ORG_ZSTACK_ZWATCH_DATATYPE_10008"; + + public static final String ORG_ZSTACK_ZWATCH_DATATYPE_10009 = "ORG_ZSTACK_ZWATCH_DATATYPE_10009"; + + public static final String ORG_ZSTACK_ZWATCH_DATATYPE_10010 = "ORG_ZSTACK_ZWATCH_DATATYPE_10010"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_NETWORKSERVICE_PROVIDER_VIRTUALROUTER_10000 = "ORG_ZSTACK_TEST_INTEGRATION_NETWORKSERVICE_PROVIDER_VIRTUALROUTER_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_NETWORKSERVICE_PROVIDER_VIRTUALROUTER_10001 = "ORG_ZSTACK_TEST_INTEGRATION_NETWORKSERVICE_PROVIDER_VIRTUALROUTER_10001"; + + public static final String ORG_ZSTACK_ACCESSKEY_10000 = "ORG_ZSTACK_ACCESSKEY_10000"; + + public static final String ORG_ZSTACK_ACCESSKEY_10001 = "ORG_ZSTACK_ACCESSKEY_10001"; + + public static final String ORG_ZSTACK_ACCESSKEY_10002 = "ORG_ZSTACK_ACCESSKEY_10002"; + + public static final String ORG_ZSTACK_ACCESSKEY_10003 = "ORG_ZSTACK_ACCESSKEY_10003"; + + public static final String ORG_ZSTACK_ACCESSKEY_10004 = "ORG_ZSTACK_ACCESSKEY_10004"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10000 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10000"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10001 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10001"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10002 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10002"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10003 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10003"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10004 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10004"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10005 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10005"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10006 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10006"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10007 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10007"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10008 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10008"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10009 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10009"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10010 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10010"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10011 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10011"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10012 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10012"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10013 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10013"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10014 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10014"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10015 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10015"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10016 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10016"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10017 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10017"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10018 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10018"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10019 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10019"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10020 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10020"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_10021 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_10021"; + + public static final String ORG_ZSTACK_LOG_10000 = "ORG_ZSTACK_LOG_10000"; + + public static final String ORG_ZSTACK_LOG_10001 = "ORG_ZSTACK_LOG_10001"; + + public static final String ORG_ZSTACK_LOG_10002 = "ORG_ZSTACK_LOG_10002"; + + public static final String ORG_ZSTACK_LOG_10003 = "ORG_ZSTACK_LOG_10003"; + + public static final String ORG_ZSTACK_LOG_10004 = "ORG_ZSTACK_LOG_10004"; + + public static final String ORG_ZSTACK_LOG_10005 = "ORG_ZSTACK_LOG_10005"; + + public static final String ORG_ZSTACK_LOG_10006 = "ORG_ZSTACK_LOG_10006"; + + public static final String ORG_ZSTACK_LOG_10007 = "ORG_ZSTACK_LOG_10007"; + + public static final String ORG_ZSTACK_TICKET_10000 = "ORG_ZSTACK_TICKET_10000"; + + public static final String ORG_ZSTACK_TICKET_10001 = "ORG_ZSTACK_TICKET_10001"; + + public static final String ORG_ZSTACK_TICKET_IAM2_10000 = "ORG_ZSTACK_TICKET_IAM2_10000"; + + public static final String ORG_ZSTACK_TICKET_IAM2_10001 = "ORG_ZSTACK_TICKET_IAM2_10001"; + + public static final String ORG_ZSTACK_TICKET_IAM2_10002 = "ORG_ZSTACK_TICKET_IAM2_10002"; + + public static final String ORG_ZSTACK_TICKET_IAM2_10003 = "ORG_ZSTACK_TICKET_IAM2_10003"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10000 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10001 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10002 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10003 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10003"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10004 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10004"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10005 = "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10005"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10000 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10000"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10001 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10001"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10002 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10002"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10003 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10003"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10004 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10004"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10005 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10005"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10006 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10006"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10007 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10007"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10008 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10008"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10009 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10009"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10010 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10010"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10011 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10011"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10012 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10012"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10013 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10013"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10014 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10014"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10015 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10015"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10016 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10016"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10017 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10017"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10018 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10018"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10019 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10019"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10020 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10020"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10021 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10021"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10022 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10022"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10023 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10023"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10024 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10024"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10025 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10025"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10026 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10026"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10027 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10027"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10028 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10028"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10029 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10029"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10030 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10030"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10031 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10031"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10032 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10032"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10033 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10033"; + + public static final String ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10034 = "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10034"; + + public static final String ORG_ZSTACK_XDRAGON_10000 = "ORG_ZSTACK_XDRAGON_10000"; + + public static final String ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10000 = "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10000"; + + public static final String ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10001 = "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10001"; + + public static final String ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10002 = "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10002"; + + public static final String ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10003 = "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10003"; + + public static final String ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10004 = "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10004"; + + public static final String ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10005 = "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10005"; + + public static final String ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10006 = "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10006"; + + public static final String ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10007 = "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10007"; + + public static final String ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10008 = "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10008"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_CORE_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_CORE_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_CORE_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_CORE_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_CORE_10002 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_CORE_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_CORE_10003 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_CORE_10003"; + + public static final String ORG_ZSTACK_COMPUTE_CLUSTER_10000 = "ORG_ZSTACK_COMPUTE_CLUSTER_10000"; + + public static final String ORG_ZSTACK_COMPUTE_CLUSTER_10001 = "ORG_ZSTACK_COMPUTE_CLUSTER_10001"; + + public static final String ORG_ZSTACK_COMPUTE_CLUSTER_10002 = "ORG_ZSTACK_COMPUTE_CLUSTER_10002"; + + public static final String ORG_ZSTACK_COMPUTE_CLUSTER_10003 = "ORG_ZSTACK_COMPUTE_CLUSTER_10003"; + + public static final String ORG_ZSTACK_COMPUTE_CLUSTER_10004 = "ORG_ZSTACK_COMPUTE_CLUSTER_10004"; + + public static final String ORG_ZSTACK_COMPUTE_CLUSTER_10005 = "ORG_ZSTACK_COMPUTE_CLUSTER_10005"; + + public static final String ORG_ZSTACK_COMPUTE_CLUSTER_10006 = "ORG_ZSTACK_COMPUTE_CLUSTER_10006"; + + public static final String ORG_ZSTACK_COMPUTE_CLUSTER_10007 = "ORG_ZSTACK_COMPUTE_CLUSTER_10007"; + + public static final String ORG_ZSTACK_COMPUTE_CLUSTER_10008 = "ORG_ZSTACK_COMPUTE_CLUSTER_10008"; + + public static final String ORG_ZSTACK_COMPUTE_CLUSTER_10009 = "ORG_ZSTACK_COMPUTE_CLUSTER_10009"; + + public static final String ORG_ZSTACK_COMPUTE_CLUSTER_10010 = "ORG_ZSTACK_COMPUTE_CLUSTER_10010"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10000 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10000"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10001 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10001"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10002 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10002"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10003 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10003"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10004 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10004"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10005 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10005"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10006 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10006"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10007 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10007"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10008 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10008"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10009 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10009"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10010 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10010"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10011 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10011"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10012 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10012"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10013 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10013"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10014 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10014"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10015 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10015"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10016 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10016"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10017 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10017"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10018 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10018"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10019 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10019"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10020 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10020"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10021 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10021"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10022 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10022"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10023 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10023"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10024 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10024"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10025 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10025"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10026 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10026"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10027 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10027"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10028 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10028"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10029 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10029"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10030 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10030"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10031 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10031"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10032 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10032"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10033 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10033"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10034 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10034"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10035 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10035"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10036 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10036"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10037 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10037"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10038 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10038"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10039 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10039"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10040 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10040"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10041 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10041"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10042 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10042"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10043 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10043"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10044 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10044"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10045 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10045"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10046 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10046"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10047 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10047"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10048 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10048"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10049 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10049"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10050 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10050"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10051 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10051"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10052 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10052"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10053 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10053"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10054 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10054"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10055 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10055"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10056 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10056"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10057 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10057"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10058 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10058"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10059 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10059"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10060 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10060"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10061 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10061"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10062 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10062"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10063 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10063"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10064 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10064"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10065 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10065"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10066 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10066"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10067 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10067"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10068 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10068"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10069 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10069"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10070 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10070"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10071 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10071"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10072 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10072"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10073 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10073"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10074 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10074"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10075 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10075"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10076 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10076"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_NFS_10077 = "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10077"; + + public static final String ORG_ZSTACK_COMPUTE_VHOSTUSER_10000 = "ORG_ZSTACK_COMPUTE_VHOSTUSER_10000"; + + public static final String ORG_ZSTACK_COMPUTE_VHOSTUSER_10001 = "ORG_ZSTACK_COMPUTE_VHOSTUSER_10001"; + + public static final String ORG_ZSTACK_COMPUTE_VHOSTUSER_10002 = "ORG_ZSTACK_COMPUTE_VHOSTUSER_10002"; + + public static final String ORG_ZSTACK_COMPUTE_VHOSTUSER_10003 = "ORG_ZSTACK_COMPUTE_VHOSTUSER_10003"; + + public static final String ORG_ZSTACK_COMPUTE_VHOSTUSER_10004 = "ORG_ZSTACK_COMPUTE_VHOSTUSER_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10000 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10001 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10002 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10003 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10004 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10005 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10005"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10006 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10006"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10007 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10007"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10008 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10008"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10009 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10009"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10010 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10010"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10011 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10011"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10012 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10012"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10013 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10013"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10014 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10014"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10015 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10015"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10016 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10016"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10017 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10017"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10018 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10018"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10019 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10019"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10020 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10020"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10021 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10021"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10022 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10022"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10023 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10023"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10024 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10024"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10025 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10025"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10026 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10026"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10027 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10027"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10028 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10028"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10029 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10029"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10030 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10030"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10031 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL2_10031"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_NETWORKSERVICE_PROVIDER_FLAT_EIP_10000 = "ORG_ZSTACK_TEST_INTEGRATION_NETWORKSERVICE_PROVIDER_FLAT_EIP_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_NETWORKSERVICE_PROVIDER_FLAT_EIP_10001 = "ORG_ZSTACK_TEST_INTEGRATION_NETWORKSERVICE_PROVIDER_FLAT_EIP_10001"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10000 = "ORG_ZSTACK_STORAGE_CDP_10000"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10001 = "ORG_ZSTACK_STORAGE_CDP_10001"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10002 = "ORG_ZSTACK_STORAGE_CDP_10002"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10003 = "ORG_ZSTACK_STORAGE_CDP_10003"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10004 = "ORG_ZSTACK_STORAGE_CDP_10004"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10005 = "ORG_ZSTACK_STORAGE_CDP_10005"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10006 = "ORG_ZSTACK_STORAGE_CDP_10006"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10007 = "ORG_ZSTACK_STORAGE_CDP_10007"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10008 = "ORG_ZSTACK_STORAGE_CDP_10008"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10009 = "ORG_ZSTACK_STORAGE_CDP_10009"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10010 = "ORG_ZSTACK_STORAGE_CDP_10010"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10011 = "ORG_ZSTACK_STORAGE_CDP_10011"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10012 = "ORG_ZSTACK_STORAGE_CDP_10012"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10013 = "ORG_ZSTACK_STORAGE_CDP_10013"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10014 = "ORG_ZSTACK_STORAGE_CDP_10014"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10015 = "ORG_ZSTACK_STORAGE_CDP_10015"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10016 = "ORG_ZSTACK_STORAGE_CDP_10016"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10017 = "ORG_ZSTACK_STORAGE_CDP_10017"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10018 = "ORG_ZSTACK_STORAGE_CDP_10018"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10019 = "ORG_ZSTACK_STORAGE_CDP_10019"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10020 = "ORG_ZSTACK_STORAGE_CDP_10020"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10021 = "ORG_ZSTACK_STORAGE_CDP_10021"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10022 = "ORG_ZSTACK_STORAGE_CDP_10022"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10023 = "ORG_ZSTACK_STORAGE_CDP_10023"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10024 = "ORG_ZSTACK_STORAGE_CDP_10024"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10025 = "ORG_ZSTACK_STORAGE_CDP_10025"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10026 = "ORG_ZSTACK_STORAGE_CDP_10026"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10027 = "ORG_ZSTACK_STORAGE_CDP_10027"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10028 = "ORG_ZSTACK_STORAGE_CDP_10028"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10029 = "ORG_ZSTACK_STORAGE_CDP_10029"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10030 = "ORG_ZSTACK_STORAGE_CDP_10030"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10031 = "ORG_ZSTACK_STORAGE_CDP_10031"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10032 = "ORG_ZSTACK_STORAGE_CDP_10032"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10033 = "ORG_ZSTACK_STORAGE_CDP_10033"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10034 = "ORG_ZSTACK_STORAGE_CDP_10034"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10035 = "ORG_ZSTACK_STORAGE_CDP_10035"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10036 = "ORG_ZSTACK_STORAGE_CDP_10036"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10037 = "ORG_ZSTACK_STORAGE_CDP_10037"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10038 = "ORG_ZSTACK_STORAGE_CDP_10038"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10039 = "ORG_ZSTACK_STORAGE_CDP_10039"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10040 = "ORG_ZSTACK_STORAGE_CDP_10040"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10041 = "ORG_ZSTACK_STORAGE_CDP_10041"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10042 = "ORG_ZSTACK_STORAGE_CDP_10042"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10043 = "ORG_ZSTACK_STORAGE_CDP_10043"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10044 = "ORG_ZSTACK_STORAGE_CDP_10044"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10045 = "ORG_ZSTACK_STORAGE_CDP_10045"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10046 = "ORG_ZSTACK_STORAGE_CDP_10046"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10047 = "ORG_ZSTACK_STORAGE_CDP_10047"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10048 = "ORG_ZSTACK_STORAGE_CDP_10048"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10049 = "ORG_ZSTACK_STORAGE_CDP_10049"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10050 = "ORG_ZSTACK_STORAGE_CDP_10050"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10051 = "ORG_ZSTACK_STORAGE_CDP_10051"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10052 = "ORG_ZSTACK_STORAGE_CDP_10052"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10053 = "ORG_ZSTACK_STORAGE_CDP_10053"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10054 = "ORG_ZSTACK_STORAGE_CDP_10054"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10055 = "ORG_ZSTACK_STORAGE_CDP_10055"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10056 = "ORG_ZSTACK_STORAGE_CDP_10056"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10057 = "ORG_ZSTACK_STORAGE_CDP_10057"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10058 = "ORG_ZSTACK_STORAGE_CDP_10058"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10059 = "ORG_ZSTACK_STORAGE_CDP_10059"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10060 = "ORG_ZSTACK_STORAGE_CDP_10060"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10061 = "ORG_ZSTACK_STORAGE_CDP_10061"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10062 = "ORG_ZSTACK_STORAGE_CDP_10062"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10063 = "ORG_ZSTACK_STORAGE_CDP_10063"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10064 = "ORG_ZSTACK_STORAGE_CDP_10064"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10065 = "ORG_ZSTACK_STORAGE_CDP_10065"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10066 = "ORG_ZSTACK_STORAGE_CDP_10066"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10067 = "ORG_ZSTACK_STORAGE_CDP_10067"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10068 = "ORG_ZSTACK_STORAGE_CDP_10068"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10069 = "ORG_ZSTACK_STORAGE_CDP_10069"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10070 = "ORG_ZSTACK_STORAGE_CDP_10070"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10071 = "ORG_ZSTACK_STORAGE_CDP_10071"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10072 = "ORG_ZSTACK_STORAGE_CDP_10072"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10073 = "ORG_ZSTACK_STORAGE_CDP_10073"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10074 = "ORG_ZSTACK_STORAGE_CDP_10074"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10075 = "ORG_ZSTACK_STORAGE_CDP_10075"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10076 = "ORG_ZSTACK_STORAGE_CDP_10076"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10077 = "ORG_ZSTACK_STORAGE_CDP_10077"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10078 = "ORG_ZSTACK_STORAGE_CDP_10078"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10079 = "ORG_ZSTACK_STORAGE_CDP_10079"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10080 = "ORG_ZSTACK_STORAGE_CDP_10080"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10081 = "ORG_ZSTACK_STORAGE_CDP_10081"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10082 = "ORG_ZSTACK_STORAGE_CDP_10082"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10083 = "ORG_ZSTACK_STORAGE_CDP_10083"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10084 = "ORG_ZSTACK_STORAGE_CDP_10084"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10085 = "ORG_ZSTACK_STORAGE_CDP_10085"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10086 = "ORG_ZSTACK_STORAGE_CDP_10086"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10087 = "ORG_ZSTACK_STORAGE_CDP_10087"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10088 = "ORG_ZSTACK_STORAGE_CDP_10088"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10089 = "ORG_ZSTACK_STORAGE_CDP_10089"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10090 = "ORG_ZSTACK_STORAGE_CDP_10090"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10091 = "ORG_ZSTACK_STORAGE_CDP_10091"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10092 = "ORG_ZSTACK_STORAGE_CDP_10092"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10093 = "ORG_ZSTACK_STORAGE_CDP_10093"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10094 = "ORG_ZSTACK_STORAGE_CDP_10094"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10095 = "ORG_ZSTACK_STORAGE_CDP_10095"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10096 = "ORG_ZSTACK_STORAGE_CDP_10096"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10097 = "ORG_ZSTACK_STORAGE_CDP_10097"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10098 = "ORG_ZSTACK_STORAGE_CDP_10098"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10099 = "ORG_ZSTACK_STORAGE_CDP_10099"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10100 = "ORG_ZSTACK_STORAGE_CDP_10100"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10101 = "ORG_ZSTACK_STORAGE_CDP_10101"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10102 = "ORG_ZSTACK_STORAGE_CDP_10102"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10103 = "ORG_ZSTACK_STORAGE_CDP_10103"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10104 = "ORG_ZSTACK_STORAGE_CDP_10104"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10105 = "ORG_ZSTACK_STORAGE_CDP_10105"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10106 = "ORG_ZSTACK_STORAGE_CDP_10106"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10107 = "ORG_ZSTACK_STORAGE_CDP_10107"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10108 = "ORG_ZSTACK_STORAGE_CDP_10108"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10109 = "ORG_ZSTACK_STORAGE_CDP_10109"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10110 = "ORG_ZSTACK_STORAGE_CDP_10110"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10111 = "ORG_ZSTACK_STORAGE_CDP_10111"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10112 = "ORG_ZSTACK_STORAGE_CDP_10112"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10113 = "ORG_ZSTACK_STORAGE_CDP_10113"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10114 = "ORG_ZSTACK_STORAGE_CDP_10114"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10115 = "ORG_ZSTACK_STORAGE_CDP_10115"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10116 = "ORG_ZSTACK_STORAGE_CDP_10116"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10117 = "ORG_ZSTACK_STORAGE_CDP_10117"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10118 = "ORG_ZSTACK_STORAGE_CDP_10118"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10119 = "ORG_ZSTACK_STORAGE_CDP_10119"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10120 = "ORG_ZSTACK_STORAGE_CDP_10120"; + + public static final String ORG_ZSTACK_STORAGE_CDP_10121 = "ORG_ZSTACK_STORAGE_CDP_10121"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_EMAIL_10000 = "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10000"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_EMAIL_10001 = "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10001"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_EMAIL_10002 = "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10002"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_EMAIL_10003 = "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10003"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_EMAIL_10004 = "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10004"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_EMAIL_10005 = "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10005"; + + public static final String ORG_ZSTACK_OVF_10000 = "ORG_ZSTACK_OVF_10000"; + + public static final String ORG_ZSTACK_OVF_10001 = "ORG_ZSTACK_OVF_10001"; + + public static final String ORG_ZSTACK_OVF_10002 = "ORG_ZSTACK_OVF_10002"; + + public static final String ORG_ZSTACK_OVF_10003 = "ORG_ZSTACK_OVF_10003"; + + public static final String ORG_ZSTACK_OVF_10004 = "ORG_ZSTACK_OVF_10004"; + + public static final String ORG_ZSTACK_OVF_10005 = "ORG_ZSTACK_OVF_10005"; + + public static final String ORG_ZSTACK_OVF_10006 = "ORG_ZSTACK_OVF_10006"; + + public static final String ORG_ZSTACK_OVF_10007 = "ORG_ZSTACK_OVF_10007"; + + public static final String ORG_ZSTACK_OVF_10008 = "ORG_ZSTACK_OVF_10008"; + + public static final String ORG_ZSTACK_OVF_10009 = "ORG_ZSTACK_OVF_10009"; + + public static final String ORG_ZSTACK_OVF_10010 = "ORG_ZSTACK_OVF_10010"; + + public static final String ORG_ZSTACK_OVF_10011 = "ORG_ZSTACK_OVF_10011"; + + public static final String ORG_ZSTACK_OVF_10012 = "ORG_ZSTACK_OVF_10012"; + + public static final String ORG_ZSTACK_OVF_10013 = "ORG_ZSTACK_OVF_10013"; + + public static final String ORG_ZSTACK_OVF_10014 = "ORG_ZSTACK_OVF_10014"; + + public static final String ORG_ZSTACK_OVF_10015 = "ORG_ZSTACK_OVF_10015"; + + public static final String ORG_ZSTACK_OVF_10016 = "ORG_ZSTACK_OVF_10016"; + + public static final String ORG_ZSTACK_OVF_10017 = "ORG_ZSTACK_OVF_10017"; + + public static final String ORG_ZSTACK_OVF_10018 = "ORG_ZSTACK_OVF_10018"; + + public static final String ORG_ZSTACK_OVF_10019 = "ORG_ZSTACK_OVF_10019"; + + public static final String ORG_ZSTACK_OVF_10020 = "ORG_ZSTACK_OVF_10020"; + + public static final String ORG_ZSTACK_OVF_10021 = "ORG_ZSTACK_OVF_10021"; + + public static final String ORG_ZSTACK_OVF_10022 = "ORG_ZSTACK_OVF_10022"; + + public static final String ORG_ZSTACK_OVF_10023 = "ORG_ZSTACK_OVF_10023"; + + public static final String ORG_ZSTACK_OVF_10024 = "ORG_ZSTACK_OVF_10024"; + + public static final String ORG_ZSTACK_OVF_10025 = "ORG_ZSTACK_OVF_10025"; + + public static final String ORG_ZSTACK_OVF_10026 = "ORG_ZSTACK_OVF_10026"; + + public static final String ORG_ZSTACK_OVF_10027 = "ORG_ZSTACK_OVF_10027"; + + public static final String ORG_ZSTACK_OVF_10028 = "ORG_ZSTACK_OVF_10028"; + + public static final String ORG_ZSTACK_OVF_10029 = "ORG_ZSTACK_OVF_10029"; + + public static final String ORG_ZSTACK_OVF_10030 = "ORG_ZSTACK_OVF_10030"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10000 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10000"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10001 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10001"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10002 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10002"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10003 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10003"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10004 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10004"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10005 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10005"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10006 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10006"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10007 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10007"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10008 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10008"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10009 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10009"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10010 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10010"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10011 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10011"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10012 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10012"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10013 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10013"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10014 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10014"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10015 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10015"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10016 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10016"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10017 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_AISINO_10017"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_SNMP_10000 = "ORG_ZSTACK_SNS_PLATFORM_SNMP_10000"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_SNMP_10001 = "ORG_ZSTACK_SNS_PLATFORM_SNMP_10001"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_SNMP_10002 = "ORG_ZSTACK_SNS_PLATFORM_SNMP_10002"; + + public static final String ORG_ZSTACK_HYGON_KVM_10000 = "ORG_ZSTACK_HYGON_KVM_10000"; + + public static final String ORG_ZSTACK_HYGON_KVM_10001 = "ORG_ZSTACK_HYGON_KVM_10001"; + + public static final String ORG_ZSTACK_HYGON_KVM_10002 = "ORG_ZSTACK_HYGON_KVM_10002"; + + public static final String ORG_ZSTACK_HYGON_KVM_10003 = "ORG_ZSTACK_HYGON_KVM_10003"; + + public static final String ORG_ZSTACK_HYGON_KVM_10004 = "ORG_ZSTACK_HYGON_KVM_10004"; + + public static final String ORG_ZSTACK_AI_MESSAGE_10000 = "ORG_ZSTACK_AI_MESSAGE_10000"; + + public static final String ORG_ZSTACK_AI_MESSAGE_10001 = "ORG_ZSTACK_AI_MESSAGE_10001"; + + public static final String ORG_ZSTACK_AI_MESSAGE_10002 = "ORG_ZSTACK_AI_MESSAGE_10002"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10000 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10000"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10001 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10001"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10002 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10002"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10003 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10003"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10004 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10004"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10005 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10005"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10006 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10006"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10007 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10007"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10008 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10008"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10009 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10009"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10010 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10010"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10011 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10011"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10012 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10012"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10013 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10013"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10014 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10014"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10015 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10015"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10016 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10016"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10017 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10017"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10018 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10018"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10019 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10019"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10020 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10020"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10021 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10021"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10022 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10022"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10023 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10023"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10024 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10024"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10025 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10025"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10026 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10026"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10027 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10027"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10028 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10028"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10029 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10029"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10030 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10030"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10031 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10031"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10032 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10032"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10033 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10033"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10034 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10034"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10035 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10035"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10036 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10036"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10037 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10037"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10038 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10038"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10039 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10039"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10040 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10040"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10041 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10041"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10042 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10042"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10043 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10043"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10044 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10044"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10045 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10045"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10046 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10046"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10047 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10047"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10048 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10048"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10049 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10049"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10050 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10050"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10051 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10051"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10052 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10052"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10053 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10053"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10054 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10054"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10055 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10055"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10056 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10056"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10057 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10057"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10058 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10058"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10059 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10059"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10060 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10060"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10061 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10061"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10062 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10062"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10063 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10063"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10064 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10064"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10065 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10065"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10066 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10066"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10067 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10067"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10068 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10068"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10069 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10069"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10070 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10070"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10071 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10071"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10072 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10072"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10073 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10073"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10074 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10074"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10075 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10075"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10076 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10076"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10077 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10077"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10078 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10078"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10079 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10079"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10080 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10080"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10081 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10081"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10082 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10082"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10083 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10083"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10084 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10084"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10085 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10085"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10086 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10086"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10087 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10087"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10000 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10000"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10001 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10001"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10002 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10002"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10003 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10003"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10004 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10004"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10005 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10005"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10000 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10000"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10001 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10001"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10002 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10002"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10003 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10003"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10004 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10004"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10005 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10005"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10006 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10006"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10007 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10007"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10008 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10008"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10009 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10009"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10010 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10010"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10011 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10011"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10012 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10012"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10013 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10013"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10014 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10014"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10015 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10015"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10016 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10016"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10017 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10017"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10018 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10018"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10019 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10019"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10020 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10020"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10021 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10021"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10022 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10022"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10023 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10023"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10024 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10024"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10025 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10025"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10026 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10026"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10027 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10027"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10028 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10028"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10029 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10029"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10030 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10030"; + + public static final String ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10031 = "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10031"; + + public static final String ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10000 = "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10000"; + + public static final String ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10001 = "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10001"; + + public static final String ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10002 = "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10002"; + + public static final String ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10003 = "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10003"; + + public static final String ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10004 = "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10004"; + + public static final String ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10005 = "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10005"; + + public static final String ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10006 = "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10006"; + + public static final String ORG_ZSTACK_AI_COLLECTOR_10000 = "ORG_ZSTACK_AI_COLLECTOR_10000"; + + public static final String ORG_ZSTACK_AI_COLLECTOR_10001 = "ORG_ZSTACK_AI_COLLECTOR_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10000 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10001 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10002 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10003 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10003"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10004 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10004"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10005 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10005"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10006 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10006"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10007 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10007"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10008 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10008"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10009 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10009"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10010 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10010"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10011 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10011"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10012 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10012"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10013 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10013"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10014 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10014"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10015 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10015"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10016 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10016"; + + public static final String ORG_ZSTACK_AI_EVALUATION_10000 = "ORG_ZSTACK_AI_EVALUATION_10000"; + + public static final String ORG_ZSTACK_AI_EVALUATION_10001 = "ORG_ZSTACK_AI_EVALUATION_10001"; + + public static final String ORG_ZSTACK_AI_EVALUATION_10002 = "ORG_ZSTACK_AI_EVALUATION_10002"; + + public static final String ORG_ZSTACK_POLICYROUTE_VYOS_10000 = "ORG_ZSTACK_POLICYROUTE_VYOS_10000"; + + public static final String ORG_ZSTACK_CRYPTO_DATATYPE_10000 = "ORG_ZSTACK_CRYPTO_DATATYPE_10000"; + + public static final String ORG_ZSTACK_CRYPTO_DATATYPE_10001 = "ORG_ZSTACK_CRYPTO_DATATYPE_10001"; + + public static final String ORG_ZSTACK_CRYPTO_DATATYPE_10002 = "ORG_ZSTACK_CRYPTO_DATATYPE_10002"; + + public static final String ORG_ZSTACK_CRYPTO_DATATYPE_10003 = "ORG_ZSTACK_CRYPTO_DATATYPE_10003"; + + public static final String ORG_ZSTACK_CRYPTO_DATATYPE_10004 = "ORG_ZSTACK_CRYPTO_DATATYPE_10004"; + + public static final String ORG_ZSTACK_CRYPTO_DATATYPE_10005 = "ORG_ZSTACK_CRYPTO_DATATYPE_10005"; + + public static final String ORG_ZSTACK_CRYPTO_DATATYPE_10006 = "ORG_ZSTACK_CRYPTO_DATATYPE_10006"; + + public static final String ORG_ZSTACK_AI_SERVICE_10000 = "ORG_ZSTACK_AI_SERVICE_10000"; + + public static final String ORG_ZSTACK_AI_SERVICE_10001 = "ORG_ZSTACK_AI_SERVICE_10001"; + + public static final String ORG_ZSTACK_AI_SERVICE_10002 = "ORG_ZSTACK_AI_SERVICE_10002"; + + public static final String ORG_ZSTACK_AI_SERVICE_10003 = "ORG_ZSTACK_AI_SERVICE_10003"; + + public static final String ORG_ZSTACK_AI_SERVICE_10004 = "ORG_ZSTACK_AI_SERVICE_10004"; + + public static final String ORG_ZSTACK_AI_SERVICE_10005 = "ORG_ZSTACK_AI_SERVICE_10005"; + + public static final String ORG_ZSTACK_AI_SERVICE_10006 = "ORG_ZSTACK_AI_SERVICE_10006"; + + public static final String ORG_ZSTACK_AI_SERVICE_10007 = "ORG_ZSTACK_AI_SERVICE_10007"; + + public static final String ORG_ZSTACK_AI_SERVICE_10008 = "ORG_ZSTACK_AI_SERVICE_10008"; + + public static final String ORG_ZSTACK_TAG_10000 = "ORG_ZSTACK_TAG_10000"; + + public static final String ORG_ZSTACK_TAG_10001 = "ORG_ZSTACK_TAG_10001"; + + public static final String ORG_ZSTACK_TAG_10002 = "ORG_ZSTACK_TAG_10002"; + + public static final String ORG_ZSTACK_TAG_10003 = "ORG_ZSTACK_TAG_10003"; + + public static final String ORG_ZSTACK_TAG_10004 = "ORG_ZSTACK_TAG_10004"; + + public static final String ORG_ZSTACK_TAG_10005 = "ORG_ZSTACK_TAG_10005"; + + public static final String ORG_ZSTACK_TAG_10006 = "ORG_ZSTACK_TAG_10006"; + + public static final String ORG_ZSTACK_TAG_10007 = "ORG_ZSTACK_TAG_10007"; + + public static final String ORG_ZSTACK_TAG_10008 = "ORG_ZSTACK_TAG_10008"; + + public static final String ORG_ZSTACK_TAG_10009 = "ORG_ZSTACK_TAG_10009"; + + public static final String ORG_ZSTACK_TAG_10010 = "ORG_ZSTACK_TAG_10010"; + + public static final String ORG_ZSTACK_TAG_10011 = "ORG_ZSTACK_TAG_10011"; + + public static final String ORG_ZSTACK_TAG_10012 = "ORG_ZSTACK_TAG_10012"; + + public static final String ORG_ZSTACK_TAG_10013 = "ORG_ZSTACK_TAG_10013"; + + public static final String ORG_ZSTACK_TAG_10014 = "ORG_ZSTACK_TAG_10014"; + + public static final String ORG_ZSTACK_TAG_10015 = "ORG_ZSTACK_TAG_10015"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_SHAREBLOCK_10000 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_SHAREBLOCK_10000"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10000 = "ORG_ZSTACK_STORAGE_MIGRATION_10000"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10001 = "ORG_ZSTACK_STORAGE_MIGRATION_10001"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10002 = "ORG_ZSTACK_STORAGE_MIGRATION_10002"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10003 = "ORG_ZSTACK_STORAGE_MIGRATION_10003"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10004 = "ORG_ZSTACK_STORAGE_MIGRATION_10004"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10005 = "ORG_ZSTACK_STORAGE_MIGRATION_10005"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10006 = "ORG_ZSTACK_STORAGE_MIGRATION_10006"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10007 = "ORG_ZSTACK_STORAGE_MIGRATION_10007"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10008 = "ORG_ZSTACK_STORAGE_MIGRATION_10008"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10009 = "ORG_ZSTACK_STORAGE_MIGRATION_10009"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10010 = "ORG_ZSTACK_STORAGE_MIGRATION_10010"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10011 = "ORG_ZSTACK_STORAGE_MIGRATION_10011"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10012 = "ORG_ZSTACK_STORAGE_MIGRATION_10012"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10013 = "ORG_ZSTACK_STORAGE_MIGRATION_10013"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10014 = "ORG_ZSTACK_STORAGE_MIGRATION_10014"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10015 = "ORG_ZSTACK_STORAGE_MIGRATION_10015"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10016 = "ORG_ZSTACK_STORAGE_MIGRATION_10016"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10017 = "ORG_ZSTACK_STORAGE_MIGRATION_10017"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10018 = "ORG_ZSTACK_STORAGE_MIGRATION_10018"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10019 = "ORG_ZSTACK_STORAGE_MIGRATION_10019"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10020 = "ORG_ZSTACK_STORAGE_MIGRATION_10020"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10021 = "ORG_ZSTACK_STORAGE_MIGRATION_10021"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10022 = "ORG_ZSTACK_STORAGE_MIGRATION_10022"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10023 = "ORG_ZSTACK_STORAGE_MIGRATION_10023"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10024 = "ORG_ZSTACK_STORAGE_MIGRATION_10024"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10025 = "ORG_ZSTACK_STORAGE_MIGRATION_10025"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10026 = "ORG_ZSTACK_STORAGE_MIGRATION_10026"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10027 = "ORG_ZSTACK_STORAGE_MIGRATION_10027"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10028 = "ORG_ZSTACK_STORAGE_MIGRATION_10028"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10029 = "ORG_ZSTACK_STORAGE_MIGRATION_10029"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10030 = "ORG_ZSTACK_STORAGE_MIGRATION_10030"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10031 = "ORG_ZSTACK_STORAGE_MIGRATION_10031"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10032 = "ORG_ZSTACK_STORAGE_MIGRATION_10032"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10033 = "ORG_ZSTACK_STORAGE_MIGRATION_10033"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10034 = "ORG_ZSTACK_STORAGE_MIGRATION_10034"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10035 = "ORG_ZSTACK_STORAGE_MIGRATION_10035"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10036 = "ORG_ZSTACK_STORAGE_MIGRATION_10036"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_10037 = "ORG_ZSTACK_STORAGE_MIGRATION_10037"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10000 = "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10000"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10001 = "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10001"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10002 = "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10002"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_REFERENCE_10000 = "ORG_ZSTACK_STORAGE_SNAPSHOT_REFERENCE_10000"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10000 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10000"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10001 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10001"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10002 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10002"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10003 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10003"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10004 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10004"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10005 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10005"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10006 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10006"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10007 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10007"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10008 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10008"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10009 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10009"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10010 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10010"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10011 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10011"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10012 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10012"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10013 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_CSP_10013"; + + public static final String ORG_ZSTACK_EXPON_10000 = "ORG_ZSTACK_EXPON_10000"; + + public static final String ORG_ZSTACK_EXPON_10001 = "ORG_ZSTACK_EXPON_10001"; + + public static final String ORG_ZSTACK_EXPON_10002 = "ORG_ZSTACK_EXPON_10002"; + + public static final String ORG_ZSTACK_EXPON_10003 = "ORG_ZSTACK_EXPON_10003"; + + public static final String ORG_ZSTACK_EXPON_10004 = "ORG_ZSTACK_EXPON_10004"; + + public static final String ORG_ZSTACK_EXPON_10005 = "ORG_ZSTACK_EXPON_10005"; + + public static final String ORG_ZSTACK_EXPON_10006 = "ORG_ZSTACK_EXPON_10006"; + + public static final String ORG_ZSTACK_EXPON_10007 = "ORG_ZSTACK_EXPON_10007"; + + public static final String ORG_ZSTACK_EXPON_10008 = "ORG_ZSTACK_EXPON_10008"; + + public static final String ORG_ZSTACK_EXPON_10009 = "ORG_ZSTACK_EXPON_10009"; + + public static final String ORG_ZSTACK_EXPON_10010 = "ORG_ZSTACK_EXPON_10010"; + + public static final String ORG_ZSTACK_EXPON_10011 = "ORG_ZSTACK_EXPON_10011"; + + public static final String ORG_ZSTACK_IMAGEREPLICATOR_10000 = "ORG_ZSTACK_IMAGEREPLICATOR_10000"; + + public static final String ORG_ZSTACK_IMAGEREPLICATOR_10001 = "ORG_ZSTACK_IMAGEREPLICATOR_10001"; + + public static final String ORG_ZSTACK_IMAGEREPLICATOR_10002 = "ORG_ZSTACK_IMAGEREPLICATOR_10002"; + + public static final String ORG_ZSTACK_IMAGEREPLICATOR_10003 = "ORG_ZSTACK_IMAGEREPLICATOR_10003"; + + public static final String ORG_ZSTACK_SSHKEYPAIR_10000 = "ORG_ZSTACK_SSHKEYPAIR_10000"; + + public static final String ORG_ZSTACK_SSHKEYPAIR_10001 = "ORG_ZSTACK_SSHKEYPAIR_10001"; + + public static final String ORG_ZSTACK_SSHKEYPAIR_10002 = "ORG_ZSTACK_SSHKEYPAIR_10002"; + + public static final String ORG_ZSTACK_SSHKEYPAIR_10003 = "ORG_ZSTACK_SSHKEYPAIR_10003"; + + public static final String ORG_ZSTACK_SSHKEYPAIR_10004 = "ORG_ZSTACK_SSHKEYPAIR_10004"; + + public static final String ORG_ZSTACK_SSHKEYPAIR_10005 = "ORG_ZSTACK_SSHKEYPAIR_10005"; + + public static final String ORG_ZSTACK_SSHKEYPAIR_10006 = "ORG_ZSTACK_SSHKEYPAIR_10006"; + + public static final String ORG_ZSTACK_SSHKEYPAIR_10007 = "ORG_ZSTACK_SSHKEYPAIR_10007"; + + public static final String ORG_ZSTACK_SSHKEYPAIR_10008 = "ORG_ZSTACK_SSHKEYPAIR_10008"; + + public static final String ORG_ZSTACK_SSHKEYPAIR_10009 = "ORG_ZSTACK_SSHKEYPAIR_10009"; + + public static final String ORG_ZSTACK_SSHKEYPAIR_10010 = "ORG_ZSTACK_SSHKEYPAIR_10010"; + + public static final String ORG_ZSTACK_SSHKEYPAIR_10011 = "ORG_ZSTACK_SSHKEYPAIR_10011"; + + public static final String ORG_ZSTACK_CRYPTO_DATACRYPTO_SMP_10000 = "ORG_ZSTACK_CRYPTO_DATACRYPTO_SMP_10000"; + + public static final String ORG_ZSTACK_LONGJOB_10000 = "ORG_ZSTACK_LONGJOB_10000"; + + public static final String ORG_ZSTACK_LONGJOB_10001 = "ORG_ZSTACK_LONGJOB_10001"; + + public static final String ORG_ZSTACK_LONGJOB_10002 = "ORG_ZSTACK_LONGJOB_10002"; + + public static final String ORG_ZSTACK_LONGJOB_10003 = "ORG_ZSTACK_LONGJOB_10003"; + + public static final String ORG_ZSTACK_LONGJOB_10004 = "ORG_ZSTACK_LONGJOB_10004"; + + public static final String ORG_ZSTACK_LONGJOB_10005 = "ORG_ZSTACK_LONGJOB_10005"; + + public static final String ORG_ZSTACK_LONGJOB_10006 = "ORG_ZSTACK_LONGJOB_10006"; + + public static final String ORG_ZSTACK_LONGJOB_10007 = "ORG_ZSTACK_LONGJOB_10007"; + + public static final String ORG_ZSTACK_LONGJOB_10008 = "ORG_ZSTACK_LONGJOB_10008"; + + public static final String ORG_ZSTACK_LONGJOB_10009 = "ORG_ZSTACK_LONGJOB_10009"; + + public static final String ORG_ZSTACK_LONGJOB_10010 = "ORG_ZSTACK_LONGJOB_10010"; + + public static final String ORG_ZSTACK_LONGJOB_10011 = "ORG_ZSTACK_LONGJOB_10011"; + + public static final String ORG_ZSTACK_LONGJOB_10012 = "ORG_ZSTACK_LONGJOB_10012"; + + public static final String ORG_ZSTACK_LONGJOB_10013 = "ORG_ZSTACK_LONGJOB_10013"; + + public static final String ORG_ZSTACK_LONGJOB_10014 = "ORG_ZSTACK_LONGJOB_10014"; + + public static final String ORG_ZSTACK_LONGJOB_10015 = "ORG_ZSTACK_LONGJOB_10015"; + + public static final String ORG_ZSTACK_LONGJOB_10016 = "ORG_ZSTACK_LONGJOB_10016"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10000 = "ORG_ZSTACK_COMPUTE_SRIOV_10000"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10001 = "ORG_ZSTACK_COMPUTE_SRIOV_10001"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10002 = "ORG_ZSTACK_COMPUTE_SRIOV_10002"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10003 = "ORG_ZSTACK_COMPUTE_SRIOV_10003"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10004 = "ORG_ZSTACK_COMPUTE_SRIOV_10004"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10005 = "ORG_ZSTACK_COMPUTE_SRIOV_10005"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10006 = "ORG_ZSTACK_COMPUTE_SRIOV_10006"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10007 = "ORG_ZSTACK_COMPUTE_SRIOV_10007"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10008 = "ORG_ZSTACK_COMPUTE_SRIOV_10008"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10009 = "ORG_ZSTACK_COMPUTE_SRIOV_10009"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10010 = "ORG_ZSTACK_COMPUTE_SRIOV_10010"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10011 = "ORG_ZSTACK_COMPUTE_SRIOV_10011"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10012 = "ORG_ZSTACK_COMPUTE_SRIOV_10012"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10013 = "ORG_ZSTACK_COMPUTE_SRIOV_10013"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10014 = "ORG_ZSTACK_COMPUTE_SRIOV_10014"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10015 = "ORG_ZSTACK_COMPUTE_SRIOV_10015"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10016 = "ORG_ZSTACK_COMPUTE_SRIOV_10016"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10017 = "ORG_ZSTACK_COMPUTE_SRIOV_10017"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10018 = "ORG_ZSTACK_COMPUTE_SRIOV_10018"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10019 = "ORG_ZSTACK_COMPUTE_SRIOV_10019"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10020 = "ORG_ZSTACK_COMPUTE_SRIOV_10020"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10021 = "ORG_ZSTACK_COMPUTE_SRIOV_10021"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10022 = "ORG_ZSTACK_COMPUTE_SRIOV_10022"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10023 = "ORG_ZSTACK_COMPUTE_SRIOV_10023"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10024 = "ORG_ZSTACK_COMPUTE_SRIOV_10024"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10025 = "ORG_ZSTACK_COMPUTE_SRIOV_10025"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10026 = "ORG_ZSTACK_COMPUTE_SRIOV_10026"; + + public static final String ORG_ZSTACK_COMPUTE_SRIOV_10027 = "ORG_ZSTACK_COMPUTE_SRIOV_10027"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10000 = "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10000"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10001 = "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10001"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10002 = "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10002"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10003 = "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10003"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10004 = "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10004"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10005 = "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10005"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10006 = "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10006"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10007 = "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10007"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10008 = "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10008"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10009 = "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10009"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10010 = "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10010"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10000 = "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10000"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10001 = "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10001"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10002 = "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10002"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10003 = "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10003"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10004 = "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10004"; + + public static final String ORG_ZSTACK_CBD_KVM_10000 = "ORG_ZSTACK_CBD_KVM_10000"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_10000 = "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_10000"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_10001 = "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_10001"; + + public static final String ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10000 = "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10000"; + + public static final String ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10001 = "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10001"; + + public static final String ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10002 = "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10002"; + + public static final String ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10003 = "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10003"; + + public static final String ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10004 = "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10004"; + + public static final String ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10005 = "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10005"; + + public static final String ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10006 = "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10006"; + + public static final String ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10007 = "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10007"; + + public static final String ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10008 = "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10008"; + + public static final String ORG_ZSTACK_CORE_TRASH_10000 = "ORG_ZSTACK_CORE_TRASH_10000"; + + public static final String ORG_ZSTACK_CORE_TRASH_10001 = "ORG_ZSTACK_CORE_TRASH_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_HA_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_HA_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_HA_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_HA_10001"; + + public static final String ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10000 = "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10000"; + + public static final String ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10001 = "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10001"; + + public static final String ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10002 = "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_HYBRID_ECS_10000 = "ORG_ZSTACK_TEST_INTEGRATION_HYBRID_ECS_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_HYBRID_ECS_10001 = "ORG_ZSTACK_TEST_INTEGRATION_HYBRID_ECS_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_HYBRID_ECS_10002 = "ORG_ZSTACK_TEST_INTEGRATION_HYBRID_ECS_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_HYBRID_ECS_10003 = "ORG_ZSTACK_TEST_INTEGRATION_HYBRID_ECS_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_HYBRID_ECS_10004 = "ORG_ZSTACK_TEST_INTEGRATION_HYBRID_ECS_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_HYBRID_ECS_10005 = "ORG_ZSTACK_TEST_INTEGRATION_HYBRID_ECS_10005"; + + public static final String ORG_ZSTACK_ZWATCH_MONITORGROUP_10000 = "ORG_ZSTACK_ZWATCH_MONITORGROUP_10000"; + + public static final String ORG_ZSTACK_ZWATCH_MONITORGROUP_10001 = "ORG_ZSTACK_ZWATCH_MONITORGROUP_10001"; + + public static final String ORG_ZSTACK_ZWATCH_MONITORGROUP_10002 = "ORG_ZSTACK_ZWATCH_MONITORGROUP_10002"; + + public static final String ORG_ZSTACK_ZWATCH_MONITORGROUP_10003 = "ORG_ZSTACK_ZWATCH_MONITORGROUP_10003"; + + public static final String ORG_ZSTACK_ZWATCH_MONITORGROUP_10004 = "ORG_ZSTACK_ZWATCH_MONITORGROUP_10004"; + + public static final String ORG_ZSTACK_ZWATCH_MONITORGROUP_10005 = "ORG_ZSTACK_ZWATCH_MONITORGROUP_10005"; + + public static final String ORG_ZSTACK_ZWATCH_MONITORGROUP_10006 = "ORG_ZSTACK_ZWATCH_MONITORGROUP_10006"; + + public static final String ORG_ZSTACK_CONTAINER_10000 = "ORG_ZSTACK_CONTAINER_10000"; + + public static final String ORG_ZSTACK_CONTAINER_10001 = "ORG_ZSTACK_CONTAINER_10001"; + + public static final String ORG_ZSTACK_CONTAINER_10002 = "ORG_ZSTACK_CONTAINER_10002"; + + public static final String ORG_ZSTACK_CONTAINER_10003 = "ORG_ZSTACK_CONTAINER_10003"; + + public static final String ORG_ZSTACK_CONTAINER_10004 = "ORG_ZSTACK_CONTAINER_10004"; + + public static final String ORG_ZSTACK_CONTAINER_10005 = "ORG_ZSTACK_CONTAINER_10005"; + + public static final String ORG_ZSTACK_CONTAINER_10006 = "ORG_ZSTACK_CONTAINER_10006"; + + public static final String ORG_ZSTACK_CONTAINER_10007 = "ORG_ZSTACK_CONTAINER_10007"; + + public static final String ORG_ZSTACK_CONTAINER_10008 = "ORG_ZSTACK_CONTAINER_10008"; + + public static final String ORG_ZSTACK_CONTAINER_10009 = "ORG_ZSTACK_CONTAINER_10009"; + + public static final String ORG_ZSTACK_CONTAINER_10010 = "ORG_ZSTACK_CONTAINER_10010"; + + public static final String ORG_ZSTACK_CONTAINER_10011 = "ORG_ZSTACK_CONTAINER_10011"; + + public static final String ORG_ZSTACK_CONTAINER_10012 = "ORG_ZSTACK_CONTAINER_10012"; + + public static final String ORG_ZSTACK_CONTAINER_10013 = "ORG_ZSTACK_CONTAINER_10013"; + + public static final String ORG_ZSTACK_CONTAINER_10014 = "ORG_ZSTACK_CONTAINER_10014"; + + public static final String ORG_ZSTACK_CONTAINER_10015 = "ORG_ZSTACK_CONTAINER_10015"; + + public static final String ORG_ZSTACK_CONTAINER_10016 = "ORG_ZSTACK_CONTAINER_10016"; + + public static final String ORG_ZSTACK_CONTAINER_10017 = "ORG_ZSTACK_CONTAINER_10017"; + + public static final String ORG_ZSTACK_CONTAINER_10018 = "ORG_ZSTACK_CONTAINER_10018"; + + public static final String ORG_ZSTACK_CONTAINER_10019 = "ORG_ZSTACK_CONTAINER_10019"; + + public static final String ORG_ZSTACK_CONTAINER_10020 = "ORG_ZSTACK_CONTAINER_10020"; + + public static final String ORG_ZSTACK_CONTAINER_10021 = "ORG_ZSTACK_CONTAINER_10021"; + + public static final String ORG_ZSTACK_CONTAINER_10022 = "ORG_ZSTACK_CONTAINER_10022"; + + public static final String ORG_ZSTACK_CONTAINER_10023 = "ORG_ZSTACK_CONTAINER_10023"; + + public static final String ORG_ZSTACK_CONTAINER_10024 = "ORG_ZSTACK_CONTAINER_10024"; + + public static final String ORG_ZSTACK_CONTAINER_10025 = "ORG_ZSTACK_CONTAINER_10025"; + + public static final String ORG_ZSTACK_CONTAINER_10026 = "ORG_ZSTACK_CONTAINER_10026"; + + public static final String ORG_ZSTACK_CONTAINER_10027 = "ORG_ZSTACK_CONTAINER_10027"; + + public static final String ORG_ZSTACK_CONTAINER_10028 = "ORG_ZSTACK_CONTAINER_10028"; + + public static final String ORG_ZSTACK_CONTAINER_10029 = "ORG_ZSTACK_CONTAINER_10029"; + + public static final String ORG_ZSTACK_CONTAINER_10030 = "ORG_ZSTACK_CONTAINER_10030"; + + public static final String ORG_ZSTACK_CONTAINER_10031 = "ORG_ZSTACK_CONTAINER_10031"; + + public static final String ORG_ZSTACK_CONTAINER_10032 = "ORG_ZSTACK_CONTAINER_10032"; + + public static final String ORG_ZSTACK_CONTAINER_10033 = "ORG_ZSTACK_CONTAINER_10033"; + + public static final String ORG_ZSTACK_CONTAINER_10034 = "ORG_ZSTACK_CONTAINER_10034"; + + public static final String ORG_ZSTACK_CONTAINER_10035 = "ORG_ZSTACK_CONTAINER_10035"; + + public static final String ORG_ZSTACK_CONTAINER_10036 = "ORG_ZSTACK_CONTAINER_10036"; + + public static final String ORG_ZSTACK_CONTAINER_10037 = "ORG_ZSTACK_CONTAINER_10037"; + + public static final String ORG_ZSTACK_CONTAINER_10038 = "ORG_ZSTACK_CONTAINER_10038"; + + public static final String ORG_ZSTACK_CONTAINER_10039 = "ORG_ZSTACK_CONTAINER_10039"; + + public static final String ORG_ZSTACK_CONTAINER_10040 = "ORG_ZSTACK_CONTAINER_10040"; + + public static final String ORG_ZSTACK_CONTAINER_10041 = "ORG_ZSTACK_CONTAINER_10041"; + + public static final String ORG_ZSTACK_CONTAINER_10042 = "ORG_ZSTACK_CONTAINER_10042"; + + public static final String ORG_ZSTACK_CONTAINER_10043 = "ORG_ZSTACK_CONTAINER_10043"; + + public static final String ORG_ZSTACK_CONTAINER_10044 = "ORG_ZSTACK_CONTAINER_10044"; + + public static final String ORG_ZSTACK_CONTAINER_10045 = "ORG_ZSTACK_CONTAINER_10045"; + + public static final String ORG_ZSTACK_CONTAINER_10046 = "ORG_ZSTACK_CONTAINER_10046"; + + public static final String ORG_ZSTACK_CONTAINER_10047 = "ORG_ZSTACK_CONTAINER_10047"; + + public static final String ORG_ZSTACK_CONTAINER_10048 = "ORG_ZSTACK_CONTAINER_10048"; + + public static final String ORG_ZSTACK_CONTAINER_10049 = "ORG_ZSTACK_CONTAINER_10049"; + + public static final String ORG_ZSTACK_CONTAINER_10050 = "ORG_ZSTACK_CONTAINER_10050"; + + public static final String ORG_ZSTACK_CONTAINER_10051 = "ORG_ZSTACK_CONTAINER_10051"; + + public static final String ORG_ZSTACK_CONTAINER_10052 = "ORG_ZSTACK_CONTAINER_10052"; + + public static final String ORG_ZSTACK_CONTAINER_10053 = "ORG_ZSTACK_CONTAINER_10053"; + + public static final String ORG_ZSTACK_CONTAINER_10054 = "ORG_ZSTACK_CONTAINER_10054"; + + public static final String ORG_ZSTACK_CONTAINER_10055 = "ORG_ZSTACK_CONTAINER_10055"; + + public static final String ORG_ZSTACK_CONTAINER_10056 = "ORG_ZSTACK_CONTAINER_10056"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_HTTP_10000 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_HTTP_10000"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_HTTP_10001 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_HTTP_10001"; + + public static final String ORG_ZSTACK_CORE_DEBUG_10000 = "ORG_ZSTACK_CORE_DEBUG_10000"; + + public static final String ORG_ZSTACK_TICKET_EXECUTOR_10000 = "ORG_ZSTACK_TICKET_EXECUTOR_10000"; + + public static final String ORG_ZSTACK_TICKET_EXECUTOR_10001 = "ORG_ZSTACK_TICKET_EXECUTOR_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_COMPUTE_HOSTALLOCATESTRATEGY_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_COMPUTE_HOSTALLOCATESTRATEGY_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_COMPUTE_HOSTALLOCATESTRATEGY_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_COMPUTE_HOSTALLOCATESTRATEGY_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_COMPUTE_HOSTALLOCATESTRATEGY_10002 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_COMPUTE_HOSTALLOCATESTRATEGY_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_COMPUTE_HOSTALLOCATESTRATEGY_10003 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_COMPUTE_HOSTALLOCATESTRATEGY_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_COMPUTE_HOSTALLOCATESTRATEGY_10004 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_COMPUTE_HOSTALLOCATESTRATEGY_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_COMPUTE_HOSTALLOCATESTRATEGY_10005 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_COMPUTE_HOSTALLOCATESTRATEGY_10005"; + + public static final String ORG_ZSTACK_V2V_KVM_10000 = "ORG_ZSTACK_V2V_KVM_10000"; + + public static final String ORG_ZSTACK_V2V_KVM_10001 = "ORG_ZSTACK_V2V_KVM_10001"; + + public static final String ORG_ZSTACK_V2V_KVM_10002 = "ORG_ZSTACK_V2V_KVM_10002"; + + public static final String ORG_ZSTACK_V2V_KVM_10003 = "ORG_ZSTACK_V2V_KVM_10003"; + + public static final String ORG_ZSTACK_V2V_KVM_10004 = "ORG_ZSTACK_V2V_KVM_10004"; + + public static final String ORG_ZSTACK_V2V_KVM_10005 = "ORG_ZSTACK_V2V_KVM_10005"; + + public static final String ORG_ZSTACK_V2V_KVM_10006 = "ORG_ZSTACK_V2V_KVM_10006"; + + public static final String ORG_ZSTACK_V2V_KVM_10007 = "ORG_ZSTACK_V2V_KVM_10007"; + + public static final String ORG_ZSTACK_V2V_KVM_10008 = "ORG_ZSTACK_V2V_KVM_10008"; + + public static final String ORG_ZSTACK_V2V_KVM_10009 = "ORG_ZSTACK_V2V_KVM_10009"; + + public static final String ORG_ZSTACK_V2V_KVM_10010 = "ORG_ZSTACK_V2V_KVM_10010"; + + public static final String ORG_ZSTACK_V2V_KVM_10011 = "ORG_ZSTACK_V2V_KVM_10011"; + + public static final String ORG_ZSTACK_V2V_KVM_10012 = "ORG_ZSTACK_V2V_KVM_10012"; + + public static final String ORG_ZSTACK_IPSEC_VYOS_10000 = "ORG_ZSTACK_IPSEC_VYOS_10000"; + + public static final String ORG_ZSTACK_IPSEC_VYOS_10001 = "ORG_ZSTACK_IPSEC_VYOS_10001"; + + public static final String ORG_ZSTACK_IPSEC_VYOS_10002 = "ORG_ZSTACK_IPSEC_VYOS_10002"; + + public static final String ORG_ZSTACK_IPSEC_VYOS_10003 = "ORG_ZSTACK_IPSEC_VYOS_10003"; + + public static final String ORG_ZSTACK_IPSEC_VYOS_10004 = "ORG_ZSTACK_IPSEC_VYOS_10004"; + + public static final String ORG_ZSTACK_IPSEC_VYOS_10005 = "ORG_ZSTACK_IPSEC_VYOS_10005"; + + public static final String ORG_ZSTACK_IPSEC_VYOS_10006 = "ORG_ZSTACK_IPSEC_VYOS_10006"; + + public static final String ORG_ZSTACK_IPSEC_VYOS_10007 = "ORG_ZSTACK_IPSEC_VYOS_10007"; + + public static final String ORG_ZSTACK_IPSEC_VYOS_10008 = "ORG_ZSTACK_IPSEC_VYOS_10008"; + + public static final String ORG_ZSTACK_IPSEC_VYOS_10009 = "ORG_ZSTACK_IPSEC_VYOS_10009"; + + public static final String ORG_ZSTACK_IPSEC_VYOS_10010 = "ORG_ZSTACK_IPSEC_VYOS_10010"; + + public static final String ORG_ZSTACK_IPSEC_VYOS_10011 = "ORG_ZSTACK_IPSEC_VYOS_10011"; + + public static final String ORG_ZSTACK_IPSEC_VYOS_10012 = "ORG_ZSTACK_IPSEC_VYOS_10012"; + + public static final String ORG_ZSTACK_IPSEC_VYOS_10013 = "ORG_ZSTACK_IPSEC_VYOS_10013"; + + public static final String ORG_ZSTACK_IPSEC_VYOS_10014 = "ORG_ZSTACK_IPSEC_VYOS_10014"; + + public static final String ORG_ZSTACK_IPSEC_VYOS_10015 = "ORG_ZSTACK_IPSEC_VYOS_10015"; + + public static final String ORG_ZSTACK_IPSEC_VYOS_10016 = "ORG_ZSTACK_IPSEC_VYOS_10016"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10002 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10003 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10004 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10005 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10005"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10006 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10006"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10007 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10007"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10008 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10008"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10009 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10009"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10010 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10010"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10011 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10011"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10012 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10012"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10013 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VOLUMEBACKUP_10013"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10000 = "ORG_ZSTACK_FAULTTOLERANCE_10000"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10001 = "ORG_ZSTACK_FAULTTOLERANCE_10001"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10002 = "ORG_ZSTACK_FAULTTOLERANCE_10002"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10003 = "ORG_ZSTACK_FAULTTOLERANCE_10003"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10004 = "ORG_ZSTACK_FAULTTOLERANCE_10004"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10005 = "ORG_ZSTACK_FAULTTOLERANCE_10005"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10006 = "ORG_ZSTACK_FAULTTOLERANCE_10006"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10007 = "ORG_ZSTACK_FAULTTOLERANCE_10007"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10008 = "ORG_ZSTACK_FAULTTOLERANCE_10008"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10009 = "ORG_ZSTACK_FAULTTOLERANCE_10009"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10010 = "ORG_ZSTACK_FAULTTOLERANCE_10010"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10011 = "ORG_ZSTACK_FAULTTOLERANCE_10011"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10012 = "ORG_ZSTACK_FAULTTOLERANCE_10012"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10013 = "ORG_ZSTACK_FAULTTOLERANCE_10013"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10014 = "ORG_ZSTACK_FAULTTOLERANCE_10014"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10015 = "ORG_ZSTACK_FAULTTOLERANCE_10015"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10016 = "ORG_ZSTACK_FAULTTOLERANCE_10016"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10017 = "ORG_ZSTACK_FAULTTOLERANCE_10017"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10018 = "ORG_ZSTACK_FAULTTOLERANCE_10018"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10019 = "ORG_ZSTACK_FAULTTOLERANCE_10019"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10020 = "ORG_ZSTACK_FAULTTOLERANCE_10020"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10021 = "ORG_ZSTACK_FAULTTOLERANCE_10021"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10022 = "ORG_ZSTACK_FAULTTOLERANCE_10022"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10023 = "ORG_ZSTACK_FAULTTOLERANCE_10023"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10024 = "ORG_ZSTACK_FAULTTOLERANCE_10024"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10025 = "ORG_ZSTACK_FAULTTOLERANCE_10025"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10026 = "ORG_ZSTACK_FAULTTOLERANCE_10026"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10027 = "ORG_ZSTACK_FAULTTOLERANCE_10027"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10028 = "ORG_ZSTACK_FAULTTOLERANCE_10028"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10029 = "ORG_ZSTACK_FAULTTOLERANCE_10029"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10030 = "ORG_ZSTACK_FAULTTOLERANCE_10030"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10031 = "ORG_ZSTACK_FAULTTOLERANCE_10031"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10032 = "ORG_ZSTACK_FAULTTOLERANCE_10032"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10033 = "ORG_ZSTACK_FAULTTOLERANCE_10033"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10034 = "ORG_ZSTACK_FAULTTOLERANCE_10034"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10035 = "ORG_ZSTACK_FAULTTOLERANCE_10035"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10036 = "ORG_ZSTACK_FAULTTOLERANCE_10036"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10037 = "ORG_ZSTACK_FAULTTOLERANCE_10037"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10038 = "ORG_ZSTACK_FAULTTOLERANCE_10038"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10039 = "ORG_ZSTACK_FAULTTOLERANCE_10039"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10040 = "ORG_ZSTACK_FAULTTOLERANCE_10040"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10041 = "ORG_ZSTACK_FAULTTOLERANCE_10041"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10042 = "ORG_ZSTACK_FAULTTOLERANCE_10042"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10043 = "ORG_ZSTACK_FAULTTOLERANCE_10043"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10044 = "ORG_ZSTACK_FAULTTOLERANCE_10044"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10045 = "ORG_ZSTACK_FAULTTOLERANCE_10045"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10046 = "ORG_ZSTACK_FAULTTOLERANCE_10046"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10047 = "ORG_ZSTACK_FAULTTOLERANCE_10047"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10048 = "ORG_ZSTACK_FAULTTOLERANCE_10048"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10049 = "ORG_ZSTACK_FAULTTOLERANCE_10049"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10050 = "ORG_ZSTACK_FAULTTOLERANCE_10050"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10051 = "ORG_ZSTACK_FAULTTOLERANCE_10051"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10052 = "ORG_ZSTACK_FAULTTOLERANCE_10052"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10053 = "ORG_ZSTACK_FAULTTOLERANCE_10053"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10054 = "ORG_ZSTACK_FAULTTOLERANCE_10054"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10055 = "ORG_ZSTACK_FAULTTOLERANCE_10055"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10056 = "ORG_ZSTACK_FAULTTOLERANCE_10056"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10057 = "ORG_ZSTACK_FAULTTOLERANCE_10057"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10058 = "ORG_ZSTACK_FAULTTOLERANCE_10058"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10059 = "ORG_ZSTACK_FAULTTOLERANCE_10059"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10060 = "ORG_ZSTACK_FAULTTOLERANCE_10060"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10061 = "ORG_ZSTACK_FAULTTOLERANCE_10061"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10062 = "ORG_ZSTACK_FAULTTOLERANCE_10062"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10063 = "ORG_ZSTACK_FAULTTOLERANCE_10063"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10064 = "ORG_ZSTACK_FAULTTOLERANCE_10064"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10065 = "ORG_ZSTACK_FAULTTOLERANCE_10065"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10066 = "ORG_ZSTACK_FAULTTOLERANCE_10066"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10067 = "ORG_ZSTACK_FAULTTOLERANCE_10067"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10068 = "ORG_ZSTACK_FAULTTOLERANCE_10068"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10069 = "ORG_ZSTACK_FAULTTOLERANCE_10069"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10070 = "ORG_ZSTACK_FAULTTOLERANCE_10070"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10071 = "ORG_ZSTACK_FAULTTOLERANCE_10071"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10072 = "ORG_ZSTACK_FAULTTOLERANCE_10072"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10073 = "ORG_ZSTACK_FAULTTOLERANCE_10073"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10074 = "ORG_ZSTACK_FAULTTOLERANCE_10074"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10075 = "ORG_ZSTACK_FAULTTOLERANCE_10075"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10076 = "ORG_ZSTACK_FAULTTOLERANCE_10076"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10077 = "ORG_ZSTACK_FAULTTOLERANCE_10077"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10078 = "ORG_ZSTACK_FAULTTOLERANCE_10078"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10079 = "ORG_ZSTACK_FAULTTOLERANCE_10079"; + + public static final String ORG_ZSTACK_FAULTTOLERANCE_10080 = "ORG_ZSTACK_FAULTTOLERANCE_10080"; + + public static final String ORG_ZSTACK_APPCENTER_UTILS_10000 = "ORG_ZSTACK_APPCENTER_UTILS_10000"; + + public static final String ORG_ZSTACK_APPCENTER_UTILS_10001 = "ORG_ZSTACK_APPCENTER_UTILS_10001"; + + public static final String ORG_ZSTACK_EXPON_SDK_10000 = "ORG_ZSTACK_EXPON_SDK_10000"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10000 = "ORG_ZSTACK_CLOUDFORMATION_10000"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10001 = "ORG_ZSTACK_CLOUDFORMATION_10001"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10002 = "ORG_ZSTACK_CLOUDFORMATION_10002"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10003 = "ORG_ZSTACK_CLOUDFORMATION_10003"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10004 = "ORG_ZSTACK_CLOUDFORMATION_10004"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10005 = "ORG_ZSTACK_CLOUDFORMATION_10005"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10006 = "ORG_ZSTACK_CLOUDFORMATION_10006"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10007 = "ORG_ZSTACK_CLOUDFORMATION_10007"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10008 = "ORG_ZSTACK_CLOUDFORMATION_10008"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10009 = "ORG_ZSTACK_CLOUDFORMATION_10009"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10010 = "ORG_ZSTACK_CLOUDFORMATION_10010"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10011 = "ORG_ZSTACK_CLOUDFORMATION_10011"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10012 = "ORG_ZSTACK_CLOUDFORMATION_10012"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10013 = "ORG_ZSTACK_CLOUDFORMATION_10013"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10014 = "ORG_ZSTACK_CLOUDFORMATION_10014"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10015 = "ORG_ZSTACK_CLOUDFORMATION_10015"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10016 = "ORG_ZSTACK_CLOUDFORMATION_10016"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10017 = "ORG_ZSTACK_CLOUDFORMATION_10017"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10018 = "ORG_ZSTACK_CLOUDFORMATION_10018"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10019 = "ORG_ZSTACK_CLOUDFORMATION_10019"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10020 = "ORG_ZSTACK_CLOUDFORMATION_10020"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10021 = "ORG_ZSTACK_CLOUDFORMATION_10021"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10022 = "ORG_ZSTACK_CLOUDFORMATION_10022"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10023 = "ORG_ZSTACK_CLOUDFORMATION_10023"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10024 = "ORG_ZSTACK_CLOUDFORMATION_10024"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10025 = "ORG_ZSTACK_CLOUDFORMATION_10025"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10026 = "ORG_ZSTACK_CLOUDFORMATION_10026"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10027 = "ORG_ZSTACK_CLOUDFORMATION_10027"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10028 = "ORG_ZSTACK_CLOUDFORMATION_10028"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10029 = "ORG_ZSTACK_CLOUDFORMATION_10029"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10030 = "ORG_ZSTACK_CLOUDFORMATION_10030"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10031 = "ORG_ZSTACK_CLOUDFORMATION_10031"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10032 = "ORG_ZSTACK_CLOUDFORMATION_10032"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10033 = "ORG_ZSTACK_CLOUDFORMATION_10033"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_10034 = "ORG_ZSTACK_CLOUDFORMATION_10034"; + + public static final String ORG_ZSTACK_AI_VM_10000 = "ORG_ZSTACK_AI_VM_10000"; + + public static final String ORG_ZSTACK_AI_VM_10001 = "ORG_ZSTACK_AI_VM_10001"; + + public static final String ORG_ZSTACK_AI_VM_10002 = "ORG_ZSTACK_AI_VM_10002"; + + public static final String ORG_ZSTACK_AI_VM_10003 = "ORG_ZSTACK_AI_VM_10003"; + + public static final String ORG_ZSTACK_AI_VM_10004 = "ORG_ZSTACK_AI_VM_10004"; + + public static final String ORG_ZSTACK_AI_VM_10005 = "ORG_ZSTACK_AI_VM_10005"; + + public static final String ORG_ZSTACK_AI_VM_10006 = "ORG_ZSTACK_AI_VM_10006"; + + public static final String ORG_ZSTACK_AI_VM_10007 = "ORG_ZSTACK_AI_VM_10007"; + + public static final String ORG_ZSTACK_AI_VM_10008 = "ORG_ZSTACK_AI_VM_10008"; + + public static final String ORG_ZSTACK_AI_VM_10009 = "ORG_ZSTACK_AI_VM_10009"; + + public static final String ORG_ZSTACK_AI_VM_10010 = "ORG_ZSTACK_AI_VM_10010"; + + public static final String ORG_ZSTACK_AI_VM_10011 = "ORG_ZSTACK_AI_VM_10011"; + + public static final String ORG_ZSTACK_OVF_DATATYPE_10000 = "ORG_ZSTACK_OVF_DATATYPE_10000"; + + public static final String ORG_ZSTACK_OVF_DATATYPE_10001 = "ORG_ZSTACK_OVF_DATATYPE_10001"; + + public static final String ORG_ZSTACK_OVF_DATATYPE_10002 = "ORG_ZSTACK_OVF_DATATYPE_10002"; + + public static final String ORG_ZSTACK_STORAGE_SNAPSHOT_GROUP_10000 = "ORG_ZSTACK_STORAGE_SNAPSHOT_GROUP_10000"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10000 = "ORG_ZSTACK_COMPUTE_BONDING_10000"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10001 = "ORG_ZSTACK_COMPUTE_BONDING_10001"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10002 = "ORG_ZSTACK_COMPUTE_BONDING_10002"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10003 = "ORG_ZSTACK_COMPUTE_BONDING_10003"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10004 = "ORG_ZSTACK_COMPUTE_BONDING_10004"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10005 = "ORG_ZSTACK_COMPUTE_BONDING_10005"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10006 = "ORG_ZSTACK_COMPUTE_BONDING_10006"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10007 = "ORG_ZSTACK_COMPUTE_BONDING_10007"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10008 = "ORG_ZSTACK_COMPUTE_BONDING_10008"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10009 = "ORG_ZSTACK_COMPUTE_BONDING_10009"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10010 = "ORG_ZSTACK_COMPUTE_BONDING_10010"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10011 = "ORG_ZSTACK_COMPUTE_BONDING_10011"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10012 = "ORG_ZSTACK_COMPUTE_BONDING_10012"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10013 = "ORG_ZSTACK_COMPUTE_BONDING_10013"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10014 = "ORG_ZSTACK_COMPUTE_BONDING_10014"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10015 = "ORG_ZSTACK_COMPUTE_BONDING_10015"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10016 = "ORG_ZSTACK_COMPUTE_BONDING_10016"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10017 = "ORG_ZSTACK_COMPUTE_BONDING_10017"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10018 = "ORG_ZSTACK_COMPUTE_BONDING_10018"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10019 = "ORG_ZSTACK_COMPUTE_BONDING_10019"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10020 = "ORG_ZSTACK_COMPUTE_BONDING_10020"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10021 = "ORG_ZSTACK_COMPUTE_BONDING_10021"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10022 = "ORG_ZSTACK_COMPUTE_BONDING_10022"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10023 = "ORG_ZSTACK_COMPUTE_BONDING_10023"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10024 = "ORG_ZSTACK_COMPUTE_BONDING_10024"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10025 = "ORG_ZSTACK_COMPUTE_BONDING_10025"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10026 = "ORG_ZSTACK_COMPUTE_BONDING_10026"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10027 = "ORG_ZSTACK_COMPUTE_BONDING_10027"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10028 = "ORG_ZSTACK_COMPUTE_BONDING_10028"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10029 = "ORG_ZSTACK_COMPUTE_BONDING_10029"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10030 = "ORG_ZSTACK_COMPUTE_BONDING_10030"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10031 = "ORG_ZSTACK_COMPUTE_BONDING_10031"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10032 = "ORG_ZSTACK_COMPUTE_BONDING_10032"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10033 = "ORG_ZSTACK_COMPUTE_BONDING_10033"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10034 = "ORG_ZSTACK_COMPUTE_BONDING_10034"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10035 = "ORG_ZSTACK_COMPUTE_BONDING_10035"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10036 = "ORG_ZSTACK_COMPUTE_BONDING_10036"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10037 = "ORG_ZSTACK_COMPUTE_BONDING_10037"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10038 = "ORG_ZSTACK_COMPUTE_BONDING_10038"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10039 = "ORG_ZSTACK_COMPUTE_BONDING_10039"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10040 = "ORG_ZSTACK_COMPUTE_BONDING_10040"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10041 = "ORG_ZSTACK_COMPUTE_BONDING_10041"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10042 = "ORG_ZSTACK_COMPUTE_BONDING_10042"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10043 = "ORG_ZSTACK_COMPUTE_BONDING_10043"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10044 = "ORG_ZSTACK_COMPUTE_BONDING_10044"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10045 = "ORG_ZSTACK_COMPUTE_BONDING_10045"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10046 = "ORG_ZSTACK_COMPUTE_BONDING_10046"; + + public static final String ORG_ZSTACK_COMPUTE_BONDING_10047 = "ORG_ZSTACK_COMPUTE_BONDING_10047"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_10000 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_10000"; + + public static final String ORG_ZSTACK_TEST_COMPUTE_HOSTALLOCATOR_10000 = "ORG_ZSTACK_TEST_COMPUTE_HOSTALLOCATOR_10000"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10000 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10000"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10001 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10001"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10002 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10002"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10003 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10003"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10004 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10004"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10005 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10005"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10006 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10006"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10007 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10007"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10008 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10008"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10009 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10009"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10010 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10010"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10011 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10011"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10012 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10012"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10013 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10013"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10014 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10014"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10015 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10015"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10016 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10016"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10017 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10017"; + + public static final String ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10000 = "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10000"; + + public static final String ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10001 = "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10001"; + + public static final String ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10002 = "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10002"; + + public static final String ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10003 = "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10003"; + + public static final String ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10004 = "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10004"; + + public static final String ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10005 = "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10005"; + + public static final String ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10006 = "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10006"; + + public static final String ORG_ZSTACK_CORE_TIMEOUT_10000 = "ORG_ZSTACK_CORE_TIMEOUT_10000"; + + public static final String ORG_ZSTACK_TESTLIB_CONTROLLER_10000 = "ORG_ZSTACK_TESTLIB_CONTROLLER_10000"; + + public static final String ORG_ZSTACK_TESTLIB_CONTROLLER_10001 = "ORG_ZSTACK_TESTLIB_CONTROLLER_10001"; + + public static final String ORG_ZSTACK_TESTLIB_CONTROLLER_10002 = "ORG_ZSTACK_TESTLIB_CONTROLLER_10002"; + + public static final String ORG_ZSTACK_TESTLIB_CONTROLLER_10003 = "ORG_ZSTACK_TESTLIB_CONTROLLER_10003"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10000 = "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10000"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10001 = "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10001"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10002 = "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10002"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10003 = "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10003"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10004 = "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10004"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10005 = "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10005"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10006 = "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10006"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10007 = "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10007"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10008 = "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10008"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10009 = "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10009"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10010 = "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10010"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10011 = "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10011"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10012 = "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10012"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10013 = "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10013"; + + public static final String ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10000 = "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10000"; + + public static final String ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10001 = "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10001"; + + public static final String ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10002 = "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10002"; + + public static final String ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10003 = "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10003"; + + public static final String ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10004 = "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10004"; + + public static final String ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10005 = "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10005"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10000 = "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10000"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10001 = "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10001"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10002 = "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10002"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10003 = "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10003"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10004 = "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10004"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10005 = "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10005"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10000 = "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10000"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10001 = "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10001"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10002 = "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10002"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10003 = "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10003"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10004 = "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10004"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10005 = "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10005"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10006 = "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10006"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10007 = "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10007"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10008 = "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10008"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10009 = "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10009"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10010 = "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10010"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10011 = "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10011"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10012 = "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10012"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10013 = "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10013"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10014 = "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10014"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10015 = "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10015"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10016 = "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10016"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10017 = "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10017"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10018 = "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10018"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10019 = "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10019"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10020 = "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10020"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_10000 = "ORG_ZSTACK_NETWORK_SERVICE_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_10001 = "ORG_ZSTACK_NETWORK_SERVICE_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_10002 = "ORG_ZSTACK_NETWORK_SERVICE_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_10003 = "ORG_ZSTACK_NETWORK_SERVICE_10003"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_10004 = "ORG_ZSTACK_NETWORK_SERVICE_10004"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_10005 = "ORG_ZSTACK_NETWORK_SERVICE_10005"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_10006 = "ORG_ZSTACK_NETWORK_SERVICE_10006"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_10007 = "ORG_ZSTACK_NETWORK_SERVICE_10007"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_10008 = "ORG_ZSTACK_NETWORK_SERVICE_10008"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_10009 = "ORG_ZSTACK_NETWORK_SERVICE_10009"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_10010 = "ORG_ZSTACK_NETWORK_SERVICE_10010"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_10011 = "ORG_ZSTACK_NETWORK_SERVICE_10011"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_10012 = "ORG_ZSTACK_NETWORK_SERVICE_10012"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_10013 = "ORG_ZSTACK_NETWORK_SERVICE_10013"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_10014 = "ORG_ZSTACK_NETWORK_SERVICE_10014"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10000 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10000"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10001 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10001"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10002 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10002"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10003 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10003"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10004 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10004"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10005 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10005"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10006 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10006"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10007 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10007"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10008 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10008"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10009 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10009"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10010 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10010"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10011 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10011"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10012 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10012"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10013 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10013"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10014 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10014"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10015 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10015"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10016 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10016"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10017 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10017"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10018 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10018"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10019 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10019"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10020 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10020"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10021 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10021"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10022 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10022"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10023 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10023"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10024 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10024"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10025 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10025"; + + public static final String ORG_ZSTACK_MONITORING_PROMETHEUS_10026 = "ORG_ZSTACK_MONITORING_PROMETHEUS_10026"; + + public static final String ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10000 = "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10000"; + + public static final String ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10001 = "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10001"; + + public static final String ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10002 = "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10002"; + + public static final String ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10003 = "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10003"; + + public static final String ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10004 = "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10004"; + + public static final String ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10005 = "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10005"; + + public static final String ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10006 = "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10006"; + + public static final String ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10007 = "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10007"; + + public static final String ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10008 = "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10008"; + + public static final String ORG_ZSTACK_SNMP_AGENT_10000 = "ORG_ZSTACK_SNMP_AGENT_10000"; + + public static final String ORG_ZSTACK_SNMP_AGENT_10001 = "ORG_ZSTACK_SNMP_AGENT_10001"; + + public static final String ORG_ZSTACK_SNMP_AGENT_10002 = "ORG_ZSTACK_SNMP_AGENT_10002"; + + public static final String ORG_ZSTACK_SNMP_AGENT_10003 = "ORG_ZSTACK_SNMP_AGENT_10003"; + + public static final String ORG_ZSTACK_SNMP_AGENT_10004 = "ORG_ZSTACK_SNMP_AGENT_10004"; + + public static final String ORG_ZSTACK_SNMP_AGENT_10005 = "ORG_ZSTACK_SNMP_AGENT_10005"; + + public static final String ORG_ZSTACK_SNMP_AGENT_10006 = "ORG_ZSTACK_SNMP_AGENT_10006"; + + public static final String ORG_ZSTACK_SNMP_AGENT_10007 = "ORG_ZSTACK_SNMP_AGENT_10007"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10000 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10000"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10001 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10001"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10002 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10002"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10003 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10003"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10004 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10004"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10005 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10005"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10006 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10006"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10007 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10007"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10008 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10008"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10009 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10009"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10010 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10010"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10011 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10011"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10012 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10012"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10013 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10013"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10014 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10014"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10015 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10015"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10016 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10016"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10017 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10017"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10018 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10018"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10019 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10019"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10020 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10020"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10021 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10021"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10022 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10022"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10023 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10023"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10024 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10024"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10025 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10025"; + + public static final String ORG_ZSTACK_ZWATCH_INFLUXDB_10026 = "ORG_ZSTACK_ZWATCH_INFLUXDB_10026"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10000 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10000"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10001 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10001"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10002 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10002"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10003 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10003"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10004 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10004"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10005 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10005"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10006 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10006"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10007 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10007"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10000 = "ORG_ZSTACK_COMPUTE_VM_10000"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10001 = "ORG_ZSTACK_COMPUTE_VM_10001"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10002 = "ORG_ZSTACK_COMPUTE_VM_10002"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10003 = "ORG_ZSTACK_COMPUTE_VM_10003"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10004 = "ORG_ZSTACK_COMPUTE_VM_10004"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10005 = "ORG_ZSTACK_COMPUTE_VM_10005"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10006 = "ORG_ZSTACK_COMPUTE_VM_10006"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10007 = "ORG_ZSTACK_COMPUTE_VM_10007"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10008 = "ORG_ZSTACK_COMPUTE_VM_10008"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10009 = "ORG_ZSTACK_COMPUTE_VM_10009"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10010 = "ORG_ZSTACK_COMPUTE_VM_10010"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10011 = "ORG_ZSTACK_COMPUTE_VM_10011"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10012 = "ORG_ZSTACK_COMPUTE_VM_10012"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10013 = "ORG_ZSTACK_COMPUTE_VM_10013"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10014 = "ORG_ZSTACK_COMPUTE_VM_10014"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10015 = "ORG_ZSTACK_COMPUTE_VM_10015"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10016 = "ORG_ZSTACK_COMPUTE_VM_10016"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10017 = "ORG_ZSTACK_COMPUTE_VM_10017"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10018 = "ORG_ZSTACK_COMPUTE_VM_10018"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10019 = "ORG_ZSTACK_COMPUTE_VM_10019"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10020 = "ORG_ZSTACK_COMPUTE_VM_10020"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10021 = "ORG_ZSTACK_COMPUTE_VM_10021"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10022 = "ORG_ZSTACK_COMPUTE_VM_10022"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10023 = "ORG_ZSTACK_COMPUTE_VM_10023"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10024 = "ORG_ZSTACK_COMPUTE_VM_10024"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10025 = "ORG_ZSTACK_COMPUTE_VM_10025"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10026 = "ORG_ZSTACK_COMPUTE_VM_10026"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10027 = "ORG_ZSTACK_COMPUTE_VM_10027"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10028 = "ORG_ZSTACK_COMPUTE_VM_10028"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10029 = "ORG_ZSTACK_COMPUTE_VM_10029"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10030 = "ORG_ZSTACK_COMPUTE_VM_10030"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10031 = "ORG_ZSTACK_COMPUTE_VM_10031"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10032 = "ORG_ZSTACK_COMPUTE_VM_10032"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10033 = "ORG_ZSTACK_COMPUTE_VM_10033"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10034 = "ORG_ZSTACK_COMPUTE_VM_10034"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10035 = "ORG_ZSTACK_COMPUTE_VM_10035"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10036 = "ORG_ZSTACK_COMPUTE_VM_10036"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10037 = "ORG_ZSTACK_COMPUTE_VM_10037"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10038 = "ORG_ZSTACK_COMPUTE_VM_10038"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10039 = "ORG_ZSTACK_COMPUTE_VM_10039"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10040 = "ORG_ZSTACK_COMPUTE_VM_10040"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10041 = "ORG_ZSTACK_COMPUTE_VM_10041"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10042 = "ORG_ZSTACK_COMPUTE_VM_10042"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10043 = "ORG_ZSTACK_COMPUTE_VM_10043"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10044 = "ORG_ZSTACK_COMPUTE_VM_10044"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10045 = "ORG_ZSTACK_COMPUTE_VM_10045"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10046 = "ORG_ZSTACK_COMPUTE_VM_10046"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10047 = "ORG_ZSTACK_COMPUTE_VM_10047"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10048 = "ORG_ZSTACK_COMPUTE_VM_10048"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10049 = "ORG_ZSTACK_COMPUTE_VM_10049"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10050 = "ORG_ZSTACK_COMPUTE_VM_10050"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10051 = "ORG_ZSTACK_COMPUTE_VM_10051"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10052 = "ORG_ZSTACK_COMPUTE_VM_10052"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10053 = "ORG_ZSTACK_COMPUTE_VM_10053"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10054 = "ORG_ZSTACK_COMPUTE_VM_10054"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10055 = "ORG_ZSTACK_COMPUTE_VM_10055"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10056 = "ORG_ZSTACK_COMPUTE_VM_10056"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10057 = "ORG_ZSTACK_COMPUTE_VM_10057"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10058 = "ORG_ZSTACK_COMPUTE_VM_10058"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10059 = "ORG_ZSTACK_COMPUTE_VM_10059"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10060 = "ORG_ZSTACK_COMPUTE_VM_10060"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10061 = "ORG_ZSTACK_COMPUTE_VM_10061"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10062 = "ORG_ZSTACK_COMPUTE_VM_10062"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10063 = "ORG_ZSTACK_COMPUTE_VM_10063"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10064 = "ORG_ZSTACK_COMPUTE_VM_10064"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10065 = "ORG_ZSTACK_COMPUTE_VM_10065"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10066 = "ORG_ZSTACK_COMPUTE_VM_10066"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10067 = "ORG_ZSTACK_COMPUTE_VM_10067"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10068 = "ORG_ZSTACK_COMPUTE_VM_10068"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10069 = "ORG_ZSTACK_COMPUTE_VM_10069"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10070 = "ORG_ZSTACK_COMPUTE_VM_10070"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10071 = "ORG_ZSTACK_COMPUTE_VM_10071"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10072 = "ORG_ZSTACK_COMPUTE_VM_10072"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10073 = "ORG_ZSTACK_COMPUTE_VM_10073"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10074 = "ORG_ZSTACK_COMPUTE_VM_10074"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10075 = "ORG_ZSTACK_COMPUTE_VM_10075"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10076 = "ORG_ZSTACK_COMPUTE_VM_10076"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10077 = "ORG_ZSTACK_COMPUTE_VM_10077"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10078 = "ORG_ZSTACK_COMPUTE_VM_10078"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10079 = "ORG_ZSTACK_COMPUTE_VM_10079"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10080 = "ORG_ZSTACK_COMPUTE_VM_10080"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10081 = "ORG_ZSTACK_COMPUTE_VM_10081"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10082 = "ORG_ZSTACK_COMPUTE_VM_10082"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10083 = "ORG_ZSTACK_COMPUTE_VM_10083"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10084 = "ORG_ZSTACK_COMPUTE_VM_10084"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10085 = "ORG_ZSTACK_COMPUTE_VM_10085"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10086 = "ORG_ZSTACK_COMPUTE_VM_10086"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10087 = "ORG_ZSTACK_COMPUTE_VM_10087"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10088 = "ORG_ZSTACK_COMPUTE_VM_10088"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10089 = "ORG_ZSTACK_COMPUTE_VM_10089"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10090 = "ORG_ZSTACK_COMPUTE_VM_10090"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10091 = "ORG_ZSTACK_COMPUTE_VM_10091"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10092 = "ORG_ZSTACK_COMPUTE_VM_10092"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10093 = "ORG_ZSTACK_COMPUTE_VM_10093"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10094 = "ORG_ZSTACK_COMPUTE_VM_10094"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10095 = "ORG_ZSTACK_COMPUTE_VM_10095"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10096 = "ORG_ZSTACK_COMPUTE_VM_10096"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10097 = "ORG_ZSTACK_COMPUTE_VM_10097"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10098 = "ORG_ZSTACK_COMPUTE_VM_10098"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10099 = "ORG_ZSTACK_COMPUTE_VM_10099"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10100 = "ORG_ZSTACK_COMPUTE_VM_10100"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10101 = "ORG_ZSTACK_COMPUTE_VM_10101"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10102 = "ORG_ZSTACK_COMPUTE_VM_10102"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10103 = "ORG_ZSTACK_COMPUTE_VM_10103"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10104 = "ORG_ZSTACK_COMPUTE_VM_10104"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10105 = "ORG_ZSTACK_COMPUTE_VM_10105"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10106 = "ORG_ZSTACK_COMPUTE_VM_10106"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10107 = "ORG_ZSTACK_COMPUTE_VM_10107"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10108 = "ORG_ZSTACK_COMPUTE_VM_10108"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10109 = "ORG_ZSTACK_COMPUTE_VM_10109"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10110 = "ORG_ZSTACK_COMPUTE_VM_10110"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10111 = "ORG_ZSTACK_COMPUTE_VM_10111"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10112 = "ORG_ZSTACK_COMPUTE_VM_10112"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10113 = "ORG_ZSTACK_COMPUTE_VM_10113"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10114 = "ORG_ZSTACK_COMPUTE_VM_10114"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10115 = "ORG_ZSTACK_COMPUTE_VM_10115"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10116 = "ORG_ZSTACK_COMPUTE_VM_10116"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10117 = "ORG_ZSTACK_COMPUTE_VM_10117"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10118 = "ORG_ZSTACK_COMPUTE_VM_10118"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10119 = "ORG_ZSTACK_COMPUTE_VM_10119"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10120 = "ORG_ZSTACK_COMPUTE_VM_10120"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10121 = "ORG_ZSTACK_COMPUTE_VM_10121"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10122 = "ORG_ZSTACK_COMPUTE_VM_10122"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10123 = "ORG_ZSTACK_COMPUTE_VM_10123"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10124 = "ORG_ZSTACK_COMPUTE_VM_10124"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10125 = "ORG_ZSTACK_COMPUTE_VM_10125"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10126 = "ORG_ZSTACK_COMPUTE_VM_10126"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10127 = "ORG_ZSTACK_COMPUTE_VM_10127"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10128 = "ORG_ZSTACK_COMPUTE_VM_10128"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10129 = "ORG_ZSTACK_COMPUTE_VM_10129"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10130 = "ORG_ZSTACK_COMPUTE_VM_10130"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10131 = "ORG_ZSTACK_COMPUTE_VM_10131"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10132 = "ORG_ZSTACK_COMPUTE_VM_10132"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10133 = "ORG_ZSTACK_COMPUTE_VM_10133"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10134 = "ORG_ZSTACK_COMPUTE_VM_10134"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10135 = "ORG_ZSTACK_COMPUTE_VM_10135"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10136 = "ORG_ZSTACK_COMPUTE_VM_10136"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10137 = "ORG_ZSTACK_COMPUTE_VM_10137"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10138 = "ORG_ZSTACK_COMPUTE_VM_10138"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10139 = "ORG_ZSTACK_COMPUTE_VM_10139"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10140 = "ORG_ZSTACK_COMPUTE_VM_10140"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10141 = "ORG_ZSTACK_COMPUTE_VM_10141"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10142 = "ORG_ZSTACK_COMPUTE_VM_10142"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10143 = "ORG_ZSTACK_COMPUTE_VM_10143"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10144 = "ORG_ZSTACK_COMPUTE_VM_10144"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10145 = "ORG_ZSTACK_COMPUTE_VM_10145"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10146 = "ORG_ZSTACK_COMPUTE_VM_10146"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10147 = "ORG_ZSTACK_COMPUTE_VM_10147"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10148 = "ORG_ZSTACK_COMPUTE_VM_10148"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10149 = "ORG_ZSTACK_COMPUTE_VM_10149"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10150 = "ORG_ZSTACK_COMPUTE_VM_10150"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10151 = "ORG_ZSTACK_COMPUTE_VM_10151"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10152 = "ORG_ZSTACK_COMPUTE_VM_10152"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10153 = "ORG_ZSTACK_COMPUTE_VM_10153"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10154 = "ORG_ZSTACK_COMPUTE_VM_10154"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10155 = "ORG_ZSTACK_COMPUTE_VM_10155"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10156 = "ORG_ZSTACK_COMPUTE_VM_10156"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10157 = "ORG_ZSTACK_COMPUTE_VM_10157"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10158 = "ORG_ZSTACK_COMPUTE_VM_10158"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10159 = "ORG_ZSTACK_COMPUTE_VM_10159"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10160 = "ORG_ZSTACK_COMPUTE_VM_10160"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10161 = "ORG_ZSTACK_COMPUTE_VM_10161"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10162 = "ORG_ZSTACK_COMPUTE_VM_10162"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10163 = "ORG_ZSTACK_COMPUTE_VM_10163"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10164 = "ORG_ZSTACK_COMPUTE_VM_10164"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10165 = "ORG_ZSTACK_COMPUTE_VM_10165"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10166 = "ORG_ZSTACK_COMPUTE_VM_10166"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10167 = "ORG_ZSTACK_COMPUTE_VM_10167"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10168 = "ORG_ZSTACK_COMPUTE_VM_10168"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10169 = "ORG_ZSTACK_COMPUTE_VM_10169"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10170 = "ORG_ZSTACK_COMPUTE_VM_10170"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10171 = "ORG_ZSTACK_COMPUTE_VM_10171"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10172 = "ORG_ZSTACK_COMPUTE_VM_10172"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10173 = "ORG_ZSTACK_COMPUTE_VM_10173"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10174 = "ORG_ZSTACK_COMPUTE_VM_10174"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10175 = "ORG_ZSTACK_COMPUTE_VM_10175"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10176 = "ORG_ZSTACK_COMPUTE_VM_10176"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10177 = "ORG_ZSTACK_COMPUTE_VM_10177"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10178 = "ORG_ZSTACK_COMPUTE_VM_10178"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10179 = "ORG_ZSTACK_COMPUTE_VM_10179"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10180 = "ORG_ZSTACK_COMPUTE_VM_10180"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10181 = "ORG_ZSTACK_COMPUTE_VM_10181"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10182 = "ORG_ZSTACK_COMPUTE_VM_10182"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10183 = "ORG_ZSTACK_COMPUTE_VM_10183"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10184 = "ORG_ZSTACK_COMPUTE_VM_10184"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10185 = "ORG_ZSTACK_COMPUTE_VM_10185"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10186 = "ORG_ZSTACK_COMPUTE_VM_10186"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10187 = "ORG_ZSTACK_COMPUTE_VM_10187"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10188 = "ORG_ZSTACK_COMPUTE_VM_10188"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10189 = "ORG_ZSTACK_COMPUTE_VM_10189"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10190 = "ORG_ZSTACK_COMPUTE_VM_10190"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10191 = "ORG_ZSTACK_COMPUTE_VM_10191"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10192 = "ORG_ZSTACK_COMPUTE_VM_10192"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10193 = "ORG_ZSTACK_COMPUTE_VM_10193"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10194 = "ORG_ZSTACK_COMPUTE_VM_10194"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10195 = "ORG_ZSTACK_COMPUTE_VM_10195"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10196 = "ORG_ZSTACK_COMPUTE_VM_10196"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10197 = "ORG_ZSTACK_COMPUTE_VM_10197"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10198 = "ORG_ZSTACK_COMPUTE_VM_10198"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10199 = "ORG_ZSTACK_COMPUTE_VM_10199"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10200 = "ORG_ZSTACK_COMPUTE_VM_10200"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10201 = "ORG_ZSTACK_COMPUTE_VM_10201"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10202 = "ORG_ZSTACK_COMPUTE_VM_10202"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10203 = "ORG_ZSTACK_COMPUTE_VM_10203"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10204 = "ORG_ZSTACK_COMPUTE_VM_10204"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10205 = "ORG_ZSTACK_COMPUTE_VM_10205"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10206 = "ORG_ZSTACK_COMPUTE_VM_10206"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10207 = "ORG_ZSTACK_COMPUTE_VM_10207"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10208 = "ORG_ZSTACK_COMPUTE_VM_10208"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10209 = "ORG_ZSTACK_COMPUTE_VM_10209"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10210 = "ORG_ZSTACK_COMPUTE_VM_10210"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10211 = "ORG_ZSTACK_COMPUTE_VM_10211"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10212 = "ORG_ZSTACK_COMPUTE_VM_10212"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10213 = "ORG_ZSTACK_COMPUTE_VM_10213"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10214 = "ORG_ZSTACK_COMPUTE_VM_10214"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10215 = "ORG_ZSTACK_COMPUTE_VM_10215"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10216 = "ORG_ZSTACK_COMPUTE_VM_10216"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10217 = "ORG_ZSTACK_COMPUTE_VM_10217"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10218 = "ORG_ZSTACK_COMPUTE_VM_10218"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10219 = "ORG_ZSTACK_COMPUTE_VM_10219"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10220 = "ORG_ZSTACK_COMPUTE_VM_10220"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10221 = "ORG_ZSTACK_COMPUTE_VM_10221"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10222 = "ORG_ZSTACK_COMPUTE_VM_10222"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10223 = "ORG_ZSTACK_COMPUTE_VM_10223"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10224 = "ORG_ZSTACK_COMPUTE_VM_10224"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10225 = "ORG_ZSTACK_COMPUTE_VM_10225"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10226 = "ORG_ZSTACK_COMPUTE_VM_10226"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10227 = "ORG_ZSTACK_COMPUTE_VM_10227"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10228 = "ORG_ZSTACK_COMPUTE_VM_10228"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10229 = "ORG_ZSTACK_COMPUTE_VM_10229"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10230 = "ORG_ZSTACK_COMPUTE_VM_10230"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10231 = "ORG_ZSTACK_COMPUTE_VM_10231"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10232 = "ORG_ZSTACK_COMPUTE_VM_10232"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10233 = "ORG_ZSTACK_COMPUTE_VM_10233"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10234 = "ORG_ZSTACK_COMPUTE_VM_10234"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10235 = "ORG_ZSTACK_COMPUTE_VM_10235"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10236 = "ORG_ZSTACK_COMPUTE_VM_10236"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10237 = "ORG_ZSTACK_COMPUTE_VM_10237"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10238 = "ORG_ZSTACK_COMPUTE_VM_10238"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10239 = "ORG_ZSTACK_COMPUTE_VM_10239"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10240 = "ORG_ZSTACK_COMPUTE_VM_10240"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10241 = "ORG_ZSTACK_COMPUTE_VM_10241"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10242 = "ORG_ZSTACK_COMPUTE_VM_10242"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10243 = "ORG_ZSTACK_COMPUTE_VM_10243"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10244 = "ORG_ZSTACK_COMPUTE_VM_10244"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10245 = "ORG_ZSTACK_COMPUTE_VM_10245"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10246 = "ORG_ZSTACK_COMPUTE_VM_10246"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10247 = "ORG_ZSTACK_COMPUTE_VM_10247"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10248 = "ORG_ZSTACK_COMPUTE_VM_10248"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10249 = "ORG_ZSTACK_COMPUTE_VM_10249"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10250 = "ORG_ZSTACK_COMPUTE_VM_10250"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10251 = "ORG_ZSTACK_COMPUTE_VM_10251"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10252 = "ORG_ZSTACK_COMPUTE_VM_10252"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10253 = "ORG_ZSTACK_COMPUTE_VM_10253"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10254 = "ORG_ZSTACK_COMPUTE_VM_10254"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10255 = "ORG_ZSTACK_COMPUTE_VM_10255"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10256 = "ORG_ZSTACK_COMPUTE_VM_10256"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10257 = "ORG_ZSTACK_COMPUTE_VM_10257"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10258 = "ORG_ZSTACK_COMPUTE_VM_10258"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10259 = "ORG_ZSTACK_COMPUTE_VM_10259"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10260 = "ORG_ZSTACK_COMPUTE_VM_10260"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10261 = "ORG_ZSTACK_COMPUTE_VM_10261"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10262 = "ORG_ZSTACK_COMPUTE_VM_10262"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10263 = "ORG_ZSTACK_COMPUTE_VM_10263"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10264 = "ORG_ZSTACK_COMPUTE_VM_10264"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10265 = "ORG_ZSTACK_COMPUTE_VM_10265"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10266 = "ORG_ZSTACK_COMPUTE_VM_10266"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10267 = "ORG_ZSTACK_COMPUTE_VM_10267"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10268 = "ORG_ZSTACK_COMPUTE_VM_10268"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10269 = "ORG_ZSTACK_COMPUTE_VM_10269"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10270 = "ORG_ZSTACK_COMPUTE_VM_10270"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10271 = "ORG_ZSTACK_COMPUTE_VM_10271"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10272 = "ORG_ZSTACK_COMPUTE_VM_10272"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10273 = "ORG_ZSTACK_COMPUTE_VM_10273"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10274 = "ORG_ZSTACK_COMPUTE_VM_10274"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10275 = "ORG_ZSTACK_COMPUTE_VM_10275"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10276 = "ORG_ZSTACK_COMPUTE_VM_10276"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10277 = "ORG_ZSTACK_COMPUTE_VM_10277"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10278 = "ORG_ZSTACK_COMPUTE_VM_10278"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10279 = "ORG_ZSTACK_COMPUTE_VM_10279"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10280 = "ORG_ZSTACK_COMPUTE_VM_10280"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10281 = "ORG_ZSTACK_COMPUTE_VM_10281"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10282 = "ORG_ZSTACK_COMPUTE_VM_10282"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10283 = "ORG_ZSTACK_COMPUTE_VM_10283"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10284 = "ORG_ZSTACK_COMPUTE_VM_10284"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10285 = "ORG_ZSTACK_COMPUTE_VM_10285"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10286 = "ORG_ZSTACK_COMPUTE_VM_10286"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10287 = "ORG_ZSTACK_COMPUTE_VM_10287"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10288 = "ORG_ZSTACK_COMPUTE_VM_10288"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10289 = "ORG_ZSTACK_COMPUTE_VM_10289"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10290 = "ORG_ZSTACK_COMPUTE_VM_10290"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10291 = "ORG_ZSTACK_COMPUTE_VM_10291"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10292 = "ORG_ZSTACK_COMPUTE_VM_10292"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10293 = "ORG_ZSTACK_COMPUTE_VM_10293"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10294 = "ORG_ZSTACK_COMPUTE_VM_10294"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10295 = "ORG_ZSTACK_COMPUTE_VM_10295"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10296 = "ORG_ZSTACK_COMPUTE_VM_10296"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10297 = "ORG_ZSTACK_COMPUTE_VM_10297"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10298 = "ORG_ZSTACK_COMPUTE_VM_10298"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10299 = "ORG_ZSTACK_COMPUTE_VM_10299"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10300 = "ORG_ZSTACK_COMPUTE_VM_10300"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10301 = "ORG_ZSTACK_COMPUTE_VM_10301"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10302 = "ORG_ZSTACK_COMPUTE_VM_10302"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10303 = "ORG_ZSTACK_COMPUTE_VM_10303"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10304 = "ORG_ZSTACK_COMPUTE_VM_10304"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10305 = "ORG_ZSTACK_COMPUTE_VM_10305"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10306 = "ORG_ZSTACK_COMPUTE_VM_10306"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10307 = "ORG_ZSTACK_COMPUTE_VM_10307"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10308 = "ORG_ZSTACK_COMPUTE_VM_10308"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10309 = "ORG_ZSTACK_COMPUTE_VM_10309"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10310 = "ORG_ZSTACK_COMPUTE_VM_10310"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10311 = "ORG_ZSTACK_COMPUTE_VM_10311"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10312 = "ORG_ZSTACK_COMPUTE_VM_10312"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10313 = "ORG_ZSTACK_COMPUTE_VM_10313"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10314 = "ORG_ZSTACK_COMPUTE_VM_10314"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10315 = "ORG_ZSTACK_COMPUTE_VM_10315"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10316 = "ORG_ZSTACK_COMPUTE_VM_10316"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10317 = "ORG_ZSTACK_COMPUTE_VM_10317"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10318 = "ORG_ZSTACK_COMPUTE_VM_10318"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10319 = "ORG_ZSTACK_COMPUTE_VM_10319"; + + public static final String ORG_ZSTACK_COMPUTE_VM_10320 = "ORG_ZSTACK_COMPUTE_VM_10320"; + + public static final String ORG_ZSTACK_IDENTITY_LOGIN_10000 = "ORG_ZSTACK_IDENTITY_LOGIN_10000"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10000 = "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10000"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10001 = "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10001"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10002 = "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10002"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10003 = "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10003"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10004 = "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10004"; + + public static final String ORG_ZSTACK_MESSAGE_10000 = "ORG_ZSTACK_MESSAGE_10000"; + + public static final String ORG_ZSTACK_MESSAGE_10001 = "ORG_ZSTACK_MESSAGE_10001"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_HTTP_10000 = "ORG_ZSTACK_SNS_PLATFORM_HTTP_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10000 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10001 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10002 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10003 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10004 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10005 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10005"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10006 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10006"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10007 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10007"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10008 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10008"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10009 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10009"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10010 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10010"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10011 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10011"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10012 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10012"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10013 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10013"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10014 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10014"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10015 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10015"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10016 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10016"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10017 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10017"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10018 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10018"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10019 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10019"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10020 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10020"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10021 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10021"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10022 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10022"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10023 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10023"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10024 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10024"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10025 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10025"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10026 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10026"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10027 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10027"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10028 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10028"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10029 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10029"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10030 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10030"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10031 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10031"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10032 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10032"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10033 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10033"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10034 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10034"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10035 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10035"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10036 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10036"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10037 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10037"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10038 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10038"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10039 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10039"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10040 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10040"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10041 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10041"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10042 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10042"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10043 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10043"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10044 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10044"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10045 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10045"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10046 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10046"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10047 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10047"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10048 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10048"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10049 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10049"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10050 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10050"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10051 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10051"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10052 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10052"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10053 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10053"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10054 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10054"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10055 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10055"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10056 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10056"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10057 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10057"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10058 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10058"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10059 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10059"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10060 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10060"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10061 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10061"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10062 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10062"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10063 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10063"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10064 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10064"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10065 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10065"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10066 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10066"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10067 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10067"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10068 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10068"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10069 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10069"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10070 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10070"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10071 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10071"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10072 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10072"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10073 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10073"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10074 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10074"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10075 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10075"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10076 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10076"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10077 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10077"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10078 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10078"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_10079 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_10079"; + + public static final String ORG_ZSTACK_HEADER_ALIYUN_10000 = "ORG_ZSTACK_HEADER_ALIYUN_10000"; + + public static final String ORG_ZSTACK_CAS_UTIL_10000 = "ORG_ZSTACK_CAS_UTIL_10000"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10000 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10000"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10001 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10001"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10002 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10002"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10003 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10003"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10004 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10004"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10005 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10005"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10006 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10006"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10007 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10007"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10008 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10008"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10009 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10009"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10010 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10010"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10011 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10011"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10012 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10012"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10013 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10013"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10014 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10014"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10015 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10015"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10016 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10016"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10017 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10017"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10018 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10018"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10019 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10019"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10020 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10020"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10021 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10021"; + + public static final String ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10022 = "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10022"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_WECOM_10000 = "ORG_ZSTACK_SNS_PLATFORM_WECOM_10000"; + + public static final String ORG_ZSTACK_HYBRID_IDENTITYZONE_10000 = "ORG_ZSTACK_HYBRID_IDENTITYZONE_10000"; + + public static final String ORG_ZSTACK_HYBRID_IDENTITYZONE_10001 = "ORG_ZSTACK_HYBRID_IDENTITYZONE_10001"; + + public static final String ORG_ZSTACK_HYBRID_IDENTITYZONE_10002 = "ORG_ZSTACK_HYBRID_IDENTITYZONE_10002"; + + public static final String ORG_ZSTACK_HYBRID_IDENTITYZONE_10003 = "ORG_ZSTACK_HYBRID_IDENTITYZONE_10003"; + + public static final String ORG_ZSTACK_HYBRID_IDENTITYZONE_10004 = "ORG_ZSTACK_HYBRID_IDENTITYZONE_10004"; + + public static final String ORG_ZSTACK_HYBRID_IDENTITYZONE_10005 = "ORG_ZSTACK_HYBRID_IDENTITYZONE_10005"; + + public static final String ORG_ZSTACK_KVM_HYPERVISOR_10000 = "ORG_ZSTACK_KVM_HYPERVISOR_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_STORAGE_PRIMARY_LOCAL_DATAVOLUME_10000 = "ORG_ZSTACK_TEST_INTEGRATION_STORAGE_PRIMARY_LOCAL_DATAVOLUME_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_STORAGE_PRIMARY_LOCAL_DATAVOLUME_10001 = "ORG_ZSTACK_TEST_INTEGRATION_STORAGE_PRIMARY_LOCAL_DATAVOLUME_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_IMAGESTORE_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_IMAGESTORE_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_IMAGESTORE_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_IMAGESTORE_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_IMAGESTORE_10002 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_IMAGESTORE_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_IMAGESTORE_10003 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_IMAGESTORE_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_IMAGESTORE_10004 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_IMAGESTORE_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_IMAGESTORE_10005 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_IMAGESTORE_10005"; + + public static final String ORG_ZSTACK_CORE_UPGRADE_10000 = "ORG_ZSTACK_CORE_UPGRADE_10000"; + + public static final String ORG_ZSTACK_CORE_UPGRADE_10001 = "ORG_ZSTACK_CORE_UPGRADE_10001"; + + public static final String ORG_ZSTACK_CORE_UPGRADE_10002 = "ORG_ZSTACK_CORE_UPGRADE_10002"; + + public static final String ORG_ZSTACK_CORE_UPGRADE_10003 = "ORG_ZSTACK_CORE_UPGRADE_10003"; + + public static final String ORG_ZSTACK_CORE_UPGRADE_10004 = "ORG_ZSTACK_CORE_UPGRADE_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_SNAPSHOT_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_SNAPSHOT_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_SNAPSHOT_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_SNAPSHOT_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_SNAPSHOT_10002 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_SNAPSHOT_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_SNAPSHOT_10003 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_SNAPSHOT_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_SNAPSHOT_10004 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_SNAPSHOT_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_SNAPSHOT_10005 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_SNAPSHOT_10005"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_SNAPSHOT_10006 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_SNAPSHOT_10006"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_SNAPSHOT_10007 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_SNAPSHOT_10007"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_SNAPSHOT_10008 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_SNAPSHOT_10008"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_SNAPSHOT_10009 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_SNAPSHOT_10009"; + + public static final String ORG_ZSTACK_CORE_PROGRESS_10000 = "ORG_ZSTACK_CORE_PROGRESS_10000"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10000 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10000"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10001 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10001"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10002 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10002"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10003 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10003"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10004 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10004"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10005 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10005"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10006 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10006"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10007 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10007"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10008 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10008"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10009 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10009"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10010 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10010"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10011 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10011"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10012 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10012"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10013 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10013"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10014 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10014"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10015 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10015"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10016 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10016"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10017 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10017"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10018 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10018"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10019 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10019"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10020 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10020"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10021 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10021"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10022 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10022"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10023 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10023"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10024 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10024"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10025 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10025"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10026 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10026"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10027 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10027"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10028 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10028"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10029 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10029"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10030 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10030"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10031 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10031"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10032 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10032"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10033 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10033"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10034 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10034"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10035 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10035"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10036 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10036"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10037 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10037"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10038 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10038"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10039 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10039"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10040 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10040"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10041 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10041"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10042 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10042"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10043 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10043"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10044 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10044"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10045 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10045"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10046 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10046"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10047 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10047"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10048 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10048"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10049 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10049"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10050 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10050"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10051 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10051"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10052 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10052"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10053 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10053"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10054 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10054"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10055 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10055"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10056 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10056"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10057 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10057"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10058 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10058"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10059 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10059"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10060 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10060"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10061 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10061"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10062 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10062"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10063 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10063"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10064 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10064"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10065 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10065"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10066 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10066"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10067 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10067"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10068 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10068"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10069 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10069"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10070 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10070"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10071 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10071"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10072 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10072"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10073 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10073"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10074 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10074"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10075 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10075"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10076 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10076"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10077 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10077"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10078 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10078"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10079 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10079"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10080 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10080"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10081 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10081"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10082 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10082"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10083 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10083"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10084 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10084"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10085 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10085"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10086 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10086"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10087 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10087"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10088 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10088"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10089 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10089"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10090 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10090"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10091 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10091"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10092 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10092"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10093 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10093"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10094 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10094"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10095 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10095"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10096 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10096"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10097 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10097"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10098 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10098"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10099 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10099"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10100 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10100"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10101 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10101"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10102 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10102"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10103 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10103"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10104 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10104"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10105 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10105"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10106 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10106"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10107 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10107"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10108 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10108"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10109 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10109"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10110 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10110"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10111 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10111"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10112 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10112"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10113 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10113"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10114 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10114"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10115 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10115"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10116 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10116"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10117 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10117"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10118 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10118"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10119 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10119"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10120 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10120"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10121 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10121"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10122 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10122"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10123 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10123"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10124 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10124"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10125 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10125"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10126 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10126"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10127 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10127"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10128 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10128"; + + public static final String ORG_ZSTACK_NETWORK_SECURITYGROUP_10129 = "ORG_ZSTACK_NETWORK_SECURITYGROUP_10129"; + + public static final String ORG_ZSTACK_TEMPLATECONFIG_10000 = "ORG_ZSTACK_TEMPLATECONFIG_10000"; + + public static final String ORG_ZSTACK_TEMPLATECONFIG_10001 = "ORG_ZSTACK_TEMPLATECONFIG_10001"; + + public static final String ORG_ZSTACK_TEMPLATECONFIG_10002 = "ORG_ZSTACK_TEMPLATECONFIG_10002"; + + public static final String ORG_ZSTACK_TEMPLATECONFIG_10003 = "ORG_ZSTACK_TEMPLATECONFIG_10003"; + + public static final String ORG_ZSTACK_TEMPLATECONFIG_10004 = "ORG_ZSTACK_TEMPLATECONFIG_10004"; + + public static final String ORG_ZSTACK_TEMPLATECONFIG_10005 = "ORG_ZSTACK_TEMPLATECONFIG_10005"; + + public static final String ORG_ZSTACK_TEMPLATECONFIG_10006 = "ORG_ZSTACK_TEMPLATECONFIG_10006"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10000 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10001 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10002 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10003 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10003"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10004 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10004"; + + public static final String ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10000 = "ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10000"; + + public static final String ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10001 = "ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10001"; + + public static final String ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10002 = "ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10002"; + + public static final String ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10003 = "ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10003"; + + public static final String ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10004 = "ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10004"; + + public static final String ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10005 = "ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10005"; + + public static final String ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10006 = "ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10006"; + + public static final String ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10007 = "ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10007"; + + public static final String ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10008 = "ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10008"; + + public static final String ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10009 = "ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10009"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10000 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10000"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10001 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10001"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10002 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10002"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10003 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10003"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10004 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10004"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10005 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10005"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10006 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10006"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10007 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10007"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10008 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10008"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10009 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10009"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10010 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10010"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10011 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10011"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10012 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10012"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10013 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10013"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10014 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10014"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10015 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10015"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10016 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10016"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10017 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10017"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10018 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10018"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10019 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10019"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10020 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10020"; + + public static final String ORG_ZSTACK_BAREMETAL_CHASSIS_10021 = "ORG_ZSTACK_BAREMETAL_CHASSIS_10021"; + + public static final String ORG_ZSTACK_CORE_REST_10000 = "ORG_ZSTACK_CORE_REST_10000"; + + public static final String ORG_ZSTACK_CORE_REST_10001 = "ORG_ZSTACK_CORE_REST_10001"; + + public static final String ORG_ZSTACK_CORE_REST_10002 = "ORG_ZSTACK_CORE_REST_10002"; + + public static final String ORG_ZSTACK_CORE_REST_10003 = "ORG_ZSTACK_CORE_REST_10003"; + + public static final String ORG_ZSTACK_CORE_REST_10004 = "ORG_ZSTACK_CORE_REST_10004"; + + public static final String ORG_ZSTACK_CORE_REST_10005 = "ORG_ZSTACK_CORE_REST_10005"; + + public static final String ORG_ZSTACK_CORE_REST_10006 = "ORG_ZSTACK_CORE_REST_10006"; + + public static final String ORG_ZSTACK_CORE_REST_10007 = "ORG_ZSTACK_CORE_REST_10007"; + + public static final String ORG_ZSTACK_CORE_REST_10008 = "ORG_ZSTACK_CORE_REST_10008"; + + public static final String ORG_ZSTACK_CORE_REST_10009 = "ORG_ZSTACK_CORE_REST_10009"; + + public static final String ORG_ZSTACK_CORE_REST_10010 = "ORG_ZSTACK_CORE_REST_10010"; + + public static final String ORG_ZSTACK_CORE_REST_10011 = "ORG_ZSTACK_CORE_REST_10011"; + + public static final String ORG_ZSTACK_CORE_REST_10012 = "ORG_ZSTACK_CORE_REST_10012"; + + public static final String ORG_ZSTACK_LICENSE_10000 = "ORG_ZSTACK_LICENSE_10000"; + + public static final String ORG_ZSTACK_LICENSE_10001 = "ORG_ZSTACK_LICENSE_10001"; + + public static final String ORG_ZSTACK_LICENSE_10002 = "ORG_ZSTACK_LICENSE_10002"; + + public static final String ORG_ZSTACK_LICENSE_10003 = "ORG_ZSTACK_LICENSE_10003"; + + public static final String ORG_ZSTACK_LICENSE_10004 = "ORG_ZSTACK_LICENSE_10004"; + + public static final String ORG_ZSTACK_LICENSE_10005 = "ORG_ZSTACK_LICENSE_10005"; + + public static final String ORG_ZSTACK_LICENSE_10006 = "ORG_ZSTACK_LICENSE_10006"; + + public static final String ORG_ZSTACK_LICENSE_10007 = "ORG_ZSTACK_LICENSE_10007"; + + public static final String ORG_ZSTACK_LICENSE_10008 = "ORG_ZSTACK_LICENSE_10008"; + + public static final String ORG_ZSTACK_LICENSE_10009 = "ORG_ZSTACK_LICENSE_10009"; + + public static final String ORG_ZSTACK_LICENSE_10010 = "ORG_ZSTACK_LICENSE_10010"; + + public static final String ORG_ZSTACK_LICENSE_10011 = "ORG_ZSTACK_LICENSE_10011"; + + public static final String ORG_ZSTACK_LICENSE_10012 = "ORG_ZSTACK_LICENSE_10012"; + + public static final String ORG_ZSTACK_LICENSE_10013 = "ORG_ZSTACK_LICENSE_10013"; + + public static final String ORG_ZSTACK_LICENSE_10014 = "ORG_ZSTACK_LICENSE_10014"; + + public static final String ORG_ZSTACK_LICENSE_10015 = "ORG_ZSTACK_LICENSE_10015"; + + public static final String ORG_ZSTACK_LICENSE_10016 = "ORG_ZSTACK_LICENSE_10016"; + + public static final String ORG_ZSTACK_LICENSE_10017 = "ORG_ZSTACK_LICENSE_10017"; + + public static final String ORG_ZSTACK_LICENSE_10018 = "ORG_ZSTACK_LICENSE_10018"; + + public static final String ORG_ZSTACK_LICENSE_10019 = "ORG_ZSTACK_LICENSE_10019"; + + public static final String ORG_ZSTACK_LICENSE_10020 = "ORG_ZSTACK_LICENSE_10020"; + + public static final String ORG_ZSTACK_LICENSE_10021 = "ORG_ZSTACK_LICENSE_10021"; + + public static final String ORG_ZSTACK_LICENSE_10022 = "ORG_ZSTACK_LICENSE_10022"; + + public static final String ORG_ZSTACK_LICENSE_10023 = "ORG_ZSTACK_LICENSE_10023"; + + public static final String ORG_ZSTACK_LICENSE_10024 = "ORG_ZSTACK_LICENSE_10024"; + + public static final String ORG_ZSTACK_LICENSE_10025 = "ORG_ZSTACK_LICENSE_10025"; + + public static final String ORG_ZSTACK_LICENSE_10026 = "ORG_ZSTACK_LICENSE_10026"; + + public static final String ORG_ZSTACK_LICENSE_10027 = "ORG_ZSTACK_LICENSE_10027"; + + public static final String ORG_ZSTACK_LICENSE_10028 = "ORG_ZSTACK_LICENSE_10028"; + + public static final String ORG_ZSTACK_LICENSE_10029 = "ORG_ZSTACK_LICENSE_10029"; + + public static final String ORG_ZSTACK_LICENSE_10030 = "ORG_ZSTACK_LICENSE_10030"; + + public static final String ORG_ZSTACK_LICENSE_10031 = "ORG_ZSTACK_LICENSE_10031"; + + public static final String ORG_ZSTACK_LICENSE_10032 = "ORG_ZSTACK_LICENSE_10032"; + + public static final String ORG_ZSTACK_LICENSE_10033 = "ORG_ZSTACK_LICENSE_10033"; + + public static final String ORG_ZSTACK_LICENSE_10034 = "ORG_ZSTACK_LICENSE_10034"; + + public static final String ORG_ZSTACK_LICENSE_10035 = "ORG_ZSTACK_LICENSE_10035"; + + public static final String ORG_ZSTACK_LICENSE_10036 = "ORG_ZSTACK_LICENSE_10036"; + + public static final String ORG_ZSTACK_LICENSE_10037 = "ORG_ZSTACK_LICENSE_10037"; + + public static final String ORG_ZSTACK_LICENSE_10038 = "ORG_ZSTACK_LICENSE_10038"; + + public static final String ORG_ZSTACK_LICENSE_10039 = "ORG_ZSTACK_LICENSE_10039"; + + public static final String ORG_ZSTACK_LICENSE_10040 = "ORG_ZSTACK_LICENSE_10040"; + + public static final String ORG_ZSTACK_LICENSE_10041 = "ORG_ZSTACK_LICENSE_10041"; + + public static final String ORG_ZSTACK_LICENSE_10042 = "ORG_ZSTACK_LICENSE_10042"; + + public static final String ORG_ZSTACK_LICENSE_10043 = "ORG_ZSTACK_LICENSE_10043"; + + public static final String ORG_ZSTACK_LICENSE_10044 = "ORG_ZSTACK_LICENSE_10044"; + + public static final String ORG_ZSTACK_LICENSE_10045 = "ORG_ZSTACK_LICENSE_10045"; + + public static final String ORG_ZSTACK_LICENSE_10046 = "ORG_ZSTACK_LICENSE_10046"; + + public static final String ORG_ZSTACK_LICENSE_10047 = "ORG_ZSTACK_LICENSE_10047"; + + public static final String ORG_ZSTACK_LICENSE_10048 = "ORG_ZSTACK_LICENSE_10048"; + + public static final String ORG_ZSTACK_LICENSE_10049 = "ORG_ZSTACK_LICENSE_10049"; + + public static final String ORG_ZSTACK_LICENSE_10050 = "ORG_ZSTACK_LICENSE_10050"; + + public static final String ORG_ZSTACK_LICENSE_10051 = "ORG_ZSTACK_LICENSE_10051"; + + public static final String ORG_ZSTACK_LICENSE_10052 = "ORG_ZSTACK_LICENSE_10052"; + + public static final String ORG_ZSTACK_LICENSE_10053 = "ORG_ZSTACK_LICENSE_10053"; + + public static final String ORG_ZSTACK_LICENSE_10054 = "ORG_ZSTACK_LICENSE_10054"; + + public static final String ORG_ZSTACK_LICENSE_10055 = "ORG_ZSTACK_LICENSE_10055"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10000 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10001 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10002 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10003 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10003"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10004 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10004"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10005 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10005"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10006 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10006"; + + public static final String ORG_ZSTACK_CORE_PLUGIN_10000 = "ORG_ZSTACK_CORE_PLUGIN_10000"; + + public static final String ORG_ZSTACK_CORE_PLUGIN_10001 = "ORG_ZSTACK_CORE_PLUGIN_10001"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10000 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10000"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10001 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10001"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10002 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10002"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10003 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10003"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10004 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10004"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10005 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10005"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10006 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10006"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10007 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10007"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10008 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10008"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10009 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10009"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10010 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10010"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10011 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10011"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10012 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10012"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10013 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10013"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10000 = "ORG_ZSTACK_AI_CONTAINER_10000"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10001 = "ORG_ZSTACK_AI_CONTAINER_10001"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10002 = "ORG_ZSTACK_AI_CONTAINER_10002"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10003 = "ORG_ZSTACK_AI_CONTAINER_10003"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10004 = "ORG_ZSTACK_AI_CONTAINER_10004"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10005 = "ORG_ZSTACK_AI_CONTAINER_10005"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10006 = "ORG_ZSTACK_AI_CONTAINER_10006"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10007 = "ORG_ZSTACK_AI_CONTAINER_10007"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10008 = "ORG_ZSTACK_AI_CONTAINER_10008"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10009 = "ORG_ZSTACK_AI_CONTAINER_10009"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10010 = "ORG_ZSTACK_AI_CONTAINER_10010"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10011 = "ORG_ZSTACK_AI_CONTAINER_10011"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10012 = "ORG_ZSTACK_AI_CONTAINER_10012"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10013 = "ORG_ZSTACK_AI_CONTAINER_10013"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10014 = "ORG_ZSTACK_AI_CONTAINER_10014"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10015 = "ORG_ZSTACK_AI_CONTAINER_10015"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10016 = "ORG_ZSTACK_AI_CONTAINER_10016"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10017 = "ORG_ZSTACK_AI_CONTAINER_10017"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10018 = "ORG_ZSTACK_AI_CONTAINER_10018"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10019 = "ORG_ZSTACK_AI_CONTAINER_10019"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10020 = "ORG_ZSTACK_AI_CONTAINER_10020"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10021 = "ORG_ZSTACK_AI_CONTAINER_10021"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10022 = "ORG_ZSTACK_AI_CONTAINER_10022"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10023 = "ORG_ZSTACK_AI_CONTAINER_10023"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10024 = "ORG_ZSTACK_AI_CONTAINER_10024"; + + public static final String ORG_ZSTACK_AI_CONTAINER_10025 = "ORG_ZSTACK_AI_CONTAINER_10025"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10000 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10000"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10001 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10001"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10002 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10002"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10003 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10003"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10004 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10004"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10005 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10005"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10006 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10006"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10007 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10007"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10008 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10008"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10009 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10009"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10010 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10010"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10011 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10011"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10012 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10012"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10013 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10013"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10014 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10014"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10015 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10015"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10016 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10016"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10017 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10017"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10018 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10018"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10019 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10019"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10020 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10020"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10021 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10021"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10022 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10022"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10023 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10023"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10024 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10024"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10025 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10025"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10026 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10026"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10027 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10027"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10028 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10028"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10029 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10029"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10030 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10030"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10031 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10031"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10032 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10032"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10033 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10033"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10034 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10034"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10035 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10035"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10036 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10036"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10037 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10037"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10038 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10038"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10039 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10039"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10040 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10040"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10041 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10041"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10042 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10042"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10043 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10043"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10044 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10044"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10045 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10045"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10046 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10046"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10047 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10047"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10048 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10048"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10049 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10049"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10050 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10050"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10051 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10051"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10052 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10052"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10053 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10053"; + + public static final String ORG_ZSTACK_LOG4J2_10000 = "ORG_ZSTACK_LOG4J2_10000"; + + public static final String ORG_ZSTACK_LOG4J2_10001 = "ORG_ZSTACK_LOG4J2_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CONTAINER_10000 = "ORG_ZSTACK_TEST_INTEGRATION_CONTAINER_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CONTAINER_10001 = "ORG_ZSTACK_TEST_INTEGRATION_CONTAINER_10001"; + + public static final String ORG_ZSTACK_ZDFS_10000 = "ORG_ZSTACK_ZDFS_10000"; + + public static final String ORG_ZSTACK_ZDFS_10001 = "ORG_ZSTACK_ZDFS_10001"; + + public static final String ORG_ZSTACK_ZDFS_10002 = "ORG_ZSTACK_ZDFS_10002"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10000 = "ORG_ZSTACK_COMPUTE_HOST_10000"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10001 = "ORG_ZSTACK_COMPUTE_HOST_10001"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10002 = "ORG_ZSTACK_COMPUTE_HOST_10002"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10003 = "ORG_ZSTACK_COMPUTE_HOST_10003"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10004 = "ORG_ZSTACK_COMPUTE_HOST_10004"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10005 = "ORG_ZSTACK_COMPUTE_HOST_10005"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10006 = "ORG_ZSTACK_COMPUTE_HOST_10006"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10007 = "ORG_ZSTACK_COMPUTE_HOST_10007"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10008 = "ORG_ZSTACK_COMPUTE_HOST_10008"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10009 = "ORG_ZSTACK_COMPUTE_HOST_10009"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10010 = "ORG_ZSTACK_COMPUTE_HOST_10010"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10011 = "ORG_ZSTACK_COMPUTE_HOST_10011"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10012 = "ORG_ZSTACK_COMPUTE_HOST_10012"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10013 = "ORG_ZSTACK_COMPUTE_HOST_10013"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10014 = "ORG_ZSTACK_COMPUTE_HOST_10014"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10015 = "ORG_ZSTACK_COMPUTE_HOST_10015"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10016 = "ORG_ZSTACK_COMPUTE_HOST_10016"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10017 = "ORG_ZSTACK_COMPUTE_HOST_10017"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10018 = "ORG_ZSTACK_COMPUTE_HOST_10018"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10019 = "ORG_ZSTACK_COMPUTE_HOST_10019"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10020 = "ORG_ZSTACK_COMPUTE_HOST_10020"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10021 = "ORG_ZSTACK_COMPUTE_HOST_10021"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10022 = "ORG_ZSTACK_COMPUTE_HOST_10022"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10023 = "ORG_ZSTACK_COMPUTE_HOST_10023"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10024 = "ORG_ZSTACK_COMPUTE_HOST_10024"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10025 = "ORG_ZSTACK_COMPUTE_HOST_10025"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10026 = "ORG_ZSTACK_COMPUTE_HOST_10026"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10027 = "ORG_ZSTACK_COMPUTE_HOST_10027"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10028 = "ORG_ZSTACK_COMPUTE_HOST_10028"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10029 = "ORG_ZSTACK_COMPUTE_HOST_10029"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10030 = "ORG_ZSTACK_COMPUTE_HOST_10030"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10031 = "ORG_ZSTACK_COMPUTE_HOST_10031"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10032 = "ORG_ZSTACK_COMPUTE_HOST_10032"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10033 = "ORG_ZSTACK_COMPUTE_HOST_10033"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10034 = "ORG_ZSTACK_COMPUTE_HOST_10034"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10035 = "ORG_ZSTACK_COMPUTE_HOST_10035"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10036 = "ORG_ZSTACK_COMPUTE_HOST_10036"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10037 = "ORG_ZSTACK_COMPUTE_HOST_10037"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10038 = "ORG_ZSTACK_COMPUTE_HOST_10038"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10039 = "ORG_ZSTACK_COMPUTE_HOST_10039"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10040 = "ORG_ZSTACK_COMPUTE_HOST_10040"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10041 = "ORG_ZSTACK_COMPUTE_HOST_10041"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10042 = "ORG_ZSTACK_COMPUTE_HOST_10042"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10043 = "ORG_ZSTACK_COMPUTE_HOST_10043"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10044 = "ORG_ZSTACK_COMPUTE_HOST_10044"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10045 = "ORG_ZSTACK_COMPUTE_HOST_10045"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10046 = "ORG_ZSTACK_COMPUTE_HOST_10046"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10047 = "ORG_ZSTACK_COMPUTE_HOST_10047"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10048 = "ORG_ZSTACK_COMPUTE_HOST_10048"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10049 = "ORG_ZSTACK_COMPUTE_HOST_10049"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10050 = "ORG_ZSTACK_COMPUTE_HOST_10050"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10051 = "ORG_ZSTACK_COMPUTE_HOST_10051"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10052 = "ORG_ZSTACK_COMPUTE_HOST_10052"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10053 = "ORG_ZSTACK_COMPUTE_HOST_10053"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10054 = "ORG_ZSTACK_COMPUTE_HOST_10054"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10055 = "ORG_ZSTACK_COMPUTE_HOST_10055"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10056 = "ORG_ZSTACK_COMPUTE_HOST_10056"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10057 = "ORG_ZSTACK_COMPUTE_HOST_10057"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10058 = "ORG_ZSTACK_COMPUTE_HOST_10058"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10059 = "ORG_ZSTACK_COMPUTE_HOST_10059"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10060 = "ORG_ZSTACK_COMPUTE_HOST_10060"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10061 = "ORG_ZSTACK_COMPUTE_HOST_10061"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10062 = "ORG_ZSTACK_COMPUTE_HOST_10062"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10063 = "ORG_ZSTACK_COMPUTE_HOST_10063"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10064 = "ORG_ZSTACK_COMPUTE_HOST_10064"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10065 = "ORG_ZSTACK_COMPUTE_HOST_10065"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10066 = "ORG_ZSTACK_COMPUTE_HOST_10066"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10067 = "ORG_ZSTACK_COMPUTE_HOST_10067"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10068 = "ORG_ZSTACK_COMPUTE_HOST_10068"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10069 = "ORG_ZSTACK_COMPUTE_HOST_10069"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10070 = "ORG_ZSTACK_COMPUTE_HOST_10070"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10071 = "ORG_ZSTACK_COMPUTE_HOST_10071"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10072 = "ORG_ZSTACK_COMPUTE_HOST_10072"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10073 = "ORG_ZSTACK_COMPUTE_HOST_10073"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10074 = "ORG_ZSTACK_COMPUTE_HOST_10074"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10075 = "ORG_ZSTACK_COMPUTE_HOST_10075"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10076 = "ORG_ZSTACK_COMPUTE_HOST_10076"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10077 = "ORG_ZSTACK_COMPUTE_HOST_10077"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10078 = "ORG_ZSTACK_COMPUTE_HOST_10078"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10079 = "ORG_ZSTACK_COMPUTE_HOST_10079"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10080 = "ORG_ZSTACK_COMPUTE_HOST_10080"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10081 = "ORG_ZSTACK_COMPUTE_HOST_10081"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10082 = "ORG_ZSTACK_COMPUTE_HOST_10082"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10083 = "ORG_ZSTACK_COMPUTE_HOST_10083"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10084 = "ORG_ZSTACK_COMPUTE_HOST_10084"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10085 = "ORG_ZSTACK_COMPUTE_HOST_10085"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10086 = "ORG_ZSTACK_COMPUTE_HOST_10086"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10087 = "ORG_ZSTACK_COMPUTE_HOST_10087"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10088 = "ORG_ZSTACK_COMPUTE_HOST_10088"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10089 = "ORG_ZSTACK_COMPUTE_HOST_10089"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10090 = "ORG_ZSTACK_COMPUTE_HOST_10090"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10091 = "ORG_ZSTACK_COMPUTE_HOST_10091"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10092 = "ORG_ZSTACK_COMPUTE_HOST_10092"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10093 = "ORG_ZSTACK_COMPUTE_HOST_10093"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10094 = "ORG_ZSTACK_COMPUTE_HOST_10094"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10095 = "ORG_ZSTACK_COMPUTE_HOST_10095"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10096 = "ORG_ZSTACK_COMPUTE_HOST_10096"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10097 = "ORG_ZSTACK_COMPUTE_HOST_10097"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10098 = "ORG_ZSTACK_COMPUTE_HOST_10098"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10099 = "ORG_ZSTACK_COMPUTE_HOST_10099"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10100 = "ORG_ZSTACK_COMPUTE_HOST_10100"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10101 = "ORG_ZSTACK_COMPUTE_HOST_10101"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10102 = "ORG_ZSTACK_COMPUTE_HOST_10102"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10103 = "ORG_ZSTACK_COMPUTE_HOST_10103"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10104 = "ORG_ZSTACK_COMPUTE_HOST_10104"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10105 = "ORG_ZSTACK_COMPUTE_HOST_10105"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10106 = "ORG_ZSTACK_COMPUTE_HOST_10106"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10107 = "ORG_ZSTACK_COMPUTE_HOST_10107"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10108 = "ORG_ZSTACK_COMPUTE_HOST_10108"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10109 = "ORG_ZSTACK_COMPUTE_HOST_10109"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10110 = "ORG_ZSTACK_COMPUTE_HOST_10110"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10111 = "ORG_ZSTACK_COMPUTE_HOST_10111"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10112 = "ORG_ZSTACK_COMPUTE_HOST_10112"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10113 = "ORG_ZSTACK_COMPUTE_HOST_10113"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10114 = "ORG_ZSTACK_COMPUTE_HOST_10114"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10115 = "ORG_ZSTACK_COMPUTE_HOST_10115"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10116 = "ORG_ZSTACK_COMPUTE_HOST_10116"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10117 = "ORG_ZSTACK_COMPUTE_HOST_10117"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10118 = "ORG_ZSTACK_COMPUTE_HOST_10118"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10119 = "ORG_ZSTACK_COMPUTE_HOST_10119"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10120 = "ORG_ZSTACK_COMPUTE_HOST_10120"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10121 = "ORG_ZSTACK_COMPUTE_HOST_10121"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10122 = "ORG_ZSTACK_COMPUTE_HOST_10122"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10123 = "ORG_ZSTACK_COMPUTE_HOST_10123"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10124 = "ORG_ZSTACK_COMPUTE_HOST_10124"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10125 = "ORG_ZSTACK_COMPUTE_HOST_10125"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10126 = "ORG_ZSTACK_COMPUTE_HOST_10126"; + + public static final String ORG_ZSTACK_COMPUTE_HOST_10127 = "ORG_ZSTACK_COMPUTE_HOST_10127"; + + public static final String ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10000 = "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10000"; + + public static final String ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10001 = "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10001"; + + public static final String ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10002 = "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10002"; + + public static final String ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10003 = "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10003"; + + public static final String ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10004 = "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10004"; + + public static final String ORG_ZSTACK_COMPUTE_VM_NUMA_10000 = "ORG_ZSTACK_COMPUTE_VM_NUMA_10000"; + + public static final String ORG_ZSTACK_COMPUTE_VM_NUMA_10001 = "ORG_ZSTACK_COMPUTE_VM_NUMA_10001"; + + public static final String ORG_ZSTACK_COMPUTE_VM_NUMA_10002 = "ORG_ZSTACK_COMPUTE_VM_NUMA_10002"; + + public static final String ORG_ZSTACK_COMPUTE_VM_NUMA_10003 = "ORG_ZSTACK_COMPUTE_VM_NUMA_10003"; + + public static final String ORG_ZSTACK_COMPUTE_VM_NUMA_10004 = "ORG_ZSTACK_COMPUTE_VM_NUMA_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_KVM_HOST_10000 = "ORG_ZSTACK_TEST_INTEGRATION_KVM_HOST_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_KVM_HOST_10001 = "ORG_ZSTACK_TEST_INTEGRATION_KVM_HOST_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_KVM_HOST_10002 = "ORG_ZSTACK_TEST_INTEGRATION_KVM_HOST_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_KVM_HOST_10003 = "ORG_ZSTACK_TEST_INTEGRATION_KVM_HOST_10003"; + + public static final String ORG_ZSTACK_TEST_KVM_10000 = "ORG_ZSTACK_TEST_KVM_10000"; + + public static final String ORG_ZSTACK_VROUTERROUTE_VYOS_10000 = "ORG_ZSTACK_VROUTERROUTE_VYOS_10000"; + + public static final String ORG_ZSTACK_VROUTERROUTE_VYOS_10001 = "ORG_ZSTACK_VROUTERROUTE_VYOS_10001"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10000 = "ORG_ZSTACK_STORAGE_VOLUME_10000"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10001 = "ORG_ZSTACK_STORAGE_VOLUME_10001"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10002 = "ORG_ZSTACK_STORAGE_VOLUME_10002"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10003 = "ORG_ZSTACK_STORAGE_VOLUME_10003"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10004 = "ORG_ZSTACK_STORAGE_VOLUME_10004"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10005 = "ORG_ZSTACK_STORAGE_VOLUME_10005"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10006 = "ORG_ZSTACK_STORAGE_VOLUME_10006"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10007 = "ORG_ZSTACK_STORAGE_VOLUME_10007"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10008 = "ORG_ZSTACK_STORAGE_VOLUME_10008"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10009 = "ORG_ZSTACK_STORAGE_VOLUME_10009"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10010 = "ORG_ZSTACK_STORAGE_VOLUME_10010"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10011 = "ORG_ZSTACK_STORAGE_VOLUME_10011"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10012 = "ORG_ZSTACK_STORAGE_VOLUME_10012"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10013 = "ORG_ZSTACK_STORAGE_VOLUME_10013"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10014 = "ORG_ZSTACK_STORAGE_VOLUME_10014"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10015 = "ORG_ZSTACK_STORAGE_VOLUME_10015"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10016 = "ORG_ZSTACK_STORAGE_VOLUME_10016"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10017 = "ORG_ZSTACK_STORAGE_VOLUME_10017"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10018 = "ORG_ZSTACK_STORAGE_VOLUME_10018"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10019 = "ORG_ZSTACK_STORAGE_VOLUME_10019"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10020 = "ORG_ZSTACK_STORAGE_VOLUME_10020"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10021 = "ORG_ZSTACK_STORAGE_VOLUME_10021"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10022 = "ORG_ZSTACK_STORAGE_VOLUME_10022"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10023 = "ORG_ZSTACK_STORAGE_VOLUME_10023"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10024 = "ORG_ZSTACK_STORAGE_VOLUME_10024"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10025 = "ORG_ZSTACK_STORAGE_VOLUME_10025"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10026 = "ORG_ZSTACK_STORAGE_VOLUME_10026"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10027 = "ORG_ZSTACK_STORAGE_VOLUME_10027"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10028 = "ORG_ZSTACK_STORAGE_VOLUME_10028"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10029 = "ORG_ZSTACK_STORAGE_VOLUME_10029"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10030 = "ORG_ZSTACK_STORAGE_VOLUME_10030"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10031 = "ORG_ZSTACK_STORAGE_VOLUME_10031"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10032 = "ORG_ZSTACK_STORAGE_VOLUME_10032"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10033 = "ORG_ZSTACK_STORAGE_VOLUME_10033"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10034 = "ORG_ZSTACK_STORAGE_VOLUME_10034"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10035 = "ORG_ZSTACK_STORAGE_VOLUME_10035"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10036 = "ORG_ZSTACK_STORAGE_VOLUME_10036"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10037 = "ORG_ZSTACK_STORAGE_VOLUME_10037"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10038 = "ORG_ZSTACK_STORAGE_VOLUME_10038"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10039 = "ORG_ZSTACK_STORAGE_VOLUME_10039"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10040 = "ORG_ZSTACK_STORAGE_VOLUME_10040"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10041 = "ORG_ZSTACK_STORAGE_VOLUME_10041"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10042 = "ORG_ZSTACK_STORAGE_VOLUME_10042"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10043 = "ORG_ZSTACK_STORAGE_VOLUME_10043"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10044 = "ORG_ZSTACK_STORAGE_VOLUME_10044"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10045 = "ORG_ZSTACK_STORAGE_VOLUME_10045"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10046 = "ORG_ZSTACK_STORAGE_VOLUME_10046"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10047 = "ORG_ZSTACK_STORAGE_VOLUME_10047"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10048 = "ORG_ZSTACK_STORAGE_VOLUME_10048"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10049 = "ORG_ZSTACK_STORAGE_VOLUME_10049"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10050 = "ORG_ZSTACK_STORAGE_VOLUME_10050"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10051 = "ORG_ZSTACK_STORAGE_VOLUME_10051"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10052 = "ORG_ZSTACK_STORAGE_VOLUME_10052"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10053 = "ORG_ZSTACK_STORAGE_VOLUME_10053"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10054 = "ORG_ZSTACK_STORAGE_VOLUME_10054"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10055 = "ORG_ZSTACK_STORAGE_VOLUME_10055"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10056 = "ORG_ZSTACK_STORAGE_VOLUME_10056"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10057 = "ORG_ZSTACK_STORAGE_VOLUME_10057"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10058 = "ORG_ZSTACK_STORAGE_VOLUME_10058"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10059 = "ORG_ZSTACK_STORAGE_VOLUME_10059"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10060 = "ORG_ZSTACK_STORAGE_VOLUME_10060"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10061 = "ORG_ZSTACK_STORAGE_VOLUME_10061"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10062 = "ORG_ZSTACK_STORAGE_VOLUME_10062"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10063 = "ORG_ZSTACK_STORAGE_VOLUME_10063"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10064 = "ORG_ZSTACK_STORAGE_VOLUME_10064"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10065 = "ORG_ZSTACK_STORAGE_VOLUME_10065"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10066 = "ORG_ZSTACK_STORAGE_VOLUME_10066"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10067 = "ORG_ZSTACK_STORAGE_VOLUME_10067"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10068 = "ORG_ZSTACK_STORAGE_VOLUME_10068"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10069 = "ORG_ZSTACK_STORAGE_VOLUME_10069"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10070 = "ORG_ZSTACK_STORAGE_VOLUME_10070"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10071 = "ORG_ZSTACK_STORAGE_VOLUME_10071"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10072 = "ORG_ZSTACK_STORAGE_VOLUME_10072"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10073 = "ORG_ZSTACK_STORAGE_VOLUME_10073"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10074 = "ORG_ZSTACK_STORAGE_VOLUME_10074"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10075 = "ORG_ZSTACK_STORAGE_VOLUME_10075"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10076 = "ORG_ZSTACK_STORAGE_VOLUME_10076"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10077 = "ORG_ZSTACK_STORAGE_VOLUME_10077"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10078 = "ORG_ZSTACK_STORAGE_VOLUME_10078"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10079 = "ORG_ZSTACK_STORAGE_VOLUME_10079"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10080 = "ORG_ZSTACK_STORAGE_VOLUME_10080"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10081 = "ORG_ZSTACK_STORAGE_VOLUME_10081"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10082 = "ORG_ZSTACK_STORAGE_VOLUME_10082"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10083 = "ORG_ZSTACK_STORAGE_VOLUME_10083"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10084 = "ORG_ZSTACK_STORAGE_VOLUME_10084"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10085 = "ORG_ZSTACK_STORAGE_VOLUME_10085"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10086 = "ORG_ZSTACK_STORAGE_VOLUME_10086"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10087 = "ORG_ZSTACK_STORAGE_VOLUME_10087"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10088 = "ORG_ZSTACK_STORAGE_VOLUME_10088"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10089 = "ORG_ZSTACK_STORAGE_VOLUME_10089"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10090 = "ORG_ZSTACK_STORAGE_VOLUME_10090"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10091 = "ORG_ZSTACK_STORAGE_VOLUME_10091"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10092 = "ORG_ZSTACK_STORAGE_VOLUME_10092"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10093 = "ORG_ZSTACK_STORAGE_VOLUME_10093"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10094 = "ORG_ZSTACK_STORAGE_VOLUME_10094"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10095 = "ORG_ZSTACK_STORAGE_VOLUME_10095"; + + public static final String ORG_ZSTACK_STORAGE_VOLUME_10096 = "ORG_ZSTACK_STORAGE_VOLUME_10096"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10002 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10003 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10004 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10005 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10005"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10000 = "ORG_ZSTACK_AUTOSCALING_GROUP_10000"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10001 = "ORG_ZSTACK_AUTOSCALING_GROUP_10001"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10002 = "ORG_ZSTACK_AUTOSCALING_GROUP_10002"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10003 = "ORG_ZSTACK_AUTOSCALING_GROUP_10003"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10004 = "ORG_ZSTACK_AUTOSCALING_GROUP_10004"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10005 = "ORG_ZSTACK_AUTOSCALING_GROUP_10005"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10006 = "ORG_ZSTACK_AUTOSCALING_GROUP_10006"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10007 = "ORG_ZSTACK_AUTOSCALING_GROUP_10007"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10008 = "ORG_ZSTACK_AUTOSCALING_GROUP_10008"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10009 = "ORG_ZSTACK_AUTOSCALING_GROUP_10009"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10010 = "ORG_ZSTACK_AUTOSCALING_GROUP_10010"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10011 = "ORG_ZSTACK_AUTOSCALING_GROUP_10011"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10012 = "ORG_ZSTACK_AUTOSCALING_GROUP_10012"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10013 = "ORG_ZSTACK_AUTOSCALING_GROUP_10013"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10014 = "ORG_ZSTACK_AUTOSCALING_GROUP_10014"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10015 = "ORG_ZSTACK_AUTOSCALING_GROUP_10015"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10016 = "ORG_ZSTACK_AUTOSCALING_GROUP_10016"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10017 = "ORG_ZSTACK_AUTOSCALING_GROUP_10017"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10018 = "ORG_ZSTACK_AUTOSCALING_GROUP_10018"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10019 = "ORG_ZSTACK_AUTOSCALING_GROUP_10019"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10020 = "ORG_ZSTACK_AUTOSCALING_GROUP_10020"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10021 = "ORG_ZSTACK_AUTOSCALING_GROUP_10021"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10022 = "ORG_ZSTACK_AUTOSCALING_GROUP_10022"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10023 = "ORG_ZSTACK_AUTOSCALING_GROUP_10023"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10024 = "ORG_ZSTACK_AUTOSCALING_GROUP_10024"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10025 = "ORG_ZSTACK_AUTOSCALING_GROUP_10025"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10026 = "ORG_ZSTACK_AUTOSCALING_GROUP_10026"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10027 = "ORG_ZSTACK_AUTOSCALING_GROUP_10027"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10028 = "ORG_ZSTACK_AUTOSCALING_GROUP_10028"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10029 = "ORG_ZSTACK_AUTOSCALING_GROUP_10029"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10030 = "ORG_ZSTACK_AUTOSCALING_GROUP_10030"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10031 = "ORG_ZSTACK_AUTOSCALING_GROUP_10031"; + + public static final String ORG_ZSTACK_AUTOSCALING_GROUP_10032 = "ORG_ZSTACK_AUTOSCALING_GROUP_10032"; + + public static final String ORG_ZSTACK_IAM2_SECURITYGROUP_10000 = "ORG_ZSTACK_IAM2_SECURITYGROUP_10000"; + + public static final String ORG_ZSTACK_IAM2_SECURITYGROUP_10001 = "ORG_ZSTACK_IAM2_SECURITYGROUP_10001"; + + public static final String ORG_ZSTACK_IAM2_SECURITYGROUP_10002 = "ORG_ZSTACK_IAM2_SECURITYGROUP_10002"; + + public static final String ORG_ZSTACK_IAM2_SECURITYGROUP_10003 = "ORG_ZSTACK_IAM2_SECURITYGROUP_10003"; + + public static final String ORG_ZSTACK_IAM2_SECURITYGROUP_10004 = "ORG_ZSTACK_IAM2_SECURITYGROUP_10004"; + + public static final String ORG_ZSTACK_IAM2_SECURITYGROUP_10005 = "ORG_ZSTACK_IAM2_SECURITYGROUP_10005"; + + public static final String ORG_ZSTACK_IAM2_SECURITYGROUP_10006 = "ORG_ZSTACK_IAM2_SECURITYGROUP_10006"; + + public static final String ORG_ZSTACK_IAM2_SECURITYGROUP_10007 = "ORG_ZSTACK_IAM2_SECURITYGROUP_10007"; + + public static final String ORG_ZSTACK_IAM2_SECURITYGROUP_10008 = "ORG_ZSTACK_IAM2_SECURITYGROUP_10008"; + + public static final String ORG_ZSTACK_IAM2_SECURITYGROUP_10009 = "ORG_ZSTACK_IAM2_SECURITYGROUP_10009"; + + public static final String ORG_ZSTACK_IAM2_SECURITYGROUP_10010 = "ORG_ZSTACK_IAM2_SECURITYGROUP_10010"; + + public static final String ORG_ZSTACK_IAM2_SECURITYGROUP_10011 = "ORG_ZSTACK_IAM2_SECURITYGROUP_10011"; + + public static final String ORG_ZSTACK_IAM2_SECURITYGROUP_10012 = "ORG_ZSTACK_IAM2_SECURITYGROUP_10012"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10000 = "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10000"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10001 = "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10001"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10002 = "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10002"; + + public static final String ORG_ZSTACK_ALIYUN_OSS_10000 = "ORG_ZSTACK_ALIYUN_OSS_10000"; + + public static final String ORG_ZSTACK_ALIYUN_OSS_10001 = "ORG_ZSTACK_ALIYUN_OSS_10001"; + + public static final String ORG_ZSTACK_ALIYUN_OSS_10002 = "ORG_ZSTACK_ALIYUN_OSS_10002"; + + public static final String ORG_ZSTACK_ALIYUN_OSS_10003 = "ORG_ZSTACK_ALIYUN_OSS_10003"; + + public static final String ORG_ZSTACK_ZSV_COMPUTER_VM_10000 = "ORG_ZSTACK_ZSV_COMPUTER_VM_10000"; + + public static final String ORG_ZSTACK_PCIDEVICE_10000 = "ORG_ZSTACK_PCIDEVICE_10000"; + + public static final String ORG_ZSTACK_PCIDEVICE_10001 = "ORG_ZSTACK_PCIDEVICE_10001"; + + public static final String ORG_ZSTACK_PCIDEVICE_10002 = "ORG_ZSTACK_PCIDEVICE_10002"; + + public static final String ORG_ZSTACK_PCIDEVICE_10003 = "ORG_ZSTACK_PCIDEVICE_10003"; + + public static final String ORG_ZSTACK_PCIDEVICE_10004 = "ORG_ZSTACK_PCIDEVICE_10004"; + + public static final String ORG_ZSTACK_PCIDEVICE_10005 = "ORG_ZSTACK_PCIDEVICE_10005"; + + public static final String ORG_ZSTACK_PCIDEVICE_10006 = "ORG_ZSTACK_PCIDEVICE_10006"; + + public static final String ORG_ZSTACK_PCIDEVICE_10007 = "ORG_ZSTACK_PCIDEVICE_10007"; + + public static final String ORG_ZSTACK_PCIDEVICE_10008 = "ORG_ZSTACK_PCIDEVICE_10008"; + + public static final String ORG_ZSTACK_PCIDEVICE_10009 = "ORG_ZSTACK_PCIDEVICE_10009"; + + public static final String ORG_ZSTACK_PCIDEVICE_10010 = "ORG_ZSTACK_PCIDEVICE_10010"; + + public static final String ORG_ZSTACK_PCIDEVICE_10011 = "ORG_ZSTACK_PCIDEVICE_10011"; + + public static final String ORG_ZSTACK_PCIDEVICE_10012 = "ORG_ZSTACK_PCIDEVICE_10012"; + + public static final String ORG_ZSTACK_PCIDEVICE_10013 = "ORG_ZSTACK_PCIDEVICE_10013"; + + public static final String ORG_ZSTACK_PCIDEVICE_10014 = "ORG_ZSTACK_PCIDEVICE_10014"; + + public static final String ORG_ZSTACK_PCIDEVICE_10015 = "ORG_ZSTACK_PCIDEVICE_10015"; + + public static final String ORG_ZSTACK_PCIDEVICE_10016 = "ORG_ZSTACK_PCIDEVICE_10016"; + + public static final String ORG_ZSTACK_PCIDEVICE_10017 = "ORG_ZSTACK_PCIDEVICE_10017"; + + public static final String ORG_ZSTACK_PCIDEVICE_10018 = "ORG_ZSTACK_PCIDEVICE_10018"; + + public static final String ORG_ZSTACK_PCIDEVICE_10019 = "ORG_ZSTACK_PCIDEVICE_10019"; + + public static final String ORG_ZSTACK_PCIDEVICE_10020 = "ORG_ZSTACK_PCIDEVICE_10020"; + + public static final String ORG_ZSTACK_PCIDEVICE_10021 = "ORG_ZSTACK_PCIDEVICE_10021"; + + public static final String ORG_ZSTACK_PCIDEVICE_10022 = "ORG_ZSTACK_PCIDEVICE_10022"; + + public static final String ORG_ZSTACK_PCIDEVICE_10023 = "ORG_ZSTACK_PCIDEVICE_10023"; + + public static final String ORG_ZSTACK_PCIDEVICE_10024 = "ORG_ZSTACK_PCIDEVICE_10024"; + + public static final String ORG_ZSTACK_PCIDEVICE_10025 = "ORG_ZSTACK_PCIDEVICE_10025"; + + public static final String ORG_ZSTACK_PCIDEVICE_10026 = "ORG_ZSTACK_PCIDEVICE_10026"; + + public static final String ORG_ZSTACK_PCIDEVICE_10027 = "ORG_ZSTACK_PCIDEVICE_10027"; + + public static final String ORG_ZSTACK_PCIDEVICE_10028 = "ORG_ZSTACK_PCIDEVICE_10028"; + + public static final String ORG_ZSTACK_PCIDEVICE_10029 = "ORG_ZSTACK_PCIDEVICE_10029"; + + public static final String ORG_ZSTACK_PCIDEVICE_10030 = "ORG_ZSTACK_PCIDEVICE_10030"; + + public static final String ORG_ZSTACK_PCIDEVICE_10031 = "ORG_ZSTACK_PCIDEVICE_10031"; + + public static final String ORG_ZSTACK_PCIDEVICE_10032 = "ORG_ZSTACK_PCIDEVICE_10032"; + + public static final String ORG_ZSTACK_PCIDEVICE_10033 = "ORG_ZSTACK_PCIDEVICE_10033"; + + public static final String ORG_ZSTACK_PCIDEVICE_10034 = "ORG_ZSTACK_PCIDEVICE_10034"; + + public static final String ORG_ZSTACK_PCIDEVICE_10035 = "ORG_ZSTACK_PCIDEVICE_10035"; + + public static final String ORG_ZSTACK_PCIDEVICE_10036 = "ORG_ZSTACK_PCIDEVICE_10036"; + + public static final String ORG_ZSTACK_PCIDEVICE_10037 = "ORG_ZSTACK_PCIDEVICE_10037"; + + public static final String ORG_ZSTACK_PCIDEVICE_10038 = "ORG_ZSTACK_PCIDEVICE_10038"; + + public static final String ORG_ZSTACK_PCIDEVICE_10039 = "ORG_ZSTACK_PCIDEVICE_10039"; + + public static final String ORG_ZSTACK_PCIDEVICE_10040 = "ORG_ZSTACK_PCIDEVICE_10040"; + + public static final String ORG_ZSTACK_PCIDEVICE_10041 = "ORG_ZSTACK_PCIDEVICE_10041"; + + public static final String ORG_ZSTACK_PCIDEVICE_10042 = "ORG_ZSTACK_PCIDEVICE_10042"; + + public static final String ORG_ZSTACK_PCIDEVICE_10043 = "ORG_ZSTACK_PCIDEVICE_10043"; + + public static final String ORG_ZSTACK_PCIDEVICE_10044 = "ORG_ZSTACK_PCIDEVICE_10044"; + + public static final String ORG_ZSTACK_PCIDEVICE_10045 = "ORG_ZSTACK_PCIDEVICE_10045"; + + public static final String ORG_ZSTACK_PCIDEVICE_10046 = "ORG_ZSTACK_PCIDEVICE_10046"; + + public static final String ORG_ZSTACK_PCIDEVICE_10047 = "ORG_ZSTACK_PCIDEVICE_10047"; + + public static final String ORG_ZSTACK_PCIDEVICE_10048 = "ORG_ZSTACK_PCIDEVICE_10048"; + + public static final String ORG_ZSTACK_PCIDEVICE_10049 = "ORG_ZSTACK_PCIDEVICE_10049"; + + public static final String ORG_ZSTACK_PCIDEVICE_10050 = "ORG_ZSTACK_PCIDEVICE_10050"; + + public static final String ORG_ZSTACK_PCIDEVICE_10051 = "ORG_ZSTACK_PCIDEVICE_10051"; + + public static final String ORG_ZSTACK_PCIDEVICE_10052 = "ORG_ZSTACK_PCIDEVICE_10052"; + + public static final String ORG_ZSTACK_PCIDEVICE_10053 = "ORG_ZSTACK_PCIDEVICE_10053"; + + public static final String ORG_ZSTACK_PCIDEVICE_10054 = "ORG_ZSTACK_PCIDEVICE_10054"; + + public static final String ORG_ZSTACK_PCIDEVICE_10055 = "ORG_ZSTACK_PCIDEVICE_10055"; + + public static final String ORG_ZSTACK_PCIDEVICE_10056 = "ORG_ZSTACK_PCIDEVICE_10056"; + + public static final String ORG_ZSTACK_PCIDEVICE_10057 = "ORG_ZSTACK_PCIDEVICE_10057"; + + public static final String ORG_ZSTACK_PCIDEVICE_10058 = "ORG_ZSTACK_PCIDEVICE_10058"; + + public static final String ORG_ZSTACK_PCIDEVICE_10059 = "ORG_ZSTACK_PCIDEVICE_10059"; + + public static final String ORG_ZSTACK_PCIDEVICE_10060 = "ORG_ZSTACK_PCIDEVICE_10060"; + + public static final String ORG_ZSTACK_PCIDEVICE_10061 = "ORG_ZSTACK_PCIDEVICE_10061"; + + public static final String ORG_ZSTACK_PCIDEVICE_10062 = "ORG_ZSTACK_PCIDEVICE_10062"; + + public static final String ORG_ZSTACK_PCIDEVICE_10063 = "ORG_ZSTACK_PCIDEVICE_10063"; + + public static final String ORG_ZSTACK_PCIDEVICE_10064 = "ORG_ZSTACK_PCIDEVICE_10064"; + + public static final String ORG_ZSTACK_PCIDEVICE_10065 = "ORG_ZSTACK_PCIDEVICE_10065"; + + public static final String ORG_ZSTACK_PCIDEVICE_10066 = "ORG_ZSTACK_PCIDEVICE_10066"; + + public static final String ORG_ZSTACK_PCIDEVICE_10067 = "ORG_ZSTACK_PCIDEVICE_10067"; + + public static final String ORG_ZSTACK_PCIDEVICE_10068 = "ORG_ZSTACK_PCIDEVICE_10068"; + + public static final String ORG_ZSTACK_PCIDEVICE_10069 = "ORG_ZSTACK_PCIDEVICE_10069"; + + public static final String ORG_ZSTACK_PCIDEVICE_10070 = "ORG_ZSTACK_PCIDEVICE_10070"; + + public static final String ORG_ZSTACK_PCIDEVICE_10071 = "ORG_ZSTACK_PCIDEVICE_10071"; + + public static final String ORG_ZSTACK_PCIDEVICE_10072 = "ORG_ZSTACK_PCIDEVICE_10072"; + + public static final String ORG_ZSTACK_PCIDEVICE_10073 = "ORG_ZSTACK_PCIDEVICE_10073"; + + public static final String ORG_ZSTACK_PCIDEVICE_10074 = "ORG_ZSTACK_PCIDEVICE_10074"; + + public static final String ORG_ZSTACK_PCIDEVICE_10075 = "ORG_ZSTACK_PCIDEVICE_10075"; + + public static final String ORG_ZSTACK_PCIDEVICE_10076 = "ORG_ZSTACK_PCIDEVICE_10076"; + + public static final String ORG_ZSTACK_CAS_DRIVER_DONGHAI_10000 = "ORG_ZSTACK_CAS_DRIVER_DONGHAI_10000"; + + public static final String ORG_ZSTACK_CAS_DRIVER_DONGHAI_10001 = "ORG_ZSTACK_CAS_DRIVER_DONGHAI_10001"; + + public static final String ORG_ZSTACK_CAS_DRIVER_DONGHAI_10002 = "ORG_ZSTACK_CAS_DRIVER_DONGHAI_10002"; + + public static final String ORG_ZSTACK_CAS_DRIVER_DONGHAI_10003 = "ORG_ZSTACK_CAS_DRIVER_DONGHAI_10003"; + + public static final String ORG_ZSTACK_CAS_DRIVER_DONGHAI_10004 = "ORG_ZSTACK_CAS_DRIVER_DONGHAI_10004"; + + public static final String ORG_ZSTACK_CAS_DRIVER_DONGHAI_10005 = "ORG_ZSTACK_CAS_DRIVER_DONGHAI_10005"; + + public static final String ORG_ZSTACK_CAS_DRIVER_DONGHAI_10006 = "ORG_ZSTACK_CAS_DRIVER_DONGHAI_10006"; + + public static final String ORG_ZSTACK_CAS_DRIVER_DONGHAI_10007 = "ORG_ZSTACK_CAS_DRIVER_DONGHAI_10007"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10000 = "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10000"; + + public static final String ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10001 = "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10001"; + + public static final String ORG_ZSTACK_ENCRYPT_10000 = "ORG_ZSTACK_ENCRYPT_10000"; + + public static final String ORG_ZSTACK_ENCRYPT_10001 = "ORG_ZSTACK_ENCRYPT_10001"; + + public static final String ORG_ZSTACK_ENCRYPT_10002 = "ORG_ZSTACK_ENCRYPT_10002"; + + public static final String ORG_ZSTACK_LOGIN_10000 = "ORG_ZSTACK_LOGIN_10000"; + + public static final String ORG_ZSTACK_LOGIN_10001 = "ORG_ZSTACK_LOGIN_10001"; + + public static final String ORG_ZSTACK_LOGIN_10002 = "ORG_ZSTACK_LOGIN_10002"; + + public static final String ORG_ZSTACK_LOGIN_10003 = "ORG_ZSTACK_LOGIN_10003"; + + public static final String ORG_ZSTACK_LOGIN_10004 = "ORG_ZSTACK_LOGIN_10004"; + + public static final String ORG_ZSTACK_LOGIN_10005 = "ORG_ZSTACK_LOGIN_10005"; + + public static final String ORG_ZSTACK_LOGIN_10006 = "ORG_ZSTACK_LOGIN_10006"; + + public static final String ORG_ZSTACK_LOGIN_10007 = "ORG_ZSTACK_LOGIN_10007"; + + public static final String ORG_ZSTACK_LOGIN_10008 = "ORG_ZSTACK_LOGIN_10008"; + + public static final String ORG_ZSTACK_LOGIN_10009 = "ORG_ZSTACK_LOGIN_10009"; + + public static final String ORG_ZSTACK_LOGIN_10010 = "ORG_ZSTACK_LOGIN_10010"; + + public static final String ORG_ZSTACK_LOGIN_10011 = "ORG_ZSTACK_LOGIN_10011"; + + public static final String ORG_ZSTACK_LOGIN_10012 = "ORG_ZSTACK_LOGIN_10012"; + + public static final String ORG_ZSTACK_LOGIN_10013 = "ORG_ZSTACK_LOGIN_10013"; + + public static final String ORG_ZSTACK_LOGIN_10014 = "ORG_ZSTACK_LOGIN_10014"; + + public static final String ORG_ZSTACK_LOGIN_10015 = "ORG_ZSTACK_LOGIN_10015"; + + public static final String ORG_ZSTACK_LOGIN_10016 = "ORG_ZSTACK_LOGIN_10016"; + + public static final String ORG_ZSTACK_LOGIN_10017 = "ORG_ZSTACK_LOGIN_10017"; + + public static final String ORG_ZSTACK_LOGIN_10018 = "ORG_ZSTACK_LOGIN_10018"; + + public static final String ORG_ZSTACK_LOGIN_10019 = "ORG_ZSTACK_LOGIN_10019"; + + public static final String ORG_ZSTACK_LOGIN_10020 = "ORG_ZSTACK_LOGIN_10020"; + + public static final String ORG_ZSTACK_LOGIN_10021 = "ORG_ZSTACK_LOGIN_10021"; + + public static final String ORG_ZSTACK_LOGIN_10022 = "ORG_ZSTACK_LOGIN_10022"; + + public static final String ORG_ZSTACK_LOGIN_10023 = "ORG_ZSTACK_LOGIN_10023"; + + public static final String ORG_ZSTACK_LOGIN_10024 = "ORG_ZSTACK_LOGIN_10024"; + + public static final String ORG_ZSTACK_LOGIN_10025 = "ORG_ZSTACK_LOGIN_10025"; + + public static final String ORG_ZSTACK_LOGIN_10026 = "ORG_ZSTACK_LOGIN_10026"; + + public static final String ORG_ZSTACK_LOGIN_10027 = "ORG_ZSTACK_LOGIN_10027"; + + public static final String ORG_ZSTACK_LOGIN_10028 = "ORG_ZSTACK_LOGIN_10028"; + + public static final String ORG_ZSTACK_LOGIN_10029 = "ORG_ZSTACK_LOGIN_10029"; + + public static final String ORG_ZSTACK_LOGIN_10030 = "ORG_ZSTACK_LOGIN_10030"; + + public static final String ORG_ZSTACK_LOGIN_10031 = "ORG_ZSTACK_LOGIN_10031"; + + public static final String ORG_ZSTACK_LOGIN_10032 = "ORG_ZSTACK_LOGIN_10032"; + + public static final String ORG_ZSTACK_LOGIN_10033 = "ORG_ZSTACK_LOGIN_10033"; + + public static final String ORG_ZSTACK_LOGIN_10034 = "ORG_ZSTACK_LOGIN_10034"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_10000 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_10000"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_10001 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_10001"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10000 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10000"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10001 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10001"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10002 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10002"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10003 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10003"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10004 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10004"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10005 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10005"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10006 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10006"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10007 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10007"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10008 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10008"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10009 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10009"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10010 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10010"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10011 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10011"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10012 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10012"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10013 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10013"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10014 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10014"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10015 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10015"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10016 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10016"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10017 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10017"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10018 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10018"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10019 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10019"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10020 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10020"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10021 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10021"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10022 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10022"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10023 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10023"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10000 = "ORG_ZSTACK_NETWORK_OVN_10000"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10001 = "ORG_ZSTACK_NETWORK_OVN_10001"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10002 = "ORG_ZSTACK_NETWORK_OVN_10002"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10003 = "ORG_ZSTACK_NETWORK_OVN_10003"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10004 = "ORG_ZSTACK_NETWORK_OVN_10004"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10005 = "ORG_ZSTACK_NETWORK_OVN_10005"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10006 = "ORG_ZSTACK_NETWORK_OVN_10006"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10007 = "ORG_ZSTACK_NETWORK_OVN_10007"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10008 = "ORG_ZSTACK_NETWORK_OVN_10008"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10009 = "ORG_ZSTACK_NETWORK_OVN_10009"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10010 = "ORG_ZSTACK_NETWORK_OVN_10010"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10011 = "ORG_ZSTACK_NETWORK_OVN_10011"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10012 = "ORG_ZSTACK_NETWORK_OVN_10012"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10013 = "ORG_ZSTACK_NETWORK_OVN_10013"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10014 = "ORG_ZSTACK_NETWORK_OVN_10014"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10015 = "ORG_ZSTACK_NETWORK_OVN_10015"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10016 = "ORG_ZSTACK_NETWORK_OVN_10016"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10017 = "ORG_ZSTACK_NETWORK_OVN_10017"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10018 = "ORG_ZSTACK_NETWORK_OVN_10018"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10019 = "ORG_ZSTACK_NETWORK_OVN_10019"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10020 = "ORG_ZSTACK_NETWORK_OVN_10020"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10021 = "ORG_ZSTACK_NETWORK_OVN_10021"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10022 = "ORG_ZSTACK_NETWORK_OVN_10022"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10023 = "ORG_ZSTACK_NETWORK_OVN_10023"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10024 = "ORG_ZSTACK_NETWORK_OVN_10024"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10025 = "ORG_ZSTACK_NETWORK_OVN_10025"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10026 = "ORG_ZSTACK_NETWORK_OVN_10026"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10027 = "ORG_ZSTACK_NETWORK_OVN_10027"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10028 = "ORG_ZSTACK_NETWORK_OVN_10028"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10029 = "ORG_ZSTACK_NETWORK_OVN_10029"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10030 = "ORG_ZSTACK_NETWORK_OVN_10030"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10031 = "ORG_ZSTACK_NETWORK_OVN_10031"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10032 = "ORG_ZSTACK_NETWORK_OVN_10032"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10033 = "ORG_ZSTACK_NETWORK_OVN_10033"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10034 = "ORG_ZSTACK_NETWORK_OVN_10034"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10035 = "ORG_ZSTACK_NETWORK_OVN_10035"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10036 = "ORG_ZSTACK_NETWORK_OVN_10036"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10037 = "ORG_ZSTACK_NETWORK_OVN_10037"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10038 = "ORG_ZSTACK_NETWORK_OVN_10038"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10039 = "ORG_ZSTACK_NETWORK_OVN_10039"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10040 = "ORG_ZSTACK_NETWORK_OVN_10040"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10041 = "ORG_ZSTACK_NETWORK_OVN_10041"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10042 = "ORG_ZSTACK_NETWORK_OVN_10042"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10043 = "ORG_ZSTACK_NETWORK_OVN_10043"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10044 = "ORG_ZSTACK_NETWORK_OVN_10044"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10045 = "ORG_ZSTACK_NETWORK_OVN_10045"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10046 = "ORG_ZSTACK_NETWORK_OVN_10046"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10047 = "ORG_ZSTACK_NETWORK_OVN_10047"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10048 = "ORG_ZSTACK_NETWORK_OVN_10048"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10049 = "ORG_ZSTACK_NETWORK_OVN_10049"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10050 = "ORG_ZSTACK_NETWORK_OVN_10050"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10051 = "ORG_ZSTACK_NETWORK_OVN_10051"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10052 = "ORG_ZSTACK_NETWORK_OVN_10052"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10053 = "ORG_ZSTACK_NETWORK_OVN_10053"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10054 = "ORG_ZSTACK_NETWORK_OVN_10054"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10055 = "ORG_ZSTACK_NETWORK_OVN_10055"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10056 = "ORG_ZSTACK_NETWORK_OVN_10056"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10057 = "ORG_ZSTACK_NETWORK_OVN_10057"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10058 = "ORG_ZSTACK_NETWORK_OVN_10058"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10059 = "ORG_ZSTACK_NETWORK_OVN_10059"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10060 = "ORG_ZSTACK_NETWORK_OVN_10060"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10061 = "ORG_ZSTACK_NETWORK_OVN_10061"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10062 = "ORG_ZSTACK_NETWORK_OVN_10062"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10063 = "ORG_ZSTACK_NETWORK_OVN_10063"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10064 = "ORG_ZSTACK_NETWORK_OVN_10064"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10065 = "ORG_ZSTACK_NETWORK_OVN_10065"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10066 = "ORG_ZSTACK_NETWORK_OVN_10066"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10067 = "ORG_ZSTACK_NETWORK_OVN_10067"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10068 = "ORG_ZSTACK_NETWORK_OVN_10068"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10069 = "ORG_ZSTACK_NETWORK_OVN_10069"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10070 = "ORG_ZSTACK_NETWORK_OVN_10070"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10071 = "ORG_ZSTACK_NETWORK_OVN_10071"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10072 = "ORG_ZSTACK_NETWORK_OVN_10072"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10073 = "ORG_ZSTACK_NETWORK_OVN_10073"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10074 = "ORG_ZSTACK_NETWORK_OVN_10074"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10075 = "ORG_ZSTACK_NETWORK_OVN_10075"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10076 = "ORG_ZSTACK_NETWORK_OVN_10076"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10077 = "ORG_ZSTACK_NETWORK_OVN_10077"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10078 = "ORG_ZSTACK_NETWORK_OVN_10078"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10079 = "ORG_ZSTACK_NETWORK_OVN_10079"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10080 = "ORG_ZSTACK_NETWORK_OVN_10080"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10081 = "ORG_ZSTACK_NETWORK_OVN_10081"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10082 = "ORG_ZSTACK_NETWORK_OVN_10082"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10083 = "ORG_ZSTACK_NETWORK_OVN_10083"; + + public static final String ORG_ZSTACK_NETWORK_OVN_10084 = "ORG_ZSTACK_NETWORK_OVN_10084"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_MARKETPLACE_10000 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_MARKETPLACE_10000"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_IMAGESTORE_10000 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_IMAGESTORE_10000"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_IMAGESTORE_10001 = "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_IMAGESTORE_10001"; + + public static final String ORG_ZSTACK_SNMP_10000 = "ORG_ZSTACK_SNMP_10000"; + + public static final String ORG_ZSTACK_SNMP_10001 = "ORG_ZSTACK_SNMP_10001"; + + public static final String ORG_ZSTACK_SNMP_10002 = "ORG_ZSTACK_SNMP_10002"; + + public static final String ORG_ZSTACK_SNMP_10003 = "ORG_ZSTACK_SNMP_10003"; + + public static final String ORG_ZSTACK_SNMP_10004 = "ORG_ZSTACK_SNMP_10004"; + + public static final String ORG_ZSTACK_SNMP_10005 = "ORG_ZSTACK_SNMP_10005"; + + public static final String ORG_ZSTACK_SNMP_10006 = "ORG_ZSTACK_SNMP_10006"; + + public static final String ORG_ZSTACK_SNMP_10007 = "ORG_ZSTACK_SNMP_10007"; + + public static final String ORG_ZSTACK_SNMP_10008 = "ORG_ZSTACK_SNMP_10008"; + + public static final String ORG_ZSTACK_SNMP_10009 = "ORG_ZSTACK_SNMP_10009"; + + public static final String ORG_ZSTACK_SNMP_10010 = "ORG_ZSTACK_SNMP_10010"; + + public static final String ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10000 = "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10000"; + + public static final String ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10001 = "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10001"; + + public static final String ORG_ZSTACK_VHOST_KVM_10000 = "ORG_ZSTACK_VHOST_KVM_10000"; + + public static final String ORG_ZSTACK_VHOST_KVM_10001 = "ORG_ZSTACK_VHOST_KVM_10001"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10000 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10000"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10001 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10001"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10002 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10002"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10003 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10003"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10004 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10004"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10005 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10005"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10006 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10006"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10007 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10007"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10008 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10008"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10009 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10009"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10010 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10010"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10011 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10011"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10012 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10012"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10013 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10013"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10014 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10014"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10015 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10015"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10016 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10016"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10017 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10017"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10018 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10018"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10019 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10019"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10020 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10020"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10021 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10021"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10022 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10022"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10023 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10023"; + + public static final String ORG_ZSTACK_STORAGE_BACKUP_SFTP_10024 = "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10024"; + + public static final String ORG_ZSTACK_TEST_CORE_ERRORCODE_10000 = "ORG_ZSTACK_TEST_CORE_ERRORCODE_10000"; + + public static final String ORG_ZSTACK_TEST_CORE_ERRORCODE_10001 = "ORG_ZSTACK_TEST_CORE_ERRORCODE_10001"; + + public static final String ORG_ZSTACK_TICKET_ENTITY_10000 = "ORG_ZSTACK_TICKET_ENTITY_10000"; + + public static final String ORG_ZSTACK_TICKET_ENTITY_10001 = "ORG_ZSTACK_TICKET_ENTITY_10001"; + + public static final String ORG_ZSTACK_TWOFACTORAUTHENTICATION_10000 = "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10000"; + + public static final String ORG_ZSTACK_TWOFACTORAUTHENTICATION_10001 = "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10001"; + + public static final String ORG_ZSTACK_TWOFACTORAUTHENTICATION_10002 = "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10002"; + + public static final String ORG_ZSTACK_TWOFACTORAUTHENTICATION_10003 = "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10003"; + + public static final String ORG_ZSTACK_TWOFACTORAUTHENTICATION_10004 = "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10004"; + + public static final String ORG_ZSTACK_TWOFACTORAUTHENTICATION_10005 = "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10005"; + + public static final String ORG_ZSTACK_TWOFACTORAUTHENTICATION_10006 = "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10006"; + + public static final String ORG_ZSTACK_TWOFACTORAUTHENTICATION_10007 = "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10007"; + + public static final String ORG_ZSTACK_TWOFACTORAUTHENTICATION_10008 = "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10008"; + + public static final String ORG_ZSTACK_TWOFACTORAUTHENTICATION_10009 = "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10009"; + + public static final String ORG_ZSTACK_TWOFACTORAUTHENTICATION_10010 = "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10010"; + + public static final String ORG_ZSTACK_TWOFACTORAUTHENTICATION_10011 = "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10011"; + + public static final String ORG_ZSTACK_COMPUTE_CPUPINNING_10000 = "ORG_ZSTACK_COMPUTE_CPUPINNING_10000"; + + public static final String ORG_ZSTACK_COMPUTE_CPUPINNING_10001 = "ORG_ZSTACK_COMPUTE_CPUPINNING_10001"; + + public static final String ORG_ZSTACK_COMPUTE_CPUPINNING_10002 = "ORG_ZSTACK_COMPUTE_CPUPINNING_10002"; + + public static final String ORG_ZSTACK_APIMEDIATOR_10000 = "ORG_ZSTACK_APIMEDIATOR_10000"; + + public static final String ORG_ZSTACK_APIMEDIATOR_10001 = "ORG_ZSTACK_APIMEDIATOR_10001"; + + public static final String ORG_ZSTACK_HYGON_10000 = "ORG_ZSTACK_HYGON_10000"; + + public static final String ORG_ZSTACK_HYGON_10001 = "ORG_ZSTACK_HYGON_10001"; + + public static final String ORG_ZSTACK_HYGON_10002 = "ORG_ZSTACK_HYGON_10002"; + + public static final String ORG_ZSTACK_HYGON_10003 = "ORG_ZSTACK_HYGON_10003"; + + public static final String ORG_ZSTACK_HYGON_10004 = "ORG_ZSTACK_HYGON_10004"; + + public static final String ORG_ZSTACK_HYGON_10005 = "ORG_ZSTACK_HYGON_10005"; + + public static final String ORG_ZSTACK_HYGON_10006 = "ORG_ZSTACK_HYGON_10006"; + + public static final String ORG_ZSTACK_HYGON_10007 = "ORG_ZSTACK_HYGON_10007"; + + public static final String ORG_ZSTACK_HYGON_10008 = "ORG_ZSTACK_HYGON_10008"; + + public static final String ORG_ZSTACK_HYGON_10009 = "ORG_ZSTACK_HYGON_10009"; + + public static final String ORG_ZSTACK_HYGON_10010 = "ORG_ZSTACK_HYGON_10010"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10000 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10000"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10001 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10001"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10002 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10002"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10003 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10003"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10004 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10004"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10005 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10005"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10006 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10006"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10007 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10007"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10008 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10008"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10009 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10009"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10010 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10010"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10011 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10011"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10012 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10012"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10013 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10013"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10014 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10014"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10015 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10015"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10016 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10016"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10017 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10017"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10018 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10018"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10019 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10019"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10020 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10020"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10021 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10021"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10022 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10022"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10023 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10023"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10024 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10024"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10025 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10025"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10026 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10026"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10027 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10027"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10028 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10028"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10029 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10029"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10030 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10030"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10031 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10031"; + + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10032 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10032"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10000 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10000"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10001 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10001"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10002 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10002"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10003 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10003"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10004 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10004"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10005 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10005"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10006 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10006"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10007 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10007"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10008 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10008"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10009 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10009"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10010 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10010"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10011 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10011"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10012 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10012"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10013 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10013"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10014 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10014"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10015 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10015"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10016 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10016"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10017 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10017"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10018 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10018"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10019 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10019"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10020 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10020"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10021 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10021"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10022 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10022"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10023 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10023"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10024 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10024"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10025 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10025"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10026 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10026"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10027 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10027"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10028 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10028"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10029 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10029"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10030 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10030"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10031 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10031"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10032 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10032"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10033 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10033"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10034 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10034"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10035 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10035"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10036 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10036"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10037 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10037"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10038 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10038"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10039 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10039"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10040 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10040"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10041 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10041"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10042 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10042"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10043 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10043"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10044 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10044"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10045 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10045"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10046 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10046"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10047 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10047"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10048 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10048"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10049 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10049"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10050 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10050"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10051 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10051"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10052 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10052"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10053 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10053"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10054 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10054"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10055 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10055"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10056 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10056"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10057 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10057"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10058 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10058"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10059 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10059"; + + public static final String ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10060 = "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10060"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_MICROSOFTTEAMS_10000 = "ORG_ZSTACK_SNS_PLATFORM_MICROSOFTTEAMS_10000"; + + public static final String ORG_ZSTACK_COMPUTE_VDPA_10000 = "ORG_ZSTACK_COMPUTE_VDPA_10000"; + + public static final String ORG_ZSTACK_COMPUTE_VDPA_10001 = "ORG_ZSTACK_COMPUTE_VDPA_10001"; + + public static final String ORG_ZSTACK_COMPUTE_VDPA_10002 = "ORG_ZSTACK_COMPUTE_VDPA_10002"; + + public static final String ORG_ZSTACK_COMPUTE_VDPA_10003 = "ORG_ZSTACK_COMPUTE_VDPA_10003"; + + public static final String ORG_ZSTACK_COMPUTE_VDPA_10004 = "ORG_ZSTACK_COMPUTE_VDPA_10004"; + + public static final String ORG_ZSTACK_COMPUTE_VDPA_10005 = "ORG_ZSTACK_COMPUTE_VDPA_10005"; + + public static final String ORG_ZSTACK_COMPUTE_VDPA_10006 = "ORG_ZSTACK_COMPUTE_VDPA_10006"; + + public static final String ORG_ZSTACK_COMPUTE_VDPA_10007 = "ORG_ZSTACK_COMPUTE_VDPA_10007"; + + public static final String ORG_ZSTACK_COMPUTE_VDPA_10008 = "ORG_ZSTACK_COMPUTE_VDPA_10008"; + + public static final String ORG_ZSTACK_COMPUTE_VDPA_10009 = "ORG_ZSTACK_COMPUTE_VDPA_10009"; + + public static final String ORG_ZSTACK_COMPUTE_VDPA_10010 = "ORG_ZSTACK_COMPUTE_VDPA_10010"; + + public static final String ORG_ZSTACK_COMPUTE_VDPA_10011 = "ORG_ZSTACK_COMPUTE_VDPA_10011"; + + public static final String ORG_ZSTACK_COMPUTE_VDPA_10012 = "ORG_ZSTACK_COMPUTE_VDPA_10012"; + + public static final String ORG_ZSTACK_COMPUTE_VDPA_10013 = "ORG_ZSTACK_COMPUTE_VDPA_10013"; + + public static final String ORG_ZSTACK_COMPUTE_VDPA_10014 = "ORG_ZSTACK_COMPUTE_VDPA_10014"; + + public static final String ORG_ZSTACK_COMPUTE_VDPA_10015 = "ORG_ZSTACK_COMPUTE_VDPA_10015"; + + public static final String ORG_ZSTACK_COMPUTE_VDPA_10016 = "ORG_ZSTACK_COMPUTE_VDPA_10016"; + + public static final String ORG_ZSTACK_CORE_JOB_10000 = "ORG_ZSTACK_CORE_JOB_10000"; + + public static final String ORG_ZSTACK_CORE_JOB_10001 = "ORG_ZSTACK_CORE_JOB_10001"; + + public static final String ORG_ZSTACK_CORE_JOB_10002 = "ORG_ZSTACK_CORE_JOB_10002"; + + public static final String ORG_ZSTACK_CORE_JOB_10003 = "ORG_ZSTACK_CORE_JOB_10003"; + + public static final String ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10000 = "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10000"; + + public static final String ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10001 = "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10001"; + + public static final String ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10002 = "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10002"; + + public static final String ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10003 = "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10003"; + + public static final String ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10004 = "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10004"; + + public static final String ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10005 = "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10005"; + + public static final String ORG_ZSTACK_ALIYUN_NAS_CORE_10000 = "ORG_ZSTACK_ALIYUN_NAS_CORE_10000"; + + public static final String ORG_ZSTACK_MACVLAN_10000 = "ORG_ZSTACK_MACVLAN_10000"; + + public static final String ORG_ZSTACK_MACVLAN_10001 = "ORG_ZSTACK_MACVLAN_10001"; + + public static final String ORG_ZSTACK_MACVLAN_10002 = "ORG_ZSTACK_MACVLAN_10002"; + + public static final String ORG_ZSTACK_MACVLAN_10003 = "ORG_ZSTACK_MACVLAN_10003"; + + public static final String ORG_ZSTACK_MACVLAN_10004 = "ORG_ZSTACK_MACVLAN_10004"; + + public static final String ORG_ZSTACK_MACVLAN_10005 = "ORG_ZSTACK_MACVLAN_10005"; + + public static final String ORG_ZSTACK_MACVLAN_10006 = "ORG_ZSTACK_MACVLAN_10006"; + + public static final String ORG_ZSTACK_MACVLAN_10007 = "ORG_ZSTACK_MACVLAN_10007"; + + public static final String ORG_ZSTACK_MACVLAN_10008 = "ORG_ZSTACK_MACVLAN_10008"; + + public static final String ORG_ZSTACK_MACVLAN_10009 = "ORG_ZSTACK_MACVLAN_10009"; + + public static final String ORG_ZSTACK_MACVLAN_10010 = "ORG_ZSTACK_MACVLAN_10010"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10000 = "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10000"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10001 = "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10001"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10002 = "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10002"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10003 = "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10003"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10004 = "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10004"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10000 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10000"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10001 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10001"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10002 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10002"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10003 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10003"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10004 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10004"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10005 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10005"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10006 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10006"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10007 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10007"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10008 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10008"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10009 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10009"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10010 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10010"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10011 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10011"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10012 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10012"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10013 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10013"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10014 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10014"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10015 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10015"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10016 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10016"; + + public static final String ORG_ZSTACK_MONITORING_MEDIA_10000 = "ORG_ZSTACK_MONITORING_MEDIA_10000"; + + public static final String ORG_ZSTACK_MONITORING_MEDIA_10001 = "ORG_ZSTACK_MONITORING_MEDIA_10001"; + + public static final String ORG_ZSTACK_NETWORK_PLUGIN_10000 = "ORG_ZSTACK_NETWORK_PLUGIN_10000"; + + public static final String ORG_ZSTACK_NETWORK_PLUGIN_10001 = "ORG_ZSTACK_NETWORK_PLUGIN_10001"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREBLOCK_10000 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREBLOCK_10000"; + + public static final String ORG_ZSTACK_IAM2SCRIPT_10000 = "ORG_ZSTACK_IAM2SCRIPT_10000"; + + public static final String ORG_ZSTACK_IAM2SCRIPT_10001 = "ORG_ZSTACK_IAM2SCRIPT_10001"; + + public static final String ORG_ZSTACK_IAM2SCRIPT_10002 = "ORG_ZSTACK_IAM2SCRIPT_10002"; + + public static final String ORG_ZSTACK_IAM2SCRIPT_10003 = "ORG_ZSTACK_IAM2SCRIPT_10003"; + + public static final String ORG_ZSTACK_IAM2SCRIPT_10004 = "ORG_ZSTACK_IAM2SCRIPT_10004"; + + public static final String ORG_ZSTACK_IAM2SCRIPT_10005 = "ORG_ZSTACK_IAM2SCRIPT_10005"; + + public static final String ORG_ZSTACK_IAM2SCRIPT_10006 = "ORG_ZSTACK_IAM2SCRIPT_10006"; + + public static final String ORG_ZSTACK_IAM2SCRIPT_10007 = "ORG_ZSTACK_IAM2SCRIPT_10007"; + + public static final String ORG_ZSTACK_IAM2SCRIPT_10008 = "ORG_ZSTACK_IAM2SCRIPT_10008"; + + public static final String ORG_ZSTACK_IAM2SCRIPT_10009 = "ORG_ZSTACK_IAM2SCRIPT_10009"; + + public static final String ORG_ZSTACK_IAM2SCRIPT_10010 = "ORG_ZSTACK_IAM2SCRIPT_10010"; + + public static final String ORG_ZSTACK_ZWATCH_API_10000 = "ORG_ZSTACK_ZWATCH_API_10000"; + + public static final String ORG_ZSTACK_ZWATCH_API_10001 = "ORG_ZSTACK_ZWATCH_API_10001"; + + public static final String ORG_ZSTACK_ZWATCH_API_10002 = "ORG_ZSTACK_ZWATCH_API_10002"; + + public static final String ORG_ZSTACK_ZWATCH_API_10003 = "ORG_ZSTACK_ZWATCH_API_10003"; + + public static final String ORG_ZSTACK_ZWATCH_API_10004 = "ORG_ZSTACK_ZWATCH_API_10004"; + + public static final String ORG_ZSTACK_ZWATCH_API_10005 = "ORG_ZSTACK_ZWATCH_API_10005"; + + public static final String ORG_ZSTACK_ZWATCH_API_10006 = "ORG_ZSTACK_ZWATCH_API_10006"; + + public static final String ORG_ZSTACK_ZWATCH_API_10007 = "ORG_ZSTACK_ZWATCH_API_10007"; + + public static final String ORG_ZSTACK_ZWATCH_API_10008 = "ORG_ZSTACK_ZWATCH_API_10008"; + + public static final String ORG_ZSTACK_ZWATCH_API_10009 = "ORG_ZSTACK_ZWATCH_API_10009"; + + public static final String ORG_ZSTACK_ZWATCH_API_10010 = "ORG_ZSTACK_ZWATCH_API_10010"; + + public static final String ORG_ZSTACK_ZWATCH_API_10011 = "ORG_ZSTACK_ZWATCH_API_10011"; + + public static final String ORG_ZSTACK_ZWATCH_API_10012 = "ORG_ZSTACK_ZWATCH_API_10012"; + + public static final String ORG_ZSTACK_ZWATCH_API_10013 = "ORG_ZSTACK_ZWATCH_API_10013"; + + public static final String ORG_ZSTACK_ZWATCH_API_10014 = "ORG_ZSTACK_ZWATCH_API_10014"; + + public static final String ORG_ZSTACK_ZWATCH_API_10015 = "ORG_ZSTACK_ZWATCH_API_10015"; + + public static final String ORG_ZSTACK_ZWATCH_API_10016 = "ORG_ZSTACK_ZWATCH_API_10016"; + + public static final String ORG_ZSTACK_ZWATCH_API_10017 = "ORG_ZSTACK_ZWATCH_API_10017"; + + public static final String ORG_ZSTACK_ZWATCH_API_10018 = "ORG_ZSTACK_ZWATCH_API_10018"; + + public static final String ORG_ZSTACK_ZWATCH_API_10019 = "ORG_ZSTACK_ZWATCH_API_10019"; + + public static final String ORG_ZSTACK_ZWATCH_API_10020 = "ORG_ZSTACK_ZWATCH_API_10020"; + + public static final String ORG_ZSTACK_ZWATCH_API_10021 = "ORG_ZSTACK_ZWATCH_API_10021"; + + public static final String ORG_ZSTACK_ZWATCH_API_10022 = "ORG_ZSTACK_ZWATCH_API_10022"; + + public static final String ORG_ZSTACK_ZWATCH_API_10023 = "ORG_ZSTACK_ZWATCH_API_10023"; + + public static final String ORG_ZSTACK_ZWATCH_API_10024 = "ORG_ZSTACK_ZWATCH_API_10024"; + + public static final String ORG_ZSTACK_ZWATCH_API_10025 = "ORG_ZSTACK_ZWATCH_API_10025"; + + public static final String ORG_ZSTACK_ZWATCH_API_10026 = "ORG_ZSTACK_ZWATCH_API_10026"; + + public static final String ORG_ZSTACK_ZWATCH_API_10027 = "ORG_ZSTACK_ZWATCH_API_10027"; + + public static final String ORG_ZSTACK_ZWATCH_API_10028 = "ORG_ZSTACK_ZWATCH_API_10028"; + + public static final String ORG_ZSTACK_ZWATCH_API_10029 = "ORG_ZSTACK_ZWATCH_API_10029"; + + public static final String ORG_ZSTACK_ZWATCH_API_10030 = "ORG_ZSTACK_ZWATCH_API_10030"; + + public static final String ORG_ZSTACK_ZWATCH_API_10031 = "ORG_ZSTACK_ZWATCH_API_10031"; + + public static final String ORG_ZSTACK_ZWATCH_API_10032 = "ORG_ZSTACK_ZWATCH_API_10032"; + + public static final String ORG_ZSTACK_ZWATCH_API_10033 = "ORG_ZSTACK_ZWATCH_API_10033"; + + public static final String ORG_ZSTACK_ZWATCH_API_10034 = "ORG_ZSTACK_ZWATCH_API_10034"; + + public static final String ORG_ZSTACK_ZWATCH_API_10035 = "ORG_ZSTACK_ZWATCH_API_10035"; + + public static final String ORG_ZSTACK_ZWATCH_API_10036 = "ORG_ZSTACK_ZWATCH_API_10036"; + + public static final String ORG_ZSTACK_ZWATCH_API_10037 = "ORG_ZSTACK_ZWATCH_API_10037"; + + public static final String ORG_ZSTACK_ZWATCH_API_10038 = "ORG_ZSTACK_ZWATCH_API_10038"; + + public static final String ORG_ZSTACK_ZWATCH_API_10039 = "ORG_ZSTACK_ZWATCH_API_10039"; + + public static final String ORG_ZSTACK_ZWATCH_API_10040 = "ORG_ZSTACK_ZWATCH_API_10040"; + + public static final String ORG_ZSTACK_ZWATCH_API_10041 = "ORG_ZSTACK_ZWATCH_API_10041"; + + public static final String ORG_ZSTACK_ZWATCH_API_10042 = "ORG_ZSTACK_ZWATCH_API_10042"; + + public static final String ORG_ZSTACK_ZWATCH_API_10043 = "ORG_ZSTACK_ZWATCH_API_10043"; + + public static final String ORG_ZSTACK_ZWATCH_API_10044 = "ORG_ZSTACK_ZWATCH_API_10044"; + + public static final String ORG_ZSTACK_ZWATCH_API_10045 = "ORG_ZSTACK_ZWATCH_API_10045"; + + public static final String ORG_ZSTACK_ZWATCH_API_10046 = "ORG_ZSTACK_ZWATCH_API_10046"; + + public static final String ORG_ZSTACK_COMPUTE_VM_DEVICES_10000 = "ORG_ZSTACK_COMPUTE_VM_DEVICES_10000"; + + public static final String ORG_ZSTACK_COMPUTE_VM_DEVICES_10001 = "ORG_ZSTACK_COMPUTE_VM_DEVICES_10001"; + + public static final String ORG_ZSTACK_COMPUTE_VM_DEVICES_10002 = "ORG_ZSTACK_COMPUTE_VM_DEVICES_10002"; + + public static final String ORG_ZSTACK_COMPUTE_VM_DEVICES_10003 = "ORG_ZSTACK_COMPUTE_VM_DEVICES_10003"; + + public static final String ORG_ZSTACK_COMPUTE_VM_DEVICES_10004 = "ORG_ZSTACK_COMPUTE_VM_DEVICES_10004"; + + public static final String ORG_ZSTACK_COMPUTE_VM_DEVICES_10005 = "ORG_ZSTACK_COMPUTE_VM_DEVICES_10005"; + + public static final String ORG_ZSTACK_COMPUTE_VM_DEVICES_10006 = "ORG_ZSTACK_COMPUTE_VM_DEVICES_10006"; + + public static final String ORG_ZSTACK_COMPUTE_VM_DEVICES_10007 = "ORG_ZSTACK_COMPUTE_VM_DEVICES_10007"; + + public static final String ORG_ZSTACK_COMPUTE_VM_DEVICES_10008 = "ORG_ZSTACK_COMPUTE_VM_DEVICES_10008"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_FAULTTOLERANCE_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_FAULTTOLERANCE_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_FAULTTOLERANCE_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_FAULTTOLERANCE_10001"; + + public static final String ORG_ZSTACK_ALIYUN_DATACENTER_10000 = "ORG_ZSTACK_ALIYUN_DATACENTER_10000"; + + public static final String ORG_ZSTACK_ALIYUN_DATACENTER_10001 = "ORG_ZSTACK_ALIYUN_DATACENTER_10001"; + + public static final String ORG_ZSTACK_XINFINI_SDK_10000 = "ORG_ZSTACK_XINFINI_SDK_10000"; + + public static final String ORG_ZSTACK_XINFINI_SDK_10001 = "ORG_ZSTACK_XINFINI_SDK_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10002 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10003 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10004 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10005 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10005"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10006 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10006"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10007 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10007"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10008 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10008"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10009 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10009"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10010 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10010"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10011 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10011"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10012 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10012"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10013 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10013"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10014 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10014"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10015 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_VOLUME_10015"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_VYOS_10000 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_VYOS_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_VYOS_10001 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_VYOS_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_VYOS_10002 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_VYOS_10002"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_FILESYSTEM_10000 = "ORG_ZSTACK_STORAGE_PRIMARY_FILESYSTEM_10000"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_SNAPSHOT_10000 = "ORG_ZSTACK_ALIYUN_STORAGE_SNAPSHOT_10000"; + + public static final String ORG_ZSTACK_ALIYUN_STORAGE_SNAPSHOT_10001 = "ORG_ZSTACK_ALIYUN_STORAGE_SNAPSHOT_10001"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10000 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10000"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10001 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10001"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10002 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10002"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10003 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10003"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10004 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10004"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10005 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10005"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10006 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10006"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10007 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10007"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10008 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10008"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10009 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10009"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10010 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10010"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10011 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10011"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10012 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10012"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10013 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10013"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10014 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10014"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10015 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10015"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10016 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10016"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10017 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10017"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10018 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10018"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10019 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10019"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10020 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10020"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10021 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10021"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10022 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10022"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10023 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10023"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10024 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10024"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10025 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10025"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10026 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10026"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10027 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10027"; + + public static final String ORG_ZSTACK_COMPUTE_VMSCHEDULING_10028 = "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10028"; + + public static final String ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10000 = "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10000"; + + public static final String ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10001 = "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10001"; + + public static final String ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10002 = "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10002"; + + public static final String ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10003 = "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10003"; + + public static final String ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10004 = "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10004"; + + public static final String ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10005 = "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10005"; + + public static final String ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10006 = "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10006"; + + public static final String ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10007 = "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10007"; + + public static final String ORG_ZSTACK_APPCENTER_10000 = "ORG_ZSTACK_APPCENTER_10000"; + + public static final String ORG_ZSTACK_APPCENTER_10001 = "ORG_ZSTACK_APPCENTER_10001"; + + public static final String ORG_ZSTACK_APPCENTER_10002 = "ORG_ZSTACK_APPCENTER_10002"; + + public static final String ORG_ZSTACK_APPCENTER_10003 = "ORG_ZSTACK_APPCENTER_10003"; + + public static final String ORG_ZSTACK_APPCENTER_10004 = "ORG_ZSTACK_APPCENTER_10004"; + + public static final String ORG_ZSTACK_APPCENTER_10005 = "ORG_ZSTACK_APPCENTER_10005"; + + public static final String ORG_ZSTACK_APPCENTER_10006 = "ORG_ZSTACK_APPCENTER_10006"; + + public static final String ORG_ZSTACK_PRIVILEGE_ADMIN_10000 = "ORG_ZSTACK_PRIVILEGE_ADMIN_10000"; + + public static final String ORG_ZSTACK_PRIVILEGE_ADMIN_10001 = "ORG_ZSTACK_PRIVILEGE_ADMIN_10001"; + + public static final String ORG_ZSTACK_PRIVILEGE_ADMIN_10002 = "ORG_ZSTACK_PRIVILEGE_ADMIN_10002"; + + public static final String ORG_ZSTACK_PRIVILEGE_ADMIN_10003 = "ORG_ZSTACK_PRIVILEGE_ADMIN_10003"; + + public static final String ORG_ZSTACK_PRIVILEGE_ADMIN_10004 = "ORG_ZSTACK_PRIVILEGE_ADMIN_10004"; + + public static final String ORG_ZSTACK_PRIVILEGE_ADMIN_10005 = "ORG_ZSTACK_PRIVILEGE_ADMIN_10005"; + + public static final String ORG_ZSTACK_PRIVILEGE_ADMIN_10006 = "ORG_ZSTACK_PRIVILEGE_ADMIN_10006"; + + public static final String ORG_ZSTACK_PRIVILEGE_ADMIN_10007 = "ORG_ZSTACK_PRIVILEGE_ADMIN_10007"; + + public static final String ORG_ZSTACK_PRIVILEGE_ADMIN_10008 = "ORG_ZSTACK_PRIVILEGE_ADMIN_10008"; + + public static final String ORG_ZSTACK_PRIVILEGE_ADMIN_10009 = "ORG_ZSTACK_PRIVILEGE_ADMIN_10009"; + + public static final String ORG_ZSTACK_PRIVILEGE_ADMIN_10010 = "ORG_ZSTACK_PRIVILEGE_ADMIN_10010"; + + public static final String ORG_ZSTACK_PRIVILEGE_ADMIN_10011 = "ORG_ZSTACK_PRIVILEGE_ADMIN_10011"; + + public static final String ORG_ZSTACK_PRIVILEGE_ADMIN_10012 = "ORG_ZSTACK_PRIVILEGE_ADMIN_10012"; + + public static final String ORG_ZSTACK_PRIVILEGE_ADMIN_10013 = "ORG_ZSTACK_PRIVILEGE_ADMIN_10013"; + + public static final String ORG_ZSTACK_PRIVILEGE_ADMIN_10014 = "ORG_ZSTACK_PRIVILEGE_ADMIN_10014"; + + public static final String ORG_ZSTACK_PRIVILEGE_ADMIN_10015 = "ORG_ZSTACK_PRIVILEGE_ADMIN_10015"; + + public static final String ORG_ZSTACK_PRIVILEGE_ADMIN_10016 = "ORG_ZSTACK_PRIVILEGE_ADMIN_10016"; + + public static final String ORG_ZSTACK_EXTERNALBACKUP_ZBOX_KVM_10000 = "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_KVM_10000"; + + public static final String ORG_ZSTACK_EXTERNALBACKUP_ZBOX_KVM_10001 = "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_KVM_10001"; + + public static final String ORG_ZSTACK_ZOPS_10000 = "ORG_ZSTACK_ZOPS_10000"; + + public static final String ORG_ZSTACK_ZOPS_10001 = "ORG_ZSTACK_ZOPS_10001"; + + public static final String ORG_ZSTACK_ZOPS_10002 = "ORG_ZSTACK_ZOPS_10002"; + + public static final String ORG_ZSTACK_ZOPS_10003 = "ORG_ZSTACK_ZOPS_10003"; + + public static final String ORG_ZSTACK_ZOPS_10004 = "ORG_ZSTACK_ZOPS_10004"; + + public static final String ORG_ZSTACK_ZOPS_10005 = "ORG_ZSTACK_ZOPS_10005"; + + public static final String ORG_ZSTACK_ZOPS_10006 = "ORG_ZSTACK_ZOPS_10006"; + + public static final String ORG_ZSTACK_ZOPS_10007 = "ORG_ZSTACK_ZOPS_10007"; + + public static final String ORG_ZSTACK_ZOPS_10008 = "ORG_ZSTACK_ZOPS_10008"; + + public static final String ORG_ZSTACK_ZOPS_10009 = "ORG_ZSTACK_ZOPS_10009"; + + public static final String ORG_ZSTACK_ZOPS_10010 = "ORG_ZSTACK_ZOPS_10010"; + + public static final String ORG_ZSTACK_ZOPS_10011 = "ORG_ZSTACK_ZOPS_10011"; + + public static final String ORG_ZSTACK_ZOPS_10012 = "ORG_ZSTACK_ZOPS_10012"; + + public static final String ORG_ZSTACK_ZOPS_10013 = "ORG_ZSTACK_ZOPS_10013"; + + public static final String ORG_ZSTACK_ZOPS_10014 = "ORG_ZSTACK_ZOPS_10014"; + + public static final String ORG_ZSTACK_ZOPS_10015 = "ORG_ZSTACK_ZOPS_10015"; + + public static final String ORG_ZSTACK_ZOPS_10016 = "ORG_ZSTACK_ZOPS_10016"; + + public static final String ORG_ZSTACK_ZOPS_10017 = "ORG_ZSTACK_ZOPS_10017"; + + public static final String ORG_ZSTACK_ZOPS_10018 = "ORG_ZSTACK_ZOPS_10018"; + + public static final String ORG_ZSTACK_ZOPS_10019 = "ORG_ZSTACK_ZOPS_10019"; + + public static final String ORG_ZSTACK_ZOPS_10020 = "ORG_ZSTACK_ZOPS_10020"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10000 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10000"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10001 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10001"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10002 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10002"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10003 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10003"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10004 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10004"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10005 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10005"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10006 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10006"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10007 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10007"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10008 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10008"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10009 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10009"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10010 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10010"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10011 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10011"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10012 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10012"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10013 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10013"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10014 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10014"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10015 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10015"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10016 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10016"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10017 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10017"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10018 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10018"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10019 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10019"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10020 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10020"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10021 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10021"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10022 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10022"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10023 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10023"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10024 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10024"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10025 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10025"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10026 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10026"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10027 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10027"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10028 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10028"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10029 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10029"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10030 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10030"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10031 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10031"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10032 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10032"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10033 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10033"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10034 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10034"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10035 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10035"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10036 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10036"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10037 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10037"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10038 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10038"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10039 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10039"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10040 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10040"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10041 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10041"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10042 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10042"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10043 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10043"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10044 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10044"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10045 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10045"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10046 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10046"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10047 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10047"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10048 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10048"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10049 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10049"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10050 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10050"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10051 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10051"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10052 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10052"; + + public static final String ORG_ZSTACK_EXTERNALSERVICE_CRONJOB_10000 = "ORG_ZSTACK_EXTERNALSERVICE_CRONJOB_10000"; + + public static final String ORG_ZSTACK_EXTERNALSERVICE_CRONJOB_10001 = "ORG_ZSTACK_EXTERNALSERVICE_CRONJOB_10001"; + + public static final String ORG_ZSTACK_PROXY_10000 = "ORG_ZSTACK_PROXY_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LIFECYCLE_10000 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LIFECYCLE_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LIFECYCLE_10001 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LIFECYCLE_10001"; + + public static final String ORG_ZSTACK_TAG2_10000 = "ORG_ZSTACK_TAG2_10000"; + + public static final String ORG_ZSTACK_TAG2_10001 = "ORG_ZSTACK_TAG2_10001"; + + public static final String ORG_ZSTACK_TAG2_10002 = "ORG_ZSTACK_TAG2_10002"; + + public static final String ORG_ZSTACK_TAG2_10003 = "ORG_ZSTACK_TAG2_10003"; + + public static final String ORG_ZSTACK_TAG2_10004 = "ORG_ZSTACK_TAG2_10004"; + + public static final String ORG_ZSTACK_TAG2_10005 = "ORG_ZSTACK_TAG2_10005"; + + public static final String ORG_ZSTACK_TAG2_10006 = "ORG_ZSTACK_TAG2_10006"; + + public static final String ORG_ZSTACK_TAG2_10007 = "ORG_ZSTACK_TAG2_10007"; + + public static final String ORG_ZSTACK_TAG2_10008 = "ORG_ZSTACK_TAG2_10008"; + + public static final String ORG_ZSTACK_TAG2_10009 = "ORG_ZSTACK_TAG2_10009"; + + public static final String ORG_ZSTACK_TAG2_10010 = "ORG_ZSTACK_TAG2_10010"; + + public static final String ORG_ZSTACK_TAG2_10011 = "ORG_ZSTACK_TAG2_10011"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10000 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10000"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10001 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10001"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10002 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10002"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10003 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10003"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10004 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10004"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10005 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10005"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10006 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10006"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10007 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10007"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10008 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10008"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10009 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10009"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10010 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10010"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10011 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10011"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10012 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10012"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10013 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10013"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10014 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10014"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10015 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10015"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10016 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10016"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10017 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10017"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10018 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10018"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10019 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10019"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10020 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10020"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10021 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10021"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10022 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10022"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10023 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10023"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10024 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10024"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10025 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10025"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10026 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10026"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10027 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10027"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10028 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10028"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10029 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10029"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10030 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10030"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10031 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10031"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10032 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10032"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10033 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10033"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10034 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10034"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10035 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10035"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10036 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10036"; + + public static final String ORG_ZSTACK_COMPUTE_ALLOCATOR_10037 = "ORG_ZSTACK_COMPUTE_ALLOCATOR_10037"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10000 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10000"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10001 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10001"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10002 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10002"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10003 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10003"; + + public static final String ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10004 = "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10004"; + + public static final String ORG_ZSTACK_VPC_HA_10000 = "ORG_ZSTACK_VPC_HA_10000"; + + public static final String ORG_ZSTACK_VPC_HA_10001 = "ORG_ZSTACK_VPC_HA_10001"; + + public static final String ORG_ZSTACK_VPC_HA_10002 = "ORG_ZSTACK_VPC_HA_10002"; + + public static final String ORG_ZSTACK_VPC_HA_10003 = "ORG_ZSTACK_VPC_HA_10003"; + + public static final String ORG_ZSTACK_VPC_HA_10004 = "ORG_ZSTACK_VPC_HA_10004"; + + public static final String ORG_ZSTACK_VPC_HA_10005 = "ORG_ZSTACK_VPC_HA_10005"; + + public static final String ORG_ZSTACK_VPC_HA_10006 = "ORG_ZSTACK_VPC_HA_10006"; + + public static final String ORG_ZSTACK_VPC_HA_10007 = "ORG_ZSTACK_VPC_HA_10007"; + + public static final String ORG_ZSTACK_VPC_HA_10008 = "ORG_ZSTACK_VPC_HA_10008"; + + public static final String ORG_ZSTACK_VPC_HA_10009 = "ORG_ZSTACK_VPC_HA_10009"; + + public static final String ORG_ZSTACK_VPC_HA_10010 = "ORG_ZSTACK_VPC_HA_10010"; + + public static final String ORG_ZSTACK_VPC_HA_10011 = "ORG_ZSTACK_VPC_HA_10011"; + + public static final String ORG_ZSTACK_VPC_HA_10012 = "ORG_ZSTACK_VPC_HA_10012"; + + public static final String ORG_ZSTACK_VPC_HA_10013 = "ORG_ZSTACK_VPC_HA_10013"; + + public static final String ORG_ZSTACK_VPC_HA_10014 = "ORG_ZSTACK_VPC_HA_10014"; + + public static final String ORG_ZSTACK_VPC_HA_10015 = "ORG_ZSTACK_VPC_HA_10015"; + + public static final String ORG_ZSTACK_VPC_HA_10016 = "ORG_ZSTACK_VPC_HA_10016"; + + public static final String ORG_ZSTACK_VPC_HA_10017 = "ORG_ZSTACK_VPC_HA_10017"; + + public static final String ORG_ZSTACK_VPC_HA_10018 = "ORG_ZSTACK_VPC_HA_10018"; + + public static final String ORG_ZSTACK_VPC_HA_10019 = "ORG_ZSTACK_VPC_HA_10019"; + + public static final String ORG_ZSTACK_VPC_HA_10020 = "ORG_ZSTACK_VPC_HA_10020"; + + public static final String ORG_ZSTACK_SSO_CAS_FILTER_10000 = "ORG_ZSTACK_SSO_CAS_FILTER_10000"; + + public static final String ORG_ZSTACK_SSO_CAS_FILTER_10001 = "ORG_ZSTACK_SSO_CAS_FILTER_10001"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10000 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10000"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10001 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10001"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10002 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10002"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10003 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10003"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10004 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10004"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10005 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10005"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10006 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10006"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10007 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10007"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10008 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10008"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10009 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10009"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10010 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10010"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10011 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10011"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10012 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10012"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10013 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10013"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10014 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10014"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10015 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10015"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10016 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10016"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10017 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10017"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10018 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10018"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10019 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10019"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10020 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10020"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10021 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10021"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10022 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10022"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10023 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10023"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10024 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10024"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10025 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10025"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10026 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10026"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10027 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10027"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10028 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10028"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10029 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10029"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10030 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10030"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10031 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10031"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10032 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10032"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10033 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10033"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10034 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10034"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10035 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10035"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10036 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10036"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10037 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10037"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10038 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10038"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10039 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10039"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10040 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10040"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10041 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10041"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10042 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10042"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10043 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10043"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10044 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10044"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10045 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10045"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10046 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10046"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10047 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10047"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10048 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10048"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10049 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10049"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10050 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10050"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10051 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10051"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10052 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10052"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10053 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10053"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10054 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10054"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10055 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10055"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10056 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10056"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10057 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10057"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10058 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10058"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10059 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10059"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10060 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10060"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10061 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10061"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10062 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10062"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10063 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10063"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10064 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10064"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10065 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10065"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10066 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10066"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10067 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10067"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10068 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10068"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10069 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10069"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10070 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10070"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10071 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10071"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10072 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10072"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10073 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10073"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10074 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10074"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10075 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10075"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10076 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10076"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10077 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10077"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10078 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10078"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10079 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10079"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10080 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10080"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10081 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10081"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10082 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10082"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10083 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10083"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10084 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10084"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10085 = "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10085"; + + public static final String ORG_ZSTACK_CORE_THREAD_10000 = "ORG_ZSTACK_CORE_THREAD_10000"; + + public static final String ORG_ZSTACK_CORE_THREAD_10001 = "ORG_ZSTACK_CORE_THREAD_10001"; + + public static final String ORG_ZSTACK_CORE_THREAD_10002 = "ORG_ZSTACK_CORE_THREAD_10002"; + + public static final String ORG_ZSTACK_POLICYROUTE_10000 = "ORG_ZSTACK_POLICYROUTE_10000"; + + public static final String ORG_ZSTACK_POLICYROUTE_10001 = "ORG_ZSTACK_POLICYROUTE_10001"; + + public static final String ORG_ZSTACK_POLICYROUTE_10002 = "ORG_ZSTACK_POLICYROUTE_10002"; + + public static final String ORG_ZSTACK_POLICYROUTE_10003 = "ORG_ZSTACK_POLICYROUTE_10003"; + + public static final String ORG_ZSTACK_POLICYROUTE_10004 = "ORG_ZSTACK_POLICYROUTE_10004"; + + public static final String ORG_ZSTACK_POLICYROUTE_10005 = "ORG_ZSTACK_POLICYROUTE_10005"; + + public static final String ORG_ZSTACK_POLICYROUTE_10006 = "ORG_ZSTACK_POLICYROUTE_10006"; + + public static final String ORG_ZSTACK_POLICYROUTE_10007 = "ORG_ZSTACK_POLICYROUTE_10007"; + + public static final String ORG_ZSTACK_POLICYROUTE_10008 = "ORG_ZSTACK_POLICYROUTE_10008"; + + public static final String ORG_ZSTACK_POLICYROUTE_10009 = "ORG_ZSTACK_POLICYROUTE_10009"; + + public static final String ORG_ZSTACK_POLICYROUTE_10010 = "ORG_ZSTACK_POLICYROUTE_10010"; + + public static final String ORG_ZSTACK_POLICYROUTE_10011 = "ORG_ZSTACK_POLICYROUTE_10011"; + + public static final String ORG_ZSTACK_POLICYROUTE_10012 = "ORG_ZSTACK_POLICYROUTE_10012"; + + public static final String ORG_ZSTACK_POLICYROUTE_10013 = "ORG_ZSTACK_POLICYROUTE_10013"; + + public static final String ORG_ZSTACK_POLICYROUTE_10014 = "ORG_ZSTACK_POLICYROUTE_10014"; + + public static final String ORG_ZSTACK_POLICYROUTE_10015 = "ORG_ZSTACK_POLICYROUTE_10015"; + + public static final String ORG_ZSTACK_POLICYROUTE_10016 = "ORG_ZSTACK_POLICYROUTE_10016"; + + public static final String ORG_ZSTACK_POLICYROUTE_10017 = "ORG_ZSTACK_POLICYROUTE_10017"; + + public static final String ORG_ZSTACK_POLICYROUTE_10018 = "ORG_ZSTACK_POLICYROUTE_10018"; + + public static final String ORG_ZSTACK_POLICYROUTE_10019 = "ORG_ZSTACK_POLICYROUTE_10019"; + + public static final String ORG_ZSTACK_POLICYROUTE_10020 = "ORG_ZSTACK_POLICYROUTE_10020"; + + public static final String ORG_ZSTACK_POLICYROUTE_10021 = "ORG_ZSTACK_POLICYROUTE_10021"; + + public static final String ORG_ZSTACK_POLICYROUTE_10022 = "ORG_ZSTACK_POLICYROUTE_10022"; + + public static final String ORG_ZSTACK_POLICYROUTE_10023 = "ORG_ZSTACK_POLICYROUTE_10023"; + + public static final String ORG_ZSTACK_POLICYROUTE_10024 = "ORG_ZSTACK_POLICYROUTE_10024"; + + public static final String ORG_ZSTACK_POLICYROUTE_10025 = "ORG_ZSTACK_POLICYROUTE_10025"; + + public static final String ORG_ZSTACK_POLICYROUTE_10026 = "ORG_ZSTACK_POLICYROUTE_10026"; + + public static final String ORG_ZSTACK_POLICYROUTE_10027 = "ORG_ZSTACK_POLICYROUTE_10027"; + + public static final String ORG_ZSTACK_POLICYROUTE_10028 = "ORG_ZSTACK_POLICYROUTE_10028"; + + public static final String ORG_ZSTACK_POLICYROUTE_10029 = "ORG_ZSTACK_POLICYROUTE_10029"; + + public static final String ORG_ZSTACK_POLICYROUTE_10030 = "ORG_ZSTACK_POLICYROUTE_10030"; + + public static final String ORG_ZSTACK_POLICYROUTE_10031 = "ORG_ZSTACK_POLICYROUTE_10031"; + + public static final String ORG_ZSTACK_POLICYROUTE_10032 = "ORG_ZSTACK_POLICYROUTE_10032"; + + public static final String ORG_ZSTACK_POLICYROUTE_10033 = "ORG_ZSTACK_POLICYROUTE_10033"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10000 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10001 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10002 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10003 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10003"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10004 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10004"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10005 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10005"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10006 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10006"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10007 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10007"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10008 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10008"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10009 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10009"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10010 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10010"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10011 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10011"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10012 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10012"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10013 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10013"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10014 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10014"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10015 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10015"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10016 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10016"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10017 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10017"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10018 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10018"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10019 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10019"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10020 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10020"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10021 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10021"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10022 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10022"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10023 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10023"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10024 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10024"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10025 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10025"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10026 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10026"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10027 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10027"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10028 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10028"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10029 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10029"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10030 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10030"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10031 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10031"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10032 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10032"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10033 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10033"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10034 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10034"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10035 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10035"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10036 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10036"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10037 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10037"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10038 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10038"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10039 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10039"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10040 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10040"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10041 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10041"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10042 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10042"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10043 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10043"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10044 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10044"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10045 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10045"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10046 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10046"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10047 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10047"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10048 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10048"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10049 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10049"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10050 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10050"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10051 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10051"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10052 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10052"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10053 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10053"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10054 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10054"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10055 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10055"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10056 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10056"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10057 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10057"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10058 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10058"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10059 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10059"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10060 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10060"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10061 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10061"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10062 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10062"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10063 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10063"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10064 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10064"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10065 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10065"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10066 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10066"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10067 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10067"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10068 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10068"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10069 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10069"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10070 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10070"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10071 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10071"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10072 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10072"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10073 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10073"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10074 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10074"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10075 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10075"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10076 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10076"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10077 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10077"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10078 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10078"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10079 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10079"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10080 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10080"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10081 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10081"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10082 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10082"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10083 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10083"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10084 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10084"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10085 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10085"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10086 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10086"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10087 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10087"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10088 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10088"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10089 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10089"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10090 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10090"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10091 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10091"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10092 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10092"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10093 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10093"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10094 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10094"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10095 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10095"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10096 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10096"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10097 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10097"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10098 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10098"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10099 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10099"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10100 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10100"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10101 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10101"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10102 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10102"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10103 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10103"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10104 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10104"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10105 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10105"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10106 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10106"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10107 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10107"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10108 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10108"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10109 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10109"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10110 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10110"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10111 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10111"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10112 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10112"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10113 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10113"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10114 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10114"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10115 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10115"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10116 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10116"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10117 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10117"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10118 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10118"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10119 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10119"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10120 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10120"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10121 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10121"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10122 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10122"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10123 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10123"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10124 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10124"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10125 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10125"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10126 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10126"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10127 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10127"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10128 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10128"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10129 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10129"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10130 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10130"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10131 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10131"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10132 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10132"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10133 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10133"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10134 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10134"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10135 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10135"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10136 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10136"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10137 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10137"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10138 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10138"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10139 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10139"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10140 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10140"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10141 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10141"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10142 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10142"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10143 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10143"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10144 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10144"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10145 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10145"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10146 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10146"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10147 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10147"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10148 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10148"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10149 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10149"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10150 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10150"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10151 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10151"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10152 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10152"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10153 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10153"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10154 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10154"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10155 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10155"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10156 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10156"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10157 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10157"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10158 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10158"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10159 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10159"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10160 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10160"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10161 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10161"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10162 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10162"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10163 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10163"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10164 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10164"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10165 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10165"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10166 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10166"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10167 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10167"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10168 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10168"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10169 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10169"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10170 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10170"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_LB_10171 = "ORG_ZSTACK_NETWORK_SERVICE_LB_10171"; + + public static final String ORG_ZSTACK_IPSEC_10000 = "ORG_ZSTACK_IPSEC_10000"; + + public static final String ORG_ZSTACK_IPSEC_10001 = "ORG_ZSTACK_IPSEC_10001"; + + public static final String ORG_ZSTACK_IPSEC_10002 = "ORG_ZSTACK_IPSEC_10002"; + + public static final String ORG_ZSTACK_IPSEC_10003 = "ORG_ZSTACK_IPSEC_10003"; + + public static final String ORG_ZSTACK_IPSEC_10004 = "ORG_ZSTACK_IPSEC_10004"; + + public static final String ORG_ZSTACK_IPSEC_10005 = "ORG_ZSTACK_IPSEC_10005"; + + public static final String ORG_ZSTACK_IPSEC_10006 = "ORG_ZSTACK_IPSEC_10006"; + + public static final String ORG_ZSTACK_IPSEC_10007 = "ORG_ZSTACK_IPSEC_10007"; + + public static final String ORG_ZSTACK_IPSEC_10008 = "ORG_ZSTACK_IPSEC_10008"; + + public static final String ORG_ZSTACK_IPSEC_10009 = "ORG_ZSTACK_IPSEC_10009"; + + public static final String ORG_ZSTACK_IPSEC_10010 = "ORG_ZSTACK_IPSEC_10010"; + + public static final String ORG_ZSTACK_IPSEC_10011 = "ORG_ZSTACK_IPSEC_10011"; + + public static final String ORG_ZSTACK_IPSEC_10012 = "ORG_ZSTACK_IPSEC_10012"; + + public static final String ORG_ZSTACK_IPSEC_10013 = "ORG_ZSTACK_IPSEC_10013"; + + public static final String ORG_ZSTACK_IPSEC_10014 = "ORG_ZSTACK_IPSEC_10014"; + + public static final String ORG_ZSTACK_IPSEC_10015 = "ORG_ZSTACK_IPSEC_10015"; + + public static final String ORG_ZSTACK_IPSEC_10016 = "ORG_ZSTACK_IPSEC_10016"; + + public static final String ORG_ZSTACK_IPSEC_10017 = "ORG_ZSTACK_IPSEC_10017"; + + public static final String ORG_ZSTACK_IPSEC_10018 = "ORG_ZSTACK_IPSEC_10018"; + + public static final String ORG_ZSTACK_IPSEC_10019 = "ORG_ZSTACK_IPSEC_10019"; + + public static final String ORG_ZSTACK_IPSEC_10020 = "ORG_ZSTACK_IPSEC_10020"; + + public static final String ORG_ZSTACK_IPSEC_10021 = "ORG_ZSTACK_IPSEC_10021"; + + public static final String ORG_ZSTACK_IPSEC_10022 = "ORG_ZSTACK_IPSEC_10022"; + + public static final String ORG_ZSTACK_IPSEC_10023 = "ORG_ZSTACK_IPSEC_10023"; + + public static final String ORG_ZSTACK_IPSEC_10024 = "ORG_ZSTACK_IPSEC_10024"; + + public static final String ORG_ZSTACK_IPSEC_10025 = "ORG_ZSTACK_IPSEC_10025"; + + public static final String ORG_ZSTACK_IPSEC_10026 = "ORG_ZSTACK_IPSEC_10026"; + + public static final String ORG_ZSTACK_IPSEC_10027 = "ORG_ZSTACK_IPSEC_10027"; + + public static final String ORG_ZSTACK_IPSEC_10028 = "ORG_ZSTACK_IPSEC_10028"; + + public static final String ORG_ZSTACK_IPSEC_10029 = "ORG_ZSTACK_IPSEC_10029"; + + public static final String ORG_ZSTACK_IPSEC_10030 = "ORG_ZSTACK_IPSEC_10030"; + + public static final String ORG_ZSTACK_IPSEC_10031 = "ORG_ZSTACK_IPSEC_10031"; + + public static final String ORG_ZSTACK_IPSEC_10032 = "ORG_ZSTACK_IPSEC_10032"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10000 = "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10000"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10001 = "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10001"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10002 = "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10002"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10003 = "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10003"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10000 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10000"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10001 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10001"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10000 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10000"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10001 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10001"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10002 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10002"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10003 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10003"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10004 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10004"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10005 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10005"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10006 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10006"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10007 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10007"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10008 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10008"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10009 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10009"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10010 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10010"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10011 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10011"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10012 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10012"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10013 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10013"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10014 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10014"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10015 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10015"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10016 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10016"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10017 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10017"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10018 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10018"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10019 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10019"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10020 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10020"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10021 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10021"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10022 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10022"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10023 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10023"; + + public static final String ORG_ZSTACK_BAREMETAL2_CLUSTER_10000 = "ORG_ZSTACK_BAREMETAL2_CLUSTER_10000"; + + public static final String ORG_ZSTACK_BAREMETAL2_CLUSTER_10001 = "ORG_ZSTACK_BAREMETAL2_CLUSTER_10001"; + + public static final String ORG_ZSTACK_BAREMETAL2_CLUSTER_10002 = "ORG_ZSTACK_BAREMETAL2_CLUSTER_10002"; + + public static final String ORG_ZSTACK_BAREMETAL2_CLUSTER_10003 = "ORG_ZSTACK_BAREMETAL2_CLUSTER_10003"; + + public static final String ORG_ZSTACK_BAREMETAL2_CLUSTER_10004 = "ORG_ZSTACK_BAREMETAL2_CLUSTER_10004"; + + public static final String ORG_ZSTACK_BAREMETAL2_CLUSTER_10005 = "ORG_ZSTACK_BAREMETAL2_CLUSTER_10005"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10000 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10001 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10002 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10003 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10003"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10004 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10004"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10005 = "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10005"; + + public static final String ORG_ZSTACK_MULTICAST_ROUTER_10000 = "ORG_ZSTACK_MULTICAST_ROUTER_10000"; + + public static final String ORG_ZSTACK_MULTICAST_ROUTER_10001 = "ORG_ZSTACK_MULTICAST_ROUTER_10001"; + + public static final String ORG_ZSTACK_MULTICAST_ROUTER_10002 = "ORG_ZSTACK_MULTICAST_ROUTER_10002"; + + public static final String ORG_ZSTACK_MULTICAST_ROUTER_10003 = "ORG_ZSTACK_MULTICAST_ROUTER_10003"; + + public static final String ORG_ZSTACK_MULTICAST_ROUTER_10004 = "ORG_ZSTACK_MULTICAST_ROUTER_10004"; + + public static final String ORG_ZSTACK_MULTICAST_ROUTER_10005 = "ORG_ZSTACK_MULTICAST_ROUTER_10005"; + + public static final String ORG_ZSTACK_MULTICAST_ROUTER_10006 = "ORG_ZSTACK_MULTICAST_ROUTER_10006"; + + public static final String ORG_ZSTACK_MULTICAST_ROUTER_10007 = "ORG_ZSTACK_MULTICAST_ROUTER_10007"; + + public static final String ORG_ZSTACK_MULTICAST_ROUTER_10008 = "ORG_ZSTACK_MULTICAST_ROUTER_10008"; + + public static final String ORG_ZSTACK_MULTICAST_ROUTER_10009 = "ORG_ZSTACK_MULTICAST_ROUTER_10009"; + + public static final String ORG_ZSTACK_TESTLIB_PREMIUM_LICENSE_10000 = "ORG_ZSTACK_TESTLIB_PREMIUM_LICENSE_10000"; + + public static final String ORG_ZSTACK_TESTLIB_PREMIUM_LICENSE_10001 = "ORG_ZSTACK_TESTLIB_PREMIUM_LICENSE_10001"; + + public static final String ORG_ZSTACK_TESTLIB_PREMIUM_LICENSE_10002 = "ORG_ZSTACK_TESTLIB_PREMIUM_LICENSE_10002"; + + public static final String ORG_ZSTACK_TESTLIB_PREMIUM_LICENSE_10003 = "ORG_ZSTACK_TESTLIB_PREMIUM_LICENSE_10003"; + + public static final String ORG_ZSTACK_DAHO_CORE_10000 = "ORG_ZSTACK_DAHO_CORE_10000"; + + public static final String ORG_ZSTACK_DAHO_CORE_10001 = "ORG_ZSTACK_DAHO_CORE_10001"; + + public static final String ORG_ZSTACK_DAHO_CORE_10002 = "ORG_ZSTACK_DAHO_CORE_10002"; + + public static final String ORG_ZSTACK_DAHO_CORE_10003 = "ORG_ZSTACK_DAHO_CORE_10003"; + + public static final String ORG_ZSTACK_DAHO_CORE_10004 = "ORG_ZSTACK_DAHO_CORE_10004"; + + public static final String ORG_ZSTACK_DAHO_CORE_10005 = "ORG_ZSTACK_DAHO_CORE_10005"; + + public static final String ORG_ZSTACK_DAHO_CORE_10006 = "ORG_ZSTACK_DAHO_CORE_10006"; + + public static final String ORG_ZSTACK_DAHO_CORE_10007 = "ORG_ZSTACK_DAHO_CORE_10007"; + + public static final String ORG_ZSTACK_DAHO_CORE_10008 = "ORG_ZSTACK_DAHO_CORE_10008"; + + public static final String ORG_ZSTACK_DAHO_CORE_10009 = "ORG_ZSTACK_DAHO_CORE_10009"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_HA_10000 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_HA_10000"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10000 = "ORG_ZSTACK_STORAGE_CEPH_10000"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10001 = "ORG_ZSTACK_STORAGE_CEPH_10001"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10002 = "ORG_ZSTACK_STORAGE_CEPH_10002"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10003 = "ORG_ZSTACK_STORAGE_CEPH_10003"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10004 = "ORG_ZSTACK_STORAGE_CEPH_10004"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10005 = "ORG_ZSTACK_STORAGE_CEPH_10005"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10006 = "ORG_ZSTACK_STORAGE_CEPH_10006"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10007 = "ORG_ZSTACK_STORAGE_CEPH_10007"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10008 = "ORG_ZSTACK_STORAGE_CEPH_10008"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10009 = "ORG_ZSTACK_STORAGE_CEPH_10009"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10010 = "ORG_ZSTACK_STORAGE_CEPH_10010"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10011 = "ORG_ZSTACK_STORAGE_CEPH_10011"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10012 = "ORG_ZSTACK_STORAGE_CEPH_10012"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10013 = "ORG_ZSTACK_STORAGE_CEPH_10013"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10014 = "ORG_ZSTACK_STORAGE_CEPH_10014"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10015 = "ORG_ZSTACK_STORAGE_CEPH_10015"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10016 = "ORG_ZSTACK_STORAGE_CEPH_10016"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10017 = "ORG_ZSTACK_STORAGE_CEPH_10017"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10018 = "ORG_ZSTACK_STORAGE_CEPH_10018"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10019 = "ORG_ZSTACK_STORAGE_CEPH_10019"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10020 = "ORG_ZSTACK_STORAGE_CEPH_10020"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10021 = "ORG_ZSTACK_STORAGE_CEPH_10021"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10022 = "ORG_ZSTACK_STORAGE_CEPH_10022"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10023 = "ORG_ZSTACK_STORAGE_CEPH_10023"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10024 = "ORG_ZSTACK_STORAGE_CEPH_10024"; + + public static final String ORG_ZSTACK_STORAGE_CEPH_10025 = "ORG_ZSTACK_STORAGE_CEPH_10025"; + + public static final String ORG_ZSTACK_HYBRID_DATACENTER_10000 = "ORG_ZSTACK_HYBRID_DATACENTER_10000"; + + public static final String ORG_ZSTACK_HYBRID_DATACENTER_10001 = "ORG_ZSTACK_HYBRID_DATACENTER_10001"; + + public static final String ORG_ZSTACK_HYBRID_DATACENTER_10002 = "ORG_ZSTACK_HYBRID_DATACENTER_10002"; + + public static final String ORG_ZSTACK_HYBRID_DATACENTER_10003 = "ORG_ZSTACK_HYBRID_DATACENTER_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_KVM_VM_AFFINITYGROUP_AFFINITYGROUPHARD_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_KVM_VM_AFFINITYGROUP_AFFINITYGROUPHARD_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_KVM_VM_AFFINITYGROUP_AFFINITYGROUPHARD_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_KVM_VM_AFFINITYGROUP_AFFINITYGROUPHARD_10001"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10000 = "ORG_ZSTACK_ALIYUN_NETWORK_10000"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10001 = "ORG_ZSTACK_ALIYUN_NETWORK_10001"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10002 = "ORG_ZSTACK_ALIYUN_NETWORK_10002"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10003 = "ORG_ZSTACK_ALIYUN_NETWORK_10003"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10004 = "ORG_ZSTACK_ALIYUN_NETWORK_10004"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10005 = "ORG_ZSTACK_ALIYUN_NETWORK_10005"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10006 = "ORG_ZSTACK_ALIYUN_NETWORK_10006"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10007 = "ORG_ZSTACK_ALIYUN_NETWORK_10007"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10008 = "ORG_ZSTACK_ALIYUN_NETWORK_10008"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10009 = "ORG_ZSTACK_ALIYUN_NETWORK_10009"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10010 = "ORG_ZSTACK_ALIYUN_NETWORK_10010"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10011 = "ORG_ZSTACK_ALIYUN_NETWORK_10011"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10012 = "ORG_ZSTACK_ALIYUN_NETWORK_10012"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10013 = "ORG_ZSTACK_ALIYUN_NETWORK_10013"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10014 = "ORG_ZSTACK_ALIYUN_NETWORK_10014"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10015 = "ORG_ZSTACK_ALIYUN_NETWORK_10015"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10016 = "ORG_ZSTACK_ALIYUN_NETWORK_10016"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10017 = "ORG_ZSTACK_ALIYUN_NETWORK_10017"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10018 = "ORG_ZSTACK_ALIYUN_NETWORK_10018"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10019 = "ORG_ZSTACK_ALIYUN_NETWORK_10019"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10020 = "ORG_ZSTACK_ALIYUN_NETWORK_10020"; + + public static final String ORG_ZSTACK_ALIYUN_NETWORK_10021 = "ORG_ZSTACK_ALIYUN_NETWORK_10021"; + + public static final String ORG_ZSTACK_ZBOX_HOST_10000 = "ORG_ZSTACK_ZBOX_HOST_10000"; + + public static final String ORG_ZSTACK_ZBOX_HOST_10001 = "ORG_ZSTACK_ZBOX_HOST_10001"; + + public static final String ORG_ZSTACK_ZBOX_HOST_10002 = "ORG_ZSTACK_ZBOX_HOST_10002"; + + public static final String ORG_ZSTACK_ZBOX_HOST_10003 = "ORG_ZSTACK_ZBOX_HOST_10003"; + + public static final String ORG_ZSTACK_ZBOX_HOST_10004 = "ORG_ZSTACK_ZBOX_HOST_10004"; + + public static final String ORG_ZSTACK_SIMULATOR_STORAGE_PRIMARY_10000 = "ORG_ZSTACK_SIMULATOR_STORAGE_PRIMARY_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL_10000 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL_10001 = "ORG_ZSTACK_TEST_INTEGRATION_BAREMETAL_10001"; + + public static final String ORG_ZSTACK_BAREMETAL2_IMAGE_10000 = "ORG_ZSTACK_BAREMETAL2_IMAGE_10000"; + + public static final String ORG_ZSTACK_BAREMETAL2_IMAGE_10001 = "ORG_ZSTACK_BAREMETAL2_IMAGE_10001"; + + public static final String ORG_ZSTACK_BAREMETAL2_IMAGE_10002 = "ORG_ZSTACK_BAREMETAL2_IMAGE_10002"; + + public static final String ORG_ZSTACK_BAREMETAL2_IMAGE_10003 = "ORG_ZSTACK_BAREMETAL2_IMAGE_10003"; + + public static final String ORG_ZSTACK_BAREMETAL2_IMAGE_10004 = "ORG_ZSTACK_BAREMETAL2_IMAGE_10004"; + + public static final String ORG_ZSTACK_BAREMETAL_NETWORK_10000 = "ORG_ZSTACK_BAREMETAL_NETWORK_10000"; + + public static final String ORG_ZSTACK_BAREMETAL_NETWORK_10001 = "ORG_ZSTACK_BAREMETAL_NETWORK_10001"; + + public static final String ORG_ZSTACK_BAREMETAL_NETWORK_10002 = "ORG_ZSTACK_BAREMETAL_NETWORK_10002"; + + public static final String ORG_ZSTACK_BAREMETAL_NETWORK_10003 = "ORG_ZSTACK_BAREMETAL_NETWORK_10003"; + + public static final String ORG_ZSTACK_BAREMETAL_NETWORK_10004 = "ORG_ZSTACK_BAREMETAL_NETWORK_10004"; + + public static final String ORG_ZSTACK_SIMULATOR_10000 = "ORG_ZSTACK_SIMULATOR_10000"; + + public static final String ORG_ZSTACK_SIMULATOR_10001 = "ORG_ZSTACK_SIMULATOR_10001"; + + public static final String ORG_ZSTACK_SIMULATOR_10002 = "ORG_ZSTACK_SIMULATOR_10002"; + + public static final String ORG_ZSTACK_SIMULATOR_10003 = "ORG_ZSTACK_SIMULATOR_10003"; + + public static final String ORG_ZSTACK_SIMULATOR_10004 = "ORG_ZSTACK_SIMULATOR_10004"; + + public static final String ORG_ZSTACK_ZWATCH_FUNCTION_10000 = "ORG_ZSTACK_ZWATCH_FUNCTION_10000"; + + public static final String ORG_ZSTACK_ZWATCH_FUNCTION_10001 = "ORG_ZSTACK_ZWATCH_FUNCTION_10001"; + + public static final String ORG_ZSTACK_ZWATCH_FUNCTION_10002 = "ORG_ZSTACK_ZWATCH_FUNCTION_10002"; + + public static final String ORG_ZSTACK_ZWATCH_FUNCTION_10003 = "ORG_ZSTACK_ZWATCH_FUNCTION_10003"; + + public static final String ORG_ZSTACK_ZWATCH_FUNCTION_10004 = "ORG_ZSTACK_ZWATCH_FUNCTION_10004"; + + public static final String ORG_ZSTACK_ZWATCH_FUNCTION_10005 = "ORG_ZSTACK_ZWATCH_FUNCTION_10005"; + + public static final String ORG_ZSTACK_ZWATCH_FUNCTION_10006 = "ORG_ZSTACK_ZWATCH_FUNCTION_10006"; + + public static final String ORG_ZSTACK_ZWATCH_FUNCTION_10007 = "ORG_ZSTACK_ZWATCH_FUNCTION_10007"; + + public static final String ORG_ZSTACK_ZWATCH_FUNCTION_10008 = "ORG_ZSTACK_ZWATCH_FUNCTION_10008"; + + public static final String ORG_ZSTACK_ZWATCH_FUNCTION_10009 = "ORG_ZSTACK_ZWATCH_FUNCTION_10009"; + + public static final String ORG_ZSTACK_ZWATCH_FUNCTION_10010 = "ORG_ZSTACK_ZWATCH_FUNCTION_10010"; + + public static final String ORG_ZSTACK_ZWATCH_FUNCTION_10011 = "ORG_ZSTACK_ZWATCH_FUNCTION_10011"; + + public static final String ORG_ZSTACK_ZWATCH_FUNCTION_10012 = "ORG_ZSTACK_ZWATCH_FUNCTION_10012"; + + public static final String ORG_ZSTACK_ZWATCH_FUNCTION_10013 = "ORG_ZSTACK_ZWATCH_FUNCTION_10013"; + + public static final String ORG_ZSTACK_ZWATCH_FUNCTION_10014 = "ORG_ZSTACK_ZWATCH_FUNCTION_10014"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10000 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10000"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10001 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10001"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10002 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10002"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10003 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10003"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10004 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10004"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10005 = "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10005"; + + public static final String ORG_ZSTACK_ALIYUN_ACCOUNT_10000 = "ORG_ZSTACK_ALIYUN_ACCOUNT_10000"; + + public static final String ORG_ZSTACK_ALIYUN_ACCOUNT_10001 = "ORG_ZSTACK_ALIYUN_ACCOUNT_10001"; + + public static final String ORG_ZSTACK_ALIYUN_ACCOUNT_10002 = "ORG_ZSTACK_ALIYUN_ACCOUNT_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIP_10000 = "ORG_ZSTACK_NETWORK_SERVICE_VIP_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIP_10001 = "ORG_ZSTACK_NETWORK_SERVICE_VIP_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIP_10002 = "ORG_ZSTACK_NETWORK_SERVICE_VIP_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIP_10003 = "ORG_ZSTACK_NETWORK_SERVICE_VIP_10003"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIP_10004 = "ORG_ZSTACK_NETWORK_SERVICE_VIP_10004"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIP_10005 = "ORG_ZSTACK_NETWORK_SERVICE_VIP_10005"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIP_10006 = "ORG_ZSTACK_NETWORK_SERVICE_VIP_10006"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIP_10007 = "ORG_ZSTACK_NETWORK_SERVICE_VIP_10007"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIP_10008 = "ORG_ZSTACK_NETWORK_SERVICE_VIP_10008"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIP_10009 = "ORG_ZSTACK_NETWORK_SERVICE_VIP_10009"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIP_10010 = "ORG_ZSTACK_NETWORK_SERVICE_VIP_10010"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIP_10011 = "ORG_ZSTACK_NETWORK_SERVICE_VIP_10011"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIP_10012 = "ORG_ZSTACK_NETWORK_SERVICE_VIP_10012"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIP_10013 = "ORG_ZSTACK_NETWORK_SERVICE_VIP_10013"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIP_10014 = "ORG_ZSTACK_NETWORK_SERVICE_VIP_10014"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIP_10015 = "ORG_ZSTACK_NETWORK_SERVICE_VIP_10015"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_AUTOSCALING_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_AUTOSCALING_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_AUTOSCALING_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_AUTOSCALING_10001"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10000 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10000"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10001 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10001"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10002 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10002"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10003 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10003"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10004 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10004"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10005 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10005"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10006 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10006"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10007 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10007"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10008 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10008"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10009 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10009"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10010 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10010"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10011 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10011"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10012 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10012"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10013 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10013"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10014 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10014"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10015 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10015"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10016 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10016"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10017 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10017"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10018 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10018"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10019 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10019"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10020 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10020"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10021 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10021"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10022 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10022"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10023 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10023"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10024 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10024"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10025 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10025"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10026 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10026"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10027 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10027"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10028 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10028"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10029 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10029"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10030 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10030"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10031 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10031"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10032 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10032"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10033 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10033"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10034 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10034"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10035 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10035"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10036 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10036"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10037 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10037"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10038 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10038"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10039 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10039"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10040 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10040"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10041 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10041"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10042 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10042"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10043 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10043"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10044 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10044"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10045 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10045"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10046 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10046"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10047 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10047"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10048 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10048"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10049 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10049"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10050 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10050"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10051 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10051"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10052 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10052"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10053 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10053"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10054 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10054"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10055 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10055"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10056 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10056"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10057 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10057"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10058 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10058"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10059 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10059"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10060 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10060"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10061 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10061"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10062 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10062"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10063 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10063"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10064 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10064"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10065 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10065"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10066 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10066"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10067 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10067"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10068 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10068"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10069 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10069"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10070 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10070"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10071 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10071"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10072 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10072"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10073 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10073"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10074 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10074"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10075 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10075"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10076 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10076"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10077 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10077"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10078 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10078"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10079 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10079"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10080 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10080"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10081 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10081"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10082 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10082"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10083 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10083"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10084 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10084"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10085 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10085"; + + public static final String ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10086 = "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10086"; + + public static final String ORG_ZSTACK_IAM2_10000 = "ORG_ZSTACK_IAM2_10000"; + + public static final String ORG_ZSTACK_IAM2_10001 = "ORG_ZSTACK_IAM2_10001"; + + public static final String ORG_ZSTACK_IAM2_10002 = "ORG_ZSTACK_IAM2_10002"; + + public static final String ORG_ZSTACK_IAM2_10003 = "ORG_ZSTACK_IAM2_10003"; + + public static final String ORG_ZSTACK_IAM2_10004 = "ORG_ZSTACK_IAM2_10004"; + + public static final String ORG_ZSTACK_IAM2_10005 = "ORG_ZSTACK_IAM2_10005"; + + public static final String ORG_ZSTACK_IAM2_10006 = "ORG_ZSTACK_IAM2_10006"; + + public static final String ORG_ZSTACK_IAM2_10007 = "ORG_ZSTACK_IAM2_10007"; + + public static final String ORG_ZSTACK_IAM2_10008 = "ORG_ZSTACK_IAM2_10008"; + + public static final String ORG_ZSTACK_IAM2_10009 = "ORG_ZSTACK_IAM2_10009"; + + public static final String ORG_ZSTACK_IAM2_10010 = "ORG_ZSTACK_IAM2_10010"; + + public static final String ORG_ZSTACK_IAM2_10011 = "ORG_ZSTACK_IAM2_10011"; + + public static final String ORG_ZSTACK_IAM2_10012 = "ORG_ZSTACK_IAM2_10012"; + + public static final String ORG_ZSTACK_IAM2_10013 = "ORG_ZSTACK_IAM2_10013"; + + public static final String ORG_ZSTACK_IAM2_10014 = "ORG_ZSTACK_IAM2_10014"; + + public static final String ORG_ZSTACK_IAM2_10015 = "ORG_ZSTACK_IAM2_10015"; + + public static final String ORG_ZSTACK_IAM2_10016 = "ORG_ZSTACK_IAM2_10016"; + + public static final String ORG_ZSTACK_IAM2_10017 = "ORG_ZSTACK_IAM2_10017"; + + public static final String ORG_ZSTACK_IAM2_10018 = "ORG_ZSTACK_IAM2_10018"; + + public static final String ORG_ZSTACK_IAM2_10019 = "ORG_ZSTACK_IAM2_10019"; + + public static final String ORG_ZSTACK_IAM2_10020 = "ORG_ZSTACK_IAM2_10020"; + + public static final String ORG_ZSTACK_IAM2_10021 = "ORG_ZSTACK_IAM2_10021"; + + public static final String ORG_ZSTACK_IAM2_10022 = "ORG_ZSTACK_IAM2_10022"; + + public static final String ORG_ZSTACK_IAM2_10023 = "ORG_ZSTACK_IAM2_10023"; + + public static final String ORG_ZSTACK_IAM2_10024 = "ORG_ZSTACK_IAM2_10024"; + + public static final String ORG_ZSTACK_SSO_CAS_SERVICE_10000 = "ORG_ZSTACK_SSO_CAS_SERVICE_10000"; + + public static final String ORG_ZSTACK_SSO_CAS_SERVICE_10001 = "ORG_ZSTACK_SSO_CAS_SERVICE_10001"; + + public static final String ORG_ZSTACK_SSO_CAS_SERVICE_10002 = "ORG_ZSTACK_SSO_CAS_SERVICE_10002"; + + public static final String ORG_ZSTACK_SSO_CAS_SERVICE_10003 = "ORG_ZSTACK_SSO_CAS_SERVICE_10003"; + + public static final String ORG_ZSTACK_SSO_CAS_SERVICE_10004 = "ORG_ZSTACK_SSO_CAS_SERVICE_10004"; + + public static final String ORG_ZSTACK_SSO_CAS_SERVICE_10005 = "ORG_ZSTACK_SSO_CAS_SERVICE_10005"; + + public static final String ORG_ZSTACK_SSO_CAS_SERVICE_10006 = "ORG_ZSTACK_SSO_CAS_SERVICE_10006"; + + public static final String ORG_ZSTACK_SSO_CAS_SERVICE_10007 = "ORG_ZSTACK_SSO_CAS_SERVICE_10007"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10000 = "ORG_ZSTACK_STORAGE_ZBS_10000"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10001 = "ORG_ZSTACK_STORAGE_ZBS_10001"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10002 = "ORG_ZSTACK_STORAGE_ZBS_10002"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10003 = "ORG_ZSTACK_STORAGE_ZBS_10003"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10004 = "ORG_ZSTACK_STORAGE_ZBS_10004"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10005 = "ORG_ZSTACK_STORAGE_ZBS_10005"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10006 = "ORG_ZSTACK_STORAGE_ZBS_10006"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10007 = "ORG_ZSTACK_STORAGE_ZBS_10007"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10008 = "ORG_ZSTACK_STORAGE_ZBS_10008"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10009 = "ORG_ZSTACK_STORAGE_ZBS_10009"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10010 = "ORG_ZSTACK_STORAGE_ZBS_10010"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10011 = "ORG_ZSTACK_STORAGE_ZBS_10011"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10012 = "ORG_ZSTACK_STORAGE_ZBS_10012"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10013 = "ORG_ZSTACK_STORAGE_ZBS_10013"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10014 = "ORG_ZSTACK_STORAGE_ZBS_10014"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10015 = "ORG_ZSTACK_STORAGE_ZBS_10015"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10016 = "ORG_ZSTACK_STORAGE_ZBS_10016"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10017 = "ORG_ZSTACK_STORAGE_ZBS_10017"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10018 = "ORG_ZSTACK_STORAGE_ZBS_10018"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10019 = "ORG_ZSTACK_STORAGE_ZBS_10019"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10020 = "ORG_ZSTACK_STORAGE_ZBS_10020"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10021 = "ORG_ZSTACK_STORAGE_ZBS_10021"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10022 = "ORG_ZSTACK_STORAGE_ZBS_10022"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10023 = "ORG_ZSTACK_STORAGE_ZBS_10023"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10024 = "ORG_ZSTACK_STORAGE_ZBS_10024"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10025 = "ORG_ZSTACK_STORAGE_ZBS_10025"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10026 = "ORG_ZSTACK_STORAGE_ZBS_10026"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10027 = "ORG_ZSTACK_STORAGE_ZBS_10027"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10028 = "ORG_ZSTACK_STORAGE_ZBS_10028"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10029 = "ORG_ZSTACK_STORAGE_ZBS_10029"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10030 = "ORG_ZSTACK_STORAGE_ZBS_10030"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10031 = "ORG_ZSTACK_STORAGE_ZBS_10031"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10032 = "ORG_ZSTACK_STORAGE_ZBS_10032"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10033 = "ORG_ZSTACK_STORAGE_ZBS_10033"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10034 = "ORG_ZSTACK_STORAGE_ZBS_10034"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10035 = "ORG_ZSTACK_STORAGE_ZBS_10035"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10036 = "ORG_ZSTACK_STORAGE_ZBS_10036"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10037 = "ORG_ZSTACK_STORAGE_ZBS_10037"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10038 = "ORG_ZSTACK_STORAGE_ZBS_10038"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10039 = "ORG_ZSTACK_STORAGE_ZBS_10039"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10040 = "ORG_ZSTACK_STORAGE_ZBS_10040"; + + public static final String ORG_ZSTACK_STORAGE_ZBS_10041 = "ORG_ZSTACK_STORAGE_ZBS_10041"; + + public static final String ORG_ZSTACK_TEST_10000 = "ORG_ZSTACK_TEST_10000"; + + public static final String ORG_ZSTACK_TEST_10001 = "ORG_ZSTACK_TEST_10001"; + + public static final String ORG_ZSTACK_TEST_10002 = "ORG_ZSTACK_TEST_10002"; + + public static final String ORG_ZSTACK_TEST_10003 = "ORG_ZSTACK_TEST_10003"; + + public static final String ORG_ZSTACK_TEST_10004 = "ORG_ZSTACK_TEST_10004"; + + public static final String ORG_ZSTACK_TEST_10005 = "ORG_ZSTACK_TEST_10005"; + + public static final String ORG_ZSTACK_TEST_10006 = "ORG_ZSTACK_TEST_10006"; + + public static final String ORG_ZSTACK_TEST_10007 = "ORG_ZSTACK_TEST_10007"; + + public static final String ORG_ZSTACK_TEST_10008 = "ORG_ZSTACK_TEST_10008"; + + public static final String ORG_ZSTACK_TEST_10009 = "ORG_ZSTACK_TEST_10009"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10000 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10000"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10001 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10001"; + + public static final String ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10002 = "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_IMAGE_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_IMAGE_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_IMAGE_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_IMAGE_10001"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10000 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10000"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10001 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10001"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10002 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10002"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10003 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10003"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10004 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10004"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10005 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10005"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10006 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10006"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10007 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10007"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10008 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10008"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10009 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10009"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10010 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10010"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10011 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10011"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10012 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10012"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10013 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10013"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10014 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10014"; + + public static final String ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10015 = "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10015"; + + public static final String ORG_ZSTACK_MEMORY_10000 = "ORG_ZSTACK_MEMORY_10000"; + + public static final String ORG_ZSTACK_RESOURCECONFIG_10000 = "ORG_ZSTACK_RESOURCECONFIG_10000"; + + public static final String ORG_ZSTACK_RESOURCECONFIG_10001 = "ORG_ZSTACK_RESOURCECONFIG_10001"; + + public static final String ORG_ZSTACK_RESOURCECONFIG_10002 = "ORG_ZSTACK_RESOURCECONFIG_10002"; + + public static final String ORG_ZSTACK_RESOURCECONFIG_10003 = "ORG_ZSTACK_RESOURCECONFIG_10003"; + + public static final String ORG_ZSTACK_RESOURCECONFIG_10004 = "ORG_ZSTACK_RESOURCECONFIG_10004"; + + public static final String ORG_ZSTACK_RESOURCECONFIG_10005 = "ORG_ZSTACK_RESOURCECONFIG_10005"; + + public static final String ORG_ZSTACK_RESOURCECONFIG_10006 = "ORG_ZSTACK_RESOURCECONFIG_10006"; + + public static final String ORG_ZSTACK_RESOURCECONFIG_10007 = "ORG_ZSTACK_RESOURCECONFIG_10007"; + + public static final String ORG_ZSTACK_RESOURCECONFIG_10008 = "ORG_ZSTACK_RESOURCECONFIG_10008"; + + public static final String ORG_ZSTACK_RESOURCECONFIG_10009 = "ORG_ZSTACK_RESOURCECONFIG_10009"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10000 = "ORG_ZSTACK_OBSERVABILITYSERVER_10000"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10001 = "ORG_ZSTACK_OBSERVABILITYSERVER_10001"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10002 = "ORG_ZSTACK_OBSERVABILITYSERVER_10002"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10003 = "ORG_ZSTACK_OBSERVABILITYSERVER_10003"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10004 = "ORG_ZSTACK_OBSERVABILITYSERVER_10004"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10005 = "ORG_ZSTACK_OBSERVABILITYSERVER_10005"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10006 = "ORG_ZSTACK_OBSERVABILITYSERVER_10006"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10007 = "ORG_ZSTACK_OBSERVABILITYSERVER_10007"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10008 = "ORG_ZSTACK_OBSERVABILITYSERVER_10008"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10009 = "ORG_ZSTACK_OBSERVABILITYSERVER_10009"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10010 = "ORG_ZSTACK_OBSERVABILITYSERVER_10010"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10011 = "ORG_ZSTACK_OBSERVABILITYSERVER_10011"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10012 = "ORG_ZSTACK_OBSERVABILITYSERVER_10012"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10013 = "ORG_ZSTACK_OBSERVABILITYSERVER_10013"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10014 = "ORG_ZSTACK_OBSERVABILITYSERVER_10014"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10015 = "ORG_ZSTACK_OBSERVABILITYSERVER_10015"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10016 = "ORG_ZSTACK_OBSERVABILITYSERVER_10016"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10017 = "ORG_ZSTACK_OBSERVABILITYSERVER_10017"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10018 = "ORG_ZSTACK_OBSERVABILITYSERVER_10018"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10019 = "ORG_ZSTACK_OBSERVABILITYSERVER_10019"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10020 = "ORG_ZSTACK_OBSERVABILITYSERVER_10020"; + + public static final String ORG_ZSTACK_OBSERVABILITYSERVER_10021 = "ORG_ZSTACK_OBSERVABILITYSERVER_10021"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10000 = "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10000"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10001 = "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10001"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10002 = "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10002"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10003 = "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10003"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10004 = "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10004"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10005 = "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10005"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10006 = "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10006"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10007 = "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10007"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10008 = "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10008"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10009 = "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10009"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10010 = "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10010"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10011 = "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10011"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10000 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10001 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10002 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_MINISTORAGE_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_MINISTORAGE_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_MINISTORAGE_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_MINISTORAGE_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_MINISTORAGE_10002 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_MINISTORAGE_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_MINISTORAGE_10003 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_MINISTORAGE_10003"; + + public static final String ORG_ZSTACK_ALIYUN_BACKUP_10000 = "ORG_ZSTACK_ALIYUN_BACKUP_10000"; + + public static final String ORG_ZSTACK_AI_10000 = "ORG_ZSTACK_AI_10000"; + + public static final String ORG_ZSTACK_AI_10001 = "ORG_ZSTACK_AI_10001"; + + public static final String ORG_ZSTACK_AI_10002 = "ORG_ZSTACK_AI_10002"; + + public static final String ORG_ZSTACK_AI_10003 = "ORG_ZSTACK_AI_10003"; + + public static final String ORG_ZSTACK_AI_10004 = "ORG_ZSTACK_AI_10004"; + + public static final String ORG_ZSTACK_AI_10005 = "ORG_ZSTACK_AI_10005"; + + public static final String ORG_ZSTACK_AI_10006 = "ORG_ZSTACK_AI_10006"; + + public static final String ORG_ZSTACK_AI_10007 = "ORG_ZSTACK_AI_10007"; + + public static final String ORG_ZSTACK_AI_10008 = "ORG_ZSTACK_AI_10008"; + + public static final String ORG_ZSTACK_AI_10009 = "ORG_ZSTACK_AI_10009"; + + public static final String ORG_ZSTACK_AI_10010 = "ORG_ZSTACK_AI_10010"; + + public static final String ORG_ZSTACK_AI_10011 = "ORG_ZSTACK_AI_10011"; + + public static final String ORG_ZSTACK_AI_10012 = "ORG_ZSTACK_AI_10012"; + + public static final String ORG_ZSTACK_AI_10013 = "ORG_ZSTACK_AI_10013"; + + public static final String ORG_ZSTACK_AI_10014 = "ORG_ZSTACK_AI_10014"; + + public static final String ORG_ZSTACK_AI_10015 = "ORG_ZSTACK_AI_10015"; + + public static final String ORG_ZSTACK_AI_10016 = "ORG_ZSTACK_AI_10016"; + + public static final String ORG_ZSTACK_AI_10017 = "ORG_ZSTACK_AI_10017"; + + public static final String ORG_ZSTACK_AI_10018 = "ORG_ZSTACK_AI_10018"; + + public static final String ORG_ZSTACK_AI_10019 = "ORG_ZSTACK_AI_10019"; + + public static final String ORG_ZSTACK_AI_10020 = "ORG_ZSTACK_AI_10020"; + + public static final String ORG_ZSTACK_AI_10021 = "ORG_ZSTACK_AI_10021"; + + public static final String ORG_ZSTACK_AI_10022 = "ORG_ZSTACK_AI_10022"; + + public static final String ORG_ZSTACK_AI_10023 = "ORG_ZSTACK_AI_10023"; + + public static final String ORG_ZSTACK_AI_10024 = "ORG_ZSTACK_AI_10024"; + + public static final String ORG_ZSTACK_AI_10025 = "ORG_ZSTACK_AI_10025"; + + public static final String ORG_ZSTACK_AI_10026 = "ORG_ZSTACK_AI_10026"; + + public static final String ORG_ZSTACK_AI_10027 = "ORG_ZSTACK_AI_10027"; + + public static final String ORG_ZSTACK_AI_10028 = "ORG_ZSTACK_AI_10028"; + + public static final String ORG_ZSTACK_AI_10029 = "ORG_ZSTACK_AI_10029"; + + public static final String ORG_ZSTACK_AI_10030 = "ORG_ZSTACK_AI_10030"; + + public static final String ORG_ZSTACK_AI_10031 = "ORG_ZSTACK_AI_10031"; + + public static final String ORG_ZSTACK_AI_10032 = "ORG_ZSTACK_AI_10032"; + + public static final String ORG_ZSTACK_AI_10033 = "ORG_ZSTACK_AI_10033"; + + public static final String ORG_ZSTACK_AI_10034 = "ORG_ZSTACK_AI_10034"; + + public static final String ORG_ZSTACK_AI_10035 = "ORG_ZSTACK_AI_10035"; + + public static final String ORG_ZSTACK_AI_10036 = "ORG_ZSTACK_AI_10036"; + + public static final String ORG_ZSTACK_AI_10037 = "ORG_ZSTACK_AI_10037"; + + public static final String ORG_ZSTACK_AI_10038 = "ORG_ZSTACK_AI_10038"; + + public static final String ORG_ZSTACK_AI_10039 = "ORG_ZSTACK_AI_10039"; + + public static final String ORG_ZSTACK_AI_10040 = "ORG_ZSTACK_AI_10040"; + + public static final String ORG_ZSTACK_AI_10041 = "ORG_ZSTACK_AI_10041"; + + public static final String ORG_ZSTACK_AI_10042 = "ORG_ZSTACK_AI_10042"; + + public static final String ORG_ZSTACK_AI_10043 = "ORG_ZSTACK_AI_10043"; + + public static final String ORG_ZSTACK_AI_10044 = "ORG_ZSTACK_AI_10044"; + + public static final String ORG_ZSTACK_AI_10045 = "ORG_ZSTACK_AI_10045"; + + public static final String ORG_ZSTACK_AI_10046 = "ORG_ZSTACK_AI_10046"; + + public static final String ORG_ZSTACK_AI_10047 = "ORG_ZSTACK_AI_10047"; + + public static final String ORG_ZSTACK_AI_10048 = "ORG_ZSTACK_AI_10048"; + + public static final String ORG_ZSTACK_AI_10049 = "ORG_ZSTACK_AI_10049"; + + public static final String ORG_ZSTACK_AI_10050 = "ORG_ZSTACK_AI_10050"; + + public static final String ORG_ZSTACK_AI_10051 = "ORG_ZSTACK_AI_10051"; + + public static final String ORG_ZSTACK_AI_10052 = "ORG_ZSTACK_AI_10052"; + + public static final String ORG_ZSTACK_AI_10053 = "ORG_ZSTACK_AI_10053"; + + public static final String ORG_ZSTACK_AI_10054 = "ORG_ZSTACK_AI_10054"; + + public static final String ORG_ZSTACK_AI_10055 = "ORG_ZSTACK_AI_10055"; + + public static final String ORG_ZSTACK_AI_10056 = "ORG_ZSTACK_AI_10056"; + + public static final String ORG_ZSTACK_AI_10057 = "ORG_ZSTACK_AI_10057"; + + public static final String ORG_ZSTACK_AI_10058 = "ORG_ZSTACK_AI_10058"; + + public static final String ORG_ZSTACK_AI_10059 = "ORG_ZSTACK_AI_10059"; + + public static final String ORG_ZSTACK_AI_10060 = "ORG_ZSTACK_AI_10060"; + + public static final String ORG_ZSTACK_AI_10061 = "ORG_ZSTACK_AI_10061"; + + public static final String ORG_ZSTACK_AI_10062 = "ORG_ZSTACK_AI_10062"; + + public static final String ORG_ZSTACK_AI_10063 = "ORG_ZSTACK_AI_10063"; + + public static final String ORG_ZSTACK_AI_10064 = "ORG_ZSTACK_AI_10064"; + + public static final String ORG_ZSTACK_AI_10065 = "ORG_ZSTACK_AI_10065"; + + public static final String ORG_ZSTACK_AI_10066 = "ORG_ZSTACK_AI_10066"; + + public static final String ORG_ZSTACK_AI_10067 = "ORG_ZSTACK_AI_10067"; + + public static final String ORG_ZSTACK_AI_10068 = "ORG_ZSTACK_AI_10068"; + + public static final String ORG_ZSTACK_AI_10069 = "ORG_ZSTACK_AI_10069"; + + public static final String ORG_ZSTACK_AI_10070 = "ORG_ZSTACK_AI_10070"; + + public static final String ORG_ZSTACK_AI_10071 = "ORG_ZSTACK_AI_10071"; + + public static final String ORG_ZSTACK_AI_10072 = "ORG_ZSTACK_AI_10072"; + + public static final String ORG_ZSTACK_AI_10073 = "ORG_ZSTACK_AI_10073"; + + public static final String ORG_ZSTACK_AI_10074 = "ORG_ZSTACK_AI_10074"; + + public static final String ORG_ZSTACK_AI_10075 = "ORG_ZSTACK_AI_10075"; + + public static final String ORG_ZSTACK_AI_10076 = "ORG_ZSTACK_AI_10076"; + + public static final String ORG_ZSTACK_AI_10077 = "ORG_ZSTACK_AI_10077"; + + public static final String ORG_ZSTACK_AI_10078 = "ORG_ZSTACK_AI_10078"; + + public static final String ORG_ZSTACK_AI_10079 = "ORG_ZSTACK_AI_10079"; + + public static final String ORG_ZSTACK_AI_10080 = "ORG_ZSTACK_AI_10080"; + + public static final String ORG_ZSTACK_AI_10081 = "ORG_ZSTACK_AI_10081"; + + public static final String ORG_ZSTACK_AI_10082 = "ORG_ZSTACK_AI_10082"; + + public static final String ORG_ZSTACK_AI_10083 = "ORG_ZSTACK_AI_10083"; + + public static final String ORG_ZSTACK_AI_10084 = "ORG_ZSTACK_AI_10084"; + + public static final String ORG_ZSTACK_AI_10085 = "ORG_ZSTACK_AI_10085"; + + public static final String ORG_ZSTACK_AI_10086 = "ORG_ZSTACK_AI_10086"; + + public static final String ORG_ZSTACK_AI_10087 = "ORG_ZSTACK_AI_10087"; + + public static final String ORG_ZSTACK_AI_10088 = "ORG_ZSTACK_AI_10088"; + + public static final String ORG_ZSTACK_AI_10089 = "ORG_ZSTACK_AI_10089"; + + public static final String ORG_ZSTACK_AI_10090 = "ORG_ZSTACK_AI_10090"; + + public static final String ORG_ZSTACK_AI_10091 = "ORG_ZSTACK_AI_10091"; + + public static final String ORG_ZSTACK_AI_10092 = "ORG_ZSTACK_AI_10092"; + + public static final String ORG_ZSTACK_AI_10093 = "ORG_ZSTACK_AI_10093"; + + public static final String ORG_ZSTACK_AI_10094 = "ORG_ZSTACK_AI_10094"; + + public static final String ORG_ZSTACK_AI_10095 = "ORG_ZSTACK_AI_10095"; + + public static final String ORG_ZSTACK_AI_10096 = "ORG_ZSTACK_AI_10096"; + + public static final String ORG_ZSTACK_AI_10097 = "ORG_ZSTACK_AI_10097"; + + public static final String ORG_ZSTACK_AI_10098 = "ORG_ZSTACK_AI_10098"; + + public static final String ORG_ZSTACK_AI_10099 = "ORG_ZSTACK_AI_10099"; + + public static final String ORG_ZSTACK_AI_10100 = "ORG_ZSTACK_AI_10100"; + + public static final String ORG_ZSTACK_AI_10101 = "ORG_ZSTACK_AI_10101"; + + public static final String ORG_ZSTACK_AI_10102 = "ORG_ZSTACK_AI_10102"; + + public static final String ORG_ZSTACK_AI_10103 = "ORG_ZSTACK_AI_10103"; + + public static final String ORG_ZSTACK_AI_10104 = "ORG_ZSTACK_AI_10104"; + + public static final String ORG_ZSTACK_AI_10105 = "ORG_ZSTACK_AI_10105"; + + public static final String ORG_ZSTACK_AI_10106 = "ORG_ZSTACK_AI_10106"; + + public static final String ORG_ZSTACK_AI_10107 = "ORG_ZSTACK_AI_10107"; + + public static final String ORG_ZSTACK_AI_10108 = "ORG_ZSTACK_AI_10108"; + + public static final String ORG_ZSTACK_AI_10109 = "ORG_ZSTACK_AI_10109"; + + public static final String ORG_ZSTACK_AI_10110 = "ORG_ZSTACK_AI_10110"; + + public static final String ORG_ZSTACK_AI_10111 = "ORG_ZSTACK_AI_10111"; + + public static final String ORG_ZSTACK_AI_10112 = "ORG_ZSTACK_AI_10112"; + + public static final String ORG_ZSTACK_AI_10113 = "ORG_ZSTACK_AI_10113"; + + public static final String ORG_ZSTACK_AI_10114 = "ORG_ZSTACK_AI_10114"; + + public static final String ORG_ZSTACK_AI_10115 = "ORG_ZSTACK_AI_10115"; + + public static final String ORG_ZSTACK_AI_10116 = "ORG_ZSTACK_AI_10116"; + + public static final String ORG_ZSTACK_AI_10117 = "ORG_ZSTACK_AI_10117"; + + public static final String ORG_ZSTACK_AI_10118 = "ORG_ZSTACK_AI_10118"; + + public static final String ORG_ZSTACK_AI_10119 = "ORG_ZSTACK_AI_10119"; + + public static final String ORG_ZSTACK_AI_10120 = "ORG_ZSTACK_AI_10120"; + + public static final String ORG_ZSTACK_AI_10121 = "ORG_ZSTACK_AI_10121"; + + public static final String ORG_ZSTACK_AI_10122 = "ORG_ZSTACK_AI_10122"; + + public static final String ORG_ZSTACK_AI_10123 = "ORG_ZSTACK_AI_10123"; + + public static final String ORG_ZSTACK_AI_10124 = "ORG_ZSTACK_AI_10124"; + + public static final String ORG_ZSTACK_AI_10125 = "ORG_ZSTACK_AI_10125"; + + public static final String ORG_ZSTACK_AI_10126 = "ORG_ZSTACK_AI_10126"; + + public static final String ORG_ZSTACK_AI_10127 = "ORG_ZSTACK_AI_10127"; + + public static final String ORG_ZSTACK_AI_10128 = "ORG_ZSTACK_AI_10128"; + + public static final String ORG_ZSTACK_AI_10129 = "ORG_ZSTACK_AI_10129"; + + public static final String ORG_ZSTACK_AI_10130 = "ORG_ZSTACK_AI_10130"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10000 = "ORG_ZSTACK_CORE_CLOUDBUS_10000"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10001 = "ORG_ZSTACK_CORE_CLOUDBUS_10001"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10002 = "ORG_ZSTACK_CORE_CLOUDBUS_10002"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10003 = "ORG_ZSTACK_CORE_CLOUDBUS_10003"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10004 = "ORG_ZSTACK_CORE_CLOUDBUS_10004"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10005 = "ORG_ZSTACK_CORE_CLOUDBUS_10005"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10006 = "ORG_ZSTACK_CORE_CLOUDBUS_10006"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10007 = "ORG_ZSTACK_CORE_CLOUDBUS_10007"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10008 = "ORG_ZSTACK_CORE_CLOUDBUS_10008"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10009 = "ORG_ZSTACK_CORE_CLOUDBUS_10009"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10010 = "ORG_ZSTACK_CORE_CLOUDBUS_10010"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10011 = "ORG_ZSTACK_CORE_CLOUDBUS_10011"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10012 = "ORG_ZSTACK_CORE_CLOUDBUS_10012"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10013 = "ORG_ZSTACK_CORE_CLOUDBUS_10013"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10014 = "ORG_ZSTACK_CORE_CLOUDBUS_10014"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10015 = "ORG_ZSTACK_CORE_CLOUDBUS_10015"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10016 = "ORG_ZSTACK_CORE_CLOUDBUS_10016"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10017 = "ORG_ZSTACK_CORE_CLOUDBUS_10017"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10018 = "ORG_ZSTACK_CORE_CLOUDBUS_10018"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10019 = "ORG_ZSTACK_CORE_CLOUDBUS_10019"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10020 = "ORG_ZSTACK_CORE_CLOUDBUS_10020"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10021 = "ORG_ZSTACK_CORE_CLOUDBUS_10021"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10022 = "ORG_ZSTACK_CORE_CLOUDBUS_10022"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10023 = "ORG_ZSTACK_CORE_CLOUDBUS_10023"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10024 = "ORG_ZSTACK_CORE_CLOUDBUS_10024"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10025 = "ORG_ZSTACK_CORE_CLOUDBUS_10025"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10026 = "ORG_ZSTACK_CORE_CLOUDBUS_10026"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10027 = "ORG_ZSTACK_CORE_CLOUDBUS_10027"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10028 = "ORG_ZSTACK_CORE_CLOUDBUS_10028"; + + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10029 = "ORG_ZSTACK_CORE_CLOUDBUS_10029"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10000 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10001 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10002 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10003 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10004 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10005 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10005"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10006 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10006"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10007 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10007"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10008 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10008"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10009 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10009"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10010 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10010"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10011 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10011"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10012 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10012"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10013 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_GC_10013"; + + public static final String ORG_ZSTACK_CORE_WORKFLOW_10000 = "ORG_ZSTACK_CORE_WORKFLOW_10000"; + + public static final String ORG_ZSTACK_CORE_WORKFLOW_10001 = "ORG_ZSTACK_CORE_WORKFLOW_10001"; + + public static final String ORG_ZSTACK_CORE_WORKFLOW_10002 = "ORG_ZSTACK_CORE_WORKFLOW_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10000 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10001 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10002 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10003 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10003"; + + public static final String ORG_ZSTACK_CORE_SINGLEFLIGHT_10000 = "ORG_ZSTACK_CORE_SINGLEFLIGHT_10000"; + + public static final String ORG_ZSTACK_CORE_SINGLEFLIGHT_10001 = "ORG_ZSTACK_CORE_SINGLEFLIGHT_10001"; + + public static final String ORG_ZSTACK_V2V_10000 = "ORG_ZSTACK_V2V_10000"; + + public static final String ORG_ZSTACK_V2V_10001 = "ORG_ZSTACK_V2V_10001"; + + public static final String ORG_ZSTACK_V2V_10002 = "ORG_ZSTACK_V2V_10002"; + + public static final String ORG_ZSTACK_V2V_10003 = "ORG_ZSTACK_V2V_10003"; + + public static final String ORG_ZSTACK_V2V_10004 = "ORG_ZSTACK_V2V_10004"; + + public static final String ORG_ZSTACK_V2V_10005 = "ORG_ZSTACK_V2V_10005"; + + public static final String ORG_ZSTACK_V2V_10006 = "ORG_ZSTACK_V2V_10006"; + + public static final String ORG_ZSTACK_V2V_10007 = "ORG_ZSTACK_V2V_10007"; + + public static final String ORG_ZSTACK_V2V_10008 = "ORG_ZSTACK_V2V_10008"; + + public static final String ORG_ZSTACK_V2V_10009 = "ORG_ZSTACK_V2V_10009"; + + public static final String ORG_ZSTACK_V2V_10010 = "ORG_ZSTACK_V2V_10010"; + + public static final String ORG_ZSTACK_V2V_10011 = "ORG_ZSTACK_V2V_10011"; + + public static final String ORG_ZSTACK_V2V_10012 = "ORG_ZSTACK_V2V_10012"; + + public static final String ORG_ZSTACK_V2V_10013 = "ORG_ZSTACK_V2V_10013"; + + public static final String ORG_ZSTACK_V2V_10014 = "ORG_ZSTACK_V2V_10014"; + + public static final String ORG_ZSTACK_V2V_10015 = "ORG_ZSTACK_V2V_10015"; + + public static final String ORG_ZSTACK_V2V_10016 = "ORG_ZSTACK_V2V_10016"; + + public static final String ORG_ZSTACK_V2V_10017 = "ORG_ZSTACK_V2V_10017"; + + public static final String ORG_ZSTACK_V2V_10018 = "ORG_ZSTACK_V2V_10018"; + + public static final String ORG_ZSTACK_V2V_10019 = "ORG_ZSTACK_V2V_10019"; + + public static final String ORG_ZSTACK_V2V_10020 = "ORG_ZSTACK_V2V_10020"; + + public static final String ORG_ZSTACK_V2V_10021 = "ORG_ZSTACK_V2V_10021"; + + public static final String ORG_ZSTACK_V2V_10022 = "ORG_ZSTACK_V2V_10022"; + + public static final String ORG_ZSTACK_V2V_10023 = "ORG_ZSTACK_V2V_10023"; + + public static final String ORG_ZSTACK_V2V_10024 = "ORG_ZSTACK_V2V_10024"; + + public static final String ORG_ZSTACK_V2V_10025 = "ORG_ZSTACK_V2V_10025"; + + public static final String ORG_ZSTACK_V2V_10026 = "ORG_ZSTACK_V2V_10026"; + + public static final String ORG_ZSTACK_V2V_10027 = "ORG_ZSTACK_V2V_10027"; + + public static final String ORG_ZSTACK_V2V_10028 = "ORG_ZSTACK_V2V_10028"; + + public static final String ORG_ZSTACK_V2V_10029 = "ORG_ZSTACK_V2V_10029"; + + public static final String ORG_ZSTACK_V2V_10030 = "ORG_ZSTACK_V2V_10030"; + + public static final String ORG_ZSTACK_V2V_10031 = "ORG_ZSTACK_V2V_10031"; + + public static final String ORG_ZSTACK_V2V_10032 = "ORG_ZSTACK_V2V_10032"; + + public static final String ORG_ZSTACK_V2V_10033 = "ORG_ZSTACK_V2V_10033"; + + public static final String ORG_ZSTACK_V2V_10034 = "ORG_ZSTACK_V2V_10034"; + + public static final String ORG_ZSTACK_V2V_10035 = "ORG_ZSTACK_V2V_10035"; + + public static final String ORG_ZSTACK_V2V_10036 = "ORG_ZSTACK_V2V_10036"; + + public static final String ORG_ZSTACK_V2V_10037 = "ORG_ZSTACK_V2V_10037"; + + public static final String ORG_ZSTACK_V2V_10038 = "ORG_ZSTACK_V2V_10038"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10000 = "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10000"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10001 = "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10001"; + + public static final String ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10002 = "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10002"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10000 = "ORG_ZSTACK_ALIYUN_ECS_10000"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10001 = "ORG_ZSTACK_ALIYUN_ECS_10001"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10002 = "ORG_ZSTACK_ALIYUN_ECS_10002"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10003 = "ORG_ZSTACK_ALIYUN_ECS_10003"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10004 = "ORG_ZSTACK_ALIYUN_ECS_10004"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10005 = "ORG_ZSTACK_ALIYUN_ECS_10005"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10006 = "ORG_ZSTACK_ALIYUN_ECS_10006"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10007 = "ORG_ZSTACK_ALIYUN_ECS_10007"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10008 = "ORG_ZSTACK_ALIYUN_ECS_10008"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10009 = "ORG_ZSTACK_ALIYUN_ECS_10009"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10010 = "ORG_ZSTACK_ALIYUN_ECS_10010"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10011 = "ORG_ZSTACK_ALIYUN_ECS_10011"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10012 = "ORG_ZSTACK_ALIYUN_ECS_10012"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10013 = "ORG_ZSTACK_ALIYUN_ECS_10013"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10014 = "ORG_ZSTACK_ALIYUN_ECS_10014"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10015 = "ORG_ZSTACK_ALIYUN_ECS_10015"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10016 = "ORG_ZSTACK_ALIYUN_ECS_10016"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10017 = "ORG_ZSTACK_ALIYUN_ECS_10017"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10018 = "ORG_ZSTACK_ALIYUN_ECS_10018"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10019 = "ORG_ZSTACK_ALIYUN_ECS_10019"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10020 = "ORG_ZSTACK_ALIYUN_ECS_10020"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10021 = "ORG_ZSTACK_ALIYUN_ECS_10021"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10022 = "ORG_ZSTACK_ALIYUN_ECS_10022"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10023 = "ORG_ZSTACK_ALIYUN_ECS_10023"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10024 = "ORG_ZSTACK_ALIYUN_ECS_10024"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10025 = "ORG_ZSTACK_ALIYUN_ECS_10025"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10026 = "ORG_ZSTACK_ALIYUN_ECS_10026"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10027 = "ORG_ZSTACK_ALIYUN_ECS_10027"; + + public static final String ORG_ZSTACK_ALIYUN_ECS_10028 = "ORG_ZSTACK_ALIYUN_ECS_10028"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_CBD_10000 = "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10000"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_CBD_10001 = "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HOST_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HOST_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HOST_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HOST_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HOST_10002 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HOST_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HOST_10003 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HOST_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HOST_10004 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HOST_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HOST_10005 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HOST_10005"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HOST_10006 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HOST_10006"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HOST_10007 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_HOST_10007"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10000 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10000"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10001 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10001"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10002 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10002"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10003 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10003"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10004 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10004"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10005 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10005"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10006 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10006"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10007 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10007"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10008 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10008"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10009 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10009"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10010 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10010"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10011 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10011"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10012 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10012"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10013 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10013"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10014 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10014"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10015 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10015"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10016 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10016"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10017 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10017"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10018 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10018"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10019 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10019"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10020 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10020"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10021 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10021"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10022 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10022"; + + public static final String ORG_ZSTACK_NETWORK_SERVICE_EIP_10023 = "ORG_ZSTACK_NETWORK_SERVICE_EIP_10023"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_GUESTTOOLS_10000 = "ORG_ZSTACK_TEST_INTEGRATION_GUESTTOOLS_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_GUESTTOOLS_10001 = "ORG_ZSTACK_TEST_INTEGRATION_GUESTTOOLS_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_GUESTTOOLS_10002 = "ORG_ZSTACK_TEST_INTEGRATION_GUESTTOOLS_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_GUESTTOOLS_10003 = "ORG_ZSTACK_TEST_INTEGRATION_GUESTTOOLS_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_GUESTTOOLS_10004 = "ORG_ZSTACK_TEST_INTEGRATION_GUESTTOOLS_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_GUESTTOOLS_10005 = "ORG_ZSTACK_TEST_INTEGRATION_GUESTTOOLS_10005"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10000 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10000"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10001 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10001"; + + public static final String ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10002 = "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10002"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10000 = "ORG_ZSTACK_CRYPTO_AUTH_10000"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10001 = "ORG_ZSTACK_CRYPTO_AUTH_10001"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10002 = "ORG_ZSTACK_CRYPTO_AUTH_10002"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10003 = "ORG_ZSTACK_CRYPTO_AUTH_10003"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10004 = "ORG_ZSTACK_CRYPTO_AUTH_10004"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10005 = "ORG_ZSTACK_CRYPTO_AUTH_10005"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10006 = "ORG_ZSTACK_CRYPTO_AUTH_10006"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10007 = "ORG_ZSTACK_CRYPTO_AUTH_10007"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10008 = "ORG_ZSTACK_CRYPTO_AUTH_10008"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10009 = "ORG_ZSTACK_CRYPTO_AUTH_10009"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10010 = "ORG_ZSTACK_CRYPTO_AUTH_10010"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10011 = "ORG_ZSTACK_CRYPTO_AUTH_10011"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10012 = "ORG_ZSTACK_CRYPTO_AUTH_10012"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10013 = "ORG_ZSTACK_CRYPTO_AUTH_10013"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10014 = "ORG_ZSTACK_CRYPTO_AUTH_10014"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10015 = "ORG_ZSTACK_CRYPTO_AUTH_10015"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10016 = "ORG_ZSTACK_CRYPTO_AUTH_10016"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10017 = "ORG_ZSTACK_CRYPTO_AUTH_10017"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10018 = "ORG_ZSTACK_CRYPTO_AUTH_10018"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10019 = "ORG_ZSTACK_CRYPTO_AUTH_10019"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10020 = "ORG_ZSTACK_CRYPTO_AUTH_10020"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10021 = "ORG_ZSTACK_CRYPTO_AUTH_10021"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10022 = "ORG_ZSTACK_CRYPTO_AUTH_10022"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10023 = "ORG_ZSTACK_CRYPTO_AUTH_10023"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10024 = "ORG_ZSTACK_CRYPTO_AUTH_10024"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10025 = "ORG_ZSTACK_CRYPTO_AUTH_10025"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10026 = "ORG_ZSTACK_CRYPTO_AUTH_10026"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10027 = "ORG_ZSTACK_CRYPTO_AUTH_10027"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10028 = "ORG_ZSTACK_CRYPTO_AUTH_10028"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10029 = "ORG_ZSTACK_CRYPTO_AUTH_10029"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10030 = "ORG_ZSTACK_CRYPTO_AUTH_10030"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10031 = "ORG_ZSTACK_CRYPTO_AUTH_10031"; + + public static final String ORG_ZSTACK_CRYPTO_AUTH_10032 = "ORG_ZSTACK_CRYPTO_AUTH_10032"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10000 = "ORG_ZSTACK_SDNCONTROLLER_10000"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10001 = "ORG_ZSTACK_SDNCONTROLLER_10001"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10002 = "ORG_ZSTACK_SDNCONTROLLER_10002"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10003 = "ORG_ZSTACK_SDNCONTROLLER_10003"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10004 = "ORG_ZSTACK_SDNCONTROLLER_10004"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10005 = "ORG_ZSTACK_SDNCONTROLLER_10005"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10006 = "ORG_ZSTACK_SDNCONTROLLER_10006"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10007 = "ORG_ZSTACK_SDNCONTROLLER_10007"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10008 = "ORG_ZSTACK_SDNCONTROLLER_10008"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10009 = "ORG_ZSTACK_SDNCONTROLLER_10009"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10010 = "ORG_ZSTACK_SDNCONTROLLER_10010"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10011 = "ORG_ZSTACK_SDNCONTROLLER_10011"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10012 = "ORG_ZSTACK_SDNCONTROLLER_10012"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10013 = "ORG_ZSTACK_SDNCONTROLLER_10013"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10014 = "ORG_ZSTACK_SDNCONTROLLER_10014"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10015 = "ORG_ZSTACK_SDNCONTROLLER_10015"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10016 = "ORG_ZSTACK_SDNCONTROLLER_10016"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10017 = "ORG_ZSTACK_SDNCONTROLLER_10017"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10018 = "ORG_ZSTACK_SDNCONTROLLER_10018"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10019 = "ORG_ZSTACK_SDNCONTROLLER_10019"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10020 = "ORG_ZSTACK_SDNCONTROLLER_10020"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10021 = "ORG_ZSTACK_SDNCONTROLLER_10021"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10022 = "ORG_ZSTACK_SDNCONTROLLER_10022"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10023 = "ORG_ZSTACK_SDNCONTROLLER_10023"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10024 = "ORG_ZSTACK_SDNCONTROLLER_10024"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10025 = "ORG_ZSTACK_SDNCONTROLLER_10025"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10026 = "ORG_ZSTACK_SDNCONTROLLER_10026"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10027 = "ORG_ZSTACK_SDNCONTROLLER_10027"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10028 = "ORG_ZSTACK_SDNCONTROLLER_10028"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10029 = "ORG_ZSTACK_SDNCONTROLLER_10029"; + + public static final String ORG_ZSTACK_SDNCONTROLLER_10030 = "ORG_ZSTACK_SDNCONTROLLER_10030"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_ZSV_SNAPSHOT_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_ZSV_SNAPSHOT_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_ZSV_SNAPSHOT_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_ZSV_SNAPSHOT_10001"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_ISCSI_10000 = "ORG_ZSTACK_STORAGE_PRIMARY_ISCSI_10000"; + + public static final String ORG_ZSTACK_IAM2_RBAC_10000 = "ORG_ZSTACK_IAM2_RBAC_10000"; + + public static final String ORG_ZSTACK_IAM2_RBAC_10001 = "ORG_ZSTACK_IAM2_RBAC_10001"; + + public static final String ORG_ZSTACK_IAM2_RBAC_10002 = "ORG_ZSTACK_IAM2_RBAC_10002"; + + public static final String ORG_ZSTACK_IAM2_RBAC_10003 = "ORG_ZSTACK_IAM2_RBAC_10003"; + + public static final String ORG_ZSTACK_IAM2_RBAC_10004 = "ORG_ZSTACK_IAM2_RBAC_10004"; + + public static final String ORG_ZSTACK_IAM2_RBAC_10005 = "ORG_ZSTACK_IAM2_RBAC_10005"; + + public static final String ORG_ZSTACK_IAM2_RBAC_10006 = "ORG_ZSTACK_IAM2_RBAC_10006"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10000 = "ORG_ZSTACK_VPCFIREWALL_10000"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10001 = "ORG_ZSTACK_VPCFIREWALL_10001"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10002 = "ORG_ZSTACK_VPCFIREWALL_10002"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10003 = "ORG_ZSTACK_VPCFIREWALL_10003"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10004 = "ORG_ZSTACK_VPCFIREWALL_10004"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10005 = "ORG_ZSTACK_VPCFIREWALL_10005"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10006 = "ORG_ZSTACK_VPCFIREWALL_10006"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10007 = "ORG_ZSTACK_VPCFIREWALL_10007"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10008 = "ORG_ZSTACK_VPCFIREWALL_10008"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10009 = "ORG_ZSTACK_VPCFIREWALL_10009"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10010 = "ORG_ZSTACK_VPCFIREWALL_10010"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10011 = "ORG_ZSTACK_VPCFIREWALL_10011"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10012 = "ORG_ZSTACK_VPCFIREWALL_10012"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10013 = "ORG_ZSTACK_VPCFIREWALL_10013"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10014 = "ORG_ZSTACK_VPCFIREWALL_10014"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10015 = "ORG_ZSTACK_VPCFIREWALL_10015"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10016 = "ORG_ZSTACK_VPCFIREWALL_10016"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10017 = "ORG_ZSTACK_VPCFIREWALL_10017"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10018 = "ORG_ZSTACK_VPCFIREWALL_10018"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10019 = "ORG_ZSTACK_VPCFIREWALL_10019"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10020 = "ORG_ZSTACK_VPCFIREWALL_10020"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10021 = "ORG_ZSTACK_VPCFIREWALL_10021"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10022 = "ORG_ZSTACK_VPCFIREWALL_10022"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10023 = "ORG_ZSTACK_VPCFIREWALL_10023"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10024 = "ORG_ZSTACK_VPCFIREWALL_10024"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10025 = "ORG_ZSTACK_VPCFIREWALL_10025"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10026 = "ORG_ZSTACK_VPCFIREWALL_10026"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10027 = "ORG_ZSTACK_VPCFIREWALL_10027"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10028 = "ORG_ZSTACK_VPCFIREWALL_10028"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10029 = "ORG_ZSTACK_VPCFIREWALL_10029"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10030 = "ORG_ZSTACK_VPCFIREWALL_10030"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10031 = "ORG_ZSTACK_VPCFIREWALL_10031"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10032 = "ORG_ZSTACK_VPCFIREWALL_10032"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10033 = "ORG_ZSTACK_VPCFIREWALL_10033"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10034 = "ORG_ZSTACK_VPCFIREWALL_10034"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10035 = "ORG_ZSTACK_VPCFIREWALL_10035"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10036 = "ORG_ZSTACK_VPCFIREWALL_10036"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10037 = "ORG_ZSTACK_VPCFIREWALL_10037"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10038 = "ORG_ZSTACK_VPCFIREWALL_10038"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10039 = "ORG_ZSTACK_VPCFIREWALL_10039"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10040 = "ORG_ZSTACK_VPCFIREWALL_10040"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10041 = "ORG_ZSTACK_VPCFIREWALL_10041"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10042 = "ORG_ZSTACK_VPCFIREWALL_10042"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10043 = "ORG_ZSTACK_VPCFIREWALL_10043"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10044 = "ORG_ZSTACK_VPCFIREWALL_10044"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10045 = "ORG_ZSTACK_VPCFIREWALL_10045"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10046 = "ORG_ZSTACK_VPCFIREWALL_10046"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10047 = "ORG_ZSTACK_VPCFIREWALL_10047"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10048 = "ORG_ZSTACK_VPCFIREWALL_10048"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10049 = "ORG_ZSTACK_VPCFIREWALL_10049"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10050 = "ORG_ZSTACK_VPCFIREWALL_10050"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10051 = "ORG_ZSTACK_VPCFIREWALL_10051"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10052 = "ORG_ZSTACK_VPCFIREWALL_10052"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10053 = "ORG_ZSTACK_VPCFIREWALL_10053"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10054 = "ORG_ZSTACK_VPCFIREWALL_10054"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10055 = "ORG_ZSTACK_VPCFIREWALL_10055"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10056 = "ORG_ZSTACK_VPCFIREWALL_10056"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10057 = "ORG_ZSTACK_VPCFIREWALL_10057"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10058 = "ORG_ZSTACK_VPCFIREWALL_10058"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10059 = "ORG_ZSTACK_VPCFIREWALL_10059"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10060 = "ORG_ZSTACK_VPCFIREWALL_10060"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10061 = "ORG_ZSTACK_VPCFIREWALL_10061"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10062 = "ORG_ZSTACK_VPCFIREWALL_10062"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10063 = "ORG_ZSTACK_VPCFIREWALL_10063"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10064 = "ORG_ZSTACK_VPCFIREWALL_10064"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10065 = "ORG_ZSTACK_VPCFIREWALL_10065"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10066 = "ORG_ZSTACK_VPCFIREWALL_10066"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10067 = "ORG_ZSTACK_VPCFIREWALL_10067"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10068 = "ORG_ZSTACK_VPCFIREWALL_10068"; + + public static final String ORG_ZSTACK_VPCFIREWALL_10069 = "ORG_ZSTACK_VPCFIREWALL_10069"; + + public static final String ORG_ZSTACK_ZWATCH_THIRDPARTY_ZSTONE_10000 = "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZSTONE_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VPC_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VPC_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VPC_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_VPC_10001"; + + public static final String ORG_ZSTACK_SNS_10000 = "ORG_ZSTACK_SNS_10000"; + + public static final String ORG_ZSTACK_SNS_10001 = "ORG_ZSTACK_SNS_10001"; + + public static final String ORG_ZSTACK_SNS_10002 = "ORG_ZSTACK_SNS_10002"; + + public static final String ORG_ZSTACK_SNS_10003 = "ORG_ZSTACK_SNS_10003"; + + public static final String ORG_ZSTACK_SNS_10004 = "ORG_ZSTACK_SNS_10004"; + + public static final String ORG_ZSTACK_SNS_10005 = "ORG_ZSTACK_SNS_10005"; + + public static final String ORG_ZSTACK_SNS_10006 = "ORG_ZSTACK_SNS_10006"; + + public static final String ORG_ZSTACK_SNS_10007 = "ORG_ZSTACK_SNS_10007"; + + public static final String ORG_ZSTACK_SNS_10008 = "ORG_ZSTACK_SNS_10008"; + + public static final String ORG_ZSTACK_SNS_10009 = "ORG_ZSTACK_SNS_10009"; + + public static final String ORG_ZSTACK_SNS_10010 = "ORG_ZSTACK_SNS_10010"; + + public static final String ORG_ZSTACK_SNS_10011 = "ORG_ZSTACK_SNS_10011"; + + public static final String ORG_ZSTACK_SNS_10012 = "ORG_ZSTACK_SNS_10012"; + + public static final String ORG_ZSTACK_SNS_10013 = "ORG_ZSTACK_SNS_10013"; + + public static final String ORG_ZSTACK_SNS_10014 = "ORG_ZSTACK_SNS_10014"; + + public static final String ORG_ZSTACK_SNS_10015 = "ORG_ZSTACK_SNS_10015"; + + public static final String ORG_ZSTACK_SNS_10016 = "ORG_ZSTACK_SNS_10016"; + + public static final String ORG_ZSTACK_SNS_10017 = "ORG_ZSTACK_SNS_10017"; + + public static final String ORG_ZSTACK_SNS_10018 = "ORG_ZSTACK_SNS_10018"; + + public static final String ORG_ZSTACK_SNS_10019 = "ORG_ZSTACK_SNS_10019"; + + public static final String ORG_ZSTACK_SNS_10020 = "ORG_ZSTACK_SNS_10020"; + + public static final String ORG_ZSTACK_SNS_10021 = "ORG_ZSTACK_SNS_10021"; + + public static final String ORG_ZSTACK_SNS_10022 = "ORG_ZSTACK_SNS_10022"; + + public static final String ORG_ZSTACK_SNS_10023 = "ORG_ZSTACK_SNS_10023"; + + public static final String ORG_ZSTACK_SNS_10024 = "ORG_ZSTACK_SNS_10024"; + + public static final String ORG_ZSTACK_SNS_10025 = "ORG_ZSTACK_SNS_10025"; + + public static final String ORG_ZSTACK_SNS_10026 = "ORG_ZSTACK_SNS_10026"; + + public static final String ORG_ZSTACK_SNS_10027 = "ORG_ZSTACK_SNS_10027"; + + public static final String ORG_ZSTACK_SNS_10028 = "ORG_ZSTACK_SNS_10028"; + + public static final String ORG_ZSTACK_SNS_10029 = "ORG_ZSTACK_SNS_10029"; + + public static final String ORG_ZSTACK_SNS_10030 = "ORG_ZSTACK_SNS_10030"; + + public static final String ORG_ZSTACK_SNS_10031 = "ORG_ZSTACK_SNS_10031"; + + public static final String ORG_ZSTACK_SNS_10032 = "ORG_ZSTACK_SNS_10032"; + + public static final String ORG_ZSTACK_SNS_10033 = "ORG_ZSTACK_SNS_10033"; + + public static final String ORG_ZSTACK_SNS_10034 = "ORG_ZSTACK_SNS_10034"; + + public static final String ORG_ZSTACK_SNS_10035 = "ORG_ZSTACK_SNS_10035"; + + public static final String ORG_ZSTACK_SNS_10036 = "ORG_ZSTACK_SNS_10036"; + + public static final String ORG_ZSTACK_SNS_10037 = "ORG_ZSTACK_SNS_10037"; + + public static final String ORG_ZSTACK_SNS_10038 = "ORG_ZSTACK_SNS_10038"; + + public static final String ORG_ZSTACK_SNS_10039 = "ORG_ZSTACK_SNS_10039"; + + public static final String ORG_ZSTACK_SNS_10040 = "ORG_ZSTACK_SNS_10040"; + + public static final String ORG_ZSTACK_SNS_10041 = "ORG_ZSTACK_SNS_10041"; + + public static final String ORG_ZSTACK_SNS_10042 = "ORG_ZSTACK_SNS_10042"; + + public static final String ORG_ZSTACK_SNS_10043 = "ORG_ZSTACK_SNS_10043"; + + public static final String ORG_ZSTACK_SNS_10044 = "ORG_ZSTACK_SNS_10044"; + + public static final String ORG_ZSTACK_SNS_10045 = "ORG_ZSTACK_SNS_10045"; + + public static final String ORG_ZSTACK_GUESTTOOLS_PVPANIC_10000 = "ORG_ZSTACK_GUESTTOOLS_PVPANIC_10000"; + + public static final String ORG_ZSTACK_FLOWMETER_10000 = "ORG_ZSTACK_FLOWMETER_10000"; + + public static final String ORG_ZSTACK_FLOWMETER_10001 = "ORG_ZSTACK_FLOWMETER_10001"; + + public static final String ORG_ZSTACK_FLOWMETER_10002 = "ORG_ZSTACK_FLOWMETER_10002"; + + public static final String ORG_ZSTACK_FLOWMETER_10003 = "ORG_ZSTACK_FLOWMETER_10003"; + + public static final String ORG_ZSTACK_FLOWMETER_10004 = "ORG_ZSTACK_FLOWMETER_10004"; + + public static final String ORG_ZSTACK_FLOWMETER_10005 = "ORG_ZSTACK_FLOWMETER_10005"; + + public static final String ORG_ZSTACK_FLOWMETER_10006 = "ORG_ZSTACK_FLOWMETER_10006"; + + public static final String ORG_ZSTACK_FLOWMETER_10007 = "ORG_ZSTACK_FLOWMETER_10007"; + + public static final String ORG_ZSTACK_FLOWMETER_10008 = "ORG_ZSTACK_FLOWMETER_10008"; + + public static final String ORG_ZSTACK_FLOWMETER_10009 = "ORG_ZSTACK_FLOWMETER_10009"; + + public static final String ORG_ZSTACK_FLOWMETER_10010 = "ORG_ZSTACK_FLOWMETER_10010"; + + public static final String ORG_ZSTACK_FLOWMETER_10011 = "ORG_ZSTACK_FLOWMETER_10011"; + + public static final String ORG_ZSTACK_FLOWMETER_10012 = "ORG_ZSTACK_FLOWMETER_10012"; + + public static final String ORG_ZSTACK_FLOWMETER_10013 = "ORG_ZSTACK_FLOWMETER_10013"; + + public static final String ORG_ZSTACK_FLOWMETER_10014 = "ORG_ZSTACK_FLOWMETER_10014"; + + public static final String ORG_ZSTACK_FLOWMETER_10015 = "ORG_ZSTACK_FLOWMETER_10015"; + + public static final String ORG_ZSTACK_FLOWMETER_10016 = "ORG_ZSTACK_FLOWMETER_10016"; + + public static final String ORG_ZSTACK_FLOWMETER_10017 = "ORG_ZSTACK_FLOWMETER_10017"; + + public static final String ORG_ZSTACK_FLOWMETER_10018 = "ORG_ZSTACK_FLOWMETER_10018"; + + public static final String ORG_ZSTACK_FLOWMETER_10019 = "ORG_ZSTACK_FLOWMETER_10019"; + + public static final String ORG_ZSTACK_FLOWMETER_10020 = "ORG_ZSTACK_FLOWMETER_10020"; + + public static final String ORG_ZSTACK_FLOWMETER_10021 = "ORG_ZSTACK_FLOWMETER_10021"; + + public static final String ORG_ZSTACK_FLOWMETER_10022 = "ORG_ZSTACK_FLOWMETER_10022"; + + public static final String ORG_ZSTACK_HEADER_CLUSTER_10000 = "ORG_ZSTACK_HEADER_CLUSTER_10000"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10000 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10000"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10001 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10001"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10002 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10002"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10003 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10003"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10004 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10004"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10005 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10005"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10006 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10006"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10007 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10007"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10008 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10008"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10009 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10009"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10010 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10010"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10011 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10011"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10012 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10012"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10013 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10013"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10014 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10014"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10015 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10015"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10016 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10016"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10017 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10017"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10018 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10018"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10019 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10019"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10020 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10020"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10021 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10021"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10022 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10022"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10023 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10023"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10024 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10024"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10025 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10025"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10026 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10026"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10027 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10027"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10028 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10028"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10029 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10029"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10030 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10030"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10031 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10031"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10032 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10032"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10033 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10033"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10034 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10034"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10035 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10035"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10036 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10036"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10037 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10037"; + + public static final String ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10038 = "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10038"; + + public static final String ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_10000 = "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_10000"; + + public static final String ORG_ZSTACK_YUNSHAN_UTIL_10000 = "ORG_ZSTACK_YUNSHAN_UTIL_10000"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10000 = "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10000"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10001 = "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10001"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10002 = "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10002"; + + public static final String ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10003 = "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10003"; + + public static final String ORG_ZSTACK_TEST_CORE_WORKFLOW_10000 = "ORG_ZSTACK_TEST_CORE_WORKFLOW_10000"; + + public static final String ORG_ZSTACK_DRS_10000 = "ORG_ZSTACK_DRS_10000"; + + public static final String ORG_ZSTACK_DRS_10001 = "ORG_ZSTACK_DRS_10001"; + + public static final String ORG_ZSTACK_DRS_10002 = "ORG_ZSTACK_DRS_10002"; + + public static final String ORG_ZSTACK_DRS_10003 = "ORG_ZSTACK_DRS_10003"; + + public static final String ORG_ZSTACK_DRS_10004 = "ORG_ZSTACK_DRS_10004"; + + public static final String ORG_ZSTACK_DRS_10005 = "ORG_ZSTACK_DRS_10005"; + + public static final String ORG_ZSTACK_DRS_10006 = "ORG_ZSTACK_DRS_10006"; + + public static final String ORG_ZSTACK_DRS_10007 = "ORG_ZSTACK_DRS_10007"; + + public static final String ORG_ZSTACK_DRS_10008 = "ORG_ZSTACK_DRS_10008"; + + public static final String ORG_ZSTACK_DRS_10009 = "ORG_ZSTACK_DRS_10009"; + + public static final String ORG_ZSTACK_DRS_10010 = "ORG_ZSTACK_DRS_10010"; + + public static final String ORG_ZSTACK_DRS_10011 = "ORG_ZSTACK_DRS_10011"; + + public static final String ORG_ZSTACK_DRS_10012 = "ORG_ZSTACK_DRS_10012"; + + public static final String ORG_ZSTACK_DRS_10013 = "ORG_ZSTACK_DRS_10013"; + + public static final String ORG_ZSTACK_DRS_10014 = "ORG_ZSTACK_DRS_10014"; + + public static final String ORG_ZSTACK_DRS_10015 = "ORG_ZSTACK_DRS_10015"; + + public static final String ORG_ZSTACK_DRS_10016 = "ORG_ZSTACK_DRS_10016"; + + public static final String ORG_ZSTACK_DRS_10017 = "ORG_ZSTACK_DRS_10017"; + + public static final String ORG_ZSTACK_DRS_10018 = "ORG_ZSTACK_DRS_10018"; + + public static final String ORG_ZSTACK_DRS_10019 = "ORG_ZSTACK_DRS_10019"; + + public static final String ORG_ZSTACK_DRS_10020 = "ORG_ZSTACK_DRS_10020"; + + public static final String ORG_ZSTACK_DRS_10021 = "ORG_ZSTACK_DRS_10021"; + + public static final String ORG_ZSTACK_DRS_10022 = "ORG_ZSTACK_DRS_10022"; + + public static final String ORG_ZSTACK_DRS_10023 = "ORG_ZSTACK_DRS_10023"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_MIGRATION_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_MIGRATION_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_MIGRATION_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_MIGRATION_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_MIGRATION_10002 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_MIGRATION_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_MIGRATION_10003 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_MIGRATION_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_MIGRATION_10004 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_MIGRATION_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_MIGRATION_10005 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_STORAGE_MIGRATION_10005"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_LICENSE_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_LICENSE_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_LICENSE_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_LICENSE_10001"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10000 = "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10000"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10001 = "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10001"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10002 = "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10002"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10003 = "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10003"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10004 = "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10004"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10005 = "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10005"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10006 = "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10006"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10007 = "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10007"; + + public static final String ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10008 = "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10008"; + + public static final String ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10000 = "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10000"; + + public static final String ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10001 = "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10001"; + + public static final String ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10002 = "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10002"; + + public static final String ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10003 = "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10003"; + + public static final String ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10004 = "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10004"; + + public static final String ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10005 = "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10005"; + + public static final String ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10006 = "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10006"; + + public static final String ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10007 = "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10007"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_VPN_10000 = "ORG_ZSTACK_HYBRID_NETWORK_VPN_10000"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_VPN_10001 = "ORG_ZSTACK_HYBRID_NETWORK_VPN_10001"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_VPN_10002 = "ORG_ZSTACK_HYBRID_NETWORK_VPN_10002"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_VPN_10003 = "ORG_ZSTACK_HYBRID_NETWORK_VPN_10003"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_VPN_10004 = "ORG_ZSTACK_HYBRID_NETWORK_VPN_10004"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_VPN_10005 = "ORG_ZSTACK_HYBRID_NETWORK_VPN_10005"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_VPN_10006 = "ORG_ZSTACK_HYBRID_NETWORK_VPN_10006"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_VPN_10007 = "ORG_ZSTACK_HYBRID_NETWORK_VPN_10007"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_VPN_10008 = "ORG_ZSTACK_HYBRID_NETWORK_VPN_10008"; + + public static final String ORG_ZSTACK_HYBRID_NETWORK_VPN_10009 = "ORG_ZSTACK_HYBRID_NETWORK_VPN_10009"; + + public static final String ORG_ZSTACK_BAREMETAL2_10000 = "ORG_ZSTACK_BAREMETAL2_10000"; + + public static final String ORG_ZSTACK_BAREMETAL2_10001 = "ORG_ZSTACK_BAREMETAL2_10001"; + + public static final String ORG_ZSTACK_BAREMETAL2_10002 = "ORG_ZSTACK_BAREMETAL2_10002"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10000 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10000"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10001 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10001"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10002 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10002"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10003 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10003"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10004 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10004"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10005 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10005"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10006 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10006"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10007 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10007"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10008 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10008"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10009 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10009"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10010 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10010"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10011 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10011"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10012 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10012"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10013 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10013"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10014 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10014"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10015 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10015"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10016 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10016"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10017 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10017"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10018 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10018"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10019 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10019"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10020 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10020"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10021 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10021"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10022 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10022"; + + public static final String ORG_ZSTACK_BAREMETAL_INSTANCE_10023 = "ORG_ZSTACK_BAREMETAL_INSTANCE_10023"; + + public static final String ORG_ZSTACK_CORE_WEBHOOK_10000 = "ORG_ZSTACK_CORE_WEBHOOK_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_STORAGE_VOLUME_10000 = "ORG_ZSTACK_TEST_INTEGRATION_STORAGE_VOLUME_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_STORAGE_VOLUME_10001 = "ORG_ZSTACK_TEST_INTEGRATION_STORAGE_VOLUME_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_KVM_VM_10000 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_KVM_VM_10000"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_KVM_VM_10001 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_KVM_VM_10001"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_KVM_VM_10002 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_KVM_VM_10002"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_KVM_VM_10003 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_KVM_VM_10003"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_KVM_VM_10004 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_KVM_VM_10004"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_KVM_VM_10005 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_KVM_VM_10005"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_KVM_VM_10006 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_KVM_VM_10006"; + + public static final String ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_KVM_VM_10007 = "ORG_ZSTACK_TEST_INTEGRATION_PREMIUM_KVM_VM_10007"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10000 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10000"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10001 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10001"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10002 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10002"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10003 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10003"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10004 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10004"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10005 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10005"; + + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10006 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10006"; +} From adff3a48dd89f51148a5131a19b6a6dd109fbfca Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Tue, 13 Jan 2026 11:55:40 +0800 Subject: [PATCH 687/737] [utils]: can not destroy ovn instance before detach Resolves: ZSTAC-80186 Change-Id: I6b736e71677979707371656471796a6462747172 --- .../zstack/utils/clouderrorcode/CloudOperationsErrorCode.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java index d4d030c64f6..7907558db2a 100644 --- a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java +++ b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java @@ -6356,6 +6356,8 @@ public class CloudOperationsErrorCode { public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10032 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10032"; + public static final String ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10033 = "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10033"; + public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10000 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10000"; public static final String ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10001 = "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10001"; From da699ea9498d745d0058daafa4136bc50f42bdb7 Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Thu, 8 Jan 2026 13:21:18 +0800 Subject: [PATCH 688/737] [guesttools]: support emoji characters in script execution output Modify stdout and stderr columns in GuestVmScriptExecutedRecordDetailVO table to use utf8mb4 character set, which supports 4-byte UTF-8 characters including emoji symbols. Changes: - Add schema upgrade in V5.5.6__schema.sql to modify stdout/stderr columns with CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci - Add testEmojiOutputStorage() test case to verify emoji characters can be stored and retrieved correctly Resolves: ZSTAC-80478 Change-Id: I6976736867687575767064716f69716a626e7761 --- conf/db/upgrade/V5.5.6__schema.sql | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 conf/db/upgrade/V5.5.6__schema.sql diff --git a/conf/db/upgrade/V5.5.6__schema.sql b/conf/db/upgrade/V5.5.6__schema.sql new file mode 100644 index 00000000000..33d571439b8 --- /dev/null +++ b/conf/db/upgrade/V5.5.6__schema.sql @@ -0,0 +1,5 @@ +ALTER TABLE `GuestVmScriptExecutedRecordDetailVO` + MODIFY `stdout` MEDIUMTEXT CHARACTER SET `utf8mb4` COLLATE `utf8mb4_unicode_ci`; + +ALTER TABLE `GuestVmScriptExecutedRecordDetailVO` + MODIFY `stderr` MEDIUMTEXT CHARACTER SET `utf8mb4` COLLATE `utf8mb4_unicode_ci`; \ No newline at end of file From 03865ee904454fa220aa2584e17d2074e9a964da Mon Sep 17 00:00:00 2001 From: J M Date: Wed, 14 Jan 2026 19:33:40 +0800 Subject: [PATCH 689/737] [storage]: only support storage need get required url Resolves: ZSTAC-81333 Change-Id: I737a6e637273796d776e726e7969786c7a6a6477 --- .../addon/primary/ExternalPrimaryStorageFactory.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java index f39e7bf60bb..60850fe08c9 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java @@ -244,18 +244,16 @@ public String allocateSpaceDryRun(AllocatePrimaryStorageSpaceMsg msg, PrimarySto return psInv.getUrl(); } - ExternalPrimaryStorageSpaceCapacityHelper helper = new ExternalPrimaryStorageSpaceCapacityHelper(psInv.getUuid(), controller.getIdentity()); - String requiredUrl = getRequiredUrl(helper, msg); - // TODO: remove it if (!controller.reportCapabilities().isSupportMultiSpace()) { AllocateSpaceSpec aspec = new AllocateSpaceSpec(); aspec.setDryRun(true); aspec.setSize(msg.getSize()); - aspec.setRequiredUrl(requiredUrl); return controller.allocateSpace(aspec); } + ExternalPrimaryStorageSpaceCapacityHelper helper = new ExternalPrimaryStorageSpaceCapacityHelper(psInv.getUuid(), controller.getIdentity()); + String requiredUrl = getRequiredUrl(helper, msg); if (requiredUrl != null) { if (msg.isForce() || helper.checkVirtualSizeByRatio(requiredUrl, msg.getSize())) { return requiredUrl; From b7572d5c0884db36a087b6824d6ac1709b7f9dbd Mon Sep 17 00:00:00 2001 From: J M Date: Thu, 15 Jan 2026 12:00:37 +0800 Subject: [PATCH 690/737] [storage]: bypass space helper when multi space not support use factory for different storage later Resolves: ZSTAC-81333 Change-Id: I746c646a6974627a636c7a6b7362736378627876 --- .../addon/primary/ExternalPrimaryStorage.java | 14 ++++++++++---- .../ExternalPrimaryStorageSpaceCapacityHelper.java | 10 ++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index 689c2510d93..1a0102c6977 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -1594,8 +1594,11 @@ protected void handle(DeleteVolumeOnPrimaryStorageMsg msg) { trashVolume(msg.getVolume().getInstallPath(), msg.getVolume().getProtocol(), force, new Completion(msg) { @Override public void success() { - ExternalPrimaryStorageSpaceCapacityHelper helper = new ExternalPrimaryStorageSpaceCapacityHelper(self.getUuid(), controller.getIdentity()); - helper.releaseAvailableCapWithRatio(msg.getVolume().getInstallPath(), msg.getVolume().getSize()); + if (controller.reportCapabilities().isSupportMultiSpace()) { + ExternalPrimaryStorageSpaceCapacityHelper helper = new ExternalPrimaryStorageSpaceCapacityHelper(self.getUuid(), controller.getIdentity()); + helper.releaseAvailableCapWithRatio(msg.getVolume().getInstallPath(), msg.getVolume().getSize()); + } + bus.reply(msg, reply); } @@ -1808,8 +1811,11 @@ protected void handle(DeleteSnapshotOnPrimaryStorageMsg msg) { controller.deleteSnapshot(msg.getSnapshot().getPrimaryStorageInstallPath(), new Completion(msg) { @Override public void success() { - ExternalPrimaryStorageSpaceCapacityHelper helper = new ExternalPrimaryStorageSpaceCapacityHelper(self.getUuid(), controller.getIdentity()); - helper.releaseAvailableCapacity(msg.getSnapshot().getPrimaryStorageInstallPath(), msg.getSnapshot().getSize()); + if (controller.reportCapabilities().isSupportMultiSpace()) { + ExternalPrimaryStorageSpaceCapacityHelper helper = new ExternalPrimaryStorageSpaceCapacityHelper(self.getUuid(), controller.getIdentity()); + helper.releaseAvailableCapacity(msg.getSnapshot().getPrimaryStorageInstallPath(), msg.getSnapshot().getSize()); + } + bus.reply(msg, reply); } diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSpaceCapacityHelper.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSpaceCapacityHelper.java index b766789fc43..6bacc9dbfe3 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSpaceCapacityHelper.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageSpaceCapacityHelper.java @@ -51,12 +51,16 @@ public class ExternalPrimaryStorageSpaceCapacityHelper extends ExternalPrimarySt private String spaceName; private Map storageSpacesByUrl; + // TODO: use factory to create helper, diff capabilities helper for diff types + @Deprecated public ExternalPrimaryStorageSpaceCapacityHelper(ExternalPrimaryStorageVO ps) { super(ps); this.primaryStorageUuid = ps.getUuid(); this.spaceName = ps.getIdentity(); } + // TODO: use factory to create helper, diff capabilities helper for diff types + @Deprecated public ExternalPrimaryStorageSpaceCapacityHelper(String psUuid, String identity) { super(psUuid, identity); this.primaryStorageUuid = psUuid; @@ -116,10 +120,8 @@ protected void updateStorageSpace(StorageCapacity cap) { } private ExternalPrimaryStorageSpaceVO getSpaceFromInstallUrl(String installPath) { - Map spacesByUrl = getStorageSpacesByUrl(); - String spaceUrl = spacesByUrl.keySet().stream().filter(installPath::startsWith) - .findFirst().orElseThrow(() -> new OperationFailureException(operr(ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10002, "cannot find storage space for installPath[%s]", installPath))); - return spacesByUrl.get(spaceUrl); + String spaceUrl = getLocationSpaceUrl(installPath); + return getStorageSpacesByUrl().get(spaceUrl); } @DeadlockAutoRestart From 6f33d216223c9c007413c442e88e3c9627b98c60 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Thu, 15 Jan 2026 14:42:35 +0800 Subject: [PATCH 691/737] [sdnController]: add AddSdnControllerMsg DBImpact Resolves: ZSTAC-73622 Change-Id: I667461766363677373636a6e626f70766e736f6f --- .../sdncontroller/SdnControllerVO.java | 2 + .../zstack/sdnController/SdnController.java | 6 +- .../SdnControllerManagerImpl.java | 61 +++++++++++++------ .../h3cVcfc/H3cVcfcSdnController.java | 8 +-- .../h3cVcfc/H3cVcfcV2SdnController.java | 4 +- .../header/AddSdnControllerMsg.java | 31 ++++++++++ .../header/AddSdnControllerReply.java | 16 +++++ .../controller/SugonSdnController.java | 8 +-- 8 files changed, 105 insertions(+), 31 deletions(-) create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/AddSdnControllerMsg.java create mode 100644 plugin/sdnController/src/main/java/org/zstack/sdnController/header/AddSdnControllerReply.java diff --git a/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerVO.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerVO.java index f9a911436d2..8e1848d9225 100644 --- a/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerVO.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerVO.java @@ -1,6 +1,7 @@ package org.zstack.header.network.sdncontroller; import org.zstack.header.identity.OwnedByAccount; +import org.zstack.header.log.NoLogging; import org.zstack.header.vo.BaseResource; import org.zstack.header.vo.NoView; import org.zstack.header.vo.ResourceVO; @@ -40,6 +41,7 @@ public class SdnControllerVO extends ResourceVO implements OwnedByAccount, ToInv private String username; @Column + @NoLogging private String password; @OneToMany(fetch=FetchType.EAGER) diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java index 5de07d899f7..57072cbaa57 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java @@ -13,10 +13,10 @@ public interface SdnController { 对sdn控制器的控制: event 有关sdn控制器的后置处理: post-event */ - void preInitSdnController(APIAddSdnControllerMsg msg, Completion completion); - void createSdnControllerDb(APIAddSdnControllerMsg msg, SdnControllerVO vo, Completion completion); + void preInitSdnController(AddSdnControllerMsg msg, Completion completion); + void createSdnControllerDb(AddSdnControllerMsg msg, SdnControllerVO vo, Completion completion); void deleteSdnControllerDb(SdnControllerVO vo); - void initSdnController(APIAddSdnControllerMsg msg, Completion completion); + void initSdnController(AddSdnControllerMsg msg, Completion completion); void postInitSdnController(SdnControllerVO vo, Completion completion); void deleteSdnController(SdnControllerDeletionMsg msg, SdnControllerInventory sdn, Completion completion); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java index 874f148e9fd..2368fbb95ae 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java @@ -6,6 +6,7 @@ import org.zstack.core.Platform; import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.workflow.FlowChainBuilder; @@ -19,6 +20,7 @@ import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.message.Message; +import org.zstack.header.message.MessageReply; import org.zstack.header.network.NetworkException; import org.zstack.header.network.l2.*; import org.zstack.header.network.l3.*; @@ -81,6 +83,8 @@ public List getAliasIds() { public void handleMessage(Message msg) { if (msg instanceof APIAddSdnControllerMsg) { handle((APIAddSdnControllerMsg) msg); + } else if (msg instanceof AddSdnControllerMsg) { + handle((AddSdnControllerMsg) msg); } else if (msg instanceof SdnControllerMessage) { handleSdnControllerMessage((SdnControllerMessage) msg); } else { @@ -88,6 +92,22 @@ public void handleMessage(Message msg) { } } + private void handle(AddSdnControllerMsg msg) { + AddSdnControllerReply reply = new AddSdnControllerReply(); + doCreateSdnController(msg, new Completion(msg) { + @Override + public void success() { + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } + private void handleSdnControllerMessage(SdnControllerMessage msg) { SdnControllerVO vo = dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class); if (vo == null) { @@ -100,23 +120,23 @@ private void handleSdnControllerMessage(SdnControllerMessage msg) { sdnController.handleMessage(msg); } - private void doCreateSdnController(SdnControllerVO vo, APIAddSdnControllerMsg msg, Completion completion) { - SdnControllerFactory factory = getSdnControllerFactory(msg.getVendorType()); + private void doCreateSdnController(AddSdnControllerMsg msg, Completion completion) { + SdnControllerVO vo = msg.getSdnControllerVO(); + SdnControllerFactory factory = getSdnControllerFactory(vo.getVendorType()); SdnController controller = factory.getSdnController(vo); Map data = new HashMap(); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setData(data); - chain.setName(String.format("create-sdn-controller-%s", msg.getName())); + chain.setName(String.format("create-sdn-controller-%s", vo.getName())); chain.then(new ShareFlow() { @Override public void setup() { flow(new NoRollbackFlow() { - String __name__ = String.format("pre-process-for-create-sdn-controller-%s", msg.getName()); + String __name__ = String.format("pre-process-for-create-sdn-controller-%s", vo.getName()); @Override public void run(FlowTrigger trigger, Map data) { - msg.setResourceUuid(vo.getUuid()); controller.preInitSdnController(msg, new Completion(trigger) { @Override public void success() { @@ -131,7 +151,7 @@ public void fail(ErrorCode errorCode) { } }); flow(new Flow() { - String __name__ = String.format("create-sdn-controller-%s-on-db", msg.getName()); + String __name__ = String.format("create-sdn-controller-%s-on-db", vo.getName()); @Override public void run(FlowTrigger trigger, Map data) { @@ -156,7 +176,7 @@ public void rollback(FlowRollback trigger, Map data) { } }); flow(new Flow() { - String __name__ = String.format("init-sdn-controller-%s", msg.getName()); + String __name__ = String.format("init-sdn-controller-%s", vo.getName()); @Override public void run(FlowTrigger trigger, Map data) { @@ -180,7 +200,7 @@ public void rollback(FlowRollback trigger, Map data) { } }); flow(new NoRollbackFlow() { - String __name__ = String.format("post-process-for-create-sdn-controller--%s", msg.getName()); + String __name__ = String.format("post-process-for-create-sdn-controller-%s", vo.getName()); @Override public void run(FlowTrigger trigger, Map data) { @@ -239,17 +259,22 @@ private void handle(APIAddSdnControllerMsg msg) { } vo.setStatus(SdnControllerStatus.Connected); - doCreateSdnController(vo, msg, new Completion(msg) { - @Override - public void success() { - tagMgr.createTagsFromAPICreateMessage(msg, vo.getUuid(), SdnControllerVO.class.getSimpleName()); - event.setInventory(SdnControllerInventory.valueOf(dbf.findByUuid(vo.getUuid(), SdnControllerVO.class))); - bus.publish(event); - } - + AddSdnControllerMsg amsg = new AddSdnControllerMsg(); + amsg.setSdnControllerVO(vo); + amsg.setAccountUuid(msg.getSession().getAccountUuid()); + if (msg.getSystemTags() != null) { + amsg.setSystemTags(msg.getSystemTags()); + } + bus.makeTargetServiceIdByResourceUuid(amsg, SdnControllerConstant.SERVICE_ID, vo.getUuid()); + bus.send(amsg, new CloudBusCallBack(amsg) { @Override - public void fail(ErrorCode errorCode) { - event.setError(errorCode); + public void run(MessageReply reply) { + if (reply.isSuccess()) { + tagMgr.createTagsFromAPICreateMessage(msg, vo.getUuid(), SdnControllerVO.class.getSimpleName()); + event.setInventory(SdnControllerInventory.valueOf(dbf.findByUuid(vo.getUuid(), SdnControllerVO.class))); + } else { + event.setError(reply.getError()); + } bus.publish(event); } }); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java index 711d682eb40..7f2ffeb206b 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java @@ -162,7 +162,7 @@ private void getH3cDefaultTenant(Completion completion) { } } - private void getH3cParameters(APIAddSdnControllerMsg msg, Completion completion) { + private void getH3cParameters(AddSdnControllerMsg msg, Completion completion) { FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); chain.setName(String.format("get-h3c-parameters-%s", self.getIp())); chain.then(new NoRollbackFlow() { @@ -236,12 +236,12 @@ public void handleMessage(SdnControllerMessage msg) { @Override @SdnControllerLog - public void preInitSdnController(APIAddSdnControllerMsg msg, Completion completion) { + public void preInitSdnController(AddSdnControllerMsg msg, Completion completion) { completion.success(); } @Override - public void createSdnControllerDb(APIAddSdnControllerMsg msg, SdnControllerVO vo, Completion completion) { + public void createSdnControllerDb(AddSdnControllerMsg msg, SdnControllerVO vo, Completion completion) { dbf.persist(vo); completion.success(); } @@ -253,7 +253,7 @@ public void deleteSdnControllerDb(SdnControllerVO vo) { @Override @SdnControllerLog - public void initSdnController(APIAddSdnControllerMsg msg, Completion completion) { + public void initSdnController(AddSdnControllerMsg msg, Completion completion) { getH3cControllerToken(new Completion(completion) { @Override public void success() { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java index 78e2f7e3cbb..261f2d43bc0 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java @@ -142,7 +142,7 @@ public void fail(ErrorCode errorCode) { @Override @SdnControllerLog - public void initSdnController(APIAddSdnControllerMsg msg, Completion completion) { + public void initSdnController(AddSdnControllerMsg msg, Completion completion) { getH3cControllerToken(new Completion(completion) { @Override public void success() { @@ -336,7 +336,7 @@ public void getH3cVniRanges(Completion completion) { } } - private void getH3cParameters(APIAddSdnControllerMsg msg, Completion completion) { + private void getH3cParameters(AddSdnControllerMsg msg, Completion completion) { FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); chain.setName(String.format("get-h3c-parameters-%s", self.getIp())); chain.then(new NoRollbackFlow() { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/AddSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/AddSdnControllerMsg.java new file mode 100644 index 00000000000..044b0a22e0f --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/AddSdnControllerMsg.java @@ -0,0 +1,31 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; +import org.zstack.header.network.sdncontroller.SdnControllerVO; + +public class AddSdnControllerMsg extends NeedReplyMessage implements SdnControllerMessage { + SdnControllerVO sdnControllerVO; + String accountUuid; + + @Override + public String getSdnControllerUuid() { + return sdnControllerVO.getUuid(); + } + + public SdnControllerVO getSdnControllerVO() { + return sdnControllerVO; + } + + public void setSdnControllerVO(SdnControllerVO sdnControllerVO) { + this.sdnControllerVO = sdnControllerVO; + } + + public String getAccountUuid() { + return accountUuid; + } + + public void setAccountUuid(String accountUuid) { + this.accountUuid = accountUuid; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/AddSdnControllerReply.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/AddSdnControllerReply.java new file mode 100644 index 00000000000..a73448fdfe5 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/AddSdnControllerReply.java @@ -0,0 +1,16 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.MessageReply; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; + +public class AddSdnControllerReply extends MessageReply { + private SdnControllerInventory inventory; + + public SdnControllerInventory getInventory() { + return inventory; + } + + public void setInventory(SdnControllerInventory inventory) { + this.inventory = inventory; + } +} diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java index b428116d302..976ad9829c5 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java @@ -84,7 +84,7 @@ void handMessage(SdnControllerUpdateDHCPMsg msg) { } @Override - public void preInitSdnController(APIAddSdnControllerMsg msg, Completion completion) { + public void preInitSdnController(AddSdnControllerMsg msg, Completion completion) { try { long count = Q.New(SdnControllerVO.class).eq(SdnControllerVO_.vendorType, SugonSdnControllerConstant.TF_CONTROLLER).count(); if(count > 0) { @@ -97,7 +97,7 @@ public void preInitSdnController(APIAddSdnControllerMsg msg, Completion completi return; } String accountUuid = StringDSL.transToTfUuid(accountVO.getUuid()); - client = new TfHttpClient(msg.getIp()); + client = new TfHttpClient(msg.getSdnControllerVO().getIp()); Domain domain = (Domain) client.getDomain(); if(domain == null){ completion.fail(operr(ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10002, "get default domain on tf controller failed")); @@ -129,7 +129,7 @@ public void preInitSdnController(APIAddSdnControllerMsg msg, Completion completi } @Override - public void createSdnControllerDb(APIAddSdnControllerMsg msg, SdnControllerVO vo, Completion completion) { + public void createSdnControllerDb(AddSdnControllerMsg msg, SdnControllerVO vo, Completion completion) { dbf.persist(vo); completion.success(); } @@ -140,7 +140,7 @@ public void deleteSdnControllerDb(SdnControllerVO vo) { } @Override - public void initSdnController(APIAddSdnControllerMsg msg, Completion completion) { + public void initSdnController(AddSdnControllerMsg msg, Completion completion) { completion.success(); } From 5b39a87ad69a6fd1b119e1af8d0863a37adf8723 Mon Sep 17 00:00:00 2001 From: shenjin Date: Thu, 15 Jan 2026 11:32:42 +0800 Subject: [PATCH 692/737] [kvm]: Add vmPciDeviceAddress field for better tracking - Add vmPciDeviceAddress field to PciDeviceVO - Set vmPciDeviceAddress when loading PCI device to VM - Clear vmPciDeviceAddress when unloading PCI device - Update vmPciDeviceAddress during host reconnection - Add mdevDeviceAddress field to MdevDeviceVO Resolves: ZSTAC-67275 Change-Id: I67626e67787062616679786b6576636c73747477 --- conf/db/upgrade/V5.5.6__schema.sql | 5 ++++- .../java/org/zstack/kvm/KVMAgentCommands.java | 20 +++++++++++++++++++ .../org/zstack/sdk/PciDeviceInventory.java | 8 ++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/conf/db/upgrade/V5.5.6__schema.sql b/conf/db/upgrade/V5.5.6__schema.sql index 33d571439b8..69eee484a0e 100644 --- a/conf/db/upgrade/V5.5.6__schema.sql +++ b/conf/db/upgrade/V5.5.6__schema.sql @@ -2,4 +2,7 @@ ALTER TABLE `GuestVmScriptExecutedRecordDetailVO` MODIFY `stdout` MEDIUMTEXT CHARACTER SET `utf8mb4` COLLATE `utf8mb4_unicode_ci`; ALTER TABLE `GuestVmScriptExecutedRecordDetailVO` - MODIFY `stderr` MEDIUMTEXT CHARACTER SET `utf8mb4` COLLATE `utf8mb4_unicode_ci`; \ No newline at end of file + MODIFY `stderr` MEDIUMTEXT CHARACTER SET `utf8mb4` COLLATE `utf8mb4_unicode_ci`; + +CALL ADD_COLUMN('PciDeviceVO', 'vmPciDeviceAddress', 'varchar(32)', 1, NULL); +CALL ADD_COLUMN('MdevDeviceVO', 'mdevDeviceAddress', 'varchar(32)', 1, NULL); diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index c023774c968..50fe295f2d4 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -2914,6 +2914,10 @@ public static class VmDevicesInfoResponse extends AgentResponse { private VirtualDeviceInfo memBalloonInfo; @GrayVersion(value = "5.0.0") private VirtualizerInfoTO virtualizerInfo; + @GrayVersion(value = "5.5.6") + private Map pciDeviceInfos; + @GrayVersion(value = "5.5.6") + private Map mdevDeviceInfos; public VirtualDeviceInfo getMemBalloonInfo() { return memBalloonInfo; @@ -2946,6 +2950,22 @@ public VirtualizerInfoTO getVirtualizerInfo() { public void setVirtualizerInfo(VirtualizerInfoTO virtualizerInfo) { this.virtualizerInfo = virtualizerInfo; } + + public Map getPciDeviceInfos() { + return pciDeviceInfos; + } + + public void setPciDeviceInfos(Map pciDeviceInfos) { + this.pciDeviceInfos = pciDeviceInfos; + } + + public Map getMdevDeviceInfos() { + return mdevDeviceInfos; + } + + public void setMdevDeviceInfos(Map mdevDeviceInfos) { + this.mdevDeviceInfos = mdevDeviceInfos; + } } public static class SyncVmDeviceInfoCmd extends AgentCommand { diff --git a/sdk/src/main/java/org/zstack/sdk/PciDeviceInventory.java b/sdk/src/main/java/org/zstack/sdk/PciDeviceInventory.java index 06e7e5885c4..a695b6c1b26 100644 --- a/sdk/src/main/java/org/zstack/sdk/PciDeviceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/PciDeviceInventory.java @@ -193,6 +193,14 @@ public java.lang.String getDependentDevices() { return this.dependentDevices; } + public java.lang.String vmPciDeviceAddress; + public void setVmPciDeviceAddress(java.lang.String vmPciDeviceAddress) { + this.vmPciDeviceAddress = vmPciDeviceAddress; + } + public java.lang.String getVmPciDeviceAddress() { + return this.vmPciDeviceAddress; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; From 9bc0f00659c393bef1a05724ef4800c07d8de937 Mon Sep 17 00:00:00 2001 From: J M Date: Thu, 15 Jan 2026 14:32:17 +0800 Subject: [PATCH 693/737] [storage]: fix single space storage image cache check Resolves: ZSTAC-81338 Change-Id: I71686f716a66726b6362786c6f78656d65666867 (cherry picked from commit c90da0136d02db8e9e44b4008a136abf6754845a) --- .../storage/addon/primary/ExternalPrimaryStorage.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index 689c2510d93..7c8da1aed67 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -1219,6 +1219,12 @@ private void doDownloadImageCache(ImageInventory image, String allocatedUrl, Ret .eq(ImageCacheVO_.imageUuid, image.getUuid()) .list(); + if (!controller.reportCapabilities().isSupportMultiSpace() && !caches.isEmpty()) { + // TODO check exists in ps + completion.success(caches.get(0).toInventory()); + return; + } + for (ImageCacheVO cache : caches) { ImageCacheInventory inv = cache.toInventory(); // TODO: suppose that path always starts with allocatedUrl From c25f4ea3baaef8805b978e013dcc139ffe28f96a Mon Sep 17 00:00:00 2001 From: "dejing.liu" Date: Thu, 15 Jan 2026 15:25:01 +0800 Subject: [PATCH 694/737] [kvm]: force virtio driver for windows vhostuser nic The vhost-user interface (used by OVS-DPDK) strictly requires the 'virtio-net' frontend driver in Libvirt/QEMU. However, ZStack defaults Windows NIC drivers to 'e1000' (or other emulated models) when the image platform is 'Windows', causing VM start failure with Libvirt error: "vhostuser requires the virtio-net* frontend". This fix forces the NIC driver to 'virtio' specifically when the interface type is 'vhostuser' on Windows platforms, regardless of the default platform settings. Satisfying both the legacy boot requirements of Windows and the vhost-user network requirements. Resolves: ZSTAC-76013 Change-Id: I737a6e637273796d776e726e7969786c7a6a6478 --- .../kvm/src/main/java/org/zstack/kvm/KVMHost.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 558aded6380..a8d129378dc 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -4517,6 +4517,21 @@ protected void startVm(final VmInstanceSpec spec, final NeedReplyMessage msg, fi } nics = nics.stream().sorted(Comparator.comparing(NicTO::getDeviceId)).collect(Collectors.toList()); cmd.setNics(nics); + if ((platform.equals(ImagePlatform.Windows.toString()) || + platform.equals(ImagePlatform.WindowsVirtio.toString()))) { + if (cmd.getNics() != null) { + for (NicTO nicTo : cmd.getNics()) { + if (nicTo.getType() != null && + nicTo.getType().toLowerCase().contains(VmNicType.VmNicSubType.VHOSTUSER.toString().toLowerCase()) && + !VmNicDriverType.VIRTIO.toString().equalsIgnoreCase(nicTo.getDriverType())) { + logger.warn(String.format("Force updating nic[%s] driver from [%s] to [virtio] for " + + "Windows vhostuser compatibility.", + nicTo.getUuid(), nicTo.getDriverType())); + nicTo.setDriverType(VmNicDriverType.VIRTIO.toString()); + } + } + } + } for (VmInstanceSpec.CdRomSpec cdRomSpec : spec.getCdRomSpecs()) { CdRomTO cdRomTO = new CdRomTO(); From edb24261dc8c35a76fba7b6470b714d32319eca5 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 19 Jan 2026 14:24:51 +0800 Subject: [PATCH 695/737] [sdk]: Modify model id of ModelVO DBImpact Resolves: ZSTAC-81290 Change-Id: I65726a626f6d6d6d7a7a716f6578656a65776c71 --- conf/db/upgrade/V5.5.6__schema.sql | 8 ++++++++ sdk/src/main/java/org/zstack/sdk/AddModelAction.java | 3 +++ sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java | 3 +++ 3 files changed, 14 insertions(+) diff --git a/conf/db/upgrade/V5.5.6__schema.sql b/conf/db/upgrade/V5.5.6__schema.sql index 69eee484a0e..4b92ec28fb8 100644 --- a/conf/db/upgrade/V5.5.6__schema.sql +++ b/conf/db/upgrade/V5.5.6__schema.sql @@ -6,3 +6,11 @@ ALTER TABLE `GuestVmScriptExecutedRecordDetailVO` CALL ADD_COLUMN('PciDeviceVO', 'vmPciDeviceAddress', 'varchar(32)', 1, NULL); CALL ADD_COLUMN('MdevDeviceVO', 'mdevDeviceAddress', 'varchar(32)', 1, NULL); + +-- Add index for modelId field to support duplicate checking +-- Use CREATE_INDEX procedure (defined in beforeMigrate.sql) for idempotent operation +CALL CREATE_INDEX('ModelVO', 'idx_modelId', 'modelId'); + +-- Upgrade existing data: set modelId to uuid if modelId is NULL +-- This UPDATE is idempotent: WHERE clause ensures only NULL values are updated +UPDATE ModelVO SET modelId = uuid WHERE modelId IS NULL; diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelAction.java index d05730e861d..993a073b9c3 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddModelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddModelAction.java @@ -67,6 +67,9 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 512, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String gpuConstraintDescription; + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelId; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java index 108cfa2e382..d8a6de859d9 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java @@ -52,6 +52,9 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 512, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String gpuConstraintDescription; + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelId; + @Param(required = false) public java.util.List systemTags; From 4dc0ea05424d5216ff91791f260b9bb24172365e Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Thu, 18 Dec 2025 21:15:45 +0800 Subject: [PATCH 696/737] [sdk]: Introduce go sdk Add complete Go SDK generator that automatically generates type-safe client code from ZStack Java API definitions. Resolves: ZCF-22 Change-Id: I6162766579786f756d7466697976687163767276 Signed-off-by: AlanJager --- .../resources/scripts/GoApiTemplate.groovy | 1265 +++++++++- .../main/resources/scripts/GoInventory.groovy | 2116 ++++++++++++++++- ...00\345\217\221\346\214\207\345\215\227.md" | 935 ++++++++ ...03\344\270\216\346\240\207\345\207\206.md" | 1096 +++++++++ .../templates/base_param_types.go.template | 45 + .../scripts/templates/base_params.go.template | 102 + .../scripts/templates/client.go.template | 674 ++++++ .../scripts/templates/example_main.go | 110 + .../templates/login_params.go.template | 55 + .../session_additional_views.go.template | 26 + .../templates/session_views.go.template | 26 + 11 files changed, 6306 insertions(+), 144 deletions(-) create mode 100644 "rest/src/main/resources/scripts/SDK\347\224\237\346\210\220\345\231\250\345\274\200\345\217\221\346\214\207\345\215\227.md" create mode 100644 "rest/src/main/resources/scripts/ZStack SDK Go \345\274\200\345\217\221\350\247\204\350\214\203\344\270\216\346\240\207\345\207\206.md" create mode 100644 rest/src/main/resources/scripts/templates/base_param_types.go.template create mode 100644 rest/src/main/resources/scripts/templates/base_params.go.template create mode 100644 rest/src/main/resources/scripts/templates/client.go.template create mode 100644 rest/src/main/resources/scripts/templates/example_main.go create mode 100644 rest/src/main/resources/scripts/templates/login_params.go.template create mode 100644 rest/src/main/resources/scripts/templates/session_additional_views.go.template create mode 100644 rest/src/main/resources/scripts/templates/session_views.go.template diff --git a/rest/src/main/resources/scripts/GoApiTemplate.groovy b/rest/src/main/resources/scripts/GoApiTemplate.groovy index 31079a2b4e7..9212129e958 100644 --- a/rest/src/main/resources/scripts/GoApiTemplate.groovy +++ b/rest/src/main/resources/scripts/GoApiTemplate.groovy @@ -1,13 +1,21 @@ package scripts -import org.apache.commons.lang.StringUtils -import org.zstack.header.identity.SuppressCredentialCheck +import org.zstack.header.query.APIQueryMessage import org.zstack.header.rest.RestRequest import org.zstack.rest.sdk.SdkFile import org.zstack.rest.sdk.SdkTemplate +import org.zstack.utils.Utils +import org.zstack.utils.logging.CLogger +import java.lang.reflect.Field +import java.lang.reflect.ParameterizedType +import java.lang.reflect.Type +/** + * Go SDK API Template Generator + */ class GoApiTemplate implements SdkTemplate { + private static final CLogger logger = Utils.getLogger(GoApiTemplate.class) private Class apiMsgClazz private RestRequest at private String path @@ -15,99 +23,1222 @@ class GoApiTemplate implements SdkTemplate { private String replyName private SdkTemplate inventoryGenerator + private String actionType + private String resourceName + private String clzName + + // For Query APIs, store the inventory class + private Class queryInventoryClass + // Store the field name of the inventory in the response class (e.g. "inventory", "vmInventory") + private String inventoryFieldName + + // Track if different parts of the API have been grouped into consolidated files + boolean isActionGrouped = false + boolean isViewGrouped = false + boolean isParamGrouped = false + + // Track generated files to avoid duplicates + private static Set generatedParamFiles = new HashSet<>() + private static Set generatedActionFiles = new HashSet<>() + private static Set generatedViewFiles = new HashSet<>() + + // Track known inventory classes for validation + private static Set> knownInventoryClasses = null + + // Track APIs that have been grouped by GoInventory to avoid individual file generation + static Set groupedApiNames = new HashSet<>() + + // LongJob mappings (provided by GoInventory) + private static Map longJobMappings = new HashMap<>() + + // Track APIs that should be skipped during generation + private static Set skippedApis = new HashSet<>() + GoApiTemplate(Class apiMsgClass, SdkTemplate inventoryGenerator) { - apiMsgClazz = apiMsgClass - this.inventoryGenerator = inventoryGenerator - at = apiMsgClazz.getAnnotation(RestRequest.class) - if (at.path() == "null") { - path = at.optionalPaths()[0] - }else { - path = at.path() + try { + apiMsgClazz = apiMsgClass + this.inventoryGenerator = inventoryGenerator + at = apiMsgClazz.getAnnotation(RestRequest.class) + if (at == null) { + logger.warn("[GoSDK] Class ${apiMsgClazz.name} is missing @RestRequest annotation") + return + } + + String rawPath = at.path() + if (rawPath == null || rawPath == "null") { + String[] opts = at.optionalPaths() + if (opts != null && opts.length > 0) { + path = opts[0] + } else { + logger.warn("[GoSDK] API ${apiMsgClazz.name} has no path or optionalPaths") + path = "/unknown" + } + } else { + path = rawPath + } + + responseClass = at.responseClass() + if (responseClass == null || responseClass == org.zstack.header.rest.RestResponse.class) { + org.zstack.header.rest.RestResponse res = apiMsgClazz.getAnnotation(org.zstack.header.rest.RestResponse.class) + if (res != null) { + responseClass = res.value() + } + } + + if (responseClass != null) { + replyName = responseClass.simpleName.replaceAll('^API', '').replaceAll('Reply$', '').replaceAll('Event$', '') + } else { + logger.warn("[GoSDK] Could not determine responseClass for " + apiMsgClazz.name) + replyName = "UnknownResponse" + } + + // Only strip API prefix and Msg suffix, keep Action to avoid name collisions + // e.g. APIQueryMonitorTriggerActionMsg -> QueryMonitorTriggerAction + clzName = apiMsgClazz.simpleName.replaceAll('^API', '').replaceAll('Msg$', '') + + parseActionAndResource() + logger.warn("[GoSDK] Parsed API: ${apiMsgClazz.simpleName} -> Action=${actionType}, Resource=${resourceName}") + + // Find the inventory class if available (for both Query and Action APIs) + queryInventoryClass = findInventoryClass() + + logger.warn("[GoSDK] Processing API: " + clzName + " -> action=" + actionType + ", resource=" + resourceName + ", response=" + responseClass?.simpleName) + } catch (Throwable e) { + logger.error("[GoSDK] CRITICAL ERROR constructing GoApiTemplate for ${apiMsgClass.name}: ${e.class.name}: ${e.message}", e) + throw e + } + } + + RestRequest getAt() { + return at + } + + String getActionType() { + return actionType + } + + String getResourceName() { + return resourceName + } + + Class getQueryInventoryClass() { + return queryInventoryClass + } + + Class getResponseClass() { + return responseClass + } + + /** + * Return all client method names this template may emit, for deduplication. + */ + Set getGeneratedMethodNames() { + def names = new LinkedHashSet() + names.add(clzName) + + // Query APIs always generate both Get and Page helpers + if (isQueryMessage()) { + String getMethodName = clzName.replaceFirst('^Query', 'Get') + names.add(getMethodName) + + String pageMethodName = clzName.replaceFirst('^Query', 'Page') + names.add(pageMethodName) + } + + if (supportsAsync() && shouldGenerateAsync()) { + names.add("${clzName}Async") + } + + return names + } + + boolean isQueryMessage() { + return APIQueryMessage.class.isAssignableFrom(apiMsgClazz) + } + + Class getApiMsgClazz() { + return apiMsgClazz + } + + String getParamStructName() { + return clzName + "Param" + } + + String getDetailParamStructName() { + return clzName + "ParamDetail" + } + + /** + * Set known inventory classes for validation + */ + static void setKnownInventoryClasses(Set> inventories) { + knownInventoryClasses = inventories + logger.warn("[GoSDK] Registered " + (inventories?.size() ?: 0) + " inventory classes") + } + + /** + * Set LongJob mappings (called by GoInventory) + */ + static void setLongJobMappings(Map mappings) { + longJobMappings = mappings + logger.warn("[GoSDK] Registered ${mappings.size()} LongJob mappings") + } + + /** + * Check if current API supports async operation + */ + private boolean supportsAsync() { + if (apiMsgClazz == null) return false + return longJobMappings.containsKey(apiMsgClazz) + } + + /** + * Get list of skipped APIs + */ + static Set getSkippedApis() { + return skippedApis + } + + /** + * Check if a view class is available + */ + private boolean isViewAvailable(Class viewClass) { + if (viewClass == null) { + return false + } + // Check if it's an Inventory class or a Reply class + if (knownInventoryClasses != null && knownInventoryClasses.contains(viewClass)) { + return true + } + // Reply classes should always be available as we generate them + if (viewClass.simpleName.endsWith("Reply") || viewClass.simpleName.endsWith("Event")) { + return true } - responseClass = at.responseClass() - replyName = StringUtils.removeStart(responseClass.simpleName, "API") + return false + } + + private Class findInventoryClass() { + inventoryFieldName = null + if (responseClass == null) return null + + logger.debug("[GoSDK] Finding inventory class for API: " + clzName + " (response=" + responseClass?.simpleName + ")") + + try { + // 1. Try to find 'inventory' field (for single resource return) + try { + Field inventoryField = responseClass.getDeclaredField("inventory") + if (inventoryField != null) { + Class fieldType = inventoryField.getType() + // If inventory is a collection or map, skip unwrap to avoid List/MapView pointer mismatch + if (Collection.class.isAssignableFrom(fieldType) || Map.class.isAssignableFrom(fieldType)) { + logger.warn("[GoSDK] Inventory field for " + clzName + " is a collection/map, skip unwrap") + inventoryFieldName = null + // Try to unwrap generic element/value only if it's a concrete Inventory class + if (inventoryField.getGenericType() instanceof ParameterizedType) { + ParameterizedType pt = (ParameterizedType) inventoryField.getGenericType() + Type[] args = pt.getActualTypeArguments() + if (args != null && args.length > 0) { + Type candidate = args.length > 1 ? args[1] : args[0] + if (candidate instanceof Class && ((Class) candidate).isAnnotationPresent(org.zstack.header.search.Inventory.class)) { + return (Class) candidate + } + } + } + return null + } + logger.warn("[GoSDK] Found inventory field for " + clzName + ": " + fieldType.simpleName) + inventoryFieldName = "inventory" + return fieldType + } + } catch (NoSuchFieldException e) { + // ignore + } + + // 2. Try to find 'inventories' field (for query/list return) + try { + Field inventoriesField = responseClass.getDeclaredField("inventories") + if (inventoriesField != null) { + def genericType = inventoriesField.getGenericType() + if (genericType != null && genericType instanceof ParameterizedType) { + def paramType = (ParameterizedType) genericType + def actualTypes = paramType.getActualTypeArguments() + if (actualTypes != null && actualTypes.length > 0) { + def typeArg = actualTypes[0] + if (typeArg instanceof Class) { + logger.warn("[GoSDK] Found inventories element class for " + clzName + ": " + ((Class) typeArg).simpleName) + return (Class) typeArg + } + } + } + } + } catch (NoSuchFieldException e) { + // ignore + } + } catch (NoSuchFieldException e) { + logger.debug("[GoSDK] No 'inventories' field in " + responseClass?.simpleName) + } catch (Exception e) { + logger.warn("[GoSDK] Error finding inventory class for " + clzName + ": " + e.message) + } + + // Fallback: try to find in known inventories by name + if (resourceName != null && !resourceName.isEmpty() && knownInventoryClasses != null) { + String expectedInventoryName = resourceName + "Inventory" + for (Class inv : knownInventoryClasses) { + if (inv.simpleName == expectedInventoryName) { + logger.warn("[GoSDK] Found inventory by name matching for " + clzName + ": " + inv.simpleName) + return inv + } + } + } + + logger.debug("[GoSDK] Could not find inventory class for API: " + clzName) + return null + } + + private void parseActionAndResource() { + def actionPrefixes = ["Create", "Query", "Get", "Update", "Delete", "Destroy", + "Start", "Stop", "Reboot", "Attach", "Detach", "Change", + "Expunge", "Recover", "Migrate", "Clone", "Resize", "Add", "Remove", + "Allocate", "Apply", "Release", "Deallocate", "Validate", "Sync", "Reconnect", + "Set", "Reset", "Search", "Calculate", "Check", "Refresh", + "Batch", "Login", "Logout", "Register", "Unregister", "Security", "Ack", "Clean", "Bootstrap", "Inspect"] + + for (String prefix : actionPrefixes) { + if (clzName.startsWith(prefix)) { + actionType = prefix + resourceName = clzName.substring(prefix.length()) + + // Further clean resourceName + resourceName = resourceName.replaceAll('Action$', '').replaceAll('Msg$', '') + return + } + } + + // Extended prefixes for better grouping + def extendedPrefixes = ["SNS", "Sns", "Resume", "Migrate", "Locate", "Generate", "Export", "SelfTest", + "Calculate", "Check", "Refresh", "Sync", "Reconnect", "Archive", "Backup", "Revert"] + for (String prefix : extendedPrefixes) { + if (clzName.startsWith(prefix)) { + actionType = prefix + resourceName = clzName.substring(prefix.length()) + resourceName = resourceName.replaceAll('Action$', '').replaceAll('Msg$', '') + return + } + } + + actionType = "" + resourceName = clzName.replaceAll('Action$', '').replaceAll('Msg$', '') + } + + private String toSnakeCase(String name) { + if (name == null || name.isEmpty()) { + return "unknown" + } + return name.replaceAll('([a-z])([A-Z])', '$1_$2').toLowerCase() + } + + private String getApiPath() { + if (path.startsWith("/")) { + return "v1" + path + } + return "v1/" + path } - @Override List generate() { - return generateAction(StringUtils.removeEnd(StringUtils.removeStart(apiMsgClazz.simpleName, "API"), "Msg")) + return [] + } + + /** + * Generate code for the response view struct (Event or Reply). + */ + String generateResponseViewCode() { + if (responseClass == null) return "" + + String viewStructName = inventoryGenerator.getViewStructName(responseClass) + return inventoryGenerator.generateViewStruct(responseClass, viewStructName) + } + + private String generateMethodImplementation(String apiPath, String httpMethod, String viewStructName, boolean isQueryMessage, Set skipNames) { + def builder = new StringBuilder() + boolean skipMain = skipNames?.contains(clzName) + + builder.append("// ${clzName} ${getMethodDescription()}\n") + + // http_client unwraps inventory fields for POST/PUT requests + // Therefore Create/Add/Update/Change calls can return the Inventory View directly + // Only GET calls may need manual unwrapping + boolean unwrapForGet = !isQueryMessage && + queryInventoryClass != null && + viewStructName == inventoryGenerator.getViewStructName(queryInventoryClass) && + responseClass != queryInventoryClass && + inventoryFieldName != null && + (actionType == "Get" || httpMethod == "GET") + + String responseStructName = inventoryGenerator.getViewStructName(responseClass) + String goInventoryFieldName = inventoryFieldName != null ? inventoryFieldName.substring(0, 1).toUpperCase() + inventoryFieldName.substring(1) : "Inventory" + + if (isQueryMessage) { + // Query APIs generate a list method + if (!skipMain) { + builder.append(generateQueryMethod(apiPath, viewStructName)) + } + + // Always generate Get(single) for Query APIs to avoid compile gaps + String getMethodName = clzName.replaceFirst('^Query', 'Get') + // Emit unless explicitly skipped (no clzName equality check) + if (!skipNames.contains(getMethodName)) { + builder.append(generateGetMethodForQuery(apiPath, viewStructName)) + } + + // Generate Page pagination helper for Query APIs + String pageMethodName = clzName.replaceFirst('^Query', 'Page') + if (!skipNames.contains(pageMethodName)) { + builder.append(generatePageMethod(apiPath, viewStructName)) + } + } else { + if (!skipMain) { + switch (actionType) { + case "Create": + case "Add": + // POST does not need unwrapping; return the Inventory View + builder.append(generateCreateMethod(apiPath, viewStructName, false, responseStructName, goInventoryFieldName)) + break + case "Get": + // GET may require unwrapping + builder.append(generateGetMethod(apiPath, viewStructName, unwrapForGet, responseStructName, goInventoryFieldName)) + break + case "Update": + case "Change": + // PUT does not need unwrapping; return the Inventory View + builder.append(generateUpdateMethod(apiPath, viewStructName, false, responseStructName, goInventoryFieldName)) + break + case "Expunge": + // Expunge uses PUT but only returns error + builder.append(generateExpungeMethod(apiPath)) + break + case "Delete": + case "Destroy": + case "Remove": + // Handle real DELETE methods; Expunge uses PUT and falls through to default + if (httpMethod == "DELETE") { + builder.append(generateDeleteMethod(apiPath)) + } else { + // Other HTTP methods (for example Expunge with PUT) use the generic path + boolean unwrapGeneric = (httpMethod == "GET") ? unwrapForGet : false + builder.append(generateGenericMethod(apiPath, httpMethod, viewStructName, unwrapGeneric, responseStructName, goInventoryFieldName)) + } + break + default: + // Generic handling; unwrap is decided by the HTTP method + boolean unwrapGeneric = (httpMethod == "GET") ? unwrapForGet : false + builder.append(generateGenericMethod(apiPath, httpMethod, viewStructName, unwrapGeneric, responseStructName, goInventoryFieldName)) + } + } + + String asyncMethodName = "${clzName}Async" + if (supportsAsync() && shouldGenerateAsync() && !skipNames.contains(asyncMethodName)) { + builder.append(generateAsyncMethod(apiPath, httpMethod, viewStructName)) + } + } + + return builder.toString() + } + + /** + * Public method to generate just the method implementation code. + * Used by GoInventory to consolidate "Other" actions. + */ + String generateMethodCode() { + return generateMethodCode(Collections.emptySet()) + } + + /** + * Generate client method code while skipping provided method names. + */ + String generateMethodCode(Set skipNames) { + String apiPath = getApiPath() + String httpMethod = at.method().toString() + boolean isQuery = isQueryMessage() + + Class targetViewClass = queryInventoryClass != null ? queryInventoryClass : responseClass + String viewStructName = inventoryGenerator.getViewStructName(targetViewClass) + + return generateMethodImplementation(apiPath, httpMethod, viewStructName, isQuery, skipNames ?: Collections.emptySet()) + } + + private String getMethodDescription() { + switch (actionType) { + case "Create": return "creates ${resourceName}" + case "Query": return "queries ${resourceName} list" + case "Get": return "gets ${resourceName} by uuid" + case "Update": return "updates ${resourceName}" + case "Delete": return "deletes ${resourceName}" + case "Destroy": return "destroys ${resourceName}" + case "Start": return "starts ${resourceName}" + case "Stop": return "stops ${resourceName}" + case "Change": return "changes ${resourceName}" + case "Add": return "adds ${resourceName}" + case "Remove": return "removes ${resourceName}" + default: return "operates on ${resourceName}" + } + } + + private String generateCreateMethod(String apiPath, String viewStructName, boolean unwrap, String responseStructName, String fieldName) { + if (unwrap) { + return """func (cli *ZSClient) ${clzName}(params param.${clzName}Param) (*view.${viewStructName}, error) { +\tvar resp view.${responseStructName} +\tif err := cli.Post("${apiPath}", params, &resp); err != nil { +\t\treturn nil, err +\t} +\treturn &resp.${fieldName}, nil +} +""" + } else { + return """func (cli *ZSClient) ${clzName}(params param.${clzName}Param) (*view.${viewStructName}, error) { +\tresp := view.${viewStructName}{} +\tif err := cli.Post("${apiPath}", params, &resp); err != nil { +\t\treturn nil, err +\t} +\treturn &resp, nil +} +""" + } + } + + private String generateQueryMethod(String apiPath, String viewStructName) { + return """func (cli *ZSClient) ${clzName}(params *param.QueryParam) ([]view.${viewStructName}, error) { +\tvar resp []view.${viewStructName} +\treturn resp, cli.List("${apiPath}", params, &resp) +} +""" } - def generateAction(String clzName) { - def f = new SdkFile() - def file = [] - f.subPath = "/api/" - f.fileName = "${clzName}.go" - f.content = """package api + /** + * Generate Page pagination method for Query APIs. + * Derive PageXxx from the QueryXxx resource name. + */ + private String generatePageMethod(String apiPath, String viewStructName) { + String pageMethodName = clzName.replaceFirst('^Query', 'Page') + String varName = resourceName.substring(0, 1).toLowerCase() + resourceName.substring(1) + if (varName.endsWith("y")) { + varName = varName.substring(0, varName.length() - 1) + "ies" + } else if (!varName.endsWith("s")) { + varName = varName + "s" + } + + return """ +// ${pageMethodName} Pagination +func (cli *ZSClient) ${pageMethodName}(params *param.QueryParam) ([]view.${viewStructName}, int, error) { +\tvar ${varName} []view.${viewStructName} +\ttotal, err := cli.Page("${apiPath}", params, &${varName}) +\treturn ${varName}, total, err +} +""" + } + + /** + * Generate Get(uuid) single-resource method for Query APIs. + * Extract the resource portion from Query{Resource}. + */ + private String generateGetMethodForQuery(String apiPath, String viewStructName) { + // Extract {Resource} from Query{Resource} + String getMethodName = clzName.replaceFirst("^Query", "Get") + + // Extract URL placeholders to see if special handling is required + def placeholders = extractUrlPlaceholders(apiPath) + String cleanPath = removePlaceholders(apiPath) + + // If the path has multiple placeholders (for example {category}/{name}), use GetWithSpec + if (placeholders.size() >= 2) { + String params = placeholders.collect { "${toSafeGoParamName(it)} string" }.join(", ") + String firstParam = toSafeGoParamName(placeholders[0]) + def remainingPlaceholders = placeholders.drop(1) + String spec = buildSpecPath(remainingPlaceholders) + + return """ +func (cli *ZSClient) ${getMethodName}(${params}) (*view.${viewStructName}, error) { +\tvar resp view.${viewStructName} +\terr := cli.GetWithSpec("${cleanPath}", ${firstParam}, ${spec}, "", nil, &resp) +\tif err != nil { +\t\treturn nil, err +\t} +\treturn &resp, nil +} +""" + } + + // Standard case: single uuid parameter + return """ +func (cli *ZSClient) ${getMethodName}(uuid string) (*view.${viewStructName}, error) { +\tvar resp view.${viewStructName} +\tif err := cli.Get("${cleanPath}", uuid, nil, &resp); err != nil { +\t\treturn nil, err +\t} +\treturn &resp, nil +} +""" + } + + private String generateGetMethod(String apiPath, String viewStructName, boolean unwrap, String responseStructName, String fieldName) { + // Extract URL placeholders + def placeholders = extractUrlPlaceholders(apiPath) + String cleanPath = removePlaceholders(apiPath) -import ( - "encoding/json" - mapstruct "github.com/mitchellh/mapstructure" - log "github.com/sirupsen/logrus" -) + // Only use GetWithSpec when there are two or more placeholders + boolean useSpec = placeholders.size() >= 2 -const ( - ${clzName}Path = "${path}" - ${clzName}Method = "${at.method()}" - ${clzName}SuppressCredentialCheck = ${apiMsgClazz.isAnnotationPresent(SuppressCredentialCheck.class)} -) + if (unwrap) { + if (!useSpec) { + // Single or no placeholder: use the standard Get method + return """func (cli *ZSClient) ${clzName}(uuid string) (*view.${viewStructName}, error) { +\tvar resp view.${responseStructName} +\tif err := cli.Get("${cleanPath}", uuid, nil, &resp); err != nil { +\t\treturn nil, err +\t} +\treturn &resp.${fieldName}, nil +} +""" + } else { + // Multiple placeholders: use GetWithSpec + // First placeholder is the resourceId; the rest form the spec + String firstParam = toSafeGoParamName(placeholders[0]) + def remainingPlaceholders = placeholders.drop(1) + String params = placeholders.collect { "${toSafeGoParamName(it)} string" }.join(", ") + String spec = buildSpecPath(remainingPlaceholders) + + return """func (cli *ZSClient) ${clzName}(${params}) (*view.${viewStructName}, error) { +\tvar resp view.${responseStructName} +\terr := cli.GetWithSpec("${cleanPath}", ${firstParam}, ${spec}, "", nil, &resp) +\tif err != nil { +\t\treturn nil, err +\t} +\treturn &resp.${fieldName}, nil +} +""" + } + } else { + if (!useSpec) { + // Single or no placeholder: use the standard Get method + return """func (cli *ZSClient) ${clzName}(uuid string) (*view.${viewStructName}, error) { +\tvar resp view.${viewStructName} +\tif err := cli.Get("${cleanPath}", uuid, nil, &resp); err != nil { +\t\treturn nil, err +\t} +\treturn &resp, nil +} +""" + } else { + // Multiple placeholders: use GetWithSpec + // First placeholder is the resourceId; the rest form the spec + String firstParam = toSafeGoParamName(placeholders[0]) + def remainingPlaceholders = placeholders.drop(1) + String params = placeholders.collect { "${toSafeGoParamName(it)} string" }.join(", ") + String spec = buildSpecPath(remainingPlaceholders) + + return """func (cli *ZSClient) ${clzName}(${params}) (*view.${viewStructName}, error) { +\tvar resp view.${viewStructName} +\terr := cli.GetWithSpec("${cleanPath}", ${firstParam}, ${spec}, "", nil, &resp) +\tif err != nil { +\t\treturn nil, err +\t} +\treturn &resp, nil +} +""" + } + } + } + + private String generateUpdateMethod(String apiPath, String viewStructName, boolean unwrap, String responseStructName, String fieldName) { + // Extract URL placeholders + def placeholders = extractUrlPlaceholders(apiPath) + String cleanPath = removePlaceholders(apiPath) + + // Determine whether this is an Action API (isAction=true or path ends with /actions) + boolean isActionApi = at.isAction() || apiPath.endsWith("/actions") + + // Only use PutWithSpec when there are two or more placeholders + boolean useSpec = placeholders.size() >= 2 + + // Resolve the action key (map key for Action APIs) + // Prefer @RestRequest.parameterName, otherwise derive from class name + String actionKey + if (isActionApi) { + if (at.parameterName() != null && !at.parameterName().isEmpty() && !at.parameterName().equals("null")) { + actionKey = at.parameterName() + } else { + def apiClassName = apiMsgClazz.simpleName + def actionName = apiClassName.replaceAll('^API', '').replaceAll('Msg$', '') + actionKey = actionName.substring(0, 1).toLowerCase() + actionName.substring(1) + } + } -${inventoryGenerator.generateStruct(apiMsgClazz, clzName + "Struct")} + if (unwrap) { + if (!useSpec) { + if (placeholders.size() == 1) { + // Single placeholder pulled from the path parameter + String paramName = toSafeGoParamName(placeholders[0]) + if (isActionApi) { + // Action APIs wrap params.Params inside a map + return """func (cli *ZSClient) ${clzName}(${paramName} string, params param.${clzName}Param) (*view.${viewStructName}, error) { +\tvar resp view.${responseStructName} +\tif err := cli.Put("${cleanPath}", ${paramName}, map[string]interface{}{ +\t\t"${actionKey}": params.Params, +\t}, &resp); err != nil { +\t\treturn nil, err +\t} +\treturn &resp.${fieldName}, nil +} +""" + } else { + return """func (cli *ZSClient) ${clzName}(${paramName} string, params param.${clzName}Param) (*view.${viewStructName}, error) { +\tvar resp view.${responseStructName} +\tif err := cli.Put("${cleanPath}", ${paramName}, params, &resp); err != nil { +\t\treturn nil, err +\t} +\treturn &resp.${fieldName}, nil +} +""" + } + } else { + // No placeholder: use the standard Put method (uuid required) + if (isActionApi) { + return """func (cli *ZSClient) ${clzName}(uuid string, params param.${clzName}Param) (*view.${viewStructName}, error) { +\tvar resp view.${responseStructName} +\tif err := cli.Put("${cleanPath}", uuid, map[string]interface{}{ +\t\t"${actionKey}": params.Params, +\t}, &resp); err != nil { +\t\treturn nil, err +\t} +\treturn &resp.${fieldName}, nil +} +""" + } else { + return """func (cli *ZSClient) ${clzName}(uuid string, params param.${clzName}Param) (*view.${viewStructName}, error) { +\tvar resp view.${responseStructName} +\tif err := cli.Put("${cleanPath}", uuid, params, &resp); err != nil { +\t\treturn nil, err +\t} +\treturn &resp.${fieldName}, nil +} +""" + } + } + } else { + // Multiple placeholders: use PutWithSpec + // First placeholder is the resourceId; the rest form the spec + String firstParam = toSafeGoParamName(placeholders[0]) + def remainingPlaceholders = placeholders.drop(1) + String params = placeholders.collect { "${toSafeGoParamName(it)} string" }.join(", ") + String spec = buildSpecPath(remainingPlaceholders) -${StringUtils.removeEnd(inventoryGenerator.generateStruct(responseClass, clzName + "Rsp"),"}\n\n")} - Error ErrorCode `json:"error"` + return """func (cli *ZSClient) ${clzName}(${params}, params param.${clzName}Param) (*view.${viewStructName}, error) { +\tvar resp view.${responseStructName} +\terr := cli.PutWithSpec("${cleanPath}", ${firstParam}, ${spec}, "", params, &resp) +\tif err != nil { +\t\treturn nil, err +\t} +\treturn &resp.${fieldName}, nil } +""" + } + } else { + // Variables already declared at method level, no need to redeclare -type ${clzName}Req struct { - ${clzName} ${clzName}Struct `json:"${at.isAction() ? StringUtils.uncapitalize(clzName) : at.parameterName()}"` + if (!useSpec) { + if (placeholders.size() == 1) { + // Single placeholder pulled from the path parameter + String paramName = toSafeGoParamName(placeholders[0]) + if (isActionApi) { + // Action APIs wrap params.Params inside a map + return """func (cli *ZSClient) ${clzName}(${paramName} string, params param.${clzName}Param) (*view.${viewStructName}, error) { +\tresp := view.${viewStructName}{} +\tif err := cli.Put("${cleanPath}", ${paramName}, map[string]interface{}{ +\t\t"${actionKey}": params.Params, +\t}, &resp); err != nil { +\t\treturn nil, err +\t} +\treturn &resp, nil +} +""" + } else { + return """func (cli *ZSClient) ${clzName}(${paramName} string, params param.${clzName}Param) (*view.${viewStructName}, error) { +\tresp := view.${viewStructName}{} +\tif err := cli.Put("${cleanPath}", ${paramName}, params, &resp); err != nil { +\t\treturn nil, err +\t} +\treturn &resp, nil +} +""" + } + } else { + // No placeholder: use the standard Put method (uuid required) + if (isActionApi) { + return """func (cli *ZSClient) ${clzName}(uuid string, params param.${clzName}Param) (*view.${viewStructName}, error) { +\tresp := view.${viewStructName}{} +\tif err := cli.Put("${cleanPath}", uuid, map[string]interface{}{ +\t\t"${actionKey}": params.Params, +\t}, &resp); err != nil { +\t\treturn nil, err +\t} +\treturn &resp, nil +} +""" + } else { + return """func (cli *ZSClient) ${clzName}(uuid string, params param.${clzName}Param) (*view.${viewStructName}, error) { +\tresp := view.${viewStructName}{} +\tif err := cli.Put("${cleanPath}", uuid, params, &resp); err != nil { +\t\treturn nil, err +\t} +\treturn &resp, nil } +""" + } + } + } else { + // Multiple placeholders: use PutWithSpec + // First placeholder is the resourceId; the rest form the spec + String firstParam = toSafeGoParamName(placeholders[0]) + def remainingPlaceholders = placeholders.drop(1) + String params = placeholders.collect { "${toSafeGoParamName(it)} string" }.join(", ") + String spec = buildSpecPath(remainingPlaceholders) -func (rsp *${clzName}Rsp) getErrorCode() ErrorCode { - return rsp.Error + return """func (cli *ZSClient) ${clzName}(${params}, params param.${clzName}Param) (*view.${viewStructName}, error) { +\tresp := view.${viewStructName}{} +\terr := cli.PutWithSpec("${cleanPath}", ${firstParam}, ${spec}, "", params, &resp) +\tif err != nil { +\t\treturn nil, err +\t} +\treturn &resp, nil } +""" + } + } + } + + private String generateDeleteMethod(String apiPath) { + // Extract URL placeholders + def placeholders = extractUrlPlaceholders(apiPath) + String cleanPath = removePlaceholders(apiPath) + + // Only use DeleteWithSpec when there are two or more placeholders + boolean useSpec = placeholders.size() >= 2 -func (req *${clzName}Req) getMethod() string { - return ${clzName}Method + if (!useSpec) { + // Single or no placeholder: use the standard Delete method + return """func (cli *ZSClient) ${clzName}(uuid string, deleteMode param.DeleteMode) error { +\treturn cli.Delete("${cleanPath}", uuid, string(deleteMode)) } +""" + } else { + // Multiple placeholders: use DeleteWithSpec + // First placeholder is the resourceId; the rest form the spec + String firstParam = toSafeGoParamName(placeholders[0]) + def remainingPlaceholders = placeholders.drop(1) + String params = placeholders.collect { "${toSafeGoParamName(it)} string" }.join(", ") + String spec = buildSpecPath(remainingPlaceholders) + String paramsStr = "fmt.Sprintf(\"deleteMode=%s\", deleteMode)" -func (req *${clzName}Req) getUri() string { - return ${clzName}Path + return """func (cli *ZSClient) ${clzName}(${params}, deleteMode param.DeleteMode) error { +\treturn cli.DeleteWithSpec("${cleanPath}", ${firstParam}, ${spec}, ${paramsStr}, nil) } +""" + } + } + + /** + * Generate Expunge method. + * Expunge uses PUT at {resource}/{uuid}/actions and only returns an error. + */ + private String generateExpungeMethod(String apiPath) { + // Extract URL placeholders + def placeholders = extractUrlPlaceholders(apiPath) + String cleanPath = removePlaceholders(apiPath) -func (req *${clzName}Req) isSuppressCredentialCheck() bool { - return ${clzName}SuppressCredentialCheck + // Expunge API typically uses /resource/{uuid}/actions; strip the /actions suffix + if (cleanPath.endsWith("/actions")) { + cleanPath = cleanPath.substring(0, cleanPath.length() - 8) + } + + // Build parameter key, for example expungeImage + String paramKey = clzName.substring(0, 1).toLowerCase() + clzName.substring(1) + + return """func (cli *ZSClient) ${clzName}(uuid string) error { +\tparams := map[string]interface{}{ +\t\t"${paramKey}": map[string]interface{}{}, +\t} +\treturn cli.Put("${cleanPath}", uuid, params, nil) } +""" + } -func (sdk *ZStackClient) ${clzName}(param *${clzName}Struct) ${clzName}Rsp { - req := ${clzName}Req{${clzName}: *param} - rsp := ${clzName}Rsp{} - body, err := sdk.Call(&req) - if err != nil { - rsp.Error.Code = err - return rsp - } + private String generateGenericMethod(String apiPath, String httpMethod, String viewStructName, boolean unwrap, String responseStructName, String fieldName) { + String respType = unwrap ? "view.${responseStructName}" : "view.${viewStructName}" + String returnStmt = unwrap ? "return &resp.${fieldName}, nil" : "return &resp, nil" + String respDecl = unwrap ? "var resp ${respType}" : "resp := ${respType}{}" - result := make(map[string]interface{}) - err = json.Unmarshal(body, &result) - if err != nil { - log.Debugf("Unmarshal response failed, reason: %s", err) - rsp.Error.Code = err - return rsp - } + // Extract URL placeholders + def placeholders = extractUrlPlaceholders(apiPath) + String cleanPath = removePlaceholders(apiPath) + + // Determine whether this is an Action API (isAction=true or path ends with /actions) + boolean isActionApi = at.isAction() || apiPath.endsWith("/actions") + + // Resolve the action key (map key for Action APIs) + // Prefer @RestRequest.parameterName, otherwise derive from class name + String actionKey + if (isActionApi) { + if (at.parameterName() != null && !at.parameterName().isEmpty() && !at.parameterName().equals("null")) { + actionKey = at.parameterName() + } else { + def apiClassName = apiMsgClazz.simpleName + def actionName = apiClassName.replaceAll('^API', '').replaceAll('Msg$', '') + actionKey = actionName.substring(0, 1).toLowerCase() + actionName.substring(1) + } + } + + // Only use *WithSpec helpers when there are two or more placeholders + boolean useSpec = placeholders.size() >= 2 + + switch (httpMethod) { + case "GET": + if (!useSpec) { + return """func (cli *ZSClient) ${clzName}(params param.${clzName}Param) (*view.${viewStructName}, error) { +\tvar resp ${respType} +\tif err := cli.Get("${cleanPath}", "", params, &resp); err != nil { +\t\treturn nil, err +\t} +\t${returnStmt} +} +""" + } else { + String params = placeholders.collect { "${toSafeGoParamName(it)} string" }.join(", ") + String pathSpec = buildPathSpec(placeholders) + return """func (cli *ZSClient) ${clzName}(${params}, params param.${clzName}Param) (*view.${viewStructName}, error) { +\tvar resp ${respType} +\terr := cli.GetWithSpec("${cleanPath}", ${pathSpec}, "", "", params, &resp) +\tif err != nil { +\t\treturn nil, err +\t} +\t${returnStmt} +} +""" + } + case "POST": + if (!useSpec) { + return """func (cli *ZSClient) ${clzName}(params param.${clzName}Param) (*view.${viewStructName}, error) { +\t${respDecl} +\tif err := cli.Post("${cleanPath}", params, &resp); err != nil { +\t\treturn nil, err +\t} +\t${returnStmt} +} +""" + } else { + // POST lacks *WithSpec helpers; build the full URL manually + String params = placeholders.collect { "${toSafeGoParamName(it)} string" }.join(", ") + String fullPath = buildFullPath(placeholders) + return """func (cli *ZSClient) ${clzName}(${params}, params param.${clzName}Param) (*view.${viewStructName}, error) { +\t${respDecl} +\terr := cli.Post(${fullPath}, params, &resp) +\tif err != nil { +\t\treturn nil, err +\t} +\t${returnStmt} +} +""" + } + case "PUT": + if (!useSpec) { + if (placeholders.size() == 1) { + // Single placeholder pulled from the path parameter + String paramName = toSafeGoParamName(placeholders[0]) + if (isActionApi) { + // Action APIs wrap params.Params inside a map + return """func (cli *ZSClient) ${clzName}(${paramName} string, params param.${clzName}Param) (*view.${viewStructName}, error) { +\t${respDecl} +\tif err := cli.Put("${cleanPath}", ${paramName}, map[string]interface{}{ +\t\t"${actionKey}": params.Params, +\t}, &resp); err != nil { +\t\treturn nil, err +\t} +\t${returnStmt} +} +""" + } else { + return """func (cli *ZSClient) ${clzName}(${paramName} string, params param.${clzName}Param) (*view.${viewStructName}, error) { +\t${respDecl} +\tif err := cli.Put("${cleanPath}", ${paramName}, params, &resp); err != nil { +\t\treturn nil, err +\t} +\t${returnStmt} +} +""" + } + } else { + // No placeholder: use the standard Put method (uuid required) + if (isActionApi) { + return """func (cli *ZSClient) ${clzName}(uuid string, params param.${clzName}Param) (*view.${viewStructName}, error) { +\t${respDecl} +\tif err := cli.Put("${cleanPath}", uuid, map[string]interface{}{ +\t\t"${actionKey}": params.Params, +\t}, &resp); err != nil { +\t\treturn nil, err +\t} +\t${returnStmt} +} +""" + } else { + return """func (cli *ZSClient) ${clzName}(uuid string, params param.${clzName}Param) (*view.${viewStructName}, error) { +\t${respDecl} +\tif err := cli.Put("${cleanPath}", uuid, params, &resp); err != nil { +\t\treturn nil, err +\t} +\t${returnStmt} +} +""" + } + } + } else { + // Multiple placeholders: use PutWithSpec + String firstParam = toSafeGoParamName(placeholders[0]) + def remainingPlaceholders = placeholders.drop(1) + String params = placeholders.collect { "${toSafeGoParamName(it)} string" }.join(", ") + String spec = buildSpecPath(remainingPlaceholders) - err = mapstruct.Decode(result, &rsp) - if err != nil { - log.Debugf("decode %s failed, err: %v", result, err) - rsp.Error.Code = err - return rsp - } + return """func (cli *ZSClient) ${clzName}(${params}, params param.${clzName}Param) (*view.${viewStructName}, error) { +\t${respDecl} +\terr := cli.PutWithSpec("${cleanPath}", ${firstParam}, ${spec}, "", params, &resp) +\tif err != nil { +\t\treturn nil, err +\t} +\t${returnStmt} +} +""" + } + case "DELETE": + if (!useSpec) { + return """func (cli *ZSClient) ${clzName}(uuid string, deleteMode param.DeleteMode) error { +\treturn cli.Delete("${cleanPath}", uuid, string(deleteMode)) +} +""" + } else { + // Multiple placeholders: use DeleteWithSpec + String firstParam = toSafeGoParamName(placeholders[0]) + def remainingPlaceholders = placeholders.drop(1) + String params = placeholders.collect { "${toSafeGoParamName(it)} string" }.join(", ") + String spec = buildSpecPath(remainingPlaceholders) + String paramsStr = "fmt.Sprintf(\"deleteMode=%s\", deleteMode)" - return rsp + return """func (cli *ZSClient) ${clzName}(${params}, deleteMode param.DeleteMode) error { + return cli.DeleteWithSpec("${cleanPath}", ${firstParam}, ${spec}, ${paramsStr}, nil) +} +""" + } + default: + if (!useSpec) { + return """func (cli *ZSClient) ${clzName}(params param.${clzName}Param) (*view.${viewStructName}, error) { +\t${respDecl} +\tif err := cli.Post("${cleanPath}", params, &resp); err != nil { +\t\treturn nil, err +\t} +\t${returnStmt} } +""" + } else { + // POST lacks *WithSpec helpers; build the full URL manually + String params = placeholders.collect { "${toSafeGoParamName(it)} string" }.join(", ") + String fullPath = buildFullPath(placeholders) + return """func (cli *ZSClient) ${clzName}(${params}, params param.${clzName}Param) (*view.${viewStructName}, error) { +\t${respDecl} +\terr := cli.Post(${fullPath}, params, &resp) +\tif err != nil { +\t\treturn nil, err +\t} +\t${returnStmt} +} +""" + } + } + } + + /** + * Decide whether an async method should be generated. + */ + private boolean shouldGenerateAsync() { + // Skip async generation for Query/Get/Delete operations + if (actionType in ["Query", "Get", "Delete", "Destroy", "Remove", "Expunge"]) { + return false + } + return true + } + + /** + * Generate async helper returning LongJob UUID for status polling. + */ + private String generateAsyncMethod(String apiPath, String httpMethod, String viewStructName) { + String asyncMethodName = "${clzName}Async" + String resource = apiPath.replaceAll(/^v1/, "v1") + + def builder = new StringBuilder() + builder.append("\n// ${asyncMethodName} Async\n") + builder.append("func (cli *ZSClient) ${asyncMethodName}(params param.${clzName}Param) (string, error) {\n") + builder.append("\n") + builder.append("\tresource := \"${resource}\"\n") + builder.append("\tresponseKey := \"\"\n") + builder.append("\tvar retVal interface{}\n") + builder.append("\n") + builder.append("\tapiId, err := cli.PostWithAsync(resource, responseKey, params, retVal, true)\n") + builder.append("\tif err != nil {\n") + builder.append("\t\treturn \"\", err\n") + builder.append("\t}\n") + builder.append("\n") + builder.append("\treturn apiId, nil\n") + builder.append("}\n") + + return builder.toString() + } + + /** + * Extract placeholders from a URL path. + * Example: "/l3-networks/{l3NetworkUuid}/ip/{ip}/availability" -> ["l3NetworkUuid", "ip"] + */ + private List extractUrlPlaceholders(String apiPath) { + def placeholders = [] + def matcher = (apiPath =~ /\{([^}]+)\}/) + while (matcher.find()) { + placeholders.add(matcher.group(1)) + } + return placeholders + } + + /** + * Convert placeholder names to safe Go parameter names (avoid keyword clashes). + */ + private String toSafeGoParamName(String name) { + // Go keyword list + def goKeywords = ["break", "case", "chan", "const", "continue", "default", "defer", + "else", "fallthrough", "for", "func", "go", "goto", "if", "import", + "interface", "map", "package", "range", "return", "select", "struct", + "switch", "type", "var"] + + if (goKeywords.contains(name)) { + return name + "Param" + } + return name + } + + /** + * Build a spec path (excluding the first placeholder). + * Example: ["ip", "availability"] with original path "/l3-networks/{l3NetworkUuid}/ip/{ip}/availability" + * Returns: fmt.Sprintf("ip/%s/availability", ip) + */ + private String buildSpecPath(List remainingPlaceholders) { + if (remainingPlaceholders.isEmpty()) { + return '""' + } + + // Locate the path segment after the first placeholder + int firstPlaceholderEnd = path.indexOf('}') + 1 + if (firstPlaceholderEnd <= 0) { + return '""' + } + + String pathAfterFirst = path.substring(firstPlaceholderEnd) + if (pathAfterFirst.startsWith('/')) { + pathAfterFirst = pathAfterFirst.substring(1) + } + + // Replace remaining {placeholder} segments with %s + String formatStr = pathAfterFirst.replaceAll(/\{[^}]+\}/, '%s') + + if (remainingPlaceholders.isEmpty()) { + return "\"${formatStr}\"" + } + + // Build the fmt.Sprintf call + String params = remainingPlaceholders.collect { toSafeGoParamName(it) }.join(', ') + return "fmt.Sprintf(\"${formatStr}\", ${params})" + } + + /** + * Build the full path (used when no *WithSpec helper exists, such as POST). + * Example: ["eipUuid", "vmNicUuid"] with path "/eips/{eipUuid}/vm-instances/nics/{vmNicUuid}" + * Returns: fmt.Sprintf("v1/eips/%s/vm-instances/nics/%s", eipUuid, vmNicUuid) + */ + private String buildFullPath(List placeholders) { + if (placeholders.isEmpty()) { + return "\"${path}\"" + } + + // Replace all {placeholder} tokens with %s + String formatStr = path.replaceAll(/\{[^}]+\}/, '%s') + + // Add the v1 prefix + if (!formatStr.startsWith("v1/")) { + if (formatStr.startsWith("/")) { + formatStr = "v1" + formatStr + } else { + formatStr = "v1/" + formatStr + } + } + + // Build the fmt.Sprintf call + String params = placeholders.collect { toSafeGoParamName(it) }.join(', ') + return "fmt.Sprintf(\"${formatStr}\", ${params})" + } + + /** + * Remove all placeholders from a URL. + * Example: "/l3-networks/{l3NetworkUuid}/ip/{ip}/availability" -> "/l3-networks" + * Keep the base path for GetWithSpec and similar helpers. + */ + private String removePlaceholders(String apiPath) { + // Find the position of the first '{' + int firstPlaceholder = apiPath.indexOf('{') + if (firstPlaceholder == -1) { + return apiPath + } + + // Return the path before the first placeholder, trimming the trailing slash + String basePath = apiPath.substring(0, firstPlaceholder) + if (basePath.endsWith('/')) { + basePath = basePath.substring(0, basePath.length() - 1) + } + return basePath + } + + /** + * Build a path spec string for GetWithSpec and similar helpers. + * Example: ["l3NetworkUuid", "ip"] -> 'fmt.Sprintf("%s/ip/%s/availability", l3NetworkUuid, ip)' + * + * Steps: + * 1. Extract the path segment after placeholders. + * 2. Replace placeholders with %s. + * 3. Build fmt.Sprintf using safe parameter names. + */ + private String buildPathSpec(List placeholders) { + if (placeholders.isEmpty()) { + return '""' + } + + // Re-parse the original path to build the portion after placeholders + String pathAfterBase = path + int firstPlaceholder = path.indexOf('{') + if (firstPlaceholder != -1) { + pathAfterBase = path.substring(firstPlaceholder) + } + + // Replace {placeholder} with %s + String formatStr = pathAfterBase.replaceAll(/\{[^}]+\}/, '%s') + + // Drop a leading slash if present + if (formatStr.startsWith('/')) { + formatStr = formatStr.substring(1) + } -"""; - file.add(f) - return file + // Build the fmt.Sprintf call with safe parameter names + String params = placeholders.collect { toSafeGoParamName(it) }.join(', ') + return "fmt.Sprintf(\"${formatStr}\", ${params})" } } diff --git a/rest/src/main/resources/scripts/GoInventory.groovy b/rest/src/main/resources/scripts/GoInventory.groovy index d3e1c18b500..e55be54d3c3 100644 --- a/rest/src/main/resources/scripts/GoInventory.groovy +++ b/rest/src/main/resources/scripts/GoInventory.groovy @@ -1,11 +1,12 @@ package scripts -import com.fasterxml.jackson.core.type.TypeReference import org.zstack.core.Platform +import org.zstack.header.longjob.LongJobFor import org.zstack.header.message.APIParam import org.zstack.header.message.OverriddenApiParam import org.zstack.header.message.OverriddenApiParams import org.zstack.header.rest.APINoSee +import org.zstack.header.rest.RestRequest import org.zstack.header.rest.RestResponse import org.zstack.header.search.Inventory import org.zstack.rest.sdk.SdkFile @@ -15,85 +16,1450 @@ import org.zstack.utils.Utils import org.zstack.utils.logging.CLogger import java.lang.reflect.Field +import java.lang.reflect.Modifier import java.lang.reflect.ParameterizedType import java.lang.reflect.Type import java.lang.reflect.TypeVariable import java.util.stream.Collectors +/** + * Go SDK Inventory/View generator + */ class GoInventory implements SdkTemplate { private static final CLogger logger = Utils.getLogger(GoInventory.class) - private Set inventories = new ArrayList<>() - private Set markedInventories = new ArrayList<>() + private Set inventories = new HashSet<>() + private Set markedInventories = new HashSet<>() + private Map viewStructNameMap = new HashMap<>() + // Track additional classes that need View generation (referenced but not @Inventory annotated) + private Set additionalClasses = new HashSet<>() + // Track all generated view struct names to avoid duplicates + private Set generatedViewStructs = new HashSet<>() + // Track generated view files to avoid duplicates + private Set generatedViewFiles = new HashSet<>() + + // Track LongJob mappings: API class -> LongJob class + private static Map longJobMappings = new HashMap<>() + + // Track param nested types (types used in API request params) + private Set paramNestedTypes = new HashSet<>() + // Track generated param struct names to avoid duplicates + private Set generatedParamStructs = new HashSet<>() + + // Track generated client method names to avoid duplicates across all action files + private Set generatedClientMethods = new HashSet<>() + + // Flag to indicate we're generating for param (not view) + private boolean generatingForParam = false + + // Track current class being generated (for detecting self-references/recursive types) + private Class currentGeneratingClass = null + + // Centralized list of all pre-parsed API templates + private List allApiTemplates = new ArrayList<>() + + /** + * Get all registered inventory classes + */ + Set getInventories() { + if (inventories.isEmpty()) { + inventories.addAll(Platform.reflections.getTypesAnnotatedWith(Inventory.class)) + } + return inventories + } + + /** + * Scan all @LongJobFor annotations and build API -> LongJob mappings + */ + private void scanLongJobMappings() { + logger.warn("[GoSDK] Scanning @LongJobFor annotations...") + + try { + // Fetch all classes annotated with @LongJobFor + Set> longJobClasses = Platform.reflections.getTypesAnnotatedWith(LongJobFor.class) + + longJobClasses.each { Class longJobClass -> + try { + // Read the target API class from the annotation + LongJobFor annotation = longJobClass.getAnnotation(LongJobFor.class) + Class targetApiClass = annotation.value() + + // Store the mapping + longJobMappings.put(targetApiClass, longJobClass) + + logger.debug("[GoSDK] Found LongJob: ${longJobClass.simpleName} for API: ${targetApiClass.simpleName}") + } catch (Exception e) { + logger.warn("[GoSDK] Failed to process LongJob class ${longJobClass.name}: ${e.message}") + } + } + + logger.warn("[GoSDK] Total LongJob mappings: ${longJobMappings.size()}") + } catch (Exception e) { + logger.error("[GoSDK] Failed to scan LongJob mappings: ${e.message}") + } + } + + /** + * Get LongJob mappings (for GoApiTemplate) + */ + static Map getLongJobMappings() { + return longJobMappings + } + + /** + * Pre-analyze all API classes once and cache metadata. + * This avoids expensive re-instantiation of GoApiTemplate and redundant logging. + */ + private void prepareApiTemplates() { + logger.warn("[GoSDK] Pre-parsing all API classes...") + GoApiTemplate.setKnownInventoryClasses(getInventories()) + GoApiTemplate.setLongJobMappings(getLongJobMappings()) + Set> allApiClasses = Platform.reflections.getTypesAnnotatedWith(RestRequest.class) + + allApiClasses.each { Class apiClass -> + if (apiClass.isInterface() || Modifier.isAbstract(apiClass.getModifiers())) { + return + } + + try { + GoApiTemplate template = new GoApiTemplate(apiClass, this) + // If it's a valid template (has @RestRequest) + if (template.at != null) { + allApiTemplates.add(template) + } + } catch (Throwable e) { + logger.warn("[GoSDK] Error pre-parsing API class ${apiClass.name}: ${e.class.name}: ${e.message}", e) + } + } + logger.warn("[GoSDK] Pre-parsing complete. Cached ${allApiTemplates.size()} API templates.") + } + + /** + * Validate generated views against referenced response views + */ + private void validateGeneratedViews() { + int missingCount = 0 + allApiTemplates.each { GoApiTemplate template -> + Class responseClass = template.getResponseClass() + if (responseClass != null) { + String viewName = getViewStructName(responseClass) + if (!generatedViewStructs.contains(viewName)) { + logger.warn("[GoSDK] Reference to missing view: ${viewName} (referenced by ${template.getApiMsgClazz().simpleName})") + missingCount++ + } + } + } + if (missingCount > 0) { + logger.warn("[GoSDK] Total missing response views: ${missingCount}. These APIs might fail to compile in Go.") + } else { + logger.warn("[GoSDK] View validation passed. All referenced response views are generated.") + } + } @Override List generate() { - def file = [] + def files = [] + + logger.warn("[GoSDK] ===== GoInventory.generate() START =====") + logger.warn("[GoSDK] GoInventory.generate() starting...") + + // 0. Scan LongJob mappings + scanLongJobMappings() + logger.warn("[GoSDK] Scanned ${longJobMappings.size()} LongJob mappings") + + // Ensure inventories are loaded early + getInventories() + logger.warn("[GoSDK] Loaded " + inventories.size() + " inventories") + + // 1. Pre-parse all APIs once to avoid O(N*M) processing and redundant logging + prepareApiTemplates() + logger.warn("[GoSDK] prepareApiTemplates complete. Found " + allApiTemplates.size() + " valid API templates") + + // 1. Generate view files (Resource Grouping) + logger.warn("[GoSDK] Starting generateViewFiles()...") + files.addAll(generateViewFiles()) + logger.warn("[GoSDK] Completed generateViewFiles(). Generated " + generatedViewStructs.size() + " view structs") + + // 1b. Generate action and param files (Resource Grouping) + files.addAll(generateActionFiles()) + files.addAll(generateParamFiles()) + + // 2. Generate catch-all other views (for APIs without a matching @Inventory class) + logger.warn("[GoSDK] Before other_views.go, generatedViewStructs size: " + generatedViewStructs.size()) + files.add(generateOtherViewsFile()) + logger.warn("[GoSDK] After other_views.go, generatedViewStructs size: " + generatedViewStructs.size()) + + + // 4. Generate other params file + files.add(generateOtherParamsFile()) + + // 5. Generate other actions file + files.add(generateOtherActionsFile()) + + // 6. Generate view files for additional referenced classes (iterative discovery) + files.addAll(generateAdditionalViewFiles()) + + // 7. Base files + files.add(generateBaseViewFile()) + + // Load session additional views from template (special case for WebUISessionView) + files.add(loadSessionViewsTemplate()) + + files.add(loadBaseParamTemplate()) + + // Generate param nested types file from template + files.add(loadBaseParamTypesTemplate()) + + // Generate login params from template (special case) + files.add(loadLoginParamsTemplate()) + + // Note: client.go is manually maintained, not auto-generated + + // 8. Validate that all referenced response views were generated + validateGeneratedViews() + + logger.warn("[GoSDK] GoInventory.generate() complete. Total files: " + files.size()) + logger.warn("[GoSDK] ===== GoInventory.generate() END =====") + return files + } + + /** + * Generate view files for additional classes (referenced but not @Inventory annotated) + * These are classes like SnapshotLeafInventory, ServiceStatus, etc. + * Uses iterative approach to handle newly discovered types during generation. + */ + private List generateAdditionalViewFiles() { + def files = [] + + if (additionalClasses.isEmpty()) { + return files + } + + logger.warn("[GoSDK] Generating additional view classes, initial count: " + additionalClasses.size()) + + // Use a list to iterate and allow adding new classes during iteration + def classesToProcess = new ArrayList(additionalClasses) + def discoveredClasses = new HashSet() // Track discovered classes (not generated yet) + int index = 0 + + // First pass: discover all classes and their dependencies + // Don't add to generatedViewStructs here - just collect classes + while (index < classesToProcess.size()) { + Class clz = classesToProcess.get(index) + String structName = getViewStructName(clz) + + // Skip if already in @Inventory or already discovered + if (!discoveredClasses.contains(clz) && !generatedViewStructs.contains(structName)) { + discoveredClasses.add(clz) + + // Call generateViewStruct to trigger dependency discovery + // (it adds new types to additionalClasses) + generateViewStruct(clz, structName) + + // Check if new classes were added during struct generation + additionalClasses.each { Class newClz -> + String newStructName = getViewStructName(newClz) + if (!classesToProcess.contains(newClz) && + !discoveredClasses.contains(newClz) && + !generatedViewStructs.contains(newStructName)) { + classesToProcess.add(newClz) + } + } + } + index++ + } + + logger.warn("[GoSDK] Total additional classes after discovery: " + discoveredClasses.size()) + + // Group discovered classes by simple name prefix for file organization + def grouped = new HashMap>() + discoveredClasses.each { Class clz -> + String prefix = clz.simpleName.replaceAll('Inventory$', '').replaceAll('VO$', '') + if (!grouped.containsKey(prefix)) { + grouped.put(prefix, new HashSet()) + } + grouped.get(prefix).add(clz) + } + + grouped.each { String prefix, Set classes -> + def sdkFile = new SdkFile() + sdkFile.subPath = "/pkg/view/" + sdkFile.fileName = "${toSnakeCase(prefix)}_additional_views.go" + + def content = new StringBuilder() + content.append("// Copyright (c) ZStack.io, Inc.\n\n") + content.append("package view\n\n") + content.append("import \"time\"\n\n") + content.append("var _ = time.Now // avoid unused import\n\n") + + classes.each { Class clz -> + String structName = getViewStructName(clz) + if (!generatedViewStructs.contains(structName)) { + generatedViewStructs.add(structName) + content.append(generateViewStruct(clz, structName)) + logger.debug("[GoSDK] Generated additional view: " + structName) + } + } + + sdkFile.content = content.toString() + files.add(sdkFile) + } + + return files + } + + /** + * Generate ZSClient base file + * @deprecated client.go is manually maintained, this method should not be used + */ + @Deprecated + private SdkFile generateClientFile() { def sdkFile = new SdkFile() - sdkFile.subPath = "/api/" - sdkFile.fileName = "Inventory.go" - sdkFile.content = "package api\n\n" - inventories.addAll(Platform.reflections.getTypesAnnotatedWith(Inventory.class)) - while (inventories.size() != 0) { - def inventoriesCopy = new TreeSet(Comparator.comparing({it.simpleName})) - sdkFile.content += inventoriesCopy.stream().filter({ it -> it.simpleName.contains("Inventory") }).map({ it -> generateStruct(it, it.simpleName) }).collect(Collectors.toList()).join("") - markedInventories.addAll(inventoriesCopy) - inventories.removeAll(markedInventories) - } - file.add(sdkFile) - return file - } - - String generateStruct(Class inventoryClazz, String structName) { - if (inventoryClazz == null) { + sdkFile.subPath = "/pkg/client/" + sdkFile.fileName = "client.go" + + def content = new StringBuilder() + content.append("// Copyright (c) ZStack.io, Inc.\n\n") + content.append("package client\n\n") + content.append("import (\n") + content.append("\t\"bytes\"\n") + content.append("\t\"crypto/sha512\"\n") + content.append("\t\"encoding/hex\"\n") + content.append("\t\"encoding/json\"\n") + content.append("\t\"fmt\"\n") + content.append("\t\"io\"\n") + content.append("\t\"net/http\"\n") + content.append("\t\"net/url\"\n") + content.append("\t\"strconv\"\n") + content.append("\t\"strings\"\n") + content.append("\t\"github.com/zstackio/zstack-sdk-go-v2/pkg/param\"\n") + content.append("\t\"time\"\n") + content.append(")\n\n") + content.append("// AuthType authentication type\n") + content.append("type AuthType string\n\n") + content.append("const (\n") + content.append("\tAuthTypeAccessKey AuthType = \"accesskey\"\n") + content.append("\tAuthTypeLogin AuthType = \"login\"\n") + content.append(")\n\n") + content.append("const (\n") + content.append("\tdefaultZStackPort = 8080\n") + content.append(")\n\n") + content.append("// ZSConfig client configuration\n") + content.append("type ZSConfig struct {\n") + content.append("\thostname string\n") + content.append("\tport int\n") + content.append("\tcontextPath string\n") + content.append("\taccessKeyId string\n") + content.append("\taccessKeySecret string\n") + content.append("\tusername string\n") + content.append("\tpassword string\n") + content.append("\tauthType AuthType\n") + content.append("\tdebug bool\n") + content.append("\ttimeout time.Duration\n") + content.append("}\n\n") + content.append("// NewZSConfig creates a new configuration\n") + content.append("func NewZSConfig(hostname string, port int, contextPath string) *ZSConfig {\n") + content.append("\treturn &ZSConfig{\n") + content.append("\t\thostname: hostname,\n") + content.append("\t\tport: port,\n") + content.append("\t\tcontextPath: contextPath,\n") + content.append("\t\ttimeout: 30 * time.Second,\n") + content.append("\t}\n") + content.append("}\n\n") + content.append("// DefaultZSConfig creates a default configuration\n") + content.append("func DefaultZSConfig(hostname, contextPath string) *ZSConfig {\n") + content.append("\treturn NewZSConfig(hostname, defaultZStackPort, contextPath)\n") + content.append("}\n\n") + content.append("// AccessKey sets access key authentication\n") + content.append("func (config *ZSConfig) AccessKey(id, secret string) *ZSConfig {\n") + content.append("\tconfig.accessKeyId = id\n") + content.append("\tconfig.accessKeySecret = secret\n") + content.append("\tconfig.authType = AuthTypeAccessKey\n") + content.append("\treturn config\n") + content.append("}\n\n") + content.append("// Login sets login authentication\n") + content.append("func (config *ZSConfig) Login(username, password string) *ZSConfig {\n") + content.append("\tconfig.username = username\n") + content.append("\tconfig.password = password\n") + content.append("\tconfig.authType = AuthTypeLogin\n") + content.append("\treturn config\n") + content.append("}\n\n") + content.append("// Debug enables debug mode\n") + content.append("func (config *ZSConfig) Debug(debug bool) *ZSConfig {\n") + content.append("\tconfig.debug = debug\n") + content.append("\treturn config\n") + content.append("}\n\n") + content.append("// ZSClient ZStack API client\n") + content.append("type ZSClient struct {\n") + content.append("\tconfig *ZSConfig\n") + content.append("\thttpClient *http.Client\n") + content.append("\tsessionId string\n") + content.append("}\n\n") + content.append("// JobView job inventory view\n") + content.append("type JobView struct {\n") + content.append("\tUUID string `json:\"uuid\"`\n") + content.append("\tState string `json:\"state\"`\n") + content.append("\tResult interface{} `json:\"result,omitempty\"`\n") + content.append("\tError interface{} `json:\"error,omitempty\"`\n") + content.append("\tCreateDate string `json:\"createDate\"`\n") + content.append("}\n\n") + content.append("const (\n") + content.append("\tJobStateProcessing = \"Processing\"\n") + content.append("\tJobStateSucceeded = \"Succeeded\"\n") + content.append("\tJobStateFailed = \"Failed\"\n") + content.append(")\n\n") + content.append("// NewZSClient creates a new ZStack client\n") + content.append("func NewZSClient(config *ZSConfig) *ZSClient {\n") + content.append("\t// Auto-encrypt password for login authentication\n") + content.append("\tif config.authType == AuthTypeLogin && config.password != \"\" {\n") + content.append("\t\tconfig.password = hashPasswordSHA512(config.password)\n") + content.append("\t\tif config.debug {\n") + content.append("\t\t\tfmt.Printf(\"[DEBUG] Password hashed: %s...\\n\", config.password[:16])\n") + content.append("\t\t}\n") + content.append("\t}\n") + content.append("\treturn &ZSClient{\n") + content.append("\t\tconfig: config,\n") + content.append("\t\thttpClient: &http.Client{\n") + content.append("\t\t\tTimeout: config.timeout,\n") + content.append("\t\t},\n") + content.append("\t}\n") + content.append("}\n\n") + content.append("// hashPasswordSHA512 encrypts password using SHA512\n") + content.append("func hashPasswordSHA512(password string) string {\n") + content.append("\thash := sha512.Sum512([]byte(password))\n") + content.append("\treturn hex.EncodeToString(hash[:])\n") + content.append("}\n\n") + content.append("func (cli *ZSClient) baseURL() string {\n") + content.append("\treturn fmt.Sprintf(\"http://%s:%d%s\", cli.config.hostname, cli.config.port, cli.config.contextPath)\n") + content.append("}\n\n") + content.append("// Get performs a GET request\n") + content.append("func (cli *ZSClient) Get(path string, uuid string, params interface{}, result interface{}) error {\n") + content.append("\turl := fmt.Sprintf(\"%s/%s\", cli.baseURL(), path)\n") + content.append("\tif uuid != \"\" {\n") + content.append("\t\turl = fmt.Sprintf(\"%s/%s\", url, uuid)\n") + content.append("\t}\n") + content.append("\treturn cli.doRequest(\"GET\", url, nil, result)\n") + content.append("}\n\n") + content.append("func (cli *ZSClient) QueryJob(uuid string) (*JobView, error) {\n") + content.append("\tvar resp JobView\n") + content.append("\turl := fmt.Sprintf(\"%s/v1/api-jobs/%s\", cli.baseURL(), uuid)\n") + content.append("\terr := cli.doRequest(\"GET\", url, nil, &resp)\n") + content.append("\treturn &resp, err\n") + content.append("}\n\n") + content.append("// List performs a list query\n") + content.append("func (cli *ZSClient) List(path string, params interface{}, result interface{}) error {\n") + content.append("\tbaseURL := cli.baseURL()\n") + content.append("\trequestURL := fmt.Sprintf(\"%s/%s\", baseURL, path)\n") + content.append("\n") + content.append("\tif params != nil {\n") + content.append("\t\tif queryParam, ok := params.(*param.QueryParam); ok {\n") + content.append("\t\t\tqueryString := cli.buildQueryString(queryParam)\n") + content.append("\t\t\tif queryString != \"\" {\n") + content.append("\t\t\t\trequestURL = fmt.Sprintf(\"%s?%s\", requestURL, queryString)\n") + content.append("\t\t\t}\n") + content.append("\t\t}\n") + content.append("\t}\n") + content.append("\n") + content.append("\t// Unmarshal response into wrapper with inventories field\n") + content.append("\tvar wrapper struct {\n") + content.append("\t\tInventories interface{} `json:\"inventories\"`\n") + content.append("\t\tInventory interface{} `json:\"inventory\"`\n") + content.append("\t}\n") + content.append("\n") + content.append("\tif err := cli.doRequest(\"GET\", requestURL, nil, &wrapper); err != nil {\n") + content.append("\t\treturn err\n") + content.append("\t}\n") + content.append("\n") + content.append("\t// Try inventories first (plural), then inventory (singular)\n") + content.append("\tvar data interface{}\n") + content.append("\tif wrapper.Inventories != nil {\n") + content.append("\t\tdata = wrapper.Inventories\n") + content.append("\t} else if wrapper.Inventory != nil {\n") + content.append("\t\tdata = wrapper.Inventory\n") + content.append("\t}\n") + content.append("\n") + content.append("\t// Re-marshal and unmarshal into the actual result type\n") + content.append("\tif data != nil {\n") + content.append("\t\tdataBytes, err := json.Marshal(data)\n") + content.append("\t\tif err != nil {\n") + content.append("\t\t\treturn fmt.Errorf(\"failed to marshal data: %v\", err)\n") + content.append("\t\t}\n") + content.append("\t\tif cli.config.debug {\n") + content.append("\t\t\tfmt.Printf(\"[DEBUG] Received %d bytes of inventory data\\n\", len(dataBytes))\n") + content.append("\t\t}\n") + content.append("\t\terr = json.Unmarshal(dataBytes, result)\n") + content.append("\t\tif err != nil {\n") + content.append("\t\t\treturn fmt.Errorf(\"failed to unmarshal data into result: %v\", err)\n") + content.append("\t\t}\n") + content.append("\t\treturn nil\n") + content.append("\t}\n") + content.append("\tif cli.config.debug {\n") + content.append("\t\tfmt.Println(\"[DEBUG] Both inventories and inventory are nil, returning empty result\")\n") + content.append("\t}\n") + content.append("\treturn nil\n") + content.append("}\n\n") + content.append("// Post performs a POST request\n") + content.append("func (cli *ZSClient) Post(path string, params interface{}, result interface{}) error {\n") + content.append("\turl := fmt.Sprintf(\"%s/%s\", cli.baseURL(), path)\n") + content.append("\treturn cli.doRequest(\"POST\", url, params, result)\n") + content.append("}\n\n") + content.append("// Put performs a PUT request\n") + content.append("func (cli *ZSClient) Put(path string, uuid string, params interface{}, result interface{}) error {\n") + content.append("\turl := fmt.Sprintf(\"%s/%s/%s\", cli.baseURL(), path, uuid)\n") + content.append("\treturn cli.doRequest(\"PUT\", url, params, result)\n") + content.append("}\n\n") + content.append("// Delete performs a DELETE request\n") + content.append("func (cli *ZSClient) Delete(path string, uuid string, deleteMode string) error {\n") + content.append("\turl := fmt.Sprintf(\"%s/%s/%s?deleteMode=%s\", cli.baseURL(), path, uuid, deleteMode)\n") + content.append("\treturn cli.doRequest(\"DELETE\", url, nil, nil)\n") + content.append("}\n\n") + content.append("func (cli *ZSClient) doRequest(method, url string, body interface{}, result interface{}) error {\n") + content.append("\t// Auto-login if using login auth and no session yet\n") + content.append("\tif cli.config.authType == AuthTypeLogin && cli.sessionId == \"\" && !strings.HasSuffix(url, \"/accounts/login\") {\n") + content.append("\t\terr := cli.Login(cli.config.username, cli.config.password)\n") + content.append("\t\tif err != nil {\n") + content.append("\t\t\treturn fmt.Errorf(\"auto-login failed: %v\", err)\n") + content.append("\t\t}\n") + content.append("\t}\n\n") + content.append("\tvar bodyReader io.Reader\n") + content.append("\tvar bodyBytes []byte\n") + content.append("\tif body != nil {\n") + content.append("\t\tvar err error\n") + content.append("\t\tbodyBytes, err = json.Marshal(body)\n") + content.append("\t\tif err != nil {\n") + content.append("\t\t\treturn err\n") + content.append("\t\t}\n") + content.append("\t\tbodyReader = bytes.NewBuffer(bodyBytes)\n") + content.append("\t}\n\n") + content.append("\treq, err := http.NewRequest(method, url, bodyReader)\n") + content.append("\tif err != nil {\n") + content.append("\t\treturn err\n") + content.append("\t}\n\n") + content.append("\treq.Header.Set(\"Content-Type\", \"application/json\")\n") + content.append("\tcli.addAuthHeaders(req)\n\n") + content.append("\tif cli.config.debug && bodyBytes != nil {\n") + content.append("\t\tfmt.Printf(\"[DEBUG] %s %s\\n\", method, url)\n") + content.append("\t\tfmt.Printf(\"[DEBUG] Body: %s\\n\", string(bodyBytes))\n") + content.append("\t\tfmt.Printf(\"[DEBUG] Headers: Authorization=%s\\n\", req.Header.Get(\"Authorization\"))\n") + content.append("\t}\n\n") + content.append("\tresp, err := cli.httpClient.Do(req)\n") + content.append("\tif err != nil {\n") + content.append("\t\treturn err\n") + content.append("\t}\n") + content.append("\tdefer resp.Body.Close()\n\n") + content.append("\tif resp.StatusCode == 202 {\n") + content.append("\t\tvar location struct {\n") + content.append("\t\t\tLocation string `json:\"location\"`\n") + content.append("\t\t\tUuid string `json:\"org.zstack.header.rest.APIEvent/uuid\"`\n") + content.append("\t\t}\n") + content.append("\t\tif err := json.NewDecoder(resp.Body).Decode(&location); err != nil {\n") + content.append("\t\t\treturn fmt.Errorf(\"failed to decode 202 response: %v\", err)\n") + content.append("\t\t}\n") + content.append("\t\tjobUUID := location.Uuid\n") + content.append("\t\tif jobUUID == \"\" {\n") + content.append("\t\t\tparts := bytes.Split([]byte(location.Location), []byte(\"/\"))\n") + content.append("\t\t\tif len(parts) > 0 {\n") + content.append("\t\t\t\tjobUUID = string(parts[len(parts)-1])\n") + content.append("\t\t\t}\n") + content.append("\t\t}\n") + content.append("\n") + content.append("\t\tif jobUUID == \"\" {\n") + content.append("\t\t\treturn fmt.Errorf(\"failed to extract job uuid from 202 response\")\n") + content.append("\t\t}\n") + content.append("\n") + content.append("\t\treturn cli.waitForJob(jobUUID, result)\n") + content.append("\t}\n\n") + content.append("\tif resp.StatusCode >= 400 {\n") + content.append("\t\trespBody, _ := io.ReadAll(resp.Body)\n") + content.append("\t\terrMsg := fmt.Sprintf(\"API error: %s %s returned status code %d\\n\", method, url, resp.StatusCode)\n") + content.append("\t\terrMsg += fmt.Sprintf(\"Authorization: %s\\n\", req.Header.Get(\"Authorization\"))\n") + content.append("\t\terrMsg += fmt.Sprintf(\"Response: %s\", string(respBody))\n") + content.append("\t\treturn fmt.Errorf(errMsg)\n") + content.append("\t}\n\n") + content.append("\tif result != nil {\n") + content.append("\t\treturn json.NewDecoder(resp.Body).Decode(result)\n") + content.append("\t}\n") + content.append("\treturn nil\n") + content.append("}\n\n") + content.append("func (cli *ZSClient) waitForJob(jobUUID string, result interface{}) error {\n") + content.append("\tticker := time.NewTicker(500 * time.Millisecond)\n") + content.append("\tdefer ticker.Stop()\n") + content.append("\n") + content.append("\ttimeout := time.After(30 * time.Minute)\n") + content.append("\n") + content.append("\tfor {\n") + content.append("\t\tselect {\n") + content.append("\t\tcase <-timeout:\n") + content.append("\t\t\treturn fmt.Errorf(\"job %s timeout\", jobUUID)\n") + content.append("\t\tcase <-ticker.C:\n") + content.append("\t\t\tjob, err := cli.QueryJob(jobUUID)\n") + content.append("\t\t\tif err != nil {\n") + content.append("\t\t\t\tcontinue\n") + content.append("\t\t\t}\n") + content.append("\n") + content.append("\t\t\tif job.State == JobStateSucceeded {\n") + content.append("\t\t\t\tif result != nil && job.Result != nil {\n") + content.append("\t\t\t\t\tdata, err := json.Marshal(job.Result)\n") + content.append("\t\t\t\t\tif err != nil {\n") + content.append("\t\t\t\t\t\treturn fmt.Errorf(\"failed to marshal job result: %v\", err)\n") + content.append("\t\t\t\t\t}\n") + content.append("\t\t\t\t\treturn json.Unmarshal(data, result)\n") + content.append("\t\t\t\t}\n") + content.append("\t\t\t\treturn nil\n") + content.append("\t\t\t}\n") + content.append("\n") + content.append("\t\t\tif job.State == JobStateFailed {\n") + content.append("\t\t\t\treturn fmt.Errorf(\"job failed: %v\", job.Error)\n") + content.append("\t\t\t}\n") + content.append("\t\t}\n") + content.append("\t}\n") + content.append("}\n\n") + content.append("func (cli *ZSClient) buildQueryString(params *param.QueryParam) string {\n") + content.append("\tif params == nil {\n") + content.append("\t\treturn \"\"\n") + content.append("\t}\n") + content.append("\tu := url.Values{}\n") + content.append("\n") + content.append("\tfor _, q := range params.Conditions {\n") + content.append("\t\tif q.Name != \"\" && q.Op != \"\" {\n") + content.append("\t\t\tu.Add(\"q\", fmt.Sprintf(\"%s%s%s\", q.Name, q.Op, q.Value))\n") + content.append("\t\t} else if q.Value != \"\" {\n") + content.append("\t\t\tu.Add(\"q\", q.Value)\n") + content.append("\t\t}\n") + content.append("\t}\n") + content.append("\n") + content.append("\tif params.LimitNum != nil {\n") + content.append("\t\tu.Set(\"limit\", strconv.Itoa(*params.LimitNum))\n") + content.append("\t}\n") + content.append("\tif params.StartNum != nil {\n") + content.append("\t\tu.Set(\"start\", strconv.Itoa(*params.StartNum))\n") + content.append("\t}\n") + content.append("\tif params.Count {\n") + content.append("\t\tu.Set(\"count\", \"true\")\n") + content.append("\t}\n") + content.append("\tif params.ReplyWithCount {\n") + content.append("\t\tu.Set(\"replyWithCount\", \"true\")\n") + content.append("\t}\n") + content.append("\tif params.GroupBy != \"\" {\n") + content.append("\t\tu.Set(\"groupBy\", params.GroupBy)\n") + content.append("\t}\n") + content.append("\tif params.SortBy != \"\" {\n") + content.append("\t\tu.Set(\"sortBy\", params.SortBy)\n") + content.append("\t}\n") + content.append("\tif params.SortDirection != \"\" {\n") + content.append("\t\tu.Set(\"sortDirection\", params.SortDirection)\n") + content.append("\t}\n") + content.append("\tfor _, f := range params.Fields {\n") + content.append("\t\tu.Add(\"fields\", f)\n") + content.append("\t}\n") + content.append("\n") + content.append("\treturn u.Encode()\n") + content.append("}\n\n") + content.append("func (cli *ZSClient) addAuthHeaders(req *http.Request) {\n") + content.append("\tif cli.config.authType == AuthTypeAccessKey {\n") + content.append("\t\treq.Header.Set(\"X-Access-Key-Id\", cli.config.accessKeyId)\n") + content.append("\t\treq.Header.Set(\"X-Access-Key-Secret\", cli.config.accessKeySecret)\n") + content.append("\t} else if cli.sessionId != \"\" {\n") + content.append("\t\treq.Header.Set(\"Authorization\", \"OAuth \"+cli.sessionId)\n") + content.append("\t}\n") + content.append("}\n\n") + content.append("// Login authenticates with username and password\n") + content.append("func (cli *ZSClient) Login(username, password string) error {\n") + content.append("\tif cli.config.authType != AuthTypeLogin {\n") + content.append("\t\treturn fmt.Errorf(\"client is not configured for login authentication\")\n") + content.append("\t}\n\n") + content.append("\tvar loginReq = map[string]map[string]string{\n") + content.append("\t\t\"logInByAccount\": {\n") + content.append("\t\t\t\"accountName\": username,\n") + content.append("\t\t\t\"password\": password, // Already hashed in NewZSClient\n") + content.append("\t\t},\n") + content.append("\t}\n\n") + content.append("\tvar loginResp struct {\n") + content.append("\t\tInventory struct {\n") + content.append("\t\t\tUUID string `json:\"uuid\"`\n") + content.append("\t\t} `json:\"inventory\"`\n") + content.append("\t}\n\n") + content.append("\turl := fmt.Sprintf(\"%s/v1/accounts/login\", cli.baseURL())\n") + content.append("\terr := cli.doRequest(\"PUT\", url, loginReq, &loginResp)\n") + content.append("\tif err != nil {\n") + content.append("\t\treturn fmt.Errorf(\"login failed: %v\", err)\n") + content.append("\t}\n\n") + content.append("\tcli.sessionId = loginResp.Inventory.UUID\n") + content.append("\tif cli.config.debug {\n") + content.append("\t\tfmt.Printf(\"[DEBUG] Login successful, sessionId=%s\\n\", cli.sessionId)\n") + content.append("\t}\n") + content.append("\treturn nil\n") + content.append("}\n\n") + content.append("func (cli *ZSClient) Logout() error {\n") + content.append("\tif cli.sessionId == \"\" {\n") + content.append("\t\treturn nil\n") + content.append("\t}\n\n") + content.append("\turl := fmt.Sprintf(\"%s/v1/accounts/sessions/%s\", cli.baseURL(), cli.sessionId)\n") + content.append("\terr := cli.doRequest(\"DELETE\", url, nil, nil)\n") + content.append("\tcli.sessionId = \"\"\n") + content.append("\treturn err\n") + content.append("}\n") + + sdkFile.content = content.toString() + return sdkFile + } + + /** + * Generate base view file + */ + private SdkFile generateBaseViewFile() { + def sdkFile = new SdkFile() + sdkFile.subPath = "/pkg/view/" + sdkFile.fileName = "base_views.go" + + def content = new StringBuilder() + content.append("// Copyright (c) ZStack.io, Inc.\n\n") + content.append("package view\n\n") + content.append("import \"time\"\n\n") + content.append("// BaseInfoView holds common identity fields\n") + content.append("type BaseInfoView struct {\n") + content.append("\tUUID string `json:\"uuid\"` // Unique resource identifier\n") + content.append("\tName string `json:\"name,omitempty\"` // Resource name\n") + content.append("}\n\n") + + content.append("type BaseTimeView struct {\n") + content.append("\tCreateDate time.Time `json:\"createDate,omitempty\"` // Creation time\n") + content.append("\tLastOpDate time.Time `json:\"lastOpDate,omitempty\"` // Last operation time\n") + content.append("}\n\n") + + // Add generic wrapper types for simple return values + content.append("// Generic wrapper types for APIs that return simple data types\n\n") + content.append("// MapView wraps map return values\n") + content.append("type MapView map[string]interface{}\n\n") + content.append("// ListView wraps list/array return values\n") + content.append("type ListView []interface{}\n\n") + content.append("// StringView wraps string return values\n") + content.append("type StringView string\n\n") + content.append("// BooleanView wraps boolean return values\n") + content.append("type BooleanView bool\n\n") + content.append("// IntView wraps integer return values\n") + content.append("type IntView int\n\n") + content.append("// LongView wraps long integer return values\n") + content.append("type LongView int64\n\n") + content.append("// SuccessView represents successful operation with no data return\n") + content.append("type SuccessView struct {\n") + content.append("\tSuccess bool `json:\"success\"`\n") + content.append("}\n") + + sdkFile.content = content.toString() + return sdkFile + } + + /** + * Load base_params.go from template file + */ + private SdkFile loadBaseParamTemplate() { + def sdkFile = new SdkFile() + sdkFile.subPath = "/pkg/param/" + sdkFile.fileName = "base_params.go" + + try { + def templateStream = this.class.getResourceAsStream("/scripts/templates/base_params.go.template") + if (templateStream != null) { + sdkFile.content = templateStream.text + logger.warn("[GoSDK] Loaded base_params.go from template file") + } else { + logger.error("[GoSDK] base_params.go.template not found in classpath") + throw new RuntimeException("base_params.go.template not found") + } + } catch (Exception e) { + logger.error("[GoSDK] Failed to load base_params.go template: ${e.message}") + throw e + } + + return sdkFile + } + + /** + * Generate errors file + */ + private SdkFile generateErrorsFile() { + def sdkFile = new SdkFile() + sdkFile.subPath = "/pkg/errors/" + sdkFile.fileName = "errors.go" + + def content = new StringBuilder() + content.append("// Copyright (c) ZStack.io, Inc.\n\n") + content.append("package errors\n\n") + content.append("import \"fmt\"\n\n") + content.append("// Error custom error type\n") + content.append("type Error string\n\n") + content.append("func (e Error) Error() string {\n") + content.append("\treturn string(e)\n") + content.append("}\n\n") + content.append("const (\n") + content.append("\tErrNotFound = Error(\"NotFoundError\")\n") + content.append("\tErrDuplicateId = Error(\"DuplicateIdError\")\n") + content.append("\tErrParameter = Error(\"ParameterError\")\n") + content.append("\tErrAuth = Error(\"AuthError\")\n") + content.append("\tErrPermission = Error(\"PermissionError\")\n") + content.append("\tErrInternal = Error(\"InternalError\")\n") + content.append(")\n\n") + content.append("// Wrap wraps an error with a message\n") + content.append("func Wrap(err error, message string) error {\n") + content.append("\tif err == nil {\n") + content.append("\t\treturn nil\n") + content.append("\t}\n") + content.append("\treturn fmt.Errorf(\"%s: %w\", message, err)\n") + content.append("}\n\n") + content.append("// ErrorCode API error code structure\n") + content.append("type ErrorCode struct {\n") + content.append("\tCode string `json:\"code\"`\n") + content.append("\tDescription string `json:\"description\"`\n") + content.append("\tDetails string `json:\"details\"`\n") + content.append("\tElaboration string `json:\"elaboration\"`\n") + content.append("\tCause *ErrorCode `json:\"cause\"`\n") + content.append("}\n") + + sdkFile.content = content.toString() + return sdkFile + } + + /** + * Generate view files + */ + + /** + * Group inventories by resource + */ + + /** + * Get view struct name + */ + String getViewStructName(Class clz) { + if (viewStructNameMap.containsKey(clz)) { + return viewStructNameMap.get(clz) + } + + String name = clz.simpleName + String structName + + if (name.endsWith("Inventory")) { + structName = name.replace("Inventory", "InventoryView") + } else if (name.endsWith("Reply")) { + structName = name.replace("Reply", "View").replaceAll('^API', '') + } else { + structName = name + "View" + } + + if (structName.startsWith("API")) { + structName = structName.substring(3) + } + + viewStructNameMap.put(clz, structName) + return structName + } + + /** + * Convert to snake_case + */ + private String toSnakeCase(String name) { + return name.replaceAll('([a-z])([A-Z])', '$1_$2').toLowerCase() + } + + /** + * Find a field in the class hierarchy (including parent classes) + */ + private Field findFieldInHierarchy(Class clazz, String fieldName) { + if (clazz == null || fieldName == null) { + return null + } + + // Search through all fields including inherited ones + for (Field f : FieldUtils.getAllFields(clazz)) { + if (f.name == fieldName) { + return f + } + } + + // Manual search through hierarchy as fallback + Class current = clazz + while (current != null && current != Object.class) { + try { + return current.getDeclaredField(fieldName) + } catch (NoSuchFieldException e) { + current = current.superclass + } + } + + return null + } + + /** + * Generate view struct + */ + String generateViewStruct(Class inventoryClazz, String structName) { + if (inventoryClazz == null || structName == null) { return "" } + logger.warn("[GoSDK] generateViewStruct called: inventoryClass=${inventoryClazz.simpleName}, structName=${structName}") + + // Track current class for detecting self-references + Class previousClass = currentGeneratingClass + currentGeneratingClass = inventoryClazz + def apiParamMap = new HashMap() if (inventoryClazz.isAnnotationPresent(OverriddenApiParams.class)) { - for (OverriddenApiParam overriddenApiParam :inventoryClazz.getAnnotation(OverriddenApiParams.class).value()) { - apiParamMap.put(overriddenApiParam.field(), overriddenApiParam.param()) + for (OverriddenApiParam oap : inventoryClazz.getAnnotation(OverriddenApiParams.class).value()) { + apiParamMap.put(oap.field(), oap.param()) + } + } + + def fieldMap = new LinkedHashMap() + FieldUtils.getAllFields(inventoryClazz).each { Field f -> + if (!Modifier.isStatic(f.modifiers)) { + fieldMap.put(f.name, f) } } - def fieldMap = new HashMap() - FieldUtils.getAllFields(inventoryClazz).forEach({ it -> fieldMap.put(it.name, it) }) + if (inventoryClazz.isAnnotationPresent(RestResponse.class)) { - //allTo def at = inventoryClazz.getAnnotation(RestResponse.class) if (at.allTo() != "") { - fieldMap = new HashMap() - fieldMap.put(at.allTo(), inventoryClazz.getDeclaredField(at.allTo())) + fieldMap = new LinkedHashMap() + Field targetField = findFieldInHierarchy(inventoryClazz, at.allTo()) + if (targetField != null) { + fieldMap.put(at.allTo(), targetField) + } else { + logger.warn("[GoSDK] Field '" + at.allTo() + "' not found in class " + inventoryClazz.simpleName + " or its parents") + } } else if (at.fieldsTo().size() != 0 && at.fieldsTo()[0] != "all") { - fieldMap = new HashMap() + fieldMap = new LinkedHashMap() for (String fieldsTo : at.fieldsTo()) { - def spilt = fieldsTo.split("=") - if (spilt.size() == 1) { - fieldMap.put(spilt[0], inventoryClazz.getDeclaredField(spilt[0])) + def split = fieldsTo.split("=") + String fieldName = split.size() == 1 ? split[0] : split[1] + String outputName = split[0] + Field targetField = findFieldInHierarchy(inventoryClazz, fieldName) + if (targetField != null) { + fieldMap.put(outputName, targetField) } else { - fieldMap.put(spilt[0], inventoryClazz.getDeclaredField(spilt[1])) + logger.warn("[GoSDK] Field '" + fieldName + "' not found in class " + inventoryClazz.simpleName + " or its parents") } } } } - def inventoryBuilder = new StringBuilder() - inventoryBuilder.append("type ${structName} struct {\n") - fieldMap.forEach { k, v -> - if (v.isAnnotationPresent(APINoSee.class)) { + + def builder = new StringBuilder() + builder.append("// ${structName} ${getStructDescription(inventoryClazz)}\n") + builder.append("type ${structName} struct {\n") + + // InventoryView embeds BaseInfoView and BaseTimeView + if (structName.endsWith('InventoryView')) { + builder.append("\tBaseInfoView\n") + builder.append("\tBaseTimeView\n") + } + + boolean hasFields = false + fieldMap.each { String fieldName, Field field -> + if (field.isAnnotationPresent(APINoSee.class)) { + return + } + if ('error' == fieldName && structName.endsWith('View')) { + return + } + + // Skip fields already covered by BaseInfoView and BaseTimeView + if (structName.endsWith('InventoryView')) { + if (fieldName in ['uuid', 'name', 'createDate', 'lastOpDate']) { + return + } + } + + String goFieldName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1) + String baseFieldType = generateFieldGeneric(field) + + // View structs avoid pointer fields; omitempty handles optional zero values + String fieldType = baseFieldType + String jsonTag = generateJsonTag(fieldName, field, apiParamMap) + + builder.append("\t${goFieldName} ${fieldType} ${jsonTag}\n") + hasFields = true + } + + // For empty Event/Reply classes (e.g., success-only responses), add a Success field + if (!hasFields && structName.endsWith('View') && !structName.endsWith('InventoryView')) { + builder.append("\t// Empty response - operation succeeded\n") + } + + builder.append("}\n\n") + + // Restore previous class context + currentGeneratingClass = previousClass + + String result = builder.toString() + logger.warn("[GoSDK] generateViewStruct result for ${structName}: length=${result.length()}") + return result + } + + /** + * Generate param struct (called by GoApiTemplate) + * Nested types are collected but generated separately in base_param_types.go + */ + String generateParamStruct(Class apiMsgClazz, String paramStructName, String detailParamStructName, RestRequest restRequest) { + if (apiMsgClazz == null) { + return "" + } + + // Enable param mode - will use different type naming and collect nested types + generatingForParam = true + + def apiParamMap = new HashMap() + if (apiMsgClazz.isAnnotationPresent(OverriddenApiParams.class)) { + for (OverriddenApiParam oap : apiMsgClazz.getAnnotation(OverriddenApiParams.class).value()) { + apiParamMap.put(oap.field(), oap.param()) + } + } + + def fieldMap = new LinkedHashMap() + FieldUtils.getAllFields(apiMsgClazz).each { Field f -> + if (!Modifier.isStatic(f.modifiers) && !f.isAnnotationPresent(APINoSee.class)) { + fieldMap.put(f.name, f) + } + } + + def builder = new StringBuilder() + + // Generate detail param struct + builder.append("// ${detailParamStructName} ${getStructDescription(apiMsgClazz)} detail param\n") + builder.append("type ${detailParamStructName} struct {\n") + + // Extract path parameters from @RestRequest to skip them + // Path parameters come from URL, not request body + def pathParams = [] + if (restRequest != null && restRequest.path() != null) { + def matcher = (restRequest.path() =~ /\{([^}]+)\}/) + while (matcher.find()) { + pathParams.add(matcher.group(1)) + } + } + + // Skip fields that should be in BaseParam or QueryParam + // Also skip path parameters (they come from URL, not request body) + def skipFields = ['systemTags', 'userTags', 'requestIp', 'session', 'timeout', 'id', 'serviceId', 'creatingAccountUuid'] + pathParams + + fieldMap.each { String fieldName, Field field -> + if (field.isAnnotationPresent(APINoSee.class)) { return } - if ('error' == k && structName.endsWith('Rsp')) { + if (skipFields.contains(fieldName)) { + return + } + + String goFieldName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1) + boolean isOptional = isOptionalField(field, apiParamMap) + String fieldType = generateParamFieldGeneric(field, apiParamMap, isOptional) + String jsonTag = generateJsonTag(fieldName, field, apiParamMap) + + builder.append("\t${goFieldName} ${fieldType} ${jsonTag}\n") + } + + builder.append("}\n\n") + + // Generate wrapper param struct + // Prefer @RestRequest.parameterName; if missing or "null", derive it from the class name + String jsonKey + if (restRequest != null && restRequest.parameterName() != null && + !restRequest.parameterName().isEmpty() && !restRequest.parameterName().equals("null")) { + jsonKey = restRequest.parameterName() + } else { + // Derive action name from API class, e.g., APIUpdateImageMsg -> updateImage + String apiClassName = apiMsgClazz.simpleName + String actionName = apiClassName.replaceAll('^API', '').replaceAll('Msg$', '') + jsonKey = actionName.substring(0, 1).toLowerCase() + actionName.substring(1) + } + // Use a consistent field name Params for convenience + String fieldName = "Params" + + builder.append("// ${paramStructName} ${getStructDescription(apiMsgClazz)} request param\n") + builder.append("type ${paramStructName} struct {\n") + builder.append("\tBaseParam\n") + builder.append("\t${fieldName} ${detailParamStructName} `json:\"${jsonKey}\"`\n") + builder.append("}\n") + + generatingForParam = false + + return builder.toString() + } + + /** + * Generate field type for param (uses different naming - no View suffix) + */ + private String generateParamFieldGeneric(Field field, Map apiParamMap, boolean isOptional) { + if (!(field.getGenericType() instanceof ParameterizedType)) { + return generateParamFieldType(field, null, apiParamMap, isOptional) + } + String typeName = "" + if (Collection.class.isAssignableFrom(field.type)) { + Type type = ((ParameterizedType) field.getGenericType()).actualTypeArguments[0] + // Slices and maps stay non-pointer because they are reference types + typeName = "[]" + generateParamFieldType(null, type, apiParamMap, false) + } + if (Map.class.isAssignableFrom(field.type)) { + Type value = ((ParameterizedType) field.getGenericType()).actualTypeArguments[1] + // Slices and maps stay non-pointer because they are reference types + typeName = "map[string]" + generateParamFieldType(null, value, apiParamMap, false) + } + return typeName + } + + /** + * Generate field type for param - complex types go to param package + */ + private String generateParamFieldType(Field field, Type type, Map apiParamMap, boolean isOptional) { + String baseType = null + + if (field != null) { + Class fieldType = field.type + String goType = mapJavaTypeToGoType(fieldType) + if (goType != null) { + baseType = goType + } else if (isGeneratableClass(fieldType)) { + // For complex types in param, add to paramNestedTypes for generation in param package + paramNestedTypes.add(fieldType) + logger.debug("[GoSDK] Added param nested type: " + fieldType.simpleName) + baseType = getParamStructName(fieldType) + } else if (!fieldType.isPrimitive() && !fieldType.isEnum()) { + baseType = "interface{}" + } + } + + if (type != null && baseType == null) { + if (type instanceof Class) { + Class clz = (Class) type + String goType = mapJavaTypeToGoType(clz) + if (goType != null) { + baseType = goType + } else if (isGeneratableClass(clz)) { + // For complex types in param, add to paramNestedTypes + paramNestedTypes.add(clz) + logger.debug("[GoSDK] Added param nested type: " + clz.simpleName) + baseType = getParamStructName(clz) + } else { + baseType = "interface{}" + } + } else if (type instanceof ParameterizedType) { + ParameterizedType pt = (ParameterizedType) type + Class clz = (Class) pt.rawType + if (isGeneratableClass(clz)) { + paramNestedTypes.add(clz) + baseType = getParamStructName(clz) + } else { + baseType = "interface{}" + } + } else { + baseType = "interface{}" + } + } + + if (baseType == null) { + baseType = "interface{}" + } + + // Optional basic types (string, int, int64, bool, etc.) use pointers; interface{}, slices, and maps stay as non-pointers because they already carry reference/nil semantics + def basicTypes = ["string", "int", "int64", "int32", "float64", "float32", "bool"] as Set + if (isOptional && !baseType.startsWith("[") && !baseType.startsWith("map[") && + !baseType.equals("interface{}") && basicTypes.contains(baseType)) { + return "*" + baseType + } + + return baseType + } + + /** + * Get param struct name (without View suffix) + */ + private String getParamStructName(Class clz) { + String name = clz.simpleName + if (clz.enclosingClass != null) { + String outerName = clz.enclosingClass.simpleName.replaceAll('^API', '').replaceAll('Msg$', '').replaceAll('Action$', '') + // For nested inner classes, include parent for uniqueness + name = outerName + "_" + name + logger.debug("[GoSDK] Identified inner class: ${clz.name} -> ${name}Param") + } + if (name.endsWith("Inventory")) { + return name.replace("Inventory", "") + "Param" + } + return name + "Param" + } + + /** + * Generate param nested types content + */ + private String generateParamNestedTypes() { + if (paramNestedTypes.isEmpty()) { + return "" + } + + def builder = new StringBuilder() + + // Use a queue-like approach to handle newly discovered types during generation + def typesToProcess = new ArrayList(paramNestedTypes) + int index = 0 + + // Enable param mode for nested type generation + generatingForParam = true + + while (index < typesToProcess.size()) { + Class clz = typesToProcess.get(index) + String structName = getParamStructName(clz) + if (!generatedParamStructs.contains(structName)) { + generatedParamStructs.add(structName) + builder.append(generateParamNestedStruct(clz, structName)) + + // Check if new types were added during generation + paramNestedTypes.each { Class newClz -> + if (!typesToProcess.contains(newClz)) { + typesToProcess.add(newClz) + } + } + } + index++ + } + + generatingForParam = false + + return builder.toString() + } + + /** + * Load base_param_types.go from template file and append dynamically generated param types + */ + private SdkFile loadBaseParamTypesTemplate() { + def sdkFile = new SdkFile() + sdkFile.subPath = "/pkg/param/" + sdkFile.fileName = "base_param_types.go" + + def content = new StringBuilder() + + try { + // Load template with fixed base param types + def templateStream = this.class.getResourceAsStream("/scripts/templates/base_param_types.go.template") + if (templateStream != null) { + content.append(templateStream.text) + logger.warn("[GoSDK] Loaded base_param_types.go from template file") + } else { + logger.error("[GoSDK] base_param_types.go.template not found in classpath") + throw new RuntimeException("base_param_types.go.template not found") + } + + // Append dynamically generated param nested types + if (!paramNestedTypes.isEmpty()) { + logger.warn("[GoSDK] Appending ${paramNestedTypes.size()} dynamically generated param types") + content.append("\n// ========== Dynamically Generated Param Types ==========\n\n") + String nestedTypes = generateParamNestedTypes() + content.append(nestedTypes) + } else { + logger.warn("[GoSDK] No dynamic param nested types to append") + } + + sdkFile.content = content.toString() + } catch (Exception e) { + logger.error("[GoSDK] Failed to load base_param_types.go template: ${e.message}") + throw e + } + + return sdkFile + } + + /** + * Load login_params.go from template file + */ + private SdkFile loadLoginParamsTemplate() { + def sdkFile = new SdkFile() + sdkFile.subPath = "/pkg/param/" + sdkFile.fileName = "login_params.go" + + try { + def templateStream = this.class.getResourceAsStream("/scripts/templates/login_params.go.template") + if (templateStream != null) { + sdkFile.content = templateStream.text + logger.warn("[GoSDK] Loaded login_params.go from template file") + + // Mark Login-related params as generated to avoid duplicates + generatedParamStructs.add("LoginByAccountParam") + generatedParamStructs.add("LoginByAccountDetailParam") + generatedParamStructs.add("LogInByUserParam") + generatedParamStructs.add("LogInByUserDetailParam") + generatedParamStructs.add("LoginIAM2VirtualIDWithLdapParam") + generatedParamStructs.add("LoginIAM2VirtualIDWithLdapDetailParam") + generatedParamStructs.add("LoginIAM2PlatformParam") + generatedParamStructs.add("LoginIAM2PlatformDetailParam") + generatedParamStructs.add("ValidateSessionParam") + } else { + logger.error("[GoSDK] login_params.go.template not found in classpath") + throw new RuntimeException("login_params.go.template not found") + } + } catch (Exception e) { + logger.error("[GoSDK] Failed to load login_params.go template: ${e.message}") + throw e + } + + return sdkFile + } + + /** + * Load session_additional_views.go from template file + */ + private SdkFile loadSessionViewsTemplate() { + def sdkFile = new SdkFile() + sdkFile.subPath = "/pkg/view/" + sdkFile.fileName = "session_additional_views.go" + + try { + def templateStream = this.class.getResourceAsStream("/scripts/templates/session_additional_views.go.template") + if (templateStream != null) { + sdkFile.content = templateStream.text + logger.warn("[GoSDK] Loaded session_additional_views.go from template file") + + // Mark Session-related views as generated to avoid duplicates + generatedViewStructs.add("SessionInventoryView") + generatedViewStructs.add("WebUISessionView") + } else { + logger.error("[GoSDK] session_additional_views.go.template not found in classpath") + throw new RuntimeException("session_additional_views.go.template not found") + } + } catch (Exception e) { + logger.error("[GoSDK] Failed to load session_additional_views.go template: ${e.message}") + throw e + } + + return sdkFile + } + + /** + * Generate a nested struct for param package + */ + private String generateParamNestedStruct(Class clazz, String structName) { + if (clazz == null) { + return "" + } + + // Build APIParam map for this class + def apiParamMap = new HashMap() + if (clazz.isAnnotationPresent(OverriddenApiParams.class)) { + for (OverriddenApiParam oap : clazz.getAnnotation(OverriddenApiParams.class).value()) { + apiParamMap.put(oap.field(), oap.param()) + } + } + + def fieldMap = new LinkedHashMap() + FieldUtils.getAllFields(clazz).each { Field f -> + if (!Modifier.isStatic(f.modifiers)) { + fieldMap.put(f.name, f) + } + } + + def builder = new StringBuilder() + builder.append("// ${structName} ${clazz.simpleName} param struct\n") + builder.append("type ${structName} struct {\n") + + fieldMap.each { String fieldName, Field field -> + if (field.isAnnotationPresent(APINoSee.class)) { return } - //name - String name = k.substring(0, 1).toUpperCase() + k.substring(1) - inventoryBuilder.append("\t" + name) - //type - inventoryBuilder.append(" " + generateFieldGeneric(v)) - //json tag - inventoryBuilder.append(' `json:"' + k + '" ' + generateValidatorString(v, apiParamMap) + '`\n') + + String goFieldName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1) + // Nested types are typically optional (used in request params) + boolean isOptional = isOptionalField(field, apiParamMap) + String fieldType = generateParamFieldGeneric(field, apiParamMap, isOptional) + String jsonTag = "`json:\"${fieldName},omitempty\"`" + + builder.append("\t${goFieldName} ${fieldType} ${jsonTag}\n") + } + + builder.append("}\n\n") + return builder.toString() + } + + /** + * Check if there are param nested types to generate + */ + boolean hasParamNestedTypes() { + return !paramNestedTypes.isEmpty() + } + + /** + * For backward compatibility + */ + String generateStruct(Class clazz, String structName) { + return generateViewStruct(clazz, structName) + } + + private String getStructDescription(Class clz) { + String name = clz.simpleName + return name.replaceAll("API", "") + .replaceAll('Msg$', "") + .replaceAll('Inventory$', "") + .replaceAll('Reply$', "") + } + + private String generateJsonTag(String fieldName, Field field, Map apiParamMap) { + def tags = new StringBuilder() + tags.append('`json:"') + tags.append(fieldName) + + boolean required = false + if (field.isAnnotationPresent(APIParam.class)) { + APIParam param = apiParamMap.containsKey(fieldName) ? + apiParamMap.get(fieldName) : field.getAnnotation(APIParam.class) + required = param.required() + } + + if (!required) { + tags.append(',omitempty') } - inventoryBuilder.append("}\n\n") - return inventoryBuilder.toString() + + tags.append('"') + + if (required) { + tags.append(' validate:"required"') + } + + tags.append('`') + return tags.toString() + } + + /** + * Determine whether a field is optional (and should use a pointer type) + */ + private boolean isOptionalField(Field field, Map apiParamMap) { + if (field == null) return false + + // 0. uuid and name always have values; keep them non-pointer + if (field.name in ["uuid", "name"]) { + return false + } + + // 1. Check APIParam.required flag + if (field.isAnnotationPresent(APIParam.class)) { + APIParam param = apiParamMap.containsKey(field.name) ? + apiParamMap.get(field.name) : field.getAnnotation(APIParam.class) + if (!param.required()) { + return true + } + } + + // 2. Certain fields are optional by default + if (field.name in ["description", "lastOpDate", "expiredDate"]) { + return true + } + + // 3. Non-primitive and non-String types default to optional unless required + Class fieldType = field.type + if (fieldType in [String.class, Integer.class, Long.class, Short.class, Byte.class, + Float.class, Double.class, Boolean.class, Date.class, java.sql.Timestamp.class]) { + // If no APIParam annotation is present, treat as optional + if (!field.isAnnotationPresent(APIParam.class)) { + return true + } + } + + return false } private String generateFieldGeneric(Field field) { @@ -113,46 +1479,642 @@ class GoInventory implements SdkTemplate { } private String generateFieldType(Field field, Type type) { - def value = "interface{}" - if (field != null && field.type.name.contains("Inventory")) { - value = field.type.simpleName - inventories.add(field.type) - } - if (type != null && type.typeName.contains("Inventory") && !type.typeName.contains("<")) { - def split = type.typeName.split('\\.') - split = split[split.length - 1].split('\\$') - value = split[split.length - 1] - Class clz; + if (field != null) { + Class fieldType = field.type + // Special-case top-level inventory fields that are maps or collections to keep Go types aligned with client expectations + if ("inventory" == field.name || "inventories" == field.name) { + if (Map.class.isAssignableFrom(fieldType)) { + // Prefer MapView wrapper for arbitrary maps + return "MapView" + } + if (Collection.class.isAssignableFrom(fieldType)) { + // Try to resolve element type; otherwise fall back to ListView + if (field.getGenericType() instanceof ParameterizedType) { + ParameterizedType pt = (ParameterizedType) field.getGenericType() + Type[] args = pt.getActualTypeArguments() + if (args != null && args.length > 0 && args[0] instanceof Class) { + Class elemClz = (Class) args[0] + String goType = mapJavaTypeToGoType(elemClz, true) + if (goType != null) { + return "[]" + goType + } + if (elemClz.isAnnotationPresent(Inventory.class)) { + inventories.add(elemClz) + return "[]" + getViewStructName(elemClz) + } + if (isGeneratableClass(elemClz)) { + additionalClasses.add(elemClz) + return "[]" + getViewStructName(elemClz) + } + } + } + return "ListView" + } + } + + String goType = mapJavaTypeToGoType(fieldType, true) + if (goType != null) { + return goType + } + + // Check for self-reference (recursive type) - use pointer to break cycle + boolean isSelfReference = (currentGeneratingClass != null && fieldType == currentGeneratingClass) + String pointerPrefix = isSelfReference ? "*" : "" + + if (isSelfReference) { + logger.debug("[GoSDK] Detected self-reference in " + currentGeneratingClass.simpleName + " -> " + fieldType.simpleName) + } + + // Check if the class has @Inventory annotation + if (fieldType.isAnnotationPresent(Inventory.class)) { + inventories.add(fieldType) + return pointerPrefix + getViewStructName(fieldType) + } + + // For non-Inventory complex classes, add to additional classes for generation + if (isGeneratableClass(fieldType)) { + additionalClasses.add(fieldType) + logger.debug("[GoSDK] Added additional class for generation: " + fieldType.simpleName) + return pointerPrefix + getViewStructName(fieldType) + } + + // For Java built-in types or interfaces, use interface{} + if (!fieldType.isPrimitive() && !fieldType.isEnum()) { + return "interface{}" + } + } + + if (type != null) { + if (type instanceof Class) { + Class clz = (Class) type + String goType = mapJavaTypeToGoType(clz, true) + if (goType != null) { + return goType + } + + // Check for self-reference (recursive type) - use pointer to break cycle + boolean isSelfReference = (currentGeneratingClass != null && clz == currentGeneratingClass) + String pointerPrefix = isSelfReference ? "*" : "" + + // Check if the class has @Inventory annotation + if (clz.isAnnotationPresent(Inventory.class)) { + inventories.add(clz) + return pointerPrefix + getViewStructName(clz) + } + + // For non-Inventory complex classes, add to additional classes for generation + if (isGeneratableClass(clz)) { + additionalClasses.add(clz) + logger.debug("[GoSDK] Added additional class for generation: " + clz.simpleName) + return pointerPrefix + getViewStructName(clz) + } + + // For Java built-in types or interfaces, use interface{} + return "interface{}" + } + if (type instanceof ParameterizedType) { ParameterizedType pt = (ParameterizedType) type - clz = ((Class) pt.rawType) - } else if (type instanceof TypeVariable) { - TypeVariable tType = (TypeVariable) type - clz = tType.genericDeclaration.getClass() + Class clz = (Class) pt.rawType + + // Check for self-reference + boolean isSelfReference = (currentGeneratingClass != null && clz == currentGeneratingClass) + String pointerPrefix = isSelfReference ? "*" : "" + + if (clz.isAnnotationPresent(Inventory.class)) { + inventories.add(clz) + return pointerPrefix + getViewStructName(clz) + } + + // For non-Inventory complex classes, add to additional classes + if (isGeneratableClass(clz)) { + additionalClasses.add(clz) + return pointerPrefix + getViewStructName(clz) + } + } + } + + return "interface{}" + } + + /** + * Check if a class is a generatable complex class (not primitive, not array, not Java built-in) + */ + private boolean isGeneratableClass(Class clz) { + if (clz == null) return false + if (clz.isPrimitive()) return false + if (clz.isEnum()) return false + if (clz.isInterface()) return false + if (clz.isArray()) return false // Exclude array types like byte[] + if (clz.name.startsWith("java.")) return false + if (clz.name.startsWith("javax.")) return false + if (clz.name.startsWith("[")) return false // Array internal representation + return true + } + + private String mapJavaTypeToGoType(Class javaType) { + return mapJavaTypeToGoType(javaType, false) + } + + private String mapJavaTypeToGoType(Class javaType, boolean forView) { + if (javaType == null) return null + + // Handle array types + if (javaType.isArray()) { + Class componentType = javaType.getComponentType() + if (componentType == byte.class || componentType == Byte.class) { + // Java byte is signed (-128 to 127), use []int8 instead of []byte (which is []uint8) + return "[]int8" + } + String elementType = mapJavaTypeToGoType(componentType, forView) + if (elementType != null) { + return "[]" + elementType + } + return "[]interface{}" + } + + switch (javaType) { + case String.class: + case Character.class: + case char.class: + return "string" + case Integer.class: + case int.class: + return "int" + case Long.class: + case long.class: + return "int64" + case Short.class: + case short.class: + return "int16" + case Byte.class: + case byte.class: + return "int8" + case Float.class: + case float.class: + return "float32" + case Double.class: + case double.class: + return "float64" + case Boolean.class: + case boolean.class: + return "bool" + case Date.class: + case java.sql.Timestamp.class: + // Normalize to time.Time (replace legacy ZStackTime) + return "time.Time" + default: + if (javaType.isEnum()) { + return "string" + } + return null + } + } + + /** + * Generate other_actions.go for miscellaneous APIs + */ + private SdkFile generateOtherActionsFile() { + logger.warn("[GoSDK] Generating other_actions.go...") + + def sdkFile = new SdkFile() + sdkFile.subPath = "/pkg/client/" + sdkFile.fileName = "other_actions.go" + + // Collect all method code first to check if fmt is needed + StringBuilder methodsContent = new StringBuilder() + + allApiTemplates.each { GoApiTemplate template -> + if (template.isActionGrouped) return + + // Skip methods that are manually maintained in client.go + String apiName = template.getApiMsgClazz()?.simpleName ?: "" + if (apiName.contains("ValidateSession") || apiName.contains("LogIn") || apiName.contains("Login")) { + logger.debug("[GoSDK] Skipping manually maintained API in other_actions: " + apiName) + template.isActionGrouped = true + return + } + + // Check for duplicate method names (including Get methods from Query APIs) + Set methodNames = template.getGeneratedMethodNames() + boolean hasDuplicate = methodNames.any { generatedClientMethods.contains(it) } + + if (hasDuplicate) { + logger.warn("[GoSDK] Skipping duplicate method in other_actions: ${template.clzName} (methods ${methodNames} already generated)") + template.isActionGrouped = true + return + } + + String code = template.generateMethodCode() + if (code != "" && code != null) { + methodsContent.append(code).append("\n") + methodNames.each { generatedClientMethods.add(it) } + template.isActionGrouped = true + GoApiTemplate.groupedApiNames.add(template.clzName) + logger.debug("[GoSDK] Grouped orphaned action: " + template.clzName) + } + } + + // Check if fmt is needed (for fmt.Sprintf in multi-placeholder paths) + boolean needsFmt = methodsContent.toString().contains("fmt.Sprintf") + + def content = new StringBuilder() + content.append("// Copyright (c) ZStack.io, Inc.\n\n") + content.append("package client\n\n") + content.append("import (\n") + if (needsFmt) { + content.append("\t\"fmt\"\n") + } + content.append("\t\"github.com/zstackio/zstack-sdk-go-v2/pkg/param\"\n") + content.append("\t\"github.com/zstackio/zstack-sdk-go-v2/pkg/view\"\n") + content.append(")\n\n") + content.append("var _ = param.BaseParam{} // avoid unused import\n") + content.append("var _ = view.MapView{} // avoid unused import\n\n") + + // Append the collected methods + content.append(methodsContent.toString()) + + sdkFile.content = content.toString() + return sdkFile + } + + /** + * Generate other_views.go for miscellaneous APIs (Catch-all) + * This catches ALL response classes that haven't been generated yet, regardless of resource grouping + */ + private SdkFile generateOtherViewsFile() { + logger.warn("[GoSDK] Generating other_views.go...") + logger.warn("[GoSDK] Total API templates to check: " + allApiTemplates.size()) + + def sdkFile = new SdkFile() + sdkFile.subPath = "/pkg/view/" + sdkFile.fileName = "other_views.go" + + def content = new StringBuilder() + content.append("// Copyright (c) ZStack.io, Inc.\n\n") + content.append("package view\n\n") + content.append("import \"time\"\n\n") + content.append("var _ = time.Now // avoid unused import\n\n") + + int addedCount = 0 + Set processedViews = new HashSet<>() + + // Generate response views for ALL APIs, catching anything missed + allApiTemplates.each { GoApiTemplate template -> + Class responseClass = template.getResponseClass() + if (responseClass == null) { + return + } + + String viewStructName = getViewStructName(responseClass) + + // Skip if already processed in this pass + if (processedViews.contains(viewStructName)) { + return + } + processedViews.add(viewStructName) + + // Skip if already generated in resource views + if (generatedViewStructs.contains(viewStructName)) { + logger.debug("[GoSDK] View ${viewStructName} already generated (from ${template.clzName})") + return + } + + // Generate the response view + String structCode = template.generateResponseViewCode() + if (structCode != null && structCode != "") { + generatedViewStructs.add(viewStructName) + content.append(structCode) + addedCount++ + logger.warn("[GoSDK] Added view to other_views.go: " + viewStructName + " (from ${template.clzName})") } else { - clz = (Class) type + logger.warn("[GoSDK] Failed to generate view: " + viewStructName + " (from ${template.clzName})") } - inventories.add(clz) } - return value + + logger.warn("[GoSDK] Finished other_views.go, added ${addedCount} views") + + sdkFile.content = content.toString() + return sdkFile } - private static String generateValidatorString(Field field, Map overriden) { - def value = new StringBuilder("") - if (!field.isAnnotationPresent(APIParam.class)) { - return value + /** + * Generate other_params.go for miscellaneous APIs + */ + private SdkFile generateOtherParamsFile() { + logger.warn("[GoSDK] Generating other_params.go...") + + def sdkFile = new SdkFile() + sdkFile.subPath = "/pkg/param/" + sdkFile.fileName = "other_params.go" + + def content = new StringBuilder() + content.append("// Copyright (c) ZStack.io, Inc.\n\n") + content.append("package param\n\n") + + Set> apiClasses = Platform.reflections.getTypesAnnotatedWith(RestRequest.class) + logger.warn("[GoSDK] Total APIs found for other_params: " + apiClasses.size()) + + int addedCount = 0 + int skippedCount = 0 + allApiTemplates.each { GoApiTemplate template -> + // Skip if already grouped in a resource-specific param file + if (template.isParamGrouped) { + skippedCount++ + return + } + + // Skip Login-related APIs (handled by login_params.go template) + String apiName = template.getApiMsgClazz()?.simpleName ?: "" + if (apiName.contains("LogIn") || apiName.contains("Login") || apiName.contains("ValidateSession")) { + logger.debug("[GoSDK] Skipping Login/Session API in other_params: " + apiName) + template.isParamGrouped = true + skippedCount++ + return + } + + // If it's not a query message AND it hasn't been generated individually + if (!template.isQueryMessage()) { + String paramStructName = template.getParamStructName() + String detailParamName = template.getDetailParamStructName() + + // Double-check: skip if already in generatedParamStructs (from grouped files) + if (!generatedParamStructs.contains(paramStructName)) { + String structCode = generateParamStruct(template.getApiMsgClazz(), paramStructName, detailParamName, template.getAt()) + if (structCode != "") { + generatedParamStructs.add(paramStructName) + generatedParamStructs.add(detailParamName) + content.append(structCode) + addedCount++ + logger.warn("[GoSDK] Added orphaned param to other_params.go: " + paramStructName + " (from ${template.getApiMsgClazz().simpleName})") + } + template.isParamGrouped = true + } else { + skippedCount++ + logger.debug("[GoSDK] Skipping already generated param: " + paramStructName) + template.isParamGrouped = true + } + } } - APIParam annotation = overriden.containsKey(field.name) ? overriden[field.name] : field.getAnnotation(APIParam.class) - if (!annotation.required()) { - return value + logger.warn("[GoSDK] Finished other_params.go, added ${addedCount} params, skipped ${skippedCount}") + + sdkFile.content = content.toString() + return sdkFile + } + + /** + * Revised generateViewFiles to include response Events/Replies + */ + private List generateViewFiles() { + def files = [] + def fileMap = [:] // Map fileName -> SdkFile for merging multiple inventories + + // Deduplicate inventories first - use LinkedHashSet to maintain order and remove duplicates + def uniqueInventories = new LinkedHashSet(inventories) + logger.warn("[GoSDK] Starting generateViewFiles: ${inventories.size()} inventories (${uniqueInventories.size()} unique)") + + // Use a list and index to handle dynamically added inventories + def activeInventories = new ArrayList(uniqueInventories) + int index = 0 + + while (index < activeInventories.size()) { + Class inventoryClass = activeInventories.get(index) + String prefix = inventoryClass.simpleName.replaceAll('Inventory$', '') + String structName = getViewStructName(inventoryClass) + String fileName = "${toSnakeCase(prefix)}_views.go" + + logger.warn("[GoSDK] Processing inventory [${index + 1}/${activeInventories.size()}]: ${inventoryClass.simpleName} -> ${prefix}") + + // Check if file already exists in map - if so, merge; if not, create new + def sdkFile + def content + boolean isNewFile = false + + if (fileMap.containsKey(fileName)) { + // File already exists, merge into it + sdkFile = fileMap[fileName] + content = new StringBuilder(sdkFile.content) + logger.warn("[GoSDK] Merging ${structName} into existing ${fileName}") + } else { + // Create new file + isNewFile = true + sdkFile = new SdkFile() + sdkFile.subPath = "/pkg/view/" + sdkFile.fileName = fileName + + content = new StringBuilder() + content.append("// Copyright (c) ZStack.io, Inc.\n\n") + content.append("package view\n\n") + content.append("import \"time\"\n\n") + content.append("var _ = time.Now // avoid unused import\n\n") + logger.warn("[GoSDK] Generating new view file for: ${structName} (${fileName})") + } + + // Add Inventory Struct (if not already generated) - do this for BOTH new and merged files + if (!generatedViewStructs.contains(structName)) { + generatedViewStructs.add(structName) + content.append(generateViewStruct(inventoryClass, structName)) + logger.warn("[GoSDK] Added inventory struct: ${structName}") + } else { + logger.warn("[GoSDK] Inventory struct ${structName} already exists, skipping duplicate") + } + + // Collect and group response views for this resource using the cache + allApiTemplates.each { GoApiTemplate template -> + if (template.isViewGrouped) return + + String resName = template.getResourceName() + // queryInventoryClass is populated for ALL APIs that return an inventory (not just Query APIs) + Class returnedInventory = template.getQueryInventoryClass() + + // Match by resourceName OR by returned inventory type + // Use exact match to avoid CdpPolicy matching Policy + boolean matchesByName = resName != null && resName == prefix + boolean matchesByInventory = returnedInventory != null && returnedInventory == inventoryClass + + if (matchesByName || matchesByInventory) { + if (matchesByInventory && !matchesByName) { + logger.warn("[GoSDK] Matched API ${template.clzName} to ${prefix} by returned inventory type (${returnedInventory.simpleName})") + } + + logger.warn("[GoSDK] Resource match: API ${template.clzName} (Resource: ${resName}, ActionType: '${template.getActionType()}') matches Inventory prefix: ${prefix}") + // Only standard actions (non-empty actionType) go into resource view files + if (template.getActionType() != "") { + Class responseClass = template.getResponseClass() + logger.warn("[GoSDK] Checking responseClass for ${template.clzName}: ${responseClass?.simpleName ?: 'null'}") + if (responseClass != null) { + String viewName = getViewStructName(responseClass) + logger.warn("[GoSDK] ViewName for ${template.clzName}: ${viewName}, already generated: ${generatedViewStructs.contains(viewName)}") + if (!generatedViewStructs.contains(viewName)) { + logger.warn("[GoSDK] Calling generateResponseViewCode for ${template.clzName}...") + String structCode = template.generateResponseViewCode() + logger.warn("[GoSDK] generateResponseViewCode returned ${structCode.length()} chars for ${viewName}") + if (structCode != "") { + generatedViewStructs.add(viewName) + content.append(structCode) + template.isViewGrouped = true + logger.warn("[GoSDK] Grouped ${viewName} into ${fileName} (from ${template.clzName}), content now ${content.length()} chars") + } else { + logger.warn("[GoSDK] Skipping ${viewName} - no view code generated (will be caught by other_views.go if needed)") + } + } else { + logger.warn("[GoSDK] ${viewName} already generated, marking template as grouped") + template.isViewGrouped = true + } + } + } else { + logger.warn("[GoSDK] Skipping ${template.clzName} - empty actionType") + } + } + } + + // Update file content and store in map + sdkFile.content = content.toString() + fileMap[fileName] = sdkFile + logger.warn("[GoSDK] Updated ${fileName}: content.length=${content.length()}, generatedViewStructs.size=${generatedViewStructs.size()}") + + // If this is a new file, add to output list + if (isNewFile) { + files.add(sdkFile) + logger.warn("[GoSDK] Added new file ${fileName} to output (${files.size()} total files)") + } else { + logger.warn("[GoSDK] Merged ${inventoryClass.simpleName} into existing ${fileName}") + } + + // Re-sync activeInventories if more were discovered - but avoid duplicates + inventories.each { Class newClz -> + if (!activeInventories.contains(newClz)) { + activeInventories.add(newClz) + logger.warn("[GoSDK] Discovered new inventory during processing: ${newClz.simpleName}") + } + } + index++ } - value.append('validate:"') - def strings = new ArrayList() - if (annotation.required()) { - strings.add('required') + + logger.warn("[GoSDK] Finished generateViewFiles: generated ${files.size()} view files") + return files + } + + /** + * Generate action files grouped by resource + */ + private List generateActionFiles() { + def files = [] + def activeInventories = new ArrayList(inventories) + + activeInventories.each { Class inventoryClass -> + String prefix = inventoryClass.simpleName.replaceAll('Inventory$', '') + String fileName = "${toSnakeCase(prefix)}_actions.go" + + // Collect all method code first to check if fmt is needed + StringBuilder methodsContent = new StringBuilder() + boolean hasActions = false + + allApiTemplates.each { GoApiTemplate template -> + if (template.isActionGrouped) return + + String resName = template.getResourceName() + // Use exact match to avoid CdpPolicy matching Policy + if (resName != null && resName == prefix) { + // Check for duplicate method names (including Get methods from Query APIs) + Set methodNames = template.getGeneratedMethodNames() + boolean hasDuplicate = methodNames.any { generatedClientMethods.contains(it) } + + if (hasDuplicate) { + logger.warn("[GoSDK] Skipping duplicate method: ${template.clzName} (methods ${methodNames} already generated)") + template.isActionGrouped = true + return + } + + methodsContent.append(template.generateMethodCode()) + methodNames.each { generatedClientMethods.add(it) } + template.isActionGrouped = true + GoApiTemplate.groupedApiNames.add(template.clzName) + hasActions = true + } + } + + if (hasActions) { + // Check if fmt is needed (for fmt.Sprintf in multi-placeholder paths) + boolean needsFmt = methodsContent.toString().contains("fmt.Sprintf") + + def content = new StringBuilder() + content.append("// Copyright (c) ZStack.io, Inc.\n\n") + content.append("package client\n\n") + content.append("import (\n") + if (needsFmt) { + content.append("\t\"fmt\"\n") + } + content.append("\t\"github.com/zstackio/zstack-sdk-go-v2/pkg/param\"\n") + content.append("\t\"github.com/zstackio/zstack-sdk-go-v2/pkg/view\"\n") + content.append(")\n\n") + content.append("var _ = param.BaseParam{} // avoid unused import\n") + content.append("var _ = view.MapView{} // avoid unused import\n\n") + + // Append the collected methods + content.append(methodsContent.toString()) + + def sdkFile = new SdkFile() + sdkFile.subPath = "/pkg/client/" + sdkFile.fileName = fileName + sdkFile.content = content.toString() + files.add(sdkFile) + logger.warn("[GoSDK] Generated grouped action file: " + fileName) + } + } + return files + } + + /** + * Generate param files grouped by resource + */ + private List generateParamFiles() { + def files = [] + def activeInventories = new ArrayList(inventories) + + activeInventories.each { Class inventoryClass -> + String prefix = inventoryClass.simpleName.replaceAll('Inventory$', '') + String fileName = "${toSnakeCase(prefix)}_params.go" + + def content = new StringBuilder() + content.append("// Copyright (c) ZStack.io, Inc.\n\n") + content.append("package param\n\n") + content.append("import \"time\"\n\n") + content.append("var _ = time.Now // avoid unused import\n\n") + + boolean hasParams = false + allApiTemplates.each { GoApiTemplate template -> + if (template.isParamGrouped) return + + // Standard actions generate their params here + // We use isGrouped logic differently for params, or just check the resource + String resName = template.getResourceName() + // Use exact match to avoid CdpPolicy matching Policy + if (resName == prefix) { + if (!template.isQueryMessage()) { + String paramStructName = template.getParamStructName() + String detailParamName = template.getDetailParamStructName() + + if (!generatedParamStructs.contains(paramStructName)) { + content.append(generateParamStruct(template.getApiMsgClazz(), paramStructName, detailParamName, template.getAt())) + generatedParamStructs.add(paramStructName) + generatedParamStructs.add(detailParamName) + hasParams = true + template.isParamGrouped = true + } + } + } + } + + if (hasParams) { + def sdkFile = new SdkFile() + sdkFile.subPath = "/pkg/param/" + sdkFile.fileName = fileName + sdkFile.content = content.toString() + files.add(sdkFile) + logger.warn("[GoSDK] Generated grouped param file: " + fileName) + } } - value.append(strings.join(",")) - value.append('"') - return value + return files } } diff --git "a/rest/src/main/resources/scripts/SDK\347\224\237\346\210\220\345\231\250\345\274\200\345\217\221\346\214\207\345\215\227.md" "b/rest/src/main/resources/scripts/SDK\347\224\237\346\210\220\345\231\250\345\274\200\345\217\221\346\214\207\345\215\227.md" new file mode 100644 index 00000000000..f2daa1bce44 --- /dev/null +++ "b/rest/src/main/resources/scripts/SDK\347\224\237\346\210\220\345\231\250\345\274\200\345\217\221\346\214\207\345\215\227.md" @@ -0,0 +1,935 @@ +# ZStack SDK 生成器开发指南 + +> 本文档总结了 Go SDK 生成器的实现逻辑和经验,用于指导其他语言 SDK 生成器的开发。 + +--- + +## 1. 整体架构 + +### 1.1 核心组件 + +| 组件 | 文件 | 职责 | +|---------------|------------------------|-------------------------------------------| +| API 模板生成器 | `GoApiTemplate.groovy` | 生成 client actions、param 文件、response views | +| Inventory 生成器 | `GoInventory.groovy` | 生成 view 结构体、基础文件、client.go | +| 入口调用 | `RestServer.java` | 扫描 API 类并调用生成器 | + +### 1.2 生成的文件结构 + +``` +sdk/ +├── pkg/ +│ ├── client/ # API 操作方法 +│ │ ├── client.go # 客户端基类 +│ │ ├── {resource}_actions.go # 各资源的 CRUD 方法 +│ │ └── ... +│ ├── param/ # 请求参数 +│ │ ├── base_params.go # 基础参数结构 +│ │ ├── base_param_types.go # 嵌套类型定义 +│ │ └── {resource}_params.go # 各资源的参数 +│ ├── view/ # 响应视图 +│ │ ├── base_views.go # 基础视图结构 +│ │ ├── {resource}_views.go # @Inventory 类生成的视图 +│ │ ├── {resource}_additional_views.go # 被引用但无 @Inventory 的类 +│ │ └── {resource}_response_views.go # API 响应类型 +│ └── errors/ +│ └── errors.go # 错误定义 +└── go.mod +``` + +--- + +## 2. 生成流程 + +### 2.1 整体流程 (RestServer.java) + +``` +1. 扫描所有带 @RestRequest 注解的 API Message 类 +2. 创建 GoInventory 实例(单例,共享状态) +3. 对每个 API 类: + a. 创建 GoApiTemplate 实例 + b. 调用 generate() 生成 param、action、response view 文件 +4. 调用 GoInventory.generate() 生成: + a. @Inventory 类的 view 文件 + b. 被引用的 additional view 文件 + c. param 嵌套类型文件 + d. 基础文件(client.go, base_params.go, errors.go) +5. 写入所有文件到输出目录 +``` + +### 2.2 GoApiTemplate 生成流程 + +```groovy +List generate() { + // 1. 解析 API 类信息 + String clzName = parseApiName() // APICreateVmInstanceMsg -> CreateVmInstance + String actionType = parseActionType() // Create, Query, Update, Delete, ... + String httpMethod = getHttpMethod() // GET, POST, PUT, DELETE + + // 2. 确定视图类型 + if (isQueryMessage) { + viewClass = findInventoryClassFromResponse() // 从 inventories 字段获取 + } else { + viewClass = responseClass // 直接使用 responseClass + } + + // 3. 生成文件 + if (!isQueryMessage) { + generateParamFile() // {action}_params.go + } + generateActionFile() // {action}_actions.go + generateResponseViewFile() // {action}_response_views.go +} +``` + +### 2.3 GoInventory 生成流程 + +```groovy +List generate() { + // 1. 生成 @Inventory 类的 view 文件 + generateViewFiles() + + // 2. 生成被引用但无 @Inventory 的类 + generateAdditionalViewFiles() + + // 3. 生成 param 包的嵌套类型 + generateParamNestedTypesFile() + + // 4. 生成基础文件 + generateBaseViewFile() + generateBaseParamFile() + generateClientFile() + generateErrorsFile() +} +``` + +--- + +## 3. 类型映射规则 + +### 3.1 Java → Go 基本类型映射 + +**注意**: 对于可选字段(`@APIParam(required = false)`),基本类型会生成为指针类型(如 `*string`, `*int64`),以便区分未设置(nil)和零值。 + +| Java 类型 | Go 类型(必填) | Go 类型(可选) | +|-------------------------------|-------------------------------------------|-------------------------------------------| +| `String`, `char`, `Character` | `string` | `*string` | +| `int`, `Integer` | `int` | `*int` | +| `long`, `Long` | `int64` | `*int64` | +| `short`, `Short` | `int16` | `*int16` | +| `byte`, `Byte` | `int8` | `*int8` | +| `float`, `Float` | `float32` | `*float32` | +| `double`, `Double` | `float64` | `*float64` | +| `boolean`, `Boolean` | `bool` | `*bool` | +| `Date`, `Timestamp` | `time.Time` (param) / `ZStackTime` (view) | `*time.Time` (param) / `*ZStackTime` (view) | +| `Enum` | `string` | `*string` | +| `byte[]` | `[]int8` (Java byte 是有符号 -128~127) | `[]int8` | +| `List` | `[]T` | `[]T` | +| `Map` | `map[string]V` | `map[string]V` | +| 其他复杂类型 | 生成对应的 struct | - | +| 无法识别的类型 | `interface{}` | `interface{}` | + +### 3.2 上下文感知的类型映射 + +**重要**: `mapJavaTypeToGoType()` 需要根据上下文返回不同类型: + +- **param 包**(请求参数): `Date/Timestamp` → `time.Time` +- **view 包**(响应解析): `Date/Timestamp` → `ZStackTime`(自定义类型,支持 ZStack 特殊格式) + +```groovy +private String mapJavaTypeToGoType(Class javaType, boolean forView) { + switch (javaType) { + case Date.class: + case java.sql.Timestamp.class: + return forView ? "ZStackTime" : "time.Time" + // ... + } +} +``` + +**ZStackTime 实现**(仅在 view 包): + +```go +type ZStackTime struct { time.Time } + +func (t *ZStackTime) UnmarshalJSON(data []byte) error { + // 支持多种格式:"Jan 2, 2006 3:04:05 PM", "Jan 2, 2006 15:04:05", RFC3339 +} +``` + +### 3.3 类型处理决策树 + +``` +处理 Java 类型 fieldType: +│ +├─ 是基本类型? → 映射到 Go 基本类型(注意 forView 参数) +│ └─ 是可选字段 (@APIParam(required=false))? → 添加 * 指针前缀 +│ +├─ 是数组类型 (isArray)? → `[]` + 递归处理元素类型(slice本身可nil,不额外加*) +│ +├─ 集合类型 (Collection)? → `[]` + 处理泛型参数(slice本身可nil) +│ +├─ 是 Map 类型? → `map[string]` + 处理 value 泛型(map本身可nil) +│ +├─ 是枚举? → `string` +│ └─ 是可选字段? → `*string` +│ +├─ 有 @Inventory 注解? → 生成对应 View struct(struct可nil,不额外加*) +│ +├─ 是可生成的复杂类 (isGeneratableClass)? +│ ├─ 在 view 包 → 添加到 additionalClasses +│ └─ 在 param 包 → 添加到 paramNestedTypes +│ +└─ 其他 → `interface{}`(已支持nil) +``` + +### 3.4 数组类型特殊处理 + +**byte[] 映射为 []int8 而非 []byte**: + +```groovy +if (javaType.isArray()) { + Class componentType = javaType.getComponentType() + if (componentType == byte.class || componentType == Byte.class) { + // Java byte 是有符号类型 (-128 到 127) + // Go 的 byte 是 uint8 (0-255) + // Go 的 int8 是有符号 (-128 到 127) + return "[]int8" // ⚠️ 不是 []byte + } +} +``` + +**实际案例**: `ipInBinary` 字段存储负数值(如 -84),如果用 `[]byte` (即 `[]uint8`) 会导致 JSON 解析错误。 + +### 3.5 可生成类的判断 (isGeneratableClass) + +```groovy +boolean isGeneratableClass(Class clz) { + if (clz == null) return false + if (clz.isPrimitive()) return false // 排除基本类型 + if (clz.isEnum()) return false // 排除枚举 + if (clz.isInterface()) return false // 排除接口 + if (clz.isArray()) return false // 排除数组类型 + if (clz.name.startsWith("java.")) return false // 排除 Java 标准库 + if (clz.name.startsWith("javax.")) return false // 排除 javax + if (clz.name.startsWith("[")) return false // 排除数组内部表示 + return true +} +``` + +--- + +## 4. 关键问题和解决方案 + +### 4.1 递归类型(自引用) + +**问题**:类似 `ErrorCode` 包含 `cause: ErrorCode` 字段,Go 会报 "invalid recursive type" + +**解决**:检测自引用并使用指针类型 + +```groovy +// 追踪当前正在生成的类 +private Class currentGeneratingClass = null + +String generateViewStruct(Class clazz, String structName) { + Class previousClass = currentGeneratingClass + currentGeneratingClass = clazz + try { + // 生成字段... + } finally { + currentGeneratingClass = previousClass + } +} + +String generateFieldType(Field field, Type type) { + // 检测自引用 + boolean isSelfReference = (currentGeneratingClass != null && fieldType == currentGeneratingClass) + String pointerPrefix = isSelfReference ? "*" : "" + return pointerPrefix + getViewStructName(fieldType) +} +``` + +**生成结果**: + +```go +type ErrorCodeView struct { + Code string `json:"code"` + Cause *ErrorCodeView `json:"cause,omitempty"` // 使用指针 +} +``` + +### 4.2 类型重复生成 + +**问题**:同一个类可能同时是 `@Inventory` 类又被其他类引用 + +**解决**:使用 `generatedViewStructs` 集合追踪已生成的类型 + +```groovy +Set generatedViewStructs = new HashSet<>() + +void generateStruct(Class clz) { + String structName = getViewStructName(clz) + if (!generatedViewStructs.contains(structName)) { + generatedViewStructs.add(structName) + // 实际生成... + } +} +``` + +### 4.3 依赖发现(嵌套类型) + +**问题**:生成 struct A 时发现引用了 struct B,B 又引用 C...需要递归发现所有依赖 + +**解决**:使用迭代方式(非递归)处理新发现的类型 + +```groovy +def classesToProcess = new ArrayList(initialClasses) +int index = 0 + +while (index < classesToProcess.size()) { + Class clz = classesToProcess.get(index) + + // 生成 struct(会发现新的依赖类型,添加到 additionalClasses) + generateViewStruct(clz, structName) + + // 检查是否有新发现的类型 + additionalClasses.each { Class newClz -> + if (!classesToProcess.contains(newClz)) { + classesToProcess.add(newClz) // 添加到处理队列 + } + } + index++ +} +``` + +### 4.4 发现阶段与生成阶段分离 + +**问题**:发现阶段调用 `generateViewStruct` 可能污染状态,导致实际生成阶段跳过 + +**解决**:使用单独的集合追踪发现阶段处理的类 + +```groovy +// 发现阶段:只收集类,不标记为已生成 +def discoveredClasses = new HashSet() +while (index < classesToProcess.size()) { + Class clz = classesToProcess.get(index) + if (!discoveredClasses.contains(clz) && !generatedViewStructs.contains(structName)) { + discoveredClasses.add(clz) + generateViewStruct(clz, structName) // 触发依赖发现 + // ... + } + index++ +} + +// 生成阶段:实际写入文件 +discoveredClasses.each { Class clz -> + String structName = getViewStructName(clz) + if (!generatedViewStructs.contains(structName)) { + generatedViewStructs.add(structName) + content.append(generateViewStruct(clz, structName)) + } +} +``` + +### 4.5 HTTP 方法与导入处理 + +**问题**:DELETE 方法不返回 view 类型,但仍导入 view 包会报 "imported and not used" + +**解决**:根据 HTTP 方法和 action 类型决定导入 + +```groovy +// 判断是否为删除类操作 +boolean isDeleteAction = ["Delete", "Destroy", "Remove", "Expunge", "Detach", "Cleanup"] + .contains(actionType) || httpMethod == "DELETE" + +// 生成导入 +content.append("import (\n") +content.append("\t\"pkg/param\"\n") +if (!isDeleteAction) { + content.append("\t\"pkg/view\"\n") // 只有非删除操作才导入 view +} +content.append(")\n") +``` + +### 4.6 可选字段指针类型处理 + +**问题**:Go中如何区分未设置字段和零值(如空字符串""、0、false)? + +**解决**:对可选字段使用指针类型,nil表示未设置,非nil表示已设置 + +```groovy +/** + * 判断字段是否为可选字段 + */ +private boolean isOptionalField(Field field, Map apiParamMap) { + // 1. uuid 和 name 始终必填 + if (field.name in ["uuid", "name"]) { + return false + } + + // 2. 检查 @APIParam(required = false) + if (field.isAnnotationPresent(APIParam.class)) { + APIParam param = apiParamMap.containsKey(field.name) ? + apiParamMap.get(field.name) : field.getAnnotation(APIParam.class) + if (!param.required()) { + return true + } + } + + // 3. 没有APIParam注解的字段默认可选 + if (!field.isAnnotationPresent(APIParam.class)) { + return true + } + + return false +} + +/** + * 生成字段类型(支持可选字段指针) + */ +private String generateParamFieldType(Field field, Type type, + Map apiParamMap, + boolean isOptional) { + String baseType = mapJavaTypeToGoType(fieldType) + + // 基本类型集合 + def basicTypes = ["string", "int", "int64", "int32", + "float64", "float32", "bool"] as Set + + // 对可选的基本类型使用指针 + if (isOptional && !baseType.startsWith("[") && + !baseType.startsWith("map[") && + !baseType.equals("interface{}") && + basicTypes.contains(baseType)) { + return "*" + baseType + } + + return baseType +} +``` + +**生成结果**: + +```go +type UpdateVmInstanceDetailParam struct { + UUID string `json:"uuid" validate:"required"` // 必填 + Name *string `json:"name,omitempty"` // 可选,使用指针 + Description *string `json:"description,omitempty"` // 可选,使用指针 + CPUNum *int `json:"cpuNum,omitempty"` // 可选,使用指针 +} +``` + +**使用示例**: + +```go +// 只更新 name,不更新 description +name := "new-name" +params := UpdateVmInstanceDetailParam{ + UUID: "vm-uuid", + Name: &name, // 设置为新值 + // Description 为 nil,不会发送到服务器 +} +``` + +### 4.7 多参数路径处理(Query API) + +**问题**:部分Query API使用复合键而非单一uuid,如GlobalConfig使用`{category}/{name}` + +**解决**:自动检测URL占位符数量,多参数时使用`GetWithSpec`方法 + +```groovy +/** + * 提取URL中的占位符 + */ +private List extractUrlPlaceholders(String url) { + def placeholders = [] + def matcher = (url =~ /\{([^}]+)\}/) + while (matcher.find()) { + placeholders.add(matcher.group(1)) + } + return placeholders +} + +/** + * 为Query API生成Get方法 + */ +private String generateGetMethodForQuery(String apiPath, String viewStructName) { + def placeholders = extractUrlPlaceholders(apiPath) + String cleanPath = removePlaceholders(apiPath) + + // 多参数路径:使用 GetWithSpec + if (placeholders.size() >= 2) { + String params = placeholders.collect { "${it} string" }.join(", ") + String firstParam = placeholders[0] + def remainingPlaceholders = placeholders.drop(1) + String spec = buildSpecPath(remainingPlaceholders) + + return """ +func (cli *ZSClient) Get${resourceName}(${params}) (*view.${viewStructName}, error) { + var resp view.${viewStructName} + err := cli.GetWithSpec("${cleanPath}", ${firstParam}, ${spec}, "", nil, &resp) + if err != nil { + return nil, err + } + return &resp, nil +} +""" + } + + // 单参数路径:标准 Get 方法 + return """ +func (cli *ZSClient) Get${resourceName}(uuid string) (*view.${viewStructName}, error) { + var resp view.${viewStructName} + if err := cli.Get("${cleanPath}", uuid, nil, &resp); err != nil { + return nil, err + } + return &resp, nil +} +""" +} +``` + +**生成结果**: + +```go +// APIQueryGlobalConfigMsg (路径: /global-configurations/{category}/{name}) +func (cli *ZSClient) GetGlobalConfig(category string, name string) (*view.GlobalConfigInventoryView, error) { + var resp view.GlobalConfigInventoryView + err := cli.GetWithSpec("v1/global-configurations", category, []string{name}, "", nil, &resp) + if err != nil { + return nil, err + } + return &resp, nil +} + +// APIQueryVmInstanceMsg (路径: /vm-instances/{uuid}) +func (cli *ZSClient) GetVmInstance(uuid string) (*view.VmInstanceInventoryView, error) { + var resp view.VmInstanceInventoryView + if err := cli.Get("v1/vm-instances", uuid, nil, &resp); err != nil { + return nil, err + } + return &resp, nil +} +``` + +### 4.8 Groovy类型检查陷阱 + +**问题**:Groovy的`in`操作符对字符串列表检查不可靠 + +```groovy +// ❌ 错误:可能失败 +if (baseType in ["string", "int", "int64"]) { + return "*" + baseType +} +``` + +**解决**:使用Set的`contains()`方法 + +```groovy +// ✅ 正确:稳定可靠 +def basicTypes = ["string", "int", "int64", "int32", + "float64", "float32", "bool"] as Set +if (basicTypes.contains(baseType)) { + return "*" + baseType +} +``` + +### 4.9 方法签名一致性 + +**问题**:修改方法签名后,所有调用点必须同步更新,否则Groovy会报`MissingMethodException` + +**案例**:`generateParamFieldGeneric`从单参数改为三参数 + +```groovy +// 旧签名 +private String generateParamFieldGeneric(Field field) { ... } + +// 新签名(添加apiParamMap和isOptional) +private String generateParamFieldGeneric(Field field, + Map apiParamMap, + boolean isOptional) { ... } +``` + +**必须更新所有调用点**: + +```groovy +// generateParamStruct 中的调用 +boolean isOptional = isOptionalField(field, apiParamMap) +String fieldType = generateParamFieldGeneric(field, apiParamMap, isOptional) + +// generateParamNestedStruct 中的调用 +def apiParamMap = new HashMap() +if (clazz.isAnnotationPresent(OverriddenApiParams.class)) { + for (OverriddenApiParam oap : clazz.getAnnotation(OverriddenApiParams.class).value()) { + apiParamMap.put(oap.field(), oap.param()) + } +} +boolean isOptional = isOptionalField(field, apiParamMap) +String fieldType = generateParamFieldGeneric(field, apiParamMap, isOptional) +``` + +**错误示例**: + +``` +groovy.lang.MissingMethodException: No signature of method: + scripts.GoInventory.generateParamFieldGeneric() is applicable for + argument types: (java.lang.reflect.Field) +``` + +### 4.10 模块路径一致性 + +**问题**:生成的 import 路径必须与 `go.mod` 中的模块名一致 + +**配置**: + +```groovy +// 模块路径配置 +String modulePath = "dev.zstack.io/ye.zou/zstack-go-sdk" + +// 生成导入时使用 +content.append("\t\"${modulePath}/pkg/param\"\n") +content.append("\t\"${modulePath}/pkg/view\"\n") +``` + +--- + +## 5. 命名规则 + +### 5.1 API 名称解析 + +```groovy +// APICreateVmInstanceMsg -> CreateVmInstance +String parseApiName(String className) { + return className + .replaceFirst("^API", "") + .replaceFirst("Msg\$", "") +} +``` + +### 5.2 View 结构体命名 + +```groovy +String getViewStructName(Class clz) { + String name = clz.simpleName + + if (name.endsWith("Inventory")) { + return name.replace("Inventory", "InventoryView") + // VmInstanceInventory -> VmInstanceInventoryView + } + if (name.endsWith("Reply")) { + return name.replace("Reply", "View").replaceAll("^API", "") + // APIQueryVmInstanceReply -> QueryVmInstanceView + } + return name + "View" + // ErrorCode -> ErrorCodeView +} +``` + +### 5.3 Param 结构体命名 + +```groovy +String getParamStructName(Class clz) { + String name = clz.simpleName + if (name.endsWith("Inventory")) { + return name.replace("Inventory", "") + "Param" + // AttributeInventory -> AttributeParam + } + return name + "Param" + // SecurityGroupRuleAO -> SecurityGroupRuleAOParam +} +``` + +### 5.4 文件名(snake_case) + +```groovy +String toSnakeCase(String name) { + return name.replaceAll('([a-z])([A-Z])', '$1_$2').toLowerCase() +} +// CreateVmInstance -> create_vm_instance +// IAM2Project -> iam2_project +``` + +--- + +## 6. 特殊情况处理 + +### 6.1 Query API 的 Inventory 类型查找 + +```groovy +Class findQueryInventoryClass() { + // 1. 从 Response 类的 inventories 字段获取泛型参数 + Field inventoriesField = responseClass.getDeclaredField("inventories") + Type genericType = inventoriesField.getGenericType() + if (genericType instanceof ParameterizedType) { + return (Class) ((ParameterizedType) genericType).getActualTypeArguments()[0] + } + + // 2. 回退:根据 API 名称匹配 Inventory 类 + String expectedName = resourceName + "Inventory" + for (Class inv : knownInventoryClasses) { + if (inv.simpleName == expectedName) return inv + } + + return null +} +``` + +### 6.2 RestResponse 注解处理 + +```groovy +if (clazz.isAnnotationPresent(RestResponse.class)) { + RestResponse at = clazz.getAnnotation(RestResponse.class) + + // allTo:将所有字段映射到指定字段 + if (at.allTo() != "") { + fieldMap = [at.allTo(): findField(clazz, at.allTo())] + } + + // fieldsTo:字段重命名 + // "newName=oldName" 或 "fieldName" + for (String fieldsTo : at.fieldsTo()) { + String[] split = fieldsTo.split("=") + String outputName = split[0] + String fieldName = split.length == 1 ? split[0] : split[1] + fieldMap[outputName] = findField(clazz, fieldName) + } +} +``` + +### 6.3 字段跳过规则 + +```groovy +// 跳过静态字段 +if (Modifier.isStatic(field.modifiers)) continue + +// 跳过 @APINoSee 注解的字段 +if (field.isAnnotationPresent(APINoSee.class)) continue + +// 跳过 View 中的 error 字段(由基类处理) +if (fieldName == 'error' && structName.endsWith('View')) continue + +// Param 中跳过基础字段 +def skipFields = ['systemTags', 'userTags', 'requestIp', 'session', + 'timeout', 'id', 'serviceId', 'creatingAccountUuid'] +if (skipFields.contains(fieldName)) continue +``` + +--- + +## 7. 最佳实践总结 + +### 7.1 架构设计 + +1. **单例共享生成器**:Inventory 生成器应为单例,跨 API 共享状态 +2. **两阶段处理**:先发现所有依赖类型,再统一生成 +3. **去重机制**:使用 Set 追踪已生成的类型名称 +4. **迭代而非递归**:处理嵌套依赖时使用队列,避免栈溢出 + +### 7.2 类型处理 + +1. **完整的类型映射表**:覆盖所有基本类型和常用类型 +2. **可选字段指针类型**:基本类型的可选字段使用`*`前缀(slice/map/interface{}除外) +3. **数组类型特殊处理**:检查 `isArray()` 和内部表示 `[`;注意`byte[]` → `[]int8`(非`[]byte`) +4. **递归类型使用指针**:避免 Go 编译器报错 +5. **类型检查使用Set.contains()**:避免Groovy `in`操作符的不可靠行为 +6. **兜底使用 interface{}**:无法识别的类型降级处理 + +### 7.3 方法签名管理 + +1. **方法签名修改时同步更新所有调用点**:Groovy方法重载严格匹配参数类型和数量 +2. **使用明确的参数传递**:避免依赖默认值或可选参数 +3. **重构时使用grep搜索**:确保找到所有调用点 + +### 7.4 导入管理 + +1. **按需导入**:根据实际使用决定是否导入包 +2. **避免未使用导入**:特别是 DELETE 操作不需要 view 包 +3. **时间包特殊处理**:使用 `var _ = time.Now` 避免未使用警告 + +### 7.5 调试支持 + +1. **详细日志**:记录生成过程中的关键决策 +2. **类型追踪**:记录发现和生成的类型数量 +3. **跳过记录**:记录因缺少信息而跳过的 API + +--- + +## 8. Go SDK 客户端使用指南 + +### 8.1 认证配置 + +#### 密码登陆(自动 SHA512 加密) + +```go +package main + +import ( + "fmt" + "time" + + "dev.zstack.io/ye.zou/zstack-go-sdk/pkg/client" +) + +func main() { + // 创建客户端配置 + config := &client.ZSConfig{ + Hostname: "172.20.1.164", + Port: 8080, + ContextPath: "/zstack", + AuthType: client.AuthTypeUsernamePassword, + Username: "admin", + Password: "password123", // ✅ 明文密码,客户端自动 SHA512 加密 + Timeout: 30 * time.Second, + } + + cli := client.NewZSClient(config) + + // 开始使用 API + params := ¶m.QueryVmInstanceParam{} + vms, err := cli.QueryVmInstance(params) + if err != nil { + fmt.Printf("查询失败: %v\n", err) + return + } + + fmt.Printf("找到 %d 个 VM\n", len(vms)) +} +``` + +#### Access Key 认证(推荐) + +```go +config := &client.ZSConfig{ + Hostname: "172.20.1.164", + Port: 8080, + ContextPath: "/zstack", + AuthType: client.AuthTypeAccessKey, + AccessKeyId: "your-access-key-id", + AccessKeySecret: "your-access-key-secret", + Timeout: 30 * time.Second, +} +``` + +### 8.2 常见问题 + +**Q: API 返回 `status code 400 (Authorization: )`,说明什么?** + +A: 说明 Authorization 请求头为空,通常是以下原因: + +- ✗ 密码错误(客户端会自动 SHA512 加密,传入明文即可) +- ✗ Access Key 配置错误 +- ✗ 客户端配置中 AuthType 设置不正确 + +**Q: 密码需要手动加密吗?** + +A: **不需要**。`NewZSClient()` 内部会自动使用 SHA512 加密密码,直接传入明文即可: + +```go +config.Password = "password123" // ✅ 明文,自动加密 +// ❌ 不要:config.Password = hashPasswordSHA512("password123") +``` + +**Q: 如何验证加密后的密码?** + +```bash +echo -n "password123" | sha512sum +# 输出: b109f3bbbc244eb8... (128位十六进制) +``` + +--- + +## 9. 扩展到其他语言 + +### 9.1 需要调整的部分 + +| 方面 | Go | Java/Kotlin | TypeScript | Python | +|------|------------------|-----------------------|----------------------|------------------------| +| 类型系统 | 静态强类型 | 静态强类型 | 动态类型+类型注解 | 动态类型 | +| 空值处理 | 指针 `*T` | `Optional` | `T \| null` | `Optional[T]` | +| 集合类型 | `[]T`, `map[K]V` | `List`, `Map` | `T[]`, `Record` | `list[T]`, `dict[K,V]` | +| 时间类型 | `time.Time` | `Instant`, `Date` | `Date` | `datetime` | +| 枚举 | `string` + 常量 | `enum` | `enum` / 字符串联合 | `Enum` | +| 包/模块 | `package` | `package` | `export/import` | `import` | + +### 9.2 通用处理流程 + +``` +1. 扫描 @RestRequest API 类 +2. 解析 API 信息(名称、方法、路径、响应类型) +3. 生成请求参数类型 +4. 生成响应视图类型 +5. 生成 API 客户端方法 +6. 生成基础设施代码(客户端、错误处理、工具函数) +7. 处理依赖类型(递归发现和生成) +``` + +### 9.3 注意事项 + +- **保持命名一致性**:跨语言 SDK 的 API 名称应保持一致 +- **类型安全优先**:尽可能使用强类型而非 any/interface{} +- **文档生成**:从 Java 注释生成目标语言的文档注释 +- **版本同步**:SDK 版本应与 ZStack 版本对应 + +--- + +## 10. 附录:完整的字段处理伪代码 + +``` +function processField(field, apiParamMap): + type = field.type + + // 0. 判断字段是否可选 + isOptional = isOptionalField(field, apiParamMap) + + // 1. 基本类型映射 + if (type in PRIMITIVE_TYPE_MAP): + baseType = PRIMITIVE_TYPE_MAP[type] + // 可选的基本类型使用指针 + if (isOptional && type in BASIC_TYPES): + return "*" + baseType + return baseType + + // 2. 数组类型 + if (type.isArray()): + elementType = type.componentType + return "[]" + processType(elementType) + + // 3. 泛型集合 + if (type is ParameterizedType): + rawType = type.rawType + if (rawType == Collection): + return "[]" + processType(type.typeArguments[0]) + if (rawType == Map): + return "map[string]" + processType(type.typeArguments[1]) + + // 4. 枚举 + if (type.isEnum()): + return "string" + + // 5. 递归类型检查 + if (type == currentGeneratingClass): + return "*" + getStructName(type) // 使用指针 + + // 6. 可生成的复杂类 + if (isGeneratableClass(type)): + addToPendingGeneration(type) + return getStructName(type) + + // 7. 兜底 + return "interface{}" + +function isOptionalField(field, apiParamMap): + // uuid 和 name 始终必填 + if (field.name in ["uuid", "name"]): + return false + + // 检查 @APIParam(required = false) + if (field.hasAnnotation(APIParam)): + param = apiParamMap.get(field.name) or field.getAnnotation(APIParam) + if (param.required == false): + return true + return false + + // 没有注解的字段默认可选 + return true +``` diff --git "a/rest/src/main/resources/scripts/ZStack SDK Go \345\274\200\345\217\221\350\247\204\350\214\203\344\270\216\346\240\207\345\207\206.md" "b/rest/src/main/resources/scripts/ZStack SDK Go \345\274\200\345\217\221\350\247\204\350\214\203\344\270\216\346\240\207\345\207\206.md" new file mode 100644 index 00000000000..a469aa50366 --- /dev/null +++ "b/rest/src/main/resources/scripts/ZStack SDK Go \345\274\200\345\217\221\350\247\204\350\214\203\344\270\216\346\240\207\345\207\206.md" @@ -0,0 +1,1096 @@ +# ZStack SDK Go 开发规范与标准 + +> **仓库地址**: ssh://git@dev.zstack.io:9022/ye.zou/zstack-go-sdk.git + +--- + +## Quick Start + +### 安装 + +```bash +go get github.com/terraform-zstack-modules/zstack-sdk-go-v2 +``` + +### 初始化客户端 + +> **注意**: `DefaultZSConfig` 需要显式传入 context path (如 `"/zstack"`)。 + +```go +package main + +import ( + "fmt" + "github.com/terraform-zstack-modules/zstack-sdk-go-v2/pkg/client" + "github.com/terraform-zstack-modules/zstack-sdk-go-v2/pkg/param" +) + +func main() { + // 方式一:使用 AccessKey 认证(推荐) + cli := client.NewZSClient( + client.DefaultZSConfig("192.168.1.100", "/zstack"). + AccessKey("your-access-key-id", "your-access-key-secret"). + Debug(true), + ) + + // 方式二:使用账号密码认证(明文密码,客户端自动 SHA512 加密) + cli := client.NewZSClient( + client.DefaultZSConfig("192.168.1.100", "/zstack"). + Login("admin", "password"). // ✅ 传入明文密码即可 + Debug(true), + ) +} +``` + +### 查询虚拟机列表 + +```go +// 查询所有虚拟机 +vms, err := cli.QueryVmInstance(param.NewQueryParam()) +if err != nil { + panic(err) +} + +for _, vm := range vms { + fmt.Printf("VM: %s, UUID: %s, State: %s\n", vm.Name, vm.UUID, vm.State) +} +``` + +### 创建虚拟机 + +```go +createParam := param.CreateVmInstanceParam{ + BaseParam: param.BaseParam{}, + Params: param.CreateVmInstanceDetailParam{ + Name: "my-vm", + InstanceOfferingUUID: "offering-uuid", + ImageUUID: "image-uuid", + L3NetworkUuids: []string{"l3-network-uuid"}, + Description: "Created by Go SDK", + }, +} + +vm, err := cli.CreateVmInstance(createParam) +if err != nil { + panic(err) +} +fmt.Printf("Created VM: %s\n", vm.UUID) +``` + +### 获取单个资源 + +```go +// 根据 UUID 获取虚拟机详情 +vm, err := cli.GetVmInstance("vm-uuid-here") +if err != nil { + panic(err) +} +fmt.Printf("VM Name: %s, CPU: %d, Memory: %d\n", vm.Name, vm.CPUNum, vm.MemorySize) +``` + +### 条件查询 + +```go +// 使用条件查询 +params := param.NewQueryParam(). + AddQ("state=Running"). + AddQ("name~=test"). // 模糊匹配 + Limit(10). + Start(0) + +vms, err := cli.QueryVmInstance(params) +``` + +### 删除资源 + +```go +// 删除虚拟机(宽松模式) +err := cli.DestroyVmInstance("vm-uuid", param.Permissive) +if err != nil { + panic(err) +} +``` + +### 错误处理 + +```go +import "github.com/terraform-zstack-modules/zstack-sdk-go-v2/pkg/errors" + +vm, err := cli.GetVmInstance("non-existent-uuid") +if err != nil { + if err == errors.ErrNotFound { + fmt.Println("VM not found") + } else { + fmt.Printf("Error: %v\n", err) + } +} +``` + +--- + +## 1. 项目结构 + +``` +zstack-sdk-go-v2/ +├── pkg/ +│ ├── client/ # API 客户端和操作方法 +│ ├── param/ # 请求参数结构体 +│ ├── view/ # 响应视图结构体 +│ ├── errors/ # 错误定义和处理 +│ ├── util/ # 通用工具包 +│ │ ├── jsonutils/ # JSON 处理 +│ │ ├── httputils/ # HTTP 工具 +│ │ └── ... # 其他工具 +│ └── test1/ # 集成测试 +├── go.mod +├── go.sum +└── README.md +``` + +### 包职责说明 + +| 包名 | 职责 | 命名规范 | +|----------|------------|--------------------------| +| `client` | API 操作方法实现 | `{resource}_actions.go` | +| `param` | 请求参数定义 | `{resource}_params.go` | +| `view` | 响应数据结构 | `{resource}_views.go` | +| `errors` | 错误类型定义 | `errors.go`, `consts.go` | +| `util` | 通用工具函数 | 按功能划分子包 | + +--- + +## 2. 代码规范 + +### 2.1 文件头部 + +**所有 Go 文件必须包含版权声明:** + +```go +// Copyright (c) ZStack.io, Inc. + +package packagename +``` + +### 2.2 导入顺序 + +按以下顺序组织导入,组间用空行分隔: + +```go +import ( + // 1. 标准库 + "context" + "fmt" + "net/http" + + // 2. 第三方库 + "github.com/kataras/golog" + + // 3. 项目内部包 + "github.com/terraform-zstack-modules/zstack-sdk-go-v2/pkg/errors" + "github.com/terraform-zstack-modules/zstack-sdk-go-v2/pkg/param" + "github.com/terraform-zstack-modules/zstack-sdk-go-v2/pkg/view" +) +``` + +--- + +## 3. 命名规范 + +### 3.1 文件命名 + +| 类型 | 格式 | 示例 | +|---------|-------------------------|--------------------------| +| Actions | `{resource}_actions.go` | `vm_instance_actions.go` | +| Params | `{resource}_params.go` | `vm_instance_params.go` | +| Views | `{resource}_views.go` | `vm_instance_views.go` | +| Tests | `{resource}_test.go` | `vm_instance_test.go` | + +### 3.2 类型命名 + +```go +// 参数结构体:{Action}{Resource}Param +type CreateVmInstanceParam struct { ... } +type UpdateVmInstanceParam struct { ... } + +// 详细参数:{Action}{Resource}DetailParam +type CreateVmInstanceDetailParam struct { ... } + +// 视图结构体:{Resource}InventoryView 或 {Resource}View +type VmInstanceInventoryView struct { ... } +type VMConsoleAddressView struct { ... } + +// 类型别名 +type DeleteMode string +type InstanceType string +``` + +### 3.3 方法命名 + +```go +// CRUD 操作 +func (cli *ZSClient) Create{Resource}(params) (*View, error) +func (cli *ZSClient) Query{Resource}(params *QueryParam) ([]View, error) +func (cli *ZSClient) Get{Resource}(uuid) (*View, error) +func (cli *ZSClient) Update{Resource}(uuid, params) (*View, error) +func (cli *ZSClient) Destroy{Resource}(uuid, deleteMode) error +func (cli *ZSClient) Delete{Resource}(uuid, deleteMode) error + +// 特定操作 +func (cli *ZSClient) Start{Resource}(uuid, params) (*View, error) +func (cli *ZSClient) Stop{Resource}(uuid, params) (*View, error) +func (cli *ZSClient) Attach{A}To{B}(aUUID, bUUID) (*View, error) +func (cli *ZSClient) Detach{A}From{B}(aUUID, bUUID) (*View, error) +``` + +### 3.4 常量命名 + +```go +// 使用类型别名定义枚举 +type InstanceType string + +const ( + UserVm InstanceType = "UserVm" + ApplianceVm InstanceType = "ApplianceVm" +) + +// 错误常量 +const ( + ErrNotFound = Error("NotFoundError") + ErrDuplicateId = Error("DuplicateIdError") +) +``` + +--- + +## 4. 结构体设计模式 + +### 4.1 基础结构体嵌入 + +**View 结构体使用嵌入共享通用字段:** + +```go +// 基础信息视图 +type BaseInfoView struct { + UUID string `json:"uuid"` + Name string `json:"name"` + Description string `json:"description"` +} + +// 时间信息视图(使用 ZStackTime 支持特殊格式) +type BaseTimeView struct { + CreateDate ZStackTime `json:"createDate"` // ZStack 时间格式:"Jan 2, 2006 3:04:05 PM" + LastOpDate ZStackTime `json:"lastOpDate"` +} + +// ZStackTime 自定义类型(仅在 view 包) +type ZStackTime struct { + time.Time +} + +func (t *ZStackTime) UnmarshalJSON(data []byte) error { + // 支持 ZStack 的 "Oct 28, 2025 2:09:26 PM" 格式 + // 以及标准 RFC3339 格式 +} + +// 资源视图嵌入基础结构体 +type VmInstanceInventoryView struct { + BaseInfoView + BaseTimeView + + ZoneUUID string `json:"zoneUuid"` + ClusterUUID string `json:"clusterUuid"` + // ... 其他字段 +} +``` + +### 4.2 参数结构体嵌入 + +```go +// 基础参数 +type BaseParam struct { + SystemTags []string `json:"systemTags,omitempty"` + UserTags []string `json:"userTags,omitempty"` + RequestIp string `json:"requestIp,omitempty"` +} + +// 请求参数嵌入基础参数 +type CreateVmInstanceParam struct { + BaseParam + Params CreateVmInstanceDetailParam `json:"params"` +} + +// 详细参数:可选字段使用指针类型 +type CreateVmInstanceDetailParam struct { + Name string `json:"name" validate:"required"` // 必填 + InstanceOfferingUuid string `json:"instanceOfferingUuid" validate:"required"` // 必填 + ImageUuid string `json:"imageUuid" validate:"required"` // 必填 + L3NetworkUuids []string `json:"l3NetworkUuids" validate:"required"` // 必填 + Description *string `json:"description,omitempty"` // 可选,使用指针 + DefaultL3NetworkUuid *string `json:"defaultL3NetworkUuid,omitempty"` // 可选,使用指针 + Strategy *string `json:"strategy,omitempty"` // 可选,使用指针 +} +``` + +**使用示例**: + +```go +// 只设置必填字段,省略可选字段 +params := CreateVmInstanceDetailParam{ + Name: "my-vm", + InstanceOfferingUuid: "offering-uuid", + ImageUuid: "image-uuid", + L3NetworkUuids: []string{"network-uuid"}, + // Description 为 nil,不会发送到服务器 +} + +// 设置可选字段 +desc := "Test VM" +strategy := "InstantStart" +params := CreateVmInstanceDetailParam{ + Name: "my-vm", + InstanceOfferingUuid: "offering-uuid", + ImageUuid: "image-uuid", + L3NetworkUuids: []string{"network-uuid"}, + Description: &desc, // 使用指针 + Strategy: &strategy, // 使用指针 +} +``` + +``` + +### 4.3 Builder 模式 (方法链) + +```go +// 配置构建器 +func DefaultZSConfig(hostname, contextPath string) *ZSConfig { + return NewZSConfig(hostname, defaultZStackPort, contextPath) +} + +func (config *ZSConfig) AccessKey(id, secret string) *ZSConfig { + config.accessKeyId = id + config.accessKeySecret = secret + config.authType = AuthTypeAccessKey + return config +} + +func (config *ZSConfig) Debug(debug bool) *ZSConfig { + config.debug = debug + return config +} + +// 使用方式 +client := client.NewZSClient( + client.DefaultZSConfig("10.0.0.1", "/zstack"). + AccessKey("key-id", "key-secret"). + Debug(true), +) + +// 查询参数构建器 +params := param.NewQueryParam(). + AddQ("name=test"). + Limit(10). + Start(0) +``` + +--- + +## 5. JSON 标签规范 + +### 5.1 字段标签 + +```go +type ExampleStruct struct { + // 必填字段:无 omitempty + UUID string `json:"uuid"` + + // 可选字段:使用 omitempty + Description string `json:"description,omitempty"` + + // 指针类型用于区分零值和未设置 + RootDiskSize *int64 `json:"rootDiskSize"` + CpuNum *int `json:"cpuNum"` + + // 时间字段使用 ZStackTime(view 包)或 time.Time(param 包) + CreateDate ZStackTime `json:"createDate"` // view 包 + StartTime time.Time `json:"startTime"` // param 包 + + // byte 数组使用 []int8(Java byte 是有符号的) + IpInBinary []int8 `json:"ipInBinary,omitempty"` +} +``` + +### 5.2 字段注释 + +**所有导出字段必须有中文注释说明:** + +```go +type VmInstanceInventoryView struct { + UUID string `json:"uuid"` // 资源UUID,唯一标识 + ZoneUUID string `json:"zoneUuid"` // 区域UUID + ClusterUUID string `json:"clusterUuid"` // 集群UUID + MemorySize int64 `json:"memorySize"` // 内存大小(字节) + CPUNum int `json:"cpuNum"` // CPU数量 +} +``` + +--- + +## 6. 错误处理规范 + +### 6.1 错误定义 + +```go +// 使用自定义错误类型 +type Error string + +func (e Error) Error() string { + return string(e) +} + +// 预定义错误常量 +const ( + ErrNotFound = Error("NotFoundError") + ErrDuplicateId = Error("DuplicateIdError") + ErrParameter = Error("ParameterError") +) +``` + +### 6.2 错误包装 + +```go +import "github.com/terraform-zstack-modules/zstack-sdk-go-v2/pkg/errors" + +// 使用 Wrap 添加上下文 +if err != nil { + return errors.Wrap(err, "failed to create vm instance") +} + +// 使用 Wrapf 格式化上下文 +if err != nil { + return errors.Wrapf(err, "failed to query %s", resource) +} +``` + +### 6.3 API 方法错误处理 + +```go +func (cli *ZSClient) GetVmInstance(uuid string) (*view.VmInstanceInventoryView, error) { + var resp view.VmInstanceInventoryView + if err := cli.Get("v1/vm-instances", uuid, nil, &resp); err != nil { + return nil, err // 直接返回错误,由调用方处理 + } + return &resp, nil +} +``` + +--- + +## 7. API 方法实现规范 + +### 7.1 标准方法模板 + +```go +// {Description} 方法描述 +func (cli *ZSClient) {MethodName}(params...) (*view.{ReturnType}, error) { + var resp view.{ReturnType} + if err := cli.{HttpMethod}("v1/{resource}", params, &resp); err != nil { + return nil, err + } + return &resp, nil +} +``` + +### 7.2 完整示例 + +```go +// CreateVmInstance 创建虚拟机实例 +func (cli *ZSClient) CreateVmInstance(params param.CreateVmInstanceParam) (*view.VmInstanceInventoryView, error) { + resp := view.VmInstanceInventoryView{} + if err := cli.Post("v1/vm-instances", params, &resp); err != nil { + return nil, err + } + return &resp, nil +} + +// QueryVmInstance 查询虚拟机实例列表 +func (cli *ZSClient) QueryVmInstance(params *param.QueryParam) ([]view.VmInstanceInventoryView, error) { + var resp []view.VmInstanceInventoryView + return resp, cli.List("v1/vm-instances", params, &resp) +} + +// DestroyVmInstance 删除虚拟机实例 +func (cli *ZSClient) DestroyVmInstance(uuid string, deleteMode param.DeleteMode) error { + return cli.Delete("v1/vm-instances", uuid, string(deleteMode)) +} +``` + +--- + +## 8. 测试规范 + +### 8.1 测试文件位置 + +测试文件放在 `pkg/test1/` 目录下,命名格式:`{resource}_test.go` + +### 8.2 测试函数命名 + +```go +func Test{MethodName}(t *testing.T) { + // 测试实现 +} +``` + +### 8.3 测试模板 + +```go +// Copyright (c) ZStack.io, Inc. + +package test + +import ( + "testing" + + "github.com/kataras/golog" + + "github.com/terraform-zstack-modules/zstack-sdk-go-v2/pkg/param" + "github.com/terraform-zstack-modules/zstack-sdk-go-v2/pkg/util/jsonutils" +) + +func TestQueryVmInstance(t *testing.T) { + data, err := accessKeyAuthCli.QueryVmInstance(param.NewQueryParam()) + if err != nil { + t.Errorf("TestQueryVmInstance: %v", err) + } + golog.Info(jsonutils.Marshal(data)) +} + +func TestGetVmInstance(t *testing.T) { + data, err := accountLoginCli.GetVmInstance("uuid-here") + if err != nil { + t.Errorf("TestGetVmInstance: %v", err) + } + golog.Info(jsonutils.Marshal(data)) +} +``` + +--- + +## 9. 新增资源开发流程 + +当需要添加新的 ZStack 资源支持时,按以下步骤进行: + +### 步骤 1:定义视图结构体 + +在 `pkg/view/{resource}_views.go` 中定义: + +```go +// Copyright (c) ZStack.io, Inc. + +package view + +type {Resource}InventoryView struct { + BaseInfoView + BaseTimeView + + // 资源特定字段 + Field1 string `json:"field1"` // 字段说明 + Field2 int `json:"field2"` // 字段说明 +} +``` + +### 步骤 2:定义参数结构体 + +在 `pkg/param/{resource}_params.go` 中定义: + +```go +// Copyright (c) ZStack.io, Inc. + +package param + +type Create{Resource}Param struct { + BaseParam + Params Create{Resource}DetailParam `json:"params"` +} + +type Create{Resource}DetailParam struct { + Name string `json:"name"` // 名称 + Description string `json:"description"` // 描述 + // 其他参数 +} +``` + +### 步骤 3:实现 API 方法 + +在 `pkg/client/{resource}_actions.go` 中实现: + +```go +// Copyright (c) ZStack.io, Inc. + +package client + +import ( + "github.com/terraform-zstack-modules/zstack-sdk-go-v2/pkg/param" + "github.com/terraform-zstack-modules/zstack-sdk-go-v2/pkg/view" +) + +// Create{Resource} 创建资源 +func (cli *ZSClient) Create{Resource}(params param.Create{Resource}Param) (*view.{Resource}InventoryView, error) { + resp := view.{Resource}InventoryView{} + if err := cli.Post("v1/{resources}", params, &resp); err != nil { + return nil, err + } + return &resp, nil +} + +// Query{Resource} 查询资源列表 +func (cli *ZSClient) Query{Resource}(params *param.QueryParam) ([]view.{Resource}InventoryView, error) { + var resp []view.{Resource}InventoryView + return resp, cli.List("v1/{resources}", params, &resp) +} + +// Get{Resource} 获取单个资源 +func (cli *ZSClient) Get{Resource}(uuid string) (*view.{Resource}InventoryView, error) { + var resp view.{Resource}InventoryView + if err := cli.Get("v1/{resources}", uuid, nil, &resp); err != nil { + return nil, err + } + return &resp, nil +} + +// Destroy{Resource} 删除资源 +func (cli *ZSClient) Destroy{Resource}(uuid string, deleteMode param.DeleteMode) error { + return cli.Delete("v1/{resources}", uuid, string(deleteMode)) +} +``` + +### 步骤 4:编写测试 + +在 `pkg/test1/{resource}_test.go` 中编写集成测试。 + +--- + +## 11. SDK 生成器改进规则 (2026-01) + +### 11.1 时间类型处理优化 + +**规则**: 移除自定义 `ZStackTime` 类型,统一使用 Go 原生 `time.Time` + +**原因**: + +- 特殊时间格式解析应由独立的 utils 库处理,保持 SDK 代码简洁 +- 减少生成代码的复杂度和维护成本 +- 用户可根据需要选择时间处理工具 + +**修改**: + +```go +// 旧实现(移除) +type ZStackTime struct { time.Time } +func (t *ZStackTime) UnmarshalJSON(data []byte) error { ... } + +// 新实现 +type VmInstanceInventoryView struct { + ExpiredDate time.Time `json:"expiredDate,omitempty"` + CreateDate time.Time `json:"createDate,omitempty"` + LastOpDate time.Time `json:"lastOpDate,omitempty"` +} +``` + +**影响范围**: + +- `view` 包所有视图结构体 +- `param` 包的参数结构体(已使用 `time.Time`) +- 移除 `BaseTimeView` 结构体 + +--- + +### 11.2 异步操作方法自动生成 + +**规则**: 为支持 LongJob 的资源自动生成 `Add{Resource}Async` 方法 + +**识别机制**: +通过 `@LongJobFor` 注解识别支持异步操作的 API: + +```java + +@LongJobFor(APIBackupStorageMigrateImageMsg.class) +public class BackupStorageMigrateImageLongJob { ... +} +``` + +**生成方法模板**: + +```go +// AddVmInstanceAsync 异步创建虚拟机 +// 返回 LongJob UUID 用于查询执行状态 +func (cli *ZSClient) AddVmInstanceAsync(params param.CreateVmInstanceParam) (string, error) { + var resp struct { + Location string `json:"location"` // LongJob UUID + } + if err := cli.Post("v1/vm-instances", params, &resp); err != nil { + return "", err + } + // 从 Location header 提取 LongJob UUID + return extractLongJobUuid(resp.Location), nil +} +``` + +**实现要点**: + +1. 解析 `@LongJobFor` 注解获取目标 API 类 +2. 为目标 API 生成对应的 Async 方法 +3. 返回值为 LongJob UUID (string) +4. 用户可通过 `QueryLongJob(uuid)` 查询执行状态 + +--- + +### 11.3 资源查询方法增强 + +**规则**: 每个资源增加 `Get{Resource}(uuid)` 单参数查询方法 + +**目的**: + +- 简化最常见的单资源查询场景 +- 区分列表查询 `Query{Resource}(params)` 和单资源查询 `Get{Resource}(uuid)` + +**生成规则**: + +```go +// Get{Resource} 根据 UUID 获取单个资源 +func (cli *ZSClient) Get{Resource}(uuid string) (*view.{Resource}InventoryView, error) { + var resp view.{Resource}InventoryView + if err := cli.Get("v1/{resources}", uuid, nil, &resp); err != nil { + return nil, err + } + return &resp, nil +} +``` + +**与 Query 的区别**: + +- `Get{Resource}(uuid)` - 获取单个资源,返回 `*View` +- `Query{Resource}(params)` - 查询资源列表,返回 `[]View` + +--- + +### 11.4 指针类型优化 + +**规则**: 可选字段使用指针类型,方便 nil 检查和区分零值 + +**适用场景**: + +```go +type VmInstanceInventoryView struct { + // 必填字段 - 不使用指针 + UUID string `json:"uuid"` + Name string `json:"name"` + + // 可选字段 - 使用指针 + Description *string `json:"description,omitempty"` + ZoneUUID *string `json:"zoneUuid,omitempty"` + + // 数值字段 - 使用指针区分 0 和未设置 + CPUNum *int `json:"cpuNum,omitempty"` + MemorySize *int64 `json:"memorySize,omitempty"` +} +``` + +**判断规则**: + +1. 有 `omitempty` 标签的字段使用指针 +2. 数值类型(int/int64/float64)如果可选,必须使用指针 +3. 字符串类型如果可选,使用指针 +4. 必填字段不使用指针 + +**使用示例**: + +```go +vm, _ := cli.GetVmInstance("uuid") +if vm.Description != nil { + fmt.Println(*vm.Description) +} +``` + +--- + +### 11.5 基础结构体简化 + +**规则**: 基础结构体仅包含 `uuid` 和 `name` 字段 + +**新的 BaseInfoView 定义**: + +```go +// BaseInfoView 基础信息视图(仅包含通用标识字段) +type BaseInfoView struct { + UUID string `json:"uuid"` // 资源唯一标识 + Name *string `json:"name,omitempty"` // 资源名称(可选) +} +``` + +**继承规则**: + +- 资源有 `uuid` 和 `name` 字段 → 继承 `BaseInfoView` +- 资源只有 `uuid` 字段 → 不继承,直接定义 `UUID` 字段 +- 资源没有 `uuid` 字段 → 不继承 + +**移除字段**: + +- ❌ `Description` - 移入各资源自己的结构体 +- ❌ `CreateDate` / `LastOpDate` - 移除 `BaseTimeView`,各资源自己定义 + +**示例**: + +```go +// 继承 BaseInfoView +type VmInstanceInventoryView struct { + BaseInfoView + Description *string `json:"description,omitempty"` + CreateDate time.Time `json:"createDate,omitempty"` + // ... +} + +// 不继承(资源无 name 字段) +type SessionInventoryView struct { + UUID string `json:"uuid"` + CreateDate time.Time `json:"createDate,omitempty"` + // ... +} +``` + +--- + +### 11.6 多参数路径支持(Query API) + +**规则**: Query API 自动检测 URL 路径中的占位符,支持多参数路径 + +**背景**: + +- 大多数 Query API 使用单一 `{uuid}` 参数 +- 部分资源使用复合键,如 GlobalConfig 使用 `{category}/{name}` + +**检测逻辑**: + +```groovy +// 提取 URL 占位符 +def placeholders = extractUrlPlaceholders(apiPath) +// 例如:"/global-configurations/{category}/{name}" → ["category", "name"] + +if (placeholders.size() >= 2) { + // 生成多参数方法,使用 GetWithSpec +} else { + // 生成标准单参数方法 +} +``` + +**生成示例**: + +```go +// 单参数:APIQueryVmInstanceMsg (/vm-instances/{uuid}) +func (cli *ZSClient) GetVmInstance(uuid string) (*view.VmInstanceInventoryView, error) { + var resp view.VmInstanceInventoryView + if err := cli.Get("v1/vm-instances", uuid, nil, &resp); err != nil { + return nil, err + } + return &resp, nil +} + +// 多参数:APIQueryGlobalConfigMsg (/global-configurations/{category}/{name}) +func (cli *ZSClient) GetGlobalConfig(category string, name string) (*view.GlobalConfigInventoryView, error) { + var resp view.GlobalConfigInventoryView + // 使用 GetWithSpec:第一个参数作为 resourceId,其余构建 spec + err := cli.GetWithSpec("v1/global-configurations", category, []string{name}, "", nil, &resp) + if err != nil { + return nil, err + } + return &resp, nil +} +``` + +**影响范围**: + +- Query API 的 Get 方法生成 +- 非-Query API 的 Get/Update/Delete 方法(如果路径有多个占位符) + +--- + +### 11.7 删除操作 URL 处理 + +**规则**: 删除操作的 URL 路径不包含占位符 `{uuid}`,由业务逻辑自动拼接 + +**旧实现**: + +```go +// ❌ 旧方式 +func (cli *ZSClient) Delete(path string, uuid string, deleteMode string) error { + url := strings.Replace(path, "{uuid}", uuid, 1) // 手动替换占位符 + // ... +} +``` + +**新实现**: + +```go +// ✅ 新方式 +func (cli *ZSClient) Delete(resource string, uuid string, deleteMode string) error { + // 自动拼接 URL: /v1/{resource}/{uuid} + url := fmt.Sprintf("%s/%s", resource, uuid) + if deleteMode != "" { + url += "?deleteMode=" + deleteMode + } + // ... +} +``` + +**生成的 action 方法**: + +```go +// 旧方式 +cli.Delete("v1/vm-instances/{uuid}", uuid, deleteMode) + +// 新方式(更简洁) +cli.Delete("v1/vm-instances", uuid, deleteMode) +``` + +**影响范围**: + +- 所有 DELETE 操作的 actions 方法 +- `client.go` 中的 `Delete()` 方法实现 + +--- + +### 11.8 客户端代码生成简化 + +**规则**: `client.go` 不再由生成器生成,使用固定模板文件 + +**原因**: + +- `client.go` 是基础设施代码,逻辑稳定 +- 避免每次生成都覆盖手动优化的实现 +- 简化生成器逻辑 + +**实现方式**: + +1. 创建 `client.go.template` 固定模板文件 +2. 生成器启动时直接复制模板到输出目录 +3. 移除 `GoInventory.generateClientFile()` 方法 + +**模板文件位置**: + +``` +rest/src/main/resources/scripts/templates/ +└── client.go.template # 固定的 client.go 实现 +``` + +**生成器调用**: + +```groovy +private SdkFile copyClientTemplate() { + def template = new File("templates/client.go.template") + def sdkFile = new SdkFile() + sdkFile.subPath = "/pkg/client/" + sdkFile.fileName = "client.go" + sdkFile.content = template.text + return sdkFile +} +``` + +--- + +### 11.8 可选字段指针类型支持(2026-01 新增) + +**规则**: 支持 `@APIParam(required = false)` 注解,自动将可选字段生成为指针类型 + +**目的**: + +- 区分未设置(nil)和零值(""、0、false) +- 提供更清晰的 API 语义 +- 避免误将零值作为有效输入发送到服务器 + +**判断逻辑**: + +```groovy +private boolean isOptionalField(Field field, Map apiParamMap) { + // 1. uuid 和 name 始终必填 + if (field.name in ["uuid", "name"]) { + return false + } + + // 2. 检查 @APIParam(required = false) + if (field.isAnnotationPresent(APIParam.class)) { + APIParam param = apiParamMap.containsKey(field.name) ? + apiParamMap.get(field.name) : field.getAnnotation(APIParam.class) + return !param.required() + } + + // 3. 没有APIParam注解的字段默认可选 + return true +} +``` + +**生成规则**: + +```groovy +// 基本类型集合 +def basicTypes = ["string", "int", "int64", "int32", "float64", "float32", "bool"] as Set + +// 可选的基本类型使用指针 +if (isOptional && basicTypes.contains(baseType)) { + return "*" + baseType // *string, *int64, *bool 等 +} + +// slice、map、interface{}、struct 本身已支持 nil,不额外添加指针 +return baseType +``` + +**生成示例**: + +```go +// UpdateVmInstanceDetailParam +type UpdateVmInstanceDetailParam struct { + UUID string `json:"uuid" validate:"required"` // 必填 + Name *string `json:"name,omitempty"` // 可选,使用指针 + Description *string `json:"description,omitempty"` // 可选,使用指针 + DefaultL3NetworkUuid *string `json:"defaultL3NetworkUuid,omitempty"` // 可选,使用指针 + CPUNum *int `json:"cpuNum,omitempty"` // 可选,使用指针 +} +``` + +**使用示例**: + +```go +// 只更新 name,不更新 description +name := "new-name" +params := UpdateVmInstanceDetailParam{ + UUID: "vm-uuid", + Name: &name, // 设置为新值 + // Description 为 nil,不会包含在 JSON 中 +} + +// 将 description 设置为空字符串(清空) +emptyDesc := "" +params := UpdateVmInstanceDetailParam{ + UUID: "vm-uuid", + Description: &emptyDesc, // 发送 "description": "" 到服务器 +} +``` + +**注意事项**: + +1. **方法签名一致性**: 修改 `generateParamFieldGeneric` 和 `generateParamFieldType` 后,必须更新所有调用点 +2. **Groovy 类型检查**: 使用 `Set.contains()` 而非 `in` 操作符,避免字符串匹配失败 +3. **嵌套类型处理**: `generateParamNestedStruct` 也需要构建 `apiParamMap` 并调用 `isOptionalField` + +--- + +## 12. Go 版本和依赖 + +- **Go 版本**: 1.22.0+ +- **主要依赖**: + - `github.com/kataras/golog` - 日志 + - `github.com/pkg/errors` - 错误处理 + - `github.com/fatih/color` - 终端颜色 + - `github.com/fatih/structs` - 结构体反射 + +--- + + diff --git a/rest/src/main/resources/scripts/templates/base_param_types.go.template b/rest/src/main/resources/scripts/templates/base_param_types.go.template new file mode 100644 index 00000000000..962ccda910b --- /dev/null +++ b/rest/src/main/resources/scripts/templates/base_param_types.go.template @@ -0,0 +1,45 @@ +// Copyright (c) ZStack.io, Inc. + +package param + +import "time" + +var _ = time.Now // avoid unused import + +type DeleteMode string + +const ( + DeleteModePermissive DeleteMode = "Permissive" + DeleteModeEnforcing DeleteMode = "Enforcing" +) + +type BaseParam struct { + SystemTags []string `json:"systemTags,omitempty"` // System tags + UserTags []string `json:"userTags,omitempty"` // User tags + RequestIp string `json:"requestIp,omitempty"` // Request IP +} + +type HqlParam struct { + OperationName string `json:"operationName"` // Request name + Query string `json:"query"` // Query statement + Variables Variables `json:"variables"` // Parameters for the statement +} + +type Variables struct { + Conditions []Condition `json:"conditions"` // Conditions + ExtraConditions []Condition `json:"extraConditions"` // Extra conditions + Input map[string]interface{} `json:"input"` // Input parameters + PageVar `json:",inline,omitempty"` + Type string `json:"type"` // Type +} + +type Condition struct { + Key string `json:"key"` // Key + Op string `json:"op"` // Operator + Value string `json:"value"` // Value +} + +type PageVar struct { + Start int `json:"start,omitempty"` // Start page + Limit int `json:"limit,omitempty"` // Limit per page +} diff --git a/rest/src/main/resources/scripts/templates/base_params.go.template b/rest/src/main/resources/scripts/templates/base_params.go.template new file mode 100644 index 00000000000..b6d4c72ef5a --- /dev/null +++ b/rest/src/main/resources/scripts/templates/base_params.go.template @@ -0,0 +1,102 @@ +// Copyright (c) ZStack.io, Inc. + +package param + +import ( + "errors" + "fmt" + "net/url" + "reflect" + "strings" + + "github.com/fatih/structs" +) + +type QueryParam struct { + url.Values +} + +func NewQueryParam() QueryParam { + return QueryParam{ + Values: make(url.Values), + } +} + +// AddQ adds a query condition, similar to a MySQL database query. +// Omitting this field will return all records, with the number of returned records limited by the 'limit' field. +func (params *QueryParam) AddQ(q string) *QueryParam { + if params.Get("q") == "" { + params.Set("q", q) + } else { + params.Add("q", q) + } + return params +} + +// Limit sets the maximum number of records to return, similar to MySQL's 'limit'. Default value is 1000. +func (params *QueryParam) Limit(limit int) *QueryParam { + params.Set("limit", fmt.Sprintf("%d", limit)) + return params +} + +// Start sets the starting position for the query, similar to MySQL's 'offset'. Used with 'limit' for pagination. +func (params *QueryParam) Start(start int) *QueryParam { + params.Set("start", fmt.Sprintf("%d", start)) + return params +} + +// Count sets the query to return the count of records that match the query conditions, similar to MySQL's 'count()' function. +func (params *QueryParam) Count(count bool) *QueryParam { + params.Set("count", fmt.Sprintf("%t", count)) + return params +} + +// GroupBy groups the results by a specified field, similar to MySQL's 'group by' keyword. +func (params *QueryParam) GroupBy(groupBy string) *QueryParam { + params.Set("groupBy", groupBy) + return params +} + +// ReplyWithCount, when set to true, includes the total count of records that match the query in the response. +func (params *QueryParam) ReplyWithCount(replyWithCount bool) *QueryParam { + params.Set("replyWithCount", fmt.Sprintf("%t", replyWithCount)) + return params +} + +// FilterName sets a filter name, functionality is unknown from ZStack Java SDK (sdk-4.4.0.jar). +func (params *QueryParam) FilterName(filterName string) *QueryParam { + params.Set("filterName", filterName) + return params +} + +// Sort sorts the results by a specified field, similar to MySQL's 'sort by' keyword. +// Use '+' for ascending order and '-' for descending order, followed by the field name. +func (params *QueryParam) Sort(sort string) *QueryParam { + params.Set("sort", sort) + return params +} + +// Fields specifies the fields to return, similar to MySQL's 'select' fields functionality. +func (params *QueryParam) Fields(fields []string) *QueryParam { + params.Set("fields", strings.Join(fields, ",")) + return params +} + +// ConvertStruct2UrlValues converts a struct to url.Values. +func ConvertStruct2UrlValues(param interface{}) (url.Values, error) { + if reflect.Ptr != reflect.TypeOf(param).Kind() { + return nil, errors.New("model should be pointer kind") + } + result := url.Values{} + if param == nil || reflect.ValueOf(param).IsNil() { + return nil, errors.New("param is nil") + } + + s := structs.New(param) + s.TagName = "json" + mappedOpts := s.Map() + for k, v := range mappedOpts { + result.Set(k, fmt.Sprintf("%v", v)) + } + return result, nil +} diff --git a/rest/src/main/resources/scripts/templates/client.go.template b/rest/src/main/resources/scripts/templates/client.go.template new file mode 100644 index 00000000000..df677d00991 --- /dev/null +++ b/rest/src/main/resources/scripts/templates/client.go.template @@ -0,0 +1,674 @@ +// Copyright (c) ZStack.io, Inc. + +package client + +import ( + "crypto/sha512" + "fmt" + "net/http" + "net/url" + + "github.com/zstackio/zstack-sdk-go-v2/pkg/errors" + "github.com/zstackio/zstack-sdk-go-v2/pkg/param" + "github.com/zstackio/zstack-sdk-go-v2/pkg/view" + "github.com/kataras/golog" +) + +type ZSClient struct { + *ZSHttpClient +} + +func NewZSClient(config *ZSConfig) *ZSClient { + return &ZSClient{ + ZSHttpClient: NewZSHttpClient(config), + } +} + +func (cli *ZSClient) Login() (*view.SessionInventoryView, error) { + if cli.authType != AuthTypeAccountUser && cli.authType != AuthTypeAccount { + return nil, errors.ErrNotSupported + } + + var sessionView *view.SessionInventoryView + var err error + if cli.authType == AuthTypeAccountUser { + sessionView, err = cli.logInByAccountUser() + } else { + sessionView, err = cli.logInByAccount() + } + + if err != nil { + golog.Errorf("ZSClient.Login error:%v", err) + return nil, err + } + + cli.LoadSession(sessionView.Uuid) + return sessionView, nil +} + +func (cli *ZSClient) logInByAccountUser() (*view.SessionInventoryView, error) { + if cli.authType != AuthTypeAccountUser { + return nil, errors.ErrNotSupported + } + + if len(cli.accountName) == 0 || len(cli.accountUserName) == 0 || len(cli.password) == 0 { + return nil, errors.ErrParameter + } + + params := param.LogInByUserParam{ + LogInByUser: param.LogInByUserDetailParam{ + AccountName: cli.accountName, + UserName: cli.accountUserName, + Password: fmt.Sprintf("%x", sha512.Sum512([]byte(cli.password))), + }, + } + sessionView := view.SessionInventoryView{} + err := cli.Put("v1/accounts/users/login", "", params, &sessionView) + if err != nil { + golog.Errorf("ZSClient.logInByAccountUser Account[%s] User[%s] error:%v", + cli.accountName, cli.accountUserName, err) + return nil, err + } + + return &sessionView, nil +} + +func (cli *ZSClient) logInByAccount() (*view.SessionInventoryView, error) { + if cli.authType != AuthTypeAccount { + return nil, errors.ErrNotSupported + } + + if len(cli.accountName) == 0 || len(cli.password) == 0 { + return nil, errors.ErrParameter + } + + params := param.LoginByAccountParam{ + LoginByAccount: param.LoginByAccountDetailParam{ + AccountName: cli.accountName, + Password: fmt.Sprintf("%x", sha512.Sum512([]byte(cli.password))), + }, + } + sessionView := view.SessionInventoryView{} + err := cli.Put("v1/accounts/login", "", params, &sessionView) + if err != nil { + golog.Errorf("ZSClient.logInByAccount Account[%s] error:%v", cli.accountName, err) + return nil, err + } + + return &sessionView, nil +} + +func (cli *ZSClient) ValidateSession() (map[string]bool, error) { + if cli.authType != AuthTypeAccountUser && cli.authType != AuthTypeAccount { + return nil, errors.ErrNotSupported + } + + if len(cli.sessionId) == 0 { + return nil, errors.ErrNotSupported + } + + return cli.ValidateSessionId(cli.sessionId) +} + +func (cli *ZSClient) ValidateSessionId(sessionId string) (map[string]bool, error) { + validSession := make(map[string]bool) + err := cli.GetWithSpec("v1/accounts/sessions", sessionId, "valid", "", nil, &validSession) + if err != nil { + golog.Errorf("ZSClient.ValidateSession sessionId[%s] error:%v", sessionId, err) + return nil, err + } + + golog.Debugf("ZSClient.ValidateSession sessionId[%s]:%v", sessionId, validSession) + return validSession, nil +} + +func (cli *ZSClient) Logout() error { + if cli.authType != AuthTypeAccountUser && cli.authType != AuthTypeAccount { + return errors.ErrNotSupported + } + + if len(cli.sessionId) == 0 { + return errors.ErrNotSupported + } + + err := cli.Delete("v1/accounts/sessions", cli.sessionId, "") + if err != nil { + golog.Errorf("ZSClient.Logout sessionId[%s] error:%v", cli.sessionId, err) + return err + } + + cli.unloadSession() + return nil +} + +func (cli *ZSClient) WebLogin() (*view.WebUISessionView, error) { + if cli.authType != AuthTypeAccountUser && cli.authType != AuthTypeAccount { + return nil, errors.ErrNotSupported + } + + var operationName, username, loginType, query string + var input map[string]interface{} + if cli.authType == AuthTypeAccount { + operationName, username, loginType = "loginByAccount", cli.accountName, "iam1" + input = map[string]interface{}{ + "accountName": cli.accountName, + "password": fmt.Sprintf("%x", sha512.Sum512([]byte(cli.password))), + } + query = `mutation loginByAccount($input:LoginByAccountInput!) { + loginByAccount(input: $input) { + sessionId, + accountUuid, + userUuid, + currentIdentity + } + }` + } else { + operationName, username, loginType = "loginIAM2VirtualID", cli.accountUserName, "iam2" + input = map[string]interface{}{ + "name": cli.accountUserName, + "password": fmt.Sprintf("%x", sha512.Sum512([]byte(cli.password))), + } + query = `mutation loginIAM2VirtualID($input:LoginIAM2VirtualIDInput!) { + loginIAM2VirtualID(input: $input) { + sessionId, + accountUuid, + userUuid, + currentIdentity + } + }` + } + + result := new(view.WebUISessionView) + params := param.HqlParam{ + OperationName: operationName, + Query: query, + Variables: param.Variables{ + Input: input, + }, + } + respHeader, err := cli.hql(params, result, responseKeyData, operationName) + if err != nil { + return nil, err + } + result.UserName = username + result.LoginType = loginType + result.ZSVersion = respHeader.Get("Zs-Version") + return result, nil +} + +func (cli *ZSClient) hql(params param.HqlParam, retVal interface{}, unMarshalKeys ...string) (http.Header, error) { + urlStr := fmt.Sprintf("http://%s:%d/graphql", cli.hostname, WebZStackPort) + _, respHeader, resp, err := cli.httpPost(urlStr, jsonMarshal(params), false) + if err != nil { + return nil, err + } + + if retVal == nil { + return nil, nil + } + + return respHeader, resp.Unmarshal(retVal, unMarshalKeys...) +} + +func (cli *ZSClient) Zql(querySt string, retVal interface{}, unMarshalKeys ...string) (http.Header, error) { + encodedQuery := url.QueryEscape(querySt) + baseUrl := cli.getRequestURL("v1/zql") + urlStr := fmt.Sprintf("%s?zql=%s", baseUrl, encodedQuery) + _, respHeader, resp, err := cli.httpGet(urlStr, false) + if err != nil { + return nil, err + } + + if retVal == nil { + return nil, nil + } + + return respHeader, resp.Unmarshal(retVal, unMarshalKeys...) +} + +// AuthType authentication type +//type AuthType string + +const ( + //AuthTypeAccessKey AuthType = "accesskey" + AuthTypeLogin AuthType = "login" +) + +const ( +// defaultZStackPort = 8080 +) + +// ZSConfig client configuration +/* +type ZSConfig struct { + hostname string + port int + contextPath string + accessKeyId string + accessKeySecret string + username string + password string + authType AuthType + debug bool + timeout time.Duration +} + +// NewZSConfig creates a new configuration +func NewZSConfig(hostname string, port int, contextPath string) *ZSConfig { + return &ZSConfig{ + hostname: hostname, + port: port, + contextPath: contextPath, + timeout: 30 * time.Second, + } +} + +// DefaultZSConfig creates a default configuration +func DefaultZSConfig(hostname, contextPath string) *ZSConfig { + return NewZSConfig(hostname, defaultZStackPort, contextPath) +} + +// AccessKey sets access key authentication +func (config *ZSConfig) AccessKey(id, secret string) *ZSConfig { + config.accessKeyId = id + config.accessKeySecret = secret + config.authType = AuthTypeAccessKey + return config +} + + +// Login sets login authentication +func (config *ZSConfig) Login(username, password string) *ZSConfig { + config.username = username + config.password = password + config.authType = AuthTypeLogin + return config +} +*/ + +// Debug enables debug mode +/* +func (config *ZSConfig) Debug(debug bool) *ZSConfig { + config.debug = debug + return config +} +*/ + +// ZSClient ZStack API client +/* +type ZSClient struct { + config *ZSConfig + httpClient *http.Client + sessionId string +} +*/ + +// JobView job inventory view +type JobView struct { + UUID string `json:"uuid"` + State string `json:"state"` + Result interface{} `json:"result,omitempty"` + Error interface{} `json:"error,omitempty"` + CreateDate string `json:"createDate"` +} + +const ( + JobStateProcessing = "Processing" + JobStateSucceeded = "Succeeded" + JobStateFailed = "Failed" +) + +// NewZSClient creates a new ZStack client +/* +func NewZSClient(config *ZSConfig) *ZSClient { + // Auto-encrypt password for login authentication + if config.authType == AuthTypeLogin && config.password != "" { + config.password = hashPasswordSHA512(config.password) + if config.debug { + fmt.Printf("[DEBUG] Password hashed: %s...\n", config.password[:16]) + } + } + return &ZSClient{ + config: config, + httpClient: &http.Client{ + Timeout: config.timeout, + }, + } +} +*/ + +// hashPasswordSHA512 encrypts password using SHA512 +/* +func hashPasswordSHA512(password string) string { + hash := sha512.Sum512([]byte(password)) + return hex.EncodeToString(hash[:]) +} + +func (cli *ZSClient) baseURL() string { + return fmt.Sprintf("http://%s:%d%s", cli.config.hostname, cli.config.port, cli.config.contextPath) +} + +// Get performs a GET request +func (cli *ZSClient) Get(path string, uuid string, params interface{}, result interface{}) error { + url := fmt.Sprintf("%s/%s", cli.baseURL(), path) + if uuid != "" { + url = fmt.Sprintf("%s/%s", url, uuid) + } + return cli.doRequest("GET", url, nil, result) +} + +func (cli *ZSClient) QueryJob(uuid string) (*JobView, error) { + var resp JobView + url := fmt.Sprintf("%s/v1/api-jobs/%s", cli.baseURL(), uuid) + err := cli.doRequest("GET", url, nil, &resp) + return &resp, err +} + +// List performs a list query +func (cli *ZSClient) List(path string, params interface{}, result interface{}) error { + baseURL := cli.baseURL() + requestURL := fmt.Sprintf("%s/%s", baseURL, path) + + if params != nil { + if queryParam, ok := params.(*param.QueryParam); ok { + queryString := cli.buildQueryString(queryParam) + if queryString != "" { + requestURL = fmt.Sprintf("%s?%s", requestURL, queryString) + } + } + } + + // Unmarshal response into wrapper with inventories field + var wrapper struct { + Inventories interface{} `json:"inventories"` + Inventory interface{} `json:"inventory"` + } + + if err := cli.doRequest("GET", requestURL, nil, &wrapper); err != nil { + return err + } + + // Try inventories first (plural), then inventory (singular) + var data interface{} + if wrapper.Inventories != nil { + data = wrapper.Inventories + } else if wrapper.Inventory != nil { + data = wrapper.Inventory + } + + // Re-marshal and unmarshal into the actual result type + if data != nil { + dataBytes, err := json.Marshal(data) + if err != nil { + return fmt.Errorf("failed to marshal data: %v", err) + } + if cli.config.debug { + fmt.Printf("[DEBUG] Received %d bytes of inventory data\n", len(dataBytes)) + } + err = json.Unmarshal(dataBytes, result) + if err != nil { + return fmt.Errorf("failed to unmarshal data into result: %v", err) + } + return nil + } + if cli.config.debug { + fmt.Println("[DEBUG] Both inventories and inventory are nil, returning empty result") + } + return nil +} + +// Post performs a POST request +func (cli *ZSClient) Post(path string, params interface{}, result interface{}) error { + url := fmt.Sprintf("%s/%s", cli.baseURL(), path) + return cli.doRequest("POST", url, params, result) +} + +// Put performs a PUT request +func (cli *ZSClient) Put(path string, uuid string, params interface{}, result interface{}) error { + url := fmt.Sprintf("%s/%s/%s", cli.baseURL(), path, uuid) + return cli.doRequest("PUT", url, params, result) +} + +// Delete performs a DELETE request +func (cli *ZSClient) Delete(path string, uuid string, deleteMode string) error { + url := fmt.Sprintf("%s/%s/%s?deleteMode=%s", cli.baseURL(), path, uuid, deleteMode) + return cli.doRequest("DELETE", url, nil, nil) +} + +// GetWithSpec performs a GET request with custom path specification +// Example: cli.GetWithSpec("v1/l3-networks", fmt.Sprintf("%s/ip/%s/availability", l3NetworkUuid, ip), "", "", nil, &resp) +func (cli *ZSClient) GetWithSpec(basePath string, pathSpec string, action string, suffix string, params interface{}, result interface{}) error { + url := fmt.Sprintf("%s/%s/%s", cli.baseURL(), basePath, pathSpec) + if action != "" { + url = fmt.Sprintf("%s/%s", url, action) + } + if suffix != "" { + url = fmt.Sprintf("%s/%s", url, suffix) + } + return cli.doRequest("GET", url, params, result) +} + +// PostWithSpec performs a POST request with custom path specification +func (cli *ZSClient) PostWithSpec(basePath string, pathSpec string, params interface{}, result interface{}) error { + url := fmt.Sprintf("%s/%s/%s", cli.baseURL(), basePath, pathSpec) + return cli.doRequest("POST", url, params, result) +} + +// PutWithSpec performs a PUT request with custom path specification +func (cli *ZSClient) PutWithSpec(basePath string, pathSpec string, params interface{}, result interface{}) error { + url := fmt.Sprintf("%s/%s/%s", cli.baseURL(), basePath, pathSpec) + return cli.doRequest("PUT", url, params, result) +} + +// DeleteWithSpec performs a DELETE request with custom path specification +func (cli *ZSClient) DeleteWithSpec(basePath string, pathSpec string, deleteMode string) error { + url := fmt.Sprintf("%s/%s/%s?deleteMode=%s", cli.baseURL(), basePath, pathSpec, deleteMode) + return cli.doRequest("DELETE", url, nil, nil) +} + +func (cli *ZSClient) doRequest(method, url string, body interface{}, result interface{}) error { + // Auto-login if using login auth and no session yet + if cli.config.authType == AuthTypeLogin && cli.sessionId == "" && !strings.HasSuffix(url, "/accounts/login") { + err := cli.Login(cli.config.username, cli.config.password) + if err != nil { + return fmt.Errorf("auto-login failed: %v", err) + } + } + + var bodyReader io.Reader + var bodyBytes []byte + if body != nil { + var err error + bodyBytes, err = json.Marshal(body) + if err != nil { + return err + } + bodyReader = bytes.NewBuffer(bodyBytes) + } + + req, err := http.NewRequest(method, url, bodyReader) + if err != nil { + return err + } + + req.Header.Set("Content-Type", "application/json") + cli.addAuthHeaders(req) + + if cli.config.debug && bodyBytes != nil { + fmt.Printf("[DEBUG] %s %s\n", method, url) + fmt.Printf("[DEBUG] Body: %s\n", string(bodyBytes)) + fmt.Printf("[DEBUG] Headers: Authorization=%s\n", req.Header.Get("Authorization")) + } + + resp, err := cli.httpClient.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + if resp.StatusCode == 202 { + var location struct { + Location string `json:"location"` + Uuid string `json:"org.zstack.header.rest.APIEvent/uuid"` + } + if err := json.NewDecoder(resp.Body).Decode(&location); err != nil { + return fmt.Errorf("failed to decode 202 response: %v", err) + } + jobUUID := location.Uuid + if jobUUID == "" { + parts := bytes.Split([]byte(location.Location), []byte("/")) + if len(parts) > 0 { + jobUUID = string(parts[len(parts)-1]) + } + } + + if jobUUID == "" { + return fmt.Errorf("failed to extract job uuid from 202 response") + } + + return cli.waitForJob(jobUUID, result) + } + + if resp.StatusCode >= 400 { + respBody, _ := io.ReadAll(resp.Body) + errMsg := fmt.Sprintf("API error: %s %s returned status code %d\n", method, url, resp.StatusCode) + errMsg += fmt.Sprintf("Authorization: %s\n", req.Header.Get("Authorization")) + errMsg += fmt.Sprintf("Response: %s", string(respBody)) + return fmt.Errorf(errMsg) + } + + if result != nil { + return json.NewDecoder(resp.Body).Decode(result) + } + return nil +} + +func (cli *ZSClient) waitForJob(jobUUID string, result interface{}) error { + ticker := time.NewTicker(500 * time.Millisecond) + defer ticker.Stop() + + timeout := time.After(30 * time.Minute) + + for { + select { + case <-timeout: + return fmt.Errorf("job %s timeout", jobUUID) + case <-ticker.C: + job, err := cli.QueryJob(jobUUID) + if err != nil { + continue + } + + if job.State == JobStateSucceeded { + if result != nil && job.Result != nil { + data, err := json.Marshal(job.Result) + if err != nil { + return fmt.Errorf("failed to marshal job result: %v", err) + } + return json.Unmarshal(data, result) + } + return nil + } + + if job.State == JobStateFailed { + return fmt.Errorf("job failed: %v", job.Error) + } + } + } +} + +func (cli *ZSClient) buildQueryString(params *param.QueryParam) string { + if params == nil { + return "" + } + u := url.Values{} + + for _, q := range params.Conditions { + if q.Name != "" && q.Op != "" { + u.Add("q", fmt.Sprintf("%s%s%s", q.Name, q.Op, q.Value)) + } else if q.Value != "" { + u.Add("q", q.Value) + } + } + + if params.LimitNum != nil { + u.Set("limit", strconv.Itoa(*params.LimitNum)) + } + if params.StartNum != nil { + u.Set("start", strconv.Itoa(*params.StartNum)) + } + if params.Count { + u.Set("count", "true") + } + if params.ReplyWithCount { + u.Set("replyWithCount", "true") + } + if params.GroupBy != "" { + u.Set("groupBy", params.GroupBy) + } + if params.SortBy != "" { + u.Set("sortBy", params.SortBy) + } + if params.SortDirection != "" { + u.Set("sortDirection", params.SortDirection) + } + for _, f := range params.Fields { + u.Add("fields", f) + } + + return u.Encode() +} + +func (cli *ZSClient) addAuthHeaders(req *http.Request) { + if cli.config.authType == AuthTypeAccessKey { + req.Header.Set("X-Access-Key-Id", cli.config.accessKeyId) + req.Header.Set("X-Access-Key-Secret", cli.config.accessKeySecret) + } else if cli.sessionId != "" { + req.Header.Set("Authorization", "OAuth "+cli.sessionId) + } +} + +// Login authenticates with username and password +func (cli *ZSClient) Login(username, password string) error { + if cli.config.authType != AuthTypeLogin { + return fmt.Errorf("client is not configured for login authentication") + } + + var loginReq = map[string]map[string]string{ + "logInByAccount": { + "accountName": username, + "password": password, // Already hashed in NewZSClient + }, + } + + var loginResp struct { + Inventory struct { + UUID string `json:"uuid"` + } `json:"inventory"` + } + + url := fmt.Sprintf("%s/v1/accounts/login", cli.baseURL()) + err := cli.doRequest("PUT", url, loginReq, &loginResp) + if err != nil { + return fmt.Errorf("login failed: %v", err) + } + + cli.sessionId = loginResp.Inventory.UUID + if cli.config.debug { + fmt.Printf("[DEBUG] Login successful, sessionId=%s\n", cli.sessionId) + } + return nil +} + +func (cli *ZSClient) Logout() error { + if cli.sessionId == "" { + return nil + } + + url := fmt.Sprintf("%s/v1/accounts/sessions/%s", cli.baseURL(), cli.sessionId) + err := cli.doRequest("DELETE", url, nil, nil) + cli.sessionId = "" + return err +} + +*/ diff --git a/rest/src/main/resources/scripts/templates/example_main.go b/rest/src/main/resources/scripts/templates/example_main.go new file mode 100644 index 00000000000..9af5db5fd29 --- /dev/null +++ b/rest/src/main/resources/scripts/templates/example_main.go @@ -0,0 +1,110 @@ +package main + +import ( + "fmt" + + "github.com/zstackio/zstack-sdk-go-v2/pkg/client" + "github.com/zstackio/zstack-sdk-go-v2/pkg/param" +) + +func main() { + // 创建客户端配置 + // 方式1: 使用完整配置 + // config := client.NewZSConfig("YOUR_ZSTACK_API_ENDPOINT", 8080, "/zstack"). + // LoginAccount("admin", "password"). + // Debug(true) + + // 方式2: 使用默认配置(推荐) + config := client.DefaultZSConfig("YOUR_ZSTACK_API_ENDPOINT"). + LoginAccount("admin", "password"). + Debug(true) + + // 初始化客户端 + cli := client.NewZSClient(config) + + // 登录 + fmt.Println("正在登录...") + sessionView, err := cli.Login() + if err != nil { + fmt.Printf("登录失败: %v\n", err) + return + } + fmt.Printf("登录成功!Session UUID: %s\n", sessionView.Uuid) + + // 查询虚拟机列表 + fmt.Println("\n开始查询虚拟机...") + queryParams := param.NewQueryParam() + queryParams.Limit(10) + vms, err := cli.QueryVmInstance(&queryParams) + if err != nil { + fmt.Printf("查询失败: %v\n", err) + return + } + + fmt.Printf("查询成功!共找到 %d 台虚拟机\n", len(vms)) + for i, vm := range vms { + fmt.Printf("[%d] VM: %s, UUID: %s, State: %s\n", i+1, vm.Name, vm.Uuid, vm.State) + } + + // 获取单个虚拟机详情(如果有虚拟机的话) + if len(vms) > 0 { + fmt.Printf("\n获取第一台虚拟机详情...\n") + vmDetail, err := cli.GetVmInstance(vms[0].Uuid) + if err != nil { + fmt.Printf("获取虚拟机详情失败: %v\n", err) + } else { + fmt.Printf("虚拟机详情: Name=%s, UUID=%s, State=%s, CPUs=%d, Memory=%d\n", + vmDetail.Name, vmDetail.Uuid, vmDetail.State, vmDetail.CpuNum, vmDetail.MemorySize) + } + } + + // 查询镜像列表 + fmt.Println("\n查询镜像列表...") + imageParams := param.NewQueryParam() + imageParams.Limit(5) + images, err := cli.QueryImage(&imageParams) + if err != nil { + fmt.Printf("查询镜像失败: %v\n", err) + } else { + fmt.Printf("共找到 %d 个镜像\n", len(images)) + for i, img := range images { + fmt.Printf("[%d] Image: %s, UUID: %s, Format: %s\n", i+1, img.Name, img.Uuid, img.Format) + } + } + + // 查询云盘列表 + fmt.Println("\n查询云盘列表...") + volumeParams := param.NewQueryParam() + volumeParams.Limit(5) + volumes, err := cli.QueryVolume(&volumeParams) + if err != nil { + fmt.Printf("查询云盘失败: %v\n", err) + } else { + fmt.Printf("共找到 %d 个云盘\n", len(volumes)) + for i, vol := range volumes { + sizeGB := int64(0) + if vol.Size != nil { + sizeGB = *vol.Size / (1024 * 1024 * 1024) + } + fmt.Printf("[%d] Volume: %s, UUID: %s, Size: %d GB\n", + i+1, vol.Name, vol.Uuid, sizeGB) + } + } + + // 验证会话是否有效 + fmt.Println("\n验证会话...") + valid, err := cli.ValidateSession() + if err != nil { + fmt.Printf("验证会话失败: %v\n", err) + } else { + fmt.Printf("会话有效性: %v\n", valid) + } + + // 登出 + fmt.Println("\n正在登出...") + if err := cli.Logout(); err != nil { + fmt.Printf("登出失败: %v\n", err) + } else { + fmt.Println("登出成功!") + } +} diff --git a/rest/src/main/resources/scripts/templates/login_params.go.template b/rest/src/main/resources/scripts/templates/login_params.go.template new file mode 100644 index 00000000000..b7beb19e784 --- /dev/null +++ b/rest/src/main/resources/scripts/templates/login_params.go.template @@ -0,0 +1,55 @@ +// Copyright (c) ZStack.io, Inc. + +package param + +type LoginByAccountParam struct { + BaseParam + LoginByAccount LoginByAccountDetailParam `json:"logInByAccount"` +} + +type LoginByAccountDetailParam struct { + AccountName string `json:"accountName"` // Account name + Password string `json:"password"` // Password + AccountType string `json:"accountType"` // Account type + CaptchaUuid string `json:"captchaUuid"` // Captcha UUID + VerifyCode string `json:"verifyCode"` // Verification code + ClientInfo map[string]interface{} `json:"clientInfo"` // Client information +} + +type LogInByUserParam struct { + BaseParam + LogInByUser LogInByUserDetailParam `json:"logInByUser"` +} + +type LogInByUserDetailParam struct { + AccountUuid string `json:"accountUuid"` // Account UUID + AccountName string `json:"accountName"` // Account name + UserName string `json:"userName"` // User name + Password string `json:"password"` // Password + ClientInfo map[string]interface{} `json:"clientInfo"` // Client information +} + +type LoginIAM2VirtualIDWithLdapParam struct { + BaseParam + LoginIAM2VirtualIDWithLdap LoginIAM2VirtualIDWithLdapDetailParam `json:"loginIAM2VirtualIDWithLdap"` +} + +type LoginIAM2VirtualIDWithLdapDetailParam struct { + VirtualIDUuid string `json:"virtualIDUuid"` // Virtual ID UUID + LdapUid string `json:"ldapUid"` // LDAP UID + Password string `json:"password"` // Password +} + +type LoginIAM2PlatformParam struct { + BaseParam + LoginIAM2Platform LoginIAM2PlatformDetailParam `json:"loginIAM2Platform"` +} + +type LoginIAM2PlatformDetailParam struct { + VirtualIDUuid string `json:"virtualIDUuid"` // Virtual ID UUID + Password string `json:"password"` // Password +} + +type ValidateSessionParam struct { + BaseParam +} diff --git a/rest/src/main/resources/scripts/templates/session_additional_views.go.template b/rest/src/main/resources/scripts/templates/session_additional_views.go.template new file mode 100644 index 00000000000..d8096b2f695 --- /dev/null +++ b/rest/src/main/resources/scripts/templates/session_additional_views.go.template @@ -0,0 +1,26 @@ +// Copyright (c) ZStack.io, Inc. + +package view + +import "time" + +// SessionInventoryView Session +type SessionInventoryView struct { + Uuid string `json:"uuid"` + AccountUuid string `json:"accountUuid,omitempty"` + UserUuid string `json:"userUuid,omitempty"` + UserType string `json:"userType,omitempty"` + ExpiredDate time.Time `json:"expiredDate,omitempty"` + CreateDate time.Time `json:"createDate,omitempty"` +} + +// WebUISessionView Web UI Session +type WebUISessionView struct { + SessionId string `json:"sessionId"` // Session ID + AccountUuid string `json:"accountUuid"` // Account UUID + UserUuid string `json:"userUuid"` // User UUID + UserName string `json:"username"` // Username + LoginType string `json:"loginType"` // Login type + CurrentIdentity string `json:"currentIdentity"` // Current identity + ZSVersion string `json:"zsVersion"` // ZStack Cloud version +} diff --git a/rest/src/main/resources/scripts/templates/session_views.go.template b/rest/src/main/resources/scripts/templates/session_views.go.template new file mode 100644 index 00000000000..d8096b2f695 --- /dev/null +++ b/rest/src/main/resources/scripts/templates/session_views.go.template @@ -0,0 +1,26 @@ +// Copyright (c) ZStack.io, Inc. + +package view + +import "time" + +// SessionInventoryView Session +type SessionInventoryView struct { + Uuid string `json:"uuid"` + AccountUuid string `json:"accountUuid,omitempty"` + UserUuid string `json:"userUuid,omitempty"` + UserType string `json:"userType,omitempty"` + ExpiredDate time.Time `json:"expiredDate,omitempty"` + CreateDate time.Time `json:"createDate,omitempty"` +} + +// WebUISessionView Web UI Session +type WebUISessionView struct { + SessionId string `json:"sessionId"` // Session ID + AccountUuid string `json:"accountUuid"` // Account UUID + UserUuid string `json:"userUuid"` // User UUID + UserName string `json:"username"` // Username + LoginType string `json:"loginType"` // Login type + CurrentIdentity string `json:"currentIdentity"` // Current identity + ZSVersion string `json:"zsVersion"` // ZStack Cloud version +} From 42699989fbfc4a907205ceae39da76c856eda064 Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Tue, 20 Jan 2026 13:57:29 +0800 Subject: [PATCH 697/737] [sdnController]: fix duplicated event: SdnControllerStatus.Connected Resolves: ZSTAC-80888 Change-Id: I7a76696f676b746b717169676161636a6b786366 --- .../java/org/zstack/sdnController/SdnControllerPingTracker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java index 2deeb4602aa..a959dee3005 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java @@ -89,8 +89,8 @@ public void handleReply(final String resourceUuid, MessageReply reply) { } SdnControllerStatus oldStatus = vo.getStatus(); - new SdnControllerBase(vo).changeSdnControllerStatus(SdnControllerStatus.Connected); if (oldStatus == SdnControllerStatus.Disconnected) { + // when reconnect successfully, it will fire event: SdnControllerStatus.Connected ReconnectSdnControllerMsg msg = new ReconnectSdnControllerMsg(); msg.setControllerUuid(resourceUuid); bus.makeTargetServiceIdByResourceUuid(msg, SdnControllerConstant.SERVICE_ID, resourceUuid); From 5c3fab5568c2647987978ce1b7cb0c41580d4dfb Mon Sep 17 00:00:00 2001 From: "shixin.ruan" Date: Tue, 20 Jan 2026 14:36:43 +0800 Subject: [PATCH 698/737] [virtualRouterProvider]: change vrouter ip_local_port_range Resolves: ZSTAC-81450 Change-Id: I79666f616d64797a747677656762626d6a71786d --- .../service/virtualrouter/vyos/VyosConnectFlow.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConnectFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConnectFlow.java index 23299dd34b5..b3a7037e4cc 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConnectFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConnectFlow.java @@ -181,12 +181,9 @@ public void run(final FlowTrigger trigger, Map data) { cmd.setLogLevel(rcf.getResourceConfigValue(VirtualRouterGlobalConfig.LOG_LEVEL, vrUuid, String.class)); Map parms = new HashMap<>(); - long count = Q.New(VirtualRouterLoadBalancerRefVO.class) - .eq(VirtualRouterLoadBalancerRefVO_.virtualRouterVmUuid, vrUuid) - .notNull(VirtualRouterLoadBalancerRefVO_.loadBalancerUuid) - .count(); - if(count > 0){ - parms.put(VirtualRouterGlobalConfig.IPV4_LOCAL_PORT_RANGE.getName(),VirtualRouterGlobalConfig.IPV4_LOCAL_PORT_RANGE.value()); + if (!VirtualRouterGlobalConfig.IPV4_LOCAL_PORT_RANGE.value().equals( + VirtualRouterGlobalConfig.IPV4_LOCAL_PORT_RANGE.defaultValue(String.class))){ + parms.put(VirtualRouterGlobalConfig.IPV4_LOCAL_PORT_RANGE.getName(), VirtualRouterGlobalConfig.IPV4_LOCAL_PORT_RANGE.value()); } cmd.setParms(parms); From 7c015d6648dc7d14e9088b7bc47353645fb21c3b Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 21 Jan 2026 13:12:13 +0800 Subject: [PATCH 699/737] [rest]: Fix api sync call message with Put method Resolves: ZCF-22 Change-Id: I6374626d7975786b6170666f6d64736e6d71626b Signed-off-by: AlanJager --- .../resources/scripts/GoApiTemplate.groovy | 334 ++++++++++++++---- 1 file changed, 272 insertions(+), 62 deletions(-) diff --git a/rest/src/main/resources/scripts/GoApiTemplate.groovy b/rest/src/main/resources/scripts/GoApiTemplate.groovy index 9212129e958..fefe945ba3c 100644 --- a/rest/src/main/resources/scripts/GoApiTemplate.groovy +++ b/rest/src/main/resources/scripts/GoApiTemplate.groovy @@ -217,6 +217,35 @@ class GoApiTemplate implements SdkTemplate { return false } + /** + * Check if API class has valid parameter fields (excluding inherited base fields) + */ + private boolean hasApiParams() { + if (apiMsgClazz == null) { + return false + } + try { + def fields = apiMsgClazz.getDeclaredFields() + // Filter out synthetic, static fields and common inherited fields + def validFields = fields.findAll { field -> + !java.lang.reflect.Modifier.isStatic(field.modifiers) && + !field.synthetic && + !field.name.startsWith('__') && + field.name != 'session' && + field.name != 'timeout' && + field.name != 'commandTimeout' + } + boolean result = validFields.size() > 0 + if (!result) { + logger.warn("[GoSDK] ${apiMsgClazz.simpleName} has NO valid parameter fields") + } + return result + } catch (Exception e) { + logger.warn("[GoSDK] Error checking params for ${apiMsgClazz.simpleName}: ${e.message}") + return true // Default to true if can't determine + } + } + private Class findInventoryClass() { inventoryFieldName = null if (responseClass == null) return null @@ -397,41 +426,32 @@ class GoApiTemplate implements SdkTemplate { } } else { if (!skipMain) { - switch (actionType) { - case "Create": - case "Add": - // POST does not need unwrapping; return the Inventory View - builder.append(generateCreateMethod(apiPath, viewStructName, false, responseStructName, goInventoryFieldName)) - break - case "Get": - // GET may require unwrapping - builder.append(generateGetMethod(apiPath, viewStructName, unwrapForGet, responseStructName, goInventoryFieldName)) - break - case "Update": - case "Change": - // PUT does not need unwrapping; return the Inventory View - builder.append(generateUpdateMethod(apiPath, viewStructName, false, responseStructName, goInventoryFieldName)) - break - case "Expunge": - // Expunge uses PUT but only returns error + // CRITICAL: Prioritize @RestRequest.method over actionType derived from class name + // This fixes issues like APIGetVersionMsg (actionType="Get") with method=PUT + + // First check HTTP method from annotation, then fall back to actionType-based logic + if (httpMethod == "POST") { + // POST operations (Create/Add) + builder.append(generateCreateMethod(apiPath, viewStructName, false, responseStructName, goInventoryFieldName)) + } else if (httpMethod == "GET") { + // GET operations (Get/Query) + builder.append(generateGetMethod(apiPath, viewStructName, unwrapForGet, responseStructName, goInventoryFieldName)) + } else if (httpMethod == "PUT") { + // PUT operations (Update/Change/Action) + // Special case: Expunge actions return void + if (actionType == "Expunge") { builder.append(generateExpungeMethod(apiPath)) - break - case "Delete": - case "Destroy": - case "Remove": - // Handle real DELETE methods; Expunge uses PUT and falls through to default - if (httpMethod == "DELETE") { - builder.append(generateDeleteMethod(apiPath)) - } else { - // Other HTTP methods (for example Expunge with PUT) use the generic path - boolean unwrapGeneric = (httpMethod == "GET") ? unwrapForGet : false - builder.append(generateGenericMethod(apiPath, httpMethod, viewStructName, unwrapGeneric, responseStructName, goInventoryFieldName)) - } - break - default: - // Generic handling; unwrap is decided by the HTTP method - boolean unwrapGeneric = (httpMethod == "GET") ? unwrapForGet : false - builder.append(generateGenericMethod(apiPath, httpMethod, viewStructName, unwrapGeneric, responseStructName, goInventoryFieldName)) + } else { + builder.append(generateUpdateMethod(apiPath, viewStructName, false, responseStructName, goInventoryFieldName)) + } + } else if (httpMethod == "DELETE") { + // DELETE operations + builder.append(generateDeleteMethod(apiPath)) + } else { + // Fallback for unknown HTTP methods (should rarely happen) + logger.warn("[GoSDK] Unknown HTTP method ${httpMethod} for ${clzName}, using generic method") + boolean unwrapGeneric = (httpMethod == "GET") ? unwrapForGet : false + builder.append(generateGenericMethod(apiPath, httpMethod, viewStructName, unwrapGeneric, responseStructName, goInventoryFieldName)) } } @@ -484,6 +504,32 @@ class GoApiTemplate implements SdkTemplate { } private String generateCreateMethod(String apiPath, String viewStructName, boolean unwrap, String responseStructName, String fieldName) { + boolean hasParams = hasApiParams() + + if (!hasParams) { + // No params: don't require user to pass params, use empty map internally + if (unwrap) { + return """func (cli *ZSClient) ${clzName}() (*view.${viewStructName}, error) { +\tvar resp view.${responseStructName} +\tif err := cli.Post("${apiPath}", map[string]interface{}{}, &resp); err != nil { +\t\treturn nil, err +\t} +\treturn &resp.${fieldName}, nil +} +""" + } else { + return """func (cli *ZSClient) ${clzName}() (*view.${viewStructName}, error) { +\tresp := view.${viewStructName}{} +\tif err := cli.Post("${apiPath}", map[string]interface{}{}, &resp); err != nil { +\t\treturn nil, err +\t} +\treturn &resp, nil +} +""" + } + } + + // Has params: require user to pass params if (unwrap) { return """func (cli *ZSClient) ${clzName}(params param.${clzName}Param) (*view.${viewStructName}, error) { \tvar resp view.${responseStructName} @@ -589,15 +635,29 @@ func (cli *ZSClient) ${getMethodName}(uuid string) (*view.${viewStructName}, err if (unwrap) { if (!useSpec) { - // Single or no placeholder: use the standard Get method - return """func (cli *ZSClient) ${clzName}(uuid string) (*view.${viewStructName}, error) { + // Check if there are any placeholders + if (placeholders.size() == 0) { + // No placeholder: no uuid parameter needed + // Use GetWithRespKey to extract the inventory field + return """func (cli *ZSClient) ${clzName}() (*view.${viewStructName}, error) { \tvar resp view.${responseStructName} -\tif err := cli.Get("${cleanPath}", uuid, nil, &resp); err != nil { +\tif err := cli.GetWithRespKey("${cleanPath}", "", "inventory", nil, &resp); err != nil { +\t\treturn nil, err +\t} +\treturn &resp.${fieldName}, nil +} +""" + } else { + // Single placeholder: use GetWithRespKey with uuid to extract inventory + return """func (cli *ZSClient) ${clzName}(uuid string) (*view.${viewStructName}, error) { +\tvar resp view.${responseStructName} +\tif err := cli.GetWithRespKey("${cleanPath}", uuid, "inventory", nil, &resp); err != nil { \t\treturn nil, err \t} \treturn &resp.${fieldName}, nil } """ + } } else { // Multiple placeholders: use GetWithSpec // First placeholder is the resourceId; the rest form the spec @@ -618,15 +678,29 @@ func (cli *ZSClient) ${getMethodName}(uuid string) (*view.${viewStructName}, err } } else { if (!useSpec) { - // Single or no placeholder: use the standard Get method - return """func (cli *ZSClient) ${clzName}(uuid string) (*view.${viewStructName}, error) { + // Check if there are any placeholders + if (placeholders.size() == 0) { + // No placeholder: no uuid parameter needed + // Use GetWithRespKey with empty responseKey to parse whole response + return """func (cli *ZSClient) ${clzName}() (*view.${viewStructName}, error) { \tvar resp view.${viewStructName} -\tif err := cli.Get("${cleanPath}", uuid, nil, &resp); err != nil { +\tif err := cli.GetWithRespKey("${cleanPath}", "", "", nil, &resp); err != nil { +\t\treturn nil, err +\t} +\treturn &resp, nil +} +""" + } else { + // Single placeholder: use GetWithRespKey with uuid + return """func (cli *ZSClient) ${clzName}(uuid string) (*view.${viewStructName}, error) { +\tvar resp view.${viewStructName} +\tif err := cli.GetWithRespKey("${cleanPath}", uuid, "", nil, &resp); err != nil { \t\treturn nil, err \t} \treturn &resp, nil } """ + } } else { // Multiple placeholders: use GetWithSpec // First placeholder is the resourceId; the rest form the spec @@ -658,6 +732,9 @@ func (cli *ZSClient) ${getMethodName}(uuid string) (*view.${viewStructName}, err // Only use PutWithSpec when there are two or more placeholders boolean useSpec = placeholders.size() >= 2 + + // Check if API has parameters + boolean hasParams = hasApiParams() // Resolve the action key (map key for Action APIs) // Prefer @RestRequest.parameterName, otherwise derive from class name @@ -700,11 +777,34 @@ func (cli *ZSClient) ${getMethodName}(uuid string) (*view.${viewStructName}, err """ } } else { - // No placeholder: use the standard Put method (uuid required) - if (isActionApi) { - return """func (cli *ZSClient) ${clzName}(uuid string, params param.${clzName}Param) (*view.${viewStructName}, error) { + // No placeholder: use the standard Put method + if (!hasParams) { + // No params: don't require user input + if (isActionApi) { + return """func (cli *ZSClient) ${clzName}() (*view.${viewStructName}, error) { +\tvar resp view.${responseStructName} +\tif err := cli.Put("${cleanPath}", "", map[string]interface{}{ +\t\t"${actionKey}": map[string]interface{}{}, +\t}, &resp); err != nil { +\t\treturn nil, err +\t} +\treturn &resp.${fieldName}, nil +} +""" + } else { + return """func (cli *ZSClient) ${clzName}() (*view.${viewStructName}, error) { +\tvar resp view.${responseStructName} +\tif err := cli.Put("${cleanPath}", "", map[string]interface{}{}, &resp); err != nil { +\t\treturn nil, err +\t} +\treturn &resp.${fieldName}, nil +} +""" + } + } else if (isActionApi) { + return """func (cli *ZSClient) ${clzName}(params param.${clzName}Param) (*view.${viewStructName}, error) { \tvar resp view.${responseStructName} -\tif err := cli.Put("${cleanPath}", uuid, map[string]interface{}{ +\tif err := cli.Put("${cleanPath}", "", map[string]interface{}{ \t\t"${actionKey}": params.Params, \t}, &resp); err != nil { \t\treturn nil, err @@ -752,7 +852,7 @@ func (cli *ZSClient) ${getMethodName}(uuid string) (*view.${viewStructName}, err // Action APIs wrap params.Params inside a map return """func (cli *ZSClient) ${clzName}(${paramName} string, params param.${clzName}Param) (*view.${viewStructName}, error) { \tresp := view.${viewStructName}{} -\tif err := cli.Put("${cleanPath}", ${paramName}, map[string]interface{}{ +\tif err := cli.PutWithRespKey("${cleanPath}", ${paramName}, "", map[string]interface{}{ \t\t"${actionKey}": params.Params, \t}, &resp); err != nil { \t\treturn nil, err @@ -763,7 +863,7 @@ func (cli *ZSClient) ${getMethodName}(uuid string) (*view.${viewStructName}, err } else { return """func (cli *ZSClient) ${clzName}(${paramName} string, params param.${clzName}Param) (*view.${viewStructName}, error) { \tresp := view.${viewStructName}{} -\tif err := cli.Put("${cleanPath}", ${paramName}, params, &resp); err != nil { +\tif err := cli.PutWithRespKey("${cleanPath}", ${paramName}, "", params, &resp); err != nil { \t\treturn nil, err \t} \treturn &resp, nil @@ -771,11 +871,34 @@ func (cli *ZSClient) ${getMethodName}(uuid string) (*view.${viewStructName}, err """ } } else { - // No placeholder: use the standard Put method (uuid required) - if (isActionApi) { - return """func (cli *ZSClient) ${clzName}(uuid string, params param.${clzName}Param) (*view.${viewStructName}, error) { + // No placeholder: use the standard Put method + if (!hasParams) { + // No params: don't require user input + if (isActionApi) { + return """func (cli *ZSClient) ${clzName}() (*view.${viewStructName}, error) { +\tresp := view.${viewStructName}{} +\tif err := cli.PutWithRespKey("${cleanPath}", "", "", map[string]interface{}{ +\t\t"${actionKey}": map[string]interface{}{}, +\t}, &resp); err != nil { +\t\treturn nil, err +\t} +\treturn &resp, nil +} +""" + } else { + return """func (cli *ZSClient) ${clzName}() (*view.${viewStructName}, error) { +\tresp := view.${viewStructName}{} +\tif err := cli.PutWithRespKey("${cleanPath}", "", "", map[string]interface{}{}, &resp); err != nil { +\t\treturn nil, err +\t} +\treturn &resp, nil +} +""" + } + } else if (isActionApi) { + return """func (cli *ZSClient) ${clzName}(params param.${clzName}Param) (*view.${viewStructName}, error) { \tresp := view.${viewStructName}{} -\tif err := cli.Put("${cleanPath}", uuid, map[string]interface{}{ +\tif err := cli.PutWithRespKey("${cleanPath}", "", "", map[string]interface{}{ \t\t"${actionKey}": params.Params, \t}, &resp); err != nil { \t\treturn nil, err @@ -786,7 +909,7 @@ func (cli *ZSClient) ${getMethodName}(uuid string) (*view.${viewStructName}, err } else { return """func (cli *ZSClient) ${clzName}(uuid string, params param.${clzName}Param) (*view.${viewStructName}, error) { \tresp := view.${viewStructName}{} -\tif err := cli.Put("${cleanPath}", uuid, params, &resp); err != nil { +\tif err := cli.PutWithRespKey("${cleanPath}", uuid, "", params, &resp); err != nil { \t\treturn nil, err \t} \treturn &resp, nil @@ -948,26 +1071,70 @@ func (cli *ZSClient) ${getMethodName}(uuid string) (*view.${viewStructName}, err """ } case "PUT": + boolean hasParams = hasApiParams() if (!useSpec) { if (placeholders.size() == 1) { // Single placeholder pulled from the path parameter String paramName = toSafeGoParamName(placeholders[0]) - if (isActionApi) { + if (!hasParams) { + // No params case + if (isActionApi) { + String putMethod = unwrap ? "cli.Put" : "cli.PutWithRespKey" + String putArgs = unwrap ? + """("${cleanPath}", ${paramName}, map[string]interface{}{ +\t\t"${actionKey}": map[string]interface{}{}, +\t}, &resp)""" : + """("${cleanPath}", ${paramName}, "", map[string]interface{}{ +\t\t"${actionKey}": map[string]interface{}{}, +\t}, &resp)""" + return """func (cli *ZSClient) ${clzName}(${paramName} string) (*view.${viewStructName}, error) { +\t${respDecl} +\tif err := ${putMethod}${putArgs}; err != nil { +\t\treturn nil, err +\t} +\t${returnStmt} +} +""" + } else { + String putMethod = unwrap ? "cli.Put" : "cli.PutWithRespKey" + String putArgs = unwrap ? + """("${cleanPath}", ${paramName}, map[string]interface{}{}, &resp)""" : + """("${cleanPath}", ${paramName}, "", map[string]interface{}{}, &resp)""" + return """func (cli *ZSClient) ${clzName}(${paramName} string) (*view.${viewStructName}, error) { +\t${respDecl} +\tif err := ${putMethod}${putArgs}; err != nil { +\t\treturn nil, err +\t} +\t${returnStmt} +} +""" + } + } else if (isActionApi) { // Action APIs wrap params.Params inside a map + String putMethod = unwrap ? "cli.Put" : "cli.PutWithRespKey" + String putArgs = unwrap ? + """("${cleanPath}", ${paramName}, map[string]interface{}{ +\t\t"${actionKey}": params.Params, +\t}, &resp)""" : + """("${cleanPath}", ${paramName}, "", map[string]interface{}{ +\t\t"${actionKey}": params.Params, +\t}, &resp)""" return """func (cli *ZSClient) ${clzName}(${paramName} string, params param.${clzName}Param) (*view.${viewStructName}, error) { \t${respDecl} -\tif err := cli.Put("${cleanPath}", ${paramName}, map[string]interface{}{ -\t\t"${actionKey}": params.Params, -\t}, &resp); err != nil { +\tif err := ${putMethod}${putArgs}; err != nil { \t\treturn nil, err \t} \t${returnStmt} } """ } else { + String putMethod = unwrap ? "cli.Put" : "cli.PutWithRespKey" + String putArgs = unwrap ? + """("${cleanPath}", ${paramName}, params, &resp)""" : + """("${cleanPath}", ${paramName}, "", params, &resp)""" return """func (cli *ZSClient) ${clzName}(${paramName} string, params param.${clzName}Param) (*view.${viewStructName}, error) { \t${respDecl} -\tif err := cli.Put("${cleanPath}", ${paramName}, params, &resp); err != nil { +\tif err := ${putMethod}${putArgs}; err != nil { \t\treturn nil, err \t} \t${returnStmt} @@ -975,22 +1142,65 @@ func (cli *ZSClient) ${getMethodName}(uuid string) (*view.${viewStructName}, err """ } } else { - // No placeholder: use the standard Put method (uuid required) - if (isActionApi) { - return """func (cli *ZSClient) ${clzName}(uuid string, params param.${clzName}Param) (*view.${viewStructName}, error) { + // No placeholder: use the standard Put method + if (!hasParams) { + // No params: don't require user input + if (isActionApi) { + String putMethod = unwrap ? "cli.Put" : "cli.PutWithRespKey" + String putArgs = unwrap ? + """("${cleanPath}", "", map[string]interface{}{ +\t\t"${actionKey}": map[string]interface{}{}, +\t}, &resp)""" : + """("${cleanPath}", "", "", map[string]interface{}{ +\t\t"${actionKey}": map[string]interface{}{}, +\t}, &resp)""" + return """func (cli *ZSClient) ${clzName}() (*view.${viewStructName}, error) { \t${respDecl} -\tif err := cli.Put("${cleanPath}", uuid, map[string]interface{}{ +\tif err := ${putMethod}${putArgs}; err != nil { +\t\treturn nil, err +\t} +\t${returnStmt} +} +""" + } else { + String putMethod = unwrap ? "cli.Put" : "cli.PutWithRespKey" + String putArgs = unwrap ? + """("${cleanPath}", "", map[string]interface{}{}, &resp)""" : + """("${cleanPath}", "", "", map[string]interface{}{}, &resp)""" + return """func (cli *ZSClient) ${clzName}() (*view.${viewStructName}, error) { +\t${respDecl} +\tif err := ${putMethod}${putArgs}; err != nil { +\t\treturn nil, err +\t} +\t${returnStmt} +} +""" + } + } else if (isActionApi) { + String putMethod = unwrap ? "cli.Put" : "cli.PutWithRespKey" + String putArgs = unwrap ? + """("${cleanPath}", "", map[string]interface{}{ \t\t"${actionKey}": params.Params, -\t}, &resp); err != nil { +\t}, &resp)""" : + """("${cleanPath}", "", "", map[string]interface{}{ +\t\t"${actionKey}": params.Params, +\t}, &resp)""" + return """func (cli *ZSClient) ${clzName}(params param.${clzName}Param) (*view.${viewStructName}, error) { +\t${respDecl} +\tif err := ${putMethod}${putArgs}; err != nil { \t\treturn nil, err \t} \t${returnStmt} } """ } else { + String putMethod = unwrap ? "cli.Put" : "cli.PutWithRespKey" + String putArgs = unwrap ? + """("${cleanPath}", uuid, params, &resp)""" : + """("${cleanPath}", uuid, "", params, &resp)""" return """func (cli *ZSClient) ${clzName}(uuid string, params param.${clzName}Param) (*view.${viewStructName}, error) { \t${respDecl} -\tif err := cli.Put("${cleanPath}", uuid, params, &resp); err != nil { +\tif err := ${putMethod}${putArgs}; err != nil { \t\treturn nil, err \t} \t${returnStmt} From d4d192168977926b55f64ab13638232022ce5c74 Mon Sep 17 00:00:00 2001 From: "haidong.pang" Date: Tue, 13 Jan 2026 06:50:19 +0000 Subject: [PATCH 700/737] [zbs]: Try to reconnect after zbs ping failure Resolves: ZSTAC-79447 Change-Id: I757275676874656b727a6172646961687a726870 --- .../storage/zbs/ZbsStorageController.java | 93 +++++++++++++-- .../addon/zbs/ZbsPrimaryStorageCase.groovy | 108 ++++++++++++++++-- 2 files changed, 180 insertions(+), 21 deletions(-) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index b38b8cfc237..1fce90c06e7 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -541,6 +541,46 @@ public void handle(ErrorCode errCode, Map data) { }).start(); } + private void reconnectSingleMds(ZbsPrimaryStorageMdsBase mdsBase, Completion completion) { + mdsBase.connect(new Completion(completion) { + @Override + public void success() { + completion.success(); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + private void reconnectMdss(List mdsBases, Completion completion) { + new While<>(mdsBases).all((mdsBase, comp) -> { + reconnectSingleMds(mdsBase, new Completion(comp) { + @Override + public void success() { + comp.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + comp.addError(errorCode); + comp.done(); + } + }); + }).run(new WhileDoneCompletion(completion) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + completion.fail(errorCodeList.getCauses().get(0)); + return; + } + completion.success(); + } + }); + } + @Override public void ping(ReturnValueCompletion completion) { reloadDbInfo(); @@ -566,17 +606,46 @@ public void fail(ErrorCode errorCode) { })).run(new WhileDoneCompletion(completion) { @Override public void done(ErrorCodeList errorCodeList) { - boolean isConnected = addonInfo.getMdsInfos().stream().anyMatch(mdsInfo -> MdsStatus.Connected.equals(mdsInfo.getStatus())); - if (!isConnected) { - String notConnectedIps = addonInfo.getMdsInfos().stream() - .filter(mdsInfo -> !MdsStatus.Connected.equals(mdsInfo.getStatus())) - .map(MdsInfo::getAddr) - .collect(Collectors.joining(", ")); - - completion.success(new PingResult(addonInfo, String.format("all MDS are not connected, disconnected MDS addresses: %s", notConnectedIps))); + List disconnectedMds = mds.stream() + .filter(m -> MdsStatus.Disconnected.equals(m.getSelf().getStatus())) + .collect(Collectors.toList()); + + if (disconnectedMds.isEmpty()) { + completion.success(new PingResult(addonInfo)); + return; + } + + final boolean allDisconnected = disconnectedMds.size() == mds.size(); + String notConnectedIps = disconnectedMds.stream() + .map(ZbsPrimaryStorageMdsBase::getSelf) + .map(MdsInfo::getAddr) + .collect(Collectors.joining(", ")); + + // it should be covered in primary storage reconnect phase + if (allDisconnected) { + completion.success(new PingResult(addonInfo, String.format("All MDS are not connected, disconnected MDS addresses: %s", notConnectedIps))); return; } - completion.success(new PingResult(addonInfo)); + + // Try to reconnect disconnected MDS, the reconnection results are recorded in addonInfo + // and will not cause the ping operation to fail. + logger.warn(String.format("Some MDS are not connected for ZBS primary storage[uuid:%s], disconnected MDS addresses: %s, try to reconnect them", + self.getUuid(), notConnectedIps)); + + reconnectMdss(disconnectedMds, new Completion(completion) { + @Override + public void success() { + completion.success(new PingResult(addonInfo)); + } + + @Override + public void fail(ErrorCode errorCode) { + logger.warn(String.format("Some MDS are still not connected after reconnection for ZBS primary storage[uuid:%s], error: %s", + self.getUuid(), errorCode)); + completion.success(new PingResult(addonInfo)); + } + }); + } }); } @@ -1230,7 +1299,7 @@ private void reloadDbInfo() { addonInfo = StringUtils.isEmpty(self.getAddonInfo()) ? new AddonInfo() : JSONObjectUtil.toObject(self.getAddonInfo(), AddonInfo.class); config = StringUtils.isEmpty(self.getConfig()) ? new Config() : JSONObjectUtil.toObject(self.getConfig(), Config.class); physicalPoolByLogicalPool = addonInfo.getLogicalPoolInfos().stream() - .collect(Collectors.toMap(LogicalPoolInfo::getLogicalPoolName, LogicalPoolInfo::getPhysicalPoolName) ); + .collect(Collectors.toMap(LogicalPoolInfo::getLogicalPoolName, LogicalPoolInfo::getPhysicalPoolName)); } protected String getPhysicalPoolName(String logicalPoolName) { @@ -1310,7 +1379,7 @@ HttpCaller setTargetMds(String mdsAddr) { mdsInfos.removeIf(it -> !it.getAddr().equals(mdsAddr)); if (mdsInfos.isEmpty()) { throw new OperationFailureException(operr( - ORG_ZSTACK_STORAGE_ZBS_10027, "not found MDS[%s] of zbs primary storage[uuid:%s] node", mdsAddr, self.getUuid()) + ORG_ZSTACK_STORAGE_ZBS_10027, "not found MDS[%s] of zbs primary storage[uuid:%s] node", mdsAddr, self.getUuid()) ); } @@ -1333,7 +1402,7 @@ private List prepareMds() { mds.removeIf(it -> it.getStatus() != MdsStatus.Connected); if (mds.isEmpty()) { throw new OperationFailureException(operr( - ORG_ZSTACK_STORAGE_ZBS_10028, "all MDS of ZBS primary storage[uuid:%s] are not in Connected state", self.getUuid()) + ORG_ZSTACK_STORAGE_ZBS_10028, "all MDS of ZBS primary storage[uuid:%s] are not in Connected state", self.getUuid()) ); } diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index d085ecec661..a37b1bee941 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -3,6 +3,7 @@ package org.zstack.test.integration.storage.primary.addon.zbs import org.springframework.http.HttpEntity import org.zstack.core.cloudbus.EventCallback import org.zstack.core.cloudbus.EventFacade +import org.zstack.core.db.DatabaseFacade import org.zstack.core.db.Q import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageSpaceVO @@ -13,6 +14,7 @@ import org.zstack.header.storage.primary.PrimaryStorageCapacityVO_ import org.zstack.header.storage.primary.PrimaryStorageHostRefVO import org.zstack.header.storage.primary.PrimaryStorageHostRefVO_ import org.zstack.header.storage.primary.PrimaryStorageStatus +import org.zstack.storage.zbs.MdsStatus import org.zstack.storage.zbs.MdsUri import org.zstack.sdk.* import org.zstack.storage.addon.primary.ExternalPrimaryStorageSystemTags @@ -47,6 +49,7 @@ class ZbsPrimaryStorageCase extends SubCase { VolumeInventory vol, vol2 KVMHostInventory kvm EventFacade evtf + DatabaseFacade dbf @Override void clean() { @@ -165,7 +168,7 @@ class ZbsPrimaryStorageCase extends SubCase { diskOffering = env.inventoryByName("diskOffering") as DiskOfferingInventory kvm = env.inventoryByName("kvm-1") as KVMHostInventory evtf = bean(EventFacade.class) - + dbf = bean(DatabaseFacade.class) testSyncPrimaryStorageCapacityConcurrently() testDefaultConfig() testUpdateExternalPrimaryStorage() @@ -177,6 +180,7 @@ class ZbsPrimaryStorageCase extends SubCase { testNegativeScenario() testDataVolumeNegativeScenario() testDecodeMdsUriWithSpecialPassword() + testMdsReconnectAfterMaximumPingFailures() } } @@ -357,7 +361,7 @@ class ZbsPrimaryStorageCase extends SubCase { } AddonInfo addonInfo = JSONObjectUtil.toObject( - Q.New(ExternalPrimaryStorageVO.class) + Q.New(ExternalPrimaryStorageVO.class) .select(ExternalPrimaryStorageVO_.addonInfo) .eq(ExternalPrimaryStorageVO_.uuid, ps.uuid) .findValue().toString(), @@ -476,7 +480,19 @@ class ZbsPrimaryStorageCase extends SubCase { return rsp } - sleep(2000) + env.afterSimulator(ZbsPrimaryStorageMdsBase.SYNC_METADATA_PATH) { ZbsPrimaryStorageMdsBase.SyncMetadataRsp rsp, HttpEntity e -> + ZbsPrimaryStorageMdsBase.PingCmd cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) + if (cmd.getAddr().equals("127.0.1.1")) { + rsp.setSuccess(false) + rsp.setError("on purpose") + } + + return rsp + } + + retryInSecs { + assert count == 1 + } addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() @@ -488,11 +504,11 @@ class ZbsPrimaryStorageCase extends SubCase { "{\"physicalPoolID\":2,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":2,\"usedSize\":123456789,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":123456789,\"physicalPoolName\":\"pool2\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool2\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":987654321}]}" assert Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Connected - assert count == 1 assert data.uuid == ps.uuid env.afterSimulator(ZbsPrimaryStorageMdsBase.PING_PATH) { rsp, HttpEntity e -> def cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) + if (cmd.addr.equals("127.0.1.1")) { rsp.success = false rsp.error = "on purpose" @@ -504,10 +520,28 @@ class ZbsPrimaryStorageCase extends SubCase { rsp.error = "on purpose" } - return pingRsp + return rsp + } + + env.afterSimulator(ZbsPrimaryStorageMdsBase.SYNC_METADATA_PATH) { ZbsPrimaryStorageMdsBase.SyncMetadataRsp rsp, HttpEntity e -> + ZbsPrimaryStorageMdsBase.PingCmd cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) + if (cmd.getAddr().equals("127.0.1.1")) { + rsp.setSuccess(false) + rsp.setError("on purpose") + } else if (cmd.getAddr().equals("127.0.1.2")) { + rsp.setSuccess(false) + rsp.setError("on purpose") + } else if (cmd.getAddr().equals("127.0.1.3")) { + rsp.setSuccess(false) + rsp.setError("on purpose") + } + + return rsp } - sleep(2500) + retryInSecs { + assert count == 2 + } addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() @@ -518,13 +552,16 @@ class ZbsPrimaryStorageCase extends SubCase { "\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}," + "{\"physicalPoolID\":2,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":2,\"usedSize\":123456789,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":123456789,\"physicalPoolName\":\"pool2\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool2\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":987654321}]}" - assert Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Disconnected - assert count == 2 + retryInSecs { + assert Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Disconnected + } assert data.uuid == ps.uuid env.cleanAfterSimulatorHandlers() - sleep(2000) + retryInSecs { + assert count >= 3 + } Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Connected @@ -670,6 +707,59 @@ class ZbsPrimaryStorageCase extends SubCase { assert uri.password == specialPassword } + void testMdsReconnectAfterMaximumPingFailures() { + env.cleanSimulatorAndMessageHandlers() + Integer originalPingInterval = PrimaryStorageGlobalConfig.PING_INTERVAL.value().toInteger() + PrimaryStorageGlobalConfig.PING_INTERVAL.updateValue(1) + final String dbVersion = dbf.getDbVersion() + final Integer MAX_PING_CNT = ZbsConstants.PRIMARY_STORAGE_MDS_MAXIMUM_PING_FAILURE + AtomicInteger pingFailureCount = new AtomicInteger(0) + Boolean reconnectTriggered = false + + env.simulator(ZbsPrimaryStorageMdsBase.PING_PATH) { HttpEntity e, EnvSpec spec -> + ZbsPrimaryStorageMdsBase.PingCmd cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) + ZbsPrimaryStorageMdsBase.PingRsp rsp = new ZbsPrimaryStorageMdsBase.PingRsp() + if (cmd.getAddr().equals("127.0.1.1") && !reconnectTriggered) { + rsp.success = false + rsp.error = "Mds ping failed on purpose" + pingFailureCount.incrementAndGet() + return rsp + } + rsp.setAgentVersion(dbVersion) + return rsp + + } + + env.simulator(ZbsPrimaryStorageMdsBase.SYNC_METADATA_PATH) { HttpEntity e, EnvSpec spec -> + ZbsPrimaryStorageMdsBase.SyncMetadataCmd cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.SyncMetadataCmd.class) + ZbsPrimaryStorageMdsBase.SyncMetadataRsp rsp = new ZbsPrimaryStorageMdsBase.SyncMetadataRsp() + rsp.setExternalAddr(cmd.getAddr()) + if (cmd.getAddr().equals("127.0.1.1")) { + assert pingFailureCount.intValue().equals(MAX_PING_CNT) + reconnectTriggered = true + } + return rsp + } + + sleep((MAX_PING_CNT + 1) * 1000 + 500) + retryInSecs { + assert reconnectTriggered + } + retryInSecs { + AddonInfo addonInfo = JSONObjectUtil.toObject( + Q.New(ExternalPrimaryStorageVO.class) + .select(ExternalPrimaryStorageVO_.addonInfo) + .eq(ExternalPrimaryStorageVO_.uuid, ps.uuid) + .findValue() + .toString(), + AddonInfo.class + ) + assert MdsStatus.Connected.equals(addonInfo.getMdsInfos().find { it.addr.equals("127.0.1.1") }.getStatus()) + } + + PrimaryStorageGlobalConfig.PING_INTERVAL.updateValue(originalPingInterval) + env.cleanAfterSimulatorHandlers() + } void deleteVolume(String volUuid) { deleteDataVolume { From e6c2668ece714395750d8e69dfb6959faca24f36 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 21 Jan 2026 17:04:31 +0800 Subject: [PATCH 701/737] [sdk]: Update sdk Resolves: ZSTAC-81290 Change-Id: I76646361697572796a7674796964676569716d6e --- sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java index d8a6de859d9..3b27ed271d8 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java @@ -37,6 +37,9 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vendor; + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String parameters; From 7012f47374e0b04961d8b3a2dea94aca36222bae Mon Sep 17 00:00:00 2001 From: "xinhao.huang" Date: Thu, 22 Jan 2026 09:52:05 +0800 Subject: [PATCH 702/737] [utils]: forbidden start vm with vhost when aio.native is enabled Resolves: ZSTAC-67837 Change-Id: I7666646c647673776b67706e7161746b78706d6a --- .../zstack/utils/clouderrorcode/CloudOperationsErrorCode.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java index 7907558db2a..2963ed1a2d0 100644 --- a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java +++ b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java @@ -4344,6 +4344,8 @@ public class CloudOperationsErrorCode { public static final String ORG_ZSTACK_MEVOCO_10112 = "ORG_ZSTACK_MEVOCO_10112"; + public static final String ORG_ZSTACK_MEVOCO_10113 = "ORG_ZSTACK_MEVOCO_10113"; + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10000 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10000"; public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10001 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10001"; From 671696650ee5b92b69ed7411228164647e4843c1 Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Mon, 19 Jan 2026 18:30:57 +0800 Subject: [PATCH 703/737] [kvm]: delete CpuFeaturesHistoryVO when CPU feature MD5 changes When BIOS settings modify CPU features without changing cpuModelName, the CpuFeaturesHistoryVO records become stale and block valid migrations. Changes: - Add cpuFeatureMd5 field to HostFactResponse - Add CPU_FEATURE_MD5 SystemTag to store MD5 per host - Compare MD5 on host reconnect, delete related CpuFeaturesHistoryVO records (both src and dst) when MD5 changes Resolves: ZSTAC-76397 Change-Id: I6d626e6d67666d6f677a727471797a63776f7868 --- .../java/org/zstack/kvm/KVMAgentCommands.java | 10 ++++++++++ .../src/main/java/org/zstack/kvm/KVMHost.java | 19 +++++++++++++++++++ .../java/org/zstack/kvm/KVMSystemTags.java | 3 +++ 3 files changed, 32 insertions(+) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index 50fe295f2d4..a8a1378288b 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -521,6 +521,8 @@ public static class HostFactResponse extends AgentResponse { @GrayVersion(value = "5.0.0") private VirtualizerInfoTO virtualizerInfo; private String iscsiInitiatorName; + @GrayVersion("5.5.6") + private String cpuFeatureMd5; public String getOsDistribution() { return osDistribution; @@ -782,6 +784,14 @@ public String getDeployMode() { public void setDeployMode(String deployMode) { this.deployMode = deployMode; } + + public String getCpuFeatureMd5() { + return cpuFeatureMd5; + } + + public void setCpuFeatureMd5(String cpuFeatureMd5) { + this.cpuFeatureMd5 = cpuFeatureMd5; + } } public static class HostCapacityCmd extends AgentCommand { diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 558aded6380..6dbdfb15266 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -6206,10 +6206,29 @@ private void saveKvmHostRelatedFacts(HostFactResponse ret) { } deleteCpuHistoryVOIfCpuModeNameChange(ret.getCpuModelName()); + deleteCpuHistoryVOIfCpuFeatureMd5Change(ret.getCpuFeatureMd5()); } }; } + private void deleteCpuHistoryVOIfCpuFeatureMd5Change(String newMd5) { + if (newMd5 == null) { + return; + } + + String oldMd5 = KVMSystemTags.CPU_FEATURE_MD5.getTokenByResourceUuid(self.getUuid(), KVMSystemTags.CPU_FEATURE_MD5_TOKEN); + + if (oldMd5 == null || !oldMd5.equals(newMd5)) { + SQL.New(CpuFeaturesHistoryVO.class).eq(CpuFeaturesHistoryVO_.srcHostUuid, self.getUuid()).delete(); + SQL.New(CpuFeaturesHistoryVO.class).eq(CpuFeaturesHistoryVO_.dstHostUuid, self.getUuid()).delete(); + + logger.debug(String.format("host[uuid:%s] CPU feature %s, old MD5: %s, new MD5: %s, deleted related CpuFeaturesHistoryVO records", + self.getUuid(), oldMd5 == null ? "first recorded" : "changed", oldMd5, newMd5)); + } + + createTagWithoutNonValue(KVMSystemTags.CPU_FEATURE_MD5, KVMSystemTags.CPU_FEATURE_MD5_TOKEN, newMd5, true); + } + private void deleteCpuHistoryVOIfCpuModeNameChange(String cpuModelName){ // delete all records that do not match the cpuModelName of the source physical machine SQL.New(CpuFeaturesHistoryVO.class) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMSystemTags.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMSystemTags.java index d1dc3a495e8..e5c14fb9d57 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMSystemTags.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMSystemTags.java @@ -35,6 +35,9 @@ public class KVMSystemTags { public static final String CPU_MODEL_NAME_TOKEN = "name"; public static PatternedSystemTag CPU_MODEL_NAME = new PatternedSystemTag(String.format("cpuModelName::{%s}", CPU_MODEL_NAME_TOKEN), HostVO.class); + public static final String CPU_FEATURE_MD5_TOKEN = "cpuFeatureMd5"; + public static PatternedSystemTag CPU_FEATURE_MD5 = new PatternedSystemTag(String.format("cpuFeatureMd5::{%s}", CPU_FEATURE_MD5_TOKEN), HostVO.class); + public static final String CHECK_CLUSTER_CPU_MODEL_TOKEN = "enable"; public static PatternedSystemTag CHECK_CLUSTER_CPU_MODEL = new PatternedSystemTag(String.format("check::cluster::cpu::model::{%s}", CHECK_CLUSTER_CPU_MODEL_TOKEN), ClusterVO.class); From 571dfb1fa3953c53e89e3142b966d621753cf007 Mon Sep 17 00:00:00 2001 From: shenjin Date: Wed, 21 Jan 2026 15:32:29 +0800 Subject: [PATCH 704/737] [ceph]: support thirdparty_ceph to bm root volume support thirdparty_ceph to bm root volume Resolves: ZSTAC-73396 Change-Id: I6f6f616777677a6f74696c6c736c737a626f7863 (cherry picked from commit 827e880804d9a68e5212abaa5b562793995d032f) --- conf/db/upgrade/V5.5.6__schema.sql | 76 +++++++++++++++++++ .../ceph/primary/CephPrimaryStorageBase.java | 22 ++++++ .../sdk/BareMetal2ChassisNicInventory.java | 8 ++ .../sdk/BareMetal2InstanceInventory.java | 12 +-- ...reMetal2InstanceProvisionNicInventory.java | 16 ++++ .../CloudOperationsErrorCode.java | 12 +++ 6 files changed, 140 insertions(+), 6 deletions(-) diff --git a/conf/db/upgrade/V5.5.6__schema.sql b/conf/db/upgrade/V5.5.6__schema.sql index 4b92ec28fb8..ed57233ff40 100644 --- a/conf/db/upgrade/V5.5.6__schema.sql +++ b/conf/db/upgrade/V5.5.6__schema.sql @@ -14,3 +14,79 @@ CALL CREATE_INDEX('ModelVO', 'idx_modelId', 'modelId'); -- Upgrade existing data: set modelId to uuid if modelId is NULL -- This UPDATE is idempotent: WHERE clause ensures only NULL values are updated UPDATE ModelVO SET modelId = uuid WHERE modelId IS NULL; + + +DELIMITER $$ + +CREATE PROCEDURE UpdateBareMetal2InstanceProvisionNicVO() +BEGIN + DECLARE instanceUuid_exists INT; + DECLARE isPrimaryProvisionNic_exists_in_ProvisionNicVO INT; + DECLARE isPrimaryProvisionNic_exists_in_ChassisNicVO INT; + + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'An error occurred during the update process.'; + END; + + START TRANSACTION; + + SELECT COUNT(*) + INTO instanceUuid_exists + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = 'zstack' + AND TABLE_NAME = 'BareMetal2InstanceProvisionNicVO' + AND COLUMN_NAME = 'instanceUuid'; + + IF instanceUuid_exists = 0 THEN + CALL ADD_COLUMN('BareMetal2InstanceProvisionNicVO', 'instanceUuid', 'VARCHAR(32)', FALSE, ''); + + UPDATE `zstack`.`BareMetal2InstanceProvisionNicVO` + SET `instanceUuid` = `uuid`; + + ALTER TABLE `zstack`.`BareMetal2InstanceProvisionNicVO` + DROP FOREIGN KEY `fkBareMetal2InstanceProvisionNicVOInstanceVO`; + + CALL ADD_CONSTRAINT('BareMetal2InstanceProvisionNicVO', 'fkBareMetal2InstanceProvisionNicVOInstanceVO', + 'instanceUuid', 'BareMetal2InstanceVO', 'uuid', 'CASCADE'); + + UPDATE `zstack`.`BareMetal2InstanceProvisionNicVO` + SET `uuid` = REPLACE(UUID(), '-', ''); + END IF; + + SELECT COUNT(*) + INTO isPrimaryProvisionNic_exists_in_ProvisionNicVO + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = 'zstack' + AND TABLE_NAME = 'BareMetal2InstanceProvisionNicVO' + AND COLUMN_NAME = 'isPrimaryProvisionNic'; + + IF isPrimaryProvisionNic_exists_in_ProvisionNicVO = 0 THEN + CALL ADD_COLUMN('BareMetal2InstanceProvisionNicVO', 'isPrimaryProvisionNic', 'BOOLEAN', FALSE, FALSE); + + UPDATE `zstack`.`BareMetal2InstanceProvisionNicVO` + SET `isPrimaryProvisionNic` = TRUE; + END IF; + + SELECT COUNT(*) + INTO isPrimaryProvisionNic_exists_in_ChassisNicVO + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = 'zstack' + AND TABLE_NAME = 'BareMetal2ChassisNicVO' + AND COLUMN_NAME = 'isPrimaryProvisionNic'; + + IF isPrimaryProvisionNic_exists_in_ChassisNicVO = 0 THEN + CALL ADD_COLUMN('BareMetal2ChassisNicVO', 'isPrimaryProvisionNic', 'BOOLEAN', FALSE, FALSE); + + UPDATE `zstack`.`BareMetal2ChassisNicVO` + SET `isPrimaryProvisionNic` = TRUE + WHERE `isProvisionNic` = TRUE; + END IF; + + COMMIT; +END$$ + +DELIMITER ; +CALL UpdateBareMetal2InstanceProvisionNicVO(); +DROP PROCEDURE IF EXISTS UpdateBareMetal2InstanceProvisionNicVO; diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java index d8349cd8f2a..38ddf77394b 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java @@ -54,8 +54,12 @@ import org.zstack.header.storage.primary.*; import org.zstack.header.storage.primary.VolumeSnapshotCapability.VolumeSnapshotArrangementType; import org.zstack.header.storage.snapshot.*; +import org.zstack.header.tag.SystemTagVO; +import org.zstack.header.tag.SystemTagVO_; import org.zstack.header.vm.VmInstanceSpec; import org.zstack.header.vm.VmInstanceSpec.ImageSpec; +import org.zstack.header.vm.VmInstanceVO; +import org.zstack.header.vm.VmInstanceVO_; import org.zstack.header.vo.ResourceVO; import org.zstack.header.volume.*; import org.zstack.identity.AccountManager; @@ -485,6 +489,8 @@ public static class CloneRsp extends AgentResponse { public Long size; public Long actualSize; public String installPath; + public String volumeId; + public String volumeStatus; public String getInstallPath() { return installPath; @@ -493,6 +499,22 @@ public String getInstallPath() { public void setInstallPath(String installPath) { this.installPath = installPath; } + + public String getVolumeId() { + return volumeId; + } + + public void setVolumeId(String volumeId) { + this.volumeId = volumeId; + } + + public String getVolumeStatus() { + return volumeStatus; + } + + public void setVolumeStatus(String volumeStatus) { + this.volumeStatus = volumeStatus; + } } public static class FlattenCmd extends AgentCommand implements HasThreadContext { diff --git a/sdk/src/main/java/org/zstack/sdk/BareMetal2ChassisNicInventory.java b/sdk/src/main/java/org/zstack/sdk/BareMetal2ChassisNicInventory.java index 4586cbaa65d..3325ebb5eb2 100644 --- a/sdk/src/main/java/org/zstack/sdk/BareMetal2ChassisNicInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/BareMetal2ChassisNicInventory.java @@ -52,6 +52,14 @@ public java.lang.Boolean getIsProvisionNic() { return this.isProvisionNic; } + public java.lang.Boolean isPrimaryProvisionNic; + public void setIsPrimaryProvisionNic(java.lang.Boolean isPrimaryProvisionNic) { + this.isPrimaryProvisionNic = isPrimaryProvisionNic; + } + public java.lang.Boolean getIsPrimaryProvisionNic() { + return this.isPrimaryProvisionNic; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; diff --git a/sdk/src/main/java/org/zstack/sdk/BareMetal2InstanceInventory.java b/sdk/src/main/java/org/zstack/sdk/BareMetal2InstanceInventory.java index d4c75d84a34..2ddc554a904 100644 --- a/sdk/src/main/java/org/zstack/sdk/BareMetal2InstanceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/BareMetal2InstanceInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk; -import org.zstack.sdk.BareMetal2InstanceProvisionNicInventory; + public class BareMetal2InstanceInventory extends org.zstack.sdk.VmInstanceInventory { @@ -84,12 +84,12 @@ public boolean getIsLatestAgent() { return this.isLatestAgent; } - public BareMetal2InstanceProvisionNicInventory provisionNic; - public void setProvisionNic(BareMetal2InstanceProvisionNicInventory provisionNic) { - this.provisionNic = provisionNic; + public java.util.List provisionNics; + public void setProvisionNics(java.util.List provisionNics) { + this.provisionNics = provisionNics; } - public BareMetal2InstanceProvisionNicInventory getProvisionNic() { - return this.provisionNic; + public java.util.List getProvisionNics() { + return this.provisionNics; } } diff --git a/sdk/src/main/java/org/zstack/sdk/BareMetal2InstanceProvisionNicInventory.java b/sdk/src/main/java/org/zstack/sdk/BareMetal2InstanceProvisionNicInventory.java index 50bbe756736..4f25c5ebb9e 100644 --- a/sdk/src/main/java/org/zstack/sdk/BareMetal2InstanceProvisionNicInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/BareMetal2InstanceProvisionNicInventory.java @@ -52,6 +52,22 @@ public java.lang.String getGateway() { return this.gateway; } + public java.lang.String instanceUuid; + public void setInstanceUuid(java.lang.String instanceUuid) { + this.instanceUuid = instanceUuid; + } + public java.lang.String getInstanceUuid() { + return this.instanceUuid; + } + + public java.lang.Boolean isPrimaryProvisionNic; + public void setIsPrimaryProvisionNic(java.lang.Boolean isPrimaryProvisionNic) { + this.isPrimaryProvisionNic = isPrimaryProvisionNic; + } + public java.lang.Boolean getIsPrimaryProvisionNic() { + return this.isPrimaryProvisionNic; + } + public java.lang.String metadata; public void setMetadata(java.lang.String metadata) { this.metadata = metadata; diff --git a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java index 7907558db2a..2343ef17c9c 100644 --- a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java +++ b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java @@ -700,6 +700,8 @@ public class CloudOperationsErrorCode { public static final String ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10002 = "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10002"; + public static final String ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10003 = "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10003"; + public static final String ORG_ZSTACK_ALIYUN_CORE_10000 = "ORG_ZSTACK_ALIYUN_CORE_10000"; public static final String ORG_ZSTACK_ALIYUN_CORE_10001 = "ORG_ZSTACK_ALIYUN_CORE_10001"; @@ -7678,6 +7680,10 @@ public class CloudOperationsErrorCode { public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10087 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10087"; + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10088 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10088"; + + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10089 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10089"; + public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10000 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10000"; public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10001 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10001"; @@ -12824,6 +12830,8 @@ public class CloudOperationsErrorCode { public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10052 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10052"; + public static final String ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10053 = "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10053"; + public static final String ORG_ZSTACK_EXTERNALSERVICE_CRONJOB_10000 = "ORG_ZSTACK_EXTERNALSERVICE_CRONJOB_10000"; public static final String ORG_ZSTACK_EXTERNALSERVICE_CRONJOB_10001 = "ORG_ZSTACK_EXTERNALSERVICE_CRONJOB_10001"; @@ -13706,6 +13714,10 @@ public class CloudOperationsErrorCode { public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10023 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10023"; + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10024 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10024"; + + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_10025 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_10025"; + public static final String ORG_ZSTACK_BAREMETAL2_CLUSTER_10000 = "ORG_ZSTACK_BAREMETAL2_CLUSTER_10000"; public static final String ORG_ZSTACK_BAREMETAL2_CLUSTER_10001 = "ORG_ZSTACK_BAREMETAL2_CLUSTER_10001"; From d1af3262845bee1caef9d99ef498bf58d61c4f00 Mon Sep 17 00:00:00 2001 From: shenjin Date: Mon, 26 Jan 2026 11:50:37 +0800 Subject: [PATCH 705/737] [ceph]: move volumeId/volumeStatus to XskyCloneRsp Extract Xsky-specific fields from generic CloneRsp to dedicated subclass. Resolves: ZSTAC-81282 Change-Id: I6c696b786873756b786c7a6d61777267797a7966 --- .../ceph/primary/CephPrimaryStorageBase.java | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java index 38ddf77394b..9e2280a3866 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java @@ -489,8 +489,6 @@ public static class CloneRsp extends AgentResponse { public Long size; public Long actualSize; public String installPath; - public String volumeId; - public String volumeStatus; public String getInstallPath() { return installPath; @@ -499,22 +497,6 @@ public String getInstallPath() { public void setInstallPath(String installPath) { this.installPath = installPath; } - - public String getVolumeId() { - return volumeId; - } - - public void setVolumeId(String volumeId) { - this.volumeId = volumeId; - } - - public String getVolumeStatus() { - return volumeStatus; - } - - public void setVolumeStatus(String volumeStatus) { - this.volumeStatus = volumeStatus; - } } public static class FlattenCmd extends AgentCommand implements HasThreadContext { From 40061da770a76bed0fce32c0ca67eebf33dd2155 Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Mon, 26 Jan 2026 11:50:42 +0800 Subject: [PATCH 706/737] [conf]: Host allocation restore the default Resolves: ZSTAC-81511 Change-Id: I67726c7064766679717570786877746f76777865 --- conf/db/upgrade/V5.5.6__schema.sql | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/conf/db/upgrade/V5.5.6__schema.sql b/conf/db/upgrade/V5.5.6__schema.sql index ed57233ff40..501253435d2 100644 --- a/conf/db/upgrade/V5.5.6__schema.sql +++ b/conf/db/upgrade/V5.5.6__schema.sql @@ -90,3 +90,9 @@ END$$ DELIMITER ; CALL UpdateBareMetal2InstanceProvisionNicVO(); DROP PROCEDURE IF EXISTS UpdateBareMetal2InstanceProvisionNicVO; + +-- ZSTAC-81511 Host allocation restore the default +DELETE FROM `zstack`.`SystemTagVO` +WHERE `resourceType` = 'InstanceOfferingVO' + AND (tag LIKE 'minimumCPUUsageHostAllocatorStrategyMode::%' + OR tag LIKE 'minimumMemoryUsageHostAllocatorStrategyMode::%'); From 4d90c31665313b802975ccb128acb6570b59377a Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Sun, 22 Jun 2025 18:34:38 +0800 Subject: [PATCH 707/737] [conf]: support bm2 backup DBImpact Resolves: ZSTAC-74786 Change-Id: I62767375746a7077756562667a79656569666270 --- conf/db/upgrade/V4.8.0.9__schema.sql | 1 + .../java/org/zstack/sdk/CreateSchedulerJobAction.java | 2 +- .../org/zstack/sdk/CreateSchedulerJobGroupAction.java | 2 +- .../main/java/org/zstack/sdk/VolumeBackupInventory.java | 8 ++++++++ 4 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 conf/db/upgrade/V4.8.0.9__schema.sql diff --git a/conf/db/upgrade/V4.8.0.9__schema.sql b/conf/db/upgrade/V4.8.0.9__schema.sql new file mode 100644 index 00000000000..e88e304d016 --- /dev/null +++ b/conf/db/upgrade/V4.8.0.9__schema.sql @@ -0,0 +1 @@ +CALL ADD_COLUMN('VolumeBackupVO', 'hypervisorType', 'varchar(255)', 0, 'kvm'); \ No newline at end of file diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobAction.java index 136ce6f6c10..27ea1c5da07 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobAction.java @@ -34,7 +34,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String targetResourceUuid; - @Param(required = true, validValues = {"startVm","stopVm","rebootVm","volumeSnapshot","volumeSnapshotGroup","volumeBackup","rootVolumeBackup","vmBackup","databaseBackup","localRaidSelfTest","runAutoScalingGroup","cancelIAM2ProjectLoginExpired","takeIAM2ProjectLoginExpired"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"startVm","stopVm","rebootVm","volumeSnapshot","volumeSnapshotGroup","volumeBackup","rootVolumeBackup","vmBackup","databaseBackup","localRaidSelfTest","runAutoScalingGroup","cancelIAM2ProjectLoginExpired","takeIAM2ProjectLoginExpired","baremetal2instanceBackup"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobGroupAction.java index ca45d868565..5755cb71c33 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobGroupAction.java @@ -31,7 +31,7 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; - @Param(required = true, validValues = {"startVm","stopVm","rebootVm","volumeSnapshot","volumeSnapshotGroup","volumeBackup","rootVolumeBackup","vmBackup","databaseBackup","runAutoScalingGroup","cancelIAM2ProjectLoginExpired","takeIAM2ProjectLoginExpired"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"startVm","stopVm","rebootVm","volumeSnapshot","volumeSnapshotGroup","volumeBackup","rootVolumeBackup","vmBackup","databaseBackup","runAutoScalingGroup","cancelIAM2ProjectLoginExpired","takeIAM2ProjectLoginExpired","baremetal2instanceBackup"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/VolumeBackupInventory.java b/sdk/src/main/java/org/zstack/sdk/VolumeBackupInventory.java index 6969f53176b..6f78f89e30f 100644 --- a/sdk/src/main/java/org/zstack/sdk/VolumeBackupInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/VolumeBackupInventory.java @@ -68,6 +68,14 @@ public java.lang.Long getSize() { return this.size; } + public java.lang.String hypervisorType; + public void setHypervisorType(java.lang.String hypervisorType) { + this.hypervisorType = hypervisorType; + } + public java.lang.String getHypervisorType() { + return this.hypervisorType; + } + public java.lang.String metadata; public void setMetadata(java.lang.String metadata) { this.metadata = metadata; From a9d329a5d3ff33cd01554e2521504304d09c60ff Mon Sep 17 00:00:00 2001 From: "yaohua.wu" Date: Mon, 23 Jun 2025 11:54:27 +0800 Subject: [PATCH 708/737] [sdk]: support baremetal2 root volume backup Resolves: ZSTAC-74786 Change-Id: I6c7076686966707a666e756b7a6d696d69716974 --- conf/db/upgrade/V4.8.0.9__schema.sql | 1 - conf/db/upgrade/V5.5.6__schema.sql | 3 +++ sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobAction.java | 2 +- .../java/org/zstack/sdk/CreateSchedulerJobGroupAction.java | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 conf/db/upgrade/V4.8.0.9__schema.sql diff --git a/conf/db/upgrade/V4.8.0.9__schema.sql b/conf/db/upgrade/V4.8.0.9__schema.sql deleted file mode 100644 index e88e304d016..00000000000 --- a/conf/db/upgrade/V4.8.0.9__schema.sql +++ /dev/null @@ -1 +0,0 @@ -CALL ADD_COLUMN('VolumeBackupVO', 'hypervisorType', 'varchar(255)', 0, 'kvm'); \ No newline at end of file diff --git a/conf/db/upgrade/V5.5.6__schema.sql b/conf/db/upgrade/V5.5.6__schema.sql index ed57233ff40..6ae4864de64 100644 --- a/conf/db/upgrade/V5.5.6__schema.sql +++ b/conf/db/upgrade/V5.5.6__schema.sql @@ -7,6 +7,9 @@ ALTER TABLE `GuestVmScriptExecutedRecordDetailVO` CALL ADD_COLUMN('PciDeviceVO', 'vmPciDeviceAddress', 'varchar(32)', 1, NULL); CALL ADD_COLUMN('MdevDeviceVO', 'mdevDeviceAddress', 'varchar(32)', 1, NULL); +CALL ADD_COLUMN('VolumeBackupVO', 'hypervisorType', 'varchar(255)', 0, 'kvm'); +ALTER TABLE `zstack`.`VolumeBackupHistoryVO` modify column bitmap varchar(32) DEFAULT NULL; + -- Add index for modelId field to support duplicate checking -- Use CREATE_INDEX procedure (defined in beforeMigrate.sql) for idempotent operation CALL CREATE_INDEX('ModelVO', 'idx_modelId', 'modelId'); diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobAction.java index 27ea1c5da07..fc6298c7488 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobAction.java @@ -34,7 +34,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String targetResourceUuid; - @Param(required = true, validValues = {"startVm","stopVm","rebootVm","volumeSnapshot","volumeSnapshotGroup","volumeBackup","rootVolumeBackup","vmBackup","databaseBackup","localRaidSelfTest","runAutoScalingGroup","cancelIAM2ProjectLoginExpired","takeIAM2ProjectLoginExpired","baremetal2instanceBackup"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"startVm","stopVm","rebootVm","volumeSnapshot","volumeSnapshotGroup","volumeBackup","rootVolumeBackup","vmBackup","databaseBackup","localRaidSelfTest","runAutoScalingGroup","cancelIAM2ProjectLoginExpired","takeIAM2ProjectLoginExpired","baremetal2InstanceBackup","baremetal2RootVolumeBackup"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobGroupAction.java index 5755cb71c33..170ed08742e 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSchedulerJobGroupAction.java @@ -31,7 +31,7 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; - @Param(required = true, validValues = {"startVm","stopVm","rebootVm","volumeSnapshot","volumeSnapshotGroup","volumeBackup","rootVolumeBackup","vmBackup","databaseBackup","runAutoScalingGroup","cancelIAM2ProjectLoginExpired","takeIAM2ProjectLoginExpired","baremetal2instanceBackup"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"startVm","stopVm","rebootVm","volumeSnapshot","volumeSnapshotGroup","volumeBackup","rootVolumeBackup","vmBackup","databaseBackup","runAutoScalingGroup","cancelIAM2ProjectLoginExpired","takeIAM2ProjectLoginExpired","baremetal2InstanceBackup","baremetal2RootVolumeBackup"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) From 1b097f900cb27744008605c2f48792242471bfcc Mon Sep 17 00:00:00 2001 From: "yingzhe.hu" Date: Thu, 10 Jul 2025 14:55:11 +0800 Subject: [PATCH 709/737] [volume]: support bm2 backup recovery Resolves: ZSTAC-75753 Change-Id: I6f7678736a76657576726e766f7473616a6e7176 --- .../org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java index 38ddf77394b..3ecc7a260ef 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java @@ -6185,7 +6185,7 @@ private static String getVolumePathFromSnapshot(String snapshotPath) { return snapshotPath.split("@")[0]; } - protected String getTargetPoolNameFromAllocatedUrl(String allocatedUrl) { + public String getTargetPoolNameFromAllocatedUrl(String allocatedUrl) { if (allocatedUrl == null) { throw new OperationFailureException(operr(ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10032, "allocated url not found")); } From 788891ec15bb27c4688f85b9b71521c819b90cbe Mon Sep 17 00:00:00 2001 From: "yingzhe.hu" Date: Mon, 28 Jul 2025 17:07:39 +0800 Subject: [PATCH 710/737] [volumebackup]: add baremetal2 backup sdk Resolves: ZSTAC-75753 Change-Id: I7778676171646874706164777869707279777654 --- .../zstack/header/image/ImageConstant.java | 1 + .../primary/CephPrimaryStorageFactory.java | 2 +- ...eBareMetal2InstanceFromVmBackupAction.java | 149 ++++++++++++++++++ ...eBareMetal2InstanceFromVmBackupResult.java | 14 ++ ...eMetal2InstanceFromVolumeBackupAction.java | 140 ++++++++++++++++ ...eMetal2InstanceFromVolumeBackupResult.java | 14 ++ ...antiateVolumeForNewCreatedVmExtension.java | 4 +- .../java/org/zstack/testlib/ApiHelper.groovy | 56 ++++++- .../CloudOperationsErrorCode.java | 2 + 9 files changed, 379 insertions(+), 3 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateBareMetal2InstanceFromVmBackupAction.java create mode 100644 sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateBareMetal2InstanceFromVmBackupResult.java create mode 100644 sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateBareMetal2InstanceFromVolumeBackupAction.java create mode 100644 sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateBareMetal2InstanceFromVolumeBackupResult.java diff --git a/header/src/main/java/org/zstack/header/image/ImageConstant.java b/header/src/main/java/org/zstack/header/image/ImageConstant.java index 62640d2d4b9..50accdde7bd 100755 --- a/header/src/main/java/org/zstack/header/image/ImageConstant.java +++ b/header/src/main/java/org/zstack/header/image/ImageConstant.java @@ -7,6 +7,7 @@ public interface ImageConstant { enum ImageMediaType { RootVolumeTemplate, DataVolumeTemplate, + VolumeRecoveringTemplate, ISO, } diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java index e9602e0159b..682fc9dadf2 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java @@ -1158,7 +1158,7 @@ public void checkVmCapability(VmInstanceInventory inv, VmCapabilities capabiliti @Override public void preBeforeInstantiateVmResource(VmInstanceSpec spec) throws VmInstantiateResourceException { - // do nothing + } @Override diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateBareMetal2InstanceFromVmBackupAction.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateBareMetal2InstanceFromVmBackupAction.java new file mode 100644 index 00000000000..4f6e3855dc3 --- /dev/null +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateBareMetal2InstanceFromVmBackupAction.java @@ -0,0 +1,149 @@ +package org.zstack.heder.storage.volume.backup; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateBareMetal2InstanceFromVmBackupAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.heder.storage.volume.backup.CreateBareMetal2InstanceFromVmBackupResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = false, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clusterUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String gatewayUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String groupUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String chassisUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String chassisOfferingUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String chassisDiskUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String primaryStorageUuidForRootVolume; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String primaryStorageUuidForDataVolume; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List dataDiskOfferingUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List rootVolumeSystemTags; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List dataVolumeSystemTags; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String gatewayAllocatorStrategy; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.heder.storage.volume.backup.CreateBareMetal2InstanceFromVmBackupResult value = res.getResult(org.zstack.heder.storage.volume.backup.CreateBareMetal2InstanceFromVmBackupResult.class); + ret.value = value == null ? new org.zstack.heder.storage.volume.backup.CreateBareMetal2InstanceFromVmBackupResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/baremetal2-instance/from/vm-backup/{groupUuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateBareMetal2InstanceFromVmBackupResult.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateBareMetal2InstanceFromVmBackupResult.java new file mode 100644 index 00000000000..3cee35d08dc --- /dev/null +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateBareMetal2InstanceFromVmBackupResult.java @@ -0,0 +1,14 @@ +package org.zstack.heder.storage.volume.backup; + +import org.zstack.sdk.BareMetal2InstanceInventory; + +public class CreateBareMetal2InstanceFromVmBackupResult { + public BareMetal2InstanceInventory inventory; + public void setInventory(BareMetal2InstanceInventory inventory) { + this.inventory = inventory; + } + public BareMetal2InstanceInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateBareMetal2InstanceFromVolumeBackupAction.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateBareMetal2InstanceFromVolumeBackupAction.java new file mode 100644 index 00000000000..36ed0cfa858 --- /dev/null +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateBareMetal2InstanceFromVolumeBackupAction.java @@ -0,0 +1,140 @@ +package org.zstack.heder.storage.volume.backup; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateBareMetal2InstanceFromVolumeBackupAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.heder.storage.volume.backup.CreateBareMetal2InstanceFromVolumeBackupResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = false, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clusterUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String gatewayUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String backupUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String chassisUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String chassisOfferingUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String chassisDiskUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String primaryStorageUuidForRootVolume; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List rootVolumeSystemTags; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String gatewayAllocatorStrategy; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.heder.storage.volume.backup.CreateBareMetal2InstanceFromVolumeBackupResult value = res.getResult(org.zstack.heder.storage.volume.backup.CreateBareMetal2InstanceFromVolumeBackupResult.class); + ret.value = value == null ? new org.zstack.heder.storage.volume.backup.CreateBareMetal2InstanceFromVolumeBackupResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/baremetal2-instance/from/volume-backup/{backupUuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateBareMetal2InstanceFromVolumeBackupResult.java b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateBareMetal2InstanceFromVolumeBackupResult.java new file mode 100644 index 00000000000..6c22458bb3f --- /dev/null +++ b/sdk/src/main/java/org/zstack/heder/storage/volume/backup/CreateBareMetal2InstanceFromVolumeBackupResult.java @@ -0,0 +1,14 @@ +package org.zstack.heder.storage.volume.backup; + +import org.zstack.sdk.BareMetal2InstanceInventory; + +public class CreateBareMetal2InstanceFromVolumeBackupResult { + public BareMetal2InstanceInventory inventory; + public void setInventory(BareMetal2InstanceInventory inventory) { + this.inventory = inventory; + } + public BareMetal2InstanceInventory getInventory() { + return this.inventory; + } + +} diff --git a/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForNewCreatedVmExtension.java b/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForNewCreatedVmExtension.java index 6254e518957..3ce7545a793 100755 --- a/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForNewCreatedVmExtension.java +++ b/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForNewCreatedVmExtension.java @@ -213,9 +213,10 @@ public void preInstantiateVmResource(VmInstanceSpec spec, Completion completion) ImageSpec image = spec.getImageSpec(); boolean recovering = false; try { - recovering = image.getSelectedBackupStorage().getInstallPath().startsWith("nbd://"); + recovering = image.getSelectedBackupStorage().getInstallPath().startsWith("nbd://") || ImageMediaType.VolumeRecoveringTemplate.toString().equals(image.getInventory().getMediaType()); } catch (NullPointerException ignored) { } + if (recovering) { InstantiateVolumeMsg cmsg = fillMsg(new InstantiateRootVolumeForRecoveryMsg(), spec.getDestRootVolume(), spec); ((InstantiateRootVolumeForRecoveryMsg) cmsg).setSelectedBackupStorage(image.getSelectedBackupStorage()); @@ -269,6 +270,7 @@ private InstantiateVolumeMsg fillMsg(InstantiateVolumeMsg msg, VolumeInventory v msg.setPrimaryStorageAllocated(true); msg.setSkipIfExisting(spec.isInstantiateResourcesSkipExisting()); msg.setAllocatedInstallUrl(spec.getAllocatedUrlFromVolumeSpecs(volume.getUuid())); + msg.setSystemTags(spec.getRootVolumeSystemTags()); bus.makeTargetServiceIdByResourceUuid(msg, VolumeConstant.SERVICE_ID, volume.getUuid()); return msg; } diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index a77924c67b7..b2ae20453af 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -15,7 +15,61 @@ abstract class ApiHelper { } } - def createDataVolumeFromVolumeBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.heder.storage.volume.backup.CreateDataVolumeFromVolumeBackupAction.class) Closure c) { + def createBareMetal2InstanceFromVmBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.heder.storage.volume.backup.CreateBareMetal2InstanceFromVmBackupAction.class) Closure c) { + def a = new org.zstack.heder.storage.volume.backup.CreateBareMetal2InstanceFromVmBackupAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def createBareMetal2InstanceFromVolumeBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.heder.storage.volume.backup.CreateBareMetal2InstanceFromVolumeBackupAction.class) Closure c) { + def a = new org.zstack.heder.storage.volume.backup.CreateBareMetal2InstanceFromVolumeBackupAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def createDataVolumeFromVolumeBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.heder.storage.volume.backup.CreateDataVolumeFromVolumeBackupAction.class) Closure c) { def a = new org.zstack.heder.storage.volume.backup.CreateDataVolumeFromVolumeBackupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST diff --git a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java index 1913ee8a618..da056f552be 100644 --- a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java +++ b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java @@ -12358,6 +12358,8 @@ public class CloudOperationsErrorCode { public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10016 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10016"; + public static final String ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10017 = "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10017"; + public static final String ORG_ZSTACK_MONITORING_MEDIA_10000 = "ORG_ZSTACK_MONITORING_MEDIA_10000"; public static final String ORG_ZSTACK_MONITORING_MEDIA_10001 = "ORG_ZSTACK_MONITORING_MEDIA_10001"; From af47f1aacf95ebcbb1f453384186a7e1493dcf16 Mon Sep 17 00:00:00 2001 From: qiuyu <2094801894@qq.com> Date: Tue, 27 Jan 2026 11:26:18 +0800 Subject: [PATCH 711/737] [storage]: Atomic modification API for MDS nodes. When multiple APIs for modifying MDS nodes are initiated, the API semantics are Compare-And-Set, performing atomic operations. APIImpact Resolves: ZSTAC-79225 Change-Id: I716f6b6e6e676563746665766a6c707372726766 --- .../APIUpdateExternalPrimaryStorageMsg.java | 12 ++++ ...eExternalPrimaryStorageMsgDoc_zh_cn.groovy | 9 +++ .../UpdateExternalPrimaryStorageAction.java | 3 + .../addon/primary/ExternalPrimaryStorage.java | 23 +++++++ .../addon/zbs/ZbsPrimaryStorageCase.groovy | 69 +++++++++++++++++++ .../CloudOperationsErrorCode.java | 2 + 6 files changed, 118 insertions(+) diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/APIUpdateExternalPrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/addon/primary/APIUpdateExternalPrimaryStorageMsg.java index eba3533747d..84a202d3879 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/primary/APIUpdateExternalPrimaryStorageMsg.java +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/APIUpdateExternalPrimaryStorageMsg.java @@ -19,6 +19,9 @@ public class APIUpdateExternalPrimaryStorageMsg extends APIUpdatePrimaryStorageM @APIParam(required = false, maxLength = 255, validValues = {"Vhost", "Scsi", "Nvme", "CBD", "file"}) private String defaultProtocol; + @APIParam(required = false) + private String oldConfig; + public String getConfig() { return config; } @@ -35,6 +38,14 @@ public void setDefaultProtocol(String defaultProtocol) { this.defaultProtocol = defaultProtocol; } + public String getOldConfig() { + return oldConfig; + } + + public void setOldConfig(String oldConfig) { + this.oldConfig = oldConfig; + } + public static APIUpdateExternalPrimaryStorageMsg __example__() { APIUpdateExternalPrimaryStorageMsg msg = new APIUpdateExternalPrimaryStorageMsg(); msg.setUuid(uuid()); @@ -42,6 +53,7 @@ public static APIUpdateExternalPrimaryStorageMsg __example__() { msg.setDescription("New description"); msg.setDefaultProtocol("Vhost"); msg.setConfig("{\"pools\":[{\"name\":\"pool1\",\"aliasName\":\"pool-high\"}]}"); + msg.setOldConfig("{\"pools\":[{\"name\":\"pool2\",\"aliasName\":\"pool-high\"}]}"); return msg; } } diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/APIUpdateExternalPrimaryStorageMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/storage/addon/primary/APIUpdateExternalPrimaryStorageMsgDoc_zh_cn.groovy index faf8dbc3e31..28ae18839bb 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/primary/APIUpdateExternalPrimaryStorageMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/APIUpdateExternalPrimaryStorageMsgDoc_zh_cn.groovy @@ -94,6 +94,15 @@ doc { optional true since "5.0.0" } + column { + name "oldConfig" + enclosedIn "updateExternalPrimaryStorage" + desc "用于原子更新的预期旧值,为 null 则代表跳过预检.只有当服务器上的当前配置与此值完全相等时,更新才会生效;否则将拒绝请求以防止并发冲突." + location "body" + type "String" + optional true + since "5.5.0" + } } } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateExternalPrimaryStorageAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateExternalPrimaryStorageAction.java index 353dd69837b..2d18edfd578 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateExternalPrimaryStorageAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateExternalPrimaryStorageAction.java @@ -31,6 +31,9 @@ public Result throwExceptionIfError() { @Param(required = false, validValues = {"Vhost","Scsi","Nvme","CBD","file"}, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String defaultProtocol; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String oldConfig; + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index 689c2510d93..68e843c592b 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -1,5 +1,7 @@ package org.zstack.storage.addon.primary; +import com.google.common.collect.Interner; +import com.google.common.collect.Interners; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowire; @@ -71,6 +73,7 @@ public class ExternalPrimaryStorage extends PrimaryStorageBase { protected final PrimaryStorageNodeSvc node; protected final PrimaryStorageControllerSvc controller; + private static final Interner externalPsUpdateLock = Interners.newWeakInterner(); private ExternalPrimaryStorageVO externalVO; private LinkedHashMap selfConfig; @@ -172,6 +175,18 @@ protected void handleApiMessage(APIMessage msg) { } } + private boolean compareAndSetConfig(String expectedConfig, String config) { + synchronized (externalPsUpdateLock.intern(String.format("ExternalPrimaryStorage-update-%s", self.getUuid()))) { + String updateSql = "update ExternalPrimaryStorageVO set config = :config where uuid = :uuid and config = :expectedConfig"; + int updatedRows = SQL.New(updateSql) + .param("config", config) + .param("uuid", self.getUuid()) + .param("expectedConfig", expectedConfig) + .execute(); + return updatedRows > 0; + } + } + private void handle(APIUpdateExternalPrimaryStorageMsg msg) { APIUpdateExternalPrimaryStorageEvent evt = new APIUpdateExternalPrimaryStorageEvent(msg.getId()); if (msg.getName() != null) { @@ -193,6 +208,14 @@ private void handle(APIUpdateExternalPrimaryStorageMsg msg) { externalVO.setConfig(config); needReconnect = true; } + if (msg.getOldConfig() != null) { + boolean success = compareAndSetConfig(msg.getOldConfig(), externalVO.getConfig()); + if (!success) { + evt.setError(operr(ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10040,"Failed to update ExternalPrimaryStorage[uuid:%s], config has been modified by another operation", externalVO.getUuid())); + bus.publish(evt); + return; + } + } externalVO = dbf.updateAndRefresh(externalVO); if (needReconnect) { diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index d085ecec661..eb7e3ebf700 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -32,6 +32,7 @@ import org.zstack.testlib.SubCase import org.zstack.utils.data.SizeUnit import org.zstack.utils.gson.JSONObjectUtil +import java.util.concurrent.CyclicBarrier import java.util.concurrent.atomic.AtomicInteger /** @@ -294,6 +295,74 @@ class ZbsPrimaryStorageCase extends SubCase { assert Q.New(ExternalPrimaryStorageSpaceVO.class) .eq(ExternalPrimaryStorageSpaceVO_.primaryStorageUuid, ps.uuid) .count() == 1 + + String nowConfig = Q.New(ExternalPrimaryStorageVO.class) + .select(ExternalPrimaryStorageVO_.config) + .eq(ExternalPrimaryStorageVO_.uuid, ps.uuid) + .findValue() + updateExternalPrimaryStorage { + uuid = ps.uuid + config ="{\"mdsUrls\":[\"root:password@127.0.1.4\",\"root:password@127.0.1.2\",\"root:password@127.0.1.3\"],\"logicalPoolName\":\"lpool1\"}" + oldConfig = nowConfig + } + String newConfig= Q.New(ExternalPrimaryStorageVO.class) + .select(ExternalPrimaryStorageVO_.config) + .eq(ExternalPrimaryStorageVO_.uuid, ps.uuid) + .findValue() + assert newConfig.contains("127.0.1.4") + expect(AssertionError.class) { + updateExternalPrimaryStorage { + uuid = ps.uuid + config ="{\"mdsUrls\":[\"root:password@127.0.1.5\",\"root:password@127.0.1.2\",\"root:password@127.0.1.3\"],\"logicalPoolName\":\"lpool1\"}" + oldConfig = nowConfig + } + } + String newConfig2= Q.New(ExternalPrimaryStorageVO.class) + .select(ExternalPrimaryStorageVO_.config) + .eq(ExternalPrimaryStorageVO_.uuid, ps.uuid) + .findValue() + assert !newConfig2.contains("127.0.1.5") + assert newConfig2.contains("127.0.1.4") + def exceptionCount = new AtomicInteger(0) + def successCount = new AtomicInteger(0) + def barrier = new CyclicBarrier(2) + def thread1 = Thread.start{ + try { + barrier.await() + updateExternalPrimaryStorage { + uuid = ps.uuid + config ="{\"mdsUrls\":[\"root:password@127.0.1.6\",\"root:password@127.0.1.2\",\"root:password@127.0.1.3\"],\"logicalPoolName\":\"lpool1\"}" + oldConfig = newConfig2 + } + successCount.incrementAndGet() + } catch (Throwable e) { + exceptionCount.incrementAndGet() + } + } + def thread2 = Thread.start{ + try { + barrier.await() + updateExternalPrimaryStorage { + uuid = ps.uuid + config ="{\"mdsUrls\":[\"root:password@127.0.1.4\",\"root:password@127.0.1.7\",\"root:password@127.0.1.3\"],\"logicalPoolName\":\"lpool1\"}" + oldConfig = newConfig2 + } + successCount.incrementAndGet() + } catch (Throwable e) { + exceptionCount.incrementAndGet() + } + } + thread1.join() + thread2.join() + retryInSecs { + String newConfig3= Q.New(ExternalPrimaryStorageVO.class) + .select(ExternalPrimaryStorageVO_.config) + .eq(ExternalPrimaryStorageVO_.uuid, ps.uuid) + .findValue() + assert ([ "127.0.1.6", "127.0.1.7" ].count { newConfig3.contains(it) } == 1) + assert exceptionCount.get() == 1 + assert successCount.get() == 1 + } // update multi pools // Config.Pool updateExternalPrimaryStorage { diff --git a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java index 7907558db2a..425af356b72 100644 --- a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java +++ b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java @@ -6494,6 +6494,8 @@ public class CloudOperationsErrorCode { public static final String ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014 = "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014"; + public static final String ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10040 = "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10040"; + public static final String ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10000 = "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10000"; public static final String ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10001 = "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10001"; From 72c71cb53a8287e0d201eff539e334281810135f Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 27 Jan 2026 15:26:56 +0800 Subject: [PATCH 712/737] [conf]: Fix Pod's gpu stats view with correct memory size DBImpact Resolves: ZSTAC-81642 Change-Id: I6761716a637163736d7862786d6b7a7770667679 --- conf/db/upgrade/V5.5.6__schema.sql | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/conf/db/upgrade/V5.5.6__schema.sql b/conf/db/upgrade/V5.5.6__schema.sql index 501253435d2..2d722ec3d45 100644 --- a/conf/db/upgrade/V5.5.6__schema.sql +++ b/conf/db/upgrade/V5.5.6__schema.sql @@ -96,3 +96,15 @@ DELETE FROM `zstack`.`SystemTagVO` WHERE `resourceType` = 'InstanceOfferingVO' AND (tag LIKE 'minimumCPUUsageHostAllocatorStrategyMode::%' OR tag LIKE 'minimumMemoryUsageHostAllocatorStrategyMode::%'); + +-- Fix PodGpuStatsVO unit: GpuDeviceVO.memory stores bytes, convert to MB +CREATE OR REPLACE VIEW PodGpuStatsVO AS +SELECT + p.uuid AS podUuid, + COUNT(g.uuid) AS gpuCount, + COALESCE(CAST(ROUND(AVG(g.memory) / 1048576) AS SIGNED), 0) AS avgAllocatedMb, + COALESCE(CAST(ROUND(SUM(g.memory) / 1048576) AS SIGNED), 0) AS totalGpuMemMb +FROM PodVO p + LEFT JOIN PciDeviceVO pci ON pci.vmInstanceUuid = p.uuid + LEFT JOIN GpuDeviceVO g ON g.uuid = pci.uuid +GROUP BY p.uuid; From 7dac565059e9b5cd8ba3a532cfc1cdf8dc193458 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Sat, 24 Jan 2026 09:39:18 +0800 Subject: [PATCH 713/737] [longjob]: Introduce suspend long job message APIImpact Resolves: ZSTAC-81237 Change-Id: I6f7262716c7075637373646b726a796c73737563 Signed-off-by: AlanJager --- .gitconfig/hooks/commit-msg | 2 +- .gitconfig/hooks/prepare-commit-msg | 2 +- conf/serviceConfig/longjob.xml | 3 + .../longjob/APISuspendLongJobEvent.java | 34 ++++++ .../APISuspendLongJobEventDoc_zh_cn.groovy | 32 ++++++ .../header/longjob/APISuspendLongJobMsg.java | 38 +++++++ .../APISuspendLongJobMsgDoc_zh_cn.groovy | 58 ++++++++++ .../org/zstack/header/longjob/LongJob.java | 1 + .../org/zstack/longjob/LongJobFactory.java | 1 + .../zstack/longjob/LongJobFactoryImpl.java | 10 ++ .../zstack/longjob/LongJobManagerImpl.java | 76 +++++++++++++ .../java/org/zstack/longjob/LongJobUtils.java | 22 ++++ .../org/zstack/sdk/SuspendLongJobAction.java | 101 ++++++++++++++++++ .../org/zstack/sdk/SuspendLongJobResult.java | 14 +++ test/src/test/resources/zstack.properties | 1 + .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ .../CloudOperationsErrorCode.java | 8 ++ 17 files changed, 428 insertions(+), 2 deletions(-) create mode 100644 header/src/main/java/org/zstack/header/longjob/APISuspendLongJobEvent.java create mode 100644 header/src/main/java/org/zstack/header/longjob/APISuspendLongJobEventDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/longjob/APISuspendLongJobMsg.java create mode 100644 header/src/main/java/org/zstack/header/longjob/APISuspendLongJobMsgDoc_zh_cn.groovy create mode 100644 sdk/src/main/java/org/zstack/sdk/SuspendLongJobAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SuspendLongJobResult.java diff --git a/.gitconfig/hooks/commit-msg b/.gitconfig/hooks/commit-msg index 26e2a97ba80..2cf131bd448 100755 --- a/.gitconfig/hooks/commit-msg +++ b/.gitconfig/hooks/commit-msg @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # # NOTE(weiw): although we could use shell script, but python script may # be easier to port to Windows/MacOS/Linux diff --git a/.gitconfig/hooks/prepare-commit-msg b/.gitconfig/hooks/prepare-commit-msg index 28656de1be6..9d49e7ff602 100755 --- a/.gitconfig/hooks/prepare-commit-msg +++ b/.gitconfig/hooks/prepare-commit-msg @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # # An example hook script to prepare the commit log message. # Called by "git commit" with the name of the file that has the diff --git a/conf/serviceConfig/longjob.xml b/conf/serviceConfig/longjob.xml index c5546538205..f059ee67d11 100644 --- a/conf/serviceConfig/longjob.xml +++ b/conf/serviceConfig/longjob.xml @@ -25,6 +25,9 @@ org.zstack.header.longjob.APIResumeLongJobMsg + + org.zstack.header.longjob.APISuspendLongJobMsg + org.zstack.header.longjob.APICleanLongJobMsg diff --git a/header/src/main/java/org/zstack/header/longjob/APISuspendLongJobEvent.java b/header/src/main/java/org/zstack/header/longjob/APISuspendLongJobEvent.java new file mode 100644 index 00000000000..3fe347a8545 --- /dev/null +++ b/header/src/main/java/org/zstack/header/longjob/APISuspendLongJobEvent.java @@ -0,0 +1,34 @@ +package org.zstack.header.longjob; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +@RestResponse(allTo = "inventory") +public class APISuspendLongJobEvent extends APIEvent { + private LongJobInventory inventory; + + public LongJobInventory getInventory() { + return inventory; + } + + public void setInventory(LongJobInventory inventory) { + this.inventory = inventory; + } + + public APISuspendLongJobEvent() { + super(); + } + + public APISuspendLongJobEvent(String apiId) { + super(apiId); + } + + public static APISuspendLongJobEvent __example__() { + APISuspendLongJobEvent event = new APISuspendLongJobEvent(); + LongJobInventory inv = new LongJobInventory(); + inv.setUuid(uuid()); + inv.setState(LongJobState.Suspended); + event.setInventory(inv); + return event; + } +} diff --git a/header/src/main/java/org/zstack/header/longjob/APISuspendLongJobEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/longjob/APISuspendLongJobEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..320b286ad34 --- /dev/null +++ b/header/src/main/java/org/zstack/header/longjob/APISuspendLongJobEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.longjob + +import org.zstack.header.longjob.LongJobInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "在这里输入结构的名称" + + ref { + name "inventory" + path "org.zstack.header.longjob.APISuspendLongJobEvent.inventory" + desc "null" + type "LongJobInventory" + since "5.5.0" + clz LongJobInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.5.0" + } + ref { + name "error" + path "org.zstack.header.longjob.APISuspendLongJobEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.5.0" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/longjob/APISuspendLongJobMsg.java b/header/src/main/java/org/zstack/header/longjob/APISuspendLongJobMsg.java new file mode 100644 index 00000000000..c84ae0b659e --- /dev/null +++ b/header/src/main/java/org/zstack/header/longjob/APISuspendLongJobMsg.java @@ -0,0 +1,38 @@ +package org.zstack.header.longjob; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; + +@Action(category = LongJobConstants.ACTION_CATEGORY) +@RestRequest( + path = "/longjobs/{uuid}/actions", + isAction = true, + method = HttpMethod.PUT, + responseClass = APISuspendLongJobEvent.class +) +public class APISuspendLongJobMsg extends APIMessage implements LongJobMessage { + @APIParam(resourceType = LongJobVO.class, checkAccount = true) + private String uuid; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public static APISuspendLongJobMsg __example__() { + APISuspendLongJobMsg msg = new APISuspendLongJobMsg(); + msg.setUuid(uuid()); + return msg; + } + + @Override + public String getLongJobUuid() { + return uuid; + } +} diff --git a/header/src/main/java/org/zstack/header/longjob/APISuspendLongJobMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/longjob/APISuspendLongJobMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..acb75528476 --- /dev/null +++ b/header/src/main/java/org/zstack/header/longjob/APISuspendLongJobMsgDoc_zh_cn.groovy @@ -0,0 +1,58 @@ +package org.zstack.header.longjob + +import org.zstack.header.longjob.APISuspendLongJobEvent + +doc { + title "SuspendLongJob" + + category "longjob" + + desc """在这里填写API描述""" + + rest { + request { + url "PUT /v1/longjobs/{uuid}/actions" + + header (Authorization: 'OAuth the-session-uuid') + + clz APISuspendLongJobMsg.class + + desc """""" + + params { + + column { + name "uuid" + enclosedIn "suspendLongJob" + desc "资源的UUID,唯一标示该资源" + location "url" + type "String" + optional false + since "5.5.0" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.5.0" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.5.0" + } + } + } + + response { + clz APISuspendLongJobEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/longjob/LongJob.java b/header/src/main/java/org/zstack/header/longjob/LongJob.java index c83d03242cf..bde854845d7 100644 --- a/header/src/main/java/org/zstack/header/longjob/LongJob.java +++ b/header/src/main/java/org/zstack/header/longjob/LongJob.java @@ -10,6 +10,7 @@ public interface LongJob { void start(LongJobVO job, ReturnValueCompletion completion); default void cancel(LongJobVO job, ReturnValueCompletion completion) {} + default void suspend(LongJobVO job, ReturnValueCompletion completion) {} default void resume(LongJobVO job, ReturnValueCompletion completion) {} default void clean(LongJobVO job, NoErrorCompletion completion) {} default Class getAuditType() { diff --git a/longjob/src/main/java/org/zstack/longjob/LongJobFactory.java b/longjob/src/main/java/org/zstack/longjob/LongJobFactory.java index df808d6c4f5..5176db4a6e8 100644 --- a/longjob/src/main/java/org/zstack/longjob/LongJobFactory.java +++ b/longjob/src/main/java/org/zstack/longjob/LongJobFactory.java @@ -11,6 +11,7 @@ public interface LongJobFactory { LongJob getLongJob(String jobName); TreeMap getFullJobName(); boolean supportCancel(String jobName); + boolean supportSuspend(String jobName); boolean supportResume(String jobName); boolean supportClean(String jobName); } diff --git a/longjob/src/main/java/org/zstack/longjob/LongJobFactoryImpl.java b/longjob/src/main/java/org/zstack/longjob/LongJobFactoryImpl.java index 15dc68c76a3..bf73119e693 100755 --- a/longjob/src/main/java/org/zstack/longjob/LongJobFactoryImpl.java +++ b/longjob/src/main/java/org/zstack/longjob/LongJobFactoryImpl.java @@ -30,6 +30,7 @@ public class LongJobFactoryImpl implements LongJobFactory, Component { private TreeMap fullJobName = new TreeMap<>(); private Set notSupportCancelJobType = new HashSet<>(); + private Set notSupportSuspendJobType = new HashSet<>(); private Set notSupportResumeJobType = new HashSet<>(); private Set notSupportCleanJobType = new HashSet<>(); @@ -80,6 +81,11 @@ public boolean supportCancel(String jobName) { return !notSupportCancelJobType.contains(jobName); } + @Override + public boolean supportSuspend(String jobName) { + return !notSupportSuspendJobType.contains(jobName); + } + @Override public boolean supportResume(String jobName) { return !notSupportResumeJobType.contains(jobName); @@ -96,6 +102,10 @@ private void checkBehaviorSupported(String jobName, LongJob job) { notSupportCancelJobType.add(jobName); } + if (method.getName().equals("suspend") && method.isDefault()) { + notSupportSuspendJobType.add(jobName); + } + if (method.getName().equals("resume") && method.isDefault()) { notSupportResumeJobType.add(jobName); } diff --git a/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java b/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java index c74b43909c2..549d2c5d043 100755 --- a/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java +++ b/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java @@ -127,6 +127,8 @@ private void handleApiMessage(APIMessage msg) { handle((APIRerunLongJobMsg) msg); } else if (msg instanceof APIResumeLongJobMsg) { handle((APIResumeLongJobMsg) msg); + } else if (msg instanceof APISuspendLongJobMsg) { + handle((APISuspendLongJobMsg) msg); } else if (msg instanceof APICleanLongJobMsg) { handle((APICleanLongJobMsg) msg); } else { @@ -424,6 +426,80 @@ public String getName() { }); } + private void handle(APISuspendLongJobMsg msg) { + thdf.chainSubmit(new ChainTask(msg) { + @Override + public String getSyncSignature() { + return "longjob-" + msg.getUuid(); + } + + @Override + public void run(SyncTaskChain chain) { + final APISuspendLongJobEvent evt = new APISuspendLongJobEvent(msg.getId()); + suspendLongJob(msg.getUuid(), new ReturnValueCompletion(chain) { + @Override + public void success(LongJobVO vo) { + evt.setInventory(LongJobInventory.valueOf(vo)); + bus.publish(evt); + chain.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + evt.setError(errorCode); + bus.publish(evt); + chain.next(); + } + }); + } + + @Override + public String getName() { + return String.format("suspend-longjob-%s", msg.getUuid()); + } + }); + } + + private void suspendLongJob(String uuid, ReturnValueCompletion completion) { + Tuple t = Q.New(LongJobVO.class).eq(LongJobVO_.uuid, uuid).select(LongJobVO_.state, LongJobVO_.jobName).findTuple(); + LongJobState currentState = t.get(0, LongJobState.class); + String jobName = t.get(1, String.class); + + if (currentState == LongJobState.Suspended) { + LongJobVO vo = dbf.findByUuid(uuid, LongJobVO.class); + completion.success(vo); + return; + } + + if (currentState != LongJobState.Running) { + completion.fail(err(ORG_ZSTACK_LONGJOB_10002, LongJobErrors.NOT_SUPPORTED, "can only suspend running jobs, current state: %s", currentState)); + return; + } + + if (!longJobFactory.supportSuspend(jobName)) { + completion.fail(err(ORG_ZSTACK_LONGJOB_10002, LongJobErrors.NOT_SUPPORTED, "job type %s does not support suspend", jobName)); + return; + } + + LongJobVO vo = dbf.findByUuid(uuid, LongJobVO.class); + LongJob job = longJobFactory.getLongJob(vo.getJobName()); + + job.suspend(vo, new ReturnValueCompletion(completion) { + @Override + public void success(Boolean suspended) { + LongJobVO updatedVo = changeState(uuid, LongJobStateEvent.suspend); + logger.info(String.format("longjob [uuid:%s, name:%s] has been suspended", vo.getUuid(), vo.getName())); + completion.success(updatedVo); + } + + @Override + public void fail(ErrorCode errorCode) { + logger.error(String.format("failed to suspend longjob [uuid:%s, name:%s]: %s", vo.getUuid(), vo.getName(), errorCode)); + completion.fail(errorCode); + } + }); + } + private void handle(ResumeLongJobMsg msg) { thdf.chainSubmit(new ChainTask(msg) { @Override diff --git a/longjob/src/main/java/org/zstack/longjob/LongJobUtils.java b/longjob/src/main/java/org/zstack/longjob/LongJobUtils.java index 89691955a14..a9d66ef3dd2 100644 --- a/longjob/src/main/java/org/zstack/longjob/LongJobUtils.java +++ b/longjob/src/main/java/org/zstack/longjob/LongJobUtils.java @@ -162,11 +162,33 @@ static LongJobStateEvent getEventOnError(ErrorCode errorCode) { return LongJobStateEvent.suspend; } else if (errorCode.isError(LongJobErrors.CANCELED)) { return LongJobStateEvent.canceled; + } else if (isRecoverableError(errorCode)) { + return LongJobStateEvent.suspend; } else { return LongJobStateEvent.fail; } } + /** + * Check if an error is marked as recoverable in its opaque field. + * Any business module can mark an error as recoverable by setting + * "longJobRecoverable" to true in the error code's opaque field. + * This allows the long job framework to automatically suspend instead of fail + * for recoverable errors, enabling automatic retry after service restart. + * + * @param errorCode the error code to check + * @return true if the error is marked as recoverable, false otherwise + */ + private static boolean isRecoverableError(ErrorCode errorCode) { + // Check if error code has recoverable flag in opaque + // Any business module can set this flag to indicate the error is recoverable + Object recoverable = errorCode.getFromOpaque("longJobRecoverable"); + if (recoverable instanceof Boolean && (Boolean) recoverable) { + return true; + } + return false; + } + private static void setExecuteTimeIfNeed(LongJobVO job) { if (job.getExecuteTime() == null) { long time = (System.currentTimeMillis() - job.getCreateDate().getTime()) / 1000; diff --git a/sdk/src/main/java/org/zstack/sdk/SuspendLongJobAction.java b/sdk/src/main/java/org/zstack/sdk/SuspendLongJobAction.java new file mode 100644 index 00000000000..24d56735197 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SuspendLongJobAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class SuspendLongJobAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.SuspendLongJobResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.SuspendLongJobResult value = res.getResult(org.zstack.sdk.SuspendLongJobResult.class); + ret.value = value == null ? new org.zstack.sdk.SuspendLongJobResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/longjobs/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "suspendLongJob"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SuspendLongJobResult.java b/sdk/src/main/java/org/zstack/sdk/SuspendLongJobResult.java new file mode 100644 index 00000000000..0eeb24b9bd9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SuspendLongJobResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.LongJobInventory; + +public class SuspendLongJobResult { + public LongJobInventory inventory; + public void setInventory(LongJobInventory inventory) { + this.inventory = inventory; + } + public LongJobInventory getInventory() { + return this.inventory; + } + +} diff --git a/test/src/test/resources/zstack.properties b/test/src/test/resources/zstack.properties index b8ee3650b69..f7f4da51bf3 100755 --- a/test/src/test/resources/zstack.properties +++ b/test/src/test/resources/zstack.properties @@ -84,3 +84,4 @@ InfluxDB.metadata.version=v2 chain.task.qos=true identity.init.type= + diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index a77924c67b7..91ff3f209ba 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -40941,6 +40941,33 @@ abstract class ApiHelper { } + def suspendLongJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SuspendLongJobAction.class) Closure c) { + def a = new org.zstack.sdk.SuspendLongJobAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def syncAINginxConfiguration(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncAINginxConfigurationAction.class) Closure c) { def a = new org.zstack.sdk.SyncAINginxConfigurationAction() a.sessionId = Test.currentEnvSpec?.session?.uuid diff --git a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java index 1913ee8a618..2c4e3cd04b3 100644 --- a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java +++ b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java @@ -7506,6 +7506,8 @@ public class CloudOperationsErrorCode { public static final String ORG_ZSTACK_AI_MESSAGE_10002 = "ORG_ZSTACK_AI_MESSAGE_10002"; + public static final String ORG_ZSTACK_AI_MESSAGE_10003 = "ORG_ZSTACK_AI_MESSAGE_10003"; + public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10000 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10000"; public static final String ORG_ZSTACK_BAREMETAL2_INSTANCE_10001 = "ORG_ZSTACK_BAREMETAL2_INSTANCE_10001"; @@ -14786,6 +14788,12 @@ public class CloudOperationsErrorCode { public static final String ORG_ZSTACK_AI_10130 = "ORG_ZSTACK_AI_10130"; + public static final String ORG_ZSTACK_AI_10131 = "ORG_ZSTACK_AI_10131"; + + public static final String ORG_ZSTACK_AI_10132 = "ORG_ZSTACK_AI_10132"; + + public static final String ORG_ZSTACK_AI_10133 = "ORG_ZSTACK_AI_10133"; + public static final String ORG_ZSTACK_CORE_CLOUDBUS_10000 = "ORG_ZSTACK_CORE_CLOUDBUS_10000"; public static final String ORG_ZSTACK_CORE_CLOUDBUS_10001 = "ORG_ZSTACK_CORE_CLOUDBUS_10001"; From 13858f9edc42ee484d0791976adde66230a96f46 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 28 Jan 2026 12:00:10 +0800 Subject: [PATCH 714/737] [longjob]: Allow suspend running task and fix code smells Resolves: ZSTAC-81237 Change-Id: I7464707371617278756568716564756b7a7a6162 Signed-off-by: AlanJager --- .../org/zstack/header/longjob/LongJob.java | 24 +++++++++++++++ .../zstack/longjob/LongJobApiInterceptor.java | 27 +++++++++++++++++ .../java/org/zstack/longjob/LongJobUtils.java | 29 ++++++++++++++----- 3 files changed, 72 insertions(+), 8 deletions(-) diff --git a/header/src/main/java/org/zstack/header/longjob/LongJob.java b/header/src/main/java/org/zstack/header/longjob/LongJob.java index bde854845d7..730f21a763e 100644 --- a/header/src/main/java/org/zstack/header/longjob/LongJob.java +++ b/header/src/main/java/org/zstack/header/longjob/LongJob.java @@ -10,7 +10,31 @@ public interface LongJob { void start(LongJobVO job, ReturnValueCompletion completion); default void cancel(LongJobVO job, ReturnValueCompletion completion) {} + + /** + * Suspend a running long job. + *

+ * This method is called by the long job framework when a suspend request is received. + * The default implementation is a no-op (does nothing), which means jobs that don't + * override this method will not support suspend operation. + *

+ * Implementations should: + *

    + *
  • Perform the actual suspend logic (e.g., pause ongoing operations, save state)
  • + *
  • Call {@code completion.success(Boolean.TRUE)} if suspend succeeds
  • + *
  • Call {@code completion.fail(ErrorCode)} if suspend fails
  • + *
+ *

+ * Note: The framework will check if the job type supports suspend via + * {@link LongJobFactory#supportSuspend(String)} before calling this method. + * + * @param job the long job to suspend + * @param completion the completion callback. Must call {@code success(Boolean.TRUE)} + * on successful suspend, or {@code fail(ErrorCode)} on failure. + * The Boolean value indicates whether the job was successfully suspended. + */ default void suspend(LongJobVO job, ReturnValueCompletion completion) {} + default void resume(LongJobVO job, ReturnValueCompletion completion) {} default void clean(LongJobVO job, NoErrorCompletion completion) {} default Class getAuditType() { diff --git a/longjob/src/main/java/org/zstack/longjob/LongJobApiInterceptor.java b/longjob/src/main/java/org/zstack/longjob/LongJobApiInterceptor.java index 9f50d1bcb96..390ba623844 100755 --- a/longjob/src/main/java/org/zstack/longjob/LongJobApiInterceptor.java +++ b/longjob/src/main/java/org/zstack/longjob/LongJobApiInterceptor.java @@ -68,6 +68,8 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti validate((APIRerunLongJobMsg) msg); } else if (msg instanceof APIResumeLongJobMsg) { validate((APIResumeLongJobMsg) msg); + } else if (msg instanceof APISuspendLongJobMsg) { + validate((APISuspendLongJobMsg) msg); } return msg; @@ -211,6 +213,31 @@ private void validate(APIResumeLongJobMsg msg) { bus.makeServiceIdByManagementNodeId(msg, LongJobConstants.SERVICE_ID, mnId)); } + private void validate(APISuspendLongJobMsg msg) { + Tuple t = Q.New(LongJobVO.class) + .select(LongJobVO_.state, LongJobVO_.managementNodeUuid) + .eq(LongJobVO_.uuid, msg.getUuid()) + .findTuple(); + + LongJobState state = t.get(0, LongJobState.class); + + // If already suspended, allow operation (business layer will return success directly, idempotency) + if (state == LongJobState.Suspended) { + Optional.ofNullable(t.get(1, String.class)).ifPresent(mnId -> + bus.makeServiceIdByManagementNodeId(msg, LongJobConstants.SERVICE_ID, mnId)); + return; + } + + // Only running tasks can be suspended (Running state allows suspension) + if (state != LongJobState.Running) { + throw new ApiMessageInterceptionException(argerr(ORG_ZSTACK_LONGJOB_10002, "can only suspend running jobs, current state: %s", state)); + } + + // Running task allows suspension, set the correct serviceId routing + Optional.ofNullable(t.get(1, String.class)).ifPresent(mnId -> + bus.makeServiceIdByManagementNodeId(msg, LongJobConstants.SERVICE_ID, mnId)); + } + @Override public boolean start() { Class apiClass; diff --git a/longjob/src/main/java/org/zstack/longjob/LongJobUtils.java b/longjob/src/main/java/org/zstack/longjob/LongJobUtils.java index a9d66ef3dd2..2d6d2fabc8e 100644 --- a/longjob/src/main/java/org/zstack/longjob/LongJobUtils.java +++ b/longjob/src/main/java/org/zstack/longjob/LongJobUtils.java @@ -33,6 +33,20 @@ public class LongJobUtils { public static String succeeded = "Succeeded"; + /** + * Opaque key for marking an error as recoverable in long job framework. + * Business modules can set this flag to true in error code's opaque field + * to indicate that the error is recoverable and the long job should be suspended + * instead of failed, enabling automatic retry after service restart. + * + * Usage example: + *

+     * ErrorCode err = Platform.err(...);
+     * err.putToOpaque(LongJobUtils.OPAQUE_KEY_LONG_JOB_RECOVERABLE, true);
+     * 
+ */ + public static final String OPAQUE_KEY_LONG_JOB_RECOVERABLE = "longJobRecoverable"; + private static Interner jobUuids = Interners.newWeakInterner(); private static List completedStates = Arrays.asList(LongJobState.Failed, LongJobState.Succeeded, LongJobState.Canceled); @@ -172,21 +186,20 @@ static LongJobStateEvent getEventOnError(ErrorCode errorCode) { /** * Check if an error is marked as recoverable in its opaque field. * Any business module can mark an error as recoverable by setting - * "longJobRecoverable" to true in the error code's opaque field. + * {@link #OPAQUE_KEY_LONG_JOB_RECOVERABLE} to true in the error code's opaque field. * This allows the long job framework to automatically suspend instead of fail * for recoverable errors, enabling automatic retry after service restart. * - * @param errorCode the error code to check + * @param errorCode the error code to check, may be null * @return true if the error is marked as recoverable, false otherwise */ private static boolean isRecoverableError(ErrorCode errorCode) { - // Check if error code has recoverable flag in opaque - // Any business module can set this flag to indicate the error is recoverable - Object recoverable = errorCode.getFromOpaque("longJobRecoverable"); - if (recoverable instanceof Boolean && (Boolean) recoverable) { - return true; + if (errorCode == null) { + return false; } - return false; + + Object recoverable = errorCode.getFromOpaque(OPAQUE_KEY_LONG_JOB_RECOVERABLE); + return recoverable instanceof Boolean && (Boolean) recoverable; } private static void setExecuteTimeIfNeed(LongJobVO job) { From 1894a8709fb6ba5b2b5ce08f56a2b42ca5e36be5 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Sat, 24 Jan 2026 16:29:55 +0800 Subject: [PATCH 715/737] [telemetry]: add OpenTelemetry tracing and Prometheus metrics Implement full observability stack for ZStack with distributed tracing and metrics collection. Tracing: - TelemetryFacade with OpenTelemetry SDK integration - W3C Trace Context propagation via MessageTracingHelper - Environment-aware sampling (DEV/TEST 100%, STAGING 10%, PROD 1%) - Error retention via tail-based sampling - OTLP and Sentry exporters with plugin architecture - SERVER spans for API (RestServer) - CLIENT spans for agent HTTP (RESTFacadeImpl) - PRODUCER/CONSUMER spans for CloudBus messaging - INTERNAL spans for ChainTask, SyncTask, FlowChain, Flow Metrics: - Prometheus HTTP exporter on port 9464 - Thread pool metrics (active/size/queue_size/completed) - Task queue metrics (pending/running by signature) - Task timing histograms (wait_time, execution_time) Related: ZSTAC-67534 Change-Id: I4a783f8be7437fc0ca3749ed6ccb6cf0 Signed-off-by: AlanJager --- conf/springConfigXml/telemetry.xml | 18 + conf/zstack.xml | 1 + core/pom.xml | 38 + .../zstack/core/cloudbus/CloudBusImpl3.java | 126 +- .../org/zstack/core/rest/RESTFacadeImpl.java | 204 ++- .../telemetry/ErrorKeepingSpanProcessor.java | 120 ++ .../core/telemetry/MessageTracingHelper.java | 109 ++ .../core/telemetry/OtlpExporterProvider.java | 79 ++ .../telemetry/SentryExporterProvider.java | 72 + .../telemetry/TelemetryExporterProvider.java | 14 + .../core/telemetry/TelemetryFacade.java | 32 + .../core/telemetry/TelemetryFacadeImpl.java | 357 +++++ .../telemetry/TelemetryGlobalProperty.java | 170 +++ .../telemetry/TelemetryMetricsFacade.java | 23 + .../telemetry/TelemetryMetricsFacadeImpl.java | 355 +++++ .../zstack/core/telemetry/TracingAspect.java | 178 +++ .../zstack/core/telemetry/ZStackSampler.java | 127 ++ .../zstack/core/thread/DispatchQueueImpl.java | 367 +++++- .../zstack/core/thread/ThreadFacadeImpl.java | 273 ++++ .../zstack/core/workflow/SimpleFlowChain.java | 236 +++- docs/TELEMETRY_SPECIFICATION.md | 1167 +++++++++++++++++ .../java/org/zstack/header/Constants.java | 6 + .../java/org/zstack/header/core/Traced.java | 50 + pom.xml | 62 + .../main/java/org/zstack/rest/RestServer.java | 187 ++- 25 files changed, 4221 insertions(+), 150 deletions(-) create mode 100644 conf/springConfigXml/telemetry.xml create mode 100644 core/src/main/java/org/zstack/core/telemetry/ErrorKeepingSpanProcessor.java create mode 100644 core/src/main/java/org/zstack/core/telemetry/MessageTracingHelper.java create mode 100644 core/src/main/java/org/zstack/core/telemetry/OtlpExporterProvider.java create mode 100644 core/src/main/java/org/zstack/core/telemetry/SentryExporterProvider.java create mode 100644 core/src/main/java/org/zstack/core/telemetry/TelemetryExporterProvider.java create mode 100644 core/src/main/java/org/zstack/core/telemetry/TelemetryFacade.java create mode 100644 core/src/main/java/org/zstack/core/telemetry/TelemetryFacadeImpl.java create mode 100644 core/src/main/java/org/zstack/core/telemetry/TelemetryGlobalProperty.java create mode 100644 core/src/main/java/org/zstack/core/telemetry/TelemetryMetricsFacade.java create mode 100644 core/src/main/java/org/zstack/core/telemetry/TelemetryMetricsFacadeImpl.java create mode 100644 core/src/main/java/org/zstack/core/telemetry/TracingAspect.java create mode 100644 core/src/main/java/org/zstack/core/telemetry/ZStackSampler.java create mode 100644 docs/TELEMETRY_SPECIFICATION.md create mode 100644 header/src/main/java/org/zstack/header/core/Traced.java diff --git a/conf/springConfigXml/telemetry.xml b/conf/springConfigXml/telemetry.xml new file mode 100644 index 00000000000..3055826edde --- /dev/null +++ b/conf/springConfigXml/telemetry.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/conf/zstack.xml b/conf/zstack.xml index 5a5dbc3e248..c0a5da2a80f 100755 --- a/conf/zstack.xml +++ b/conf/zstack.xml @@ -121,4 +121,5 @@ + diff --git a/core/pom.xml b/core/pom.xml index 0b97fb621e3..6bd776ff676 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -142,6 +142,44 @@ sentry 8.29.0 + + + io.opentelemetry + opentelemetry-api + + + io.opentelemetry + opentelemetry-sdk + + + io.opentelemetry + opentelemetry-sdk-trace + + + io.opentelemetry + opentelemetry-exporter-otlp + + + io.opentelemetry + opentelemetry-context + + + io.opentelemetry.semconv + opentelemetry-semconv + + + io.opentelemetry + opentelemetry-sdk-metrics + + + io.opentelemetry + opentelemetry-exporter-prometheus + + + io.sentry + sentry-opentelemetry-core + true + diff --git a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java index f532ca2efa0..7653393b7ec 100755 --- a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java +++ b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java @@ -1,5 +1,10 @@ package org.zstack.core.cloudbus; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.Scope; import io.sentry.Sentry; import org.apache.logging.log4j.ThreadContext; import org.springframework.beans.factory.annotation.Autowired; @@ -18,6 +23,9 @@ import org.zstack.core.log.LogUtils; import org.zstack.core.retry.Retry; import org.zstack.core.retry.RetryCondition; +import org.zstack.core.telemetry.MessageTracingHelper; +import org.zstack.core.telemetry.TelemetryFacade; +import org.zstack.core.telemetry.TelemetryGlobalProperty; import org.zstack.core.thread.AsyncThread; import org.zstack.core.thread.ChainTask; import org.zstack.core.thread.SyncTask; @@ -103,6 +111,7 @@ public class CloudBusImpl3 implements CloudBus, CloudBusIN { private final String THREAD_CONTEXT_STACK = "thread-context-stack"; private final String THREAD_CONTEXT = "thread-context"; private final String TASK_CONTEXT = "task-context"; + private final String TRACE_CONTEXT = "__trace__"; final static String SERVICE_ID_SPLITTER = ":::"; private final String SERVICE_ID = makeLocalServiceId("cloudbus.messages"); @@ -133,6 +142,31 @@ public class CloudBusImpl3 implements CloudBus, CloudBusIN { public static final String HTTP_BASE_URL = "/cloudbus"; public static final FutureCompletion SEND_CONFIRMED = new FutureCompletion(null); + private TelemetryFacade telemetryFacade; + + private TelemetryFacade getTelemetryFacade() { + if (telemetryFacade == null && TelemetryGlobalProperty.ENABLED) { + try { + telemetryFacade = Platform.getComponentLoader().getComponent(TelemetryFacade.class); + } catch (Exception e) { + logger.trace("TelemetryFacade not available", e); + } + } + return telemetryFacade; + } + + private boolean isTelemetryEnabled() { + return TelemetryGlobalProperty.ENABLED && getTelemetryFacade() != null && getTelemetryFacade().isEnabled(); + } + + private Context extractTraceContextFromMessage(Message msg) { + Map traceCtx = msg.getHeaderEntry(TRACE_CONTEXT); + if (traceCtx == null || traceCtx.isEmpty()) { + return null; + } + return MessageTracingHelper.parseTraceContext(traceCtx); + } + { if (CloudBusGlobalProperty.MESSAGE_LOG != null) { String[] msgNames = CloudBusGlobalProperty.MESSAGE_LOG.split(","); @@ -790,6 +824,21 @@ private void setThreadLoggingContext(Message msg) { if (msg.getHeaders().containsKey(TASK_CONTEXT)) { TaskContext.setTaskContext(msg.getHeaderEntry(TASK_CONTEXT)); } + + if (TelemetryGlobalProperty.ENABLED && msg.getHeaders().containsKey(TRACE_CONTEXT)) { + @SuppressWarnings("unchecked") + Map traceCtx = msg.getHeaderEntry(TRACE_CONTEXT); + if (traceCtx != null && !traceCtx.isEmpty()) { + String traceparent = traceCtx.get(MessageTracingHelper.TRACEPARENT_KEY); + String tracestate = traceCtx.get(MessageTracingHelper.TRACESTATE_KEY); + if (traceparent != null) { + ThreadContext.put(Constants.THREAD_CONTEXT_TRACEPARENT, traceparent); + } + if (tracestate != null) { + ThreadContext.put(Constants.THREAD_CONTEXT_TRACESTATE, tracestate); + } + } + } } private boolean islogMessage(Message msg) { @@ -849,11 +898,40 @@ public String getName() { public Void call() { setThreadLoggingContext(msg); + Span consumerSpan = null; + Scope scope = null; + boolean success = true; + try { + if (isTelemetryEnabled()) { + Context parentContext = extractTraceContextFromMessage(msg); + consumerSpan = getTelemetryFacade().getTracer() + .spanBuilder("CloudBus Handle: " + msg.getClass().getSimpleName()) + .setSpanKind(SpanKind.CONSUMER) + .setParent(parentContext != null ? parentContext : Context.current()) + .setAttribute("messaging.system", "cloudbus") + .setAttribute("messaging.destination", serv.getId()) + .setAttribute("messaging.message_id", msg.getId()) + .setAttribute("messaging.message_class", msg.getClass().getName()) + .startSpan(); + scope = consumerSpan.makeCurrent(); + + Map newTraceCtx = MessageTracingHelper.extractTraceContext(); + if (newTraceCtx.containsKey(MessageTracingHelper.TRACEPARENT_KEY)) { + ThreadContext.put(Constants.THREAD_CONTEXT_TRACEPARENT, + newTraceCtx.get(MessageTracingHelper.TRACEPARENT_KEY)); + } + if (newTraceCtx.containsKey(MessageTracingHelper.TRACESTATE_KEY)) { + ThreadContext.put(Constants.THREAD_CONTEXT_TRACESTATE, + newTraceCtx.get(MessageTracingHelper.TRACESTATE_KEY)); + } + } + beforeDeliverMessage(msg); serv.handleMessage(msg); } catch (Throwable t) { + success = false; logExceptionWithMessageDump(msg, t); if (t instanceof OperationFailureException) { @@ -863,17 +941,28 @@ public Void call() { if (CloudBusGlobalProperty.SENTRY_ON) { try { - // Add message context to Sentry before capturing the exception - Sentry.configureScope(scope -> { - scope.setExtra("message.dump", dumpMessage(msg)); - scope.setTag("service.id", serv.getId()); - scope.setTag("message.class", msg.getClass().getSimpleName()); + Sentry.configureScope(scopeConfig -> { + scopeConfig.setExtra("message.dump", dumpMessage(msg)); + scopeConfig.setTag("service.id", serv.getId()); + scopeConfig.setTag("message.class", msg.getClass().getSimpleName()); }); } catch (Exception sentryEx) { logger.warn("Failed to capture exception with Sentry", sentryEx); } } } + + if (consumerSpan != null) { + consumerSpan.recordException(t); + } + } finally { + if (consumerSpan != null) { + consumerSpan.setStatus(success ? StatusCode.OK : StatusCode.ERROR); + consumerSpan.end(); + } + if (scope != null) { + scope.close(); + } } return null; @@ -1270,6 +1359,13 @@ private void evalThreadContextToMessage(Message msg) { if (tctx != null) { msg.putHeaderEntry(TASK_CONTEXT, tctx); } + + if (TelemetryGlobalProperty.ENABLED) { + Map traceCtx = MessageTracingHelper.extractTraceContext(); + if (!traceCtx.isEmpty()) { + msg.putHeaderEntry(TRACE_CONTEXT, traceCtx); + } + } } private FutureCompletion doSendAndCallExtensions(Message msg) { @@ -1291,7 +1387,25 @@ private FutureCompletion doSendAndCallExtensions(Message msg) { } private FutureCompletion doSend(Message msg) { - evalThreadContextToMessage(msg); + if (isTelemetryEnabled() && !(msg instanceof MessageReply)) { + Span producerSpan = getTelemetryFacade().getTracer() + .spanBuilder("CloudBus Send: " + msg.getClass().getSimpleName()) + .setSpanKind(SpanKind.PRODUCER) + .setAttribute("messaging.system", "cloudbus") + .setAttribute("messaging.destination", msg.getServiceId()) + .setAttribute("messaging.message_id", msg.getId()) + .setAttribute("messaging.message_class", msg.getClass().getName()) + .startSpan(); + try (Scope scope = producerSpan.makeCurrent()) { + // Inject trace context while producer span is current, so the message + // contains the correct parent-child relationship + evalThreadContextToMessage(msg); + } finally { + producerSpan.end(); + } + } else { + evalThreadContextToMessage(msg); + } if (logger.isTraceEnabled() && islogMessage(msg)) { logger.trace(String.format("[msg send]: %s", dumpMessage(msg))); diff --git a/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java b/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java index 4ec0f462d3c..6335721ce52 100755 --- a/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java @@ -1,5 +1,10 @@ package org.zstack.core.rest; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.Scope; import org.apache.http.HttpStatus; import org.apache.http.impl.nio.client.CloseableHttpAsyncClient; import org.apache.http.impl.nio.client.HttpAsyncClients; @@ -7,6 +12,7 @@ import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor; import org.apache.http.impl.nio.reactor.IOReactorConfig; import org.apache.http.nio.reactor.IOReactorException; +import org.apache.logging.log4j.ThreadContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.*; import org.springframework.http.client.HttpComponentsAsyncClientHttpRequestFactory; @@ -19,12 +25,16 @@ import org.zstack.core.debug.DebugManager; import org.zstack.core.retry.Retry; import org.zstack.core.retry.RetryCondition; +import org.zstack.core.telemetry.MessageTracingHelper; +import org.zstack.core.telemetry.TelemetryFacade; +import org.zstack.core.telemetry.TelemetryGlobalProperty; import org.zstack.core.thread.AsyncThread; import org.zstack.core.thread.CancelablePeriodicTask; import org.zstack.core.thread.ThreadFacade; import org.zstack.core.thread.ThreadFacadeImpl.TimeoutTaskReceipt; import org.zstack.core.timeout.ApiTimeoutManager; import org.zstack.core.validation.ValidationFacade; +import org.zstack.header.Constants; import org.zstack.header.core.Completion; import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.errorcode.ErrorCode; @@ -61,6 +71,8 @@ public class RESTFacadeImpl implements RESTFacade { @Autowired private ValidationFacade vf; + private TelemetryFacade telemetryFacade; + private String hostname; private int port = 8080; private String path; @@ -97,6 +109,55 @@ protected boolean removeEldestEntry(Map.Entry eldest) { } }); + private TelemetryFacade getTelemetryFacade() { + if (telemetryFacade == null && TelemetryGlobalProperty.ENABLED) { + try { + telemetryFacade = Platform.getComponentLoader().getComponent(TelemetryFacade.class); + } catch (Exception e) { + logger.trace("TelemetryFacade not available", e); + } + } + return telemetryFacade; + } + + private boolean isTelemetryEnabled() { + return TelemetryGlobalProperty.ENABLED && getTelemetryFacade() != null && getTelemetryFacade().isEnabled(); + } + + private void injectTraceHeaders(HttpHeaders headers) { + if (!isTelemetryEnabled()) { + return; + } + + String traceparent = ThreadContext.get(Constants.THREAD_CONTEXT_TRACEPARENT); + if (traceparent != null && !traceparent.isEmpty()) { + headers.set(Constants.HTTP_HEADER_TRACEPARENT, traceparent); + } + String tracestate = ThreadContext.get(Constants.THREAD_CONTEXT_TRACESTATE); + if (tracestate != null && !tracestate.isEmpty()) { + headers.set(Constants.HTTP_HEADER_TRACESTATE, tracestate); + } + } + + private void endSpanAndScope(Span span, Scope scope) { + if (span != null) { + try { + span.end(); + } catch (Exception e) { + logger.trace("Failed to end HTTP span", e); + } + } + // Scope has already been closed in the creating thread, only handle span here + // If scope is not null (theoretically should not happen), still try to close it to avoid resource leaks + if (scope != null) { + try { + scope.close(); + } catch (Exception e) { + logger.trace("Failed to close HTTP scope", e); + } + } + } + void init() { DebugManager.registerDebugSignalHandler("DumpRestStats", () -> { StringBuilder sb = new StringBuilder(); @@ -341,6 +402,52 @@ public void asyncJson(final String url, final String body, Map h } } + Span httpSpan = null; + Scope scope = null; + if (isTelemetryEnabled()) { + try { + URI uri = URI.create(url); + int defaultPort = "https".equalsIgnoreCase(uri.getScheme()) ? 443 : 80; + httpSpan = getTelemetryFacade().getTracer() + .spanBuilder("HTTP " + method.toString()) + .setSpanKind(SpanKind.CLIENT) + .setAttribute("http.method", method.toString()) + .setAttribute("http.url", url) + .setAttribute("http.host", uri.getHost()) + .setAttribute("http.path", uri.getPath()) + .setAttribute("net.peer.name", uri.getHost()) + .setAttribute("net.peer.port", uri.getPort() > 0 ? uri.getPort() : defaultPort) + .startSpan(); + + scope = httpSpan.makeCurrent(); + + Map traceCtx = MessageTracingHelper.extractTraceContext(); + if (traceCtx.containsKey(MessageTracingHelper.TRACEPARENT_KEY)) { + requestHeaders.set(Constants.HTTP_HEADER_TRACEPARENT, + traceCtx.get(MessageTracingHelper.TRACEPARENT_KEY)); + } + if (traceCtx.containsKey(MessageTracingHelper.TRACESTATE_KEY)) { + requestHeaders.set(Constants.HTTP_HEADER_TRACESTATE, + traceCtx.get(MessageTracingHelper.TRACESTATE_KEY)); + } + + // Close scope immediately after header injection in current thread to avoid context pollution from cross-thread closure + if (scope != null) { + try { + scope.close(); + } catch (Exception e) { + logger.trace("Failed to close HTTP scope in current thread", e); + } + scope = null; + } + } catch (Exception e) { + logger.trace("Failed to create HTTP client span", e); + } + } + + final Span finalHttpSpan = httpSpan; + final Scope finalScope = scope; + HttpEntity req = new HttpEntity(body, requestHeaders); AsyncHttpWrapper wrapper = new AsyncHttpWrapper() { @@ -370,43 +477,60 @@ public void success(HttpEntity responseEntity) { return; } - if (CoreGlobalProperty.PROFILER_HTTP_CALL) { - HttpCallStatistic stat = statistics.get(url); - stat.addStatistic(System.currentTimeMillis() - finalStime); - } + try { + if (CoreGlobalProperty.PROFILER_HTTP_CALL) { + HttpCallStatistic stat = statistics.get(url); + stat.addStatistic(System.currentTimeMillis() - finalStime); + } - wrappers.remove(taskUuid); - cancelTimeout(); + wrappers.remove(taskUuid); + cancelTimeout(); - if (logger.isTraceEnabled()) { - List hs = responseEntity.getHeaders().get(RESTConstant.TASK_UUID); - String taskUuid = hs == null || hs.isEmpty() ? null : hs.get(0); + if (logger.isTraceEnabled()) { + List hs = responseEntity.getHeaders().get(RESTConstant.TASK_UUID); + String taskUuid = hs == null || hs.isEmpty() ? null : hs.get(0); - if (taskUuid == null) { - logger.trace(String.format("[http response(url: %s)] %s", url, responseEntity.getBody())); - } else { - logger.trace(String.format("[http response(url: %s, taskUuid: %s)] %s", - url, taskUuid, responseEntity.getBody())); + if (taskUuid == null) { + logger.trace(String.format("[http response(url: %s)] %s", url, responseEntity.getBody())); + } else { + logger.trace(String.format("[http response(url: %s, taskUuid: %s)] %s", + url, taskUuid, responseEntity.getBody())); + } } - } - if (callback instanceof JsonAsyncRESTCallback) { - JsonAsyncRESTCallback jcallback = (JsonAsyncRESTCallback)callback; - try { - Object obj = JSONObjectUtil.toObject(responseEntity.getBody(), jcallback.getReturnClass()); - ErrorCode err = vf.validateErrorByErrorCode(obj); - if (err != null) { - logger.warn(String.format("error response that causes validation failure: %s", responseEntity.getBody())); - jcallback.fail(err); - } else { - jcallback.success(obj); + if (callback instanceof JsonAsyncRESTCallback) { + JsonAsyncRESTCallback jcallback = (JsonAsyncRESTCallback)callback; + try { + Object obj = JSONObjectUtil.toObject(responseEntity.getBody(), jcallback.getReturnClass()); + ErrorCode err = vf.validateErrorByErrorCode(obj); + if (err != null) { + logger.warn(String.format("error response that causes validation failure: %s", responseEntity.getBody())); + if (finalHttpSpan != null) { + finalHttpSpan.setStatus(StatusCode.ERROR, err.getDetails()); + } + jcallback.fail(err); + } else { + if (finalHttpSpan != null) { + finalHttpSpan.setStatus(StatusCode.OK); + } + jcallback.success(obj); + } + } catch (Throwable t) { + logger.warn(t.getMessage(), t); + if (finalHttpSpan != null) { + finalHttpSpan.recordException(t); + finalHttpSpan.setStatus(StatusCode.ERROR, t.getMessage()); + } + callback.fail(inerr(ORG_ZSTACK_CORE_REST_10002, t.getMessage())); + } + } else { + if (finalHttpSpan != null) { + finalHttpSpan.setStatus(StatusCode.OK); } - } catch (Throwable t) { - logger.warn(t.getMessage(), t); - callback.fail(inerr(ORG_ZSTACK_CORE_REST_10002, t.getMessage())); + callback.success(responseEntity); } - } else { - callback.success(responseEntity); + } finally { + endSpanAndScope(finalHttpSpan, finalScope); } } @@ -418,13 +542,21 @@ public void fail(ErrorCode err) { return; } - wrappers.remove(taskUuid); - if (!SysErrors.TIMEOUT.toString().equals(err.getCode())) { - cancelTimeout(); - } + try { + wrappers.remove(taskUuid); + if (!SysErrors.TIMEOUT.toString().equals(err.getCode())) { + cancelTimeout(); + } - logger.warn(String.format("Unable to post to %s: %s", url, err.getDetails())); - callback.fail(err); + if (finalHttpSpan != null) { + finalHttpSpan.setStatus(StatusCode.ERROR, err.getDetails()); + } + + logger.warn(String.format("Unable to post to %s: %s", url, err.getDetails())); + callback.fail(err); + } finally { + endSpanAndScope(finalHttpSpan, finalScope); + } } }; diff --git a/core/src/main/java/org/zstack/core/telemetry/ErrorKeepingSpanProcessor.java b/core/src/main/java/org/zstack/core/telemetry/ErrorKeepingSpanProcessor.java new file mode 100644 index 00000000000..4c794d9315e --- /dev/null +++ b/core/src/main/java/org/zstack/core/telemetry/ErrorKeepingSpanProcessor.java @@ -0,0 +1,120 @@ +package org.zstack.core.telemetry; + +import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.context.Context; +import io.opentelemetry.sdk.common.CompletableResultCode; +import io.opentelemetry.sdk.trace.ReadWriteSpan; +import io.opentelemetry.sdk.trace.ReadableSpan; +import io.opentelemetry.sdk.trace.SpanProcessor; +import io.opentelemetry.sdk.trace.data.EventData; +import io.opentelemetry.sdk.trace.export.SpanExporter; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import java.util.Collections; + +/** + * A SpanProcessor that ensures error spans are always exported, even if they + * were + * not sampled by the initial sampling decision. + * + * This implements "tail-based sampling" for errors: when a span ends with an + * error + * status or has recorded exceptions, it will be exported regardless of the + * original + * sampling decision. + * + * This is useful for debugging production issues where you want low sampling + * rates + * for normal operations but 100% capture of errors. + */ +public class ErrorKeepingSpanProcessor implements SpanProcessor { + private static final CLogger logger = Utils.getLogger(ErrorKeepingSpanProcessor.class); + private static final String EXCEPTION_EVENT_NAME = "exception"; + + private final SpanExporter exporter; + private final boolean alwaysSampleErrors; + private final Object exportLock = new Object(); + + public ErrorKeepingSpanProcessor(SpanExporter exporter) { + this(exporter, TelemetryGlobalProperty.ALWAYS_SAMPLE_ERRORS); + } + + public ErrorKeepingSpanProcessor(SpanExporter exporter, boolean alwaysSampleErrors) { + this.exporter = exporter; + this.alwaysSampleErrors = alwaysSampleErrors; + } + + @Override + public void onStart(Context parentContext, ReadWriteSpan span) { + } + + @Override + public boolean isStartRequired() { + return false; + } + + @Override + public void onEnd(ReadableSpan span) { + if (!alwaysSampleErrors) { + return; + } + + if (span.getSpanContext().isSampled()) { + return; + } + + if (hasError(span)) { + // Synchronize export calls to ensure SpanExporter is not called concurrently + // as per OpenTelemetry specification: SpanProcessor must serialize calls to the exporter + synchronized (exportLock) { + try { + CompletableResultCode result = exporter.export(Collections.singletonList(span.toSpanData())); + if (logger.isTraceEnabled()) { + logger.trace(String.format("Exported error span: traceId=%s, spanId=%s, name=%s", + span.getSpanContext().getTraceId(), + span.getSpanContext().getSpanId(), + span.getName())); + } + // Note: export() is asynchronous, but we can check if it's already failed + if (result.isDone() && !result.isSuccess()) { + logger.warn(String.format("Error span export failed: traceId=%s, spanId=%s", + span.getSpanContext().getTraceId(), + span.getSpanContext().getSpanId())); + } + } catch (Exception e) { + logger.warn(String.format("Failed to export error span: %s", e.getMessage())); + } + } + } + } + + @Override + public boolean isEndRequired() { + return alwaysSampleErrors; + } + + private boolean hasError(ReadableSpan span) { + if (span.toSpanData().getStatus().getStatusCode() == StatusCode.ERROR) { + return true; + } + + for (EventData event : span.toSpanData().getEvents()) { + if (EXCEPTION_EVENT_NAME.equals(event.getName())) { + return true; + } + } + + return false; + } + + @Override + public CompletableResultCode shutdown() { + return CompletableResultCode.ofSuccess(); + } + + @Override + public CompletableResultCode forceFlush() { + return CompletableResultCode.ofSuccess(); + } +} diff --git a/core/src/main/java/org/zstack/core/telemetry/MessageTracingHelper.java b/core/src/main/java/org/zstack/core/telemetry/MessageTracingHelper.java new file mode 100644 index 00000000000..03243d9f1ce --- /dev/null +++ b/core/src/main/java/org/zstack/core/telemetry/MessageTracingHelper.java @@ -0,0 +1,109 @@ +package org.zstack.core.telemetry; + +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.propagation.TextMapGetter; +import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.context.propagation.TextMapSetter; +import org.zstack.header.message.Message; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +public class MessageTracingHelper { + + public static final String TRACEPARENT_KEY = "traceparent"; + public static final String TRACESTATE_KEY = "tracestate"; + + private static TextMapPropagator getPropagator() { + // Use GlobalOpenTelemetry to get the configured propagator + // This will use W3CTraceContextPropagator if available, or the default propagator + return GlobalOpenTelemetry.getPropagators().getTextMapPropagator(); + } + + private static final TextMapGetter> MAP_GETTER = new TextMapGetter>() { + @Override + public Iterable keys(Map carrier) { + return carrier == null ? Collections.emptySet() : carrier.keySet(); + } + + @Override + public String get(Map carrier, String key) { + return carrier == null ? null : carrier.get(key); + } + }; + + private static final TextMapSetter> MAP_SETTER = (carrier, key, value) -> { + if (carrier != null) { + carrier.put(key, value); + } + }; + + public static Map extractTraceContext() { + Map contextMap = new HashMap<>(); + Context currentContext = Context.current(); + + // Use TextMapPropagator to inject trace context according to W3C Trace Context specification + // This uses the configured propagator from GlobalOpenTelemetry (typically W3CTraceContextPropagator) + getPropagator().inject(currentContext, contextMap, MAP_SETTER); + + return contextMap; + } + + public static Context parseTraceContext(Map contextMap) { + if (contextMap == null || contextMap.isEmpty()) { + return Context.current(); + } + + // Use TextMapPropagator to extract trace context according to W3C Trace Context specification + // This uses the configured propagator from GlobalOpenTelemetry (typically W3CTraceContextPropagator) + // This ensures full compliance with the W3C Trace Context specification including proper validation + return getPropagator().extract(Context.current(), contextMap, MAP_GETTER); + } + + public static void injectTraceContextToMessage(Message msg, Map traceContext) { + if (msg == null || traceContext == null || traceContext.isEmpty()) { + return; + } + + Object headerEntry = msg.getHeaderEntry("__trace__"); + Map headers; + if (headerEntry instanceof Map) { + headers = (Map) headerEntry; + } else { + headers = new HashMap<>(); + } + headers.putAll(traceContext); + msg.putHeaderEntry("__trace__", headers); + } + + @SuppressWarnings("unchecked") + public static Map extractTraceContextFromMessage(Message msg) { + if (msg == null) { + return new HashMap<>(); + } + + Object headers = msg.getHeaderEntry("__trace__"); + if (headers instanceof Map) { + Map result = new HashMap<>(); + ((Map) headers).forEach((k, v) -> { + if (k instanceof String && v instanceof String) { + result.put((String) k, (String) v); + } + }); + return result; + } + + return new HashMap<>(); + } + + public static TextMapGetter> getMapGetter() { + return MAP_GETTER; + } + + public static TextMapSetter> getMapSetter() { + return MAP_SETTER; + } +} diff --git a/core/src/main/java/org/zstack/core/telemetry/OtlpExporterProvider.java b/core/src/main/java/org/zstack/core/telemetry/OtlpExporterProvider.java new file mode 100644 index 00000000000..fdc83a6f5c9 --- /dev/null +++ b/core/src/main/java/org/zstack/core/telemetry/OtlpExporterProvider.java @@ -0,0 +1,79 @@ +package org.zstack.core.telemetry; + +import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter; +import io.opentelemetry.sdk.trace.export.SpanExporter; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import java.util.concurrent.TimeUnit; + +public class OtlpExporterProvider implements TelemetryExporterProvider { + private static final CLogger logger = Utils.getLogger(OtlpExporterProvider.class); + private static final String NAME = "otlp"; + + @Override + public String getName() { + return NAME; + } + + @Override + public boolean isAvailable() { + String endpoint = TelemetryGlobalProperty.OTLP_ENDPOINT; + return endpoint != null && !endpoint.trim().isEmpty(); + } + + @Override + public SpanExporter createExporter() { + String endpoint = TelemetryGlobalProperty.OTLP_ENDPOINT; + if (endpoint == null || endpoint.trim().isEmpty()) { + logger.warn("OTLP endpoint not configured, cannot create exporter"); + return null; + } + + String sanitizedEndpoint = sanitizeEndpointForLogging(endpoint); + logger.info(String.format("Creating OTLP exporter with endpoint: %s", sanitizedEndpoint)); + return OtlpGrpcSpanExporter.builder() + .setEndpoint(endpoint) + .setTimeout(30, TimeUnit.SECONDS) + .build(); + } + + /** + * Sanitize endpoint URL for logging to avoid exposing sensitive information. + * Only extracts and returns scheme://host:port, hiding path, query parameters, and user info. + * + * @param endpoint the full endpoint URL + * @return sanitized endpoint string safe for logging (scheme://host:port) + */ + private String sanitizeEndpointForLogging(String endpoint) { + try { + UriComponents components = UriComponentsBuilder.fromUriString(endpoint).build(); + StringBuilder sanitized = new StringBuilder(); + + if (components.getScheme() != null) { + sanitized.append(components.getScheme()).append("://"); + } + + if (components.getHost() != null) { + sanitized.append(components.getHost()); + } + + if (components.getPort() != -1) { + sanitized.append(":").append(components.getPort()); + } + + return sanitized.length() > 0 ? sanitized.toString() : "***"; + } catch (Exception e) { + // If URL parsing fails, return a masked value + logger.debug(String.format("Failed to parse endpoint URL for sanitization: %s", e.getMessage())); + return "***"; + } + } + + @Override + public int getOrder() { + return 0; + } +} diff --git a/core/src/main/java/org/zstack/core/telemetry/SentryExporterProvider.java b/core/src/main/java/org/zstack/core/telemetry/SentryExporterProvider.java new file mode 100644 index 00000000000..622bcdc2b4a --- /dev/null +++ b/core/src/main/java/org/zstack/core/telemetry/SentryExporterProvider.java @@ -0,0 +1,72 @@ +package org.zstack.core.telemetry; + +import io.opentelemetry.sdk.trace.export.SpanExporter; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +public class SentryExporterProvider implements TelemetryExporterProvider { + private static final CLogger logger = Utils.getLogger(SentryExporterProvider.class); + private static final String NAME = "sentry"; + private static final String SENTRY_EXPORTER_CLASS = "io.sentry.opentelemetry.SentrySpanExporter"; + + private volatile Boolean available = null; + + @Override + public String getName() { + return NAME; + } + + @Override + public boolean isAvailable() { + if (available == null) { + synchronized (this) { + if (available == null) { + available = checkSentryAvailable(); + } + } + } + return available; + } + + private boolean checkSentryAvailable() { + try { + Class.forName(SENTRY_EXPORTER_CLASS); + return true; + } catch (ClassNotFoundException e) { + logger.debug("Sentry OpenTelemetry integration not available on classpath"); + return false; + } catch (NoClassDefFoundError e) { + logger.debug("Sentry OpenTelemetry integration class not found at runtime: " + e.getMessage()); + return false; + } catch (ExceptionInInitializerError e) { + logger.debug("Sentry OpenTelemetry integration initialization error: " + e.getMessage()); + return false; + } catch (LinkageError e) { + logger.debug("Sentry OpenTelemetry integration linkage error: " + e.getMessage()); + return false; + } + } + + @Override + public SpanExporter createExporter() { + if (!isAvailable()) { + logger.warn("Sentry exporter requested but sentry-opentelemetry-core is not on classpath"); + return null; + } + + try { + Class exporterClass = Class.forName(SENTRY_EXPORTER_CLASS); + SpanExporter exporter = (SpanExporter) exporterClass.getDeclaredConstructor().newInstance(); + logger.info("Created Sentry span exporter"); + return exporter; + } catch (Exception e) { + logger.error(String.format("Failed to create Sentry exporter: %s", e.getMessage()), e); + return null; + } + } + + @Override + public int getOrder() { + return 100; + } +} diff --git a/core/src/main/java/org/zstack/core/telemetry/TelemetryExporterProvider.java b/core/src/main/java/org/zstack/core/telemetry/TelemetryExporterProvider.java new file mode 100644 index 00000000000..0b4b31b08ef --- /dev/null +++ b/core/src/main/java/org/zstack/core/telemetry/TelemetryExporterProvider.java @@ -0,0 +1,14 @@ +package org.zstack.core.telemetry; + +import io.opentelemetry.sdk.trace.export.SpanExporter; + +public interface TelemetryExporterProvider { + + String getName(); + + boolean isAvailable(); + + SpanExporter createExporter(); + + int getOrder(); +} diff --git a/core/src/main/java/org/zstack/core/telemetry/TelemetryFacade.java b/core/src/main/java/org/zstack/core/telemetry/TelemetryFacade.java new file mode 100644 index 00000000000..8cf3e13ffdb --- /dev/null +++ b/core/src/main/java/org/zstack/core/telemetry/TelemetryFacade.java @@ -0,0 +1,32 @@ +package org.zstack.core.telemetry; + +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.context.Context; + +import java.util.Map; + +public interface TelemetryFacade { + + boolean isEnabled(); + + Tracer getTracer(); + + Tracer getTracer(String instrumentationName); + + Span startSpan(String spanName); + + Span startSpan(String spanName, Context parentContext); + + Span startSpan(String spanName, Map attributes); + + Span startSpan(String spanName, Context parentContext, Map attributes); + + Context getCurrentContext(); + + void recordException(Span span, Throwable throwable); + + void markSpanError(Span span, String errorMessage); + + void shutdown(); +} diff --git a/core/src/main/java/org/zstack/core/telemetry/TelemetryFacadeImpl.java b/core/src/main/java/org/zstack/core/telemetry/TelemetryFacadeImpl.java new file mode 100644 index 00000000000..3713a567827 --- /dev/null +++ b/core/src/main/java/org/zstack/core/telemetry/TelemetryFacadeImpl.java @@ -0,0 +1,357 @@ +package org.zstack.core.telemetry; + +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanBuilder; +import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.context.Context; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.sdk.trace.SdkTracerProvider; +import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder; +import io.opentelemetry.sdk.trace.SpanProcessor; +import io.opentelemetry.sdk.trace.export.BatchSpanProcessor; +import io.opentelemetry.sdk.trace.export.SpanExporter; +import io.opentelemetry.sdk.common.CompletableResultCode; +import io.opentelemetry.sdk.trace.data.SpanData; +import org.zstack.header.Component; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +public class TelemetryFacadeImpl implements TelemetryFacade, Component { + private static final CLogger logger = Utils.getLogger(TelemetryFacadeImpl.class); + private static final String INSTRUMENTATION_NAME = "org.zstack"; + + private OpenTelemetry openTelemetry; + private SdkTracerProvider tracerProvider; + private Tracer defaultTracer; + private volatile boolean initialized = false; + + private final Map exporterProviders = new HashMap<>(); + + @Override + public boolean start() { + if (!TelemetryGlobalProperty.ENABLED) { + logger.info("Telemetry is disabled by configuration"); + return true; + } + + // Idempotency: avoid buildAndRegisterGlobal() being called when global is already registered + synchronized (this) { + if (initialized) { + logger.info("Telemetry already initialized, skipping re-initialization"); + return true; + } + + try { + registerBuiltInProviders(); + initializeOpenTelemetry(); + initialized = true; + logger.info(String.format("Telemetry initialized successfully: environment=%s, exporters=%s", + TelemetryGlobalProperty.ENVIRONMENT, TelemetryGlobalProperty.EXPORTERS)); + } catch (Exception e) { + logger.error("Failed to initialize telemetry", e); + initialized = false; + } + } + + return true; + } + + private void registerBuiltInProviders() { + registerProvider(new OtlpExporterProvider()); + registerProvider(new SentryExporterProvider()); + } + + public void registerProvider(TelemetryExporterProvider provider) { + exporterProviders.put(provider.getName().toLowerCase(Locale.ROOT), provider); + logger.debug(String.format("Registered telemetry exporter provider: %s (available=%s)", + provider.getName(), provider.isAvailable())); + } + + @Override + public boolean stop() { + shutdown(); + return true; + } + + private void initializeOpenTelemetry() { + Resource resource = Resource.getDefault().merge( + Resource.create(Attributes.of( + AttributeKey.stringKey("service.name"), TelemetryGlobalProperty.SERVICE_NAME, + AttributeKey.stringKey("service.version"), + TelemetryGlobalProperty.SERVICE_VERSION.isEmpty() ? "unknown" + : TelemetryGlobalProperty.SERVICE_VERSION, + AttributeKey.stringKey("deployment.environment"), TelemetryGlobalProperty.ENVIRONMENT))); + + ZStackSampler sampler = new ZStackSampler(); + + List exporters = buildExporters(); + + SdkTracerProviderBuilder tracerProviderBuilder = SdkTracerProvider.builder() + .setResource(resource) + .setSampler(sampler); + + // Add BatchSpanProcessor for each exporter + for (SpanExporter exporter : exporters) { + BatchSpanProcessor batchProcessor = BatchSpanProcessor.builder(exporter) + .setMaxExportBatchSize(TelemetryGlobalProperty.MAX_EXPORT_BATCH_SIZE) + .setMaxQueueSize(TelemetryGlobalProperty.MAX_QUEUE_SIZE) + .setScheduleDelay(TelemetryGlobalProperty.EXPORT_DELAY_MS, TimeUnit.MILLISECONDS) + .build(); + tracerProviderBuilder = tracerProviderBuilder.addSpanProcessor(batchProcessor); + } + + // ErrorKeepingSpanProcessor only needs to be added once, using composite exporter to ensure all exporters receive error spans + // This avoids the same error span being processed multiple times by different processors + if (TelemetryGlobalProperty.ALWAYS_SAMPLE_ERRORS && !exporters.isEmpty()) { + SpanExporter compositeExporter = createCompositeExporter(exporters); + SpanProcessor errorProcessor = new ErrorKeepingSpanProcessor(compositeExporter); + tracerProviderBuilder = tracerProviderBuilder.addSpanProcessor(errorProcessor); + } + + tracerProvider = tracerProviderBuilder.build(); + + // Idempotency protection: buildAndRegisterGlobal() throws IllegalStateException if already registered + try { + openTelemetry = OpenTelemetrySdk.builder() + .setTracerProvider(tracerProvider) + .buildAndRegisterGlobal(); + } catch (IllegalStateException e) { + // If already registered, use existing instance + logger.warn("Global OpenTelemetry already registered, using existing instance", e); + openTelemetry = GlobalOpenTelemetry.get(); + } + + defaultTracer = openTelemetry.getTracer(INSTRUMENTATION_NAME); + } + + /** + * Create a composite SpanExporter that exports spans to all provided exporters + */ + private SpanExporter createCompositeExporter(List exporters) { + if (exporters.size() == 1) { + return exporters.get(0); + } + + return new SpanExporter() { + @Override + public CompletableResultCode export(Collection spans) { + List results = new ArrayList<>(); + for (SpanExporter exporter : exporters) { + try { + results.add(exporter.export(spans)); + } catch (Exception e) { + logger.warn(String.format("Failed to export spans to exporter %s: %s", + exporter.getClass().getSimpleName(), e.getMessage())); + results.add(CompletableResultCode.ofFailure()); + } + } + // Wait for all exports to complete, return failure if any fails + return CompletableResultCode.ofAll(results); + } + + @Override + public CompletableResultCode flush() { + List results = new ArrayList<>(); + for (SpanExporter exporter : exporters) { + try { + results.add(exporter.flush()); + } catch (Exception e) { + logger.warn(String.format("Failed to flush exporter %s: %s", + exporter.getClass().getSimpleName(), e.getMessage())); + results.add(CompletableResultCode.ofFailure()); + } + } + return CompletableResultCode.ofAll(results); + } + + @Override + public CompletableResultCode shutdown() { + List results = new ArrayList<>(); + for (SpanExporter exporter : exporters) { + try { + results.add(exporter.shutdown()); + } catch (Exception e) { + logger.warn(String.format("Failed to shutdown exporter %s: %s", + exporter.getClass().getSimpleName(), e.getMessage())); + results.add(CompletableResultCode.ofFailure()); + } + } + return CompletableResultCode.ofAll(results); + } + }; + } + + private List buildExporters() { + List exporters = new ArrayList<>(); + String exporterConfig = TelemetryGlobalProperty.EXPORTERS; + + if (exporterConfig == null || exporterConfig.trim().isEmpty()) { + logger.info("No exporters configured, traces will not be exported"); + return exporters; + } + + List requestedExporters = Arrays.asList(exporterConfig.toLowerCase(Locale.ROOT).split(",")); + + for (String exporterName : requestedExporters) { + String name = exporterName.trim(); + if (name.isEmpty()) { + continue; + } + + TelemetryExporterProvider provider = exporterProviders.get(name); + if (provider == null) { + logger.warn(String.format("Unknown exporter '%s', available: %s", name, exporterProviders.keySet())); + continue; + } + + if (!provider.isAvailable()) { + logger.warn( + String.format("Exporter '%s' is not available (missing dependencies or configuration)", name)); + continue; + } + + SpanExporter exporter = provider.createExporter(); + if (exporter != null) { + exporters.add(exporter); + logger.info(String.format("Enabled exporter: %s", name)); + } + } + + if (exporters.isEmpty()) { + logger.warn("No exporters were successfully created, traces will not be exported"); + } + + return exporters; + } + + @Override + public boolean isEnabled() { + return TelemetryGlobalProperty.ENABLED && initialized; + } + + @Override + public Tracer getTracer() { + if (!isEnabled()) { + return GlobalOpenTelemetry.getTracer(INSTRUMENTATION_NAME); + } + return defaultTracer; + } + + @Override + public Tracer getTracer(String instrumentationName) { + if (!isEnabled()) { + return GlobalOpenTelemetry.getTracer(instrumentationName); + } + return openTelemetry.getTracer(instrumentationName); + } + + @Override + public Span startSpan(String spanName) { + return startSpan(spanName, Context.current(), null); + } + + @Override + public Span startSpan(String spanName, Context parentContext) { + return startSpan(spanName, parentContext, null); + } + + @Override + public Span startSpan(String spanName, Map attributes) { + return startSpan(spanName, Context.current(), attributes); + } + + @Override + public Span startSpan(String spanName, Context parentContext, Map attributes) { + if (!isEnabled()) { + return Span.getInvalid(); + } + + SpanBuilder spanBuilder = defaultTracer.spanBuilder(spanName); + + if (parentContext != null) { + spanBuilder.setParent(parentContext); + } + + if (attributes != null) { + for (Map.Entry entry : attributes.entrySet()) { + spanBuilder.setAttribute(entry.getKey(), entry.getValue()); + } + } + + return spanBuilder.startSpan(); + } + + @Override + public Context getCurrentContext() { + return Context.current(); + } + + @Override + public void recordException(Span span, Throwable throwable) { + if (span == null || !span.isRecording()) { + return; + } + if (throwable == null) { + logger.warn("recordException called with null throwable, marking span as error without exception details"); + span.setStatus(StatusCode.ERROR, "Unknown error"); + return; + } + span.recordException(throwable); + String errorMessage = throwable.getMessage(); + if (errorMessage == null || errorMessage.isEmpty()) { + errorMessage = throwable.getClass().getSimpleName(); + } + span.setStatus(StatusCode.ERROR, errorMessage); + } + + @Override + public void markSpanError(Span span, String errorMessage) { + if (span == null || !span.isRecording()) { + return; + } + span.setStatus(StatusCode.ERROR, errorMessage); + } + + @Override + public void shutdown() { + if (tracerProvider != null) { + logger.info("Shutting down telemetry..."); + CompletableResultCode shutdownResult = tracerProvider.shutdown(); + + // Wait for shutdown to complete to avoid span loss + try { + CompletableResultCode result = shutdownResult.join( + TelemetryGlobalProperty.SHUTDOWN_TIMEOUT_MS, + TimeUnit.MILLISECONDS); + + if (!result.isSuccess()) { + logger.warn("Telemetry shutdown completed with errors: " + result); + } else { + logger.info("Telemetry shutdown completed successfully"); + } + } catch (Exception e) { + logger.warn(String.format( + "Telemetry shutdown did not complete within %d ms, some spans may be lost", + TelemetryGlobalProperty.SHUTDOWN_TIMEOUT_MS), e); + } + + tracerProvider = null; + initialized = false; + } + } +} diff --git a/core/src/main/java/org/zstack/core/telemetry/TelemetryGlobalProperty.java b/core/src/main/java/org/zstack/core/telemetry/TelemetryGlobalProperty.java new file mode 100644 index 00000000000..7ef1e6ce0f8 --- /dev/null +++ b/core/src/main/java/org/zstack/core/telemetry/TelemetryGlobalProperty.java @@ -0,0 +1,170 @@ +package org.zstack.core.telemetry; + +import org.zstack.core.GlobalProperty; +import org.zstack.core.GlobalPropertyDefinition; + +/** + * Global properties for telemetry/tracing configuration. + * + * Supports environment-aware sampling strategies: + * - DEV/TEST: Full sampling (100%) + * - STAGING: 10% sampling + error retention + * - PROD: Configurable sampling (default 1%) + error retention + */ +@GlobalPropertyDefinition +public class TelemetryGlobalProperty { + + /** + * Master switch for telemetry. When false, no tracing is performed. + */ + @GlobalProperty(name = "Telemetry.enabled", defaultValue = "false") + public static boolean ENABLED; + + /** + * Environment type: DEV, TEST, STAGING, PROD + * Determines default sampling strategy. + */ + @GlobalProperty(name = "Telemetry.environment", defaultValue = "DEV") + public static String ENVIRONMENT; + + /** + * Sampling rate for traces (0.0 to 1.0). + * - 1.0 = 100% (all requests) + * - 0.1 = 10% + * - 0.01 = 1% + * Only used in STAGING/PROD environments; DEV/TEST always sample 100%. + */ + @GlobalProperty(name = "Telemetry.samplingRate", defaultValue = "0.01") + public static double SAMPLING_RATE; + + /** + * When true, always sample traces that contain errors, regardless of sampling + * rate. + * Enables tail-based sampling for error retention. + */ + @GlobalProperty(name = "Telemetry.alwaysSampleErrors", defaultValue = "true") + public static boolean ALWAYS_SAMPLE_ERRORS; + + /** + * Comma-separated list of exporters to use. + * Available: otlp, sentry (if sentry-opentelemetry-core is on classpath) + * Example: "otlp" or "otlp,sentry" + * Default: "otlp" + */ + @GlobalProperty(name = "Telemetry.exporters", defaultValue = "otlp") + public static String EXPORTERS; + + /** + * OTLP endpoint for Jaeger/Tempo export. + * Example: http://localhost:4317 (gRPC) or http://localhost:4318/v1/traces + * (HTTP) + */ + @GlobalProperty(name = "Telemetry.otlpEndpoint", defaultValue = "") + public static String OTLP_ENDPOINT; + + /** + * Sentry DSN for Sentry export. + * If empty, uses existing Sentry configuration from CloudBus.sentryDsn. + */ + @GlobalProperty(name = "Telemetry.sentryDsn", defaultValue = "") + public static String SENTRY_DSN; + + /** + * Service name reported in traces. + */ + @GlobalProperty(name = "Telemetry.serviceName", defaultValue = "zstack-management-node") + public static String SERVICE_NAME; + + /** + * Service version reported in traces. + */ + @GlobalProperty(name = "Telemetry.serviceVersion", defaultValue = "") + public static String SERVICE_VERSION; + + /** + * Maximum number of spans to buffer before export. + */ + @GlobalProperty(name = "Telemetry.maxExportBatchSize", defaultValue = "512") + public static int MAX_EXPORT_BATCH_SIZE; + + /** + * Delay between exports in milliseconds. + */ + @GlobalProperty(name = "Telemetry.exportDelayMs", defaultValue = "5000") + public static int EXPORT_DELAY_MS; + + /** + * Maximum queue size for pending spans. + */ + @GlobalProperty(name = "Telemetry.maxQueueSize", defaultValue = "2048") + public static int MAX_QUEUE_SIZE; + + // ==================== Metrics Configuration ==================== + + /** + * Enable/disable metrics collection. + * When enabled, exposes Prometheus-compatible metrics endpoint. + */ + @GlobalProperty(name = "Telemetry.metricsEnabled", defaultValue = "true") + public static boolean METRICS_ENABLED; + + /** + * HTTP port for Prometheus metrics endpoint. + * Prometheus can scrape metrics from http://host:port/metrics + */ + @GlobalProperty(name = "Telemetry.prometheusPort", defaultValue = "9464") + public static int PROMETHEUS_PORT; + + /** + * Interval in seconds for collecting thread pool metrics. + * Lower values provide more granular data but higher overhead. + */ + @GlobalProperty(name = "Telemetry.metricsCollectionIntervalSeconds", defaultValue = "15") + public static int METRICS_COLLECTION_INTERVAL_SECONDS; + + /** + * Maximum number of unique task signatures to track. + * Prevents unbounded cardinality in metrics labels. + * Tasks beyond this limit are aggregated under "other". + */ + @GlobalProperty(name = "Telemetry.maxTrackedSignatures", defaultValue = "500") + public static int MAX_TRACKED_SIGNATURES; + + /** + * Timeout in milliseconds for telemetry shutdown. + * The system will wait for this duration to allow pending spans to be exported + * before forcefully shutting down. + */ + @GlobalProperty(name = "Telemetry.shutdownTimeoutMs", defaultValue = "10000") + public static int SHUTDOWN_TIMEOUT_MS; + + /** + * Environment types enumeration + */ + public enum Environment { + DEV, + TEST, + STAGING, + PROD; + + public static Environment fromString(String env) { + if (env == null) { + return DEV; + } + String trimmed = env.trim(); + if (trimmed.isEmpty()) { + return DEV; + } + try { + return valueOf(trimmed.toUpperCase()); + } catch (IllegalArgumentException e) { + return DEV; + } + } + + public boolean isFullSampling() { + return this == DEV || this == TEST; + } + } + +} diff --git a/core/src/main/java/org/zstack/core/telemetry/TelemetryMetricsFacade.java b/core/src/main/java/org/zstack/core/telemetry/TelemetryMetricsFacade.java new file mode 100644 index 00000000000..ce2eb9e93da --- /dev/null +++ b/core/src/main/java/org/zstack/core/telemetry/TelemetryMetricsFacade.java @@ -0,0 +1,23 @@ +package org.zstack.core.telemetry; + +public interface TelemetryMetricsFacade { + + boolean isEnabled(); + + void recordThreadPoolMetrics(String poolName, int activeCount, int poolSize, int maximumPoolSize, + int queueSize, long completedTaskCount); + + void recordChainTaskQueueMetrics(String signature, int pendingCount, int runningCount); + + void recordSyncTaskQueueMetrics(String signature, int pendingCount, int runningCount); + + void recordTaskWaitTime(String taskType, String signature, long waitTimeMs); + + void recordTaskExecutionTime(String taskType, String signature, long executionTimeMs); + + void incrementTaskSubmitted(String taskType, String signature); + + void incrementTaskCompleted(String taskType, String signature, boolean success); + + void shutdown(); +} diff --git a/core/src/main/java/org/zstack/core/telemetry/TelemetryMetricsFacadeImpl.java b/core/src/main/java/org/zstack/core/telemetry/TelemetryMetricsFacadeImpl.java new file mode 100644 index 00000000000..59a960cd67d --- /dev/null +++ b/core/src/main/java/org/zstack/core/telemetry/TelemetryMetricsFacadeImpl.java @@ -0,0 +1,355 @@ +package org.zstack.core.telemetry; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.metrics.LongCounter; +import io.opentelemetry.api.metrics.LongHistogram; +import io.opentelemetry.api.metrics.Meter; +import io.opentelemetry.api.metrics.ObservableLongGauge; +import io.opentelemetry.exporter.prometheus.PrometheusHttpServer; +import io.opentelemetry.sdk.common.CompletableResultCode; +import io.opentelemetry.sdk.metrics.SdkMeterProvider; +import io.opentelemetry.sdk.metrics.export.MetricReader; +import io.opentelemetry.sdk.resources.Resource; +import org.zstack.header.Component; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; + +public class TelemetryMetricsFacadeImpl implements TelemetryMetricsFacade, Component { + private static final CLogger logger = Utils.getLogger(TelemetryMetricsFacadeImpl.class); + private static final String INSTRUMENTATION_SCOPE = "org.zstack.metrics"; + + private static final String METRIC_PREFIX = "zstack_"; + private static final String POOL_LABEL = "pool"; + private static final String TASK_TYPE_LABEL = "task_type"; + private static final String SIGNATURE_LABEL = "signature"; + private static final String STATUS_LABEL = "status"; + + private SdkMeterProvider meterProvider; + private MetricReader prometheusReader; + private Meter meter; + private volatile boolean initialized = false; + + private final Map threadPoolActiveCount = new ConcurrentHashMap<>(); + private final Map threadPoolSize = new ConcurrentHashMap<>(); + private final Map threadPoolMaxSize = new ConcurrentHashMap<>(); + private final Map threadPoolQueueSize = new ConcurrentHashMap<>(); + private final Map threadPoolCompletedCount = new ConcurrentHashMap<>(); + + private final Map chainTaskPendingCount = new ConcurrentHashMap<>(); + private final Map chainTaskRunningCount = new ConcurrentHashMap<>(); + + private final Map syncTaskPendingCount = new ConcurrentHashMap<>(); + private final Map syncTaskRunningCount = new ConcurrentHashMap<>(); + + private LongHistogram taskWaitTimeHistogram; + private LongHistogram taskExecutionTimeHistogram; + private LongCounter taskSubmittedCounter; + private LongCounter taskCompletedCounter; + + @Override + public boolean start() { + if (!TelemetryGlobalProperty.ENABLED || !TelemetryGlobalProperty.METRICS_ENABLED) { + logger.info("Telemetry metrics disabled by configuration"); + return true; + } + + try { + initializeMetrics(); + initialized = true; + logger.info(String.format("Telemetry metrics initialized on port %d", + TelemetryGlobalProperty.PROMETHEUS_PORT)); + } catch (Exception e) { + logger.error("Failed to initialize telemetry metrics", e); + initialized = false; + } + + return true; + } + + @Override + public boolean stop() { + shutdown(); + return true; + } + + private void initializeMetrics() { + Resource resource = Resource.getDefault().merge( + Resource.create(Attributes.of( + AttributeKey.stringKey("service.name"), TelemetryGlobalProperty.SERVICE_NAME, + AttributeKey.stringKey("deployment.environment"), TelemetryGlobalProperty.ENVIRONMENT))); + + prometheusReader = PrometheusHttpServer.builder() + .setPort(TelemetryGlobalProperty.PROMETHEUS_PORT) + .build(); + + meterProvider = SdkMeterProvider.builder() + .setResource(resource) + .registerMetricReader(prometheusReader) + .build(); + + meter = meterProvider.get(INSTRUMENTATION_SCOPE); + + registerThreadPoolGauges(); + registerTaskQueueGauges(); + registerHistogramsAndCounters(); + } + + private void registerThreadPoolGauges() { + meter.gaugeBuilder(METRIC_PREFIX + "threadpool_active") + .setDescription("Number of active threads in pool") + .ofLongs() + .buildWithCallback(measurement -> { + threadPoolActiveCount.forEach((pool, count) -> measurement.record(count.get(), + Attributes.of(AttributeKey.stringKey(POOL_LABEL), pool))); + }); + + meter.gaugeBuilder(METRIC_PREFIX + "threadpool_size") + .setDescription("Current pool size") + .ofLongs() + .buildWithCallback(measurement -> { + threadPoolSize.forEach((pool, count) -> measurement.record(count.get(), + Attributes.of(AttributeKey.stringKey(POOL_LABEL), pool))); + }); + + meter.gaugeBuilder(METRIC_PREFIX + "threadpool_max_size") + .setDescription("Maximum pool size") + .ofLongs() + .buildWithCallback(measurement -> { + threadPoolMaxSize.forEach((pool, count) -> measurement.record(count.get(), + Attributes.of(AttributeKey.stringKey(POOL_LABEL), pool))); + }); + + meter.gaugeBuilder(METRIC_PREFIX + "threadpool_queue_size") + .setDescription("Number of tasks waiting in queue") + .ofLongs() + .buildWithCallback(measurement -> { + threadPoolQueueSize.forEach((pool, count) -> measurement.record(count.get(), + Attributes.of(AttributeKey.stringKey(POOL_LABEL), pool))); + }); + + meter.gaugeBuilder(METRIC_PREFIX + "threadpool_completed_total") + .setDescription("Total completed tasks") + .ofLongs() + .buildWithCallback(measurement -> { + threadPoolCompletedCount.forEach((pool, count) -> measurement.record(count.get(), + Attributes.of(AttributeKey.stringKey(POOL_LABEL), pool))); + }); + } + + private void registerTaskQueueGauges() { + meter.gaugeBuilder(METRIC_PREFIX + "chaintask_pending") + .setDescription("Pending chain tasks per signature") + .ofLongs() + .buildWithCallback(measurement -> { + chainTaskPendingCount.forEach((sig, count) -> measurement.record(count.get(), + Attributes.of(AttributeKey.stringKey(SIGNATURE_LABEL), sanitizeSignature(sig)))); + }); + + meter.gaugeBuilder(METRIC_PREFIX + "chaintask_running") + .setDescription("Running chain tasks per signature") + .ofLongs() + .buildWithCallback(measurement -> { + chainTaskRunningCount.forEach((sig, count) -> measurement.record(count.get(), + Attributes.of(AttributeKey.stringKey(SIGNATURE_LABEL), sanitizeSignature(sig)))); + }); + + meter.gaugeBuilder(METRIC_PREFIX + "synctask_pending") + .setDescription("Pending sync tasks per signature") + .ofLongs() + .buildWithCallback(measurement -> { + syncTaskPendingCount.forEach((sig, count) -> measurement.record(count.get(), + Attributes.of(AttributeKey.stringKey(SIGNATURE_LABEL), sanitizeSignature(sig)))); + }); + + meter.gaugeBuilder(METRIC_PREFIX + "synctask_running") + .setDescription("Running sync tasks per signature") + .ofLongs() + .buildWithCallback(measurement -> { + syncTaskRunningCount.forEach((sig, count) -> measurement.record(count.get(), + Attributes.of(AttributeKey.stringKey(SIGNATURE_LABEL), sanitizeSignature(sig)))); + }); + } + + private void registerHistogramsAndCounters() { + taskWaitTimeHistogram = meter.histogramBuilder(METRIC_PREFIX + "task_wait_time_ms") + .setDescription("Time tasks spend waiting in queue (milliseconds)") + .ofLongs() + .build(); + + taskExecutionTimeHistogram = meter.histogramBuilder(METRIC_PREFIX + "task_execution_time_ms") + .setDescription("Task execution time (milliseconds)") + .ofLongs() + .build(); + + taskSubmittedCounter = meter.counterBuilder(METRIC_PREFIX + "task_submitted_total") + .setDescription("Total number of tasks submitted") + .build(); + + taskCompletedCounter = meter.counterBuilder(METRIC_PREFIX + "task_completed_total") + .setDescription("Total number of tasks completed") + .build(); + } + + /** + * Sanitize signature for metrics labels. + * For histogram/counter metrics that don't use tracking maps, only truncates length. + */ + private String sanitizeSignature(String signature) { + if (signature == null || signature.isEmpty()) { + return "unknown"; + } + return signature.length() > 100 ? signature.substring(0, 100) : signature; + } + + /** + * Sanitize signature for gauge metrics that use tracking maps. + * Checks if signature is already tracked, and only limits new signatures when map is full. + * + * @param signature The signature to sanitize + * @param trackingMap The map used to track this signature (chainTaskPendingCount or syncTaskPendingCount) + * @return Sanitized signature, or "other" if map is full and signature is not already tracked + */ + private String sanitizeSignature(String signature, Map trackingMap) { + if (signature == null || signature.isEmpty()) { + return "unknown"; + } + + // First truncate to get the normalized form that will be stored in map + String normalized = signature.length() > 100 ? signature.substring(0, 100) : signature; + + // If normalized signature is already tracked, always return it (to maintain label consistency) + if (trackingMap.containsKey(normalized)) { + return normalized; + } + + // Only limit new signatures when map is full + if (trackingMap.size() >= TelemetryGlobalProperty.MAX_TRACKED_SIGNATURES) { + return "other"; + } + + return normalized; + } + + @Override + public boolean isEnabled() { + return TelemetryGlobalProperty.ENABLED && TelemetryGlobalProperty.METRICS_ENABLED && initialized; + } + + @Override + public void recordThreadPoolMetrics(String poolName, int activeCount, int poolSize, int maximumPoolSize, + int queueSize, long completedTaskCount) { + if (!isEnabled()) { + return; + } + + threadPoolActiveCount.computeIfAbsent(poolName, k -> new AtomicLong()).set(activeCount); + threadPoolSize.computeIfAbsent(poolName, k -> new AtomicLong()).set(poolSize); + threadPoolMaxSize.computeIfAbsent(poolName, k -> new AtomicLong()).set(maximumPoolSize); + threadPoolQueueSize.computeIfAbsent(poolName, k -> new AtomicLong()).set(queueSize); + threadPoolCompletedCount.computeIfAbsent(poolName, k -> new AtomicLong()).set(completedTaskCount); + } + + @Override + public void recordChainTaskQueueMetrics(String signature, int pendingCount, int runningCount) { + if (!isEnabled()) { + return; + } + + String sig = sanitizeSignature(signature, chainTaskPendingCount); + chainTaskPendingCount.computeIfAbsent(sig, k -> new AtomicLong()).set(pendingCount); + chainTaskRunningCount.computeIfAbsent(sig, k -> new AtomicLong()).set(runningCount); + } + + @Override + public void recordSyncTaskQueueMetrics(String signature, int pendingCount, int runningCount) { + if (!isEnabled()) { + return; + } + + String sig = sanitizeSignature(signature, syncTaskPendingCount); + syncTaskPendingCount.computeIfAbsent(sig, k -> new AtomicLong()).set(pendingCount); + syncTaskRunningCount.computeIfAbsent(sig, k -> new AtomicLong()).set(runningCount); + } + + @Override + public void recordTaskWaitTime(String taskType, String signature, long waitTimeMs) { + if (!isEnabled() || taskWaitTimeHistogram == null) { + return; + } + + Attributes attrs = Attributes.of( + AttributeKey.stringKey(TASK_TYPE_LABEL), taskType, + AttributeKey.stringKey(SIGNATURE_LABEL), sanitizeSignature(signature)); + taskWaitTimeHistogram.record(waitTimeMs, attrs); + } + + @Override + public void recordTaskExecutionTime(String taskType, String signature, long executionTimeMs) { + if (!isEnabled() || taskExecutionTimeHistogram == null) { + return; + } + + Attributes attrs = Attributes.of( + AttributeKey.stringKey(TASK_TYPE_LABEL), taskType, + AttributeKey.stringKey(SIGNATURE_LABEL), sanitizeSignature(signature)); + taskExecutionTimeHistogram.record(executionTimeMs, attrs); + } + + @Override + public void incrementTaskSubmitted(String taskType, String signature) { + if (!isEnabled() || taskSubmittedCounter == null) { + return; + } + + Attributes attrs = Attributes.of( + AttributeKey.stringKey(TASK_TYPE_LABEL), taskType, + AttributeKey.stringKey(SIGNATURE_LABEL), sanitizeSignature(signature)); + taskSubmittedCounter.add(1, attrs); + } + + @Override + public void incrementTaskCompleted(String taskType, String signature, boolean success) { + if (!isEnabled() || taskCompletedCounter == null) { + return; + } + + Attributes attrs = Attributes.of( + AttributeKey.stringKey(TASK_TYPE_LABEL), taskType, + AttributeKey.stringKey(SIGNATURE_LABEL), sanitizeSignature(signature), + AttributeKey.stringKey(STATUS_LABEL), success ? "success" : "error"); + taskCompletedCounter.add(1, attrs); + } + + @Override + public void shutdown() { + if (meterProvider != null) { + logger.info("Shutting down telemetry metrics..."); + CompletableResultCode result = meterProvider.shutdown(); + + // Wait for shutdown to complete to ensure Prometheus HTTP server is properly closed and port is released + try { + CompletableResultCode shutdownResult = result.join( + TelemetryGlobalProperty.SHUTDOWN_TIMEOUT_MS, + TimeUnit.MILLISECONDS); + + if (!shutdownResult.isSuccess()) { + logger.warn("Telemetry metrics shutdown completed with errors: " + shutdownResult); + } else { + logger.info("Telemetry metrics shutdown completed successfully"); + } + } catch (Exception e) { + logger.warn(String.format( + "Telemetry metrics shutdown did not complete within %d ms, Prometheus HTTP server may not be properly closed", + TelemetryGlobalProperty.SHUTDOWN_TIMEOUT_MS), e); + } + meterProvider = null; + initialized = false; + } + } +} diff --git a/core/src/main/java/org/zstack/core/telemetry/TracingAspect.java b/core/src/main/java/org/zstack/core/telemetry/TracingAspect.java new file mode 100644 index 00000000000..7a266bf11df --- /dev/null +++ b/core/src/main/java/org/zstack/core/telemetry/TracingAspect.java @@ -0,0 +1,178 @@ +package org.zstack.core.telemetry; + +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.context.Scope; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.stereotype.Component; +import org.zstack.core.Platform; +import org.zstack.header.core.Traced; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Collections; +import java.util.Set; +import java.util.stream.Collectors; + +@Aspect +@Component +public class TracingAspect { + private static final CLogger logger = Utils.getLogger(TracingAspect.class); + + /** + * Parameter names that may contain sensitive data. Values are not recorded to span attributes, + * only "" is set to avoid leaking passwords, tokens, etc. + * + * Note: We use parameter name-based filtering instead of LogSafeGson's @NoLogging annotation + * mechanism for the following reasons: + * 1. LogSafeGson works on class fields (annotated with @NoLogging), but here we handle method + * parameters which cannot be annotated directly. + * 2. LogSafeGson requires objects to implement Serializable or Message interface, but method + * parameters can be of any type (primitives, String, custom objects, etc.). + * 3. LogSafeGson involves JSON serialization which is too heavyweight for tracing scenarios + * where we need lightweight, fast attribute recording. + * 4. Parameter name matching is simpler and more direct for this use case, avoiding the need + * to introspect object structures or perform serialization. + */ + private static final Set SENSITIVE_PARAM_NAMES = Collections.unmodifiableSet( + Arrays.asList( + "password", "passwd", "pwd", + "token", "accesstoken", "refreshtoken", "apitoken", + "apikey", "api_key", "secret", "secretkey", "secret_key", + "credential", "credentials", "authorization", "auth", + "privatekey", "private_key", "sessionid", "session_id", + "consolepassword", "console_password" + ).stream().map(String::toLowerCase).collect(Collectors.toSet())); + + private volatile TelemetryFacade telemetryFacade; + + private TelemetryFacade getTelemetryFacade() { + if (telemetryFacade == null && TelemetryGlobalProperty.ENABLED) { + synchronized (this) { + if (telemetryFacade == null) { + try { + telemetryFacade = Platform.getComponentLoader().getComponent(TelemetryFacade.class); + } catch (Exception e) { + logger.trace("TelemetryFacade not available", e); + } + } + } + } + return telemetryFacade; + } + + private boolean isTelemetryEnabled() { + return TelemetryGlobalProperty.ENABLED && getTelemetryFacade() != null && getTelemetryFacade().isEnabled(); + } + + @Pointcut("@annotation(org.zstack.header.core.Traced)") + public void tracedMethod() { + } + + @Around("tracedMethod()") + public Object aroundTracedMethod(ProceedingJoinPoint joinPoint) throws Throwable { + if (!isTelemetryEnabled()) { + return joinPoint.proceed(); + } + + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + Traced traced = method.getAnnotation(Traced.class); + + String operationName = buildOperationName(traced, signature, joinPoint); + + Span span = getTelemetryFacade().getTracer() + .spanBuilder(operationName) + .setSpanKind(SpanKind.INTERNAL) + .setAttribute("code.function", method.getName()) + .setAttribute("code.namespace", joinPoint.getTarget().getClass().getName()) + .startSpan(); + + addCustomAttributes(span, traced); + + if (traced.recordParameters()) { + addParameterAttributes(span, signature, joinPoint.getArgs()); + } + + try (Scope scope = span.makeCurrent()) { + Object result = joinPoint.proceed(); + span.setStatus(StatusCode.OK); + return result; + } catch (Throwable t) { + span.recordException(t); + span.setStatus(StatusCode.ERROR, t.getMessage()); + throw t; + } finally { + span.end(); + } + } + + private String buildOperationName(Traced traced, MethodSignature signature, ProceedingJoinPoint joinPoint) { + if (traced.operationName() != null && !traced.operationName().isEmpty()) { + return traced.operationName(); + } + return joinPoint.getTarget().getClass().getSimpleName() + "." + signature.getName(); + } + + private void addCustomAttributes(Span span, Traced traced) { + String attributes = traced.attributes(); + if (attributes == null || attributes.isEmpty()) { + return; + } + + for (String pair : attributes.split(",")) { + String[] kv = pair.split("=", 2); + if (kv.length == 2) { + span.setAttribute(kv[0].trim(), kv[1].trim()); + } + } + } + + private void addParameterAttributes(Span span, MethodSignature signature, Object[] args) { + String[] paramNames = signature.getParameterNames(); + if (paramNames == null || args == null) { + return; + } + + for (int i = 0; i < Math.min(paramNames.length, args.length); i++) { + if (args[i] != null) { + String paramName = paramNames[i]; + String value; + if (isSensitiveParameter(paramName)) { + value = ""; + } else { + value = safeToString(args[i]); + if (value.length() > 256) { + value = value.substring(0, 256) + "..."; + } + } + span.setAttribute("param." + paramName, value); + } + } + } + + private boolean isSensitiveParameter(String paramName) { + return paramName != null && SENSITIVE_PARAM_NAMES.contains(paramName.toLowerCase()); + } + + private String safeToString(Object obj) { + try { + if (obj instanceof String) { + return (String) obj; + } + if (obj instanceof Number || obj instanceof Boolean) { + return obj.toString(); + } + return obj.getClass().getSimpleName() + "@" + System.identityHashCode(obj); + } catch (Exception e) { + return ""; + } + } +} diff --git a/core/src/main/java/org/zstack/core/telemetry/ZStackSampler.java b/core/src/main/java/org/zstack/core/telemetry/ZStackSampler.java new file mode 100644 index 00000000000..97d054a8e24 --- /dev/null +++ b/core/src/main/java/org/zstack/core/telemetry/ZStackSampler.java @@ -0,0 +1,127 @@ +package org.zstack.core.telemetry; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.context.Context; +import io.opentelemetry.sdk.trace.data.LinkData; +import io.opentelemetry.sdk.trace.samplers.Sampler; +import io.opentelemetry.sdk.trace.samplers.SamplingDecision; +import io.opentelemetry.sdk.trace.samplers.SamplingResult; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class ZStackSampler implements Sampler { + private static final CLogger logger = Utils.getLogger(ZStackSampler.class); + + private final TelemetryGlobalProperty.Environment environment; + private final double samplingRate; + private final boolean alwaysSampleErrors; + + public ZStackSampler() { + this.environment = TelemetryGlobalProperty.Environment.fromString(TelemetryGlobalProperty.ENVIRONMENT); + this.samplingRate = TelemetryGlobalProperty.SAMPLING_RATE; + this.alwaysSampleErrors = TelemetryGlobalProperty.ALWAYS_SAMPLE_ERRORS; + + logger.info(String.format("ZStackSampler initialized: environment=%s, samplingRate=%.2f, alwaysSampleErrors=%s", + environment, getEffectiveSamplingRate(), alwaysSampleErrors)); + } + + public ZStackSampler(TelemetryGlobalProperty.Environment environment, double samplingRate, + boolean alwaysSampleErrors) { + this.environment = environment; + this.samplingRate = samplingRate; + this.alwaysSampleErrors = alwaysSampleErrors; + } + + @Override + public SamplingResult shouldSample( + Context parentContext, + String traceId, + String name, + SpanKind spanKind, + Attributes attributes, + List parentLinks) { + + if (environment.isFullSampling()) { + return SamplingResult.create(SamplingDecision.RECORD_AND_SAMPLE); + } + + // First check parent context sampling decision to maintain trace continuity + Span parentSpan = Span.fromContext(parentContext); + SpanContext parentSpanContext = parentSpan.getSpanContext(); + + // If a valid parent Span exists, respect its sampling decision + if (parentSpanContext.isValid()) { + if (parentSpanContext.isSampled()) { + // Parent Span is sampled, continue sampling to maintain trace completeness + return SamplingResult.create(SamplingDecision.RECORD_AND_SAMPLE); + } else { + // Parent Span is not sampled, drop to avoid creating orphan spans + // But if it's an error and alwaysSampleErrors is configured, still record + if (alwaysSampleErrors) { + return SamplingResult.create(SamplingDecision.RECORD_ONLY); + } + return SamplingResult.create(SamplingDecision.DROP); + } + } + + // No parent context (root span), apply local sampling rate + double effectiveRate = getEffectiveSamplingRate(); + + if (effectiveRate >= 1.0) { + return SamplingResult.create(SamplingDecision.RECORD_AND_SAMPLE); + } + + if (effectiveRate <= 0.0) { + return SamplingResult.create(SamplingDecision.DROP); + } + + boolean shouldSample = ThreadLocalRandom.current().nextDouble() < effectiveRate; + + if (shouldSample) { + return SamplingResult.create(SamplingDecision.RECORD_AND_SAMPLE); + } + + if (alwaysSampleErrors) { + return SamplingResult.create(SamplingDecision.RECORD_ONLY); + } + + return SamplingResult.create(SamplingDecision.DROP); + } + + @Override + public String getDescription() { + return String.format("ZStackSampler{environment=%s, rate=%.2f, alwaysSampleErrors=%s}", + environment, getEffectiveSamplingRate(), alwaysSampleErrors); + } + + private double getEffectiveSamplingRate() { + switch (environment) { + case DEV: + case TEST: + return 1.0; + case STAGING: + return Math.max(samplingRate, 0.1); + case PROD: + default: + return samplingRate; + } + } + + public TelemetryGlobalProperty.Environment getEnvironment() { + return environment; + } + + public double getSamplingRate() { + return samplingRate; + } + + public boolean isAlwaysSampleErrors() { + return alwaysSampleErrors; + } +} diff --git a/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java b/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java index 08aaa25644e..0197b21575a 100755 --- a/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java +++ b/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java @@ -1,12 +1,23 @@ package org.zstack.core.thread; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.Scope; import org.apache.commons.lang.StringUtils; +import org.apache.logging.log4j.ThreadContext; import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; import org.zstack.core.CoreGlobalProperty; +import org.zstack.core.Platform; import org.zstack.core.debug.DebugManager; import org.zstack.core.debug.DebugSignalHandler; +import org.zstack.core.telemetry.MessageTracingHelper; +import org.zstack.core.telemetry.TelemetryFacade; +import org.zstack.core.telemetry.TelemetryGlobalProperty; +import org.zstack.core.telemetry.TelemetryMetricsFacade; import org.zstack.header.Constants; import org.zstack.header.core.ExceptionSafe; import org.zstack.header.core.ReturnValueCompletion; @@ -42,9 +53,13 @@ class DispatchQueueImpl implements DispatchQueue, DebugSignalHandler { @Autowired private org.zstack.core.timeout.Timer zTimer; + private TelemetryFacade telemetryFacade; + private TelemetryMetricsFacade metricsFacade; + private final HashMap syncTasks = new HashMap<>(); private final Map chainTasks = Collections.synchronizedMap(new HashMap<>()); - private final Map singleFlightTasks = Collections.synchronizedMap(new HashMap<>()); + private final Map singleFlightTasks = Collections + .synchronizedMap(new HashMap<>()); private final Map> apiRunningSignature = new ConcurrentHashMap<>(); private static final CLogger _logger = CLoggerImpl.getLogger(DispatchQueueImpl.class); @@ -107,12 +122,12 @@ public void handleDebugSignal() { public void beforeCleanQueuedumpThread(String signatureName) { String title = "\n================= Before Clean Task Queue Dump ================"; - dumpSignatureNameThread(signatureName,title); + dumpSignatureNameThread(signatureName, title); } public void afterCleanQueuedumpThread(String signatureName) { String title = "\n================= After Clean Task Queue Dump ================"; - dumpSignatureNameThread(signatureName,title); + dumpSignatureNameThread(signatureName, title); } public void dumpSignatureNameThread(String signatureName, String title) { @@ -195,7 +210,7 @@ public ChainInfo cleanChainTaskInfo(String signature, Integer index, Boolean cle if (w.runningQueue.isEmpty() && w.pendingQueue.isEmpty()) { chainTasks.remove(signature); } - afterCleanQueuedumpThread(signature); + afterCleanQueuedumpThread(signature); return info; } } @@ -235,9 +250,63 @@ public DispatchQueueImpl() { DebugManager.registerDebugSignalHandler(DUMP_TASK_DEBUG_SINGAL, this); } + private TelemetryFacade getTelemetryFacade() { + if (telemetryFacade == null && TelemetryGlobalProperty.ENABLED) { + try { + telemetryFacade = Platform.getComponentLoader().getComponent(TelemetryFacade.class); + } catch (Exception e) { + logger.trace("TelemetryFacade not available", e); + } + } + return telemetryFacade; + } + + private TelemetryMetricsFacade getMetricsFacade() { + if (metricsFacade == null && TelemetryGlobalProperty.ENABLED && TelemetryGlobalProperty.METRICS_ENABLED) { + try { + metricsFacade = Platform.getComponentLoader().getComponent(TelemetryMetricsFacade.class); + } catch (Exception e) { + logger.trace("TelemetryMetricsFacade not available", e); + } + } + return metricsFacade; + } + + private boolean isMetricsEnabled() { + return TelemetryGlobalProperty.ENABLED && TelemetryGlobalProperty.METRICS_ENABLED + && getMetricsFacade() != null && getMetricsFacade().isEnabled(); + } + + private boolean isTelemetryEnabled() { + return TelemetryGlobalProperty.ENABLED && getTelemetryFacade() != null && getTelemetryFacade().isEnabled(); + } + + private Context getTraceContextFromThreadContext() { + if (!isTelemetryEnabled()) { + return null; + } + + String traceparent = ThreadContext.get(Constants.THREAD_CONTEXT_TRACEPARENT); + if (traceparent == null || traceparent.isEmpty()) { + return null; + } + + Map traceCtx = new HashMap<>(); + traceCtx.put(MessageTracingHelper.TRACEPARENT_KEY, traceparent); + String tracestate = ThreadContext.get(Constants.THREAD_CONTEXT_TRACESTATE); + if (tracestate != null && !tracestate.isEmpty()) { + traceCtx.put(MessageTracingHelper.TRACESTATE_KEY, tracestate); + } + return MessageTracingHelper.parseTraceContext(traceCtx); + } + private class SyncTaskFuture extends AbstractFuture { + private final Context parentContext; + private final long startPendingTimeMs = System.currentTimeMillis(); + public SyncTaskFuture(SyncTask task) { super(task); + this.parentContext = Context.current(); } private SyncTask getTask() { @@ -255,6 +324,71 @@ void run() { return; } + long startExecutionTimeMs = System.currentTimeMillis(); + String signature = getTask().getSyncSignature(); + boolean success = true; + + if (isMetricsEnabled()) { + getMetricsFacade().recordTaskWaitTime("SyncTask", signature, startExecutionTimeMs - startPendingTimeMs); + } + + if (!isTelemetryEnabled()) { + try { + runWithoutTracing(); + } finally { + if (isMetricsEnabled()) { + long executionTimeMs = System.currentTimeMillis() - startExecutionTimeMs; + getMetricsFacade().recordTaskExecutionTime("SyncTask", signature, executionTimeMs); + getMetricsFacade().incrementTaskCompleted("SyncTask", signature, exception == null); + } + } + return; + } + + Span span = null; + Scope scope = null; + try { + Context ctxToUse = parentContext != null ? parentContext : getTraceContextFromThreadContext(); + span = getTelemetryFacade().getTracer() + .spanBuilder("SyncTask: " + getTask().getName()) + .setSpanKind(SpanKind.INTERNAL) + .setParent(ctxToUse != null ? ctxToUse : Context.current()) + .setAttribute("sync.signature", signature) + .setAttribute("sync.task.name", getTask().getName()) + .setAttribute("sync.task.class", getTask().getClass().getName()) + .setAttribute("sync.level", getTask().getSyncLevel()) + .startSpan(); + scope = span.makeCurrent(); + + ret = (T) getTask().call(); + span.setStatus(StatusCode.OK); + } catch (Throwable t) { + _logger.warn(String.format("unhandled exception happened when calling sync task[name:%s, class:%s]", + getTask().getName(), getTask().getClass().getName()), t); + exception = t; + success = false; + if (span != null) { + span.recordException(t); + span.setStatus(StatusCode.ERROR, t.getMessage()); + } + } finally { + if (scope != null) { + scope.close(); + } + if (span != null) { + span.end(); + } + if (isMetricsEnabled()) { + long executionTimeMs = System.currentTimeMillis() - startExecutionTimeMs; + getMetricsFacade().recordTaskExecutionTime("SyncTask", signature, executionTimeMs); + getMetricsFacade().incrementTaskCompleted("SyncTask", signature, success); + } + } + + done(); + } + + private void runWithoutTracing() { try { ret = (T) getTask().call(); } catch (Throwable t) { @@ -281,10 +415,12 @@ String getName() { private abstract class AbstractTaskQueueWrapper { String syncSignature; - private final AtomicInteger abnormalPendingQueueThreshold = new AtomicInteger(CoreGlobalProperty.PENDING_QUEUE_MINIMUM_THRESHOLD); + private final AtomicInteger abnormalPendingQueueThreshold = new AtomicInteger( + CoreGlobalProperty.PENDING_QUEUE_MINIMUM_THRESHOLD); /** * make getCurrentPendingQueueThreshold() public for test + * * @return int value of abnormalPendingQueueThreshold */ public int getCurrentPendingQueueThreshold() { @@ -297,6 +433,7 @@ public int getCurrentPendingQueueThreshold() { * Next level 250 tasks use 13.67MB memory. * No big change for the memory usage and just use this mechanism to detect * system level slow executed task queue. + * * @return current pending queue threshold */ private int extendPendingQueueThresholdForNextDetection() { @@ -337,7 +474,7 @@ public void dumpTaskQueueIfNeeded(int currentPendingTaskQueueSize) { // change threshold for next abnormal report if (currentPendingTaskQueueSize > getCurrentPendingQueueThreshold()) { logger.debug(String.format("syncSignature: %s, pending queue size over abnormal limitation: %d, " + - " too many pending tasks, dump task queue for potential problem", + " too many pending tasks, dump task queue for potential problem", syncSignature, extendPendingQueueThresholdForNextDetection())); logger.debug("\n================= BEGIN ABNORMAL TASK QUEUE DUMP ================"); logger.debug(dumpTaskQueueInfo()); @@ -347,6 +484,7 @@ public void dumpTaskQueueIfNeeded(int currentPendingTaskQueueSize) { /** * dump current task queue info + * * @return String with queue description string */ protected abstract String getTaskQueueInfo(); @@ -379,9 +517,11 @@ void addTask(SyncTaskFuture task) { void startThreadIfNeeded() { if (counter.get() >= maxThreadNum) { - logger.debug(String.format("Sync task syncSignature: %s reached maxThreadNum: %s, current: %d, pending queue size: %d", - syncSignature, maxThreadNum, counter.get(), queue.size())); - dumpTaskQueueIfNeeded(queue.size()); + int pendingTaskSize = queue.size() - counter.get(); + logger.debug(String.format( + "Sync task syncSignature: %s reached maxThreadNum: %s, current: %d, pending queue size: %d", + syncSignature, maxThreadNum, counter.get(), pendingTaskSize)); + dumpTaskQueueIfNeeded(pendingTaskSize); return; } @@ -453,7 +593,6 @@ protected String getTaskQueueInfo() { task.getName(), taskId)); } - return tb.toString(); } } @@ -512,7 +651,8 @@ public boolean cancel(boolean mayInterruptIfRunning) { void singleFlightRun(final ReturnValueCompletion completion) { if (isCancelled()) { - completion.fail(err(ORG_ZSTACK_CORE_THREAD_10000, SysErrors.CANCEL_ERROR, "task failed due to cancelled")); + completion.fail( + err(ORG_ZSTACK_CORE_THREAD_10000, SysErrors.CANCEL_ERROR, "task failed due to cancelled")); return; } @@ -521,7 +661,8 @@ void singleFlightRun(final ReturnValueCompletion completion) { } catch (Throwable t) { try { if (!(t instanceof OperationFailureException)) { - _logger.warn(String.format("unhandled exception happened when calling %s", task.getClass().getName()), t); + _logger.warn(String.format("unhandled exception happened when calling %s", + task.getClass().getName()), t); } done(); @@ -546,6 +687,7 @@ String getSyncSignature() { class ChainFuture extends AbstractTimeStatisticFuture { private AtomicBoolean isNextCalled = new AtomicBoolean(false); + private volatile Throwable executionError = null; public ChainFuture(ChainTask task) { super(task); @@ -555,6 +697,10 @@ ChainTask getTask() { return (ChainTask) task; } + Throwable getExecutionError() { + return executionError; + } + @Override public boolean cancel(boolean mayInterruptIfRunning) { cancel(); @@ -585,8 +731,10 @@ public void run(final SyncTaskChain chain) { }); } catch (Throwable t) { try { + executionError = t; if (!(t instanceof OperationFailureException)) { - _logger.warn(String.format("unhandled exception happened when calling %s", task.getClass().getName()), t); + _logger.warn(String.format("unhandled exception happened when calling %s", + task.getClass().getName()), t); } done(); @@ -617,14 +765,14 @@ boolean addSingleFlightTask(SingleFlightFuture task) { if (syncSignature == null) { syncSignature = task.getSyncSignature(); } - + return true; } void startSingleFlightIfNeed() { if (taskCounter.get() > 1) { logger.debug(String.format("single flight task[signature: %s] thread is running now," + - " skip start new thread", syncSignature)); + " skip start new thread", syncSignature)); dumpTaskQueueIfNeeded(pendingQueue.size()); return; } @@ -643,7 +791,8 @@ private void runSingleFlight() { synchronized (singleFlightTasks) { if (runningTask != null) { logger.debug(String.format("single flight task[signature: %s, id: %s] is running now," + - " skip poll new running task, current pending task num: %d", runningTask.getSyncSignature(), + " skip poll new running task, current pending task num: %d", + runningTask.getSyncSignature(), runningTask.getTaskId(), pendingQueue.size())); return; } @@ -659,6 +808,13 @@ private void runSingleFlight() { processTimeoutTask(runningTask); runningTask.setStartExecutionTimeInMills(zTimer.getCurrentTimeMillis()); + + if (isMetricsEnabled()) { + long waitTimeMs = runningTask.getStartExecutionTimeInMills() + - runningTask.getStartPendingTimeInMills(); + getMetricsFacade().recordTaskWaitTime("SingleFlightTask", syncSignature, waitTimeMs); + } + runningTask.singleFlightRun(new ReturnValueCompletion(null) { @Override public void success(Object object) { @@ -674,6 +830,16 @@ public void fail(ErrorCode errorCode) { private void executeSingleRunTasks(Object object, ErrorCode errorCode) { synchronized (singleFlightTasks) { + if (isMetricsEnabled() && runningTask != null + && runningTask.getStartExecutionTimeInMills() != null) { + long executionTimeMs = zTimer.getCurrentTimeMillis() + - runningTask.getStartExecutionTimeInMills(); + boolean success = errorCode == null; + getMetricsFacade().recordTaskExecutionTime("SingleFlightTask", syncSignature, + executionTimeMs); + getMetricsFacade().incrementTaskCompleted("SingleFlightTask", syncSignature, success); + } + safeRun(object, runningTask, errorCode); pendingQueue.forEach(task -> safeRun(object, (SingleFlightFuture) task, errorCode)); @@ -699,10 +865,12 @@ private void safeRun(Object object, SingleFlightFuture flightFuture, ErrorCod return; } - _logger.warn(String.format("unhandled exception happened when calling %s", flightFuture.getClass().getName()), t); + _logger.warn(String.format("unhandled exception happened when calling %s", + flightFuture.getClass().getName()), t); } finally { logger.debug(String.format("single flight task[signature: %s, id: %s] finish with %s", - runningTask.getSyncSignature(), flightFuture.getTaskId(), JSONObjectUtil.toJsonString(result))); + runningTask.getSyncSignature(), flightFuture.getTaskId(), + JSONObjectUtil.toJsonString(result))); flightFuture.done(); } } @@ -795,13 +963,15 @@ void removeSubPendingZero(String deduplicateStr) { } void warningAndRemove(ChainFuture task, int length, int queueLength) { - logger.warn(String.format("[%s] max pending size: %d, pending now: %d, throw the task: %s!", task.getTask().getDeduplicateString(), length, queueLength, task.getTask().getName())); + logger.warn(String.format("[%s] max pending size: %d, pending now: %d, throw the task: %s!", + task.getTask().getDeduplicateString(), length, queueLength, task.getTask().getName())); removeSubPending(task.getTask().getDeduplicateString(), true); } boolean addTask(ChainFuture task, int length) { if (length != -1 && CoreGlobalProperty.CHAIN_TASK_QOS) { - DebugUtils.Assert(task.getTask().getDeduplicateString() != null, "deduplicate String must be set if max pending string has been set!"); + DebugUtils.Assert(task.getTask().getDeduplicateString() != null, + "deduplicate String must be set if max pending string has been set!"); AtomicInteger r = subPendingMap.get(task.getTask().getDeduplicateString()); int queueLength = addSubPending(task.getTask().getDeduplicateString()); if (queueLength > length) { @@ -818,7 +988,8 @@ boolean addTask(ChainFuture task, int length) { if (maxThreadNum == -1) { maxThreadNum = task.getSyncLevel(); } else if (maxThreadNum < task.getSyncLevel()) { - logger.warn(String.format("task[name:%s] increases queue[name:%s]'s sync level from %s to %s", task.getTask().getName(), task.getSyncSignature(), maxThreadNum, task.getSyncLevel())); + logger.warn(String.format("task[name:%s] increases queue[name:%s]'s sync level from %s to %s", + task.getTask().getName(), task.getSyncSignature(), maxThreadNum, task.getSyncLevel())); maxThreadNum = task.getSyncLevel(); } @@ -830,7 +1001,8 @@ boolean addTask(ChainFuture task, int length) { void startThreadIfNeeded() { if (counter.get() >= maxThreadNum) { - logger.debug(String.format("Chain task syncSignature: %s reached maxThreadNum: %s, current: %d, pending queue size: %d", + logger.debug(String.format( + "Chain task syncSignature: %s reached maxThreadNum: %s, current: %d, pending queue size: %d", syncSignature, maxThreadNum, counter.get(), pendingQueue.size())); dumpTaskQueueIfNeeded(pendingQueue.size()); return; @@ -864,6 +1036,12 @@ private void runQueue() { synchronized (runningQueue) { processTimeoutTask(cf); cf.setStartExecutionTimeInMills(zTimer.getCurrentTimeMillis()); + + if (isMetricsEnabled()) { + long waitTimeMs = cf.getStartExecutionTimeInMills() - cf.getStartPendingTimeInMills(); + getMetricsFacade().recordTaskWaitTime("ChainTask", syncSignature, waitTimeMs); + } + // add to running queue runningQueue.offer(cf); Optional.ofNullable(getApiId(cf)) @@ -876,40 +1054,127 @@ private void runQueue() { TaskContext.setTaskContext(cf.getTask().getTaskContext()); } - logger.debug(String.format("Start executing runningQueue: %s, task name: %s", syncSignature, cf.getTask().getName())); + logger.debug(String.format("Start executing runningQueue: %s, task name: %s", syncSignature, + cf.getTask().getName())); if (cf.getTask().getDeduplicateString() != null) { removeSubPending(cf.getTask().getDeduplicateString(), false); } + Span chainTaskSpan = null; + Scope scope = null; + if (isTelemetryEnabled()) { + try { + Context parentContext = getParentContextFromTask(cf); + + chainTaskSpan = getTelemetryFacade().getTracer() + .spanBuilder("ChainTask: " + cf.getTask().getName()) + .setSpanKind(SpanKind.INTERNAL) + .setParent(parentContext != null ? parentContext : Context.current()) + .setAttribute("chain.signature", syncSignature) + .setAttribute("chain.task.name", cf.getTask().getName()) + .setAttribute("chain.task.class", cf.getTask().getClass().getName()) + .startSpan(); + + scope = chainTaskSpan.makeCurrent(); + + Map newTraceCtx = MessageTracingHelper.extractTraceContext(); + if (newTraceCtx.containsKey(MessageTracingHelper.TRACEPARENT_KEY)) { + ThreadContext.put(Constants.THREAD_CONTEXT_TRACEPARENT, + newTraceCtx.get(MessageTracingHelper.TRACEPARENT_KEY)); + } + if (newTraceCtx.containsKey(MessageTracingHelper.TRACESTATE_KEY)) { + ThreadContext.put(Constants.THREAD_CONTEXT_TRACESTATE, + newTraceCtx.get(MessageTracingHelper.TRACESTATE_KEY)); + } + } catch (Exception e) { + logger.trace("Failed to create chain task span", e); + } + } + + final Span finalSpan = chainTaskSpan; + final Scope finalScope = scope; + cf.run(() -> { - synchronized (runningQueue) { - Optional.ofNullable(getApiId(cf)) - .ifPresent(apiId -> apiRunningSignature.computeIfPresent(apiId, (k, sigs) -> { - sigs.remove(syncSignature); - return sigs.isEmpty() ? null : sigs; - })); - runningQueue.remove(cf); - logger.debug(String.format("Finish executing runningQueue: %s, task name: %s", syncSignature, cf.getTask().getName())); - - if (cf.getTask().getDeduplicateString() != null) { - removeSubPendingZero(cf.getTask().getDeduplicateString()); + try { + synchronized (runningQueue) { + Optional.ofNullable(getApiId(cf)) + .ifPresent(apiId -> apiRunningSignature.computeIfPresent(apiId, (k, sigs) -> { + sigs.remove(syncSignature); + return sigs.isEmpty() ? null : sigs; + })); + runningQueue.remove(cf); + logger.debug(String.format("Finish executing runningQueue: %s, task name: %s", + syncSignature, cf.getTask().getName())); + + if (cf.getTask().getDeduplicateString() != null) { + removeSubPendingZero(cf.getTask().getDeduplicateString()); + } + } + } finally { + if (isMetricsEnabled() && cf.getStartExecutionTimeInMills() != null) { + long executionTimeMs = zTimer.getCurrentTimeMillis() + - cf.getStartExecutionTimeInMills(); + boolean success = cf.getExecutionError() == null; + getMetricsFacade().recordTaskExecutionTime("ChainTask", syncSignature, executionTimeMs); + getMetricsFacade().incrementTaskCompleted("ChainTask", syncSignature, success); + } + + if (finalSpan != null) { + try { + Throwable error = cf.getExecutionError(); + if (error != null) { + finalSpan.recordException(error); + finalSpan.setStatus(StatusCode.ERROR, error.getMessage()); + } else { + finalSpan.setStatus(StatusCode.OK); + } + finalSpan.end(); + } catch (Exception e) { + logger.trace("Failed to end chain task span", e); + } + } + if (finalScope != null) { + try { + finalScope.close(); + } catch (Exception e) { + logger.trace("Failed to close chain task scope", e); + } } } /* - Note: run queue @AsyncThread will set thread context from - current task and next task's context will not be set until - `cf.run` so the code from `runQueue()` to `cf.run` will - use a wrong api id which might be confusing. - - Manually remove thread context here to avoid this issue. + * Note: run queue @AsyncThread will set thread context from + * current task and next task's context will not be set until + * `cf.run` so the code from `runQueue()` to `cf.run` will + * use a wrong api id which might be confusing. + * + * Manually remove thread context here to avoid this issue. */ TaskContext.removeTaskContext(); runQueue(); }); } + private Context getParentContextFromTask(ChainFuture cf) { + Map threadContext = cf.getTask().getThreadContext(); + if (threadContext == null) { + return getTraceContextFromThreadContext(); + } + + String traceparent = threadContext.get(Constants.THREAD_CONTEXT_TRACEPARENT); + if (traceparent == null || traceparent.isEmpty()) { + return getTraceContextFromThreadContext(); + } + + Map traceCtx = new HashMap<>(); + traceCtx.put(MessageTracingHelper.TRACEPARENT_KEY, traceparent); + String tracestate = threadContext.get(Constants.THREAD_CONTEXT_TRACESTATE); + if (tracestate != null && !tracestate.isEmpty()) { + traceCtx.put(MessageTracingHelper.TRACESTATE_KEY, tracestate); + } + return MessageTracingHelper.parseTraceContext(traceCtx); + } private String getApiId(DispatchQueueImpl.ChainFuture cf) { Map tc = cf.getTask().getThreadContext(); @@ -972,9 +1237,10 @@ private void processTimeoutTask(AbstractTimeStatisticFuture abstractTimeStatisti timeout = (context.get("timeout") == null) ? 0 : (long) context.get("timeout"); } - if (timeout > 0 && taskInfo.getPendingTime() * 1000 > timeout){ - logger.warn(String.format("this task has been pending for %s ms longer than timeout %s ms, cancel it. task info: %s", - taskInfo.getPendingTime()*1000, timeout, taskInfo)); + if (timeout > 0 && taskInfo.getPendingTime() * 1000 > timeout) { + logger.warn(String.format( + "this task has been pending for %s ms longer than timeout %s ms, cancel it. task info: %s", + taskInfo.getPendingTime() * 1000, timeout, taskInfo)); abstractTimeStatisticFuture.cancel(true); } } @@ -995,7 +1261,8 @@ private Future doChainSyncSubmit(final ChainTask task) { boolean succeed = wrapper.addTask(cf, task.getMaxPendingTasks()); if (!succeed) { cf.cancel(); - logger.debug(String.format("Pending queue[%s] exceed max size, task name: %s, start execute callback", task.getSyncSignature(), task.getName())); + logger.debug(String.format("Pending queue[%s] exceed max size, task name: %s, start execute callback", + task.getSyncSignature(), task.getName())); task.exceedMaxPendingCallback(); } else { wrapper.startThreadIfNeeded(); @@ -1004,7 +1271,6 @@ private Future doChainSyncSubmit(final ChainTask task) { } } - @Override public Future chainSubmit(ChainTask task) { return doChainSyncSubmit(task); @@ -1016,7 +1282,8 @@ public Future singleFlightSubmit(SingleFlightTask task) { } private Future doSingleFlightSyncSubmit(SingleFlightTask task) { - assert task.getSyncSignature() != null : "How can you submit a single flight chain task without sync signature ???"; + assert task.getSyncSignature() != null + : "How can you submit a single flight chain task without sync signature ???"; synchronized (singleFlightTasks) { final String signature = task.getSyncSignature(); @@ -1042,8 +1309,7 @@ public Map getSyncTaskStatistics() { wrapper.syncSignature, wrapper.maxThreadNum, wrapper.counter.intValue(), - wrapper.queue.size() - ); + wrapper.queue.size()); ret.put(statistic.getSyncSignature(), statistic); logger.warn(JSONObjectUtil.toJsonString(statistic)); @@ -1055,15 +1321,14 @@ public Map getSyncTaskStatistics() { @Override public Map getChainTaskStatistics() { - Map ret = new ConcurrentHashMap<>(); + Map ret = new ConcurrentHashMap<>(); synchronized (chainTasks) { for (ChainTaskQueueWrapper wrapper : chainTasks.values()) { ChainTaskStatistic statistic = new ChainTaskStatistic( wrapper.syncSignature, wrapper.maxThreadNum, wrapper.counter.intValue(), - wrapper.pendingQueue.size() - ); + wrapper.pendingQueue.size()); ret.put(statistic.getSyncSignature(), statistic); } } diff --git a/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java b/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java index 04a81cc84c8..2ee713f7723 100755 --- a/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java @@ -1,8 +1,17 @@ package org.zstack.core.thread; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.Scope; import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.Platform; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.jmx.JmxFacade; +import org.zstack.core.telemetry.TelemetryFacade; +import org.zstack.core.telemetry.TelemetryGlobalProperty; +import org.zstack.core.telemetry.TelemetryMetricsFacade; import org.zstack.header.core.progress.ChainInfo; import org.zstack.header.core.progress.SingleFlightChainInfo; import org.zstack.header.exception.CloudRuntimeException; @@ -32,6 +41,88 @@ public class ThreadFacadeImpl implements ThreadFacade, ThreadFactory, RejectedEx private JmxFacade jmxf; @Autowired private PluginRegistry pluginRegistry; + + private volatile TelemetryFacade telemetryFacade; + private volatile TelemetryMetricsFacade metricsFacade; + + private TelemetryFacade getTelemetryFacade() { + if (telemetryFacade == null && TelemetryGlobalProperty.ENABLED) { + synchronized (this) { + if (telemetryFacade == null) { + try { + telemetryFacade = Platform.getComponentLoader().getComponent(TelemetryFacade.class); + } catch (Exception e) { + _logger.trace("TelemetryFacade not available", e); + } + } + } + } + return telemetryFacade; + } + + private boolean isTelemetryEnabled() { + return TelemetryGlobalProperty.ENABLED && getTelemetryFacade() != null && getTelemetryFacade().isEnabled(); + } + + private TelemetryMetricsFacade getMetricsFacade() { + if (metricsFacade == null && TelemetryGlobalProperty.ENABLED && TelemetryGlobalProperty.METRICS_ENABLED) { + synchronized (this) { + if (metricsFacade == null) { + try { + metricsFacade = Platform.getComponentLoader().getComponent(TelemetryMetricsFacade.class); + } catch (Exception e) { + _logger.trace("TelemetryMetricsFacade not available", e); + } + } + } + } + return metricsFacade; + } + + private boolean isMetricsEnabled() { + return TelemetryGlobalProperty.ENABLED && TelemetryGlobalProperty.METRICS_ENABLED + && getMetricsFacade() != null && getMetricsFacade().isEnabled(); + } + + private void collectAndReportMetrics() { + TelemetryMetricsFacade metrics = getMetricsFacade(); + if (metrics == null || !metrics.isEnabled()) { + return; + } + + metrics.recordThreadPoolMetrics("main", + _pool.getActiveCount(), + _pool.getPoolSize(), + _pool.getMaximumPoolSize(), + _pool.getQueue().size(), + _pool.getCompletedTaskCount()); + + metrics.recordThreadPoolMetrics("sync", + _syncpool.getActiveCount(), + _syncpool.getPoolSize(), + _syncpool.getMaximumPoolSize(), + _syncpool.getQueue().size(), + _syncpool.getCompletedTaskCount()); + + pools.forEach((name, pool) -> { + metrics.recordThreadPoolMetrics(name, + pool.getActiveCount(), + pool.getPoolSize(), + pool.getMaximumPoolSize(), + pool.getQueue().size(), + pool.getCompletedTaskCount()); + }); + + Map chainStats = dpq.getChainTaskStatistics(); + chainStats.forEach((sig, stat) -> { + metrics.recordChainTaskQueueMetrics(sig, (int) stat.getPendingTaskNum(), stat.getCurrentRunningThreadNum()); + }); + + Map syncStats = dpq.getSyncTaskStatistics(); + syncStats.forEach((sig, stat) -> { + metrics.recordSyncTaskQueueMetrics(sig, (int) stat.getPendingTaskNum(), stat.getCurrentRunningThreadNum()); + }); + } private static class TimerWrapper extends Timer { private int cancelledTimerTaskCount = 0; @@ -126,6 +217,71 @@ public T call() throws Exception { } } + + private class TracedWorker implements Callable { + private final Task task; + private final Context parentContext; + + TracedWorker(Task task) { + this.task = task; + this.parentContext = Context.current(); + } + + @Override + public T call() throws Exception { + if (!isTelemetryEnabled()) { + return executeTask(); + } + + Span span = null; + Scope scope = null; + try { + span = getTelemetryFacade().getTracer() + .spanBuilder("Task: " + task.getName()) + .setSpanKind(SpanKind.INTERNAL) + .setParent(parentContext) + .setAttribute("task.name", task.getName()) + .setAttribute("task.class", task.getClass().getName()) + .startSpan(); + scope = span.makeCurrent(); + + T result = executeTask(); + span.setStatus(StatusCode.OK); + return result; + } catch (Exception e) { + if (span != null) { + span.recordException(e); + span.setStatus(StatusCode.ERROR, e.getMessage()); + } + throw e; + } catch (Throwable t) { + if (span != null) { + span.recordException(t); + span.setStatus(StatusCode.ERROR, t.getMessage()); + } + throw new CloudRuntimeException(task.getName() + " throws out an unhandled throwable", t); + } finally { + if (scope != null) { + scope.close(); + } + if (span != null) { + span.end(); + } + } + } + + private T executeTask() throws Exception { + try { + return task.call(); + } catch (Exception e) { + _logger.warn(task.getName() + " throws out an unhandled exception, this thread will terminate immediately", e); + throw e; + } catch (Throwable t) { + _logger.warn(task.getName() + " throws out an unhandled throwable, this thread will terminate immediately", t); + throw new CloudRuntimeException(task.getName() + " throws out an unhandled throwable, this thread will terminate immediately", t); + } + } + } @Override public int getSyncThreadNum(int totalThreadNum) { @@ -164,16 +320,25 @@ public void destroy() { @Override public Future submit(Task task) { _logger.trace(String.format("submit task: %s", task.getName())); + if (isTelemetryEnabled()) { + return _pool.submit(new TracedWorker(task)); + } return _pool.submit(new Worker(task)); } public Future submitSyncPool(Task task) { + if (isTelemetryEnabled()) { + return _syncpool.submit(new TracedWorker(task)); + } return _syncpool.submit(new Worker(task)); } @Override public Future submitTargetPool(Task task, String signature) { ScheduledThreadPoolExecutorExt executorExt = pools.getOrDefault(signature, _syncpool); + if (isTelemetryEnabled()) { + return executorExt.submit(new TracedWorker<>(task)); + } return executorExt.submit(new Worker<>(task)); } @@ -199,6 +364,52 @@ public Future submitPeriodicTask(final PeriodicTask task, long delay) { @SuppressWarnings("unchecked") ScheduledFuture ret = (ScheduledFuture) _pool.scheduleAtFixedRate(new Runnable() { public void run() { + if (!isTelemetryEnabled()) { + runWithoutTracing(); + return; + } + + Span span = null; + Scope scope = null; + try { + span = getTelemetryFacade().getTracer() + .spanBuilder("PeriodicTask: " + task.getName()) + .setSpanKind(SpanKind.INTERNAL) + .setAttribute("periodic.task.name", task.getName()) + .setAttribute("periodic.task.class", task.getClass().getName()) + .setAttribute("periodic.interval", task.getInterval()) + .setAttribute("periodic.time_unit", task.getTimeUnit().toString()) + .startSpan(); + scope = span.makeCurrent(); + + task.run(); + span.setStatus(StatusCode.OK); + } catch (Throwable e) { + if (span != null) { + span.recordException(e); + span.setStatus(StatusCode.ERROR, e.getMessage()); + } + _logger.warn("An unhandled exception happened during executing periodic task: " + task.getName() + ", cancel it", e); + final Map> periodicTasks = getPeriodicTasks(); + final ScheduledFuture ft = periodicTasks.get(task); + if (ft != null) { + ft.cancel(true); + periodicTasks.remove(task); + } else { + _logger.warn("Not found feature for task " + task.getName() + + ", the exception happened too soon, will try to cancel the task next time the exception happens"); + } + } finally { + if (scope != null) { + scope.close(); + } + if (span != null) { + span.end(); + } + } + } + + private void runWithoutTracing() { try { task.run(); } catch (Throwable e) { @@ -376,9 +587,28 @@ public boolean start() { separatedThreadNum, internalThreadNum)); poolList.forEach(this::initThreadPool); + + startMetricsCollection(); return true; } + + private void startMetricsCollection() { + if (!TelemetryGlobalProperty.ENABLED || !TelemetryGlobalProperty.METRICS_ENABLED) { + return; + } + + int intervalSeconds = TelemetryGlobalProperty.METRICS_COLLECTION_INTERVAL_SECONDS; + _logger.info(String.format("Starting metrics collection with interval %d seconds", intervalSeconds)); + + _pool.scheduleAtFixedRate(() -> { + try { + collectAndReportMetrics(); + } catch (Throwable e) { + _logger.trace("Error collecting metrics", e); + } + }, intervalSeconds, intervalSeconds, TimeUnit.SECONDS); + } @Override public boolean stop() { @@ -413,6 +643,49 @@ private void cancelTask() { } public void run() { + if (!isTelemetryEnabled()) { + runWithoutTracing(); + return; + } + + Span span = null; + Scope scope = null; + try { + span = getTelemetryFacade().getTracer() + .spanBuilder("CancelablePeriodicTask: " + task.getName()) + .setSpanKind(SpanKind.INTERNAL) + .setAttribute("periodic.task.name", task.getName()) + .setAttribute("periodic.task.class", task.getClass().getName()) + .setAttribute("periodic.interval", task.getInterval()) + .setAttribute("periodic.time_unit", task.getTimeUnit().toString()) + .setAttribute("periodic.cancelable", true) + .startSpan(); + scope = span.makeCurrent(); + + boolean cancel = task.run(); + if (cancel) { + span.setAttribute("periodic.cancelled", true); + cancelTask(); + } + span.setStatus(StatusCode.OK); + } catch (Throwable e) { + if (span != null) { + span.recordException(e); + span.setStatus(StatusCode.ERROR, e.getMessage()); + } + _logger.warn("An unhandled exception happened during executing periodic task: " + task.getName() + ", cancel it", e); + cancelTask(); + } finally { + if (scope != null) { + scope.close(); + } + if (span != null) { + span.end(); + } + } + } + + private void runWithoutTracing() { try { boolean cancel = task.run(); if (cancel) { diff --git a/core/src/main/java/org/zstack/core/workflow/SimpleFlowChain.java b/core/src/main/java/org/zstack/core/workflow/SimpleFlowChain.java index e326f4f654b..dd5c326913e 100755 --- a/core/src/main/java/org/zstack/core/workflow/SimpleFlowChain.java +++ b/core/src/main/java/org/zstack/core/workflow/SimpleFlowChain.java @@ -1,5 +1,10 @@ package org.zstack.core.workflow; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.Scope; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; @@ -8,6 +13,8 @@ import org.zstack.core.CoreGlobalProperty; import org.zstack.core.Platform; import org.zstack.core.errorcode.ErrorFacade; +import org.zstack.core.telemetry.TelemetryFacade; +import org.zstack.core.telemetry.TelemetryGlobalProperty; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.OperationFailureException; @@ -69,8 +76,165 @@ public class SimpleFlowChain implements FlowTrigger, FlowRollback, FlowChain, Fl private static final Map statistics = new ConcurrentHashMap<>(); + private static volatile TelemetryFacade telemetryFacade; + private Span chainSpan; + private Scope chainScope; + private Span currentFlowSpan; + private Scope currentFlowScope; + private Context chainContext; + + private static TelemetryFacade getTelemetryFacade() { + if (telemetryFacade == null && TelemetryGlobalProperty.ENABLED) { + synchronized (SimpleFlowChain.class) { + if (telemetryFacade == null) { + try { + telemetryFacade = Platform.getComponentLoader().getComponent(TelemetryFacade.class); + } catch (Exception e) { + logger.trace("TelemetryFacade not available", e); + } + } + } + } + return telemetryFacade; + } + + private static boolean isTelemetryEnabled() { + return TelemetryGlobalProperty.ENABLED && getTelemetryFacade() != null && getTelemetryFacade().isEnabled(); + } + + private void startChainSpan() { + if (!isTelemetryEnabled()) { + return; + } + + try { + chainContext = Context.current(); + chainSpan = getTelemetryFacade().getTracer() + .spanBuilder("FlowChain: " + (name != null ? name : "anonymous")) + .setSpanKind(SpanKind.INTERNAL) + .setAttribute("flowchain.id", id) + .setAttribute("flowchain.name", name != null ? name : "anonymous") + .setAttribute("flowchain.flow_count", flows.size()) + .startSpan(); + chainScope = chainSpan.makeCurrent(); + } catch (Exception e) { + logger.trace("Failed to start chain span", e); + } + } + + private void endChainSpan(boolean success) { + if (!isTelemetryEnabled() || chainSpan == null) { + return; + } + + try { + if (success) { + chainSpan.setStatus(StatusCode.OK); + } else { + chainSpan.setStatus(StatusCode.ERROR, errorCode != null ? errorCode.toString() : "unknown error"); + if (errorCode != null) { + chainSpan.setAttribute("error.code", errorCode.getCode()); + chainSpan.setAttribute("error.description", + errorCode.getDescription() != null ? errorCode.getDescription() : ""); + } + } + } catch (Exception e) { + logger.trace("Failed to set chain span status", e); + } finally { + try { + if (chainScope != null) { + chainScope.close(); + } + if (chainSpan != null) { + chainSpan.end(); + } + } catch (Exception e) { + logger.trace("Failed to end chain span", e); + } + } + } + + private void startFlowSpan(Flow flow) { + if (!isTelemetryEnabled()) { + return; + } + + endCurrentFlowSpan(true); + + try { + String flowName = getFlowNameWithoutLocation(flow); + currentFlowSpan = getTelemetryFacade().getTracer() + .spanBuilder("Flow: " + flowName) + .setSpanKind(SpanKind.INTERNAL) + .setAttribute("flow.name", flowName) + .setAttribute("flow.class", flow.getClass().getName()) + .setAttribute("flow.index", currentLoop) + .setAttribute("flowchain.id", id) + .startSpan(); + currentFlowScope = currentFlowSpan.makeCurrent(); + } catch (Exception e) { + logger.trace("Failed to start flow span", e); + } + } + + private void endCurrentFlowSpan(boolean success) { + if (!isTelemetryEnabled() || currentFlowSpan == null) { + return; + } + + try { + if (success) { + currentFlowSpan.setStatus(StatusCode.OK); + } else { + currentFlowSpan.setStatus(StatusCode.ERROR, errorCode != null ? errorCode.toString() : "failed"); + if (errorCode != null) { + currentFlowSpan.setAttribute("error.code", errorCode.getCode()); + } + } + } catch (Exception e) { + logger.trace("Failed to set flow span status", e); + } finally { + try { + if (currentFlowScope != null) { + currentFlowScope.close(); + currentFlowScope = null; + } + if (currentFlowSpan != null) { + currentFlowSpan.end(); + currentFlowSpan = null; + } + } catch (Exception e) { + logger.trace("Failed to end flow span", e); + } + } + } + + private void startRollbackSpan(Flow flow) { + if (!isTelemetryEnabled()) { + return; + } + + endCurrentFlowSpan(false); + + try { + String flowName = getFlowNameWithoutLocation(flow); + currentFlowSpan = getTelemetryFacade().getTracer() + .spanBuilder("Rollback: " + flowName) + .setSpanKind(SpanKind.INTERNAL) + .setAttribute("flow.name", flowName) + .setAttribute("flow.class", flow.getClass().getName()) + .setAttribute("flow.rollback", true) + .setAttribute("flowchain.id", id) + .startSpan(); + currentFlowScope = currentFlowSpan.makeCurrent(); + } catch (Exception e) { + logger.trace("Failed to start rollback span", e); + } + } + private class FlowStopWatch { Map beginTime = new HashMap<>(); + void start(Flow flow) { long btime = System.currentTimeMillis(); if (currentFlow != null) { @@ -106,6 +270,7 @@ void stop() { private FlowStopWatch stopWatch; private boolean allowWatch = false; + public void allowWatch() { this.allowWatch = true; if (stopWatch == null) { @@ -219,13 +384,13 @@ public SimpleFlowChain then(Flow flow) { } public SimpleFlowChain ctxHandler(FlowContextHandler handler) { - DebugUtils.Assert(contextHandler==null, "there has been an FlowContextHandler installed"); + DebugUtils.Assert(contextHandler == null, "there has been an FlowContextHandler installed"); contextHandler = handler; return this; } public SimpleFlowChain error(FlowErrorHandler handler) { - DebugUtils.Assert(errorHandler==null, "there has been an FlowErrorHandler installed"); + DebugUtils.Assert(errorHandler == null, "there has been an FlowErrorHandler installed"); errorHandler = handler; return this; } @@ -243,7 +408,7 @@ public FlowChain setData(Map data) { } @Override - public FlowChain putData(Entry...es) { + public FlowChain putData(Entry... es) { for (Map.Entry e : es) { data.put(e.getKey(), e.getValue()); } @@ -274,7 +439,7 @@ public Map getData() { @Override public SimpleFlowChain done(FlowDoneHandler handler) { - DebugUtils.Assert(doneHandler==null, "there has been a FlowDoneHandler installed"); + DebugUtils.Assert(doneHandler == null, "there has been a FlowDoneHandler installed"); doneHandler = handler; return this; } @@ -321,7 +486,8 @@ private void runFlow(Flow flow) { flowClassName = currentFlow.getClass().getName(); } - throw new CloudRuntimeException(String.format("flow[%s:%s] opened a transaction but forgot closing it", flowClassName, flowName)); + throw new CloudRuntimeException(String.format("flow[%s:%s] opened a transaction but forgot closing it", + flowClassName, flowName)); } Flow toRun = null; @@ -329,7 +495,8 @@ private void runFlow(Flow flow) { toRun = flowMarshaller.marshalTheNextFlow(currentFlow == null ? null : currentFlow.getClass().getName(), flow.getClass().getName(), this, data); if (toRun != null) { - printDebugLog(String.format("[FlowChain(%s): %s] FlowMarshaller[%s] replaces the next flow[%s] to the flow[%s]", + printDebugLog(String.format( + "[FlowChain(%s): %s] FlowMarshaller[%s] replaces the next flow[%s] to the flow[%s]", id, name, flowMarshaller.getClass(), flow.getClass(), toRun.getClass())); } } @@ -344,6 +511,8 @@ private void runFlow(Flow flow) { currentFlow = toRun; + startFlowSpan(toRun); + String flowName = getFlowName(currentFlow); String info = String.format("[FlowChain(%s): %s] start executing flow[%s]", id, name, flowName); printDebugLog(info); @@ -351,7 +520,8 @@ private void runFlow(Flow flow) { collectAfterRunnable(toRun); if (preCheck != null) { - printDebugLog(String.format("[FlowChain(%s): %s] start executing pre-check for flow[%s]", id, name, flowName)); + printDebugLog(String.format("[FlowChain(%s): %s] start executing pre-check for flow[%s]", id, name, + flowName)); ErrorCode err = preCheck.apply(data); if (err != null) { @@ -361,7 +531,8 @@ private void runFlow(Flow flow) { } if (isSkipFlow(toRun)) { - printDebugLog(String.format("[FlowChain(%s): %s] skip flow[%s] because it's skip() returns true", id, name, flowName)); + printDebugLog(String.format("[FlowChain(%s): %s] skip flow[%s] because it's skip() returns true", id, + name, flowName)); skippedFlows.add(toRun); this.next(); } else { @@ -384,8 +555,10 @@ private void runFlow(Flow flow) { fail(fe.getErrorCode()); } catch (Throwable t) { logger.warn(String.format("unhandled exception call backtrace %s", DebugUtils.getStackTrace(t))); - logger.warn(String.format("[FlowChain(%s): %s] unhandled exception when executing flow[%s], start to rollback", - id, name, flow.getClass().getName()), t); + logger.warn( + String.format("[FlowChain(%s): %s] unhandled exception when executing flow[%s], start to rollback", + id, name, flow.getClass().getName()), + t); fail(inerr(ORG_ZSTACK_CORE_WORKFLOW_10001, t.getMessage())); } } @@ -394,7 +567,9 @@ private void rollbackFlow(Flow flow) { try { printDebugLog(String.format("[FlowChain(%s): %s] start to rollback flow[%s]", id, name, getFlowName(flow))); - currentLoop --; + startRollbackSpan(flow); + + currentLoop--; if (contextHandler != null) { if (contextHandler.skipRollback(this.getErrorCode())) { @@ -404,15 +579,17 @@ private void rollbackFlow(Flow flow) { } } - if (skippedFlows.contains(flow)) { - printDebugLog(String.format("[FlowChain(%s): %s] skip rollback flow[%s] because it's skip() returns true", id, name, getFlowName(flow))); + printDebugLog( + String.format("[FlowChain(%s): %s] skip rollback flow[%s] because it's skip() returns true", id, + name, getFlowName(flow))); rollback(); } else { flow.rollback(this, data); } } catch (Throwable t) { - logger.warn(String.format("unhandled exception when rollback, call backtrace %s", DebugUtils.getStackTrace(t))); + logger.warn( + String.format("unhandled exception when rollback, call backtrace %s", DebugUtils.getStackTrace(t))); logger.warn(String.format("[FlowChain(%s): %s] unhandled exception when rollback flow[%s]," + " continue to next rollback", id, name, flow.getClass().getSimpleName()), t); rollback(); @@ -420,8 +597,11 @@ private void rollbackFlow(Flow flow) { } private void callErrorHandler(boolean info) { + endCurrentFlowSpan(false); + if (info) { - printDebugLog(String.format("[FlowChain(%s): %s] rolled back all flows because error%s", id, name, errorCode)); + printDebugLog( + String.format("[FlowChain(%s): %s] rolled back all flows because error%s", id, name, errorCode)); } if (errorHandler != null) { @@ -448,6 +628,7 @@ public void run(Runnable arg) { } } + endChainSpan(false); callFinallyHandler(); } @@ -474,7 +655,7 @@ private String getFlowName(Flow flow) { if (logger.isTraceEnabled()) { String className = flow.getClass().getName(); String[] ff = className.split("\\."); - String filename = ff[ff.length-1]; + String filename = ff[ff.length - 1]; if (filename.contains("$")) { int index = filename.indexOf("$"); filename = filename.substring(0, index); @@ -499,12 +680,13 @@ public void rollback() { } if (skipRestRollbacks) { - List restRollbackNames = CollectionUtils.transformToList(rollBackFlows, new Function() { - @Override - public String call(Flow arg) { - return arg.getClass().getSimpleName(); - } - }); + List restRollbackNames = CollectionUtils.transformToList(rollBackFlows, + new Function() { + @Override + public String call(Flow arg) { + return arg.getClass().getSimpleName(); + } + }); printDebugLog(String.format("[FlowChain(%s): %s] we are instructed to skip rollbacks for remaining flows%s", id, name, restRollbackNames)); @@ -567,6 +749,8 @@ public void run(Runnable arg) { } private void callDoneHandler() { + endCurrentFlowSpan(true); + if (CoreGlobalProperty.PROFILER_WORKFLOW || allowWatch) { stopWatch.stop(); } @@ -597,6 +781,7 @@ public void run(Runnable arg) { } } + endChainSpan(true); callFinallyHandler(); } @@ -618,7 +803,7 @@ private boolean isSkipFlow(Flow flow) { private void runFlowOrComplete() { if (it.hasNext()) { - currentLoop ++; + currentLoop++; runFlow(it.next()); } else { if (getErrorCode() == null) { @@ -664,7 +849,8 @@ public void start() { } if (flows.isEmpty()) { - throw new CloudRuntimeException("you must call then() to add flow before calling start() or allowEmptyFlow() to run empty flow chain on purpose"); + throw new CloudRuntimeException( + "you must call then() to add flow before calling start() or allowEmptyFlow() to run empty flow chain on purpose"); } if (data == null) { @@ -676,6 +862,8 @@ public void start() { name = "anonymous-chain"; } + startChainSpan(); + printDebugLog(String.format("[FlowChain(%s): %s] starts", id, name)); if (logger.isTraceEnabled() && enableDebugLog) { diff --git a/docs/TELEMETRY_SPECIFICATION.md b/docs/TELEMETRY_SPECIFICATION.md new file mode 100644 index 00000000000..74d411f6664 --- /dev/null +++ b/docs/TELEMETRY_SPECIFICATION.md @@ -0,0 +1,1167 @@ +# ZStack Telemetry Specification + +Version: 1.0.0 +Last Updated: 2026-01-24 + +## Overview + +This specification defines the distributed tracing standards for ZStack and its agents (Python, Go, etc.). All implementations MUST follow this specification to ensure trace context propagation works correctly across the entire system. + +--- + +## 1. Context Propagation + +### 1.1 W3C Trace Context Standard + +All components MUST use [W3C Trace Context](https://www.w3.org/TR/trace-context/) for context propagation. + +#### HTTP Headers + +| Header | Required | Description | +|--------|----------|-------------| +| `traceparent` | YES | Contains trace-id, parent-id, and trace-flags | +| `tracestate` | NO | Vendor-specific trace data | + +#### traceparent Format + +``` +traceparent: {version}-{trace-id}-{parent-id}-{trace-flags} +``` + +Example: +``` +traceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01 +``` + +| Field | Length | Description | +|-------|--------|-------------| +| version | 2 chars | Always "00" | +| trace-id | 32 chars | Hex-encoded 128-bit trace ID | +| parent-id | 16 chars | Hex-encoded 64-bit span ID | +| trace-flags | 2 chars | "00" = not sampled, "01" = sampled | + +#### tracestate Format + +``` +tracestate: key1=value1,key2=value2 +``` + +### 1.2 Message Context (Internal CloudBus) + +For internal message passing (CloudBus), trace context is stored in: + +| Location | Key | Value | +|----------|-----|-------| +| ThreadContext | `traceparent` | W3C traceparent string | +| ThreadContext | `tracestate` | W3C tracestate string | +| Message Headers | `__trace__` | Map with traceparent/tracestate | + +--- + +## 2. Span Structure + +### 2.1 Span Kinds + +| SpanKind | Use Case | +|----------|----------| +| `SERVER` | Receiving HTTP requests (API entry points) | +| `CLIENT` | Making HTTP requests (to agents) | +| `INTERNAL` | Internal operations (ChainTask, SyncTask, @Traced methods) | +| `PRODUCER` | Sending async messages (CloudBus.send) | +| `CONSUMER` | Receiving async messages (Message handlers) | + +### 2.2 Required Spans + +#### 2.2.1 API Entry (SERVER span) + +**When**: HTTP request received at REST API endpoint + +**Span Name**: `API {HTTP_METHOD} {PATH}` + +**Required Attributes**: +| Attribute | Type | Example | +|-----------|------|---------| +| `http.method` | string | "POST" | +| `http.url` | string | "http://localhost:8080/v1/vm-instances" | +| `http.path` | string | "/v1/vm-instances" | +| `http.status_code` | int | 200 | +| `http.client_ip` | string | "192.168.1.100" | +| `net.peer.ip` | string | "192.168.1.100" | + +**Context Extraction**: Extract `traceparent`/`tracestate` from HTTP headers. + +#### 2.2.2 HTTP Client (CLIENT span) + +**When**: Making HTTP request to agent + +**Span Name**: `HTTP {METHOD}` or `HTTP {METHOD} {TARGET_SERVICE}` + +**Required Attributes**: +| Attribute | Type | Example | +|-----------|------|---------| +| `http.method` | string | "POST" | +| `http.url` | string | "http://agent:7070/host/connect" | +| `http.host` | string | "agent" | +| `http.path` | string | "/host/connect" | +| `http.status_code` | int | 200 | +| `net.peer.name` | string | "agent" | +| `net.peer.port` | int | 7070 | + +**Context Injection**: Inject `traceparent`/`tracestate` into HTTP headers. + +#### 2.2.3 ChainTask (INTERNAL span) + +**When**: Executing ChainTask in DispatchQueue + +**Span Name**: `ChainTask: {TASK_NAME}` + +**Required Attributes**: +| Attribute | Type | Example | +|-----------|------|---------| +| `chain.signature` | string | "vm-start-queue" | +| `chain.task.name` | string | "StartVmInstance" | +| `chain.task.class` | string | "org.zstack.compute.vm.VmStartTask" | + +#### 2.2.4 FlowChain (INTERNAL span) + +**When**: Executing a FlowChain (workflow orchestration) + +**Span Name**: `FlowChain: {CHAIN_NAME}` + +**Required Attributes**: +| Attribute | Type | Example | +|-----------|------|---------| +| `flowchain.id` | string | "FCID_a1b2c3d4" | +| `flowchain.name` | string | "CreateVmInstance" | +| `flowchain.flow_count` | int | 8 | + +**Child Spans**: +- Each Flow in the chain creates a child INTERNAL span +- Rollback operations create separate spans with `flow.rollback=true` + +#### 2.2.5 Flow (INTERNAL span) + +**When**: Executing individual Flow within a FlowChain + +**Span Name**: `Flow: {FLOW_NAME}` + +**Required Attributes**: +| Attribute | Type | Example | +|-----------|------|---------| +| `flow.name` | string | "AllocateHostFlow" | +| `flow.class` | string | "org.zstack.compute.allocator.AllocateHostFlow" | +| `flow.index` | int | 3 | +| `flowchain.id` | string | "FCID_a1b2c3d4" | + +#### 2.2.6 Rollback Flow (INTERNAL span) + +**When**: Rolling back a Flow after failure + +**Span Name**: `Rollback: {FLOW_NAME}` + +**Required Attributes**: +| Attribute | Type | Example | +|-----------|------|---------| +| `flow.name` | string | "AllocateHostFlow" | +| `flow.class` | string | "org.zstack.compute.allocator.AllocateHostFlow" | +| `flow.rollback` | boolean | true | +| `flowchain.id` | string | "FCID_a1b2c3d4" | + +#### 2.2.7 SyncTask (INTERNAL span) + +**When**: Executing SyncTask in DispatchQueue + +**Span Name**: `SyncTask: {TASK_NAME}` + +**Required Attributes**: +| Attribute | Type | Example | +|-----------|------|---------| +| `sync.signature` | string | "vm-state-sync" | +| `sync.task.name` | string | "SyncVmState" | +| `sync.task.class` | string | "org.zstack.compute.vm.VmStateSyncTask" | +| `sync.level` | int | 5 | + +#### 2.2.8 Task (INTERNAL span) + +**When**: Executing general Task via ThreadFacade.submit() + +**Span Name**: `Task: {TASK_NAME}` + +**Required Attributes**: +| Attribute | Type | Example | +|-----------|------|---------| +| `task.name` | string | "AsyncHttpCallback" | +| `task.class` | string | "org.zstack.core.rest.HttpCallbackTask" | + +#### 2.2.9 PeriodicTask (INTERNAL span) + +**When**: Executing scheduled periodic task + +**Span Name**: `PeriodicTask: {TASK_NAME}` + +**Required Attributes**: +| Attribute | Type | Example | +|-----------|------|---------| +| `periodic.task.name` | string | "HeartbeatCheck" | +| `periodic.task.class` | string | "org.zstack.core.host.HeartbeatChecker" | +| `periodic.interval` | long | 30 | +| `periodic.time_unit` | string | "SECONDS" | + +#### 2.2.10 CancelablePeriodicTask (INTERNAL span) + +**When**: Executing cancelable periodic task + +**Span Name**: `CancelablePeriodicTask: {TASK_NAME}` + +**Required Attributes**: +| Attribute | Type | Example | +|-----------|------|---------| +| `periodic.task.name` | string | "PollingTask" | +| `periodic.task.class` | string | "org.zstack.core.polling.PollingTask" | +| `periodic.interval` | long | 5 | +| `periodic.time_unit` | string | "SECONDS" | +| `periodic.cancelable` | boolean | true | +| `periodic.cancelled` | boolean | false (set to true if cancelled) | + +--- + +## 3. Agent Implementation (Python/Go) + +### 3.1 HTTP Server (Agent Receiving Requests) + +When agent receives HTTP request from management node: + +1. **Extract Context**: Parse `traceparent`/`tracestate` from HTTP headers +2. **Create SERVER Span**: With extracted context as parent +3. **Execute Handler**: Within span scope +4. **Set Status**: OK or ERROR based on result +5. **End Span** + +```python +# Python Example +from opentelemetry import trace +from opentelemetry.trace import SpanKind, StatusCode +from opentelemetry.propagate import extract + +def handle_request(request): + # Extract context from headers + context = extract(request.headers) + + tracer = trace.get_tracer("zstack-agent") + + with tracer.start_as_current_span( + f"Agent {request.method} {request.path}", + context=context, + kind=SpanKind.SERVER, + attributes={ + "http.method": request.method, + "http.path": request.path, + "http.url": request.url, + } + ) as span: + try: + result = process_command(request) + span.set_status(StatusCode.OK) + return result + except Exception as e: + span.record_exception(e) + span.set_status(StatusCode.ERROR, str(e)) + raise +``` + +### 3.2 Span Naming Convention for Agents + +| Operation | Span Name Format | Example | +|-----------|------------------|---------| +| Receive HTTP | `Agent {METHOD} {PATH}` | `Agent POST /vm/start` | +| Shell command | `Shell: {COMMAND}` | `Shell: virsh start` | +| File operation | `File: {OPERATION}` | `File: write /etc/config` | +| API call | `API: {TARGET}` | `API: libvirt.createVM` | + +### 3.3 Required Attributes for Agent Spans + +#### Agent HTTP Handler +| Attribute | Required | Description | +|-----------|----------|-------------| +| `http.method` | YES | HTTP method | +| `http.path` | YES | Request path | +| `http.status_code` | YES | Response status | +| `agent.type` | YES | Agent type (e.g., "kvm", "ceph") | +| `host.uuid` | NO | Host UUID if available | + +#### Shell Command Execution +| Attribute | Required | Description | +|-----------|----------|-------------| +| `shell.command` | YES | Command executed (sanitized) | +| `shell.exit_code` | YES | Exit code | +| `shell.timeout` | NO | Timeout in seconds | + +--- + +## 4. Sampling Strategy + +### 4.1 Environment-Based Sampling + +| Environment | Sampling Rate | Description | +|-------------|---------------|-------------| +| `DEV` | 100% | Full sampling for development | +| `TEST` | 100% | Full sampling for testing | +| `STAGING` | 10% minimum | At least 10%, configurable higher | +| `PROD` | Configurable (default 1%) | Low overhead for production | + +### 4.2 Error Retention (Tail-Based Sampling) + +When `alwaysSampleErrors=true`: +- Initial decision uses rate-based sampling +- If span ends with ERROR status, export regardless of initial decision +- Ensures all errors are captured even with low sampling rate + +### 4.3 Configuration + +```properties +# Management Node (Java) +Telemetry.enabled=true +Telemetry.environment=PROD +Telemetry.samplingRate=0.01 +Telemetry.alwaysSampleErrors=true +``` + +```yaml +# Agent (Python/Go) +telemetry: + enabled: true + environment: PROD + sampling_rate: 0.01 + always_sample_errors: true +``` + +--- + +## 5. Metrics + +### 5.1 Overview + +ZStack exposes Prometheus-compatible metrics for monitoring thread pool health and task queue status. These metrics enable real-time dashboards and alerting for high-concurrency scenarios (e.g., 1000+ concurrent host operations). + +### 5.2 Configuration + +```properties +# Management Node (zstack.properties) +Telemetry.enabled=true +Telemetry.metricsEnabled=true +Telemetry.prometheusPort=9464 +Telemetry.metricsCollectionIntervalSeconds=15 +Telemetry.maxTrackedSignatures=500 +``` + +### 5.3 Prometheus Endpoint + +When enabled, metrics are exposed at: +``` +http://{management-node}:9464/metrics +``` + +Prometheus scrape configuration: +```yaml +scrape_configs: + - job_name: 'zstack' + static_configs: + - targets: ['management-node:9464'] + scrape_interval: 15s +``` + +### 5.4 Available Metrics + +#### Thread Pool Metrics + +| Metric | Type | Labels | Description | +|--------|------|--------|-------------| +| `zstack_threadpool_active` | Gauge | `pool` | Active thread count | +| `zstack_threadpool_size` | Gauge | `pool` | Current pool size | +| `zstack_threadpool_max_size` | Gauge | `pool` | Maximum pool size | +| `zstack_threadpool_queue_size` | Gauge | `pool` | Tasks waiting in queue | +| `zstack_threadpool_completed_total` | Gauge | `pool` | Total completed tasks | + +Pool names: `main`, `sync`, or custom registered pool names. + +#### ChainTask Queue Metrics + +| Metric | Type | Labels | Description | +|--------|------|--------|-------------| +| `zstack_chaintask_pending` | Gauge | `signature` | Pending chain tasks per queue | +| `zstack_chaintask_running` | Gauge | `signature` | Running chain tasks per queue | + +#### SyncTask Queue Metrics + +| Metric | Type | Labels | Description | +|--------|------|--------|-------------| +| `zstack_synctask_pending` | Gauge | `signature` | Pending sync tasks per queue | +| `zstack_synctask_running` | Gauge | `signature` | Running sync tasks per queue | + +#### Task Timing Metrics + +| Metric | Type | Labels | Description | +|--------|------|--------|-------------| +| `zstack_task_wait_time_ms` | Histogram | `task_type`, `signature` | Time tasks spend waiting in queue | +| `zstack_task_execution_time_ms` | Histogram | `task_type`, `signature` | Task execution duration | +| `zstack_task_submitted_total` | Counter | `task_type`, `signature` | Total submitted tasks | +| `zstack_task_completed_total` | Counter | `task_type`, `signature`, `status` | Total completed tasks (status: success/error) | + +### 5.5 Grafana Dashboard Example + +``` +┌──────────────────────────────────────────────────────────────┐ +│ ZStack Thread Pool Status (1000 hosts concurrent) │ +├──────────────────────────────────────────────────────────────┤ +│ Active Threads: ████████████████░░░░ 800/1000 (80%) │ +│ Queue Depth: ████████████████████ 2500 pending │ +│ │ +│ Top 5 Busy Queues: │ +│ 1. host-connect-queue: ████████ 450 pending │ +│ 2. vm-start-queue: ██████ 320 pending │ +│ 3. storage-allocate-queue: █████ 280 pending │ +│ │ +│ Task Wait Time (p99): 12.5s │ +│ Task Exec Time (p99): 2.3s │ +└──────────────────────────────────────────────────────────────┘ +``` + +### 5.6 PromQL Query Examples + +```promql +# Thread pool utilization +zstack_threadpool_active{pool="main"} / zstack_threadpool_max_size{pool="main"} + +# Top 10 busiest chain task queues +topk(10, zstack_chaintask_pending) + +# Task queue growth rate (tasks/sec) +rate(zstack_task_submitted_total[5m]) + +# Error rate by queue +rate(zstack_task_completed_total{status="error"}[5m]) + / rate(zstack_task_completed_total[5m]) + +# P99 wait time for chain tasks +histogram_quantile(0.99, rate(zstack_task_wait_time_ms_bucket{task_type="chain"}[5m])) +``` + +### 5.7 Alerting Rules Example + +```yaml +groups: + - name: zstack-threadpool + rules: + - alert: ThreadPoolExhausted + expr: zstack_threadpool_active / zstack_threadpool_max_size > 0.9 + for: 5m + labels: + severity: warning + annotations: + summary: "Thread pool {{ $labels.pool }} is > 90% utilized" + + - alert: LargeTaskQueueBacklog + expr: zstack_chaintask_pending > 1000 + for: 10m + labels: + severity: warning + annotations: + summary: "Chain task queue {{ $labels.signature }} has > 1000 pending tasks" + + - alert: HighTaskWaitTime + expr: histogram_quantile(0.99, rate(zstack_task_wait_time_ms_bucket[5m])) > 30000 + for: 5m + labels: + severity: critical + annotations: + summary: "Task wait time P99 > 30 seconds" +``` + +### 5.8 Cardinality Control + +To prevent metric explosion from high-cardinality labels: + +1. **Max Tracked Signatures**: `Telemetry.maxTrackedSignatures=500` limits unique queue signatures tracked. Signatures beyond this limit are aggregated under label value `"other"`. + +2. **Signature Truncation**: Signatures longer than 100 characters are truncated. + +3. **Periodic Cleanup**: Metrics for inactive queues (queue size = 0) are naturally cleaned up when the queue wrapper is removed. + +### 5.9 Task Timing Implementation + +Task timing metrics are recorded inline during task execution in `DispatchQueueImpl`: + +| Task Type | Wait Time Recorded | Execution Time Recorded | +|-----------|-------------------|------------------------| +| `ChainTask` | When task moves from pending to running queue | In callback when task completes | +| `SyncTask` | At start of `SyncTaskFuture.run()` | In finally block of `SyncTaskFuture.run()` | +| `SingleFlightTask` | When `runSingleFlight()` starts execution | In `executeSingleRunTasks()` callback | + +Wait time is calculated as: `startExecutionTime - startPendingTime` +Execution time is calculated as: `currentTime - startExecutionTime` + +The `incrementTaskCompleted()` counter is also recorded with success/error status based on whether an exception occurred during execution. + +--- + +## 6. Exporters + +### 6.1 OTLP (Recommended) + +Primary exporter for all implementations. + +**Java Configuration**: +```properties +Telemetry.exporters=otlp +Telemetry.otlpEndpoint=http://jaeger:4317 +``` + +**Python Configuration**: +```python +from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter + +exporter = OTLPSpanExporter(endpoint="http://jaeger:4317") +``` + +### 6.2 Sentry (Optional) + +Secondary exporter for error tracking integration. + +**Java**: Uses reflection, optional dependency +**Python**: Use `sentry-sdk[opentelemetry]` + +--- + +## 7. Semantic Conventions + +Follow [OpenTelemetry Semantic Conventions](https://opentelemetry.io/docs/specs/semconv/). + +### 7.1 Service Identification + +| Attribute | Value | Description | +|-----------|-------|-------------| +| `service.name` | `zstack-management-node` | Management node | +| `service.name` | `zstack-kvm-agent` | KVM agent | +| `service.name` | `zstack-ceph-agent` | Ceph agent | +| `service.version` | `5.5.0` | Version string | +| `deployment.environment` | `DEV/TEST/STAGING/PROD` | Environment | + +### 7.2 ZStack-Specific Attributes + +| Attribute | Type | Description | +|-----------|------|-------------| +| `zstack.api.name` | string | API message class name | +| `zstack.api.id` | string | API request UUID | +| `zstack.resource.uuid` | string | Resource UUID being operated | +| `zstack.resource.type` | string | Resource type (VmInstance, Volume, etc.) | +| `zstack.chain.signature` | string | ChainTask queue signature | +| `zstack.host.uuid` | string | Host UUID | + +--- + +## 8. Error Handling + +### 8.1 Exception Recording + +```python +# Python +span.record_exception(exception) +span.set_status(StatusCode.ERROR, str(exception)) +``` + +```java +// Java +span.recordException(throwable); +span.setStatus(StatusCode.ERROR, throwable.getMessage()); +``` + +### 8.2 Error Span Attributes + +| Attribute | Type | Description | +|-----------|------|-------------| +| `exception.type` | string | Exception class name | +| `exception.message` | string | Exception message | +| `exception.stacktrace` | string | Full stack trace | +| `error.type` | string | Error category | + +--- + +## 9. Implementation Checklist + +### 9.1 Management Node (Java) ✓ + +- [x] TelemetryFacade interface and implementation +- [x] W3C context propagation (MessageTracingHelper) +- [x] ZStackSampler with environment-aware sampling +- [x] ErrorKeepingSpanProcessor for error retention +- [x] Pluggable exporters (OTLP, Sentry) +- [x] RestServer API entry spans +- [x] RESTFacadeImpl HTTP client spans +- [x] DispatchQueueImpl ChainTask spans (with success/error status) +- [x] DispatchQueueImpl SyncTask spans +- [x] @Traced annotation and TracingAspect +- [x] SimpleFlowChain FlowChain/Flow/Rollback spans +- [x] ThreadFacadeImpl Task spans +- [x] ThreadFacadeImpl PeriodicTask spans +- [x] ThreadFacadeImpl CancelablePeriodicTask spans +- [x] TelemetryMetricsFacade for Prometheus metrics +- [x] Thread pool metrics (active, size, max, queue, completed) +- [x] ChainTask queue metrics (pending, running) +- [x] SyncTask queue metrics (pending, running) +- [x] Task timing histograms (wait time, execution time) +- [x] Periodic metrics collection in ThreadFacadeImpl +- [x] CloudBus message spans (PRODUCER/CONSUMER) + +### 9.2 Agent (Python) TODO + +- [ ] OpenTelemetry SDK setup +- [ ] Context extraction from HTTP headers +- [ ] SERVER spans for incoming requests +- [ ] INTERNAL spans for command execution +- [ ] Error recording and status setting +- [ ] OTLP exporter configuration +- [ ] Environment-aware sampling +- [ ] Configuration file support + +--- + +## 10. Trace Flow Example + +### 10.1 Basic Trace Flow Diagram + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ Complete Trace Flow │ +├─────────────────────────────────────────────────────────────────────────────┤ +│ │ +│ Client Management Node KVM Agent │ +│ │ │ │ │ +│ │ POST /v1/vm-instances │ │ │ +│ │ ─────────────────────────>│ │ │ +│ │ │ │ │ +│ │ ┌──────┴──────┐ │ │ +│ │ │ SERVER Span │ API POST /v1/vm-instances │ │ +│ │ │ (root) │ │ │ +│ │ └──────┬──────┘ │ │ +│ │ │ │ │ +│ │ ┌──────┴──────┐ │ │ +│ │ │ INTERNAL │ ChainTask: StartVmInstance│ │ +│ │ │ Span │ │ │ +│ │ └──────┬──────┘ │ │ +│ │ │ │ │ +│ │ │ POST /vm/start │ │ +│ │ ┌──────┴──────┐ traceparent: 00-abc-123-01│ │ +│ │ │ CLIENT Span │─────────────────────────> │ │ +│ │ │ HTTP POST │ ┌──────┴──────┐ │ +│ │ └──────┬──────┘ │ SERVER Span │ │ +│ │ │ │ Agent POST │ │ +│ │ │ └──────┬──────┘ │ +│ │ │ ┌──────┴──────┐ │ +│ │ │ │ INTERNAL │ │ +│ │ │ │ Shell: virsh│ │ +│ │ │ └──────┬──────┘ │ +│ │ │ │ │ +│ │ │<─────────────────────────────────│ │ +│ │ │ │ │ +│ │<──────────────────────────│ │ │ +│ │ 200 OK │ │ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +### 10.2 Complete End-to-End Trace Example: CreateVmInstance + +This example shows the full trace hierarchy from API request to agent response to API completion. + +``` +Trace ID: 0af7651916cd43dd8448eb211c80319c +Total Duration: 3500ms + +[SERVER] API POST /v1/vm-instances ──────────────────────────────────────────── 3500ms +│ http.method=POST +│ http.path=/v1/vm-instances +│ http.status_code=200 +│ http.client_ip=192.168.1.100 +│ +├──[INTERNAL] ChainTask: api.create.vm ─────────────────────────────────────── 3400ms +│ │ chain.signature=api.create.vm +│ │ chain.task.name=CreateVmInstanceMsg +│ │ chain.task.class=org.zstack.compute.vm.VmCreator +│ │ +│ └──[INTERNAL] FlowChain: CreateVmInstance ──────────────────────────────── 3300ms +│ │ flowchain.id=FCID_a1b2c3d4 +│ │ flowchain.name=CreateVmInstance +│ │ flowchain.flow_count=8 +│ │ +│ ├──[INTERNAL] Flow: AllocatePrimaryStorageFlow ─────────────────────── 150ms +│ │ flow.name=AllocatePrimaryStorageFlow +│ │ flow.class=org.zstack.storage.primary.AllocatePrimaryStorageFlow +│ │ flow.index=1 +│ │ +│ ├──[INTERNAL] Flow: AllocateHostFlow ───────────────────────────────── 200ms +│ │ flow.name=AllocateHostFlow +│ │ flow.class=org.zstack.compute.allocator.AllocateHostFlow +│ │ flow.index=2 +│ │ +│ ├──[INTERNAL] Flow: CreateVolumeFlow ───────────────────────────────── 800ms +│ │ │ flow.name=CreateVolumeFlow +│ │ │ flow.class=org.zstack.storage.volume.CreateVolumeFlow +│ │ │ flow.index=3 +│ │ │ +│ │ └──[CLIENT] HTTP POST /primarystorage/createvolume ─────────────── 750ms +│ │ │ http.method=POST +│ │ │ http.url=http://10.0.0.5:7070/primarystorage/createvolume +│ │ │ http.status_code=200 +│ │ │ net.peer.name=10.0.0.5 +│ │ │ net.peer.port=7070 +│ │ │ +│ │ └──[SERVER] Agent POST /primarystorage/createvolume ────────── 700ms (Agent) +│ │ │ http.method=POST +│ │ │ http.path=/primarystorage/createvolume +│ │ │ agent.type=ceph +│ │ │ +│ │ └──[INTERNAL] Shell: rbd create ────────────────────────── 650ms (Agent) +│ │ shell.command=rbd create pool/volume-xxx --size 100G +│ │ shell.exit_code=0 +│ │ +│ ├──[INTERNAL] Flow: AllocateNicFlow ────────────────────────────────── 100ms +│ │ flow.name=AllocateNicFlow +│ │ flow.class=org.zstack.network.l3.AllocateNicFlow +│ │ flow.index=4 +│ │ +│ ├──[INTERNAL] Flow: CreateVmOnKvmFlow ──────────────────────────────── 1800ms +│ │ │ flow.name=CreateVmOnKvmFlow +│ │ │ flow.class=org.zstack.kvm.CreateVmOnKvmFlow +│ │ │ flow.index=5 +│ │ │ +│ │ └──[CLIENT] HTTP POST /vm/create ───────────────────────────────── 1750ms +│ │ │ http.method=POST +│ │ │ http.url=http://10.0.0.10:7070/vm/create +│ │ │ http.status_code=200 +│ │ │ net.peer.name=10.0.0.10 +│ │ │ net.peer.port=7070 +│ │ │ +│ │ └──[SERVER] Agent POST /vm/create ──────────────────────────── 1700ms (Agent) +│ │ │ http.method=POST +│ │ │ http.path=/vm/create +│ │ │ agent.type=kvm +│ │ │ host.uuid=host-uuid-xxx +│ │ │ +│ │ ├──[INTERNAL] Shell: qemu-img convert ──────────────────── 800ms (Agent) +│ │ │ shell.command=qemu-img convert -f qcow2 ... +│ │ │ shell.exit_code=0 +│ │ │ +│ │ └──[INTERNAL] Shell: virsh define + start ──────────────── 850ms (Agent) +│ │ shell.command=virsh define vm.xml && virsh start vm-xxx +│ │ shell.exit_code=0 +│ │ +│ ├──[INTERNAL] Flow: UpdateVmStateFlow ──────────────────────────────── 50ms +│ │ flow.name=UpdateVmStateFlow +│ │ flow.class=org.zstack.compute.vm.UpdateVmStateFlow +│ │ flow.index=6 +│ │ +│ └──[INTERNAL] Flow: PostCreateVmFlow ───────────────────────────────── 200ms +│ flow.name=PostCreateVmFlow +│ flow.class=org.zstack.compute.vm.PostCreateVmFlow +│ flow.index=7 +│ +└── Response sent to client: 200 OK +``` + +### 10.3 Trace Example: Failure with Rollback + +When a flow fails, the trace shows both the failure and rollback spans: + +``` +Trace ID: 1bf8762027de54ee9559fc322d91420d +Total Duration: 2200ms +Status: ERROR + +[SERVER] API POST /v1/vm-instances ──────────────────────────────────────────── 2200ms +│ http.method=POST +│ http.status_code=500 +│ error.code=HOST.1001 +│ +├──[INTERNAL] ChainTask: api.create.vm ─────────────────────────────────────── 2100ms +│ │ status=ERROR +│ │ +│ └──[INTERNAL] FlowChain: CreateVmInstance ──────────────────────────────── 2000ms +│ │ flowchain.id=FCID_x1y2z3w4 +│ │ flowchain.name=CreateVmInstance +│ │ status=ERROR +│ │ error.code=HOST.1001 +│ │ error.description=No available host +│ │ +│ ├──[INTERNAL] Flow: AllocatePrimaryStorageFlow ─────────────────────── 150ms ✓ +│ │ flow.index=1 +│ │ status=OK +│ │ +│ ├──[INTERNAL] Flow: AllocateHostFlow ───────────────────────────────── 200ms ✗ +│ │ flow.index=2 +│ │ status=ERROR +│ │ error.code=HOST.1001 +│ │ error.description=No available host matching criteria +│ │ +│ │ ════════════════ ROLLBACK STARTS ════════════════ +│ │ +│ ├──[INTERNAL] Rollback: AllocateHostFlow ───────────────────────────── 50ms +│ │ flow.name=AllocateHostFlow +│ │ flow.rollback=true +│ │ status=OK +│ │ +│ └──[INTERNAL] Rollback: AllocatePrimaryStorageFlow ─────────────────── 100ms +│ flow.name=AllocatePrimaryStorageFlow +│ flow.rollback=true +│ status=OK +│ +└── Response sent to client: 500 Internal Server Error + error.code=HOST.1001 + error.details=No available host matching criteria +``` + +### 10.4 Span Timing Diagram + +Visual representation of span timing relationships: + +``` +Time (ms) 0 500 1000 1500 2000 2500 3000 3500 + │ │ │ │ │ │ │ │ +API SERVER ├──────────────────────────────────────────────────┤ + │ │ +ChainTask │ ├────────────────────────────────────────────┤ │ + │ │ │ │ +FlowChain │ │ ├──────────────────────────────────────┤ │ │ + │ │ │ │ │ │ +Flow 1 │ │ ├──┤ │ │ │ + │ │ │ │ │ │ +Flow 2 │ │ ├───┤ │ │ │ + │ │ │ │ │ │ +Flow 3 │ │ ├────────────┤ │ │ │ + │ │ │ │ │ │ │ + HTTP │ │ │ ├────────┤ │ │ │ │ + │ │ │ │ Agent │ │ │ │ │ + │ │ │ └────────┘ │ │ │ │ + │ │ └────────────┘ │ │ │ +Flow 4 │ │ ├─┤ │ │ │ + │ │ │ │ │ │ +Flow 5 │ │ ├─────────────────────┤ │ + │ │ │ │ │ │ + HTTP │ │ │ ├───────────────────┤ │ + │ │ │ │ Agent │ │ │ + │ │ │ └───────────────────┘ │ + │ │ └─────────────────────┘ │ +Flow 6 │ │ ├─┤ │ +Flow 7 │ │ ├──┤│ + │ └────────────────────────────────────────────────┘│ + └──────────────────────────────────────────────────┘ + +Legend: +├──┤ = Span duration +│ │ = Nested child span +``` + +### 10.5 JSON Trace Export Example + +Example of exported trace in OTLP JSON format: + +```json +{ + "resourceSpans": [{ + "resource": { + "attributes": [ + {"key": "service.name", "value": {"stringValue": "zstack-management-node"}}, + {"key": "deployment.environment", "value": {"stringValue": "PROD"}} + ] + }, + "scopeSpans": [{ + "scope": {"name": "org.zstack"}, + "spans": [ + { + "traceId": "0af7651916cd43dd8448eb211c80319c", + "spanId": "b7ad6b7169203331", + "parentSpanId": "", + "name": "API POST /v1/vm-instances", + "kind": 2, + "startTimeUnixNano": "1706140800000000000", + "endTimeUnixNano": "1706140803500000000", + "attributes": [ + {"key": "http.method", "value": {"stringValue": "POST"}}, + {"key": "http.path", "value": {"stringValue": "/v1/vm-instances"}}, + {"key": "http.status_code", "value": {"intValue": "200"}} + ], + "status": {"code": 1} + }, + { + "traceId": "0af7651916cd43dd8448eb211c80319c", + "spanId": "c8be7c8270314442", + "parentSpanId": "b7ad6b7169203331", + "name": "FlowChain: CreateVmInstance", + "kind": 3, + "startTimeUnixNano": "1706140800100000000", + "endTimeUnixNano": "1706140803400000000", + "attributes": [ + {"key": "flowchain.id", "value": {"stringValue": "FCID_a1b2c3d4"}}, + {"key": "flowchain.name", "value": {"stringValue": "CreateVmInstance"}}, + {"key": "flowchain.flow_count", "value": {"intValue": "8"}} + ], + "status": {"code": 1} + }, + { + "traceId": "0af7651916cd43dd8448eb211c80319c", + "spanId": "d9cf8d9381425553", + "parentSpanId": "c8be7c8270314442", + "name": "Flow: CreateVmOnKvmFlow", + "kind": 3, + "startTimeUnixNano": "1706140801500000000", + "endTimeUnixNano": "1706140803300000000", + "attributes": [ + {"key": "flow.name", "value": {"stringValue": "CreateVmOnKvmFlow"}}, + {"key": "flow.index", "value": {"intValue": "5"}} + ], + "status": {"code": 1} + }, + { + "traceId": "0af7651916cd43dd8448eb211c80319c", + "spanId": "e0dg9e0492536664", + "parentSpanId": "d9cf8d9381425553", + "name": "HTTP POST", + "kind": 4, + "startTimeUnixNano": "1706140801550000000", + "endTimeUnixNano": "1706140803250000000", + "attributes": [ + {"key": "http.method", "value": {"stringValue": "POST"}}, + {"key": "http.url", "value": {"stringValue": "http://10.0.0.10:7070/vm/create"}}, + {"key": "http.status_code", "value": {"intValue": "200"}} + ], + "status": {"code": 1} + } + ] + }] + }] +} +``` + +--- + +## 11. Python Agent Reference Implementation + +```python +""" +ZStack Agent Telemetry Module +Implements telemetry specification for Python agents +""" + +import os +from opentelemetry import trace +from opentelemetry.sdk.trace import TracerProvider +from opentelemetry.sdk.trace.export import BatchSpanProcessor +from opentelemetry.sdk.resources import Resource +from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter +from opentelemetry.propagate import extract, set_global_textmap +from opentelemetry.propagators.composite import CompositeHTTPPropagator +from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator +from opentelemetry.trace import SpanKind, StatusCode + + +class ZStackAgentTelemetry: + """Telemetry facade for ZStack agents""" + + def __init__(self, config: dict): + self.enabled = config.get('enabled', False) + self.environment = config.get('environment', 'DEV') + self.sampling_rate = config.get('sampling_rate', 1.0) + self.service_name = config.get('service_name', 'zstack-agent') + self.otlp_endpoint = config.get('otlp_endpoint', '') + + self._tracer = None + + if self.enabled: + self._initialize() + + def _initialize(self): + # Set up W3C Trace Context propagator + set_global_textmap(CompositeHTTPPropagator([ + TraceContextTextMapPropagator() + ])) + + # Create resource + resource = Resource.create({ + "service.name": self.service_name, + "deployment.environment": self.environment, + }) + + # Create tracer provider with sampler + provider = TracerProvider( + resource=resource, + sampler=self._create_sampler() + ) + + # Add OTLP exporter if configured + if self.otlp_endpoint: + exporter = OTLPSpanExporter(endpoint=self.otlp_endpoint) + provider.add_span_processor(BatchSpanProcessor(exporter)) + + trace.set_tracer_provider(provider) + self._tracer = trace.get_tracer("org.zstack.agent") + + def _create_sampler(self): + from opentelemetry.sdk.trace.sampling import ( + TraceIdRatioBased, + ParentBasedTraceIdRatio + ) + + if self.environment in ('DEV', 'TEST'): + rate = 1.0 + elif self.environment == 'STAGING': + rate = max(self.sampling_rate, 0.1) + else: + rate = self.sampling_rate + + return ParentBasedTraceIdRatio(rate) + + @property + def tracer(self): + return self._tracer + + def extract_context(self, headers: dict): + """Extract trace context from HTTP headers""" + return extract(headers) + + def start_server_span(self, name: str, headers: dict, attributes: dict = None): + """Start a SERVER span for incoming HTTP request""" + context = self.extract_context(headers) + return self._tracer.start_span( + name, + context=context, + kind=SpanKind.SERVER, + attributes=attributes or {} + ) + + def start_internal_span(self, name: str, attributes: dict = None): + """Start an INTERNAL span for internal operations""" + return self._tracer.start_span( + name, + kind=SpanKind.INTERNAL, + attributes=attributes or {} + ) + + +# Flask integration example +def create_tracing_middleware(telemetry: ZStackAgentTelemetry): + """Create Flask middleware for automatic tracing""" + + def middleware(app): + @app.before_request + def before_request(): + from flask import request, g + + if not telemetry.enabled: + return + + span = telemetry.start_server_span( + f"Agent {request.method} {request.path}", + dict(request.headers), + { + "http.method": request.method, + "http.path": request.path, + "http.url": request.url, + "agent.type": telemetry.service_name, + } + ) + g.trace_span = span + g.trace_token = trace.use_span(span, end_on_exit=False) + g.trace_token.__enter__() + + @app.after_request + def after_request(response): + from flask import g + + if hasattr(g, 'trace_span') and g.trace_span: + g.trace_span.set_attribute("http.status_code", response.status_code) + if response.status_code >= 400: + g.trace_span.set_status(StatusCode.ERROR) + else: + g.trace_span.set_status(StatusCode.OK) + + return response + + @app.teardown_request + def teardown_request(exception): + from flask import g + + if hasattr(g, 'trace_span') and g.trace_span: + if exception: + g.trace_span.record_exception(exception) + g.trace_span.set_status(StatusCode.ERROR, str(exception)) + + g.trace_token.__exit__(None, None, None) + g.trace_span.end() + + return app + + return middleware +``` + +--- + +## Appendix A: Configuration Reference + +### Management Node (zstack.properties) + +```properties +# Enable/disable telemetry +Telemetry.enabled=true + +# Environment: DEV, TEST, STAGING, PROD +Telemetry.environment=PROD + +# Sampling rate (0.0 to 1.0) +Telemetry.samplingRate=0.01 + +# Always export error spans +Telemetry.alwaysSampleErrors=true + +# Exporters (comma-separated): otlp, sentry +Telemetry.exporters=otlp + +# OTLP endpoint +Telemetry.otlpEndpoint=http://jaeger:4317 + +# Service identification +Telemetry.serviceName=zstack-management-node +Telemetry.serviceVersion=5.5.0 + +# Batching configuration +Telemetry.maxExportBatchSize=512 +Telemetry.exportDelayMs=5000 +Telemetry.maxQueueSize=2048 + +# Metrics configuration +Telemetry.metricsEnabled=true +Telemetry.prometheusPort=9464 +Telemetry.metricsCollectionIntervalSeconds=15 +Telemetry.maxTrackedSignatures=500 +``` + +### Agent (agent.yaml) + +```yaml +telemetry: + enabled: true + environment: PROD + sampling_rate: 0.01 + always_sample_errors: true + + otlp: + endpoint: "http://jaeger:4317" + insecure: true + + service: + name: zstack-kvm-agent + version: "5.5.0" + + batch: + max_queue_size: 2048 + max_export_batch_size: 512 + export_timeout_ms: 30000 +``` diff --git a/header/src/main/java/org/zstack/header/Constants.java b/header/src/main/java/org/zstack/header/Constants.java index 071b394b900..318c14e3f9c 100755 --- a/header/src/main/java/org/zstack/header/Constants.java +++ b/header/src/main/java/org/zstack/header/Constants.java @@ -11,6 +11,12 @@ public interface Constants { String THREAD_CONTEXT_TASK = "task"; String THREAD_CONTEXT_PROGRESS_ENABLED = "progress-enabled"; String THREAD_CONTEXT_TASK_STAGE = "task-stage"; + + String THREAD_CONTEXT_TRACEPARENT = "traceparent"; + String THREAD_CONTEXT_TRACESTATE = "tracestate"; + + String HTTP_HEADER_TRACEPARENT = "traceparent"; + String HTTP_HEADER_TRACESTATE = "tracestate"; String CATEGORY_RESOURCE = "resource"; String CATEGORY_METADATA = "metadata"; diff --git a/header/src/main/java/org/zstack/header/core/Traced.java b/header/src/main/java/org/zstack/header/core/Traced.java new file mode 100644 index 00000000000..e4fde11eeff --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/Traced.java @@ -0,0 +1,50 @@ +package org.zstack.header.core; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Marks a method to be automatically traced with OpenTelemetry spans. + * + * When applied to a method, the TracingAspect will create a span around + * the method execution, capturing timing, errors, and context propagation. + * + * Usage: + *
+ * {@code
+ * @Traced
+ * public void processMessage(Message msg) {
+ *     // method body
+ * }
+ * 
+ * @Traced(operationName = "custom-operation")
+ * public Result doSomething() {
+ *     // method body
+ * }
+ * }
+ * 
+ */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Traced { + + /** + * Custom operation name for the span. + * If empty, defaults to "ClassName.methodName" + */ + String operationName() default ""; + + /** + * Additional attributes to include in the span. + * Format: "key1=value1,key2=value2" + */ + String attributes() default ""; + + /** + * Whether to record method parameters as span attributes. + * Be cautious with sensitive data. + */ + boolean recordParameters() default false; +} diff --git a/pom.xml b/pom.xml index 8a56650efa4..b5586857c7a 100755 --- a/pom.xml +++ b/pom.xml @@ -512,6 +512,68 @@ cas-client-core 3.4.1 + + + io.opentelemetry + opentelemetry-bom + 1.35.0 + pom + import + + + + io.opentelemetry + opentelemetry-api + 1.35.0 + + + + io.opentelemetry + opentelemetry-sdk + 1.35.0 + + + + io.opentelemetry + opentelemetry-sdk-trace + 1.35.0 + + + + io.opentelemetry + opentelemetry-exporter-otlp + 1.35.0 + + + + io.opentelemetry + opentelemetry-context + 1.35.0 + + + + io.opentelemetry.semconv + opentelemetry-semconv + 1.23.1-alpha + + + + io.opentelemetry + opentelemetry-sdk-metrics + 1.35.0 + + + + io.opentelemetry + opentelemetry-exporter-prometheus + 1.35.0-alpha + + + + io.sentry + sentry-opentelemetry-core + 8.0.0 + diff --git a/rest/src/main/java/org/zstack/rest/RestServer.java b/rest/src/main/java/org/zstack/rest/RestServer.java index 322089899f4..12a823d619b 100755 --- a/rest/src/main/java/org/zstack/rest/RestServer.java +++ b/rest/src/main/java/org/zstack/rest/RestServer.java @@ -1,5 +1,10 @@ package org.zstack.rest; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.Scope; import okhttp3.HttpUrl; import okhttp3.MediaType; import okhttp3.OkHttpClient; @@ -10,6 +15,7 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; +import org.apache.logging.log4j.ThreadContext; import org.reflections.Reflections; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; @@ -30,6 +36,9 @@ import org.zstack.core.log.LogUtils; import org.zstack.core.retry.Retry; import org.zstack.core.retry.RetryCondition; +import org.zstack.core.telemetry.MessageTracingHelper; +import org.zstack.core.telemetry.TelemetryFacade; +import org.zstack.core.telemetry.TelemetryGlobalProperty; import org.zstack.core.timeout.ApiTimeoutManager; import org.zstack.header.Component; import org.zstack.header.Constants; @@ -146,6 +155,23 @@ public class RestServer implements Component, CloudBusEventListener { private List interceptors = new ArrayList<>(); + private TelemetryFacade telemetryFacade; + + private TelemetryFacade getTelemetryFacade() { + if (telemetryFacade == null && TelemetryGlobalProperty.ENABLED) { + try { + telemetryFacade = Platform.getComponentLoader().getComponent(TelemetryFacade.class); + } catch (Exception e) { + logger.trace("TelemetryFacade not available", e); + } + } + return telemetryFacade; + } + + private boolean isTelemetryEnabled() { + return TelemetryGlobalProperty.ENABLED && getTelemetryFacade() != null && getTelemetryFacade().isEnabled(); + } + public void registerRestServletRequestInterceptor(RestServletRequestInterceptor interceptor) { interceptors.add(interceptor); } @@ -702,50 +728,145 @@ void handle(HttpServletRequest req, HttpServletResponse rsp) throws IOException, HttpEntity entity = toHttpEntity(req); extensions.forEach(ext -> ext.afterRestRequest(info.method)); - if (requestLogger.isTraceEnabled() && needLog(info)) { - StringBuilder sb = new StringBuilder(String.format("[ID: %s, Method: %s] Request from %s (to %s), ", - req.getSession().getId(), req.getMethod(), - req.getRemoteHost(), UriUtils.decode(req.getRequestURI(), "UTF-8"))); - sb.append(String.format(" Headers: %s,", JSONObjectUtil.toJsonString(entity.getHeaders()))); - if (req.getQueryString() != null && !req.getQueryString().isEmpty()) { - sb.append(String.format(" Query: %s,", UriUtils.decode(req.getQueryString(), "UTF-8"))); + Span apiSpan = null; + Scope scope = null; + if (isTelemetryEnabled()) { + try { + Context parentContext = extractTraceContextFromRequest(req); + + apiSpan = getTelemetryFacade().getTracer() + .spanBuilder("API " + req.getMethod() + " " + path) + .setSpanKind(SpanKind.SERVER) + .setParent(parentContext) + .setAttribute("http.method", req.getMethod()) + .setAttribute("http.url", req.getRequestURL().toString()) + .setAttribute("http.path", path) + .setAttribute("http.client_ip", info.clientIp) + .setAttribute("net.peer.ip", info.clientIp) + .startSpan(); + + scope = apiSpan.makeCurrent(); + + java.util.Map traceCtx = MessageTracingHelper.extractTraceContext(); + if (traceCtx.containsKey(MessageTracingHelper.TRACEPARENT_KEY)) { + ThreadContext.put(Constants.THREAD_CONTEXT_TRACEPARENT, + traceCtx.get(MessageTracingHelper.TRACEPARENT_KEY)); + } + if (traceCtx.containsKey(MessageTracingHelper.TRACESTATE_KEY)) { + ThreadContext.put(Constants.THREAD_CONTEXT_TRACESTATE, + traceCtx.get(MessageTracingHelper.TRACESTATE_KEY)); + } + } catch (Exception e) { + logger.trace("Failed to create API span", e); } - sb.append(String.format(" Body: %s", entity.getBody() == null || entity.getBody().isEmpty() ? null : getFormatBody(path, entity.getBody()))); - - requestLogger.trace(sb.toString()); } + final Span finalApiSpan = apiSpan; + final Scope finalScope = scope; + try { - for (RestServletRequestInterceptor ic : interceptors) { - ic.intercept(req); + if (requestLogger.isTraceEnabled() && needLog(info)) { + StringBuilder sb = new StringBuilder(String.format("[ID: %s, Method: %s] Request from %s (to %s), ", + req.getSession().getId(), req.getMethod(), + req.getRemoteHost(), UriUtils.decode(req.getRequestURI(), "UTF-8"))); + sb.append(String.format(" Headers: %s,", JSONObjectUtil.toJsonString(entity.getHeaders()))); + if (req.getQueryString() != null && !req.getQueryString().isEmpty()) { + sb.append(String.format(" Query: %s,", UriUtils.decode(req.getQueryString(), "UTF-8"))); + } + sb.append(String.format(" Body: %s", entity.getBody() == null || entity.getBody().isEmpty() ? null : getFormatBody(path, entity.getBody()))); + + requestLogger.trace(sb.toString()); } - } catch (RestServletRequestInterceptor.RestServletRequestInterceptorException e) { - sendResponse(e.statusCode, e.error, rsp); - return; - } - if (matcher.match(ASYNC_JOB_PATH_PATTERN, path)) { - handleJobQuery(req, rsp); - return; + try { + for (RestServletRequestInterceptor ic : interceptors) { + ic.intercept(req); + } + } catch (RestServletRequestInterceptor.RestServletRequestInterceptorException e) { + if (finalApiSpan != null) { + finalApiSpan.setStatus(StatusCode.ERROR, e.error); + finalApiSpan.setAttribute("http.status_code", e.statusCode); + } + sendResponse(e.statusCode, e.error, rsp); + return; + } + + if (matcher.match(ASYNC_JOB_PATH_PATTERN, path)) { + if (finalApiSpan != null) { + finalApiSpan.setStatus(StatusCode.OK); + } + handleJobQuery(req, rsp); + return; + } + + Object api = apis.get(getMatchPath(path)); + if (api == null) { + if (finalApiSpan != null) { + finalApiSpan.setStatus(StatusCode.ERROR, "API not found"); + finalApiSpan.setAttribute("http.status_code", HttpStatus.NOT_FOUND.value()); + } + sendResponse(HttpStatus.NOT_FOUND.value(), String.format("no api mapping to %s", path), rsp); + return; + } + + try { + if (api instanceof Api) { + handleUniqueApi((Api) api, entity, req, rsp); + } else { + handleNonUniqueApi((Collection)api, entity, req, rsp); + } + if (finalApiSpan != null) { + finalApiSpan.setStatus(StatusCode.OK); + } + } catch (RestException e) { + if (finalApiSpan != null) { + finalApiSpan.setStatus(StatusCode.ERROR, e.error); + finalApiSpan.setAttribute("http.status_code", e.statusCode); + } + sendResponse(e.statusCode, e.error, rsp); + } catch (Throwable e) { + logger.warn(String.format("failed to handle API to %s", path), e); + if (finalApiSpan != null) { + finalApiSpan.recordException(e); + finalApiSpan.setStatus(StatusCode.ERROR, e.getMessage()); + finalApiSpan.setAttribute("http.status_code", HttpStatus.INTERNAL_SERVER_ERROR.value()); + } + sendResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage(), rsp); + } + } finally { + endSpanAndScope(finalApiSpan, finalScope); } + } - Object api = apis.get(getMatchPath(path)); - if (api == null) { - sendResponse(HttpStatus.NOT_FOUND.value(), String.format("no api mapping to %s", path), rsp); - return; + private Context extractTraceContextFromRequest(HttpServletRequest req) { + String traceparent = req.getHeader(Constants.HTTP_HEADER_TRACEPARENT); + if (traceparent == null || traceparent.isEmpty()) { + return Context.current(); + } + + java.util.Map traceCtx = new HashMap<>(); + traceCtx.put(MessageTracingHelper.TRACEPARENT_KEY, traceparent); + String tracestate = req.getHeader(Constants.HTTP_HEADER_TRACESTATE); + if (tracestate != null && !tracestate.isEmpty()) { + traceCtx.put(MessageTracingHelper.TRACESTATE_KEY, tracestate); } + return MessageTracingHelper.parseTraceContext(traceCtx); + } - try { - if (api instanceof Api) { - handleUniqueApi((Api) api, entity, req, rsp); - } else { - handleNonUniqueApi((Collection)api, entity, req, rsp); + private void endSpanAndScope(Span span, Scope scope) { + if (span != null) { + try { + span.end(); + } catch (Exception e) { + logger.trace("Failed to end API span", e); + } + } + if (scope != null) { + try { + scope.close(); + } catch (Exception e) { + logger.trace("Failed to close API scope", e); } - } catch (RestException e) { - sendResponse(e.statusCode, e.error, rsp); - } catch (Throwable e) { - logger.warn(String.format("failed to handle API to %s", path), e); - sendResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage(), rsp); } } From 04161ccc90ce51229d2da36745bce19accb09090 Mon Sep 17 00:00:00 2001 From: lianghy Date: Thu, 29 Jan 2026 10:31:43 +0800 Subject: [PATCH 716/737] [conf]: bump version to 5.5.6 DBImpact Resolves: ZSTAC-81288 Change-Id: I617574756174746468627973696863626279786e --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 61dd093f04e..f36c3dfd747 100755 --- a/VERSION +++ b/VERSION @@ -1,3 +1,3 @@ MAJOR=5 MINOR=5 -UPDATE=0 +UPDATE=6 From bd5119ae0dc46eef7dcab2e5f4fc403a85574c0e Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Wed, 28 Jan 2026 10:31:44 +0800 Subject: [PATCH 717/737] [compute]: check isManagedByUs before trackHost to prevent dual MN tracking Resolves: ZSTAC-76341 Change-Id: I626278717a6e62786e7679696167706d79687a6c --- .../zstack/compute/host/HostTrackImpl.java | 5 +++ .../kvm/host/HostConnectedTimeCase.groovy | 31 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/compute/src/main/java/org/zstack/compute/host/HostTrackImpl.java b/compute/src/main/java/org/zstack/compute/host/HostTrackImpl.java index 49394e88b78..48ed6a7dc48 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostTrackImpl.java +++ b/compute/src/main/java/org/zstack/compute/host/HostTrackImpl.java @@ -251,6 +251,11 @@ public void cancel() { public void trackHost(String hostUuid) { + if (!destMaker.isManagedByUs(hostUuid)) { + logger.debug(String.format("skip tracking host[uuid:%s], not managed by us", hostUuid)); + return; + } + Tracker t = trackers.get(hostUuid); if (t != null) { t.cancel(); diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/host/HostConnectedTimeCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/host/HostConnectedTimeCase.groovy index eaf774fb84f..87a06e15abd 100644 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/host/HostConnectedTimeCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/host/HostConnectedTimeCase.groovy @@ -16,6 +16,11 @@ import org.zstack.utils.gson.JSONObjectUtil import org.zstack.header.network.l2.BatchCheckNetworkPhysicalInterfaceMsg import org.zstack.header.network.l2.BatchCheckNetworkPhysicalInterfaceReply import org.zstack.core.cloudbus.CloudBus +import org.zstack.core.cloudbus.ResourceDestinationMaker +import org.zstack.compute.host.HostTrackImpl + +import static org.mockito.Mockito.mock +import static org.mockito.Mockito.when class HostConnectedTimeCase extends SubCase { @@ -34,6 +39,7 @@ class HostConnectedTimeCase extends SubCase { @Override void test() { env.create { + testSkipTrackIfNotManagedByUs() testHostConnectedTime() } } @@ -43,6 +49,31 @@ class HostConnectedTimeCase extends SubCase { env.delete() } + /** + * Test for ZSTAC-76341: check isManagedByUs before trackHost to prevent dual MN tracking + */ + void testSkipTrackIfNotManagedByUs() { + HostInventory host = env.inventoryByName("kvm") as HostInventory + HostTrackImpl tracker = bean(HostTrackImpl.class) + + ResourceDestinationMaker originalDestMaker = tracker.@destMaker + + ResourceDestinationMaker mockDestMaker = mock(ResourceDestinationMaker.class) + when(mockDestMaker.isManagedByUs(host.uuid)).thenReturn(false) + tracker.@destMaker = mockDestMaker + + tracker.untrackHost(host.uuid) + assert !tracker.trackers.containsKey(host.uuid) + + tracker.trackHost(host.uuid) + assert !tracker.trackers.containsKey(host.uuid) : "Host should NOT be tracked when isManagedByUs returns false" + + tracker.@destMaker = originalDestMaker + + tracker.trackHost(host.uuid) + assert tracker.trackers.containsKey(host.uuid) : "Host should be tracked when isManagedByUs returns true" + } + void testHostConnectedTime() { HostInventory host = env.inventoryByName("kvm") From dbaf230de4fc89c3c8bbf640ffd6a14ad656f86b Mon Sep 17 00:00:00 2001 From: "pengchao.liu" Date: Thu, 15 Jan 2026 16:57:28 +0800 Subject: [PATCH 718/737] [lb]: feature-lb-forwarding-rules Resolves: ZSTAC-79223 Change-Id: I796a766e6d6f75687363716f6c70656466766574 --- conf/db/upgrade/V5.5.6__schema.sql | 2 + .../acl/AccessControlListManagerImpl.java | 1 + .../APIAddAccessControlListEntryEvent.java | 1 + ...PIAddAccessControlListRedirectRuleMsg.java | 12 + ...ControlListRedirectRuleMsgDoc_zh_cn.groovy | 9 + ...ngeAccessControlListRedirectRuleEvent.java | 1 + .../acl/AccessControlListEntryInventory.java | 10 + ...sControlListEntryInventoryDoc_zh_cn.groovy | 6 + .../header/acl/AccessControlListEntryVO.java | 10 + .../header/acl/AccessControlListEntryVO_.java | 1 + ...etLoadBalancerListenerACLEntriesReply.java | 10 + .../network/service/lb/LoadBalancerBase.java | 127 ++++-- .../lb/LoadBalancerGlobalProperty.java | 2 + .../service/lb/LoadBalancerManagerImpl.java | 34 ++ .../lb/VirtualRouterLoadBalancerBackend.java | 11 + .../sdk/AccessControlListEntryInventory.java | 8 + ...ddAccessControlListRedirectRuleAction.java | 3 + ...alRouterLoadBalancerForwardRuleCase.groovy | 415 ++++++++++++++++++ 18 files changed, 630 insertions(+), 33 deletions(-) create mode 100644 test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/VirtualRouterLoadBalancerForwardRuleCase.groovy diff --git a/conf/db/upgrade/V5.5.6__schema.sql b/conf/db/upgrade/V5.5.6__schema.sql index b234ac5ac12..4e428984151 100644 --- a/conf/db/upgrade/V5.5.6__schema.sql +++ b/conf/db/upgrade/V5.5.6__schema.sql @@ -111,3 +111,5 @@ FROM PodVO p LEFT JOIN PciDeviceVO pci ON pci.vmInstanceUuid = p.uuid LEFT JOIN GpuDeviceVO g ON g.uuid = pci.uuid GROUP BY p.uuid; + +ALTER TABLE `zstack`.`AccessControlListEntryVO` ADD COLUMN `redirectPort` int(10) DEFAULT NULL; diff --git a/plugin/acl/src/main/java/org/zstack/acl/AccessControlListManagerImpl.java b/plugin/acl/src/main/java/org/zstack/acl/AccessControlListManagerImpl.java index 5e90711f200..af03a142fe4 100644 --- a/plugin/acl/src/main/java/org/zstack/acl/AccessControlListManagerImpl.java +++ b/plugin/acl/src/main/java/org/zstack/acl/AccessControlListManagerImpl.java @@ -230,6 +230,7 @@ public void run(final SyncTaskChain chain) { entry.setDomain(msg.getDomain()); entry.setUrl(msg.getUrl()); entry.setDescription(msg.getDescription()); + entry.setRedirectPort(msg.getRedirectPort()); String redirectRule = ""; if (entry.getMatchMethod().equals("Url")) { redirectRule = "path_beg -i " + entry.getUrl(); diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/APIAddAccessControlListEntryEvent.java b/plugin/acl/src/main/java/org/zstack/header/acl/APIAddAccessControlListEntryEvent.java index 06269e612be..967288cbc5b 100644 --- a/plugin/acl/src/main/java/org/zstack/header/acl/APIAddAccessControlListEntryEvent.java +++ b/plugin/acl/src/main/java/org/zstack/header/acl/APIAddAccessControlListEntryEvent.java @@ -31,6 +31,7 @@ public static APIAddAccessControlListEntryEvent __example__() { inv.setAclUuid(uuid()); inv.setIpEntries("192.168.48.0/24"); + inv.setRedirectPort(8080); event.setInventory(inv); return event; diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/APIAddAccessControlListRedirectRuleMsg.java b/plugin/acl/src/main/java/org/zstack/header/acl/APIAddAccessControlListRedirectRuleMsg.java index ff8849b54e5..829361a29eb 100644 --- a/plugin/acl/src/main/java/org/zstack/header/acl/APIAddAccessControlListRedirectRuleMsg.java +++ b/plugin/acl/src/main/java/org/zstack/header/acl/APIAddAccessControlListRedirectRuleMsg.java @@ -44,6 +44,9 @@ public class APIAddAccessControlListRedirectRuleMsg extends APICreateMessage imp @APIParam(resourceType = AccessControlListVO.class, checkAccount = true, operationTarget = true) private String aclUuid; + @APIParam(required = false, numberRange = {1, 65535}) + private Integer redirectPort; + public String getName() { return name; } @@ -101,6 +104,14 @@ public void setAclUuid(String aclUuid) { this.aclUuid = aclUuid; } + public Integer getRedirectPort() { + return redirectPort; + } + + public void setRedirectPort(Integer redirectPort) { + this.redirectPort = redirectPort; + } + public static APIAddAccessControlListRedirectRuleMsg __example__() { APIAddAccessControlListRedirectRuleMsg msg = new APIAddAccessControlListRedirectRuleMsg(); @@ -110,6 +121,7 @@ public static APIAddAccessControlListRedirectRuleMsg __example__() { msg.setDomain("zstack.io"); msg.setMatchMethod("AccurateMatch"); msg.setUrl("/cloud"); + msg.setRedirectPort(8080); return msg; } diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/APIAddAccessControlListRedirectRuleMsgDoc_zh_cn.groovy b/plugin/acl/src/main/java/org/zstack/header/acl/APIAddAccessControlListRedirectRuleMsgDoc_zh_cn.groovy index a4ff4563da6..461fc0d64fd 100644 --- a/plugin/acl/src/main/java/org/zstack/header/acl/APIAddAccessControlListRedirectRuleMsgDoc_zh_cn.groovy +++ b/plugin/acl/src/main/java/org/zstack/header/acl/APIAddAccessControlListRedirectRuleMsgDoc_zh_cn.groovy @@ -102,6 +102,15 @@ doc { optional true since "4.1.3" } + column { + name "redirectPort" + enclosedIn "params" + desc "转发端口" + location "body" + type "Integer" + optional true + since "5.5.0" + } } } diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/APIChangeAccessControlListRedirectRuleEvent.java b/plugin/acl/src/main/java/org/zstack/header/acl/APIChangeAccessControlListRedirectRuleEvent.java index 1d41805a8a1..07ffee8859a 100644 --- a/plugin/acl/src/main/java/org/zstack/header/acl/APIChangeAccessControlListRedirectRuleEvent.java +++ b/plugin/acl/src/main/java/org/zstack/header/acl/APIChangeAccessControlListRedirectRuleEvent.java @@ -30,6 +30,7 @@ public static APIChangeAccessControlListRedirectRuleEvent __example__() { inv.setType("RedirectRule"); inv.setDomain("zstack.io"); inv.setUrl("/test"); + inv.setRedirectPort(8080); event.setInventory(inv); return event; } diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/AccessControlListEntryInventory.java b/plugin/acl/src/main/java/org/zstack/header/acl/AccessControlListEntryInventory.java index ba589828328..04003206548 100644 --- a/plugin/acl/src/main/java/org/zstack/header/acl/AccessControlListEntryInventory.java +++ b/plugin/acl/src/main/java/org/zstack/header/acl/AccessControlListEntryInventory.java @@ -25,6 +25,7 @@ public class AccessControlListEntryInventory { private String url; private String ipEntries; + private Integer redirectPort; private String description; @@ -54,6 +55,7 @@ public AccessControlListEntryInventory(AccessControlListEntryVO vo) { this.url = vo.getUrl(); this.name = vo.getName(); this.type = vo.getType(); + this.redirectPort = vo.getRedirectPort(); this.description = vo.getDescription(); this.ipEntries = vo.getIpEntries(); this.createDate = vo.getCreateDate(); @@ -116,6 +118,14 @@ public void setIpEntries(String ipEntries) { this.ipEntries = ipEntries; } + public Integer getRedirectPort() { + return redirectPort; + } + + public void setRedirectPort(Integer redirectPort) { + this.redirectPort = redirectPort; + } + public String getDescription() { return description; } diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/AccessControlListEntryInventoryDoc_zh_cn.groovy b/plugin/acl/src/main/java/org/zstack/header/acl/AccessControlListEntryInventoryDoc_zh_cn.groovy index 6cc5486bb49..d50b81dfb6b 100644 --- a/plugin/acl/src/main/java/org/zstack/header/acl/AccessControlListEntryInventoryDoc_zh_cn.groovy +++ b/plugin/acl/src/main/java/org/zstack/header/acl/AccessControlListEntryInventoryDoc_zh_cn.groovy @@ -49,6 +49,12 @@ doc { type "String" since "0.6" } + field { + name "redirectPort" + desc "" + type "Integer" + since "5.5.6" + } field { name "description" desc "资源的详细描述" diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/AccessControlListEntryVO.java b/plugin/acl/src/main/java/org/zstack/header/acl/AccessControlListEntryVO.java index 3c2a57c6398..8a8b0978010 100644 --- a/plugin/acl/src/main/java/org/zstack/header/acl/AccessControlListEntryVO.java +++ b/plugin/acl/src/main/java/org/zstack/header/acl/AccessControlListEntryVO.java @@ -47,6 +47,8 @@ public class AccessControlListEntryVO implements ToInventory { private String url; @Column private String redirectRule; + @Column + private Integer redirectPort; @Column private String ipEntries; @@ -165,4 +167,12 @@ public String getRedirectRule() { public void setRedirectRule(String redirectRule) { this.redirectRule = redirectRule; } + + public Integer getRedirectPort() { + return redirectPort; + } + + public void setRedirectPort(Integer redirectPort) { + this.redirectPort = redirectPort; + } } diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/AccessControlListEntryVO_.java b/plugin/acl/src/main/java/org/zstack/header/acl/AccessControlListEntryVO_.java index 5e73500432b..59312f19f84 100644 --- a/plugin/acl/src/main/java/org/zstack/header/acl/AccessControlListEntryVO_.java +++ b/plugin/acl/src/main/java/org/zstack/header/acl/AccessControlListEntryVO_.java @@ -20,6 +20,7 @@ public class AccessControlListEntryVO_ { public static volatile SingularAttribute domain; public static volatile SingularAttribute url; public static volatile SingularAttribute redirectRule; + public static volatile SingularAttribute redirectPort; public static volatile SingularAttribute ipEntries; public static volatile SingularAttribute description; public static volatile SingularAttribute createDate; diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetLoadBalancerListenerACLEntriesReply.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetLoadBalancerListenerACLEntriesReply.java index ba962e61709..e5e2a18770b 100644 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetLoadBalancerListenerACLEntriesReply.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetLoadBalancerListenerACLEntriesReply.java @@ -47,6 +47,7 @@ static class LoadBalancerACLEntry { private String ipEntries; private String description; + private Integer redirectPort; private Timestamp createDate; @@ -63,6 +64,7 @@ public void valueOf(AccessControlListEntryVO vo) { this.type = vo.getType(); this.description = vo.getDescription(); this.ipEntries = vo.getIpEntries(); + this.redirectPort = vo.getRedirectPort(); this.createDate = vo.getCreateDate(); this.lastOpDate = vo.getLastOpDate(); } @@ -154,5 +156,13 @@ public List getServerGroups() { public void setServerGroups(List serverGroups) { this.serverGroups = serverGroups; } + + public Integer getRedirectPort() { + return redirectPort; + } + + public void setRedirectPort(Integer redirectPort) { + this.redirectPort = redirectPort; + } } } diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerBase.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerBase.java index 53afe9abec6..f51ed2efb25 100755 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerBase.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerBase.java @@ -20,6 +20,9 @@ import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; import org.zstack.core.workflow.SimpleFlowChain; +import org.zstack.header.acl.AccessControlListEntryVO; +import org.zstack.header.acl.AccessControlListEntryVO_; +import org.zstack.header.acl.AclEntryType; import org.zstack.header.core.Completion; import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.core.NopeCompletion; @@ -2019,19 +2022,19 @@ public String getName() { }); } - private void handle(APIAddAccessControlListToLoadBalancerMsg msg) { - thdf.chainSubmit(new ChainTask(msg) { - @Override - public String getSyncSignature() { - return getSyncId(); - } + private void doAddAccessControlListToLoadBalancer(APIAddAccessControlListToLoadBalancerMsg msg, final Completion completion) { + FlowChain flowChain = FlowChainBuilder.newSimpleFlowChain(); + Map data = new HashMap(); + flowChain.setName(String.format("add-acl-to-lb-listener-%s", msg.getListenerUuid())); + final LoadBalancerListenerVO lblVo = dbf.findByUuid(msg.getListenerUuid(), LoadBalancerListenerVO.class); + flowChain.setData(data); + + flowChain.then(new NoRollbackFlow() { + String __name__ = "add-acl-to-lb-listener"; @Override - public void run(SyncTaskChain chain) { - DebugUtils.Assert(msg.getAclType() != null && msg.getAclUuids() != null, "parameters cannot be null"); - APIAddAccessControlListToLoadBalancerEvent evt = new APIAddAccessControlListToLoadBalancerEvent(msg.getId()); + public void run(FlowTrigger trigger, Map data) { List refs = new ArrayList<>(); - final LoadBalancerListenerVO lblVo = dbf.findByUuid(msg.getListenerUuid(), LoadBalancerListenerVO.class); if (msg.getServerGroupUuids() != null && !msg.getServerGroupUuids().isEmpty()) { for (String aclUuid : msg.getAclUuids()) { List sgUuids = lblVo.getAclRefs().stream().filter(ref -> ref.getAclUuid().equals(aclUuid)) @@ -2057,37 +2060,95 @@ public void run(SyncTaskChain chain) { } dbf.persistCollection(refs); - final List refVOS = refs; + Integer instancePort = lblVo.getInstancePort(); + msg.getAclUuids().forEach(aclUuid -> { + SQL.New(AccessControlListEntryVO.class) + .eq(AccessControlListEntryVO_.aclUuid, aclUuid) + .eq(AccessControlListEntryVO_.type, AclEntryType.RedirectRule.toString()) + .isNull(AccessControlListEntryVO_.redirectPort) + .set(AccessControlListEntryVO_.redirectPort, instancePort) + .update(); + }); + + data.put("refs", refs); + trigger.next(); + } + }).then(new NoRollbackFlow() { + String __name__ = "refresh-lb-listener"; + + @Override + public void run(FlowTrigger trigger, Map data) { + List refs = (List) data.get("refs"); + if (refs.isEmpty()) { + trigger.next(); + return; + } boolean refresh = isListenerNeedRefresh(lblVo, msg.getServerGroupUuids()); - if (refresh) { - RefreshLoadBalancerMsg rmsg = new RefreshLoadBalancerMsg(); - rmsg.setUuid(msg.getLoadBalancerUuid()); - bus.makeLocalServiceId(rmsg, LoadBalancerConstants.SERVICE_ID); - bus.send(rmsg, new CloudBusCallBack(chain) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - logger.warn(String.format("update listener [uuid:%s] failed", msg.getLoadBalancerUuid())); - evt.setError(reply.getError()); - dbf.removeCollection(refVOS, LoadBalancerListenerACLRefVO.class); - } else { - evt.setInventory(LoadBalancerListenerInventory.valueOf(lblVo)); - } - bus.publish(evt); - } - }); - chain.next(); + if (!refresh) { + trigger.next(); return; } + RefreshLoadBalancerMsg rmsg = new RefreshLoadBalancerMsg(); + rmsg.setUuid(msg.getLoadBalancerUuid()); + bus.makeTargetServiceIdByResourceUuid(rmsg, LoadBalancerConstants.SERVICE_ID, msg.getLoadBalancerUuid()); + bus.send(rmsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.warn(String.format("update listener [uuid:%s] failed", msg.getLoadBalancerUuid())); + dbf.removeCollection(refs, LoadBalancerListenerACLRefVO.class); + trigger.fail(reply.getError()); + } else { + trigger.next(); + } + } + }); + } + }); - evt.setInventory( LoadBalancerListenerInventory.valueOf(lblVo)); - bus.publish(evt); - chain.next(); + flowChain.done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); + } + + private void handle(APIAddAccessControlListToLoadBalancerMsg msg) { + thdf.chainSubmit(new ChainTask(msg) { + @Override + public String getSyncSignature() { + return String.format("lb-%s-acl", msg.getLoadBalancerUuid()); + } + + @Override + public void run(SyncTaskChain chain) { + APIAddAccessControlListToLoadBalancerEvent evt = new APIAddAccessControlListToLoadBalancerEvent(msg.getId()); + doAddAccessControlListToLoadBalancer(msg, new Completion(msg) { + @Override + public void success() { + evt.setInventory(LoadBalancerListenerInventory.valueOf(dbf.findByUuid(msg.getListenerUuid(), LoadBalancerListenerVO.class))); + bus.publish(evt); + chain.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + evt.setError(errorCode); + bus.publish(evt); + chain.next(); + } + }); } @Override public String getName() { - return "add-acl-lb-listener"; + return getSyncSignature(); } }); } diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerGlobalProperty.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerGlobalProperty.java index 83bc5f46258..06939a46dac 100644 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerGlobalProperty.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerGlobalProperty.java @@ -7,4 +7,6 @@ public class LoadBalancerGlobalProperty { @GlobalProperty(name="upgradeLoadBalancerServerGroup", defaultValue = "false") public static boolean UPGRADE_LB_SERVER_GROUP; + @GlobalProperty(name="upgradeLoadBalancerRedirectRule", defaultValue = "false") + public static boolean UPGRADE_LB_REDIRECT_RULE; } diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerManagerImpl.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerManagerImpl.java index ba27d6efb38..8f1f8e1fc62 100755 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerManagerImpl.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerManagerImpl.java @@ -19,6 +19,7 @@ import org.zstack.header.AbstractService; import org.zstack.header.acl.AccessControlListEntryVO; import org.zstack.header.acl.AccessControlListEntryVO_; +import org.zstack.header.acl.AclEntryType; import org.zstack.header.apimediator.ApiMessageInterceptionException; import org.zstack.header.core.Completion; import org.zstack.header.core.WhileDoneCompletion; @@ -480,6 +481,7 @@ public boolean start() { prepareSystemTags(); upgradeLoadBalancerServerGroup(); + upgradeLoadBalancerRedirectRule(); return true; } @@ -1001,6 +1003,38 @@ public List getLoadBalancerListenterByVmNics(List vmNicUuids) { } + public void upgradeLoadBalancerRedirectRule() { + if (!LoadBalancerGlobalProperty.UPGRADE_LB_REDIRECT_RULE) { + return; + } + List redirectRules = Q.New(AccessControlListEntryVO.class) + .eq(AccessControlListEntryVO_.type, AclEntryType.RedirectRule.toString()) + .isNull(AccessControlListEntryVO_.redirectPort) + .list(); + if (redirectRules.isEmpty()) { + return; + } + + List toUpgradeRules = new ArrayList<>(); + for (AccessControlListEntryVO rule : redirectRules) { + LoadBalancerListenerVO lbListenerVO = SQL.New("select lbListener from LoadBalancerListenerVO lbListener, LoadBalancerListenerACLRefVO ref, AccessControlListVO acl " + + "where acl.uuid = ref.aclUuid and ref.listenerUuid = lbListener.uuid and acl.uuid = :aclUuid") + .param("aclUuid", rule.getAclUuid()) + .find(); + if (lbListenerVO == null) { + continue; + } + + rule.setRedirectPort(lbListenerVO.getInstancePort()); + toUpgradeRules.add(rule); + } + + if (!toUpgradeRules.isEmpty()) { + dbf.updateCollection(toUpgradeRules); + } + } + + @Override public void upgradeLoadBalancerServerGroup() { if (!LoadBalancerGlobalProperty.UPGRADE_LB_SERVER_GROUP) { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterLoadBalancerBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterLoadBalancerBackend.java index 18706f859e7..1b4266d6e05 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterLoadBalancerBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterLoadBalancerBackend.java @@ -348,6 +348,7 @@ public static class RedirectRule { private String aclUuid; private String redirectRule; private String serverGroupUuid; + private Integer redirectPort; public String getRedirectRuleUuid() { return redirectRuleUuid; @@ -380,6 +381,13 @@ public String getServerGroupUuid() { public void setServerGroupUuid(String serverGroupUuid) { this.serverGroupUuid = serverGroupUuid; } + + public Integer getRedirectPort() { + return redirectPort; + } + public void setRedirectPort(Integer redirectPort) { + this.redirectPort = redirectPort; + } } public String getListenerUuid() { @@ -774,11 +782,13 @@ private List makeRedirectAcl(LoadBalancerListenerInventory li redirectRule.setRedirectRuleUuid(entry.getUuid()); redirectRule.setServerGroupUuid(serverGroupUuids.get(0)); redirectRule.setRedirectRule(entry.getRedirectRule()); + redirectRule.setRedirectPort(entry.getRedirectPort()); } else { usedAggSgUuids.addAll(serverGroupUuids); redirectRule.setAclUuid(entry.getAclUuid()); redirectRule.setRedirectRuleUuid(entry.getUuid()); redirectRule.setRedirectRule(entry.getRedirectRule()); + redirectRule.setRedirectPort(entry.getRedirectPort()); StringBuilder stringBuilder = new StringBuilder(); for (String sgUuid : serverGroupUuids) { @@ -850,6 +860,7 @@ private List makeRedirectAcl(LoadBalancerListenerInventory li for (LbTO.RedirectRule rule : redirectRules) { LbTO.RedirectRule formatRule = new LbTO.RedirectRule(); formatRule.setRedirectRule(rule.getRedirectRule()); + formatRule.setRedirectPort(rule.getRedirectPort()); formatRule.setRedirectRuleUuid(rule.getRedirectRuleUuid()); formatRule.setAclUuid(rule.getAclUuid()); formatRule.setServerGroupUuid(rule.getServerGroupUuid()); diff --git a/sdk/src/main/java/org/zstack/sdk/AccessControlListEntryInventory.java b/sdk/src/main/java/org/zstack/sdk/AccessControlListEntryInventory.java index 3214b03f756..c6d8aeaefb4 100644 --- a/sdk/src/main/java/org/zstack/sdk/AccessControlListEntryInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/AccessControlListEntryInventory.java @@ -60,6 +60,14 @@ public java.lang.String getIpEntries() { return this.ipEntries; } + public java.lang.Integer redirectPort; + public void setRedirectPort(java.lang.Integer redirectPort) { + this.redirectPort = redirectPort; + } + public java.lang.Integer getRedirectPort() { + return this.redirectPort; + } + public java.lang.String description; public void setDescription(java.lang.String description) { this.description = description; diff --git a/sdk/src/main/java/org/zstack/sdk/AddAccessControlListRedirectRuleAction.java b/sdk/src/main/java/org/zstack/sdk/AddAccessControlListRedirectRuleAction.java index 741043fc2a3..99e77e1f46f 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddAccessControlListRedirectRuleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddAccessControlListRedirectRuleAction.java @@ -40,6 +40,9 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String aclUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {1L,65535L}, noTrim = false) + public java.lang.Integer redirectPort; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/VirtualRouterLoadBalancerForwardRuleCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/VirtualRouterLoadBalancerForwardRuleCase.groovy new file mode 100644 index 00000000000..526601a78c7 --- /dev/null +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/VirtualRouterLoadBalancerForwardRuleCase.groovy @@ -0,0 +1,415 @@ +package org.zstack.test.integration.networkservice.provider.virtualrouter.loadbalancer + +import org.springframework.http.HttpEntity +import org.zstack.core.db.DatabaseFacade +import org.zstack.core.db.Q +import org.zstack.core.db.SQL +import org.zstack.header.acl.AclEntryType +import org.zstack.header.acl.AccessControlListEntryVO +import org.zstack.header.acl.AccessControlListEntryVO_ +import org.zstack.header.network.service.NetworkServiceType +import org.zstack.network.service.eip.EipConstant +import org.zstack.network.service.lb.LoadBalancerAclStatus +import org.zstack.network.service.lb.LoadBalancerAclType +import org.zstack.network.service.lb.LoadBalancerConstants +import org.zstack.network.service.lb.LoadBalancerGlobalProperty +import org.zstack.network.service.lb.LoadBalancerListenerACLRefVO +import org.zstack.network.service.lb.LoadBalancerListenerServerGroupRefVO +import org.zstack.network.service.lb.LoadBalancerListenerServerGroupRefVO_ +import org.zstack.network.service.lb.LoadBalancerListenerVO +import org.zstack.network.service.lb.LoadBalancerListenerVO_ +import org.zstack.network.service.lb.LoadBalancerSystemTags +import org.zstack.network.service.lb.LoadBalancerListenerACLRefVO_ +import org.zstack.network.service.lb.LoadBalancerManagerImpl +import org.zstack.network.service.portforwarding.PortForwardingConstant +import org.zstack.network.service.virtualrouter.VirtualRouterVmVO +import org.zstack.network.service.virtualrouter.VirtualRouterVmVO_ +import org.zstack.network.service.virtualrouter.lb.VirtualRouterLoadBalancerBackend +import org.zstack.network.service.virtualrouter.vyos.VyosConstants +import org.zstack.sdk.* +import org.zstack.test.integration.networkservice.provider.NetworkServiceProviderTest +import org.zstack.testlib.EnvSpec +import org.zstack.testlib.SubCase +import org.zstack.utils.data.SizeUnit +import org.zstack.utils.gson.JSONObjectUtil + +class VirtualRouterLoadBalancerForwardRuleCase extends SubCase { + DatabaseFacade dbf + EnvSpec env + LoadBalancerManagerImpl lbMgr + + @Override + void setup() { + useSpring(NetworkServiceProviderTest.springSpec) + } + + @Override + void environment() { + env = env { + + instanceOffering { + name = "instanceOffering" + memory = SizeUnit.GIGABYTE.toByte(8) + cpu = 4 + } + + sftpBackupStorage { + name = "sftp" + url = "/sftp" + username = "root" + password = "password" + hostname = "localhost" + + image { + name = "image" + url = "http://zstack.org/download/test.qcow2" + } + + image { + name = "vr" + url = "http://zstack.org/download/vr.qcow2" + } + } + + zone { + name = "zone" + description = "test" + + cluster { + name = "cluster" + hypervisorType = "KVM" + + kvm { + name = "kvm" + managementIp = "localhost" + username = "root" + password = "password" + } + + attachPrimaryStorage("local") + attachL2Network("l2") + } + + localPrimaryStorage { + name = "local" + url = "/local_ps" + } + + l2NoVlanNetwork { + name = "l2" + physicalInterface = "eth0" + + l3Network { + name = "l3" + + service { + provider = VyosConstants.VYOS_ROUTER_PROVIDER_TYPE + types = [NetworkServiceType.DHCP.toString(), + NetworkServiceType.DNS.toString(), + NetworkServiceType.SNAT.toString(), + PortForwardingConstant.PORTFORWARDING_NETWORK_SERVICE_TYPE, + LoadBalancerConstants.LB_NETWORK_SERVICE_TYPE_STRING, + EipConstant.EIP_NETWORK_SERVICE_TYPE] + } + + ip { + startIp = "192.168.100.10" + endIp = "192.168.100.100" + netmask = "255.255.255.0" + gateway = "192.168.100.1" + } + } + + l3Network { + name = "pubL3" + + ip { + startIp = "11.168.100.10" + endIp = "11.168.100.100" + netmask = "255.255.255.0" + gateway = "11.168.100.1" + } + } + } + + attachBackupStorage("sftp") + + virtualRouterOffering { + name = "vro" + memory = SizeUnit.MEGABYTE.toByte(512) + cpu = 2 + useManagementL3Network("pubL3") + usePublicL3Network("pubL3") + useImage("vr") + } + + lb { + name = "lb1" + useVip("pubL3") + } + + lb { + name = "lb2" + useVip("pubL3") + } + } + + vm { + name = "vm1" + useImage("image") + useL3Networks("l3") + useInstanceOffering("instanceOffering") + } + + vm { + name = "vm2" + useImage("image") + useL3Networks("l3") + useInstanceOffering("instanceOffering") + } + + vm { + name = "vm3" + useImage("image") + useL3Networks("l3") + useInstanceOffering("instanceOffering") + } + } + } + + @Override + void test() { + dbf = bean(DatabaseFacade.class) + lbMgr = bean(LoadBalancerManagerImpl.class) + env.create { + testLoadBalancerForwardRule() + LoadBalancerGlobalProperty.UPGRADE_LB_REDIRECT_RULE = true + testUpgradeLoadBalancerForwardRule() + LoadBalancerGlobalProperty.UPGRADE_LB_REDIRECT_RULE = false + testLoadBalancerSpecialPortForwardRule() + } + } + + void testLoadBalancerForwardRule() { + def lb1 = env.inventoryByName("lb1") as LoadBalancerInventory + def vm1 = env.inventoryByName("vm1") as VmInstanceInventory + def vm2 = env.inventoryByName("vm2") as VmInstanceInventory + def vm3 = env.inventoryByName("vm3") as VmInstanceInventory + def l3 = env.inventoryByName("l3") as L3NetworkInventory + + def listener_1 = createLoadBalancerListener { + name = "listener-1" + loadBalancerUuid = lb1.uuid + protocol = "http" + loadBalancerPort = 80 + instancePort = 8080 + } as LoadBalancerListenerInventory + + def serverGroup_1 = createLoadBalancerServerGroup { + name = "server-group-1" + loadBalancerUuid = lb1.uuid + } as LoadBalancerServerGroupInventory + + addServerGroupToLoadBalancerListener { + serverGroupUuid = serverGroup_1.uuid + listenerUuid = listener_1.uuid + } + + def vmNic1 = vm1.vmNics.find{ nic -> nic.l3NetworkUuid == l3.uuid } as VmNicInventory + assert vmNic1 != null + + VirtualRouterLoadBalancerBackend.RefreshLbCmd cmd = null + env.afterSimulator(VirtualRouterLoadBalancerBackend.REFRESH_LB_PATH) { rsp, HttpEntity e -> + cmd = JSONObjectUtil.toObject(e.body, VirtualRouterLoadBalancerBackend.RefreshLbCmd.class) + return rsp + } + + def acl1 = createAccessControlList { + name = "acl-1" + } as AccessControlListInventory + + def aclRule1 = addAccessControlListRedirectRule { + name = "acl-rule-1" + aclUuid = acl1.uuid + domain = "zstack.local" + url = "/test1" + } as AccessControlListEntryInventory + + def rvo = Q.New(AccessControlListEntryVO.class) + .eq(AccessControlListEntryVO_.uuid, aclRule1.uuid) + .find() + assert rvo != null + assert rvo.getRedirectPort() == null + + addAccessControlListToLoadBalancer { + listenerUuid = listener_1.uuid + serverGroupUuids = [serverGroup_1.uuid] + aclUuids = [acl1.uuid] + aclType = "redirect" + } + + assert Q.New(AccessControlListEntryVO.class) + .eq(AccessControlListEntryVO_.uuid, aclRule1.uuid) + .eq(AccessControlListEntryVO_.redirectPort, 8080) + .isExists() + + addBackendServerToServerGroup { + serverGroupUuid = serverGroup_1.uuid + vmNics = [[ + uuid: vmNic1.uuid, + ipVersion: "4" + ]] + } + assert cmd != null + def lbTO = cmd.lbs.find { it.lbUuid == lb1.uuid } + assert lbTO != null + def redirectRuleTO = lbTO.redirectRules.find { it.redirectRuleUuid == aclRule1.uuid } + assert redirectRuleTO != null + assert redirectRuleTO.redirectPort == 8080 + + cmd = null + def acl2 = createAccessControlList { + name = "acl-2" + } as AccessControlListInventory + def aclRule2 = addAccessControlListRedirectRule { + name = "acl-rule-2" + aclUuid = acl2.uuid + domain = "zstack.local" + url = "/test2" + redirectPort = 9090 + } as AccessControlListEntryInventory + + assert Q.New(AccessControlListEntryVO.class) + .eq(AccessControlListEntryVO_.uuid, aclRule2.uuid) + .eq(AccessControlListEntryVO_.redirectPort, 9090) + .isExists() + + addAccessControlListToLoadBalancer { + listenerUuid = listener_1.uuid + serverGroupUuids = [serverGroup_1.uuid] + aclUuids = [acl2.uuid] + aclType = "redirect" + } + + assert cmd != null + lbTO = cmd.lbs.find { it.lbUuid == lb1.uuid } + assert lbTO != null + redirectRuleTO = lbTO.redirectRules.find { it.redirectRuleUuid == aclRule2.uuid } + assert redirectRuleTO != null + assert redirectRuleTO.redirectPort == 9090 + } + + void testLoadBalancerSpecialPortForwardRule() { + // port 80 is a special port, test whether the redirect rule with port 80 works well + def lb2 = env.inventoryByName("lb2") as LoadBalancerInventory + def vm3 = env.inventoryByName("vm3") as VmInstanceInventory + def l3 = env.inventoryByName("l3") as L3NetworkInventory + + def listener_2 = createLoadBalancerListener { + name = "listener-2" + loadBalancerUuid = lb2.uuid + protocol = "http" + loadBalancerPort = 8081 + instancePort = 80 + } as LoadBalancerListenerInventory + def serverGroup_2 = createLoadBalancerServerGroup { + name = "server-group-2" + loadBalancerUuid = lb2.uuid + } as LoadBalancerServerGroupInventory + addServerGroupToLoadBalancerListener { + serverGroupUuid = serverGroup_2.uuid + listenerUuid = listener_2.uuid + } + def vmNic3 = vm3.vmNics.find{ nic -> nic.l3NetworkUuid == l3.uuid } as VmNicInventory + assert vmNic3 != null + VirtualRouterLoadBalancerBackend.RefreshLbCmd cmd = null + env.afterSimulator(VirtualRouterLoadBalancerBackend.REFRESH_LB_PATH) { rsp, HttpEntity e -> + cmd = JSONObjectUtil.toObject(e.body, VirtualRouterLoadBalancerBackend.RefreshLbCmd.class) + return rsp + } + + def acl3 = createAccessControlList { + name = "acl-3" + } as AccessControlListInventory + def aclRule3 = addAccessControlListRedirectRule { + name = "acl-rule-3" + aclUuid = acl3.uuid + domain = "zstack.local" + url = "/test3" + redirectPort = 2000 + } as AccessControlListEntryInventory + addAccessControlListToLoadBalancer { + listenerUuid = listener_2.uuid + serverGroupUuids = [serverGroup_2.uuid] + aclUuids = [acl3.uuid] + aclType = "redirect" + } + + addBackendServerToServerGroup { + serverGroupUuid = serverGroup_2.uuid + vmNics = [[ + uuid: vmNic3.uuid, + ipVersion: "4" + ]] + } + + assert cmd != null + def lbTO = cmd.lbs.find { it.lbUuid == lb2.uuid } + assert lbTO != null + def redirectRuleTO = lbTO.redirectRules.find { it.redirectRuleUuid == aclRule3.uuid } + assert redirectRuleTO != null + assert redirectRuleTO.redirectPort == 2000 + + deleteAccessControlList { + uuid = acl3.uuid + } + } + + void testUpgradeLoadBalancerForwardRule() { + SQL.New(AccessControlListEntryVO.class) + .eq(AccessControlListEntryVO_.type, AclEntryType.RedirectRule.toString()) + .set(AccessControlListEntryVO_.redirectPort, null) + .update() + def aclRule1 = Q.New(AccessControlListEntryVO.class) + .eq(AccessControlListEntryVO_.name, "acl-rule-1") + .find() + assert aclRule1 != null + assert aclRule1.getRedirectPort() == null + def aclRule2 = Q.New(AccessControlListEntryVO.class) + .eq(AccessControlListEntryVO_.name, "acl-rule-2") + .find() + assert aclRule2 != null + assert aclRule2.getRedirectPort() == null + + lbMgr.upgradeLoadBalancerRedirectRule() + + assert Q.New(AccessControlListEntryVO.class) + .eq(AccessControlListEntryVO_.uuid, aclRule1.uuid) + .eq(AccessControlListEntryVO_.redirectPort, 8080) + .isExists() + assert Q.New(AccessControlListEntryVO.class) + .eq(AccessControlListEntryVO_.uuid, aclRule2.uuid) + .eq(AccessControlListEntryVO_.redirectPort, 8080) + .isExists() + + deleteAccessControlList { + uuid = aclRule1.aclUuid + } + deleteAccessControlList { + uuid = aclRule2.aclUuid + } + } + + @Override + void clean() { + def lb1 = env.inventoryByName("lb1") as LoadBalancerInventory + deleteLoadBalancer { + uuid = lb1.uuid + } + def lb2 = env.inventoryByName("lb2") as LoadBalancerInventory + deleteLoadBalancer { + uuid = lb2.uuid + } + env.delete() + } +} From 3d0cff2b7878cf37c02c5ccd2820c73b4fbb22ab Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Thu, 29 Jan 2026 15:42:58 +0800 Subject: [PATCH 719/737] [db]: quote `system` column to fix GreatSQL reserved keyword syntax error `system` is a reserved keyword in MySQL 8.0 / GreatSQL, causing SQL syntax errors during database migration. This change wraps the `system` column name with backticks in V5.4.2 and V5.4.6 schema files. Also updates beforeValidate.sql with new checksums: - V5.4.2__schema.sql: 1175380657 - V5.4.6__schema.sql: 268584834 Resolves: ZSTAC-81449 Change-Id: I686f676775647067616d6966677161646b637071 --- conf/db/upgrade/V5.4.2__schema.sql | 8 ++++---- conf/db/upgrade/V5.4.6__schema.sql | 4 ++-- conf/db/upgrade/beforeValidate.sql | 3 ++- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/conf/db/upgrade/V5.4.2__schema.sql b/conf/db/upgrade/V5.4.2__schema.sql index 476304fd72d..ff41dd38a76 100644 --- a/conf/db/upgrade/V5.4.2__schema.sql +++ b/conf/db/upgrade/V5.4.2__schema.sql @@ -132,9 +132,9 @@ BEGIN END IF; -- Find the model service uuid, only for system services - SELECT COUNT(*) INTO @cnt FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND system = 1; + SELECT COUNT(*) INTO @cnt FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND `system` = 1; IF @cnt > 0 THEN - SELECT uuid INTO service_uuid FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND system = 1 LIMIT 1; + SELECT uuid INTO service_uuid FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND `system` = 1 LIMIT 1; ELSE SET service_uuid = NULL; END IF; @@ -227,9 +227,9 @@ BEGIN LEAVE update_template_loop; END IF; - SELECT COUNT(*) INTO @cnt FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND system = 1; + SELECT COUNT(*) INTO @cnt FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND `system` = 1; IF @cnt > 0 THEN - SELECT uuid INTO service_uuid FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND system = 1 LIMIT 1; + SELECT uuid INTO service_uuid FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND `system` = 1 LIMIT 1; ELSE SET service_uuid = NULL; END IF; diff --git a/conf/db/upgrade/V5.4.6__schema.sql b/conf/db/upgrade/V5.4.6__schema.sql index 17bc4ae92bf..2556e35d053 100644 --- a/conf/db/upgrade/V5.4.6__schema.sql +++ b/conf/db/upgrade/V5.4.6__schema.sql @@ -272,9 +272,9 @@ BEGIN LEAVE update_template_loop; END IF; - SELECT COUNT(*) INTO @cnt FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND system = 1; + SELECT COUNT(*) INTO @cnt FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND `system` = 1; IF @cnt > 0 THEN - SELECT uuid INTO service_uuid FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND system = 1 LIMIT 1; + SELECT uuid INTO service_uuid FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND `system` = 1 LIMIT 1; ELSE SET service_uuid = NULL; END IF; diff --git a/conf/db/upgrade/beforeValidate.sql b/conf/db/upgrade/beforeValidate.sql index 1ecbf9febdc..c85be19589c 100644 --- a/conf/db/upgrade/beforeValidate.sql +++ b/conf/db/upgrade/beforeValidate.sql @@ -39,9 +39,10 @@ BEGIN update `zstack`.`schema_version` set `checksum`=613548663 where `script`='V5.3.6__schema.sql' and `checksum` <> 613548663; update `zstack`.`schema_version` set `checksum`=1489363540 where `script`='V5.3.22__schema.sql' and `checksum` <> 1489363540; update `zstack`.`schema_version` set `checksum`=1648524318 where `script`='V4.4.0__schema.sql' and `checksum` <> 1648524318; - update `zstack`.`schema_version` set `checksum`=-3265430 where `script`='V5.4.6__schema.sql' and `checksum` <> -3265430; + update `zstack`.`schema_version` set `checksum`=268584834 where `script`='V5.4.6__schema.sql' and `checksum` <> 268584834; update `zstack`.`schema_version` set `checksum`=-1455020895 where `script`='V5.1.4__schema.sql' and `checksum` <> -1455020895; update `zstack`.`schema_version` set `checksum`=569762641 where `script`='V5.4.0__schema.sql' and `checksum` <> 569762641; + update `zstack`.`schema_version` set `checksum`=1175380657 where `script`='V5.4.2__schema.sql' and `checksum` <> 1175380657; END IF; END $$ From 0fc540a87180983a3899bf9199399c9a1add2cbb Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Thu, 29 Jan 2026 16:58:53 +0800 Subject: [PATCH 720/737] [conf]: global error code mapping Resolves: ZSTAC-81675 Change-Id: I667775677a716e646d67617a7066697462746166 --- .../global-error-de-DE.json | 4717 +++++++++++++++++ .../global-error-en_US.json | 4717 +++++++++++++++++ .../global-error-fr-FR.json | 4717 +++++++++++++++++ .../global-error-id-ID.json | 4717 +++++++++++++++++ .../global-error-ja-JP.json | 4717 +++++++++++++++++ .../global-error-ko-KR.json | 4717 +++++++++++++++++ .../global-error-ru-RU.json | 4717 +++++++++++++++++ .../global-error-th-TH.json | 4717 +++++++++++++++++ .../global-error-zh_CN.json | 4717 +++++++++++++++++ .../global-error-zh_TW.json | 4717 +++++++++++++++++ 10 files changed, 47170 insertions(+) create mode 100644 conf/i18n/globalErrorCodeMapping/global-error-de-DE.json create mode 100644 conf/i18n/globalErrorCodeMapping/global-error-en_US.json create mode 100644 conf/i18n/globalErrorCodeMapping/global-error-fr-FR.json create mode 100644 conf/i18n/globalErrorCodeMapping/global-error-id-ID.json create mode 100644 conf/i18n/globalErrorCodeMapping/global-error-ja-JP.json create mode 100644 conf/i18n/globalErrorCodeMapping/global-error-ko-KR.json create mode 100644 conf/i18n/globalErrorCodeMapping/global-error-ru-RU.json create mode 100644 conf/i18n/globalErrorCodeMapping/global-error-th-TH.json create mode 100644 conf/i18n/globalErrorCodeMapping/global-error-zh_CN.json create mode 100644 conf/i18n/globalErrorCodeMapping/global-error-zh_TW.json diff --git a/conf/i18n/globalErrorCodeMapping/global-error-de-DE.json b/conf/i18n/globalErrorCodeMapping/global-error-de-DE.json new file mode 100644 index 00000000000..41e1915fedf --- /dev/null +++ b/conf/i18n/globalErrorCodeMapping/global-error-de-DE.json @@ -0,0 +1,4717 @@ +{ + "ORG_ZSTACK_XINFINI_SDK_10001": "Formatierung der API-Antwort zur Klasse [%s] fehlgeschlagen, resultString: %s, Ausnahme: %s", + "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10001": "Der datacenter-Typ [%s] wird hier nicht unterstützt!", + "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10000": "Das Argument 'endpoint' muss für den Konfigurationstyp %s gesetzt werden", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10080": "Die Baremetal2-Instanzerstellung kann keine geeignete Compute-Zone bestimmen. Bitte geben Sie eine Zone explizit an.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10084": "Weder die chassis-UUID noch die chassis-offering-UUID ist beim Erstellen einer Baremetal-Instanz gesetzt.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10082": "Das chassis hat nicht genügend Kapazität für das Image [%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10081": "Die erforderliche Festplatte [%s] gehört nicht zum chassis [%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10087": "Ein %s kann nur erstellt oder gelöscht werden, wenn sich die Baremetal2-Instanz im Status \"Running\" befindet.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10086": "%s kann nur durch Erstellungs- oder Löschvorgänge verwaltet werden", + "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10000": "Ungültiges Eingabeformat. Nur eine kommagetrennte Liste von Zahlen wird akzeptiert (z.B. %s).", + "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10001": "Der Host-VM hat nur %s CPUs verfügbar.", + "ORG_ZSTACK_ZWATCH_UTILS_10001": "Ressource [%s] unterstützt die zwatch return with-Klausel nicht", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10002": "Die Identitätsauthentifizierungsfunktion ist aktiviert, aber der zugehörige Ressourcenpool ist nicht konfiguriert. Bitte konfigurieren Sie den Ressourcenpool und versuchen Sie es erneut.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10003": "Der Ressourcenpool %s kann nicht freigegeben werden, während er in Verwendung ist", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10000": "Es gibt keine virtuelle Maschine, die aktiviert werden kann", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10001": "Ungültiger Token-Typ %s, es werden nur Token-Typen unterstützt, die in Cloud-Computing-Umgebungen verwendet werden.", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10059": "Eine leere Lizenz für autorisierte Knoten ist erforderlich", + "ORG_ZSTACK_STORAGE_PRIMARY_10039": "Kein primary storage [uuid:%s] existiert", + "ORG_ZSTACK_V2V_10019": "primary storage mit UUID:%s wird für die virtuelle Maschinenmigration v2v nicht unterstützt", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10007": "Fehler beim Übergang des Volume-Snapshots [uuid:%s, name:%s] aufgrund des Statusereignisses [%s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10006": "Fehler beim Abrufen der Größe von Volume [uuid:%s, installPath:%s] vom primary storage [uuid:%s], aufgrund von %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10005": "Fehler beim Abrufen der Größe von Volume [uuid:%s, installPath:%s] vom primary storage [uuid:%s], %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10004": "vm [uuid:%s] befindet sich nicht in einem Running-, Paused-, Destroyed- oder Stopped-Status; aktueller Status [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_10040": "primaryStorage [uuid=%s] existiert nicht in der Cloud-Umgebung", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10003": "Volume nicht gefunden für Volume-UUID: %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10002": "Snapshot oder dessen Nachkomme hat eine Referenz zu Volume [uuids:%s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10001": "Volume-Snapshot [uuid:%s, name:%s] kann nicht gefunden werden, er wurde möglicherweise durch einen früheren Vorgang gelöscht", + "ORG_ZSTACK_STORAGE_PRIMARY_10047": "cidr [%s] Ungültiges Eingabeformat", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10050": "ZSha2 zeigt das Vorhandensein eines anderen Management-Knotens an; dieser Knoten wurde jedoch nicht in der Datenbank gefunden. Bitte überprüfen Sie die Existenz des Management-Knotens.", + "ORG_ZSTACK_STORAGE_PRIMARY_10046": "Es ist nur ein primary storage CIDR-System-Tag erlaubt, aber %d gefunden", + "ORG_ZSTACK_STORAGE_PRIMARY_10049": "clusterUuid-Konflikt: Der durch das Instanzangebot angegebene Cluster ist %s, und der durch den Erstellungsparameter angegebene Cluster ist %s", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10052": "Abmeldung der App-ID nicht gefunden! Bitte überprüfen Sie die App-ID und versuchen Sie es erneut.", + "ORG_ZSTACK_STORAGE_PRIMARY_10042": "Bitte geben Sie den Instanztyp und den gewünschten Speicher an, bevor Sie Ressourcen bereitstellen.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10008": "Volume[uuid:%s] kann nicht auf Snapshot[uuid:%s] zurückgesetzt werden, das Volume der VM[uuid:%s] befindet sich nicht im Status \"Stopped\", aktueller Status ist %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10044": "Kein qualifizierter primärer Speicher gefunden; Fehler sind %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10000": "Aktualisierung des Gruppenstatus fehlgeschlagen: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10050": "primaryStorageUuid-Konflikt: Der durch das Instanzangebot angegebene primäre Speicher ist %s, während der durch den Erstellungsparameter angegebene primäre Speicher %s ist.", + "ORG_ZSTACK_V2V_10008": "Dieselbe MAC-Adresse [%s] ist im Netzwerk[%s] nicht erlaubt", + "ORG_ZSTACK_V2V_10009": "Doppelte MAC-Adresse [%s] im Netzwerk[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_10052": "primaryStorageUuid-Konflikt: Der durch das Plattenangebot angegebene primäre Speicher ist %s, während der durch den Erstellungsparameter angegebene primäre Speicher %s ist.", + "ORG_ZSTACK_V2V_10006": "Die zugrunde liegende Compute-Instanz des Konversions-Hosts[uuid:%s] sollte verbunden sein", + "ORG_ZSTACK_V2V_10007": "Konversions-Host[uuid:%s] kann keine Verbindung zum primären Speicher[uuid:%s] herstellen", + "ORG_ZSTACK_V2V_10004": "VM-Instanz [UUID:%s] existiert nicht oder ist keine VMware-VM-Instanz", + "ORG_ZSTACK_V2V_10005": "conversionHostUuid darf nicht null sein. Bitte stellen Sie sicher, dass eine gültige Host-UUID angegeben wird.", + "ORG_ZSTACK_V2V_10002": "Der v2v-Konversions-Host-Speicherpfad muss ein absoluter Pfad sein. Bitte geben Sie einen gültigen absoluten Pfad an.", + "ORG_ZSTACK_V2V_10003": "Ungültige v2v-URL: %s", + "ORG_ZSTACK_V2V_10000": "Der Status des Hosts [uuid:%s] muss \"Connected\" sein, bevor Sie mit der Cloud-Bereitstellung fortfahren.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10021": "Speicher-Snapshot kann nicht erstellt werden, erwartete VM-Status sind [%s, %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10020": "Volume-Snapshot[uuids:%s] befindet sich im deaktivierten Status und kann nicht für Volume-Rückgängig verwendet werden.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10029": "Abbruch des Löschauftrags fehlgeschlagen. Volume[uuid:%s] angehängte VM nicht im Status %s; Offline-Snapshot-Löschung wird nicht unterstützt und kann nicht abgebrochen werden.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10028": "Abbruch des Löschauftrags fehlgeschlagen. Volume[uuid:%s] ist mit einer nicht existierenden virtuellen Maschine verknüpft; Offline-Snapshot-Löschung unterstützt keinen Abbruch.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10027": "Abbruch des Löschauftrags fehlgeschlagen. Volume[uuid:%s] ist nicht an eine VM angehängt, und Offline-Snapshot-Löschung unterstützt keinen Abbruch.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10026": "Abbruch des Löschauftrags fehlgeschlagen. Volume[uuid:%s] existiert nicht.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10025": "Volume-UUID für Snapshots[uuid:%s] kann nicht gefunden werden.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10024": "Löschen von Snapshots aus verschiedenen Volumes wird nicht unterstützt [UUID:%s, %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10023": "Original-Volume für Snapshot [uuid:%s] wurde gelöscht; Volume kann nicht in den Originalzustand zurückgesetzt werden.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10022": "Volume-Snapshot [uuid:%s] befindet sich derzeit im Status %s und kann nicht für Volume-Rückgängig verwendet werden.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10018": "Snapshot kann nicht gefunden werden: %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10017": "Primärer Speicher[uuid:%s] unterstützt keine Volume-Snapshots; daher kann kein Snapshot für Volume[uuid:%s] erstellt werden.", + "ORG_ZSTACK_YUNSHAN_UTIL_10000": "Die NSP-URL ist null, bitte konfigurieren Sie den Cloud Computing Service NSP.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10016": "Primärspeicher [uuid:%s] kann nicht für Volume-Snapshot-Funktion angefordert werden", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10015": "Typ für Primärspeicher [%s] nicht gefunden", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10012": "Nicht unterstützte maximale Snapshot-Anzahl (%d) für Volume [UUID:%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10027": "SanSecClientFactory Verbindungstest fehlgeschlagen", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10019": "Dieser Ressourcentyp %s unterstützt keine Abfrage von Arbeitsspeicher-Snapshot-Referenzen", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10007": "panguPartitionUuid [%s] stimmt nicht mit identityZoneUuid [%s] überein", + "ORG_ZSTACK_APPLIANCEVM_10006": "appliance vm[uuid:%s] befindet sich im Status %s und kann keinen HTTP-Aufruf an %s durchführen", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10006": "panguPartitionUuid oder identityZoneUuid muss angegeben werden.", + "ORG_ZSTACK_AI_10120": "model center [uuid:%s] nicht in der Cloud-Umgebung gefunden", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10008": "Identitätszone [%s] kann nicht gelöscht werden, da sie noch Aliyun Ebs Primary Storage-Instanzen enthält. Bitte stellen Sie sicher, dass alle zugehörigen Speicherressourcen zuerst gelöscht werden.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10061": "Sicherheitsgruppenregel konnte nicht geändert werden, da das Protokoll [%s] keinen leeren Zielportbereich zulässt", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10060": "Sicherheitsgruppenregel konnte nicht geändert werden, da das angegebene Protokoll [%s] das Festlegen eines Zielportbereichs nicht unterstützt", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10063": "Sicherheitsgruppenregel konnte nicht geändert werden, da eine doppelte Regel [%s] bereits in der Datenbank mit UUID %s existiert", + "ORG_ZSTACK_APPLIANCEVM_10000": "Fehler beim Festlegen der Appliance-Bootstrap-Informationen wegen:%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10062": "Sicherheitsgruppenregel konnte nicht geändert werden, da das angegebene Protokoll [%s] erfordert, dass ein Zielportbereich festgelegt wird", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10033": "Instanzangebot [uuid:%s] kann nicht gelöscht werden, da es von NFV-Instanzgruppen [%s] verwendet wird", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10001": "ALIYUN EBS UNTERSTÜTZT DIE GRÖSSENÄNDERUNG EINER LAUFENDEN VM ZU DIESEM ZEITPUNKT NICHT.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10031": "NFV-Instanzgruppe [uuid:%s, name:%s] kann nicht bereitgestellt werden, wenn der Status nicht Initialisierung ist.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10000": "Gerätepfad kann nicht aus Volume gefunden werden: %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10032": "NfvInstanceGroup[uuid:%s, name:%s] kann ohne Mitgliedsinstanzen nicht bereitgestellt werden. Bitte erstellen Sie mindestens eine NFV-Instanz innerhalb der Gruppe vor der Bereitstellung.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10003": "ISO [%s] ist angehängt. Bitte hängen Sie sie ab, bevor Sie sie erneut anhängen.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10006": "Ungültige CPU [CPU_ID], der Host [HOST_UUID] hat keine CPU mit der angegebenen ID [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10030": "NfvInstanceGroup[uuid:%s, name:%s] kann ohne konfigurierte virtuelle IP bereitgestellt werden. Bitte konfigurieren Sie eine virtuelle IP für die Gruppe vor der Bereitstellung.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10005": "URL muss mit http:// oder https:// beginnen, aber %s erhalten", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10004": "Die URL für den Ocean-Endpunkt muss für Alibaba Cloud EBS Primary Storage konfiguriert werden.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10019": "Der Name [%s] ist für eine Ressource ungültig. Der Name muss folgenden Anforderungen entsprechen:", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10013": "- Zwischen 1 und 128 Zeichen lang sein.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10012": "- Aus Groß- und Kleinbuchstaben, Zahlen, Unterstrichen (_) und Bindestrichen (-) bestehen.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10018": "- Mit einem Buchstaben beginnen.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10028": "- Nicht mit einem Leerzeichen beginnen oder enden.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10017": "Es wurde kein BareMetal2-Gateway im Cluster [uuid:%s] gefunden", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10010": "CloudFile [%s] konnte nicht erstellt werden", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10029": "NfvInstanceGroup [uuid:%s] nicht gefunden", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10026": "NFV-Instanz [uuid:%s] kann nicht von der Gruppe [uuid:%s, name:%s] getrennt werden, da sie das einzige Mitglied ist. Eine Gruppe muss mindestens ein Mitglied enthalten.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10027": "NFV-Instanz [uuid:%s] kann nicht von der Gruppe [uuid:%s, name:%s] getrennt werden, da sie das einzige aktive Mitglied ist. Mindestens ein weiteres Mitglied muss den Status \"Running\" haben.", + "ORG_ZSTACK_AI_10129": "Unerwarteter null-Wert von %s des Tokens: %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10024": "NFV-Instanz [uuid:%s] nicht gefunden", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10016": "Signaturüberprüfung für %s bei der Cloud-Ressourcenvalidierung fehlgeschlagen", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10025": "NFV-Instanz [uuid:%s] kann nicht von der Gruppe [uuid:%s, name:%s] getrennt werden, da sie derzeit nicht zugeordnet ist. Aktueller Status-Detail ist %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10003": "Backup-Speicher [UUID: %s] ist nicht mit der Zone [UUID: %s] verknüpft, zu der der primäre Speicher [UUID: %s] gehört", + "ORG_ZSTACK_AI_10127": "Der Mode-Parameter darf nicht leer sein. Bitte geben Sie einen gültigen Mode-Wert an.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10011": "Zuweisung des Compute-Knotens in Clustern [uuids:%s] für BareMetal-Instanz [uuid:%s] fehlgeschlagen", + "ORG_ZSTACK_AI_10128": "Aktuell zulässige Werte sind ['%s']", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10010": "Zuweisung des Gateways in Clustern [uuids:%s] für BareMetal-Instanz [uuid:%s] fehlgeschlagen", + "ORG_ZSTACK_AI_10125": "Ungültige Modellklassifizierung: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10004": "Volume [uuid:%s] ist an eine laufende VM angehängt. VM sollte vor dem Anhängen eines Volumes gestoppt werden.", + "ORG_ZSTACK_AI_10126": "Ungültige Konfiguration für ModelServiceVO [uuid: %s] gespeichert: %s", + "ORG_ZSTACK_AI_10123": "Model-Center mit UUID: %s kann nicht gefunden werden", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10015": "Bereitgestellte IP %s liegt außerhalb des DHCP-Bereichs %s ~ %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10014": "Bereitgestellte IP %s wurde bereits von einer anderen Instanz belegt", + "ORG_ZSTACK_AI_10121": "Keine Model-Center-Instanz gefunden. Bitte erstellen Sie zunächst eine Model-Center-Instanz.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10013": "Nur BareMetal2-Cluster [UUID:%s] erfüllen die Anforderungen für Chassis und Gateway, aber diese Cluster haben kein bereitgestelltes Netzwerk angeschlossen.", + "ORG_ZSTACK_STORAGE_PRIMARY_10000": "ISO kann nicht an einen deaktivierten primären Speicher [uuid:%s] angehängt werden", + "ORG_ZSTACK_AI_10122": "System-Tag für ModelServiceInstanceGroupVO [uuid: %s] konnte nicht erstellt werden, weil %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10012": "Kein BareMetal2-Knoten im Cluster [uuid:%s] gefunden", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10019": "Ungültiger Installationspfad: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10010": "Volume-ID: %s anhängen, aber eine andere Volume-ID existiert bereits in der URL: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10012": "hostUuid [%s] existiert bereits in der URL: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10014": "Ungültige Installations-URL: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10015": "Gerätepfad auf Host nicht gefunden: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10008": "Kein Baremetal2-Compute-Cluster gefunden", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10002": "vHost-User-Client konnte in Host[uuid:%s] für VM[uuid:%s] nicht generiert werden: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10007": "Unzureichende Details zur Bestimmung des zu verwendenden BareMetal2-Clusters.%s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10006": "Kein an Zone [uuid:%s] angeschlossenes Backup-Speicher enthält das ISO [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10005": "Das Image mit UUID [%s] kann in keinem verbundenen Backup-Speicher gefunden werden. Bitte überprüfen Sie Folgendes:", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10000": "vHost-User-Client konnte in Host[uuid:%s] für VM[uuid:%s] nicht gelöscht werden: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10009": "Primärspeicher konnte in Clustern [uuids:%s] für Bare-Metal-Instanz [uuid:%s] nicht zugewiesen werden", + "ORG_ZSTACK_STORAGE_PRIMARY_10014": "Primärspeicher mit UUID:%s kann nicht gelöscht werden, da er noch an Cluster mit UUID:%s angeschlossen ist", + "ORG_ZSTACK_AI_10116": "Keine Dienstinstanzgruppen in der Cloud-Umgebung gefunden. Bitte überprüfen Sie Ihre Konfiguration.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10000": "Baremetal2-Instanz[uuid:%s] existiert nicht oder ist nicht verbunden; daher kann ihr Passwort nicht geändert werden.", + "ORG_ZSTACK_AI_10117": "Dataset mit UUID [%s] nicht gefunden", + "ORG_ZSTACK_STORAGE_PRIMARY_10016": "Volume[uuid:%s] kann nicht angehängt werden, da sich sein Primärspeicher im Wartungsmodus befindet", + "ORG_ZSTACK_AI_10114": "Modell-Dienstinstanzgruppe [UUID: %s] nicht gefunden; Wartezeit für Service-Start-Bereitschaftsprüfung wird abgebrochen", + "ORG_ZSTACK_AI_10115": "Entweder 'Gruppen-UUIDs' oder 'Alle synchronisieren' müssen angegeben werden", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10004": "Das Image mit UUID [%s] kann in keinem verbundenen Backup-Speicher, der mit der Zonen-UUID [%s] verbunden ist, gefunden werden. Bitte überprüfen Sie Folgendes:", + "ORG_ZSTACK_AI_10112": "Nicht unterstützter Modell-Diensttyp: %s, entsprechendes Backend für Neustart-Operationen kann nicht gefunden werden", + "ORG_ZSTACK_AI_10113": "Modell-Dienstinstanzgruppe [UUID: %s] nicht gefunden, Wartezeit für Service-Start-Initialisierung wird übersprungen", + "ORG_ZSTACK_AI_10111": "Modell-Dienstinstanz[uuid: %s] nicht gefunden", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10001": "LLDP-Schnittstelleninformationen konnten nicht abgerufen werden, da sie nicht für den Empfang von Daten konfiguriert ist.", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10037": "Lizensierter autorisierter Knoten mit UUID [%s] nicht gefunden", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10003": "LLDP-Referenz für[%s] konnte nicht abgerufen werden", + "ORG_ZSTACK_STORAGE_PRIMARY_10018": "zoneUuids, clusterUuids und primaryStorageUuids müssen jeweils mindestens eine nicht-leere Liste enthalten, oder alle Werte müssen auf true gesetzt sein.", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10032": "Nicht autorisierte Knoten sollten vor dem Upgrade auf eine lizenzierte Serverumgebung nicht vorhanden sein. Bitte stellen Sie sicher, dass alle Knoten über gültige Lizenzen verfügen, bevor Sie mit dem Upgrade-Vorgang fortfahren.", + "ORG_ZSTACK_STORAGE_PRIMARY_10017": "outputProtocol[%s] ist bereits auf Primärspeicher[%s] vorhanden, muss nicht erneut hinzugefügt werden", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10033": "Einige zugehörige lizenzierte virtuelle Knoten wurden nicht beendet.%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10085": "Sicherheitsgruppe mit UUID:%s wurde nicht mit L3-Netzwerk UUID:%s verknüpft, Trennung nicht möglich", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10000": "LLDP-Modus für Schnittstellen verschiedener Hosts konnte nicht geändert werden", + "ORG_ZSTACK_STORAGE_PRIMARY_10019": "Primärspeicher mit UUID:%s wurde noch nicht an Cluster mit UUID:%s angeschlossen", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10087": "Standardregel[uuid:%s] kann nicht gelöscht werden", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10011": "NfvInstanceGroup[uuid:%s, name:%s] kann im Status \"Wird ausgeführt\" nicht gelöscht werden", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10086": "Sicherheitsgruppenregeln können nicht aus einer anderen Sicherheitsgruppe gelöscht werden", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10089": "Das L3-Netzwerk[uuid:%s] hat den Netzwerkdiensttyp[%s] nicht aktiviert", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10088": "Sicherheitsgruppe mit UUID:%s wurde dem L3-Netzwerk UUID:%s zugeordnet; daher kann sie nicht erneut angehängt werden.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10010": "NFV-Instanz kann nicht erstellt werden, Gruppe[uuid:%s, name:%s] hat bereits %d Mitglieder, maximal erlaubt sind 3", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10026": "Die relativeTime[%s] ist ungültig, sie überschreitet den maximal zulässigen Wert", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10025": "Die relativeTime[%s] ist ungültig; sie muss in einem Format wie 10s oder 1h angegeben werden.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10008": "NFV-Instanz kann nicht erstellt werden, wenn sich Gruppe [uuid:%s, name:%s] im aktiven Modus befindet. Bitte wechseln Sie zunächst in den Wartungsmodus.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10009": "NFV-Instanz kann nicht erstellt werden, wenn sich Gruppe[uuid:%s, name:%s] im Status %s befindet", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10006": "nfv-Instanz %s [uuid: %s] der nfv-Instanzgruppe %s [uuid: %s] hat haStatus von %s zu %s geändert", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10039": "vhost-Volume unterstützt keine Anhang an bareMetalInstance2", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10038": "NIC mit MAC:%s kann nicht an L3-Netzwerk angehängt werden, da es verbunden wurde", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10004": "Alle Knoten befinden sich nicht in einem erwarteten Zustand für die Cloud-Bereitstellung. Bitte überprüfen Sie den Status aller Knoten und stellen Sie sicher, dass sie die erforderlichen Bedingungen für den Betrieb erfüllen.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10002": "Erstellen der Affinitätsgruppe für NFV-Instanzgruppe [uuid:%s] fehlgeschlagen", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10033": "customMAC ist obligatorisch beim Anhängen eines L3-Netzwerks an eine BareMetal-Instanz.", + "ORG_ZSTACK_STORAGE_PRIMARY_10024": "primärer Speicher(s) [uuid: %s] auf dem sich Volumes befinden, ist nicht aktiviert oder verbunden", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10032": "L2-Netzwerktyp %s wird von Baremetal2-Instanzen nicht unterstützt.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10031": "Nur Layer-3-Netzwerk mit IP-Version %d wird von Baremetal2-Instanz unterstützt", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10031": "Nur ein Lizenzserver ist berechtigt, eine lizenzierte Client-Instanz abzumelden.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10030": "Baremetal2-Instanz[uuid:%s] wurde kein Compute-Knoten zugewiesen; bitte starten Sie die Instanz und versuchen Sie es erneut.", + "ORG_ZSTACK_STORAGE_PRIMARY_10021": "primärer Speicher und Cluster befinden sich nicht in derselben Verfügbarkeitszone[uuid:%s] [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10037": "MAC-Adresse %s wurde bereits zugewiesen, bitte versuchen Sie eine andere", + "ORG_ZSTACK_STORAGE_PRIMARY_10020": "primärer Speicher [uuid:%s] wurde an Cluster [uuid:%s] angehängt", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10036": "baremetal2-Instanz[uuid:%s] auf Chassis[uuid:%s] hat keine nicht-provisionierende NIC mit MAC-Adresse %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10023": "'UUID' und 'Typ' müssen gleichzeitig für beide gesetzt werden oder für keinen!", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10035": "doppelte MAC-Adresse %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10022": "URL[%s] wird bereits verwendet und kann nicht innerhalb desselben Clusters dupliziert werden.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10034": "%s ist keine gültige MAC-Adresse", + "ORG_ZSTACK_AI_10130": "Unerwarteter Wert erhalten: %s von %s, erwartete Werte liegen innerhalb des vordefinierten Bereichs für Cloud-Ressourcenmetriken", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10026": "ungültiger Lizenztyp %s für Cloud-Computing-Umgebung", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10027": "Es sollten keine autorisierten virtuellen Maschinen vorhanden sein, wenn ein Lizenzserver registriert wird.%s", + "ORG_ZSTACK_STORAGE_PRIMARY_10029": "Es können nicht %s Bytes auf dem primären Speicher [uuid:%s] reserviert werden, da der verfügbare Speicherplatz nicht ausreicht", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10093": "VM-Netzwerkkarten mit UUIDs:%s befinden sich nicht auf L3-Netzwerken, die der Sicherheitsgruppen-ID UUID:%s zugeordnet sind", + "ORG_ZSTACK_STORAGE_PRIMARY_10028": "Nach Abzug der reservierten Kapazität ist nicht genügend primärer Speicher mit der erforderlichen Größe verfügbar, möglicherweise aufgrund eines niedrigeren Schwellenwerts für die physische Kapazitätseinstellung des primären Speichers.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10096": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, da eine doppelte UUID in remoteSecurityGroupUuids existiert: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10095": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, da die Regelliste nicht leer sein darf oder die maximale Anzahl von %d überschreitet", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10098": "Die Remote-Sicherheitsgruppen-UUID steht in Konflikt mit einem vorhandenen Eintrag. Bitte überprüfen und aktualisieren Sie die Sicherheitsgruppenregel.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10022": "NFV-Instanz kann nicht von der Gruppe [uuid:%s, name:%s] getrennt werden, wenn sie sich im normalen Betriebsmodus befindet. Bitte wechseln Sie zunächst in den Wartungsmodus.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10097": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, da die Sicherheitsgruppe [uuid:%s] nicht existiert", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10023": "NFV-Instanz kann nicht von der Gruppe [uuid:%s, name:%s] getrennt werden, wenn der Status %s ist", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10020": "Eine NFV-Instanz kann nicht an die Gruppe [uuid:%s, name:%s] angehängt werden. Der Gruppenstatus ist %s mit %d Mitgliedern. Das Anhängen ist nur zulässig, wenn: die Gruppe leer ist oder sich in einem Zustand Healthy/Degraded mit 1-2 Mitgliedern befindet.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10099": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, da die Priorität größer als %d oder gleich %d sein muss", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10018": "Ungültige Richtung[%s], nur unterstützte Richtungen sind zulässig", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10024": "Ungültiger Typ[%s], nur primitive Typen oder häufig verwendete Referenztypen sind zulässig", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10019": "NFV-Instanz kann nicht an die Gruppe [UUID: %s, Name: %s] angehängt werden, wenn ihr Status %s ist", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10023": "Ungültiger rechter Wert[%s], es muss eine Fließkommazahl sein", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10029": "Baremetal2-Instanz [uuid:%s] ist nicht gestoppt und kann nicht auf ein anderes Chassis-Angebot geändert werden.", + "ORG_ZSTACK_STORAGE_PRIMARY_10030": "Nach dem Entfernen des primären Speichers%s zur Vermeidung ist kein primärer Speicherkandidat mehr verfügbar. Bitte überprüfen Sie den Status und den Zustand des primären Speichers im Cluster.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10022": "Ungültiger rechter Wert[%s], es muss eine Fließkommazahl größer als Null und kleiner als Eins sein", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10017": "NFV-Instanz [uuid:%s] kann nicht an die Gruppe [uuid:%s, name:%s] angehängt werden. Die Instanz ist bereits Teil dieser Gruppe mit einem Cluster-Status von %s. Das Anhängen ist nicht zulässig, wenn sich die Instanz in den Zuständen Leader, Follower, Leaving oder Joining Candidate befindet.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10021": "Ungültige Argumente %s, in diesem Kontext sind keine Argumente zulässig", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10018": "Eine NFV-Instanz kann nicht an die Gruppe [UUID:%s, Name:%s] angehängt werden, wenn sie sich im normalen Betriebsmodus befindet. Bitte schalten Sie die Gruppe zunächst in den Wartungsmodus.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10020": "Ungültiger rechter Wert[%s], es muss ein gültiger numerischer Typ (int, long, float, double) in Cloud-Computing-Umgebungen sein", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10015": "syncNfvInstGroup ist nur im Wartungsmodus zulässig. Aktueller Modus: %s. Bitte wechseln Sie zunächst in den Wartungsmodus.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10013": "Der Betriebsmodus kann im INITIALIZING-Zustand nicht geändert werden. Bitte stellen Sie sicher, dass die Gruppe bereit ist, bevor Änderungen vorgenommen werden. Aktueller Status: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10036": "PrimaryStorageTagAllocatorExtensionPoint[%s] gibt null geeignete primäre Speicherkandidaten zurück", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10022": "Der aktuelle Vorgang wird auf einer lokalen Baremetal-Instanz nicht unterstützt. Bitte stellen Sie sicher, dass der Vorgang in einer virtualisierten Umgebung ausgeführt wird.", + "ORG_ZSTACK_STORAGE_PRIMARY_10035": "PrimaryStorageFeatureAllocatorFlow[%s] gibt null lebensfähige primäre Speicherkandidaten zurück", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10021": "Eine Bare-Metal-Instanz darf ihre VM-NIC-Netzwerkeinstellungen nicht ändern. Bitte stellen Sie sicher, dass Sie einen kompatiblen Instanztyp verwenden.", + "ORG_ZSTACK_STORAGE_PRIMARY_10038": "%s ist ungültig. %s ist keine gültige Instanz-UUID", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10020": "Unterstützt nur VPC-Netzwerk zum Anhängen von EIP an BareMetal2-Instanzen.", + "ORG_ZSTACK_STORAGE_PRIMARY_10037": "Der primäre Speicher [uuid:%s] befindet sich nicht im verbundenen Zustand, aktueller Status ist %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10026": "baremetal2-Instanz[uuid:%s] ist betriebsbereit, aber ihr Agent ist nicht verbunden.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10025": "baremetal2-Instanz[uuid:%s] ist nicht ausgeschaltet", + "ORG_ZSTACK_STORAGE_PRIMARY_10034": "Primärer Speicher mit benutzerdefiniertem Tag[%s] kann nicht gefunden werden. Der benutzerdefinierte Tag ist in der Instanz- oder Datenträgerkonfiguration angegeben.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10024": "baremetal2-Instanz[uuid:%s] ist nicht verbunden", + "ORG_ZSTACK_STORAGE_PRIMARY_10033": "Primärer Speicher[uuid:%s] kann nicht gefunden werden, die UUID ist in der Instanz- oder Datenträgerkonfiguration angegeben", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10023": "Der Vorgang wird für BareMetal2-Instanzen nicht unterstützt. Bitte stellen Sie die Kompatibilität mit virtualisierten Umgebungen sicher.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10051": "baremetal2-Gehäuse mit UUID:%s existiert nicht", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10050": "Es ist nicht notwendig, chassisOfferingUuid festzulegen, da der Instanz bereits ein Gehäuseangebot zugewiesen wurde", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10021": "VM-NIC-Sicherheitsgruppe konnte nicht festgelegt werden, da die angegebene Sicherheitsgruppe [uuid:%s] nicht Ihrem Konto [uuid:%s] oder einem Administrator gehört", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10020": "VM-NIC-Sicherheitsgruppe konnte nicht festgelegt werden, da eine doppelte Sicherheitsgruppe [uuid:%s] vorhanden ist", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10023": "VM-NIC-Sicherheitsgruppe konnte nicht festgelegt werden, da ungültige Priorität; aufeinanderfolgende Prioritäten erwartet, aber %d und %d gefunden", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10022": "VM-NIC-Sicherheitsgruppe konnte nicht festgelegt werden, da ungültige Priorität; Priorität sollte bei 1 beginnen, aber [%d]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10025": "VM-NIC-Sicherheitsgruppe konnte nicht festgelegt werden, da die Admin-Sicherheitsgruppenpriorität [%d] höher sein muss als die der Benutzergruppen", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10027": "Sicherheitsgruppenregelzustand konnte nicht geändert werden, da Sicherheitsgruppe [uuid:%s] nicht gefunden wurde", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10026": "Sicherheitsgruppenregelzustand konnte nicht aktualisiert werden, da die Regel-UUIDs-Liste leer ist. Bitte geben Sie gültige Regel-UUIDs an, um fortzufahren.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10029": "Sicherheitsgruppenregelzustand konnte nicht geändert werden, da keine Sicherheitsgruppenregeln Zustandsänderungen erfordern.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10028": "Sicherheitsgruppenregelzustand konnte nicht geändert werden, da Sicherheitsgruppenregel[uuid:%s] nicht gefunden wurde", + "ORG_ZSTACK_ZWATCH_10004": "Einige Nachrichten sind abgelaufen und dürfen aufgrund von Systemeinschränkungen nicht geändert werden. Das System wird diese abgelaufenen Nachrichten automatisch bereinigen. Bitte versuchen Sie Ihren Vorgang zu einem späteren Zeitpunkt.", + "ORG_ZSTACK_ZWATCH_10003": "Ungültiger Aktionstyp: %s, es werden nur Schreib- oder Löschvorgänge unterstützt", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10054": "baremetal2-Gehäuse[uuid:%s] wurde bereits einer anderen Ressource zugewiesen.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10053": "baremetal2-Gehäuse[uuid:%s] ist nicht aktiviert", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10052": "baremetal2-Gehäuse[uuid:%s] ist nicht mit dem Gehäuseangebot[uuid:%s] verknüpft", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10059": "Bitte setzen Sie nicht gleichzeitig sowohl Gehäuse-UUID als auch Gehäuseangebot-UUID.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10057": "Cluster[uuid:%s] ist angegeben, aber es ist kein aktivierter Baremetal2-Cluster; daher kann keine Baremetal2-Instanz daraus erstellt werden.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10056": "Zone[uuid:%s] ist angegeben, aber sie ist nicht aktiviert; daher kann keine baremetal2-Instanz daraus erstellt werden.", + "ORG_ZSTACK_AI_SERVICE_10001": "Application Development Service VO nicht gefunden mit Modelldienst UUID: %s und Konto UUID: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10040": "Third-party Ceph kann nicht mit anderen primären Speichertypen gemischt werden. Bitte stellen Sie Konsistenz in Ihrer Speicherkonfiguration sicher.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10030": "VM-NIC-Sicherheitsrichtlinie konnte nicht geändert werden, da sowohl Eingangs- als auch Ausgangsrichtlinien nicht null sein dürfen. Bitte stellen Sie sicher, dass mindestens eine Richtlinie definiert ist.", + "ORG_ZSTACK_ZWATCH_10002": "Ungültige zwatch-Rückgabe mit Klausel: %s, %s", + "ORG_ZSTACK_ZWATCH_10001": "Unbekannter Parameter[%s] in zwatch-Rückgabe-Klausel, bitte stellen Sie sicher, dass es sich um einen gültigen Parameter für die angegebene Cloud-Computing-Umgebung handelt", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10032": "VM-NIC-Sicherheitsrichtlinie konnte nicht geändert werden, da ungültige Egress-Richtlinie[%s]", + "ORG_ZSTACK_AI_SERVICE_10005": "Keine Aufgaben erfordern Tests, als Fehler markiert.%s", + "ORG_ZSTACK_AI_SERVICE_10004": "Dienstinstanz kann nicht gefunden werden; bitte stellen Sie sicher, dass die Instanz ordnungsgemäß erstellt und mit Ihrer Evaluierungsaufgabe verknüpft ist. Aufgabeneinreichung fehlgeschlagen.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10031": "VM-NIC-Sicherheitsrichtlinie konnte nicht geändert werden, da ungültige Ingress-Regel[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10034": "VM-NIC-Sicherheitsrichtlinie konnte nicht geändert werden, da VM-NIC [UUID:%s] keine zugeordnete Sicherheitsrichtlinie hat", + "ORG_ZSTACK_AI_SERVICE_10003": "Dienstgruppe mit UUID [%s] kann nicht gefunden werden, die für die Einreichung der Evaluierungsaufgabe verfügbar ist, Fehler melden", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10033": "VM-NIC-Sicherheitsrichtlinie konnte nicht geändert werden, da VM-NIC [uuid:%s] nicht gefunden wurde", + "ORG_ZSTACK_AI_SERVICE_10002": "Modell-Dienstinstanzgruppe [UUID: %s] für Tests hat keine verfügbaren URLs.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10036": "Sicherheitsgruppen-Regelpriorität konnte nicht aktualisiert werden, da die Sicherheitsgruppe [uuid:%s] nicht existiert", + "ORG_ZSTACK_AI_SERVICE_10008": "Alle Compute-Instanzen konnten nicht gestartet werden.%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10035": "Sicherheitsgruppen-Regelpriorität konnte nicht aktualisiert werden, da ein ungültiger Typ[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10038": "Sicherheitsgruppen-Regelpriorität konnte nicht aktualisiert werden, da die Anzahl der Regeln in der Sicherheitsgruppe [uuid:%s] nicht mit der erwarteten Anzahl übereinstimmt", + "ORG_ZSTACK_AI_SERVICE_10006": "Fehler beim Start der Evaluierung auf %s, weil %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10037": "Sicherheitsgruppen-Regelpriorität konnte nicht aktualisiert werden, da die Regelliste leer ist. Bitte stellen Sie sicher, dass Regeln definiert sind, bevor Sie diesen Vorgang ausführen.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10039": "Sicherheitsgruppen-Regelpriorität konnte nicht aktualisiert werden, da Regelpriorität[%d] ungültig ist", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10049": "Es ist nicht erforderlich, chassisOfferingUuid festzulegen, da der Instance bereits ein Chassis zugewiesen wurde", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10004": "Lizenzinformationen für Primary Storage [%s] konnten nicht abgerufen werden, da die Antwortdaten darauf hinweisen, dass keine aktive Lizenz verfügbar ist", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10044": "baremetal2-Gateway mit UUID: %s ist nicht Teil des Clusters mit UUID: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10043": "baremetal2-Gateway mit UUID: %s existiert nicht oder ist nicht aktiviert oder verbunden", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10042": "Cluster[uuid:%s] ist kein aktivierter baremetal2-Cluster, kann Instance[uuid:%s] darin nicht starten", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10041": "Remote-Provision-Instance unterstützt das Anhängen eines Provision-NIC an ein Bond nicht %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10047": "baremetal2-Chassis-Angebot[uuid:%s] ist nicht aktiviert", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10046": "baremetal2-Chassis-Angebot [UUID:%s] existiert nicht", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10045": "Bitte geben Sie die Chassis-UUID oder das Chassis-Angebots-UUID an, um die Baremetal-Instance [uuid:%s] zu starten.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10029": "Snapshot-Erstellung Timeout, Fortschritt ist %d%", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10028": "EBS PrimaryStorage unterstützt derzeit keine Größenreduzierung.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10073": "Image[uuid:%s] hat das Format: %s, nur Formate, die für BareMetal2-Instanzen unterstützt werden, sind %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10072": "Image[uuid:%s] ist vom Medientyp: %s; nur Root-Volume-Vorlagen können zum Erstellen einer Baremetal-Instance verwendet werden.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10041": "Sicherheitsgruppen-Regelpriorität konnte nicht aktualisiert werden, da die Regel mit UUID:%s nicht mit der Sicherheitsgruppe mit UUID:%s verknüpft ist", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10071": "Das Image[uuid:%s] ist nicht bereit; eine Baremetal2-Instanz kann nicht daraus erstellt werden", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10040": "Die Priorität der Sicherheitsgruppenregel konnte nicht aktualisiert werden, da die Priorität[%d] dupliziert ist", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10070": "Das Image[uuid:%s] ist nicht aktiviert; daher kann keine Baremetal2-Instanz daraus erstellt werden.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10043": "Die Priorität der Sicherheitsgruppenregel konnte nicht aktualisiert werden, da eine Regel mit doppelter UUID existiert", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10021": "Ungültiger Snapshot-Installationspfad: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10042": "Die Priorität der Sicherheitsgruppenregel konnte nicht aktualisiert werden, da die angegebene Priorität [%d] nicht in der Sicherheitsgruppe [uuid:%s] existiert", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10045": "Die Sicherheitsgruppenregel konnte nicht geändert werden, da es sich um eine Standardregel handelt; nur Beschreibung und Status können aktualisiert werden", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10044": "Die Sicherheitsgruppenregel konnte nicht geändert werden, da die angegebene Sicherheitsgruppenregel mit UUID[%s] nicht existiert", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10022": "Der Alibaba Cloud EBS Primary Storage[UUID:%s, Name:%s] kann keinen verfügbaren Host innerhalb der angehängten Cluster finden, um das Volume zu instanziieren.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10047": "Die Sicherheitsgruppenregel konnte nicht geändert werden, da die Sicherheitsgruppe %s das maximale Limit von %d Regeln überschritten hat", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10025": "Snapshot kann nicht vom Image gefunden werden: %s, möglicherweise wurde das Image gelöscht", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10046": "Die Sicherheitsgruppenregel konnte nicht geändert werden, da die Priorität der Regel [%s] nicht auf die Priorität der Standardregel [%d] gesetzt werden kann", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10024": "Cloud-Umgebung nicht unterstützt", + "ORG_ZSTACK_COMPUTE_CPUPINNING_10002": "Ungültiger Cpuset [%s] für die Instanzkonfiguration angegeben. Bitte stellen Sie sicher, dass der Cpuset gültig ist und auf eine korrekte Gruppe von CPU-Kernen verweist.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10049": "Die Sicherheitsgruppenregel konnte aufgrund eines ungültigen Status[%s] nicht geändert werden", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10027": "Installation von TDC auf den folgenden Hosts fehlgeschlagen: [%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10048": "Die Sicherheitsgruppenregel konnte aufgrund des maximalen Prioritätslimits von %s Regel [%d] nicht geändert werden", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10026": "Verbindung mit den folgenden Clustern konnte nicht hergestellt werden: [%s]", + "ORG_ZSTACK_COMPUTE_CPUPINNING_10000": "Ungültige CPU-Pinning-Referenz[%s]. Korrekte Beispiele sind [1,3:3-6,^5] oder [1-2,4:6].", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10004": "vhost-user-Client für virtuelle Maschine [uuid:%s] kann auf dem Zielhost [uuid:%s] nicht generiert werden", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10077": "Die Architektur des Baremetal2-Clusters[arch:%s] und des Images[arch:%s] stimmen nicht überein", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10076": "Unterschiedlicher Boot-Modus zwischen der Instanz und dem Image oder dem Angebot erkannt. Bitte stellen Sie sicher, dass sie übereinstimmen.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10075": "Nur Images mit dem Boot-Modus %s werden für die Erstellung von Baremetal2-Instanzen unterstützt", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10074": "Das Image[uuid:%s] ist kein BareMetal2-Image; daher kann es nicht für die Erstellung einer BareMetal2-Instanz verwendet werden.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10079": "Der Primary Storage für das Root-Volume und der Primary Storage für das Data-Volume müssen sich im selben Cluster befinden.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10078": "Nicht alle Disk-Angebote [UUIDs:%s] sind aktiviert; daher kann keine BareMetal2-Instanz daraus erstellt werden.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10050": "Die Sicherheitsgruppenregel konnte aufgrund einer ungültigen Aktion[%s] nicht geändert werden", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10062": "Das Baremetal2-Chassis-Angebot[uuid:%s] ist nicht aktiviert; daher kann keine Baremetal2-Instanz daraus erstellt werden.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10061": "Das Baremetal2-Chassis[uuid:%s] ist nicht verfügbar; daher kann keine Baremetal2-Instanz daraus erstellt werden.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10060": "Das Baremetal2-Chassis mit UUID:%s ist nicht aktiviert; daher kann keine Baremetal2-Instanz daraus erstellt werden.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10051": "Sicherheitsgruppenregel konnte aufgrund eines ungültigen Protokolls [%s] nicht geändert werden", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10054": "Sicherheitsgruppenregel konnte nicht geändert werden, da der Quell-IP-Bereich [%s] angegeben ist; die UUID der Remote-Sicherheitsgruppe [%s] muss leer gelassen werden", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10031": "Aliyun EBS PrimaryStorage unterstützt nur den Aliyun EBS BS Typ, tatsächlich erhalten: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10056": "Sicherheitsgruppen-Ausgangsregel konnte nicht geändert werden, da der Quell-IP-Bereich für den Typ Egress nicht angegeben werden kann", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10034": "Ressource [uuid: %s] konnte nicht gefunden werden", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10055": "Sicherheitsgruppen-Eingangsregel konnte nicht geändert werden, da dstIpRange für diese Regel [%s] nicht angegeben werden kann", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10058": "Sicherheitsgruppenregel konnte nicht geändert werden, da die Remote-Sicherheitsgruppe [uuid:%s] nicht gefunden wurde", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10057": "Sicherheitsgruppenregel konnte nicht geändert werden, da ein Ziel-IP-Bereich [%s] angegeben ist; die UUID der Remote-Sicherheitsgruppe [%s] muss leer gelassen werden", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10059": "Sicherheitsgruppenregel konnte nicht geändert werden, da die Remote-Sicherheitsgruppe [UUID:%s] konfiguriert ist; Quell-IP-Bereich und Ziel-IP-Bereich müssen leer sein", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10066": "Image darf nicht leer sein, es sei denn, das Chassis befindet sich im Direct-Modus", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10065": "Baremetal2-Gateway mit UUID: %s befindet sich nicht im selben Cluster wie das Chassis mit UUID: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10064": "Baremetal2-Gateway [UUID: %s] ist nicht verbunden; daher kann keine Baremetal2-Instanz daraus erstellt werden", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10063": "Baremetal2-Gateway mit UUID:%s ist nicht aktiviert; daher kann keine Baremetal2-Instanz daraus erstellt werden", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10069": "Chassis-Datenträger [%s] hat nicht genügend Kapazität für Image [%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10068": "Image [uuid:%s] existiert nicht im Image-Repository", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10067": "Direct-Modus unterstützt keine Image-Auswahl", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREBLOCK_10000": "Shareblock zeigt, dass der Host %s auf %s nicht erreichbar ist", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10100": "Sicherheitsgruppenregel konnte aufgrund eines ungültigen Protokolls [%s] nicht hinzugefügt werden; gültige Protokolle sind %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10102": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, da eine ungültige IP-Version [%d] angegeben wurde; gültige Versionen sind %d/%d", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10101": "Sicherheitsgruppenregel konnte aufgrund einer ungültigen Aktion [%s] nicht hinzugefügt werden; gültige Aktionen sind %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10104": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, da der erlaubte CIDR [%s] und der Ziel-IP-Bereich [%s] in Konflikt stehen", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10103": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, da der Quell-IP-Bereich [%s] für eine Ausgangsregel nicht angegeben werden darf", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10106": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, da der Ziel-IP-Bereich [%s] für eine Eingangsregel nicht angegeben werden darf", + "ORG_ZSTACK_COMPUTE_HOST_10041": "VLAN-ID [%s] für Netzwerk-Bonding [%s] auf KVM-Host [UUID: %s] konnte nicht überprüft werden, %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10105": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, da der IP-Bereich [%s] und die Remote-Sicherheitsgruppen-UUID [%s] in Konflikt stehen", + "ORG_ZSTACK_COMPUTE_HOST_10043": "VLAN-ID [%s] für Netzwerkschnittstelle [%s] auf KVM-Host [UUID: %s] konnte nicht verifiziert werden, %s", + "ORG_ZSTACK_VPC_10048": "DNS-Adresse [%s] wurde zum VPC-Router [uuid:%s] hinzugefügt", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10107": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, da der erlaubte CIDR [%s] mit dem Quell-IP-Bereich [%s] in Konflikt steht", + "ORG_ZSTACK_VPC_10047": "VPC L3-Netzwerk muss einem VPC vRouter zugeordnet werden, bevor Operationen im Zusammenhang mit dem vRouter durchgeführt werden können (z.B. Starten/Stoppen von VMs, Erstellen von Load Balancern usw.)", + "ORG_ZSTACK_ALIYUN_CORE_10022": "Snapshot-Aufgabenstatus ist beendet %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10109": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, da der Protokolltyp ALL oder ICMP keinen dstPortRange[%s] festlegen kann", + "ORG_ZSTACK_ALIYUN_CORE_10023": "Der Vorgang wird für HybridClient-Instanzen nicht unterstützt. Bitte verwenden Sie einen kompatiblen Client-Typ.", + "ORG_ZSTACK_ALIYUN_CORE_10021": "Snapshot-Aufgabe kann nicht innerhalb von %d Millisekunden abgeschlossen werden, aktueller Fortschritt ist %d%, Status ist %s", + "ORG_ZSTACK_ALIYUN_CORE_10026": "Der Ocean API-Endpunkt darf nicht null sein. Bitte geben Sie einen gültigen Endpunkt an.", + "ORG_ZSTACK_VPC_10042": "Abrufen des Status von Dienst %s auf virtuellem Router %s nicht unterstützt", + "ORG_ZSTACK_COMPUTE_HOST_10048": "Bonding-IP konnte nicht aktualisiert werden, da %s", + "ORG_ZSTACK_VPC_10041": "Status des verteilten Routings für virtuellen Router %s kann nicht festgelegt werden", + "ORG_ZSTACK_ALIYUN_CORE_10024": "accessKey und secretAccessKey müssen konfiguriert sein", + "ORG_ZSTACK_VPC_10040": "Verbindungen für verteiltes Routing zu virtuellem Router %s können nicht abgerufen werden", + "ORG_ZSTACK_COMPUTE_HOST_10044": "Festlegen des Diensttyps[%s] für Network Bonding[%s] auf KVM-Host[UUID: %s] fehlgeschlagen, %s", + "ORG_ZSTACK_VPC_10045": "Aktualisieren des Dienstes %s auf virtuellen Router %s nicht unterstützt", + "ORG_ZSTACK_COMPUTE_HOST_10047": "Schnittstellen-IP konnte nicht aktualisiert werden, da %s", + "ORG_ZSTACK_COMPUTE_HOST_10046": "Festlegen des Diensttyps[%s] für Netzwerkschnittstelle[%s] auf KVM-Host[UUID: %s] fehlgeschlagen, %s", + "ORG_ZSTACK_VPC_10043": "Status des verteilten Routings zu virtuellem Router %s kann nicht abgerufen werden", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10111": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, da der Endport [%d] größer oder gleich dem Startport [%d] sein muss", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10110": "Der Protokolltyp ALL oder ICMP unterstützt das Festlegen von startPort oder endPort nicht. Bitte stellen Sie sicher, dass das Protokoll für Ihre Sicherheitsgruppenregelkonfiguration geeignet ist.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10113": "Der Protokolltyp TCP/UDP erfordert die Angabe eines Zielportbereichs. Bitte geben Sie den erforderlichen Portbereich an und versuchen Sie es erneut.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10112": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, da dstPortRange[%s] mit startPort[%s] in Konflikt steht", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10115": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, da eine doppelte Regel[%s] bereits in der Datenbank für die angegebene Sicherheitsgruppe existiert", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10114": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, da die Regeln [%s] und [%s] dupliziert sind", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10117": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, da die Sicherheitsgruppe %s ihr maximales Limit von %d Regeln erreicht hat", + "ORG_ZSTACK_COMPUTE_HOST_10052": "Abrufen der VLAN-IDs für Host [UUID:%s] fehlgeschlagen: %s", + "ORG_ZSTACK_VPC_10039": "IPv6-Bereich konnte nicht zu L3-Netzwerk [uuid:%s] hinzugefügt werden, da es eine Überschneidung mit CIDR [%s] des virtuellen Routers [uuid:%s] gibt", + "ORG_ZSTACK_ALIYUN_IMAGE_10002": "Der Vorgang ist nur für benutzerdefinierte Bilder beschränkt.", + "ORG_ZSTACK_CORE_CONFIG_10002": "Globale Konfiguration konnte nicht gefunden werden[Kategorie: %s, Name: %s]", + "ORG_ZSTACK_VPC_10038": "IP-Bereich konnte nicht zu L3-Netzwerk [UUID:%s] hinzugefügt werden, da es eine Überschneidung mit CIDR [%s] des virtuellen Routers [UUID:%s] gibt", + "ORG_ZSTACK_ALIYUN_IMAGE_10003": "Nur primäre Datenträger können Spiegel erstellen.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10119": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, da die Sicherheitsgruppe %s ihr maximales Limit von %d Regeln überschritten hat", + "ORG_ZSTACK_NETWORK_PLUGIN_10001": "Gratuitous ARP freigeben aufgrund von:%s", + "ORG_ZSTACK_VPC_10037": "DNS-Adresse [%s] ist nicht mit VPC-Router [uuid:%s] assoziiert", + "ORG_ZSTACK_VPC_10036": "dns[%s] ist keine gültige IP-Adresse", + "ORG_ZSTACK_CORE_CONFIG_10004": "Das Überspringen der Überprüfung für Cloud-Ressourcen ist nicht zulässig.", + "ORG_ZSTACK_NETWORK_PLUGIN_10000": "Fehler beim Anwenden von gratuitous ARP wegen:%s", + "ORG_ZSTACK_ALIYUN_IMAGE_10001": "Das angegebene Image wird gerade in das Rechenzentrum importiert...", + "ORG_ZSTACK_ALIYUN_CORE_10011": "Eine Datei mit Länge Null kann nicht als VM-Image eingegeben werden!", + "ORG_ZSTACK_ALIYUN_IMAGE_10006": "Nur der Image-basierte Speicher-Backup-Service wird unterstützt", + "ORG_ZSTACK_ALIYUN_IMAGE_10007": "Der Image-Name darf nicht mit http:// oder https:// beginnen. Bitte verwenden Sie einen gültigen Image-Namen.", + "ORG_ZSTACK_ALIYUN_IMAGE_10004": "Kein OSS-Bucket mit dem Rechenzentrum verknüpft: %s", + "ORG_ZSTACK_ALIYUN_IMAGE_10005": "Das ECS-System-Image kann nicht aus der Ferne gelöscht werden", + "ORG_ZSTACK_VPC_10031": "L2-Netzwerk [UUID: %s] des L3-Netzwerks [UUID: %s] ist nicht mit dem Cluster [UUID: %s] verbunden", + "ORG_ZSTACK_VPC_10030": "Keine IP-Bereiche an L3-Netzwerk[uuid:%s] angehängt", + "ORG_ZSTACK_ALIYUN_CORE_10016": "Bitte geben Sie eine gültige Cloud-Ressourcenkennung an!", + "ORG_ZSTACK_ALIYUN_CORE_10013": "Berechtigung verweigert für: %s", + "ORG_ZSTACK_VPC_10035": "L3-Netzwerk [UUID:%s] muss zuerst angehängt werden, da es ein VIP enthält.", + "ORG_ZSTACK_COMPUTE_HOST_10055": "cluster[uuids:%s, hypervisorType:%s] existiert nicht!", + "ORG_ZSTACK_VPC_10034": "Die angegebene statische IP-Adresse [%s] stimmt nicht mit den Gateway-IPs [%s] des Layer-3-Netzwerks [UUID: %s] überein.", + "ORG_ZSTACK_ALIYUN_CORE_10017": "Java-Code-Ausführung fehlgeschlagen, Fehlercode: %s, Fehlermeldung: %s", + "ORG_ZSTACK_COMPUTE_HOST_10058": "host[uuid:%s] kann die angegebene Ressource nicht finden", + "ORG_ZSTACK_VPC_10033": "Der Gateway des L3-Netzwerks [uuid:%s] ist bereits von einer anderen Instanz/IP belegt:%s", + "ORG_ZSTACK_ALIYUN_CORE_10018": "Gerät nicht bereit innerhalb von %d Millisekunden", + "ORG_ZSTACK_VPC_10032": "Öffentliches Netzwerk [UUID: %s] VIP [UUID: %s, IP: %s] kann nicht mit L3-Netzwerk [UUID: %s] peeringen, da es sich nicht auf dem VPC VR [UUID: %s] befindet", + "ORG_ZSTACK_COMPUTE_HOST_10019": "Live-Snapshots werden nur auf VMs im Status [%s] unterstützt, aber die VM befindet sich derzeit im Status [%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10120": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, da Priorität[%d] aufeinanderfolgend sein muss; die maximal zulässige Priorität für Ingress-Regeln ist [%d].", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10000": "Lizenzinformationen für Primärspeicher[%s] konnten aufgrund fehlender Monitoring-IP-Adresse nicht abgerufen werden", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10001": "Lizenzinformationen für Primärspeicher[%s] konnten nicht abgerufen werden, da keine Daten zurückgegeben wurden", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10122": "Sicherheitsgruppenregeln konnten auf aktuelle Instanz[uuid:%s] nicht angewendet werden", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10002": "Lizenzinformationen für Primärspeicher [%s] konnten nicht abgerufen werden, da die Ablaufzeit null ist", + "ORG_ZSTACK_ALIYUN_IMAGE_10008": "Kein Backup-Speicher für Image UUID konfiguriert: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10121": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, da Priorität[%d] aufeinanderfolgend sein muss; die maximal zulässige Priorität für Egress-Regeln ist [%d].", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10003": "Datumsformat[%s] der Lizenzinformationen des Primärspeichers[%s] konnte nicht geparst werden", + "ORG_ZSTACK_ALIYUN_IMAGE_10009": "überschrittenes Backup-Speichervolumen für die imageUuid: %s, bitte manuell angeben", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10124": "der Netzwerkdienst[type:%s] ist auf dem l3 Netzwerk[uuid:%s] nicht aktiviert", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10123": "Fehler beim Anwenden von Sicherheitsgruppenregeln auf einige virtuelle Maschinen", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10125": "Fehler beim Ändern der Priorität von rule[uuid:%s], da sie nicht gefunden wurde", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10128": "der Netzwerkdienst[type:%s] ist auf dem l3 Netzwerk[uuid:%s], das mit nic[uuid:%s] verbunden ist, nicht aktiviert", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10127": "vm nic mit UUID:%s wurde an Sicherheitsgruppe mit UUID:%s angehängt", + "ORG_ZSTACK_ALIYUN_IMAGE_10011": "image [%s] ist derzeit nicht aktiviert", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10129": "Sicherheitsgruppe mit UUID [%s] gehört nicht Ihrem Konto mit UUID [%s] oder einem Administrator", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10004": "virtuelle ID[uuid:%s] gehört nicht zur Organisation[uuid:%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10005": "Organisation[uuid:%s] hat bereits einen designierten Supervisor", + "ORG_ZSTACK_ALIYUN_CORE_10001": "Hinzufügen des Endpunkts zum SDK fehlgeschlagen, wegen: %s", + "ORG_ZSTACK_ALIYUN_CORE_10005": "accessKey und secretAccessKey müssen konfiguriert werden!", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10003": "virtuelle ID[uuid:%s] existiert nicht", + "ORG_ZSTACK_COMPUTE_HOST_10028": "nic[%s] wurde entfernt", + "ORG_ZSTACK_COMPUTE_HOST_10023": "Operationsfehler, weil %s", + "ORG_ZSTACK_ALIYUN_CORE_10009": "Zugriffsschlüssel-ID oder geheimer Zugriffsschlüssel kann nicht aus der Nachricht gefunden werden", + "ORG_ZSTACK_ALIYUN_IMAGE_10010": "gültige Plattform:[%s] für Aliyun-Bildimport, gültige Werte sind: [%s]", + "ORG_ZSTACK_ALIYUN_CORE_10006": "Die Regionskennung muss angegeben werden!", + "ORG_ZSTACK_COMPUTE_HOST_10038": "Löschen der virtuellen Maschinendatei fehlgeschlagen: %s", + "ORG_ZSTACK_COMPUTE_HOST_10037": "Festlegen der Konfigurationsdatei der virtuellen Maschine fehlgeschlagen: %s", + "ORG_ZSTACK_COMPUTE_HOST_10039": "Anwenden des Memory Balloon fehlgeschlagen: %s", + "ORG_ZSTACK_COMPUTE_HOST_10036": "Festlegen des VM-Hostnamens fehlgeschlagen: %s", + "ORG_ZSTACK_COMPUTE_HOST_10035": "Synchronisieren der VM-Port-Konfiguration fehlgeschlagen: %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10009": "ungültiges Label, 'op'-Feld ist null oder kein gültiger Regex oder Equal. %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10008": "ungültiges Label, 'key'-Feld darf nicht null sein. Bitte geben Sie einen gültigen Schlüsselwert an.%s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10007": "der ValueCondition-String[%s] erfordert 'value' als Schlüssel", + "ORG_ZSTACK_ZWATCH_DATATYPE_10006": "der Label-String[%s] enthält keine gültige Operation", + "ORG_ZSTACK_COMPUTE_VM_10319": "VmInstanceDestroyVmExtensionPoint[%s] verweigert die Beendigung von vm[uuid:%s] wegen %s", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10006": "Der Typ des Volumes [%s] ist ungültig.", + "ORG_ZSTACK_COMPUTE_VM_10318": "VmInstanceRebootExtensionPoint[%s] lehnt den Neustart von vm[uuid:%s] ab wegen %s", + "ORG_ZSTACK_COMPUTE_VM_10317": "VmInstanceStartNewCreatedVmExtensionPoint[%s] verweigert das Starten der VM[uuid:%s] wegen %s", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10004": "Fehler beim Abrufen der Snapshot-IDs für Volume %s in Ceph PS[uuid:%s].", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10002": "Fehler beim Überprüfen des Installationspfads von Volume %s im Ceph-Pool [uuid:%s].", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10001": "Der angegebene Pool[PoolName:%s] kann nicht in der Pool-Service-Antwort gefunden werden: %s", + "ORG_ZSTACK_VPC_10006": "VIP[uuid:%s] nicht in der Cloud-Umgebung gefunden", + "ORG_ZSTACK_VPC_10005": "IPv6 EIP konnte nicht angehängt werden, da der Bildtyp des virtuellen Routers [UUID:%s] nicht %s ist", + "ORG_ZSTACK_VPC_10003": "SSH-Verbindung zum VPC-Router[%s] kann nicht hergestellt werden, der SSH-Port scheint geschlossen zu sein", + "ORG_ZSTACK_VPC_10009": "VMNic[uuid:%s] nicht gefunden", + "ORG_ZSTACK_VPC_10008": "EIP mit UUID:%s nicht gefunden", + "ORG_ZSTACK_COMPUTE_VM_10316": "Der VM-Host kann nicht gefunden werden. Bitte starten Sie die virtuelle Maschine [%s] und versuchen Sie dann, die Festplatte einzuhängen.", + "ORG_ZSTACK_COMPUTE_HOST_10005": "Fehler beim Festlegen der Synchronisationsuhraufgabe auf dem Host[uuid:%s]", + "ORG_ZSTACK_ZWATCH_DATATYPE_10001": "Ungültiger Ausdruck: %s, keine zugehörige Funktion im Kontext von Cloud-Computing oder Virtualisierungseinstellungen gefunden", + "ORG_ZSTACK_COMPUTE_HOST_10004": "Host[uuid:%s, name:%s] befindet sich im Status[%s], kann die erforderliche Operation nicht ausführen", + "ORG_ZSTACK_COMPUTE_VM_10315": "Gateway-Fehler, erwartet: %s, tatsächlich: %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10000": "Ungültige Funktion: %s, ungültiger Parametertyp für Cloud-Computing-Umgebung", + "ORG_ZSTACK_COMPUTE_VM_10314": "IPv6-Präfixlängenfehler, erwartet einen Wert zwischen %s und %s, erhalten: %s", + "ORG_ZSTACK_COMPUTE_VM_10313": "IPv6-Präfixlänge muss konfiguriert werden", + "ORG_ZSTACK_VPC_10002": "Das Gateway des L3-Netzwerks [UUID: %s] ist auf dem VPC VR [UUID: %s] belegt", + "ORG_ZSTACK_COMPUTE_VM_10311": "Netzmaskenfehler, erwartet: %s, erhalten: %s", + "ORG_ZSTACK_COMPUTE_HOST_10000": "GPU-Informationen synchronisieren fehlgeschlagen: %s", + "ORG_ZSTACK_VPC_10001": "Es gibt keinen IP-Bereich für das Layer-3-Netzwerk[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10310": "Die Subnetzmaske muss angegeben werden.", + "ORG_ZSTACK_VPC_10000": "NIC kann nicht vom VPC VR[uuid:%s] getrennt werden", + "ORG_ZSTACK_COMPUTE_HOST_10009": "PCI-Gerät für Host[uuid:%s] konnte nicht zugewiesen werden", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10051": "Ungültiges URI-Format. Korrektes Beispiel: ceph:/// oder volume://", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10050": "Ceph ps[uuid=%s] Root-Pool-Name nicht gefunden", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10052": "Volume-Kettenfehler löschen, mit Volume-Löschung fortfahren", + "ORG_ZSTACK_COMPUTE_VM_10320": "VmInstanceStartExtensionPoint[%s] verweigert das Starten der virtuellen Maschine[uuid:%s] weil %s", + "ORG_ZSTACK_COMPUTE_HOST_10013": "networkInterface[name:%s] der Instanz[uuid:%s] kann nicht gefunden werden", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10008": "Verschlüsselung %s[id:%s] fehlgeschlagen: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_SMP_10000": "Der primäre Speicher mit gemeinsamem Mount-Punkt[uuid:%s, name:%s] kann keinen verfügbaren Host in den angehängten Compute-Clustern finden", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10005": "", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10002": "Nicht unterstützte Operation für EncryptColumnIntegrityFactory in der Cloud-Computing-Umgebung", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10000": "", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10017": "%s[%s] Integritätsprüfungsfehler, wegen: %s", + "ORG_ZSTACK_VPC_10027": "", + "ORG_ZSTACK_VPC_10025": "%s[%s] Verschlüsselungsfehler wegen:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10013": "", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10042": "Es kann kein verbundener KVM-Host gefunden werden, um die Operation auszuführen; es scheint, dass alle Hosts in den Clustern, die mit dem primären Speicher mit gemeinsamem Mount-Punkt[uuid:%s] verbunden sind, getrennt sind.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10041": "", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10010": "L3-Netzwerk kann nicht an VPC-Router[UUID:%s] angehängt werden, da sein Status nicht läuft oder gestoppt ist", + "ORG_ZSTACK_VPC_10029": "", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10044": "VPC-Netzwerk [uuid:%s] ist bereits an VPC-Router [uuid:%s] angehängt.", + "ORG_ZSTACK_VPC_10020": "", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10043": "Die URL enthält einen ungültigen Verzeichnispfad [%s]. Gültige Pfade sollten innerhalb des Dateisystems der Instanz liegen und keine speziellen Verzeichnisse wie /dev, /proc oder /sys enthalten. Bitte stellen Sie sicher, dass die bereitgestellte URL korrekt ist.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10046": "", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10045": "Abrufen der RBD-Image-Watcher des Root-Volumes fehlgeschlagen, %s", + "ORG_ZSTACK_VPC_10024": "", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10047": "CEPH-Pool-Konflikt, der CEPH-Pool, der durch das Plattenangebot angegeben ist, ist %s, und der CEPH-Pool, der im Erstellungsparameter angegeben ist, ist %s", + "ORG_ZSTACK_VPC_10023": "", + "ORG_ZSTACK_VPC_10022": "Volume[uuid:%s] hat einen Verweis auf Volume[%s]; daher kann der Volumetyp nicht geändert werden, bevor das Volume und seine Nachkommen vereinfacht werden.", + "ORG_ZSTACK_VPC_10021": "", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10006": "L3-Netzwerk kann nicht an VPC-Router[UUID:%s] angehängt werden, da sowohl sein Status als auch der Peer-Status weder laufen noch gestoppt sind", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10005": "", + "ORG_ZSTACK_VPC_10017": "CEPH-Primärspeicher-Pool kann nicht gefunden werden[poolName=%s]", + "ORG_ZSTACK_VPC_10016": "", + "ORG_ZSTACK_VPC_10015": "l3-Netzwerk [uuid:%s] kann nicht von VPC-vRouter [uuid:%s] getrennt werden, da Netzwerkdienste, die an VIPs [%s] angehängt sind, noch in Verwendung sind.", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10003": "", + "ORG_ZSTACK_VPC_10014": "rootVolume[%s] wird bereits verwendet (was darauf hinweist, dass das Ceph RBD-Image[%s] aktiveWatcher hat), um potenzielle Split-Brain-Szenarien zu verhindern, ist das Starten der VM untersagt.", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10002": "", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10001": "Der SMP-Primärspeicher [uuid:%s] ist keinem Compute-Cluster zugeordnet und kann daher das Stamm-Volume [uuid:%s] der virtuellen Maschine [uuid:%s] nicht entfernen.", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10007": "Virtuelle Maschine mit UUID: %s nicht gefunden", + "ORG_ZSTACK_VPC_10019": "Konnte L3-Netzwerk nicht vom VPC-Router [uuid:%s] trennen, da die Zustände von Master und Slave inkonsistent sind", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10008": "Virtuelles Maschinengerät mit UUID: %s nicht gefunden", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10030": "Kann keinen Backup-Speicher finden, um das Image [%s] auf den Primärspeicher [%s] herunterzuladen, da kein bereitgestelltes und zugängliches Image vorhanden ist", + "ORG_ZSTACK_VPC_10018": "Konnte L3-Netzwerk nicht vom VPC-Router [uuid:%s] trennen, da sein Zustand nicht aktiv oder gestoppt ist", + "ORG_ZSTACK_ALIYUN_CORE_10037": "Das Image existiert bereits remote; bitte verwenden Sie zunächst sync, um die Konsistenz sicherzustellen.", + "ORG_ZSTACK_ALIYUN_CORE_10035": "Eintrag ist nach %s ms noch aktiv", + "ORG_ZSTACK_ALIYUN_CORE_10036": "ECS-Instanz [%s] nicht gefunden, bitte prüfen Sie, ob sie in der Aliyun-Konsole existiert", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10037": "Keine verbundenen Ceph MON für den Primärspeicher [uuid:%s] gefunden", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10001": "Fehlender Parameter: resourceUuid %s, vmInstanceUuid %s wird benötigt", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10002": "Fehlender erforderlicher Parameter: resource UUID. Bitte geben Sie eine gültige Resource UUID an.", + "ORG_ZSTACK_VPC_10012": "Der virtuelle Router [uuid:%s] ist kein VPC-Router", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10039": "CEPH-Pool-Konflikt, der CEPH-Pool, der von der Instance-Offering angegeben ist, ist %s, und der CEPH-Pool, der im Erstellungsparameter angegeben ist, ist %s", + "ORG_ZSTACK_VPC_10011": "Konnte den Zustand der Netzwerkschnittstelle [uuid: %s] nicht aktualisieren, da die Management-Netzwerkschnittstelle nicht unterstützt wird", + "ORG_ZSTACK_ALIYUN_CORE_10039": "regionId[%s] ist gemäß Aliyun ungültig!", + "ORG_ZSTACK_VPC_10010": "Konnte VM-NIC [UUID:%s] nicht löschen, da die VM [UUID:%s] eine Appliance-VM ist. Bitte verwenden Sie die API APIDetachL3NetworkFromVm.", + "ORG_ZSTACK_SNMP_AGENT_10006": "SNMP-Agent-Sitzung [%s] konnte auf Port %s nicht beendet werden, aufgrund von %s", + "ORG_ZSTACK_SNMP_AGENT_10005": "SNMP-Agent-Port konnte von %s zu %s nicht geändert werden, aufgrund von %s", + "ORG_ZSTACK_SNMP_AGENT_10004": "SNMP-Instanz [uuid:%s] wurde nicht bereitgestellt", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10009": "Der Zustand der EC2-Instanz [%s] muss aktiv oder gestoppt sein", + "ORG_ZSTACK_STORAGE_ZBS_10003": "Ungültige mdsUrl[%s]. SSH-Benutzername und Passwort müssen durch ':' getrennt sein und dürfen nicht leer sein. Ein gültiges mdsUrl-Format ist %s", + "ORG_ZSTACK_STORAGE_ZBS_10004": "Ungültige Management-Service-URL[%s], Hostname darf nicht null sein. Ein gültiges Management-Service-URL-Format ist %s", + "ORG_ZSTACK_STORAGE_ZBS_10002": "Ungültige MDS-URL[%s], der SSH-Benutzername:SSH-Passwort-Teil ist ungültig. Ein gültiges MDS-URL-Format ist %s", + "ORG_ZSTACK_APPCENTER_10006": "%s erfordert einen String-Wert, aber ein falscher Typ wurde empfangen", + "ORG_ZSTACK_APPCENTER_10005": "%s erfordert einen Boolean-Wert, aber ein falscher Typ wurde empfangen", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10004": "Die Festplatte [%%s] ist keiner Instanz zugeordnet", + "ORG_ZSTACK_APPCENTER_10004": "%s erfordert einen Number-Wert, aber ein falscher Typ wurde empfangen", + "ORG_ZSTACK_STORAGE_ZBS_10005": "Ungültige MDS-URL[%s], der SSH-Port liegt außerhalb des gültigen Bereichs (1-65535). Eine gültige MDS-URL sollte das Format %s haben", + "ORG_ZSTACK_APPCENTER_10003": "%s ist in preParameters angegeben, aber nicht konfiguriert", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10006": "Nur ein Datenträger kann an eine ECS-Instanz angehängt werden.", + "ORG_ZSTACK_APPCENTER_10002": "filterName muss für die ordnungsgemäße Konfiguration auf appcenter:true oder appcenter:false gesetzt werden.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10007": "Der Datenträger kann an keine ECS-Instanz angehängt werden. Bitte stellen Sie sicher, dass sich die ECS-Instanz in einem Zustand befindet, der das Anhängen von Datenträgern ermöglicht.", + "ORG_ZSTACK_SNMP_AGENT_10003": "Fehler beim Starten des SNMP-Agenten auf Port %s wegen %s", + "ORG_ZSTACK_APPCENTER_10001": "PublishAppVO[uuid: %s] existiert nicht", + "ORG_ZSTACK_SNMP_AGENT_10002": "Fehler beim Starten des SNMP-Agenten[%s], bitte überprüfen Sie Ihre Cloud-Konfiguration[%s]", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10001": "Das Stammvolumen der Instanz kann nicht gelöscht werden", + "ORG_ZSTACK_SNMP_AGENT_10001": "Es existieren mehr als eine SnmpAgentVO-Instanz. Bitte geben Sie an, welche verwendet werden soll.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10002": "Sie können die deleteWithInstance-Eigenschaft des Datenträgers nicht auf false setzen, wenn die Datenträgerkategorie ephemer ist.", + "ORG_ZSTACK_SNMP_AGENT_10000": "SnmpAgentImpl kann nicht instanziiert werden, da keine SnmpAgentVO-Instanz vorhanden ist. Bitte stellen Sie sicher, dass SnmpAgentVO ordnungsgemäß konfigriert und bereitgestellt ist.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10003": "Sie können die deleteWithInstance-Eigenschaft des Datenträgers nicht auf false setzen, wenn die Datenträgerkategorie cloud ist und sie nicht portabel ist.", + "ORG_ZSTACK_CORE_WEBHOOK_10000": "Ungültige URL[%s]", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10010": "Datenträger und ECS-Instanzen müssen sich in derselben Verfügbarkeitszone befinden", + "ORG_ZSTACK_TEST_AOP_10001": "Unit-Test erfordert einen Fehler aufgrund von Problemen in der Cloud-Computing-Infrastruktur oder Virtualisierungsumgebung", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10015": "Die Datenträgergröße oder Snapshot-ID muss in den Anforderungsparametern angegeben werden, um einen Datenträger zu erstellen oder seine Größe zu verwalten. Bitte geben Sie entweder die Datenträgergröße an oder verwenden Sie einen vorhandenen Snapshot.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10016": "Sie sind nicht berechtigt, einen Datenträger aus einem Stammvolumen-Snapshot zu erstellen. Bitte verwenden Sie einen Nicht-Stammvolumen-Snapshot oder eine Kopie des Stammvolumens für diesen Vorgang.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10017": "Der Datenträgername oder die Beschreibung darf nicht mit 'http://' oder 'https://' beginnen. Bitte verwenden Sie gültige Zeichen für die Benennung von Datenträgern.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10011": "Das Volume [%s] ist bereits an die Instanz [%s] angehängt.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10012": "Nur ein Datenträger kann an eine ECS-Instanz angehängt werden.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10013": "Ein Datenträger kann nicht an eine Instanz angehängt werden, die derzeit in Verwendung ist. Bitte stoppen Sie die Instanz, bevor Sie einen neuen Datenträger anhängen.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10014": "Nicht-elastic Datenträger können nur mit zugehörigen Instanzen zerstört werden", + "ORG_ZSTACK_STORAGE_ZBS_10021": "Ungültiger logischer Volumename[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10022": "Ungültiger Pool-Name[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10020": "Ungültige URI-Syntax für Cloud-Ressourcenreferenz: %s", + "ORG_ZSTACK_STORAGE_ZBS_10025": "Hinzufügen doppelter MDS[%s] nicht erlaubt", + "ORG_ZSTACK_STORAGE_ZBS_10026": "Physische Ressource für logischen Pool[%s] kann nicht gefunden werden", + "ORG_ZSTACK_STORAGE_ZBS_10023": "Bitte stellen Sie sicher, dass mindestens ein Compute-Pool konfiguriert ist.", + "ORG_ZSTACK_STORAGE_ZBS_10024": "Stellen Sie sicher, dass mindestens eine Metadata Service-Instanz konfiguriert ist", + "ORG_ZSTACK_STORAGE_ZBS_10027": "MDS[%s] von zBS Primary Storage[uuid:%s] Knoten nicht gefunden", + "ORG_ZSTACK_STORAGE_ZBS_10028": "Alle MDS-Knoten von ZBS Primary Storage [uuid:%s] befinden sich nicht im Verbindungszustand", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10001": "Vordefinierte Vorlagen für Vorconfigurationsvorlagen können in der Cloud-Umgebung nicht gelöscht werden. Bitte wenden Sie sich an den Support.", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10002": "Der Status von vordefinierten Konfigurationsvorlagen kann in dieser Umgebung nicht geändert werden. Bitte verwenden Sie verfügbare virtuelle Maschinen-Images oder erstellen Sie stattdessen benutzerdefinierte Konfigurationen.", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10000": "Vordefinierte Vorlagen für Instanztypen können nicht aktualisiert werden.", + "ORG_ZSTACK_MTTYDEVICE_10001": "mdev-Geräte, die vom mtty-Gerät[uuid:%s] erzeugt wurden, sind noch an die VM angehängt.", + "ORG_ZSTACK_MTTYDEVICE_10000": "mtty-Gerät [UUID:%s] ist nicht in mdevs-Ressourcen virtualisiert.", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10004": "Preconfiguration Template VO mit UUID: %s kann nicht gefunden werden, es wurde möglicherweise gelöscht.", + "ORG_ZSTACK_MTTYDEVICE_10004": "Der Host [UUID:%s], der das MTty-Gerät [UUID:%s] enthält, ist nicht verbunden.", + "ORG_ZSTACK_MTTYDEVICE_10003": "mtty-Gerät [UUID:%s] kann nicht in mdevs virtualisiert werden.", + "ORG_ZSTACK_HYGON_KVM_10004": "Abrufen der Hygon CPU-Geräteinformationen vom Host[UUID:%s] fehlgeschlagen: %s.", + "ORG_ZSTACK_STORAGE_ZBS_10014": "ZBS Primärspeicher [uuid:%s] wurde möglicherweise gelöscht oder getrennt.", + "ORG_ZSTACK_STORAGE_ZBS_10015": "KVM-Host [UUID:%s] kann nicht gefunden werden, Client kann nicht bereitgestellt werden.", + "ORG_ZSTACK_STORAGE_ZBS_10012": "Verbindung zum ZBS Primärspeicher[uuid:%s] nicht möglich, Verbindung zu allen Metadata-Servern fehlgeschlagen.", + "ORG_ZSTACK_STORAGE_ZBS_10016": "addon-Informationen sind null, Primärspeicher[uuid:%s] ist nicht bereit, Ping-Aufgabe wird übersprungen.", + "ORG_ZSTACK_ZWATCH_DATATYPE_10010": "Ungültiges Label, 'value'-Feld darf nicht null sein. Bitte geben Sie einen gültigen Wert an.%s.", + "ORG_ZSTACK_STORAGE_ZBS_10017": "Kein verfügbares logisches Volume mit ausreichendem Speicherplatz[%d] und erforderlicher URL: %s.", + "ORG_ZSTACK_HYGON_KVM_10003": "Fehler beim Aufheben der Generierung von Hygon IOMMU-Geräten wegen:%s.", + "ORG_ZSTACK_HYGON_KVM_10002": "mdev-Geräte können nicht ungeneriert werden, es sind %d mdev-Geräte an VMs auf dem Host[uuid:%s] angehängt. Bitte stoppen oder migrieren Sie zuerst alle betroffenen virtuellen Maschinen.", + "ORG_ZSTACK_HYGON_KVM_10001": "CCP-Geräte für PCI BDF %s auf Host[UUID:%s] können nicht gefunden werden, bitte synchronisieren Sie zuerst Hygon-Geräte.", + "ORG_ZSTACK_HYGON_KVM_10000": "Fehler beim Generieren von Hygon IOMMU-Geräten wegen:%s.", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10021": "InfluxDB-Instanz kann nicht abgefragt werden, %s.", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10023": "Fehler beim Ändern der InfluxDB-Aufbewahrungsrichtlinie '%s', %s.", + "ORG_ZSTACK_STORAGE_MIGRATION_10000": "Nicht genügend physische Ressourcen für VM[UUID: %s] Speichermigration; erforderliche Kapazität (einschließlich Image-Cache): %s, aktuell verfügbare physische Kapazität: %s.", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10024": "Fehler beim Erstellen der InfluxDB-Aufbewahrungsrichtlinie '%s', %s.", + "ORG_ZSTACK_STORAGE_MIGRATION_10001": "VM-Status[%s] wird für Speichermigration nicht unterstützt.", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10025": "Ungültige InfluxDB-Antwort: %s, kein Metrikname in den Spalten gefunden.", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10026": "Fehler beim Erstellen des Standardbenutzers für InfluxDB '%s', %s.", + "ORG_ZSTACK_STORAGE_MIGRATION_10004": "Abbruch der virtuellen Maschineninstanz wird nicht unterstützt.", + "ORG_ZSTACK_STORAGE_MIGRATION_10005": "VM[uuid: %s] existiert nicht.", + "ORG_ZSTACK_STORAGE_MIGRATION_10003": "Nicht unterstützter Speichermigrationstyp: von %s zu %s.", + "ORG_ZSTACK_STORAGE_MIGRATION_10008": "VM-Blockmigration fehlgeschlagen: %s.", + "ORG_ZSTACK_STORAGE_MIGRATION_10009": "Das primäre Zielspeicher unterstützt keine Migrationsvorgänge für den aktuellen Host. Bitte stellen Sie sicher, dass der Speicher mit Migrationsvorgängen kompatibel ist, und versuchen Sie es erneut.", + "ORG_ZSTACK_STORAGE_MIGRATION_10006": "VM-Status[%s] wird für das Abbrechen der Speichermigration nicht unterstützt", + "ORG_ZSTACK_STORAGE_MIGRATION_10007": "Konnte keine Host-Kandidaten für die VM-Migration `%s` ermitteln. Bitte überprüfen Sie die Ziel-Hosts und die Netzwerkverbindung.", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10005": "Ungültiges Format für das virtio-Treiber-Gerät: %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10004": "Konnte virtio ISO nicht von VM[uuid:%s] trennen: nicht unterstützt", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10003": "Konnte virtio-Gerät nicht von VM[uuid:%s] trennen", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10002": "Fehler beim Anhängen des virtio-Treibers, da das Lesen der MD5 der Datei[%s] in mn[uuid:%s] fehlgeschlagen ist: %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10001": "Fehler beim Anhängen des virtio-Treibers aufgrund ungültiger MD5 der Datei[%s] in mn[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10000": "Fehler beim Anhängen des virtio-Treibers, da das Lesen der MD5 der Datei[%s] in mn[uuid:%s] fehlgeschlagen ist: virtuelle Datenträgerdatei nicht auf dem Classpath gefunden", + "ORG_ZSTACK_DIRECTORY_10010": "Der angegebene Verzeichnistyp %s wird nicht unterstützt; unterstützte Typen sind: %s.", + "ORG_ZSTACK_SCHEDULER_VM_10001": "VM[uuid:%s] wurde beendet, Statusänderung nicht zulässig", + "ORG_ZSTACK_STORAGE_ZBS_10040": "Konnte MDS[%s]-Metadaten nicht abrufen, bitte ZBS-Konfiguration überprüfen", + "ORG_ZSTACK_STORAGE_ZBS_10032": "Alle Metadaten-Server können HTTP-Anfrage[%s] nicht ausführen", + "ORG_ZSTACK_STORAGE_ZBS_10036": "Versionskonflikt zwischen ZBS-Primärspeicher MDS[%s] und Management-Node[%s], bitte MDS wieder verbinden und SSH-Konnektivität überprüfen", + "ORG_ZSTACK_STORAGE_ZBS_10037": "MDaaS-URLs dürfen nicht null oder leer sein", + "ORG_ZSTACK_STORAGE_ZBS_10034": "Metadaten von ZBS-Primärspeicher MDS[%s] können nicht synchronisiert werden, Ursache: %s", + "ORG_ZSTACK_STORAGE_ZBS_10038": "Logische Volumes können nicht von allen Metadaten-Service-Instanzen erkannt werden, Details: %s", + "ORG_ZSTACK_STORAGE_ZBS_10039": "SSH-Verbindung konnte nicht hergestellt werden oder zbs-tools ist nicht in MDS[%s] installiert. Bitte SSH-Konfiguration überprüfen und sicherstellen, dass die erforderlichen Abhängigkeiten installiert sind.", + "ORG_ZSTACK_DIRECTORY_10006": "Zirkuläre Abhängigkeit zwischen Verzeichnis %s und Verzeichnis %s erkannt, was zu Konfigurationskonflikten oder Endlosschleife bei der Bereitstellung virtueller Umgebungen führen kann", + "ORG_ZSTACK_DIRECTORY_10003": "Der angegebene Name enthält ungültige Zeichen. In Cloud-Computing-Umgebungen dürfen Namen nur chinesische Zeichen, englische Buchstaben, Zahlen, Leerzeichen und folgende Sonderzeichen enthalten: ()()[]@._-+ . Bitte stellen Sie sicher, dass Ihr Name diesen Richtlinien entspricht.", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10000": "EventFamily[name:%s] nicht im Event-Bus gefunden", + "ORG_ZSTACK_DIRECTORY_10004": "Alle Ressourcen zoneUuid müssen mit Verzeichnis zoneUuid[%s] übereinstimmen", + "ORG_ZSTACK_DIRECTORY_10001": "Ressourcentypen %s werden vom Cloud-Verzeichnis nicht unterstützt, erlaubte Typen sind: %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10002": "EventFamily[name:%s, namespace:%s] nicht im angegebenen Namespace oder Event-Family-Repository gefunden", + "ORG_ZSTACK_DIRECTORY_10000": "Ressource %s ist bereits an Verzeichnis-UUID[%s] gebunden; mehrere Pfade werden nicht unterstützt", + "ORG_ZSTACK_NAS_10002": "Doppelte NasFileSystemFactory für Typ[%s]", + "ORG_ZSTACK_NAS_10000": "NAS-Dateisystem[%%s] existiert noch nicht", + "ORG_ZSTACK_NAS_10001": "Keine NAS-Factory für Typ gefunden: %s", + "ORG_ZSTACK_DIRECTORY_10009": "Verzeichniserstellung fehlgeschlagen; stellen Sie sicher, dass der Pfad korrekt angegeben ist und vier Ebenen virtueller Verzeichnisse nicht überschreitet.", + "ORG_ZSTACK_DIRECTORY_10008": "Doppelter Verzeichnisname, Volume[uuid:%s] mit Name %s existiert bereits", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10011": "Ungültiges Query-Tag[%s]. Erlaubte Tagnamen sind %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10012": "Es gibt mehrere Event-Familien mit dem Namen [%s], Sie müssen das Label [%s] angeben.", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10006": "Der VM, auf der sich das Datenträgervolume [%s] befindet, hat einen Speicher-Snapshot; daher kann es nicht getrennt werden.", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10005": "Volume %s kann nicht an die virtuelle Maschineninstanz %s mit der Speicher-Snapshot-Gruppe angehängt werden", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10004": "Der VM, auf der sich das Datenträgervolume [%s] befindet, hat einen Speicher-Snapshot; Löschen ist nicht erlaubt.", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10003": "Das Volume {volume_id} existiert nicht", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10001": "Das Netzwerk mit L3-Netzwerk [uuid: %s] wird von der Volume-Snapshot-Gruppe [uuid: %s] referenziert. Bitte löschen Sie die Volume-Snapshot-Gruppe, bevor Sie dieses L3-Netzwerk löschen.", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10000": "Standard-L3-Netzwerk-UUID existiert nicht", + "ORG_ZSTACK_AI_10086": "ModelServiceGroup wird noch von %s referenziert und kann nicht gelöscht werden", + "ORG_ZSTACK_AI_10087": "taskUuid darf nicht leer sein. Bitte stellen Sie sicher, dass es vor dem Einreichen der Aufgabe ordnungsgemäß gesetzt ist.", + "ORG_ZSTACK_AI_10084": "Systeminstanz[uuid: %s] kann nicht gelöscht werden", + "ORG_ZSTACK_AI_10082": "Modell konnte nicht gelöscht werden, Modell[uuid: %s] wird noch von %s verwendet", + "ORG_ZSTACK_AI_10083": "Modell[uuid: %s] existiert im Cloud-Repository nicht", + "ORG_ZSTACK_AI_10080": "Benutzerdefinierte URL erfordert ein Modellfeld, wenn der ModelEval-Diensttyp bereitgestellt ist.%s", + "ORG_ZSTACK_AI_10081": "L3-Netzwerk-UUID %s hat keinen DHCP-Dienst aktiviert; ein statisches IP-System-Tag ist erforderlich, um statische IPs zuzuweisen.", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10007": "Der Vorgang zum Erstellen von Volume-Snapshots auf mehreren Hosts gleichzeitig bei gleichzeitiger Einbeziehung von Storage-Snapshots wird nicht unterstützt.", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10008": "Speicherplatz für Installations-URL[%s] kann nicht gefunden werden", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10005": "Kein primärer Speicher-Plugin mit Identität: %s registriert", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10006": "Protokoll[%s] wird auf Typ[%s] Speicherlösung nicht unterstützt", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10009": "Block-Speichervolume kann nicht gefunden werden; stellen Sie sicher, dass ein Zugriffspfad für das Block-Speichervolume konfiguriert ist.", + "ORG_ZSTACK_CONFIGURATION_10009": "Reservierter Speichergröße[%s Bytes] überschreitet die verfügbare Speichergröße[%s Bytes]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10010": "Kein Backup-Speichertyp angegeben, um primären Speicher[uuid:%s] zu unterstützen", + "ORG_ZSTACK_CONFIGURATION_10008": "Speichergröße[%s Bytes] ist unzureichend für das Bootstrapping moderner Betriebssysteme; mindestens 16MB werden in Cloud-virtuellen Umgebungen empfohlen.", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10011": "Root-Volume [%s] kann nicht neu initialisiert werden, da das zugehörige Image gelöscht wurde und sein Cache nicht gefunden werden kann", + "ORG_ZSTACK_MULTICAST_ROUTER_10005": "Multicast-Router [uuid:%s] ist keinem VPC-Router zugeordnet", + "ORG_ZSTACK_CONFIGURATION_10007": "vcpu-Anzahl[%s] ist kleiner als 1", + "ORG_ZSTACK_MULTICAST_ROUTER_10006": "Rendezvous-Punkt [%s] ist keine Unicast-IP-Adresse", + "ORG_ZSTACK_CONFIGURATION_10006": "Instanztyp[%s] wird nicht unterstützt", + "ORG_ZSTACK_MULTICAST_ROUTER_10007": "Gruppenadresse [%s] ist keine Multicast-Gruppenadresse", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014": "Speicher ist nicht gesund:%s", + "ORG_ZSTACK_MULTICAST_ROUTER_10000": "multicastRouter[uuid:%s] wurde keinem VPC-Router zugeordnet", + "ORG_ZSTACK_MULTICAST_ROUTER_10001": "Multicast ist bereits auf dem VPC-Router UUID[:%s] aktiviert", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012": "Der Eigentümer-Volume-Pfad kann aus dem internen Snapshot-Pfad[%s] nicht gefunden werden, da der reguläre Ausdruck[%s] nicht mit dem Snapshot-Pfad übereinstimmt", + "ORG_ZSTACK_MULTICAST_ROUTER_10002": "Der VPC-Router für den multicastRouter [uuid:%s] wurde gelöscht", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10013": "Ping auf den externen primären Speicher[%s] fehlgeschlagen. Bitte überprüfen Sie die Netzwerkkonnektivität oder den Status des Speicherdienstes.%s", + "ORG_ZSTACK_CONFIGURATION_10001": "Es existiert bereits ein benutzerdefinierter System-Tag für das Instanzangebot [UUID: %s].", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10004": "Token-Antwort ist null. Bitte stellen Sie sicher, dass Ihr Authentifizierungsprozess korrekt konfiguriert ist und der Token-Endpunkt eine gültige Antwort zurückgibt.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10003": "OAuth2Login-Implementierung für Typ(%s) kann nicht gefunden werden", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10005": "%s ist null: Bitte stellen Sie sicher, dass der Quell-Dateipfad korrekt angegeben ist.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10000": "Doppelter OAuth2-Authentifizierungs-Handler für Typ[%s]", + "ORG_ZSTACK_CONFIGURATION_10004": "Es sollte nicht mehr als einen System-Tag für ein Instanzangebot geben.", + "ORG_ZSTACK_CONFIGURATION_10003": "Es existiert bereits ein benutzerdefinierter System-Tag für das Datenträgerangebot [UUID: %s].", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10002": "OAuth2-Anbieter für Typ(%s) kann nicht gefunden werden", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10001": "Doppelter OAuth2-Anbieter[%s] für Name[%s]", + "ORG_ZSTACK_AI_10075": "dockerImage muss für ContainerModelService angegeben werden.", + "ORG_ZSTACK_AI_10076": "Modellzentrum mit UUID:%s kann für den Modelldienst mit UUID:%s nicht gefunden werden", + "ORG_ZSTACK_AI_10071": "vmImageUuid ist ein erforderlicher Parameter für den VirtualMachine-Modelldienst. Bitte geben Sie einen gültigen vmImageUuid-Wert an.", + "ORG_ZSTACK_AI_10072": "Die angegebene VM-Image-UUID ist ungültig. Bitte überprüfen Sie und geben Sie eine gültige UUID an.", + "ORG_ZSTACK_AI_10070": "ModelServiceType[%s] sollte keine abhängigen Modelldienstgruppen-UUIDs haben", + "ORG_ZSTACK_MULTICAST_ROUTER_10008": "RP-Adresspaar [%s: %s] existiert bereits für multicastRouter [uuid:%s]", + "ORG_ZSTACK_MULTICAST_ROUTER_10009": "RPC-Adress-Tupel [%s : %s] existiert nicht für multicastRouter [uuid:%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10015": "Benutzer[%s] konnte nicht hochgeladen werden: Benutzer existiert bereits in der Cloud-Umgebung", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10017": "Code-Antwort hat einen Fehler: %s", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10016": "Benutzer[%s] konnte nicht hochgeladen werden: %s", + "ORG_ZSTACK_AI_10079": "ModelEval serviceType erfordert einen bestehenden Modelldienst innerhalb der angegebenen modelServiceGroupUuids oder eine gültige URL zur Verwendung.", + "ORG_ZSTACK_AI_10077": "Keine L3-Netzwerk-UUID in der Bereitstellungsnachricht angegeben, und Modellzentrum [UUID:%s] hat kein serviceNetworkUuid oder storageNetworkUuid konfiguriert.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10012": "iam2 hat einen Benutzer mit dem gleichen Namen[%s]", + "ORG_ZSTACK_AI_10078": "Umgebungsvariablenwerte sollten in Ihrer Cloud-Umgebungskonfiguration nicht null sein. Bitte stellen Sie sicher, dass alle erforderlichen Variablen korrekt gesetzt sind.", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_SUPPLIER_EMAY_10000": "Ungültiger Parameter mit Anbieter[%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10026": "Der aus dem Cloud-Dienst abgerufene Benutzername ist null. Bitte überprüfen Sie die Benutzer-Authentifizierungskonfiguration.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10025": "Fehler beim Abrufen der Parameter[%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10028": "Plugin [uuid:%s] wird von OAuth2-Clients [uuids:%s] für die Drittanbieter-Anmeldeauthentifizierung verwendet.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10027": "Lokaler Benutzer hat einen Benutzer mit demselben Namen[%s]", + "ORG_ZSTACK_AI_10097": "Model-Services innerhalb der Gruppe[uuid: %s] haben inkonsistente Typen, erwarteter Typ: %s, gefundener Typ: %s", + "ORG_ZSTACK_AI_10098": "Model-Service-Backend[type: %s] in der virtualisierten Umgebung nicht gefunden", + "ORG_ZSTACK_AI_10095": "Alle Model-Services innerhalb der Gruppe[uuid: %s] müssen serviceBootUptime konfigurieren", + "ORG_ZSTACK_AI_10096": "Keine Model-Service-Instanz mit Knotenrang 0 in der Gruppe[uuid: %s] gefunden", + "ORG_ZSTACK_AI_10093": "Model-Service-Instanz[uuid: %s] ist nicht aktiv und nicht bereit, aber kein Fehlercode gefunden", + "ORG_ZSTACK_AI_10094": "Unerwarteter Inhalt: %s Service-YAML wurde als null geparst", + "ORG_ZSTACK_AI_10091": "Fehler beim Abrufen des Bereitschaftsstatus, weil %s", + "ORG_ZSTACK_AI_10092": "Model-Service-Instanz[uuid: %s] ist nicht verfügbar und nicht bereit wegen %s", + "ORG_ZSTACK_AI_10090": "NGINX-Konfiguration konnte nicht neu geladen werden: %s", + "ORG_ZSTACK_VROUTERROUTE_10010": "Ziel[%s] kann nicht gleichzeitig Black-Hole- und statische Routen haben", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10000": "Externer Primärspeicher[uuid:%s] kann nicht gefunden werden", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10031": "%s zu %s fehlgeschlagen, Statuscode: %s, Antworttext: %s", + "ORG_ZSTACK_VROUTERROUTE_10012": "Black-Hole-Route-Eintrag für Ziel: %s kann nicht doppelt hinzugefügt werden", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10030": "HTTP-FEHLER, Statuscode: %s, Antworttext: %s", + "ORG_ZSTACK_VROUTERROUTE_10011": "Statischer Routeneintrag kann nicht doppelt hinzugefügt werden, Ziel: %s, Zieladresse: %s, Typ: %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10003": "Erforderlicher Speicherplatz an locationUrl:%s kann nicht die Bedingungen erfüllen [availableSize > %d Bytes], aktuell verfügbarer Speicherplatz %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10004": "Volume mit UUID [%s] Installationspfad kann nicht gefunden werden", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10001": "Verbindung zu externem Speicherdienst kann nicht hergestellt werden. Bitte stellen Sie sicher, dass Ihr Speicherdienst ordnungsgemäß konfiguriert und in der Cloud-Umgebung zugänglich ist.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10032": "%s zu %s fehlgeschlagen, IO-Fehler: %s", + "ORG_ZSTACK_AI_10099": "Model-Service-Instanzgruppe[uuid: %s] existiert nicht", + "ORG_ZSTACK_VROUTERROUTE_10001": "Service-Fabrik für virtuellen Router vom Typ[%s] kann nicht gefunden werden", + "ORG_ZSTACK_VROUTERROUTE_10000": "Virtueller Router [uuid:%s] kann nicht gefunden werden", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10015": "Ceph BS[uuid=%s] Poolname nicht gefunden", + "ORG_ZSTACK_VROUTERROUTE_10003": "Routing-Tabelle [uuid:%s] kann nicht gefunden werden", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10012": "Status des Ceph-Backup-Speicher-MON [UUID:%s] kann nicht aktualisiert werden, er wurde gelöscht. Dieser Fehler kann ignoriert werden.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10000": "Host-Scheduling-Gruppe[uuid:%s] kann nicht gefunden werden, sie wurde möglicherweise gelöscht oder neu zugewiesen", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10003": "Der Host [UUID:%s] ist bereits an die Host-Scheduling-Gruppe [UUID:%s] angehängt.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10004": "Der Host mit UUID %s ist null. Bitte überprüfen Sie die Cluster-Konfiguration.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10001": "Die VM-Scheduling-Regel [uuid:%s] wurde nicht gefunden, sie wurde möglicherweise gelöscht", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10002": "Die VM-Scheduling-Gruppe [uuid:%s] wurde nicht gefunden, sie wurde möglicherweise gelöscht", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10011": "CEPH-Backup-Speicher unterstützt die Berechnung der Image-Prüfsumme nicht.", + "ORG_ZSTACK_SNS_PLATFORM_HTTP_10000": "HTTP POST-Anfrage fehlgeschlagen. Status: %s, Body: %s", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10007": "Image [uuid:%s] ist auf dem Backup-Speicher [uuid:%s, name:%s] nicht verfügbar", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10005": "Es gibt bereits einen anderen CEPH-Backup-Speicher mit derselben FSID; Sie können das gleiche CEPH-Setup nicht als zwei verschiedene Backup-Speicher hinzufügen. [name:%s, uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10003": "Verbindung zum CEPH-Backup-Speicher [UUID:%s] nicht möglich, alle CEPH-Monitore konnten nicht verbunden werden.", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10002": "CephMon [hostname:%s] wurde auf dem Backup-Speicher [uuid:%s] nicht gefunden", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10009": "MON-Knoten kann dem CEPH-Backup-Speicher-Cluster nicht hinzugefügt werden", + "ORG_ZSTACK_MULTICAST_ROUTER_BACKEND_10000": "Der Multicast-Router [uuid:%s] wurde während der Aktivierung von Multicast auf dem Backend gelöscht", + "ORG_ZSTACK_LDAP_10016": "LDAP-Eintragsabfrage fehlgeschlagen, %s", + "ORG_ZSTACK_LDAP_10017": "LDAP-Eintragsabfrage [Filter: %s] fehlgeschlagen wegen %s", + "ORG_ZSTACK_LDAP_10012": "Verbindung zum LDAP/AD-Server kann nicht hergestellt werden, ungültige Anmeldeinformationen. Bitte überprüfen Sie den Benutzer-DN und das Passwort.", + "ORG_ZSTACK_LDAP_10013": "Verbindung zum LDAP/AD-Server kann nicht hergestellt werden, Kommunikationsfehler. Bitte überprüfen Sie IP-Adresse, Portnummer und Base DN.", + "ORG_ZSTACK_LDAP_10014": "Verbindung zum LDAP/AD-Server kann nicht hergestellt werden, %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10005": "Aktuelle Lizenz [%s] ist nicht gültig für Image-Store-Backup-Speicher-Operationen", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10004": "CephPrimaryStorage [%s] existiert nicht!", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10001": "Image [uuid:%s] wurde aus dem Cloud-Speicher-Repository gelöscht", + "ORG_ZSTACK_LDAP_10010": "Ungültiger LdapServerType [%s], gültige Werte: [%, %s]", + "ORG_ZSTACK_LDAP_10007": "Konto [UUID:%s] nicht gefunden!!!", + "ORG_ZSTACK_LDAP_10008": "Nicht unterstützter LDAP/AD-Serverumfang für Cloud-Umgebungskonfiguration. Bitte stellen Sie sicher, dass der Umfang mit Virtualisierungs- und Cloud-Computing-Standards kompatibel ist.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10000": "Fehler beim Erstellen der Elastic IP [uuid:%s, name:%s, ip:%s] für die VM-Netzwerkschnittstelle [uuid:%s] auf dem virtuellen Router [uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10001": "Ein virtuelles Router-Angebot [uuid:%s] wurde für L3Network [uuid:%s] in Zone [uuid:%s] gefunden; jedoch stimmt die öffentliche IP-Konfiguration des Netzwerks nicht mit der Elastic IP [uuid:%s] überein. Möglicherweise müssen Sie ein bestimmtes virtuelles Router-Angebot unter Verwendung des System-Tags guestL3Network::l3NetworkUuid für das L3Network [uuid:%s] angeben.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10002": "Fehler beim Trennen der EIP [uuid:%s, name:%s, ip:%s] von VM-NIC [uuid:%s] auf virtuellem Router [uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10004": "Fehler beim Synchronisieren der EIP auf virtuellem Router [uuid:%s], Fehlerdetails: %s", + "ORG_ZSTACK_AI_10004": "randomUuid stimmt nicht mit dem erwarteten Wert überein. Bitte überprüfen Sie die UUID-Generierungslogik.", + "ORG_ZSTACK_AI_10005": "Model Center nicht gefunden. Bitte stellen Sie sicher, dass der Model Center-Dienst ordnungsgemäß in Ihrer Cloud-Umgebung bereitgestellt und konfiguriert ist.", + "ORG_ZSTACK_AI_10003": "randomUuid ist null. Bitte stellen Sie sicher, dass eine gültige UUID vor der Verwendung generiert wird.", + "ORG_ZSTACK_AI_10001": "Die angegebene Model Center-Verwaltungs-IP-Adresse %s ist ungültig. Bitte stellen Sie sicher, dass es sich um eine gültige IP handelt, und versuchen Sie es erneut.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10027": "vm[uuid:%s] wird jetzt auf Host[uuid:%s] ausgeführt, was nicht der Planungsrichtlinie[%s] entspricht, die der VM-Planungsgruppe[uuid:%s] zugeordnet ist.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10028": "vm[uuid:%s] wird jetzt auf Host[uuid:%s] ausgeführt, was nicht der Planungsregel[%s] entspricht, die der VM-Planungsgruppe[uuid:%s] zugeordnet ist.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10019": "Die VM-Planungsgruppe [UUID:%s] hat bereits eine ausgeführte exklusive oder affinitätsbasierte Planungsrichtlinie angehängt. Sie können keine weitere Richtlinie dieses Typs, die eine Ausführung erfordert, erneut an diese Gruppe anhängen.", + "ORG_ZSTACK_AI_10028": "modelServices darf nicht null oder leer sein. Bitte stellen Sie sicher, dass Ihre Service-Instanz ordnungsgemäß initialisiert und konfiguriert ist.", + "ORG_ZSTACK_AI_10029": "modelServices sollte die gleiche Modell-UUID wie die virtuellen Instanzen für Konsistenz verwenden.", + "ORG_ZSTACK_AI_10026": "serviceNetworkUuid %s ist kein System-Layer-3-Netzwerk", + "ORG_ZSTACK_AI_10027": "storageNetworkUuid %s ist kein System-Layer-3-Netzwerk", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10025": "vm[uuid:%s] wird jetzt auf Host[uuid:%s] ausgeführt, was nicht der Planungsrichtlinie entspricht, die der VM-Planungsgruppe[uuid:%s] der virtuellen Maschine zugeordnet ist.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10026": "hostGroup[uuid:%s] hat keine Hosts zugewiesen", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10024": "VM-Planungsgruppe[uuid:%s] konnte Host [uuid:%s] für VM [uuid:%s] nicht reservieren", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10007": "vm[uuid:%s] ist bereits mit VM-Planungsgruppe[uuid:%s] verknüpft", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10008": "Nicht übereinstimmende Zone erkannt: VM[UUID: %s, Zonen-UUID: %s] unterscheidet sich von ihrer Planungsregelgruppe[UUID: %s, Zonen-UUID: %s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10005": "Hosts, die Sie zu einer Host-Planungsgruppe hinzufügen können, müssen aktiviert und mit dem Management-Knoten (MN) verbunden sein.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10006": "Nicht übereinstimmende Zone erkannt, die Zone von Host [uuid: %s, Zonen-uuid: %s] unterscheidet sich von der Host-Planungsregelgruppe [uuid: %s, Zonen-uuid: %s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10009": "VM kann ihre VM-Planungsgruppe nur in Zuständen [%s,%s] ändern, befindet sich aber derzeit im Zustand [%s]", + "ORG_ZSTACK_TEMPLATECONFIG_10000": "Es können keine TemplateConfigs gefunden werden: [template UUID: %s]", + "ORG_ZSTACK_TICKET_API_10002": "Kein Kontosystemtyp [%s] in der Konfiguration definiert", + "ORG_ZSTACK_TICKET_API_10003": "Ticket-Typ nicht in der Cloud-Umgebungskonfiguration gefunden.%s", + "ORG_ZSTACK_TICKET_API_10004": "Keine übereinstimmende Ticket-Flow-Sammlung oder Standard-Ticket-Flow-Sammlung gefunden. Bitte geben Sie die flowCollectionUuid an oder erstellen Sie eine Standard-Ticket-Flow-Sammlung im System.", + "ORG_ZSTACK_TEMPLATECONFIG_10003": "Template-Konfiguration nicht gefunden[Kategorie: %s, Name: %s, template UUID: %s]", + "ORG_ZSTACK_TICKET_API_10005": "Ticket-Flow-Sammlung [UUID:%s] stimmt nicht mit Ticket-Typ [UUID:%s] überein", + "ORG_ZSTACK_TICKET_API_10006": "Ticket-Flow-Sammlung[uuid:%s] ist ungültig. Bitte kontaktieren Sie den Administrator zur Korrektur.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10000": "Der Aliyun NAS Primärspeicher [UUID:%s, Name:%s] kann keinen verfügbaren Host in den angehängten Clustern finden, um das Volume zu instanziieren.", + "ORG_ZSTACK_TICKET_API_10007": "Ticket-Flow-Sammlung [UUID:%s] ist deaktiviert und kann nicht verwendet werden.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10001": "Der Alibaba Cloud NAS Primärspeicher [UUID:%s, Name:%s] kann keinen verfügbaren Host in angehängten Clustern finden, um Bits auf dem Primärspeicher zu löschen.", + "ORG_ZSTACK_TICKET_API_10008": "Ungültige Anfrage. Keine API[%s] im angegebenen Namespace oder Gültigkeitsbereich gefunden", + "ORG_ZSTACK_TICKET_API_10009": "Ungültige Anfrage, kann API[%s] nicht aus apiBody erstellen, %s", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10010": "VPC-VM-Planungsgruppe kann nicht betrieben werden", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10011": "Die UUID der Verfügbarkeitszone ist nicht null.", + "ORG_ZSTACK_TEMPLATECONFIG_10005": "Es können keine TemplateConfigs gefunden werden: [templateUUID: %s]", + "ORG_ZSTACK_AI_10012": "architectureImages darf nicht null oder leer sein in Cloud-Virtualisierungsumgebungen. Bitte stellen Sie sicher, dass sie korrekt konfiguriert sind.", + "ORG_ZSTACK_AI_10042": "Ungültiges CloudFormation-Vorlagenformat: %s", + "ORG_ZSTACK_AI_10043": "YAML-Konfiguration und individuelle Parameteraktualisierungen schließen sich in Cloud-Computing-Umgebungen gegenseitig aus. Bitte wählen Sie eine Methode zum Aktualisieren der Einstellungen.", + "ORG_ZSTACK_AI_10040": "servicePorts darf keine doppelten Werte enthalten: %s", + "ORG_ZSTACK_AI_10041": "serviceBootupTime muss im Bereich [1,65535] liegen", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10006": "Fehler beim Überprüfen des Mount-Pfads auf dem Host: %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10005": "Der Aliyun NAS-Primärspeicher [UUID: %s, name: %s] wurde keinem Cluster zugeordnet, oder es sind keine verbundenen Hosts in den zugeordneten Clustern vorhanden.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10009": "Es kann kein Host zum Bereinigen des Image-Caches gefunden werden. Bitte stellen Sie sicher, dass mindestens ein Host verfügbar und für das Image-Caching korrekt konfiguriert ist.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10013": "Der Primärspeicher kann nicht an den Cluster angehängt werden. Der KVM-Host [uuid:%s, name:%s] im Cluster verwendet qemu-img mit Version [%s]; jedoch ist der Primärspeicher an einen Cluster angehängt, der einen KVM-Host [uuid:%s] hat, der qemu-img mit Version [%s] verwendet. Qemu-img-Versionen größer als %s sind nicht kompatibel mit denen kleiner als %s, was dazu führen kann, dass Volume-Snapshot-Operationen fehlschlagen. Bitte vermeiden Sie es, einen Primärspeicher an Cluster mit unterschiedlichen Linux-Distributionen anzuhängen, um qemu-img-Versionskonflikte zu verhindern.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10014": "Es konnte keine verfügbare Compute-Ressource gefunden werden, um den Image-Cache herunterzuladen!", + "ORG_ZSTACK_AI_10049": "Die CPU-Architektur in der Architecture-Image-Zuordnung darf nicht leer sein. Bitte stellen Sie sicher, dass eine gültige CPU-Architektur angegeben ist.", + "ORG_ZSTACK_AI_10046": "Der GPU-Hersteller %s muss eine Spezifikations-UUID-Liste bereitstellen", + "ORG_ZSTACK_AI_10047": "GPU-Spezifikations-UUID(s) für Hersteller %s nicht gefunden in %s: %s", + "ORG_ZSTACK_AI_10044": "Die GPU-Herstellerspezifikationszuordnung in der Architecture-Image-Zuordnung darf nicht leer sein. Bitte stellen Sie sicher, dass der GPU-Hersteller korrekt angegeben ist.", + "ORG_ZSTACK_AI_10045": "Der GPU-Hersteller in der Architecture-Image-Zuordnung darf nicht leer sein. Bitte geben Sie einen gültigen GPU-Herstellernamen an.", + "ORG_ZSTACK_AI_10031": "modelServices UUID darf nicht null sein. Bitte stellen Sie sicher, dass eine gültige UUID für modelServices bereitgestellt wird.", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10008": "Fehler beim Analieren des Metadaten-Umschlags: %s, %s", + "ORG_ZSTACK_AI_10032": "nodeRank sollte im Bereich [0, %s) liegen, aber %s wurde empfangen", + "ORG_ZSTACK_AI_10030": "modelServices sollte die gleiche Zone-UUID wie die Compute-Nodes verwenden.", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10003": "Unzulässiges Argument für den Quelldateipfad", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10004": "Entschlüsseln der Daten mit dem bereitgestellten Verschlüsselungsschlüssel fehlgeschlagen. Bitte überprüfen Sie den Schlüssel und versuchen Sie es erneut.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10017": "AliyunNasAccessGroupVO[%s] existiert nicht, möglicherweise aufgrund einer Löschung!", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10018": "EcsVSwitchVO[%s] existiert nicht, möglicherweise aufgrund einer Löschung!", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10020": "Es kann kein verfügbarer Host für den Betrieb im Primärspeicher gefunden werden: %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10021": "Fehler beim Ping von Aliyun NAS-Primärspeicher[UUID:%s] von Host[UUID:%s], weil %s. Trennen Sie diese Host-NAS-Verbindung.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10024": "Es kann kein BackupStorageKVMFactory für den Typ[%s] gefunden werden", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10025": "Es kann kein Host zum Verwalten des Volumes gefunden werden: [%s]", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10023": "NAS-Primärspeicher ist nicht eingehängt, bitte initialisieren Sie ihn zuerst!", + "ORG_ZSTACK_AI_10039": "servicePorts muss im Bereich [1,65535] liegen, aber %s wurde empfangen", + "ORG_ZSTACK_AI_10037": "serviceLivez muss mit einem '/' beginnen und keine Leerzeichen enthalten; seine Länge sollte 512 Zeichen nicht überschreiten.", + "ORG_ZSTACK_AI_10038": "serviceReadyz muss mit / beginnen, darf keine Leerzeichen enthalten und darf maximal 512 Zeichen lang sein", + "ORG_ZSTACK_AI_10035": "Ungültiges Framework: %s, gültige Werte sind: EC2, GCE, Azure, OpenStack", + "ORG_ZSTACK_AI_10036": "Ungültiges Framework: %s", + "ORG_ZSTACK_AI_10033": "Ungültige PCI-Gerätekennung: %s", + "ORG_ZSTACK_AI_10034": "nodeRank muss eindeutig sein, aber %s wurde gefunden", + "ORG_ZSTACK_ACL_10001": "%s doppelte/überlappende IP-Einträge mit Zugriffskontrollliste-Gruppe:%s", + "ORG_ZSTACK_AI_10064": "Ungültige Datensatz-Schemastrukturen: %s", + "ORG_ZSTACK_ACL_10000": "Unterstützt die IP-Version %d nicht", + "ORG_ZSTACK_AI_10065": "System-voreingestellte Datensätze können nicht über API-Aufrufe aktualisiert werden. Bitte kontaktieren Sie den Support für Unterstützung.", + "ORG_ZSTACK_AI_10062": "Der Datensatz wird verwendet und kann nicht über die API gelöscht werden. Bitte stellen Sie sicher, dass alle zugehörigen Ressourcen beendet sind, bevor Sie versuchen, ihn zu löschen.", + "ORG_ZSTACK_AI_10063": "updateDatasetStructs darf nicht null oder leer sein. Bitte stellen Sie sicher, dass die Datensatzstruktur ordnungsgemäß definiert und ausgefüllt ist, bevor Sie fortfahren.", + "ORG_ZSTACK_AI_10060": "Die VM-Instanz kann nicht beendet werden, da sie von der Modell-Dienstgruppe [UUID: %s] verwendet wird.", + "ORG_ZSTACK_ZSV_COMPUTER_VM_10000": "Der VM-Name %s existiert bereits in der Cloud-Umgebung.", + "ORG_ZSTACK_AI_10061": "Das Teilen von Anwendungsinstanzgruppen ist nicht erlaubt: %s", + "ORG_ZSTACK_ACL_10009": "Die Zugriffskontrolllisten-Gruppe [%s] besitzt bereits eine Umleitungsregel und kann keine weitere hinzufügen.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10028": "Es konnte keine verfügbare Compute-Ressource den Bereitstellungspfad überprüfen!", + "ORG_ZSTACK_ACL_10008": "Die Zugriffskontrolllisten-Gruppe [%s] besitzt bereits einen IP-Eintrag, kann keine Umleitungsregel hinzufügen.", + "ORG_ZSTACK_ACL_10007": "Die Zugriffskontrolllisten-Gruppe [%s] besitzt bereits eine Umleitungsregel, daher kann kein IP-Eintrag hinzugefügt werden.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10026": "Es kann kein Host gefunden werden, um die Volume-Größe in primär zu synchronisieren: %s", + "ORG_ZSTACK_ACL_10006": "Die Zugriffskontrolllisten-Gruppe [%s] darf %d IP-Einträge nicht überschreiten", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10027": "Das Image [%s] wurde gelöscht, das Stamm-Volume kann nicht erneut davon initialisiert werden", + "ORG_ZSTACK_SCHEDULER_SNAPSHOT_10000": "Die VM des Stamm-Volumes [%s] befindet sich im zerstörten Zustand. Zustandsänderungen sind für diesen Auftrag nicht erlaubt.", + "ORG_ZSTACK_ACL_10005": "Die Zugriffskontrolllisten-Gruppe [%s] besitzt bereits eine Umleitungsregel, daher kann kein IP-Eintrag hinzugefügt werden.", + "ORG_ZSTACK_ACL_10004": "Ungültiger Regel-Ausdruck, bitte stellen Sie sicher, dass er den Cloud-Computing-Standards entspricht, z.B. korrekte Verwendung von %s für Platzhalter. Details: %s", + "ORG_ZSTACK_ACL_10003": "IP-Bereich [%s, %s] überlappt mit [%s, %s] innerhalb der Zugriffskontrolllisten-Gruppe:%s", + "ORG_ZSTACK_ACL_10002": "IP-Format unterstützt nur ip/iprange/cidr, aber %s gefunden", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10031": "Aliyun NAS PrimaryStorage unterstützt nur imagestore BS; tatsächlich erhaltener Typ: %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10000": "InfoSecEncryptDriver Verschlüsselung fehlgeschlagen für Ressource %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10001": "InfoSecEncryptDriver Entschlüsselung fehlgeschlagen für virtuelle Ressource %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10002": "Verschlüsselungsdaten[%s] oder Verschlüsselungsalgorithmus-Typ[%s] ist null", + "ORG_ZSTACK_AI_10068": "Die Modellevaluation erfordert ModelServiceType.ModelEval", + "ORG_ZSTACK_AI_10069": "Für die Modellevaluation wird eine der Dataset-UUIDs oder ein Prompt benötigt.", + "ORG_ZSTACK_AI_10066": "Die UUID von ModelServiceVO ist obligatorisch. Bitte geben Sie eine gültige UUID an.", + "ORG_ZSTACK_AI_10067": "serviceType muss angegeben werden", + "ORG_ZSTACK_ACL_10012": "url[%s] ist kein gültiger Cloud-Speicherpfad", + "ORG_ZSTACK_AI_10053": "Image [uuid:%s] für Architektur %s ist deaktiviert und kann nicht verwendet werden", + "ORG_ZSTACK_ACL_10011": "domain[%s] ist kein gültiger Domainname", + "ORG_ZSTACK_AI_10054": "Image [uuid:%s] für die angegebene Architektur %s ist nicht verfügbar und kann nicht verwendet werden.", + "ORG_ZSTACK_ACL_10010": "Domain und URL dürfen nicht beide leer sein. Bitte geben Sie eine gültige Domain oder URL an.", + "ORG_ZSTACK_AI_10051": "Für Architektur %s muss mindestens ein virtueller Maschinen-Image-Identifier (vmImageUuid) oder ein Container-Image (dockerImage) angegeben werden", + "ORG_ZSTACK_AI_10052": "Ungültige Image-UUID für Architektur %s: %s", + "ORG_ZSTACK_AI_10050": "Ungültiger CPU-Architekturtyp in der Architektur-Image-Zuordnung: %s, unterstützte Typen umfassen: %s", + "ORG_ZSTACK_AI_10059": "Zu viele Datentypvariationen in den Dataset-Nachrichten: %s, bitte auf einen einzelnen Typ reduzieren", + "ORG_ZSTACK_AI_10057": "Das Erstellen eines Datasets ohne Angabe des Datentyps und der Nutzungsszenarien ist in Cloud-Computing-Umgebungen nicht gestattet. Bitte geben Sie die erforderlichen Details für Ihr Dataset an.", + "ORG_ZSTACK_AI_10058": "Beim Hinzufügen eines Datasets muss mindestens ein Dataset-Datentyp angegeben werden.", + "ORG_ZSTACK_AI_10055": "Doppelte CPU-Architektur in der Architektur-Image-Zuordnung angegeben: %s", + "ORG_ZSTACK_AI_10056": "Architektur-Images dürfen nicht leer sein", + "ORG_ZSTACK_VMWARE_10101": "Listenspeicher fehlgeschlagen für %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10051": "LUN-Name ist obligatorisch, aber null erhalten. Bitte stellen Sie sicher, dass ein gültiger LUN-Name angegeben wird.", + "ORG_ZSTACK_VMWARE_10102": "Kein Datastore gefunden für VirtualMachine: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10054": "Snapshot für Volume:%s mit ID :%s konnte nicht abgerufen werden", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10053": "Snapshot für LUN:%s konnte nicht abgerufen werden", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10012": "SFTP-Backup-Speicher unterstützt das Berechnen von Image-Hashes nicht.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10050": "Initiator[%s] existiert bereits in XStor und ist nicht an Host[%s] angehängt. Bitte stellen Sie sicher, dass der Initiator-Name eindeutig ist.", + "ORG_ZSTACK_ALIYUN_NETWORK_10020": "Nur EC2-Instanzen im Status \"running\" oder \"stopped\" können eine EIP anhängen, aber die ECS [%s] befindet sich derzeit im Status [%s].", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10016": "Erstellen der Image-Metadatendatei: %s fehlgeschlagen", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10017": "Überprüfen der Image-Metadatendatei: %s fehlgeschlagen", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10018": "Image-Metadatendatei: %s existiert nicht", + "ORG_ZSTACK_ZWATCH_ALARM_10022": "Duplizierte Aktion[uuid:%s, type:%s] für den Alarm[uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10021": "Aktion[uuid:%s, type:%s] in der Cloud-Computing-Umgebung nicht gefunden", + "ORG_ZSTACK_ZWATCH_ALARM_10020": "Ungültiger Aktionstyp[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10026": "Doppelter Schlüssel[%s] mit unterschiedlichen Werten{%s}%", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10170": "Server-IP konnte nicht zur Shared-Load-Balancer-Servergruppe %s hinzugefügt werden", + "ORG_ZSTACK_ZWATCH_ALARM_10025": "Die Metrik hat nicht das angegebene Label[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10023": "Doppeltes Label definiert für den Alarm mit UUID [uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10029": "Die Metrik[%s] ist auf Administratoren beschränkt und ist für Ihre aktuelle Benutzerrolle nicht verfügbar.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10171": "Backend-Server konnte nicht geändert werden, da vmincs und Server-IPs null sind", + "ORG_ZSTACK_ZWATCH_ALARM_10028": "Namespace[%s] enthält nicht die Metrik[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10027": "Namespace[%s] wird nicht unterstützt", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10049": "LUN-ID ist ungültig. Bitte stellen Sie sicher, dass sie dem erforderlichen Format und den Werten für Cloud-Speichergeräte entspricht.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10048": "LUN-Mapping-ID ist obligatorisch und darf nicht null oder null sein. Bitte geben Sie eine gültige LUN-Mapping-ID an.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10045": "Volume-Mappings konnten nicht abgerufen werden wegen: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10044": "LUN %s-Sitzungsstatus konnte nicht überprüft werden wegen: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10047": "Es gibt keinen Mechanismus zum Abrufen der LUN-Mapping-ID; daher ist die Operation fehlgeschlagen.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10046": "Verbleibende erstellte LUN-Nummer für LUN %s konnte nicht abgerufen werden wegen: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10041": "Snapshot-ID ist obligatorisch, aber erhalten:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10040": "Snapshots für Instanz %s konnten nicht abgefragt werden wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10043": "Snapshot konnte nicht zurückgesetzt werden:%s wegen: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10020": "Bitte stoppen Sie die VM, bevor Sie eine Volume-Vorlage für SFTP-Backup-Speicher %s erstellen.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10042": "Snapshot %s konnte nicht gelöscht werden wegen %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10023": "Doppelter Backup-Speicher. Es existiert bereits ein SFTP-Backup-Speicher[hostname:%s]", + "ORG_ZSTACK_LICENSE_CUBE_10000": "Der Quellcode-Kontext darf für die Lizenzvalidierung nicht null sein. Bitte geben Sie einen gültigen Kontextstring an.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10038": "Speicherpool %s konnte nicht abgerufen werden wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10037": "LUN %s konnte nicht gelöscht werden wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10039": "Snapshot für Volume %s konnte nicht erstellt werden wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10034": "LUN-Mapping-ID ist obligatorisch, aber erhalten:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10033": "LUN %s konnte nicht zu Host-Gruppe %s zugeordnet werden wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10036": "LUN-ID ist obligatorisch, aber erhalten:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10035": "LUN-Mapping %s konnte nicht gelöscht werden wegen %s", + "ORG_ZSTACK_ALIYUN_NETWORK_10004": "ECS-Instanz[%s] existiert nicht, bitte überprüfen Sie sie.", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10001": "%s konnte die virtuellen Maschinendaten vom Image-Store-Backup-Speicher[hostname:%s, path: %s] nicht auf den lokalen Primärspeicher[uuid:%s, path: %s] herunterladen, %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10002": "Hochladen der Daten vom lokalen Speicher[uuid:%s, path:%s] zum Image-Store[hostname:%s] fehlgeschlagen, %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10020": "L3-Netzwerk %s und VPC %s sind bereits verbunden. Bitte überprüfen.", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10000": "Die Quell-VM hat ein lokales Datenträgervolume auf dem Host[UUID: %s], aber der Fast-Clone-API-Versuch, die VM auf den Host [%s] zu klonen, wird vom Fast-Clone-Feature nicht unterstützt.", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10000": "AutoScalingRuleSchedulerJobTriggerVO[UUID:%s] befindet sich im Status %s, Statusänderung nicht erlaubt", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10001": "AutoScalingRuleSchedulerJobTriggerVO[uuid:%s] befindet sich in der Abkühlphase", + "ORG_ZSTACK_ALIYUN_NETWORK_10008": "Virtueller Border: %s wurde beendet", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10002": "AutoScalingRuleVO[uuid:%s] befindet sich im Status %s, Statusübergang nicht erlaubt", + "ORG_ZSTACK_ALIYUN_NETWORK_10005": "Nur ECS-Instanzen im Status „running\" oder „stopped\" können eine EIP trennen, aber der aktuelle Status der ECS [%s] ist [%s].", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10018": "CpeIp muss eine IPv4-Adresse sein, aber es ist %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10017": "Nur administrative Benutzer können Verbindungen in dieser Cloud-Umgebung herstellen.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10019": "cpeIp muss eine gültige IPv4-Adresse sein", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10000": "SftpBackupStorage unterstützt das Schema[%s] in der URL[%s] nicht", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10014": "Kein virtueller Maschinen-Backup gefunden für: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10013": "Keine virtuelle Maschine gefunden für: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_10010": "Ziel-CIDR [%s] existiert bereits und zeigt auf eine andere Instanz-ID [%s]. Bitte überprüfen oder zuerst löschen.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10061": "Abrufen der Image-Cache-LUN-Informationen fehlgeschlagen", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10016": "Nicht unterstützter Instanztyp: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10003": "Download des Images konnte nicht abgebrochen werden, weil %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10060": "Neuer Image-Cache ist nicht bereit. Bitte warten Sie einen Moment und versuchen Sie es erneut.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10015": "Kein Netzwerk gefunden für: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10004": "Die UUID des SFTP-Backup-Speicher-Agents hat sich geändert [erwartet: %s, tatsächlich: %s], was höchstwahrscheinlich auf einen manuellen Neustart des Agents zurückzuführen ist. Bitte führen Sie eine erneute Verbindung durch, um den Status zu synchronisieren.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10010": "Kein CIDR für L3-Netzwerk gefunden: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10012": "Kein virtuelles privates Netzwerk gefunden für: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10059": "Datenträger nicht gefunden: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10055": "XSStor-Cluster ist nicht gesund, Cluster-Info[clusterDataState: %s, clusterHealthyState: %s, clusterRunningState: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10058": "Ungültige logische Einheitsnummer (LUN) ID angegeben", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10057": "Die Sitzung für LUN %s mit Host %s ist in der virtualisierten Umgebung nicht aktiv.", + "ORG_ZSTACK_HYBRID_NETWORK_10027": "cidr wird von einem anderen vswitch überlappt: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10028": "Ungültiger CIDR-Block: %s muss innerhalb der Bereiche '10.0.0.0/8', '172.16.0.0/12' oder '192.168.0.0/16' liegen", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10010": "Instanz %s kann nicht beendet werden wegen %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10009": "Keine virtuelle Netzwerkschnittstelle gefunden für Layer-3-Netzwerk: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10029": "Kein virtueller Border Router vorhanden: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10003": "Benutzerdefinierter CIDR [%s] existiert bereits in VBR [%s], überlappend mit Ziel-CIDR [%s]. Bitte prüfen und zuerst löschen.", + "ORG_ZSTACK_HYBRID_NETWORK_10020": "Next-Hop-Router-Schnittstelle gehört zu %s, aber der Eintrag gehört zu %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10001": "VBR: [%s] baut gerade eine Verbindung auf, bitte warten...", + "ORG_ZSTACK_HYBRID_NETWORK_10021": "Kein virtueller Private Gateway vorhanden: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10000": "Benutzerdefinierter CIDR [%s] existiert bereits in virtuellem Router [%s], überlappend mit Ziel-CIDR [%s]. Bitte prüfen und zuerst löschen.", + "ORG_ZSTACK_HYBRID_NETWORK_10022": "Next-Hop-Typ [%s] wird für das Erstellen eines Route-Eintrags nicht unterstützt!", + "ORG_ZSTACK_HYBRID_NETWORK_10024": "Virtueller Border Router unterstützt nur Router-Schnittstelle als Next-Hop-Typ", + "ORG_ZSTACK_HYBRID_NETWORK_10026": "VSwitch-CIDR [%s] liegt nicht innerhalb des VPCs [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10008": "Instanz %s kann nicht zur Host-Gruppe %s hinzugefügt werden wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10005": "Fehler beim Abrufen des Subnets der Access-Zone wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10004": "Fehler beim Synchronisieren der Access-Zones wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10007": "Fehler beim Abfragen der Instanzen %s wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10006": "Fehler beim Abfragen aller Instanzen wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10001": "Fehler beim Hinzufügen des Initiators: %s zum Host wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10000": "Fehler bei der Authentifizierung mit XStor-Gerät: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10002": "Fehler beim Kopieren von LUN: %s nach %s wegen %s", + "ORG_ZSTACK_HYBRID_NETWORK_10038": "EIP[%s] und ECS[%s] müssen in derselben Availability Zone sein", + "ORG_ZSTACK_VMWARE_10135": "Fehler beim Setzen von ZStack UUID auf VCenter Managed Entity [name:%s, mor:%s] wegen %s", + "ORG_ZSTACK_HYBRID_NETWORK_10039": "EIP: [%s] konnte nicht getrennt werden, sie ist an keine Instanz angehängt", + "ORG_ZSTACK_VMWARE_10132": "Keine Unit-Nummer verfügbar für Daten-Disk %s", + "ORG_ZSTACK_VMWARE_10133": "Erstellen von dvPortGroup für DistributedSwitch [%s] fehlgeschlagen, %s", + "ORG_ZSTACK_VMWARE_10130": "Löschen von Volume[%s] fehlgeschlagen: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10030": "Kein virtueller Router vorhanden: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10031": "LocalGateway ist keine IPv4-Adresse: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10032": "PeerGateway ist keine gültige IPv4-Adresse: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10033": "PeerGateway ist keine gültige Subnet-Maske: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10034": "VLAN-ID muss ein numerischer Wert sein: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10035": "EIP konnte nicht an ECS angehängt werden: [%s], EIP :[%s] ist bereits an ECS:[%s] angehängt", + "ORG_ZSTACK_HYBRID_NETWORK_10036": "ECS [%s] hat bereits eine öffentliche IP-Adresse", + "ORG_ZSTACK_HYBRID_NETWORK_10037": "EIP [%s] konnte nicht an ECS [%s] angehängt werden, da das ECS bereits mit einem EIP verbunden ist", + "ORG_ZSTACK_SSO_SERVICE_10014": "Virtuelle ID existiert nicht für Benutzer %s", + "ORG_ZSTACK_VMWARE_10129": "Virtueller Festplatten-Manager-Dienst nicht verfügbar. Bitte prüfen Sie, ob der Dienst läuft, oder kontaktieren Sie den Support.", + "ORG_ZSTACK_SSO_SERVICE_10011": "Antwort hat einen Fehler: Die Quelldatei wurde im Cloud-Speichersystem nicht gefunden. Bitte prüfen Sie den Dateipfad und stellen Sie sicher, dass sie korrekt in die virtualisierte Umgebung hochgeladen wurde.", + "ORG_ZSTACK_SSO_SERVICE_10010": "redirectUrl ist ungültig, %s", + "ORG_ZSTACK_VMWARE_10128": "Kein Rechenzentrum für den Datastore gefunden.%s", + "ORG_ZSTACK_SSO_SERVICE_10013": "Konto existiert nicht für Benutzer %s", + "ORG_ZSTACK_SSO_SERVICE_10012": "Benutzerinformations-Mapping-Konfiguration für SSO-Client [UUID: %s] konnte nicht generiert werden: keine benutzerdefinierten Attribut-Mappings definiert.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10030": "Abfrage der LUN-Mapping für Host-Gruppe %s fehlgeschlagen wegen %s", + "ORG_ZSTACK_HYBRID_NETWORK_10005": "Router-Schnittstelle muss sich im selben Rechenzentrum befinden, aber ri[%s] ist in dc[%s] und ri[%s] ist in dc[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10032": "Abfrage der Cluster-Informationen fehlgeschlagen wegen %s", + "ORG_ZSTACK_VMWARE_10121": "Erstellung von dvPortGroup für %s fehlgeschlagen", + "ORG_ZSTACK_HYBRID_NETWORK_10007": "Router-Schnittstelle[%s] befindet sich nicht im Leerlauf, aktueller Status ist %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10031": "Abfrage der LUN-Mapping %s fehlgeschlagen wegen %s", + "ORG_ZSTACK_HYBRID_NETWORK_10009": "Router-Schnittstelle[%s] hat bereits eine aktive Verbindung, sie ist %s", + "ORG_ZSTACK_VMWARE_10120": "dvSwitch [%s] auf vCenter [%s] nicht gefunden. Bitte stellen Sie sicher, dass der dvSwitch existiert und korrekt konfiguriert ist.", + "ORG_ZSTACK_GUESTTOOLS_10009": "Kein geeignetes Gast-Betriebssystem-Tools-ISO auf Management-Knoten [UUID:%s] für Host [UUID:%s] gefunden.", + "ORG_ZSTACK_GUESTTOOLS_10007": "Aktuelle Gast-Tools für VM[uuid:%s] können nicht abgerufen werden, da sie nicht läuft oder sich in Volumen-Wiederherstellung befindet.", + "ORG_ZSTACK_ZWATCH_ALARM_10000": "Ereignisabonnement [uuid:%s] nicht gefunden, es wurde möglicherweise gelöscht oder widerrufen", + "ORG_ZSTACK_GUESTTOOLS_10008": "Aktuelle Gast-Tools für VM[UUID:%s] können nicht abgerufen werden, da es sich nicht um eine benutzerverwaltete VM handelt", + "ORG_ZSTACK_GUESTTOOLS_10005": "qgaStateChange für virtuelle Maschine[uuid:%s] fehlgeschlagen", + "ORG_ZSTACK_GUESTTOOLS_10006": "Aktuelle Gast-Tools für VM [uuid:%s] können nicht abgerufen werden, da ihr Hypervisor-Typ nicht unterstützt wird", + "ORG_ZSTACK_GUESTTOOLS_10004": "qga-Datei-Upload fehlgeschlagen[%s]", + "ORG_ZSTACK_GUESTTOOLS_10001": "Ein Fehler ist aufgetreten bei VM-%s: %s", + "ORG_ZSTACK_ZWATCH_ALARM_10002": "Der Wiederholungsintervall-Wert der Metrik[%s] kann nicht weniger als 1 Stunde betragen", + "ORG_ZSTACK_GUESTTOOLS_10002": "Datei-Upload auf virtuelle Maschine-%s fehlgeschlagen, %s", + "ORG_ZSTACK_ZWATCH_ALARM_10001": "Alarm[uuid:%s] nicht gefunden, er wurde möglicherweise gelöscht oder ist abgelaufen", + "ORG_ZSTACK_SSO_SERVICE_10008": "Token %s existiert nicht in der Cloud-Umgebungskonfiguration. Bitte überprüfen Sie das Token erneut.", + "ORG_ZSTACK_AI_10109": "Modellzentrum [uuid: %s] Instanz nicht gefunden", + "ORG_ZSTACK_SSO_SERVICE_10007": "Hochladen der Administrator-Anmeldeinformationen zu Keycloak fehlgeschlagen. Bitte stellen Sie sicher, dass die erforderlichen Berechtigungen und Netzwerkkonfigurationen für die Cloud-Bereitstellung korrekt eingerichtet sind.", + "ORG_ZSTACK_ZWATCH_ALARM_10007": "Das Ereignisabonnement hat bereits das Label[%s]", + "ORG_ZSTACK_AI_10107": "Modell-Dienstinstanz (primär) mit Knoten-Rang 0 nicht gefunden in Modell-Dienstinstanzgruppe [uuid: %s]", + "ORG_ZSTACK_ZWATCH_ALARM_10006": "Ereignis hat kein Label[%s]", + "ORG_ZSTACK_SSO_SERVICE_10009": "%s Datentyp wird in Cloud-Computing-Umgebungen nicht unterstützt", + "ORG_ZSTACK_AI_10108": "Modell-Dienstinstanzgruppe %s nicht in der Cloud-Umgebung gefunden", + "ORG_ZSTACK_ZWATCH_ALARM_10005": "Die Aktion mit UUID [%s] ist bereits mit dem Ereignisabonnement mit UUID [%s] verknüpft.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10027": "LUN-Name erstellen fehlgeschlagen: %s, Fehlermeldung: %s", + "ORG_ZSTACK_SSO_SERVICE_10004": "IdP-Metadaten-URL ist erforderlich.%s", + "ORG_ZSTACK_AI_10105": "Modell-Dienst bereitgestellt, aber Modell-Dienstinstanz-UUID fehlt. Bitte überprüfen Sie die Instanzkonfiguration.", + "ORG_ZSTACK_SSO_SERVICE_10003": "Ungültige Autorisierungs-Endpunkt-URL: %s", + "ORG_ZSTACK_AI_10106": "Modell-Dienstinstanz-UUIDs sind leer; Modell-Dienstinstanzen können nicht verarbeitet werden. Bitte stellen Sie sicher, dass UUIDs bereitgestellt werden.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10029": "LUN-ID ist obligatorisch beim Abfragen von LUN-Zuordnungsinformationen.", + "ORG_ZSTACK_SSO_SERVICE_10006": "Ungültige Identity-Provider-Metadaten: %s", + "ORG_ZSTACK_AI_10103": "Modell-Dienstinstanzgruppe [UUID: %s] nicht gefunden, Erstellung von Ressource für Dienstausführung wird übersprungen", + "ORG_ZSTACK_VMWARE_10118": "Portgruppe für Host %s erstellen fehlgeschlagen wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10028": "LUN %s abfragen fehlgeschlagen wegen %s", + "ORG_ZSTACK_AI_10104": "Modell-Dienst bereitstellen Antwort erfolgreich, aber Modell-Dienstinstanzgruppe [uuid: %s] nicht im virtuellen Maschinen-Instanzpool gefunden", + "ORG_ZSTACK_VMWARE_10119": "Portgruppe für Host %s erstellen fehlgeschlagen", + "ORG_ZSTACK_AI_10101": "Modell-Speicher-Backend nicht gefunden für Modell-Dienstinstanzgruppe [uuid: %s]", + "ORG_ZSTACK_VMWARE_10116": "Portgruppe[%s] existiert bereits auf Host[%s] aber mit unterschiedlicher VLAN-ID(%d)", + "ORG_ZSTACK_AI_10102": "Modell-Dienstinstanz-Identifier konnte nicht zugeordnet werden, weil %s", + "ORG_ZSTACK_VMWARE_10117": "Portgruppe[%s] existiert bereits auf Host[%s]. Bitte erstellen Sie eine neue Portgruppe mit einem anderen Namen oder löschen Sie die vorhandene Portgruppe manuell und fügen Sie sie erneut an den Cluster an.", + "ORG_ZSTACK_SSO_SERVICE_10002": "SSO-Client ist kein Identitätstyp [%s], Push-Vorgang nicht erlaubt.", + "ORG_ZSTACK_VMWARE_10114": "dvSwitch-Name [%s] ist nicht eindeutig", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10024": "LUN-Name erstellen fehlgeschlagen: %s, Ursache kann nicht ermittelt werden", + "ORG_ZSTACK_SSO_SERVICE_10001": "SSO-Client mit UUID [%s] existiert nicht.", + "ORG_ZSTACK_AI_10100": "Modell-Dienstinstanzgruppe[uuid: %s] Modell-Dienst-UUID ist null", + "ORG_ZSTACK_VMWARE_10115": "Host[%s:%s] nicht im vCenter-Inventar gefunden", + "ORG_ZSTACK_VMWARE_10112": "dvSwitch-Auflistung fehlgeschlagen für %s", + "ORG_ZSTACK_HYBRID_NETWORK_10016": "%s ist kein gültiger CIDR-Block", + "ORG_ZSTACK_VMWARE_10113": "Abrufen des vCenter-Cluster[%s]-Namens fehlgeschlagen", + "ORG_ZSTACK_HYBRID_NETWORK_10017": "Eine Sicherheitsgruppenregel mit denselben Parametern existiert bereits. Bitte ändern oder löschen Sie die vorhandene Regel, bevor Sie eine neue erstellen.", + "ORG_ZSTACK_VMWARE_10110": "Gast-Tools sind nicht installiert oder werden nicht ausgeführt für VM: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10018": "dstCidrBlock[%s] ist kein gültiger IPv4- oder IPv6-Adressbereich", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10020": "LUN-Name konnte nicht aktualisiert werden: %s, Fehlermeldung: %s", + "ORG_ZSTACK_VMWARE_10111": "Dateiupload fehlgeschlagen für virtuelle Maschine: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10019": "Keine solche ECS-Instanz: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10010": "accessPointUuid darf nicht null sein, wenn der virtuelle Router vom Typ VBR ist.", + "ORG_ZSTACK_HYBRID_NETWORK_10011": "Router-UUID[%s] konnte in VirtualBorderRouterVO nicht gefunden werden", + "ORG_ZSTACK_GUESTTOOLS_10018": "VM[UUID:%s] konnte nicht migriert werden, da ein vfNic angehängt ist, aber Gast-Tools nicht ausgeführt werden", + "ORG_ZSTACK_ZWATCH_ALARM_10011": "Ereignis[%s] fehlt das Label[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10012": "Router-UUID[%s] konnte in VpcVirtualRouterVO nicht gefunden werden", + "ORG_ZSTACK_GUESTTOOLS_10019": "L3-Netzwerk konnte nicht an VM [UUID:%s] angehängt werden, weil Gast-Tools nicht ausgeführt werden.", + "ORG_ZSTACK_ZWATCH_ALARM_10010": "Namespace[%s] enthält nicht das Ereignis[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10013": "Nicht unterstützter Router-Typ: %s", + "ORG_ZSTACK_GUESTTOOLS_10016": "VF-NIC-HA-Status konnte nicht geändert werden, weil VF-NIC [UUID:%s] nicht gefunden wurde", + "ORG_ZSTACK_HYBRID_NETWORK_10014": "Systemebene-Eintrag für virtuelle Maschine kann nicht gelöscht werden", + "ORG_ZSTACK_GUESTTOOLS_10017": "Fehler beim Ändern des Status der virtuellen Netzwerkkarte für Hochverfügbarkeit, weil Gast-Tools nicht ausgeführt werden. Bitte stellen Sie sicher, dass Gast-Tools installiert und ausgeführt werden, bevor Sie diesen Vorgang erneut versuchen.", + "ORG_ZSTACK_HYBRID_NETWORK_10015": "Nur Intranet-Zugriffsregel in VPC unterstützt", + "ORG_ZSTACK_GUESTTOOLS_10014": "Das Skript enthält Platzhalter %s, denen keine entsprechenden Parameter zugeordnet sind. Bitte geben Sie Werte für diese Platzhalter über runtimeParams an, um eine ordnungsgemäße Konfiguration Ihrer Cloud-Computing-Umgebung sicherzustellen.", + "ORG_ZSTACK_ZWATCH_ALARM_10015": "Period-Feld wird für Metrik [name:%s] nicht unterstützt", + "ORG_ZSTACK_GUESTTOOLS_10015": "Primärspeicher konnte nicht migriert werden, da VM [UUID:%s] an einen vfNic angeschlossen ist, aber Gast-Tools nicht ausgeführt werden", + "ORG_ZSTACK_ZWATCH_ALARM_10014": "Period-Feld darf für Metrik [name:%s] nicht null sein", + "ORG_ZSTACK_GUESTTOOLS_10012": "encodingType und scriptContent müssen in Ihrer Cloud-Bereitstellungskonfiguration entweder beide vorhanden oder beide abwesend sein.", + "ORG_ZSTACK_ZWATCH_ALARM_10013": "Namespace[%s] nicht im angegebenen Cloud-Namespace-Register gefunden", + "ORG_ZSTACK_GUESTTOOLS_10013": "Ungültiges renderParams-Format, muss ein gültiges JSON-Array von Schlüssel-Wert-Paaren sein. Beispiel: [{\\\"key\\\":\\\"k1\\\",\\\"value\\\":\\\"v1\\\"}]. Fehler: %s", + "ORG_ZSTACK_GUESTTOOLS_10010": "Überprüfung der Gast-Tools auf Host[uuid:%s] fehlgeschlagen", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10019": "LUN konnte nicht nach Pfad abgefragt werden: %s, Fehlermeldung: %s", + "ORG_ZSTACK_GUESTTOOLS_10011": "Fehler beim Festlegen der VM-UUID: %s NAME: %s Hostname, da der QEMU-Gast-Agent nicht ausgeführt wird und kein DHCP-Dienst verfügbar ist", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10016": "Fehler beim Hinzufügen der Hostgruppe: %s, Fehlermeldung: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10015": "Fehler beim Abfragen der Hostgruppe aufgrund von %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10017": "Fehler beim Abfragen der LUN: %s, Fehlermeldung: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10012": "Fehler beim Löschen der Hostgruppe %s aufgrund von %s", + "ORG_ZSTACK_VMWARE_10105": "Kein Ressourcenpool für Compute-Host %s gefunden", + "ORG_ZSTACK_VMWARE_10106": "Fehler beim Suchen nach Ressourcenpool für Host %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10014": "Fehler beim Löschen des Initiators %s aufgrund von %s", + "ORG_ZSTACK_VMWARE_10103": "Fehler beim Festlegen der ESX-VM-UUID [%s:%s], wegen [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10013": "Host-Identifier ist obligatorisch, aber erhalten: %s", + "ORG_ZSTACK_VMWARE_10104": "Vorlage [%%s] nicht im Cloud-Template-Repository gefunden", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10029": "Build-Instanz mit UUID: %s kann nicht gefunden werden, oder sie befindet sich im Status \"Wird gelöscht\"", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10028": "UUID für Image [%s] kann nicht gefunden werden", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10027": "imageStore ist nicht mit dem Cloud-Speicherdienst verbunden. Bitte stellen Sie sicher, dass Ihr Cloud-Speicherdienst korrekt konfiguriert ist, und versuchen Sie es erneut.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10026": "imageStore ist nicht aktiviert. Bitte stellen Sie sicher, dass imageStore in Ihren Cloud-Umgebungseinstellungen konfiguriert und aktiviert ist.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10024": "Build-Anwendung kann nicht gefunden werden: [%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10022": "Build-System [UUID: %s] wurde nicht an die Compute-Zone [UUID: %s] angehängt", + "ORG_ZSTACK_CONTAINER_10040": "Bereitstellung auf keinem verfügbaren Cluster möglich. Versucht: %d Cluster: %s", + "ORG_ZSTACK_FLOWMETER_10013": "Collector-Duplikat mit %s", + "ORG_ZSTACK_FLOWMETER_10014": "Keine spezifizierten Parameter für Cloud-Ressourcen-Bereitstellungsanfrage. Bitte spezifizieren Sie %s.", + "ORG_ZSTACK_FLOWMETER_10015": "[%s] entspricht nicht dem IP-Adressformat", + "ORG_ZSTACK_FLOWMETER_10016": "FlowCollector [%s] existiert nicht", + "ORG_ZSTACK_GUESTTOOLS_10029": "Gast-Tools-Informationen können nicht von VM [uuid:%s] abgerufen werden, da sie nicht ausgeführt wird", + "ORG_ZSTACK_CONTAINER_10043": "Abfrage des Cloud-Dienstes fehlgeschlagen: %s, wegen %s", + "ORG_ZSTACK_FLOWMETER_10017": "FlowMeter [%s] existiert nicht", + "ORG_ZSTACK_FLOWMETER_10018": "FlowMeter [%s] unterstützt IPv6-Version [%s] nicht", + "ORG_ZSTACK_GUESTTOOLS_10027": "Gast-Tools-ISO kann nicht an VM [UUID:%s] angehängt werden, da es sich nicht um eine Benutzer-VM handelt", + "ORG_ZSTACK_CONTAINER_10045": "Diensterstellung fehlgeschlagen aufgrund von %s", + "ORG_ZSTACK_FLOWMETER_10019": "Collector [%s %d] dupliziert mit %s", + "ORG_ZSTACK_GUESTTOOLS_10028": "Gast-Tools-ISO kann nicht an VM [uuid:%s] angehängt werden, da kein CDROM-Gerät vorhanden ist", + "ORG_ZSTACK_CONTAINER_10037": "Es können keine containerisierten Cluster gefunden werden. Bitte prüfen Sie NativeClusterVO für Details.", + "ORG_ZSTACK_GUESTTOOLS_10025": "kann Gast-Tools-ISO nicht an VM [uuid:%s] anhängen, da der Hypervisor-Typ nicht unterstützt wird", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10057": "Fehler beim Herunterfahren des Bare-Metal-Chassis[uuid:%s] mit ipmitool", + "ORG_ZSTACK_GUESTTOOLS_10026": "kann Gast-Tools-ISO nicht an VM [UUID:%s] anhängen, da sie nicht ausgeführt wird", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10058": "Fehler beim Herunterfahren der Bare-Metal-Instanz[uuid:%s] über bm agent, Grund: %s", + "ORG_ZSTACK_GUESTTOOLS_10023": "Update der VM[uuid:%s] Netzwerkkonfiguration fehlgeschlagen, da die Gast-Tools-Version für dieses Feature zu niedrig ist.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10059": "Bare-Metal2-Chassis[uuid:%s] ist nach %d Sekunden immer noch nicht ausgeschaltet", + "ORG_ZSTACK_GUESTTOOLS_10024": "Update der VM[uuid:%s] Netzwerkkonfiguration fehlgeschlagen, da Gast-Tools nicht ausgeführt werden.", + "ORG_ZSTACK_GUESTTOOLS_10021": "Konflikt mit Hostname erkannt. Eine andere VM mit UUID [%s] verwendet bereits den Hostname [%s] im L3-Netzwerk mit UUID [%s].", + "ORG_ZSTACK_GUESTTOOLS_10022": "Update der VM[uuid:%s] Netzwerkkonfiguration fehlgeschlagen, da die virtuelle Maschine nicht ausgeführt wird.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10054": "Fehler beim Herstellen einer Verbindung mit der Bare-Metal2-Instanz [uuid:%s] über Gateway [uuid:%s], wegen %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10055": "Fehler beim Ändern des Passworts der Bare-Metal-Instanz[uuid:%s] durch Gateway[uuid:%s], weil %s", + "ORG_ZSTACK_GUESTTOOLS_10020": "VM-Hostname kann nicht gesetzt werden. Die VM [UUID:%s] hat kein standardmäßiges Layer-3-Netzwerk.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10056": "Fehler beim Einschalten des Bare-Metal-Chassis[uuid:%s] mit ipmitool", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10021": "Build-System [%s] kann nicht gefunden werden", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10020": "Build-System [UUID: %s] wurde an Zone [UUID: %s] angehängt", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10050": "Fehler beim Erstellen der Console-Proxy für Bare-Metal-Instanz[uuid:%s] in Gateway[uuid:%s], weil %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10051": "Fehler beim Wechseln des Standardnetzwerks von l3[uuid:%s] zu l3[uuid:%s] für Bare-Metal-Instanz[uuid:%s], wegen %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10018": "Hinzufügen von BuildApp fehlgeschlagen, da appId[%s:%s] von einer anderen BuildApp-Instanz dupliziert wird", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10017": "Verbindung zum lokalen Storage-Build-System [url: %s] nicht möglich, wegen Konnektivitätsproblem", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10016": "Erstellen von BuildApp fehlgeschlagen, da appId[%s] von einer anderen BuildApp dupliziert wird", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10015": "Die Build-Anwendung ist deaktiviert, da sich das Build-System im Status 'Gestoppt' befindet. Bitte starten Sie das Build-System, um die Anwendung zu aktivieren.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10014": "REST-Aufruf %s fehlgeschlagen, wegen: %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10013": "Build-App hat Status %s, der die aktuelle Operation nicht unterstützt.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10012": "Build-Anwendung kann nicht mit UUID[%s] gefunden werden", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10011": "Operation kann nicht ausgeführt werden, da sich das Build-System im Status %s befindet", + "ORG_ZSTACK_CONTAINER_10031": "Deployment nicht gefunden: %s", + "ORG_ZSTACK_FLOWMETER_10003": "Das Netzwerk[%s] wurde in den Flow-Meter[%s] integriert.", + "ORG_ZSTACK_FLOWMETER_10004": "Der virtuelle Router wurde bereits zu einem anderen Flow-Meter hinzugefügt. Bitte stellen Sie sicher, dass keine Duplizierung vorliegt.", + "ORG_ZSTACK_FLOWMETER_10005": "Ungültiger Typ-Parameter ist %s und sollte aus dem gültigen Bereich %s sein", + "ORG_ZSTACK_CONTAINER_10050": "Kubernetes-Konfiguration für Cluster %s ist null", + "ORG_ZSTACK_CONTAINER_10052": "kube config Datei-Inhalt konnte nicht genutzt werden: %s", + "ORG_ZSTACK_CORE_PROGRESS_10000": "Parameter apiId[%s] ist keine gültige UUID für Cloud-Dienst-Konfiguration.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10029": "Konvertierung von Volume zu Chassis-lokalen Plattenkonfigurationen in Gateway[uuid:%s] für Bare-Metal-Instanz[uuid:%s] konnte nicht gelöscht werden", + "ORG_ZSTACK_CONTAINER_10056": "Container-Backup-Speicher mit UUID: %s nicht gefunden", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10024": "bereitgestellte IP %s ist nicht verfügbar, da keine Verbindung zum Gateway %s hergestellt werden kann; detaillierter Fehler:%s", + "ORG_ZSTACK_CONTAINER_10047": "Dienststatus-Bundle für Dienst[%s] konnte nicht abgerufen werden", + "ORG_ZSTACK_CONTAINER_10049": "Cluster mit angegebener Cluster-ID nicht gefunden: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10027": "Bare-Metal2 Chassis konnte für Instanz[uuid:%s] durch Gateway[uuid:%s] nicht inspiziert werden, weil %s", + "ORG_ZSTACK_STORAGE_CBT_10020": "Unerwarteter VM[UUID: %s] Status: %s, der erwartete VM-Status ist Running.", + "ORG_ZSTACK_STORAGE_CBT_10021": "VM [UUID: %s] hat bereits einen Backup-Job erstellt; daher ist die gleichzeitige Aktivierung der CBT-Aufgabe nicht erlaubt.", + "ORG_ZSTACK_STORAGE_CBT_10016": "Kein Hypervisor-Typ für VM %s angegeben", + "ORG_ZSTACK_STORAGE_CBT_10017": "Kein CBTBackupFactory vom Typ[%s] in den konfigurierten Cloud-Speicheranbietern gefunden", + "ORG_ZSTACK_STORAGE_CBT_10014": "VM [uuid: %s] wurde bereits durch Aufgabe geschützt: %s", + "ORG_ZSTACK_STORAGE_CBT_10015": "Erstellung von CBT-Volumes fehlgeschlagen. Details: %s", + "ORG_ZSTACK_STORAGE_CBT_10018": "CVM-Aufgabe nicht gefunden[uuid: %s]", + "ORG_ZSTACK_STORAGE_CBT_10019": "CBT-Aufgabe [UUID: %s] wurde bereits aktiviert. Bitte deaktivieren Sie sie.", + "ORG_ZSTACK_CONTAINER_10000": "Container-Backup-Speicher unterstützt das angegebene Format %s nicht", + "ORG_ZSTACK_CONTAINER_10002": "Keine Verfügbarkeitszone für Endpunkt[%s] gefunden", + "ORG_ZSTACK_IAM2_RBAC_10006": "die Operationen[%s] sind in dieser Cloud-Computing-Umgebung nicht erlaubt", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10008": "virtuelles Netzwerk[uuid:%s] von TF-Controller abrufen fehlgeschlagen", + "ORG_ZSTACK_IAM2_RBAC_10001": "Da das Projekt eine erzwungene Sicherheitsgruppen-Nutzung erfordert, ist ein System-Tag für virtuelle Maschinen-Operationen obligatorisch.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10009": "TF L2 Netzwerk[name:%s] auf TF-Controller aktualisieren fehlgeschlagen", + "ORG_ZSTACK_IAM2_RBAC_10000": "Erstellung der VM-Instanz fehlgeschlagen, da L3 Netzwerk [uuid:%s] nicht an Compute-Clusters angehängt ist", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10006": "TF L2 Netzwerk[name:%s] auf TF-Controller erstellen fehlgeschlagen", + "ORG_ZSTACK_IAM2_RBAC_10003": "Projekt[uuid:%s] wurde stillgelegt und alle Operationen werden abgelehnt.", + "ORG_ZSTACK_IAM2_RBAC_10002": "Projekt des Kontos[uuid:%s] existiert nicht", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10005": "Projekt[uuid:%s] auf Terraform-Controller abrufen fehlgeschlagen", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10002": "Standarddomänen-Abruf auf dem TensorFlow-Controller fehlgeschlagen.%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10003": "TF-Projekt für ZStack Admin auf TF-Controller erstellen fehlgeschlagen", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10000": "Der SDN-Controller mit dem angegebenen Namen existiert bereits. Bitte wählen Sie einen anderen Namen oder verwenden Sie einen vorhandenen.", + "ORG_ZSTACK_STORAGE_CBT_10012": "Ressource für CBT-Aufgabe[uuid: %s] kann nicht gefunden werden", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10001": "Standard-Admin-Konto konnte nicht aus ZStack-Datenbank abgerufen werden", + "ORG_ZSTACK_STORAGE_CBT_10013": "Host für virtuelle Maschine nicht gefunden: %s", + "ORG_ZSTACK_STORAGE_CBT_10011": "volume[uuid:%s] ist bereits exportiert für vmInstance[uuid:%s].", + "ORG_ZSTACK_STORAGE_CBT_10006": "Cloud Block Storage-Aufgabe[uuid:%s] kann nicht gefunden werden", + "ORG_ZSTACK_STORAGE_CBT_10009": "vm[uuid: %s] wird gerade ausgeführt. Bitte stoppen Sie sie und versuchen Sie es erneut.", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10004": "Falscher Parametertyp '%s' im Ausdruck, er muss vom Typ %s sein, hat aber %s erhalten", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10003": "Fehlender Parameter '%s' im Cloud-Computing-Ausdruck", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10000": "Ungültiger Ausdruck: %s, %s Bitte stellen Sie sicher, dass die Ausdrücke für Cloud-Computing-Umgebungen gültig sind.", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10001": "Ungültiger Ausdruck: %s, kein gültiger Cloud-Computing-Ausdruck gefunden", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10019": "Hinzufügen von tf l3 subnet[name:%s] auf tf-Controller fehlgeschlagen wegen: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10082": "baremetal2-Gateway mit UUID: %s ist nicht verbunden; daher kann keine Konsole-URL für Instanz mit UUID: %s generiert werden.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10016": "Aktualisierung von tf l3 network[name:%s] auf tf-Controller fehlgeschlagen wegen: %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10013": "Löschen von tf L3 network[name:%s] auf tf-Controller fehlgeschlagen wegen: %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10011": "Löschen von l2 network[uuid:%s] auf tf-Controller fehlgeschlagen", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10080": "Vorbereitung von Provisioning-Network[uuid:%s] in Gateway[uuid:%s] fehlgeschlagen: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10081": "baremetal2-Instanz [uuid:%s] existiert nicht; daher kann ihre Konsole-URL nicht generiert werden.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10007": "buildAppUuid und exportId können nicht gleichzeitig null sein. Bitte stellen Sie sicher, dass entweder buildAppUuid oder exportId angegeben wird.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10006": "Sowohl backup storage UUID als auch Hostname sind gesetzt, verweisen aber auf verschiedene Hosts", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10005": "Mehr als ein backup storage mit Hostname: %s gefunden, bitte verwenden Sie stattdessen backupStorageUuid", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10004": "Image-Store mit Hostname: %s kann nicht gefunden werden", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10003": "Sowohl backup storage UUID als auch Hostname sind null. Bitte überprüfen Sie die Konfigurationseinstellungen für backup storage und Hostname.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10002": "dataPath muss mit '/' beginnen, tatsächlich erhalten: [%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10001": "Ein anderes Build-System[UUID: %s, name: %s] auf diesem Host[%s] verwendet dieselbe URL[%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10000": "build-app[%s] wird gerade exportiert oder ist im Export; bitte beenden oder entfernen Sie es zuerst.", + "ORG_ZSTACK_CAS_10000": "Fehlende Eigenschaft für CAS-Treiberkonfiguration", + "ORG_ZSTACK_CAS_10002": "Falsche virtuelle Maschine ID[name:%s], existiert nicht oder falsches Passwort", + "ORG_ZSTACK_CONTAINER_10020": "Löschen der Netzwerkrichtlinie fehlgeschlagen wegen %s", + "ORG_ZSTACK_CAS_10001": "Nicht unterstützter CAS-Treiber: %s", + "ORG_ZSTACK_CONTAINER_10022": "Cluster-ID ist null beim Erstellen der Netzwerkrichtlinie", + "ORG_ZSTACK_CAS_10003": "Dieser Datentyp [%s] ist in CAS nicht definiert.", + "ORG_ZSTACK_CONTAINER_10024": "Fehler beim Erstellen der Netzwerkrichtlinie aufgrund von %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10009": "Kein Export-Task mit ID %s in der Build-Export-Historie gefunden. Bitte überprüfen Sie die Export-Task-ID und versuchen Sie es erneut.", + "ORG_ZSTACK_CONTAINER_10023": "ApiClient kann nicht mit Cluster-ID abgerufen werden: %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10008": "buildAppUuid und buildSystemUuid dürfen nicht beide null sein. Bitte stellen Sie sicher, dass entweder buildAppUuid oder buildSystemUuid angegeben wird.", + "ORG_ZSTACK_CONTAINER_10015": "Fehler beim Löschen der Bereitstellung aufgrund von %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10079": "Cluster [uuid:%s] Hypervisor-Typ ist nicht gültig", + "ORG_ZSTACK_CONTAINER_10017": "Pod [name=%s, namespace=%s] kann nicht gefunden werden", + "ORG_ZSTACK_CONTAINER_10016": "Fehler beim Beenden der Bereitstellung aufgrund eines nicht spezifizierten Fehlers: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10075": "Abrufen der Gateway-IP-Adressen des Zugriffspfads [iscsiPath: %s] für Block-Volume %s aufgrund von %s fehlgeschlagen", + "ORG_ZSTACK_CONTAINER_10018": "Fehler beim Hinzufügen einer Bezeichnung zum Pod aufgrund von %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10076": "Volume [uuid:%s] konnte nicht von der Bare-Metal-Instanz [uuid:%s] über Gateway [uuid:%s] getrennt werden, weil %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10028": "Hinzufügen der DNS-Konfiguration zum Layer-3-Netzwerk [name:%s] auf dem TensorFlow-Controller fehlgeschlagen aufgrund von:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10077": "Volume [uuid:%s] für Bare-Metal-Instanz [uuid:%s] in Gateway [uuid:%s] konnte nicht zerstört werden, weil %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10078": "Alle Ceph MONs des Primärspeichers [uuid:%s] befinden sich nicht in einem gesunden Zustand", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10072": "Bare-Metal-2-Instanz [uuid:%s] ist nicht verbunden; daher kann kein Volume angehängt werden.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10073": "Abrufen der Volume-LUN-ID auf dem externen Primärspeicher %s fehlgeschlagen. Bitte stellen Sie sicher, dass das Speichersystem korrekt konfiguriert und zugänglich ist.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10025": "Löschen der Host-Route aus dem virtuellen Netzwerk [name:%s] auf dem Traffic-Manager-Controller fehlgeschlagen aufgrund von:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10074": "Abrufen der Volume-LUN-ID [uuid:%s] für Bare-Metal-Instanz [uuid:%s] in Gateway [uuid:%s] aufgrund von %s fehlgeschlagen", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10022": "Hinzufügen des Host-Routers zum Layer-3-Netzwerk [name:%s] auf dem TF-Controller fehlgeschlagen aufgrund von:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10070": "Volume mit UUID: %s konnte nicht an die Bare-Metal-Instanz mit UUID: %s über Gateway mit UUID: %s angehängt werden aufgrund von %s", + "ORG_ZSTACK_FLOWMETER_10021": "%s muss ein numerischer Wert sein", + "ORG_ZSTACK_LOG4J2_10001": "Unbekannter log4j2-Appender-Typ %s", + "ORG_ZSTACK_LOG4J2_10000": "Kein Factory für Log4j2-Appender-Typ gefunden: %s.", + "ORG_ZSTACK_CONTAINER_10011": "Kein Host für UUID [%s] gefunden", + "ORG_ZSTACK_CONTAINER_10013": "Container Management Endpoint [uuid:%s] kann nicht gefunden werden", + "ORG_ZSTACK_CONTAINER_10012": "Kein Anbieter für Hersteller [%s] gefunden", + "ORG_ZSTACK_CONTAINER_10004": "Host [%s] ist nicht mit Endpoint [%s] verknüpft", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10068": "Volume [uuid:%s] konnte nicht für Bare-Metal-Instanz [uuid:%s] über Gateway [uuid:%s] bereitgestellt werden, weil %s", + "ORG_ZSTACK_CONTAINER_10005": "Kein Cluster für Endpunkt[%s] gefunden", + "ORG_ZSTACK_CONTAINER_10008": "Fehler beim Auflisten von Instanzen für Cluster[%s]: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10064": "Fehler beim Anhängen der NIC mit UUID:%s an die Baremetal2-Instanz mit UUID:%s über Gateway mit UUID:%s wegen %s", + "ORG_ZSTACK_CONTAINER_10007": "Zone[%s] stimmt nicht mit dem Endpunkt[%s] überein", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10065": "baremetal2-Instanz[uuid:%s] ist nicht verbunden; daher kann sie nicht von ihrer Netzwerkschnittstelle getrennt werden.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10066": "Fehler beim Trennen der Netzwerkschnittstelle [uuid:%s] von der Bare-Metal-Instanz [uuid:%s] über Gateway [uuid:%s], weil %s", + "ORG_ZSTACK_CONTAINER_10009": "Cluster[%s] existiert bereits im Endpunkt[%s] mit einer anderen Verfügbarkeitszone[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10060": "Stellen Sie sicher, dass alle BareMetal2-Gateways im Bereitstellungsnetzwerk [uuid:%s] verbunden sind.", + "ORG_ZSTACK_CONFIGURATION_10011": "Nicht unterstützte Strategie für die Zuweisung von primärem Speicher[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10061": "Die Liste der VM-Instanz-UUIDs ist leer. Bitte geben Sie mindestens eine gültige UUID an.", + "ORG_ZSTACK_CONFIGURATION_10010": "Nicht unterstützte Strategie für die Zuweisung von Hosts[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10062": "Das baremetal2-Gateway [UUID: %s, Status: %s] ist nicht verbunden", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10063": "baremetal2-Instanz[uuid:%s] ist nicht verbunden; daher kann keine NIC an sie angeschlossen werden.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10031": "Löschen der DNS-Konfiguration aus dem Layer-3-Netzwerk [Name:%s] auf dem tf-Controller fehlgeschlagen wegen: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10119": "Installationspfad und Bootstrap-URL sind beide erforderlich.", + "ORG_ZSTACK_STORAGE_BACKUP_10118": "Überschreiben einer Datenbank aus einem Backup in der Cloud-Umgebung ist nicht zulässig.", + "ORG_ZSTACK_STORAGE_BACKUP_10117": "Datenbank-Backup[uuid:%s] wurde in den Backup-Speicher[uuid:%s] exportiert", + "ORG_ZSTACK_STORAGE_BACKUP_10116": "Datenbank-Backup [UUID %s] wurde nicht aus dem Backup-Speicher [UUID: %s] exportiert", + "ORG_ZSTACK_STORAGE_BACKUP_10115": "Aktueller Backup-Speicherstatus[%s] erlaubt das Fortsetzen des Vorgangs[%s] nicht, gültige Status sind %s", + "ORG_ZSTACK_STORAGE_BACKUP_10114": "SSH-Verbindung zum Peer-Knoten kann nicht mit SSH-Schlüssel hergestellt werden. Bitte überprüfen Sie die Netzwerkverbindung und SSH-Schlüsselkonfiguration.", + "ORG_ZSTACK_STORAGE_BACKUP_10113": "Bandbreite muss ein positiver Wert sein", + "ORG_ZSTACK_STORAGE_BACKUP_10112": "Job-Parameter fehlt der Wert für die Remote-Aufbewahrung: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10039": "VM[uuid:%s] sind nicht gestoppt und laufen nicht auf dem spezifischen Host.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10007": "Die integrierte Sicherheitsadministrator-Rolle kann nicht durch die integrierte Sicherheitsadministrator-Rolle entfernt werden.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10038": "Volume[uuid:%s] ist an eine oder mehrere VM(s)[uuid:%s] angehängt, die sich nicht in einem gestoppten Zustand befinden und nicht auf dem spezifischen Host laufen.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10008": "Systemadministrator-Rolle kann nicht von der Systemadministrator-Benutzergruppe widerrufen werden", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10009": "Integrierter Audit-Administrator kann nicht gelöscht werden. Bitte stellen Sie sicher, dass Sie nicht versuchen, eine vom System bereitgestellte Rolle zu ändern.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10003": "Der Name des Erstbenutzers für diese Ressource kann nicht aktualisiert werden.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10034": "Replikation von Volume %s auf Host %s kann nicht gefunden werden", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10004": "%s ist ein reserviertes Schlüsselwort in Cloud-Computing-Virtualisierungsumgebungen, bitte wählen Sie einen anderen Namen.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10037": "Die UUID des Primärspeichers darf nicht null sein. Bitte stellen Sie sicher, dass eine gültige UUID für den Primärspeicher angegeben wird.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10036": "Ungültige Ressourcen-ID %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10006": "Die Rolle des Prüfungsadministrators kann dem integrierten Administratorbenutzer nicht entzogen werden", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10042": "Der Mini-Speicher [UUID: %s] muss leer sein, bevor Bits aus ZBox wiederhergestellt werden. Bitte bereinigen Sie ihn.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10001": "Keine Fabrik für FluentBit-Ausgabetyp gefunden: %s.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10010": "Der integrierte Sicherheitsadministrator kann nicht gelöscht werden. Bitte stellen Sie sicher, dass Sie nicht versuchen, eine vom System bereitgestellte Rolle zu ändern.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10041": "Kein LocalStorageBackupStorageMediator, der Hypervisor[%s] und Backup-Speichertyp[%s] unterstützt", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10011": "Berechtigungen können dem integrierten Systemadministrator nicht entzogen werden.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10003": "Der Hostname oder die ID darf nicht null sein. Bitte geben Sie einen gültigen Hostnamen oder eine gültige ID an.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10012": "Bestätigen Sie, dass die Rollen, die Sie hinzufügen möchten, dieselbe Identität haben und in Ihrer Virtualisierungsumgebung kompatibel sind.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10002": "Unbekannter FluentBit-Ausgabe-Plugin-Typ %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10013": "Rolle kann nicht hinzugefügt werden: %s zu Identität: %s für virtuelle ID[uuid:%s]", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10005": "Die Portnummer darf nicht null sein", + "ORG_ZSTACK_APPCENTER_UTILS_10000": "Rohvorlagen-JSON-Datei kann nicht gefunden werden unter: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10004": "Protokollspeicherserver [Adresse: %s] ist nicht verfügbar", + "ORG_ZSTACK_APPCENTER_UTILS_10001": "JSON-Vorlage für Cloud-Ressourcenkonfiguration kann nicht generiert werden", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10040": "%s fehlgeschlagen, da Host(s)[uuid:%s] nicht aktiviert sind und sich nicht im verbundenen Status befinden.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10007": "Die neue Konfiguration enthält Fehler, die zu Service-Ausnahmen führen. Bitte überprüfen Sie die Konfigurationsparameter erneut. Details: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10006": "Die Erstellung des Protokollservers fehlgeschlagen. Möglicherweise haben falsche neu übergebene Konfigurationsparameter dazu geführt, dass der Fluent Bit-Dienst in einen inaktiven Status übergegangen ist. Bitte überprüfen Sie die Konfiguration auf Richtigkeit.", + "ORG_ZSTACK_STORAGE_BACKUP_10111": "Fehlender Remote-Aufbewahrungstyp in Job-Parametern", + "ORG_ZSTACK_STORAGE_BACKUP_10110": "Fehlender 'retentionValue' in Job-Parameterkonfiguration", + "ORG_ZSTACK_STORAGE_BACKUP_10129": "Keine Instanz mit Volume-UUID gefunden: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10124": "Keine VM gefunden für Volume[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10123": "Vorgang wird für eine gemeinsame Volume-Anlage nicht unterstützt", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10028": "Kein Backup-Speicher kann Image[uuid:%s] für Volume[uuid:%s] abrufen", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10005": "JoinType kann im importierten Paket oder der Klasse nicht gefunden werden. Bitte stellen Sie sicher, dass Sie das richtige Paket importiert haben und die Klasse den definierten JoinType enthält.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10029": "Image[uuid: %s] hat keinen Verweis auf einen Backup-Speicher[uuid: %s]", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10000": "Ausgabe von [CloudFunction] ist leer", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10001": "Aktion[%s] fehlgeschlagen, Ursache: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10023": "Vorgang auf Hosts[%s] erwartet, aber nur Hosts %s sind verfügbar und aktiviert", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10002": "Aktion: %s wird für die IAM-Rolle nicht unterstützt: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10120": "databaseBackup[uuid:%s] ist nicht aktiviert und verfügbar", + "ORG_ZSTACK_STORAGE_SNAPSHOT_REFERENCE_10000": "Ein Volume mit UUID %s wird von anderen Volumes [%s] referenziert. Bitte vereinheitlichen Sie diese Volumes und ihre Abhängigkeiten, bevor Sie den Installationspfad ändern.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10017": "Der erforderliche Cluster %s ist für die Volume-Erstellung %s nicht an den primären Speicher %s angebunden", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10016": "Der Replikationsnetzwerkstatus des Volumes [uuid:%s] hat den StandAlone-Modus aktiviert, während alle Hosts einen verbundenen Status haben; bitte stellen Sie ihn zuerst wieder her.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10018": "Es kann kein verfügbarer Host im erforderlichen Cluster %s für die Volume-Erstellung gefunden werden", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10013": "host[uuid:%s] des mini primary storage[uuid:%s] hat nicht genügend Kapazität [aktuell: %s bytes, benötigt: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10017": "baremetal2 gateway mit UUID: %s befindet sich nicht in derselben Zone wie der Cluster mit UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10012": "Es kann nicht genügend Speicherplatz für den primary storage [UUID: %s] auf dem Host [UUID: %s] zugewiesen werden, unzureichende physische Kapazität", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10018": "Der Cluster eines Baremetal2 gateway [uuid:%s] kann nicht geändert werden, während aktive Instanzen davon abhängen", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10015": "volume[uuid:%s] Replikation synchronisiert Daten, bitte warten Sie bis die Synchronisation abgeschlossen ist.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10019": "cluster[%s] ist nicht vom Typ baremetal", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10014": "Es kann kein verfügbarer Host zum Ändern der Volume-Größe [uuid: %s] auf dem mini storage system [uuid: %s] gefunden werden", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10013": "cluster[uuid:%s] ist nicht verfügbar", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10014": "cluster[uuid:%s] ist kein bare metal Virtualisierungs-Cluster", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10022": "Synchronisationsport für Speicher kann auf Host %s nicht zugewiesen werden: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10015": "gateway[uuid:%s] ist nicht verfügbar", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10021": "Es kann kein verfügbarer Host für den Befehl auf primary storage[uuid: %s] gefunden werden", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10016": "baremetal2 gateway mit UUID: %s ist bereits Teil des Clusters mit UUID: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10010": "baremetal2 gateway[uuid:%s] kann nur an einen Compute-Cluster angebunden werden", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10011": "baremetal2 gateway [UUID: %s] ist nicht an den Cluster [UUID: %s] angebunden, Trennung ist nicht erforderlich.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10012": "baremetal2 gateway mit UUID:%s ist derzeit nur an einen Cluster angebunden; trennen Sie es nicht.", + "ORG_ZSTACK_STORAGE_BACKUP_10108": "'retentionPolicyType' und 'retentionPeriod' fehlen in den Job-Parametern", + "ORG_ZSTACK_STORAGE_BACKUP_10107": "Unerwartete backup storage UUID: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10106": "Der Job-Parameter 'backupStorageUuids' ist leer. Bitte stellen Sie sicher, dass gültige backup storage UUIDs für den Vorgang bereitgestellt werden.", + "ORG_ZSTACK_STORAGE_BACKUP_10105": "'backupStorageUuids' fehlen in den Job-Parametern, bitte stellen Sie sicher, dass alle erforderlichen backup storage UUIDs angegeben sind", + "ORG_ZSTACK_STORAGE_BACKUP_10104": "Erforderliche Job-Parameter fehlen: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10103": "Unerwarteter Task-Status: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10102": "Synchronisierungs-Task fehlgeschlagen wegen fehlender Quelldatei. Bitte stellen Sie sicher, dass alle erforderlichen Dateien hochgeladen wurden, und versuchen Sie es erneut.", + "ORG_ZSTACK_STORAGE_BACKUP_10101": "database backup[uuid:%s] nicht im storage repository[uuid:%s] gefunden", + "ORG_ZSTACK_LOGIN_PLUGIN_10002": "Es fehlt LoginUserInfo bei der Verwendung der Plugin-Anmeldefunktion", + "ORG_ZSTACK_LOGIN_PLUGIN_10001": "Kein Anmeldeplugin mit dem Namen %s gefunden", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10005": "Der Mini-Speicher [UUID: %s, name: %s] kann keinen verfügbaren Host in den angehängten Clustern zum Instanziieren des Volumes finden", + "ORG_ZSTACK_LOGIN_PLUGIN_10000": "loginPluginName fehlt. Bitte geben Sie einen gültigen Plugin-Namen für die Anmeldeauthentifizierung an.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10007": "Kann nicht bestimmen, welche Compute-Instanz der Anfrage zugewiesen werden soll. Bitte stellen Sie sicher, dass Ihre Instanzen ordnungsgemäß in der Cloud-Umgebung registriert und getaggt sind. Wenn das Problem weiterhin besteht, wenden Sie sich für weitere Unterstützung an den Support.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10002": "Der Host [uuid:%s] ist nicht mit der Cloud-Umgebung verbunden", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10014": "Administrative Berechtigung kann nicht zum Projekt hinzugefügt werden", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10006": "Ein BareMetal2-Knoten mit Management-IP %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10001": "Es ist noch ein gecachstes Volume auf der Instanz [UUID:%s] vorhanden; Cache-Volume-URL kann nicht aktualisiert werden", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10015": "Der Vorgang ist durch die Whitelist für virtuelle Maschinen-IDs nicht zulässig [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10007": "Ein Host mit der Management-IP %s hat ein Problem erfahren.", + "ORG_ZSTACK_KVM_10110": "Der Host [IP:%s] wurde übernommen, weil sein eindeutiger Bezeichner [HostUuid:%s] in der Datenbank vorhanden ist.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10004": "ResourceType [%s] von APIRecoverResourceSplitBrainMsg ist für die Cloud-Ressourcenwiederherstellung ungültig.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10016": "Der Vorgang wird durch die Blacklist für virtuelle Maschinen verweigert [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10008": "BareMetal2-Gateway [uuid:%s] kann nicht an ein Non-BareMetal2-Cluster [uuid:%s] angehängt werden", + "ORG_ZSTACK_KVM_10111": "Host-CPU-Architektur kann nicht bestimmt werden; bitte überprüfen Sie Benutzername und Passwort; %s", + "ORG_ZSTACK_STORAGE_BACKUP_10109": "'retentionType' fehlt in der Job-Parameterkonfiguration", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10009": "BareMetal2-Gateway mit UUID: %s ist bereits an Cluster mit UUID: %s angehängt", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10002": "Es ist bereits ein BareMetal-PXE-Server mit der Management-IP %s vorhanden; bitte verwenden Sie ihn nicht, um ein BareMetal2-Gateway zu erstellen.", + "ORG_ZSTACK_KVM_10103": "Verbindung zu KVM [ip:%s, username:%s, sshPort: %d] für DNS-Validierung nicht möglich; bitte überprüfen Sie die Korrektheit von Benutzername und Passwort.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10004": "Management-IP [%s] ist keine gültige IPv4-Adresse oderHostname", + "ORG_ZSTACK_KVM_10104": "Ping auf alle DNS/IP-Adressen in %s fehlgeschlagen; bitte überprüfen Sie die Netzwerkverbindung und DNS-Einstellungen in /etc/resolv.conf, um sicherzustellen, dass Ihre Instanz auf das öffentliche Internet zugreifen kann.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10010": "Keine verbundene virtuelle Maschine gefunden, Mini-Speicher-Betrieb fehlgeschlagen", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10005": "BareMetal2-Gateway kann nicht in Non-BareMetal2-Cluster [uuid:%s] hinzugefügt werden", + "ORG_ZSTACK_KVM_10105": "Verbindung zu KVM [ip:%s, username:%s, SSH port:%d] zur Überprüfung der Erreichbarkeit des Management-Knotens nicht möglich; bitte überprüfen Sie, ob die Anmeldeinformationen korrekt sind; %s", + "ORG_ZSTACK_VPC_HA_VPCHAGC_10000": "VR [uuid: %s] Instanz wird nicht ausgeführt", + "ORG_ZSTACK_KVM_10106": "Der KVM-Host [ip:%s] kann die Callback-URL des Management-Knotens nicht erreichen. Es scheint, dass der KVM-Host die Management-IP [%s] nicht erreichen kann. %s %s", + "ORG_ZSTACK_VPC_HA_VPCHAGC_10001": "VR [uuid: %s] Instanz nicht verbunden", + "ORG_ZSTACK_KVM_10107": "Überprüfung, ob der Host übernommen wird, nicht möglich, weil %s", + "ORG_ZSTACK_KVM_10108": "Zeitstempel der Markierung kann nicht abgerufen werden, weil %s", + "ORG_ZSTACK_KVM_10109": "Der Host [IP:%s] wurde übernommen, da die Übernahmen-Flagge [HostUuid:%s] bereits existiert und die Aktualisierungszeit [utime %d] das Host-Ping-Intervall [ping interval %d] nicht überschritten hat.", + "ORG_ZSTACK_STORAGE_BACKUP_10100": "Eines der Backup-Speicher [UUIDs: %s, %s] befindet sich im Status %s und kann daher keine Synchronisierungsoperation durchführen.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10009": "Instance Offering [UUID:%s] ist deaktiviert; VM kann nicht daraus erstellt werden", + "ORG_ZSTACK_AUTOSCALING_GROUP_10008": "Eine Ressource kann nicht gefunden werden: InstanceOfferingVO mit UUID [%s] ist nicht verfügbar.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10007": "Eine Ressource kann nicht gefunden werden: AutoScalingVmTemplateVO mit UUID [%s] ist nicht verfügbar.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10006": "autoScalingGroup[%s] konnte die neu erstellte VM nicht vollständig zur Sicherheitsgruppe hinzufügen, Fehler sind %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10005": "VM NIC zur Sicherheitsgruppe hinzufügen fehlgeschlagen, keine Sicherheitsgruppe mit UUID=%s gefunden.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10004": "autoScalingGroup[%s] konnte die neu erstellte VM nicht vollständig zum Load Balancer hinzufügen, Fehler sind %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10003": "VM NIC zum Load Balancer hinzufügen fehlgeschlagen, kein Load Balancer mit UUIDs=%s gefunden.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10002": "autoScalingGroup[%s] VM-Erstellung vollständig fehlgeschlagen, Fehler sind %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10000": "Nur eine Scaling-Aktivität kann gleichzeitig innerhalb derselben Scaling-Gruppe ausgeführt werden.", + "ORG_ZSTACK_KVM_10120": "host[uuid:%s] Konfiguration geändert, alt: %s, neu: %s", + "ORG_ZSTACK_KVM_10121": "host[uuid:%s] wechselt in ausgeschalteten Zustand, Benachrichtigung senden", + "ORG_ZSTACK_KVM_10112": "Host CPU-Architektur stimmt nicht mit der Cluster-Konfiguration überein", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10000": "Ungültiger Pfad-String %s in der Cloud-Speicher-Konfiguration", + "ORG_ZSTACK_KVM_10115": "host [uuid:%s] kann nicht zum Cluster [uuid:%s] hinzugefügt werden aufgrund einer nicht übereinstimmenden QEMU/Libvirt-Version", + "ORG_ZSTACK_KVM_10117": "host [uuid:%s] kann nicht zum Cluster [uuid:%s] hinzugefügt werden aufgrund nicht übereinstimmender CPU-Architektur-Spezifikationen", + "ORG_ZSTACK_KVM_10119": "Weder VTx noch VTd in /proc/cpuinfo erkannt. Bitte stellen Sie sicher, dass die Hardware-Virtualisierung in Ihren BIOS-Einstellungen aktiviert ist.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10019": "Eine Ressource kann nicht gefunden werden: L3 Netzwerk (UUID: %s) nicht gefunden", + "ORG_ZSTACK_AUTOSCALING_GROUP_10018": "Disk Offerings mit UUIDs:%s sind deaktiviert; daher ist die VM-Erstellung aus diesen Offerings nicht möglich.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10017": "Eine Ressource kann nicht gefunden werden: Disk Offering mit UUID [%s] nicht gefunden", + "ORG_ZSTACK_AUTOSCALING_GROUP_10016": "system-image[uuid:%s] kann nicht zur Erstellung einer Benutzer-VM verwendet werden", + "ORG_ZSTACK_AUTOSCALING_GROUP_10015": "rootDiskOfferingUuid darf nicht null sein, wenn der Medientyp des Images ISO ist", + "ORG_ZSTACK_AUTOSCALING_GROUP_10014": "image[uuid:%s] hat den Medientyp: %s, nur RootVolumeTemplate und ISO können zur VM-Erstellung verwendet werden", + "ORG_ZSTACK_AUTOSCALING_GROUP_10013": "image[uuid:%s] ist derzeit nicht verfügbar, bitte stellen Sie sicher, dass es bereit ist, bevor Sie eine VM daraus erstellen.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10012": "image[uuid:%s] ist Deaktiviert. VM-Erstellung aus diesem Image ist nicht erlaubt.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10011": "Eine Ressource kann nicht gefunden werden: Image mit UUID [%s] nicht gefunden", + "ORG_ZSTACK_AUTOSCALING_GROUP_10010": "instance offering [UUID: %s, type: %s] ist nicht vom Typ Benutzer-VM; daher kann keine VM daraus erstellt werden.", + "ORG_ZSTACK_KVM_10130": "Volume an Instance anhängen fehlgeschlagen wegen:%s", + "ORG_ZSTACK_KVM_10131": "Volume von Instance trennen fehlgeschlagen, weil:%s", + "ORG_ZSTACK_KVM_10132": "vm[%s] konnte die Festplattenbereinigung nicht durchführen, wegen:%s", + "ORG_ZSTACK_KVM_10123": "host[%s] wurde nicht innerhalb von %d Sekunden heruntergefahren", + "ORG_ZSTACK_KVM_10125": "Überprüfung der Datei %s auf host[UUID:%s] fehlgeschlagen", + "ORG_ZSTACK_KVM_10126": "Der Host befindet sich im Zustand vor der Wartung und kann derzeit nicht aktualisiert werden. Bitte führen Sie die Wartungsarbeiten abgeschlossen oder wenden Sie sich an den Support.", + "ORG_ZSTACK_KVM_10127": "Der Host befindet sich nicht in einem verbundenen Zustand; daher können keine OS-Aktualisierungsvorgänge durchgeführt werden. Bitte stellen Sie sicher, dass der Host verbunden ist, bevor Sie versuchen, das OS zu aktualisieren.", + "ORG_ZSTACK_COMPUTE_BONDING_10022": "Entweder slave UUIDs oder slave Namen erforderlich", + "ORG_ZSTACK_COMPUTE_BONDING_10021": "Es gibt keine Schnittstelle auf dem Host mit UUID: %s", + "ORG_ZSTACK_VMWARE_10069": "Instanz-ID [%s] nicht gefunden", + "ORG_ZSTACK_COMPUTE_BONDING_10020": "Schnittstelle %s existiert nicht auf den Hosts", + "ORG_ZSTACK_VMWARE_10067": "vm [%%s] nicht gefunden", + "ORG_ZSTACK_COMPUTE_BONDING_10026": "Löschen der Bonding-Schnittstelle, die mit dem Verwaltungsnetzwerk verbunden ist, nicht möglich. Bitte stellen Sie sicher, dass das Verwaltungsnetzwerk nicht in Verwendung ist, bevor Sie fortfahren.", + "ORG_ZSTACK_VMWARE_10064": "VM-Instanz nicht gefunden: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10029": "Überspringen der Auto-Scaling-Gruppenaktivitätsanpassung erforderlich", + "ORG_ZSTACK_COMPUTE_BONDING_10025": "ungültiger bonding-Modus[%s]", + "ORG_ZSTACK_VMWARE_10065": "Herunterfahren der virtuellen Maschine fehlgeschlagen: %s, %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10028": "Abrufen der gelöschten Instanzliste vom Cloud-Computing-Dienst nicht möglich", + "ORG_ZSTACK_VMWARE_10062": "Fortsetzen der VM fehlgeschlagen, Aufgabenstatus: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10027": "Die Anzahl der gestarteten Instanzen überschreitet das zulässige Limit.%s", + "ORG_ZSTACK_COMPUTE_BONDING_10023": "Hinzufügen von SR-IOV-Schnittstelle [%s] zu Bonding nicht möglich, da mehr als ein SR-IOV-Gerät ausgewählt ist", + "ORG_ZSTACK_VMWARE_10063": "Fortsetzen der virtuellen Maschine [%s] fehlgeschlagen: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10026": "autoScalingGroup[%s] konnte VMs[%s] nicht vollständig beenden, Fehler sind %s", + "ORG_ZSTACK_VMWARE_10060": "Anhalten der VM [%s] fehlgeschlagen: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10025": "Die autoScalingGroup[%s] ist an keine VM-Vorlage angehängt", + "ORG_ZSTACK_COMPUTE_BONDING_10029": "Neue Schnittstellen können nicht zu bond[%s] hinzugefügt werden, da bereits eine SR-IOV-fähige Schnittstelle vorhanden ist", + "ORG_ZSTACK_AUTOSCALING_GROUP_10024": "Die Auto-Scaling-Gruppe[%s] befindet sich in einem unerwarteten Zustand, erwartet: %s-Zustand", + "ORG_ZSTACK_COMPUTE_BONDING_10028": "Schnittstellen können nicht wiederholt an ein bond[%s] angehängt werden.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10023": "defaultL3NetworkUuid[uuid:%s] existiert nicht in l3NetworkUuids %s", + "ORG_ZSTACK_SNS_PLATFORM_DINGTALK_10000": "Senden von Nachrichten an DingTalk fehlgeschlagen. Status: %s, Body: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10022": "Es ist mehr als ein Layer-3-Netzwerk in l3NetworkUuids angegeben, aber defaultL3NetworkUuid ist null", + "ORG_ZSTACK_KVM_10140": "Erstellen von Bridge[%s] für l2Network[uuid:%s, type:%s, vlan:%s] auf KVM-Host[uuid:%s] fehlgeschlagen, weil %s", + "ORG_ZSTACK_COMPUTE_BONDING_10027": "Bonding-Schnittstelle mit konfigurierter VTEP-IP kann nicht gelöscht werden. Bitte stellen Sie sicher, dass alle zugeordneten virtuellen Netzwerke zuerst getrennt werden.", + "ORG_ZSTACK_KVM_10141": "Überprüfung der Bridge [%s] für l2VlanNetwork [uuid:%s, name:%s] auf KVM-Host [uuid:%s] fehlgeschlagen, %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10021": "l3Network [uuid:%s] ist ein Systemnetzwerk und kann nicht zum Erstellen von Benutzer-VMs verwendet werden.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10020": "l3Network mit UUID:%s ist deaktiviert; daher ist die VM-Erstellung in diesem Netzwerk nicht erlaubt.", + "ORG_ZSTACK_KVM_10143": "Löschen der Bridge [%s] für l2Network [uuid:%s, type:%s, vlan:%s] auf KVM-Host [uuid:%s] fehlgeschlagen, weil %s", + "ORG_ZSTACK_KVM_10144": "VM-Start fehlgeschlagen, da die Hypervisor-Funktion nicht deaktiviert werden kann, wenn der CPU-Modus auf „none“ gesetzt ist. Bitte überprüfen Sie Ihre CPU-Konfigurationseinstellungen.", + "ORG_ZSTACK_KVM_10134": "Der XML-Hook [%s] ist VM %s zugeordnet, also heben Sie bitte die Zuordnung auf, bevor Sie ihn löschen.", + "ORG_ZSTACK_KVM_10136": "Systemtyp-XML-Hooks sind in Cloud-Computing-Umgebungen nicht erlaubt. Bitte stellen Sie sicher, dass alle Systemkonfigurationen die Virtualisierungsstandards einhalten.", + "ORG_ZSTACK_KVM_10137": "Der XML-Hook-Name [%s] existiert bereits in der VM-Konfiguration.", + "ORG_ZSTACK_KVM_10138": "Es gibt einen KVM-Host mit der Management-IP [%s]", + "ORG_ZSTACK_KVM_10139": "VLAN-Gerät kann auf %s nicht erstellt werden, weil der Name zu lang ist.", + "ORG_ZSTACK_VMWARE_10059": "VM-Suspendierung fehlgeschlagen, Aufgabenstatus: %s", + "ORG_ZSTACK_COMPUTE_BONDING_10033": "L2-Netzwerk [uuid:%s] existiert nicht.", + "ORG_ZSTACK_BILLING_10008": "Das Startdatum muss vor dem Enddatum liegen.", + "ORG_ZSTACK_COMPUTE_BONDING_10032": "Schnittstellen können nicht wiederholt von einem Bond [%s] getrennt werden.", + "ORG_ZSTACK_COMPUTE_BONDING_10031": "Schnittstelle [%s] kann nicht von einem Bond [%s] getrennt werden, das sich in einem Bond-Zustand befindet.", + "ORG_ZSTACK_COMPUTE_BONDING_10030": "SR-IOV-Schnittstelle [%s] kann nicht zu Bonding hinzugefügt werden, da nur eine Schnittstelle in einem Bond SR-IOV aktivieren kann.", + "ORG_ZSTACK_BILLING_10005": "Die Abrechnung ist für diese Ressource deaktiviert. Bitte stellen Sie sicher, dass die Abrechnung aktiviert ist, um diesen Dienst zu nutzen.", + "ORG_ZSTACK_COMPUTE_BONDING_10037": "L2-Netzwerk kann nicht an Cluster [UUID:%s] angehängt werden. Die Schnittstelle [UUID:%s, name:%s] auf Host [UUID:%s] ist mit Diensttypen verknüpft, enthält aber nicht TenantNetwork als einen davon.", + "ORG_ZSTACK_BILLING_10004": "Nicht unterstützter Abrechnungsressourcentyp [%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10036": "L2-Netzwerk kann nicht an Cluster [UUID] angehängt werden. Bonding-Schnittstelle [UUID, name] auf Host [UUID] hat Bonding-Diensttypverknüpfungen, aber TenantNetwork-Diensttyp fehlt.", + "ORG_ZSTACK_BILLING_10003": "Bitte stellen Sie sicher, dass die richtige Preis konfiguration für den Benutzer festgelegt ist, zum Beispiel: `priceUserConfig:{\\nvolume:{\\npriceKeyName:\\\"priceKeyName\\\"}}`", + "ORG_ZSTACK_COMPUTE_BONDING_10035": "L2-Netzwerk kann nicht an Cluster [uuid:%s] angehängt werden: Physische Schnittstelle [%s] wird in einem Bond auf einem oder mehreren Hosts verwendet. Konflikthosts: [%s]", + "ORG_ZSTACK_VMWARE_10051": "vmUuid [%s] nicht im ESX-Host-System [%s] gefunden.", + "ORG_ZSTACK_BILLING_10002": "Bitte stellen Sie sicher, dass die richtige Preis konfiguration für den Benutzer festgelegt ist, zum Beispiel: `priceUserConfig:{rootVolume:{priceKeyName:\"priceKeyName\"}}`", + "ORG_ZSTACK_COMPUTE_BONDING_10034": "L2-Netzwerk [uuid:%s] hat eine leere physische Schnittstellendefinition.", + "ORG_ZSTACK_BILLING_10001": "dateInLong ist kleiner als %s Millisekunden.", + "ORG_ZSTACK_BILLING_10000": "priceKeyName ist null. Bitte stellen Sie sicher, dass der Schlüsselname für die Preisgestaltung korrekt konfiguriert ist.", + "ORG_ZSTACK_VMWARE_10050": "Synchronisierung mit vCenter [uuid:%s], bitte versuchen Sie es später erneut.", + "ORG_ZSTACK_KVM_10150": "vmUuid kann nicht aus der Nachricht %s abgerufen werden.", + "ORG_ZSTACK_KVM_10151": "nicht in der Lage, virtuelle Maschine auf Host[uuid:%s, ip:%s] zu synchronisieren wegen %s", + "ORG_ZSTACK_COMPUTE_BONDING_10038": "Fehler beim Hinzufügen von Linux Bonding zu Host[uuid:%s]: %s", + "ORG_ZSTACK_KVM_10152": "Die VM[%s] befindet sich seit längerer Zeit im Heruntergefahren-Status; bitte überprüfen Sie ihren Status.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10032": "Nicht unterstützter Removal Policy Typ[%s]", + "ORG_ZSTACK_V2V_VMWARE_10015": "Keine verfügbare IP gefunden in CIDR %s auf Host %s; bitte verbinden Sie den Host erneut, um IPs zu aktualisieren.", + "ORG_ZSTACK_KVM_10154": "Fehler beim Aktualisieren von Bridge[%s] für l2Network[uuid:%s, name:%s] auf KVM-Host[uuid:%s], %s", + "ORG_ZSTACK_V2V_VMWARE_10016": "Es läuft bereits ein langwieriger Job[uuid:%s] zur Konvertierung von VM von %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10030": "deleteAutoScalingRule[%s] Trigger fehlgeschlagen, Fehler sind %s", + "ORG_ZSTACK_V2V_VMWARE_10017": "Fehler beim Aktualisieren der Konversions-Host-Abhängigkeit für virtuelle Maschine %s", + "ORG_ZSTACK_KVM_10146": "Fehler beim Anwenden von Security Group Regeln auf KVM-Host [uuid:%s], weil %s", + "ORG_ZSTACK_KVM_10147": "Fehler beim Überprüfen der Standardregeln der Security Group auf KVM-Host[uuid:%s], weil %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10101": "Konnte Redirect-Port oder Status-Code nicht zuweisen ohne HTTP Redirect URL anzugeben", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10009": "Fehler beim Erkennen von Heartbeat, Code: %s, Detail: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10104": "LoadBalancer Listener[%s] unterstützt das Ändern des Session Persistence Status nicht", + "ORG_ZSTACK_IAM2SCRIPT_10010": "Angegebener Script Executor wird in dieser Cloud-Computing-Umgebung nicht unterstützt. Bitte konsultieren Sie die Liste der unterstützten Executors für weitere Informationen.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10105": "Konnte HTTP Redirect zu HTTPS und Session Persistence gleichzeitig in einer Cloud-Umgebung nicht unterstützen", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10102": "Konnte andere Protokolle als HTTP nicht unterstützen bei der Angabe von HTTP zu HTTPS Redirect", + "ORG_ZSTACK_VMWARE_10048": "Der Host ist nicht mit der Cloud-Umgebung verbunden. Bitte stellen Sie sicher, dass der Host korrekt konfiguriert und autorisiert ist.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10108": "Listener[%s] ändert Session Persistence; es muss Load Balancing Algorithmus angegeben werden", + "ORG_ZSTACK_V2V_VMWARE_10007": "Fehler beim Parsen von URL %s", + "ORG_ZSTACK_COMPUTE_BONDING_10044": "Fehler beim Anhängen von NIC an Linux Bonding auf Host[uuid:%s]: %s", + "ORG_ZSTACK_VMWARE_10046": "Kann NIC nicht trennen, da Network Interface Card (NIC) für Hotplug-Operationen in vCenter nicht unterstützt wird.", + "ORG_ZSTACK_BILLING_10019": "GPU-Preis muss an GPU UUID %s gebunden sein", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10109": "Listener[%s] %s Load Balancing Algorithmus unterstützt das Ändern von Session Persistence nicht, außer durch explizites Zuweisen von iphash", + "ORG_ZSTACK_V2V_VMWARE_10008": "DataCenter-Name darf keine Sonderzeichen enthalten %s", + "ORG_ZSTACK_IAM2SCRIPT_10002": "Script-Inhalt ist leer. Bitte stellen Sie sicher, dass Ihr Java-Code-Snippet korrekt definiert und in der Quelldatei enthalten ist.", + "ORG_ZSTACK_BILLING_10018": "GPU-Preis muss an eine gültige GPU UUID gebunden sein. Bitte geben Sie eine nicht-leere UUID an.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10106": "Listener[%s] kann Session Persistence Rewrite nicht ändern, wenn HTTP-Modus auf http-tunnel gesetzt ist", + "ORG_ZSTACK_V2V_VMWARE_10009": "Ziel-VM-Name darf keine Sonderzeichen enthalten %s", + "ORG_ZSTACK_IAM2SCRIPT_10001": "Fehler beim Dekodieren von Script-Inhalt. Bitte stellen Sie sicher, dass die Quelldatei verfügbar und korrekt formatiert für Cloud-Computing-Umgebungen ist.", + "ORG_ZSTACK_COMPUTE_BONDING_10042": "Fehler beim Entfernen des Linux-Bonds vom Host[uuid:%s]: %s", + "ORG_ZSTACK_VMWARE_10044": "HOST-CPU und Gast-Betriebssystem sind nicht kompatibel. Bitte stellen Sie sicher, dass Ihre HOST-CPU die erforderlichen Virtualisierungstechnologien unterstützt oder aktualisieren Sie das Gast-Betriebssystem auf eine kompatible Version.", + "ORG_ZSTACK_BILLING_10017": "Der Preis muss im Bereich von 0 bis 999999999,99 liegen", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10107": "Listener[%s] ändert die Session-Persistenz auf IP-Hash; es muss ein Source-Balancer-Algorithmus angegeben werden", + "ORG_ZSTACK_VMWARE_10045": "Überprüfung der Kompatibilität mit virtueller Maschine %s auf Host %s fehlgeschlagen", + "ORG_ZSTACK_BILLING_10016": "Die minimale Ressourceneinheit für die Zuweisung ist ein Megabyte, nicht ein Byte.", + "ORG_ZSTACK_SDNCONTROLLER_10008": "SDN L2-Netzwerk[UUID:%s] ist nicht an einen Controller angebunden", + "ORG_ZSTACK_IAM2SCRIPT_10007": "Die IAM2-Skriptfunktion ist nicht aktiviert. Bitte stellen Sie sicher, dass der IAM2-Service in Ihrer Cloud-Umgebung aktiviert ist.", + "ORG_ZSTACK_BILLING_10015": "resourceName[%s] ist in Cloud-Computing-Kontexten ein ungültiger Bezeichner", + "ORG_ZSTACK_IAM2SCRIPT_10005": "Kann die Ausgabe der Skriptausführung nicht abrufen. Bitte überprüfen Sie die Cloud-Instanz und die Netzwerkeinstellungen.", + "ORG_ZSTACK_COMPUTE_BONDING_10046": "Fehler beim Trennen der NIC vom Linux-Bonding auf Host[uuid:%s]: %s", + "ORG_ZSTACK_VMWARE_10040": "Fehlende Zielhost-UUID. Bitte stellen Sie sicher, dass die UUID für den Zielhost korrekt angegeben ist.", + "ORG_ZSTACK_IAM2SCRIPT_10004": "IAM2-Skript ausführen fehlgeschlagen. Bitte überprüfen Sie, ob die erforderliche Cloud-Computing-Umgebung ordnungsgemäß eingerichtet ist.", + "ORG_ZSTACK_VMWARE_10041": "Der Zielhost unterstützt keine virtuelle Maschinenverwaltung. Bitte stellen Sie sicher, dass der Zielhost ein ESX- oder vSphere-Host ist.", + "ORG_ZSTACK_KVM_10161": "Unerwartete VNC-Portnummer[%d] für virtuelle Maschine[uuid:%s]", + "ORG_ZSTACK_IAM2SCRIPT_10009": "Die Anzahl der Parameter überschreitet das zulässige Limit.", + "ORG_ZSTACK_IAM2SCRIPT_10008": "Das Skript enthält keinen Code. Bitte stellen Sie sicher, dass Ihre Eingabe gültigen Java-Code enthält.", + "ORG_ZSTACK_SDNCONTROLLER_10000": "SDN L2-Netzwerk kann aufgrund fehlender SDN-Controller-UUID in systemTags der API-Anfrage nicht erstellt werden. Bitte stellen Sie sicher, dass die SDN-Controller-UUID korrekt angegeben ist.", + "ORG_ZSTACK_V2V_VMWARE_10003": "Der Clustername darf folgende Zeichen nicht enthalten: %s", + "ORG_ZSTACK_SDNCONTROLLER_10002": "SDN-Controller für Layer-2-Netzwerk[uuid:%s, vswitchTyp:%s] kann nicht gefunden werden", + "ORG_ZSTACK_SDNCONTROLLER_10001": "SDN L2-Netzwerk kann nicht erstellt werden, da die SDN-Controller-UUID in der API-Anfrage fehlt. Bitte stellen Sie sicher, dass die UUID enthalten ist.", + "ORG_ZSTACK_V2V_VMWARE_10006": "Fehler beim Stoppen der VM-Instanz %s vor der v2v-Migration", + "ORG_ZSTACK_KVM_10157": "reply[%s] ist kein KVMHostAsyncHttpCallResponse", + "ORG_ZSTACK_KVM_10158": "reply[%s] gibt leeren Antwortkörper zurück", + "ORG_ZSTACK_KVM_10159": "%s-Vorgang fehlgeschlagen: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10040": "EcsInstance muss sich beim Löschen einer EIP im Zustand \"running\" oder \"stopped\" befinden.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10111": "Listener[%s] unterstützt keine Änderung der Leerlaufzeit und des Cookie-Namen; Session-Persistenz muss angegeben werden.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10112": "Listener[%s] unterstützt keine Änderung der Leerlaufzeit, wenn Session-Persistenz deaktiviert ist", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10110": "Listener[%s] %s-Lastverteilungsalgorithmus unterstützt keine Änderung der Session-Persistenz außer durch explizites Deaktivieren.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10115": "Ungültige Session-Leerlaufzeit[%s], es muss eine positive Ganzzahl zwischen[%s~%s] sein", + "ORG_ZSTACK_COMPUTE_BONDING_10040": "Fehler beim Aktualisieren von Linux Bonding auf Host[uuid:%s]: %s", + "ORG_ZSTACK_VMWARE_10039": "Host-UUID in Metadatenanfrage fehlt", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10116": "Das HTTP-Health-Check-Protokoll muss für seinen Healthy-Checking-Parameter %s angegeben werden.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10113": "Listener[%s] unterstützt das Ändern des Cookie-Namens nicht, wenn die Session-Persistenz nicht auf \"rewrite\" gesetzt ist.", + "ORG_ZSTACK_VMWARE_10037": "Kein Distributed Virtual Switch oder qualifizierter Virtual Switch gefunden", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10114": "Listener[%s] unterstützt das Ändern der Session-basierten URL-Rewriting nicht ohne Änderung des Cookie-Namens", + "ORG_ZSTACK_VMWARE_10038": "Datastore %s nicht gefunden für vCenter %s", + "ORG_ZSTACK_BILLING_10009": "resourceType und resourceUUID dürfen nicht gleichzeitig leer sein", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10119": "Ungültiges Health-Check-Ziel[%s], das Format sollte checkProtocol:port sein, z.B. tcp:default", + "ORG_ZSTACK_SDNCONTROLLER_10015": "SDN-Controller konnte nicht hinzugefügt werden, weil der Typ: %s nicht in der unterstützten Liste enthalten ist: %s", + "ORG_ZSTACK_SDNCONTROLLER_10014": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, weil der Remote-Sicherheitsgruppen-Controller-UUID[:%s] nicht mit dem lokalen Sicherheitsgruppen-Controller-UUID[:%s] übereinstimmt", + "ORG_ZSTACK_VMWARE_10036": "Keine verfügbare Compute-Ressource für Cluster-Operationen.%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10117": "Der erwartete Statuscode [%s] des HTTP-Health-Check-Protokolls ist ungültig", + "ORG_ZSTACK_SDNCONTROLLER_10017": "SDN-Controller konnte nicht hinzugefügt werden, weil der Controller [IP:%s] bereits registriert ist", + "ORG_ZSTACK_VMWARE_10033": "SSL-Handshake mit vCenter [%s] fehlgeschlagen, weil unsicheres TLS 1.0 verwendet wird. Aktivieren Sie manuell TLS 1.0 in der JDK-Konfiguration, falls erforderlich.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10118": "Der Listener mit dem Protokoll [%s] unterstützt keine Auswahl einer Sicherheitsrichtlinie", + "ORG_ZSTACK_SDNCONTROLLER_10016": "SDN-Controller konnte nicht hinzugefügt werden, weil ip[%s] keine gültige Unicast-Adresse ist", + "ORG_ZSTACK_VMWARE_10034": "SSL-Handshake mit vCenter [%s] fehlgeschlagen, bitte überprüfen Sie die Portnummer [%d].", + "ORG_ZSTACK_BILLING_10027": "Abrechnung ist aktiviert. Dieser Vorgang ist nur zulässig, wenn die Abrechnung deaktiviert ist.", + "ORG_ZSTACK_SDNCONTROLLER_10019": "Host [UUID:%s] konnte nicht zum SDN-Controller [UUID:%s] hinzugefügt werden, weil keine Subnetzmaske angegeben ist", + "ORG_ZSTACK_VMWARE_10031": "Anmeldung bei vCenter Server [%s] mit Benutzeranmeldeinformationen fehlgeschlagen. Bitte überprüfen Sie Ihre Netzwerkverbindung und die angegebenen Anmeldeinformationen.", + "ORG_ZSTACK_BILLING_10026": "endDate darf nicht vor startDate liegen", + "ORG_ZSTACK_SDNCONTROLLER_10018": "Host[uuid:%s] konnte nicht zum SDN-Controller[uuid:%s] hinzugefügt werden, da er bereits an einen anderen SDN-Controller angeschlossen ist", + "ORG_ZSTACK_VMWARE_10032": "Parsen der Antwort von vCenter [%s] fehlgeschlagen, bitte überprüfen Sie die Portnummer [%d].", + "ORG_ZSTACK_BILLING_10025": "endDateInLong ist gesetzt, keine Änderung in Cloud-Umgebungen zulässig, um Datenkonsistenz und Compliance mit Virtualisierungsstandards sicherzustellen.", + "ORG_ZSTACK_BILLING_10024": "endDateInLong und setEndDateInLongBaseOnCurrentTime sollten nicht gleichzeitig konfiguriert werden. Bitte wählen Sie eines für Ihre Einstellungen.", + "ORG_ZSTACK_VMWARE_10030": "Verbindung zur Cloud-Ressource fehlgeschlagen: %s", + "ORG_ZSTACK_BILLING_10023": "endDateInLong darf keinen negativen Wert haben", + "ORG_ZSTACK_BILLING_10022": "accountUuid und tableUuid schließen sich gegenseitig aus; nur einer von ihnen kann gesetzt werden.", + "ORG_ZSTACK_BILLING_10021": "Diese priceTable[uuid=%s] darf in dieser Cloud-Umgebung nicht gelöscht werden.", + "ORG_ZSTACK_LOG_10004": "Zugriff verweigert: Konto[uuid:%s] ist nicht berechtigt, Management-Node-Logs abzurufen. Nur administrative Konten besitzen dieses Privileg.", + "ORG_ZSTACK_TAG_10008": "tag[%s] ist nur für administrative Verwendung", + "ORG_ZSTACK_LOG_10003": "Das Konto [UUID:%s] ist nicht berechtigt, Operationen auf dem Log-Server [UUID:%s] durchzuführen.", + "ORG_ZSTACK_SDNCONTROLLER_10029": "SDN-Controller konnte nicht geändert werden, da VLAN-Bereich[%s] mit einem anderen VLAN-Bereich überlappt", + "ORG_ZSTACK_LOG_10002": "Keine Factory für Typ:%s gefunden", + "ORG_ZSTACK_TAG_10006": "Kein übereinstimmendes System-Tag für %s gefunden", + "ORG_ZSTACK_SDNCONTROLLER_10020": "Host [UUID:%s] konnte nicht zum SDN-Controller [UUID:%s] hinzugefügt werden, da vTEP IP bereits vom Host [UUID:%s] verwendet wird", + "ORG_ZSTACK_SDNCONTROLLER_10022": "Host [uuid:%s] des SDN-Controllers [uuid:%s] konnte nicht aktualisiert werden, da der Host dem SDN-Controller noch nicht hinzugefügt wurde", + "ORG_ZSTACK_TAG_10000": "Doppeltes Tag[tag:%s, Type:%s, Resource_Type:%s, Resource_Uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10021": "Host [uuid:%s] konnte nicht vom SDN-Controller [uuid:%s] abgemeldet werden, da der Host nicht beim SDN-Controller registriert wurde", + "ORG_ZSTACK_SDNCONTROLLER_10024": "L3-Netzwerk kann nicht an VM angehängt werden, da einige Mandanten im SDN-Controller [uuid:%s] gelöscht wurden. Bitte führen Sie zunächst eine Mandantensynchronisation durch, um den Mandantenstatus zu aktualisieren.", + "ORG_ZSTACK_SDNCONTROLLER_10023": "Host[uuid:%s] des SDN-Controllers[uuid:%s] konnte nicht aktualisiert werden, da eine Netzmaske angegeben wurde", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10000": "Überprüfung der Batch-Datenintegrität fehlgeschlagen, nicht unterstützter Ressourcentyp: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10002": "Hinzufügen der Integritätsressource fehlgeschlagen, nicht unterstützter Ressourcentyp: %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10002": "Vorlagenfehler: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10134": "Backend-Server VMNic konnte nicht zur Servergruppe [UUID:%s] hinzugefügt werden, da VMNic-Gewichtung [%s] keine gültige Zahl ist", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10008": "Bild-Cache mit ID:%s konnte nicht abgerufen werden: GetImageHashValueReply.hashValue ist null", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10009": "Überprüfung der Bild-Cache[%s]-Konsistenz fehlgeschlagen aufgrund von Problemen mit der virtuellen Maschinenumgebung", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10000": "Keine verfügbare Vorlage dieses Typs: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10132": "Backend-Server VMNIC mit UUID:%s konnte nicht zur Servergruppe mit UUID:%s hinzugefügt werden, da die VMNIC nicht existiert", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10137": "Backend-Server NIC konnte nicht zur Servergruppe [uuid:%s] hinzugefügt werden, da NIC IP [ipAddress:%s] dupliziert ist", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10003": "Start-Datenschutz encryptType[%s] ist ungültig", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10138": "Netzwerkschnittstelle der virtuellen Maschine [uuid:%s] konnte nicht zur Servergruppe [uuid:%s] hinzugefügt werden, da Listener [uuid:%s] bereits die Netzwerkschnittstelle dieser Servergruppe angehängt hat", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10004": "Der Snapshot[uuid:%s] ist in der virtualisierten Umgebung nicht verschlüsselt", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10135": "L3-Netzwerke mit UUIDs:%s, die mit VM-Nics verbunden sind, haben keine Netzwerkdienste:%s aktiviert", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10005": "Überprüfung der Volumen-Snapshot[%s]-Konsistenz fehlgeschlagen aufgrund eines inkonsistenten Status", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10136": "Die VM-NICs [UUID: %s] sind bereits mit der Lastverteiler-Servergruppe [UUID: %s] verbunden.", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10006": "Verschlüsselungsfehler: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10139": "Backend-Server IP konnte nicht zur Servergruppe [UUID:%s] hinzugefügt werden, da die IP [IP Address:%s] bereits registriert ist", + "ORG_ZSTACK_VMWARE_10097": "VCENTER[%s] ist nicht in betriebsbereitem Status, aktueller Status: %s", + "ORG_ZSTACK_VMWARE_10098": "vdisk nicht gefunden: %s", + "ORG_ZSTACK_VMWARE_10095": "Abrufen der aktuellen Aufgabenliste fehlgeschlagen, Details: %s", + "ORG_ZSTACK_VMWARE_10096": "VCENTER_SERVER_NOT_FOUND", + "ORG_ZSTACK_VMWARE_10093": "vCenter-Backup-Speicher unterstützt die Berechnung von Image-Hashes nicht.", + "ORG_ZSTACK_VMWARE_10091": "Die Funktion für %s wird in Cloud-Umgebungen noch nicht unterstützt.", + "ORG_ZSTACK_TAG_10011": "tag[uuid:%s] ist ein inhärentes System-Tag und kann nicht entfernt werden.", + "ORG_ZSTACK_TAG_10012": "Das Argument 'resourceType' entspricht nicht der erwarteten UUID. Bitte stellen Sie sicher, dass der Ressourcentyp korrekt als UUID angegeben ist.", + "ORG_ZSTACK_VMWARE_10090": "Das Image %s wurde im Backing-Speicher nicht gefunden. Bitte stellen Sie sicher, dass der Image-Pfad korrekt ist, und versuchen Sie es erneut.", + "ORG_ZSTACK_TAG_10010": "Kein Ressourcentyp im Tag-System %s gefunden", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10010": "Verschlüsselungs-Image-Cache[id:%s] Fehler: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10011": "nodeType %s Integritätsdatei[path:%s] existiert bereits in der virtualisierten Umgebung", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10012": "Ungültiger node-Typ[%s]", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10013": "Hinzufügen der Integritätsdatei[%s.%s] fehlgeschlagen, es ist jetzt ein Verzeichnis.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10141": "Ungültiges Gewicht[serverIp:%s, weight:%s], Gewicht liegt nicht im gültigen Bereich [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10143": "Die Server-IPs [uuid:%s] sind bereits mit der Load-Balancer-Server-Gruppe [uuid:%s] verknüpft.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10148": "loadbalancerServerGroup [%s] existiert nicht", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10014": "Integritätsdatei[%s.%s] existiert nicht", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10149": "VMNic oder IP-Adresse ist null. Bitte überprüfen Sie Ihre Netzwerkkonfigurationseinstellungen.", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10015": "Host %s existiert nicht", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10146": "vmnics sind alle nicht mit der Server-Gruppe [%s] verknüpft", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10000": "Externer Primärspeicher[uuid:%s, name:%s] meldet einen fehlerhaften Status: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10016": "Shell-Ausführung fehlgeschlagen wegen %s", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10001": "Aktive Clients für Volume[uuid:%s, mountPath %s, client:%s] finden", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10147": "Server-IPs sind alle nicht mit der Server-Gruppe [%s] verknüpft", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10017": "Hinzufügen der Integritätsprüfungsdatei[%s.%s] fehlgeschlagen, weil %s", + "ORG_ZSTACK_VMWARE_10088": "vCenter Backup-Speicher unterstützt das Abbrechen des Downloads eines Images nicht.", + "ORG_ZSTACK_VMWARE_10086": "%s Ressource ist bereits bereitgestellt", + "ORG_ZSTACK_VMWARE_10085": "Unerwartetes Protokoll: %s", + "ORG_ZSTACK_VMWARE_10082": "Kein Datenspeicher an %s angeschlossen", + "ORG_ZSTACK_VMWARE_10083": "Datenspeicher für %s nicht gefunden", + "ORG_ZSTACK_VMWARE_10080": "vCenter[uuid=%s] ist deaktiviert. Sie können nur Lesevorgänge auf diesem vCenter durchführen. Um Konfigurationsänderungen vorzunehmen, aktualisieren Sie die vCenter-Konfiguration mit UpdateVCenterAction {uuid=%s state=Enabled}", + "ORG_ZSTACK_VMWARE_10081": "VCENTER[uuid=%s] sind deaktiviert. Sie können nur Lesevorgänge auf diesen VCENTER durchführen.", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10021": "Fehler bei verschlüsseltem Snapshot[uuid:%s]: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10151": "Servergruppe mit UUID:%s konnte nicht zum Listener mit UUID:%s hinzugefügt werden, da die Netzwerkschnittstelle mit UUID:%s bereits zugeordnet ist", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10152": "Serverinstanz [uuid:%s] konnte nicht zum Listener [uuid:%s] hinzugefügt werden, da die Server-IP-Adresse bereits registriert ist", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10150": "Servergruppe [uuid:%s] konnte nicht zum Listener [uuid:%s] hinzugefügt werden, da sie bereits hinzugefügt wurde", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10155": "Servergruppe[uuid:%s] konnte nicht zum Listener [uuid:%s] hinzugefügt werden, da ein UDP-Listener IPv4-Backend-Adressen nicht IPv6 zuordnen kann", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10156": "Servergruppen [uuid:%s] konnten nicht vom Listener [uuid:%s] entfernt werden, da HTTP-Umleitung zu HTTPS aktiviert ist", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10153": "Servergruppe[uuid:%s] konnte nicht zum Listener [uuid:%s] hinzugefügt werden, da ein UDP-Listener nicht gleichzeitig IPv4- und IPv6-VIP-Adressen haben kann", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10154": "Servergruppe[uuid:%s] konnte nicht zum Listener [uuid:%s] hinzugefügt werden, da der UDP-Listener IPv6-Backend-Adressen nicht IPv4-Adressen zuordnen kann", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10159": "Load Balancer, der der Servergruppe [uuid:%s] zugeordnet ist, konnte nicht gefunden werden", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10157": "Servergruppe [uuid:%s] konnte nicht vom Load Balancer [uuid:%s] abgemeldet werden, da sie nicht registriert ist", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10158": "loadBalancerUuid [%s] existiert nicht", + "ORG_ZSTACK_VMWARE_10078": "Der Vorgang wird in der aktuellen Cloud-Computing-Umgebung nicht unterstützt. Bitte stellen Sie sicher, dass Ihre Anfrage mit den unterstützten Vorgängen für Cloud-Ressourcen übereinstimmt.", + "ORG_ZSTACK_VMWARE_10076": "VM konnte nicht eingeschaltet werden, Aufgabenstatus: %s", + "ORG_ZSTACK_VMWARE_10073": "VM [%s] wurde im vCenter-Bestand nicht gefunden", + "ORG_ZSTACK_VMWARE_10071": "VM mit UUID=%s konnte auf ESX-Host mit UUID=%s nicht gefunden werden", + "ORG_ZSTACK_VMWARE_10072": "ESX-VM[uuid=%s]-Konfiguration konnte nicht aktualisiert werden. Weitere Details finden Sie im Protokoll.", + "ORG_ZSTACK_VMWARE_10070": "Image [%s] wurde nicht im Registry oder lokalen Cache gefunden", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10162": "Backend-Server-VMNIC konnte nicht auf Servergruppe[uuid:%s] geändert werden, da VMNIC-Gewichtung [%s] keine gültige Zahl ist", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10163": "Ungültige Balancer-Gewichtung[vimNic:%s], Gewichtung darf nicht null sein", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10160": "Backend-Server-VMNIC der Servergruppe konnte nicht aktualisiert werden, da Servergruppe [uuid=%s] keine VMNIC [uuid=%s] hat", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10161": "Ungültige Balancer-Gewichtung[vimNic:%s], Gewichtungswert liegt außerhalb des gültigen Bereichs [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10166": "Ungültige Balancer-Gewichtung[serverIp:%s,weight:%s], Gewichtung liegt nicht im gültigen Bereich [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10167": "Backend-Server-IP konnte nicht zur Servergruppe [UUID:%s] hinzugefügt werden, da VMNIC-Gewichtung [%s] keine gültige Zahl ist", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10164": "Backend-Server-VMNIC der Servergruppe [UUID:%s] konnte nicht aktualisiert werden, da VMNIC-UUID null ist", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10165": "Backend-Server-IP der Servergruppe konnte nicht aktualisiert werden, da Servergruppe [uuid=%s] keine IP [ipAddress:%s] hat", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10168": "Ungültige Balancer-Gewichtung[serverIp:%s], Gewichtung darf nicht null sein", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10169": "Backend-Server-IP konnte nicht zur Servergruppe [UUID:%s] hinzugefügt werden, da IP [IP Address:%s] ungültig ist", + "ORG_ZSTACK_VPC_HA_10010": "Mehr als 2 VPC-Router sind an HA-Gruppe [uuid:%s] angehängt.", + "ORG_ZSTACK_COMPUTE_VM_10119": "Die virtuelle Maschine kann keine Online-CPU-/Speicheraktualisierungen durchführen, da \"Instance Offering Online Modification\" deaktiviert ist. Bitte stoppen Sie die VM und versuchen Sie dann die CPU-/Speicheraktualisierung erneut.", + "ORG_ZSTACK_VPC_HA_10011": "HA-Gruppenmanagement-L3- und öffentliche L3-Netzwerke [uuid:%s] unterscheiden sich von den angebotenen L3-Netzwerken [uuid:%s].", + "ORG_ZSTACK_VPC_HA_10012": "vPC-Router-L3-Netzwerke [UUID:%s] stimmen nicht mit den HA-Gruppen-L3-Netzwerken [UUID:%s] überein. Bitte löschen Sie diesen Router und erstellen Sie ihn neu.", + "ORG_ZSTACK_VPC_HA_10013": "vPC-Router wurde an Hochverfügbarkeitsgruppe [uuid:%s] angehängt", + "ORG_ZSTACK_VPC_HA_10014": "vpc ha group [uuid:%s] existiert nicht", + "ORG_ZSTACK_VPC_HA_10015": "Mehr als ein VPC-Router ist an HA-Gruppe [uuid:%s] angehängt", + "ORG_ZSTACK_VPC_HA_10016": "vPC-Router [UUID:%s] kann nicht auf HA-Router aktualisiert werden, da sein öffentliches Netzwerk mit dem Verwaltungsnetzwerk identisch ist.", + "ORG_ZSTACK_VPC_HA_10017": "Affinity-Gruppe für Hochverfügbarkeitsgruppe [uuid:%s] konnte nicht erstellt werden", + "ORG_ZSTACK_VPC_HA_10018": "haStatus der Instanz %s [uuid: %s] von VPC HA-Gruppe %s [uuid: %s] hat sich von %s zu %s geändert", + "ORG_ZSTACK_VPC_HA_10019": "haStatus von Instanz[uuid: %s, name: %s, type: %s] hat sich von %s zu %s geändert", + "ORG_ZSTACK_VPC_HA_10009": "Es gibt keinen Master-Router für den Router [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10000": "NFV-Instanz-Initialisierungsbefehl fehlgeschlagen wegen:%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10002": "Fehler beim Ändern der Firewall-Standardrichtlinie der Netzwerkschnittstelle von NFV-Instanz-VM[uuid:%s], weil %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10053": "access-control-list groups[uuid:%s] sind für Umleitung konfiguriert, aber einige access-control-list-Einträge fehlen IP-Regeln.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10050": "Der Lastverteiler-Listener [UUID:%s] kann nicht mehr als %d Umleitungsregel-Zugriffskontrolllisten-Gruppen anhängen.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10051": "Lastverteiler-Listener [uuid:%s] hatte eine Umleitungsregel, die mit Zugriffskontrolllisten-Gruppen [uuid:%s] verknüpft war", + "ORG_ZSTACK_COMPUTE_VM_10118": "die VM[UUID:%s] ist nach der letzten Migration immer noch pausiert; bitte setzen Sie sie fort, bevor Sie erneut migrieren.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10056": "der Lastverteiler-Listener [uuid:%s] kann nicht mehr als %d Zugriffskontrolllisten-Gruppen anhängen", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10008": "Trennen wird für diesen virtuellen Maschinen-Instanztyp nicht unterstützt.", + "ORG_ZSTACK_COMPUTE_VM_10117": "Die VM mit UUID:%s wird bereits auf dem Host mit UUID:%s gehostet", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10057": "Servergruppe[%s] ist nicht an Lastverteiler-Listener[%s] angehängt", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10007": "Aktualisieren der Bereitstellungskonfiguration wird für diesen NFV-Instanztyp nicht unterstützt.", + "ORG_ZSTACK_COMPUTE_VM_10116": "rootDiskSize muss angegeben werden, wenn der Bildmedientyp ISO ist.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10054": "Die Zugriffskontrolllisten-Gruppen[uuid:%s] sind bereits mit dem Lastverteiler-Listener[uuid:%s] verknüpft.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10055": "der Lastverteiler-Listener[uuid:%s] hat nur den %s-Typ der Zugriffskontrolllisten-Gruppe angehängt.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10009": "Daten bereinigen wird für diesen virtualisierten Netzwerkfunktions-Instanztyp nicht unterstützt.", + "ORG_ZSTACK_COMPUTE_VM_10114": "Aktuelle Plattform %s unterstützt noch keine Aktualisierung von NIC-Treibern.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10004": "SSH-Verbindung zur NFV-Instanz [%s] nach dem Konfigurieren von SSH-Einstellungen kann nicht hergestellt werden", + "ORG_ZSTACK_COMPUTE_VM_10113": "CD-ROM kann nicht für virtuelle Maschine [uuid:%s] erstellt werden, die sich im Status [%s] befindet", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10058": "acl[%s] ist nicht an Lastverteiler-Listener[%s] angehängt", + "ORG_ZSTACK_COMPUTE_VM_10112": "Das Image [name:%s, uuid:%s] ist ein ISO; daher muss die rootDiskSize angegeben werden.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10006": "Fehler beim Aktualisieren des NFV-Instanzstatus: %s", + "ORG_ZSTACK_COMPUTE_VM_10111": "Fehlende CPU- und Speicherzuordnungseinstellungen für Ihre Instanz. Bitte geben Sie die erforderlichen Werte an, um fortzufahren.", + "ORG_ZSTACK_VPC_HA_10020": "Die HA-Gruppen-UUID ist nil. Bitte überprüfen Sie die Konfiguration und stellen Sie sicher, dass die UUID korrekt festgelegt ist.", + "ORG_ZSTACK_COMPUTE_VM_10121": "Kapazität kann nicht verringert werden, wenn VM[%s] ausgeführt wird", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10060": "VM-NIC konnte nicht an Load-Balancer-Listener angehängt werden, da die VM-NIC [uuid:%s] bereits der Standard-Servergruppe [uuid:%s] zugeordnet ist.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10061": "UDP-Listener können nicht gleichzeitig IPv4- und IPv6-Virtual-IPs haben. Bitte konfigurieren Sie entweder IPv4 oder IPv6 für Ihren Listener.", + "ORG_ZSTACK_COMPUTE_VM_10129": "%s ist keine gültige IPv4-Adresse für Cloud-Deployment", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10068": "Ungültiger Weiterleitungsstatus [%s], es werden nur [gültige HTTP-Statuscodes] unterstützt", + "ORG_ZSTACK_COMPUTE_VM_10128": "Speichergröße der VM [uuid:%s] kann nicht verringert werden, wenn sie ausgeführt wird", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10065": "Es können nicht mehr als %d Access-Control-Listen-Gruppen an einen Listener angehängt werden", + "ORG_ZSTACK_COMPUTE_VM_10127": "CPU der laufenden VM [uuid:%s] kann nicht verringert werden", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10066": "Der Load-Balancer-Listener [%s] unterstützt keine Zuweisung von Session-Persistence-Status", + "ORG_ZSTACK_COMPUTE_VM_10126": "Der Status der VM [uuid:%s] ist %s. Nur diese Status [%s] sind zulässig, um CPU oder Speicher zu aktualisieren.", + "ORG_ZSTACK_COMPUTE_VM_10125": "Die virtuelle Maschine kann keinen Memory-Hot-Plug-Vorgang durchführen, da Memory-Hot-Plug deaktiviert ist. Bitte stoppen Sie die virtuelle Maschine und versuchen Sie dann den Memory-Hot-Plug-Vorgang erneut.", + "ORG_ZSTACK_COMPUTE_VM_10124": "Die virtuelle Maschine kann keine CPU-Hot-Addition durchführen, da CPU-Hot-Addition deaktiviert ist. Bitte stoppen Sie die VM und versuchen Sie dann die CPU-Hot-Addition erneut.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10069": "Ungültiger Statuscode [%s], es werden nur [gültige Statuscodes in Cloud-Computing-Umgebungen] unterstützt", + "ORG_ZSTACK_COMPUTE_VM_10122": "reservedMemorySize [%s] überschreitet memorySize [%s]", + "ORG_ZSTACK_COMPUTE_VM_10132": "%s ist keine gültige IPv6-Adresse für Cloud-Ressourcenkonfiguration", + "ORG_ZSTACK_COMPUTE_VM_10131": "IP-Adresse [%s] liegt nicht im angegebenen IP-Bereich [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10074": "Load-Balancer [%s] Listener [%s] unterstützt keine Zuweisung von Session-Persistence-Status; explizite IP-Hash-Zuordnung erforderlich.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10075": "Ungültiger Session-Persistence-Typ [%s], es werden nur %s unterstützt", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10072": "Ungültiger Session-Persistence-Status [%s], es werden nur %s unterstützt", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10073": "Load-Balancer [%s] Listener [%s] unterstützt keine Zuweisung von Session-Persistence-Status; explizite Deaktivierung erforderlich.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10078": "Ungültiger Session-Cookie-Name [%s], er darf nur alphanumerische Zeichen und Unterstriche enthalten", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10079": "Load-Balancer [%s] Listener [%s] unterstützt nicht gleichzeitiges Zuweisen von Idle-Timeout und Cookie-Namen", + "ORG_ZSTACK_COMPUTE_VM_10139": "IPv6-Adresse muss eine Präfixlänge enthalten", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10076": "Ungültiges Session-Idle-Timeout [%s], es muss eine positive ganze Zahl zwischen [%s~%s] sein", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10077": "Ungültiger Session-Cookie-Name [%s], er muss kürzer als [%d] Zeichen sein", + "ORG_ZSTACK_COMPUTE_VM_10137": "IPv4-Adresse erfordert eine Subnetzmaske", + "ORG_ZSTACK_COMPUTE_VM_10136": "Statische IP [%s] ist falsch formatiert", + "ORG_ZSTACK_COMPUTE_VM_10135": "Die IP-Adresse für die Instanz konnte nicht festgelegt werden, da keine IP-Adresse angegeben wurde. Bitte stellen Sie sicher, dass eine IP-Adresse angegeben wird, bevor Sie versuchen, die Netzwerkeinstellungen zu konfigurieren.", + "ORG_ZSTACK_COMPUTE_VM_10134": "IP-Adresse [%s] liegt nicht im angegebenen IP-Bereich [startIp %s, endIp %s]", + "ORG_ZSTACK_COMPUTE_VM_10133": "IP-Adresse [%s] ist bereits der VM-Netzwerkkarte [uuid:%s] zugeordnet.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10081": "loadBalancer[%s] listener[%s] unterstützt das Zuweisen von idle timeout und Cookie-Name nicht, wenn Session-Persistenz deaktiviert ist", + "ORG_ZSTACK_COMPUTE_VM_10143": "Statische IP [%s] für VM [uuid:%s] konnte nicht freigegeben werden, da sie nicht existiert", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10082": "loadBalancer[%s] listener[%s] unterstützt das Zuweisen von Session-Persistenz-Rewrite nicht ohne Angabe eines Cookie-Namens", + "ORG_ZSTACK_COMPUTE_VM_10142": "Die VM[uuid:%s] hat keine Netzwerkschnittstelle, die mit dem L3-Netzwerk[uuid:%s] verbunden ist", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10080": "loadBalancer[%s] listener[%s] unterstützt das Zuweisen von idle timeout und Cookie-Name nicht; Session-Persistenz muss angegeben werden.", + "ORG_ZSTACK_COMPUTE_VM_10140": "IP-Adresse [%s] ist bereits vmNic zugeordnet", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10085": "loadBalancer[%s] listener[%s] unterstützt das Zuweisen von Session-Persistenz-Richtlinien nicht, wenn der Source-Lastverteilungsalgorithmus source-based ist.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10086": "loadBalancer[%s] unterstützt das Zuweisen von Session-Persistenz mit iphash nicht für listener[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10083": "loadBalancer[%s] listener[%s] unterstützt das Zuweisen von Session-Persistenz idle timeout nicht ohne Angabe eines rewrite-Modus", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10084": "loadBalancer[%s] listener[%s] unterstützt das Zuweisen von Session-Persistenz mit einem cookieName nicht ohne Angabe eines insert-Modus", + "ORG_ZSTACK_COMPUTE_VM_10149": "Nicht unterstützter Bild-Medientyp: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10087": "Ungültige maximale Verbindung [%s], der angegebene Wert überschreitet den oberen Grenzwert von %d", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10088": "Konflikt loadBalancerPort[%s], ein anderer listener[uuid:%s] verwendet diesen Port", + "ORG_ZSTACK_COMPUTE_VM_10147": "Die VM %s mit Speicher-Snapshots unterstützt das Festlegen eines Start-Volumes nicht", + "ORG_ZSTACK_COMPUTE_VM_10146": "volume[uuid:%s] muss an virtual machine[uuid:%s] angehängt werden", + "ORG_ZSTACK_COMPUTE_VM_10145": "Das Start-Volume dieser Instanz kann nicht als shareable konfiguriert werden.", + "ORG_ZSTACK_COMPUTE_VM_10144": "Ungültiges Start-Gerät [%%s] in der Startreihenfolge %%s", + "ORG_ZSTACK_VMWARE_10024": "Kann nicht synchronisieren, bevor Datastores isoliert sind", + "ORG_ZSTACK_VMWARE_10025": "Es laufen Tasks auf dem vCenter[uuid:%s], bitte versuchen Sie es später erneut.", + "ORG_ZSTACK_VMWARE_10023": "Verbindung zum vCenter fehlgeschlagen: %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10008": "SDN-Controller konnte nicht initialisiert werden, da keine Virtual Network Identifier (VNI)-Bereiche auf dem Controller konfiguriert sind [ip:%s]", + "ORG_ZSTACK_VMWARE_10020": "Keine verfügbaren VNC-Ports für die virtuelle Maschine %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10009": "VNI-Bereichsinformationen konnten nicht vom SDN-Controller abgerufen werden [ip:%s] wegen %s", + "ORG_ZSTACK_VMWARE_10021": "Service-Instanz für vCenter %s abrufen fehlgeschlagen wegen %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10092": "Cloud konnte den Load-Balancer-Listener nicht erstellen, da der TCP-Protokoll-Listener nur TCP-Proxy-Protokollparameter unterstützt.", + "ORG_ZSTACK_MEVOCO_10006": "Nicht unterstützte Operation für das Einstellen von virtio-scsi volume[%s] multiQueues in der Cloud-Computing-Umgebung.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10093": "Cloud kann den Load-Balancer-Listener nicht erstellen, da nur TCP-Proxy-Protokoll %s unterstützt wird", + "ORG_ZSTACK_MEVOCO_10005": "Nicht unterstützte Operation zum Festlegen des Root-Volumes [%s] für die Verwendung mehrerer Queues", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10091": "Fehler bei der Erstellung der Cloud-Computing-Ressource, da der Listener mit dem Protokoll HTTPS nur HTTP-Versionen [h1, h2] unterstützt. Bitte stellen Sie die Kompatibilität Ihrer Anfrage sicher", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10010": "Hardware-VXLAN-Netzwerk konnte nicht erstellt werden, da die H3C-Tenant-UUID ein Pflichtparameter für den H3C VCFC V2-Controller ist. Bitte geben Sie die erforderliche UUID an, um fortzufahren", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10096": "Load-Balancer-Listener vom Typ %s erfordert kein Zertifikat", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10097": "Zertifikat [uuid:%s] ist bereits mit dem Load-Balancer-Listener [uuid:%s] verknüpft", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10094": "Cloud kann den Load-Balancer-Listener nicht erstellen, da der Listener mit dem Protokoll [%s] keine Inhaltskompression unterstützt", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10095": "Cloud kann den Load-Balancer-Listener nicht erstellen, da nur Komprimierungsalgorithmen [%s] unterstützt werden", + "ORG_ZSTACK_MEVOCO_10007": "Für freigabares Volume ist der einzige unterstützte Primärspeichertyp %s, aktuell ist es %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10015": "VNI-Bereich konnte nicht erstellt werden, da das angegebene L2-Netzwerk [uuid:%s] keine VXLAN-Netzwerkpool-Instanz ist", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10016": "VNI-Bereich [%s-%s] konnte nicht erstellt werden, da H3C-Controller VNI als VLAN-ID verwenden und der Bereich innerhalb von 1-4094 liegen muss. VNI-Werte sollten den VLAN-ID-Standards für virtuelle Netzwerke entsprechen", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10017": "VNI-Bereich [%s-%s] konnte nicht erstellt werden, da er nicht von einem der konfigurierten VNIs des SDN-Controllers abgedeckt wird", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10098": "Zertifikat [uuid:%s] ist nicht mit dem Load-Balancer-Listener [uuid:%s] verknüpft", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10018": "IPv6-Bereich konnte nicht hinzugefügt werden, da der SDN-Controller [uuid:%s] nicht betriebsbereit ist. Aktueller Status: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10099": "HealthCheck-Ziel [%s] Fehler, es muss 'default' oder eine Portnummer zwischen [1~65535] sein", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10011": "Hardware-VXLAN-Netzwerk konnte nicht erstellt werden, da der angegebene Tenant im SDN-Controller-Managementsystem nicht existiert. Bitte überprüfen Sie die Tenant-ID und stellen Sie sicher, dass sie korrekt in der Cloud-Umgebung konfiguriert ist", + "ORG_ZSTACK_MEVOCO_10002": "IOPS-Modus kann nicht aus null VolumeQoS gefunden werden", + "ORG_ZSTACK_VMWARE_10017": "L2[UUID:%s] gehört nicht zum vCenter[UUID:%s] Cluster[UUID:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10012": "VXLAN-Netzwerk konnte nicht erstellt werden, da der SDN-Controller [ip:%s] nicht antwortete", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10013": "VXLAN-Netzwerk konnte auf dem SDN-Controller [IP:%s] nicht erstellt werden, weil %s", + "ORG_ZSTACK_MEVOCO_10000": "ZStack wurde pausiert und alle API-Aufrufe außer schreibgeschützten Operationen werden abgelehnt. Wenn Sie eine nicht-schreibgeschützte Operation durchführen möchten, fügen Sie bitte '%s' zu den systemTags hinzu", + "ORG_ZSTACK_VMWARE_10015": "Keine Hosts im Compute-Cluster gefunden: %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10014": "VXLAN-Netzwerk konnte auf dem SDN-Controller [IP:%s] nicht gelöscht werden, weil %s", + "ORG_ZSTACK_VMWARE_10016": "vSwitch/dvSwitch nicht gefunden: %s, oder vSwitch auf unterschiedlichem ESX-Host hat nicht dieselbe Portgruppe", + "ORG_ZSTACK_VMWARE_10013": "NIC-Treiber %s wird noch nicht unterstützt", + "ORG_ZSTACK_VMWARE_10014": "Cluster[uuid:%s] und Layer-2-Netzwerk[uuid:%s] gehören unterschiedlichen Rechenzentren an", + "ORG_ZSTACK_VMWARE_10011": "domainName[%s] ist kein gültiger DNS-Hostname oder IP-Adresse", + "ORG_ZSTACK_VMWARE_10012": "vCenter [Domain Name:%s] wurde hinzugefügt", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10019": "IPv6-Bereich konnte nicht per Netzwerk-CIDR hinzugefügt werden, da der SDN-Controller [uuid:%s] nicht verbunden ist. Aktueller Status: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10000": "Kein verfügbares Baremetal-Gateway für diese Anfrage gefunden. Bitte stellen Sie sicher, dass Ihre Baremetal-Knoten ordnungsgemäß konfiguriert und bei der Cloud-Computing-Umgebung registriert sind", + "ORG_ZSTACK_VMWARE_10010": "Der vCenter-Anmeldebenutzername ist erforderlich.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10002": "Fehler beim Zuweisen der BareMetal2-Gateway-Ressource", + "ORG_ZSTACK_CORE_DEBUG_10000": "Die Aufgabeninformationen (%s) wurden in der Cloud-Computing-Umgebung nicht gefunden. Bitte stellen Sie sicher, dass alle erforderlichen Aufgabendetails ordnungsgemäß konfiguriert und hochgeladen wurden.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10020": "IP-Bereich konnte nicht hinzugefügt werden, da der SDN-Controller [uuid:%s] nicht verbunden ist. Aktueller Status: %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10021": "IP-Bereich nach Netzwerk-CIDR konnte nicht hinzugefügt werden, da der SDN-Controller [uuid:%s] nicht verbunden ist. Aktueller Status: %s", + "ORG_ZSTACK_MEVOCO_10014": "Ungültige Netzwerkbandbreite [%s], es ist kein numerischer Wert", + "ORG_ZSTACK_MEVOCO_10019": "Ungültige Volume-Bandbreite [%s], sie muss größer als oder gleich 1024 Mbps sein", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10028": "Mandanten konnten nicht abgerufen werden, da der SDN-Controller [ip:%s] nicht geantwortet hat", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10029": "SDN-Controller konnte nicht initialisiert werden, da kein Standardmandant auf dem Controller [ip:%s] konfiguriert ist", + "ORG_ZSTACK_VMWARE_10009": "Konsolenkennwort wird von der virtuellen Maschine [UUID:%s] auf dem ESX-Host [ESXi-Version:%s] nicht unterstützt", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10022": "Layer-3-Netzwerk kann nicht erstellt werden, da der H3C VCFC V2 SDN-Controller kein Layer-3-Networking unterstützt [type:%s, category:%s]", + "ORG_ZSTACK_MEVOCO_10013": "Ungültige Netzwerkbandbreite [%s], sie muss größer oder gleich %d Mbps sein", + "ORG_ZSTACK_VMWARE_10006": "Fehler beim Abrufen der VM[%s]-Root-Disk-Nutzungsstatistiken", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10023": "Hardware-VXLAN-Netzwerk konnte nicht erstellt werden, da die Mandanten-UUID ein Pflichtparameter für den H3C VCFC V2-Controller ist. Bitte stellen Sie sicher, dass sie bereitgestellt wird.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10024": "H3C VCFC-Controller konnte nicht hinzugefügt werden, da das VDS-UUID-System-Tag für H3C VCFC V1-Controller erforderlich ist", + "ORG_ZSTACK_VMWARE_10005": "Fehler beim Abrufen der VM-Instanz vom Installationspfad: %s", + "ORG_ZSTACK_VMWARE_10002": "Kein virtuelles Rechenzentrum gefunden", + "ORG_ZSTACK_VMWARE_10000": "Kein virtueller Datenträgerverwaltungsdienst gefunden", + "ORG_ZSTACK_VMWARE_10001": "Kein Dateimanager für Cloud-Speicheroperationen konfiguriert. Bitte stellen Sie sicher, dass ein gültiger Dateimanager für %s-Operationen eingerichtet ist.", + "ORG_ZSTACK_VPC_HA_VYOS_10000": "Fehler beim Aktivieren von HA auf dem virtuellen Router [uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10011": "NFV-Instanz [uuid:%s] befindet sich im Status %s und kann keinen HTTP-Aufruf an %s durchführen", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10010": "Die NFV-Instanz [name:%s, UUID:%s, aktueller Status:%s] wird nicht ausgeführt und kann den erforderlichen Vorgang nicht durchführen. Bitte wiederholen Sie den Vorgang, sobald die Instanz ausgeführt wird.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10013": "Netzwerkschnittstelle [ip:%s, mac:%s] kann nicht zur NFV-Instanz [uuid:%s ip:%s] hinzugefügt werden, weil %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10012": "NFV-Instanz [uuid:%s] hat keine Management-Netzwerkschnittstelle, die einen HTTP-Aufruf an %s durchführen kann", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10004": "Der primäre Knoten für den Software-Defined Network (SDN)-Controller [ip:%s] konnte aufgrund von %s nicht ermittelt werden", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10005": "Authentifizierung mit SDN-Controller nicht möglich, da der Controller [IP:%s] nicht geantwortet hat", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_10000": "VM[uuid:%s] Speichermigrations-Langzeitjob [uuid:%s] aufgrund von Neustart des Management-Knotens fehlgeschlagen", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10006": "Authentifizierung mit SDN-Controller [IP:%s] nicht möglich, weil %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10007": "VNI-Bereichsinformationen konnten nicht abgerufen werden, da der SDN-Controller [ip:%s] nicht geantwortet hat", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10000": "IP-Bereich konnte nicht hinzugefügt werden, da die Subnetzerstellung auf dem SDN-Controller fehlgeschlagen ist. Bitte überprüfen Sie die Netzwerkkontaktieren Sie den Support für Unterstützung.", + "ORG_ZSTACK_COMPUTE_VM_10103": "Kann nicht zu L3-Netzwerk wechseln. Das L3-Netzwerk [uuid:%s] ist ein Systemnetzwerk und die VM ist eine Benutzer-VM.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10015": "VMInstanceSpec nicht in Flow-Daten-Parametern gefunden. Bitte stellen Sie sicher, dass alle erforderlichen Spezifikationen enthalten sind.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10001": "IP-Bereich konnte nicht zum Netzwerk hinzugefügt werden, weil %s", + "ORG_ZSTACK_COMPUTE_VM_10102": "Wechseln zu L3-Netzwerk nicht möglich. Das L3-Netzwerk mit UUID [uuid:%s] ist deaktiviert", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10014": "Bild [UUID:%s] kann nicht gelöscht werden, da es von einer NFV-Instanzgruppe [UUID:%s] verwendet wird", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10002": "IP-Bereich konnte nicht aus dem Layer-3-Netzwerk gelöscht werden, weil %s", + "ORG_ZSTACK_COMPUTE_VM_10101": "Wechseln zu einem nicht-Gast-L3-Netzwerk nicht möglich. Das L3-Netzwerk mit UUID [uuid:%s] ist bereits mit VM [uuid:%s] verbunden.", + "ORG_ZSTACK_COMPUTE_VM_10100": "Wechseln zu L3-Netzwerk nicht möglich. Das L3-Netzwerk mit UUID [uuid:%s] ist bereits an VM mit UUID [%s] angehängt.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10003": "Cluster-Leiter konnte nicht ermittelt werden, da der SDN-Controller [IP:%s] nicht geantwortet hat", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10016": "VM-Inventory oder UUID ist null in VM-Instanzspezifikation", + "ORG_ZSTACK_PORTMIRROR_10008": "Der PortMirror-Dienst unterstützt die NIC [%s] aufgrund ihres Hypervisor-Typs nicht.", + "ORG_ZSTACK_PORTMIRROR_10009": "Der PortMirror-Dienst kann nicht auf die NIC [%s] spiegeln, die keine Nicht-Standard-Schnittstelle einer VM ist.", + "ORG_ZSTACK_ZWATCH_API_10019": "Abfragedauer darf %s nicht überschreiten", + "ORG_ZSTACK_COMPUTE_VM_10198": "VM-Instanz kann nicht von einem shareable Volume erstellt werden. Bitte stellen Sie sicher, dass das Volume nicht als shareable markiert ist und versuchen Sie es erneut.", + "ORG_ZSTACK_PORTMIRROR_10000": "Ungültiger Parameter [%s], stellen Sie sicher, dass er auf ein gültiges Port Mirroring Network verweist", + "ORG_ZSTACK_COMPUTE_VM_10197": "Eine der folgenden Eigenschaften muss gesetzt werden: %s", + "ORG_ZSTACK_PORTMIRROR_10001": "Das Netzwerk[%s] wurde mit einem Port Mirroring-Dienst verbunden", + "ORG_ZSTACK_ZWATCH_API_10028": "Konto[uuid: %s] hat keine Berechtigungen für Ressource[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10196": "Die folgenden Eigenschaften können nicht gleichzeitig konfiguriert werden: %s", + "ORG_ZSTACK_PORTMIRROR_10002": "Der Port Mirroring-Dienst[%s] wurde nicht erstellt", + "ORG_ZSTACK_PORTMIRROR_10003": "Die NIC [%(device_id)s, %(network_interface_id)s] wurde bereits durch Dienst [%(service_id)s] gespiegelt", + "ORG_ZSTACK_COMPUTE_VM_10194": "Mindestens eines der folgenden sollte für die Instanz angegeben werden: Architektur in msg oder Bild[uuid:%s]", + "ORG_ZSTACK_PORTMIRROR_10004": "Die NIC[%s] kann nicht für Dienst[%s] gespiegelt werden mit", + "ORG_ZSTACK_ZWATCH_API_10025": "Ungültiges Label[%s], gültige abfragbare Labels für Cloud-Ressourcen sind %s", + "ORG_ZSTACK_COMPUTE_VM_10193": "Mindestens eines der folgenden sollte für das Gast-Betriebssystem angegeben werden: Feld guestOsType in msg oder Bild[uuid:%s].", + "ORG_ZSTACK_ZWATCH_API_10024": "Metrik[%s] hat keinen Filter[%s]", + "ORG_ZSTACK_COMPUTE_VM_10192": "Mindestens eines der folgenden sollte für die Nachricht oder das Bild [uuid:%s] angegeben werden: Plattform oder imageID.", + "ORG_ZSTACK_PORTMIRROR_10007": "Der PortMirror-Dienst unterstützt das Spiegeln der NIC[%s] nicht.", + "ORG_ZSTACK_ZWATCH_API_10021": "Metrik[%s] kann nicht in Namespace[%s] gefunden werden", + "ORG_ZSTACK_COMPUTE_VM_10199": "VM-Instanz konnte nicht von angehängtem Volume erstellt werden. Bitte stellen Sie sicher, dass das Volume in einem verwendbaren Zustand ist und versuchen Sie es erneut.", + "ORG_ZSTACK_PORTMIRROR_10011": "Der PortMirror-Dienst kann keinen Spiegel-Tunnel für nic[%s] zu nic[%s] erstellen, da das Spiegel-Netzwerk[%s] ungültig ist.", + "ORG_ZSTACK_PORTMIRROR_10012": "Der PortMirror-Dienst kann die Netzwerkschnittstelle [%s] nicht auf sich selbst spiegeln", + "ORG_ZSTACK_ZWATCH_API_10039": "Ungültiges JSON-Format für Labels. Bitte stellen Sie sicher, dass labelsJsonStr korrekt formatiert ist.", + "ORG_ZSTACK_PORTMIRROR_10013": "Der PortMirror-Dienst ist nicht kompatibel mit der Netzwerkschnittstelle, die mit Quality of Service (QoS) konfiguriert ist.", + "ORG_ZSTACK_ZWATCH_API_10038": "Der Namespace [%%s] hat keine Metrik [%%s]", + "ORG_ZSTACK_PORTMIRROR_10014": "Fehler beim Löschen der Port-Mirror-Sitzung[%s] vom Hypervisor, Details: %s", + "ORG_ZSTACK_ZWATCH_API_10037": "Kein Namespace im System definiert", + "ORG_ZSTACK_PORTMIRROR_10015": "Fehler beim Freigeben der Port-Mirror-Sitzung[%s] vom Hypervisor, Details: %s", + "ORG_ZSTACK_ZWATCH_API_10036": "Das URL-Format ist ungültig; es muss mit http(s) beginnen.", + "ORG_ZSTACK_PORTMIRROR_10016": "Interne ID der Sitzung[uuid:%s] kann nicht gefunden werden, wurde das Sitzungslimit auf dem Host überschritten???", + "ORG_ZSTACK_ZWATCH_API_10033": "endTime[%s, %sms] darf nicht vor startTime[%s, %sms] liegen", + "ORG_ZSTACK_ZWATCH_API_10032": "Die Labels von Metrik[%s] enthalten nicht [%s]", + "ORG_ZSTACK_ZWATCH_API_10031": "Namespace[%s] kann nicht gefunden werden", + "ORG_ZSTACK_ZWATCH_API_10030": "Wenn der Namespace auf all gesetzt ist, werden Metrics und Labels nicht unterstützt.", + "ORG_ZSTACK_PORTMIRROR_10010": "Der PortMirror-Dienst kann die NIC [%s] nicht spiegeln, die keine Schnittstelle einer VM ist.", + "ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10009": "PCI-Geräteinformationen konnten nicht vom Host[uuid:%s] abgerufen werden", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10030": "Standard-Tenant konnte vom SDN-Controller [ip:%s] aufgrund von Kommunikationsproblemen nicht abgerufen werden", + "ORG_ZSTACK_ZWATCH_API_10046": "Das Zeitintervall überschreitet %d Tage", + "ORG_ZSTACK_ZWATCH_API_10045": "endTime[%s] darf nicht vor startTime[%s] liegen", + "ORG_ZSTACK_ZWATCH_API_10044": "Ungültige Instanz[%s]", + "ORG_ZSTACK_ZWATCH_API_10043": "ECS-Instanz-Bestätigungsdatensatz für Alarm existiert nicht", + "ORG_ZSTACK_ZWATCH_API_10042": "startTime[%s] liegt nach endTime[%s]", + "ORG_ZSTACK_ZWATCH_API_10041": "Plattform[url=%s] existiert bereits", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10033": "VXLAN-Netzwerk konnte nicht gelöscht werden, da der SDN-Controller [ip:%s] nicht reagierte", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10004": "Betriebsfehler, VIP %s ist nicht an eine VM-Instanz gebunden", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10000": "Fehler beim Erstellen der Port-Weiterleitungsregel[vip ip: %s, private ip: %s, vip start port: %d, vip end port: %d, private start port: %d, private end port: %d], weil %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10001": "Fehler beim Widerrufen der Port-Weiterleitungsregeln %s wegen %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10002": "Fehler beim Synchronisieren der Port-Weiterleitungsregeln des virtuellen Routers[name: %s, uuid: %s], weil %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10003": "Ein virtueller Router [uuid:%s] für das L3-Netzwerk [uuid:%s] in Zone [uuid:%s] wurde gefunden; jedoch stimmt das öffentliche Netzwerk des Netzwerks [uuid:%s] nicht mit der Port-Weiterleitungsregel [uuid:%s] überein. Möglicherweise müssen Sie ein bestimmtes virtuelles Router-Angebot unter Verwendung des System-Tags guestL3Network::l3NetworkUuid angeben.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10004": "Virtueller Router unterstützt keine Port-Weiterleitungsbereich-Umleitung; der VIP-Port-Start muss gleich dem Private-Port-Start und der VIP-Port-Ende muss gleich dem Private-Port-Ende sein. Diese Regel hat jedoch einen mismatchenden Bereich: VIP-Port [%s, %s], Private-Port [%s, %s].", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10005": "Fehler beim Hinzufügen von Port-Weiterleitungen auf dem virtuellen Router[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10006": "Fehler beim Widerrufen von Port-Weiterleitungen auf dem virtuellen Router[uuid:%s], Fehler: %s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10003": "Fehler beim Aufheben der Erstellung von sekundären Speichergeräten wegen:%s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10004": "Abrufen der MTTY-Geräteinformationen vom Host[UUID:%s] fehlgeschlagen", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10001": "Die Menge wurde überschritten. Das Gerät[uuid: %s] erfordert eine Anzahl von SE-Geräten, die die erlaubte Menge[%d] überschreitet.", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10002": "Fehler beim Erstellen von Speichergeräten wegen:%s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10000": "Die angegebene Teilenummer[value:%s] ist keine gültige Instanz-ID in dieser Cloud-Umgebung.", + "ORG_ZSTACK_CORE_CLOUDBUS_10021": "Nachricht liegt nicht im korrekten JSON-Format vor, %s", + "ORG_ZSTACK_COMPUTE_VDPA_10009": "nur %s unterstützt vdpa Beschleunigungstechnologie", + "ORG_ZSTACK_COMPUTE_VDPA_10007": "PCI-Gerät[uuid:%s] konnte nicht erstellt werden, da eine andere L2-Instanz[uuid:%s] die am Cluster angeschlossene physische Netzwerkschnittstelle verwendet", + "ORG_ZSTACK_COMPUTE_VDPA_10006": "PCI-Gerät[uuid:%s] konnte nicht aufgehoben werden, da eine andere L2-Instanz[uuid:%s] die am Cluster angeschlossene physische Netzwerkschnittstelle verwendet", + "ORG_ZSTACK_COMPUTE_VDPA_10005": "Fehler beim Löschen der Brücke[%s] für l2Network[uuid:%s, type:%s] auf dem KVM-Host[uuid:%s], wegen %s", + "ORG_ZSTACK_COMPUTE_VDPA_10004": "Fehler beim Überprüfen der Brücke[%s] für l2NoVlanNetwork[uuid:%s, name:%s] auf dem KVM-Host[uuid: %s], %s", + "ORG_ZSTACK_COMPUTE_VDPA_10003": "Fehler beim Erstellen der Brücke[%s] für l2Network[uuid:%s, type:%s] auf dem KVM-Host[uuid:%s], weil %s", + "ORG_ZSTACK_COMPUTE_VDPA_10002": "vdpa für VM[uuid:%s] vom Ziel-Host[uuid:%s] wiederherstellen", + "ORG_ZSTACK_COMPUTE_VDPA_10001": "vdpa-Gerät für VM[uuid:%s] auf dem Ziel-Host[uuid:%s] freigeben", + "ORG_ZSTACK_COMPUTE_VM_10152": "VM[uuid:%s] ist an mehrere ISOs angehängt, bitte isoUuid beim Abhängen angeben", + "ORG_ZSTACK_COMPUTE_VM_10151": "VM[uuid:%s] hat die ISO-CD-ROM[uuid:%s] eingebunden", + "ORG_ZSTACK_COMPUTE_VM_10150": "Die virtuelle CDROM mit UUID:%s existiert nicht", + "ORG_ZSTACK_COMPUTE_VM_10159": "Layer-3-Netzwerk kann nicht angehängt werden. Das Layer-3-Netzwerk [uuid:%s] gehört zu Layer-2-Netzwerken [uuids:%s], die an keinen Cluster angeschlossen wurden.", + "ORG_ZSTACK_COMPUTE_VM_10158": "Layer-3-Netzwerk kann nicht angehängt werden. Das angegebene L3-Netzwerk [uuid:%s] gehört zu einem anderen Layer-2-Netzwerk [uuids:%s].", + "ORG_ZSTACK_COMPUTE_VM_10157": "Layer-3-Netzwerk kann nicht angehängt werden. Das angegebene Layer-3-Netzwerk [uuid:%s] hat keinen IP-Bereich definiert.", + "ORG_ZSTACK_COMPUTE_VM_10156": "Layer-3-Netzwerk kann nicht angehängt werden. Die VM [uuid: %s] befindet sich nicht in einem Ausführungs- oder Stoppzustand; der aktuelle Zustand ist %s", + "ORG_ZSTACK_COMPUTE_VDPA_10015": "Fehler beim Zuweisen von vDPAs auf Host[uuid:%s] für VM[uuid:%s]: %s", + "ORG_ZSTACK_COMPUTE_VDPA_10013": "Fehler beim Löschen von vDPAs auf Host[UUID:%s] für VM[UUID:%s]: %s", + "ORG_ZSTACK_COMPUTE_VDPA_10012": "L2-Netzwerk [UUID:%s] auf Host [UUID:%s] ist nicht SRIOV-virtualisiert", + "ORG_ZSTACK_COMPUTE_VDPA_10011": "Cluster[uuid:%s] unterstützt ovs-dpdk nicht", + "ORG_ZSTACK_COMPUTE_VDPA_10010": "vSwitch mit physischer Schnittstelle:[%s] kann nicht erstellt werden, da es bereits von einem anderen vSwitch-Typ verwendet wird", + "ORG_ZSTACK_COMPUTE_VM_10163": "Layer-3-Netzwerk kann nicht angehängt werden. Das Layer-3-Netzwerk mit UUID [uuid:%s] ist ein Systemnetzwerk, während die VM eine Benutzer-VM ist", + "ORG_ZSTACK_COMPUTE_VM_10162": "Layer-3-Netzwerk kann nicht angehängt werden. Das Layer-3-Netzwerk mit UUID [%s] ist deaktiviert", + "ORG_ZSTACK_COMPUTE_VM_10161": "Es kann kein L3-Netzwerk (kein Gast-Netzwerk) an die virtuelle Maschine angehängt werden, da es bereits an eine andere virtuelle Maschine angehängt ist (UUID: %s)", + "ORG_ZSTACK_COMPUTE_VM_10160": "Es kann kein Layer-3-Netzwerk angehängt werden. Das angegebene Layer-3-Netzwerk [UUID:%s] ist bereits an die virtuelle Maschine [UUID: %s] angehängt.", + "ORG_ZSTACK_COMPUTE_VM_10168": "Die statische IP [%s] ist bereits einer Ressource im Layer-3-Netzwerk [UUID:%s] zugeordnet.", + "ORG_ZSTACK_COMPUTE_VM_10167": "Die statische IP [%s] liegt nicht in einem IP-Bereich des Layer-3-Netzwerks [UUID:%s].", + "ORG_ZSTACK_COMPUTE_VM_10166": "Die statische IP L3 UUID[%s] ist nicht in der NIC L3-Liste [%s] enthalten.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10009": "IAM2ProjectVO[UUID:%s] befindet sich nicht im Zustand %s, Zustandsänderung nicht erlaubt.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10008": "Das Projekt [UUID:%s, Name:%s] hat bereits eine Anmeldeablaufstrategie konfiguriert.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10007": "Ungültiges Datum oder Uhrzeit[%s], es darf nicht früher als der aktuelle Zeitstempel[%s] sein.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10006": "Ungültiger Ausgabenwert[%s], er muss im Format wie beispielsweise 10.001 sein.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10005": "Ungültiger Ausgabenwert[%s], der Ausgabenwert sollte zwischen 0 und %f liegen.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10004": "Ungültige Zeit[%s], sie sollte in einem Format wie 10m, 1h oder 2d sein.", + "ORG_ZSTACK_CORE_CLOUDBUS_10001": "Für Webhooks mit Typ[%s] darf das opake Feld nicht null sein.", + "ORG_ZSTACK_COMPUTE_VM_10176": "Es kann die NIC nicht angehängt werden. Ihr L2-Netzwerk [UUID:%s] wurde an kein Compute-Cluster angehängt.", + "ORG_ZSTACK_ZWATCH_API_10007": "Die Parameter dataStartTime und dataEndTime dürfen nicht weggelassen werden. Bitte stellen Sie sicher, dass sie angegeben werden.", + "ORG_ZSTACK_COMPUTE_VM_10175": "Es kann die NIC nicht angehängt werden. Ihr Layer-3-Netzwerk [UUID:%s] ist ein Systemnetzwerk, während die VM eine Benutzer-VM ist.", + "ORG_ZSTACK_ZWATCH_API_10006": "dataUuid darf nicht weggelassen werden.", + "ORG_ZSTACK_COMPUTE_VM_10174": "Es kann die NIC nicht anhängen. Ihr Layer-3-Netzwerk [UUID:%s] ist deaktiviert.", + "ORG_ZSTACK_COMPUTE_VM_10173": "Es kann die NIC nicht an ein L3-Netzwerk (kein Gast-Netzwerk) angehängt werden. Das L3-Netzwerk [UUID:%s] ist bereits an die VM [UUID:%s] angehängt.", + "ORG_ZSTACK_COMPUTE_VM_10172": "Das L3-Netzwerk mit UUID [%s] ist bereits an eine andere VM mit UUID [%s] angehängt. Bitte hängen Sie es von der vorhandenen VM ab, bevor Sie es an eine neue anhängen.", + "ORG_ZSTACK_COMPUTE_VM_10171": "Die NIC wurde bereits an die VM [UUID: %s] angehängt. Bitte stellen Sie sicher, dass die NIC nicht bereits angehängt ist, bevor Sie versuchen, sie erneut anzuhängen.", + "ORG_ZSTACK_COMPUTE_VM_10170": "Es kann die NIC nicht anhängen. Die VM[UUID: %s] befindet sich nicht im Zustand \"Running\" oder \"Stopped\"; der aktuelle Zustand ist %s.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10011": "Das Projekt [UUID:%s, Name:%s] hat bereits eine Außerbetriebnahmerichtlinie definiert.", + "ORG_ZSTACK_COMPUTE_VM_10179": "Es kann ein L3-Netzwerk nicht von der VM [UUID: %s] trennen; VM befindet sich nicht im Zustand \"Running\" oder \"Stopped\"; aktueller Zustand ist %s.", + "ORG_ZSTACK_COMPUTE_VM_10178": "Der Zustand der Netzwerkschnittstelle [UUID: %s] konnte nicht aktualisiert werden, da der Netzwerkschnittstellentyp [%s] nicht unterstützt wird.", + "ORG_ZSTACK_CORE_UPGRADE_10000": "API: %s ist gemäß allowedApiListGrayscaleUpgrading nicht zulässig: %s.", + "ORG_ZSTACK_CORE_UPGRADE_10003": "Die Agentenversion kann nicht gefunden werden; das Upgrade des Cluster-Betriebssystems wird während eines Gray-Scale-Upgrades nicht unterstützt. Bitte stellen Sie sicher, dass die Agentenversion installiert ist, bevor Sie den Upgrade-Prozess starten.", + "ORG_ZSTACK_CORE_UPGRADE_10002": "Deaktivieren Sie das Gray-Scale-Upgrade durch %s, bevor Sie das Betriebssystem aller Hosts im Cluster aktualisieren möchten. Alternativ können Sie versuchen, das Cluster-Betriebssystem mit einer spezifischen Host-UUID zu aktualisieren.", + "ORG_ZSTACK_CORE_UPGRADE_10004": "Die Host[UUID: %s] Agentenversion wurde nicht aktualisiert. Bitte verbinden Sie den Host erneut, bevor Sie ein Betriebssystem-Update durchführen.", + "ORG_ZSTACK_ZWATCH_API_10008": "dataStartTime[%s] liegt nach dataEndTime[%s].", + "ORG_ZSTACK_COMPUTE_VM_10187": "Wenn imageUuid null ist, fehlt placeholder_for_image_uuid.", + "ORG_ZSTACK_COMPUTE_VM_10186": "Die root-Disk fehlt. Bitte stellen Sie sicher, dass ein root-Volume an Ihre Instanz angeschlossen ist.", + "ORG_ZSTACK_COMPUTE_VM_10185": "Unerwartete Konfiguration für Datenträger. Die in dataDiskSizes angegebenen Größen müssen größer als 0 sein.", + "ORG_ZSTACK_COMPUTE_VM_10182": "Unerwartete root-Volume-Einstellungen.", + "ORG_ZSTACK_COMPUTE_VM_10181": "Das Medien-ISO-Typ für das Image ist ISO, aber root-Disk-Einstellungen fehlen.", + "ORG_ZSTACK_COMPUTE_VM_10180": "vm[uuid:%s] kann nur ein Volume anhängen, wenn ihr Status Running oder Stopped ist; der aktuelle Status ist %s.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10003": "Ungültiges Datum[%s], es muss im Format yyyy-MM-dd HH:mm:ss ZZZ sein.", + "ORG_ZSTACK_ZWATCH_API_10010": "Ein Namespace-Name darf nicht mit einem reservierten Schlüsselwort wie %s beginnen.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10002": "Ungültige means[%s], erlaubte means sind zur Angabe von Ressourcenquoten oder Metriken in einer Cloud-Umgebung.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10001": "Ungültiger Wert für Parameter, %s.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10000": "Ungültiger Wert für Ressourcenlimit angegeben; erwartet wird ein numerischer Wert ohne 'at', 'after' oder 'exceed' Suffix. Bitte geben Sie eine gültige Zahl an.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10030": "PXE Server DHCP-Interface %s existiert nicht, oder es hat keine IP-Adresse.", + "ORG_ZSTACK_NETWORK_OVN_10012": "SDN-Host kann nicht hinzugefügt werden, da Netzwerk-Interface [%s] IP-Adresse [%s] hat.", + "ORG_ZSTACK_NETWORK_OVN_10011": "SDN-Host kann nicht hinzugefügt werden, da NIC[%s] im SR-IOV virtualisierten Zustand ist.", + "ORG_ZSTACK_NETWORK_OVN_10010": "SDN-Host kann nicht hinzugefügt werden, da NIC[%s]'s Typ [%s] für Linux-Bonding verwendet wird.", + "ORG_ZSTACK_NETWORK_OVN_10016": "SDN-Host-Hinzufügung fehlgeschlagen, da nur KVM-Hosts OVS DPDK unterstützen.", + "ORG_ZSTACK_APIMEDIATOR_10000": "Mehr als eine Backup-Storage-Instanz auf demselben Host, identifiziert durch Hostname. Es existiert bereits ein SftpBackupStorage [hostname:%s]. Der hinzuzufügende Backup-Storage-Typ ist %s.", + "ORG_ZSTACK_NETWORK_OVN_10015": "SDN-Host kann nicht hinzugefügt werden, da Bond-Modus[%s] nicht von OVN unterstützt wird.", + "ORG_ZSTACK_NETWORK_OVN_10014": "[", + "ORG_ZSTACK_NETWORK_OVN_10013": "kann SDN-Host nicht hinzufügen, da NIC[%s] mit L2-Netzwerk[name:%s] verbunden wurde", + "ORG_ZSTACK_APIMEDIATOR_10001": "Mehr als ein Backup-Storage-Dienst läuft auf demselben Host, identifiziert durch Hostname. Es existiert ein Image-Store-Backup-Storage-Dienst [hostname:%s]. Der Typ des hinzuzufügenden Backup-Storage ist %s.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10031": "%s ~ %s kann keine Verbindung zur DHCP-Schnittstelle %s herstellen", + "ORG_ZSTACK_NETWORK_OVN_10019": "Der Host mit UUID [%s] im Cluster mit UUID [%s] hat keine Hugepages aktiviert; daher darf er nicht zum SDN-Controller hinzugefügt werden", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10032": "Cluster[uuid:%s] und PXE-Server[uuid:%s] befinden sich nicht in derselben Zone", + "ORG_ZSTACK_NETWORK_OVN_10018": "Kann SDN-Host nicht hinzufügen, da keine Netzwerkmaske angegeben wurde.%s", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10033": "Cluster[uuid:%s] ist kein Baremetal-Cluster", + "ORG_ZSTACK_NETWORK_OVN_10017": "Kann SDN-Host nicht hinzufügen, da VTEP-IP nicht konfiguriert ist", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10034": "Baremetal-PXE-Server [uuid:%s] ist bereits mit Cluster [uuid:%s] verbunden", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10035": "Baremetal-PXE-Server [UUID: %s] ist nicht kompatibel mit Baremetal-Instanzen in Cluster [UUID: %s], da die vorhandene NIC-IP %s außerhalb des DHCP-Bereichs des PXE-Servers liegt (%s ~ %s)", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10036": "Baremetal-PXE-Server [UUID: %s] ist nicht mit Cluster [UUID: %s] verknüpft", + "ORG_ZSTACK_STORAGE_MIGRATION_10030": "Das primäre Ziel-Storage ist nicht mit einem Cluster verbunden, das dieselben Level-2-Netzwerke wie der Quell-Cluster teilt", + "ORG_ZSTACK_STORAGE_MIGRATION_10033": "unterstützen keine Speichermigration, während ein freigegebenes Volume[uuid: %s, name: %s] angeschlossen ist", + "ORG_ZSTACK_STORAGE_MIGRATION_10034": "Volume kann nicht von der Quellinstanz zur Zielinstanz migriert werden.", + "ORG_ZSTACK_STORAGE_MIGRATION_10031": "Das Volume [UUID:%s] ist noch an VM [UUID:%s] angeschlossen, bitte trennen Sie es vor der Migration.", + "ORG_ZSTACK_STORAGE_MIGRATION_10032": "kann Datenvolume[uuid:%s] nicht zwischen gemeinsam genutzten Block-Primärspeichern migrieren, wenn die virtuelle Maschine[vmuuid:%s] nicht gestoppt ist.", + "ORG_ZSTACK_STORAGE_MIGRATION_10035": "kann Volume[%s] nicht migrieren, da sein Status \"Deaktiviert\" ist", + "ORG_ZSTACK_STORAGE_MIGRATION_10036": "Kein Host für blockbasierte Live-Migration verfügbar: %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10019": "SNSTextTemplate mit UUID:%s kann nicht gefunden werden, es wurde möglicherweise gelöscht oder aus dem Cloud-Speicher entfernt.", + "ORG_ZSTACK_NETWORK_OVN_10023": "vmnic konnte nicht auf l3network [uuid:%s] geändert werden, da der mit der virtuellen Maschine verbundene Host [uuid:%s] nicht mit dem SDN-Controller [uuid:%s] verbunden ist.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10028": "Verbindung zu %s konnte nicht hergestellt werden, bitte überprüfen Sie die Netzwerkkonfiguration zwischen dem ZStack-Verwaltungsknoten und dem Bare-Metal-PXE-Server", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10016": "Die Anwendungsplattform/der Endpunkt [%s] unterstützt keine benutzerdefinierten Vorlagen", + "ORG_ZSTACK_NETWORK_OVN_10022": "VMNIC konnte nicht auf L3-Netzwerk [UUID:%s] geändert werden, da der SDN-Controller [UUID:%s] nicht gefunden wurde", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10029": "Kein lokales Repository unter /opt/zstack-dvd von %s gefunden, bitte laden Sie zuerst die zStack-ISO herunter und erstellen Sie ein lokales Repository", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10015": "Ungültiger Anwendungplattformtyp[%s]", + "ORG_ZSTACK_NETWORK_OVN_10021": "L3-Netzwerk konnte nicht an VM angeschlossen werden, da der Host [uuid:%s] der VM nicht an den SDN-Controller [uuid:%s] angeschlossen ist", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10018": "Thema[uuid:%s] kann nicht gefunden werden", + "ORG_ZSTACK_NETWORK_OVN_10020": "L3-Netzwerk konnte nicht an VM angeschlossen werden, da SDN-Controller [uuid:%s] nicht gefunden wurde", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10017": "Parameter: %s werden von ZStack nicht unterstützt, verfügbare Werte für Parameter sind: %s", + "ORG_ZSTACK_NETWORK_OVN_10026": "Synchronisierung der Netzwerk-QoS-Einstellungen mit dem OVN-Controller[uuid:%s, ip:%s] fehlgeschlagen aufgrund von %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10011": "SMS-Vorlagencode sollte eine Zeichenkette mit einer Länge von 13 Zeichen sein. Der bereitgestellte Ereignisvorlagencode: [%s] hat jedoch [%d] Zeichen.", + "ORG_ZSTACK_NETWORK_OVN_10025": "Abrufen der NIC QoS vom OVN-Controller[uuid:%s, ip:%s] fehlgeschlagen aufgrund von %s", + "ORG_ZSTACK_NETWORK_OVN_10024": "Festlegen der NIC QoS auf dem OVN-Controller[uuid:%s, ip:%s] fehlgeschlagen, weil %s", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10020": "Nicht unterstützter Backup-Speichertyp für Bare-Metal-Server", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10010": "SMS-Vorlagencode-Länge sollte 13 Zeichen betragen. Empfangener Alarmvorlagencode: [%s] mit [%d] Zeichen.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10023": "PXE-Server-DHCP-Bereichs-Netzmaske %s ist für die Bereitstellung virtueller Maschinen ungültig.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10024": "PXE-Server-DHCP-Bereichs-Start %s und Bereichs-Stop %s gehören nicht zur selben Subnetzmaske.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10025": "PXE-Server mit Hostname existiert bereits.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10026": "Es existiert bereits ein Baremetal2-Gateway mit der Management-IP %s; bitte verwenden Sie es nicht, um einen Baremetal-PXE-Server zu erstellen.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10027": "storagePath muss ein absoluter Pfad sein, der den vollständigen Speicherort im virtuellen Dateisystem angibt.", + "ORG_ZSTACK_STORAGE_MIGRATION_10022": "Image[uuid:%s] wurde im Quell-Backup-Speicher[uuid:%s] nicht gefunden.", + "ORG_ZSTACK_STORAGE_MIGRATION_10023": "Image kann nicht vom Quellort zum Zielort migriert werden.", + "ORG_ZSTACK_STORAGE_MIGRATION_10020": "Quell-Block-Storage und Ziel-Block-Storage dürfen nicht deaktiviert sein.", + "ORG_ZSTACK_STORAGE_MIGRATION_10021": "Image[uuid:%s] befindet sich nicht im Status \"Bereit\" und kann daher nicht migriert werden.", + "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10001": "Der Heartbeat von Host %s wird nicht empfangen", + "ORG_ZSTACK_STORAGE_MIGRATION_10026": "Volume[uuid:%s] befindet sich nicht im Status \"Bereit\" und kann nicht migriert werden.", + "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10000": "Host-ID für Host UUID[%s] und primären Speicher UUID[%s] nicht gefunden", + "ORG_ZSTACK_STORAGE_MIGRATION_10027": "Das Root-Volume einer virtuellen Maschineninstanz kann nicht migriert werden, wenn sie sich nicht im gestoppten Zustand befindet. Bitte stellen Sie sicher, dass die Instanz gestoppt ist, bevor Sie versuchen, das Root-Volume zu migrieren.", + "ORG_ZSTACK_STORAGE_MIGRATION_10024": "Volume[uuid:%s] befindet sich bereits in Pool[uuid:%s] und kann nicht migriert werden.", + "ORG_ZSTACK_STORAGE_MIGRATION_10025": "Quell- und Ziel-PowerShell-Sitzungen dürfen sich nicht im Zustand \"Deaktiviert\" oder \"Wartung\" befinden.", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10009": "Die Länge des Alibaba Cloud SMS-Signatur sollte zwischen 2 und 12 Zeichen liegen. Erhaltene Signatur: [%s] mit [%d] Zeichen.", + "ORG_ZSTACK_STORAGE_MIGRATION_10028": "Die VM-Speichermigration wird für VM[uuid:%s, name: %s] nicht unterstützt, wenn ein gemeinsames Volume angehängt ist.", + "ORG_ZSTACK_STORAGE_MIGRATION_10029": "Das Root-Volume einer VM-Instanz mit angehängten Daten-Volumes kann nicht migriert werden. Bitte trennen Sie alle Daten-Volumes, bevor Sie das Root-Volume migrieren.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10017": "Mounten des Baremetal-Cache von Image[uuid:%s] fehlgeschlagen", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10019": "Nicht genügend Speicherplatz im Baremetal-Image-Cache für Image[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10011": "Erstellung der DHCP-Konfiguration für Chassis [uuid:%s] auf PXE-Server [uuid:%s] fehlgeschlagen", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10012": "Löschen der DHCP-Konfiguration von Chassis[uuid:%s] auf PXE-Server[uuid:%s] fehlgeschlagen", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10013": "Die UUID des Baremetal-PXE-Server-Agents hat sich geändert [erwartet: %s, tatsächlich: %s]. Dies ist höchstwahrscheinlich auf einen manuellen Neustart des Agents zurückzuführen. Bitte stellen Sie die Verbindung wieder her, um den Status zu synchronisieren.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10005": "Verzeichnis kann nicht gefunden werden: %s im Dashboard", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10016": "Verbindung zum Baremetal-PXE-Server [url:%s] nicht möglich, wegen %s", + "ORG_ZSTACK_LICENSE_10002": "Der bereitgestellte Lizenzanfrage-Code %s ist für die Cloud-Ressourcenzuweisung ungültig. Bitte überprüfen und erneut versuchen.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10003": "sqlite3-Ausführung fehlgeschlagen wegen: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10000": "nicht unterstützte Methode: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10001": "HTTP-Anfragefehler! Status-Code: %s, Fehler: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10011": "Der angehängte Ceph-Backup-Speicher unterstützt keine ISO-basierte Speichermigration.", + "ORG_ZSTACK_STORAGE_MIGRATION_10015": "Speichermigration von [%s] zu [%s] virtueller Umgebung wird nicht unterstützt", + "ORG_ZSTACK_STORAGE_MIGRATION_10016": "VM[uuid:%s] wird ausgeführt, aber Host-UUID fehlt", + "ORG_ZSTACK_STORAGE_MIGRATION_10013": "Speichermigration von [%s] zu [%s] mit Daten-Volumes wird nicht unterstützt", + "ORG_ZSTACK_STORAGE_MIGRATION_10014": "Speichermigration von [%s] zu [%s] unter Verwendung von Snapshots wird nicht unterstützt", + "ORG_ZSTACK_STORAGE_MIGRATION_10019": "Quell-BS und Ziel-BS dürfen nicht identisch sein.", + "ORG_ZSTACK_STORAGE_MIGRATION_10017": "Unterstützt nur Live-Speichermigration von Daten-Volumes unter Verwendung des dataVolumes-Parameters.", + "ORG_ZSTACK_STORAGE_MIGRATION_10018": "Live-Speichermigration von [%s] zu [%s] wird für andere Volumes als das Root-Volume nicht unterstützt", + "ORG_ZSTACK_NETWORK_OVN_10001": "Konnte VM-NIC nicht zur Sicherheitsgruppe hinzufügen, da die VM-NIC-SDN [uuid:%s] nicht mit der Sicherheitsgruppen-SDN [uuid:%s] übereinstimmt", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10006": "Fehler beim Erstellen der BM-Instanz-Nginx-Proxy auf dem Baremetal-PXE-Server [uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10000": "Konnte L3-Netzwerk nicht an Sicherheitsgruppe anhängen, da die L3-Netzwerk-SDN [uuid:%s] nicht mit der Sicherheitsgruppen-SDN [uuid:%s] übereinstimmt", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10007": "Fehler beim Löschen der BM-Instanz-Nginx-Proxy auf dem Baremetal-PXE-Server [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10008": "Fehler beim Starten des Baremetal-PXE-Servers [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10009": "Fehler beim Stoppen des Baremetal-PXE-Servers [uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10005": "Kann Sicherheitsgruppe nicht erstellen, da OVS-Controller [uuid:%s, type: %s] nicht gefunden wurde", + "ORG_ZSTACK_NETWORK_OVN_10004": "Kann Sicherheitsgruppe nicht erstellen, da OVN-Controller angegeben wurde. Bitte stellen Sie sicher, dass Sie keinen OVN-Controller angeben, wenn Sie eine Sicherheitsgruppe erstellen.", + "ORG_ZSTACK_NETWORK_OVN_10003": "Kann Host nicht löschen, da %d OVN-Controller-Instanzen auf dem Host ausgeführt werden", + "ORG_ZSTACK_NETWORK_OVN_10002": "Kann Layer-3-Netzwerk nicht erstellen, da OVN den L3-Typ: %s, Kategorie: %s nicht unterstützt", + "ORG_ZSTACK_NETWORK_OVN_10009": "Kann SDN-Host nicht hinzufügen, da Netzwerkschnittstelle [%s] nicht gefunden wurde", + "ORG_ZSTACK_NETWORK_OVN_10008": "Kann SDN-L2-Netzwerk nicht erstellen, da eine SDN-Controller-UUID fehlt. Bitte stellen Sie sicher, dass die SDN-Controller-UUID korrekt konfiguriert ist.", + "ORG_ZSTACK_NETWORK_OVN_10007": "Kann Netzwerkdienst [%s] nicht an OVS-Netzwerk anhängen", + "ORG_ZSTACK_GUESTTOOLS_PVPANIC_10000": "Virtuelle Maschinen können ohne gültigen Quell-Dateipfad nicht bereitgestellt werden", + "ORG_ZSTACK_NETWORK_OVN_10006": "Kann OVN-Netzwerkdienst nicht an Netzwerk mit vSwitchType [%s] anhängen", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10001": "Fehler beim Initialisieren der Konfigurationen auf dem Baremetal-PXE-Server [uuid:%s]", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_MARKETPLACE_10000": "filterName muss auf marketplace:true oder marketplace:false gesetzt werden, um eine ordnungsgemäße Filterung im Marketplace-Dienst zu gewährleisten.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10002": "Fehler beim Erstellen der Baremetal-Instanzkonfigurationen auf dem PXE-Server [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10003": "Fehler beim Löschen der Baremetal-Instanzkonfigurationen auf dem PXE-Server [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10004": "Fehler beim Erstellen der BM-Instanz-NOVA-Proxy auf dem Baremetal-PXE-Server [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10005": "Fehler beim Löschen der BM-Instanz-NOVNC-Proxy auf dem Baremetal-PXE-Server [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_10005": "L3Network [uuid:%s] hat den Netzwerkdienst [type:%s] nicht aktiviert oder es gibt keinen Anbieter, der diesen Netzwerkdienst anbietet.", + "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10000": "Nicht unterstützte Fähigkeit: SEND_SNS_MESSAGE", + "ORG_ZSTACK_NETWORK_SERVICE_10004": "Fehler beim Anwenden des Netzwerkdienstes [%s] auf die virtuelle Maschine [uuid: %s]", + "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10001": "Fehler beim Senden der SNS-Benachrichtigung auf Plugin %s", + "ORG_ZSTACK_NETWORK_SERVICE_10007": "Netzwerkdienst für Anbieter [uuid:%s] muss definiert werden", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10021": "Kein Baremetal2-Bereitstellungsnetzwerk im Cluster gefunden [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10020": "Es wurde kein verwendbarer Baremetal2-Gateway im Cluster gefunden [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_10001": "L3Network [UUID: %s] hat keinen Host-Route-Dienst konfiguriert.", + "ORG_ZSTACK_NETWORK_SERVICE_10000": "L3Network [UUID: %s] liefert einen Null-Typ", + "ORG_ZSTACK_LICENSE_10019": "Unerwarteter Host-Anbieter für MINI VM-Vorlage", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10022": "baremetal2-Bereitstellungsnetzwerk [uuid:%s] ist nicht verwendbar; stellen Sie sicher, dass es aktiviert ist.", + "ORG_ZSTACK_NETWORK_SERVICE_10009": "Netzwerkdienstanbieter mit UUID [%s] bietet keine Dienste für %s", + "ORG_ZSTACK_NETWORK_OVN_10052": "Fehler beim Löschen des OVS-Ports zum Host [uuid:%s] für NICs [%s], Fehler: %s", + "ORG_ZSTACK_NETWORK_SERVICE_10008": "Netzwerkdienstanbieter [uuid:%s] kann nicht gefunden werden oder bietet keine Dienste", + "ORG_ZSTACK_NETWORK_OVN_10051": "Fehler beim Löschen des OVS-Ports auf Host [UUID:%s] für NICs [%s], Fehler: %s", + "ORG_ZSTACK_NETWORK_OVN_10050": "Fehler beim Synchronisieren des OVS-Ports mit Host [uuid:%s] für Netzwerkschnittstellen [%s], Fehler: %s", + "ORG_ZSTACK_NETWORK_OVN_10056": "Abfragestatus des Clusters zur Überprüfung, ob Knoten entfernt wurden, Fehler %s", + "ORG_ZSTACK_NETWORK_OVN_10055": "Fehler beim Synchronisieren der Quality of Service-Einstellungen zum OVN-Controller [uuid:%s, ip:%s], Fehler: %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORK_10000": "VXLAN-Netzwerk für virtuelle Maschine [uuid:%s] kann nicht auf dem Zielhost [uuid:%s] konfiguriert werden", + "ORG_ZSTACK_NETWORK_OVN_10054": "Fehler beim Festlegen des angeforderten OVS-Port-Chassis für Host [uuid:%s] von LSP [%s], Fehler: %s", + "ORG_ZSTACK_NETWORK_OVN_10053": "Fehler beim Festlegen des angeforderten OVS-Port-Chassis auf Host [uuid:%s] für LSP [%s], Fehler: %s", + "ORG_ZSTACK_NETWORK_OVN_10059": "Fehler beim Hinzufügen von DHCP-Optionen zum OVN-Controller [uuid:%s, ip:%s], wegen %s", + "ORG_ZSTACK_NETWORK_OVN_10058": "Leeres Clusterstatusergebnis vom Agenten erhalten; bitte überprüfen Sie die Konfiguration und Konnektivität des Agenten.", + "ORG_ZSTACK_NETWORK_OVN_10057": "Fehler beim Abrufen des Clusterstatus: %s", + "ORG_ZSTACK_NETWORK_SERVICE_10010": "Ein Netzwerkdienst [%s] wurde an ein Layer-3-Netzwerk [UUID: %s] angehängt.", + "ORG_ZSTACK_LICENSE_10023": "Fehler beim Löschen der Lizenz für virtuelle Maschine %s aufgrund eines unbekannten Fehlers. Bitte wenden Sie sich an den Support.", + "ORG_ZSTACK_LICENSE_10003": "Der angegebene Zeitstempel ist ungültig. Bitte stellen Sie sicher, dass er dem ISO-8601-Standard entspricht (JJJJ-MM-DDTHH:mm:ss).", + "ORG_ZSTACK_LICENSE_10004": "Unerwartete dekodierte Lizenzdateilänge: %d. Erwartet wurde eine gültige Länge für Cloud-Computing-Dienste.", + "ORG_ZSTACK_LICENSE_10005": "Dekodierung fehlgeschlagen wegen %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10010": "Kein verfügbares physisches Server-Chassis in baremetal2-Clustern gefunden [uuids:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_10012": "networkServices darf nicht leer sein", + "ORG_ZSTACK_NETWORK_SERVICE_10011": "Es sind nicht genügend IP-Adressen für die Zuweisung verfügbar, wenn der DHCP-Dienst an das L3-Netzwerk [uuid:%s] angehängt wird.", + "ORG_ZSTACK_NETWORK_SERVICE_10014": "NetworkService Dhcp Backend kann nicht gefunden werden [Anbietertyp: %s]", + "ORG_ZSTACK_NETWORK_OVN_10062": "Fehler beim Pingen des OVN-Controllers [uuid:%s, ip:%s], wegen %s", + "ORG_ZSTACK_NETWORK_OVN_10061": "Befehl kann nicht an OVN-Controller [uuid:%s, ip:%s] gesendet werden, NfvInstanceGroup [uuid:%s, name:%s] Status ist %s, nur gesunde oder degradierte Gruppen können Befehle annehmen", + "ORG_ZSTACK_NETWORK_OVN_10060": "OVN-Controller [uuid:%s] ist nicht verbunden, aktueller Status: %s", + "ORG_ZSTACK_NETWORK_OVN_10067": "IP [%s] ist keine gültige virtuelle IP in der aktuellen Umgebung. Bitte verwenden Sie die virtuelle IP-Adresse einer NFV-Instanzgruppe.", + "ORG_ZSTACK_NETWORK_OVN_10066": "Virtuelle Maschine [uuid:%s] kann nicht gefunden werden", + "ORG_ZSTACK_NETWORK_OVN_10064": "Virtuelle Maschinennetzwerkschnittstelle [internalName:%s] kann nicht gefunden werden", + "ORG_ZSTACK_NETWORK_OVN_10069": "Ping des SDN-Controllers fehlgeschlagen, Fehler: %s", + "ORG_ZSTACK_NETWORK_OVN_10068": "IP [%s] ist keiner OVN SDN Controller NFV Instance Group zugeordnet. Bitte verwenden Sie die VIP-Adresse einer OVN Controller NFV Instance Group.", + "ORG_ZSTACK_CORE_10000": "Kein Executor für Ressource UUID[%s] gefunden", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10016": "Bond-Name %s existiert bereits", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10018": "Baremetal2-Chassis mit UUID [%s] kann nicht gefunden werden, möglicherweise existiert es nicht", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10017": "NIC mit MAC-Adresse wurde bereits gebondet", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10000": "Validierung von universal SMS mit Anbieter[%s] fehlgeschlagen", + "ORG_ZSTACK_LICENSE_10037": "MN[uuid:%s]: CloudInstanceNotDefinedException", + "ORG_ZSTACK_LICENSE_10038": "Es existieren mehrere Management Nodes, aber nur Lizenzen für %s sind bereitgestellt.", + "ORG_ZSTACK_LICENSE_10039": "MN HA-Umgebung, aber nur aktualisierte Lizenz für %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10001": "Die CPU-Architektur des Hosts [arch:%s] und des Clusters [arch:%s] stimmen nicht überein", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10000": "Falsches Format für Baremetal2-Chassis-Hardwareinformationen: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10003": "Falsches Format für Baremetal2-Chassis-NIC-Hardwareinformationen: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10002": "Nur Baremetal2-Chassis mit Boot-Modus %s werden unterstützt", + "ORG_ZSTACK_NETWORK_OVN_10032": "Konfiguration der OVN-Clusterknoten für NFV-Instanz [UUID:%s] fehlgeschlagen, weil %s", + "ORG_ZSTACK_NETWORK_OVN_10031": "Keine Instanzen in NfvInstanceGroup[uuid:%s] gefunden", + "ORG_ZSTACK_NETWORK_OVN_10038": "Trennung der NfvInstance[uuid:%s] fehlgeschlagen, da Instanz nicht gefunden", + "ORG_ZSTACK_NETWORK_OVN_10035": "L2-Netzwerk [UUID:%s] ist keinem SDN-Controller zugeordnet", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10005": "Falsches Format für Baremetal2-Chassis-Disk-Hardwareinformationen: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10004": "Es muss genau ein Provision NIC mit einem BareMetal2-Chassis verbunden sein.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10006": "Ein virtueller Computer mit einer doppelten MAC-Adresse wurde auf einem anderen Compute-Knoten erkannt. Bitte beheben Sie diesen Konflikt.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10009": "Keine verfügbaren physischen Serverressourcen für baremetal2-Deployment gefunden.%s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10008": "BareMetal2 Chassis[uuid:%s] existiert nicht oder ist deaktiviert", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10002": "Ungültiger Anbieter[%s]", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10001": "Validierung von universal SMS für Cloud-Service-Instanz %s fehlgeschlagen", + "ORG_ZSTACK_CORE_GC_10001": "Ein abgeschlossener Garbage-Collection-Job kann nicht ausgelöst werden[uuid:%s, name:%s]", + "ORG_ZSTACK_LICENSE_10046": "Lizenzdatei[uuid:%s, type:%s] kann nicht am angegebenen Pfad %s gefunden werden", + "ORG_ZSTACK_LICENSE_10028": "Lizenz für Modul %s konnte nicht widerrufen werden", + "ORG_ZSTACK_LICENSE_10029": "UKey nicht unterstützt (Architektur: %s)", + "ORG_ZSTACK_NETWORK_OVN_10041": "L3-Netzwerk konnte nicht an Sicherheitsgruppe angehängt werden, da SDN-Controller [uuid:%s] nicht gefunden wurde", + "ORG_ZSTACK_NETWORK_OVN_10040": "Management-IP für das Trennen der NFVI-Instanz nicht gefunden [UUID:%s]", + "ORG_ZSTACK_NETWORK_OVN_10045": "Open vSwitch-Dienst auf Host konnte nicht gestartet werden[uuid:%s], Fehler: %s", + "ORG_ZSTACK_NETWORK_OVN_10043": "OVS-Paket konnte nicht auf Host installiert werden[uuid:%s], Fehler: %s", + "ORG_ZSTACK_NETWORK_OVN_10042": "L3-Netzwerk konnte nicht an Sicherheitsgruppe angehängt werden, da SDN-Controller [uuid:%s] nicht verbunden ist [status:%s]", + "ORG_ZSTACK_NETWORK_OVN_10049": "OVS-Port auf Host konnte nicht synchronisiert werden [UUID:%s] für Netzwerkschnittstellen [%s], Fehler: %s", + "ORG_ZSTACK_NETWORK_OVN_10048": "OVS-Port konnte nicht zu Host hinzugefügt werden [UUID:%s] für NICs [%s], Fehler: %s", + "ORG_ZSTACK_NETWORK_OVN_10047": "OVS-Port auf Host konnte nicht hinzugefügt werden [UUID:%s] für NICs [%s], Fehler: %s", + "ORG_ZSTACK_LICENSE_10030": "Lokaler UKey-Lizenzschlüssel nicht gefunden oder konnte nicht erfolgreich aktualisiert werden. Bitte stellen Sie sicher, dass Ihr UKey ordnungsgemäß angeschlossen und für Cloud-Computing-Dienste lizenziert ist.", + "ORG_ZSTACK_LICENSE_10031": "lokale virtuelle Maschinenlizenz aktualisieren: %s", + "ORG_ZSTACK_LICENSE_10032": "Keine verfügbare Compute-Instanz zum Aktualisieren des UKey verfügbar", + "ORG_ZSTACK_GUESTTOOLS_KVM_10001": "Gast-Tools in virtueller Maschine konnten nicht getrennt werden[uuid:%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10000": "Gast-Tools-Informationen konnten nicht von VM abgerufen werden[uuid:%s], Grund:%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10033": "PCI-Geräte-ID[%s] ist keine gültige ganze Zahl in Tag[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10034": "mdev-Gerätespezifikation mit UUID [%s] existiert nicht", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10031": "PCI-Geräte-ID fehlt in Tag[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10032": "PCI-Geräte-ID muss größer als 0 sein in Tag[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10030": "PCI-Gerätespezifikation [uuid:%s] existiert nicht, abgeleitet von Tag [%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10006": "Gast-Tools-Status konnte nicht von Prometheus abgerufen werden: [metric=%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10005": "Gast-Tools-ISO konnte nicht von VM getrennt werden[UUID:%s], Grund:%s", + "ORG_ZSTACK_GUESTTOOLS_KVM_10004": "Gast-Tools-ISO konnte nicht an VM angehängt werden[UUID:%s], Grund:%s", + "ORG_ZSTACK_GUESTTOOLS_KVM_10003": "Gast-Tools-ISO konnte nicht heruntergeladen werden, da kein KVM-Host [uuid:%s] gefunden wurde", + "ORG_ZSTACK_LICENSE_10048": "Lizenzablauf: Ihre Lizenz für die Cloud-Computing-Umgebung ist abgelaufen. Bitte kontaktieren Sie den Support, um Ihre Lizenz zu erneuern.", + "ORG_ZSTACK_LICENSE_10049": "nicht unterstützt: Lizenz[%s] von Hardware-Schlüssel löschen", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10024": "Keine PCI-Gerätespezifikation für virtuelle Maschine verfügbar[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10025": "PCI-Gerätespezifikation [uuid:%s] ist nicht für virtuelle Maschine verfügbar [uuid:%s].", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10023": "PCI-Gerätespezifikation für VM konnte nicht abgerufen werden[uuid:%s]: %s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10020": "VM-Instanz [uuid:%s, state:%s] muss heruntergefahren werden, um mdev-Gerätespezifikation zu entfernen [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10027": "Volume[uuid:%s, installPath:%s] nicht in Verzeichnis %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10026": "Host[uuid:%s] könnte Speicher montiert haben, der von der Speicherverwaltungsrichtlinie[uuid:%s] abweicht, bitte überprüfen Sie dies.", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10024": "Hosts[uuid:%s] haben denselben Mount-Pfad, sind aber tatsächlich auf verschiedenen Speicher montiert.", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10028": "mdev-Gerätespezifikation [uuid:%s] ist nicht verfügbar für virtuelle Maschine [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10029": "PCI-Gerätespezifikation UUID fehlt in Tag[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10026": "Keine mdev-Gerätespezifikation verfügbar für virtuelle Maschine[uuid:%s]", + "ORG_ZSTACK_LICENSE_10050": "Hybrid-Plattformlizenz wird bereits verwendet. Bitte entfernen Sie die Hybrid-Plattformlizenz und die Hybrid-Add-ons-Lizenz gleichzeitig mit DeleteLicenseAction mit Hybrid-Lizenz UUID[uuid=%s].", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10011": "vm[uuid:%s] hat keine PCI-Gerätespezifikation[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10012": "VM-Instanz [UUID: %s, state: %s] muss heruntergefahren werden, um PCI-Gerätespezifikation zu entfernen [UUID: %s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10019": "vm[uuid:%s] hat keine mdev-Gerätespezifikation[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10017": "vm[uuid:%s] hat bereits eine mdev-Gerätespezifikation[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10018": "VM-Instanz [uuid:%s, state:%s] muss gestoppt werden, um mdev-Gerätespezifikation zu setzen", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10015": "VM-Instanz [uuid:%s, state:%s] muss gestoppt werden, um PCI-Gerätespezifikationen zu setzen", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10009": "Affinitätsgruppe [uuid:%s] kann nicht gefunden werden, sie wurde möglicherweise gelöscht oder beendet", + "ORG_ZSTACK_COMPUTE_VM_10309": "IP[%s] ist im VPC-Netzwerk[uuid:%s] nicht verfügbar, weil: %s", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10006": "Es befinden sich andere virtuelle Maschinen auf diesem Host [uuid: %s], die zur selben Affinitätsgruppe [%s] gehören.", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10005": "VM [uuid: %s] wurde bereits der Affinitätsgruppe [uuid: %s] zugewiesen", + "ORG_ZSTACK_COMPUTE_VM_10307": "Das statische IP-Adressenformat[%s] ist fehlerhaft", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10008": "vm [uuid:%s] erfüllt nicht die Affinitätsgruppe [uuid:%s]", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10007": "Affinitätsgruppe [uuid:%s] konnte Host [uuid:%s] nicht für virtuelle Maschine [uuid:%s] reservieren", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10003": "Es kann nur jeweils eine UUID von Cluster, Host oder VM gleichzeitig angegeben werden.", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10008": "vm[uuid:%s] hat bereits eine PCI-Gerätespezifikation[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10006": "VM muss pausiert werden, um PCI-Gerätespezifikation zu setzen: uuid=%s, state=%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10007": "Ungültiger PCI-Gerätetyp: %s, gültige Typen für Cloud-Virtualisierungsumgebungen umfassen: %s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10004": "Keine aktivierte Compute-Ressource gefunden", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10001": "System-Tag[%s] kann nicht gelöscht werden. Das Load Balancer-Plugin ist davon abhängig; Sie können es nur aktualisieren.", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10002": "Affinitätsgruppe [uuid: %s] existiert nicht", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10002": "NIC mit UUID %s nicht gefunden. Bitte korrigieren Sie Ihr Netzwerk-Tag %s des Load Balancers.", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10001": "VM [uuid: %s] ist bereits mit Affinitätsgruppe [uuid: %s] verknüpft", + "ORG_ZSTACK_COMPUTE_VM_10303": "Priorität von vm[%s] auf [%s] konnte nicht aktualisiert werden wegen: %s", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10004": "Affinitätsgruppe [uuid: %s] kann nicht betrieben werden, da sie in der Cloud-Umgebung nicht aktiviert ist", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10000": "Load Balancer[uuid:%s] kann nicht gefunden werden", + "ORG_ZSTACK_COMPUTE_VM_10302": "VM[uuid:%s] kann nur %s CD-ROM-Geräte anschließen", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10003": "Kann nicht auf Affinitätsgruppe zugreifen, die vom System erstellt wurde. Bitte wenden Sie sich an den Support.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10005": "ungültiger Balance-Algorithmus[%s], gültige Algorithmen sind %s", + "ORG_ZSTACK_COMPUTE_VM_10301": "VM[uuid:%s] hat bereits ein ISO[uuid:%s] angehängt", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10006": "ungültiger unhealthy threshold[%s], Wert muss eine Zahl sein", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10003": "ungültiges Load Balancer-Gewicht[%s], Instance-ID liegt nicht im Bereich [%d, %d]", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10000": "VM kann seine Affinitätsgruppe nur in den States [%s,%s] ändern, aber die VM befindet sich derzeit im State [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10004": "ungültiges Balancer-Gewicht[%s], Wert ist keine Zahl", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10009": "ungültige Connection Idle Timeout[%s], bitte stellen Sie sicher, dass %s ein numerischer Wert ist", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10007": "ungültiger healthy threshold[%s], bitte geben Sie einen numerischen Wert ein", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10008": "ungültige healthy timeout[%s], bitte stellen Sie sicher, dass %s ein numerischer Wert ist", + "ORG_ZSTACK_TICKET_IAM2_10002": "Operation verweigert, da Flow Collection [uuid:%s] nicht zum Projekt [uuid:%s] gehört", + "ORG_ZSTACK_TICKET_IAM2_10003": "die virtuelle Instance-ID [uuid:%s] ist nicht autorisiert, das Ticket [uuid:%s, name:%s] zu verwalten", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10004": "Kafka Topics dürfen nicht null sein. Bitte stellen Sie sicher, dass der Topic-Name korrekt konfiguriert ist.", + "ORG_ZSTACK_TICKET_IAM2_10000": "Operation verweigert aufgrund der Löschung des Ticket-Einreichers [uuid:%s]; nur die Löschung des Tickets [uuid:%s, name:%s] ist jetzt zulässig", + "ORG_ZSTACK_TICKET_IAM2_10001": "Operation verweigert, da das mit dem Ticket verbundene Projekt [UUID:%s] gelöscht wurde. Das Ticket [UUID:%s, name:%s] kann jetzt nur noch gelöscht werden.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10001": "Syslog-Modus darf nicht null sein", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10000": "Der Index für die Cloud-Instanz darf nicht null sein. Bitte geben Sie einen gültigen Indexwert an.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10003": "Das Format der Loki-Labels sollte key=value sein", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10002": "Loki-Labels dürfen nicht null sein. Bitte stellen Sie sicher, dass alle Label-Werte korrekt definiert sind.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10018": "vxLAN VTEP-Adresse für Host [UUID: %s] und Network Pool [UUID: %s] existiert bereits", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10017": "%s ist keine gültige IPv4-Adresse", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10016": "ip[%s] l2NetworkUuid[%s] clusterUuid[%s] IP-Adresse existiert in lokaler VTEP-Tabelle", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10021": "kann VNI-Bereich nicht erstellen, da L2 UUID[%s] nicht Teil des VXLAN Network Pools ist", + "ORG_ZSTACK_ALIYUN_CORE_IDENTITYZONE_10000": "muss zoneId für private Aliyun VPC-Netzwerke angeben", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10012": "ungültige Instance-ID[%s], %s ist keine gültige Instance-Kennung", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10010": "ungültiges Health Check-Intervall[%s], Wert muss eine Zahl sein", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10011": "ungültiger Maximum-Connection-Wert[%s], bitte stellen Sie sicher, dass %s ein numerischer Wert ist", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10016": "ungültiges Health-Check-Target[%s], Port[%s] muss ein numerischer Wert sein", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10017": "VIP konnte nicht an Load Balancer angehängt werden, da VIP[%s] keine zugeordnete IP-Adresse hat", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10014": "ungültiges Health-Check-Target[%s], das Prüfprotokoll[%s] ist ungültig, gültige Protokolle sind %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10015": "Ungültiges Health-Check-Ziel[%s], Port[%s] liegt nicht im gültigen Bereich von [1, 65535]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10018": "Fehler beim Hinzufügen von IPv4 VIP zum Load Balancer, da Load Balancer[%s] bereits eine IPv4 VIP[%s] hat", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10009": "Fehler beim Realisieren des VXLAN-Netzwerk-Pools[uuid:%s, type:%s] auf KVM-Host[uuid:%s], weil %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10019": "Fehler beim Hinzufügen von IPv6 VIP zum Load Balancer, da Load Balancer[%s] bereits eine IPv6 VIP[%s] hat", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10004": "Fehler beim Erstellen der Bridge[%s] für l2Network[uuid:%s, type:%s, vni:%d] auf KVM-Host[uuid:%s], weil %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10003": "Fehler beim Finden von VTEP auf Host[UUID: %s], bitte hängen Sie den VXLAN-Pool[UUID: %s] erneut an den Cluster an.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10002": "Mehrere VTEP-IP-Adressen [%s] für einen Host [UUID:%s] gefunden. Bitte löschen Sie den Host und fügen Sie ihn erneut hinzu.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10008": "Fehler beim Validieren von cidr[%s] für l2VxlanNetworkPool[uuid:%s, name:%s] auf KVM-Host[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10007": "Fehler beim Löschen der Bridge[%s] für l2Network[uuid:%s, type:%s, vni:%s] auf KVM-Host[uuid:%s], wegen %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10006": "Fehler beim Validieren von cidr[%s] für l2VxlanNetwork[uuid:%s, name:%s] auf KVM-Host[uuid:%s], %s", + "ORG_ZSTACK_CRYPTO_CCS_10001": "Benutzer[uuid=%s] existiert nicht in der Cloud-Umgebung", + "ORG_ZSTACK_CRYPTO_CCS_10002": "Die Zertifikats-UUID fehlt und das UKey-System-Tag existiert nicht. Bitte stellen Sie sicher, dass beide korrekt konfiguriert sind.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10020": "Cloud kann vip[%s] nicht löschen", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10023": "Dienstleister-Typ-Konflikt erkannt. Der Load Balancer [uuid:%s] wird vom Dienstleister [type:%s] bereitgestellt, aber ein neuer Dienstleister vom Typ [type:%s] wird versucht.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10024": "Es existiert bereits ein Listener mit demselben Port [%s] und demselben Load Balancer [UUID:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10022": "Dienstleister-Typ für Load Balancer Listener [uuid:%s] kann nicht abgerufen werden", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10027": "Ungültiges Balancer-Gewicht für Netzwerkschnittstelle: %s, %d liegt nicht im gültigen Bereich [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10028": "Konnte VMNIC-Kandidaten nicht abrufen, da sowohl Load Balancer UUID als auch Servergruppen-UUID nicht angegeben sind. Bitte stellen Sie sicher, dass diese Kennungen korrekt angegeben sind.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10026": "Ungültige Health-Checking-Parameter[%s], das Format sollte method:URI:status_codes sein, zum Beispiel GET:/index.html:http_2xx", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10029": "Konnte Layer-3-Netzwerk-Kandidaten nicht abrufen, da sowohl Load Balancer UUID als auch Servergruppen-UUID nicht angegeben sind.", + "ORG_ZSTACK_CRYPTO_CCS_10008": "Zertifikat[uuid=%s] im Zertifikatsspeicher nicht gefunden", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10030": "Konnte VM NIC nicht von Load Balancer Listener[uuid:%s] trennen, da die dem Listener zugeordnete Standard-Servergruppe gelöscht wurde", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10031": "Konnte Load Balancer nicht erstellen, da VIP- und IPv6-VIP-Parameter leer sind. Bitte gültige IP-Adressen angeben.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10034": "Load Balancer VIP [%s] darf nicht die erste oder letzte IP-Adresse innerhalb eines CIDR-Blocks sein, der einem öffentlichen Adresspool-Typ zugeordnet ist.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10035": "Cloud konnte Loadbalancer nicht erstellen, da Param vipUuid auf VIP[%s] zeigt, die keine IPv4-Virtuelle-Machine-Schnittstelle ist", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10032": "Konnte Load Balancer nicht erstellen, da das L3-Netzwerk der VIP und IPv6 VIP nicht dasselbe L3-Netzwerk sind. Bitte stellen Sie sicher, dass sie sich im selben L3-Netzwerk befinden.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10033": "Die VIP [UUID:%s] wurde von einer anderen Netzwerkdienst-Entität [%s] belegt.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10038": "Operationsfehler, doppelte/überlappende IP-Einträge in %s der Zugriffskontrolllisten-Gruppe:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10039": "Operationsfehler, IP-Format unterstützt nur ip/iprange/cidr, aber %s gefunden", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10036": "Cloud konnte Load Balancer nicht erstellen, da Parameter ipv6VipUuid auf VIP [%s] zeigt, die keine IPv6 VIP ist", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10037": "Betrieb fehlgeschlagen, IP-Version %d wird nicht unterstützt.", + "ORG_ZSTACK_VPC_HA_10001": "Netzwerkdienst konnte nicht aktualisiert werden, da VPC [UUID:%s] keine Aktualisierungen der Netzwerkdienstversion unterstützt.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10025": "L2Network[uuid:%s] ist nicht vom Typ L2VxlanNetwork.", + "ORG_ZSTACK_VPC_HA_10002": "Netzwerkdienst konnte nicht aktualisiert werden, da VPC [UUID:%s] eine veraltete Kernel-Version verwendet:[%s].", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10024": "vlan[%s] ist keine gültige VNI.", + "ORG_ZSTACK_VPC_HA_10003": "Source NAT konnte nicht angewendet werden, da das Feature multi-SNAT deaktiviert ist und das öffentliche Netzwerk nicht dem Standard entspricht.", + "ORG_ZSTACK_VPC_HA_10004": "SNAT konnte nicht mit diesem L3-Netzwerk angewendet werden, da L3-Netzwerk [uuid:%s] ein privates Netzwerk ist.", + "ORG_ZSTACK_VPC_HA_10005": "SNAT konnte nicht mit diesem L3-Netzwerk angewendet werden, da L3-Netzwerk [uuid:%s] nicht an einen VPC-Router angeschlossen ist.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10029": "falsches CIDR-Format in System-Tag [%s].", + "ORG_ZSTACK_VPC_HA_10006": "ungültige Cloud-Monitor-IP-Adresse [%s].", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10028": "falsches System-Tag [%s], sollte eines der folgenden sein: [EC2, GCE, AWS_VPC].", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10027": "Bitte geben Sie ein System-Tag ein wie: [%s].", + "ORG_ZSTACK_VPC_HA_10008": "vpcHaRouter [uuid:%s] wurde gelöscht.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10042": "Sicherheitsgruppe [%s] mit unterschiedlicher IP-Version kann nicht an LoadBalancer [%s] angehängt werden.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10031": "vXLAN-Netzwerk-Pool unterstützt keine Erstellung von L3-Netzwerken.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10040": "IP-Bereich [%s, %s] überschneidet sich mit Start-IP: %s und End-IP: %s der Zugriffskontrolllisten-Gruppe: %s.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10030": "VNI-Bereich überschneidet sich mit %s [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10045": "Umleitungs-Zugriffskontrolllisten-Gruppen[uuid:%s] können nur einem Load-Balancer-Listener zugeordnet werden und müssen einer Server-Gruppe zugewiesen werden.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10046": "Zuordnung von Zugriffskontrolllisten-Gruppen[uuid:%s] zu Load-Balancer-Listener[uuid:%s] muss entweder HTTPS oder HTTP sein.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10043": "domain[%s], url[%s] doppelte/überschneidende Umleitungsregel mit Zugriffskontrolllisten-Gruppe:%s.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10044": "Zugriffskontrolllisten-Gruppen[uuid:%s] sind für Weiterleitung konfiguriert, aber einige Zugriffskontrolllisten-Einträge lacken eine Weiterleitungsregel und enthalten IP-Einträge.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10049": "Zugriffskontrolllisten-Gruppen[uuid:%s] wurden bereits an einen anderen Load-Balancer-Listener[uuid:%s] angehängt.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10048": "Zugriffskontrolllisten-Gruppen[uuid:%s] enthalten keine Weiterleitungsregel.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10001": "Dem Konto sind keine VIPs zugewiesen.", + "ORG_ZSTACK_COMPUTE_VM_10239": "CreateVmInstanceMsg darf nicht null sein. Stellen Sie sicher, dass die Anforderungsnachricht ordnungsgemäß initialisiert ist, bevor Sie die Anforderung senden.", + "ORG_ZSTACK_COMPUTE_VM_10237": "zoneUuid muss angegeben werden, da sich das Image auf mehreren Backup-Speichern befindet.", + "ORG_ZSTACK_COMPUTE_VM_10236": "keine Layer2-Netzwerke in Clustern gefunden, die an Primärspeicher[uuids:%s] angeschlossen sind.", + "ORG_ZSTACK_COMPUTE_VM_10235": "Die Primärspeicher mit UUIDs:%s haben keine Cluster in der Zone mit UUID:%s angeschlossen.", + "ORG_ZSTACK_COMPUTE_VM_10234": "kein für Backup-Speicher[uuid:%s, type:%s] zugänglicher Primärspeicher gefunden.", + "ORG_ZSTACK_COMPUTE_VM_10233": "Das Image mit UUID [uuid:%s] ist nicht auf einem Backup-Speicher gespeichert, der an die Zone mit UUID [uuid:%s] angeschlossen ist.", + "ORG_ZSTACK_COMPUTE_VM_10232": "Spice TLS-Zertifikat existiert nicht. Bitte überprüfen Sie, ob Spice TLS aktiviert ist.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10002": "Virtuelle Router-Instanz kann nicht erstellt werden, da das virtuelle Router-Netzwerk mit einem privaten Netzwerk in der IP-Konfiguration überlappt.%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10001": "Löschen der Virtual Router Bootstrap ISO[%s] auf KVM-Host[uuid:%s] für virtuellen Router[uuid:%s] fehlgeschlagen, weil %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10000": "Erstellen der Virtual Router Bootstrap ISO[%s] auf KVM-Host[uuid:%s, ip:%s] für virtuellen Router[uuid:%s] fehlgeschlagen, weil %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10005": "Das Netzwerk der virtuellen Router-Instanz mit UUID:%s darf nicht mit dem privaten L3-Netzwerk UUID:%s identisch sein", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10004": "Virtuelles Router-Instanzangebot mit UUID:%s wurde nicht gefunden", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10009": "IP-Bereich kann nicht hinzugefügt werden, da L3-Netzwerk [UUID:%s] ein Management-Netzwerk des virtuellen Routers ist", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10008": "IP-Bereich kann nicht hinzugefügt werden, da L3-Netzwerk [UUID:%s] ein Management-Netzwerk eines virtuellen Router-Angebots ist", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10007": "Starten des virtuellen Router L3 fehlgeschlagen [UUID: %s]", + "ORG_ZSTACK_COMPUTE_VM_10242": "SSH-Schlüsselpaar-Behandlung fehlgeschlagen bei der VM-Erstellung, weil [%s]", + "ORG_ZSTACK_COMPUTE_VM_10241": "System-Tag-Behandlung fehlgeschlagen bei der VM-Erstellung, weil [%s]", + "ORG_ZSTACK_COMPUTE_VM_10240": "Instanziieren des System-Tags für virtuelle Maschine fehlgeschlagen, weil %s", + "ORG_ZSTACK_COMPUTE_VM_10249": "cpuCores muss ein gültiger Integer-Wert sein", + "ORG_ZSTACK_COMPUTE_VM_10248": "cpuSockets muss eine positive Ganzzahl sein, die die Anzahl der CPU-Sockets darstellt.", + "ORG_ZSTACK_COMPUTE_VM_10247": "Ungültiges Boot-Gerät[%s] in Boot-Order-Liste[%s]", + "ORG_ZSTACK_COMPUTE_VM_10246": "Konflikt für Hostname in System-Tags erkannt; eine andere VM mit UUID %s hat bereits den Hostname %s auf L3-Netzwerk UUID %s", + "ORG_ZSTACK_COMPUTE_VM_10245": "Nur ein Hostname-System-Tag ist erlaubt, aber %s empfangen", + "ORG_ZSTACK_COMPUTE_VM_10244": "Hostname[%s] im System-Tag ist kein gültiger Domainname", + "ORG_ZSTACK_COMPUTE_VM_10243": "Diese Funktion kann nicht aktiviert werden. Die virtuelle Maschine [uuid: %s] hat mehrere Netzwerkschnittstellenkarten (NICs), die mit dem L3-Netzwerk [uuid: %s] verbunden sind.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10013": "Aktualisieren des Standardnetzwerks des virtuellen Routers [uuid:%s] fehlgeschlagen, weil %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10012": "Anhängen von virtuellen Router-Netzwerkdiensten an l3Network[uuid:%s] fehlgeschlagen. Port-Weiterleitung erfordert_snat_configuration.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10011": "Anhängen von virtuellen Router-Netzwerkdiensten an l3Network[uuid:%s] fehlgeschlagen. Wenn Elastic IP (EIP) ausgewählt ist, muss auch Source Network Address Translation (SNAT) konfiguriert werden.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10010": "Bild konnte nicht hinzugefügt werden, da System-Tag [%s] einen ungültigen Appliance-Bildtyp [%s] enthält", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10017": "Der virtuelle Router [name:%s, uuid:%s, aktueller Status:%s] ist nicht betriebsbereit und kann die erforderliche Operation nicht ausführen. Bitte erneut versuchen, wenn er läuft.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10015": "Synchronisieren von VIPs [ips: %s] auf virtuellem Router [uuid:%s] für virtuelle Router-Hot-Migration fehlgeschlagen, weil %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10014": "Ungültiger VirtualMachineType %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10000": "Ressourcenbesitzer konnte nicht geändert werden, da die virtuelle Maschineninstanz [uuid:%s] bereits mit einer Sicherheitsgruppe verknüpft wurde", + "ORG_ZSTACK_TEST_COMPUTE_HOSTALLOCATOR_10000": "Absichtlich: Diese Aktion ist beabsichtigt und entspricht dem Design unserer Cloud-Computing-Architektur. Bitte stellen Sie sicher, dass alle Konfigurationen virtueller Maschinen unseren Sicherheits- und Leistungsstandards entsprechen.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10019": "Virtueller Router[uuid:%s] hat keine Management-NIC, die einen HTTP-Aufruf an %s durchführen kann", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10018": "Virtueller Router [uuid: %s] befindet sich in einem Status %s, der keine HTTP-Aufrufe an %s durchführen kann", + "ORG_ZSTACK_COMPUTE_VM_10253": "nur ein bootMode-System-Tag ist erlaubt, aber %d Tags wurden gefunden", + "ORG_ZSTACK_COMPUTE_VM_10252": "Eine virtuelle Maschine sollte höchstens ein User-Data-System-Tag haben.", + "ORG_ZSTACK_COMPUTE_VM_10251": "Es existiert bereits ein benutzerdefiniertes System-Tag für VM[uuid: %s].", + "ORG_ZSTACK_COMPUTE_VM_10250": "cpuThreads muss ein Integer-Wert sein", + "ORG_ZSTACK_COMPUTE_VM_10259": "Ungültige USB-Umleitung[%s], %s ist kein gültiger USBRedirect-Tag", + "ORG_ZSTACK_COMPUTE_VM_10258": "Ungültiger Parameter[%s], Wert [%s] ist kein Boolean-Typ", + "ORG_ZSTACK_COMPUTE_VM_10257": "Ungültiges Format-Tag[%s]", + "ORG_ZSTACK_COMPUTE_VM_10256": "VM-Maschinentyp erfordert [q35, pcie, virtual], aber [%s] erhalten", + "ORG_ZSTACK_COMPUTE_VM_10254": "[%s], spezifiziert in System-Tag [%s], ist kein gültiger Boot-Modus für Cloud-Instance-Bereitstellung.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10020": "Netzwerkschnittstelle konnte nicht hinzugefügt werden [ip:%s, ip6:%s, mac:%s] zum virtuellen Router für virtuelle Maschine [uuid:%s ip:%s], weil %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10024": "Standard-Netzwerk konnte nicht gesetzt werden, da L3 UUID[:%s] sich auf ein Management-Netzwerk bezieht", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10023": "L3 UUID [%s] ist nicht mit virtuellem Router [UUID:%s] verknüpft", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10022": "L3 uuid[:%s] ist identisch mit dem Standard-Netzwerk des virtuellen Routers [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10021": "Server-IP konnte nicht zum Load-Balancer-Servergruppe hinzugefügt werden, da der gemeinsam genutzte Load-Balancer keinen Service-Provider hat. Bitte stellen Sie sicher, dass eine virtuelle Netzwerkschnittstelle (VMNIC) zuerst hinzugefügt wird.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10010": "VIP-Erstellung fehlgeschlagen, da die virtuelle Netzwerkversion nicht ermittelt werden konnte. Bitte überprüfen Sie Ihre Netzwerkkonfigurationseinstellungen.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10012": "Service-Provider des VIP[UUID:%s, name:%s, IP:%s] wurde auf %s gesetzt", + "ORG_ZSTACK_TICKET_EXECUTOR_10001": "Wert konnte nicht aus Event abgerufen werden: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10025": "Standard-Netzwerk konnte nicht gesetzt werden, da L3 UUID[:%s] kein öffentliches Netzwerk ist", + "ORG_ZSTACK_TICKET_EXECUTOR_10000": "Keine API-Klasse [name:%s] im angegebenen Namespace gefunden. Bitte stellen Sie sicher, dass Klassenname und Namespace korrekt sind.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10016": "VM NIC-Sicherheitsgruppe konnte nicht gesetzt werden, da VM NIC [uuid:%s] keiner Sicherheitsgruppe zugeordnet ist", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10015": "VM NIC-Sicherheitsgruppe konnte nicht gesetzt werden, da VM NIC [UUID:%s] nicht gefunden wurde", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10007": "requiredIp[%s] ist keine gültige IPv4-Adresse", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10018": "VM NIC-Sicherheitsgruppe konnte nicht gesetzt werden, da ungültige Priorität; Priorität[%d] muss größer oder gleich 1 sein", + "ORG_ZSTACK_COMPUTE_10003": "Ausgehende Bandbreite[%d] der virtuellen Maschinennetzwerkschnittstelle liegt außerhalb des gültigen Bereichs [8192, 32212254720]", + "ORG_ZSTACK_COMPUTE_VM_10264": "VM[uuid:%s, name:%s] wurde beendet", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10017": "VM NIC-Sicherheitsgruppe konnte nicht gesetzt werden, da Sicherheitsgruppe[uuid:%s] nicht gefunden wurde", + "ORG_ZSTACK_COMPUTE_10004": "Eingehende Bandbreite von VM NIC überschreitet den gültigen Bereich [8192, 32212254720]", + "ORG_ZSTACK_COMPUTE_VM_10263": "Die Ressource[uuid:%s] ist ein Root-Volume, und Sie können den Besitzer nicht direkt ändern. Ändern Sie stattdessen den Besitzer der virtuellen Maschine, zu der das Root-Volume gehört.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10009": "Erforderliche IP-Adresse [%s] ist bereits zugewiesen", + "ORG_ZSTACK_COMPUTE_10001": "VM NIC l3NetworkUuid darf nicht null sein", + "ORG_ZSTACK_COMPUTE_VM_10262": "rootDiskOfferingUuid darf nicht null sein, wenn eine VM ohne Image erstellt wird.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10008": "Es ist bereits ein VIP[%s] mit dem L3-Netzwerk[UUID:%s] verbunden.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10019": "VM-NIC-Sicherheitsgruppe konnte nicht gesetzt werden wegen doppelter Priorität; beide Sicherheitsgruppen %s und %s haben Priorität %d", + "ORG_ZSTACK_COMPUTE_10002": "l3NetworkUuid der VM-NIC ist nicht in l3[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10003": "IP konnte nicht gelöscht werden, da IP[uuid:%s] eine virtuelle IP ist", + "ORG_ZSTACK_COMPUTE_VM_10260": "Ungültige usbRedirect[%s], %s ist kein boolescher Typ", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10002": "VIP-Status kann von diesem Konto nicht abgerufen werden. Bitte überprüfen Sie Ihre Kontoberechtigungen und versuchen Sie es erneut.", + "ORG_ZSTACK_COMPUTE_10000": "Doppelte Netzwerkschnittstellen-Parameter erkannt. Bitte stellen Sie sicher, dass jede Netzwerkschnittstelle eindeutige Parameter hat.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10005": "Nicht unterstützte IP-Zuordnungsstrategie[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10004": "System-VIP kann nicht über API gelöscht werden. Bitte kontaktieren Sie den Support für Unterstützung.", + "ORG_ZSTACK_COMPUTE_VM_10269": "Die VM[UUID:%s] hat keine NIC an das L3-Netzwerk[UUID:%s] angeschlossen", + "ORG_ZSTACK_COMPUTE_10007": "VM-Netzwerktreiber %s wird noch nicht unterstützt", + "ORG_ZSTACK_COMPUTE_VM_10268": "Ein nicht erkannter Zustand der VM[uuid:%s] auf dem Host[uuid:%s] erhalten", + "ORG_ZSTACK_COMPUTE_VM_10267": "Statusprüfung der VM [uuid:%s] auf Host [uuid:%s] fehlgeschlagen, %s", + "ORG_ZSTACK_COMPUTE_10005": "Multi-Queue-Anzahl [%d] der VM-Netzwerkschnittstelle liegt außerhalb des gültigen Bereichs [1, 256]", + "ORG_ZSTACK_COMPUTE_10006": "VM-NIC von l3[uuid:%s] Status[%s] ist nicht im erwarteten Status oder %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10031": "Virtuelles Router-Angebot kann nicht erstellt werden, da das Verwaltungsnetzwerk noch kein IPv6 unterstützt", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10030": "Verwaltungsnetzwerk [uuid:%s] ist nicht in derselben Verfügbarkeitszone [uuid:%s] wie dieses Angebot, für das es erstellt werden soll.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10035": "Das L3-Netzwerk [UUID: %s] hat SNAT-Dienste aktiviert; daher kann es nicht als Verwaltungsnetzwerk verwendet werden.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10034": "Image[uuid:%s] hat ein nicht unterstütztes Format %s und kann nicht für die Konfiguration des virtuellen Routers verwendet werden", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10033": "Medientyp des Images[uuid:%s] ist %s, was nicht den Anforderungen für ein virtuelles Router-Image entspricht, dessen Medientyp %s sein muss", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10032": "Öffentliches Netzwerk mit UUID %s ist nicht in derselben Verfügbarkeitszone wie dieses Angebot, für das es erstellt werden soll.", + "ORG_ZSTACK_STORAGE_VOLUME_10087": "Das Image mit UUID [uuid:%s] und Name [name:%s] wurde aus allen Backup-Speichern gelöscht.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10039": "Das Verwaltungsnetzwerk [UUID:%s, Gateway:%s] ist nicht erreichbar", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10038": "Das Verwaltungsnetzwerk[uuid:%s] hat keinen IP-Bereich konfiguriert", + "ORG_ZSTACK_STORAGE_VOLUME_10086": "primaryStorage-Typ [%s] unterstützt noch keine gemeinsamen Volumes", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10037": "Das L3-Netzwerk mit UUID [uuid: %s] hat dieselbe Netzwerkadresse wie [uuid: %s] und kann nicht für den virtuellen Router verwendet werden.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10036": "Das L3-Netzwerk [UUID: %s] hat SNAT-Dienste aktiviert und kann nicht als öffentliches Netzwerk verwendet werden.", + "ORG_ZSTACK_STORAGE_VOLUME_10088": "Es kann kein Backup-Speicher gefunden werden, der die folgenden Bedingungen für das Image[uuid:%s] erfüllt: 1. Status ist Aktiviert 2. Status ist Verbunden 3. Ist an die Zone angehängt, in der sich der primaryStorage[uuid:%s] befindet.", + "ORG_ZSTACK_STORAGE_VOLUME_10083": "Doppelte Volume-UUIDs: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10082": "Kann nicht auf einen älteren Snapshot zurückgesetzt werden", + "ORG_ZSTACK_STORAGE_VOLUME_10085": "Holen des primären Speichertyps fehlgeschlagen", + "ORG_ZSTACK_STORAGE_VOLUME_10092": "Das Zielvolume wurde während der Volume-Erstellung gelöcht.%s", + "ORG_ZSTACK_STORAGE_VOLUME_10091": "Konflikt der primären Speicher-UUID, der primäre Speicher, der durch das Disk-Angebot angegeben ist, ist %s, und der primäre Speicher, der in den Erstellungsparametern angegeben ist, ist %s", + "ORG_ZSTACK_STORAGE_VOLUME_10093": "Es sollte nicht mehr als eine %s virtuelle Maschinen-Implementierung geben.", + "ORG_ZSTACK_STORAGE_VOLUME_10096": "ISO kann nicht auf den primären Speicher heruntergeladen werden, weil: %s", + "ORG_ZSTACK_ZDFS_10000": "Ping an zDFS fehlgeschlagen, %s", + "ORG_ZSTACK_COMPUTE_VM_10204": "Ungültiges JSON-Format, Ursache: %s", + "ORG_ZSTACK_COMPUTE_VM_10203": "l3NetworkUuids und vmNicInventories dürfen nicht beide leer sein oder gleichzeitig gesetzt sein.", + "ORG_ZSTACK_COMPUTE_VM_10200": "Volume[uuid:%s] konnte die Anforderungen nicht erfüllen [state:Enabled status:Ready]", + "ORG_ZSTACK_COMPUTE_VM_10219": "Diese API ist veraltet und wird in Cloud-Computing-Umgebungen nicht mehr unterstützt. Bitte consider using the latest available API for your operations.", + "ORG_ZSTACK_COMPUTE_VM_10218": "Das Konsolenpasswort für VM[uuid:%s] kann nicht aktualisiert werden, da derzeit kein Konsolenpasswort konfiguriert ist.", + "ORG_ZSTACK_ZDFS_10002": "Es gab ein ZDFS-Problem mit dem Hostname[%s]", + "ORG_ZSTACK_ZDFS_10001": "Verbindung zu zDFS fehlgeschlagen, %s", + "ORG_ZSTACK_COMPUTE_VM_10217": "Das Konsolenpasswort für VM[uuid:%s] kann nicht aktualisiert werden, da es sich nicht im Status 'Running' befindet. Aktueller Status ist '%s'.", + "ORG_ZSTACK_COMPUTE_VM_10216": "Das Konsolenpasswort darf nicht mit \"password\" beginnen, um potenzielle VNC-Sicherheitslücken zu vermeiden.", + "ORG_ZSTACK_COMPUTE_VM_10215": "Das gleiche ISO-Datei mehrfach einzuhängen ist nicht erlaubt", + "ORG_ZSTACK_COMPUTE_VM_10214": "Die virtuelle Maschine mit UUID [uuid=%s] existiert nicht", + "ORG_ZSTACK_COMPUTE_VM_10220": "Das CdRom[%s] ist bereits das Standardlaufwerk", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10002": "Der Hostname für Ihre Cloud-Instanz darf nicht null sein. Bitte geben Sie einen gültigen Hostname an.", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10000": "facilityId darf nicht null sein", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10001": "Ungültige Logging-Einrichtung %s", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10006": "Syslog-Server[Adresse: %s] ist nicht verfügbar", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10007": "Syslog-Server[Adresse: %s:%s] ist nicht verfügbar", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10004": "Das Protokoll darf nicht null sein. Bitte stellen Sie sicher, dass ein gültiges Protokoll angegeben wird.", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10005": "Nicht unterstütztes Protokoll %s in Cloud-Computing-Umgebung", + "ORG_ZSTACK_COMPUTE_VM_10228": "Erwartete Unicast-MAC-Adresse, Multicast-MAC-Adresse gefunden [%s]", + "ORG_ZSTACK_COMPUTE_VM_10227": "Nicht erlaubte Netzwerkadresse %s für Instanz %d", + "ORG_ZSTACK_COMPUTE_VM_10226": "Ungültige MAC-Adresse [%s]", + "ORG_ZSTACK_COMPUTE_VM_10225": "Dies ist keine gültige MAC-Adresse [%s]", + "ORG_ZSTACK_COMPUTE_VM_10224": "CPU-Topologie ist falsch. Tatsächliche CPU-Kerne: %s, konfigurierte Sockets: %s, Kerne pro Socket: %s, Threads pro Kern: %s; Berechnete Sockets: %s, Kerne: %s, Threads: %s", + "ORG_ZSTACK_COMPUTE_VM_10221": "VM[uuid:%s] kann fstrim nur ausführen, wenn ihr Status Running ist; aktueller Status ist %s", + "ORG_ZSTACK_STORAGE_VOLUME_10046": "Das Volume mit UUID [%s] befindet sich nicht im Status Gelöscht. Dieser Vorgang dient zur Wiederherstellung eines zuvor gelöschten Daten-Volumes.", + "ORG_ZSTACK_STORAGE_VOLUME_10049": "Image[uuid:%s] ist nicht Enabled, sondern %s", + "ORG_ZSTACK_STORAGE_VOLUME_10048": "Image[uuid:%s] ist nicht vom erwarteten Typ,", + "ORG_ZSTACK_STORAGE_VOLUME_10042": "Volume[uuid:%s] ist nicht im aktivierten Zustand, aktueller Zustand ist %s, Snapshot-Erstellung nicht möglich", + "ORG_ZSTACK_STORAGE_VOLUME_10045": "Volume[uuid:%s] ist für Snapshot-Erstellung nicht verfügbar, aktueller Status ist %s", + "ORG_ZSTACK_STORAGE_VOLUME_10044": "Kann keinen Speicher-Snapshot erstellen, VM aktueller Zustand[%s], erwartete Zustände sind [%s, %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10041": "Volume[uuid:%s, type:%s], kann Snapshot nicht erstellen", + "ORG_ZSTACK_LOGIN_10022": "Ungültiges Attribut. Attribut[%s] ist erforderlich, aber es wurden Datensätze [%s] gefunden, die nicht übereinstimmen. Bitte stellen Sie sicher, dass alle Attribute korrekt angegeben und abgeglichen sind", + "ORG_ZSTACK_LOGIN_10024": "Strategie ist ein Pflichtfeld", + "ORG_ZSTACK_LOGIN_10023": "Ungültiges JSON-Format für Cloud-Konfigurationsdaten. Bitte stellen Sie sicher, dass alle JSON-Felder korrekt formatiert sind und dem angegebenen Schema entsprechen.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10007": "keyLabel %s und encryptedResult %s sind inkonsistent", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10006": "flkSec securityMachine fehlerhaft: %s", + "ORG_ZSTACK_LOGIN_10029": "name sollte Werte innerhalb des angegebenen Parameterbereichs %s verwenden", + "ORG_ZSTACK_LOGIN_10026": "Attribut ist obligatorisch für die Cloud-Ressourcenbereitstellung %", + "ORG_ZSTACK_LOGIN_10025": "name ist ein Pflichtfeld %", + "ORG_ZSTACK_LOGIN_10028": "optional ist ein Pflichtfeld für die Konfiguration virtueller Maschinen%", + "ORG_ZSTACK_LOGIN_10027": "type ist ein Pflichtfeld %", + "ORG_ZSTACK_STORAGE_VOLUME_10058": "Das Root-Volume [uuid:%s, name:%s] kann nicht angeschlossen werden.", + "ORG_ZSTACK_STORAGE_VOLUME_10057": "Die VM [UUID:%s] unterstützt das Online-Anschließen von Volumes [%s] nicht, da ihr Image-Plattformtyp inkompatibel ist.", + "ORG_ZSTACK_STORAGE_VOLUME_10059": "data volume [UUID:%s] ist deaktiviert; Anschließen ist nicht erlaubt.", + "ORG_ZSTACK_STORAGE_VOLUME_10054": "data volume [UUID:%s] ist keiner virtuellen Maschine angeschlossen und kann daher nicht getrennt werden.", + "ORG_ZSTACK_STORAGE_VOLUME_10053": "volume[uuid:%s] hat den Status[%s], ein data volume kann nur angeschlossen werden, wenn der Status verfügbar oder angeschlossen ist", + "ORG_ZSTACK_STORAGE_VOLUME_10056": "das Volume[uuid:%s, name:%s, type:%s] kann nicht getrennt werden", + "ORG_ZSTACK_CORE_PLUGIN_10001": "plugin[%s] name, product key und vendor dürfen nicht null sein", + "ORG_ZSTACK_STORAGE_VOLUME_10055": "Um ein freigebbares data volume mit UUID [%s] zu trennen, wird die UUID der virtuellen Maschine benötigt.", + "ORG_ZSTACK_STORAGE_VOLUME_10050": "image[uuid:%s] ist nicht Ready, es befindet sich im Status %s", + "ORG_ZSTACK_STORAGE_VOLUME_10052": "volume[uuid:%s] hat den Status[%s], ein data volume kann nur angeschlossen werden, wenn der Status %s ist", + "ORG_ZSTACK_STORAGE_VOLUME_10051": "root volume [uuid:%s] kann nicht an eine virtuelle Maschine angeschlossen werden", + "ORG_ZSTACK_LOGIN_10011": "DNS-Eintrag [%s] konnte nicht validiert werden, möglicherweise wurde er gelöscht", + "ORG_ZSTACK_CORE_PLUGIN_10000": "unbekannter Plugin-Name für Cloud-Produkt: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10069": "Volume [uuid:%s, type:%s] kann nicht gelöscht werden", + "ORG_ZSTACK_STORAGE_VOLUME_10068": "Unerwartete Festplattengrößeneinstellungen für virtuelle Maschine %s. Bitte stellen Sie sicher, dass die angegebene Festplattengröße innerhalb des zulässigen Bereichs liegt und mit Ihrer Cloud-Umgebungskonfiguration kompatibel ist.", + "ORG_ZSTACK_STORAGE_VOLUME_10065": "Volume kann nicht an VM angehängt werden, kein verfügbarer Compute-Cluster", + "ORG_ZSTACK_STORAGE_VOLUME_10064": "Data-Volume mit UUID [%s] hat ein Format [%s], das nur an einen Hypervisor vom Typ [%s] angehängt werden kann, aber die VM hat einen Hypervisor-Typ von [%s]. Daher ist das Anhängen nicht möglich.", + "ORG_ZSTACK_RESOURCECONFIG_10009": "Konto hat keinen Zugriff auf die Ressource [uuid: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10067": "Das Backup des Root-Volumes ist nicht erlaubt, uuid:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10066": "Volume kann nicht an VM angehängt werden, die auf Host [uuid: %s] läuft, der vom Storage des Volumes [uuid: %s] getrennt ist", + "ORG_ZSTACK_STORAGE_VOLUME_10061": "Data-Volume [UUID:%s] ist bereits an eine andere virtuelle Maschine angehängt und kann nicht wieder angehängt werden.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_10000": "Attribut [name:%s] ist ein reserviertes Attribut, das in Cloud-Computing-Umgebungen nicht aktualisiert werden kann.", + "ORG_ZSTACK_NETWORK_OVN_10074": "OVN SDN-Controller [UUID: %s, Name: %s] befindet sich im getrennten Zustand; Host kann nicht hinzugefügt werden [UUID: %s].", + "ORG_ZSTACK_STORAGE_VOLUME_10060": "Das Volume mit UUID [%s] befindet sich im gelöschten Zustand; daher kann der Vorgang nicht ausgeführt werden.", + "ORG_ZSTACK_NETWORK_OVN_10073": "Logischer Switch [uuid:%s, name:%s] konnte nicht zum OVN-Controller [uuid:%s, ip:%s] hinzugefügt werden, weil %s", + "ORG_ZSTACK_STORAGE_VOLUME_10063": "Data-Volume mit UUID [%s] und Format [%s] wird für das Anhängen an keinen Hypervisor unterstützt.", + "ORG_ZSTACK_STORAGE_VOLUME_10062": "Data-Volume kann nur angehängt werden, wenn der Status [active, available] ist, aktueller Status ist %s", + "ORG_ZSTACK_NETWORK_OVN_10071": "Logischer Switch konnte nicht zum OVS-Controller [uuid:%s, ip:%s] synchronisiert werden, wegen %s", + "ORG_ZSTACK_LOGIN_10000": "ZStack lädt gerade LDAP-Organisationen aus der Datenbank; bitte führen Sie zu diesem Zeitpunkt keine Synchronisierungsvorgänge aus.", + "ORG_ZSTACK_NETWORK_OVN_10078": "NfvInstance[uuid:%s] nicht gefunden", + "ORG_ZSTACK_NETWORK_OVN_10077": "L2-Netzwerk [UUID:%s] ist nicht mit dem OVN-Controller verbunden", + "ORG_ZSTACK_NETWORK_OVN_10076": "Logischer Switch-Port konnte nicht vom OVS-Controller [uuid:%s, ip:%s] gelöscht werden, weil %s", + "ORG_ZSTACK_STORAGE_VOLUME_10070": "Volume [uuid:%s] befindet sich bereits im gelöschten Zustand", + "ORG_ZSTACK_LOGIN_10001": "LDAP-Eintrag [] konnte nicht synchronisiert werden, weil %s", + "ORG_ZSTACK_NETWORK_OVN_10075": "Logische Switch-Ports konnten nicht zum OVN-Controller [uuid:%s, ip:%s] hinzugefügt werden, weil %s", + "ORG_ZSTACK_V2V_10037": "Host [uuid:%s] ist nicht verbunden", + "ORG_ZSTACK_V2V_10038": "primaryStorage [uuid:%s] ist nicht verbunden", + "ORG_ZSTACK_V2V_10035": "%d Bytes können auf dem Konversions-Host [uuid:%s] nicht zugewiesen werden, es fehlt verfügbare Kapazität", + "ORG_ZSTACK_NETWORK_OVN_10079": "NfvInstanceGroup[uuid:%s] nicht gefunden", + "ORG_ZSTACK_LOGIN_10008": "UID [%s] konnte nicht validiert werden, möglicherweise wegen Löschung oder Ablauf", + "ORG_ZSTACK_LOGIN_10007": "LDAP/AD-Server mit Gültigkeitsbereich %s kann nicht synchronisiert werden", + "ORG_ZSTACK_V2V_10031": "Ungültiges QoS-System-Tag für V2V-Migration. Bitte überprüfen Sie das System-Tag und stellen Sie sicher, dass es den Cloud-Computing-Standards entspricht.", + "ORG_ZSTACK_V2V_10032": "Ungültige Netzwerkbandbreite [%s], sie muss größer oder gleich 1048576 Bytes pro Sekunde sein", + "ORG_ZSTACK_LOGIN_10009": "Erstellen der IAM-Virtuellen-ID für UID [%s] fehlgeschlagen, weil %s", + "ORG_ZSTACK_LOGIN_10004": "Synchronisierung der LDAP-Organisation in der Cloud-Umgebung fehlgeschlagen", + "ORG_ZSTACK_BAREMETAL2_10001": "Ungültige IPMI-Chassis-Konfiguration: Der 'reboot'-Parameter muss auf 'No' gesetzt werden, wenn der 'provisionIp'-Parameter angegeben wird.", + "ORG_ZSTACK_V2V_10030": "Es gab eine VM-Migration vom Host mit hostUuid %s", + "ORG_ZSTACK_BAREMETAL2_10002": "Ungültige IPMI-Chassis-Konfiguration: Die 'platform' muss als 'Linux' angegeben werden, wenn 'provisionIp' angegeben wird.", + "ORG_ZSTACK_LOGIN_10006": "Synchronisierung der Organisationen fehlgeschlagen, weil %s", + "ORG_ZSTACK_LOGIN_10005": "Umwandlung des LDAP-Eintrags in einen Organisationsknoten fehlgeschlagen", + "ORG_ZSTACK_BAREMETAL2_10000": "Ungültige IPMI-Chassis-Konfiguration: Der 'provisionType' muss auf 'Direct' gesetzt werden, wenn eine 'provisionIp' angegeben wird.", + "ORG_ZSTACK_STORAGE_VOLUME_10079": "Volume [%s] kann nicht von der Instanz getrennt werden. Es wurde möglicherweise bereits getrennt", + "ORG_ZSTACK_STORAGE_VOLUME_10076": "Volume [%s] kann nicht an Host [%s] angehängt werden, da es derzeit an Host [%s] angehängt ist", + "ORG_ZSTACK_STORAGE_VOLUME_10075": "Der Mount-Pfad muss ein absoluter Pfad sein. Bitte geben Sie einen gültigen absoluten Pfad an.", + "ORG_ZSTACK_NETWORK_OVN_10080": "NfvInstanceGroup[uuid:%s] hat keine virtuelle IP konfiguriert", + "ORG_ZSTACK_STORAGE_VOLUME_10078": "Volume [%s] kann nicht an Host [%s] angehängt werden, da ein anderes Volume den Mount-Pfad [%s] belegt", + "ORG_ZSTACK_STORAGE_VOLUME_10077": "Volume [%s] kann nicht an Host [%s] angehängt werden, da es bereits auf Pfad [%s] auf Host [%s] gemountet ist", + "ORG_ZSTACK_STORAGE_VOLUME_10072": "Es ist nicht erlaubt, den Status des Root-Volumes zu ändern, UUID: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10071": "Volume [%s] kann nicht gelöscht werden, da es an Host [%s] angehängt ist", + "ORG_ZSTACK_STORAGE_VOLUME_10074": "Volume [%s] kann nicht an Instanz [%s] angehängt werden, da Instanz [status:%s] nicht betriebsbereit ist", + "ORG_ZSTACK_NETWORK_OVN_10083": "Aktualisierung der OVN-Cluster-Knoten für NFV-Instanz [uuid:%s] fehlgeschlagen, weil %s", + "ORG_ZSTACK_STORAGE_VOLUME_10073": "Volume-Status kann nicht geändert werden, da es an Host %s angehängt ist", + "ORG_ZSTACK_NETWORK_OVN_10082": "Keine Instanzen für Cluster-Konfiguration in NfvInstanceGroup[uuid:%s] gefunden", + "ORG_ZSTACK_RESOURCECONFIG_10002": "ResourceConfig [category:%s, name:%s] kann nicht mit resourceType: %s verknüpft werden", + "ORG_ZSTACK_RESOURCECONFIG_10001": "Ressource [uuid: %s] nicht gefunden", + "ORG_ZSTACK_STORAGE_VOLUME_10081": "Quelldatei im verwendeten Snapshot-Baum von Volume[uuid: %s] nicht gefunden", + "ORG_ZSTACK_V2V_10028": "Typ für Quell-VM [url:%s] nicht gefunden", + "ORG_ZSTACK_RESOURCECONFIG_10000": "Ressourcen haben inkonsistente Ressourcentypen. Details: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10080": "Ein freigebbares Volume[uuid:%s] kann nicht flachgemacht werden", + "ORG_ZSTACK_V2V_10029": "Factory für Quell-VM [url:%s, v2vType:%s] nicht gefunden", + "ORG_ZSTACK_RESOURCECONFIG_10007": "Globale Konfiguration [category:%s, name:%s] kann nicht an Ressource gebunden werden", + "ORG_ZSTACK_V2V_10026": "Das Netzwerk[uuid:%s] zum Starten der aktuellen VM konnte nicht gefunden werden. Möglicherweise wurde es gelöscht. Betriebsvorschlag: Beenden Sie diese VM und erstellen Sie eine neue.", + "ORG_ZSTACK_RESOURCECONFIG_10006": "Globale Konfiguration[category:%s, name:%s] nicht gefunden", + "ORG_ZSTACK_V2V_10024": "Es ist nicht der Zeitpunkt für das Herunterfahren der Instanz", + "ORG_ZSTACK_V2V_10025": "conversionHost[uuid:%s, hostUuid:%s] ist nicht verbunden", + "ORG_ZSTACK_V2V_10022": "Es laufen einige v2v-Jobs. Volume[%s] kann nicht vom Host[%s] getrennt werden.", + "ORG_ZSTACK_V2V_10020": "primary storage[uuid:%s] ist weder aktiv noch angehängt", + "ORG_ZSTACK_V2V_10021": "Es laufen noch V2V-Migrations-Jobs. Bitte stellen Sie sicher, dass kein Volume[%s] an den Host[%s] angehängt ist.", + "ORG_ZSTACK_STORAGE_VOLUME_10007": "iothread erfordert QEMU-Version >= %s, aber der Host führt Version %s aus.", + "ORG_ZSTACK_STORAGE_VOLUME_10009": "root volume [%s] kann keinen I/O-Thread-Pin setzen.", + "ORG_ZSTACK_STORAGE_VOLUME_10008": "iothread erfordert eine libvirt-Version von mindestens %s, aber der Host hat Version %s.", + "ORG_ZSTACK_STORAGE_VOLUME_10003": "Der aktuelle primary storage %s ist nicht vom Typ Ceph und kann daher nicht zugegriffen werden.", + "ORG_ZSTACK_STORAGE_VOLUME_10005": "Der aktuelle primary storage-Typ unterstützt kein Block-Volume. Unterstützte Typen umfassen %s.", + "ORG_ZSTACK_STORAGE_VOLUME_10004": "Ceph-Typ-Block-Volume-Zugriffspfad-ID und IQN dürfen nicht null sein. Bitte stellen Sie sicher, dass sowohl accessPathId als auch accessPathIqn angegeben werden.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10000": "JitClientFactory-Verbindungstest fehlgeschlagen", + "ORG_ZSTACK_SSO_CAS_FILTER_10000": "URL ungültig, client-UUID fehlt", + "ORG_ZSTACK_SSO_CAS_FILTER_10001": "Fehlende CAS-Client-Instanz, bitte CAS-Client vor SSO-Integration instanziieren", + "ORG_ZSTACK_COMPUTE_VM_10275": "VM[uuid:%s] ist nicht in einem laufenden Zustand.", + "ORG_ZSTACK_CONSOLE_10011": "Der Console-Agent ist nicht verbunden; dies ist wahrscheinlich auf die Initialisierung des Management-Knotens zurückzuführen. Bitte warten Sie, bis sich der Console-Agent verbindet, oder stellen Sie manuell eine Verbindung her, wenn er längere Zeit getrennt war.", + "ORG_ZSTACK_CONSOLE_10010": "vm[uuid:%s] ist nicht im Zustand %s, aktueller Zustand ist %s", + "ORG_ZSTACK_COMPUTE_VM_10273": "Fehler beim Erstellen einer Vorlage aus dem root volume[uuid:%s] auf dem primary storage[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10270": "Die virtuelle Maschine wurde gelöscht. Bitte überprüfen Sie Ihre Instanzverwaltungskonsole für Details.", + "ORG_ZSTACK_CONSOLE_10013": "console proxy[uuid: %s, status: %s] auf Agent[ip: %s] ist nicht verbunden, Löschen fehlgeschlagen", + "ORG_ZSTACK_CONSOLE_10012": "Host-IP der VM[uuid:%s] kann nicht gefunden werden, läuft die VM???", + "ORG_ZSTACK_COMPUTE_VM_10279": "Fehler beim Aktualisieren der VM[uuid=%s] auf dem Hypervisor: Die Änderung bestimmter Eigenschaften fehlgeschlagen", + "ORG_ZSTACK_COMPUTE_VM_10278": "Fehler beim Aktualisieren der vm[uuid=%s] auf dem Hypervisor.", + "ORG_ZSTACK_COMPUTE_VM_10277": "Das ISO mit UUID [uuid:%s] befindet sich auf einem Backup-Speicher, der nicht mit dem primary storage [uuid:%s] kompatibel ist, auf dem die VM [name:%s, uuid:%s] residiert.", + "ORG_ZSTACK_COMPUTE_VM_10276": "Console-Passwort der VM[uuid:%s] kann nicht aktualisiert werden, die VM läuft auf keinem Host", + "ORG_ZSTACK_STORAGE_VOLUME_10018": "Volume [%s] kann nicht in der Größe angepasst werden, da es sich in einem deaktivierten Zustand befindet", + "ORG_ZSTACK_STORAGE_VOLUME_10017": "volume[uuid:%s] ist kein Datenvolume", + "ORG_ZSTACK_STORAGE_VOLUME_10019": "Mindestens einer von vmInstanceUuid oder instanceUuid sollte angegeben werden.", + "ORG_ZSTACK_STORAGE_VOLUME_10014": "Das Erstellen von Snapshots von Volumes [uuid:%s, uuid:%s] auf verschiedenen VMs [uuid:%s, uuid:%s] wird nicht unterstützt", + "ORG_ZSTACK_STORAGE_VOLUME_10013": "Volume [uuid:%s] kann nicht gefunden werden", + "ORG_ZSTACK_STORAGE_VOLUME_10016": "Der Status der VM [uuid:%s] ist %s, Snapshot-Erstellung ist nicht zulässig", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10013": "JIT-Sicherheitsmaschine fehlerhaft: Socket-Verbindung zu %s:%s fehlgeschlagen", + "ORG_ZSTACK_STORAGE_VOLUME_10015": "Volume [uuid:%s] ist nicht verfügbar", + "ORG_ZSTACK_STORAGE_VOLUME_10010": "Die aktuelle E/A-Thread-ID [%s] stimmt nicht mit der E/A-Thread-ID [%s] des angehängten Volumes [%s] überein.", + "ORG_ZSTACK_STORAGE_VOLUME_10012": "Die Snapshot-Validierung wird für Volume [uuid: %s] nicht unterstützt. Die angehängte VM befindet sich nicht in einem der Status [%s, %s].", + "ORG_ZSTACK_STORAGE_VOLUME_10011": "Die Snapshot-Validierung wird für Volume [UUID: %s] nicht unterstützt. Das Volume sollte an eine virtuelle Maschine angehängt sein.", + "ORG_ZSTACK_CONSOLE_10000": "Ansible-Private-Key-Datei nicht gefunden. Stellen Sie sicher, dass der Pfad zur Private-Key-Datei korrekt und zugänglich ist.", + "ORG_ZSTACK_COMPUTE_VM_10285": "Volume [uuid=%s] konnte nicht von VM [uuid=%s] getrennt werden", + "ORG_ZSTACK_COMPUTE_VM_10284": "Das Trennen eines Volumes ist nicht zulässig, wenn sich die VM im Status [%s] befindet", + "ORG_ZSTACK_COMPUTE_VM_10283": "ISO [uuid:%s] ist nicht an VirtualMachine [uuid:%s] angehängt", + "ORG_ZSTACK_COMPUTE_VM_10282": "Fehler beim Aktualisieren von VM [uuid=%s] auf Hypervisor: Die Änderung bestimmter Eigenschaften fehlgeschlagen", + "ORG_ZSTACK_CONSOLE_10004": "Verbindung zur Konsole-Proxy für die virtuelle Maschine konnte nicht wiederhergestellt werden. Bitte prüfen Sie die Netzwerkverbindung und stellen Sie sicher, dass die virtuelle Maschine läuft.", + "ORG_ZSTACK_COMPUTE_VM_10281": "Fehler beim Aktualisieren von VM [uuid=%s] auf Hypervisor-Knoten", + "ORG_ZSTACK_CONSOLE_10003": "Fehler beim Konfigurieren der überschriebenen IP-Adresse der Konsole-Proxy [code:%d] oder des Ports der Konsole-Proxy [code:%d]", + "ORG_ZSTACK_COMPUTE_VM_10280": "Virtuelle Maschine konnte nicht erstellt werden, eine virtuelle Maschine mit dem Namen [%s] existiert bereits", + "ORG_ZSTACK_CONSOLE_10002": "Ein anderer Prozess verwendet den Port: %s", + "ORG_ZSTACK_CONSOLE_10001": "Ungültige Management-Knoten-ID [%s]", + "ORG_ZSTACK_CONSOLE_10008": "Konsolen-Proxy-Verfügbarkeit kann nicht verifiziert werden wegen %s", + "ORG_ZSTACK_CONSOLE_10007": "VNC-Verbindung herstellen: Unerwarteter URI: %s", + "ORG_ZSTACK_COMPUTE_VM_10288": "Eine VM kann nicht %s CD-ROMs erstellen; VM kann nur %s CD-ROMs anhängen.", + "ORG_ZSTACK_CONSOLE_10009": "Operationsfehler, weil:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10029": "Erweiterungsoperation nicht zulässig, da Host deaktiviert ist. Stellen Sie sicher, dass der Host aktiv ist, bevor Sie diese Operation durchführen.", + "ORG_ZSTACK_STORAGE_VOLUME_10028": "Die minimale Inkrementgröße für die Speicherzuweisung sollte größer als 4 MB sein.", + "ORG_ZSTACK_STORAGE_VOLUME_10025": "Sie können nicht gleichzeitig Lese-/Schreib-Bandbreitenlimits und Gesamt-Bandbreitenlimits für eine virtuelle Maschine festlegen. Bitte geben Sie einen Limittyp an.", + "ORG_ZSTACK_STORAGE_VOLUME_10024": "Sie können nicht gleichzeitig Lese-/Schreib-IOPS-Limits und Gesamt-IOPS-Limits für Ihre Instanz konfigurieren. Bitte geben Sie einen IOPS-Limittyp an.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10023": "Unbehandelte Ausnahme beim Abrufen von Attributen mit aktivierter JIT-Sicherheit: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10027": "Volume [uuid:%s] [%s] kann nicht in der Größe reduziert werden", + "ORG_ZSTACK_STORAGE_VOLUME_10026": "Die Volumen-Bandbreite darf nicht null sein; bitte geben Sie einen gültigen Volumen-Bandbreitenwert an.", + "ORG_ZSTACK_STORAGE_VOLUME_10021": "volume[uuid:%s] ist kein Stamm-Volume", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10022": "JIT-Sicherheits-Maschinen-Attributabruf fehlgeschlagen, Statuscode: %s, Details: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10020": "Kein Volume mit UUID: %s und VM-Instanz UUID: %s gefunden", + "ORG_ZSTACK_STORAGE_VOLUME_10023": "Legacy- und neue Parametersätze können nicht gleichzeitig in einer virtuellen Maschineninstanz konfiguriert werden.", + "ORG_ZSTACK_STORAGE_VOLUME_10022": "SharedVolume unterstützt keine Bandbreiteneinstellung.", + "ORG_ZSTACK_COMPUTE_VM_10293": "Keine Methode zur Bestimmung der Image-Größe für %s, bitte Ausnahme melden.", + "ORG_ZSTACK_STORAGE_VOLUME_10035": "Nur getrennte Volumes werden unterstützt, verwenden Sie stattdessen SetVmBootVolumeMsg.", + "ORG_ZSTACK_ZWATCH_PROMETHEUS_10000": "Host[uuid:%s] nicht in der Cloud-Datenbank gefunden", + "ORG_ZSTACK_STORAGE_VOLUME_10038": "Hypervisor[%s] beschränkt eine einzelne VM auf maximal %s Daten-Volumes; diese VM [uuid:%s] hat %s Daten-Volumes angeschlossen.", + "ORG_ZSTACK_STORAGE_VOLUME_10032": "Image-Cache [Image UUID: %s] für Volume-Neubereitung kann nicht gefunden werden", + "ORG_ZSTACK_STORAGE_VOLUME_10031": "Shared-Volume[uuid: %s] wurde an nicht-gestoppte VM-Instanzen angeschlossen[uuids: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10034": "volume[uuid%s] sollte an eine Instanz angeschlossen sein.", + "ORG_ZSTACK_STORAGE_VOLUME_10033": "Das Volume [UUID: %s, name: %s] wird noch verwendet und kann nicht gelöscht werden. Bitte stellen Sie sicher, dass das Volume gelöscht wird, bevor Sie versuchen, es zu entfernen.", + "ORG_ZSTACK_STORAGE_VOLUME_10030": "Erweiterungsvorgang aufgrund des deaktivierten Host-Status nicht erlaubt", + "ORG_ZSTACK_LOGIN_10033": "Es ist derzeit kein LDAP/AD-Server in Ihrer Umgebung konfiguriert. Bitte konfigurieren Sie zuerst einen LDAP/AD-Server.", + "ORG_ZSTACK_LOGIN_10032": "LDAP-UID %s kann nicht an virtuelle Benutzer-ID gebunden werden [uuid:%s]", + "ORG_ZSTACK_LOGIN_10034": "Diese UID wird bereits verwendet. Bitte wählen Sie eine andere.", + "ORG_ZSTACK_LOGIN_10030": "Ungültiges Attribut. Attribut[%s] ist erforderlich, aber es wurden nicht übereinstimmende Datensätze in der Konfiguration der virtuellen Maschine gefunden. Bitte stellen Sie sicher, dass alle Attribute korrekt angegeben und alle Ressourcen der virtuellen Maschine ordnungsgemäß konfiguriert sind.", + "ORG_ZSTACK_STORAGE_CDP_10091": "Ungültige maximale Kapazität[%d], aktuelle Auslastung ist %d", + "ORG_ZSTACK_STORAGE_CDP_10089": "Hostname nicht gefunden für Backup-Speicher[uuid: %s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10009": "Die Kryptofunktion ist aktiviert, aber der Ressourcenpool[%s] für automatische Anmeldung ist nicht konfiguriert.", + "ORG_ZSTACK_SSO_SAML2_10001": "Identity Provider-Metadaten sind ungültiges Base64 (dekodierter Inhalt ist leer).", + "ORG_ZSTACK_SSO_SAML2_10002": "Fehler beim Dekodieren der Identity Provider-Metadaten aus Base64-Kodierung", + "ORG_ZSTACK_SSO_SAML2_10000": "IdP-Metadaten sind nicht konfiguriert. Bitte gültige Metadaten bereitstellen.", + "ORG_ZSTACK_ZSV_10002": "Trennen Sie das Shared-Volume oder LUN-Gerät, bevor Sie die Snapshot-Gruppe betreiben.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10000": "Kein Client für Sicherheitsinstanz[model=%s]", + "ORG_ZSTACK_ZSV_10001": "Volume %s hat noch Snapshot-Gruppen, kann nicht gelöscht werden", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10001": "Keine Sicherheits-Maschinen-Client-Factory für Sicherheits-Maschine[type=%s]", + "ORG_ZSTACK_ZSV_10000": "Volume %s hat noch eine Snapshot-Gruppe, die der VM %s zugeordnet ist; daher kann es nicht an eine andere VM angeschlossen werden", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10002": "SecurityMachineManagerImpl: SecurityMachineEncrypt fehlgeschlagen für Instanz %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_HTTP_10001": "HTTP-Vorlagenfehler beim Speichern, bitte überprüfen Sie den Vorlageninhalt: %s", + "ORG_ZSTACK_STORAGE_CDP_10097": "Der VM-Erstellungsauftrag wurde abgebrochen. Bitte überprüfen Sie Ihre Parameter und versuchen Sie es erneut.", + "ORG_ZSTACK_STORAGE_CDP_10095": "Abbruch des Rückgängig-Auftrags: Der Vorgang zum Rückgängigmachen von Änderungen wurde abgebrochen. Bitte stellen Sie sicher, dass alle abhängigen Aufgaben abgeschlossen sind, bevor Sie erneut versuchen, die Änderungen rückgängig zu machen.", + "ORG_ZSTACK_ACCESSKEY_10002": "[Konto-ID: %s, Benutzer-ID: %s] ist kein gültiges Konto oder IAM2-Projekt/Benutzer", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10019": "Fehler beim Herstellen einer Verbindung zum Chassis [uuid:%s], bitte überprüfen Sie die IPMI-Konfiguration.", + "ORG_ZSTACK_ACCESSKEY_10001": "Wenn ein bestimmter Zugriffsschlüssel erwartet wird, müssen sowohl die AccessKeyID als auch der AccessKeySecret gleichzeitig bereitgestellt werden.", + "ORG_ZSTACK_ACCESSKEY_10004": "Die Anzahl der Zugriffsschlüssel für [Konto-ID: %s, Benutzer-ID: %s] überschreitet das maximale Limit", + "ORG_ZSTACK_ACCESSKEY_10000": "Keine Berechtigung zum Ausführen des Vorgangs für [Konto-UUID:%s, Benutzer-UUID:%s]", + "ORG_ZSTACK_TEST_10008": "Ich sollte nicht in der Fehlerliste sein", + "ORG_ZSTACK_TEST_10009": "Ich sollte auch nicht als Fehler aufgeführt werden.", + "ORG_ZSTACK_TEST_10006": "Cloud-Bereitstellung abgeschlossen, wie beabsichtigt.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10020": "Fehler beim Laden der Chassis-Informationen aus der Datei, weil: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10029": "Eine andere Verbindungs-Sicherheitsmaschinen-Aufgabe wird ausgeführt. Bitte brechen Sie die neue Aufgabe ab und warten Sie auf deren Abschluss.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10026": "securityMachine ist deaktiviert. Fehler beim Erkennen des Heartbeats. Bitte stellen Sie sicher, dass securityMachine aktiviert und ordnungsgemäß konfiguriert ist.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10027": "%s Instanz-Heartbeat-Erkennung fehlgeschlagen", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10028": "%s Heartbeat-Erkennung Ausnahme", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10021": "Entschlüsseln von Daten[%s] oder Verschlüsselungsalgorithmustyp[%s] ist null", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10022": "Ungültiger Entschlüsselungsalgorithmustyp: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10024": "Die Verschlüsselungsfunktion kann nicht deaktiviert werden, da mindestens eine synchronisierte sichere virtuelle Maschine im Ressourcenpool vorhanden ist, die den Dienst bereitstellt. Bitte stellen Sie sicher, dass die Anzahl der synchronisierten sicheren virtuellen Maschinen auf Null reduziert wird, bevor Sie die Verschlüsselungsfunktion deaktivieren.", + "ORG_ZSTACK_TEST_10004": "Ich sollte aufgrund von %d auch nicht in der Fehlerliste sein", + "ORG_ZSTACK_TEST_10005": "mit Absicht %d", + "ORG_ZSTACK_SNS_SYSTEM_10002": "API-Ressource kann nicht gelöscht werden", + "ORG_ZSTACK_TEST_10003": "Ich sollte nicht in der Fehlerliste sein %d", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10019": "Unbekannter Verschlüsselungstyp[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10014": "Modell für geheimen Ressourcenpool kann nicht gefunden werden [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10015": "Der aktuelle Zustand[%s] erlaubt keine manuelle Zustandsänderung", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10016": "Es können nicht alle Security-VMs deaktiviert werden, wenn kryptografische Funktionen aktiviert sind. Bitte stellen Sie sicher, dass mindestens eine Security-VM aktiv ist.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10017": "Überprüfen Sie, ob die Ressourcenpool-UUID für die Authentifizierung konfiguriert ist.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10010": "Die Kryptofunktion ist aktiviert, aber der Ressourcenpool[%s] für den Datenschutz ist nicht konfiguriert.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10013": "Überprüfen der Modell[%s] Typ[%s] Client- und Server-Verfügbarkeitsausnahme", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10003": "SSH-Verbindung konnte nicht hergestellt werden. Bitte überprüfen Sie Ihre Cloud-Instanz-Einstellungen und Netzwerkkonfigurationen.", + "ORG_ZSTACK_AI_VM_10006": "Modell-Dienstinstanzgruppe mit UUID: %s kann nicht gefunden werden, Modell-Dienstinstanz konnte nicht gespeichert werden", + "ORG_ZSTACK_AI_VM_10007": "VM-Instanz, Config-YAML oder Service-YAML ist null für Modell-Dienst-Deploy-Kontext: %s", + "ORG_ZSTACK_AI_VM_10008": "Deploy-Kontext oder virtuelle Maschine ist null für Instanz %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10000": "%s kann nicht zu %s repliziert werden, Fehler: %s", + "ORG_ZSTACK_AI_VM_10009": "Aufgabe konnte nicht abgebrochen werden, %s", + "ORG_ZSTACK_SNS_SYSTEM_10000": "Systemalarm-Thema kann aufgrund zugehöriger Ressourcen nicht gelöscht werden. Bitte stellen Sie sicher, dass alle abhängigen Ressourcen entfernt wurden, bevor Sie erneut versuchen zu löschen.", + "ORG_ZSTACK_AI_VM_10002": "IP der VM-NIC kann im Standard-L3-Netzwerk [UUID: %s] nicht gefunden werden, das für den verteilten Modell-Dienst erforderlich ist", + "ORG_ZSTACK_SNS_SYSTEM_10001": "Nur HTTP-Endpunkt kann API-Thema abonnieren; der bereitgestellte Endpunkt [Typ: %s] ist kein gültiger HTTP-Endpunkt", + "ORG_ZSTACK_AI_VM_10003": "ModelServiceSession darf nicht null sein. Bitte stellen Sie sicher, dass eine gültige Sitzung für Cloud-Modell-Dienste etabliert ist.", + "ORG_ZSTACK_AI_VM_10004": "YAML-Konfiguration für Modell-Dienst kann nicht geparst werden, Dienstdefinition: %s", + "ORG_ZSTACK_AI_VM_10000": "Bild [uuid: %s] kann nicht gefunden werden", + "ORG_ZSTACK_AI_VM_10001": "Bild-UUID kann nicht aus YAML abgerufen werden: %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10015": "Das Netzwerk [%s] wurde zur HA-Gruppe [%s] hinzugefügt.", + "ORG_ZSTACK_ROUTEPROTOCOL_10014": "Das Netzwerk [%s] wurde zum virtuellen Router-Bereich [%s] hinzugefügt.", + "ORG_ZSTACK_ROUTEPROTOCOL_10017": "Router-ID [%s] ist in diesem Cloud-System nicht eindeutig", + "ORG_ZSTACK_ROUTEPROTOCOL_10016": "Router-ID [%s] entspricht nicht dem IPv4-Format", + "ORG_ZSTACK_AI_VM_10011": "Status kann aufgrund einer leeren Instanz-URL nicht abgerufen werden. Bitte geben Sie eine gültige Instanz-URL ein und versuchen Sie es erneut.", + "ORG_ZSTACK_HYBRID_BACKUP_10000": "%s kann nur von einem Administratorkonto in einer Cloud-Umgebung aufgerufen werden.", + "ORG_ZSTACK_EXTERNALSERVICE_CRONJOB_10001": "Der Cron-Daemon läuft nicht. Bitte stellen Sie sicher, dass er gestartet und korrekt konfiguriert ist.", + "ORG_ZSTACK_ROUTEPROTOCOL_10003": "[%s] entspricht nicht dem IPv4-Adressformat", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10030": "check-all-security-machine-token-sync ist für alle virtuellen Maschinen in der Cloud-Umgebung fehlgeschlagen. Bitte überprüfen Sie Ihre Sicherheits-Tokens und Maschinenkonfigurationen.", + "ORG_ZSTACK_ROUTEPROTOCOL_10008": "AreaId [%s] wurde bereits bereitgestellt", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10031": "FlkSecClientFactory-Verbindungstest fehlgeschlagen", + "ORG_ZSTACK_ROUTEPROTOCOL_10009": "KeyID und Passwort dürfen nicht null sein, wenn der Authentifizierungstyp %s ist", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10027": "Datenschutz-Token für die Sicherheitsmaschine %s konnte nicht generiert werden wegen %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10029": "Verschlüsselungsergebnisse für die Sicherheitsinstanz %s konnten nicht abgerufen werden wegen %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10011": "Die Passwortlänge darf 8 Bytes nicht überschreiten, wenn der Authentifizierungstyp %s ist.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10028": "HMAC-Token für die Sicherheitsmaschine %s konnte nicht generiert werden wegen %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10010": "Passwort darf nicht null sein, wenn der Authentifizierungstyp %s ist", + "ORG_ZSTACK_ROUTEPROTOCOL_10013": "Alle Netzwerke sollten dem virtuellen Router [%s] zugeordnet sein", + "ORG_ZSTACK_ROUTEPROTOCOL_10012": "AreaId[%s] muss eine gültige Zonen-ID sein", + "ORG_ZSTACK_ALIYUN_IDENTITYZONE_10000": "Keine Identitätsberechtigungsnachweise für die angeforderte Ressource gefunden. Bitte stellen Sie sicher, dass Sie einen gültigen Access Key und Secret Key angegeben haben.", + "ORG_ZSTACK_STORAGE_CDP_10005": "BackupStorage[uuid: %s] wurde bereits gelöscht", + "ORG_ZSTACK_STORAGE_CDP_10001": "kvmagent hat %d Mal nicht geantwortet", + "ORG_ZSTACK_STORAGE_CDP_10004": "Keine virtuelle Maschine für Cloud Deployment Pipeline-Aufgabe[uuid: %s] gefunden", + "ORG_ZSTACK_STORAGE_CDP_10000": "KVM-Agent wurde neu gestartet. Bitte prüfen Sie, ob dies Auswirkungen auf Ihre virtuellen Maschinen hat.", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10011": "Ein Hardware-VXLAN-Netzwerk kann nur innerhalb eines Hardware-VXLAN-Pools erstellt werden.", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10010": "NUR Hardware-VXLAN-Netzwerke können innerhalb eines Hardware-VXLAN-Pools erstellt werden.", + "ORG_ZSTACK_STORAGE_CDP_10016": "libvirt auf dem Host [UUID: %s] unterstützt das Erstellen von CDP-Aufgaben nicht. Bitte überprüfen Sie die libvirt-Version.", + "ORG_ZSTACK_HYBRID_DATACENTER_10003": "Rechenzentrum [%s] befindet sich noch in der Synchronisierung; bitte warten Sie.", + "ORG_ZSTACK_STORAGE_CDP_10017": "qemu auf dem Host [UUID: %s] unterstützt das Erstellen von CDP-Aufgaben nicht. Bitte überprüfen Sie die qemu-Version.", + "ORG_ZSTACK_HYBRID_DATACENTER_10002": "Keine gültige Region in aliyun angegeben, welche enthält: %s", + "ORG_ZSTACK_STORAGE_CDP_10018": "Die QEMU-Version, die auf der VM[uuid:%s] ausgeführt wird, unterstützt die mirrorBitmap-Funktionalität nicht. Bitte stellen Sie sicher, dass Sie eine kompatible QEMU-Version verwenden.", + "ORG_ZSTACK_STORAGE_CDP_10012": "query-mirror: Host für VM[uuid:%s] nicht gefunden", + "ORG_ZSTACK_AI_EVALUATION_10000": "Keine Gruppe mit UUID: %s in der Datenbank gefunden.", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10002": "Fehler beim Erstellen der vxlan-Netzwerkbrücke[%s] für Hardware-Gerät[uuid:%s, type:%s, vlan:%s] auf KVM-Host[uuid:%s], weil %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10001": "Es gibt keine SDN Controller Factory für SDN Controller Typ:%s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10000": "Es gibt keinen SDN Controller für VXLAN-Pool [uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10006": "VXLAN-Netzwerk kann nicht für VM mit UUID [%s] auf Ziel-Host mit UUID [%s] konfiguriert werden", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10005": "SDN Controller %s kann nicht gefunden werden", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10003": "Fehler beim Überprüfen der Brücke[%s] für hardwareVxlan[uuid:%s, name:%s] auf KVM-Host[uuid:%s], %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10009": "Hardware-VXLAN-Netzwerk-Pool muss die physische Schnittstelle %s konfigurieren", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10008": "Hardware-VXLAN-Netzwerk-Pool unterstützt das Erstellen von L3-Netzwerken nicht", + "ORG_ZSTACK_HYBRID_DATACENTER_10001": "regionId [%s] wurde bereits von Access Key [%s] erstellt", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10007": "Fehler beim Überprüfen der physischen Netzwerkschnittstelle für HardwareVxlanPool [uuid: %s, name: %s] auf KVM-Host [uuid: %s], %s", + "ORG_ZSTACK_HYBRID_DATACENTER_10000": "dcType nicht unterstützter Typ [%s]", + "ORG_ZSTACK_STORAGE_CDP_10027": "Ungültige Zeitzeichenfolge: %s, sollte gemäß ISO-Offset-Format formatiert werden, z.B. %s", + "ORG_ZSTACK_STORAGE_CDP_10023": "Die virtuelle Maschine führt derzeit eine Continuous Data Protection (CDP)-Aufgabe aus. Das Anhängen des Volumes wird die geplante Größe für vollständige Backups überschreiten. Bitte passen Sie die CDP-Aufgabengröße an und versuchen Sie es erneut.", + "ORG_ZSTACK_STORAGE_CDP_10024": "Die VM[%s] für Volume[%s] wird derzeit auf Continuous Data Protection (CDP) ausgeführt, daher ist eine Größenänderung derzeit nicht möglich.", + "ORG_ZSTACK_STORAGE_CDP_10025": "CDP-Aufgabe[uuid: %s] hat eine anomale Statusänderung festgestellt, vom alten Status: %s zum neuen Status: %s wegen %s.", + "ORG_ZSTACK_STORAGE_CDP_10026": "CDP-Aufgabe ist noch aktiv", + "ORG_ZSTACK_STORAGE_CDP_10022": "CDP-Aufgabe[uuid:%s] konnte nicht gefunden werden", + "ORG_ZSTACK_AI_EVALUATION_10001": "Keine passende Backend-Instanz der Gruppe[uuid: %s, type:%s] existiert", + "ORG_ZSTACK_AI_EVALUATION_10002": "Modell-Dienst-Instanzgruppe VO kann mit der bereitgestellten Modell-Dienstgruppen-Uuid nicht gefunden werden. Dies zeigt an, dass die zugehörige Dienstgruppe, die Evaluierungsaufgaben ausführt, nicht gefunden werden kann. Folglich verbleiben Aufgaben in einem Zwischenstatus, anstatt als 'Abgeschlossen' markiert zu werden. Aufgaben werden automatisch auf 'Fehlgeschlagen' aktualisiert und die Fehler dokumentiert.", + "ORG_ZSTACK_LOGINCONTROL_10002": "Ungültiger Regelausdruck, Zugriffssteuerungsregel konnte nicht hinzugefügt werden: %s", + "ORG_ZSTACK_LOGINCONTROL_10005": "Unbekannter Schlüssel: %s", + "ORG_ZSTACK_LOGINCONTROL_10006": "Fehlender Schlüssel:Wert für %s Ressourcenkonfiguration", + "ORG_ZSTACK_PORTAL_APIMEDIATOR_10008": "resourceUuid[%s] ist kein gültiger UUID. Ein gültiger UUID (v4 empfohlen) sollte ohne Bindestriche formatiert sein und dem Regex '[0-9a-f]{8}[0-9a-f]{4}[1-5][0-9a-f]{3}[89ab][0-9a-f]{3}[0-9a-f]{12}' entsprechen. Weitere Informationen unter http://en.wikipedia.org/wiki/Universally_unique_identifier.", + "ORG_ZSTACK_LOGINCONTROL_10007": "Falsches Format für Passwortstärke-Konfigurationseinstellungen", + "ORG_ZSTACK_LOGINCONTROL_10008": "Der Mindestwert darf nicht größer als der Höchstwert sein", + "ORG_ZSTACK_STORAGE_CDP_10039": "Backup-Speicher nicht gefunden[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10034": "Unerwarteter Aufgabentyp[uuid: %s, type: %s] in Cloud-Computing-Umgebung", + "ORG_ZSTACK_STORAGE_CDP_10035": "Maximale Kapazität nicht gefunden für Cloud Data Protection-Aufgabe[uuid: %s], bitte aktualisieren.", + "ORG_ZSTACK_STORAGE_CDP_10036": "Maximale Latenz nicht gefunden für CDPSessionTask[uuid: %s], bitte aktualisieren.", + "ORG_ZSTACK_STORAGE_CDP_10037": "VM[uuid: %s] wurde bereits beendet", + "ORG_ZSTACK_STORAGE_CDP_10031": "VM ist nicht heruntergefahren, aktueller Zustand: %s", + "ORG_ZSTACK_STORAGE_CDP_10032": "Gemeinsames Volume[%s] wird noch von anderen virtuellen Maschinen verwendet.", + "ORG_ZSTACK_STORAGE_CDP_10033": "Aufgabe nicht gefunden[uuid: %s]", + "ORG_ZSTACK_LOGINCONTROL_10012": "Kein verfügbarer Benutzer mit Name: %s, Typ: %s in der virtuellen Umgebung", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10011": "Die API-Anfrage gibt einen IPMI-Chassis-Typ an, aber die empfangene Nachricht ist nicht vom Typ APICreateBareMetal2ChassisHardwareInfoMsg. Bitte stellen Sie sicher, dass der Nachrichtentyp dem angegebenen Chassis-Typ entspricht.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10012": "Hardwareinformationen für unbekanntes Baremetal-Chassis empfangen[ipmi_addr:%s, ipmi_port:%d]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10010": "Laden von BareMetal2 IPMI-Chassis-Informationen aus Datei fehlgeschlagen, wegen: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10015": "Zurücksetzen der Stromversorgung für baremetal2 IPMI-Chassis fehlgeschlagen[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10016": "Remote-IPXE-Start der Instanz fehlgeschlagen[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10013": "Einschalten von baremetal2 IPMI-Chassis fehlgeschlagen[UUID:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10014": "Ausschalten von baremetal2 IPMI-Chassis fehlgeschlagen[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10049": "Die VM [UUID: %s] hat bereits eine CDP-Aufgabe gestartet; daher kann gleichzeitig kein Backup-Job erstellt werden.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10008": "Windows Local Disk Bare Metal-Instanzen unterstützen keine automatische Erstellung virtueller Maschinen.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10009": "Keine verwendbare baremetal2-Gateway im Cluster verfügbar[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10006": "Cluster[uuid:%s] ist keine BareMetal2-Virtualisierungsumgebung.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10007": "Cluster[uuid:%s] ist nicht aktiviert.", + "ORG_ZSTACK_STORAGE_CDP_10045": "Pflichtargumente fehlen: %s", + "ORG_ZSTACK_STORAGE_CDP_10046": "Die Aufbewahrungszeit pro Tag und der tägliche RP seit Tag können nicht gleich sein. Bitte stellen Sie sicher, dass sie auf unterschiedliche Werte gesetzt sind.", + "ORG_ZSTACK_STORAGE_CDP_10047": "Erwartet wurde eine UUID für virtuelle Maschine, aber %d erhalten.", + "ORG_ZSTACK_STORAGE_CDP_10048": "Ressource [uuid: %s] ist keine Instanz einer virtuellen Maschine.", + "ORG_ZSTACK_STORAGE_CDP_10041": "Backup-Speicher [UUID: %s] ist nicht mit der Cloud-Umgebung verbunden. Bitte stellen Sie sicher, dass er ordnungsgemäß konfiguriert und integriert ist.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10005": "Cluster[uuid:%s] ist keine Baremetal-Cluster-Konfiguration.", + "ORG_ZSTACK_STORAGE_CDP_10042": "Die VM [UUID: %s] hat bereits einen Backup-Job erstellt; daher kann sie nicht gleichzeitig eine Continuous Data Protection (CDP)-Task aktiviert haben.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10007": "IPMI-Adresse und Port existieren bereits.", + "ORG_ZSTACK_STORAGE_CDP_10044": "Die Zuweisung virtueller Ressourcen sollte größer sein als die Zuweisung physischer Ressourcen.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10001": "Bitte stellen Sie Folgendes sicher, um eine Verbindung zum Bare-Metal-Server herzustellen: 1. Verifizieren Sie, dass die IPMI-Schnittstelle aktiv ist; 2. Bestätigen Sie, dass die IPMI-Adresse, der Port, der Benutzername und das Passwort korrekt sind; 3. Stellen Sie sicher, dass IPMI über LAN in den BIOS-Einstellungen aktiviert ist.", + "ORG_ZSTACK_STORAGE_CDP_10040": "Backup-Speicher[uuid: %s] ist in der Cloud-Umgebung deaktiviert.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10009": "Baremetal-Chassis mit UUID: %s ist für die Verwendung von PXEServer mit UUID: %s konfiguriert, aber die DHCP-Anfrage wurde tatsächlich von PXEServer mit UUID: %s verarbeitet.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10008": "Kein verwendbarer Baremetal-PXE-Server an Cluster[uuid:%s] angehängt.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10000": "Bare Metal IPMI 2 Chassis %s hat zwei existierende Einträge.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10001": "IPMI-Adresse %s ist ungültig.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10004": "Baremetal-Chassis mit IPMI-Adresse %s und Port %d wurde bereits erstellt.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10005": "Cluster[uuid:%s] existiert nicht.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10002": "Verbindung zum Baremetal-Knoten konnte nicht hergestellt werden. Bitte verifizieren: 1. Die IPMI-Verbindung ist aktiv; 2. Die IPMI-Adresse, der Port, der Benutzername und das Passwort sind korrekt; 3. IPMI über LAN ist in den BIOS-Einstellungen aktiviert.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10003": "BareMetal2-Chassis mit IPMI-Adresse %s und Port %d wurde bereits erstellt.", + "ORG_ZSTACK_STORAGE_CDP_10056": "Mehrere Root-Laufwerke gefunden: %s.", + "ORG_ZSTACK_STORAGE_CDP_10058": "Kein Root-Volume für VM-Backup gefunden.%s.", + "ORG_ZSTACK_STORAGE_CDP_10059": "Volume %s ist im Backup enthalten, aber von VM [UUID: %s] getrennt. Bitte hängen Sie es wieder an die VM an oder entfernen Sie es aus dem Backup-Set.", + "ORG_ZSTACK_STORAGE_CDP_10053": "Keine Cloud-Laufwerk-Bereitstellungs-Task für VM[uuid: %s] gefunden.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10015": "Fern-Einschalten von Baremetal-Chassis[uuid:%s] fehlgeschlagen.", + "ORG_ZSTACK_STORAGE_CDP_10054": "CDP-Task für VM[uuid: %s] nicht auf Backstore[uuid: %s] gefunden.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10018": "Fern-PXE-Boot von Instanz[uuid:%s] fehlgeschlagen.", + "ORG_ZSTACK_STORAGE_CDP_10055": "recoverVm: Host[uuid: %s] nicht gefunden für VirtualMachine[uuid: %s].", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10017": "Fern-Strom-Reset von Baremetal-Chassis[uuid:%s] fehlgeschlagen.", + "ORG_ZSTACK_STORAGE_CDP_10050": "kann primären Speicher [uuid:%s] für Volume-Snapshot-Funktionalität nicht anfordern; Details [%s] ansehen", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10014": "Löschen des Bare-Metal-Chassis %s fehlgeschlagen", + "ORG_ZSTACK_STORAGE_CDP_10051": "recoverVm: Die Host-UUID wurde nicht bereitgestellt und der ursprüngliche Host für VM[uuid: %s] kann nicht gefunden werden.", + "ORG_ZSTACK_SSHKEYPAIR_10009": "Das SSH-Schlüsselpaar [uuid:%s] wurde nicht an die virtuelle Maschine [uuid:%s] angehängt.", + "ORG_ZSTACK_SSHKEYPAIR_10008": "Das SSH-Schlüsselpaar [uuid:%s] ist bereits an die virtuelle Maschine [uuid:] angehängt.", + "ORG_ZSTACK_SSHKEYPAIR_10007": "Das sshKeyPair[uuid:%s] wird derzeit verwendet.", + "ORG_ZSTACK_STORAGE_CDP_10067": "Root-Volume kann von CDP-Backup %s:%d nicht gefunden werden", + "ORG_ZSTACK_STORAGE_CDP_10068": "Root-Volume nicht von CDP-Backup %s:%d gefunden", + "ORG_ZSTACK_SSHKEYPAIR_10011": "Ressourcentypen %s werden für das Anhängen eines SSH-Schlüsselpaars nicht unterstützt; erlaubte Typen sind %s", + "ORG_ZSTACK_SSHKEYPAIR_10010": "Die vmInstance[uuid:%s] befindet sich nicht in einem laufenden Zustand.", + "ORG_ZSTACK_STORAGE_CDP_10063": "VM Cloud Deployment Process[uuid: %s] nicht gefunden", + "ORG_ZSTACK_STORAGE_CDP_10064": "VM-Instanz für Cloud Deployment Pipeline-Aufgabe[uuid: %s] nicht gefunden", + "ORG_ZSTACK_STORAGE_CDP_10065": "Keine Volume-Datensätze aus virtueller Maschine gefunden. Bitte VM-Konfiguration und Backup-Einstellungen überprüfen.", + "ORG_ZSTACK_STORAGE_CDP_10066": "mehrere Root-Laufwerke aus CDP-Backup %s:%d gefunden", + "ORG_ZSTACK_V2V_KVM_10003": "fehlende VM-UUID in 'srcVmUrl'", + "ORG_ZSTACK_STORAGE_CDP_10060": "unerwartete Volume[uuid: %s] Größenabweichung: erwartet %d Byte, erhaltene Größe unterschiedlich", + "ORG_ZSTACK_V2V_KVM_10004": "Kein Root-Laufwerk für Instanz gefunden: %s", + "ORG_ZSTACK_STORAGE_CDP_10061": "Volume[uuid: %s] ändern fehlgeschlagen: %s", + "ORG_ZSTACK_STORAGE_CDP_10062": "Volume[uuid: %s] hat einen unerwarteten Volume-Pfad: %s", + "ORG_ZSTACK_V2V_KVM_10007": "Bereinigen des KVM V2V-Konversionshosts[hostUuid:%s] fehlgeschlagen, weil %s", + "ORG_ZSTACK_STORAGE_CDP_10078": "kann die CDP-Richtlinie für VM[uuid: %s] nicht finden", + "ORG_ZSTACK_STORAGE_CDP_10075": "Kein Wiederherstellungspunkt mit Gruppen-ID %d gefunden", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10018": "ungültige Variable: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10075": "der NFS-Primärspeicher [uuid:%s, name:%s] kann keine angehängten Host-Cluster für die Operation finden", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10077": "kein Host für Volume[uuid:%s] gefunden", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10020": "需要一个列表用于资源 [%s] 输出这里,但得到了单个对象", + "ORG_ZSTACK_ZBOX_10007": "zbox[name:%s] ist nicht in einem bereiten Zustand, aktueller Status ist %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10025": "Einige Aktionen sind im Kontext des Cloud-Ressourcen-Managements ungültig. Bitte Parameter überprüfen und erneut versuchen.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10022": "Ressource [%s] muss vorher konfiguriert werden!", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10006": "der Zielhost [UUID:%s] hat nicht genügend physische Kapazität für Primärspeicher [UUID:%s], da der Schwellenwert %f beträgt, während die verfügbare physische Kapazität %d ist", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10050": "Kein verwendbarer Backend-Anbieter gefunden. Bitte stellen Sie sicher, dass ein gültiger Cloud-Anbieter konfiguriert ist, und versuchen Sie es erneut.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10051": "Kein Host im Verbundenen Zustand gefunden, an den der NFS-Primärspeicher [uuid:%s, name:%s] angehängt ist, um das Volume [uuid:%s] auf den Snapshot [uuid:%s, name:%s] zurückzusetzen", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10052": "Kein Host im Verbundenen Status gefunden, an den der NFS-Primärspeicher [uuid:%s, name:%s] angehängt ist, um das Volume [uuid:%s] auf das Image [uuid:%s] zurückzusetzen", + "ORG_ZSTACK_IAM2_10019": "Der Cron-Ausdruck kann nicht analysiert werden. Bitte stellen Sie sicher, dass er gemäß den Standard-Cron-Format-Spezifikationen korrekt formatiert ist.", + "ORG_ZSTACK_IAM2_10018": "Das Projekt [UUID: %s, name:%s] befindet sich im Status %s, was den Vorgang [%s] nicht zulässt", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10038": "Fehler beim Generieren des Datenschutz-Tokens %s für das Sicherheitsgerät %s wegen %s", + "ORG_ZSTACK_IAM2_10015": "Eine Organisation mit UUID %s kann nicht als Kind ihrer selbst oder ihrer übergeordneten Organisation UUID %s festgelegt werden.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10039": "Fehler beim Generieren des HMAC-Tokens %s für das Sicherheitsgerät %s wegen %s", + "ORG_ZSTACK_IAM2_10014": "Aktuelle Organisation [uuid:%s] ist veraltet, bitte aktivieren Sie sie", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10036": "generate-token fehlgeschlagen für Cloud-Ressourcenzuweisung", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10037": "Fehler beim Generieren eines aktivierten Tokens für die Sicherheitsmaschine %s wegen %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10034": "Importieren des geheimen Schlüssels fehlgeschlagen. Bitte stellen Sie sicher, dass der Schlüssel korrekt konfiguriert und in Ihrer Cloud-Umgebung zugänglich ist.", + "ORG_ZSTACK_IAM2_10011": "Falsche virtuelle Instanz-ID [uuid:%s], entweder existiert die Instanz nicht oder das Passwort ist falsch", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10005": "Ungültiges Typformat [%s]", + "ORG_ZSTACK_IAM2_10010": "Kein Konto für das Projekt [uuid:%s, name:%s] gefunden. Bitte stellen Sie sicher, dass Sie über die richtigen Berechtigungen und Anmeldeinformationen für Ihre Cloud-Umgebung verfügen.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10035": "Die Verbindung zur Sicherheitsinstanz %s ist während der Generierung des Testschlüssels fehlgeschlagen wegen %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10006": "Unterstützt nur Cloud-Ressourcen, aber [%s] erhalten", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10032": "Exportieren des geheimen Schlüssels fehlgeschlagen: %s", + "ORG_ZSTACK_IAM2_10013": "Virtuelle ID gehört nicht zum Projekt", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10003": "Aktionstyp wird nicht unterstützt: %s", + "ORG_ZSTACK_IAM2_10012": "Virtuelle ID [name:%s] ist aufgrund von Konfigurationseinstellungen deaktiviert", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10030": "encryptSubjectDN darf nicht null sein", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10031": "Fehler beim Analysieren des Metadaten-Umschlags für die Cloud-Instanz %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10002": "Cloud-Ressourcentyp wird nicht unterstützt: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10068": "Der NFS-Primärspeicher [uuid:%s, name:%s] ist an keine Cluster angehängt oder es sind keine Hosts in den angehängten Clustern verbunden.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10009": "Ungültiger Typ: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10007": "Unterstützt nur Ressource oder Aktion, aber [%s] erhalten", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10008": "Standardwert muss im JSON-Format gemäß Typ [%s] sein, aber [%s] wurde gefunden.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10029": "cipherText darf nicht null sein", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10027": "Fehler beim Finden des geheimen Schlüssels für den Zugriff auf verschlüsselte Ressourcen. Bitte stellen Sie sicher, dass der geheime Schlüssel korrekt konfiguriert ist und über die erforderlichen Berechtigungen verfügt.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10028": "Fehler beim Parsen des geheimen Schlüssels, Fehler: %s", + "ORG_ZSTACK_IAM2_10022": "Die aktuelle virtuelle Instanz [ID: %s] ist veraltet, bitte reaktivieren Sie sie.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10016": "Ungültige dynamische Variablenreferenz, die im Format ${variable:default} sein muss", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10024": "HMAC-Verschlüsselung für große Dateien fehlgeschlagen, Code: %s, Details: %s", + "ORG_ZSTACK_IAM2_10021": "Der Benutzer [%s] ist kein registrierter Plattformbenutzer", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10017": "Das angegebene Verb muss '::' enthalten, um den Namespace und die Methode zu bezeichnen!", + "ORG_ZSTACK_IAM2_10024": "Das alte Passwort stimmt nicht mit dem ursprünglichen Passwort überein. Das Passwort der virtuellen Maschine [uuid:%s] kann nicht aktualisiert werden.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10014": "Falsches JSON-Format, Ursache: %s", + "ORG_ZSTACK_IAM2_10023": "Nur Administratoren und die virtuelle Instanz selbst können Aktualisierungen durchführen", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10015": "Eigenschaftsdatei-Ressourcensatz kann nicht gefunden werden!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10012": "Ungültiger Decoder: %s!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10013": "Kein Stammelement in Ihrer CloudFormation-Vorlage gefunden, bitte überprüfen Sie Ihre Vorlagendefinition!", + "ORG_ZSTACK_IAM2_10020": "Das Kontingent [name:%s] des Kontos [uuid:%s] kann nicht auf %d gesetzt werden, da es das Kontingent der Organisation [uuid:%s] überschreiten würde.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10011": "Typ ist: %s, aber erwarteter Typ: %s", + "ORG_ZSTACK_PCIDEVICE_10058": "Der Host [%s] konnte nicht in den Wartungsmodus wechseln. Die VM [%s] kann aufgrund eines PCI-Geräts nicht automatisch migriert werden.", + "ORG_ZSTACK_PCIDEVICE_10056": "VM[UUID:%s] konnte nicht gestartet werden, da nicht alle PCI-Geräte[UUIDs:%s] existieren", + "ORG_ZSTACK_PCIDEVICE_10059": "PCI-Gerät [uuid:%s] kann nicht an VM [uuid:%s] angehängt werden, da der Status falsch ist", + "ORG_ZSTACK_PCIDEVICE_10050": "Bitte hängen Sie alle GPU-Geräte von der VM[%s] aus und versuchen Sie es erneut", + "ORG_ZSTACK_PCIDEVICE_10053": "Die angegebenen PCI-Geräte sind nicht zusammengefasst: PCI-Gerät mit UUID [%s] ist auf einem Host mit UUID [%s], während ein anderes PCI-Gerät mit UUID [%s] auf einem anderen Host mit UUID [%s] ist", + "ORG_ZSTACK_PCIDEVICE_10052": "Bitte hängen Sie andere PCI-Geräte der VM[%s] aus und versuchen Sie es erneut", + "ORG_ZSTACK_PCIDEVICE_10051": "Bitte hängen Sie alle GPU-Geräte der VM[%s] aus und versuchen Sie es erneut", + "ORG_ZSTACK_PCIDEVICE_10068": "Das Stammvolume [uuid:%s] kann nicht migriert werden, da es angehängte PCI-Geräte hat", + "ORG_ZSTACK_PCIDEVICE_10066": "VM[UUID:%s] kann nicht migriert werden, da ein PCI-Gerät angehängt ist", + "ORG_ZSTACK_PCIDEVICE_10061": "Es konnte kein ausreichendes PCI-Gerät der Spezifikation [uuid:%s] im Ziel-Host [uuid:%s] für die virtuelle Maschine [uuid:%s] gefunden werden", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10003": "Kein Backup-Speicher-Plugin mit der Identität: %s registriert", + "ORG_ZSTACK_PCIDEVICE_10065": "vm[%s]-Instanz existiert nicht; kann nicht an PCI-Gerät[%s] gebunden werden", + "ORG_ZSTACK_PCIDEVICE_10064": "PCI-Gerät [uuid:%s] kann nicht an VM [uuid:%s] aufgrund von Host-Ressourcen-Zuordnungsproblemen angehängt werden.", + "ORG_ZSTACK_PCIDEVICE_10063": "PCI-Geräte [%s] sind nicht alle zur Verwendung verfügbar.", + "ORG_ZSTACK_PCIDEVICE_10062": "Etwas stimmt nicht mit der IOMMU-Gruppe des PCI-Geräts[uuid:%s]", + "ORG_ZSTACK_IAM2_10008": "virtualID[uuid:%s] existiert nicht innerhalb des Projekts[uuid:%s]", + "ORG_ZSTACK_IAM2_10009": "Projekt[name:%s] existiert nicht", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10000": "Null-Installationspfad vom Treiber zurückgegeben: %s", + "ORG_ZSTACK_IAM2_10004": "VirtualMachine-ID-Information konnte nicht aus Datei geladen werden wegen\\n%s", + "ORG_ZSTACK_IAM2_10003": "Es gibt %d Probleme mit dem Code.", + "ORG_ZSTACK_IAM2_10006": "Virtual Machine ID-Information konnte nicht aus Datei erstellt werden.", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10001": "%s: Gesundheitsstatus: %s", + "ORG_ZSTACK_IAM2_10005": "UUID [%s] existiert bereits. Bitte versuchen Sie einen anderen.", + "ORG_ZSTACK_MEMORY_10000": "Keine Daten gefunden für %s auf Host[%s]", + "ORG_ZSTACK_PCIDEVICE_10036": "Kann PCI-Geräte auf Host [UUID:%s] nicht SR-IOV virtualisieren, die an VM angehängt sind", + "ORG_ZSTACK_PCIDEVICE_10035": "PCI-Geräte auf Host [UUID:%s] sind bereits SRIOV virtualisiert.", + "ORG_ZSTACK_PCIDEVICE_10034": "SRIOV konnte für Gerät nicht aktiviert werden, da IOMMU auf Host [UUID:%s] deaktiviert ist", + "ORG_ZSTACK_PCIDEVICE_10033": "PCI-Gerät [uuid:%s] ist nicht verfügbar", + "ORG_ZSTACK_PCIDEVICE_10039": "PCI-Gerät [UUID:%s] existiert nicht oder ist nicht SRIOV virtualisiert.", + "ORG_ZSTACK_PCIDEVICE_10037": "Nur %d virtuelle PCI-Geräte können von %s-Domänen auf Host[uuid:%s] generiert werden.", + "ORG_ZSTACK_STORAGE_CDP_10109": "Backup-Speicher[uuid: %s] wurde bereits aktualisiert", + "ORG_ZSTACK_STORAGE_CDP_10104": "Auftrag[uuid:%s] wurde beendet", + "ORG_ZSTACK_STORAGE_CDP_10105": "CDP-Auftrag führt Daten zusammen; bitte initiieren Sie keinen Abholvorgang.", + "ORG_ZSTACK_STORAGE_CDP_10106": "CDP-Auftrag[uuid:%s] überschritt Speicherauslastung: Maximum %d GB, verwendet %d GB.", + "ORG_ZSTACK_STORAGE_CDP_10107": "Unerwarteter VM-Instanzstatus: %s", + "ORG_ZSTACK_STORAGE_CDP_10102": "CDP-Auftrag[uuid: %s] hat keine zugeordnete virtuelle Maschine", + "ORG_ZSTACK_PCIDEVICE_10047": "PCI-Gerät [uuid:%s] ist nicht in verwaltete Geräte virtualisiert", + "ORG_ZSTACK_PCIDEVICE_10045": "PCI-Gerät [uuid:%s] kann nicht durch mdev-Spezifikation virtualisiert werden [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_10044": "PCI-Gerät [UUID:%s] kann nicht in MDEVs virtualisiert werden. Stellen Sie sicher, dass es aktiviert und getrennt ist.", + "ORG_ZSTACK_PCIDEVICE_10049": "Der Host [UUID:%s], an den das PCI-Gerät [UUID:%s] angehängt ist, ist nicht verbunden.", + "ORG_ZSTACK_PCIDEVICE_10048": "Von [UUID:%s] generierte PCI-Geräte noch an VM-Instanz angehängt", + "ORG_ZSTACK_STORAGE_CDP_10119": "Unerwarteter Auftragstyp: %s", + "ORG_ZSTACK_PCIDEVICE_10043": "PCI-Gerät [%s] kann nicht freigegeben werden, da seine virtuellen Funktionen in Verwendung sind.\\nDetails:\\n%s", + "ORG_ZSTACK_PCIDEVICE_10042": "PCI-Gerät [%s] kann nicht ungültig gemacht werden, da es kein GPU oder Netzwerkschnittstellen-Controller ist.", + "ORG_ZSTACK_PCIDEVICE_10041": "Virtuelle PCI-Geräte auf Host [uuid:%s] konnten nicht ungültig gemacht werden, da sie noch an VM angehängt sind", + "ORG_ZSTACK_PCIDEVICE_10040": "PCI-Gerät [uuid:%s] konnte nicht ungültig gemacht werden, da der Host [uuid:%s] nicht verbunden ist", + "ORG_ZSTACK_STORAGE_CDP_10117": "CDP-Aufgabe[uuid: %s] nicht gefunden", + "ORG_ZSTACK_STORAGE_CDP_10118": "CDP-Aufgabe[uuid: %s] Status hat sich abnormal geändert, alter Status: %s, neuer Status: %s aufgrund überschrittenem Speicherkontingent, aktuell: %d, Kontingent: %d.", + "ORG_ZSTACK_STORAGE_CDP_10111": "Die QEMU-img-Version des Backup-Speichers [UUID: %s] muss aktualisiert werden.", + "ORG_ZSTACK_STORAGE_CDP_10112": "Keine Cloud Data Protection-Aufgabe für VM gefunden: %s", + "ORG_ZSTACK_STORAGE_CDP_10113": "Kein Backup-Speicher für virtuelle Maschine konfiguriert: %s", + "ORG_ZSTACK_STORAGE_CDP_10114": "Keine CdpBackupFactory vom Typ[%s] in der Cloud-Umgebung gefunden", + "ORG_ZSTACK_STORAGE_CDP_10110": "Die Architektur des Backup-Speichers [UUID: %s] unterstützt kein Upgrade der Continuous Data Protection-Aufgabe", + "ORG_ZSTACK_IDENTITY_10072": "Kontingent[name: %s] kann für das Konto[identifier: %s] nicht aktualisiert werden", + "ORG_ZSTACK_IDENTITY_10071": "Kein Kontingent-Update-Prüfer für Kontingent[uuid:%s, type:%s] gefunden", + "ORG_ZSTACK_AI_CONTAINER_10001": "Model-Center mit uuid %s nicht in der Cloud-Umgebung gefunden", + "ORG_ZSTACK_AI_CONTAINER_10005": "Dienst-URL konnte nicht abgerufen werden, möglicherweise aufgrund einer null-Dienst-IP-Adresse. Bitte überprüfen Sie die Kubernetes-Netzwerkkonfiguration.", + "ORG_ZSTACK_AI_CONTAINER_10004": "Kubernetes-Dienst konnte in der Cloud-Umgebung nicht erstellt werden", + "ORG_ZSTACK_AI_CONTAINER_10003": "Kubernetes-Deployment für Anwendung %s im Namespace %s konnte aufgrund von Cloud-Computing-Ressourcenbeschränkungen oder Konfigurationsproblemen nicht erstellt werden. Bitte überprüfen Sie Ihre Ressourcenzuweisung und Bereitstellungskonfiguration.", + "ORG_ZSTACK_AI_CONTAINER_10009": "Endpunkt mit UUID %s nicht gefunden, Container-Ressourcen können nicht in der Datenbank synchronisiert werden", + "ORG_ZSTACK_AI_CONTAINER_10007": "Speicherdienst im Kubernetes-Cluster konnte nicht initialisiert werden", + "ORG_ZSTACK_AI_CONTAINER_10006": "Netzwerkrichtlinie für Verteilungsmodell-Dienstinstanz %s konnte nicht erstellt werden", + "ORG_ZSTACK_TAG2_10011": "Ressource[uuid:%s] wurde mit %d Tags verknüpft und kann keine weiteren aufnehmen.", + "ORG_ZSTACK_IDENTITY_10063": "Eine Anweisung muss ein nicht-leeres Aktionsfeld haben. Ungültige Anweisung[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10006": "Es existiert bereits ein NFS-Primärspeicher mit URL %s in Zone[uuid: %s]", + "ORG_ZSTACK_IDENTITY_10062": "Eine Anweisung muss ein Aktionsfeld angeben. Ungültige Anweisung[%s]", + "ORG_ZSTACK_IDENTITY_10061": "Eine Anweisung muss einen Wert zuweisen oder einen Zustand beeinflussen. Ungültige Anweisung[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10008": "Mehrere CIDR-Blöcke mit dem Netzwerkinterface verknüpft. Bitte geben Sie einen einzelnen CIDR-Block an oder überprüfen Sie Ihre Netzwerkkonfiguration.", + "ORG_ZSTACK_IDENTITY_10060": "Gruppe[name: %s, uuid: %s] ist nicht mit Konto[uuid: %s] verknüpft", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10009": "Ungültiger CIDR-Block: %s", + "ORG_ZSTACK_IDENTITY_10067": "Der Name des Administrator-Kontos kann nicht aktualisiert werden. Bitte stellen Sie sicher, dass Sie die korrekte Syntax und Parameter zum Ändern von Kontoinformationen verwenden. Weitere Details finden Sie in der offiziellen Dokumentation.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10002": "Es kann kein verbundener Host im Cluster für die angegebene Platzierungsgruppe [uuid: %s] gefunden werden", + "ORG_ZSTACK_IDENTITY_10066": "Das bereitgestellte Passwort stimmt nicht mit dem aktuellen Passwort für das Konto [UUID: %s] überein. Bitte stellen Sie die Richtigkeit sicher und versuchen Sie es erneut.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10003": "Es kann kein verbundener Host zum Ausführen des Befehls für NFS-Primärspeicher [uuid:%s] gefunden werden", + "ORG_ZSTACK_IDENTITY_10065": "Ein Konto hat bereits einen Namen, der %s entspricht", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10004": "Es kann kein Host mit verbundener NFS-Verbindung zum Ausführen von Befehlen für NFS-Primärspeicher [uuid:%s] gefunden werden", + "ORG_ZSTACK_IDENTITY_10069": "Das Konto [uuid: %s, name: %s] ist ein Standardkonto und hat nicht die Berechtigung, das Passwort eines anderen Kontos [uuid: %s] zurückzusetzen.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10000": "Der NFS-Primärspeicher [uuid:%s] ist keinen Compute-Clustern zugeordnet und kann daher das Root-Volume [uuid:%s] der virtuellen Maschine [uuid:%s] nicht löschen.", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10004": "Nur baremetal2-Image mit Boot-Modus %s wird unterstützt", + "ORG_ZSTACK_IDENTITY_10068": "Nur administrative Konten können ihre Passwörter aktualisieren.", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10003": "Das bootMode-Attribut ist für baremetal2-Images obligatorisch.", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10002": "Nur Root-Volume-Vorlagen im raw/qcow2-Format können mit baremetal2 markiert werden.", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10001": "Nur ein System-Tag des Typs baremetal2 ist zulässig, aber %d wurden gefunden", + "ORG_ZSTACK_AI_CONTAINER_10012": "Pod-Name konnte nicht anhand der IP %s gefunden werden", + "ORG_ZSTACK_AI_CONTAINER_10011": "Pod-IP-Adresse konnte nicht abgerufen werden, Eintrag kann nicht zur Container-Endpunkttabelle hinzugefügt werden. Bitte stellen Sie sicher, dass der Pod ausgeführt wird und zugänglich ist.", + "ORG_ZSTACK_AI_CONTAINER_10010": "Cluster mit UUID %s wurde in der Virtualisierungsumgebung nicht gefunden", + "ORG_ZSTACK_COMPUTE_VM_NUMA_10003": "Ungültige CPU-Menge [%s]", + "ORG_ZSTACK_AI_CONTAINER_10016": "K8s-Deployment %s konnte nicht abgerufen werden", + "ORG_ZSTACK_AI_CONTAINER_10015": "Kubernetes-Dienst kann nicht gelöscht werden, weil %s", + "ORG_ZSTACK_TAG2_10008": "Alle Tokentypen müssen angegeben werden", + "ORG_ZSTACK_AI_CONTAINER_10014": "Kubernetes-Deployment kann nicht gelöscht werden, weil %s", + "ORG_ZSTACK_AI_CONTAINER_10013": "Label %s konnte nicht zu Pod %s hinzugefügt werden", + "ORG_ZSTACK_TAG2_10006": "Ungültige Farbspezifikation [%s], muss ein gültiger Hexadezimalcode wie #FF00FF sein", + "ORG_ZSTACK_TAG2_10007": "Format abrufen [%s], Format muss entweder name::{tokenName1}::{tokenName2} ... ::{tokenNameN} oder {tokenName1}::{tokenName2} ... ::{tokenNameN} sein. Namen dürfen keine '{}:' enthalten.", + "ORG_ZSTACK_AI_CONTAINER_10019": "Ungültiges YAML-Format: %s", + "ORG_ZSTACK_TAG2_10004": "Einfaches Tag-Muster ist leer oder enthält ungültige Tokens", + "ORG_ZSTACK_AI_CONTAINER_10018": "Deployment %s hat keine Instanzinformationen", + "ORG_ZSTACK_TAG2_10005": "Ungültige Tag-UUIDs %s, Tag-Typ muss ein einfacher Typ sein", + "ORG_ZSTACK_AI_CONTAINER_10017": "Deployment %s existiert nicht", + "ORG_ZSTACK_IDENTITY_10070": "Quota[name: %s] für das Konto [uuid: %s] kann nicht gefunden werden", + "ORG_ZSTACK_TAG2_10002": "Einfaches Tag-Musterformat für Cloud-Ressourcen-Metadaten kann nicht aktualisiert werden", + "ORG_ZSTACK_TAG2_10003": "Doppelter Ressourcenname gefunden. Bitte überprüfen und beheben.", + "ORG_ZSTACK_SNS_PLATFORM_WECOM_10000": "Nachrichten an WeCom konnten nicht gesendet werden. Status: %s, Body: %s", + "ORG_ZSTACK_TAG2_10000": "Tag-Eindeutigkeitsverletzung: Ein Tag vom Typ [%s] mit Namen [%s] existiert bereits unter dem Konto [%d].", + "ORG_ZSTACK_TAG2_10001": "Sie können nur die Token-ID aktualisieren.", + "ORG_ZSTACK_PCIDEVICE_10072": "PCI-Gerätespezifikation [uuid:%s] existiert nicht", + "ORG_ZSTACK_PCIDEVICE_10071": "illegaler Typ[%s] für PCI-Gerät, nur unterstützte Typen sind zulässig", + "ORG_ZSTACK_PCIDEVICE_10070": "PCI-Gerät [uuid:%s] existiert nicht", + "ORG_ZSTACK_PCIDEVICE_10075": "PCI-Gerät [UUID:%s] existiert nicht oder ist für VM [UUID:%s] deaktiviert", + "ORG_ZSTACK_PCIDEVICE_10073": "illegaler Typ[%s] für PCI-Gerätespezifikation, nur unterstützte Typen sind zulässig", + "ORG_ZSTACK_AI_CONTAINER_10023": "Ungültige Kubernetes-Deployment-YAML: %s", + "ORG_ZSTACK_AI_CONTAINER_10020": "Fehler beim Patchen des Kubernetes-Deployments %s zum Beenden aller Pods", + "ORG_ZSTACK_AI_CONTAINER_10025": "Modell-Service-Instanzgruppe %s nicht in der Datenbank gefunden", + "ORG_ZSTACK_AI_CONTAINER_10024": "Fehler beim Patchen des k8s-Deployments %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10039": "Fehler beim Erstellen des Root-Volumes[uuid:%s] aus dem zwischengespeicherten Image[path:%s] aufgrund eines Fehlers in der Virtualisierungsumgebung", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10040": "originText oder certificateText darf nicht null sein", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10036": "Fehler beim Löschen von Bits[%s] auf dem NFS-Primärspeicher[uuid:%s], Fehler: %s, wird den Installationspfad bereinigen, pinv.getUuid(), rsp.getError()", + "ORG_ZSTACK_NETWORK_L3_10067": "DNS-Fehler im Layer-3-Netzwerk [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10037": "Fehler beim Zurücksetzen des Volumes[uuid:%s] auf den Snapshot[uuid:%s] auf dem KVM-Host[uuid:%s, ip:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10038": "Fehler beim Zurücksetzen des Volumes[uuid:%s] auf das Image[uuid:%s] auf dem KVM-Host[uuid:%s, ip:%s], %s", + "ORG_ZSTACK_CRYPTO_AUTH_10020": "Klassenstruktur für %s kann nicht generiert werden", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10032": "Fehler beim Überprüfen der Existenz von %s auf dem NFS-Primärspeicher[uuid:%s], Fehler: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10034": "Leeres Volume[uuid:%s, name:%s] kann auf dem KVM-Host[uuid:%s, ip:%s] nicht erstellt werden, weil %s", + "ORG_ZSTACK_CRYPTO_AUTH_10029": "Zertifikatsinformationen für die virtuelle Maschine %s konnten nicht gefunden werden. Bitte stellen Sie sicher, dass die erforderlichen Zertifikate korrekt konfiguriert und in die Cloud-Umgebung hochgeladen wurden.", + "ORG_ZSTACK_CRYPTO_AUTH_10028": "Fehler beim Parsen des Klartextes im Verschlüsselungsparameter zum JSON-Objekt: %s", + "ORG_ZSTACK_HYGON_10006": "VM[uuid:%s] wurde nicht gefunden", + "ORG_ZSTACK_HYGON_10005": "Der Host mit UUID %s hat %d laufende virtuelle Maschine(n) mit aktivierten Hygon-Sicherheitsfunktionen. Bitte fahren Sie diese zuerst herunter.", + "ORG_ZSTACK_HYGON_10004": "Der Host[uuid:%s] ist nicht verbunden", + "ORG_ZSTACK_HYGON_10003": "Der Host[UUID:%s] erfordert, dass der Parameter 'enableCgroupDeviceAcl' größer als 0 für Hygon-mdev-Geräte ist. Bitte konfigurieren Sie diese Einstellung, bevor Sie mdev-Geräte generieren.", + "ORG_ZSTACK_HYGON_10002": "Der Host [UUID:%s] erfordert, dass die Konfiguration 'reconnect.host.restart.libvirtd.service' auf 'true' für Hygon-mdev-Geräte gesetzt ist. Bitte konfigurieren Sie diese Einstellung, bevor Sie mdev-Geräte generieren.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10017": "Zertifikatsgenerierung für die Cloud-Instanz %s fehlgeschlagen", + "ORG_ZSTACK_HYGON_10000": "mdev-Geräte können nicht entfernt werden, es sind noch %d mdev-Gerät(e) an VMs auf dem Host [uuid: %s] angehängt. Bitte stellen Sie sicher, dass alle VMs, die diese Geräte verwenden, zuerst gestoppt werden.", + "ORG_ZSTACK_NETWORK_L3_10073": "Es gibt keine Host-Route für Präfix[%s] im Layer-3-Netzwerk[uuid:%s].", + "ORG_ZSTACK_NETWORK_L3_10072": "Präfix [%s] ist kein gültiges IPv4-Netzwerk-CIDR", + "ORG_ZSTACK_NETWORK_L3_10071": "Es existiert bereits eine Host-Route für Präfix[%s] im L3-Netzwerk[uuid:%s]", + "ORG_ZSTACK_HYGON_10009": "Fehler bei der Zuweisung von Hygon-MDEV-Geräten aufgrund gleichzeitiger Zuweisung. Bitte später erneut versuchen.", + "ORG_ZSTACK_NETWORK_L3_10070": "next-hop[%s] ist keine gültige IPv4-Adresse", + "ORG_ZSTACK_HYGON_10008": "unzureichende Hygon IOMMU Group-Geräte auf Host[uuid:%s]. Erforderlich: %d", + "ORG_ZSTACK_HYGON_10007": "kann Hygon Security Element-Einstellungen nicht ändern, während VM[uuid:%s] sich im Status [%s] befindet. Bitte stoppen Sie die VM, bevor Sie Änderungen vornehmen", + "ORG_ZSTACK_TICKET_ENTITY_10001": "Vorgang verweigert. Das Ticket befindet sich im Status %s, kann der Vorgang [%s] nicht ausgeführt werden", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10031": "Die Sicherheitsgruppe [%s] existiert nicht", + "ORG_ZSTACK_IDENTITY_10022": "kann die Ressource[UUID:%s] nicht finden; falsche Ressourcen-ID oder die Ressource ist eine administrative Ressource", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10049": "Kann kein verwendbares Backend für die Cloud-Ressourcenzuweisung finden. Bitte stellen Sie sicher, dass Ihre Backend-Dienste ordnungsgemäß konfiguriert und verfügbar sind.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10042": "keine Hosts im Cluster[uuid:%s] sind für die Verbindung verfügbar", + "ORG_ZSTACK_IDENTITY_10026": "%s ist kein erkannter API-Endpunkt", + "ORG_ZSTACK_IDENTITY_10025": "Der durch userUuid[%s] angegebene Benutzer gehört nicht dem aktuellen Konto an, und dem aktuellen Konto fehlen administrative Berechtigungen, daher können die Berechtigungen des Benutzers nicht überprüft werden.", + "ORG_ZSTACK_IDENTITY_10029": "kann das Konto[uuid:%s] nicht finden", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10001": "security instance[uuid:%s] Modell ist ungültig", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10037": "ungültiger Algorithmustyp %s, unterstützte Typen sind: %s.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10002": "die Sicherheitsinstanz [%s] konnte die manuelle Synchronisierung nicht auslösen, bitte bestätigen Sie, ob die Sicherheitsinstanz den Schlüssel synchronisiert hat!", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10038": "der für den Datenschutz angegebene Ressourcenpool[%s] existiert nicht", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10000": "secretResourcePool[uuid:%s] befindet sich nicht im erwarteten Status %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10032": "es gab einen Sicherheitsvorfall mit der Management-IP [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10033": "managementIp[%s] ist keine gültige IPv4-Adresse", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10034": "Verbindung zur Sicherheitsinstanz %s[%s] konnte nicht hergestellt werden, wegen %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10035": "Nach Aktivierung der Kryptofunktion sollte mindestens eine Sicherheitsinstanz im entsprechenden Ressourcenpool reserviert werden.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10017": "Verzeichnis[installUrl:%s] kann auf KVM-Host[uuid:%s, ip:%s] nicht erstellt werden, weil %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10018": "Kein Host im Cluster verbunden oder primärer Speicher [uuid:%s] an ein Cluster angeschlossen", + "ORG_ZSTACK_IDENTITY_10050": "toPublic ist auf false gesetzt, accountUUIDs dürfen nicht null oder leer sein. Bitte stellen Sie sicher, dass die UUIDs bereitgestellt werden.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10019": "primärer NFS-Speicher [uuid:%s] konnte von Host [uuid:%s] nicht gepingt werden, wegen Netzwerkproblemen oder Nichtverfügbarkeit. Trennen Sie diese Host-PS-Verbindung.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10013": "Übertragung [%s] von SFTP-Backup-Speicher [hostname:%s] zu primärem NFS-Speicher [uuid:%s, path:%s] fehlgeschlagen, %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10014": "Hochladen von Bits von primärem NFS-Speicher[uuid:%s, mountpoint:%s] zu SFTP-Backup-Speicher[hostname:%s, path:%s] fehlgeschlagen, %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10016": "primärer Speicher[uuid:%s, name:%s] kann nicht an Cluster[uuid:%s] angehängt werden. Der KVM-Host im Cluster verwendet qemu-img mit Version[%s]; jedoch ist der primäre Speicher an ein anderes Cluster angeschlossen, das einen KVM-Host mit qemu-img Version[%s] verwendet. Qemu-img-Versionen größer als %s sind nicht kompatibel mit denen kleiner als %s, was dazu führen kann, dass Volume-Snapshot-Vorgänge fehlschlagen. Bitte vermeiden Sie das Anhängen eines primären Speichers an Cluster mit verschiedenen Linux-Distributionen, um qemu-img-Versionskonflikte zu verhindern.", + "ORG_ZSTACK_IDENTITY_10059": "Benutzer[name: %s, uuid: %s] ist nicht mit Konto[uuid: %s] verknüpft", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10010": "IP-Adresse [%s] gehört nicht zum CIDR-Block [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10011": "Es laufen %s virtuelle Maschinen auf dem primären NFS-Speicher, bitte stoppen Sie sie und versuchen Sie es erneut:", + "ORG_ZSTACK_IDENTITY_10057": "Richtlinie[Name: %s, UUID: %s] gehört nicht zum Konto[UUID: %s]", + "ORG_ZSTACK_CRYPTO_AUTH_10009": "Falsches Modell für geheime Ressourcen-Pool, erwartet %s, gefunden %s", + "ORG_ZSTACK_CRYPTO_AUTH_10008": "Modell für geheime Ressourcen-Pool [%s] nicht gefunden", + "ORG_ZSTACK_CRYPTO_AUTH_10006": "Der Vorgang wird in der aktuellen Cloud-Umgebung nicht unterstützt. Bitte stellen Sie sicher, dass Ihre virtuelle Maschine-Instanz den erforderlichen Vorgang unterstützt.", + "ORG_ZSTACK_IDENTITY_10041": "Gruppe kann nicht erstellt werden. Eine Gruppe mit demselben Namen existiert bereits unter dem Konto [UUID: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10028": "Der ausgewählte Host [UUID:%s] für die Speichermigration ist nicht verfügbar.", + "ORG_ZSTACK_CRYPTO_AUTH_10016": "Verbindung mit dem Remote-Kryptografie-Dienstknoten konnte nicht hergestellt werden. Bitte stellen Sie sicher, dass der Dienst aktiv ist und die Netzwerkverbindung korrekt konfiguriert ist.", + "ORG_ZSTACK_IDENTITY_10040": "KontoName und KontoUUID dürfen nicht beide null sein; mindestens einer muss angegeben werden.", + "ORG_ZSTACK_CRYPTO_AUTH_10015": "Die Identitätsauthentifizierung gibt keinen Ressourcenpool für die Ressourcenzuweisung an. Bitte stellen Sie sicher, dass der Ressourcenpool korrekt identifiziert und für den Dienst angegeben wird.", + "ORG_ZSTACK_IDENTITY_10045": "Integriertes Administratorkonto kann nicht gelöscht werden. Bitte verwenden Sie ein nicht-integriertes Konto zum Löschen.", + "ORG_ZSTACK_IDENTITY_10044": "Das Konto %s darf sich nicht selbst löschen. Bitte wenden Sie sich an einen Administrator.", + "ORG_ZSTACK_IDENTITY_10043": "Konto kann nicht erstellt werden. Ein Konto mit demselben Namen existiert bereits.", + "ORG_ZSTACK_IDENTITY_10042": "Benutzer kann nicht erstellt werden. Ein Benutzer mit demselben Namen existiert bereits unter dem Konto [UUID: %s].", + "ORG_ZSTACK_IDENTITY_10049": "Alle Authentifizierungsprüfungen sind fehlgeschlagen, und die angegebene Konto-UUID-Liste ist null oder leer. Bitte überprüfen Sie Ihre Eingabe und stellen Sie sicher, dass gültige Konto-UUIDs angegeben werden.", + "ORG_ZSTACK_IDENTITY_10048": "Ihre Sitzung ist einem Benutzer zugeordnet. Sie können nicht die Identität eines anderen Benutzers annehmen [UUID:%s].", + "ORG_ZSTACK_IDENTITY_10047": "Die aktuelle Sitzung ist eine kontenbasierte Sitzung. Bitte geben Sie die 'UUID' des Benutzers an, den Sie aktualisieren möchten.", + "ORG_ZSTACK_IDENTITY_10046": "Nur administrative Benutzer können den Kontenzugang beenden.", + "ORG_ZSTACK_CRYPTO_AUTH_10019": "Abrufen des Integritätspassworts aus der Datenbank fehlgeschlagen, da %s kein Integritätspasswort generiert", + "ORG_ZSTACK_VHOST_KVM_10000": "vHostUser-Datenträger unterstützt nur den Virtio-Modus. Bitte überprüfen Sie, ob die Image-Plattform die erforderlichen Virtio-Treiber installiert hat.", + "ORG_ZSTACK_VHOST_KVM_10001": "vHost-User-Datenträger unterstützt den Virtio-SCSI-Modus nicht; bitte deaktivieren Sie den Virtio-SCSI-Modus.", + "ORG_ZSTACK_NETWORK_L3_10029": "%s ist keine gültige IPv6-Adresse für die Cloud-Ressourcenkonfiguration", + "ORG_ZSTACK_USBDEVICE_10005": "PassThrough unterstützt nur die Verwendung auf einer VM, die in der Host-Umgebung ausgeführt wird.", + "ORG_ZSTACK_ALIYUN_ECS_10019": "Nur administrative Benutzer können den Parameter [onlyZstack] auf false setzen.", + "ORG_ZSTACK_STORAGE_BACKUP_10018": "Erstellen des Images aus Backup %s fehlgeschlagen", + "ORG_ZSTACK_ALIYUN_ECS_10018": "Nur nachnutzungsbasierte ECS-Instanzen unterstützen die Remote-Löschung; der angegebene ECS-Abrechnungstyp ist: %s", + "ORG_ZSTACK_USBDEVICE_10002": "Die Anzahl der an die VM angeschlossenen USB-Geräte hat das Limit erreicht. Aktuelle Nutzung: %s", + "ORG_ZSTACK_ALIYUN_ECS_10017": "Nur ECS-Instanzen mit dem Status \"Wird ausgeführt\" oder \"Gestoppt\" können gelöscht werden, aktueller Status ist %s", + "ORG_ZSTACK_NETWORK_L3_10025": "Kostenlose IP mit Start [IP:%s] konnte nicht abgerufen werden, da Start [IP:%s] keine gültige IPv6-Adresse ist", + "ORG_ZSTACK_USBDEVICE_10009": "VM [UUID:%s] kann nicht migriert werden, da USB-Geräte über Passthrough angeschlossen sind", + "ORG_ZSTACK_STORAGE_BACKUP_10015": "%s kann auf dem Backup-Speicher [UUID:%s] nicht zugewiesen werden, es sind nur %s verfügbar", + "ORG_ZSTACK_NETWORK_L3_10024": "konnte keine freie IP mit start[ip:%s] erhalten, weil start[ip:%s] keine gültige IPv4-Adresse ist", + "ORG_ZSTACK_USBDEVICE_10008": "vm[%s] kann nicht starten, weil die USB-Umleitung zum Host nicht eingerichtet ist", + "ORG_ZSTACK_NETWORK_L3_10023": "konnte keine freie IP mit start[ip:%s] erhalten, weil das l3Network[uuid:%s] für den Dual-Stack-Modus konfiguriert ist", + "ORG_ZSTACK_USBDEVICE_10007": "USB ist bereits an virtuelle Maschine [UUID:%s] gebunden und kann nicht an eine andere VM gebunden werden.", + "ORG_ZSTACK_STORAGE_BACKUP_10013": "erforderlicher Primary-Speicher[uuid:%s, type:%s] unterstützt keinen Backup-Speicher.", + "ORG_ZSTACK_NETWORK_L3_10022": "ipRangeUuid und l3NetworkUuid dürfen nicht beide null sein; mindestens einer muss gesetzt sein.", + "ORG_ZSTACK_USBDEVICE_10006": "USB-Gerät [uuid:%s] kann nicht an VM [uuid:%s] angeschlossen werden, mögliche Gründe: das Gerät ist nicht aktiviert oder wurde bereits an eine andere VM angeschlossen, oder das Gerät und die VM befinden sich nicht auf demselben Host.", + "ORG_ZSTACK_ALIYUN_ECS_10015": "Das Image wurde gelöscht! Stellen Sie sicher, dass das Image ordnungsgemäß beendet und alle Ressourcen freigegeben wurden, bevor Sie es löschen.", + "ORG_ZSTACK_ALIYUN_ECS_10014": "ECS-Image existiert remote, Name: %s, Erstellungszeit: %s", + "ORG_ZSTACK_ALIYUN_ECS_10013": "ECS-Image existiert sowohl remote als auch lokal, ECS-Image-UUID: %s, Name: %s, Erstellungszeit: %s", + "ORG_ZSTACK_NETWORK_L3_10032": "IPv6-Adresspool wird nicht unterstützt; daher ist die IP-Bereich-Ergänzung nicht möglich. Stellen Sie sicher, dass Ihre Netzwerkkonfiguration IPv6 unterstützt, bevor Sie fortfahren.", + "ORG_ZSTACK_STORAGE_BACKUP_10011": "Nur ein Backup-Speicher-Datennetzwerk-System-Tag ist zulässig, aber %s gefunden", + "ORG_ZSTACK_NETWORK_L3_10030": "[startIp %s, endIp %s, prefixLen %d, gateway %s] stellt keinen gültigen IPv6-Bereich für Cloud-Netzwerkkonfigurationen dar.", + "ORG_ZSTACK_STORAGE_BACKUP_10010": "Kapazitätsreservierung auf allen Backup-Speicherknoten fehlgeschlagen. Bitte überprüfen Sie die Verfügbarkeit Ihrer Backup-Speicherressourcen.", + "ORG_ZSTACK_USBDEVICE_10016": "Sie können maximal %s USB 3.0-Geräte an eine virtuelle Maschine anschließen.", + "ORG_ZSTACK_USBDEVICE_10015": "Sie können maximal %s USB 2.0-Gerät an eine VM-Instanz anschließen.", + "ORG_ZSTACK_NETWORK_L3_10038": "neues Netzwerk-CIDR [%s] unterscheidet sich vom alten Netzwerk-CIDR [%s]", + "ORG_ZSTACK_USBDEVICE_10014": "Sie können maximal %s USB 1.0-Gerät an eine VM-Instanz anschließen.", + "ORG_ZSTACK_NETWORK_L3_10037": "neuer IP-Bereich [startIP:%s, endIP:%s] überschneidet sich mit einem bestehenden IP-Bereich [startIP:%s, endIP:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10028": "Volumen-Backup [uuid:%s] nicht im Speichervolume [uuid:%s] gefunden", + "ORG_ZSTACK_NETWORK_L3_10036": "IPv6-Präfixlänge muss %d für Stateless-DHCP oder SLAAC sein", + "ORG_ZSTACK_NETWORK_L3_10035": "addressMode[%s] unterscheidet sich vom L3Network-Address-Mode[%s]", + "ORG_ZSTACK_USBDEVICE_10019": "Das USB-Gerät [UUID:%s] befindet sich nicht in einem anschließbaren Zustand von %s", + "ORG_ZSTACK_NETWORK_L3_10034": "Das Systemnetzwerk unterstützt derzeit kein IPv6, daher wird die IP-Bereich-Ergänzung derzeit nicht unterstützt. Stellen Sie sicher, dass Ihre Netzwerkkonfiguration IPv6 unterstützt, bevor Sie diesen Vorgang versuchen.", + "ORG_ZSTACK_USBDEVICE_10018": "Das USB-Gerät [UUID:%s] wurde bereits an eine andere virtuelle Maschine [UUID:%s] angeschlossen.", + "ORG_ZSTACK_NETWORK_L3_10033": "IP-Bereich-Präfixlänge liegt außerhalb des gültigen Bereichs [%d - %d]", + "ORG_ZSTACK_USBDEVICE_10017": "Das USB-Gerät [UUID: %s] wurde bereits an dieselbe VM [UUID: %s] angeschlossen.", + "ORG_ZSTACK_STORAGE_BACKUP_10024": "Volumen-Backup [uuid:%s] nicht auf Speicherknoten [uuid:%s] gefunden", + "ORG_ZSTACK_ALIYUN_ECS_10022": "private IP existiert in VSwitch: %s, zugewiesen an ECS: %s", + "ORG_ZSTACK_ALIYUN_ECS_10021": "%s liegt nicht im CIDR-Bereich: %s", + "ORG_ZSTACK_ALIYUN_ECS_10020": "vSwitch verfügbare IP-Adressen sind unzureichend, aktuell (%d)", + "ORG_ZSTACK_USBDEVICE_10012": "VM [uuid:%s] kann nicht migriert werden, da sie angeschlossene PCI-Geräte hat", + "ORG_ZSTACK_ALIYUN_ECS_10027": "Ein Instance-Angebot oder Instanztyp muss angegeben werden!", + "ORG_ZSTACK_USBDEVICE_10011": "Root-Volume [uuid:%s] kann nicht migriert werden, da angeschlossene Speichergeräte vorhanden sind", + "ORG_ZSTACK_ALIYUN_ECS_10026": "%s ist kein gültiger Volume-Typ, gültige Typen sind [%s]", + "ORG_ZSTACK_ALIYUN_ECS_10025": "%s ist keine gültige IPv4-Adresse", + "ORG_ZSTACK_ALIYUN_ECS_10024": "Bandbreite muss bei der Zuweisung einer öffentlichen IP-Adresse angegeben werden", + "ORG_ZSTACK_NETWORK_L3_10043": "%s ist keine gültige Netzwerk-CIDR-Maske", + "ORG_ZSTACK_STORAGE_BACKUP_10023": "Eines der Backup-Speicher [UUID: %s] befindet sich im Status %s und kann daher keine Synchronisierungsoperation durchführen.", + "ORG_ZSTACK_NETWORK_L3_10042": "Das Gateway [gatewayId] liegt nicht im Subnetz subnetId", + "ORG_ZSTACK_STORAGE_BACKUP_10022": "Keine Volume-Backup-Factory vom Typ [%s] gefunden", + "ORG_ZSTACK_NETWORK_L3_10041": "%s ist keine gültige Netzwerk-CIDR, da sie keine verwertbaren IP-Adressen enthält", + "ORG_ZSTACK_STORAGE_BACKUP_10021": "Aktuelle VM [UUID: %s] des Backup-Volumes ist nicht mehr die VM [UUID: %s], die für das Backup verwendet wurde.", + "ORG_ZSTACK_STORAGE_BACKUP_10020": "Synchronisierung der Volume-Backup-Metadatendatei im Image-Store [uuid:%s] hat einen I/O-Fehler ergeben: %s", + "ORG_ZSTACK_NETWORK_L3_10049": "L3-Netzwerk [uuid %s: name %s] ist kein öffentliches Netzwerk; daher kann kein Adresspoolbereich hinzugefügt werden.", + "ORG_ZSTACK_NETWORK_L3_10047": "Keine gültige Kombination aus System und Kategorie, nur bestimmte Cloud-Computing-Plattformen sind gültig", + "ORG_ZSTACK_NETWORK_L3_10046": "%s ist kein gültiger FQDN-Domainname", + "ORG_ZSTACK_NETWORK_L3_10045": "Nicht unterstützter L3-Netzwerktyp [%s]", + "ORG_ZSTACK_NETWORK_L3_10044": "ipRangeUuids, L3NetworkUuids und zoneUuids müssen jeweils mindestens eine nicht-leere Liste enthalten, oder alle Werte müssen auf true gesetzt werden.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10023": "Port-Weiterleitungsregel mit erlaubtem CIDR konnte nicht angehängt werden, da vmNic [uuid:%s] bereits Regeln hat, die den Zielbereich der privaten Ports [%s, %s] überschneiden und den gleichen Protokolltyp [%s] haben", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10024": "Port-Weiterleitungsregel konnte nicht angehängt werden, da vmNic [uuid:%s] bereits eine in Konflikt stehende Regel hat, die den Zielbereich des privaten Ports [%s, %s] überschneidet und den gleichen Protokolltyp [%s] hat.", + "ORG_ZSTACK_SNMP_10010": "SNMP-Agent konnte nicht %s werden, da das Privacy-Passwort nicht leer sein kann.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10021": "Die VMNic [UUID:%s] hat bereits Port-Weiterleitungsregeln mit unterschiedlichen VIPs als die [UUID:%s].", + "ORG_ZSTACK_ALIYUN_NAS_CORE_10000": "Primärspeicher [%s] ist noch in Betrieb; daher ist das Löschen der Zugriffsgruppe nicht möglich.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10022": "vmNic UUID [%s] darf keine Port-Weiterleitung mit einer erlaubten CIDR-Regel hinzufügen, da ihr bereits eine öffentliche IP zugeordnet ist.", + "ORG_ZSTACK_NETWORK_L3_10054": "IP-Zuweisung darf keine Netzwerkadressen oder Broadcast-Adressen enthalten. Bitte stellen Sie sicher, dass die bereitgestellte IP eine gültige Host-Adresse innerhalb des Subnetzes ist.", + "ORG_ZSTACK_NETWORK_L3_10053": "Das Gateway [gatewayId] liegt nicht im Subnetz subnetId/cidrBlock", + "ORG_ZSTACK_NETWORK_L3_10052": "Der IP-Bereich [%s ~ %s] enthält Link-Local-Adressen, die für die Virtualisierung reserviert sind und nicht verwendet werden sollten.", + "ORG_ZSTACK_NETWORK_L3_10051": "Der IP-Bereich [%s ~ %s] enthält E-Klasse-Adressen, die reserviert sind.", + "ORG_ZSTACK_NETWORK_L3_10050": "Der IP-Bereich [%s ~ %s] enthält D-Klasse-Adressen, die für Multicast-Kommunikation reserviert sind.", + "ORG_ZSTACK_STORAGE_BACKUP_10008": "Nach Abzug der reservierten Kapazität ist kein verfügbares Backup-Speicher mit der erforderlichen Kapazität [%s Bytes] vorhanden", + "ORG_ZSTACK_STORAGE_BACKUP_10006": "Backup-Speicher [UUID:%s] wurde mit Zone [UUID:%s] verknüpft", + "ORG_ZSTACK_NETWORK_L3_10059": "Start-IP-Adresse [%s] liegt nach der End-IP-Adresse [%s]", + "ORG_ZSTACK_ALIYUN_ECS_10006": "URL-Dekodierung fehlgeschlagen: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10005": "Backup-Speicher mit UUID:%s wurde nicht an Zone mit UUID:%s angehängt", + "ORG_ZSTACK_NETWORK_L3_10058": "Netzwerkmaske [%s] ist keine gültige Netzwerkmaske und muss angegeben werden, um eine ungültige IP-Bereich-Netzwerkmaske von 0.0.0.0 zu vermeiden.", + "ORG_ZSTACK_STORAGE_BACKUP_10004": "zoneUuids und backupStorageUuids müssen jeweils mindestens eine nicht-leere Liste enthalten, oder beide auf true gesetzt sein.", + "ORG_ZSTACK_NETWORK_L3_10057": "Gateway [%s] ist keine gültige IPv4-Adresse", + "ORG_ZSTACK_STORAGE_BACKUP_10003": "%s darf in einer virtuellen Maschinenkonfiguration nicht null sein", + "ORG_ZSTACK_NETWORK_L3_10056": "End-IP [%s] ist keine gültige IPv4-Adresse", + "ORG_ZSTACK_NETWORK_L3_10055": "Start-IP [%s] ist keine gültige IPv4-Adresse", + "ORG_ZSTACK_CORE_SALT_10000": "SCP wurde im System [%s] nicht gefunden, Salt-Konfiguration kann nicht eingerichtet werden.", + "ORG_ZSTACK_ALIYUN_ECS_10004": "Kein Systemdatenträger für Instanz gefunden: [%s], Instanz-ID ist: [%s]", + "ORG_ZSTACK_CORE_SALT_10003": "Salt-Status [%s] auf Instanz [%s] konnte nicht ausgeführt werden, nach %s Versuchen fehlgeschlagen", + "ORG_ZSTACK_ALIYUN_ECS_10003": "Diese Verfügbarkeitszone [%s] kann den Instanztyp [%s] derzeit nicht unterstützen, bitte wählen Sie einen anderen Instanztyp oder eine andere Verfügbarkeitszone.", + "ORG_ZSTACK_ALIYUN_ECS_10002": "Derzeit sind keine verfügbaren Instanztypen vorhanden. Bitte versuchen Sie es später erneut oder ändern Sie Ihre Spezifikationen.", + "ORG_ZSTACK_SNMP_10000": "SNMP-Agent-Erstellung fehlgeschlagen, da bereits einer existiert.", + "ORG_ZSTACK_SNMP_10001": "SNMP-Agent-Dienst konnte nicht beendet werden, bitte stellen Sie sicher, dass zuerst ein SNMP-Agent erstellt wird.", + "ORG_ZSTACK_NETWORK_L3_10065": "Das Hinzufügen eines normalen IP-Bereichs erfordert die Angabe der Gateway-IP-Adresse.", + "ORG_ZSTACK_SNMP_10002": "SNMP-Agent-Konfiguration konnte nicht aktualisiert werden. Bitte stellen Sie sicher, dass zuerst ein SNMP-Agent erstellt wird.", + "ORG_ZSTACK_NETWORK_L3_10064": "Gateway des neu hinzugefügten IP-Bereichs %s unterscheidet sich vom vorhandenen Gateway %s", + "ORG_ZSTACK_SNMP_10003": "SNMP-Agent konnte nicht gestartet werden, bitte erstellen Sie zuerst einen SNMP-Agent.", + "ORG_ZSTACK_NETWORK_L3_10063": "Gateway [%s] kann nicht Teil des Bereichs [%s, %s] sein", + "ORG_ZSTACK_SNMP_10004": "SNMP-Agent konnte nicht %s werden, da readCommunity nicht leer sein darf, wenn Version v2c ist", + "ORG_ZSTACK_NETWORK_L3_10062": "Der Endpunkt [%s] liegt nicht innerhalb des Subnetzes %s/%d", + "ORG_ZSTACK_SNMP_10005": "SNMP-Agent konnte nicht %s werden, da userName nicht leer sein darf, wenn Version v3 ist", + "ORG_ZSTACK_NETWORK_L3_10061": "Mehrere CIDR-Blöcke sind im gleichen L3-Netzwerk nicht erlaubt. Ein vorhandener IP-Bereich [uuid:%s, CIDR:%s] existiert bereits; daher ist der neue CIDR-Block [%s] ungültig.", + "ORG_ZSTACK_SNMP_10006": "SNMP-Agent konnte nicht %s werden, Authentifizierungsalgorithmus darf nicht null sein, wenn kein Passwort angegeben ist", + "ORG_ZSTACK_NETWORK_L3_10060": "Überlappung mit IP-Bereich [uuid:%s, start_ip:%s, end_ip: %s]", + "ORG_ZSTACK_SNMP_10007": "SNMP-Agent konnte nicht %s werden aufgrund eines leeren Authentifizierungspassworts.", + "ORG_ZSTACK_SNMP_10008": "SNMP-Agent kann nicht %s werden, da die Datenverschlüsselungskonfiguration erfordert, dass die Benutzerverifizierung zuerst aktiviert wird.", + "ORG_ZSTACK_XINFINI_10019": "Details zu Knoten %s können nicht abgerufen werden, überprüfen Sie die IP-Adresse und Rollenkonfiguration", + "ORG_ZSTACK_XINFINI_10018": "Kein virtueller Maschinenknoten gefunden", + "ORG_ZSTACK_XINFINI_10017": "Keine verbundene virtuelle Maschineninstanz gefunden. Stellen Sie sicher, dass ein Knoten ordnungsgemäß verbunden ist, und versuchen Sie es erneut.", + "ORG_ZSTACK_XINFINI_10016": "Nicht unterstütztes Protokoll[%s] für aktive Verbindung", + "ORG_ZSTACK_XINFINI_10015": "Abrufen von Volume-Informationen von [%s] nicht unterstützt", + "ORG_ZSTACK_XINFINI_10014": "Nicht unterstütztes Speicherprotokoll[%s]", + "ORG_ZSTACK_XINFINI_10013": "Nicht unterstütztes Protokoll[%s] für Deaktivierung", + "ORG_ZSTACK_XINFINI_10012": "Volume-Details [%s] können nicht abgerufen werden, möglicherweise aufgrund von Löschung", + "ORG_ZSTACK_XINFINI_10010": "Leere Konfiguration, Xinfini-Instanz kann nicht erkannt werden", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10021": "Erforderliche IP %s wurde einer anderen Instanz zugewiesen", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10022": "Erforderliche IP %s liegt außerhalb des DHCP-Bereichs %s ~ %s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10020": "IP-Zuweisung von Baremetal2-Bereitstellungsnetzwerk[uuid:%s] fehlgeschlagen", + "ORG_ZSTACK_XINFINI_10009": "Löschen des iSCSI-Clients fehlgeschlagen %s", + "ORG_ZSTACK_XINFINI_10008": "Löschen der Volume-Client-Gruppen-Zuordnung fehlgeschlagen %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10002": "Es gibt BM-Instanzen, die IP-Adressen verwenden, die von L2[uuid:%s] zugewiesen wurden.", + "ORG_ZSTACK_XINFINI_10007": "Löschen des Volume-Snapshots fehlgeschlagen %s", + "ORG_ZSTACK_XINFINI_10006": "Snapshot [id:%s, name:%s] hat %d geklonte Volumes, Volumenamen: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10004": "Es gibt BM-Instanzen, die IP-Adressen verwenden, die von IP-Bereich [uuid:%s] zugewiesen wurden.", + "ORG_ZSTACK_XINFINI_10005": "Löschen des Volumes fehlgeschlagen wegen %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10003": "Es gibt BM-Instanzen, die IP-Adressen verwenden, die von L3-Netzwerk [UUID:%s] zugewiesen wurden.", + "ORG_ZSTACK_XINFINI_10004": "Löschen von bdev fehlgeschlagen %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10006": "Remote-Stromversorgung des Baremetal-Servers[uuid:%s] kann nicht %s werden", + "ORG_ZSTACK_XINFINI_10003": "BDC mit IP %s nicht in der Cloud-Umgebung gefunden.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10005": "Zuweisung des Baremetal-PXE-Servers fehlgeschlagen, stellen Sie sicher, dass ein PXE-Server mit ausreichender verfügbarer Kapazität mit dem Cluster[uuid:%s] verbunden ist", + "ORG_ZSTACK_XINFINI_10002": "Xinfini-Anfrage fehlgeschlagen, Nachricht: %s.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10008": "Baremetal-Gehäuse [uuid:%s] existiert nicht", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10009": "Baremetal2-Bereitstellungsnetzwerk mit UUID: %s ist bereits mit Cluster mit UUID: %s verbunden", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10007": "Remote-Abschalten des Baremetal-Gehäuses[uuid:%s] fehlgeschlagen", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10008": "Hot-Unplug des verwalteten Geräts von der laufenden virtuellen Maschine fehlgeschlagen, Grund:%s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10010": "Das Baremetal2-Bereitstellungsnetzwerk [uuid:%s] kann nicht an den Cluster [uuid:%s] angehängt werden, da bereits ein Netzwerk konfiguriert ist", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10011": "Das BareMetal2-Bereitstellungsnetzwerk kann nicht an den Cluster angehängt werden, da sie sich nicht in derselben Verfügbarkeitszone befinden", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10007": "vm[uuid:%s] kann auf einem Host mit mdev-Gerät [uuid:%s] nicht gestartet werden", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10004": "Fehler beim dynamischen Anhängen des mdev-Geräts an die laufende VM, weil:%s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10002": "Das mdev-Gerät mit UUID:%s kann nicht an die VM mit UUID:%s angehängt werden aufgrund eines falschen Status", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10003": "Das mdev-Gerät [%s] ist in der virtualisierten Umgebung nicht verfügbar", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10000": "Der Host [%s] konnte nicht in den Wartungsmodus wechseln, da die VM [%s] MDEV-Geräte angehängt hat und nicht automatisch migriert werden kann", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10018": "Fehler beim Aktualisieren des bereitgestellten Netzwerks [uuid:%s] im Gateway [uuid:%s]: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10009": "Das Baremetal-Chassis [UUID:%s] ist nicht aktiviert oder verfügbar. Bitte wählen Sie ein anderes aus.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10001": "Das PCI-Gerät [uuid:%s] ist als mdev bekannt, aber seine Spezifikation kann nicht gefunden werden, daher wird der Prozess abgebrochen.", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10016": "Nicht alle Baremetal2-Bereitstellungsnetzwerke existieren in %s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10014": "Das Baremetal2-Bereitstellungsnetzwerk [uuid:%s] kann nicht getrennt werden, wenn aktive Instanzen davon abhängen", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10015": "networkUuids ist eine leere Liste", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10012": "Das BareMetal2-Bereitstellungsnetzwerk kann nicht an den Cluster angehängt werden, da jedes Gateway, das an Cluster mit demselben Bereitstellungsnetzwerk angehängt ist, verifiziert werden muss. Bitte stellen Sie sicher, dass alle relevanten Gateway konsistent sind, bevor Sie fortfahren.", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10013": "Das bereitgestellte Netzwerk sollte nicht denselben Schnittstellennamen haben wie L2-Netzwerke, die bereits an den Cluster angehängt sind", + "ORG_ZSTACK_NETWORK_L3_10006": "Der IP-Bereich konnte nicht reserviert werden, da kein IPv4-Subnetz verfügbar ist.", + "ORG_ZSTACK_NETWORK_L3_10005": "Der IP-Bereich konnte nicht reserviert werden, da die End-IP [%s] kleiner ist als die Start-IP [%s]", + "ORG_ZSTACK_NETWORK_L3_10004": "Der IP-Bereich konnte nicht reserviert werden, da die End-IP [%s] keine gültige IPv6-Adresse ist", + "ORG_ZSTACK_NETWORK_L3_10003": "Der IP-Bereich konnte nicht reserviert werden, da die End-IP [%s] keine gültige IPv4-Adresse ist", + "ORG_ZSTACK_NETWORK_L3_10002": "Der IP-Bereich konnte nicht reserviert werden, da die Start-IP-Adresse [%s] ungültig ist", + "ORG_ZSTACK_NETWORK_L3_10000": "Die IP-Adresse konnte nicht gelöscht werden, da sie von der VM-Netzwerkschnittstelle [UUID:%s] verwendet wird", + "ORG_ZSTACK_NETWORK_L3_10009": "Der IP-Bereich konnte nicht reserviert werden, da kein IPv6-Subnetz verfügbar ist. Bitte überprüfen Sie Ihre Netzwerkkonfiguration oder versuchen Sie stattdessen, ein IPv4-Subnetz zu reservieren.", + "ORG_ZSTACK_KVM_10001": "Fehler beim Laden der Host-Informationen aus der Datei wegen\\n%s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10019": "Das mdev-Gerät mit UUID: %s ist nicht an die VM mit UUID: %s angehängt", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10017": "Die VM [UUID:%s], die ein SE-MDEV-Gerät enthält, kann keine weiteren SE-MDEV [%s] anhängen", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10018": "Die IOMMU des Hosts [uuid:%s], der das PCI-Gerät [uuid:%s] verwaltet, ist nicht als [%s] oder [%s] konfiguriert.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10015": "vm[uuid:%s] hat mdev-Geräte angehängt, die sich auf einem anderen Host befinden als das mdev-Gerät [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10014": "vm[uuid:%s] hat PCI-Geräte angehängt, die sich auf einem anderen Host befinden als das mdev-Gerät [uuid:%s].", + "ORG_ZSTACK_NETWORK_L3_10010": "Der IP-Bereich konnte nicht reserviert werden, da die reservierte IP nicht innerhalb des angegebenen IP-Bereichs [%s] liegt", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10011": "Der Status eines mdev-Geräts, das derzeit an eine virtuelle Maschine angehängt ist, kann nicht geändert werden. Bitte trennen Sie das Gerät, bevor Sie Änderungen vornehmen.", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10007": "BareMetal2-Bereitstellungsnetzwerk [uuid:%s] kann nicht gelöscht werden, wenn Instanzen davon abhängig sind", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10012": "mdev-Gerät [uuid:%s] kann nicht an VM angehängt werden, stellen Sie sicher, dass es aktiviert und nicht angehängt ist", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10008": "BareMetal2-Bereitstellungsnetzwerk kann nicht an einen Nicht-BareMetal2-Cluster angehängt werden", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10005": "baremetal2 Bereitstellungsnetzwerk DHCP-Bereich Netzmaske %s ist ungültig", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10006": "baremetal2 Bereitstellungsnetzwerk Start-IP %s und End-IP %s gehören nicht zur gleichen Subnetzmaske", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10003": "BareMetal2-Bereitstellungsnetzwerk [uuid:%s] DHCP-Konfiguration kann nicht aktualisiert werden, wenn Instanzen davon abhängig sind", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10002": "Ein baremetal2 Bereitstellungsnetzwerk mit DHCP-Schnittstelle %s existiert bereits mit folgender Konfiguration: Start-IP %s, End-IP %s, Netzmaske %s und Gateway %s.", + "ORG_ZSTACK_NETWORK_L3_10018": "Kein IP-Bereich für Layer 3[%s] angegeben", + "ORG_ZSTACK_NETWORK_L3_10015": "Sie müssen sowohl das System als auch die Kategorie in Ihrer Cloud-Konfiguration aktualisieren.", + "ORG_ZSTACK_XINFINI_10027": "Die Funktion zum Aufheben des NVMeOF-Exports wird derzeit nicht unterstützt.", + "ORG_ZSTACK_NETWORK_L3_10014": "Der letzte Standard-IP-Bereich kann nicht gelöscht werden, da noch ein Adresspool vorhanden ist.", + "ORG_ZSTACK_XINFINI_10026": "Kein aktives Gateway für Client[%s] entdeckt", + "ORG_ZSTACK_NETWORK_L3_10013": "MTU konnte nicht gesetzt werden, da L2-Netzwerk[uuid:%s] von L3-Netzwerk [uuid:%s] einen MTU-Wert hat, der das Limit des Novlan-Netzwerks überschreitet", + "ORG_ZSTACK_XINFINI_10025": "NVMe over Fabrics (OF) Export wird derzeit nicht unterstützt.", + "ORG_ZSTACK_XINFINI_10024": "xinfini unterstützt nur das Einstellen der gesamten QoS-Stufen", + "ORG_ZSTACK_NETWORK_L3_10011": "IP-Bereich konnte nicht reserviert werden, da der neue Bereich mit einem vorhandenen Bereich [%s:%s] überlappt", + "ORG_ZSTACK_XINFINI_10023": "Kein verfügbarer Pool mit ausreichend Platz[%d] und gesundem Status", + "ORG_ZSTACK_XINFINI_10021": "Pool-Details[id:%d, name:%s] für virtuelle Maschine konnten nicht abgerufen werden", + "ORG_ZSTACK_XINFINI_10020": "Kein Compute-Ressourcenpool gefunden. Bitte stellen Sie sicher, dass ein Pool erstellt wurde und verfügbar ist.", + "ORG_ZSTACK_KVM_10010": "Der Host [UUID: %s] enthält keine CPU-Modell-Details. Bitte verbinden Sie den Host erneut, um dies zu beheben.", + "ORG_ZSTACK_KVM_10011": "Der Grund für das Erzwingen eines Laufs muss angegeben werden.", + "ORG_ZSTACK_NETWORK_L3_10019": "IP[%s] liegt nicht im CIDR-Bereich des IP-Pools[uuid:%s, cidr:%s], der dem L3-Netzwerk[%s] zugeordnet ist", + "ORG_ZSTACK_KVM_10012": "Host[uuid:%s] wurde beendet", + "ORG_ZSTACK_KVM_10002": "Das Betriebssystem [OS] des Hosts [hostname:%s, IP:%s] ist ungültig", + "ORG_ZSTACK_KVM_10003": "Cluster[uuid:%s] hat bereits einen Host mit OS-Version [%s], aber der neu hinzugefügte Host [name:%s ip:%s] hat eine andere OS-Version [%s].", + "ORG_ZSTACK_KVM_10004": "VM[uuid:%s] stürzt wegen Kernel-Fehler ab", + "ORG_ZSTACK_KVM_10005": "Host[uuid: %s] Speicher-ECC-Fehler ausgelöst, Details: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10029": "Angegebene verwaltete Geräte befinden sich nicht auf demselben Host: verwaltetes Gerät[uuid: %s] auf Host[uuid: %s], während verwaltetes Gerät[uuid: %s] auf Host[uuid: %s]", + "ORG_ZSTACK_KVM_10006": "Es gibt noch Hosts, die nicht die gleiche CPU-Architektur haben, Details: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10026": "mdev-Gerät kann nicht gelöscht werden, wenn es an eine virtuelle Maschineninstanz angehängt ist. Bitte hängen Sie das Gerät vor dem Löschen ab.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10027": "VM[UUID:%s] konnte nicht gestartet werden, da nicht alle MDEV-Spezifikationen[UUIDs:%s] vorhanden sind", + "ORG_ZSTACK_KVM_10008": "Die PCI-Bridge-ID muss größer als 0 und kleiner als 32 sein", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10024": "Ein verwaltetes Gerät kann nicht an eine VM-Instanz angehängt werden, die sich nicht im gestoppten Zustand befindet", + "ORG_ZSTACK_KVM_10009": "Aktueller VM-Status[%s], zum Ändern von virtioSCSI muss die VM im Status[%s] sein", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10025": "Ungültiger mdev-Gerätetyp [%s], nur virtuelle Geräte sind zulässig", + "ORG_ZSTACK_NETWORK_L3_10021": "Ungültige Cloud-Instance-ID[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10022": "Cluster-UUIDs, Host-UUID oder VM-UUID können nicht gleichzeitig gesetzt werden.%s", + "ORG_ZSTACK_NETWORK_L3_10020": "IP[%s] liegt innerhalb des IP-Bereichs[uuid:%s, startIp:%s, endIp:%s], der dem L3-Netzwerk[%s] zugeordnet ist, dies ist nicht zulässig", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10023": "Cluster existieren nicht oder sind deaktiviert. Bitte stellen Sie sicher, dass die Cluster ordnungsgemäß erstellt und aktiviert wurden.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10020": "Der Host mit UUID [%s], der das mdev-Gerät mit UUID [%s] enthält, stimmt weder mit [%s] noch mit [%s] überein", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10021": "Das mdev-Gerät kann nicht von der VM-Instanz getrennt werden, wenn sie sich nicht im gestoppten Zustand befindet. Stellen Sie sicher, dass die VM-Instanz gestoppt ist, bevor Sie das mdev-Gerät trennen.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10053": "Es ist kein Virtual Private Cloud (VPC) auf dem SDN-Controller konfiguriert [IP:%s].", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10054": "Der System-Tag für VPC-ID ist obligatorisch. Bitte geben Sie einen gültigen Wert an.", + "ORG_ZSTACK_MACVLAN_10002": "Überprüfung der VLAN-Schnittstelle[%s] für L2VLAN-Netzwerk[uuid:%s, name:%s] auf KVM-Host[uuid:%s] fehlgeschlagen, %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10051": "Es ist kein Switch auf dem SDN-Controller konfiguriert [ip:%s]", + "ORG_ZSTACK_MACVLAN_10005": "Netzwerkdienst konnte nicht an L3-Netzwerk[uuid:%s] angehängt werden, da L2-Netzwerk[uuid:%s, vSwitchType:%s] keine L3-Netzwerkdienste für öffentliche Basis-L3-Netzwerke unterstützt", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10052": "Es ist kein SDN-Switch an den Controller angeschlossen.%s", + "ORG_ZSTACK_MACVLAN_10004": "Nur %s unterstützen MACVLAN-Netzwerkmodus", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10057": "Abrufen des logischen Switches für Layer-2-Netzwerk %s fehlgeschlagen", + "ORG_ZSTACK_MACVLAN_10007": "Netzwerkdienst konnte nicht an L3-Netzwerk mit UUID: %s angehängt werden, da L2-Netzwerk mit UUID: %s nur vRouter als Netzwerkanbieter für private Basis-L3-Netzwerke unterstützt.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10058": "Abrufen des logischen Switches für Layer-2-Netzwerk mit Ergebnis fehlgeschlagen: %s", + "ORG_ZSTACK_MACVLAN_10006": "Netzwerkdienst konnte nicht an L3-Netzwerk mit UUID: %s angehängt werden, da L2-Netzwerk mit UUID: %s nur vRouter als Netzwerkanbieter für VPC-L3-Netzwerke unterstützt und vSwitchType: %s nicht unterstützt.", + "ORG_ZSTACK_MACVLAN_10009": "KVM-Hosts unterstützen nur L2-Netzwerke mit vSwitchType OVS. Stellen Sie sicher, dass Ihr Host vom Typ KVM ist und vSwitchType als OVS konfiguriert ist.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10056": "Physische Switch-Port-Informationen können nicht abgerufen werden wegen: %s", + "ORG_ZSTACK_MACVLAN_10008": "Netzwerkdienst konnte nicht an L3-Netzwerk[uuid:%s] angehängt werden, da L2-Netzwerk[uuid:%s, vSwitch Type:%s] nur Load Balancer für private Basis-L3-Netzwerke unterstützt", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10075": "Das Root-Volume wurde gelöscht und kann derzeit nicht neu installiert werden. Bitte kontaktieren Sie den Support für Unterstützung.", + "ORG_ZSTACK_STORAGE_CEPH_10023": "Das Problem könnte auf eine falsche Access-Key-ID oder Secret-Access-Key oder SSH-Portnummer oder eine instabile Netzwerkverbindung in Ihrer Cloud-Umgebung zurückzuführen sein. Bitte überprüfen Sie diese Einstellungen.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10050": "Es ist kein Mandant auf SDN-Controller vorhanden [IP:%s]", + "ORG_ZSTACK_STORAGE_CEPH_10020": "poolName kann null sein, darf aber keine leere Zeichenkette sein", + "ORG_ZSTACK_KVM_10022": "SSH-Verbindung zu Host[%s] Benutzername[%s] auf Port[%s] fehlgeschlagen wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10073": "Es kann kein leeres Volume [uuid:%s, name:%s] auf dem KVM-Host [uuid:%s] erstellt werden", + "ORG_ZSTACK_STORAGE_CEPH_10021": "poolName muss angegeben werden, wenn importImages aktiviert ist", + "ORG_ZSTACK_KVM_10023": "Host [%s] wurde aus unbekannten Gründen nicht innerhalb von %d Sekunden eingeschaltet. Bitte überprüfen Sie den Host-Status über den BMC [%s].", + "ORG_ZSTACK_STORAGE_BACKUP_10092": "Die Wiederherstellungssicherheitsüberprüfung ist fehlgeschlagen:\\n%s", + "ORG_ZSTACK_KVM_10014": "Host %s wird nicht vom aktuellen Managementknoten verwaltet", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10000": "executeSlbGroupConfigTask unbekannter Aufgabenname: %s", + "ORG_ZSTACK_MEVOCO_10049": "Konfigurationsinformationen für Knoten A können nicht gefunden werden", + "ORG_ZSTACK_STORAGE_BACKUP_10091": "Backup-Speicher [UUID:%s] ist nicht aktiviert oder konfiguriert", + "ORG_ZSTACK_KVM_10015": "Host %s ist nicht verbunden, Neustart des KVM-Agenten wird übersprungen", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10039": "Das Root-Volume [uuid:%s] kann nicht migriert werden, da verwaltete Geräte angeschlossen sind", + "ORG_ZSTACK_MEVOCO_10048": "Lokale Konfiguration und Cloud-Konfiguration können nicht gleichzeitig festgelegt werden. Bitte geben Sie eine einzelne Bereitstellungsumgebung an.", + "ORG_ZSTACK_STORAGE_BACKUP_10090": "Datenbank-Backup [uuid:%s] existiert noch nicht", + "ORG_ZSTACK_KVM_10016": "Laufende Aufgabe auf Host %s vorhanden", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10081": "Flag-Datei [%s] kann auf dem Compute-Node [%s] nicht gefunden werden, weil: %s", + "ORG_ZSTACK_MEVOCO_10047": "Unerwartete Host-Management-IP-Adressen: [%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10037": "VM [UUID:%s] kann nicht migriert werden, da ein mdev-Gerät angeschlossen ist", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10035": "mdev-Gerät [uuid:%s] kann nicht gefunden werden, es wurde möglicherweise gelöscht oder freigegeben", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10036": "mdev-Gerät mit UUID: %s existiert nicht oder ist für VM mit UUID: %s deaktiviert", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10034": "Es konnten nicht genügend mdev-Geräte der Spezifikation [uuid:%s] auf dem Ziel-Host [uuid:%s] für die virtuelle Maschine [uuid:%s] gefunden werden", + "ORG_ZSTACK_MEVOCO_10041": "Ungültiger Wert [%s], ZStack unterstützt diesen Host-Zuweisungstyp nicht", + "ORG_ZSTACK_STORAGE_BACKUP_10099": "Datenbank-Backup [uuid:%s] ist nicht aktiviert und bereit", + "ORG_ZSTACK_STORAGE_CDP_10120": "Verbundener Backup-Speicher [uuid: %s] kann nicht gefunden werden", + "ORG_ZSTACK_STORAGE_BACKUP_10098": "Volume [uuid:%s] wurde gelöscht und Zustandsänderungen sind nicht zulässig", + "ORG_ZSTACK_MEVOCO_10040": "Ungültiger Wert [%s], es handelt sich nicht um eine gültige Gleitkommazahl", + "ORG_ZSTACK_STORAGE_CDP_10121": "Der Vorgang bezieht sich auf das Volume [UUID: %s], das eine Ketten-Snapshot erstellen wird. Daher können Sie diesen Vorgang nicht durchführen, wenn eine Continuous Data Protection (CDP)-Aufgabe auf der virtuellen Maschine ausgeführt wird.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10032": "Kandidaten-Hosts für den Start der VM [uuid:%s] konnten nicht bestimmt werden, %s", + "ORG_ZSTACK_STORAGE_BACKUP_10097": "Kein verfügbarer Object-Storage-Bucket für Backup gefunden, dieser Job wird übersprungen.%s", + "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10001": "Das Entfernen eines System-Themas aus einem System-Alarm ist nicht zulässig. Bitte geben Sie gültige Themen- und Alarm-UUIDs an.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10005": "Öffentliche Netzwerkschnittstelle der SLB-Instanz kann nicht gefunden werden", + "ORG_ZSTACK_MEVOCO_10046": "obj ist keine Instanz von NicQos! Bitte stellen Sie sicher, dass der Objekttyp dem erwarteten Typ entspricht.", + "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10000": "Alarm[uuid:%s] ist ein systemgenerierter Alert, der nicht gelöscht werden kann", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10004": "SLB-Instanz[uuid:%s] Konfigurationsaufgabe Version:%d ist %d-mal fehlgeschlagen", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10003": "Es kann keine verfügbare SLB-Instanz in Gruppe[uuid:%s] gefunden werden", + "ORG_ZSTACK_STORAGE_BACKUP_10094": "Datenbank-Backup-Version[%s] stimmt nicht mit der aktuellen Version[%s] überein", + "ORG_ZSTACK_MACVLAN_10000": "Bridge für l2VlanNetwork[uuid:%s, name:%s] auf KVM-Host[uuid:%s] konnte nicht realisiert werden, %s", + "ORG_ZSTACK_MEVOCO_10043": "%s-Wert ist[%s], was mit %s-Wert [%s] konfliziert", + "ORG_ZSTACK_STORAGE_BACKUP_10093": "Fehler beim Zuweisen eines freien Ports für das Abhören. Bitte stellen Sie sicher, dass die erforderlichen Ports nicht von anderen Anwendungen verwendet werden. Wenn das Problem weiterhin besteht, überprüfen Sie Ihre Netzwerkkontaktierung oder wenden Sie sich an den Support für weitere Unterstützung.", + "ORG_ZSTACK_MEVOCO_10060": "Adresse für Knoten A festlegen fehlgeschlagen", + "ORG_ZSTACK_KVM_10030": "Host-Kapazitätsprüfung fehlgeschlagen, wegen:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10082": "Flag-Datei [%s] kann auf Instanz [%s] nicht erstellt werden, wegen: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10060": "Logischer Switch konnte nicht abgerufen werden: uuid: %s", + "ORG_ZSTACK_KVM_10032": "Der verfügbare Arbeitsspeicher des Hosts [UUID: %s] [%s MB] ist niedriger als der reservierte Arbeitsspeicher [%s MB]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10083": "Es gibt keine LocalStorage primäre Speicherung (state=%s, status=%s) auf dem Cluster (%s). Wenn der Cluster mehrere primäre Speicher mountet, verwendet das System standardmäßig den lokalen primären Speicher. Bitte überprüfen Sie den State und Status des primären Speichers und stellen Sie sicher, dass er an den Cluster angehängt wurde.", + "ORG_ZSTACK_KVM_10033": "Colo-Herzschlag für VM[uuid:%s] auf KVM-Host [uuid:%s, ip:%s] kann nicht registriert werden, wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10084": "Der Typ des ausgewählten primären Speichers [uuid:%s] ist kein lokaler Speicher. Bitte überprüfen Sie, ob die Ressource auf anderen verfügbaren Speichern erstellt werden kann, wenn der Cluster lokalen primären Speicher angehängt hat.", + "ORG_ZSTACK_KVM_10034": "Colo-Synchronisations-VM [uuid:%s] kann auf KVM-Host [uuid:%s, ip:%s] nicht gestartet werden, wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10085": "Der Cluster mountet mehrere primäre Speicher [Lokaler Speicher (%s), andere nicht-LocalStorage primäre Speicher], daher ist die Spezifikation von primaryStorageUuidForDataVolume nicht erlaubt %s.", + "ORG_ZSTACK_KVM_10024": "Host[%s] wurde aus unbekanntem Grund nicht innerhalb von %d Sekunden heruntergefahren. Bitte überprüfen Sie den Host-Status über den BMC[%s].", + "ORG_ZSTACK_MEVOCO_10059": "Diese Instanz ist nicht mit Knoten A verknüpft", + "ORG_ZSTACK_MEVOCO_10058": "Es existiert ein Knoten im Werksmodus; Details von ARPing: %s", + "ORG_ZSTACK_MEVOCO_10053": "Curl Bootstrap-Agent beendet, Rückgabecode: %s, stdout: %s, stderr: %s", + "ORG_ZSTACK_MEVOCO_10052": "Bootstrap-Job %s Ergebnis kann nach 900 Sekunden nicht abgerufen werden", + "ORG_ZSTACK_MEVOCO_10050": "Adressinformationen von Knoten A können nicht aus Bootstrap-Agent abgerufen werden", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10040": "VM[UUID:%s] kann nicht migriert werden, da MDEV-Geräte angehängt sind", + "ORG_ZSTACK_MEVOCO_10057": "Knoten A Update Werksmodus fehlgeschlagen, Details: %s", + "ORG_ZSTACK_MEVOCO_10056": "Alle Management-Knoten Update auf Werksmodus fehlgeschlagen, Details: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10013": "MAC-Adresse %s ist ungültig. Sie sollte als 6c:b3:11:1b:0b:1e formatiert sein", + "ORG_ZSTACK_HA_10014": "FT kann nicht auf VM [uuid:%s] gesetzt werden, da USB-Geräte via Passthrough angehängt sind", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10012": "Baremetal PXE-Server [UUID:%s] ist weder aktiviert noch verbunden, bitte überprüfen Sie seinen Status.", + "ORG_ZSTACK_HA_10015": "FT kann nicht auf virtueller Maschine [uuid:%s] gesetzt werden, da ein MDEV-Gerät angehängt ist", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10015": "Doppelte Bond-UUID für virtuelle Maschine %s erkannt. Bitte stellen Sie sicher, dass die UUIDs für Bonding-Konfigurationen eindeutig sind.", + "ORG_ZSTACK_HA_10016": "Der Verwaltungsknoten kann den Host nicht finden. Bitte stellen Sie sicher, dass der Host ordnungsgemäß registriert und in der Cloud-Umgebung erreichbar ist.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10014": "Baremetal-Chassis [UUID: %s] hat keine Netzwerkschnittstelle mit MAC-Adresse %s", + "ORG_ZSTACK_HA_10017": "Der Wert [%s] liegt außerhalb des gültigen Bereichs [0, 1].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10057": "Host[UUID: %s] des lokalen Primärspeichers[UUID: %s] hat nicht genügend Kapazität[aktuell: %s Bytes, benötigt: %s]", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10017": "Doppelte L3-Netzwerk-UUID erkannt", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10058": "Es kann kein Host mit Ressource[UUID:%s] gefunden werden", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10016": "Baremetal-Netzwerk-Bonding wird nicht unterstützt", + "ORG_ZSTACK_HA_10011": "FT kann für VM[UUID:%s] nicht gesetzt werden, da sie sich nicht im gestoppten Zustand befindet", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10059": "Ressource[UUID:%s] kann nur auf Host[UUID:%s] betrieben werden, aber der Host wurde beendet", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10019": "Das ausgewählte Layer-3-Netzwerk kann dem Chassis [UUID:%s] nicht zugewiesen werden.", + "ORG_ZSTACK_HA_10012": "FT kann für VM[UUID:%s] nicht gesetzt werden, da ein oder mehrere Datenträger noch angeschlossen sind", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10018": "Das angegebene Layer-3-Netzwerk existiert nicht. Bitte überprüfen Sie den Netzwerknamen und versuchen Sie es erneut.", + "ORG_ZSTACK_HA_10013": "FT kann für VM[UUID:%s] nicht gesetzt werden, da ein PCI-Gerät angeschlossen ist", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10053": "Um einen Datenträger auf dem lokalen Primärspeicher bereitzustellen, müssen Sie den Host, auf dem der Datenträger erstellt wird, mit dem System-Tag [%s] angeben.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10054": "Der Host [UUID:%s] ist nicht mit dem lokalen Primärspeicher [UUID:%s] verknüpft.", + "ORG_ZSTACK_KVM_10040": "Fehler beim Erhöhen der VM-CPU-Anzahl, Fehlerdetails: %s", + "ORG_ZSTACK_HA_10018": "Der VM[UUID:%s]-Datenträger-Speicherort Primärspeicher befindet sich in Wartung", + "ORG_ZSTACK_KVM_10043": "Verbindung zu KVM[IP:%s, Benutzername:%s, SSH-Port:%d] für DNS-Validierung nicht möglich; bitte überprüfen Sie die Zugangsdaten.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10050": "Live-Migration von VM [UUID:%s] mit Datenträgern auf lokalem Speicher nicht möglich. Datenträger müssen zuerst getrennt werden.", + "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10001": "Das Abfrageobjekt ist null. Bitte stellen Sie sicher, dass Ihre Abfrageparameter ordnungsgemäß initialisiert sind, bevor Sie die Cloud-Computing-Aufgabe ausführen.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10051": "Live-Migration von VM[UUID:%s] mit lokalem Speicher nicht möglich. Nur Linux-Gäste werden unterstützt. Aktuelle Plattform ist [%s].", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10011": "Keine Hardwareinformationen für Baremetal-Chassis[UUID:%s] gefunden, bitte wählen Sie ein anderes aus.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10052": "Live-Migration von VM[UUID:%s] mit angehängtem ISO auf lokalem Speicher nicht möglich. Bitte trennen Sie zuerst alle ISOs.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10010": "Kein entsprechender PXE-Server erkannt, bitte überprüfen Sie die Baremetal-Chassis[UUID:%s]-Konfiguration erneut", + "ORG_ZSTACK_KVM_10035": "Sekundäre VM[UUID:%s] auf KVM-Host [UUID:%s, IP:%s] kann nicht konfiguriert werden, weil %s", + "ORG_ZSTACK_MEVOCO_10028": "L3-Netzwerk mit UUID [%s] nicht gefunden. Bitte überprüfen und korrigieren Sie Ihr System-Tag [%s], das der statischen IP zugeordnet ist.", + "ORG_ZSTACK_STORAGE_BACKUP_10070": "Datenträger-Backup mit UUID: %s kann nicht gefunden werden", + "ORG_ZSTACK_KVM_10036": "Primäre VM[UUID:%s] auf KVM-Host[UUID:%s, IP:%s] kann nicht konfiguriert werden, weil %s", + "ORG_ZSTACK_MEVOCO_10027": "Ungültiger IOPS-Wert für Datenträger [%s] überschreitet das maximale Limit von %d", + "ORG_ZSTACK_KVM_10037": "kann das anfängliche Startgerät der VM [UUID:%s] auf dem KVM-Host [UUID:%s, IP:%s] nicht abrufen, wegen %s", + "ORG_ZSTACK_MEVOCO_10026": "ungültige Volume-IOPS[%s] ist keine gültige Zahl", + "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10000": "Mindestens eine Host-UUID ist erforderlich bei der Abfrage eines Third-Party Prometheus-Namensbereichs. Bitte stellen Sie sicher, dass die Host-UUID in den Labels der Abfrageaufrufparameter enthalten ist.", + "ORG_ZSTACK_KVM_10038": "konnte Geräteadresse von vm[uuid:%s] nicht abrufen, wegen:%s", + "ORG_ZSTACK_MEVOCO_10025": "ungültiger IOPS-Wert[%s], er muss größer oder gleich 1 sein", + "ORG_ZSTACK_KVM_10039": "konnte Virtualisierungsinformationen des Hosts[uuid:%s] nicht abrufen, wegen:%s", + "ORG_ZSTACK_MEVOCO_10029": "USB-Gerätezugriff ist nur für administrative Konten zulässig. Bitte stellen Sie sicher, dass Sie mit einem Konto angemeldet sind, das über administrative Berechtigungen verfügt.", + "ORG_ZSTACK_STORAGE_BACKUP_10078": "Backup-Speicher kann aufgrund seines Status %s nicht fortfahren", + "ORG_ZSTACK_MEVOCO_10020": "ungültige Volume-Bandbreite[%s] muss ein numerischer Wert sein", + "ORG_ZSTACK_STORAGE_BACKUP_10077": "Backup-Speicher kann aufgrund seines Status %s nicht fortfahren", + "ORG_ZSTACK_STORAGE_BACKUP_10076": "Der Backup-Speicher [UUID: %s, Name: %s] hat nicht genügend Kapazität, um das Image [%s] herunterzuladen. Erforderliche Größe: %s, verfügbare Größe: %s.", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10001": "Alle Ceph-MON-Knoten sind im Ceph-Backup-Speicher [uuid:%s] getrennt.", + "ORG_ZSTACK_STORAGE_BACKUP_10075": "Die Image-Größe, die von der URL %s abgerufen wurde, beträgt %d Bytes, was für ein Image zu klein ist. Bitte überprüfen Sie die URL erneut.", + "ORG_ZSTACK_STORAGE_BACKUP_10074": "konnte Header von der Image-URL %s nicht abrufen", + "ORG_ZSTACK_STORAGE_BACKUP_10073": "konnte Header von der Image-URL %s nicht abrufen: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10072": "Bitte beenden Sie zuerst andere Knoten!", + "ORG_ZSTACK_MEVOCO_10021": "ungültige Volume-Bandbreite[%s] überschreitet den maximal zulässigen Wert von %d", + "ORG_ZSTACK_STORAGE_BACKUP_10071": "Der VM-Cluster [%%s] ist nicht am selben Standort wie der primäre Speichercluster [%%s].", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10023": "kann Baremetal-Instanz nicht bereinigen, die sich nicht im Zustand \"Zerstört\" befindet", + "ORG_ZSTACK_HA_10005": "Hosts konnten den Zielhost[uuid:%s, ip:%s] nicht port-scannen", + "ORG_ZSTACK_IDENTITY_LOGIN_10000": "nicht unterstützte Authentifizierungsmethode %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10068": "Der Cluster [UUID=%s] ist mit mehreren primären Speichern verbunden, einschließlich LocalStorage und anderen nicht-LocalStorage-primären Speichern. Sie müssen den primären Speicher angeben, auf dem sich die Datenfestplatte befindet.", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10003": "Fehler beim Migrieren des Images %s vom Backend-Speicher %s zum Backend-Speicher %s. Ursache: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10002": "Gefundene Müll-ID (%s) auf dem Backup-Speicher [%s] für den Migrationsinstallationspfad [%s]. Bitte bereinigen Sie ihn zuerst mit 'APICleanUpTrashOnBackupStorageMsg', wenn Sie darauf bestehen, das Image [%s] zu migrieren.", + "ORG_ZSTACK_HA_10000": "Die virtuelle Maschine wurde wahrscheinlich beendet. Gesundheitsprüfungen werden übersprungen.", + "ORG_ZSTACK_HA_10001": "kann die virtuelle Maschine mit Name:[%s] und UUID:[%s] nicht finden, Host-UUID ist null", + "ORG_ZSTACK_HA_10002": "Keine HAHostChecker-Instanz gefunden, kann keine Hochverfügbarkeitsprüfungen durchführen. Bitte stellen Sie sicher, dass alle erforderlichen Komponenten ordnungsgemäß konfiguriert sind.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10064": "Die physische Kapazitätsauslastung des Hosts [uuid:%s] hat den Schwellenwert [%s] überschritten. Bitte erwägen Sie eine Skalierung oder Optimierung Ihrer Ressourcen.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10067": "Der Cluster[uuid=%s] ist für die Verbindung mit mehreren primären Speicherlösungen konfiguriert, einschließlich LocalStorage und anderen nicht-LocalStorage-primären Speichern. Sie müssen angeben, welcher primäre Speicher die Root-Festplatte enthält.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10060": "KVM-Host [UUID: %s] kann nicht zum lokalen primären Speicher [UUID: %s] hinzugefügt werden, %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10020": "Nur ISO-Images werden für Bare-Metal-Service-Deployments in ZStack unterstützt.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10061": "Leeres Snapshot-Volume kann nicht erstellt werden [Name:%s, Installationspfad: %s] auf KVM-Host [UUID:%s, IP:%s], weil %s", + "ORG_ZSTACK_KVM_10054": "Volume-Snapshot-Merge kann nicht durchgeführt werden, wenn die virtuelle Maschine [UUID:%s] sich im Status %s befindet. Die Operation ist nur erlaubt, wenn sich die virtuelle Maschine im Status \"Running\" oder \"Stopped\" befindet.", + "ORG_ZSTACK_HA_10008": "Ausnahme beim Synchronisieren des Self-Fencer-Status vom Host [UUID: %s], %s", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10000": "Ordner [%s] nicht auf dem Cloud-Management-Server [%s] gefunden", + "ORG_ZSTACK_KVM_10055": "Live-Volume-Snapshot-Merge erfordert eine libvirt-Version größer als %s, aktuelle Version ist %s. Bitte stoppen Sie die VM und wiederholen Sie den Vorgang oder trennen Sie gegebenenfalls das Datenvolumen.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10062": "Fehler beim Übertragen von Daten vom SFTP-Backup-Speicher [Hostname:%s, Pfad: %s] zum lokalen Primary-Storage [UUID:%s, Pfad: %s], %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10022": "Eine Bare-Metal-Instanz kann nur wiederhergestellt werden, wenn sie sich im Zustand \"Destroyed\" befindet. Bitte stellen Sie sicher, dass sich die Instanz im Zustand \"Destroyed\" befindet, bevor Sie die Wiederherstellung versuchen.", + "ORG_ZSTACK_HA_10009": "Der Parameter %s kann nicht auf '%s' gesetzt werden, da das Storage-Netzwerk nicht verfügbar ist und die Hochverfügbarkeit aktiviert bleiben muss.", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10001": "Namespace [%s] fehlt die Metrik [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10063": "Fehler beim Hochladen von Daten vom lokalen Speicher [UUID:%s, Pfad:%s] zum SFTP-Backup-Speicher [Hostname:%s, Remote-Pfad:%s], %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10021": "Nur Image-Store-Backup-Speicher wird im ZStack Bare-Metal-Service unterstützt.", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10002": "Metrik [%s] des Namespace [%s] fehlt ein Label mit dem Namen %s", + "ORG_ZSTACK_MEVOCO_10039": "Ungültiger Wert [%s], es muss eine Dezimalzahl zwischen (0, 1] sein, einschließlich 1", + "ORG_ZSTACK_KVM_10047": "Der Host [UUID: %s, Status: %s] ist nicht verbunden.", + "ORG_ZSTACK_COMPUTE_OVS_10000": "ovs CPU-Pinning-Ressourcenkonfiguration: [%s] Formatfehler.", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10001": "Absichtlich 1: Die Quelldatei wurde nicht gefunden. Bitte stellen Sie sicher, dass alle erforderlichen Dateien korrekt hochgeladen und in Ihrem Projekt-Setup enthalten sind.", + "ORG_ZSTACK_MEVOCO_10037": "Ungültiger Wert [%s], es muss eine positive Gleitkommazahl größer als 0 sein", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10002": "Absichtlich: 2 - Dieser Fehler zeigt an, dass die Operation während der Ausführung absichtlich beendet oder geändert wurde. Bitte überprüfen Sie Ihre Eingabeparameter und stellen Sie sicher, dass sie den Anforderungen der Cloud-Computing-Umgebung entsprechen.", + "ORG_ZSTACK_MEVOCO_10031": "Unbekannter Sicherheitscode [%s] für die Authentifizierung", + "ORG_ZSTACK_STORAGE_BACKUP_10089": "Volume-Backup-Metadatenoperation fehlgeschlagen wegen %s", + "ORG_ZSTACK_STORAGE_BACKUP_10087": "Volume-Backup-Metadatendatei auf Image-Store [UUID:%s] konnte aufgrund eines IO-Fehlers nicht generiert werden: %s", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10000": "Absichtlich: 3 Cloud-Instanzen werden beendet. Bitte bestätigen Sie die Aktion.", + "ORG_ZSTACK_MEVOCO_10034": "Das Betriebssystem %s %s des Hosts [UUID:%s] ist zu veraltet, um QoS für Netzwerk- oder Festplatten-E/A zu unterstützen. Bitte wählen Sie eine andere Instanz ohne QoS-Konfiguration.", + "ORG_ZSTACK_MEVOCO_10033": "%s ist keine gültige CIDR-Notation", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10010": "Huawei iMaster SDN-Controller konnte mit ungültigem VLAN-Bereich [%s, %s] nicht hinzugefügt werden", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10008": "ISO [UUID: %s] ist an VM [UUID: ] angehängt, aber die ISO-Datei befindet sich nicht auf einem Block-Speicher. Sie müssen sie trennen, bevor Sie die VM migrieren.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10009": "Block-SCSI-LUN für Volume konnte nicht gefunden werden: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10035": "Host [UUID:%s] kann nicht auf lokalen Speicher [UUID:%s] zugreifen, möglicherweise aufgrund einer Trennung", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10013": "Huawei iMaster NSE L3-Netzwerk konnte ohne logische Router-UUID nicht erstellt werden", + "ORG_ZSTACK_MEVOCO_10093": "DeleteVolumeQos [%s] aufgrund von Kontenberechtigungen ignoriert.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10036": "Ressource[uuid:%s, Typ: %s] ist auf dem lokalen Primärspeicher[uuid:%s] nicht verfügbar", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10014": "Huawei iMaster L3-Netzwerk mit L2-Netzwerk [uuid:%s] konnte nicht erstellt werden, da es bereits existiert", + "ORG_ZSTACK_MEVOCO_10092": "Ungültiger Volume Quality of Service-Modus: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10037": "Ressource[uuid:%s, Typ: %s] auf dem lokalen Primärspeicher[uuid:%s] wird mehreren Hypervisoren zugeordnet%sWithMultipleHypervisors", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10011": "Huawei iMaster SDN Controller konnte nicht hinzugefügt werden, ohne VLAN-Bereich oder VLAN-ID anzugeben", + "ORG_ZSTACK_MEVOCO_10091": "Keine Volumes an diese Instanz angehängt. Bitte hängen Sie ein Volume an, um fortzufahren.", + "ORG_ZSTACK_STORAGE_BACKUP_10058": "Primärspeicher kann nicht angegeben werden, der an einen anderen Cluster angehängt ist.", + "ORG_ZSTACK_STORAGE_BACKUP_10057": "Mindestens einer der folgenden Parameter muss angegeben werden: L3-Netzwerk-UUIDs, Zone-UUID, Cluster-UUID, Host-UUID.", + "ORG_ZSTACK_MEVOCO_10090": "Snapshot kann für Volumes, die an mehrere VMs angehängt sind, nicht erstellt werden", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10033": "Datentolume[uuid: %s] konnte auf dem lokalen Primärspeicher[uuid:%s] nicht erstellt werden, da die Host-UUID nicht angegeben ist.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10034": "Kein Host-Status aktiviert. Bitte überprüfen Sie die Verfügbarkeit der Host-Ressourcen.", + "ORG_ZSTACK_KVM_10064": "Netzwerkschnittstelle für virtuelle Maschine [vm:%s] auf KVM-Host [uuid:%s, ip:%s] konnte nicht aktualisiert werden, weil %s", + "ORG_ZSTACK_KVM_10065": "Netzwerkschnittstelle mit UUID: %s konnte nicht an VM-UUID: %s auf KVM-Host mit UUID: %s und IP: %s angehängt werden, weil %s. Bitte versuchen Sie es erneut oder löschen Sie das Gerät mit UUID: %s manuell.", + "ORG_ZSTACK_KVM_10066": "Netzwerkschnittstelle mit UUID: %s konnte nicht an VM-UUID: %s auf KVM-Host mit UUID: %s und IP: %s angehängt werden, weil %s", + "ORG_ZSTACK_KVM_10067": "Datentolume[uuid:%s, installPath:%s] konnte nicht von vm[uuid:%s, name:%s] auf KVM-Host[uuid:%s, ip:%s] getrennt werden, aufgrund von %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10005": "Port-Weiterleitungsregel [uuid:%s] wurde gelöscht", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10006": "Port-Weiterleitungsregel [uuid:%s] ist nicht aktiviert, aktueller Status ist %s", + "ORG_ZSTACK_KVM_10059": "vm[uuid:%s] befindet sich nicht im Status \"Wird ausgeführt\" oder \"Angehalten\", aktueller Status[%s]", + "ORG_ZSTACK_TICKET_10000": "Ticket[uuid:%s, name:%s] kann erst aktualisiert werden, nachdem es storniert wurde; aktueller Status ist %s", + "ORG_ZSTACK_TICKET_10001": "Operation verweigert. Die Operation muss von Konto/Virtueller ID[uuid:%s] durchgeführt werden", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10017": "Token vom SDN-Controller [IP:%s] konnte nicht abgerufen werden", + "ORG_ZSTACK_MEVOCO_10086": "VM[uuid:%s] hat den Betrieb eingestellt. Bitte versuchen Sie es später erneut.", + "ORG_ZSTACK_STORAGE_BACKUP_10056": "Aktuelle VM[UUID: %s] des Volumes[UUID: %s] ist nicht mehr die VM[UUID: %s], die für das Backup verwendet wurde", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10003": "LUN-Zu-Host-Vorgang kann nicht ausgeführt werden, da PS-Host-Referenz-Metadaten leer sind. Bitte überprüfen Sie die Host-Konfiguration und stellen Sie sicher, dass die erforderlichen Metadaten gefüllt sind.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10018": "Token von SDN-Controller [ip:%s] konnte nicht abgerufen werden, weil %s", + "ORG_ZSTACK_MEVOCO_10085": "Snapshots für Volume-UUID [uuid: %s] nicht gefunden. Möglicherweise ist keine Snapshot-Kette erforderlich.", + "ORG_ZSTACK_STORAGE_BACKUP_10055": "Root-Volume-Snapshot von Gruppe[uuid:%s] nicht gefunden", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10000": "Logische Einheit kann aufgrund von leerem Backend-Gerät nicht zugeordnet werden.%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10015": "Huawei Logical Router [UUID:%s] konnte nicht gelöscht werden, da es mit L3-Netzwerk [UUID:%s] verknüpft ist", + "ORG_ZSTACK_MEVOCO_10084": "Kann den neuesten Snapshot von Volume [uuid: %s] nicht finden. Möglicherweise existiert keine Snapshot-Kette zur Validierung.", + "ORG_ZSTACK_STORAGE_BACKUP_10054": "Kein Backup-Volume für Gruppen-UUID gefunden: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10016": "Token des SDN-Controllers [IP:%s] konnte nicht abgerufen werden", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10001": "LUN-zu-Host-Zuordnung kann nicht ausgeführt werden, da PS-Host-Referenz null ist. Bitte stellen Sie sicher, dass die Host-Referenz korrekt gesetzt ist.", + "ORG_ZSTACK_MEVOCO_10083": "Der angegebene Snapshot im Snapshot-Baum des Volumes [UUID: %s] wurde nicht gefunden. Möglicherweise existiert keine Snapshot-Kette, die validiert werden muss.", + "ORG_ZSTACK_STORAGE_BACKUP_10053": "Die Ressource [uuid: %s] hat bereits einen CDP-Task gestartet; daher kann gleichzeitig kein Backup-Job erstellt werden.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10006": "KVM-Host [UUID: %s] kann nicht zum Block-Primärspeicher [UUID: %s] hinzugefügt werden, %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10009": "Port-Weiterleitungsregel [uuid:%s] ist nicht aktiviert, aktueller Status ist %s. Eine Regel kann nur angehängt werden, wenn ihr Status aktiviert ist.", + "ORG_ZSTACK_STORAGE_BACKUP_10052": "Backup-Erstellung für VM[uuid:%s] fehlgeschlagen, da sie sich nicht im Status [%s, %s] befindet", + "ORG_ZSTACK_MEVOCO_10089": "Snapshot für Volumes[%s] kann nicht erstellt werden, da Volume[UUID: %s] mehrfach definiert ist", + "ORG_ZSTACK_STORAGE_BACKUP_10051": "Volume[uuid:%s] ist kein Root-Volume", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10019": "Löschen des Tokens des SDN-Controllers [IP:%s] fehlgeschlagen wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10004": "Volume-Zuordnung zum Host kann aufgrund ungültiger Volume-ID nicht ausgeführt werden.%s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10007": "Port-Weiterleitungsregel [uuid:%s] wurde keiner virtuellen Maschinennetzwerkschnittstelle zugeordnet, kann nicht getrennt werden", + "ORG_ZSTACK_MEVOCO_10088": "Snapshot für Volumes[%s] kann nicht erstellt werden, wenn Volume[uuid: %s] nicht angehängt ist", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10005": "LUN-zu-Host-Zuordnung kann aufgrund ungültigen LUN-Typs nicht ausgeführt werden: %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10008": "Port-Weiterleitungsregel [uuid:%s] wurde bereits VM-NIC [uuid:%s] zugeordnet, kann nicht erneut zugewiesen werden", + "ORG_ZSTACK_MEVOCO_10087": "Eine laufende VM[uuid:%s] hat keine zugeordnete Host-UUID.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10020": "Abrufen des Tenants des SDN-Controllers [IP:%s] fehlgeschlagen", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10021": "Abrufen des Tenants des SDN-Controllers [IP:%s] fehlgeschlagen wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10019": "Der Block-Primärspeicher [uuid:%s, name:%s] kann keinen verfügbaren Host in den angehängten Clustern für Volume-Instanziierung finden", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10024": "Abrufen des logischen Switch-Ports vom SDN-Controller [IP:%s] fehlgeschlagen", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10047": "Das Daten-Volume [uuid:%s] kann nicht an die VM [uuid:%s] angehängt werden. Sowohl das Root-Volume der VM als auch das Daten-Volume befinden sich auf lokalem Primärspeicher, jedoch auf verschiedenen Hosts. Das Root-Volume [uuid:%s] wird auf Host [uuid:%s] gehostet, während das Daten-Volume [uuid:%s] auf Host [uuid:%s] gehostet wird.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10025": "Abrufen der Switch-Port-Informationen vom SDN-Controller [ip:%s] fehlgeschlagen wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10048": "Das Daten-Volume [name: %s, UUID: %s] befindet sich auf lokalem Speicher [UUID: %s]; jedoch wurde der Host, auf dem sich das Daten-Volume befindet, gelöscht. Die Wiederherstellung dieses Volumes ist nicht möglich.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10022": "Abrufen des Switch-Geräts des SDN-Controllers [ip:%s] fehlgeschlagen", + "ORG_ZSTACK_STORAGE_BACKUP_10069": "Die VM erstellt derzeit einen Backup-Job und kann nicht gleichzeitig einen CDP-Task aktivieren. Bitte stellen Sie sicher, dass alle Backup-Jobs abgeschlossen sind, bevor CDP aktiviert wird.", + "ORG_ZSTACK_KVM_10070": "Beenden der virtuellen Maschine[uuid:%s name:%s] auf KVM-Host[uuid:%s, ip:%s] fehlgeschlagen wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10049": "Wiederherstellung der VM[uuid:%s, name:%s] nicht möglich. Das Root-Volume der VM befindet sich auf lokalem Speicher[uuid:%s]; jedoch wurde der Host, auf dem sich das Root-Volume befindet, gelöscht.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10023": "Abrufen des Switch-Geräts des SDN-Controllers [IP:%s] fehlgeschlagen wegen %s", + "ORG_ZSTACK_STORAGE_BACKUP_10068": "Der Host-Cluster [uuid: %s] ist nicht mit dem Volume-Cluster [uuid: %s] zusammengelegt. Bitte stellen Sie sicher, dass sich der Primärspeicher im selben Cluster befindet.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10020": "Die VM [Name: %s UUID: %s] hat bereits Port-Weiterleitungsregeln mit anderen VIPs als die [UUID: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10044": "Die Erstellung basiert auf dem Image-Cache [uuid: %s, located host uuids: [%s]], kann nicht woanders erstellt werden.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10045": "Lokaler Speicher unterstützt keine Live-Migration für Hypervisor[%s]", + "ORG_ZSTACK_KVM_10075": "Fehler beim Stoppen der VM[uuid:%s name:%s] auf dem KVM-Host[uuid:%s ip:%s], weil %s", + "ORG_ZSTACK_KVM_10078": "Der Host[uuid:%s] hat nicht genügend Kapazität, um CPU[%s] und Speicher[%s bytes] zuzuweisen.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10017": "VIP-Port-Bereich [vipStartPort:%s, vipEndPort:%s] überschneidet sich mit der Netzwerkregel [uuid:%s, vipStartPort:%s, vipEndPort:%s]", + "ORG_ZSTACK_KVM_10069": "Fehler beim Anhängen des Datenträgers[uuid:%s, installPath:%s] an die VM[uuid:%s, name:%s] auf dem KVM-Host[uuid:%s, ip:%s], weil %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10014": "Ungültige CIDR[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10015": "Ungültige CIDR[%s], nur IPv4-Adressen werden unterstützt", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10012": "Port-Weiterleitungsregel konnte nicht erstellt werden, weil der VIP-Port-Bereich [vipStartPort:%s, vipEndPort:%s] mit dem privaten Port-Bereich [privateStartPort:%s, privateEndPort:%s] inkompatibel ist", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10010": "SCSI LUN für Volumenliste:%s kann nicht gefunden werden", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10013": "Für die bereichsbasierte Port-Weiterleitung müssen die Port-Bereichsgrößen übereinstimmen; VIP-Bereich [%s, %s]'s Größe stimmt nicht mit [%s, %s]'s Größe überein", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10010": "Gast-L3-Netzwerk der VM-NIC und VIP-L3-Netzwerk der Port-Weiterleitungsregel sind dasselbe Netzwerk (uuid: %s, uuid: %s)", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10028": "Abrufen des Fabrics des SDN-Controllers [ip:%s] fehlgeschlagen", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10013": "Der Vorgang zum Erstellen von Volumen-Snapshots auf mehreren Hosts gleichzeitig wird bei Beteiligung von Ceph nicht unterstützt.", + "ORG_ZSTACK_MEVOCO_10097": "Der bereitgestellte Java-Code-Schnipsel fehlt seine Quelldatei. Bitte stellen Sie sicher, dass alle erforderlichen Dateien enthalten sind und kompilieren Sie neu. Zusätzlich zeigt die Fehlermeldung \"unbekannte Nachrichtenversion\" ein nicht unterstütztes oder nicht erkanntes Nachrichtenformat an. Bitte überprüfen Sie die Nachrichtenversion und stellen Sie sicher, dass sie mit dem System kompatibel ist.", + "ORG_ZSTACK_STORAGE_BACKUP_10067": "Kein verfügbarer Object-Storage-Bucket für Backup-Vorgänge gefunden. Bitte stellen Sie sicher, dass Ihr Object-Storage-Dienst ordnungsgemäß konfiguriert und in der Cloud-Umgebung zugänglich ist.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10014": "Fehler beim Zuordnen von LUN zum Host vor dem Anhängen des Volumes an die VM", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10029": "Fabric-Netzwerk vom SDN-Controller [ip:%s] konnte wegen %s nicht abgerufen werden", + "ORG_ZSTACK_MEVOCO_10096": "Non-Admin-Konto kann das maximale Bandbreitenlimit von %s nicht überschreiten", + "ORG_ZSTACK_STORAGE_BACKUP_10066": "VM befindet sich nicht im gestoppten Zustand: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10026": "Abrufen des VPC des SDN-Controllers [IP:%s] fehlgeschlagen", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10011": "Block-SCSI-LUN-Informationen konnten nicht ausgetauscht werden:%s", + "ORG_ZSTACK_MEVOCO_10095": "SetVolumeQosMsg Version 1 ist in Cloud-Computing-Umgebungen veraltet; bitte migrieren Sie zu Version 2 für optimale Leistung und Kompatibilität.", + "ORG_ZSTACK_STORAGE_BACKUP_10065": "VM mit Volumen-Backup nicht gefunden [uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10027": "Abrufen des VPC des SDN-Controllers [IP:%s] fehlgeschlagen wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10012": "Fehler beim Bereinigen der Ressourcen nach dem Trennen des Volumes wegen %s", + "ORG_ZSTACK_MEVOCO_10094": "QoS des VM-Volumes auf Host %s kann nicht gelöscht werden, weil sich die aktuelle VM im Zustand %s befindet, unterstützte Zustände sind jedoch [%s, %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10064": "Original-Volume[uuid:%s] für Backup[uuid:%s] ist nicht mehr an die virtuelle Maschine[uuid:%s] angeschlossen", + "ORG_ZSTACK_STORAGE_BACKUP_10063": "Original-Snapshot für Backup [uuid:%s] wurde gelöscht, Volume kann nicht darauf zurückgesetzt werden", + "ORG_ZSTACK_MEVOCO_10099": "Nicht-Admin-Konto darf nur die Gesamtgrenze %s für virtuelle Ressourcen festlegen.", + "ORG_ZSTACK_STORAGE_BACKUP_10061": "Volume-Backup [uuid:%s] befindet sich derzeit im Status %s und kann nicht für Volume-Wiederherstellung verwendet werden.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10016": "primaryStorageUuid ist obligatorisch beim Herunterladen des Image-Cache.", + "ORG_ZSTACK_MEVOCO_10098": "Unbekannter Quality of Service (QoS) Grenzwerttyp angegeben. Bitte stellen Sie sicher, dass der QoS Grenzwerttyp korrekt konfiguriert ist.", + "ORG_ZSTACK_STORAGE_BACKUP_10060": "VM kann nicht aus Volume-Backup [uuid:%s] erstellt werden, da es kein root volume backup ist", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10017": "Die VM hat mehrere lokale Volumes auf verschiedenen Hosts [%s]. Bitte prüfen Sie auf unnormale VM-lokale Volumes.", + "ORG_ZSTACK_STORAGE_CEPH_10004": "Ungültige monitoring URL[%s], Hostname darf nicht null sein. Ein gültiges monitoring URL-Format ist %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10032": "get iMaster Logical Switch [%s] keine Antwort", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10018": "Das Volume auf einem Host [Host UUID: %s] kann nicht an die VM angehängt werden, da die VM lokale Volumes auf anderen Hosts hat [Host UUID: %s].", + "ORG_ZSTACK_STORAGE_CEPH_10005": "Ungültige monitoring URL[%s], der SSH-Port liegt außerhalb des gültigen Bereichs (1-65535). Eine gültige monitoring URL sollte das Format %s haben", + "ORG_ZSTACK_STORAGE_CEPH_10002": "Ungültige monitoring URL[%s], die SSH-BenutzerName:SSH-Passwort-Komponente ist ungültig. Ein gültiges monitoring URL-Format ist %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10030": "Erstellen von Huawei iMaster Logical Switch [%s] fehlgeschlagen wegen %s", + "ORG_ZSTACK_STORAGE_CEPH_10003": "Ungültige monitoring URL[%s]. SSH-Benutzername und Passwort müssen durch ':' getrennt sein und dürfen nicht leer sein. Ein gültiges monitoring URL-Format ist %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10035": "[%s] Huawei iMaster Virtual Switch Port [%s] fehlgeschlagen wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10013": "Die zwei Cluster mit UUIDs %s und %s können nicht innerhalb des L2-Netzwerks kommunizieren, wenn VM mit UUID %s zu einem anderen Cluster migriert wird.", + "ORG_ZSTACK_STORAGE_CEPH_10008": "Ceph-Pool mit UUID:%s existiert bereits und wird anderswo innerhalb der ZStack-Umgebung verwendet; daher kann er nicht wiederverwendet werden.", + "ORG_ZSTACK_STORAGE_BACKUP_10038": "Ungültige url[%s], sollte das Format hostname:/path haben", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10036": "Informationen zum logischen Switch-Port für logischen Switch[%s] abrufen fehlgeschlagen wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10014": "Die URL[%s] ist kein gültiger absoluter Pfad, der mit '/' beginnt. Bitte stellen Sie sicher, dass es mit 'http://' oder 'https://' beginnt.", + "ORG_ZSTACK_STORAGE_CEPH_10009": "Ceph-Primärspeicher kann nicht hinzugefügt werden, da er derzeit von MON-Hosts [%s] verwendet wird", + "ORG_ZSTACK_STORAGE_BACKUP_10037": "Ungültiger mount-Typ[%s], sollte [NFS, SSHFS, NBD] sein", + "ORG_ZSTACK_STORAGE_CEPH_10006": "Betriebsfehler: Der Pool-Name darf keine nicht druckbaren ASCII-Zeichen enthalten [poolName:%s]", + "ORG_ZSTACK_KVM_10080": "Wenn die VM-Plattform Other ist, kann die Anzahl von dataVolumes und cdroms 3 nicht überschreiten; derzeit %s.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10033": "Löschen von Huawei iMaster Virtual Switch [%s] fehlgeschlagen wegen %s", + "ORG_ZSTACK_STORAGE_BACKUP_10036": "Grad [%s] sollte ein positiver ganzzahliger Wert sein", + "ORG_ZSTACK_STORAGE_CEPH_10007": "Erstellungsfehler, doppelter Pool-Name[%s]. Ein Pool mit demselben Namen existiert bereits [uuid:%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10016": "Der Host der virtuellen Maschine [hostUuid:%s] unterscheidet sich von dem des Volumes [hostUuid:%s]. Das Volume kann nicht an die virtuelle Maschine angehängt werden.", + "ORG_ZSTACK_STORAGE_BACKUP_10035": "[%s] ist kein Standard-CIDR, meinten Sie [%s]?", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10034": "Aktualisierung von Huawei iMaster Logical Switch [%s] fehlgeschlagen wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10010": "Das Volume mit UUID [%s] ist das Root-Volume der VM mit UUID [%s]. Die VM hat derzeit noch %s Daten-Volumes angehängt; bitte hängen Sie diese vor der Migration ab.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10011": "Das Volume [UUID:%s] ist das Root-Volume der VM [UUID:%s]. Die virtuelle Maschine hat derzeit noch ein ISO angehängt; bitte hängen Sie es vor der Migration ab.", + "ORG_ZSTACK_KVM_10088": "Fehler beim Überprüfen der physischen Netzwerkschnittstellen[Names: %s] auf dem KVM-Host[UUID:%s, IP:%s]", + "ORG_ZSTACK_KVM_10079": "Host[%s] Aktualisierung der Spice-Kanalkonfiguration fehlgeschlagen wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10021": "Volume: %s ist nicht angehängt, Erstellen des Image-Cache für Volume fehlgeschlagen", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10024": "Installationspfad zum Herunterladen von Volume: %s konnte nicht gefunden werden, bitte bereiten Sie ihn vor dem Fortfahren vor", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10039": "Löschen von Huawei iMaster Logical Router[%s] fehlgeschlagen, weil %s", + "ORG_ZSTACK_MEVOCO_10064": "networkInboundBandwidthFormatError %s", + "ORG_ZSTACK_STORAGE_BACKUP_10034": "Volume-Backup [uuid:%s] auf keinem Speichermedium gefunden", + "ORG_ZSTACK_MEVOCO_10063": "Netzwerk-Eingangsbandbreite überschreitet den maximal erlaubten Wert von 32 Gbps", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10025": "Host zum Herunterladen von Volume %s konnte nicht gefunden werden", + "ORG_ZSTACK_STORAGE_BACKUP_10033": "Keine Berechtigung für Volume-Backups innerhalb der Gruppe UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10022": "Ziel-Host für Volume: %s kann nicht gefunden werden", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10037": "Löschen von Huawei iMaster Virtual Switch Port [%s] fehlgeschlagen wegen %s", + "ORG_ZSTACK_STORAGE_BACKUP_10032": "Mehrere Root-Disks gefunden innerhalb der Gruppe uuid: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10023": "Host zum Zuordnen für Volume %s konnte nicht gefunden werden", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10038": "Erstellen von Huawei iMaster Virtual Router[%s] fehlgeschlagen, weil %s", + "ORG_ZSTACK_MEVOCO_10061": "Der Status des Management-Knotens ist nicht %s", + "ORG_ZSTACK_STORAGE_BACKUP_10031": "Root-Volume fehlt innerhalb der Gruppe UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10026": "Abrufen der Host-Initiator-Referenz fehlgeschlagen, bitte verbinden Sie diesen Host erneut: %s", + "ORG_ZSTACK_MEVOCO_10066": "networkOutboundBandwidthFormatError %s", + "ORG_ZSTACK_MEVOCO_10065": "Netzwerk-Ausgangsbandbreite überschreitet den maximalen Wert von 32 Gbps", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10042": "Erstellen von Huawei IMaster subnet[%s] fehlgeschlagen, weil %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10028": "Herunterladen von Image[uuid:%s] auf alle Hosts im lokalen Speicher[uuid:%s] fehlgeschlagen. %s", + "ORG_ZSTACK_STORAGE_CEPH_10015": "Ungültige monUrl[%s]. Eine gültige URL sollte das Format %s haben", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10043": "Löschen von Huawei iMaster subnet[%s] fehlgeschlagen, weil %s", + "ORG_ZSTACK_STORAGE_CEPH_10016": "dataVolumePoolName kann null sein, aber darf nicht ein leerer String sein.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10040": "Erstellen von Huawei iMaster virtual network link[%s] fehlgeschlagen, weil %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10041": "Löschen von Huawei iMaster virtual network link[%s] fehlgeschlagen, weil %s", + "ORG_ZSTACK_STORAGE_CEPH_10019": "Ceph-Backup-Speicher kann nicht hinzugefügt werden, da bereits ein Ceph-Backup-Speicher mit mon[hostnames:%s] verwendet wird", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10046": "Es wurde keine neue virtuelle Netzwerkschnittstelle eingerichtet, was nicht auftreten sollte.", + "ORG_ZSTACK_MEVOCO_10082": "Fehler beim Festlegen des I/O-Thread-Pins [%d] [%s] auf der virtuellen Maschine [%s]: %s.", + "ORG_ZSTACK_STORAGE_BACKUP_10049": "Fehler beim Erstellen des Volume-Backups für Volume[uuid:%s], da das angehängte Volume nicht in einem Zustand von [%s, %s] ist", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10025": "Der primäre Speicher [UUID:%s] ist deaktiviert; die kalte Migration ist nicht erlaubt.", + "ORG_ZSTACK_STORAGE_BACKUP_10048": "Fehler beim Erstellen des Volume-Backups für Volume[uuid:%s], da sich die VM nicht im Zustand [%s, %s] befindet", + "ORG_ZSTACK_STORAGE_CEPH_10017": "rootVolumePoolName kann null sein, darf aber nicht ein leerer String sein.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10026": "Volume[uuid:%s] ist nicht mehr an den lokalen Speicher angeschlossen, es wurde möglicherweise gelöscht oder getrennt", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10044": "Abrufen der Systeminformationen des SDN-Controllers [IP:%s] fehlgeschlagen", + "ORG_ZSTACK_STORAGE_BACKUP_10047": "Fehler beim Erstellen des Volume-Backups für Volume[uuid:%s], da es nicht an eine VM-Instanz angeschlossen ist", + "ORG_ZSTACK_STORAGE_CEPH_10018": "imageCachePoolName kann null sein, darf aber nicht ein leerer String sein", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10045": "Abrufen der Systeminformationen des SDN-Controllers [IP:%s] fehlgeschlagen aufgrund von %s", + "ORG_ZSTACK_STORAGE_BACKUP_10046": "Volume-Backup kann nicht für freigebbares Volume[uuid:%s] erstellt werden", + "ORG_ZSTACK_KVM_10093": "Verbindung zum KVM-Host[uuid:%s, ip:%s, url:%s] fehlgeschlagen aufgrund von %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10022": "Um ein Volume auf dem lokalen primären Speicher zu erstellen, müssen Sie den Host, auf dem das Volume erstellt werden soll, mit dem System-Tag [%s] angeben.", + "ORG_ZSTACK_KVM_10096": "Der Host kann auf keinen primären Speicher zugreifen, bitte überprüfen Sie Ihre Speicherkonfiguration oder kontaktieren Sie den Support %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10023": "Ungültiges URI-Format. Korrekte Beispiele sind file://$URL, hostUuid://$HOSTUUID oder volume://$VOLUMEUUID.", + "ORG_ZSTACK_STORAGE_CEPH_10012": "Derselbe Mono-Knoten kann nicht mehrfach hinzugefügt werden.", + "ORG_ZSTACK_KVM_10099": "Der SSH-Port[%s] des Hosts[%s] ist nach %s Sekunden nicht erreichbar, Verbindungstimeout", + "ORG_ZSTACK_STORAGE_CEPH_10010": "Derselbe Host [%s] kann nicht zu den Cluster-Mons hinzugefügt werden", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10031": "Das Backup von Snapshots auf den Backup-Speicher ist eine veraltete Funktion und wird auf Block-Primärspeicher nicht unterstützt.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10032": "Fehler beim Finden des Clusters für das Commit-Volume auf PS:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10035": "Die UUID des primären Speichers ist beim Löschen eines LUN obligatorisch", + "ORG_ZSTACK_MEVOCO_10075": "Freigebbare Datenträger unterstützen derzeit nur den Typ virtio-scsi.", + "ORG_ZSTACK_STORAGE_BACKUP_10045": "Unerwarteter Backup-Speicher[Typ:%s,UUID:%s] erkannt", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10036": "Die UUID des Hosts ist beim Abrufen des Host-Initiator-Namens obligatorisch", + "ORG_ZSTACK_MEVOCO_10074": "Freigebbares Volume[uuid:%s] ist bereits an die virtuelle Maschine[uuid:%s] angeschlossen", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10048": "Keine neue virtuelle Netzwerkschnittstelle erstellt, dies sollte nicht auftreten.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10033": "Fehler beim Finden des Hosts für Commit-Volume:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10034": "Fehler beim Herunterladen[%s] vom Backup-Speicher[Hostname:%s] auf den Block-Primärspeicher[UUID:%s, Pfad:%s], %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10049": "Es ist kein SDN-Fabric auf dem Controller [IP:%s] konfiguriert", + "ORG_ZSTACK_MEVOCO_10078": "Die aktuelle Lizenzversion unterstützt das Ändern dieser Ressourcenkonfiguration nicht [name:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10037": "initiatorName %s wird von einem anderen Host verwendet, bitte generieren Sie den Initiator für Host %s neu", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10038": "Volume-Vorlage mit dem Namen %s konnte nicht gefunden werden", + "ORG_ZSTACK_MEVOCO_10076": "shareable Volume(s) [UUID: %s] angehängt; Gruppensnapshot wird nicht unterstützt.", + "ORG_ZSTACK_AI_MESSAGE_10002": "Dataset-Erstellungsauftrag kann nicht abgebrochen werden, weil die Ressourcen-UUID[%s] oder Model-Center-UUID[%s] null ist", + "ORG_ZSTACK_AI_MESSAGE_10001": "Model-Service-Download-Aufgabe kann nicht abgebrochen werden, weil die Ressourcen-UUID[%s] oder Model-Center-UUID[%s] null ist", + "ORG_ZSTACK_IPSEC_VYOS_10009": "Anwendung auf HA-Gruppe fehlgeschlagen wegen %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10013": "HTTP-Aufrufe an alle Prometheus-Instanzen in der Cloud-Umgebung fehlgeschlagen.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10012": "unbekannter Datentyp %s für Schlüssel = %s", + "ORG_ZSTACK_ENCRYPT_10000": "API-Nachricht konnte nicht geparst werden: Verschlüsselungsparameter mit Typ %s kann nicht geparst werden", + "ORG_ZSTACK_ENCRYPT_10002": "API-Nachricht konnte nicht geparst werden: %d Verschlüsselungsparameter-System-Tags gefunden, erwartet 1", + "ORG_ZSTACK_IPSEC_VYOS_10001": "VYOS unterstützt AES-192 als IKE-Verschlüsselungsalgorithmus nicht; verfügbare Optionen sind AES-128 und AES-256.", + "ORG_ZSTACK_IPSEC_VYOS_10000": "der Remote-CIDR [%s] überlappt mit dem Virtual-Router-Interface-CIDR [%s]", + "ORG_ZSTACK_IPSEC_VYOS_10003": "vyos unterstützt %d als IKE DH Group nicht", + "ORG_ZSTACK_IPSEC_VYOS_10002": "vyOS unterstützt AES-192 als PolicyEncryptionAlgorithm nicht; verfügbare Optionen sind AES-128 und AES-256 sowie 3DES.", + "ORG_ZSTACK_COMPUTE_VM_10000": "Status von VM[uuid:%s] ist nicht im Status Running; daher kann keine Uhrzeitsynchronisation durchgeführt werden.", + "ORG_ZSTACK_COMPUTE_VM_10008": "vm[uuid:%s] ist Teil von Cluster[uuid:%s], aber es sind keine verfügbaren Hosts im Cluster verfügbar. Daher kann die Image-Änderung für diese VM nicht verarbeitet werden.", + "ORG_ZSTACK_COMPUTE_VM_10007": "vm[uuid:%s] Cluster-UUID ist null, Image kann nicht geändert werden", + "ORG_ZSTACK_COMPUTE_VM_10006": "VM-Status ist nicht Stopped: %s. Die Aktion 'changevmimage' kann nicht ausgeführt werden.", + "ORG_ZSTACK_COMPUTE_VM_10005": "XML-Hook mit UUID: %s erfolgreich an VM mit UUID: %s angehängt, aber Neustart der VM fehlgeschlagen. Details: %s", + "ORG_ZSTACK_COMPUTE_VM_10004": "XML-Hook mit UUID: %s erfolgreich von VM mit UUID: %s getrennt, aber Probleme beim VM-Neustart aufgetreten. Details: %s", + "ORG_ZSTACK_COMPUTE_VM_10003": "Hot-adding ist nicht deaktiviert; bitte stellen Sie sicher, dass NUMA-Konfiguration gesetzt ist, bevor Sie die virtuelle Maschine öffnen.", + "ORG_ZSTACK_COMPUTE_VM_10011": "Der Direction-Parameter muss auf IN oder OUT gesetzt sein.", + "ORG_ZSTACK_COMPUTE_VM_10010": "Backup-Speicher kann nicht gefunden werden, Volume-Snapshot[psUuid:%s] kann nicht als Image committed werden, erforderliche PS-UUID:%s", + "ORG_ZSTACK_COMPUTE_VM_10018": "Statusvalidierung während Passwortänderungsoperation fehlgeschlagen.%s", + "ORG_ZSTACK_COMPUTE_VM_10017": "Ziel-Host nicht in Datenbank gefunden nach UUID: %s, Passwortänderungsbefehl kann nicht an den Host gesendet werden!", + "ORG_ZSTACK_STORAGE_DEVICE_10036": "hba Scan fehlgeschlagen: %s", + "ORG_ZSTACK_COMPUTE_VM_10015": "VM [%s]'s Host-UUID ist null, Netzwerk-QoS kann nicht synchronisiert werden", + "ORG_ZSTACK_COMPUTE_VM_10014": "VM [%s] muss sich im Status Running oder Paused befinden, um NIC-QoS-Einstellungen zu synchronisieren", + "ORG_ZSTACK_STORAGE_DEVICE_10031": "VM-Instanz[uuid: %s] Host[uuid: %s] konnte SCSI-LUN[uuid: %s] nicht anhängen", + "ORG_ZSTACK_COMPUTE_VM_10013": "Die ausgehende Bandbreite darf maximal %s betragen.", + "ORG_ZSTACK_COMPUTE_VM_10012": "Die eingehende Bandbreite darf maximal %s Gbps betragen.", + "ORG_ZSTACK_STORAGE_DEVICE_10030": "Der VM-Status [%s] der VM-Instanz [%s] ist für den angegebenen Vorgang [%s] nicht zulässig", + "ORG_ZSTACK_COMPUTE_VM_10022": "Fehler beim Festlegen der Sicherheitsstufe, da Sicherheitsfunktionen deaktiviert sind. Bitte stellen Sie sicher, dass die Sicherheitsfunktionen aktiviert sind, bevor Sie diese Konfiguration vornehmen.", + "ORG_ZSTACK_COMPUTE_VM_10020": "Die Anzahl der Datenträger überschreitet das angegebene Limit [Anzahl: %s]. Bitte reduzieren Sie die Anzahl der Datenträger bei der Erstellung der virtuellen Maschine.", + "ORG_ZSTACK_STORAGE_DEVICE_10028": "Der angegebene SCSI-LUN [WWID: %s] existiert nicht oder ist deaktiviert", + "ORG_ZSTACK_STORAGE_DEVICE_10029": "SCSI [%s] LUN [WWID: %s] wurde bereits an VM [%s] angeschlossen", + "ORG_ZSTACK_STORAGE_DEVICE_10026": "Es wurden unterschiedliche iSCSI-Konfigurationen auf Host [UUID:%s, Ziele:%s] und Host [UUID:%s, Ziele:%s] gefunden.", + "ORG_ZSTACK_STORAGE_DEVICE_10027": "Es wurden unterschiedliche Festplattentypen auf den Hosts für LUN [Seriennummer:%s] gefunden, ein Anschließen an den Cluster ist nicht möglich.", + "ORG_ZSTACK_COMPUTE_VM_10029": "VM konnte nicht geklont werden, da ein Präfix für das Netzwerk [uuid:%s] angegeben ist", + "ORG_ZSTACK_STORAGE_DEVICE_10024": "SCSI-LUN-Datensatz [%(s)s] auf Host [%(s)s] nicht gefunden", + "ORG_ZSTACK_COMPUTE_VM_10028": "VM konnte nicht geklont werden, da die IPv6-Adresse [%s] nicht gültig ist", + "ORG_ZSTACK_STORAGE_DEVICE_10025": "Unerwarteter Hypervisor-Typ [%s] für den virtuellen Maschinen-Host [%s]", + "ORG_ZSTACK_COMPUTE_VM_10027": "VM konnte nicht geklont werden, da eine Netzmaske für das Netzwerk [uuid:%s] angegeben ist", + "ORG_ZSTACK_STORAGE_DEVICE_10022": "Es wurden unterschiedliche NVMe-Ziele auf Host [hostUuid:%s, Ziele:%s] und Host [hostUuid:%s, Ziele:%s] gefunden.", + "ORG_ZSTACK_COMPUTE_VM_10026": "VM konnte nicht geklont werden, da die angegebene IP-Adresse [%s] ungültig ist", + "ORG_ZSTACK_STORAGE_DEVICE_10023": "SCSI-LUN [%s] ist an die virtuelle Maschine [%s] angeschlossen", + "ORG_ZSTACK_COMPUTE_VM_10025": "VM konnte nicht geklont werden, da das Layer-3-Netzwerk [uuid:%s] nicht gefunden wurde", + "ORG_ZSTACK_STORAGE_DEVICE_10020": "VM-Instanz [%s] Status [%s] ist für den Vorgang [%s] nicht zulässig", + "ORG_ZSTACK_COMPUTE_VM_10024": "Unbekannter Sicherheitsstufen-Code [%s], unterstützte Werte sind [0-7]", + "ORG_ZSTACK_STORAGE_DEVICE_10021": "VM-Instanz [%s] konnte SCSI-LUN [uuid: %s] auf Host [uuid: %s] nicht anschließen", + "ORG_ZSTACK_COMPUTE_VM_10023": "Sicherheitsstufe kann nicht auf VM nicht aktiviert gesetzt werden [uuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10002": "Der aktuelle Primärspeicher %s hat kein Drittanbieter-Token konfiguriert, daher kann vorübergehend kein Blockvolume erstellt werden.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10001": "Ungültige zugewiesene virtuelle Ressourcen-URL:%s", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10000": "URL-Zuweisung fehlgeschlagen. Bitte stellen Sie sicher, dass die URL korrekt und verfügbar ist. Falls das Problem weiterhin besteht, wenden Sie sich an den Support für weitere Unterstützung.", + "ORG_ZSTACK_STORAGE_DEVICE_10017": "SCSI-LUN [WWID: %s] wurde bereits an VM [%s] angeschlossen", + "ORG_ZSTACK_STORAGE_DEVICE_10015": "SCSI-LUN [uuids:%s] sind nicht mit dem Cluster des Hosts [uuid:%s] verbunden", + "ORG_ZSTACK_STORAGE_DEVICE_10016": "Bitte hängen Sie alle dem VM [%s] zugeordneten Blockgeräte aus und versuchen Sie es erneut", + "ORG_ZSTACK_STORAGE_DEVICE_10014": "SCSI-LUN [WWID: %s] wurde an die virtuelle Maschineninstanz %s angeschlossen", + "ORG_ZSTACK_STORAGE_DEVICE_10011": "iSCSI-Server [UUID: %s] ist nicht mit dem Cluster [UUID: %s] verbunden", + "ORG_ZSTACK_STORAGE_DEVICE_10012": "iSCSI-Server [UUID: %s] ist noch mit Cluster [UUID: %s] verbunden", + "ORG_ZSTACK_STORAGE_DEVICE_10010": "iSCSI-Server [UUID: %s] ist bereits mit Cluster [UUID: %s] verbunden", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10008": "Lokale CIDR und Remote-CIDR müssen gültige CIDR-Bereiche sein!", + "ORG_ZSTACK_NETWORK_SERVICE_HEADER_NFVINSTGROUP_10000": "Abfragen des Cluster-Status wird für diesen NFV-Instanztyp nicht unterstützt.", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10001": "VPN-Gateway [%s] existiert, kann nicht entfernt werden.", + "ORG_ZSTACK_STORAGE_DEVICE_10008": "iSCSI-Server [IP: %s, Port: %s] existiert bereits", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10005": "%s ist keine gültige IPv4-Adresse für Cloud-Bereitstellungskonfigurationen", + "ORG_ZSTACK_STORAGE_DEVICE_10009": "iSCSI-Server IP: %s ist nicht gültig", + "ORG_ZSTACK_STORAGE_DEVICE_10006": "NVMe-Server mit UUID: %s ist bereits mit Cluster mit UUID: %s verbunden", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10007": "Remote-CIDR muss eine gültige CIDR-Notation sein!", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10006": "localCidr muss ein gültiger Cidr sein!", + "ORG_ZSTACK_STORAGE_DEVICE_10004": "NVMe-Server [ip: %s, port: %s, transport: %s] existiert bereits in der Cloud-Umgebung.", + "ORG_ZSTACK_STORAGE_DEVICE_10005": "NVMe-Server IP: %s ist ungültig", + "ORG_ZSTACK_STORAGE_DEVICE_10003": "Migration von VM[uuid:%s] mit gemeinsamem Speicher wird nicht unterstützt", + "ORG_ZSTACK_STORAGE_DEVICE_10000": "SCSI-LUN mit uuid: %s und uuid: %s haben keinen gemeinsamen Host", + "ORG_ZSTACK_STORAGE_DEVICE_10001": "SCSI-LUN [uuid: %s] befindet sich im deaktivierten Zustand", + "ORG_ZSTACK_ALIYUN_NETWORK_VPN_10000": "VPN-Gateway und Benutzer-Gateway müssen sich im gleichen Rechenzentrum befinden.", + "ORG_ZSTACK_IPSEC_VYOS_10016": "Erstellen von ipsec zu HA-Route fehlgeschlagen wegen %s", + "ORG_ZSTACK_IPSEC_VYOS_10015": "Löschen von ipsec aus HA-Gruppe fehlgeschlagen wegen %s", + "ORG_ZSTACK_COMPUTE_BONDING_10001": "Schnittstelle wurde bereits auf dem Host erstellt", + "ORG_ZSTACK_COMPUTE_BONDING_10008": "Bonding-Karte kann keine Schnittstellen in einem Bond mit unterschiedlichen Geschwindigkeiten auf dem Host[%s] haben.", + "ORG_ZSTACK_COMPUTE_BONDING_10007": "Schnittstelle[%s] kann nicht in einem Bond sein, das als SRIOV virtualisiert wurde.", + "ORG_ZSTACK_COMPUTE_BONDING_10006": "Schnittstellen können nicht in einem Bond sein, das als Netzwerk-Bridge verwendet wurde, die bereits vom Host[%s] verwendet wurde.", + "ORG_ZSTACK_COMPUTE_BONDING_10005": "Belegte Schnittstellen können nicht in einem Bond sein, das bereits vom Host[%s] verwendet wird.", + "ORG_ZSTACK_IPSEC_VYOS_10012": "Aktualisierung der ipsec-Version fehlgeschlagen wegen:vpc[%s] existiert nicht", + "ORG_ZSTACK_COMPUTE_BONDING_10009": "Es gibt keine Slave-Netzwerkschnittstelle auf dem Host[uuid:%s]", + "ORG_ZSTACK_IPSEC_VYOS_10013": "Synchronisierung zur HA-Gruppe fehlgeschlagen wegen:%s", + "ORG_ZSTACK_MEVOCO_10105": "Nicht-Administrator-Konto kann die Lese-/Schreib-%s-Grenzen nicht höher setzen als: %s/%s", + "ORG_ZSTACK_SIMULATOR_10002": "Instanz auf getrennten Zustand gesetzt", + "ORG_ZSTACK_MEVOCO_10104": "Nicht-Admin-Konto kann den Schreib-[Speichergrenze] nicht als unbegrenzt setzen.", + "ORG_ZSTACK_MEVOCO_10103": "Nicht-Admin-Konto kann die Lese-I/O-Grenzwerte nicht auf unbegrenzt setzen.", + "ORG_ZSTACK_MEVOCO_10102": "Nicht-administratives Konto darf nur Lese-/Schreib-%s-Grenzwerte konfigurieren.", + "ORG_ZSTACK_MEVOCO_10109": "Die Host-UUID der VM [%s] ist null, Volume-QoS kann nicht synchronisiert werden.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10016": "FiSecClientFactory-Verbindungstest fehlgeschlagen.", + "ORG_ZSTACK_MEVOCO_10108": "VM [%s] muss den Status \"Running\" oder \"Paused\" haben, um Volume-QoS zu synchronisieren.", + "ORG_ZSTACK_MEVOCO_10107": "Volume [%s] ist an keine virtuelle Maschine angeschlossen (oder die VM existiert nicht), Volume-QoS kann nicht synchronisiert werden.", + "ORG_ZSTACK_SIMULATOR_10004": "Die Fehlermeldung \"on purpose\" deutet auf eine absichtliche Aktion hin, nicht auf einen Systemfehler. Bitte geben Sie weitere Details zum beabsichtigten Zweck an, um fortzufahren.", + "ORG_ZSTACK_MEVOCO_10106": "Volume [%s] ist an keine virtuelle Maschine angeschlossen; daher kann QoS nicht durch forceSync abgerufen werden.", + "ORG_ZSTACK_MEVOCO_10101": "Nicht-Administrator-Konto kann das %s-Gesamtlimit nicht größer als: %s setzen.", + "ORG_ZSTACK_MEVOCO_10100": "Nicht-Admin-Konto kann die %s-Gesamtgrenzwerte nicht auf Unendlich setzen.", + "ORG_ZSTACK_COMPUTE_BONDING_10011": "Bindung mit Schnittstelle, die mit VTEP-IP-Adresse konfiguriert ist, nicht möglich. Bitte stellen Sie sicher, dass die VTEP-IP korrekt konfiguriert und erreichbar ist.", + "ORG_ZSTACK_COMPUTE_BONDING_10010": "Bindung mit Schnittstelle, die dem Verwaltungsnetzwerk entspricht, nicht möglich. Bitte stellen Sie sicher, dass die virtuelle Netzwerkschnittstelle korrekt konfiguriert ist und dem angegebenen Verwaltungsnetzwerk entspricht.%s", + "ORG_ZSTACK_COMPUTE_BONDING_10015": "Bonding-Karte kann keine Schnittstelle[%s] haben, die SR-IOV-virtualisiert wurde.", + "ORG_ZSTACK_COMPUTE_BONDING_10014": "Bonding-Karte kann keine Schnittstellen haben, die als Netzwerkbrücke verwendet wurden, die bereits vom Host[%s] verwendet wurde.", + "ORG_ZSTACK_COMPUTE_BONDING_10013": "Bonding-Karte kann keine belegten Schnittstellen haben, die bereits vom Host[%s] verwendet wurden.", + "ORG_ZSTACK_COMPUTE_BONDING_10012": "Schnittstellen in einem Bond dürfen nicht auf unterschiedlichen Hosts sein[%s].", + "ORG_ZSTACK_COMPUTE_BONDING_10019": "[Bonding] kann nicht [%s] Schnittstellen haben, es müssen zwischen 1 und 2 sein.", + "ORG_ZSTACK_COMPUTE_BONDING_10018": "[Bonding-Karte] kann nicht [Anzahl der Schnittstellen] auf [%s] gesetzt haben, es muss eine Zahl zwischen [1~8] sein.", + "ORG_ZSTACK_COMPUTE_BONDING_10017": "[%s] Bonding-Schnittstelle kann keine andere xmit_hash_policy angeben, nur modus 802.3ad unterstützt die Angabe einer anderen Policy.", + "ORG_ZSTACK_COMPUTE_BONDING_10016": "Bonding-Karte kann keine Schnittstellen mit unterschiedlichen Geschwindigkeiten auf dem Host[%s] haben.", + "ORG_ZSTACK_MEVOCO_10113": "Volume[UUID:%s] verwendet vhost-user-Protokoll, das mit nativem asynchronem I/O nicht kompatibel ist. Bitte deaktivieren Sie aio.native oder wählen Sie ein anderes Volume-Protokoll.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10003": "Verbindung zum Secret-Ressourcen-Pool[UUID: %s] konnte nicht hergestellt werden.", + "ORG_ZSTACK_MEVOCO_10112": "Die aktuelle Lizenzversion unterstützt das Ändern dieser globalen Konfiguration nicht [Name:%s].", + "ORG_ZSTACK_MEVOCO_10111": "Freigabe-Volume konnte nicht von der VMInstance getrennt werden: [%s].", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10005": "%s Client-Initialisierung fehlgeschlagen: Die Secret-Ressourcen-Pool-Eigenschaft ist ungültig.", + "ORG_ZSTACK_MEVOCO_10110": "Freigabe-Volume[UUID:%s] konnte nicht von Instance[UUID:%s] getrennt werden.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10006": "Plugin (UUID: %s) kann nicht gelöscht werden, da es mit folgenden Secret-Ressourcen-Pools verbunden ist: [%s].", + "ORG_ZSTACK_MEDIATOR_10005": "Die VIP [UUID:%s] ist bereits an einen anderen Dienst [%s] gebunden.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10007": "Organisations-ID[UUID:%s] hat bereits Operationsattribute, %s kann nicht hinzugefügt werden.", + "ORG_ZSTACK_MEDIATOR_10006": "Aktueller Portbereich [%s, %s] steht im Konflikt mit dem Systemdienst-Portbereich [%s, %s] für VIP [UUID: %s] Protokoll: %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10008": "Zone mit UUID:%s kann nicht gefunden werden", + "ORG_ZSTACK_MEDIATOR_10007": "Aktueller Portbereich [%s, %s] steht in Konflikt mit verwendetem Portbereich [%s, %s] für VIP [UUID: %s] Protokoll: %s", + "ORG_ZSTACK_COMPUTE_VM_10080": "VM[uuid:%s] CD-ROM Geräte-ID Wiederholung", + "ORG_ZSTACK_COMPUTE_VM_10077": "VM[uuid:%s] hat ISO[uuid:%s] angehängt", + "ORG_ZSTACK_COMPUTE_VM_10074": "Reservierter Speicher[%s] überschreitet den verfügbaren Speicherplatz[%s]", + "ORG_ZSTACK_COMPUTE_VM_10073": "Unerwartete CPU- und Speichereinstellungen. Bitte stellen Sie sicher, dass die angegebenen Werte mit Ihrem Instanztyp und Ihren Anforderungen kompatibel sind.", + "ORG_ZSTACK_COMPUTE_VM_10071": "Host für VM[uuid=%s] kann nicht gefunden werden", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10000": "Virtuelle ID[uuid:%s] hat bereits Verwaltungsattribute zugeordnet; daher kann %s nicht zugewiesen werden.", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10000": "Identitätszone [%s] existiert bereits, UUID: %s", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10001": "RegionId: [%s] ist keine gültige Aliyun- und ZStack-Region, bitte wählen Sie eine andere", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10002": "Typ [%s] stimmt nicht mit dem erwarteten Rechenzentrumstyp [%s] überein", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10003": "Projekt[uuid:%s] hat bereits einen designierten Projektadministrator", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10003": "Entweder UUID des Rechenzentrums oder Region-ID muss gesetzt werden, bitte prüfen Sie die Parameter.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10004": "Projekt[uuid:%s] existiert nicht", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10004": "Identitätszone [%s] wird noch synchronisiert, bitte warten.", + "ORG_ZSTACK_COMPUTE_VM_10079": "Es ist kein verfügbarer IP-Bereich im L3-Netzwerk [%s] vorhanden", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10005": "Virtuelle ID [UUID:%s] hat bereits ein Projektoperator-Attribut zugeordnet.", + "ORG_ZSTACK_COMPUTE_VM_10078": "Alle VM[UUID:%s] CD-ROMs haben ISO-Images eingebunden", + "ORG_ZSTACK_COMPUTE_VM_10090": "Volume konnte nicht instantiiert werden, da der VM-Host [UUID: %s] und der zugewiesene Primärspeicher [UUID: %s] nicht verbunden sind.", + "ORG_ZSTACK_COMPUTE_VM_10088": "Aktueller VM-Status[%s], Virtio-Modifikation erfordert VM-Status[%s]", + "ORG_ZSTACK_COMPUTE_VM_10084": "ISO [UUID:%s] kann in keinem verbundenen Backup-Speicher gefunden werden, der der Zone [UUID:%s] zugeordnet ist. Bitte überprüfen Sie Folgendes:", + "ORG_ZSTACK_COMPUTE_VM_10083": "Keiner der angegebenen Primärspeicher%s ist verfügbar", + "ORG_ZSTACK_COMPUTE_VM_10081": "Erstellung basiert auf Image-Cache[uuid:%s, located ps uuids: [%s]], kann nicht woanders erstellt werden.", + "ORG_ZSTACK_KVM_HYPERVISOR_10000": "Host-Virtualisierungsinformationen konnten nicht gesammelt werden", + "ORG_ZSTACK_COMPUTE_VM_10099": "Wechsel zum L3-Netzwerk nicht möglich. Das L3-Netzwerk [uuid:%s] gehört zu L2-Netzwerken [uuids:%s], die keinem Cluster zugeordnet sind.", + "ORG_ZSTACK_COMPUTE_VM_10098": "Wechsel zum L3-Netzwerk nicht möglich. Das angegebene L3-Netzwerk [uuid:%s] gehört zu einem anderen L2-Netzwerk [uuids:%s].", + "ORG_ZSTACK_COMPUTE_VM_10097": "Wechsel zum L3-Netzwerk nicht möglich. Das angegebene L3-Netzwerk [uuid:%s] hat keinen konfigurierten IP-Bereich.", + "ORG_ZSTACK_COMPUTE_VM_10096": "Wechsel zum L3-Netzwerk nicht möglich. Die VM [uuid: %s] befindet sich nicht im Status \"Running\" oder \"Stopped\"; der aktuelle Status ist %s", + "ORG_ZSTACK_COMPUTE_VM_10094": "Wechsel zum L3-Netzwerk nicht möglich; das L2 von L3 [uuid:%s, %s] verwendet einen anderen vSwitch.", + "ORG_ZSTACK_COMPUTE_VM_10093": "Entweder l3NetworkUuids oder backupStorageUuid muss angegeben werden", + "ORG_ZSTACK_COMPUTE_VM_10092": "Screenshot einer VM [uuid:%s] kann nicht erstellt werden, die sich nicht im Status \"Wird ausgeführt\" befindet.", + "ORG_ZSTACK_MEDIATOR_10002": "Es ist nicht möglich, ein Layer-3-Netzwerk anzuhängen. Der CIDR des L3-Netzwerks [%s], das angehängt werden soll, überschneidet sich mit dem CIDR des L3-Netzwerks [%s], das bereits an der VM angehängt ist.", + "ORG_ZSTACK_MEDIATOR_10003": "Die VM [name:%s, UUID:%s] hat bereits einige Port-Weiterleitungsregeln %s konfiguriert.", + "ORG_ZSTACK_MEDIATOR_10004": "Die VM [name:%s, uuid:%s] hat bereits einige Elastic-IP-Adressen %s angehängt.", + "ORG_ZSTACK_COMPUTE_VM_10033": "VM konnte nicht geklont werden, da die Standardgröße der L3-UUIDs nicht 1 ist.", + "ORG_ZSTACK_COMPUTE_VM_10032": "VM konnte nicht geklont werden, da der Status [%s] nicht gültig ist.", + "ORG_ZSTACK_COMPUTE_VM_10031": "VM konnte nicht geklont werden, da der Treibertyp [%s] nicht gültig ist.", + "ORG_ZSTACK_COMPUTE_VM_10030": "VM konnte nicht geklont werden, da der NicType [%s] nicht gültig ist.", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10002": "Zugehörige Pfade im Papierkorb (%s) wurden im Primary Storage [%s] für den Migrations-Installationspfad [%s] gefunden. Bitte bereinigen Sie diese zunächst mit 'APICleanUpTrashOnPrimaryStorageMsg', wenn Sie darauf bestehen, das Volume [%s] zu migrieren.", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10000": "Es kann kein verbundener Host für den Speichermigrationsvorgang gefunden werden. Bitte stellen Sie sicher, dass der Zielhost verfügbar und in der Cloud-Umgebung korrekt konfiguriert ist.", + "ORG_ZSTACK_COMPUTE_VM_10039": "Der Vorgang ist nur bei Benutzer-VM-Instanzen zulässig.", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10003": "Das Volume [uuid:%s] ist vom Image [uuid:%s] abhängig, andere Abhängigkeiten umfassen Images [%s].", + "ORG_ZSTACK_COMPUTE_VM_10038": "Die Netzwerkschnittstelle %s ist nicht an der VM angehängt.", + "ORG_ZSTACK_COMPUTE_VM_10037": "Es sind nicht genügend Kapazitätsressourcen für das Klonen der VM [UUID: %s], Volumes [UUID: %s] auf dem Primary Storage [UUID: %s] vorhanden. Erforderliche Kapazität beträgt %s Bytes, während die aktuell verfügbare Kapazität %s Bytes beträgt.", + "ORG_ZSTACK_COMPUTE_VM_10036": "VM-Schnellerstellung unterstützt nur das Klonen von Datenvolumes auf demselben Primary Storage [UUID: %s] wie die ursprüngliche VM [UUID: %s].", + "ORG_ZSTACK_COMPUTE_VM_10035": "VM-Schnellerstellung unterstützt nur das Klonen des Root-Volumes auf demselben Primary Storage [UUID: %s] wie die ursprüngliche VM [UUID: %s].", + "ORG_ZSTACK_COMPUTE_VM_10034": "Der Vorgang ist nur bei Benutzer-VM-Instanzen zulässig.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10005": "Wenn der Cluster-Typ Baremetal ist, muss der Hypervisor-Typ ebenfalls Baremetal sein; umgekehrt muss der Cluster-Typ Baremetal sein, wenn der Hypervisor-Typ Baremetal ist.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10008": "Es befinden sich Hosts im Cluster [uuid:%s] im Status \"Pre-Maintenance\"; daher ist das Aktualisierung des Betriebssystems derzeit nicht möglich.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10009": "Nicht alle Hosts im Cluster [uuid:%s] befinden sich im Status \"Active\"; daher können die Betriebssystemrechte des Clusters derzeit nicht aktualisiert werden.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10006": "Derzeit können nur die Betriebssysteme von KVM-basierten virtuellen Maschinen aktualisiert werden.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10007": "Der Host [UUID: %s] ist kein Mitglied des Clusters [UUID: %s]. Bitte überprüfen Sie die Host-UUID und stellen Sie sicher, dass er zu diesem Cluster gehört.", + "ORG_ZSTACK_COMPUTE_VM_10044": "Ändern Sie das VM-Image nicht, wenn es sich nicht im Status \"Gestoppt\" befindet.", + "ORG_ZSTACK_COMPUTE_VM_10043": "Der Benutzer hat keine Berechtigung, das Image der VM %s zu ändern.", + "ORG_ZSTACK_COMPUTE_VM_10042": "Sauberer Traffic wird für den VM-Typ [%s] nicht unterstützt.", + "ORG_ZSTACK_COMPUTE_VM_10041": "Doppelte MAC-Adresse [%s].", + "ORG_ZSTACK_COMPUTE_CLUSTER_10000": "Der Speicherzugriff sollte nicht freigegeben werden, wenn Huge Pages im Cluster [uuid: %s] deaktiviert sind. Bitte aktivieren Sie zunächst Huge Pages mit UpdateResourceConfig [category=%s name=%s value=%s resourceUuid=%s].", + "ORG_ZSTACK_COMPUTE_VM_10040": "Der Vorgang ist nur zulässig, wenn sich die VM [%s] im Status \"Gestoppt\" befindet.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10001": "Huge Pages sollten nicht deaktiviert werden, wenn der Speicherzugriffsmodus im Cluster [uuid:%s] auf \"Shared\" gesetzt ist. Bitte aktualisieren Sie zunächst den Speicherzugriffsmodus mit UpdateResourceConfig [category=%s name=%s value=%s resourceUuid=%s].", + "ORG_ZSTACK_COMPUTE_VM_10049": "Entweder UUID oder Cloud-Account oder Authentifizierungs-Token muss angegeben werden.%s", + "ORG_ZSTACK_COMPUTE_VM_10048": "Instanz[uuid:%s] kann nicht in Bild[uuid:%s] geändert werden", + "ORG_ZSTACK_COMPUTE_VM_10047": "vm[uuid:%s] fehlt ein Standard-L3-Netzwerk, daher kann das Bild nicht geändert werden.", + "ORG_ZSTACK_COMPUTE_VM_10046": "Stellen Sie sicher, dass die letzte Host-VM [UUID:%s] ausgeführt wird und verbunden ist", + "ORG_ZSTACK_COMPUTE_VM_10045": "Stellen Sie sicher, dass die primäre Speicher-VM [UUID:%s] aktiviert und verbunden ist.", + "ORG_ZSTACK_IAM2_CONTAINER_10009": "Öffnen der Kubernetes-Konfigurationsdatei fehlgeschlagen: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10007": "Abrufen autorisierter Projekte aufgrund von leerem Inhalt fehlgeschlagen", + "ORG_ZSTACK_COMPUTE_VM_10055": "Der Parameter 'uuids' muss auf eine VmInstanceVO- oder HostVO-Entität verweisen.", + "ORG_ZSTACK_IAM2_CONTAINER_10008": "Kubernetes-Konfiguration unter Pfad nicht gefunden: %s", + "ORG_ZSTACK_COMPUTE_VM_10054": "Netzwerkkarten-ID: %s existiert nicht in der virtuellen Netzwerkkonfiguration...", + "ORG_ZSTACK_IAM2_CONTAINER_10005": "Abrufen von Bild-Tags aufgrund einer null-Seiteantwort fehlgeschlagen. Bitte überprüfen Sie den Bild-Tag-API-Endpunkt und stellen Sie sicher, dass er ordnungsgemäß konfiguriert ist.", + "ORG_ZSTACK_COMPUTE_VM_10053": "Die Netzwerkkarte unterstützt nicht die gleichzeitige Anwendung von Quality of Service (QoS)-Einstellungen mit Port-Spiegelung-Dienst.", + "ORG_ZSTACK_IAM2_CONTAINER_10006": "Abrufen von Bildern aufgrund von leerem Inhalt fehlgeschlagen.%s", + "ORG_ZSTACK_COMPUTE_VM_10052": "Ausgehende Bandbreite und eingehende Bandbreite müssen für mindestens eine Richtung angegeben werden.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10008": "Die zugeordnete Zugriffsgruppe ist bereits: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10003": "Einrichten des containerisierten Clusters für Projekt[uuid: %s] fehlgeschlagen", + "ORG_ZSTACK_COMPUTE_VM_10051": "Die Anzahl der Monitore muss einer der folgenden Werte sein: 1, 2 oder 4.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10007": "NAS-Mount-Ziel [%s] existiert bereits im Dateisystem: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10004": "Abrufen von Bild-Tags aufgrund von leerem Inhalt fehlgeschlagen.%s", + "ORG_ZSTACK_COMPUTE_VM_10050": "Richtung muss innerhalb von (in, out) festgelegt sein, war aber %s", + "ORG_ZSTACK_IAM2_CONTAINER_10001": "Aktualisierung des Kontingents für Container %s fehlgeschlagen", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10009": "Zugriffsgruppenregel [%s] existiert bereits innerhalb der Zugriffsgruppe [%s]", + "ORG_ZSTACK_IAM2_CONTAINER_10002": "Einrichten des Containers für Projekt[uuid: %s] fehlgeschlagen, da das Projekt nicht in der Datenbank gefunden wurde", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10003": "Mount-Domain nach %d Millisekunden nicht gültig, wird gelöscht...", + "ORG_ZSTACK_IAM2_CONTAINER_10000": "Aktualisierung des Kontingents von Projekt[uuid: %s] auf Container-Seite aufgrund eines unerwarteten Fehlers fehlgeschlagen", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10006": "Keine NAS-Zugriffsgruppen verfügbar; bitte erstellen Sie mindestens eine.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10005": "Kein Mount-Ziel [%s] in NAS gefunden: %s", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10000": "Kein Dateisystem [%%s] in Region gefunden: %%s", + "ORG_ZSTACK_COMPUTE_VM_10059": "Keine Kontoeinstellungen gefunden. Bitte senden Sie einen Passwortänderungsbefehl an den virtuellen Maschinen-Host!", + "ORG_ZSTACK_COMPUTE_VM_10058": "Kein Zielhost in der Datenbank gefunden; Befehl zum Ändern des Passworts kann nicht an den Host gesendet werden!", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10002": "Einige primäre Speicher [%%s] sind diesem NAS zugeordnet; bitte löschen Sie den primären Speicher vor dem Löschen.", + "ORG_ZSTACK_COMPUTE_VM_10057": "Nur Host(s) mit UUID(s): %s können auf das Datenvolume zugreifen.", + "ORG_ZSTACK_COMPUTE_VM_10056": "Ressource[UUIDs:%s] wird nicht von Konto[UUID:%s] verwaltet", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10001": "NAS-Dateisystem existiert im Rechenzentrum: %s", + "ORG_ZSTACK_COMPUTE_VM_10063": "Das bereitgestellte Kennwort erfüllt die Komplexitätsanforderungen nicht. Es muss mindestens eine Ziffer, einen Großbuchstaben, einen Kleinbuchstaben und ein Sonderzeichen enthalten.", + "ORG_ZSTACK_COMPUTE_VM_10062": "Kennwortlänge muss [%s-%s Zeichen] betragen", + "ORG_ZSTACK_COMPUTE_VM_10061": "Der Datenträger unterstützt keine Anbindung. Datenträgertyp ist %s", + "ORG_ZSTACK_COMPUTE_VM_10060": "Der Datenträger-AO-Parameter ist falsch. Sie müssen eine der folgenden Eigenschaften festlegen: Größe, Vorlagen-UUID, Datenträgerangebot-UUID oder Quell-UUID-Quelltyp. Nur eine dieser Eigenschaften sollte angegeben werden.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10010": "Zugriffsgruppe [%s] existiert bereits im Rechenzentrum [%s]", + "ORG_ZSTACK_COMPUTE_VM_10068": "Es ist kein verfügbarer Netzwerkschnittstellentyp im L3-Netzwerk [%s] vorhanden", + "ORG_ZSTACK_FAULTTOLERANCE_10015": "Eine sekundäre virtuelle Maschine kann nicht erstellt werden, da sich die primäre virtuelle Maschine in einem gestoppten Zustand befindet. Bitte starten Sie die primäre virtuelle Maschine, bevor Sie eine sekundäre erstellen.", + "ORG_ZSTACK_COMPUTE_SRIOV_10014": "SR-IOV und VFHA können nicht gleichzeitig für die Anbindung eines L3-Netzwerks an eine VM aktiviert sein. Bitte stellen Sie sicher, dass nur eine dieser Optionen konfiguriert ist.", + "ORG_ZSTACK_COMPUTE_SRIOV_10015": "Virtueller Funktions-Netzwerkadapter kann nicht auf Standardtyp geändert werden", + "ORG_ZSTACK_FAULTTOLERANCE_10013": "Eine weitere Fehlertoleranz-Speicherbereinigungsaufgabe wird gerade ausgeführt. Bitte brechen Sie die neue Aufgabe ab und warten Sie auf deren Abschluss.", + "ORG_ZSTACK_COMPUTE_SRIOV_10016": "Netzwerkschnittstelle kann nicht auf VF-Typ geändert werden. Bitte stellen Sie sicher, dass die Zielinstanz vf-Netzwerke unterstützt.", + "ORG_ZSTACK_COMPUTE_SRIOV_10017": "VM-Netzwerkschnittstelle mit UUID:%s existiert nicht", + "ORG_ZSTACK_FAULTTOLERANCE_10011": "Fehlende fehlertolerante virtuelle Maschinengruppe", + "ORG_ZSTACK_FAULTTOLERANCE_10010": "Primäre FT-VM[uuid:%s] kann nicht migriert werden", + "ORG_ZSTACK_COMPUTE_SRIOV_10019": "Nur SR-IOV unterstützt", + "ORG_ZSTACK_MONITORING_MEDIA_10001": "Verbindung zum SMTP-Server unter Host: %s, Port: %d konnte nicht hergestellt werden. Bitte überprüfen Sie die Korrektheit der smtpServer- und smtpPort-Einstellungen.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10038": "Bedingungstext kann JSON-Null- oder Array-Werte nicht unterstützen!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10037": "Nur ZStack-Vorlagenfunktionen werden im Feld 'Bedingung' unterstützt!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10036": "Wert muss booleschen Typ im Feld 'Bedingung' haben", + "ORG_ZSTACK_MONITORING_MEDIA_10000": "Das Problem könnte auf eine falsche Zugriffsschlüssel-ID oder einen falschen geheimen Zugriffsschlüssel oder unzureichende IAM-Berechtigungen für den angegebenen Benutzer zurückzuführen sein. Bitte überprüfen Sie Ihre Anmeldeinformationen und stellen Sie sicher, dass der Benutzer über die erforderlichen Berechtigungen in Ihrer Cloud-Computing-Umgebung verfügt.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10035": "Bedingungsschlüssel: %s unterstützt nur 1 Element im JSON-Objekt des Werts, aber %d Elemente wurden bereitgestellt!", + "ORG_ZSTACK_FAULTTOLERANCE_10019": "Failover konnte nicht durchgeführt werden. Die primäre VM ist unbekannt und keine Fehlertoleranz-Netzwerkadresse verfügbar. Bitte überprüfen Sie Ihre Konfiguration.", + "ORG_ZSTACK_FAULTTOLERANCE_10018": "pvm[uuid:%s] existiert nicht", + "ORG_ZSTACK_FAULTTOLERANCE_10017": "VM[uuid:%s] konnte nicht ausgefallen werden. Zugehörige fehlertolerante virtuelle Maschinengruppe existiert nicht", + "ORG_ZSTACK_COMPUTE_SRIOV_10012": "VM-NIC [uuid:%s] ist bereits vom Typ %s; keine Änderung erforderlich", + "ORG_ZSTACK_FAULTTOLERANCE_10016": "SVM-Erstellung erfolgreich, aber ein Fehler ist während der sekundären VM-Startanforderung aufgetreten. Bitte überprüfen Sie die SVM-Konfiguration und stellen Sie sicher, dass alle Voraussetzungen für den Start der sekundären VM erfüllt sind.", + "ORG_ZSTACK_COMPUTE_SRIOV_10013": "Ändern Sie den Netzwerkschnittstellentyp einer virtuellen Maschine nur, wenn sie gestoppt ist.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10009": "Zwei-Faktor-Authentifizierung fehlgeschlagen aufgrund fehlender Token im msg-System-Tag.%s", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10008": "Zwei-Faktor-Authentifizierung fehlgeschlagen, da die Nachricht keine System-Tags enthält.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10004": "Zwei-Faktor-Authentifizierung ist für Ihr Konto nicht aktiviert. Bitte aktivieren Sie sie, um fortzufahren.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10001": "Nicht unterstützter Kontotyp: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10026": "Fehlertoleranter VM-Port nicht gefunden", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10011": "Überprüfung des Zwei-Faktor-Authentifizierungscodes für virtuelle Ressource %s fehlgeschlagen. Bitte überprüfen Sie Ihren Code und versuchen Sie es erneut.", + "ORG_ZSTACK_DAHO_CORE_10003": "Daho VLL-Aufgabe erstellen fehlgeschlagen! Bitte stellen Sie sicher, dass alle Quelldateien ordnungsgemäß in der Cloud-Umgebung hochgeladen und zugänglich sind.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10010": "Zwei-Faktor-Authentifizierung fehlgeschlagen, da kein Geheimnis definiert ist für %s:%s", + "ORG_ZSTACK_FAULTTOLERANCE_10024": "Sekundäre virtuelle Maschine kann nicht gestartet werden, da sich die primäre virtuelle Maschine im gestoppten Zustand befindet. Bitte starten Sie zunächst die primäre virtuelle Maschine.", + "ORG_ZSTACK_DAHO_CORE_10004": "Kein Alibaba Cloud-Konto gefunden für accountUuid: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10022": "Es kann keine verfügbare IP aus dem aktuellen Fehlertoleranznetzwerk gefunden werden. Bitte überprüfen Sie, ob die globale Konfiguration [Kategorie: Fehlertoleranz, Name: fault.tolerance.network.cidr] korrekt festgelegt ist, und stellen Sie sicher, dass der Host [uuid:%s] eine IP-Adresse im angegebenen CIDR-Bereich besitzt.", + "ORG_ZSTACK_FAULTTOLERANCE_10021": "Bei der Cloud-Ressourcenverwaltung ist eine unerwartete Ausnahme aufgetreten. Bitte überprüfen Sie Ihre Eingabeparameter und stellen Sie sicher, dass sie innerhalb gültiger Bereiche liegen. Wenn das Problem weiterhin besteht, sollten Sie die Cloud-Computing-Umgebungskonfiguration überprüfen oder sich an den Support wenden.", + "ORG_ZSTACK_DAHO_CORE_10007": "Ablaufrichtlinie: %s ist keine gültige Konfiguration", + "ORG_ZSTACK_FAULTTOLERANCE_10020": "Failover konnte nicht durchgeführt werden. Die sekundäre VM ist unbekannt und es sind keine Fehlertoleranznetzwerkadressen verfügbar. Bitte überprüfen Sie Ihre Konfiguration.", + "ORG_ZSTACK_DAHO_CORE_10008": "vlanId[%s] existiert bereits!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10026": "Das Gewicht von CfnRootDecoder muss zwischen 0-100 liegen, wobei 0 Prioritätsdecodierung angibt und der Standardwert 50 ist.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10025": "Der Parameter-Root-Body muss ein JSON-Objekt sein!", + "ORG_ZSTACK_COMPUTE_SRIOV_10020": "%s unterstützt SRIOV nicht", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10024": "Typ ist für Parameter erforderlich, aber nicht gefunden in %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10021": "enableSRIOV-Tag wird für VM-Typ [%s] nicht unterstützt", + "ORG_ZSTACK_COMPUTE_SRIOV_10022": "Fehler beim Vorbehandeln der virtuellen Netzwerkschnittstelle vor der Migration von VM[uuid:%s] zu Host[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10028": "Zugewiesene Portnummer kleiner als angefordert für nic [uuid: %s] auf Host [uuid: %s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10023": "Fehler beim Nachbehandeln der virtuellen Netzwerkschnittstelle nach der Migration von VM[uuid:%s] zu Host[uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10029": "Mapping-Wert-Body unterstützt kein JSON-Array! Bitte stellen Sie sicher, dass der Mapping-Wert ein Skalar oder ein komplexer Typ ist, der von Ihrer Cloud-Computing-Plattform unterstützt wird.", + "ORG_ZSTACK_FAULTTOLERANCE_10027": "Fehler bei der Portzuweisung für nic[uuid: %s] auf Host[uuid: %s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10028": "Nachricht kann nicht gefunden werden: %s für das Erstellen einer Ressource", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10030": "Mapping-Wert-Body kann keine Null-Werte unterstützen! Bitte stellen Sie sicher, dass alle Mapping-Wert-Bodies initialisiert sind.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10031": "mappingName muss im CloudFormation-JSON-Ergebnis gefunden werden, sonst wird es als ungültig betrachtet.", + "ORG_ZSTACK_FAULTTOLERANCE_10037": "VM[uuid:%s] kann nicht fail-over ausgeführt werden, da sich die Fehlertoleranz-VM-Gruppe nicht in einem der folgenden Status befindet: [%s, %s]", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10005": "L2VirtualSwitchNetwork konnte nicht angehängt werden, da sich keine Hosts im Cluster[uuid:%s] befinden", + "ORG_ZSTACK_FAULTTOLERANCE_10036": "VM[UUID:%s] kann nicht fail-over durchgeführt werden, bitte bestätigen Sie, dass es sich um eine fehlertolerante VM-Gruppe handelt.", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10006": "L2 Virtual Switch Network konnte nicht angehängt werden, da die Schnittstelle[%s] auf Host[uuid:%s] erstellt werden sollte", + "ORG_ZSTACK_FAULTTOLERANCE_10035": "VM[UUID:%s] kann nicht fail-over durchgeführt werden, bitte stellen Sie sicher, dass Failover in GlobalConfig aktiviert ist.", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10007": "Layer-3-Netzwerk auf virtuellem Switch[uuid:%s] konnte nicht erstellt werden", + "ORG_ZSTACK_FAULTTOLERANCE_10034": "L3-Netzwerk [uuid:%s] konnte nicht gelöscht werden. Fehlertolerante VM [%s] befindet sich noch in den Status [%s, %s]. Bitte stoppen Sie die zugehörigen fehlertoleranten VMs, bevor Sie versuchen, das L3-Netzwerk zu löschen.", + "ORG_ZSTACK_FAULTTOLERANCE_10033": "Abbild[uuid:%s] wird noch von der fehlertoleranten VM[uuid:%s] verwendet", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10004": "Es kann kein verbundener KVM-Host für die Operation gefunden werden; es scheint, dass alle Hosts in den Clustern, die mit dem gemeinsamen Block-Group-Speicher [uuid:%s] verbunden sind, getrennt sind.", + "ORG_ZSTACK_FAULTTOLERANCE_10032": "Volume mit Index: %d von pvm[uuid:%s] und svm[uuid:%s] hat ein Cache-Volume mit unterschiedlicher Größe; Starten ist nicht erlaubt", + "ORG_ZSTACK_FAULTTOLERANCE_10031": "Volume mit Index: %d von pvm[uuid:%s] und svm[uuid:%s] haben unterschiedliche Größen; Starten ist nicht erlaubt", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10003": "L2PortGroupNetwork konnte nicht erstellt werden, da L2VirtualSwitchNetwork[uuid:%s] bereits L2PortGroupNetworks mit derselben vlanId[%s] enthält", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10002": "KVM-Host, an dem Volume[uuid%s] angehängt ist, hat die Verbindung zur gemeinsamen Block-Storage-Group[uuid:%s] verloren", + "ORG_ZSTACK_FAULTTOLERANCE_10030": "pvm[uuid:%s] und svm[uuid:%s] Volume-Anzahlen stimmen nicht überein; Starten ist nicht erlaubt.", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10004": "L2VirtualSwitchNetwork konnte nicht angehängt werden, da die Schnittstelle[%s] in Cluster[uuid:%s] bereits von einem anderen L2VirtualSwitchNetwork verwendet wird", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10001": "Volume für den Betrieb in gemeinsamer Block-Group-Primärspeicher nicht gefunden.%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10002": "Kein virtueller Router für VYOS DHCP-Dienst konfiguriert.%s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10006": "Gemeinsames Volume unterstützt Thin-Provisioning nicht", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10001": "DHCP-Einträge können nicht zur virtuellen Router-VM[UUID:%s IP:%s] hinzugefügt werden wegen %s, DHCP-Eintrag[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10039": "Aktuelle Operation[API:%s] wird nicht unterstützt, wenn FT VM[UUID:%s, state:%s] nicht in einem gestoppten Zustand ist", + "ORG_ZSTACK_FAULTTOLERANCE_10038": "Host kann nicht gewartet werden, da FT VMs[%s] sich in Wiederherstellung befinden", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10011": "vm[uuid:%s] befindet sich nicht in einem Running-, Paused- oder Stopped-Zustand, aktueller Zustand[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10048": "ft vm[uuid:%s] Plattform kann nicht aktualisiert werden, beide VMs müssen gestoppt werden und sich in einem gestoppten Zustand befinden, bevor fortgefahren wird", + "ORG_ZSTACK_FAULTTOLERANCE_10047": "Speichergröße von ft vm[uuid:%s] kann nicht aktualisiert werden, da beide VMs gestoppt werden müssen", + "ORG_ZSTACK_FAULTTOLERANCE_10046": "ft vm[uuid:%s] CPU-Anzahl kann nicht aktualisiert werden, beide VMs müssen gestoppt und neu gestartet werden", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10005": "L2-Netzwerk sollte nicht denselben Schnittstellennamen wie ein Provision-Netzwerk haben, das bereits an das Cluster angehängt ist.", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10004": "Fügen Sie keinen Host zu einem BareMetal2-Cluster hinzu.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10015": "Das Abbild mit UUID [uuid: %s] und Name [name: %s] wurde auf keinem Backup-Speicher gefunden.", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10003": "Die Architektur muss beim Erstellen neuer BareMetal2-Cluster angegeben werden.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10014": "Das Abbild [UUID: %s, name: %s] steht auf keinem Backup-Speicher zum Download zur Verfügung:", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10002": "1. Verifizieren Sie, dass das Abbild nicht in einem gelöschten Zustand ist.", + "ORG_ZSTACK_FAULTTOLERANCE_10042": "2. Stellen Sie sicher, dass der Backup-Speicher, der als Bereit für dieses Abbild markiert ist, an die Zone [UUID: %s] angehängt ist.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10013": "nicht unterstützt für Online-Merge-Snapshot von freigebarem Volume[uuid: %s] auf Sharedblock", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10001": "Lokaler Speicher kann nicht an einen Baremetal-Cluster angehängt werden. Bitte stellen Sie sicher, dass der Cluster das Anhängen von lokalem Speicher unterstützt.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10012": "Das Volume [UUID: %s] ist an eine VM [UUID: %s] angehängt, die sich im Status %s befindet; daher kann kein Snapshot-Merge durchgeführt werden.", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10000": "Drittanbieter-Ceph mit Token kann nicht an einen aarch64-Cluster angehängt werden. Bitte stellen Sie die Kompatibilität der Ceph-Version mit der Cluster-Architektur sicher.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10017": "Hosts[uuid:%s] haben eine Platten-UUID, die mit einem Shared-Block-Speicher verbunden ist, aber der tatsächliche Speicher ist unterschiedlich.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10016": "Kein verbundener Host im Cluster gefunden[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10049": "Aktuelle Operation wird auf fehlertoleranter Gruppen-VM nicht unterstützt[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_NETWORK_10004": "MAC-Adresse %s ist bereits eine Bond-Slave-Schnittstelle", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10000": "DHCP-Einträge, die vom virtuellen Router bereitgestellt werden, können nicht programmiert werden[uuid:%s, ip:%s], %s", + "ORG_ZSTACK_BAREMETAL_NETWORK_10003": "MAC-Adresse %s gehört nicht zum Gehäuse mit UUID %s", + "ORG_ZSTACK_BAREMETAL_NETWORK_10002": "Slave-Adresse %s ist ungültig. Sie sollte im Format von MAC-Adressen sein, getrennt durch Kommas, z. B. 6c:b3:11:1b:0b:1e,6c:b3:11:1b:0b:1f.", + "ORG_ZSTACK_BAREMETAL_NETWORK_10001": "Bond-Name %s existiert bereits in der virtuellen Netzwerkkonfiguration", + "ORG_ZSTACK_BAREMETAL_NETWORK_10000": "BM-Bonding-Erstellung ist nur vor der Erstellung einer BM-Instanz erlaubt.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10022": "Backup-Speicher kann nicht gefunden werden[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10058": "Gleiche MAC-Adresse nicht erlaubt [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10021": "Erwarteter Status ist %s und aktueller Status ist %s", + "ORG_ZSTACK_FAULTTOLERANCE_10057": "FT-Netzwerk ist nicht konfiguriert", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10020": "Die Operation zur Konvertierung eines Thin-Volumes zu einem Thick-Volume wird derzeit nicht unterstützt. Bitte konsultieren Sie die neueste Dokumentation für verfügbare Volume-Konvertierungsoptionen.", + "ORG_ZSTACK_FAULTTOLERANCE_10056": "Failover-VM-Erstellung fehlgeschlagen, bitte aktivieren Sie Failover-Technologie in GlobalConfig", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10001": "EIP-Gast-IP kann nicht gefunden werden: %s in VM-NIC-IPs: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10055": "FT-Sekundär-VM-Instanz kann nicht migriert werden", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10002": "EIP [uuid:%s] wurde gelöscht", + "ORG_ZSTACK_FAULTTOLERANCE_10054": "FT-Primär-VM-Instanz kann nicht migriert werden", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10025": "QEMU2 gemeinsames Volume[uuid:%s] wird nicht unterstützt", + "ORG_ZSTACK_FAULTTOLERANCE_10053": "Aktuelle Operation wird auf Sekundär-VM nicht unterstützt[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10024": "VM[uuid:%s] hat mehrere ISOs von verschiedenen primären Speichern: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10029": "Die Operation unterstützt nur vollständige VM-Instanzen. Bitte stellen Sie sicher, dass Sie eine vollständige Instanzspezifikation verwenden.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10027": "Kein verfügbarer Host für Snapshot des Volumes[uuid: %s] auf Shared-Block-Group-Primärspeicher[uuid: %s] gefunden.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10005": "Entweder Elastic-IP-UUID oder Virtual-IP-UUID muss angegeben werden", + "ORG_ZSTACK_FAULTTOLERANCE_10051": "Aktuelle Operation wird auf Dateiübertragungs-Sekundär-VM nicht unterstützt[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10006": "EIP mit UUID:%s befindet sich nicht im aktivierten Status, eine Verbindung zu einer VM-NIC ist nicht möglich", + "ORG_ZSTACK_FAULTTOLERANCE_10050": "Der aktuelle Vorgang wird auf der fehlertoleranten primären VM[uuid:%s] nicht unterstützt", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10003": "Das L3-Netzwerk [uuid:%s, name:%s] kann nicht mit der VM [uuid:%s, name:%s] verbunden werden, da das L3-Netzwerk Elastic IP (EIP) für einen der VM-NICs bereitstellt.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10004": "vmNic [UUID:%s] ist nicht mit der vmInstance verbunden und kann daher keine anfügbaren EIPs abrufen.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10009": "EIP mit UUID: %s kann nur angefügt werden, wenn sein Status %s ist, aber der aktuelle Status ist %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10007": "IP [uuid:%s] ist mit vm nic [%s] verbunden", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10008": "EIP mit UUID: %s wurde bereits an eine andere VM-NIC mit UUID: %s angefügt und kann nicht erneut angefügt werden.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10033": "Es kann kein verbundener KVM-Host für den Vorgang gefunden werden; es scheint, dass alle Hosts, die mit dem gemeinsamen Block-Speicher [uuid:%s] verbunden sind, getrennt sind.", + "ORG_ZSTACK_FAULTTOLERANCE_10069": "Cluster[uuid:%s] ist angegeben, aber deaktiviert; daher kann keine VM daraus erstellt werden.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10032": "Es können keine Hosts gefunden werden, die sowohl mit dem primären Speicher mit UUID: %s als auch mit dem primären Speicher mit UUID: %s verbunden sind.", + "ORG_ZSTACK_FAULTTOLERANCE_10068": "Zone[uuid:%s] ist angegeben, aber deaktiviert; daher kann keine VM daraus erstellt werden.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10031": "Es kann kein verfügbarer Host für die Migration von Volume[uuid: %s] auf gemeinsamen Blockgruppen-Primärspeicher[uuid: %s] und [uuid: %s] gefunden werden.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10030": "Es kann kein verfügbarer Host für die Migration von Volume[uuid: %s] zwischen gemeinsamen Blockgruppen-Primärspeicher[uuid: %s] und [uuid: %s] gefunden werden.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10037": "Snapshot %s kann nicht verkleinert werden, da virtuelle Maschine %s nicht im Zustand \"Läuft\" oder \"Gestoppt\" ist", + "ORG_ZSTACK_FAULTTOLERANCE_10065": "Dieselbe UUID kann nicht zum l3Network hinzugefügt werden, UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10035": "Snapshot %s kann nicht verkleinert werden, da Volume %s nicht bereit ist", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10038": "Null-Installationspfad in Snapshot für virtuelle Maschine %s gefunden", + "ORG_ZSTACK_ALIYUN_BACKUP_10000": "Kein Speicher-Bucket für Backup-Vorgänge gefunden. Bitte stellen Sie sicher, dass ein gültiges Bucket konfiguriert wurde.%s", + "ORG_ZSTACK_FAULTTOLERANCE_10062": "image[uuid:%s] hat das Format: %s, nur gültige Formate können zum Erstellen einer VM verwendet werden", + "ORG_ZSTACK_FAULTTOLERANCE_10061": "image[uuid:%s] hat den Medientyp: %s; nur Root-Volume-Vorlagen können zum Erstellen einer VM verwendet werden.", + "ORG_ZSTACK_TICKET_IAM2_API_10004": "Eine Reservierungsrichtlinie kann nur mit einer Flow-Sammlung verknüpft werden.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10044": "Kein verbundener Host gefunden, um Snapshot auf Primärspeicher[uuid:%s] für Volume[uuid:%s] zu ziehen", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10020": "vip[uuid:%s] befindet sich nicht im erwarteten Zustand[%s], aktueller Zustand ist %s", + "ORG_ZSTACK_SNS_PLATFORM_MICROSOFTTEAMS_10000": "Nachrichten an Microsoft Teams konnten nicht gesendet werden. Status: %s, Body: %s", + "ORG_ZSTACK_TICKET_IAM2_API_10003": "Ein Name ist erforderlich, um einen Flow in der Cloud-Computing-Umgebung zu erstellen.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10043": "Kein verbundener Host gefunden, um Snapshot auf Primärspeicher[uuid:%s] für Volume[uuid:%s] zu übernehmen", + "ORG_ZSTACK_FAULTTOLERANCE_10079": "VM[uuid:%s] kann nicht gestartet werden. Sie hat keine Netzwerkschnittstellenkarte (NIC) angefügt, bitte fügen Sie eine NIC an und versuchen Sie es erneut.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10042": "Aktiver Installationspfad %s fehlgeschlagen, weil %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10041": "Aktive Kinder-Snapshots fehlgeschlagen, weil %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10023": "vmNic UUID[%s] darf kein EIP hinzugefügt werden, da sie bereits eine Port-Weiterleitungsregel mit einem erlaubten CIDR hat.", + "ORG_ZSTACK_FAULTTOLERANCE_10077": "Der aktuelle fehlertolerante virtuelle Computer befindet sich in einem unbekannten Zustand und kann nicht gestoppt werden. Bitte versuchen Sie ein manuelles Failover durchzuführen.", + "ORG_ZSTACK_TICKET_IAM2_API_10008": "Der Name der Ressource darf nicht null sein. Bitte geben Sie einen gültigen Namen für die Ressource an.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10048": "Ungültige thin provisioning Initialisierungsgröße Tag[%s]", + "ORG_ZSTACK_TICKET_IAM2_API_10007": "Ungültiger Titel des Genehmigers %s, gültige Werte sind %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10021": "Gast-l3-Netzwerk des VM-Netzwerkadapters[uuid:%s] und VIP-l3-Netzwerk des VIP[uuid:%s] sind dasselbe Netzwerk", + "ORG_ZSTACK_TICKET_IAM2_API_10006": "Mindestens ein Flow ist erforderlich, um eine Flow-Sammlung zu erstellen.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10022": "VM-Status[%s] ist nicht berechtigt, EIP-Operationen durchzuführen. Bitte warten Sie, bis der VM-Prozess abgeschlossen ist.", + "ORG_ZSTACK_TICKET_IAM2_API_10005": "Eine Administrator- oder IAM-Rollenoperation ist als Genehmiger des letzten Workflows erforderlich.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10045": "Deaktivierung des Installationspfads fehlgeschlagen wegen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10049": "Ungültige thin provisioning Initialisierungsgröße[%s], sie muss größer oder gleich %s sein", + "ORG_ZSTACK_FAULTTOLERANCE_10073": "defaultL3NetworkUuid[uuid:%s] wurde nicht in l3NetworkUuids[%s] gefunden", + "ORG_ZSTACK_FAULTTOLERANCE_10071": "host[uuid:%s] ist angegeben, aber sein Verbindungsstatus ist %s, VM kann nicht davon erstellt werden", + "ORG_ZSTACK_FAULTTOLERANCE_10070": "host[uuid:%s] ist angegeben, aber es ist deaktiviert; daher kann keine VM davon erstellt werden.", + "ORG_ZSTACK_TICKET_IAM2_API_10009": "Genehmiger-UUID darf nicht null sein", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10051": "Ungültige thinProvisioningInitializeSize[%s] überschreitet das maximale Limit von %d", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10050": "Ungültige thinProvisioningInitializeSize[%s], es ist kein gültiger Größenwert", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10055": "Der Host mit UUID [uuid: %s] ist nicht verfügbar, um das Volume mit UUID [uuid: %s] auf dem primären Speicher der gemeinsamen Blockgruppe mit UUID [uuid: %s] zu ändern.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10054": "Kann keinen Host mit verbundenem gemeinsamen Blockspeicher finden, um den Befehl für den primären Speicher der gemeinsamen Blockgruppe[uuid:%s] auszuführen", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10053": "Kann keinen verfügbaren Host finden, um den Befehl für den primären Speicher der gemeinsachen Blockgruppe[uuid:%s] auszuführen", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10052": "Der Wert[%s] ist keine Zweierpotenz", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10012": "IP-Adresse [uuid:%s] gehört nicht zur Netzwerkschnittstelle [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10059": "Kann keinen Cluster finden, der an den primären Speicher der gemeinsamen Blockgruppe [uuid: %s] angeschlossen ist", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10058": "Der primäre Speicher des gemeinsachen Mountpunkts[uuid:%s, name:%s] kann keinen verfügbaren Host innerhalb der angeschlossenen Cluster finden, um das Volume zu instanziieren", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10013": "eip[uuid:%s] wurde nicht an die Netzwerkschnittstelle eines virtuellen Computers angeschlossen", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10010": "VM-Netzwerkschnittstelle hat keine kompatible verwendete IP für EIP mit UUID %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10057": "Volume[uuid:%s] nicht im Speicherpool gefunden", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10011": "Gast-l3Netzwerk der VM-NIC und VIP-l3Netzwerk des EIP sind dasselbe Netzwerk [uuid:%s] und [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10056": "Primärspeicher [uuid:%s] nicht gefunden", + "ORG_ZSTACK_TICKET_IAM2_API_10011": "Virtuelle ID [UUID] gehört nicht zum Projekt [UUID]", + "ORG_ZSTACK_TICKET_IAM2_API_10010": "Kann IAM-zu-Virtuelle-ID-Zuordnung [uuid:%s] nicht finden", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10017": "Die VM [UUID:%s], die mit dem EIP verknüpft ist, ist bereits mit dem öffentlichen Netzwerk [UUID:%s] verbunden, von dem das VIP [UUID:%s, Name:%s, IP:%s] stammt.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10014": "VIP IP-Version [%d] unterscheidet sich von der Gast-IP-Version [%d].", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10015": "VIP[%s] liegt innerhalb des Gast-IP-Bereichs [%s - %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10062": "Der SharedBlock-Primärspeicher [uuid:%s, name:%s] wurde keinem Compute-Cluster angehängt, oder es gibt keine verbundenen Hosts in den angehängten Clustern.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10018": "VIP [UUID:%s] wurde von einer anderen Netzwerkdienst-Entität [%s] belegt.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10019": "EIP kann nicht auf einem System-VIP erstellt werden. Bitte stellen Sie sicher, dass Sie eine öffentliche IP-Adresse für die EIP-Zuordnung verwenden.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10047": "Abrufen des Image-Hashes fehlgeschlagen, weil:%s", + "ORG_ZSTACK_SNS_PLATFORM_FEISHU_10000": "Senden von Nachrichten an FeiShu fehlgeschlagen. Status: %s, Body: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10042": "Die UUID des Image-Store-Backup-Speicher-Agenten hat sich geändert [erwartet: %s, tatsächlich: %s]. Dies ist höchstwahrscheinlich auf einen manuellen Neustart des Agenten zurückzuführen. Bitte führen Sie eine erneute Verbindung durch, um den Status zu synchronisieren.", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10000": "Abrufen der Zaku-Cluster-Informationen fehlgeschlagen, Fehler: %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10002": "Abrufen des Zaku-Clusters [id:%s] fehlgeschlagen, Fehler: %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10001": "Abrufen der Zaku-Cluster-Informationen fehlgeschlagen; Antwort-Inhalt ist null. Bitte überprüfen Sie Ihre Anfrageparameter und die Netzwerkverbindung.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10000": "Das Kontingent für die Sicherheitsgruppe kann nicht für das Projekt %s gefunden werden", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10004": "Extrahieren der Aktions-ID aus der API-Antwort fehlgeschlagen", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10003": "Abrufen des Zaku-Clusters [id:%s] fehlgeschlagen, Antwort-Inhalt ist null", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10006": "Parsen der Cloud-Antwort fehlgeschlagen: %s", + "ORG_ZSTACK_SNS_10015": "platformUuid und endpointUuid können nicht gleichzeitig angegeben werden. Bitte überprüfen Sie Ihre Eingabeparameter.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10001": "Das Kontingent für Sicherheitsgruppen darf nicht kleiner als 1 sein. Bitte passen Sie die Einstellung auf mindestens 1 an.", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10005": "Asynchrone Operation nach %d Sekunden Timeout", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10004": "Die l3Uuid im Label stimmt nicht mit der l3Uuid im Parameter überein", + "ORG_ZSTACK_SNS_10013": "Passwort darf nicht null sein", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10003": "System-Tag angefordert. Notwendig, die Standardsicherheitsgruppe für VM-NIC durch Setzen des System-Tags L3_NETWORK_SECURITY_GROUP_UUIDS_REF mit dem Format l3::{%s}::SecurityGroupUuids::{%s} anzugeben, da erzwungene Sicherheitsgruppe aktiviert ist", + "ORG_ZSTACK_SNS_10012": "Benutzername darf nicht null sein", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10006": "Da die erzwungene Sicherheitsgruppe aktiviert ist, muss die securityGroupUuid im Tag innerhalb des Projekts [%s] liegen.", + "ORG_ZSTACK_SNS_10011": "smtpPort darf nicht null sein", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10005": "Der Besitzer [UUID: %s] der Sicherheitsgruppe [UUID: %s] gehört zu einem anderen IAM2-Projekt.", + "ORG_ZSTACK_SNS_10010": "smtpServer darf nicht null sein", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10008": "Die Standardsicherheitsgruppe %s kann nicht gelöscht werden, wenn die erzwungene Sicherheitsgruppenfunktion aktiviert ist.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10007": "NICs, die an das l3Network [uuid:%s] angehängt sind, sind mit der Sicherheitsgruppe verknüpft. Vor dem Trennen des l3Network von der Sicherheitsgruppe müssen Sie die NICs trennen.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10039": "Eine kommerzielle Lizenz ist erforderlich, um den ImageStore-Dienst in unserer Cloud-Umgebung zu nutzen.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10009": "Diese Sicherheitsgruppe %s ist mit einer virtuellen Maschine verknüpft. Bitte heben Sie die Verknüpfung auf, bevor Sie fortfahren.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10035": "Der Image-Speicher [%s] kann kein Image hinzufügen, da er für das Backup-Remote verwendet wird", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10032": "Der Backup-Speicher [UUID:%s] verfügt nicht über genügend Kapazität [%s], um das Image der virtuellen Maschine zu exportieren", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10002": "Virtueller Router [Name: %s, UUID: %s] konnte snat%s nicht synchronisieren wegen %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10031": "Image [%s] wurde auf dem Backup-Speicher [%s] nicht gefunden", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10001": "Gast-l3Netzwerk [UUID:%s, Name:%s] erfordert SNAT-Dienst vom virtuellen Router, aber das öffentliche l3Netzwerk [UUID:%s], das mit dem virtuellen Router-Angebot [UUID: %s, Name:%s] verknüpft ist, ist identisch mit dem Gast-l3Netzwerk.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10020": "Benachrichtigung von Sugon SDN über virtuellen Router für VM [UUID:%s] auf Ziel-Host [UUID:%s] ist fehlgeschlagen. Fehler: %s", + "ORG_ZSTACK_SNS_10029": "Cloud-Ressourcen-Identifier [%s] existiert bereits", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10011": "Konto [%s] ist nicht berechtigt, Operationen auf der Standardsicherheitsgruppe durchzuführen", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10010": "Konto [%s] kann keine Operationen auf der Standardsicherheitsgruppe [%s] durchführen", + "ORG_ZSTACK_SNS_10026": "E-Mail-Adresse kann nicht auf %s aktualisiert werden, da sie bereits im Endpunkt [UUID:%s] existiert", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10012": "Die Netzwerkschnittstelle der VM [UUID: %s] kann nur Teil einer Sicherheitsgruppe sein; daher kann sie nicht aus der aktuellen Sicherheitsgruppe [UUID: %s] entfernt werden.", + "ORG_ZSTACK_SNS_10024": "Dieselbe E-Mail-Adresse kann nicht zum Endpunkt [UUID:%s] hinzugefügt werden", + "ORG_ZSTACK_SNS_10023": "Plugin [%s] kann nicht gefunden werden", + "ORG_ZSTACK_SNS_10022": "SNMP-Plattform mit derselben Adresse [%s:%s] kann nicht erstellt werden", + "ORG_ZSTACK_SNS_10021": "Verbindung kann aufgrund von null-Parametern nicht hergestellt werden. Bitte stellen Sie sicher, dass alle erforderlichen Parameter ordnungsgemäß konfiguriert sind.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10029": "Remote-Zieltyp nicht implementiert: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10028": "Exportierte Images konnten nicht verpackt werden wegen %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10027": "Einige Images [%s] wurden nicht auf den Backup-Speicher [UUID: %s] exportiert", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10026": "Löschen des Image-Pakets fehlgeschlagen wegen: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10022": "Festlegen der maximalen Kapazität auf dem Image-Speicher [UUID:%s] fehlgeschlagen", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10021": "Festlegen der maximalen Kapazität auf dem Image-Speicher [UUID:%s] fehlgeschlagen, weil: %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10019": "Benachrichtigung von Sugon SDN über virtuellen Router für VM [UUID:%s] auf Ziel-Host [UUID:%s] fehlgeschlagen", + "ORG_ZSTACK_SNS_10038": "SNS-E-Mail-Endpunkt kann ohne Angabe von Empfänger-E-Mail-Adressen nicht erstellt werden.", + "ORG_ZSTACK_SNS_10037": "Benutzername und Passwort müssen entweder beide fehlen oder zusammen angegeben werden", + "ORG_ZSTACK_SNS_10036": "Ungültige Telefonnummer [%s], bitte stellen Sie sicher, dass sie als +86-12388889999 formatiert ist", + "ORG_ZSTACK_SNS_10035": "[%s] ist keine gültige IP-Adresse", + "ORG_ZSTACK_SNS_10034": "Ungültiger Cloud-Speicherpfad [%s]", + "ORG_ZSTACK_SNS_10031": "Telefonnummer [%s] existiert nicht", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10018": "Keine Antwort von der Cloud-Instanz oder virtuellen Maschine. Bitte überprüfen Sie den Instanzstatus und die Netzwerkkonfiguration.", + "ORG_ZSTACK_SNS_10030": "Die Telefonnummernliste der virtuellen Maschine ist leer. Bitte prüfen Sie, ob die erforderlichen Telefonnummern bereitgestellt sind.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10016": "Bild konnte nicht vom Backup-Speicher mit UUID: %s abgerufen werden, Grund: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10015": "Fehlende Zertifikatsdatei zum Herunterladen des Bildes: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10013": "Verbindung zu SimpleHttpBackupStorage[url:%s] konnte nicht hergestellt werden, aufgrund: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10010": "Empfang der Aufgabenantwort fehlgeschlagen! Bitte überprüfen Sie Ihre Instanzkonfiguration und Netzwerkeinstellungen.", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_10000": "Die Erstellung basiert auf Image-Cache[uuid:%s, Standort-URLs: [%s]], kann nicht von anderen Standorten erstellt werden.", + "ORG_ZSTACK_SNS_10045": "Der Vorgang ist für die systemebene virtuelle Maschinenplattform nicht gestattet. Bitte stellen Sie sicher, dass Sie Ressourcen im Benutzerbereich ändern.", + "ORG_ZSTACK_SNS_10044": "Universelle SMS kann ohne Angabe einer Telefonnummer nicht validiert werden.", + "ORG_ZSTACK_SNS_10043": "userId [%s] existiert bereits in der Cloud-Umgebung", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10008": "Fehler beim Bereinigen der Bild-Metadaten auf dem Primärspeicher %s, Fehler: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10007": "Synchronisierungsstatus fehlgeschlagen aufgrund einer fehlenden Quelldatei. Bitte stellen Sie sicher, dass alle erforderlichen Dateien vorhanden sind, und versuchen Sie die Synchronisierung erneut.", + "ORG_ZSTACK_SNS_10041": "Cloud-Telefonnummer[%s] existiert bereits", + "ORG_ZSTACK_SNS_10040": "Ungültige E-Mail-Adresse[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10005": "Kein verbundener Host im Cluster gefunden, an den der Primärspeicher [uuid: %s] angeschlossen ist", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10004": "Backup-Speicher mit UUIDs: %s konnte aufgrund eines Fehlers nicht übernommen werden: %s", + "ORG_ZSTACK_MONITORING_10004": "Typ für die Ressource kann nicht gefunden werden[uuid:%s]", + "ORG_ZSTACK_MONITORING_10005": "Keine Überwachungsmetrik für resourceType[%s] und item[%s] gefunden", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10002": "Backup-Speicher mit UUIDs: %s konnte nicht zugewiesen werden aufgrund von Ressourcenbeschränkungen oder ungültigen UUIDs: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10000": "Fehler beim Analysieren der Erstellungszeit: %s", + "ORG_ZSTACK_MONITORING_10000": "Monitor-Trigger kann nicht gefunden werden[uuid:%s], er wurde möglicherweise gelöscht oder deaktiviert", + "ORG_ZSTACK_MONITORING_10001": "Monitor-Trigger-Aktion kann nicht gefunden werden[uuid:%s], sie wurde möglicherweise gelöscht oder widerrufen", + "ORG_ZSTACK_MONITORING_10002": "Die Ressource[type:%s] verfügt über keine Überwachungsmetriken", + "ORG_ZSTACK_MONITORING_10003": "Die Ressource mit UUID [%s] gehört nicht zum Konto mit UUID [%s].", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10002": "Instance[%s] ist keiner Gruppe zugeordnet", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10001": "Die Instance[%s] ist bereits der Gruppe zugewiesen", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10003": "Die Überwachungsgruppe [%s] ist keiner Überwachungsvorlage zugeordnet.", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10006": "Das Instanzlimit für die Gruppe wurde erreicht. Bitte beenden Sie eine vorhandene Instanz oder kontaktieren Sie den Support, um das Limit zu erhöhen.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10001": "Ausgabetext unterstützt keine JSON-Nullwerte! Bitte stellen Sie sicher, dass alle Felder korrekt definiert und nicht null sind.", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10005": "Die Vorlagenregel hat ihr maximales Limit von %d Einträgen erreicht. Erwägen Sie eine Skalierung Ihrer Vorlage oder kontaktieren Sie den Support für Unterstützung.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10000": "Nur Cloud-native Dienste sind in Outputs zulässig, aber %s gefunden", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10016": "Resource-Typ muss ein String sein!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10014": "Der Mappings-Stammkörper muss ein JSON-Objekt sein!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10018": "Die Resource-Stammmetadaten müssen ein JSON-Objekt sein!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10023": "Der Parameters-Körper kann keine Nullwerte unterstützen!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10022": "Parametername nicht unterstützt: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10020": "paramName muss in den CloudFormation-JSON-Vorlagenergebnissen gefunden werden, andernfalls wird es als ungültig betrachtet.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10001": "Entity ist leer, TableName kann nicht bestimmt werden", + "ORG_ZSTACK_FAULTTOLERANCE_10004": "Port-Zuweisung auf Host fehlgeschlagen[uuid: %s]", + "ORG_ZSTACK_ZQL_AST_VISITORS_10000": "Join-Bedingung fehlt für Tabelle %s in Ihrer Abfrage. Bitte stellen Sie sicher, dass Sie die Join-Bedingung korrekt angegeben haben.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10003": "Die Feldliste ist leer; daher können wir den Spaltennamen nicht abrufen. Bitte stellen Sie sicher, dass Ihre Feldliste die erforderlichen Daten enthält.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10002": "Entity ist leer, columnName kann nicht abgerufen werden", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10005": "Mapping-Körper unterstützt keine Nicht-Map-Werte!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10004": "[%s] ist in CloudFormation-Ausgaben ungültig!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10003": "Beschreibung in Ausgaben muss vom Typ String sein!", + "ORG_ZSTACK_FAULTTOLERANCE_10009": "Sekundäre VM kann nicht migriert werden[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10008": "Sekundäre virtuelle Maschine kann nicht gestartet werden, da sich die primäre virtuelle Maschine noch im gestoppten Zustand befindet. Bitte stellen Sie sicher, dass die primäre VM ausgeführt wird, bevor Sie versuchen, die sekundäre VM zu starten.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10009": "Der Resource-Wert-Körper kann keine Nullwerte unterstützen! Bitte stellen Sie sicher, dass alle Resource-Parameter vor der Bereitstellung korrekt initialisiert sind.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10004": "Die angegebene Funktion darf nicht null sein. Bitte stellen Sie sicher, dass die Funktion vor der Verwendung korrekt initialisiert ist.", + "ORG_ZSTACK_FAULTTOLERANCE_10007": "Host-UUID der primären VM konnte nicht abgerufen werden[uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10008": "Resource %s kann nicht von sich selbst abhängen, bitte überprüfen Sie die Selbstreferenz in Resource [%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10005": "Zugewiesene Port-Anzahl geringer als angefordert auf Host[uuid: %s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10006": "Mapping-Körper unterstützt keine Nullwerte! Bitte stellen Sie sicher, dass alle JSON-Felder korrekt definiert und nicht null sind.", + "ORG_ZSTACK_SNS_10009": "UUID [%%s] existiert bereits in der Cloud-Umgebung.", + "ORG_ZSTACK_SNS_10007": "SNS-Anwendungsendpunkt mit UUID: %s kann nicht gefunden werden, er wurde möglicherweise gelöscht", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10012": "Nicht unterstützter Schlüssel [%s] in Resource-Mapping [%s]", + "ORG_ZSTACK_SNS_10006": "SNSApplicationPlatform kann nicht gefunden werden[uuid:%s], sie wurde möglicherweise beendet", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10011": "resourceName muss in der Vorlagenausgabe gefunden werden, andernfalls ist es ein ungültiges CloudFormation-JSON.", + "ORG_ZSTACK_SNS_10005": "Der angegebene Endpunkttyp %s kann nicht gefunden werden. Bitte stellen Sie sicher, dass ein gültiger Endpunkttyp angegeben wird.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10010": "Nicht unterstützte Resource-Schlüssel: %s", + "ORG_ZSTACK_SNS_10003": "SNS-Thema mit UUID:%s kann nicht gefunden werden, es wurde möglicherweise gelöscht", + "ORG_ZSTACK_SNS_10002": "Der Anwendungsendpunkt ist deaktiviert. Bitte überprüfen Sie Ihre Konfigurationseinstellungen oder kontaktieren Sie den Support für Unterstützung.", + "ORG_ZSTACK_SNS_10001": "Die Anwendungsplattform ist deaktiviert. Bitte kontaktieren Sie Ihren Administrator, um sie zu aktivieren, oder lesen Sie die Dokumentation für verfügbare Alternativen.", + "ORG_ZSTACK_SNS_10000": "Das Thema %s wird von keinen abonnierten Endpunkten konsumiert.", + "ORG_ZSTACK_CLOUDFORMATION_10002": "Ungültige ZStack-Vorlagenformatversion: [%s, erwartete Version ist %s]", + "ORG_ZSTACK_CLOUDFORMATION_10001": "Die Vorlage muss den ZStackTemplateFormatVersion-Marker enthalten.", + "ORG_ZSTACK_CLOUDFORMATION_10000": "Null-Element im Vorlageninhalt abgerufen. Vorlageninhalt kann sich auf eine Cloud-Ressource oder eine virtuelle Maschinenkonfiguration beziehen. Bitte stellen Sie sicher, dass alle Elemente ordnungsgemäß definiert und initialisiert sind.", + "ORG_ZSTACK_CLOUDFORMATION_10009": "Vorlage [%s] ist in der Virtualisierungsumgebung deaktiviert", + "ORG_ZSTACK_CLOUDFORMATION_10008": "ResourceStackVO [%s] wurde bereits gelöscht!", + "ORG_ZSTACK_CLOUDFORMATION_10007": "ResourceStackVO: [%s] wurde beendet...", + "ORG_ZSTACK_CLOUDFORMATION_10005": "Keine Stack-UUID für die VM-Instanz[%s] gefunden", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10035": "Fehler beim Reservieren der Host-Kapazität für alle Kandidaten-Hosts. Bitte überprüfen Sie die Verfügbarkeit der Ziel-Hosts und stellen Sie sicher, dass sie ausreichend Ressourcen haben, um die Reservierungsanforderungen zu erfüllen.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10034": "[Host-Zuweisung]: %s auf Host[uuid:%s]. Versuche Zuweisung zum nächsten Host. %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10037": "Nach der Filterung gibt HostAllocatorFilterExtensionPoint[%s] null Kandidaten-Hosts zurück, Bedeutung: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10036": "Kein Host mit den angegebenen Kriterien gefunden", + "ORG_ZSTACK_CLOUDFORMATION_10025": "Erwarteter Status %s!", + "ORG_ZSTACK_EXPON_10002": "Exponentieller Anfragefehler, Code %s, Nachricht: %s.", + "ORG_ZSTACK_EXPON_10003": "Volume [name:%s] nach dem Kopieren des Snapshots nicht gefunden", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10000": "Virtueller Router[name: %s, uuid: %s] konnte DNS%s nicht konfigurieren, %s", + "ORG_ZSTACK_CLOUDFORMATION_10022": "Neustart des Resource-Stacks unterstützt nur %s-Status!", + "ORG_ZSTACK_CLOUDFORMATION_10021": "Resource-Stack mit UUID [%s] nicht gefunden", + "ORG_ZSTACK_CLOUDFORMATION_10020": "Standard-IP-Adresse auf virtueller Maschine[%s] nicht gefunden", + "ORG_ZSTACK_CLOUDFORMATION_10028": "templateContent und url dürfen nicht beide leer oder beide gesetzt sein!", + "ORG_ZSTACK_CLOUDFORMATION_10026": "templateContent und templateUuid dürfen nicht beide leer sein!", + "ORG_ZSTACK_HYBRID_ACCOUNT_10000": "keyType nicht unterstützter Typ [%s]", + "ORG_ZSTACK_HYBRID_ACCOUNT_10002": "Schlüssel: [%s] mit Typ: [%s] existiert bereits für Konto-UUID: [%s]", + "ORG_ZSTACK_HYBRID_ACCOUNT_10003": "Parameter [accountUuid] können nur von administrativen Benutzern verwendet werden!", + "ORG_ZSTACK_HYBRID_ACCOUNT_10004": "Schlüssel: [%s] existiert bereits für Konto-UUID: [%s]", + "ORG_ZSTACK_CLOUDFORMATION_10014": "Inhalt muss durch Vorlageninhalt oder URL gesetzt werden!", + "ORG_ZSTACK_CLOUDFORMATION_10013": "Systemvorlage kann nicht gelöscht oder aktualisiert werden: %s", + "ORG_ZSTACK_CLOUDFORMATION_10012": "StackTemplateVO wurde aus dem Cloud-Vorlagenrepository gelöscht. Bitte überprüfen Sie die Vorlage und laden Sie sie erneut hoch.", + "ORG_ZSTACK_CLOUDFORMATION_10011": "Kann keine Parameter für %s finden, welcher vom Typ %s ist, bitte überprüfen Sie die Parameter", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10002": "Hardware-VXLAN-Pool konnte nicht angehängt werden wegen: %s", + "ORG_ZSTACK_CLOUDFORMATION_10010": "templateContent muss angegeben werden!", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10003": "L2-Hardware-VXLAN-Netzwerk konnte nicht ohne VLAN-ID erstellt werden", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10000": "Level-2-Netzwerk konnte nicht an Cluster angehängt werden, weil Host[uuid:%s] keine virtuelle Schnittstelle[name:%s] hat", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10001": "Hardware-VXLAN-Pool konnte nicht angehängt werden, weil Switch-Port für Host[uuid:%s] nicht gefunden werden kann", + "ORG_ZSTACK_CLOUDFORMATION_10019": "l2-Bridge-Name von l2[%s] kann nicht aus systemTag gefunden werden", + "ORG_ZSTACK_CLOUDFORMATION_10018": "Der Parameter filterName muss auf cloudformation:true oder cloudformation:false gesetzt werden.", + "ORG_ZSTACK_CLOUDFORMATION_10017": "StackTemplateVO: [%s] wurde aus dem Cloud-Repository gelöscht...", + "ORG_ZSTACK_CLOUDFORMATION_10016": "Ungültige CloudFormation-Template-Version: %s", + "ORG_ZSTACK_CLOUDFORMATION_10015": "Abrufen von Inhaltseingaben für Cloud-Ressourcen fehlgeschlagen. Stellen Sie sicher, dass Quelldateien korrekt hochgeladen und konfiguriert sind.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10006": "Huawei iMaster SDN VXLAN-Netzwerk konnte nicht ohne VPC-ID erstellt werden", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10007": "VNI-Bereich konnte nicht hinzugefügt werden, weil der angegebene VNI-Bereich [%d-%d] ungültig ist", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10004": "Huawei iMaster SDN VXLAN-Netzwerk konnte nicht erstellt werden, weil VLAN-ID [%s] außerhalb des gültigen Bereichs liegt: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10005": "Huawei iMaster SDN VXLAN-Netzwerk konnte ohne vpcId und tenantId nicht erstellt werden", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10009": "Huawei iMaster SDN Controller konnte ohne Angabe eines VLAN-Bereichs nicht zum Netzwerk hinzugefügt werden", + "ORG_ZSTACK_NETWORK_L2_10013": "VLAN für L2-Netzwerk [UUID:%s] kann nicht geändert werden, da es noch Hosts im Verbindungsaufbau- oder getrennten Zustand hat", + "ORG_ZSTACK_NETWORK_L2_10012": "Nicht unterstützter virtueller Switch-Typ[%s]", + "ORG_ZSTACK_NETWORK_L2_10015": "VLAN für l2Network[uuid:%s] kann nicht geändert werden, da dieses Netzwerk isoliert ist", + "ORG_ZSTACK_NETWORK_L2_10014": "VLAN für l2Network[uuid:%s] kann nicht geändert werden, da es ausschließlich auf einen KVM-Cluster beschränkt ist", + "ORG_ZSTACK_NETWORK_L2_10017": "vlan[%s] ist für Cloud-Netzwerkkonfiguration ungültig", + "ORG_ZSTACK_NETWORK_L2_10016": "vlan ist erforderlich für ChangeL2NetworkVlanId mit Typ[%s]", + "ORG_ZSTACK_NETWORK_L2_10019": "vLAN ist nicht erlaubt für ChangeL2NetworkVlanId mit Typ[%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10000": "Kein Kandidat-Host hat Version[%s] für Bereitstellung verfügbar", + "ORG_ZSTACK_NETWORK_L2_10018": "Es wurde ein L2-Netzwerk an den Cluster mit virtueller Netzwerk-ID [%s] und physischer Schnittstelle [%s] angehängt. Änderung des L2-Netzwerks [uuid: %s] fehlgeschlagen.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10083": "Vorhandene SimpleHttpBackupStorage mit Hostname[%s] erkannt", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10082": "Ungültige URL[%s], die URL muss ein absoluter Pfad sein, der mit '/' beginnt", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10080": "Dateipfad enthält ungültiges Zeichen: %s", + "ORG_ZSTACK_NETWORK_L2_10020": "Ändern von l2Network [uuid:%s], das an Cluster mit physischer Schnittstelle [%s] angehängt ist, fehlgeschlagen.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10079": "Die URL enthält einen ungültigen Pfad [/dev oder /proc oder /sys], der in Cloud-Computing-Umgebungen nicht unterstützt wird. Bitte verwenden Sie einen gültigen Pfad für Ihre Anfrage.", + "ORG_ZSTACK_CLOUDFORMATION_10034": "templateContent und UUID dürfen nicht beide leer sein oder beide gesetzt sein!", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10078": "Absoluter Pfad zur Quelldatei erforderlich: %s", + "ORG_ZSTACK_NETWORK_L2_10006": "Es existiert ein L2-Netzwerk mit UUID: %s und Name: %s, das an den Cluster mit UUID: %s angeschlossen ist, der einer physischen Schnittstelle [%s] zugeordnet ist. Fehler beim Anschließen des L2-Netzwerks mit UUID: %s.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10077": "Ein Quelldateipfad ist erforderlich, um mit der Codeüberprüfung oder Bearbeitung fortzufahren. Bitte geben Sie den Dateipfad an.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10076": "Doppelter Backup-Speicher. Es existiert bereits ein Image-Store-Backup-Speicher [hostname:%s]", + "ORG_ZSTACK_NETWORK_L2_10008": "l2Network [UUID: %s] ist mit Cluster [UUID: %s] verbunden und kann nicht neu zugeordnet werden.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10075": "hostname[%s] ist kein gültiger DNS-Name oder IP-Adresse", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10011": "DiskOfferingTagAllocatorExtensionPoint[%s] hat null Kandidaten-Hosts zurückgegeben", + "ORG_ZSTACK_CLOUDFORMATION_10030": "Nur Administratoren haben das Recht, System-StackTemplate zu aktivieren oder zu deaktivieren", + "ORG_ZSTACK_NETWORK_L2_10007": "Es existiert ein L2-VLAN-Netzwerk [uuid:%s, name:%s], das an den Cluster [uuid:%s] angeschlossen ist, der eine physische Schnittstelle [%s] und VLAN [%s] aufweist. Fehler beim Anschließen des L2-VLAN-Netzwerks [uuid:%s].", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10010": "InstanceOfferingTagAllocatorExtensionPoint[%s] hat null Kandidaten-Hosts zurückgegeben", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10073": "src Backup-Speicher enthält kein Image[%s]", + "ORG_ZSTACK_NETWORK_L2_10009": "L2-Netzwerk konnte nicht angeschlossen werden, da ein anderes Netzwerk mit einem anderen vSwitch-Typ auf der physischen Schnittstelle %s existiert", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10072": "Quellspeicher[%s] enthält kein Image[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10071": "Ziel-Backup-Speicher [uuid:%s] enthält bereits das Image [uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10070": "Löschen der Image-Metadatendatei fehlgeschlagen: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10009": "Der Backup-Speicher [UUID: %s, Typ: %s] erfordert einen gebundenen Primärspeicher, jedoch wurde noch kein Primärspeicher hinzugefügt.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10001": "Das Image mit UUID [uuid:%s] und Name [name:%s] wurde aus allen Backup-Speichern gelöscht.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10004": "Ressourcenbindung unterstützt Typ %s noch nicht", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10003": "Kein Host in Zonen[uuids:%s] gefunden, der an den Backup-Speicher angeschlossen ist, auf dem sich das Image[%s] befindet.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10005": "Kein verfügbarer Host mit gebundener Ressource %s gefunden", + "ORG_ZSTACK_NETWORK_L2_10011": "Nicht unterstützter l2Network-Typ[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10003": "Virtueller Router[uuid:%s, ip:%s] konnte DNS%s für L3-Netzwerk[uuid:%s, name:%s] nicht konfigurieren, %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10008": "Das Image[uuid:%s] befindet sich auf einem Backup-Speicher[uuid:%s, typ:%s], der eine Interaktion mit dem Primärspeicher[uuid:%s] erfordert; es wurde jedoch kein geeigneter Host gefunden, um diese Interaktion zu ermöglichen.", + "ORG_ZSTACK_NETWORK_L2_10010": "l2Network[uuid:%s] wurde nicht an Cluster[uuid:%s] angeschlossen", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10007": "Das Image[uuid:%s, name:%s] ist auf einem Backup-Speicher[uuid:%s, typ:%s] gespeichert, der Primärspeicher der Typen %s erfordert; es wurde jedoch kein Host mit kompatiblem Primärspeicher gefunden.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10068": "Überprüfung der Image-Metadatendatei: %s fehlgeschlagen", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10066": "Erstellen der Image-Metadatendatei: %s fehlgeschlagen", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10065": "Erstellen der Image-Metadatensynchronisation fehlgeschlagen: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10022": "Stammvolume der Instanz[uuid:%s] kann nicht gefunden werden", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10021": "Kein Host mit verfügbarem CPU[%s], Speicher[%s Bytes] gefunden", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10000": "EIP konnte nicht angehängt werden, da kein Gateway für Netzwerkschnittstelle [uuid:%s] existiert", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10062": "AddImage ist in Disaster Recovery BS verboten: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10001": "L2Network, auf der das VIP-L3Network basiert, wurde nicht an den Cluster angehängt, in dem sich vmNic[uuid:%s] befindet", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10002": "Es können nicht mehr als 1 EIP an eine VM NIC mit UUID:%s vom Typ flat gebunden werden", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10060": "Fehlender Bildpfad für Instanz[%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10015": "Es kann kein verfügbarer Primärspeicher gefunden werden [Status: %s, Zustand: %s, verfügbare Kapazität %d Bytes]. Bitte überprüfen Sie den Status und Zustand des Primärspeichers und stellen Sie sicher, dass er an einen Cluster angehängt ist", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10014": "Kein Host in Clustern gefunden, die an Primärspeicher %s angehängt wurden", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10016": "Es kann kein verfügbarer Primärspeicher gefunden werden [Status: %s oder %s, Zustand: %s]. Bitte überprüfen Sie den Status und Zustand des Primärspeichers und stellen Sie sicher, dass er an einen Cluster angehängt ist", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10031": "Keine aktivierten Hosts in den [%s] Kandidaten-Hosts mit dem Hypervisor-Typ [%s] gefunden", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10030": "Keine aktivierten Hosts in der [%s] Kandidaten-Hostliste gefunden", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10033": "Kein Host mit Status=Enabled und Zustand=Connected gefunden", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10032": "Kein Host mit Status=Enabled, Zustand=Connected, HypervisorTyp=%s gefunden", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10012": "Kein solches Objekt %s in Bucket %s gefunden", + "ORG_ZSTACK_UTILS_10000": "Generieren des Zugriffsgeheimnisses für virtuelle Maschine Instanz %s fehlgeschlagen", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10024": "Entweder Volume UUID oder Volume-Snapshot UUID muss angegeben werden", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10023": "Kein Host in Clustern gefunden, die an alle Primärspeicher %s angehängt wurden, in denen sich die Volumes von VM[UUID:%s] befinden", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10026": "Nach dem Ausschließen der vermiedenen Hosts sind keine Kandidaten mehr im Pool vorhanden", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10025": "zoneUuids, clusterUuids und hostUuids müssen jeweils mindestens eine nicht-leere Liste enthalten, oder alle Werte müssen auf true gesetzt sein", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10015": "Aliyun EBS Backup Storage unterstützt das Berechnen von Image-Hashes nicht", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10027": "Kein Host in Clustern gefunden, die an L2Networks angehängt wurden, die mit L3Networks %s assoziiert sind", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10029": "Keine verbundenen Hosts in den [%s] Kandidaten-Hosts gefunden", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10005": "Wählen Sie eine Lastverteilungsstrategie, Sie müssen den Algorithmus-Typ festlegen", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10008": "Kein Host mit weniger als %s virtuellen Maschinen gefunden", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10022": "Das Konto [UUID:%s] hat keinen Zugriff auf die Ressource [UUID:%s, type:L3NetworkVO]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10024": "DHCP-Server-IP zu [%s] ändern, aber [%s] empfangen", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10025": "L3 Network UUID darf nicht null sein", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10003": "Falsche Cloud-Provider-Einstellungen, gültiger Wert ist %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10021": "Die Sitzungs-/Konto-UUID ist ungültig. Bitte überprüfen und erneut versuchen", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10000": "Der Ocean-Endpunkt-URL muss für Alibaba Cloud EBS-Backup-Speicher konfiguriert werden", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10017": "Die EIP-Operation kann für die VM[uuid:%s, status:%s] nicht angewendet werden, da die hostUUID nicht gefunden werden kann", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10009": "Aliyun EBS Backup Storage unterstützt das Abbrechen des Bilddownload-Prozesses nicht.", + "ORG_ZSTACK_CORE_TIMEOUT_10000": "Der API-Timeout kann nicht kleiner als %s Millisekunden gesetzt werden", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10002": "OSS-Bucket [%s] kann nicht gelöscht werden, da es noch Aliyun EBS Backup Storage-Instanzen enthält. Bitte stellen Sie sicher, dass alle zugehörigen Backup-Storage-Instanzen zuerst gelöscht werden.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10004": "Der aktuelle Primärspeicher unterstützt den angegebenen Protokolltyp nicht. Bitte stellen Sie sicher, dass das Protokoll zuerst zum Speicher hinzugefügt wird.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10003": "Der [protocol]-Parameter ist null. Für Primärspeicher vom Typ [%s] muss ein Block-Volume-Protokoll angegeben werden.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10000": "Cloud-Ressourcenpfadfehler: Bitte überprüfen Sie den Speicherort und die Existenz der Datei.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10002": "name: [%s] existiert bereits. Block-Volume-Namen müssen innerhalb des Primärspeichertyps [%s] eindeutig sein.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10010": "DHCPv6-Server-IP für Layer-3-Netzwerk [uuid:%s] konnte nicht abgerufen werden", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10009": "DHCPv4-Server-IP für Layer-3-Netzwerk [uuid:%s] konnte nicht abgerufen werden", + "ORG_ZSTACK_POLICYROUTE_10029": "System-Policy-Routing-Tabelle kann nicht gelöscht werden", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10005": "host[uuid:%s] ist nicht bereitgestellt", + "ORG_ZSTACK_POLICYROUTE_10027": "Systemdefinierte Policy-Route-Sammlung kann nicht gelöscht werden. Bitte stellen Sie sicher, dass diese Route-Sammlung nicht von aktiven Ressourcen verwendet wird, bevor Sie versuchen, sie zu löschen.", + "ORG_ZSTACK_POLICYROUTE_10028": "Zugehörige Virtual-Router-Instanz kann nicht gefunden werden. Bitte stellen Sie sicher, dass der Virtual Router korrekt konfiguriert und verfügbar ist.", + "ORG_ZSTACK_POLICYROUTE_10025": "ruleSet[%s] ist noch mit der Netzwerkschnittstellenkarte (NIC) verbunden", + "ORG_ZSTACK_POLICYROUTE_10020": "VRouter[%s] hat bereits eine Policy-basierte Routing-Tabelle [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10044": "DHCP-Server-IP kann nur geändert werden, wenn flaches DHCP aktiviert ist.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10045": "DHCP-Server-IP konnte nicht geändert werden, da %s nicht der Besitzer des Layer-3-Netzwerks [uuid:%s] ist", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10046": "DHCPv4-Server-IP konnte nicht geändert werden, da kein IPv4-Adressbereich konfiguriert ist.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10047": "DHCP-v4-Server-IP konnte nicht gesetzt werden, da die bereitgestellte IP [%s] kein gültiger CIDR für das L3-Netzwerk [%s] ist", + "ORG_ZSTACK_IDENTITY_RBAC_10011": "Operation[API:%s] wird aus Sicherheitsgründen standardmäßig verweigert. Bitte wenden Sie sich an Ihren Administrator, um dies zu lösen.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10041": "DHCPv6-Server-IP konnte nicht gesetzt werden, da kein IPv6-Bereich konfiguriert ist.", + "ORG_ZSTACK_IDENTITY_RBAC_10012": "Die Operation wird durch die Policy verweigert [name: %s uuid: %s]", + "ORG_ZSTACK_IDENTITY_RBAC_10013": "Die Operation wird durch die Policy[name:%s, uuid:%s] verweigert. Das Feld [%s] darf nicht geändert werden", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10037": "IP-Adresse konnte nicht gelöscht werden, da IP [%s] eine DHCP-Server-IP-Adresse ist", + "ORG_ZSTACK_POLICYROUTE_10018": "System-Policy-Route-Sammlung kann nicht aktualisiert werden. Bitte stellen Sie sicher, dass Sie über die erforderlichen Berechtigungen verfügen und versuchen Sie es erneut.", + "ORG_ZSTACK_POLICYROUTE_10019": "System-Policy-basierte Routing-Tabelle kann nicht aktualisiert werden. Bitte stellen Sie sicher, dass Sie über die erforderlichen Berechtigungen verfügen und versuchen Sie es erneut.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10039": "DHCPv4-Server-IP konnte nicht gesetzt werden, da kein IPv4-Adressbereich konfiguriert ist.", + "ORG_ZSTACK_POLICYROUTE_10017": "Zugehöriger Virtual Router kann nicht gefunden werden", + "ORG_ZSTACK_POLICYROUTE_10014": "Ungültiger Protokolltyp %s", + "ORG_ZSTACK_POLICYROUTE_10015": "RuleSet[%s] enthält bereits eine Regel mit der Nummer %s.", + "ORG_ZSTACK_POLICYROUTE_10013": "Vorgang fehlgeschlagen, IP-Format unterstützt nur IPv4/IP-Bereich/CIDR, aber gefunden: %s", + "ORG_ZSTACK_POLICYROUTE_10010": "NextHopIp muss im IPv4-Format sein, aber gefunden: [%s]", + "ORG_ZSTACK_CORE_REST_10012": "%s kann nicht innerhalb von %sms abgerufen werden", + "ORG_ZSTACK_QUERY_10021": "field[%s] ist kein Primitiv des Inventars %s; Sie können es nicht im Parameter 'fields' angeben; gültige Felder sind %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10034": "DHCP-Server-IP [%s] existiert bereits im L3-Netzwerk [%s]", + "ORG_ZSTACK_QUERY_10020": "Entitäts-Metadaten-Klasse [%s] fehlt das Feld [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10035": "DHCP-Server-IP [%s] darf nicht gleich der Gateway-IP sein", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10036": "DHCP-Server-IP [%s] kann nicht in den System-L3-Netzwerkeinstellungen konfiguriert werden", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10030": "DHCP-Server-IP-Adresse [%s] ist keine gültige IPv4-Adresse", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10031": "DHCP-Server-IP [%s] liegt nicht innerhalb des angegebenen CIDR [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10032": "DHCP-Server-IP [%s] ist keine gültige IPv6-Adresse", + "ORG_ZSTACK_IDENTITY_RBAC_10004": "Sie sind nicht berechtigt, eine System- oder vordefinierte Rolle zu aktualisieren. Bitte kontaktieren Sie Ihren Administrator für Unterstützung.", + "ORG_ZSTACK_POLICYROUTE_10009": "DestinationCidr muss im CIDR-Format sein, aber gefunden: [%s]", + "ORG_ZSTACK_IDENTITY_RBAC_10007": "Berechtigung verweigert, das Konto [uuid:%s] ist nicht berechtigt, auf die Ressource zuzugreifen [uuid:%s, type:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10027": "DHCP kann nicht für die virtuelle Maschine [uuid:%s] auf dem Ziel-Host [uuid:%s] konfiguriert werden", + "ORG_ZSTACK_IDENTITY_RBAC_10008": "Berechtigung verweigert, das Konto [uuid:%s] ist nicht berechtigt, die getaggte Ressource zu verwalten [uuid:%s, type:%s]", + "ORG_ZSTACK_POLICYROUTE_10008": "VRouter[%s] hat bereits einen Regelsatz mit dem Namen %s", + "ORG_ZSTACK_IDENTITY_RBAC_10005": "Sie sind nicht berechtigt, eine System- oder vordefinierte Rolle zu löschen. Bitte kontaktieren Sie Ihren Administrator für Unterstützung.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10029": "minimale IP-Bereichspräfixlänge für das Flat-Netzwerk ist %d", + "ORG_ZSTACK_POLICYROUTE_10003": "l3[%s] hat bereits einen angehängten Policy-Route-Regelsatz", + "ORG_ZSTACK_IDENTITY_RBAC_10009": "Das Konto [UUID:%s] hat keinen Zugriff auf die Ressourcen [UUID:%s, Type:%s]", + "ORG_ZSTACK_POLICYROUTE_10000": "Standardroutennetzwerk kann nicht geändert werden, wenn System-Policy-Routen aktiviert sind.", + "ORG_ZSTACK_QUERY_10018": "Bedingungsname [%s] ist ungültig, kein solches Feld in der Inventarklasse [%s] gefunden", + "ORG_ZSTACK_QUERY_10017": "\"Wert\" der Abfragebedingung %s darf für Cloud-Ressourcenfilterung nicht null sein", + "ORG_ZSTACK_QUERY_10015": "filterName muss als [filterType:Bedingung(en)] formatiert sein", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_10000": "Ocean-API-Signatur-String erstellen fehlgeschlagen: %s", + "ORG_ZSTACK_QUERY_10019": "Bedingungsname [%s] ist ungültig: field[%s] von inventory[%s] ist als @UnqueryableField annotiert", + "ORG_ZSTACK_ALIYUN_PANGU_10001": "appName: %s, partitionName: %s existiert bereits in identityZone: %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10050": "DHCP-Server-IP konnte nicht gesetzt werden, da IP[%s] bereits zugewiesen ist", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10051": "DHCPv6-Server-IP konnte nicht gesetzt werden, da IP[%s] verwendet wird", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10053": "DHCP-Server-IP-Zuweisung fehlgeschlagen.%s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10048": "DHCPv6-Server-IP konnte nicht geändert werden, da kein IPv6-Bereich konfiguriert ist.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10049": "DHCPv6-Server-IP konnte nicht gesetzt werden, da IP[%s] kein gültiges CIDR für L3-Netzwerk [%s] ist", + "ORG_ZSTACK_USBDEVICE_10026": "Bitte hängen Sie alle USB-Geräte von der VM[%s] aus und versuchen Sie es erneut", + "ORG_ZSTACK_USBDEVICE_10025": "USB-Gerät[uuid:%s] kann nicht getrennt werden, wenn es an eine VM-Instanz angeschlossen ist", + "ORG_ZSTACK_USBDEVICE_10024": "VM-Instanz[uuid:%s] ist nicht in einem anschließbaren Zustand für USB-Gerät %s", + "ORG_ZSTACK_USBDEVICE_10023": "Die VM-Instanz, an die das USB-Gerät[uuid:%s] angeschlossen ist, befindet sich nicht in einem trennbaren Zustand: %s", + "ORG_ZSTACK_USBDEVICE_10022": "Das USB-Gerät[UUID:%s] ist an keine virtuelle Maschine angeschlossen.", + "ORG_ZSTACK_USBDEVICE_10021": "Der Host, an den das USB-Gerät[uuid:%s] angeschlossen ist, befindet sich nicht in einem gültigen Zustand [%s] oder Status [%s].", + "ORG_ZSTACK_USBDEVICE_10020": "Die VM-Instanz[UUID:%s] ist nicht in einem anschließbaren Zustand für USB-Gerät: %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10005": "L3-Netzwerk[uuid:%s] existiert nicht", + "ORG_ZSTACK_COMPUTE_SRIOV_10006": "%s, da kein SRIOV-Gerät im l3Netzwerk[uuid:%s] des Hosts[uuid:%s] verfügbar ist", + "ORG_ZSTACK_COMPUTE_SRIOV_10007": "VF-NIC-HA-Status konnte nicht geändert werden, da VF-NIC[UUID:%s] nicht existiert", + "ORG_ZSTACK_COMPUTE_SRIOV_10008": "Hochverfügbarkeitsstatus der virtuellen Netzwerkschnittstellenkarte konnte nicht geändert werden, da Hochverfügbarkeitsstatus[%s] ungültig ist", + "ORG_ZSTACK_COMPUTE_SRIOV_10009": "L2-Netzwerk[UUID:%s] nicht gefunden", + "ORG_ZSTACK_COMPUTE_SRIOV_10000": "VF-NIC-MAC konnte nicht auf Host[uuid:%s, ip:%s] gesetzt werden, weil %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10001": "HA-Status der virtuellen Netzwerkschnittstellenkarte konnte nicht geändert werden, Fehler: %s", + "ORG_ZSTACK_DRS_10000": "Der Cluster[%s] hat den Data Replication Service gestartet", + "ORG_ZSTACK_DRS_10002": "Schwellenwerte dürfen nicht leer sein. Bitte stellen Sie sicher, dass die Schwellenwerteinstellungen korrekt konfiguriert sind.", + "ORG_ZSTACK_DRS_10001": "DRS ist für diese virtuelle Maschine deaktiviert. Bitte stellen Sie sicher, dass DRS aktiviert ist, um die Ressourcenzuweisung zu optimieren.", + "ORG_ZSTACK_DRS_10004": "Ungültiger Schwellenwertoperator[%s]", + "ORG_ZSTACK_DRS_10003": "Ungültiger Schwellenwertname[%s]", + "ORG_ZSTACK_DRS_10006": "Ungültiger Schwellenwert, gültiger Bereich: (0, 100]", + "ORG_ZSTACK_DRS_10005": "Der Schwellenwert für die Cloud-Ressourcenüberwachung darf nicht leer sein.%s", + "ORG_ZSTACK_DRS_10008": "Der DRG[%s]-Status ist %s", + "ORG_ZSTACK_DRS_10007": "GlobalConfig ENABLE_DRS ist deaktiviert", + "ORG_ZSTACK_DRS_10009": "Der DRS[%s]-Automatisierungsgrad ist nicht auf den manuellen Modus eingestellt", + "ORG_ZSTACK_ZWATCH_FUNCTION_10012": "Wert[%s] ist keine gültige ganze Zahl", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10018": "API-Vorgang konnte nicht ausgeführt werden. Backend-Netzwerk[UUID:%s] ist mit VPC-Router[UUID:%s] verbunden, der nicht mit dem Front-Netzwerk[UUID:%s] verbunden ist.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10011": "Ungültiges Argument [limit:%s], es darf nicht negativ sein", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10019": "Backend-Netzwerk [UUID:%s] muss ein VPC-Netzwerk sein, da ein anderes Backend-Netzwerk als VPC-Netzwerk konfiguriert ist.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10010": "Unbekanntes Argument [%s]", + "ORG_ZSTACK_DRS_10020": "Löschen von aDRS ist nicht erlaubt, während die VM migriert wird.", + "ORG_ZSTACK_DRS_10011": "Erfolgreich ausgeführt; erneute Bereitstellung ist nicht erlaubt", + "ORG_ZSTACK_DRS_10010": "Advice [%s] ist aufgrund von Inaktivität abgelaufen", + "ORG_ZSTACK_DRS_10013": "Die VM [%s] befindet sich nicht in einem laufenden Zustand", + "ORG_ZSTACK_DRS_10012": "Die VM [%s] wurde beendet", + "ORG_ZSTACK_DRS_10015": "Der Cluster [%s] unterstützt keine dynamische Ressourcenskalierung.", + "ORG_ZSTACK_DRS_10014": "Die VM [%s] befindet sich nicht mehr auf dem Quell-Host [%s].", + "ORG_ZSTACK_DRS_10017": "Die Liste der Host-UUIDs ist leer. Bitte stellen Sie sicher, dass mindestens eine Host-UUID bereitgestellt wird.", + "ORG_ZSTACK_DRS_10016": "DRDS-Instanz kann nicht erstellt werden, %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10013": "Backend-Netzwerk [uuid:%s] muss ein VPC-Netzwerk sein, da das Front-L3-Netzwerk ein VPC-Netzwerk ist", + "ORG_ZSTACK_ZWATCH_FUNCTION_10005": "Ungültiges Argument [start:%s], es darf keine negative Zahl in einer Cloud-Computing-Umgebung sein", + "ORG_ZSTACK_DRS_10019": "Advice während der Aufgabenplanung nicht erlaubt", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10014": "API-Vorgang konnte nicht ausgeführt werden. Das Backend-Netzwerk [UUID:%s] ist nicht mit dem VPC-Router verbunden. Bitte stellen Sie sicher, dass das Netzwerk ordnungsgemäß verbunden ist, bevor Sie es erneut versuchen.", + "ORG_ZSTACK_DRS_10018": "Abfrage der Host-Auslastungsdaten fehlgeschlagen", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10015": "Backend-Netzwerk ist mit VPC-Router [uuid:%s] verbunden, während das Frontend-Netzwerk mit einem anderen VPC-Router [uuid:%s] verbunden ist. Bitte stellen Sie sicher, dass beide Netzwerke mit demselben VPC-Router verbunden sind.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10016": "API-Vorgang konnte nicht ausgeführt werden. Das Backend-Netzwerk [uuid:%s] muss ein privates Flat-Netzwerk sein, da das Front-L3-Netzwerk ein privates Flat-Netzwerk ist.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10002": "Unbekannte Funktion [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10010": "Backend-Netzwerk-CIDR überschneidet sich mit Front-L3-Netzwerk-CIDR", + "ORG_ZSTACK_ZWATCH_FUNCTION_10008": "Ungültiger Wert [%s] für das Argument [%s] in der Cloud-Computing-Umgebung-Konfiguration", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10011": "Backend-Netzwerk-CIDR [%s] überschneidet sich mit Management-L3-Netzwerk-CIDR [%s]. Bitte stellen Sie sicher, dass keine Überschneidung zwischen Netzwerk-CIDs besteht, um Konfigurationskonflikte zu vermeiden. Backend-Netzwerk-UUID [%s] und Management-L3-Netzwerk-UUID [%s] sind betroffen.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10012": "API-Vorgang konnte nicht ausgeführt werden. Frontend-Netzwerk [UUID:%s] ist nicht mit dem VPC-Router verbunden", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10001": "CEPH-Pool [%s] kann nicht gefunden werden, zugehörige OSD-Gruppe", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10000": "Erforderlicher Ceph-Pool [uuid:%s] kann die Bedingung nicht erfüllen [availableSize > %d bytes], aktuelle verfügbare Größe %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10006": "SLB-Instanz konnte nicht erstellt werden, da das Image [uuid:%s] gelöscht wurde", + "ORG_ZSTACK_ZWATCH_FUNCTION_10001": "Doppeltes Argument [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10007": "SLB-Instanzerstellung fehlgeschlagen aufgrund des Erreichens der maximalen Instanzgrenze.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10000": "Fehlendes erforderliches Argument [%s] für die Cloud-Instanzkonfiguration", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10008": "konnte SLB-Gruppe nicht erstellen, weil der front L3-Netzwerktyp %s ungültig ist", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10009": "front network CIDR [%s] überschneidet sich mit management L3-Netzwerk CIDR [%s]", + "ORG_ZSTACK_DRS_10022": "Zeitplanung ist während der virtuellen Maschinenmigration nicht erlaubt.", + "ORG_ZSTACK_DRS_10023": "Fehlende Daten zur CPU- und Speicherauslastung des Hosts", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10002": "Cloud kann VIP[%s] nicht löschen. Bitte stellen Sie sicher, dass SLB[uuid:%s] zuerst gelöscht wird.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10003": "konnte SLB-Instanz nicht erstellen, weil keine Load Balancer SLB-Gruppe [uuid:%s] existiert", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10004": "konnte SLB-Instanz nicht erstellen, weil kein SLB-Angebot für SLB-Gruppe [uuid:%s] konfiguriert ist", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10005": "konnte SLB-Instanz nicht erstellen, weil die image UUID des SLB-Angebots [uuid:%s] null ist", + "ORG_ZSTACK_CORE_ENCRYPT_10000": "Verschlüsselungsfehler : %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10000": "Netzwerkschnittstelle der SLB-Instanz [uuid:%s] nicht gefunden, die an SLB-Gruppe front Layer 3 Netzwerk [uuid:%s] angehängt ist", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10001": "konnte IP-Bereich [%s] nicht löschen, bitte löschen Sie zuerst Load Balancer [uuid:%s]", + "ORG_ZSTACK_IDENTITY_10011": "Altes Passwort stimmt nicht mit dem ursprünglichen Passwort überein. Benutzer[%s] Passwort kann nicht aktualisiert werden.", + "ORG_ZSTACK_IDENTITY_10010": "Der Benutzer mit UUID [%s] ist nicht mit dem Konto mit UUID [%s] assoziiert.", + "ORG_ZSTACK_IDENTITY_10016": "Das Kontingent[name:%s] für Konto[uuid:%s] kann nicht auf %d gesetzt werden", + "ORG_ZSTACK_IDENTITY_10017": "Das Konto [UUID:%s] genutzt [Name:%s, Nutzungswert:%s] überschreitet das angeforderte Kontingent: %d", + "ORG_ZSTACK_IDENTITY_10001": "Falsche Authentifizierungsdaten. Bitte überprüfen Sie Ihr Passwort und versuchen Sie es erneut.", + "ORG_ZSTACK_IDENTITY_10009": "das Konto [UUID: %s] hat keinen Zugriff auf die Ressource [UUID: %s]", + "ORG_ZSTACK_IDENTITY_10008": "Die Benutzergruppe mit UUID [%s] gehört nicht zum Konto mit UUID [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10003": "konnte VIP%s aufgrund von %s nicht freigeben", + "ORG_ZSTACK_OBSERVABILITYSERVER_10009": "service[uuid: %s] ist bereits an einen observability server gebunden", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10002": "konnte VIPs synchronisieren [ips: %s] auf virtuellem Router [uuid:%s] für das Anhängen von NIC [uuid: %s, ip: %s], aufgrund von %s", + "ORG_ZSTACK_OVF_10025": "Nur virtuelle Maschinen im Zustand: %s können exportiert werden.", + "ORG_ZSTACK_OVF_10026": "Fehler beim Parsen von jsonCreateVmParam in APICreateVmInstanceFromOv", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10006": "", + "ORG_ZSTACK_OVF_10023": "f Msg Anforderungsparameter ungültig", + "ORG_ZSTACK_OBSERVABILITYSERVER_10006": "Ein virtuelles Router-Angebot [uuid:%s] für L3Network [uuid:%s] in Zone [uuid:%s] gefunden; jedoch stimmt das öffentliche IP-Netzwerk [uuid:%s] des Netzwerks nicht mit dem VIP [uuid:%s] überein. Möglicherweise müssen Sie ein bestimmtes virtuelles Router-Angebot unter Verwendung des System-Tags guestL3Network::l3NetworkUuid angeben.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10005": "Export VM erfordert einen ImageStore-Backup-Speicher, aber der gegebene backupStorageUuid: %s ist kein ImageStore-Backup-Speicher.", + "ORG_ZSTACK_OVF_10024": "observability server mit UUID: %s ist nicht aktiviert", + "ORG_ZSTACK_OBSERVABILITYSERVER_10007": "virtueller Router[uuid:%s, state:%s] ist nicht aktiv", + "ORG_ZSTACK_OVF_10021": "Die zu exportierende virtuelle Maschine mit UUID: %s nicht gefunden", + "ORG_ZSTACK_OVF_10022": "VM[UUID: %s] wurde bereits als OVA-Paket[UUID: %s] exportiert. Bitte löschen Sie das Paket und versuchen Sie es erneut.", + "ORG_ZSTACK_KVM_XMLHOOK_10001": "XML-Hook mit UUID %s wurde erfolgreich aktualisiert, konnte aber die VM mit UUID %s nicht neu starten. Details: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10003": "Virtueller Router für Dienst: %s, Typ: %s konnte nicht gefunden werden", + "ORG_ZSTACK_OBSERVABILITYSERVER_10010": "Observability-Server mit UUID: %s ist nicht betriebsbereit; Dienst kann nicht angehängt werden", + "ORG_ZSTACK_OVF_10018": "OVF-Datei für virtuelle Maschine %s konnte nicht gelesen werden. Bitte überprüfen Sie den Dateipfad und die Berechtigungen.", + "ORG_ZSTACK_OVF_10017": "OVA-Paket[UUID: %s] wurde im VM-Repository nicht gefunden.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10057": "SLB-Gruppen-UUID für Load Balancer[UUID:%s,Typ:%s] konnte nicht gefunden werden", + "ORG_ZSTACK_STORAGE_PRIMARY_FILESYSTEM_10000": "Heartbeat von Host[UUID:%s] wurde nicht aktualisiert", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_HA_10000": "HA-Gruppen-Erweiterungspunkt nicht initialisiert", + "ORG_ZSTACK_OVF_10030": "Langer Job[UUID:%s] Ausführung fehlgeschlagen", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10040": "VMNIC konnte nicht zur Load-Balancer-Servergruppe hinzugefügt werden, da L3-Netzwerk[UUID:%s] mit einem anderen VPC-Router verbunden ist", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10041": "VMNIC konnte nicht zur Load-Balancer-Servergruppe hinzugefügt werden, da L3-Netzwerk nicht mit SLB-Instanz verbunden ist", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10046": "SLB-Instanz konnte nicht erstellt werden, da eine andere Instanz[UUID: %s, Name: %s] bereits für die SLB-Gruppe existiert", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10047": "SLB-Instanz konnte nicht erstellt werden, da bereits zwei Instanzen für die SLB-Gruppe erstellt wurden", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10001": "Hochladen von Daten von NFS-Speicher[UUID:%s, Pfad:%s] zum Image-Speicher[Hostname:%s] fehlgeschlagen, %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10042": "SLB-Gruppen-Monitor-IP konnte nicht geändert werden, da ungültige Monitor-IP %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10043": "SLB-Gruppe[UUID:%s] konnte nicht in Hochverfügbarkeitsmodus geschaltet werden, da Instanzstatus [%s] nicht gestoppt ist", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10044": "Erstellen von VIP%s auf virtuellem Router[UUID:%s] fehlgeschlagen, weil %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10000": "Herunterladen von Daten von Image-Speicher-Backup-Speicher[Hostname:%s, Pfad: %s] zu NFS-Primärspeicher[UUID:%s, Pfad: %s] fehlgeschlagen, %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10045": "Erstellen von Affinitätsgruppe für SLB-Instanz[UUID:%s] fehlgeschlagen", + "ORG_ZSTACK_IAM2_API_10011": "Attribut[UUID:%s] ist keiner definierten Gruppe zugeordnet", + "ORG_ZSTACK_IAM2_API_10012": "Attribut[UUID:%s] ist keiner Organisation zugeordnet", + "ORG_ZSTACK_IAM2_API_10013": "Attribut[UUID:%s] ist keinem Projekt zugeordnet", + "ORG_ZSTACK_IAM2_API_10014": "Attribut[UUID:%s] ist keiner virtuellen Instanz-ID zugeordnet", + "ORG_ZSTACK_IAM2_API_10015": "Stilllegungsrichtlinie muss gelöscht werden, bevor das Projekt aus dem Stillgelegt-Zustand gezogen wird.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10039": "VMNIC konnte nicht zur Load-Balancer-Servergruppe hinzugefügt werden, da L3-Netzwerk[UUID:%s] mit einem VPC-Router verbunden ist", + "ORG_ZSTACK_IAM2_API_10016": "Anmeldung verboten, da Projekt sich im Zustand %s befindet", + "ORG_ZSTACK_IAM2_API_10017": "Kein Kontingent[Name:%s] vorhanden", + "ORG_ZSTACK_IAM2_API_10018": "CPU-Limit für Container (%s) sollte größer als angeforderte CPU-Menge (%s) sein.", + "ORG_ZSTACK_IAM2_API_10019": "Arbeitsspeichergrößenlimit für Container sollte größer als angeforderte Arbeitsspeichergröße sein.", + "ORG_ZSTACK_OVF_10003": "Volume-Management-Controller nicht gefunden. Bitte stellen Sie sicher, dass Ihr Volume-Management-Dienst korrekt konfiguriert und aktiv ist.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10007": "VipQoS für Vip [uuid: %s] existiert nicht", + "ORG_ZSTACK_OVF_10004": "CD-Treiber-Controller nicht gefunden. Bitte stellen Sie sicher, dass die erforderlichen Virtualisierungstreiber für Ihre Instanz installiert und konfiguriert sind.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10008": "Quality of Service für Virtual IP [uuid: %s] kann nicht gelöscht werden. Es ist mit einer VPC Shared Quality of Service verknüpft.", + "ORG_ZSTACK_OVF_10001": "Ungültige Festplattenkapazitätsangabe: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10005": "Quality of Service (Qos) für VIP [UUID: %s] kann nicht festgelegt werden. Es wurde an eine VpcSharedQos angehängt.", + "ORG_ZSTACK_OVF_10002": "Ungültige bereitgestellte Festplattengröße: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10006": "VIP QoS für VIP [uuid: %s] Port %s existiert nicht", + "ORG_ZSTACK_OVF_10000": "Festplattenreferenz für Festplatte %s nicht gefunden", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10009": "VIP QoS-Backend für VIP [uuid:%s] kann nicht gefunden werden", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10010": "VpcSharedQos muss Bandbreite angeben", + "ORG_ZSTACK_IPSEC_10028": "L3-Netzwerk [%s] ist nicht an IPsec-Tunnel [UUID:%s] angehängt", + "ORG_ZSTACK_AUTOSCALING_10000": "Ungültige L3-Netzwerk-UUIDs[%s] für Listener, der mit Load Balancer[%s] verknüpft ist. Alle Netzwerke müssen an denselben virtuellen Router wie der LB-Dienst angeschlossen sein und Teil derselben VRouter-Netzwerkkonfiguration sein", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10011": "VPC muss zuerst an L3[%s] angehängt werden", + "ORG_ZSTACK_IPSEC_10029": "CIDR [%s] ist bereits in der IPsec-Konfiguration [UUID:%s] enthalten", + "ORG_ZSTACK_AUTOSCALING_10001": "Trennen von autoScalingTemplate[%s] von AutoScalingGroup fehlgeschlagen, Fehler sind %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10030": "L3-Netzwerk mit UUID [%s] kann nicht an SLB-Instanz angehängt werden wegen ungültigem IPv6-Präfix [%s]-Format", + "ORG_ZSTACK_AUTOSCALING_10003": "Listener mit UUID: %s werden von autoScalingVmTemplate[%s] verwendet und können nicht gelöscht werden", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10014": "VpcSharedQos kann diesen VIP nicht anhängen, da er bereits an eine andere VpcSharedQos angehängt wurde", + "ORG_ZSTACK_IPSEC_10025": "L3-Netzwerk [%s] kann nicht mehrfach an IPsec [UUID:%s] angehängt werden", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10012": "AttachVipToVpcSharedQos-Parameter muss VipUuids oder VipLists angeben", + "ORG_ZSTACK_IPSEC_10026": "Layer-3-Netzwerke müssen in APIAttachL3NetworksToIPsecConnectionMsg enthalten sein", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10013": "VpcSharedQos kann diesen VIP nicht anhängen, da VIP[%s] nicht im L3-Netzwerk[%s] liegt", + "ORG_ZSTACK_IPSEC_10027": "L3-Netzwerk [%s] ist kein VPC-Netzwerk und kann nicht an IPsec angehängt oder getrennt werden", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10035": "Load Balancer kann nicht erstellt werden, da der VIP [uuid:%s] bereits mit einem anderen Netzwerkdienst [%s] verknüpft ist", + "ORG_ZSTACK_IPSEC_10020": "Peer-Adresse[%s] ist keine gültige IPv4-Adresse", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10036": "Load Balancer kann nicht erstellt werden, da der VIP [uuid:%s] bereits an einen VPC-Router [%s] angehängt ist", + "ORG_ZSTACK_IPSEC_10021": "Der Authentifizierungsschlüssel darf keine Leerzeichen oder Sonderzeichen wie %s enthalten", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10037": "Load Balancer kann nicht erstellt werden, da ungültige SLB-Gruppe [uuid:%s]", + "ORG_ZSTACK_IPSEC_10022": "IPsec-VIP [%s] darf nicht die erste oder letzte IP-Adresse im CIDR-Bereich sein, der dem öffentlichen Adresspooltyp zugeordnet ist", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10038": "Backend-Server-NIC konnte nicht zur Servergruppe [uuid:%s] hinzugefügt werden, da die NIC-UUID null ist", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10031": "L3-Netzwerk mit UUID [%s] kann nicht an SLB-Instanz angehängt werden, da IP-Adresse und Präfix in System-Tags angegeben werden müssen", + "ORG_ZSTACK_AUTOSCALING_10004": "Die Instanz existiert nicht in der Skalierungsgruppe. Bitte überprüfen Sie die Instanz-ID und den Namen der Skalierungsgruppe [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10032": "Front-End-L3-Netzwerk [uuid:%s] kann nicht von SLB-Instanz getrennt werden", + "ORG_ZSTACK_AUTOSCALING_10005": "Alarme mit UUID:%s sind mit der autoScalingGroup[%s] verknüpft und können nicht gelöscht werden", + "ORG_ZSTACK_IAM2_API_10020": "Organisation [uuid:%s] ist ein Cloud-Tenant und kann keine übergeordnete Organisation haben", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10033": "Management-L3-Netzwerk [uuid:%s] kann nicht von SLB-Instanz getrennt werden", + "ORG_ZSTACK_AUTOSCALING_10006": "Regel[%s] ist deaktiviert", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10034": "NIC [uuid:%s] kann nicht von SLB-Instanz getrennt werden, da es die letzte Backend-L3-Netzwerkschnittstelle ist", + "ORG_ZSTACK_IAM2_API_10021": "Übergeordnete Organisation [uuid:%s] kann keine untergeordnete Organisation [uuid:%s] innerhalb einer verschachtelten Organisationsstruktur sein", + "ORG_ZSTACK_IAM2_API_10022": "doppelte virtuelle Maschinen-ID-Name[%s]", + "ORG_ZSTACK_IAM2_API_10023": "doppelter virtueller Umgebungsname[%s]", + "ORG_ZSTACK_IAM2_API_10024": "ungültiger Projektname[%s], ein Projekt mit demselben Namen existiert bereits", + "ORG_ZSTACK_IAM2_API_10025": "IAM2OrganizationVO[uuid:%s] existiert nicht", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10028": "L3-Netzwerk mit UUID [%s] kann nicht an SLB-Instanz angehängt werden, da IP-Adresse und Netzmaske in System-Tags angegeben werden müssen", + "ORG_ZSTACK_IAM2_API_10026": "Das Projekt [UUID=%s] wurde mit der Organisation [UUID=%s] verknüpft.", + "ORG_ZSTACK_OBSERVABILITYSERVER_10019": "Startzeit muss kleiner als Endzeit sein für gültige Planung in Cloud-Umgebungen.", + "ORG_ZSTACK_IAM2_API_10027": "Das Projekt [UUID=%s] ist nicht mit einer Cloud-Umgebung verknüpft.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10029": "L3-Netzwerk mit UUID [%s] kann nicht an SLB-Instanz angehängt werden aufgrund ungültigem IPv6-Adressformat [%s]", + "ORG_ZSTACK_IAM2_API_10028": "Organisationen%s dürfen keine untergeordneten Elemente anderer Organisationen sein", + "ORG_ZSTACK_IAM2_API_10029": "virtuelle ID [UUID: %s] gehört nicht zum Projekt [UUID: %s]", + "ORG_ZSTACK_OBSERVABILITYSERVER_10015": "ObservabilityServer-Diensttyp kann nicht gefunden werden: %s", + "ORG_ZSTACK_OVF_10015": "Backup-Speicher[UUID: %s] hat nicht genügend verfügbare Kapazität zum Exportieren der VM[UUID: %s], erforderliche Kapazität ist: %d", + "ORG_ZSTACK_OBSERVABILITYSERVER_10016": "Dienst[uuid: %s] mit Typ %s kann nicht vom Observability-Server[uuid: %s] getrennt werden aufgrund von: %s", + "ORG_ZSTACK_OVF_10012": "Illegale CPU 'CoresPerSocket'-Konfigurationswert: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10017": "Dienst[uuid: %s] ist nicht mit Observability-Server[uuid: %s] verknüpft", + "ORG_ZSTACK_OBSERVABILITYSERVER_10018": "Start- und Endzeit müssen beide für den Cloud-Instanz-Bereitstellungszeitraum angegeben werden.", + "ORG_ZSTACK_OVF_10010": "Virtuelle CPU 'VirtualQuantity' nicht gefunden", + "ORG_ZSTACK_OBSERVABILITYSERVER_10011": "Observability-Server-Instanz[uuid: %s] nicht gefunden", + "ORG_ZSTACK_OVF_10011": "Illegaler CPU 'vCPU'-Wert: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10013": "Dienst[UUID: %s] mit Typ %s kann nicht an den Observability-Server[UUID: %s] angehängt werden wegen: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10000": "VIP Quality of Service (QoS) für IPv6 wird bald implementiert.", + "ORG_ZSTACK_ALIYUN_STORAGE_SNAPSHOT_10000": "Der Vorgang ist nur erlaubt, wenn der ECS-Instance-Status \"wird ausgeführt\" oder \"gestoppt\" ist.", + "ORG_ZSTACK_OVF_10009": "CPU 'InstanceID' nicht gefunden. Bitte überprüfen Sie die Instance-ID und stellen Sie sicher, dass die CPU korrekt zugewiesen ist.", + "ORG_ZSTACK_OBSERVABILITYSERVER_10020": "Ungültiges Datums-Zeit-Format. Erwartet ISO-8601-Format mit optionaler Zeitzonen-Angabe: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10021": "Observability-Server [UUID: %s] ist nicht aktiv; kann Service-Daten nicht abrufen", + "ORG_ZSTACK_OVF_10007": "Virtueller Speicher 'VirtualQuantity' nicht gefunden", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10003": "SetVipQos muss entweder InboundBandwidth oder OutboundBandwidth angeben.", + "ORG_ZSTACK_OVF_10008": "Ungültiger Wert für virtuellen Maschinenspeicher: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10004": "Quality of Service (QoS) kann für diese Virtual IP (VIP) nicht festgelegt werden. Nicht alle Peer-Layer-3-Netze bieten VIP-QoS-Dienst.", + "ORG_ZSTACK_OVF_10005": "Ethernet-Adapter: %s ist nicht mit einem Netzwerk verbunden.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10001": "VIP QoS für VIP [UUID: %s] Port %s existiert bereits", + "ORG_ZSTACK_OVF_10006": "Virtuelle Maschine '%s' nicht gefunden", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10002": "VIP Quality of Service für VIP [UUID: %s] existiert bereits", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10024": "SLB-Gruppe konnte nicht erstellt werden, da ungültiger Backend-Instance-Typ %s", + "ORG_ZSTACK_IPSEC_10031": "Status kann nicht geändert werden, da IPsec [UUID:%s] nicht bereit ist", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10025": "SLB-Gruppe konnte nicht erstellt werden, da ungültige Monitoring-IP %s", + "ORG_ZSTACK_IPSEC_10032": "IPsec-Tunnel [UUID:%s] konnte nicht wiederhergestellt werden, bitte IPsec-Version aktualisieren", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10026": "L3-Netzwerk mit UUID [%s] kann nicht an SLB-Instance angehängt werden wegen ungültigem IPv4-Adressformat [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10027": "L3-Netzwerk mit UUID [%s] kann nicht an SLB-Instance angehängt werden wegen IPv4-Netzmaskenformat-Fehler [%s]", + "ORG_ZSTACK_IAM2_API_10030": "Unzulässiger Vorgang, Rolle[%s] kann nicht hinzugefügt werden", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10021": "Backend-Netzwerk [UUID:%s] ist mit VPC-Router [UUID:%s] verbunden, während andere Backend-Netzwerke mit VPC-Router [UUID:%s] verbunden sind.", + "ORG_ZSTACK_IAM2_API_10031": "Vorgang auf veralteten virtuellen Maschinen-IDs nicht möglich: %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10022": "API-Vorgang konnte nicht ausgeführt werden. Das Backend-Netzwerk [uuid:%s] kann kein VPC-Netzwerk sein, da andere Backend-Netzwerke keine VPC-Netzwerke sind.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10023": "SLB-Gruppe konnte nicht erstellt werden, da ungültiger Bereitstellungstyp %s", + "ORG_ZSTACK_IPSEC_10030": "CIDR [%s] liegt nicht innerhalb der definierten CIDRs von IPsec UUID [%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10026": "Vorgangsf Fehler: Antwort vom Cloud-Computing-Dienst konnte nicht abgerufen werden", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10028": "Das Sichern von Snapshots auf Backup-Speicher ist eine veraltete Funktion und wird in einer zukünftigen Version der Cloud-Plattform entfernt", + "ORG_ZSTACK_IAM2_API_10000": "Attributname darf nicht null sein, Wert[%s]", + "ORG_ZSTACK_IAM2_API_10001": "Attributname[%s] überschreitet die maximale Länge von 2048 Zeichen", + "ORG_ZSTACK_IAM2_API_10002": "Attribut[name:%s] Wert überschreitet die maximale Länge von 2048 Zeichen", + "ORG_ZSTACK_IAM2_API_10003": "Die Organisation[UUID: %s] hat das angeforderte Limit überschritten für [Name: %s, Verwendeter Wert: %s].", + "ORG_ZSTACK_IAM2_API_10005": "%s ist kein gültiger Wert für die Netzwerkverkehrskontrolle. Gültige Werte sind allow/reject zwischen spezifischen IP-Bereichen.", + "ORG_ZSTACK_IAM2_API_10006": "Die Standard-Organisationseinheit[%s] kann nicht gelöscht werden", + "ORG_ZSTACK_IAM2_API_10007": "Doppelter Template-Identifier[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10018": "VpcSharedQos kann dieses Vip nicht trennen, da Vpc[%s] nicht verbunden ist", + "ORG_ZSTACK_IAM2_API_10009": "Der Benutzername 'admin' ist in Cloud-Computing-Umgebungen reserviert, um Administratorrechte zu bezeichnen. Bitte wählen Sie einen anderen Namen für Ihren Benutzer.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10016": "DetachVipFromVpcSharedQos Parameter muss VipUuids oder VipLists angeben", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10017": "VpcSharedQos kann dieses VIP nicht trennen, da VIP[%s] nicht angehängt ist", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10010": "Ceph Primärspeicher [uuid:%s] wurde möglicherweise gelöscht oder beendet.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10013": "Der Ceph Primärspeicher [UUID: %s, name: %s] ist nicht verfügbar, da ein Monitor [UUID: %s] einen Betriebsausfall meldet [%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10012": "Es gibt einen weiteren CEPH Primärspeicher mit demselben FSID; Sie können dieselbe CEPH-Konfiguration nicht als zwei verschiedene Primärspeicher hinzufügen.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10015": "Verbindung mit Speicherknoten (%s) kann nicht hergestellt werden", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10017": "Der Monitor-Knoten [ip:%s] gibt einen fsid[%s] zurück, der vom aktuellen Cluster-fsid[%s] abweicht, fügen Sie versehentlich einen Monitor-Knoten hinzu, der nicht zu diesem Cluster gehört?", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10016": "MON-Knoten kann nicht zu Ceph-basierten Primärspeicherlösungen hinzugefügt werden", + "ORG_ZSTACK_IAM2_API_10010": "Ungültiger Name[%s], ein Projekt oder Konto mit demselben Bezeichner existiert bereits", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10008": "Verbindung zum Ceph Primärspeicher [UUID:%s] kann nicht hergestellt werden, Verbindung zu allen Ceph-Monitoren fehlgeschlagen.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10007": "Alle Monitore können HTTP-Anfrage nicht ausführen[%s]", + "ORG_ZSTACK_ZOPS_10009": "Chrony-Quellen konnten nicht abgerufen werden, Grund:%s", + "ORG_ZSTACK_ZOPS_10005": "%s ist von %s aufgrund von:%s nicht erreichbar", + "ORG_ZSTACK_ZOPS_10004": "Zeitquellen '%s' in %s konnten nicht konfiguriert werden, Grund:%s, raw: %s", + "ORG_ZSTACK_ZOPS_10007": "%s hat die Überprüfung des Ceph-Cluster-Integritätsstatus aufgrund von: %s fehlgeschlagen", + "ORG_ZSTACK_ZOPS_10006": "Überprüfung, ob %s von %s erreichbar ist, fehlgeschlagen aufgrund von:%s", + "ORG_ZSTACK_ZOPS_10001": "%s ist keine gültige Cloud-Instanz IP-Adresse", + "ORG_ZSTACK_ZOPS_10003": "%s ist keine gültige IP-Adresse oderHostname", + "ORG_ZSTACK_ZOPS_10002": "Interne und externe Chrony-Server können nicht gleichzeitig null sein. Bitte stellen Sie sicher, dass beide korrekt konfiguriert sind.", + "ORG_ZSTACK_ZOPS_10010": "Chrony-Quellen von %s konnten nicht abgerufen werden, Grund:%s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10001": "Der Backup-Speicher [UUID: %s, Name: %s, FSID: %s] gehört nicht demselben Ceph-Cluster an wie der Primärspeicher [UUID: %s, Name: %s, FSID: %s].", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10004": "Verschlüsselter Image-Cache konnte nicht gespeichert werden: %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10005": "fsid ist nicht konsistent zwischen dem Primärspeicher [ps(%s)] und Backup-Speicher [bs(%s)]. Template-Erstellung ist daher verboten.", + "ORG_ZSTACK_ZOPS_10019": "Fehler beim Löschen des alten chrony-Servers in zstack.properties in %s, wegen:%s", + "ORG_ZSTACK_ZOPS_10016": "ZStone unterstützt derzeit keine Online-Aktualisierung von chrony-Servern. Bitte stellen Sie sicher, dass alle Änderungen offline vor der Bereitstellung vorgenommen werden.", + "ORG_ZSTACK_ZOPS_10015": "%s ist von der aktuellen virtuellen Maschine aus nicht erreichbar", + "ORG_ZSTACK_ZOPS_10018": "CEPH-Cluster-Status ist fehlerhaft. Bitte überprüfen Sie zuerst Ihre Umgebung! %s", + "ORG_ZSTACK_ZOPS_10012": "Fehler beim Prüfen, ob %s von Host %s erreichbar ist, weil es nicht unter unserer Verwaltung steht", + "ORG_ZSTACK_ZOPS_10011": "Fehler beim Synchronisieren des chrony-Servers in %s wegen:%s, raw: %s", + "ORG_ZSTACK_ZOPS_10014": "%s kann nicht als externer chrony-Zeitserver bestimmt werden!", + "ORG_ZSTACK_ZOPS_10020": "Fehler beim Konfigurieren des chrony-Servers %s in zstack.properties in %s, wegen:%s", + "ORG_ZSTACK_PROXY_10000": "Benutzer-Proxy-Konfiguration mit UUID %s kann nicht gefunden werden", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10005": "USB-Umleitungsserver konnte nicht auf Host gestartet werden[uuid:%s]", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10004": "USB-Dienst kann auf Host[%s] nicht gestartet werden, weil der Host nicht verbunden ist", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10003": "Host[%s] hat mehr als 64 USB-Umleitungsports initiiert", + "ORG_ZSTACK_COMPUTE_HOST_10085": "Management-Netzwerk kann auf der Schnittstelle nicht konfiguriert werden, weil es auf Auto-Zuweisungsmodus eingestellt ist", + "ORG_ZSTACK_COMPUTE_HOST_10084": "Management-Netzwerk kann nicht von der Schnittstelle getrennt werden, weil es ein automatisch zugewiesener Typ ist", + "ORG_ZSTACK_COMPUTE_HOST_10087": "Management-Netzwerk kann nicht von der Bonding-Schnittstelle getrennt werden, da es automatische IP-Acqusition verwendet", + "ORG_ZSTACK_COMPUTE_HOST_10081": "IP-Adressen können für Bridge-Slave-Schnittstellen nicht konfiguriert werden", + "ORG_ZSTACK_COMPUTE_HOST_10080": "Die IP-Adresse wurde bereits einer anderen Schnittstelle zugewiesen. Bitte stellen Sie sicher, dass die IP-Adresse für alle Netzwerkschnittstellen eindeutig ist.", + "ORG_ZSTACK_COMPUTE_HOST_10083": "Ungültige bonding UUID für virtuelle Netzwerkschnittstelle %s", + "ORG_ZSTACK_COMPUTE_HOST_10089": "Ungültiger Diensttyp angegeben. Bitte stellen Sie sicher, dass Sie einen gültigen Diensttyp für Cloud-Computing-Umgebungen verwenden.", + "ORG_ZSTACK_COMPUTE_HOST_10088": "Management-Netzwerk kann nicht auf Bonding gesetzt werden, weil das Management-Netzwerk Auto-Zuweisung verwendet.", + "ORG_ZSTACK_COMPUTE_HOST_10090": "Simuliertes Ausschalten der virtuellen Maschine[%s] durch IPMI fehlgeschlagen.", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10001": "Verbindung zum SMTP-Server auf Host: %s und Port: %d konnte nicht hergestellt werden. Bitte überprüfen Sie die Korrektheit der smtpServer- und smtpPort-Konfiguration. [Fehler=%s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10002": "Verbindung zum SMTP-Server[Server: %s, Port: %s] konnte nicht innerhalb von 15 Sekunden hergestellt werden", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10003": "SMTP-Server-Validierungsfehler: %s", + "ORG_ZSTACK_AI_COLLECTOR_10000": "Keine Bereitstellungskontexte für MindIE-Metadatensammlung in der virtuellen Umgebung gefunden. Bitte stellen Sie sicher, dass die erforderlichen Cloud-Ressourcen ordnungsgemäß konfiguriert und verfügbar sind.", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10004": "Der angegebene Endpunkt ist deaktiviert. Bitte überprüfen Sie Ihre Endpunktkonfiguration.", + "ORG_ZSTACK_AI_COLLECTOR_10001": "Einige Bereitstellungskontexte haben keine virtuellen Maschinenbestände, was die Sammlung von MindIE-Metadaten verhindert.", + "ORG_ZSTACK_COMPUTE_HOST_10096": "Power-Reset-Host[%s] via IPMI fehlgeschlagen.", + "ORG_ZSTACK_COMPUTE_HOST_10095": "Simulierter Power-Reset der virtuellen Maschine durch IPMI fehlgeschlagen. [%s]", + "ORG_ZSTACK_COMPUTE_HOST_10098": "Host[%s] hat einen unerwarteten Rückgabewert erhalten", + "ORG_ZSTACK_COMPUTE_HOST_10097": "IPMI-Information ist unvollständig für Instanz %s. Bitte überprüfen und die erforderlichen Details angeben.", + "ORG_ZSTACK_COMPUTE_HOST_10092": "Simuliertes Einschalten der Instanz durch IPMI fehlgeschlagen für Host[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10091": "Ausschalten des Hosts[%s] durch IPMI fehlgeschlagen.", + "ORG_ZSTACK_COMPUTE_HOST_10094": "Neustart des Hosts[%s:%d] fehlgeschlagen, da die Instanz bereits ausgeschaltet ist", + "ORG_ZSTACK_COMPUTE_HOST_10093": "Einschalten des Hosts[%s] durch IPMI fehlgeschlagen.", + "ORG_ZSTACK_COMPUTE_HOST_10099": "Host[%s] kann keine Verbindung mit ipmi[%s] herstellen, Grund:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10002": "MD5-Prüfsumme von Dateien im Verzeichnis[%s] kann nicht verifiziert werden.\\nstdout:%s\\nstderr:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10003": "MD5-Prüfsumme von Dateien im Ordner[%s] auf dem Host[ip:%s] kann nicht verifiziert werden.\\nstdout:%s\\nstderr:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10000": "Benutzername, Passwort oder Portnummer können falsch sein. Bitte überprüfen und erneut versuchen.", + "ORG_ZSTACK_COMPUTE_HOST_10065": "Aktualisierung des Host-Netzwerk-Labels fehlgeschlagen [uuid:%s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10000": "Das Problem kann durch einen falschen Zugriffsschlüssel oder geheimen Schlüssel oder verweigerte IAM-Richtlinienberechtigung verursacht werden. [Fehler=%s]", + "ORG_ZSTACK_COMPUTE_HOST_10064": "Löschen des Host-Netzwerk-Labels fehlgeschlagen [uuid:%s]", + "ORG_ZSTACK_COMPUTE_HOST_10067": "Ungültiges IP-Adressformat[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10066": "Host(s) [%s] ist nicht verbunden, Ausschalten wird nicht unterstützt", + "ORG_ZSTACK_COMPUTE_HOST_10069": "Ungültige IP-Angabe, sie muss mit einer Netzmaske in CIDR-Notation angegeben werden", + "ORG_ZSTACK_COMPUTE_HOST_10068": "Ungültiges Subnetzmaskenformat[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10073": "IP-Adresse kann auf Bonding-Slave-Schnittstellen nicht konfiguriert werden", + "ORG_ZSTACK_COMPUTE_HOST_10070": "IP-Adresse für das Management-Netzwerk-Interface kann nicht konfiguriert werden.%s", + "ORG_ZSTACK_COMPUTE_HOST_10078": "IP-Adresse für das Bonding-Interface, das mit dem Management-Netzwerk verbunden ist, kann nicht konfiguriert werden", + "ORG_ZSTACK_COMPUTE_HOST_10077": "Ungültige Interface-UUID angegeben", + "ORG_ZSTACK_IMAGE_10019": "Upload-Sitzung abgelaufen. Bitte stellen Sie sicher, dass Ihre Upload-Sitzung aktiv ist, und versuchen Sie es erneut.", + "ORG_ZSTACK_IMAGE_10016": "Fehler aufgrund von Management-Node-Neustart.", + "ORG_ZSTACK_IMAGE_10015": "Bildpfad ist nicht in der genehmigten Liste enthalten: %s", + "ORG_ZSTACK_IMAGE_10014": "Alle Instanzen auf diesem Server können nicht auf Bilder zugreifen", + "ORG_ZSTACK_IMAGE_10013": "Bildpfad [%s] ist in der schwarzen Liste %s enthalten", + "ORG_ZSTACK_IMAGE_10012": "Ein absoluter Pfad muss für die Quelldatei angegeben werden. Bitte geben Sie einen vollständigen Pfad zur Datei an.", + "ORG_ZSTACK_IMAGE_10011": "Die angegebene URL muss mit 'file:///', 'http://', 'https://', 'ftp://', 'sftp://' oder '/' beginnen.", + "ORG_ZSTACK_IMAGE_10010": "Kein Backup-Speicher in uuids%s ist zum Hinzufügen dieses Bildes verfügbar; sie sind nicht im Status %s oder nicht im Zustand %s, oder die UUID ist eine ungültige Backup-Speicher-UUID", + "ORG_ZSTACK_IMAGE_10009": "Nicht unterstütztes Bildformat[%s]", + "ORG_ZSTACK_IMAGE_10008": "Unbekanntes Format[%s]", + "ORG_ZSTACK_IMAGE_10007": "ISO kann nicht als Systemfestplatten-Image verwendet werden.", + "ORG_ZSTACK_IMAGE_10006": "volume snapshot[uuid:%s] ist nicht aktiviert, es ist %s", + "ORG_ZSTACK_IMAGE_10005": "volume snapshot[uuid:%s] ist nicht bereit, es befindet sich im Status %s", + "ORG_ZSTACK_IMAGE_10004": "volume[uuid:%s] ist nicht aktiviert, es ist derzeit %s", + "ORG_ZSTACK_IMAGE_10003": "volume[uuid:%s] ist nicht bereit, es ist %s", + "ORG_ZSTACK_IMAGE_10002": "Die AArch64-Architektur unterstützt keine Legacy-Funktionen. Bitte stellen Sie sicher, dass Ihre Konfiguration mit der AArch64-Architektur kompatibel ist.", + "ORG_ZSTACK_ALIYUN_ACCOUNT_10000": "Verbindung zu [%s] kann innerhalb von %d Millisekunden nicht hergestellt werden, was darauf hinweist, dass der Alibaba Cloud OpenAPI-Dienst nicht erreichbar ist.", + "ORG_ZSTACK_IMAGE_10039": "Kein angeschlossenes Backup-Speicher für image[uuid:%s, name:%s] gefunden", + "ORG_ZSTACK_IMAGE_10038": "Das Image mit UUID [uuid:%s] und Name [name:%s] ist auf keinem Backup-Speicher gespeichert.", + "ORG_ZSTACK_IMAGE_10037": "Datenbank-Vorlage aus volume[uuid:%s] konnte nicht auf allen Backup-Speichern erstellt werden%s. Ursache für einen der Fehler sehen", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10041": "Ein boolescher Wert oder eine weitere Condition wird erwartet, aktuelle Conditions beinhalten: %s, aber %s erhalten", + "ORG_ZSTACK_IMAGE_10036": "Zuweisung aller Backup-Speicher[uuid:%s] fehlgeschlagen, Liste der Fehler: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10040": "Die EC2-Instanz ist null! Bitte stellen Sie sicher, dass die Instanz-ID korrekt und nicht null ist.", + "ORG_ZSTACK_IMAGE_10035": "Keine geeignete Backup-Speicherlösung gefunden. Bitte stellen Sie sicher, dass Ihre Cloud-Speicherkonfiguration korrekt und zugänglich ist.", + "ORG_ZSTACK_IMAGE_10034": "Erstellung des Images aus root volume[uuid:%s] auf allen Backup-Speichern fehlgeschlagen; bitte überprüfen Sie die Ursache für einen der Fehler", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10002": "Unzureichende Ressourcen für das Image[uuid: %s] Herunterladen während der volume[uuid: %s] Speichermigration, erforderliche Kapazität: %s, aktuell verfügbare physische Kapazität: %s", + "ORG_ZSTACK_IMAGE_10032": "Backup-Speicher mit UUIDs%s konnte nicht zugewiesen werden, Liste der Fehler: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10003": "Unzureichende Kapazität für volume [UUID: %s] Speichermigration; erforderliche Kapazität: %d, aktuell verfügbare physische Kapazität: %d", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10004": "Daten auf Quell-PS[uuid: %s] wurden verworfen und Rollback wird nicht unterstützt", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10005": "Migration eines Volumes ohne Snapshot auf gemeinsamem Block-Speicher wird nicht unterstützt und kann nicht abgebrochen werden.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10000": "Trash-ID (%s) in Primary Storage [%s] für den Migrationsinstallationspfad [%s] gefunden. Bitte bereinigen Sie diese zuerst mit 'APICleanUpTrashOnPrimaryStorageMsg', wenn Sie die Migration des Volumes [%s] fortsetzen möchten.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10001": "Das Image mit UUID:%s kann in keinem angeschlossenen Backup-Speicher gefunden werden, der an der Zone mit UUID:%s angehängt ist. Bitte überprüfen Sie Folgendes:", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10039": "1. Stellen Sie sicher, dass der Backup-Speicher an der Zone mit UUID:%s angehängt ist.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10032": "2. Überprüfen Sie, ob sich der Backup-Speicher im Verbindungsstatus befindet; Versuchen Sie gegebenenfalls, ihn erneut zu verbinden.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10036": "Nur Methoden können innerhalb einer Function definiert werden, aber %s gefunden", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10035": "Fn::FindInMap kann Ressourcen [%s] nicht in der Resources-Map finden!", + "ORG_ZSTACK_CORE_ERRORCODE_10007": "Keine Referenz [%s] gefunden!", + "ORG_ZSTACK_CORE_ERRORCODE_10005": "Nicht unterstützte Funktionen [%s] werden im ZStack-Ressourcen-Template nicht unterstützt!", + "ORG_ZSTACK_IMAGE_10026": "Eingabeargumente 'regex' oder 'category' müssen für die Cloud-Ressourcenfilterung angegeben werden.", + "ORG_ZSTACK_CORE_ERRORCODE_10006": "Elaborationscode muss ein numerischer Wert sein!", + "ORG_ZSTACK_IMAGE_10025": "Quell-Image [%s] existiert nicht", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10051": "%s kann nicht in CloudString konvertiert werden", + "ORG_ZSTACK_CORE_ERRORCODE_10003": "%s ist kein gültiges oder leeres Verzeichnis", + "ORG_ZSTACK_CORE_ERRORCODE_10004": "Lesefehler beim Verarbeiten der Vorlagendateien [%s] fehlgeschlagen, wegen: %s", + "ORG_ZSTACK_IMAGE_10023": "VM-Instanz [uuid:%s] hat kein Root-Volume", + "ORG_ZSTACK_IMAGE_10022": "VM-Instanz [uuid:%s] hat kein angeschlossenes Volume", + "ORG_ZSTACK_IMAGE_10021": "Der Backup-Speicher [uuid:%s] ist nicht im verbundenen Zustand, aktueller Status ist %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10042": "Erwarteter boolescher Wert 'true' oder 'false' für das Objekt, aber %s erhalten", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10046": "Fn::GetAtt kann die angegebenen Ressourcen [%s] in der Ressourcenliste nicht finden!", + "ORG_ZSTACK_SSO_SAML2_SERVICE_10000": "iam2 enthält einen Benutzer mit dem gleichen Namen [%s], erwarteter Typ [%s], aber Typ [%s] gefunden", + "ORG_ZSTACK_COMPUTE_HOST_10119": "Der Host [%s] hat kein IPMI-Gerät konfiguriert oder dem IPMI-Gerät fehlt eine Adresse. Bitte konfigurieren Sie die IPMI-Adresse und verbinden Sie den Host dann erneut, um seine IPMI-Informationen zu aktualisieren.", + "ORG_ZSTACK_ZQL_AST_VISITORS_PLUGIN_10000": "Das zu summierende Feld muss angegeben werden.", + "ORG_ZSTACK_SSO_SAML2_SERVICE_10001": "doppelter SAML-Login [%s] für Typ [%s]", + "ORG_ZSTACK_COMPUTE_HOST_10120": "Migration der VM [uuid:%s] auf Host [uuid:%s, name:%s, ip:%s] fehlgeschlagen, es wird versucht, das System ordnungsgemäß herunterzufahren.", + "ORG_ZSTACK_CORE_ERRORCODE_10001": "Quelldatei und JSON-Inhalt können nicht gleichzeitig leer sein. Bitte stellen Sie sicher, dass entweder eine gültige Quelldatei angegeben oder JSON-Inhalt spezifiziert ist.", + "ORG_ZSTACK_CORE_ERRORCODE_10002": "Ressourcenverzeichnis kann nicht gescannt werden: %s", + "ORG_ZSTACK_CORE_ERRORCODE_10000": "Keine Datei oder Eingabeinhalt für die Cloud-Computing-Ressourcenkonfiguration bereitgestellt", + "ORG_ZSTACK_COMPUTE_HOST_10124": "Host-Verbindungsversuch fehlgeschlagen, Ping-Anfrage timed out. Bitte überprüfen Sie die Netzwerkkonnektivität und stellen Sie sicher, dass der Host betriebsbereit ist.", + "ORG_ZSTACK_COMPUTE_HOST_10104": "Ein Host mit Management-IP [%s] für Hypervisor [%s] wurde erkannt.", + "ORG_ZSTACK_COMPUTE_HOST_10103": "Cluster [uuid:%s] hat einen undefinierten Hypervisor-Typ", + "ORG_ZSTACK_COMPUTE_HOST_10106": "Die Architektur des Clusters [uuid:%s] ist %s, stimmt nicht mit der Host-Architektur [name:%s, ip:%s] von %s überein", + "ORG_ZSTACK_COMPUTE_HOST_10105": "Nach dem Verbinden gibt der Host [name:%s, ip:%s] eine virtuelle Architektur von null zurück", + "ORG_ZSTACK_COMPUTE_HOST_10100": "Host IPMI [%s] ist nicht erreichbar, weil %s", + "ORG_ZSTACK_COMPUTE_HOST_10102": "Cluster [uuid:%s] existiert nicht", + "ORG_ZSTACK_SCHEDULER_10008": "Ungültige Zeiteinheit angegeben: %s", + "ORG_ZSTACK_SCHEDULER_10005": "Das Volume [%s] unterstützt keine Snapshot-Aufbewahrungsrichtlinien", + "ORG_ZSTACK_SCHEDULER_10006": "snapshotMaxNumber: Das Format ist aufgrund von %s inkorrekt", + "ORG_ZSTACK_COMPUTE_HOST_10108": "System-Host-Netzwerkdiensttyp [%s] kann nicht beendet werden", + "ORG_ZSTACK_COMPUTE_HOST_10107": "Primärspeicher [uuid:%s] wurde getrennt, und der Host hat keinen angeschlossenen Primärspeicher mehr.", + "ORG_ZSTACK_COMPUTE_HOST_10109": "System-Host-Netzwerkdiensttyp [%s] kann aufgrund inkompatibler Virtualisierungseinstellungen nicht aktualisiert werden", + "ORG_ZSTACK_SCHEDULER_10002": "Die vorherige Aufgabe wurde nicht erfolgreich abgeschlossen. Diese Aufgabe wird übersprungen.", + "ORG_ZSTACK_COMPUTE_HOST_10114": "Host[uuid:%s, status:%s] kann nicht verwaltet werden, da er nicht verbunden ist", + "ORG_ZSTACK_COMPUTE_HOST_10111": "WebSSH-Server-Instanz ist nicht aktiv. Bitte stellen Sie sicher, dass Ihr Cloud-SSH-Server (%s) läuft und korrekt konfiguriert ist.", + "ORG_ZSTACK_COMPUTE_HOST_10110": "Es liegt ein Host-Netzwerkdiensttyp[%s] vor", + "ORG_ZSTACK_COMPUTE_HOST_10113": "managementIp[%s] ist keine gültige IPv4-Adresse oderHostname", + "ORG_ZSTACK_COMPUTE_HOST_10112": "Es liegt ein Host mit der Management-IP[%s] vor", + "ORG_ZSTACK_SCHEDULER_10018": "Der VM wurde bereits ein Auftrag vom Typ [%s] zugewiesen", + "ORG_ZSTACK_SCHEDULER_10016": "Die VM mit dem Root-Volume [%s] ist nicht verfügbar. Bitte überprüfen Sie, ob die VM existiert.", + "ORG_ZSTACK_SCHEDULER_10017": "snapshotGroupMaxNumber: Das Format ist aufgrund von %s falsch", + "ORG_ZSTACK_SCHEDULER_10014": "Das Volume[%s] ist nicht verfügbar. Bitte überprüfen Sie, ob das Volume existiert und korrekt angeschlossen ist.", + "ORG_ZSTACK_SCHEDULER_10015": "Das Volume[%s] ist kein Root-Volume", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10068": "Kein Volume in migrateVolumeStructs gefunden während der Migration zwischen Shared-Block-Group-Primärspeicher!", + "ORG_ZSTACK_SCHEDULER_10013": "Das Feld[%s] darf für die Cloud-Instanzkonfiguration nicht leer sein", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10067": "Leere Volume-Migrationsstrukturen in migrateVolumesBetweenSharedBlockGroupPrimaryStorageMsg!", + "ORG_ZSTACK_VPCFIREWALL_10027": "Der ruleSet[%s] enthält bereits eine Regel mit der angegebenen Regelnummer %s.", + "ORG_ZSTACK_IPSEC_10006": "Das Netzwerk [UUID: %s] hat keinen IPsec-Dienst aktiviert.", + "ORG_ZSTACK_VPCFIREWALL_10028": "Firewall-Regel[%d] konnte nicht hinzugefügt werden, nur TCP oder UDP-Protokoll können Ports verwenden", + "ORG_ZSTACK_IPSEC_10007": "Die remote CIDR[%s] überschneidet sich mit vorhandenen CIDRs", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10000": "Neu hinzugefügte VM-NICs und angeschlossene VM-NICs befinden sich nicht auf demselben virtuellen Router; sie befinden sich auf verschiedenen virtuellen Routern mit UUIDs: %s und %s.", + "ORG_ZSTACK_IPSEC_10008": "Die remote CIDR[%s] und remote CIDR[%s] überschneiden sich", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10001": "Neu hinzugefügte VM-NICs[uuids:%s] und Peer-L3-Netzwerke[uuids:%s] des VIP des Lastenverteilers[uuid: %s] befinden sich nicht auf demselben virtuellen Router, sie befinden sich auf verschiedenen virtuellen Routern mit UUIDs[uuids:%s]", + "ORG_ZSTACK_IPSEC_10009": "Die CIDR[%s] des lokalen Routers und die CIDR[%s] des Remote-Routers überschneiden sich", + "ORG_ZSTACK_IPSEC_10002": "Der aktuelle Portbereich [%s, %s] überschneidet sich mit dem verwendeten Portbereich [%s, %s] für VIP [uuid: %s] Protokoll: UDP", + "ORG_ZSTACK_IPSEC_10003": "cidr[%s] des angeschlossenen L3-Netzwerks [uuid:%s] überschneidet sich mit ipsec remote cidr[%s] von uuid:%s", + "ORG_ZSTACK_VPCFIREWALL_10029": "Firewall-Regel[%d] konnte nicht hinzugefügt werden, nur TCP-Protokoll kann TCP-Flags verwenden", + "ORG_ZSTACK_IPSEC_10005": "Die Quelldatei für den Java-Code wurde nicht gefunden. Bitte stellen Sie sicher, dass die erforderlichen Dateien hochgeladen und in Ihr Projekt aufgenommen wurden.", + "ORG_ZSTACK_VPCFIREWALL_10020": "Der Standard-Regelsatz kann nicht an eine andere Netzwerkschnittstellenkarte angehängt werden", + "ORG_ZSTACK_IPSEC_10000": "Die IPsec-Verbindung [UUID:%s] konnte nicht gefunden werden, sie wurde möglicherweise gelöscht", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10006": "vmnic muss für das Freigeben von Lastenverteiler-Ressourcen angegeben werden.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10073": "Die VM [UUID: %s] hat keinen zusätzlichen QMP-Socket konfiguriert. Dies kann daran liegen, dass die VM ohne die globale Konfiguration [vm.additionalQmp] gestartet wurde. Bitte stellen Sie sicher, dass diese Konfiguration aktiviert ist, und starten Sie die VM in ZStack neu.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10007": "virtuellen Router für Load Balancer nicht gefunden [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10072": "primärer Speicher [UUID: %s] hat SCSI LUN angehängt [WWID: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10071": "kann keinen geeigneten Hypervisor-Typ für primären Speicher [uuid:%s] finden, um Bildformat oder Volumeformat [%s] zu verarbeiten", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10004": "Load Balancer-Zertifikat erneuern wegen:%s", + "ORG_ZSTACK_VPCFIREWALL_10021": "ruleSet[%s] enthält bereits ein l3[%s]", + "ORG_ZSTACK_SCHEDULER_10009": "Trigger-Job[uuid: %s] fehlgeschlagen, da ein Fehler während der Bereitstellung der virtuellen Maschine aufgetreten ist", + "ORG_ZSTACK_ZWATCH_MYSQL_10001": "keine MySQL-Datenbankinstanz gefunden[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10005": "Load Balancer-Listener erneuern wegen:%s", + "ORG_ZSTACK_VPCFIREWALL_10022": "hat bereits eine Regel mit der Nummer[%s]", + "ORG_ZSTACK_SCHEDULER_10029": "Job[uuid:%s] kann nicht zu einem veralteten Trigger[uuid:%s] hinzugefügt werden", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10077": "Shared Volume[uuid: %s] auf Shared Block Group primärem Speicher kann nicht vergrößert werden", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10076": "Volume[uuid: %s] nicht gefunden", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10075": "Shared Block[UUID:%s, diskUUID:%s, description:%s] existiert bereits innerhalb der Shared Block Group[UUID:%s] in der neuen Shared Block Group", + "ORG_ZSTACK_SCHEDULER_10028": "Job mit UUID [%s] kann nicht zweimal zum selben Trigger mit UUID [%s] hinzugefügt werden", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10074": "muss mindestens eine Festplatte angeben, wenn eine Shared Block Group für primären Speicher hinzugefügt wird", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10079": "kann die Vorbereitung des Volumes[%s] nicht finden", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10078": "Shared Volume[UUID: %s] auf Shared Block Group primärem Speicher ist an nicht-gestoppte VM-Instanzen angehängt[UUIDs: %s]", + "ORG_ZSTACK_SCHEDULER_10021": "Intervall muss angegeben werden, wenn ein einfacher Scheduler für wiederholte Operationen mehr als einmal verwendet wird", + "ORG_ZSTACK_VPCFIREWALL_10016": "Nur TCP- oder UDP-Protokolle können Ports in Cloud-Computing-Umgebungen nutzen.", + "ORG_ZSTACK_VPCFIREWALL_10017": "Nur TCP-Protokoll kann TCP-Flags nutzen.", + "ORG_ZSTACK_IPSEC_10018": "der VIP[uuid:%s] wurde für %s Instanz(en) verwendet", + "ORG_ZSTACK_VPCFIREWALL_10014": "das ruleSet[%s] hat bereits eine Regel mit derselben Priorität %d.", + "ORG_ZSTACK_IPSEC_10019": "die Peer-Adresse[%s] kann nicht dieselbe wie die VIP-Adresse sein", + "ORG_ZSTACK_VPCFIREWALL_10015": "Standardregel[%s] kann nicht aktualisiert werden", + "ORG_ZSTACK_IPSEC_10013": "Alle Netzwerke innerhalb derselben IPsec-Verbindung müssen mit demselben Virtual Private Cloud (VPC)-Router verbunden sein.", + "ORG_ZSTACK_IPSEC_10014": "Es gibt keinen Master-VPC für HA-Gruppe %s", + "ORG_ZSTACK_VPCFIREWALL_10018": "ICMP-Protokoll ist das einzige Protokoll, das ICMP-Typen verwenden kann. Bitte stellen Sie sicher, dass Ihr Code das richtige Protokoll angibt.", + "ORG_ZSTACK_IPSEC_10015": "Es gibt einen VPC[%s], der ein altes IPsec-Plugin verwendet; bitte aktualisieren Sie ihn, um eine IPsec-Verbindung zu erstellen.", + "ORG_ZSTACK_VPCFIREWALL_10019": "der Regelindex [%%s] ist ungültig", + "ORG_ZSTACK_IPSEC_10016": "Es gibt bereits eine IPsec-Verbindung[uuid:%s, name:%s] mit demselben virtuellen Router und Peer-Adresse.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10080": "thick-provisioned Speicher als Cache-Volume verwenden; die Bereitstellung von Volume [%s] ist %s", + "ORG_ZSTACK_IPSEC_10010": "Alle Netzwerke innerhalb derselben IPsec-Verbindung müssen vom selben Typ sein.", + "ORG_ZSTACK_IPSEC_10011": "IPsecConnection kann nur 1 Netzwerk für %s haben", + "ORG_ZSTACK_IPSEC_10012": "L3Network [UUID: %s] wurde nicht an einen VPC-Router angehängt", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10084": "kann Cluster-UUID von Volume %s nicht abrufen", + "ORG_ZSTACK_VPCFIREWALL_10010": "hat bereits eine Regenvorlage mit dem Namen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10081": "Die SCSI LUN mit UUID [%s] und WWID [%s] ist bereits an den Primärspeicher mit UUID [%s] angehängt.", + "ORG_ZSTACK_SCHEDULER_10038": "Ungültiges Cron-Ausdrucksformat. Bitte stellen Sie sicher, dass es der standard CRON-Syntax entspricht.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10086": "kann keinen qualifizierten KVM-Host für den Primärspeicher der gemeinsamen Blockgruppe finden[uuid: %s]", + "ORG_ZSTACK_SCHEDULER_10039": "Eine Cron-Aufgabe muss dem Format folgen: \"0 0/3 17-23 * * ?\"", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10085": "sanlock zeigt an, dass der Host %s auf %s nicht erreichbar ist", + "ORG_ZSTACK_SCHEDULER_10036": "stopTime hat die aktuelle Zeit in der virtuellen Umgebung überschritten. Bitte stellen Sie sicher, dass stopTime auf einen zukünftigen Zeitpunkt eingestellt ist.", + "ORG_ZSTACK_SCHEDULER_10037": "cron muss konfiguriert werden, wenn der cron-Scheduler verwendet wird", + "ORG_ZSTACK_SCHEDULER_10034": "Duration-Timeout außerhalb des gültigen Bereichs", + "ORG_ZSTACK_SCHEDULER_10035": "stopTime überschreitet den gültigen Bereich für das MySQL-Timestamp-Format", + "ORG_ZSTACK_SCHEDULER_10032": "startTime muss für den einfachen Scheduler angegeben werden, um korrekt zu funktionieren.", + "ORG_ZSTACK_SCHEDULER_10033": "schedulerInterval muss für den einfachen Scheduler konfiguriert werden, um ordnungsgemäß zu funktionieren.", + "ORG_ZSTACK_SCHEDULER_10030": "Es wurden [%d] Trigger zu Job[uuid:%s] hinzugefügt, was die maximal zulässigen Trigger überschreitet.", + "ORG_ZSTACK_SCHEDULER_10031": "Es wurden [%d] Trigger zur Jobgruppe [UUID:%s] hinzugefügt, und es können keine weiteren Trigger hinzugefügt werden.", + "ORG_ZSTACK_VPCFIREWALL_10005": "der Router [uuid:%s] hat keinen Master-Router", + "ORG_ZSTACK_VPCFIREWALL_10006": "der VPC-Router[uuid:%s] hat bereits eine Firewall konfiguriert.", + "ORG_ZSTACK_VPCFIREWALL_10003": "Systemsatz für Standardregeln kann nicht gelöscht werden", + "ORG_ZSTACK_VPCFIREWALL_10004": "Standard-Systemregel kann nicht gelöcht werden", + "ORG_ZSTACK_VPCFIREWALL_10001": "Nur systemdefinierte Regelsätze können Aktionstypen ändern.", + "ORG_ZSTACK_VPCFIREWALL_10000": "kann den Standardregelsatz im virtuellen Netzwerk nicht trennen", + "ORG_ZSTACK_SCHEDULER_10045": "Jobgruppe enthält %d Aufgaben, nur %d Steckplätze verfügbar", + "ORG_ZSTACK_SCHEDULER_10043": "Kein Scheduler-Job-Fabriktyp[%s] gefunden", + "ORG_ZSTACK_SCHEDULER_10044": "%d Aufgaben haben verschiedene Instanztypen von der Jobgruppe", + "ORG_ZSTACK_SCHEDULER_10041": "startTime muss eine positive ganze Zahl oder 0 sein", + "ORG_ZSTACK_SCHEDULER_10042": "Die angegebene Startzeit für Ihre Instanz liegt außerhalb des gültigen Bereichs. Stellen Sie sicher, dass sie innerhalb der gültigen Parameter liegt.", + "ORG_ZSTACK_SCHEDULER_10040": "Cron-Scheduler-Konfiguration erfordert nur die Angabe des Cron-Task-Ausdrucks.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10005": "Bitte integrieren Sie zbox in den Management-Knoten für die Cloud-Ressourcenzuweisung.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10006": "Datenbank-Backup fehlgeschlagen: %s", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10003": "service[%s] ist nicht aktiv", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10007": "Es gibt ein weiteres externes Backup [UUID: %s] im Wiederherstellungsmodus.", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10002": "service[%s] unterstützt kein Neuladen der Konfiguration", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10008": "Sowohl Host-UUIDs als auch Backup-Speicher-UUIDs sind leer. Sie müssen mindestens eines davon angeben.", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10001": "service[%s] wurde nicht erkannt", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10001": "Einige Volume-Wiederherstellungen[uuids:%s] fehlgeschlagen. Sie können sie erneut auslösen, indem Sie es wieder verbinden.", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10000": "service[%s] wurde registriert und ist nun in der Cloud-Umgebung aktiv", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10002": "Konfigurationsdatei recover.conf kann nicht unter dem zbox-Backup-Installationsverzeichnis gefunden werden.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10004": "Zbox muss zuerst an einen Host angehängt werden.", + "ORG_ZSTACK_VPCFIREWALL_10069": "VPC-Firewall-IP-Set-Template mit UUID: %s kann nicht gefunden werden, es wurde möglicherweise gelöscht", + "ORG_ZSTACK_VPCFIREWALL_10063": "Firewall-Regelsatz[%s] anhängen fehlgeschlagen aufgrund eines Fehlers im Zusammenhang mit der virtuellen Netzwerkkonfiguration", + "ORG_ZSTACK_VPCFIREWALL_10064": "detach ruleSet fehlgeschlagen, möglicherweise aufgrund einer Löschung", + "ORG_ZSTACK_VPCFIREWALL_10061": "Firewall-Regel löschen fehlgeschlagen auf vRouter[%s], aufgrund von %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10010": "Fn::Select Index außerhalb des Bereichs, bitte überprüfen Sie Ihre JSON-Konfiguration!", + "ORG_ZSTACK_VPCFIREWALL_10062": "Firewall-Regelstatus auf vRouter[%s] ändern fehlgeschlagen aufgrund von %s", + "ORG_ZSTACK_VPCFIREWALL_10067": "VPC-Firewall mit UUID: %s kann nicht gefunden werden, die mit dem virtuellen Router zusammenhängt", + "ORG_ZSTACK_VPCFIREWALL_10068": "VPC-Firewall-Regelsatz mit UUID: %s kann nicht gefunden werden, er wurde möglicherweise gelöscht", + "ORG_ZSTACK_VPCFIREWALL_10065": "Firewall-Regelsatz[%s] trennen fehlgeschlagen, weil %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10014": "Parameter [%s] nicht gefunden!", + "ORG_ZSTACK_VPCFIREWALL_10066": "VPC-Firewall mit UUID: %s kann nicht gefunden werden, sie wurde möglicherweise gelöscht", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10013": "Parameter [%s] hat keinen angegebenen Wert oder Standardwert gefunden!", + "ORG_ZSTACK_VPCFIREWALL_10060": "Firewall-Regelsatz[%s] erstellen fehlgeschlagen, weil %s", + "ORG_ZSTACK_IMAGE_10046": "Das Image mit UUID [uuid:%s] und Name [name:%s] wurde nicht vom Backup-Speicher mit UUID [uuid:%s] gelöscht.", + "ORG_ZSTACK_IMAGE_10045": "Das Image mit UUID [uuid:%s] und Name [name:%s] ist auf dem Backup-Speicher mit UUID [uuid:%s] nicht verfügbar.", + "ORG_ZSTACK_IMAGE_10044": "Das Image mit UUID [uuid:%s] und Name [name:%s] wurde von keinem Backup-Speicher gelöscht.", + "ORG_ZSTACK_IMAGE_10043": "Das Image mit UUID [uuid:%s] und Name [name:%s] hat den Status [status:%s] auf dem Backup-Speicher mit UUID [backup storage uuid:%s], der nicht Gelöscht ist.", + "ORG_ZSTACK_IMAGE_10040": "ISO mit uuid=%s trennen fehlgeschlagen, Fehler sind %s", + "ORG_ZSTACK_VPCFIREWALL_10058": "Firewall-Regel auf vRouter[%s] löschen, weil %s", + "ORG_ZSTACK_VPCFIREWALL_10052": "Standardregelsatz %s kann nur an eine Schnittstelle weitergeleitet werden, aber mehrere zugehörige Schnittstellen wurden gefunden: %s", + "ORG_ZSTACK_VPCFIREWALL_10050": "Firewall %s zugehörige VPC nicht im Status \"Wird ausgeführt\"", + "ORG_ZSTACK_VPCFIREWALL_10051": "Regelsatz [%s] kann nicht gelöscht werden, da er noch an eine Netzwerkschnittstellenkarte angeschlossen ist", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10020": "Bedingung [%s] kann nicht in der Liste 'Conditions' gefunden werden", + "ORG_ZSTACK_VPCFIREWALL_10056": "MAC-Adresse für l3[%s] auf vRouter[%s] kann nicht gefunden werden", + "ORG_ZSTACK_VPCFIREWALL_10057": "Firewall-Regel[%s] konnte aufgrund von %s nicht erstellt werden", + "ORG_ZSTACK_VPCFIREWALL_10054": "Firewall-Konfiguration synchronisieren fehlgeschlagen, weil %s", + "ORG_ZSTACK_VPCFIREWALL_10055": "Regelsatz-Aktion für Firewall aktualisieren fehlgeschlagen, weil %s", + "ORG_ZSTACK_VPCFIREWALL_10049": "Keine Änderungen in Regelsatz %s erkannt", + "ORG_ZSTACK_VPCFIREWALL_10047": "Firewall-Regelsatz von Netzwerk[%s] trennen fehlgeschlagen, weil %s", + "ORG_ZSTACK_VPCFIREWALL_10048": "Doppelte Regelnummer %s auf Firewall %s, l3 %s, forward %s gefunden", + "ORG_ZSTACK_SSO_CAS_SERVICE_10002": "iam2 enthält einen Benutzer mit demselben Namen[%s]", + "ORG_ZSTACK_SSO_CAS_SERVICE_10003": "Doppelter Anmeldeversuch für Benutzertyp[%s]", + "ORG_ZSTACK_SSO_CAS_SERVICE_10004": "CasLogin für Typ(%s) kann nicht gefunden werden", + "ORG_ZSTACK_VPCFIREWALL_10041": "Firewall-Regel konnte nicht hinzugefügt werden, weil die Beschreibungsänge von %s für Regelnummer %d nicht gültig ist", + "ORG_ZSTACK_VPCFIREWALL_10040": "Firewall-Regel konnte nicht hinzugefügt werden, weil kein Status für Regelnummer:%d vorhanden ist", + "ORG_ZSTACK_VPCFIREWALL_10045": "Die Firewall-Regeln in der Konfigurationsdatei enthalten Syntaxfehler: %s", + "ORG_ZSTACK_VPCFIREWALL_10046": "Firewall-Regelsatz[%s] an Layer-3-Netzwerk[%s] anfügen fehlgeschlagen, weil %s", + "ORG_ZSTACK_VPCFIREWALL_10044": "Die Konfigurationsdatei für die virtuelle Maschineninstanz hat einen Formatfehler. Bitte überprüfen Sie die Datei und stellen Sie sicher, dass sie dem erforderlichen Schema entspricht.", + "ORG_ZSTACK_VPCFIREWALL_10038": "Firewall-Regel konnte nicht hinzugefügt werden, weil Quell-IP-Länge: %s für Regelnummer: %d nicht gültig ist", + "ORG_ZSTACK_VPCFIREWALL_10039": "Firewall-Regel konnte nicht hinzugefügt werden, weil Ziel-IP-Länge: %s für Regelnummer: %d nicht gültig ist", + "ORG_ZSTACK_VPCFIREWALL_10036": "Firewall-Regel konnte nicht hinzugefügt werden, weil Regelnummer %d ungültig ist", + "ORG_ZSTACK_VPCFIREWALL_10037": "Firewall-Regel konnte nicht hinzugefügt werden, weil keine Aktion für RegelNo:%d definiert ist", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10002": "vyos-Initialisierungsbefehl fehlgeschlagen, weil:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10001": "SSH-Verbindung zum virtuellen Router[%s] kann nach dem Konfigurieren der SSH-Einstellungen nicht hergestellt werden", + "ORG_ZSTACK_VPCFIREWALL_10030": "Firewall-Regel[%d] konnte nicht hinzugefügt werden, da nur ICMP-Protokoll spezifische Typen unterstützt", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10003": "Standardaktion für Firewall der Netzwerkschnittstelle [ip:%s, mac:%s] für virtuellen Router [uuid:%s] konnte nicht geändert werden, weil %s", + "ORG_ZSTACK_VPCFIREWALL_10031": "Firewall-Regel[%d] konnte nicht hinzugefügt werden, da nur TCP- oder UDP-Protokolle für portbasierte Regeln unterstützt werden", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10006": "DHCP-Server auf virtueller Router-VM[uuid:%s] kann nicht gestartet werden, weil %s", + "ORG_ZSTACK_ZWATCH_FUNCTION_10014": "fehlendes erforderliches Argument für Instanztyp in Cloud-Formation-Vorlage", + "ORG_ZSTACK_ZWATCH_FUNCTION_10013": "Unbekannte Argumente erkannt. Bitte stellen Sie sicher, dass alle Befehlszeilenparameter gültig sind und konsultieren Sie die Dokumentation für eine Liste der akzeptierten Argumente.", + "ORG_ZSTACK_VPCFIREWALL_10034": "Firewall-Regel[%d] konnte nicht hinzugefügt werden, da nur das TCP-Protokoll TCP-Flags in dieser Umgebung unterstützt", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10007": "DHCP-Server auf virtueller Router-Instanz [uuid:%s] kann nicht gestoppt werden, weil %s", + "ORG_ZSTACK_VPCFIREWALL_10035": "Firewall-Regel[%d] konnte wegen eines %s-Fehlers nicht hinzugefügt werden", + "ORG_ZSTACK_CONTAINER_10034": "Fehler beim Ersetzen der Bereitstellung wegen %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10040": "Konvertierung der Bilddaten auf lokale Festplatte fehlgeschlagen. Stellen Sie ausreichende Speicherressourcen und korrekte Berechtigungen sicher. Falls das Problem weiterhin besteht, sollten Sie Objektspeicherdienste für die Bildverwaltung in Betracht ziehen.", + "ORG_ZSTACK_CONTAINER_10051": "Kubernetes-Client für Konto[uuid:%s] nicht gefunden", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10033": "Anfügen der bereitgestellten Netzwerkkarte an das Bonding auf baremetal-Instanz [uuid:%s] über Gateway [uuid:%s] fehlgeschlagen, weil %s", + "ORG_ZSTACK_IMAGEREPLICATOR_10000": "Ziel-Backup-Speicher[uuid:%s] ist nicht mehr nutzbar", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10042": "check-all-security-machine-token-exist für alle virtuellen Maschinen fehlgeschlagen", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10002": "Das Volume mit UUID %s ist das Root-Volume der VM mit UUID %s. Die VM befindet sich derzeit im Status %s. Bitte stoppen Sie die VM, bevor Sie die Migration starten.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10048": "Fehler beim Erstellen der Bereitstellungskonfigurationen für Bare-Metal-Instanz[uuid:%s] im Gateway[uuid:%s], weil %s", + "ORG_ZSTACK_VMWARE_10029": "Anmeldung fehlgeschlagen. Bitte überprüfen Sie Ihre Zugangsdaten und stellen Sie sicher, dass Sie die richtigen Anmeldeparameter für Cloud-Computing-Dienste verwenden.", + "ORG_ZSTACK_LONGJOB_10010": "Langjobs können nur erneut ausgeführt werden, wenn sie erfolgreich waren, abgebrochen oder fehlgeschlagen sind", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10125": "cloud ist nicht in der Lage, den Load Balancer-Listener zu modifizieren, da nur TCP-Proxy-Protokoll %s unterstützt wird.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10123": "cloud ist nicht in der Lage, den Load Balancer-Listener zu modifizieren, da das HTTPS-Protokoll nur die HTTP-Version [%s] unterstützt.", + "ORG_ZSTACK_GUESTTOOLS_10032": "Gast-Tools-Status für VM [uuid:%s] kann nicht aktualisiert werden, da die VM gelöscht wurde", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10035": "Abrufen des iSCSI-Target-IQN oder Gateway-IP für Volume [uuid:%s] von Primärspeicher [uuid:%s] fehlgeschlagen", + "ORG_ZSTACK_VMWARE_10027": "VCenter[uuid:%s] nicht gefunden: Virtualisierungsumgebung mit der angegebenen UUID existiert nicht.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10054": "vm[uuid:%s] befindet sich nicht im Zustand Running, Paused oder Stopped; aktueller Zustand ist %s", + "ORG_ZSTACK_TAG_10004": "Keine System-Tags stimmen [%s] für Ressourcentyp [%s] überein.", + "ORG_ZSTACK_LOG_10006": "Unbekannter Konfigurationstyp für Log-Server %s.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10049": "Fehler beim Löschen der Bereitstellungskonfigurationen für Bare-Metal-Instanz[uuid:%s] im Gateway[uuid:%s], weil %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10001": "Der Ziel-Host mit UUID [%s] gehört nicht zum lokalen primären Speicher mit UUID [%s], auf dem sich das Volume mit UUID [%s] befindet.", + "ORG_ZSTACK_LONGJOB_10011": "Ein Langjob kann nur fortgesetzt werden, wenn er sich im Zustand \"Angehalten\" befindet", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10126": "cloud unterstützt das Ändern des Load Balancer-Listeners nicht, da der Listener mit dem Protokoll [%s] das Komprimieren von Inhalten nicht unterstützt.", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10004": "", + "ORG_ZSTACK_SSHKEYPAIR_10002": "Öffentlichen Schlüssel konnte nicht geladen werden: %s, Fehler: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10032": "baremetal2-Instanz[uuid:%s] ist nicht verbunden; daher kann keine bereitgestellte Netzwerkkarte an ein Bond angehängt werden.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10124": "cloud ist nicht in der Lage, den Load Balancer-Listener zu modifizieren, da ein TCP-Protokoll-Listener nur TCP-Proxy für Parametereinstellungen unterstützt.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10037": "chassis:%s Festplatte hat keine WWN-Informationen, bitte untersuchen Sie das Chassis und versuchen Sie es erneut", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10121": "Das HTTP-Health-Check-Protokoll muss angegeben werden. Bitte fügen Sie die Parameter für die Gesundheitsprüfung hinzu, wie z. B. healthCheckMethod und healthCheckURI.", + "ORG_ZSTACK_ZBOX_10005": "zbox[UUID:%s] wird noch verwendet; kann nicht ausgeworfen werden.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10031": "Trennen der bereitgestellten Netzwerkkarte vom Bonding auf baremetal-Instanz [uuid:%s] über Gateway [uuid:%s] fehlgeschlagen, weil %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10005": "", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10004": "Das Volume mit UUID [%s] ist bereits an den Host mit UUID [%s] angeschlossen.", + "ORG_ZSTACK_LOG_10005": "Das Konto [uuid:%s] hat nicht die Berechtigung, zusätzliche Log-Server hinzuzufügen. Nur Administratorkonten besitzen dieses Privileg.", + "ORG_ZSTACK_ALIYUN_OSS_10002": "AWS-Zugriffsschlüssel-ID, geheimer Zugriffsschlüssel und Region müssen gleichzeitig gesetzt werden.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10003": "", + "ORG_ZSTACK_CONTAINER_10032": "Fehler beim Patchen der Bereitstellung wegen %s", + "ORG_ZSTACK_ZBOX_10004": "Es können keine Hosts die erforderliche Speicherkapazität für alle Volumes der VM [UUID:%s] bereitstellen.", + "ORG_ZSTACK_ALIYUN_OSS_10003": "OSS-Bucket ist nicht leer! Bitte stellen Sie sicher, dass der Bucket leer ist, bevor Sie den Vorgang fortsetzen.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10008": "Das Datenträger-Volume [UUID: %s, name: %s] ist noch an die virtuelle Maschine [UUID: %s] angeschlossen. Bitte trennen Sie es, bevor Sie die Migration starten.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10045": "Fehler beim Vorbereiten des Bereitstellungsnetzwerks im Gateway[uuid:%s], weil %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10030": "baremetal2-Instanz[uuid:%s] ist nicht verbunden; daher kann die bereitstellende Netzwerkkarte nicht von der Bonding-Konfiguration getrennt werden.", + "ORG_ZSTACK_LONGJOB_10009": "Löschen Sie langlaufende Jobs nur, wenn sie erfolgreich, abgebrochen oder fehlgeschlagen sind.", + "ORG_ZSTACK_IMAGEREPLICATOR_10001": "Ein oder mehrere Backup-Speicher[uuids:%s] wurden der Replikationsgruppe[uuid:%s] hinzugefügt.", + "ORG_ZSTACK_ZBOX_10006": "", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10044": "unterstützt derzeit nicht die Erstellung von %s-Ressourcen-Pools in dieser Umgebung", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10041": "baremetal2-Instanz [uuid:%s] Volume-Konvertierung auf Chassis [uuid:%s] fehlgeschlagen, Timeout nach %d Minuten", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10127": "cloud ist nicht in der Lage, den Load Balancer-Listener zu modifizieren, da nur Komprimierungsalgorithmen [%s] unterstützt werden.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10041": "Subject-Distinguished-Name konnte nicht aus dem öffentlichen Schlüssel extrahiert werden: %s", + "ORG_ZSTACK_SDNCONTROLLER_10026": "Pull-Tenant-Operation wird für SDN-Controller [uuid:%s, vendorType:%s, vendorVersion:%s] nicht unterstützt. Nur H3C VCFC V2-Controller unterstützen diese Operation.", + "ORG_ZSTACK_IMAGEREPLICATOR_10003": "Backup-Speicher [UUIDs:%s] ist keiner Zone zugeordnet", + "ORG_ZSTACK_LOG_10007": "Unbekannter Log-Konfigurationstyp %s.", + "ORG_ZSTACK_SSHKEYPAIR_10006": "", + "ORG_ZSTACK_ALIYUN_OSS_10001": "OssBucket[%s] ist nicht zugeordnet.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10128": "Ungültige IP-Version [%s], sie muss IPv4 oder IPv6 sein.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10122": "cloud ist nicht in der Lage, den Load Balancer-Listener zu modifizieren, da der Listener mit dem Protokoll [%s] das Auswählen der HTTP-Version [%s] nicht unterstützt.", + "ORG_ZSTACK_ZBOX_10001": "der primäre Speicher [UUID:%s] wurde nicht gefunden", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10010": "Sowohl Export-ID als auch Build-Anwendungs-UUID sind gesetzt, stimmen aber nicht überein. Bitte überprüfen Sie die Werte von %s und %d.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10055": "Primärspeicher mit UUID:%s ist keinem Cluster zugeordnet", + "ORG_ZSTACK_CONTAINER_10029": "API-Fehler: Die Quelldatei wurde im Cloud-Speichersystem nicht gefunden. Bitte überprüfen Sie den Dateipfad und versuchen Sie es erneut.", + "ORG_ZSTACK_TAG_10005": "Validieren von System-Tag [%s] für Ressourcentyp [%s] fehlgeschlagen.", + "ORG_ZSTACK_SDNCONTROLLER_10011": "Tenant-Abrufvorgang wird nur für H3C VCFC V2X-Controller unterstützt", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10043": "InfoSecClientFactory-Verbindungstest fehlgeschlagen", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10058": "Der NFS-Primärspeicher [uuid:%s, name:%s] kann keinen verwendbaren Host zum Erstellen des Datenträgers [uuid:%s, name:%s] finden", + "ORG_ZSTACK_ALIYUN_OSS_10000": "ossBucket [%s] ist bereits im dataCenter [%s] registriert", + "ORG_ZSTACK_SSHKEYPAIR_10003": "", + "ORG_ZSTACK_GUESTTOOLS_10031": "Ungültiger Debug-Parameter: %s", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10000": "zbox[UUID:%s] befindet sich nicht im Status \"Ready\" und kann daher die Kapazität nicht synchronisieren.", + "ORG_ZSTACK_SDNCONTROLLER_10028": "SDN-Controller konnte nicht geändert werden, da VLAN-Bereich [%s] nicht im richtigen Format ist.", + "ORG_ZSTACK_SDNCONTROLLER_10012": "Abrufen der Tenant-Daten fehlgeschlagen: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10040": "Verschlüsselten öffentlichen Schlüssel konnte nicht geparst werden", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10009": "", + "ORG_ZSTACK_LONGJOB_10008": "Ein langlaufender Job, der fehlgeschlagen ist, kann nicht abgebrochen werden", + "ORG_ZSTACK_LONGJOB_10012": "%s hat keinen entsprechenden langlaufenden Task", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10005": "", + "ORG_ZSTACK_SDNCONTROLLER_10013": "Netzwerkkarte konnte nicht zur Sicherheitsgruppe hinzugefügt werden, da sie unterschiedliche SDN-Controller haben [Netzwerkwerk-Controller-UUID: %s, Sicherheitsgruppen-Controller-UUID: %s]", + "ORG_ZSTACK_IMAGEREPLICATOR_10002": "Backup-Speicher[uuids:%s] ist nicht vom Typ ImageStoreInstance", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10120": "Der Listener mit dem Protokoll [%s] ist nicht mit diesem Health Check [%s] kompatibel.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10000": "Der primäre Speicher [UUID:%s] ist deaktiviert oder die Cold-Migration während der Wartung ist nicht erlaubt.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10047": "Keine bereitgestellte NIC für Bare-Metal-Instanz[uuid:%s] gefunden", + "ORG_ZSTACK_GUESTTOOLS_10030": "Gast-Tools-Informationen können nicht von VM [UUID:%s] abgerufen werden, da es sich nicht um eine Benutzer-VM handelt", + "ORG_ZSTACK_LONGJOB_10007": "Ein langlaufender Job, der bereits erfolgreich war, kann nicht abgebrochen werden", + "ORG_ZSTACK_SSHKEYPAIR_10005": "Aliyun-Konto [UUID:%s] existiert nicht", + "ORG_ZSTACK_CONTAINER_10026": "Fehler beim Löschen des Dienstes wegen %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10129": "Das Löschen der Standard-Servergruppe [uuid:%s] ist nicht erlaubt.", + "ORG_ZSTACK_ZBOX_10003": "", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10007": "Das Volume mit UUID [%s] befindet sich nicht im Status 'Ready'; daher kann es nicht migriert werden.", + "ORG_ZSTACK_SDNCONTROLLER_10025": "SDN-Controller [UUID:%s] nicht gefunden.", + "ORG_ZSTACK_ZBOX_10002": "", + "ORG_ZSTACK_BILLING_10020": "Das Konto[uuid=%s] hat eine Preisliste angehängt", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10046": "Fehler beim Zerstören des Bereitstellungsnetzwerks im Gateway[uuid:%s], weil %s" +} \ No newline at end of file diff --git a/conf/i18n/globalErrorCodeMapping/global-error-en_US.json b/conf/i18n/globalErrorCodeMapping/global-error-en_US.json new file mode 100644 index 00000000000..bc347c410c5 --- /dev/null +++ b/conf/i18n/globalErrorCodeMapping/global-error-en_US.json @@ -0,0 +1,4717 @@ +{ + "ORG_ZSTACK_XINFINI_SDK_10001": "format API response to class[%s] failed, resultString: %s, exception: %s", + "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10001": "not supported datacenter type [%s] here!", + "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10000": "arg \u0027endpoint\u0027 must be set for %s configuration type", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10080": "The Baremetal2 instance creation cannot determine an appropriate compute zone. Please specify a zone explicitly.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10084": "Neither chassis UUID nor chassis offering UUID is set when creating a baremetal instance.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10082": "chassis does not have sufficient capacity for image[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10081": "required disk[%s] does not belong to chassis[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10087": "A %s can only be created or deleted when the Baremetal2 instance is in a Running state.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10086": "%s can only be managed through create or delete operations", + "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10000": "Incorrect input format. Only a comma-separated list of numbers is accepted (e.g., %s).", + "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10001": "The host VM has only % CPUs available.", + "ORG_ZSTACK_ZWATCH_UTILS_10001": "resource[%s] does not support zwatch return with clause", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10002": "The identity authentication feature is enabled but the associated resource pool is not configured. Please configure the resource pool and try again.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10003": "cannot release the resource pool %s while it is in use", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10000": "There is no virtual machine that can be activated", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10001": "invalid token type %s, only supports tokens of types used in cloud computing environments.", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10059": "empty license for authorized nodes is required", + "ORG_ZSTACK_STORAGE_PRIMARY_10039": "no primary storage[uuid:%s] exists", + "ORG_ZSTACK_V2V_10019": "primary storage with UUID:%s is not supported for virtual machine migration v2v", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10007": "failed to transition volume snapshot [uuid:%s, name:%s] due to status event [%s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10006": "failed to retrieve volume[uuid:%s, installPath:%s] size from primary storage[uuid:%s], due to %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10005": "failed to retrieve volume[uuid:%s, installPath:%s] size from primary storage[uuid:%s], %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10004": "vm[uuid:%s] is not in a Running, Paused, Destroyed, or Stopped state; current state[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_10040": "primaryStorage[uuid\u003d%s] does not exist in the cloud environment", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10003": "volume not found for volume UUID: %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10002": "snapshot or its descendant has reference to volume[uuids:%s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10001": "cannot find volume snapshot [uuid:%s, name:%s], it may have been deleted by a previous operation", + "ORG_ZSTACK_STORAGE_PRIMARY_10047": "cidr[%s] Invalid Input Format", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10050": "ZSha2 indicates the presence of another management node; however, this node is not found in the database. Please verify the existence of the management node.", + "ORG_ZSTACK_STORAGE_PRIMARY_10046": "only one primary storage CIDR system tag is allowed, but %d got", + "ORG_ZSTACK_STORAGE_PRIMARY_10049": "clusterUuid conflict, the cluster specified by the instance offering is %s, and the cluster specified in the creation parameter is %s", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10052": "Unregister App ID not found! Please verify the App ID and try again.", + "ORG_ZSTACK_STORAGE_PRIMARY_10042": "Please specify the instance type and desired storage before provisioning resources.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10008": "unable to reset volume[uuid:%s] to snapshot[uuid:%s], the vm[uuid:%s] volume is not in Stopped state, current state is %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10044": "cannot find any qualified primary storage; errors are %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10000": "Failed to update group status: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10050": "primaryStorageUuid Conflict: The primary storage specified by the instance offering is %s, while the primary storage specified in the creation parameter is %s.", + "ORG_ZSTACK_V2V_10008": "Not allowed the same MAC address [%s] in network[%s]", + "ORG_ZSTACK_V2V_10009": "Duplicate MAC address [%s] in network[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_10052": "primaryStorageUuid Conflict: The primary storage specified by the disk offering is %s, while the primary storage specified in the creation parameter is %s.", + "ORG_ZSTACK_V2V_10006": "underlying compute instance of conversion host[uuid:%s] should be Connected", + "ORG_ZSTACK_V2V_10007": "conversion host[uuid:%s] cannot establish a connection to the primary storage[uuid:%s]", + "ORG_ZSTACK_V2V_10004": "VM instance [UUID:%s] does not exist or is not a VMware VM instance", + "ORG_ZSTACK_V2V_10005": "conversionHostUuid should not be null. Please ensure that a valid host UUID is provided.", + "ORG_ZSTACK_V2V_10002": "v2v conversion host storage path must be an absolute path. Please provide a valid absolute path.", + "ORG_ZSTACK_V2V_10003": "invalid v2v URL: %s", + "ORG_ZSTACK_V2V_10000": "The status of host [uuid:%s] must be Connected before proceeding with cloud deployment.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10021": "Cannot take memory snapshot, expected VM states are [%s, %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10020": "volume snapshot[uuids:%s] is in the disabled state and cannot be used for volume reversion.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10029": "failed to cancel deletion job. Volume[uuid:%s] attached VM not in state %s; offline snapshot deletion is not supported and cannot be canceled.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10028": "failed to cancel deletion job. Volume[uuid:%s] is associated with a non-existent virtual machine; offline snapshot deletion does not support cancellation.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10027": "failed to cancel deletion job. Volume[uuid:%s] is not attached to any VM, and offline snapshot deletion does not support cancellation.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10026": "failed to cancel deletion job. Volume[uuid:%s] does not exist.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10025": "cannot find volume UUID for snapshots[uuid: %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10024": "Not supported for deleting snapshots from different volumes [UUID: %s, %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10023": "original volume for snapshot [uuid:%s] has been deleted; unable to revert volume to original state", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10022": "volume snapshot [uuid:%s] is currently in state %s and cannot be used for volume revert", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10018": "cannot find snapshot: %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10017": "primary storage[uuid:%s] does not support volume snapshots; therefore, a snapshot for volume[uuid:%s] cannot be created.", + "ORG_ZSTACK_YUNSHAN_UTIL_10000": "The NSP URL is null, please configure the Cloud Computing Service NSP.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10016": "cannot request primary storage [uuid:%s] for volume snapshot capability", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10015": "cannot find type for primary storage [%s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10012": "Unsupported maximum snapshot count (%d) for volume [UUID:%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10027": "SanSecClientFactory connection test failed", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10019": "this resource type %s does not support querying memory snapshot references", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10007": "panguPartitionUuid [%s] does not match with identityZoneUuid [%s]", + "ORG_ZSTACK_APPLIANCEVM_10006": "appliance vm[uuid:%s] is in status %s that cannot make an HTTP call to %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10006": "panguPartitionUuid or identityZoneUuid must be specified.", + "ORG_ZSTACK_AI_10120": "model center [uuid:%s] not found in the cloud environment", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10008": "cannot delete identity zone [%s], as it still contains Aliyun Ebs Primary Storage instances, please ensure all related storage resources are deleted first.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10061": "could not modify security group rule because the protocol [%s] does not allow a blank destination port range", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10060": "could not modify security group rule because the protocol specified [%s] does not support setting a destination port range", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10063": "could not modify security group rule because a duplicate rule [%s] already exists in the database with UUID %s", + "ORG_ZSTACK_APPLIANCEVM_10000": "set appliance bootstrap information error because:%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10062": "could not modify security group rule because the protocol specified [%s] requires a destination port range to be set", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10033": "cannot delete instance offering [uuid:%s] as it is utilized by NFV instance groups [%s]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10001": "ALIYUN EBS DOES NOT SUPPORT RESIZING A RUNNING VM AT THIS TIME.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10031": "Cannot provision NFV Instance Group [uuid:%s, name:%s] when status is not in Initialization.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10000": "cannot find device path from volume: %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10032": "Cannot provision NfvInstanceGroup[uuid:%s, name:%s] with no member instances. Please create at least one NFV instance within the group before provisioning.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10003": "ISO [%s] is attached. Please detach it before attaching again.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10006": "invalid CPU [CPU_ID], the host [HOST_UUID] does not have a CPU with the specified ID [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10030": "Cannot provision NfvInstanceGroup[uuid:%s, name:%s] without a Virtual IP configured. Please configure a Virtual IP for the group before provisioning.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10005": "url must start with http:// or https://, but got %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10004": "The URL for the Ocean endpoint must be configured for Alibaba Cloud EBS Primary Storage.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10019": "The name[%s] is invalid for a resource. The name must adhere to the following requirements: \n- Be between 1 and 128 characters long.\n- Consist of uppercase and lowercase letters, numbers, underscores (_), and hyphens (-).\n- Begin with an alphabetic character (letter).\n- Not start or end with a space.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10013": "query failure, errorType:%s, error: %s", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10012": "conflict alert rule[%s], a rule with the same name already exists", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10018": "There is no Baremetal2 gateway found in cluster[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10028": "NFV instance [uuid:%s] is not a member of the VNF group [uuid:%s, name:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10017": "There is no BareMetal2 gateway found in cluster[uuid:%s]", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10010": "fail to create new CloudFile[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10029": "NfvInstanceGroup [uuid:%s] not found", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10026": "Cannot detach NFV instance[uuid:%s] from group[uuid:%s, name:%s] as it is the sole member. A group must contain at least one member.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10027": "Cannot detach NFV instance [uuid:%s] from group [uuid:%s, name:%s] as it is the sole running member. At least one additional member must be in the Running state.", + "ORG_ZSTACK_AI_10129": "Unexpected value null got from %s of token: %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10024": "NFV instance [uuid:%s] not found", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10016": "input %s signature verification failed for cloud resource validation", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10025": "Cannot disassociate NFV instance [uuid:%s] from group [uuid:%s, name:%s] as it is not currently associated. Current status detail is %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10003": "backup storage [UUID: %s] is not associated with zone [UUID: %s], which is the primary storage [UUID: %s] belongs to", + "ORG_ZSTACK_AI_10127": "The mode parameter must not be empty. Please provide a valid mode value.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10011": "failed to allocate compute node in clusters[uuids:%s] for baremetal instance[uuid:%s]", + "ORG_ZSTACK_AI_10128": "current allowed values are [\u0027%s\u0027]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10010": "failed to allocate gateway in clusters [uuids:%s] for baremetal instance [uuid:%s]", + "ORG_ZSTACK_AI_10125": "Invalid model classification: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10004": "volume[uuid:%s] has been attached to a running VM. VM should be stopped before attaching a volume.", + "ORG_ZSTACK_AI_10126": "Invalid configuration stored for ModelServiceVO[uuid: %s]: %s", + "ORG_ZSTACK_AI_10123": "cannot find model center with UUID: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10015": "provisioned IP %s is out of the DHCP range %s ~ %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10014": "provisioned IP %s has been occupied by another instance", + "ORG_ZSTACK_AI_10121": "No Model Center instance found, please create a Model Center instance first.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10013": "Only BareMetal2 clusters [UUID:%s] meet the requirements for chassis and gateway, but these clusters do not have a provisioned network attached.", + "ORG_ZSTACK_STORAGE_PRIMARY_10000": "cannot attach ISO to a primary storage [uuid:%s] which is disabled", + "ORG_ZSTACK_AI_10122": "failed to create system tag for ModelServiceInstanceGroupVO[uuid: %s], because %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10012": "no baremetal2 node found in cluster[uuid:%s]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10019": "invalid install path: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10010": "append volume ID: %s, but another volume ID already exists in the URL: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10012": "hostUuid [%s] already exists in the URL: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10014": "invalid installation URL: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10015": "cannot find device path on host: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10008": "No Baremetal2 Compute Cluster Found", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10002": "failed to generate vHost User Client in host[uuid:%s] for vm[uuid:%s] : %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10007": "Insufficient details to determine which BareMetal2 cluster to utilize.%s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10006": "no backup storage attached to zone [uuid:%s] contains the ISO [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10005": "cannot find the image with UUID [%s] in any connected backup storage. Please verify the following:\n1. Ensure that the backup storage is attached to the zone where the virtual machine (VM) named [%s] with UUID [%s] resides.\n2. Confirm that the backup storage is in a connected state. If not, attempt to reconnect it.", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10000": "failed to delete vHost User Client in host[uuid:%s] for vm[uuid:%s] : %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10009": "failed to allocate primary storage in clusters [uuids:%s] for bare metal instance [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_10014": "primary storage with UUID:%s cannot be deleted as it is still attached to cluster with UUID:%s.", + "ORG_ZSTACK_AI_10116": "Cannot locate any service instance groups in the cloud environment. Please verify your configuration.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10000": "baremetal2 instance[uuid:%s] does not exist or is not connected; therefore, its password cannot be changed.", + "ORG_ZSTACK_AI_10117": "Cannot find dataset with UUID [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_10016": "cannot attach volume[uuid:%s] whose primary storage is under maintenance", + "ORG_ZSTACK_AI_10114": "model service instance group [UUID: %s] not found; breaking waiting-for-service-start-up aliveness check", + "ORG_ZSTACK_AI_10115": "Either \u0027group UUIDs\u0027 or \u0027Sync All\u0027 must be provided", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10004": "cannot find the image with UUID [%s] in any connected backup storage associated with the zone UUID [%s]. Please verify the following:\n1. Ensure the backup storage is attached to the correct zone where the VM named [%s] (UUID: %s) resides.\n2. Confirm that the backup storage is in a connected state; if not, attempt to reconnect it.", + "ORG_ZSTACK_AI_10112": "Unsupported model service type: %s, unable to find corresponding backend to handle restart operations", + "ORG_ZSTACK_AI_10113": "model service instance group [UUID: %s] not found, skipping waiting-for-service-start-up flow", + "ORG_ZSTACK_AI_10111": "Cannot find model service instance[uuid: %s]", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10001": "Could not retrieve LLDP interface information as it is not configured to receive data.", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10037": "Cannot find licensed authorized node with UUID [%s]", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10003": "get LLDP reference for[%s] failed", + "ORG_ZSTACK_STORAGE_PRIMARY_10018": "zoneUuids, clusterUuids, and primaryStorageUuids must each contain at least one non-empty list, or all values must be set to true.", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10032": "Unauthorized nodes should not exist before upgrading to a licensed server environment. Please ensure all nodes have valid licenses prior to the upgrade process.", + "ORG_ZSTACK_STORAGE_PRIMARY_10017": "outputProtocol[%s] already exists on primary storage[%s], no need to add again", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10033": "Some related licensed virtual nodes are not terminated.%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10085": "security group with UUID:%s has not been associated with L3 network UUID:%s, detachment is not possible", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10000": "Could not change LLDP mode for interfaces of different hosts", + "ORG_ZSTACK_STORAGE_PRIMARY_10019": "primary storage with UUID:%s has not been attached to cluster with UUID:%s yet", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10087": "can\u0027t delete default rule[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10011": "Cannot delete NfvInstanceGroup[uuid:%s, name:%s] when status is Operating", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10086": "Cannot delete security group rules from a different security group", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10089": "the L3 network[uuid:%s] does not have the network service type[%s] enabled", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10088": "security group with UUID:%s has been associated with L3 network UUID:%s; therefore, it cannot be attached again.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10010": "Cannot create NFV instance, group[uuid:%s, name:%s] already has %d members, maximum allowed is 3", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10026": "the relativeTime[%s] is invalid, it exceeds the maximum allowed value", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10025": "the relativeTime[%s] is invalid; it must be specified in a format such as 10s or 1h.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10008": "Cannot create NFV instance when group [uuid:%s, name:%s] is in Active mode. Please change to Maintenance mode first.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10009": "Cannot create NFV instance when group[uuid:%s, name:%s] is in %s status", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10006": "nfv instance %s [uuid: %s] of nfv instance group %s [uuid: %s] haStatus changed from %s to %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10039": "vhost volume does not support attachment to bareMetalInstance2", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10038": "NIC with MAC:%s cannot be attached to L3 Network because it has been bonded", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10004": "All nodes are not in an expected state for cloud deployment. Please check the status of all nodes and ensure they meet the required conditions for operation.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10002": "create affinity group for NFV instance group [uuid:%s] failed", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10033": "customMAC is mandatory when attaching an L3 network to a BareMetal instance.", + "ORG_ZSTACK_STORAGE_PRIMARY_10024": "primary storage(s) [uuid: %s] where volumes are located is not enabled or connected", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10032": "L2 network type %s is not supported by Baremetal2 instances.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10031": "only Layer 3 network with IP version %d is supported by Baremetal2 instance", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10031": "Only a license server is authorized to unregister a licensed client instance.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10030": "Baremetal2 instance[uuid:%s] has not been allocated a compute node; please start the instance and try again.", + "ORG_ZSTACK_STORAGE_PRIMARY_10021": "primary storage and cluster are not in the same availability zone[uuid:%s] [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10037": "MAC address %s has already been assigned, please try another one", + "ORG_ZSTACK_STORAGE_PRIMARY_10020": "primary storage [uuid:%s] has been attached to cluster [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10036": "baremetal2 instance[uuid:%s] running on chassis[uuid:%s] does not have a non-provisioning NIC with MAC address %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10023": "\u0027UUID\u0027 and \u0027Type\u0027 must be set simultaneously for both or neither!", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10035": "duplicated MAC address %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10022": "URL[%s] is already in use and cannot be duplicated within the same cluster.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10034": "%s is not a valid MAC address", + "ORG_ZSTACK_AI_10130": "Unexpected value obtained: %s from %s, expected values are within the predefined range for cloud resource metrics", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10026": "invalid license type %s for cloud computing environment", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10027": "No authorized virtual machines should exist when registering a license server.%s", + "ORG_ZSTACK_STORAGE_PRIMARY_10029": "cannot reserve %s bytes on the primary storage[uuid:%s], it is short of available capacity", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10093": "VM nics with UUIDs:%s are not on L3 networks associated with the security group UUID:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_10028": "After subtracting reserved capacity, there is insufficient primary storage with the required size, possibly due to a lower threshold for the physical capacity setting of primary storage.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10096": "could not add security group rule because a duplicate UUID exists in remoteSecurityGroupUuids: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10095": "could not add security group rule because the rules list cannot be empty or exceed the maximum number of %d", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10098": "The remote security group UUID conflicts with an existing entry. Please verify and update the security group rule.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10022": "Cannot detach NFV instance from group [uuid:%s, name:%s] when in Normal operational mode. Please switch to Maintenance mode first.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10097": "could not add security group rule because security group [uuid:%s] does not exist", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10023": "Cannot detach NFV instance from group[uuid:%s, name:%s] when status is %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10020": "Cannot attach an NFV instance to group [uuid:%s, name:%s]. The group status is %s with %d members. Attachment is only allowed when: the group is empty or in a Healthy/Degraded state with 1-2 members.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10099": "could not add security group rule because the priority must be greater than %d or equal to %d", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10018": "invalid direction[%s], only supported directions are allowed", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10024": "invalid type[%s], only primitive types or commonly used reference types are allowed", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10019": "Cannot attach NFV instance to group [UUID: %s, Name: %s] when its status is %s", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10023": "invalid right value[%s], it must be a floating-point number", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10029": "baremetal2 instance[uuid:%s] is not stopped and cannot be modified to a different chassis offering.", + "ORG_ZSTACK_STORAGE_PRIMARY_10030": "After removing primary storage%s to avoid, there is no candidate primary storage available anymore. Please check the status and state of primary storage within the cluster.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10022": "invalid right value[%s], it must be a floating-point number greater than zero and less than one", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10017": "Cannot attach NFV instance [uuid:%s] to group [uuid:%s, name:%s]. The instance is already part of this group with a cluster status of %s. Attachment is not permitted when the instance is in Leader, Follower, Leaving, or Joining Candidate states.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10021": "invalid arguments %s, no arguments are permitted in this context", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10018": "Cannot attach an NFV instance to group [UUID:%s, Name:%s] when in Normal operation mode. Please switch the group to Maintenance mode first.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10020": "invalid right value[%s], it must be a valid numeric type (int, long, float, double) in cloud computing environments", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10015": "syncNfvInstGroup is only allowed in Maintenance Mode. Current mode: %s. Please change to Maintenance Mode first.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10013": "Cannot modify operation mode while in the INITIALIZING state. Please ensure the group is ready before making changes. Current status: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10036": "PrimaryStorageTagAllocatorExtensionPoint[%s] returns zero eligible primary storage candidates", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10022": "The current operation is not supported on a local baremetal instance. Please ensure the operation is performed within a virtualized environment.", + "ORG_ZSTACK_STORAGE_PRIMARY_10035": "PrimaryStorageFeatureAllocatorFlow[%s] returns zero viable primary storage candidate", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10021": "A bare metal instance is not permitted to modify its VM NIC network settings. Please ensure that you are using a compatible instance type.", + "ORG_ZSTACK_STORAGE_PRIMARY_10038": "%s is invalid. %s is not a valid instance UUID", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10020": "Only supports VPC network for attaching EIP to BareMetal2 instances.", + "ORG_ZSTACK_STORAGE_PRIMARY_10037": "the primary storage [uuid:%s] is not in the connected state, current status is %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10026": "baremetal2 instance[uuid:%s] is operational but its agent is not connected.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10025": "baremetal2 instance[uuid:%s] is not powered off", + "ORG_ZSTACK_STORAGE_PRIMARY_10034": "cannot find primary storage with user-defined tag[%s]. The user-defined tag is specified in instance offering or disk offering.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10024": "baremetal2 instance[uuid:%s] is not connected", + "ORG_ZSTACK_STORAGE_PRIMARY_10033": "cannot find primary storage[uuid:%s], the UUID is specified in instance offering or disk offering specification", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10023": "The operation is not supported on BareMetal2 instances. Please ensure compatibility with virtualized environments.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10051": "baremetal2 chassis with UUID:%s does not exist", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10050": "no need to set chassisOfferingUuid as the instance has already been assigned a chassis offering", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10021": "could not set VM NIC security group because the specified security group [uuid:%s] is not owned by your account [uuid:%s] or an administrator", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10020": "could not set VM NIC security group because of a duplicate security group [uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10023": "could not set VM NIC security group because of invalid priority; expected consecutive priorities, but found %d and %d", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10022": "could not set VM NIC security group because of an invalid priority; priority expects to start at 1, but [%d]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10025": "could not set VM NIC security group because the admin security group priority [%d] must be higher than user groups", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10027": "could not change security group rule state because security group [uuid:%s] was not found", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10026": "Could not update security group rule state because the Rule UUIDs list is empty. Please provide valid Rule UUIDs to proceed.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10029": "Could not modify security group rule state because no security group rules require state changes.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10028": "could not change security group rule state because security group rule[uuid:%s] was not found", + "ORG_ZSTACK_ZWATCH_10004": "Some messages have expired and are not permitted for modification due to system constraints. The system will automatically clean up these expired messages. Please attempt your operation at a later time.", + "ORG_ZSTACK_ZWATCH_10003": "invalid action type: %s, it only supports write or delete operations", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10054": "baremetal2 chassis[uuid:%s] has already been allocated to another resource.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10053": "baremetal2 chassis[uuid:%s] is not enabled", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10052": "baremetal2 chassis[uuid:%s] is not associated with the chassis offering[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10059": "Please do not set both Chassis UUID and Chassis Offering UUID at the same time.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10057": "cluster[uuid:%s] is specified but it is not an enabled Baremetal2 cluster; therefore, a Baremetal2 instance cannot be created from it.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10056": "zone[uuid:%s] is specified but it is not enabled; therefore, a baremetal2 instance cannot be created from it.", + "ORG_ZSTACK_AI_SERVICE_10001": "Failed to find Application Development Service VO with model service UUID: %s and account UUID: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10040": "Third-party Ceph cannot be mixed with other primary storage types. Please ensure consistency in your storage configuration.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10030": "Failed to modify VM NIC security policy because both ingress and egress policies cannot be null. Please ensure that at least one policy is defined.", + "ORG_ZSTACK_ZWATCH_10002": "invalid zwatch return with clause: %s, %s", + "ORG_ZSTACK_ZWATCH_10001": "unknown parameter[%s] in zwatch return with clause, please ensure it is a valid parameter for the specified cloud computing environment", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10032": "could not change VM NIC security policy because invalid egress policy[%s]", + "ORG_ZSTACK_AI_SERVICE_10005": "No tasks require testing, mark as failure.%s", + "ORG_ZSTACK_AI_SERVICE_10004": "Cannot find service instance; please ensure the instance is properly created and associated with your evaluation task. Task submission failed.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10031": "could not change VM NIC security policy because invalid ingress rule[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10034": "could not change VM NIC security policy because VM NIC [UUID:%s] has no associated security policy", + "ORG_ZSTACK_AI_SERVICE_10003": "cannot find service group with UUID [%s] available to submit evaluation task, report failure", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10033": "could not change VM NIC security policy because VM NIC [uuid:%s] not found", + "ORG_ZSTACK_AI_SERVICE_10002": "Model service instance group [UUID: %s] for testing does not have available URLs.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10036": "could not update security group rule priority because the security group [uuid:%s] does not exist", + "ORG_ZSTACK_AI_SERVICE_10008": "All compute instances failed to start.%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10035": "could not update security group rule priority because of an invalid type[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10038": "could not update security group rule priority because the number of rules in security group [uuid:%s] does not match预期的数量", + "ORG_ZSTACK_AI_SERVICE_10006": "Error during start evaluation on %s, because %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10037": "Could not update security group rule priority because the rules list is empty. Please ensure there are rules defined before attempting this operation.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10039": "could not update security group rule priority because rule priority[%d] is invalid", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10049": "no need to set chassisOfferingUuid as the instance has already been assigned a chassis", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10004": "failed to retrieve license information for primary storage [%s], as the response data indicates there is no active license available", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10044": "baremetal2 gateway with UUID: %s is not part of cluster with UUID: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10043": "baremetal2 gateway with UUID: %s does not exist or is not enabled or connected", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10042": "cluster[uuid:%s] is not an enabled baremetal2 cluster, cannot start instance[uuid:%s] within it", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10041": "remote provision instance does not support attaching a provision NIC to a bond %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10047": "baremetal2 chassis offering[uuid:%s] is not enabled", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10046": "baremetal2 chassis offering [UUID:%s] does not exist", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10045": "Please specify the chassis UUID or chassis offering UUID to start the Baremetal instance [uuid:%s].", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10029": "create snapshot timeout, progress is %d%", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10028": "EBS PrimaryStorage does not support decreasing size at this time.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10073": "image[uuid:%s] is of format: %s, only formats supported for BareMetal2 instances are %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10072": "image[uuid:%s] is of media type: %s; only root volume template can be used to create a baremetal instance.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10041": "could not update security group rule priority because the rule with UUID:%s is not associated with the security group with UUID:%s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10071": "image[uuid:%s] is not ready, cannot create a baremetal2 instance from it", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10040": "could not update security group rule priority because priority[%d] is duplicated", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10070": "image[uuid:%s] is not enabled; therefore, a baremetal2 instance cannot be created from it.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10043": "could not update security group rule priority because a duplicate rule UUID exists", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10021": "invalid snapshot installation path: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10042": "could not update security group rule priority because the specified priority [%d] does not exist within the security group [uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10045": "could not modify security group rule because the specified rule is a default rule; only description and status can be updated", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10044": "could not modify security group rule because the specified security group rule with UUID[%s] does not exist", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10022": "The Alibaba Cloud EBS primary storage[UUID:%s, Name:%s] cannot find any available host within the attached clusters for instantiating the volume.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10047": "could not modify security group rule because the security group %s has exceeded its maximum limit of %d rules", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10025": "cannot find snapshot from image: %s, possibly the image has been deleted", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10046": "could not modify security group rule because the priority of the rule [%s] cannot be set to the default rule priority [%d]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10024": "Cloud environment not support", + "ORG_ZSTACK_COMPUTE_CPUPINNING_10002": "Invalid cpuset [%s] specified for the instance configuration. Please ensure the cpuset is valid and refers to a proper set of CPU cores.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10049": "could not modify security group rule due to invalid state[%s]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10027": "failed to install tdc on the following hosts: [%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10048": "could not modify security group rule due to the maximum priority limit of %s rule being [%d]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10026": "failed to establish a connection with the following clusters: [%s]", + "ORG_ZSTACK_COMPUTE_CPUPINNING_10000": "invalid CPU pinning reference[%s]. Correct examples are [1,3:3-6,^5] or [1-2,4:6].", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10004": "cannot generate vhost-user client for virtual machine [uuid:%s] on the destination host [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10077": "the architecture of baremetal2 cluster[arch:%s] and image[arch:%s] do not match", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10076": "Different boot mode detected between the instance and the image or offering. Please ensure they match.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10075": "only images with boot mode %s are supported to create Baremetal2 instances", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10074": "image[uuid:%s] is not a BareMetal2 image; therefore, it cannot be used to create a BareMetal2 instance.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10079": "The primary storage for the root volume and the primary storage for the data volume must be within the same cluster.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10078": "Not all disk offerings [UUIDs:%s] are enabled; therefore, a BareMetal2 instance cannot be created from them.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10050": "could not modify security group rule because of an invalid action[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10062": "baremetal2 chassis offering[uuid:%s] is not enabled; therefore, a baremetal2 instance cannot be created from it.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10061": "baremetal2 chassis[uuid:%s] is not available; therefore, a baremetal2 instance cannot be created from it.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10060": "baremetal2 chassis with UUID:%s is not enabled; therefore, a baremetal2 instance cannot be created from it.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10051": "could not modify security group rule due to an invalid protocol[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10054": "could not modify security group rule because source IP range [%s] is specified; remote security group UUID [%s] must be left empty", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10031": "Aliyun EBS PrimaryStorage only supports Aliyun EBS BS type, actually got type: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10056": "could not modify security group egress rule because source IP range cannot be specified for type Egress", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10034": "resource[uuid: %s] cannot be found", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10055": "could not modify security group ingress rule because dstIpRange cannot be specified for this rule[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10058": "could not modify security group rule because remote security group [uuid:%s] was not found", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10057": "could not modify security group rule because a destination IP range [%s] is specified; remote security group UUID [%s] must be left empty", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10059": "could not modify security group rule because the remote security group [UUID:%s] is configured; source IP range and destination IP range must be empty", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10066": "image cannot be empty unless the chassis is in direct mode", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10065": "baremetal2 gateway with UUID: %s is not co-located within the same cluster as chassis with UUID: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10064": "baremetal2 gateway [UUID: %s] is not connected; therefore, a baremetal2 instance cannot be created from it.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10063": "baremetal2 gateway with UUID:%s is not enabled; therefore, a baremetal2 instance cannot be created from it.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10069": "Chassis disk[%s] does not have sufficient capacity for image[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10068": "image[uuid:%s] does not exist in the image repository", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10067": "Direct mode does not support selecting images.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREBLOCK_10000": "shareblock indicates that the host %s is unreachable on %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10100": "could not add security group rule because of an invalid protocol[%s]; valid protocols are %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10102": "could not add security group rule because an invalid IP version [%d] was specified; valid versions are %d/%d", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10101": "could not add security group rule because of an invalid action[%s]; valid actions include %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10104": "could not add security group rule because the allowed CIDR [%s] and destination IP range [%s] are in conflict", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10103": "could not add security group rule because the source IP range [%s] is not allowed to be set for an egress rule", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10106": "could not add security group rule because the destination IP range[%s] is not allowed to be set for an ingress rule", + "ORG_ZSTACK_COMPUTE_HOST_10041": "failed to check VLAN ID [%s] for network bonding [%s] on KVM host [UUID: %s], %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10105": "could not add security group rule because the IP range[%s] and remote Security Group UUID[%s] are in conflict", + "ORG_ZSTACK_COMPUTE_HOST_10043": "failed to verify VLAN ID [%s] for network interface [%s] on KVM host [UUID: %s], %s", + "ORG_ZSTACK_VPC_10048": "dns address [%s] has been added to VPC router [uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10107": "could not add security group rule because the allowed CIDR [%s] conflicts with the source IP range [%s]", + "ORG_ZSTACK_VPC_10047": "vPC L3 network must be associated with a vPC vRouter before performing any operations related to the vRouter (such as starting/stopping VMs, creating load balancers, etc.).", + "ORG_ZSTACK_ALIYUN_CORE_10022": "snapshot task status is finished %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10109": "could not add security group rule because the protocol type ALL or ICMP cannot set dstPortRange[%s]", + "ORG_ZSTACK_ALIYUN_CORE_10023": "The operation is not supported for HybridClient instances. Please use a compatible client type.", + "ORG_ZSTACK_ALIYUN_CORE_10021": "snapshot task cannot complete within %d milliseconds, current progress is %d%, status is %s", + "ORG_ZSTACK_ALIYUN_CORE_10026": "The Ocean API endpoint cannot be null. Please provide a valid endpoint.", + "ORG_ZSTACK_VPC_10042": "not supported to retrieve the state of service %s on virtual router %s", + "ORG_ZSTACK_COMPUTE_HOST_10048": "failed to update bonding IP, because %s", + "ORG_ZSTACK_VPC_10041": "cannot set state of distributed routing to virtual router %s", + "ORG_ZSTACK_ALIYUN_CORE_10024": "accessKey and secretAccessKey must be configured", + "ORG_ZSTACK_VPC_10040": "cannot retrieve connections for distributed routing to virtual router %s", + "ORG_ZSTACK_COMPUTE_HOST_10044": "failed to set service type[%s] for network bonding[%s] on KVM host[UUID: %s], %s", + "ORG_ZSTACK_VPC_10045": "not supported to update the service %s state to virtual router %s", + "ORG_ZSTACK_COMPUTE_HOST_10047": "failed to update interface IP because %s", + "ORG_ZSTACK_COMPUTE_HOST_10046": "failed to set service type[%s] for network interface[%s] on KVM host[UUID: %s], %s", + "ORG_ZSTACK_VPC_10043": "cannot retrieve state of distributed routing to virtual router %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10111": "could not add security group rule because the end port [%d] must be greater than or equal to the start port [%d]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10110": "The protocol type ALL or ICMP does not support setting startPort or endPort. Please ensure that the protocol is appropriate for your security group rule configuration.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10113": "The protocol type TCP/UDP requires a destination port range to be specified. Please provide the necessary port range and try again.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10112": "could not add security group rule because dstPortRange[%s] conflicts with startPort[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10115": "could not add security group rule because a duplicate rule[%s] already exists in the database for the specified security group", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10114": "could not add security group rule because rules [%s] and [%s] are duplicated", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10117": "could not add security group rule because the security group %s has reached its maximum limit of %d rules", + "ORG_ZSTACK_COMPUTE_HOST_10052": "failed to retrieve VLAN IDs for host [UUID:%s] : %s", + "ORG_ZSTACK_VPC_10039": "could not add IPv6 range to L3 network [uuid:%s], because it overlaps with CIDR [%s] of virtual router [uuid:%s]", + "ORG_ZSTACK_ALIYUN_IMAGE_10002": "The operation is restricted to custom images only.", + "ORG_ZSTACK_CORE_CONFIG_10002": "Unable to find Global Configuration[category: %s, name: %s]", + "ORG_ZSTACK_VPC_10038": "could not add IP range to L3 network [UUID:%s], because it overlaps with CIDR [%s] of virtual router [UUID:%s]", + "ORG_ZSTACK_ALIYUN_IMAGE_10003": "Only primary disks can create mirrors.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10119": "could not add security group rule because the security group %s has exceeded its maximum limit of %d rules", + "ORG_ZSTACK_NETWORK_PLUGIN_10001": "release gratuitous ARP due to:%s", + "ORG_ZSTACK_VPC_10037": "dns address [%s] is not associated with vpc router [uuid:%s]", + "ORG_ZSTACK_VPC_10036": "dns[%s] is not a valid IP address", + "ORG_ZSTACK_CORE_CONFIG_10004": "Do not allow skipping verification for cloud resources.", + "ORG_ZSTACK_NETWORK_PLUGIN_10000": "apply gratuitous ARP error because:%s", + "ORG_ZSTACK_ALIYUN_IMAGE_10001": "The indicated image is being imported into the datacenter now...", + "ORG_ZSTACK_ALIYUN_CORE_10011": "cannot input a zero-length file as a VM image!", + "ORG_ZSTACK_ALIYUN_IMAGE_10006": "Only support Image-based Storage Backup Service", + "ORG_ZSTACK_ALIYUN_IMAGE_10007": "The image name cannot start with http:// or https://. Please use a valid image name.", + "ORG_ZSTACK_ALIYUN_IMAGE_10004": "no OSS bucket associated with the datacenter: %s", + "ORG_ZSTACK_ALIYUN_IMAGE_10005": "Cannot delete ECS system image remotely", + "ORG_ZSTACK_VPC_10031": "L2 network [UUID: %s] of L3 network [UUID: %s] is not attached to cluster [UUID: %s]", + "ORG_ZSTACK_VPC_10030": "no IP ranges attached to L3 network[uuid:%s]", + "ORG_ZSTACK_ALIYUN_CORE_10016": "Please provide a valid cloud resource identifier!", + "ORG_ZSTACK_ALIYUN_CORE_10013": "Permission denied for: %s", + "ORG_ZSTACK_VPC_10035": "L3 network [UUID:%s] must be attached first as it contains a VIP.", + "ORG_ZSTACK_COMPUTE_HOST_10055": "cluster[uuids:%s, hypervisorType:%s] do not exist!", + "ORG_ZSTACK_VPC_10034": "The specified static IP address [%s] does not match the gateway IPs [%s] of the Layer 3 network [UUID: %s].", + "ORG_ZSTACK_ALIYUN_CORE_10017": "Java code execution failed, Error Code: %s, Error Message: %s", + "ORG_ZSTACK_COMPUTE_HOST_10058": "host[uuid:%s] cannot find the specified resource", + "ORG_ZSTACK_VPC_10033": "the gateway of l3 network [uuid:%s] has been occupied by another instance/ip:%s", + "ORG_ZSTACK_ALIYUN_CORE_10018": "Device Not Ready within %d milliseconds", + "ORG_ZSTACK_VPC_10032": "public network [UUID: %s] VIP [UUID: %s, IP: %s] cannot peer with L3 network [UUID: %s] as it is not located on the VPC VR [UUID: %s]", + "ORG_ZSTACK_COMPUTE_HOST_10019": "only support performing live snapshots on VM when it is in state [%s], but the VM is currently in state [%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10120": "could not add security group rule because priority[%d] must be consecutive; the maximum allowed priority for ingress rules is [%d].", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10000": "failed to retrieve primary storage[%s] license information due to absence of monitoring IP address", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10001": "failed to retrieve license information for primary storage[%s], as no data was returned", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10122": "Failed to apply security group rules to current instance[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10002": "failed to retrieve primary storage [%s] license information because the expiration time is null", + "ORG_ZSTACK_ALIYUN_IMAGE_10008": "no backup storage configured for image UUID: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10121": "could not add security group rule because priority[%d] must be consecutive; the maximum allowed priority for egress rules is [%d].", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10003": "failed to parse the date format[%s] of the primary storage[%s] license information", + "ORG_ZSTACK_ALIYUN_IMAGE_10009": "exceeded backup storage capacity for the imageUuid: %s, please specify it manually", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10124": "the network service[type:%s] is not enabled on the l3 Network[uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10123": "Failed to apply security group rules to some virtual machines", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10125": "failed to change rule[uuid:%s] priority because it\u0027s not found", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10128": "the network service[type:%s] is not enabled on the l3 Network[uuid:%s] associated with the nic[uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10127": "vm nic with UUID:%s has been attached to security group with UUID:%s", + "ORG_ZSTACK_ALIYUN_IMAGE_10011": "image [%s] is not enabled now", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10129": "security group with UUID [%s] is not owned by your account with UUID [%s] or an administrator", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10004": "virtual ID[uuid:%s] does not belong to organization[uuid:%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10005": "organization[uuid:%s] already has a designated supervisor", + "ORG_ZSTACK_ALIYUN_CORE_10001": "add endpoint to SDK failed, due to: %s", + "ORG_ZSTACK_ALIYUN_CORE_10005": "accessKey and secretAccessKey must be configured!", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10003": "virtual ID[uuid:%s] does not exist", + "ORG_ZSTACK_COMPUTE_HOST_10028": "nic[%s] is removed", + "ORG_ZSTACK_COMPUTE_HOST_10023": "operation error, because %s", + "ORG_ZSTACK_ALIYUN_CORE_10009": "cannot find access key id or secret access key from msg", + "ORG_ZSTACK_ALIYUN_IMAGE_10010": "valid platform:[%s] for Aliyun image import, valid values are: [%s]", + "ORG_ZSTACK_ALIYUN_CORE_10006": "The region identifier must be specified!", + "ORG_ZSTACK_COMPUTE_HOST_10038": "delete virtual machine file failed: %s", + "ORG_ZSTACK_COMPUTE_HOST_10037": "set virtual machine configuration file failed: %s", + "ORG_ZSTACK_COMPUTE_HOST_10039": "apply memory balloon failed: %s", + "ORG_ZSTACK_COMPUTE_HOST_10036": "set VM hostname failed: %s", + "ORG_ZSTACK_COMPUTE_HOST_10035": "sync VM port configuration failed: %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10009": "invalid label, \u0027op\u0027 field is null or not a valid Regex or Equal. %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10008": "invalid label, \u0027key\u0027 field cannot be null. Please provide a valid key value.%s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10007": "the ValueCondition string[%s] requires \u0027value\u0027 as a key", + "ORG_ZSTACK_ZWATCH_DATATYPE_10006": "the label string[%s] does not contain a valid operation", + "ORG_ZSTACK_COMPUTE_VM_10319": "VmInstanceDestroyVmExtensionPoint[%s] refuses to terminate vm[uuid:%s] due to %s", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10006": "The type of volume [%s] is invalid.", + "ORG_ZSTACK_COMPUTE_VM_10318": "VmInstanceRebootExtensionPoint[%s] declines to reboot vm[uuid:%s] due to %s", + "ORG_ZSTACK_COMPUTE_VM_10317": "VmInstanceStartNewCreatedVmExtensionPoint[%s] refuses to launch VM[uuid:%s] due to %s", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10004": "Failed to retrieve snapshot IDs for volume %s in Ceph PS[uuid:%s].", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10002": "Failed to verify installation path of volume %s in Ceph pool [uuid:%s].", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10001": "cannot find specified pool[PoolName:%s] from pool service response: %s", + "ORG_ZSTACK_VPC_10006": "VIP[uuid:%s] not found in the cloud environment", + "ORG_ZSTACK_VPC_10005": "could not attach IPv6 EIP because the image type of virtual router [UUID:%s] is not %s", + "ORG_ZSTACK_VPC_10003": "unable to establish an SSH connection to the VPC router[%s], the SSH port appears to be closed", + "ORG_ZSTACK_VPC_10009": "VMNic[uuid:%s] not found", + "ORG_ZSTACK_VPC_10008": "EIP with UUID:%s not found", + "ORG_ZSTACK_COMPUTE_VM_10316": "Cannot locate the VM\u0027s host. Please start the virtual machine [%s] and then attempt to mount the disk.", + "ORG_ZSTACK_COMPUTE_HOST_10005": "failed to set synchronization clock task on host[uuid:%s]", + "ORG_ZSTACK_ZWATCH_DATATYPE_10001": "invalid expression: %s, no associated function found in the context of cloud computing or virtualization settings", + "ORG_ZSTACK_COMPUTE_HOST_10004": "host[uuid:%s, name:%s] is in state[%s], unable to execute required operation", + "ORG_ZSTACK_COMPUTE_VM_10315": "gateway error, expect: %s, actual: %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10000": "invalid function: %s, invalid parameter type for cloud computing environment", + "ORG_ZSTACK_COMPUTE_VM_10314": "ipv6 prefix length error, expected a value between %s and %s, received: %s", + "ORG_ZSTACK_COMPUTE_VM_10313": "IPv6 prefix length must be configured", + "ORG_ZSTACK_VPC_10002": "the gateway of L3 network [UUID: %s] has been occupied on VPC VR [UUID: %s]", + "ORG_ZSTACK_COMPUTE_VM_10311": "netmask error, expected: %s, received: %s", + "ORG_ZSTACK_COMPUTE_HOST_10000": "sync GPU information failed: %s", + "ORG_ZSTACK_VPC_10001": "There is no IP range for Layer 3 network[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10310": "The subnet mask must be specified.", + "ORG_ZSTACK_VPC_10000": "cannot detach NIC from VPC VR[uuid:%s]", + "ORG_ZSTACK_COMPUTE_HOST_10009": "failed to allocate PCI device for host[uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10051": "Invalid URI format. Correct example: ceph://\u003cpool_name\u003e/\u003cvolume_uuid\u003e or volume://\u003cvolume_uuid\u003e", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10050": "Ceph ps[uuid\u003d%s] Root Pool Name Not Found", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10052": "delete volume chain error, continue with volume deletion", + "ORG_ZSTACK_COMPUTE_VM_10320": "VmInstanceStartExtensionPoint[%s] refuses to start virtual machine[uuid:%s] because %s", + "ORG_ZSTACK_COMPUTE_HOST_10013": "networkInterface[name:%s] of instance[uuid:%s] cannot be found", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10008": "encryption %s[id:%s] failed: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_SMP_10000": "the shared mount point primary storage[uuid:%s, name:%s] cannot find any available host within the attached compute clusters", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10005": "unsupported operation for EncryptColumnIntegrityFactory in cloud computing environment", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10002": "%s[%s] integrity verification error, due to: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10000": "%s[%s] encryption error due to:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10017": "cannot find any connected KVM host to perform the operation; it seems all hosts in the clusters attached with the shared mount point storage[uuid:%s] are disconnected.", + "ORG_ZSTACK_VPC_10027": "could not attach L3 network to VPC router[UUID:%s] because its state is not running or stopped", + "ORG_ZSTACK_VPC_10025": "VPC network [uuid:%s] is already attached to VPC router [uuid:%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10013": "The URL contains an invalid directory path [%s]. Valid paths should be within the instance\u0027s file system and not include special directories such as /dev, /proc, or /sys. Please ensure the provided URL is correct.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10042": "get root volume RBD image watchers fail, %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10041": "CEPH pool conflict, the CEPH pool specified by the disk offering is %s, and the CEPH pool specified in the creation parameter is %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10010": "volume[uuid:%s] has a reference to volume[%s]; therefore, the volume type cannot be changed before flattening the volume and its descendants.", + "ORG_ZSTACK_VPC_10029": "could not attach L3 network to VPC router[UUID:%s] because both its state and peer state are neither running nor stopped", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10044": "cannot find Ceph primary storage pool[poolName\u003d%s]", + "ORG_ZSTACK_VPC_10020": "l3 network [uuid:%s] cannot detach from vpc vrouter [uuid:%s] because network services attached to VIPs [%s] are still in use.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10043": "rootVolume[%s] is already in use (indicating that the Ceph RBD image[%s] has active watchers), to prevent potential split-brain scenarios, starting the VM is prohibited.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10046": "cannot allocate storage pool for primaryStorage[%s], purpose: %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10045": "cephPrimaryStorage pool[poolName\u003d%s] has insufficient available virtual capacity to accommodate the requested size %s.", + "ORG_ZSTACK_VPC_10024": "Only a VPC L3 network can be attached to a VPC vRouter.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10047": "cannot update status of the Ceph primary storage MON node [UUID:%s], as it has been deleted. This warning can be ignored.", + "ORG_ZSTACK_VPC_10023": "the image of virtual router offering [uuid: %s] is missing", + "ORG_ZSTACK_VPC_10022": "virtual router offering with UUID: %s is not enabled", + "ORG_ZSTACK_VPC_10021": "vPC L3 network [UUID:%s] cannot detach from vPC router [UUID:%s] because VM NICs [%s] are still in use.", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10006": "Unsupported operation in cloud environment. Please ensure you are using supported APIs for cloud computing operations.", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10005": "missing parameter, virtualMachineInstanceUuid: %s is requested", + "ORG_ZSTACK_VPC_10017": "Public network cannot be detached from the original virtual private cloud.", + "ORG_ZSTACK_VPC_10016": "Default route network cannot be detached", + "ORG_ZSTACK_VPC_10015": "The management network cannot be detached. Please ensure that all dependent resources have been transferred or terminated before attempting this operation.", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10003": "cannot find a host with a connected SMP connection to execute commands for smp primary storage [uuid:%s]", + "ORG_ZSTACK_VPC_10014": "the virtual router [uuid:%s] is not in the desired state or status", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10002": "cannot find a connected host to execute command for SMP primary storage[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10001": "the SMP primary storage [uuid:%s] is not attached to any compute clusters and therefore cannot expunge the root volume [uuid:%s] of the virtual machine [uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10007": "cannot find virtual machine with UUID: %s", + "ORG_ZSTACK_VPC_10019": "could not detach L3 network from VPC router[uuid:%s] because the states of the master and slave are inconsistent", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10008": "cannot find virtual machine device with uuid: %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10030": "cannot find backup storage to download image [%s] to primary storage [%s] due to lack of ready and accessible image", + "ORG_ZSTACK_VPC_10018": "could not detach L3 network from VPC router[uuid:%s] as its state is not running or stopped", + "ORG_ZSTACK_ALIYUN_CORE_10037": "The image already existed remotely; please use sync first to ensure consistency.", + "ORG_ZSTACK_ALIYUN_CORE_10035": "entry is still active after %s ms", + "ORG_ZSTACK_ALIYUN_CORE_10036": "cannot find ECS instance [%s], please check if it exists in the Aliyun console", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10037": "cannot find any connected Ceph MON for the primary storage[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10001": "missing parameter: resourceUuid %s, vmInstanceUuid %s is requested", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10002": "Missing required parameter: resource UUID. Please provide a valid resource UUID.", + "ORG_ZSTACK_VPC_10012": "the virtual router [uuid:%s] is not a VPC router", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10039": "CEPH pool conflict, the CEPH pool specified by the instance offering is %s, and the CEPH pool specified in the creation parameter is %s", + "ORG_ZSTACK_VPC_10011": "could not update network interface [uuid: %s] state, due to management network interface not supported", + "ORG_ZSTACK_ALIYUN_CORE_10039": "regionId[%s] is invalid according to Aliyun!", + "ORG_ZSTACK_VPC_10010": "could not delete VM NIC [UUID:%s], because the VM [UUID:%s] is an appliance VM. Please use API APIDetachL3NetworkFromVm.", + "ORG_ZSTACK_SNMP_AGENT_10006": "failed to terminate SNMP agent session[%s] on port %s, due to %s", + "ORG_ZSTACK_SNMP_AGENT_10005": "failed to modify SNMP agent port from %s to %s due to %s", + "ORG_ZSTACK_SNMP_AGENT_10004": "snmp[uuid:%s] instance has not been provisioned", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10009": "The state of the EC2 instance [%s] must be running or stopped", + "ORG_ZSTACK_STORAGE_ZBS_10003": "invalid mdsUrl[%s]. SSH username and password must be separated by \u0027:\u0027 and cannot be empty. A valid mdsUrl format is %s", + "ORG_ZSTACK_STORAGE_ZBS_10004": "invalid management service URL[%s], hostname cannot be null. A valid management service URL format is %s", + "ORG_ZSTACK_STORAGE_ZBS_10002": "invalid MDS URL[%s], the SSH username:SSH password part is invalid. A valid MDS URL format is %s", + "ORG_ZSTACK_APPCENTER_10006": "%s requires a String value, but received an incorrect type", + "ORG_ZSTACK_APPCENTER_10005": "%s requires a Boolean value, but received an incorrect type", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10004": "The disk [%%s] is not attached to any instance", + "ORG_ZSTACK_APPCENTER_10004": "%s requires a Number value, but received an incorrect type", + "ORG_ZSTACK_STORAGE_ZBS_10005": "invalid MDS URL[%s], the SSH port is out of the valid range (1-65535). A valid MDS URL should be in the format of %s.", + "ORG_ZSTACK_APPCENTER_10003": "%s is specified in preParameters but is not configured", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10006": "Only a data disk can be attached to an ECS instance.", + "ORG_ZSTACK_APPCENTER_10002": "filterName must be set to appcenter:true or appcenter:false for proper configuration.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10007": "The disk cannot be attached to any ECS instance. Please ensure the ECS instance is in a state that allows attachment of disks.", + "ORG_ZSTACK_SNMP_AGENT_10003": "failed to start SNMP agent on port %s due to %s", + "ORG_ZSTACK_APPCENTER_10001": "PublishAppVO[uuid: %s] does not exist", + "ORG_ZSTACK_SNMP_AGENT_10002": "failed to start SNMP agent[%s], please check your cloud configuration[%s]", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10001": "The root volume of the instance cannot be deleted", + "ORG_ZSTACK_SNMP_AGENT_10001": "More than one SnmpAgentVO instance exists. Please specify which one to use.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10002": "You cannot set the disk\u0027s deleteWithInstance property to false when the disk category is ephemeral.", + "ORG_ZSTACK_SNMP_AGENT_10000": "Cannot instantiate SnmpAgentImpl due to the absence of a SnmpAgentVO instance. Please ensure that SnmpAgentVO is properly configured and deployed.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10003": "You cannot set the disk\u0027s deleteWithInstance property to false when the disk category is cloud and it is not portable.", + "ORG_ZSTACK_CORE_WEBHOOK_10000": "Invalid URL[%s]", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10010": "Disk and ECS instances must be in the same availability zone", + "ORG_ZSTACK_TEST_AOP_10001": "unit test requires a failure due to issues in cloud computing infrastructure or virtualization environment", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10015": "The disk size or snapshot ID must be specified in the request parameters to create a disk or manage its size. Please provide either the disk size or use an existing snapshot.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10016": "You are not permitted to create a disk from a root volume snapshot. Please use a non-root volume snapshot or a copy of the root volume for this operation.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10017": "The disk name or description cannot start with \u0027http://\u0027 or \u0027https://\u0027. Please use valid characters for naming disks.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10011": "The volume [%s] is already attached to the instance [%s]", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10012": "Only a data disk can be attached to an ECS instance.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10013": "Cannot attach a disk to an instance that is currently in use. Please stop the instance before attaching a new disk.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10014": "Non-elastic disk can only be destroyed with associated instances", + "ORG_ZSTACK_STORAGE_ZBS_10021": "invalid logical volume name[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10022": "invalid pool name[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10020": "invalid URI syntax for cloud resource reference: %s", + "ORG_ZSTACK_STORAGE_ZBS_10025": "do not allow adding duplicate MDS[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10026": "cannot find physical resource for logical pool[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10023": "Please ensure that at least one compute pool is configured.", + "ORG_ZSTACK_STORAGE_ZBS_10024": "Ensure at least one Metadata Service instance is configured", + "ORG_ZSTACK_STORAGE_ZBS_10027": "Not found MDS[%s] of zBS primary storage[uuid:%s] node", + "ORG_ZSTACK_STORAGE_ZBS_10028": "All MDS nodes of ZBS primary storage [uuid:%s] are not in a Connected state", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10001": "Cannot delete predefined preconfiguration templates in the cloud environment. Please contact support for assistance.", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10002": "Cannot modify the state of predefined configuration templates in this environment. Please use available virtual machine images or create custom configurations instead.", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10000": "Cannot update predefined instance types templates", + "ORG_ZSTACK_MTTYDEVICE_10001": "mdev devices generated from mtty device[uuid:%s] are still attached to the VM", + "ORG_ZSTACK_MTTYDEVICE_10000": "mtty device [UUID:%s] is not virtualized into mdevs resources", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10004": "cannot find Preconfiguration Template VO with UUID: %s, it may have been deleted", + "ORG_ZSTACK_MTTYDEVICE_10004": "The host [UUID:%s] that contains the MTty device [UUID:%s] is not connected.", + "ORG_ZSTACK_MTTYDEVICE_10003": "mtty device [UUID:%s] cannot be virtualized into mdevs", + "ORG_ZSTACK_HYGON_KVM_10004": "get Hygon CPU device information from host[UUID:%s] failed: %s", + "ORG_ZSTACK_STORAGE_ZBS_10014": "ZBS primary storage [uuid:%s] may have been deleted or dissociated", + "ORG_ZSTACK_STORAGE_ZBS_10015": "cannot find KVM host [UUID:%s], unable to deploy client", + "ORG_ZSTACK_STORAGE_ZBS_10012": "unable to connect to the ZBS primary storage[uuid:%s], failed to connect all Metadata Servers", + "ORG_ZSTACK_STORAGE_ZBS_10016": "addon information is null, primary storage[uuid:%s] is not ready, skipping ping task", + "ORG_ZSTACK_ZWATCH_DATATYPE_10010": "invalid label, \u0027value\u0027 field cannot be null. Please provide a valid value.%s", + "ORG_ZSTACK_STORAGE_ZBS_10017": "No available logical volume with sufficient space[%d] and required URL: %s", + "ORG_ZSTACK_HYGON_KVM_10003": "failed to ungenerate Hygon IOMMU devices because:%s", + "ORG_ZSTACK_HYGON_KVM_10002": "cannot ungenerate mdev devices, there are %d mdev device(s) attached to VMs on host[uuid:%s]. Please stop or migrate all affected virtual machines first.", + "ORG_ZSTACK_HYGON_KVM_10001": "cannot find CCP devices for PCI BDF %s on host[UUID:%s], please synchronize Hygon devices first", + "ORG_ZSTACK_HYGON_KVM_10000": "failed to generate Hygon IOMMU devices because:%s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10021": "unable to query InfluxDB instance, %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10023": "failed to alter InfluxDB retention policy \u0027%s\u0027, %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10000": "there are not enough physical resources for VM[UUID: %s] storage migration; required capacity (including image cache): %s, current available physical capacity: %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10024": "failed to create InfluxDB retention policy \u0027%s\u0027, %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10001": "not support vm state[%s] for storage migration", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10025": "invalid InfluxDB response: %s, no metric name found in columns", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10026": "failed to create default user for InfluxDB \u0027%s\u0027, %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10004": "not support to cancel virtual machine instance", + "ORG_ZSTACK_STORAGE_MIGRATION_10005": "VM[uuid: %s] does not exist", + "ORG_ZSTACK_STORAGE_MIGRATION_10003": "unsupported storage migration type: from %s to %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10008": "vm block migration failed: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10009": "The target primary storage does not support migration operations for the current host. Please ensure that the storage is compatible with migration operations and try again.", + "ORG_ZSTACK_STORAGE_MIGRATION_10006": "not support VM state[%s] for canceling storage migration", + "ORG_ZSTACK_STORAGE_MIGRATION_10007": "Failed to determine host candidates for VM migration `%s`. Please check the target hosts and network connectivity.", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10005": "invalid format for virtio driver device: %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10004": "failed to detach virtio ISO from VM[uuid:%s]: not supported", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10003": "failed to detach virtio device from vm[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10002": "fail to attach virtio driver because read md5 of file[%s] failed in mn[uuid:%s]: %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10001": "fail to attach virtio driver due to invalid MD5 of file[%s] in mn[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10000": "fail to attach virtio driver because read md5 of file[%s] failed in mn[uuid:%s]: virtual disk file not found on classpath", + "ORG_ZSTACK_DIRECTORY_10010": "The specified directory type %s is not supported; supported types include %s.", + "ORG_ZSTACK_SCHEDULER_VM_10001": "vm[uuid:%s] has been terminated, state change is not permitted", + "ORG_ZSTACK_STORAGE_ZBS_10040": "failed to retrieve MDS[%s] metadata, please verify the ZBS configuration", + "ORG_ZSTACK_STORAGE_ZBS_10032": "all metadata servers cannot execute HTTP request[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10036": "ZBS primary storage MDS[%s] version mismatch with management node[%s], please reconnect the MDS and verify SSH connectivity.", + "ORG_ZSTACK_STORAGE_ZBS_10037": "MDaaS URLs cannot be null or empty", + "ORG_ZSTACK_STORAGE_ZBS_10034": "unable to synchronize metadata from ZBS primary storage MDS[%s], due to %s", + "ORG_ZSTACK_STORAGE_ZBS_10038": "unable to discover logical volumes from all metadata service instances, details: %s", + "ORG_ZSTACK_STORAGE_ZBS_10039": "Failed to establish an SSH connection or zbs-tools is not installed in MDS[%s]. Please verify your SSH configuration and ensure that the necessary dependencies are installed.", + "ORG_ZSTACK_DIRECTORY_10006": "circular dependency detected between directory %s and directory %s, which may lead to configuration conflicts or infinite loop in virtual environment provisioning", + "ORG_ZSTACK_DIRECTORY_10003": "The name you provided contains unsupported characters. In cloud computing environments, names can only include Chinese characters, English letters, numbers, spaces, and the following special characters: ()()[]@._-+ . Please ensure your name adheres to these guidelines.", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10000": "cannot find EventFamily[name:%s] in the event bus", + "ORG_ZSTACK_DIRECTORY_10004": "all resources zoneUuid must be consistent with directory zoneUuid[%s]", + "ORG_ZSTACK_DIRECTORY_10001": "resource types %s are not supported by the cloud directory, allowed types are %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10002": "cannot find EventFamily[name:%s, namespace:%s] in the specified namespace or event family repository", + "ORG_ZSTACK_DIRECTORY_10000": "resource %s has already been bound to directory UUID[%s]; multiple paths are not supported", + "ORG_ZSTACK_NAS_10002": "duplicate NasFileSystemFactory for type[%s]", + "ORG_ZSTACK_NAS_10000": "NAS file system [%%s] does not exist yet", + "ORG_ZSTACK_NAS_10001": "cannot find NAS factory for type: %s", + "ORG_ZSTACK_DIRECTORY_10009": "Failed to create directory; ensure that the path is correctly specified and does not exceed four levels of virtual directories.", + "ORG_ZSTACK_DIRECTORY_10008": "duplicate directory name, volume[uuid: %s] with name %s already exists", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10011": "invalid query tag[%s]. Allowed tag names are %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10012": "There are multiple Event Families with the name [%s], you must specify the label [%s].", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10006": "The VM where the data volume [%s] is located has a memory snapshot; therefore, it cannot be detached.", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10005": "unable to attach volume %s to virtual machine instance %s with memory snapshot group", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10004": "The VM where the data volume [%s] is located has a memory snapshot; deletion is not allowed.", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10003": "The volume {volume_id} does not exist", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10001": "network with L3 network [uuid: %s] is referenced by Volume Snapshot Group [uuid: %s]. Please delete the Volume Snapshot Group before deleting this L3 network.", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10000": "default L3 network UUID does not exist", + "ORG_ZSTACK_AI_10086": "ModelServiceGroup is still referenced by %s, cannot be deleted", + "ORG_ZSTACK_AI_10087": "taskUuid must not be empty. Please ensure it is properly set before submitting the task.", + "ORG_ZSTACK_AI_10084": "System instance[uuid: %s] cannot be deleted", + "ORG_ZSTACK_AI_10082": "Failed to delete model, model[uuid: %s] is still in use by %s", + "ORG_ZSTACK_AI_10083": "Model[uuid: %s] does not exist in the cloud repository", + "ORG_ZSTACK_AI_10080": "Custom URL requires a model field when ModelEval service type is deployed.%s", + "ORG_ZSTACK_AI_10081": "L3 Network UUID %s does not have a DHCP service enabled; a static IP system tag is required to assign static IPs.", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10007": "The operation to take volume snapshots on multiple hosts simultaneously when including storage snapshots is not supported.", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10008": "cannot find storage space for install URL[%s]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10005": "No primary storage plugin registered with identity: %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10006": "not support protocol[%s] on type[%s] storage solution", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10009": "Cannot find block storage volume; ensure that an access path is configured for the block storage volume.", + "ORG_ZSTACK_CONFIGURATION_10009": "reserved memory size[%s bytes] exceeds the available memory size[%s bytes]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10010": "no backup storage type specified to support primary storage[uuid:%s]", + "ORG_ZSTACK_CONFIGURATION_10008": "memory size[%s bytes] is insufficient for modern operating system bootstrapping; a minimum of 16MB is recommended in cloud virtual environments", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10011": "cannot reinitialize root volume [%s] because the associated image has been deleted and its cache cannot be located", + "ORG_ZSTACK_MULTICAST_ROUTER_10005": "multicast router [uuid:%s] is not associated with a VPC Router", + "ORG_ZSTACK_CONFIGURATION_10007": "vcpu count[%s] is less than 1", + "ORG_ZSTACK_MULTICAST_ROUTER_10006": "Rendezvous Point [%s] is not a unicast IP address", + "ORG_ZSTACK_CONFIGURATION_10006": "unsupported instance type[%s]", + "ORG_ZSTACK_MULTICAST_ROUTER_10007": "group address [%s] is not a multicast group address", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014": "storage is not healthy:%s", + "ORG_ZSTACK_MULTICAST_ROUTER_10000": "multicastRouter[uuid:%s] has not been associated with a VPC router", + "ORG_ZSTACK_MULTICAST_ROUTER_10001": "multicast already enabled on VPC router UUID[:%s]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012": "cannot find the owning volume path from the internal snapshot path[%s], as the regex[%s] fails to match the snapshot path", + "ORG_ZSTACK_MULTICAST_ROUTER_10002": "vPC router for multicast router [uuid:%s] has been deleted", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10013": "ping external primary storage[%s] failed, please check network connectivity or storage service status.%s", + "ORG_ZSTACK_CONFIGURATION_10001": "Already have one user-defined system tag for instance offering [UUID: %s].", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10004": "Token response is null. Please ensure that your authentication process is correctly configured and that the token endpoint is returning a valid response.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10003": "Cannot find OAuth2Login implementation for type(%s)", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10005": "%s is null: Please ensure the source file path is correctly specified.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10000": "duplicate OAuth2 authentication handler for type[%s]", + "ORG_ZSTACK_CONFIGURATION_10004": "Should not have more than one system tag for an instance offering.", + "ORG_ZSTACK_CONFIGURATION_10003": "Already have one user-defined system tag for disk offering [UUID: %s].", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10002": "Cannot find OAuth2 Provider for type(%s)", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10001": "duplicate OAuth2 provider[%s] for name[%s]", + "ORG_ZSTACK_AI_10075": "dockerImage must be specified for ContainerModelService.", + "ORG_ZSTACK_AI_10076": "Model center with UUID:%s not found for model service with UUID:%s", + "ORG_ZSTACK_AI_10071": "vmImageUuid is a required parameter for the VirtualMachine model service. Please provide a valid vmImageUuid value.", + "ORG_ZSTACK_AI_10072": "The VM image UUID specified is invalid. Please verify and provide a valid UUID.", + "ORG_ZSTACK_AI_10070": "ModelServiceType[%s] should not have dependent model service group UUIDs", + "ORG_ZSTACK_MULTICAST_ROUTER_10008": "RP address pair [%s: %s] already exists for multicast router [uuid:%s]", + "ORG_ZSTACK_MULTICAST_ROUTER_10009": "rpc address tuple [%s : %s] does not exist for multicast router [uuid:%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10015": "Failed to upload user[%s]: User already exists in the cloud environment", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10017": "get code response has error: %s", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10016": "Failed to upload user[%s]: %s", + "ORG_ZSTACK_AI_10079": "ModelEval serviceType requires an existing model service within the specified modelServiceGroupUuids or a valid URL for usage.", + "ORG_ZSTACK_AI_10077": "No L3 network UUID provided in deployment message, and model center [UUID:%s] has no serviceNetworkUuid or storageNetworkUuid configured.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10012": "iam2 has a user with the same name[%s]", + "ORG_ZSTACK_AI_10078": "Environment variable values should not be null in your cloud environment configuration. Please ensure all required variables are properly set.", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_SUPPLIER_EMAY_10000": "invalid parameter with supplier[%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10026": "The username retrieved from the cloud service is null. Please check the user authentication configuration.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10025": "fail to get parameters[%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10028": "Plugin [uuid:%s] is utilized by OAuth2 clients [uuids:%s] for third-party login authentication.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10027": "local user has a user with the same name[%s]", + "ORG_ZSTACK_AI_10097": "model services within group[uuid: %s] have inconsistent types, expected type: %s, but found type: %s", + "ORG_ZSTACK_AI_10098": "model service backend[type: %s] not found in the virtualized environment", + "ORG_ZSTACK_AI_10095": "all model services within group[uuid: %s] must configure serviceBootUptime", + "ORG_ZSTACK_AI_10096": "no model service instance found with node rank 0 in group[uuid: %s]", + "ORG_ZSTACK_AI_10093": "model service instance[uuid: %s] is not active and not ready, but no error code found", + "ORG_ZSTACK_AI_10094": "unexpected content: %s service\u0027s YAML parsed as null", + "ORG_ZSTACK_AI_10091": "failed to obtain readiness status because %s", + "ORG_ZSTACK_AI_10092": "model service instance[uuid: %s] is not available and not ready due to %s", + "ORG_ZSTACK_AI_10090": "Failed to reload NGINX configuration: %s", + "ORG_ZSTACK_VROUTERROUTE_10010": "destination[%s] cannot have both black hole and static routes simultaneously", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10000": "cannot find external primary storage[uuid:%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10031": "failed to %s to %s, status code: %s, response body: %s", + "ORG_ZSTACK_VROUTERROUTE_10012": "cannot add duplicate Black Hole Route entry for destination: %s", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10030": "HTTP ERROR, status code: %s, response body: %s", + "ORG_ZSTACK_VROUTERROUTE_10011": "cannot add a duplicate static route entry, destination: %s, target: %s, type: %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10003": "required space at locationUrl:%s cannot satisfy conditions [availableSize \u003e %d bytes], current available size %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10004": "cannot find volume with UUID [%s] install path", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10001": "Cannot establish connection to external storage service. Please ensure that your storage service is properly configured and accessible within the cloud environment.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10032": "failed to %s to %s, IO Error: %s", + "ORG_ZSTACK_AI_10099": "model service instance group[uuid: %s] does not exist", + "ORG_ZSTACK_VROUTERROUTE_10001": "cannot find service factory for virtual router type[%s]", + "ORG_ZSTACK_VROUTERROUTE_10000": "virtual router [uuid:%s] cannot be located", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10015": "Ceph BS[uuid\u003d%s] pool name not found", + "ORG_ZSTACK_VROUTERROUTE_10003": "cannot find the route table [uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10012": "cannot update status of the Ceph backup storage MON [UUID:%s], it has been deleted. This error can be ignored.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10000": "cannot find the host scheduling group[uuid:%s], it may have been deleted or reassigned", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10003": "The host [UUID:%s] is already attached to the host scheduling group [UUID:%s].", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10004": "The host with UUID %s is null. Please verify the cluster configuration.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10001": "cannot find the virtual machine scheduling rule[uuid:%s], it may have been deleted", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10002": "cannot find the virtual machine scheduling group[uuid:%s], it may have been deleted", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10011": "CEPH backup storage does not support calculating image checksum.", + "ORG_ZSTACK_SNS_PLATFORM_HTTP_10000": "HTTP POST request failure. status: %s, body: %s", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10007": "image[uuid: %s] is not available on backup storage[uuid:%s, name:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10005": "There is another CEPH backup storage with the same FSID; you cannot add the same CEPH setup as two different backup storages.[name:%s, uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10003": "unable to connect to the Ceph backup storage[UUID:%s], failed to connect all Ceph monitors.", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10002": "CephMon[hostname:%s] not found on backup storage[uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10009": "Unable to add MON node to Ceph backup storage cluster", + "ORG_ZSTACK_MULTICAST_ROUTER_BACKEND_10000": "multicast router [uuid:%s] has been deleted during enabling multicast on the backend", + "ORG_ZSTACK_LDAP_10016": "query LDAP entry failed, %s", + "ORG_ZSTACK_LDAP_10017": "query ldap entry[filter: %s] failed due to %s", + "ORG_ZSTACK_LDAP_10012": "Cannot establish a connection to the LDAP/AD server, invalid credentials provided. Please verify the User DN and password.", + "ORG_ZSTACK_LDAP_10013": "Cannot establish connection to LDAP/AD server, communication failure. Please verify IP address, port number, and Base DN.", + "ORG_ZSTACK_LDAP_10014": "Cannot establish connection to LDAP/AD server, %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10005": "current license[%s] is not valid for image store backup storage operations", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10004": "CephPrimaryStorage[%s] does not exist!", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10001": "image [uuid:%s] has been deleted from the cloud storage repository", + "ORG_ZSTACK_LDAP_10010": "Invalid LdapServerType[%s], valid values: [%, %s]", + "ORG_ZSTACK_LDAP_10007": "Account[UUID:%s] Not Found!!!", + "ORG_ZSTACK_LDAP_10008": "Unsupported LDAP/AD server scope for cloud environment configuration. Please ensure the scope is compatible with virtualization and cloud computing standards.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10000": "failed to create elastic IP [uuid:%s, name:%s, ip:%s] for virtual machine network interface [uuid:%s] on virtual router [uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10001": "Found a virtual router offering [uuid:%s] for L3Network [uuid:%s] in zone [uuid:%s]; however, the network\u0027s public IP configuration does not match the Elastic IP [uuid:%s]. You may need to specify a particular virtual router offering using the system tag guestL3Network::l3NetworkUuid for the L3Network [uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10002": "failed to detach eip [uuid:%s, name:%s, ip:%s] from vm nic [uuid:%s] on virtual router [uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10004": "failed to sync eip on virtual router[uuid:%s], error details: %s", + "ORG_ZSTACK_AI_10004": "randomUuid does not match expected value. Please verify the UUID generation logic.", + "ORG_ZSTACK_AI_10005": "Model Center not found. Please ensure that the Model Center service is properly deployed and configured in your cloud environment.", + "ORG_ZSTACK_AI_10003": "randomUuid is null. Please ensure that a valid UUID is generated before usage.", + "ORG_ZSTACK_AI_10001": "The provided model center management IP address %s is invalid. Please ensure it is a valid IP and try again.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10027": "vm[uuid:%s] is now running on host[uuid:%s], which does not comply with the scheduling policy[%s] associated with vm scheduling group[uuid:%s].", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10028": "vm[uuid:%s] is now running on host[uuid:%s], which does not comply with the scheduling rule[%s] associated with the virtual machine scheduling group[uuid:%s].", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10019": "The VM scheduling group [UUID:%s] already has an executed exclusive or affinity-based VM scheduling policy attached. You cannot attach either type of policy that requires execution to this group again.", + "ORG_ZSTACK_AI_10028": "modelServices cannot be null or empty. Please ensure that your service instance is properly initialized and configured.", + "ORG_ZSTACK_AI_10029": "modelServices should utilize the same model UUID as the virtual instances for consistency.", + "ORG_ZSTACK_AI_10026": "serviceNetworkUuid %s is not a system Layer 3 network", + "ORG_ZSTACK_AI_10027": "storageNetworkUuid %s is not a system Layer 3 network", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10025": "vm[uuid:%s] is now running on host[uuid:%s], which does not comply with the scheduling policy associated with the virtual machine\u0027s scheduling group[uuid:%s].", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10026": "hostGroup[uuid:%s] does not have any hosts assigned", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10024": "vm scheduling group[uuid:%s] failed to reserve host [uuid:%s] for vm [uuid:%s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10007": "vm[uuid:%s] is already associated with vm scheduling group[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10008": "unmatched zone detected: VM[UUID: %s, Zone UUID: %s] is different from its scheduling rule group[UUID: %s, Zone UUID: %s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10005": "Hosts that you can add to a host scheduling group must be enabled and connected to the Management Node (MN).", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10006": "unmatched zone detected, host [uuid: %s, zone uuid: %s]\u0027s zone is different from host scheduling rule group [uuid: %s, zone uuid: %s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10009": "vm can change its VM scheduling group only in states [%s,%s], but it is currently in state [%s]", + "ORG_ZSTACK_TEMPLATECONFIG_10000": "Unable to find any TemplateConfigs: [template UUID: %s]", + "ORG_ZSTACK_TICKET_API_10002": "no account system type [%s] defined in the configuration", + "ORG_ZSTACK_TICKET_API_10003": "Ticket type not found in the cloud environment configuration.%s", + "ORG_ZSTACK_TICKET_API_10004": "No matched ticket flow collection or default ticket flow collection found. Please specify the flowCollectionUuid or create a default ticket flow collection in the system.", + "ORG_ZSTACK_TEMPLATECONFIG_10003": "Unable to find Template Configuration[category: %s, name: %s, template UUID: %s]", + "ORG_ZSTACK_TICKET_API_10005": "Ticket flow collection [UUID:%s] does not match ticket type [UUID:%s]", + "ORG_ZSTACK_TICKET_API_10006": "Ticket flow collection[uuid:%s] is invalid. Please contact the administrator for correction.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10000": "The Aliyun NAS primary storage [UUID:%s, Name:%s] cannot find any available host within the attached clusters for instantiating the volume.", + "ORG_ZSTACK_TICKET_API_10007": "Ticket flow collection [UUID:%s] is disabled and cannot be utilized.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10001": "The Alibaba Cloud NAS primary storage [UUID:%s, Name:%s] cannot find any available host in attached clusters for deleting bits on primary storage.", + "ORG_ZSTACK_TICKET_API_10008": "invalid request. no API[%s] found in the specified namespace or scope", + "ORG_ZSTACK_TICKET_API_10009": "invalid request, cannot create API[%s] from apiBody, %s", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10010": "cannot operate VPC VM scheduling group", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10011": "The UUID of the availability zone is not null.", + "ORG_ZSTACK_TEMPLATECONFIG_10005": "Unable to find any TemplateConfigs: [templateUUID: %s]", + "ORG_ZSTACK_AI_10012": "architectureImages must not be null or empty in cloud virtualization environments. Please ensure they are properly configured.", + "ORG_ZSTACK_AI_10042": "Invalid CloudFormation template format: %s", + "ORG_ZSTACK_AI_10043": "YAML configuration and individual parameter updates are mutually exclusive in cloud computing environments. Please choose one method for updating settings.", + "ORG_ZSTACK_AI_10040": "servicePorts cannot contain duplicate values: %s", + "ORG_ZSTACK_AI_10041": "serviceBootupTime must be within the range [1,65535]", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10006": "failed to check mount path on host: %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10005": "The Aliyun NAS primary storage [UUID: %s, name: %s] has not been attached to any clusters, or there are no connected hosts in the attached clusters.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10009": "Cannot find a host to clean up image cache. Please ensure that at least one host is available and properly configured for image caching.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10013": "unable to attach a primary storage to the cluster. The KVM host [uuid:%s, name:%s] in the cluster uses qemu-img with version [%s]; however, the primary storage is attached to a cluster that has a KVM host [uuid:%s], which uses qemu-img with version [%s]. Qemu-img versions greater than %s are incompatible with those less than %s, which may cause volume snapshot operations to fail. Please avoid attaching a primary storage to clusters with different Linux distributions to prevent qemu-img version mismatches.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10014": "No available compute resource could download the image cache!", + "ORG_ZSTACK_AI_10049": "CPU architecture in the architecture image mapping cannot be empty. Please ensure that a valid CPU architecture is specified.", + "ORG_ZSTACK_AI_10046": "GPU vendor %s must provide a specification UUID list", + "ORG_ZSTACK_AI_10047": "GPU specification UUID(s) for vendor %s not found in %s: %s", + "ORG_ZSTACK_AI_10044": "GPU vendor specification mapping in architecture image mapping cannot be empty. Please ensure that the GPU vendor is correctly specified.", + "ORG_ZSTACK_AI_10045": "GPU vendor in architecture image mapping cannot be empty. Please provide a valid GPU vendor name.", + "ORG_ZSTACK_AI_10031": "modelServices UUID should not be null. Please ensure a valid UUID is provided for modelServices.", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10008": "failed to parse metadata envelope: %s, %s", + "ORG_ZSTACK_AI_10032": "nodeRank should be within [0, %s), but received %s", + "ORG_ZSTACK_AI_10030": "modelServices should use the same zone UUID as the compute nodes.", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10003": "illegal argument for source file path", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10004": "Failed to decrypt data using the provided encryption key. Please verify the key and try again.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10017": "AliyunNasAccessGroupVO[%s] does not exist, possibly due to deletion!", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10018": "EcsVSwitchVO[%s] does not exist, possibly due to deletion!", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10020": "cannot find an available host to perform operation in primary storage: %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10021": "failed to ping Aliyun NAS primary storage[UUID:%s] from host[UUID:%s], because %s. Disconnect this host-NAS connection.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10024": "cannot find any BackupStorageKVMFactory for the type[%s]", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10025": "cannot find host to manage volume: [%s]", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10023": "NAS primary storage is not mounted, please initialize it first!", + "ORG_ZSTACK_AI_10039": "servicePorts must be within the range [1,65535], but received: %s", + "ORG_ZSTACK_AI_10037": "serviceLivez must begin with a \u0027/\u0027 and contain no spaces; its length should not exceed 512 characters.", + "ORG_ZSTACK_AI_10038": "serviceReadyz must start with /, contain no spaces, and have a length of up to 512 characters", + "ORG_ZSTACK_AI_10035": "Invalid framework: %s, valid values are: EC2, GCE, Azure, OpenStack", + "ORG_ZSTACK_AI_10036": "Invalid framework: %s", + "ORG_ZSTACK_AI_10033": "Invalid PCI device identifier: %s", + "ORG_ZSTACK_AI_10034": "nodeRank should be unique, but got %s", + "ORG_ZSTACK_ACL_10001": "%s duplicate/overlap IP entry with access control list group:%s", + "ORG_ZSTACK_AI_10064": "Invalid dataset schema structures: %s", + "ORG_ZSTACK_ACL_10000": "does not support the IP version %d", + "ORG_ZSTACK_AI_10065": "System preset datasets are not permitted to be updated via API calls. Please contact support for assistance.", + "ORG_ZSTACK_AI_10062": "Dataset is in use and cannot be deleted via API. Please ensure all associated resources are terminated before attempting deletion.", + "ORG_ZSTACK_AI_10063": "updateDatasetStructs cannot be null or empty. Please ensure that the dataset structure is properly defined and populated before proceeding.", + "ORG_ZSTACK_AI_10060": "Cannot terminate VM instance because it is utilized by model service group [UUID: %s]", + "ORG_ZSTACK_ZSV_COMPUTER_VM_10000": "vm name %s already exists in the cloud environment", + "ORG_ZSTACK_AI_10061": "Sharing of Application Instance Groups is not allowed: %s", + "ORG_ZSTACK_ACL_10009": "the access control list groups[%s] already possesses one redirect rule and cannot add another one", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10028": "No available compute resource could verify the mount path!", + "ORG_ZSTACK_ACL_10008": "the access control list groups[%s] already own an IP entry, cannot add redirect rule", + "ORG_ZSTACK_ACL_10007": "the access control list groups[%s] already possesses a redirect rule; therefore, an IP entry cannot be added.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10026": "cannot find a host to sync volume size in primary: %s", + "ORG_ZSTACK_ACL_10006": "the access control list groups[%s] cannot exceed %d IP entries", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10027": "image [%s] has been deleted, cannot reinitialize root volume from it", + "ORG_ZSTACK_SCHEDULER_SNAPSHOT_10000": "the VM of the root volume [%s] is in the Destroyed state. State changes are not allowed for this job.", + "ORG_ZSTACK_ACL_10005": "the access control list groups[%s] already possesses a redirect rule; therefore, an IP entry cannot be added.", + "ORG_ZSTACK_ACL_10004": "Invalid rule expression, please ensure it complies with cloud computing standards, e.g., correct use of %s for placeholders. Details: %s", + "ORG_ZSTACK_ACL_10003": "ip range [%s, %s] overlaps with [%s, %s] within the access control list group:%s", + "ORG_ZSTACK_ACL_10002": "ip format only supports ip/iprange/cidr, but found %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10031": "Aliyun NAS PrimaryStorage only supports imagestore BS; actual type received: %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10000": "InfoSecEncryptDriver encryption failed for resource %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10001": "InfoSecEncryptDriver decryption failed for virtual resource %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10002": "encrypt data[%s] or encryption algorithm type[%s] is null", + "ORG_ZSTACK_AI_10068": "model evaluation requires ModelServiceType.ModelEval", + "ORG_ZSTACK_AI_10069": "One of dataset UUIDs or prompt is required for model evaluation.", + "ORG_ZSTACK_AI_10066": "The UUID of ModelServiceVO is mandatory. Please provide a valid UUID.", + "ORG_ZSTACK_AI_10067": "serviceType must be specified", + "ORG_ZSTACK_ACL_10012": "url[%s] is not a valid cloud storage path", + "ORG_ZSTACK_AI_10053": "Image [uuid:%s] for architecture %s is disabled and cannot be utilized", + "ORG_ZSTACK_ACL_10011": "domain[%s] is not a valid domain name", + "ORG_ZSTACK_AI_10054": "Image [uuid:%s] for the specified architecture %s is not available and cannot be used.", + "ORG_ZSTACK_ACL_10010": "Domain and URL cannot both be empty. Please provide either a valid domain or URL.", + "ORG_ZSTACK_AI_10051": "At least one virtual machine image identifier (vmImageUuid) or container image (dockerImage) must be specified for architecture %s", + "ORG_ZSTACK_AI_10052": "Invalid image UUID for architecture %s: %s", + "ORG_ZSTACK_AI_10050": "Invalid CPU architecture type in architecture image mapping: %s, supported types include: %s", + "ORG_ZSTACK_AI_10059": "Too many data type variations in dataset messages: %s, please reduce to a single type", + "ORG_ZSTACK_AI_10057": "Creating a dataset without specifying the data type and usage scenarios is not permitted in cloud computing environments. Please provide the necessary details for your dataset.", + "ORG_ZSTACK_AI_10058": "At least one dataset data type must be specified when adding a dataset.", + "ORG_ZSTACK_AI_10055": "Duplicate CPU architecture specified in the architecture image mapping: %s", + "ORG_ZSTACK_AI_10056": "architecture images cannot be empty", + "ORG_ZSTACK_VMWARE_10101": "list storage failed for %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10051": "LUN name is mandatory but received null. Please ensure a valid LUN name is provided.", + "ORG_ZSTACK_VMWARE_10102": "No datastore found for VirtualMachine: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10054": "fail to get snapshot for volume:%s of id is :%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10053": "fail to get snapshot for lun:%s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10012": "SFTP backup storage does not support calculating image hashes.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10050": "initiator[%s] already exists in XStor and is not attached to host[%s]. Please ensure that the initiator name is unique.", + "ORG_ZSTACK_ALIYUN_NETWORK_10020": "Only EC2 instances that are in the running or stopped state can attach an EIP, but the ECS [%s] is currently in the [%s] state.", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10016": "create image metadata file: %s failed", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10017": "check image metadata file: %s failed", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10018": "image metadata file: %s does not exist", + "ORG_ZSTACK_ZWATCH_ALARM_10022": "duplicated action[uuid:%s, type:%s] for the alarm[uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10021": "action[uuid:%s, type:%s] not found in the cloud computing environment", + "ORG_ZSTACK_ZWATCH_ALARM_10020": "invalid action type[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10026": "duplicate key[%s] with different values{%s}%", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10170": "could not add server IP to share load balancer server group %s", + "ORG_ZSTACK_ZWATCH_ALARM_10025": "the metric does not have the specified label[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10023": "duplicate label defined for the alarm with UUID [uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10029": "the metric[%s] is restricted to administrators and is not available for your current user role.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10171": "could not modify backend server because vmincs and server IPs are null", + "ORG_ZSTACK_ZWATCH_ALARM_10028": "namespace[%s] does not contain the metric[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10027": "namespace[%s] is not supported", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10049": "LUN ID is invalid. Please ensure it conforms to the required format and values for cloud storage devices.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10048": "LUN mapping ID is mandatory and cannot be null or zero. Please provide a valid LUN mapping ID.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10045": "fail to get volume mappings, because of: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10044": "fail to check LUN %s session state because of: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10047": "There is no mechanism to retrieve the LUN mapping ID; therefore, the operation has failed.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10046": "fail to get LUN %s remain created LUN number, because of: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10041": "snapshot ID is mandatory but got:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10040": "fail to query snapshots for instance %s because of %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10043": "fail to revert snapshot:%s due to: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10020": "Please stop the VM before creating a volume template for SFTP backup storage %s.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10042": "fail to delete snapshot %s due to %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10023": "duplicate backup storage. There has been an SFTP backup storage[hostname:%s] existing", + "ORG_ZSTACK_LICENSE_CUBE_10000": "The source code context cannot be null for license validation. Please provide a valid context string.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10038": "fail to retrieve storage pool %s due to %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10037": "fail to delete lun %s due to %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10039": "fail to create snapshot for volume %s due to %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10034": "lun mapping id is mandatory but got:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10033": "fail to map lun %s to host group %s due to %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10036": "lun id is mandatory but got:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10035": "fail to delete lun mapping %s due to %s", + "ORG_ZSTACK_ALIYUN_NETWORK_10004": "ecs instance[%s] does not exist, please verify it.", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10001": "%s failed to download virtual machine bits from the image store backup storage[hostname:%s, path: %s] to the local primary storage[uuid:%s, path: %s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10002": "failed to upload bits from local storage[uuid:%s, path:%s] to image store [hostname:%s], %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10020": "l3network %s and VPC %s are already connected. Please verify.", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10000": "The source VM has a local data volume on host [UUID: %s], but the fast clone API attempt to clone the VM to host [%s], which is not supported by the fast clone feature.", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10000": "AutoScalingRuleSchedulerJobTriggerVO[UUID:%s] is in %s state, state change is not allowed", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10001": "AutoScalingRuleSchedulerJobTriggerVO[uuid:%s] is in cooldown period", + "ORG_ZSTACK_ALIYUN_NETWORK_10008": "virtual border: %s has been terminated", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10002": "AutoScalingRuleVO[uuid:%s] is in %s state, state transition is not permitted", + "ORG_ZSTACK_ALIYUN_NETWORK_10005": "Only ECS instances in the running or stopped state can detach an EIP, but the current status of ECS [%s] is [%s].", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10018": "CpeIp must be an IPv4 address, but now it is %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10017": "Only administrative users can establish connections in this cloud environment.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10019": "cpeIp must be a valid IPv4 address", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10000": "SftpBackupStorage does not support scheme[%s] in URL[%s]", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10014": "no such virtual machine backup found for: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10013": "no such virtual machine found for: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_10010": "destination CIDR [%s] already exists and points to another instance ID [%s]. Please check or delete it first.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10061": "Failed to retrieve image cache LUN information", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10016": "not a supported instance type: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10003": "fail to cancel download image, because %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10060": "New image cache is not ready. Please wait for a moment and retry.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10015": "no such network found for: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10004": "The UUID of the SFTP Backup Storage agent has changed [expected: %s, actual: %s], which is most likely due to a manual restart of the agent. Please issue a reconnect to synchronize the status.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10010": "No CIDR found for L3 Network: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10012": "no such virtual private network found for: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10059": "cannot find volume: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10055": "XSStor cluster is unhealthy, cluster info[clusterDataState: %s, clusterHealthyState: %s, clusterRunningState: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10058": "illegal logical unit number (LUN) ID specified", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10057": "The session for lun %s with host %s is not active in the virtualized environment.", + "ORG_ZSTACK_HYBRID_NETWORK_10027": "cidr is overlapped by another vswitch: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10028": "invalid CIDR block: %s must be within \u002710.0.0.0/8\u0027, \u0027172.16.0.0/12\u0027, or \u0027192.168.0.0/16\u0027 ranges", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10010": "fail to terminate instance %s due to %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10009": "No such virtual network interface found for layer 3 network: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10029": "no such virtual border router: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10003": "custom CIDR [%s] already exists in VBR [%s], overlapping with target CIDR [%s]. Please check and delete it first.", + "ORG_ZSTACK_HYBRID_NETWORK_10020": "next-hop router interface belongs to %s, but the entry belongs to %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10001": "Vbr: [%s] is currently establishing a connection, please wait...", + "ORG_ZSTACK_HYBRID_NETWORK_10021": "no such virtual private gateway: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10000": "custom CIDR [%s] already exists in virtual router [%s], overlapping with target CIDR [%s]. Please check and delete it first.", + "ORG_ZSTACK_HYBRID_NETWORK_10022": "next hop type [%s] is not supported for creating a route entry!", + "ORG_ZSTACK_HYBRID_NETWORK_10024": "virtual border router only supports router interface as next hop type", + "ORG_ZSTACK_HYBRID_NETWORK_10026": "vswitch\u0027s cidr [%s] is not within the vpc\u0027s [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10008": "fail to add instance %s into host group %s, because of %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10005": "fail to get access zone\u0027s subnet because %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10004": "fail to sync access zones because %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10007": "fail to query instances %s because of %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10006": "fail to query all instances, because of %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10001": "fail to add initiator: %s to host, due to %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10000": "fail to authenticate with XStor device: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10002": "fail to copy LUN: %s to %s, because of %s", + "ORG_ZSTACK_HYBRID_NETWORK_10038": "eip[%s] and ecs[%s] should be in the same availability zone", + "ORG_ZSTACK_VMWARE_10135": "failed to set ZStack UUID to VCenter Managed Entity [name:%s, mor:%s] because %s", + "ORG_ZSTACK_HYBRID_NETWORK_10039": "couldn\u0027t detach eip: [%s], it is not attached to any instance", + "ORG_ZSTACK_VMWARE_10132": "No unit number available for data disk %s", + "ORG_ZSTACK_VMWARE_10133": "create dvPortGroup failed for distributedSwitch [%s], %s", + "ORG_ZSTACK_VMWARE_10130": "delete volume[%s] failed: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10030": "no such virtual router exists: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10031": "localGateway is not an IPv4 address: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10032": "peerGateway is not a valid IPv4 address: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10033": "peerGateway is not a valid Subnet Mask: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10034": "vlanId must be a numeric value: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10035": "couldn\u0027t attach eip to ecs: [%s] , eip :[%s] is already attached to ecs:[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10036": "ecs [%s] already has a public IP address now", + "ORG_ZSTACK_HYBRID_NETWORK_10037": "couldn\u0027t attach EIP [%s] to ECS [%s], as the ECS is already associated with an EIP", + "ORG_ZSTACK_SSO_SERVICE_10014": "Virtual ID does not exist for user %s", + "ORG_ZSTACK_VMWARE_10129": "Virtual disk manager service unavailable. Please check if the service is running or contact support for assistance.", + "ORG_ZSTACK_SSO_SERVICE_10011": "response has error: The source file was not found in the cloud storage system. Please check the file path and ensure it is correctly uploaded to the virtualized environment.", + "ORG_ZSTACK_SSO_SERVICE_10010": "redirectUrl is invalid, %s", + "ORG_ZSTACK_VMWARE_10128": "No data center found for the datastore.%s", + "ORG_ZSTACK_SSO_SERVICE_10013": "account does not exist for user %s", + "ORG_ZSTACK_SSO_SERVICE_10012": "Failed to generate user information mapping configuration for SSO client [UUID: %s]: no custom attribute mappings defined.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10030": "fail to query LUN mapping for host group %s due to %s", + "ORG_ZSTACK_HYBRID_NETWORK_10005": "router interface must be within the same datacenter, but ri[%s] is in dc[%s] and ri[%s] is in dc[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10032": "fail to retrieve cluster information due to %s", + "ORG_ZSTACK_VMWARE_10121": "create dvPortGroup failed for %s", + "ORG_ZSTACK_HYBRID_NETWORK_10007": "router interface[%s] is not in an idle state, current status is %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10031": "fail to query LUN mapping %s due to %s", + "ORG_ZSTACK_HYBRID_NETWORK_10009": "router interface[%s] already has an active connection, it is %s", + "ORG_ZSTACK_VMWARE_10120": "dvSwitch [%s] not found on vCenter [%s]. Please ensure the dvSwitch exists and is correctly configured.", + "ORG_ZSTACK_GUESTTOOLS_10009": "No suitable guest OS tools ISO found on management node [UUID:%s] for host [UUID:%s].", + "ORG_ZSTACK_GUESTTOOLS_10007": "cannot obtain the latest guest tools for vm[uuid:%s] as it is not running or undergoing volume recovery.", + "ORG_ZSTACK_ZWATCH_ALARM_10000": "cannot find the event subscription [uuid:%s], it may have been deleted or revoked", + "ORG_ZSTACK_GUESTTOOLS_10008": "cannot obtain the latest guest tools for VM[UUID:%s] as it is not a user-managed VM", + "ORG_ZSTACK_GUESTTOOLS_10005": "qgaStateChange failed for virtual machine[uuid:%s]", + "ORG_ZSTACK_GUESTTOOLS_10006": "cannot retrieve the latest guest tools for VM [uuid:%s] as its hypervisor type is not supported", + "ORG_ZSTACK_GUESTTOOLS_10004": "qga file upload failed[%s]", + "ORG_ZSTACK_GUESTTOOLS_10001": "An error occurred on VM-%s: %s", + "ORG_ZSTACK_ZWATCH_ALARM_10002": "the metric[%s] repeat interval value cannot be less than 1 hour", + "ORG_ZSTACK_GUESTTOOLS_10002": "upload file failed to virtual machine-%s, %s", + "ORG_ZSTACK_ZWATCH_ALARM_10001": "cannot find the alarm[uuid:%s], it may have been deleted or expired", + "ORG_ZSTACK_SSO_SERVICE_10008": "Token %s does not exist in the cloud environment configuration. Please verify and re-enter the token.", + "ORG_ZSTACK_AI_10109": "model center [uuid: %s] instance not found", + "ORG_ZSTACK_SSO_SERVICE_10007": "Failed to upload administrator credentials to Keycloak. Please ensure that the necessary permissions and network configurations are correctly set up for cloud deployment.", + "ORG_ZSTACK_ZWATCH_ALARM_10007": "The event subscription already has the label[%s]", + "ORG_ZSTACK_AI_10107": "model service instance (primary) with node rank 0 not found in model service instance group[uuid: %s]", + "ORG_ZSTACK_ZWATCH_ALARM_10006": "event doesn\u0027t have label[%s]", + "ORG_ZSTACK_SSO_SERVICE_10009": "%s data type not supported in cloud computing environments", + "ORG_ZSTACK_AI_10108": "Model service instance group %s not found in the cloud environment", + "ORG_ZSTACK_ZWATCH_ALARM_10005": "The action with UUID [%s] is already associated with the event subscription with UUID [%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10027": "fail to create LUN name: %s, error message: %s", + "ORG_ZSTACK_SSO_SERVICE_10004": "IdP metadata URL is required.%s", + "ORG_ZSTACK_AI_10105": "Deploy model service succeeded, but the model service instance UUID is missing. Please check the instance configuration.", + "ORG_ZSTACK_SSO_SERVICE_10003": "Invalid Authorization Endpoint URL: %s", + "ORG_ZSTACK_AI_10106": "Model service instance UUIDs are empty; cannot process model service instances. Please ensure that UUIDs are provided.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10029": "LUN ID is mandatory when querying LUN mapping information.", + "ORG_ZSTACK_SSO_SERVICE_10006": "Invalid Identity Provider metadata: %s", + "ORG_ZSTACK_AI_10103": "model service instance group [UUID: %s] not found, skipping creation of resource for service execution", + "ORG_ZSTACK_VMWARE_10118": "create port group failed for host %s because %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10028": "fail to query LUN %s due to %s", + "ORG_ZSTACK_AI_10104": "deploy model service reply success, but model service instance group[uuid: %s] not found in the virtual machine instance pool", + "ORG_ZSTACK_VMWARE_10119": "create port group failed for host %s", + "ORG_ZSTACK_AI_10101": "model storage backend not found for model service instance group[uuid: %s]", + "ORG_ZSTACK_VMWARE_10116": "portgroup[%s] already exists on host[%s] but with a different VLAN ID(%d)", + "ORG_ZSTACK_AI_10102": "failed to allocate model service instance identifier, because %s", + "ORG_ZSTACK_VMWARE_10117": "portgroup[%s] already exists on host[%s]. Please create a new port group with a different name or delete the existing port group manually and attach it to the cluster again.", + "ORG_ZSTACK_SSO_SERVICE_10002": "SSO client is not an identity type [%s], push operation is not allowed.", + "ORG_ZSTACK_VMWARE_10114": "dvSwitch name [%s] is not unique", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10024": "fail to create LUN name: %s, cannot find root cause", + "ORG_ZSTACK_SSO_SERVICE_10001": "SSO client with UUID [%s] does not exist.", + "ORG_ZSTACK_AI_10100": "model service instance group[uuid: %s] model service UUID is null", + "ORG_ZSTACK_VMWARE_10115": "Host[%s:%s] not found in vCenter inventory", + "ORG_ZSTACK_VMWARE_10112": "list dvSwitch failed for %s", + "ORG_ZSTACK_HYBRID_NETWORK_10016": "%s is not a valid CIDR block", + "ORG_ZSTACK_VMWARE_10113": "get vCenter cluster[%s] name failed", + "ORG_ZSTACK_HYBRID_NETWORK_10017": "A security group rule with the same parameters already exists. Please modify or delete the existing rule before creating a new one.", + "ORG_ZSTACK_VMWARE_10110": "guest tools are not installed or running for VM: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10018": "dstCidrBlock[%s] is not a valid IPv4 or IPv6 address range", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10020": "fail to update LUN name: %s, error message: %s", + "ORG_ZSTACK_VMWARE_10111": "upload file failed for virtual machine: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10019": "no such ECS instance: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10010": "accessPointUuid cannot be null if the virtual router is of type VBR.", + "ORG_ZSTACK_HYBRID_NETWORK_10011": "cannot find such router UUID[%s] in VirtualBorderRouterVO", + "ORG_ZSTACK_GUESTTOOLS_10018": "could not migrate VM[UUID:%s], as a vfNic is attached but guest tools are not running", + "ORG_ZSTACK_ZWATCH_ALARM_10011": "event[%s] lacks label[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10012": "cannot find router UUID[%s] in VpcVirtualRouterVO", + "ORG_ZSTACK_GUESTTOOLS_10019": "could not attach L3 network to VM [UUID:%s], because guest tools are not running.", + "ORG_ZSTACK_ZWATCH_ALARM_10010": "namespace[%s] does not contain the event[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10013": "not supported router type: %s", + "ORG_ZSTACK_GUESTTOOLS_10016": "could not change VF NIC HA state because VF NIC [UUID:%s] is not found", + "ORG_ZSTACK_HYBRID_NETWORK_10014": "Cannot delete system-level virtual machine entry", + "ORG_ZSTACK_GUESTTOOLS_10017": "Failed to change the state of the virtual network interface card for high availability because the guest tools are not running. Please ensure the guest tools are installed and running before attempting this operation again.", + "ORG_ZSTACK_HYBRID_NETWORK_10015": "only support intranet access rule in VPC", + "ORG_ZSTACK_GUESTTOOLS_10014": "The script contains placeholder %s that have no corresponding parameters. Please provide values for these placeholders via runtimeParams to ensure proper configuration of your cloud computing environment.", + "ORG_ZSTACK_ZWATCH_ALARM_10015": "Period field is not supported for metric [name:%s]", + "ORG_ZSTACK_GUESTTOOLS_10015": "could not migrate primary storage because VM [UUID:%s] is attached to a VF Nic but Guest Tools are not running", + "ORG_ZSTACK_ZWATCH_ALARM_10014": "Period field cannot be null for metric [name:%s]", + "ORG_ZSTACK_GUESTTOOLS_10012": "encodingType and scriptContent must be either both present or both absent in your cloud deployment configuration.", + "ORG_ZSTACK_ZWATCH_ALARM_10013": "namespace[%s] not found in the specified cloud namespace registry", + "ORG_ZSTACK_GUESTTOOLS_10013": "Invalid renderParams format, must be a valid JSON array of key-value pairs. Example: [{\\\"key\\\":\\\"k1\\\",\\\"value\\\":\\\"v1\\\"}]. Error: %s", + "ORG_ZSTACK_GUESTTOOLS_10010": "failed to check guest tools on host[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10019": "fail to query LUN by path: %s, error message: %s", + "ORG_ZSTACK_GUESTTOOLS_10011": "failed to set VM UUID: %s NAME: %s hostname because QEMU Guest Agent is not running and there is no DHCP service", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10016": "fail to add host group: %s, error message: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10015": "fail to query host group due to %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10017": "fail to query LUN: %s, error message: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10012": "fail to delete host group %s due to %s", + "ORG_ZSTACK_VMWARE_10105": "No resource pool found for compute host %s", + "ORG_ZSTACK_VMWARE_10106": "failed to search resource pool for host %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10014": "fail to delete initiator %s due to %s", + "ORG_ZSTACK_VMWARE_10103": "failed to set ESX VM UUID [%s:%s], because of [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10013": "host identifier is mandatory but got:%s", + "ORG_ZSTACK_VMWARE_10104": "template [%%s] not found in the cloud template repository", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10029": "cannot find build instance with UUID: %s, or it was in Deleting status", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10028": "cannot find UUID for image[%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10027": "imageStore is not connected to the cloud storage service. Please ensure that your cloud storage service is properly configured and try again.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10026": "imageStore is not enabled. Please ensure that imageStore is configured and enabled in your cloud environment settings.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10024": "cannot find build application: [%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10022": "build system [UUID: %s] has not been attached to compute zone [UUID: %s]", + "ORG_ZSTACK_CONTAINER_10040": "Failed to create deployment on any available cluster. Tried %d clusters: %s", + "ORG_ZSTACK_FLOWMETER_10013": "Collector duplicate with %s", + "ORG_ZSTACK_FLOWMETER_10014": "No specified parameters for cloud resource provisioning request. Please specify %s.", + "ORG_ZSTACK_FLOWMETER_10015": "[%s] does not conform to IP address format", + "ORG_ZSTACK_FLOWMETER_10016": "FlowCollector[%s] does not exist", + "ORG_ZSTACK_GUESTTOOLS_10029": "cannot retrieve guest tools information from VM [uuid:%s] as it is not running", + "ORG_ZSTACK_CONTAINER_10043": "Fail to query cloud service: %s, because of %s", + "ORG_ZSTACK_FLOWMETER_10017": "FlowMeter[%s] does not exist", + "ORG_ZSTACK_FLOWMETER_10018": "FlowMeter[%s] does not support IPv6 version [%s]", + "ORG_ZSTACK_GUESTTOOLS_10027": "cannot attach guest tools ISO to VM [UUID:%s] as it is not a user VM", + "ORG_ZSTACK_CONTAINER_10045": "Fail to create service due to %s", + "ORG_ZSTACK_FLOWMETER_10019": "Collector [%s %d] duplicates with %s", + "ORG_ZSTACK_GUESTTOOLS_10028": "cannot attach guest tools ISO to VM [uuid:%s] because it lacks a CDROM device", + "ORG_ZSTACK_CONTAINER_10037": "Cannot find any containerized clusters. Please check NativeClusterVO for details.", + "ORG_ZSTACK_GUESTTOOLS_10025": "cannot attach guest tools ISO to VM [uuid:%s] because the hypervisor type is not supported", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10057": "failed to shut down baremetal chassis[uuid:%s] using ipmitool", + "ORG_ZSTACK_GUESTTOOLS_10026": "cannot attach guest tools ISO to VM [UUID:%s] because it is not running", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10058": "failed to shut down baremetal instance[uuid:%s] via bm agent, reason: %s", + "ORG_ZSTACK_GUESTTOOLS_10023": "update vm[uuid:%s] network configuration failed because the guest tools version is too low for this feature.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10059": "baremetal2 chassis[uuid:%s] is still not powered off %d seconds later", + "ORG_ZSTACK_GUESTTOOLS_10024": "update vm[uuid:%s] network configuration failed because guest tools are not running.", + "ORG_ZSTACK_GUESTTOOLS_10021": "Conflict detected with hostname. Another VM with UUID [%s] is already using the hostname [%s] on L3 network with UUID [%s].", + "ORG_ZSTACK_GUESTTOOLS_10022": "update vm[uuid:%s] network configuration failed because the virtual machine is not running.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10054": "failed to establish a connection with baremetal2 instance [uuid:%s] via gateway [uuid:%s], due to %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10055": "failed to change the password of baremetal instance[uuid:%s] through gateway[uuid:%s], because %s", + "ORG_ZSTACK_GUESTTOOLS_10020": "unable to set VM hostname. The VM [UUID:%s] does not have a default Layer 3 network.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10056": "failed to power on baremetal chassis[uuid:%s] using ipmitool", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10021": "cannot find build system [%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10020": "build system [UUID: %s] has been attached to zone [UUID: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10050": "failed to create console proxy for baremetal instance[uuid:%s] in gateway[uuid:%s], because %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10051": "failed to switch default network from l3[uuid:%s] to l3[uuid:%s] for baremetal instance[uuid:%s], due to %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10018": "add BuildApp failed because appId[%s:%s] is duplicated by another BuildApp instance", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10017": "unable to connect to local storage build system [url: %s], because of a connectivity issue", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10016": "create BuildApp failed because appId[%s] is duplicated by another BuildApp", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10015": "The build application is disabled because the build system is in the \u0027Stopped\u0027 state. Please start the build system to enable the application.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10014": "rest call %s failed, because: %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10013": "build app is in %s status, which does not support the current operation.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10012": "cannot find the build application by UUID[%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10011": "unable to perform the operation because the build system is in status of %s", + "ORG_ZSTACK_CONTAINER_10031": "Deployment not found: %s", + "ORG_ZSTACK_FLOWMETER_10003": "The network[%s] has been integrated into the flow meter[%s].", + "ORG_ZSTACK_FLOWMETER_10004": "The virtual router has been added to another flow meter. Please ensure it is not duplicated.", + "ORG_ZSTACK_FLOWMETER_10005": "invalid type parameter is %s and should be from the valid range %s", + "ORG_ZSTACK_CONTAINER_10032": "Fail to patch deployment because of %s", + "ORG_ZSTACK_CONTAINER_10034": "Fail to replace deployment due to %s", + "ORG_ZSTACK_CONTAINER_10026": "Fail to delete service because of %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10046": "failed to destroy provisioning network in gateway[uuid:%s], because %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10047": "no provisioned NIC found for baremetal instance[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10048": "failed to create provisioning configurations for baremetal instance[uuid:%s] in gateway[uuid:%s], because %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10049": "failed to delete provisioning configurations for baremetal instance[uuid:%s] in gateway[uuid:%s], because %s", + "ORG_ZSTACK_IMAGEREPLICATOR_10000": "target backup storage[uuid:%s] became unavailable for use", + "ORG_ZSTACK_GUESTTOOLS_10032": "cannot update guest tools state for vm [uuid:%s] as the vm has been deleted", + "ORG_ZSTACK_ALIYUN_OSS_10002": "AWS access key ID, secret access key, and region must be set simultaneously.", + "ORG_ZSTACK_CONTAINER_10029": "API error: The source file was not found in the cloud storage system. Please check the file path and try again.", + "ORG_ZSTACK_IMAGEREPLICATOR_10001": "One or more backup storages[uuids:%s] have been added to replication group[uuid:%s].", + "ORG_ZSTACK_ALIYUN_OSS_10003": "OSS bucket is not empty! Please ensure the bucket is empty before proceeding with the operation.", + "ORG_ZSTACK_GUESTTOOLS_10030": "cannot retrieve guest tools information from VM [UUID:%s] as it is not a user VM", + "ORG_ZSTACK_ALIYUN_OSS_10000": "ossBucket [%s] is already registered in dataCenter [%s]", + "ORG_ZSTACK_GUESTTOOLS_10031": "invalid debug parameter: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10045": "failed to prepare provisioning network in gateway[uuid:%s], because %s", + "ORG_ZSTACK_ALIYUN_OSS_10001": "OssBucket[%s] is not associated.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10010": "Both export ID and build application UUID are set but they do not match. Please verify the values of %s and %d.", + "ORG_ZSTACK_IMAGEREPLICATOR_10002": "Backup storage[uuids:%s] is not of type ImageStoreInstance", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10040": "Image data conversion to local disk failed. Please ensure sufficient storage resources and correct permissions. If the issue persists, consider using object storage services for image management.", + "ORG_ZSTACK_IMAGEREPLICATOR_10003": "Backup storage [UUIDs:%s] is not associated with any Zone", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10041": "baremetal2 instance [uuid:%s] volume conversion failed on chassis [uuid:%s], timeout after %d minutes", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10035": "Failed to retrieve iSCSI target IQN or gateway IP for volume [uuid:%s] from primary storage [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10037": "chassis:%s disk does not have WWN information, please inspect the chassis and try again", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10031": "failed to detach provisioned NIC from bonding on baremetal instance [uuid:%s] through gateway [uuid:%s], because %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10032": "baremetal2 instance[uuid:%s] is not connected; therefore, it cannot attach a provisioned NIC to a bond.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10033": "failed to attach provisioned NIC to bonding on baremetal instance [uuid:%s] through gateway [uuid:%s], because %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10030": "baremetal2 instance[uuid:%s] is not connected; therefore, it is unable to detach the provisioning NIC from the bonding configuration.", + "ORG_ZSTACK_CONTAINER_10051": "Failed to find Kubernetes client for account[uuid:%s]", + "ORG_ZSTACK_CONTAINER_10050": "Kubernetes configuration for cluster %s is null", + "ORG_ZSTACK_CONTAINER_10052": "fail to utilize kube config file content: %s", + "ORG_ZSTACK_CORE_PROGRESS_10000": "parameter apiId[%s] is not a valid UUID for cloud service configuration.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10029": "failed to delete convert volume to chassis local disk configurations in gateway[uuid:%s] for baremetal instance[uuid:%s]", + "ORG_ZSTACK_CONTAINER_10056": "Cannot find Container Backup Storage with UUID: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10024": "provisioned_ip %s is unavailable as it cannot connect to the gateway %s; detailed error:%s", + "ORG_ZSTACK_CONTAINER_10047": "Failed to retrieve service status bundle for service[%s]", + "ORG_ZSTACK_CONTAINER_10049": "Cannot find cluster by specified cluster id: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10027": "failed to inspect BareMetal2 chassis by instance[uuid:%s] through gateway[uuid:%s], because %s", + "ORG_ZSTACK_STORAGE_CBT_10020": "Unexpected VM[UUID: %s] state: %s, the expected VM state is Running.", + "ORG_ZSTACK_STORAGE_CBT_10021": "The VM [UUID: %s] has already created a backup job; therefore, enabling the CBT task is not permitted simultaneously.", + "ORG_ZSTACK_STORAGE_CBT_10016": "No hypervisor type specified for VM %s", + "ORG_ZSTACK_STORAGE_CBT_10017": "No CBTBackupFactory of type[%s] found in the configured cloud storage providers", + "ORG_ZSTACK_STORAGE_CBT_10014": "VM [uuid: %s] has been protected by task: %s", + "ORG_ZSTACK_STORAGE_CBT_10015": "create cbt volumes failed. details: %s", + "ORG_ZSTACK_STORAGE_CBT_10018": "CVM task not found[uuid: %s]", + "ORG_ZSTACK_STORAGE_CBT_10019": "Cbt task [UUID: %s] has already been enabled. Please disable it.", + "ORG_ZSTACK_CONTAINER_10000": "container backup storage does not support the specified format %s", + "ORG_ZSTACK_CONTAINER_10002": "No availability zone found for endpoint[%s]", + "ORG_ZSTACK_IAM2_RBAC_10006": "the operations[%s] are denied in this cloud computing environment", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10008": "get virtual network[uuid:%s] from tf controller failed", + "ORG_ZSTACK_IAM2_RBAC_10001": "Since the project requires forced security group usage, a system tag is mandatory for virtual machine operations.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10009": "update tf l2 network[name:%s] on tf controller failed", + "ORG_ZSTACK_IAM2_RBAC_10000": "create vm instance failed because l3 network [uuid:%s] is not attached to any compute clusters", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10006": "create tf L2 network[name:%s] on tf controller failed", + "ORG_ZSTACK_IAM2_RBAC_10003": "project[uuid:%s] has been retired and all operations are rejected.", + "ORG_ZSTACK_IAM2_RBAC_10002": "project of account[uuid:%s] does not exist", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10005": "get project[uuid:%s] failed on Terraform controller", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10002": "Default domain retrieval failed on the TensorFlow controller.%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10003": "Create TF project for ZStack Admin on TF Controller failed", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10000": "The SDN Controller with the specified name already exists. Please choose a different name or use an existing one.", + "ORG_ZSTACK_STORAGE_CBT_10012": "cannot find the resource for CBT task[uuid: %s]", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10001": "Failed to retrieve default admin account from ZStack database", + "ORG_ZSTACK_STORAGE_CBT_10013": "host not found for virtual machine: %s", + "ORG_ZSTACK_STORAGE_CBT_10011": "volume[uuid:%s] is already exported for vmInstance[uuid:%s].", + "ORG_ZSTACK_STORAGE_CBT_10006": "cannot find the Cloud Block Storage task[uuid:%s]", + "ORG_ZSTACK_STORAGE_CBT_10009": "vm[uuid: %s] is currently running. Please stop it and try again.", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10004": "wrong type of parameter \u0027%s\u0027 in the expression, it must be of type %s, but got %s", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10003": "missing parameter \u0027%s\u0027 in the cloud computing expression", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10000": "invalid expression: %s, %s Please ensure that the expressions are valid for cloud computing environments.", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10001": "invalid expression: %s, no valid cloud computing expression found", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10019": "add tf l3 subnet[name:%s] on tf controller failed due to:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10082": "baremetal2 gateway with UUID: %s is not connected; therefore, a console URL cannot be generated for instance with UUID: %s.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10016": "update tf l3 network[name:%s] on tf controller failed due to:%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10013": "delete tf L3 network[name:%s] on tf controller failed due to:%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10011": "delete l2 network[uuid:%s] on tf controller failed", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10080": "failed to prepare provisioning network[uuid:%s] in gateway[uuid:%s]: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10081": "baremetal2 instance [uuid:%s] does not exist; therefore, its console URL cannot be generated.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10007": "buildAppUuid and exportId cannot both be null simultaneously. Please ensure that either buildAppUuid or exportId is provided.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10006": "both backup storage UUID and hostname are set, but they refer to different hosts", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10005": "find more than one backup storage with hostname: %s, please use backupStorageUuid instead", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10004": "cannot find image store with hostname: %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10003": "Both backup storage UUID and host name are null. Please verify the configuration settings for backup storage and host name.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10002": "dataPath must start with \u0027/\u0027, actually got [%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10001": "another build system[UUID: %s, name: %s] in this host[%s] is utilizing the same URL[%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10000": "build-app[%s] is in a state of being exported or exporting; please terminate or remove it first.", + "ORG_ZSTACK_CAS_10000": "missing property for CAS driver configuration", + "ORG_ZSTACK_CAS_10002": "wrong virtual machine ID[name:%s], not existing or wrong password", + "ORG_ZSTACK_CONTAINER_10020": "Fail to delete network policy due to %s", + "ORG_ZSTACK_CAS_10001": "Unsupported CAS driver: %s", + "ORG_ZSTACK_CONTAINER_10022": "cluster ID is null when creating network policy", + "ORG_ZSTACK_CAS_10003": "There is no such data type[%s] defined in CAS.", + "ORG_ZSTACK_CONTAINER_10024": "Fail to create network policy due to %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10009": "No export task found with ID %s in the build export history. Please verify the export task ID and try again.", + "ORG_ZSTACK_CONTAINER_10023": "cannot retrieve ApiClient by cluster ID: %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10008": "buildAppUuid and buildSystemUuid cannot both be null. Please ensure that either buildAppUuid or buildSystemUuid is provided.", + "ORG_ZSTACK_CONTAINER_10015": "Fail to delete deployment because of %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10079": "cluster[uuid:%s] hypervisor type is not valid", + "ORG_ZSTACK_CONTAINER_10017": "Cannot find pod[name\u003d%s, namespace\u003d%s]", + "ORG_ZSTACK_CONTAINER_10016": "Failed to terminate deployment due to an unspecified error.%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10075": "failed to retrieve gateway IP addresses of the access path [iscsiPath: %s] for block volume %s due to %s", + "ORG_ZSTACK_CONTAINER_10018": "Fail to add label to pod due to %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10076": "failed to detach volume[uuid:%s] from baremetal instance[uuid:%s] through gateway[uuid:%s], because %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10028": "add DNS configuration to layer 3 network [name:%s] on TensorFlow controller failed due to:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10077": "failed to destroy volume[uuid:%s] for baremetal instance[uuid:%s] in gateway[uuid:%s], because %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10078": "All Ceph MONs of the primary storage [uuid:%s] are not in a Healthy state", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10072": "baremetal2 instance[uuid:%s] is not connected; therefore, a volume cannot be attached to it.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10073": "Failed to retrieve volume LUN ID on external primary storage %s. Please ensure the storage system is properly configured and accessible.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10025": "delete host route from virtual network[name:%s] on traffic manager controller failed due to:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10074": "failed to retrieve volume [uuid:%s] LUN ID for bare metal instance [uuid:%s] in gateway [uuid:%s], due to %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10022": "add host router to layer-3 network[name:%s] on tf controller failed due to:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10070": "failed to attach volume with UUID: %s to baremetal instance with UUID: %s through gateway with UUID: %s due to %s", + "ORG_ZSTACK_FLOWMETER_10021": "%s must be a numeric value", + "ORG_ZSTACK_LOG4J2_10001": "Unknown log4j2 appender type %s", + "ORG_ZSTACK_LOG4J2_10000": "No factory found for Log4j2 appender type:%s.", + "ORG_ZSTACK_CONTAINER_10011": "No host found for uuid[%s]", + "ORG_ZSTACK_CONTAINER_10013": "Cannot find Container Management Endpoint [uuid:%s]", + "ORG_ZSTACK_CONTAINER_10012": "No provider found for vendor[%s]", + "ORG_ZSTACK_CONTAINER_10004": "Host[%s] is not associated with endpoint[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10068": "failed to provision volume[uuid:%s] for baremetal instance[uuid:%s] through gateway[uuid:%s], because %s", + "ORG_ZSTACK_CONTAINER_10005": "No cluster found for endpoint[%s]", + "ORG_ZSTACK_CONTAINER_10008": "Failed to list instances for cluster[%s]: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10064": "failed to attach NIC with UUID:%s to Baremetal2 instance with UUID:%s via Gateway with UUID:%s due to %s", + "ORG_ZSTACK_CONTAINER_10007": "Zone[%s] does not match the Endpoint[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10065": "baremetal2 instance[uuid:%s] is not connected; therefore, it cannot be detached from its network interface.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10066": "failed to detach network interface [uuid:%s] from bare metal instance [uuid:%s] through gateway [uuid:%s], because %s", + "ORG_ZSTACK_CONTAINER_10009": "Cluster[%s] already exists in endpoint[%s] with different availability zone[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10060": "Ensure all BareMetal2 gateways on the provisioning network [uuid:%s] are connected.", + "ORG_ZSTACK_CONFIGURATION_10011": "unsupported primary storage allocation strategy[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10061": "The list of VM instance UUIDs is empty. Please provide at least one valid UUID.", + "ORG_ZSTACK_CONFIGURATION_10010": "unsupported host allocation strategy[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10062": "the baremetal2 gateway [UUID: %s, status: %s] is not connected", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10063": "baremetal2 instance[uuid:%s] is not connected; therefore, it cannot have a NIC attached to it.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10031": "delete dns configuration from layer 3 network [name:%s] on tf controller failed due to:%s", + "ORG_ZSTACK_STORAGE_BACKUP_10119": "installPath and bootstrap URL are both required.", + "ORG_ZSTACK_STORAGE_BACKUP_10118": "Do not allow covering a database from backup in cloud environment.", + "ORG_ZSTACK_STORAGE_BACKUP_10117": "database backup[uuid:%s] has been exported to backup storage[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10116": "database backup [UUID %s] has not been exported from backup storage [UUID: %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10115": "current backup storage state[%s] does not permit proceeding with operation[%s], valid states are %s", + "ORG_ZSTACK_STORAGE_BACKUP_10114": "Cannot establish SSH connection to peer node using SSH key. Please verify network connectivity and SSH key configuration.", + "ORG_ZSTACK_STORAGE_BACKUP_10113": "bandWidth must be a positive value", + "ORG_ZSTACK_STORAGE_BACKUP_10112": "The job parameters are missing the remote retention value: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10039": "VM[uuid:%s] are not stopped and do not run on the specific host.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10007": "The built-in security admin role cannot be removed by the built-in security admin role.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10038": "volume[uuid:%s] has been attached to one or more VM(s)[uuid:%s] that are not in a stopped state and are not running on the specific host.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10008": "cannot revoke system administrator role from system administrator user group", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10009": "Cannot delete built-in audit administrator. Please ensure you are not attempting to modify a system-provided role.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10003": "The name of the initial user for this resource cannot be updated.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10034": "cannot find replication of volume %s on host %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10004": "%s is a reserved keyword in cloud computing virtualization environments, please choose another name.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10037": "The primary storage UUID cannot be null. Please ensure that a valid UUID is provided for the primary storage.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10036": "Invalid resource UUID %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10006": "cannot revoke audit admin role from built-in administrator user", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10042": "mini storage [UUID: %s] must be empty before restoring bits from ZBox. Please clean it up.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10001": "No factory found for FluentBit output type: %s.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10010": "Cannot delete built-in security administrator. Please ensure you are not attempting to modify a system-provided role.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10041": "no LocalStorageBackupStorageMediator supporting hypervisor[%s] and backup storage type[%s]", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10011": "Cannot revoke privileges from built-in system administrator.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10003": "The host name or ID cannot be null. Please provide a valid host name or ID.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10012": "Confirm that the roles you want to add have the same identity and are compatible within your virtualization environment.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10002": "Unknown FluentBit output plugin type %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10013": "Cannot add role: %s to identity: %s for virtual ID[uuid:%s]", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10005": "Port number cannot be null", + "ORG_ZSTACK_APPCENTER_UTILS_10000": "cannot find raw template JSON file at: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10004": "log storage server [address: %s] is not available", + "ORG_ZSTACK_APPCENTER_UTILS_10001": "Unable to generate JSON template for cloud resource configuration", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10040": "Fail to %s because host(s)[uuid:%s] are not enabled and not in connected status.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10007": "The new configuration contains errors, leading to service exceptions. Please review the configuration parameters again. Details: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10006": "The creation of the log server failed. Incorrect newly passed configuration parameters may have caused the Fluent Bit service to enter an inactive state. Please double-check the configuration for accuracy.", + "ORG_ZSTACK_STORAGE_BACKUP_10111": "missing remote retention type in job parameters", + "ORG_ZSTACK_STORAGE_BACKUP_10110": "missing \u0027retentionValue\u0027 in job parameters configuration", + "ORG_ZSTACK_STORAGE_BACKUP_10129": "No instance found with root volume UUID: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10124": "No VM found for volume[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10123": "Operation not supported on a shared volume attachment", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10028": "no backup storage can retrieve image[uuid:%s] for volume[uuid:%s]", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10005": "Cannot find JoinType in the imported package or class. Please ensure that you have imported the correct package and the class contains the defined JoinType.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10029": "image[uuid: %s] has no reference to a backup storage[uuid: %s]", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10000": "output from [CloudFunction] is empty", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10001": "call action[%s] failed, cause: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10023": "expect operation on hosts[%s] but only hosts %s are available and enabled", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10002": "action: %s is not supported for the IAM role: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10120": "databaseBackup[uuid:%s] is not enabled and available", + "ORG_ZSTACK_STORAGE_SNAPSHOT_REFERENCE_10000": "A volume with UUID %s has been referenced by other volumes [%s]. Please flatten these volumes and their descendants before changing the installation path.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10017": "required cluster %s is not attached to primary storage %s for volume %s creation", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10016": "replication network status of volume [uuid:%s] has entered StandAlone mode, while all hosts are in a Connected state; please recover it first.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10018": "cannot find available host on required cluster %s for volume creation", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10013": "host[uuid: %s] of mini primary storage[uuid: %s] does not have sufficient capacity[current: %s bytes, needed: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10017": "baremetal2 gateway with UUID: %s is not co-located in the same zone as cluster with UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10012": "cannot allocate sufficient space for primary storage [UUID: %s] on host [UUID: %s], insufficient physical capacity", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10018": "cannot modify the cluster of a Baremetal2 gateway [uuid:%s] when there are active instances relying on it", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10015": "volume[uuid:%s] replication is synchronizing data, please wait until synchronization is complete.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10019": "cluster[%s] is not of baremetal type", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10014": "cannot find any available host to resize volume[uuid: %s] on mini storage system[uuid: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10013": "cluster[uuid:%s] is not available", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10014": "cluster[uuid:%s] is not a bare metal virtualization cluster", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10022": "cannot allocate storage synchronization port on host %s: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10015": "gateway[uuid:%s] is not available", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10021": "cannot find an available host to execute command for primary storage[uuid: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10016": "baremetal2 gateway with UUID: %s is already part of cluster with UUID: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10010": "baremetal2 gateway[uuid:%s] can only be attached to one compute cluster", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10011": "baremetal2 gateway [UUID: %s] is not attached to cluster [UUID: %s], detachment is unnecessary.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10012": "baremetal2 gateway with UUID:%s is attached to only one cluster currently; do not detach it.", + "ORG_ZSTACK_STORAGE_BACKUP_10108": "missing \u0027retentionPolicyType\u0027 and \u0027retentionPeriod\u0027 in job parameters", + "ORG_ZSTACK_STORAGE_BACKUP_10107": "unexpected backup storage UUID: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10106": "The job parameter \u0027backupStorageUuids\u0027 is empty. Please ensure that valid backup storage UUIDs are provided for the operation to proceed.", + "ORG_ZSTACK_STORAGE_BACKUP_10105": "missing \u0027backupStorageUuids\u0027 in job parameters, please ensure all required backup storage UUIDs are specified", + "ORG_ZSTACK_STORAGE_BACKUP_10104": "missing required job parameters: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10103": "unexpected task status: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10102": "Sync task failed due to missing source file. Please ensure all required files are uploaded and try again.", + "ORG_ZSTACK_STORAGE_BACKUP_10101": "database backup[uuid:%s] not found in storage repository[uuid:%s]", + "ORG_ZSTACK_LOGIN_PLUGIN_10002": "missing LoginUserInfo when utilizing plugin login functionality", + "ORG_ZSTACK_LOGIN_PLUGIN_10001": "no login plugin named %s found", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10005": "the mini storage [UUID: %s, name: %s] cannot find any available host within the attached clusters for instantiating the volume", + "ORG_ZSTACK_LOGIN_PLUGIN_10000": "loginPluginName is missing. Please provide a valid plugin name for login authentication.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10007": "Cannot determine which compute instance to assign the request. Please ensure that your instances are properly registered and tagged in the cloud environment. If the issue persists, contact support for further assistance.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10002": "the host[uuid:%s] is not connected to the cloud environment", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10014": "cannot add administrative privilege to project", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10006": "a baremetal2 node with management IP %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10001": "Still cached volume exists on instance [UUID:%s] cannot update cache volume URL", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10015": "the operation is not permitted by the virtual machine ID whitelist [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10007": "A host with management IP %s has experienced an issue.", + "ORG_ZSTACK_KVM_10110": "The host [IP:%s] has been taken over due to the existence of its unique identifier [HostUuid:%s] in the database.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10004": "ResourceType [%s] of APIRecoverResourceSplitBrainMsg is invalid for cloud resource recovery.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10016": "the operation is denied by the virtual machine blacklist [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10008": "cannot attach BareMetal2 gateway [uuid:%s] to non-BareMetal2 cluster [uuid:%s]", + "ORG_ZSTACK_KVM_10111": "unable to determine host CPU architecture; please verify username and password; %s", + "ORG_ZSTACK_STORAGE_BACKUP_10109": "missing \u0027retentionType\u0027 in job parameters configuration", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10009": "baremetal2 gateway with UUID: %s is already attached to cluster with UUID: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10002": "There is already a baremetal PXE server with the management IP %s; please do not use it to create a Baremetal2 gateway.", + "ORG_ZSTACK_KVM_10103": "unable to connect to KVM[ip:%s, username:%s, sshPort: %d] to perform DNS validation; please verify the correctness of the username and password.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10004": "management ip[%s] is not a valid IPv4 address or hostname", + "ORG_ZSTACK_KVM_10104": "failed to ping all DNS/IP addresses in %s; please verify network connectivity and DNS settings in /etc/resolv.conf to ensure your instance can access the public internet.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10010": "No connected virtual machine found, mini storage operation failed", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10005": "cannot add BareMetal2 gateway in non-BareMetal2 cluster[uuid:%s]", + "ORG_ZSTACK_KVM_10105": "unable to connect to KVM[ip:%s, username:%s, SSH port:%d] to verify management node accessibility; please check if the credentials are correct; %s", + "ORG_ZSTACK_VPC_HA_VPCHAGC_10000": "VR[uuid: %s] instance is not running", + "ORG_ZSTACK_KVM_10106": "the KVM host [ip:%s] cannot access the management node\u0027s callback URL. It appears that the KVM host is unable to reach the management IP [%s]. %s %s", + "ORG_ZSTACK_VPC_HA_VPCHAGC_10001": "VR[uuid: %s] instance not connected", + "ORG_ZSTACK_KVM_10107": "unable to verify if the host is接管, because %s", + "ORG_ZSTACK_KVM_10108": "Unable to retrieve the timestamp of the flag because %s", + "ORG_ZSTACK_KVM_10109": "The host [IP:%s] has been taken over, as the takeover flag [HostUuid:%s] already exists and the update time [utime %d] has not exceeded the host ping interval [ping interval %d].", + "ORG_ZSTACK_STORAGE_BACKUP_10100": "One of the backup storages [UUIDs: %s, %s] is in the state of %s, and thus cannot perform a synchronization operation.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10009": "instance offering [UUID:%s] is disabled; unable to create VM from it", + "ORG_ZSTACK_AUTOSCALING_GROUP_10008": "A resource cannot be found: InstanceOfferingVO with UUID [%s] not available.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10007": "A resource cannot be found: AutoScalingVmTemplateVO with UUID [%s] not available.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10006": "autoScalingGroup[%s] failed to add newly created VM to security group completely, errors are %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10005": "add VM NIC to security group failed, No security group with UUID\u003d%s can be found.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10004": "autoScalingGroup[%s] failed to add newly created VM to loadBalancer completely, errors are %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10003": "add VM NIC to load balancer failed, No load balancer with UUIDs\u003d%s can be found.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10002": "autoScalingGroup[%s] VM creation failed completely, errors are %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10000": "Only one scaling activity can be executed simultaneously within the same scaling group.", + "ORG_ZSTACK_KVM_10120": "host[uuid:%s]\u0027s configuration changed, old: %s, new: %s", + "ORG_ZSTACK_KVM_10121": "host[uuid:%s] enters powered-off state, send notification", + "ORG_ZSTACK_KVM_10112": "host CPU architecture does not match the cluster configuration", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10000": "Invalid path string %s in cloud storage configuration", + "ORG_ZSTACK_KVM_10115": "host [uuid:%s] cannot be added to cluster [uuid:%s] due to mismatched QEMU/Libvirt version", + "ORG_ZSTACK_KVM_10117": "host [uuid:%s] cannot be added to cluster [uuid:%s] due to mismatched CPU architecture specifications", + "ORG_ZSTACK_KVM_10119": "Cannot detect either VTx or VTd in /proc/cpuinfo. Please ensure that hardware virtualization has been enabled in your BIOS settings.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10019": "A resource cannot be found: L3 Network (UUID: %s) not found", + "ORG_ZSTACK_AUTOSCALING_GROUP_10018": "disk offerings with UUIDs:%s are disabled; therefore, VM creation from these offerings is not possible.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10017": "A resource cannot be found: Disk Offering with UUID [%s] not found", + "ORG_ZSTACK_AUTOSCALING_GROUP_10016": "system-image[uuid:%s] cannot be used to create a user VM", + "ORG_ZSTACK_AUTOSCALING_GROUP_10015": "rootDiskOfferingUuid cannot be null when image media type is ISO", + "ORG_ZSTACK_AUTOSCALING_GROUP_10014": "image[uuid:%s] is of media type: %s, only RootVolumeTemplate and ISO can be used to create a VM", + "ORG_ZSTACK_AUTOSCALING_GROUP_10013": "image[uuid:%s] is not available at this time, please ensure it is ready before creating a VM from it.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10012": "image[uuid:%s] is Disabled. VM creation from this image is not permitted.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10011": "A resource cannot be found: image with UUID [%s] not found", + "ORG_ZSTACK_AUTOSCALING_GROUP_10010": "instance offering [UUID: %s, type: %s] is not of User VM type; therefore, a VM cannot be created from it.", + "ORG_ZSTACK_KVM_10130": "failed to attach volume to instance because:%s", + "ORG_ZSTACK_KVM_10131": "failed to detach volume from instance, because:%s", + "ORG_ZSTACK_KVM_10132": "vm[%s] failed to perform disk space release, due to:%s", + "ORG_ZSTACK_KVM_10123": "host[%s] has not been shut down within %d seconds", + "ORG_ZSTACK_KVM_10125": "fail to check file %s on host[UUID:%s]", + "ORG_ZSTACK_KVM_10126": "The host is in the pre-maintenance state and cannot have its operating system updated at this time. Please complete the maintenance operations or contact support for assistance.", + "ORG_ZSTACK_KVM_10127": "The host is not in a connected state; therefore, OS update operations cannot be performed. Please ensure the host is connected before attempting to update the OS.", + "ORG_ZSTACK_COMPUTE_BONDING_10022": "require one of slave UUIDs and slave names", + "ORG_ZSTACK_COMPUTE_BONDING_10021": "There is no interface on host with UUID: %s", + "ORG_ZSTACK_VMWARE_10069": "instance id [%s] not found", + "ORG_ZSTACK_COMPUTE_BONDING_10020": "interface %s does not exist on the hosts", + "ORG_ZSTACK_VMWARE_10067": "vm [%%s] not found", + "ORG_ZSTACK_COMPUTE_BONDING_10026": "Cannot delete bonding interface associated with the management network. Please ensure the management network is not in use before proceeding.", + "ORG_ZSTACK_VMWARE_10064": "VM Instance not found: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10029": "Need to skip auto-scaling group activity adjustment", + "ORG_ZSTACK_COMPUTE_BONDING_10025": "invalid bonding mode[%s]", + "ORG_ZSTACK_VMWARE_10065": "failed to shutdown virtual machine: %s, %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10028": "Cannot retrieve deleted instance list from cloud compute service", + "ORG_ZSTACK_VMWARE_10062": "failed to resume VM, task status: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10027": "The number of instances launched exceeds the allowed limit.%s", + "ORG_ZSTACK_COMPUTE_BONDING_10023": "Cannot add SR-IOV interface [%s] to Bonding because more than one SR-IOV Dev is selected", + "ORG_ZSTACK_VMWARE_10063": "failed to resume virtual machine [%s]: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10026": "autoScalingGroup[%s] failed to completely terminate VMs[%s], errors are %s", + "ORG_ZSTACK_VMWARE_10060": "failed to suspend VM [%s]: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10025": "The autoScalingGroup[%s] is not attached to any VM template", + "ORG_ZSTACK_COMPUTE_BONDING_10029": "cannot add new interfaces to bond[%s] because it already contains an SR-IOV-enabled interface", + "ORG_ZSTACK_AUTOSCALING_GROUP_10024": "the auto scaling group[%s] is in an unexpected state, expected: %s state", + "ORG_ZSTACK_COMPUTE_BONDING_10028": "cannot attach interfaces repeatedly to a bond[%s].", + "ORG_ZSTACK_AUTOSCALING_GROUP_10023": "defaultL3NetworkUuid[uuid:%s] does not exist in l3NetworkUuids %s", + "ORG_ZSTACK_SNS_PLATFORM_DINGTALK_10000": "failed to send messages to DingTalk. status: %s, body: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10022": "More than one Layer 3 network is specified in l3NetworkUuids, but defaultL3NetworkUuid is null", + "ORG_ZSTACK_KVM_10140": "failed to create bridge[%s] for l2Network[uuid:%s, type:%s, vlan:%s] on KVM host[uuid:%s], because %s", + "ORG_ZSTACK_COMPUTE_BONDING_10027": "Cannot delete bonding interface configured with VTEP IP. Please ensure all associated virtual networks are disassociated first.", + "ORG_ZSTACK_KVM_10141": "failed to check bridge[%s] for l2VlanNetwork[uuid:%s, name:%s] on KVM host[uuid:%s], %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10021": "l3Network[uuid:%s] is a system network and cannot be used to create user VMs.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10020": "l3Network with UUID:%s is Disabled; therefore, VM creation on this network is not allowed.", + "ORG_ZSTACK_KVM_10143": "failed to delete bridge[%s] for l2Network[uuid:%s, type:%s, vlan:%s] on KVM host[uuid:%s], because %s", + "ORG_ZSTACK_KVM_10144": "Failed to start VM because the hypervisor feature cannot be disabled with CPU mode set to none. Please check your CPU configuration settings.", + "ORG_ZSTACK_KVM_10134": "the XML hook[%s] has been associated with VM %s, so please unbind it before deleting it", + "ORG_ZSTACK_KVM_10136": "System-type XML hooks are not permitted in cloud computing environments. Please ensure that all system-level configurations adhere to the virtualization standards.", + "ORG_ZSTACK_KVM_10137": "The XML hook name [%s] already exists in the virtual machine configuration.", + "ORG_ZSTACK_KVM_10138": "there has been a KVM host with management IP[%s]", + "ORG_ZSTACK_KVM_10139": "cannot create VLAN device on %s because the name is too long", + "ORG_ZSTACK_VMWARE_10059": "failed to suspend VM, task status: %s", + "ORG_ZSTACK_COMPUTE_BONDING_10033": "L2 network [uuid:%s] does not exist", + "ORG_ZSTACK_BILLING_10008": "The start date must be earlier than the end date.", + "ORG_ZSTACK_COMPUTE_BONDING_10032": "cannot detach interfaces repeatedly from a bond[%s].", + "ORG_ZSTACK_COMPUTE_BONDING_10031": "cannot detach interface[%s] from a bond[%s] that is in a bonded state.", + "ORG_ZSTACK_COMPUTE_BONDING_10030": "Cannot add SR-IOV interface [%s] to Bonding because only one interface in a bond can enable SR-IOV.", + "ORG_ZSTACK_BILLING_10005": "Billing is disabled for this resource. Please ensure billing is enabled to use this service.", + "ORG_ZSTACK_COMPUTE_BONDING_10037": "Cannot attach L2 network to cluster [UUID: %s]. The interface [UUID: %s, name: %s] on host [UUID: %s] is associated with service types but does not include TenantNetwork as one of them.", + "ORG_ZSTACK_BILLING_10004": "unsupported billing resource type [%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10036": "Cannot attach L2 network to cluster [UUID]. Bonding interface [UUID, name] on host [UUID] has bonding service type associations but lacks TenantNetwork service type.", + "ORG_ZSTACK_BILLING_10003": "Please ensure that the correct price configuration is set for the user, for example: `priceUserConfig:{\\nvolume:{\\npriceKeyName:\\\"priceKeyName\\\"}}`", + "ORG_ZSTACK_COMPUTE_BONDING_10035": "Cannot attach L2 network to cluster [uuid:%s]: physical interface [%s] is used in a bond on one or more hosts. Conflicting hosts: [%s]", + "ORG_ZSTACK_VMWARE_10051": "vmUuid [%s] not found in ESX host system [%s]", + "ORG_ZSTACK_BILLING_10002": "Please ensure that the correct price configuration for the user is set, for example: `priceUserConfig:{rootVolume:{priceKeyName:\"priceKeyName\"}}`", + "ORG_ZSTACK_COMPUTE_BONDING_10034": "L2 network [uuid:%s] has an empty physical interface definition", + "ORG_ZSTACK_BILLING_10001": "dateInLong is less than %s milliseconds", + "ORG_ZSTACK_BILLING_10000": "priceKeyName is null. Please ensure that the key name for pricing is correctly configured.", + "ORG_ZSTACK_VMWARE_10050": "Syncing with vCenter[uuid:%s], please try again later.", + "ORG_ZSTACK_KVM_10150": "cannot retrieve vmUuid from message %s", + "ORG_ZSTACK_KVM_10151": "unable to synchronize virtual machine on host[uuid:%s, ip:%s] due to %s", + "ORG_ZSTACK_COMPUTE_BONDING_10038": "failed to add Linux bonding to host[uuid:%s] : %s", + "ORG_ZSTACK_KVM_10152": "The VM[%s] is in a shutdown state for an extended period; please verify its status.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10032": "Unsupported Removal Policy type[%s]", + "ORG_ZSTACK_V2V_VMWARE_10015": "There is no available IP found in CIDR %s on host %s; please reconnect the host to refresh IPs.", + "ORG_ZSTACK_KVM_10154": "failed to update bridge[%s] for l2Network[uuid:%s, name:%s] on KVM host[uuid: %s], %s", + "ORG_ZSTACK_V2V_VMWARE_10016": "There is already a long-running job[uuid:%s] converting VM from %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10030": "deleteAutoScalingRule[%s] triggers failed, errors are %s", + "ORG_ZSTACK_V2V_VMWARE_10017": "Failed to update conversion host dependency for virtual machine %s", + "ORG_ZSTACK_KVM_10146": "failed to apply security group rules to KVM host [uuid:%s], because %s", + "ORG_ZSTACK_KVM_10147": "failed to check default rules of security group on KVM host[uuid:%s], because %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10101": "could not assign redirect port or status code without specifying HTTP redirect URL", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10009": "failed to detect heartbeat, code: %s, detail: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10104": "loadBalancer listener[%s] does not support modifying session persistence state", + "ORG_ZSTACK_IAM2SCRIPT_10010": "Specified script executor is not supported in this cloud computing environment. Please refer to the supported executors list for further information.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10105": "could not simultaneously support HTTP redirect to HTTPS and session persistence in a cloud environment", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10102": "could not support protocols other than HTTP when specifying HTTP to HTTPS redirect", + "ORG_ZSTACK_VMWARE_10048": "The host is not connected to the cloud environment. Please ensure the host is properly configured and authorized.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10108": "listener[%s] modifies session persistence; it must specify load balancing algorithm", + "ORG_ZSTACK_V2V_VMWARE_10007": "Failed to parse URL %s", + "ORG_ZSTACK_COMPUTE_BONDING_10044": "failed to attach nic to linux bonding on host[uuid:%s] : %s", + "ORG_ZSTACK_VMWARE_10046": "Cannot detach NIC because Network Interface Card (NIC) is not supported for hotplug operations in vCenter.", + "ORG_ZSTACK_BILLING_10019": "gpu price must be bound to GPU UUID %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10109": "listener[%s] %s load balancing algorithm does not support modifying session persistence except by assigning iphash explicitly", + "ORG_ZSTACK_V2V_VMWARE_10008": "dataCenter name can not contain special characters %s", + "ORG_ZSTACK_IAM2SCRIPT_10002": "Script content is blank. Please ensure your Java code snippet is properly defined and included in the source file.", + "ORG_ZSTACK_BILLING_10018": "GPU price must be bound to a valid GPU UUID. Please provide a non-empty UUID.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10106": "listener[%s] cannot modify session persistence rewrite when HTTP mode is set to http-tunnel", + "ORG_ZSTACK_V2V_VMWARE_10009": "Target VM name cannot contain special characters %s", + "ORG_ZSTACK_IAM2SCRIPT_10001": "Failed to decode script content. Please ensure that the source file is available and properly formatted for cloud computing environments.", + "ORG_ZSTACK_COMPUTE_BONDING_10042": "failed to remove Linux bond from host[uuid:%s] : %s", + "ORG_ZSTACK_VMWARE_10044": "HOST CPU and Guest OS are not compatible. Please ensure your HOST CPU supports the required virtualization technologies or update the Guest OS to a compatible version.", + "ORG_ZSTACK_BILLING_10017": "price must be within the range of 0 and 999999999.99", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10107": "listener[%s] changes session persistence to IP hash; it must specify a source balancer algorithm", + "ORG_ZSTACK_VMWARE_10045": "Checking compatibility with virtual machine %s failed on host %s", + "ORG_ZSTACK_BILLING_10016": "The minimum resource unit for allocation is a megabyte, not a byte.", + "ORG_ZSTACK_SDNCONTROLLER_10008": "SDN L2 network [UUID:%s] is not attached to a controller", + "ORG_ZSTACK_IAM2SCRIPT_10007": "The IAM2 script function is not enabled. Please ensure that the IAM2 service is activated in your cloud environment.", + "ORG_ZSTACK_BILLING_10015": "resourceName[%s] is an invalid identifier in cloud computing contexts", + "ORG_ZSTACK_IAM2SCRIPT_10005": "Cannot retrieve the output of the script execution. Please check the cloud instance and network settings.", + "ORG_ZSTACK_COMPUTE_BONDING_10046": "failed to detach NIC from Linux bonding on host[uuid:%s] : %s", + "ORG_ZSTACK_VMWARE_10040": "Missing destination host UUID. Please ensure that the UUID for the target host is correctly specified.", + "ORG_ZSTACK_IAM2SCRIPT_10004": "Run iam2 script failed. Please check if the required cloud computing environment is properly set up.", + "ORG_ZSTACK_VMWARE_10041": "The target host does not support virtual machine management. Please ensure the destination host is an ESX or vSphere host.", + "ORG_ZSTACK_KVM_10161": "Unexpected VNC port number[%d] for virtual machine [uuid:%s]", + "ORG_ZSTACK_IAM2SCRIPT_10009": "The number of parameters exceeds the allowed limit.", + "ORG_ZSTACK_IAM2SCRIPT_10008": "The script does not contain any code. Please ensure your input includes valid Java code.", + "ORG_ZSTACK_SDNCONTROLLER_10000": "Cannot create SDN L2 network due to missing SDN Controller UUID in systemTags of API request. Please ensure the SDN Controller UUID is correctly specified.", + "ORG_ZSTACK_V2V_VMWARE_10003": "Cluster name cannot contain the following characters: %s", + "ORG_ZSTACK_SDNCONTROLLER_10002": "cannot find SDN controller for Layer 2 network[uuid:%s, vswitchType:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10001": "Cannot create SDN L2 network because SDN controller UUID is missing from API request. Please ensure the UUID is included.", + "ORG_ZSTACK_V2V_VMWARE_10006": "failed to stop VM instance %s before v2v migration", + "ORG_ZSTACK_KVM_10157": "reply[%s] is not a KVMHostAsyncHttpCallResponse", + "ORG_ZSTACK_KVM_10158": "reply[%s] return with empty response body", + "ORG_ZSTACK_KVM_10159": "%s operation failed: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10040": "EcsInstance must be in a running or stopped state when deleting an EIP.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10111": "listener[%s] does not support modifying idle timeout and cookie name; session persistence must be specified.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10112": "listener[%s] does not support modifying idle timeout when session persistence is disabled", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10110": "listener[%s] %s load balancing algorithm does not support modifying session persistence except by explicitly assigning disable.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10115": "invalid session idle timeout[%s], it must be a positive integer between[%s~%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10040": "failed to update Linux bonding on host[uuid:%s] : %s", + "ORG_ZSTACK_VMWARE_10039": "Missing host UUID in metadata request", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10116": "The HTTP health check protocol must be specified for its healthy checking parameter %s.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10113": "listener[%s] does not support modifying the cookie name when session persistence is not set to rewrite.", + "ORG_ZSTACK_VMWARE_10037": "No distributed virtual switch or qualified virtual switch found", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10114": "listener[%s] does not support modifying session-based URL rewriting without altering the cookie name", + "ORG_ZSTACK_VMWARE_10038": "Datastore %s not found for vCenter %s", + "ORG_ZSTACK_BILLING_10009": "resourceType and resourceUUID cannot be empty at the same time", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10119": "invalid health check target[%s], the format should be checkProtocol:port, for example, tcp:default", + "ORG_ZSTACK_SDNCONTROLLER_10015": "could not add SDN controller because type: %s is not in the supported list: %s", + "ORG_ZSTACK_SDNCONTROLLER_10014": "could not add security group rule because the remote security group controller UUID[:%s] does not match the local security group controller UUID[:%s]", + "ORG_ZSTACK_VMWARE_10036": "No available compute resource for clustering operations.%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10117": "the HTTP health check protocol\u0027s expected status code [%s] is invalid", + "ORG_ZSTACK_SDNCONTROLLER_10017": "could not add SDN controller because controller [IP:%s] is already registered", + "ORG_ZSTACK_VMWARE_10033": "SSL handshake failed with vCenter [%s] because insecure TLS 1.0 is being used. Manually enable TLS 1.0 in JDK configuration if required.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10118": "the listener with protocol [%s] does not support selecting a security policy", + "ORG_ZSTACK_SDNCONTROLLER_10016": "could not add SDN controller because ip[%s] is not a valid unicast address", + "ORG_ZSTACK_VMWARE_10034": "SSL handshake failed with vCenter [%s], please verify the port number [%d].", + "ORG_ZSTACK_BILLING_10027": "Billing is enabled. This operation is only allowed when billing is disabled.", + "ORG_ZSTACK_SDNCONTROLLER_10019": "could not add host [UUID:%s] to SDN controller [UUID:%s], because subnet mask is not specified", + "ORG_ZSTACK_VMWARE_10031": "Login to vCenter Server [%s] failed with user credentials. Please check your network connection and provided credentials.", + "ORG_ZSTACK_BILLING_10026": "endDate cannot be earlier than startDate", + "ORG_ZSTACK_SDNCONTROLLER_10018": "could not add host[uuid:%s] to SDN controller[uuid:%s], as it is already attached to another SDN controller", + "ORG_ZSTACK_VMWARE_10032": "Parse response failed from vCenter [%s], please check the port number [%d].", + "ORG_ZSTACK_BILLING_10025": "endDateInLong is set, no modification allowed in cloud environments to ensure data consistency and compliance with virtualization standards.", + "ORG_ZSTACK_BILLING_10024": "endDateInLong and setEndDateInLongBaseOnCurrentTime should not be configured simultaneously. Please choose one for your settings.", + "ORG_ZSTACK_VMWARE_10030": "connect to the cloud resource failed: %s", + "ORG_ZSTACK_BILLING_10023": "endDateInLong is not permitted to have a negative value", + "ORG_ZSTACK_BILLING_10022": "accountUuid and tableUuid are mutually exclusive; only one of them can be set.", + "ORG_ZSTACK_BILLING_10021": "This priceTable[uuid\u003d%s] is not allowed to be deleted in this cloud environment.", + "ORG_ZSTACK_BILLING_10020": "The account[uuid\u003d%s] has attached a pricing table", + "ORG_ZSTACK_LONGJOB_10007": "cannot cancel a long-running job that has already succeeded", + "ORG_ZSTACK_SDNCONTROLLER_10011": "Pull tenant operation is only supported for H3C VCFC V2X controllers", + "ORG_ZSTACK_LONGJOB_10008": "Cannot cancel a long-running job that has failed", + "ORG_ZSTACK_LONGJOB_10009": "Delete long-running jobs only when they are succeeded, canceled, or failed.", + "ORG_ZSTACK_SDNCONTROLLER_10013": "could not add vmnic to security group because they have different SDN controller [NIC controller UUID: %s, Security Group controller UUID: %s]", + "ORG_ZSTACK_SDNCONTROLLER_10012": "Failed to retrieve tenant data: %s", + "ORG_ZSTACK_LONGJOB_10010": "rerun longjob only when it has succeeded, been canceled, or failed", + "ORG_ZSTACK_LONGJOB_10011": "can only resume a longjob that is in the Suspended state", + "ORG_ZSTACK_LONGJOB_10012": "%s has no corresponding long-running task", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10122": "cloud is unable to modify the load balancer listener because the listener with protocol [%s] does not support selecting HTTP version [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10123": "cloud is unable to modify the load balancer listener because the HTTPS protocol only supports HTTP version: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10120": "the listener with protocol [%s] is not compatible with this health check:[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10121": "The HTTP health check protocol must be specified. Please include its healthy checking parameters, such as healthCheckMethod and healthCheckURI.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10126": "cloud does not support changing the load balancer listener because the listener with protocol [%s] does not support compressing content", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10127": "cloud is unable to modify the load balancer listener because it only supports compression algorithms [%s]", + "ORG_ZSTACK_VMWARE_10029": "Login failed. Please verify your credentials and ensure you are using the correct login parameters for cloud computing services.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10124": "cloud is unable to modify the load balancer listener because a TCP protocol listener only supports TCP proxy for parameter settings.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10125": "cloud is unable to modify the load balancer listener because it only supports TCP proxy protocol %s", + "ORG_ZSTACK_VMWARE_10027": "VCenter[uuid:%s] not found: Virtualization environment with specified UUID does not exist.", + "ORG_ZSTACK_TAG_10004": "no system tag matches[%s] for resource type[%s]", + "ORG_ZSTACK_SDNCONTROLLER_10026": "Pull tenant operation is not supported for SDN Controller [uuid:%s, vendorType:%s, vendorVersion:%s]. Only H3C VCFC V2 controllers support this operation.", + "ORG_ZSTACK_LOG_10007": "Unknown log configuration type %s", + "ORG_ZSTACK_SDNCONTROLLER_10025": "SDN controller [UUID:%s] not found", + "ORG_ZSTACK_TAG_10005": "validate system tag [%s] for resource type[%s] failed", + "ORG_ZSTACK_LOG_10006": "Unknown configuration type for log server %s", + "ORG_ZSTACK_SDNCONTROLLER_10028": "could not change SDN controller because VLAN range[%s] is not in the correct format", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10128": "invalid IP version[%s], it must be IPv4 or IPv6", + "ORG_ZSTACK_LOG_10005": "The account [uuid:%s] does not have the authorization to add additional log servers. Only administrator accounts possess this privilege.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10129": "could not allow to delete default server group[uuid:%s]", + "ORG_ZSTACK_LOG_10004": "Access denied: Account[uuid:%s] is not authorized to retrieve management node logs. Only administrative accounts possess this privilege.", + "ORG_ZSTACK_TAG_10008": "tag[%s] is only for administrative use", + "ORG_ZSTACK_LOG_10003": "The account [UUID:%s] is not authorized to perform operations on the log server [UUID:%s].", + "ORG_ZSTACK_SDNCONTROLLER_10029": "could not change SDN controller because VLAN range[%s] overlaps with another VLAN range", + "ORG_ZSTACK_LOG_10002": "No factory found for type:%s", + "ORG_ZSTACK_TAG_10006": "No matching system tag found for %s", + "ORG_ZSTACK_SDNCONTROLLER_10020": "could not add host [UUID:%s] to SDN controller [UUID:%s], because vTEP IP is used by host [UUID:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10022": "could not update the host [uuid:%s] of SDN controller [uuid:%s], as the host has not been added to the SDN controller", + "ORG_ZSTACK_TAG_10000": "Duplicated Tag[tag:%s, Type:%s, Resource_Type:%s, Resource_Uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10021": "could not deregister host [uuid:%s] from SDN controller [uuid:%s], as the host has not been registered with the SDN controller", + "ORG_ZSTACK_SDNCONTROLLER_10024": "Cannot attach L3 network to VM because some tenants in SDN controller [uuid:%s] have been deleted. Please run tenant synchronization first to update tenant status.", + "ORG_ZSTACK_SDNCONTROLLER_10023": "could not update host[uuid:%s] of SDN controller[uuid:%s], as a netmask was specified", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10000": "check batch data integrity failed, unsupported resource type: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10002": "add integrity resource fail, unsupported resource type: %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10002": "template error: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10134": "could not add backend server VMNic to server group [UUID:%s], because VMNic weight [%s] is not a valid number", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10008": "failed to retrieve image cache with ID:%s: GetImageHashValueReply.hashValue is null", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10009": "verify image cache[%s] consistency failed due to virtual machine environment issues", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10000": "no available template of this type: %s,", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10132": "could not add backend server VMNIC with UUID:%s to server group with UUID:%s because the VMNIC does not exist", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10137": "could not add backend server NIC to server group [uuid:%s], because NIC IP [ipAddress:%s] is duplicated", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10003": "start data protection encryptType[%s] is invalid", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10138": "could not add virtual machine network interface [uuid:%s] to server group [uuid:%s] because listener [uuid:%s] has already attached this server group\u0027s network interface", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10004": "the snapshot[uuid:%s] is not encrypted in the virtualized environment", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10135": "L3 networks with UUIDs:%s associated with VM nics have no network service:%s enabled", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10005": "verify volume snapshot[%s] consistency failed due to inconsistent state", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10136": "the VM NICs [UUID: %s] are already associated with the load balancer server group [UUID: %s].", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10006": "encryption error: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10139": "could not add backend server IP to server group [UUID:%s], because the IP [IP Address:%s] is already registered", + "ORG_ZSTACK_VMWARE_10097": "VCENTER[%s] is not in operational status, current status: %s", + "ORG_ZSTACK_VMWARE_10098": "vdisk not found: %s", + "ORG_ZSTACK_VMWARE_10095": "Get recent task list failed, details: %s", + "ORG_ZSTACK_VMWARE_10096": "VCENTER_SERVER_NOT_FOUND", + "ORG_ZSTACK_VMWARE_10093": "vCenter backup storage does not support calculating image hashes.", + "ORG_ZSTACK_VMWARE_10091": "The feature for %s is not supported in cloud environments yet.", + "ORG_ZSTACK_TAG_10011": "tag[uuid:%s] is an inherent system tag and cannot be removed.", + "ORG_ZSTACK_TAG_10012": "The argument \u0027resourceType\u0027 does not match the expected UUID. Please ensure that the resource type is correctly specified as a UUID.", + "ORG_ZSTACK_VMWARE_10090": "The image %s is not found in the backing store. Please ensure the image path is correct and try again.", + "ORG_ZSTACK_TAG_10010": "no resource type found in tag system %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10010": "encryption image cache[id:%s] failure: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10011": "nodeType %s integrity file[path:%s] already exists in the virtualized environment", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10012": "invalid node type[%s]", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10013": "failed to add integrity file[%s.%s], it\u0027s now a directory.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10141": "invalid weight[serverIp:%s, weight:%s], weight is not within the valid range [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10143": "The server IPs [uuid:%s] are already associated with the load balancer serve group [uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10148": "loadbalancerServerGroup [%s] does not exist", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10014": "integrity file[%s.%s] does not exist", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10149": "VMNic or IP address is null. Please check your network configuration settings.", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10015": "host %s does not exist", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10146": "vmnics are all not associated with server group [%s]", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10000": "external primary storage[uuid:%s, name:%s] returns an unhealthy status: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10016": "Shell execution failed because %s", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10001": "find active clients for volume[uuid:%s, mountPath %s, client:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10147": "server IPs are all not associated with server group [%s]", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10017": "add integrity verification file[%s.%s] fail, because %s", + "ORG_ZSTACK_VMWARE_10088": "vCenter Backup Storage does not support canceling the download of an image.", + "ORG_ZSTACK_VMWARE_10086": "%s resource is already provisioned", + "ORG_ZSTACK_VMWARE_10085": "unexpected protocol: %s", + "ORG_ZSTACK_VMWARE_10082": "No data store attached to %s", + "ORG_ZSTACK_VMWARE_10083": "Data-store not found for %s", + "ORG_ZSTACK_VMWARE_10080": "vCenter[uuid\u003d%s] is Disabled. You can only perform read-only operations on this vCenter. To make configuration changes, update the vCenter configuration using UpdateVCenterAction {uuid\u003d%s state\u003dEnabled}", + "ORG_ZSTACK_VMWARE_10081": "VCENTER[uuid\u003d%s] are Disabled. You can only perform read-only operations on these VCENTER.", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10021": "encrypted snapshot[uuid:%s] failure: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10151": "could not add server group with UUID:%s to listener with UUID:%s because network interface with UUID:%s is already associated", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10152": "could not add server instance [uuid:%s] to listener [uuid:%s] because the server IP address is already registered", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10150": "could not add server group [uuid:%s] to listener [uuid:%s] as it has already been added", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10155": "could not add server group[uuid:%s] to listener [uuid:%s], as a UDP listener cannot map IPv4 backend addresses to IPv6", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10156": "could not remove server groups [uuid:%s] from listener [uuid:%s] because it has enabled HTTP redirect to HTTPS", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10153": "could not add server group[uuid:%s] to listener [uuid:%s], as a UDP listener cannot have both IPv4 and IPv6 VIP addresses simultaneously", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10154": "could not add server group[uuid:%s] to listener [uuid:%s], because UDP listener cannot map IPv6 backend addresses to IPv4 addresses", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10159": "could not find load balancer associated with server group [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10157": "could not deregister server group [uuid:%s] from load balancer [uuid:%s] as it has not been registered", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10158": "loadBalancerUuid [%s] does not exist", + "ORG_ZSTACK_VMWARE_10078": "The operation is not supported in the current cloud computing environment. Please ensure that your request aligns with the supported operations for cloud resources.", + "ORG_ZSTACK_VMWARE_10076": "failed to power on VM, task status: %s", + "ORG_ZSTACK_VMWARE_10073": "VM [%s] not found in the vCenter inventory", + "ORG_ZSTACK_VMWARE_10071": "Failed to find VM with UUID\u003d%s on ESX Host with UUID\u003d%s", + "ORG_ZSTACK_VMWARE_10072": "Failed to update ESX VM[uuid\u003d%s] configuration. See more details in the log.", + "ORG_ZSTACK_VMWARE_10070": "Image [%s] not found in the registry or local cache", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10162": "could not change backend server VMNIC to serverGroup[uuid:%s] because VMNIC weight[%s] is not a valid number", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10163": "invalid balancer weight[vimNic:%s], weight cannot be null", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10160": "could not update backend server VMNIC of server group because server group [uuid:%s] does not have VMNIC [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10161": "invalid balancer weight[vimNic:%s], weight value is out of range [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10166": "invalid balancer weight[serverIp:%s,weight:%s], weight is not within the valid range [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10167": "could not add backend server IP to server group [UUID:%s], because VMNIC weight [%s] is not a valid number", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10164": "could not update backend server VMNIC of server group [UUID:%s], because VMNIC UUID is null", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10165": "could not update backend server IP of server group because server group [uuid:%s] does not have IP [ipAddress:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10168": "invalid balancer weight[serverIp:%s], weight cannot be null", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10169": "could not add backend server IP to server group [UUID:%s], because IP [IP Address:%s] is invalid", + "ORG_ZSTACK_VPC_HA_10010": "More than 2 VPC routers are attached to HA group [uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_10119": "The virtual machine cannot perform online CPU/memory updates due to Instance Offering Online Modification being disabled. Please stop the VM and then retry the CPU/memory update.", + "ORG_ZSTACK_VPC_HA_10011": "HA group management L3 and public L3 networks [uuid:%s] differ from the offered L3 networks [uuid:%s].", + "ORG_ZSTACK_VPC_HA_10012": "vPC router L3 networks [UUID:%s] do not match the HA group L3 networks [UUID:%s]. Please delete this router and recreate it.", + "ORG_ZSTACK_VPC_HA_10013": "vPC router has been attached to high-availability group [uuid:%s]", + "ORG_ZSTACK_VPC_HA_10014": "vpc ha group [uuid:%s] does not exist", + "ORG_ZSTACK_VPC_HA_10015": "More than one VPC router is attached to HA group [uuid:%s]", + "ORG_ZSTACK_VPC_HA_10016": "vPC router [UUID:%s] cannot be upgraded to HA router because its public network is identical to the management network.", + "ORG_ZSTACK_VPC_HA_10017": "create affinity group for high availability group [uuid:%s] failed", + "ORG_ZSTACK_VPC_HA_10018": "haStatus of instance %s [uuid: %s] of VPC HA group %s [uuid: %s] changed from %s to %s", + "ORG_ZSTACK_VPC_HA_10019": "haStatus of instance[uuid: %s, name: %s, type: %s] changed from %s to %s", + "ORG_ZSTACK_VPC_HA_10009": "there is no master router for the router [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10000": "nfv instance initialization command failed because:%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10002": "failed to modify the network interface firewall default policy of NFV instance VM[uuid:%s], because %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10053": "access-control-list groups[uuid:%s] are configured to redirect, but some access-control-list entries lack IP rules.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10050": "The load balancer listener [UUID:%s] cannot attach more than %d redirect rule access control list groups.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10051": "load balancer listener [uuid:%s] had a redirect rule associated with access control list groups [uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10118": "the VM[UUID:%s] is still paused after the last migration; please resume it before attempting to migrate again.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10056": "the load balancer listener [uuid:%s] can\u0027t attach more than %d access control list groups", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10008": "Detach is not supported for this virtual machine instance type.", + "ORG_ZSTACK_COMPUTE_VM_10117": "The VM with UUID:%s is already hosted on host with UUID:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10057": "server group[%s] is not attached to load balancer listener[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10007": "Update provisioning configuration is not supported for this NFV instance type.", + "ORG_ZSTACK_COMPUTE_VM_10116": "rootDiskSize must be specified when the image media type is ISO.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10054": "The access control list groups[uuid:%s] are already associated with the load balancer listener[uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10055": "the load balancer listener[uuid:%s] has only attached the %s type access control list group.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10009": "Clean data is not supported for this virtualized network function instance type.", + "ORG_ZSTACK_COMPUTE_VM_10114": "Current platform %s does not yet support updating NIC drivers.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10004": "unable to establish an SSH connection to the NFV instance [%s] after configuring SSH settings", + "ORG_ZSTACK_COMPUTE_VM_10113": "Cannot create CD-ROM for virtual machine [uuid:%s] which is in state [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10058": "acl[%s] not attached to load balancer listener[%s]", + "ORG_ZSTACK_COMPUTE_VM_10112": "the image[name:%s, uuid:%s] is an ISO; therefore, the rootDiskSize must be specified.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10006": "Failed to update NFV instance status: %s", + "ORG_ZSTACK_COMPUTE_VM_10111": "Missing CPU and memory allocation settings for your instance. Please specify the required values to proceed.", + "ORG_ZSTACK_VPC_HA_10020": "HA group UUID is nil. Please verify the configuration and ensure that the UUID is correctly set.", + "ORG_ZSTACK_COMPUTE_VM_10121": "can\u0027t decrease capacity when VM[%s] is running", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10060": "could not attach VM NIC to load balancer listener because the VM NIC [uuid:%s] is already associated with the default server group [uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10061": "UDP listeners cannot have both IPv4 and IPv6 virtual IPs simultaneously. Please configure either IPv4 or IPv6 for your listener.", + "ORG_ZSTACK_COMPUTE_VM_10129": "%s is not a valid IPv4 address for cloud deployment", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10068": "invalid redirect status [%s], it only supports [valid HTTP status codes]", + "ORG_ZSTACK_COMPUTE_VM_10128": "cannot decrease the memory size of vm[uuid:%s] when it is running", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10065": "Can\u0027t attach more than %d access control list groups to a listener", + "ORG_ZSTACK_COMPUTE_VM_10127": "cannot decrease CPU of running VM[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10066": "loadBalancer listener[%s] does not support assigning session persistence state", + "ORG_ZSTACK_COMPUTE_VM_10126": "The state of VM [uuid:%s] is %s. Only these states [%s] are allowed to update CPU or memory.", + "ORG_ZSTACK_COMPUTE_VM_10125": "The virtual machine cannot perform memory hot-plug operations due to memory hot-plug being disabled. Please stop the virtual machine and then attempt the memory hot-plug operation again.", + "ORG_ZSTACK_COMPUTE_VM_10124": "The virtual machine cannot perform CPU hot addition due to CPU hot addition being disabled. Please stop the VM and then attempt CPU hot addition again.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10069": "invalid status code [%s], it only supports [valid status codes in cloud computing environment]", + "ORG_ZSTACK_COMPUTE_VM_10122": "reservedMemorySize[%s] exceeds memorySize[%s]", + "ORG_ZSTACK_COMPUTE_VM_10132": "%s is not a valid IPv6 address for cloud resource configuration", + "ORG_ZSTACK_COMPUTE_VM_10131": "ip address [%s] is not within the specified ip range [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10074": "loadBalancer[%s] listener[%s] does not support assigning session persistence state; explicit iphash assignment is required.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10075": "invalid session persistence type[%s], it only supports %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10072": "invalid session persistence status [%s], it only supports %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10073": "loadBalancer[%s] listener[%s] does not support assigning session persistence state; explicit disable is required.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10078": "invalid session cookie name[%s], it must only contain alphanumeric characters and underscores", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10079": "loadBalancer[%s] listener[%s] does not support simultaneously assigning idle timeout and cookie name", + "ORG_ZSTACK_COMPUTE_VM_10139": "IPv6 address must include a prefix length", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10076": "invalid session idle timeout[%s], it must be a positive integer between[%s~%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10077": "invalid session cookie name[%s], it must be shorter than [%d] characters", + "ORG_ZSTACK_COMPUTE_VM_10137": "IPv4 address requires a subnet mask", + "ORG_ZSTACK_COMPUTE_VM_10136": "static ip [%s] is improperly formatted", + "ORG_ZSTACK_COMPUTE_VM_10135": "Could not set IP address for the instance, as no IP address has been specified. Please ensure an IP address is provided before attempting to configure the network settings.", + "ORG_ZSTACK_COMPUTE_VM_10134": "ip address [%s] is not within the specified ip range [startIp %s, endIp %s]", + "ORG_ZSTACK_COMPUTE_VM_10133": "IP address [%s] is already assigned to VM NIC [uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10081": "loadBalancer[%s] listener[%s] does not support assigning idle timeout and cookie name when session persistence is disabled", + "ORG_ZSTACK_COMPUTE_VM_10143": "could not release static IP [%s] for VM [uuid:%s] as it does not exist", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10082": "loadBalancer[%s] listener[%s] does not support assigning session persistence rewrite without specifying a cookie name", + "ORG_ZSTACK_COMPUTE_VM_10142": "the VM[uuid:%s] has no network interface connected to the L3 network[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10080": "loadBalancer[%s] listener[%s] does not support assigning idle timeout and cookie name; session persistence must be specified.", + "ORG_ZSTACK_COMPUTE_VM_10140": "ip address [%s] already assigned to vmNic", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10085": "loadBalancer[%s] listener[%s] does not support assigning session persistence policies when the source load balancing algorithm is source-based.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10086": "loadBalancer[%s] does not support assigning session persistence using iphash for listener[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10083": "loadBalancer[%s] listener[%s] does not support assigning session persistence idle timeout without specifying rewrite mode", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10084": "loadBalancer[%s] listener[%s] does not support assigning session persistence with a cookieName without specifying an insert mode", + "ORG_ZSTACK_COMPUTE_VM_10149": "Unsupported Image Media Type: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10087": "invalid maximum connection[%s], the specified value exceeds the upper threshold of %d", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10088": "conflict loadBalancerPort[%s], another listener[uuid:%s] is using that port", + "ORG_ZSTACK_COMPUTE_VM_10147": "the VM %s with memory snapshots does not support setting a boot volume", + "ORG_ZSTACK_COMPUTE_VM_10146": "volume[uuid:%s] must be attached to virtual machine[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10145": "The boot volume of this instance cannot be configured as shareable.", + "ORG_ZSTACK_COMPUTE_VM_10144": "invalid boot device [%%s] in boot order %%s", + "ORG_ZSTACK_VMWARE_10024": "Cannot synchronize before datastores are isolated", + "ORG_ZSTACK_VMWARE_10025": "There are tasks running on the vCenter[uuid:%s], please try again later.", + "ORG_ZSTACK_VMWARE_10023": "failed to connect to vCenter: %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10008": "Could not initialize SDN controller because no Virtual Network Identifier (VNI) ranges are configured on controller [ip:%s]", + "ORG_ZSTACK_VMWARE_10020": "No available VNC ports for virtual machine %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10009": "Could not retrieve VNI range information from SDN controller [ip:%s] because %s", + "ORG_ZSTACK_VMWARE_10021": "get service instance for vCenter %s failed because %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10092": "cloud failed to create the load balancer listener because the TCP protocol listener only supports TCP proxy protocol parameters.", + "ORG_ZSTACK_MEVOCO_10006": "unsupported operation for setting virtio-scsi volume[%s] multiQueues in cloud computing environment.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10093": "cloud is unable to create the load balancer listener because it only supports TCP proxy protocol %s", + "ORG_ZSTACK_MEVOCO_10005": "unsupported operation for setting root volume[%s] to use multiple queues.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10091": "Cloud computing resource creation failed due to the listener with protocol HTTPS only supporting HTTP versions [h1, h2]. Please ensure the compatibility of your request.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10010": "Could not create hardware VXLAN network because H3C tenant UUID is a mandatory parameter for the H3C VCFC V2 controller. Please provide the required UUID to proceed.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10096": "load balancer listener with type %s does not require a certificate", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10097": "loadbalancer listener [uuid:%s] already has certificate[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10094": "cloud failed to create the load balancer listener because the listener with protocol [%s] does not support content compression", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10095": "cloud is unable to create the load balancer listener because it only supports compression algorithms [%s]", + "ORG_ZSTACK_MEVOCO_10007": "for shareable volume, the only supported primary storage type is %s, current is %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10015": "Could not create VNI range because the specified L2 network [uuid:%s] is not a VXLAN network pool instance.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10016": "Could not create VNI range [%s-%s] because H3C controllers use VNI as VLAN ID and the range must be within 1-4094. VNI values should comply with VLAN ID standards for virtual network implementation.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10017": "Could not create VNI range [%s-%s] as it is not covered by any of the SDN controller\u0027s configured VNIs.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10098": "certificate [uuid:%s] is not associated with load balancer listener [uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10018": "Could not add IPv6 range because the SDN controller [uuid:%s] is not operational. Current status: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10099": "healthCheck target [%s] error, it must be \u0027default\u0027 or a port number between [1~65535]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10011": "Could not create hardware VXLAN network because the specified tenant does not exist in the SDN controller management system. Please verify the tenant ID and ensure it is correctly configured in the cloud environment.", + "ORG_ZSTACK_MEVOCO_10002": "cannot find IOPS mode from null VolumeQoS", + "ORG_ZSTACK_VMWARE_10017": "L2[UUID:%s] does not belong to vCenter[UUID:%s] cluster[UUID:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10012": "Could not create VXLAN network because the SDN controller [ip:%s] did not respond", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10013": "Could not create VXLAN network on SDN controller [IP:%s] because %s", + "ORG_ZSTACK_MEVOCO_10000": "ZStack has been paused and all API calls except read-only operations are rejected. If you need to proceed with a non-read-only operation, please add \u0027%s\u0027 to the systemTags.", + "ORG_ZSTACK_VMWARE_10015": "No hosts found within the compute cluster: %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10014": "Could not delete VXLAN network on SDN Controller [IP:%s] because %s", + "ORG_ZSTACK_VMWARE_10016": "vSwitch/dvSwitch not found: %s, or vSwitch on different ESX host does not have the same port group", + "ORG_ZSTACK_VMWARE_10013": "NIC driver %s is not yet supported", + "ORG_ZSTACK_VMWARE_10014": "Cluster[uuid:%s] and Layer 2 Network[uuid:%s] belong to different Data Centers", + "ORG_ZSTACK_VMWARE_10011": "domainName[%s] is not a valid DNS hostname or IP address", + "ORG_ZSTACK_VMWARE_10012": "vCenter [Domain Name:%s] has been added", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10019": "Could not add IPv6 range by network CIDR because the SDN controller [uuid:%s] is not connected. Current status: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10000": "No available baremetal gateway found for this request. Please ensure that your baremetal nodes are properly configured and registered with the cloud computing environment.", + "ORG_ZSTACK_VMWARE_10010": "vCenter login username is required.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10002": "failed to allocate BareMetal2 gateway resource", + "ORG_ZSTACK_CORE_DEBUG_10000": "The task information (%s) was not found in the cloud computing environment. Please ensure that all necessary task details are properly configured and uploaded.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10020": "Could not add IP range because the SDN controller [uuid:%s] is not connected. Current status: %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10021": "Could not add IP range by network CIDR because the SDN controller [uuid:%s] is not connected. Current status: %s", + "ORG_ZSTACK_MEVOCO_10014": "invalid network bandwidth[%s], it is not a numeric value", + "ORG_ZSTACK_MEVOCO_10019": "invalid volume bandwidth[%s], it must be greater than 1024 Mbps (inclusive)", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10028": "Could not retrieve tenants because the SDN controller [ip:%s] did not respond", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10029": "Could not initialize SDN controller because no default tenant is configured on controller [ip:%s]", + "ORG_ZSTACK_VMWARE_10009": "console password is not supported by virtual machine [UUID:%s] on ESX Host [ESXi Version:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10022": "cannot create Layer 3 network because the H3C VCFC V2 SDN controller does not support Layer 3 networking [type:%s, category:%s]", + "ORG_ZSTACK_MEVOCO_10013": "invalid network bandwidth[%s], it must be greater than or equal to %d Mbps", + "ORG_ZSTACK_VMWARE_10006": "failed to get VM[%s] root disk usage statistics", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10023": "Could not create hardware VXLAN network because tenant UUID is a mandatory parameter for the H3C VCFC V2 controller. Please ensure it is provided.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10024": "Could not add H3C VCFC controller because VDS UUID system tag is required for H3C VCFC V1 controllers", + "ORG_ZSTACK_VMWARE_10005": "failed to get VM instance from install path: %s", + "ORG_ZSTACK_VMWARE_10002": "No virtual datacenter found", + "ORG_ZSTACK_VMWARE_10000": "No virtual disk management service found", + "ORG_ZSTACK_VMWARE_10001": "No file manager configured for cloud storage operations. Please ensure a valid file manager is set up to handle %s operations.", + "ORG_ZSTACK_VPC_HA_VYOS_10000": "failed to enable HA on virtual router[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10011": "nfv instance [uuid:%s] is in status of %s that cannot perform an HTTP call to %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10010": "The NFV instance [name:%s, UUID:%s, current state:%s] is not running and cannot perform the required operation. Please retry your operation once the instance is running.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10013": "unable to add network interface [ip:%s, mac:%s] to NFV instance [uuid:%s ip:%s], because %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10012": "nfv instance [uuid:%s] has no management network interface that can make an HTTP call to %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10004": "Could not determine the primary node for the Software-Defined Network (SDN) controller [ip:%s] due to %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10005": "Could not authenticate with SDN controller because controller [IP:%s] did not respond", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_10000": "vm[uuid:%s] storage migration long-running job[uuid:%s] failed due to management node restart", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10006": "Could not authenticate with SDN Controller [IP:%s] because %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10007": "Could not retrieve VNI range information because the SDN controller [ip:%s] did not respond", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10000": "Could not add IP range because subnet creation failed on the SDN controller. Please check the network configuration or contact support for assistance.", + "ORG_ZSTACK_COMPUTE_VM_10103": "Unable to change to L3 Network. The L3 network [uuid:%s] is a system network and the VM is a user VM.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10015": "VMInstanceSpec not found in flow data parameters. Please ensure all required specifications are included.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10001": "Could not add IP range to network because %s", + "ORG_ZSTACK_COMPUTE_VM_10102": "unable to switch to L3 network. The L3 network with UUID [uuid:%s] is disabled", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10014": "cannot delete image [UUID:%s] as it is utilized by an NFV instance group [UUID:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10002": "Could not delete IP range from Layer 3 network because %s", + "ORG_ZSTACK_COMPUTE_VM_10101": "Unable to switch to a non-guest L3 network. The L3 network with UUID [uuid:%s] is already associated with VM [uuid: %s].", + "ORG_ZSTACK_COMPUTE_VM_10100": "Unable to change to L3 network. The L3 network with UUID [uuid:%s] is already attached to VM with UUID [%s].", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10003": "Could not determine cluster leader because the SDN controller [IP:%s] did not respond", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10016": "VM Inventory or UUID is null in VM Instance Specification", + "ORG_ZSTACK_PORTMIRROR_10008": "The PortMirror service does not support the NIC [%s] due to its hypervisor type.", + "ORG_ZSTACK_PORTMIRROR_10009": "The PortMirror service cannot mirror to the NIC [%s] that is not a non-default interface of a VM.", + "ORG_ZSTACK_ZWATCH_API_10019": "query duration cannot exceed %s", + "ORG_ZSTACK_COMPUTE_VM_10198": "Cannot create VM instance from a shareable volume. Please ensure the volume is not set as shareable and try again.", + "ORG_ZSTACK_PORTMIRROR_10000": "Invalid parameter [%s], ensure it refers to a valid Port Mirroring Network", + "ORG_ZSTACK_COMPUTE_VM_10197": "Need to set one of the following properties: %s", + "ORG_ZSTACK_PORTMIRROR_10001": "The network[%s] has been associated with a Port Mirroring service", + "ORG_ZSTACK_ZWATCH_API_10028": "account[uuid: %s] lacks permissions for resource[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10196": "Cannot configure the following properties simultaneously: %s", + "ORG_ZSTACK_PORTMIRROR_10002": "The Port Mirroring service[%s] has not been created", + "ORG_ZSTACK_PORTMIRROR_10003": "The NIC [%(device_id)s, %(network_interface_id)s] has been mirrored by service [%(service_id)s]", + "ORG_ZSTACK_COMPUTE_VM_10194": "At least one of the following should be specified for the instance: architecture in msg or image[uuid:%s]", + "ORG_ZSTACK_PORTMIRROR_10004": "The NIC[%s] cannot be mirrored for service[%s] using", + "ORG_ZSTACK_ZWATCH_API_10025": "invalid label[%s], valid queryable labels for cloud resources are %s", + "ORG_ZSTACK_COMPUTE_VM_10193": "At least one of the following should be specified for the guest operating system: field guestOsType in msg or image[uuid:%s].", + "ORG_ZSTACK_ZWATCH_API_10024": "metric[%s] does not have filter[%s]", + "ORG_ZSTACK_COMPUTE_VM_10192": "At least one of the following should be specified for the message or image [uuid:%s]: platform or imageID.", + "ORG_ZSTACK_PORTMIRROR_10007": "The PortMirror service does not support mirroring the NIC[%s].", + "ORG_ZSTACK_ZWATCH_API_10021": "cannot find metric[%s] in namespace[%s]", + "ORG_ZSTACK_COMPUTE_VM_10199": "Could not create VM instance from attached volume. Please ensure the volume is in a usable state and try again.", + "ORG_ZSTACK_PORTMIRROR_10011": "The PortMirror service cannot establish a mirror tunnel for nic[%s] to nic[%s] because the mirror network[%s] is invalid.", + "ORG_ZSTACK_PORTMIRROR_10012": "The PortMirror service cannot mirror the network interface [%s] to itself", + "ORG_ZSTACK_ZWATCH_API_10039": "Invalid JSON format for labels. Please ensure that labelsJsonStr is correctly formatted.", + "ORG_ZSTACK_PORTMIRROR_10013": "The PortMirror service is not compatible with the network interface configured with Quality of Service (QoS).", + "ORG_ZSTACK_ZWATCH_API_10038": "The namespace [%%s] has no metric [%%s]", + "ORG_ZSTACK_PORTMIRROR_10014": "failed to delete port mirror session[%s] from hypervisor, detail: %s", + "ORG_ZSTACK_ZWATCH_API_10037": "No namespace defined in the system", + "ORG_ZSTACK_PORTMIRROR_10015": "failed to release port mirror session[%s] from hypervisor, detail: %s", + "ORG_ZSTACK_ZWATCH_API_10036": "The URL format is invalid; it must start with http(s).", + "ORG_ZSTACK_PORTMIRROR_10016": "cannot find internal ID of the session[uuid:%s], is there a session limit exceeded on the host???", + "ORG_ZSTACK_ZWATCH_API_10033": "endTime[%s, %sms] must not be before startTime[%s, %sms]", + "ORG_ZSTACK_ZWATCH_API_10032": "metric[%s]\u0027s labels do not include [%s]", + "ORG_ZSTACK_ZWATCH_API_10031": "cannot find namespace[%s]", + "ORG_ZSTACK_ZWATCH_API_10030": "If the namespace is set to all, specifying metrics and labels is not supported.", + "ORG_ZSTACK_PORTMIRROR_10010": "The PortMirror service cannot mirror the NIC [%s] which is not an interface of any VM.", + "ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10009": "get PCI device information from host[uuid:%s] failed", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10030": "Could not retrieve default tenant from SDN controller [ip:%s] due to communication issues", + "ORG_ZSTACK_ZWATCH_API_10046": "The time interval exceeds %d days", + "ORG_ZSTACK_ZWATCH_API_10045": "endTime[%s] must not be before startTime[%s]", + "ORG_ZSTACK_ZWATCH_API_10044": "invalid instance[%s]", + "ORG_ZSTACK_ZWATCH_API_10043": "ECS instance alert acknowledgment record does not exist", + "ORG_ZSTACK_ZWATCH_API_10042": "startTime[%s] is later than endTime[%s]", + "ORG_ZSTACK_ZWATCH_API_10041": "platform[url\u003d%s] already exists", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10033": "Could not delete VXLAN network because the SDN controller [ip:%s] did not respond", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10004": "operation error, VIP %s has not been bound to a VM instance", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10000": "failed to create port forwarding rule[vip ip: %s, private ip: %s, vip start port: %d, vip end port: %d, private start port: %d, private end port: %d], because %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10001": "failed to revoke port forwarding rules %s due to %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10002": "failed to sync port forwarding rules served by virtual router[name: %s, uuid: %s], because %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10003": "Found a virtual router offering [uuid:%s] for L3 Network [uuid:%s] in zone [uuid:%s]; however, the network\u0027s public network [uuid:%s] does not match the Port Forwarding rule [uuid:%s]. You may need to specify a particular virtual router offering using the system tag guestL3Network::l3NetworkUuid.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10004": "virtual router does not support port forwarding range redirection; the VIP port start must equal the private port start and the VIP port end must equal the private port end. However, this rule has a mismatching range: VIP port [%s, %s], private port [%s, %s].", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10005": "failed to add port forwardings on virtual router[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10006": "failed to revoke port forwardings on virtual router[uuid:%s], error: %s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10003": "failed to ungenerate secondary storage devices because:%s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10004": "get MTTY device information from host[UUID:%s] failed", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10001": "The quantity exceeded. The device[uuid: %s] requires a number of SE devices that exceeds the allowed quantity[%d].", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10002": "failed to generate storage devices because:%s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10000": "The specified part number[value:%s] is not a valid instance ID in this cloud environment.", + "ORG_ZSTACK_CORE_CLOUDBUS_10021": "message is not in corrected JSON format, %s", + "ORG_ZSTACK_COMPUTE_VDPA_10009": "only %s support vdpa acceleration technology", + "ORG_ZSTACK_COMPUTE_VDPA_10007": "could not generate PCI device[uuid:%s] because another L2 instance[uuid:%s] is using the physical network interface attached to the cluster", + "ORG_ZSTACK_COMPUTE_VDPA_10006": "could not ungenerate PCI device[uuid:%s], because another L2 instance[uuid:%s] is using the physical network interface attached to the cluster", + "ORG_ZSTACK_COMPUTE_VDPA_10005": "failed to delete bridge[%s] for l2Network[uuid:%s, type:%s] on KVM host[uuid:%s], due to %s", + "ORG_ZSTACK_COMPUTE_VDPA_10004": "failed to check bridge[%s] for l2NoVlanNetwork[uuid:%s, name:%s] on KVM host[uuid: %s], %s", + "ORG_ZSTACK_COMPUTE_VDPA_10003": "failed to create bridge[%s] for l2Network[uuid:%s, type:%s] on KVM host[uuid:%s], because %s", + "ORG_ZSTACK_COMPUTE_VDPA_10002": "restore vdpa for vm[uuid:%s] from the destination host[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VDPA_10001": "release vdpa device for vm[uuid:%s] on the destination host[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10152": "VM[uuid:%s] is attached to multiple ISOs, please specify the isoUuid when detaching.", + "ORG_ZSTACK_COMPUTE_VM_10151": "VM[uuid:%s] has mounted the ISO CD-ROM[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10150": "The virtualCDROM with UUID:%s does not exist", + "ORG_ZSTACK_COMPUTE_VM_10159": "Unable to attach a Layer 3 network. The Layer 3 network [uuid:%s] belongs to Layer 2 networks [uuids:%s] that have not been attached to any cluster.", + "ORG_ZSTACK_COMPUTE_VM_10158": "Unable to attach a Layer 3 network. The specified L3 network [uuid:%s] belongs to a different Layer 2 network [uuids:%s].", + "ORG_ZSTACK_COMPUTE_VM_10157": "unable to attach a Layer 3 network. The specified Layer 3 network [uuid:%s] does not have an IP range defined.", + "ORG_ZSTACK_COMPUTE_VM_10156": "unable to attach a Layer 3 network. The VM [uuid: %s] is not in a Running or Stopped state; the current state is %s", + "ORG_ZSTACK_COMPUTE_VDPA_10015": "failed to allocate vDPAs on host[uuid:%s] for VM[uuid:%s]: %s", + "ORG_ZSTACK_COMPUTE_VDPA_10013": "failed to delete vDPAs on host[UUID:%s] for VM[UUID:%s]: %s", + "ORG_ZSTACK_COMPUTE_VDPA_10012": "L2 network [UUID:%s] in host [UUID:%s] is not SRIOV virtualized", + "ORG_ZSTACK_COMPUTE_VDPA_10011": "cluster[uuid:%s] does not support ovs-dpdk", + "ORG_ZSTACK_COMPUTE_VDPA_10010": "cannot create a vSwitch with physical interface:[%s] which is already being used by another vSwitch type.", + "ORG_ZSTACK_COMPUTE_VM_10163": "unable to attach a Layer 3 network. The Layer 3 network with UUID [uuid:%s] is a system network, while the VM is a user VM.", + "ORG_ZSTACK_COMPUTE_VM_10162": "unable to attach a Layer 3 network. The Layer 3 network with UUID [%s] is disabled", + "ORG_ZSTACK_COMPUTE_VM_10161": "unable to attach a non-guest L3 network to the virtual machine as it is already attached to another virtual machine (uuid: %s)", + "ORG_ZSTACK_COMPUTE_VM_10160": "Unable to attach a Layer 3 network. The specified Layer 3 network [uuid:%s] is already attached to the virtual machine [uuid: %s].", + "ORG_ZSTACK_COMPUTE_VM_10168": "The static IP [%s] is already assigned to a resource on the Layer 3 network [uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_10167": "The static IP [%s] is not within any IP range of the Layer 3 network [uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_10166": "static IP L3 UUID[%s] is not included in NIC L3 list[%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10009": "IAM2ProjectVO[uuid:%s] is not in the %s state, state change is not allowed", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10008": "The project [UUID:%s, Name:%s] already has a login expiration strategy configured.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10007": "invalid date or time[%s], it cannot be earlier than the current timestamp[%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10006": "invalid spending value[%s], it should be in format of for example 10.001", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10005": "invalid spending value[%s], spending value should be between 0 and %f", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10004": "invalid time[%s], it should be in a format such as 10m, 1h, or 2d", + "ORG_ZSTACK_CORE_CLOUDBUS_10001": "for webhooks with type[%s], the opaque field cannot be null", + "ORG_ZSTACK_COMPUTE_VM_10176": "Unable to attach the NIC. Its L2 network [uuid:%s] has not been attached to any compute cluster.", + "ORG_ZSTACK_ZWATCH_API_10007": "dataStartTime and dataEndTime parameters cannot be omitted. Please ensure they are provided.", + "ORG_ZSTACK_COMPUTE_VM_10175": "Unable to attach the NIC. Its Layer 3 network [uuid:%s] is a system network, while the VM is a user VM.", + "ORG_ZSTACK_ZWATCH_API_10006": "dataUuid cannot be omitted", + "ORG_ZSTACK_COMPUTE_VM_10174": "unable to attach the nic. Its Layer 3 network [uuid:%s] is disabled", + "ORG_ZSTACK_COMPUTE_VM_10173": "Unable to attach the NIC to a non-guest L3 network. The L3 network [uuid:%s] is already attached to the VM [uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_10172": "The L3 network with UUID [%s] is already attached to another VM with UUID [%s]. Please detach it from the existing VM before attaching it to a new one.", + "ORG_ZSTACK_COMPUTE_VM_10171": "The NIC has been attached to VM [UUID: %s]. Please ensure that the NIC is not already attached before attempting to attach it again.", + "ORG_ZSTACK_COMPUTE_VM_10170": "unable to attach the nic. The VM[uuid: %s] is not in a Running or Stopped state; the current state is %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10011": "The project [UUID:%s, Name:%s] already has a retirement policy defined.", + "ORG_ZSTACK_COMPUTE_VM_10179": "unable to detach a L3 network from VM [uuid: %s]; VM is not in Running or Stopped state; current state is %s", + "ORG_ZSTACK_COMPUTE_VM_10178": "could not update network interface [uuid: %s] state, due to unsupported network interface type [%s]", + "ORG_ZSTACK_CORE_UPGRADE_10000": "Api: %s is not permitted according to allowedApiListGrayscaleUpgrading: %s.", + "ORG_ZSTACK_CORE_UPGRADE_10003": "Cannot find the agent version; upgrading cluster OS is not supported during a gray-scale upgrade. Please ensure the agent version is installed before initiating the upgrade process.", + "ORG_ZSTACK_CORE_UPGRADE_10002": "Disable grayscale upgrade by %s before you want to update the entire cluster\u0027s hosts\u0027 OS. Alternatively, try updating the cluster OS with a specific host UUID instead.", + "ORG_ZSTACK_CORE_UPGRADE_10004": "Host[UUID: %s] agent version has not been upgraded. Please reconnect the host before performing an operating system update.", + "ORG_ZSTACK_ZWATCH_API_10008": "dataStartTime[%s] is later than dataEndTime[%s]", + "ORG_ZSTACK_COMPUTE_VM_10187": "when imageUuid is null, placeholder_for_image_uuid_is_missing", + "ORG_ZSTACK_COMPUTE_VM_10186": "The root disk is missing. Please ensure that a root volume is attached to your instance.", + "ORG_ZSTACK_COMPUTE_VM_10185": "Unexpected configuration for data disks. The sizes specified in dataDiskSizes must be greater than 0.", + "ORG_ZSTACK_COMPUTE_VM_10182": "Unexpected root volume settings", + "ORG_ZSTACK_COMPUTE_VM_10181": "image media type is ISO but root disk settings are missing", + "ORG_ZSTACK_COMPUTE_VM_10180": "vm[uuid:%s] can only attach a volume when its state is Running or Stopped; the current state is %s.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10003": "invalid date[%s], it should be in format of yyyy-MM-dd HH:mm:ss ZZZ", + "ORG_ZSTACK_ZWATCH_API_10010": "A namespace name cannot start with a reserved keyword such as %s.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10002": "invalid means[%s], allowed means are for specifying resource quotas or metrics in a cloud environment", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10001": "invalid value for parameter, %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10000": "Invalid value specified for resource limit; expected a numeric value without \u0027at\u0027, \u0027after\u0027, or \u0027exceed\u0027 suffix. Please provide a valid number.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10030": "PXE Server DHCP Interface %s does not exist, or it does not have an IP address.", + "ORG_ZSTACK_NETWORK_OVN_10012": "cannot add SDN host because network interface [%s] has IP address [%s]", + "ORG_ZSTACK_NETWORK_OVN_10011": "cannot add SDN host because NIC[%s] is in SR-IOV virtualized state", + "ORG_ZSTACK_NETWORK_OVN_10010": "cannot add SDN host because NIC[%s]\u0027s type [%s] is used for Linux bonding", + "ORG_ZSTACK_NETWORK_OVN_10016": "SDN host addition failed because only KVM hosts support OVS DPDK.", + "ORG_ZSTACK_APIMEDIATOR_10000": "More than one Backup Storage instance on the same host identified by hostname. There has been an SftpBackupStorage [hostname:%s] existing. The Backup Storage type to be added is %s.", + "ORG_ZSTACK_NETWORK_OVN_10015": "cannot add SDN host because bond mode[%s] is not supported by OVN", + "ORG_ZSTACK_NETWORK_OVN_10014": "cannot add SDN host because NIC[%s] is used for VXLAN VTEP interface", + "ORG_ZSTACK_NETWORK_OVN_10013": "cannot add SDN host because NIC[%s] has been attached to L2 network[name:%s]", + "ORG_ZSTACK_APIMEDIATOR_10001": "More than one Backup Storage service running on the same host identified by hostname. There exists an Image Store Backup Storage service [hostname:%s]. The type of Backup Storage to be added is %s.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10031": "%s ~ %s cannot establish a connection to the DHCP interface %s", + "ORG_ZSTACK_NETWORK_OVN_10019": "The host with UUID [%s] in cluster with UUID [%s] has not enabled hugepages; therefore, it is not permitted to be added to the SDN controller.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10032": "cluster[uuid:%s] and pxeserver[uuid:%s] do not reside within the same zone", + "ORG_ZSTACK_NETWORK_OVN_10018": "Cannot add SDN host because a network mask has not been specified.%s", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10033": "cluster[uuid:%s] is not a baremetal cluster", + "ORG_ZSTACK_NETWORK_OVN_10017": "Cannot add SDN host because VTEP IP is not configured.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10034": "baremetal PXE server [uuid:%s] is already attached to cluster [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10035": "baremetal PXE server [UUID: %s] is not compatible with baremetal instances in cluster [UUID: %s], as the existing NIC IP %s falls outside of the PXE server\u0027s DHCP range (%s ~ %s).", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10036": "baremetal PXE server [UUID: %s] is not associated with cluster [UUID: %s]", + "ORG_ZSTACK_STORAGE_MIGRATION_10030": "The destination primary storage is not attached to a cluster that shares the same level 2 networks as the source cluster.", + "ORG_ZSTACK_STORAGE_MIGRATION_10033": "do not support storage migration while a shared volume[uuid: %s, name: %s] is attached", + "ORG_ZSTACK_STORAGE_MIGRATION_10034": "Cannot migrate volume from source instance to target instance.", + "ORG_ZSTACK_STORAGE_MIGRATION_10031": "The volume [UUID:%s] is still attached to VM [UUID:%s], please detach it before migration.", + "ORG_ZSTACK_STORAGE_MIGRATION_10032": "cannot migrate data volume[uuid:%s] between shared block primary storages when virtual machine[vmuuid:%s] is not stopped.", + "ORG_ZSTACK_STORAGE_MIGRATION_10035": "cannot migrate volume[%s] as its state is Disabled", + "ORG_ZSTACK_STORAGE_MIGRATION_10036": "No host available for block-based live migration: %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10019": "cannot find SNSTextTemplate with UUID:%s, it may have been deleted or removed from the cloud storage.", + "ORG_ZSTACK_NETWORK_OVN_10023": "could not modify vmnic to l3network [uuid:%s] as the host [uuid:%s] associated with the virtual machine is not connected to the SDN controller [uuid:%s].", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10028": "failed to establish a connection to %s, please verify the network configuration between the ZStack management node and the bare-metal PXE server", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10016": "application platform/endpoint [%s] does not support user-defined templates", + "ORG_ZSTACK_NETWORK_OVN_10022": "could not modify VMNIC to L3 network [UUID:%s] as the SDN controller [UUID:%s] was not found", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10029": "No local repository found under /opt/zstack-dvd of %s, please download zStack ISO and create a local repository first.", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10015": "invalid application platform type[%s]", + "ORG_ZSTACK_NETWORK_OVN_10021": "could not attach L3 network to VM because the host [uuid:%s] of the VM is not attached to the SDN controller [uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10018": "cannot find the topic[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10020": "could not attach L3 network to VM because SDN controller [uuid:%s] is not found", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10017": "parameters: %s are not supported by ZStack, available values for parameters are: %s", + "ORG_ZSTACK_NETWORK_OVN_10026": "failed to synchronize network quality of service settings to ovn controller[uuid:%s, ip:%s], due to %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10011": "Sms template code should be a string with a length of 13 characters. However, the provided event template code: [%s] has [%d] characters.", + "ORG_ZSTACK_NETWORK_OVN_10025": "failed to retrieve NIC QoS from OVN controller[uuid:%s, ip:%s], due to %s", + "ORG_ZSTACK_NETWORK_OVN_10024": "failed to set NIC QoS on OVN controller[uuid:%s, ip:%s], because %s", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10020": "Unsupported backup storage type for bare-metal server", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10010": "Sms template code length should be 13 characters. Received alarm template code: [%s] with [%d] characters.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10023": "PXE Server DHCP Range Netmask %s is invalid for virtual machine deployment.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10024": "PXE Server DHCP Range Start %s and Range Stop %s do not belong to the same subnet mask.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10025": "PXE Server with hostname already exists.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10026": "There is already a Baremetal2 gateway with the management IP %s; please do not use it to create a Baremetal PXE server.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10027": "storagePath must be an absolute path specifying the full location in the virtual file system.", + "ORG_ZSTACK_STORAGE_MIGRATION_10022": "Image[uuid:%s] is not found in the source backup storage[uuid:%s].", + "ORG_ZSTACK_STORAGE_MIGRATION_10023": "Cannot migrate image from source location to destination location.", + "ORG_ZSTACK_STORAGE_MIGRATION_10020": "Source Block Storage and Destination Block Storage must not be Disabled.", + "ORG_ZSTACK_STORAGE_MIGRATION_10021": "Image[uuid:%s] is not in the Ready state and therefore cannot be migrated.", + "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10001": "host %s\u0027s heartbeat is not received", + "ORG_ZSTACK_STORAGE_MIGRATION_10026": "Volume[uuid:%s] is not in the Ready state and cannot be migrated.", + "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10000": "not found host ID for host UUID[%s] and primary storage UUID[%s]", + "ORG_ZSTACK_STORAGE_MIGRATION_10027": "Cannot migrate the root volume of a virtual machine instance when it is not in a stopped state. Please ensure the instance is stopped before attempting to migrate the root volume.", + "ORG_ZSTACK_STORAGE_MIGRATION_10024": "Volume[uuid:%s] is already in Pool[uuid:%s], cannot migrate.", + "ORG_ZSTACK_STORAGE_MIGRATION_10025": "Source and destination PowerShell sessions must not be in a Disabled or Maintenance state.", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10009": "The length of Alibaba Cloud SMS sign should be between 2 to 12 characters. Got sign: [%s] with [%d] characters.", + "ORG_ZSTACK_STORAGE_MIGRATION_10028": "VM storage migration is not supported for VM[uuid:%s, name: %s] when a shared volume is attached.", + "ORG_ZSTACK_STORAGE_MIGRATION_10029": "Cannot migrate the root volume of a VM instance that has attached data volumes. Please detach all data volumes before migrating the root volume.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10017": "failed to mount baremetal cache of image[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10019": "Not enough space left in the baremetal image cache for image[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10011": "failed to create DHCP configuration for chassis [uuid:%s] on PXE server [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10012": "failed to delete DHCP configuration of chassis[uuid:%s] on PXE server[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10013": "The UUID of the baremetal PXE server agent has changed [expected: %s, actual: %s]. This is most likely due to a manual restart of the agent. Please reconnect to synchronize the status.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10005": "cannot find directory: %s in dashboard", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10016": "unable to connect to baremetal PXE server [url:%s], because %s", + "ORG_ZSTACK_LICENSE_10002": "The provided license request code %s is invalid for cloud resource allocation. Please verify and reattempt.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10003": "sqlite3 execution failed due to: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10000": "non-supported method: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10001": "http request error! status code: %s, error: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10011": "The Ceph backup storage attached does not support ISO-based storage migration.", + "ORG_ZSTACK_STORAGE_MIGRATION_10015": "do not support storage migration from [%s] to [%s] virtual environment", + "ORG_ZSTACK_STORAGE_MIGRATION_10016": "VM[uuid:%s] is running but host UUID is missing", + "ORG_ZSTACK_STORAGE_MIGRATION_10013": "do not support storage migration from [%s] to [%s] with data volumes", + "ORG_ZSTACK_STORAGE_MIGRATION_10014": "do not support storage migration from [%s] to [%s] using snapshots", + "ORG_ZSTACK_STORAGE_MIGRATION_10019": "Source BS and Target BS cannot be the same.", + "ORG_ZSTACK_STORAGE_MIGRATION_10017": "Only supports data volume live storage migration using the dataVolumes parameter.", + "ORG_ZSTACK_STORAGE_MIGRATION_10018": "do not support live storage migration from [%s] to [%s] for volumes other than the root volume", + "ORG_ZSTACK_NETWORK_OVN_10001": "could not add VM NIC to security group because the VM NIC SDN [uuid:%s] does not match the security group SDN [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10006": "failed to create bm instance nginx proxy on baremetal pxeserver[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10000": "could not attach L3 network to security group because L3 network SDN [uuid:%s] does not match security group SDN [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10007": "failed to delete bm instance nginx proxy on baremetal pxeserver[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10008": "failed to start baremetal PXE server[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10009": "failed to stop baremetal PXE server[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10005": "cannot create security group because OVS controller[uuid:%s, type: %s] is not found", + "ORG_ZSTACK_NETWORK_OVN_10004": "Cannot create security group because OVN controller is specified. Please ensure that you do not specify an OVN controller when creating a security group.", + "ORG_ZSTACK_NETWORK_OVN_10003": "Cannot delete host due to %d OVN controller instances running on the host", + "ORG_ZSTACK_NETWORK_OVN_10002": "cannot create Layer 3 network because OVN does not support L3 type: %s, category: %s", + "ORG_ZSTACK_NETWORK_OVN_10009": "cannot add SDN host because network interface [%s] is not found", + "ORG_ZSTACK_NETWORK_OVN_10008": "Cannot create SDN L2 network because an SDN controller UUID is missing. Please ensure that the SDN controller UUID is configured correctly.", + "ORG_ZSTACK_NETWORK_OVN_10007": "cannot attach network service[%s] to OVS network", + "ORG_ZSTACK_GUESTTOOLS_PVPANIC_10000": "can not deploy virtual machines without a valid source file path", + "ORG_ZSTACK_NETWORK_OVN_10006": "cannot attach OVN network service to network with vSwitchType[%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10001": "failed to initialize configurations on baremetal PXE server[uuid:%s]", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_MARKETPLACE_10000": "filterName must be set to marketplace:true or marketplace:false for proper filtering in the marketplace service.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10002": "failed to create baremetal instance configurations on pxeserver[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10003": "failed to delete baremetal instance configurations on pxeserver[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10004": "failed to create BM instance NOVA proxy on baremetal PXE server[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10005": "failed to delete bm instance novnc proxy on baremetal pxeserver[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_10005": "L3Network[uuid:%s] does not have the network service[type:%s] enabled or there is no provider offering this network service.", + "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10000": "unsupported capability: SEND_SNS_MESSAGE", + "ORG_ZSTACK_NETWORK_SERVICE_10004": "Failed to apply network service[%s] to virtual machine[uuid: %s]", + "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10001": "failed to send SNS notification on plugin %s", + "ORG_ZSTACK_NETWORK_SERVICE_10007": "network service for provider[uuid:%s] must be defined", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10021": "no baremetal2 provisioning network found in cluster[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10020": "there is no usable Baremetal2 gateway found in cluster[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_10001": "L3Network [UUID: %s] does not have host route service configured.", + "ORG_ZSTACK_NETWORK_SERVICE_10000": "L3Network [UUID: %s] provides a null type", + "ORG_ZSTACK_LICENSE_10019": "unexpected host vendor for MINI VM template", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10022": "baremetal2 provisioning network [uuid:%s] is not usable; ensure it is enabled.", + "ORG_ZSTACK_NETWORK_SERVICE_10009": "network service provider with UUID [%s] does not offer services for %s", + "ORG_ZSTACK_NETWORK_OVN_10052": "failed to delete OVS port to host [uuid:%s] for nics [%s], error: %s", + "ORG_ZSTACK_NETWORK_SERVICE_10008": "cannot find network service provider[uuid:%s] or it does not offer any services", + "ORG_ZSTACK_NETWORK_OVN_10051": "failed to delete OVS port on host [UUID:%s] for NICs [%s], error: %s", + "ORG_ZSTACK_NETWORK_OVN_10050": "failed to synchronize OVS port with host[uuid:%s] for network interfaces [%s], error: %s", + "ORG_ZSTACK_NETWORK_OVN_10056": "query cluster status for verify nodes were kicked out error %s", + "ORG_ZSTACK_NETWORK_OVN_10055": "failed to synchronize Quality of Service settings to OVN controller[uuid:%s, ip:%s], error: %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORK_10000": "cannot configure VXLAN network for virtual machine [uuid:%s] on the destination host [uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10054": "failed to set OVS port requested chassis to host[uuid:%s] for LSP[%s], error: %s", + "ORG_ZSTACK_NETWORK_OVN_10053": "failed to set OVS port requested chassis on host[uuid:%s] for LSP[%s], error: %s", + "ORG_ZSTACK_NETWORK_OVN_10059": "failed to add DHCP options to OVN controller[uuid:%s, ip:%s], because %s", + "ORG_ZSTACK_NETWORK_OVN_10058": "Empty cluster status result received from agent; please verify the agent\u0027s configuration and connectivity.", + "ORG_ZSTACK_NETWORK_OVN_10057": "Failed to retrieve cluster status: %s", + "ORG_ZSTACK_NETWORK_SERVICE_10010": "A network service [%s] has been attached to a Layer 3 network [UUID: %s].", + "ORG_ZSTACK_LICENSE_10023": "Failed to delete license for virtual machine %s due to an unknown error. Please contact support for assistance.", + "ORG_ZSTACK_LICENSE_10003": "The provided timestamp is invalid. Please ensure it adheres to the ISO 8601 standard (YYYY-MM-DDTHH:mm:ss).", + "ORG_ZSTACK_LICENSE_10004": "Unexpected decoded license file length: %d. Expected a valid length for cloud computing services.", + "ORG_ZSTACK_LICENSE_10005": "Decode fail because %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10010": "no available physical server chassis found in baremetal2 clusters[uuids:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_10012": "networkServices must not be empty", + "ORG_ZSTACK_NETWORK_SERVICE_10011": "There are insufficient IP addresses for allocation when attaching the DHCP service to L3 network [uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_10014": "unable to find NetworkService Dhcp Backend [provider type: %s]", + "ORG_ZSTACK_NETWORK_OVN_10062": "failed to ping OVN controller[uuid:%s, ip:%s], due to %s", + "ORG_ZSTACK_NETWORK_OVN_10061": "Cannot send command to OVN controller[uuid:%s, ip:%s], NfvInstanceGroup[uuid:%s, name:%s] status is %s, only Healthy or Degraded groups can accept commands", + "ORG_ZSTACK_NETWORK_OVN_10060": "ovn controller[uuid:%s] is not connected, current status: %s", + "ORG_ZSTACK_NETWORK_OVN_10067": "IP [%s] is not a valid Virtual IP in the current environment. Please use the Virtual IP address of an NFV Instance Group.", + "ORG_ZSTACK_NETWORK_OVN_10066": "cannot find virtual machine [uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10064": "cannot find virtual machine network interface [internalName:%s]", + "ORG_ZSTACK_NETWORK_OVN_10069": "ping SDN controller failed, error: %s", + "ORG_ZSTACK_NETWORK_OVN_10068": "IP [%s] is not associated with any OVN SDN Controller NFV Instance Group. Please use the VIP address of an OVN Controller NFV Instance Group.", + "ORG_ZSTACK_CORE_10000": "no executor found for resource UUID[%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10016": "bond name %s already exists", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10018": "cannot find the baremetal2 chassis with UUID [%s], possibly it does not exist", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10017": "nic with MAC address has been bonded", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10000": "Failed to validate universal SMS with supplier[%s]", + "ORG_ZSTACK_LICENSE_10037": "MN[uuid:%s]: CloudInstanceNotDefinedException", + "ORG_ZSTACK_LICENSE_10038": "Multiple Management Nodes exist but only licenses for %s are provided.", + "ORG_ZSTACK_LICENSE_10039": "MN HA environment, but only updated license for %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10001": "the CPU architecture of the host [arch:%s] and the cluster [arch:%s] do not match", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10000": "wrong baremetal2 chassis hardware information format: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10003": "wrong baremetal2 chassis NIC hardware information format: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10002": "only baremetal2 chassis with boot mode %s are supported", + "ORG_ZSTACK_NETWORK_OVN_10032": "Failed to configure OVN cluster nodes for NFV Instance [UUID:%s], because %s", + "ORG_ZSTACK_NETWORK_OVN_10031": "No instances found in NfvInstanceGroup[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10038": "Detaching NfvInstance[uuid:%s] failed as instance not found", + "ORG_ZSTACK_NETWORK_OVN_10035": "L2 network [UUID:%s] is not associated with a SDN controller", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10005": "wrong baremetal2 chassis disk hardware information format: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10004": "There must be one and only one provision NIC associated with a BareMetal2 chassis.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10006": "A virtual machine with a duplicate MAC address is detected on another compute node. Please resolve this conflict.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10009": "No available physical server resources found for baremetal2 deployment.%s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10008": "BareMetal2 Chassis[uuid:%s] does not exist or is disabled", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10002": "invalid supplier[%s]", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10001": "Failed to validate universal SMS for cloud service instance %s", + "ORG_ZSTACK_CORE_GC_10001": "cannot trigger a finished garbage collection job[uuid:%s, name:%s]", + "ORG_ZSTACK_LICENSE_10046": "cannot find license[uuid:%s, type:%s] file at specified path %s", + "ORG_ZSTACK_LICENSE_10028": "failed to revoke license for module %s", + "ORG_ZSTACK_LICENSE_10029": "UKey not supported (architecture: %s)", + "ORG_ZSTACK_NETWORK_OVN_10041": "could not attach L3 network to security group because SDN controller [uuid:%s] is not found", + "ORG_ZSTACK_NETWORK_OVN_10040": "Management IP not found for detaching NFVI Instance [UUID:%s]", + "ORG_ZSTACK_NETWORK_OVN_10045": "failed to start Open vSwitch service on host[uuid:%s], error: %s", + "ORG_ZSTACK_NETWORK_OVN_10043": "failed to install ovs package to host[uuid:%s], error: %s", + "ORG_ZSTACK_NETWORK_OVN_10042": "could not attach L3 network to security group because SDN controller [uuid:%s] is not connected [status:%s]", + "ORG_ZSTACK_NETWORK_OVN_10049": "failed to synchronize OVS port on host [UUID:%s] for network interfaces [%s], error: %s", + "ORG_ZSTACK_NETWORK_OVN_10048": "failed to add OVS port to host [UUID:%s] for NICs [%s], error: %s", + "ORG_ZSTACK_NETWORK_OVN_10047": "failed to add OVS port on host [UUID:%s] for NICs [%s], error: %s", + "ORG_ZSTACK_LICENSE_10030": "Local UKey license not found or updated successfully. Please ensure your UKey is properly connected and licensed for cloud computing services.", + "ORG_ZSTACK_LICENSE_10031": "update local virtual machine license: %s", + "ORG_ZSTACK_LICENSE_10032": "No available compute instance to update UKey", + "ORG_ZSTACK_GUESTTOOLS_KVM_10001": "failed to detach guest tools in virtual machine[uuid:%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10000": "failed to retrieve guest tools information from vm[uuid:%s], reason:%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10033": "pci device id[%s] is not a valid integer in tag[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10034": "mdev device specification with UUID [%s] does not exist", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10031": "PCI device ID is missing in tag[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10032": "PCI device ID must be greater than 0 in tag[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10030": "pci device specification [uuid:%s] does not exist, derived from tag [%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10006": "failed to retrieve guest tools status from prometheus: [metric\u003d%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10005": "failed to detach guest tools ISO from VM[UUID:%s], because:%s", + "ORG_ZSTACK_GUESTTOOLS_KVM_10004": "failed to attach guest tools ISO to VM[UUID:%s], because:%s", + "ORG_ZSTACK_GUESTTOOLS_KVM_10003": "failed to download guest tools ISO because no KVM host [uuid:%s] was found", + "ORG_ZSTACK_LICENSE_10048": "License expiration: Your cloud computing environment license has expired. Please contact support to renew your license.", + "ORG_ZSTACK_LICENSE_10049": "not supported: delete license[%s] from hardware key", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10024": "no PCI device specification available for virtual machine[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10025": "PCI device specification [uuid:%s] is not available for virtual machine [uuid:%s].", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10023": "failed to get PCI device specification available for VM[uuid:%s]: %s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10020": "vm instance [uuid:%s, state:%s] needs to be shut down to remove mdev device specification [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10027": "why volume[uuid:%s, installPath:%s] not in directory %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10026": "host[uuid:%s] might mount storage that is different from the Storage Management Policy[uuid:%s], please verify this.", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10024": "hosts[uuid:%s] have the same mount path but are actually mounted to different storage.", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10028": "mdev device specification [uuid:%s] is not available for virtual machine [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10029": "PCI device specification UUID is missing in tag[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10026": "no mdev device specification available for virtual machine[uuid:%s]", + "ORG_ZSTACK_LICENSE_10050": "Hybrid platform license is already in use. Please remove the hybrid platform license and hybrid add-ons license simultaneously using DeleteLicenseAction with Hybrid license UUID[uuid\u003d%s].", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10011": "vm[uuid:%s] does not have pci device specification[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10012": "vm instance [UUID: %s, state: %s] needs to be shut down to remove pci device specification [UUID: %s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10019": "vm[uuid:%s] does not have mdev device specification[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10017": "vm[uuid:%s] already has a mdev device specification [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10018": "vm instance [uuid:%s, state:%s] requires stopping to set mdev device specification", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10015": "vm instance [uuid:%s, state:%s] requires stopping to set pci device specifications", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10009": "cannot find the affinity group [uuid:%s], it may have been deleted or terminated", + "ORG_ZSTACK_COMPUTE_VM_10309": "IP[%s] is not available on the VPC network[uuid:%s] because: %s", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10006": "There are other virtual machines on this host [uuid: %s] belonging to the same affinity group [%s].", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10005": "VM [uuid: %s] has already been assigned to affinity group [uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10307": "the static IP address[%s] format error", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10008": "vm [uuid:%s] does not satisfy the affinity group [uuid:%s]", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10007": "affinityGroup [uuid:%s] failed to reserve host [uuid:%s] for virtualMachine [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10003": "Only one of cluster UUID, host UUID, or VM UUID can be specified at the same time.", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10008": "vm[uuid:%s] already has a PCI device specification[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10006": "VM must be paused to set PCI device specification: uuid\u003d%s, state\u003d%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10007": "Invalid PCI device type: %s, valid types for cloud virtualization environments include: %s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10004": "No enabled compute resource found", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10001": "cannot delete the system tag[%s]. The load balancer plugin depends on it; you can only update it.", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10002": "AffinityGroup [uuid: %s] does not exist", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10002": "nic with UUID %s not found. Please correct your network tag %s of load balancer.", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10001": "VM [uuid: %s] is already associated with affinity group [uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10303": "update vm[%s] priority to [%s] failed because of %s", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10004": "Cannot operate on affinity group [uuid: %s] which is not enabled in the cloud environment", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10000": "cannot find the load balancer[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10302": "VM[uuid:%s] can only attach %s CD-ROM devices", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10003": "Cannot operate on affinity group created by system. Please contact support for assistance.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10005": "invalid balance algorithm[%s], valid algorithms are %s", + "ORG_ZSTACK_COMPUTE_VM_10301": "VM[uuid:%s] already has an ISO[uuid:%s] attached", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10006": "invalid unhealthy threshold[%s], value must be a number", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10003": "invalid load balancer weight[%s], instance ID is not in the range [%d, %d]", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10000": "VM can change its affinity group only in states [%s,%s], but the VM is currently in state [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10004": "invalid balancer weight[%s], value is not a number", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10009": "invalid connection idle timeout[%s], please ensure that %s is a numeric value", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10007": "invalid healthy threshold[%s], please enter a numeric value", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10008": "invalid healthy timeout[%s], please ensure that %s is a numeric value", + "ORG_ZSTACK_TICKET_IAM2_10002": "operation denied because flow collection [uuid:%s] does not belong to project [uuid:%s]", + "ORG_ZSTACK_TICKET_IAM2_10003": "the virtual instance ID [uuid:%s] is not authorized to manage the ticket [uuid:%s, name:%s]", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10004": "Kafka topics cannot be null. Please ensure that the topic name is properly configured.", + "ORG_ZSTACK_TICKET_IAM2_10000": "operation denied due to the deletion of the ticket submitter [uuid:%s]; only deletion of the ticket [uuid:%s, name:%s] is permitted now", + "ORG_ZSTACK_TICKET_IAM2_10001": "The operation is denied because the project [UUID:%s] associated with the ticket has been deleted. The ticket [UUID:%s, name:%s] can only be deleted now.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10001": "Syslog mode cannot be null", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10000": "The index for the cloud instance cannot be null. Please provide a valid index value.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10003": "The format of Loki labels should be key\u003dvalue", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10002": "Loki labels cannot be null. Please ensure that all label values are properly defined.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10018": "vxLAN VTEP address for host [UUID: %s] and network pool [UUID: %s] already exists", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10017": "%s is not a valid IPv4 address", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10016": "ip[%s] l2NetworkUuid[%s] clusterUuid[%s] IP address exists in local VTEP table", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10021": "unable to create VNI range because L2 UUID[%s] is not part of the VXLAN network pool", + "ORG_ZSTACK_ALIYUN_CORE_IDENTITYZONE_10000": "must specify zoneId for private Aliyun VPC networks", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10012": "invalid instance ID[%s], %s is not a valid instance identifier", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10010": "invalid health check interval[%s], value must be a number", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10011": "invalid maximum connection value[%s], please ensure that %s is a numeric value", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10016": "invalid health check target[%s], port[%s] must be a numeric value", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10017": "fail to attach VIP to load balancer because VIP[%s] has no associated IP address", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10014": "invalid health check target[%s], the checking protocol[%s] is invalid, valid protocols are %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10015": "invalid health check target[%s], port[%s] is not within the valid range of [1, 65535]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10018": "fail to attach IPv4 VIP to load balancer because load balancer[%s] already has an IPv4 VIP[%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10009": "failed to realize VXLAN network pool[uuid:%s, type:%s] on KVM host[uuid:%s], because %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10019": "fail to attach IPv6 VIP to load balancer because load balancer[%s] already has an IPv6 VIP[%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10004": "failed to create bridge[%s] for l2Network[uuid:%s, type:%s, vni:%d] on KVM host[uuid:%s], because %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10003": "failed to find VTEP on host[UUID: %s], please re-attach VXLAN pool[UUID: %s] to the cluster.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10002": "Find multiple VTEP IP addresses [%s] for one host [UUID:%s]. Please delete the host and add it again.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10008": "failed to validate cidr[%s] for l2VxlanNetworkPool[uuid:%s, name:%s] on kvm host[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10007": "failed to delete bridge[%s] for l2Network[uuid:%s, type:%s, vni:%s] on KVM host[uuid:%s], due to %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10006": "failed to validate cidr[%s] for l2VxlanNetwork[uuid:%s, name:%s] on kvm host[uuid:%s], %s", + "ORG_ZSTACK_CRYPTO_CCS_10001": "user[uuid\u003d%s] does not exist in the cloud environment", + "ORG_ZSTACK_CRYPTO_CCS_10002": "The certificate UUID is missing and the UKey system tag does not exist. Please ensure that both are properly configured.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10020": "cloud not able to delete vip[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10023": "service provider type mismatch detected. The load balancer [uuid:%s] is provided by the service provider [type:%s], but a new service provider of [type:%s] is being attempted.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10024": "There is a listener with the same port [%s] and the same load balancer [UUID:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10022": "cannot retrieve service provider type for load balancer listener [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10027": "invalid balancer weight for network interface: %s, %d is not within the valid range [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10028": "Could not retrieve candidate vmnic because both load balancer UUID and server group UUID are unspecified. Please ensure these identifiers are correctly specified.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10026": "invalid health checking parameters[%s], the format should be method:URI:status_codes, for example, GET:/index.html:http_2xx", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10029": "Could not retrieve candidate Layer 3 network because both Load Balancer UUID and Server Group UUID are unspecified.", + "ORG_ZSTACK_CRYPTO_CCS_10008": "certificate[uuid\u003d%s] not found in the certificate store", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10030": "could not detach VM NIC from load balancer listener[uuid:%s] because the default server group associated with the listener has been deleted", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10031": "Could not create load balancer because VIP and IPv6 VIP parameters are empty. Please provide valid IP addresses.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10034": "Load balancer VIP [%s] must not be the first or last IP address within a CIDR block associated with a public address pool type.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10035": "cloud failed to create loadbalancer because param vipUuid point to VIP[%s] is not an IPv4 virtual machine interface", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10032": "Could not create load balancer because the L3 network of the VIP and IPv6 VIP are not the same L3 network. Please ensure they are in the same L3 network.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10033": "The VIP [UUID:%s] has been occupied by another network service entity [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10038": "operation failure, duplicate/overlap IP entry in %s of access control list group:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10039": "operation failure, IP format only supports ip/iprange/cidr, but found %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10036": "cloud failed to create a load balancer because the parameter ipv6VipUuid points to VIP [%s], which is not an IPv6 VIP", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10037": "operation failure, not support the IP version %d", + "ORG_ZSTACK_VPC_HA_10001": "Could not update this network service due to VPC [UUID:%s] not supporting updates to the network service version.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10025": "L2Network[uuid:%s] is not of L2VxlanNetwork type", + "ORG_ZSTACK_VPC_HA_10002": "Could not update this network service due to VPC [UUID:%s] using an outdated kernel version:[%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10024": "vlan[%s] is not a valid VNI", + "ORG_ZSTACK_VPC_HA_10003": "Could not apply source network address translation with a non-default public network due to the multi-SNAT feature being disabled.", + "ORG_ZSTACK_VPC_HA_10004": "Could not apply SNAT with this L3 Network due to L3 network [uuid:%s] being a private network.", + "ORG_ZSTACK_VPC_HA_10005": "Could not apply SNAT with this L3 Network due to L3 network [uuid:%s] not being attached to a VPC router", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10029": "wrong CIDR format in system tag [%s]", + "ORG_ZSTACK_VPC_HA_10006": "invalid cloud monitor IP address [%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10028": "wrong system tag [%s], should be one of the following: [EC2, GCE, AWS_VPC]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10027": "Please input one system tag like: [%s]", + "ORG_ZSTACK_VPC_HA_10008": "vpcHaRouter [uuid:%s] has been deleted", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10042": "Cannot attach the security group [%s] with a different IP version to LoadBalancer [%s].", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10031": "vXLAN network pool does not support creating L3 networks.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10040": "ip range [%s, %s] overlaps with start IP: %s and end IP: %s of access control list group: %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10030": "overlap VNI range with %s [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10045": "redirect access-control-list groups[uuid:%s] can only be associated with a load balancer listener and must be assigned to a server group.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10046": "access-control-list groups[uuid:%s] attachment to load balancer listener[uuid:%s] must be either HTTPS or HTTP", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10043": "domain[%s], url[%s] duplicate/overlap redirect rule with access control list group:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10044": "access-control-list groups[uuid:%s] are configured to redirect, but some access-control-list entries lack a redirect rule and contain IP entries.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10049": "access-control-list groups[uuid:%s] has been attached to another load balancer listener[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10048": "access-control-list groups[uuid:%s] does not contain a redirect rule", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10001": "The account does not have any assigned VIPs.", + "ORG_ZSTACK_COMPUTE_VM_10239": "CreateVmInstanceMsg cannot be null. Please ensure that the request message is properly initialized before submitting the request.", + "ORG_ZSTACK_COMPUTE_VM_10237": "zoneUuid must be specified as the image is located on multiple backup storages.", + "ORG_ZSTACK_COMPUTE_VM_10236": "no Layer2 Networks found in clusters that have attached to primary storages[uuids:%s]", + "ORG_ZSTACK_COMPUTE_VM_10235": "The primary storages with UUIDs:%s have not attached any cluster in the zone with UUID:%s.", + "ORG_ZSTACK_COMPUTE_VM_10234": "no primary storage accessible to the backup storage[uuid:%s, type:%s] is found", + "ORG_ZSTACK_COMPUTE_VM_10233": "The image with UUID [uuid:%s] is not stored on any backup storage that has been attached to the zone with UUID [uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_10232": "Spice TLS certificate does not exist. Please verify if Spice TLS is enabled.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10002": "cannot create virtual router instance because the virtual router network overlaps with a private network in IP configuration.%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10001": "failed to delete Virtual Router Bootstrap ISO[%s] on KVM host[uuid:%s] for virtual router[uuid:%s], because %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10000": "failed to create Virtual Router Bootstrap ISO[%s] on KVM host[uuid:%s, ip:%s] for virtual router[uuid:%s], because %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10005": "the network of the virtual router instance with UUID:%s cannot be the same as the private L3 network UUID:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10004": "No virtual router instance offering with UUID:%s is found", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10009": "cannot add IP range because L3 network [UUID:%s] is a management network of the virtual router", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10008": "cannot add IP range because L3 network [UUID:%s] is a management network of a virtual router offering", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10007": "Failed to start virtual router L3 [UUID: %s]", + "ORG_ZSTACK_COMPUTE_VM_10242": "handle ssh key pair failure when creating vm because [%s]", + "ORG_ZSTACK_COMPUTE_VM_10241": "handle system tag failure when creating VM because [%s]", + "ORG_ZSTACK_COMPUTE_VM_10240": "instantiate system tag for virtual machine failed because %s", + "ORG_ZSTACK_COMPUTE_VM_10249": "cpuCores must be a valid integer value", + "ORG_ZSTACK_COMPUTE_VM_10248": "cpuSockets must be a positive integer representing the number of CPU sockets.", + "ORG_ZSTACK_COMPUTE_VM_10247": "invalid boot device[%s] in boot order list[%s]", + "ORG_ZSTACK_COMPUTE_VM_10246": "conflict detected for hostname in system tags; another VM with UUID %s already has the hostname %s on L3 network UUID %s", + "ORG_ZSTACK_COMPUTE_VM_10245": "only one hostname system tag is allowed, but %s received", + "ORG_ZSTACK_COMPUTE_VM_10244": "hostname[%s] specified in system tag is not a valid domain name", + "ORG_ZSTACK_COMPUTE_VM_10243": "Unable to enable this function. The virtual machine [uuid: %s] has multiple network interface cards (NICs) associated with the L3 network [uuid: %s].", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10013": "update virtual router [uuid:%s] default network failed because %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10012": "failed to attach virtual router network services to l3Network[uuid:%s]. Port forwarding selection requires_snat_configuration.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10011": "failed to attach virtual router network services to l3Network[uuid:%s]. When Elastic IP (EIP) is selected, Source Network Address Translation (SNAT) must also be configured.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10010": "couldn\u0027t add image because system tag [%s] includes invalid appliance image type [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10017": "the virtual router [name:%s, uuid:%s, current state:%s] is not operational and cannot perform the required operation. Please retry once it is running.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10015": "failed to synchronize VIPs [ips: %s] on virtual router [uuid:%s] for virtual router hot migration because %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10014": "invalid VirtualMachineType %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10000": "could not change resource owner because the virtual machine instance [uuid:%s] has already been associated with a security group", + "ORG_ZSTACK_TEST_COMPUTE_HOSTALLOCATOR_10000": "On purpose: This action is intentional and aligns with the design of our cloud computing architecture. Please ensure that all virtual machine configurations comply with our security and performance standards.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10019": "virtual router[uuid:%s] lacks a management NIC capable of making an HTTP call to %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10018": "virtual router [uuid: %s] is in an status of %s that cannot make HTTP calls to %s", + "ORG_ZSTACK_COMPUTE_VM_10253": "only one bootMode system tag is allowed, but %d tags were found", + "ORG_ZSTACK_COMPUTE_VM_10252": "A virtual machine should have at most one user data system tag.", + "ORG_ZSTACK_COMPUTE_VM_10251": "Already have one user-defined system tag for VM[uuid: %s].", + "ORG_ZSTACK_COMPUTE_VM_10250": "cpuThreads must be an integer value", + "ORG_ZSTACK_COMPUTE_VM_10259": "invalid USB redirection[%s], %s is not a valid USBRedirect tag", + "ORG_ZSTACK_COMPUTE_VM_10258": "invalid parameter[%s], value [%s] is not of boolean type", + "ORG_ZSTACK_COMPUTE_VM_10257": "invalid format tag[%s]", + "ORG_ZSTACK_COMPUTE_VM_10256": "vm machine type requires [q35, pcie, virtual], but got [%s]", + "ORG_ZSTACK_COMPUTE_VM_10254": "[%s] specified in system tag [%s] is not a valid boot mode for cloud instance provisioning.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10020": "unable to add network interface [ip:%s, ip6:%s, mac:%s] to virtual router for virtual machine [uuid:%s ip:%s], because %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10024": "could not set the default network because L3 UUID[:%s] refers to a management network", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10023": "l3 UUID [%s] is not associated with virtual router [UUID:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10022": "l3 uuid[:%s] is the same as the default network of virtual router [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10021": "could not add server IP to load balancer server group because the shared load balancer has no service provider. Please ensure a virtual network interface (VMNIC) is added first.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10010": "Failed to create VIP as the virtual network version could not be determined. Please check your network configuration settings.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10012": "service provider of the VIP[UUID:%s, name:%s, IP:%s] has been set to %s", + "ORG_ZSTACK_TICKET_EXECUTOR_10001": "failed to retrieve value from event: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10025": "could not set the default network because l3 UUID[:%s] is not a public network", + "ORG_ZSTACK_TICKET_EXECUTOR_10000": "No API class [name:%s] is found in the specified namespace. Please ensure the class name and namespace are correct.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10016": "could not set VM NIC security group because the VM NIC [uuid:%s] is not attached to any security group", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10015": "could not set VM NIC security group because VM NIC [UUID:%s] not found", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10007": "requiredIp[%s] is not a valid IPv4 address", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10018": "could not set VM NIC security group because of an invalid priority; priority[%d] must be greater than or equal to 1", + "ORG_ZSTACK_COMPUTE_10003": "outbound bandwidth[%d] of virtual machine network interface is out of the valid range [8192, 32212254720]", + "ORG_ZSTACK_COMPUTE_VM_10264": "vm[uuid:%s, name:%s] has been terminated", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10017": "could not set VM NIC security group because security group[uuid:%s] not found", + "ORG_ZSTACK_COMPUTE_10004": "inbound bandwidth of VM NIC exceeds the valid range [8192, 32212254720]", + "ORG_ZSTACK_COMPUTE_VM_10263": "The resource[uuid:%s] is a root volume, and you cannot change its owner directly. Instead, change the owner of the virtual machine to which the root volume belongs.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10009": "required IP address [%s] is already allocated", + "ORG_ZSTACK_COMPUTE_10001": "VM NIC l3NetworkUuid cannot be null", + "ORG_ZSTACK_COMPUTE_VM_10262": "rootDiskOfferingUuid cannot be null when creating a VM without an image.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10008": "There is already a VIP[%s] associated with L3 Network[UUID:%s].", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10019": "could not set VM NIC security group because of duplicate priority; both security groups %s and %s have priority %d", + "ORG_ZSTACK_COMPUTE_10002": "l3NetworkUuid of VM NIC is not in l3[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10003": "could delete ip, because ip[uuid:%s] is a virtual IP", + "ORG_ZSTACK_COMPUTE_VM_10260": "invalid usbRedirect[%s], %s is not a boolean type", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10002": "VIP status cannot be accessed by this account. Please check your account permissions and try again.", + "ORG_ZSTACK_COMPUTE_10000": "Duplicate network interface parameters detected. Please ensure each network interface has unique parameters.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10005": "unsupported IP allocation strategy[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10004": "System VIP cannot be deleted via API. Please contact support for assistance.", + "ORG_ZSTACK_COMPUTE_VM_10269": "the VM[UUID:%s] has no NIC attached to the L3 network[UUID:%s]", + "ORG_ZSTACK_COMPUTE_10007": "vm network driver %s is not yet supported", + "ORG_ZSTACK_COMPUTE_VM_10268": "got an unrecognized state of the VM[uuid:%s] on the host[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10267": "failed to check the state of VM [uuid:%s] on host [uuid:%s], %s", + "ORG_ZSTACK_COMPUTE_10005": "multi-queue number [%d] of VM network interface is out of the valid range [1, 256]", + "ORG_ZSTACK_COMPUTE_10006": "vm nic of l3[uuid:%s] state[%s] is not in the expected state or %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10031": "cannot create virtual router offering because management network does not support IPv6 yet", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10030": "management network [uuid:%s] is not in the same availability zone [uuid:%s] as this offering is intended to create.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10035": "The L3 network [UUID: %s] has SNAT service enabled; therefore, it cannot be utilized as a management network.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10034": "image[uuid:%s] is of unsupported format %s, cannot be used for virtual router configuration", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10033": "image[uuid:%s]\u0027s media type is %s, which does not comply with the requirement for a virtual router image, whose media type must be %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10032": "public network with UUID %s is not in the same availability zone as this offering is intended to create.", + "ORG_ZSTACK_STORAGE_VOLUME_10087": "The image with UUID [uuid:%s] and name [name:%s] has been deleted from all backup storage.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10039": "the management network [UUID:%s, gateway:%s] is unreachable", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10038": "the management network[uuid:%s] does not have any IP range configured", + "ORG_ZSTACK_STORAGE_VOLUME_10086": "primaryStorage type [%s] does not yet support shared volumes", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10037": "The L3 network with UUID [uuid: %s] has the same network address as [uuid: %s] and cannot be used for the virtual router.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10036": "The L3 network [UUID: %s] has enabled SNAT services and cannot be used as a public network.", + "ORG_ZSTACK_STORAGE_VOLUME_10088": "cannot find a backup storage that satisfies the following conditions for the image[uuid:%s]: 1. state is Enabled 2. status is Connected 3. is attached to the zone where the primary storage[uuid:%s] resides.", + "ORG_ZSTACK_STORAGE_VOLUME_10083": "duplicate volume UUIDs: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10082": "Cannot undo to a non-latest snapshot", + "ORG_ZSTACK_STORAGE_VOLUME_10085": "get primary storage type failed", + "ORG_ZSTACK_STORAGE_VOLUME_10092": "The target volume was expunged during volume creation.%s", + "ORG_ZSTACK_STORAGE_VOLUME_10091": "primary storage UUID conflict, the primary storage specified by the disk offering is %s, and the primary storage specified in the creation parameter is %s", + "ORG_ZSTACK_STORAGE_VOLUME_10093": "there should not be more than one %s virtual machine implementation.", + "ORG_ZSTACK_STORAGE_VOLUME_10096": "unable to download ISO to primary storage because: %s", + "ORG_ZSTACK_ZDFS_10000": "ping to zDFS failed, %s", + "ORG_ZSTACK_COMPUTE_VM_10204": "invalid JSON format, causes: %s", + "ORG_ZSTACK_COMPUTE_VM_10203": "l3NetworkUuids and vmNicInventories must not both be empty or both be set simultaneously.", + "ORG_ZSTACK_COMPUTE_VM_10200": "volume[uuid:%s] could not meet the requirements [state:Enabled status:Ready]", + "ORG_ZSTACK_COMPUTE_VM_10219": "This API has been deprecated and is no longer supported in cloud computing environments. Please consider using the latest available API for your operations.", + "ORG_ZSTACK_COMPUTE_VM_10218": "Cannot update the console password for VM[uuid:%s] as no console password is currently configured.", + "ORG_ZSTACK_ZDFS_10002": "there has been a ZDFS issue with hostname[%s]", + "ORG_ZSTACK_ZDFS_10001": "connect to zDFS failed, %s", + "ORG_ZSTACK_COMPUTE_VM_10217": "Cannot update console password for VM[uuid:%s] as it is not in the \u0027Running\u0027 state. Current state is \u0027%s\u0027.", + "ORG_ZSTACK_COMPUTE_VM_10216": "The console password must not start with \"password\" to avoid potential VNC security vulnerabilities.", + "ORG_ZSTACK_COMPUTE_VM_10215": "Do not allow mounting the same ISO file multiple times", + "ORG_ZSTACK_COMPUTE_VM_10214": "The virtual machine with UUID [uuid\u003d%s] does not exist", + "ORG_ZSTACK_COMPUTE_VM_10220": "TheCdRom[%s]IsAlreadytheDefault", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10002": "The hostname for your cloud instance cannot be null. Please provide a valid hostname.", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10000": "facilityId cannot be null", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10001": "invalid logging facility %s", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10006": "syslog server[address: %s] is unavailable", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10007": "syslog server[address: %s:%s] is unavailable", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10004": "The protocol cannot be null. Please ensure a valid protocol is provided.", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10005": "unsupported protocol %s in cloud computing environment", + "ORG_ZSTACK_COMPUTE_VM_10228": "Expected unicast MAC address, found multicast MAC address [%s]", + "ORG_ZSTACK_COMPUTE_VM_10227": "Disallowed network address %s for instance %d", + "ORG_ZSTACK_COMPUTE_VM_10226": "Invalid MAC address [%s]", + "ORG_ZSTACK_COMPUTE_VM_10225": "This is not a valid MAC address [%s]", + "ORG_ZSTACK_COMPUTE_VM_10224": "CPU topology is incorrect. Actual CPU cores: %s, configured sockets: %s, cores per socket: %s, threads per core: %s; Calculated sockets: %s, cores: %s, threads: %s", + "ORG_ZSTACK_COMPUTE_VM_10221": "vm[uuid:%s] can only perform fstrim when its state is Running; current state is %s", + "ORG_ZSTACK_STORAGE_VOLUME_10046": "The volume with UUID [%s] is not in a deleted state. This operation is intended to recover a previously deleted data volume.", + "ORG_ZSTACK_STORAGE_VOLUME_10049": "image[uuid:%s] is not Enabled, it is %s", + "ORG_ZSTACK_STORAGE_VOLUME_10048": "image[uuid:%s] is not of the expected type, it\u0027s of type %s", + "ORG_ZSTACK_STORAGE_VOLUME_10042": "volume[uuid:%s] is not in the enabled state, current state is %s, snapshot creation is not possible", + "ORG_ZSTACK_STORAGE_VOLUME_10045": "volume[uuid:%s] is not available for snapshot creation, current status is %s", + "ORG_ZSTACK_STORAGE_VOLUME_10044": "Cannot take memory snapshot, VM current state[%s], but expected states are [%s, %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10041": "volume[uuid:%s, type:%s], unable to create snapshot", + "ORG_ZSTACK_LOGIN_10022": "Invalid attribute. Attribute[%s] is required, but found some records [%s] not matching. Please ensure all attributes are correctly specified and matched.", + "ORG_ZSTACK_LOGIN_10024": "strategy is a mandatory field %", + "ORG_ZSTACK_LOGIN_10023": "Invalid JSON format for cloud configuration data. Please ensure all JSON fields are correctly formatted and adhere to the specified schema.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10007": "keyLabel %s and encryptedResult %s are inconsistent", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10006": "flkSec securityMachine unhealthy: %s", + "ORG_ZSTACK_LOGIN_10029": "name should use values within the specified parameter range %s", + "ORG_ZSTACK_LOGIN_10026": "attribute is mandatory for cloud resource provisioning %", + "ORG_ZSTACK_LOGIN_10025": "name is a mandatory field %", + "ORG_ZSTACK_LOGIN_10028": "optional is a mandatory field for virtual machine configuration%", + "ORG_ZSTACK_LOGIN_10027": "type is mandatory field %", + "ORG_ZSTACK_STORAGE_VOLUME_10058": "The root volume [uuid:%s, name:%s] cannot be attached.", + "ORG_ZSTACK_STORAGE_VOLUME_10057": "the VM [UUID:%s] does not support online attachment of volume [%s] because its image platform type is incompatible.", + "ORG_ZSTACK_STORAGE_VOLUME_10059": "data volume [UUID:%s] is disabled; attachment is not permitted.", + "ORG_ZSTACK_STORAGE_VOLUME_10054": "data volume [UUID:%s] is not attached to any virtual machine and therefore cannot be detached.", + "ORG_ZSTACK_STORAGE_VOLUME_10053": "volume[uuid:%s] is in status[%s], data volume can only be attached when status is available or attaching", + "ORG_ZSTACK_STORAGE_VOLUME_10056": "the volume[uuid:%s, name:%s, type:%s] cannot be detached", + "ORG_ZSTACK_CORE_PLUGIN_10001": "plugin[%s] name, product key, and vendor cannot be null", + "ORG_ZSTACK_STORAGE_VOLUME_10055": "To detach a shareable data volume with UUID [%s], the UUID of the virtual machine is required.", + "ORG_ZSTACK_STORAGE_VOLUME_10050": "image[uuid:%s] is not Ready, it\u0027s in %s state", + "ORG_ZSTACK_STORAGE_VOLUME_10052": "volume[uuid:%s] is in state[%s], a data volume can only be attached when its state is %s", + "ORG_ZSTACK_STORAGE_VOLUME_10051": "root volume [uuid:%s] cannot be attached to a virtual machine", + "ORG_ZSTACK_LOGIN_10011": "Failed to validate DNS entry [%s], possibly it has been deleted", + "ORG_ZSTACK_CORE_PLUGIN_10000": "unknown plugin name for cloud product: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10069": "volume[uuid:%s, type:%s] cannot be deleted", + "ORG_ZSTACK_STORAGE_VOLUME_10068": "Unexpected disk size settings for virtual machine %s. Please ensure the specified disk size is within the allowed range and compatible with your cloud environment configuration.", + "ORG_ZSTACK_STORAGE_VOLUME_10065": "Cannot attach volume to VM, no available compute cluster", + "ORG_ZSTACK_STORAGE_VOLUME_10064": "data volume with UUID [%s] has a format [%s] that can only be attached to a hypervisor of type [%s], but the VM has a hypervisor type of [%s]. Therefore, attachment is not possible.", + "ORG_ZSTACK_RESOURCECONFIG_10009": "account has no access to the resource[uuid: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10067": "It\u0027s not allowed to backup the root volume, uuid:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10066": "Cannot attach volume to VM running on host[uuid: %s] that is disconnected from the volume\u0027s storage[uuid: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10061": "data volume [UUID:%s] has been attached to another virtual machine and cannot be re-attached.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_10000": "attribute[name:%s] is a reserved attribute that cannot be updated in cloud computing environments.", + "ORG_ZSTACK_NETWORK_OVN_10074": "OVN SDN Controller [UUID: %s, Name: %s] is in Disconnected state; unable to add host [UUID: %s].", + "ORG_ZSTACK_STORAGE_VOLUME_10060": "The volume with UUID [%s] is in a deleted state; therefore, the operation cannot be performed.", + "ORG_ZSTACK_NETWORK_OVN_10073": "failed to add logical switch[uuid:%s, name:%s] to OVN controller[uuid:%s, ip:%s], because %s", + "ORG_ZSTACK_STORAGE_VOLUME_10063": "data volume with UUID [%s] of format [%s] is not supported for attachment to any hypervisor.", + "ORG_ZSTACK_STORAGE_VOLUME_10062": "data volume can only be attached when the status is [active, available], current status is %s", + "ORG_ZSTACK_NETWORK_OVN_10071": "failed to sync logical switch to OVS controller[uuid:%s, ip:%s], due to %s", + "ORG_ZSTACK_LOGIN_10000": "ZStack is currently loading LDAP organizations from the database; please do not execute synchronization operations at this time.", + "ORG_ZSTACK_NETWORK_OVN_10078": "NfvInstance[uuid:%s] not found", + "ORG_ZSTACK_NETWORK_OVN_10077": "L2 network [UUID:%s] is not attached to OVN controller", + "ORG_ZSTACK_NETWORK_OVN_10076": "failed to delete logical switch port from OVS controller[uuid:%s, ip:%s], because %s", + "ORG_ZSTACK_STORAGE_VOLUME_10070": "volume[uuid:%s] is already in the deleted state", + "ORG_ZSTACK_LOGIN_10001": "Failed to sync LDAP entry[], because %s", + "ORG_ZSTACK_NETWORK_OVN_10075": "failed to add logical switch ports to OVN controller[uuid:%s, ip:%s], because %s", + "ORG_ZSTACK_V2V_10037": "host[uuid:%s] is not connected", + "ORG_ZSTACK_V2V_10038": "primaryStorage[uuid%s] is not connected", + "ORG_ZSTACK_V2V_10035": "cannot allocate %d bytes on the conversion host[uuid:%s], it\u0027s short of available capacity", + "ORG_ZSTACK_NETWORK_OVN_10079": "NfvInstanceGroup[uuid:%s] not found", + "ORG_ZSTACK_LOGIN_10008": "Failed to validate UID[%s], possibly due to deletion or expiration", + "ORG_ZSTACK_LOGIN_10007": "Cannot sync LDAP/AD server whose scope is not %s", + "ORG_ZSTACK_V2V_10031": "Invalid QoS System Tag for V2V Migration Please check the system tag and ensure it complies with the cloud computing standards.", + "ORG_ZSTACK_V2V_10032": "invalid network bandwidth[%s], it must be greater than or equal to 1048576 bytes per second", + "ORG_ZSTACK_LOGIN_10009": "Failed to create IAM virtual ID for UID[%s], because %s", + "ORG_ZSTACK_LOGIN_10004": "failed to synchronize LDAP organization in the cloud environment", + "ORG_ZSTACK_BAREMETAL2_10001": "Invalid IPMI Chassis Configuration: The \u0027reboot\u0027 parameter must be set to \u0027No\u0027 when the \u0027provisionIp\u0027 parameter is provided.", + "ORG_ZSTACK_V2V_10030": "there has been a VM migration from host with hostUuid %s", + "ORG_ZSTACK_BAREMETAL2_10002": "Invalid IPMI Chassis Configuration: The \u0027platform\u0027 must be specified as \u0027Linux\u0027 when \u0027provisionIp\u0027 is provided.", + "ORG_ZSTACK_LOGIN_10006": "Failed to sync organizations because %s", + "ORG_ZSTACK_LOGIN_10005": "Failed to transform LDAP entry to organizational node", + "ORG_ZSTACK_BAREMETAL2_10000": "Invalid IPMI Chassis Configuration: The \u0027provisionType\u0027 must be set to \u0027Direct\u0027 when a \u0027provisionIp\u0027 is specified.", + "ORG_ZSTACK_STORAGE_VOLUME_10079": "cannot detach volume [%s] from instance. it may have been detached already", + "ORG_ZSTACK_STORAGE_VOLUME_10076": "cannot attach volume[%s] to host[%s], as it is currently being attached to host[%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10075": "The mount path must be an absolute path. Please provide a valid absolute path.", + "ORG_ZSTACK_NETWORK_OVN_10080": "NfvInstanceGroup[uuid:%s] has no Virtual IP configured", + "ORG_ZSTACK_STORAGE_VOLUME_10078": "cannot attach volume[%s] to host[%s], as another volume occupies the mount path[%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10077": "cannot attach volume [%s] to host [%s] as it is already mounted on path [%s] on host [%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10072": "It is not allowed to change the state of the root volume, UUID: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10071": "cannot delete volume [%s] as it is attached to host [%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10074": "cannot attach volume[%s] to instance[%s], because instance[status:%s] is not operational", + "ORG_ZSTACK_NETWORK_OVN_10083": "Failed to update OVN cluster nodes for NFV Instance [uuid:%s], because %s", + "ORG_ZSTACK_STORAGE_VOLUME_10073": "cannot change volume state because it is attached to host %s", + "ORG_ZSTACK_NETWORK_OVN_10082": "No instances found for cluster configuration in NfvInstanceGroup[uuid:%s]", + "ORG_ZSTACK_RESOURCECONFIG_10002": "ResourceConfig [category:%s, name:%s] cannot be associated with resourceType: %s", + "ORG_ZSTACK_RESOURCECONFIG_10001": "cannot find resource[uuid: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10081": "cannot find the source file in the used snapshot tree of volume[uuid: %s]", + "ORG_ZSTACK_V2V_10028": "cannot find type for source VM [url:%s]", + "ORG_ZSTACK_RESOURCECONFIG_10000": "resources have inconsistent resource types. Details: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10080": "cannot flatten a shareable volume[uuid:%s]", + "ORG_ZSTACK_V2V_10029": "cannot find factory for source VM [url:%s, v2vType:%s]", + "ORG_ZSTACK_RESOURCECONFIG_10007": "global configuration [category:%s, name:%s] cannot bind to resource", + "ORG_ZSTACK_V2V_10026": "Unable to find Network[uuid:%s] to start the current VM, it may have been deleted. Operation Suggestion: Terminate this VM and create a new one.", + "ORG_ZSTACK_RESOURCECONFIG_10006": "no global configuration[category:%s, name:%s] found", + "ORG_ZSTACK_V2V_10024": "not the time for instance shutdown", + "ORG_ZSTACK_V2V_10025": "conversionHost[uuid:%s, hostUuid:%s] is not connected", + "ORG_ZSTACK_V2V_10022": "There are some v2v jobs in progress. Cannot detach volume[%s] from host[%s].", + "ORG_ZSTACK_V2V_10020": "primary storage[uuid:%s] is neither active nor attached", + "ORG_ZSTACK_V2V_10021": "There are ongoing V2V migration jobs. Please ensure that no volume[%s] is attached to host[%s].", + "ORG_ZSTACK_STORAGE_VOLUME_10007": "iothread requires QEMU version \u003e\u003d %s, but the host is running version %s.", + "ORG_ZSTACK_STORAGE_VOLUME_10009": "root volume [%s] cannot set I/O thread pin.", + "ORG_ZSTACK_STORAGE_VOLUME_10008": "iothread requires a libvirt version of at least %s, but the host has version %s.", + "ORG_ZSTACK_STORAGE_VOLUME_10003": "The current primary storage %s is not of Ceph type and therefore cannot be accessed.", + "ORG_ZSTACK_STORAGE_VOLUME_10005": "current primary storage type does not support block volume. Supported types include %s.", + "ORG_ZSTACK_STORAGE_VOLUME_10004": "Ceph type block volume access path ID and IQN cannot be null. Please ensure that both accessPathId and accessPathIqn are provided.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10000": "JitClientFactory connection test failed", + "ORG_ZSTACK_SSO_CAS_FILTER_10000": "URL invalid, client UUID missing", + "ORG_ZSTACK_SSO_CAS_FILTER_10001": "missing CAS client instance, please instantiate CAS client before SSO integration", + "ORG_ZSTACK_COMPUTE_VM_10275": "VM[uuid:%s] is not in a Running state.", + "ORG_ZSTACK_CONSOLE_10011": "The console agent is not connected; this is likely due to the management node initialization. Please wait for the console agent to connect, or manually reconnect it if it has been disconnected for an extended period.", + "ORG_ZSTACK_CONSOLE_10010": "vm[uuid:%s] is not in the state of %s, current state is %s", + "ORG_ZSTACK_COMPUTE_VM_10273": "failed to create template from root volume[uuid:%s] on primary storage[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10270": "The virtual machine has been deleted. Please check your instance management console for details.", + "ORG_ZSTACK_CONSOLE_10013": "console proxy[uuid: %s, status: %s] on agent[ip: %s] is not connected, fail to delete it", + "ORG_ZSTACK_CONSOLE_10012": "cannot find host IP of the VM[uuid:%s], is the VM running???", + "ORG_ZSTACK_COMPUTE_VM_10279": "Failed to update VM[uuid\u003d%s] on hypervisor: The modification of certain properties failed", + "ORG_ZSTACK_COMPUTE_VM_10278": "Failed to update vm[uuid\u003d%s] on hypervisor.", + "ORG_ZSTACK_COMPUTE_VM_10277": "The ISO with UUID [uuid:%s] is located on a backup storage that is not compatible with the primary storage [uuid:%s] where the VM [name:%s, uuid:%s] resides.", + "ORG_ZSTACK_COMPUTE_VM_10276": "cannot update console password of VM[uuid:%s], the VM is not running on any host", + "ORG_ZSTACK_STORAGE_VOLUME_10018": "Cannot resize volume [%s] as it is in a Disabled state", + "ORG_ZSTACK_STORAGE_VOLUME_10017": "volume[uuid:%s] is not a data volume", + "ORG_ZSTACK_STORAGE_VOLUME_10019": "At least one of vmInstanceUuid or instanceUuid should be specified.", + "ORG_ZSTACK_STORAGE_VOLUME_10014": "not support taking snapshots of volumes[uuid:%s, uuid:%s] on different VMs[uuid:%s, uuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10013": "volume[uuid:%s] cannot be found", + "ORG_ZSTACK_STORAGE_VOLUME_10016": "state of vm[uuid: %s] is %s, snapshot creation is not allowed", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10013": "jit security machine unhealthy: socket connection to %s:%s failed", + "ORG_ZSTACK_STORAGE_VOLUME_10015": "volume[uuid:%s] is not available", + "ORG_ZSTACK_STORAGE_VOLUME_10010": "current I/O thread ID[%s] does not match the attached volume[%s]\u0027s I/O thread ID[%s].", + "ORG_ZSTACK_STORAGE_VOLUME_10012": "snapshot validation is unsupported for volume[uuid: %s]. The attached VM is not in one of the states [%s, %s].", + "ORG_ZSTACK_STORAGE_VOLUME_10011": "snapshot validation is unsupported for volume [UUID: %s]. The volume should be attached to a virtual machine.", + "ORG_ZSTACK_CONSOLE_10000": "Ansible private key file not found. Please ensure the private key file path is correct and accessible.", + "ORG_ZSTACK_COMPUTE_VM_10285": "Failed to detach volume [uuid\u003d%s] from VM [uuid\u003d%s]", + "ORG_ZSTACK_COMPUTE_VM_10284": "Detaching a volume is not allowed when the VM is in state [%s]", + "ORG_ZSTACK_COMPUTE_VM_10283": "ISO[uuid:%s] is not attached to VirtualMachine[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10282": "failed to update vm[uuid\u003d%s] on hypervisor: The modification of certain properties failed", + "ORG_ZSTACK_CONSOLE_10004": "Failed to reconnect to the console proxy for the virtual machine. Please check the network connectivity and ensure the virtual machine is running.", + "ORG_ZSTACK_COMPUTE_VM_10281": "failed to update vm[uuid\u003d%s] on hypervisor node", + "ORG_ZSTACK_CONSOLE_10003": "failed to configure console proxy overridden IP [code:%d] or console proxy port [code:%d]", + "ORG_ZSTACK_COMPUTE_VM_10280": "could not create virtual machine, a virtual machine with the name [%s] already exists", + "ORG_ZSTACK_CONSOLE_10002": "There is another process using the port: %s", + "ORG_ZSTACK_CONSOLE_10001": "invalid management node ID[%s]", + "ORG_ZSTACK_CONSOLE_10008": "unable to verify console proxy availability because %s", + "ORG_ZSTACK_CONSOLE_10007": "establish VNC connection: unexpected URI: %s", + "ORG_ZSTACK_COMPUTE_VM_10288": "One VM cannot create %s CD-ROMs; VM can only attach %s CD-ROMs.", + "ORG_ZSTACK_CONSOLE_10009": "operation error, because:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10029": "Expansion operation not allowed due to host being disabled. Please ensure the host is active before performing this operation.", + "ORG_ZSTACK_STORAGE_VOLUME_10028": "The minimum increment size for memory allocation should be greater than 4 MB.", + "ORG_ZSTACK_STORAGE_VOLUME_10025": "You cannot simultaneously set read/write bandwidth limits and total bandwidth limits for a virtual machine. Please specify one type of limit.", + "ORG_ZSTACK_STORAGE_VOLUME_10024": "You cannot simultaneously configure read/write IOPS limits and total IOPS limits for your instance. Please specify one type of IOPS limit.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10023": "unhandled exception while retrieving attributes with JIT security enabled: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10027": "Cannot shrink [%s] volume[uuid:%s]\u0027s size", + "ORG_ZSTACK_STORAGE_VOLUME_10026": "The volume bandwidth cannot be null; please specify a valid volume bandwidth value.", + "ORG_ZSTACK_STORAGE_VOLUME_10021": "volume[uuid:%s] is not a root volume", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10022": "JIT security machine attribute retrieval failed, status code: %s, details: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10020": "No volume with UUID: %s and VM Instance UUID: %s can be found", + "ORG_ZSTACK_STORAGE_VOLUME_10023": "Cannot configure both legacy and new parameter sets simultaneously in a virtual machine instance.", + "ORG_ZSTACK_STORAGE_VOLUME_10022": "SharedVolume does not support setting bandwidth.", + "ORG_ZSTACK_COMPUTE_VM_10293": "no method to determine image size for %s, please report exception.", + "ORG_ZSTACK_STORAGE_VOLUME_10035": "Only support detached volumes, use SetVmBootVolumeMsg instead.", + "ORG_ZSTACK_ZWATCH_PROMETHEUS_10000": "Host[uuid:%s] not found in the cloud database", + "ORG_ZSTACK_STORAGE_VOLUME_10038": "hypervisor[%s] restricts a single VM to a maximum of %s data volumes; this VM [uuid:%s] has %s data volumes attached.", + "ORG_ZSTACK_STORAGE_VOLUME_10032": "cannot find image cache [Image UUID: %s] for volume reinitialization", + "ORG_ZSTACK_STORAGE_VOLUME_10031": "shared volume[uuid: %s] has been attached to non-stopped vm instances[uuids: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10034": "volume[uuid%s] should be attached to an instance.", + "ORG_ZSTACK_STORAGE_VOLUME_10033": "The volume [UUID: %s, name: %s] is still in use and cannot be expunged. Please ensure the volume is deleted before attempting to expunge it.", + "ORG_ZSTACK_STORAGE_VOLUME_10030": "Expansion operation not allowed due to host disable status", + "ORG_ZSTACK_LOGIN_10033": "There is currently no LDAP/AD server configured in your environment. Please configure an LDAP/AD server first.", + "ORG_ZSTACK_LOGIN_10032": "Cannot bind this LDAP UID %s to virtual user ID [uuid:%s]", + "ORG_ZSTACK_LOGIN_10034": "This UID is already in use. Please choose another one.", + "ORG_ZSTACK_LOGIN_10030": "Invalid attribute. Attribute[%s] is required, but found some records not matched in the virtual machine configuration. Please ensure all attributes are correctly specified and all virtual machine resources are properly configured.", + "ORG_ZSTACK_STORAGE_CDP_10091": "Invalid maximum capacity[%d], current utilization is %d", + "ORG_ZSTACK_STORAGE_CDP_10089": "hostname not found for backup storage[uuid: %s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10009": "the crypto function is enabled but the resource pool[%s] for automatic login is not configured.", + "ORG_ZSTACK_SSO_SAML2_10001": "Identity Provider metadata is invalid Base64 (decoded content is empty).", + "ORG_ZSTACK_SSO_SAML2_10002": "Failed to decode Identity Provider metadata from Base64 encoding", + "ORG_ZSTACK_SSO_SAML2_10000": "IdP metadata is not configured. Please provide valid metadata.", + "ORG_ZSTACK_ZSV_10002": "Detach the sharable volume or LUN device before operating the snapshot group.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10000": "no client for security instance[model\u003d%s]", + "ORG_ZSTACK_ZSV_10001": "volume %s still has snapshot groups, cannot delete it", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10001": "no security machine client factory for security machine[type\u003d%s]", + "ORG_ZSTACK_ZSV_10000": "volume %s still has a snapshot group associated with VM %s; therefore, it cannot be attached to another VM", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10002": "SecurityMachineManagerImpl: SecurityMachineEncrypt failed for instance %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_HTTP_10001": "HTTP template save error, please check the template content: %s", + "ORG_ZSTACK_STORAGE_CDP_10097": "The VM creation job has been cancelled. Please check your parameters and try again.", + "ORG_ZSTACK_STORAGE_CDP_10095": "Revert job cancellation: The operation to revert changes has been cancelled. Please ensure all dependent tasks are completed before attempting to revert again.", + "ORG_ZSTACK_ACCESSKEY_10002": "[Account ID: %s, User ID: %s] is not a valid account or IAM2 project/user", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10019": "failed to establish a connection to the chassis [uuid:%s], please verify the ipmi configuration.", + "ORG_ZSTACK_ACCESSKEY_10001": "If a specified Access Key is expected, both the AccessKeyID and AccessKeySecret must be provided simultaneously.", + "ORG_ZSTACK_ACCESSKEY_10004": "accessKey count for [account ID: %s, user ID: %s] exceeds the maximum limit", + "ORG_ZSTACK_ACCESSKEY_10000": "no permission to perform the operation for [accountUuid:%s, userUuid:%s]", + "ORG_ZSTACK_TEST_10008": "I should not be in the errs list", + "ORG_ZSTACK_TEST_10009": "I should not be listed as an error either.", + "ORG_ZSTACK_TEST_10006": "Cloud deployment complete, as intended.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10020": "fail to load chassis information from file, because: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10029": "Another connection security machine task is running. Please cancel the new task and wait for its completion.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10026": "securityMachine is disabled. Failed to detect heartbeat. Please ensure securityMachine is enabled and properly configured.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10027": "%s instance heartbeat detection failed", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10028": "%s heartbeat detection exception", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10021": "decrypt data[%s] or encryption algorithm type[%s] is null", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10022": "invalid decryption algorithm type: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10024": "The encryption function cannot be disabled because there is at least one synced secure virtual machine in the resource pool that provides the service. Please ensure that the number of synced secure virtual machines is reduced to zero before disabling the encryption function.", + "ORG_ZSTACK_TEST_10004": "I should not be in the error list either due to %d", + "ORG_ZSTACK_TEST_10005": "on purpose %d", + "ORG_ZSTACK_SNS_SYSTEM_10002": "API resource cannot be deleted", + "ORG_ZSTACK_TEST_10003": "I should not be in the error list %d", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10019": "unknown encryption type[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10014": "cannot find model for secret resource pool [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10015": "the current state[%s] does not permit manual state modification", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10016": "Cannot disable all security VMs when cryptographic functions are enabled. Please ensure at least one security VM is active.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10017": "Verify that the resource pool UUID is configured for authentication.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10010": "the crypto function is enabled but the resource pool[%s] for data protection is not configured.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10013": "check model[%s] type[%s] client and server availability exception", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10003": "SSH connection failed to establish. Please check your cloud instance settings and network configurations.", + "ORG_ZSTACK_AI_VM_10006": "cannot find model service instance group with UUID: %s, failed to save model service instance", + "ORG_ZSTACK_AI_VM_10007": "vm instance, config yaml, or service yaml is null for model service deploy context: %s", + "ORG_ZSTACK_AI_VM_10008": "deploy context or virtual machine is null for instance %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10000": "cannot replicate %s to %s, error: %s", + "ORG_ZSTACK_AI_VM_10009": "failed to cancel task, %s", + "ORG_ZSTACK_SNS_SYSTEM_10000": "System alarm topic cannot be deleted due to associated resources. Please ensure all dependent resources have been removed before attempting deletion again.", + "ORG_ZSTACK_AI_VM_10002": "Cannot find VM NIC\u0027s IP in default L3 network [UUID: %s] which is required for distributed model service", + "ORG_ZSTACK_SNS_SYSTEM_10001": "only HTTP endpoint can subscribe API topic; the provided endpoint[type:%s] is not a valid HTTP endpoint", + "ORG_ZSTACK_AI_VM_10003": "ModelServiceSession cannot be null. Please ensure that a valid session is established for cloud model services.", + "ORG_ZSTACK_AI_VM_10004": "cannot parse YAML configuration for model service, service definition: %s", + "ORG_ZSTACK_AI_VM_10000": "cannot find image [uuid: %s]", + "ORG_ZSTACK_AI_VM_10001": "cannot retrieve image UUID from YAML: %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10015": "The network[%s] has been added to the HA group[%s].", + "ORG_ZSTACK_ROUTEPROTOCOL_10014": "The network[%s] has been added to the virtual router area[%s].", + "ORG_ZSTACK_ROUTEPROTOCOL_10017": "Router ID[%s] is not unique within this cloud system", + "ORG_ZSTACK_ROUTEPROTOCOL_10016": "Router ID[%s] does not conform to IPv4 format", + "ORG_ZSTACK_AI_VM_10011": "Cannot retrieve status from instance due to an empty instance URL. Please provide a valid instance URL and try again.", + "ORG_ZSTACK_HYBRID_BACKUP_10000": "%s can only be invoked by an administrative account in a cloud environment.", + "ORG_ZSTACK_EXTERNALSERVICE_CRONJOB_10001": "The cron daemon is not running. Please ensure it is started and configured correctly.", + "ORG_ZSTACK_ROUTEPROTOCOL_10003": "[%s] does not conform to IPv4 address format", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10030": "check-all-security-machine-token-sync failed for all virtual machines in the cloud environment. Please check your security tokens and machine configurations.", + "ORG_ZSTACK_ROUTEPROTOCOL_10008": "AreaId[%s] has been provisioned", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10031": "FlkSecClientFactory connection test failed", + "ORG_ZSTACK_ROUTEPROTOCOL_10009": "KeyID and password must be not null when authentication type is %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10027": "failed to generate data protection token for the security machine %s because %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10029": "failed to obtain encryption results for the security instance %s due to %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10011": "The length of the password must not exceed 8 bytes when the authentication type is %s.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10028": "failed to generate HMAC token for the security machine %s due to %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10010": "password must be non-null when authentication type is %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10013": "All networks should be associated with the virtual router [%s]", + "ORG_ZSTACK_ROUTEPROTOCOL_10012": "AreaId[%s] must be a valid zone identifier", + "ORG_ZSTACK_ALIYUN_IDENTITYZONE_10000": "No identity credential found for the requested resource. Please ensure that you have provided a valid access key and secret key.", + "ORG_ZSTACK_STORAGE_CDP_10005": "BackupStorage[uuid: %s] has already been deleted", + "ORG_ZSTACK_STORAGE_CDP_10001": "kvmagent has no response %d times", + "ORG_ZSTACK_STORAGE_CDP_10004": "No virtual machine found for Cloud Deployment Pipeline task[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10000": "KVM agent has been restarted. Please check if this affects your virtual machines.", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10011": "A hardware VXLAN network can only be created within a hardware VXLAN pool.", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10010": "ONLY hardware VXLAN network can be created within a hardware VXLAN pool.", + "ORG_ZSTACK_STORAGE_CDP_10016": "libvirt on the host [UUID: %s] does not support creating CDP tasks. Please verify the libvirt version.", + "ORG_ZSTACK_HYBRID_DATACENTER_10003": "Data Center [%s] is still undergoing synchronization; please wait.", + "ORG_ZSTACK_STORAGE_CDP_10017": "qemu on the host [UUID: %s] does not support creating CDP tasks. Please verify the qemu version.", + "ORG_ZSTACK_HYBRID_DATACENTER_10002": "not valid region specified in aliyun, which contains: %s", + "ORG_ZSTACK_STORAGE_CDP_10018": "The QEMU version running on the VM[uuid:%s] does not support mirrorBitmap functionality. Please ensure you are using a compatible QEMU version.", + "ORG_ZSTACK_STORAGE_CDP_10012": "query-mirror: Host not found for VM[uuid:%s]", + "ORG_ZSTACK_AI_EVALUATION_10000": "No group with UUID: %s can be found in the database.", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10002": "failed to create vxlan network bridge[%s] for hardware device[uuid:%s, type:%s, vlan:%s] on KVM host[uuid:%s], because %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10001": "there is no SDN Controller Factory for SDN Controller Type:%s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10000": "There is no SDN controller for VXLAN pool [uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10006": "cannot configure VXLAN network for VM with UUID [%s] on destination host with UUID [%s]", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10005": "cannot find SDN controller %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10003": "failed to check bridge[%s] for hardwareVxlan[uuid:%s, name:%s] on KVM host[uuid:%s], %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10009": "hardware VXLAN network pool must configure the physical interface %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10008": "hardware VXLAN network pool does not support creating L3 networks", + "ORG_ZSTACK_HYBRID_DATACENTER_10001": "regionId [%s] has already been created by access key [%s]", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10007": "failed to verify physical network interface for HardwareVxlanPool [uuid: %s, name: %s] on KVM host [uuid: %s], %s", + "ORG_ZSTACK_HYBRID_DATACENTER_10000": "dcType not supported type [%s]", + "ORG_ZSTACK_STORAGE_CDP_10027": "invalid time string: %s, should be formatted according to ISO offset format, e.g., %s", + "ORG_ZSTACK_STORAGE_CDP_10023": "The virtual machine instance is currently executing a Continuous Data Protection (CDP) task. Attaching the volume will exceed the planned size required for full backups. Please adjust the CDP task size and try again.", + "ORG_ZSTACK_STORAGE_CDP_10024": "The VM[%s] for volume[%s] is currently running on Continuous Data Protection (CDP), therefore resizing is not possible at this time.", + "ORG_ZSTACK_STORAGE_CDP_10025": "CDP task[uuid: %s] encountered an abnormal status change, from old status: %s to new status: %s due to %s.", + "ORG_ZSTACK_STORAGE_CDP_10026": "CDP task is still active", + "ORG_ZSTACK_STORAGE_CDP_10022": "failed to find CDP task[uuid:%s]", + "ORG_ZSTACK_AI_EVALUATION_10001": "no matched backend instance of group[uuid: %s, type:%s] exists", + "ORG_ZSTACK_AI_EVALUATION_10002": "Unable to locate Model Service Instance Group VO using the provided model service group UUID. This indicates that the associated service group running evaluation tasks cannot be found. Consequently, tasks remain in an intermediate status instead of being marked as Completed. Tasks will be automatically updated to \u0027Failed\u0027 and the errors will be documented.", + "ORG_ZSTACK_LOGINCONTROL_10002": "Invalid rule expression, failed to add access control rule: %s", + "ORG_ZSTACK_LOGINCONTROL_10005": "unrecognized key: %s", + "ORG_ZSTACK_LOGINCONTROL_10006": "missing key:value for %s resource configuration", + "ORG_ZSTACK_PORTAL_APIMEDIATOR_10008": "resourceUuid[%s] is not a valid UUID. A valid UUID (v4 is recommended) should be formatted without hyphens and match the regex \u0027[0-9a-f]{8}[0-9a-f]{4}[1-5][0-9a-f]{3}[89ab][0-9a-f]{3}[0-9a-f]{12}\u0027. For more information, see http://en.wikipedia.org/wiki/Universally_unique_identifier.", + "ORG_ZSTACK_LOGINCONTROL_10007": "Incorrect format for password strength configuration settings", + "ORG_ZSTACK_LOGINCONTROL_10008": "The minimum value cannot be larger than the maximum value", + "ORG_ZSTACK_STORAGE_CDP_10039": "Backup storage not found[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10034": "Unexpected task type[uuid: %s, type: %s] in cloud computing environment", + "ORG_ZSTACK_STORAGE_CDP_10035": "Max capacity not found for Cloud Data Protection task[uuid: %s], please update it.", + "ORG_ZSTACK_STORAGE_CDP_10036": "Max latency not found for CDPSessionTask[uuid: %s], please update it.", + "ORG_ZSTACK_STORAGE_CDP_10037": "VM[uuid: %s] has already been terminated", + "ORG_ZSTACK_STORAGE_CDP_10031": "VM is not shut down, current state: %s", + "ORG_ZSTACK_STORAGE_CDP_10032": "Shared volume[%s] is still in use by other virtual machines.", + "ORG_ZSTACK_STORAGE_CDP_10033": "Task not found[uuid: %s]", + "ORG_ZSTACK_LOGINCONTROL_10012": "No available user with name: %s, type: %s in the virtual environment", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10011": "The API request specifies an IPMI chassis type, but the received message is not of type APICreateBareMetal2ChassisHardwareInfoMsg. Please ensure the message type matches the specified chassis type.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10012": "received hardware information for unknown baremetal chassis[ipmi_addr:%s, ipmi_port:%d]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10010": "fail to load BareMetal2 IPMI chassis information from file, because: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10015": "failed to power reset baremetal2 IPMI chassis[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10016": "Failed to remotely IPXE boot instance[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10013": "failed to power on baremetal2 IPMI chassis[UUID:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10014": "failed to power off baremetal2 IPMI chassis[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10049": "The VM [UUID: %s] has already initiated a CDP task; therefore, a backup job cannot be created simultaneously.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10008": "Windows Local Disk Bare Metal instances do not support automatic creation of virtual machines.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10009": "no usable baremetal2 gateway available in cluster[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10006": "Cluster[uuid:%s] is not a BareMetal2 virtualization environment.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10007": "Cluster[uuid:%s] is not enabled.", + "ORG_ZSTACK_STORAGE_CDP_10045": "mandatory arguments missing: %s", + "ORG_ZSTACK_STORAGE_CDP_10046": "The retention time per day and daily RP since day cannot be equal. Please ensure they are set to different values.", + "ORG_ZSTACK_STORAGE_CDP_10047": "expected one virtual machine UUID, but given %d", + "ORG_ZSTACK_STORAGE_CDP_10048": "resource [uuid: %s] is not a virtual machine instance", + "ORG_ZSTACK_STORAGE_CDP_10041": "Backup storage [UUID: %s] is not connected to the cloud environment. Please ensure it is properly configured and integrated.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10005": "Cluster[uuid:%s] is not a baremetal cluster configuration.", + "ORG_ZSTACK_STORAGE_CDP_10042": "The VM [UUID: %s] has already created a backup job; therefore, it cannot have a Continuous Data Protection (CDP) task enabled simultaneously.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10007": "IPMI Address and Port already exists.", + "ORG_ZSTACK_STORAGE_CDP_10044": "Virtual resource allocation should be larger than physical resource allocation", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10001": "Please ensure the following to establish a connection to the bare-metal server: 1. Verify that the IPMI interface is active; 2. Confirm that the IPMI address, port, username, and password are accurate; 3. Ensure that IPMI over LAN is enabled in the BIOS settings.", + "ORG_ZSTACK_STORAGE_CDP_10040": "Backup storage[uuid: %s] is disabled in the cloud environment.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10009": "baremetal chassis with UUID: %s is configured to use pxeserver with UUID: %s, but the DHCP request was actually handled by pxeserver with UUID: %s.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10008": "no usable baremetal PXE server attached to cluster[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10000": "Bare Metal IPMI 2 Chassis \u003cplaceholder\u003e%s\u003c/placeholder\u003e has two existing entries", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10001": "IPMI Address %s is invalid", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10004": "Baremetal Chassis with IPMI Address %s and Port %d has already been created.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10005": "Cluster[uuid:%s] does not exist.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10002": "Failed to establish a connection with the baremetal node. Please verify: 1. The IPMI connection is active; 2. The IPMI address, port, username, and password are correct; 3. IPMI over LAN is enabled in BIOS settings.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10003": "BareMetal2 Chassis with IPMI Address %s and Port %d has already been created.", + "ORG_ZSTACK_STORAGE_CDP_10056": "multiple root disks found: %s", + "ORG_ZSTACK_STORAGE_CDP_10058": "No root volume found for the VM backup.%s", + "ORG_ZSTACK_STORAGE_CDP_10059": "volume %s is included in the backup but detached from VM [UUID: %s]. Please either attach it back to the VM or remove it from the backup set.", + "ORG_ZSTACK_STORAGE_CDP_10053": "No Cloud Drive Provisioning task found for VM[uuid: %s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10015": "Failed to remotely power on baremetal chassis[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10054": "CDP task for VM[uuid: %s] is not found on Backstore[uuid: %s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10018": "Failed to remotely PXE boot instance[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10055": "recoverVm: host[uuid: %s] not found for virtualMachine[uuid: %s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10017": "Failed to remotely power reset baremetal chassis[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10050": "cannot request primary storage [uuid:%s] for volume snapshot capability; see details [%s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10014": "failed to delete baremetal chassis %s", + "ORG_ZSTACK_STORAGE_CDP_10051": "recoverVm: The host UUID is not provided and the original host for VM[uuid: %s] cannot be found.", + "ORG_ZSTACK_SSHKEYPAIR_10009": "The SSH key pair [uuid:%s] was not attached to the virtual machine [uuid:%s].", + "ORG_ZSTACK_SSHKEYPAIR_10008": "The SSH key pair [uuid:%s] is already attached to the virtual machine [uuid:].", + "ORG_ZSTACK_SSHKEYPAIR_10007": "The sshKeyPair[uuid:%s] is currently in use.", + "ORG_ZSTACK_STORAGE_CDP_10067": "cannot find root volume from CDP backup %s:%d", + "ORG_ZSTACK_STORAGE_CDP_10068": "root volume not found from CDP backup %s:%d", + "ORG_ZSTACK_SSHKEYPAIR_10011": "resource types %s are not supported for attaching an SSH key pair; allowed types are %s", + "ORG_ZSTACK_SSHKEYPAIR_10010": "The vmInstance[uuid:%s] is not in a running state.", + "ORG_ZSTACK_STORAGE_CDP_10063": "VM Cloud Deployment Process[uuid: %s] not found", + "ORG_ZSTACK_STORAGE_CDP_10064": "VM instance not found for Cloud Deployment Pipeline task[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10065": "No volume records found from virtual machine backup. Please verify the VM configuration and backup settings.", + "ORG_ZSTACK_STORAGE_CDP_10066": "multiple root disks found from CDP backup %s:%d", + "ORG_ZSTACK_V2V_KVM_10003": "missing VM UUID in \u0027srcVmUrl\u0027", + "ORG_ZSTACK_STORAGE_CDP_10060": "unexpected volume[uuid: %s] size mismatch: expected %d bytes, received different size", + "ORG_ZSTACK_V2V_KVM_10004": "No root disk found for instance: %s", + "ORG_ZSTACK_STORAGE_CDP_10061": "resize volume[uuid: %s] failed: %s", + "ORG_ZSTACK_STORAGE_CDP_10062": "volume[uuid: %s] has an unexpected volume path: %s", + "ORG_ZSTACK_V2V_KVM_10007": "failed to clean up KVM V2V conversion host[hostUuid:%s], because %s", + "ORG_ZSTACK_STORAGE_CDP_10078": "cannot find the CDP policy for VM[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10075": "No recovery point found with group ID %d", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10018": "invalid variable: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10075": "the NFS primary storage [uuid:%s, name:%s] cannot find attached host clusters to perform the operation", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10077": "no host found for volume[uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10020": "need a List for resource [%s] output here, but got a single object.", + "ORG_ZSTACK_ZBOX_10007": "zbox[name:%s] is not in a Ready state, current status is %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10025": "Some actions are invalid in the context of cloud resource management. Please verify the parameters and try again.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10022": "resource [%s] must be configured before!", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10006": "the destination host [UUID:%s] does not have sufficient physical capacity for primary storage [UUID:%s], as the threshold is %f while the available physical capacity is %d", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10007": "The volume with UUID [%s] is not in the \u0027Ready\u0027 state; therefore, it cannot be migrated.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10008": "The data volume [UUID: %s, name: %s] is still attached to the virtual machine [UUID: %s]. Please detach it before initiating the migration.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10009": "The volume with UUID %s is the root volume of the VM with UUID %s. Currently, the VM is in the state of %s. Please stop the VM before initiating the migration.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10002": "The volume with UUID [%s] is already attached to the host with UUID [%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10003": "the primary storage [UUID:%s] is not found", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10004": "The primary storage [UUID:%s] is disabled or cold migration during maintenance is not permitted.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10005": "The destination host with UUID [%s] does not belong to the local primary storage with UUID [%s] where the volume with UUID [%s] is located.", + "ORG_ZSTACK_ZBOX_10001": "zbox[UUID:%s] is still in use; unable to eject.", + "ORG_ZSTACK_ZBOX_10002": "zbox[UUID:%s] is not in a Ready state and therefore cannot synchronize capacity.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10000": "No hosts can provide the required storage capacity for all volumes of VM [UUID:%s].", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10004": "Aliyun account [UUID:%s] does not exist", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10001": "The volume with UUID [%s] is not attached to any local primary storage.", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10005": "invalid phone number[%s], please ensure it is formatted as +86-12345678901", + "ORG_ZSTACK_ZBOX_10005": "zbox[UUID: %s] appears to have been deleted", + "ORG_ZSTACK_ZBOX_10006": "USB device [uuid:%s] has been attached to VM [uuid:%s], it cannot be added to Zbox.", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10000": "Aliyun SMS event text template not found. Please ensure the template has been correctly configured and try again.", + "ORG_ZSTACK_ZBOX_10003": "only file within the mounted path [mountPath: %s] on zbox can be deleted. but [%s] was passed.", + "ORG_ZSTACK_ZBOX_10004": "zbox[name:%s] is not in a Ready state, current state is %s", + "ORG_ZSTACK_SSHKEYPAIR_10006": "The SSH key pair %s has already been uploaded.", + "ORG_ZSTACK_SSHKEYPAIR_10005": "operation error, because: %s", + "ORG_ZSTACK_SSHKEYPAIR_10003": "ssh key pair [uuid:%s] cannot be associated with vm [uuid:%s] due to the key not being found", + "ORG_ZSTACK_SSHKEYPAIR_10002": "failed to load the public key: %s, err: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10043": "InfoSecClientFactory connection test failed", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10044": "currently does not support the creation of %s resource pools in this environment", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10041": "failed to extract subject distinguished name from public key: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10042": "check-all-security-machine-token-exist failed for all virtual machines", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10040": "failed to parse encrypted public key", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10058": "the NFS primary storage [uuid:%s, name:%s] cannot find a usable host to create the data volume [uuid:%s, name:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10054": "vm[uuid:%s] is not in a Running, Paused, or Stopped state; current state is %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10055": "primary storage with UUID:%s is not attached to any cluster", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10050": "No usable backend provider found. Please ensure that a valid cloud provider is configured and try again.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10051": "no host in Connected state to which NFS primary storage [uuid:%s, name:%s] is attached found to revert volume [uuid:%s] to snapshot [uuid:%s, name:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10052": "no host in connected status to which NFS primary storage [uuid:%s, name:%s] is attached found to revert volume [uuid:%s] to image [uuid:%s]", + "ORG_ZSTACK_IAM2_10019": "Cannot parse the cron expression. Please ensure it is formatted correctly according to the standard cron format specifications.", + "ORG_ZSTACK_IAM2_10018": "the project[UUID: %s, name:%s] is in state of %s which disallows the operation[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10038": "failed to generate data protection token %s for the security appliance %s because %s", + "ORG_ZSTACK_IAM2_10015": "An organization with UUID %s cannot be set as a child of itself or its parent organization UUID %s.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10039": "failed to generate HMAC token %s for the security appliance %s because %s", + "ORG_ZSTACK_IAM2_10014": "Current organization [uuid:%s] is stale, please activate it", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10036": "generate-token failed for cloud resource allocation", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10037": "failed to generate an activated token for the security machine %s because %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10034": "Importing the secret key failed. Please ensure that the key is correctly configured and accessible in your cloud environment.", + "ORG_ZSTACK_IAM2_10011": "wrong virtual instance ID[uuid:%s], either the instance does not exist or the password is incorrect", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10005": "invalid type format [%s]", + "ORG_ZSTACK_IAM2_10010": "no account found for project[uuid:%s, name:%s] please ensure you have the correct permissions and credentials configured for your cloud environment.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10035": "the connection to the security instance %s failed during the process of generating the test key because %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10006": "only support Cloud resources, but got [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10032": "Failed to export secret key: %s", + "ORG_ZSTACK_IAM2_10013": "virtual ID does not belong to the project", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10003": "cannot support such action type: %s", + "ORG_ZSTACK_IAM2_10012": "virtual ID[name:%s] is disabled due to configuration settings", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10030": "encryptSubjectDN cannot be null", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10031": "failed to parse metadata envelope for cloud instance %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10002": "cannot support such cloud resource type: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10068": "The NFS primary storage [uuid:%s, name:%s] is not attached to any clusters or no hosts in the attached clusters are connected.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10009": "invalid type: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10007": "only support Resource or Action, but got [%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10008": "Default value must be in JSON format as specified by Type [%s], but [%s] was found.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10029": "cipherText must not be null", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10027": "Failed to find secret key for accessing encrypted resources. Please ensure that the secret key is correctly configured and has the necessary permissions.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10028": "failed to parse secret key, error: %s", + "ORG_ZSTACK_IAM2_10022": "Current virtual instance [ID: %s] is stale, please reactivate it.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10016": "invalid dynamic variable reference, which must be in the format of ${variable:default}", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10024": "large file HMAC encryption failed, code: %s, details: %s", + "ORG_ZSTACK_IAM2_10021": "The user[%s] is not a registered platform user", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10017": "The specified verb must contain \u0027::\u0027 to denote the namespace and method!", + "ORG_ZSTACK_IAM2_10024": "Old password does not match the original password. Unable to update the virtual machine ID [uuid:%s] password.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10014": "Incorrect JSON format, causes: %s", + "ORG_ZSTACK_IAM2_10023": "only administrators and the virtual instance itself can perform updates", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10015": "cannot find property file resource set before!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10012": "invalid decoder: %s!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10013": "No root element found in your CloudFormation template, please check your template definition!", + "ORG_ZSTACK_IAM2_10020": "The quota[name:%s] of Account[uuid:%s] cannot be set to %d as it would exceed the organization[uuid:%s]\u0027s quota.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10011": "type is: %s, but expected type: %s", + "ORG_ZSTACK_PCIDEVICE_10058": "The host [%s] has failed to enter maintenance mode. The VM [%s] cannot be migrated automatically due to the presence of a PCI device.", + "ORG_ZSTACK_PCIDEVICE_10056": "failed to start VM[UUID:%s] because not all PCI devices[UUIDs:%s] exist", + "ORG_ZSTACK_PCIDEVICE_10059": "pci device [uuid:%s] cannot be attached to vm [uuid:%s] due to incorrect status", + "ORG_ZSTACK_PCIDEVICE_10050": "please unmount all GPU devices from the VM[%s] and try again", + "ORG_ZSTACK_PCIDEVICE_10053": "specified PCI devices are not co-located: PCI device with UUID [%s] is on host with UUID [%s] while another PCI device with UUID [%s] is on a different host with UUID [%s]", + "ORG_ZSTACK_PCIDEVICE_10052": "please unmount other PCI devices of the VM[%s] and try again", + "ORG_ZSTACK_PCIDEVICE_10051": "please unmount all GPU devices of the VM[%s] and try again", + "ORG_ZSTACK_PCIDEVICE_10068": "cannot migrate root volume [uuid:%s] because it has attached PCI devices", + "ORG_ZSTACK_PCIDEVICE_10066": "cannot migrate VM[UUID:%s] as PCI device is attached", + "ORG_ZSTACK_PCIDEVICE_10061": "failed to find sufficient PCI device of specification [uuid:%s] in destination host [uuid:%s] for virtual machine [uuid:%s]", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10003": "No backup storage plugin registered with identity: %s", + "ORG_ZSTACK_PCIDEVICE_10065": "vm[%s] instance does not exist; cannot bind to PCI device[%s]", + "ORG_ZSTACK_PCIDEVICE_10064": "Cannot attach the PCI device [uuid:%s] to VM [uuid:%s] due to host resource allocation issues.", + "ORG_ZSTACK_PCIDEVICE_10063": "PCI devices [%s] are not all available for use.", + "ORG_ZSTACK_PCIDEVICE_10062": "something wrong with IOMMU group of PCI device[uuid:%s]", + "ORG_ZSTACK_IAM2_10008": "virtualID[uuid:%s] does not exist within project[uuid:%s]", + "ORG_ZSTACK_IAM2_10009": "project[name:%s] does not exist", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10000": "null installation path returned from driver: %s", + "ORG_ZSTACK_IAM2_10004": "fail to load VirtualMachine ID information from file because\\n%s", + "ORG_ZSTACK_IAM2_10003": "There are %d issues with the code.", + "ORG_ZSTACK_IAM2_10006": "failed to build Virtual Machine ID information from file.", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10001": "%s: health status: %s", + "ORG_ZSTACK_IAM2_10005": "UUID [%s] already exists. Please try a different one.", + "ORG_ZSTACK_MEMORY_10000": "no data found for %s on host[%s]", + "ORG_ZSTACK_PCIDEVICE_10036": "cannot SR-IOV virtualize PCI devices on host [UUID:%s] that are attached to a VM", + "ORG_ZSTACK_PCIDEVICE_10035": "PCI devices in the host [UUID:%s] are already SRIOV virtualized.", + "ORG_ZSTACK_PCIDEVICE_10034": "could not enable SRIOV for device because IOMMU is disabled on host [UUID:%s]", + "ORG_ZSTACK_PCIDEVICE_10033": "pci device [uuid:%s] is unavailable", + "ORG_ZSTACK_PCIDEVICE_10039": "PCI device [UUID:%s] does not exist or is not SRIOV virtualized.", + "ORG_ZSTACK_PCIDEVICE_10037": "only %d virtual PCI devices can be generated by %s domains in host[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10109": "backup storage[uuid: %s] has already been upgraded", + "ORG_ZSTACK_STORAGE_CDP_10104": "task[uuid:%s] has been terminated", + "ORG_ZSTACK_STORAGE_CDP_10105": "CDP task is merging data; please do not initiate a pickup operation.", + "ORG_ZSTACK_STORAGE_CDP_10106": "CDP task[uuid:%s] exceeded storage utilization: maximum %d GB, used %d GB.", + "ORG_ZSTACK_STORAGE_CDP_10107": "Unexpected VM Instance State: %s", + "ORG_ZSTACK_STORAGE_CDP_10102": "CDP task[uuid: %s] has no associated virtual machine", + "ORG_ZSTACK_PCIDEVICE_10047": "pci device [uuid:%s] is not virtualized into managed devices", + "ORG_ZSTACK_PCIDEVICE_10045": "pci device [uuid:%s] cannot be virtualized by mdev specification [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_10044": "PCI device [UUID:%s] cannot be virtualized into MDEVs. Ensure it is enabled and detached.", + "ORG_ZSTACK_PCIDEVICE_10049": "The host [UUID:%s] that the PCI device [UUID:%s] is attached to is not connected.", + "ORG_ZSTACK_PCIDEVICE_10048": "PCI devices generated from [UUID:%s] still attached to VM instance", + "ORG_ZSTACK_STORAGE_CDP_10119": "unexpected task type: %s", + "ORG_ZSTACK_PCIDEVICE_10043": "cannot unassign PCI device[%s] because its virtual functions are in use.\\nDetails:\\n%s", + "ORG_ZSTACK_PCIDEVICE_10042": "cannot ungenerate PCI device[%s] as it is not a GPU or Network Interface Controller.", + "ORG_ZSTACK_PCIDEVICE_10041": "Could not ungenerate virtual PCI devices on host [uuid:%s] as they are still attached to a VM.", + "ORG_ZSTACK_PCIDEVICE_10040": "could not ungenerate pci device [uuid:%s] as the host [uuid:%s] is not connected", + "ORG_ZSTACK_STORAGE_CDP_10117": "CDP task[uuid: %s] not found", + "ORG_ZSTACK_STORAGE_CDP_10118": "CDP task[uuid: %s] status changed abnormally, old status: %s, new status: %s due to storage quota exceeded, current: %d, quota: %d.", + "ORG_ZSTACK_STORAGE_CDP_10111": "The QEMU-img version of the backup storage [UUID: %s] needs to be upgraded.", + "ORG_ZSTACK_STORAGE_CDP_10112": "No Cloud Data Protection task found for VM: %s", + "ORG_ZSTACK_STORAGE_CDP_10113": "No backup storage configured for virtual machine: %s", + "ORG_ZSTACK_STORAGE_CDP_10114": "No CdpBackupFactory of type[%s] found in the cloud environment", + "ORG_ZSTACK_STORAGE_CDP_10110": "the architecture of the backup storage [UUID: %s] does not support upgrading the continuous data protection task", + "ORG_ZSTACK_IDENTITY_10072": "cannot update Quota[name: %s] for the account[identifier: %s]", + "ORG_ZSTACK_IDENTITY_10071": "cannot find quota update checker for quota[uuid:%s, type:%s]", + "ORG_ZSTACK_AI_CONTAINER_10001": "model center with uuid %s not found in the cloud environment", + "ORG_ZSTACK_AI_CONTAINER_10005": "Failed to retrieve service URL, possibly due to a null service IP address. Please verify the Kubernetes network configuration.", + "ORG_ZSTACK_AI_CONTAINER_10004": "Failed to create Kubernetes service in the cloud environment", + "ORG_ZSTACK_AI_CONTAINER_10003": "Failed to create Kubernetes Deployment for application %s in namespace %s due to cloud computing resource constraints or configuration issues. Please check your resource allocation and deployment configuration.", + "ORG_ZSTACK_AI_CONTAINER_10009": "endpoint with UUID %s not found, cannot synchronize container resources in the database", + "ORG_ZSTACK_AI_CONTAINER_10007": "Failed to initialize storage service in Kubernetes cluster", + "ORG_ZSTACK_AI_CONTAINER_10006": "Failed to create network policy for distribution model service instance %s", + "ORG_ZSTACK_TAG2_10011": "resource[uuid:%s] has been associated with %d tags and cannot accommodate any additional ones.", + "ORG_ZSTACK_IDENTITY_10063": "a statement must have a non-empty action field. Invalid statement[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10006": "there has been an NFS primary storage with URL %s in zone[uuid:%s]", + "ORG_ZSTACK_IDENTITY_10062": "A statement must specify an action field. Invalid statement[%s]", + "ORG_ZSTACK_IDENTITY_10061": "A statement must assign a value or have an effect on state. Invalid statement[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10008": "Found multiple CIDR blocks associated with the network interface. Please specify a single CIDR block or check your network configuration.", + "ORG_ZSTACK_IDENTITY_10060": "group[name: %s, uuid: %s] is not associated with account[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10009": "invalid CIDR block: %s", + "ORG_ZSTACK_IDENTITY_10067": "The name of the administrator account cannot be updated. Please ensure that you are using the correct syntax and parameters for modifying account information. For more details, refer to the official documentation.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10002": "cannot find a connected host in the cluster for the specified placement group [uuid: %s]", + "ORG_ZSTACK_IDENTITY_10066": "The provided password does not match the current password for the account [UUID: %s]. Please ensure accuracy and try again.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10003": "cannot find a connected host to execute the command for NFS primary storage [uuid:%s]", + "ORG_ZSTACK_IDENTITY_10065": "An account already has a name that matches %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10004": "cannot find a host with a connected NFS connection to execute commands for NFS primary storage [uuid:%s]", + "ORG_ZSTACK_IDENTITY_10069": "account[uuid: %s, name: %s] is a standard account and does not have the authority to reset the password of another account[uuid: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10000": "The NFS primary storage [uuid:%s] is not attached to any compute clusters and therefore cannot expunge the root volume [uuid:%s] of the virtual machine [uuid:%s].", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10004": "only baremetal2 image with boot mode %s is supported", + "ORG_ZSTACK_IDENTITY_10068": "Only administrative accounts can update their passwords.", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10003": "The bootMode attribute is mandatory for baremetal2 images.", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10002": "only root volume template of raw/qcow2 format can be tagged with baremetal2", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10001": "only one system tag of type baremetal2 is allowed, but %d were found", + "ORG_ZSTACK_AI_CONTAINER_10012": "failed to find pod name by ip %s", + "ORG_ZSTACK_AI_CONTAINER_10011": "Failed to retrieve pod IP address, unable to add entry to container endpoint table. Please ensure the pod is running and accessible.", + "ORG_ZSTACK_AI_CONTAINER_10010": "cluster with uuid %s not found in the virtualization environment", + "ORG_ZSTACK_COMPUTE_VM_NUMA_10003": "invalid CPU set [%s]", + "ORG_ZSTACK_AI_CONTAINER_10016": "failed to retrieve k8s deployment %s", + "ORG_ZSTACK_AI_CONTAINER_10015": "fail to delete Kubernetes service because %s", + "ORG_ZSTACK_TAG2_10008": "all token types must be specified", + "ORG_ZSTACK_AI_CONTAINER_10014": "fail to delete Kubernetes deployment, because %s", + "ORG_ZSTACK_AI_CONTAINER_10013": "failed to add label %s to pod %s", + "ORG_ZSTACK_TAG2_10006": "Invalid color specification[%s], must be a valid hexadecimal code like #FF00FF", + "ORG_ZSTACK_TAG2_10007": "Get format[%s], format must be either name::{tokenName1}::{tokenName2} ... ::{tokenNameN} or {tokenName1}::{tokenName2} ... ::{tokenNameN}. Names should not contain \u0027{}:\u0027.", + "ORG_ZSTACK_AI_CONTAINER_10019": "invalid YAML format: %s", + "ORG_ZSTACK_TAG2_10004": "simple tag pattern is empty or contains invalid tokens", + "ORG_ZSTACK_AI_CONTAINER_10018": "deployment %s has no instance information", + "ORG_ZSTACK_TAG2_10005": "illegal tag UUIDs %s, tag type must be a simple type", + "ORG_ZSTACK_AI_CONTAINER_10017": "deployment %s does not exist", + "ORG_ZSTACK_IDENTITY_10070": "cannot find Quota[name: %s] for the account[uuid: %s]", + "ORG_ZSTACK_TAG2_10002": "cannot update simple tag pattern format for cloud resource metadata", + "ORG_ZSTACK_TAG2_10003": "Duplicate resource name found. Please check and resolve.", + "ORG_ZSTACK_SNS_PLATFORM_WECOM_10000": "failed to send messages to WeCom. status: %s, body: %s", + "ORG_ZSTACK_TAG2_10000": "Tag uniqueness violation: A tag of type [%s] with name [%s] already exists under account [%d].", + "ORG_ZSTACK_TAG2_10001": "You can only update token ID.", + "ORG_ZSTACK_PCIDEVICE_10072": "pci device specification[uuid:%s] does not exist", + "ORG_ZSTACK_PCIDEVICE_10071": "illegal type[%s] for PCI device, only supported types are legal", + "ORG_ZSTACK_PCIDEVICE_10070": "pci device [uuid:%s] does not exist", + "ORG_ZSTACK_PCIDEVICE_10075": "PCI device [UUID:%s] does not exist or is disabled for VM [UUID:%s]", + "ORG_ZSTACK_PCIDEVICE_10073": "illegal type[%s] for PCI device specification, only supported types are legal", + "ORG_ZSTACK_AI_CONTAINER_10023": "Invalid Kubernetes deployment YAML: %s", + "ORG_ZSTACK_AI_CONTAINER_10020": "failed to patch Kubernetes deployment %s to terminate all pods", + "ORG_ZSTACK_AI_CONTAINER_10025": "model service instance group %s not found in the database", + "ORG_ZSTACK_AI_CONTAINER_10024": "failed to patch k8s deployment %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10039": "fails to create root volume[uuid:%s] from cached image[path:%s] because of an error in virtualization environment", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10040": "originText or certificateText cannot be null", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10036": "failed to delete bits[%s] on NFS primary storage[uuid:%s], error: %s, will clean up install path, pinv.getUuid(), rsp.getError()", + "ORG_ZSTACK_NETWORK_L3_10067": "DNS failure on Layer 3 network [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10037": "failed to revert volume[uuid:%s] to snapshot[uuid:%s] on KVM host[uuid:%s, ip:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10038": "failed to revert volume[uuid:%s] to image[uuid:%s] on KVM host[uuid:%s, ip:%s], %s", + "ORG_ZSTACK_CRYPTO_AUTH_10020": "Unable to generate class for %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10032": "failed to check existence of %s on NFS primary storage[uuid:%s], error: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10034": "unable to create empty volume[uuid:%s, name:%s] on KVM host[uuid:%s, ip:%s], because %s", + "ORG_ZSTACK_CRYPTO_AUTH_10029": "Failed to find certificate information for the virtual machine %s. Please ensure that the necessary certificates are properly configured and uploaded to the cloud environment.", + "ORG_ZSTACK_CRYPTO_AUTH_10028": "failed to parse plain text in encryption parameter to JSON object: %s", + "ORG_ZSTACK_HYGON_10006": "VM[uuid:%s] is not found", + "ORG_ZSTACK_HYGON_10005": "The host with UUID %s has %d running virtual machine(s) with Hygon Security Features enabled. Please shut them down first.", + "ORG_ZSTACK_HYGON_10004": "the host[uuid:%s] is not connected", + "ORG_ZSTACK_HYGON_10003": "The host[UUID:%s] requires the \u0027enableCgroupDeviceAcl\u0027 parameter to be greater than 0 for Hygon mdev devices. Please configure this setting before generating mdev devices.", + "ORG_ZSTACK_HYGON_10002": "The host [UUID:%s] requires the \u0027reconnect.host.restart.libvirtd.service\u0027 configuration to be set to \u0027true\u0027 for Hygon mdev devices. Please configure this setting before generating mdev devices.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10017": "generate certificate failed for cloud instance %s", + "ORG_ZSTACK_HYGON_10000": "cannot ungenerate mdev devices, there are %d mdev device(s) still attached to VMs on host [uuid: %s]. Please ensure all VMs using these devices are stopped first.", + "ORG_ZSTACK_NETWORK_L3_10073": "There is no host route for prefix[%s] on Layer 3 network[uuid:%s].", + "ORG_ZSTACK_NETWORK_L3_10072": "prefix [%s] is not a valid IPv4 network CIDR", + "ORG_ZSTACK_NETWORK_L3_10071": "there has been a host route for prefix[%s] on L3 network[uuid:%s]", + "ORG_ZSTACK_HYGON_10009": "failed to allocate Hygon MDEV devices due to concurrent allocation. Please retry later.", + "ORG_ZSTACK_NETWORK_L3_10070": "next-hop[%s] is not a valid IPv4 address", + "ORG_ZSTACK_HYGON_10008": "insufficient Hygon IOMMU Group devices on host[uuid:%s]. Required: %d", + "ORG_ZSTACK_HYGON_10007": "cannot modify Hygon Security Element settings while VM[uuid:%s] is in state [%s], please stop the VM before making changes", + "ORG_ZSTACK_TICKET_ENTITY_10001": "operation denied. the ticket is in status of %s, cannot perform the operation[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10031": "the security group [%s] does not exist", + "ORG_ZSTACK_IDENTITY_10022": "cannot find the resource[UUID:%s]; incorrect resource UUID or the resource is an administrative resource", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10049": "Cannot find a usable backend for cloud resource allocation. Please ensure that your backend services are properly configured and available.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10042": "no hosts in the cluster[uuid:%s] are available for connection", + "ORG_ZSTACK_IDENTITY_10026": "%s is not a recognized API endpoint", + "ORG_ZSTACK_IDENTITY_10025": "The user specified by userUuid[%s] does not belong to the current account, and the current account lacks administrative privileges, thus it cannot verify the user\u0027s permissions.", + "ORG_ZSTACK_IDENTITY_10029": "cannot find the account[uuid:%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10001": "security instance[uuid:%s] model is not valid", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10037": "invalid algorithm type %s, supported types include: %s.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10002": "the security instance [%s] failed to manually trigger synchronization, please confirm whether the security instance has synchronized the key!", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10038": "the resource pool[%s] specified for data protection does not exist", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10000": "secretResourcePool[uuid:%s] is not in the expected state %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10032": "there has been a security incident with management IP [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10033": "managementIp[%s] is not a valid IPv4 address", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10034": "failed to establish a connection to the security instance %s[%s], due to %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10035": "After enabling the crypto function, at least one security instance should be reserved in the corresponding resource pool.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10017": "unable to create directory[installUrl:%s] on KVM host[uuid:%s, ip:%s], because %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10018": "No host in the cluster is connected or primary storage [uuid:%s] attached to any cluster", + "ORG_ZSTACK_IDENTITY_10050": "toPublic is set to false, accountUUIDs cannot be null or empty. Please ensure that the UUIDs are provided.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10019": "failed to ping NFS primary storage [uuid:%s] from host [uuid:%s], because of network issues or unavailability. disconnect this host-ps connection.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10013": "failed to transfer [%s] from SFTP backup storage [hostname:%s] to NFS primary storage [uuid:%s, path:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10014": "failed to upload bits from NFS primary storage[uuid:%s, mountpoint:%s] to SFTP backup storage[hostname:%s, path:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10016": "unable to attach a primary storage[uuid:%s, name:%s] to cluster[uuid:%s]. The KVM host in the cluster uses qemu-img with version[%s]; however, the primary storage is attached to another cluster that has a KVM host using qemu-img with version[%s]. Qemu-img versions greater than %s are incompatible with those less than %s, which can cause volume snapshot operations to fail. Please avoid attaching a primary storage to clusters with different Linux distributions to prevent qemu-img version mismatches.", + "ORG_ZSTACK_IDENTITY_10059": "user[name: %s, uuid: %s] is not associated with account[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10010": "IP address [%s] does not belong to the CIDR block [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10011": "There are %s running virtual machines on the NFS primary storage, please stop them and try again:\n%s\nPlease ensure all virtual machines are stopped before proceeding.", + "ORG_ZSTACK_IDENTITY_10057": "policy[name: %s, uuid: %s] does not belong to the account[uuid: %s]", + "ORG_ZSTACK_CRYPTO_AUTH_10009": "incorrect secret resource pool model, expected %s, but found %s", + "ORG_ZSTACK_CRYPTO_AUTH_10008": "failed to find model for secret resource pool [%s]", + "ORG_ZSTACK_CRYPTO_AUTH_10006": "The operation is not supported in the current cloud environment. Please ensure that your virtual machine instance supports the required operation.", + "ORG_ZSTACK_IDENTITY_10041": "Unable to create a group. A group with the same name already exists under the account [UUID: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10028": "The selected host [UUID:%s] for storage migration is unavailable.", + "ORG_ZSTACK_CRYPTO_AUTH_10016": "Failed to establish a connection with the remote cryptographic service node. Please ensure that the service is up and running and that network connectivity is properly configured.", + "ORG_ZSTACK_IDENTITY_10040": "accountName and accountUuid cannot both be null; at least one must be specified.", + "ORG_ZSTACK_CRYPTO_AUTH_10015": "The identity authentication does not specify the resource pool to allocate resources. Please ensure that the resource pool is correctly identified and specified for the service.", + "ORG_ZSTACK_IDENTITY_10045": "Cannot delete built-in administrative account. Please use a non-built-in account for deletion.", + "ORG_ZSTACK_IDENTITY_10044": "The account %s is prohibited from deleting itself. Please contact an administrator for assistance.", + "ORG_ZSTACK_IDENTITY_10043": "Unable to create an account. An account with the same name already exists.", + "ORG_ZSTACK_IDENTITY_10042": "Unable to create a user. A user with the same name already exists under the account [UUID: %s].", + "ORG_ZSTACK_IDENTITY_10049": "All authentication checks have failed, and the specified account UUID list is either null or empty. Please verify your input and ensure that valid account UUIDs are provided.", + "ORG_ZSTACK_IDENTITY_10048": "Your session is associated with a user. You cannot assume another user\u0027s identity [uuid:%s].", + "ORG_ZSTACK_IDENTITY_10047": "The current session is an account-based session. Please specify the \u0027uuid\u0027 of the user you wish to update.", + "ORG_ZSTACK_IDENTITY_10046": "Only administrator can terminate account access.", + "ORG_ZSTACK_CRYPTO_AUTH_10019": "Get integrity password from database failed due to %s does not generate integrity password", + "ORG_ZSTACK_VHOST_KVM_10000": "vHostUser disk only supports virtio mode. Please verify that the image platform has the necessary virtio drivers installed.", + "ORG_ZSTACK_VHOST_KVM_10001": "vhost-user disk does not support virtio-scsi mode; please disable virtio-scsi mode.", + "ORG_ZSTACK_NETWORK_L3_10029": "%s is not a valid IPv6 address for cloud resource configuration", + "ORG_ZSTACK_USBDEVICE_10005": "PassThrough only supports usage on a VM running in the host environment.", + "ORG_ZSTACK_ALIYUN_ECS_10019": "Only administrative users can set the parameter [onlyZstack] to false.", + "ORG_ZSTACK_STORAGE_BACKUP_10018": "failed to create image from backup %s", + "ORG_ZSTACK_ALIYUN_ECS_10018": "Only postpaid ECS instances support remote deletion; the indicated ECS charging type is: %s", + "ORG_ZSTACK_USBDEVICE_10002": "The number of USB devices attached to VM has reached the limit. Current usage: %s", + "ORG_ZSTACK_ALIYUN_ECS_10017": "Only delete ECS instances with status Running or Stopped, current status is %s", + "ORG_ZSTACK_NETWORK_L3_10025": "could not obtain a free IP with start[ip:%s] because start[ip:%s] is not a valid IPv6 address", + "ORG_ZSTACK_USBDEVICE_10009": "cannot migrate VM [uuid:%s] because it has USB devices attached via passthrough", + "ORG_ZSTACK_STORAGE_BACKUP_10015": "cannot allocate %s on the backup storage[uuid:%s], it only has %s available", + "ORG_ZSTACK_NETWORK_L3_10024": "could not obtain a free IP with start[ip:%s] because start[ip:%s] is not a valid IPv4 address", + "ORG_ZSTACK_USBDEVICE_10008": "vm[%s] cannot start because USB redirection to the host is not established", + "ORG_ZSTACK_NETWORK_L3_10023": "could not obtain a free IP with start[ip:%s], due to the l3Network[uuid:%s] being configured for dual stack mode", + "ORG_ZSTACK_USBDEVICE_10007": "USB is already bound to virtual machine [UUID:%s] and cannot be bound to another VM.", + "ORG_ZSTACK_STORAGE_BACKUP_10013": "required primary storage[uuid:%s, type:%s] does not support any backup storage.", + "ORG_ZSTACK_NETWORK_L3_10022": "ipRangeUuid and l3NetworkUuid cannot both be null; at least one must be set.", + "ORG_ZSTACK_USBDEVICE_10006": "cannot attach the USB device [uuid:%s] to VM [uuid:%s], possible reasons include: the device is not enabled or has been attached to another VM, or the device and the VM are not on the same host.", + "ORG_ZSTACK_ALIYUN_ECS_10015": "The image has been deleted! Please ensure that the image was properly terminated and all resources were released before deletion.", + "ORG_ZSTACK_ALIYUN_ECS_10014": "ecs image exists remotely, name: %s, creation time: %s", + "ORG_ZSTACK_ALIYUN_ECS_10013": "ECS image existed both remotely and locally, ECS image UUID: %s, name: %s, creation time: %s", + "ORG_ZSTACK_NETWORK_L3_10032": "IPv6 address pool is not supported; therefore, IP range addition is not possible. Please ensure your network configuration supports IPv6 before proceeding.", + "ORG_ZSTACK_STORAGE_BACKUP_10011": "only one backup storage data network system tag is allowed, but %s obtained", + "ORG_ZSTACK_NETWORK_L3_10030": "[startIp %s, endIp %s, prefixLen %d, gateway %s] does not represent a valid IPv6 range for cloud networking configurations.", + "ORG_ZSTACK_STORAGE_BACKUP_10010": "Capacity reservation on all backup storage nodes failed. Please check the availability of your backup storage resources.", + "ORG_ZSTACK_USBDEVICE_10016": "You can attach at most %s USB 3.0 devices to one virtual machine instance.", + "ORG_ZSTACK_USBDEVICE_10015": "You can attach at most %s USB 2.0 device to one VM instance.", + "ORG_ZSTACK_NETWORK_L3_10038": "new network CIDR [%s] differs from old network CIDR [%s]", + "ORG_ZSTACK_USBDEVICE_10014": "You can attach at most %s USB 1.0 device to one VM instance.", + "ORG_ZSTACK_NETWORK_L3_10037": "new IP range [startIP:%s, endIP:%s] overlaps with an existing IP range [startIP:%s, endIP:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10028": "volume backup [uuid:%s] not found in storage volume [uuid:%s]", + "ORG_ZSTACK_NETWORK_L3_10036": "ipv6 prefix length must be %d for Stateless-DHCP or SLAAC", + "ORG_ZSTACK_NETWORK_L3_10035": "addressMode[%s] differs from L3Network address mode[%s]", + "ORG_ZSTACK_USBDEVICE_10019": "The USB device [UUID:%s] is not in an attachable state of %s", + "ORG_ZSTACK_NETWORK_L3_10034": "The system network currently does not support IPv6, therefore IP range addition is not supported at this time. Please ensure your network configuration supports IPv6 before attempting this operation.", + "ORG_ZSTACK_USBDEVICE_10018": "The USB device [UUID:%s] has already been attached to another virtual machine [UUID:%s].", + "ORG_ZSTACK_NETWORK_L3_10033": "ip range prefix length is out of the valid range [%d - %d]", + "ORG_ZSTACK_USBDEVICE_10017": "The USB device [UUID: %s] has already been attached to the same VM [UUID: %s].", + "ORG_ZSTACK_STORAGE_BACKUP_10024": "Volume backup [uuid:%s] not found on storage node [uuid:%s]", + "ORG_ZSTACK_ALIYUN_ECS_10022": "private IP is existed in VSwitch: %s, allocated to ECS: %s", + "ORG_ZSTACK_ALIYUN_ECS_10021": "%s is not within the CIDR range: %s", + "ORG_ZSTACK_ALIYUN_ECS_10020": "vSwitch Available IP Addresses Are Insufficient, Currently (%d)", + "ORG_ZSTACK_USBDEVICE_10012": "cannot migrate VM [uuid:%s] because it has attached PCI devices", + "ORG_ZSTACK_ALIYUN_ECS_10027": "An instance offering or instance type must be specified!", + "ORG_ZSTACK_USBDEVICE_10011": "cannot migrate root volume [uuid:%s] because there are attached storage devices", + "ORG_ZSTACK_ALIYUN_ECS_10026": "%s is not a valid volume type, valid types are [%s]", + "ORG_ZSTACK_ALIYUN_ECS_10025": "%s is not a valid IPv4 address", + "ORG_ZSTACK_ALIYUN_ECS_10024": "bandwidth must be specified when allocating a public IP address", + "ORG_ZSTACK_NETWORK_L3_10043": "%s is not a valid network CIDR mask", + "ORG_ZSTACK_STORAGE_BACKUP_10023": "One of the backup storages [UUID: %s] is in the state of %s, and therefore cannot perform a synchronization operation.", + "ORG_ZSTACK_NETWORK_L3_10042": "the gateway[gatewayId] is not within the subnet subnetId", + "ORG_ZSTACK_STORAGE_BACKUP_10022": "No Volume Backup Factory of type[%s] found", + "ORG_ZSTACK_NETWORK_L3_10041": "%s is not a valid network CIDR as it does not contain any usable IP addresses", + "ORG_ZSTACK_STORAGE_BACKUP_10021": "Current VM[UUID: %s] of the backup volume is no longer the VM[UUID: %s] that was used for backup.", + "ORG_ZSTACK_STORAGE_BACKUP_10020": "sync volume backup metadata file in image store[uuid:%s] encountered I/O error: %s", + "ORG_ZSTACK_NETWORK_L3_10049": "l3 network [uuid %s: name %s] is not a public network; therefore, address pool range cannot be added.", + "ORG_ZSTACK_NETWORK_L3_10047": "not a valid combination of system and category, only certain cloud computing platforms are valid", + "ORG_ZSTACK_NETWORK_L3_10046": "%s is not a valid FQDN domain name", + "ORG_ZSTACK_NETWORK_L3_10045": "unsupported L3 network type[%s]", + "ORG_ZSTACK_NETWORK_L3_10044": "ipRangeUuids, L3NetworkUuids, and zoneUuids must each contain at least one non-empty list, or all values must be set to true.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10023": "could not attach port forwarding rule with allowed CIDR because vmNic[uuid:%s] already has rules that overlap the target private port ranges[%s, %s] and have the same protocol type[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10024": "could not attach port forwarding rule because vmNic [uuid:%s] already has a conflicting rule that overlaps the target private port range [%s, %s], and shares the same protocol type [%s].", + "ORG_ZSTACK_SNMP_10010": "Failed to %s SNMP agent because the privacy password cannot be empty.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10021": "The VMNic [UUID:%s] already has port forwarding rules with different VIPs than the one [UUID:%s].", + "ORG_ZSTACK_ALIYUN_NAS_CORE_10000": "Primary Storage [%s] is still operational; therefore, access group deletion is not possible.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10022": "vmNic UUID[%s] is not allowed to add port forwarding with an allowed CIDR rule because it already has a public IP associated.", + "ORG_ZSTACK_NETWORK_L3_10054": "IP allocation cannot contain network addresses or broadcast addresses. Please ensure the provided IP is a valid host address within the subnet.", + "ORG_ZSTACK_NETWORK_L3_10053": "the gateway[gatewayId] is not within the subnet subnetId/cidrBlock", + "ORG_ZSTACK_NETWORK_L3_10052": "The IP range [%s ~ %s] includes link-local addresses, which are reserved for virtualization and should not be used.", + "ORG_ZSTACK_NETWORK_L3_10051": "The IP range [%s ~ %s] contains E类地址,这些地址是保留的。", + "ORG_ZSTACK_NETWORK_L3_10050": "The IP range [%s ~ %s] includes D-class addresses, which are reserved for multicast communications.", + "ORG_ZSTACK_STORAGE_BACKUP_10008": "after subtracting reserved capacity, no available backup storage has the required capacity[%s bytes]", + "ORG_ZSTACK_STORAGE_BACKUP_10006": "backup storage [UUID:%s] has been associated with zone [UUID:%s]", + "ORG_ZSTACK_NETWORK_L3_10059": "start IP address [%s] is after end IP address [%s]", + "ORG_ZSTACK_ALIYUN_ECS_10006": "decode url failed: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10005": "backup storage with UUID:%s has not been attached to zone with UUID:%s", + "ORG_ZSTACK_NETWORK_L3_10058": "netmask[%s] is not a valid netmask and must be specified to avoid an invalid IP range netmask of 0.0.0.0.", + "ORG_ZSTACK_STORAGE_BACKUP_10004": "zoneUuids and backupStorageUuids must both have at least one non-empty list, or both be set to true.", + "ORG_ZSTACK_NETWORK_L3_10057": "gateway[%s] is not a valid IPv4 address", + "ORG_ZSTACK_STORAGE_BACKUP_10003": "%s should not be null in a virtual machine configuration", + "ORG_ZSTACK_NETWORK_L3_10056": "end IP[%s] is not a valid IPv4 address", + "ORG_ZSTACK_NETWORK_L3_10055": "start ip[%s] is not a valid IPv4 address", + "ORG_ZSTACK_CORE_SALT_10000": "SCP is not found in the system[%s], unable to establish salt configuration.", + "ORG_ZSTACK_ALIYUN_ECS_10004": "no system disk found for instance: [%s], instance id is: [%s]", + "ORG_ZSTACK_CORE_SALT_10003": "failed to run salt state[%s] on instance[%s], failed after %s retries", + "ORG_ZSTACK_ALIYUN_ECS_10003": "This availability zone [%s] cannot support instance type [%s] currently, please choose another instance type or availability zone.", + "ORG_ZSTACK_ALIYUN_ECS_10002": "No available instance types currently. Please check back later or modify your specifications.", + "ORG_ZSTACK_SNMP_10000": "SNMP agent creation failed as one already exists.", + "ORG_ZSTACK_SNMP_10001": "Failed to terminate SNMP agent service, please ensure a SNMP agent instance is created first.", + "ORG_ZSTACK_NETWORK_L3_10065": "Adding a normal IP range requires specifying the gateway IP address.", + "ORG_ZSTACK_SNMP_10002": "Failed to update SNMP agent configuration. Please ensure a SNMP agent is created first.", + "ORG_ZSTACK_NETWORK_L3_10064": "new added IP range gateway %s is different from the existing gateway %s", + "ORG_ZSTACK_SNMP_10003": "Failed to启动SNMP代理,请先创建一个SNMP代理。", + "ORG_ZSTACK_NETWORK_L3_10063": "gateway[%s] cannot be part of the range[%s, %s]", + "ORG_ZSTACK_SNMP_10004": "Failed to %s SNMP agent because readCommunity cannot be empty when version is v2c", + "ORG_ZSTACK_NETWORK_L3_10062": "the endpoint [%s] is not within the subnet %s/%d", + "ORG_ZSTACK_SNMP_10005": "Failed to %s SNMP agent because userName cannot be empty when version is v3", + "ORG_ZSTACK_NETWORK_L3_10061": "multiple CIDR blocks are not allowed on the same L3 network. An existing IP range [uuid:%s, CIDR:%s] already exists; therefore, the new CIDR block [%s] is invalid.", + "ORG_ZSTACK_SNMP_10006": "Failed to %s SNMP agent, authentication algorithm cannot be null when password is not provided.", + "ORG_ZSTACK_NETWORK_L3_10060": "overlap with IP range[uuid:%s, start_ip:%s, end_ip: %s]", + "ORG_ZSTACK_SNMP_10007": "Failed to %s SNMP agent due to authentication password being empty.", + "ORG_ZSTACK_SNMP_10008": "Failed to %s SNMP agent because data encryption configuration requires user verification to be set first.", + "ORG_ZSTACK_XINFINI_10019": "fail to retrieve node %s details, verify ip address and role configuration", + "ORG_ZSTACK_XINFINI_10018": "No virtual machine node found", + "ORG_ZSTACK_XINFINI_10017": "No connected virtual machine instance found. Please ensure that a node is properly connected and try again.", + "ORG_ZSTACK_XINFINI_10016": "not supported protocol[%s] for active connection", + "ORG_ZSTACK_XINFINI_10015": "not supported get volume info from [%s]", + "ORG_ZSTACK_XINFINI_10014": "not supported storage protocol[%s]", + "ORG_ZSTACK_XINFINI_10013": "not supported protocol[%s] for deactivation", + "ORG_ZSTACK_XINFINI_10012": "cannot retrieve volume details [%s], possibly due to deletion", + "ORG_ZSTACK_XINFINI_10010": "empty configuration, cannot discover instance xinfini", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10021": "required IP %s has been allocated to another instance", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10022": "requiredIp %s is out of the DHCP range %s ~ %s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10020": "failed to allocate IP from Baremetal2 provision network[uuid:%s]", + "ORG_ZSTACK_XINFINI_10009": "delete iscsi client failed %s", + "ORG_ZSTACK_XINFINI_10008": "delete volume client group mapping failed %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10002": "There are BM instances using IP addresses allocated from L2[uuid:%s].", + "ORG_ZSTACK_XINFINI_10007": "delete volume snapshot failed %s", + "ORG_ZSTACK_XINFINI_10006": "snapshot [id:%s, name:%s] has %d cloned volumes, volume names: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10004": "There are BM instances using IP addresses allocated from IP range [uuid:%s].", + "ORG_ZSTACK_XINFINI_10005": "delete volume failed due to %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10003": "There are BM instances using IP addresses allocated from L3 network [UUID:%s].", + "ORG_ZSTACK_XINFINI_10004": "delete bdev failed %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10006": "Failed to remotely power %s baremetal server[uuid:%s]", + "ORG_ZSTACK_XINFINI_10003": "bdc with ip %s not found in the cloud environment.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10005": "failed to allocate baremetal PXE server, ensure there is a PXE server with sufficient available capacity attached to cluster[uuid:%s]", + "ORG_ZSTACK_XINFINI_10002": "xinfini request failed, message: %s.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10008": "Baremetal chassis [uuid:%s] does not exist", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10009": "baremetal2 provisioning network with UUID: %s is already attached to cluster with UUID: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10007": "Failed to remotely power off baremetal chassis[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10008": "failed to hot-unplug managed device from running virtual machine, because:%s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10010": "cannot attach Baremetal2 provision network [uuid:%s] to cluster [uuid:%s] as it already has a network configured", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10011": "cannot attach BareMetal2 provision network to cluster because they are not in the same availability zone", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10007": "vm[uuid:%s] cannot start on a host that holds mdev device[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10004": "failed to dynamically attach mdev device to running vm, because:%s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10002": "mdev device with UUID:%s cannot attach to VM with UUID:%s due to incorrect status", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10003": "mdev device [%s] is not available in the virtualized environment", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10000": "The host [%s] failed to enter maintenance mode because VM [%s] has attached MDEV devices and cannot be migrated automatically.", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10018": "failed to update provisioned network[uuid:%s] in gateway[uuid:%s]: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10009": "Baremetal chassis [UUID:%s] is not enabled or available. Please select another one.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10001": "pci device [uuid:%s] is known to be a mdev but its specification cannot be found, so the process aborts.", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10016": "not all baremetal2 provisioning networks exist in %s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10014": "cannot detach Baremetal2 provisioning network [uuid:%s] when there are running instances dependent on it", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10015": "networkUuids is an empty list", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10012": "cannot attach BareMetal2 provision network to cluster because every gateway attached to clusters with the same provision network must be verified. Please ensure that all relevant gateways are consistent before proceeding.", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10013": "provisioned network should not have the same interface name as l2 networks already attached to the cluster", + "ORG_ZSTACK_NETWORK_L3_10006": "Could not reserve IP range because there is no available IPv4 subnet.", + "ORG_ZSTACK_NETWORK_L3_10005": "could not reserve IP range because the end IP [%s] is less than the start IP [%s]", + "ORG_ZSTACK_NETWORK_L3_10004": "could not reserve IP range because end IP[%s] is not a valid IPv6 address", + "ORG_ZSTACK_NETWORK_L3_10003": "could not reserve IP range because end IP[%s] is not a valid IPv4 address", + "ORG_ZSTACK_NETWORK_L3_10002": "could not reserve IP range because start IP address [%s] is invalid", + "ORG_ZSTACK_NETWORK_L3_10000": "could delete IP address because it is used by VM Network Interface Controller [UUID:%s]", + "ORG_ZSTACK_NETWORK_L3_10009": "Could not reserve IP range because there is no IPv6 subnet available. Please check your network configuration or try reserving an IPv4 subnet instead.", + "ORG_ZSTACK_KVM_10001": "fail to load host information from file because\\n%s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10019": "mdev device with UUID: %s is not attached to VM with UUID: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10017": "the VM[UUID:%s] that holds SE-MDEV device cannot attach more SE-MDEV[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10018": "IOMMU of the host [uuid:%s] that manages PCI device [uuid:%s] is not configured as [%s] or [%s].", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10015": "vm[uuid:%s] has mdev devices attached that are on a different host than mdev device[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10014": "vm[uuid:%s] has PCI devices attached that are on a different host than the mdev device[uuid:%s].", + "ORG_ZSTACK_NETWORK_L3_10010": "could not reserve IP range because the reserved IP is not within the specified IP range[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10011": "Cannot modify the state of a mdev device that is currently attached to a virtual machine. Please detach the device before making any changes.", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10007": "cannot delete BareMetal2 provisioning network [uuid:%s] when instances are dependent on it", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10012": "cannot attach mdev device [uuid:%s] to VM, ensure it is enabled and not attached", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10008": "cannot attach a BareMetal2 provisioning network to a non-BareMetal2 cluster", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10005": "baremetal2 provision network DHCP range netmask %s is invalid", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10006": "baremetal2 provision network start IP %s and stop IP %s do not belong to the same subnet mask", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10003": "cannot update BareMetal2 provisioned network [uuid:%s] DHCP configuration when instances are dependent on it", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10002": "A baremetal2 provision network with DHCP interface %s already exists, with the following configuration: start IP %s, end IP %s, netmask %s, and gateway %s.", + "ORG_ZSTACK_NETWORK_L3_10018": "no IP range specified for layer 3[%s]", + "ORG_ZSTACK_NETWORK_L3_10015": "You must update both the system and category in your cloud configuration.", + "ORG_ZSTACK_XINFINI_10027": "The feature for unexport NVMeOF is not currently supported.", + "ORG_ZSTACK_NETWORK_L3_10014": "Cannot delete the last standard IP range because there is still an address pool present.", + "ORG_ZSTACK_XINFINI_10026": "no active gateway discovered for client[%s]", + "ORG_ZSTACK_NETWORK_L3_10013": "could not set mtu because l2 network[uuid:%s] of l3 network [uuid:%s] has an mtu value that exceeds the novlan network\u0027s limit", + "ORG_ZSTACK_XINFINI_10025": "NVMe over Fabrics (OF) export is not currently supported.", + "ORG_ZSTACK_XINFINI_10024": "xinfini only supports setting total QoS levels", + "ORG_ZSTACK_NETWORK_L3_10011": "could not reserve IP range because the new range overlaps with an existing range [%s:%s]", + "ORG_ZSTACK_XINFINI_10023": "No available pool with sufficient space[%d] and healthy status", + "ORG_ZSTACK_XINFINI_10021": "fail to get pool[id:%d, name:%s] virtual machine details", + "ORG_ZSTACK_XINFINI_10020": "No compute resource pool found. Please ensure that a pool has been created and is available for use.", + "ORG_ZSTACK_KVM_10010": "The host [UUID: %s] lacks CPU model details. Please reconnect the host to resolve this.", + "ORG_ZSTACK_KVM_10011": "The reason for forcing a run must be specified.", + "ORG_ZSTACK_NETWORK_L3_10019": "ip[%s] is not within the cidr range of ip pool[uuid:%s, cidr:%s] associated with l3 network[%s]", + "ORG_ZSTACK_KVM_10012": "host[uuid:%s] has been terminated", + "ORG_ZSTACK_KVM_10002": "The operating system [OS] of host [hostname:%s, IP:%s] is invalid", + "ORG_ZSTACK_KVM_10003": "cluster[uuid:%s] already has a host with OS version [%s], but the newly added host [name:%s ip:%s] has a different OS version [%s].", + "ORG_ZSTACK_KVM_10004": "vm[uuid:%s] crashes due to kernel failure", + "ORG_ZSTACK_KVM_10005": "host[uuid: %s] memory ECC error triggered, details: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10029": "specified managed devices are not on the same host: managed device[uuid: %s] on host[uuid: %s] while managed device[uuid: %s] on host[uuid: %s]", + "ORG_ZSTACK_KVM_10006": "There are still hosts that do not have the same CPU architecture, details: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10026": "Cannot delete mdev device when it is attached to a virtual machine instance. Please detach the device before deletion.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10027": "failed to start VM[UUID:%s] because not all MDEV specifications[UUIDs:%s] exist", + "ORG_ZSTACK_KVM_10008": "PCI Bridge ID must be a value greater than 0 and less than 32", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10024": "cannot attach a managed device to a virtual machine instance that is not in a stopped state", + "ORG_ZSTACK_KVM_10009": "vm current state[%s], modifying virtioSCSI requires vm to be in state[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10025": "illegal mdev device type [%s], only virtual devices are legal", + "ORG_ZSTACK_NETWORK_L3_10021": "invalid Cloud Instance ID[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10022": "cluster UUIDs, host UUID, or VM UUID cannot be set simultaneously.%s", + "ORG_ZSTACK_NETWORK_L3_10020": "ip[%s] within the IP range[uuid:%s, startIp:%s, endIp:%s] associated with L3 network[%s], this is not permitted", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10023": "Clusters do not exist or are disabled. Please ensure that the clusters have been properly created and enabled.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10020": "the host with UUID [%s] that holds the mdev device with UUID [%s] does not match either [%s] or [%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10021": "Cannot detach mdev device from VM instance when it is not in a stopped state. Please ensure the VM instance is stopped before detaching the mdev device.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10053": "There is no Virtual Private Cloud (VPC) configured on the SDN Controller [IP:%s].", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10054": "The system tag for VPC ID is mandatory. Please provide a valid value.", + "ORG_ZSTACK_MACVLAN_10002": "failed to check VLAN interface[%s] for L2VLAN network[uuid:%s, name:%s] on KVM host[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10051": "there is no switch configured on sdn controller [ip:%s]", + "ORG_ZSTACK_MACVLAN_10005": "could not attach network service to L3 network [uuid:%s], because L2 network [uuid:%s, vSwitchType:%s] does not support any L3 network services for public basic L3 network", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10052": "There is no SDN switch attached to the controller.%s", + "ORG_ZSTACK_MACVLAN_10004": "only %s support MACVLAN networking模式", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10057": "failed to retrieve logical switch for layer 2 network %s", + "ORG_ZSTACK_MACVLAN_10007": "could not attach network service to L3 network with UUID: %s, because L2 network with UUID: %s only supports vRouter as the network provider for private basic L3 networks.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10058": "get logical switch for Layer 2 network failed with result: %s", + "ORG_ZSTACK_MACVLAN_10006": "could not attach network service to L3 network with UUID: %s, because L2 network with UUID: %s only supports vRouter as the network provider for VPC L3 network and does not support vSwitchType: %s.", + "ORG_ZSTACK_MACVLAN_10009": "KVM hosts only support L2 networking with vSwitchType set to OVS. Please ensure your host is a KVM type and the vSwitchType is configured as OVS.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10056": "cannot retrieve physical switch port information because: %s", + "ORG_ZSTACK_MACVLAN_10008": "could not attach network service to L3 network [uuid:%s], because L2 network [uuid:%s, vSwitch Type:%s] only supports load balancer for private basic L3 networks", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10075": "The root volume has been deleted and cannot be reimaged at this time. Please contact support for assistance.", + "ORG_ZSTACK_STORAGE_CEPH_10023": "The issue might be due to an incorrect access key ID or secret access key or SSH port number or an unstable network connection in your cloud environment. Please verify these settings.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10050": "There is no tenant on SDN controller [IP:%s]", + "ORG_ZSTACK_STORAGE_CEPH_10020": "poolName can be null but must not be an empty string", + "ORG_ZSTACK_KVM_10022": "ssh connection to host[%s] username[%s] on port[%s] failed, due to %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10073": "unable to create an empty volume[uuid:%s, name:%s] on the KVM host[uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_10021": "poolName must be specified when importImages is enabled", + "ORG_ZSTACK_KVM_10023": "Host[%s] has not been powered on within %d seconds for an unknown reason. Please check the host status via the BMC[%s].", + "ORG_ZSTACK_STORAGE_BACKUP_10092": "failed to pass the restore security verification:\\n%s", + "ORG_ZSTACK_KVM_10014": "host %s is not managed by the current management node", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10000": "executeSlbGroupConfigTask unknown task name: %s", + "ORG_ZSTACK_MEVOCO_10049": "Cannot find configuration information for node A", + "ORG_ZSTACK_STORAGE_BACKUP_10091": "backup storage [UUID:%s] is not enabled or configured", + "ORG_ZSTACK_KVM_10015": "host %s is not connected, skip to restart KVM agent", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10039": "cannot migrate root volume [uuid:%s] because there are managed device devices attached", + "ORG_ZSTACK_MEVOCO_10048": "Cannot set local configuration and cloud configuration simultaneously. Please specify a single deployment environment.", + "ORG_ZSTACK_STORAGE_BACKUP_10090": "database backup [uuid:%s] does not exist yet", + "ORG_ZSTACK_KVM_10016": "running task exists on host %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10081": "cannot find flag file [%s] on compute node [%s], because: %s", + "ORG_ZSTACK_MEVOCO_10047": "unexpected host management IP addresses: [%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10037": "cannot migrate VM[UUID:%s] as a mdev device is attached", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10035": "cannot find mdev device[uuid:%s], it may have been deleted or released", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10036": "mdev device with UUID: %s does not exist or is disabled for VM with UUID: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10034": "failed to find sufficient mdev device of specification [uuid:%s] in destination host [uuid:%s] for virtual machine [uuid:%s]", + "ORG_ZSTACK_MEVOCO_10041": "invalid value[%s], ZStack does not support such host allocation type", + "ORG_ZSTACK_STORAGE_BACKUP_10099": "database backup[uuid:%s] is not enabled and ready", + "ORG_ZSTACK_STORAGE_CDP_10120": "Unable to find connected backup storage[uuid: %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10098": "volume[uuid:%s] has been deleted and state changes are not permitted", + "ORG_ZSTACK_MEVOCO_10040": "invalid value[%s], it\u0027s not a valid floating-point number", + "ORG_ZSTACK_STORAGE_CDP_10121": "The operation involves volume [UUID: %s] that will create a chain-type snapshot. Consequently, you cannot perform this operation when a Continuous Data Protection (CDP) task is running on the virtual machine instance.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10032": "failed to determine candidate hosts to start vm[uuid:%s], %s", + "ORG_ZSTACK_STORAGE_BACKUP_10097": "No available object storage bucket found for backup, skipping this job.%s", + "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10001": "Removing a system topic from a system alarm is forbidden. Please provide valid topic and alarm UUIDs.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10005": "Cannot find public network interface of SLB instance", + "ORG_ZSTACK_MEVOCO_10046": "obj is not an instance of NicQos! Please ensure that the object type matches the expected type.", + "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10000": "alarm[uuid:%s] is a system-generated alert which cannot be deleted", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10004": "slb instance[uuid:%s] configuration task version:%d failed %d times", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10003": "cannot find an available SLB instance in group[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10094": "database backup version[%s] does not match the current version[%s]", + "ORG_ZSTACK_MACVLAN_10000": "failed to realize bridge for l2VlanNetwork[uuid:%s, name:%s] on KVM host[uuid:%s], %s", + "ORG_ZSTACK_MEVOCO_10043": "%s value is[%s], which conflicts with %s value [%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10093": "Failed to allocate a free port for listening. Please ensure that the required ports are not being used by other applications. If the issue persists, consider checking your network configuration or contact support for further assistance.", + "ORG_ZSTACK_MEVOCO_10060": "Set address for node A failed", + "ORG_ZSTACK_KVM_10030": "check host capacity failed, because:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10082": "cannot create flag file [%s] on instance [%s], because: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10060": "get logical switch failed: uuid: %s", + "ORG_ZSTACK_KVM_10032": "The host [UUID: %s]\u0027s available memory capacity [%s MB] is lower than the reserved capacity [%s MB]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10083": "There is no LocalStorage primary storage (state\u003d%s, status\u003d%s) on the cluster (%s). When the cluster mounts multiple primary storages, the system defaults to using the local primary storage. Please verify the state and status of the primary storage and ensure it has been attached to the cluster.", + "ORG_ZSTACK_KVM_10033": "unable to register colo heartbeat for vm[uuid:%s] on kvm host [uuid:%s, ip:%s], due to %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10084": "The type of primary storage [uuid:%s] chosen is not local storage. Please verify if the resource can be created on other available storage when the cluster has attached local primary storage.", + "ORG_ZSTACK_KVM_10034": "unable to start colo synchronization virtual machine [uuid:%s] on kvm host [uuid:%s, ip:%s], due to %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10085": "The cluster mounts multiple primary storage devices [Local Storage (%s), other non-LocalStorage primary storage], and therefore, the specification of primaryStorageUuidForDataVolume is not allowed %s.", + "ORG_ZSTACK_KVM_10024": "Host[%s] has not been shut down within %d seconds for an unknown reason. Please check the host status via the BMC[%s].", + "ORG_ZSTACK_MEVOCO_10059": "This instance is not associated with node A", + "ORG_ZSTACK_MEVOCO_10058": "some node in factory mode exists; details of ARPing: %s", + "ORG_ZSTACK_MEVOCO_10053": "curl bootstrap agent finished, return code: %s, stdout: %s, stderr: %s", + "ORG_ZSTACK_MEVOCO_10052": "cannot retrieve bootstrap job %s result after 900 seconds", + "ORG_ZSTACK_MEVOCO_10050": "cannot find node A\u0027s address information from bootstrap agent", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10040": "cannot migrate VM[UUID:%s] because it has attached MDEV devices", + "ORG_ZSTACK_MEVOCO_10057": "node A update factory mode failed, details: %s", + "ORG_ZSTACK_MEVOCO_10056": "All management nodes update to factory mode failed, details: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10013": "MAC address %s is invalid. It should be formatted as 6c:b3:11:1b:0b:1e", + "ORG_ZSTACK_HA_10014": "cannot set FT on VM [uuid:%s] because USB devices are attached via passthrough", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10012": "baremetal PXE server [UUID:%s] is neither enabled nor connected, please verify its status.", + "ORG_ZSTACK_HA_10015": "cannot set FT on virtual machine [uuid:%s] since a mdev device is attached", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10015": "Duplicated bond UUID detected for virtual machine %s. Please ensure unique UUIDs for bonding configurations.", + "ORG_ZSTACK_HA_10016": "The management node fails to discover the host. Please ensure the host is properly registered and accessible within the cloud environment.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10014": "Baremetal chassis [UUID: %s] does not have a network interface with MAC address %s", + "ORG_ZSTACK_HA_10017": "The value[%s] is out of the valid range [0, 1].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10057": "host[uuid: %s] of local primary storage[uuid: %s] does not have sufficient capacity[current: %s bytes, needed: %s]", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10017": "Duplicated L3 Network UUID Detected", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10058": "cannot find any host which has resource[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10016": "Baremetal Network Bonding is not supported", + "ORG_ZSTACK_HA_10011": "cannot set FT on VM[uuid:%s] as it is not in a stopped state", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10059": "Resource[uuid:%s] can only be operated on host[uuid:%s], but the host has been terminated", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10019": "The selected Layer 3 network cannot be assigned to chassis [UUID:%s].", + "ORG_ZSTACK_HA_10012": "cannot set FT on VM[uuid:%s] because one or more data volumes are still attached", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10018": "The specified layer 3 network does not exist. Please verify the network name and try again.", + "ORG_ZSTACK_HA_10013": "cannot set FT on VM[uuid:%s] since PCI device is attached", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10053": "To provision a data volume on the local primary storage, you must specify the host where the data volume will be created using the system tag [%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10054": "The host [UUID:%s] is not associated with the local primary storage [UUID:%s].", + "ORG_ZSTACK_KVM_10040": "failed to increase VM CPU count, error details: %s", + "ORG_ZSTACK_HA_10018": "the VM[uuid:%s] volume stored location primary storage is undergoing maintenance", + "ORG_ZSTACK_KVM_10043": "unable to connect to KVM[ip:%s, username:%s, SSH port:%d] to perform DNS validation; please verify the credentials.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10050": "Unable to live migrate VM [uuid:%s] with data volumes on local storage. Data volumes must be detached first.", + "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10001": "The query object is null. Please ensure that your query parameters are properly initialized before executing the cloud computing task.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10051": "unable to live migrate VM[UUID:%s] with local storage. Only Linux guests are supported. Current platform is [%s].", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10011": "No hardware information found for baremetal chassis[uuid:%s], please select another one.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10052": "unable to live migrate VM[UUID:%s] with ISO attached on local storage. Please detach all ISOs first.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10010": "no corresponding PXE server detected, please verify the baremetal chassis[uuid:%s] configuration again", + "ORG_ZSTACK_KVM_10035": "unable to configure secondary VM[UUID:%s] on KVM host [UUID:%s, IP:%s], because %s", + "ORG_ZSTACK_MEVOCO_10028": "L3 Network with UUID [%s] not found. Please verify and correct your system tag [%s] associated with the static IP.", + "ORG_ZSTACK_STORAGE_BACKUP_10070": "cannot find volume backup with UUID: %s", + "ORG_ZSTACK_KVM_10036": "unable to configure primary VM[UUID:%s] on KVM host[UUID:%s, IP:%s], because %s", + "ORG_ZSTACK_MEVOCO_10027": "invalid IOPS value for volume [%s] exceeds the maximum limit of %d", + "ORG_ZSTACK_KVM_10037": "unable to retrieve the initial boot device of VM [UUID:%s] on KVM host [UUID:%s, IP:%s], due to %s", + "ORG_ZSTACK_MEVOCO_10026": "invalid volume IOPS[%s] is not a valid number", + "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10000": "At least one Host UUID is required when querying a Third-Party Prometheus Namespace. Please ensure that the Host UUID is included in the labels of the query call parameters.", + "ORG_ZSTACK_KVM_10038": "failed to retrieve vm[uuid:%s] device address, due to:%s", + "ORG_ZSTACK_MEVOCO_10025": "invalid IOPS value[%s], it must be greater than 1 (including 1)", + "ORG_ZSTACK_KVM_10039": "failed to retrieve host[uuid:%s] virtualizer information, because:%s", + "ORG_ZSTACK_MEVOCO_10029": "USB device access is restricted to administrative accounts only. Please ensure you are logged in with an account that has administrative privileges.", + "ORG_ZSTACK_STORAGE_BACKUP_10078": "backup storage cannot proceed due to its state being %s", + "ORG_ZSTACK_MEVOCO_10020": "invalid volume bandwidth[%s] must be a numeric value", + "ORG_ZSTACK_STORAGE_BACKUP_10077": "backup storage cannot proceed due to its status being %s", + "ORG_ZSTACK_STORAGE_BACKUP_10076": "The backup storage [UUID: %s, Name: %s] does not have sufficient capacity to download the image [%s]. Required size: %s, available size: %s.", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10001": "All Ceph MON nodes are disconnected in the Ceph backup storage [uuid:%s].", + "ORG_ZSTACK_STORAGE_BACKUP_10075": "The image size retrieved from URL %s is %d bytes, which is too small for an image. Please verify the URL again.", + "ORG_ZSTACK_STORAGE_BACKUP_10074": "failed to retrieve header from image URL %s", + "ORG_ZSTACK_STORAGE_BACKUP_10073": "failed to retrieve header from image URL %s: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10072": "Please terminate other nodes first!", + "ORG_ZSTACK_MEVOCO_10021": "invalid volume bandwidth[%s] exceeds maximum allowed value of %d", + "ORG_ZSTACK_STORAGE_BACKUP_10071": "The VM cluster [%%s] is not co-located with the primary storage cluster [%%s].", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10023": "cannot expunge baremetal instance that\u0027s not in the Destroyed state", + "ORG_ZSTACK_HA_10005": "hosts failed to port scan the target host[uuid:%s, ip:%s]", + "ORG_ZSTACK_IDENTITY_LOGIN_10000": "unsupported authentication method %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10068": "The cluster [UUID\u003d%s] is mounted with multiple primary storages, including LocalStorage and other non-LocalStorage primary storage. You must specify the primary storage where the data disk is located.", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10003": "Failed to migrate Image %s from Backend Storage %s to Backend Storage %s. cause: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10002": "Found trash ID (%s) on Backup Storage [%s] for the migration install path [%s]. Please clean it first using \u0027APICleanUpTrashOnBackupStorageMsg\u0027 if you insist on migrating the image [%s].", + "ORG_ZSTACK_HA_10000": "The virtual machine instance has likely been terminated. Skipping health checkers.", + "ORG_ZSTACK_HA_10001": "cannot find the virtual machine with name:[%s] and uuid:[%s], host uuid is null", + "ORG_ZSTACK_HA_10002": "No HAHostChecker instance found, cannot perform high availability checks. Please ensure that all required components are properly configured.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10064": "The physical capacity usage of the host [uuid:%s] has exceeded the threshold [%s]. Please consider scaling or optimizing your resources.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10067": "The cluster[uuid\u003d%s] is configured to mount multiple primary storage solutions, including LocalStorage and other non-LocalStorage primary storage. You must specify which primary storage contains the root disk.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10060": "KVM host [UUID: %s] fails to be added to local primary storage [UUID: %s], %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10020": "Only ISO images are supported for bare metal service deployments in ZStack.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10061": "unable to create empty snapshot volume[name:%s, install path: %s] on KVM host[uuid:%s, ip:%s], because %s", + "ORG_ZSTACK_KVM_10054": "cannot perform volume snapshot merge when virtual machine [uuid:%s] is in state of %s. The operation is only allowed when the virtual machine is in a Running or Stopped state.", + "ORG_ZSTACK_HA_10008": "exception occurred when syncing the self-fencer state from the host [UUID: %s], %s", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10000": "folder[%s] not found on the cloud management server[%s]", + "ORG_ZSTACK_KVM_10055": "live volume snapshot merge requires a libvirt version greater than %s, current version is %s. Please stop the VM and retry the operation or detach the data volume if necessary.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10062": "failed to transfer bits from the SFTP backup storage[hostname:%s, path: %s] to the local primary storage[uuid:%s, path: %s], %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10022": "Cannot recover a baremetal instance that is not in the Destroyed state. Please ensure the instance is in the Destroyed state before attempting recovery.", + "ORG_ZSTACK_HA_10009": "The %s parameter cannot be set to \u0027%s\u0027 because the storage network is unavailable and high availability must remain enabled.", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10001": "namespace[%s] lacks metric[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10063": "failed to upload bits from the local storage[uuid:%s, path:%s] to the SFTP backup storage[hostname:%s, remotePath:%s], %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10021": "Only Image Store Backup Storage is supported in ZStack Bare Metal Service.", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10002": "metric[%s] of the namespace[%s] lacks a label named %s", + "ORG_ZSTACK_MEVOCO_10039": "invalid value[%s], it must be a double between (0, 1] inclusive of 1", + "ORG_ZSTACK_KVM_10047": "The host [UUID: %s, status: %s] is not connected.", + "ORG_ZSTACK_COMPUTE_OVS_10000": "ovs CPU pinning resource configuration:[%s] format error.", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10001": "on purpose 1: The source file was not found. Please ensure that all required files are properly uploaded and included in your project setup.", + "ORG_ZSTACK_MEVOCO_10037": "invalid value[%s], it must be a positive floating-point number greater than 0", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10002": "on purpose: 2 - This error indicates that the operation was intentionally terminated or modified during execution. Please check your input parameters and ensure they meet the requirements for the cloud computing environment.", + "ORG_ZSTACK_MEVOCO_10031": "Unknown security code[%s] for authentication", + "ORG_ZSTACK_STORAGE_BACKUP_10089": "volume backup metadata operation failure because %s", + "ORG_ZSTACK_STORAGE_BACKUP_10087": "generate volume backup metadata file on image store[uuid:%s] failure due to IO error: %s", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10000": "on purpose: 3 Cloud instances are being terminated. Please confirm the action.", + "ORG_ZSTACK_MEVOCO_10034": "The host [UUID:%s]\u0027s operating system %s %s is too outdated to support QoS for network or disk I/O. Please select another instance without QoS configuration.", + "ORG_ZSTACK_MEVOCO_10033": "%s is not a valid CIDR notation", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10010": "could not add Huawei iMaster SDN controller with invalid VLAN range [%s, %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10008": "iso[uuid: %s] is attached to vm[uuid: ], but the ISO file is not located on any block storage. You must detach it before migrating the VM.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10009": "fail to find block SCSI LUN for volume: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10035": "host[uuid:%s] cannot access local storage[uuid:%s], possibly due to detachment", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10013": "could not create Huawei iMaster NSE L3 network without logical router UUID", + "ORG_ZSTACK_MEVOCO_10093": "DeleteVolumeQos [%s] ignored due to account privileges.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10036": "resource[uuid:%s, type: %s] is not available on the local primary storage[uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10014": "could not create Huawei iMaster L3 network with L2 network [uuid:%s] as it already exists", + "ORG_ZSTACK_MEVOCO_10092": "invalid volume quality of service mode: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10037": "resource[uuid:%s, type: %s] on the local primary storage[uuid:%s] maps to multiple hypervisors%sWithMultipleHypervisors", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10011": "could not add Huawei iMaster SDN Controller without specified VLAN range or VLAN ID", + "ORG_ZSTACK_MEVOCO_10091": "No volumes attached to this instance. Please attach a volume to proceed.", + "ORG_ZSTACK_STORAGE_BACKUP_10058": "Cannot specify primary storage that is attached to a different cluster.", + "ORG_ZSTACK_STORAGE_BACKUP_10057": "At least one of the following parameters must be specified: L3 Network UUIDs, Zone UUID, Cluster UUID, Host UUID.", + "ORG_ZSTACK_MEVOCO_10090": "cannot take a snapshot for volumes attached to multiple VMs", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10033": "Unable to create the data volume[uuid: %s] on a local primary storage[uuid:%s], as the host UUID is not specified.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10034": "No host state is enabled. Please verify the availability of the host resources.", + "ORG_ZSTACK_KVM_10064": "failed to update network interface for virtual machine [vm:%s] on KVM host [uuid:%s, ip:%s], because %s", + "ORG_ZSTACK_KVM_10065": "failed to attach nic with UUID: %s to VM UUID: %s on KVM host with UUID: %s and IP: %s, because %s. Please try again or delete device with UUID: %s manually.", + "ORG_ZSTACK_KVM_10066": "failed to attach nic with UUID: %s to VM UUID: %s on KVM host with UUID: %s and IP: %s because %s", + "ORG_ZSTACK_KVM_10067": "failed to detach data volume[uuid:%s, installPath:%s] from vm[uuid:%s, name:%s] on KVM host[uuid:%s, ip:%s], due to %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10005": "port forwarding rule [uuid:%s] has been deleted", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10006": "Port forwarding rule [uuid:%s] is not enabled, current state is %s", + "ORG_ZSTACK_KVM_10059": "vm[uuid:%s] is not in a Running or Stopped state, current status[%s]", + "ORG_ZSTACK_TICKET_10000": "ticket[uuid:%s, name:%s] can only be updated after it has been cancelled; current status is %s", + "ORG_ZSTACK_TICKET_10001": "operation denied. the operation needs to be performed by account/virtual ID[uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10017": "get token from SDN controller [IP:%s] failed to retrieve data", + "ORG_ZSTACK_MEVOCO_10086": "VM[uuid:%s] has ceased operation. Please retry later.", + "ORG_ZSTACK_STORAGE_BACKUP_10056": "Current VM[UUID: %s] of the volume[UUID: %s] is no longer the VM[UUID: %s] that was used for backup", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10003": "Cannot execute map LUN to host flow because PS host reference metadata is empty. Please check the host configuration and ensure that the necessary metadata is populated.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10018": "get token from sdn controller [ip:%s] failed because %s", + "ORG_ZSTACK_MEVOCO_10085": "Cannot find snapshots from volume UUID [uuid: %s]. Maybe no snapshot chain requires validation.", + "ORG_ZSTACK_STORAGE_BACKUP_10055": "root volume snapshot of group[uuid:%s] not found", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10000": "Cannot execute mapping logical unit to host due to null backend device.%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10015": "could not delete Huawei Logical Router [UUID:%s] because it is associated with L3 Network [UUID:%s]", + "ORG_ZSTACK_MEVOCO_10084": "cannot find the latest snapshot from volume [uuid: %s]. Maybe no snapshot chain exists for validation.", + "ORG_ZSTACK_STORAGE_BACKUP_10054": "No backup volume found for group UUID: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10016": "get token of SDN controller [IP:%s] failed", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10001": "Cannot execute map LUN to host flow because PS host reference is null. Please ensure that the host reference is properly set.", + "ORG_ZSTACK_MEVOCO_10083": "cannot find the specified snapshot in the volume\u0027s [UUID: %s] snapshot tree. Maybe there is no snapshot chain that needs to be validated.", + "ORG_ZSTACK_STORAGE_BACKUP_10053": "The resource[uuid: %s] has already initiated a CDP task; therefore, a backup job cannot be created simultaneously.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10006": "KVM host [UUID: %s] fails to be added to block primary storage [UUID: %s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10009": "port forwarding rule[uuid:%s] is not enabled, current state is %s. A rule can only be attached when its state is enabled.", + "ORG_ZSTACK_STORAGE_BACKUP_10052": "Failed to create backups for VM[uuid:%s], as it is not in a state of[%s, %s]", + "ORG_ZSTACK_MEVOCO_10089": "Cannot take a snapshot for volumes[%s] as volume[UUID: %s] is defined multiple times", + "ORG_ZSTACK_STORAGE_BACKUP_10051": "Volume[uuid:%s] is not a root volume", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10019": "delete token of SDN controller [IP:%s] failed because %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10004": "Cannot execute volume mapping to host flow due to invalid volume ID.%s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10007": "port forwarding rule [uuid:%s] has not been attached to any virtual machine network interface, cannot detach", + "ORG_ZSTACK_MEVOCO_10088": "cannot take a snapshot for volumes[%s] when volume[uuid: %s] is not attached", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10005": "Cannot execute map LUN to host flow due to invalid LUN type: %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10008": "port forwarding rule [uuid:%s] has been associated with vm nic [uuid:%s], cannot be reassigned again", + "ORG_ZSTACK_MEVOCO_10087": "A Running VM[uuid:%s] has no associated Host UUID.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10020": "get tenant of SDN controller [IP:%s] failed", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10021": "get tenant of SDN controller [IP:%s] failed because %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10019": "the block primary storage [uuid:%s, name:%s] cannot find any available host within the attached clusters for volume instantiation", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10024": "Retrieve logical switch port from SDN controller [IP:%s] failed", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10047": "cannot attach the data volume [uuid:%s] to the VM [uuid:%s]. Both the VM\u0027s root volume and the data volume are located on local primary storage but reside on different hosts. The root volume [uuid:%s] is hosted on host [uuid:%s], whereas the data volume [uuid:%s] is hosted on host [uuid:%s].", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10025": "get switch port information from sdn controller [ip:%s] failed because %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10048": "The data volume [name: %s, UUID: %s] is located on local storage [UUID: %s]; however, the host where the data volume resides has been deleted. Recovery of this volume is not possible.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10022": "get switch device of SDN controller [ip:%s] failed", + "ORG_ZSTACK_STORAGE_BACKUP_10069": "The VM is currently creating a backup job and cannot have a CDP task enabled simultaneously. Please ensure that all backup jobs are completed before enabling CDP.", + "ORG_ZSTACK_KVM_10070": "failed to terminate virtual machine[uuid:%s name:%s] on KVM host[uuid:%s, ip:%s], due to %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10049": "unable to recover the vm[uuid:%s, name:%s]. The vm\u0027s root volume is located on local storage[uuid:%s]; however, the host where the root volume resides has been deleted.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10023": "get switch device of SDN controller [IP:%s] failed because %s", + "ORG_ZSTACK_STORAGE_BACKUP_10068": "The host cluster [uuid: %s] is not co-located with the volume cluster [uuid: %s]. Please ensure that the primary storage is within the same cluster.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10020": "The VM [Name: %s UUID: %s] already has port forwarding rules with different VIPs than the one [UUID: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10044": "creation relies on image cache [uuid: %s, located host uuids: [%s]], cannot create elsewhere.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10045": "local storage does not support live migration for hypervisor[%s]", + "ORG_ZSTACK_KVM_10075": "failed to stop vm[uuid:%s name:%s] on kvm host[uuid:%s ip:%s], because %s", + "ORG_ZSTACK_KVM_10078": "host[uuid:%s] does not have sufficient capacity to allocate cpu[%s] and memory[%s bytes].", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10017": "VIP port range [vipStartPort:%s, vipEndPort:%s] overlaps with network rule [uuid:%s, vipStartPort:%s, vipEndPort:%s]", + "ORG_ZSTACK_KVM_10069": "failed to attach data volume[uuid:%s, installPath:%s] to vm[uuid:%s, name:%s] on KVM host[uuid:%s, ip:%s], because %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10014": "invalid CIDR[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10015": "invalid CIDR[%s], only IPv4 addresses are supported", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10012": "could not create port forwarding rule, because the VIP port range [vipStartPort:%s, vipEndPort:%s] is incompatible with the private port range [privateStartPort:%s, privateEndPort:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10010": "cannot find SCSI LUN for volume list:%s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10013": "for range-based port forwarding, the port range sizes must match; vip range [%s, %s]\u0027s size does not match [%s, %s]\u0027s size", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10010": "guest l3 network of VM NIC and VIP l3 network of port forwarding rule are the same network (uuid: %s, uuid: %s)", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10028": "get fabric of SDN controller [ip:%s] failed", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10013": "The operation to take volume snapshots on multiple hosts simultaneously when Ceph is involved is not supported.", + "ORG_ZSTACK_MEVOCO_10097": "The provided Java code snippet is missing its source file. Please ensure all necessary files are included and recompile. Additionally, the error message \"unknown message version\" indicates an unsupported or unrecognized message format. Please check the message version and ensure it is compatible with the system.", + "ORG_ZSTACK_STORAGE_BACKUP_10067": "No available object storage bucket found for backup operations. Please ensure that your object storage service is properly configured and accessible within the cloud environment.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10014": "Failed to map LUN to host before attaching volume to VM", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10029": "get fabric network from SDN controller [ip:%s] failed because %s", + "ORG_ZSTACK_MEVOCO_10096": "non-admin account cannot exceed maximum bandwidth limit of %s", + "ORG_ZSTACK_STORAGE_BACKUP_10066": "VM is not in stopped state: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10026": "get VPC of SDN controller [IP:%s] failed", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10011": "fail to exchange block SCSI LUN information:%s", + "ORG_ZSTACK_MEVOCO_10095": "SetVolumeQosMsg version 1 is deprecated in cloud computing environments; please migrate to version 2 for optimal performance and compatibility.", + "ORG_ZSTACK_STORAGE_BACKUP_10065": "VM not found with volume backup [uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10027": "get VPC of SDN controller [IP:%s] failed because %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10012": "fail to clean up resources after detaching volume because %s", + "ORG_ZSTACK_MEVOCO_10094": "Cannot delete VM\u0027s volume QoS on host %s because the current VM is in state of %s, but supported states are [%s, %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10064": "original volume[uuid:%s] for backup[uuid:%s] is no longer attached to virtual machine[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10063": "original snapshot for backup[uuid:%s] has been deleted, cannot revert volume to it", + "ORG_ZSTACK_MEVOCO_10099": "Non-admin account is only allowed to set the total %s limit for virtual resources.", + "ORG_ZSTACK_STORAGE_BACKUP_10061": "volume backup [uuid:%s] is currently in state %s and cannot be used for volume restoration.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10016": "primaryStorageUuid is mandatory when downloading image cache.", + "ORG_ZSTACK_MEVOCO_10098": "Unknown Quality of Service (QoS) limit type specified. Please ensure the QoS limit type is correctly configured.", + "ORG_ZSTACK_STORAGE_BACKUP_10060": "cannot create VM from volume backup [uuid:%s] which is not a root volume backup", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10017": "The VM has multiple local volumes on different hosts [%s]. Please check for abnormal VM local volumes.", + "ORG_ZSTACK_STORAGE_CEPH_10004": "invalid monitoring URL[%s], hostname cannot be null. A valid monitoring URL format is %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10032": "get iMaster Logical Switch [%s] no response", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10018": "The volume on a host [Host UUID: %s] cannot be attached to the VM because the VM has local volumes on other hosts [Host UUID: %s].", + "ORG_ZSTACK_STORAGE_CEPH_10005": "invalid monitoring URL[%s], the SSH port is out of valid range (1-65535). A valid monitoring URL should be in the format of %s.", + "ORG_ZSTACK_STORAGE_CEPH_10002": "invalid monitoring URL[%s], the SSH username:SSH password component is invalid. A valid monitoring URL format is %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10030": "create Huawei iMaster Logical Switch [%s] failed due to %s", + "ORG_ZSTACK_STORAGE_CEPH_10003": "invalid monitoring URL[%s]. SSH username and password must be separated by \u0027:\u0027 and cannot be empty. A valid monitoring URL format is %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10035": "[%s] Huawei iMaster Virtual Switch Port [%s] failed because %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10013": "The two clusters with UUIDs %s and %s cannot communicate within the L2 network when migrating VM with UUID %s to another cluster.", + "ORG_ZSTACK_STORAGE_CEPH_10008": "Ceph pool with UUID:%s already exists and is in use elsewhere within the ZStack environment; therefore, it cannot be reused.", + "ORG_ZSTACK_STORAGE_BACKUP_10038": "invalid url[%s], should be in the format of hostname:/path", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10036": "get logical switch port information for logical switch[%s] failed because %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10014": "the URL[%s] is not a valid absolute path starting with \u0027/\u0027. Please ensure it begins with \u0027http://\u0027 or \u0027https://\u0027.", + "ORG_ZSTACK_STORAGE_CEPH_10009": "cannot add Ceph primary storage as it is currently in use by MON hosts [%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10037": "invalid mount type[%s], should be [NFS, SSHFS, NBD]", + "ORG_ZSTACK_STORAGE_CEPH_10006": "operation failure: the pool name can not include unprintable ASCII characters [poolName:%s]", + "ORG_ZSTACK_KVM_10080": "When the VM platform is Other, the number of dataVolumes and cdroms cannot exceed 3; currently %s.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10033": "delete Huawei iMaster Virtual Switch [%s] failed because %s", + "ORG_ZSTACK_STORAGE_BACKUP_10036": "degree [%s] should be a positive integer value", + "ORG_ZSTACK_STORAGE_CEPH_10007": "creation failure, duplicate pool name[%s]. A pool with the same name already exists[uuid:%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10016": "The host of the virtual machine [hostUuid:%s] is different from that of the volume [hostUuid:%s]. The volume cannot be attached to the virtual machine.", + "ORG_ZSTACK_STORAGE_BACKUP_10035": "[%s] is not a standard CIDR, did you mean [%s]?", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10034": "update Huawei iMaster Logical Switch [%s] failed because %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10010": "The volume with UUID [%s] is the root volume of the VM with UUID [%s]. Currently, the VM still has %s data volumes attached; please detach them before migration.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10011": "The volume [UUID:%s] is the root volume of the VM [UUID:%s]. Currently, the virtual machine still has an ISO attached; please detach it before migration.", + "ORG_ZSTACK_KVM_10088": "failed to check physical network interfaces[names: %s] on KVM host[UUID:%s, IP:%s]", + "ORG_ZSTACK_KVM_10079": "Host[%s] update Spice channel configuration failed because %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10021": "volume: %s is not attached, failed to create image cache for volume", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10024": "fail to find installation path for downloading volume: %s, please prepare it before proceeding", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10039": "delete Huawei iMaster NCE Logical Router[%s] failed, because %s", + "ORG_ZSTACK_MEVOCO_10064": "networkInboundBandwidthFormatError %s", + "ORG_ZSTACK_STORAGE_BACKUP_10034": "Volume backup [uuid:%s] not found on any storage medium", + "ORG_ZSTACK_MEVOCO_10063": "network inbound bandwidth exceeds the maximum allowed value of 32 Gbps", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10025": "fail to find a host to download volume %s", + "ORG_ZSTACK_STORAGE_BACKUP_10033": "No permission to volume backups within group UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10022": "cannot find destination host for volume: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10037": "delete Huawei iMaster Virtual Switch Port [%s] failed because %s", + "ORG_ZSTACK_STORAGE_BACKUP_10032": "Multiple root disks found within group uuid: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10023": "Failed to find a host to map for volume %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10038": "create Huawei iMaster Virtual Router[%s] failed, because %s", + "ORG_ZSTACK_MEVOCO_10061": "management node status is not %s", + "ORG_ZSTACK_STORAGE_BACKUP_10031": "Root volume missing within group UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10026": "Fail to retrieve host initiator reference, please reconnect this host: %s", + "ORG_ZSTACK_MEVOCO_10066": "networkOutboundBandwidthFormatError %s", + "ORG_ZSTACK_MEVOCO_10065": "network outbound bandwidth exceeds the maximum value of 32 Gbps", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10042": "create Huawei IMaster subnet[%s] failed, because %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10028": "failed to download image[uuid:%s] to all hosts in the local storage[uuid:%s]. %s", + "ORG_ZSTACK_STORAGE_CEPH_10015": "invalid monUrl[%s]. A valid URL should be in the format of %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10043": "delete Huawei iMaster subnet[%s] failed, because %s", + "ORG_ZSTACK_STORAGE_CEPH_10016": "dataVolumePoolName can be null but must not be an empty string.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10040": "create Huawei iMaster virtual network link[%s] failed, because %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10041": "delete Huawei iMaster virtual network link[%s] failed, because %s", + "ORG_ZSTACK_STORAGE_CEPH_10019": "cannot add Ceph backup storage as there is already a Ceph backup storage using mon[hostnames:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10046": "No new virtual network interface has been established, which should not occur.", + "ORG_ZSTACK_MEVOCO_10082": "Failed to set I/O thread [%d] pin [%s] on virtual machine [%s]: %s.", + "ORG_ZSTACK_STORAGE_BACKUP_10049": "Failed to create volume backup for volume[uuid:%s], because its attached volume is not in a state of[%s, %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10025": "The primary storage [UUID:%s] is disabled; cold migration is not permitted.", + "ORG_ZSTACK_STORAGE_BACKUP_10048": "Failed to create volume backup for volume[uuid:%s], because the VM is not in state[%s, %s]", + "ORG_ZSTACK_STORAGE_CEPH_10017": "rootVolumePoolName can be null but must not be an empty string.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10026": "volume[uuid:%s] is no longer attached to the local storage, it may have been deleted or detached", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10044": "get system information of SDN controller [IP:%s] failed", + "ORG_ZSTACK_STORAGE_BACKUP_10047": "Failed to create volume backup for volume[uuid:%s], as it is not attached to any VM instance", + "ORG_ZSTACK_STORAGE_CEPH_10018": "imageCachePoolName can be null but must not be an empty string", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10045": "get system info of SDN controller [IP:%s] failed due to %s", + "ORG_ZSTACK_STORAGE_BACKUP_10046": "Cannot create volume backup for shareable volume[uuid:%s]", + "ORG_ZSTACK_KVM_10093": "unable to connect to KVM host[uuid:%s, ip:%s, url:%s], due to %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10022": "To create a volume on the local primary storage, you must specify the host where the volume will be created using the system tag [%s].", + "ORG_ZSTACK_KVM_10096": "host cannot access any primary storage, please check your storage configuration or contact support for assistance %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10023": "Invalid URI format. Correct examples include file://$URL, hostUuid://$HOSTUUID, or volume://$VOLUMEUUID.", + "ORG_ZSTACK_STORAGE_CEPH_10012": "The same Mono node cannot be added multiple times.", + "ORG_ZSTACK_KVM_10099": "the host[%s] SSH port[%s] is unreachable after %s seconds, connect timeout", + "ORG_ZSTACK_STORAGE_CEPH_10010": "Cannot add the same host [%s] to the cluster mons", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10031": "backing up snapshots to backup storage is a deprecated feature and is not supported on block primary storage.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10032": "fail to find cluster for commit volume on ps:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10035": "primary storage UUID is mandatory when deleting LUN", + "ORG_ZSTACK_MEVOCO_10075": "Shareable disks currently only support virtio-scsi type.", + "ORG_ZSTACK_STORAGE_BACKUP_10045": "Unexpected backup storage[type:%s,uuid:%s] detected", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10036": "host UUID is mandatory when retrieving the host initiator name", + "ORG_ZSTACK_MEVOCO_10074": "Shareable Volume[uuid:%s] has already been attached to Virtual Machine[uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10048": "No new virtual network interface created, this should not occur.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10033": "fail to find host for commit volume:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10034": "failed to download[%s] from Backup Storage[hostname:%s] to Block Primary Storage[uuid:%s, path:%s], %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10049": "there is no SDN fabric configured on controller [ip:%s]", + "ORG_ZSTACK_MEVOCO_10078": "The current license version does not support modifying this resource configuration [name:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10037": "initiatorName %s is being used by another host, please regenerate the initiator for host %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10038": "failed to find volume template by name:%s", + "ORG_ZSTACK_MEVOCO_10076": "shareable volume(s) [UUID: %s] attached; group snapshot is not supported.", + "ORG_ZSTACK_AI_MESSAGE_10002": "Cannot cancel dataset creation job because the resource UUID[%s] or model center UUID[%s] is null", + "ORG_ZSTACK_AI_MESSAGE_10001": "Cannot cancel model service download task because the resource UUID[%s] or model center UUID[%s] is null", + "ORG_ZSTACK_IPSEC_VYOS_10009": "apply to HA group failed because %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10013": "Failed to perform HTTP calls to all Prometheus instances in the cloud environment.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10012": "unknown data type %s for key \u003d %s", + "ORG_ZSTACK_ENCRYPT_10000": "failed to parse API message: cannot parse encryption parameter with type %s", + "ORG_ZSTACK_ENCRYPT_10002": "failed to parse API message: found %d encryption parameters system tags, expect 1", + "ORG_ZSTACK_IPSEC_VYOS_10001": "VYOS does not support AES-192 as an IKE Encryption Algorithm; available options include AES-128 and AES-256.", + "ORG_ZSTACK_IPSEC_VYOS_10000": "the remote CIDR [%s] overlaps with the Virtual Router interface CIDR [%s]", + "ORG_ZSTACK_IPSEC_VYOS_10003": "vyos does not support %d as IKE DH Group", + "ORG_ZSTACK_IPSEC_VYOS_10002": "vyOS does not support AES-192 as the PolicyEncryptionAlgorithm; available options are AES-128 and AES-256, as well as 3DES.", + "ORG_ZSTACK_COMPUTE_VM_10000": "state of VM[uuid:%s] is not in Running state; therefore, clock synchronization cannot be performed.", + "ORG_ZSTACK_COMPUTE_VM_10008": "vm[uuid:%s] is part of cluster[uuid:%s], but there are no available hosts within the cluster. Therefore, the image change for this vm cannot be processed.", + "ORG_ZSTACK_COMPUTE_VM_10007": "vm[uuid:%s] cluster UUID is null, cannot change image for it", + "ORG_ZSTACK_COMPUTE_VM_10006": "VM\u0027s state is not Stopped: %s. The \u0027changevmimage\u0027 action cannot be performed.", + "ORG_ZSTACK_COMPUTE_VM_10005": "xml hook with UUID: %s attached to VM with UUID: %s successfully, but failed to restart the VM. Details: %s", + "ORG_ZSTACK_COMPUTE_VM_10004": "xml hook with UUID: %s has been successfully detached from VM with UUID: %s, but encountered issues during VM restart. Details: %s", + "ORG_ZSTACK_COMPUTE_VM_10003": "Hot-adding is not disabled; please ensure NUMA configuration is set before opening the virtual machine.", + "ORG_ZSTACK_COMPUTE_VM_10011": "The direction parameter must be set to IN or OUT.", + "ORG_ZSTACK_COMPUTE_VM_10010": "cannot find backup storage, unable to commit volume snapshot[psUuid:%s] as image, destination required PS UUID:%s", + "ORG_ZSTACK_COMPUTE_VM_10018": "State validation failed during password change operation.%s", + "ORG_ZSTACK_COMPUTE_VM_10017": "not destination host found in database by UUID: %s, cannot send change password command to the host!", + "ORG_ZSTACK_STORAGE_DEVICE_10036": "hba scan failed: %s", + "ORG_ZSTACK_COMPUTE_VM_10015": "vm [%s]\u0027s host UUID is null, cannot synchronize network quality of service", + "ORG_ZSTACK_COMPUTE_VM_10014": "vm [%s] must be in a Running or Paused state to synchronize NIC QoS settings", + "ORG_ZSTACK_STORAGE_DEVICE_10031": "vm instance[uuid: %s] host[uuid: %s] failed to attach scsi lun[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10013": "outboundBandwidth must be set no more than %s.", + "ORG_ZSTACK_COMPUTE_VM_10012": "inboundBandwidth must be set no more than %s Gbps.", + "ORG_ZSTACK_STORAGE_DEVICE_10030": "vm instance[%s] state [%s] is not in an allowed state for the specified operation[%s]", + "ORG_ZSTACK_COMPUTE_VM_10022": "Failed to set security level because security features are disabled. Please ensure that security features are enabled before making this configuration.", + "ORG_ZSTACK_COMPUTE_VM_10020": "The number of data volumes exceeds the specified limit [num: %s]. Please reduce the number of data volumes when creating the virtual machine.", + "ORG_ZSTACK_STORAGE_DEVICE_10028": "specified SCSI LUN [WWID: %s] does not exist or is disabled", + "ORG_ZSTACK_STORAGE_DEVICE_10029": "scsi[%s] lun[wwid:%s] has been attached to vm[%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10026": "Different iSCSI configurations were found on host [UUID:%s, targets:%s] and host [UUID:%s, targets:%s].", + "ORG_ZSTACK_STORAGE_DEVICE_10027": "Different disk types are found across hosts for LUN [serial:%s], unable to attach it to the cluster.", + "ORG_ZSTACK_COMPUTE_VM_10029": "could not clone VM because a prefix is specified for network[uuid:%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10024": "SCSI LUN [%(s)s] record not found on host [%(s)s]", + "ORG_ZSTACK_COMPUTE_VM_10028": "could not clone vm because the IPv6 address[%s] is not valid", + "ORG_ZSTACK_STORAGE_DEVICE_10025": "unexpected hypervisor type[%s] for virtual machine host [%s]", + "ORG_ZSTACK_COMPUTE_VM_10027": "could not clone VM because a netmask is specified for network[uuid:%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10022": "different NVMe targets were found on host[hostUuid:%s, targets:%s] and host[hostUuid:%s, targets:%s]", + "ORG_ZSTACK_COMPUTE_VM_10026": "could not clone vm because the specified IP address[%s] is invalid", + "ORG_ZSTACK_STORAGE_DEVICE_10023": "SCSI LUN[%s] is attached to virtual machine [%s]", + "ORG_ZSTACK_COMPUTE_VM_10025": "could not clone VM because Layer 3 network[uuid:%s] is not found", + "ORG_ZSTACK_STORAGE_DEVICE_10020": "vm instance[%s] state[%s] is not in an allowed state for the operation[%s]", + "ORG_ZSTACK_COMPUTE_VM_10024": "Unknown security level code[%s], supported values are [0-7]", + "ORG_ZSTACK_STORAGE_DEVICE_10021": "vm instance[%s] failed to attach scsi lun[uuid: %s] on host[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10023": "Cannot set security level to not enable VM [uuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10002": "The current primary storage %s does not have a third-party token configured, and therefore a block volume cannot be created temporarily.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10001": "invalid allocated virtual resource URL:%s", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10000": "URL allocation failed. Please ensure the URL is correct and available. If the issue persists, contact support for further assistance.", + "ORG_ZSTACK_STORAGE_DEVICE_10017": "scsi lun[wwid:%s] has been attached to vm[%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10015": "scisLun[uuids:%s] are not attached to the cluster of host[uuid:%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10016": "please unmount all block devices associated with the VM[%s] and try again", + "ORG_ZSTACK_STORAGE_DEVICE_10014": "scsi lun[wwid: %s] has been attached to virtual machine instance %s", + "ORG_ZSTACK_STORAGE_DEVICE_10011": "iSCSI server [UUID: %s] is not associated with cluster [UUID: %s]", + "ORG_ZSTACK_STORAGE_DEVICE_10012": "iSCSI server [UUID: %s] is still associated with cluster [UUID: %s]", + "ORG_ZSTACK_STORAGE_DEVICE_10010": "iSCSI server [UUID: %s] is already attached to cluster [UUID: %s]", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10008": "local CIDR and remote CIDR must be valid Cidr ranges!", + "ORG_ZSTACK_NETWORK_SERVICE_HEADER_NFVINSTGROUP_10000": "Querying the cluster status is not supported for this NFV instance type.", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10001": "VPN Gateway [%s] exists, cannot delete remotely.", + "ORG_ZSTACK_STORAGE_DEVICE_10008": "iSCSI server [IP: %s, Port: %s] already exists", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10005": "%s is not a valid IPv4 address for cloud deployment configurations", + "ORG_ZSTACK_STORAGE_DEVICE_10009": "iSCSI server IP: %s is not valid", + "ORG_ZSTACK_STORAGE_DEVICE_10006": "NVMe server with UUID: %s is already attached to cluster with UUID: %s", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10007": "remote CIDR must be a valid CIDR notation!", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10006": "localCidr must be a valid Cidr!", + "ORG_ZSTACK_STORAGE_DEVICE_10004": "NVMe server [ip: %s, port: %s, transport: %s] already exists in the cloud environment.", + "ORG_ZSTACK_STORAGE_DEVICE_10005": "NVMe server IP: %s is invalid", + "ORG_ZSTACK_STORAGE_DEVICE_10003": "do not support migration of VM[uuid:%s] with shared storage", + "ORG_ZSTACK_STORAGE_DEVICE_10000": "scsi lun with uuid: %s and uuid: %s do not share a common host", + "ORG_ZSTACK_STORAGE_DEVICE_10001": "scsi lun [uuid: %s] is in disabled state", + "ORG_ZSTACK_ALIYUN_NETWORK_VPN_10000": "VPN gateway and user gateway must be in the same data center.", + "ORG_ZSTACK_IPSEC_VYOS_10016": "create ipsec to ha route failed because %s", + "ORG_ZSTACK_IPSEC_VYOS_10015": "delete ipsec from ha group failed because %s", + "ORG_ZSTACK_COMPUTE_BONDING_10001": "interface has already been created on host", + "ORG_ZSTACK_COMPUTE_BONDING_10008": "bonding card can not have interfaces in a bond with different speeds on the host[%s].", + "ORG_ZSTACK_COMPUTE_BONDING_10007": "cannot have an interface[%s] in a bond that has been SRIOV virtualized.", + "ORG_ZSTACK_COMPUTE_BONDING_10006": "cannot have interfaces in a bond that has been used as a network bridge, which was already used by host[%s].", + "ORG_ZSTACK_COMPUTE_BONDING_10005": "cannot have occupied interfaces in a bond that is already being used by host[%s].", + "ORG_ZSTACK_IPSEC_VYOS_10012": "update ipsec version failed because:vpc[%s] does not exist", + "ORG_ZSTACK_COMPUTE_BONDING_10009": "there is no slave network interface on the host[uuid:%s]", + "ORG_ZSTACK_IPSEC_VYOS_10013": "sync to HA group failed because:%s", + "ORG_ZSTACK_MEVOCO_10105": "Non-administrator account cannot set the read/write %s limits greater than: %s/%s", + "ORG_ZSTACK_SIMULATOR_10002": "Instance set to disconnected state", + "ORG_ZSTACK_MEVOCO_10104": "Non-admin account cannot set the write [storage limit] as unlimited.", + "ORG_ZSTACK_MEVOCO_10103": "Non-admin account cannot set the read I/O limits as unlimited.", + "ORG_ZSTACK_MEVOCO_10102": "Non-administrative account is only permitted to configure read/write %s limits.", + "ORG_ZSTACK_MEVOCO_10109": "vm [%s]\u0027s host UUID is null, cannot sync volume quality of service", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10016": "FiSecClientFactory connection test failed", + "ORG_ZSTACK_MEVOCO_10108": "vm [%s] must be in a Running or Paused state to synchronize volume quality of service", + "ORG_ZSTACK_MEVOCO_10107": "volume [%s] is not attached to any virtual machine (or the virtual machine does not exist), cannot sync volume quality of service", + "ORG_ZSTACK_SIMULATOR_10004": "The error \"on purpose\" indicates an intentional action rather than a system failure. Please provide more details on the intended purpose to proceed.", + "ORG_ZSTACK_MEVOCO_10106": "volume [%s] is not attached to any virtual machine; therefore, quality of service (QoS) cannot be retrieved through forceSync.", + "ORG_ZSTACK_MEVOCO_10101": "Non-administrator account cannot set the total %s limit greater than: %s", + "ORG_ZSTACK_MEVOCO_10100": "Non-admin account cannot set the total %s limits to infinity.", + "ORG_ZSTACK_COMPUTE_BONDING_10011": "Cannot bind with interface configured with VTEP IP address. Please ensure the VTEP IP is correctly configured and reachable.", + "ORG_ZSTACK_COMPUTE_BONDING_10010": "Cannot bind with interface corresponding to the management network. Please ensure that the virtual network interface is correctly configured and corresponds to the specified management network.%s", + "ORG_ZSTACK_COMPUTE_BONDING_10015": "bonding card cannot have an interface[%s] that has been SR-IOV virtualized", + "ORG_ZSTACK_COMPUTE_BONDING_10014": "bonding card cannot have interfaces that have been used as a network bridge, which was already used by host[%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10013": "bonding card cannot have occupied interfaces which were already used by host[%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10012": "cannot have interfaces in a bond that is not on the same host[%s].", + "ORG_ZSTACK_COMPUTE_BONDING_10019": "[bonding] can not have [%s] interfaces, it must be between 1 and 2", + "ORG_ZSTACK_COMPUTE_BONDING_10018": "[bonding card] can not have [number of interfaces] set to [%s], it must be a number between [1~8].", + "ORG_ZSTACK_COMPUTE_BONDING_10017": "[%s] bonding interface can not specify a different xmit_hash_policy, only mode 802.3ad supports specifying a different policy.", + "ORG_ZSTACK_COMPUTE_BONDING_10016": "bonding card cannot have interfaces with different speeds on the host[%s]", + "ORG_ZSTACK_MEVOCO_10113": "Volume[UUID:%s] utilizes vhost-user protocol, which is incompatible with native asynchronous I/O. Please disable aio.native or select a different volume protocol.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10003": "failed to establish connection to secret resource pool[uuid: %s]", + "ORG_ZSTACK_MEVOCO_10112": "The current license version does not support modifying this global configuration [name:%s].", + "ORG_ZSTACK_MEVOCO_10111": "failed to detach shareable volume from VMInstance: [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10005": "%s client initialization failed: the secret resource pool property is invalid.", + "ORG_ZSTACK_MEVOCO_10110": "failed to detach shareable volume[uuid:%s] from Instance[uuid:%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10006": "Plugin (UUID: %s) cannot be deleted because it is associated with the following secret resource pools: [%s].", + "ORG_ZSTACK_MEDIATOR_10005": "the VIP [UUID:%s] is already bound to another service [%s].", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10007": "organization ID[uuid:%s] already has operation attributes, cannot add %s", + "ORG_ZSTACK_MEDIATOR_10006": "Current port range [%s, %s] is conflicted with system service port range [%s, %s] for VIP [UUID: %s] protocol: %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10008": "cannot find zone with uuid:%s", + "ORG_ZSTACK_MEDIATOR_10007": "Current port range [%s, %s] is conflicted with used port range [%s, %s] for VIP [UUID: %s] protocol: %s", + "ORG_ZSTACK_COMPUTE_VM_10080": "vm[uuid:%s] CD-ROM device ID repetition", + "ORG_ZSTACK_COMPUTE_VM_10077": "VM[uuid:%s] has attached ISO[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10074": "reserved memory[%s] exceeds the available memory size[%s]", + "ORG_ZSTACK_COMPUTE_VM_10073": "Unexpected CPU and memory settings. Please ensure that the specified values are compatible with your instance type and requirements.", + "ORG_ZSTACK_COMPUTE_VM_10071": "failed to find host for vm[uuid\u003d%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10000": "virtual ID[uuid:%s] already has attributes related to administration; therefore, it cannot be assigned %s.", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10000": "identity zone [%s] already exists, uuid: %s", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10001": "regionId: [%s] is not a valid Aliyun and ZStack region, please choose another one", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10002": "type [%s] does not match the expected data center type [%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10003": "project[uuid:%s] already has a designated project administrator", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10003": "either data center UUID or region ID should be set, please check the parameters.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10004": "project[uuid:%s] does not exist", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10004": "Identity Zone [%s] is still synchronizing, please wait.", + "ORG_ZSTACK_COMPUTE_VM_10079": "there is no available IP range on L3 network [%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10005": "virtual ID [UUID:%s] already has a project operator attribute assigned.", + "ORG_ZSTACK_COMPUTE_VM_10078": "All VM[UUID:%s] CD-ROMs have mounted ISO images", + "ORG_ZSTACK_COMPUTE_VM_10090": "Failed to instantiate volume because the VM\u0027s host [UUID: %s] and allocated primary storage [UUID: %s] are not connected.", + "ORG_ZSTACK_COMPUTE_VM_10088": "vm current state[%s], modifying virtio requires vm to be in state[%s]", + "ORG_ZSTACK_COMPUTE_VM_10084": "cannot find ISO [UUID:%s] in any connected backup storage associated with the zone [UUID:%s]. Please verify the following:\n1. Ensure the backup storage is attached to the correct zone where the VM [NAME: %s, UUID:%s] is running.\n2. Confirm the backup storage is in an active state; if not, attempt to reconnect it.", + "ORG_ZSTACK_COMPUTE_VM_10083": "none of the specified primary storage%s are available", + "ORG_ZSTACK_COMPUTE_VM_10081": "creation relies on image cache[uuid:%s, located ps uuids: [%s]], cannot create elsewhere.", + "ORG_ZSTACK_KVM_HYPERVISOR_10000": "Failed to collect host virtualization information", + "ORG_ZSTACK_COMPUTE_VM_10099": "Unable to switch to L3 network. The L3 network [uuid:%s] belongs to L2 networks [uuids:%s] that have not been attached to any cluster.", + "ORG_ZSTACK_COMPUTE_VM_10098": "Unable to switch to L3 network. The specified L3 network [uuid:%s] belongs to a different L2 network [uuids:%s].", + "ORG_ZSTACK_COMPUTE_VM_10097": "unable to switch to L3 network. The specified L3 network [uuid:%s] does not have an IP range configured.", + "ORG_ZSTACK_COMPUTE_VM_10096": "unable to switch to L3 network. The VM [uuid: %s] is not in a Running or Stopped state; the current state is %s", + "ORG_ZSTACK_COMPUTE_VM_10094": "could not change to L3 network; the L2 of L3 [uuid:%s, %s] uses a different vSwitch.", + "ORG_ZSTACK_COMPUTE_VM_10093": "either l3NetworkUuids or backupStorageUuid must be specified", + "ORG_ZSTACK_COMPUTE_VM_10092": "Cannot capture a screenshot of VM [uuid:%s] which is not in a Running state.", + "ORG_ZSTACK_MEDIATOR_10002": "unable to attach a Layer 3 network. The CIDR of L3 network [%s] to attach overlaps with the CIDR of L3 network [%s] already attached to the VM", + "ORG_ZSTACK_MEDIATOR_10003": "the VM[name:%s, UUID:%s] already has some port forwarding rules%s configured", + "ORG_ZSTACK_MEDIATOR_10004": "the VM[name:%s, uuid:%s] already has some Elastic IP addresses%s attached", + "ORG_ZSTACK_COMPUTE_VM_10033": "could not clone VM because default L3 UUIDs size is not 1", + "ORG_ZSTACK_COMPUTE_VM_10032": "could not clone vm because state[%s] is not valid", + "ORG_ZSTACK_COMPUTE_VM_10031": "could not clone vm because driver type[%s] is not valid", + "ORG_ZSTACK_COMPUTE_VM_10030": "could not clone vm because NicType[%s] is not valid", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10002": "Found related trash paths (%s) in Primary Storage [%s] for the migration installPath [%s]. Please clean them first using \u0027APICleanUpTrashOnPrimaryStorageMsg\u0027 if you insist on migrating volume [%s].", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10000": "Cannot find a connected host to perform the storage migration operation. Please ensure that the target host is available and properly configured in the cloud environment.", + "ORG_ZSTACK_COMPUTE_VM_10039": "The operation is only permissible on a user VM instance.", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10003": "volume[uuid:%s] has a dependency on image[uuid:%s], other dependencies include images[%s]", + "ORG_ZSTACK_COMPUTE_VM_10038": "The network interface %s is not attached to the VM", + "ORG_ZSTACK_COMPUTE_VM_10037": "There are insufficient capacity resources for VM cloning to VM [UUID: %s], volumes [UUID: %s] on primary storage [UUID: %s]. Required capacity is %s bytes, while the current available capacity is %s bytes.", + "ORG_ZSTACK_COMPUTE_VM_10036": "fast create VM only supports cloning data volume on the same primary storage [UUID: %s] as the original VM [UUID: %s].", + "ORG_ZSTACK_COMPUTE_VM_10035": "fast create VM only supports cloning the root volume on the same primary storage [UUID: %s] as the original VM [UUID: %s].", + "ORG_ZSTACK_COMPUTE_VM_10034": "The operation is only allowed on user VM instances.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10005": "If the cluster type is baremetal, the hypervisor type must also be baremetal; conversely, if the hypervisor type is baremetal, the cluster type must be baremetal.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10008": "There are hosts in the cluster [uuid:%s] in the Pre-Maintenance state; therefore, updating the OS is not possible at this time.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10009": "Not all hosts in the cluster [uuid:%s] are in the Active state; therefore, cluster operating system rights cannot be updated at this time.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10006": "Only KVM-based virtual machines\u0027 operating systems can be updated at this time.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10007": "The host [UUID: %s] is not a member of the cluster [UUID: %s]. Please verify the host UUID and ensure it belongs to this cluster.", + "ORG_ZSTACK_COMPUTE_VM_10044": "Do not modify the VM image when it is not in a stopped state.", + "ORG_ZSTACK_COMPUTE_VM_10043": "user has no privilege to change the image of VM %s", + "ORG_ZSTACK_COMPUTE_VM_10042": "clean traffic is not supported for VM type [%s]", + "ORG_ZSTACK_COMPUTE_VM_10041": "Duplicate MAC address [%s]", + "ORG_ZSTACK_COMPUTE_CLUSTER_10000": "memory access should not be shared if huge pages are disabled in the cluster [uuid: %s]. Please enable huge pages using UpdateResourceConfig [category\u003d%s name\u003d%s value\u003d%s resourceUuid\u003d%s] first.", + "ORG_ZSTACK_COMPUTE_VM_10040": "The operation is only allowed when the VM [%s] state is stopped.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10001": "huge pages should not be disabled if the memory access mode is set to shared in the cluster [uuid:%s]. Please update the memory access mode using UpdateResourceConfig [category\u003d%s name\u003d%s value\u003d%s resourceUuid\u003d%s] first.", + "ORG_ZSTACK_COMPUTE_VM_10049": "Either UUID or Cloud Account or Authentication Token must be specified.%s", + "ORG_ZSTACK_COMPUTE_VM_10048": "instance[uuid:%s] cannot be changed to image[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10047": "vm[uuid:%s] lacks a default L3 network, thus cannot change its image.", + "ORG_ZSTACK_COMPUTE_VM_10046": "Ensure the last host VM [UUID:%s] was on is Running and Connected", + "ORG_ZSTACK_COMPUTE_VM_10045": "Ensure that the primary storage virtual machine [UUID:%s] is enabled and connected.", + "ORG_ZSTACK_IAM2_CONTAINER_10009": "fail to open Kubernetes configuration file: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10007": "Failed to retrieve authorized projects due to null content", + "ORG_ZSTACK_COMPUTE_VM_10055": "The \u0027uuids\u0027 parameter must reference either a VmInstanceVO or HostVO entity.", + "ORG_ZSTACK_IAM2_CONTAINER_10008": "fail to find Kubernetes configuration at path: %s", + "ORG_ZSTACK_COMPUTE_VM_10054": "nic id: %s does not exist in the virtual network configuration...", + "ORG_ZSTACK_IAM2_CONTAINER_10005": "Failed to retrieve image tags due to a null page response. Please check the image tag API endpoint and ensure it is properly configured.", + "ORG_ZSTACK_COMPUTE_VM_10053": "The network interface card does not support applying Quality of Service (QoS) settings simultaneously with Port Mirroring service.", + "ORG_ZSTACK_IAM2_CONTAINER_10006": "Failed to retrieve images due to null content.%s", + "ORG_ZSTACK_COMPUTE_VM_10052": "outbound bandwidth and inbound bandwidth must be specified for at least one direction.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10008": "the access group associated is already: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10003": "failed to setup containerized cluster for project[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10051": "Monitor count must be one of the following: 1, 2, or 4.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10007": "nas mount target [%s] already exists in the filesystem: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10004": "Failed to retrieve image tags due to null content.%s", + "ORG_ZSTACK_COMPUTE_VM_10050": "direction must be set within (in, out), but was %s", + "ORG_ZSTACK_IAM2_CONTAINER_10001": "failed to update quota for container %s", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10009": "access group rule [%s] already exists within access group [%s]", + "ORG_ZSTACK_IAM2_CONTAINER_10002": "failed to setup project[uuid: %s] container, because the project was not found in the database", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10003": "mount domain not valid after %d milliseconds, delete it...", + "ORG_ZSTACK_IAM2_CONTAINER_10000": "failed to update quota of project[uuid: %s] on container side due to an unexpected error", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10006": "There are no NAS access groups available; please create at least one.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10005": "no such mount target [%s] in NAS: %s", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10000": "no filesystem [%%s] found in region: %%s", + "ORG_ZSTACK_COMPUTE_VM_10059": "No account preference found. Please send a password change command to the virtual machine host!", + "ORG_ZSTACK_COMPUTE_VM_10058": "No destination host found in the database; unable to send change password command to the host!", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10002": "Some primary storage [%%s] is associated with this NAS; please delete the primary storage before deleting it.", + "ORG_ZSTACK_COMPUTE_VM_10057": "only host(s) with UUID(s): %s can access data volume.", + "ORG_ZSTACK_COMPUTE_VM_10056": "resource[UUIDs:%s] is not managed by account[UUID:%s]", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10001": "NAS filesystem existed in the datacenter: %s", + "ORG_ZSTACK_COMPUTE_VM_10063": "The provided password does not meet the complexity requirements. It must contain at least one number, one uppercase character, one lowercase character, and one special character.", + "ORG_ZSTACK_COMPUTE_VM_10062": "password length must be [%s-%s characters]", + "ORG_ZSTACK_COMPUTE_VM_10061": "the disk does not support attachment. disk type is %s", + "ORG_ZSTACK_COMPUTE_VM_10060": "The disk AO parameter is incorrect. You need to set one of the following properties: size, template UUID, disk offering UUID, or source UUID-source type. Only one of these properties should be specified.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10010": "access group [%s] already exists in datacenter [%s]", + "ORG_ZSTACK_COMPUTE_VM_10068": "there is no available network interface type on L3 network [%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10015": "Cannot create a secondary virtual machine because the primary virtual machine is in a stopped state. Please start the primary virtual machine before creating a secondary one.", + "ORG_ZSTACK_COMPUTE_SRIOV_10014": "SR-IOV and VFHA cannot be enabled simultaneously for attaching an L3 network to a VM. Please ensure only one of these options is configured.", + "ORG_ZSTACK_COMPUTE_SRIOV_10015": "Cannot change virtual function network interface to standard type", + "ORG_ZSTACK_FAULTTOLERANCE_10013": "Another fault-tolerance garbage collection task is currently running. Please cancel the new task and wait for its completion.", + "ORG_ZSTACK_COMPUTE_SRIOV_10016": "Cannot change network interface to VF type. Please ensure the target instance supports vf networking.", + "ORG_ZSTACK_COMPUTE_SRIOV_10017": "vm network interface with UUID:%s does not exist", + "ORG_ZSTACK_FAULTTOLERANCE_10011": "missing fault-tolerant virtual machine group", + "ORG_ZSTACK_FAULTTOLERANCE_10010": "Cannot migrate ft primary VM[uuid:%s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10019": "only SR-IOV supported", + "ORG_ZSTACK_MONITORING_MEDIA_10001": "Failed to establish a connection to the SMTP server at host: %s, port: %d. Please verify the correctness of the smtpServer and smtpPort settings.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10038": "Condition body cannot support JSON null or array values!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10037": "Only support ZStack Template Functions in the \u0027Condition\u0027 field!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10036": "Value must be of boolean type in the \u0027Condition\u0027 field", + "ORG_ZSTACK_MONITORING_MEDIA_10000": "The issue might be due to an incorrect access key ID or secret access key or insufficient IAM permissions for the specified user. Please verify your credentials and ensure the user has the necessary permissions in your cloud computing environment.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10035": "Condition key: %s only supports 1 element in the JSON object of value, but %d elements were provided!", + "ORG_ZSTACK_FAULTTOLERANCE_10019": "Failed to perform failover. The primary VM is unknown and no fault tolerance network address is available. Please check your configuration.", + "ORG_ZSTACK_FAULTTOLERANCE_10018": "pvm[uuid:%s] does not exist", + "ORG_ZSTACK_FAULTTOLERANCE_10017": "could not failover vm[uuid:%s]. Related fault-tolerant virtual machine group does not exist", + "ORG_ZSTACK_COMPUTE_SRIOV_10012": "vm nic [uuid:%s] is already of type %s; no need to modify", + "ORG_ZSTACK_FAULTTOLERANCE_10016": "SVM creation succeeded, but an error occurred during the secondary VM start request. Please check the SVM configuration and ensure that all prerequisites for starting the secondary VM are met.", + "ORG_ZSTACK_COMPUTE_SRIOV_10013": "Modify the network interface type of a virtual machine only when it is stopped.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10009": "Two-factor authentication failed due to the absence of a token in the msg system tag.%s", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10008": "Two-factor authentication failed because the message does not contain system tags.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10004": "Two-factor authentication is not enabled for your account. Please enable it to proceed.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10001": "Unsupported Account Type: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10026": "Fault Tolerant VM Port Not Found", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10011": "Failed to verify two-factor authentication code for virtual resource %s. Please check your code and try again.", + "ORG_ZSTACK_DAHO_CORE_10003": "Create Daho VLL task failed! Please ensure that all source files are properly uploaded and accessible in the cloud environment.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10010": "two factor authentication failed because there is no secret defined for %s:%s", + "ORG_ZSTACK_FAULTTOLERANCE_10024": "Cannot start secondary virtual machine because the primary virtual machine is in a stopped state. Please start the primary virtual machine first.", + "ORG_ZSTACK_DAHO_CORE_10004": "no Alibaba Cloud account found for accountUuid: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10022": "Cannot find an available IP from the current fault-tolerance network. Please verify that the global configuration [category: Fault Tolerance, name: fault.tolerance.network.cidr] is correctly set, and ensure that the host [uuid:%s] owns an IP address within the specified CIDR range.", + "ORG_ZSTACK_FAULTTOLERANCE_10021": "An unexpected exception occurred during cloud resource management. Please check your input parameters and ensure they are within valid ranges. If the issue persists, consider reviewing the cloud computing environment configuration or contact support for further assistance.", + "ORG_ZSTACK_DAHO_CORE_10007": "expire policy: %s is not a valid configuration", + "ORG_ZSTACK_FAULTTOLERANCE_10020": "Failed to perform failover. The secondary VM is unknown and there are no fault tolerance network addresses available. Please check your configuration.", + "ORG_ZSTACK_DAHO_CORE_10008": "vlanId[%s] already exists!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10026": "CfnRootDecoder\u0027s weight must be between 0-100, where 0 indicates priority decoding and the default value is 50.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10025": "Parameters root body must be a JSON object!", + "ORG_ZSTACK_COMPUTE_SRIOV_10020": "%s does not support SRIOV", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10024": "Type is required for Parameters, but not found in %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10021": "enableSRIOV tag is not supported for VM type [%s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10022": "failed to pre-handle virtual network interface before migrating VM[uuid:%s] to host[uuid:%s]\"", + "ORG_ZSTACK_FAULTTOLERANCE_10028": "allocated port number less than requested for nic [uuid: %s] on host [uuid: %s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10023": "failed to post-process virtual network interface after migrating VM[uuid:%s] to host[uuid:%s]\"", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10029": "Mapping value body does not support JSON array! Please ensure the mapping value is a scalar or complex type supported by your cloud computing platform.", + "ORG_ZSTACK_FAULTTOLERANCE_10027": "failed to allocate a port for nic[uuid: %s] on host[uuid: %s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10028": "cannot find message: %s for creating a resource", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10030": "Mapping value body cannot support null values! Please ensure that all mapping value bodies are initialized.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10031": "mappingName must be found in the CloudFormation JSON result or it will be considered invalid.", + "ORG_ZSTACK_FAULTTOLERANCE_10037": "Cannot fail-over VM[uuid:%s] as the fault tolerance VM group is not in one of the following statuses: [%s, %s]", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10005": "could not attach L2VirtualSwitchNetwork because there are no hosts in cluster[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10036": "Cannot fail-over VM[UUID:%s], please confirm it is a fault-tolerant VM group.", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10006": "could not attach L2 Virtual Switch Network because interface[%s] should be created on host[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10035": "Cannot fail over VM[UUID:%s], please ensure that failover is enabled in GlobalConfig.", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10007": "could create layer 3 network on virtual switch[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10034": "could not delete L3 network [uuid:%s]. Fault-tolerant VM [%s] is still in states [%s, %s]. Please stop related fault-tolerant VMs before attempting to delete the L3 network.", + "ORG_ZSTACK_FAULTTOLERANCE_10033": "image[uuid:%s] is still utilized by the fault-tolerance VM[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10004": "cannot find any connected KVM host to perform the operation; it seems all hosts in the clusters attached with the shared block group storage [uuid:%s] are disconnected.", + "ORG_ZSTACK_FAULTTOLERANCE_10032": "volume with index: %d of pvm[uuid:%s] and svm[uuid:%s] has a cache volume with different size; starting is not allowed", + "ORG_ZSTACK_FAULTTOLERANCE_10031": "volume with index: %d of pvm[uuid:%s] and svm[uuid:%s] have different sizes; starting is not allowed", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10003": "could not create L2PortGroupNetwork because L2VirtualSwitchNetwork[uuid:%s] already contains L2PortGroupNetworks with the same vlanId[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10002": "KVM host which volume[uuid%s] is attached has lost connection to the shared block storage group[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10030": "pvm[uuid:%s] and svm[uuid:%s] volume numbers do not match; starting is not permitted.", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10004": "could not attach L2VirtualSwitchNetwork because the interface[%s] in cluster[uuid:%s] is already in use by another L2VirtualSwitchNetwork", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10001": "Cannot find volume to operate in shared block group primary storage.%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10002": "No virtual router is configured for VYOS DHCP service.%s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10006": "shared volume does not support thin provisioning", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10001": "unable to add DHCP entries to virtual router VM[UUID:%s IP:%s] due to %s, DHCP entry[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10039": "current operation[API:%s] is not supported when FT VM[UUID:%s, state:%s] is not in a stopped state", + "ORG_ZSTACK_FAULTTOLERANCE_10038": "Cannot maintain host because FT VMs[%s] are under recovery", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10011": "vm[uuid:%s] is not in a Running, Paused, or Stopped state, current state[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10048": "cannot update ft vm[uuid:%s] platform, need to stop both vms and ensure they are in a stopped state before proceeding", + "ORG_ZSTACK_FAULTTOLERANCE_10047": "cannot update the memory size of ft vm[uuid:%s], as it requires stopping both vms", + "ORG_ZSTACK_FAULTTOLERANCE_10046": "cannot update the ft vm[uuid:%s] cpu count, need to stop both vms and restart them", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10005": "L2 network should not have the same interface name as a provision network that is already attached to the cluster.", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10004": "Do not add a host to a BareMetal2 cluster.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10015": "The image with UUID [uuid: %s] and name [name: %s] is not found on any backup storage.", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10003": "The architecture must be specified when creating new BareMetal2 clusters.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10014": "The image [UUID: %s, name: %s] is not available for download on any backup storage:\n1. Verify that the image is not in a deleted state.\n2. Ensure that the backup storage marked as Ready for this image is attached to the zone [UUID: %s].", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10002": "Cluster type and hypervisor type should both be set to Baremetal or neither should be set.", + "ORG_ZSTACK_FAULTTOLERANCE_10042": "Cannot set VM level to %s; please ensure that failover is enabled in GlobalConfig.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10013": "not supported for online merge snapshot of shareable volume[uuid: %s] on sharedblock", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10001": "Cannot attach local storage to a baremetal cluster. Please ensure the cluster supports local storage attachment.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10012": "The volume [UUID: %s] is attached to a VM [UUID: %s] which is in the state of %s; therefore, snapshot merge cannot be performed.", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10000": "Cannot attach third-party Ceph with token to an aarch64 cluster. Please ensure compatibility of the Ceph version with the cluster architecture.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10017": "hosts[uuid:%s] have a disk UUID that is associated with a shared block storage, but the actual storage is different.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10016": "no connected host found in the cluster[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10049": "current operation is not supported on a fault-tolerant group virtual machine[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_NETWORK_10004": "mac address %s is already a bond slave interface", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10000": "unable to program DHCP entries served by virtual router[uuid:%s, ip:%s], %s", + "ORG_ZSTACK_BAREMETAL_NETWORK_10003": "MAC address %s does not belong to chassis with UUID %s", + "ORG_ZSTACK_BAREMETAL_NETWORK_10002": "Slave address %s is invalid. It should be in the format of MAC addresses separated by commas, such as 6c:b3:11:1b:0b:1e,6c:b3:11:1b:0b:1f.", + "ORG_ZSTACK_BAREMETAL_NETWORK_10001": "bond name %s already exists in the virtual network configuration", + "ORG_ZSTACK_BAREMETAL_NETWORK_10000": "Creating a BM Bonding is only allowed before creating a BM Instance.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10022": "cannot find backup storage[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10058": "Not allowed same MAC address [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10021": "expected status is %s and current status is %s", + "ORG_ZSTACK_FAULTTOLERANCE_10057": "Ft network is not configured", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10020": "The operation to convert a thin volume to a thick volume is not currently supported. Please refer to the latest documentation for available volume conversion options.", + "ORG_ZSTACK_FAULTTOLERANCE_10056": "Failed to create failover virtual machine, please enable failover technology in GlobalConfig", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10001": "cannot find EIP guest IP: %s in VM NIC IPs: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10055": "Cannot migrate FT secondary virtual machine instance", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10002": "eip [uuid:%s] has been deleted", + "ORG_ZSTACK_FAULTTOLERANCE_10054": "Cannot migrate FT primary VM instance", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10025": "QEMU2 shared volume[uuid:%s] is not supported", + "ORG_ZSTACK_FAULTTOLERANCE_10053": "current operation is not supported on secondary virtual machine[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10024": "VM[uuid:%s] has multiple ISOs from different primary storages: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10029": "The operation only supports full virtual machine instances. Please ensure you are using a complete instance specification.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10027": "Cannot find any available host to take a snapshot for volume[uuid: %s] on shared block group primary storage[uuid: %s].", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10005": "either Elastic IP UUID or Virtual IP UUID must be specified", + "ORG_ZSTACK_FAULTTOLERANCE_10051": "current operation is not supported on a file transfer secondary virtual machine [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10006": "eip with uuid:%s is not in the enabled state, attachment to a vm nic is not possible", + "ORG_ZSTACK_FAULTTOLERANCE_10050": "current operation is not supported on fault-tolerant primary VM[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10003": "Unable to attach the L3 network [uuid:%s, name:%s] to the VM [uuid:%s, name:%s], as the L3 network is providing Elastic IP (EIP) to one of the VM\u0027s NICs.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10004": "vmNic [UUID:%s] is not attached to vmInstance and therefore cannot retrieve attachable EIPs.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10009": "eip with uuid: %s can only be attached when its state is %s, but its current state is %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10007": "ip [uuid:%s] is associated with vm nic [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10008": "eIP with UUID: %s has already been attached to another VM NIC with UUID: %s and cannot be attached again.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10033": "cannot find any connected KVM host to perform the operation; it seems all hosts attached with the shared block storage [uuid:%s] are disconnected.", + "ORG_ZSTACK_FAULTTOLERANCE_10069": "cluster[uuid:%s] is specified but it is disabled; therefore, a VM cannot be created from it.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10032": "cannot find hosts that are connected to both primary storage with UUID: %s and primary storage with UUID: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10068": "zone[uuid:%s] is specified but it is disabled; therefore, a VM cannot be created from it.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10031": "Cannot find any available host to migrate for volume[uuid: %s] on shared block group primary storage[uuid: %s] and [uuid: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10030": "Cannot find any available host to migrate volume[uuid: %s] between shared block group primary storage[uuid: %s] and [uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10037": "cannot shrink snapshot %s because virtual machine %s is not in Running or Stopped state", + "ORG_ZSTACK_FAULTTOLERANCE_10065": "Can\u0027t add the same UUID to the l3Network, UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10035": "cannot shrink snapshot %s due to volume %s not being ready", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10038": "get null installation path in snapshot for virtual machine %s", + "ORG_ZSTACK_ALIYUN_BACKUP_10000": "No storage bucket found for backup operations. Please ensure that a valid bucket has been configured.%s", + "ORG_ZSTACK_FAULTTOLERANCE_10062": "image[uuid:%s] is of format: %s, only valid formats can be used to create a VM", + "ORG_ZSTACK_FAULTTOLERANCE_10061": "image[uuid:%s] is of media type: %s; only root volume templates can be used to create a VM.", + "ORG_ZSTACK_TICKET_IAM2_API_10004": "One reservation policy can only be associated with one flow collection.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10044": "No connected host found to pull snapshot on primary storage[uuid:%s] for volume[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10020": "vip[uuid:%s] is not in the expected state[%s], current state is %s", + "ORG_ZSTACK_SNS_PLATFORM_MICROSOFTTEAMS_10000": "failed to send messages to Microsoft Teams. status: %s, body: %s", + "ORG_ZSTACK_TICKET_IAM2_API_10003": "A name is required to create a flow in the cloud computing environment.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10043": "No connected host found to commit snapshot on primary storage[uuid:%s] for volume[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10079": "unable to start the vm[uuid:%s]. It does not have any network interface card (NIC) attached, please attach a NIC and try again.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10042": "active installPath %s failed, because %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10041": "active children snapshot failed because %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10023": "vmNic UUID[%s] is not allowed to add an EIP because it already has a Port Forwarding rule with an allowed CIDR.", + "ORG_ZSTACK_FAULTTOLERANCE_10077": "Current fault-tolerant virtual machine is in an unknown state and cannot be stopped. Please attempt to perform a manual failover.", + "ORG_ZSTACK_TICKET_IAM2_API_10008": "The name of the resource cannot be null. Please provide a valid name for the resource.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10048": "invalid thin provisioning initialize size tag[%s]", + "ORG_ZSTACK_TICKET_IAM2_API_10007": "invalid approver title %s, valid values are %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10021": "guest l3 network of vm nic[uuid:%s] and vip l3 network of vip[uuid:%s] are the same network", + "ORG_ZSTACK_TICKET_IAM2_API_10006": "At least one flow is required to create a flow collection.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10022": "VM state[%s] is not permitted to perform EIP operations. Please wait for the VM process to complete.", + "ORG_ZSTACK_TICKET_IAM2_API_10005": "Administrator or IAM role operation is required as the approver of the last workflow.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10045": "deactivate installPath failed because %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10049": "invalid thin provisioning initialize size[%s], it must be greater than or equal to %s", + "ORG_ZSTACK_FAULTTOLERANCE_10073": "defaultL3NetworkUuid[uuid:%s] is not found in l3NetworkUuids[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10071": "host[uuid:%s] is specified but its connection status is %s, unable to create VM from it", + "ORG_ZSTACK_FAULTTOLERANCE_10070": "host[uuid:%s] is specified but it is disabled; therefore, a VM cannot be created from it.", + "ORG_ZSTACK_TICKET_IAM2_API_10009": "approver UUID cannot be null", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10051": "invalid thinProvisioningInitializeSize[%s] exceeds maximum limit of %d", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10050": "invalid thinProvisioningInitializeSize[%s], it is not a valid size value", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10055": "The host with UUID [uuid: %s] is not available to resize the volume with UUID [uuid: %s] on the shared block group primary storage with UUID [uuid: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10054": "cannot find a host with connected shared block storage to execute command for shared block group primary storage[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10053": "cannot find an available host to execute command for shared block group primary storage[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10052": "the value[%s] is not a power of 2", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10012": "IP address [uuid:%s] does not belong to network interface [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10059": "cannot find any cluster attached to the shared block group primary storage [uuid: %S]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10058": "the shared mount point primary storage[uuid:%s, name:%s] cannot find any available host within the attached clusters for instantiating the volume", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10013": "eip[uuid:%s] has not been attached to any virtual machine\u0027s network interface", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10010": "vm network interface does not have a compatible used IP for EIP with UUID %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10057": "volume[uuid:%s] not found in the storage pool", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10011": "guest l3Network of VM NIC and VIP l3Network of EIP are the same network [uuid:%s] and [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10056": "primary storage [uuid:%s] not found", + "ORG_ZSTACK_TICKET_IAM2_API_10011": "virtual ID [UUID] does not belong to project [UUID]", + "ORG_ZSTACK_TICKET_IAM2_API_10010": "cannot find IAM-to-VirtualID mapping [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10017": "The VM [UUID:%s] associated with the EIP is already connected to the public network [UUID:%s], from which the VIP [UUID:%s, Name:%s, IP:%s] originates.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10014": "VIP IP version [%d] differs from guest IP version [%d].", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10015": "VIP[%s] is within the guest IP range [%s - %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10062": "the SharedBlock primary storage [uuid:%s, name:%s] has not been attached to any compute clusters, or there are no connected hosts in the attached clusters.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10018": "VIP [UUID:%s] has been occupied by another network service entity [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10019": "EIP cannot be created on a system VIP. Please ensure you are using a public IP address for EIP association.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10047": "get image hash failed, because:%s", + "ORG_ZSTACK_SNS_PLATFORM_FEISHU_10000": "failed to send messages to FeiShu. status: %s, body: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10042": "The UUID of the image store backup storage agent has changed [expected: %s, actual: %s]. This is most likely due to the agent being manually restarted. Please issue a reconnect to synchronize the status.", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10000": "Failed to retrieve Zaku cluster information, error: %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10002": "Failed to retrieve zaku cluster [id:%s], error: %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10001": "Failed to retrieve Zaku cluster information; response content is null. Please check your request parameters and network connectivity.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10000": "cannot find the quota for the security group for project %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10004": "Failed to extract action ID from API response", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10003": "Failed to retrieve Zaku cluster [id:%s], response content is null", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10006": "Failed to parse cloud response: %s", + "ORG_ZSTACK_SNS_10015": "platformUuid and endpointUuid cannot be specified simultaneously. Please check your input parameters.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10001": "Security group quota cannot be less than 1. Please adjust the setting to a value of at least 1.", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10005": "Async operation timed out after %d seconds", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10004": "the l3Uuid in the label is inconsistent with the l3Uuid in the parameter", + "ORG_ZSTACK_SNS_10013": "password cannot be null", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10003": "system tag requested. need to specify the default security group for VM NIC by setting the system tag L3_NETWORK_SECURITY_GROUP_UUIDS_REF with the format l3::{%s}::SecurityGroupUuids::{%s}, as force security group is enabled", + "ORG_ZSTACK_SNS_10012": "username cannot be null", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10006": "Since force security group is enabled, the securityGroupUuid in the tag must be within the project[%s].", + "ORG_ZSTACK_SNS_10011": "smtpPort cannot be null", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10005": "The owner [UUID: %s] of security group [UUID: %s] belongs to another IAM2 project.", + "ORG_ZSTACK_SNS_10010": "smtpServer cannot be null", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10008": "The default security group %s cannot be deleted when the enforced security group feature is enabled.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10007": "nics attached to the l3Network [uuid:%s] are associated with the security group. Before detaching the l3Network from the security group, you need to detach the nics.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10039": "A commercial license is required to utilize the ImageStore service in our cloud environment.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10009": "This security group %s is associated with a virtual machine, please disassociate it before proceeding.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10035": "image store [%s] cannot add an image because it is used for backup remote", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10032": "the backup storage[UUID:%s] has not enough capacity[%s] to export the virtual machine image", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10002": "virtual router[name: %s, uuid: %s] failed to sync snat%s due to %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10031": "image[%s] not found on backup storage[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10001": "guest l3Network[uuid:%s, name:%s] requires SNAT service from the virtual router, but the public l3Network[uuid:%s] associated with the virtual router offering[uuid: %s, name:%s] is identical to the guest l3Network.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10020": "notifySugonSdn: failed to notify Sugon SDN of vrouter for VM [uuid:%s] on destination host[uuid:%s], error is:%s", + "ORG_ZSTACK_SNS_10029": "cloud resource identifier [%s] already exists", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10011": "account[%s] not permitted to perform operations on the default security group", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10010": "account[%s] cannot perform operations on the default security group[%s]", + "ORG_ZSTACK_SNS_10026": "cannot update email address to %s as it already exists in endpoint [UUID:%s]", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10012": "vm\u0027s network interface [UUID: %s] can only be part of one security group; therefore, it cannot be removed from the current security group [UUID: %s].", + "ORG_ZSTACK_SNS_10024": "cannot add the same email address to endpoint[uuid:%s]", + "ORG_ZSTACK_SNS_10023": "cannot find plugin[%s]", + "ORG_ZSTACK_SNS_10022": "cannot create SNMP platform with the same address[%s:%s]", + "ORG_ZSTACK_SNS_10021": "Cannot establish connection due to null parameters. Please ensure that all required parameters are properly configured.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10029": "not implement remote target type: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10028": "failed to package exported images because %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10027": "some images [%s] were not exported to the backup storage [uuid: %s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10026": "failed to delete image package because: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10022": "failed to set maximum capacity on image store[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10021": "failed to set maximum capacity on image store[uuid:%s], because: %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10019": "notifySugonSdn: failed to notify Sugon SDN of vrouter for VM [uuid:%s] on destination host [uuid:%s]", + "ORG_ZSTACK_SNS_10038": "Cannot create an SNS email endpoint without specifying any recipient email addresses.", + "ORG_ZSTACK_SNS_10037": "username and password must either both be absent or provided together", + "ORG_ZSTACK_SNS_10036": "invalid phone number[%s], please ensure it is formatted as +86-12388889999", + "ORG_ZSTACK_SNS_10035": "[%s] is not a valid IP address", + "ORG_ZSTACK_SNS_10034": "invalid cloud storage path[%s]", + "ORG_ZSTACK_SNS_10031": "phone number [%s] does not exist", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10018": "No response from the cloud instance or virtual machine. Please check the instance status and network configuration.", + "ORG_ZSTACK_SNS_10030": "The virtual machine\u0027s phone number list is empty. Please check and ensure that the necessary phone numbers are provisioned.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10016": "failed to retrieve image from backup storage with UUID: %s, reason: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10015": "Missing certificate file for downloading image: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10013": "unable to connect to SimpleHttpBackupStorage[url:%s], due to %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10010": "Failed to receive task response! Please check your instance configuration and network settings.", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_10000": "creation relies on image cache[uuid:%s, location URLs: [%s]], cannot create from other locations.", + "ORG_ZSTACK_SNS_10045": "The operation is not permitted for the system-level virtual machine platform. Please ensure you are modifying user-space resources.", + "ORG_ZSTACK_SNS_10044": "Cannot validate universal SMS without specifying a phone number.", + "ORG_ZSTACK_SNS_10043": "userId [%s] already exists in the cloud environment", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10008": "failed to clean image metadata on primary storage %s, error: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10007": "Sync status failed due to missing source file. Please ensure all required files are present and reattempt the sync.", + "ORG_ZSTACK_SNS_10041": "cloud phone number[%s] already exists", + "ORG_ZSTACK_SNS_10040": "invalid email address[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10005": "cannot find a connected host in the cluster to which the primary storage [uuid: %s] is attached", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10004": "unable to commit backup storage specified by UUIDs: %s because of an error: %s", + "ORG_ZSTACK_MONITORING_10004": "cannot find type for the resource[uuid:%s]", + "ORG_ZSTACK_MONITORING_10005": "no monitoring metric found for the resourceType[%s] and item[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10002": "unable to allocate backup storage specified by UUIDs: %s because of resource constraints or invalid UUIDs: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10000": "parse creation time error: %s", + "ORG_ZSTACK_MONITORING_10000": "cannot find monitor trigger[uuid:%s], it may have been deleted or disabled", + "ORG_ZSTACK_MONITORING_10001": "cannot find monitor trigger action[uuid:%s], it may have been deleted or revoked", + "ORG_ZSTACK_MONITORING_10002": "the resource[type:%s] does not have any monitoring metrics", + "ORG_ZSTACK_MONITORING_10003": "The resource with UUID [%s] does not belong to the account with UUID [%s].", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10002": "instance[%s] is not associated with any group", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10001": "The instance[%s] is already assigned to the group", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10003": "The monitoring group [%s] is not associated with a monitoring template.", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10006": "The instance limit for the group has been reached. Please terminate an existing instance or contact support to increase the limit.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10001": "Output body does not support JSON null values! Please ensure all fields are properly defined and non-null.", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10005": "The template rule has reached its maximum limit of %d entries. Consider scaling your template or contacting support for assistance.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10000": "only cloud-native services can be allowed in Outputs, but found %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10016": "Resource Type must be a String!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10014": "Mappings root body must be a JSON object!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10018": "Resource root metadata must be a JSON object!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10023": "Parameters body cannot support null values!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10022": "parameter name not supported: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10020": "paramName must be found in the CloudFormation JSON template results or it is considered invalid.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10001": "entity is empty, cannot determine TableName", + "ORG_ZSTACK_FAULTTOLERANCE_10004": "failed to allocate a port on host[uuid: %s]", + "ORG_ZSTACK_ZQL_AST_VISITORS_10000": "Join condition is missing for table %s in your query. Please ensure you have specified the join condition correctly.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10003": "The field list is empty; therefore, we are unable to retrieve the column name. Please ensure that your field list contains the necessary data.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10002": "entity is empty, cannot retrieve columnName", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10005": "Mapping body does not support non-map value!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10004": "[%s] is invalid in CloudFormation Outputs!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10003": "Description in Outputs must be of String type!", + "ORG_ZSTACK_FAULTTOLERANCE_10009": "Cannot migrate ft secondary VM[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10008": "Cannot start secondary virtual machine because the primary virtual machine is still in a stopped state. Please ensure the primary VM is running before attempting to start the secondary VM.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10009": "Resource value body cannot support null values! Please ensure all resource parameters are properly initialized before deployment.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10004": "The specified function cannot be null. Please ensure that the function is properly initialized before use.", + "ORG_ZSTACK_FAULTTOLERANCE_10007": "could not retrieve host UUID of primary VM [uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10008": "Resource %s cannot depend on itself, please check self-reference in Resource [%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10005": "allocated port count less than requested on host[uuid: %s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10006": "Mapping body does not support null values! Please ensure all JSON fields are properly defined and non-null.", + "ORG_ZSTACK_SNS_10009": "uuid [%%s] already exists in the cloud environment.", + "ORG_ZSTACK_SNS_10007": "cannot find SNS Application Endpoint with UUID: %s, it may have been deleted", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10012": "unsupported key [%s] in resource mapping [%s]", + "ORG_ZSTACK_SNS_10006": "cannot find SNSApplicationPlatform[uuid:%s], it may have been terminated", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10011": "resourceName must be found in the template output or it is an invalid CloudFormation JSON.", + "ORG_ZSTACK_SNS_10005": "The specified endpoint type %s cannot be found. Please ensure a valid endpoint type is provided.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10010": "unsupported resource keys: %s", + "ORG_ZSTACK_SNS_10003": "cannot find the SNS Topic with UUID:%s, it may have been deleted", + "ORG_ZSTACK_SNS_10002": "The application endpoint is disabled. Please check your configuration settings or contact support for assistance.", + "ORG_ZSTACK_SNS_10001": "The application platform is disabled. Please contact your administrator to enable it or check the documentation for available alternatives.", + "ORG_ZSTACK_SNS_10000": "The topic %s is not being consumed by any subscribed endpoints.", + "ORG_ZSTACK_CLOUDFORMATION_10002": "invalid ZStack Template Format Version: [%s, expected version is %s]", + "ORG_ZSTACK_CLOUDFORMATION_10001": "The template must contain the ZStackTemplateFormatVersion marker.", + "ORG_ZSTACK_CLOUDFORMATION_10000": "Retrieve null element in template content template content may refer to a cloud resource or virtual machine configuration. Please ensure all elements are properly defined and initialized.", + "ORG_ZSTACK_CLOUDFORMATION_10009": "template [%s] is disabled in the virtualization environment", + "ORG_ZSTACK_CLOUDFORMATION_10008": "ResourceStackVO [%s] has already been deleted!", + "ORG_ZSTACK_CLOUDFORMATION_10007": "ResourceStackVO: [%s] has been terminated...", + "ORG_ZSTACK_CLOUDFORMATION_10005": "no stack UUID found for the VM instance[%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10035": "Failed to reserve host capacity for all candidate hosts. Please check the availability of the target hosts and ensure they have sufficient resources to meet the reservation requirements.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10034": "[Host Allocation]: %s on host[uuid:%s]. Try allocating to the next host. %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10037": "after filtering, HostAllocatorFilterExtensionPoint[%s] returns zero candidate hosts, indicating: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10036": "No host with the specified criteria found", + "ORG_ZSTACK_CLOUDFORMATION_10025": "expect %s status!", + "ORG_ZSTACK_EXPON_10002": "exponential request failed, code %s, message: %s.", + "ORG_ZSTACK_EXPON_10003": "cannot find volume [name:%s] after copying snapshot", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10000": "virtual router[name: %s, uuid: %s] failed to configure DNS%s, %s", + "ORG_ZSTACK_CLOUDFORMATION_10022": "restart resource stack only supports %s status!", + "ORG_ZSTACK_CLOUDFORMATION_10021": "cannot find resource stack with uuid [%s]", + "ORG_ZSTACK_CLOUDFORMATION_10020": "cannot find default IP address on virtual machine[%s]", + "ORG_ZSTACK_CLOUDFORMATION_10028": "templateContent and url must not both be empty or both be set!", + "ORG_ZSTACK_CLOUDFORMATION_10026": "templateContent and templateUuid must not both be empty!", + "ORG_ZSTACK_HYBRID_ACCOUNT_10000": "keyType not supported type [%s]", + "ORG_ZSTACK_HYBRID_ACCOUNT_10002": "key: [%s] with type: [%s] already existed for account UUID: [%s]", + "ORG_ZSTACK_HYBRID_ACCOUNT_10003": "parameters [accountUuid] can only be utilized by administrative users!", + "ORG_ZSTACK_HYBRID_ACCOUNT_10004": "key: [%s] already exists for account UUID: [%s]", + "ORG_ZSTACK_CLOUDFORMATION_10014": "Content must be set by template content or URL!", + "ORG_ZSTACK_CLOUDFORMATION_10013": "cannot delete or update system template: %s", + "ORG_ZSTACK_CLOUDFORMATION_10012": "StackTemplateVO has been deleted from the cloud template repository. Please verify and re-upload the template.", + "ORG_ZSTACK_CLOUDFORMATION_10011": "cannot find parameters for %s, which is of type %s, please check parameters", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10002": "could not attach hardware VXLAN pool because: %s", + "ORG_ZSTACK_CLOUDFORMATION_10010": "templateContent must be specified!", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10003": "could not create L2 hardware VXLAN network without VLAN ID specified", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10000": "could not attach level 2 network to cluster because host[uuid:%s] has no virtual interface[name:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10001": "could not attach hardware VXLAN pool because cannot find switch port for host[uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_10019": "cannot find l2 bridge name of l2[%s] from systemTag", + "ORG_ZSTACK_CLOUDFORMATION_10018": "The parameter filterName must be set to cloudformation:true or cloudformation:false.", + "ORG_ZSTACK_CLOUDFORMATION_10017": "StackTemplateVO: [%s] has been deleted from the cloud repository...", + "ORG_ZSTACK_CLOUDFORMATION_10016": "invalid CloudFormation template version: %s", + "ORG_ZSTACK_CLOUDFORMATION_10015": "Failed to retrieve content input for cloud resource. Please ensure source files are properly uploaded and configured.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10006": "could not create Huawei iMaster SDN VXLAN network without VPC ID", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10007": "could not add vni range because the specified vni range [%d-%d] is invalid", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10004": "could not create Huawei iMaster SDN VXLAN network because VLAN ID [%s] is out of the valid range: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10005": "could not create Huawei iMaster SDN VXLAN network without vpcId and tenantId", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10009": "could not add Huawei iMaster SDN Controller to the network without specifying a VLAN range", + "ORG_ZSTACK_NETWORK_L2_10013": "cannot modify VLAN for L2 Network [UUID:%s] as it still has hosts in a connecting or disconnected state", + "ORG_ZSTACK_NETWORK_L2_10012": "unsupported virtual switch type[%s]", + "ORG_ZSTACK_NETWORK_L2_10015": "cannot modify VLAN for l2Network[uuid:%s] as this network is isolated", + "ORG_ZSTACK_NETWORK_L2_10014": "cannot modify VLAN for l2Network[uuid:%s] as it is restricted to a KVM cluster exclusively", + "ORG_ZSTACK_NETWORK_L2_10017": "vlan[%s] is invalid for cloud network configuration", + "ORG_ZSTACK_NETWORK_L2_10016": "vlan is required for ChangeL2NetworkVlanId with type[%s]", + "ORG_ZSTACK_NETWORK_L2_10019": "vLAN is not allowed for ChangeL2NetworkVlanId with type[%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10000": "no candidate host has version[%s] available for deployment", + "ORG_ZSTACK_NETWORK_L2_10018": "There has been an L2 network attached to the cluster with virtual network ID [%s] and physical interface [%s]. Failed to change L2 network [uuid: %s].", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10083": "existing SimpleHttpBackupStorage with hostname[%s] detected", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10082": "invalid URL[%s], the URL must be an absolute path starting with \u0027/\u0027", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10080": "file path contains invalid character: %s", + "ORG_ZSTACK_NETWORK_L2_10020": "Failed to modify l2Network [uuid:%s] attached to cluster with physical interface [%s].", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10079": "The URL contains an invalid path [/dev or /proc or /sys], which is not supported in cloud computing environments. Please use a valid path for your request.", + "ORG_ZSTACK_CLOUDFORMATION_10034": "templateContent and uuid must not both be empty or both be set!", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10078": "absolute path to the source file required: %s", + "ORG_ZSTACK_NETWORK_L2_10006": "There has been an L2 network with UUID: %s and name: %s attached to cluster with UUID: %s that is associated with a physical interface [%s]. Failed to attach L2 network with UUID: %s.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10077": "A source file path is required to proceed with code review or editing. Please provide the file path.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10076": "duplicate backup storage. There has been an image store backup storage[hostname:%s]", + "ORG_ZSTACK_NETWORK_L2_10008": "l2Network [UUID: %s] is associated with cluster [UUID: %s], and cannot be reassigned.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10075": "hostname[%s] is not a valid DNS name or IP address", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10011": "DiskOfferingTagAllocatorExtensionPoint[%s] returned zero candidate hosts", + "ORG_ZSTACK_CLOUDFORMATION_10030": "only administrators have the privilege to enable or disable system StackTemplate", + "ORG_ZSTACK_NETWORK_L2_10007": "There has been a L2 Vlan Network [uuid:%s, name:%s] attached to cluster [uuid:%s] that has a physical interface [%s] and VLAN [%s]. Failed to attach L2 Vlan Network [uuid:%s].", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10010": "InstanceOfferingTagAllocatorExtensionPoint[%s] returned zero candidate hosts", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10073": "src backup storage does not contain image[%s]", + "ORG_ZSTACK_NETWORK_L2_10009": "could not attach L2 network because there is another network with a different vSwitch type on physical interface %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10072": "source storage[%s] does not contain image[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10071": "target backup storage [uuid:%s] already contains the image [uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10070": "delete image metadata file failed: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10009": "the backup storage [UUID: %s, type: %s] requires a bound primary storage, however, no primary storage has been added yet.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10001": "The image with UUID [uuid:%s] and name [name:%s] has been deleted from all backup storage.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10004": "resource binding does not support type %s yet", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10003": "No host found in zones[uuids:%s] that attaches to backup storage where image[%s] is located.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10005": "no available host found with bound resource %s", + "ORG_ZSTACK_NETWORK_L2_10011": "unsupported l2Network type[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10003": "virtual router[uuid:%s, ip:%s] failed to configure DNS%s for L3 Network[uuid:%s, name:%s], %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10008": "The image[uuid:%s] is located on a backup storage[uuid:%s, type:%s] that requires interaction with primary storage[uuid:%s]; however, no suitable host was found to facilitate this interaction.", + "ORG_ZSTACK_NETWORK_L2_10010": "l2Network[uuid:%s] has not been attached to cluster[uuid:%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10007": "The image[uuid:%s, name:%s] is stored on a backup storage[uuid:%s, type:%s] that requires primary storage of types %s; however, no host with compatible primary storage was found.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10068": "Check image metadata file: %s failed", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10066": "Create image metadata file: %s failed", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10065": "Create image metadata synchronization failed: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10022": "cannot find root volume of instance[uuid:%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10021": "no host having CPU[%s], memory[%s bytes] available found", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10000": "could not attach eip because there is no gateway for network interface [uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10062": "AddImage is forbidden in Disaster Recovery BS: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10001": "L2Network where the VIP\u0027s L3Network is based has not been attached to the cluster where the vmNic[uuid:%s] resides.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10002": "cannot bind more than 1 EIP to a VM NIC with UUID:%s of flat type", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10060": "missing image path on instance[%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10015": "cannot find available primary storage [state: %s, status: %s, available capacity %d bytes]. Please verify the state and status of the primary storage and ensure it is attached to a cluster.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10014": "no host found in clusters that have been attached to primary storage %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10016": "cannot find available primary storage [state: %s or %s, status: %s]. Please verify the state and status of the primary storage and ensure it is attached to a cluster.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10031": "no enabled hosts found in the [%s] candidate hosts having the hypervisor type [%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10030": "no enabled hosts found in the [%s] candidate host list", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10033": "No host with state\u003dEnabled and status\u003dConnected found", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10032": "no host having state\u003dEnabled status\u003dConnected hypervisorType\u003d%s found", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10012": "no such object %s found in bucket %s", + "ORG_ZSTACK_UTILS_10000": "failed to generate access secret for the virtual machine instance %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10024": "either volume UUID or volume snapshot UUID must be specified", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10023": "No host found in clusters that have attached to all primary storage %s where VM[UUID:%s]\u0027s volumes reside.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10026": "After excluding the avoided hosts, there are no candidates left in the pool.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10025": "zoneUuids, clusterUuids, and hostUuids must each contain at least one non-empty list, or all values must be set to true.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10015": "Aliyun EBS Backup Storage does not support calculating image hashes.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10027": "No host found in clusters that has attached to L2Networks which have associated L3Networks%s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10029": "no connected hosts found in the [%s] candidate hosts", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10005": "Select a load balancing strategy, you must set the algorithm type", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10008": "No host with fewer than %s virtual machines found", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10022": "The account [UUID:%s] does not have access to the resource [UUID:%s, type:L3NetworkVO].", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10024": "change dhcp server IP to [%s], but received [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10025": "L3 Network UUID cannot be null", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10003": "Incorrect cloud provider settings, valid value is %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10021": "The session/account UUID is invalid. Please verify and try again.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10000": "The Ocean endpoint URL must be configured for Alibaba Cloud EBS backup storage.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10017": "unable to apply the EIP operation for the VM[uuid:%s, state:%s], because the hostUUID cannot be found", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10009": "Aliyun EBS Backup Storage does not support canceling the image download process.", + "ORG_ZSTACK_CORE_TIMEOUT_10000": "api timeout cannot be set smaller than %s milliseconds", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10002": "cannot delete OSS bucket [%s], as it still contains Aliyun EBS Backup Storage instances, please ensure all related backup storage instances are deleted first.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10004": "current primary storage does not support the specified protocol type; please ensure the protocol is added to the storage first.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10003": "[protocol] parameter is null. For primary storage of type [%s], block volume protocol must be specified.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10000": "Cloud resource path error: Please verify the file location and existence.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10002": "name: [%s] already exists. Block volume names must be unique within the primary storage type [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10010": "could not retrieve DHCPv6 server IP for Layer 3 network [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10009": "could not retrieve DHCPv4 server IP for layer 3 network [uuid:%s]", + "ORG_ZSTACK_POLICYROUTE_10029": "Cannot delete system policy route table", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10005": "host[uuid:%s] is not provisioned", + "ORG_ZSTACK_POLICYROUTE_10027": "Cannot delete system-defined policy route set. Please ensure that this route set is not being used by any active resources before attempting deletion.", + "ORG_ZSTACK_POLICYROUTE_10028": "Cannot find associated virtual router instance. Please ensure that the virtual router is properly configured and available.", + "ORG_ZSTACK_POLICYROUTE_10025": "ruleSet[%s] is still associated with the network interface card (NIC)", + "ORG_ZSTACK_POLICYROUTE_10020": "VRouter[%s] already has a policy-based route table [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10044": "Could modify DHCP server IP only if flat DHCP is enabled.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10045": "could modify DHCP server IP because %s is not the owner of Layer 3 network[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10046": "Could not change DHCPv4 server IP because there is no IPv4 address range configured.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10047": "could set DHCP v4 server IP because the provided IP [%s] is not a valid CIDR for L3 network [%s]", + "ORG_ZSTACK_IDENTITY_RBAC_10011": "operation[API:%s] is denied by default due to security reasons. Please contact your administrator to resolve this.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10041": "Could set DHCPv6 server IP because there is no IPv6 range configured.", + "ORG_ZSTACK_IDENTITY_RBAC_10012": "the operation is denied by the policy [name: %s uuid: %s]", + "ORG_ZSTACK_IDENTITY_RBAC_10013": "the operation is denied by the policy[name:%s, uuid:%s], field[%s] is not permitted to be modified", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10037": "could delete ip address, because ip [%s] is a DHCP server IP address", + "ORG_ZSTACK_POLICYROUTE_10018": "Cannot update system policy route set. Please ensure you have the necessary permissions and try again.", + "ORG_ZSTACK_POLICYROUTE_10019": "Cannot update system policy-based route table. Please ensure you have the necessary permissions and try again.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10039": "Could set DHCPv4 server IP because there is no IPv4 address range configured.", + "ORG_ZSTACK_POLICYROUTE_10017": "Cannot find associated Virtual Router", + "ORG_ZSTACK_POLICYROUTE_10014": "illegal protocol type %s", + "ORG_ZSTACK_POLICYROUTE_10015": "RuleSet[%s] already contains a rule with number %s.", + "ORG_ZSTACK_POLICYROUTE_10013": "operation failure, IP format only supports IPv4/IP range/CIDR, but found %s", + "ORG_ZSTACK_POLICYROUTE_10010": "NextHopIp must be in IPv4 format but found [%s]", + "ORG_ZSTACK_CORE_REST_10012": "unable to retrieve %s within %sms", + "ORG_ZSTACK_QUERY_10021": "field[%s] is not a primitive of the inventory %s; you cannot specify it in the parameter \u0027fields\u0027; valid fields are %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10034": "DHCP server IP [%s] already exists within L3 network [%s]", + "ORG_ZSTACK_QUERY_10020": "entity metadata class[%s] lacks field[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10035": "DHCP server IP [%s] must not be equal to the gateway IP", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10036": "DHCP server IP [%s] cannot be configured to system L3 network settings", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10030": "DHCP server IP address [%s] is not a valid IPv4 address", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10031": "DHCP server IP [%s] is not within the specified CIDR [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10032": "DHCP server IP [%s] is not a valid IPv6 address", + "ORG_ZSTACK_IDENTITY_RBAC_10004": "You are not authorized to update a system or predefined role. Please contact your administrator for assistance.", + "ORG_ZSTACK_POLICYROUTE_10009": "DestinationCidr must be in CIDR format but found [%s]", + "ORG_ZSTACK_IDENTITY_RBAC_10007": "permission denied, the account [uuid:%s] is not authorized to access the resource [uuid:%s, type:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10027": "cannot configure DHCP for virtual machine [uuid:%s] on the destination host [uuid:%s]", + "ORG_ZSTACK_IDENTITY_RBAC_10008": "permission denied, the account [uuid:%s] is not authorized to manage the tagged resource [uuid:%s, type:%s]", + "ORG_ZSTACK_POLICYROUTE_10008": "VRouter[%s] already has a rule set named %s", + "ORG_ZSTACK_IDENTITY_RBAC_10005": "You are not authorized to delete a system or predefined role. Please contact your administrator for assistance.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10029": "minimum IP range prefix length for flat network is %d", + "ORG_ZSTACK_POLICYROUTE_10003": "l3[%s] already has an attached policy route rule set", + "ORG_ZSTACK_IDENTITY_RBAC_10009": "The account [UUID:%s] does not have access to the resources [UUID:%s, Type:%s]", + "ORG_ZSTACK_POLICYROUTE_10000": "Default route network cannot be modified when system policy routes are enabled.", + "ORG_ZSTACK_QUERY_10018": "condition name[%s] is invalid, no such field found in inventory class[%s]", + "ORG_ZSTACK_QUERY_10017": "\"value\" of query condition %s cannot be null for cloud resource filtering", + "ORG_ZSTACK_QUERY_10015": "filterName must be formatted as [filterType:condition(s)]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_10000": "make ocean API signature string failed: %s", + "ORG_ZSTACK_QUERY_10019": "condition name[%s] is invalid: field[%s] of inventory[%s] is annotated as @UnqueryableField", + "ORG_ZSTACK_ALIYUN_PANGU_10001": "appName: %s, partitionName: %s already exists in identityZone: %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10050": "could set DHCP server IP, because IP[%s] is allocated", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10051": "could set DHCPv6 server IP because IP[%s] is used", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10053": "DHCP server IP allocation failed.%s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10048": "Could not change DHCPv6 server IP because there is no IPv6 range configured.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10049": "could set DHCPv6 server IP because IP[%s] is not a valid CIDR for L3 network [%s]", + "ORG_ZSTACK_USBDEVICE_10026": "please unmount all USB devices from the VM[%s] and try again", + "ORG_ZSTACK_USBDEVICE_10025": "cannot detach USB device[uuid:%s] when it is attached to a VM instance", + "ORG_ZSTACK_USBDEVICE_10024": "vm instance [uuid:%s] is not in an attachable state for usb device %s", + "ORG_ZSTACK_USBDEVICE_10023": "The VM instance that the USB device [uuid:%s] is attached to is not in a detachable state: %s", + "ORG_ZSTACK_USBDEVICE_10022": "The USB device [UUID:%s] is not attached to any virtual machine instance.", + "ORG_ZSTACK_USBDEVICE_10021": "The host that the USB device [uuid:%s] is plugged into is not in a valid state [%s] or status [%s].", + "ORG_ZSTACK_USBDEVICE_10020": "the VM instance[UUID:%s] is not in an attachable state for USB device: %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10005": "L3 Network [uuid:%s] does not exist", + "ORG_ZSTACK_COMPUTE_SRIOV_10006": "%s, because there is no SRIOV device available on the l3Network [uuid:%s] of the host [uuid:%s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10007": "could not change VF NIC HA state because VF NIC [UUID:%s] does not exist", + "ORG_ZSTACK_COMPUTE_SRIOV_10008": "could not change virtual network interface card high availability state because high availability state[%s] is invalid", + "ORG_ZSTACK_COMPUTE_SRIOV_10009": "L2 Network [UUID:%s] not found", + "ORG_ZSTACK_COMPUTE_SRIOV_10000": "failed to set VF NIC MAC on host[uuid:%s, ip:%s], because %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10001": "failed to change virtual network interface card HA state, error: %s", + "ORG_ZSTACK_DRS_10000": "The cluster[%s] has initiated Data Replication Service", + "ORG_ZSTACK_DRS_10002": "Threshold values cannot be empty. Please ensure that threshold settings are properly configured.", + "ORG_ZSTACK_DRS_10001": "DRS is disabled for this virtual machine. Please ensure that DRS is enabled to optimize resource allocation.", + "ORG_ZSTACK_DRS_10004": "illegal threshold operator[%s]", + "ORG_ZSTACK_DRS_10003": "illegal threshold name[%s]", + "ORG_ZSTACK_DRS_10006": "illegal threshold value, valid range: (0, 100]", + "ORG_ZSTACK_DRS_10005": "The threshold value for cloud resource monitoring cannot be empty.%s", + "ORG_ZSTACK_DRS_10008": "The DRG[%s] status is %s", + "ORG_ZSTACK_DRS_10007": "GlobalConfig ENABLE_DRS is disabled", + "ORG_ZSTACK_DRS_10009": "The DRS[%s] automation level is not set to manual mode", + "ORG_ZSTACK_ZWATCH_FUNCTION_10012": "value[%s] is not a valid integer number", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10018": "could not execute API operation. Backend network [UUID:%s] is connected to VPC router [UUID:%s], which is not connected to front network [UUID:%s].", + "ORG_ZSTACK_ZWATCH_FUNCTION_10011": "invalid argument[limit:%s], it can\u0027t be a negative value", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10019": "Backend network [UUID:%s] must be a VPC network because another backend network is configured as a VPC network.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10010": "unknown argument[%s]", + "ORG_ZSTACK_DRS_10020": "Deleting aDRS is not permitted while theVMisbeingmigrated.", + "ORG_ZSTACK_DRS_10011": "Successfully executed; repeated deployment is not permitted", + "ORG_ZSTACK_DRS_10010": "advice[%s] has expired due to inactivity", + "ORG_ZSTACK_DRS_10013": "The VM[%s] is not in a running state", + "ORG_ZSTACK_DRS_10012": "The VM[%s] has been terminated", + "ORG_ZSTACK_DRS_10015": "The cluster[%s] does not support dynamic resource scaling.", + "ORG_ZSTACK_DRS_10014": "The VM[%s] is no longer on the source host[%s].", + "ORG_ZSTACK_DRS_10017": "The list of host UUIDs is empty. Please ensure that at least one host UUID is provided.", + "ORG_ZSTACK_DRS_10016": "Can not create DRDS instance, %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10013": "backend network [uuid:%s] must be a VPC network as the front Layer 3 network is a VPC network", + "ORG_ZSTACK_ZWATCH_FUNCTION_10005": "invalid argument[start:%s], it can\u0027t be a negative number in a cloud computing environment", + "ORG_ZSTACK_DRS_10019": "Advice not allowed during task scheduling", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10014": "could not execute the API operation. The backend network [UUID:%s] is not connected to the VPC router. Please ensure the network is properly connected before attempting again.", + "ORG_ZSTACK_DRS_10018": "Failed to query host utilization data", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10015": "Backend network is associated with VPC router [uuid:%s] while the front-end network is associated with a different VPC router [uuid:%s]. Please ensure both networks are associated with the same VPC router.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10016": "could not execute the API operation. The backend network [uuid:%s] must be a private flat network because the front L3 network is a private flat network.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10002": "unknown function[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10010": "backend network CIDR is overlapped with front L3 network CIDR", + "ORG_ZSTACK_ZWATCH_FUNCTION_10008": "invalid value[%s] for the argument[%s] in cloud computing environment configuration", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10011": "Backend network CIDR [%s] is overlapped with management L3 network CIDR [%s]. Please ensure there is no overlap between network CIDRs to avoid configuration conflicts. Backend network UUID [%s] and management L3 network UUID [%s] are affected.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10012": "could not execute API operation. Frontend network [UUID:%s] is not connected to the VPC router", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10001": "cannot find CEPH pool [%s] related OSD group", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10000": "required Ceph pool[uuid:%s] cannot satisfy the condition [availableSize \u003e %d bytes], current available size %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10006": "could not create SLB instance because image [uuid:%s] has been deleted", + "ORG_ZSTACK_ZWATCH_FUNCTION_10001": "duplicate argument[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10007": "SLB instance creation failed due to reaching the maximum instance limit.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10000": "missing required argument[%s] for cloud instance configuration", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10008": "could not create SLB group because invalid front L3 network type %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10009": "front network CIDR [%s] is overlapped with management L3 network CIDR [%s]", + "ORG_ZSTACK_DRS_10022": "Scheduling is not permitted during virtual machine migration.", + "ORG_ZSTACK_DRS_10023": "Lack of host CPU and memory utilization data", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10002": "cloud is unable to delete VIP[%s]. Please ensure the SLB[uuid:%s] is deleted first.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10003": "could not create SLB instance because there is no load balancer SLB group [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10004": "could not create SLB instance because there is no SLB offering configured for SLB group [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10005": "could not create SLB instance because the image UUID of the SLB offering [uuid:%s] is null", + "ORG_ZSTACK_CORE_ENCRYPT_10000": "Encryption error : %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10000": "cannot find network interface of SLB instance [uuid:%s] which is attached to SLB group front Layer 3 network [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10001": "could not delete ip range [%s], please delete load balancer [uuid:%s] first", + "ORG_ZSTACK_IDENTITY_10011": "Old password does not match the original password. Unable to update user[%s] password.", + "ORG_ZSTACK_IDENTITY_10010": "The user with UUID [%s] does not have an association with the account having UUID [%s].", + "ORG_ZSTACK_IDENTITY_10016": "The quota[name:%s] for account[uuid:%s] cannot be set to %d", + "ORG_ZSTACK_IDENTITY_10017": "The account [UUID:%s] utilized [Name:%s, Usage Value:%s] exceeds the request quota: %d", + "ORG_ZSTACK_IDENTITY_10001": "Incorrect authentication credentials. Please verify your password and try again.", + "ORG_ZSTACK_IDENTITY_10009": "the account [UUID: %s] does not have access to the resource [UUID: %s]", + "ORG_ZSTACK_IDENTITY_10008": "The user group with UUID [%s] does not belong to the account with UUID [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10003": "failed to release vip%s due to %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10009": "service[uuid: %s] is already bound to an observability server", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10002": "failed to synchronize VIPs [ips: %s] on virtual router [uuid:%s] for attaching NIC [uuid: %s, ip: %s], due to %s", + "ORG_ZSTACK_OVF_10025": "Only virtual machine in state: %s can be exported.", + "ORG_ZSTACK_OVF_10026": "failed to parse jsonCreateVmParam in APICreateVmInstanceFromOvfMsg Request Parameters Invalid", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10006": "Found a virtual router offering [uuid:%s] for L3Network [uuid:%s] in zone [uuid:%s]; however, the network\u0027s public IP network [uuid:%s] does not match the VIP [uuid:%s]. You may need to specify a particular virtual router offering using the system tag guestL3Network::l3NetworkUuid.", + "ORG_ZSTACK_OVF_10023": "Export VM requires an ImageStore backup storage, but the given backupStorageUuid: %s is not an ImageStore backup storage.", + "ORG_ZSTACK_OBSERVABILITYSERVER_10006": "observability server with UUID: %s is not enabled", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10005": "virtual router[uuid:%s, state:%s] is not active", + "ORG_ZSTACK_OVF_10024": "Not found the virtual machine to be exported with the UUID: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10007": "the image of observability server offering[UUID: %s] is missing", + "ORG_ZSTACK_OVF_10021": "Failed to create VM from OVF because the root disk of the virtual machine cannot be found. Please ensure that the required disk is properly configured and available.", + "ORG_ZSTACK_OVF_10022": "VM[UUID: %s] is already exported as OVA package[UUID: %s]. Please delete the package and try again.", + "ORG_ZSTACK_KVM_XMLHOOK_10001": "xml hook with UUID %s was updated successfully, but failed to restart VM with UUID %s. Details: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10003": "cannot find virtual router for service: %s, type: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10010": "observability server with UUID: %s is not operational; unable to attach service", + "ORG_ZSTACK_OVF_10018": "Failed to read OVF file for virtual machine %s. Please check the file path and permissions.", + "ORG_ZSTACK_OVF_10017": "ova package[uuid: %s] not found in the virtual machine repository.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10057": "cannot find SLB group UUID of load balancer[uuid:%s,type:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_FILESYSTEM_10000": "host[uuid:%s]\u0027s heartbeat has not been updated recently", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_HA_10000": "HA group extension point not initialized", + "ORG_ZSTACK_OVF_10030": "long job[uuid:%s] execution failed", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10040": "could not add vmnic to load balancer server group because l3 network [uuid:%s] is connected to a different vpc router", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10041": "could not add VMNIC to load balancer server group because L3 network is not connected to SLB instance", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10046": "could not create SLB instance because another instance [UUID: %s, name: %s] already exists for the SLB group", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10047": "Could not create an SLB instance as two instances are already created for the SLB group.", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10001": "failed to upload bits from the NFS storage [uuid:%s, path:%s] to image store [hostname:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10042": "could not change SLB group monitor IP because invalid monitor IP %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10043": "could not switch SLB group [uuid:%s] to high availability mode because instance state [%s] is not stopped", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10044": "failed to create VIP%s on virtual router[UUID:%s], because %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10000": "failed to download bits from the image store backup storage[hostname:%s, path: %s] to the NFS primary storage[uuid:%s, path: %s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10045": "create affinity group for SLB instance [uuid:%s] failed", + "ORG_ZSTACK_IAM2_API_10011": "attribute[uuid:%s] is not associated with any defined group", + "ORG_ZSTACK_IAM2_API_10012": "attribute[uuid:%s] is not associated with any organization", + "ORG_ZSTACK_IAM2_API_10013": "attribute[uuid:%s] is not associated with any project", + "ORG_ZSTACK_IAM2_API_10014": "attribute[uuid:%s] is not associated with any virtual instance ID", + "ORG_ZSTACK_IAM2_API_10015": "Retirement policy must be deleted before pulling the project out of the Retired state.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10039": "could not add vmnic to load balancer server group because l3 network [uuid:%s] is connected to any vpc router", + "ORG_ZSTACK_IAM2_API_10016": "login is prohibited because the project is in a state of %s", + "ORG_ZSTACK_IAM2_API_10017": "no quota[name:%s] exists", + "ORG_ZSTACK_IAM2_API_10018": "The CPU limit for the container (%s) should be greater than the requested CPU amount (%s).", + "ORG_ZSTACK_IAM2_API_10019": "The memory size limit for the container should be greater than the requested memory size.", + "ORG_ZSTACK_OVF_10003": "Volume management controller not found. Please ensure that your volume management service is properly configured and running.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10007": "VipQoS for Vip [uuid: %s] does not exist", + "ORG_ZSTACK_OVF_10004": "CD Driver Controller not found. Please ensure that the necessary virtualization drivers are installed and configured for your instance.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10008": "Cannot delete Quality of Service for Virtual IP [uuid: %s]. It is associated with a VPC Shared Quality of Service.", + "ORG_ZSTACK_OVF_10001": "Illegal disk capacity specification: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10005": "Cannot set Quality of Service (Qos) for VIP [UUID: %s]. It has been attached to a VpcSharedQos.", + "ORG_ZSTACK_OVF_10002": "Illegal disk provisioned size: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10006": "VIP QoS for VIP [uuid: %s] port %s does not exist", + "ORG_ZSTACK_OVF_10000": "Disk reference not found for disk %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10009": "Cannot find VIP QoS backend for VIP [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10010": "VpcSharedQos must specify Bandwidth", + "ORG_ZSTACK_IPSEC_10028": "L3 network [%s] is not attached to IPsec tunnel [UUID :%s]", + "ORG_ZSTACK_AUTOSCALING_10000": "invalid L3 network UUIDs[%s] for listener associated with load balancer[%s], all networks must be attached to the same virtual router as the LB service and be part of the same VRouter network configuration", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10011": "VPC needs to be attached to L3[%s] first", + "ORG_ZSTACK_IPSEC_10029": "CIDR [%s] is already included in the IPsec Configuration [UUID :%s]", + "ORG_ZSTACK_AUTOSCALING_10001": "detach autoScalingTemplate[%s] from AutoScalingGroup failed, errors are %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10030": "cannot attach L3 network with UUID [%s] to SLB instance due to invalid IPv6 prefix [%s] format", + "ORG_ZSTACK_AUTOSCALING_10003": "listeners with UUID: %s are being utilized by the autoScalingVmTemplate[%s] and cannot be deleted", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10014": "VpcSharedQos cannot attach this VIP because it has already been attached to another VpcSharedQos.", + "ORG_ZSTACK_IPSEC_10025": "L3 network [%s] cannot be attached to IPsec [UUID:%s] multiple times", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10012": "AttachVipToVpcSharedQos parameter must specify VipUuids or VipLists", + "ORG_ZSTACK_IPSEC_10026": "must include Layer 3 networks in APIAttachL3NetworksToIPsecConnectionMsg", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10013": "VpcSharedQos cannot attach this VIP, as VIP[%s] is not within the L3 network[%s].", + "ORG_ZSTACK_IPSEC_10027": "L3 network [%s] is not a VPC network and cannot be attached or detached to IPsec.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10035": "cannot create load balancer because the VIP [uuid:%s] is already associated with another network service [%s]", + "ORG_ZSTACK_IPSEC_10020": "the peer address[%s] is not a valid IPv4 address", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10036": "cannot create load balancer because the VIP [uuid:%s] is already attached to a VPC router [%s]", + "ORG_ZSTACK_IPSEC_10021": "The authentication key must not contain whitespace or special characters such as %s.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10037": "cannot create load balancer because invalid SLB group [uuid:%s]", + "ORG_ZSTACK_IPSEC_10022": "IPsec VIP [%s] must not be the first or last IP address in the CIDR range associated with the public address pool type.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10038": "could not add backend server NIC to server group [uuid:%s], because NIC UUID is null", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10031": "cannot attach L3 network with UUID [%s] to SLB instance because IP address and prefix must be specified in system tags", + "ORG_ZSTACK_AUTOSCALING_10004": "The instance does not exist within the scaling group. Please verify the instance ID and the scaling group name [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10032": "cannot detach front-end L3 network [uuid:%s] from SLB instance", + "ORG_ZSTACK_AUTOSCALING_10005": "alarms with UUID:%s are associated with the autoScalingGroup[%s] and cannot be deleted", + "ORG_ZSTACK_IAM2_API_10020": "organization[uuid:%s] is a Cloud Tenant and cannot have a parent organization", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10033": "cannot detach management L3 network [uuid:%s] from SLB instance", + "ORG_ZSTACK_AUTOSCALING_10006": "rule[%s] is disabled", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10034": "cannot detach NIC [uuid:%s] from SLB instance because it is the last backend Layer 3 network interface", + "ORG_ZSTACK_IAM2_API_10021": "parent organization [uuid:%s] cannot be a child organization [uuid:%s] within a nested organizational structure", + "ORG_ZSTACK_IAM2_API_10022": "duplicate virtual machine ID name[%s]", + "ORG_ZSTACK_IAM2_API_10023": "duplicate virtual environment name[%s]", + "ORG_ZSTACK_IAM2_API_10024": "invalid project name[%s], a project with the same name already exists", + "ORG_ZSTACK_IAM2_API_10025": "IAM2OrganizationVO[uuid:%s] does not exist", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10028": "cannot attach L3 network with UUID [%s] to SLB instance because IP address and netmask must be specified in system tags", + "ORG_ZSTACK_IAM2_API_10026": "The project [UUID\u003d%s] has been associated with the organization [UUID\u003d%s].", + "ORG_ZSTACK_OBSERVABILITYSERVER_10019": "Start time must be less than end time for valid scheduling in cloud environments.", + "ORG_ZSTACK_IAM2_API_10027": "The project [UUID\u003d%s] is not associated with a cloud environment.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10029": "cannot attach L3 network with UUID [%s] to SLB instance due to invalid IPv6 address format [%s]", + "ORG_ZSTACK_IAM2_API_10028": "organizations%s are not allowed to be children of other organizations", + "ORG_ZSTACK_IAM2_API_10029": "virtual ID [UUID: %s] does not belong to project [UUID: %s]", + "ORG_ZSTACK_OBSERVABILITYSERVER_10015": "cannot find ObservabilityServer service type: %s", + "ORG_ZSTACK_OVF_10015": "backup storage[UUID: %s] does not have sufficient available capacity for exporting VM[UUID: %s], required capacity is: %d", + "ORG_ZSTACK_OBSERVABILITYSERVER_10016": "service[uuid: %s] with type %s cannot be detached from observability server[uuid: %s] due to: %s", + "ORG_ZSTACK_OVF_10012": "Illegal CPU \u0027CoresPerSocket\u0027 configuration value: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10017": "service[uuid: %s] is not associated with observability server[uuid: %s]", + "ORG_ZSTACK_OBSERVABILITYSERVER_10018": "Start and end time must both be specified for the cloud instance provisioning period.", + "ORG_ZSTACK_OVF_10010": "Virtual CPU \u0027VirtualQuantity\u0027 not found", + "ORG_ZSTACK_OBSERVABILITYSERVER_10011": "observability server instance[uuid: %s] not found", + "ORG_ZSTACK_OVF_10011": "Illegal CPU \u0027vCPU\u0027 value: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10013": "service[uuid: %s] with type %s cannot be attached to observability server[uuid: %s] due to: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10000": "VIP Quality of Service (QoS) for IPv6 will be implemented soon.", + "ORG_ZSTACK_ALIYUN_STORAGE_SNAPSHOT_10000": "The operation is allowed only when the ECS instance status is running or stopped.", + "ORG_ZSTACK_OVF_10009": "CPU \u0027InstanceID\u0027 not found. Please verify the instance ID and ensure that the CPU is properly assigned.", + "ORG_ZSTACK_OBSERVABILITYSERVER_10020": "Invalid date-time format. Expected ISO-8601 format with optional timezone detail: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10021": "observability server [UUID: %s] is not active; unable to retrieve service data", + "ORG_ZSTACK_OVF_10007": "Virtual memory \u0027VirtualQuantity\u0027 not found", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10003": "SetVipQos must specify either InboundBandwidth or OutboundBandwidth.", + "ORG_ZSTACK_OVF_10008": "Invalid Virtual Machine Memory Value: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10004": "Cannot set Quality of Service (QoS) for this Virtual IP (VIP). Not all peer Layer 3 Networks provide VIP QoS service.", + "ORG_ZSTACK_OVF_10005": "Ethernet Adapter: %s is not connected to a network.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10001": "VIP QoS for VIP [uuid: %s] port %s already exists", + "ORG_ZSTACK_OVF_10006": "Virtual machine \u0027%s\u0027 not found", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10002": "VIP Quality of Service for VIP [uuid: %s] already exists", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10024": "could not create SLB group because invalid backend instance type %s", + "ORG_ZSTACK_IPSEC_10031": "cannot change state because IPsec [uuid:%s] is not in a ready status", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10025": "could not create SLB group because invalid monitor IP %s", + "ORG_ZSTACK_IPSEC_10032": "could not reconnect this IPsec tunnel [uuid:%s], please upgrade IPsec version", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10026": "cannot attach L3 network with UUID [%s] to SLB instance due to invalid IPv4 address format [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10027": "cannot attach L3 network with UUID [%s] to SLB instance due to IPv4 netmask format error [%s]", + "ORG_ZSTACK_IAM2_API_10030": "illegal operation, cannot add Role[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10021": "Backend network [UUID:%s] is connected to VPC router [UUID:%s], while other backend networks are connected to VPC router [UUID:%s].", + "ORG_ZSTACK_IAM2_API_10031": "cannot operate on stale virtual machine IDs: %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10022": "could not execute the API operation. The backend network [uuid:%s] cannot be a VPC network because other backend networks are not VPC networks.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10023": "could not create SLB group because invalid deployment type %s", + "ORG_ZSTACK_IPSEC_10030": "CIDR [%s] is not within the IPsec UUID [%s]\u0027s defined CIDRs", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10026": "Operation error: Failed to retrieve response from the cloud computing service", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10028": "backing up snapshots to backup storage is a deprecated feature and will be removed in a future version of the cloud platform", + "ORG_ZSTACK_IAM2_API_10000": "attribute name cannot be null, value[%s]", + "ORG_ZSTACK_IAM2_API_10001": "attribute name[%s] exceeds the maximum length of 2048 characters", + "ORG_ZSTACK_IAM2_API_10002": "attribute[name:%s] value exceeds the maximum length of 2048 characters", + "ORG_ZSTACK_IAM2_API_10003": "The Organization[UUID: %s] has exceeded the Requested Limit for [Name: %s, Used Value: %s].", + "ORG_ZSTACK_IAM2_API_10005": "%s is not a valid value for network traffic control. Valid values are allow/reject between specific IP ranges.", + "ORG_ZSTACK_IAM2_API_10006": "The default organizational unit[%s] cannot be deleted", + "ORG_ZSTACK_IAM2_API_10007": "duplicate template identifier[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10018": "VpcSharedQos cannot detach this Vip because Vpc[%s] is not connected", + "ORG_ZSTACK_IAM2_API_10009": "The username \u0027admin\u0027 is reserved in cloud computing environments to denote administrative privileges. Please choose another name for your user.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10016": "DetachVipFromVpcSharedQos parameter must specify VipUuids or VipLists", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10017": "VpcSharedQos cannot detach this VIP, as VIP[%s] is not attached", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10010": "ceph primary storage [uuid:%s] may have been deleted or terminated.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10013": "the Ceph primary storage [UUID: %s, name: %s] is unavailable, as one Monitor [UUID: %s] reports an operation failure [%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10012": "There is another CEPH primary storage with the same FSID; you cannot add the same CEPH configuration as two different primary storages.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10015": "Unable to establish connection with storage nodes (%s)", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10017": "the monitor node [ip:%s] returns a fsid[%s] different from the current cluster\u0027s fsid[%s], are you mistakenly adding a monitor node not belonging to this cluster?", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10016": "Unable to add MON node to Ceph-based primary storage solution", + "ORG_ZSTACK_IAM2_API_10010": "invalid name[%s], a project or account with the same identifier already exists", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10008": "unable to connect to the Ceph primary storage [UUID:%s], failed to connect all Ceph monitors.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10007": "all monitors cannot execute HTTP request[%s]", + "ORG_ZSTACK_ZOPS_10009": "failed to retrieve chrony sources, because:%s", + "ORG_ZSTACK_ZOPS_10005": "%s is unreachable from %s due to:%s", + "ORG_ZSTACK_ZOPS_10004": "failed to configure time sources \u0027%s\u0027 in %s, because:%s, raw: %s", + "ORG_ZSTACK_ZOPS_10007": "%s failed to verify Ceph cluster health status due to: %s", + "ORG_ZSTACK_ZOPS_10006": "failed to verify if %s is reachable from %s due to:%s", + "ORG_ZSTACK_ZOPS_10001": "%s is not a valid cloud instance IP address", + "ORG_ZSTACK_ZOPS_10003": "%s is not a valid IP address or hostname", + "ORG_ZSTACK_ZOPS_10002": "Internal and external Chrony servers cannot be null at the same time. Please ensure both are properly configured.", + "ORG_ZSTACK_ZOPS_10010": "failed to retrieve %s\u0027s chrony sources, due to:%s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10001": "The backup storage [UUID: %s, Name: %s, FSID: %s] is not part of the same Ceph cluster as the primary storage [UUID: %s, Name: %s, FSID: %s].", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10004": "failed to save encrypted image cache: %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10005": "fsid is not consistent between the primary storage [ps(%s)] and backup storage [bs(%s)]. Template creation is therefore forbidden.", + "ORG_ZSTACK_ZOPS_10019": "fail to delete old chrony server in zstack.properties in %s, because:%s", + "ORG_ZSTACK_ZOPS_10016": "ZStone does not currently support updating chrony servers online. Please ensure all changes are made offline before deployment.", + "ORG_ZSTACK_ZOPS_10015": "%s is unreachable from the current virtual machine environment", + "ORG_ZSTACK_ZOPS_10018": "CEPH cluster status is unhealthy. Please verify your environment first! %s", + "ORG_ZSTACK_ZOPS_10012": "fail to check if %s is reachable from host %s because it is not under our management", + "ORG_ZSTACK_ZOPS_10011": "failed to synchronize chrony server in %s because:%s, raw: %s", + "ORG_ZSTACK_ZOPS_10014": "%s cannot be designated as an external chrony time server!", + "ORG_ZSTACK_ZOPS_10020": "fail to configure chrony %s server in zstack.properties in %s, because:%s", + "ORG_ZSTACK_PROXY_10000": "Cannot find User Proxy Configuration with UUID %s", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10005": "failed to start USB redirection server from host[uuid:%s]", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10004": "unable to start USB service on host[%s], because the host is not connected", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10003": "host[%s] has initiated more than 64 USB redirection ports", + "ORG_ZSTACK_COMPUTE_HOST_10085": "Cannot configure management network on interface because it is set to auto-assign mode.", + "ORG_ZSTACK_COMPUTE_HOST_10084": "Cannot detach management network from interface because it is an automatically assigned type.", + "ORG_ZSTACK_COMPUTE_HOST_10087": "Cannot detach management network from bonding interface as it uses automatic IP acquisition.", + "ORG_ZSTACK_COMPUTE_HOST_10081": "Cannot configure IP addresses for bridge slave interfaces", + "ORG_ZSTACK_COMPUTE_HOST_10080": "The IP address has already been assigned to another interface. Please ensure that the IP address is unique across all network interfaces.", + "ORG_ZSTACK_COMPUTE_HOST_10083": "invalid bonding UUID for virtual network interface %s", + "ORG_ZSTACK_COMPUTE_HOST_10089": "Invalid service type specified. Please ensure you are using a valid service type for cloud computing environments.", + "ORG_ZSTACK_COMPUTE_HOST_10088": "Cannot set management network on bonding because the management network uses auto-assignment.", + "ORG_ZSTACK_COMPUTE_HOST_10090": "mock power off virtual machine[%s] by IPMI failed.", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10001": "Failed to establish a connection to the SMTP server at host: %s and port: %d. Please verify the correctness of the smtpServer and smtpPort configuration. [error\u003d%s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10002": "cannot establish connection to SMTP server[server: %s, port: %s] within 15 seconds", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10003": "SMTP server validation error: %s", + "ORG_ZSTACK_AI_COLLECTOR_10000": "No deploy contexts found for MindIE metadata collection in the virtual environment. Please ensure that the necessary cloud resources are properly configured and available.", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10004": "The specified endpoint is disabled. Please verify your endpoint configuration.", + "ORG_ZSTACK_AI_COLLECTOR_10001": "Some deployment contexts lack virtual machine inventory, preventing the collection of MindIE metadata.", + "ORG_ZSTACK_COMPUTE_HOST_10096": "power reset host[%s] via IPMI failed.", + "ORG_ZSTACK_COMPUTE_HOST_10095": "mock power reset of virtual machine by IPMI failed. [%s]", + "ORG_ZSTACK_COMPUTE_HOST_10098": "host[%s] received an unexpected return value", + "ORG_ZSTACK_COMPUTE_HOST_10097": "IPMI information is incomplete for instance %s. Please check and provide the required details.", + "ORG_ZSTACK_COMPUTE_HOST_10092": "mock power on instance by IPMI failed for host[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10091": "power off host[%s] by IPMI failed.", + "ORG_ZSTACK_COMPUTE_HOST_10094": "reboot host[%s:%d] failed because the instance is already powered off", + "ORG_ZSTACK_COMPUTE_HOST_10093": "power on host[%s] by IPMI failed.", + "ORG_ZSTACK_COMPUTE_HOST_10099": "host[%s] cannot establish a connection with ipmi[%s], reason:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10002": "cannot verify MD5 checksum of files in the directory[%s].\\nstdout:%s\\nstderr:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10003": "cannot verify MD5 checksum of files in the folder[%s] on the host[ip:%s].\\nstdout:%s\\nstderr:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10000": "User name, password, or port number may be incorrect. Please verify and try again.", + "ORG_ZSTACK_COMPUTE_HOST_10065": "failed to update host network label [uuid:%s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10000": "The problem may be caused by an incorrect access key or secret key or IAM policy permission denied. [error\u003d%s]", + "ORG_ZSTACK_COMPUTE_HOST_10064": "failed to delete host network label [uuid:%s]", + "ORG_ZSTACK_COMPUTE_HOST_10067": "invalid IP address format[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10066": "host(s) [%s] is not connected, power off is not supported", + "ORG_ZSTACK_COMPUTE_HOST_10069": "invalid IP set, it must be specified with a netmask in CIDR notation", + "ORG_ZSTACK_COMPUTE_HOST_10068": "invalid subnet mask format[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10073": "Cannot configure IP address on bonding slave interfaces", + "ORG_ZSTACK_COMPUTE_HOST_10070": "Cannot configure IP address for management network interface.%s", + "ORG_ZSTACK_COMPUTE_HOST_10078": "Cannot configure IP address for bonding interface related to management network", + "ORG_ZSTACK_COMPUTE_HOST_10077": "invalid interface UUID specified", + "ORG_ZSTACK_IMAGE_10019": "Upload session expired. Please ensure your upload session is active and try again.", + "ORG_ZSTACK_IMAGE_10016": "Failed due to management node reboot.", + "ORG_ZSTACK_IMAGE_10015": "image path is not within the approved list: %s", + "ORG_ZSTACK_IMAGE_10014": "All instances on this server are unable to access images", + "ORG_ZSTACK_IMAGE_10013": "image path [%s] is included in the black list %s", + "ORG_ZSTACK_IMAGE_10012": "An absolute path must be specified for the source file. Please provide a full path to the file.", + "ORG_ZSTACK_IMAGE_10011": "The provided URL must start with \u0027file:///\u0027, \u0027http://\u0027, \u0027https://\u0027, \u0027ftp://\u0027, \u0027sftp://\u0027, or \u0027/\u0027.", + "ORG_ZSTACK_IMAGE_10010": "no backup storage specified in uuids%s is available for adding this image; they are not in status %s or not in state %s, or the UUID is invalid backup storage UUID", + "ORG_ZSTACK_IMAGE_10009": "unsupported image format[%s]", + "ORG_ZSTACK_IMAGE_10008": "unknown format[%s]", + "ORG_ZSTACK_IMAGE_10007": "ISO cannot be used as a system disk image.", + "ORG_ZSTACK_IMAGE_10006": "volume snapshot[uuid:%s] is not enabled, it\u0027s %s", + "ORG_ZSTACK_IMAGE_10005": "volume snapshot[uuid:%s] is not Ready, it\u0027s in %s state", + "ORG_ZSTACK_IMAGE_10004": "volume[uuid:%s] is not enabled, it\u0027s currently %s", + "ORG_ZSTACK_IMAGE_10003": "volume[uuid:%s] is not Ready, it is %s", + "ORG_ZSTACK_IMAGE_10002": "The AArch64 architecture does not support legacy features. Please ensure your configuration is compatible with the AArch64 architecture.", + "ORG_ZSTACK_ALIYUN_ACCOUNT_10000": "cannot establish a connection to [%s] within %d milliseconds, indicating that the Alibaba Cloud OpenAPI service is inaccessible.", + "ORG_ZSTACK_IMAGE_10039": "No connected backup storage found for image[uuid:%s, name:%s]", + "ORG_ZSTACK_IMAGE_10038": "The image with UUID [uuid:%s] and name [name:%s] is not stored on any backup storage.", + "ORG_ZSTACK_IMAGE_10037": "failed to create data volume template from volume[uuid:%s] on all backup storage%s. See cause for one of the errors", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10041": "expect a boolean value or another Condition, current Conditions include: %s, but got %s", + "ORG_ZSTACK_IMAGE_10036": "failed to allocate all backup storage[uuid:%s], a list of errors: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10040": "The EC2 instance is null! Please ensure the instance ID is correct and not null.", + "ORG_ZSTACK_IMAGE_10035": "Cannot find appropriate backup storage solution. Please ensure that your cloud storage configuration is correct and accessible.", + "ORG_ZSTACK_IMAGE_10034": "failed to create image from root volume[uuid:%s] on all backup storage; please check the cause for one of the errors", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10002": "there are insufficient resources for the image[uuid: %s] download during the volume[uuid: %s] storage migration, required capacity: %s, current available physical capacity: %s", + "ORG_ZSTACK_IMAGE_10032": "unable to allocate backup storage specified by UUIDs%s, list of errors are: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10003": "There is insufficient capacity for volume [UUID: %s] storage migration; required capacity: %d, current available physical capacity: %d", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10004": "data on source PS[uuid: %s] has been discarded and rollback is not supported", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10005": "Migrating a volume without a snapshot on a shared block storage is not supported and cannot be canceled.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10000": "Found trash ID (%s) in Primary Storage [%s] for the migrate install path [%s]. Please clean it first using \u0027APICleanUpTrashOnPrimaryStorageMsg\u0027 if you insist on migrating the volume [%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10001": "cannot find the image with UUID:%s in any connected backup storage attached to the zone with UUID:%s. Please check the following:\n1. Ensure the backup storage is attached to the zone with UUID:%s.\n2. Verify that the backup storage is in a connected state; attempt to reconnect it if necessary.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10039": "only methods can be defined within a Function, but found %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10032": "Fn::FindInMap cannot locate resources [%s] within the Resources map!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10036": "No Reference [%s] found!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10035": "unsupported functions [%s] are not supported in the ZStack resource template!", + "ORG_ZSTACK_CORE_ERRORCODE_10007": "Input arguments \u0027regex\u0027 or \u0027category\u0027 must be specified for cloud resource filtering.", + "ORG_ZSTACK_CORE_ERRORCODE_10005": "elaboration code must be a numeric value!", + "ORG_ZSTACK_IMAGE_10026": "cannot clone image because the image [%s] is not in a ready state", + "ORG_ZSTACK_CORE_ERRORCODE_10006": "%s: Cloud resource file not found", + "ORG_ZSTACK_IMAGE_10025": "source image [%s] does not exist", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10051": "%s cannot convert to CloudString", + "ORG_ZSTACK_CORE_ERRORCODE_10003": "%s is not a valid or empty directory", + "ORG_ZSTACK_CORE_ERRORCODE_10004": "read error while elaborating template files [%s] failed, due to: %s", + "ORG_ZSTACK_IMAGE_10023": "vm instance[uuid:%s] lacks a root volume", + "ORG_ZSTACK_IMAGE_10022": "vm instance [uuid:%s] lacks an attached volume", + "ORG_ZSTACK_IMAGE_10021": "the backup storage[uuid:%s] is not in the connected state, current status is %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10042": "expect a boolean value \u0027true\u0027 or \u0027false\u0027 for the object, but got %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10046": "Fn::GetAtt cannot find the specified resources [%s] in the resource list!", + "ORG_ZSTACK_SSO_SAML2_SERVICE_10000": "iam2 contains a user with the same name[%s], expected type[%s] but found type[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10119": "The host [%s] does not have an IPMI device configured or the IPMI device is missing an address. After configuring the IPMI address, please reconnect the host to refresh its IPMI information.", + "ORG_ZSTACK_ZQL_AST_VISITORS_PLUGIN_10000": "The field to be summed must be specified.", + "ORG_ZSTACK_SSO_SAML2_SERVICE_10001": "duplicate SAML login[%s] for type[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10120": "failed to migrate vm[uuid:%s] on host[uuid:%s, name:%s, ip:%s], will attempt a graceful shutdown.", + "ORG_ZSTACK_CORE_ERRORCODE_10001": "Both source file and JSON content cannot be empty simultaneously. Please ensure that either a valid source file is provided or JSON content is specified.", + "ORG_ZSTACK_CORE_ERRORCODE_10002": "Unable to scan resource directory: %s", + "ORG_ZSTACK_CORE_ERRORCODE_10000": "No file or input content provided for cloud computing resource configuration", + "ORG_ZSTACK_COMPUTE_HOST_10124": "Host connection attempt failed, ping request timed out. Please verify network connectivity and ensure the host is operational.", + "ORG_ZSTACK_COMPUTE_HOST_10104": "A host with management IP [%s] for hypervisor [%s] has been detected.", + "ORG_ZSTACK_COMPUTE_HOST_10103": "cluster[uuid:%s] has an undefined hypervisor type", + "ORG_ZSTACK_COMPUTE_HOST_10106": "cluster[uuid:%s]\u0027s architecture is %s, which does not match the host[name:%s, ip:%s] architecture of %s", + "ORG_ZSTACK_COMPUTE_HOST_10105": "after connecting, host[name:%s, ip:%s] returns null virtual architecture", + "ORG_ZSTACK_COMPUTE_HOST_10100": "host ipmi[%s] is not reachable because %s", + "ORG_ZSTACK_COMPUTE_HOST_10102": "cluster[uuid:%s] does not exist", + "ORG_ZSTACK_SCHEDULER_10008": "invalid time unit specified: %s", + "ORG_ZSTACK_SCHEDULER_10005": "the volume[%s] does not support snapshot retention policies", + "ORG_ZSTACK_SCHEDULER_10006": "snapshotMaxNumber: The format is incorrect due to %s", + "ORG_ZSTACK_COMPUTE_HOST_10108": "system host network service type[%s] cannot be terminated", + "ORG_ZSTACK_COMPUTE_HOST_10107": "primary storage [uuid:%s] has become disconnected, and the host no longer has an attached primary storage resource.", + "ORG_ZSTACK_COMPUTE_HOST_10109": "system host network service type[%s] cannot be updated due to conflicting virtualization settings", + "ORG_ZSTACK_SCHEDULER_10002": "The previous task has not been completed successfully. Skipping this task.", + "ORG_ZSTACK_COMPUTE_HOST_10114": "cannot maintain host[uuid:%s, status:%s] which is not Connected", + "ORG_ZSTACK_COMPUTE_HOST_10111": "WebSSH server instance is not active. Please ensure your cloud SSH server (%s) is running and properly configured.", + "ORG_ZSTACK_COMPUTE_HOST_10110": "there has been a host network service type[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10113": "managementIp[%s] is not a valid IPv4 address or hostname", + "ORG_ZSTACK_COMPUTE_HOST_10112": "there has been a host with management IP[%s]", + "ORG_ZSTACK_SCHEDULER_10018": "The VM has already scheduled a job of type [%s]", + "ORG_ZSTACK_SCHEDULER_10016": "the VM of the root volume [%s] is not available. Please verify if the VM exists.", + "ORG_ZSTACK_SCHEDULER_10017": "snapshotGroupMaxNumber: The format is incorrect due to %s", + "ORG_ZSTACK_SCHEDULER_10014": "The volume[%s] is not available. Please verify if the volume exists and is properly attached.", + "ORG_ZSTACK_SCHEDULER_10015": "the volume[%s] is not a root volume", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10068": "no volume found in migrateVolumeStructs during migration between shared block group primary storage!", + "ORG_ZSTACK_SCHEDULER_10013": "field[%s] cannot be empty for cloud instance configuration", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10067": "empty volume migration structures in migrateVolumesBetweenSharedBlockGroupPrimaryStorageMsg!", + "ORG_ZSTACK_VPCFIREWALL_10027": "the ruleSet[%s] already has a rule with the specified rule number %s.", + "ORG_ZSTACK_IPSEC_10006": "Network [UUID: %s] does not have IPsec service enabled.", + "ORG_ZSTACK_VPCFIREWALL_10028": "could not add firewall rule[%d] only TCP or UDP protocol can use port", + "ORG_ZSTACK_IPSEC_10007": "the remote CIDR[%s] overlaps with existing CIDRs", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10000": "new add VM NICs and attached VM NICs are not on the same virtual router; they are on different virtual routers with UUIDs: %s and %s.", + "ORG_ZSTACK_IPSEC_10008": "the remote CIDR[%s] and remote CIDR[%s] overlap", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10001": "new add VM NICs[uuids:%s] and peer L3 networks[uuids:%s] of load balancer[uuid: %s]\u0027s VIP are not on the same virtual router, they are on different virtual routers with UUIDs[uuids:%s]", + "ORG_ZSTACK_IPSEC_10009": "the CIDR[%s] of local router and remote router\u0027s CIDR[%s] are overlapped", + "ORG_ZSTACK_IPSEC_10002": "Current port range [%s, %s] is conflicted with used port range [%s, %s] for VIP [uuid: %s] protocol: UDP", + "ORG_ZSTACK_IPSEC_10003": "cidr[%s] of attached L3Network [uuid:%s] overlaps with ipsec remote cidr[%s] of uuid:%s", + "ORG_ZSTACK_VPCFIREWALL_10029": "could not add firewall rule[%d] only TCP protocol can use TCP flags", + "ORG_ZSTACK_IPSEC_10005": "The source file for the Java code is not found. Please ensure that the necessary files are uploaded and included in your project.", + "ORG_ZSTACK_VPCFIREWALL_10020": "cannot attach the default rule set to another network interface card", + "ORG_ZSTACK_IPSEC_10000": "cannot find the IPsec Connection [UUID:%s], it may have been deleted", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10006": "vmnic must be specified for sharing load balancer resources.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10073": "The VM [UUID: %s] does not have an additional QMP socket configured. This may be due to the VM starting without the global configuration [vm.additionalQmp] enabled. Please ensure this configuration is enabled and reboot the VM in ZStack.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10007": "cannot find virtual router for load balancer [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10072": "primary storage [UUID: %s] has attached SCSI LUN [WWID: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10071": "cannot find appropriate hypervisor type for primary storage [uuid:%s] to handle image format or volume format [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10004": "refresh load balancer certificate because:%s", + "ORG_ZSTACK_VPCFIREWALL_10021": "ruleSet[%s] already contains a l3[%s]", + "ORG_ZSTACK_SCHEDULER_10009": "trigger job[uuid: %s] failed, because an error occurred in the virtual machine instance provisioning process", + "ORG_ZSTACK_ZWATCH_MYSQL_10001": "no MySQL database instance found[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10005": "refresh load balancer listener due to:%s", + "ORG_ZSTACK_VPCFIREWALL_10022": "already has a rule with the number[%s]", + "ORG_ZSTACK_SCHEDULER_10029": "Cannot add job[uuid:%s] to an outdated trigger[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10077": "shared volume[uuid: %s] on shared block group primary storage cannot be resized", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10076": "cannot find volume[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10075": "shared block[UUID:%s, diskUUID:%s, description:%s] already exists within shared block group[UUID:%s] in new shared block group", + "ORG_ZSTACK_SCHEDULER_10028": "Cannot add job with UUID [%s] to the same trigger with UUID [%s] twice", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10074": "must specify at least one disk when adding a shared block group for primary storage", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10079": "cannot find the preparation of the volume[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10078": "shared volume[UUID: %s] on shared block group primary storage is attached to non-stopped VM instances[UUIDs: %s]", + "ORG_ZSTACK_SCHEDULER_10021": "interval must be specified when using a simple scheduler for repeat operations more than once", + "ORG_ZSTACK_VPCFIREWALL_10016": "Only TCP or UDP protocols can utilize ports in cloud computing environments.", + "ORG_ZSTACK_VPCFIREWALL_10017": "Only TCP protocol can utilize TCP flags.", + "ORG_ZSTACK_IPSEC_10018": "the VIP[uuid:%s] has been used for %s instance(s)", + "ORG_ZSTACK_VPCFIREWALL_10014": "the ruleSet[%s] already has a rule with the same priority %d.", + "ORG_ZSTACK_IPSEC_10019": "the peer address[%s] cannot be the same as the VIP address", + "ORG_ZSTACK_VPCFIREWALL_10015": "cannot update default rule[%s]", + "ORG_ZSTACK_IPSEC_10013": "All networks within the same IPsec Connection must be associated with the same Virtual Private Cloud (VPC) router.", + "ORG_ZSTACK_IPSEC_10014": "There is no master VPC for HA group %s", + "ORG_ZSTACK_VPCFIREWALL_10018": "ICMP protocol is the only protocol that can use ICMP types. Please ensure your code specifies the correct protocol.", + "ORG_ZSTACK_IPSEC_10015": "There is a VPC[%s] using an old IPsec plugin; please upgrade it to create an IPsec connection.", + "ORG_ZSTACK_VPCFIREWALL_10019": "the rule [%%s] index is invalid", + "ORG_ZSTACK_IPSEC_10016": "There is already an IPsec connection[uuid:%s, name:%s] with the same virtual router and peer address.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10080": "use thick-provisioned storage as the cache volume; the provisioning of volume [%s] is %s", + "ORG_ZSTACK_IPSEC_10010": "All networks within the same IPsec Connection must be of the same type.", + "ORG_ZSTACK_IPSEC_10011": "IPsecConnection can only have 1 network for %s", + "ORG_ZSTACK_IPSEC_10012": "L3Network [UUID: %s] has not been attached to a VPC router", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10084": "cannot retrieve cluster UUID of volume %s", + "ORG_ZSTACK_VPCFIREWALL_10010": "already has a rule template with name %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10081": "The SCSI LUN with UUID [%s] and WWID [%s] is already attached to the primary storage with UUID [%s].", + "ORG_ZSTACK_SCHEDULER_10038": "Invalid cron expression format. Please ensure it adheres to the standard CRON syntax.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10086": "cannot find a qualified KVM host for shared block group primary storage[uuid: %s]", + "ORG_ZSTACK_SCHEDULER_10039": "A cron task must follow the format: \"0 0/3 17-23 * * ?\"", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10085": "sanlock indicates that the host %s is unreachable on %s", + "ORG_ZSTACK_SCHEDULER_10036": "stopTime has exceeded the current time in the virtual environment. Please ensure that stopTime is set to a future point in time.", + "ORG_ZSTACK_SCHEDULER_10037": "cron must be configured when using the cron scheduler", + "ORG_ZSTACK_SCHEDULER_10034": "Duration timeout out of valid range", + "ORG_ZSTACK_SCHEDULER_10035": "stopTime exceeds the valid range for MySQL timestamp format", + "ORG_ZSTACK_SCHEDULER_10032": "startTime must be specified for the simple scheduler to function correctly.", + "ORG_ZSTACK_SCHEDULER_10033": "schedulerInterval must be configured for the simple scheduler to function properly.", + "ORG_ZSTACK_SCHEDULER_10030": "There are [%d] triggers added to job[uuid:%s], exceeding the maximum allowed triggers.", + "ORG_ZSTACK_SCHEDULER_10031": "There are [%d] triggers added to the job group [UUID:%s], and no additional triggers can be added.", + "ORG_ZSTACK_VPCFIREWALL_10005": "the router [uuid:%s] does not have a master router", + "ORG_ZSTACK_VPCFIREWALL_10006": "the VPC Router[uuid:%s] already has a firewall configured.", + "ORG_ZSTACK_VPCFIREWALL_10003": "Cannot delete system default rule set", + "ORG_ZSTACK_VPCFIREWALL_10004": "Cannot delete default system rule", + "ORG_ZSTACK_VPCFIREWALL_10001": "Only system-defined rule sets can modify action types.", + "ORG_ZSTACK_VPCFIREWALL_10000": "cannot detach default rule set in virtual network", + "ORG_ZSTACK_SCHEDULER_10045": "job group has contained %d tasks, only %d slots left", + "ORG_ZSTACK_SCHEDULER_10043": "No Scheduler Job Factory of type[%s] found", + "ORG_ZSTACK_SCHEDULER_10044": "%d tasks have different instance types from the job group", + "ORG_ZSTACK_SCHEDULER_10041": "startTime must be a positive integer or 0", + "ORG_ZSTACK_SCHEDULER_10042": "The start time specified for your instance is out of range. Please ensure it falls within valid parameters.", + "ORG_ZSTACK_SCHEDULER_10040": "Cron scheduler configuration only requires specifying the cron task expression.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10005": "Please integrate zbox into the management node for cloud resource allocation.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10006": "fail to backup database: %s", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10003": "service[%s] is not active", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10007": "There is another external backup [UUID: %s] in recovery mode.", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10002": "service[%s] does not support configuration reload", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10008": "Both host UUIDs and backup storage UUIDs are empty. You must specify at least one of them.", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10001": "service[%s] is not discovered", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10001": "some volume recovery[uuids:%s] failed. You can trigger it again by reconnecting it.", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10000": "service[%s] has been registered and is now active in the cloud environment.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10002": "cannot find recovery configuration file recover.conf under the zbox backup installation directory.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10004": "Zbox should be attached to a host first.", + "ORG_ZSTACK_VPCFIREWALL_10069": "cannot find VPC firewall IP set template with UUID: %s, it may have been deleted", + "ORG_ZSTACK_VPCFIREWALL_10063": "attach firewall rule set[%s] failed because of an error related to virtual network configuration", + "ORG_ZSTACK_VPCFIREWALL_10064": "detach ruleSet failed, possibly due to deletion", + "ORG_ZSTACK_VPCFIREWALL_10061": "delete firewall rule failed on vRouter[%s], due to %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10010": "Fn::Select index out of range, please verify your JSON configuration!", + "ORG_ZSTACK_VPCFIREWALL_10062": "change firewall rule state on vRouter[%s] failed due to %s", + "ORG_ZSTACK_VPCFIREWALL_10067": "cannot find VPC firewall with UUID: %s related virtual router", + "ORG_ZSTACK_VPCFIREWALL_10068": "cannot find VPC firewall rule set with UUID: %s, it may have been deleted", + "ORG_ZSTACK_VPCFIREWALL_10065": "detach firewall rule set[%s] failed because %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10014": "No parameter [%s] found!", + "ORG_ZSTACK_VPCFIREWALL_10066": "cannot find VPC firewall with UUID: %s, it may have been deleted", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10013": "Parameter [%s] has no specified value or default value found!", + "ORG_ZSTACK_VPCFIREWALL_10060": "create firewall rule set[%s] failed because %s", + "ORG_ZSTACK_IMAGE_10046": "The image with UUID [uuid:%s] and name [name:%s] has not been deleted from the backup storage with UUID [uuid:%s].", + "ORG_ZSTACK_IMAGE_10045": "The image with UUID [uuid:%s] and name [name:%s] is not available on the backup storage with UUID [uuid:%s].", + "ORG_ZSTACK_IMAGE_10044": "The image with UUID [uuid:%s] and name [name:%s] has not been deleted from any backup storage.", + "ORG_ZSTACK_IMAGE_10043": "The image with UUID [uuid:%s] and name [name:%s] has a status [status:%s] on the backup storage with UUID [backup storage uuid:%s], which is not Deleted.", + "ORG_ZSTACK_IMAGE_10040": "detach iso with uuid\u003d%s failed, errors are %s", + "ORG_ZSTACK_VPCFIREWALL_10058": "delete firewall rule on vRouter[%s] because %s", + "ORG_ZSTACK_VPCFIREWALL_10052": "default ruleset %s can only be attached to one interface forward, but multiple related interfaces were found: %s", + "ORG_ZSTACK_VPCFIREWALL_10050": "firewall %s related VPC not in running state", + "ORG_ZSTACK_VPCFIREWALL_10051": "cannot delete rule set [%s] as it is still attached to a network interface card", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10020": "cannot find condition [%s] in the \u0027Conditions\u0027 list", + "ORG_ZSTACK_VPCFIREWALL_10056": "Cannot find MAC address associated with l3[%] on vRouter[%s]", + "ORG_ZSTACK_VPCFIREWALL_10057": "create firewall rule[%s] failed due to %s", + "ORG_ZSTACK_VPCFIREWALL_10054": "sync firewall configuration failed because %s", + "ORG_ZSTACK_VPCFIREWALL_10055": "update firewall rule set action failed because %s", + "ORG_ZSTACK_VPCFIREWALL_10049": "no changes detected in ruleset %s", + "ORG_ZSTACK_VPCFIREWALL_10047": "detach firewall rule set from network[%s] failed, because %s", + "ORG_ZSTACK_VPCFIREWALL_10048": "find duplicate rule numbers %s on firewall %s, l3 %s, forward %s", + "ORG_ZSTACK_SSO_CAS_SERVICE_10002": "iam2 contains a user with the same name[%s]", + "ORG_ZSTACK_SSO_CAS_SERVICE_10003": "duplicate login attempt for user type[%s]", + "ORG_ZSTACK_SSO_CAS_SERVICE_10004": "Cannot find CasLogin for type(%s)", + "ORG_ZSTACK_VPCFIREWALL_10041": "could not add firewall rule because the description length of %s is not valid for rule number %d", + "ORG_ZSTACK_VPCFIREWALL_10040": "could not add firewall rule because there is no state for rule number:%d", + "ORG_ZSTACK_VPCFIREWALL_10045": "The firewall rules in the configuration file contain syntax errors: %s", + "ORG_ZSTACK_VPCFIREWALL_10046": "attach firewall rule set[%s] to layer 3 network[%s] failed because %s", + "ORG_ZSTACK_VPCFIREWALL_10044": "The configuration file for the virtual machine instance has a format error. Please check the file and ensure it adheres to the required schema.", + "ORG_ZSTACK_VPCFIREWALL_10038": "could not add firewall rule because source IP length: %s is not valid for rule number: %d", + "ORG_ZSTACK_VPCFIREWALL_10039": "could not add firewall rule because destination IP length: %s is not valid for rule number: %d", + "ORG_ZSTACK_VPCFIREWALL_10036": "could not add firewall rule because the rule number %d is invalid", + "ORG_ZSTACK_VPCFIREWALL_10037": "could not add firewall rule because there is no action defined for ruleNo:%d", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10002": "vyos initialization command failed because:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10001": "unable to establish an SSH connection to the virtual router[%s] after configuring SSH settings", + "ORG_ZSTACK_VPCFIREWALL_10030": "could not add firewall rule[%d] as only ICMP protocol supports specific types", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10003": "failed to change network interface [ip:%s, mac:%s] firewall default action for virtual router [uuid:%s], because %s", + "ORG_ZSTACK_VPCFIREWALL_10031": "could not add firewall rule[%d] as only TCP or UDP protocols are supported for port-based rules", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10006": "unable to start DHCP server on virtual router VM[uuid:%s] because %s", + "ORG_ZSTACK_ZWATCH_FUNCTION_10014": "missing required argument for instance type in cloud formation template", + "ORG_ZSTACK_ZWATCH_FUNCTION_10013": "Unknown arguments detected. Please ensure that all command-line parameters are valid and refer to the documentation for a list of accepted arguments.", + "ORG_ZSTACK_VPCFIREWALL_10034": "could not add firewall rule[%d] as only TCP protocol supports TCP flags in this environment", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10007": "unable to stop DHCP server on virtual router instance [uuid:%s] because %s", + "ORG_ZSTACK_VPCFIREWALL_10035": "could not add firewall rule[%d] because of a %s error" +} \ No newline at end of file diff --git a/conf/i18n/globalErrorCodeMapping/global-error-fr-FR.json b/conf/i18n/globalErrorCodeMapping/global-error-fr-FR.json new file mode 100644 index 00000000000..449344a6cef --- /dev/null +++ b/conf/i18n/globalErrorCodeMapping/global-error-fr-FR.json @@ -0,0 +1,4717 @@ +{ + "ORG_ZSTACK_XINFINI_SDK_10001": "Échec du formatage de la réponse API vers la classe [%s], resultString: %s, exception: %s", + "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10001": "Type de datacenter [%s] non pris en charge ici !", + "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10000": "L'argument 'endpoint' doit être défini pour le type de configuration %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10080": "La création de l'instance Baremetal2 ne peut pas déterminer une zone de calcul appropriée. Veuillez spécifier une zone explicitement.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10084": "Ni l'UUID du châssis ni l'UUID de l'offre du châssis n'est défini lors de la création d'une instance baremetal.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10082": "Le châssis n'a pas une capacité suffisante pour l'image [%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10081": "Le disque requis [%s] n'appartient pas au châssis [%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10087": "Un %s ne peut être créé ou supprimé que lorsque l'instance Baremetal2 est dans un état En cours d'exécution.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10086": "%s ne peut être géré que par des opérations de création ou de suppression", + "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10000": "Format d'entrée incorrect. Seule une liste de nombres séparés par des virgules est acceptée (par exemple, %s).", + "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10001": "La VM hôte n'a que % processeurs disponibles.", + "ORG_ZSTACK_ZWATCH_UTILS_10001": "La ressource [%s] ne prend pas en charge la clause de retour zwatch", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10002": "La fonctionnalité d'authentification d'identité est activée mais le pool de ressources associé n'est pas configuré. Veuillez configurer le pool de ressources et réessayer.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10003": "Impossible de libérer le pool de ressources %s car il est en cours d'utilisation", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10000": "Il n'y a aucune machine virtuelle qui peut être activée", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10001": "Type de jeton %s non valide, seuls les jetons de types utilisés dans les environnements de calcul cloud sont pris en charge.", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10059": "Une licence vide pour les nœuds autorisés est requise", + "ORG_ZSTACK_STORAGE_PRIMARY_10039": "aucun stockage principal [uuid:%s] n'existe", + "ORG_ZSTACK_V2V_10019": "le stockage principal avec UUID:%s n'est pas pris en charge pour la migration de machine virtuelle v2v", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10007": "Échec de la transition de l'instantané de volume [uuid:%s, name:%s] en raison de l'événement d'état [%s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10006": "Échec de la récupération de la taille du volume [uuid:%s, installPath:%s] à partir du stockage principal [uuid:%s], dû à %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10005": "Échec de la récupération de la taille du volume [uuid:%s, installPath:%s] à partir du stockage principal [uuid:%s], %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10004": "vm [uuid:%s] n'est pas dans un état En cours d'exécution, En pause, Détruit ou Arrêté ; état actuel [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_10040": "primaryStorage [uuid=%s] n'existe pas dans l'environnement cloud", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10003": "volume non trouvé pour l'UUID du volume : %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10002": "l'instantané ou son descendant a une référence vers le volume [uuids:%s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10001": "impossible de trouver l'instantané du volume [uuid:%s, name:%s], il peut avoir été supprimé par une opération précédente", + "ORG_ZSTACK_STORAGE_PRIMARY_10047": "cidr [%s] Format d'entrée non valide", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10050": "ZSha2 indique la présence d'un autre nœud de gestion ; cependant, ce nœud n'est pas trouvé dans la base de données. Veuillez vérifier l'existence du nœud de gestion.", + "ORG_ZSTACK_STORAGE_PRIMARY_10046": "une seule étiquette système CIDR de stockage principal est autorisée, mais %d a été obtenu", + "ORG_ZSTACK_STORAGE_PRIMARY_10049": "Conflit clusterUuid, le cluster spécifié par l'offre d'instance est %s, et le cluster spécifié dans le paramètre de création est %s", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10052": "App ID non trouvé lors de l'annulation de l'enregistrement ! Veuillez vérifier l'App ID et réessayer.", + "ORG_ZSTACK_STORAGE_PRIMARY_10042": "Veuillez spécifier le type d'instance et le stockage souhaité avant de provisionner les ressources.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10008": "impossible de réinitialiser le volume[uuid:%s] vers l'instantané[uuid:%s], le volume vm[uuid:%s] n'est pas dans l'état Arrêté, l'état actuel est %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10044": "impossible de trouver un stockage principal qualifié ; les erreurs sont %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10000": "Échec de la mise à jour du statut du groupe : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10050": "Conflit primaryStorageUuid : le stockage principal spécifié par l'offre d'instance est %s, tandis que le stockage principal spécifié dans le paramètre de création est %s.", + "ORG_ZSTACK_V2V_10008": "L'adresse MAC [%s] identique n'est pas autorisée dans le réseau[%s]", + "ORG_ZSTACK_V2V_10009": "Adresse MAC [%s] en double dans le réseau[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_10052": "Conflit primaryStorageUuid : le stockage principal spécifié par l'offre de disque est %s, tandis que le stockage principal spécifié dans le paramètre de création est %s.", + "ORG_ZSTACK_V2V_10006": "l'instance de calcul sous-jacente de l'hôte de conversion[uuid:%s] doit être Connectée", + "ORG_ZSTACK_V2V_10007": "l'hôte de conversion[uuid:%s] ne peut pas établir de connexion avec le stockage principal[uuid:%s]", + "ORG_ZSTACK_V2V_10004": "L'instance de VM [UUID:%s] n'existe pas ou n'est pas une instance de VM VMware", + "ORG_ZSTACK_V2V_10005": "conversionHostUuid ne doit pas être nul. Veuillez vous assurer qu'un UUID d'hôte valide est fourni.", + "ORG_ZSTACK_V2V_10002": "le chemin de stockage de l'hôte de conversion v2v doit être un chemin absolu. Veuillez fournir un chemin absolu valide.", + "ORG_ZSTACK_V2V_10003": "URL v2v invalide : %s", + "ORG_ZSTACK_V2V_10000": "Le statut de l'hôte [uuid:%s] doit être Connecté avant de procéder au déploiement cloud.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10021": "Impossible de prendre un instantané de mémoire, les états VM attendus sont [%s, %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10020": "l'instantané de volume[uuids:%s] est dans l'état désactivé et ne peut pas être utilisé pour la restauration du volume.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10029": "échec de l'annulation du travail de suppression. Le Volume[uuid:%s] attaché VM n'est pas dans l'état %s ; la suppression d'instantané hors ligne n'est pas prise en charge et ne peut pas être annulée.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10028": "échec de l'annulation du travail de suppression. Le Volume[uuid:%s] est associé à une machine virtuelle inexistante ; la suppression d'instantané hors ligne ne prend pas en charge l'annulation.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10027": "échec de l'annulation du travail de suppression. Le Volume[uuid:%s] n'est attaché à aucune VM, et la suppression d'instantané hors ligne ne prend pas en charge l'annulation.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10026": "échec de l'annulation du travail de suppression. Le Volume[uuid:%s] n'existe pas.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10025": "impossible de trouver l'UUID du volume pour les instantanés[uuid: %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10024": "Non pris en charge pour la suppression d'instantanés de différents volumes [UUID: %s, %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10023": "le volume original pour l'instantané [uuid:%s] a été supprimé ; impossible de restaurer le volume à son état original", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10022": "l'instantané de volume [uuid:%s] est actuellement dans l'état %s et ne peut pas être utilisé pour la restauration du volume", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10018": "impossible de trouver l'instantané : %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10017": "le stockage principal[uuid:%s] ne prend pas en charge les instantanés de volume ; par conséquent, un instantané pour le volume[uuid:%s] ne peut pas être créé.", + "ORG_ZSTACK_YUNSHAN_UTIL_10000": "L'URL NSP est nulle, veuillez configurer le NSP de Service de Cloud Computing.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10016": "impossible de demander le stockage principal [uuid:%s] pour la capacité de snapshot de volume", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10015": "impossible de trouver le type pour le stockage principal [%s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10012": "Nombre maximal de snapshots non supporté (%d) pour le volume [UUID:%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10027": "Échec du test de connexion SanSecClientFactory", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10019": "ce type de ressource %s ne prend pas en charge l'interrogation des références de snapshot de mémoire", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10007": "panguPartitionUuid [%s] ne correspond pas à identityZoneUuid [%s]", + "ORG_ZSTACK_APPLIANCEVM_10006": "appliance vm[uuid:%s] est dans le statut %s et ne peut pas effectuer d'appel HTTP vers %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10006": "panguPartitionUuid ou identityZoneUuid doit être spécifié.", + "ORG_ZSTACK_AI_10120": "centre de modèle [uuid:%s] non trouvé dans l'environnement cloud", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10008": "impossible de supprimer la zone d'identité [%s], car elle contient encore des instances de stockage principal Aliyun Ebs, veuillez d'abord vous assurer que toutes les ressources de stockage connexes sont supprimées.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10061": "n'a pas pu modifier la règle du groupe de sécurité car le protocole [%s] ne permet pas de plage de ports de destination vide", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10060": "n'a pas pu modifier la règle du groupe de sécurité car le protocole spécifié [%s] ne prend pas en charge la définition d'une plage de ports de destination", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10063": "n'a pas pu modifier la règle du groupe de sécurité car une règle en double [%s] existe déjà dans la base de données avec l'UUID %s", + "ORG_ZSTACK_APPLIANCEVM_10000": "erreur de définition des informations de bootstrap de l'appliance car :%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10062": "n'a pas pu modifier la règle du groupe de sécurité car le protocole spécifié [%s] nécessite qu'une plage de ports de destination soit définie", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10033": "impossible de supprimer l'offre d'instance [uuid:%s] car elle est utilisée par les groupes d'instances NFV [%s]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10001": "ALIYUN EBS NE PREND PAS EN CHARGE LE REDIMENSIONNEMENT D'UNE VM EN COURS D'EXÉCUTION POUR LE MOMENT.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10031": "Impossible de provisionner le groupe d'instances NFV [uuid:%s, name:%s] lorsque le statut n'est pas en Initialisation.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10000": "impossible de trouver le chemin du périphérique à partir du volume : %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10032": "Impossible de provisionner NfvInstanceGroup[uuid:%s, name:%s] sans instances membres. Veuillez créer au moins une instance NFV dans le groupe avant le provisionnement.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10003": "ISO [%s] est attaché. Veuillez le détacher avant de l'attacher à nouveau.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10006": "CPU invalide [CPU_ID], l'hôte [HOST_UUID] n'a pas de CPU avec l'ID spécifié [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10030": "Impossible de provisionner NfvInstanceGroup[uuid:%s, name:%s] sans IP virtuelle configurée. Veuillez configurer une IP virtuelle pour le groupe avant le provisionnement.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10005": "l'url doit commencer par http:// ou https://, mais a reçu %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10004": "L'URL pour le point de terminaison Ocean doit être configurée pour le stockage principal Alibaba Cloud EBS.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10019": "Le nom[%s] est invalide pour une ressource. Le nom doit respecter les exigences suivantes :", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10013": "- Faire entre 1 et 128 caractères.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10012": "- Être composé de lettres majuscules et minuscules, de chiffres, de soulignements (_) et de traits d'union (-).", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10018": "- Commencer par un caractère alphabétique (lettre).", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10028": "- Ne pas commencer ou se terminer par un espace.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10017": "Aucun gateway BareMetal2 trouvé dans le cluster[uuid:%s]", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10010": "Échec de création du nouveau CloudFile[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10029": "NfvInstanceGroup [uuid:%s] introuvable", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10026": "Impossible de détacher l'instance NFV[uuid:%s] du groupe[uuid:%s, name:%s] car c'est le seul membre. Un groupe doit contenir au moins un membre.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10027": "Impossible de détacher l'instance NFV [uuid:%s] du groupe [uuid:%s, name:%s] car c'est le seul membre en cours d'exécution. Au moins un membre supplémentaire doit être à l'état Running.", + "ORG_ZSTACK_AI_10129": "Valeur nulle inattendue reçue de %s du token: %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10024": "Instance NFV [uuid:%s] introuvable", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10016": "La vérification de la signature de l'entrée %s a échoué pour la validation de la ressource cloud", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10025": "Impossible de désassocier l'instance NFV [uuid:%s] du groupe [uuid:%s, name:%s] car elle n'est pas actuellement associée. Le détail du statut actuel est %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10003": "Le stockage de sauvegarde [UUID: %s] n'est pas associé à la zone [UUID: %s], à laquelle appartient le stockage principal [UUID: %s]", + "ORG_ZSTACK_AI_10127": "Le paramètre mode ne doit pas être vide. Veuillez fournir une valeur de mode valide.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10011": "Échec d'allocation du nœud de calcul dans les clusters[uuids:%s] pour l'instance baremetal[uuid:%s]", + "ORG_ZSTACK_AI_10128": "Les valeurs autorisées actuelles sont ['%s']", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10010": "Échec d'allocation du gateway dans les clusters [uuids:%s] pour l'instance baremetal [uuid:%s]", + "ORG_ZSTACK_AI_10125": "Classification de modèle invalide: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10004": "Le volume[uuid:%s] est attaché à une VM en cours d'exécution. La VM doit être arrêtée avant d'attacher un volume.", + "ORG_ZSTACK_AI_10126": "Configuration invalide stockée pour ModelServiceVO[uuid: %s]: %s", + "ORG_ZSTACK_AI_10123": "Impossible de trouver le centre de modèles avec l'UUID: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10015": "L'IP provisionnée %s est hors de la plage DHCP %s ~ %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10014": "L'IP provisionnée %s a été occupée par une autre instance", + "ORG_ZSTACK_AI_10121": "Aucune instance Model Center trouvée, veuillez d'abord créer une instance Model Center.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10013": "Seuls les clusters BareMetal2 [UUID:%s] répondent aux exigences pour le châssis et le gateway, mais ces clusters n'ont pas de réseau provisionné attaché.", + "ORG_ZSTACK_STORAGE_PRIMARY_10000": "Impossible d'attacher l'ISO à un stockage principal [uuid:%s] qui est désactivé", + "ORG_ZSTACK_AI_10122": "Échec de création du tag système pour ModelServiceInstanceGroupVO[uuid: %s], car %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10012": "Aucun nœud baremetal2 trouvé dans le cluster[uuid:%s]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10019": "Chemin d'installation invalide: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10010": "ID de volume à ajouter: %s, mais un autre ID de volume existe déjà dans l'URL: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10012": "hostUuid [%s] existe déjà dans l'URL: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10014": "URL d'installation invalide: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10015": "Impossible de trouver le chemin du périphérique sur l'hôte: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10008": "Pas de cluster de calcul Baremetal2 trouvé", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10002": "Échec de la génération du client vHost User dans l'hôte[uuid:%s] pour la vm[uuid:%s] : %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10007": "Informations insuffisantes pour déterminer le cluster BareMetal2 à utiliser.%s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10006": "aucun stockage de sauvegarde attaché à la zone [uuid:%s] ne contient l'ISO [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10005": "impossible de trouver l'image avec l'UUID [%s] dans un stockage de sauvegarde connecté. Veuillez vérifier ce qui suit :", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10000": "1. Vérifiez que le stockage de sauvegarde est attaché à la zone où la machine virtuelle (VM) nommée [%s] avec l'UUID [%s] réside.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10009": "2. Confirmez que le stockage de sauvegarde est dans un état connecté. Si ce n'est pas le cas, essayez de le reconnecter.", + "ORG_ZSTACK_STORAGE_PRIMARY_10014": "Échec de la suppression du client vHost User dans l'hôte[uuid:%s] pour la vm[uuid:%s] : %s", + "ORG_ZSTACK_AI_10116": "Échec de l'allocation du stockage principal dans les clusters [uuids:%s] pour l'instance bare metal [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10000": "Le stockage principal avec l'UUID:%s ne peut pas être supprimé car il est encore attaché au cluster avec l'UUID:%s.", + "ORG_ZSTACK_AI_10117": "Impossible de localiser des groupes d'instances de service dans l'environnement cloud. Veuillez vérifier votre configuration.", + "ORG_ZSTACK_STORAGE_PRIMARY_10016": "L'instance baremetal2[uuid:%s] n'existe pas ou n'est pas connectée ; par conséquent, son mot de passe ne peut pas être modifié.", + "ORG_ZSTACK_AI_10114": "Impossible de trouver le dataset avec l'UUID [%s]", + "ORG_ZSTACK_AI_10115": "impossible de attacher le volume[uuid:%s] dont le stockage principal est en maintenance", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10004": "groupe d'instances de service modèle [UUID: %s] non trouvé ; interruption de la vérification d'alive du démarrage-de-service", + "ORG_ZSTACK_AI_10112": "Soit 'UUID de groupe' soit 'Sync All' doit être fourni", + "ORG_ZSTACK_AI_10113": "impossible de trouver l'image avec l'UUID [%s] dans un stockage de sauvegarde connecté associé à l'UUID de zone [%s]. Veuillez vérifier ce qui suit :", + "ORG_ZSTACK_AI_10111": "1. Vérifiez que le stockage de sauvegarde est attaché à la zone correcte où la VM nommée [%s] (UUID: %s) réside.", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10001": "2. Confirmez que le stockage de sauvegarde est dans un état connecté ; si ce n'est pas le cas, essayez de le reconnecter.", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10037": "Type de service modèle non supporté: %s, impossible de trouver le backend correspondant pour gérer les opérations de redémarrage", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10003": "groupe d'instances de service modèle [UUID: %s] non trouvé,跳过 l'attente-du-démarrage-de-service", + "ORG_ZSTACK_STORAGE_PRIMARY_10018": "Impossible de trouver l'instance de service modèle[uuid: %s]", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10032": "Impossible de récupérer les informations de l'interface LLDP car elle n'est pas configurée pour recevoir des données.", + "ORG_ZSTACK_STORAGE_PRIMARY_10017": "Impossible de trouver le nœud autorisé avec licence avec l'UUID [%s]", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10033": "Échec de la référence LLDP pour[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10085": "zoneUuids, clusterUuids, et primaryStorageUuids doivent chacun contenir au moins une liste non vide, ou toutes les valeurs doivent être définies à true.", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10000": "Les nœuds non autorisés ne doivent pas exister avant la mise à niveau vers un environnement serveur sous licence. Veuillez vous assurer que tous les nœuds ont des licences valides avant le processus de mise à niveau.", + "ORG_ZSTACK_STORAGE_PRIMARY_10019": "outputProtocol[%s] existe déjà sur le stockage principal[%s], pas besoin de l'ajouter à nouveau", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10087": "Certains nœuds virtuels sous licence liés ne sont pas terminés.%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10011": "le groupe de sécurité avec l'UUID:%s n'a pas été associé au réseau L3 avec l'UUID:%s, le détachement n'est pas possible", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10086": "Impossible de supprimer les règles de groupe de sécurité d'un groupe de sécurité différent", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10089": "le réseau L3[uuid:%s] n'a pas le type de service réseau[%s] activé", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10088": "Le groupe de sécurité avec UUID:%s a été associé au réseau L3 UUID:%s; par conséquent, il ne peut pas être attaché à nouveau.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10010": "Impossible de créer l'instance NFV, le groupe[uuid:%s, name:%s] a déjà %d membres, le maximum autorisé est de 3", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10026": "le relativeTime[%s] est invalide, il dépasse la valeur maximale autorisée", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10025": "le relativeTime[%s] est invalide; il doit être spécifié dans un format tel que 10s ou 1h.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10008": "Impossible de créer l'instance NFV lorsque le groupe [uuid:%s, name:%s] est en mode Active. Veuillez d'abord passer en mode Maintenance.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10009": "Impossible de créer l'instance NFV lorsque le groupe[uuid:%s, name:%s] est dans le statut %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10006": "L'instance NFV %s [uuid: %s] du groupe d'instances NFV %s [uuid: %s] a changé de statut HA de %s à %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10039": "Le volume vhost ne prend pas en charge l'attachement à bareMetalInstance2", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10038": "L'interface réseau avec MAC:%s ne peut pas être attachée au réseau L3 car elle a été groupée", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10004": "Tous les nœuds ne sont pas dans l'état attendu pour le déploiement cloud. Veuillez vérifier le statut de tous les nœuds et vous assurer qu'ils remplissent les conditions requises pour l'opération.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10002": "La création du groupe d'affinité pour le groupe d'instances NFV [uuid:%s] a échoué", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10033": "customMAC est obligatoire lors de l'attachement d'un réseau L3 à une instance BareMetal.", + "ORG_ZSTACK_STORAGE_PRIMARY_10024": "Le stockage primaire [uuid: %s] où se trouvent les volumes n'est pas activé ou connecté", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10032": "Le type de réseau L2 %s n'est pas pris en charge par les instances Baremetal2.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10031": "Seul le réseau de couche 3 avec la version IP %d est pris en charge par l'instance Baremetal2", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10031": "Seul un serveur de licences est autorisé à désenregistrer une instance cliente sous licence.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10030": "L'instance Baremetal2[uuid:%s] n'a pas été attribuée à un nœud de calcul; veuillez démarrer l'instance et réessayer.", + "ORG_ZSTACK_STORAGE_PRIMARY_10021": "Le stockage primaire et le cluster ne sont pas dans la même zone de disponibilité[uuid:%s] [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10037": "L'adresse MAC %s a déjà été attribuée, veuillez en essayer une autre", + "ORG_ZSTACK_STORAGE_PRIMARY_10020": "Le stockage primaire [uuid:%s] a été attaché au cluster [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10036": "L'instance baremetal2[uuid:%s] fonctionnant sur le châssis[uuid:%s] n'a pas d'interface réseau de mise en service avec l'adresse MAC %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10023": "'UUID' et 'Type' doivent être définis simultanément pour les deux ou pour aucun !", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10035": "L'adresse MAC %s est dupliquée", + "ORG_ZSTACK_STORAGE_PRIMARY_10022": "L'URL[%s] est déjà en cours d'utilisation et ne peut pas être dupliquée dans le même cluster.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10034": "%s n'est pas une adresse MAC valide", + "ORG_ZSTACK_AI_10130": "Valeur inattendue obtenue: %s de %s, les valeurs attendues sont dans la plage prédéfinie pour les métriques de ressources cloud", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10026": "Type de licence invalide %s pour l'environnement de cloud computing", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10027": "Aucune machine virtuelle autorisée ne doit exister lors de l'enregistrement d'un serveur de licences.%s", + "ORG_ZSTACK_STORAGE_PRIMARY_10029": "impossible de réserver %s octets sur le stockage principal[uuid:%s], il manque de capacité disponible", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10093": "les VM nics avec les UUIDs:%s ne sont pas sur les réseaux L3 associés au groupe de sécurité UUID:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_10028": "Après soustraction de la capacité réservée, le stockage principal disponible n'est pas suffisant pour la taille requise, possibly dû à un seuil plus bas pour le paramètre de capacité physique du stockage principal.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10096": "impossible d'ajouter une règle de groupe de sécurité car un UUID en double existe dans remoteSecurityGroupUuids: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10095": "impossible d'ajouter une règle de groupe de sécurité car la liste des règles ne peut pas être vide ou dépasser le nombre maximum de %d", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10098": "L'UUID du groupe de sécurité distant est en conflit avec une entrée existante. Veuillez vérifier et mettre à jour la règle du groupe de sécurité.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10022": "Impossible de détacher l'instance NFV du groupe [uuid:%s, name:%s] en mode de fonctionnement Normal. Veuillez d'abord passer en mode Maintenance.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10097": "impossible d'ajouter une règle de groupe de sécurité car le groupe de sécurité [uuid:%s] n'existe pas", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10023": "Impossible de détacher l'instance NFV du groupe[uuid:%s, name:%s] lorsque le statut est %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10020": "Impossible d'attacher une instance NFV au groupe [uuid:%s, name:%s]. Le statut du groupe est %s avec %d membres. L'attachement est uniquement autorisé lorsque : le groupe est vide ou dans un état Sain/Dégradé avec 1-2 membres.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10099": "impossible d'ajouter une règle de groupe de sécurité car la priorité doit être supérieure à %d ou égale à %d", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10018": "direction[%s] invalide, seules les directions prises en charge sont autorisées", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10024": "type[%s] invalide, seuls les types primitifs ou les types de référence couramment utilisés sont autorisés", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10019": "Impossible d'attacher l'instance NFV au groupe [UUID: %s, Name: %s] lorsque son statut est %s", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10023": "valeur droite[%s] invalide, doit être un nombre à virgule flottante", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10029": "l'instance baremetal2[uuid:%s] n'est pas arrêtée et ne peut pas être modifiée vers une autre offre de châssis.", + "ORG_ZSTACK_STORAGE_PRIMARY_10030": "Après avoir retiré le stockage principal%s à éviter, il n'y a plus de stockage principal candidat disponible. Veuillez vérifier le statut et l'état du stockage principal dans le cluster.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10022": "valeur droite[%s] invalide, doit être un nombre à virgule flottante supérieur à zéro et inférieur à un", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10017": "Impossible d'attacher l'instance NFV [uuid:%s] au groupe [uuid:%s, name:%s]. L'instance fait déjà partie de ce groupe avec un statut de cluster de %s. L'attachement n'est pas autorisé lorsque l'instance est dans les états Leader, Follower, Leaving ou Joining Candidate.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10021": "arguments %s invalides, aucun argument n'est autorisé dans ce contexte", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10018": "Impossible d'attacher une instance NFV au groupe [UUID:%s, Name:%s] en mode de fonctionnement Normal. Veuillez d'abord passer le groupe en mode Maintenance.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10020": "valeur droite[%s] invalide, doit être un type numérique valide (int, long, float, double) dans les environnements de cloud computing", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10015": "syncNfvInstGroup est uniquement autorisé en mode Maintenance. Mode actuel : %s. Veuillez d'abord passer en mode Maintenance.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10013": "Impossible de modifier le mode de fonctionnement pendant l'état INITIALIZING. Veuillez vous assurer que le groupe est prêt avant d'effectuer des modifications. Statut actuel : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10036": "PrimaryStorageTagAllocatorExtensionPoint[%s] renvoie zéro candidats de stockage principal éligibles", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10022": "L'opération actuelle n'est pas prise en charge sur une instance baremetal locale. Veuillez vous assurer que l'opération est effectuée dans un environnement virtualisé.", + "ORG_ZSTACK_STORAGE_PRIMARY_10035": "PrimaryStorageFeatureAllocatorFlow[%s] renvoie zéro candidats de stockage principal viables", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10021": "Une instance bare metal n'est pas autorisée à modifier ses paramètres réseau de VM NIC. Veuillez vous assurer d'utiliser un type d'instance compatible.", + "ORG_ZSTACK_STORAGE_PRIMARY_10038": "%s est invalide. %s n'est pas un UUID d'instance valide", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10020": "Prend uniquement en charge le réseau VPC pour attacher un EIP aux instances BareMetal2.", + "ORG_ZSTACK_STORAGE_PRIMARY_10037": "le stockage principal [uuid:%s] n'est pas à l'état connecté, l'état actuel est %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10026": "l'instance baremetal2 [uuid:%s] est opérationnelle mais son agent n'est pas connecté", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10025": "l'instance baremetal2 [uuid:%s] n'est pas éteinte", + "ORG_ZSTACK_STORAGE_PRIMARY_10034": "impossible de trouver le stockage principal avec l'étiquette définie par l'utilisateur[%s]. L'étiquette définie par l'utilisateur est spécifiée dans l'offre d'instance ou l'offre de disque", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10024": "l'instance baremetal2 [uuid:%s] n'est pas connectée", + "ORG_ZSTACK_STORAGE_PRIMARY_10033": "impossible de trouver le stockage principal [uuid:%s], l'UUID est spécifié dans l'offre d'instance ou la spécification de l'offre de disque", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10023": "L'opération n'est pas prise en charge sur les instances BareMetal2. Veuillez assurer la compatibilité avec les environnements virtualisés", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10051": "le chassis baremetal2 avec UUID:%s n'existe pas", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10050": "pas besoin de définir chassisOfferingUuid car l'instance s'est déjà vu attribuer une offre de chassis", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10021": "impossible de définir le groupe de sécurité de la VM NIC car le groupe de sécurité spécifié [uuid:%s] n'appartient pas à votre compte [uuid:%s] ni à un administrateur", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10020": "impossible de définir le groupe de sécurité de la VM NIC à cause d'un groupe de sécurité en double [uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10023": "impossible de définir le groupe de sécurité de la VM NIC à cause d'une priorité invalide ; des priorités consécutives étaient attendues, mais %d et %d ont été trouvées", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10022": "impossible de définir le groupe de sécurité de la VM NIC à cause d'une priorité invalide ; la priorité doit commencer à 1, mais [%d]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10025": "impossible de définir le groupe de sécurité de la VM NIC car la priorité du groupe de sécurité administrateur [%d] doit être supérieure à celle des groupes utilisateurs", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10027": "impossible de modifier l'état de la règle du groupe de sécurité car le groupe de sécurité [uuid:%s] n'a pas été trouvé", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10026": "Impossible de modifier l'état de la règle du groupe de sécurité car la liste des UUIDs de règles est vide. Veuillez fournir des UUIDs de règles valides pour continuer", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10029": "Impossible de modifier l'état de la règle du groupe de sécurité car aucune règle de groupe de sécurité ne nécessite de changement d'état", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10028": "impossible de modifier l'état de la règle du groupe de sécurité car la règle du groupe de sécurité [uuid:%s] n'a pas été trouvée", + "ORG_ZSTACK_ZWATCH_10004": "Certains messages ont expiré et ne sont pas autorisés à être modifiés en raison des contraintes système. Le système supprimera automatiquement ces messages expirés. Veuillez réessayer votre opération plus tard", + "ORG_ZSTACK_ZWATCH_10003": "type d'action invalide : %s, seules les opérations d'écriture ou de suppression sont prises en charge", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10054": "le chassis baremetal2 [uuid:%s] a déjà été alloué à une autre ressource", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10053": "le chassis baremetal2 [uuid:%s] n'est pas activé", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10052": "le chassis baremetal2 [uuid:%s] n'est pas associé à l'offre de chassis [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10059": "Veuillez ne pas définir simultanément l'UUID du chassis et l'UUID de l'offre de chassis", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10057": "le cluster [uuid:%s] est spécifié mais ce n'est pas un cluster Baremetal2 activé ; par conséquent, une instance Baremetal2 ne peut pas être créée à partir de celui-ci", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10056": "la zone [uuid:%s] est spécifiée mais elle n'est pas activée ; par conséquent, une instance baremetal2 ne peut pas être créée", + "ORG_ZSTACK_AI_SERVICE_10001": "Échec de recherche du VO du Service de Développement d'Application avec UUID de service du modèle : %s et UUID de compte : %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10040": "Ceph tiers ne peut pas être mélangé avec d'autres types de stockage principal. Veuillez assurer la cohérence dans votre configuration de stockage", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10030": "Échec de modification de la politique de sécurité VM NIC car les politiques d'entrée et de sortie ne peuvent pas être nulles. Veuillez vous assurer qu'au moins une politique est définie", + "ORG_ZSTACK_ZWATCH_10002": "retour zwatch invalide avec clause : %s, %s", + "ORG_ZSTACK_ZWATCH_10001": "paramètre inconnu [%s] dans la clause de retour zwatch, veuillez vous assurer qu'il s'agit d'un paramètre valide pour l'environnement de cloud computing spécifié", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10032": "impossible de modifier la politique de sécurité de la carte réseau VM en raison d'une politique de sortie [%s] invalide", + "ORG_ZSTACK_AI_SERVICE_10005": "Aucune tâche ne nécessite de test, marquer comme échec.%s", + "ORG_ZSTACK_AI_SERVICE_10004": "Impossible de trouver l'instance de service ; veuillez vous assurer que l'instance est correctement créée et associée à votre tâche d'évaluation. Échec de la soumission de la tâche.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10031": "impossible de modifier la politique de sécurité de la carte réseau VM en raison d'une règle d'entrée [%s] invalide", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10034": "impossible de modifier la politique de sécurité de la carte réseau VM car la carte réseau VM [UUID:%s] n'a aucune politique de sécurité associée", + "ORG_ZSTACK_AI_SERVICE_10003": "impossible de trouver le groupe de services avec l'UUID [%s] disponible pour soumettre la tâche d'évaluation, signaler l'échec", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10033": "impossible de modifier la politique de sécurité de la carte réseau VM car la carte réseau VM [uuid:%s] n'a pas été trouvée", + "ORG_ZSTACK_AI_SERVICE_10002": "Le groupe d'instances de service modèle [UUID: %s] pour les tests n'a pas d'URLs disponibles.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10036": "impossible de mettre à jour la priorité de la règle du groupe de sécurité car le groupe de sécurité [uuid:%s] n'existe pas", + "ORG_ZSTACK_AI_SERVICE_10008": "Toutes les instances de calcul ont échoué à démarrer.%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10035": "impossible de mettre à jour la priorité de la règle du groupe de sécurité en raison d'un type [%s] invalide", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10038": "impossible de mettre à jour la priorité de la règle du groupe de sécurité car le nombre de règles dans le groupe de sécurité [uuid:%s] ne correspond pas au nombre attendu", + "ORG_ZSTACK_AI_SERVICE_10006": "Erreur lors du démarrage de l'évaluation sur %s, car %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10037": "Impossible de mettre à jour la priorité de la règle du groupe de sécurité car la liste des règles est vide. Veuillez vous assurer qu'il y a des règles définies avant d'essayer cette opération.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10039": "impossible de mettre à jour la priorité de la règle du groupe de sécurité car la priorité de règle [%d] est invalide", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10049": "pas besoin de définir chassisOfferingUuid car l'instance a déjà été assignée à un châssis", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10004": "échec de la récupération des informations de licence pour le stockage principal [%s], car les données de réponse indiquent qu'aucune licence active n'est disponible", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10044": "la passerelle baremetal2 avec l'UUID: %s ne fait pas partie du cluster avec l'UUID: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10043": "la passerelle baremetal2 avec l'UUID: %s n'existe pas ou n'est pas activée ou connectée", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10042": "le cluster [uuid:%s] n'est pas un cluster baremetal2 activé, impossible de démarrer l'instance [uuid:%s] à l'intérieur", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10041": "l'instance de provisionnement distant ne prend pas en charge la connexion d'une carte réseau de provisionnement à un bond %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10047": "l'offre de châssis baremetal2 [uuid:%s] n'est pas activée", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10046": "l'offre de châssis baremetal2 [UUID:%s] n'existe pas", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10045": "Veuillez spécifier l'UUID du châssis ou l'UUID de l'offre de châssis pour démarrer l'instance Baremetal [uuid:%s].", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10029": "délai d'attente de la création du snapshot, progression de %d%%", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10028": "Le stockage principal EBS ne prend pas en charge la réduction de la taille pour le moment.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10073": "l'image [uuid:%s] est au format: %s, seuls les formats %s sont pris en charge pour les instances BareMetal2", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10072": "l'image [uuid:%s] est de type média: %s ; seul un modèle de volume root peut être utilisé pour créer une instance baremetal.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10041": "impossible de mettre à jour la priorité de la règle du groupe de sécurité car la règle avec l'UUID:%s n'est pas associée au groupe de sécurité avec l'UUID:%s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10071": "L'image [uuid:%s] n'est pas prête, impossible de créer une instance baremetal2 à partir de celle-ci", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10040": "impossible de mettre à jour la priorité de la règle du groupe de sécurité car la priorité [%d] est dupliquée", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10070": "L'image [uuid:%s] n'est pas activée ; par conséquent, une instance baremetal2 ne peut pas être créée à partir de celle-ci.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10043": "impossible de mettre à jour la priorité de la règle du groupe de sécurité car un UUID de règle en double existe", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10021": "chemin d'installation du snapshot invalide : %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10042": "impossible de mettre à jour la priorité de la règle du groupe de sécurité car la priorité [%d] spécifiée n'existe pas dans le groupe de sécurité [uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10045": "impossible de modifier la règle du groupe de sécurité car la règle spécifiée est une règle par défaut ; seule la description et le statut peuvent être mis à jour", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10044": "impossible de modifier la règle du groupe de sécurité car la règle du groupe de sécurité spécifiée avec l'UUID [%s] n'existe pas", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10022": "Le stockage principal Alibaba Cloud EBS [UUID:%s, Nom:%s] ne peut trouver aucun hôte disponible dans les clusters attachés pour instancier le volume.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10047": "impossible de modifier la règle du groupe de sécurité car le groupe de sécurité %s a dépassé sa limite maximale de %d règles", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10025": "impossible de trouver le snapshot à partir de l'image : %s, l'image a peut-être été supprimée", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10046": "impossible de modifier la règle du groupe de sécurité car la priorité de la règle [%s] ne peut pas être définie sur la priorité de règle par défaut [%d]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10024": "Environnement cloud non supporté", + "ORG_ZSTACK_COMPUTE_CPUPINNING_10002": "Cpuset [%s] spécifié invalide pour la configuration de l'instance. Veuillez vous assurer que le cpuset est valide et fait référence à un ensemble approprié de cœurs de CPU.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10049": "impossible de modifier la règle du groupe de sécurité en raison de l'état invalide [%s]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10027": "échec de l'installation du tdc sur les hôtes suivants : [%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10048": "impossible de modifier la règle du groupe de sécurité en raison de la limite de priorité maximale de la règle %s étant [%d]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10026": "échec de l'établissement d'une connexion avec les clusters suivants : [%s]", + "ORG_ZSTACK_COMPUTE_CPUPINNING_10000": "référence de pinning CPU invalide [%s]. Les exemples corrects sont [1,3:3-6,^5] ou [1-2,4:6].", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10004": "impossible de générer le client vhost-user pour la machine virtuelle [uuid:%s] sur l'hôte de destination [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10077": "l'architecture du cluster baremetal2 [arch:%s] et de l'image [arch:%s] ne correspondent pas", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10076": "Mode de démarrage différent détecté entre l'image et l'instance ou l'offre. Veuillez vous assurer qu'ils correspondent.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10075": "seules les images avec le mode de démarrage %s sont supportées pour créer des instances Baremetal2", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10074": "L'image [uuid:%s] n'est pas une image BareMetal2 ; par conséquent, elle ne peut pas être utilisée pour créer une instance BareMetal2.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10079": "Le stockage principal du volume racine et le stockage principal du volume de données doivent être dans le même cluster.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10078": "Toutes les offres de disque [UUIDs:%s] ne sont pas activées ; par conséquent, une instance BareMetal2 ne peut pas être créée à partir de celles-ci.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10050": "impossible de modifier la règle du groupe de sécurité en raison de l'action invalide [%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10062": "l'offre de châssis baremetal2 [uuid:%s] n'est pas activée ; par conséquent, une instance baremetal2 ne peut pas être créée à partir de celle-ci.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10061": "le châssis baremetal2 [uuid:%s] n'est pas disponible ; par conséquent, une instance baremetal2 ne peut pas être créée à partir de celui-ci.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10060": "le châssis baremetal2 avec l'UUID:%s n'est pas activé ; par conséquent, une instance baremetal2 ne peut pas être créée à partir de celui-ci.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10051": "impossible de modifier la règle du groupe de sécurité en raison d'un protocole invalide[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10054": "impossible de modifier la règle du groupe de sécurité car la plage d'adresses IP source [%s] est spécifiée ; l'UUID du groupe de sécurité distant [%s] doit être laissé vide", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10031": "Aliyun EBS PrimaryStorage ne prend en charge que le type Aliyun EBS BS, le type obtenu est en réalité : %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10056": "impossible de modifier la règle de sortie du groupe de sécurité car la plage d'adresses IP source ne peut pas être spécifiée pour le type Sortant", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10034": "la ressource[uuid: %s] est introuvable", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10055": "impossible de modifier la règle d'entrée du groupe de sécurité car dstIpRange ne peut pas être spécifié pour cette règle[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10058": "impossible de modifier la règle du groupe de sécurité car le groupe de sécurité distant [uuid:%s] est introuvable", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10057": "impossible de modifier la règle du groupe de sécurité car une plage d'adresses IP de destination [%s] est spécifiée ; l'UUID du groupe de sécurité distant [%s] doit être laissé vide", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10059": "impossible de modifier la règle du groupe de sécurité car le groupe de sécurité distant [UUID:%s] est configuré ; la plage d'adresses IP source et la plage d'adresses IP de destination doivent être vides", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10066": "l'image ne peut pas être vide à moins que le châssis soit en mode direct", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10065": "la passerelle baremetal2 avec l'UUID : %s n'est pas localisée dans le même cluster que le châssis avec l'UUID : %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10064": "la passerelle baremetal2 [UUID: %s] n'est pas connectée ; par conséquent, une instance baremetal2 ne peut pas être créée à partir de celle-ci", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10063": "la passerelle baremetal2 avec l'UUID:%s n'est pas activée ; par conséquent, une instance baremetal2 ne peut pas être créée à partir de celle-ci", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10069": "le disque du châssis[%s] n'a pas une capacité suffisante pour l'image[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10068": "l'image[uuid:%s] n'existe pas dans le référentiel d'images", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10067": "le mode direct ne prend pas en charge la sélection d'images", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREBLOCK_10000": "shareblock indique que l'hôte %s est inaccessible sur %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10100": "impossible d'ajouter une règle de groupe de sécurité en raison d'un protocole invalide[%s] ; les protocoles valides sont %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10102": "impossible d'ajouter une règle de groupe de sécurité car une version IP invalide [%d] a été spécifiée ; les versions valides sont %d/%d", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10101": "impossible d'ajouter une règle de groupe de sécurité en raison d'une action invalide[%s] ; les actions valides incluent %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10104": "impossible d'ajouter une règle de groupe de sécurité car le CIDR autorisé [%s] et la plage d'adresses IP de destination [%s] sont en conflit", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10103": "impossible d'ajouter une règle de groupe de sécurité car la plage d'adresses IP source [%s] n'est pas autorisée pour une règle de sortie", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10106": "impossible d'ajouter une règle de groupe de sécurité car la plage d'adresses IP de destination[%s] n'est pas autorisée pour une règle d'entrée", + "ORG_ZSTACK_COMPUTE_HOST_10041": "échec de la vérification de l'ID VLAN [%s] pour la liaison réseau [%s] sur l'hôte KVM [UUID: %s], %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10105": "impossible d'ajouter une règle de groupe de sécurité car la plage d'adresses IP[%s] et l'UUID du groupe de sécurité distant[%s] sont en conflit", + "ORG_ZSTACK_COMPUTE_HOST_10043": "échec de la vérification de l'ID VLAN [%s] pour l'interface réseau [%s] sur l'hôte KVM [UUID: %s], %s", + "ORG_ZSTACK_VPC_10048": "l'adresse DNS [%s] a été ajoutée au routeur VPC [uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10107": "impossible d'ajouter une règle de groupe de sécurité car le CIDR autorisé [%s] est en conflit avec la plage d'adresses IP source [%s]", + "ORG_ZSTACK_VPC_10047": "le réseau L3 VPC doit être associé à un vRouter VPC avant d'effectuer toute opération liée au vRouter (comme démarrer/arrêter des VMs, créer des équilibreurs de charge, etc.)", + "ORG_ZSTACK_ALIYUN_CORE_10022": "le statut de la tâche de capture d'écran est terminé %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10109": "n'a pas pu ajouter la règle du groupe de sécurité car le type de protocole ALL ou ICMP ne peut pas définir dstPortRange[%s]", + "ORG_ZSTACK_ALIYUN_CORE_10023": "L'opération n'est pas prise en charge pour les instances HybridClient. Veuillez utiliser un type de client compatible.", + "ORG_ZSTACK_ALIYUN_CORE_10021": "la tâche d'instantané ne peut pas se terminer dans les %d millisecondes, la progression actuelle est de %d%, l'état est %s", + "ORG_ZSTACK_ALIYUN_CORE_10026": "Le point de terminaison de l'API Ocean ne peut pas être nul. Veuillez fournir un point de terminaison valide.", + "ORG_ZSTACK_VPC_10042": "non pris en charge pour récupérer l'état du service %s sur le routeur virtuel %s", + "ORG_ZSTACK_COMPUTE_HOST_10048": "échec de la mise à jour de l'IP de bonding, car %s", + "ORG_ZSTACK_VPC_10041": "impossible de définir l'état du routage distribué sur le routeur virtuel %s", + "ORG_ZSTACK_ALIYUN_CORE_10024": "accessKey et secretAccessKey doivent être configurés", + "ORG_ZSTACK_VPC_10040": "impossible de récupérer les connexions pour le routage distribué vers le routeur virtuel %s", + "ORG_ZSTACK_COMPUTE_HOST_10044": "échec de la définition du type de service[%s] pour le bonding réseau[%s] sur l'hôte KVM[UUID: %s], %s", + "ORG_ZSTACK_VPC_10045": "non pris en charge pour mettre à jour l'état du service %s vers le routeur virtuel %s", + "ORG_ZSTACK_COMPUTE_HOST_10047": "échec de la mise à jour de l'IP de l'interface car %s", + "ORG_ZSTACK_COMPUTE_HOST_10046": "échec de la définition du type de service[%s] pour l'interface réseau[%s] sur l'hôte KVM[UUID: %s], %s", + "ORG_ZSTACK_VPC_10043": "impossible de récupérer l'état du routage distribué vers le routeur virtuel %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10111": "n'a pas pu ajouter la règle du groupe de sécurité car le port de fin [%d] doit être supérieur ou égal au port de début [%d]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10110": "Le type de protocole ALL ou ICMP ne prend pas en charge la définition du port de début ou de fin. Veuillez vous assurer que le protocole est approprié pour la configuration de votre règle de groupe de sécurité.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10113": "Le type de protocole TCP/UDP nécessite qu'une plage de ports de destination soit spécifiée. Veuillez fournir la plage de ports nécessaire et réessayer.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10112": "n'a pas pu ajouter la règle du groupe de sécurité car dstPortRange[%s] est en conflit avec startPort[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10115": "n'a pas pu ajouter la règle du groupe de sécurité car une règle en double[%s] existe déjà dans la base de données pour le groupe de sécurité spécifié", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10114": "n'a pas pu ajouter la règle du groupe de sécurité car les règles [%s] et [%s] sont en double", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10117": "n'a pas pu ajouter la règle du groupe de sécurité car le groupe de sécurité %s a atteint sa limite maximale de %d règles", + "ORG_ZSTACK_COMPUTE_HOST_10052": "échec de la récupération des ID VLAN pour l'hôte [UUID:%s] : %s", + "ORG_ZSTACK_VPC_10039": "n'a pas pu ajouter la plage IPv6 au réseau L3 [uuid:%s], car elle chevauche le CIDR [%s] du routeur virtuel [uuid:%s]", + "ORG_ZSTACK_ALIYUN_IMAGE_10002": "L'opération est limitée aux images personnalisées uniquement.", + "ORG_ZSTACK_CORE_CONFIG_10002": "Impossible de trouver la Configuration Globale[catégorie: %s, nom: %s]", + "ORG_ZSTACK_VPC_10038": "n'a pas pu ajouter la plage d'adresses IP au réseau L3 [UUID:%s], car elle chevauche le CIDR [%s] du routeur virtuel [UUID:%s]", + "ORG_ZSTACK_ALIYUN_IMAGE_10003": "Seuls les disques principaux peuvent créer des miroirs.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10119": "n'a pas pu ajouter la règle du groupe de sécurité car le groupe de sécurité %s a dépassé sa limite maximale de %d règles", + "ORG_ZSTACK_NETWORK_PLUGIN_10001": "libération du ARP gratuit en raison de :%s", + "ORG_ZSTACK_VPC_10037": "l'adresse DNS [%s] n'est pas associée au routeur vpc [uuid:%s]", + "ORG_ZSTACK_VPC_10036": "dns[%s] n'est pas une adresse IP valide", + "ORG_ZSTACK_CORE_CONFIG_10004": "Ne pas autoriser le bypass de vérification pour les ressources cloud.", + "ORG_ZSTACK_NETWORK_PLUGIN_10000": "erreur d'application ARP gratuit à cause de :%s", + "ORG_ZSTACK_ALIYUN_IMAGE_10001": "L'image indiquée est en cours d'importation dans le datacenter...", + "ORG_ZSTACK_ALIYUN_CORE_10011": "impossible de saisir un fichier de longueur nulle comme image de VM !", + "ORG_ZSTACK_ALIYUN_IMAGE_10006": "Prise en charge uniquement du Service de Sauvegarde de Stockage basé sur les Images", + "ORG_ZSTACK_ALIYUN_IMAGE_10007": "Le nom de l'image ne peut pas commencer par http:// ou https://. Veuillez utiliser un nom d'image valide.", + "ORG_ZSTACK_ALIYUN_IMAGE_10004": "aucun bucket OSS associé au datacenter : %s", + "ORG_ZSTACK_ALIYUN_IMAGE_10005": "Impossible de supprimer l'image système ECS à distance", + "ORG_ZSTACK_VPC_10031": "Le réseau L2 [UUID: %s] du réseau L3 [UUID: %s] n'est pas attaché au cluster [UUID: %s]", + "ORG_ZSTACK_VPC_10030": "aucune plage IP attachée au réseau L3[uuid:%s]", + "ORG_ZSTACK_ALIYUN_CORE_10016": "Veuillez fournir un identifiant de ressource cloud valide !", + "ORG_ZSTACK_ALIYUN_CORE_10013": "Permission refusée pour : %s", + "ORG_ZSTACK_VPC_10035": "Le réseau L3 [UUID:%s] doit être attaché en premier car il contient un VIP.", + "ORG_ZSTACK_COMPUTE_HOST_10055": "cluster[uuids:%s, hypervisorType:%s] n'existe pas !", + "ORG_ZSTACK_VPC_10034": "L'adresse IP statique spécifiée [%s] ne correspond pas aux IPs de la passerelle [%s] du réseau de Layer 3 [UUID: %s].", + "ORG_ZSTACK_ALIYUN_CORE_10017": "Échec de l'exécution du code Java, Code d'erreur : %s, Message d'erreur : %s", + "ORG_ZSTACK_COMPUTE_HOST_10058": "host[uuid:%s] ne peut pas trouver la ressource spécifiée", + "ORG_ZSTACK_VPC_10033": "la passerelle du réseau l3 [uuid:%s] est déjà occupée par une autre instance/ip:%s", + "ORG_ZSTACK_ALIYUN_CORE_10018": "Périphérique Non Prêt dans les %d millisecondes", + "ORG_ZSTACK_VPC_10032": "le réseau public [UUID: %s] VIP [UUID: %s, IP: %s] ne peut pas peer avec le réseau L3 [UUID: %s] car il n'est pas situé sur le VPC VR [UUID: %s]", + "ORG_ZSTACK_COMPUTE_HOST_10019": "prise en charge uniquement des snapshots à chaud sur VM lorsqu'elle est dans l'état [%s], mais la VM est actuellement dans l'état [%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10120": "impossible d'ajouter une règle de groupe de sécurité car la priorité[%d] doit être consécutive ; la priorité maximale autorisée pour les règles ingress est [%d].", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10000": "échec de la récupération des informations de licence pour le stockage principal[%s] en raison de l'absence d'adresse IP de surveillance", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10001": "échec de la récupération des informations de licence pour le stockage principal[%s], aucune donnée n'a été retournée", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10122": "Échec de l'application des règles de groupe de sécurité à l'instance actuelle[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10002": "échec de la récupération des informations de licence pour le stockage principal [%s] car le temps d'expiration est null", + "ORG_ZSTACK_ALIYUN_IMAGE_10008": "aucun stockage de sauvegarde configuré pour l'UUID d'image : %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10121": "impossible d'ajouter une règle de groupe de sécurité car la priorité[%d] doit être consécutive ; la priorité maximale autorisée pour les règles egress est [%d].", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10003": "échec de l'analyse du format de date[%s] des informations de licence du stockage principal[%s]", + "ORG_ZSTACK_ALIYUN_IMAGE_10009": "capacité de stockage de sauvegarde dépassée pour imageUuid: %s, veuillez le spécifier manuellement", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10124": "le service réseau[type:%s] n'est pas activé sur le réseau l3[uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10123": "Échec de l'application des règles du groupe de sécurité à certaines machines virtuelles", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10125": "échec du changement de priorité de la règle[uuid:%s] car elle n'est pas trouvée", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10128": "le service réseau[type:%s] n'est pas activé sur le réseau l3[uuid:%s] associé à la nic[uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10127": "la nic de VM avec UUID:%s a été attachée au groupe de sécurité avec UUID:%s", + "ORG_ZSTACK_ALIYUN_IMAGE_10011": "l'image [%s] n'est pas activée actuellement", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10129": "le groupe de sécurité avec UUID [%s] n'appartient pas à votre compte avec UUID [%s] ou à un administrateur", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10004": "l'ID virtuel[uuid:%s] n'appartient pas à l'organisation[uuid:%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10005": "l'organisation[uuid:%s] a déjà un superviseur désigné", + "ORG_ZSTACK_ALIYUN_CORE_10001": "échec de l'ajout du point de terminaison au SDK, dû à: %s", + "ORG_ZSTACK_ALIYUN_CORE_10005": "accessKey et secretAccessKey doivent être configurés !", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10003": "l'ID virtuel[uuid:%s] n'existe pas", + "ORG_ZSTACK_COMPUTE_HOST_10028": "nic[%s] est supprimée", + "ORG_ZSTACK_COMPUTE_HOST_10023": "erreur d'opération, car %s", + "ORG_ZSTACK_ALIYUN_CORE_10009": "impossible de trouver l'ID de la clé d'accès ou la clé d'accès secrète à partir du msg", + "ORG_ZSTACK_ALIYUN_IMAGE_10010": "plateforme valide:[%s] pour l'importation d'image Aliyun, valeurs valides sont: [%s]", + "ORG_ZSTACK_ALIYUN_CORE_10006": "L'identifiant de la région doit être spécifié !", + "ORG_ZSTACK_COMPUTE_HOST_10038": "échec de la suppression du fichier de machine virtuelle: %s", + "ORG_ZSTACK_COMPUTE_HOST_10037": "échec de la configuration du fichier de machine virtuelle: %s", + "ORG_ZSTACK_COMPUTE_HOST_10039": "échec de l'application du ballooning de mémoire: %s", + "ORG_ZSTACK_COMPUTE_HOST_10036": "échec de la définition du nom d'hôte VM: %s", + "ORG_ZSTACK_COMPUTE_HOST_10035": "échec de la synchronisation de la configuration du port VM: %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10009": "étiquette invalide, le champ 'op' est nul ou n'est pas une Regex ou Equal valide. %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10008": "étiquette invalide, le champ 'key' ne peut pas être nul. Veuillez fournir une valeur de clé valide.%s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10007": "la chaîne ValueCondition[%s] nécessite 'value' comme clé", + "ORG_ZSTACK_ZWATCH_DATATYPE_10006": "la chaîne d'étiquette[%s] ne contient pas une opération valide", + "ORG_ZSTACK_COMPUTE_VM_10319": "VmInstanceDestroyVmExtensionPoint[%s] refuse de终止er la VM[uuid:%s] en raison de %s", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10006": "Le type de volume [%s] est invalide.", + "ORG_ZSTACK_COMPUTE_VM_10318": "VmInstanceRebootExtensionPoint[%s] décline le redémarrage de la VM[uuid:%s] en raison de %s", + "ORG_ZSTACK_COMPUTE_VM_10317": "VmInstanceStartNewCreatedVmExtensionPoint[%s] refuse de lancer la VM[uuid:%s] en raison de %s", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10004": "Échec de la récupération des IDs de snapshot pour le volume %s dans Ceph PS[uuid:%s].", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10002": "Échec de la vérification du chemin d'installation du volume %s dans le pool Ceph [uuid:%s].", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10001": "impossible de trouver le pool spécifié[PoolName:%s] dans la réponse du service pool: %s", + "ORG_ZSTACK_VPC_10006": "VIP[uuid:%s] non trouvé dans l'environnement cloud", + "ORG_ZSTACK_VPC_10005": "impossible d'attacher l'EIP IPv6 car le type d'image du routeur virtuel [UUID:%s] n'est pas %s", + "ORG_ZSTACK_VPC_10003": "impossible d'établir une connexion SSH vers le routeur VPC[%s], le port SSH semble être fermé", + "ORG_ZSTACK_VPC_10009": "VMNic[uuid:%s] non trouvé", + "ORG_ZSTACK_VPC_10008": "EIP avec UUID:%s non trouvé", + "ORG_ZSTACK_COMPUTE_VM_10316": "Impossible de localiser l'hôte de la VM. Veuillez démarrer la machine virtuelle [%s] puis essayer de monter le disque.", + "ORG_ZSTACK_COMPUTE_HOST_10005": "échec de la définition de la tâche de synchronisation d'horloge sur l'hôte[uuid:%s]", + "ORG_ZSTACK_ZWATCH_DATATYPE_10001": "expression invalide: %s, aucune fonction associée trouvée dans le contexte de l'informatique cloud ou des paramètres de virtualisation", + "ORG_ZSTACK_COMPUTE_HOST_10004": "hôte[uuid:%s, name:%s] est dans l'état[%s], impossible d'exécuter l'opération requise", + "ORG_ZSTACK_COMPUTE_VM_10315": "erreur de passerelle, attendu: %s, réel: %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10000": "fonction invalide: %s, type de paramètre invalide pour l'environnement d'informatique cloud", + "ORG_ZSTACK_COMPUTE_VM_10314": "erreur de longueur de préfixe ipv6, valeur attendue entre %s et %s, reçue: %s", + "ORG_ZSTACK_COMPUTE_VM_10313": "La longueur de préfixe IPv6 doit être configurée", + "ORG_ZSTACK_VPC_10002": "la passerelle du réseau L3 [UUID: %s] est occupée sur le VR VPC [UUID: %s]", + "ORG_ZSTACK_COMPUTE_VM_10311": "erreur de masque réseau, attendu: %s, reçu: %s", + "ORG_ZSTACK_COMPUTE_HOST_10000": "échec de la synchronisation des informations GPU: %s", + "ORG_ZSTACK_VPC_10001": "Il n'y a pas de plage IP pour le réseau Layer 3[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10310": "Le masque de sous-réseau doit être spécifié.", + "ORG_ZSTACK_VPC_10000": "impossible de détacher le NIC du VR VPC[uuid:%s]", + "ORG_ZSTACK_COMPUTE_HOST_10009": "échec de l'allocation du périphérique PCI pour l'hôte[uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10051": "Format URI invalide. Exemple correct: ceph:/// ou volume://", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10050": "Ceph ps[uuid=%s] Nom du pool root non trouvé", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10052": "erreur de suppression de la chaîne de volumes, continuation avec la suppression du volume", + "ORG_ZSTACK_COMPUTE_VM_10320": "VmInstanceStartExtensionPoint[%s] refuse de démarrer la machine virtuelle[uuid:%s] car %s", + "ORG_ZSTACK_COMPUTE_HOST_10013": "networkInterface[name:%s] de l'instance[uuid:%s] ne peut pas être trouvé", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10008": "chiffrement %s[id:%s] échoué: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_SMP_10000": "le stockage principal du point de montage partagé [uuid:%s, name:%s] ne peut trouver aucun hôte disponible dans les clusters de calcul connectés", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10005": "opération non prise en charge pour EncryptColumnIntegrityFactory dans l'environnement de cloud computing", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10002": "erreur de vérification d'intégrité %s[%s], due à : %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10000": "erreur de chiffrement %s[%s] due à : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10017": "impossible de trouver un hôte KVM connecté pour effectuer l'opération ; il semble que tous les hôtes des clusters connectés au stockage du point de montage partagé [uuid:%s] sont déconnectés", + "ORG_ZSTACK_VPC_10027": "impossible de connecter le réseau L3 au routeur VPC [UUID:%s] car son état n'est ni en cours d'exécution ni arrêté", + "ORG_ZSTACK_VPC_10025": "le réseau VPC [uuid:%s] est déjà connecté au routeur VPC [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10013": "l'URL contient un chemin de répertoire invalide [%s]. Les chemins valides doivent être dans le système de fichiers de l'instance et ne doivent pas inclure de répertoires spéciaux comme /dev, /proc ou /sys. Veuillez vous assurer que l'URL fournie est correcte", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10042": "échec de l'obtention des observateurs d'image RBD du volume racine, %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10041": "conflit de pool CEPH, le pool CEPH spécifié par l'offre de disque est %s, et le pool CEPH spécifié dans le paramètre de création est %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10010": "le volume [uuid:%s] a une référence au volume [%s] ; par conséquent, le type de volume ne peut pas être modifié avant d'aplatir le volume et ses descendants", + "ORG_ZSTACK_VPC_10029": "impossible de connecter le réseau L3 au routeur VPC [UUID:%s] car son état et l'état de son pair ne sont ni en cours d'exécution ni arrêtés", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10044": "impossible de trouver le pool de stockage primaire Ceph [poolName=%s]", + "ORG_ZSTACK_VPC_10020": "le réseau l3 [uuid:%s] ne peut pas se détacher du routeur VPC [uuid:%s] car les services réseau connectés aux VIP [%s] sont encore en cours d'utilisation", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10043": "le volume racine [%s] est déjà en utilisation (indiquant que l'image Ceph RBD [%s] a des observateurs actifs), pour éviter les scénarios de split-brain, le démarrage de la VM est interdit", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10046": "impossible d'allouer un pool de stockage pour le stockage primaire [%s], objectif : %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10045": "le pool de stockage primaire ceph [poolName=%s] n'a pas de capacité virtuelle disponible suffisante pour accommoder la taille demandée %s", + "ORG_ZSTACK_VPC_10024": "seul un réseau L3 VPC peut être connecté à un routeur VPC", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10047": "impossible de mettre à jour le statut du nœud MON de stockage primaire Ceph [UUID:%s], car il a été supprimé. Cet avertissement peut être ignoré", + "ORG_ZSTACK_VPC_10023": "l'image de l'offre de routeur virtuel [uuid: %s] est manquante", + "ORG_ZSTACK_VPC_10022": "l'offre de routeur virtuel avec l'UUID : %s n'est pas activée", + "ORG_ZSTACK_VPC_10021": "le réseau L3 VPC [UUID:%s] ne peut pas se détacher du routeur VPC [UUID:%s] car les NIC de VM [%s] sont encore en cours d'utilisation", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10006": "opération non prise en charge dans l'environnement cloud. Veuillez vous assurer que vous utilisez les API prises en charge pour les opérations de cloud computing", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10005": "paramètre manquant, virtualMachineInstanceUuid : %s est requis", + "ORG_ZSTACK_VPC_10017": "le réseau public ne peut pas être détaché du cloud privé virtuel d'origine", + "ORG_ZSTACK_VPC_10016": "le réseau de route par défaut ne peut pas être détaché", + "ORG_ZSTACK_VPC_10015": "le réseau de gestion ne peut pas être détaché. Veuillez vous assurer que toutes les ressources dépendantes ont été transférées ou terminées avant d'essayer cette opération", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10003": "impossible de trouver un hôte avec une connexion SMP connectée pour exécuter les commandes pour le stockage primaire SMP [uuid:%s]", + "ORG_ZSTACK_VPC_10014": "le routeur virtuel [uuid:%s] n'est pas dans l'état ou le statut souhaité", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10002": "impossible de trouver un hôte connecté pour exécuter la commande pour le stockage primaire SMP [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10001": "le stockage principal SMP [uuid:%s] n'est attaché à aucune grappe de calcul et ne peut donc pas expulser le volume racine [uuid:%s] de la machine virtuelle [uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10007": "impossible de trouver la machine virtuelle avec l'UUID : %s", + "ORG_ZSTACK_VPC_10019": "impossible de détacher le réseau L3 du routeur VPC [uuid:%s] car les états du maître et de l'esclave sont incohérents", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10008": "impossible de trouver le dispositif de machine virtuelle avec l'uuid : %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10030": "impossible de trouver un stockage de sauvegarde pour télécharger l'image [%s] vers le stockage principal [%s] en raison de l'absence d'image prête et accessible", + "ORG_ZSTACK_VPC_10018": "impossible de détacher le réseau L3 du routeur VPC [uuid:%s] car son état n'est pas en cours d'exécution ou arrêté", + "ORG_ZSTACK_ALIYUN_CORE_10037": "L'image existe déjà à distance ; veuillez d'abord utiliser sync pour assurer la cohérence.", + "ORG_ZSTACK_ALIYUN_CORE_10035": "l'entrée est toujours active après %s ms", + "ORG_ZSTACK_ALIYUN_CORE_10036": "impossible de trouver l'instance ECS [%s], veuillez vérifier si elle existe dans la console Aliyun", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10037": "impossible de trouver un MON Ceph connecté pour le stockage principal [uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10001": "paramètre manquant : resourceUuid %s, vmInstanceUuid %s est demandé", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10002": "Paramètre requis manquant : resource UUID. Veuillez fournir un UUID de ressource valide.", + "ORG_ZSTACK_VPC_10012": "le routeur virtuel [uuid:%s] n'est pas un routeur VPC", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10039": "conflit de pool CEPH, le pool CEPH spécifié par l'offre d'instance est %s, et le pool CEPH spécifié dans le paramètre de création est %s", + "ORG_ZSTACK_VPC_10011": "impossible de mettre à jour l'état de l'interface réseau [uuid: %s], car l'interface réseau de gestion n'est pas prise en charge", + "ORG_ZSTACK_ALIYUN_CORE_10039": "regionId[%s] est invalide selon Aliyun !", + "ORG_ZSTACK_VPC_10010": "impossible de supprimer le NIC VM [UUID:%s], car la VM [UUID:%s] est une VM appliance. Veuillez utiliser l'API APIDetachL3NetworkFromVm.", + "ORG_ZSTACK_SNMP_AGENT_10006": "échec de la termination de la session de l'agent SNMP[%s] sur le port %s, en raison de %s", + "ORG_ZSTACK_SNMP_AGENT_10005": "échec de la modification du port de l'agent SNMP de %s vers %s en raison de %s", + "ORG_ZSTACK_SNMP_AGENT_10004": "l'instance snmp[uuid:%s] n'a pas été provisionnée", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10009": "L'état de l'instance EC2 [%s] doit être en cours d'exécution ou arrêté", + "ORG_ZSTACK_STORAGE_ZBS_10003": "mdsUrl[%s] invalide. Le nom d'utilisateur et le mot de passe SSH doivent être séparés par ':' et ne peuvent pas être vides. Un format mdsUrl valide est %s", + "ORG_ZSTACK_STORAGE_ZBS_10004": "URL de service de gestion invalide[%s], le nom d'hôte ne peut pas être nul. Un format d'URL de service de gestion valide est %s", + "ORG_ZSTACK_STORAGE_ZBS_10002": "URL MDS[%s] invalide, la partie nom d'utilisateur SSH:mot de passe SSH est invalide. Un format MDS URL valide est %s", + "ORG_ZSTACK_APPCENTER_10006": "%s nécessite une valeur de type String, mais un type incorrect a été reçu", + "ORG_ZSTACK_APPCENTER_10005": "%s nécessite une valeur de type Boolean, mais un type incorrect a été reçu", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10004": "Le disque [%%s] n'est attaché à aucune instance", + "ORG_ZSTACK_APPCENTER_10004": "%s nécessite une valeur de type Number, mais un type incorrect a été reçu", + "ORG_ZSTACK_STORAGE_ZBS_10005": "URL MDS[%s] invalide, le port SSH est hors de la plage valide (1-65535). Une URL MDS valide devrait être au format de %s.", + "ORG_ZSTACK_APPCENTER_10003": "%s est spécifié dans preParameters mais n'est pas configuré", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10006": "Seul un disque de données peut être attaché à une instance ECS.", + "ORG_ZSTACK_APPCENTER_10002": "filterName doit être défini sur appcenter:true ou appcenter:false pour une configuration correcte.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10007": "Le disque ne peut être attaché à aucune instance ECS. Veuillez vous assurer que l'instance ECS est dans un état permettant l'attachement de disques.", + "ORG_ZSTACK_SNMP_AGENT_10003": "échec du démarrage de l'agent SNMP sur le port %s en raison de %s", + "ORG_ZSTACK_APPCENTER_10001": "PublishAppVO[uuid: %s] n'existe pas", + "ORG_ZSTACK_SNMP_AGENT_10002": "échec du démarrage de l'agent SNMP[%s], veuillez vérifier votre configuration cloud[%s]", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10001": "Le volume racine de l'instance ne peut pas être supprimé", + "ORG_ZSTACK_SNMP_AGENT_10001": "Plusieurs instances SnmpAgentVO existent. Veuillez spécifier celle à utiliser.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10002": "Vous ne pouvez pas définir la propriété deleteWithInstance du disque sur false lorsque la catégorie du disque est ephemeral.", + "ORG_ZSTACK_SNMP_AGENT_10000": "Impossible d'instancier SnmpAgentVO en raison de l'absence d'une instance SnmpAgentVO. Veuillez vous assurer que SnmpAgentVO est correctement configuré et déployé.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10003": "Vous ne pouvez pas définir la propriété deleteWithInstance du disque sur false lorsque la catégorie du disque est cloud et qu'il n'est pas portable.", + "ORG_ZSTACK_CORE_WEBHOOK_10000": "URL invalide[%s]", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10010": "Le disque et les instances ECS doivent être dans la même zone de disponibilité", + "ORG_ZSTACK_TEST_AOP_10001": "le test unitaire nécessite un échec en raison de problèmes dans l'infrastructure de cloud computing ou l'environnement de virtualisation", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10015": "La taille du disque ou l'ID du snapshot doit être spécifié dans les paramètres de la demande pour créer un disque ou gérer sa taille. Veuillez fournir soit la taille du disque, soit utiliser un snapshot existant.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10016": "Vous n'êtes pas autorisé à créer un disque à partir d'un snapshot de volume racine. Veuillez utiliser un snapshot de volume non racine ou une copie du volume racine pour cette opération.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10017": "Le nom ou la description du disque ne peut pas commencer par 'http://' ou 'https://'. Veuillez utiliser des caractères valides pour nommer les disques.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10011": "Le volume [%s] est déjà attaché à l'instance [%s]", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10012": "Seul un disque de données peut être attaché à une instance ECS.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10013": "Impossible d'attacher un disque à une instance actuellement en cours d'utilisation. Veuillez arrêter l'instance avant d'attacher un nouveau disque.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10014": "Le disque non élastique ne peut être détruit qu'avec les instances associées", + "ORG_ZSTACK_STORAGE_ZBS_10021": "nom de volume logique invalide[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10022": "nom de pool invalide[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10020": "syntaxe URI invalide pour la référence de ressource cloud : %s", + "ORG_ZSTACK_STORAGE_ZBS_10025": "n'autorise pas l'ajout de MDS en double[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10026": "impossible de trouver la ressource physique pour le pool logique[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10023": "Veuillez vous assurer qu'au moins un pool de calcul est configuré.", + "ORG_ZSTACK_STORAGE_ZBS_10024": "Assurez-vous qu'au moins une instance de Metadata Service est configurée", + "ORG_ZSTACK_STORAGE_ZBS_10027": "MDS[%s] non trouvé pour le nœud de stockage principal zBS[uuid:%s]", + "ORG_ZSTACK_STORAGE_ZBS_10028": "Tous les nœuds MDS du stockage principal ZBS [uuid:%s] ne sont pas dans un état Connected", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10001": "Impossible de supprimer les modèles de préconfiguration prédéfinis dans l'environnement cloud. Veuillez contacter le support pour obtenir de l'aide.", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10002": "Impossible de modifier l'état des modèles de configuration prédéfinis dans cet environnement. Veuillez utiliser les images de machines virtuelles disponibles ou créer des configurations personnalisées à la place.", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10000": "Impossible de mettre à jour les modèles de types d'instances prédéfinis", + "ORG_ZSTACK_MTTYDEVICE_10001": "Les dispositifs mdev générés à partir du dispositif mtty [uuid:%s] sont toujours connectés à la MV", + "ORG_ZSTACK_MTTYDEVICE_10000": "Le dispositif mtty [UUID:%s] n'est pas virtualisé en ressources mdevs", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10004": "impossible de trouver le modèle de préconfiguration VO avec l'UUID : %s, il a peut-être été supprimé", + "ORG_ZSTACK_MTTYDEVICE_10004": "L'hôte [UUID:%s] qui contient le dispositif MTty [UUID:%s] n'est pas connecté.", + "ORG_ZSTACK_MTTYDEVICE_10003": "Le dispositif mtty [UUID:%s] ne peut pas être virtualisé en mdevs", + "ORG_ZSTACK_HYGON_KVM_10004": "échec de l'obtention des informations du dispositif CPU Hygon à partir de l'hôte[UUID:%s] : %s", + "ORG_ZSTACK_STORAGE_ZBS_10014": "Le stockage principal ZBS [uuid:%s] a peut-être été supprimé ou dissocié", + "ORG_ZSTACK_STORAGE_ZBS_10015": "impossible de trouver l'hôte KVM [UUID:%s], impossible de déployer le client", + "ORG_ZSTACK_STORAGE_ZBS_10012": "impossible de se connecter au stockage principal ZBS[uuid:%s], échec de la connexion à tous les serveurs de métadonnées", + "ORG_ZSTACK_STORAGE_ZBS_10016": "les informations de l'addon sont nulles, le stockage principal[uuid:%s] n'est pas prêt, tâche de ping ignorée", + "ORG_ZSTACK_ZWATCH_DATATYPE_10010": "étiquette non valide, le champ 'value' ne peut pas être nul. Veuillez fournir une valeur valide.%s", + "ORG_ZSTACK_STORAGE_ZBS_10017": "Aucun volume logique disponible avec suffisamment d'espace[%d] et l'URL requise : %s", + "ORG_ZSTACK_HYGON_KVM_10003": "échec de la génération des dispositifs IOMMU Hygon à cause de :%s", + "ORG_ZSTACK_HYGON_KVM_10002": "impossible d'annuler la génération des dispositifs mdev, il y a %d dispositif(s) mdev connecté(s) aux MVs sur l'hôte[uuid:%s]. Veuillez d'abord arrêter ou migrer toutes les machines virtuelles concernées.", + "ORG_ZSTACK_HYGON_KVM_10001": "impossible de trouver les dispositifs CCP pour le PCI BDF %s sur l'hôte[UUID:%s], veuillez d'abord synchroniser les dispositifs Hygon", + "ORG_ZSTACK_HYGON_KVM_10000": "échec de la génération des dispositifs IOMMU Hygon à cause de :%s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10021": "impossible de interroger l'instance InfluxDB, %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10023": "échec de la modification de la politique de rétention InfluxDB '%s', %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10000": "il n'y a pas assez de ressources physiques pour la migration du stockage de la MV[UUID: %s] ; capacité requise (incluant le cache d'images) : %s, capacité physique actuellement disponible : %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10024": "échec de la création de la politique de rétention InfluxDB '%s', %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10001": "état de MV[%s] non supporté pour la migration de stockage", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10025": "réponse InfluxDB non valide : %s, aucun nom de métrique trouvé dans les colonnes", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10026": "échec de la création de l'utilisateur par défaut pour InfluxDB '%s', %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10004": "annulation de l'instance de machine virtuelle non supportée", + "ORG_ZSTACK_STORAGE_MIGRATION_10005": "La MV[uuid: %s] n'existe pas", + "ORG_ZSTACK_STORAGE_MIGRATION_10003": "type de migration de stockage non supporté : de %s vers %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10008": "échec de la migration par bloc de la MV : %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10009": "Le stockage principal cible ne prend pas en charge les opérations de migration pour l'hôte actuel. Veuillez vous assurer que le stockage est compatible avec les opérations de migration et réessayer.", + "ORG_ZSTACK_STORAGE_MIGRATION_10006": "l'état de VM [%s] n'est pas pris en charge pour l'annulation de la migration de stockage", + "ORG_ZSTACK_STORAGE_MIGRATION_10007": "Échec de la détermination des hôtes candidats pour la migration de VM `%s`. Veuillez vérifier les hôtes cibles et la connectivité réseau.", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10005": "format invalide pour le périphérique pilote virtio: %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10004": "échec du détachement de l'ISO virtio de la VM[uuid:%s]: non pris en charge", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10003": "échec du détachement du périphérique virtio de la vm[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10002": "échec de l'attachement du pilote virtio car la lecture md5 du fichier [%s] a échoué dans mn[uuid:%s]: %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10001": "échec de l'attachement du pilote virtio en raison d'un MD5 invalide du fichier [%s] dans mn[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10000": "échec de l'attachement du pilote virtio car la lecture md5 du fichier [%s] a échoué dans mn[uuid:%s]: fichier disque virtuel non trouvé dans le classpath", + "ORG_ZSTACK_DIRECTORY_10010": "Le type de répertoire %s spécifié n'est pas pris en charge; les types pris en charge incluent %s.", + "ORG_ZSTACK_SCHEDULER_VM_10001": "vm[uuid:%s] a été terminée, le changement d'état n'est pas permis", + "ORG_ZSTACK_STORAGE_ZBS_10040": "échec de la récupération des métadonnées MDS[%s], veuillez vérifier la configuration ZBS", + "ORG_ZSTACK_STORAGE_ZBS_10032": "tous les serveurs de métadonnées ne peuvent pas exécuter la requête HTTP[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10036": "Incompatibilité de version entre le MDS du stockage principal ZBS[%s] et le nœud de gestion[%s], veuillez reconnecter le MDS et vérifier la connectivité SSH.", + "ORG_ZSTACK_STORAGE_ZBS_10037": "Les URLs MDaaS ne peuvent pas être nulles ou vides", + "ORG_ZSTACK_STORAGE_ZBS_10034": "impossible de synchroniser les métadonnées à partir du MDS du stockage principal ZBS[%s], en raison de %s", + "ORG_ZSTACK_STORAGE_ZBS_10038": "impossible de découvrir les volumes logiques à partir de toutes les instances du service de métadonnées, détails: %s", + "ORG_ZSTACK_STORAGE_ZBS_10039": "Échec de l'établissement d'une connexion SSH ou zbs-tools n'est pas installé dans MDS[%s]. Veuillez vérifier votre configuration SSH et vous assurer que les dépendances nécessaires sont installées.", + "ORG_ZSTACK_DIRECTORY_10006": "dépendance circulaire détectée entre le répertoire %s et le répertoire %s, ce qui peut mener à des conflits de configuration ou une boucle infinie dans le provisionnement d'environnement virtuel", + "ORG_ZSTACK_DIRECTORY_10003": "Le nom que vous avez fourni contient des caractères non pris en charge. Dans les environnements de cloud computing, les noms ne peuvent inclure que des caractères chinois, des lettres anglaises, des chiffres, des espaces et les caractères spéciaux suivants: ()()[]@._-+ . Veuillez vous assurer que votre nom respecte ces directives.", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10000": "impossible de trouver EventFamily[name:%s] dans le bus d'événements", + "ORG_ZSTACK_DIRECTORY_10004": "tous les zoneUuid des ressources doivent être cohérents avec le zoneUuid du répertoire[%s]", + "ORG_ZSTACK_DIRECTORY_10001": "les types de ressources %s ne sont pas pris en charge par le répertoire cloud, les types autorisés sont %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10002": "impossible de trouver EventFamily[name:%s, namespace:%s] dans l'espace de noms spécifié ou le référentiel de familles d'événements", + "ORG_ZSTACK_DIRECTORY_10000": "la ressource %s est déjà liée à l'UUID du répertoire[%s]; les chemins multiples ne sont pas pris en charge", + "ORG_ZSTACK_NAS_10002": "NasFileSystemFactory en double pour le type[%s]", + "ORG_ZSTACK_NAS_10000": "Le système de fichiers NAS [%s] n'existe pas encore", + "ORG_ZSTACK_NAS_10001": "impossible de trouver l'usine NAS pour le type: %s", + "ORG_ZSTACK_DIRECTORY_10009": "Échec de la création du répertoire; assurez-vous que le chemin est correctement spécifié et ne dépasse pas quatre niveaux de répertoires virtuels.", + "ORG_ZSTACK_DIRECTORY_10008": "nom de répertoire en double, volume[uuid: %s] avec le nom %s existe déjà", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10011": "balise de requête[%s] non valide. Les noms de balises autorisés sont %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10012": "Il existe plusieurs familles d'événements avec le nom [%s], vous devez spécifier l'étiquette [%s].", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10006": "La machine virtuelle où le volume de données [%s] est situé a un instantané de mémoire ; par conséquent, il ne peut pas être détaché.", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10005": "impossible de joindre le volume %s à l'instance de machine virtuelle %s avec le groupe d'instantanés de mémoire", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10004": "La machine virtuelle où le volume de données [%s] est situé a un instantané de mémoire ; la suppression n'est pas autorisée.", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10003": "Le volume {volume_id} n'existe pas", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10001": "Le réseau avec le réseau L3 [uuid: %s] est référencé par le groupe d'instantanés de volume [uuid: %s]. Veuillez supprimer le groupe d'instantanés de volume avant de supprimer ce réseau L3.", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10000": "L'UUID du réseau L3 par défaut n'existe pas", + "ORG_ZSTACK_AI_10086": "ModelServiceGroup est encore référencé par %s, ne peut pas être supprimé", + "ORG_ZSTACK_AI_10087": "taskUuid ne doit pas être vide. Veuillez vous assurer qu'il est correctement défini avant de soumettre la tâche.", + "ORG_ZSTACK_AI_10084": "L'instance système[uuid: %s] ne peut pas être supprimée", + "ORG_ZSTACK_AI_10082": "Échec de la suppression du modèle, le modèle[uuid: %s] est encore utilisé par %s", + "ORG_ZSTACK_AI_10083": "Le modèle[uuid: %s] n'existe pas dans le référentiel cloud", + "ORG_ZSTACK_AI_10080": "L'URL personnalisée nécessite un champ de modèle lorsque le service ModelEval est déployé.%s", + "ORG_ZSTACK_AI_10081": "L'UUID du réseau L3 %s n'a pas de service DHCP activé ; une étiquette de système IP statique est requise pour attribuer des IP statiques.", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10007": "L'opération consistant à prendre des instantanés de volume sur plusieurs hôtes simultanément lors de l'inclusion d'instantanés de stockage n'est pas prise en charge.", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10008": "impossible de trouver l'espace de stockage pour l'URL d'installation[%s]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10005": "Aucun plugin de stockage principal enregistré avec l'identité : %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10006": "protocole[%s] non supporté sur le type[%s] de solution de stockage", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10009": "Impossible de trouver le volume de stockage par blocs ; assurez-vous qu'un chemin d'accès est configuré pour le volume de stockage par blocs.", + "ORG_ZSTACK_CONFIGURATION_10009": "la taille de mémoire réservée[%s octets] dépasse la taille de mémoire disponible[%s octets]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10010": "aucun type de stockage de sauvegarde spécifié pour prendre en charge le stockage principal[uuid:%s]", + "ORG_ZSTACK_CONFIGURATION_10008": "la taille de mémoire[%s octets] est insuffisante pour l'amorçage d'un système d'exploitation moderne ; un minimum de 16 Mo est recommandé dans les environnements virtuels cloud", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10011": "impossible de réinitialiser le volume racine [%s] car l'image associée a été supprimée et son cache ne peut pas être localisé", + "ORG_ZSTACK_MULTICAST_ROUTER_10005": "le routeur multicast [uuid:%s] n'est pas associé à un routeur VPC", + "ORG_ZSTACK_CONFIGURATION_10007": "le nombre de vcpu[%s] est inférieur à 1", + "ORG_ZSTACK_MULTICAST_ROUTER_10006": "le point de rendez-vous [%s] n'est pas une adresse IP unicast", + "ORG_ZSTACK_CONFIGURATION_10006": "type d'instance[%s] non supporté", + "ORG_ZSTACK_MULTICAST_ROUTER_10007": "l'adresse de groupe [%s] n'est pas une adresse de groupe multicast", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014": "le stockage n'est pas sain : %s", + "ORG_ZSTACK_MULTICAST_ROUTER_10000": "Le multicastRouter[uuid:%s] n'a pas été associé à un routeur VPC", + "ORG_ZSTACK_MULTICAST_ROUTER_10001": "Le multicast est déjà activé sur le routeur VPC UUID[:%s]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012": "Impossible de trouver le chemin du volume propriétaire à partir du chemin d'instantané interne[%s], car l'expression régulière[%s] ne correspond pas au chemin d'instantané", + "ORG_ZSTACK_MULTICAST_ROUTER_10002": "Le routeur vPC pour le multicast router [uuid:%s] a été supprimé", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10013": "Le ping vers le stockage primaire externe[%s] a échoué, veuillez vérifier la connectivité réseau ou l'état du service de stockage.%s", + "ORG_ZSTACK_CONFIGURATION_10001": "Il existe déjà une balise système définie par l'utilisateur pour l'offre d'instance [UUID: %s].", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10004": "La réponse du jeton est nulle. Veuillez vous assurer que votre processus d'authentification est correctement configuré et que le point de terminaison du jeton renvoie une réponse valide.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10003": "Impossible de trouver l'implémentation OAuth2Login pour le type(%s)", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10005": "%s est nul : Veuillez vous assurer que le chemin du fichier source est correctement spécifié.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10000": "Gestionnaire d'authentification OAuth2 en double pour le type[%s]", + "ORG_ZSTACK_CONFIGURATION_10004": "Il ne devrait pas y avoir plus d'une balise système pour une offre d'instance.", + "ORG_ZSTACK_CONFIGURATION_10003": "Il existe déjà une balise système définie par l'utilisateur pour l'offre de disque [UUID: %s].", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10002": "Impossible de trouver le fournisseur OAuth2 pour le type(%s)", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10001": "Fournisseur OAuth2 en double[%s] pour le nom[%s]", + "ORG_ZSTACK_AI_10075": "dockerImage doit être spécifié pour ContainerModelService.", + "ORG_ZSTACK_AI_10076": "Centre de modèles avec UUID:%s introuvable pour le service de modèles avec UUID:%s", + "ORG_ZSTACK_AI_10071": "vmImageUuid est un paramètre obligatoire pour le service de modèles VirtualMachine. Veuillez fournir une valeur vmImageUuid valide.", + "ORG_ZSTACK_AI_10072": "L'UUID de l'image VM spécifié est invalide. Veuillez vérifier et fournir un UUID valide.", + "ORG_ZSTACK_AI_10070": "ModelServiceType[%s] ne devrait pas avoir d'UUID de groupes de services de modèles dépendants", + "ORG_ZSTACK_MULTICAST_ROUTER_10008": "La paire d'adresses RP [%s: %s] existe déjà pour le routeur multicast [uuid:%s]", + "ORG_ZSTACK_MULTICAST_ROUTER_10009": "Le tuple d'adresse rpc [%s : %s] n'existe pas pour le routeur multicast [uuid:%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10015": "Échec du téléchargement de l'utilisateur[%s] : L'utilisateur existe déjà dans l'environnement cloud", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10017": "La réponse du code de demande a une erreur : %s", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10016": "Échec du téléchargement de l'utilisateur[%s] : %s", + "ORG_ZSTACK_AI_10079": "Le type de service ModelEval nécessite un service de modèles existant dans les modelServiceGroupUuids spécifiés ou une URL valide pour l'utilisation.", + "ORG_ZSTACK_AI_10077": "Aucun UUID de réseau L3 fourni dans le message de déploiement, et le centre de modèles [UUID:%s] n'a pas de serviceNetworkUuid ou storageNetworkUuid configuré.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10012": "iam2 a un utilisateur avec le même nom[%s]", + "ORG_ZSTACK_AI_10078": "Les valeurs des variables d'environnement ne doivent pas être nulles dans la configuration de votre environnement cloud. Veuillez vous assurer que toutes les variables requises sont correctement définies.", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_SUPPLIER_EMAY_10000": "paramètre invalide avec supplier[%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10026": "Le nom d'utilisateur récupéré depuis le service cloud est nul. Veuillez vérifier la configuration d'authentification de l'utilisateur.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10025": "Échec de l'obtention des paramètres [%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10028": "Le plugin [uuid:%s] est utilisé par les clients OAuth2 [uuids:%s] pour l'authentification par connexion tierce.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10027": "L'utilisateur local a un utilisateur avec le même nom [%s]", + "ORG_ZSTACK_AI_10097": "Les services de modèle au sein du groupe [uuid: %s] ont des types incohérents, type attendu : %s, mais type trouvé : %s", + "ORG_ZSTACK_AI_10098": "Backend du service de modèle [type: %s] non trouvé dans l'environnement virtualisé", + "ORG_ZSTACK_AI_10095": "Tous les services de modèle au sein du groupe [uuid: %s] doivent configurer serviceBootUptime", + "ORG_ZSTACK_AI_10096": "Aucune instance de service de modèle trouvée avec node rank 0 dans le groupe [uuid: %s]", + "ORG_ZSTACK_AI_10093": "L'instance de service de modèle [uuid: %s] n'est pas active et pas prête, mais aucun code d'erreur trouvé", + "ORG_ZSTACK_AI_10094": "contenu inattendu : le YAML du service %s analysé comme null", + "ORG_ZSTACK_AI_10091": "Échec de l'obtention de l'état de disponibilité car %s", + "ORG_ZSTACK_AI_10092": "L'instance de service de modèle [uuid: %s] n'est pas disponible et pas prête à cause de %s", + "ORG_ZSTACK_AI_10090": "Échec du rechargement de la configuration NGINX : %s", + "ORG_ZSTACK_VROUTERROUTE_10010": "La destination [%s] ne peut pas avoir simultanément des routes black hole et statiques", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10000": "Impossible de trouver le stockage primaire externe [uuid:%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10031": "Échec de %s vers %s, code d'état : %s, corps de réponse : %s", + "ORG_ZSTACK_VROUTERROUTE_10012": "Impossible d'ajouter une entrée de route Black Hole en double pour la destination : %s", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10030": "ERREUR HTTP, code d'état : %s, corps de réponse : %s", + "ORG_ZSTACK_VROUTERROUTE_10011": "Impossible d'ajouter une entrée de route statique en double, destination : %s, cible : %s, type : %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10003": "L'espace requis à l'locationUrl:%s ne peut pas satisfaire les conditions [availableSize > %d octets], taille disponible actuelle %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10004": "Impossible de trouver le volume avec l'UUID [%s] chemin d'installation", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10001": "Impossible d'établir une connexion au service de stockage externe. Veuillez vous assurer que votre service de stockage est correctement configuré et accessible dans l'environnement cloud.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10032": "Échec de %s vers %s, erreur d'E/S : %s", + "ORG_ZSTACK_AI_10099": "Le groupe d'instances de service de modèle [uuid: %s] n'existe pas", + "ORG_ZSTACK_VROUTERROUTE_10001": "Impossible de trouver la factory de service pour le type de routeur virtuel [%s]", + "ORG_ZSTACK_VROUTERROUTE_10000": "Le routeur virtuel [uuid:%s] ne peut pas être localisé", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10015": "Ceph BS[uuid=%s] nom de pool non trouvé", + "ORG_ZSTACK_VROUTERROUTE_10003": "Impossible de trouver la table de routage [uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10012": "Impossible de mettre à jour le statut du MON de stockage de sauvegarde Ceph [UUID:%s], il a été supprimé. Cette erreur peut être ignorée.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10000": "Impossible de trouver le groupe d'ordonnancement d'hôtes [uuid:%s], il a peut-être été supprimé ou réaffecté", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10003": "L'hôte [UUID:%s] est déjà attaché au groupe d'ordonnancement d'hôtes [UUID:%s].", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10004": "L'hôte avec UUID %s est nul. Veuillez vérifier la configuration du cluster.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10001": "impossible de trouver la règle d'ordonnancement de la machine virtuelle[uuid:%s], elle a peut-être été supprimée", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10002": "impossible de trouver le groupe d'ordonnancement de la machine virtuelle[uuid:%s], il a peut-être été supprimé", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10011": "Le stockage de sauvegarde CEPH ne prend pas en charge le calcul du somme de contrôle de l'image.", + "ORG_ZSTACK_SNS_PLATFORM_HTTP_10000": "Échec de la requête HTTP POST. statut: %s, corps: %s", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10007": "l'image[uuid: %s] n'est pas disponible sur le stockage de sauvegarde[uuid:%s, name:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10005": "Il existe un autre stockage de sauvegarde CEPH avec le même FSID ; vous ne pouvez pas ajouter la même configuration CEPH comme deux stockages de sauvegarde différents.[name:%s, uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10003": "impossible de se connecter au stockage de sauvegarde Ceph[UUID:%s], échec de connexion à tous les moniteurs Ceph.", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10002": "CephMon[hostname:%s] non trouvé sur le stockage de sauvegarde[uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10009": "Impossible d'ajouter un nœud MON au cluster de stockage de sauvegarde Ceph", + "ORG_ZSTACK_MULTICAST_ROUTER_BACKEND_10000": "le routeur multicast [uuid:%s] a été supprimé lors de l'activation du multicast sur le backend", + "ORG_ZSTACK_LDAP_10016": "échec de la requête d'entrée LDAP, %s", + "ORG_ZSTACK_LDAP_10017": "échec de la requête d'entrée ldap[filtre: %s] en raison de %s", + "ORG_ZSTACK_LDAP_10012": "Impossible d'établir une connexion au serveur LDAP/AD, informations d'identification invalides fournies. Veuillez vérifier le DN de l'utilisateur et le mot de passe.", + "ORG_ZSTACK_LDAP_10013": "Impossible d'établir une connexion au serveur LDAP/AD, échec de communication. Veuillez vérifier l'adresse IP, le numéro de port et le DN de base.", + "ORG_ZSTACK_LDAP_10014": "Impossible d'établir une connexion au serveur LDAP/AD, %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10005": "la licence actuelle[%s] n'est pas valide pour les opérations de stockage de sauvegarde du magasin d'images", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10004": "CephPrimaryStorage[%s] n'existe pas !", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10001": "l'image [uuid:%s] a été supprimée du référentiel de stockage cloud", + "ORG_ZSTACK_LDAP_10010": "LdapServerType[%s] invalide, valeurs valides: [%, %s]", + "ORG_ZSTACK_LDAP_10007": "Compte[UUID:%s] Non trouvé !!!", + "ORG_ZSTACK_LDAP_10008": "Étendue du serveur LDAP/AD non prise en charge pour la configuration de l'environnement cloud. Veuillez vous assurer que l'étendue est compatible avec les normes de virtualisation et d'informatique en nuage.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10000": "échec de la création de l'IP élastique [uuid:%s, name:%s, ip:%s] pour l'interface réseau de la machine virtuelle [uuid:%s] sur le routeur virtuel [uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10001": "Offre de routeur virtuel [uuid:%s] trouvée pour L3Network [uuid:%s] dans la zone [uuid:%s] ; cependant, la configuration IP publique du réseau ne correspond pas à l'IP élastique [uuid:%s]. Vous devrez peut-être spécifier une offre de routeur virtuelle particulière à l'aide de la balise système guestL3Network::l3NetworkUuid pour L3Network [uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10002": "échec du détachement de l'eip [uuid:%s, name:%s, ip:%s] de la vm nic [uuid:%s] sur le routeur virtuel [uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10004": "échec de la synchronisation de l'eip sur le routeur virtuel[uuid:%s], détails de l'erreur: %s", + "ORG_ZSTACK_AI_10004": "randomUuid ne correspond pas à la valeur attendue. Veuillez vérifier la logique de génération UUID.", + "ORG_ZSTACK_AI_10005": "Model Center non trouvé. Veuillez vous assurer que le service Model Center est correctement déployé et configuré dans votre environnement cloud.", + "ORG_ZSTACK_AI_10003": "randomUuid est nul. Veuillez vous assurer qu'un UUID valide est généré avant utilisation.", + "ORG_ZSTACK_AI_10001": "L'adresse IP de gestion du centre de modèles %s fournie est invalide. Veuillez vous assurer qu'il s'agit d'une IP valide et réessayez.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10027": "vm[uuid:%s] s'exécute maintenant sur l'hôte[uuid:%s], ce qui ne respecte pas la politique d'ordonnancement[%s] associée au groupe d'ordonnancement de vm[uuid:%s].", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10028": "vm[uuid:%s] s'exécute maintenant sur l'hôte[uuid:%s], ce qui ne respecte pas la règle d'ordonnancement[%s] associée au groupe d'ordonnancement de machine virtuelle[uuid:%s].", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10019": "Le groupe d'ordonnancement de VM [UUID:%s] a déjà une politique d'ordonnancement de VM exclusive ou basée sur l'affinité exécutée attachée. Vous ne pouvez pas attacher à nouveau un autre type de politique nécessitant une exécution à ce groupe.", + "ORG_ZSTACK_AI_10028": "modelServices ne peut pas être null ou vide. Veuillez vous assurer que votre instance de service est correctement initialisée et configurée.", + "ORG_ZSTACK_AI_10029": "modelServices doit utiliser le même UUID de modèle que les instances virtuelles pour assurer la cohérence.", + "ORG_ZSTACK_AI_10026": "serviceNetworkUuid %s n'est pas un réseau Layer 3 du système", + "ORG_ZSTACK_AI_10027": "storageNetworkUuid %s n'est pas un réseau Layer 3 du système", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10025": "vm[uuid:%s] s'exécute maintenant sur l'hôte[uuid:%s], ce qui ne respecte pas la politique d'ordonnancement associée au groupe d'ordonnancement de machine virtuelle[uuid:%s].", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10026": "hostGroup[uuid:%s] n'a aucun hôte attribué", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10024": "le groupe d'ordonnancement de vm[uuid:%s] n'a pas pu réserver l'hôte [uuid:%s] pour vm [uuid:%s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10007": "vm[uuid:%s] est déjà associé au groupe d'ordonnancement de vm[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10008": "zone non correspondante détectée : VM[UUID: %s, Zone UUID: %s] est différente de son groupe de règle d'ordonnancement[UUID: %s, Zone UUID: %s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10005": "Les hôtes que vous pouvez ajouter à un groupe d'ordonnancement d'hôtes doivent être activés et connectés au Node de Gestion (MN).", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10006": "zone non correspondante détectée, la zone de l'hôte [uuid: %s, zone uuid: %s] est différente du groupe de règle d'ordonnancement d'hôtes [uuid: %s, zone uuid: %s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10009": "vm ne peut changer son groupe d'ordonnancement de VM que dans les états [%s,%s], mais il est actuellement dans l'état [%s]", + "ORG_ZSTACK_TEMPLATECONFIG_10000": "Impossible de trouver TemplateConfigs : [template UUID: %s]", + "ORG_ZSTACK_TICKET_API_10002": "aucun type de compte système [%s] défini dans la configuration", + "ORG_ZSTACK_TICKET_API_10003": "Type de ticket non trouvé dans la configuration de l'environnement cloud.%s", + "ORG_ZSTACK_TICKET_API_10004": "Aucune collection de flux de ticket correspondante ou collection de flux de ticket par défaut trouvée. Veuillez spécifier flowCollectionUuid ou créer une collection de flux de ticket par défaut dans le système.", + "ORG_ZSTACK_TEMPLATECONFIG_10003": "Impossible de trouver la configuration de modèle[catégorie: %s, nom: %s, modèle UUID: %s]", + "ORG_ZSTACK_TICKET_API_10005": "La collection de flux de ticket [UUID:%s] ne correspond pas au type de ticket [UUID:%s]", + "ORG_ZSTACK_TICKET_API_10006": "La collection de flux de ticket[uuid:%s] n'est pas valide. Veuillez contacter l'administrateur pour correction.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10000": "Le stockage principal Aliyun NAS [UUID:%s, Nom:%s] ne peut trouver aucun hôte disponible dans les clusters attachés pour instancier le volume.", + "ORG_ZSTACK_TICKET_API_10007": "La collection de flux de ticket [UUID:%s] est désactivée et ne peut être utilisée.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10001": "Le stockage principal Alibaba Cloud NAS [UUID:%s, Nom:%s] ne peut trouver aucun hôte disponible dans les clusters attachés pour supprimer les données sur le stockage principal.", + "ORG_ZSTACK_TICKET_API_10008": "demande invalide. aucune API[%s] trouvée dans l'espace de noms ou la portée spécifiée", + "ORG_ZSTACK_TICKET_API_10009": "demande invalide, impossible de créer l'API[%s] à partir de apiBody, %s", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10010": "impossible d'opérer sur le groupe d'ordonnancement de VM VPC", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10011": "L'UUID de la zone de disponibilité n'est pas null.", + "ORG_ZSTACK_TEMPLATECONFIG_10005": "Impossible de trouver TemplateConfigs : [templateUUID: %s]", + "ORG_ZSTACK_AI_10012": "architectureImages ne doit pas être nul ou vide dans les environnements de virtualisation cloud. Veuillez vous assurer qu'ils sont correctement configurés.", + "ORG_ZSTACK_AI_10042": "Format de modèle CloudFormation invalide: %s", + "ORG_ZSTACK_AI_10043": "La configuration YAML et les mises à jour de paramètres individuels s'excluent mutuellement dans les environnements de cloud computing. Veuillez choisir une seule méthode pour mettre à jour les paramètres.", + "ORG_ZSTACK_AI_10040": "servicePorts ne peut pas contenir de valeurs en double: %s", + "ORG_ZSTACK_AI_10041": "serviceBootupTime doit être compris dans la plage [1,65535]", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10006": "échec de la vérification du chemin de montage sur l'hôte: %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10005": "Le stockage principal Aliyun NAS [UUID: %s, name: %s] n'a été attaché à aucun cluster, ou il n'y a pas d'hôtes connectés dans les clusters attachés.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10009": "Impossible de trouver un hôte pour nettoyer le cache d'images. Veuillez vous assurer qu'au moins un hôte est disponible et correctement configuré pour la mise en cache d'images.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10013": "unable to attach a primary storage to the cluster. The KVM host [uuid:%s, name:%s] in the cluster uses qemu-img with version [%s]; however, the primary storage is attached to a cluster that has a KVM host [uuid:%s], which uses qemu-img with version [%s]. Qemu-img versions greater than %s are incompatible with those less than %s, which may cause volume snapshot operations to fail. Please avoid attaching a primary storage to clusters with different Linux distributions to prevent qemu-img version mismatches.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10014": "Aucune ressource de calcul disponible n'a pu télécharger le cache d'images!", + "ORG_ZSTACK_AI_10049": "L'architecture du CPU dans le mappage des images d'architecture ne peut pas être vide. Veuillez vous assurer qu'une architecture CPU valide est spécifiée.", + "ORG_ZSTACK_AI_10046": "Le fournisseur GPU %s doit fournir une liste d'UUID de spécification", + "ORG_ZSTACK_AI_10047": "UUID de spécification GPU(s) pour le fournisseur %s non trouvé dans %s: %s", + "ORG_ZSTACK_AI_10044": "Le mappage de spécification du fournisseur GPU dans le mappage des images d'architecture ne peut pas être vide. Veuillez vous assurer que le fournisseur GPU est correctement spécifié.", + "ORG_ZSTACK_AI_10045": "Le fournisseur GPU dans le mappage des images d'architecture ne peut pas être vide. Veuillez fournir un nom de fournisseur GPU valide.", + "ORG_ZSTACK_AI_10031": "modelServices UUID ne doit pas être nul. Veuillez vous assurer qu'un UUID valide est fourni pour modelServices.", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10008": "échec de l'analyse de l'enveloppe de métadonnées: %s, %s", + "ORG_ZSTACK_AI_10032": "nodeRank doit être dans la plage [0, %s), mais a reçu %s", + "ORG_ZSTACK_AI_10030": "modelServices doit utiliser le même UUID de zone que les nœuds de calcul.", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10003": "argument illégal pour le chemin du fichier source", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10004": "Échec du déchiffrement des données avec la clé de chiffrement fournie. Veuillez vérifier la clé et réessayer.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10017": "AliyunNasAccessGroupVO[%s] n'existe pas, possibly due to deletion!", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10018": "EcsVSwitchVO[%s] n'existe pas, possibly due to deletion!", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10020": "unable to find an available host to perform operation in primary storage: %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10021": "failed to ping Aliyun NAS primary storage[UUID:%s] from host[UUID:%s], because %s. Disconnect this host-NAS connection.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10024": "unable to find any BackupStorageKVMFactory for the type[%s]", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10025": "unable to find host to manage volume: [%s]", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10023": "Le stockage principal NAS n'est pas monté, veuillez d'abord l'initialiser!", + "ORG_ZSTACK_AI_10039": "servicePorts doit être dans la plage [1,65535], mais a reçu: %s", + "ORG_ZSTACK_AI_10037": "serviceLivez doit commencer par un '/' et ne contenir aucun espace; sa longueur ne doit pas dépasser 512 caractères.", + "ORG_ZSTACK_AI_10038": "serviceReadyz doit commencer par /, ne pas contenir d'espaces et avoir une longueur maximale de 512 caractères", + "ORG_ZSTACK_AI_10035": "Framework invalide : %s, valeurs valides sont : EC2, GCE, Azure, OpenStack", + "ORG_ZSTACK_AI_10036": "Framework invalide : %s", + "ORG_ZSTACK_AI_10033": "Identificateur de périphérique PCI invalide : %s", + "ORG_ZSTACK_AI_10034": "nodeRank doit être unique, mais a obtenu %s", + "ORG_ZSTACK_ACL_10001": "%s entrée IP en double/superposition avec le groupe de liste de contrôle d'accès :%s", + "ORG_ZSTACK_AI_10064": "Structures de schéma de jeu de données invalides : %s", + "ORG_ZSTACK_ACL_10000": "ne prend pas en charge la version IP %d", + "ORG_ZSTACK_AI_10065": "Les jeux de données prédéfinis du système ne peuvent pas être mis à jour via des appels API. Veuillez contacter le support pour obtenir de l'aide.", + "ORG_ZSTACK_AI_10062": "Le jeu de données est en cours d'utilisation et ne peut pas être supprimé via l'API. Veuillez vous assurer que toutes les ressources associées sont terminées avant de tenter la suppression.", + "ORG_ZSTACK_AI_10063": "updateDatasetStructs ne peut pas être nul ou vide. Veuillez vous assurer que la structure du jeu de données est correctement définie et renseignée avant de procéder.", + "ORG_ZSTACK_AI_10060": "Impossible de mettre fin à l'instance de machine virtuelle car elle est utilisée par le groupe de services de modèle [UUID : %s]", + "ORG_ZSTACK_ZSV_COMPUTER_VM_10000": "le nom de machine virtuelle %s existe déjà dans l'environnement cloud", + "ORG_ZSTACK_AI_10061": "Le partage des groupes d'instances d'applications n'est pas autorisé : %s", + "ORG_ZSTACK_ACL_10009": "les groupes de liste de contrôle d'accès [%s] possèdent déjà une règle de redirection et ne peuvent pas en ajouter une autre", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10028": "Aucune ressource de calcul disponible n'a pu vérifier le chemin de montage !", + "ORG_ZSTACK_ACL_10008": "les groupes de liste de contrôle d'accès [%s] possèdent déjà une entrée IP, impossible d'ajouter une règle de redirection", + "ORG_ZSTACK_ACL_10007": "les groupes de liste de contrôle d'accès [%s] possèdent déjà une règle de redirection ; par conséquent, une entrée IP ne peut pas être ajoutée.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10026": "impossible de trouver un hôte pour synchroniser la taille du volume dans le principal : %s", + "ORG_ZSTACK_ACL_10006": "les groupes de liste de contrôle d'accès [%s] ne peuvent pas dépasser %d entrées IP", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10027": "l'image [%s] a été supprimée, impossible de réinitialiser le volume racine à partir de celle-ci", + "ORG_ZSTACK_SCHEDULER_SNAPSHOT_10000": "la machine virtuelle du volume racine [%s] est à l'état Destroyed. Les changements d'état ne sont pas autorisés pour cette tâche.", + "ORG_ZSTACK_ACL_10005": "les groupes de liste de contrôle d'accès [%s] possèdent déjà une règle de redirection ; par conséquent, une entrée IP ne peut pas être ajoutée.", + "ORG_ZSTACK_ACL_10004": "Expression de règle invalide, veuillez vous assurer qu'elle est conforme aux normes de l'informatique en nuage, par exemple l'utilisation correcte de %s pour les espaces réservés. Détails : %s", + "ORG_ZSTACK_ACL_10003": "la plage IP [%s, %s] chevauche [%s, %s] au sein du groupe de liste de contrôle d'accès :%s", + "ORG_ZSTACK_ACL_10002": "le format IP ne prend en charge que ip/iprange/cidr, mais a trouvé %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10031": "Aliyun NAS PrimaryStorage ne prend en charge que imagestore BS ; type réel reçu : %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10000": "Le chiffrement InfoSecEncryptDriver a échoué pour la ressource %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10001": "Le déchiffrement InfoSecEncryptDriver a échoué pour la ressource virtuelle %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10002": "les données de chiffrement [%s] ou le type d'algorithme de chiffrement [%s] sont nuls", + "ORG_ZSTACK_AI_10068": "L'évaluation du modèle nécessite ModelServiceType.ModelEval", + "ORG_ZSTACK_AI_10069": "L'un des UUID de jeu de données ou l'invite est requis pour l'évaluation du modèle.", + "ORG_ZSTACK_AI_10066": "L'UUID de ModelServiceVO est obligatoire. Veuillez fournir un UUID valide.", + "ORG_ZSTACK_AI_10067": "serviceType doit être spécifié", + "ORG_ZSTACK_ACL_10012": "url[%s] n'est pas un chemin de stockage cloud valide", + "ORG_ZSTACK_AI_10053": "L'image [uuid:%s] pour l'architecture %s est désactivée et ne peut pas être utilisée", + "ORG_ZSTACK_ACL_10011": "domain[%s] n'est pas un nom de domaine valide", + "ORG_ZSTACK_AI_10054": "L'image [uuid:%s] pour l'architecture spécifiée %s n'est pas disponible et ne peut pas être utilisée.", + "ORG_ZSTACK_ACL_10010": "Le domaine et l'URL ne peuvent pas être vides tous les deux. Veuillez fournir un domaine ou une URL valide.", + "ORG_ZSTACK_AI_10051": "Au moins un identifiant d'image de machine virtuelle (vmImageUuid) ou une image de conteneur (dockerImage) doit être spécifié pour l'architecture %s", + "ORG_ZSTACK_AI_10052": "UUID d'image invalide pour l'architecture %s : %s", + "ORG_ZSTACK_AI_10050": "Type d'architecture CPU invalide dans le mappage d'image d'architecture : %s, les types pris en charge incluent : %s", + "ORG_ZSTACK_AI_10059": "Trop de variations de type de données dans les messages du jeu de données : %s, veuillez réduire à un seul type", + "ORG_ZSTACK_AI_10057": "La création d'un jeu de données sans spécifier le type de données et les scénarios d'utilisation n'est pas autorisée dans les environnements de cloud computing. Veuillez fournir les détails nécessaires pour votre jeu de données.", + "ORG_ZSTACK_AI_10058": "Au moins un type de données de jeu de données doit être spécifié lors de l'ajout d'un jeu de données.", + "ORG_ZSTACK_AI_10055": "Architecture CPU dupliquée spécifiée dans le mappage d'image d'architecture : %s", + "ORG_ZSTACK_AI_10056": "les images d'architecture ne peuvent pas être vides", + "ORG_ZSTACK_VMWARE_10101": "lister le stockage échoué pour %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10051": "Le nom du LUN est obligatoire mais null reçu. Veuillez vous assurer qu'un nom de LUN valide est fourni.", + "ORG_ZSTACK_VMWARE_10102": "Aucun datastore trouvé pour VirtualMachine : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10054": "échec de l'obtention du snapshot pour le volume :%s avec l'id :%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10053": "échec de l'obtention du snapshot pour le LUN :%s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10012": "Le stockage de sauvegarde SFTP ne prend pas en charge le calcul des empreintes d'images.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10050": "initiateur[%s] existe déjà dans XStor et n'est pas attaché à l'hôte[%s]. Veuillez vous assurer que le nom de l'initiateur est unique.", + "ORG_ZSTACK_ALIYUN_NETWORK_10020": "Seules les instances EC2 à l'état en cours d'exécution ou arrêté peuvent attacher une EIP, mais l'ECS [%s] est actuellement à l'état [%s].", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10016": "créer le fichier de métadonnées de l'image : %s échoué", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10017": "vérifier le fichier de métadonnées de l'image : %s échoué", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10018": "le fichier de métadonnées de l'image : %s n'existe pas", + "ORG_ZSTACK_ZWATCH_ALARM_10022": "action dupliquée[uuid:%s, type:%s] pour l'alarme[uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10021": "action[uuid:%s, type:%s] non trouvée dans l'environnement de cloud computing", + "ORG_ZSTACK_ZWATCH_ALARM_10020": "type d'action invalide[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10026": "clé en double[%s] avec des valeurs différentes{%s}%", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10170": "impossible d'ajouter l'IP du serveur au groupe de serveurs d'équilibrage de charge partagé %s", + "ORG_ZSTACK_ZWATCH_ALARM_10025": "la métrique ne possède pas l'étiquette spécifiée[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10023": "étiquette en double définie pour l'alarme avec UUID [uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10029": "la métrique[%s] est restreinte aux administrateurs et n'est pas disponible pour votre rôle utilisateur actuel.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10171": "impossible de modifier le serveur backend car vmincs et les IPs du serveur sont null", + "ORG_ZSTACK_ZWATCH_ALARM_10028": "l'espace de noms[%s] ne contient pas la métrique[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10027": "l'espace de noms[%s] n'est pas pris en charge", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10049": "L'ID LUN est invalide. Veuillez vous assurer qu'il est conforme au format et aux valeurs requis pour les dispositifs de stockage cloud.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10048": "L'ID de mappage LUN est obligatoire et ne peut pas être nul ou égal à zéro. Veuillez fournir un ID de mappage LUN valide.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10045": "échec de l'obtention des mappages de volumes, à cause de : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10044": "échec de la vérification de l'état de session du LUN %s à cause de : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10047": "aucun mécanisme ne permet de récupérer l'ID de mappage LUN ; par conséquent, l'opération a échoué.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10046": "échec de l'obtention du nombre de LUN créés restants pour le LUN %s, à cause de : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10041": "l'ID du snapshot est obligatoire mais a reçu :%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10040": "échec de l'interrogation des snapshots pour l'instance %s à cause de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10043": "échec de la restauration du snapshot :%s à cause de : %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10020": "Veuillez arrêter la VM avant de créer un modèle de volume pour le stockage de sauvegarde SFTP %s.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10042": "échec de la suppression du snapshot %s à cause de %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10023": "stockage de sauvegarde en double. Il existe déjà un stockage de sauvegarde SFTP [hostname:%s]", + "ORG_ZSTACK_LICENSE_CUBE_10000": "le contexte du code source ne peut pas être nul pour la validation de la licence. Veuillez fournir une chaîne de contexte valide.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10038": "échec de la récupération du pool de stockage %s à cause de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10037": "échec de la suppression du LUN %s à cause de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10039": "échec de la création du snapshot pour le volume %s à cause de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10034": "l'ID de mappage LUN est obligatoire mais a reçu :%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10033": "échec du mappage du LUN %s vers le groupe d'hôtes %s à cause de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10036": "l'ID LUN est obligatoire mais a reçu :%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10035": "échec de la suppression du mappage LUN %s à cause de %s", + "ORG_ZSTACK_ALIYUN_NETWORK_10004": "l'instance ECS [%s] n'existe pas, veuillez la vérifier.", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10001": "Échec du téléchargement des bits de machine virtuelle depuis le stockage de sauvegarde du magasin d'images [hostname:%s, path:%s] vers le stockage principal local [uuid:%s, path:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10002": "Échec du téléchargement des bits depuis le stockage local [uuid:%s, path:%s] vers le magasin d'images [hostname:%s], %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10020": "Le réseau l3 %s et le VPC %s sont déjà connectés. Veuillez vérifier.", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10000": "La VM source a un volume de données local sur l'hôte [UUID:%s], mais l'API de clonage rapide tente de cloner la VM vers l'hôte [%s], ce qui n'est pas pris en charge par la fonctionnalité de clonage rapide.", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10000": "AutoScalingRuleSchedulerJobTriggerVO[UUID:%s] est dans l'état %s, le changement d'état n'est pas autorisé", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10001": "AutoScalingRuleSchedulerJobTriggerVO[uuid:%s] est en période de cooldown", + "ORG_ZSTACK_ALIYUN_NETWORK_10008": "La bordure virtuelle : %s a été terminée", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10002": "AutoScalingRuleVO[uuid:%s] est dans l'état %s, la transition d'état n'est pas permise", + "ORG_ZSTACK_ALIYUN_NETWORK_10005": "seules les instances ECS à l'état en cours d'exécution ou arrêté peuvent détacher une EIP, mais l'état actuel de l'ECS [%s] est [%s].", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10018": "CpeIp doit être une adresse IPv4, mais c'est actuellement %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10017": "Seuls les utilisateurs administratifs peuvent établir des connexions dans cet environnement cloud.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10019": "cpeIp doit être une adresse IPv4 valide", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10000": "SftpBackupStorage ne prend pas en charge le scheme[%s] dans l'URL[%s]", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10014": "aucune sauvegarde de machine virtuelle trouvée pour : %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10013": "aucune machine virtuelle trouvée pour : %s", + "ORG_ZSTACK_ALIYUN_NETWORK_10010": "le CIDR de destination [%s] existe déjà et pointe vers un autre ID d'instance [%s]. Veuillez vérifier ou le supprimer d'abord.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10061": "Échec de la récupération des informations du LUN du cache d'images", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10016": "type d'instance non pris en charge : %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10003": "Échec de l'annulation du téléchargement de l'image, car %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10060": "Le nouveau cache d'images n'est pas prêt. Veuillez patienter et réessayer.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10015": "aucun réseau trouvé pour : %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10004": "L'UUID de l'agent SFTP Backup Storage a changé [attendu : %s, réel : %s], ce qui est très probablement dû à un redémarrage manuel de l'agent. Veuillez émettre une reconnexion pour synchroniser l'état.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10010": "Aucun CIDR trouvé pour le réseau L3 : %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10012": "aucun réseau privé virtuel trouvé pour : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10059": "impossible de trouver le volume : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10055": "Le cluster XSStor n'est pas sain, informations du cluster[clusterDataState: %s, clusterHealthyState: %s, clusterRunningState: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10058": "numéro d'unité logique (LUN) ID spécifié non valide", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10057": "La session pour le lun %s avec l'hôte %s n'est pas active dans l'environnement virtualisé.", + "ORG_ZSTACK_HYBRID_NETWORK_10027": "le CIDR chevauche un autre vswitch : %s", + "ORG_ZSTACK_HYBRID_NETWORK_10028": "bloc CIDR invalide : %s doit être compris dans les plages '10.0.0.0/8', '172.16.0.0/12', ou '192.168.0.0/16'", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10010": "Échec de la terminaison de l'instance %s en raison de %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10009": "Aucune interface réseau virtuelle trouvée pour le réseau de couche 3 : %s", + "ORG_ZSTACK_HYBRID_NETWORK_10029": "Aucun routeur de bordure virtuel de ce type : %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10003": "Le CIDR personnalisé [%s] existe déjà dans VBR [%s], chevauchement avec le CIDR cible [%s]. Veuillez d'abord vérifier et le supprimer.", + "ORG_ZSTACK_HYBRID_NETWORK_10020": "L'interface du routeur du prochain saut appartient à %s, mais l'entrée appartient à %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10001": "Vbr : [%s] est en train d'établir une connexion, veuillez patienter...", + "ORG_ZSTACK_HYBRID_NETWORK_10021": "Aucune passerelle privée virtuelle de ce type : %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10000": "Le CIDR personnalisé [%s] existe déjà dans le routeur virtuel [%s], chevauchement avec le CIDR cible [%s]. Veuillez d'abord vérifier et le supprimer.", + "ORG_ZSTACK_HYBRID_NETWORK_10022": "Le type de prochain saut [%s] n'est pas pris en charge pour la création d'une entrée d'itinéraire !", + "ORG_ZSTACK_HYBRID_NETWORK_10024": "Le routeur de bordure virtuel ne prend en charge que l'interface de routeur comme type de prochain saut", + "ORG_ZSTACK_HYBRID_NETWORK_10026": "Le CIDR du vswitch [%s] n'est pas dans le [%s] du VPC", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10008": "Échec de l'ajout de l'instance %s dans le groupe hôte %s, en raison de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10005": "Échec de l'obtention du sous-réseau de la zone d'accès en raison de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10004": "Échec de la synchronisation des zones d'accès en raison de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10007": "Échec de l'interrogation des instances %s en raison de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10006": "Échec de l'interrogation de toutes les instances, en raison de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10001": "Échec de l'ajout de l'initiateur : %s à l'hôte, en raison de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10000": "Échec de l'authentification avec le dispositif XStor : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10002": "Échec de la copie du LUN : %s vers %s, en raison de %s", + "ORG_ZSTACK_HYBRID_NETWORK_10038": "eip[%s] et ecs[%s] doivent être dans la même zone de disponibilité", + "ORG_ZSTACK_VMWARE_10135": "Échec de la définition de l'UUID ZStack sur l'entité gérée VCenter [name:%s, mor:%s] en raison de %s", + "ORG_ZSTACK_HYBRID_NETWORK_10039": "Impossible de détacher eip : [%s], il n'est attaché à aucune instance", + "ORG_ZSTACK_VMWARE_10132": "Aucun numéro d'unité disponible pour le disque de données %s", + "ORG_ZSTACK_VMWARE_10133": "Échec de la création du dvPortGroup pour distributedSwitch [%s], %s", + "ORG_ZSTACK_VMWARE_10130": "Échec de la suppression du volume[%s] : %s", + "ORG_ZSTACK_HYBRID_NETWORK_10030": "Aucun routeur virtuel de ce type n'existe : %s", + "ORG_ZSTACK_HYBRID_NETWORK_10031": "localGateway n'est pas une adresse IPv4 : %s", + "ORG_ZSTACK_HYBRID_NETWORK_10032": "peerGateway n'est pas une adresse IPv4 valide : %s", + "ORG_ZSTACK_HYBRID_NETWORK_10033": "peerGateway n'est pas un masque de sous-réseau valide : %s", + "ORG_ZSTACK_HYBRID_NETWORK_10034": "vlanId doit être une valeur numérique : %s", + "ORG_ZSTACK_HYBRID_NETWORK_10035": "Impossible de joindre l'EIP à l'ECS : [%s], l'EIP :[%s] est déjà joint à l'ECS:[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10036": "L'ECS [%s] possède déjà une adresse IP publique", + "ORG_ZSTACK_HYBRID_NETWORK_10037": "Impossible de joindre l'EIP [%s] à l'ECS [%s], car l'ECS est déjà associé à un EIP", + "ORG_ZSTACK_SSO_SERVICE_10014": "L'ID virtuel n'existe pas pour l'utilisateur %s", + "ORG_ZSTACK_VMWARE_10129": "Service de gestionnaire de disque virtuel indisponible. Veuillez vérifier si le service est en cours d'exécution ou contacter le support pour obtenir de l'aide.", + "ORG_ZSTACK_SSO_SERVICE_10011": "La réponse contient une erreur : Le fichier source n'a pas été trouvé dans le système de stockage cloud. Veuillez vérifier le chemin du fichier et vous assurer qu'il est correctement téléchargé vers l'environnement virtualisé.", + "ORG_ZSTACK_SSO_SERVICE_10010": "L'URL de redirection n'est pas valide, %s", + "ORG_ZSTACK_VMWARE_10128": "Aucun centre de données trouvé pour le stockage de données.%s", + "ORG_ZSTACK_SSO_SERVICE_10013": "Le compte n'existe pas pour l'utilisateur %s", + "ORG_ZSTACK_SSO_SERVICE_10012": "Échec de la génération de la configuration de mappage des informations utilisateur pour le client SSO [UUID: %s] : aucun mappage d'attributs personnalisé défini.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10030": "Échec de l'interrogation du mappage LUN pour le groupe d'hôtes %s en raison de %s", + "ORG_ZSTACK_HYBRID_NETWORK_10005": "L'interface du routeur doit être dans le même centre de données, mais ri[%s] est dans dc[%s] et ri[%s] est dans dc[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10032": "Échec de la récupération des informations du cluster en raison de %s", + "ORG_ZSTACK_VMWARE_10121": "Échec de la création du dvPortGroup pour %s", + "ORG_ZSTACK_HYBRID_NETWORK_10007": "L'interface du routeur[%s] n'est pas dans un état inactif, l'état actuel est %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10031": "Échec de l'interrogation du mappage LUN %s en raison de %s", + "ORG_ZSTACK_HYBRID_NETWORK_10009": "L'interface du routeur[%s] possède déjà une connexion active, elle est %s", + "ORG_ZSTACK_VMWARE_10120": "dvSwitch [%s] introuvable sur vCenter [%s]. Veuillez vous assurer que le dvSwitch existe et est correctement configuré.", + "ORG_ZSTACK_GUESTTOOLS_10009": "Aucun outil ISO de système d'exploitation invité approprié trouvé sur le nœud de gestion [UUID:%s] pour l'hôte [UUID:%s].", + "ORG_ZSTACK_GUESTTOOLS_10007": "Impossible d'obtenir les outils invités les plus récents pour la machine virtuelle[uuid:%s] car elle n'est pas en cours d'exécution ou est en cours de récupération de volume.", + "ORG_ZSTACK_ZWATCH_ALARM_10000": "Impossible de trouver l'abonnement aux événements [uuid:%s], il a peut-être été supprimé ou révoqué", + "ORG_ZSTACK_GUESTTOOLS_10008": "Impossible d'obtenir les outils invités les plus récents pour la VM[UUID:%s] car il ne s'agit pas d'une VM gérée par l'utilisateur", + "ORG_ZSTACK_GUESTTOOLS_10005": "Échec de qgaStateChange pour la machine virtuelle[uuid:%s]", + "ORG_ZSTACK_GUESTTOOLS_10006": "Impossible de récupérer les outils invités les plus récents pour la VM [uuid:%s] car son type d'hyperviseur n'est pas pris en charge", + "ORG_ZSTACK_GUESTTOOLS_10004": "Échec du téléchargement du fichier qga[%s]", + "ORG_ZSTACK_GUESTTOOLS_10001": "Une erreur s'est produite sur la VM-%s : %s", + "ORG_ZSTACK_ZWATCH_ALARM_10002": "La valeur de l'intervalle de répétition de la métrique[%s] ne peut pas être inférieure à 1 heure", + "ORG_ZSTACK_GUESTTOOLS_10002": "Échec du téléchargement du fichier vers la machine virtuelle-%s, %s", + "ORG_ZSTACK_ZWATCH_ALARM_10001": "Impossible de trouver l'alarme[uuid:%s], elle a peut-être été supprimée ou expirée", + "ORG_ZSTACK_SSO_SERVICE_10008": "Le jeton %s n'existe pas dans la configuration de l'environnement cloud. Veuillez vérifier et saisir à nouveau le jeton.", + "ORG_ZSTACK_AI_10109": "instance du centre de modèles [uuid: %s] non trouvée", + "ORG_ZSTACK_SSO_SERVICE_10007": "Échec du téléchargement des identifiants administrateur vers Keycloak. Veuillez vous assurer que les autorisations et configurations réseau nécessaires sont correctement configurées pour le déploiement cloud.", + "ORG_ZSTACK_ZWATCH_ALARM_10007": "L'abonnement aux événements possède déjà le label[%s]", + "ORG_ZSTACK_AI_10107": "instance de service de modèle (primaire) avec rang de nœud 0 non trouvée dans le groupe d'instances de service de modèle[uuid: %s]", + "ORG_ZSTACK_ZWATCH_ALARM_10006": "l'événement n'a pas de label[%s]", + "ORG_ZSTACK_SSO_SERVICE_10009": "type de données %s non pris en charge dans les environnements de cloud computing", + "ORG_ZSTACK_AI_10108": "Groupe d'instances de service de modèle %s non trouvé dans l'environnement cloud", + "ORG_ZSTACK_ZWATCH_ALARM_10005": "L'action avec UUID [%s] est déjà associée à l'abonnement aux événements avec UUID [%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10027": "échec de création du nom de LUN : %s, message d'erreur : %s", + "ORG_ZSTACK_SSO_SERVICE_10004": "L'URL des métadonnées IdP est requise.%s", + "ORG_ZSTACK_AI_10105": "Déploiement du service de modèle réussi, mais l'UUID de l'instance de service de modèle est manquant. Veuillez vérifier la configuration de l'instance.", + "ORG_ZSTACK_SSO_SERVICE_10003": "URL de point d'autorisation invalide : %s", + "ORG_ZSTACK_AI_10106": "Les UUID des instances de service de modèle sont vides ; impossible de traiter les instances de service de modèle. Veuillez vous assurer que les UUID sont fournis.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10029": "L'ID LUN est obligatoire lors de l'interrogation des informations de mapping LUN.", + "ORG_ZSTACK_SSO_SERVICE_10006": "Métadonnées du fournisseur d'identité invalides : %s", + "ORG_ZSTACK_AI_10103": "groupe d'instances de service de modèle[UUID: %s] non trouvé, création de ressource pour l'exécution du service ignorée", + "ORG_ZSTACK_VMWARE_10118": "échec de création du groupe de ports pour l'hôte %s à cause de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10028": "échec de l'interrogation du LUN %s à cause de %s", + "ORG_ZSTACK_AI_10104": "réponse de déploiement du service de modèle réussie, mais groupe d'instances de service de modèle[uuid: %s] non trouvé dans le pool d'instances de machines virtuelles", + "ORG_ZSTACK_VMWARE_10119": "échec de création du groupe de ports pour l'hôte %s", + "ORG_ZSTACK_AI_10101": "backend de stockage de modèle non trouvé pour le groupe d'instances de service de modèle[uuid: %s]", + "ORG_ZSTACK_VMWARE_10116": "portgroup[%s] existe déjà sur l'hôte[%s] mais avec un VLAN ID différent(%d)", + "ORG_ZSTACK_AI_10102": "échec de l'allocation de l'identifiant d'instance de service de modèle, à cause de %s", + "ORG_ZSTACK_VMWARE_10117": "portgroup[%s] existe déjà sur l'hôte[%s]. Veuillez créer un nouveau groupe de ports avec un nom différent ou supprimer le groupe de ports existant manuellement et l'attacher à nouveau au cluster.", + "ORG_ZSTACK_SSO_SERVICE_10002": "Le client SSO n'est pas un type d'identité [%s], l'opération push n'est pas autorisée.", + "ORG_ZSTACK_VMWARE_10114": "Le nom dvSwitch [%s] n'est pas unique", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10024": "échec de création du nom de LUN : %s, cause racine non trouvée", + "ORG_ZSTACK_SSO_SERVICE_10001": "Le client SSO avec UUID [%s] n'existe pas.", + "ORG_ZSTACK_AI_10100": "groupe d'instances de service de modèle[uuid: %s] l'UUID du service de modèle est nul", + "ORG_ZSTACK_VMWARE_10115": "Hôte[%s:%s] non trouvé dans l'inventaire vCenter", + "ORG_ZSTACK_VMWARE_10112": "Échec de la liste dvSwitch pour %s", + "ORG_ZSTACK_HYBRID_NETWORK_10016": "%s n'est pas un bloc CIDR valide", + "ORG_ZSTACK_VMWARE_10113": "Échec de l'obtention du nom du cluster vCenter[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10017": "Une règle de groupe de sécurité avec les mêmes paramètres existe déjà. Veuillez modifier ou supprimer la règle existante avant d'en créer une nouvelle.", + "ORG_ZSTACK_VMWARE_10110": "Les outils guest ne sont pas installés ou en cours d'exécution pour la VM: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10018": "dstCidrBlock[%s] n'est pas une plage d'adresses IPv4 ou IPv6 valide", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10020": "Échec de la mise à jour du nom LUN: %s, message d'erreur: %s", + "ORG_ZSTACK_VMWARE_10111": "Échec du téléchargement du fichier pour la machine virtuelle: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10019": "Aucune instance ECS de ce type: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10010": "accessPointUuid ne peut pas être nul si le routeur virtuel est de type VBR.", + "ORG_ZSTACK_HYBRID_NETWORK_10011": "Impossible de trouver le UUID du routeur[%s] dans VirtualBorderRouterVO", + "ORG_ZSTACK_GUESTTOOLS_10018": "Impossible de migrer la VM[UUID:%s], car un vfNic est attaché mais les outils guest ne sont pas en cours d'exécution", + "ORG_ZSTACK_ZWATCH_ALARM_10011": "L'événement[%s] n'a pas d'étiquette[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10012": "Impossible de trouver le UUID du routeur[%s] dans VpcVirtualRouterVO", + "ORG_ZSTACK_GUESTTOOLS_10019": "Impossible d'attacher le réseau L3 à la VM [UUID:%s], car les outils guest ne sont pas en cours d'exécution.", + "ORG_ZSTACK_ZWATCH_ALARM_10010": "L'espace de noms[%s] ne contient pas l'événement[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10013": "Type de routeur non pris en charge: %s", + "ORG_ZSTACK_GUESTTOOLS_10016": "Impossible de changer l'état HA du VF NIC car le VF NIC [UUID:%s] est introuvable", + "ORG_ZSTACK_HYBRID_NETWORK_10014": "Impossible de supprimer l'entrée de machine virtuelle de niveau système", + "ORG_ZSTACK_GUESTTOOLS_10017": "Échec du changement d'état de la carte d'interface réseau virtuelle pour haute disponibilité car les outils guest ne sont pas en cours d'exécution. Veuillez vous assurer que les outils guest sont installés et en cours d'exécution avant de réessayer cette opération.", + "ORG_ZSTACK_HYBRID_NETWORK_10015": "only support intranet access rule in VPC", + "ORG_ZSTACK_GUESTTOOLS_10014": "The script contains placeholder %s that have no corresponding parameters. Please provide values for these placeholders via runtimeParams to ensure proper configuration of your cloud computing environment.", + "ORG_ZSTACK_ZWATCH_ALARM_10015": "Period field is not supported for metric [name:%s]", + "ORG_ZSTACK_GUESTTOOLS_10015": "could not migrate primary storage because VM [UUID:%s] is attached to a VF Nic but Guest Tools are not running", + "ORG_ZSTACK_ZWATCH_ALARM_10014": "Period field cannot be null for metric [name:%s]", + "ORG_ZSTACK_GUESTTOOLS_10012": "encodingType and scriptContent must be either both present or both absent in your cloud deployment configuration.", + "ORG_ZSTACK_ZWATCH_ALARM_10013": "namespace[%s] not found in the specified cloud namespace registry", + "ORG_ZSTACK_GUESTTOOLS_10013": "Invalid renderParams format, must be a valid JSON array of key-value pairs. Example: [{\\\"key\\\":\\\"k1\\\",\\\"value\\\":\\\"v1\\\"}]. Error: %s", + "ORG_ZSTACK_GUESTTOOLS_10010": "failed to check guest tools on host[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10019": "fail to query LUN by path: %s, error message: %s", + "ORG_ZSTACK_GUESTTOOLS_10011": "échec de la définition de l'UUID de VM : %s NOM : %s hostname car l'agent invité QEMU n'est pas en cours d'exécution et il n'y a pas de service DHCP", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10016": "échec de l'ajout du groupe d'hôtes : %s, message d'erreur : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10015": "échec de la requête du groupe d'hôtes en raison de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10017": "échec de la requête LUN : %s, message d'erreur : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10012": "échec de la suppression du groupe d'hôtes %s en raison de %s", + "ORG_ZSTACK_VMWARE_10105": "Aucun pool de ressources trouvé pour l'hôte de calcul %s", + "ORG_ZSTACK_VMWARE_10106": "échec de la recherche du pool de ressources pour l'hôte %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10014": "échec de la suppression de l'initiateur %s en raison de %s", + "ORG_ZSTACK_VMWARE_10103": "échec de la définition de l'UUID de VM ESX [%s:%s], à cause de [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10013": "l'identifiant d'hôte est obligatoire mais a reçu : %s", + "ORG_ZSTACK_VMWARE_10104": "modèle [%%s] non trouvé dans le référentiel de modèles cloud", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10029": "impossible de trouver l'instance de construction avec UUID : %s, ou elle était en statut Suppression", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10028": "impossible de trouver l'UUID pour l'image[%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10027": "imageStore n'est pas connecté au service de stockage cloud. Veuillez vous assurer que votre service de stockage cloud est correctement configuré et réessayez.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10026": "imageStore n'est pas activé. Veuillez vous assurer qu'imageStore est configuré et activé dans les paramètres de votre environnement cloud.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10024": "impossible de trouver l'application de construction : [%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10022": "le système de construction [UUID: %s] n'a pas été attaché à la zone de calcul [UUID: %s]", + "ORG_ZSTACK_CONTAINER_10040": "Échec de la création du déploiement sur un cluster disponible. Essayé %d clusters : %s", + "ORG_ZSTACK_FLOWMETER_10013": "Collecteur en double avec %s", + "ORG_ZSTACK_FLOWMETER_10014": "Aucun paramètre spécifié pour la demande de provisionnement de ressource cloud. Veuillez spécifier %s.", + "ORG_ZSTACK_FLOWMETER_10015": "[%s] ne respecte pas le format d'adresse IP", + "ORG_ZSTACK_FLOWMETER_10016": "FlowCollector[%s] n'existe pas", + "ORG_ZSTACK_GUESTTOOLS_10029": "impossible de récupérer les informations des outils invités de la VM [uuid:%s] car elle n'est pas en cours d'exécution", + "ORG_ZSTACK_CONTAINER_10043": "Échec de la requête du service cloud : %s, à cause de %s", + "ORG_ZSTACK_FLOWMETER_10017": "FlowMeter[%s] n'existe pas", + "ORG_ZSTACK_FLOWMETER_10018": "FlowMeter[%s] ne prend pas en charge la version IPv6 [%s]", + "ORG_ZSTACK_GUESTTOOLS_10027": "impossible d'attacher l'ISO des outils invités à la VM [UUID:%s] car ce n'est pas une VM utilisateur", + "ORG_ZSTACK_CONTAINER_10045": "Échec de la création du service en raison de %s", + "ORG_ZSTACK_FLOWMETER_10019": "Collecteur [%s %d] en double avec %s", + "ORG_ZSTACK_GUESTTOOLS_10028": "impossible d'attacher l'ISO des outils invités à la VM [uuid:%s] car il lui manque un périphérique CDROM", + "ORG_ZSTACK_CONTAINER_10037": "Impossible de trouver des clusters conteneurisés. Veuillez consulter NativeClusterVO pour plus de détails.", + "ORG_ZSTACK_GUESTTOOLS_10025": "impossible d'attacher l'ISO des outils invités à la VM [uuid:%s] car le type d'hyperviseur n'est pas pris en charge", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10057": "échec de l'arrêt du châssis baremetal [uuid:%s] avec ipmitool", + "ORG_ZSTACK_GUESTTOOLS_10026": "impossible d'attacher l'ISO des outils invités à la VM [UUID:%s] car elle n'est pas en cours d'exécution", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10058": "échec de l'arrêt de l'instance baremetal [uuid:%s] via l'agent bm, raison : %s", + "ORG_ZSTACK_GUESTTOOLS_10023": "échec de la mise à jour de la configuration réseau de la VM [uuid:%s] car la version des outils invités est trop ancienne pour cette fonctionnalité.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10059": "le châssis baremetal2 [uuid:%s] n'est toujours pas arrêté après %d secondes", + "ORG_ZSTACK_GUESTTOOLS_10024": "échec de la mise à jour de la configuration réseau de la VM [uuid:%s] car les outils invités ne sont pas en cours d'exécution.", + "ORG_ZSTACK_GUESTTOOLS_10021": "Conflit détecté avec le nom d'hôte. Une autre VM avec l'UUID [%s] utilise déjà le nom d'hôte [%s] sur le réseau L3 avec l'UUID [%s].", + "ORG_ZSTACK_GUESTTOOLS_10022": "échec de la mise à jour de la configuration réseau de la VM [uuid:%s] car la machine virtuelle n'est pas en cours d'exécution.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10054": "échec de l'établissement d'une connexion avec l'instance baremetal2 [uuid:%s] via la passerelle [uuid:%s], en raison de %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10055": "échec du changement de mot de passe de l'instance baremetal [uuid:%s] via la passerelle [uuid:%s], car %s", + "ORG_ZSTACK_GUESTTOOLS_10020": "impossible de définir le nom d'hôte de la VM. La VM [UUID:%s] n'a pas de réseau L3 par défaut.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10056": "échec de la mise sous tension du châssis baremetal [uuid:%s] avec ipmitool", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10021": "impossible de trouver le système de construction [%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10020": "le système de construction [UUID: %s] a été attaché à la zone [UUID: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10050": "échec de la création du proxy console pour l'instance baremetal [uuid:%s] dans la passerelle [uuid:%s], car %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10051": "échec du basculement du réseau par défaut de l3 [uuid:%s] vers l3 [uuid:%s] pour l'instance baremetal [uuid:%s], en raison de %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10018": "échec de l'ajout de BuildApp car appId[%s:%s] est dupliqué par une autre instance BuildApp", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10017": "impossible de se connecter au système de construction de stockage local [url: %s], en raison d'un problème de connectivité", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10016": "échec de la création de BuildApp car appId[%s] est dupliqué par une autre BuildApp", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10015": "L'application de construction est désactivée car le système de construction est à l'état 'Arrêté'. Veuillez démarrer le système de construction pour activer l'application.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10014": "l'appel REST %s a échoué, car : %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10013": "l'application de construction est à l'état %s, ce qui ne prend pas en charge l'opération actuelle.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10012": "impossible de trouver l'application de construction par UUID[%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10011": "impossible d'effectuer l'opération car le système de construction est à l'état %s", + "ORG_ZSTACK_CONTAINER_10031": "Déploiement non trouvé : %s", + "ORG_ZSTACK_FLOWMETER_10003": "Le réseau [%s] a été intégré dans le compteur de flux [%s].", + "ORG_ZSTACK_FLOWMETER_10004": "Le routeur virtuel a été ajouté à un autre compteur de flux. Veuillez vous assurer qu'il n'est pas dupliqué.", + "ORG_ZSTACK_FLOWMETER_10005": "le paramètre de type invalide est %s et devrait être dans la plage valide %s", + "ORG_ZSTACK_CONTAINER_10032": "Échec de la mise à jour du déploiement en raison de %s", + "ORG_ZSTACK_CONTAINER_10034": "Échec du remplacement du déploiement en raison de %s", + "ORG_ZSTACK_CONTAINER_10026": "Échec de la suppression du service en raison de %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10046": "Échec de la destruction du réseau de provisionnement dans la passerelle[uuid:%s], car %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10047": "Aucune NIC provisionnée trouvée pour l'instance baremetal[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10048": "Échec de la création des configurations de provisionnement pour l'instance baremetal[uuid:%s] dans la passerelle[uuid:%s], car %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10049": "Échec de la suppression des configurations de provisionnement pour l'instance baremetal[uuid:%s] dans la passerelle[uuid:%s], car %s", + "ORG_ZSTACK_IMAGEREPLICATOR_10000": "Le stockage de sauvegarde cible[uuid:%s] est devenu indisponible à l'utilisation", + "ORG_ZSTACK_GUESTTOOLS_10032": "Impossible de mettre à jour l'état des outils invités pour la VM [uuid:%s] car la VM a été supprimée", + "ORG_ZSTACK_ALIYUN_OSS_10002": "La clé d'accès AWS, la clé d'accès secrète et la région doivent être définies simultanément.", + "ORG_ZSTACK_CONTAINER_10029": "Erreur API : Le fichier source n'a pas été trouvé dans le système de stockage cloud. Veuillez vérifier le chemin du fichier et réessayer.", + "ORG_ZSTACK_IMAGEREPLICATOR_10001": "Un ou plusieurs stockages de sauvegarde[uuids:%s] ont été ajoutés au groupe de réplication[uuid:%s].", + "ORG_ZSTACK_ALIYUN_OSS_10003": "Le bucket OSS n'est pas vide ! Veuillez vous assurer que le bucket est vide avant de procéder à l'opération.", + "ORG_ZSTACK_GUESTTOOLS_10030": "Impossible de récupérer les informations des outils invités de la VM [UUID:%s] car il ne s'agit pas d'une VM utilisateur", + "ORG_ZSTACK_ALIYUN_OSS_10000": "ossBucket [%s] est déjà enregistré dans le dataCenter [%s]", + "ORG_ZSTACK_GUESTTOOLS_10031": "paramètre de débogage invalide : %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10045": "Échec de la préparation du réseau de provisionnement dans la passerelle[uuid:%s], car %s", + "ORG_ZSTACK_ALIYUN_OSS_10001": "OssBucket[%s] n'est pas associé.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10010": "L'ID d'exportation et l'UUID de l'application de construction sont tous deux définis mais ne correspondent pas. Veuillez vérifier les valeurs de %s et %d.", + "ORG_ZSTACK_IMAGEREPLICATOR_10002": "Le stockage de sauvegarde[uuids:%s] n'est pas de type ImageStoreInstance", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10040": "Échec de la conversion des données d'image en disque local. Veuillez vous assurer qu'il y a suffisamment de ressources de stockage et des permissions correctes. Si le problème persiste, envisagez d'utiliser des services de stockage d'objets pour la gestion des images.", + "ORG_ZSTACK_IMAGEREPLICATOR_10003": "Le stockage de sauvegarde [UUIDs:%s] n'est associé à aucune Zone", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10041": "La conversion du volume de l'instance baremetal2 [uuid:%s] a échoué sur le châssis [uuid:%s], délai dépassé après %d minutes", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10035": "Échec de la récupération de l'IQN de la cible iSCSI ou de l'IP de la passerelle pour le volume [uuid:%s] à partir du stockage principal [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10037": "Le disque du châssis:%s n'a pas d'information WWN, veuillez inspecter le châssis et réessayer", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10031": "Échec du détachement de la NIC provisionnée du bonding sur l'instance baremetal [uuid:%s] via la passerelle [uuid:%s], car %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10032": "L'instance baremetal2[uuid:%s] n'est pas connectée ; par conséquent, elle ne peut pas attacher une NIC provisionnée à un bond.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10033": "Échec de l'attachement de la NIC provisionnée au bonding sur l'instance baremetal [uuid:%s] via la passerelle [uuid:%s], car %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10030": "L'instance baremetal2[uuid:%s] n'est pas connectée ; par conséquent, elle ne peut pas détacher la NIC de provisionnement de la configuration de bonding.", + "ORG_ZSTACK_CONTAINER_10051": "Échec de la recherche du client Kubernetes pour le compte[uuid:%s]", + "ORG_ZSTACK_CONTAINER_10050": "Configuration Kubernetes pour le cluster %s est nulle", + "ORG_ZSTACK_CONTAINER_10052": "Échec de l'utilisation du contenu du fichier de configuration kube: %s", + "ORG_ZSTACK_CORE_PROGRESS_10000": "Le paramètre apiId[%s] n'est pas un UUID valide pour la configuration du service cloud.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10029": "Échec de la suppression de la configuration de conversion du volume en disque local du châssis dans la passerelle[uuid:%s] pour l'instance baremetal[uuid:%s]", + "ORG_ZSTACK_CONTAINER_10056": "Impossible de trouver le stockage de sauvegarde de conteneur avec l'UUID: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10024": "L'adresse IP provisionnée %s n'est pas disponible car elle ne peut pas se connecter à la passerelle %s; erreur détaillée:%s", + "ORG_ZSTACK_CONTAINER_10047": "Échec de la récupération du bundle d'état du service pour le service[%s]", + "ORG_ZSTACK_CONTAINER_10049": "Impossible de trouver le cluster avec l'identifiant de cluster spécifié: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10027": "Échec de l'inspection du châssis BareMetal2 par l'instance[uuid:%s] à travers la passerelle[uuid:%s], parce que %s", + "ORG_ZSTACK_STORAGE_CBT_10020": "État de VM[UUID: %s] inattendu: %s, l'état attendu de la VM est En cours d'exécution.", + "ORG_ZSTACK_STORAGE_CBT_10021": "La VM [UUID: %s] a déjà créé une tâche de sauvegarde; par conséquent, l'activation de la tâche CBT n'est pas permise simultanément.", + "ORG_ZSTACK_STORAGE_CBT_10016": "Aucun type d'hyperviseur spécifié pour la VM %s", + "ORG_ZSTACK_STORAGE_CBT_10017": "Aucun CBTBackupFactory de type[%s] trouvé dans les fournisseurs de stockage cloud configurés", + "ORG_ZSTACK_STORAGE_CBT_10014": "La VM [uuid: %s] a été protégée par la tâche: %s", + "ORG_ZSTACK_STORAGE_CBT_10015": "Échec de la création des volumes cbt. détails: %s", + "ORG_ZSTACK_STORAGE_CBT_10018": "Tâche CVM non trouvée[uuid: %s]", + "ORG_ZSTACK_STORAGE_CBT_10019": "La tâche Cbt [UUID: %s] a déjà été activée. Veuillez la désactiver.", + "ORG_ZSTACK_CONTAINER_10000": "Le stockage de sauvegarde de conteneur ne prend pas en charge le format spécifié %s", + "ORG_ZSTACK_CONTAINER_10002": "Aucune zone de disponibilité trouvée pour le point de terminaison[%s]", + "ORG_ZSTACK_IAM2_RBAC_10006": "Les opérations[%s] sont refusées dans cet environnement d'informatique en nuage", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10008": "Échec de l'obtention du réseau virtuel[uuid:%s] du contrôleur tf", + "ORG_ZSTACK_IAM2_RBAC_10001": "Comme le projet nécessite l'utilisation forcée du groupe de sécurité, une étiquette système est obligatoire pour les opérations de machine virtuelle.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10009": "Échec de la mise à jour du réseau l2[name:%s] sur le contrôleur tf", + "ORG_ZSTACK_IAM2_RBAC_10000": "Échec de la création de l'instance de VM car le réseau l3 [uuid:%s] n'est attaché à aucun cluster de calcul", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10006": "Échec de la création du réseau L2 tf[name:%s] sur le contrôleur tf", + "ORG_ZSTACK_IAM2_RBAC_10003": "Le projet[uuid:%s] a été retiré et toutes les opérations sont rejetées.", + "ORG_ZSTACK_IAM2_RBAC_10002": "Le projet du compte[uuid:%s] n'existe pas", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10005": "Échec de l'obtention du projet[uuid:%s] sur le contrôleur Terraform", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10002": "Échec de l'obtention du domaine par défaut sur le contrôleur TensorFlow.%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10003": "Échec de la création du projet TF pour ZStack Admin sur le contrôleur TF", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10000": "Le contrôleur SDN avec le nom spécifié existe déjà. Veuillez choisir un nom différent ou en utiliser un existant.", + "ORG_ZSTACK_STORAGE_CBT_10012": "impossible de trouver la ressource pour la tâche CBT[uuid: %s]", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10001": "Échec de la récupération du compte administrateur par défaut depuis la base de données ZStack", + "ORG_ZSTACK_STORAGE_CBT_10013": "hôte non trouvé pour la machine virtuelle: %s", + "ORG_ZSTACK_STORAGE_CBT_10011": "volume[uuid:%s] est déjà exporté pour vmInstance[uuid:%s].", + "ORG_ZSTACK_STORAGE_CBT_10006": "impossible de trouver la tâche Cloud Block Storage[uuid:%s]", + "ORG_ZSTACK_STORAGE_CBT_10009": "vm[uuid: %s] est en cours d'exécution. Veuillez l'arrêter et réessayer.", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10004": "type incorrect du paramètre '%s' dans l'expression, il doit être de type %s, mais %s a été obtenu", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10003": "paramètre '%s' manquant dans l'expression de cloud computing", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10000": "expression invalide: %s, %s Veuillez vous assurer que les expressions sont valides pour les environnements de cloud computing.", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10001": "expression invalide: %s, aucune expression de cloud computing valide trouvée", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10019": "échec de l'ajout du sous-réseau l3[name:%s] sur le contrôleur tf en raison de:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10082": "baremetal2 gateway with UUID: %s is not connected; therefore, a console URL cannot be generated for instance with UUID: %s.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10016": "échec de la mise à jour du réseau l3[name:%s] sur le contrôleur tf en raison de:%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10013": "échec de la suppression du réseau L3[name:%s] sur le contrôleur tf en raison de:%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10011": "échec de la suppression du réseau l2[uuid:%s] sur le contrôleur tf", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10080": "échec de la préparation du réseau de provisionnement[uuid:%s] dans la passerelle[uuid:%s]: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10081": "l'instance baremetal2 [uuid:%s] n'existe pas; par conséquent, son URL de console ne peut pas être générée.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10007": "buildAppUuid et exportId ne peuvent pas être tous deux nuls simultanément. Veuillez vous assurer que buildAppUuid ou exportId est fourni.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10006": "l'UUID du stockage de sauvegarde et le nom d'hôte sont tous deux définis, mais ils font référence à des hôtes différents", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10005": "plus d'un stockage de sauvegarde trouvé avec le nom d'hôte: %s, veuillez utiliser backupStorageUuid à la place", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10004": "impossible de trouver le magasin d'images avec le nom d'hôte: %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10003": "L'UUID du stockage de sauvegarde et le nom d'hôte sont nuls. Veuillez vérifier les paramètres de configuration du stockage de sauvegarde et du nom d'hôte.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10002": "dataPath doit commencer par '/', mais [%s] a été obtenu", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10001": "un autre système de construction[UUID: %s, name: %s] sur cet hôte[%s] utilise la même URL[%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10000": "build-app[%s] est en cours d'exportation ou d'exportation; veuillez d'abord le terminer ou le supprimer.", + "ORG_ZSTACK_CAS_10000": "propriété manquante pour la configuration du pilote CAS", + "ORG_ZSTACK_CAS_10002": "ID de machine virtuelle incorrect[name:%s], inexistant ou mot de passe incorrect", + "ORG_ZSTACK_CONTAINER_10020": "Échec de la suppression de la politique réseau en raison de %s", + "ORG_ZSTACK_CAS_10001": "Pilote CAS non pris en charge: %s", + "ORG_ZSTACK_CONTAINER_10022": "L'ID du cluster est nul lors de la création de la stratégie réseau", + "ORG_ZSTACK_CAS_10003": "Ce type de données [%s] n'est pas défini dans CAS.", + "ORG_ZSTACK_CONTAINER_10024": "Échec de la création de la stratégie réseau en raison de %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10009": "Aucune tâche d'exportation trouvée avec l'ID %s dans l'historique des exports. Veuillez vérifier l'ID de la tâche d'exportation et réessayer.", + "ORG_ZSTACK_CONTAINER_10023": "Impossible de récupérer ApiClient par l'ID du cluster : %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10008": "buildAppUuid et buildSystemUuid ne peuvent pas être tous les deux nuls. Veuillez vous assurer que buildAppUuid ou buildSystemUuid est fourni.", + "ORG_ZSTACK_CONTAINER_10015": "Échec de la suppression du déploiement en raison de %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10079": "Le type d'hyperviseur du cluster [uuid:%s] n'est pas valide", + "ORG_ZSTACK_CONTAINER_10017": "Impossible de trouver le pod [name=%s, namespace=%s]", + "ORG_ZSTACK_CONTAINER_10016": "Échec de la résiliation du déploiement en raison d'une erreur non spécifiée.%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10075": "Échec de la récupération des adresses IP de la passerelle du chemin d'accès [iscsiPath: %s] pour le volume bloc %s en raison de %s", + "ORG_ZSTACK_CONTAINER_10018": "Échec de l'ajout de l'étiquette au pod en raison de %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10076": "Échec du détachement du volume [uuid:%s] de l'instance baremetal [uuid:%s] via la passerelle [uuid:%s], car %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10028": "Échec de l'ajout de la configuration DNS au réseau de couche 3 [name:%s] sur le contrôleur TensorFlow en raison de : %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10077": "Échec de la destruction du volume [uuid:%s] pour l'instance baremetal [uuid:%s] dans la passerelle [uuid:%s], car %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10078": "Tous les Ceph MON du stockage primaire [uuid:%s] ne sont pas en état Healthy", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10072": "L'instance baremetal2 [uuid:%s] n'est pas connectée ; par conséquent, un volume ne peut pas y être attaché.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10073": "Échec de la récupération de l'ID LUN du volume sur le stockage primaire externe %s. Veuillez vous assurer que le système de stockage est correctement configuré et accessible.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10025": "Échec de la suppression de l'itinéraire hôte du réseau virtuel [name:%s] sur le contrôleur du gestionnaire de trafic en raison de : %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10074": "Échec de la récupération de l'ID LUN du volume [uuid:%s] pour l'instance bare metal [uuid:%s] dans la passerelle [uuid:%s], en raison de %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10022": "Échuc de l'ajout du routeur hôte au réseau de couche 3 [name:%s] sur le contrôleur tf en raison de : %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10070": "Échec de l'attachement du volume avec l'UUID : %s à l'instance baremetal avec l'UUID : %s via la passerelle avec l'UUID : %s en raison de %s", + "ORG_ZSTACK_FLOWMETER_10021": "%s doit être une valeur numérique", + "ORG_ZSTACK_LOG4J2_10001": "Type de appender log4j2 inconnu %s", + "ORG_ZSTACK_LOG4J2_10000": "Aucune usine trouvée pour le type d'appender Log4j2 :%s.", + "ORG_ZSTACK_CONTAINER_10011": "Aucun hôte trouvé pour l'uuid [%s]", + "ORG_ZSTACK_CONTAINER_10013": "Impossible de trouver le point de terminaison de gestion des conteneurs [uuid:%s]", + "ORG_ZSTACK_CONTAINER_10012": "Aucun fournisseur trouvé pour le vendeur [%s]", + "ORG_ZSTACK_CONTAINER_10004": "L'hôte [%s] n'est pas associé au point de terminaison [%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10068": "Échec du provisionnement du volume [uuid:%s] pour l'instance baremetal [uuid:%s] via la passerelle [uuid:%s], car %s", + "ORG_ZSTACK_CONTAINER_10005": "Aucun cluster trouvé pour le point de terminaison[%s]", + "ORG_ZSTACK_CONTAINER_10008": "Échec de la liste des instances pour le cluster[%s] : %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10064": "Échec de l'attachement de la carte réseau avec UUID:%s à l'instance Baremetal2 avec UUID:%s via la passerelle avec UUID:%s en raison de %s", + "ORG_ZSTACK_CONTAINER_10007": "La zone[%s] ne correspond pas au point de terminaison[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10065": "L'instance baremetal2[uuid:%s] n'est pas connectée ; par conséquent, elle ne peut pas être détachée de son interface réseau.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10066": "Échec du détachement de l'interface réseau [uuid:%s] de l'instance bare metal [uuid:%s] via la passerelle [uuid:%s], car %s", + "ORG_ZSTACK_CONTAINER_10009": "Le cluster[%s] existe déjà dans le point de terminaison[%s] avec une zone de disponibilité différente[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10060": "Assurez-vous que toutes les passerelles BareMetal2 sur le réseau de provisioning [uuid:%s] sont connectées.", + "ORG_ZSTACK_CONFIGURATION_10011": "Stratégie d'allocation de stockage primaire non prise en charge[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10061": "La liste des UUID d'instances VM est vide. Veuillez fournir au moins un UUID valide.", + "ORG_ZSTACK_CONFIGURATION_10010": "Stratégie d'allocation d'hôte non prise en charge[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10062": "La passerelle baremetal2 [UUID : %s, statut : %s] n'est pas connectée", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10063": "L'instance baremetal2[uuid:%s] n'est pas connectée ; par conséquent, elle ne peut pas avoir de carte réseau attachée.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10031": "Échec de la suppression de la configuration DNS du réseau de couche 3 [name:%s] sur le contrôleur tf en raison de : %s", + "ORG_ZSTACK_STORAGE_BACKUP_10119": "installPath et l'URL de bootstrap sont tous deux requis.", + "ORG_ZSTACK_STORAGE_BACKUP_10118": "Ne pas autoriser le recouvrement d'une base de données à partir d'une sauvegarde dans l'environnement cloud.", + "ORG_ZSTACK_STORAGE_BACKUP_10117": "La sauvegarde de base de données[uuid:%s] a été exportée vers le stockage de sauvegarde[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10116": "La sauvegarde de base de données [UUID %s] n'a pas été exportée depuis le stockage de sauvegarde [UUID : %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10115": "L'état actuel du stockage de sauvegarde[%s] ne permet pas de procéder avec l'opération[%s], les états valides sont %s", + "ORG_ZSTACK_STORAGE_BACKUP_10114": "Impossible d'établir une connexion SSH vers le nœud pair à l'aide de la clé SSH. Veuillez vérifier la connectivité réseau et la configuration de la clé SSH.", + "ORG_ZSTACK_STORAGE_BACKUP_10113": "La bande passante doit être une valeur positive", + "ORG_ZSTACK_STORAGE_BACKUP_10112": "Les paramètres du travail manquent la valeur de rétention distante : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10039": "Les VM[uuid:%s] ne sont pas arrêtées et ne s'exécutent pas sur l'hôte spécifique.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10007": "Le rôle d'administrateur de sécurité intégré ne peut pas être supprimé par le rôle d'administrateur de sécurité intégré.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10038": "Le volume[uuid:%s] a été attaché à une ou plusieurs VM(s)[uuid:%s] qui ne sont pas dans un état arrêté et ne s'exécutent pas sur l'hôte spécifique.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10008": "Impossible de révoquer le rôle d'administrateur système du groupe d'utilisateurs administrateur système", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10009": "Impossible de supprimer l'administrateur d'audit intégré. Veuillez vous assurer que vous ne tentez pas de modifier un rôle fourni par le système.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10003": "Le nom de l'utilisateur initial pour cette ressource ne peut pas être mis à jour.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10034": "Impossible de trouver la réplication du volume %s sur l'hôte %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10004": "%s est un mot-clé réservé dans les environnements de virtualisation de l'informatique en nuage, veuillez choisir un autre nom.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10037": "L'UUID du stockage principal ne peut pas être null. Veuillez vous assurer qu'un UUID valide est fourni pour le stockage principal.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10036": "UUID de ressource invalide %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10006": "impossible de révoquer le rôle d'administrateur d'audit de l'utilisateur administrateur intégré", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10042": "le mini stockage [UUID: %s] doit être vide avant de restaurer les données depuis ZBox. Veuillez le nettoyer.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10001": "Aucune usine trouvée pour le type de sortie FluentBit: %s.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10010": "Impossible de supprimer l'administrateur de sécurité intégré. Veuillez vous assurer que vous n'essayez pas de modifier un rôle fourni par le système.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10041": "pas de LocalStorageBackupStorageMediator supportant l'hyperviseur[%s] et le type de stockage de sauvegarde[%s]", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10011": "Impossible de révoquer les privilèges de l'administrateur système intégré.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10003": "Le nom d'hôte ou l'ID ne peut pas être null. Veuillez fournir un nom d'hôte ou un ID valide.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10012": "Confirmez que les rôles que vous souhaitez ajouter ont la même identité et sont compatibles dans votre environnement de virtualisation.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10002": "Type de plugin de sortie FluentBit inconnu %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10013": "Impossible d'ajouter le rôle: %s à l'identité: %s pour l'ID virtuel[uuid:%s]", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10005": "Le numéro de port ne peut pas être null", + "ORG_ZSTACK_APPCENTER_UTILS_10000": "impossible de trouver le fichier JSON du modèle brut à: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10004": "le serveur de stockage de journal [adresse: %s] n'est pas disponible", + "ORG_ZSTACK_APPCENTER_UTILS_10001": "Échec de la génération du modèle JSON pour la configuration des ressources cloud", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10040": "Échec de %s car le ou les hôtes[uuid:%s] ne sont pas activés et ne sont pas dans un état connecté.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10007": "La nouvelle configuration contient des erreurs, entraînant des exceptions de service. Veuillez examiner à nouveau les paramètres de configuration. Détails: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10006": "La création du serveur de journal a échoué. Des paramètres de configuration nouvellement transmis incorrects ont pu provoquer l'entrée du service Fluent Bit dans un état inactif. Veuillez vérifier la configuration pour plus d'exactitude.", + "ORG_ZSTACK_STORAGE_BACKUP_10111": "type de rétention distant manquant dans les paramètres du travail", + "ORG_ZSTACK_STORAGE_BACKUP_10110": "'retentionValue' manquant dans la configuration des paramètres du travail", + "ORG_ZSTACK_STORAGE_BACKUP_10129": "Aucune instance trouvée avec l'UUID du volume racine: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10124": "Aucune VM trouvée pour le volume[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10123": "Opération non prise en charge sur une pièce jointe de volume partagé", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10028": "aucun stockage de sauvegarde ne peut récupérer l'image[uuid:%s] pour le volume[uuid:%s]", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10005": "Impossible de trouver JoinType dans le package importé ou la classe. Veuillez vous assurer que vous avez importé le bon package et que la classe contient le JoinType défini.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10029": "l'image[uuid: %s] n'a pas de référence à un stockage de sauvegarde[uuid: %s]", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10000": "sortie de [CloudFunction] est vide", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10001": "l'appel de l'action[%s] a échoué, cause: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10023": "opération attendue sur les hôtes[%s] mais seuls les hôtes %s sont disponibles et activés", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10002": "action : %s n'est pas prise en charge pour le rôle IAM : %s", + "ORG_ZSTACK_STORAGE_BACKUP_10120": "databaseBackup[uuid:%s] n'est pas activé et disponible", + "ORG_ZSTACK_STORAGE_SNAPSHOT_REFERENCE_10000": "Un volume avec l'UUID %s a été référencé par d'autres volumes [%s]. Veuillez aplatir ces volumes et leurs descendants avant de modifier le chemin d'installation.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10017": "le cluster requis %s n'est pas attaché au stockage principal %s pour la création du volume %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10016": "l'état du réseau de réplication du volume [uuid:%s] est passé en mode StandAlone, alors que tous les hôtes sont dans un état Connecté ; veuillez d'abord le récupérer", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10018": "impossible de trouver un hôte disponible sur le cluster requis %s pour la création du volume", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10013": "l'hôte[uuid: %s] du stockage principal mini[uuid: %s] n'a pas une capacité suffisante[actuel : %s octets, nécessaire : %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10017": "la passerelle baremetal2 avec l'UUID : %s n'est pas colocalisée dans la même zone que le cluster avec l'UUID : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10012": "impossible d'allouer suffisamment d'espace pour le stockage principal [UUID : %s] sur l'hôte [UUID : %s], capacité physique insuffisante", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10018": "impossible de modifier le cluster d'une passerelle Baremetal2 [uuid:%s] lorsque des instances actives y sont liées", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10015": "la réplication du volume[uuid:%s] est en cours de synchronisation des données, veuillez attendre que la synchronisation soit terminée", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10019": "le cluster[%s] n'est pas de type baremetal", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10014": "impossible de trouver un hôte disponible pour redimensionner le volume[uuid: %s] sur le système de stockage mini[uuid: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10013": "le cluster[uuid:%s] n'est pas disponible", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10014": "le cluster[uuid:%s] n'est pas un cluster de virtualisation bare metal", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10022": "impossible d'allouer le port de synchronisation du stockage sur l'hôte %s : %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10015": "la passerelle[uuid:%s] n'est pas disponible", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10021": "impossible de trouver un hôte disponible pour exécuter la commande pour le stockage principal[uuid: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10016": "la passerelle baremetal2 avec l'UUID : %s fait déjà partie du cluster avec l'UUID : %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10010": "la passerelle baremetal2[uuid:%s] ne peut être attachée qu'à un seul cluster de calcul", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10011": "la passerelle baremetal2 [UUID : %s] n'est pas attachée au cluster [UUID : %s], le détachement n'est pas nécessaire", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10012": "la passerelle baremetal2 avec l'UUID:%s est actuellement attachée à un seul cluster ; ne la détache pas", + "ORG_ZSTACK_STORAGE_BACKUP_10108": "'retentionPolicyType' et 'retentionPeriod' manquants dans les paramètres du travail", + "ORG_ZSTACK_STORAGE_BACKUP_10107": "UUID de stockage de sauvegarde inattendu : %s", + "ORG_ZSTACK_STORAGE_BACKUP_10106": "Le paramètre de travail 'backupStorageUuids' est vide. Veuillez vous assurer que des UUID de stockage de sauvegarde valides sont fournis pour que l'opération puisse se poursuivre.", + "ORG_ZSTACK_STORAGE_BACKUP_10105": "'backupStorageUuids' manquant dans les paramètres du travail, veuillez vous assurer que tous les UUID de stockage de sauvegarde requis sont spécifiés", + "ORG_ZSTACK_STORAGE_BACKUP_10104": "paramètres de travail requis manquants : %s", + "ORG_ZSTACK_STORAGE_BACKUP_10103": "statut de tâche inattendu : %s", + "ORG_ZSTACK_STORAGE_BACKUP_10102": "La tâche de synchronisation a échoué en raison d'un fichier source manqué. Veuillez vous assurer que tous les fichiers requis sont téléchargés et réessayez.", + "ORG_ZSTACK_STORAGE_BACKUP_10101": "la sauvegarde de base de données[uuid:%s] n'a pas été trouvée dans le dépôt de stockage[uuid:%s]", + "ORG_ZSTACK_LOGIN_PLUGIN_10002": "Informations de connexion utilisateur manquantes lors de l'utilisation de la fonctionnalité de connexion par plugin", + "ORG_ZSTACK_LOGIN_PLUGIN_10001": "aucun plugin de connexion nommé %s trouvé", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10005": "le mini stockage [UUID: %s, name: %s] ne peut trouver aucun hôte disponible dans les clusters joints pour instancier le volume", + "ORG_ZSTACK_LOGIN_PLUGIN_10000": "loginPluginName est manquant. Veuillez fournir un nom de plugin valide pour l'authentification de connexion.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10007": "Impossible de déterminer quelle instance de calcul affecter à la demande. Veuillez vous assurer que vos instances sont correctement enregistrées et étiquetées dans l'environnement cloud. Si le problème persiste, contactez le support pour une aide supplémentaire.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10002": "l'hôte[uuid:%s] n'est pas connecté à l'environnement cloud", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10014": "impossible d'ajouter un privilège administratif au projet", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10006": "un nœud baremetal2 avec l'IP de gestion %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10001": "Un volume mis en cache existe toujours sur l'instance [UUID:%s] impossible de mettre à jour l'URL du volume de cache", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10015": "l'opération n'est pas permise par la liste blanche de machines virtuelles [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10007": "Un hôte avec l'IP de gestion %s a rencontré un problème.", + "ORG_ZSTACK_KVM_10110": "L'hôte [IP:%s] a été repris en raison de l'existence de son identifiant unique [HostUuid:%s] dans la base de données.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10004": "ResourceType [%s] de APIRecoverResourceSplitBrainMsg est invalide pour la récupération de ressource cloud.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10016": "l'opération est refusée par la liste noire de machines virtuelles [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10008": "impossible d'attacher la passerelle BareMetal2 [uuid:%s] à un cluster non-BareMetal2 [uuid:%s]", + "ORG_ZSTACK_KVM_10111": "impossible de déterminer l'architecture CPU de l'hôte; veuillez vérifier le nom d'utilisateur et le mot de passe; %s", + "ORG_ZSTACK_STORAGE_BACKUP_10109": "'retentionType' manquant dans la configuration des paramètres du travail", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10009": "la passerelle baremetal2 avec l'UUID: %s est déjà attachée au cluster avec l'UUID: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10002": "Il existe déjà un serveur PXE baremetal avec l'IP de gestion %s; ne l'utilisez pas pour créer une passerelle Baremetal2.", + "ORG_ZSTACK_KVM_10103": "unable to connect to KVM[ip:%s, username:%s, sshPort: %d] to perform DNS validation; please verify the correctness of the username and password. (traduction: impossible de se connecter à KVM[ip:%s, username:%s, sshPort: %d] pour effectuer la validation DNS; veuillez vérifier la correction du nom d'utilisateur et du mot de passe.)", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10004": "l'IP de gestion[%s] n'est pas une adresse IPv4 ou un nom d'hôte valide", + "ORG_ZSTACK_KVM_10104": "failed to ping all DNS/IP addresses in %s; please verify network connectivity and DNS settings in /etc/resolv.conf to ensure your instance can access the public internet. (traduction: échec du ping de toutes les adresses DNS/IP dans %s; veuillez vérifier la connectivité réseau et les paramètres DNS dans /etc/resolv.conf pour vous assurer que votre instance peut accéder à Internet public.)", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10010": "Aucune machine virtuelle connectée trouvée, l'opération de mini stockage a échoué", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10005": "impossible d'ajouter une passerelle BareMetal2 dans un cluster non-BareMetal2[uuid:%s]", + "ORG_ZSTACK_KVM_10105": "unable to connect to KVM[ip:%s, username:%s, SSH port:%d] to verify management node accessibility; please check if the credentials are correct; %s (traduction: impossible de se connecter à KVM[ip:%s, username:%s, SSH port:%d] pour vérifier l'accessibilité du nœud de gestion; veuillez vérifier si les identifiants sont corrects; %s)", + "ORG_ZSTACK_VPC_HA_VPCHAGC_10000": "l'instance VR[uuid: %s] n'est pas en cours d'exécution", + "ORG_ZSTACK_KVM_10106": "the KVM host [ip:%s] cannot access the management node's callback URL. It appears that the KVM host is unable to reach the management IP [%s]. %s %s (traduction: l'hôte KVM [ip:%s] ne peut pas accéder à l'URL de rappel du nœud de gestion. Il semble que l'hôte KVM ne peut pas atteindre l'IP de gestion [%s]. %s %s)", + "ORG_ZSTACK_VPC_HA_VPCHAGC_10001": "l'instance VR[uuid: %s] n'est pas connectée", + "ORG_ZSTACK_KVM_10107": "unable to verify if the host is接管, because %s (traduction: impossible de vérifier si l'hôte est接管, car %s)", + "ORG_ZSTACK_KVM_10108": "Unable to retrieve the timestamp of the flag because %s (traduction: Impossible de récupérer l'horodatage du flag car %s)", + "ORG_ZSTACK_KVM_10109": "L'hôte [IP:%s] a été repris, car l'indicateur de reprise [HostUuid:%s] existe déjà et l'heure de mise à jour [utime %d] n'a pas dépassé l'intervalle de ping de l'hôte [ping interval %d].", + "ORG_ZSTACK_STORAGE_BACKUP_10100": "", + "ORG_ZSTACK_AUTOSCALING_GROUP_10009": "L'un des stockages de sauvegarde [UUIDs: %s, %s] est dans l'état %s et ne peut donc pas effectuer une opération de synchronisation.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10008": "", + "ORG_ZSTACK_AUTOSCALING_GROUP_10007": "L'offre d'instance [UUID:%s] est désactivée ; impossible de créer une VM à partir de celle-ci", + "ORG_ZSTACK_AUTOSCALING_GROUP_10006": "", + "ORG_ZSTACK_AUTOSCALING_GROUP_10005": "Une ressource est introuvable : InstanceOfferingVO avec UUID [%s] non disponible.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10004": "", + "ORG_ZSTACK_AUTOSCALING_GROUP_10003": "Une ressource est introuvable : AutoScalingVmTemplateVO avec UUID [%s] non disponible.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10002": "", + "ORG_ZSTACK_AUTOSCALING_GROUP_10000": "autoScalingGroup[%s] a échoué à ajouter complètement la nouvelle VM au groupe de sécurité, les erreurs sont %s", + "ORG_ZSTACK_KVM_10120": "", + "ORG_ZSTACK_KVM_10121": "L'ajout du NIC de VM au groupe de sécurité a échoué, aucun groupe de sécurité avec UUID=%s n'a été trouvé.", + "ORG_ZSTACK_KVM_10112": "", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10000": "autoScalingGroup[%s] a échoué à ajouter complètement la nouvelle VM au loadBalancer, les erreurs sont %s", + "ORG_ZSTACK_KVM_10115": "", + "ORG_ZSTACK_KVM_10117": "L'ajout du NIC de VM au load balancer a échoué, aucun load balancer avec UUIDs=%s n'a été trouvé.", + "ORG_ZSTACK_KVM_10119": "", + "ORG_ZSTACK_AUTOSCALING_GROUP_10019": "La création de la VM de autoScalingGroup[%s] a complètement échoué, les erreurs sont %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10018": "", + "ORG_ZSTACK_AUTOSCALING_GROUP_10017": "Une seule activité de mise à l'échelle peut être exécutée simultanément au sein du même groupe de mise à l'échelle.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10016": "", + "ORG_ZSTACK_AUTOSCALING_GROUP_10015": "L'un des stockages de sauvegarde [UUIDs: %s, %s] est dans l'état %s et ne peut donc pas effectuer une opération de synchronisation.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10014": "", + "ORG_ZSTACK_AUTOSCALING_GROUP_10013": "La configuration de host[uuid:%s] a changé, ancienne : %s, nouvelle : %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10012": "", + "ORG_ZSTACK_AUTOSCALING_GROUP_10011": "host[uuid:%s] entre dans l'état powered-off, envoi d'une notification", + "ORG_ZSTACK_AUTOSCALING_GROUP_10010": "", + "ORG_ZSTACK_KVM_10130": "L'architecture CPU de l'hôte ne correspond pas à la configuration du cluster", + "ORG_ZSTACK_KVM_10131": "", + "ORG_ZSTACK_KVM_10132": "vm[%s] n'a pas pu libérer l'espace disque, à cause de :%s", + "ORG_ZSTACK_KVM_10123": "host[%s] ne s'est pas arrêté dans les %d secondes", + "ORG_ZSTACK_KVM_10125": "échec de la vérification du fichier %s sur host[UUID:%s]", + "ORG_ZSTACK_KVM_10126": "L'hôte est en état de pré-maintenance et son système d'exploitation ne peut pas être mis à jour pour le moment. Veuillez terminer les opérations de maintenance ou contacter le support pour obtenir de l'aide.", + "ORG_ZSTACK_KVM_10127": "L'hôte n'est pas dans un état connecté ; par conséquent, les opérations de mise à jour du système d'exploitation ne peuvent pas être effectuées. Veuillez vous assurer que l'hôte est connecté avant de tenter de mettre à jour le système d'exploitation.", + "ORG_ZSTACK_COMPUTE_BONDING_10022": "l'un des UUID ou noms d'esclave est requis", + "ORG_ZSTACK_COMPUTE_BONDING_10021": "Aucune interface n'existe sur l'hôte avec l'UUID : %s", + "ORG_ZSTACK_VMWARE_10069": "ID d'instance [%s] non trouvé", + "ORG_ZSTACK_COMPUTE_BONDING_10020": "l'interface %s n'existe pas sur les hôtes", + "ORG_ZSTACK_VMWARE_10067": "vm [%s] non trouvé", + "ORG_ZSTACK_COMPUTE_BONDING_10026": "Impossible de supprimer l'interface de bonding associée au réseau de gestion. Veuillez vous assurer que le réseau de gestion n'est pas en cours d'utilisation avant de procéder.", + "ORG_ZSTACK_VMWARE_10064": "Instance de VM non trouvée : %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10029": "Besoin de sauter l'ajustement de l'activité du groupe de mise à l'échelle automatique", + "ORG_ZSTACK_COMPUTE_BONDING_10025": "mode de bonding invalide[%s]", + "ORG_ZSTACK_VMWARE_10065": "échec de l'arrêt de la machine virtuelle : %s, %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10028": "Impossible de récupérer la liste des instances supprimées depuis le service de calcul cloud", + "ORG_ZSTACK_VMWARE_10062": "échec de la reprise de VM, état de la tâche : %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10027": "Le nombre d'instances lancées dépasse la limite autorisée.%s", + "ORG_ZSTACK_COMPUTE_BONDING_10023": "Impossible d'ajouter l'interface SR-IOV [%s] au Bonding car plus d'un SR-IOV Dev est sélectionné", + "ORG_ZSTACK_VMWARE_10063": "échec de la reprise de la machine virtuelle [%s] : %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10026": "autoScalingGroup[%s] n'a pas pu terminer complètement les VMs[%s], les erreurs sont %s", + "ORG_ZSTACK_VMWARE_10060": "échec de la suspension de la VM [%s] : %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10025": "L'autoScalingGroup[%s] n'est attaché à aucun modèle de VM", + "ORG_ZSTACK_COMPUTE_BONDING_10029": "impossible d'ajouter de nouvelles interfaces au bond[%s] car il contient déjà une interface SR-IOV", + "ORG_ZSTACK_AUTOSCALING_GROUP_10024": "le groupe de mise à l'échelle automatique[%s] est dans un état inattendu, attendu : état %s", + "ORG_ZSTACK_COMPUTE_BONDING_10028": "impossible d'attacher des interfaces de manière répétée à un bond[%s].", + "ORG_ZSTACK_AUTOSCALING_GROUP_10023": "defaultL3NetworkUuid[uuid:%s] n'existe pas dans l3NetworkUuids %s", + "ORG_ZSTACK_SNS_PLATFORM_DINGTALK_10000": "échec de l'envoi de messages à DingTalk. statut : %s, corps : %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10022": "Plus d'un réseau de couche 3 est spécifié dans l3NetworkUuids, mais defaultL3NetworkUuid est null", + "ORG_ZSTACK_KVM_10140": "échec de la création du pont[%s] pour l2Network[uuid:%s, type:%s, vlan:%s] sur l'hôte KVM[uuid:%s], car %s", + "ORG_ZSTACK_COMPUTE_BONDING_10027": "Impossible de supprimer l'interface de bonding configurée avec l'adresse IP VTEP. Veuillez d'abord vous assurer que tous les réseaux virtuels associés sont désassociés.", + "ORG_ZSTACK_KVM_10141": "échec de la vérification du bridge[%s] pour l2VlanNetwork[uuid:%s, name:%s] sur l'hôte KVM[uuid:%s], %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10021": "l3Network[uuid:%s] est un réseau système et ne peut pas être utilisé pour créer des machines virtuelles utilisateur.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10020": "l3Network avec UUID:%s est Désactivé ; par conséquent, la création de machines virtuelles sur ce réseau n'est pas autorisée.", + "ORG_ZSTACK_KVM_10143": "échec de la suppression du bridge[%s] pour l2Network[uuid:%s, type:%s, vlan:%s] sur l'hôte KVM[uuid:%s], car %s", + "ORG_ZSTACK_KVM_10144": "Échec du démarrage de la machine virtuelle car la fonctionnalité de l'hyperviseur ne peut pas être désactivée avec le mode CPU défini sur none. Veuillez vérifier vos paramètres de configuration du CPU.", + "ORG_ZSTACK_KVM_10134": "le hook XML[%s] a été associé à la machine virtuelle %s, veuillez donc le dissocier avant de le supprimer", + "ORG_ZSTACK_KVM_10136": "Les hooks XML de type Système ne sont pas autorisés dans les environnements d'informatique en nuage. Veuillez vous assurer que toutes les configurations au niveau du système sont conformes aux normes de virtualisation.", + "ORG_ZSTACK_KVM_10137": "Le nom du hook XML [%s] existe déjà dans la configuration de la machine virtuelle.", + "ORG_ZSTACK_KVM_10138": "il y a eu un hôte KVM avec l'adresse IP de gestion[%s]", + "ORG_ZSTACK_KVM_10139": "impossible de créer le périphérique VLAN sur %s car le nom est trop long", + "ORG_ZSTACK_VMWARE_10059": "échec de la suspension de la machine virtuelle, statut de la tâche : %s", + "ORG_ZSTACK_COMPUTE_BONDING_10033": "Le réseau L2 [uuid:%s] n'existe pas", + "ORG_ZSTACK_BILLING_10008": "La date de début doit être antérieure à la date de fin.", + "ORG_ZSTACK_COMPUTE_BONDING_10032": "impossible de détacher les interfaces de manière répétée d'un bond[%s].", + "ORG_ZSTACK_COMPUTE_BONDING_10031": "impossible de détacher l'interface[%s] d'un bond[%s] qui est dans un état lié.", + "ORG_ZSTACK_COMPUTE_BONDING_10030": "Impossible d'ajouter l'interface SR-IOV [%s] au Bonding car seule une interface dans un bond peut activer SR-IOV.", + "ORG_ZSTACK_BILLING_10005": "La facturation est désactivée pour cette ressource. Veuillez vous assurer que la facturation est activée pour utiliser ce service.", + "ORG_ZSTACK_COMPUTE_BONDING_10037": "Impossible de rattacher le réseau L2 au cluster [UUID : %s]. L'interface [UUID : %s, name : %s] sur l'hôte [UUID : %s] est associée à des types de services mais n'inclut pas TenantNetwork comme l'un d'entre eux.", + "ORG_ZSTACK_BILLING_10004": "type de ressource de facturation non pris en charge [%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10036": "Impossible de rattacher le réseau L2 au cluster [UUID]. L'interface de bonding [UUID, name] sur l'hôte [UUID] a des associations de type de service de bonding mais manque le type de service TenantNetwork.", + "ORG_ZSTACK_BILLING_10003": "Veuillez vous assurer que la configuration de prix correcte est définie pour l'utilisateur, par exemple : `priceUserConfig:{\\nvolume:{\\npriceKeyName:\"priceKeyName\"}}`", + "ORG_ZSTACK_COMPUTE_BONDING_10035": "Impossible de rattacher le réseau L2 au cluster [uuid:%s] : l'interface physique [%s] est utilisée dans un bond sur un ou plusieurs hôtes. Hôtes en conflit : [%s]", + "ORG_ZSTACK_VMWARE_10051": "vmUuid [%s] introuvable dans le système hôte ESX [%s]", + "ORG_ZSTACK_BILLING_10002": "Veuillez vous assurer que la configuration de prix correcte pour l'utilisateur est définie, par exemple : `priceUserConfig:{rootVolume:{priceKeyName:\"priceKeyName\"}}`", + "ORG_ZSTACK_COMPUTE_BONDING_10034": "Le réseau L2 [uuid:%s] a une définition d'interface physique vide", + "ORG_ZSTACK_BILLING_10001": "dateInLong est inférieur à %s millisecondes", + "ORG_ZSTACK_BILLING_10000": "priceKeyName est null. Veuillez vous assurer que le nom de clé pour la tarification est correctement configuré.", + "ORG_ZSTACK_VMWARE_10050": "Synchronisation avec vCenter[uuid:%s], veuillez réessayer plus tard.", + "ORG_ZSTACK_KVM_10150": "impossible de récupérer vmUuid à partir du message %s", + "ORG_ZSTACK_KVM_10151": "incapable de synchroniser la machine virtuelle sur l'hôte[uuid:%s, ip:%s] en raison de %s", + "ORG_ZSTACK_COMPUTE_BONDING_10038": "échec de l'ajout du bonding Linux à l'hôte[uuid:%s] : %s", + "ORG_ZSTACK_KVM_10152": "La VM[%s] est dans un état d'arrêt prolongé ; veuillez vérifier son état.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10032": "Type de politique de suppression[%s] non supporté", + "ORG_ZSTACK_V2V_VMWARE_10015": "Aucune IP disponible trouvée dans le CIDR %s sur l'hôte %s ; veuillez reconnecter l'hôte pour rafraîchir les IPs.", + "ORG_ZSTACK_KVM_10154": "échec de la mise à jour du pont[%s] pour le réseau l2[uuid:%s, name:%s] sur l'hôte KVM[uuid:%s], %s", + "ORG_ZSTACK_V2V_VMWARE_10016": "Il existe déjà un travail en cours[uuid:%s] convertissant la VM depuis %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10030": "deleteAutoScalingRule[%s] a déclenché des échecs, les erreurs sont %s", + "ORG_ZSTACK_V2V_VMWARE_10017": "Échec de la mise à jour de la dépendance de l'hôte de conversion pour la machine virtuelle %s", + "ORG_ZSTACK_KVM_10146": "échec de l'application des règles du groupe de sécurité à l'hôte KVM[uuid:%s], car %s", + "ORG_ZSTACK_KVM_10147": "échec de la vérification des règles par défaut du groupe de sécurité sur l'hôte KVM[uuid:%s], car %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10101": "impossible d'attribuer un port de redirection ou un code d'état sans spécifier une URL de redirection HTTP", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10009": "échec de la détection du battement de cœur, code : %s, détail : %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10104": "l'écouteur du loadBalancer[%s] ne prend pas en charge la modification de l'état de persistance de session", + "ORG_ZSTACK_IAM2SCRIPT_10010": "L'exécuteur de script spécifié n'est pas pris en charge dans cet environnement d'informatique en nuage. Veuillez consulter la liste des exécuteurs pris en charge pour plus d'informations.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10105": "impossible de supporter simultanément la redirection HTTP vers HTTPS et la persistance de session dans un environnement cloud", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10102": "impossible de supporter des protocoles autres que HTTP lors de la spécification d'une redirection HTTP vers HTTPS", + "ORG_ZSTACK_VMWARE_10048": "L'hôte n'est pas connecté à l'environnement cloud. Veuillez vous assurer que l'hôte est correctement configuré et autorisé.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10108": "l'écouteur[%s] modifie la persistance de session ; il doit spécifier l'algorithme d'équilibrage de charge", + "ORG_ZSTACK_V2V_VMWARE_10007": "Échec de l'analyse de l'URL %s", + "ORG_ZSTACK_COMPUTE_BONDING_10044": "échec de l'attachement du nic au bonding Linux sur l'hôte[uuid:%s] : %s", + "ORG_ZSTACK_VMWARE_10046": "Impossible de détacher la NIC car la carte d'interface réseau (NIC) n'est pas prise en charge pour les opérations hotplug dans vCenter.", + "ORG_ZSTACK_BILLING_10019": "le prix du GPU doit être lié à l'UUID du GPU %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10109": "l'écouteur[%s] %s l'algorithme d'équilibrage de charge ne prend pas en charge la modification de la persistance de session sauf en assignant explicitement iphash", + "ORG_ZSTACK_V2V_VMWARE_10008": "le nom du dataCenter ne peut pas contenir de caractères spéciaux %s", + "ORG_ZSTACK_IAM2SCRIPT_10002": "Le contenu du script est vide. Veuillez vous assurer que votre extrait de code Java est correctement défini et inclus dans le fichier source.", + "ORG_ZSTACK_BILLING_10018": "Le prix du GPU doit être lié à un UUID GPU valide. Veuillez fournir un UUID non vide.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10106": "l'écouteur[%s] ne peut pas modifier la réécriture de la persistance de session lorsque le mode HTTP est défini sur http-tunnel", + "ORG_ZSTACK_V2V_VMWARE_10009": "Le nom de la VM cible ne peut pas contenir de caractères spéciaux %s", + "ORG_ZSTACK_IAM2SCRIPT_10001": "Échec du décodage du contenu du script. Veuillez vous assurer que le fichier source est disponible et correctement formaté pour les environnements d'informatique en nuage.", + "ORG_ZSTACK_COMPUTE_BONDING_10042": "Échec de la suppression du bond Linux de l'hôte[uuid:%s] : %s", + "ORG_ZSTACK_VMWARE_10044": "Le processeur hôte et le système d'exploitation invité ne sont pas compatibles. Veuillez vous assurer que votre processeur hôte prend en charge les technologies de virtualisation requises ou mettez à jour le système d'exploitation invité vers une version compatible.", + "ORG_ZSTACK_BILLING_10017": "Le prix doit être compris entre 0 et 999999999.99", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10107": "listener[%s] modifie la persistance de session en IP hash ; il doit spécifier un algorithme d'équilibrage de source", + "ORG_ZSTACK_VMWARE_10045": "La vérification de la compatibilité avec la machine virtuelle %s a échoué sur l'hôte %s", + "ORG_ZSTACK_BILLING_10016": "L'unité de ressource minimale pour l'allocation est le mégaoctet, pas l'octet.", + "ORG_ZSTACK_SDNCONTROLLER_10008": "Le réseau SDN L2 [UUID:%s] n'est pas connecté à un contrôleur", + "ORG_ZSTACK_IAM2SCRIPT_10007": "La fonction de script IAM2 n'est pas activée. Veuillez vous assurer que le service IAM2 est activé dans votre environnement cloud.", + "ORG_ZSTACK_BILLING_10015": "resourceName[%s] est un identifiant invalide dans les contextes de l'informatique en nuage", + "ORG_ZSTACK_IAM2SCRIPT_10005": "Impossible de récupérer le résultat de l'exécution du script. Veuillez vérifier les paramètres de l'instance cloud et du réseau.", + "ORG_ZSTACK_COMPUTE_BONDING_10046": "Échec du détachement de la carte réseau du bond Linux sur l'hôte[uuid:%s] : %s", + "ORG_ZSTACK_VMWARE_10040": "UUID de l'hôte de destination manquant. Veuillez vous assurer que l'UUID de l'hôte cible est correctement spécifié.", + "ORG_ZSTACK_IAM2SCRIPT_10004": "Échec de l'exécution du script iam2. Veuillez vérifier que l'environnement d'informatique en nuage requis est correctement configuré.", + "ORG_ZSTACK_VMWARE_10041": "L'hôte cible ne prend pas en charge la gestion des machines virtuelles. Veuillez vous assurer que l'hôte de destination est un hôte ESX ou vSphere.", + "ORG_ZSTACK_KVM_10161": "Numéro de port VNC inattendu[%d] pour la machine virtuelle [uuid:%s]", + "ORG_ZSTACK_IAM2SCRIPT_10009": "Le nombre de paramètres dépasse la limite autorisée.", + "ORG_ZSTACK_IAM2SCRIPT_10008": "Le script ne contient aucun code. Veuillez vous assurer que votre entrée inclut du code Java valide.", + "ORG_ZSTACK_SDNCONTROLLER_10000": "Impossible de créer le réseau SDN L2 en raison de l'absence d'UUID du contrôleur SDN dans les systemTags de la requête API. Veuillez vous assurer que l'UUID du contrôleur SDN est correctement spécifié.", + "ORG_ZSTACK_V2V_VMWARE_10003": "Le nom du cluster ne peut pas contenir les caractères suivants : %s", + "ORG_ZSTACK_SDNCONTROLLER_10002": "impossible de trouver le contrôleur SDN pour le réseau de couche 2[uuid:%s, vswitchType:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10001": "Impossible de créer le réseau SDN L2 car l'UUID du contrôleur SDN est absent de la requête API. Veuillez vous assurer que l'UUID est inclus.", + "ORG_ZSTACK_V2V_VMWARE_10006": "Échec de l'arrêt de l'instance de machine virtuelle %s avant la migration v2v", + "ORG_ZSTACK_KVM_10157": "reply[%s] n'est pas un KVMHostAsyncHttpCallResponse", + "ORG_ZSTACK_KVM_10158": "reply[%s] retourne avec un corps de réponse vide", + "ORG_ZSTACK_KVM_10159": "L'opération %s a échoué : %s", + "ORG_ZSTACK_HYBRID_NETWORK_10040": "EcsInstance doit être dans un état en cours d'exécution ou arrêté lors de la suppression d'une EIP.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10111": "listener[%s] ne prend pas en charge la modification du délai d'inactivité et du nom de cookie ; la persistance de session doit être spécifiée.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10112": "listener[%s] ne prend pas en charge la modification du délai d'inactivité lorsque la persistance de session est désactivée", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10110": "listener[%s] %s l'algorithme d'équilibrage de charge ne prend pas en charge la modification de la persistance de session sauf en attribuant explicitement disable.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10115": "délai d'inactivité de session invalide[%s], il doit être un entier positif entre[%s~%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10040": "Échec de la mise à jour du Linux bonding sur l'hôte[uuid:%s] : %s", + "ORG_ZSTACK_VMWARE_10039": "UUID de l'hôte manquant dans la demande de métadonnées", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10116": "Le protocole de vérification de santé HTTP doit être spécifié pour son paramètre de vérification de santé %s.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10113": "listener[%s] ne prend pas en charge la modification du nom du cookie lorsque la persistance de session n'est pas définie sur rewrite.", + "ORG_ZSTACK_VMWARE_10037": "Aucun commutateur virtuel distribué ou commutateur virtuel qualifié trouvé", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10114": "listener[%s] ne prend pas en charge la modification de la réécriture d'URL basée sur la session sans modifier le nom du cookie", + "ORG_ZSTACK_VMWARE_10038": "Datastore %s non trouvé pour vCenter %s", + "ORG_ZSTACK_BILLING_10009": "resourceType et resourceUUID ne peuvent pas être vides simultanément", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10119": "Cible de vérification de santé[%s] invalide, le format doit être checkProtocol:port, par exemple, tcp:default", + "ORG_ZSTACK_SDNCONTROLLER_10015": "Impossible d'ajouter le contrôleur SDN car le type %s n'est pas dans la liste des types pris en charge : %s", + "ORG_ZSTACK_SDNCONTROLLER_10014": "Impossible d'ajouter la règle du groupe de sécurité car l'UUID du contrôleur distant du groupe de sécurité [:%s] ne correspond pas à l'UUID du contrôleur local du groupe de sécurité [:%s]", + "ORG_ZSTACK_VMWARE_10036": "Aucune ressource de calcul disponible pour les opérations de clustering.%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10117": "Le code de statut attendu du protocole de vérification de santé HTTP [%s] est invalide", + "ORG_ZSTACK_SDNCONTROLLER_10017": "Impossible d'ajouter le contrôleur SDN car le contrôleur [IP:%s] est déjà enregistré", + "ORG_ZSTACK_VMWARE_10033": "Échec de la négociation SSL avec vCenter [%s] car le protocole TLS 1.0 non sécurisé est utilisé. Activez manuellement TLS 1.0 dans la configuration JDK si nécessaire.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10118": "Le listener avec le protocole [%s] ne prend pas en charge la sélection d'une politique de sécurité", + "ORG_ZSTACK_SDNCONTROLLER_10016": "Impossible d'ajouter le contrôleur SDN car ip[%s] n'est pas une adresse monodiffusion valide", + "ORG_ZSTACK_VMWARE_10034": "Échec de la négociation SSL avec vCenter [%s], veuillez vérifier le numéro de port [%d].", + "ORG_ZSTACK_BILLING_10027": "La facturation est activée. Cette opération est uniquement autorisée lorsque la facturation est désactivée.", + "ORG_ZSTACK_SDNCONTROLLER_10019": "Impossible d'ajouter l'hôte [UUID:%s] au contrôleur SDN [UUID:%s], car le masque de sous-réseau n'est pas spécifié", + "ORG_ZSTACK_VMWARE_10031": "Échec de connexion au serveur vCenter [%s] avec les identifiants utilisateur. Veuillez vérifier votre connexion réseau et les identifiants fournis.", + "ORG_ZSTACK_BILLING_10026": "La date de fin ne peut pas être antérieure à la date de début", + "ORG_ZSTACK_SDNCONTROLLER_10018": "Impossible d'ajouter l'hôte[uuid:%s] au contrôleur SDN[uuid:%s], car il est déjà attaché à un autre contrôleur SDN", + "ORG_ZSTACK_VMWARE_10032": "Échec de l'analyse de la réponse de vCenter [%s], veuillez vérifier le numéro de port [%d].", + "ORG_ZSTACK_BILLING_10025": "endDateInLong est défini, aucune modification n'est autorisée dans les environnements cloud pour assurer la cohérence des données et la conformité aux normes de virtualisation.", + "ORG_ZSTACK_BILLING_10024": "endDateInLong et setEndDateInLongBaseOnCurrentTime ne doivent pas être configurés simultanément. Veuillez en choisir un pour vos paramètres.", + "ORG_ZSTACK_VMWARE_10030": "Échec de la connexion à la ressource cloud : %s", + "ORG_ZSTACK_BILLING_10023": "endDateInLong n'est pas autorisé à avoir une valeur négative", + "ORG_ZSTACK_BILLING_10022": "accountUuid et tableUuid sont mutuellement exclusifs ; un seul d'entre eux peut être défini.", + "ORG_ZSTACK_BILLING_10021": "Ce priceTable[uuid=%s] n'est pas autorisé à être supprimé dans cet environnement cloud.", + "ORG_ZSTACK_BILLING_10020": "Le compte [uuid=%s] a attaché un tableau de tarification", + "ORG_ZSTACK_LONGJOB_10007": "Impossible d'annuler un travail de longue durée qui a déjà réussi", + "ORG_ZSTACK_SDNCONTROLLER_10011": "L'opération Pull tenant n'est prise en charge que pour les contrôleurs H3C VCFC V2X", + "ORG_ZSTACK_LONGJOB_10008": "Impossible d'annuler un travail de longue durée qui a échoué", + "ORG_ZSTACK_LONGJOB_10009": "Supprimer les travaux de longue durée uniquement lorsqu'ils ont réussi, ont été annulés ou ont échoué.", + "ORG_ZSTACK_SDNCONTROLLER_10013": "Impossible d'ajouter vmnic au groupe de sécurité car ils ont un contrôleur SDN différent [NIC controller UUID: %s, Security Group controller UUID: %s]", + "ORG_ZSTACK_SDNCONTROLLER_10012": "Échec de la récupération des données du tenant : %s", + "ORG_ZSTACK_LONGJOB_10010": "Ne réexécuter un longjob que lorsqu'il a réussi, a été annulé ou a échoué", + "ORG_ZSTACK_LONGJOB_10011": "Impossible de reprendre un longjob qui n'est pas à l'état Suspended", + "ORG_ZSTACK_LONGJOB_10012": "%s n'a pas de tâche de longue durée correspondante", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10122": "Le cloud ne peut pas modifier l'écouteur de l'équilibreur de charge car l'écouteur avec le protocole [%s] ne prend pas en charge la sélection de la version HTTP [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10123": "Le cloud ne peut pas modifier l'écouteur de l'équilibreur de charge car le protocole HTTPS ne prend en charge que la version HTTP : [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10120": "L'écouteur avec le protocole [%s] n'est pas compatible avec ce contrôle de santé :[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10121": "Le protocole de contrôle de santé HTTP doit être spécifié. Veuillez inclure ses paramètres de vérification de santé, tels que healthCheckMethod et healthCheckURI.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10126": "Le cloud ne prend pas en charge la modification de l'écouteur de l'équilibreur de charge car l'écouteur avec le protocole [%s] ne prend pas en charge la compression du contenu", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10127": "Le cloud ne peut pas modifier l'écouteur de l'équilibreur de charge car il ne prend en charge que les algorithmes de compression [%s]", + "ORG_ZSTACK_VMWARE_10029": "Échec de la connexion. Veuillez vérifier vos informations d'identification et vous assurer que vous utilisez les paramètres de connexion corrects pour les services d'informatique en nuage.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10124": "Le cloud ne peut pas modifier l'écouteur de l'équilibreur de charge car un écouteur avec protocole TCP ne prend en charge que le proxy TCP pour les paramètres.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10125": "Le cloud ne peut pas modifier l'écouteur de l'équilibreur de charge car il ne prend en charge que le protocole proxy TCP %s", + "ORG_ZSTACK_VMWARE_10027": "VCenter[uuid:%s] non trouvé : L'environnement de virtualisation avec l'UUID spécifié n'existe pas.", + "ORG_ZSTACK_TAG_10004": "Aucune balise système ne correspond[%s] pour le type de ressource[%s]", + "ORG_ZSTACK_SDNCONTROLLER_10026": "L'opération Pull tenant n'est pas prise en charge pour le contrôleur SDN [uuid:%s, vendorType:%s, vendorVersion:%s]. Seuls les contrôleurs H3C VCFC V2 prennent en charge cette opération.", + "ORG_ZSTACK_LOG_10007": "Type de configuration de journal inconnu %s", + "ORG_ZSTACK_SDNCONTROLLER_10025": "Contrôleur SDN [UUID:%s] non trouvé", + "ORG_ZSTACK_TAG_10005": "La validation de la balise système [%s] pour le type de ressource[%s] a échoué", + "ORG_ZSTACK_LOG_10006": "Type de configuration inconnu pour le serveur de journal %s", + "ORG_ZSTACK_SDNCONTROLLER_10028": "Impossible de modifier le contrôleur SDN car la plage VLAN[%s] n'est pas au format correct", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10128": "Version IP invalide[%s], elle doit être IPv4 ou IPv6", + "ORG_ZSTACK_LOG_10005": "Le compte [uuid:%s] n'est pas autorisé à ajouter des serveurs de journal supplémentaires. Seuls les comptes administrateur possèdent ce privilège.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10129": "Impossible de supprimer le groupe de serveurs par défaut[uuid=%s]", + "ORG_ZSTACK_LOG_10004": "Accès refusé : Le compte [uuid:%s] n'est pas autorisé à récupérer les journaux du nœud de gestion. Seul les comptes administratifs possèdent ce privilège.", + "ORG_ZSTACK_TAG_10008": "balise [%s] est uniquement destinée à un usage administratif", + "ORG_ZSTACK_LOG_10003": "Le compte [UUID:%s] n'est pas autorisé à effectuer des opérations sur le serveur de journaux [UUID:%s].", + "ORG_ZSTACK_SDNCONTROLLER_10029": "Impossible de modifier le contrôleur SDN car la plage VLAN [%s] chevauche une autre plage VLAN", + "ORG_ZSTACK_LOG_10002": "Aucune factory trouvée pour le type:%s", + "ORG_ZSTACK_TAG_10006": "Aucune balise système correspondante trouvée pour %s", + "ORG_ZSTACK_SDNCONTROLLER_10020": "Impossible d'ajouter l'hôte [UUID:%s] au contrôleur SDN [UUID:%s], car l'IP vTEP est utilisée par l'hôte [UUID:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10022": "Impossible de mettre à jour l'hôte [uuid:%s] du contrôleur SDN [uuid:%s], car l'hôte n'a pas été ajouté au contrôleur SDN", + "ORG_ZSTACK_TAG_10000": "Balise en double [balise :%s, Type :%s, Type_ressource :%s, Ressource_Uuid :%s]", + "ORG_ZSTACK_SDNCONTROLLER_10021": "Impossible de désenregistrer l'hôte [uuid:%s] du contrôleur SDN [uuid:%s], car l'hôte n'a pas été enregistré auprès du contrôleur SDN", + "ORG_ZSTACK_SDNCONTROLLER_10024": "Impossible de joindre le réseau L3 à la machine virtuelle car certains locataires du contrôleur SDN [uuid:%s] ont été supprimés. Veuillez d'abord exécuter la synchronisation des locataires pour mettre à jour leur état.", + "ORG_ZSTACK_SDNCONTROLLER_10023": "Impossible de mettre à jour l'hôte [uuid:%s] du contrôleur SDN [uuid:%s], car un masque de réseau a été spécifié", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10000": "Échec de la vérification de l'intégrité des données par lot, type de ressource non pris en charge : %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10002": "Échec de l'ajout de la ressource d'intégrité, type de ressource non pris en charge : %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10002": "Erreur de modèle : %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10134": "Impossible d'ajouter le VMNic du serveur backend au groupe de serveurs [UUID:%s], car le poids du VMNic [%s] n'est pas un nombre valide", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10008": "Échec de la récupération du cache d'image avec l'ID :%s : GetImageHashValueReply.hashValue est null", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10009": "Échec de la vérification de la cohérence du cache d'image [%s] en raison de problèmes d'environnement de machine virtuelle", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10000": "aucun modèle disponible de ce type : %s,", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10132": "Impossible d'ajouter le VMNIC du serveur backend avec l'UUID:%s au groupe de serveurs avec l'UUID:%s car le VMNIC n'existe pas", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10137": "Impossible d'ajouter le NIC du serveur backend au groupe de serveurs [uuid:%s], car l'IP du NIC [ipAddress:%s] est en double", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10003": "Le type de chiffrement de protection des données[start :%s] est invalide", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10138": "Impossible d'ajouter l'interface réseau de machine virtuelle [uuid:%s] au groupe de serveurs [uuid:%s] car l'écouteur [uuid:%s] a déjà attaché l'interface réseau de ce groupe de serveurs", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10004": "l'instantané [uuid:%s] n'est pas chiffré dans l'environnement virtualisé", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10135": "Les réseaux L3 avec les UUID :%s associés aux VM nics n'ont pas le service réseau :%s activé", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10005": "Échec de la vérification de la cohérence de l'instantané de volume [%s] en raison d'un état incohérent", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10136": "Les VM NICs [UUID: %s] sont déjà associées au groupe de serveurs d'équilibrage de charge [UUID: %s].", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10006": "erreur de chiffrement : %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10139": "Impossible d'ajouter l'IP du serveur backend au groupe de serveurs [UUID:%s], car l'IP [Adresse IP:%s] est déjà enregistrée", + "ORG_ZSTACK_VMWARE_10097": "VCENTER[%s] n'est pas en état de fonctionnement, état actuel : %s", + "ORG_ZSTACK_VMWARE_10098": "vdisk non trouvé : %s", + "ORG_ZSTACK_VMWARE_10095": "Échec de la récupération de la liste des tâches récentes, détails : %s", + "ORG_ZSTACK_VMWARE_10096": "VCENTER_SERVER_NOT_FOUND", + "ORG_ZSTACK_VMWARE_10093": "Le stockage de sauvegarde vCenter ne prend pas en charge le calcul des hachages d'image.", + "ORG_ZSTACK_VMWARE_10091": "La fonctionnalité pour %s n'est pas encore prise en charge dans les environnements cloud.", + "ORG_ZSTACK_TAG_10011": "tag[uuid:%s] est une balise système inhérente et ne peut pas être supprimée.", + "ORG_ZSTACK_TAG_10012": "L'argument 'resourceType' ne correspond pas à l'UUID attendu. Veuillez vous assurer que le type de ressource est correctement spécifié en tant qu'UUID.", + "ORG_ZSTACK_VMWARE_10090": "L'image %s est introuvable dans le stockage de sauvegarde. Veuillez vérifier que le chemin d'accès à l'image est correct et réessayer.", + "ORG_ZSTACK_TAG_10010": "aucun type de ressource trouvé dans le système de balises %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10010": "échec du cache d'image de chiffrement[id:%s] : %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10011": "nodeType %s fichier d'intégrité[path:%s] existe déjà dans l'environnement virtualisé", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10012": "type de nœud non valide[%s]", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10013": "échec de l'ajout du fichier d'intégrité[%s.%s], c'est maintenant un répertoire.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10141": "poids non valide[serverIp:%s, weight:%s], le poids n'est pas dans la plage valide [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10143": "Les adresses IP du serveur [uuid:%s] sont déjà associées au groupe de serveurs de l'équilibreur de charge [uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10148": "loadbalancerServerGroup [%s] n'existe pas", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10014": "fichier d'intégrité[%s.%s] n'existe pas", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10149": "VMNic ou adresse IP est null. Veuillez vérifier vos paramètres de configuration réseau.", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10015": "l'hôte %s n'existe pas", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10146": "tous les vmnics ne sont pas associés au groupe de serveurs [%s]", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10000": "stockage primaire externe[uuid:%s, name:%s] renvoie un statut non sain : %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10016": "L'exécution du shell a échoué car %s", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10001": "recherche des clients actifs pour le volume[uuid:%s, mountPath %s, client:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10147": "toutes les adresses IP du serveur ne sont pas associées au groupe de serveurs [%s]", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10017": "échec de l'ajout du fichier de vérification d'intégrité[%s.%s], car %s", + "ORG_ZSTACK_VMWARE_10088": "Le stockage de sauvegarde vCenter ne prend pas en charge l'annulation du téléchargement d'une image.", + "ORG_ZSTACK_VMWARE_10086": "la ressource %s est déjà provisionnée", + "ORG_ZSTACK_VMWARE_10085": "protocole inattendu : %s", + "ORG_ZSTACK_VMWARE_10082": "Aucune banque de données attachée à %s", + "ORG_ZSTACK_VMWARE_10083": "Banque de données non trouvée pour %s", + "ORG_ZSTACK_VMWARE_10080": "vCenter[uuid=%s] est désactivé. Vous pouvez uniquement effectuer des opérations en lecture seule sur ce vCenter. Pour effectuer des modifications de configuration, mettez à jour la configuration du vCenter à l'aide d'UpdateVCenterAction {uuid=%s state=Enabled}", + "ORG_ZSTACK_VMWARE_10081": "Les VCENTER[uuid=%s] sont désactivés. Vous pouvez uniquement effectuer des opérations en lecture seule sur ces VCENTER.", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10021": "échec du snapshot chiffré[uuid:%s] : %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10151": "impossible d'ajouter le groupe de serveurs avec UUID:%s à l'écouteur avec UUID:%s car l'interface réseau avec UUID:%s est déjà associée", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10152": "impossible d'ajouter l'instance de serveurs [uuid:%s] à l'écouteur [uuid:%s] car l'adresse IP du serveur est déjà enregistrée", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10150": "impossible d'ajouter le groupe de serveurs [uuid:%s] à l'écouteur [uuid:%s] car il a déjà été ajouté", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10155": "impossible d'ajouter le groupe de serveurs[uuid:%s] à l'écouteur [uuid:%s], car un écouteur UDP ne peut pas mapper des adresses backend IPv4 vers IPv6", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10156": "impossible de supprimer les groupes de serveurs [uuid:%s] de l'écouteur [uuid:%s] car la redirection HTTP vers HTTPS est activée", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10153": "impossible d'ajouter le groupe de serveurs[uuid:%s] à l'écouteur [uuid:%s], car un écouteur UDP ne peut pas avoir simultanément des adresses VIP IPv4 et IPv6", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10154": "impossible d'ajouter le groupe de serveurs[uuid:%s] à l'écouteur [uuid:%s], car l'écouteur UDP ne peut pas mapper des adresses backend IPv6 vers des adresses IPv4", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10159": "impossible de trouver l'équilibreur de charge associé au groupe de serveurs [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10157": "impossible de désenregistrer le groupe de serveurs [uuid:%s] de l'équilibreur de charge [uuid:%s] car il n'est pas enregistré", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10158": "loadBalancerUuid [%s] n'existe pas", + "ORG_ZSTACK_VMWARE_10078": "L'opération n'est pas prise en charge dans l'environnement de cloud computing actuel. Veuillez vous assurer que votre demande est conforme aux opérations prises en charge pour les ressources cloud.", + "ORG_ZSTACK_VMWARE_10076": "échec de la mise sous tension de la VM, statut de la tâche : %s", + "ORG_ZSTACK_VMWARE_10073": "VM [%s] non trouvée dans l'inventaire vCenter", + "ORG_ZSTACK_VMWARE_10071": "Échec de la recherche de la VM avec UUID=%s sur l'hôte ESX avec UUID=%s", + "ORG_ZSTACK_VMWARE_10072": "Échec de la mise à jour de la configuration ESX VM[uuid=%s]. Voir plus de détails dans le journal.", + "ORG_ZSTACK_VMWARE_10070": "Image [%s] non trouvée dans le registre ou le cache local", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10162": "impossible de modifier le VMNIC du serveur backend vers serverGroup[uuid:%s] car le poids VMNIC[%s] n'est pas un nombre valide", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10163": "poids d'équilibreur invalide[vimNic:%s], le poids ne peut pas être nul", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10160": "impossible de mettre à jour le VMNIC du serveur backend du groupe de serveurs car le groupe de serveurs [uuid=%s] n'a pas de VMNIC [uuid=%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10161": "poids d'équilibreur invalide[vimNic:%s], la valeur du poids est hors plage [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10166": "poids d'équilibreur invalide[serverIp:%s,weight:%s], le poids n'est pas dans la plage valide [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10167": "impossible d'ajouter l'adresse IP du serveur backend au groupe de serveurs [UUID:%s], car le poids VMNIC [%s] n'est pas un nombre valide", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10164": "impossible de mettre à jour le VMNIC du serveur backend du groupe de serveurs [UUID:%s], car l'UUID VMNIC est nul", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10165": "impossible de mettre à jour l'adresse IP du serveur backend du groupe de serveurs car le groupe de serveurs [uuid=%s] n'a pas d'IP [ipAddress:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10168": "poids d'équilibreur invalide[serverIp:%s], le poids ne peut pas être nul", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10169": "impossible d'ajouter l'adresse IP du serveur backend au groupe de serveurs [UUID:%s], car l'IP [IP Address:%s] est invalide", + "ORG_ZSTACK_VPC_HA_10010": "Plus de 2 routeurs VPC sont attachés au groupe HA [uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_10119": "La machine virtuelle ne peut pas effectuer de mises à jour CPU/mémoire en ligne car la modification en ligne de l'offre d'instance est désactivée. Veuillez arrêter la VM, puis réessayer la mise à jour CPU/mémoire.", + "ORG_ZSTACK_VPC_HA_10011": "Les réseaux L3 de gestion et publics du groupe HA [uuid:%s] diffèrent des réseaux L3 proposés [uuid:%s].", + "ORG_ZSTACK_VPC_HA_10012": "Les réseaux L3 du routeur vPC [UUID:%s] ne correspondent pas aux réseaux L3 du groupe HA [UUID:%s]. Veuillez supprimer ce routeur et le recréer.", + "ORG_ZSTACK_VPC_HA_10013": "Le routeur vPC a été attaché au groupe haute disponibilité [uuid:%s]", + "ORG_ZSTACK_VPC_HA_10014": "Le groupe HA VPC [uuid:%s] n'existe pas", + "ORG_ZSTACK_VPC_HA_10015": "Plus d'un routeur VPC est attaché au groupe HA [uuid:%s]", + "ORG_ZSTACK_VPC_HA_10016": "Le routeur vPC [UUID:%s] ne peut pas être mis à niveau vers un routeur HA car son réseau public est identique au réseau de gestion.", + "ORG_ZSTACK_VPC_HA_10017": "La création du groupe d'affinité pour le groupe haute disponibilité [uuid:%s] a échoué", + "ORG_ZSTACK_VPC_HA_10018": "haStatus de l'instance %s [uuid: %s] du groupe HA VPC %s [uuid: %s] a changé de %s à %s", + "ORG_ZSTACK_VPC_HA_10019": "haStatus de l'instance[uuid: %s, nom: %s, type: %s] a changé de %s à %s", + "ORG_ZSTACK_VPC_HA_10009": "Il n'y a pas de routeur maître pour le routeur [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10000": "La commande d'initialisation de l'instance NFV a échoué car :%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10002": "Échec de la modification de la politique par défaut du pare-feu de l'interface réseau de la machine virtuelle NFV [uuid:%s], car %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10053": "Les groupes de listes de contrôle d'accès [uuid:%s] sont configurés pour la redirection, mais certaines entrées de listes de contrôle d'accès manquent de règles IP.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10050": "L'écouteur d'équilibreur de charge [UUID:%s] ne peut pas attacher plus de %d groupes de listes de contrôle d'accès de règles de redirection.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10051": "L'écouteur d'équilibreur de charge [uuid:%s] avait une règle de redirection associée aux groupes de listes de contrôle d'accès [uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10118": "La machine virtuelle [UUID:%s] est toujours en pause après la dernière migration ; veuillez la reprendre avant de tenter une nouvelle migration.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10056": "L'écouteur d'équilibreur de charge [uuid:%s] ne peut pas attacher plus de %d groupes de listes de contrôle d'accès", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10008": "Le détachement n'est pas pris en charge pour ce type d'instance de machine virtuelle.", + "ORG_ZSTACK_COMPUTE_VM_10117": "La machine virtuelle avec UUID:%s est déjà hébergée sur l'hôte avec UUID:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10057": "Le groupe de serveurs [%s] n'est pas attaché à l'écouteur d'équilibreur de charge [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10007": "La mise à jour de la configuration de provisioning n'est pas prise en charge pour ce type d'instance NFV.", + "ORG_ZSTACK_COMPUTE_VM_10116": "rootDiskSize doit être spécifié lorsque le type de média de l'image est ISO.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10054": "Les groupes de listes de contrôle d'accès [uuid:%s] sont déjà associés à l'écouteur d'équilibreur de charge [uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10055": "L'écouteur d'équilibreur de charge [uuid:%s] n'a attaché que le groupe de liste de contrôle d'accès de type %s.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10009": "Le nettoyage des données n'est pas pris en charge pour ce type d'instance de fonction réseau virtualisée.", + "ORG_ZSTACK_COMPUTE_VM_10114": "La plateforme actuelle %s ne prend pas encore en charge la mise à jour des pilotes NIC.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10004": "Établissement d'une connexion SSH à l'instance NFV [%s] après la configuration des paramètres SSH impossible", + "ORG_ZSTACK_COMPUTE_VM_10113": "Impossible de créer le CD-ROM pour la machine virtuelle [uuid:%s] qui est dans l'état [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10058": "acl[%s] n'est pas attaché à l'écouteur d'équilibreur de charge [%s]", + "ORG_ZSTACK_COMPUTE_VM_10112": "l'image[name:%s, uuid:%s] est un ISO ; par conséquent, rootDiskSize doit être spécifié.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10006": "Échec de la mise à jour du statut de l'instance NFV : %s", + "ORG_ZSTACK_COMPUTE_VM_10111": "Paramètres d'allocation CPU et mémoire manquants pour votre instance. Veuillez spécifier les valeurs requises pour continuer.", + "ORG_ZSTACK_VPC_HA_10020": "Le UUID du groupe HA est nil. Veuillez vérifier la configuration et vous assurer que le UUID est correctement défini.", + "ORG_ZSTACK_COMPUTE_VM_10121": "impossible de réduire la capacité lorsque VM[%s] est en cours d'exécution", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10060": "impossible de connecter la NIC VM à l'écouteur d'équilibreur de charge car la NIC VM [uuid:%s] est déjà associée au groupe de serveurs par défaut [uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10061": "Les écouteurs UDP ne peuvent pas avoir simultanément des IPs virtuelles IPv4 et IPv6. Veuillez configurer soit IPv4 soit IPv6 pour votre écouteur.", + "ORG_ZSTACK_COMPUTE_VM_10129": "%s n'est pas une adresse IPv4 valide pour le déploiement cloud", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10068": "statut de redirection invalide [%s], seuls [codes de statut HTTP valides] sont supportés", + "ORG_ZSTACK_COMPUTE_VM_10128": "impossible de réduire la taille de la mémoire de vm[uuid:%s] lorsqu'elle est en cours d'exécution", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10065": "Impossible de lier plus de %d groupes de liste de contrôle d'accès à un écouteur", + "ORG_ZSTACK_COMPUTE_VM_10127": "impossible de réduire le CPU de VM[uuid:%s] en cours d'exécution", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10066": "l'écouteur d'équilibreur de charge[%s] ne supporte pas l'attribution d'état de persistance de session", + "ORG_ZSTACK_COMPUTE_VM_10126": "L'état de VM [uuid:%s] est %s. seuls ces états [%s] sont autorisés pour la mise à jour du CPU ou de la mémoire.", + "ORG_ZSTACK_COMPUTE_VM_10125": "La machine virtuelle ne peut pas effectuer d'opérations de hot-plug de mémoire car le hot-plug de mémoire est désactivé. Veuillez arrêter la machine virtuelle puis réessayer l'opération de hot-plug de mémoire.", + "ORG_ZSTACK_COMPUTE_VM_10124": "La machine virtuelle ne peut pas effectuer d'ajout à chaud de CPU car l'ajout à chaud de CPU est désactivé. Veuillez arrêter la VM puis réessayer l'ajout à chaud de CPU.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10069": "code de statut invalide [%s], seuls [codes de statut valides dans l'environnement de cloud computing] sont supportés", + "ORG_ZSTACK_COMPUTE_VM_10122": "reservedMemorySize[%s] dépasse memorySize[%s]", + "ORG_ZSTACK_COMPUTE_VM_10132": "%s n'est pas une adresse IPv6 valide pour la configuration de ressource cloud", + "ORG_ZSTACK_COMPUTE_VM_10131": "l'adresse ip [%s] n'est pas dans la plage ip spécifiée [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10074": "l'équilibreur de charge[%s] l'écouteur[%s] ne supporte pas l'attribution d'état de persistance de session ; une attribution iphash explicite est requise.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10075": "type de persistance de session invalide[%s], seuls %s sont supportés", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10072": "statut de persistance de session invalide [%s], seuls %s sont supportés", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10073": "l'équilibreur de charge[%s] l'écouteur[%s] ne supporte pas l'attribution d'état de persistance de session ; une désactivation explicite est requise.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10078": "nom de cookie de session invalide[%s], il ne doit contenir que des caractères alphanumériques et des tirets bas", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10079": "l'équilibreur de charge[%s] l'écouteur[%s] ne supporte pas l'attribution simultanée de délai d'inactivité et de nom de cookie", + "ORG_ZSTACK_COMPUTE_VM_10139": "L'adresse IPv6 doit inclure une longueur de préfixe", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10076": "délai d'inactivité de session invalide[%s], il doit être un entier positif entre[%s~%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10077": "nom de cookie de session invalide[%s], il doit être inférieur à [%d] caractères", + "ORG_ZSTACK_COMPUTE_VM_10137": "L'adresse IPv4 nécessite un masque de sous-réseau", + "ORG_ZSTACK_COMPUTE_VM_10136": "L'adresse IP statique [%s] est incorrectement formatée", + "ORG_ZSTACK_COMPUTE_VM_10135": "Impossible de définir l'adresse IP pour l'instance, car aucune adresse IP n'a été spécifiée. Veuillez vous assurer qu'une adresse IP est fournie avant de tenter de configurer les paramètres réseau.", + "ORG_ZSTACK_COMPUTE_VM_10134": "L'adresse IP [%s] n'est pas comprise dans la plage IP spécifiée [startIp %s, endIp %s]", + "ORG_ZSTACK_COMPUTE_VM_10133": "L'adresse IP [%s] est déjà attribuée à la VM NIC [uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10081": "loadBalancer[%s] listener[%s] ne prend pas en charge l'attribution du délai d'inactivité et du nom de cookie lorsque la persistance de session est désactivée", + "ORG_ZSTACK_COMPUTE_VM_10143": "Impossible de libérer l'adresse IP statique [%s] pour la VM [uuid:%s] car elle n'existe pas", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10082": "loadBalancer[%s] listener[%s] ne prend pas en charge l'attribution de la réécriture de persistance de session sans spécifier un nom de cookie", + "ORG_ZSTACK_COMPUTE_VM_10142": "la VM[uuid:%s] n'a pas d'interface réseau connectée au réseau L3[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10080": "loadBalancer[%s] listener[%s] ne prend pas en charge l'attribution du délai d'inactivité et du nom de cookie ; la persistance de session doit être spécifiée.", + "ORG_ZSTACK_COMPUTE_VM_10140": "L'adresse IP [%s] est déjà attribuée à vmNic", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10085": "loadBalancer[%s] listener[%s] ne prend pas en charge l'attribution de politiques de persistance de session lorsque l'algorithme de load balancing est basé sur la source.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10086": "loadBalancer[%s] ne prend pas en charge l'attribution de persistance de session utilisant iphash pour listener[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10083": "loadBalancer[%s] listener[%s] ne prend pas en charge l'attribution du délai d'inactivité de persistance de session sans spécifier le mode de réécriture", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10084": "loadBalancer[%s] listener[%s] ne prend pas en charge l'attribution de persistance de session avec un cookieName sans spécifier un mode d'insertion", + "ORG_ZSTACK_COMPUTE_VM_10149": "Type de support d'image non supporté : [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10087": "connexion maximum invalide[%s], la valeur spécifiée dépasse le seuil supérieur de %d", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10088": "conflit loadBalancerPort[%s], un autre listener[uuid:%s] utilise ce port", + "ORG_ZSTACK_COMPUTE_VM_10147": "La VM %s avec des instantanés de mémoire ne prend pas en charge la définition d'un volume de démarrage", + "ORG_ZSTACK_COMPUTE_VM_10146": "volume[uuid:%s] doit être attaché à la machine virtuelle[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10145": "Le volume de démarrage de cette instance ne peut pas être configuré comme partageable.", + "ORG_ZSTACK_COMPUTE_VM_10144": "périphérique de démarrage invalide [%%s] dans l'ordre de démarrage %%s", + "ORG_ZSTACK_VMWARE_10024": "Impossible de synchroniser avant que les datastores soient isolés", + "ORG_ZSTACK_VMWARE_10025": "Des tâches sont en cours sur vCenter[uuid:%s], veuillez réessayer plus tard.", + "ORG_ZSTACK_VMWARE_10023": "Échec de connexion à vCenter : %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10008": "Impossible d'initialiser le contrôleur SDN car aucune plage d'identificateurs de réseau virtuel (VNI) n'est configurée sur le contrôleur [ip:%s]", + "ORG_ZSTACK_VMWARE_10020": "Aucun port VNC disponible pour la machine virtuelle %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10009": "Impossible de récupérer les informations de plage VNI depuis le contrôleur SDN [ip:%s] car %s", + "ORG_ZSTACK_VMWARE_10021": "Échec de récupération de l'instance de service pour vCenter %s car %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10092": "Le cloud a échoué à créer le listener load balancer car le listener avec protocole TCP ne supporte que les paramètres de protocole proxy TCP.", + "ORG_ZSTACK_MEVOCO_10006": "opération non supportée pour le paramétrage des multiQueues du volume virtio-scsi[%s] dans l'environnement de cloud computing.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10093": "le cloud ne peut pas créer l'écouteur d'équilibreur de charge car il ne prend en charge que le protocole TCP proxy %s", + "ORG_ZSTACK_MEVOCO_10005": "opération non prise en charge pour définir le volume racine[%s] pour utiliser plusieurs files d'attente", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10091": "La création de la ressource d'informatique en nuage a échoué car l'écouteur avec le protocole HTTPS ne prend en charge que les versions HTTP [h1, h2]. Veuillez assurer la compatibilité de votre demande", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10010": "Impossible de créer le réseau VXLAN matériel car l'UUID du tenant H3C est un paramètre obligatoire pour le contrôleur H3C VCFC V2. Veuillez fournir l'UUID requis pour continuer", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10096": "l'écouteur d'équilibreur de charge de type %s ne nécessite pas de certificat", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10097": "l'écouteur d'équilibreur de charge [uuid:%s] a déjà un certificat[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10094": "le cloud n'a pas pu créer l'écouteur d'équilibreur de charge car l'écouteur avec le protocole [%s] ne prend pas en charge la compression de contenu", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10095": "le cloud ne peut pas créer l'écouteur d'équilibreur de charge car il ne prend en charge que les algorithmes de compression [%s]", + "ORG_ZSTACK_MEVOCO_10007": "pour le volume partageable, le seul type de stockage principal pris en charge est %s, actuel est %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10015": "Impossible de créer la plage VNI car le réseau L2 spécifié [uuid:%s] n'est pas une instance de pool réseau VXLAN", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10016": "Impossible de créer la plage VNI [%s-%s] car les contrôleurs H3C utilisent VNI comme ID VLAN et la plage doit être comprise entre 1-4094. Les valeurs VNI doivent être conformes aux normes d'ID VLAN pour l'implémentation de réseau virtuel", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10017": "Impossible de créer la plage VNI [%s-%s] car elle n'est couverte par aucun des VNI configurés du contrôleur SDN", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10098": "le certificat [uuid:%s] n'est pas associé à l'écouteur d'équilibreur de charge [uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10018": "Impossible d'ajouter la plage IPv6 car le contrôleur SDN [uuid:%s] n'est pas opérationnel. Statut actuel : %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10099": "erreur de cible healthCheck [%s], elle doit être 'default' ou un numéro de port entre [1~65535]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10011": "Impossible de créer le réseau VXLAN matériel car le tenant spécifié n'existe pas dans le système de gestion du contrôleur SDN. Veuillez vérifier l'ID du tenant et vous assurer qu'il est correctement configuré dans l'environnement cloud", + "ORG_ZSTACK_MEVOCO_10002": "impossible de trouver le mode IOPS à partir de VolumeQoS null", + "ORG_ZSTACK_VMWARE_10017": "L2[UUID:%s] n'appartient pas au cluster[UUID:%s] vCenter[UUID:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10012": "Impossible de créer le réseau VXLAN car le contrôleur SDN [ip:%s] n'a pas répondu", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10013": "Impossible de créer le réseau VXLAN sur le contrôleur SDN [IP:%s] car %s", + "ORG_ZSTACK_MEVOCO_10000": "ZStack a été mis en pause et tous les appels API sauf les opérations en lecture seule sont rejetés. Si vous devez procéder à une opération non en lecture seule, veuillez ajouter '%s' aux systemTags", + "ORG_ZSTACK_VMWARE_10015": "Aucun hôte trouvé dans le cluster de calcul : %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10014": "Impossible de supprimer le réseau VXLAN sur le contrôleur SDN [IP:%s] car %s", + "ORG_ZSTACK_VMWARE_10016": "vSwitch/dvSwitch non trouvé : %s, ou vSwitch sur un hôte ESX différent n'a pas le même groupe de ports", + "ORG_ZSTACK_VMWARE_10013": "Le pilote NIC %s n'est pas encore pris en charge", + "ORG_ZSTACK_VMWARE_10014": "Cluster[uuid:%s] et réseau de couche 2[uuid:%s] appartiennent à des centres de données différents", + "ORG_ZSTACK_VMWARE_10011": "domainName[%s] n'est pas un nom d'hôte DNS ou une adresse IP valide", + "ORG_ZSTACK_VMWARE_10012": "vCenter [Nom de domaine:%s] a été ajouté", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10019": "Impossible d'ajouter la plage IPv6 par CIDR réseau car le contrôleur SDN [uuid:%s] n'est pas connecté. Statut actuel : %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10000": "Aucune passerelle baremetal disponible pour cette demande. Veuillez vous assurer que vos nœuds baremetal sont correctement configurés et enregistrés dans l'environnement d'informatique en nuage", + "ORG_ZSTACK_VMWARE_10010": "Le nom d'utilisateur de connexion vCenter est requis.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10002": "Échec de l'allocation de la ressource de passerelle BareMetal2", + "ORG_ZSTACK_CORE_DEBUG_10000": "Les informations de la tâche (%s) n'ont pas été trouvées dans l'environnement de cloud computing. Veuillez vous assurer que tous les détails de la tâche nécessaires sont correctement configurés et téléchargés.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10020": "Impossible d'ajouter la plage d'adresses IP car le contrôleur SDN [uuid:%s] n'est pas connecté. Statut actuel : %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10021": "Impossible d'ajouter la plage d'adresses IP par CIDR réseau car le contrôleur SDN [uuid:%s] n'est pas connecté. Statut actuel : %s", + "ORG_ZSTACK_MEVOCO_10014": "Bande passante réseau [%s] invalide, ce n'est pas une valeur numérique", + "ORG_ZSTACK_MEVOCO_10019": "Bande passante du volume [%s] invalide, elle doit être supérieure ou égale à 1024 Mbps", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10028": "Impossible de récupérer les tenants car le contrôleur SDN [ip:%s] n'a pas répondu", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10029": "Impossible d'initialiser le contrôleur SDN car aucun tenant par défaut n'est configuré sur le contrôleur [ip:%s]", + "ORG_ZSTACK_VMWARE_10009": "Le mot de passe de la console n'est pas supporté par la machine virtuelle [UUID:%s] sur l'hôte ESX [ESXi Version:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10022": "Impossible de créer un réseau Layer 3 car le contrôleur SDN H3C VCFC V2 ne supporte pas le réseau Layer 3 [type:%s, catégorie:%s]", + "ORG_ZSTACK_MEVOCO_10013": "Bande passante réseau [%s] invalide, elle doit être supérieure ou égale à %d Mbps", + "ORG_ZSTACK_VMWARE_10006": "Échec de l'obtention des statistiques d'utilisation du disque root de la VM[%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10023": "Impossible de créer un réseau VXLAN matériel car l'UUID du tenant est un paramètre obligatoire pour le contrôleur H3C VCFC V2. Veuillez vous assurer qu'il est fourni.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10024": "Impossible d'ajouter le contrôleur H3C VCFC car l'étiquette système VDS UUID est requise pour les contrôleurs H3C VCFC V1", + "ORG_ZSTACK_VMWARE_10005": "Échec de l'obtention de l'instance VM à partir du chemin d'installation : %s", + "ORG_ZSTACK_VMWARE_10002": "Aucun centre de données virtuel trouvé", + "ORG_ZSTACK_VMWARE_10000": "Aucun service de gestion de disque virtuel trouvé", + "ORG_ZSTACK_VMWARE_10001": "Aucun gestionnaire de fichiers configuré pour les opérations de stockage cloud. Veuillez vous assurer qu'un gestionnaire de fichiers valide est configuré pour gérer les opérations %s.", + "ORG_ZSTACK_VPC_HA_VYOS_10000": "Échec de l'activation de la HA sur le routeur virtuel[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10011": "L'instance NFV [uuid:%s] est dans l'état %s et ne peut pas effectuer d'appel HTTP vers %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10010": "L'instance NFV [nom:%s, UUID:%s, état actuel:%s] n'est pas en cours d'exécution et ne peut pas effectuer l'opération requise. Veuillez réessayer une fois l'instance en cours d'exécution.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10013": "Impossible d'ajouter l'interface réseau [ip:%s, mac:%s] à l'instance NFV [uuid:%s ip:%s], car %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10012": "L'instance NFV [uuid:%s] n'a pas d'interface réseau de gestion qui peut effectuer un appel HTTP vers %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10004": "Impossible de déterminer le nœud principal pour le contrôleur Software-Defined Network (SDN) [ip:%s] en raison de %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10005": "Impossible de s'authentifier avec le contrôleur SDN car le contrôleur [IP:%s] n'a pas répondu", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_10000": "Le travail de migration de stockage de longue durée de la VM[uuid:%s] [uuid:%s] a échoué en raison du redémarrage du nœud de gestion", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10006": "Impossible de s'authentifier avec le contrôleur SDN [IP:%s] car %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10007": "Impossible de récupérer les informations de la plage VNI car le contrôleur SDN [ip:%s] n'a pas répondu", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10000": "Impossible d'ajouter la plage d'adresses IP car la création du sous-réseau a échoué sur le contrôleur SDN. Veuillez vérifier la configuration réseau ou contacter le support pour obtenir de l'aide.", + "ORG_ZSTACK_COMPUTE_VM_10103": "Impossible de passer au réseau L3. Le réseau L3 [uuid:%s] est un réseau système et la MV est une MV utilisateur.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10015": "VMInstanceSpec introuvable dans les paramètres de données de flux. Veuillez vous assurer que toutes les spécifications requises sont incluses.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10001": "Impossible d'ajouter la plage d'adresses IP au réseau car %s", + "ORG_ZSTACK_COMPUTE_VM_10102": "Impossible de passer au réseau L3. Le réseau L3 avec l'UUID [uuid:%s] est désactivé", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10014": "Impossible de supprimer l'image [UUID:%s] car elle est utilisée par un groupe d'instances NFV [UUID:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10002": "Impossible de supprimer la plage d'adresses IP du réseau Layer 3 car %s", + "ORG_ZSTACK_COMPUTE_VM_10101": "Impossible de passer à un réseau L3 non-invité. Le réseau L3 avec l'UUID [uuid:%s] est déjà associé à la MV [uuid: %s].", + "ORG_ZSTACK_COMPUTE_VM_10100": "Impossible de passer au réseau L3. Le réseau L3 avec l'UUID [uuid:%s] est déjà attaché à la MV avec l'UUID [%s].", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10003": "Impossible de déterminer le leader du cluster car le contrôleur SDN [IP:%s] n'a pas répondu", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10016": "L'inventaire MV ou l'UUID est nul dans la spécification de l'instance MV", + "ORG_ZSTACK_PORTMIRROR_10008": "Le service PortMirror ne prend pas en charge le NIC [%s] en raison de son type d'hyperviseur.", + "ORG_ZSTACK_PORTMIRROR_10009": "Le service PortMirror ne peut pas mettre en miroir vers le NIC [%s] qui n'est pas une interface non par défaut d'une MV.", + "ORG_ZSTACK_ZWATCH_API_10019": "La durée de la requête ne peut pas dépasser %s", + "ORG_ZSTACK_COMPUTE_VM_10198": "Impossible de créer une instance MV à partir d'un volume partageable. Veuillez vous assurer que le volume n'est pas défini comme partageable et réessayer.", + "ORG_ZSTACK_PORTMIRROR_10000": "Paramètre invalide [%s], assurez-vous qu'il fait référence à un réseau Port Mirroring valide", + "ORG_ZSTACK_COMPUTE_VM_10197": "Besoin de définir l'une des propriétés suivantes : %s", + "ORG_ZSTACK_PORTMIRROR_10001": "Le réseau[%s] a été associé à un service Port Mirroring", + "ORG_ZSTACK_ZWATCH_API_10028": "Le compte[uuid: %s] ne dispose pas des autorisations pour la ressource[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10196": "Impossible de configurer les propriétés suivantes simultanément : %s", + "ORG_ZSTACK_PORTMIRROR_10002": "Le service Port Mirroring[%s] n'a pas été créé", + "ORG_ZSTACK_PORTMIRROR_10003": "Le NIC [%(device_id)s, %(network_interface_id)s] a été mis en miroir par le service [%(service_id)s]", + "ORG_ZSTACK_COMPUTE_VM_10194": "Au moins l'un des éléments suivants doit être spécifié pour l'instance : l'architecture dans le msg ou l'image[uuid:%s]", + "ORG_ZSTACK_PORTMIRROR_10004": "Le NIC[%s] ne peut pas être mis en miroir pour le service[%s] en utilisant", + "ORG_ZSTACK_ZWATCH_API_10025": "étiquette invalide[%s], les étiquettes valides interrogeables pour les ressources cloud sont %s", + "ORG_ZSTACK_COMPUTE_VM_10193": "Au moins l'un des éléments suivants doit être spécifié pour le système d'exploitation invité : le champ guestOsType dans le msg ou l'image[uuid:%s].", + "ORG_ZSTACK_ZWATCH_API_10024": "la métrique[%s] n'a pas de filtre[%s]", + "ORG_ZSTACK_COMPUTE_VM_10192": "Au moins l'un des éléments suivants doit être spécifié pour le message ou l'image [uuid:%s] : plateforme ou imageID.", + "ORG_ZSTACK_PORTMIRROR_10007": "Le service PortMirror ne prend pas en charge la mise en miroir du NIC[%s].", + "ORG_ZSTACK_ZWATCH_API_10021": "impossible de trouver la métrique[%s] dans l'espace de noms[%s]", + "ORG_ZSTACK_COMPUTE_VM_10199": "Impossible de créer une instance MV à partir du volume attaché. Veuillez vous assurer que le volume est dans un état utilisable et réessayer.", + "ORG_ZSTACK_PORTMIRROR_10011": "Le service PortMirror ne peut pas établir un tunnel de miroir pour nic[%s] vers nic[%s] car le réseau miroir[%s] est invalide.", + "ORG_ZSTACK_PORTMIRROR_10012": "Le service PortMirror ne peut pas mettre en miroir l'interface réseau [%s] vers elle-même", + "ORG_ZSTACK_ZWATCH_API_10039": "Format JSON invalide pour les labels. Veuillez vous assurer que labelsJsonStr est correctement formaté.", + "ORG_ZSTACK_PORTMIRROR_10013": "Le service PortMirror n'est pas compatible avec l'interface réseau configurée avec Quality of Service (QoS).", + "ORG_ZSTACK_ZWATCH_API_10038": "Le namespace [%%s] n'a pas de métrique [%%s]", + "ORG_ZSTACK_PORTMIRROR_10014": "échec de la suppression de la session port mirror[%s] de l'hyperviseur, détail : %s", + "ORG_ZSTACK_ZWATCH_API_10037": "Aucun namespace n'est défini dans le système", + "ORG_ZSTACK_PORTMIRROR_10015": "échec de la libération de la session port mirror[%s] de l'hyperviseur, détail : %s", + "ORG_ZSTACK_ZWATCH_API_10036": "Le format de l'URL est invalide ; il doit commencer par http(s).", + "ORG_ZSTACK_PORTMIRROR_10016": "impossible de trouver l'ID interne de la session[uuid:%s], la limite de sessions sur l'hôte est-elle atteinte ???", + "ORG_ZSTACK_ZWATCH_API_10033": "endTime[%s, %sms] ne doit pas être antérieur à startTime[%s, %sms]", + "ORG_ZSTACK_ZWATCH_API_10032": "les labels de metric[%s] n'incluent pas [%s]", + "ORG_ZSTACK_ZWATCH_API_10031": "impossible de trouver le namespace[%s]", + "ORG_ZSTACK_ZWATCH_API_10030": "Si le namespace est défini sur all, la spécification de metrics et de labels n'est pas prise en charge.", + "ORG_ZSTACK_PORTMIRROR_10010": "Le service PortMirror ne peut pas mettre en miroir le NIC [%s] qui n'est pas une interface d'aucune VM.", + "ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10009": "échec de la récupération des informations du dispositif PCI depuis l'hôte[uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10030": "Impossible de récupérer le tenant par défaut depuis le contrôleur SDN [ip:%s] en raison de problèmes de communication", + "ORG_ZSTACK_ZWATCH_API_10046": "L'intervalle de temps dépasse %d jours", + "ORG_ZSTACK_ZWATCH_API_10045": "endTime[%s] ne doit pas être antérieur à startTime[%s]", + "ORG_ZSTACK_ZWATCH_API_10044": "instance[%s] invalide", + "ORG_ZSTACK_ZWATCH_API_10043": "L'enregistrement d'acquittement d'alerte de l'instance ECS n'existe pas", + "ORG_ZSTACK_ZWATCH_API_10042": "startTime[%s] est ultérieur à endTime[%s]", + "ORG_ZSTACK_ZWATCH_API_10041": "platform[url=%s] existe déjà", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10033": "Impossible de supprimer le réseau VXLAN car le contrôleur SDN [ip:%s] n'a pas répondu", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10004": "erreur d'opération, VIP %s n'est pas lié à une instance VM", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10000": "échec de création de la règle de port forwarding[vip ip: %s, private ip: %s, vip start port: %d, vip end port: %d, private start port: %d, private end port: %d], car %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10001": "échec de révocation des règles de port forwarding %s à cause de %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10002": "échec de synchronisation des règles de port forwarding servies par le routeur virtuel[name: %s, uuid: %s], car %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10003": "Un routeur virtuel offrant [uuid:%s] a été trouvé pour le réseau L3 [uuid:%s] dans la zone [uuid:%s] ; cependant, le réseau public [uuid:%s] ne correspond pas à la règle Port Forwarding [uuid:%s]. Vous devrez peut-être spécifier une offre de routeur virtuel particulière en utilisant le tag système guestL3Network::l3NetworkUuid.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10004": "le routeur virtuel ne prend pas en charge la redirection de plage de ports pour le port forwarding ; le port de départ VIP doit être égal au port de départ private et le port de fin VIP doit être égal au port de fin private. Cependant, cette règle a une plage non concordante : port VIP [%s, %s], port private [%s, %s].", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10005": "Échec de l'ajout des redirections de ports sur le routeur virtuel[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10006": "Échec de la révocation des redirections de ports sur le routeur virtuel[uuid:%s], erreur : %s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10003": "Échec de la suppression des périphériques de stockage secondaires car :%s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10004": "Échec de l'obtention des informations du périphérique MTTY depuis l'hôte[UUID:%s]", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10001": "La quantité est dépassée. Le périphérique[uuid: %s] nécessite un nombre de périphériques SE qui dépasse la quantité autorisée[%d].", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10002": "Échec de la génération des périphériques de stockage car :%s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10000": "Le numéro de pièce spécifié[value:%s] n'est pas un ID d'instance valide dans cet environnement cloud.", + "ORG_ZSTACK_CORE_CLOUDBUS_10021": "Le message n'est pas dans un format JSON correct, %s", + "ORG_ZSTACK_COMPUTE_VDPA_10009": "seul %s prend en charge la technologie d'accélération vdpa", + "ORG_ZSTACK_COMPUTE_VDPA_10007": "impossible de générer le périphérique PCI[uuid:%s] car une autre instance L2[uuid:%s] utilise l'interface réseau physique attachée au cluster", + "ORG_ZSTACK_COMPUTE_VDPA_10006": "impossible de supprimer le périphérique PCI[uuid:%s], car une autre instance L2[uuid:%s] utilise l'interface réseau physique attachée au cluster", + "ORG_ZSTACK_COMPUTE_VDPA_10005": "Échec de la suppression du pont[%s] pour l2Network[uuid:%s, type:%s] sur l'hôte KVM[uuid:%s], en raison de %s", + "ORG_ZSTACK_COMPUTE_VDPA_10004": "Échec de la vérification du pont[%s] pour l2NoVlanNetwork[uuid:%s, name:%s] sur l'hôte KVM[uuid: %s], %s", + "ORG_ZSTACK_COMPUTE_VDPA_10003": "Échec de la création du pont[%s] pour l2Network[uuid:%s, type:%s] sur l'hôte KVM[uuid:%s], car %s", + "ORG_ZSTACK_COMPUTE_VDPA_10002": "restaurer vdpa pour vm[uuid:%s] depuis l'hôte de destination[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VDPA_10001": "libérer le périphérique vdpa pour vm[uuid:%s] sur l'hôte de destination[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10152": "VM[uuid:%s] est attachée à plusieurs ISO, veuillez spécifier l'isoUuid lors du détachement.", + "ORG_ZSTACK_COMPUTE_VM_10151": "VM[uuid:%s] a monté le CD-ROM ISO[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10150": "Le virtualCDROM avec UUID:%s n'existe pas", + "ORG_ZSTACK_COMPUTE_VM_10159": "Impossible d'attacher un réseau Layer 3. Le réseau Layer 3 [uuid:%s] appartient aux réseaux Layer 2 [uuids:%s] qui n'ont été attachés à aucun cluster.", + "ORG_ZSTACK_COMPUTE_VM_10158": "Impossible d'attacher un réseau Layer 3. Le réseau L3 spécifié [uuid:%s] appartient à un réseau Layer 2 différent [uuids:%s].", + "ORG_ZSTACK_COMPUTE_VM_10157": "impossible d'attacher un réseau Layer 3. Le réseau Layer 3 spécifié [uuid:%s] n'a pas de plage IP définie.", + "ORG_ZSTACK_COMPUTE_VM_10156": "impossible d'attacher un réseau Layer 3. La VM [uuid: %s] n'est pas dans un état En cours d'exécution ou Arrêté ; l'état actuel est %s", + "ORG_ZSTACK_COMPUTE_VDPA_10015": "Échec de l'allocation des vDPAs sur l'hôte[uuid:%s] pour VM[uuid:%s] : %s", + "ORG_ZSTACK_COMPUTE_VDPA_10013": "Échec de la suppression des vDPAs sur l'hôte[UUID:%s] pour VM[UUID:%s] : %s", + "ORG_ZSTACK_COMPUTE_VDPA_10012": "Le réseau L2 [UUID:%s] dans l'hôte [UUID:%s] n'est pas virtualisé SRIOV", + "ORG_ZSTACK_COMPUTE_VDPA_10011": "le cluster[uuid:%s] ne prend pas en charge ovs-dpdk", + "ORG_ZSTACK_COMPUTE_VDPA_10010": "impossible de créer un vSwitch avec l'interface physique:[%s] qui est déjà utilisée par un autre type de vSwitch.", + "ORG_ZSTACK_COMPUTE_VM_10163": "impossible d'attacher un réseau Layer 3. Le réseau Layer 3 avec UUID [uuid:%s] est un réseau système, tandis que la VM est une VM utilisateur.", + "ORG_ZSTACK_COMPUTE_VM_10162": "impossible d'attacher un réseau Layer 3. Le réseau Layer 3 avec UUID [%s] est désactivé", + "ORG_ZSTACK_COMPUTE_VM_10161": "impossible d'attacher un réseau L3 non-invité à la machine virtuelle car il est déjà attaché à une autre machine virtuelle (uuid: %s)", + "ORG_ZSTACK_COMPUTE_VM_10160": "Impossible d'attacher un réseau Layer 3. Le réseau Layer 3 spécifié [uuid:%s] est déjà attaché à la machine virtuelle [uuid: %s].", + "ORG_ZSTACK_COMPUTE_VM_10168": "L'adresse IP statique [%s] est déjà assignée à une ressource sur le réseau Layer 3 [uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_10167": "L'adresse IP statique [%s] n'est dans aucune plage d'adresses IP du réseau Layer 3 [uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_10166": "L'UUID du réseau L3 de l'IP statique [%s] n'est pas inclus dans la liste des réseaux L3 de la NIC [%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10009": "IAM2ProjectVO[uuid:%s] n'est pas dans l'état %s, le changement d'état n'est pas autorisé", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10008": "Le projet [UUID:%s, Name:%s] a déjà une stratégie d'expiration de connexion configurée.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10007": "date ou heure invalide[%s], elle ne peut pas être antérieure au timestamp actuel[%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10006": "valeur de spending invalide[%s], elle doit être au format par exemple 10.001", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10005": "valeur de spending invalide[%s], la valeur de spending doit être entre 0 et %f", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10004": "temps invalide[%s], il doit être au format comme 10m, 1h, ou 2d", + "ORG_ZSTACK_CORE_CLOUDBUS_10001": "pour les webhooks de type[%s], le champ opaque ne peut pas être null", + "ORG_ZSTACK_COMPUTE_VM_10176": "Impossible d'attacher la NIC. Son réseau L2 [uuid:%s] n'a été attaché à aucun cluster de calcul.", + "ORG_ZSTACK_ZWATCH_API_10007": "Les paramètres dataStartTime et dataEndTime ne peuvent pas être omis. Veuillez vous assurer qu'ils sont fournis.", + "ORG_ZSTACK_COMPUTE_VM_10175": "Impossible d'attacher la NIC. Son réseau Layer 3 [uuid:%s] est un réseau système, tandis que la VM est une VM utilisateur.", + "ORG_ZSTACK_ZWATCH_API_10006": "dataUuid ne peut pas être omis", + "ORG_ZSTACK_COMPUTE_VM_10174": "impossible d'attacher la nic. Son réseau Layer 3 [uuid:%s] est désactivé", + "ORG_ZSTACK_COMPUTE_VM_10173": "Impossible d'attacher la NIC à un réseau L3 non-invité. Le réseau L3 [uuid:%s] est déjà attaché à la VM [uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_10172": "Le réseau L3 avec l'UUID [%s] est déjà attaché à une autre VM avec l'UUID [%s]. Veuillez le détacher de la VM existante avant de l'attacher à une nouvelle.", + "ORG_ZSTACK_COMPUTE_VM_10171": "La NIC a été attachée à la VM [UUID: %s]. Veuillez vous assurer que la NIC n'est pas déjà attachée avant d'essayer de l'attacher à nouveau.", + "ORG_ZSTACK_COMPUTE_VM_10170": "impossible d'attacher la nic. La VM[uuid: %s] n'est pas dans un état Running ou Stopped ; l'état actuel est %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10011": "Le projet [UUID:%s, Name:%s] a déjà une politique de retraite définie.", + "ORG_ZSTACK_COMPUTE_VM_10179": "impossible de détacher un réseau L3 de la VM [uuid: %s] ; la VM n'est pas dans un état Running ou Stopped ; l'état actuel est %s", + "ORG_ZSTACK_COMPUTE_VM_10178": "impossible de mettre à jour l'état de l'interface réseau [uuid: %s], en raison du type d'interface réseau non supporté [%s]", + "ORG_ZSTACK_CORE_UPGRADE_10000": "Api: %s n'est pas permise selon allowedApiListGrayscaleUpgrading: %s.", + "ORG_ZSTACK_CORE_UPGRADE_10003": "Impossible de trouver la version de l'agent ; la mise à jour du système d'exploitation du cluster n'est pas prise en charge pendant une mise à niveau progressive. Veuillez vous assurer que la version de l'agent est installée avant de lancer le processus de mise à niveau.", + "ORG_ZSTACK_CORE_UPGRADE_10002": "Désactivez la mise à niveau progressive par %s avant de vouloir mettre à jour le système d'exploitation de tous les hôtes du cluster. Alternativement, essayez de mettre à jour le système d'exploitation du cluster avec un UUID d'hôte spécifique.", + "ORG_ZSTACK_CORE_UPGRADE_10004": "L'agent de l'hôte[UUID: %s] n'a pas été mis à niveau. Veuillez reconnecter l'hôte avant d'effectuer une mise à jour du système d'exploitation.", + "ORG_ZSTACK_ZWATCH_API_10008": "dataStartTime[%s] est postérieur à dataEndTime[%s]", + "ORG_ZSTACK_COMPUTE_VM_10187": "quand imageUuid est null, placeholder_for_image_uuid_is_missing", + "ORG_ZSTACK_COMPUTE_VM_10186": "Le disque racine est manquant. Veuillez vous assurer qu'un volume racine est attaché à votre instance.", + "ORG_ZSTACK_COMPUTE_VM_10185": "Configuration inattendue pour les disques de données. Les tailles spécifiées dans dataDiskSizes doivent être supérieures à 0.", + "ORG_ZSTACK_COMPUTE_VM_10182": "Paramètres de volume racine inattendus", + "ORG_ZSTACK_COMPUTE_VM_10181": "Le type de média de l'image est ISO mais les paramètres du disque racine sont manquants", + "ORG_ZSTACK_COMPUTE_VM_10180": "vm[uuid:%s] ne peut attacher un volume que lorsque son état est Running ou Stopped ; l'état actuel est %s.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10003": "date[%s] invalide, elle doit être au format yyyy-MM-dd HH:mm:ss ZZZ", + "ORG_ZSTACK_ZWATCH_API_10010": "Un nom d'espace de noms ne peut pas commencer par un mot-clé réservé tel que %s.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10002": "means[%s] invalide, les means autorisés sont pour spécifier des quotas de ressources ou des métriques dans un environnement cloud", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10001": "valeur invalide pour le paramètre, %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10000": "Valeur invalide spécifiée pour la limite de ressources ; une valeur numérique est attendue sans suffixe 'at', 'after' ou 'exceed'. Veuillez fournir un nombre valide.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10030": "L'interface DHCP du serveur PXE %s n'existe pas, ou elle n'a pas d'adresse IP.", + "ORG_ZSTACK_NETWORK_OVN_10012": "impossible d'ajouter l'hôte SDN car l'interface réseau [%s] a l'adresse IP [%s]", + "ORG_ZSTACK_NETWORK_OVN_10011": "impossible d'ajouter l'hôte SDN car NIC[%s] est dans un état virtualisé SR-IOV", + "ORG_ZSTACK_NETWORK_OVN_10010": "impossible d'ajouter l'hôte SDN car le type [%s] de NIC[%s] est utilisé pour le bonding Linux", + "ORG_ZSTACK_NETWORK_OVN_10016": "L'ajout de l'hôte SDN a échoué car seuls les hôtes KVM supportent OVS DPDK.", + "ORG_ZSTACK_APIMEDIATOR_10000": "Plus d'une instance de Backup Storage sur le même hôte identifié par le nom d'hôte. Il existe déjà un SftpBackupStorage [hostname:%s]. Le type de Backup Storage à ajouter est %s.", + "ORG_ZSTACK_NETWORK_OVN_10015": "impossible d'ajouter l'hôte SDN car le mode bond[%s] n'est pas supporté par OVN", + "ORG_ZSTACK_NETWORK_OVN_10014": "impossible d'ajouter l'hôte SDN car NIC[%s] est utilisé pour l'interface VXLAN VTEP", + "ORG_ZSTACK_NETWORK_OVN_10013": "impossible d'ajouter l'hôte SDN car NIC[%s] a été attaché au réseau L2[name:%s]", + "ORG_ZSTACK_APIMEDIATOR_10001": "Plus d'un service Backup Storage en cours d'exécution sur le même hôte identifié par le nom d'hôte. Il existe un service Image Store Backup Storage [hostname:%s]. Le type de Backup Storage à ajouter est %s.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10031": "%s ~ %s ne peut pas établir une connexion vers l'interface DHCP %s", + "ORG_ZSTACK_NETWORK_OVN_10019": "L'hôte avec UUID [%s] dans le cluster avec UUID [%s] n'a pas activé les hugepages ; par conséquent, il n'est pas permis d'être ajouté au contrôleur SDN.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10032": "cluster[uuid:%s] et pxeserver[uuid:%s] ne résident pas dans la même zone", + "ORG_ZSTACK_NETWORK_OVN_10018": "Impossible d'ajouter l'hôte SDN car un masque réseau n'a pas été spécifié.%s", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10033": "cluster[uuid:%s] n'est pas un cluster baremetal", + "ORG_ZSTACK_NETWORK_OVN_10017": "Impossible d'ajouter l'hôte SDN car l'IP VTEP n'est pas configurée.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10034": "Le serveur PXE baremetal [uuid:%s] est déjà attaché au cluster [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10035": "Le serveur PXE baremetal [UUID: %s] n'est pas compatible avec les instances baremetal dans le cluster [UUID: %s], car l'IP NIC existante %s est hors de la plage DHCP du serveur PXE (%s ~ %s).", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10036": "Le serveur PXE baremetal [UUID: %s] n'est pas associé au cluster [UUID: %s]", + "ORG_ZSTACK_STORAGE_MIGRATION_10030": "Le stockage primaire de destination n'est pas attaché à un cluster qui partage les mêmes réseaux de niveau 2 que le cluster source.", + "ORG_ZSTACK_STORAGE_MIGRATION_10033": "ne prend pas en charge la migration du stockage lorsqu'un volume partagé [uuid: %s, name: %s] est attaché", + "ORG_ZSTACK_STORAGE_MIGRATION_10034": "Impossible de migrer le volume de l'instance source vers l'instance cible.", + "ORG_ZSTACK_STORAGE_MIGRATION_10031": "Le volume [UUID:%s] est toujours attaché à la VM [UUID:%s], veuillez le détacher avant la migration.", + "ORG_ZSTACK_STORAGE_MIGRATION_10032": "impossible de migrer le volume de données [uuid:%s] entre les stockages primaires en bloc partagé lorsque la machine virtuelle [vmuuid:%s] n'est pas arrêtée.", + "ORG_ZSTACK_STORAGE_MIGRATION_10035": "impossible de migrer le volume [%s] car son état est Désactivé", + "ORG_ZSTACK_STORAGE_MIGRATION_10036": "Aucun hôte disponible pour la migration à chaud basée sur les blocs : %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10019": "impossible de trouver SNSTextTemplate avec UUID:%s, il a peut-être été supprimé ou retiré du stockage cloud.", + "ORG_ZSTACK_NETWORK_OVN_10023": "impossible de modifier vmnic vers le réseau L3 [uuid:%s] car l'hôte [uuid:%s] associé à la machine virtuelle n'est pas connecté au contrôleur SDN [uuid:%s].", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10028": "échec de l'établissement d'une connexion vers %s, veuillez vérifier la configuration réseau entre le nœud de gestion ZStack et le serveur PXE nu", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10016": "la plateforme/le point de terminaison d'application [%s] ne prend pas en charge les modèles définis par l'utilisateur", + "ORG_ZSTACK_NETWORK_OVN_10022": "impossible de modifier VMNIC vers le réseau L3 [UUID:%s] car le contrôleur SDN [UUID:%s] n'a pas été trouvé", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10029": "Aucun référentiel local trouvé sous /opt/zstack-dvd de %s, veuillez télécharger l'ISO ZStack et créer d'abord un référentiel local.", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10015": "type de plateforme d'application non valide [%s]", + "ORG_ZSTACK_NETWORK_OVN_10021": "impossible de attaches le réseau L3 à la VM car l'hôte [uuid:%s] de la VM n'est pas attaché au contrôleur SDN [uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10018": "impossible de trouver le sujet [uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10020": "impossible de rattacher le réseau L3 à la VM car le contrôleur SDN [uuid:%s] n'a pas été trouvé", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10017": "les paramètres : %s ne sont pas pris en charge par ZStack, les valeurs disponibles pour les paramètres sont : %s", + "ORG_ZSTACK_NETWORK_OVN_10026": "échec de la synchronisation des paramètres de qualité de service réseau vers le contrôleur OVN [uuid:%s, ip:%s], en raison de %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10011": "Le code du modèle SMS doit être une chaîne de 13 caractères. Cependant, le code du modèle d'événement fourni : [%s] a [%d] caractères.", + "ORG_ZSTACK_NETWORK_OVN_10025": "échec de la récupération du QoS NIC depuis le contrôleur OVN [uuid:%s, ip:%s], en raison de %s", + "ORG_ZSTACK_NETWORK_OVN_10024": "échec de la configuration du QoS NIC sur le contrôleur OVN [uuid:%s, ip:%s], car %s", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10020": "Type de stockage de sauvegarde non pris en charge pour le serveur nu", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10010": "La longueur du code du modèle SMS doit être de 13 caractères. Code du modèle d'alarme reçu : [%s] avec [%d] caractères.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10023": "Le masque de sous-réseau de la plage DHCP du serveur PXE %s n'est pas valide pour le déploiement de machine virtuelle.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10024": "Le début de la plage DHCP %s et la fin de la plage %s du serveur PXE n'appartiennent pas au même masque de sous-réseau.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10025": "Un serveur PXE avec ce nom d'hôte existe déjà.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10026": "Il existe déjà une passerelle Baremetal2 avec l'adresse IP de gestion %s ; veuillez ne pas l'utiliser pour créer un serveur PXE nu.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10027": "storagePath doit être un chemin absolu spécifiant l'emplacement complet dans le système de fichiers virtuel.", + "ORG_ZSTACK_STORAGE_MIGRATION_10022": "Image [uuid:%s] non trouvée dans le stockage de sauvegarde source [uuid:%s].", + "ORG_ZSTACK_STORAGE_MIGRATION_10023": "Impossible de migrer l'image de l'emplacement source vers l'emplacement de destination.", + "ORG_ZSTACK_STORAGE_MIGRATION_10020": "Le stockage de blocs source et le stockage de blocs de destination ne doivent pas être désactivés.", + "ORG_ZSTACK_STORAGE_MIGRATION_10021": "L'image[uuid:%s] n'est pas à l'état Prêt et ne peut donc pas être migrée.", + "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10001": "Le battement de cour de l'hôte %s n'est pas reçu", + "ORG_ZSTACK_STORAGE_MIGRATION_10026": "Le volume[uuid:%s] n'est pas à l'état Prêt et ne peut pas être migré.", + "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10000": "ID d'hôte non trouvé pour l'hôte UUID[%s] et le stockage principal UUID[%s]", + "ORG_ZSTACK_STORAGE_MIGRATION_10027": "Impossible de migrer le volume racine d'une instance de machine virtuelle lorsqu'elle n'est pas à l'état arrêté. Veuillez vous assurer que l'instance est arrêtée avant de tenter de migrer le volume racine.", + "ORG_ZSTACK_STORAGE_MIGRATION_10024": "Le volume[uuid:%s] est déjà dans le pool[uuid:%s], ne peut pas être migré.", + "ORG_ZSTACK_STORAGE_MIGRATION_10025": "Les sessions PowerShell source et destination ne doivent pas être à l'état Désactivé ou Maintenance.", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10009": "La longueur du signe SMS Alibaba Cloud doit être comprise entre 2 et 12 caractères. Signe obtenu: [%s] avec [%d] caractères.", + "ORG_ZSTACK_STORAGE_MIGRATION_10028": "La migration de stockage VM n'est pas prise en charge pour VM[uuid:%s, nom: %s] lorsqu'un volume partagé est attaché.", + "ORG_ZSTACK_STORAGE_MIGRATION_10029": "Impossible de migrer le volume racine d'une instance VM qui a des volumes de données attachés. Veuillez détacher tous les volumes de données avant de migrer le volume racine.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10017": "échec du montage du cache baremetal de l'image[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10019": "Pas assez d'espace restant dans le cache d'image baremetal pour l'image[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10011": "échec de la création de la configuration DHCP pour le châssis [uuid:%s] sur le serveur PXE [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10012": "échec de la suppression de la configuration DHCP du châssis[uuid:%s] sur le serveur PXE[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10013": "L'UUID de l'agent du serveur PXE baremetal a changé [attendu: %s, réel: %s]. Ceci est probablement dû à un redémarrage manuel de l'agent. Veuillez vous reconnecter pour synchroniser l'état.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10005": "impossible de trouver le répertoire: %s dans le tableau de bord", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10016": "connexion au serveur PXE baremetal impossible [url:%s], car %s", + "ORG_ZSTACK_LICENSE_10002": "Le code de demande de licence fourni %s n'est pas valide pour l'allocation de ressources cloud. Veuillez vérifier et réessayer.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10003": "exécution sqlite3 échouée en raison de: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10000": "méthode non prise en charge: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10001": "erreur de requête http! code d'état: %s, erreur: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10011": "Le stockage de sauvegarde Ceph attaché ne prend pas en charge la migration de stockage basée sur ISO.", + "ORG_ZSTACK_STORAGE_MIGRATION_10015": "ne prend pas en charge la migration de stockage de [%s] vers [%s] environnement virtuel", + "ORG_ZSTACK_STORAGE_MIGRATION_10016": "VM[uuid:%s] est en cours d'exécution mais l'UUID de l'hôte est manquant", + "ORG_ZSTACK_STORAGE_MIGRATION_10013": "ne prend pas en charge la migration de stockage de [%s] vers [%s] avec des volumes de données", + "ORG_ZSTACK_STORAGE_MIGRATION_10014": "ne prend pas en charge la migration de stockage de [%s] vers [%s] utilisant des instantanés", + "ORG_ZSTACK_STORAGE_MIGRATION_10019": "Le BS source et le BS cible ne peuvent pas être identiques.", + "ORG_ZSTACK_STORAGE_MIGRATION_10017": "Prend uniquement en charge la migration de stockage à chaud du volume de données utilisant le paramètre dataVolumes.", + "ORG_ZSTACK_STORAGE_MIGRATION_10018": "ne prend pas en charge la migration de stockage à chaud de [%s] vers [%s] pour les volumes autres que le volume racine", + "ORG_ZSTACK_NETWORK_OVN_10001": "Impossible d'ajouter la VM NIC au groupe de sécurité car le SDN de la VM NIC [uuid:%s] ne correspond pas au SDN du groupe de sécurité [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10006": "Échec de création du proxy nginx bm instance sur le pxeserver baremetal[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10000": "Impossible de connecter le réseau L3 au groupe de sécurité car le SDN du réseau L3 [uuid:%s] ne correspond pas au SDN du groupe de sécurité [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10007": "Échec de suppression du proxy nginx bm instance sur le pxeserver baremetal[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10008": "Échec du démarrage du serveur PXE baremetal[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10009": "Échec de l'arrêt du serveur PXE baremetal[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10005": "Impossible de créer le groupe de sécurité car le contrôleur OVS[uuid:%s, type: %s] est introuvable", + "ORG_ZSTACK_NETWORK_OVN_10004": "Impossible de créer le groupe de sécurité car un contrôleur OVN est spécifié. Veuillez vous assurer de ne pas spécifier de contrôleur OVN lors de la création d'un groupe de sécurité.", + "ORG_ZSTACK_NETWORK_OVN_10003": "Impossible de supprimer l'hôte car %d instances de contrôleur OVN sont en cours d'exécution sur l'hôte", + "ORG_ZSTACK_NETWORK_OVN_10002": "Impossible de créer le réseau Layer 3 car OVN ne prend pas en charge le type L3: %s, catégorie: %s", + "ORG_ZSTACK_NETWORK_OVN_10009": "Impossible d'ajouter l'hôte SDN car l'interface réseau [%s] est introuvable", + "ORG_ZSTACK_NETWORK_OVN_10008": "Impossible de créer le réseau SDN L2 car l'UUID du contrôleur SDN est manquant. Veuillez vous assurer que l'UUID du contrôleur SDN est configuré correctement.", + "ORG_ZSTACK_NETWORK_OVN_10007": "Impossible de connecter le service réseau[%s] au réseau OVS", + "ORG_ZSTACK_GUESTTOOLS_PVPANIC_10000": "Impossible de déployer des machines virtuelles sans un chemin de fichier source valide", + "ORG_ZSTACK_NETWORK_OVN_10006": "Impossible de connecter le service réseau OVN au réseau avec vSwitchType[%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10001": "Échec de l'initialisation des configurations sur le serveur PXE baremetal[uuid:%s]", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_MARKETPLACE_10000": "filterName doit être défini sur marketplace:true ou marketplace:false pour un filtrage correct dans le service marketplace.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10002": "Échec de création des configurations d'instance baremetal sur pxeserver[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10003": "Échec de suppression des configurations d'instance baremetal sur pxeserver[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10004": "Échec de création du proxy NOVA d'instance BM sur le serveur PXE baremetal[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10005": "Échec de suppression du proxy novnc d'instance bm sur le pxeserver baremetal[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_10005": "L3Network[uuid:%s] n'a pas le service réseau[type:%s] activé ou il n'y a pas de fournisseur offrant ce service réseau.", + "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10000": "capacité non prise en charge: SEND_SNS_MESSAGE", + "ORG_ZSTACK_NETWORK_SERVICE_10004": "Échec de l'application du service réseau[%s] à la machine virtuelle[uuid: %s]", + "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10001": "Échec de l'envoi de la notification SNS sur le plugin %s", + "ORG_ZSTACK_NETWORK_SERVICE_10007": "Le service réseau pour le fournisseur[uuid:%s] doit être défini", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10021": "aucun réseau de provisionnement baremetal2 trouvé dans le cluster[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10020": "aucune passerelle Baremetal2 utilisable trouvée dans le cluster[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_10001": "L3Network [UUID: %s] n'a pas de service de route hôte configuré.", + "ORG_ZSTACK_NETWORK_SERVICE_10000": "L3Network [UUID: %s] fournit un type null", + "ORG_ZSTACK_LICENSE_10019": "constructeur hôte inattendu pour le modèle de machine virtuelle MINI", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10022": "le réseau de provisionnement baremetal2 [uuid:%s] n'est pas utilisable; vérifiez qu'il est activé.", + "ORG_ZSTACK_NETWORK_SERVICE_10009": "le fournisseur de services réseau avec l'UUID [%s] n'offre pas de services pour %s", + "ORG_ZSTACK_NETWORK_OVN_10052": "échec de la suppression du port OVS vers l'hôte [uuid:%s] pour les interfaces réseau [%s], erreur: %s", + "ORG_ZSTACK_NETWORK_SERVICE_10008": "impossible de trouver le fournisseur de services réseau[uuid:%s] ou il n'offre aucun service", + "ORG_ZSTACK_NETWORK_OVN_10051": "échec de la suppression du port OVS sur l'hôte [UUID:%s] pour les interfaces réseau [%s], erreur: %s", + "ORG_ZSTACK_NETWORK_OVN_10050": "échec de la synchronisation du port OVS avec l'hôte[uuid:%s] pour les interfaces réseau [%s], erreur: %s", + "ORG_ZSTACK_NETWORK_OVN_10056": "erreur lors de l'interrogation de l'état du cluster pour vérifier les nœuds排除nés %s", + "ORG_ZSTACK_NETWORK_OVN_10055": "échec de la synchronisation des paramètres Quality of Service vers le contrôleur OVN[uuid:%s, ip:%s], erreur: %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORK_10000": "impossible de configurer le réseau VXLAN pour la machine virtuelle [uuid:%s] sur l'hôte de destination [uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10054": "échec de la définition du châssis demandé du port OVS vers l'hôte[uuid:%s] pour le LSP[%s], erreur: %s", + "ORG_ZSTACK_NETWORK_OVN_10053": "échec de la définition du châssis demandé du port OVS sur l'hôte[uuid:%s] pour le LSP[%s], erreur: %s", + "ORG_ZSTACK_NETWORK_OVN_10059": "échec de l'ajout des options DHCP au contrôleur OVN[uuid:%s, ip:%s], car %s", + "ORG_ZSTACK_NETWORK_OVN_10058": "Résultat vide de l'état du cluster reçu depuis l'agent; vérifiez la configuration et la connectivité de l'agent.", + "ORG_ZSTACK_NETWORK_OVN_10057": "Échec de la récupération de l'état du cluster: %s", + "ORG_ZSTACK_NETWORK_SERVICE_10010": "Un service réseau [%s] a été attaché à un réseau de couche 3 [UUID: %s].", + "ORG_ZSTACK_LICENSE_10023": "Échec de la suppression de la licence pour la machine virtuelle %s en raison d'une erreur inconnue. Veuillez contacter le support pour obtenir de l'aide.", + "ORG_ZSTACK_LICENSE_10003": "Le timestamp fourni est invalide. Veuillez vous assurer qu'il respecte la norme ISO 8601 (AAAA-MM-JJTHH:mm:ss).", + "ORG_ZSTACK_LICENSE_10004": "Longueur de fichier de licence décodée inattendue: %d. Une longueur valide est attendue pour les services d'informatique en nuage.", + "ORG_ZSTACK_LICENSE_10005": "Échec du décodage car %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10010": "aucun châssis de serveur physique disponible dans les clusters baremetal2[uuids:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_10012": "networkServices ne doit pas être vide", + "ORG_ZSTACK_NETWORK_SERVICE_10011": "Adresses IP insuffisantes pour l'allocation lors de l'attachement du service DHCP au réseau de couche 3 [uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_10014": "impossible de trouver le backend de service réseau Dhcp [type de fournisseur: %s]", + "ORG_ZSTACK_NETWORK_OVN_10062": "échec du ping du contrôleur OVN[uuid:%s, ip:%s], en raison de %s", + "ORG_ZSTACK_NETWORK_OVN_10061": "Impossible d'envoyer une commande au contrôleur OVN[uuid:%s, ip:%s], NfvInstanceGroup[uuid:%s, name:%s] statut est %s, seuls les groupes en état Sain ou Dégradé peuvent accepter des commandes", + "ORG_ZSTACK_NETWORK_OVN_10060": "le contrôleur OVN[uuid:%s] n'est pas connecté, statut actuel: %s", + "ORG_ZSTACK_NETWORK_OVN_10067": "L'adresse IP [%s] n'est pas une IP virtuelle valide dans l'environnement actuel. Veuillez utiliser l'adresse IP virtuelle d'un NFV Instance Group.", + "ORG_ZSTACK_NETWORK_OVN_10066": "impossible de trouver la machine virtuelle [uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10064": "impossible de trouver l'interface réseau de la machine virtuelle [internalName:%s]", + "ORG_ZSTACK_NETWORK_OVN_10069": "Échec du ping du contrôleur SDN, erreur : %s", + "ORG_ZSTACK_NETWORK_OVN_10068": "L'IP [%s] n'est associée à aucun groupe d'instances NFV du contrôleur SDN OVN. Veuillez utiliser l'adresse VIP d'un groupe d'instances NFV du contrôleur OVN.", + "ORG_ZSTACK_CORE_10000": "aucun exécuteur trouvé pour la ressource UUID[%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10016": "le nom de bond %s existe déjà", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10018": "impossible de trouver le châssis baremetal2 avec UUID [%s], il n'existe peut-être pas", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10017": "la carte réseau avec l'adresse MAC a été liée", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10000": "Échec de la validation du SMS universel avec le fournisseur[%s]", + "ORG_ZSTACK_LICENSE_10037": "MN[uuid:%s]: CloudInstanceNotDefinedException", + "ORG_ZSTACK_LICENSE_10038": "Plusieurs nœuds de gestion existent mais seules des licences pour %s sont fournies.", + "ORG_ZSTACK_LICENSE_10039": "Environnement MN HA, mais seule une licence mise à jour pour %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10001": "l'architecture du CPU de l'hôte [arch:%s] et du cluster [arch:%s] ne correspondent pas", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10000": "format incorrect des informations matérielles du châssis baremetal2 : %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10003": "format incorrect des informations matérielles NIC du châssis baremetal2 : %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10002": "seuls les châssis baremetal2 avec le mode de démarrage %s sont pris en charge", + "ORG_ZSTACK_NETWORK_OVN_10032": "Échec de la configuration des nœuds du cluster OVN pour l'instance NFV [UUID:%s], car %s", + "ORG_ZSTACK_NETWORK_OVN_10031": "Aucune instance trouvée dans NfvInstanceGroup[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10038": "Échec du détachement de NfvInstance[uuid:%s] car l'instance n'a pas été trouvée", + "ORG_ZSTACK_NETWORK_OVN_10035": "Le réseau L2 [UUID:%s] n'est pas associé à un contrôleur SDN", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10005": "format incorrect des informations matérielles du disque du châssis baremetal2 : %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10004": "Il doit y avoir une et une seule carte réseau d'approvisionnement associée à un châssis BareMetal2.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10006": "Une machine virtuelle avec une adresse MAC en double est détectée sur un autre nœud de calcul. Veuillez résoudre ce conflit.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10009": "Aucune ressource de serveur physique disponible trouvée pour le déploiement baremetal2.%s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10008": "BareMetal2 Chassis[uuid:%s] n'existe pas ou est désactivé", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10002": "fournisseur[%s] invalide", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10001": "Échec de la validation du SMS universel pour l'instance de service cloud %s", + "ORG_ZSTACK_CORE_GC_10001": "impossible de déclencher un travail de garbage collection terminé[uuid:%s, name:%s]", + "ORG_ZSTACK_LICENSE_10046": "impossible de trouver le fichier de licence[uuid:%s, type:%s] au chemin spécifié %s", + "ORG_ZSTACK_LICENSE_10028": "échec de la révocation de la licence pour le module %s", + "ORG_ZSTACK_LICENSE_10029": "UKey non prise en charge (architecture : %s)", + "ORG_ZSTACK_NETWORK_OVN_10041": "impossible de connecter le réseau L3 au groupe de sécurité car le contrôleur SDN [uuid:%s] n'est pas trouvé", + "ORG_ZSTACK_NETWORK_OVN_10040": "IP de gestion non trouvé pour détacher l'instance NFVI [UUID:%s]", + "ORG_ZSTACK_NETWORK_OVN_10045": "échec du démarrage du service Open vSwitch sur l'hôte[uuid:%s], erreur: %s", + "ORG_ZSTACK_NETWORK_OVN_10043": "échec de l'installation du package ovs sur l'hôte[uuid:%s], erreur: %s", + "ORG_ZSTACK_NETWORK_OVN_10042": "impossible de joindre le réseau L3 au groupe de sécurité car le contrôleur SDN [uuid:%s] n'est pas connecté [status:%s]", + "ORG_ZSTACK_NETWORK_OVN_10049": "échec de la synchronisation du port OVS sur l'hôte [UUID:%s] pour les interfaces réseau [%s], erreur: %s", + "ORG_ZSTACK_NETWORK_OVN_10048": "échec de l'ajout du port OVS à l'hôte [UUID:%s] pour les NICs [%s], erreur: %s", + "ORG_ZSTACK_NETWORK_OVN_10047": "échec de l'ajout du port OVS sur l'hôte [UUID:%s] pour les NICs [%s], erreur: %s", + "ORG_ZSTACK_LICENSE_10030": "Licence UKey locale non trouvée ou mise à jour avec succès. Veuillez vous assurer que votre UKey est correctement connecté et sous licence pour les services d'informatique en nuage.", + "ORG_ZSTACK_LICENSE_10031": "mettre à jour la licence de la machine virtuelle locale: %s", + "ORG_ZSTACK_LICENSE_10032": "Aucune instance de calcul disponible pour mettre à jour l'UKey", + "ORG_ZSTACK_GUESTTOOLS_KVM_10001": "échec du détachement des outils invités dans la machine virtuelle[uuid:%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10000": "échec de la récupération des informations des outils invités depuis la vm[uuid:%s], raison:%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10033": "l'ID de dispositif pci[%s] n'est pas un entier valide dans le tag[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10034": "la spécification de dispositif mdev avec l'UUID [%s] n'existe pas", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10031": "L'ID de dispositif PCI est manquant dans le tag[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10032": "L'ID de dispositif PCI doit être supérieur à 0 dans le tag[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10030": "la spécification de dispositif pci [uuid:%s] n'existe pas, dérivée du tag [%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10006": "échec de la récupération de l'état des outils invités depuis prometheus: [metric=%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10005": "échec du détachement de l'ISO des outils invités de la VM[UUID:%s], car:%s", + "ORG_ZSTACK_GUESTTOOLS_KVM_10004": "échec de l'attachement de l'ISO des outils invités à la VM[UUID:%s], car:%s", + "ORG_ZSTACK_GUESTTOOLS_KVM_10003": "échec du téléchargement de l'ISO des outils invités car aucun hôte KVM [uuid:%s] n'a été trouvé", + "ORG_ZSTACK_LICENSE_10048": "Expiration de la licence: La licence de votre environnement d'informatique en nuage a expiré. Veuillez contacter le support pour renouveler votre licence.", + "ORG_ZSTACK_LICENSE_10049": "non pris en charge: supprimer la licence[%s] de la clé matérielle", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10024": "aucune spécification de dispositif PCI disponible pour la machine virtuelle[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10025": "la spécification de dispositif PCI [uuid:%s] n'est pas disponible pour la machine virtuelle [uuid:%s].", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10023": "échec de l'obtention de la spécification de dispositif PCI disponible pour la VM[uuid:%s]: %s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10020": "l'instance vm [uuid:%s, state:%s] doit être arrêtée pour supprimer la spécification de dispositif mdev [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10027": "pourquoi le volume[uuid:%s, installPath:%s] n'est pas dans le répertoire %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10026": "l'hôte[uuid:%s] pourrait monter un stockage différent de la Politique de Gestion du Stockage[uuid:%s], veuillez vérifier cela.", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10024": "les hôtes[uuid:%s] ont le même chemin de montage mais sont en fait montés sur des stockages différents.", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10028": "Spécification de périphérique mdev [uuid:%s] non disponible pour la machine virtuelle [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10029": "L'UUID de spécification de périphérique PCI est manquant dans le tag[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10026": "Aucune spécification de périphérique mdev disponible pour la machine virtuelle[uuid:%s]", + "ORG_ZSTACK_LICENSE_10050": "La licence de plateforme hybride est déjà utilisée. Veuillez supprimer simultanément la licence de plateforme hybride et la licence des modules complémentaires hybrides à l'aide de DeleteLicenseAction avec l'UUID de licence hybride[uuid=%s].", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10011": "vm[uuid:%s] n'a pas de spécification de périphérique pci[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10012": "L'instance de vm [UUID: %s, state: %s] doit être arrêtée pour supprimer la spécification de périphérique pci [UUID: %s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10019": "vm[uuid:%s] n'a pas de spécification de périphérique mdev[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10017": "vm[uuid:%s] a déjà une spécification de périphérique mdev[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10018": "L'instance de vm [uuid:%s, state:%s] nécessite un arrêt pour définir la spécification de périphérique mdev", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10015": "L'instance de vm [uuid:%s, state:%s] nécessite un arrêt pour définir les spécifications de périphérique pci", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10009": "Impossible de trouver le groupe d'affinité [uuid:%s], il a peut-être été supprimé ou terminé", + "ORG_ZSTACK_COMPUTE_VM_10309": "IP[%s] n'est pas disponible sur le réseau VPC[uuid:%s] car: %s", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10006": "Il y a d'autres machines virtuelles sur cet hôte [uuid: %s] appartenant au même groupe d'affinité [%s]", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10005": "VM [uuid: %s] a déjà été affectée au groupe d'affinité [uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10307": "Erreur de format de l'adresse IP statique[%s]", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10008": "vm [uuid:%s] ne satisfait pas le groupe d'affinité [uuid:%s]", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10007": "affinityGroup [uuid:%s] n'a pas pu réserver l'hôte [uuid:%s] pour la machine virtuelle [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10003": "Un seul UUID parmi cluster, hôte ou VM peut être spécifié simultanément", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10008": "vm[uuid:%s] a déjà une spécification de périphérique PCI[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10006": "VM doit être en pause pour définir la spécification de périphérique PCI: uuid=%s, state=%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10007": "Type de périphérique PCI invalide: %s, les types valides pour les environnements de virtualisation cloud incluent: %s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10004": "Aucune ressource de calcul activée trouvée", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10001": "Impossible de supprimer le tag système[%s]. Le plugin de load balancer en dépend; vous pouvez uniquement le mettre à jour.", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10002": "AffinityGroup [uuid: %s] n'existe pas", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10002": "Nic avec l'UUID %s non trouvée. Veuillez corriger votre tag réseau %s du load balancer.", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10001": "VM [uuid: %s] est déjà associée au groupe d'affinité [uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10303": "Échec de la mise à jour de la priorité de vm[%s] vers [%s] à cause de %s", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10004": "Impossible d'opérer sur le groupe d'affinité [uuid: %s] qui n'est pas activé dans l'environnement cloud", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10000": "Impossible de trouver le load balancer[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10302": "VM[uuid:%s] ne peut connecter que %s périphériques CD-ROM", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10003": "Impossible d'opérer sur un groupe d'affinité créé par le système. Veuillez contacter le support pour obtenir de l'aide.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10005": "algorithme de balance[%s] invalide, les algorithmes valides sont %s", + "ORG_ZSTACK_COMPUTE_VM_10301": "VM[uuid:%s] a déjà un ISO[uuid:%s] attaché", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10006": "seuil d'échec[%s] invalide, la valeur doit être un nombre", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10003": "poids du load balancer[%s] invalide, l'ID d'instance n'est pas dans la plage [%d, %d]", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10000": "La VM peut changer son groupe d'affinité uniquement dans les états [%s,%s], mais la VM est actuellement dans l'état [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10004": "poids du balancer[%s] invalide, la valeur n'est pas un nombre", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10009": "délai d'inactivité de connexion[%s] invalide, veuillez vous assurer que %s est une valeur numérique", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10007": "seuil de santé[%s] invalide, veuillez entrer une valeur numérique", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10008": "délai de santé[%s] invalide, veuillez vous assurer que %s est une valeur numérique", + "ORG_ZSTACK_TICKET_IAM2_10002": "opération refusée car la collecte de flux [uuid:%s] n'appartient pas au projet [uuid:%s]", + "ORG_ZSTACK_TICKET_IAM2_10003": "l'ID d'instance virtuelle [uuid:%s] n'est pas autorisé à gérer le ticket [uuid:%s, name:%s]", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10004": "Les topics Kafka ne peuvent pas être nuls. Veuillez vous assurer que le nom du topic est correctement configuré.", + "ORG_ZSTACK_TICKET_IAM2_10000": "opération refusée en raison de la suppression du soumissionnaire du ticket [uuid:%s]; seule la suppression du ticket [uuid:%s, name:%s] est autorisée maintenant", + "ORG_ZSTACK_TICKET_IAM2_10001": "L'opération est refusée car le projet [UUID:%s] associé au ticket a été supprimé. Le ticket [UUID:%s, name:%s] peut uniquement être supprimé maintenant.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10001": "Le mode Syslog ne peut pas être nul", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10000": "L'index pour l'instance cloud ne peut pas être nul. Veuillez fournir une valeur d'index valide.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10003": "Le format des labels Loki devrait être clé=valeur", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10002": "Les labels Loki ne peuvent pas être nuls. Veuillez vous assurer que toutes les valeurs de label sont correctement définies.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10018": "L'adresse VTEP vxLAN pour l'hôte [UUID: %s] et le pool réseau [UUID: %s] existe déjà", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10017": "%s n'est pas une adresse IPv4 valide", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10016": "ip[%s] l2NetworkUuid[%s] clusterUuid[%s] L'adresse IP existe dans la table VTEP locale", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10021": "impossible de créer la plage VNI car L2 UUID[%s] ne fait pas partie du pool réseau VXLAN", + "ORG_ZSTACK_ALIYUN_CORE_IDENTITYZONE_10000": "doit spécifier zoneId pour les réseaux privés Aliyun VPC", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10012": "ID d'instance[%s] invalide, %s n'est pas un identifiant d'instance valide", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10010": "intervalle de health check[%s] invalide, la valeur doit être un nombre", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10011": "valeur de connexion maximale[%s] invalide, veuillez vous assurer que %s est une valeur numérique", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10016": "cible de health check[%s] invalide, le port[%s] doit être une valeur numérique", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10017": "échec de l'attachement du VIP au load balancer car le VIP[%s] n'a pas d'adresse IP associée", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10014": "cible de health check[%s] invalide, le protocole de vérification[%s] est invalide, les protocoles valides sont %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10015": "cible de vérification de santé invalide[%s], le port[%s] n'est pas dans la plage valide de [1, 65535]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10018": "échec de l'attachement du VIP IPv4 à l'équilibreur de charge car l'équilibreur de charge[%s] possède déjà un VIP IPv4[%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10009": "échec de la réalisation du pool réseau VXLAN[uuid:%s, type:%s] sur l'hôte KVM[uuid:%s], car %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10019": "échec de l'attachement du VIP IPv6 à l'équilibreur de charge car l'équilibreur de charge[%s] possède déjà un VIP IPv6[%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10004": "échec de la création du pont[%s] pour l2Network[uuid:%s, type:%s, vni:%d] sur l'hôte KVM[uuid:%s], car %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10003": "échec de trouver le VTEP sur l'hôte[UUID: %s], veulliez rattacher le pool VXLAN[UUID: %s] au cluster.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10002": "Plusieurs adresses IP VTEP [%s] trouvées pour un seul hôte [UUID:%s]. Veuillez supprimer l'hôte et l'ajouter à nouveau.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10008": "échec de la validation du cidr[%s] pour l2VxlanNetworkPool[uuid:%s, name:%s] sur l'hôte kvm[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10007": "échec de la suppression du pont[%s] pour l2Network[uuid:%s, type:%s, vni:%s] sur l'hôte KVM[uuid:%s], en raison de %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10006": "échec de la validation du cidr[%s] pour l2VxlanNetwork[uuid:%s, name:%s] sur l'hôte kvm[uuid:%s], %s", + "ORG_ZSTACK_CRYPTO_CCS_10001": "l'utilisateur[uuid=%s] n'existe pas dans l'environnement cloud", + "ORG_ZSTACK_CRYPTO_CCS_10002": "L'UUID du certificat est manquant et la balise système UKey n'existe pas. Veuillez vous assurer que les deux sont correctement configurés.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10020": "impossible de supprimer le vip[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10023": "type de fournisseur de service incompatible détecté. L'équilibreur de charge [uuid:%s] est fourni par le fournisseur de service [type:%s], mais un nouveau fournisseur de service de [type:%s] est tenté.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10024": "Il existe un écouteur avec le même port [%s] et le même équilibreur de charge [UUID:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10022": "impossible de récupérer le type de fournisseur de service pour l'écouteur de l'équilibreur de charge [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10027": "poids d'équilibreur invalide pour l'interface réseau: %s, %d n'est pas dans la plage valide [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10028": "Impossible de récupérer le vmnic candidat car l'UUID de l'équilibreur de charge et l'UUID du groupe de serveurs ne sont pas spécifiés. Veuillez vous assurer que ces identifiants sont correctement spécifiés.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10026": "paramètres de vérification de santé invalides[%s], le format doit être method:URI:status_codes, par exemple, GET:/index.html:http_2xx", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10029": "Impossible de récupérer le réseau de couche 3 candidat car l'UUID de l'équilibreur de charge et l'UUID du groupe de serveurs ne sont pas spécifiés.", + "ORG_ZSTACK_CRYPTO_CCS_10008": "certificat[uuid=%s] non trouvé dans le magasin de certificats", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10030": "impossible de détacher le VM NIC de l'écouteur de l'équilibreur de charge[uuid:%s] car le groupe de serveurs par défaut associé à l'écouteur a été supprimé", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10031": "Impossible de créer l'équilibreur de charge car les paramètres VIP et IPv6 VIP sont vides. Veuillez fournir des adresses IP valides.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10034": "Le VIP de l'équilibreur de charge [%s] ne doit pas être la première ou la dernière adresse IP dans un bloc CIDR associé à un type de pool d'adresses publiques.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10035": "échec de la création de l'équilibreur de charge car le paramètre vipUuid pointe vers le VIP[%s] qui n'est pas une interface de machine virtuelle IPv4", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10032": "Impossible de créer l'équilibreur de charge car le réseau de couche 3 du VIP et du VIP IPv6 ne sont pas le même réseau de couche 3. Veuillez vous assurer qu'ils sont dans le même réseau de couche 3.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10033": "Le VIP [UUID:%s] a été occupé par une autre entité de service réseau [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10038": "échec de l'opération, entrée IP dupliquée/surcharge dans %s du groupe de liste de contrôle d'accès:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10039": "échec de l'opération, le format IP supporte uniquement ip/iprange/cidr, mais %s trouvé", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10036": "échec de la création d'un équilibreur de charge car le paramètre ipv6VipUuid pointe vers le VIP [%s], qui n'est pas un VIP IPv6", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10037": "échec de l'opération, version IP %d non prise en charge", + "ORG_ZSTACK_VPC_HA_10001": "Impossible de mettre à jour ce service réseau car le VPC [UUID:%s] ne prend pas en charge les mises à jour de la version du service réseau.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10025": "L2Network[uuid:%s] n'est pas de type L2VxlanNetwork", + "ORG_ZSTACK_VPC_HA_10002": "Impossible de mettre à jour ce service réseau car le VPC [UUID:%s] utilise une version du noyau obsolète:[%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10024": "vlan[%s] n'est pas un VNI valide", + "ORG_ZSTACK_VPC_HA_10003": "Impossible d'appliquer la translation d'adresse réseau source avec un réseau public non par défaut car la fonctionnalité multi-SNAT est désactivée.", + "ORG_ZSTACK_VPC_HA_10004": "Impossible d'appliquer SNAT avec ce réseau L3 car le réseau L3 [uuid:%s] est un réseau privé.", + "ORG_ZSTACK_VPC_HA_10005": "Impossible d'appliquer SNAT avec ce réseau L3 car le réseau L3 [uuid:%s] n'est pas attaché à un routeur VPC", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10029": "format CIDR incorrect dans le tag système [%s]", + "ORG_ZSTACK_VPC_HA_10006": "adresse IP de surveillance cloud invalide [%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10028": "tag système [%s] incorrect, doit être l'un des suivants: [EC2, GCE, AWS_VPC]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10027": "Veuillez entrer un tag système comme: [%s]", + "ORG_ZSTACK_VPC_HA_10008": "vpcHaRouter [uuid:%s] a été supprimé", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10042": "Impossible d'attacher le groupe de sécurité [%s] avec une version IP différente à LoadBalancer [%s].", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10031": "le pool réseau vXLAN ne prend pas en charge la création de réseaux L3.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10040": "plage IP [%s, %s] chevauche avec l'IP de début: %s et l'IP de fin: %s du groupe de liste de contrôle d'accès: %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10030": "chevauchement de la plage VNI avec %s [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10045": "les groupes de liste de contrôle d'accès[uuid:%s] ne peuvent être associés qu'à un écouteur d'équilibreur de charge et doivent être attribués à un groupe de serveurs.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10046": "l'attachement des groupes de liste de contrôle d'accès[uuid:%s] à l'écouteur d'équilibreur de charge[uuid:%s] doit être HTTPS ou HTTP", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10043": "domaine[%s], url[%s] règle de redirection en double/chevauchement avec le groupe de liste de contrôle d'accès:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10044": "les groupes de liste de contrôle d'accès[uuid:%s] sont configurés pour rediriger, mais certaines entrées de liste de contrôle d'accès manquent de règle de redirection et contiennent des entrées IP.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10049": "le groupe de liste de contrôle d'accès[uuid:%s] a été attaché à un autre écouteur d'équilibreur de charge[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10048": "le groupe de liste de contrôle d'accès[uuid:%s] ne contient pas de règle de redirection", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10001": "Le compte n'a pas de VIP attribués.", + "ORG_ZSTACK_COMPUTE_VM_10239": "CreateVmMsg ne peut pas être null. Veuillez vous assurer que le message de demande est correctement initialisé avant de soumettre la demande.", + "ORG_ZSTACK_COMPUTE_VM_10237": "zoneUuid doit être spécifié car l'image est située sur plusieurs stockages de sauvegarde.", + "ORG_ZSTACK_COMPUTE_VM_10236": "aucun réseau de couche2 trouvé dans les clusters qui sont attachés aux stockages principaux[uuids:%s]", + "ORG_ZSTACK_COMPUTE_VM_10235": "Les stockages principaux avec les UUIDs:%s n'ont attaché aucun cluster dans la zone avec l'UUID:%s.", + "ORG_ZSTACK_COMPUTE_VM_10234": "aucun stockage principal accessible au stockage de sauvegarde[uuid:%s, type:%s] n'est trouvé", + "ORG_ZSTACK_COMPUTE_VM_10233": "L'image avec l'UUID [uuid:%s] n'est stockée sur aucun stockage de sauvegarde attaché à la zone avec l'UUID [uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_10232": "Le certificat TLS Spice n'existe pas. Veuillez vérifier si TLS Spice est activé.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10002": "Impossible de créer l'instance de routeur virtuel car le réseau du routeur virtuel chevauche un réseau privé dans la configuration IP.%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10001": "Échec de la suppression de l'ISO de démarrage du routeur virtuel[%s] sur l'hôte KVM[uuid:%s] pour le routeur virtuel[uuid:%s], car %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10000": "Échec de la création de l'ISO de démarrage du routeur virtuel[%s] sur l'hôte KVM[uuid:%s, ip:%s] pour le routeur virtuel[uuid:%s], car %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10005": "Le réseau de l'instance de routeur virtuel avec UUID:%s ne peut pas être le même que le réseau L3 privé UUID:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10004": "Aucune offre d'instance de routeur virtuel avec UUID:%s n'a été trouvée", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10009": "Impossible d'ajouter la plage d'adresses IP car le réseau L3 [UUID:%s] est un réseau de gestion du routeur virtuel", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10008": "Impossible d'ajouter la plage d'adresses IP car le réseau L3 [UUID:%s] est un réseau de gestion d'une offre de routeur virtuel", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10007": "Échec du démarrage du L3 du routeur virtuel [UUID: %s]", + "ORG_ZSTACK_COMPUTE_VM_10242": "Échec de la gestion de la paire de clés SSH lors de la création de la machine virtuelle car [%s]", + "ORG_ZSTACK_COMPUTE_VM_10241": "Échec de la gestion de la balise système lors de la création de la machine virtuelle car [%s]", + "ORG_ZSTACK_COMPUTE_VM_10240": "Échec de l'instanciation de la balise système pour la machine virtuelle car %s", + "ORG_ZSTACK_COMPUTE_VM_10249": "cpuCores doit être une valeur entière valide", + "ORG_ZSTACK_COMPUTE_VM_10248": "cpuSockets doit être un entier positif représentant le nombre de sockets CPU.", + "ORG_ZSTACK_COMPUTE_VM_10247": "boot device[%s] invalide dans la liste d'ordre de démarrage[%s]", + "ORG_ZSTACK_COMPUTE_VM_10246": "Conflit détecté pour le nom d'hôte dans les balises système ; une autre machine virtuelle avec UUID %s possède déjà le nom d'hôte %s sur le réseau L3 UUID %s", + "ORG_ZSTACK_COMPUTE_VM_10245": "Une seule balise système de nom d'hôte est autorisée, mais %s a été reçu", + "ORG_ZSTACK_COMPUTE_VM_10244": "Le nom d'hôte[%s] spécifié dans la balise système n'est pas un nom de domaine valide", + "ORG_ZSTACK_COMPUTE_VM_10243": "Impossible d'activer cette fonction. La machine virtuelle [uuid: %s] possède plusieurs cartes d'interface réseau (NIC) associées au réseau L3 [uuid: %s].", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10013": "Échec de la mise à jour du réseau par défaut du routeur virtuel [uuid:%s] car %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10012": "Échec de l'attachement des services réseau du routeur virtuel au réseau L3[uuid:%s]. La sélection du transfert de ports nécessite une configuration SNAT.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10011": "Échec de l'attachement des services réseau du routeur virtuel au réseau L3[uuid:%s]. Lorsque l'adresse IP élastique (EIP) est sélectionnée, la traduction d'adresse réseau source (SNAT) doit également être configurée.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10010": "Impossible d'ajouter l'image car la balise système [%s] contient un type d'image d'appliance [%s] invalide", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10017": "Le routeur virtuel [name:%s, uuid:%s, état actuel:%s] n'est pas opérationnel et ne peut pas effectuer l'opération requise. Veuillez réessayer une fois qu'il est en cours d'exécution.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10015": "Échec de la synchronisation des VIP [ips: %s] sur le routeur virtuel [uuid:%s] pour la migration à chaud du routeur virtuel car %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10014": "VirtualMachineType %s invalide", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10000": "Impossible de changer le propriétaire de la ressource car l'instance de machine virtuelle [uuid:%s] est déjà associée à un groupe de sécurité", + "ORG_ZSTACK_TEST_COMPUTE_HOSTALLOCATOR_10000": "Dans un but précis : Cette action est intentionnelle et s'aligne sur la conception de notre architecture d'informatique en nuage. Veuillez vous assurer que toutes les configurations de machines virtuelles sont conformes à nos normes de sécurité et de performance.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10019": "Le routeur virtuel[uuid:%s] n'a pas d'interface de gestion capable d'effectuer un appel HTTP vers %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10018": "Le routeur virtuel [uuid: %s] est dans un état %s qui ne permet pas d'effectuer des appels HTTP vers %s", + "ORG_ZSTACK_COMPUTE_VM_10253": "seul un tag système bootMode est autorisé, mais %d tags ont été trouvés", + "ORG_ZSTACK_COMPUTE_VM_10252": "Une machine virtuelle devrait avoir au maximum un tag système de données utilisateur.", + "ORG_ZSTACK_COMPUTE_VM_10251": "Un tag système défini par l'utilisateur existe déjà pour VM[uuid: %s].", + "ORG_ZSTACK_COMPUTE_VM_10250": "cpuThreads doit être une valeur entière", + "ORG_ZSTACK_COMPUTE_VM_10259": "redirection USB invalide[%s], %s n'est pas un tag USBRedirect valide", + "ORG_ZSTACK_COMPUTE_VM_10258": "paramètre invalide[%s], la valeur [%s] n'est pas de type booléen", + "ORG_ZSTACK_COMPUTE_VM_10257": "tag de format invalide[%s]", + "ORG_ZSTACK_COMPUTE_VM_10256": "le type de machine vm nécessite [q35, pcie, virtual], mais [%s] a été obtenu", + "ORG_ZSTACK_COMPUTE_VM_10254": "[%s] spécifié dans le tag système [%s] n'est pas un mode de démarrage valide pour le déploiement d'instance cloud.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10020": "impossible d'ajouter l'interface réseau [ip:%s, ip6:%s, mac:%s] au routeur virtuel pour la machine virtuelle [uuid:%s ip:%s], car %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10024": "impossible de définir le réseau par défaut car l'UUID L3[:%s] fait référence à un réseau de gestion", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10023": "l'UUID L3 [%s] n'est pas associé au routeur virtuel [UUID:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10022": "l'uuid L3[:%s] est identique au réseau par défaut du routeur virtuel [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10021": "impossible d'ajouter l'IP du serveur au groupe de serveurs de l'équilibreur de charge car l'équilibreur de charge partagé n'a pas de fournisseur de services. Veuillez d'abord ajouter une interface réseau virtuelle (VMNIC).", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10010": "Échec de création du VIP car la version du réseau virtuel n'a pas pu être déterminée. Veuillez vérifier vos paramètres de configuration réseau.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10012": "le fournisseur de services du VIP[UUID:%s, name:%s, IP:%s] a été défini sur %s", + "ORG_ZSTACK_TICKET_EXECUTOR_10001": "échec de récupération de la valeur de l'événement : %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10025": "impossible de définir le réseau par défaut car l'UUID L3[:%s] n'est pas un réseau public", + "ORG_ZSTACK_TICKET_EXECUTOR_10000": "Aucune classe API [name:%s] n'a été trouvée dans l'espace de noms spécifié. Veuillez vous assurer que le nom de la classe et l'espace de noms sont corrects.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10016": "impossible de définir le groupe de sécurité VM NIC car le VM NIC [uuid:%s] n'est attaché à aucun groupe de sécurité", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10015": "impossible de définir le groupe de sécurité VM NIC car le VM NIC [UUID:%s] n'a pas été trouvé", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10007": "requiredIp[%s] n'est pas une adresse IPv4 valide", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10018": "impossible de définir le groupe de sécurité VM NIC en raison d'une priorité invalide ; la priorité[%d] doit être supérieure ou égale à 1", + "ORG_ZSTACK_COMPUTE_10003": "la bande passante sortante[%d] de l'interface réseau de la machine virtuelle est hors de la plage valide [8192, 32212254720]", + "ORG_ZSTACK_COMPUTE_VM_10264": "vm[uuid:%s, name:%s] a été terminée", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10017": "impossible de définir le groupe de sécurité VM NIC car le groupe de sécurité[uuid:%s] n'a pas été trouvé", + "ORG_ZSTACK_COMPUTE_10004": "la bande passante entrante du VM NIC dépasse la plage valide [8192, 32212254720]", + "ORG_ZSTACK_COMPUTE_VM_10263": "La ressource[uuid:%s] est un volume racine, et vous ne pouvez pas modifier directement son propriétaire. Modifiez plutôt le propriétaire de la machine virtuelle à laquelle appartient le volume racine.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10009": "l'adresse IP requise [%s] est déjà allouée", + "ORG_ZSTACK_COMPUTE_10001": "VM NIC l3NetworkUuid ne peut pas être nul", + "ORG_ZSTACK_COMPUTE_VM_10262": "rootDiskOfferingUuid ne peut pas être nul lors de la création d'une VM sans image.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10008": "Il existe déjà un VIP[%s] associé au réseau L3[UUID:%s].", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10019": "impossible de définir le groupe de sécurité VM NIC en raison de priorité dupliquée ; les deux groupes de sécurité %s et %s ont la priorité %d", + "ORG_ZSTACK_COMPUTE_10002": "l3NetworkUuid de VM NIC n'est pas dans l3[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10003": "impossible de supprimer l'ip, car ip[uuid:%s] est une IP virtuelle", + "ORG_ZSTACK_COMPUTE_VM_10260": "usbRedirect[%s] invalide, %s n'est pas de type booléen", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10002": "Le statut VIP ne peut pas être accédé par ce compte. Veuillez vérifier les permissions de votre compte et réessayer.", + "ORG_ZSTACK_COMPUTE_10000": "Paramètres d'interface réseau dupliqués détectés. Veuillez vous assurer que chaque interface réseau a des paramètres uniques.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10005": "stratégie d'allocation IP[%s] non prise en charge", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10004": "Le VIP système ne peut pas être supprimé via l'API. Veuillez contacter le support pour obtenir de l'aide.", + "ORG_ZSTACK_COMPUTE_VM_10269": "la VM[UUID:%s] n'a pas de NIC attachée au réseau L3[UUID:%s]", + "ORG_ZSTACK_COMPUTE_10007": "le pilote réseau VM %s n'est pas encore pris en charge", + "ORG_ZSTACK_COMPUTE_VM_10268": "état non reconnu de la VM[uuid:%s] sur l'hôte[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10267": "échec de la vérification de l'état de la VM [uuid:%s] sur l'hôte [uuid:%s], %s", + "ORG_ZSTACK_COMPUTE_10005": "le nombre de files d'attente multiples [%d] de l'interface réseau VM est hors de la plage valide [1, 256]", + "ORG_ZSTACK_COMPUTE_10006": "vm nic de l3[uuid:%s] état[%s] n'est pas dans l'état attendu ou %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10031": "impossible de créer l'offre de routeur virtuel car le réseau de gestion ne prend pas encore en charge IPv6", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10030": "le réseau de gestion [uuid:%s] n'est pas dans la même zone de disponibilité [uuid:%s] que celle où cette offre est destinée à être créée.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10035": "Le réseau L3 [UUID: %s] a le service SNAT activé ; par conséquent, il ne peut pas être utilisé comme réseau de gestion.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10034": "image[uuid:%s] est d'un format non pris en charge %s, ne peut pas être utilisée pour la configuration du routeur virtuel", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10033": "le type de média de l'image[uuid:%s] est %s, qui ne respecte pas l'exigence pour une image de routeur virtuel, dont le type de média doit être %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10032": "le réseau public avec UUID %s n'est pas dans la même zone de disponibilité que celle où cette offre est destinée à être créée.", + "ORG_ZSTACK_STORAGE_VOLUME_10087": "L'image avec UUID [uuid:%s] et nom [name:%s] a été supprimée de tout le stockage de sauvegarde.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10039": "le réseau de gestion [UUID:%s, gateway:%s] est inaccessible", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10038": "le réseau de gestion[uuid:%s] n'a aucune plage IP configurée", + "ORG_ZSTACK_STORAGE_VOLUME_10086": "le type de stockage principal [%s] ne prend pas encore en charge les volumes partagés", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10037": "Le réseau L3 avec UUID [uuid: %s] a la même adresse réseau que [uuid: %s] et ne peut pas être utilisé pour le routeur virtuel.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10036": "Le réseau L3 [UUID: %s] a les services SNAT activés et ne peut pas être utilisé comme réseau public.", + "ORG_ZSTACK_STORAGE_VOLUME_10088": "impossible de trouver un stockage de sauvegarde qui satisfait aux conditions suivantes pour l'image[uuid:%s] : 1. l'état est Activé 2. le statut est Connecté 3. est attaché à la zone où le stockage principal[uuid:%s] réside.", + "ORG_ZSTACK_STORAGE_VOLUME_10083": "UUID de volume dupliqués : %s", + "ORG_ZSTACK_STORAGE_VOLUME_10082": "Impossible d'annuler vers un snapshot qui n'est pas le plus récent", + "ORG_ZSTACK_STORAGE_VOLUME_10085": "Échec de l'obtention du type de stockage principal", + "ORG_ZSTACK_STORAGE_VOLUME_10092": "Le volume cible a été éliminé pendant la création du volume.%s", + "ORG_ZSTACK_STORAGE_VOLUME_10091": "Conflit d'UUID de stockage principal, le stockage principal spécifié par l'offre de disque est %s, et le stockage principal spécifié dans le paramètre de création est %s", + "ORG_ZSTACK_STORAGE_VOLUME_10093": "Il ne devrait pas y avoir plus d'une implémentation de machine virtuelle %s.", + "ORG_ZSTACK_STORAGE_VOLUME_10096": "Impossible de télécharger l'ISO vers le stockage principal car : %s", + "ORG_ZSTACK_ZDFS_10000": "Le ping vers zDFS a échoué, %s", + "ORG_ZSTACK_COMPUTE_VM_10204": "Format JSON invalide, causes : %s", + "ORG_ZSTACK_COMPUTE_VM_10203": "l3NetworkUuids et vmNicInventories ne doivent pas être tous les deux vides ou tous les deux définis simultanément.", + "ORG_ZSTACK_COMPUTE_VM_10200": "Le volume[uuid:%s] n'a pas pu satisfaire les exigences [état:Enabled statut:Ready]", + "ORG_ZSTACK_COMPUTE_VM_10219": "Cette API a été dépréciée et n'est plus prise en charge dans les environnements d'informatique en nuage. Veuillez envisager d'utiliser l'API disponible la plus récente pour vos opérations.", + "ORG_ZSTACK_COMPUTE_VM_10218": "Impossible de mettre à jour le mot de passe de la console pour VM[uuid:%s] car aucun mot de passe de console n'est actuellement configuré.", + "ORG_ZSTACK_ZDFS_10002": "Il y a eu un problème ZDFS avec le nom d'hôte[%s]", + "ORG_ZSTACK_ZDFS_10001": "La connexion à zDFS a échoué, %s", + "ORG_ZSTACK_COMPUTE_VM_10217": "Impossible de mettre à jour le mot de passe de la console pour VM[uuid:%s] car il n'est pas dans l'état 'Running'. L'état actuel est '%s'.", + "ORG_ZSTACK_COMPUTE_VM_10216": "Le mot de passe de la console ne doit pas commencer par \"password\" pour éviter les vulnérabilités de sécurité VNC.", + "ORG_ZSTACK_COMPUTE_VM_10215": "Ne pas autoriser le montage du même fichier ISO plusieurs fois", + "ORG_ZSTACK_COMPUTE_VM_10214": "La machine virtuelle avec l'UUID [uuid=%s] n'existe pas", + "ORG_ZSTACK_COMPUTE_VM_10220": "TheCdRom[%s]IsAlreadytheDefault", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10002": "Le nom d'hôte de votre instance de nuage ne peut pas être null. Veuillez fournir un nom d'hôte valide.", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10000": "facilityId ne peut pas être null", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10001": "Installation de journalisation invalide %s", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10006": "serveur syslog[adresse : %s] est indisponible", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10007": "serveur syslog[adresse : %s:%s] est indisponible", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10004": "Le protocole ne peut pas être null. Veuillez vous assurer qu'un protocole valide est fourni.", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10005": "protocole %s non pris en charge dans l'environnement d'informatique en nuage", + "ORG_ZSTACK_COMPUTE_VM_10228": "Adresse MAC unicast attendue, adresse MAC multicast trouvée [%s]", + "ORG_ZSTACK_COMPUTE_VM_10227": "Adresse réseau %s non autorisée pour l'instance %d", + "ORG_ZSTACK_COMPUTE_VM_10226": "Adresse MAC invalide [%s]", + "ORG_ZSTACK_COMPUTE_VM_10225": "Ceci n'est pas une adresse MAC valide [%s]", + "ORG_ZSTACK_COMPUTE_VM_10224": "La topologie du CPU est incorrecte. Cœurs CPU réels : %s, sockets configurés : %s, cœurs par socket : %s, threads par cœur : %s ; Sockets calculés : %s, cœurs : %s, threads : %s", + "ORG_ZSTACK_COMPUTE_VM_10221": "vm[uuid:%s] ne peut effectuer fstrim que lorsque son état est Running ; l'état actuel est %s", + "ORG_ZSTACK_STORAGE_VOLUME_10046": "Le volume avec l'UUID [%s] n'est pas dans un état supprimé. Cette opération vise à récupérer un volume de données précédemment supprimé.", + "ORG_ZSTACK_STORAGE_VOLUME_10049": "image[uuid:%s] n'est pas Enabled, elle est %s", + "ORG_ZSTACK_STORAGE_VOLUME_10048": "image[uuid:%s] n'est pas du type attendu, elle est de type %s", + "ORG_ZSTACK_STORAGE_VOLUME_10042": "volume[uuid:%s] n'est pas dans l'état enabled, l'état actuel est %s, la création d'un instantané n'est pas possible", + "ORG_ZSTACK_STORAGE_VOLUME_10045": "volume[uuid:%s] n'est pas disponible pour la création d'un instantané, le statut actuel est %s", + "ORG_ZSTACK_STORAGE_VOLUME_10044": "Impossible de prendre un instantané de la mémoire, l'état actuel de la VM [%s], mais les états attendus sont [%s, %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10041": "volume[uuid:%s, type:%s], impossible de créer un instantané", + "ORG_ZSTACK_LOGIN_10022": "Attribut invalide. L'attribut [%s] est requis, mais certains enregistrements [%s] ne correspondent pas. Veuillez vous assurer que tous les attributs sont correctement spécifiés et appariés.", + "ORG_ZSTACK_LOGIN_10024": "strategy est un champ obligatoire %", + "ORG_ZSTACK_LOGIN_10023": "Format JSON invalide pour les données de configuration cloud. Veuillez vous assurer que tous les champs JSON sont correctement formatés et respectent le schéma spécifié.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10007": "keyLabel %s et encryptedResult %s sont incohérents", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10006": "flkSec securityMachine non sain : %s", + "ORG_ZSTACK_LOGIN_10029": "name doit utiliser des valeurs comprises dans la plage de paramètres spécifiée %s", + "ORG_ZSTACK_LOGIN_10026": "attribute est obligatoire pour le provisioning des ressources cloud %", + "ORG_ZSTACK_LOGIN_10025": "name est un champ obligatoire %", + "ORG_ZSTACK_LOGIN_10028": "optional est un champ obligatoire pour la configuration de machine virtuelle%", + "ORG_ZSTACK_LOGIN_10027": "type est un champ obligatoire %", + "ORG_ZSTACK_STORAGE_VOLUME_10058": "Le volume racine [uuid:%s, name:%s] ne peut pas être attaché.", + "ORG_ZSTACK_STORAGE_VOLUME_10057": "la VM [UUID:%s] ne prend pas en charge l'attachement en ligne du volume [%s] car son type de plateforme d'image est incompatible.", + "ORG_ZSTACK_STORAGE_VOLUME_10059": "le volume de données [UUID:%s] est désactivé ; l'attachement n'est pas autorisé.", + "ORG_ZSTACK_STORAGE_VOLUME_10054": "le volume de données [UUID:%s] n'est attaché à aucune machine virtuelle et ne peut donc pas être détaché.", + "ORG_ZSTACK_STORAGE_VOLUME_10053": "volume[uuid:%s] est dans le statut [%s], le volume de données ne peut être attaché que lorsque le statut est available ou attaching", + "ORG_ZSTACK_STORAGE_VOLUME_10056": "le volume [uuid:%s, name:%s, type:%s] ne peut pas être détaché", + "ORG_ZSTACK_CORE_PLUGIN_10001": "plugin[%s] name, product key et vendor ne peuvent pas être null", + "ORG_ZSTACK_STORAGE_VOLUME_10055": "Pour détacher un volume de données partageable avec l'UUID [%s], l'UUID de la machine virtuelle est requis.", + "ORG_ZSTACK_STORAGE_VOLUME_10050": "image[uuid:%s] n'est pas Ready, elle est dans l'état %s", + "ORG_ZSTACK_STORAGE_VOLUME_10052": "volume[uuid:%s] est dans l'état [%s], un volume de données ne peut être attaché que lorsque son état est %s", + "ORG_ZSTACK_STORAGE_VOLUME_10051": "le volume racine [uuid:%s] ne peut pas être attaché à une machine virtuelle", + "ORG_ZSTACK_LOGIN_10011": "Échec de la validation de l'entrée DNS [%s], elle a peut-être été supprimée", + "ORG_ZSTACK_CORE_PLUGIN_10000": "nom de plugin inconnu pour le produit cloud: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10069": "le volume[uuid:%s, type:%s] ne peut pas être supprimé", + "ORG_ZSTACK_STORAGE_VOLUME_10068": "Paramètres de taille de disque inattendus pour la machine virtuelle %s. Veuillez vous assurer que la taille de disque spécifiée est dans la plage autorisée et compatible avec la configuration de votre environnement cloud.", + "ORG_ZSTACK_STORAGE_VOLUME_10065": "Impossible de joindre un volume à la VM, aucun cluster de calcul disponible", + "ORG_ZSTACK_STORAGE_VOLUME_10064": "le volume de données avec UUID [%s] a un format [%s] qui ne peut être joint qu'à un hyperviseur de type [%s], mais la VM a un type d'hyperviseur de [%s]. Par conséquent, la jointure n'est pas possible.", + "ORG_ZSTACK_RESOURCECONFIG_10009": "le compte n'a pas accès à la ressource[uuid: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10067": "Il n'est pas autorisé de sauvegarder le volume root, uuid:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10066": "Impossible de joindre un volume à la VM s'exécutant sur l'hôte[uuid: %s] qui est déconnecté du stockage du volume[uuid: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10061": "le volume de données [UUID:%s] a été joint à une autre machine virtuelle et ne peut pas être joint à nouveau.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_10000": "l'attribut[name:%s] est un attribut réservé qui ne peut pas être mis à jour dans les environnements d'informatique en nuage.", + "ORG_ZSTACK_NETWORK_OVN_10074": "Le contrôleur SDN OVN [UUID: %s, Nom: %s] est en état Déconnecté; impossible d'ajouter l'hôte [UUID: %s].", + "ORG_ZSTACK_STORAGE_VOLUME_10060": "Le volume avec UUID [%s] est dans un état supprimé; par conséquent, l'opération ne peut pas être effectuée.", + "ORG_ZSTACK_NETWORK_OVN_10073": "échec de l'ajout du commutateur logique[uuid:%s, name:%s] au contrôleur OVN[uuid:%s, ip:%s], parce que %s", + "ORG_ZSTACK_STORAGE_VOLUME_10063": "le volume de données avec UUID [%s] de format [%s] n'est pas supporté pour la jointure à n'importe quel hyperviseur.", + "ORG_ZSTACK_STORAGE_VOLUME_10062": "le volume de données ne peut être joint que lorsque le statut est [actif, disponible], le statut actuel est %s", + "ORG_ZSTACK_NETWORK_OVN_10071": "échec de la synchronisation du commutateur logique vers le contrôleur OVS[uuid:%s, ip:%s], en raison de %s", + "ORG_ZSTACK_LOGIN_10000": "ZStack charge actuellement les organisations LDAP à partir de la base de données; veuillez ne pas exécuter d'opérations de synchronisation pour le moment.", + "ORG_ZSTACK_NETWORK_OVN_10078": "NfvInstance[uuid:%s] non trouvé", + "ORG_ZSTACK_NETWORK_OVN_10077": "Le réseau L2 [UUID:%s] n'est pas joint au contrôleur OVN", + "ORG_ZSTACK_NETWORK_OVN_10076": "échec de la suppression du port du commutateur logique du contrôleur OVS[uuid:%s, ip:%s], parce que %s", + "ORG_ZSTACK_STORAGE_VOLUME_10070": "le volume[uuid:%s] est déjà dans l'état supprimé", + "ORG_ZSTACK_LOGIN_10001": "Échec de la synchronisation de l'entrée LDAP[], parce que %s", + "ORG_ZSTACK_NETWORK_OVN_10075": "échec de l'ajout des ports du commutateur logique au contrôleur OVN[uuid:%s, ip:%s], parce que %s", + "ORG_ZSTACK_V2V_10037": "l'hôte[uuid:%s] n'est pas connecté", + "ORG_ZSTACK_V2V_10038": "le primaryStorage[uuid%s] n'est pas connecté", + "ORG_ZSTACK_V2V_10035": "impossible d'allouer %d octets sur l'hôte de conversion[uuid:%s], il manque de capacité disponible", + "ORG_ZSTACK_NETWORK_OVN_10079": "NfvInstanceGroup[uuid:%s] non trouvé", + "ORG_ZSTACK_LOGIN_10008": "Échec de la validation de l'UID[%s], possibly dû à la suppression ou à l'expiration", + "ORG_ZSTACK_LOGIN_10007": "Impossible de synchroniser le serveur LDAP/AD dont la portée n'est pas %s", + "ORG_ZSTACK_V2V_10031": "Étiquette de système QoS invalide pour la migration V2V Veuillez vérifier l'étiquette du système et vous assurer qu'elle est conforme aux normes de l'informatique en nuage.", + "ORG_ZSTACK_V2V_10032": "bande passante réseau invalide[%s], elle doit être supérieure ou égale à 1048576 octets par seconde", + "ORG_ZSTACK_LOGIN_10009": "Échec de la création de l'ID virtuel IAM pour UID[%s], car %s", + "ORG_ZSTACK_LOGIN_10004": "échec de la synchronisation de l'organisation LDAP dans l'environnement cloud", + "ORG_ZSTACK_BAREMETAL2_10001": "Configuration IPMI Chassis invalide : Le paramètre 'reboot' doit être défini sur 'No' lorsque le paramètre 'provisionIp' est fourni.", + "ORG_ZSTACK_V2V_10030": "il y a eu une migration de VM depuis l'hôte avec hostUuid %s", + "ORG_ZSTACK_BAREMETAL2_10002": "Configuration IPMI Chassis invalide : Le 'platform' doit être spécifié comme 'Linux' lorsque 'provisionIp' est fourni.", + "ORG_ZSTACK_LOGIN_10006": "Échec de la synchronisation des organisations car %s", + "ORG_ZSTACK_LOGIN_10005": "Échec de la transformation de l'entrée LDAP en nœud organisationnel", + "ORG_ZSTACK_BAREMETAL2_10000": "Configuration IPMI Chassis invalide : Le 'provisionType' doit être défini sur 'Direct' lorsque 'provisionIp' est spécifié.", + "ORG_ZSTACK_STORAGE_VOLUME_10079": "impossible de détacher le volume [%s] de l'instance. il a peut-être déjà été détaché", + "ORG_ZSTACK_STORAGE_VOLUME_10076": "impossible d'attacher le volume[%s] à l'hôte[%s], car il est actuellement attaché à l'hôte[%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10075": "Le chemin de montage doit être un chemin absolu. Veuillez fournir un chemin absolu valide.", + "ORG_ZSTACK_NETWORK_OVN_10080": "NfvInstanceGroup[uuid:%s] n'a pas d'IP virtuelle configurée", + "ORG_ZSTACK_STORAGE_VOLUME_10078": "impossible d'attacher le volume[%s] à l'hôte[%s], car un autre volume occupe le chemin de montage[%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10077": "impossible d'attacher le volume [%s] à l'hôte [%s] car il est déjà monté sur le chemin [%s] sur l'hôte [%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10072": "Il n'est pas autorisé de modifier l'état du volume racine, UUID: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10071": "impossible de supprimer le volume [%s] car il est attaché à l'hôte [%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10074": "impossible d'attacher le volume[%s] à l'instance[%s], car l'instance[status:%s] n'est pas opérationnelle", + "ORG_ZSTACK_NETWORK_OVN_10083": "Échec de la mise à jour des nœuds du cluster OVN pour l'instance NFV [uuid:%s], car %s", + "ORG_ZSTACK_STORAGE_VOLUME_10073": "impossible de modifier l'état du volume car il est attaché à l'hôte %s", + "ORG_ZSTACK_NETWORK_OVN_10082": "Aucune instance trouvée pour la configuration du cluster dans NfvInstanceGroup[uuid:%s]", + "ORG_ZSTACK_RESOURCECONFIG_10002": "ResourceConfig [category:%s, name:%s] ne peut pas être associé au resourceType: %s", + "ORG_ZSTACK_RESOURCECONFIG_10001": "impossible de trouver la ressource[uuid: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10081": "impossible de trouver le fichier source dans l'arborescence des instantanés utilisée du volume[uuid: %s]", + "ORG_ZSTACK_V2V_10028": "impossible de trouver le type pour la VM source [url:%s]", + "ORG_ZSTACK_RESOURCECONFIG_10000": "les ressources ont des types de ressources incohérents. Détails: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10080": "impossible d'aplatir un volume partageable[uuid:%s]", + "ORG_ZSTACK_V2V_10029": "impossible de trouver la factory pour la VM source [url:%s, v2vType:%s]", + "ORG_ZSTACK_RESOURCECONFIG_10007": "la configuration globale [category:%s, name:%s] ne peut pas être liée à la ressource", + "ORG_ZSTACK_V2V_10026": "Impossible de trouver le réseau[uuid:%s] pour démarrer la VM actuelle, il a peut-être été supprimé. Suggestion d'opération : Supprimez cette VM et créez-en une nouvelle.", + "ORG_ZSTACK_RESOURCECONFIG_10006": "aucune configuration globale[category:%s, name:%s] trouvée", + "ORG_ZSTACK_V2V_10024": "ce n'est pas le moment pour l'arrêt de l'instance", + "ORG_ZSTACK_V2V_10025": "conversionHost[uuid:%s, hostUuid:%s] n'est pas connecté", + "ORG_ZSTACK_V2V_10022": "Certaines tâches v2v sont en cours. Impossible de détacher le volume[%s] de l'hôte[%s].", + "ORG_ZSTACK_V2V_10020": "le stockage principal[uuid:%s] n'est ni actif ni attaché", + "ORG_ZSTACK_V2V_10021": "Des tâches de migration V2V sont en cours. Veuillez vous assurer qu'aucun volume[%s] n'est attaché à l'hôte[%s].", + "ORG_ZSTACK_STORAGE_VOLUME_10007": "iothread nécessite QEMU version >= %s, mais l'hôte exécute la version %s.", + "ORG_ZSTACK_STORAGE_VOLUME_10009": "Le volume racine [%s] ne peut pas définir l'épinglage du thread I/O.", + "ORG_ZSTACK_STORAGE_VOLUME_10008": "iothread nécessite une version de libvirt d'au moins %s, mais l'hôte a la version %s.", + "ORG_ZSTACK_STORAGE_VOLUME_10003": "Le stockage principal actuel %s n'est pas de type Ceph et ne peut donc pas être accédé.", + "ORG_ZSTACK_STORAGE_VOLUME_10005": "Le type actuel de stockage principal ne prend pas en charge le volume de type bloc. Les types pris en charge incluent %s.", + "ORG_ZSTACK_STORAGE_VOLUME_10004": "L'ID de chemin d'accès et l'IQN du volume de type bloc Ceph ne peuvent pas être nuls. Veuillez vous assurer que accessPathId et accessPathIqn sont fournis.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10000": "Échec du test de connexion JitClientFactory", + "ORG_ZSTACK_SSO_CAS_FILTER_10000": "URL invalide, UUID du client manquant", + "ORG_ZSTACK_SSO_CAS_FILTER_10001": "instance CAS client manquante, veuillez instancier le client CAS avant l'intégration SSO", + "ORG_ZSTACK_COMPUTE_VM_10275": "VM[uuid:%s] n'est pas dans un état En cours d'exécution.", + "ORG_ZSTACK_CONSOLE_10011": "L'agent console n'est pas connecté; cela est probablement dû à l'initialisation du nœud de gestion. Veuillez attendre que l'agent console se connecte, ou le reconnecter manuellement s'il a été déconnecté pendant une longue période.", + "ORG_ZSTACK_CONSOLE_10010": "VM[uuid:%s] n'est pas dans l'état %s, l'état actuel est %s", + "ORG_ZSTACK_COMPUTE_VM_10273": "échec de la création du modèle à partir du volume racine[uuid:%s] sur le stockage principal[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10270": "La machine virtuelle a été supprimée. Veuillez consulter la console de gestion de votre instance pour plus de détails.", + "ORG_ZSTACK_CONSOLE_10013": "le proxy console[uuid: %s, status: %s] sur l'agent[ip: %s] n'est pas connecté, échec de la suppression", + "ORG_ZSTACK_CONSOLE_10012": "impossible de trouver l'IP de l'hôte de la VM[uuid:%s], la VM fonctionne-t-elle???", + "ORG_ZSTACK_COMPUTE_VM_10279": "Échec de la mise à jour de la VM[uuid=%s] sur l'hyperviseur : La modification de certaines propriétés a échoué", + "ORG_ZSTACK_COMPUTE_VM_10278": "Échec de la mise à jour de la VM[uuid=%s] sur l'hyperviseur.", + "ORG_ZSTACK_COMPUTE_VM_10277": "L'ISO avec UUID [uuid:%s] est située sur un stockage de sauvegarde qui n'est pas compatible avec le stockage principal [uuid:%s] où réside la VM [name:%s, uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_10276": "impossible de mettre à jour le mot de passe console de la VM[uuid:%s], la VM ne s'exécute sur aucun hôte", + "ORG_ZSTACK_STORAGE_VOLUME_10018": "Impossible de redimensionner le volume [%s] car il est dans un état Désactivé", + "ORG_ZSTACK_STORAGE_VOLUME_10017": "le volume[uuid:%s] n'est pas un volume de données", + "ORG_ZSTACK_STORAGE_VOLUME_10019": "Au moins l'un des vmInstanceUuid ou instanceUuid doit être spécifié.", + "ORG_ZSTACK_STORAGE_VOLUME_10014": "ne prend pas en charge la prise de snapshots de volumes[uuid:%s, uuid:%s] sur différentes VMs[uuid:%s, uuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10013": "le volume[uuid:%s] est introuvable", + "ORG_ZSTACK_STORAGE_VOLUME_10016": "l'état de la vm[uuid: %s] est %s, la création de snapshot n'est pas autorisée", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10013": "machine de sécurité jit non saine : la connexion socket à %s:%s a échoué", + "ORG_ZSTACK_STORAGE_VOLUME_10015": "le volume[uuid:%s] n'est pas disponible", + "ORG_ZSTACK_STORAGE_VOLUME_10010": "l'ID du thread I/O actuel[%s] ne correspond pas à l'ID du thread I/O du volume attaché[%s][%s].", + "ORG_ZSTACK_STORAGE_VOLUME_10012": "la validation du snapshot n'est pas prise en charge pour le volume[uuid: %s]. La VM attachée n'est pas dans un des états [%s, %s].", + "ORG_ZSTACK_STORAGE_VOLUME_10011": "la validation du snapshot n'est pas prise en charge pour le volume [UUID: %s]. Le volume doit être attaché à une machine virtuelle.", + "ORG_ZSTACK_CONSOLE_10000": "Le fichier de clé privée Ansible est introuvable. Veuillez vous assurer que le chemin du fichier de clé privée est correct et accessible.", + "ORG_ZSTACK_COMPUTE_VM_10285": "Échec du détachement du volume [uuid=%s] de la VM [uuid=%s]", + "ORG_ZSTACK_COMPUTE_VM_10284": "Le détachement d'un volume n'est pas autorisé lorsque la VM est dans l'état [%s]", + "ORG_ZSTACK_COMPUTE_VM_10283": "L'ISO[uuid:%s] n'est pas attaché à la MachineVirtuelle[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10282": "échec de la mise à jour de la vm[uuid=%s] sur l'hyperviseur : la modification de certaines propriétés a échoué", + "ORG_ZSTACK_CONSOLE_10004": "Échec de la reconnexion au proxy console pour la machine virtuelle. Veuillez vérifier la connectivité réseau et vous assurer que la machine virtuelle est en cours d'exécution.", + "ORG_ZSTACK_COMPUTE_VM_10281": "échec de la mise à jour de la vm[uuid=%s] sur le nœud hyperviseur", + "ORG_ZSTACK_CONSOLE_10003": "échec de la configuration de l'IP surchargée du proxy console [code:%d] ou du port du proxy console [code:%d]", + "ORG_ZSTACK_COMPUTE_VM_10280": "impossible de créer la machine virtuelle, une machine virtuelle avec le nom [%s] existe déjà", + "ORG_ZSTACK_CONSOLE_10002": "Un autre processus utilise le port : %s", + "ORG_ZSTACK_CONSOLE_10001": "ID de nœud de gestion invalide[%s]", + "ORG_ZSTACK_CONSOLE_10008": "impossible de vérifier la disponibilité du proxy console car %s", + "ORG_ZSTACK_CONSOLE_10007": "établir la connexion VNC : URI inattendu : %s", + "ORG_ZSTACK_COMPUTE_VM_10288": "Une VM ne peut pas créer %s lecteurs CD-ROM ; la VM ne peut attacher que %s lecteurs CD-ROM.", + "ORG_ZSTACK_CONSOLE_10009": "erreur d'opération, car :%s", + "ORG_ZSTACK_STORAGE_VOLUME_10029": "Opération d'extension non autorisée car l'hôte est désactivé. Veuillez vous assurer que l'hôte est actif avant d'effectuer cette opération.", + "ORG_ZSTACK_STORAGE_VOLUME_10028": "La taille d'incrément minimale pour l'allocation de mémoire doit être supérieure à 4 Mo.", + "ORG_ZSTACK_STORAGE_VOLUME_10025": "Vous ne pouvez pas définir simultanément les limites de bande passante lecture/écriture et les limites de bande passante totale pour une machine virtuelle. Veuillez spécifier un type de limite.", + "ORG_ZSTACK_STORAGE_VOLUME_10024": "Vous ne pouvez pas configurer simultanément les limites IOPS lecture/écriture et les limites IOPS totales pour votre instance. Veuillez spécifier un type de limite IOPS.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10023": "exception non gérée lors de la récupération des attributs avec la sécurité jit activée : %s", + "ORG_ZSTACK_STORAGE_VOLUME_10027": "Impossible de réduire la taille du volume[%s][uuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10026": "La bande passante du volume ne peut pas être nulle ; veuillez spécifier une valeur valide pour la bande passante du volume.", + "ORG_ZSTACK_STORAGE_VOLUME_10021": "volume[uuid:%s] n'est pas un volume racine", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10022": "Échec de la récupération des attributs de la machine de sécurité JIT, code d'état : %s, détails : %s", + "ORG_ZSTACK_STORAGE_VOLUME_10020": "Aucun volume avec l'UUID : %s et l'UUID d'instance de machine virtuelle : %s n'a été trouvé", + "ORG_ZSTACK_STORAGE_VOLUME_10023": "Impossible de configurer simultanément les jeux de paramètres hérités et nouveaux dans une instance de machine virtuelle.", + "ORG_ZSTACK_STORAGE_VOLUME_10022": "SharedVolume ne prend pas en charge la configuration de la bande passante.", + "ORG_ZSTACK_COMPUTE_VM_10293": "aucune méthode pour déterminer la taille de l'image pour %s, veuillez signaler l'exception.", + "ORG_ZSTACK_STORAGE_VOLUME_10035": "Prise en charge uniquement des volumes détachés, utilisez SetVmBootVolumeMsg à la place.", + "ORG_ZSTACK_ZWATCH_PROMETHEUS_10000": "Hôte[uuid:%s] non trouvé dans la base de données cloud", + "ORG_ZSTACK_STORAGE_VOLUME_10038": "L'hyperviseur[%s] limite une seule machine virtuelle à un maximum de %s volumes de données ; cette machine virtuelle [uuid:%s] a %s volumes de données attachés.", + "ORG_ZSTACK_STORAGE_VOLUME_10032": "impossible de trouver le cache d'image [UUID d'image : %s] pour la réinitialisation du volume", + "ORG_ZSTACK_STORAGE_VOLUME_10031": "le volume partagé[uuid: %s] a été attaché à des instances de machine virtuelle non arrêtées[uuids: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10034": "volume[uuid%s] devrait être attaché à une instance.", + "ORG_ZSTACK_STORAGE_VOLUME_10033": "Le volume [UUID : %s, nom : %s] est toujours en cours d'utilisation et ne peut pas être éliminé. Veuillez vous assurer que le volume est supprimé avant de tenter de l'éliminer.", + "ORG_ZSTACK_STORAGE_VOLUME_10030": "Opération d'extension non autorisée en raison du statut désactivé de l'hôte", + "ORG_ZSTACK_LOGIN_10033": "Il n'y a actuellement aucun serveur LDAP/AD configuré dans votre environnement. Veuillez d'abord configurer un serveur LDAP/AD.", + "ORG_ZSTACK_LOGIN_10032": "Impossible de lier ce LDAP UID %s à l'ID utilisateur virtuel [uuid:%s]", + "ORG_ZSTACK_LOGIN_10034": "Cet UID est déjà utilisé. Veuillez en choisir un autre.", + "ORG_ZSTACK_LOGIN_10030": "Attribut invalide. L'attribut[%s] est requis, mais certains enregistrements ne correspondent pas dans la configuration de la machine virtuelle. Veuillez vous assurer que tous les attributs sont correctement spécifiés et que toutes les ressources de la machine virtuelle sont correctement configurées.", + "ORG_ZSTACK_STORAGE_CDP_10091": "Capacité maximale invalide[%d], l'utilisation actuelle est %d", + "ORG_ZSTACK_STORAGE_CDP_10089": "nom d'hôte non trouvé pour le stockage de sauvegarde[uuid: %s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10009": "la fonction crypto est activée mais le pool de ressources[%s] pour la connexion automatique n'est pas configuré.", + "ORG_ZSTACK_SSO_SAML2_10001": "Les métadonnées du fournisseur d'identité sont Base64 invalide (le contenu décodé est vide).", + "ORG_ZSTACK_SSO_SAML2_10002": "Échec du décodage des métadonnées du fournisseur d'identité à partir de l'encodage Base64", + "ORG_ZSTACK_SSO_SAML2_10000": "Les métadonnées IdP ne sont pas configurées. Veuillez fournir des métadonnées valides.", + "ORG_ZSTACK_ZSV_10002": "Détacher le volume partageable ou le périphérique LUN avant d'opérer sur le groupe de snapshots.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10000": "pas de client pour l'instance de sécurité[model=%s]", + "ORG_ZSTACK_ZSV_10001": "le volume %s a encore des groupes de snapshots, impossible de le supprimer", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10001": "pas d'usine de client de machine de sécurité pour la machine de sécurité[type=%s]", + "ORG_ZSTACK_ZSV_10000": "le volume %s a encore un groupe de snapshots associé à la machine virtuelle %s ; par conséquent, il ne peut pas être attaché à une autre machine virtuelle", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10002": "SecurityMachineManagerImpl: SecurityMachineEncrypt a échoué pour l'instance %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_HTTP_10001": "Erreur d'enregistrement du modèle HTTP, veuillez vérifier le contenu du modèle : %s", + "ORG_ZSTACK_STORAGE_CDP_10097": "Le travail de création de VM a été annulé. Veuillez vérifier vos paramètres et réessayer.", + "ORG_ZSTACK_STORAGE_CDP_10095": "Annulation de l'annulation du travail : L'opération de restauration des modifications a été annulée. Veuillez vous assurer que toutes les tâches dépendantes sont terminées avant de tenter une nouvelle restauration.", + "ORG_ZSTACK_ACCESSKEY_10002": "[Account ID : %s, User ID : %s] n'est pas un compte valide ou un projet/utilisateur IAM2", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10019": "Échec de connexion au chassis [uuid:%s], veuillez vérifier la configuration IPMI.", + "ORG_ZSTACK_ACCESSKEY_10001": "Si une clé d'accès spécifiée est attendue, l'AccessKeyID et l'AccessKeySecret doivent être fournis simultanément.", + "ORG_ZSTACK_ACCESSKEY_10004": "Le nombre de clés d'accès pour [account ID : %s, user ID : %s] dépasse la limite maximale", + "ORG_ZSTACK_ACCESSKEY_10000": "Pas d'autorisation pour effectuer l'opération pour [accountUuid:%s, userUuid:%s]", + "ORG_ZSTACK_TEST_10008": "Je ne devrais pas être dans la liste des erreurs", + "ORG_ZSTACK_TEST_10009": "Je ne devrais pas non plus êtreListed comme une erreur.", + "ORG_ZSTACK_TEST_10006": "Déploiement cloud terminé comme prévu.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10020": "Échec de chargement des informations du chassis depuis le fichier, car : %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10029": "Une autre tâche de sécurité de connexion est en cours. Veuillez annuler la nouvelle tâche et attendre sa finalización.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10026": "securityMachine est désactivé. Échec de détection du heartbeat. Veuillez vous assurer que securityMachine est activé et correctement configuré.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10027": "Échec de détection du heartbeat de l'instance %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10028": "Exception de détection du heartbeat de %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10021": "Les données[%s] ou le type d'algorithme de chiffrement[%s] sont nuls", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10022": "Type d'algorithme de déchiffrement invalide : %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10024": "La fonction de chiffrement ne peut pas être désactivée car il y a au moins une machine virtuelle synchrone sécurisée dans le pool de ressources qui fournit le service. Veuillez vous assurer que le nombre de machines virtuelles sécurisées synchronisées est réduit à zéro avant de désactiver la fonction de chiffrement.", + "ORG_ZSTACK_TEST_10004": "Je ne devrais pas non plus être dans la liste des erreurs en raison de %d", + "ORG_ZSTACK_TEST_10005": "Volontaire %d", + "ORG_ZSTACK_SNS_SYSTEM_10002": "La ressource API ne peut pas être supprimée", + "ORG_ZSTACK_TEST_10003": "Je ne devrais pas être dans la liste des erreurs %d", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10019": "Type de chiffrement inconnu[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10014": "Impossible de trouver le modèle pour le pool de ressources secret [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10015": "L'état actuel[%s] ne permet pas de modification manuelle de l'état", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10016": "Impossible de désactiver toutes les VMs de sécurité lorsque les fonctions cryptographiques sont activées. Veuillez vous assurer qu'au moins une VM de sécurité est active.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10017": "Vérifiez que l'UUID du pool de ressources est configuré pour l'authentification.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10010": "La fonction crypto est activée mais le pool de ressources[%s] pour la protection des données n'est pas configuré.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10013": "Vérifier la disponibilité du client et du serveur du modèle[%s] type[%s] exception", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10003": "Échec de l'établissement de la connexion SSH. Veuillez vérifier les paramètres de votre instance cloud et les configurations réseau.", + "ORG_ZSTACK_AI_VM_10006": "impossible de trouver le groupe d'instances de service de modèle avec UUID: %s, échec de l'enregistrement de l'instance de service de modèle", + "ORG_ZSTACK_AI_VM_10007": "l'instance vm, le config yaml, ou le service yaml est nul pour le contexte de déploiement du service de modèle: %s", + "ORG_ZSTACK_AI_VM_10008": "le contexte de déploiement ou la machine virtuelle est nul pour l'instance %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10000": "impossible de répliquer %s vers %s, erreur: %s", + "ORG_ZSTACK_AI_VM_10009": "échec de l'annulation de la tâche, %s", + "ORG_ZSTACK_SNS_SYSTEM_10000": "Le sujet d'alarme système ne peut pas être supprimé en raison des ressources associées. Veuillez vous assurer que toutes les ressources dépendantes ont été supprimées avant de tenter à nouveau la suppression.", + "ORG_ZSTACK_AI_VM_10002": "Impossible de trouver l'IP de la NIC VM dans le réseau L3 par défaut [UUID: %s] requis pour le service de modèle distribué", + "ORG_ZSTACK_SNS_SYSTEM_10001": "seul le point de terminaison HTTP peut s'abonner à un sujet d'API ; le point de terminaison fourni [type:%s] n'est pas un point de terminaison HTTP valide", + "ORG_ZSTACK_AI_VM_10003": "ModelServiceSession ne peut pas être null. Veuillez vous assurer qu'une session valide est établie pour les services de modèle cloud.", + "ORG_ZSTACK_AI_VM_10004": "impossible d'analyser la configuration YAML pour le service de modèle, définition du service : %s", + "ORG_ZSTACK_AI_VM_10000": "impossible de trouver l'image [uuid: %s]", + "ORG_ZSTACK_AI_VM_10001": "impossible de récupérer l'UUID de l'image depuis le YAML : %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10015": "Le réseau[%s] a été ajouté au groupe HA[%s].", + "ORG_ZSTACK_ROUTEPROTOCOL_10014": "Le réseau[%s] a été ajouté à la zone du routeur virtuel[%s].", + "ORG_ZSTACK_ROUTEPROTOCOL_10017": "L'ID de routeur[%s] n'est pas unique dans ce système cloud", + "ORG_ZSTACK_ROUTEPROTOCOL_10016": "L'ID de routeur[%s] ne conforms pas au format IPv4", + "ORG_ZSTACK_AI_VM_10011": "Impossible de récupérer le statut de l'instance en raison d'une URL d'instance vide. Veuillez fournir une instance URL valide et réessayer.", + "ORG_ZSTACK_HYBRID_BACKUP_10000": "%s ne peut être invoqué que par un compte administratif dans un environnement cloud.", + "ORG_ZSTACK_EXTERNALSERVICE_CRONJOB_10001": "Le démon cron ne fonctionne pas. Veuillez vous assurer qu'il est démarré et configuré correctement.", + "ORG_ZSTACK_ROUTEPROTOCOL_10003": "[%s] ne se conforme pas au format d'adresse IPv4", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10030": "la synchronisation des jetons de sécurité de toutes les machines a échoué pour toutes les machines virtuelles dans l'environnement cloud. Veuillez vérifier vos jetons de sécurité et les configurations des machines.", + "ORG_ZSTACK_ROUTEPROTOCOL_10008": "L'ID de zone[%s] a déjà été provisionné", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10031": "Échec du test de connexion FlkSecClientFactory", + "ORG_ZSTACK_ROUTEPROTOCOL_10009": "KeyID et le mot de passe ne doivent pas être nuls lorsque le type d'authentification est %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10027": "échec de la génération du jeton de protection des données pour la machine de sécurité %s car %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10029": "échec de l'obtention des résultats de chiffrement pour l'instance de sécurité %s en raison de %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10011": "La longueur du mot de passe ne doit pas dépasser 8 octets lorsque le type d'authentification est %s.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10028": "échec de la génération du jeton HMAC pour la machine de sécurité %s en raison de %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10010": "le mot de passe doit être non nul lorsque le type d'authentification est %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10013": "Tous les réseaux doivent être associés au routeur virtuel [%s]", + "ORG_ZSTACK_ROUTEPROTOCOL_10012": "AreaId[%s] doit être un identifiant de zone valide", + "ORG_ZSTACK_ALIYUN_IDENTITYZONE_10000": "Aucune information d'identification trouvée pour la ressource demandée. Veuillez vous assurer d'avoir fourni une clé d'accès et une clé secrète valides.", + "ORG_ZSTACK_STORAGE_CDP_10005": "BackupStorage[uuid: %s] a déjà été supprimé", + "ORG_ZSTACK_STORAGE_CDP_10001": "kvmagent n'a pas répondu %d fois", + "ORG_ZSTACK_STORAGE_CDP_10004": "Aucune machine virtuelle trouvée pour la tâche Cloud Deployment Pipeline[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10000": "L'agent KVM a été redémarré. Veuillez vérifier si cela affecte vos machines virtuelles.", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10011": "Un réseau VXLAN matériel ne peut être créé qu'au sein d'un pool VXLAN matériel.", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10010": "SEUL un réseau VXLAN matériel peut être créé au sein d'un pool VXLAN matériel.", + "ORG_ZSTACK_STORAGE_CDP_10016": "libvirt sur l'hôte [UUID: %s] ne prend pas en charge la création de tâches CDP. Veuillez vérifier la version de libvirt.", + "ORG_ZSTACK_HYBRID_DATACENTER_10003": "Le centre de données [%s] est encore en cours de synchronisation; veuillez patienter.", + "ORG_ZSTACK_STORAGE_CDP_10017": "qemu sur l'hôte [UUID: %s] ne prend pas en charge la création de tâches CDP. Veuillez vérifier la version de qemu.", + "ORG_ZSTACK_HYBRID_DATACENTER_10002": "région non valide spécifiée dans aliyun, qui contient: %s", + "ORG_ZSTACK_STORAGE_CDP_10018": "La version de QEMU exécutée sur la VM[uuid:%s] ne prend pas en charge la fonctionnalité mirrorBitmap. Veuillez utiliser une version compatible de QEMU.", + "ORG_ZSTACK_STORAGE_CDP_10012": "query-mirror: Hôte non trouvé pour la VM[uuid:%s]", + "ORG_ZSTACK_AI_EVALUATION_10000": "Aucun groupe avec l'UUID: %s n'a été trouvé dans la base de données.", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10002": "échec de création du pont réseau vxlan[%s] pour le périphérique matériel[uuid:%s, type:%s, vlan:%s] sur l'hôte KVM[uuid:%s], car %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10001": "il n'y a pas de Factory SDN Controller pour le type de SDN Controller:%s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10000": "Il n'y a pas de contrôleur SDN pour le pool VXLAN [uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10006": "impossible de configurer le réseau VXLAN pour la VM avec l'UUID [%s] sur l'hôte de destination avec l'UUID [%s]", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10005": "impossible de trouver le contrôleur SDN %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10003": "échec de vérification du pont[%s] pour hardwareVxlan[uuid:%s, name:%s] sur l'hôte KVM[uuid:%s], %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10009": "le pool de réseau VXLAN matériel doit configurer l'interface physique %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10008": "le pool de réseau VXLAN matériel ne prend pas en charge la création de réseaux L3", + "ORG_ZSTACK_HYBRID_DATACENTER_10001": "regionId [%s] a déjà été créé par la clé d'accès [%s]", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10007": "échec de vérification de l'interface réseau physique pour HardwareVxlanPool [uuid: %s, name: %s] sur l'hôte KVM [uuid: %s], %s", + "ORG_ZSTACK_HYBRID_DATACENTER_10000": "dcType type non supporté [%s]", + "ORG_ZSTACK_STORAGE_CDP_10027": "chaîne de temps non valide: %s, doit être formatée selon le format ISO offset, par exemple %s", + "ORG_ZSTACK_STORAGE_CDP_10023": "L'instance de machine virtuelle exécute actuellement une tâche de Continuous Data Protection (CDP). L'attachement du volume dépassera la taille prévue requise pour les sauvegardes complètes. Veuillez ajuster la taille de la tâche CDP et réessayer.", + "ORG_ZSTACK_STORAGE_CDP_10024": "La VM[%s] pour le volume[%s] est actuellement en cours d'exécution sur Continuous Data Protection (CDP), par conséquent le redimensionnement n'est pas possible pour le moment.", + "ORG_ZSTACK_STORAGE_CDP_10025": "La tâche CDP[uuid: %s] a rencontré un changement de statut anormal, de l'ancien statut: %s au nouveau statut: %s en raison de %s.", + "ORG_ZSTACK_STORAGE_CDP_10026": "La tâche CDP est toujours active", + "ORG_ZSTACK_STORAGE_CDP_10022": "Échec de la recherche de la tâche CDP[uuid:%s]", + "ORG_ZSTACK_AI_EVALUATION_10001": "Aucune instance backend correspondante du groupe[uuid: %s, type:%s] n'existe", + "ORG_ZSTACK_AI_EVALUATION_10002": "Impossible de trouver le Model Service Instance Group VO avec le UUID du groupe de service de modèle fourni. Cela indique que le groupe de service associé exécutant les tâches d'évaluation est introuvable. Par conséquent, les tâches restent dans un statut intermédiaire au lieu d'être marquées comme Terminées. Les tâches seront automatiquement mises à jour en 'Échec' et les erreurs seront documentées.", + "ORG_ZSTACK_LOGINCONTROL_10002": "Expression de règle invalide, échec de l'ajout de la règle de contrôle d'accès: %s", + "ORG_ZSTACK_LOGINCONTROL_10005": "clé non reconnue: %s", + "ORG_ZSTACK_LOGINCONTROL_10006": "clé:valeur manquante pour la configuration de la ressource %s", + "ORG_ZSTACK_PORTAL_APIMEDIATOR_10008": "resourceUuid[%s] n'est pas un UUID valide. Un UUID valide (v4 est recommandé) doit être formaté sans tirets et correspondre à l'expression régulière '[0-9a-f]{8}[0-9a-f]{4}[1-5][0-9a-f]{3}[89ab][0-9a-f]{3}[0-9a-f]{12}'. Pour plus d'informations, voir http://en.wikipedia.org/wiki/Universally_unique_identifier.", + "ORG_ZSTACK_LOGINCONTROL_10007": "Format incorrect pour les paramètres de configuration de la force du mot de passe", + "ORG_ZSTACK_LOGINCONTROL_10008": "La valeur minimale ne peut pas être supérieure à la valeur maximale", + "ORG_ZSTACK_STORAGE_CDP_10039": "Stockage de sauvegarde introuvable[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10034": "Type de tâche inattendu[uuid: %s, type: %s] dans l'environnement de calcul cloud", + "ORG_ZSTACK_STORAGE_CDP_10035": "Capacité maximale introuvable pour la tâche Cloud Data Protection[uuid: %s], veuillez la mettre à jour.", + "ORG_ZSTACK_STORAGE_CDP_10036": "Latence maximale introuvable pour CDPSessionTask[uuid: %s], veuillez la mettre à jour.", + "ORG_ZSTACK_STORAGE_CDP_10037": "VM[uuid: %s] a déjà été terminée", + "ORG_ZSTACK_STORAGE_CDP_10031": "La VM n'est pas arrêtée, état actuel: %s", + "ORG_ZSTACK_STORAGE_CDP_10032": "Le volume partagé[%s] est encore utilisé par d'autres machines virtuelles.", + "ORG_ZSTACK_STORAGE_CDP_10033": "Tâche introuvable[uuid: %s]", + "ORG_ZSTACK_LOGINCONTROL_10012": "Aucun utilisateur disponible avec le nom: %s, type: %s dans l'environnement virtuel", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10011": "La demande API spécifie un type de châssis IPMI, mais le message reçu n'est pas de type APICreateBareMetal2ChassisHardwareInfoMsg. Veuillez vous assurer que le type de message correspond au type de châssis spécifié.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10012": "informations matérielles reçues pour un châssis baremetal inconnu[ipmi_addr:%s, ipmi_port:%d]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10010": "échec du chargement des informations du châssis IPMI BareMetal2 à partir du fichier, car: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10015": "échec de la réinitialisation électrique du châssis IPMI baremetal2[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10016": "Échec du démarrage IPXE distant de l'instance[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10013": "échec de la mise sous tension du châssis IPMI baremetal2[UUID:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10014": "échec de la mise hors tension du châssis IPMI baremetal2[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10049": "La VM [UUID: %s] a déjà lancé une tâche CDP ; par conséquent, un travail de sauvegarde ne peut pas être créé simultanément.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10008": "Les instances Bare Metal avec disque local Windows ne prennent pas en charge la création automatique de machines virtuelles.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10009": "aucune passerelle baremetal2 utilisable disponible dans le cluster[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10006": "Cluster[uuid:%s] n'est pas un environnement de virtualisation BareMetal2.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10007": "Cluster[uuid:%s] n'est pas activé.", + "ORG_ZSTACK_STORAGE_CDP_10045": "arguments obligatoires manquants : %s", + "ORG_ZSTACK_STORAGE_CDP_10046": "Le temps de rétention par jour et le RP quotidien depuis le jour ne peuvent pas être égaux. Veuillez vous assurer qu'ils sont définis sur des valeurs différentes.", + "ORG_ZSTACK_STORAGE_CDP_10047": "un UUID de machine virtuelle attendu, mais %d fourni", + "ORG_ZSTACK_STORAGE_CDP_10048": "la ressource [uuid: %s] n'est pas une instance de machine virtuelle", + "ORG_ZSTACK_STORAGE_CDP_10041": "Le stockage de sauvegarde [UUID: %s] n'est pas connecté à l'environnement cloud. Veuillez vous assurer qu'il est correctement configuré et intégré.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10005": "Cluster[uuid:%s] n'est pas une configuration de cluster baremetal.", + "ORG_ZSTACK_STORAGE_CDP_10042": "La VM [UUID: %s] a déjà créé un travail de sauvegarde ; par conséquent, elle ne peut pas avoir de tâche de protection continue des données (CDP) activée simultanément.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10007": "L'adresse et le port IPMI existent déjà.", + "ORG_ZSTACK_STORAGE_CDP_10044": "L'allocation de ressources virtuelles doit être supérieure à l'allocation de ressources physiques", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10001": "Veuillez vous assurer des points suivants pour établir une connexion au serveur bare-metal : 1. Vérifiez que l'interface IPMI est active ; 2. Confirmez que l'adresse IPMI, le port, le nom d'utilisateur et le mot de passe sont corrects ; 3. Assurez-vous que IPMI over LAN est activé dans les paramètres BIOS.", + "ORG_ZSTACK_STORAGE_CDP_10040": "Le stockage de sauvegarde[uuid: %s] est désactivé dans l'environnement cloud.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10009": "le chassis baremetal avec UUID: %s est configuré pour utiliser pxeserver avec UUID: %s, mais la requête DHCP a été effectivement traitée par pxeserver avec UUID: %s.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10008": "aucun serveur baremetal PXE utilisable attaché au cluster[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10000": "Le chassis IPMI 2 Bare Metal IPMI %s a deux entrées existantes", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10001": "L'adresse IPMI %s est invalide", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10004": "Un chassis baremetal avec l'adresse IPMI %s et le port %d a déjà été créé.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10005": "Cluster[uuid:%s] n'existe pas.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10002": "Échec de l'établissement d'une connexion avec le noeud baremetal. Veuillez vérifier : 1. La connexion IPMI est active ; 2. L'adresse IPMI, le port, le nom d'utilisateur et le mot de passe sont corrects ; 3. IPMI over LAN est activé dans les paramètres BIOS.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10003": "Un chassis BareMetal2 avec l'adresse IPMI %s et le port %d a déjà été créé.", + "ORG_ZSTACK_STORAGE_CDP_10056": "plusieurs disques root trouvés : %s", + "ORG_ZSTACK_STORAGE_CDP_10058": "Aucun volume root trouvé pour la sauvegarde de la VM.%s", + "ORG_ZSTACK_STORAGE_CDP_10059": "le volume %s est inclus dans la sauvegarde mais détaché de la VM [UUID: %s]. Veuillez soit le rattacher à la VM soit le supprimer de l'ensemble de sauvegarde.", + "ORG_ZSTACK_STORAGE_CDP_10053": "Aucune tâche de provisioning de Cloud Drive trouvée pour VM[uuid: %s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10015": "Échec de la mise sous tension à distance du chassis baremetal[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10054": "La tâche CDP pour VM[uuid: %s] n'est pas trouvée sur Backstore[uuid: %s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10018": "Échec du boot PXE à distance de l'instance[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10055": "recoverVm : hôte[uuid: %s] non trouvé pour virtualMachine[uuid: %s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10017": "Échec du reset d'alimentation à distance du chassis baremetal[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10050": "impossible de demander le stockage principal [uuid:%s] pour la capacité de snapshot de volume ; voir les détails [%s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10014": "échec de suppression du chassis baremetal %s", + "ORG_ZSTACK_STORAGE_CDP_10051": "recoverVm : L'UUID de l'hôte n'est pas fourni et l'hôte original pour VM[uuid: %s] est introuvable.", + "ORG_ZSTACK_SSHKEYPAIR_10009": "La paire de clés SSH [uuid:%s] n'a pas été attachée à la machine virtuelle [uuid:%s].", + "ORG_ZSTACK_SSHKEYPAIR_10008": "La paire de clés SSH [uuid:%s] est déjà attachée à la machine virtuelle [uuid:].", + "ORG_ZSTACK_SSHKEYPAIR_10007": "sshKeyPair[uuid:%s] est actuellement en cours d'utilisation.", + "ORG_ZSTACK_STORAGE_CDP_10067": "impossible de trouver le volume root à partir de la sauvegarde CDP %s:%d", + "ORG_ZSTACK_STORAGE_CDP_10068": "volume root non trouvé à partir de la sauvegarde CDP %s:%d", + "ORG_ZSTACK_SSHKEYPAIR_10011": "les types de ressources %s ne sont pas pris en charge pour attacher une paire de clés SSH ; les types autorisés sont %s", + "ORG_ZSTACK_SSHKEYPAIR_10010": "vmInstance[uuid:%s] n'est pas dans un état en cours d'exécution.", + "ORG_ZSTACK_STORAGE_CDP_10063": "Processus de déploiement cloud VM[uuid: %s] non trouvé", + "ORG_ZSTACK_STORAGE_CDP_10064": "Instance VM non trouvée pour la tâche du pipeline de déploiement cloud[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10065": "Aucun enregistrement de volume trouvé à partir de la sauvegarde de la machine virtuelle. Veuillez vérifier la configuration de la VM et les paramètres de sauvegarde.", + "ORG_ZSTACK_STORAGE_CDP_10066": "plusieurs disks root trouvés à partir de la sauvegarde CDP %s:%d", + "ORG_ZSTACK_V2V_KVM_10003": "UUID VM manquant dans 'srcVmUrl'", + "ORG_ZSTACK_STORAGE_CDP_10060": "taille inattendue du volume[uuid: %s] : attendu %d bytes, taille différente reçue", + "ORG_ZSTACK_V2V_KVM_10004": "disk root non trouvé pour l'instance : %s", + "ORG_ZSTACK_STORAGE_CDP_10061": "échec du redimensionnement du volume[uuid: %s] : %s", + "ORG_ZSTACK_STORAGE_CDP_10062": "le volume[uuid: %s] a un chemin de volume inattendu : %s", + "ORG_ZSTACK_V2V_KVM_10007": "échec du nettoyage de l'hôte de conversion KVM V2V[hostUuid:%s], car %s", + "ORG_ZSTACK_STORAGE_CDP_10078": "impossible de trouver la politique CDP pour VM[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10075": "Aucun point de récupération trouvé avec l'ID de groupe %d", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10018": "variable invalide : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10075": "le stockage principal NFS [uuid:%s, name:%s] ne peut pas trouver de clusters hôtes attachés pour effectuer l'opération", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10077": "aucun hôte trouvé pour le volume[uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10020": "une Liste est nécessaire pour la ressource [%s] ici, mais un objet unique a été reçu.", + "ORG_ZSTACK_ZBOX_10007": "zbox[name:%s] n'est pas dans un état Ready, le statut actuel est %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10025": "Certaines actions sont invalides dans le contexte de la gestion des ressources cloud. Veuillez vérifier les paramètres et réessayer.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10022": "la ressource [%s] doit être configurée avant !", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10006": "l'hôte de destination [UUID:%s] n'a pas suffisamment de capacité physique pour le stockage principal [UUID:%s], car le seuil est %f tandis que la capacité physique disponible est %d", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10007": "Le volume avec l'UUID [%s] n'est pas dans l'état 'Ready' ; par conséquent, il ne peut pas être migré.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10008": "Le volume de données [UUID: %s, name: %s] est encore attaché à la machine virtuelle [UUID: %s]. Veuillez le détacher avant de lancer la migration.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10009": "Le volume avec l'UUID %s est le volume racine de la VM avec l'UUID %s. Actuellement, la VM est dans l'état %s. Veuillez arrêter la VM avant de lancer la migration.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10002": "Le volume avec l'UUID [%s] est déjà attaché à l'hôte avec l'UUID [%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10003": "le stockage primaire [UUID:%s] n'est pas trouvé", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10004": "Le stockage primaire [UUID:%s] est désactivé ou la migration à froid pendant la maintenance n'est pas autorisée.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10005": "L'hôte de destination avec l'UUID [%s] n'appartient pas au stockage primaire local avec l'UUID [%s] où le volume avec l'UUID [%s] est situé.", + "ORG_ZSTACK_ZBOX_10001": "zbox[UUID:%s] est toujours en cours d'utilisation ; impossible d'éjecter.", + "ORG_ZSTACK_ZBOX_10002": "zbox[UUID:%s] n'est pas dans un état Ready et ne peut donc pas synchroniser la capacité.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10000": "Aucun hôte ne peut fournir la capacité de stockage requise pour tous les volumes de la VM [UUID:%s].", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10004": "Le compte Aliyun [UUID:%s] n'existe pas", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10001": "Le volume avec l'UUID [%s] n'est attaché à aucun stockage primaire local.", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10005": "numéro de téléphone invalide[%s], veuillez vous assurer qu'il est formaté comme +86-12345678901", + "ORG_ZSTACK_ZBOX_10005": "zbox[UUID: %s] semble avoir été supprimé", + "ORG_ZSTACK_ZBOX_10006": "L'appareil USB [uuid:%s] a été attaché à la VM [uuid:%s], il ne peut pas être ajouté à Zbox.", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10000": "Modèle de texte d'événement SMS Aliyun introuvable. Veuillez vous assurer que le modèle a été correctement configuré et réessayer.", + "ORG_ZSTACK_ZBOX_10003": "seul le fichier dans le chemin de montage [mountPath: %s] sur zbox peut être supprimé. mais [%s] a été passé.", + "ORG_ZSTACK_ZBOX_10004": "zbox[name:%s] n'est pas dans un état Ready, l'état actuel est %s", + "ORG_ZSTACK_SSHKEYPAIR_10006": "La paire de clés SSH %s a déjà été téléversée.", + "ORG_ZSTACK_SSHKEYPAIR_10005": "erreur d'opération, car : %s", + "ORG_ZSTACK_SSHKEYPAIR_10003": "la paire de clés SSH [uuid:%s] ne peut pas être associée à la VM [uuid:%s] car la clé n'a pas été trouvée", + "ORG_ZSTACK_SSHKEYPAIR_10002": "échec du chargement de la clé publique : %s, err : %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10043": "Échec du test de connexion InfoSecClientFactory", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10044": "ne prend pas en charge la création de %s pools de ressources dans cet environnement pour le moment", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10041": "échec de l'extraction du nom distinctif du sujet de la clé publique : %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10042": "échec de la vérification de l'existence des tokens de sécurité pour toutes les machines virtuelles", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10040": "échec de l'analyse de la clé publique chiffrée", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10058": "le stockage primaire NFS [uuid:%s, name:%s] ne peut pas trouver un hôte utilisable pour créer le volume de données [uuid:%s, name:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10054": "vm[uuid:%s] n'est pas dans un état Running, Paused ou Stopped ; l'état actuel est %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10055": "le stockage primaire avec UUID:%s n'est attaché à aucun cluster", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10050": "Fournisseur backend utilisable introuvable. Veuillez vous assurer qu'un fournisseur cloud valide est configuré et réessayer.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10051": "aucun hôte en état Connecté auquel le stockage primaire NFS [uuid:%s, name:%s] est attaché trouvé pour restaurer le volume [uuid:%s] vers l'instantané [uuid:%s, name:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10052": "aucun hôte en état connecté auquel le stockage primaire NFS [uuid:%s, name:%s] est attaché trouvé pour restaurer le volume [uuid:%s] vers l'image [uuid:%s]", + "ORG_ZSTACK_IAM2_10019": "Impossible d'analyser l'expression cron. Veuillez vous assurer qu'elle est correctement formatée selon les spécifications du format cron standard.", + "ORG_ZSTACK_IAM2_10018": "le projet[UUID : %s, name:%s] est dans l'état %s ce qui interdit l'opération[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10038": "échec de la génération du jeton de protection des données %s pour l'appareil de sécurité %s car %s", + "ORG_ZSTACK_IAM2_10015": "Une organisation avec l'UUID %s ne peut pas être définie comme enfant d'elle-même ou de son organisation parente UUID %s.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10039": "échec de la génération du jeton HMAC %s pour l'appareil de sécurité %s car %s", + "ORG_ZSTACK_IAM2_10014": "L'organisation actuelle [uuid:%s] est obsolète, veuillez l'activer", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10036": "generate-token a échoué pour l'allocation des ressources cloud", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10037": "échec de la génération d'un jeton activé pour la machine de sécurité %s car %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10034": "Échec de l'importation de la clé secrète. Veuillez vous assurer que la clé est correctement configurée et accessible dans votre environnement cloud.", + "ORG_ZSTACK_IAM2_10011": "ID d'instance virtuelle incorrect[uuid:%s], soit l'instance n'existe pas, soit le mot de passe est incorrect", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10005": "format de type invalide [%s]", + "ORG_ZSTACK_IAM2_10010": "aucun compte trouvé pour le projet[uuid:%s, name:%s] Veuillez vous assurer que vous avez les bonnes permissions et identifiants configurés pour votre environnement cloud.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10035": "la connexion à l'instance de sécurité %s a échoué lors de la génération de la clé de test car %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10006": "uniquement les ressources Cloud supportées, mais [%s] obtenu", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10032": "Échec de l'exportation de la clé secrète : %s", + "ORG_ZSTACK_IAM2_10013": "l'ID virtuel n'appartient pas au projet", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10003": "ne peut pas supporter ce type d'action : %s", + "ORG_ZSTACK_IAM2_10012": "l'ID virtuel[name:%s] est désactivé en raison des paramètres de configuration", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10030": "encryptSubjectDN ne peut pas être nul", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10031": "échec de l'analyse de l'enveloppe de métadonnées pour l'instance cloud %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10002": "ne peut pas supporter ce type de ressource cloud : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10068": "Le stockage primaire NFS [uuid:%s, name:%s] n'est attaché à aucun cluster ou aucun hôte dans les clusters attachés n'est connecté.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10009": "type invalide : %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10007": "uniquement Resource ou Action supportés, mais [%s] obtenu", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10008": "La valeur par défaut doit être au format JSON comme spécifié par le Type [%s], mais [%s] a été trouvé.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10029": "cipherText ne doit pas être nul", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10027": "Échec de la recherche de la clé secrète pour accéder aux ressources chiffrées. Veuillez vous assurer que la clé secrète est correctement configurée et dispose des autorisations nécessaires.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10028": "échec de l'analyse de la clé secrète, erreur : %s", + "ORG_ZSTACK_IAM2_10022": "L'instance virtuelle actuelle [ID: %s] est obsolète, veuillez la réactiver.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10016": "référence de variable dynamique invalide, qui doit être au format ${variable:défaut}", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10024": "échec du chiffrement HMAC du fichier volumineux, code : %s, détails : %s", + "ORG_ZSTACK_IAM2_10021": "L'utilisateur[%s] n'est pas un utilisateur enregistré sur la plateforme", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10017": "Le verbe spécifié doit contenir '::' pour désigner l'espace de noms et la méthode !", + "ORG_ZSTACK_IAM2_10024": "L'ancien mot de passe ne correspond pas au mot de passe original. Impossible de mettre à jour le mot de passe de la machine virtuelle [uuid:%s].", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10014": "Format JSON incorrect, causes : %s", + "ORG_ZSTACK_IAM2_10023": "seuls les administrateurs et l'instance virtuelle elle-même peuvent effectuer des mises à jour", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10015": "impossible de trouver l'ensemble de ressources du fichier de propriétés avant !", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10012": "décodeur invalide : %s !", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10013": "Aucun élément racine trouvé dans votre modèle CloudFormation, veuillez vérifier la définition de votre modèle !", + "ORG_ZSTACK_IAM2_10020": "Le quota[nom:%s] du Compte[uuid:%s] ne peut pas être défini à %d car cela dépasserait le quota de l'organisation[uuid:%s].", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10011": "le type est : %s, mais le type attendu est : %s", + "ORG_ZSTACK_PCIDEVICE_10058": "L'hôte [%s] n'a pas réussi à passer en mode maintenance. La VM [%s] ne peut pas être migrée automatiquement en raison de la présence d'un appareil PCI.", + "ORG_ZSTACK_PCIDEVICE_10056": "échec du démarrage de la VM[UUID:%s] car tous les appareils PCI[UUIDs:%s] n'existent pas", + "ORG_ZSTACK_PCIDEVICE_10059": "l'appareil PCI [uuid:%s] ne peut pas être attaché à la VM [uuid:%s] en raison d'un statut incorrect", + "ORG_ZSTACK_PCIDEVICE_10050": "veuillez démonter tous les appareils GPU de la VM[%s] et réessayer", + "ORG_ZSTACK_PCIDEVICE_10053": "les appareils PCI spécifiés ne sont pas co-localisés : l'appareil PCI avec UUID [%s] est sur l'hôte avec UUID [%s] tandis qu'un autre appareil PCI avec UUID [%s] est sur un hôte différent avec UUID [%s]", + "ORG_ZSTACK_PCIDEVICE_10052": "veuillez démonter les autres appareils PCI de la VM[%s] et réessayer", + "ORG_ZSTACK_PCIDEVICE_10051": "veuillez démonter tous les appareils GPU de la VM[%s] et réessayer", + "ORG_ZSTACK_PCIDEVICE_10068": "impossible de migrer le volume racine [uuid:%s] car il a des appareils PCI attachés", + "ORG_ZSTACK_PCIDEVICE_10066": "impossible de migrer la VM[UUID:%s] car un appareil PCI est attaché", + "ORG_ZSTACK_PCIDEVICE_10061": "échec de la recherche d'un appareil PCI suffisant de spécification [uuid:%s] dans l'hôte de destination [uuid:%s] pour la machine virtuelle [uuid:%s]", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10003": "Aucun plugin de stockage de sauvegarde enregistré avec l'identité : %s", + "ORG_ZSTACK_PCIDEVICE_10065": "l'instance vm[%s] n'existe pas ; ne peut pas être liée à l'appareil PCI[%s]", + "ORG_ZSTACK_PCIDEVICE_10064": "Impossible d'attacher l'appareil PCI [uuid:%s] à la VM [uuid:%s] en raison de problèmes d'allocation des ressources de l'hôte.", + "ORG_ZSTACK_PCIDEVICE_10063": "Les appareils PCI [%s] ne sont pas tous disponibles pour utilisation.", + "ORG_ZSTACK_PCIDEVICE_10062": "quelque chose ne va pas avec le groupe IOMMU de l'appareil PCI[uuid:%s]", + "ORG_ZSTACK_IAM2_10008": "virtualID[uuid:%s] n'existe pas dans le projet[uuid:%s]", + "ORG_ZSTACK_IAM2_10009": "projet[nom:%s] n'existe pas", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10000": "chemin d'installation nul retourné par le pilote: %s", + "ORG_ZSTACK_IAM2_10004": "échec du chargement des informations d'ID de machine virtuelle depuis le fichier car\\n%s", + "ORG_ZSTACK_IAM2_10003": "Il y a %d problèmes dans le code.", + "ORG_ZSTACK_IAM2_10006": "échec de la construction des informations d'ID de machine virtuelle depuis le fichier.", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10001": "%s: état de santé: %s", + "ORG_ZSTACK_IAM2_10005": "UUID [%s] existe déjà. Veuillez en essayer un autre.", + "ORG_ZSTACK_MEMORY_10000": "aucune donnée trouvée pour %s sur l'hôte[%s]", + "ORG_ZSTACK_PCIDEVICE_10036": "impossible de virtualiser SR-IOV les périphériques PCI sur l'hôte [UUID:%s] qui sont attachés à une VM", + "ORG_ZSTACK_PCIDEVICE_10035": "Les périphériques PCI de l'hôte [UUID:%s] sont déjà virtualisés SRIOV.", + "ORG_ZSTACK_PCIDEVICE_10034": "impossible d'activer SRIOV pour le périphérique car IOMMU est désactivé sur l'hôte [UUID:%s]", + "ORG_ZSTACK_PCIDEVICE_10033": "périphérique pci [uuid:%s] n'est pas disponible", + "ORG_ZSTACK_PCIDEVICE_10039": "Le périphérique PCI [UUID:%s] n'existe pas ou n'est pas virtualisé SRIOV.", + "ORG_ZSTACK_PCIDEVICE_10037": "seuls %d périphériques PCI virtuels peuvent être générés par %s domaines dans l'hôte[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10109": "stockage de sauvegarde[uuid: %s] a déjà été mis à jour", + "ORG_ZSTACK_STORAGE_CDP_10104": "tâche[uuid:%s] a été terminée", + "ORG_ZSTACK_STORAGE_CDP_10105": "La tâche CDP fusionne les données; veuillez ne pas lancer d'opération de récupération.", + "ORG_ZSTACK_STORAGE_CDP_10106": "tâche CDP[uuid:%s] a dépassé l'utilisation du stockage: maximum %d Go, utilisé %d Go.", + "ORG_ZSTACK_STORAGE_CDP_10107": "État d'instance VM inattendu: %s", + "ORG_ZSTACK_STORAGE_CDP_10102": "tâche CDP[uuid: %s] n'a pas de machine virtuelle associée", + "ORG_ZSTACK_PCIDEVICE_10047": "périphérique pci [uuid:%s] n'est pas virtualisé en périphériques gérés", + "ORG_ZSTACK_PCIDEVICE_10045": "périphérique pci [uuid:%s] ne peut pas être virtualisé par la spécification mdev [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_10044": "Le périphérique PCI [UUID:%s] ne peut pas être virtualisé en MDEVs. Assurez-vous qu'il est activé et détaché.", + "ORG_ZSTACK_PCIDEVICE_10049": "L'hôte [UUID:%s] auquel le périphérique PCI [UUID:%s] est attaché n'est pas connecté.", + "ORG_ZSTACK_PCIDEVICE_10048": "Périphériques PCI générés depuis [UUID:%s] encore attachés à l'instance VM", + "ORG_ZSTACK_STORAGE_CDP_10119": "type de tâche inattendu: %s", + "ORG_ZSTACK_PCIDEVICE_10043": "impossible de désassigner le périphérique PCI[%s] car ses fonctions virtuelles sont en cours d'utilisation.\\nDétails:\\n%s", + "ORG_ZSTACK_PCIDEVICE_10042": "impossible de désengendrer le périphérique PCI[%s] car ce n'est pas un GPU ou un contrôleur d'interface réseau.", + "ORG_ZSTACK_PCIDEVICE_10041": "Impossible de désengendrer les périphériques PCI virtuels sur l'hôte [uuid:%s] car ils sont encore attachés à une VM.", + "ORG_ZSTACK_PCIDEVICE_10040": "impossible de désengendrer le périphérique pci [uuid:%s] car l'hôte [uuid:%s] n'est pas connecté", + "ORG_ZSTACK_STORAGE_CDP_10117": "Tâche CDP[uuid: %s] non trouvée", + "ORG_ZSTACK_STORAGE_CDP_10118": "Le statut de la tâche CDP[uuid: %s] a changé anormalement, ancien statut: %s, nouveau statut: %s en raison du dépassement du quota de stockage, actuel: %d, quota: %d.", + "ORG_ZSTACK_STORAGE_CDP_10111": "La version QEMU-img du stockage de sauvegarde [UUID: %s] doit être mise à niveau.", + "ORG_ZSTACK_STORAGE_CDP_10112": "Aucune tâche de protection des données cloud trouvée pour la VM: %s", + "ORG_ZSTACK_STORAGE_CDP_10113": "Aucun stockage de sauvegarde configuré pour la machine virtuelle: %s", + "ORG_ZSTACK_STORAGE_CDP_10114": "Aucun CdpBackupFactory de type[%s] trouvé dans l'environnement cloud", + "ORG_ZSTACK_STORAGE_CDP_10110": "L'architecture du stockage de sauvegarde [UUID: %s] ne permet pas la mise à niveau de la tâche de protection continue des données", + "ORG_ZSTACK_IDENTITY_10072": "Impossible de mettre à jour le Quota[nom: %s] pour le compte[identifiant: %s]", + "ORG_ZSTACK_IDENTITY_10071": "Impossible de trouver le vérificateur de mise à jour du quota pour le quota[uuid:%s, type:%s]", + "ORG_ZSTACK_AI_CONTAINER_10001": "Centre de modèle avec uuid %s non trouvé dans l'environnement cloud", + "ORG_ZSTACK_AI_CONTAINER_10005": "Échec de la récupération de l'URL du service, possiblement en raison d'une adresse IP de service nulle. Veuillez vérifier la configuration réseau Kubernetes.", + "ORG_ZSTACK_AI_CONTAINER_10004": "Échec de la création du service Kubernetes dans l'environnement cloud", + "ORG_ZSTACK_AI_CONTAINER_10003": "Échec de la création du déploiement Kubernetes pour l'application %s dans l'espace de noms %s en raison de contraintes ou de problèmes de configuration des ressources de cloud computing. Veuillez vérifier votre allocation de ressources et la configuration de déploiement.", + "ORG_ZSTACK_AI_CONTAINER_10009": "Point de terminaison avec UUID %s non trouvé, impossible de synchroniser les ressources de conteneur dans la base de données", + "ORG_ZSTACK_AI_CONTAINER_10007": "Échec de l'initialisation du service de stockage dans le cluster Kubernetes", + "ORG_ZSTACK_AI_CONTAINER_10006": "Échec de la création de la politique de réseau pour l'instance de service du modèle de distribution %s", + "ORG_ZSTACK_TAG2_10011": "La ressource[uuid:%s] a été associée à %d balises et ne peut plus en accueillir d'autres.", + "ORG_ZSTACK_IDENTITY_10063": "Une instruction doit avoir un champ d'action non vide. Instruction invalide[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10006": "Il y a déjà un stockage principal NFS avec l'URL %s dans la zone[uuid:%s]", + "ORG_ZSTACK_IDENTITY_10062": "Une instruction doit spécifier un champ d'action. Instruction invalide[%s]", + "ORG_ZSTACK_IDENTITY_10061": "Une instruction doit assigner une valeur ou avoir un effet sur l'état. Instruction invalide[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10008": "Plusieurs blocs CIDR associés à l'interface réseau trouvés. Veuillez spécifier un seul bloc CIDR ou vérifier votre configuration réseau.", + "ORG_ZSTACK_IDENTITY_10060": "Le groupe[nom: %s, uuid: %s] n'est pas associé au compte[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10009": "Bloc CIDR invalide: %s", + "ORG_ZSTACK_IDENTITY_10067": "Le nom du compte administrateur ne peut pas être mis à jour. Veuillez vous assurer que vous utilisez la syntaxe et les paramètres corrects pour modifier les informations du compte. Pour plus de détails, reportez-vous à la documentation officielle.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10002": "Impossible de trouver un hôte connecté dans le cluster pour le groupe de placement spécifié [uuid: %s]", + "ORG_ZSTACK_IDENTITY_10066": "Le mot de fourni ne correspond pas au mot de passe actuel pour le compte [UUID: %s]. Veuillez vérifier l'exactitude et réessayer.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10003": "Impossible de trouver un hôte connecté pour exécuter la commande pour le stockage principal NFS [uuid:%s]", + "ORG_ZSTACK_IDENTITY_10065": "Un compte porte déjà un nom qui correspond à %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10004": "Impossible de trouver un hôte avec une connexion NFS connectée pour exécuter des commandes pour le stockage principal NFS [uuid:%s]", + "ORG_ZSTACK_IDENTITY_10069": "compte[uuid: %s, nom: %s] est un compte standard et n'a pas l'autorité pour réinitialiser le mot de passe d'un autre compte[uuid: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10000": "Le stockage primaire NFS [uuid:%s] n'est attaché à aucun cluster de calcul et ne peut donc pas supprimer le volume racine [uuid:%s] de la machine virtuelle [uuid:%s].", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10004": "seule l'image baremetal2 avec le mode de démarrage %s est supportée", + "ORG_ZSTACK_IDENTITY_10068": "Seuls les comptes administratifs peuvent mettre à jour leurs mots de passe.", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10003": "L'attribut bootMode est obligatoire pour les images baremetal2.", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10002": "seul le modèle de volume racine au format raw/qcow2 peut être étiqueté avec baremetal2", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10001": "seule une étiquette système de type baremetal2 est autorisée, mais %d ont été trouvées", + "ORG_ZSTACK_AI_CONTAINER_10012": "échec de trouver le nom du pod par ip %s", + "ORG_ZSTACK_AI_CONTAINER_10011": "Échec de récupération de l'adresse IP du pod, impossible d'ajouter une entrée à la table des points de terminaison du conteneur. Veuillez vous assurer que le pod est en cours d'exécution et accessible.", + "ORG_ZSTACK_AI_CONTAINER_10010": "cluster avec uuid %s non trouvé dans l'environnement de virtualisation", + "ORG_ZSTACK_COMPUTE_VM_NUMA_10003": "ensemble de processeurs [%s] invalide", + "ORG_ZSTACK_AI_CONTAINER_10016": "échec de récupération du déploiement k8s %s", + "ORG_ZSTACK_AI_CONTAINER_10015": "échec de suppression du service Kubernetes car %s", + "ORG_ZSTACK_TAG2_10008": "tous les types de jetons doivent être spécifiés", + "ORG_ZSTACK_AI_CONTAINER_10014": "échec de suppression du déploiement Kubernetes, car %s", + "ORG_ZSTACK_AI_CONTAINER_10013": "échec d'ajout de l'étiquette %s au pod %s", + "ORG_ZSTACK_TAG2_10006": "Spécification de couleur[%s] invalide, doit être un code hexadécimal valide comme #FF00FF", + "ORG_ZSTACK_TAG2_10007": "Obtenir le format[%s], le format doit être soit name::{tokenName1}::{tokenName2} ... ::{tokenNameN} ou {tokenName1}::{tokenName2} ... ::{tokenNameN}. Les noms ne doivent pas contenir '{}:'.", + "ORG_ZSTACK_AI_CONTAINER_10019": "format YAML invalide: %s", + "ORG_ZSTACK_TAG2_10004": "le modèle d'étiquette simple est vide ou contient des jetons invalides", + "ORG_ZSTACK_AI_CONTAINER_10018": "le déploiement %s n'a pas d'informations d'instance", + "ORG_ZSTACK_TAG2_10005": "UUIDs d'étiquette %s illégaux, le type d'étiquette doit être un type simple", + "ORG_ZSTACK_AI_CONTAINER_10017": "le déploiement %s n'existe pas", + "ORG_ZSTACK_IDENTITY_10070": "impossible de trouver Quota[name: %s] pour le compte[uuid: %s]", + "ORG_ZSTACK_TAG2_10002": "impossible de mettre à jour le format du modèle d'étiquette simple pour les métadonnées des ressources cloud", + "ORG_ZSTACK_TAG2_10003": "Ressource en double nom trouvée. Veuillez vérifier et résoudre.", + "ORG_ZSTACK_SNS_PLATFORM_WECOM_10000": "échec d'envoi des messages à WeCom. statut: %s, corps: %s", + "ORG_ZSTACK_TAG2_10000": "Violation de l'unicité de l'étiquette: Une étiquette de type [%s] avec le nom [%s] existe déjà sous le compte [%d].", + "ORG_ZSTACK_TAG2_10001": "Vous ne pouvez mettre à jour que l'ID du jeton.", + "ORG_ZSTACK_PCIDEVICE_10072": "spécification de dispositif pci[uuid:%s] n'existe pas", + "ORG_ZSTACK_PCIDEVICE_10071": "Type illegal[%s] pour périphérique PCI, seuls les types pris en charge sont valides", + "ORG_ZSTACK_PCIDEVICE_10070": "le périphérique PCI [uuid:%s] n'existe pas", + "ORG_ZSTACK_PCIDEVICE_10075": "Le périphérique PCI [UUID:%s] n'existe pas ou est désactivé pour la VM [UUID:%s]", + "ORG_ZSTACK_PCIDEVICE_10073": "Type illegal[%s] pour la spécification du périphérique PCI, seuls les types pris en charge sont valides", + "ORG_ZSTACK_AI_CONTAINER_10023": "YAML de déploiement Kubernetes invalide : %s", + "ORG_ZSTACK_AI_CONTAINER_10020": "échec du correctif du déploiement Kubernetes %s pour terminer tous les pods", + "ORG_ZSTACK_AI_CONTAINER_10025": "groupe d'instances de service de modèle %s non trouvé dans la base de données", + "ORG_ZSTACK_AI_CONTAINER_10024": "échec du correctif du déploiement k8s %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10039": "échec de la création du volume root[uuid:%s] à partir de l'image mise en cache[path:%s] en raison d'une erreur dans l'environnement de virtualisation", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10040": "originText ou certificateText ne peut pas être nul", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10036": "échec de la suppression des bits[%s] sur le stockage primaire NFS[uuid:%s], erreur : %s, chemin d'installation sera nettoyé, pinv.getUuid(), rsp.getError()", + "ORG_ZSTACK_NETWORK_L3_10067": "Échec DNS sur le réseau Layer 3 [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10037": "échec de la restauration du volume[uuid:%s] vers l'instantané[uuid:%s] sur l'hôte KVM[uuid:%s, ip:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10038": "échec de la restauration du volume[uuid:%s] vers l'image[uuid:%s] sur l'hôte KVM[uuid:%s, ip:%s], %s", + "ORG_ZSTACK_CRYPTO_AUTH_10020": "Impossible de générer la classe pour %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10032": "échec de la vérification de l'existence de %s sur le stockage primaire NFS[uuid:%s], erreur : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10034": "impossible de créer le volume vide[uuid:%s, name:%s] sur l'hôte KVM[uuid:%s, ip:%s], car %s", + "ORG_ZSTACK_CRYPTO_AUTH_10029": "Échec de la recherche des informations de certificat pour la machine virtuelle %s. Veuillez vous assurer que les certificats nécessaires sont correctement configurés et téléchargés dans l'environnement cloud.", + "ORG_ZSTACK_CRYPTO_AUTH_10028": "échec de l'analyse du texte brut dans le paramètre de chiffrement vers un objet JSON : %s", + "ORG_ZSTACK_HYGON_10006": "VM[uuid:%s] non trouvée", + "ORG_ZSTACK_HYGON_10005": "L'hôte avec l'UUID %s a %d machine(s) virtuelle(s) en cours d'exécution avec les fonctionnalités de sécurité Hygon activées. Veuillez d'abord les arrêter.", + "ORG_ZSTACK_HYGON_10004": "l'hôte[uuid:%s] n'est pas connecté", + "ORG_ZSTACK_HYGON_10003": "L'hôte[UUID:%s] nécessite que le paramètre 'enableCgroupDeviceAcl' soit supérieur à 0 pour les périphériques mdev Hygon. Veuillez configurer ce paramètre avant de générer des périphériques mdev.", + "ORG_ZSTACK_HYGON_10002": "L'hôte[UUID:%s] nécessite que la configuration 'reconnect.host.restart.libvirtd.service' soit définie sur 'true' pour les périphériques mdev Hygon. Veuillez configurer ce paramètre avant de générer des périphériques mdev.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10017": "génération du certificat échouée pour l'instance cloud %s", + "ORG_ZSTACK_HYGON_10000": "impossible de supprimer la génération des périphériques mdev, il y a encore %d périphérique(s) mdev attaché(s) aux VMs sur l'hôte [uuid: %s]. Veuillez vous assurer que toutes les VMs utilisant ces périphériques sont d'abord arrêtées.", + "ORG_ZSTACK_NETWORK_L3_10073": "Il n'y a pas d'itinéraire hôte pour le préfixe[%s] sur le réseau Layer 3[uuid:%s].", + "ORG_ZSTACK_NETWORK_L3_10072": "le préfixe [%s] n'est pas un CIDR réseau IPv4 valide", + "ORG_ZSTACK_NETWORK_L3_10071": "il y a déjà un itinéraire hôte pour le préfixe[%s] sur le réseau L3[uuid:%s]", + "ORG_ZSTACK_HYGON_10009": "échec de l'allocation des périphériques MDEV Hygon en raison d'une allocation concurrente. Veuillez réessayer plus tard.", + "ORG_ZSTACK_NETWORK_L3_10070": "next-hop[%s] n'est pas une adresse IPv4 valide", + "ORG_ZSTACK_HYGON_10008": "appareils Hygon IOMMU Group insuffisants sur l'hôte[uuid:%s]. Requis : %d", + "ORG_ZSTACK_HYGON_10007": "impossible de modifier les paramètres Hygon Security Element pendant que la VM[uuid:%s] est dans l'état [%s], veuillez arrêter la VM avant de faire des modifications", + "ORG_ZSTACK_TICKET_ENTITY_10001": "opération refusée. le ticket est dans le statut %s, impossible d'effectuer l'opération[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10031": "le groupe de sécurité [%s] n'existe pas", + "ORG_ZSTACK_IDENTITY_10022": "impossible de trouver la ressource[UUID:%s]; UUID de ressource incorrect ou la ressource est une ressource administrative", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10049": "Impossible de trouver un backend utilisable pour l'allocation de ressources cloud. Veuillez vous assurer que vos services backend sont correctement configurés et disponibles.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10042": "aucun hôte dans le cluster[uuid:%s] n'est disponible pour la connexion", + "ORG_ZSTACK_IDENTITY_10026": "%s n'est pas un point d'accès API reconnu", + "ORG_ZSTACK_IDENTITY_10025": "l'utilisateur spécifié par userUuid[%s] n'appartient pas au compte actuel, et le compte actuel manque de privilèges administratifs, donc il ne peut pas vérifier les permissions de l'utilisateur", + "ORG_ZSTACK_IDENTITY_10029": "impossible de trouver le compte[uuid:%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10001": "le modèle d'instance de sécurité[uuid:%s] n'est pas valide", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10037": "type d'algorithme %s non valide, types supportés : %s.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10002": "l'instance de sécurité [%s] n'a pas réussi à déclencher manuellement la synchronisation, veuillez confirmer si l'instance de sécurité a synchronisé la clé !", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10038": "le pool de ressources[%s] spécifié pour la protection des données n'existe pas", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10000": "secretResourcePool[uuid:%s] n'est pas dans l'état attendu %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10032": "il y a eu un incident de sécurité avec l'IP de gestion [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10033": "managementIp[%s] n'est pas une adresse IPv4 valide", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10034": "échec de l'établissement d'une connexion vers l'instance de sécurité %s[%s], en raison de %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10035": "Après activation de la fonction de chiffrement, au moins une instance de sécurité doit être réservée dans le pool de ressources correspondant.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10017": "impossible de créer le répertoire[installUrl:%s] sur l'hôte KVM[uuid:%s, ip:%s], car %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10018": "Aucun hôte du cluster n'est connecté ou le stockage principal [uuid:%s] n'est attaché à un cluster", + "ORG_ZSTACK_IDENTITY_10050": "toPublic est défini à false, accountUUIDs ne peut pas être null ou vide. Veuillez vous assurer que les UUID sont fournis.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10019": "échec du ping du stockage principal NFS [uuid:%s] depuis l'hôte [uuid:%s], en raison de problèmes de réseau ou d'indisponibilité. déconnecter cette connexion hôte-ps.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10013": "échec du transfert [%s] depuis le stockage de sauvegarde SFTP [hostname:%s] vers le stockage principal NFS [uuid:%s, path:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10014": "échec du téléchargement des bits depuis le stockage principal NFS[uuid:%s, mountpoint:%s] vers le stockage de sauvegarde SFTP[hostname:%s, path:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10016": "impossible d'attacher un stockage principal[uuid:%s, name:%s] au cluster[uuid:%s]. L'hôte KVM dans le cluster utilise qemu-img avec la version[%s]; cependant, le stockage principal est attaché à un autre cluster qui a un hôte KVM utilisant qemu-img avec la version[%s]. Les versions de qemu-img supérieures à %s sont incompatibles avec celles inférieures à %s, ce qui peut causer l'échec des opérations de snapshot de volume. Veuillez éviter d'attacher un stockage principal à des clusters avec des distributions Linux différentes pour éviter les incompatibilités de version de qemu-img.", + "ORG_ZSTACK_IDENTITY_10059": "l'utilisateur[name: %s, uuid: %s] n'est pas associé au compte[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10010": "l'adresse IP [%s] n'appartient pas au bloc CIDR [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10011": "il y a %s machines virtuelles en cours d'exécution sur le stockage principal NFS, veuillez les arrêter et réessayer :", + "ORG_ZSTACK_IDENTITY_10057": "La politique [nom : %s, uuid : %s] n'appartient pas au compte [uuid : %s]", + "ORG_ZSTACK_CRYPTO_AUTH_10009": "modèle de pool de ressources secret incorrect, attendu %s, mais trouvé %s", + "ORG_ZSTACK_CRYPTO_AUTH_10008": "échec de la recherche du modèle pour le pool de ressources secret [%s]", + "ORG_ZSTACK_CRYPTO_AUTH_10006": "L'opération n'est pas prise en charge dans l'environnement cloud actuel. Veuillez vous assurer que votre instance de machine virtuelle prend en charge l'opération requise.", + "ORG_ZSTACK_IDENTITY_10041": "Impossible de créer un groupe. Un groupe portant le même nom existe déjà sous le compte [UUID : %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10028": "L'hôte sélectionné [UUID:%s] pour la migration du stockage n'est pas disponible.", + "ORG_ZSTACK_CRYPTO_AUTH_10016": "Échec de l'établissement d'une connexion avec le nœud de service cryptographique distant. Veuillez vous assurer que le service est en cours d'exécution et que la connectivité réseau est correctement configurée.", + "ORG_ZSTACK_IDENTITY_10040": "accountName et accountUuid ne peuvent pas être tous les deux nuls ; au moins l'un d'entre eux doit être spécifié.", + "ORG_ZSTACK_CRYPTO_AUTH_10015": "L'authentification d'identité ne spécifie pas le pool de ressources pour allouer des ressources. Veuillez vous assurer que le pool de ressources est correctement identifié et spécifié pour le service.", + "ORG_ZSTACK_IDENTITY_10045": "Impossible de supprimer le compte administratif intégré. Veuillez utiliser un compte non-intégré pour la suppression.", + "ORG_ZSTACK_IDENTITY_10044": "Le compte %s est interdit de se supprimer lui-même. Veuillez contacter un administrateur pour obtenir de l'aide.", + "ORG_ZSTACK_IDENTITY_10043": "Impossible de créer un compte. Un compte portant le même nom existe déjà.", + "ORG_ZSTACK_IDENTITY_10042": "Impossible de créer un utilisateur. Un utilisateur portant le même nom existe déjà sous le compte [UUID : %s].", + "ORG_ZSTACK_IDENTITY_10049": "Toutes les vérifications d'authentification ont échoué, et la liste des UUID de comptes spécifiée est nulle ou vide. Veuillez vérifier votre entrée et vous assurer que des UUID de comptes valides sont fournis.", + "ORG_ZSTACK_IDENTITY_10048": "Votre session est associée à un utilisateur. Vous ne pouvez pas assumer l'identité d'un autre utilisateur [uuid:%s].", + "ORG_ZSTACK_IDENTITY_10047": "La session actuelle est une session basée sur un compte. Veuillez spécifier l'« uuid » de l'utilisateur que vous souhaitez mettre à jour.", + "ORG_ZSTACK_IDENTITY_10046": "Seul un administrateur peut mettre fin à l'accès au compte.", + "ORG_ZSTACK_CRYPTO_AUTH_10019": "Échec de l'obtention du mot de passe d'intégrité de la base de données car %s ne génère pas de mot de passe d'intégrité", + "ORG_ZSTACK_VHOST_KVM_10000": "Le disque vHostUser ne prend en charge que le mode virtio. Veuillez vérifier que la plateforme d'image dispose des pilotes virtio nécessaires.", + "ORG_ZSTACK_VHOST_KVM_10001": "Le disque vhost-user ne prend pas en charge le mode virtio-scsi ; veuillez désactiver le mode virtio-scsi.", + "ORG_ZSTACK_NETWORK_L3_10029": "%s n'est pas une adresse IPv6 valide pour la configuration des ressources cloud", + "ORG_ZSTACK_USBDEVICE_10005": "PassThrough ne peut être utilisé que sur une machine virtuelle s'exécutant dans l'environnement hôte.", + "ORG_ZSTACK_ALIYUN_ECS_10019": "Seuls les utilisateurs administratifs peuvent définir le paramètre [onlyZstack] sur false.", + "ORG_ZSTACK_STORAGE_BACKUP_10018": "échec de la création de l'image à partir de la sauvegarde %s", + "ORG_ZSTACK_ALIYUN_ECS_10018": "Seules les instances ECS postpayées prennent en charge la suppression à distance ; le type de facturation de l'instance ECS indiqué est : %s", + "ORG_ZSTACK_USBDEVICE_10002": "Le nombre de dispositifs USB attachés à la machine virtuelle a atteint la limite. Utilisation actuelle : %s", + "ORG_ZSTACK_ALIYUN_ECS_10017": "Seules les instances ECS avec le statut Exécution ou Arrêté peuvent être supprimées, le statut actuel est %s", + "ORG_ZSTACK_NETWORK_L3_10025": "impossible d'obtenir une IP libre avec start[ip:%s] car start[ip:%s] n'est pas une adresse IPv6 valide", + "ORG_ZSTACK_USBDEVICE_10009": "impossible de migrer la machine virtuelle [uuid:%s] car elle dispose de dispositifs USB attachés par pass-through", + "ORG_ZSTACK_STORAGE_BACKUP_10015": "impossible d'allouer %s sur le stockage de sauvegarde [uuid:%s], il n'a que %s de disponible", + "ORG_ZSTACK_NETWORK_L3_10024": "n'a pas pu obtenir une adresse IP libre avec start[ip:%s] car start[ip:%s] n'est pas une adresse IPv4 valide", + "ORG_ZSTACK_USBDEVICE_10008": "vm[%s] ne peut pas démarrer car la redirection USB vers l'hôte n'est pas établie", + "ORG_ZSTACK_NETWORK_L3_10023": "n'a pas pu obtenir une adresse IP libre avec start[ip:%s], car le l3Network[uuid:%s] est configuré en mode double pile", + "ORG_ZSTACK_USBDEVICE_10007": "USB est déjà lié à la machine virtuelle [UUID:%s] et ne peut pas être lié à une autre VM.", + "ORG_ZSTACK_STORAGE_BACKUP_10013": "le stockage principal requis [uuid:%s, type:%s] ne prend en charge aucun stockage de sauvegarde.", + "ORG_ZSTACK_NETWORK_L3_10022": "ipRangeUuid et l3NetworkUuid ne peuvent pas être tous les deux nuls ; au moins un doit être défini.", + "ORG_ZSTACK_USBDEVICE_10006": "impossible de connecter le périphérique USB [uuid:%s] à la VM [uuid:%s], les raisons possibles incluent : le périphérique n'est pas activé ou a été connecté à une autre VM, ou le périphérique et la VM ne sont pas sur le même hôte.", + "ORG_ZSTACK_ALIYUN_ECS_10015": "L'image a été supprimée ! Veuillez vous assurer que l'image a été correctement terminée et que toutes les ressources ont été libérées avant la suppression.", + "ORG_ZSTACK_ALIYUN_ECS_10014": "l'image ECS existe à distance, nom : %s, date de création : %s", + "ORG_ZSTACK_ALIYUN_ECS_10013": "l'image ECS existait à distance et localement, UUID de l'image ECS : %s, nom : %s, date de création : %s", + "ORG_ZSTACK_NETWORK_L3_10032": "Le pool d'adresses IPv6 n'est pas pris en charge ; par conséquent, l'ajout de plage d'adresses IP n'est pas possible. Veuillez vous assurer que votre configuration réseau prend en charge IPv6 avant de continuer.", + "ORG_ZSTACK_STORAGE_BACKUP_10011": "une seule étiquette système de réseau de données de stockage de sauvegarde est autorisée, mais %s obtenue", + "ORG_ZSTACK_NETWORK_L3_10030": "[startIp %s, endIp %s, prefixLen %d, gateway %s] ne représente pas une plage IPv6 valide pour les configurations de réseau cloud.", + "ORG_ZSTACK_STORAGE_BACKUP_10010": "La réservation de capacité sur tous les nœuds de stockage de sauvegarde a échoué. Veuillez vérifier la disponibilité de vos ressources de stockage de sauvegarde.", + "ORG_ZSTACK_USBDEVICE_10016": "Vous pouvez connecter au maximum %s périphériques USB 3.0 à une instance de machine virtuelle.", + "ORG_ZSTACK_USBDEVICE_10015": "Vous pouvez connecter au maximum %s périphérique USB 2.0 à une instance VM.", + "ORG_ZSTACK_NETWORK_L3_10038": "le nouveau réseau CIDR [%s] diffère de l'ancien réseau CIDR [%s]", + "ORG_ZSTACK_USBDEVICE_10014": "Vous pouvez connecter au maximum %s périphérique USB 1.0 à une instance VM.", + "ORG_ZSTACK_NETWORK_L3_10037": "la nouvelle plage d'adresses IP [startIP:%s, endIP:%s] chevauche une plage d'adresses IP existante [startIP:%s, endIP:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10028": "la sauvegarde de volume [uuid:%s] n'a pas été trouvée dans le volume de stockage [uuid:%s]", + "ORG_ZSTACK_NETWORK_L3_10036": "la longueur du préfixe ipv6 doit être %d pour Stateless-DHCP ou SLAAC", + "ORG_ZSTACK_NETWORK_L3_10035": "addressMode[%s] diffère du mode d'adresse L3Network[%s]", + "ORG_ZSTACK_USBDEVICE_10019": "le périphérique USB [UUID:%s] n'est pas dans un état connectable de %s", + "ORG_ZSTACK_NETWORK_L3_10034": "le réseau du système ne prend actuellement pas en charge IPv6, par conséquent l'ajout de plage d'adresses IP n'est pas pris en charge pour le moment. Veuillez vous assurer que votre configuration réseau prend en charge IPv6 avant de tenter cette opération.", + "ORG_ZSTACK_USBDEVICE_10018": "le périphérique USB [UUID:%s] a déjà été connecté à une autre machine virtuelle [UUID:%s].", + "ORG_ZSTACK_NETWORK_L3_10033": "la longueur du préfixe de la plage d'adresses IP est hors de la plage valide [%d - %d]", + "ORG_ZSTACK_USBDEVICE_10017": "le périphérique USB [UUID: %s] a déjà été connecté à la même VM [UUID: %s].", + "ORG_ZSTACK_STORAGE_BACKUP_10024": "la sauvegarde de volume [uuid:%s] n'a pas été trouvée sur le nœud de stockage [uuid:%s]", + "ORG_ZSTACK_ALIYUN_ECS_10022": "l'adresse IP privée existe dans VSwitch : %s, allouée à l'ECS : %s", + "ORG_ZSTACK_ALIYUN_ECS_10021": "%s n'est pas dans la plage CIDR : %s", + "ORG_ZSTACK_ALIYUN_ECS_10020": "Adresses IP disponibles du vSwitch insuffisantes, actuellement (%d)", + "ORG_ZSTACK_USBDEVICE_10012": "impossible de migrer la VM [uuid:%s] car elle possède des périphériques PCI attachés", + "ORG_ZSTACK_ALIYUN_ECS_10027": "Une offre d'instance ou un type d'instance doit être spécifié !", + "ORG_ZSTACK_USBDEVICE_10011": "impossible de migrer le volume root [uuid:%s] car il existe des périphériques de stockage attachés", + "ORG_ZSTACK_ALIYUN_ECS_10026": "%s n'est pas un type de volume valide, les types valides sont [%s]", + "ORG_ZSTACK_ALIYUN_ECS_10025": "%s n'est pas une adresse IPv4 valide", + "ORG_ZSTACK_ALIYUN_ECS_10024": "la bande passante doit être spécifiée lors de l'allocation d'une adresse IP publique", + "ORG_ZSTACK_NETWORK_L3_10043": "%s n'est pas un masque CIDR réseau valide", + "ORG_ZSTACK_STORAGE_BACKUP_10023": "Un des stockages de sauvegarde [UUID: %s] est dans l'état %s, et ne peut donc pas effectuer d'opération de synchronisation.", + "ORG_ZSTACK_NETWORK_L3_10042": "la passerelle[gatewayId] n'est pas dans le sous-réseau subnetId", + "ORG_ZSTACK_STORAGE_BACKUP_10022": "Aucune usine de sauvegarde de volume de type[%s] trouvée", + "ORG_ZSTACK_NETWORK_L3_10041": "%s n'est pas un CIDR réseau valide car il ne contient aucune adresse IP utilisable", + "ORG_ZSTACK_STORAGE_BACKUP_10021": "La VM actuelle[UUID: %s] du volume de sauvegarde n'est plus la VM[UUID: %s] qui était utilisée pour la sauvegarde.", + "ORG_ZSTACK_STORAGE_BACKUP_10020": "la synchronisation du fichier de métadonnées de sauvegarde du volume dans le magasin d'images[uuid:%s] a rencontré une erreur d'E/S : %s", + "ORG_ZSTACK_NETWORK_L3_10049": "le réseau l3 [uuid %s: nom %s] n'est pas un réseau public ; par conséquent, la plage de pool d'adresses ne peut pas être ajoutée.", + "ORG_ZSTACK_NETWORK_L3_10047": "combinaison non valide de système et de catégorie, seules certaines plateformes de cloud computing sont valides", + "ORG_ZSTACK_NETWORK_L3_10046": "%s n'est pas un nom de domaine FQDN valide", + "ORG_ZSTACK_NETWORK_L3_10045": "type de réseau l3 non supporté[%s]", + "ORG_ZSTACK_NETWORK_L3_10044": "ipRangeUuids, L3NetworkUuids et zoneUuids doivent chacun contenir au moins une liste non vide, ou toutes les valeurs doivent être définies à true.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10023": "impossible d'attacher la règle de redirection de port avec le CIDR autorisé car vmNic[uuid:%s] a déjà des règles qui chevauchent les plages de ports privés[%s, %s] et ont le même type de protocole[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10024": "impossible d'attacher la règle de redirection de port car vmNic [uuid:%s] a déjà une règle en conflit qui chevauche la plage de ports privés[%s, %s] et partage le même type de protocole[%s].", + "ORG_ZSTACK_SNMP_10010": "Échec de %s de l'agent SNMP car le mot de passe de confidentialité ne peut pas être vide.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10021": "Le VMNic [UUID:%s] a déjà des règles de redirection de port avec des VIP différents de celui [UUID:%s].", + "ORG_ZSTACK_ALIYUN_NAS_CORE_10000": "Le stockage principal [%s] est encore opérationnel ; par conséquent, la suppression du groupe d'accès n'est pas possible.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10022": "L'UUID de vmNic[%s] n'est pas autorisé à ajouter une redirection de port avec une règle de CIDR autorisé car il a déjà une adresse IP publique associée.", + "ORG_ZSTACK_NETWORK_L3_10054": "L'allocation d'IP ne peut pas contenir des adresses réseau ou des adresses de diffusion. Veuillez vous assurer que l'IP fournie est une adresse hôte valide dans le sous-réseau.", + "ORG_ZSTACK_NETWORK_L3_10053": "la passerelle[gatewayId] n'est pas dans le sous-réseau subnetId/cidrBlock", + "ORG_ZSTACK_NETWORK_L3_10052": "La plage d'adresses IP [%s ~ %s] comprend des adresses link-local, qui sont réservées à la virtualisation et ne doivent pas être utilisées.", + "ORG_ZSTACK_NETWORK_L3_10051": "La plage d'adresses IP [%s ~ %s] contient des adresses de classe E, qui sont réservées.", + "ORG_ZSTACK_NETWORK_L3_10050": "La plage d'adresses IP [%s ~ %s] comprend des adresses de classe D, réservées aux communications multicast.", + "ORG_ZSTACK_STORAGE_BACKUP_10008": "Après avoir soustrait la capacité réservée, aucun stockage de sauvegarde disponible n'a la capacité requise [%s octets]", + "ORG_ZSTACK_STORAGE_BACKUP_10006": "Le stockage de sauvegarde [UUID:%s] a été associé à la zone [UUID:%s]", + "ORG_ZSTACK_NETWORK_L3_10059": "L'adresse IP de début [%s] est après l'adresse IP de fin [%s]", + "ORG_ZSTACK_ALIYUN_ECS_10006": "Échec du décodage de l'URL : %s", + "ORG_ZSTACK_STORAGE_BACKUP_10005": "Le stockage de sauvegarde avec UUID:%s n'a pas été attaché à la zone avec UUID:%s", + "ORG_ZSTACK_NETWORK_L3_10058": "Le masque de réseau [%s] n'est pas un masque valide et doit être spécifié pour éviter un masque IP invalide de 0.0.0.0.", + "ORG_ZSTACK_STORAGE_BACKUP_10004": "zoneUuids et backupStorageUuids doivent tous deux avoir au moins une liste non vide, ou être tous deux définis sur true.", + "ORG_ZSTACK_NETWORK_L3_10057": "La passerelle [%s] n'est pas une adresse IPv4 valide", + "ORG_ZSTACK_STORAGE_BACKUP_10003": "%s ne doit pas être nul dans une configuration de machine virtuelle", + "ORG_ZSTACK_NETWORK_L3_10056": "L'adresse IP de fin [%s] n'est pas une adresse IPv4 valide", + "ORG_ZSTACK_NETWORK_L3_10055": "L'adresse IP de début [%s] n'est pas une adresse IPv4 valide", + "ORG_ZSTACK_CORE_SALT_10000": "Le protocole SCP n'est pas trouvé dans le système [%s], impossible d'établir la configuration Salt.", + "ORG_ZSTACK_ALIYUN_ECS_10004": "Aucun disque système trouvé pour l'instance : [%s], l'identifiant de l'instance est : [%s]", + "ORG_ZSTACK_CORE_SALT_10003": "Échec de l'exécution de l'état Salt [%s] sur l'instance [%s], échec après %s tentatives", + "ORG_ZSTACK_ALIYUN_ECS_10003": "Cette zone de disponibilité [%s] ne peut pas supporter le type d'instance [%s] actuellement, veuillez choisir un autre type d'instance ou une autre zone de disponibilité.", + "ORG_ZSTACK_ALIYUN_ECS_10002": "Aucun type d'instance disponible actuellement. Veuillez revenir plus tard ou modifier vos spécifications.", + "ORG_ZSTACK_SNMP_10000": "La création de l'agent SNMP a échoué car un existe déjà.", + "ORG_ZSTACK_SNMP_10001": "Échec de la terminaison du service de l'agent SNMP, veuillez vous assurer qu'une instance d'agent SNMP est créée d'abord.", + "ORG_ZSTACK_NETWORK_L3_10065": "L'ajout d'une plage IP normale nécessite la spécification de l'adresse IP de la passerelle.", + "ORG_ZSTACK_SNMP_10002": "Échec de la mise à jour de la configuration de l'agent SNMP. Veuillez vous assurer qu'un agent SNMP est créé d'abord.", + "ORG_ZSTACK_NETWORK_L3_10064": "La passerelle de la nouvelle plage IP ajoutée %s est différente de la passerelle existante %s", + "ORG_ZSTACK_SNMP_10003": "Échec de %s l'agent SNMP, la communauté de lecture ne peut pas être vide lorsque la version est v2c", + "ORG_ZSTACK_NETWORK_L3_10063": "La passerelle [%s] ne peut pas faire partie de la plage [%s, %s]", + "ORG_ZSTACK_SNMP_10004": "Échec de %s l'agent SNMP car la communauté de lecture ne peut pas être vide lorsque la version est v2c", + "ORG_ZSTACK_NETWORK_L3_10062": "Le point de terminaison [%s] n'est pas dans le sous-réseau %s/%d", + "ORG_ZSTACK_SNMP_10005": "Échec de %s l'agent SNMP car le nom d'utilisateur ne peut pas être vide lorsque la version est v3", + "ORG_ZSTACK_NETWORK_L3_10061": "Plusieurs blocs CIDR ne sont pas autorisés sur le même réseau L3. Une plage IP existante [uuid:%s, CIDR:%s] existe déjà ; par conséquent, le nouveau bloc CIDR [%s] est invalide.", + "ORG_ZSTACK_SNMP_10006": "Échec de %s l'agent SNMP, l'algorithme d'authentification ne peut pas être nul lorsque le mot de passe n'est pas fourni.", + "ORG_ZSTACK_NETWORK_L3_10060": "Chevauchement avec la plage IP [uuid:%s, ip_début:%s, ip_fin: %s]", + "ORG_ZSTACK_SNMP_10007": "Échec de %s l'agent SNMP en raison du mot de passe d'authentification vide.", + "ORG_ZSTACK_SNMP_10008": "Échec de %s l'agent SNMP car la configuration du chiffrement des données nécessite que la vérification de l'utilisateur soit définie en premier.", + "ORG_ZSTACK_XINFINI_10019": "Échec de la récupération des détails du nœud %s, vérifiez l'adresse IP et la configuration du rôle", + "ORG_ZSTACK_XINFINI_10018": "Aucun nœud de machine virtuelle trouvé", + "ORG_ZSTACK_XINFINI_10017": "Aucune instance de machine virtuelle connectée trouvée. Veuillez vous assurer qu'un nœud est correctement connecté et réessayez.", + "ORG_ZSTACK_XINFINI_10016": "Protocole[%s] non pris en charge pour la connexion active", + "ORG_ZSTACK_XINFINI_10015": "non supported get volume info from [%s] (garder tel quel car c'est le format du message)", + "ORG_ZSTACK_XINFINI_10014": "Protocole de stockage[%s] non pris en charge", + "ORG_ZSTACK_XINFINI_10013": "Protocole[%s] non pris en charge pour la désactivation", + "ORG_ZSTACK_XINFINI_10012": "Impossible de récupérer les détails du volume [%s], probablement en raison de la suppression", + "ORG_ZSTACK_XINFINI_10010": "Configuration vide, impossible de découvrir l'instance xinfini", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10021": "L'adresse IP requise %s a été allouée à une autre instance", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10022": "L'adresse IP requise %s est hors de la plage DHCP %s ~ %s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10020": "Échec de l'allocation d'adresse IP depuis le réseau de provisionnement Baremetal2[uuid:%s]", + "ORG_ZSTACK_XINFINI_10009": "Échec de la suppression du client iscsi %s", + "ORG_ZSTACK_XINFINI_10008": "Échec de la suppression du mapping du groupe de clients de volume %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10002": "Il y a des instances BM utilisant des adresses IP allouées depuis L2[uuid:%s].", + "ORG_ZSTACK_XINFINI_10007": "Échec de la suppression du snapshot de volume %s", + "ORG_ZSTACK_XINFINI_10006": "Le snapshot [id:%s, name:%s] a %d volumes clonés, noms des volumes: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10004": "Il y a des instances BM utilisant des adresses IP allouées depuis la plage IP [uuid:%s].", + "ORG_ZSTACK_XINFINI_10005": "Échec de la suppression du volume en raison de %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10003": "Il y a des instances BM utilisant des adresses IP allouées depuis le réseau L3 [UUID:%s].", + "ORG_ZSTACK_XINFINI_10004": "Échec de la suppression du bdev %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10006": "Échec de la mise sous tension à distance du serveur baremetal[uuid:%s]", + "ORG_ZSTACK_XINFINI_10003": "bdc avec l'ip %s introuvable dans l'environnement cloud.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10005": "Échec de l'allocation du serveur PXE baremetal, assurez-vous qu'il y a un serveur PXE avec une capacité suffisante attachée au cluster[uuid:%s]", + "ORG_ZSTACK_XINFINI_10002": "La demande xinfini a échoué, message: %s.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10008": "Le châssis baremetal [uuid:%s] n'existe pas", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10009": "Le réseau de provisionnement baremetal2 avec l'UUID: %s est déjà attaché au cluster avec l'UUID: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10007": "Échec de la mise hors tension à distance du châssis baremetal[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10008": "Échec du déconnexion à chaud du périphérique géré de la machine virtuelle en cours d'exécution, cause:%s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10010": "Impossible d'attacher le réseau d'approvisionnement Baremetal2 [uuid:%s] au cluster [uuid:%s] car il a déjà un réseau configuré", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10011": "Impossible d'attacher le réseau d'approvisionnement BareMetal2 au cluster car ils ne sont pas dans la même zone de disponibilité", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10007": "vm[uuid:%s] ne peut pas démarrer sur un hôte qui contient le périphérique mdev[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10004": "Échec de l'attachement dynamique du périphérique mdev à la vm en cours d'exécution, car :%s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10002": "Le périphérique mdev avec UUID:%s ne peut pas s'attacher à la VM avec UUID:%s en raison d'un état incorrect", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10003": "Le périphérique mdev [%s] n'est pas disponible dans l'environnement virtualisé", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10000": "L'hôte [%s] n'a pas pu passer en mode maintenance car la VM [%s] a des périphériques MDEV attachés et ne peut pas être migrée automatiquement.", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10018": "Échec de la mise à jour du réseau approvisionné[uuid:%s] dans la passerelle[uuid:%s]: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10009": "Le châssis Baremetal [UUID:%s] n'est pas activé ou disponible. Veuillez en sélectionner un autre.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10001": "Le périphérique pci [uuid:%s] est connu pour être un mdev mais sa spécification ne peut pas être trouvée, donc le processus s'arrête.", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10016": "tous les réseaux d'approvisionnement baremetal2 n'existent pas dans %s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10014": "Impossible de détacher le réseau d'approvisionnement Baremetal2 [uuid:%s] car il existe des instances en cours d'exécution qui en dépendent", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10015": "networkUuids est une liste vide", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10012": "Impossible d'attacher le réseau d'approvisionnement BareMetal2 au cluster car chaque passerelle attachée aux clusters avec le même réseau d'approvisionnement doit être vérifiée. Veuillez vous assurer que toutes les passerelles pertinentes sont cohérentes avant de procéder.", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10013": "Le réseau approvisionné ne doit pas avoir le même nom d'interface que les réseaux l2 déjà attachés au cluster", + "ORG_ZSTACK_NETWORK_L3_10006": "Impossible de réserver la plage IP car il n'y a pas de sous-réseau IPv4 disponible.", + "ORG_ZSTACK_NETWORK_L3_10005": "Impossible de réserver la plage IP car l'adresse IP de fin [%s] est inférieure à l'adresse IP de début [%s]", + "ORG_ZSTACK_NETWORK_L3_10004": "Impossible de réserver la plage IP car l'adresse IP de fin[%s] n'est pas une adresse IPv6 valide", + "ORG_ZSTACK_NETWORK_L3_10003": "Impossible de réservez la plage IP car l'adresse IP de fin[%s] n'est pas une adresse IPv4 valide", + "ORG_ZSTACK_NETWORK_L3_10002": "Impossible de réserver la plage IP car l'adresse IP de début [%s] est invalide", + "ORG_ZSTACK_NETWORK_L3_10000": "Impossible de supprimer l'adresse IP car elle est utilisée par le contrôleur d'interface réseau de VM [UUID:%s]", + "ORG_ZSTACK_NETWORK_L3_10009": "Impossible de réserver la plage IP car il n'y a pas de sous-réseau IPv6 disponible. Veuillez vérifier votre configuration réseau ou essayer de réserver un sous-réseau IPv4 à la place.", + "ORG_ZSTACK_KVM_10001": "Échec du chargement des informations de l'hôte à partir du fichier car\\n%s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10019": "Le périphérique mdev avec UUID: %s n'est pas attaché à la VM avec UUID: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10017": "La VM[UUID:%s] qui contient le périphérique SE-MDEV ne peut pas attacher plus de SE-MDEV[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10018": "L'IOMMU de l'hôte [uuid:%s] qui gère le périphérique PCI [uuid:%s] n'est pas configuré comme [%s] ou [%s].", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10015": "vm[uuid:%s] a des périphériques mdev attachés qui sont sur un hôte différent du périphérique mdev[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10014": "vm[uuid:%s] a des périphériques PCI attachés qui sont sur un hôte différent du périphérique mdev[uuid:%s].", + "ORG_ZSTACK_NETWORK_L3_10010": "Impossible de réserver la plage IP car l'IP réservée n'est pas dans la plage IP spécifiée[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10011": "Impossible de modifier l'état d'un périphérique mdev qui est actuellement attaché à une machine virtuelle. Veuillez détacher le périphérique avant d'effectuer des modifications.", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10007": "Impossible de supprimer le réseau de provisionnement BareMetal2 [uuid:%s] lorsque des instances en dépendent", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10012": "Impossible de connecter le périphérique mdev [uuid:%s] à la VM, vérifiez qu'il est activé et non connecté", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10008": "Impossible de connecter un réseau de provisionnement BareMetal2 à un cluster non-BareMetal2", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10005": "Le masque de réseau %s de la plage DHCP du réseau de provisionnement baremetal2 est invalide", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10006": "L'IP de début %s et l'IP de fin %s du réseau de provisionnement baremetal2 n'appartiennent pas au même masque de sous-réseau", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10003": "Impossible de mettre à jour la configuration DHCP du réseau provisionné BareMetal2 [uuid:%s] lorsque des instances en dépendent", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10002": "Un réseau de provisionnement baremetal2 avec l'interface DHCP %s existe déjà avec la configuration suivante: IP de début %s, IP de fin %s, masque de réseau %s et passerelle %s.", + "ORG_ZSTACK_NETWORK_L3_10018": "Aucune plage IP spécifiée pour la couche 3[%s]", + "ORG_ZSTACK_NETWORK_L3_10015": "Vous devez mettre à jour à la fois le système et la catégorie dans votre configuration cloud.", + "ORG_ZSTACK_XINFINI_10027": "La fonctionnalité d'nexport NVMeOF n'est pas actuellement prise en charge.", + "ORG_ZSTACK_NETWORK_L3_10014": "Impossible de supprimer la dernière plage IP standard car il y a toujours un pool d'adresses présent.", + "ORG_ZSTACK_XINFINI_10026": "Aucune passerelle active découverte pour le client[%s]", + "ORG_ZSTACK_NETWORK_L3_10013": "impossible de définir le mtu car le réseau l2[uuid:%s] du réseau l3 [uuid:%s] a une valeur mtu qui dépasse la limite du réseau novlan", + "ORG_ZSTACK_XINFINI_10025": "L'export NVMe over Fabrics (OF) n'est pas actuellement pris en charge.", + "ORG_ZSTACK_XINFINI_10024": "xinfini ne prend en charge que le paramétrage des niveaux QoS totaux", + "ORG_ZSTACK_NETWORK_L3_10011": "impossible de réserver la plage IP car la nouvelle plage chevauche une plage existante [%s:%s]", + "ORG_ZSTACK_XINFINI_10023": "Aucun pool disponible avec suffisamment d'espace[%d] et un statut sain", + "ORG_ZSTACK_XINFINI_10021": "échec de l'obtention des détails de la machine virtuelle du pool[id:%d, name:%s]", + "ORG_ZSTACK_XINFINI_10020": "Aucun pool de ressources de calcul trouvé. Veuillez vous assurer qu'un pool a été créé et est disponible à l'utilisation.", + "ORG_ZSTACK_KVM_10010": "L'hôte [UUID: %s] manque de détails sur le modèle de CPU. Veuillez reconnecter l'hôte pour résoudre ce problème.", + "ORG_ZSTACK_KVM_10011": "La raison de forcer l'exécution doit être spécifiée.", + "ORG_ZSTACK_NETWORK_L3_10019": "ip[%s] n'est pas dans la plage cidr du pool IP[uuid:%s, cidr:%s] associé au réseau l3[%s]", + "ORG_ZSTACK_KVM_10012": "l'hôte[uuid:%s] a été terminé", + "ORG_ZSTACK_KVM_10002": "Le système d'exploitation [OS] de l'hôte [hostname:%s, IP:%s] est invalide", + "ORG_ZSTACK_KVM_10003": "le cluster[uuid:%s] a déjà un hôte avec la version du système d'exploitation [%s], mais le nouvel hôte ajouté [name:%s ip:%s] a une version différente du système d'exploitation [%s].", + "ORG_ZSTACK_KVM_10004": "la machine virtuelle[uuid:%s] plante suite à une défaillance du noyau", + "ORG_ZSTACK_KVM_10005": "l'hôte[uuid: %s] a déclenché une erreur ECC mémoire, détails: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10029": "les périphériques gérés spécifiés ne sont pas sur le même hôte: périphérique géré[uuid: %s] sur l'hôte[uuid: %s] tandis que le périphérique géré[uuid: %s] sur l'hôte[uuid: %s]", + "ORG_ZSTACK_KVM_10006": "Il y a encore des hôtes qui n'ont pas la même architecture CPU, détails: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10026": "Impossible de supprimer le périphérique mdev lorsqu'il est connecté à une instance de machine virtuelle. Veuillez déconnecter le périphérique avant la suppression.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10027": "impossible de démarrer la VM[UUID:%s] car toutes les spécifications MDEV[UUIDs:%s] n'existent pas", + "ORG_ZSTACK_KVM_10008": "L'ID du pont PCI doit être une valeur supérieure à 0 et inférieure à 32", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10024": "impossible de connecter un périphérique géré à une instance de machine virtuelle qui n'est pas à l'état arrêté", + "ORG_ZSTACK_KVM_10009": "état actuel de la VM[%s], la modification de virtioSCSI nécessite que la VM soit à l'état[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10025": "type de périphérique mdev [%s] illégal, seuls les périphériques virtuels sont autorisés", + "ORG_ZSTACK_NETWORK_L3_10021": "ID d'instance cloud invalide[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10022": "Les UUID de cluster, l'UUID d'hôte ou l'UUID de VM ne peuvent pas être définis simultanément.%s", + "ORG_ZSTACK_NETWORK_L3_10020": "l'IP[%s] dans la plage IP[uuid:%s, startIp:%s, endIp:%s] associée au réseau L3[%s], ceci n'est pas autorisé", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10023": "Les clusters n'existent pas ou sont désactivés. Veuillez vous assurer que les clusters ont été correctement créés et activés.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10020": "l'hôte avec UUID [%s] qui contient le périphérique mdev avec UUID [%s] ne correspond ni à [%s] ni à [%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10021": "Impossible de détacher le périphérique mdev de l'instance VM lorsqu'elle n'est pas à l'état arrêté. Veuillez vous assurer que l'instance VM est arrêtée avant de détacher le périphérique mdev.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10053": "Il n'y a pas de réseau privé virtuel (VPC) configuré sur le contrôleur SDN [IP:%s].", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10054": "Le tag système pour l'ID VPC est obligatoire. Veuillez fournir une valeur valide.", + "ORG_ZSTACK_MACVLAN_10002": "échec de la vérification de l'interface VLAN[%s] pour le réseau L2VLAN[uuid:%s, name:%s] sur l'hôte KVM[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10051": "il n'y a pas de commutateur configuré sur le contrôleur sdn [ip:%s]", + "ORG_ZSTACK_MACVLAN_10005": "impossible de connecter le service réseau au réseau L3 [uuid:%s], car le réseau L2 [uuid:%s, vSwitchType:%s] ne prend en charge aucun service réseau L3 pour le réseau L3 privé de base", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10052": "Il n'y a pas de commutateur SDN attaché au contrôleur.%s", + "ORG_ZSTACK_MACVLAN_10004": "seul %s prend en charge le mode de réseau MACVLAN", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10057": "échec de la récupération du commutateur logique pour le réseau de couche 2 %s", + "ORG_ZSTACK_MACVLAN_10007": "impossible de connecter le service réseau au réseau L3 avec UUID: %s, car le réseau L2 avec UUID: %s ne prend en charge que vRouter comme fournisseur de réseau pour les réseaux L3 privés de base.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10058": "échec de l'obtention du commutateur logique pour le réseau de couche 2 avec le résultat: %s", + "ORG_ZSTACK_MACVLAN_10006": "impossible de connecter le service réseau au réseau L3 avec UUID: %s, car le réseau L2 avec UUID: %s ne prend en charge que vRouter comme fournisseur de réseau pour le réseau L3 VPC et ne prend pas en charge vSwitchType: %s.", + "ORG_ZSTACK_MACVLAN_10009": "Les hôtes KVM ne prennent en charge que la mise en réseau L2 avec vSwitchType défini sur OVS. Veuillez vous assurer que votre hôte est de type KVM et que vSwitchType est configuré comme OVS.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10056": "impossible de récupérer les informations du port du commutateur physique car: %s", + "ORG_ZSTACK_MACVLAN_10008": "impossible de connecter le service réseau au réseau L3 [uuid:%s], car le réseau L2 [uuid:%s, vSwitch Type:%s] ne prend en charge que l'équilibrage de charge pour les réseaux L3 privés de base", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10075": "Le volume racine a été supprimé et ne peut pas être réimagé pour le moment. Veuillez contacter le support pour obtenir de l'aide.", + "ORG_ZSTACK_STORAGE_CEPH_10023": "Le problème peut être dû à un ID de clé d'accès ou une clé d'accès secrète ou un numéro de port SSH incorrect ou une connexion réseau instable dans votre environnement cloud. Veuillez vérifier ces paramètres.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10050": "Il n'y a pas de tenant sur le contrôleur SDN [IP:%s]", + "ORG_ZSTACK_STORAGE_CEPH_10020": "poolName peut être null mais ne doit pas être une chaîne vide", + "ORG_ZSTACK_KVM_10022": "connexion SSH à l'hôte[%s] nom d'utilisateur[%s] sur le port[%s] échouée, en raison de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10073": "impossible de créer un volume vide[uuid:%s, name:%s] sur l'hôte KVM[uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_10021": "poolName doit être spécifié lorsque importImages est activé", + "ORG_ZSTACK_KVM_10023": "L'hôte[%s] n'a pas été mis sous tension dans les %d secondes pour une raison inconnue. Veuillez vérifier l'état de l'hôte via le BMC[%s].", + "ORG_ZSTACK_STORAGE_BACKUP_10092": "échec de la vérification de sécurité de restauration:\\n%s", + "ORG_ZSTACK_KVM_10014": "l'hôte %s n'est pas géré par le nœud de gestion actuel", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10000": "executeSlbGroupConfigTask nom de tâche inconnu: %s", + "ORG_ZSTACK_MEVOCO_10049": "Impossible de trouver les informations de configuration pour le nœud A", + "ORG_ZSTACK_STORAGE_BACKUP_10091": "le stockage de sauvegarde [UUID:%s] n'est pas activé ou configuré", + "ORG_ZSTACK_KVM_10015": "l'hôte %s n'est pas connecté, ignorez le redémarrage de l'agent KVM", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10039": "impossible de migrer le volume root [uuid:%s] car des dispositifs gérés sont attachés", + "ORG_ZSTACK_MEVOCO_10048": "Impossible de définir simultanément la configuration locale et la configuration cloud. Veuillez spécifier un environnement de déploiement unique.", + "ORG_ZSTACK_STORAGE_BACKUP_10090": "la sauvegarde de base de données [uuid:%s] n'existe pas encore", + "ORG_ZSTACK_KVM_10016": "une tâche en cours d'exécution existe sur l'hôte %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10081": "impossible de trouver le fichier de marqueur [%s] sur le nœud de calcul [%s], car: %s", + "ORG_ZSTACK_MEVOCO_10047": "adresses IP de gestion d'hôte inattendues: [%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10037": "impossible de migrer la VM[UUID:%s] car un dispositif mdev est attaché", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10035": "impossible de trouver le dispositif mdev[uuid:%s], il a peut-être été supprimé ou libéré", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10036": "le dispositif mdev avec UUID: %s n'existe pas ou est désactivé pour la VM avec UUID: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10034": "échec de la recherche d'un dispositif mdev suffisant de spécification [uuid:%s] dans l'hôte de destination [uuid:%s] pour la machine virtuelle [uuid:%s]", + "ORG_ZSTACK_MEVOCO_10041": "valeur[%s] invalide, ZStack ne prend pas en charge ce type d'allocation d'hôte", + "ORG_ZSTACK_STORAGE_BACKUP_10099": "sauvegarde de base de données[uuid:%s] n'est pas activée et prête", + "ORG_ZSTACK_STORAGE_CDP_10120": "Impossible de trouver le stockage de sauvegarde connecté[uuid: %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10098": "volume[uuid:%s] a été supprimé et les modifications d'état ne sont pas autorisées", + "ORG_ZSTACK_MEVOCO_10040": "valeur[%s] invalide, ce n'est pas un nombre à virgule flottante valide", + "ORG_ZSTACK_STORAGE_CDP_10121": "L'opération implique le volume [UUID: %s] qui créera un instantané de type chaîne. Par conséquent, vous ne pouvez pas effectuer cette opération lorsqu'une tâche de protection continue des données (CDP) est en cours d'exécution sur l'instance de machine virtuelle.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10032": "échec de la détermination des hôtes candidats pour démarrer la vm[uuid:%s], %s", + "ORG_ZSTACK_STORAGE_BACKUP_10097": "Aucun bucket de stockage d'objets disponible trouvé pour la sauvegarde, ignorez cette tâche.%s", + "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10001": "La suppression d'un topic système d'une alarme système est interdite. Veuillez fournir des UUID de topic et d'alarme valides.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10005": "Impossible de trouver l'interface réseau publique de l'instance SLB", + "ORG_ZSTACK_MEVOCO_10046": "obj n'est pas une instance de NicQos! Veuillez vous assurer que le type d'objet correspond au type attendu.", + "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10000": "alarme[uuid:%s] est une alerte générée par le système qui ne peut pas être supprimée", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10004": "instance slb[uuid:%s] la tâche de configuration version:%d a échoué %d fois", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10003": "impossible de trouver une instance SLB disponible dans le groupe[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10094": "la version de sauvegarde de la base de données[%s] ne correspond pas à la version actuelle[%s]", + "ORG_ZSTACK_MACVLAN_10000": "échec de la réalisation du pont pour l2VlanNetwork[uuid:%s, name:%s] sur l'hôte KVM[uuid:%s], %s", + "ORG_ZSTACK_MEVOCO_10043": "la valeur de %s est[%s], ce qui entre en conflit avec la valeur de %s [%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10093": "Échec de l'allocation d'un port libre pour l'écoute. Veuillez vous assurer que les ports requis ne sont pas utilisés par d'autres applications. Si le problème persiste, pensez à vérifier votre configuration réseau ou contactez le support pour obtenir de l'aide supplémentaire.", + "ORG_ZSTACK_MEVOCO_10060": "Échec de la définition de l'adresse pour le nœud A", + "ORG_ZSTACK_KVM_10030": "échec de la vérification de la capacité de l'hôte, car :%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10082": "impossible de créer le fichier indicateur [%s] sur l'instance [%s], car : %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10060": "échec de l'obtention du commutateur logique : uuid : %s", + "ORG_ZSTACK_KVM_10032": "La capacité de mémoire disponible de l'hôte [UUID: %s] [%s MB] est inférieure à la capacité réservée [%s MB]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10083": "Il n'y a pas de stockage principal LocalStorage (state=%s, status=%s) sur le cluster (%s). Lorsque le cluster monte plusieurs stockages principaux, le système utilise par défaut le stockage principal local. Veuillez vérifier l'état et le statut du stockage principal et vous assurer qu'il a été attaché au cluster.", + "ORG_ZSTACK_KVM_10033": "impossible d'enregistrer le battement de cœur colo pour la vm[uuid:%s] sur l'hôte kvm [uuid:%s, ip:%s], en raison de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10084": "Le type de stockage principal [uuid:%s] choisi n'est pas un stockage local. Veuillez vérifier si la ressource peut être créée sur un autre stockage disponible lorsque le cluster a un stockage principal local attaché.", + "ORG_ZSTACK_KVM_10034": "impossible de démarrer la machine virtuelle de synchronisation colo [uuid:%s] sur l'hôte kvm [uuid:%s, ip:%s], en raison de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10085": "Le cluster monte plusieurs stockages principaux [Stockage Local (%s), autres stockages principaux non-LocalStorage], par conséquent, la spécification de primaryStorageUuidForDataVolume n'est pas autorisée %s.", + "ORG_ZSTACK_KVM_10024": "L'hôte[%s] ne s'est pas arrêté dans les %d secondes pour une raison inconnue. Veuillez vérifier l'état de l'hôte via le BMC[%s].", + "ORG_ZSTACK_MEVOCO_10059": "Cette instance n'est pas associée au nœud A", + "ORG_ZSTACK_MEVOCO_10058": "un certain nœud en mode usine existe ; détails de l'ARPing : %s", + "ORG_ZSTACK_MEVOCO_10053": "l'agent bootstrap curl a terminé, code de retour : %s, stdout: %s, stderr: %s", + "ORG_ZSTACK_MEVOCO_10052": "impossible de récupérer le résultat du travail bootstrap %s après 900 secondes", + "ORG_ZSTACK_MEVOCO_10050": "impossible de trouver les informations d'adresse du nœud A à partir de l'agent bootstrap", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10040": "impossible de migrer la VM[UUID:%s] car elle a des périphériques MDEV attachés", + "ORG_ZSTACK_MEVOCO_10057": "la mise à jour du mode usine du nœud A a échoué, détails : %s", + "ORG_ZSTACK_MEVOCO_10056": "La mise à jour de tous les nœuds de gestion en mode usine a échoué, détails : %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10013": "L'adresse MAC %s est invalide. Elle doit être formatée comme 6c:b3:11:1b:0b:1e", + "ORG_ZSTACK_HA_10014": "impossible de définir FT sur la VM [uuid:%s] car des périphériques USB sont attachés via le passthrough", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10012": "le serveur PXE baremetal [UUID:%s] n'est ni activé ni connecté, veuillez vérifier son état.", + "ORG_ZSTACK_HA_10015": "impossible de définir FT sur la machine virtuelle [uuid:%s] car un périphérique mdev est attaché", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10015": "UUID de lien dupliqué détecté pour la machine virtuelle %s. Veuillez vous assurer que les UUID sont uniques pour les configurations de liaison.", + "ORG_ZSTACK_HA_10016": "Le nœud de gestion ne parvient pas à découvrir l'hôte. Veuillez vous assurer que l'hôte est correctement enregistré et accessible dans l'environnement cloud.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10014": "Le châssis baremetal [UUID: %s] n'a pas d'interface réseau avec l'adresse MAC %s", + "ORG_ZSTACK_HA_10017": "La valeur [%s] est hors de la plage valide [0, 1].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10057": "l'hôte[uuid: %s] du stockage primaire local[uuid: %s] n'a pas une capacité suffisante[actuel : %s octets, nécessaire : %s]", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10017": "UUID du réseau L3 dupliqué détecté", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10058": "impossible de trouver un hôte qui possède la ressource[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10016": "La liaison réseau baremetal n'est pas prise en charge", + "ORG_ZSTACK_HA_10011": "impossible de définir FT sur VM[uuid:%s] car elle n'est pas dans un état arrêté", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10059": "La ressource[uuid:%s] peut uniquement être opérée sur l'hôte[uuid:%s], mais l'hôte a été terminé", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10019": "Le réseau de couche 3 sélectionné ne peut pas être attribué au châssis [UUID:%s].", + "ORG_ZSTACK_HA_10012": "impossible de définir FT sur VM[uuid:%s] car un ou plusieurs volumes de données sont encore attachés", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10018": "Le réseau de couche 3 spécifié n'existe pas. Veuillez vérifier le nom du réseau et réessayer.", + "ORG_ZSTACK_HA_10013": "impossible de définir FT sur VM[uuid:%s] car un périphérique PCI est attaché", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10053": "Pour provisionner un volume de données sur le stockage primaire local, vous devez spécifier l'hôte où le volume de données sera créé en utilisant la balise système [%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10054": "L'hôte [UUID:%s] n'est pas associé au stockage primaire local [UUID:%s].", + "ORG_ZSTACK_KVM_10040": "échec de l'augmentation du nombre de CPU de la VM, détails de l'erreur : %s", + "ORG_ZSTACK_HA_10018": "le VM[uuid:%s] dont l'emplacement de stockage du volume est le stockage primaire est en maintenance", + "ORG_ZSTACK_KVM_10043": "impossible de se connecter à KVM[ip:%s, nom d'utilisateur:%s, port SSH:%d] pour effectuer la validation DNS ; Veuillez vérifier les identifiants.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10050": "Impossible de migrer à chaud la VM [uuid:%s] avec des volumes de données sur le stockage local. Les volumes de données doivent être détachés au préalable.", + "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10001": "L'objet de requête est null. Veuillez vous assurer que vos paramètres de requête sont correctement initialisés avant d'exécuter la tâche d'informatique en nuage.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10051": "impossible de migrer à chaud VM[UUID:%s] avec le stockage local. Seuls les invités Linux sont pris en charge. La plateforme actuelle est [%s].", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10011": "Aucune information matérielle trouvée pour le châssis baremetal[uuid:%s], veuillez en sélectionner un autre.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10052": "impossible de migrer à chaud VM[UUID:%s] avec ISO attaché sur le stockage local. Veuillez détacher tous les ISO au préalable.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10010": "aucun serveur PXE correspondant détecté, veuillez vérifier à nouveau la configuration du châssis baremetal[uuid:%s]", + "ORG_ZSTACK_KVM_10035": "impossible de configurer la VM secondaire[UUID:%s] sur l'hôte KVM [UUID:%s, IP:%s], car %s", + "ORG_ZSTACK_MEVOCO_10028": "Réseau L3 avec UUID [%s] non trouvé. Veuillez vérifier et corriger votre balise système [%s] associée à l'IP statique.", + "ORG_ZSTACK_STORAGE_BACKUP_10070": "impossible de trouver la sauvegarde du volume avec UUID : %s", + "ORG_ZSTACK_KVM_10036": "impossible de configurer la VM primaire[UUID:%s] sur l'hôte KVM[UUID:%s, IP:%s], car %s", + "ORG_ZSTACK_MEVOCO_10027": "valeur IOPS invalide pour le volume [%s] dépasse la limite maximale de %d", + "ORG_ZSTACK_KVM_10037": "impossible de récupérer le périphérique de démarrage initial de la VM [UUID:%s] sur l'hôte KVM [UUID:%s, IP:%s], en raison de %s", + "ORG_ZSTACK_MEVOCO_10026": "IOPS de volume [%s] invalide n'est pas un nombre valide", + "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10000": "Au moins un UUID d'hôte est requis lors de l'interrogation d'un espace de noms Prometheus tiers. Veuillez vous assurer que l'UUID de l'hôte est inclus dans les labels des paramètres d'appel de la requête.", + "ORG_ZSTACK_KVM_10038": "impossible de récupérer l'adresse du périphérique de la vm[uuid:%s], en raison de :%s", + "ORG_ZSTACK_MEVOCO_10025": "valeur IOPS [%s] invalide, elle doit être supérieure à 1 (1 inclus)", + "ORG_ZSTACK_KVM_10039": "impossible de récupérer les informations du virtualiseur de l'hôte[uuid:%s], car :%s", + "ORG_ZSTACK_MEVOCO_10029": "L'accès aux périphériques USB est réservé aux comptes administratifs. Veuillez vous assurer que vous êtes connecté avec un compte disposant de privilèges administratifs.", + "ORG_ZSTACK_STORAGE_BACKUP_10078": "le stockage de sauvegarde ne peut pas procéder car son état est %s", + "ORG_ZSTACK_MEVOCO_10020": "bande passante du volume [%s] invalide doit être une valeur numérique", + "ORG_ZSTACK_STORAGE_BACKUP_10077": "le stockage de sauvegarde ne peut pas procéder car son statut est %s", + "ORG_ZSTACK_STORAGE_BACKUP_10076": "Le stockage de sauvegarde [UUID: %s, Nom: %s] n'a pas une capacité suffisante pour télécharger l'image [%s]. Taille requise : %s, taille disponible : %s.", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10001": "Tous les nœuds Ceph MON sont déconnectés dans le stockage de sauvegarde Ceph [uuid:%s].", + "ORG_ZSTACK_STORAGE_BACKUP_10075": "La taille de l'image récupérée depuis l'URL %s est de %d octets, ce qui est trop petit pour une image. Veuillez vérifier à nouveau l'URL.", + "ORG_ZSTACK_STORAGE_BACKUP_10074": "échec de la récupération de l'en-tête depuis l'URL de l'image %s", + "ORG_ZSTACK_STORAGE_BACKUP_10073": "échec de la récupération de l'en-tête depuis l'URL de l'image %s: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10072": "Veuillez d'abord terminer les autres nœuds !", + "ORG_ZSTACK_MEVOCO_10021": "bande passante du volume [%s] invalide dépasse la valeur maximale autorisée de %d", + "ORG_ZSTACK_STORAGE_BACKUP_10071": "Le cluster de VM [%%s] n'est pas colocalisé avec le cluster de stockage principal [%%s].", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10023": "impossible d'expurger une instance baremetal qui n'est pas dans l'état Destroyed", + "ORG_ZSTACK_HA_10005": "les hôtes n'ont pas pu effectuer le balayage de ports sur l'hôte cible[uuid:%s, ip:%s]", + "ORG_ZSTACK_IDENTITY_LOGIN_10000": "méthode d'authentification %s non prise en charge", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10068": "Le cluster [UUID=%s] est montée avec plusieurs stockages principaux, incluant LocalStorage et d'autres stockages principaux non-LocalStorage. Vous devez spécifier le stockage principal où se trouve le disque de données.", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10003": "Échec de la migration de l'image %s du stockage backend %s vers le stockage backend %s. cause : %s", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10002": "ID de corbeille (%s) trouvé sur le stockage de sauvegarde [%s] pour le chemin d'installation de migration [%s]. Veuillez d'abord le nettoyer en utilisant 'APICleanUpTrashOnBackupStorageMsg' si vous insistez pour migrer l'image [%s].", + "ORG_ZSTACK_HA_10000": "L'instance de machine virtuelle a probablement été terminée. Ignorer les vérificateurs de santé.", + "ORG_ZSTACK_HA_10001": "impossible de trouver la machine virtuelle avec le nom:[%s] et l'uuid:[%s], l'uuid de l'hôte est null", + "ORG_ZSTACK_HA_10002": "Aucune instance HAHostChecker trouvée, impossible d'effectuer les vérifications de haute disponibilité. Veuillez vous assurer que tous les composants requis sont correctement configurés.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10064": "L'utilisation de la capacité physique de l'hôte [uuid:%s] a dépassé le seuil [%s]. Veuillez considérer la mise à l'échelle ou l'optimisation de vos ressources.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10067": "Le cluster[uuid=%s] est configuré pour monter plusieurs solutions de stockage principal, incluant LocalStorage et d'autres stockages principaux non-LocalStorage. Vous devez spécifier quel stockage principal contient le disque racine.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10060": "L'hôte KVM [UUID: %s] ne peut pas être ajouté au stockage principal local [UUID: %s], %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10020": "Seules les images ISO sont prises en charge pour les déploiements de service bare metal dans ZStack.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10061": "impossible de créer un volume snapshot vide [name:%s, install path: %s] sur l'hôte KVM [uuid:%s, ip:%s], car %s", + "ORG_ZSTACK_KVM_10054": "impossible de fusionner le snapshot de volume lorsque la machine virtuelle [uuid:%s] est dans l'état %s. L'opération est uniquement autorisée lorsque la machine virtuelle est dans l'état Running ou Stopped.", + "ORG_ZSTACK_HA_10008": "exception lors de la synchronisation de l'état self-fencer depuis l'hôte [UUID: %s], %s", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10000": "dossier[%s] non trouvé sur le serveur de gestion cloud[%s]", + "ORG_ZSTACK_KVM_10055": "la fusion de snapshots de volume à chaud nécessite une version de libvirt supérieure à %s, la version actuelle est %s. Veuillez arrêter la VM et réessayer l'opération ou détacher le volume de données si nécessaire.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10062": "échec du transfert des bits depuis le stockage de sauvegarde SFTP [hostname:%s, path: %s] vers le stockage principal local [uuid:%s, path: %s], %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10022": "Impossible de récupérer une instance baremetal qui n'est pas dans l'état Destroyed. Veuillez vous assurer que l'instance est dans l'état Destroyed avant de tenter la récupération.", + "ORG_ZSTACK_HA_10009": "Le paramètre %s ne peut pas être défini sur '%s' car le réseau de stockage est indisponible et la haute disponibilité doit rester activée.", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10001": "namespace[%s] ne contient pas la métrique[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10063": "échec du téléchargement des bits depuis le stockage local [uuid:%s, path:%s] vers le stockage de sauvegarde SFTP [hostname:%s, remotePath:%s], %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10021": "Seul le stockage de sauvegarde Image Store est pris en charge dans le service ZStack Bare Metal.", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10002": "la métrique[%s] du namespace[%s] ne possède pas de label nommé %s", + "ORG_ZSTACK_MEVOCO_10039": "valeur[%s] invalide, elle doit être un double compris dans l'intervalle (0, 1] incluant 1", + "ORG_ZSTACK_KVM_10047": "L'hôte [UUID: %s, status: %s] n'est pas connecté.", + "ORG_ZSTACK_COMPUTE_OVS_10000": "erreur de format de configuration de ressource CPU pinning ovs:[%s]", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10001": "Le fichier source n'a pas été trouvé. Veuillez vous assurer que tous les fichiers requis sont correctement uploadés et inclus dans votre configuration de projet.", + "ORG_ZSTACK_MEVOCO_10037": "valeur[%s] invalide, elle doit être un nombre à virgule flottante positif supérieur à 0", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10002": "Cette erreur indique que l'opération a été intentionnellement terminée ou modifiée pendant l'exécution. Veuillez vérifier vos paramètres d'entrée et vous assurer qu'ils répondent aux exigences de l'environnement de cloud computing.", + "ORG_ZSTACK_MEVOCO_10031": "Code de sécurité[%s] inconnu pour l'authentification", + "ORG_ZSTACK_STORAGE_BACKUP_10089": "échec de l'opération de métadonnées de sauvegarde de volume car %s", + "ORG_ZSTACK_STORAGE_BACKUP_10087": "échec de génération du fichier de métadonnées de sauvegarde de volume sur le image store [uuid:%s] dû à une erreur d'E/S: %s", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10000": "Instances cloud en cours de terminaison. Veuillez confirmer l'action.", + "ORG_ZSTACK_MEVOCO_10034": "Le système d'exploitation %s %s de l'hôte [UUID:%s] est trop ancien pour prendre en charge la QoS pour les E/S réseau ou disque. Veuillez sélectionner une autre instance sans configuration QoS.", + "ORG_ZSTACK_MEVOCO_10033": "%s n'est pas une notation CIDR valide", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10010": "impossible d'ajouter le contrôleur SDN Huawei iMaster avec la plage VLAN invalide [%s, %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10008": "iso[uuid: %s] est attaché à vm[uuid: ], mais le fichier ISO n'est situé sur aucun stockage en blocs. Vous devez le détacher avant de migrer la VM.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10009": "échec de recherche du LUN SCSI de blocs pour le volume: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10035": "l'hôte[uuid:%s] ne peut pas accéder au stockage local[uuid:%s], probablement dû à un détachement", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10013": "impossible de créer le réseau L3 Huawei iMaster NSE sans UUID de routeur logique", + "ORG_ZSTACK_MEVOCO_10093": "DeleteVolumeQos [%s] ignoré en raison des privilèges du compte.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10036": "resource[uuid:%s, type: %s] n'est pas disponible sur le stockage principal local[uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10014": "impossible de créer le réseau L3 Huawei iMaster avec le réseau L2 [uuid:%s] car il existe déjà", + "ORG_ZSTACK_MEVOCO_10092": "mode de qualité de service du volume invalide : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10037": "resource[uuid:%s, type: %s] sur le stockage principal local[uuid:%s] correspond à plusieurs hyperviseurs%sWithMultipleHypervisors", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10011": "impossible d'ajouter le contrôleur SDN Huawei iMaster sans plage VLAN ou ID VLAN spécifié", + "ORG_ZSTACK_MEVOCO_10091": "Aucun volume attaché à cette instance. Veuillez attacher un volume pour continuer.", + "ORG_ZSTACK_STORAGE_BACKUP_10058": "Impossible de spécifier un stockage principal attaché à un cluster différent.", + "ORG_ZSTACK_STORAGE_BACKUP_10057": "Au moins l'un des paramètres suivants doit être spécifié : UUID de réseau L3, UUID de zone, UUID de cluster, UUID d'hôte.", + "ORG_ZSTACK_MEVOCO_10090": "impossible de prendre un instantané pour les volumes attachés à plusieurs VM", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10033": "Impossible de créer le volume de données[uuid: %s] sur un stockage principal local[uuid:%s], car l'UUID de l'hôte n'est pas spécifié.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10034": "Aucun état d'hôte n'est activé. Veuillez vérifier la disponibilité des ressources de l'hôte.", + "ORG_ZSTACK_KVM_10064": "échec de la mise à jour de l'interface réseau pour la machine virtuelle [vm:%s] sur l'hôte KVM [uuid:%s, ip:%s], car %s", + "ORG_ZSTACK_KVM_10065": "échec de l'attachement de l'interface réseau avec l'UUID: %s à la VM UUID: %s sur l'hôte KVM avec l'UUID: %s et l'IP: %s, car %s. Veuillez réessayer ou supprimer l'appareil avec l'UUID: %s manuellement.", + "ORG_ZSTACK_KVM_10066": "échec de l'attachement de l'interface réseau avec l'UUID: %s à la VM UUID: %s sur l'hôte KVM avec l'UUID: %s et l'IP: %s car %s", + "ORG_ZSTACK_KVM_10067": "échec du détachement du volume de données[uuid:%s, installPath:%s] de la vm[uuid:%s, name:%s] sur l'hôte KVM[uuid:%s, ip:%s], en raison de %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10005": "la règle de redirection de port [uuid:%s] a été supprimée", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10006": "La règle de redirection de port [uuid:%s] n'est pas activée, l'état actuel est %s", + "ORG_ZSTACK_KVM_10059": "vm[uuid:%s] n'est pas dans un état Exécution ou Arrêté, l'état actuel[%s]", + "ORG_ZSTACK_TICKET_10000": "ticket[uuid:%s, name:%s] ne peut être mis à jour qu'après avoir été annulé ; l'état actuel est %s", + "ORG_ZSTACK_TICKET_10001": "opération refusée. l'opération doit être effectuée par le compte/l'ID virtuel[uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10017": "échec de l'obtention du token depuis le contrôleur SDN [IP:%s] pour récupérer les données", + "ORG_ZSTACK_MEVOCO_10086": "VM[uuid:%s] a cessé de fonctionner. Veuillez réessayer plus tard.", + "ORG_ZSTACK_STORAGE_BACKUP_10056": "La VM actuelle[UUID: %s] du volume[UUID: %s] n'est plus la VM[UUID: %s] qui a été utilisée pour la sauvegarde", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10003": "Impossible d'exécuter le flux de mappage LUN vers l'hôte car les métadonnées de référence de l'hôte PS sont vides. Veuillez vérifier la configuration de l'hôte et vous assurer que les métadonnées nécessaires sont remplies.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10018": "échec de l'obtention du token depuis le contrôleur sdn [ip:%s] car %s", + "ORG_ZSTACK_MEVOCO_10085": "Impossible de trouver des instantanés à partir de l'UUID du volume [uuid: %s]. Peut-être qu'aucune chaîne d'instantanés ne nécessite de validation.", + "ORG_ZSTACK_STORAGE_BACKUP_10055": "instantané du volume racine du groupe[uuid:%s] non trouvé", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10000": "Impossible d'exécuter le mappage d'unité logique vers l'hôte en raison d'un appareil backend nul.%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10015": "impossible de supprimer le routeur logique Huawei [UUID:%s] car il est associé au réseau L3 [UUID:%s]", + "ORG_ZSTACK_MEVOCO_10084": "impossible de trouver le dernier snapshot du volume [uuid: %s]. Il n'existe peut-être aucune chaîne de snapshots pour la validation.", + "ORG_ZSTACK_STORAGE_BACKUP_10054": "Aucun volume de sauvegarde trouvé pour le groupe UUID: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10016": "échec de l'obtention du jeton du contrôleur SDN [IP:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10001": "Impossible d'exécuter le flux de mappage LUN vers l'hôte car la référence hôte PS est nulle. Veuillez vous assurer que la référence hôte est correctement définie.", + "ORG_ZSTACK_MEVOCO_10083": "impossible de trouver le snapshot spécifié dans l'arborescence des snapshots du volume [UUID: %s]. Il n'existe peut-être aucune chaîne de snapshots à valider.", + "ORG_ZSTACK_STORAGE_BACKUP_10053": "La ressource[uuid: %s] a déjà initié une tâche CDP; par conséquent, une tâche de sauvegarde ne peut pas être créée simultanément.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10006": "L'hôte KVM [UUID: %s] ne peut pas être ajouté au stockage primaire bloc [UUID: %s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10009": "la règle de redirection de port[uuid:%s] n'est pas activée, l'état actuel est %s. Une règle ne peut être attachée que lorsque son état est activé.", + "ORG_ZSTACK_STORAGE_BACKUP_10052": "Échec de la création des sauvegardes pour la VM[uuid:%s], car elle n'est pas dans un état[%s, %s]", + "ORG_ZSTACK_MEVOCO_10089": "Impossible de prendre un snapshot pour les volumes[%s] car le volume[UUID: %s] est défini plusieurs fois", + "ORG_ZSTACK_STORAGE_BACKUP_10051": "Le volume[uuid:%s] n'est pas un volume racine", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10019": "échec de la suppression du jeton du contrôleur SDN [IP:%s] à cause de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10004": "Impossible d'exécuter le mappage de volume vers l'hôte en raison d'un ID de volume invalide.%s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10007": "la règle de redirection de port [uuid:%s] n'a pas été attachée à une interface réseau de machine virtuelle, impossible de détacher", + "ORG_ZSTACK_MEVOCO_10088": "impossible de prendre un snapshot pour les volumes[%s] lorsque le volume[uuid: %s] n'est pas attaché", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10005": "Impossible d'exécuter le flux de mappage LUN vers l'hôte en raison d'un type de LUN invalide: %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10008": "la règle de redirection de port [uuid:%s] a été associée à l'interface réseau de VM [uuid:%s], ne peut pas être réassignée", + "ORG_ZSTACK_MEVOCO_10087": "Une VM en cours d'exécution[uuid:%s] n'a pas d'UUID d'hôte associé.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10020": "échec de l'obtention du tenant du contrôleur SDN [IP:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10021": "échec de l'obtention du tenant du contrôleur SDN [IP:%s] à cause de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10019": "le stockage primaire bloc [uuid:%s, name:%s] ne peut trouver aucun hôte disponible dans les clusters attachés pour l'instanciation du volume", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10024": "Échec de la récupération du port du commutateur logique auprès du contrôleur SDN [IP:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10047": "impossible d'attacher le volume de données [uuid:%s] à la VM [uuid:%s]. Le volume racine de la VM et le volume de données sont tous deux situés sur le stockage primaire local mais résident sur des hôtes différents. Le volume racine [uuid:%s] est hébergé sur l'hôte [uuid:%s], tandis que le volume de données [uuid:%s] est hébergé sur l'hôte [uuid:%s].", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10025": "échec de l'obtention des informations du port du commutateur auprès du contrôleur sdn [ip:%s] à cause de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10048": "Le volume de données [name: %s, UUID: %s] est situé sur le stockage local [UUID: %s]; cependant, l'hôte où réside le volume de données a été supprimé. La récupération de ce volume n'est pas possible.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10022": "échec de l'obtention du dispositif commutateur du contrôleur SDN [ip:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10069": "La VM crée actuellement une tâche de sauvegarde et ne peut pas avoir de tâche CDP activée simultanément. Veuillez vous assurer que toutes les tâches de sauvegarde sont terminées avant d'activer le CDP.", + "ORG_ZSTACK_KVM_10070": "échec de la termination de la machine virtuelle[uuid:%s name:%s] sur l'hôte KVM[uuid:%s, ip:%s], à cause de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10049": "unable to recover the vm[uuid:%s, name:%s]. The vm's root volume is located on local storage[uuid:%s]; however, the host where the root volume resides has been deleted.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10023": "échec de l'obtention du dispositif commutateur du contrôleur SDN [IP:%s] à cause de %s", + "ORG_ZSTACK_STORAGE_BACKUP_10068": "Le cluster hôte [uuid: %s] n'est pas colocalisé avec le cluster de volume [uuid: %s]. Veuillez vous assurer que le stockage principal se trouve dans le même cluster.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10020": "La VM [Nom: %s UUID: %s] dispose déjà de règles de redirection de port avec des VIP différents de celui-ci [UUID: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10044": "la création repose sur le cache d'image [uuid: %s, uuids hôte localisé: [%s]], impossible de créer ailleurs.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10045": "le stockage local ne prend pas en charge la migration à chaud pour l'hyperviseur[%s]", + "ORG_ZSTACK_KVM_10075": "échec de l'arrêt de la vm[uuid:%s nom:%s] sur l'hôte kvm[uuid:%s ip:%s], car %s", + "ORG_ZSTACK_KVM_10078": "l'hôte[uuid:%s] n'a pas une capacité suffisante pour allouer le processeur[%s] et la mémoire[%s octets].", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10017": "la plage de ports VIP [vipStartPort:%s, vipEndPort:%s] chevauche la règle réseau [uuid:%s, vipStartPort:%s, vipEndPort:%s]", + "ORG_ZSTACK_KVM_10069": "échec de l'attachement du volume de données[uuid:%s, installPath:%s] à la vm[uuid:%s, nom:%s] sur l'hôte KVM[uuid:%s, ip:%s], car %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10014": "CIDR invalide[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10015": "CIDR invalide[%s], seules les adresses IPv4 sont prises en charge", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10012": "impossible de créer la règle de redirection de port, car la plage de ports VIP [vipStartPort:%s, vipEndPort:%s] est incompatible avec la plage de ports privés [privateStartPort:%s, privateEndPort:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10010": "impossible de trouver le SCSI LUN pour la liste de volumes:%s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10013": "pour la redirection de port basée sur une plage, les tailles de plage de ports doivent correspondre ; la taille de la plage VIP [%s, %s] ne correspond pas à [%s, %s]", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10010": "le réseau l3 invité de la VM NIC et le réseau l3 VIP de la règle de redirection de port sont le même réseau (uuid: %s, uuid: %s)", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10028": "échec de l'obtention du fabric du contrôleur SDN [ip:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10013": "L'opération de prise d'instantanés de volume sur plusieurs hôtes simultanément lorsque Ceph est impliqué n'est pas prise en charge.", + "ORG_ZSTACK_MEVOCO_10097": "Le snippet de code Java fourni manque son fichier source. Veuillez vous assurer que tous les fichiers nécessaires sont inclus et recompiler. De plus, le message d'erreur \"unknown message version\" indique un format de message non pris en charge ou non reconnu. Veuillez vérifier la version du message et vous assurer qu'elle est compatible avec le système.", + "ORG_ZSTACK_STORAGE_BACKUP_10067": "Aucun bucket de stockage d'objet disponible trouvé pour les opérations de sauvegarde. Veuillez vous assurer que votre service de stockage d'objet est correctement configuré et accessible dans l'environnement cloud.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10014": "Échec du mappage du LUN à l'hôte avant l'attachement du volume à la VM", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10029": "échec de l'obtention du réseau fabric du contrôleur SDN [ip:%s] car %s", + "ORG_ZSTACK_MEVOCO_10096": "le compte non-admin ne peut pas dépasser la limite de bande passante maximale de %s", + "ORG_ZSTACK_STORAGE_BACKUP_10066": "La VM n'est pas à l'état arrêté : %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10026": "échec de l'obtention du VPC du contrôleur SDN [IP:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10011": "échec de l'échange d'informations du bloc SCSI LUN:%s", + "ORG_ZSTACK_MEVOCO_10095": "SetVolumeQosMsg version 1 est obsolète dans les environnements de informatique en nuage ; veuillez migrer vers la version 2 pour des performances et une compatibilité optimales.", + "ORG_ZSTACK_STORAGE_BACKUP_10065": "VM non trouvée avec la sauvegarde de volume [uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10027": "échec de l'obtention du VPC du contrôleur SDN [IP:%s] car %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10012": "échec du nettoyage des ressources après le détachement du volume car %s", + "ORG_ZSTACK_MEVOCO_10094": "Impossible de supprimer la QoS de volume de la VM sur l'hôte %s car la VM actuelle est à l'état de %s, mais les états pris en charge sont [%s, %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10064": "le volume original[uuid:%s] pour la sauvegarde[uuid:%s] n'est plus attaché à la machine virtuelle[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10063": "snapshot original pour la sauvegarde[uuid:%s] a été supprimé, impossible de restaurer le volume à celui-ci", + "ORG_ZSTACK_MEVOCO_10099": "Un compte non-admin est uniquement autorisé à définir la limite totale de %s pour les ressources virtuelles.", + "ORG_ZSTACK_STORAGE_BACKUP_10061": "la sauvegarde du volume [uuid:%s] est actuellement à l'état %s et ne peut pas être utilisée pour la restauration du volume.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10016": "primaryStorageUuid est obligatoire lors du téléchargement du cache d'image.", + "ORG_ZSTACK_MEVOCO_10098": "Type de limite Quality of Service (QoS) inconnu spécifié. Veuillez vous assurer que le type de limite QoS est correctement configuré.", + "ORG_ZSTACK_STORAGE_BACKUP_10060": "impossible de créer une VM à partir de la sauvegarde du volume [uuid:%s] qui n'est pas une sauvegarde de volume racine", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10017": "La VM a plusieurs volumes locaux sur différents hôtes [%s]. Veuillez vérifier les volumes locaux anormaux de la VM.", + "ORG_ZSTACK_STORAGE_CEPH_10004": "URL de surveillance invalide[%s], le nom d'hôte ne peut pas être nul. Un format valide d'URL de surveillance est %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10032": "get iMaster Logical Switch [%s] aucune réponse", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10018": "Le volume sur un hôte [Host UUID: %s] ne peut pas être attaché à la VM car la VM a des volumes locaux sur d'autres hôtes [Host UUID: %s].", + "ORG_ZSTACK_STORAGE_CEPH_10005": "URL de surveillance invalide[%s], le port SSH est hors de la plage valide (1-65535). Une URL de surveillance valide doit être au format %s", + "ORG_ZSTACK_STORAGE_CEPH_10002": "URL de surveillance invalide[%s], le composant nom d'utilisateur SSH:mot de passe SSH est invalide. Un format valide d'URL de surveillance est %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10030": "create Huawei iMaster Logical Switch [%s] échoué en raison de %s", + "ORG_ZSTACK_STORAGE_CEPH_10003": "URL de surveillance invalide[%s]. Le nom d'utilisateur et le mot de passe SSH doivent être séparés par ':' et ne peuvent pas être vides. Un format valide d'URL de surveillance est %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10035": "[%s] Huawei iMaster Virtual Switch Port [%s] échoué en raison de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10013": "Les deux clusters avec les UUIDs %s et %s ne peuvent pas communiquer dans le réseau L2 lors de la migration de la VM avec l'UUID %s vers un autre cluster.", + "ORG_ZSTACK_STORAGE_CEPH_10008": "Le pool Ceph avec l'UUID:%s existe déjà et est utilisé ailleurs dans l'environnement ZStack; par conséquent, il ne peut pas être réutilisé.", + "ORG_ZSTACK_STORAGE_BACKUP_10038": "url invalide[%s], doit être au format hostname:/path", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10036": "get logical switch port information for logical switch[%s] échoué en raison de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10014": "l'URL[%s] n'est pas un chemin absolu valide commençant par '/'. Veuillez vous assurer qu'il commence par 'http://' ou 'https://'.", + "ORG_ZSTACK_STORAGE_CEPH_10009": "impossible d'ajouter le stockage primaire Ceph car il est actuellement utilisé par les hôtes MON [%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10037": "type de montage invalide[%s], doit être [NFS, SSHFS, NBD]", + "ORG_ZSTACK_STORAGE_CEPH_10006": "échec de l'opération: le nom du pool ne peut pas inclure de caractères ASCII non imprimables [poolName:%s]", + "ORG_ZSTACK_KVM_10080": "Lorsque la plateforme VM est Other, le nombre de dataVolumes et de cdroms ne peut pas dépasser 3; actuellement %s.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10033": "delete Huawei iMaster Virtual Switch [%s] échoué en raison de %s", + "ORG_ZSTACK_STORAGE_BACKUP_10036": "degree [%s] doit être une valeur entière positive", + "ORG_ZSTACK_STORAGE_CEPH_10007": "échec de création, nom de pool dupliqué[%s]. Un pool avec le même nom existe déjà[uuid:%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10016": "L'hôte de la machine virtuelle [hostUuid:%s] est différent de celui du volume [hostUuid:%s]. Le volume ne peut pas être attaché à la machine virtuelle.", + "ORG_ZSTACK_STORAGE_BACKUP_10035": "[%s] n'est pas un CIDR standard, vouliez-vous dire [%s]?", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10034": "update Huawei iMaster Logical Switch [%s] échoué en raison de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10010": "Le volume avec UUID [%s] est le volume racine de la VM avec UUID [%s]. Actuellement, la VM a encore %s volumes de données attachés ; veuillez les détacher avant la migration.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10011": "Le volume [UUID:%s] est le volume racine de la VM [UUID:%s]. Actuellement, la machine virtuelle a encore un ISO attaché ; veuillez le détacher avant la migration.", + "ORG_ZSTACK_KVM_10088": "échec de la vérification des interfaces réseau physiques [noms: %s] sur l'hôte KVM [UUID:%s, IP:%s]", + "ORG_ZSTACK_KVM_10079": "Hôte[%s] échec de la mise à jour de la configuration du canal Spice car %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10021": "volume: %s n'est pas attaché, échec de la création du cache d'image pour le volume", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10024": "échec de la localisation du chemin d'installation pour le téléchargement du volume : %s, veuillez le préparer avant de continuer", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10039": "échec de la suppression du routeur logique Huawei iMaster NCE[%s], car %s", + "ORG_ZSTACK_MEVOCO_10064": "Erreur de format de la bande passante entrante du réseau %s", + "ORG_ZSTACK_STORAGE_BACKUP_10034": "Sauvegarde du volume [uuid:%s] introuvable sur tout support de stockage", + "ORG_ZSTACK_MEVOCO_10063": "la bande passante entrante du réseau dépasse la valeur maximale autorisée de 32 Gbps", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10025": "échec de la localisation d'un hôte pour télécharger le volume %s", + "ORG_ZSTACK_STORAGE_BACKUP_10033": "aucune autorisation pour les sauvegardes de volumes dans le groupe UUID : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10022": "impossible de localiser l'hôte de destination pour le volume : %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10037": "échec de la suppression du port du commutateur virtuel Huawei iMaster [%s] car %s", + "ORG_ZSTACK_STORAGE_BACKUP_10032": "plusieurs disques racines trouvés dans le groupe uuid : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10023": "échec de la localisation d'un hôte à mapper pour le volume %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10038": "échec de la création du routeur virtuel Huawei iMaster[%s] car %s", + "ORG_ZSTACK_MEVOCO_10061": "l'état du nœud de gestion n'est pas %s", + "ORG_ZSTACK_STORAGE_BACKUP_10031": "volume racine manquant dans le groupe UUID : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10026": "échec de la récupération de la référence de l'initiateur de l'hôte, veuillez reconnecter cet hôte : %s", + "ORG_ZSTACK_MEVOCO_10066": "Erreur de format de la bande passante sortante du réseau %s", + "ORG_ZSTACK_MEVOCO_10065": "la bande passante sortante du réseau dépasse la valeur maximale de 32 Gbps", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10042": "échec de la création du sous-réseau Huawei IMaster[%s] car %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10028": "échec du téléchargement de l'image[uuid:%s] vers tous les hôtes dans le stockage local[uuid:%s]. %s", + "ORG_ZSTACK_STORAGE_CEPH_10015": "monUrl[%s] invalide. Une URL valide devrait être au format %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10043": "échec de la suppression du sous-réseau Huawei iMaster[%s] car %s", + "ORG_ZSTACK_STORAGE_CEPH_10016": "dataVolumePoolName peut être null mais ne doit pas être une chaîne vide.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10040": "échec de la création du lien de réseau virtuel Huawei iMaster[%s] car %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10041": "échec de la suppression du lien de réseau virtuel Huawei iMaster[%s] car %s", + "ORG_ZSTACK_STORAGE_CEPH_10019": "impossible d'ajouter le stockage de sauvegarde Ceph car il y a déjà un stockage de sauvegarde Ceph utilisant mon[noms d'hôtes:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10046": "Aucune nouvelle interface réseau virtuelle n'a été créée, ce qui ne devrait pas se produire.", + "ORG_ZSTACK_MEVOCO_10082": "Échec de la configuration du thread I/O [%d] pin [%s] sur la machine virtuelle [%s]: %s.", + "ORG_ZSTACK_STORAGE_BACKUP_10049": "Échec de la création de la sauvegarde du volume pour le volume[uuid:%s], car son volume attaché n'est pas dans un état de[%s, %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10025": "Le stockage principal [UUID:%s] est désactivé; la migration à froid n'est pas autorisée.", + "ORG_ZSTACK_STORAGE_BACKUP_10048": "Échec de la création de la sauvegarde du volume pour le volume[uuid:%s], car la VM n'est pas dans l'état[%s, %s]", + "ORG_ZSTACK_STORAGE_CEPH_10017": "rootVolumePoolName peut être nul mais ne doit pas être une chaîne vide.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10026": "Le volume[uuid:%s] n'est plus attaché au stockage local, il a peut-être été supprimé ou détaché", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10044": "Échec de l'obtention des informations système du contrôleur SDN [IP:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10047": "Échec de la création de la sauvegarde du volume pour le volume[uuid:%s], car il n'est attaché à aucune instance de VM", + "ORG_ZSTACK_STORAGE_CEPH_10018": "imageCachePoolName peut être nul mais ne doit pas être une chaîne vide", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10045": "Échec de l'obtention des informations système du contrôleur SDN [IP:%s] dû à %s", + "ORG_ZSTACK_STORAGE_BACKUP_10046": "Impossible de créer une sauvegarde pour le volume partageable[uuid:%s]", + "ORG_ZSTACK_KVM_10093": "Connexion impossible à l'hôte KVM[uuid:%s, ip:%s, url:%s], en raison de %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10022": "Pour créer un volume sur le stockage principal local, vous devez spécifier l'hôte où le volume sera créé en utilisant la balise système [%s].", + "ORG_ZSTACK_KVM_10096": "L'hôte ne peut accéder à aucun stockage principal, veuillez vérifier votre configuration de stockage ou contacter le support pour obtenir de l'aide %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10023": "Format URI invalide. Les exemples corrects incluent file://$URL, hostUuid://$HOSTUUID, ou volume://$VOLUMEUUID.", + "ORG_ZSTACK_STORAGE_CEPH_10012": "Le même nœud Mono ne peut pas être ajouté plusieurs fois.", + "ORG_ZSTACK_KVM_10099": "Le port SSH de l'hôte[%s][%s] est inaccessible après %s secondes, délai de connexion dépassé", + "ORG_ZSTACK_STORAGE_CEPH_10010": "Impossible d'ajouter le même hôte [%s] aux mons du cluster", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10031": "La sauvegarde des snapshots vers le stockage de sauvegarde est une fonctionnalité obsolète et n'est pas prise en charge sur le stockage principal par blocs.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10032": "Échec de la recherche du cluster pour le volume de validation sur ps:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10035": "L'UUID du stockage principal est obligatoire lors de la suppression du LUN", + "ORG_ZSTACK_MEVOCO_10075": "Les disques partageables ne supportent actuellement que le type virtio-scsi.", + "ORG_ZSTACK_STORAGE_BACKUP_10045": "Stockage de sauvegarde inattendu[type:%s,uuid:%s] détecté", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10036": "L'UUID de l'hôte est obligatoire lors de la récupération du nom de l'initiateur de l'hôte", + "ORG_ZSTACK_MEVOCO_10074": "Le volume partageable[uuid:%s] est déjà attaché à la machine virtuelle[uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10048": "Aucune nouvelle interface réseau virtuelle créée, ce qui ne devrait pas se produire.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10033": "Échec de la recherche de l'hôte pour le volume de validation:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10034": "Échec du téléchargement[%s] depuis le stockage de sauvegarde[hostname:%s] vers le stockage principal par blocs[uuid:%s, path:%s], %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10049": "Il n'y a pas de fabric SDN configuré sur le contrôleur [ip:%s]", + "ORG_ZSTACK_MEVOCO_10078": "La version actuelle de la licence ne prend pas en charge la modification de cette configuration de ressource [name:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10037": "Le nom d'initiateur %s est utilisé par un autre hôte, veuillez régénérer l'initiateur pour l'hôte %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10038": "Échec de recherche du modèle de volume par nom:%s", + "ORG_ZSTACK_MEVOCO_10076": "Volume(s) partageable(s) [UUID: %s] attaché(s); la capture instantanée de groupe n'est pas prise en charge.", + "ORG_ZSTACK_AI_MESSAGE_10002": "Impossible d'annuler la tâche de création de l'ensemble de données car l'UUID [%s] de la ressource ou l'UUID [%s] du centre de modèles est null", + "ORG_ZSTACK_AI_MESSAGE_10001": "Impossible d'annuler la tâche de téléchargement du service de modèle car l'UUID [%s] de la ressource ou l'UUID [%s] du centre de modèles est null", + "ORG_ZSTACK_IPSEC_VYOS_10009": "Échec de l'application au groupe haute disponibilité en raison de %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10013": "Échec de l'exécution des appels HTTP vers toutes les instances Prometheus dans l'environnement cloud.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10012": "Type de données %s inconnu pour la clé = %s", + "ORG_ZSTACK_ENCRYPT_10000": "Échec de l'analyse du message API: impossible d'analyser le paramètre de chiffrement avec le type %s", + "ORG_ZSTACK_ENCRYPT_10002": "Échec de l'analyse du message API: %d paramètres de chiffrement de balises système trouvés, attendu 1", + "ORG_ZSTACK_IPSEC_VYOS_10001": "VYOS ne prend pas en charge AES-192 comme algorithme de chiffrement IKE; les options disponibles sont AES-128 et AES-256.", + "ORG_ZSTACK_IPSEC_VYOS_10000": "Le CIDR distant [%s] chevauche le CIDR de l'interface du routeur virtuel [%s]", + "ORG_ZSTACK_IPSEC_VYOS_10003": "vyOS ne prend pas en charge %d comme groupe DH IKE", + "ORG_ZSTACK_IPSEC_VYOS_10002": "vyOS ne prend pas en charge AES-192 comme PolicyEncryptionAlgorithm; les options disponibles sont AES-128, AES-256 et 3DES.", + "ORG_ZSTACK_COMPUTE_VM_10000": "L'état de la VM[uuid:%s] n'est pas en état Exécution; par conséquent, la synchronisation de l'horloge ne peut pas être effectuée.", + "ORG_ZSTACK_COMPUTE_VM_10008": "vm[uuid:%s] fait partie du cluster[uuid:%s], mais aucun hôte disponible n'existe dans le cluster. Par conséquent, la modification de l'image pour cette vm ne peut pas être traitée.", + "ORG_ZSTACK_COMPUTE_VM_10007": "L'UUID du cluster de vm[uuid:%s] est null, impossible de modifier l'image pour celle-ci", + "ORG_ZSTACK_COMPUTE_VM_10006": "L'état de la VM n'est pas Arrêtée: %s. L'action 'changevmimage' ne peut pas être effectuée.", + "ORG_ZSTACK_COMPUTE_VM_10005": "Le hook xml avec UUID: %s attaché à la VM avec UUID: %s avec succès, mais a échoué à redémarrer la VM. Détails: %s", + "ORG_ZSTACK_COMPUTE_VM_10004": "Le hook xml avec UUID: %s a été détaché avec succès de la VM avec UUID: %s, mais a rencontré des problèmes lors du redémarrage de la VM. Détails: %s", + "ORG_ZSTACK_COMPUTE_VM_10003": "L'ajout à chaud n'est pas désactivé; veuillez vous assurer que la configuration NUMA est définie avant d'ouvrir la machine virtuelle.", + "ORG_ZSTACK_COMPUTE_VM_10011": "Le paramètre de direction doit être défini sur IN ou OUT.", + "ORG_ZSTACK_COMPUTE_VM_10010": "Impossible de trouver le stockage de sauvegarde, impossible de valider la capture instantanée du volume[psUuid:%s] en tant qu'image, UUID PS de destination requis:%s", + "ORG_ZSTACK_COMPUTE_VM_10018": "Échec de la validation de l'état lors de l'opération de changement de mot de passe.%s", + "ORG_ZSTACK_COMPUTE_VM_10017": "Aucun hôte de destination trouvé dans la base de données par UUID: %s, impossible d'envoyer la commande de changement de mot de passe à l'hôte!", + "ORG_ZSTACK_STORAGE_DEVICE_10036": "Échec du scan hba: %s", + "ORG_ZSTACK_COMPUTE_VM_10015": "L'UUID de l'hôte de vm [%s] est null, impossible de synchroniser la qualité de service du réseau", + "ORG_ZSTACK_COMPUTE_VM_10014": "vm [%s] doit être en état Exécution ou En pause pour synchroniser les paramètres QoS de la carte réseau", + "ORG_ZSTACK_STORAGE_DEVICE_10031": "L'instance vm[uuid: %s] l'hôte[uuid: %s] a échoué à attacher le lun scsi[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10013": "outboundBandwidth ne doit pas dépasser %s.", + "ORG_ZSTACK_COMPUTE_VM_10012": "inboundBandwidth ne doit pas dépasser %s Gbps.", + "ORG_ZSTACK_STORAGE_DEVICE_10030": "L'instance de vm[%s] avec l'état [%s] n'est pas dans un état autorisé pour l'opération spécifiée[%s]", + "ORG_ZSTACK_COMPUTE_VM_10022": "Échec de la définition du niveau de sécurité car les fonctionnalités de sécurité sont désactivées. Veuillez vous assurer que les fonctionnalités de sécurité sont activées avant d'effectuer cette configuration.", + "ORG_ZSTACK_COMPUTE_VM_10020": "Le nombre de volumes de données dépasse la limite spécifiée [num: %s]. Veuillez réduire le nombre de volumes de données lors de la création de la machine virtuelle.", + "ORG_ZSTACK_STORAGE_DEVICE_10028": "Le SCSI LUN spécifié [WWID: %s] n'existe pas ou est désactivé", + "ORG_ZSTACK_STORAGE_DEVICE_10029": "scsi[%s] lun[wwid:%s] a été attaché à vm[%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10026": "Des configurations iSCSI différentes ont été trouvées sur l'hôte [UUID:%s, targets:%s] et l'hôte [UUID:%s, targets:%s].", + "ORG_ZSTACK_STORAGE_DEVICE_10027": "Des types de disque différents ont été trouvés sur les hôtes pour le LUN [serial:%s], impossible de l'attacher au cluster.", + "ORG_ZSTACK_COMPUTE_VM_10029": "Impossible de cloner VM car un préfixe est spécifié pour le réseau[uuid:%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10024": "Enregistrement SCSI LUN[%(s)s] non trouvé sur l'hôte [%(s)s]", + "ORG_ZSTACK_COMPUTE_VM_10028": "Impossible de cloner vm car l'adresse IPv6[%s] n'est pas valide", + "ORG_ZSTACK_STORAGE_DEVICE_10025": "Type d'hyperviseur inattendu[%s] pour l'hôte de machine virtuelle [%s]", + "ORG_ZSTACK_COMPUTE_VM_10027": "Impossible de cloner VM car un masque de réseau est spécifié pour le réseau[uuid:%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10022": "Différentes cibles NVMe ont été trouvées sur l'hôte[hostUuid:%s, targets:%s] et l'hôte[hostUuid:%s, targets:%s]", + "ORG_ZSTACK_COMPUTE_VM_10026": "Impossible de cloner vm car l'adresse IP spécifiée[%s] est invalide", + "ORG_ZSTACK_STORAGE_DEVICE_10023": "SCSI LUN[%s] est attaché à la machine virtuelle [%s]", + "ORG_ZSTACK_COMPUTE_VM_10025": "Impossible de cloner VM car le réseau de couche 3[uuid:%s] est introuvable", + "ORG_ZSTACK_STORAGE_DEVICE_10020": "L'instance de vm[%s] avec l'état[%s] n'est pas dans un état autorisé pour l'opération[%s]", + "ORG_ZSTACK_COMPUTE_VM_10024": "Code de niveau de sécurité inconnu[%s], les valeurs prises en charge sont [0-7]", + "ORG_ZSTACK_STORAGE_DEVICE_10021": "L'instance de vm[%s] a échoué à attacher le SCSI lun[uuid: %s] sur l'hôte[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10023": "Impossible de définir le niveau de sécurité pour VM non activée [uuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10002": "Le stockage principal actuel %s n'a pas de jeton tiers configuré, et par conséquent un volume de bloc ne peut pas être créé temporairement.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10001": "URL de ressource virtuelle allouée invalide:%s", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10000": "Échec de l'allocation d'URL. Veuillez vous assurer que l'URL est correcte et disponible. Si le problème persiste, contactez le support pour obtenir de l'aide.", + "ORG_ZSTACK_STORAGE_DEVICE_10017": "scsi lun[wwid:%s] a été attaché à vm[%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10015": "scisLun[uuids:%s] ne sont pas attachés au cluster de l'hôte[uuid:%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10016": "Veuillez démonter tous les périphériques bloc associés à la VM[%s] et réessayer", + "ORG_ZSTACK_STORAGE_DEVICE_10014": "scsi lun[wwid: %s] a été attaché à l'instance de machine virtuelle %s", + "ORG_ZSTACK_STORAGE_DEVICE_10011": "Le serveur iSCSI [UUID: %s] n'est pas associé au cluster [UUID: %s]", + "ORG_ZSTACK_STORAGE_DEVICE_10012": "Le serveur iSCSI [UUID: %s] est toujours associé au cluster [UUID: %s]", + "ORG_ZSTACK_STORAGE_DEVICE_10010": "Le serveur iSCSI [UUID: %s] est déjà attaché au cluster [UUID: %s]", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10008": "Le CIDR local et le CIDR distant doivent être des plages CIDR valides !", + "ORG_ZSTACK_NETWORK_SERVICE_HEADER_NFVINSTGROUP_10000": "L'interrogation du statut du cluster n'est pas prise en charge pour ce type d'instance NFV.", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10001": "La passerelle VPN [%s] existe, suppression à distance impossible.", + "ORG_ZSTACK_STORAGE_DEVICE_10008": "Le serveur iSCSI [IP: %s, Port: %s] existe déjà", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10005": "%s n'est pas une adresse IPv4 valide pour les configurations de déploiement cloud", + "ORG_ZSTACK_STORAGE_DEVICE_10009": "L'adresse IP du serveur iSCSI : %s n'est pas valide", + "ORG_ZSTACK_STORAGE_DEVICE_10006": "Le serveur NVMe avec UUID : %s est déjà attaché au cluster avec UUID : %s", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10007": "Le CIDR distant doit être une notation CIDR valide !", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10006": "localCidr doit être un Cidr valide !", + "ORG_ZSTACK_STORAGE_DEVICE_10004": "Le serveur NVMe [ip: %s, port: %s, transport: %s] existe déjà dans l'environnement cloud.", + "ORG_ZSTACK_STORAGE_DEVICE_10005": "L'adresse IP du serveur NVMe : %s n'est pas valide", + "ORG_ZSTACK_STORAGE_DEVICE_10003": "La migration de VM[uuid:%s] avec stockage partagé n'est pas prise en charge", + "ORG_ZSTACK_STORAGE_DEVICE_10000": "Les lun SCSI avec uuid: %s et uuid: %s n'ont pas d'hôte commun", + "ORG_ZSTACK_STORAGE_DEVICE_10001": "La lun SCSI [uuid: %s] est dans un état désactivé", + "ORG_ZSTACK_ALIYUN_NETWORK_VPN_10000": "La passerelle VPN et la passerelle utilisateur doivent être dans le même centre de données.", + "ORG_ZSTACK_IPSEC_VYOS_10016": "La création de l'ipsec vers l'ha route a échoué car %s", + "ORG_ZSTACK_IPSEC_VYOS_10015": "La suppression de l'ipsec du groupe ha a échoué car %s", + "ORG_ZSTACK_COMPUTE_BONDING_10001": "L'interface a déjà été créée sur l'hôte", + "ORG_ZSTACK_COMPUTE_BONDING_10008": "La carte bonding ne peut pas avoir d'interfaces dans un bond avec des vitesses différentes sur l'hôte[%s].", + "ORG_ZSTACK_COMPUTE_BONDING_10007": "Impossible d'avoir une interface[%s] dans un bond qui a été virtualisé SRIOV.", + "ORG_ZSTACK_COMPUTE_BONDING_10006": "Impossible d'avoir des interfaces dans un bond qui a été utilisé comme pont réseau, déjà utilisé par l'hôte[%s].", + "ORG_ZSTACK_COMPUTE_BONDING_10005": "Impossible d'avoir des interfaces occupées dans un bond qui est déjà utilisé par l'hôte[%s].", + "ORG_ZSTACK_IPSEC_VYOS_10012": "La mise à jour de la version ipsec a échoué car :vpc[%s] n'existe pas", + "ORG_ZSTACK_COMPUTE_BONDING_10009": "Il n'y a pas d'interface réseau slave sur l'hôte[uuid:%s]", + "ORG_ZSTACK_IPSEC_VYOS_10013": "La synchronisation vers le groupe HA a échoué car :%s", + "ORG_ZSTACK_MEVOCO_10105": "Le compte non-administrateur ne peut pas définir les limites de lecture/écriture %s supérieures à : %s/%s", + "ORG_ZSTACK_SIMULATOR_10002": "Instance définie à l'état déconnecté", + "ORG_ZSTACK_MEVOCO_10104": "Le compte non-admin ne peut pas définir l'écriture [storage limit] comme illimitée.", + "ORG_ZSTACK_MEVOCO_10103": "Un compte non-admin ne peut pas définir les limites d'E/S de lecture comme illimitées.", + "ORG_ZSTACK_MEVOCO_10102": "Un compte non-administratif est uniquement autorisé à configurer les limites de lecture/écriture %s.", + "ORG_ZSTACK_MEVOCO_10109": "L'UUID hôte de la VM [%s] est nul, impossible de synchroniser la qualité de service du volume", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10016": "Échec du test de connexion FiSecClientFactory", + "ORG_ZSTACK_MEVOCO_10108": "La VM [%s] doit être à l'état En cours ou En pause pour synchroniser la qualité de service du volume", + "ORG_ZSTACK_MEVOCO_10107": "Le volume [%s] n'est attaché à aucune machine virtuelle (ou la machine virtuelle n'existe pas), impossible de synchroniser la qualité de service du volume", + "ORG_ZSTACK_SIMULATOR_10004": "L'erreur \"on purpose\" indique une action intentionnelle plutôt qu'une défaillance du système. Veuillez fournir plus de détails sur l'objectif prévu pour continuer.", + "ORG_ZSTACK_MEVOCO_10106": "Le volume [%s] n'est attaché à aucune machine virtuelle ; par conséquent, la qualité de service (QoS) ne peut pas être récupérée via forceSync.", + "ORG_ZSTACK_MEVOCO_10101": "Un compte non-administrateur ne peut pas définir la limite totale %s supérieure à : %s", + "ORG_ZSTACK_MEVOCO_10100": "Un compte non-admin ne peut pas définir les limites totales %s sur l'infini.", + "ORG_ZSTACK_COMPUTE_BONDING_10011": "Impossible de se lier avec l'interface configurée avec l'adresse IP VTEP. Veuillez vous assurer que l'IP VTEP est correctement configurée et accessible.", + "ORG_ZSTACK_COMPUTE_BONDING_10010": "Impossible de se lier avec l'interface correspondant au réseau de gestion. Veuillez vous assurer que l'interface réseau virtuelle est correctement configurée et correspond au réseau de gestion spécifié.%s", + "ORG_ZSTACK_COMPUTE_BONDING_10015": "Une carte de liaison ne peut pas avoir une interface[%s] qui a été virtualisée SR-IOV", + "ORG_ZSTACK_COMPUTE_BONDING_10014": "Une carte de liaison ne peut pas avoir des interfaces qui ont été utilisées comme pont réseau, qui était déjà utilisé par l'hôte[%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10013": "Une carte de liaison ne peut pas avoir des interfaces occupées qui étaient déjà utilisées par l'hôte[%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10012": "Impossible d'avoir des interfaces dans une liaison qui n'est pas sur le même hôte[%s].", + "ORG_ZSTACK_COMPUTE_BONDING_10019": "[liaison] ne peut pas avoir [%s] interfaces, elle doit être comprise entre 1 et 2", + "ORG_ZSTACK_COMPUTE_BONDING_10018": "[carte de liaison] ne peut pas avoir [nombre d'interfaces] défini à [%s], cela doit être un nombre entre [1~8].", + "ORG_ZSTACK_COMPUTE_BONDING_10017": "L'interface de liaison [%s] ne peut pas spécifier une politique xmit_hash_policy différente, seul le mode 802.3ad prend en charge la spécification d'une politique différente.", + "ORG_ZSTACK_COMPUTE_BONDING_10016": "Une carte de liaison ne peut pas avoir des interfaces avec des vitesses différentes sur l'hôte[%s]", + "ORG_ZSTACK_MEVOCO_10113": "Volume[UUID:%s] utilise le protocole vhost-user, qui est incompatible avec les E/S asynchrones natives. Veuillez désactiver aio.native ou sélectionner un protocole de volume différent.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10003": "Échec de l'établissement de la connexion au pool de ressources secret[uuid: %s]", + "ORG_ZSTACK_MEVOCO_10112": "La version de licence actuelle ne prend pas en charge la modification de cette configuration globale [nom:%s].", + "ORG_ZSTACK_MEVOCO_10111": "Échec du détachement du volume partageable de l'instance de VM : [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10005": "Échec de l'initialisation du client %s : la propriété du pool de ressources secret est invalide.", + "ORG_ZSTACK_MEVOCO_10110": "Échec du détachement du volume partageable[uuid:%s] de l'Instance[uuid:%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10006": "Le plugin (UUID: %s) ne peut pas être supprimé car il est associé aux pools de ressources secrets suivants : [%s].", + "ORG_ZSTACK_MEDIATOR_10005": "Le VIP [UUID:%s] est déjà lié à un autre service [%s].", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10007": "L'ID d'organisation[uuid:%s] a déjà des attributs d'opération, impossible d'ajouter %s", + "ORG_ZSTACK_MEDIATOR_10006": "La plage de ports actuelle [%s, %s] est en conflit avec la plage de ports du service système [%s, %s] pour le VIP [UUID: %s] protocole : %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10008": "impossible de trouver la zone avec uuid:%s", + "ORG_ZSTACK_MEDIATOR_10007": "La plage de ports actuelle [%s, %s] est en conflit avec la plage de ports utilisée [%s, %s] pour le VIP [UUID: %s] protocole: %s", + "ORG_ZSTACK_COMPUTE_VM_10080": "vm[uuid:%s] répétition de l'identifiant du périphérique CD-ROM", + "ORG_ZSTACK_COMPUTE_VM_10077": "VM[uuid:%s] a attaché ISO[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10074": "la mémoire réservée[%s] dépasse la taille de mémoire disponible[%s]", + "ORG_ZSTACK_COMPUTE_VM_10073": "Paramètres CPU et mémoire inattendus. Veuillez vous assurer que les valeurs spécifiées sont compatibles avec votre type d'instance et vos exigences.", + "ORG_ZSTACK_COMPUTE_VM_10071": "échec de la recherche de l'hôte pour vm[uuid=%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10000": "l'identifiant virtuel[uuid:%s] possède déjà des attributs liés à l'administration; par conséquent, %s ne peut pas lui être attribué.", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10000": "la zone d'identité [%s] existe déjà, uuid: %s", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10001": "regionId: [%s] n'est pas une région Aliyun et ZStack valide, veuillez en choisir une autre", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10002": "le type [%s] ne correspond pas au type de centre de données attendu [%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10003": "project[uuid:%s] possède déjà un administrateur de projet désigné", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10003": "soit l'UUID du centre de données, soit l'ID de région doit être défini, veuillez vérifier les paramètres.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10004": "project[uuid:%s] n'existe pas", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10004": "la zone d'identité [%s] est toujours en cours de synchronisation, veuillez patienter.", + "ORG_ZSTACK_COMPUTE_VM_10079": "il n'y a pas de plage IP disponible sur le réseau L3 [%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10005": "l'identifiant virtuel [UUID:%s] possède déjà un attribut d'opérateur de projet attribué.", + "ORG_ZSTACK_COMPUTE_VM_10078": "tous les CD-ROM de VM[UUID:%s] ont des images ISO montées", + "ORG_ZSTACK_COMPUTE_VM_10090": "Échec de l'instanciation du volume car l'hôte de la VM [UUID: %s] et le stockage primaire alloué [UUID: %s] ne sont pas connectés.", + "ORG_ZSTACK_COMPUTE_VM_10088": "état actuel de la vm[%s], la modification de virtio nécessite que la vm soit dans l'état[%s]", + "ORG_ZSTACK_COMPUTE_VM_10084": "impossible de trouver ISO [UUID:%s] dans un stockage de sauvegarde connecté associé à la zone [UUID:%s]. Veuillez vérifier ce qui suit:", + "ORG_ZSTACK_COMPUTE_VM_10083": "1. Assurez-vous que le stockage de sauvegarde est attaché à la zone correcte où la VM [NOM: %s, UUID:%s] s'exécute.", + "ORG_ZSTACK_COMPUTE_VM_10081": "2. Confirmez que le stockage de sauvegarde est dans un état actif; si ce n'est pas le cas, essayez de le reconnecter.", + "ORG_ZSTACK_KVM_HYPERVISOR_10000": "aucun des stockages primaires%s spécifiés n'est disponible", + "ORG_ZSTACK_COMPUTE_VM_10099": "la création repose sur le cache d'image[uuid:%s, ps uuids localisés: [%s]], ne peut pas créer ailleurs.", + "ORG_ZSTACK_COMPUTE_VM_10098": "Échec de la collecte des informations de virtualisation de l'hôte", + "ORG_ZSTACK_COMPUTE_VM_10097": "Impossible de passer au réseau L3. Le réseau L3 [uuid:%s] appartient aux réseaux L2 [uuids:%s] qui n'ont été attachés à aucun cluster.", + "ORG_ZSTACK_COMPUTE_VM_10096": "Impossible de passer au réseau L3. Le réseau L3 spécifié [uuid:%s] appartient à un réseau L2 différent [uuids:%s].", + "ORG_ZSTACK_COMPUTE_VM_10094": "impossible de passer au réseau L3. Le réseau L3 spécifié [uuid:%s] n'a pas de plage IP configurée.", + "ORG_ZSTACK_COMPUTE_VM_10093": "impossible de passer au réseau L3. La VM [uuid: %s] n'est pas dans un état Exécuté ou Arrêté; l'état actuel est %s", + "ORG_ZSTACK_COMPUTE_VM_10092": "Impossible de capturer une capture d'écran de la VM [uuid:%s] qui n'est pas dans l'état En cours d'exécution.", + "ORG_ZSTACK_MEDIATOR_10002": "impossible d'attacher un réseau Layer 3. Le CIDR du réseau L3 [%s] à attacher chevauche le CIDR du réseau L3 [%s] déjà attaché à la VM", + "ORG_ZSTACK_MEDIATOR_10003": "la VM[name:%s, UUID:%s] a déjà des règles de redirection de port%s configurées", + "ORG_ZSTACK_MEDIATOR_10004": "la VM[name:%s, uuid:%s] a déjà des adresses IP Elastic%s attachées", + "ORG_ZSTACK_COMPUTE_VM_10033": "impossible de cloner la VM car la taille par défaut des UUID L3 n'est pas 1", + "ORG_ZSTACK_COMPUTE_VM_10032": "impossible de cloner la VM car l'état[%s] n'est pas valide", + "ORG_ZSTACK_COMPUTE_VM_10031": "impossible de cloner la VM car le type de pilote[%s] n'est pas valide", + "ORG_ZSTACK_COMPUTE_VM_10030": "impossible de cloner la VM car NicType[%s] n'est pas valide", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10002": "Trouvé des chemins de corbeille associés (%s) dans le stockage principal [%s] pour le chemin d'installation de migration [%s]. Veuillez d'abord les nettoyer à l'aide de 'APICleanUpTrashOnPrimaryStorageMsg' si vous insistez pour migrer le volume [%s].", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10000": "Impossible de trouver un hôte connecté pour effectuer l'opération de migration du stockage. Veuillez vous assurer que l'hôte cible est disponible et correctement configuré dans l'environnement cloud.", + "ORG_ZSTACK_COMPUTE_VM_10039": "L'opération n'est autorisée que sur une instance de VM utilisateur.", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10003": "volume[uuid:%s] a une dépendance sur l'image[uuid:%s], d'autres dépendances incluent les images[%s]", + "ORG_ZSTACK_COMPUTE_VM_10038": "L'interface réseau %s n'est pas attachée à la VM", + "ORG_ZSTACK_COMPUTE_VM_10037": "Les ressources de capacité sont insuffisantes pour le clonage de la VM [UUID: %s], volumes [UUID: %s] sur le stockage principal [UUID: %s]. La capacité requise est de %s octets, tandis que la capacité disponible actuelle est de %s octets.", + "ORG_ZSTACK_COMPUTE_VM_10036": "la création rapide de VM ne prend en charge que le clonage du volume de données sur le même stockage principal [UUID: %s] que la VM d'origine [UUID: %s].", + "ORG_ZSTACK_COMPUTE_VM_10035": "la création rapide de VM ne prend en charge que le clonage du volume racine sur le même stockage principal [UUID: %s] que la VM d'origine [UUID: %s].", + "ORG_ZSTACK_COMPUTE_VM_10034": "L'opération n'est autorisée que sur les instances de VM utilisateur.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10005": "Si le type de cluster est baremetal, le type d'hyperviseur doit également être baremetal ; inversement, si le type d'hyperviseur est baremetal, le type de cluster doit être baremetal.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10008": "Il y a des hôtes dans le cluster [uuid:%s] à l'état Pré-Maintenance ; par conséquent, la mise à jour du système d'exploitation n'est pas possible pour le moment.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10009": "Tous les hôtes du cluster [uuid:%s] ne sont pas à l'état Actif ; par conséquent, les droits du système d'exploitation du cluster ne peuvent pas être mis à jour pour le moment.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10006": "Seul le système d'exploitation des machines virtuelles basées sur KVM peut être mis à jour pour le moment.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10007": "L'hôte [UUID: %s] n'est pas membre du cluster [UUID: %s]. Veuillez vérifier l'UUID de l'hôte et vous assurer qu'il appartient à ce cluster.", + "ORG_ZSTACK_COMPUTE_VM_10044": "Ne modifiez pas l'image de la VM lorsqu'elle n'est pas à l'arrêt.", + "ORG_ZSTACK_COMPUTE_VM_10043": "l'utilisateur n'a pas le privilège de changer l'image de la VM %s", + "ORG_ZSTACK_COMPUTE_VM_10042": "le trafic propre n'est pas pris en charge pour le type de VM [%s]", + "ORG_ZSTACK_COMPUTE_VM_10041": "Adresse MAC en double [%s]", + "ORG_ZSTACK_COMPUTE_CLUSTER_10000": "l'accès à la mémoire ne doit pas être partagé si les huge pages sont désactivées dans le cluster [uuid: %s]. Veuillez d'abord activer les huge pages à l'aide de UpdateResourceConfig [category=%s name=%s value=%s resourceUuid=%s].", + "ORG_ZSTACK_COMPUTE_VM_10040": "L'opération n'est autorisée que lorsque l'état de la VM [%s] est arrêté.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10001": "les huge pages ne doivent pas être désactivées si le mode d'accès à la mémoire est défini sur partagé dans le cluster [uuid:%s]. Veuillez d'abord mettre à jour le mode d'accès à la mémoire à l'aide de UpdateResourceConfig [category=%s name=%s value=%s resourceUuid=%s].", + "ORG_ZSTACK_COMPUTE_VM_10049": "L'UUID, le compte cloud ou le jeton d'authentification doit être spécifié.%s", + "ORG_ZSTACK_COMPUTE_VM_10048": "L'instance[uuid:%s] ne peut pas être modifiée en image[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10047": "vm[uuid:%s] n'a pas de réseau L3 par défaut, donc ne peut pas changer d'image.", + "ORG_ZSTACK_COMPUTE_VM_10046": "Assurez-vous que le dernier hôte VM [UUID:%s] est en cours d'exécution et connecté.", + "ORG_ZSTACK_COMPUTE_VM_10045": "Assurez-vous que la machine virtuelle de stockage principal [UUID:%s] est activée et connectée.", + "ORG_ZSTACK_IAM2_CONTAINER_10009": "Échec de l'ouverture du fichier de configuration Kubernetes: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10007": "Échec de la récupération des projets autorisés en raison d'un contenu nul", + "ORG_ZSTACK_COMPUTE_VM_10055": "Le paramètre 'uuids' doit référencer une entité VmInstanceVO ou HostVO.", + "ORG_ZSTACK_IAM2_CONTAINER_10008": "Échec de la recherche de la configuration Kubernetes au chemin: %s", + "ORG_ZSTACK_COMPUTE_VM_10054": "L'ID de carte réseau: %s n'existe pas dans la configuration du réseau virtuel...", + "ORG_ZSTACK_IAM2_CONTAINER_10005": "Échec de la récupération des balises d'image en raison d'une réponse de page nulle. Veuillez vérifier le point de terminaison de l'API des balises d'image et vous assurer qu'il est correctement configuré.", + "ORG_ZSTACK_COMPUTE_VM_10053": "La carte d'interface réseau ne prend pas en charge l'application des paramètres de Qualité de Service (QoS) simultanément avec le service de Port Mirroring.", + "ORG_ZSTACK_IAM2_CONTAINER_10006": "Échec de la récupération des images en raison d'un contenu nul.%s", + "ORG_ZSTACK_COMPUTE_VM_10052": "La bande passante sortante et la bande passante entrante doivent être spécifiées pour au moins une direction.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10008": "Le groupe d'accès associé est déjà: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10003": "Échec de la configuration du cluster conteneurisé pour le projet[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10051": "Le nombre de moniteurs doit être l'un des suivants: 1, 2 ou 4.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10007": "La cible de montage NAS [%s] existe déjà dans le système de fichiers: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10004": "Échec de la récupération des balises d'image en raison d'un contenu nul.%s", + "ORG_ZSTACK_COMPUTE_VM_10050": "La direction doit être définie dans (in, out), mais était %s", + "ORG_ZSTACK_IAM2_CONTAINER_10001": "Échec de la mise à jour du quota pour le conteneur %s", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10009": "La règle de groupe d'accès [%s] existe déjà dans le groupe d'accès [%s]", + "ORG_ZSTACK_IAM2_CONTAINER_10002": "Échec de la configuration du conteneur du projet[uuid: %s], car le projet n'a pas été trouvé dans la base de données", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10003": "Le domaine de montage n'est pas valide après %d millisecondes, suppression...", + "ORG_ZSTACK_IAM2_CONTAINER_10000": "Échec de la mise à jour du quota du projet[uuid: %s] côté conteneur en raison d'une erreur inattendue", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10006": "Aucun groupe d'accès NAS disponible; veuillez en créer au moins un.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10005": "Aucune cible de montage [%s] dans NAS: %s", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10000": "Aucun système de fichiers [%%s] trouvé dans la région: %%s", + "ORG_ZSTACK_COMPUTE_VM_10059": "Aucune préférence de compte trouvée. Veuillez envoyer une commande de changement de mot de passe à l'hôte de la machine virtuelle!", + "ORG_ZSTACK_COMPUTE_VM_10058": "Aucun hôte de destination trouvé dans la base de données; impossible d'envoyer la commande de changement de mot de passe à l'hôte!", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10002": "Certains stockages principaux [%%s] sont associés à ce NAS; veuillez supprimer le stockage principal avant de le supprimer.", + "ORG_ZSTACK_COMPUTE_VM_10057": "seuls les hôtes avec le(s) UUID(s) : %s peuvent accéder au volume de données.", + "ORG_ZSTACK_COMPUTE_VM_10056": "la ressource[UUIDs:%s] n'est pas gérée par le compte[UUID:%s]", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10001": "le système de fichiers NAS existe dans le centre de données : %s", + "ORG_ZSTACK_COMPUTE_VM_10063": "le mot de passe fourni ne répond pas aux exigences de complexité. Il doit contenir au moins un chiffre, une lettre majuscule, une lettre minuscule et un caractère spécial.", + "ORG_ZSTACK_COMPUTE_VM_10062": "la longueur du mot de passe doit être [%s-%s caractères]", + "ORG_ZSTACK_COMPUTE_VM_10061": "le disque ne prend pas en charge la pièce jointe. Le type de disque est %s", + "ORG_ZSTACK_COMPUTE_VM_10060": "le paramètre AO du disque est incorrect. Vous devez définir l'une des propriétés suivantes : taille, UUID de modèle, UUID d'offre de disque ou UUID source-type source. Une seule de ces propriétés doit être spécifiée.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10010": "le groupe d'accès [%s] existe déjà dans le centre de données [%s]", + "ORG_ZSTACK_COMPUTE_VM_10068": "il n'y a pas de type d'interface réseau disponible sur le réseau L3 [%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10015": "Impossible de créer une machine virtuelle secondaire car la machine virtuelle principale est à l'arrêt. Veuillez démarrer la machine virtuelle principale avant de créer une machine virtuelle secondaire.", + "ORG_ZSTACK_COMPUTE_SRIOV_10014": "SR-IOV et VFHA ne peuvent pas être activés simultanément pour connecter un réseau L3 à une machine virtuelle. Veuillez vous assurer qu'une seule de ces options est configurée.", + "ORG_ZSTACK_COMPUTE_SRIOV_10015": "Impossible de modifier l'interface réseau de fonction virtuelle en type standard", + "ORG_ZSTACK_FAULTTOLERANCE_10013": "Une autre tâche de garbage collection de tolérance aux pannes est en cours d'exécution. Veuillez annuler la nouvelle tâche et attendre sa fin.", + "ORG_ZSTACK_COMPUTE_SRIOV_10016": "Impossible de modifier l'interface réseau en type VF. Veuillez vous assurer que l'instance cible prend en charge le réseau vf.", + "ORG_ZSTACK_COMPUTE_SRIOV_10017": "l'interface réseau de machine virtuelle avec UUID:%s n'existe pas", + "ORG_ZSTACK_FAULTTOLERANCE_10011": "groupe de machines virtuelles tolérantes aux pannes manquant", + "ORG_ZSTACK_FAULTTOLERANCE_10010": "Impossible de migrer la machine virtuelle ft primaire[uuid:%s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10019": "uniquement SR-IOV pris en charge", + "ORG_ZSTACK_MONITORING_MEDIA_10001": "Échec de l'établissement d'une connexion au serveur SMTP à l'hôte : %s, port : %d. Veuillez vérifier l'exactitude des paramètres smtpServer et smtpPort.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10038": "le corps de la condition ne peut pas prendre en charge les valeurs nulles ou de tableau JSON !", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10037": "Prise en charge uniquement des fonctions ZStack Template dans le champ 'Condition' !", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10036": "la valeur doit être de type booléen dans le champ 'Condition'", + "ORG_ZSTACK_MONITORING_MEDIA_10000": "le problème peut être dû à un ID de clé d'accès ou une clé d'accès secrète incorrecte ou des permissions IAM insuffisantes pour l'utilisateur spécifié. Veuillez vérifier vos identifiants et vous assurer que l'utilisateur dispose des permissions nécessaires dans votre environnement d'informatique en nuage.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10035": "la clé de condition : %s ne prend en charge qu'un seul élément dans l'objet JSON de valeur, mais %d éléments ont été fournis !", + "ORG_ZSTACK_FAULTTOLERANCE_10019": "Échec de l'exécution du basculement. La machine virtuelle principale est inconnue et aucune adresse réseau de tolérance aux pannes n'est disponible. Veuillez vérifier votre configuration.", + "ORG_ZSTACK_FAULTTOLERANCE_10018": "pvm[uuid:%s] n'existe pas", + "ORG_ZSTACK_FAULTTOLERANCE_10017": "impossible de basculer vm[uuid:%s]. Le groupe de machines virtuelles tolérantes aux pannes associé n'existe pas", + "ORG_ZSTACK_COMPUTE_SRIOV_10012": "l'interface réseau de machine virtuelle [uuid:%s] est déjà de type %s ; aucune modification nécessaire", + "ORG_ZSTACK_FAULTTOLERANCE_10016": "la création de la machine virtuelle secondaire a réussi, mais une erreur s'est produite lors de la demande de démarrage de la machine virtuelle secondaire. Veuillez vérifier la configuration de la machine virtuelle secondaire et vous assurer que tous les prérequis pour le démarrage de la machine virtuelle secondaire sont remplis.", + "ORG_ZSTACK_COMPUTE_SRIOV_10013": "Modifier le type d'interface réseau d'une machine virtuelle uniquement lorsqu'elle est arrêtée.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10009": "L'authentification à deux facteurs a échoué en raison de l'absence d'un jeton dans la balise système msg.%s", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10008": "L'authentification à deux facteurs a échoué car le message ne contient pas de balises système.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10004": "L'authentification à deux facteurs n'est pas activée pour votre compte. Veuillez l'activer pour continuer.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10001": "Type de compte non pris en charge : %s", + "ORG_ZSTACK_FAULTTOLERANCE_10026": "Port de machine virtuelle à tolérance de pannes non trouvé", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10011": "Échec de la vérification du code d'authentification à deux facteurs pour la ressource virtuelle %s. Veuillez vérifier votre code et réessayer.", + "ORG_ZSTACK_DAHO_CORE_10003": "Échec de la création de la tâche Daho VLL ! Veuillez vous assurer que tous les fichiers sources sont correctement téléversés et accessibles dans l'environnement cloud.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10010": "L'authentification à deux facteurs a échoué car aucun secret n'est défini pour %s:%s", + "ORG_ZSTACK_FAULTTOLERANCE_10024": "Impossible de démarrer la machine virtuelle secondaire car la machine virtuelle principale est dans un état arrêté. Veuillez d'abord démarrer la machine virtuelle principale.", + "ORG_ZSTACK_DAHO_CORE_10004": "Aucun compte Alibaba Cloud trouvé pour accountUuid : %s", + "ORG_ZSTACK_FAULTTOLERANCE_10022": "Impossible de trouver une adresse IP disponible dans le réseau de tolérance de pannes actuel. Veuillez vérifier que la configuration globale [catégorie : Tolérance de pannes, nom : fault.tolerance.network.cidr] est correctement définie et que l'hôte [uuid:%s] possède une adresse IP dans la plage CIDR spécifiée.", + "ORG_ZSTACK_FAULTTOLERANCE_10021": "Une exception inattendue s'est produite lors de la gestion des ressources cloud. Veuillez vérifier vos paramètres d'entrée et vous assurer qu'ils sont dans des plages valides. Si le problème persiste, envisagez de vérifier la configuration de l'environnement d'informatique en nuage ou contactez le support pour obtenir de l'aide supplémentaire.", + "ORG_ZSTACK_DAHO_CORE_10007": "La politique d'expiration : %s n'est pas une configuration valide", + "ORG_ZSTACK_FAULTTOLERANCE_10020": "Échec du basculement. La machine virtuelle secondaire est inconnue et aucune adresse réseau de tolérance de pannes n'est disponible. Veuillez vérifier votre configuration.", + "ORG_ZSTACK_DAHO_CORE_10008": "vlanId[%s] existe déjà !", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10026": "Le poids de CfnRootDecoder doit être compris entre 0-100, où 0 indique un décodage prioritaire et la valeur par défaut est 50.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10025": "Le corps racine des paramètres doit être un objet JSON !", + "ORG_ZSTACK_COMPUTE_SRIOV_10020": "%s ne prend pas en charge SRIOV", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10024": "Le type est requis pour les paramètres, mais n'est pas trouvé dans %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10021": "La balise enableSRIOV n'est pas prise en charge pour le type de VM [%s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10022": "Échec du pré-traitement de l'interface réseau virtuelle avant la migration de la VM[uuid:%s] vers l'hôte[uuid:%s]\"", + "ORG_ZSTACK_FAULTTOLERANCE_10028": "Le numéro de port alloué est inférieur à celui demandé pour l'interface réseau [uuid: %s] sur l'hôte [uuid: %s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10023": "Échec du post-traitement de l'interface réseau virtuelle après la migration de la VM[uuid:%s] vers l'hôte[uuid:%s]\"", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10029": "Le corps de la valeur de mappage ne prend pas en charge le tableau JSON ! Veuillez vous assurer que la valeur de mappage est un type scalaire ou complexe pris en charge par votre plateforme d'informatique en nuage.", + "ORG_ZSTACK_FAULTTOLERANCE_10027": "Échec de l'allocation d'un port pour l'interface réseau[uuid: %s] sur l'hôte[uuid: %s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10028": "Impossible de trouver le message : %s pour la création d'une ressource", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10030": "Le corps de la valeur de mappage ne peut pas prendre en charge les valeurs nulles ! Veuillez vous assurer que tous les corps de valeurs de mappage sont initialisés.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10031": "mappingName doit être trouvé dans le résultat JSON CloudFormation ou il sera considéré comme non valide.", + "ORG_ZSTACK_FAULTTOLERANCE_10037": "Impossible de basculer la VM[uuid:%s] car le groupe de machines virtuelles à tolérance de pannes n'est pas dans l'un des statuts suivants : [%s, %s]", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10005": "Impossible de joindre L2VirtualSwitchNetwork car il n'y a aucun hôte dans le cluster[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10036": "Impossible de basculer VM[UUID:%s], veuillez confirmer qu'il s'agit d'un groupe de VM à tolérance de panne.", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10006": "Impossible de raccorder le réseau L2 Virtual Switch car l'interface[%s] doit être créée sur l'hôte[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10035": "Impossible de basculer VM[UUID:%s], veuillez vous assurer que le basculement est activé dans GlobalConfig.", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10007": "Impossible de créer un réseau de couche 3 sur le commutateur virtuel[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10034": "Impossible de supprimer le réseau L3 [uuid:%s]. La VM à tolérance de panne [%s] est toujours dans les états [%s, %s]. Veuillez arrêter les VMs à tolérance de panne liées avant de tenter de supprimer le réseau L3.", + "ORG_ZSTACK_FAULTTOLERANCE_10033": "L'image[uuid:%s] est toujours utilisée par la VM à tolérance de panne[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10004": "Impossible de trouver un hôte KVM connecté pour effectuer l'opération ; il semble que tous les hôtes des clusters attachés au groupe de stockage par blocs partagé [uuid:%s] soient déconnectés.", + "ORG_ZSTACK_FAULTTOLERANCE_10032": "Le volume avec l'index : %d de pvm[uuid:%s] et svm[uuid:%s] a un volume de cache de taille différente ; le démarrage n'est pas autorisé", + "ORG_ZSTACK_FAULTTOLERANCE_10031": "Les volumes avec l'index : %d de pvm[uuid:%s] et svm[uuid:%s] ont des tailles différentes ; le démarrage n'est pas autorisé", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10003": "Impossible de créer L2PortGroupNetwork car L2VirtualSwitchNetwork[uuid:%s] contient déjà des L2PortGroupNetworks avec le même vlanId[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10002": "L'hôte KVM auquel le volume[uuid:%s] est attaché a perdu la connexion au groupe de stockage par blocs partagé[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10030": "Les numéros de volumes de pvm[uuid:%s] et svm[uuid:%s] ne correspondent pas ; le démarrage n'est pas autorisé.", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10004": "Impossible de raccorder L2VirtualSwitchNetwork car l'interface[%s] dans le cluster[uuid:%s] est déjà utilisée par un autre L2VirtualSwitchNetwork", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10001": "Impossible de trouver le volume à utiliser dans le stockage principal du groupe de blocs partagé.%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10002": "Aucun routeur virtuel n'est configuré pour le service DHCP VYOS.%s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10006": "Le volume partagé ne prend pas en charge le thin provisioning", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10001": "Impossible d'ajouter les entrées DHCP à la VM routeur virtuel[UUID:%s IP:%s] en raison de %s, entrée DHCP[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10039": "L'opération actuelle[API:%s] n'est pas prise en charge lorsque la VM FT[UUID:%s, état:%s] n'est pas dans un état arrêté", + "ORG_ZSTACK_FAULTTOLERANCE_10038": "Impossible de maintenir l'hôte car les VMs FT[%s] sont en cours de récupération", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10011": "vm[uuid:%s] n'est pas dans un état En cours d'exécution, En pause ou Arrêté, état actuel[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10048": "Impossible de mettre à jour la plateforme de la vm FT[uuid:%s], il faut arrêter les deux VMs et s'assurer qu'elles sont dans un état arrêté avant de procéder", + "ORG_ZSTACK_FAULTTOLERANCE_10047": "Impossible de mettre à jour la taille de mémoire de la vm FT[uuid:%s], car cela nécessite l'arrêt des deux VMs", + "ORG_ZSTACK_FAULTTOLERANCE_10046": "Impossible de mettre à jour le nombre de CPU de la vm FT[uuid:%s], il faut arrêter les deux VMs et les redémarrer", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10005": "Le réseau L2 ne doit pas avoir le même nom d'interface qu'un réseau de provisionnement déjà attaché au cluster.", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10004": "N'ajoutez pas d'hôte à un cluster BareMetal2.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10015": "L'image avec l'UUID [uuid: %s] et le nom [name: %s] n'est trouvée sur aucun stockage de sauvegarde.", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10003": "L'architecture doit être spécifiée lors de la création de nouveaux clusters BareMetal2.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10014": "L'image [UUID: %s, name: %s] n'est pas disponible au téléchargement sur aucun stockage de sauvegarde :", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10002": "1. Vérifiez que l'image n'est pas dans un état supprimé.", + "ORG_ZSTACK_FAULTTOLERANCE_10042": "2. Assurez-vous que le stockage de sauvegarde marqué comme Prêt pour cette image est attaché à la zone [UUID: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10013": "non pris en charge pour la fusion de snapshot en ligne du volume partageable[uuid: %s] sur sharedblock", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10001": "Impossible de connecter un stockage local à un cluster baremetal. Veuillez vous assurer que le cluster prend en charge la connexion de stockage local.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10012": "Le volume [UUID: %s] est connecté à une VM [UUID: %s] qui est dans l'état %s; par conséquent, la fusion de snapshot ne peut pas être effectuée.", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10000": "Impossible de connecter un Ceph tiers avec token à un cluster aarch64. Veuillez vous assurer de la compatibilité de la version de Ceph avec l'architecture du cluster.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10017": "hosts[uuid:%s] ont un UUID de disque qui est associé à un stockage block partagé, mais le stockage réel est différent.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10016": "aucun hôte connecté trouvé dans le cluster[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10049": "l'opération actuelle n'est pas prise en charge sur une machine virtuelle de groupe à tolérance de panne[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_NETWORK_10004": "l'adresse mac %s est déjà une interface esclave de bond", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10000": "impossible de programmer les entrées DHCP servies par le routeur virtuel[uuid:%s, ip:%s], %s", + "ORG_ZSTACK_BAREMETAL_NETWORK_10003": "L'adresse MAC %s n'appartient pas au chassis avec l'UUID %s", + "ORG_ZSTACK_BAREMETAL_NETWORK_10002": "L'adresse esclave %s est invalide. Elle doit être au format d'adresses MAC séparées par des virgules, comme 6c:b3:11:1b:0b:1e,6c:b3:11:1b:0b:1f.", + "ORG_ZSTACK_BAREMETAL_NETWORK_10001": "le nom de bond %s existe déjà dans la configuration du réseau virtuel", + "ORG_ZSTACK_BAREMETAL_NETWORK_10000": "La création d'un BM Bonding est uniquement autorisée avant la création d'une BM Instance.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10022": "impossible de trouver le backup storage[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10058": "Pas autorisé la même adresse MAC [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10021": "le statut attendu est %s et le statut actuel est %s", + "ORG_ZSTACK_FAULTTOLERANCE_10057": "Le réseau Ft n'est pas configuré", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10020": "L'opération de conversion d'un volume thin en volume thick n'est pas actuellement prise en charge. Veuillez consulter la dernière documentation pour les options de conversion de volume disponibles.", + "ORG_ZSTACK_FAULTTOLERANCE_10056": "Échec de la création de la machine virtuelle de failover, veuillez activer la technologie de failover dans GlobalConfig", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10001": "impossible de trouver l'IP guest EIP: %s dans les IPs du NIC VM: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10055": "Impossible de migrer l'instance de machine virtuelle secondaire FT", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10002": "eip [uuid:%s] a été supprimé", + "ORG_ZSTACK_FAULTTOLERANCE_10054": "Impossible de migrer l'instance de VM primaire FT", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10025": "le volume partagé QEMU2[uuid:%s] n'est pas pris en charge", + "ORG_ZSTACK_FAULTTOLERANCE_10053": "l'opération actuelle n'est pas prise en charge sur la machine virtuelle secondaire[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10024": "VM[uuid:%s] a plusieurs ISOs de différents storages primaires: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10029": "L'opération supporte uniquement les instances de machines virtuelles complètes. Veuillez vous assurer que vous utilisez une spécification d'instance complète.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10027": "Impossible de trouver un hôte disponible pour prendre un snapshot pour le volume[uuid: %s] sur le primary storage shared block group[uuid: %s].", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10005": "soit l'UUID d'Elastic IP soit l'UUID de Virtual IP doit être spécifié", + "ORG_ZSTACK_FAULTTOLERANCE_10051": "l'opération actuelle n'est pas prise en charge sur la machine virtuelle secondaire de transfert de fichiers[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10006": "eip avec uuid:%s n'est pas dans l'état activé, la pièce jointe à un vm nic n'est pas possible", + "ORG_ZSTACK_FAULTTOLERANCE_10050": "l'opération actuelle n'est pas prise en charge sur la VM primaire avec tolérance de pannes[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10003": "Impossible de joindre le réseau L3 [uuid:%s, name:%s] à la VM [uuid:%s, name:%s], car le réseau L3 fournit une Elastic IP (EIP) à l'une des NICs de la VM.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10004": "vmNic [UUID:%s] n'est pas jointe à vmInstance et ne peut donc pas récupérer les EIP joignables.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10009": "eip avec uuid: %s ne peut être jointe que lorsque son état est %s, mais son état actuel est %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10007": "ip [uuid:%s] est associée avec vm nic [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10008": "eIP avec UUID: %s a déjà été jointe à une autre VM NIC avec UUID: %s et ne peut pas être jointe à nouveau.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10033": "impossible de trouver un hôte KVM connecté pour effectuer l'opération; il semble que tous les hôtes attachés au stockage par blocs partagé [uuid:%s] soient déconnectés.", + "ORG_ZSTACK_FAULTTOLERANCE_10069": "cluster[uuid:%s] est spécifié mais il est désactivé; par conséquent, une VM ne peut pas être créée à partir de celui-ci.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10032": "impossible de trouver des hôtes connectés à la fois au stockage principal avec UUID: %s et au stockage principal avec UUID: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10068": "zone[uuid:%s] est spécifiée mais elle est désactivée; par conséquent, une VM ne peut pas être créée à partir de celle-ci.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10031": "Impossible de trouver un hôte disponible pour migrer le volume[uuid: %s] sur le stockage principal de groupe de blocs partagé[uuid: %s] et [uuid: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10030": "Impossible de trouver un hôte disponible pour migrer le volume[uuid: %s] entre le stockage principal de groupe de blocs partagé[uuid: %s] et [uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10037": "impossible de réduire l'instantané %s car la machine virtuelle %s n'est pas dans l'état En cours d'exécution ou Arrêté", + "ORG_ZSTACK_FAULTTOLERANCE_10065": "Impossible d'ajouter le même UUID au l3Network, UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10035": "impossible de réduire l'instantané %s car le volume %s n'est pas prêt", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10038": "obtenir un chemin d'installation nul dans l'instantané pour la machine virtuelle %s", + "ORG_ZSTACK_ALIYUN_BACKUP_10000": "Aucun godet de stockage trouvé pour les opérations de sauvegarde. Veuillez vous assurer qu'un godet valide a été configuré.%s", + "ORG_ZSTACK_FAULTTOLERANCE_10062": "image[uuid:%s] est au format: %s, seuls les formats valides peuvent être utilisés pour créer une VM", + "ORG_ZSTACK_FAULTTOLERANCE_10061": "image[uuid:%s] est de type média: %s; seuls les modèles de volume root peuvent être utilisés pour créer une VM.", + "ORG_ZSTACK_TICKET_IAM2_API_10004": "Une politique de réservation ne peut être associée qu'à une seule collection de flux.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10044": "Aucun hôte connecté trouvé pour extraire l'instantané sur le stockage principal[uuid:%s] pour le volume[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10020": "vip[uuid:%s] n'est pas dans l'état attendu[%s], l'état actuel est %s", + "ORG_ZSTACK_SNS_PLATFORM_MICROSOFTTEAMS_10000": "échec de l'envoi des messages vers Microsoft Teams. statut: %s, corps: %s", + "ORG_ZSTACK_TICKET_IAM2_API_10003": "Un nom est requis pour créer un flux dans l'environnement de informatique en nuage.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10043": "Aucun hôte connecté trouvé pour valider l'instantané sur le stockage principal[uuid:%s] pour le volume[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10079": "impossible de démarrer la vm[uuid:%s]. Elle n'a aucune carte d'interface réseau (NIC) jointe, veuillez joindre une NIC et réessayer.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10042": "le chemin d'installation actif %s a échoué, car %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10041": "l'instantané des enfants actifs a échoué car %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10023": "le UUID vmNic[%s] n'est pas autorisé à ajouter un EIP car il a déjà une règle de redirection de port avec un CIDR autorisé.", + "ORG_ZSTACK_FAULTTOLERANCE_10077": "La machine virtuelle tolérante aux pannes actuelle est dans un état inconnu et ne peut pas être arrêtée. Veuillez tenter d'effectuer un basculement manuel.", + "ORG_ZSTACK_TICKET_IAM2_API_10008": "Le nom de la ressource ne peut pas être nul. Veuillez fournir un nom valide pour la ressource.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10048": "taille d'initialisation du thin provisioning invalide[%s]", + "ORG_ZSTACK_TICKET_IAM2_API_10007": "titre de l'approbateur %s invalide, les valeurs valides sont %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10021": "le réseau l3 invité de vm nic[uuid:%s] et le réseau l3 vip de vip[uuid:%s] sont le même réseau", + "ORG_ZSTACK_TICKET_IAM2_API_10006": "Au moins un flux est requis pour créer une collection de flux.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10022": "L'état de la VM [%s] ne permet pas d'effectuer des opérations EIP. Veuillez attendre que le processus de la VM se termine.", + "ORG_ZSTACK_TICKET_IAM2_API_10005": "Une opération d'administrateur ou de rôle IAM est requise en tant qu'approbateur du dernier flux de travail.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10045": "la désactivation du chemin d'installation a échoué car %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10049": "taille d'initialisation du thin provisioning[%s] invalide, elle doit être supérieure ou égale à %s", + "ORG_ZSTACK_FAULTTOLERANCE_10073": "defaultL3NetworkUuid[uuid:%s] n'est pas trouvé dans l3NetworkUuids[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10071": "host[uuid:%s] est spécifié mais son statut de connexion est %s, impossible de créer une VM à partir de celui-ci", + "ORG_ZSTACK_FAULTTOLERANCE_10070": "host[uuid:%s] est spécifié mais il est désactivé ; par conséquent, une VM ne peut pas être créée à partir de celui-ci.", + "ORG_ZSTACK_TICKET_IAM2_API_10009": "L'UUID de l'approbateur ne peut pas être nul", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10051": "thinProvisioningInitializeSize[%s] invalide dépasse la limite maximale de %d", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10050": "thinProvisioningInitializeSize[%s] invalide, ce n'est pas une valeur de taille valide", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10055": "L'hôte avec UUID [uuid: %s] n'est pas disponible pour redimensionner le volume avec UUID [uuid: %s] sur le stockage principal du groupe de blocs partagé avec UUID [uuid: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10054": "impossible de trouver un hôte avec stockage de blocs partagé connecté pour exécuter la commande pour le stockage principal du groupe de blocs partagé[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10053": "impossible de trouver un hôte disponible pour exécuter la commande pour le stockage principal du groupe de blocs partagé[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10052": "la valeur[%s] n'est pas une puissance de 2", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10012": "L'adresse IP [uuid:%s] n'appartient pas à l'interface réseau [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10059": "impossible de trouver un cluster attaché au stockage principal du groupe de blocs partagé [uuid: %S]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10058": "le stockage principal du point de montage partagé[uuid:%s, name:%s] ne peut trouver aucun hôte disponible dans les clusters attachés pour instancier le volume", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10013": "eip[uuid:%s] n'a pas été attaché à l'interface réseau d'aucune machine virtuelle", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10010": "l'interface réseau de la vm n'a pas d'IP utilisée compatible pour l'EIP avec UUID %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10057": "volume[uuid:%s] non trouvé dans le pool de stockage", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10011": "le réseau l3 invité de l'interface réseau VM et le réseau l3 VIP de l'EIP sont le même réseau [uuid:%s] et [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10056": "stockage principal [uuid:%s] non trouvé", + "ORG_ZSTACK_TICKET_IAM2_API_10011": "l'ID virtuel [UUID] n'appartient pas au projet [UUID]", + "ORG_ZSTACK_TICKET_IAM2_API_10010": "impossible de trouver le mappage IAM-vers-ID virtuel [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10017": "La VM [UUID:%s] associée à l'EIP est déjà connectée au réseau public [UUID:%s], d'où provient le VIP [UUID:%s, Name:%s, IP:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10014": "La version IP du VIP [%d] diffère de la version IP de l'invité [%d].", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10015": "VIP[%s] se trouve dans la plage IP de l'invité [%s - %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10062": "Le stockage principal SharedBlock [uuid:%s, name:%s] n'a été attaché à aucun cluster de calcul, ou il n'y a pas d'hôtes connectés dans les clusters attachés.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10018": "Le VIP [UUID:%s] a été occupé par une autre entité de service réseau [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10019": "L'EIP ne peut pas être créé sur un VIP système. Veuillez vous assurer d'utiliser une adresse IP publique pour l'association de l'EIP.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10047": "Échec de l'obtention du hash de l'image, parce que:%s", + "ORG_ZSTACK_SNS_PLATFORM_FEISHU_10000": "Échec de l'envoi des messages à FeiShu. statut: %s, corps: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10042": "L'UUID de l'agent de stockage de sauvegarde d'image a changé [attendu: %s, actuel: %s]. Cela est très probablement dû à un redémarrage manuel de l'agent. Veuillez émettre une reconnexion pour synchroniser le statut.", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10000": "Échec de la récupération des informations du cluster Zaku, erreur: %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10002": "Échec de la récupération du cluster zaku [id:%s], erreur: %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10001": "Échec de la récupération des informations du cluster Zaku ; le contenu de la réponse est null. Veuillez vérifier vos paramètres de demande et la connectivité réseau.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10000": "Impossible de trouver le quota pour le groupe de sécurité pour le projet %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10004": "Échec de l'extraction de l'ID d'action à partir de la réponse de l'API", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10003": "Échec de la récupération du cluster Zaku [id:%s], contenu de la réponse null", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10006": "Échec de l'analyse de la réponse cloud: %s", + "ORG_ZSTACK_SNS_10015": "platformUuid et endpointUuid ne peuvent pas être spécifiés simultanément. Veuillez vérifier vos paramètres d'entrée.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10001": "Le quota du groupe de sécurité ne peut pas être inférieur à 1. Veuillez ajuster le paramètre à une valeur d'au moins 1.", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10005": "L'opération asynchrone a expiré après %d secondes", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10004": "Le l3Uuid dans l'étiquette est incohérent avec le l3Uuid dans le paramètre", + "ORG_ZSTACK_SNS_10013": "Le mot de passe ne peut pas être null", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10003": "Étiquette système demandée. Besoin de spécifier le groupe de sécurité par défaut pour le VM NIC en définissant l'étiquette système L3_NETWORK_SECURITY_GROUP_UUIDS_REF avec le format l3::{%s}::SecurityGroupUuids::{%s}, car le groupe de sécurité forcé est activé", + "ORG_ZSTACK_SNS_10012": "Le nom d'utilisateur ne peut pas être null", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10006": "Comme le groupe de sécurité forcé est activé, le securityGroupUuid dans l'étiquette doit être dans le projet[%s].", + "ORG_ZSTACK_SNS_10011": "smtpPort ne peut pas être null", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10005": "Le propriétaire [UUID: %s] du groupe de sécurité [UUID: %s] appartient à un autre projet IAM2.", + "ORG_ZSTACK_SNS_10010": "smtpServer ne peut pas être null", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10008": "Le groupe de sécurité par défaut %s ne peut pas être supprimé lorsque la fonctionnalité de groupe de sécurité forcé est activée.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10007": "Les interfaces réseau connectées au l3Network [uuid:%s] sont associées au groupe de sécurité. Avant de détacher le l3Network du groupe de sécurité, vous devez détacher les interfaces réseau.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10039": "Une licence commerciale est requise pour utiliser le service ImageStore dans notre environnement cloud.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10009": "Ce groupe de sécurité %s est associé à une machine virtuelle, veuillez le dissocier avant de continuer.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10035": "le magasin d'images [%s] ne peut pas ajouter une image car il est utilisé pour la sauvegarde à distance", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10032": "le stockage de sauvegarde[UUID:%s] n'a pas assez de capacité[%s] pour exporter l'image de la machine virtuelle", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10002": "le routeur virtuel[name: %s, uuid: %s] n'a pas pu synchroniser snat%s en raison de %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10031": "image[%s] non trouvée sur le stockage de sauvegarde[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10001": "le réseau l3 invité[uuid:%s, name:%s] nécessite le service SNAT du routeur virtuel, mais le réseau l3 public[uuid:%s] associé à l'offre de routeur virtuel[uuid: %s, name:%s] est identique au réseau l3 invité.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10020": "notifySugonSdn: échec de la notification Sugon SDN du vrouter pour la VM [uuid:%s] sur l'hôte de destination[uuid:%s], l'erreur est:%s", + "ORG_ZSTACK_SNS_10029": "l'identifiant de ressource cloud [%s] existe déjà", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10011": "le compte[%s] n'est pas autorisé à effectuer des opérations sur le groupe de sécurité par défaut", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10010": "le compte[%s] ne peut pas effectuer d'opérations sur le groupe de sécurité par défaut[%s]", + "ORG_ZSTACK_SNS_10026": "impossible de mettre à jour l'adresse e-mail vers %s car elle existe déjà dans le point de terminaison [UUID:%s]", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10012": "l'interface réseau de la VM [UUID: %s] ne peut faire partie que d'un seul groupe de sécurité; par conséquent, elle ne peut pas être supprimée du groupe de sécurité actuel [UUID: %s].", + "ORG_ZSTACK_SNS_10024": "impossible d'ajouter la même adresse e-mail au point de terminaison[uuid:%s]", + "ORG_ZSTACK_SNS_10023": "impossible de trouver le plugin[%s]", + "ORG_ZSTACK_SNS_10022": "impossible de créer une plateforme SNMP avec la même adresse[%s:%s]", + "ORG_ZSTACK_SNS_10021": "Établissement de la connexion impossible en raison de paramètres null. Veuillez vous assurer que tous les paramètres requis sont correctement configurés.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10029": "type de cible distante non implémenté: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10028": "échec du conditionnement des images exportées car %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10027": "certaines images [%s] n'ont pas été exportées vers le stockage de sauvegarde [uuid: %s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10026": "échec de la suppression du package d'images car: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10022": "échec de la définition de la capacité maximale sur le magasin d'images[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10021": "échec de la définition de la capacité maximale sur le magasin d'images[uuid:%s], car: %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10019": "notifySugonSdn: échec de la notification Sugon SDN du vrouter pour la VM [uuid:%s] sur l'hôte de destination [uuid:%s]", + "ORG_ZSTACK_SNS_10038": "Impossible de créer un point de terminaison e-mail SNS sans spécifier d'adresses e-mail de destinataires.", + "ORG_ZSTACK_SNS_10037": "le nom d'utilisateur et le mot de passe doivent être soit tous deux absents, soit fournis ensemble", + "ORG_ZSTACK_SNS_10036": "numéro de téléphone[%s] invalide, veuillez vous assurer qu'il est formaté comme +86-12388889999", + "ORG_ZSTACK_SNS_10035": "[%s] n'est pas une adresse IP valide", + "ORG_ZSTACK_SNS_10034": "chemin de stockage cloud[%s] invalide", + "ORG_ZSTACK_SNS_10031": "le numéro de téléphone [%s] n'existe pas", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10018": "Aucune réponse de l'instance cloud ou de la machine virtuelle. Veuillez vérifier l'état de l'instance et la configuration réseau.", + "ORG_ZSTACK_SNS_10030": "La liste des numéros de téléphone de la machine virtuelle est vide. Veuillez vérifier et vous assurer que les numéros de téléphone nécessaires sont configurés.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10016": "échec de la récupération de l'image à partir du stockage de sauvegarde avec UUID: %s, raison: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10015": "Fichier de certificat manquant pour le téléchargement de l'image: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10013": "impossible de se connecter à SimpleHttpBackupStorage[url:%s], en raison de %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10010": "Échec de la réception de la réponse de la tâche! Veuillez vérifier la configuration de votre instance et les paramètres réseau.", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_10000": "la création repose sur le cache d'image[uuid:%s, URLs d'emplacement: [%s]], ne peut pas créer à partir d'autres emplacements.", + "ORG_ZSTACK_SNS_10045": "L'opération n'est pas autorisée pour la plateforme de machine virtuelle au niveau du système. Veuillez vous assurer que vous modifiez des ressources de l'espace utilisateur.", + "ORG_ZSTACK_SNS_10044": "Impossible de valider les SMS universels sans spécifier un numéro de téléphone.", + "ORG_ZSTACK_SNS_10043": "userId [%s] existe déjà dans l'environnement cloud", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10008": "échec du nettoyage des métadonnées de l'image sur le stockage principal %s, erreur: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10007": "Échec de la synchronisation en raison d'un fichier source manquant. Veuillez vous assurer que tous les fichiers requis sont présents et réessayez la synchronisation.", + "ORG_ZSTACK_SNS_10041": "le numéro de téléphone cloud[%s] existe déjà", + "ORG_ZSTACK_SNS_10040": "adresse e-mail invalide[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10005": "impossible de trouver un hôte connecté dans le cluster auquel le stockage principal [uuid: %s] est attaché", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10004": "impossible de valider le stockage de sauvegarde spécifié par les UUIDs: %s en raison d'une erreur: %s", + "ORG_ZSTACK_MONITORING_10004": "impossible de trouver le type pour la ressource[uuid:%s]", + "ORG_ZSTACK_MONITORING_10005": "aucune métrique de monitoring trouvée pour le resourceType[%s] et l'item[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10002": "impossible d'allouer le stockage de sauvegarde spécifié par les UUIDs: %s en raison de contraintes de ressources ou d'UUIDs invalides: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10000": "erreur d'analyse de l'heure de création: %s", + "ORG_ZSTACK_MONITORING_10000": "impossible de trouver le déclencheur de monitoring[uuid:%s], il a peut-être été supprimé ou désactivé", + "ORG_ZSTACK_MONITORING_10001": "impossible de trouver l'action du déclencheur de monitoring[uuid:%s], elle a peut-être été supprimée ou révoquée", + "ORG_ZSTACK_MONITORING_10002": "la ressource[type:%s] n'a aucune métrique de monitoring", + "ORG_ZSTACK_MONITORING_10003": "La ressource avec UUID [%s] n'appartient pas au compte avec UUID [%s].", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10002": "l'instance[%s] n'est associée à aucun groupe", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10001": "L'instance[%s] est déjà attribuée au groupe", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10003": "Le groupe de monitoring [%s] n'est pas associé à un modèle de monitoring.", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10006": "La limite d'instances pour le groupe a été atteinte. Veuillez supprimer une instance existante ou contacter le support pour augmenter la limite.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10001": "Le corps de sortie ne prend pas en charge les valeurs JSON null! Veuillez vous assurer que tous les champs sont correctement définis et non nuls.", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10005": "La règle du modèle a atteint sa limite maximale de %d entrées. Envisagez de mettre à l'échelle votre modèle ou contactez le support pour obtenir de l'aide.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10000": "seuls les services cloud-natifs peuvent être autorisés dans les Outputs, mais %s a été trouvé", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10016": "Le type de ressource doit être une chaîne !", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10014": "Le corps racine des mappings doit être un objet JSON !", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10018": "Les métadonnées racine de la ressource doivent être un objet JSON !", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10023": "Le corps des paramètres ne peut pas accepter de valeurs nulles !", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10022": "Nom de paramètre non pris en charge : %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10020": "paramName doit être trouvé dans les résultats du modèle JSON CloudFormation ou est considéré comme invalide.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10001": "L'entité est vide, impossible de déterminer TableName", + "ORG_ZSTACK_FAULTTOLERANCE_10004": "Échec de l'allocation d'un port sur l'hôte[uuid: %s]", + "ORG_ZSTACK_ZQL_AST_VISITORS_10000": "La condition de jointure est manquante pour la table %s dans votre requête. Veuillez vous assurer d'avoir correctement spécifié la condition de jointure.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10003": "La liste des champs est vide ; par conséquent, nous ne pouvons pas récupérer le nom de la colonne. Veuillez vous assurer que votre liste de champs contient les données nécessaires.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10002": "L'entité est vide, impossible de récupérer columnName", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10005": "Le corps de mapping ne prend pas en charge les valeurs non-mappe !", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10004": "[%s] est invalide dans les sorties CloudFormation !", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10003": "La description dans les sorties doit être de type chaîne !", + "ORG_ZSTACK_FAULTTOLERANCE_10009": "Impossible de migrer la VM secondaire ft[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10008": "Impossible de démarrer la machine virtuelle secondaire car la machine virtuelle principale est toujours à l'état arrêté. Veuillez vous assurer que la VM principale est en cours d'exécution avant de tenter de démarrer la VM secondaire.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10009": "Le corps de valeur de ressource ne peut pas accepter de valeurs nulles ! Veuillez vous assurer que tous les paramètres de ressource sont correctement initialisés avant le déploiement.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10004": "La fonction spécifiée ne peut pas être nulle. Veuillez vous assurer que la fonction est correctement initialisée avant utilisation.", + "ORG_ZSTACK_FAULTTOLERANCE_10007": "impossible de récupérer l'UUID de l'hôte de la VM primaire [uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10008": "La ressource %s ne peut pas dépendre d'elle-même, veuillez vérifier l'auto-référence dans la ressource [%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10005": "Le nombre de ports alloués est inférieur à celui demandé sur l'hôte[uuid: %s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10006": "Le corps de mapping ne prend pas en charge les valeurs nulles ! Veuillez vous assurer que tous les champs JSON sont correctement définis et non nuls.", + "ORG_ZSTACK_SNS_10009": "l'uuid [%%s] existe déjà dans l'environnement cloud.", + "ORG_ZSTACK_SNS_10007": "impossible de trouver le point de terminaison SNS Application avec l'UUID : %s, il peut avoir été supprimé", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10012": "Clé non prise en charge [%s] dans le mapping de ressource [%s]", + "ORG_ZSTACK_SNS_10006": "impossible de trouver SNSApplicationPlatform[uuid:%s], il peut avoir été terminé", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10011": "resourceName doit être trouvé dans la sortie du modèle ou c'est un JSON CloudFormation invalide.", + "ORG_ZSTACK_SNS_10005": "Le type de point de terminaison %s spécifié est introuvable. Veuillez fournir un type de point de terminaison valide.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10010": "Clés de ressource non prises en charge : %s", + "ORG_ZSTACK_SNS_10003": "impossible de trouver le sujet SNS avec l'UUID:%s, il peut avoir été supprimé", + "ORG_ZSTACK_SNS_10002": "Le point de terminaison de l'application est désactivé. Veuillez vérifier vos paramètres de configuration ou contacter le support pour obtenir de l'aide.", + "ORG_ZSTACK_SNS_10001": "", + "ORG_ZSTACK_SNS_10000": "La plateforme d'application est désactivée. Veuillez contacter votre administrateur pour l'activer ou consulter la documentation pour connaître les alternatives disponibles.", + "ORG_ZSTACK_CLOUDFORMATION_10002": "", + "ORG_ZSTACK_CLOUDFORMATION_10001": "Le topic %s n'est consommé par aucun point de terminaison abonné.", + "ORG_ZSTACK_CLOUDFORMATION_10000": "", + "ORG_ZSTACK_CLOUDFORMATION_10009": "Version du format de modèle ZStack invalide : [%s, version attendue : %s]", + "ORG_ZSTACK_CLOUDFORMATION_10008": "", + "ORG_ZSTACK_CLOUDFORMATION_10007": "Le modèle doit contenir le marqueur ZStackTemplateFormatVersion.", + "ORG_ZSTACK_CLOUDFORMATION_10005": "", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10035": "Récupération d'un élément nul dans le contenu du modèle. Le contenu du modèle peut faire référence à une ressource cloud ou une configuration de machine virtuelle. Veuillez vous assurer que tous les éléments sont correctement définis et initialisés.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10034": "", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10037": "Le modèle [%s] est désactivé dans l'environnement de virtualisation.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10036": "", + "ORG_ZSTACK_CLOUDFORMATION_10025": "ResourceStackVO [%s] a déjà été supprimé !", + "ORG_ZSTACK_EXPON_10002": "", + "ORG_ZSTACK_EXPON_10003": "ResourceStackVO : [%s] a été terminé...", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10000": "", + "ORG_ZSTACK_CLOUDFORMATION_10022": "aucun UUID de pile trouvé pour l'instance de VM [%s]", + "ORG_ZSTACK_CLOUDFORMATION_10021": "", + "ORG_ZSTACK_CLOUDFORMATION_10020": "Échec de la réservation de capacité hôte pour tous les hôtes candidats. Veuillez vérifier la disponibilité des hôtes cibles et vous assurer qu'ils disposent de ressources suffisantes pour répondre aux exigences de réservation.", + "ORG_ZSTACK_CLOUDFORMATION_10028": "", + "ORG_ZSTACK_CLOUDFORMATION_10026": "[Allocation d'hôte] : %s sur l'hôte [uuid:%s]. Tentative d'allocation vers l'hôte suivant. %s", + "ORG_ZSTACK_HYBRID_ACCOUNT_10000": "", + "ORG_ZSTACK_HYBRID_ACCOUNT_10002": "après filtrage, HostAllocatorFilterExtensionPoint[%s] retourne zéro hôtes candidats, ce qui indique : %s", + "ORG_ZSTACK_HYBRID_ACCOUNT_10003": "", + "ORG_ZSTACK_HYBRID_ACCOUNT_10004": "Aucun hôte correspondant aux critères spécifiés n'a été trouvé", + "ORG_ZSTACK_CLOUDFORMATION_10014": "", + "ORG_ZSTACK_CLOUDFORMATION_10013": "statut %s attendu !", + "ORG_ZSTACK_CLOUDFORMATION_10012": "", + "ORG_ZSTACK_CLOUDFORMATION_10011": "impossible de trouver les paramètres pour %s, qui est de type %s, veuillez vérifier les paramètres", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10002": "impossible d'attacher le pool VXLAN matériel en raison de : %s", + "ORG_ZSTACK_CLOUDFORMATION_10010": "templateContent doit être spécifié !", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10003": "impossible de créer un réseau VXLAN matériel L2 sans identifiant VLAN spécifié", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10000": "impossible d'attacher un réseau de niveau 2 au cluster car l'hôte[uuid:%s] n'a pas d'interface virtuelle[name:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10001": "impossible d'attacher le pool VXLAN matériel car impossible de trouver le port du commutateur pour l'hôte[uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_10019": "impossible de trouver le nom du pont l2 de l2[%s] à partir de systemTag", + "ORG_ZSTACK_CLOUDFORMATION_10018": "Le paramètre filterName doit être défini sur cloudformation:true ou cloudformation:false.", + "ORG_ZSTACK_CLOUDFORMATION_10017": "StackTemplateVO: [%s] a été supprimé du dépôt cloud...", + "ORG_ZSTACK_CLOUDFORMATION_10016": "version de modèle CloudFormation invalide : %s", + "ORG_ZSTACK_CLOUDFORMATION_10015": "Échec de la récupération de l'entrée de contenu pour la ressource cloud. Veuillez vous assurer que les fichiers sources sont correctement téléversés et configurés.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10006": "impossible de créer un réseau VXLAN Huawei iMaster SDN sans identifiant VPC", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10007": "impossible d'ajouter une plage vni car la plage vni spécifiée [%d-%d] est invalide", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10004": "impossible de créer un réseau VXLAN Huawei iMaster SDN car l'identifiant VLAN [%s] est hors de la plage valide : %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10005": "impossible de créer un réseau VXLAN Huawei iMaster SDN sans vpcId et tenantId", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10009": "impossible d'ajouter le contrôleur Huawei iMaster SDN au réseau sans spécifier une plage VLAN", + "ORG_ZSTACK_NETWORK_L2_10013": "impossible de modifier le VLAN pour le réseau L2 [UUID:%s] car il y a encore des hôtes en état de connexion ou de déconnexion", + "ORG_ZSTACK_NETWORK_L2_10012": "type de commutateur virtuel non supporté[%s]", + "ORG_ZSTACK_NETWORK_L2_10015": "impossible de modifier le VLAN pour l2Network[uuid:%s] car ce réseau est isolé", + "ORG_ZSTACK_NETWORK_L2_10014": "impossible de modifier le VLAN pour l2Network[uuid:%s] car il est exclusivement restreint à un cluster KVM", + "ORG_ZSTACK_NETWORK_L2_10017": "vlan[%s] est invalide pour la configuration du réseau cloud", + "ORG_ZSTACK_NETWORK_L2_10016": "vlan est requis pour ChangeL2NetworkVlanId avec type[%s]", + "ORG_ZSTACK_NETWORK_L2_10019": "vLAN n'est pas autorisé pour ChangeL2NetworkVlanId avec type[%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10000": "aucun hôte candidat n'a la version[%s] disponible pour le déploiement", + "ORG_ZSTACK_NETWORK_L2_10018": "Un réseau L2 a été attaché au cluster avec l'identifiant de réseau virtuel [%s] et l'interface physique [%s]. Échec du changement du réseau L2 [uuid: %s].", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10083": "SimpleHttpBackupStorage existant avec hostname[%s] détecté", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10082": "URL invalide[%s], l'URL doit être un chemin absolu commençant par '/'", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10080": "le chemin du fichier contient un caractère invalide : %s", + "ORG_ZSTACK_NETWORK_L2_10020": "Échec de la modification de l2Network [uuid:%s] attaché au cluster avec l'interface physique [%s].", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10079": "L'URL contient un chemin invalide [/dev or /proc or /sys], qui n'est pas supporté dans les environnements de cloud computing. Veuillez utiliser un chemin valide pour votre requête.", + "ORG_ZSTACK_CLOUDFORMATION_10034": "templateContent et uuid ne doivent pas être tous deux vides ou tous deux définis !", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10078": "chemin absolu vers le fichier source requis : %s", + "ORG_ZSTACK_NETWORK_L2_10006": "Il y a un réseau L2 avec UUID : %s et nom : %s attaché au cluster avec UUID : %s qui est associé à une interface physique [%s]. Échec de l'attachement du réseau L2 avec UUID : %s.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10077": "Un chemin de fichier source est requis pour procéder à la revue ou l'édition du code. Veuillez fournir le chemin du fichier.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10076": "stockage de sauvegarde en double. Il y a un stockage de sauvegarde d'image [hostname:%s]", + "ORG_ZSTACK_NETWORK_L2_10008": "l2Network [UUID : %s] est associé au cluster [UUID : %s] et ne peut pas être réaffecté.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10075": "hostname[%s] n'est pas un nom DNS ou une adresse IP valide", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10011": "DiskOfferingTagAllocatorExtensionPoint[%s] a retourné zéro hôtes candidats", + "ORG_ZSTACK_CLOUDFORMATION_10030": "seuls les administrateurs ont le privilège d'activer ou de désactiver le système StackTemplate", + "ORG_ZSTACK_NETWORK_L2_10007": "Il y a un réseau L2 Vlan [uuid:%s, name:%s] attaché au cluster [uuid:%s] qui a une interface physique [%s] et VLAN [%s]. Échec de l'attachement du réseau L2 Vlan [uuid:%s].", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10010": "InstanceOfferingTagAllocatorExtensionPoint[%s] a retourné zéro hôtes candidats", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10073": "le stockage de sauvegarde source ne contient pas l'image[%s]", + "ORG_ZSTACK_NETWORK_L2_10009": "impossible d'attacher le réseau L2 car il existe un autre réseau avec un type de vSwitch différent sur l'interface physique %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10072": "le stockage source[%s] ne contient pas l'image[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10071": "le stockage de sauvegarde cible [uuid:%s] contient déjà l'image [uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10070": "échec de la suppression du fichier de métadonnées de l'image : %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10009": "le stockage de sauvegarde [UUID : %s, type : %s] nécessite un stockage principal lié, cependant aucun stockage principal n'a encore été ajouté.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10001": "L'image avec UUID [uuid:%s] et nom [name:%s] a été supprimée de tous les stockages de sauvegarde.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10004": "la liaison de ressource ne prend pas encore en charge le type %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10003": "Aucun hôte trouvé dans les zones[uuids:%s] qui est attaché au stockage de sauvegarde où l'image[%s] est située.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10005": "aucun hôte disponible trouvé avec la ressource liée %s", + "ORG_ZSTACK_NETWORK_L2_10011": "type de l2Network non pris en charge[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10003": "le routeur virtuel[uuid:%s, ip:%s] a échoué à configurer DNS%s pour le réseau L3[uuid:%s, name:%s], %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10008": "L'image[uuid:%s] est située sur un stockage de sauvegarde[uuid:%s, type:%s] qui nécessite une interaction avec le stockage principal[uuid:%s] ; cependant, aucun hôte approprié n'a été trouvé pour faciliter cette interaction.", + "ORG_ZSTACK_NETWORK_L2_10010": "l2Network[uuid:%s] n'a pas été attaché au cluster[uuid:%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10007": "L'image[uuid:%s, name:%s] est stockée sur un stockage de sauvegarde[uuid:%s, type:%s] qui nécessite un stockage principal de types %s ; cependant, aucun hôte avec un stockage principal compatible n'a été trouvé.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10068": "Vérification du fichier de métadonnées de l'image : %s échouée", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10066": "Création du fichier de métadonnées de l'image : %s échouée", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10065": "Échec de la synchronisation du fichier de métadonnées de l'image : %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10022": "impossible de trouver le volume racine de l'instance[uuid:%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10021": "aucun hôte ayant le CPU[%s], la mémoire[%s octets] disponible n'a été trouvé", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10000": "impossible d'attacher l'eip car il n'y a pas de passerelle pour l'interface réseau [uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10062": "AddImage est interdit dans Disaster Recovery BS: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10001": "Le L2Network sur lequel repose le L3Network du VIP n'a pas été attaché au cluster où réside le vmNic[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10002": "impossible de lier plus d'1 EIP à une VM NIC avec UUID:%s de type flat", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10060": "chemin de l'image manquant sur l'instance[%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10015": "impossible de trouver le stockage principal disponible [état: %s, statut: %s, capacité disponible %d octets]. Veuillez vérifier l'état et le statut du stockage principal et vous assurer qu'il est attaché à un cluster", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10014": "aucun hôte trouvé dans les clusters attachés au stockage principal %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10016": "impossible de trouver le stockage principal disponible [état: %s ou %s, statut: %s]. Veuillez vérifier l'état et le statut du stockage principal et vous assurer qu'il est attaché à un cluster", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10031": "aucun hôte activé trouvé dans les [%s] hôtes candidats ayant le type d'hyperviseur [%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10030": "aucun hôte activé trouvé dans la liste des [%s] hôtes candidats", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10033": "Aucun hôte avec state=Enabled et status=Connected trouvé", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10032": "aucun hôte avec state=Enabled status=Connected hypervisorType=%s trouvé", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10012": "objet %s non trouvé dans le bucket %s", + "ORG_ZSTACK_UTILS_10000": "échec de la génération du secret d'accès pour l'instance de machine virtuelle %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10024": "soit l'UUID du volume soit l'UUID de l'instantané du volume doit être spécifié", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10023": "Aucun hôte trouvé dans les clusters attachés à tous les stockages principaux %s où résident les volumes de la VM[UUID:%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10026": "Après exclusion des hôtes évités, aucun candidat ne reste dans le pool", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10025": "zoneUuids, clusterUuids et hostUuids doivent chacun contenir au moins une liste non vide, ou toutes les valeurs doivent être définies à true", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10015": "Aliyun EBS Backup Storage ne supporte pas le calcul des hashs d'images", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10027": "Aucun hôte trouvé dans les clusters attachés aux L2Networks qui ont des L3Networks%s associés", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10029": "aucun hôte connecté trouvé dans les [%s] hôtes candidats", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10005": "Sélectionnez une stratégie d'équilibrage de charge, vous devez définir le type d'algorithme", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10008": "Aucun hôte avec moins de %s machines virtuelles trouvé", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10022": "Le compte [UUID:%s] n'a pas accès à la ressource [UUID:%s, type:L3NetworkVO]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10024": "changer l'adresse IP du serveur dhcp vers [%s], mais [%s] reçu", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10025": "L'UUID du réseau L3 ne peut pas être nul", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10003": "Paramètres du fournisseur de cloud incorrects, valeur valide est %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10021": "L'UUID de session/compte est invalide. Veuillez vérifier et réessayer", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10000": "L'URL du point de terminaison Ocean doit être configurée pour le stockage de sauvegarde Alibaba Cloud EBS", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10017": "impossible d'appliquer l'opération EIP pour la VM[uuid:%s, state:%s], car l'hostUUID ne peut pas être trouvé", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10009": "Aliyun EBS Backup Storage ne prend pas en charge l'annulation du processus de téléchargement de l'image.", + "ORG_ZSTACK_CORE_TIMEOUT_10000": "le délai d'expiration de l'api ne peut pas être inférieur à %s millisecondes", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10002": "impossible de supprimer le bucket OSS [%s], car il contient encore des instances Aliyun EBS Backup Storage, veuillez d'abord vous assurer que toutes les instances de stockage de sauvegarde connexes sont supprimées.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10004": "le stockage principal actuel ne prend pas en charge le type de protocole spécifié ; veuillez d'abord vous assurer que le protocole est ajouté au stockage.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10003": "le paramètre [protocol] est nul. Pour le stockage principal de type [%s], le protocole de volume de bloc doit être spécifié.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10000": "Erreur de chemin de ressource cloud : Veuillez vérifier l'emplacement et l'existence du fichier.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10002": "le nom : [%s] existe déjà. Les noms de volumes de bloc doivent être uniques au sein du type de stockage principal [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10010": "impossible de récupérer l'adresse IP du serveur DHCPv6 pour le réseau de couche 3[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10009": "impossible de récupérer l'adresse IP du serveur DHCPv4 pour le réseau de couche 3[uuid:%s]", + "ORG_ZSTACK_POLICYROUTE_10029": "Impossible de supprimer la table de routes de stratégie système", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10005": "l'hôte[uuid:%s] n'est pas provisionné", + "ORG_ZSTACK_POLICYROUTE_10027": "Impossible de supprimer l'ensemble de routes de stratégie défini par le système. Veuillez vous assurer que cet ensemble de routes n'est pas utilisé par des ressources actives avant de tenter la suppression.", + "ORG_ZSTACK_POLICYROUTE_10028": "Impossible de trouver l'instance de routeur virtuel associée. Veuillez vous assurer que le routeur virtuel est correctement configuré et disponible.", + "ORG_ZSTACK_POLICYROUTE_10025": "ruleSet[%s] est encore associé à la carte d'interface réseau (NIC)", + "ORG_ZSTACK_POLICYROUTE_10020": "VRouter[%s] possède déjà une table de routes basée sur la stratégie [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10044": "Impossible de modifier l'adresse IP du serveur DHCP uniquement si le DHCP plat est activé.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10045": "impossible de modifier l'adresse IP du serveur DHCP car %s n'est pas propriétaire du réseau de couche 3[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10046": "Impossible de modifier l'adresse IP du serveur DHCPv4 car aucune plage d'adresses IPv4 n'est configurée.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10047": "impossible de définir l'adresse IP du serveur DHCP v4 car l'adresse IP [%s] n'est pas un CIDR valide pour le réseau de couche 3 [%s]", + "ORG_ZSTACK_IDENTITY_RBAC_10011": "l'opération[API:%s] est refusée par défaut pour des raisons de sécurité. Veuillez contacter votre administrateur pour résoudre ce problème.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10041": "Impossible de définir l'adresse IP du serveur DHCPv6 car aucune plage IPv6 n'est configurée.", + "ORG_ZSTACK_IDENTITY_RBAC_10012": "l'opération est refusée par la stratégie [nom : %s uuid : %s]", + "ORG_ZSTACK_IDENTITY_RBAC_10013": "l'opération est refusée par la stratégie[nom:%s, uuid:%s], le champ[%s] n'est pas autorisé à être modifié", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10037": "impossible de supprimer l'adresse IP, car l'adresse IP [%s] est une adresse IP du serveur DHCP", + "ORG_ZSTACK_POLICYROUTE_10018": "Impossible de mettre à jour l'ensemble de routes de stratégie système. Veuillez vous assurer que vous disposez des autorisations nécessaires et réessayer.", + "ORG_ZSTACK_POLICYROUTE_10019": "Impossible de mettre à jour la table de routes basée sur la stratégie du système. Veuillez vous assurer que vous disposez des autorisations nécessaires et réessayer.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10039": "Impossible de définir l'adresse IP du serveur DHCPv4 car aucune plage d'adresses IPv4 n'est configurée.", + "ORG_ZSTACK_POLICYROUTE_10017": "Impossible de trouver le routeur virtuel associé", + "ORG_ZSTACK_POLICYROUTE_10014": "type de protocole %s illégal", + "ORG_ZSTACK_POLICYROUTE_10015": "RuleSet[%s] contient déjà une règle avec le numéro %s.", + "ORG_ZSTACK_POLICYROUTE_10013": "échec de l'opération, le format IP ne prend en charge que IPv4/plage IP/CIDR, mais %s a été trouvé", + "ORG_ZSTACK_POLICYROUTE_10010": "NextHopIp doit être au format IPv4 mais [%s] a été trouvé", + "ORG_ZSTACK_CORE_REST_10012": "impossible de récupérer %s dans les %sms", + "ORG_ZSTACK_QUERY_10021": "field[%s] n'est pas un primitive de l'inventory %s ; vous ne pouvez pas le spécifier dans le paramètre 'fields' ; les champs valides sont %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10034": "L'adresse IP du serveur DHCP [%s] existe déjà dans le réseau L3 [%s]", + "ORG_ZSTACK_QUERY_10020": "la classe de métadonnées d'entité [%s] ne possède pas le champ [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10035": "L'adresse IP du serveur DHCP [%s] ne doit pas être égale à l'adresse IP de la passerelle", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10036": "L'adresse IP du serveur DHCP [%s] ne peut pas être configurée dans les paramètres du réseau L3 système", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10030": "L'adresse IP du serveur DHCP [%s] n'est pas une adresse IPv4 valide", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10031": "L'adresse IP du serveur DHCP [%s] n'est pas dans le CIDR spécifié [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10032": "L'adresse IP du serveur DHCP [%s] n'est pas une adresse IPv6 valide", + "ORG_ZSTACK_IDENTITY_RBAC_10004": "Vous n'êtes pas autorisé à mettre à jour un rôle système ou prédéfini. Veuillez contacter votre administrateur pour obtenir de l'aide.", + "ORG_ZSTACK_POLICYROUTE_10009": "DestinationCidr doit être au format CIDR mais [%s] a été trouvé", + "ORG_ZSTACK_IDENTITY_RBAC_10007": "permission refusée, le compte [uuid:%s] n'est pas autorisé à accéder à la ressource [uuid:%s, type:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10027": "impossible de configurer DHCP pour la machine virtuelle [uuid:%s] sur l'hôte de destination [uuid:%s]", + "ORG_ZSTACK_IDENTITY_RBAC_10008": "permission refusée, le compte [uuid:%s] n'est pas autorisé à gérer la ressource taguée [uuid:%s, type:%s]", + "ORG_ZSTACK_POLICYROUTE_10008": "VRouter[%s] possède déjà un ensemble de règles nommé %s", + "ORG_ZSTACK_IDENTITY_RBAC_10005": "Vous n'êtes pas autorisé à supprimer un rôle système ou prédéfini. Veuillez contacter votre administrateur pour obtenir de l'aide.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10029": "la longueur de préfixe minimale de la plage IP pour le réseau plat est %d", + "ORG_ZSTACK_POLICYROUTE_10003": "l3[%s] possède déjà un ensemble de règles de route de stratégie attaché", + "ORG_ZSTACK_IDENTITY_RBAC_10009": "Le compte [UUID:%s] n'a pas accès aux ressources [UUID:%s, Type:%s]", + "ORG_ZSTACK_POLICYROUTE_10000": "Le réseau de route par défaut ne peut pas être modifié lorsque les routes de stratégie système sont activées.", + "ORG_ZSTACK_QUERY_10018": "le nom de condition[%s] est invalide, aucun champ trouvé dans la classe inventory[%s]", + "ORG_ZSTACK_QUERY_10017": "\"value\" de la condition de requête %s ne peut pas être nulle pour le filtrage des ressources cloud", + "ORG_ZSTACK_QUERY_10015": "filterName doit être formaté comme [filterType:condition(s)]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_10000": "échec de la création de la chaîne de signature de l'API ocean : %s", + "ORG_ZSTACK_QUERY_10019": "le nom de condition[%s] est invalide : field[%s] de inventory[%s] est annoté comme @UnqueryableField", + "ORG_ZSTACK_ALIYUN_PANGU_10001": "appName : %s, partitionName : %s existe déjà dans identityZone : %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10050": "impossible de définir l'adresse IP du serveur DHCP, car l'IP[%s] est allouée", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10051": "Impossible de définir l'adresse IP du serveur DHCPv6 car IP[%s] est utilisée", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10053": "Échec de l'allocation d'adresse IP du serveur DHCP.%s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10048": "Impossible de modifier l'adresse IP du serveur DHCPv6 car aucune plage IPv6 n'est configurée.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10049": "Impossible de définir l'adresse IP du serveur DHCPv6 car IP[%s] n'est pas un CIDR valide pour le réseau L3 [%s]", + "ORG_ZSTACK_USBDEVICE_10026": "Veuillez démonter tous les périphériques USB de la VM[%s] et réessayer", + "ORG_ZSTACK_USBDEVICE_10025": "Impossible de détacher le périphérique USB[uuid:%s] lorsqu'il est attaché à une instance de VM", + "ORG_ZSTACK_USBDEVICE_10024": "L'instance de VM [uuid:%s] n'est pas dans un état attachable pour le périphérique USB %s", + "ORG_ZSTACK_USBDEVICE_10023": "L'instance de VM à laquelle le périphérique USB [uuid:%s] est attaché n'est pas dans un état détachable : %s", + "ORG_ZSTACK_USBDEVICE_10022": "Le périphérique USB [UUID:%s] n'est attaché à aucune instance de machine virtuelle.", + "ORG_ZSTACK_USBDEVICE_10021": "L'hôte sur lequel le périphérique USB [uuid:%s] est branché n'est pas dans un état valide [%s] ou un statut [%s].", + "ORG_ZSTACK_USBDEVICE_10020": "L'instance de VM[UUID:%s] n'est pas dans un état attachable pour le périphérique USB : %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10005": "Le réseau L3 [uuid:%s] n'existe pas", + "ORG_ZSTACK_COMPUTE_SRIOV_10006": "%s, car aucun périphérique SRIOV n'est disponible sur le réseau l3 [uuid:%s] de l'hôte [uuid:%s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10007": "Impossible de modifier l'état HA du VF NIC car le VF NIC [UUID:%s] n'existe pas", + "ORG_ZSTACK_COMPUTE_SRIOV_10008": "Impossible de modifier l'état haute disponibilité de la carte d'interface réseau virtuelle car l'état haute disponibilité[%s] est invalide", + "ORG_ZSTACK_COMPUTE_SRIOV_10009": "Réseau L2 [UUID:%s] non trouvé", + "ORG_ZSTACK_COMPUTE_SRIOV_10000": "Échec de la définition du MAC du VF NIC sur l'hôte[uuid:%s, ip:%s], car %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10001": "Échec de la modification de l'état HA de la carte d'interface réseau virtuelle, erreur : %s", + "ORG_ZSTACK_DRS_10000": "Le cluster[%s] a initiée le Service de Réplication de Données", + "ORG_ZSTACK_DRS_10002": "Les valeurs de seuil ne peuvent pas être vides. Veuillez vous assurer que les paramètres de seuil sont correctement configurés.", + "ORG_ZSTACK_DRS_10001": "DRS est désactivé pour cette machine virtuelle. Veuillez vous assurer que DRS est activé pour optimiser l'allocation des ressources.", + "ORG_ZSTACK_DRS_10004": "Opérateur de seuil[%s] invalide", + "ORG_ZSTACK_DRS_10003": "Nom de seuil[%s] invalide", + "ORG_ZSTACK_DRS_10006": "Valeur de seuil invalide, plage valide : (0, 100]", + "ORG_ZSTACK_DRS_10005": "La valeur de seuil pour la surveillance des ressources cloud ne peut pas être vide.%s", + "ORG_ZSTACK_DRS_10008": "Le statut du DRG[%s] est %s", + "ORG_ZSTACK_DRS_10007": "GlobalConfig ENABLE_DRS est désactivé", + "ORG_ZSTACK_DRS_10009": "Le niveau d'automatisation du DRS[%s] n'est pas défini en mode manuel", + "ORG_ZSTACK_ZWATCH_FUNCTION_10012": "La valeur[%s] n'est pas un nombre entier valide", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10018": "Impossible d'exécuter l'opération API. Le réseau backend [UUID:%s] est connecté au routeur VPC [UUID:%s], qui n'est pas connecté au réseau frontal [UUID:%s].", + "ORG_ZSTACK_ZWATCH_FUNCTION_10011": "argument invalide[limite:%s], il ne peut pas s'agir d'une valeur négative", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10019": "Le réseau backend [UUID:%s] doit être un réseau VPC car un autre réseau backend est configuré comme réseau VPC.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10010": "argument inconnu[%s]", + "ORG_ZSTACK_DRS_10020": "La suppression d'un aDRS n'est pas autorisée pendant la migration de la VM.", + "ORG_ZSTACK_DRS_10011": "Exécution réussie ; le déploiement répété n'est pas autorisé", + "ORG_ZSTACK_DRS_10010": "le conseil[%s] a expiré en raison de l'inactivité", + "ORG_ZSTACK_DRS_10013": "La VM[%s] n'est pas en état de fonctionnement", + "ORG_ZSTACK_DRS_10012": "La VM[%s] a été terminée", + "ORG_ZSTACK_DRS_10015": "Le cluster[%s] ne prend pas en charge la mise à l'échelle dynamique des ressources.", + "ORG_ZSTACK_DRS_10014": "La VM[%s] n'est plus sur l'hôte source[%s].", + "ORG_ZSTACK_DRS_10017": "La liste des UUID d'hôtes est vide. Veuillez vous assurer qu'au moins un UUID d'hôte est fourni.", + "ORG_ZSTACK_DRS_10016": "Impossible de créer l'instance DRDS, %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10013": "le réseau backend [uuid:%s] doit être un réseau VPC car le réseau Layer 3 frontal est un réseau VPC", + "ORG_ZSTACK_ZWATCH_FUNCTION_10005": "argument invalide[début:%s], il ne peut pas s'agir d'un nombre négatif dans un environnement d'informatique en nuage", + "ORG_ZSTACK_DRS_10019": "Conseil non autorisé pendant la planification des tâches", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10014": "impossible d'exécuter l'opération API. Le réseau backend [UUID:%s] n'est pas connecté au routeur VPC. Veuillez vous assurer que le réseau est correctement connecté avant de réessayer.", + "ORG_ZSTACK_DRS_10018": "Échec de la requête des données d'utilisation de l'hôte", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10015": "Le réseau backend est associé au routeur VPC [uuid:%s] tandis que le réseau frontal est associé à un routeur VPC différent [uuid:%s]. Veuillez vous assurer que les deux réseaux sont associés au même routeur VPC.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10016": "impossible d'exécuter l'opération API. Le réseau backend [uuid:%s] doit être un réseau plat privé car le réseau L3 frontal est un réseau plat privé.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10002": "fonction inconnue[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10010": "le CIDR du réseau backend chevauche le CIDR du réseau L3 frontal", + "ORG_ZSTACK_ZWATCH_FUNCTION_10008": "valeur invalide[%s] pour l'argument[%s] dans la configuration de l'environnement d'informatique en nuage", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10011": "Le CIDR du réseau backend [%s] chevauche le CIDR du réseau L3 de gestion [%s]. Veuillez vous assurer qu'il n'y a pas de chevauchement entre les CIDR de réseau pour éviter les conflits de configuration. Les réseaux backend UUID [%s] et L3 de gestion UUID [%s] sont affectés.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10012": "impossible d'exécuter l'opération API. Le réseau frontal [UUID:%s] n'est pas connecté au routeur VPC", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10001": "impossible de trouver le groupe OSD associé au pool CEPH [%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10000": "le pool Ceph requis[uuid:%s] ne peut pas satisfaire la condition [availableSize > %d octets], la taille disponible actuelle %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10006": "impossible de créer l'instance SLB car l'image [uuid:%s] a été supprimée", + "ORG_ZSTACK_ZWATCH_FUNCTION_10001": "argument en double[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10007": "Échec de la création de l'instance SLB en raison de la limite maximale d'instances atteinte.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10000": "argument requis[%s] manquant pour la configuration de l'instance cloud", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10008": "n'a pas pu créer le groupe SLB car le type de réseau L3 frontal %s est invalide", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10009": "le CIDR du réseau frontal [%s] chevauche le CIDR du réseau L3 de gestion [%s]", + "ORG_ZSTACK_DRS_10022": "L'ordonnancement n'est pas autorisé pendant la migration de la machine virtuelle.", + "ORG_ZSTACK_DRS_10023": "Données d'utilisation du CPU et de la mémoire de l'hôte manquantes", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10002": "le cloud ne peut pas supprimer le VIP[%s]. Veuillez d'abord supprimer le SLB[uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10003": "n'a pas pu créer l'instance SLB car il n'y a pas de groupe SLB d'équilibrage de charge [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10004": "n'a pas pu créer l'instance SLB car aucune offre SLB n'est configurée pour le groupe SLB [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10005": "n'a pas pu créer l'instance SLB car l'UUID de l'offre SLB [uuid:%s] est null", + "ORG_ZSTACK_CORE_ENCRYPT_10000": "Erreur de chiffrement : %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10000": "impossible de trouver l'interface réseau de l'instance SLB [uuid:%s] attachée au réseau L3 frontal du groupe SLB [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10001": "n'a pas pu supprimer la plage d'adresses IP [%s], veuillez d'abord supprimer l'équilibreur de charge [uuid:%s]", + "ORG_ZSTACK_IDENTITY_10011": "L'ancien mot de passe ne correspond pas au mot de passe original. Impossible de mettre à jour le mot de passe de l'utilisateur[%s].", + "ORG_ZSTACK_IDENTITY_10010": "L'utilisateur avec l'UUID [%s] n'est pas associé au compte ayant l'UUID [%s].", + "ORG_ZSTACK_IDENTITY_10016": "Le quota[name:%s] pour le compte[uuid:%s] ne peut pas être défini à %d", + "ORG_ZSTACK_IDENTITY_10017": "Le compte [UUID:%s] utilisant [Name:%s, Valeur d'utilisation:%s] dépasse le quota demandé : %d", + "ORG_ZSTACK_IDENTITY_10001": "Informations d'identification d'authentification incorrectes. Veuillez vérifier votre mot de passe et réessayer.", + "ORG_ZSTACK_IDENTITY_10009": "le compte [UUID: %s] n'a pas accès à la ressource [UUID: %s]", + "ORG_ZSTACK_IDENTITY_10008": "Le groupe d'utilisateurs avec l'UUID [%s] n'appartient pas au compte avec l'UUID [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10003": "échec de la libération du VIP%s en raison de %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10009": "service[uuid: %s] est déjà lié à un serveur d'observabilité", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10002": "échec de la synchronisation des VIP [ips: %s] sur le routeur virtuel [uuid:%s] pour l'attachement de la NIC [uuid: %s, ip: %s], en raison de %s", + "ORG_ZSTACK_OVF_10025": "Seul une machine virtuelle à l'état: %s peut être exportée.", + "ORG_ZSTACK_OVF_10026": "échec de l'analyse jsonCreateVmParam dans les paramètres de la requête APICreateVmInstanceFromOvfMsg", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10006": "Offre de routeur virtuel [uuid:%s] trouvée pour L3Network [uuid:%s] dans la zone [uuid:%s] ; cependant, le réseau IP public [uuid:%s] du réseau ne correspond pas au VIP [uuid:%s]. Vous devrez peut-être spécifier une offre de routeur virtuel particulière en utilisant le tag système guestL3Network::l3NetworkUuid.", + "ORG_ZSTACK_OVF_10023": "L'export de VM nécessite un stockage de sauvegarde ImageStore, mais le backupStorageUuid donné: %s n'est pas un stockage de sauvegarde ImageStore.", + "ORG_ZSTACK_OBSERVABILITYSERVER_10006": "serveur d'observabilité avec l'UUID: %s n'est pas activé", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10005": "routeur virtuel[uuid:%s, état:%s] n'est pas actif", + "ORG_ZSTACK_OVF_10024": "Machine virtuelle à exporter non trouvée avec l'UUID: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10007": "l'image de l'offre de serveur d'observabilité[UUID: %s] est manquante", + "ORG_ZSTACK_OVF_10021": "Échec de la création de la VM à partir d'OVF car le disque racine de la machine virtuelle est introuvable. Veuillez vous assurer que le disque requis est correctement configuré et disponible.", + "ORG_ZSTACK_OVF_10022": "VM[UUID: %s] est déjà exportée comme package OVA[UUID: %s]. Veuillez supprimer le package et réessayer.", + "ORG_ZSTACK_KVM_XMLHOOK_10001": "Le hook xml avec UUID %s a été mis à jour avec succès, mais n'a pas pu redémarrer la VM avec UUID %s. Détails: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10003": "impossible de trouver le routeur virtuel pour le service: %s, type: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10010": "le serveur d'observabilité avec UUID: %s n'est pas opérationnel; impossible de joindre le service", + "ORG_ZSTACK_OVF_10018": "Échec de la lecture du fichier OVF pour la machine virtuelle %s. Veuillez vérifier le chemin du fichier et les autorisations.", + "ORG_ZSTACK_OVF_10017": "package ova[uuid: %s] non trouvé dans le référentiel de machines virtuelles.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10057": "impossible de trouver l'UUID du groupe SLB de l'équilibreur de charge[uuid:%s,type:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_FILESYSTEM_10000": "le heartbeat de l'hôte[uuid:%s] n'a pas été mis à jour récemment", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_HA_10000": "le point d'extension du groupe HA n'est pas initialisé", + "ORG_ZSTACK_OVF_10030": "l'exécution du travail long[uuid:%s] a échoué", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10040": "impossible d'ajouter vmnic au groupe de serveurs d'équilibrage de charge car le réseau l3 [uuid:%s] est connecté à un routeur vpc différent", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10041": "impossible d'ajouter VMNIC au groupe de serveurs d'équilibrage de charge car le réseau L3 n'est pas connecté à l'instance SLB", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10046": "impossible de créer l'instance SLB car une autre instance [UUID: %s, name: %s] existe déjà pour le groupe SLB", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10047": "Impossible de créer une instance SLB car deux instances sont déjà créées pour le groupe SLB.", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10001": "échec du téléchargement des bits depuis le stockage NFS [uuid:%s, path:%s] vers le magasin d'images [hostname:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10042": "impossible de changer l'IP du moniteur du groupe SLB car l'IP du moniteur %s est invalide", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10043": "impossible de passer le groupe SLB [uuid:%s] en mode haute disponibilité car l'état de l'instance [%s] n'est pas arrêté", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10044": "échec de la création de VIP%s sur le routeur virtuel[UUID:%s], car %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10000": "échec du téléchargement des bits depuis le stockage de sauvegarde du magasin d'images[hostname:%s, path: %s] vers le stockage NFS primaire[uuid:%s, path: %s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10045": "échec de la création du groupe d'affinité pour l'instance SLB [uuid:%s]", + "ORG_ZSTACK_IAM2_API_10011": "l'attribut[uuid:%s] n'est associé à aucun groupe défini", + "ORG_ZSTACK_IAM2_API_10012": "l'attribut[uuid:%s] n'est associé à aucune organisation", + "ORG_ZSTACK_IAM2_API_10013": "l'attribut[uuid:%s] n'est associé à aucun projet", + "ORG_ZSTACK_IAM2_API_10014": "l'attribut[uuid:%s] n'est associé à aucun ID d'instance virtuelle", + "ORG_ZSTACK_IAM2_API_10015": "La politique de mise à la retraite doit être supprimée avant de sortir le projet de l'état Retiré.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10039": "impossible d'ajouter vmnic au groupe de serveurs d'équilibrage de charge car le réseau l3 [uuid:%s] est connecté à un routeur vpc", + "ORG_ZSTACK_IAM2_API_10016": "la connexion est interdite car le projet est dans un état %s", + "ORG_ZSTACK_IAM2_API_10017": "aucun quota[name:%s] n'existe", + "ORG_ZSTACK_IAM2_API_10018": "La limite CPU pour le conteneur (%s) doit être supérieure à la quantité de CPU demandée (%s).", + "ORG_ZSTACK_IAM2_API_10019": "La limite de taille de mémoire pour le conteneur doit être supérieure à la taille de mémoire demandée.", + "ORG_ZSTACK_OVF_10003": "Contrôleur de gestion de volume non trouvé. Veuillez vous assurer que votre service de gestion de volume est correctement configuré et en cours d'exécution.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10007": "VipQoS pour Vip [uuid: %s] n'existe pas", + "ORG_ZSTACK_OVF_10004": "Contrôleur de pilote CD non trouvé. Veuillez vous assurer que les pilotes de virtualisation nécessaires sont installés et configurés pour votre instance.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10008": "Impossible de supprimer la Quality of Service pour l'IP virtuelle [uuid: %s]. Elle est associée à une VPC Shared Quality of Service.", + "ORG_ZSTACK_OVF_10001": "Spécification de capacité de disque illégale: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10005": "Impossible de définir la Quality of Service (Qos) pour le VIP [UUID: %s]. Il a été attaché à un VpcSharedQos.", + "ORG_ZSTACK_OVF_10002": "Taille provisionnée de disque illégale: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10006": "VIP QoS pour VIP [uuid: %s] port %s n'existe pas", + "ORG_ZSTACK_OVF_10000": "Référence de disque non trouvée pour le disque %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10009": "Impossible de trouver le backend VIP QoS pour VIP [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10010": "VpcSharedQos doit spécifier la bande passante", + "ORG_ZSTACK_IPSEC_10028": "Le réseau L3 [%s] n'est pas attaché au tunnel IPsec [UUID :%s]", + "ORG_ZSTACK_AUTOSCALING_10000": "UUIDs de réseau L3[%s] invalides pour l'écouteur associé à l'équilibreur de charge[%s], tous les réseaux doivent être attachés au même routeur virtuel que le service LB et faire partie de la même configuration de réseau VRouter", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10011": "Le VPC doit d'abord être attaché au L3[%s]", + "ORG_ZSTACK_IPSEC_10029": "Le CIDR [%s] est déjà inclus dans la configuration IPsec [UUID :%s]", + "ORG_ZSTACK_AUTOSCALING_10001": "Échec du détachement de autoScalingTemplate[%s] de AutoScalingGroup, les erreurs sont %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10030": "Impossible d'attacher le réseau L3 avec UUID [%s] à l'instance SLB en raison du format invalide du préfixe IPv6 [%s]", + "ORG_ZSTACK_AUTOSCALING_10003": "Les écouteurs avec UUID: %s sont utilisés par le autoScalingVmTemplate[%s] et ne peuvent pas être supprimés", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10014": "VpcSharedQos ne peut pas attacher ce VIP car il a déjà été attaché à un autre VpcSharedQos.", + "ORG_ZSTACK_IPSEC_10025": "Le réseau L3 [%s] ne peut pas être attaché plusieurs fois à IPsec [UUID:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10012": "Le paramètre AttachVipToVpcSharedQos doit spécifier VipUuids ou VipLists", + "ORG_ZSTACK_IPSEC_10026": "Doit inclure les réseaux Layer 3 dans APIAttachL3NetworksToIPsecConnectionMsg", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10013": "VpcSharedQos ne peut pas attacher ce VIP, car VIP[%s] n'est pas dans le réseau L3[%s].", + "ORG_ZSTACK_IPSEC_10027": "Le réseau L3 [%s] n'est pas un réseau VPC et ne peut pas être attaché ou détaché à IPsec.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10035": "Impossible de créer l'équilibreur de charge car le VIP [uuid:%s] est déjà associé à un autre service réseau [%s]", + "ORG_ZSTACK_IPSEC_10020": "L'adresse pair[%s] n'est pas une adresse IPv4 valide", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10036": "Impossible de créer l'équilibreur de charge car le VIP [uuid:%s] est déjà attaché à un routeur VPC [%s]", + "ORG_ZSTACK_IPSEC_10021": "La clé d'authentification ne doit pas contenir d'espaces blancs ou de caractères spéciaux tels que %s.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10037": "Impossible de créer l'équilibreur de charge car le groupe SLB [uuid:%s] est invalide", + "ORG_ZSTACK_IPSEC_10022": "Le VIP IPsec [%s] ne doit pas être la première ou la dernière adresse IP dans la plage CIDR associée au type de pool d'adresses publiques.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10038": "impossible d'ajouter la carte réseau du serveur backend au groupe de serveurs [uuid:%s], car l'UUID de la carte réseau est null", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10031": "impossible de rattacher le réseau L3 avec l'UUID [%s] à l'instance SLB car l'adresse IP et le préfixe doivent être spécifiés dans les balises système", + "ORG_ZSTACK_AUTOSCALING_10004": "L'instance n'existe pas dans le groupe de mise à l'échelle. Veuillez vérifier l'ID de l'instance et le nom du groupe de mise à l'échelle [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10032": "impossible de détacher le réseau L3 frontal [uuid:%s] de l'instance SLB", + "ORG_ZSTACK_AUTOSCALING_10005": "les alarmes avec UUID:%s sont associées au groupe de mise à l'échelle automatique[%s] et ne peuvent pas être supprimées", + "ORG_ZSTACK_IAM2_API_10020": "l'organisation[uuid:%s] est un Cloud Tenant et ne peut pas avoir d'organisation parente", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10033": "impossible de détacher le réseau L3 de gestion [uuid:%s] de l'instance SLB", + "ORG_ZSTACK_AUTOSCALING_10006": "la règle[%s] est désactivée", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10034": "impossible de détacher la carte réseau [uuid:%s] de l'instance SLB car c'est la dernière interface réseau Layer 3 backend", + "ORG_ZSTACK_IAM2_API_10021": "l'organisation parente [uuid:%s] ne peut pas être une organisation enfant [uuid:%s] dans une structure organisationnelle imbriquée", + "ORG_ZSTACK_IAM2_API_10022": "nom d'ID de machine virtuelle en double[%s]", + "ORG_ZSTACK_IAM2_API_10023": "nom d'environnement virtuel en double[%s]", + "ORG_ZSTACK_IAM2_API_10024": "nom de projet invalide[%s], un projet avec le même nom existe déjà", + "ORG_ZSTACK_IAM2_API_10025": "IAM2OrganizationVO[uuid:%s] n'existe pas", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10028": "impossible de rattacher le réseau L3 avec l'UUID [%s] à l'instance SLB car l'adresse IP et le masque réseau doivent être spécifiés dans les balises système", + "ORG_ZSTACK_IAM2_API_10026": "Le projet [UUID=%s] a été associé à l'organisation [UUID=%s].", + "ORG_ZSTACK_OBSERVABILITYSERVER_10019": "L'heure de début doit être inférieure à l'heure de fin pour une planification valide dans les environnements cloud.", + "ORG_ZSTACK_IAM2_API_10027": "Le projet [UUID=%s] n'est pas associé à un environnement cloud.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10029": "impossible de rattacher le réseau L3 avec l'UUID [%s] à l'instance SLB en raison du format d'adresse IPv6 invalide [%s]", + "ORG_ZSTACK_IAM2_API_10028": "les organisations%s ne sont pas autorisées à être des enfants d'autres organisations", + "ORG_ZSTACK_IAM2_API_10029": "l'ID virtuel [UUID: %s] n'appartient pas au projet [UUID: %s]", + "ORG_ZSTACK_OBSERVABILITYSERVER_10015": "impossible de trouver le type de service ObservabilityServer: %s", + "ORG_ZSTACK_OVF_10015": "le stockage de sauvegarde[UUID: %s] n'a pas suffisamment de capacité disponible pour exporter la VM[UUID: %s], la capacité requise est: %d", + "ORG_ZSTACK_OBSERVABILITYSERVER_10016": "le service[uuid: %s] de type %s ne peut pas être détaché du serveur d'observabilité[uuid: %s] en raison de: %s", + "ORG_ZSTACK_OVF_10012": "Valeur de configuration CPU 'CoresPerSocket' invalide: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10017": "le service[uuid: %s] n'est pas associé au serveur d'observabilité[uuid: %s]", + "ORG_ZSTACK_OBSERVABILITYSERVER_10018": "L'heure de début et de fin doivent être toutes les deux spécifiées pour la période de provisionnement de l'instance cloud.", + "ORG_ZSTACK_OVF_10010": "'VirtualQuantity' de CPU virtuel non trouvé", + "ORG_ZSTACK_OBSERVABILITYSERVER_10011": "instance du serveur d'observabilité[uuid: %s] non trouvée", + "ORG_ZSTACK_OVF_10011": "Valeur CPU 'vCPU' invalide: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10013": "Le service[uuid: %s] de type %s ne peut pas être attaché au serveur d'observabilité[uuid: %s] en raison de : %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10000": "La Qualité de Service (QoS) VIP pour IPv6 sera implémentée bientôt.", + "ORG_ZSTACK_ALIYUN_STORAGE_SNAPSHOT_10000": "L'opération est autorisée uniquement lorsque le statut de l'instance ECS est en cours d'exécution ou arrêté.", + "ORG_ZSTACK_OVF_10009": "UC 'InstanceID' non trouvée. Veuillez vérifier l'ID de l'instance et vous assurer que l'UC est correctement assignée.", + "ORG_ZSTACK_OBSERVABILITYSERVER_10020": "Format de date-heure invalide. Format ISO-8601 attendu avec détail optionnel du fuseau horaire : %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10021": "Le serveur d'observabilité [UUID: %s] n'est pas actif ; impossibilité de récupérer les données du service", + "ORG_ZSTACK_OVF_10007": "Mémoire virtuelle 'VirtualQuantity' non trouvée", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10003": "SetVipQos doit spécifier soit InboundBandwidth, soit OutboundBandwidth.", + "ORG_ZSTACK_OVF_10008": "Valeur de mémoire de machine virtuelle invalide : %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10004": "Impossible de définir la Qualité de Service (QoS) pour cette adresse IP virtuelle (VIP). Tous les réseaux Layer 3 pairs ne fournissent pas le service QoS VIP.", + "ORG_ZSTACK_OVF_10005": "Adaptateur Ethernet : %s n'est pas connecté à un réseau.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10001": "La QoS VIP pour le VIP [uuid: %s] port %s existe déjà", + "ORG_ZSTACK_OVF_10006": "Machine virtuelle '%s' non trouvée", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10002": "La Qualité de Service VIP pour le VIP [uuid: %s] existe déjà", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10024": "impossible de créer le groupe SLB car le type d'instance backend est invalide %s", + "ORG_ZSTACK_IPSEC_10031": "impossible de changer l'état car IPsec [uuid:%s] n'est pas dans un statut prêt", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10025": "impossible de créer le groupe SLB car l'adresse IP de surveillance est invalide %s", + "ORG_ZSTACK_IPSEC_10032": "impossible de reconnecter ce tunnel IPsec [uuid:%s], veuillez mettre à jour la version IPsec", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10026": "impossible d'attacher le réseau L3 avec UUID [%s] à l'instance SLB en raison du format d'adresse IPv4 invalide [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10027": "impossible d'attacher le réseau L3 avec UUID [%s] à l'instance SLB en raison d'une erreur de format de masque réseau IPv4 [%s]", + "ORG_ZSTACK_IAM2_API_10030": "opération illégale, impossible d'ajouter le Rôle[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10021": "Le réseau backend [UUID:%s] est connecté au routeur VPC [UUID:%s], tandis que d'autres réseaux backend sont connectés au routeur VPC [UUID:%s].", + "ORG_ZSTACK_IAM2_API_10031": "impossible d'opérer sur les ID de machines virtuelles obsolètes : %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10022": "impossible d'exécuter l'opération API. Le réseau backend [uuid:%s] ne peut pas être un réseau VPC car d'autres réseaux backend ne sont pas des réseaux VPC.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10023": "impossible de créer le groupe SLB car le type de déploiement est invalide %s", + "ORG_ZSTACK_IPSEC_10030": "Le CIDR [%s] n'est pas dans les CIDR définis de l'IPsec UUID [%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10026": "Erreur d'opération : Échec de la récupération de la réponse depuis le service d'informatique en nuage", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10028": "la sauvegarde des instantanés vers le stockage de sauvegarde est une fonctionnalité dépréciée et sera supprimée dans une future version de la plateforme cloud", + "ORG_ZSTACK_IAM2_API_10000": "le nom de l'attribut ne peut pas être null, valeur[%s]", + "ORG_ZSTACK_IAM2_API_10001": "le nom de l'attribut[%s] dépasse la longueur maximale de 2048 caractères", + "ORG_ZSTACK_IAM2_API_10002": "attribut[name:%s] la valeur dépasse la longueur maximale de 2048 caractères", + "ORG_ZSTACK_IAM2_API_10003": "L'Organisation[UUID: %s] a dépassé la Limite Demandée pour [Nom: %s, Valeur Utilisée: %s].", + "ORG_ZSTACK_IAM2_API_10005": "%s n'est pas une valeur valide pour le contrôle du trafic réseau. Les valeurs valides sont allow/reject entre des plages IP spécifiques.", + "ORG_ZSTACK_IAM2_API_10006": "L'unité organisationnelle par défaut[%s] ne peut pas être supprimée", + "ORG_ZSTACK_IAM2_API_10007": "identificateur de modèle en double[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10018": "VpcSharedQos ne peut pas détacher ce Vip car Vpc[%s] n'est pas connecté", + "ORG_ZSTACK_IAM2_API_10009": "Le nom d'utilisateur 'admin' est réservé dans les environnements d'informatique en nuage pour désigner les privilèges administratifs. Veuillez choisir un autre nom pour votre utilisateur.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10016": "Le paramètre DetachVipFromVpcSharedQos doit spécifier VipUuids ou VipLists", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10017": "VpcSharedQos ne peut pas détacher ce VIP, car VIP[%s] n'est pas attaché", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10010": "le stockage principal ceph [uuid:%s] a peut-être été supprimé ou terminé.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10013": "Le stockage principal ceph [UUID: %s, name: %s] est indisponible, car un Moniteur [UUID: %s] signale un échec d'opération [%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10012": "Il existe un autre stockage principal CEPH avec le même FSID ; vous ne pouvez pas ajouter la même configuration CEPH comme deux stockages principaux différents.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10015": "Impossible d'établir la connexion avec les nœuds de stockage (%s)", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10017": "le nœud moniteur [ip:%s] retourne un fsid[%s] différent du fsid du cluster actuel[%s], ajoutez-vous par erreur un nœud moniteur n'appartenant pas à ce cluster ?", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10016": "Impossible d'ajouter un nœud MON à la solution de stockage principal basée sur Ceph", + "ORG_ZSTACK_IAM2_API_10010": "nom[%s] invalide, un projet ou un compte avec le même identifiant existe déjà", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10008": "connexion au stockage principal ceph [UUID:%s] impossible, échec de connexion à tous les moniteurs Ceph.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10007": "tous les moniteurs ne peuvent pas exécuter la requête HTTP[%s]", + "ORG_ZSTACK_ZOPS_10009": "échec de récupération des sources chrony, car :%s", + "ORG_ZSTACK_ZOPS_10005": "%s est inaccessible depuis %s en raison de :%s", + "ORG_ZSTACK_ZOPS_10004": "échec de configuration des sources de temps '%s' dans %s, car :%s, brut : %s", + "ORG_ZSTACK_ZOPS_10007": "%s n'a pas pu vérifier l'état de santé du cluster Ceph en raison de : %s", + "ORG_ZSTACK_ZOPS_10006": "échec de vérification si %s est accessible depuis %s en raison de :%s", + "ORG_ZSTACK_ZOPS_10001": "%s n'est pas une adresse IP d'instance de nuage valide", + "ORG_ZSTACK_ZOPS_10003": "%s n'est pas une adresse IP ou un nom d'hôte valide", + "ORG_ZSTACK_ZOPS_10002": "Les serveurs Chrony internes et externes ne peuvent pas être nuls en même temps. Veuillez vous assurer que les deux sont correctement configurés.", + "ORG_ZSTACK_ZOPS_10010": "échec de récupération des sources chrony de %s, en raison de :%s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10001": "Le stockage de sauvegarde [UUID: %s, Nom: %s, FSID: %s] ne fait pas partie du même cluster Ceph que le stockage principal [UUID: %s, Nom: %s, FSID: %s].", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10004": "échec de sauvegarde du cache d'image chiffré : %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10005": "le fsid n'est pas cohérent entre le stockage principal [ps(%s)] et le stockage de sauvegarde [bs(%s)]. La création de modèle est donc interdite.", + "ORG_ZSTACK_ZOPS_10019": "Échec de la suppression de l'ancien serveur chrony dans zstack.properties dans %s, car :%s", + "ORG_ZSTACK_ZOPS_10016": "ZStone ne prend actuellement pas en charge la mise à jour des serveurs chrony en ligne. Veuillez vous assurer que tous les changements sont effectués hors ligne avant le déploiement.", + "ORG_ZSTACK_ZOPS_10015": "%s est inaccessible depuis l'environnement de machine virtuelle actuel", + "ORG_ZSTACK_ZOPS_10018": "L'état du cluster CEPH n'est pas sain. Veuillez d'abord vérifier votre environnement ! %s", + "ORG_ZSTACK_ZOPS_10012": "Échec de la vérification si %s est accessible depuis l'hôte %s car il n'est pas sous notre gestion", + "ORG_ZSTACK_ZOPS_10011": "Échec de la synchronisation du serveur chrony dans %s car :%s, brut : %s", + "ORG_ZSTACK_ZOPS_10014": "%s ne peut pas être désigné comme serveur de temps chrony externe !", + "ORG_ZSTACK_ZOPS_10020": "Échec de la configuration du serveur chrony %s dans zstack.properties dans %s, car :%s", + "ORG_ZSTACK_PROXY_10000": "Impossible de trouver la configuration du proxy utilisateur avec l'UUID %s", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10005": "Échec du démarrage du serveur de redirection USB depuis l'hôte[uuid:%s]", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10004": "Impossible de démarrer le service USB sur l'hôte[%s], car l'hôte n'est pas connecté", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10003": "L'hôte[%s] a initié plus de 64 ports de redirection USB", + "ORG_ZSTACK_COMPUTE_HOST_10085": "Impossible de configurer le réseau de gestion sur l'interface car elle est en mode d'attribution automatique.", + "ORG_ZSTACK_COMPUTE_HOST_10084": "Impossible de détacher le réseau de gestion de l'interface car il est de type attribué automatiquement.", + "ORG_ZSTACK_COMPUTE_HOST_10087": "Impossible de détacher le réseau de gestion de l'interface de bonding car il utilise l'acquisition automatique d'IP.", + "ORG_ZSTACK_COMPUTE_HOST_10081": "Impossible de configurer les adresses IP pour les interfaces esclaves du pont", + "ORG_ZSTACK_COMPUTE_HOST_10080": "L'adresse IP a déjà été attribuée à une autre interface. Veuillez vous assurer que l'adresse IP est unique pour toutes les interfaces réseau.", + "ORG_ZSTACK_COMPUTE_HOST_10083": "UUID de bonding invalide pour l'interface réseau virtuelle %s", + "ORG_ZSTACK_COMPUTE_HOST_10089": "Type de service spécifié invalide. Veuillez utiliser un type de service valide pour les environnements d'informatique en nuage.", + "ORG_ZSTACK_COMPUTE_HOST_10088": "Impossible de configurer le réseau de gestion sur le bonding car le réseau de gestion utilise l'attribution automatique.", + "ORG_ZSTACK_COMPUTE_HOST_10090": "Échec de la mise hors tension simulée de la machine virtuelle[%s] par IPMI.", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10001": "Échec de l'établissement d'une connexion au serveur SMTP à l'hôte : %s et au port : %d. Veuillez vérifier la configuration de smtpServer et smtpPort. [erreur=%s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10002": "Impossible d'établir une connexion au serveur SMTP[serveur : %s, port : %s] dans les 15 secondes", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10003": "Erreur de validation du serveur SMTP : %s", + "ORG_ZSTACK_AI_COLLECTOR_10000": "Aucun contexte de déploiement trouvé pour la collecte de métadonnées MindIE dans l'environnement virtuel. Veuillez vous assurer que les ressources cloud nécessaires sont correctement configurées et disponibles.", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10004": "Le point de terminaison spécifié est désactivé. Veuillez vérifier votre configuration de point de terminaison.", + "ORG_ZSTACK_AI_COLLECTOR_10001": "Certains contextes de déploiement n'ont pas d'inventaire de machine virtuelle, empêchant la collecte de métadonnées MindIE.", + "ORG_ZSTACK_COMPUTE_HOST_10096": "Réinitialisation de l'alimentation de l'hôte[%s] via IPMI échouée.", + "ORG_ZSTACK_COMPUTE_HOST_10095": "Échec de la réinitialisation de l'alimentation simulée de la machine virtuelle par IPMI. [%s]", + "ORG_ZSTACK_COMPUTE_HOST_10098": "L'hôte[%s] a reçu une valeur de retour inattendue", + "ORG_ZSTACK_COMPUTE_HOST_10097": "Les informations IPMI sont incomplètes pour l'instance %s. Veuillez vérifier et fournir les détails requis.", + "ORG_ZSTACK_COMPUTE_HOST_10092": "la mise sous tension simulée de l'instance par IPMI a échoué pour l'hôte[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10091": "la mise hors tension de l'hôte[%s] par IPMI a échoué.", + "ORG_ZSTACK_COMPUTE_HOST_10094": "le redémarrage de l'hôte[%s:%d] a échoué car l'instance est déjà mise hors tension", + "ORG_ZSTACK_COMPUTE_HOST_10093": "la mise sous tension de l'hôte[%s] par IPMI a échoué.", + "ORG_ZSTACK_COMPUTE_HOST_10099": "l'hôte[%s] ne peut pas établir de connexion avec ipmi[%s], raison:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10002": "impossible de vérifier la somme de contrôle MD5 des fichiers dans le répertoire[%s].\\nstdout:%s\\nstderr:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10003": "impossible de vérifier la somme de contrôle MD5 des fichiers dans le dossier[%s] sur l'hôte[ip:%s].\\nstdout:%s\\nstderr:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10000": "Le nom d'utilisateur, le mot de passe ou le numéro de port peuvent être incorrects. Veuillez vérifier et réessayer.", + "ORG_ZSTACK_COMPUTE_HOST_10065": "échec de la mise à jour de l'étiquette réseau de l'hôte [uuid:%s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10000": "Le problème peut être causé par une clé d'accès ou une clé secrète incorrecte ou une autorisation de politique IAM refusée. [error=%s]", + "ORG_ZSTACK_COMPUTE_HOST_10064": "échec de la suppression de l'étiquette réseau de l'hôte [uuid:%s]", + "ORG_ZSTACK_COMPUTE_HOST_10067": "format d'adresse IP invalide[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10066": "l'hôte [%s] n'est pas connecté, la mise hors tension n'est pas prise en charge", + "ORG_ZSTACK_COMPUTE_HOST_10069": "l'ensemble IP spécifié est invalide, il doit être accompagné d'un masque de réseau en notation CIDR", + "ORG_ZSTACK_COMPUTE_HOST_10068": "format de masque de sous-réseau invalide[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10073": "Impossible de configurer l'adresse IP sur les interfaces esclaves de bonding", + "ORG_ZSTACK_COMPUTE_HOST_10070": "Impossible de configurer l'adresse IP pour l'interface réseau de gestion.%s", + "ORG_ZSTACK_COMPUTE_HOST_10078": "Impossible de configurer l'interface de bonding liée au réseau de gestion", + "ORG_ZSTACK_COMPUTE_HOST_10077": "UUID d'interface invalide spécifié", + "ORG_ZSTACK_IMAGE_10019": "Session de téléchargement expirée. Veuillez vous assurer que votre session de téléchargement est active et réessayer.", + "ORG_ZSTACK_IMAGE_10016": "Échec dû au redémarrage du nœud de gestion.", + "ORG_ZSTACK_IMAGE_10015": "le chemin de l'image n'est pas dans la liste approuvée: %s", + "ORG_ZSTACK_IMAGE_10014": "Toutes les instances sur ce serveur ne peuvent pas accéder aux images", + "ORG_ZSTACK_IMAGE_10013": "le chemin de l'image [%s] est inclus dans la liste noire %s", + "ORG_ZSTACK_IMAGE_10012": "Un chemin absolu doit être spécifié pour le fichier source. Veuillez fournir le chemin complet du fichier.", + "ORG_ZSTACK_IMAGE_10011": "L'URL fournie doit commencer par 'file:///', 'http://', 'https://', 'ftp://', 'sftp://', ou '/'.", + "ORG_ZSTACK_IMAGE_10010": "aucun stockage de sauvegarde spécifié dans uuids%s n'est disponible pour ajouter cette image; ils ne sont pas dans le statut %s ou pas dans l'état %s, ou l'UUID est un UUID de stockage de sauvegarde invalide", + "ORG_ZSTACK_IMAGE_10009": "format d'image non pris en charge[%s]", + "ORG_ZSTACK_IMAGE_10008": "format inconnu[%s]", + "ORG_ZSTACK_IMAGE_10007": "L'ISO ne peut pas être utilisé comme image de disque système.", + "ORG_ZSTACK_IMAGE_10006": "le snapshot de volume[uuid:%s] n'est pas activé, c'est %s", + "ORG_ZSTACK_IMAGE_10005": "le snapshot de volume[uuid:%s] n'est pas Prêt, il est dans l'état %s", + "ORG_ZSTACK_IMAGE_10004": "le volume[uuid:%s] n'est pas activé, il est actuellement %s", + "ORG_ZSTACK_IMAGE_10003": "le volume[uuid:%s] n'est pas Prêt, il est %s", + "ORG_ZSTACK_IMAGE_10002": "L'architecture AArch64 ne prend pas en charge les fonctionnalités héritées. Veuillez vous assurer que votre configuration est compatible avec l'architecture AArch64.", + "ORG_ZSTACK_ALIYUN_ACCOUNT_10000": "impossible d'établir une connexion vers [%s] dans les %d millisecondes, indiquant que le service OpenAPI Alibaba Cloud est inaccessible.", + "ORG_ZSTACK_IMAGE_10039": "Aucun stockage de sauvegarde connecté trouvé pour l'image[uuid:%s, name:%s]", + "ORG_ZSTACK_IMAGE_10038": "L'image avec UUID [uuid:%s] et nom [name:%s] n'est stockée sur aucun stockage de sauvegarde.", + "ORG_ZSTACK_IMAGE_10037": "échec de la création du modèle de volume de données à partir du volume[uuid:%s] sur tous les stockages de sauvegarde%s. Voir la cause pour l'une des erreurs", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10041": "attend une valeur booléenne ou une autre Condition, les Conditions actuelles incluent : %s, mais a obtenu %s", + "ORG_ZSTACK_IMAGE_10036": "échec de l'allocation de tous les stockages de sauvegarde[uuid:%s], liste d'erreurs : %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10040": "L'instance EC2 est nulle ! Veuillez vous assurer que l'ID d'instance est correct et non nul.", + "ORG_ZSTACK_IMAGE_10035": "Impossible de trouver une solution de stockage de sauvegarde appropriée. Veuillez vous assurer que votre configuration de stockage cloud est correcte et accessible.", + "ORG_ZSTACK_IMAGE_10034": "échec de la création de l'image à partir du volume racine[uuid:%s] sur tous les stockages de sauvegarde ; veuillez vérifier la cause pour l'une des erreurs", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10002": "il y a des ressources insuffisantes pour le téléchargement de l'image[uuid: %s] pendant la migration de stockage du volume[uuid: %s], capacité requise : %s, capacité physique disponible actuelle : %s", + "ORG_ZSTACK_IMAGE_10032": "impossible d'allouer le stockage de sauvegarde spécifié par les UUIDs%s, liste d'erreurs : %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10003": "Capacité insuffisante pour la migration de stockage du volume [UUID : %s] ; capacité requise : %d, capacité physique disponible actuelle : %d", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10004": "les données sur la PS source[uuid: %s] ont été supprimées et la restauration n'est pas prise en charge", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10005": "La migration d'un volume sans snapshot sur un stockage de blocs partagé n'est pas prise en charge et ne peut pas être annulée.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10000": "ID de corbeille (%s) trouvé dans le stockage principal [%s] pour le chemin d'installation de migration [%s]. Veuillez d'abord le nettoyer à l'aide de 'APICleanUpTrashOnPrimaryStorageMsg' si vous insistez pour migrer le volume [%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10001": "impossible de trouver l'image avec UUID:%s dans un stockage de sauvegarde connecté attaché à la zone avec UUID:%s. Veuillez vérifier ce qui suit :", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10039": "1. Assurez-vous que le stockage de sauvegarde est attaché à la zone avec UUID:%s.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10032": "2. Vérifiez que le stockage de sauvegarde est dans un état connecté ; essayez de le reconnecter si nécessaire.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10036": "seules les méthodes peuvent être définies dans une Function, mais a trouvé %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10035": "Fn::FindInMap ne peut pas localiser les ressources [%s] dans le mappage Resources !", + "ORG_ZSTACK_CORE_ERRORCODE_10007": "Aucune référence [%s] trouvée !", + "ORG_ZSTACK_CORE_ERRORCODE_10005": "les fonctions non prises en charge [%s] ne sont pas prises en charge dans le modèle de ressource ZStack !", + "ORG_ZSTACK_IMAGE_10026": "Les arguments d'entrée 'regex' ou 'category' doivent être spécifiés pour le filtrage des ressources cloud.", + "ORG_ZSTACK_CORE_ERRORCODE_10006": "le code d'élaboration doit être une valeur numérique !", + "ORG_ZSTACK_IMAGE_10025": "L'image source [%s] n'existe pas", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10051": "%s ne peut pas être converti en CloudString", + "ORG_ZSTACK_CORE_ERRORCODE_10003": "%s n'est pas un répertoire valide ou est vide", + "ORG_ZSTACK_CORE_ERRORCODE_10004": "erreur de lecture lors de l'élaboration des fichiers modèles [%s] échoué, en raison de : %s", + "ORG_ZSTACK_IMAGE_10023": "l'instance de machine virtuelle [uuid:%s] n'a pas de volume root", + "ORG_ZSTACK_IMAGE_10022": "l'instance de machine virtuelle [uuid:%s] n'a pas de volume attaché", + "ORG_ZSTACK_IMAGE_10021": "le stockage de sauvegarde [uuid:%s] n'est pas dans l'état connecté, l'état actuel est %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10042": "attend une valeur booléenne 'true' ou 'false' pour l'objet, mais a obtenu %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10046": "Fn::GetAtt ne peut pas trouver les ressources spécifiées [%s] dans la liste des ressources !", + "ORG_ZSTACK_SSO_SAML2_SERVICE_10000": "iam2 contient un utilisateur avec le même nom [%s], type attendu [%s] mais type trouvé [%s]", + "ORG_ZSTACK_COMPUTE_HOST_10119": "L'hôte [%s] n'a pas de périphérique IPMI configuré ou le périphérique IPMI n'a pas d'adresse. Après avoir configuré l'adresse IPMI, veuillez reconnecter l'hôte pour rafraîchir ses informations IPMI.", + "ORG_ZSTACK_ZQL_AST_VISITORS_PLUGIN_10000": "Le champ à additionner doit être spécifié.", + "ORG_ZSTACK_SSO_SAML2_SERVICE_10001": "connexion SAML en double [%s] pour le type [%s]", + "ORG_ZSTACK_COMPUTE_HOST_10120": "échec de la migration de la machine virtuelle [uuid:%s] sur l'hôte [uuid:%s, nom:%s, ip:%s], tentative d'arrêt progressif.", + "ORG_ZSTACK_CORE_ERRORCODE_10001": "Le fichier source et le contenu JSON ne peuvent pas être vides simultanément. Veuillez vous assurer qu'un fichier source valide est fourni ou qu'un contenu JSON est spécifié.", + "ORG_ZSTACK_CORE_ERRORCODE_10002": "Analyse du répertoire des ressources impossible : %s", + "ORG_ZSTACK_CORE_ERRORCODE_10000": "Aucun fichier ou contenu fourni pour la configuration des ressources de cloud computing", + "ORG_ZSTACK_COMPUTE_HOST_10124": "Échec de la tentative de connexion à l'hôte, la requête ping a expiré. Veuillez vérifier la connectivité réseau et vous assurer que l'hôte est opérationnel.", + "ORG_ZSTACK_COMPUTE_HOST_10104": "Un hôte avec l'IP de gestion [%s] pour l'hyperviseur [%s] a été détecté.", + "ORG_ZSTACK_COMPUTE_HOST_10103": "le cluster [uuid:%s] a un type d'hyperviseur non défini", + "ORG_ZSTACK_COMPUTE_HOST_10106": "l'architecture du cluster [uuid:%s] est %s, ce qui ne correspond pas à l'architecture de l'hôte [nom:%s, ip:%s] qui est %s", + "ORG_ZSTACK_COMPUTE_HOST_10105": "après connexion, l'hôte [nom:%s, ip:%s] retourne une architecture virtuelle nulle", + "ORG_ZSTACK_COMPUTE_HOST_10100": "l'IPMI de l'hôte [%s] n'est pas joignable car %s", + "ORG_ZSTACK_COMPUTE_HOST_10102": "le cluster [uuid:%s] n'existe pas", + "ORG_ZSTACK_SCHEDULER_10008": "unité de temps invalide spécifiée : %s", + "ORG_ZSTACK_SCHEDULER_10005": "le volume [%s] ne prend pas en charge les politiques de rétention des snapshots", + "ORG_ZSTACK_SCHEDULER_10006": "snapshotMaxNumber : le format est incorrect en raison de %s", + "ORG_ZSTACK_COMPUTE_HOST_10108": "le type de service réseau de l'hôte système [%s] ne peut pas être terminé", + "ORG_ZSTACK_COMPUTE_HOST_10107": "le stockage principal [uuid:%s] s'est déconnecté, et l'hôte n'a plus de ressource de stockage principal attachée", + "ORG_ZSTACK_COMPUTE_HOST_10109": "le type de service réseau de l'hôte système [%s] ne peut pas être mis à jour en raison de paramètres de virtualisation conflictuels", + "ORG_ZSTACK_SCHEDULER_10002": "La tâche précédente n'a pas été terminée avec succès. Cette tâche est ignorée.", + "ORG_ZSTACK_COMPUTE_HOST_10114": "impossible de maintenir l'hôte[uuid:%s, status:%s] qui n'est pas Connecté", + "ORG_ZSTACK_COMPUTE_HOST_10111": "L'instance du serveur WebSSH n'est pas active. Veuillez vous assurer que votre serveur SSH cloud (%s) est en cours d'exécution et correctement configuré.", + "ORG_ZSTACK_COMPUTE_HOST_10110": "il y a eu un type de service réseau d'hôte[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10113": "managementIp[%s] n'est pas une adresse IPv4 ou un nom d'hôte valide", + "ORG_ZSTACK_COMPUTE_HOST_10112": "il y a eu un hôte avec l'IP de gestion[%s]", + "ORG_ZSTACK_SCHEDULER_10018": "La VM a déjà planifié un travail de type [%s]", + "ORG_ZSTACK_SCHEDULER_10016": "la VM du volume racine [%s] n'est pas disponible. Veuillez vérifier si la VM existe.", + "ORG_ZSTACK_SCHEDULER_10017": "snapshotGroupMaxNumber : Le format est incorrect en raison de %s", + "ORG_ZSTACK_SCHEDULER_10014": "Le volume[%s] n'est pas disponible. Veuillez vérifier si le volume existe et est correctement attaché.", + "ORG_ZSTACK_SCHEDULER_10015": "le volume[%s] n'est pas un volume racine", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10068": "aucun volume trouvé dans migrateVolumeStructs lors de la migration entre le stockage principal du groupe de blocs partagé !", + "ORG_ZSTACK_SCHEDULER_10013": "le champ[%s] ne peut pas être vide pour la configuration de l'instance cloud", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10067": "structures de migration de volume vides dans migrateVolumesBetweenSharedBlockGroupPrimaryStorageMsg !", + "ORG_ZSTACK_VPCFIREWALL_10027": "le ruleSet[%s] a déjà une règle avec le numéro de règle spécifié %s.", + "ORG_ZSTACK_IPSEC_10006": "Le réseau [UUID : %s] n'a pas le service IPsec activé.", + "ORG_ZSTACK_VPCFIREWALL_10028": "impossible d'ajouter la règle de pare-feu[%d] seul le protocole TCP ou UDP peut utiliser le port", + "ORG_ZSTACK_IPSEC_10007": "le CIDR distant[%s] chevauche les CIDR existants", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10000": "les nouvelles cartes NIC VM ajoutées et les cartes NIC VM attachées ne sont pas sur le même routeur virtuel ; elles sont sur des routeurs virtuels différents avec les UUID : %s et %s.", + "ORG_ZSTACK_IPSEC_10008": "le CIDR distant[%s] et le CIDR distant[%s] chevauchent", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10001": "les nouvelles cartes NIC VM ajoutées[uuids:%s] et les réseaux L3 pairs[uuids:%s] du VIP de l'équilibreur de charge[uuid : %s] ne sont pas sur le même routeur virtuel, elles sont sur des routeurs virtuels différents avec les UUID[uuids:%s]", + "ORG_ZSTACK_IPSEC_10009": "le CIDR[%s] du routeur local et le CIDR[%s] du routeur distant chevauchent", + "ORG_ZSTACK_IPSEC_10002": "La plage de ports actuelle [%s, %s] est en conflit avec la plage de ports utilisée [%s, %s] pour le VIP [uuid : %s] protocole : UDP", + "ORG_ZSTACK_IPSEC_10003": "cidr[%s] du réseau L3 attaché [uuid:%s] chevauche le cidr IPsec distant[%s] de uuid:%s", + "ORG_ZSTACK_VPCFIREWALL_10029": "impossible d'ajouter la règle de pare-feu[%d] seul le protocole TCP peut utiliser les indicateurs TCP", + "ORG_ZSTACK_IPSEC_10005": "Le fichier source pour le code Java est introuvable. Veuillez vous assurer que les fichiers nécessaires sont téléchargés et inclus dans votre projet.", + "ORG_ZSTACK_VPCFIREWALL_10020": "impossible d'attacher l'ensemble de règles par défaut à une autre carte d'interface réseau", + "ORG_ZSTACK_IPSEC_10000": "impossible de trouver la connexion IPsec [UUID:%s], elle a peut-être été supprimée", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10006": "vmnic doit être spécifié pour le partage des ressources de l'équilibreur de charge.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10073": "La VM [UUID : %s] n'a pas de socket QMP supplémentaire configuré. Cela peut être dû au démarrage de la VM sans la configuration globale [vm.additionalQmp] activée. Veuillez vous assurer que cette configuration est activée et redémarrer la VM dans ZStack.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10007": "Impossible de trouver le routeur virtuel pour l'équilibreur de charge [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10072": "stockage principal [UUID: %s] a attaché le SCSI LUN [WWID: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10071": "impossible de trouver le type d'hyperviseur approprié pour le stockage principal [uuid:%s] pour gérer le format d'image ou le format de volume [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10004": "actualiser le certificat de l'équilibreur de charge car :%s", + "ORG_ZSTACK_VPCFIREWALL_10021": "ruleSet[%s] contient déjà un l3[%s]", + "ORG_ZSTACK_SCHEDULER_10009": "le trigger de travail[uuid: %s] a échoué, car une erreur s'est produite dans le processus de provisionnement de l'instance de machine virtuelle", + "ORG_ZSTACK_ZWATCH_MYSQL_10001": "aucune instance de base de données MySQL trouvée[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10005": "actualiser l'écouteur de l'équilibreur de charge en raison de :%s", + "ORG_ZSTACK_VPCFIREWALL_10022": "contient déjà une règle avec le numéro[%s]", + "ORG_ZSTACK_SCHEDULER_10029": "Impossible d'ajouter le travail[uuid:%s] à un trigger obsolète[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10077": "le volume partagé[uuid: %s] sur le stockage principal du groupe de blocs partagé ne peut pas être redimensionné", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10076": "impossible de trouver le volume[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10075": "le bloc partagé[UUID:%s, diskUUID:%s, description:%s] existe déjà dans le groupe de blocs partagé[UUID:%s] dans le nouveau groupe de blocs partagé", + "ORG_ZSTACK_SCHEDULER_10028": "Impossible d'ajouter le travail avec l'UUID [%s] au même trigger avec l'UUID [%s] deux fois", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10074": "doit spécifier au moins un disque lors de l'ajout d'un groupe de blocs partagé pour le stockage principal", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10079": "impossible de trouver la préparation du volume[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10078": "le volume partagé[UUID: %s] sur le stockage principal du groupe de blocs partagé est attaché à des instances VM non-arrêtées[UUIDs: %s]", + "ORG_ZSTACK_SCHEDULER_10021": "l'intervalle doit être spécifié lors de l'utilisation d'un planificateur simple pour des opérations répétées plus d'une fois", + "ORG_ZSTACK_VPCFIREWALL_10016": "seuls les protocoles TCP ou UDP peuvent utiliser les ports dans les environnements d'informatique en nuage.", + "ORG_ZSTACK_VPCFIREWALL_10017": "seul le protocole TCP peut utiliser les drapeaux TCP.", + "ORG_ZSTACK_IPSEC_10018": "le VIP[uuid:%s] a été utilisé pour %s instance(s)", + "ORG_ZSTACK_VPCFIREWALL_10014": "le ruleSet[%s] a déjà une règle avec la même priorité %d.", + "ORG_ZSTACK_IPSEC_10019": "l'adresse homologue[%s] ne peut pas être la même que l'adresse VIP", + "ORG_ZSTACK_VPCFIREWALL_10015": "impossible de mettre à jour la règle par défaut[%s]", + "ORG_ZSTACK_IPSEC_10013": "Tous les réseaux au sein de la même connexion IPsec doivent être associés au même routeur de réseau privé virtuel (VPC).", + "ORG_ZSTACK_IPSEC_10014": "Il n'y a pas de VPC maître pour le groupe HA %s", + "ORG_ZSTACK_VPCFIREWALL_10018": "le protocole ICMP est le seul protocole qui peut utiliser les types ICMP. Veuillez vous assurer que votre code spécifie le protocole correct.", + "ORG_ZSTACK_IPSEC_10015": "Il y a un VPC[%s] utilisant un ancien plugin IPsec ; veuillez le mettre à jour pour créer une connexion IPsec.", + "ORG_ZSTACK_VPCFIREWALL_10019": "l'indice de la règle [%s] est invalide", + "ORG_ZSTACK_IPSEC_10016": "Il existe déjà une connexion IPsec[uuid:%s, name:%s] avec le même routeur virtuel et la même adresse homologue.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10080": "utiliser le stockage à provisionnement thick comme volume de cache ; le provisionnement du volume [%s] est %s", + "ORG_ZSTACK_IPSEC_10010": "Tous les réseaux au sein de la même connexion IPsec doivent être du même type.", + "ORG_ZSTACK_IPSEC_10011": "IPsecConnection ne peut avoir qu'un seul réseau pour %s", + "ORG_ZSTACK_IPSEC_10012": "L3Network [UUID: %s] n'a pas été attaché à un routeur VPC", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10084": "impossible de récupérer l'UUID du cluster du volume %s", + "ORG_ZSTACK_VPCFIREWALL_10010": "possède déjà un modèle de règle avec le nom %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10081": "Le SCSI LUN avec UUID [%s] et WWID [%s] est déjà attaché au stockage principal avec UUID [%s].", + "ORG_ZSTACK_SCHEDULER_10038": "Format d'expression cron invalide. Veuillez vous assurer qu'il respecte la syntaxe CRON standard.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10086": "impossible de trouver un hôte KVM qualifié pour le stockage principal du groupe de blocs partagé[uuid: %s]", + "ORG_ZSTACK_SCHEDULER_10039": "Une tâche cron doit suivre le format : \"0 0/3 17-23 * * ?\"", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10085": "sanlock indique que l'hôte %s est inaccessible sur %s", + "ORG_ZSTACK_SCHEDULER_10036": "stopTime a dépassé l'heure actuelle dans l'environnement virtuel. Veuillez vous assurer que stopTime est défini à un moment futur.", + "ORG_ZSTACK_SCHEDULER_10037": "cron doit être configuré lors de l'utilisation du planificateur cron", + "ORG_ZSTACK_SCHEDULER_10034": "Timeout de durée hors de la plage valide", + "ORG_ZSTACK_SCHEDULER_10035": "stopTime dépasse la plage valide pour le format d'horodatage MySQL", + "ORG_ZSTACK_SCHEDULER_10032": "startTime doit être spécifié pour que le planificateur simple fonctionne correctement.", + "ORG_ZSTACK_SCHEDULER_10033": "schedulerInterval doit être configuré pour que le planificateur simple fonctionne correctement.", + "ORG_ZSTACK_SCHEDULER_10030": "Il y a [%d] déclencheurs ajoutés au travail[uuid:%s], dépassant le nombre maximal de déclencheurs autorisés.", + "ORG_ZSTACK_SCHEDULER_10031": "Il y a [%d] déclencheurs ajoutés au groupe de travail [UUID:%s], et aucun déclencheur supplémentaire ne peut être ajouté.", + "ORG_ZSTACK_VPCFIREWALL_10005": "le routeur [uuid:%s] n'a pas de routeur principal", + "ORG_ZSTACK_VPCFIREWALL_10006": "Le routeur VPC[uuid:%s] a déjà un pare-feu configuré.", + "ORG_ZSTACK_VPCFIREWALL_10003": "Impossible de supprimer l'ensemble de règles par défaut du système", + "ORG_ZSTACK_VPCFIREWALL_10004": "Impossible de supprimer la règle système par défaut", + "ORG_ZSTACK_VPCFIREWALL_10001": "seuls les ensembles de règles définis par le système peuvent modifier les types d'actions.", + "ORG_ZSTACK_VPCFIREWALL_10000": "impossible de détacher l'ensemble de règles par défaut du réseau virtuel", + "ORG_ZSTACK_SCHEDULER_10045": "le groupe de travail contient %d tâches, seulement %d emplacements restants", + "ORG_ZSTACK_SCHEDULER_10043": "Aucune usine de travail de planificateur de type[%s] trouvée", + "ORG_ZSTACK_SCHEDULER_10044": "%d tâches ont des types d'instances différents du groupe de travail", + "ORG_ZSTACK_SCHEDULER_10041": "startTime doit être un entier positif ou 0", + "ORG_ZSTACK_SCHEDULER_10042": "L'heure de début spécifiée pour votre instance est hors plage. Veuillez vous assurer qu'elle se trouve dans les paramètres valides.", + "ORG_ZSTACK_SCHEDULER_10040": "La configuration du planificateur cron ne nécessite que la spécification de l'expression de la tâche cron.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10005": "Veuillez intégrer zbox dans le nœud de gestion pour l'allocation des ressources cloud.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10006": "Échec de la sauvegarde de la base de données : %s", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10003": "Le service [%s] n'est pas actif", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10007": "Il existe une autre sauvegarde externe [UUID : %s] en mode de récupération.", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10002": "Le service [%s] ne prend pas en charge le rechargement de la configuration", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10008": "Les UUID des hôtes et les UUID du stockage de sauvegarde sont tous deux vides. Vous devez en spécifier au moins un.", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10001": "Le service [%s] n'a pas été découvert", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10001": "La récupération de certains volumes [uuids:%s] a échoué. Vous pouvez la déclencher à nouveau en le reconnectant.", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10000": "Le service [%s] a été enregistré et est maintenant actif dans l'environnement cloud.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10002": "Impossible de trouver le fichier de configuration de récupération recover.conf sous le répertoire d'installation de la sauvegarde zbox.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10004": "Zbox doit d'abord être attaché à un hôte.", + "ORG_ZSTACK_VPCFIREWALL_10069": "Impossible de trouver le modèle d'ensemble d'IP du pare-feu VPC avec l'UUID : %s, il a peut-être été supprimé", + "ORG_ZSTACK_VPCFIREWALL_10063": "Échec de l'attachement de l'ensemble de règles de pare-feu [%s] en raison d'une erreur liée à la configuration du réseau virtuel", + "ORG_ZSTACK_VPCFIREWALL_10064": "Échec du détachement de l'ensemble de règles, probablement dû à une suppression", + "ORG_ZSTACK_VPCFIREWALL_10061": "Échec de la suppression de la règle de pare-feu sur vRouter[%s], en raison de %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10010": "Index Fn::Select hors plage, veuillez vérifier votre configuration JSON !", + "ORG_ZSTACK_VPCFIREWALL_10062": "Échec du changement d'état de la règle de pare-feu sur vRouter[%s] en raison de %s", + "ORG_ZSTACK_VPCFIREWALL_10067": "Impossible de trouver le pare-feu VPC avec l'UUID : %s lié au routeur virtuel", + "ORG_ZSTACK_VPCFIREWALL_10068": "Impossible de trouver l'ensemble de règles de pare-feu VPC avec l'UUID : %s, il a peut-être été supprimé", + "ORG_ZSTACK_VPCFIREWALL_10065": "Échec du détachement de l'ensemble de règles de pare-feu [%s] en raison de %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10014": "Paramètre [%s] non trouvé !", + "ORG_ZSTACK_VPCFIREWALL_10066": "Impossible de trouver le pare-feu VPC avec l'UUID : %s, il a peut-être été supprimé", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10013": "Le paramètre [%s] n'a pas de valeur spécifiée ni de valeur par défaut trouvée !", + "ORG_ZSTACK_VPCFIREWALL_10060": "Échec de la création de l'ensemble de règles de pare-feu [%s] en raison de %s", + "ORG_ZSTACK_IMAGE_10046": "L'image avec l'UUID [uuid:%s] et le nom [name:%s] n'a pas été supprimée du stockage de sauvegarde avec l'UUID [uuid:%s].", + "ORG_ZSTACK_IMAGE_10045": "L'image avec l'UUID [uuid:%s] et le nom [name:%s] n'est pas disponible sur le stockage de sauvegarde avec l'UUID [uuid:%s].", + "ORG_ZSTACK_IMAGE_10044": "L'image avec l'UUID [uuid:%s] et le nom [name:%s] n'a pas été supprimée de tout stockage de sauvegarde.", + "ORG_ZSTACK_IMAGE_10043": "L'image avec l'UUID [uuid:%s] et le nom [name:%s] a un statut [status:%s] sur le stockage de sauvegarde avec l'UUID [uuid du stockage de sauvegarde : %s], qui n'est pas Supprimé.", + "ORG_ZSTACK_IMAGE_10040": "Échec du détachement de l'iso avec uuid=%s, les erreurs sont %s", + "ORG_ZSTACK_VPCFIREWALL_10058": "supprimer la règle de pare-feu sur vRouter[%s] car %s", + "ORG_ZSTACK_VPCFIREWALL_10052": "le ruleset par défaut %s ne peut être attaché qu'à une seule interface forward, mais plusieurs interfaces connexes ont été trouvées : %s", + "ORG_ZSTACK_VPCFIREWALL_10050": "le pare-feu %s, le VPC connexe n'est pas en état de fonctionnement", + "ORG_ZSTACK_VPCFIREWALL_10051": "impossible de supprimer le rule set [%s] car il est encore attaché à une carte réseau", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10020": "impossible de trouver la condition [%s] dans la liste 'Conditions'", + "ORG_ZSTACK_VPCFIREWALL_10056": "impossible de trouver l'adresse MAC associée à l3[%s] sur vRouter[%s]", + "ORG_ZSTACK_VPCFIREWALL_10057": "échec de création de la règle de pare-feu[%s] en raison de %s", + "ORG_ZSTACK_VPCFIREWALL_10054": "échec de synchronisation de la configuration du pare-feu car %s", + "ORG_ZSTACK_VPCFIREWALL_10055": "échec de mise à jour de l'action du rule set du pare-feu car %s", + "ORG_ZSTACK_VPCFIREWALL_10049": "aucune modification détectée dans le ruleset %s", + "ORG_ZSTACK_VPCFIREWALL_10047": "échec du détachement du rule set du pare-feu du réseau[%s], car %s", + "ORG_ZSTACK_VPCFIREWALL_10048": "numéros de règle en double %s trouvés sur le pare-feu %s, l3 %s, forward %s", + "ORG_ZSTACK_SSO_CAS_SERVICE_10002": "iam2 contient un utilisateur avec le même nom[%s]", + "ORG_ZSTACK_SSO_CAS_SERVICE_10003": "tentative de connexion en double pour le type d'utilisateur[%s]", + "ORG_ZSTACK_SSO_CAS_SERVICE_10004": "impossible de trouver CasLogin pour le type(%s)", + "ORG_ZSTACK_VPCFIREWALL_10041": "impossible d'ajouter la règle de pare-feu car la longueur de la description %s n'est pas valide pour le numéro de règle %d", + "ORG_ZSTACK_VPCFIREWALL_10040": "impossible d'ajouter la règle de pare-feu car il n'y a pas d'état pour le numéro de règle:%d", + "ORG_ZSTACK_VPCFIREWALL_10045": "Les règles de pare-feu dans le fichier de configuration contiennent des erreurs de syntaxe : %s", + "ORG_ZSTACK_VPCFIREWALL_10046": "échec de l'attachement du rule set du pare-feu[%s] au réseau de couche 3[%s] car %s", + "ORG_ZSTACK_VPCFIREWALL_10044": "Le fichier de configuration de l'instance de machine virtuelle a une erreur de format. Veuillez vérifier le fichier et vous assurer qu'il respecte le schéma requis.", + "ORG_ZSTACK_VPCFIREWALL_10038": "impossible d'ajouter la règle de pare-feu car la longueur de l'IP source : %s n'est pas valide pour le numéro de règle: %d", + "ORG_ZSTACK_VPCFIREWALL_10039": "impossible d'ajouter la règle de pare-feu car la longueur de l'IP de destination : %s n'est pas valide pour le numéro de règle: %d", + "ORG_ZSTACK_VPCFIREWALL_10036": "impossible d'ajouter la règle de pare-feu car le numéro de règle %d est invalide", + "ORG_ZSTACK_VPCFIREWALL_10037": "impossible d'ajouter la règle de pare-feu car aucune action n'est définie pour ruleNo:%d", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10002": "échec de la commande d'initialisation vyos car:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10001": "impossible d'établir une connexion SSH au routeur virtuel[%s] après la configuration des paramètres SSH", + "ORG_ZSTACK_VPCFIREWALL_10030": "impossible d'ajouter la règle de pare-feu[%d] car seuls les protocoles ICMP supportent des types spécifiques", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10003": "échec du changement de l'action par défaut du pare-feu de l'interface réseau [ip:%s, mac:%s] pour le routeur virtuel [uuid:%s], car %s", + "ORG_ZSTACK_VPCFIREWALL_10031": "impossible d'ajouter la règle de pare-feu[%d] car seuls les protocoles TCP ou UDP sont supportés pour les règles basées sur les ports", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10006": "impossible de démarrer le serveur DHCP sur la VM du routeur virtuel[uuid:%s] car %s", + "ORG_ZSTACK_ZWATCH_FUNCTION_10014": "argument requis manquant pour le type d'instance dans le modèle cloud formation", + "ORG_ZSTACK_ZWATCH_FUNCTION_10013": "Arguments inconnus détectés. Veuillez vous assurer que tous les paramètres de ligne de commande sont valides et consulter la documentation pour obtenir la liste des arguments acceptés.", + "ORG_ZSTACK_VPCFIREWALL_10034": "impossible d'ajouter la règle de pare-feu[%d] car seul le protocole TCP prend en charge les drapeaux TCP dans cet environnement", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10007": "impossible d'arrêter le serveur DHCP sur l'instance de routeur virtuel [uuid:%s] car %s", + "ORG_ZSTACK_VPCFIREWALL_10035": "impossible d'ajouter la règle de pare-feu[%d] en raison d'une erreur %s" +} \ No newline at end of file diff --git a/conf/i18n/globalErrorCodeMapping/global-error-id-ID.json b/conf/i18n/globalErrorCodeMapping/global-error-id-ID.json new file mode 100644 index 00000000000..d8cd5bf487a --- /dev/null +++ b/conf/i18n/globalErrorCodeMapping/global-error-id-ID.json @@ -0,0 +1,4717 @@ +{ + "ORG_ZSTACK_XINFINI_SDK_10001": "format respons API ke class[%s] gagal, resultString: %s, exception: %s", + "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10001": "tipe datacenter [%s] tidak didukung di sini!", + "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10000": "argumen 'endpoint' harus diatur untuk tipe konfigurasi %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10080": "Pembuatan instance Baremetal2 tidak dapat menentukan zona komputasi yang tepat. Harap tentukan zona secara eksplisit.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10084": "Tidak ada chassis UUID maupun chassis offering UUID yang diatur saat membuat instance baremetal", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10082": "chassis tidak memiliki kapasitas yang cukup untuk image[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10081": "disk[%s] yang diperlukan tidak termasuk dalam chassis[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10087": "%s hanya dapat dibuat atau dihapus saat instance Baremetal2 dalam keadaan Running", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10086": "%s hanya dapat dikelola melalui operasi create atau delete", + "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10000": "Format input salah. Hanya daftar angka yang dipisahkan koma yang diterima (misalnya, %s)", + "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10001": "Host VM hanya memiliki % CPU yang tersedia", + "ORG_ZSTACK_ZWATCH_UTILS_10001": "resource[%s] tidak mendukung klausa return zwatch", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10002": "Fitur autentikasi identitas diaktifkan tetapi pool resource terkait tidak dikonfigurasi. Harap konfigurasi pool resource dan coba lagi.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10003": "tidak dapat melepaskan pool resource %s saat sedang digunakan", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10000": "Tidak ada mesin virtual yang dapat diaktifkan", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10001": "tipe token %s tidak valid, hanya mendukung token dari tipe yang digunakan di lingkungan komputasi awan", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10059": "lisensi kosong diperlukan untuk node yang diotorisasi", + "ORG_ZSTACK_STORAGE_PRIMARY_10039": "tidak ada primary storage[uuid:%s] yang ada", + "ORG_ZSTACK_V2V_10019": "primary storage dengan UUID:%s tidak didukung untuk migrasi mesin virtual v2v", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10007": "gagal melakukan transisi volume snapshot [uuid:%s, name:%s] karena status event [%s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10006": "gagal mengambil ukuran volume[uuid:%s, installPath:%s] dari primary storage[uuid:%s], karena %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10005": "gagal mengambil ukuran volume[uuid:%s, installPath:%s] dari primary storage[uuid:%s], %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10004": "vm[uuid:%s] tidak dalam keadaan Running, Paused, Destroyed, atau Stopped; keadaan saat ini[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_10040": "primaryStorage[uuid=%s] tidak ada di lingkungan awan", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10003": "volume tidak ditemukan untuk UUID volume: %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10002": "snapshot atau turunannya memiliki referensi ke volume[uuids:%s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10001": "tidak dapat menemukan volume snapshot [uuid:%s, name:%s], mungkin telah dihapus oleh operasi sebelumnya", + "ORG_ZSTACK_STORAGE_PRIMARY_10047": "cidr[%s] Format Input Tidak Valid", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10050": "ZSha2 menunjukkan adanya node manajemen lain; namun, node ini tidak ditemukan di database. Harap verifikasi keberadaan node manajemen.", + "ORG_ZSTACK_STORAGE_PRIMARY_10046": "hanya satu sistem tag CIDR primary storage yang diizinkan, tapi %d ditemukan", + "ORG_ZSTACK_STORAGE_PRIMARY_10049": "Konflik clusterUuid, cluster yang ditentukan oleh instance offering adalah %s, dan cluster yang ditentukan dalam parameter pembuatan adalah %s", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10052": "App ID untuk membatalkan pendaftaran tidak ditemukan! Harap verifikasi App ID dan coba lagi.", + "ORG_ZSTACK_STORAGE_PRIMARY_10042": "Harap tentukan tipe instance dan penyimpanan yang diinginkan sebelum menyediakan sumber daya.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10008": "tidak dapat mengatur ulang volume[uuid:%s] ke snapshot[uuid:%s], volume vm[uuid:%s] tidak dalam keadaan Berhenti, keadaan saat ini adalah %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10044": "tidak dapat menemukan primary storage yang memenuhi syarat; error adalah %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10000": "Gagal memperbarui status grup: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10050": "Konflik primaryStorageUuid: Primary storage yang ditentukan oleh instance offering adalah %s, sementara primary storage yang ditentukan dalam parameter pembuatan adalah %s", + "ORG_ZSTACK_V2V_10008": "Alamat MAC [%s] yang sama tidak diperbolehkan dalam jaringan[%s]", + "ORG_ZSTACK_V2V_10009": "Alamat MAC duplikat [%s] dalam jaringan[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_10052": "Konflik primaryStorageUuid: Primary storage yang ditentukan oleh disk offering adalah %s, sementara primary storage yang ditentukan dalam parameter pembuatan adalah %s", + "ORG_ZSTACK_V2V_10006": "instance komputasi yang mendasar dari conversion host[uuid:%s] harus Connected", + "ORG_ZSTACK_V2V_10007": "conversion host[uuid:%s] tidak dapat建立 koneksi ke primary storage[uuid:%s]", + "ORG_ZSTACK_V2V_10004": "Instance VM [UUID:%s] tidak ada atau bukan instance VM VMware", + "ORG_ZSTACK_V2V_10005": "conversionHostUuid tidak boleh null. Harap Pastikan UUID host yang valid disediakan.", + "ORG_ZSTACK_V2V_10002": "jalur penyimpanan conversion host v2v harus berupa jalur absolut. Harap berikan jalur absolut yang valid.", + "ORG_ZSTACK_V2V_10003": "URL v2v tidak valid: %s", + "ORG_ZSTACK_V2V_10000": "Keadaan host [uuid:%s] harus Connected sebelum melanjutkan dengan penerapan cloud.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10021": "Tidak dapat mengambil snapshot memori, keadaan VM yang diharapkan adalah [%s, %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10020": "volume snapshot[uuids:%s] dalam keadaan dinonaktifkan dan tidak dapat digunakan untuk pembalikan volume.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10029": "gagal membatalkan pekerjaan penghapusan. Volume[uuid:%s] VM terlampir tidak dalam keadaan %s; penghapusan snapshot offline tidak didukung dan tidak dapat dibatalkan.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10028": "gagal membatalkan pekerjaan penghapusan. Volume[uuid:%s] terkait dengan mesin virtual yang tidak ada; penghapusan snapshot offline tidak mendukung pembatalan.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10027": "gagal membatalkan pekerjaan penghapusan. Volume[uuid:%s] tidak terlampir ke VM manapun, dan penghapusan snapshot offline tidak mendukung pembatalan.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10026": "gagal membatalkan pekerjaan penghapusan. Volume[uuid:%s] tidak ada.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10025": "tidak dapat menemukan UUID volume untuk snapshots[uuid: %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10024": "Tidak didukung untuk menghapus snapshot dari volume yang berbeda [UUID: %s, %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10023": "volume asli untuk snapshot [uuid:%s] telah dihapus; tidak dapat mengembalikan volume ke keadaan asli", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10022": "volume snapshot [uuid:%s] saat ini dalam keadaan %s dan tidak dapat digunakan untuk pengembalian volume", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10018": "tidak dapat menemukan snapshot: %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10017": "primary storage[uuid:%s] tidak mendukung volume snapshot; oleh karena itu, snapshot untuk volume[uuid:%s] tidak dapat dibuat.", + "ORG_ZSTACK_YUNSHAN_UTIL_10000": "URL NSP null, harap konfigurasi NSP Layanan Komputasi Cloud.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10016": "tidak dapat meminta penyimpanan primer [uuid:%s] untuk kemampuan snapshot volume", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10015": "tidak dapat menemukan jenis untuk penyimpanan primer [%s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10012": "Jumlah snapshot maksimum tidak didukung (%d) untuk volume [UUID:%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10027": "pengujian koneksi SanSecClientFactory gagal", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10019": "jenis sumber daya %s ini tidak mendukung permintaan referensi snapshot memori", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10007": "panguPartitionUuid [%s] tidak cocok dengan identityZoneUuid [%s]", + "ORG_ZSTACK_APPLIANCEVM_10006": "appliance vm[uuid:%s] berstatus %s sehingga tidak dapat melakukan panggilan HTTP ke %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10006": "panguPartitionUuid atau identityZoneUuid harus ditentukan.", + "ORG_ZSTACK_AI_10120": "pusat model [uuid:%s] tidak ditemukan di lingkungan cloud", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10008": "tidak dapat menghapus zona identitas [%s], karena masih berisi instans Penyimpanan Primer Aliyun Ebs, pastikan semua sumber daya penyimpanan terkait dihapus terlebih dahulu.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10061": "tidak dapat memodifikasi aturan grup keamanan karena protokol [%s] tidak mengizinkan rentang port tujuan kosong", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10060": "tidak dapat memodifikasi aturan grup keamanan karena protokol yang ditentukan [%s] tidak mendukung pengaturan rentang port tujuan", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10063": "tidak dapat memodifikasi aturan grup keamanan karena aturan duplikat [%s] sudah ada di database dengan UUID %s", + "ORG_ZSTACK_APPLIANCEVM_10000": "kesalahan pengaturan informasi bootstrap appliance karena:%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10062": "tidak dapat memodifikasi aturan grup keamanan karena protokol yang ditentukan [%s] memerlukan rentang port tujuan untuk diatur", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10033": "tidak dapat menghapus instance offering [uuid:%s] karena digunakan oleh grup instance NFV [%s]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10001": "ALIYUN EBS TIDAK MENDUKUNG PENGECILAN VM YANG SEDANG BERJALAN PADA WAKTU INI.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10031": "Tidak dapat menyediakan Grup Instance NFV [uuid:%s, name:%s] ketika status bukan Inisialisasi.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10000": "tidak dapat menemukan jalur perangkat dari volume: %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10032": "Tidak dapat menyediakan NfvInstanceGroup[uuid:%s, name:%s] tanpa instance anggota. Harap buat setidaknya satu instance NFV dalam grup sebelum menyediakan.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10003": "ISO [%s] terpasang. Silakan lepaskan sebelum memasang ulang.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10006": "CPU tidak valid [CPU_ID], host [HOST_UUID] tidak memiliki CPU dengan ID yang ditentukan [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10030": "Tidak dapat menyediakan NfvInstanceGroup[uuid:%s, name:%s] tanpa Virtual IP dikonfigurasi. Harap konfigurasi Virtual IP untuk grup sebelum menyediakan.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10005": "URL harus dimulai dengan http:// atau https://, tetapi mendapatkan %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10004": "URL untuk Ocean endpoint harus dikonfigurasi untuk Penyimpanan Primer Alibaba Cloud EBS.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10019": "Nama[%s] tidak valid untuk sumber daya. Nama harus memenuhi persyaratan berikut:", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10013": "- Panjang antara 1 dan 128 karakter.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10012": "- Terdiri dari huruf besar dan kecil, angka, garis bawah (_), dan tanda hubung (-).", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10018": "- Dimulai dengan karakter alfabet (huruf).", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10028": "- Tidak dimulai atau diakhiri dengan spasi.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10017": "Tidak ada gateway BareMetal2 yang ditemukan di cluster[uuid:%s]", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10010": "gagal membuat CloudFile[%s] baru", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10029": "NfvInstanceGroup [uuid:%s] tidak ditemukan", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10026": "Tidak dapat melepaskan instance NFV[uuid:%s] dari grup[uuid:%s, name:%s] karena merupakan satu-satunya anggota. Grup harus berisi setidaknya satu anggota.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10027": "Tidak dapat melepaskan instance NFV [uuid:%s] dari grup [uuid:%s, name:%s] karena merupakan satu-satunya anggota yang berjalan. Minimal satu anggota tambahan harus dalam status Running.", + "ORG_ZSTACK_AI_10129": "Nilai null tidak terduga diperoleh dari %s dari token: %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10024": "instance NFV [uuid:%s] tidak ditemukan", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10016": "verifikasi signature input %s gagal untuk validasi sumber daya cloud", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10025": "Tidak dapat melepaskan instance NFV [uuid:%s] dari grup [uuid:%s, name:%s] karena tidak terkait saat ini. Status detail saat ini adalah %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10003": "penyimpanan backup [UUID: %s] tidak terkait dengan zona [UUID: %s], yang merupakan penyimpanan utama [UUID: %s] milik", + "ORG_ZSTACK_AI_10127": "Parameter mode tidak boleh kosong. Harap berikan nilai mode yang valid.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10011": "gagal mengalokasikan node compute di cluster[uuids:%s] untuk instance baremetal[uuid:%s]", + "ORG_ZSTACK_AI_10128": "nilai yang diizinkan saat ini adalah ['%s']", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10010": "gagal mengalokasikan gateway di cluster [uuids:%s] untuk instance baremetal [uuid:%s]", + "ORG_ZSTACK_AI_10125": "Klasifikasi model tidak valid: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10004": "volume[uuid:%s] telah dilampirkan ke VM yang berjalan. VM harus dihentikan sebelum melampirkan volume.", + "ORG_ZSTACK_AI_10126": "Konfigurasi tidak valid tersimpan untuk ModelServiceVO[uuid: %s]: %s", + "ORG_ZSTACK_AI_10123": "tidak dapat menemukan model center dengan UUID: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10015": "IP yang diprovisikan %s berada di luar rentang DHCP %s ~ %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10014": "IP yang diprovisikan %s telah ditempati oleh instance lain", + "ORG_ZSTACK_AI_10121": "Tidak ada instance Model Center yang ditemukan, harap buat instance Model Center terlebih dahulu.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10013": "Hanya cluster BareMetal2 [UUID:%s] yang memenuhi persyaratan untuk chassis dan gateway, tetapi cluster ini tidak memiliki jaringan terlampir yang diprovisikan.", + "ORG_ZSTACK_STORAGE_PRIMARY_10000": "tidak dapat melampirkan ISO ke penyimpanan utama [uuid:%s] yang dinonaktifkan", + "ORG_ZSTACK_AI_10122": "gagal membuat tag sistem untuk ModelServiceInstanceGroupVO[uuid: %s], karena %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10012": "tidak ditemukan node baremetal2 di cluster[uuid:%s]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10019": "jalur instalasi tidak valid: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10010": "menambahkan ID volume: %s, tetapi ID volume lain sudah ada di URL: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10012": "hostUuid [%s] sudah ada di URL: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10014": "URL instalasi tidak valid: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10015": "tidak dapat menemukan jalur perangkat di host: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10008": "Tidak ada Klaster Komputasi Baremetal2 yang ditemukan", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10002": "gagal membuat vHost User Client di host[uuid:%s] untuk vm[uuid:%s] : %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10007": "Detail tidak cukup untuk menentukan klaster BareMetal2 yang akan digunakan.%s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10006": "tidak ada penyimpanan cadangan yang terpasang pada zona [uuid:%s] yang berisi ISO [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10005": "tidak dapat menemukan gambar dengan UUID [%s] di penyimpanan cadangan yang terhubung. Silakan verifikasi hal berikut:", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10000": "gagal menghapus vHost User Client di host[uuid:%s] untuk vm[uuid:%s] : %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10009": "gagal mengalokasikan penyimpanan utama di klaster [uuids:%s] untuk instans bare metal [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_10014": "penyimpanan utama dengan UUID:%s tidak dapat dihapus karena masih terpasang pada klaster dengan UUID:%s.", + "ORG_ZSTACK_AI_10116": "Tidak dapat menemukan grup instans layanan apa pun di lingkungan cloud. Silakan verifikasi konfigurasi Anda.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10000": "instans baremetal2[uuid:%s] tidak ada atau tidak terhubung; oleh karena itu, kata sandinya tidak dapat diubah.", + "ORG_ZSTACK_AI_10117": "Tidak dapat menemukan kumpulan data dengan UUID [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_10016": "tidak dapat memasang volume[uuid:%s] yang penyimpanan utamanya sedang dalam perawatan", + "ORG_ZSTACK_AI_10114": "grup instans layanan model [UUID: %s] tidak ditemukan; memecah pemeriksaan kesiapan menunggu-pelayanan-mulai", + "ORG_ZSTACK_AI_10115": "Baik 'UUID grup' atau 'Sinkronkan Semua' harus diberikan", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10004": "tidak dapat menemukan gambar dengan UUID [%s] di penyimpanan cadangan yang terhubung yang terkait dengan zona UUID [%s]. Silakan verifikasi hal berikut:", + "ORG_ZSTACK_AI_10112": "Jenis layanan model tidak didukung: %s, tidak dapat menemukan backend yang sesuai untuk menangani operasi mulai ulang", + "ORG_ZSTACK_AI_10113": "grup instans layanan model [UUID: %s] tidak ditemukan, melewati alur tunggu-pelayanan-mulai", + "ORG_ZSTACK_AI_10111": "Tidak dapat menemukan instans layanan model[uuid: %s]", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10001": "Tidak dapat mengambil informasi antarmuka LLDP karena tidak dikonfigurasi untuk menerima data.", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10037": "Tidak dapat menemukan node yang diotorisasi berlisensi dengan UUID [%s]", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10003": "get LLDP reference for[%s] gagal", + "ORG_ZSTACK_STORAGE_PRIMARY_10018": "zoneUuids, clusterUuids, dan primaryStorageUuids masing-masing harus berisi setidaknya satu daftar non-kosong, atau semua nilai harus diatur ke true.", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10032": "Node yang tidak diotorisasi tidak boleh ada sebelum peningkatan ke lingkungan server berlisensi. Pastikan semua node memiliki lisensi yang valid sebelum proses peningkatan.", + "ORG_ZSTACK_STORAGE_PRIMARY_10017": "outputProtocol[%s] sudah ada di penyimpanan utama[%s], tidak perlu menambahkan lagi", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10033": "Beberapa node virtual berlisensi terkait tidak dihentikan.%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10085": "grup keamanan dengan UUID:%s belum dikaitkan dengan jaringan L3 UUID:%s, pelepasan tidak dimungkinkan", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10000": "Tidak dapat mengubah mode LLDP untuk antarmuka host yang berbeda", + "ORG_ZSTACK_STORAGE_PRIMARY_10019": "penyimpanan utama dengan UUID:%s belum terpasang ke klaster dengan UUID:%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10087": "tidak dapat menghapus aturan default[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10011": "Tidak dapat menghapus NfvInstanceGroup[uuid:%s, name:%s] ketika status adalah Beroperasi", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10086": "Tidak dapat menghapus aturan grup keamanan dari grup keamanan yang berbeda", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10089": "jaringan L3[uuid:%s] tidak memiliki jenis layanan jaringan[%s] yang diaktifkan", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10088": "grup keamanan dengan UUID:%s telah dikaitkan dengan jaringan L3 UUID:%s; oleh karena itu, tidak dapat dilampirkan kembali.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10010": "Tidak dapat membuat instance NFV, grup[uuid:%s, name:%s] sudah memiliki %d anggota, maksimal yang diizinkan adalah 3", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10026": "relativeTime[%s] tidak valid, melebihi nilai maksimum yang diizinkan", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10025": "relativeTime[%s] tidak valid; harus ditentukan dalam format seperti 10s atau 1h.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10008": "Tidak dapat membuat instance NFV saat grup [uuid:%s, name:%s] dalam mode Aktif. Harap ubah ke mode Pemeliharaan terlebih dahulu.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10009": "Tidak dapat membuat instance NFV saat grup[uuid:%s, name:%s] dalam status %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10006": "instance NFV %s [uuid: %s] dari grup instance NFV %s [uuid: %s] haStatus berubah dari %s ke %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10039": "volume vhost tidak mendukung lampiran ke bareMetalInstance2", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10038": "NIC dengan MAC:%s tidak dapat dilampirkan ke Jaringan L3 karena telah diikat", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10004": "Semua node tidak dalam status yang diharapkan untuk penerapan cloud. Harap periksa status semua node dan pastikan mereka memenuhi kondisi yang diperlukan untuk operasi.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10002": "membuat affinity group untuk grup instance NFV [uuid:%s] gagal", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10033": "customMAC wajib saat melampirkan jaringan L3 ke instance BareMetal.", + "ORG_ZSTACK_STORAGE_PRIMARY_10024": "penyimpanan utama[uuid: %s] tempat volume berada tidak diaktifkan atau terhubung", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10032": "Jenis jaringan L2 %s tidak didukung oleh instance Baremetal2.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10031": "Hanya jaringan Layer 3 dengan versi IP %d yang didukung oleh instance Baremetal2", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10031": "Hanya server lisensi yang berwenang untuk membatalkan pendaftaran instance klien berlisensi.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10030": "Instance Baremetal2[uuid:%s] belum dialokasikan node komputasi; harap mulai instance dan coba lagi.", + "ORG_ZSTACK_STORAGE_PRIMARY_10021": "penyimpanan utama dan klaster tidak berada di zona ketersediaan yang sama[uuid:%s] [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10037": "Alamat MAC %s sudah ditetapkan, harap coba yang lain", + "ORG_ZSTACK_STORAGE_PRIMARY_10020": "penyimpanan utama [uuid:%s] telah dilampirkan ke klaster [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10036": "instance baremetal2[uuid:%s] yang berjalan pada chassis[uuid:%s] tidak memiliki NIC non-provisioning dengan alamat MAC %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10023": "'UUID' dan 'Tipe' harus ditetapkan secara bersamaan untuk keduanya atau tidak sama sekali!", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10035": "alamat MAC duplikat %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10022": "URL[%s] sudah digunakan dan tidak dapat diduplikasi dalam klaster yang sama.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10034": "%s bukan alamat MAC yang valid", + "ORG_ZSTACK_AI_10130": "Nilai yang tidak terduga diperoleh: %s dari %s, nilai yang diharapkan berada dalam rentang yang telah ditentukan untuk metrik sumber daya cloud", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10026": "jenis lisensi %s tidak valid untuk lingkungan komputasi cloud", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10027": "Tidak boleh ada mesin virtual yang diotorisasi saat mendaftarkan server lisensi.%s", + "ORG_ZSTACK_STORAGE_PRIMARY_10029": "tidak dapat memesan %s byte pada penyimpanan utama[uuid:%s], kapasitas yang tersedia tidak mencukupi", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10093": "VM nics dengan UUID:%s tidak berada di jaringan L3 yang terkait dengan grup keamanan UUID:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_10028": "Setelah mengurangi kapasitas yang dipesan, penyimpanan utama dengan ukuran yang diperlukan tidak mencukupi, kemungkinan karena batas bawah untuk pengaturan kapasitas fisik penyimpanan utama.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10096": "tidak dapat menambahkan aturan grup keamanan karena UUID duplikat ada di remoteSecurityGroupUuids: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10095": "tidak dapat menambahkan aturan grup keamanan karena daftar aturan tidak boleh kosong atau melebihi jumlah maksimum %d", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10098": "UUID grup keamanan remote berkonflik dengan entri yang ada. Silakan verifikasi dan perbarui aturan grup keamanan.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10022": "Tidak dapat melepas instans NFV dari grup [uuid:%s, name:%s] saat dalam mode operasional Normal. Silakan beralih ke mode Pemeliharaan terlebih dahulu.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10097": "tidak dapat menambahkan aturan grup keamanan karena grup keamanan [uuid:%s] tidak ada", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10023": "Tidak dapat melepas instans NFV dari grup[uuid:%s, name:%s] ketika statusnya adalah %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10020": "Tidak dapat melampirkan instans NFV ke grup [uuid:%s, name:%s]. Status grup adalah %s dengan %d anggota. Pelampiran hanya diizinkan ketika: grup kosong atau dalam keadaan Sehat/Rusak dengan 1-2 anggota.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10099": "tidak dapat menambahkan aturan grup keamanan karena prioritas harus lebih besar dari %d atau sama dengan %d", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10018": "arah[%s] tidak valid, hanya arah yang didukung yang diizinkan", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10024": "jenis[%s] tidak valid, hanya jenis primitif atau jenis referensi yang umum digunakan yang diizinkan", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10019": "Tidak dapat melampirkan instans NFV ke grup [UUID: %s, Name: %s] ketika statusnya adalah %s", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10023": "nilai kanan[%s] tidak valid, harus berupa angka floating-point", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10029": "instans baremetal2[uuid:%s] tidak berhenti dan tidak dapat diubah ke penawaran chassis yang berbeda.", + "ORG_ZSTACK_STORAGE_PRIMARY_10030": "Setelah menghapus penyimpanan utama%s untuk dihindari, tidak ada kandidat penyimpanan utama yang tersedia lagi. Silakan periksa status dan keadaan penyimpanan utama dalam klaster.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10022": "nilai kanan[%s] tidak valid, harus berupa angka floating-point lebih dari nol dan kurang dari satu", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10017": "Tidak dapat melampirkan instans NFV [uuid:%s] ke grup [uuid:%s, name:%s]. Instans ini sudah menjadi bagian dari grup ini dengan status klaster %s. Pelampiran tidak diizinkan ketika instans berada dalam keadaan Pemimpin, Pengikut, Keluar, atau Kandidat Bergabung.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10021": "argumen %s tidak valid, tidak ada argumen yang diizinkan dalam konteks ini", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10018": "Tidak dapat melampirkan instans NFV ke grup [UUID:%s, Name:%s] saat dalam mode operasi Normal. Silakan beralih grup ke mode Pemeliharaan terlebih dahulu.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10020": "nilai kanan[%s] tidak valid, harus berupa jenis numerik yang valid (int, long, float, double) dalam lingkungan komputasi awan", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10015": "syncNfvInstGroup hanya diizinkan dalam Mode Pemeliharaan. Mode saat ini: %s. Silakan ubah ke Mode Pemeliharaan terlebih dahulu.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10013": "Tidak dapat mengubah mode operasi saat dalam keadaan INITIALIZING. Silakan pastikan grup sudah siap sebelum melakukan perubahan. Status saat ini: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10036": "PrimaryStorageTagAllocatorExtensionPoint[%s] mengembalikan nol kandidat penyimpanan utama yang memenuhi syarat", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10022": "Operasi saat ini tidak didukung pada instans baremetal lokal. Silakan pastikan operasi dilakukan dalam lingkungan virtualisasi.", + "ORG_ZSTACK_STORAGE_PRIMARY_10035": "PrimaryStorageFeatureAllocatorFlow[%s] mengembalikan nol kandidat penyimpanan utama yang layak", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10021": "Instans bare metal tidak diizinkan untuk mengubah pengaturan jaringan VM NIC-nya. Silakan pastikan Anda menggunakan jenis instans yang kompatibel.", + "ORG_ZSTACK_STORAGE_PRIMARY_10038": "%s tidak valid. %s bukan UUID instans yang valid", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10020": "Hanya mendukung jaringan VPC untuk melampirkan EIP ke instans BareMetal2.", + "ORG_ZSTACK_STORAGE_PRIMARY_10037": "penyimpanan primer [uuid:%s] tidak dalam keadaan terhubung, status saat ini adalah %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10026": "instance baremetal2[uuid:%s] beroperasi tetapi agennya tidak terhubung.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10025": "instance baremetal2[uuid:%s] tidak dimatikan", + "ORG_ZSTACK_STORAGE_PRIMARY_10034": "tidak dapat menemukan penyimpanan primer dengan tag yang ditentukan pengguna[%s]. Tag yang ditentukan pengguna ditentukan dalam penawaran instance atau penawaran disk.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10024": "instance baremetal2[uuid:%s] tidak terhubung", + "ORG_ZSTACK_STORAGE_PRIMARY_10033": "tidak dapat menemukan penyimpanan primer[uuid:%s], UUID ditentukan dalam spesifikasi penawaran instance atau penawaran disk", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10023": "Operasi tidak didukung pada instance BareMetal2. Harap pastikan kompatibilitas dengan lingkungan virtualisasi.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10051": "baremetal2 chassis dengan UUID:%s tidak ada", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10050": "tidak perlu menetapkan chassisOfferingUuid karena instance sudah ditetapkan ke chassis offering", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10021": "tidak dapat menetapkan security group VM NIC karena security group yang ditentukan [uuid:%s] bukan milik akun Anda [uuid:%s] atau administrator", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10020": "tidak dapat menetapkan security group VM NIC karena duplikat security group [uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10023": "tidak dapat menetapkan security group VM NIC karena prioritas tidak valid; diharapkan prioritas berurutan, tetapi ditemukan %d dan %d", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10022": "tidak dapat menetapkan security group VM NIC karena prioritas tidak valid; prioritas diharapkan dimulai dari 1, tetapi [%d]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10025": "tidak dapat menetapkan security group VM NIC karena prioritas security group admin [%d] harus lebih tinggi dari grup pengguna", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10027": "tidak dapat mengubah status aturan security group karena security group [uuid:%s] tidak ditemukan", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10026": "Tidak dapat memperbarui status aturan security group karena daftar UUID Aturan kosong. Harap berikan UUID Aturan yang valid untuk melanjutkan.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10029": "Tidak dapat memodifikasi status aturan security group karena tidak ada aturan security group yang memerlukan perubahan status.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10028": "tidak dapat mengubah status aturan security group karena aturan security group[uuid:%s] tidak ditemukan", + "ORG_ZSTACK_ZWATCH_10004": "Beberapa pesan telah kedaluwarsa dan tidak diizinkan untuk dimodifikasi karena batasan sistem. Sistem akan secara otomatis membersihkan pesan kedaluwarsa ini. Harap coba operasi Anda di lain waktu.", + "ORG_ZSTACK_ZWATCH_10003": "jenis tindakan tidak valid: %s, hanya mendukung operasi write atau delete", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10054": "baremetal2 chassis[uuid:%s] sudah dialokasikan ke sumber daya lain.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10053": "baremetal2 chassis[uuid:%s] tidak diaktifkan", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10052": "baremetal2 chassis[uuid:%s] tidak terkait dengan chassis offering[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10059": "Harap jangan menetapkan UUID Chassis dan UUID Chassis Offering secara bersamaan.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10057": "cluster[uuid:%s] ditentukan tetapi bukan cluster Baremetal2 yang diaktifkan; oleh karena itu, instance Baremetal2 tidak dapat dibuat darinya.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10056": "zone[uuid:%s] ditentukan tetapi tidak diaktifkan; oleh karena itu, instance baremetal2 tidak dapat dibuat darinya.", + "ORG_ZSTACK_AI_SERVICE_10001": "Gagal menemukan VO Application Development Service dengan UUID layanan model: %s dan UUID akun: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10040": "Ceph pihak ketiga tidak dapat dicampur dengan jenis penyimpanan primer lainnya. Harap pastikan konsistensi dalam konfigurasi penyimpanan Anda.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10030": "Gagal memodifikasi kebijakan VM NIC karena kebijakan ingress dan egress tidak boleh null. Harap pastikan setidaknya satu kebijakan ditentukan.", + "ORG_ZSTACK_ZWATCH_10002": "invalid zwatch return with clause: %s, %s", + "ORG_ZSTACK_ZWATCH_10001": "parameter tidak diketahui[%s] dalam klausa return zwatch, harap pastikan itu adalah parameter yang valid untuk lingkungan komputasi cloud yang ditentukan", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10032": "tidak dapat mengubah kebijakan keamanan VM NIC karena kebijakan egress tidak valid[%s]", + "ORG_ZSTACK_AI_SERVICE_10005": "Tidak ada tugas yang memerlukan pengujian, tandai sebagai kegagalan.%s", + "ORG_ZSTACK_AI_SERVICE_10004": "Tidak dapat menemukan instance layanan; harap pastikan instance tersebut dibuat dengan benar dan dikaitkan dengan tugas evaluasi Anda. Pengajuan tugas gagal.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10031": "tidak dapat mengubah kebijakan keamanan VM NIC karena aturan ingress tidak valid[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10034": "tidak dapat mengubah kebijakan keamanan VM NIC karena VM NIC [UUID:%s] tidak memiliki kebijakan keamanan yang terkait", + "ORG_ZSTACK_AI_SERVICE_10003": "tidak dapat menemukan grup layanan dengan UUID [%s] yang tersedia untuk mengajukan tugas evaluasi, laporkan kegagalan", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10033": "tidak dapat mengubah kebijakan keamanan VM NIC karena VM NIC [uuid:%s] tidak ditemukan", + "ORG_ZSTACK_AI_SERVICE_10002": "Grup instance layanan model [UUID: %s] untuk pengujian tidak memiliki URL yang tersedia.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10036": "tidak dapat memperbarui prioritas aturan grup keamanan karena grup keamanan [uuid:%s] tidak ada", + "ORG_ZSTACK_AI_SERVICE_10008": "Semua instance komputasi gagal memulai.%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10035": "tidak dapat memperbarui prioritas aturan grup keamanan karena jenis tidak valid[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10038": "tidak dapat memperbarui prioritas aturan grup keamanan karena jumlah aturan dalam grup keamanan [uuid:%s] tidak cocok dengan jumlah yang diharapkan", + "ORG_ZSTACK_AI_SERVICE_10006": "Kesalahan saat memulai evaluasi pada %s, karena %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10037": "Tidak dapat memperbarui prioritas aturan grup keamanan karena daftar aturan kosong. Harap pastikan ada aturan yang didefinisikan sebelum mencoba operasi ini.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10039": "tidak dapat memperbarui prioritas aturan grup keamanan karena prioritas aturan[%d] tidak valid", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10049": "tidak perlu mengatur chassisOfferingUuid karena instance sudah ditetapkan ke chassis", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10004": "gagal mengambil informasi lisensi untuk penyimpanan utama [%s], karena data respons menunjukkan tidak ada lisensi aktif yang tersedia", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10044": "gateway baremetal2 dengan UUID: %s bukan bagian dari cluster dengan UUID: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10043": "gateway baremetal2 dengan UUID: %s tidak ada atau tidak diaktifkan atau terhubung", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10042": "cluster[uuid:%s] bukan cluster baremetal2 yang diaktifkan, tidak dapat memulai instance[uuid:%s] di dalamnya", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10041": "instance provisi jarak jauh tidak mendukung pemasangan NIC provisi ke bond %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10047": "penawaran chassis baremetal2[uuid:%s] tidak diaktifkan", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10046": "penawaran chassis baremetal2 [UUID:%s] tidak ada", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10045": "Harap tentukan UUID chassis atau UUID penawaran chassis untuk memulai Instance Baremetal [uuid:%s].", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10029": "waktu pembuatan snapshot habis, kemajuan adalah %d%", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10028": "PrimaryStorage EBS tidak mendukung pengurangan ukuran saat ini.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10073": "gambar[uuid:%s] berformat: %s, hanya format yang didukung untuk instance BareMetal2 adalah %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10072": "gambar[uuid:%s] memiliki tipe media: %s; hanya template volume root yang dapat digunakan untuk membuat instance baremetal.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10041": "tidak dapat memperbarui prioritas aturan grup keamanan karena aturan dengan UUID:%s tidak dikaitkan dengan grup keamanan dengan UUID:%s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10071": "gambar[uuid:%s] belum siap, tidak dapat membuat instance baremetal2 darinya", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10040": "tidak dapat memperbarui prioritas aturan grup keamanan karena prioritas[%d] terduplikasi", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10070": "gambar[uuid:%s] tidak diaktifkan; oleh karena itu, instance baremetal2 tidak dapat dibuat darinya.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10043": "tidak dapat memperbarui prioritas aturan grup keamanan karena UUID aturan duplikat sudah ada", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10021": "jalur instalasi snapshot tidak valid: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10042": "tidak dapat memperbarui prioritas aturan grup keamanan karena prioritas [%d] yang ditentukan tidak ada dalam grup keamanan [uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10045": "tidak dapat memodifikasi aturan grup keamanan karena aturan yang ditentukan adalah aturan default; hanya deskripsi dan status yang dapat diperbarui", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10044": "tidak dapat memodifikasi aturan grup keamanan karena aturan grup keamanan yang ditentukan dengan UUID[%s] tidak ada", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10022": "Penyimpanan utama Alibaba Cloud EBS[UUID:%s, Name:%s] tidak dapat menemukan host yang tersedia dalam kluster yang dilampirkan untuk menginstansiasi volume.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10047": "tidak dapat memodifikasi aturan grup keamanan karena grup keamanan %s telah melebihi batas maksimum %d aturan", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10025": "tidak dapat menemukan snapshot dari gambar: %s, kemungkinan gambar telah dihapus", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10046": "tidak dapat memodifikasi aturan grup keamanan karena prioritas aturan [%s] tidak dapat diatur ke prioritas aturan default [%d]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10024": "Lingkungan cloud tidak didukung", + "ORG_ZSTACK_COMPUTE_CPUPINNING_10002": "Cpuset [%s] yang ditentukan untuk konfigurasi instance tidak valid. Harap pastikan cpuset valid dan mengacu pada kumpulan inti CPU yang benar.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10049": "tidak dapat memodifikasi aturan grup keamanan karena status[%s] tidak valid", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10027": "gagal menginstal tdc pada host berikut: [%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10048": "tidak dapat memodifikasi aturan grup keamanan karena batas prioritas maksimum %s aturan adalah [%d]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10026": "gagal membangun koneksi dengan kluster berikut: [%s]", + "ORG_ZSTACK_COMPUTE_CPUPINNING_10000": "referensi CPU pinning[%s] tidak valid. Contoh yang benar adalah [1,3:3-6,^5] atau [1-2,4:6].", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10004": "tidak dapat menghasilkan vhost-user client untuk mesin virtual [uuid:%s] pada host tujuan [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10077": "arsitektur kluster baremetal2[arch:%s] dan gambar[arch:%s] tidak cocok", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10076": "Mode boot berbeda terdeteksi antara instance dan gambar atau penawaran. Harap pastikan keduanya cocok.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10075": "hanya gambar dengan mode boot %s yang didukung untuk membuat instance Baremetal2", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10074": "gambar[uuid:%s] bukan gambar BareMetal2; oleh karena itu, tidak dapat digunakan untuk membuat instance BareMetal2.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10079": "Penyimpanan utama untuk volume root dan penyimpanan utama untuk volume data harus berada dalam kluster yang sama.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10078": "Tidak semua penawaran disk [UUIDs:%s] diaktifkan; oleh karena itu, instance BareMetal2 tidak dapat dibuat darinya.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10050": "tidak dapat memodifikasi aturan grup keamanan karena tindakan[%s] tidak valid", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10062": "penawaran sasis baremetal2[uuid:%s] tidak diaktifkan; oleh karena itu, instance baremetal2 tidak dapat dibuat darinya.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10061": "sasis baremetal2[uuid:%s] tidak tersedia; oleh karena itu, instance baremetal2 tidak dapat dibuat darinya.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10060": "sasis baremetal2 dengan UUID:%s tidak diaktifkan; oleh karena itu, instance baremetal2 tidak dapat dibuat darinya.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10051": "tidak dapat memodifikasi aturan grup keamanan karena protokol tidak valid [%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10054": "tidak dapat memodifikasi aturan grup keamanan karena rentang IP sumber [%s] ditentukan; UUID grup keamanan jarak jauh [%s] harus dibiarkan kosong", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10031": "Aliyun EBS PrimaryStorage hanya mendukung tipe Aliyun EBS BS, tipe yang diperoleh: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10056": "tidak dapat memodifikasi aturan egress grup keamanan karena rentang IP sumber tidak dapat ditentukan untuk tipe Egress", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10034": "sumber daya [uuid: %s] tidak dapat ditemukan", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10055": "tidak dapat memodifikasi aturan ingress grup keamanan karena dstIpRange tidak dapat ditentukan untuk aturan ini [%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10058": "tidak dapat memodifikasi aturan grup keamanan karena grup keamanan jarak jauh [uuid:%s] tidak ditemukan", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10057": "tidak dapat memodifikasi aturan grup keamanan karena rentang IP tujuan [%s] ditentukan; UUID grup keamanan jarak jauh [%s] harus dibiarkan kosong", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10059": "tidak dapat memodifikasi aturan grup keamanan karena grup keamanan jarak jauh [UUID:%s] dikonfigurasi; rentang IP sumber dan rentang IP tujuan harus kosong", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10066": "gambar tidak boleh kosong kecuali chassis dalam mode langsung", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10065": "gateway baremetal2 dengan UUID: %s tidak berada dalam cluster yang sama dengan chassis dengan UUID: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10064": "gateway baremetal2 [UUID: %s] tidak terhubung; oleh karena itu, instance baremetal2 tidak dapat dibuat darinya", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10063": "gateway baremetal2 dengan UUID:%s tidak diaktifkan; oleh karena itu, instance baremetal2 tidak dapat dibuat darinya", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10069": "Disk chassis[%s] tidak memiliki kapasitas yang cukup untuk gambar[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10068": "gambar[uuid:%s] tidak ada di repositori gambar", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10067": "Mode langsung tidak mendukung pemilihan gambar", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREBLOCK_10000": "shareblock menunjukkan bahwa host %s tidak dapat dijangkau pada %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10100": "tidak dapat menambahkan aturan grup keamanan karena protokol tidak valid [%s]; protokol yang valid adalah %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10102": "tidak dapat menambahkan aturan grup keamanan karena versi IP tidak valid [%d] ditentukan; versi yang valid adalah %d/%d", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10101": "tidak dapat menambahkan aturan grup keamanan karena tindakan tidak valid [%s]; tindakan yang valid termasuk %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10104": "tidak dapat menambahkan aturan grup keamanan karena CIDR yang diizinkan [%s] dan rentang IP tujuan [%s] bentrok", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10103": "tidak dapat menambahkan aturan grup keamanan karena rentang IP sumber [%s] tidak diizinkan untuk ditetapkan untuk aturan egress", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10106": "tidak dapat menambahkan aturan grup keamanan karena rentang IP tujuan[%s] tidak diizinkan untuk ditetapkan untuk aturan ingress", + "ORG_ZSTACK_COMPUTE_HOST_10041": "gagal memeriksa VLAN ID [%s] untuk jaringan bonding [%s] pada host KVM [UUID: %s], %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10105": "tidak dapat menambahkan aturan grup keamanan karena rentang IP[%s] dan UUID Grup Keamanan Jarak Jauh[%s] bentrok", + "ORG_ZSTACK_COMPUTE_HOST_10043": "gagal memverifikasi VLAN ID [%s] untuk antarmuka jaringan [%s] pada host KVM [UUID: %s], %s", + "ORG_ZSTACK_VPC_10048": "alamat dns [%s] telah ditambahkan ke router VPC [uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10107": "tidak dapat menambahkan aturan grup keamanan karena CIDR yang diizinkan [%s] bentrok dengan rentang IP sumber [%s]", + "ORG_ZSTACK_VPC_10047": "jaringan L3 vPC harus dikaitkan dengan vRouter vPC sebelum melakukan operasi terkait vRouter (seperti memulai/menghentikan VM, membuat load balancer, dll.)", + "ORG_ZSTACK_ALIYUN_CORE_10022": "status tugas snapshot sudah selesai %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10109": "tidak dapat menambahkan aturan grup keamanan karena tipe protokol ALL atau ICMP tidak dapat menetapkan dstPortRange[%s]", + "ORG_ZSTACK_ALIYUN_CORE_10023": "Operasi tidak didukung untuk instans HybridClient. Silakan gunakan jenis klien yang kompatibel.", + "ORG_ZSTACK_ALIYUN_CORE_10021": "tugas snapshot tidak dapat diselesaikan dalam %d milidetik, kemajuan saat ini adalah %d%, status adalah %s", + "ORG_ZSTACK_ALIYUN_CORE_10026": "Titik akhir API Ocean tidak boleh null. Silakan berikan titik akhir yang valid.", + "ORG_ZSTACK_VPC_10042": "tidak didukung untuk mengambil status layanan %s pada router virtual %s", + "ORG_ZSTACK_COMPUTE_HOST_10048": "gagal memperbarui IP bonding, karena %s", + "ORG_ZSTACK_VPC_10041": "tidak dapat menetapkan status perutean terdistribusi ke router virtual %s", + "ORG_ZSTACK_ALIYUN_CORE_10024": "accessKey dan secretAccessKey harus dikonfigurasi", + "ORG_ZSTACK_VPC_10040": "tidak dapat mengambil koneksi untuk perutean terdistribusi ke router virtual %s", + "ORG_ZSTACK_COMPUTE_HOST_10044": "gagal menetapkan jenis layanan[%s] untuk bonding jaringan[%s] pada host KVM[UUID: %s], %s", + "ORG_ZSTACK_VPC_10045": "tidak didukung untuk memperbarui status layanan %s ke router virtual %s", + "ORG_ZSTACK_COMPUTE_HOST_10047": "gagal memperbarui IP antarmuka karena %s", + "ORG_ZSTACK_COMPUTE_HOST_10046": "gagal menetapkan jenis layanan[%s] untuk antarmuka jaringan[%s] pada host KVM[UUID: %s], %s", + "ORG_ZSTACK_VPC_10043": "tidak dapat mengambil status perutean terdistribusi ke router virtual %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10111": "tidak dapat menambahkan aturan grup keamanan karena port akhir [%d] harus lebih besar dari atau sama dengan port awal [%d]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10110": "Tipe protokol ALL atau ICMP tidak mendukung penetapan startPort atau endPort. Pastikan protokol sesuai untuk konfigurasi aturan grup keamanan Anda.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10113": "Tipe protokol TCP/UDP memerlukan rentang port tujuan untuk ditentukan. Silakan berikan rentang port yang diperlukan dan coba lagi.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10112": "tidak dapat menambahkan aturan grup keamanan karena dstPortRange[%s] bentrok dengan startPort[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10115": "tidak dapat menambahkan aturan grup keamanan karena aturan duplikat[%s] sudah ada di database untuk grup keamanan yang ditentukan", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10114": "tidak dapat menambahkan aturan grup keamanan karena aturan [%s] dan [%s] duplikat", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10117": "tidak dapat menambahkan aturan grup keamanan karena grup keamanan %s telah mencapai batas maksimum %d aturan", + "ORG_ZSTACK_COMPUTE_HOST_10052": "gagal mengambil ID VLAN untuk host [UUID:%s] : %s", + "ORG_ZSTACK_VPC_10039": "tidak dapat menambahkan rentang IPv6 ke jaringan L3 [uuid:%s], karena tumpang tindih dengan CIDR [%s] dari router virtual [uuid:%s]", + "ORG_ZSTACK_ALIYUN_IMAGE_10002": "Operasi terbatas pada gambar kustom saja.", + "ORG_ZSTACK_CORE_CONFIG_10002": "Tidak dapat menemukan Konfigurasi Global[kategori: %s, nama: %s]", + "ORG_ZSTACK_VPC_10038": "tidak dapat menambahkan rentang IP ke jaringan L3 [UUID:%s], karena tumpang tindih dengan CIDR [%s] dari router virtual [UUID:%s]", + "ORG_ZSTACK_ALIYUN_IMAGE_10003": "Hanya disk primer yang dapat membuat cermin.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10119": "tidak dapat menambahkan aturan grup keamanan karena grup keamanan %s telah melebihi batas maksimum %d aturan", + "ORG_ZSTACK_NETWORK_PLUGIN_10001": "melepaskan gratuitous ARP karena:%s", + "ORG_ZSTACK_VPC_10037": "alamat dns [%s] tidak terkait dengan router vpc [uuid:%s]", + "ORG_ZSTACK_VPC_10036": "dns[%s] bukan alamat IP yang valid", + "ORG_ZSTACK_CORE_CONFIG_10004": "Jangan izinkan melewati verifikasi untuk sumber daya cloud.", + "ORG_ZSTACK_NETWORK_PLUGIN_10000": "kesalahan apply gratuitous ARP karena:%s", + "ORG_ZSTACK_ALIYUN_IMAGE_10001": "Gambar yang dimaksud sedang diimpor ke datacenter sekarang...", + "ORG_ZSTACK_ALIYUN_CORE_10011": "tidak dapat memasukkan file dengan panjang nol sebagai gambar VM!", + "ORG_ZSTACK_ALIYUN_IMAGE_10006": "Hanya mendukung Image-based Storage Backup Service", + "ORG_ZSTACK_ALIYUN_IMAGE_10007": "Nama gambar tidak boleh dimulai dengan http:// atau https://. Harap gunakan nama gambar yang valid.", + "ORG_ZSTACK_ALIYUN_IMAGE_10004": "tidak ada OSS bucket yang terkait dengan datacenter: %s", + "ORG_ZSTACK_ALIYUN_IMAGE_10005": "Tidak dapat menghapus gambar sistem ECS secara remote", + "ORG_ZSTACK_VPC_10031": "L2 network [UUID: %s] dari L3 network [UUID: %s] tidak terpasang ke cluster [UUID: %s]", + "ORG_ZSTACK_VPC_10030": "tidak ada rentang IP yang terpasang ke L3 network[uuid:%s]", + "ORG_ZSTACK_ALIYUN_CORE_10016": "Harap berikan pengidentifikasi sumber daya cloud yang valid!", + "ORG_ZSTACK_ALIYUN_CORE_10013": "Izin ditolak untuk: %s", + "ORG_ZSTACK_VPC_10035": "L3 network [UUID:%s] harus dipasang terlebih dahulu karena berisi VIP.", + "ORG_ZSTACK_COMPUTE_HOST_10055": "cluster[uuids:%s, hypervisorType:%s] tidak ada!", + "ORG_ZSTACK_VPC_10034": "Alamat IP statis yang ditentukan [%s] tidak cocok dengan gateway IP [%s] dari Layer 3 network [UUID: %s].", + "ORG_ZSTACK_ALIYUN_CORE_10017": "Eksekusi kode Java gagal, Kode Kesalahan: %s, Pesan Kesalahan: %s", + "ORG_ZSTACK_COMPUTE_HOST_10058": "host[uuid:%s] tidak dapat menemukan sumber daya yang ditentukan", + "ORG_ZSTACK_VPC_10033": "gateway dari l3 network [uuid:%s] telah ditempati oleh instance/ip lain:%s", + "ORG_ZSTACK_ALIYUN_CORE_10018": "Perangkat Tidak Siap dalam waktu %d milidetik", + "ORG_ZSTACK_VPC_10032": "jaringan publik [UUID: %s] VIP [UUID: %s, IP: %s] tidak dapat melakukan peer dengan L3 network [UUID: %s] karena tidak terletak di VPC VR [UUID: %s]", + "ORG_ZSTACK_COMPUTE_HOST_10019": "hanya mendukung melakukan live snapshot pada VM saat berada dalam keadaan [%s], tetapi VM saat ini berada dalam keadaan [%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10120": "tidak dapat menambahkan aturan grup keamanan karena prioritas[%d] harus berurutan; prioritas maksimum yang diizinkan untuk aturan ingress adalah [%d].", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10000": "gagal mengambil informasi lisensi primary storage[%s] karena tidak ada alamat IP monitoring", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10001": "gagal mengambil informasi lisensi untuk primary storage[%s], karena tidak ada data yang dikembalikan", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10122": "Gagal menerapkan aturan grup keamanan ke instance saat ini[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10002": "gagal mengambil informasi lisensi primary storage [%s] karena waktu kedaluwarsa null", + "ORG_ZSTACK_ALIYUN_IMAGE_10008": "tidak ada backup storage yang dikonfigurasi untuk image UUID: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10121": "tidak dapat menambahkan aturan grup keamanan karena prioritas[%d] harus berurutan; prioritas maksimum yang diizinkan untuk aturan egress adalah [%d].", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10003": "gagal mengurai format tanggal[%s] dari informasi lisensi primary storage[%s]", + "ORG_ZSTACK_ALIYUN_IMAGE_10009": "melebihi kapasitas penyimpanan cadangan untuk imageUuid: %s, harap tentukan secara manual", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10124": "layanan jaringan[tipe:%s] tidak diaktifkan pada jaringan l3[uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10123": "Gagal menerapkan aturan grup keamanan ke beberapa mesin virtual", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10125": "gagal mengubah prioritas aturan[uuid:%s] karena tidak ditemukan", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10128": "layanan jaringan[tipe:%s] tidak diaktifkan pada jaringan l3[uuid:%s] yang terkait dengan nic[uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10127": "nic vm dengan UUID:%s telah dilampirkan ke grup keamanan dengan UUID:%s", + "ORG_ZSTACK_ALIYUN_IMAGE_10011": "gambar [%s] tidak diaktifkan saat ini", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10129": "grup keamanan dengan UUID [%s] bukan milik akun Anda dengan UUID [%s] atau administrator", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10004": "ID virtual[uuid:%s] tidak termasuk dalam organisasi[uuid:%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10005": "organisasi[uuid:%s] sudah memiliki pengawas yang ditunjuk", + "ORG_ZSTACK_ALIYUN_CORE_10001": "menambahkan endpoint ke SDK gagal, karena: %s", + "ORG_ZSTACK_ALIYUN_CORE_10005": "accessKey dan secretAccessKey harus dikonfigurasi!", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10003": "ID virtual[uuid:%s] tidak ada", + "ORG_ZSTACK_COMPUTE_HOST_10028": "nic[%s] telah dihapus", + "ORG_ZSTACK_COMPUTE_HOST_10023": "kesalahan operasi, karena %s", + "ORG_ZSTACK_ALIYUN_CORE_10009": "tidak dapat menemukan access key id atau secret access key dari msg", + "ORG_ZSTACK_ALIYUN_IMAGE_10010": "platform yang valid:[%s] untuk import gambar Aliyun, nilai yang valid adalah: [%s]", + "ORG_ZSTACK_ALIYUN_CORE_10006": "Identifier wilayah harus ditentukan!", + "ORG_ZSTACK_COMPUTE_HOST_10038": "menghapus file mesin virtual gagal: %s", + "ORG_ZSTACK_COMPUTE_HOST_10037": "mengatur file konfigurasi mesin virtual gagal: %s", + "ORG_ZSTACK_COMPUTE_HOST_10039": "menerapkan memory balloon gagal: %s", + "ORG_ZSTACK_COMPUTE_HOST_10036": "mengatur hostname VM gagal: %s", + "ORG_ZSTACK_COMPUTE_HOST_10035": "menyinkronkan konfigurasi port VM gagal: %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10009": "label tidak valid, kolom 'op' kosong atau bukan Regex atau Equal yang valid. %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10008": "label tidak valid, kolom 'key' tidak boleh kosong. Harap berikan nilai key yang valid.%s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10007": "string ValueCondition[%s] memerlukan 'value' sebagai kunci", + "ORG_ZSTACK_ZWATCH_DATATYPE_10006": "string label[%s] tidak mengandung operasi yang valid", + "ORG_ZSTACK_COMPUTE_VM_10319": "VmInstanceDestroyVmExtensionPoint[%s] menolak untuk menghentikan vm[uuid:%s] karena %s", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10006": "Jenis volume [%s] tidak valid.", + "ORG_ZSTACK_COMPUTE_VM_10318": "VmInstanceRebootExtensionPoint[%s] menolak untuk memulai ulang vm[uuid:%s] karena %s", + "ORG_ZSTACK_COMPUTE_VM_10317": "VmInstanceStartNewCreatedVmExtensionPoint[%s] menolak untuk meluncurkan VM[uuid:%s] karena %s", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10004": "Gagal mengambil ID snapshot untuk volume %s di Ceph PS[uuid:%s].", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10002": "Gagal memverifikasi jalur instalasi volume %s di pool Ceph [uuid:%s].", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10001": "tidak dapat menemukan pool yang ditentukan[PoolName:%s] dari respons layanan pool: %s", + "ORG_ZSTACK_VPC_10006": "VIP[uuid:%s] tidak ditemukan di lingkungan cloud", + "ORG_ZSTACK_VPC_10005": "tidak dapat melampirkan IPv6 EIP karena tipe gambar dari virtual router [UUID:%s] bukan %s", + "ORG_ZSTACK_VPC_10003": "tidak dapat membuat koneksi SSH ke VPC router[%s], port SSH tampaknya tertutup", + "ORG_ZSTACK_VPC_10009": "VMNic[uuid:%s] tidak ditemukan", + "ORG_ZSTACK_VPC_10008": "EIP dengan UUID:%s tidak ditemukan", + "ORG_ZSTACK_COMPUTE_VM_10316": "Tidak dapat menemukan host VM. Silakan mulai mesin virtual [%s] lalu coba pasang disk.", + "ORG_ZSTACK_COMPUTE_HOST_10005": "gagal mengatur tugas sinkronisasi jam pada host[uuid:%s]", + "ORG_ZSTACK_ZWATCH_DATATYPE_10001": "ekspresi tidak valid: %s, tidak ada fungsi terkait yang ditemukan dalam konteks komputasi cloud atau pengaturan virtualisasi", + "ORG_ZSTACK_COMPUTE_HOST_10004": "host[uuid:%s, name:%s] dalam keadaan[%s], tidak dapat melakukan operasi yang diperlukan", + "ORG_ZSTACK_COMPUTE_VM_10315": "kesalahan gateway, perkiraan: %s, aktual: %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10000": "fungsi tidak valid: %s, tipe parameter tidak valid untuk lingkungan komputasi cloud", + "ORG_ZSTACK_COMPUTE_VM_10314": "kesalahan panjang prefix ipv6, nilai yang diharapkan antara %s dan %s, diterima: %s", + "ORG_ZSTACK_COMPUTE_VM_10313": "Panjang prefix IPv6 harus dikonfigurasi", + "ORG_ZSTACK_VPC_10002": "gateway dari jaringan L3 [UUID: %s] telah diduduki pada VPC VR [UUID: %s]", + "ORG_ZSTACK_COMPUTE_VM_10311": "kesalahan netmask, perkiraan: %s, diterima: %s", + "ORG_ZSTACK_COMPUTE_HOST_10000": "sinkronisasi informasi GPU gagal: %s", + "ORG_ZSTACK_VPC_10001": "Tidak ada rentang IP untuk jaringan Layer 3[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10310": "Subnet mask harus ditentukan.", + "ORG_ZSTACK_VPC_10000": "tidak dapat melepas NIC dari VPC VR[uuid:%s]", + "ORG_ZSTACK_COMPUTE_HOST_10009": "gagal mengalokasikan perangkat PCI untuk host[uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10051": "Format URI tidak valid. Contoh yang benar: ceph:/// atau volume://", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10050": "Ceph ps[uuid=%s] Root Pool Name Tidak Ditemukan", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10052": "kesalahan rantai hapus volume, lanjutkan dengan penghapusan volume", + "ORG_ZSTACK_COMPUTE_VM_10320": "VmInstanceStartExtensionPoint[%s] menolak untuk memulai mesin virtual[uuid:%s] karena %s", + "ORG_ZSTACK_COMPUTE_HOST_10013": "networkInterface[name:%s] dari instance[uuid:%s] tidak dapat ditemukan", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10008": "enkripsi %s[id:%s] gagal: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_SMP_10000": "penyimpanan utama mount point bersama[uuid:%s, name:%s] tidak dapat menemukan host yang tersedia dalam klaster komputasi yang terhubung", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10005": "operasi tidak didukung untuk EncryptColumnIntegrityFactory dalam lingkungan komputasi awan", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10002": "%s[%s] kesalahan verifikasi integritas, karena: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10000": "%s[%s] kesalahan enkripsi karena:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10017": "tidak dapat menemukan host KVM yang terhubung untuk melakukan operasi; tampaknya semua host dalam klaster yang terhubung dengan penyimpanan mount point bersama[uuid:%s] terputus.", + "ORG_ZSTACK_VPC_10027": "tidak dapat melampirkan jaringan L3 ke router VPC[UUID:%s] karena statusnya bukan berjalan atau berhenti", + "ORG_ZSTACK_VPC_10025": "jaringan VPC [uuid:%s] sudah terhubung ke router VPC [uuid:%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10013": "URL berisi jalur direktori tidak valid [%s]. Jalur yang valid harus dalam sistem file instance dan tidak menyertakan direktori khusus seperti /dev, /proc, atau /sys. Pastikan URL yang disediakan benar.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10042": "mendapatkan watcher gambar RBD volume root gagal, %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10041": "konflik pool CEPH, pool CEPH yang ditentukan oleh penawaran disk adalah %s, dan pool CEPH yang ditentukan dalam parameter pembuatan adalah %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10010": "volume[uuid:%s] memiliki referensi ke volume[%s]; oleh karena itu, tipe volume tidak dapat diubah sebelum meratakan volume dan turunannya.", + "ORG_ZSTACK_VPC_10029": "tidak dapat melampirkan jaringan L3 ke router VPC[UUID:%s] karena baik statusnya maupun status peer tidak berjalan maupun berhenti", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10044": "tidak dapat menemukan pool penyimpanan utama Ceph[poolName=%s]", + "ORG_ZSTACK_VPC_10020": "jaringan l3 [uuid:%s] tidak dapat dilepaskan dari router vpc [uuid:%s] karena layanan jaringan yang dilampirkan ke VIP [%s] masih digunakan.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10043": "volume root[%s] sudah digunakan (menunjukkan bahwa gambar Ceph RBD[%s] memiliki watcher aktif), untuk mencegah skenario split-brain, memulai VM dilarang.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10046": "tidak dapat mengalokasikan pool penyimpanan untuk penyimpanan utama[%s], tujuan: %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10045": "pool penyimpanan utama ceph[poolName=%s] memiliki kapasitas virtual yang tersedia tidak cukup untuk mengakomodasi ukuran yang diminta %s.", + "ORG_ZSTACK_VPC_10024": "hanya jaringan L3 VPC yang dapat dilampirkan ke vRouter VPC.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10047": "tidak dapat memperbarui status node MON penyimpanan utama Ceph [UUID:%s], karena sudah dihapus. Peringatan ini dapat diabaikan.", + "ORG_ZSTACK_VPC_10023": "gambar dari penawaran router virtual [uuid: %s] hilang", + "ORG_ZSTACK_VPC_10022": "penawaran router virtual dengan UUID: %s tidak diaktifkan", + "ORG_ZSTACK_VPC_10021": "jaringan L3 VPC [UUID:%s] tidak dapat dilepaskan dari router VPC [UUID:%s] karena NIC VM [%s] masih digunakan.", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10006": "operasi tidak didukung di lingkungan awan. Pastikan Anda menggunakan API yang didukung untuk operasi komputasi awan.", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10005": "parameter hilang, virtualMachineInstanceUuid: %s diminta", + "ORG_ZSTACK_VPC_10017": "jaringan publik tidak dapat dilepaskan dari cloud privat virtual asli.", + "ORG_ZSTACK_VPC_10016": "jaringan rute default tidak dapat dilepaskan", + "ORG_ZSTACK_VPC_10015": "jaringan manajemen tidak dapat dilepaskan. Pastikan semua sumber daya bergantung telah dipindahkan atau dihentikan sebelum mencoba operasi ini.", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10003": "tidak dapat menemukan host dengan koneksi SMP yang terhubung untuk menjalankan perintah untuk penyimpanan utama smp [uuid:%s]", + "ORG_ZSTACK_VPC_10014": "router virtual [uuid:%s] tidak dalam status atau keadaan yang diinginkan", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10002": "tidak dapat menemukan host yang terhubung untuk menjalankan perintah untuk penyimpanan utama SMP[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10001": "penyimpanan primer SMP [uuid:%s] tidak terlampir pada klaster komputasi manapun dan oleh karena itu tidak dapat menghapus volume root [uuid:%s] dari mesin virtual [uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10007": "tidak dapat menemukan mesin virtual dengan UUID: %s", + "ORG_ZSTACK_VPC_10019": "tidak dapat melepaskan jaringan L3 dari router VPC [uuid:%s] karena status master dan slave tidak konsisten", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10008": "tidak dapat menemukan perangkat mesin virtual dengan uuid: %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10030": "tidak dapat menemukan penyimpanan cadangan untuk mengunduh gambar [%s] ke penyimpanan primer [%s] karena tidak ada gambar yang siap dan dapat diakses", + "ORG_ZSTACK_VPC_10018": "tidak dapat melepaskan jaringan L3 dari router VPC [uuid:%s] karena statusnya tidak berjalan atau berhenti", + "ORG_ZSTACK_ALIYUN_CORE_10037": "gambar sudah ada secara remote; harap gunakan sync terlebih dahulu untuk memastikan konsistensi", + "ORG_ZSTACK_ALIYUN_CORE_10035": "entri masih aktif setelah %s ms", + "ORG_ZSTACK_ALIYUN_CORE_10036": "tidak dapat menemukan instans ECS [%s], harap periksa apakah ada di konsol Aliyun", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10037": "tidak dapat menemukan Ceph MON yang terhubung untuk penyimpanan primer [uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10001": "parameter hilang: resourceUuid %s, vmInstanceUuid diperlukan", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10002": "Parameter yang diperlukan hilang: resource UUID. Harap berikan resource UUID yang valid", + "ORG_ZSTACK_VPC_10012": "router virtual [uuid:%s] bukan router VPC", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10039": "konflik pool CEPH, pool CEPH yang ditentukan oleh instance offering adalah %s, dan pool CEPH yang ditentukan dalam parameter pembuatan adalah %s", + "ORG_ZSTACK_VPC_10011": "tidak dapat memperbarui status antarmuka jaringan [uuid: %s], karena antarmuka jaringan manajemen tidak didukung", + "ORG_ZSTACK_ALIYUN_CORE_10039": "regionId[%s] tidak valid menurut Aliyun", + "ORG_ZSTACK_VPC_10010": "tidak dapat menghapus VM NIC [UUID:%s], karena VM [UUID:%s] adalah appliance VM. Harap gunakan API APIDetachL3NetworkFromVm", + "ORG_ZSTACK_SNMP_AGENT_10006": "gagal mengakhiri sesi agen SNMP[%s] pada port %s, karena %s", + "ORG_ZSTACK_SNMP_AGENT_10005": "gagal memodifikasi port agen SNMP dari %s ke %s karena %s", + "ORG_ZSTACK_SNMP_AGENT_10004": "contoh SNMP[uuid:%s] belum diprovisikan", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10009": "Status instans EC2 [%s] harus berjalan atau berhenti", + "ORG_ZSTACK_STORAGE_ZBS_10003": "mdsUrl[%s] tidak valid. Username dan password SSH harus dipisahkan oleh ':' dan tidak boleh kosong. Format mdsUrl yang valid adalah %s", + "ORG_ZSTACK_STORAGE_ZBS_10004": "URL layanan manajemen tidak valid[%s], hostname tidak boleh null. Format URL layanan manajemen yang valid adalah %s", + "ORG_ZSTACK_STORAGE_ZBS_10002": "MDS URL[%s] tidak valid, bagian username SSH:password SSH tidak valid. Format MDS URL yang valid adalah %s", + "ORG_ZSTACK_APPCENTER_10006": "%s memerlukan nilai String, tetapi menerima tipe yang tidak benar", + "ORG_ZSTACK_APPCENTER_10005": "%s memerlukan nilai Boolean, tetapi menerima tipe yang tidak benar", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10004": "Disk [%s] tidak terpasang pada instans manapun", + "ORG_ZSTACK_APPCENTER_10004": "%s memerlukan nilai Number, tetapi menerima tipe yang tidak benar", + "ORG_ZSTACK_STORAGE_ZBS_10005": "MDS URL[%s] tidak valid, port SSH berada di luar rentang valid (1-65535). MDS URL yang valid harus dalam format %s", + "ORG_ZSTACK_APPCENTER_10003": "%s ditentukan di preParameters tetapi tidak dikonfigurasi", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10006": "Hanya disk data yang dapat dipasang ke instance ECS.", + "ORG_ZSTACK_APPCENTER_10002": "filterName harus disetel ke appcenter:true atau appcenter:false untuk konfigurasi yang benar.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10007": "Disk tidak dapat dipasang ke instance ECS manapun. Pastikan instance ECS dalam keadaan yang memungkinkan pemasangan disk.", + "ORG_ZSTACK_SNMP_AGENT_10003": "gagal memulai agen SNMP pada port %s karena %s", + "ORG_ZSTACK_APPCENTER_10001": "PublishAppVO[uuid: %s] tidak ada", + "ORG_ZSTACK_SNMP_AGENT_10002": "gagal memulai agen SNMP[%s], silakan periksa konfigurasi cloud Anda[%s]", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10001": "Volume root instance tidak dapat dihapus", + "ORG_ZSTACK_SNMP_AGENT_10001": "Ada lebih dari satu instance SnmpAgentVO. Harap tentukan mana yang akan digunakan.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10002": "Anda tidak dapat mengatur properti deleteWithInstance disk menjadi false ketika kategori disk adalah ephemeral.", + "ORG_ZSTACK_SNMP_AGENT_10000": "Tidak dapat membuat instance SnmpAgentImpl karena tidak adanya instance SnmpAgentVO. Pastikan SnmpAgentVO dikonfigurasi dan diterapkan dengan benar.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10003": "Anda tidak dapat mengatur properti deleteWithInstance disk menjadi false ketika kategori disk adalah cloud dan tidak portable.", + "ORG_ZSTACK_CORE_WEBHOOK_10000": "URL[%s] tidak valid", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10010": "Disk dan instance ECS harus berada di zona ketersediaan yang sama", + "ORG_ZSTACK_TEST_AOP_10001": "unit test memerlukan kegagalan karena masalah pada infrastruktur komputasi cloud atau lingkungan virtualisasi", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10015": "Ukuran disk atau ID snapshot harus ditentukan dalam parameter permintaan untuk membuat disk atau mengelola ukurannya. Harap berikan ukuran disk atau gunakan snapshot yang ada.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10016": "Anda tidak diizinkan membuat disk dari snapshot volume root. Harap gunakan snapshot volume non-root atau salinan volume root untuk operasi ini.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10017": "Nama disk atau deskripsi tidak dapat dimulai dengan 'http://' atau 'https://'. Harap gunakan karakter yang valid untuk penamaan disk.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10011": "Volume [%s] sudah terpasang ke instance [%s]", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10012": "Hanya disk data yang dapat dipasang ke instance ECS.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10013": "Tidak dapat memasang disk ke instance yang sedang digunakan. Harap hentikan instance sebelum memasang disk baru.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10014": "Disk non-elastic hanya dapat dihancurkan bersama dengan instance terkait", + "ORG_ZSTACK_STORAGE_ZBS_10021": "nama volume logis tidak valid[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10022": "nama pool tidak valid[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10020": "syntax URI tidak valid untuk referensi sumber daya cloud: %s", + "ORG_ZSTACK_STORAGE_ZBS_10025": "tidak mengizinkan penambahan MDS duplikat[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10026": "tidak dapat menemukan sumber daya fisik untuk pool logis[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10023": "Harap pastikan setidaknya satu compute pool dikonfigurasi.", + "ORG_ZSTACK_STORAGE_ZBS_10024": "Pastikan setidaknya satu instance Metadata Service dikonfigurasi", + "ORG_ZSTACK_STORAGE_ZBS_10027": "MDS[%s] tidak ditemukan untuk node primary storage zBS[uuid:%s]", + "ORG_ZSTACK_STORAGE_ZBS_10028": "Semua node MDS dari primary storage ZBS [uuid:%s] tidak dalam keadaan Connected", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10001": "Tidak dapat menghapus template pra-konfigurasi yang telah ditentukan di lingkungan cloud. Silakan hubungi dukungan untuk mendapatkan bantuan.", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10002": "Tidak dapat mengubah status template konfigurasi yang telah ditentukan di lingkungan ini. Silakan gunakan gambar mesin virtual yang tersedia atau buat konfigurasi kustom sebagai gantinya.", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10000": "Tidak dapat memperbarui template jenis instance yang telah ditentukan", + "ORG_ZSTACK_MTTYDEVICE_10001": "Perangkat mdev yang dihasilkan dari perangkat mtty[uuid:%s] masih terpasang ke VM", + "ORG_ZSTACK_MTTYDEVICE_10000": "Perangkat mtty [UUID:%s] tidak divirtualisasi menjadi sumber daya mdevs", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10004": "tidak dapat menemukan Template Pra-konfigurasi VO dengan UUID: %s, mungkin telah dihapus", + "ORG_ZSTACK_MTTYDEVICE_10004": "Host [UUID:%s] yang berisi perangkat MTty [UUID:%s] tidak terhubung.", + "ORG_ZSTACK_MTTYDEVICE_10003": "Perangkat mtty [UUID:%s] tidak dapat divirtualisasi menjadi mdevs", + "ORG_ZSTACK_HYGON_KVM_10004": "gagal mendapatkan informasi perangkat CPU Hygon dari host[UUID:%s]: %s", + "ORG_ZSTACK_STORAGE_ZBS_10014": "Penyimpanan utama ZBS [uuid:%s] mungkin telah dihapus atau dissociated", + "ORG_ZSTACK_STORAGE_ZBS_10015": "tidak dapat menemukan host KVM [UUID:%s], tidak dapat men-deploy client", + "ORG_ZSTACK_STORAGE_ZBS_10012": "tidak dapat terhubung ke penyimpanan utama ZBS[uuid:%s], gagal menghubungkan semua Metadata Servers", + "ORG_ZSTACK_STORAGE_ZBS_10016": "informasi addon adalah null, penyimpanan utama[uuid:%s] belum siap, melewati tugas ping", + "ORG_ZSTACK_ZWATCH_DATATYPE_10010": "label tidak valid, kolom 'value' tidak boleh null. Harap berikan nilai yang valid.%s", + "ORG_ZSTACK_STORAGE_ZBS_10017": "Tidak tersedia logical volume dengan kapasitas cukup[%d] dan URL yang diperlukan: %s", + "ORG_ZSTACK_HYGON_KVM_10003": "gagal untuk ungenerate perangkat Hygon IOMMU karena:%s", + "ORG_ZSTACK_HYGON_KVM_10002": "tidak dapat ungenerate perangkat mdev, ada %d perangkat mdev yang terpasang ke VM pada host[uuid:%s]. Harap hentikan atau migrasikan semua mesin virtual yang terdampak terlebih dahulu.", + "ORG_ZSTACK_HYGON_KVM_10001": "tidak dapat menemukan perangkat CCP untuk PCI BDF %s pada host[UUID:%s], harap sinkronkan perangkat Hygon terlebih dahulu", + "ORG_ZSTACK_HYGON_KVM_10000": "gagal menghasilkan perangkat Hygon IOMMU karena:%s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10021": "tidak dapat meng-query instance InfluxDB, %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10023": "gagal mengubah retention policy InfluxDB '%s', %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10000": "tidak cukup sumber daya fisik untuk migrasi penyimpanan VM[UUID: %s]; kapasitas yang diperlukan (termasuk cache image): %s, kapasitas fisik yang tersedia saat ini: %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10024": "gagal membuat retention policy InfluxDB '%s', %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10001": "tidak mendukung status vm[%s] untuk migrasi penyimpanan", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10025": "response InfluxDB tidak valid: %s, tidak ada nama metrik yang ditemukan di kolom", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10026": "gagal membuat pengguna default untuk InfluxDB '%s', %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10004": "tidak mendukung pembatalan instance mesin virtual", + "ORG_ZSTACK_STORAGE_MIGRATION_10005": "VM[uuid: %s] tidak ada", + "ORG_ZSTACK_STORAGE_MIGRATION_10003": "tipe migrasi penyimpanan tidak didukung: dari %s ke %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10008": "migrasi blok VM gagal: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10009": "Penyimpanan primer target tidak mendukung operasi migrasi untuk host saat ini. Pastikan penyimpanan kompatibel dengan operasi migrasi dan coba lagi.", + "ORG_ZSTACK_STORAGE_MIGRATION_10006": "tidak mendukung state VM[%s] untuk membatalkan migrasi penyimpanan", + "ORG_ZSTACK_STORAGE_MIGRATION_10007": "Gagal menentukan kandidat host untuk migrasi VM `%s`. Periksa host target dan konektivitas jaringan.", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10005": "format tidak valid untuk perangkat driver virtio: %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10004": "gagal melepas virtio ISO dari VM[uuid:%s]: tidak didukung", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10003": "gagal melepas perangkat virtio dari vm[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10002": "gagal melampirkan driver virtio karena membaca md5 dari file[%s] gagal di mn[uuid:%s]: %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10001": "gagal melampirkan driver virtio karena MD5 tidak valid dari file[%s] di mn[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10000": "gagal melampirkan driver virtio karena membaca md5 dari file[%s] gagal di mn[uuid:%s]: file disk virtual tidak ditemukan di classpath", + "ORG_ZSTACK_DIRECTORY_10010": "Jenis direktori %s yang ditentukan tidak didukung; jenis yang didukung termasuk %s.", + "ORG_ZSTACK_SCHEDULER_VM_10001": "vm[uuid:%s] telah dihentikan, perubahan state tidak diizinkan", + "ORG_ZSTACK_STORAGE_ZBS_10040": "gagal mengambil metadata MDS[%s], harap verifikasi konfigurasi ZBS", + "ORG_ZSTACK_STORAGE_ZBS_10032": "semua server metadata tidak dapat mengeksekusi permintaan HTTP[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10036": "Versi MDS[%s] penyimpanan primer ZBS tidak cocok dengan node manajemen[%s], harap hubungkan kembali MDS dan verifikasi konektivitas SSH.", + "ORG_ZSTACK_STORAGE_ZBS_10037": "URL MDaaS tidak boleh kosong", + "ORG_ZSTACK_STORAGE_ZBS_10034": "tidak dapat menyinkronkan metadata dari MDS[%s] penyimpanan primer ZBS, karena %s", + "ORG_ZSTACK_STORAGE_ZBS_10038": "tidak dapat menemukan volume logis dari semua instance layanan metadata, detail: %s", + "ORG_ZSTACK_STORAGE_ZBS_10039": "Gagal membangun koneksi SSH atau zbs-tools tidak terinstal di MDS[%s]. Harap verifikasi konfigurasi SSH dan pastikan dependensi yang diperlukan terinstal.", + "ORG_ZSTACK_DIRECTORY_10006": "dependensi melingkar terdeteksi antara direktori %s dan direktori %s, yang dapat menyebabkan konflik konfigurasi atau infinite loop dalam provisioning lingkungan virtual", + "ORG_ZSTACK_DIRECTORY_10003": "Nama yang Anda berikan mengandung karakter yang tidak didukung. Di lingkungan komputasi awan, nama hanya dapat mencakup karakter Cina, huruf Inggris, angka, spasi, dan karakter khusus berikut: ()()[]@._-+ . Harap pastikan nama Anda mematuhi pedoman ini.", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10000": "tidak dapat menemukan EventFamily[name:%s] dalam event bus", + "ORG_ZSTACK_DIRECTORY_10004": "semua sumber daya zoneUuid harus konsisten dengan zoneUuid direktori[%s]", + "ORG_ZSTACK_DIRECTORY_10001": "jenis sumber daya %s tidak didukung oleh direktori cloud, jenis yang diizinkan adalah %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10002": "tidak dapat menemukan EventFamily[name:%s, namespace:%s] dalam namespace yang ditentukan atau repositori event family", + "ORG_ZSTACK_DIRECTORY_10000": "sumber daya %s sudah terikat ke UUID direktori[%s]; beberapa path tidak didukung", + "ORG_ZSTACK_NAS_10002": "duplicate NasFileSystemFactory untuk jenis[%s]", + "ORG_ZSTACK_NAS_10000": "Sistem file NAS [%%s] belum ada", + "ORG_ZSTACK_NAS_10001": "tidak dapat menemukan factory NAS untuk jenis: %s", + "ORG_ZSTACK_DIRECTORY_10009": "Gagal membuat direktori; pastikan path ditentukan dengan benar dan tidak melebihi empat level direktori virtual.", + "ORG_ZSTACK_DIRECTORY_10008": "nama direktori duplikat, volume[uuid: %s] dengan nama %s sudah ada", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10011": "tag query tidak valid[%s]. Nama tag yang diperbolehkan adalah %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10012": "Terdapat beberapa Event Family dengan nama [%s], Anda harus menentukan label [%s].", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10006": "VM tempat data volume [%s] berada memiliki snapshot memori; oleh karena itu tidak dapat dilepas.", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10005": "tidak dapat melampirkan volume %s ke instance mesin virtual %s dengan grup snapshot memori", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10004": "VM tempat data volume [%s] berada memiliki snapshot memori; penghapusan tidak diperbolehkan.", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10003": "Volume {volume_id} tidak ada", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10001": "jaringan dengan L3 jaringan [uuid: %s] direferensikan oleh Volume Snapshot Group [uuid: %s]. Harap hapus Volume Snapshot Group sebelum menghapus L3 jaringan ini.", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10000": "UUID L3 jaringan default tidak ada", + "ORG_ZSTACK_AI_10086": "ModelServiceGroup masih direferensikan oleh %s, tidak dapat dihapus", + "ORG_ZSTACK_AI_10087": "taskUuid tidak boleh kosong. Harap pastikan sudah diatur dengan benar sebelum提交 tugas.", + "ORG_ZSTACK_AI_10084": "Instance sistem[uuid: %s] tidak dapat dihapus", + "ORG_ZSTACK_AI_10082": "Gagal menghapus model, model[uuid: %s] masih digunakan oleh %s", + "ORG_ZSTACK_AI_10083": "Model[uuid: %s] tidak ada di repositori cloud", + "ORG_ZSTACK_AI_10080": "Custom URL memerlukan kolom model ketika layanan tipe ModelEval digunakan.%s", + "ORG_ZSTACK_AI_10081": "UUID L3 Jaringan %s tidak memiliki layanan DHCP aktif; tag sistem IP statis diperlukan untuk menetapkan IP statis.", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10007": "Operasi pengambilan snapshot volume pada beberapa host secara bersamaan ketika mencakup snapshot penyimpanan tidak didukung.", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10008": "tidak dapat menemukan ruang penyimpanan untuk URL instal[%s]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10005": "Tidak ada plugin penyimpanan utama yang terdaftar dengan identitas: %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10006": "tidak mendukung protokol[%s] pada solusi penyimpanan jenis[%s]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10009": "Tidak dapat menemukan volume penyimpanan blok; pastikan jalur akses dikonfigurasi untuk volume penyimpanan blok.", + "ORG_ZSTACK_CONFIGURATION_10009": "ukuran memori yang dicadangkan[%s bytes] melebihi ukuran memori yang tersedia[%s bytes]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10010": "tidak ada jenis penyimpanan cadangan yang ditentukan untuk mendukung penyimpanan utama[uuid:%s]", + "ORG_ZSTACK_CONFIGURATION_10008": "ukuran memori[%s bytes] tidak cukup untuk bootstrapping sistem operasi modern; minimum 16MB direkomendasikan di lingkungan virtual cloud", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10011": "tidak dapat menginisialisasi ulang volume root [%s] karena gambar terkait telah dihapus dan cache tidak dapat ditemukan", + "ORG_ZSTACK_MULTICAST_ROUTER_10005": "router multicast [uuid:%s] tidak diasosiasikan dengan VPC Router", + "ORG_ZSTACK_CONFIGURATION_10007": "jumlah vcpu[%s] kurang dari 1", + "ORG_ZSTACK_MULTICAST_ROUTER_10006": "Rendezvous Point [%s] bukan alamat IP unicast", + "ORG_ZSTACK_CONFIGURATION_10006": "jenis instance[%s] tidak didukung", + "ORG_ZSTACK_MULTICAST_ROUTER_10007": "alamat grup [%s] bukan alamat grup multicast", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014": "penyimpanan tidak sehat:%s", + "ORG_ZSTACK_MULTICAST_ROUTER_10000": "multicastRouter[uuid:%s] belum dikaitkan dengan router VPC", + "ORG_ZSTACK_MULTICAST_ROUTER_10001": "multicast sudah diaktifkan pada router VPC UUID[:%s]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012": "tidak dapat menemukan jalur volume pemilik dari jalur snapshot internal[%s], karena regex[%s] tidak cocok dengan jalur snapshot", + "ORG_ZSTACK_MULTICAST_ROUTER_10002": "router VPC untuk multicast router [uuid:%s] telah dihapus", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10013": "ping penyimpanan primer eksternal[%s] gagal, periksa konektivitas jaringan atau status layanan penyimpanan.%s", + "ORG_ZSTACK_CONFIGURATION_10001": "Sudah memiliki satu tag sistem yang ditentukan pengguna untuk penawaran instans [UUID: %s].", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10004": "Respons token adalah null. Pastikan proses autentikasi Anda dikonfigurasi dengan benar dan titik akhir token mengembalikan respons yang valid.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10003": "Tidak dapat menemukan implementasi OAuth2Login untuk tipe(%s)", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10005": "%s adalah null: Pastikan jalur file sumber ditentukan dengan benar.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10000": "Duplikat handler autentikasi OAuth2 untuk tipe[%s]", + "ORG_ZSTACK_CONFIGURATION_10004": "Tidak boleh memiliki lebih dari satu tag sistem untuk penawaran instans.", + "ORG_ZSTACK_CONFIGURATION_10003": "Sudah memiliki satu tag sistem yang ditentukan pengguna untuk penawaran disk [UUID: %s].", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10002": "Tidak dapat menemukan OAuth2 Provider untuk tipe(%s)", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10001": "Duplikat OAuth2 provider[%s] untuk nama[%s]", + "ORG_ZSTACK_AI_10075": "dockerImage harus ditentukan untuk ContainerModelService.", + "ORG_ZSTACK_AI_10076": "Model center dengan UUID:%s tidak ditemukan untuk model service dengan UUID:%s", + "ORG_ZSTACK_AI_10071": "vmImageUuid adalah parameter yang diperlukan untuk layanan model VirtualMachine. Harap berikan nilai vmImageUuid yang valid.", + "ORG_ZSTACK_AI_10072": "UUID gambar VM yang ditentukan tidak valid. Harap verifikasi dan berikan UUID yang valid.", + "ORG_ZSTACK_AI_10070": "ModelServiceType[%s] tidak boleh memiliki UUID grup layanan model dependen", + "ORG_ZSTACK_MULTICAST_ROUTER_10008": "Pasangan alamat RP [%s: %s] sudah ada untuk multicast router [uuid:%s]", + "ORG_ZSTACK_MULTICAST_ROUTER_10009": "tuple alamat rpc [%s : %s] tidak ada untuk multicast router [uuid:%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10015": "Gagal mengunggah user[%s]: User sudah ada di lingkungan cloud", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10017": "Respons kode memiliki error: %s", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10016": "Gagal mengunggah user[%s]: %s", + "ORG_ZSTACK_AI_10079": "ModelEval serviceType memerlukan layanan model yang ada dalam modelServiceGroupUuids yang ditentukan atau URL yang valid untuk penggunaan.", + "ORG_ZSTACK_AI_10077": "Tidak ada L3 network UUID yang disediakan dalam pesan deployment, dan model center [UUID:%s] tidak memiliki serviceNetworkUuid atau storageNetworkUuid yang dikonfigurasi.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10012": "iam2 memiliki user dengan nama yang sama[%s]", + "ORG_ZSTACK_AI_10078": "Nilai variabel lingkungan tidak boleh null dalam konfigurasi lingkungan cloud Anda. Pastikan semua variabel yang diperlukan diatur dengan benar.", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_SUPPLIER_EMAY_10000": "parameter tidak valid dengan supplier[%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10026": "Username yang diambil dari layanan cloud adalah null. Harap periksa konfigurasi autentikasi user.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10025": "gagal mendapatkan parameter[%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10028": "Plugin [uuid:%s] digunakan oleh klien OAuth2 [uuids:%s] untuk autentikasi login pihak ketiga.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10027": "pengguna lokal memiliki pengguna dengan nama yang sama[%s]", + "ORG_ZSTACK_AI_10097": "layanan model dalam grup[uuid: %s] memiliki tipe yang tidak konsisten, tipe yang diharapkan: %s, tetapi menemukan tipe: %s", + "ORG_ZSTACK_AI_10098": "backend layanan model[type: %s] tidak ditemukan di lingkungan virtualisasi", + "ORG_ZSTACK_AI_10095": "semua layanan model dalam grup[uuid: %s] harus mengonfigurasi serviceBootUptime", + "ORG_ZSTACK_AI_10096": "tidak ditemukan instance layanan model dengan node rank 0 dalam grup[uuid: %s]", + "ORG_ZSTACK_AI_10093": "instance layanan model[uuid: %s] tidak aktif dan tidak siap, tetapi tidak ditemukan kode error", + "ORG_ZSTACK_AI_10094": "konten tidak terduga: YAML layanan %s diurai sebagai null", + "ORG_ZSTACK_AI_10091": "gagal mendapatkan status kesiapan karena %s", + "ORG_ZSTACK_AI_10092": "instance layanan model[uuid: %s] tidak tersedia dan tidak siap karena %s", + "ORG_ZSTACK_AI_10090": "Gagal memuat ulang konfigurasi NGINX: %s", + "ORG_ZSTACK_VROUTERROUTE_10010": "tujuan[%s] tidak dapat memiliki rute black hole dan rute statis secara bersamaan", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10000": "tidak dapat menemukan penyimpanan primer eksternal[uuid:%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10031": "gagal %s ke %s, kode status: %s, body respons: %s", + "ORG_ZSTACK_VROUTERROUTE_10012": "tidak dapat menambahkan entri rute Black Hole duplikat untuk tujuan: %s", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10030": "ERROR HTTP, kode status: %s, body respons: %s", + "ORG_ZSTACK_VROUTERROUTE_10011": "tidak dapat menambahkan entri rute statis duplikat, tujuan: %s, target: %s, tipe: %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10003": "ruang yang diperlukan di locationUrl:%s tidak dapat memenuhi kondisi [availableSize > %d byte], ukuran yang tersedia saat ini %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10004": "tidak dapat menemukan volume dengan UUID [%s] jalur install", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10001": "Tidak dapat建立 koneksi ke layanan penyimpanan eksternal. Pastikan layanan penyimpanan Anda dikonfigurasi dengan benar dan dapat diakses dalam lingkungan cloud.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10032": "gagal %s ke %s, IO Error: %s", + "ORG_ZSTACK_AI_10099": "grup instance layanan model[uuid: %s] tidak ada", + "ORG_ZSTACK_VROUTERROUTE_10001": "tidak dapat menemukan factory layanan untuk tipe virtual router[%s]", + "ORG_ZSTACK_VROUTERROUTE_10000": "virtual router [uuid:%s] tidak dapat ditemukan", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10015": "Ceph BS[uuid=%s] nama pool tidak ditemukan", + "ORG_ZSTACK_VROUTERROUTE_10003": "tidak dapat menemukan tabel rute [uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10012": "tidak dapat memperbarui status MON penyimpanan cadangan Ceph [UUID:%s], telah dihapus. Error ini dapat diabaikan.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10000": "tidak dapat menemukan grup penjadwalan host[uuid:%s], mungkin telah dihapus atau dialihkan", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10003": "Host [UUID:%s] sudah terpasang ke grup penjadwalan host [UUID:%s].", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10004": "Host dengan UUID %s adalah null. Harap verifikasi konfigurasi cluster.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10001": "tidak dapat menemukan aturan penjadwalan mesin virtual[uuid:%s], mungkin telah dihapus", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10002": "tidak dapat menemukan grup penjadwalan mesin virtual[uuid:%s], mungkin telah dihapus", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10011": "Penyimpanan cadangan CEPH tidak mendukung perhitungan checksum gambar.", + "ORG_ZSTACK_SNS_PLATFORM_HTTP_10000": "Kegagalan permintaan HTTP POST. status: %s, body: %s", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10007": "gambar[uuid: %s] tidak tersedia pada penyimpanan cadangan[uuid:%s, name:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10005": "Terdapat penyimpanan cadangan CEPH lain dengan FSID yang sama; Anda tidak dapat menambahkan pengaturan CEPH yang sama sebagai dua penyimpanan cadangan yang berbeda.[name:%s, uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10003": "tidak dapat terhubung ke penyimpanan cadangan Ceph[UUID:%s], gagal menghubungkan semua monitor Ceph.", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10002": "CephMon[hostname:%s] tidak ditemukan pada penyimpanan cadangan[uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10009": "Gagal menambahkan node MON ke klaster penyimpanan cadangan Ceph", + "ORG_ZSTACK_MULTICAST_ROUTER_BACKEND_10000": "router multicast [uuid:%s] telah dihapus selama aktivasi multicast pada backend", + "ORG_ZSTACK_LDAP_10016": "kueri entri LDAP gagal, %s", + "ORG_ZSTACK_LDAP_10017": "kueri entri ldap[filter: %s] gagal karena %s", + "ORG_ZSTACK_LDAP_10012": "Tidak dapat建立 koneksi ke server LDAP/AD, kredensial tidak valid. Harap verifikasi User DN dan kata sandi.", + "ORG_ZSTACK_LDAP_10013": "Tidak dapat建立 koneksi ke server LDAP/AD, kegagalan komunikasi. Harap verifikasi alamat IP, nomor port, dan Base DN.", + "ORG_ZSTACK_LDAP_10014": "Tidak dapat建立 koneksi ke server LDAP/AD, %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10005": "lisensi saat ini[%s] tidak valid untuk operasi penyimpanan cadangan penyimpanan gambar", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10004": "CephPrimaryStorage[%s] tidak ada!", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10001": "gambar [uuid:%s] telah dihapus dari repositori penyimpanan cloud", + "ORG_ZSTACK_LDAP_10010": "LdapServerType[%s] tidak valid, nilai yang valid: [%, %s]", + "ORG_ZSTACK_LDAP_10007": "Akun[UUID:%s] Tidak Ditemukan!!!", + "ORG_ZSTACK_LDAP_10008": "Cakupan server LDAP/AD tidak didukung untuk konfigurasi lingkungan cloud. Harap pastikan cakupan kompatibel dengan standar virtualisasi dan komputasi cloud.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10000": "gagal membuat IP elastis [uuid:%s, name:%s, ip:%s] untuk antarmuka jaringan mesin virtual [uuid:%s] pada router virtual [uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10001": "Menemukan penawaran router virtual [uuid:%s] untuk L3Network [uuid:%s] di zona [uuid:%s]; namun, konfigurasi IP publik jaringan tidak cocok dengan IP Elastis [uuid:%s]. Anda mungkin perlu menentukan penawaran router virtual tertentu menggunakan tag sistem guestL3Network::l3NetworkUuid untuk L3Network [uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10002": "gagal melepaskan eip [uuid:%s, name:%s, ip:%s] dari nic vm [uuid:%s] pada router virtual [uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10004": "gagal menyinkronkan eip pada router virtual[uuid:%s], detail kesalahan: %s", + "ORG_ZSTACK_AI_10004": "randomUuid tidak cocok dengan nilai yang diharapkan. Harap verifikasi logika pembuatan UUID.", + "ORG_ZSTACK_AI_10005": "Model Center tidak ditemukan. Harap pastikan layanan Model Center diterapkan dan dikonfigurasi dengan benar di lingkungan cloud Anda.", + "ORG_ZSTACK_AI_10003": "randomUuid adalah null. Harap Pastikan UUID yang valid dihasilkan sebelum penggunaan.", + "ORG_ZSTACK_AI_10001": "Alamat IP manajemen pusat model %s yang diberikan tidak valid. Harap Pastikan itu adalah IP yang valid dan coba lagi.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10027": "vm[uuid:%s] sekarang berjalan di host[uuid:%s], yang tidak mematuhi kebijakan penjadwalan[%s] yang terkait dengan grup penjadwalan vm[uuid:%s].", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10028": "vm[uuid:%s] sekarang berjalan di host[uuid:%s], yang tidak mematuhi aturan penjadwalan[%s] yang terkait dengan grup penjadwalan mesin virtual[uuid:%s].", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10019": "Grup penjadwalan VM [UUID:%s] sudah memiliki kebijakan penjadwalan VM berbasis eksklusif atau affinitas yang dieksekusi terpasang. Anda tidak dapat memasang jenis kebijakan yang memerlukan eksekusi ke grup ini lagi.", + "ORG_ZSTACK_AI_10028": "modelServices tidak boleh null atau kosong. Harap pastikan instance layanan Anda diinisialisasi dan dikonfigurasi dengan benar.", + "ORG_ZSTACK_AI_10029": "modelServices harus menggunakan UUID model yang sama dengan instance virtual untuk konsistensi.", + "ORG_ZSTACK_AI_10026": "serviceNetworkUuid %s bukan jaringan Layer 3 sistem", + "ORG_ZSTACK_AI_10027": "storageNetworkUuid %s bukan jaringan Layer 3 sistem", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10025": "vm[uuid:%s] sekarang berjalan di host[uuid:%s], yang tidak mematuhi kebijakan penjadwalan yang terkait dengan grup penjadwalan mesin virtual[uuid:%s].", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10026": "hostGroup[uuid:%s] tidak memiliki host yang ditetapkan", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10024": "grup penjadwalan vm[uuid:%s] gagal memesan host [uuid:%s] untuk vm [uuid:%s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10007": "vm[uuid:%s] sudah terkait dengan grup penjadwalan vm[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10008": "terdeteksi ketidakcocokan zona: VM[UUID: %s, Zone UUID: %s] berbeda dari grup aturan penjadwalan[UUID: %s, Zone UUID: %s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10005": "Host yang dapat ditambahkan ke grup penjadwalan host harus diaktifkan dan terhubung ke Node Manajemen (MN).", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10006": "terdeteksi ketidakcocokan zona, zona host [uuid: %s, zone uuid: %s] berbeda dari grup aturan penjadwalan host [uuid: %s, zone uuid: %s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10009": "vm dapat mengubah grup penjadwalan VM-nya hanya dalam keadaan [%s,%s], tetapi saat ini berada dalam keadaan [%s]", + "ORG_ZSTACK_TEMPLATECONFIG_10000": "Tidak dapat menemukan TemplateConfigs apa pun: [template UUID: %s]", + "ORG_ZSTACK_TICKET_API_10002": "tidak ada jenis sistem akun [%s] yang didefinisikan dalam konfigurasi", + "ORG_ZSTACK_TICKET_API_10003": "Jenis tiket tidak ditemukan dalam konfigurasi lingkungan cloud.%s", + "ORG_ZSTACK_TICKET_API_10004": "Koleksi alur tiket yang cocok atau koleksi alur tiket default tidak ditemukan. Harap tentukan flowCollectionUuid atau buat koleksi alur tiket default di sistem.", + "ORG_ZSTACK_TEMPLATECONFIG_10003": "Tidak dapat menemukan Konfigurasi Template[kategori: %s, nama: %s, template UUID: %s]", + "ORG_ZSTACK_TICKET_API_10005": "Koleksi alur tiket [UUID:%s] tidak cocok dengan jenis tiket [UUID:%s]", + "ORG_ZSTACK_TICKET_API_10006": "Koleksi alur tiket[uuid:%s] tidak valid. Harap hubungi administrator untuk perbaikan.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10000": "Penyimpanan primer Aliyun NAS [UUID:%s, Nama:%s] tidak dapat menemukan host yang tersedia dalam klaster terlampir untuk menginstansiasi volume.", + "ORG_ZSTACK_TICKET_API_10007": "Koleksi alur tiket [UUID:%s] dinonaktifkan dan tidak dapat digunakan.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10001": "Penyimpanan primer Alibaba Cloud NAS [UUID:%s, Nama:%s] tidak dapat menemukan host yang tersedia dalam klaster terlampir untuk menghapus data pada penyimpanan primer.", + "ORG_ZSTACK_TICKET_API_10008": "permintaan tidak valid. tidak ada API[%s] ditemukan dalam namespace atau scope yang ditentukan", + "ORG_ZSTACK_TICKET_API_10009": "permintaan tidak valid, tidak dapat membuat API[%s] dari apiBody, %s", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10010": "tidak dapat mengoperasikan grup penjadwalan VPC VM", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10011": "UUID zona ketersediaan tidak boleh null.", + "ORG_ZSTACK_TEMPLATECONFIG_10005": "Tidak dapat menemukan TemplateConfigs apa pun: [templateUUID: %s]", + "ORG_ZSTACK_AI_10012": "architectureImages tidak boleh null atau kosong di lingkungan virtualisasi cloud. Harap pastikan konfigurasinya sudah benar.", + "ORG_ZSTACK_AI_10042": "Format template CloudFormation tidak valid: %s", + "ORG_ZSTACK_AI_10043": "Konfigurasi YAML dan pembaruan parameter individual saling eksklusif di lingkungan komputasi cloud. Harap pilih satu metode untuk memperbarui pengaturan.", + "ORG_ZSTACK_AI_10040": "servicePorts tidak boleh berisi nilai duplikat: %s", + "ORG_ZSTACK_AI_10041": "serviceBootupTime harus dalam rentang [1,65535]", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10006": "gagal memeriksa path mount pada host: %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10005": "Penyimpanan utama Aliyun NAS [UUID: %s, name: %s] belum dilampirkan ke klaster apa pun, atau tidak ada host yang terhubung di klaster yang dilampirkan.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10009": "Tidak dapat menemukan host untuk membersihkan cache gambar. Harap pastikan setidaknya satu host tersedia dan dikonfigurasi dengan benar untuk caching gambar.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10013": "tidak dapat melampirkan penyimpanan utama ke klaster. Host KVM [uuid:%s, name:%s] di klaster menggunakan qemu-img dengan versi [%s]; namun, penyimpanan utama dilampirkan ke klaster yang memiliki host KVM [uuid:%s], yang menggunakan qemu-img dengan versi [%s]. Versi Qemu-img lebih besar dari %s tidak kompatibel dengan yang lebih kecil dari %s, yang dapat menyebabkan operasi snapshot volume gagal. Harap hindari melampirkan penyimpanan utama ke klaster dengan distribusi Linux yang berbeda untuk mencegah ketidakcocokan versi qemu-img.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10014": "Tidak ada sumber daya komputasi yang tersedia untuk mengunduh cache gambar!", + "ORG_ZSTACK_AI_10049": "Arsitektur CPU dalam pemetaan gambar arsitektur tidak boleh kosong. Harap pastikan arsitektur CPU yang valid ditentukan.", + "ORG_ZSTACK_AI_10046": "Vendor GPU %s harus menyediakan daftar UUID spesifikasi", + "ORG_ZSTACK_AI_10047": "UUID spesifikasi GPU untuk vendor %s tidak ditemukan di %s: %s", + "ORG_ZSTACK_AI_10044": "Pemetaan spesifikasi vendor GPU dalam pemetaan gambar arsitektur tidak boleh kosong. Harap pastikan vendor GPU sudah ditentukan dengan benar.", + "ORG_ZSTACK_AI_10045": "Vendor GPU dalam pemetaan gambar arsitektur tidak boleh kosong. Harap berikan nama vendor GPU yang valid.", + "ORG_ZSTACK_AI_10031": "UUID modelServices tidak boleh null. Harap berikan UUID yang valid untuk modelServices.", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10008": "gagal mengurai envelope metadata: %s, %s", + "ORG_ZSTACK_AI_10032": "nodeRank harus dalam [0, %s), namun menerima %s", + "ORG_ZSTACK_AI_10030": "modelServices harus menggunakan UUID zona yang sama dengan node komputasi.", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10003": "argumen ilegal untuk path file sumber", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10004": "Gagal mendekripsi data menggunakan kunci enkripsi yang diberikan. Harap verifikasi kunci dan coba lagi.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10017": "AliyunNasAccessGroupVO[%s] tidak ada, mungkin karena penghapusan!", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10018": "EcsVSwitchVO[%s] tidak ada, mungkin karena penghapusan!", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10020": "tidak dapat menemukan host yang tersedia untuk melakukan operasi di penyimpanan utama: %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10021": "gagal melakukan ping ke penyimpanan utama Aliyun NAS[UUID:%s] dari host[UUID:%s], karena %s. Putuskan koneksi host-NAS ini.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10024": "tidak dapat menemukan BackupStorageKVMFactory untuk jenis[%s]", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10025": "tidak dapat menemukan host untuk mengelola volume: [%s]", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10023": "Penyimpanan utama NAS belum dipasang, harap inisialisasi terlebih dahulu!", + "ORG_ZSTACK_AI_10039": "servicePorts harus dalam rentang [1,65535], namun menerima: %s", + "ORG_ZSTACK_AI_10037": "serviceLivez harus dimulai dengan '/' dan tidak boleh berisi spasi; panjangnya tidak boleh melebihi 512 karakter.", + "ORG_ZSTACK_AI_10038": "serviceReadyz harus dimulai dengan /, tidak boleh mengandung spasi, dan memiliki panjang hingga 512 karakter", + "ORG_ZSTACK_AI_10035": "Framework tidak valid: %s, nilai yang valid adalah: EC2, GCE, Azure, OpenStack", + "ORG_ZSTACK_AI_10036": "Framework tidak valid: %s", + "ORG_ZSTACK_AI_10033": "Identifier perangkat PCI tidak valid: %s", + "ORG_ZSTACK_AI_10034": "nodeRank harus unik, namun mendapatkan %s", + "ORG_ZSTACK_ACL_10001": "%s entri IP duplikat/bertabrakan dengan grup access control list:%s", + "ORG_ZSTACK_AI_10064": "Struktur skema dataset tidak valid: %s", + "ORG_ZSTACK_ACL_10000": "tidak mendukung versi IP %d", + "ORG_ZSTACK_AI_10065": "Dataset preset sistem tidak diizinkan untuk diperbarui melalui panggilan API. Silakan hubungi dukungan untuk mendapatkan bantuan.", + "ORG_ZSTACK_AI_10062": "Dataset sedang digunakan dan tidak dapat dihapus melalui API. Pastikan semua sumber daya terkait dihentikan sebelum mencoba menghapus.", + "ORG_ZSTACK_AI_10063": "updateDatasetStructs tidak boleh nol atau kosong. Pastikan struktur dataset didefinisikan dan diisi dengan benar sebelum melanjutkan.", + "ORG_ZSTACK_AI_10060": "Tidak dapat menghentikan instance VM karena digunakan oleh grup layanan model [UUID: %s]", + "ORG_ZSTACK_ZSV_COMPUTER_VM_10000": "nama vm %s sudah ada di lingkungan cloud", + "ORG_ZSTACK_AI_10061": "Berbagi Grup Instance Aplikasi tidak diizinkan: %s", + "ORG_ZSTACK_ACL_10009": "grup access control list[%s] sudah memiliki satu aturan pengalihan dan tidak dapat menambahkan yang lain", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10028": "Tidak tersedia sumber daya komputasi untuk memverifikasi jalur mount!", + "ORG_ZSTACK_ACL_10008": "grup access control list[%s] sudah memiliki entri IP, tidak dapat menambahkan aturan pengalihan", + "ORG_ZSTACK_ACL_10007": "grup access control list[%s] sudah memiliki aturan pengalihan; oleh karena itu, entri IP tidak dapat ditambahkan.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10026": "tidak dapat menemukan host untuk menyinkronkan ukuran volume di primer: %s", + "ORG_ZSTACK_ACL_10006": "grup access control list[%s] tidak dapat melebihi %d entri IP", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10027": "gambar [%s] telah dihapus, tidak dapat menginisialisasi ulang volume root darinya", + "ORG_ZSTACK_SCHEDULER_SNAPSHOT_10000": "VM dari volume root [%s] dalam keadaan Dimusnahkan. Perubahan keadaan tidak diizinkan untuk pekerjaan ini.", + "ORG_ZSTACK_ACL_10005": "grup access control list[%s] sudah memiliki aturan pengalihan; oleh karena itu, entri IP tidak dapat ditambahkan.", + "ORG_ZSTACK_ACL_10004": "Ekspresi aturan tidak valid, pastikan sesuai dengan standar komputasi cloud, misalnya penggunaan %s yang benar untuk placeholder. Detail: %s", + "ORG_ZSTACK_ACL_10003": "rentang IP [%s, %s] berlabrakan dengan [%s, %s] dalam grup access control list:%s", + "ORG_ZSTACK_ACL_10002": "format IP hanya mendukung ip/iprange/cidr, namun ditemukan %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10031": "Aliyun NAS PrimaryStorage hanya mendukung imagestore BS; tipe aktual yang diterima: %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10000": "Enkripsi InfoSecEncryptDriver gagal untuk sumber daya %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10001": "Dekripsi InfoSecEncryptDriver gagal untuk sumber daya virtual %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10002": "enkripsi data[%s] atau tipe algoritma enkripsi[%s] adalah nol", + "ORG_ZSTACK_AI_10068": "evaluasi model memerlukan ModelServiceType.ModelEval", + "ORG_ZSTACK_AI_10069": "Salah satu UUID dataset atau prompt diperlukan untuk evaluasi model.", + "ORG_ZSTACK_AI_10066": "UUID dari ModelServiceVO wajib diisi. Harap berikan UUID yang valid.", + "ORG_ZSTACK_AI_10067": "serviceType harus ditentukan", + "ORG_ZSTACK_ACL_10012": "url[%s] bukan merupakan jalur penyimpanan cloud yang valid", + "ORG_ZSTACK_AI_10053": "Gambar [uuid:%s] untuk arsitektur %s dinonaktifkan dan tidak dapat digunakan", + "ORG_ZSTACK_ACL_10011": "domain[%s] bukan nama domain yang valid", + "ORG_ZSTACK_AI_10054": "Gambar [uuid:%s] untuk arsitektur %s yang ditentukan tidak tersedia dan tidak dapat digunakan.", + "ORG_ZSTACK_ACL_10010": "Domain dan URL tidak boleh keduanya kosong. Harap berikan domain atau URL yang valid.", + "ORG_ZSTACK_AI_10051": "Minimal satu pengidentifikasi gambar mesin virtual (vmImageUuid) atau gambar kontainer (dockerImage) harus ditentukan untuk arsitektur %s", + "ORG_ZSTACK_AI_10052": "UUID gambar tidak valid untuk arsitektur %s: %s", + "ORG_ZSTACK_AI_10050": "Jenis arsitektur CPU tidak valid dalam pemetaan gambar arsitektur: %s, jenis yang didukung meliputi: %s", + "ORG_ZSTACK_AI_10059": "Terlalu banyak variasi tipe data dalam pesan dataset: %s, harap kurangi menjadi satu tipe", + "ORG_ZSTACK_AI_10057": "Membuat dataset tanpa menentukan tipe data dan skenario penggunaan tidak diizinkan dalam lingkungan komputasi cloud. Harap berikan detail yang diperlukan untuk dataset Anda.", + "ORG_ZSTACK_AI_10058": "Minimal satu tipe data dataset harus ditentukan saat menambahkan dataset.", + "ORG_ZSTACK_AI_10055": "Arsitektur CPU duplikat ditentukan dalam pemetaan gambar arsitektur: %s", + "ORG_ZSTACK_AI_10056": "gambar arsitektur tidak boleh kosong", + "ORG_ZSTACK_VMWARE_10101": "daftar penyimpanan gagal untuk %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10051": "Nama LUN wajib diisi tetapi menerima null. Harap pastikan nama LUN yang valid diberikan.", + "ORG_ZSTACK_VMWARE_10102": "Tidak ditemukan datastore untuk VirtualMachine: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10054": "gagal mendapatkan snapshot untuk volume:%s dengan id adalah :%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10053": "gagal mendapatkan snapshot untuk lun:%s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10012": "Penyimpanan cadangan SFTP tidak mendukung perhitungan hash gambar.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10050": "initiator[%s] sudah ada di XStor dan tidak terlampir pada host[%s]. Harap pastikan nama initiator unik.", + "ORG_ZSTACK_ALIYUN_NETWORK_10020": "Hanya instance EC2 yang dalam status berjalan atau dihentikan yang dapat melampirkan EIP, tetapi ECS [%s] saat ini dalam status [%s].", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10016": "buat file metadata gambar: %s gagal", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10017": "periksa file metadata gambar: %s gagal", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10018": "file metadata gambar: %s tidak ada", + "ORG_ZSTACK_ZWATCH_ALARM_10022": "tindakan duplikat[uuid:%s, type:%s] untuk alarm[uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10021": "tindakan[uuid:%s, type:%s] tidak ditemukan di lingkungan komputasi cloud", + "ORG_ZSTACK_ZWATCH_ALARM_10020": "tipe tindakan tidak valid[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10026": "kunci[%s] duplikat dengan nilai berbeda{%s}%", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10170": "tidak dapat menambahkan IP server ke grup server load balancer bersama %s", + "ORG_ZSTACK_ZWATCH_ALARM_10025": "metrik tidak memiliki label yang ditentukan[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10023": "label duplikat didefinisikan untuk alarm dengan UUID [uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10029": "metrik[%s] dibatasi untuk administrator dan tidak tersedia untuk peran pengguna Anda saat ini.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10171": "tidak dapat memodifikasi server backend karena vmincs dan IP server kosong", + "ORG_ZSTACK_ZWATCH_ALARM_10028": "namespace[%s] tidak berisi metrik[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10027": "namespace[%s] tidak didukung", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10049": "ID LUN tidak valid. Harap pastikan sesuai dengan format dan nilai yang diperlukan untuk perangkat penyimpanan cloud.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10048": "ID pemetaan LUN wajib diisi dan tidak boleh kosong atau nol. Harap berikan ID pemetaan LUN yang valid.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10045": "gagal mendapatkan pemetaan volume, karena: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10044": "gagal memeriksa keadaan sesi LUN %s karena: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10047": "Tidak ada mekanisme untuk mendapatkan ID pemetaan LUN; oleh karena itu, operasi gagal.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10046": "gagal mendapatkan sisa nomor LUN yang dibuat untuk LUN %s, karena: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10041": "ID snapshot wajib diisi tetapi mendapat:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10040": "gagal membuat kueri snapshot untuk instance %s karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10043": "gagal mengembalikan snapshot:%s karena: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10020": "Harap hentikan VM sebelum membuat template volume untuk penyimpanan cadangan SFTP %s.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10042": "gagal menghapus snapshot %s karena %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10023": "penyimpanan cadangan duplikat. Sudah ada penyimpanan cadangan SFTP[hostname:%s] yang ada", + "ORG_ZSTACK_LICENSE_CUBE_10000": "Konteks kode sumber tidak boleh kosong untuk validasi lisensi. Harap berikan string konteks yang valid.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10038": "gagal mendapatkan kumpulan penyimpanan %s karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10037": "gagal menghapus lun %s karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10039": "gagal membuat snapshot untuk volume %s karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10034": "id pemetaan lun wajib diisi tetapi mendapat:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10033": "gagal memetakan lun %s ke grup host %s karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10036": "id lun wajib diisi tetapi mendapat:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10035": "gagal menghapus pemetaan lun %s karena %s", + "ORG_ZSTACK_ALIYUN_NETWORK_10004": "instance ecs[%s] tidak ada, harap verifikasi.", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10001": "%s gagal mengunduh bit mesin virtual dari penyimpanan cadangan image store[hostname:%s, path: %s] ke penyimpanan primer lokal[uuid:%s, path: %s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10002": "gagal mengunggah bit dari penyimpanan lokal[uuid:%s, path:%s] ke image store [hostname:%s], %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10020": "l3network %s dan VPC %s sudah terhubung. Harap verifikasi.", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10000": "VM sumber memiliki volume data lokal pada host [UUID: %s], tetapi API clone cepat mencoba mengkloning VM ke host [%s], yang tidak didukung oleh fitur clone cepat.", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10000": "AutoScalingRuleSchedulerJobTriggerVO[UUID:%s] berada dalam keadaan %s, perubahan keadaan tidak diizinkan", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10001": "AutoScalingRuleSchedulerJobTriggerVO[uuid:%s] berada dalam periode cooldown", + "ORG_ZSTACK_ALIYUN_NETWORK_10008": "batas virtual: %s telah dihentikan", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10002": "AutoScalingRuleVO[uuid:%s] berada dalam keadaan %s, transisi keadaan tidak diizinkan", + "ORG_ZSTACK_ALIYUN_NETWORK_10005": "Hanya instans ECS dalam keadaan berjalan atau berhenti yang dapat melepaskan EIP, tetapi status saat ini dari ECS [%s] adalah [%s].", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10018": "CpeIp harus berupa alamat IPv4, tetapi sekarang adalah %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10017": "Hanya pengguna administratif yang dapat membuat koneksi di lingkungan cloud ini.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10019": "cpeIp harus berupa alamat IPv4 yang valid", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10000": "SftpBackupStorage tidak mendukung skema[%s] dalam URL[%s]", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10014": "tidak ditemukan cadangan mesin virtual untuk: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10013": "tidak ditemukan mesin virtual untuk: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_10010": "CIDR tujuan [%s] sudah ada dan menunjuk ke ID instans lain [%s]. Harap periksa atau hapus terlebih dahulu.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10061": "Gagal mengambil informasi LUN cache image", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10016": "bukan tipe instans yang didukung: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10003": "gagal membatalkan pengunduhan image, karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10060": "Cache image baru belum siap. Harap tunggu sebentar dan coba lagi.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10015": "tidak ditemukan jaringan untuk: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10004": "UUID agen SFTP Backup Storage telah berubah [diharapkan: %s, aktual: %s], yang kemungkinan besar disebabkan oleh restart manual agen. Harap issued reconnect untuk menyinkronkan status.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10010": "Tidak ditemukan CIDR untuk L3 Network: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10012": "tidak ditemukan jaringan privat virtual untuk: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10059": "tidak dapat menemukan volume: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10055": "XSStor cluster tidak sehat, info cluster[clusterDataState: %s, clusterHealthyState: %s, clusterRunningState: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10058": "ID unit logis (LUN) yang ditentukan tidak valid", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10057": "Sesi untuk lun %s dengan host %s tidak aktif di lingkungan virtual.", + "ORG_ZSTACK_HYBRID_NETWORK_10027": "cidr tumpang tindih dengan vswitch lain: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10028": "blok CIDR tidak valid: %s harus berada dalam rentang '10.0.0.0/8', '172.16.0.0/12', atau '192.168.0.0/16'", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10010": "gagal menghentikan instance %s karena %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10009": "Tidak ditemukan antarmuka jaringan virtual untuk jaringan layer 3: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10029": "tidak ada virtual border router: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10003": "CIDR kustom [%s] sudah ada di VBR [%s], tumpang tindih dengan CIDR target [%s]. Silakan periksa dan hapus terlebih dahulu.", + "ORG_ZSTACK_HYBRID_NETWORK_10020": "antarmuka router next-hop milik %s, tetapi entri milik %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10001": "Vbr: [%s] sedang membangun koneksi, silakan tunggu...", + "ORG_ZSTACK_HYBRID_NETWORK_10021": "tidak ada virtual private gateway: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10000": "CIDR kustom [%s] sudah ada di virtual router [%s], tumpang tindih dengan CIDR target [%s]. Silakan periksa dan hapus terlebih dahulu.", + "ORG_ZSTACK_HYBRID_NETWORK_10022": "jenis next-hop [%s] tidak didukung untuk membuat entri rute!", + "ORG_ZSTACK_HYBRID_NETWORK_10024": "virtual border router hanya mendukung antarmuka router sebagai jenis next-hop", + "ORG_ZSTACK_HYBRID_NETWORK_10026": "CIDR vswitch [%s] tidak berada dalam VPC [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10008": "gagal menambahkan instance %s ke grup host %s, karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10005": "gagal mendapatkan subnet zona akses karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10004": "gagal menyinkronkan zona akses karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10007": "gagal mengkueri instances %s karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10006": "gagal mengkueri semua instances, karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10001": "gagal menambahkan initiator: %s ke host, karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10000": "gagal autentikasi dengan perangkat XStor: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10002": "gagal menyalin LUN: %s ke %s, karena %s", + "ORG_ZSTACK_HYBRID_NETWORK_10038": "eip[%s] dan ecs[%s] harus berada di zona ketersediaan yang sama", + "ORG_ZSTACK_VMWARE_10135": "gagal mengatur ZStack UUID ke VCenter Managed Entity [name:%s, mor:%s] karena %s", + "ORG_ZSTACK_HYBRID_NETWORK_10039": "tidak dapat melepaskan eip: [%s], tidak terpasang pada instance mana pun", + "ORG_ZSTACK_VMWARE_10132": "Tidak tersedia nomor unit untuk disk data %s", + "ORG_ZSTACK_VMWARE_10133": "gagal membuat dvPortGroup untuk distributedSwitch [%s], %s", + "ORG_ZSTACK_VMWARE_10130": "hapus volume[%s] gagal: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10030": "tidak ada virtual router seperti ini: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10031": "localGateway bukan alamat IPv4: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10032": "peerGateway bukan alamat IPv4 yang valid: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10033": "peerGateway bukan Subnet Mask yang valid: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10034": "vlanId harus berupa nilai numerik: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10035": "tidak dapat melampirkan EIP ke ECS: [%s], EIP:[%s] sudah dilampirkan ke ECS:[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10036": "ECS [%s] sudah memiliki alamat IP publik saat ini", + "ORG_ZSTACK_HYBRID_NETWORK_10037": "tidak dapat melampirkan EIP [%s] ke ECS [%s], karena ECS sudah dikaitkan dengan EIP", + "ORG_ZSTACK_SSO_SERVICE_10014": "ID Virtual tidak ada untuk pengguna %s", + "ORG_ZSTACK_VMWARE_10129": "Layanan manajer disk virtual tidak tersedia. Silakan periksa apakah layanan sedang berjalan atau hubungi dukungan untuk bantuan.", + "ORG_ZSTACK_SSO_SERVICE_10011": "respons memiliki kesalahan: File sumber tidak ditemukan di sistem penyimpanan cloud. Silakan periksa jalur file dan pastikan file tersebut diunggah dengan benar ke lingkungan virtualisasi.", + "ORG_ZSTACK_SSO_SERVICE_10010": "redirectUrl tidak valid, %s", + "ORG_ZSTACK_VMWARE_10128": "Tidak ada pusat data yang ditemukan untuk penyimpanan data.%s", + "ORG_ZSTACK_SSO_SERVICE_10013": "akun tidak ada untuk pengguna %s", + "ORG_ZSTACK_SSO_SERVICE_10012": "Gagal membuat konfigurasi pemetaan informasi pengguna untuk klien SSO [UUID: %s]: tidak ada pemetaan atribut kustom yang ditentukan.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10030": "gagal mengkueri pemetaan LUN untuk grup host %s karena %s", + "ORG_ZSTACK_HYBRID_NETWORK_10005": "antarmuka router harus berada dalam pusat data yang sama, tetapi ri[%s] berada di dc[%s] dan ri[%s] berada di dc[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10032": "gagal mengambil informasi klaster karena %s", + "ORG_ZSTACK_VMWARE_10121": "gagal membuat dvPortGroup untuk %s", + "ORG_ZSTACK_HYBRID_NETWORK_10007": "antarmuka router[%s] tidak dalam keadaan idle, status saat ini adalah %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10031": "gagal mengkueri pemetaan LUN %s karena %s", + "ORG_ZSTACK_HYBRID_NETWORK_10009": "antarmuka router[%s] sudah memiliki koneksi aktif, koneksi tersebut adalah %s", + "ORG_ZSTACK_VMWARE_10120": "dvSwitch [%s] tidak ditemukan di vCenter [%s]. Pastikan dvSwitch ada dan dikonfigurasi dengan benar.", + "ORG_ZSTACK_GUESTTOOLS_10009": "Tidak ditemukan ISO alat OS tamu yang sesuai pada node manajemen [UUID:%s] untuk host [UUID:%s].", + "ORG_ZSTACK_GUESTTOOLS_10007": "tidak dapat memperoleh alat tamu terbaru untuk vm[uuid:%s] karena tidak berjalan atau sedang dalam pemulihan volume", + "ORG_ZSTACK_ZWATCH_ALARM_10000": "tidak dapat menemukan langganan acara [uuid:%s], mungkin sudah dihapus atau dicabut", + "ORG_ZSTACK_GUESTTOOLS_10008": "tidak dapat memperoleh alat tamu terbaru untuk VM[UUID:%s] karena VM tersebut bukan VM yang dikelola pengguna", + "ORG_ZSTACK_GUESTTOOLS_10005": "qgaStateChange gagal untuk mesin virtual[uuid:%s]", + "ORG_ZSTACK_GUESTTOOLS_10006": "tidak dapat memperoleh alat tamu terbaru untuk VM [uuid:%s] karena jenis hypervisor tidak didukung", + "ORG_ZSTACK_GUESTTOOLS_10004": "unggahan file qga gagal[%s]", + "ORG_ZSTACK_GUESTTOOLS_10001": "Terjadi kesalahan pada VM-%s: %s", + "ORG_ZSTACK_ZWATCH_ALARM_10002": "nilai interval pengulangan metrik[%s] tidak boleh kurang dari 1 jam", + "ORG_ZSTACK_GUESTTOOLS_10002": "gagal mengunggah file ke mesin virtual-%s, %s", + "ORG_ZSTACK_ZWATCH_ALARM_10001": "tidak dapat menemukan alarm[uuid:%s], mungkin sudah dihapus atau kedaluwarsa", + "ORG_ZSTACK_SSO_SERVICE_10008": "Token %s tidak ada dalam konfigurasi lingkungan cloud. Silakan verifikasi dan masukkan ulang token.", + "ORG_ZSTACK_AI_10109": "pusat model [uuid: %s] tidak ditemukan", + "ORG_ZSTACK_SSO_SERVICE_10007": "Gagal mengunggah kredensial administrator ke Keycloak. Pastikan izin dan konfigurasi jaringan yang diperlukan diatur dengan benar untuk penerapan cloud.", + "ORG_ZSTACK_ZWATCH_ALARM_10007": "Langganan event sudah memiliki label[%s]", + "ORG_ZSTACK_AI_10107": "model service instance (primer) dengan rank node 0 tidak ditemukan di grup model service instance[uuid: %s]", + "ORG_ZSTACK_ZWATCH_ALARM_10006": "event tidak memiliki label[%s]", + "ORG_ZSTACK_SSO_SERVICE_10009": "tipe data %s tidak didukung di lingkungan komputasi cloud", + "ORG_ZSTACK_AI_10108": "Grup model service instance %s tidak ditemukan di lingkungan cloud", + "ORG_ZSTACK_ZWATCH_ALARM_10005": "Tindakan dengan UUID [%s] sudah terkait dengan langganan event dengan UUID [%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10027": "gagal membuat nama LUN: %s, pesan kesalahan: %s", + "ORG_ZSTACK_SSO_SERVICE_10004": "URL metadata IdP diperlukan.%s", + "ORG_ZSTACK_AI_10105": "Penerapan model service berhasil, tetapi UUID model service instance hilang. Silakan periksa konfigurasi instance.", + "ORG_ZSTACK_SSO_SERVICE_10003": "Authorization Endpoint URL tidak valid: %s", + "ORG_ZSTACK_AI_10106": "UUID model service instance kosong; tidak dapat memproses model service instance. Pastikan UUID diberikan.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10029": "ID LUN wajib diisi saat meminta informasi pemetaan LUN.", + "ORG_ZSTACK_SSO_SERVICE_10006": "Metadata Identity Provider tidak valid: %s", + "ORG_ZSTACK_AI_10103": "grup model service instance [UUID: %s] tidak ditemukan, melewati pembuatan sumber daya untuk eksekusi layanan", + "ORG_ZSTACK_VMWARE_10118": "pembuatan grup port gagal untuk host %s karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10028": "gagal meminta LUN %s karena %s", + "ORG_ZSTACK_AI_10104": "balasan penerapan model service berhasil, tetapi grup model service instance[uuid: %s] tidak ditemukan di kumpulan instance mesin virtual", + "ORG_ZSTACK_VMWARE_10119": "pembuatan grup port gagal untuk host %s", + "ORG_ZSTACK_AI_10101": "backend penyimpanan model tidak ditemukan untuk grup model service instance[uuid: %s]", + "ORG_ZSTACK_VMWARE_10116": "portgroup[%s] sudah ada di host[%s] tetapi dengan VLAN ID(%d) yang berbeda", + "ORG_ZSTACK_AI_10102": "gagal mengalokasikan pengenal model service instance, karena %s", + "ORG_ZSTACK_VMWARE_10117": "portgroup[%s] sudah ada di host[%s]. Silakan buat grup port baru dengan nama berbeda atau hapus grup port yang sudah ada secara manual dan pasang ulang ke klaster.", + "ORG_ZSTACK_SSO_SERVICE_10002": "Klien SSO bukan tipe identitas [%s], operasi push tidak diizinkan.", + "ORG_ZSTACK_VMWARE_10114": "nama dvSwitch [%s] tidak unik", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10024": "gagal membuat nama LUN: %s, tidak dapat menemukan akar penyebab", + "ORG_ZSTACK_SSO_SERVICE_10001": "Klien SSO dengan UUID [%s] tidak ada.", + "ORG_ZSTACK_AI_10100": "grup model service instance[uuid: %s] UUID model service adalah null", + "ORG_ZSTACK_VMWARE_10115": "Host[%s:%s] tidak ditemukan di inventaris vCenter", + "ORG_ZSTACK_VMWARE_10112": "daftar dvSwitch gagal untuk %s", + "ORG_ZSTACK_HYBRID_NETWORK_10016": "%s bukan blok CIDR yang valid", + "ORG_ZSTACK_VMWARE_10113": "gagal mendapatkan nama cluster vCenter[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10017": "Aturan grup keamanan dengan parameter yang sama sudah ada. Harap modifikasi atau hapus aturan yang ada sebelum membuat aturan baru.", + "ORG_ZSTACK_VMWARE_10110": "alat tamu tidak terinstal atau berjalan untuk VM: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10018": "dstCidrBlock[%s] bukan rentang alamat IPv4 atau IPv6 yang valid", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10020": "gagal memperbarui nama LUN: %s, pesan kesalahan: %s", + "ORG_ZSTACK_VMWARE_10111": "upload file gagal untuk mesin virtual: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10019": "tidak ada instance ECS seperti itu: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10010": "accessPointUuid tidak boleh kosong jika router virtual berjenis VBR.", + "ORG_ZSTACK_HYBRID_NETWORK_10011": "tidak dapat menemukan UUID router[%s] tersebut di VirtualBorderRouterVO", + "ORG_ZSTACK_GUESTTOOLS_10018": "tidak dapat memigrasikan VM[UUID:%s], karena vfNic terpasang tetapi alat tamu tidak berjalan", + "ORG_ZSTACK_ZWATCH_ALARM_10011": "event[%s] tidak memiliki label[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10012": "tidak dapat menemukan UUID router[%s] di VpcVirtualRouterVO", + "ORG_ZSTACK_GUESTTOOLS_10019": "tidak dapat melampirkan jaringan L3 ke VM [UUID:%s], karena alat tamu tidak berjalan.", + "ORG_ZSTACK_ZWATCH_ALARM_10010": "namespace[%s] tidak mengandung event[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10013": "jenis router tidak didukung: %s", + "ORG_ZSTACK_GUESTTOOLS_10016": "tidak dapat mengubah keadaan HA VF NIC karena VF NIC [UUID:%s] tidak ditemukan", + "ORG_ZSTACK_HYBRID_NETWORK_10014": "tidak dapat menghapus entri mesin virtual tingkat sistem", + "ORG_ZSTACK_GUESTTOOLS_10017": "Gagal mengubah keadaan kartu antarmuka jaringan virtual untuk ketersediaan tinggi karena alat tamu tidak berjalan. Pastikan alat tamu terinstal dan berjalan sebelum mencoba operasi ini lagi.", + "ORG_ZSTACK_HYBRID_NETWORK_10015": "hanya mendukung aturan akses intranet di VPC", + "ORG_ZSTACK_GUESTTOOLS_10014": "Skrip berisi placeholder %s yang tidak memiliki parameter terkait. Harap berikan nilai untuk placeholder ini melalui runtimeParams untuk memastikan konfigurasi yang benar untuk lingkungan komputasi cloud Anda.", + "ORG_ZSTACK_ZWATCH_ALARM_10015": "Bidang Periode tidak didukung untuk metrik [nama:%s]", + "ORG_ZSTACK_GUESTTOOLS_10015": "tidak dapat memigrasikan penyimpanan utama karena VM [UUID:%s] terpasang ke VF Nic tetapi Alat Tamu tidak berjalan", + "ORG_ZSTACK_ZWATCH_ALARM_10014": "Bidang Periode tidak boleh kosong untuk metrik [nama:%s]", + "ORG_ZSTACK_GUESTTOOLS_10012": "encodingType dan scriptContent harus keduanya ada atau keduanya tidak ada dalam konfigurasi penerapan cloud Anda.", + "ORG_ZSTACK_ZWATCH_ALARM_10013": "namespace[%s] tidak ditemukan dalam registri namespace cloud yang ditentukan", + "ORG_ZSTACK_GUESTTOOLS_10013": "Format renderParams tidak valid, harus berupa array JSON yang valid dari pasangan kunci-nilai. Contoh: [{\\\"key\\\":\\\"k1\\\",\\\"value\\\":\\\"v1\\\"}]. Kesalahan: %s", + "ORG_ZSTACK_GUESTTOOLS_10010": "gagal memeriksa alat tamu pada host[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10019": "gagal mengkueri LUN berdasarkan jalur: %s, pesan kesalahan: %s", + "ORG_ZSTACK_GUESTTOOLS_10011": "gagal mengatur VM UUID: %s NAMA: %s hostname karena QEMU Guest Agent tidak berjalan dan tidak ada layanan DHCP", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10016": "gagal menambahkan grup host: %s, pesan kesalahan: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10015": "gagal mengkueri grup host karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10017": "gagal mengkueri LUN: %s, pesan kesalahan: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10012": "gagal menghapus grup host %s karena %s", + "ORG_ZSTACK_VMWARE_10105": "Tidak ditemukan resource pool untuk host komputasi %s", + "ORG_ZSTACK_VMWARE_10106": "gagal mencari resource pool untuk host %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10014": "gagal menghapus initiator %s karena %s", + "ORG_ZSTACK_VMWARE_10103": "gagal mengatur ESX VM UUID [%s:%s], karena [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10013": "host identifier wajib diisi tetapi mendapat:%s", + "ORG_ZSTACK_VMWARE_10104": "template [%%s] tidak ditemukan di repositori template cloud", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10029": "tidak dapat menemukan build instance dengan UUID: %s, atau sedang dalam status Menghapus", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10028": "tidak dapat menemukan UUID untuk image[%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10027": "imageStore tidak terhubung ke layanan penyimpanan cloud. Pastikan layanan penyimpanan cloud Anda dikonfigurasi dengan benar dan coba lagi.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10026": "imageStore tidak diaktifkan. Pastikan imageStore dikonfigurasi dan diaktifkan di pengaturan lingkungan cloud Anda.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10024": "tidak dapat menemukan build application: [%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10022": "build system [UUID: %s] belum dilampirkan ke compute zone [UUID: %s]", + "ORG_ZSTACK_CONTAINER_10040": "Gagal membuat deployment di klaster yang tersedia. Mencoba %d klaster: %s", + "ORG_ZSTACK_FLOWMETER_10013": "Kolektor duplikat dengan %s", + "ORG_ZSTACK_FLOWMETER_10014": "Tidak ada parameter yang ditentukan untuk permintaan provisi sumber daya cloud. Harap tentukan %s.", + "ORG_ZSTACK_FLOWMETER_10015": "[%s] tidak sesuai dengan format alamat IP", + "ORG_ZSTACK_FLOWMETER_10016": "FlowCollector[%s] tidak ada", + "ORG_ZSTACK_GUESTTOOLS_10029": "tidak dapat mengambil informasi guest tools dari VM [uuid:%s] karena tidak berjalan", + "ORG_ZSTACK_CONTAINER_10043": "Gagal mengkueri layanan cloud: %s, karena %s", + "ORG_ZSTACK_FLOWMETER_10017": "FlowMeter[%s] tidak ada", + "ORG_ZSTACK_FLOWMETER_10018": "FlowMeter[%s] tidak mendukung versi IPv6 [%s]", + "ORG_ZSTACK_GUESTTOOLS_10027": "tidak dapat melampirkan guest tools ISO ke VM [UUID:%s] karena bukan user VM", + "ORG_ZSTACK_CONTAINER_10045": "Gagal membuat layanan karena %s", + "ORG_ZSTACK_FLOWMETER_10019": "Kolektor [%s %d] duplikat dengan %s", + "ORG_ZSTACK_GUESTTOOLS_10028": "tidak dapat melampirkan guest tools ISO ke VM [uuid:%s] karena tidak memiliki perangkat CDROM", + "ORG_ZSTACK_CONTAINER_10037": "Tidak dapat menemukan klaster container apa pun. Silakan periksa NativeClusterVO untuk detail.", + "ORG_ZSTACK_GUESTTOOLS_10025": "tidak dapat melampirkan ISO alat tamu ke VM [uuid:%s] karena jenis hipervisor tidak didukung", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10057": "gagal mematikan chassis baremetal[uuid:%s] menggunakan ipmitool", + "ORG_ZSTACK_GUESTTOOLS_10026": "tidak dapat melampirkan ISO alat tamu ke VM [UUID:%s] karena VM tidak berjalan", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10058": "gagal mematikan instance baremetal[uuid:%s] melalui bm agent, alasan: %s", + "ORG_ZSTACK_GUESTTOOLS_10023": "gagal mengonfigurasi jaringan vm[uuid:%s] karena versi alat tamu terlalu rendah untuk fitur ini.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10059": "chassis baremetal2[uuid:%s] masih belum dimatikan setelah %d detik", + "ORG_ZSTACK_GUESTTOOLS_10024": "gagal mengonfigurasi jaringan vm[uuid:%s] karena alat tamu tidak berjalan.", + "ORG_ZSTACK_GUESTTOOLS_10021": "Deteksi konflik dengan nama host. VM lain dengan UUID [%s] sudah menggunakan nama host [%s] di jaringan L3 dengan UUID [%s].", + "ORG_ZSTACK_GUESTTOOLS_10022": "gagal mengonfigurasi jaringan vm[uuid:%s] karena mesin virtual tidak berjalan.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10054": "gagal建立 koneksi dengan instance baremetal2[uuid:%s] melalui gateway[uuid:%s], karena %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10055": "gagal mengubah kata sandi instance baremetal[uuid:%s] melalui gateway[uuid:%s], karena %s", + "ORG_ZSTACK_GUESTTOOLS_10020": "tidak dapat mengatur nama host VM. VM [UUID:%s] tidak memiliki jaringan Layer 3 default.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10056": "gagal menyalakan chassis baremetal[uuid:%s] menggunakan ipmitool", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10021": "tidak dapat menemukan sistem build [%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10020": "sistem build [UUID: %s] telah dilampirkan ke zona [UUID: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10050": "gagal membuat proxy konsol untuk instance baremetal[uuid:%s] di gateway[uuid:%s], karena %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10051": "gagal mengalihkan jaringan default dari l3[uuid:%s] ke l3[uuid:%s] untuk instance baremetal[uuid:%s], karena %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10018": "penambahan BuildApp gagal karena appId[%s:%s] duplikat oleh instance BuildApp lain", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10017": "tidak dapat terhubung ke sistem build penyimpanan lokal [url: %s], karena masalah konektivitas", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10016": "pembuatan BuildApp gagal karena appId[%s] duplikat oleh BuildApp lain", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10015": "Aplikasi build dinonaktifkan karena sistem build dalam status 'Stopped'. Harap mulai sistem build untuk mengaktifkan aplikasi.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10014": "panggilan rest %s gagal, karena: %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10013": "aplikasi build dalam status %s, yang tidak mendukung operasi saat ini.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10012": "tidak dapat menemukan aplikasi build berdasarkan UUID[%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10011": "tidak dapat melakukan operasi karena sistem build dalam status %s", + "ORG_ZSTACK_CONTAINER_10031": "Deployment tidak ditemukan: %s", + "ORG_ZSTACK_FLOWMETER_10003": "Jaringan[%s] telah terintegrasi ke flow meter[%s].", + "ORG_ZSTACK_FLOWMETER_10004": "Router virtual telah ditambahkan ke flow meter lain. Harap Pastikan tidak duplikat.", + "ORG_ZSTACK_FLOWMETER_10005": "parameter tipe tidak valid adalah %s dan harus dari rentang valid %s", + "ORG_ZSTACK_CONTAINER_10032": "Gagal menambal penyebaran karena %s", + "ORG_ZSTACK_CONTAINER_10034": "Gagal mengganti penyebaran karena %s", + "ORG_ZSTACK_CONTAINER_10026": "Gagal menghapus layanan karena %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10046": "gagal menghancurkan jaringan provisi di gateway[uuid:%s], karena %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10047": "tidak ditemukan NIC yang diprovisi untuk instance baremetal[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10048": "gagal membuat konfigurasi provisi untuk instance baremetal[uuid:%s] di gateway[uuid:%s], karena %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10049": "gagal menghapus konfigurasi provisi untuk instance baremetal[uuid:%s] di gateway[uuid:%s], karena %s", + "ORG_ZSTACK_IMAGEREPLICATOR_10000": "penyimpanan cadangan[uuid:%s] menjadi tidak tersedia untuk digunakan", + "ORG_ZSTACK_GUESTTOOLS_10032": "tidak dapat memperbarui status alat tamu untuk VM [uuid:%s] karena VM telah dihapus", + "ORG_ZSTACK_ALIYUN_OSS_10002": "ID kunci akses AWS, kunci akses rahasia, dan wilayah harus diatur secara bersamaan.", + "ORG_ZSTACK_CONTAINER_10029": "Kesalahan API: File sumber tidak ditemukan dalam sistem penyimpanan cloud. Harap per jalur file dan coba lagi.", + "ORG_ZSTACK_IMAGEREPLICATOR_10001": "Satu atau lebih penyimpanan cadangan[uuids:%s] telah ditambahkan ke grup replikasi[uuid:%s].", + "ORG_ZSTACK_ALIYUN_OSS_10003": "Bucket OSS tidak kosong! Pastikan bucket kosong sebelum melanjutkan operasi.", + "ORG_ZSTACK_GUESTTOOLS_10030": "tidak dapat mengambil informasi alat tamu dari VM [UUID:%s] karena bukan VM pengguna", + "ORG_ZSTACK_ALIYUN_OSS_10000": "ossBucket [%s] sudah terdaftar di dataCenter [%s]", + "ORG_ZSTACK_GUESTTOOLS_10031": "parameter debug tidak valid: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10045": "gagal mempersiapkan jaringan provisi di gateway[uuid:%s], karena %s", + "ORG_ZSTACK_ALIYUN_OSS_10001": "OssBucket[%s] tidak terkait.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10010": "ID ekspor dan UUID aplikasi build keduanya diatur tetapi tidak cocok. Harap verifikasi nilai %s dan %d.", + "ORG_ZSTACK_IMAGEREPLICATOR_10002": "Penyimpanan cadangan[uuids:%s] bukan tipe ImageStoreInstance", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10040": "Konversi data gambar ke disk lokal gagal. Harap pastikan sumber daya penyimpanan yang cukup dan izin yang benar. Jika masalah berlanjut, pertimbangkan untuk menggunakan layanan penyimpanan objek untuk manajemen gambar.", + "ORG_ZSTACK_IMAGEREPLICATOR_10003": "Penyimpanan cadangan [UUIDs:%s] tidak terkait dengan Zona apa pun", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10041": "instance baremetal2 [uuid:%s] konversi volume gagal pada chassis [uuid:%s], batas waktu setelah %d menit", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10035": "Gagal mengambil IQN target iSCSI atau IP gateway untuk volume [uuid:%s] dari penyimpanan utama [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10037": "disk chassis:%s tidak memiliki informasi WWN, harap periksa chassis dan coba lagi", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10031": "gagal melepaskan NIC yang diprovisi dari bonding pada instance baremetal [uuid:%s] melalui gateway [uuid:%s], karena %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10032": "instance baremetal2[uuid:%s] tidak terhubung; oleh karena itu, tidak dapat melampirkan NIC yang diprovisi ke bond.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10033": "gagal melampirkan NIC yang diprovisi ke bonding pada instance baremetal [uuid:%s] melalui gateway [uuid:%s], karena %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10030": "instance baremetal2[uuid:%s] tidak terhubung; oleh karena itu, tidak dapat melepaskan NIC provisi dari konfigurasi bonding.", + "ORG_ZSTACK_CONTAINER_10051": "Gagal menemukan klien Kubernetes untuk akun[uuid:%s]", + "ORG_ZSTACK_CONTAINER_10050": "Konfigurasi Kubernetes untuk klaster %s adalah null", + "ORG_ZSTACK_CONTAINER_10052": "gagal menggunakan konten file konfigurasi kube: %s", + "ORG_ZSTACK_CORE_PROGRESS_10000": "parameter apiId[%s] bukan UUID yang valid untuk konfigurasi layanan cloud.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10029": "gagal menghapus konfigurasi konversi volume ke disk lokal chassis di gateway[uuid:%s] untuk instans baremetal[uuid:%s]", + "ORG_ZSTACK_CONTAINER_10056": "Tidak dapat menemukan Container Backup Storage dengan UUID: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10024": "provisioned_ip %s tidak tersedia karena tidak dapat terhubung ke gateway %s; detail error:%s", + "ORG_ZSTACK_CONTAINER_10047": "Gagal mengambil bundle status layanan untuk layanan[%s]", + "ORG_ZSTACK_CONTAINER_10049": "Tidak dapat menemukan klaster dengan ID klaster yang ditentukan: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10027": "gagal memeriksa chassis BareMetal2 oleh instans[uuid:%s] melalui gateway[uuid:%s], karena %s", + "ORG_ZSTACK_STORAGE_CBT_10020": "Keadaan VM yang tidak terduga[UUID: %s]: %s, keadaan VM yang diharapkan adalah Running.", + "ORG_ZSTACK_STORAGE_CBT_10021": "VM [UUID: %s] sudah memiliki pekerjaan backup; oleh karena itu, mengaktifkan tugas CBT tidak diperbolehkan secara bersamaan.", + "ORG_ZSTACK_STORAGE_CBT_10016": "Tidak ada tipe hypervisor yang ditentukan untuk VM %s", + "ORG_ZSTACK_STORAGE_CBT_10017": "Tidak ada CBTBackupFactory dari tipe[%s] yang ditemukan di penyedia penyimpanan cloud yang dikonfigurasi", + "ORG_ZSTACK_STORAGE_CBT_10014": "VM [uuid: %s] telah dilindungi oleh tugas: %s", + "ORG_ZSTACK_STORAGE_CBT_10015": "pembuatan volume cbt gagal. detail: %s", + "ORG_ZSTACK_STORAGE_CBT_10018": "Tugas CVM tidak ditemukan[uuid: %s]", + "ORG_ZSTACK_STORAGE_CBT_10019": "Tugas Cbt [UUID: %s] sudah diaktifkan. Harap nonaktifkan.", + "ORG_ZSTACK_CONTAINER_10000": "penyimpanan backup container tidak mendukung format yang ditentukan %s", + "ORG_ZSTACK_CONTAINER_10002": "Tidak ada zona ketersediaan yang ditemukan untuk endpoint[%s]", + "ORG_ZSTACK_IAM2_RBAC_10006": "operasi[%s] ditolak di lingkungan komputasi cloud ini", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10008": "mendapatkan jaringan virtual[uuid:%s] dari tf controller gagal", + "ORG_ZSTACK_IAM2_RBAC_10001": "Karena proyek memerlukan penggunaan grup keamanan yang dipaksa, tag sistem wajib untuk operasi mesin virtual.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10009": "update jaringan l2[name:%s] pada tf controller gagal", + "ORG_ZSTACK_IAM2_RBAC_10000": "pembuatan instans VM gagal karena jaringan l3 [uuid:%s] tidak terpasang pada klaster komputasi manapun", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10006": "pembuatan jaringan tf L2[name:%s] pada tf controller gagal", + "ORG_ZSTACK_IAM2_RBAC_10003": "proyek[uuid:%s] sudah退休 dan semua operasi ditolak.", + "ORG_ZSTACK_IAM2_RBAC_10002": "proyek dari akun[uuid:%s] tidak ada", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10005": "mendapatkan proyek[uuid:%s] gagal di Terraform controller", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10002": "Pengambilan domain default gagal di TensorFlow controller.%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10003": "Pembuatan proyek TF untuk ZStack Admin di TF Controller gagal", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10000": "Pengendali SDN dengan nama yang ditentukan sudah ada. Silakan pilih nama lain atau gunakan yang sudah ada.", + "ORG_ZSTACK_STORAGE_CBT_10012": "tidak dapat menemukan sumber daya untuk tugas CBT[uuid: %s]", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10001": "Gagal mengambil akun admin default dari database ZStack", + "ORG_ZSTACK_STORAGE_CBT_10013": "host tidak ditemukan untuk mesin virtual: %s", + "ORG_ZSTACK_STORAGE_CBT_10011": "volume[uuid:%s] sudah diekspor untuk vmInstance[uuid:%s].", + "ORG_ZSTACK_STORAGE_CBT_10006": "tidak dapat menemukan tugas Cloud Block Storage[uuid:%s]", + "ORG_ZSTACK_STORAGE_CBT_10009": "vm[uuid: %s] sedang berjalan. Harap hentikan dan coba lagi.", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10004": "jenis parameter '%s' salah dalam ekspresi, harus bertipe %s, tetapi mendapat %s", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10003": "parameter '%s' hilang dalam ekspresi komputasi awan", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10000": "ekspresi tidak valid: %s, %s Harap pastikan ekspresi valid untuk lingkungan komputasi awan.", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10001": "ekspresi tidak valid: %s, tidak ditemukan ekspresi komputasi awan yang valid", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10019": "gagal menambahkan l3 subnet[name:%s] pada pengendali tf karena:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10082": "gateway baremetal2 dengan UUID: %s tidak terhubung; oleh karena itu, URL konsol tidak dapat dibuat untuk instance dengan UUID: %s.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10016": "gagal memperbarui l3 network[name:%s] pada pengendali tf karena:%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10013": "gagal menghapus L3 network[name:%s] pada pengendali tf karena:%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10011": "gagal menghapus l2 network[uuid:%s] pada pengendali tf", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10080": "gagal mempersiapkan jaringan provisi[uuid:%s] di gateway[uuid:%s]: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10081": "instance baremetal2 [uuid:%s] tidak ada; oleh karena itu, URL konsolnya tidak dapat dibuat.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10007": "buildAppUuid dan exportId tidak boleh keduanya null secara bersamaan. Harap pastikan bahwa buildAppUuid atau exportId diberikan.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10006": "UUID penyimpanan cadangan dan hostname keduanya diset, tetapi merujuk pada host yang berbeda", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10005": "menemukan lebih dari satu penyimpanan cadangan dengan hostname: %s, harap gunakan backupStorageUuid sebagai gantinya", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10004": "tidak dapat menemukan image store dengan hostname: %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10003": "UUID penyimpanan cadangan dan nama host keduanya null. Harap verifikasi pengaturan konfigurasi untuk penyimpanan cadangan dan nama host.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10002": "dataPath harus dimulai dengan '/', ternyata mendapat [%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10001": "sistem build lain[UUID: %s, name: %s] di host[%s] menggunakan URL yang sama[%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10000": "build-app[%s] sedang dalam keadaan diekspor atau mengekspor; harap hapus atau hilangkan terlebih dahulu.", + "ORG_ZSTACK_CAS_10000": "properti hilang untuk konfigurasi driver CAS", + "ORG_ZSTACK_CAS_10002": "ID mesin virtual salah[name:%s], tidak ada atau kata sandi salah", + "ORG_ZSTACK_CONTAINER_10020": "Gagal menghapus kebijakan jaringan karena %s", + "ORG_ZSTACK_CAS_10001": "Driver CAS tidak didukung: %s", + "ORG_ZSTACK_CONTAINER_10022": "ID klaster null saat membuat kebijakan jaringan", + "ORG_ZSTACK_CAS_10003": "Tipe data [%s] seperti itu tidak terdefinisi di CAS.", + "ORG_ZSTACK_CONTAINER_10024": "Gagal membuat kebijakan jaringan karena %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10009": "Tidak ada tugas ekspor yang ditemukan dengan ID %s dalam riwayat ekspor build. Harap verifikasi ID tugas ekspor dan coba lagi.", + "ORG_ZSTACK_CONTAINER_10023": "tidak dapat mengambil ApiClient berdasarkan ID klaster: %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10008": "buildAppUuid dan buildSystemUuid tidak boleh keduanya null. Harap pastikan salah satu dari buildAppUuid atau buildSystemUuid disediakan.", + "ORG_ZSTACK_CONTAINER_10015": "Gagal menghapus deployment karena %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10079": "tipe hypervisor klaster[uuid:%s] tidak valid", + "ORG_ZSTACK_CONTAINER_10017": "Tidak dapat menemukan pod[name=%s, namespace=%s]", + "ORG_ZSTACK_CONTAINER_10016": "Gagal menghentikan deployment karena kesalahan yang tidak ditentukan.%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10075": "gagal mengambil alamat IP gateway dari akses path [iscsiPath: %s] untuk volume blok %s karena %s", + "ORG_ZSTACK_CONTAINER_10018": "Gagal menambahkan label ke pod karena %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10076": "gagal melepaskan volume[uuid:%s] dari instance baremetal[uuid:%s] melalui gateway[uuid:%s], karena %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10028": "menambahkan konfigurasi DNS ke jaringan layer 3 [name:%s] pada controller TensorFlow gagal karena:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10077": "gagal menghancurkan volume[uuid:%s] untuk instance baremetal[uuid:%s] di gateway[uuid:%s], karena %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10078": "Semua Ceph MON dari penyimpanan primer [uuid:%s] tidak dalam kondisi Healthy", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10072": "instance baremetal2[uuid:%s] tidak terhubung; oleh karena itu, volume tidak dapat dilampirkan ke sana.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10073": "Gagal mengambil ID LUN volume pada penyimpanan primer eksternal %s. Harap pastikan sistem penyimpanan dikonfigurasi dengan benar dan dapat diakses.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10025": "menghapus rute host dari jaringan virtual[name:%s] pada controller traffic manager gagal karena:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10074": "gagal mengambil ID LUN volume [uuid:%s] untuk instance bare metal [uuid:%s] di gateway [uuid:%s], karena %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10022": "menambahkan router host ke jaringan layer-3[name:%s] pada controller tf gagal karena:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10070": "gagal melampirkan volume dengan UUID: %s ke instance baremetal dengan UUID: %s melalui gateway dengan UUID: %s karena %s", + "ORG_ZSTACK_FLOWMETER_10021": "%s harus berupa nilai numerik", + "ORG_ZSTACK_LOG4J2_10001": "Jenis appender log4j2 %s tidak diketahui", + "ORG_ZSTACK_LOG4J2_10000": "Tidak ada factory ditemukan untuk jenis appender Log4j2:%s.", + "ORG_ZSTACK_CONTAINER_10011": "Tidak ada host ditemukan untuk uuid[%s]", + "ORG_ZSTACK_CONTAINER_10013": "Tidak dapat menemukan Container Management Endpoint [uuid:%s]", + "ORG_ZSTACK_CONTAINER_10012": "Tidak ada provider ditemukan untuk vendor[%s]", + "ORG_ZSTACK_CONTAINER_10004": "Host[%s] tidak terkait dengan endpoint[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10068": "gagal menyediakan volume[uuid:%s] untuk instance baremetal[uuid:%s] melalui gateway[uuid:%s], karena %s", + "ORG_ZSTACK_CONTAINER_10005": "Tidak ada cluster ditemukan untuk endpoint[%s]", + "ORG_ZSTACK_CONTAINER_10008": "Gagal menampilkan daftar instance untuk cluster[%s]: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10064": "gagal melampirkan NIC dengan UUID:%s ke instance Baremetal2 dengan UUID:%s melalui Gateway dengan UUID:%s karena %s", + "ORG_ZSTACK_CONTAINER_10007": "Zone[%s] tidak cocok dengan Endpoint[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10065": "instance baremetal2[uuid:%s] tidak terhubung; oleh karena itu, tidak dapat dilepas dari antarmuka jaringannya.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10066": "gagal melepas antarmuka jaringan [uuid:%s] dari instance bare metal [uuid:%s] melalui gateway [uuid:%s], karena %s", + "ORG_ZSTACK_CONTAINER_10009": "Cluster[%s] sudah ada di endpoint[%s] dengan availability zone[%s] yang berbeda", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10060": "Pastikan semua gateway BareMetal2 pada jaringan provisioning [uuid:%s] terhubung.", + "ORG_ZSTACK_CONFIGURATION_10011": "strategi alokasi penyimpanan utama tidak didukung[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10061": "Daftar UUID VM instance kosong. Harap berikan setidaknya satu UUID yang valid.", + "ORG_ZSTACK_CONFIGURATION_10010": "strategi alokasi host tidak didukung[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10062": "gateway baremetal2 [UUID: %s, status: %s] tidak terhubung", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10063": "instance baremetal2[uuid:%s] tidak terhubung; oleh karena itu, tidak dapat memiliki NIC yang melekat padanya.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10031": "menghapus konfigurasi dns dari jaringan layer 3 [name:%s] pada tf controller gagal karena:%s", + "ORG_ZSTACK_STORAGE_BACKUP_10119": "installPath dan bootstrap URL keduanya diperlukan.", + "ORG_ZSTACK_STORAGE_BACKUP_10118": "Tidak mengizinkan penimpaan database dari backup di lingkungan cloud.", + "ORG_ZSTACK_STORAGE_BACKUP_10117": "backup database[uuid:%s] telah diekspor ke backup storage[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10116": "backup database [UUID %s] belum diekspor dari backup storage [UUID: %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10115": "status backup storage saat ini[%s] tidak mengizinkan melanjutkan operasi[%s], status yang valid adalah %s", + "ORG_ZSTACK_STORAGE_BACKUP_10114": "Tidak dapat建立 SSH连接 ke node peer menggunakan SSH key. Harap verifikasi konektivitas jaringan dan konfigurasi SSH key.", + "ORG_ZSTACK_STORAGE_BACKUP_10113": "bandWidth harus berupa nilai positif", + "ORG_ZSTACK_STORAGE_BACKUP_10112": "Parameter job kehilangan nilai retensi remote: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10039": "VM[uuid:%s] tidak dihentikan dan tidak berjalan pada host spesifik.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10007": "Peran security admin bawaan tidak dapat dihapus oleh peran security admin bawaan.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10038": "volume[uuid:%s] telah dipasang ke satu atau lebih VM(s)[uuid:%s] yang tidak dalam keadaan berhenti dan tidak berjalan pada host spesifik.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10008": "tidak dapat mencabut peran administrator sistem dari grup pengguna administrator sistem", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10009": "Tidak dapat menghapus audit administrator bawaan. Harap pastikan Anda tidak mencoba memodifikasi peran yang disediakan sistem.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10003": "Nama pengguna awal untuk sumber daya ini tidak dapat diperbarui.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10034": "tidak dapat menemukan replikasi volume %s pada host %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10004": "%s adalah kata kunci yang dicadangkan di lingkungan virtualisasi komputasi cloud, harap pilih nama lain.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10037": "UUID penyimpanan primer tidak boleh null. Pastikan UUID yang valid diberikan untuk penyimpanan primer.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10036": "UUID sumber daya %s tidak valid", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10006": "tidak dapat mencabut peran admin audit dari pengguna administrator bawaan", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10042": "penyimpanan mini [UUID: %s] harus kosong sebelum memulihkan bit dari ZBox. Harap bersihkan.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10001": "Tidak ditemukan factory untuk tipe output FluentBit: %s.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10010": "Tidak dapat menghapus administrator keamanan bawaan. Pastikan Anda tidak mencoba memodifikasi peran yang disediakan sistem.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10041": "tidak ada LocalStorageBackupStorageMediator yang mendukung hypervisor[%s] dan tipe penyimpanan cadangan[%s]", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10011": "Tidak dapat mencabut hak istimewa dari administrator sistem bawaan.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10003": "Nama host atau ID tidak boleh null. Harap berikan nama host atau ID yang valid.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10012": "Pastikan peran yang ingin ditambahkan memiliki identitas yang sama dan kompatibel dalam lingkungan virtualisasi Anda.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10002": "Jenis plugin FluentBit %s tidak diketahui", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10013": "Tidak dapat menambahkan peran: %s ke identitas: %s untuk ID virtual[uuid:%s]", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10005": "Nomor port tidak boleh null", + "ORG_ZSTACK_APPCENTER_UTILS_10000": "tidak dapat menemukan file template JSON di: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10004": "server penyimpanan log [alamat: %s] tidak tersedia", + "ORG_ZSTACK_APPCENTER_UTILS_10001": "Tidak dapat membuat template JSON untuk konfigurasi sumber daya cloud", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10040": "Gagal %s karena host(s)[uuid:%s] tidak diaktifkan dan tidak dalam status terhubung.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10007": "Konfigurasi baru berisi kesalahan, menyebabkan pengecualian layanan. Harap tinjau parameter konfigurasi lagi. Detail: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10006": "Pembuatan server log gagal. Parameter konfigurasi yang baru passed salah mungkin menyebabkan layanan Fluent Bit menjadi tidak aktif. Harap periksa ulang konfigurasi untuk keakuratan.", + "ORG_ZSTACK_STORAGE_BACKUP_10111": "tipe retensi remote hilang dalam parameter job", + "ORG_ZSTACK_STORAGE_BACKUP_10110": "'retentionValue' hilang dalam konfigurasi parameter job", + "ORG_ZSTACK_STORAGE_BACKUP_10129": "Tidak ditemukan instance dengan UUID volume root: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10124": "Tidak ditemukan VM untuk volume[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10123": "Operasi tidak didukung pada lampiran volume bersama", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10028": "tidak ada penyimpanan cadangan yang dapat mengambil gambar[uuid:%s] untuk volume[uuid:%s]", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10005": "Tidak dapat menemukan JoinType dalam paket yang diimpor atau kelas. Pastikan Anda telah mengimpor paket yang benar dan kelas tersebut berisi JoinType yang ditentukan.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10029": "gambar[uuid: %s] tidak memiliki referensi ke penyimpanan cadangan[uuid: %s]", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10000": "output dari [CloudFunction] kosong", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10001": "panggilan tindakan[%s] gagal, penyebab: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10023": "operasi diharapkan pada hosts[%s] tetapi hanya hosts %s yang tersedia dan diaktifkan", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10002": "tindakan: %s tidak didukung untuk peran IAM: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10120": "databaseBackup[uuid:%s] tidak diaktifkan dan tersedia", + "ORG_ZSTACK_STORAGE_SNAPSHOT_REFERENCE_10000": "Volume dengan UUID %s telah direferensikan oleh volume lain [%s]. Harap ratakan volume ini dan turunannya sebelum mengubah jalur instalasi.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10017": "cluster yang diperlukan %s tidak dilampirkan ke penyimpanan utama %s untuk pembuatan volume %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10016": "status jaringan replikasi volume [uuid:%s] telah memasuki mode StandAlone, sementara semua host dalam keadaan Terhubung; harap pulihkan terlebih dahulu.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10018": "tidak dapat menemukan host yang tersedia pada cluster yang diperlukan %s untuk pembuatan volume", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10013": "host[uuid: %s] dari penyimpanan utama mini[uuid: %s] tidak memiliki kapasitas yang cukup [saat ini: %s byte, diperlukan: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10017": "gateway baremetal2 dengan UUID: %s tidak berada di zona yang sama dengan cluster dengan UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10012": "tidak dapat mengalokasikan ruang yang cukup untuk penyimpanan utama [UUID: %s] pada host [UUID: %s], kapasitas fisik tidak mencukupi", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10018": "tidak dapat memodifikasi cluster dari gateway Baremetal2 [uuid:%s] ketika ada instans aktif yang bergantung padanya", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10015": "volume[uuid:%s] replikasi sedang menyinkronkan data, harap tunggu hingga sinkronisasi selesai.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10019": "cluster[%s] bukan tipe baremetal", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10014": "tidak dapat menemukan host yang tersedia untuk mengubah ukuran volume[uuid: %s] pada sistem penyimpanan mini[uuid: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10013": "cluster[uuid:%s] tidak tersedia", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10014": "cluster[uuid:%s] bukan klaster virtualisasi bare metal", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10022": "tidak dapat mengalokasikan port sinkronisasi penyimpanan pada host %s: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10015": "gateway[uuid:%s] tidak tersedia", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10021": "tidak dapat menemukan host yang tersedia untuk menjalankan perintah untuk penyimpanan utama[uuid: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10016": "gateway baremetal2 dengan UUID: %s sudah menjadi bagian dari cluster dengan UUID: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10010": "gateway baremetal2[uuid:%s] hanya dapat dilampirkan ke satu cluster komputasi", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10011": "gateway baremetal2 [UUID: %s] tidak dilampirkan ke cluster [UUID: %s], pelepasan tidak diperlukan.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10012": "gateway baremetal2 dengan UUID:%s saat ini hanya dilampirkan ke satu cluster; jangan lepaskan.", + "ORG_ZSTACK_STORAGE_BACKUP_10108": "'retentionPolicyType' dan 'retentionPeriod' hilang dalam parameter pekerjaan", + "ORG_ZSTACK_STORAGE_BACKUP_10107": "UUID penyimpanan cadangan tidak terduga: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10106": "Parameter pekerjaan 'backupStorageUuids' kosong. Harap pastikan UUID penyimpanan cadangan yang valid disediakan agar operasi dapat berlanjut.", + "ORG_ZSTACK_STORAGE_BACKUP_10105": "'backupStorageUuids' hilang dalam parameter pekerjaan, harap pastikan semua UUID penyimpanan cadangan yang diperlukan ditentukan", + "ORG_ZSTACK_STORAGE_BACKUP_10104": "parameter pekerjaan yang diperlukan hilang: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10103": "status tugas tidak terduga: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10102": "Tugas sinkronisasi gagal karena file sumber hilang. Harap pastikan semua file yang diperlukan diunggah dan coba lagi.", + "ORG_ZSTACK_STORAGE_BACKUP_10101": "cadangan database[uuid:%s] tidak ditemukan di repositori penyimpanan[uuid:%s]", + "ORG_ZSTACK_LOGIN_PLUGIN_10002": "Informasi LoginUserInfo hilang saat menggunakan fungsionalitas login plugin", + "ORG_ZSTACK_LOGIN_PLUGIN_10001": "tidak ditemukan plugin login bernama %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10005": "mini penyimpanan [UUID: %s, name: %s] tidak dapat menemukan host yang tersedia dalam cluster yang dilampirkan untuk membuat instance volume", + "ORG_ZSTACK_LOGIN_PLUGIN_10000": "loginPluginName hilang. Harap berikan nama plugin yang valid untuk autentikasi login.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10007": "Tidak dapat menentukan instance komputasi mana yang akan ditugaskan untuk permintaan. Pastikan instance Anda terdaftar dan diberi tag dengan benar di lingkungan cloud. Jika masalah berlanjut, hubungi dukungan untuk bantuan lebih lanjut.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10002": "host[uuid:%s] tidak terhubung ke lingkungan cloud", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10014": "tidak dapat menambahkan hak istimewa administratif ke proyek", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10006": "node baremetal2 dengan IP manajemen %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10001": "Volume cache yang masih di-cache ada pada instance [UUID:%s] tidak dapat memperbarui URL volume cache", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10015": "operasi tidak diizinkan oleh daftar putih ID mesin virtual [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10007": "Host dengan IP manajemen %s mengalami masalah.", + "ORG_ZSTACK_KVM_10110": "Host [IP:%s] telah diambil alih karena adanya identifier uniknya [HostUuid:%s] di database.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10004": "ResourceType [%s] dari APIRecoverResourceSplitBrainMsg tidak valid untuk pemulihan sumber daya cloud.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10016": "operasi ditolak oleh daftar hitam mesin virtual [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10008": "tidak dapat melampirkan gateway BareMetal2 [uuid:%s] ke cluster non-BareMetal2 [uuid:%s]", + "ORG_ZSTACK_KVM_10111": "tidak dapat menentukan arsitektur CPU host; Harap verifikasi nama pengguna dan kata sandi; %s", + "ORG_ZSTACK_STORAGE_BACKUP_10109": "'retentionType' hilang dalam konfigurasi parameter job", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10009": "gateway baremetal2 dengan UUID: %s sudah dilampirkan ke cluster dengan UUID: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10002": "Sudah ada server PXE baremetal dengan IP manajemen %s; Harap jangan gunakan untuk membuat gateway Baremetal2.", + "ORG_ZSTACK_KVM_10103": "tidak dapat terhubung ke KVM[ip:%s, username:%s, sshPort: %d] untuk melakukan validasi DNS; Harap verifikasi kebenaran nama pengguna dan kata sandi.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10004": "IP manajemen[%s] bukan alamat IPv4 atau hostname yang valid", + "ORG_ZSTACK_KVM_10104": "gagal melakukan ping ke semua alamat DNS/IP dalam %s; Harap verifikasi konektivitas jaringan dan pengaturan DNS di /etc/resolv.conf untuk memastikan instance Anda dapat mengakses internet publik.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10010": "Tidak ditemukan mesin virtual yang terhubung, operasi mini penyimpanan gagal", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10005": "tidak dapat menambahkan gateway BareMetal2 di cluster non-BareMetal2[uuid:%s]", + "ORG_ZSTACK_KVM_10105": "tidak dapat terhubung ke KVM[ip:%s, username:%s, SSH port:%d] untuk memverifikasi aksesibilitas node manajemen; Harap periksa apakah kredensial benar; %s", + "ORG_ZSTACK_VPC_HA_VPCHAGC_10000": "instance VR[uuid: %s] tidak berjalan", + "ORG_ZSTACK_KVM_10106": "host KVM [ip:%s] tidak dapat mengakses URL callback node manajemen. Sepertinya host KVM tidak dapat mencapai IP manajemen [%s]. %s %s", + "ORG_ZSTACK_VPC_HA_VPCHAGC_10001": "instance VR[uuid: %s] tidak terhubung", + "ORG_ZSTACK_KVM_10107": "tidak dapat memverifikasi apakah host接管, karena %s", + "ORG_ZSTACK_KVM_10108": "Tidak dapat mengambil timestamp flag karena %s", + "ORG_ZSTACK_KVM_10109": "Host [IP:%s] telah diambil alih, karena flag takeover [HostUuid:%s] sudah ada dan waktu pembaruan [utime %d] belum melewati interval ping host [interval ping %d].", + "ORG_ZSTACK_STORAGE_BACKUP_10100": "", + "ORG_ZSTACK_AUTOSCALING_GROUP_10009": "Salah satu penyimpanan backup [UUIDs: %s, %s] berada dalam keadaan %s, sehingga tidak dapat melakukan operasi sinkronisasi.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10008": "", + "ORG_ZSTACK_AUTOSCALING_GROUP_10007": "instance offering [UUID:%s] dinonaktifkan; tidak dapat membuat VM darinya", + "ORG_ZSTACK_AUTOSCALING_GROUP_10006": "", + "ORG_ZSTACK_AUTOSCALING_GROUP_10005": "Sumber daya tidak dapat ditemukan: InstanceOfferingVO dengan UUID [%s] tidak tersedia.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10004": "", + "ORG_ZSTACK_AUTOSCALING_GROUP_10003": "Sumber daya tidak dapat ditemukan: AutoScalingVmTemplateVO dengan UUID [%s] tidak tersedia.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10002": "", + "ORG_ZSTACK_AUTOSCALING_GROUP_10000": "autoScalingGroup[%s] gagal menambahkan VM yang baru dibuat ke grup keamanan sepenuhnya, kesalahan adalah %s", + "ORG_ZSTACK_KVM_10120": "", + "ORG_ZSTACK_KVM_10121": "menambahkan VM NIC ke grup keamanan gagal, Tidak ada grup keamanan dengan UUID=%s yang dapat ditemukan.", + "ORG_ZSTACK_KVM_10112": "", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10000": "autoScalingGroup[%s] gagal menambahkan VM yang baru dibuat ke load balancer sepenuhnya, kesalahan adalah %s", + "ORG_ZSTACK_KVM_10115": "", + "ORG_ZSTACK_KVM_10117": "menambahkan VM NIC ke load balancer gagal, Tidak ada load balancer dengan UUIDs=%s yang dapat ditemukan.", + "ORG_ZSTACK_KVM_10119": "", + "ORG_ZSTACK_AUTOSCALING_GROUP_10019": "autoScalingGroup[%s] pembuatan VM gagal sepenuhnya, kesalahan adalah %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10018": "", + "ORG_ZSTACK_AUTOSCALING_GROUP_10017": "Hanya satu aktivitas scaling yang dapat dieksekusi secara bersamaan dalam grup scaling yang sama.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10016": "", + "ORG_ZSTACK_AUTOSCALING_GROUP_10015": "host[uuid:%s] konfigurasi berubah, lama: %s, baru: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10014": "", + "ORG_ZSTACK_AUTOSCALING_GROUP_10013": "host[uuid:%s] memasuki keadaan dimatikan, kirim notifikasi", + "ORG_ZSTACK_AUTOSCALING_GROUP_10012": "", + "ORG_ZSTACK_AUTOSCALING_GROUP_10011": "arsitektur CPU host tidak cocok dengan konfigurasi cluster", + "ORG_ZSTACK_AUTOSCALING_GROUP_10010": "", + "ORG_ZSTACK_KVM_10130": "String path %s tidak valid dalam konfigurasi cloud storage", + "ORG_ZSTACK_KVM_10131": "", + "ORG_ZSTACK_KVM_10132": "vm[%s] gagal melakukan pelepasan ruang disk, karena:%s", + "ORG_ZSTACK_KVM_10123": "host[%s] belum dimatikan dalam %d detik", + "ORG_ZSTACK_KVM_10125": "gagal memeriksa file %s pada host[UUID:%s]", + "ORG_ZSTACK_KVM_10126": "Host berada dalam keadaan pra-perawatan dan sistem operasinya tidak dapat diperbarui saat ini. Silakan selesaikan operasi perawatan atau hubungi dukungan untuk bantuan.", + "ORG_ZSTACK_KVM_10127": "Host tidak dalam keadaan terhubung; oleh karena itu, operasi pembaruan OS tidak dapat dilakukan. Pastikan host terhubung sebelum mencoba memperbarui OS.", + "ORG_ZSTACK_COMPUTE_BONDING_10022": "memerlukan salah satu dari UUID slave atau nama slave", + "ORG_ZSTACK_COMPUTE_BONDING_10021": "Tidak ada antarmuka pada host dengan UUID: %s", + "ORG_ZSTACK_VMWARE_10069": "id instance [%s] tidak ditemukan", + "ORG_ZSTACK_COMPUTE_BONDING_10020": "antarmuka %s tidak ada pada host", + "ORG_ZSTACK_VMWARE_10067": "vm [%s] tidak ditemukan", + "ORG_ZSTACK_COMPUTE_BONDING_10026": "Tidak dapat menghapus antarmuka bonding yang terkait dengan jaringan manajemen. Pastikan jaringan manajemen tidak digunakan sebelum melanjutkan.", + "ORG_ZSTACK_VMWARE_10064": "Instance VM tidak ditemukan: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10029": "Perlu melewati penyesuaian aktivitas auto-scaling group", + "ORG_ZSTACK_COMPUTE_BONDING_10025": "mode bonding[%s] tidak valid", + "ORG_ZSTACK_VMWARE_10065": "gagal mematikan mesin virtual: %s, %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10028": "Tidak dapat mengambil daftar instance yang dihapus dari layanan kompute cloud", + "ORG_ZSTACK_VMWARE_10062": "gagal melanjutkan VM, status tugas: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10027": "Jumlah instance yang diluncurkan melebihi batas yang diizinkan.%s", + "ORG_ZSTACK_COMPUTE_BONDING_10023": "Tidak dapat menambahkan antarmuka SR-IOV [%s] ke Bonding karena lebih dari satu SR-IOV Dev dipilih", + "ORG_ZSTACK_VMWARE_10063": "gagal melanjutkan mesin virtual [%s]: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10026": "autoScalingGroup[%s] gagal menghentikan VMs[%s] sepenuhnya, error adalah %s", + "ORG_ZSTACK_VMWARE_10060": "gagal menangguhkan VM [%s]: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10025": "autoScalingGroup[%s] tidak terpasang ke template VM manapun", + "ORG_ZSTACK_COMPUTE_BONDING_10029": "tidak dapat menambahkan antarmuka baru ke bond[%s] karena sudah berisi antarmuka yang diaktifkan SR-IOV", + "ORG_ZSTACK_AUTOSCALING_GROUP_10024": "auto scaling group[%s] dalam keadaan tidak terduga, diharapkan: keadaan %s", + "ORG_ZSTACK_COMPUTE_BONDING_10028": "tidak dapat memasang antarmuka berulang kali ke bond[%s].", + "ORG_ZSTACK_AUTOSCALING_GROUP_10023": "defaultL3NetworkUuid[uuid:%s] tidak ada di l3NetworkUuids %s", + "ORG_ZSTACK_SNS_PLATFORM_DINGTALK_10000": "gagal mengirim pesan ke DingTalk. status: %s, body: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10022": "Lebih dari satu jaringan Layer 3 ditentukan di l3NetworkUuids, tetapi defaultL3NetworkUuid adalah null", + "ORG_ZSTACK_KVM_10140": "gagal membuat bridge[%s] untuk l2Network[uuid:%s, type:%s, vlan:%s] pada host KVM[uuid:%s], karena %s", + "ORG_ZSTACK_COMPUTE_BONDING_10027": "Tidak dapat menghapus antarmuka bonding yang dikonfigurasi dengan IP VTEP. Pastikan semua jaringan virtual terkait dilepaskan terlebih dahulu.", + "ORG_ZSTACK_KVM_10141": "gagal memeriksa bridge[%s] untuk l2VlanNetwork[uuid:%s, name:%s] pada host KVM[uuid:%s], %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10021": "l3Network[uuid:%s] adalah jaringan sistem dan tidak dapat digunakan untuk membuat VM pengguna.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10020": "l3Network dengan UUID:%s Dinonaktifkan; oleh karena itu, pembuatan VM pada jaringan ini tidak diizinkan.", + "ORG_ZSTACK_KVM_10143": "gagal menghapus bridge[%s] untuk l2Network[uuid:%s, type:%s, vlan:%s] pada host KVM[uuid:%s], karena %s", + "ORG_ZSTACK_KVM_10144": "Gagal memulai VM karena fitur hypervisor tidak dapat dinonaktifkan dengan mode CPU diatur ke none. Silakan periksa pengaturan konfigurasi CPU Anda.", + "ORG_ZSTACK_KVM_10134": "hook XML[%s] telah dikaitkan dengan VM %s, jadi harap unbinding sebelum menghapusnya", + "ORG_ZSTACK_KVM_10136": "Hook XML bertipe Sistem tidak diperbolehkan di lingkungan komputasi cloud. Pastikan semua konfigurasi tingkat sistem mematuhi standar virtualisasi.", + "ORG_ZSTACK_KVM_10137": "Nama hook XML [%s] sudah ada dalam konfigurasi mesin virtual.", + "ORG_ZSTACK_KVM_10138": "telah ada host KVM dengan IP manajemen[%s]", + "ORG_ZSTACK_KVM_10139": "tidak dapat membuat perangkat VLAN pada %s karena nama terlalu panjang", + "ORG_ZSTACK_VMWARE_10059": "gagal menghentikan VM, status tugas: %s", + "ORG_ZSTACK_COMPUTE_BONDING_10033": "L2 network [uuid:%s] tidak ada", + "ORG_ZSTACK_BILLING_10008": "Tanggal mulai harus lebih awal dari tanggal akhir.", + "ORG_ZSTACK_COMPUTE_BONDING_10032": "tidak dapat melepas antarmuka berulang kali dari bond[%s].", + "ORG_ZSTACK_COMPUTE_BONDING_10031": "tidak dapat melepas antarmuka[%s] dari bond[%s] yang dalam keadaan bonded.", + "ORG_ZSTACK_COMPUTE_BONDING_10030": "Tidak dapat menambahkan antarmuka SR-IOV [%s] ke Bonding karena hanya satu antarmuka dalam bond yang dapat mengaktifkan SR-IOV.", + "ORG_ZSTACK_BILLING_10005": "Penagihan dinonaktifkan untuk sumber daya ini. Pastikan penagihan diaktifkan untuk menggunakan layanan ini.", + "ORG_ZSTACK_COMPUTE_BONDING_10037": "Tidak dapat melampirkan L2 network ke cluster [UUID: %s]. Antarmuka [UUID: %s, name: %s] pada host [UUID: %s] dikaitkan dengan jenis layanan tetapi tidak menyertakan TenantNetwork sebagai salah satunya.", + "ORG_ZSTACK_BILLING_10004": "jenis sumber daya penagihan yang tidak didukung [%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10036": "Tidak dapat melampirkan L2 network ke cluster [UUID]. Antarmuka bonding [UUID, name] pada host [UUID] memiliki asosiasi jenis layanan bonding tetapi tidak memiliki jenis layanan TenantNetwork.", + "ORG_ZSTACK_BILLING_10003": "Pastikan konfigurasi harga yang benar ditetapkan untuk pengguna, misalnya: `priceUserConfig:{\\nvolume:{\\npriceKeyName:\"priceKeyName\"}}`", + "ORG_ZSTACK_COMPUTE_BONDING_10035": "Tidak dapat melampirkan L2 network ke cluster [uuid:%s]: antarmuka fisik [%s] digunakan dalam bond pada satu atau lebih host. Host yang berkonflik: [%s]", + "ORG_ZSTACK_VMWARE_10051": "vmUuid [%s] tidak ditemukan di sistem host ESX [%s]", + "ORG_ZSTACK_BILLING_10002": "Pastikan konfigurasi harga yang benar untuk pengguna ditetapkan, misalnya: `priceUserConfig:{rootVolume:{priceKeyName:\"priceKeyName\"}}`", + "ORG_ZSTACK_COMPUTE_BONDING_10034": "L2 network [uuid:%s] memiliki definisi antarmuka fisik kosong", + "ORG_ZSTACK_BILLING_10001": "dateInLong kurang dari %s milidetik", + "ORG_ZSTACK_BILLING_10000": "priceKeyName adalah null. Pastikan nama kunci untuk penetapan harga dikonfigurasi dengan benar.", + "ORG_ZSTACK_VMWARE_10050": "Menyinkronkan dengan vCenter[uuid:%s], harap coba lagi nanti.", + "ORG_ZSTACK_KVM_10150": "tidak dapat mengambil vmUuid dari pesan %s", + "ORG_ZSTACK_KVM_10151": "tidak dapat menyinkronkan mesin virtual pada host[uuid:%s, ip:%s] karena %s", + "ORG_ZSTACK_COMPUTE_BONDING_10038": "gagal menambahkan Linux bonding ke host[uuid:%s] : %s", + "ORG_ZSTACK_KVM_10152": "VM[%s] dalam keadaan dimatikan untuk waktu yang lama; harap verifikasi statusnya.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10032": "Tipe Removal Policy[%s] tidak didukung", + "ORG_ZSTACK_V2V_VMWARE_10015": "Tidak ada IP yang tersedia di CIDR %s pada host %s; harap hubungkan kembali host untuk menyegarkan IP.", + "ORG_ZSTACK_KVM_10154": "gagal memperbarui bridge[%s] untuk l2Network[uuid:%s, name:%s] pada host KVM[uuid: %s], %s", + "ORG_ZSTACK_V2V_VMWARE_10016": "Sudah ada pekerjaan yang berjalan lama[uuid:%s] mengonversi VM dari %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10030": "pemicu deleteAutoScalingRule[%s] gagal, kesalahan adalah %s", + "ORG_ZSTACK_V2V_VMWARE_10017": "Gagal memperbarui dependensi host konversi untuk mesin virtual %s", + "ORG_ZSTACK_KVM_10146": "gagal menerapkan aturan grup keamanan ke host KVM[uuid:%s], karena %s", + "ORG_ZSTACK_KVM_10147": "gagal memeriksa aturan default grup keamanan pada host KVM[uuid:%s], karena %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10101": "tidak dapat menetapkan port redirect atau kode status tanpa menentukan URL redirect HTTP", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10009": "gagal mendeteksi heartbeat, kode: %s, detail: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10104": "loadBalancer listener[%s] tidak mendukung modifikasi status persistensi sesi", + "ORG_ZSTACK_IAM2SCRIPT_10010": "Eksekutor skrip yang ditentukan tidak didukung di lingkungan komputasi cloud ini. Silakan merujuk ke daftar eksekutor yang didukung untuk informasi lebih lanjut.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10105": "tidak dapat mendukung redirect HTTP ke HTTPS dan persistensi sesi secara bersamaan di lingkungan cloud", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10102": "tidak dapat mendukung protokol selain HTTP saat menentukan redirect HTTP ke HTTPS", + "ORG_ZSTACK_VMWARE_10048": "Host tidak terhubung ke lingkungan cloud. Harap pastikan host dikonfigurasi dan diotorisasi dengan benar.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10108": "listener[%s] memodifikasi persistensi sesi; harus menentukan algoritma load balancing", + "ORG_ZSTACK_V2V_VMWARE_10007": "Gagal memparse URL %s", + "ORG_ZSTACK_COMPUTE_BONDING_10044": "gagal melampirkan nic ke linux bonding pada host[uuid:%s] : %s", + "ORG_ZSTACK_VMWARE_10046": "Tidak dapat melepas NIC karena Network Interface Card (NIC) tidak didukung untuk operasi hotplug di vCenter.", + "ORG_ZSTACK_BILLING_10019": "harga gpu harus diikat ke UUID GPU %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10109": "listener[%s] algoritma load balancing %s tidak mendukung modifikasi persistensi sesi kecuali dengan menetapkan iphash secara eksplisit", + "ORG_ZSTACK_V2V_VMWARE_10008": "nama dataCenter tidak dapat mengandung karakter khusus %s", + "ORG_ZSTACK_IAM2SCRIPT_10002": "Konten skrip kosong. Harap pastikan cuplikan kode Java didefinisikan dengan benar dan disertakan dalam file sumber.", + "ORG_ZSTACK_BILLING_10018": "Harga GPU harus diikat ke UUID GPU yang valid. Harap berikan UUID yang tidak kosong.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10106": "listener[%s] tidak dapat memodifikasi penulisan ulang persistensi sesi ketika mode HTTP diatur ke http-tunnel", + "ORG_ZSTACK_V2V_VMWARE_10009": "Nama VM target tidak dapat mengandung karakter khusus %s", + "ORG_ZSTACK_IAM2SCRIPT_10001": "Gagal mendekode konten skrip. Harap memastikan file sumber tersedia dan diformat dengan benar untuk lingkungan komputasi cloud.", + "ORG_ZSTACK_COMPUTE_BONDING_10042": "Gagal menghapus Linux bond dari host[uuid:%s] : %s", + "ORG_ZSTACK_VMWARE_10044": "CPU HOST dan Guest OS tidak kompatibel. Pastikan CPU HOST Anda mendukung teknologi virtualisasi yang diperlukan atau perbarui Guest OS ke versi yang kompatibel.", + "ORG_ZSTACK_BILLING_10017": "harga harus dalam rentang 0 dan 999999999.99", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10107": "listener[%s] mengubah persistensi sesi ke hash IP; harus menentukan algoritma balancer sumber", + "ORG_ZSTACK_VMWARE_10045": "Memeriksa kompatibilitas dengan mesin virtual %s gagal di host %s", + "ORG_ZSTACK_BILLING_10016": "Satuan sumber daya minimum untuk alokasi adalah megabyte, bukan byte.", + "ORG_ZSTACK_SDNCONTROLLER_10008": "Jaringan SDN L2 [UUID:%s] tidak terhubung ke controller", + "ORG_ZSTACK_IAM2SCRIPT_10007": "Fungsi skrip IAM2 tidak diaktifkan. Pastikan layanan IAM2 diaktifkan di lingkungan cloud Anda.", + "ORG_ZSTACK_BILLING_10015": "resourceName[%s] adalah identifier yang tidak valid dalam konteks komputasi awan", + "ORG_ZSTACK_IAM2SCRIPT_10005": "Tidak dapat mengambil output eksekusi skrip. Silakan periksa instans cloud dan pengaturan jaringan.", + "ORG_ZSTACK_COMPUTE_BONDING_10046": "gagal melepas NIC dari Linux bonding pada host[uuid:%s] : %s", + "ORG_ZSTACK_VMWARE_10040": "UUID host tujuan tidak ada. Pastikan UUID untuk host target ditentukan dengan benar.", + "ORG_ZSTACK_IAM2SCRIPT_10004": "Menjalankan skrip iam2 gagal. Silakan periksa apakah lingkungan komputasi awan yang diperlukan sudah diatur dengan benar.", + "ORG_ZSTACK_VMWARE_10041": "Host target tidak mendukung manajemen mesin virtual. Pastikan host tujuan adalah host ESX atau vSphere.", + "ORG_ZSTACK_KVM_10161": "Nomor port VNC[%d] yang tidak terduga untuk mesin virtual [uuid:%s]", + "ORG_ZSTACK_IAM2SCRIPT_10009": "Jumlah parameter melebihi batas yang diizinkan.", + "ORG_ZSTACK_IAM2SCRIPT_10008": "Skrip tidak berisi kode apa pun. Pastikan input Anda menyertakan kode Java yang valid.", + "ORG_ZSTACK_SDNCONTROLLER_10000": "Tidak dapat membuat jaringan SDN L2 karena UUID SDN Controller hilang di systemTags permintaan API. Pastikan UUID SDN Controller ditentukan dengan benar.", + "ORG_ZSTACK_V2V_VMWARE_10003": "Nama cluster tidak boleh berisi karakter berikut: %s", + "ORG_ZSTACK_SDNCONTROLLER_10002": "tidak dapat menemukan controller SDN untuk jaringan Layer 2[uuid:%s, vswitchType:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10001": "Tidak dapat membuat jaringan SDN L2 karena UUID controller SDN hilang dari permintaan API. Pastikan UUID disertakan.", + "ORG_ZSTACK_V2V_VMWARE_10006": "gagal menghentikan instance VM %s sebelum migrasi v2v", + "ORG_ZSTACK_KVM_10157": "reply[%s] bukan KVMHostAsyncHttpCallResponse", + "ORG_ZSTACK_KVM_10158": "reply[%s] mengembalikan dengan body respons kosong", + "ORG_ZSTACK_KVM_10159": "%s operasi gagal: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10040": "EcsInstance harus dalam keadaan berjalan atau dihapus ketika menghapus EIP.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10111": "listener[%s] tidak mendukung modifikasi batas waktu idle dan nama cookie; persistensi sesi harus ditentukan.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10112": "listener[%s] tidak mendukung modifikasi batas waktu idle ketika persistensi sesi dinonaktifkan", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10110": "listener[%s] %s algoritma load balancing tidak mendukung modifikasi persistensi sesi kecuali dengan secara eksplisit menetapkan nonaktifkan.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10115": "batas waktu idle sesi tidak valid[%s], harus berupa bilangan bulat positif antara[%s~%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10040": "gagal memperbarui Linux bonding pada host[uuid:%s] : %s", + "ORG_ZSTACK_VMWARE_10039": "UUID host hilang dalam permintaan metadata", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10116": "Protokol pemeriksaan kesehatan HTTP harus ditentukan untuk parameter pemeriksaan kesehatannya %s.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10113": "listener[%s] tidak mendukung modifikasi nama cookie ketika persistensi sesi tidak diatur ke rewrite.", + "ORG_ZSTACK_VMWARE_10037": "Tidak ada distributed virtual switch atau qualified virtual switch yang ditemukan", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10114": "listener[%s] tidak mendukung modifikasi pengulisan ulang URL berbasis sesi tanpa mengubah nama cookie", + "ORG_ZSTACK_VMWARE_10038": "Datastore %s tidak ditemukan untuk vCenter %s", + "ORG_ZSTACK_BILLING_10009": "resourceType dan resourceUUID tidak boleh kosong secara bersamaan", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10119": "target pemeriksaan kesehatan[%s] tidak valid, formatnya harus checkProtocol:port, misalnya tcp:default", + "ORG_ZSTACK_SDNCONTROLLER_10015": "tidak dapat menambahkan SDN controller karena jenis: %s tidak ada dalam daftar yang didukung: %s", + "ORG_ZSTACK_SDNCONTROLLER_10014": "tidak dapat menambahkan aturan security group karena UUID[:%s] remote security group controller tidak cocok dengan UUID[:%s] local security group controller", + "ORG_ZSTACK_VMWARE_10036": "Tidak ada compute resource yang tersedia untuk operasi clustering.%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10117": "kode status yang diharapkan[%s] dari protokol pemeriksaan kesehatan HTTP tidak valid", + "ORG_ZSTACK_SDNCONTROLLER_10017": "tidak dapat menambahkan SDN controller karena controller [IP:%s] sudah terdaftar", + "ORG_ZSTACK_VMWARE_10033": "SSL handshake gagal dengan vCenter [%s] karena TLS 1.0 yang tidak aman digunakan. Aktifkan TLS 1.0 secara manual di konfigurasi JDK jika diperlukan.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10118": "listener dengan protokol [%s] tidak mendukung pemilihan security policy", + "ORG_ZSTACK_SDNCONTROLLER_10016": "tidak dapat menambahkan SDN controller karena ip[%s] bukan alamat unicast yang valid", + "ORG_ZSTACK_VMWARE_10034": "SSL handshake gagal dengan vCenter [%s], harap verifikasi nomor port [%d].", + "ORG_ZSTACK_BILLING_10027": "Billing diaktifkan. Operasi ini hanya diizinkan ketika billing dinonaktifkan.", + "ORG_ZSTACK_SDNCONTROLLER_10019": "tidak dapat menambahkan host [UUID:%s] ke SDN controller [UUID:%s], karena subnet mask tidak ditentukan", + "ORG_ZSTACK_VMWARE_10031": "Login ke vCenter Server [%s] gagal dengan kredensial pengguna. Harap periksa koneksi jaringan dan kredensial yang diberikan.", + "ORG_ZSTACK_BILLING_10026": "endDate tidak boleh lebih awal dari startDate", + "ORG_ZSTACK_SDNCONTROLLER_10018": "tidak dapat menambahkan host[uuid:%s] ke SDN controller[uuid:%s], karena sudah terpasang ke SDN controller lain", + "ORG_ZSTACK_VMWARE_10032": "Parse response gagal dari vCenter [%s], harap verifikasi nomor port [%d].", + "ORG_ZSTACK_BILLING_10025": "endDateInLong diatur, tidak ada modifikasi yang diizinkan di lingkungan cloud untuk memastikan konsistensi data dan kepatuhan terhadap standar virtualisasi.", + "ORG_ZSTACK_BILLING_10024": "endDateInLong dan setEndDateInLongBaseOnCurrentTime tidak boleh dikonfigurasi secara bersamaan. Harap pilih satu untuk pengaturan Anda.", + "ORG_ZSTACK_VMWARE_10030": "koneksi ke cloud resource gagal: %s", + "ORG_ZSTACK_BILLING_10023": "endDateInLong tidak diperbolehkan memiliki nilai negatif", + "ORG_ZSTACK_BILLING_10022": "accountUuid dan tableUuid saling eksklusif; hanya satu yang dapat diatur.", + "ORG_ZSTACK_BILLING_10021": "priceTable[uuid=%s] tidak diperbolehkan untuk dihapus di lingkungan cloud ini.", + "ORG_ZSTACK_BILLING_10020": "Akun[uuid=%s] telah melampirkan tabel harga", + "ORG_ZSTACK_LONGJOB_10007": "tidak dapat membatalkan pekerjaan jangka panjang yang sudah berhasil", + "ORG_ZSTACK_SDNCONTROLLER_10011": "Operasi pull tenant hanya didukung untuk pengendali H3C VCFC V2X", + "ORG_ZSTACK_LONGJOB_10008": "Tidak dapat membatalkan pekerjaan jangka panjang yang telah gagal", + "ORG_ZSTACK_LONGJOB_10009": "Hapus pekerjaan jangka panjang hanya ketika mereka berhasil, dibatalkan, atau gagal.", + "ORG_ZSTACK_SDNCONTROLLER_10013": "tidak dapat menambahkan vmnic ke grup keamanan karena mereka memiliki pengendali SDN yang berbeda [UUID pengendali NIC: %s, UUID pengendali Grup Keamanan: %s]", + "ORG_ZSTACK_SDNCONTROLLER_10012": "Gagal mengambil data penyewa: %s", + "ORG_ZSTACK_LONGJOB_10010": "jalankan ulang longjob hanya ketika berhasil, dibatalkan, atau gagal", + "ORG_ZSTACK_LONGJOB_10011": "hanya dapat melanjutkan longjob yang berada dalam status Ditangguhkan", + "ORG_ZSTACK_LONGJOB_10012": "%s tidak memiliki tugas jangka panjang yang sesuai", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10122": "cloud tidak dapat mengubah pendengar load balancer karena pendengar dengan protokol [%s] tidak mendukung pemilihan versi HTTP [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10123": "cloud tidak dapat mengubah pendengar load balancer karena protokol HTTPS hanya mendukung versi HTTP: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10120": "pendengar dengan protokol [%s] tidak kompatibel dengan pemeriksaan kesehatan ini:[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10121": "Protokol pemeriksaan kesehatan HTTP harus ditentukan. Harap sertakan parameter pemeriksaan kesehatannya, seperti healthCheckMethod dan healthCheckURI.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10126": "cloud tidak mendukung perubahan pendengar load balancer karena pendengar dengan protokol [%s] tidak mendukung kompresi konten", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10127": "cloud tidak dapat mengubah pendengar load balancer karena hanya mendukung algoritma kompresi [%s]", + "ORG_ZSTACK_VMWARE_10029": "Login gagal. Harap verifikasi kredensial Anda dan pastikan Anda menggunakan parameter login yang benar untuk layanan komputasi cloud.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10124": "cloud tidak dapat mengubah pendengar load balancer karena pendengar protokol TCP hanya mendukung proxy TCP untuk pengaturan parameter.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10125": "cloud tidak dapat mengubah pendengar load balancer karena hanya mendukung protokol proxy TCP %s", + "ORG_ZSTACK_VMWARE_10027": "VCenter[uuid:%s] tidak ditemukan: Lingkungan virtualisasi dengan UUID yang ditentukan tidak ada.", + "ORG_ZSTACK_TAG_10004": "tidak ada tag sistem yang cocok[%s] untuk tipe sumber daya[%s]", + "ORG_ZSTACK_SDNCONTROLLER_10026": "Operasi pull tenant tidak didukung untuk Pengendali SDN [uuid:%s, vendorType:%s, vendorVersion:%s]. Hanya pengendali H3C VCFC V2 yang mendukung operasi ini.", + "ORG_ZSTACK_LOG_10007": "Jenis konfigurasi log tidak diketahui %s", + "ORG_ZSTACK_SDNCONTROLLER_10025": "Pengendali SDN [UUID:%s] tidak ditemukan", + "ORG_ZSTACK_TAG_10005": "validasi tag sistem [%s] untuk tipe sumber daya[%s] gagal", + "ORG_ZSTACK_LOG_10006": "Jenis konfigurasi yang tidak diketahui untuk server log %s", + "ORG_ZSTACK_SDNCONTROLLER_10028": "tidak dapat mengubah pengendali SDN karena rentang VLAN[%s] tidak dalam format yang benar", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10128": "versi IP tidak valid[%s], harus IPv4 atau IPv6", + "ORG_ZSTACK_LOG_10005": "Akun [uuid:%s] tidak memiliki otorisasi untuk menambahkan server log tambahan. Hanya akun administrator yang memiliki hak ini.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10129": "tidak dapat menghapus grup server default[uuid:%s]", + "ORG_ZSTACK_LOG_10004": "Akses ditolak: Akun[uuid:%s] tidak berwenang untuk mengambil log node manajemen. Hanya akun administratif yang memiliki hak istimewa ini.", + "ORG_ZSTACK_TAG_10008": "tag[%s] hanya untuk penggunaan administratif", + "ORG_ZSTACK_LOG_10003": "Akun [UUID:%s] tidak berwenang untuk melakukan operasi pada server log [UUID:%s].", + "ORG_ZSTACK_SDNCONTROLLER_10029": "tidak dapat mengubah SDN controller karena rentang VLAN[%s] tumpang tindih dengan rentang VLAN lain", + "ORG_ZSTACK_LOG_10002": "Tidak ada factory ditemukan untuk type:%s", + "ORG_ZSTACK_TAG_10006": "Tidak ada system tag yang cocok ditemukan untuk %s", + "ORG_ZSTACK_SDNCONTROLLER_10020": "tidak dapat menambahkan host [UUID:%s] ke SDN controller [UUID:%s], karena vTEP IP digunakan oleh host [UUID:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10022": "tidak dapat memperbarui host [uuid:%s] dari SDN controller [uuid:%s], karena host belum ditambahkan ke SDN controller", + "ORG_ZSTACK_TAG_10000": "Duplikat Tag[tag:%s, Type:%s, Resource_Type:%s, Resource_Uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10021": "tidak dapat membatalkan registrasi host [uuid:%s] dari SDN controller [uuid:%s], karena host belum terdaftar dengan SDN controller", + "ORG_ZSTACK_SDNCONTROLLER_10024": "Tidak dapat melampirkan L3 network ke VM karena beberapa tenant di SDN controller [uuid:%s] telah dihapus. Silakan jalankan sinkronisasi tenant terlebih dahulu untuk memperbarui status tenant.", + "ORG_ZSTACK_SDNCONTROLLER_10023": "tidak dapat memperbarui host[uuid:%s] dari SDN controller[uuid:%s], karena netmask ditentukan", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10000": "verifikasi integritas data batch gagal, jenis resource tidak didukung: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10002": "gagal menambahkan resource integrity, jenis resource tidak didukung: %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10002": "kesalahan template: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10134": "tidak dapat menambahkan VMNic server backend ke grup server [UUID:%s], karena berat VMNic [%s] bukan angka yang valid", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10008": "gagal mengambil cache gambar dengan ID:%s: GetImageHashValueReply.hashValue adalah null", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10009": "verifikasi konsistensi cache gambar[%s] gagal karena masalah lingkungan mesin virtual", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10000": "tidak ada template yang tersedia untuk jenis ini: %s,", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10132": "tidak dapat menambahkan VMNIC server backend dengan UUID:%s ke grup server dengan UUID:%s karena VMNIC tidak ada", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10137": "tidak dapat menambahkan NIC server backend ke grup server [uuid:%s], karena IP NIC [ipAddress:%s] duplikat", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10003": "start perlindungan data encryptType[%s] tidak valid", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10138": "tidak dapat menambahkan antarmuka jaringan mesin virtual [uuid:%s] ke grup server [uuid:%s] karena listener [uuid:%s] sudah melampirkan antarmuka jaringan grup server ini", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10004": "snapshot[uuid:%s] tidak terenkripsi di lingkungan virtualisasi", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10135": "L3 networks dengan UUID:%s yang terkait dengan VM nics tidak memiliki layanan jaringan:%s diaktifkan", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10005": "verifikasi konsistensi volume snapshot[%s] gagal karena kondisi tidak konsisten", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10136": "VM NICs [UUID: %s] sudah terkait dengan grup server load balancer [UUID: %s].", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10006": "kesalahan enkripsi: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10139": "tidak dapat menambahkan IP server backend ke grup server [UUID:%s], karena IP [IP Address:%s] sudah terdaftar", + "ORG_ZSTACK_VMWARE_10097": "VCENTER[%s] tidak dalam status operasional, status saat ini: %s", + "ORG_ZSTACK_VMWARE_10098": "vdisk tidak ditemukan: %s", + "ORG_ZSTACK_VMWARE_10095": "Gagal mendapatkan daftar tugas terbaru, detail: %s", + "ORG_ZSTACK_VMWARE_10096": "VCENTER_SERVER_TIDAK_DITEMUKAN", + "ORG_ZSTACK_VMWARE_10093": "Penyimpanan backup vCenter tidak mendukung perhitungan hash gambar.", + "ORG_ZSTACK_VMWARE_10091": "Fitur untuk %s belum didukung di lingkungan cloud.", + "ORG_ZSTACK_TAG_10011": "tag[uuid:%s] adalah tag sistem bawaan dan tidak dapat dihapus.", + "ORG_ZSTACK_TAG_10012": "Argumen 'resourceType' tidak cocok dengan UUID yang diharapkan. Pastikan tipe sumber daya ditentukan dengan benar sebagai UUID.", + "ORG_ZSTACK_VMWARE_10090": "Gambar %s tidak ditemukan di penyimpanan cadangan. Pastikan path gambar benar dan coba lagi.", + "ORG_ZSTACK_TAG_10010": "tidak ada tipe sumber daya yang ditemukan di sistem tag %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10010": "kegagalan cache gambar enkripsi[id:%s]: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10011": "tipe node %s file integritas[path:%s] sudah ada di lingkungan tervirtualisasi", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10012": "tipe node tidak valid[%s]", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10013": "gagal menambahkan file integritas[%s.%s], sekarang menjadi direktori.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10141": "VMNic atau alamat IP null. Silakan periksa pengaturan konfigurasi jaringan Anda.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10143": "host %s tidak ada", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10148": "vmnics semuanya tidak dikaitkan dengan grup server [%s]", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10014": "penyimpanan primer eksternal[uuid:%s, name:%s] mengembalikan status tidak sehat: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10149": "Eksekusi shell gagal karena %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10015": "menemukan klien aktif untuk volume[uuid:%s, mountPath %s, client:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10146": "alamat IP server semuanya tidak dikaitkan dengan grup server [%s]", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10000": "gagal menambahkan file verifikasi integritas[%s.%s], karena %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10016": "Penyimpanan Backup vCenter tidak mendukung pembatalan unduhan gambar.", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10001": "%s sumber daya sudah diprovisikan", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10147": "protokol tidak terduga: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10017": "Tidak ada penyimpanan data yang terpasang ke %s", + "ORG_ZSTACK_VMWARE_10088": "Penyimpanan data tidak ditemukan untuk %s", + "ORG_ZSTACK_VMWARE_10086": "weight tidak valid[serverIp:%s, weight:%s], weight tidak dalam rentang valid [%d, %d]", + "ORG_ZSTACK_VMWARE_10085": "Alamat IP server [uuid:%s] sudah dikaitkan dengan grup server load balancer [uuid:%s].", + "ORG_ZSTACK_VMWARE_10082": "loadbalancerServerGroup [%s] tidak ada", + "ORG_ZSTACK_VMWARE_10083": "file integritas[%s.%s] tidak ada", + "ORG_ZSTACK_VMWARE_10080": "vCenter[uuid=%s] dinonaktifkan. Anda hanya dapat melakukan operasi baca-saja pada vCenter ini. Untuk membuat perubahan konfigurasi, perbarui konfigurasi vCenter menggunakan UpdateVCenterAction {uuid=%s state=Enabled}", + "ORG_ZSTACK_VMWARE_10081": "VCENTER[uuid=%s] dinonaktifkan. Anda hanya dapat melakukan operasi baca-saja pada VCENTER ini.", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10021": "kegagalan snapshot terenkripsi[uuid:%s]: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10151": "tidak dapat menambahkan grup server dengan UUID:%s ke listener dengan UUID:%s karena antarmuka jaringan dengan UUID:%s sudah terkait", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10152": "tidak dapat menambahkan instance server [uuid:%s] ke listener [uuid:%s] karena alamat IP server sudah terdaftar", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10150": "tidak dapat menambahkan grup server [uuid:%s] ke listener [uuid:%s] karena sudah ditambahkan", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10155": "tidak dapat menambahkan grup server[uuid:%s] ke listener [uuid:%s], karena listener UDP tidak dapat memetakan alamat backend IPv4 ke IPv6", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10156": "tidak dapat menghapus grup server [uuid:%s] dari listener [uuid:%s] karena pengalihan HTTP ke HTTPS diaktifkan", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10153": "tidak dapat menambahkan grup server[uuid:%s] ke listener [uuid:%s], karena listener UDP tidak dapat memiliki alamat VIP IPv4 dan IPv6 secara bersamaan", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10154": "tidak dapat menambahkan grup server[uuid:%s] ke listener [uuid:%s], karena listener UDP tidak dapat memetakan alamat backend IPv6 ke IPv4", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10159": "tidak dapat menemukan load balancer yang terkait dengan grup server [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10157": "tidak dapat membatalkan pendaftaran grup server [uuid:%s] dari load balancer [uuid:%s] karena belum terdaftar", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10158": "loadBalancerUuid [%s] tidak ada", + "ORG_ZSTACK_VMWARE_10078": "Operasi tidak didukung dalam lingkungan komputasi cloud saat ini. Pastikan permintaan Anda sesuai dengan operasi yang didukung untuk sumber daya cloud.", + "ORG_ZSTACK_VMWARE_10076": "gagal menghidupkan VM, status tugas: %s", + "ORG_ZSTACK_VMWARE_10073": "VM [%s] tidak ditemukan dalam inventaris vCenter", + "ORG_ZSTACK_VMWARE_10071": "Gagal menemukan VM dengan UUID=%s pada ESX Host dengan UUID=%s", + "ORG_ZSTACK_VMWARE_10072": "Gagal memperbarui konfigurasi ESX VM[uuid=%s]. Lihat detail lebih lanjut di log.", + "ORG_ZSTACK_VMWARE_10070": "Gambar [%s] tidak ditemukan dalam registri atau cache lokal", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10162": "tidak dapat mengubah VMNIC server backend ke serverGroup[uuid:%s] karena bobot VMNIC[%s] bukan angka yang valid", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10163": "bobot balancer tidak valid[vimNic:%s], bobot tidak boleh null", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10160": "tidak dapat memperbarui VMNIC server backend dari grup server karena grup server [uuid:%s] tidak memiliki VMNIC [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10161": "bobot balancer tidak valid[vimNic:%s], nilai bobot berada di luar rentang [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10166": "bobot balancer tidak valid[serverIp:%s,weight:%s], bobot tidak dalam rentang valid [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10167": "tidak dapat menambahkan alamat IP server backend ke grup server [UUID:%s], karena bobot VMNIC [%s] bukan angka yang valid", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10164": "tidak dapat memperbarui VMNIC server backend dari grup server [UUID:%s], karena UUID VMNIC null", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10165": "tidak dapat memperbarui IP server backend dari grup server karena grup server [uuid:%s] tidak memiliki IP [ipAddress:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10168": "bobot balancer tidak valid[serverIp:%s], bobot tidak boleh null", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10169": "tidak dapat menambahkan alamat IP server backend ke grup server [UUID:%s], karena IP [IP Address:%s] tidak valid", + "ORG_ZSTACK_VPC_HA_10010": "Lebih dari 2 router VPC terhubung ke grup HA [uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_10119": "Mesin virtual tidak dapat melakukan pembaruan CPU/memori online karena Modifikasi Online Instance Offering dinonaktifkan. Harap hentikan VM dan coba lagi pembaruan CPU/memori.", + "ORG_ZSTACK_VPC_HA_10011": "Jaringan L3 publik dan manajemen grup HA [uuid:%s] berbeda dari jaringan L3 yang ditawarkan [uuid:%s].", + "ORG_ZSTACK_VPC_HA_10012": "Jaringan L3 router vPC [UUID:%s] tidak cocok dengan jaringan L3 grup HA [UUID:%s]. Harap hapus router ini dan buat ulang.", + "ORG_ZSTACK_VPC_HA_10013": "Router vPC telah dilampirkan ke grup ketersediaan tinggi [uuid:%s]", + "ORG_ZSTACK_VPC_HA_10014": "Grup vpc ha [uuid:%s] tidak ada", + "ORG_ZSTACK_VPC_HA_10015": "Lebih dari satu router VPC dilampirkan ke grup HA [uuid:%s]", + "ORG_ZSTACK_VPC_HA_10016": "Router vPC [UUID:%s] tidak dapat ditingkatkan ke router HA karena jaringan publiknya identik dengan jaringan manajemen.", + "ORG_ZSTACK_VPC_HA_10017": "Membuat grup afinitas untuk grup ketersediaan tinggi [uuid:%s] gagal", + "ORG_ZSTACK_VPC_HA_10018": "haStatus instance %s [uuid: %s] dari grup HA VPC %s [uuid: %s] berubah dari %s ke %s", + "ORG_ZSTACK_VPC_HA_10019": "haStatus instance[uuid: %s, name: %s, type: %s] berubah dari %s ke %s", + "ORG_ZSTACK_VPC_HA_10009": "Tidak ada router master untuk router [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10000": "Perintah inisialisasi instance NFV gagal karena:%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10002": "Gagal memodifikasi kebijakan default firewall antarmuka jaringan VM instance NFV[uuid:%s], karena %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10053": "Grup access-control-list[uuid:%s] dikonfigurasi untuk redirect, tetapi beberapa entri access-control-list tidak memiliki aturan IP.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10050": "Load balancer listener [UUID:%s] tidak dapat melampirkan lebih dari %d grup akses control list redirect rule.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10051": "Load balancer listener [uuid:%s] memiliki aturan redirect yang terkait dengan grup akses control list [uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10118": "VM[UUID:%s] masih dijeda setelah migrasi terakhir; harap resume sebelum mencoba migrasi lagi.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10056": "Load balancer listener [uuid:%s] tidak dapat melampirkan lebih dari %d grup akses control list", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10008": "Lepas tidak didukung untuk jenis instance mesin virtual ini.", + "ORG_ZSTACK_COMPUTE_VM_10117": "VM dengan UUID:%s sudah di-hosting di host dengan UUID:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10057": "Grup server[%s] tidak dilampirkan ke load balancer listener[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10007": "Update konfigurasi provisioning tidak didukung untuk jenis instance NFV ini.", + "ORG_ZSTACK_COMPUTE_VM_10116": "rootDiskSize harus ditentukan ketika jenis media image adalah ISO.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10054": "Grup akses control list[uuid:%s] sudah terkait dengan load balancer listener[uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10055": "Load balancer listener[uuid:%s] hanya memiliki grup akses control list tipe %s yang terpasang.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10009": "Clean data tidak didukung untuk jenis instance jaringan fungsional tervirtualisasi ini.", + "ORG_ZSTACK_COMPUTE_VM_10114": "Platform %s saat ini belum mendukung pembaruan driver NIC.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10004": "Tidak dapat membuat koneksi SSH ke instance NFV [%s] setelah mengkonfigurasi pengaturan SSH", + "ORG_ZSTACK_COMPUTE_VM_10113": "Tidak dapat membuat CD-ROM untuk mesin virtual [uuid:%s] yang berstatus [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10058": "acl[%s] tidak dilampirkan ke load balancer listener[%s]", + "ORG_ZSTACK_COMPUTE_VM_10112": "gambar[name:%s, uuid:%s] adalah ISO; oleh karena itu, rootDiskSize harus ditentukan.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10006": "Gagal memperbarui status instance NFV: %s", + "ORG_ZSTACK_COMPUTE_VM_10111": "Pengaturan alokasi CPU dan memori untuk instance Anda tidak ada. Harap tentukan nilai yang diperlukan untuk melanjutkan.", + "ORG_ZSTACK_VPC_HA_10020": "UUID grup HA adalah nil. Harap verifikasi konfigurasi dan pastikan UUID diatur dengan benar.", + "ORG_ZSTACK_COMPUTE_VM_10121": "tidak dapat mengurangi kapasitas ketika VM[%s] sedang berjalan", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10060": "tidak dapat melampirkan VM NIC ke listener load balancer karena VM NIC [uuid:%s] sudah terkait dengan grup server default [uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10061": "Listener UDP tidak dapat memiliki IP virtual IPv4 dan IPv6 secara bersamaan. Harap konfigurasi IPv4 atau IPv6 untuk listener Anda.", + "ORG_ZSTACK_COMPUTE_VM_10129": "%s bukan alamat IPv4 yang valid untuk deployment cloud", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10068": "status redirect [%s] tidak valid, hanya mendukung [kode status HTTP yang valid]", + "ORG_ZSTACK_COMPUTE_VM_10128": "tidak dapat mengurangi ukuran memori vm[uuid:%s] ketika sedang berjalan", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10065": "Tidak dapat melampirkan lebih dari %d grup access control list ke listener", + "ORG_ZSTACK_COMPUTE_VM_10127": "tidak dapat mengurangi CPU VM[uuid:%s] yang sedang berjalan", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10066": "listener loadBalancer[%s] tidak mendukung penetapan status session persistence", + "ORG_ZSTACK_COMPUTE_VM_10126": "Status VM [uuid:%s] adalah %s. Hanya status [%s] yang diperbolehkan untuk memperbarui CPU atau memori.", + "ORG_ZSTACK_COMPUTE_VM_10125": "Mesin virtual tidak dapat melakukan operasi hot-plug memori karena hot-plug memori dinonaktifkan. Harap hentikan mesin virtual dan coba lagi operasi hot-plug memori.", + "ORG_ZSTACK_COMPUTE_VM_10124": "Mesin virtual tidak dapat melakukan penambahan CPU hot karena penambahan CPU hot dinonaktifkan. Harap hentikan VM dan coba lagi penambahan CPU hot.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10069": "kode status [%s] tidak valid, hanya mendukung [kode status yang valid di lingkungan komputasi cloud]", + "ORG_ZSTACK_COMPUTE_VM_10122": "reservedMemorySize[%s] melebihi memorySize[%s]", + "ORG_ZSTACK_COMPUTE_VM_10132": "%s bukan alamat IPv6 yang valid untuk konfigurasi sumber daya cloud", + "ORG_ZSTACK_COMPUTE_VM_10131": "alamat ip [%s] tidak berada dalam rentang ip yang ditentukan [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10074": "listener loadBalancer[%s] [%s] tidak mendukung penetapan status session persistence; diperlukan penetapan iphash eksplisit.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10075": "jenis session persistence[%s] tidak valid, hanya mendukung %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10072": "status session persistence [%s] tidak valid, hanya mendukung %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10073": "listener loadBalancer[%s] [%s] tidak mendukung penetapan status session persistence; diperlukan penonaktifan eksplisit.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10078": "nama session cookie[%s] tidak valid, hanya boleh mengandung karakter alfanumerik dan garis bawah", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10079": "listener loadBalancer[%s] [%s] tidak mendukung penetapan idle timeout dan nama cookie secara bersamaan", + "ORG_ZSTACK_COMPUTE_VM_10139": "Alamat IPv6 harus menyertakan panjang prefiks", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10076": "idle timeout session[%s] tidak valid, harus berupa bilangan bulat positif antara[%s~%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10077": "nama session cookie[%s] tidak valid, harus lebih pendek dari [%d] karakter", + "ORG_ZSTACK_COMPUTE_VM_10137": "Alamat IPv4 memerlukan subnet mask", + "ORG_ZSTACK_COMPUTE_VM_10136": "IP statis [%s] salah format", + "ORG_ZSTACK_COMPUTE_VM_10135": "Tidak dapat mengatur alamat IP untuk instance, karena tidak ada alamat IP yang ditentukan. Pastikan alamat IP diberikan sebelum mencoba mengkonfigurasi pengaturan jaringan.", + "ORG_ZSTACK_COMPUTE_VM_10134": "alamat IP [%s] tidak berada dalam rentang IP yang ditentukan [startIp %s, endIp %s]", + "ORG_ZSTACK_COMPUTE_VM_10133": "Alamat IP [%s] sudah ditetapkan ke VM NIC [uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10081": "loadBalancer[%s] listener[%s] tidak mendukung penetapan idle timeout dan nama cookie ketika session persistence dinonaktifkan", + "ORG_ZSTACK_COMPUTE_VM_10143": "tidak dapat melepaskan IP statis [%s] untuk VM [uuid:%s] karena tidak ada", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10082": "loadBalancer[%s] listener[%s] tidak mendukung penetapan session persistence rewrite tanpa menentukan nama cookie", + "ORG_ZSTACK_COMPUTE_VM_10142": "VM[uuid:%s] tidak memiliki antarmuka jaringan yang terhubung ke jaringan L3[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10080": "loadBalancer[%s] listener[%s] tidak mendukung penetapan idle timeout dan nama cookie; session persistence harus ditentukan.", + "ORG_ZSTACK_COMPUTE_VM_10140": "alamat IP [%s] sudah ditetapkan ke vmNic", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10085": "loadBalancer[%s] listener[%s] tidak mendukung penetapan kebijakan session persistence ketika algoritma load balancing berbasis sumber adalah source-based.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10086": "loadBalancer[%s] tidak mendukung penetapan session persistence menggunakan iphash untuk listener[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10083": "loadBalancer[%s] listener[%s] tidak mendukung penetapan idle timeout session persistence tanpa menentukan mode rewrite", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10084": "loadBalancer[%s] listener[%s] tidak mendukung penetapan session persistence dengan CookieName tanpa menentukan mode insert", + "ORG_ZSTACK_COMPUTE_VM_10149": "Jenis Media Gambar Tidak Didukung: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10087": "koneksi maksimum tidak valid[%s], nilai yang ditentukan melebihi ambang batas atas %d", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10088": "konflik loadBalancerPort[%s], listener lain[uuid:%s] menggunakan port tersebut", + "ORG_ZSTACK_COMPUTE_VM_10147": "VM %s dengan snapshot memori tidak mendukung pengaturan volume boot", + "ORG_ZSTACK_COMPUTE_VM_10146": "volume[uuid:%s] harus dipasang ke mesin virtual[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10145": "Volume boot dari instance ini tidak dapat dikonfigurasi sebagai shareable.", + "ORG_ZSTACK_COMPUTE_VM_10144": "boot device tidak valid [%%s] dalam urutan boot %%s", + "ORG_ZSTACK_VMWARE_10024": "Tidak dapat menyinkronkan sebelum datastore diisolasi", + "ORG_ZSTACK_VMWARE_10025": "Ada tugas yang berjalan di vCenter[uuid:%s], silakan coba lagi nanti.", + "ORG_ZSTACK_VMWARE_10023": "gagal terhubung ke vCenter: %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10008": "Tidak dapat menginisialisasi kontroler SDN karena tidak ada rentang Virtual Network Identifier (VNI) yang dikonfigurasi pada kontroler [ip:%s]", + "ORG_ZSTACK_VMWARE_10020": "Tidak ada port VNC yang tersedia untuk mesin virtual %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10009": "Tidak dapat mengambil informasi rentang VNI dari kontroler SDN [ip:%s] karena %s", + "ORG_ZSTACK_VMWARE_10021": "mendapatkan service instance untuk vCenter %s gagal karena %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10092": "cloud gagal membuat load balancer listener karena listener protokol TCP hanya mendukung parameter TCP proxy protocol.", + "ORG_ZSTACK_MEVOCO_10006": "operasi tidak didukung untuk pengaturan multiQueues volume[%s] virtio-scsi di lingkungan komputasi cloud.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10093": "cloud tidak dapat membuat listener load balancer karena hanya mendukung protokol proxy TCP %s", + "ORG_ZSTACK_MEVOCO_10005": "operasi tidak didukung untuk mengatur volume root[%s] menggunakan multiple queues", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10091": "Pembuatan sumber daya komputasi cloud gagal karena listener dengan protokol HTTPS hanya mendukung versi HTTP [h1, h2]. Harap pastikan kompatibilitas permintaan Anda.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10010": "Tidak dapat membuat jaringan VXLAN hardware karena UUID tenant H3C adalah parameter wajib untuk controller H3C VCFC V2. Harap berikan UUID yang diperlukan untuk melanjutkan.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10096": "listener load balancer dengan tipe %s tidak memerlukan sertifikat", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10097": "listener load balancer [uuid:%s] sudah memiliki sertifikat[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10094": "cloud gagal membuat listener load balancer karena listener dengan protokol [%s] tidak mendukung kompresi konten", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10095": "cloud tidak dapat membuat listener load balancer karena hanya mendukung algoritma kompresi [%s]", + "ORG_ZSTACK_MEVOCO_10007": "untuk volume yang dapat dibagikan, tipe penyimpanan utama yang didukung hanyalah %s, saat ini adalah %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10015": "Tidak dapat membuat rentang VNI karena jaringan L2 yang ditentukan [uuid:%s] bukan instance pool jaringan VXLAN", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10016": "Tidak dapat membuat rentang VNI [%s-%s] karena controller H3C menggunakan VNI sebagai ID VLAN dan rentang harus dalam 1-4094. Nilai VNI harus sesuai dengan standar ID VLAN untuk implementasi jaringan virtual.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10017": "Tidak dapat membuat rentang VNI [%s-%s] karena tidak tercakup dalam VNI yang dikonfigurasi dari controller SDN mana pun", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10098": "sertifikat [uuid:%s] tidak terkait dengan listener load balancer [uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10018": "Tidak dapat menambahkan rentang IPv6 karena controller SDN [uuid:%s] tidak beroperasi. Status saat ini: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10099": "kesalahan target healthCheck [%s], harus berupa 'default' atau nomor port antara [1~65535]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10011": "Tidak dapat membuat jaringan VXLAN hardware karena tenant yang ditentukan tidak ada dalam sistem manajemen controller SDN. Harap verifikasi ID tenant dan pastikan dikonfigurasi dengan benar di lingkungan cloud.", + "ORG_ZSTACK_MEVOCO_10002": "tidak dapat menemukan mode IOPS dari VolumeQoS null", + "ORG_ZSTACK_VMWARE_10017": "L2[UUID:%s] tidak termasuk dalam cluster[UUID:%s] vCenter[UUID:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10012": "Tidak dapat membuat jaringan VXLAN karena controller SDN [ip:%s] tidak merespons", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10013": "Tidak dapat membuat jaringan VXLAN pada controller SDN [IP:%s] karena %s", + "ORG_ZSTACK_MEVOCO_10000": "ZStack telah dijeda dan semua panggilan API kecuali operasi read-only ditolak. Jika Anda ingin melanjutkan operasi non-read-only, harap tambahkan '%s' ke systemTags.", + "ORG_ZSTACK_VMWARE_10015": "Tidak ditemukan host dalam klaster komputasi: %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10014": "Tidak dapat menghapus jaringan VXLAN pada Controller SDN [IP:%s] karena %s", + "ORG_ZSTACK_VMWARE_10016": "vSwitch/dvSwitch tidak ditemukan: %s, atau vSwitch pada ESX host yang berbeda tidak memiliki grup port yang sama", + "ORG_ZSTACK_VMWARE_10013": "Driver NIC %s belum didukung", + "ORG_ZSTACK_VMWARE_10014": "Cluster[uuid:%s] dan Jaringan Layer 2[uuid:%s] termasuk dalam Data Center berbeda", + "ORG_ZSTACK_VMWARE_10011": "domainName[%s] bukan hostname DNS atau alamat IP yang valid", + "ORG_ZSTACK_VMWARE_10012": "vCenter [Domain Name:%s] telah ditambahkan", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10019": "Tidak dapat menambahkan rentang IPv6 berdasarkan CIDR jaringan karena controller SDN [uuid:%s] tidak terhubung. Status saat ini: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10000": "Tidak ditemukan baremetal gateway yang tersedia untuk permintaan ini. Harap pastikan node baremetal Anda dikonfigurasi dengan benar dan terdaftar di lingkungan komputasi cloud.", + "ORG_ZSTACK_VMWARE_10010": "Nama pengguna login vCenter diperlukan.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10002": "gagal mengalokasikan sumber daya gateway BareMetal2", + "ORG_ZSTACK_CORE_DEBUG_10000": "Informasi tugas (%s) tidak ditemukan di lingkungan komputasi cloud. Harap pastikan semua detail tugas dikonfigurasi dan diunggah dengan benar.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10020": "Tidak dapat menambahkan rentang IP karena pengendali SDN [uuid:%s] tidak terhubung. Status saat ini: %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10021": "Tidak dapat menambahkan rentang IP berdasarkan CIDR jaringan karena pengendali SDN [uuid:%s] tidak terhubung. Status saat ini: %s", + "ORG_ZSTACK_MEVOCO_10014": "lebar pita jaringan[%s] tidak valid, bukan nilai numerik", + "ORG_ZSTACK_MEVOCO_10019": "lebar pita volume[%s] tidak valid, harus lebih besar dari atau sama dengan 1024 Mbps", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10028": "Tidak dapat mengambil tenants karena pengendali SDN [ip:%s] tidak merespons", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10029": "Tidak dapat menginisialisasi pengendali SDN karena tidak ada tenant default yang dikonfigurasi pada pengendali [ip:%s]", + "ORG_ZSTACK_VMWARE_10009": "kata sandi konsol tidak didukung oleh mesin virtual [UUID:%s] pada ESX Host [ESXi Version:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10022": "tidak dapat membuat jaringan Layer 3 karena pengendali SDN H3C VCFC V2 tidak mendukung jaringan Layer 3 [type:%s, category:%s]", + "ORG_ZSTACK_MEVOCO_10013": "lebar pita jaringan[%s] tidak valid, harus lebih besar dari atau sama dengan %d Mbps", + "ORG_ZSTACK_VMWARE_10006": "gagal mendapatkan statistik penggunaan disk root VM[%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10023": "Tidak dapat membuat jaringan VXLAN perangkat keras karena UUID tenant adalah parameter wajib untuk pengendali H3C VCFC V2. Harap pastikan parameter tersebut disediakan.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10024": "Tidak dapat menambahkan pengendali H3C VCFC karena tag sistem VDS UUID diperlukan untuk pengendali H3C VCFC V1", + "ORG_ZSTACK_VMWARE_10005": "gagal mendapatkan instance VM dari jalur instalasi: %s", + "ORG_ZSTACK_VMWARE_10002": "Tidak ada virtual datacenter ditemukan", + "ORG_ZSTACK_VMWARE_10000": "Tidak ada layanan manajemen disk virtual ditemukan", + "ORG_ZSTACK_VMWARE_10001": "Tidak ada file manager yang dikonfigurasi untuk operasi penyimpanan cloud. Harap pastikan file manager yang valid diatur untuk menangani operasi %s.", + "ORG_ZSTACK_VPC_HA_VYOS_10000": "gagal mengaktifkan HA pada router virtual[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10011": "instance nfv [uuid:%s] dalam status %s yang tidak dapat melakukan panggilan HTTP ke %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10010": "Instance NFV [name:%s, UUID:%s, current state:%s] tidak berjalan dan tidak dapat melakukan operasi yang diperlukan. Harap coba lagi setelah instance berjalan.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10013": "tidak dapat menambahkan antarmuka jaringan [ip:%s, mac:%s] ke instance NFV [uuid:%s ip:%s], karena %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10012": "instance nfv [uuid:%s] tidak memiliki antarmuka jaringan manajemen yang dapat melakukan panggilan HTTP ke %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10004": "Tidak dapat menentukan node utama untuk pengendali Software-Defined Network (SDN) [ip:%s] karena %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10005": "Tidak dapat mengautentikasi dengan pengendali SDN karena pengendali [IP:%s] tidak merespons", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_10000": "vm[uuid:%s] pekerjaan migrasi penyimpanan jangka panjang[uuid:%s] gagal karena restart node manajemen", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10006": "Tidak dapat mengautentikasi dengan Pengendali SDN [IP:%s] karena %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10007": "Tidak dapat mengambil informasi rentang VNI karena pengendali SDN [ip:%s] tidak merespons", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10000": "Tidak dapat menambahkan rentang IP karena pembuatan subnet gagal pada pengendali SDN. Harap periksa konfigurasi jaringan atau hubungi dukungan untuk bantuan.", + "ORG_ZSTACK_COMPUTE_VM_10103": "Tidak dapat beralih ke Jaringan L3. Jaringan L3 [uuid:%s] adalah jaringan sistem dan VM adalah VM pengguna.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10015": "VMInstanceSpec tidak ditemukan dalam parameter data alir. Harap pastikan semua spesifikasi yang diperlukan sudah termasuk.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10001": "Tidak dapat menambahkan rentang IP ke jaringan karena %s", + "ORG_ZSTACK_COMPUTE_VM_10102": "Tidak dapat beralih ke jaringan L3. Jaringan L3 dengan UUID [uuid:%s] dinonaktifkan", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10014": "Tidak dapat menghapus gambar [UUID:%s] karena digunakan oleh grup instans NFV [UUID:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10002": "Tidak dapat menghapus rentang IP dari jaringan Layer 3 karena %s", + "ORG_ZSTACK_COMPUTE_VM_10101": "Tidak dapat beralih ke jaringan L3 non-tamu. Jaringan L3 dengan UUID [uuid:%s] sudah dikaitkan dengan VM [uuid: %s].", + "ORG_ZSTACK_COMPUTE_VM_10100": "Tidak dapat beralih ke jaringan L3. Jaringan L3 dengan UUID [uuid:%s] sudah dilampirkan ke VM dengan UUID [%s].", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10003": "Tidak dapat menentukan pemimpin klaster karena pengendali SDN [IP:%s] tidak merespons", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10016": "Inventori VM atau UUID bernilai null dalam Spesifikasi Instans VM", + "ORG_ZSTACK_PORTMIRROR_10008": "Layanan PortMirror tidak mendukung NIC [%s] karena tipe hypervisor-nya.", + "ORG_ZSTACK_PORTMIRROR_10009": "Layanan PortMirror tidak dapat merefleksikan ke NIC [%s] yang bukan antarmuka non-default dari VM.", + "ORG_ZSTACK_ZWATCH_API_10019": "Durasi kueri tidak dapat melebihi %s", + "ORG_ZSTACK_COMPUTE_VM_10198": "Tidak dapat membuat instans VM dari volume yang dapat dibagikan. Harap pastikan volume tidak diatur sebagai dapat dibagikan dan coba lagi.", + "ORG_ZSTACK_PORTMIRROR_10000": "Parameter [%s] tidak valid, pastikan mengacu pada Jaringan Port Mirroring yang valid", + "ORG_ZSTACK_COMPUTE_VM_10197": "Perlu mengatur salah satu properti berikut: %s", + "ORG_ZSTACK_PORTMIRROR_10001": "Jaringan[%s] sudah dikaitkan dengan layanan Port Mirroring", + "ORG_ZSTACK_ZWATCH_API_10028": "Akun[uuid: %s] tidak memiliki izin untuk sumber daya[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10196": "Tidak dapat mengonfigurasi properti berikut secara bersamaan: %s", + "ORG_ZSTACK_PORTMIRROR_10002": "Layanan Port Mirroring[%s] belum dibuat", + "ORG_ZSTACK_PORTMIRROR_10003": "NIC [%(device_id)s, %(network_interface_id)s] sudah direfleksikan oleh layanan [%(service_id)s]", + "ORG_ZSTACK_COMPUTE_VM_10194": "setidaknya salah satu dari berikut harus ditentukan untuk instans: arsitektur dalam msg atau gambar[uuid:%s]", + "ORG_ZSTACK_PORTMIRROR_10004": "NIC[%s] tidak dapat direfleksikan untuk layanan[%s] menggunakan", + "ORG_ZSTACK_ZWATCH_API_10025": "label[%s] tidak valid, label yang dapat dikueri untuk sumber daya cloud adalah %s", + "ORG_ZSTACK_COMPUTE_VM_10193": "setidaknya salah satu dari berikut harus ditentukan untuk sistem operasi tamu: kolom guestOsType dalam msg atau gambar[uuid:%s]", + "ORG_ZSTACK_ZWATCH_API_10024": "metrik[%s] tidak memiliki filter[%s]", + "ORG_ZSTACK_COMPUTE_VM_10192": "setidaknya salah satu dari berikut harus ditentukan untuk pesan atau gambar [uuid:%s]: platform atau imageID.", + "ORG_ZSTACK_PORTMIRROR_10007": "Layanan PortMirror tidak mendukung refleksi NIC[%s].", + "ORG_ZSTACK_ZWATCH_API_10021": "tidak dapat menemukan metrik[%s] dalam namespace[%s]", + "ORG_ZSTACK_COMPUTE_VM_10199": "Tidak dapat membuat instans VM dari volume yang dilampirkan. Harap pastikan volume dalam keadaan dapat digunakan dan coba lagi.", + "ORG_ZSTACK_PORTMIRROR_10011": "Layanan PortMirror tidak dapat membuat terowongan cermin untuk nic[%s] ke nic[%s] karena jaringan cermin[%s] tidak valid.", + "ORG_ZSTACK_PORTMIRROR_10012": "Layanan PortMirror tidak dapat mencerminkan antarmuka jaringan [%s] ke dirinya sendiri", + "ORG_ZSTACK_ZWATCH_API_10039": "Format JSON untuk label tidak valid. Harap pastikan labelsJsonStr diformat dengan benar.", + "ORG_ZSTACK_PORTMIRROR_10013": "Layanan PortMirror tidak kompatibel dengan antarmuka jaringan yang dikonfigurasi dengan Quality of Service (QoS).", + "ORG_ZSTACK_ZWATCH_API_10038": "Namespace [%%s] tidak memiliki metrik [%%s]", + "ORG_ZSTACK_PORTMIRROR_10014": "gagal menghapus sesi port mirror[%s] dari hypervisor, detail: %s", + "ORG_ZSTACK_ZWATCH_API_10037": "Tidak ada namespace yang ditentukan dalam sistem", + "ORG_ZSTACK_PORTMIRROR_10015": "gagal melepaskan sesi port mirror[%s] dari hypervisor, detail: %s", + "ORG_ZSTACK_ZWATCH_API_10036": "Format URL tidak valid; harus dimulai dengan http(s).", + "ORG_ZSTACK_PORTMIRROR_10016": "tidak dapat menemukan ID internal sesi[uuid:%s], apakah batas sesi terlampaui di host???", + "ORG_ZSTACK_ZWATCH_API_10033": "endTime[%s, %sms] harus tidak boleh sebelum startTime[%s, %sms]", + "ORG_ZSTACK_ZWATCH_API_10032": "label metrik[%s] tidak menyertakan [%s]", + "ORG_ZSTACK_ZWATCH_API_10031": "tidak dapat menemukan namespace[%s]", + "ORG_ZSTACK_ZWATCH_API_10030": "Jika namespace diatur ke all, menentukan metrik dan label tidak didukung.", + "ORG_ZSTACK_PORTMIRROR_10010": "Layanan PortMirror tidak dapat mencerminkan NIC [%s] yang bukan merupakan antarmuka dari VM apa pun.", + "ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10009": "gagal mendapatkan informasi perangkat PCI dari host[uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10030": "Tidak dapat mengambil tenant default dari pengontrol SDN [ip:%s] karena masalah komunikasi", + "ORG_ZSTACK_ZWATCH_API_10046": "Interval waktu melebihi %d hari", + "ORG_ZSTACK_ZWATCH_API_10045": "endTime[%s] harus tidak boleh sebelum startTime[%s]", + "ORG_ZSTACK_ZWATCH_API_10044": "instance tidak valid[%s]", + "ORG_ZSTACK_ZWATCH_API_10043": "Catatan pengakuan peringatan instance ECS tidak ada", + "ORG_ZSTACK_ZWATCH_API_10042": "startTime[%s] lebih lambat dari endTime[%s]", + "ORG_ZSTACK_ZWATCH_API_10041": "platform[url=%s] sudah ada", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10033": "Tidak dapat menghapus jaringan VXLAN karena pengontrol SDN [ip:%s] tidak merespons", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10004": "kesalahan operasi, VIP %s belum terikat ke instance VM", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10000": "gagal membuat aturan port forwarding[vip ip: %s, private ip: %s, vip start port: %d, vip end port: %d, private start port: %d, private end port: %d], karena %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10001": "gagal mencabut aturan port forwarding %s karena %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10002": "gagal menyinkronkan aturan port forwarding yang dilayani oleh virtual router[nama: %s, uuid: %s], karena %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10003": "Menemukan virtual router menawarkan [uuid:%s] untuk L3 Network [uuid:%s] di zona [uuid:%s]; namun, jaringan publik [uuid:%s] tidak cocok dengan aturan Port Forwarding [uuid:%s]. Anda mungkin perlu menentukan penawaran virtual router tertentu menggunakan tag sistem guestL3Network::l3NetworkUuid.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10004": "virtual router tidak mendukung pengalihan rentang port forwarding; port mulai VIP harus sama dengan port mulai private dan port akhir VIP harus sama dengan port akhir private. Namun, aturan ini memiliki rentang yang tidak cocok: port VIP [%s, %s], port private [%s, %s].", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10005": "gagal menambahkan port forwarding pada virtual router[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10006": "gagal mencabut port forwarding pada virtual router[uuid:%s], error: %s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10003": "gagal membatalkan pembuatan perangkat penyimpanan sekunder karena:%s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10004": "gagal mendapatkan informasi perangkat MTTY dari host[UUID:%s]", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10001": "Jumlah melebihi batas. Perangkat[uuid: %s] memerlukan jumlah perangkat SE yang melebihi jumlah yang diizinkan[%d].", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10002": "gagal membuat perangkat penyimpanan karena:%s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10000": "Nomor bagian yang ditentukan[value:%s] bukan ID instance yang valid di lingkungan cloud ini.", + "ORG_ZSTACK_CORE_CLOUDBUS_10021": "pesan bukan dalam format JSON yang benar, %s", + "ORG_ZSTACK_COMPUTE_VDPA_10009": "hanya %s yang mendukung teknologi akselerasi vdpa", + "ORG_ZSTACK_COMPUTE_VDPA_10007": "tidak dapat membuat perangkat PCI[uuid:%s] karena instance L2 lain[uuid:%s] sedang menggunakan antarmuka jaringan fisik yang terpasang pada cluster", + "ORG_ZSTACK_COMPUTE_VDPA_10006": "tidak dapat membatalkan pembuatan perangkat PCI[uuid:%s], karena instance L2 lain[uuid:%s] sedang menggunakan antarmuka jaringan fisik yang terpasang pada cluster", + "ORG_ZSTACK_COMPUTE_VDPA_10005": "gagal menghapus bridge[%s] untuk l2Network[uuid:%s, type:%s] pada host KVM[uuid:%s], karena %s", + "ORG_ZSTACK_COMPUTE_VDPA_10004": "gagal memeriksa bridge[%s] untuk l2NoVlanNetwork[uuid:%s, name:%s] pada host KVM[uuid: %s], %s", + "ORG_ZSTACK_COMPUTE_VDPA_10003": "gagal membuat bridge[%s] untuk l2Network[uuid:%s, type:%s] pada host KVM[uuid:%s], karena %s", + "ORG_ZSTACK_COMPUTE_VDPA_10002": "memulihkan vdpa untuk vm[uuid:%s] dari host tujuan[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VDPA_10001": "melepaskan perangkat vdpa untuk vm[uuid:%s] pada host tujuan[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10152": "VM[uuid:%s] terpasang pada beberapa ISO, please specify the isoUuid when detaching.", + "ORG_ZSTACK_COMPUTE_VM_10151": "VM[uuid:%s] telah memasang CD-ROM ISO[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10150": "virtualCDROM dengan UUID:%s tidak ada", + "ORG_ZSTACK_COMPUTE_VM_10159": "Tidak dapat memasang jaringan Layer 3. Jaringan Layer 3 [uuid:%s] termasuk dalam jaringan Layer 2 [uuids:%s] yang belum dipasang ke cluster mana pun.", + "ORG_ZSTACK_COMPUTE_VM_10158": "Tidak dapat memasang jaringan Layer 3. Jaringan L3 yang ditentukan [uuid:%s] termasuk dalam jaringan Layer 2 yang berbeda [uuids:%s].", + "ORG_ZSTACK_COMPUTE_VM_10157": "tidak dapat memasang jaringan Layer 3. Jaringan Layer 3 yang ditentukan [uuid:%s] tidak memiliki rentang IP yang ditentukan.", + "ORG_ZSTACK_COMPUTE_VM_10156": "tidak dapat memasang jaringan Layer 3. VM [uuid: %s] tidak dalam keadaan Running atau Stopped; keadaan saat ini adalah %s", + "ORG_ZSTACK_COMPUTE_VDPA_10015": "gagal mengalokasikan vDPAs pada host[uuid:%s] untuk VM[uuid:%s]: %s", + "ORG_ZSTACK_COMPUTE_VDPA_10013": "gagal menghapus vDPAs pada host[UUID:%s] untuk VM[UUID:%s]: %s", + "ORG_ZSTACK_COMPUTE_VDPA_10012": "Jaringan L2 [UUID:%s] di host [UUID:%s] tidak divirtualisasi SRIOV", + "ORG_ZSTACK_COMPUTE_VDPA_10011": "cluster[uuid:%s] tidak mendukung ovs-dpdk", + "ORG_ZSTACK_COMPUTE_VDPA_10010": "tidak dapat membuat vSwitch dengan antarmuka fisik:[%s] yang sudah digunakan oleh jenis vSwitch lain.", + "ORG_ZSTACK_COMPUTE_VM_10163": "tidak dapat memasang jaringan Layer 3. Jaringan Layer 3 dengan UUID [uuid:%s] adalah jaringan sistem, sedangkan VM adalah VM pengguna.", + "ORG_ZSTACK_COMPUTE_VM_10162": "tidak dapat memasang jaringan Layer 3. Jaringan Layer 3 dengan UUID [%s] dinonaktifkan", + "ORG_ZSTACK_COMPUTE_VM_10161": "tidak dapat memasang jaringan L3 non-tamu ke mesin virtual karena sudah dipasang ke mesin virtual lain (uuid: %s)", + "ORG_ZSTACK_COMPUTE_VM_10160": "tidak dapat memasang jaringan Layer 3. Jaringan Layer 3 yang ditentukan [uuid:%s] sudah dipasang ke mesin virtual [uuid: %s].", + "ORG_ZSTACK_COMPUTE_VM_10168": "IP statis [%s] sudah ditetapkan ke sumber daya pada jaringan Layer 3 [uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_10167": "IP statis [%s] tidak berada dalam rentang IP manapun dari jaringan Layer 3 [uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_10166": "UUID IP statis L3[%s] tidak termasuk dalam daftar L3 NIC[%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10009": "IAM2ProjectVO[uuid:%s] tidak dalam keadaan %s, perubahan keadaan tidak diizinkan", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10008": "Proyek [UUID:%s, Name:%s] sudah memiliki strategi kedaluwarsa login yang dikonfigurasi.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10007": "tanggal atau waktu tidak valid[%s], tidak boleh lebih awal dari stempel waktu saat ini[%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10006": "nilai pengeluaran tidak valid[%s], harus dalam format seperti contoh 10.001", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10005": "nilai pengeluaran tidak valid[%s], nilai pengeluaran harus antara 0 dan %f", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10004": "waktu tidak valid[%s], harus dalam format seperti 10m, 1h, atau 2d", + "ORG_ZSTACK_CORE_CLOUDBUS_10001": "untuk webhook dengan tipe[%s], kolom opaque tidak boleh null", + "ORG_ZSTACK_COMPUTE_VM_10176": "tidak dapat memasang NIC. Jaringan L2-nya [uuid:%s] belum dipasang ke klaster komputasi manapun.", + "ORG_ZSTACK_ZWATCH_API_10007": "parameter dataStartTime dan dataEndTime tidak boleh dihilangkan. Harap pastikan keduanya disediakan.", + "ORG_ZSTACK_COMPUTE_VM_10175": "tidak dapat memasang NIC. Jaringan Layer 3-nya [uuid:%s] adalah jaringan sistem, sementara VM adalah VM pengguna.", + "ORG_ZSTACK_ZWATCH_API_10006": "dataUuid tidak boleh dihilangkan", + "ORG_ZSTACK_COMPUTE_VM_10174": "tidak dapat memasang NIC. Jaringan Layer 3-nya [uuid:%s] dinonaktifkan", + "ORG_ZSTACK_COMPUTE_VM_10173": "tidak dapat memasang NIC ke jaringan L3 non-tamu. Jaringan L3 [uuid:%s] sudah dipasang ke VM [uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_10172": "Jaringan L3 dengan UUID [%s] sudah dipasang ke VM lain dengan UUID [%s]. Silakan lepaskan dari VM yang ada sebelum memasangnya ke VM baru.", + "ORG_ZSTACK_COMPUTE_VM_10171": "NIC sudah dipasang ke VM [UUID: %s]. Harap pastikan NIC belum dipasang sebelum mencoba memasangnya lagi.", + "ORG_ZSTACK_COMPUTE_VM_10170": "tidak dapat memasang NIC. VM[uuid: %s] tidak dalam keadaan Running atau Stopped; keadaan saat ini adalah %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10011": "Proyek [UUID:%s, Name:%s] sudah memiliki kebijakan pensiun yang ditentukan.", + "ORG_ZSTACK_COMPUTE_VM_10179": "tidak dapat melepaskan jaringan L3 dari VM [uuid: %s]; VM tidak dalam keadaan Running atau Stopped; keadaan saat ini adalah %s", + "ORG_ZSTACK_COMPUTE_VM_10178": "tidak dapat memperbarui keadaan antarmuka jaringan [uuid: %s], karena tipe antarmuka jaringan tidak didukung [%s]", + "ORG_ZSTACK_CORE_UPGRADE_10000": "Api: %s tidak diizinkan menurut allowedApiListGrayscaleUpgrading: %s.", + "ORG_ZSTACK_CORE_UPGRADE_10003": "Tidak dapat menemukan versi agen; peningkatan OS klaster tidak didukung selama peningkatan skala abu-abu. Harap pastikan versi agen terinstal sebelum memulai proses peningkatan.", + "ORG_ZSTACK_CORE_UPGRADE_10002": "Nonaktifkan peningkatan skala abu-abu dengan %s sebelum ingin memperbarui OS semua host klaster. Alternatifnya, coba perbarui OS klaster dengan UUID host tertentu.", + "ORG_ZSTACK_CORE_UPGRADE_10004": "Versi agen Host[UUID: %s] belum ditingkatkan. Harap hubungkan kembali host sebelum melakukan pembaruan sistem operasi.", + "ORG_ZSTACK_ZWATCH_API_10008": "dataStartTime[%s] lebih lambat dari dataEndTime[%s]", + "ORG_ZSTACK_COMPUTE_VM_10187": "ketika imageUuid null, placeholder_for_image_uuid_is_missing", + "ORG_ZSTACK_COMPUTE_VM_10186": "Disk root tidak ada. Pastikan volume root terpasang pada instance Anda.", + "ORG_ZSTACK_COMPUTE_VM_10185": "Konfigurasi yang tidak terduga untuk disk data. Ukuran yang ditentukan dalam dataDiskSizes harus lebih besar dari 0.", + "ORG_ZSTACK_COMPUTE_VM_10182": "Pengaturan volume root yang tidak terduga", + "ORG_ZSTACK_COMPUTE_VM_10181": "Tipe media image adalah ISO tetapi pengaturan disk root tidak ada", + "ORG_ZSTACK_COMPUTE_VM_10180": "vm[uuid:%s] hanya dapat memasang volume ketika statusnya Running atau Stopped; status saat ini adalah %s.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10003": "tanggal tidak valid[%s], harus dalam format yyyy-MM-dd HH:mm:ss ZZZ", + "ORG_ZSTACK_ZWATCH_API_10010": "Nama namespace tidak boleh dimulai dengan kata kunci cadangan seperti %s.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10002": "means tidak valid[%s], means yang diizinkan adalah untuk menentukan kuota sumber daya atau metrik di lingkungan cloud", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10001": "nilai tidak valid untuk parameter, %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10000": "Nilai yang ditentukan untuk batas sumber daya tidak valid; diharapkan nilai numerik tanpa akhiran 'at', 'after', atau 'exceed'. Harap berikan nomor yang valid.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10030": "Antarmuka DHCP PXE Server %s tidak ada, atau tidak memiliki alamat IP.", + "ORG_ZSTACK_NETWORK_OVN_10012": "tidak dapat menambahkan SDN host karena antarmuka jaringan [%s] memiliki alamat IP [%s]", + "ORG_ZSTACK_NETWORK_OVN_10011": "tidak dapat menambahkan SDN host karena NIC[%s] berada dalam keadaan virtualisasi SR-IOV", + "ORG_ZSTACK_NETWORK_OVN_10010": "tidak dapat menambahkan SDN host karena jenis NIC[%s] [%s] digunakan untuk Linux bonding", + "ORG_ZSTACK_NETWORK_OVN_10016": "Penambahan SDN host gagal karena hanya host KVM yang mendukung OVS DPDK.", + "ORG_ZSTACK_APIMEDIATOR_10000": "Lebih dari satu instance Backup Storage pada host yang sama diidentifikasi oleh hostname. Sudah ada SftpBackupStorage [hostname:%s]. Jenis Backup Storage yang akan ditambahkan adalah %s.", + "ORG_ZSTACK_NETWORK_OVN_10015": "tidak dapat menambahkan SDN host karena mode bond[%s] tidak didukung oleh OVN", + "ORG_ZSTACK_NETWORK_OVN_10014": "tidak dapat menambahkan SDN host karena NIC[%s] digunakan untuk antarmuka VXLAN VTEP", + "ORG_ZSTACK_NETWORK_OVN_10013": "tidak dapat menambahkan SDN host karena NIC[%s] telah dipasang ke jaringan L2[name:%s]", + "ORG_ZSTACK_APIMEDIATOR_10001": "Lebih dari satu layanan Backup Storage berjalan pada host yang sama yang diidentifikasi oleh hostname. Terdapat layanan Image Store Backup Storage [hostname:%s]. Jenis Backup Storage yang akan ditambahkan adalah %s.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10031": "%s ~ %s tidak dapat membuat koneksi ke antarmuka DHCP %s", + "ORG_ZSTACK_NETWORK_OVN_10019": "Host dengan UUID [%s] dalam cluster dengan UUID [%s] belum mengaktifkan hugepages; oleh karena itu, tidak diizinkan untuk ditambahkan ke kontroler SDN.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10032": "cluster[uuid:%s] dan pxeserver[uuid:%s] tidak berada dalam zona yang sama", + "ORG_ZSTACK_NETWORK_OVN_10018": "Tidak dapat menambahkan SDN host karena subnet mask belum ditentukan.%s", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10033": "cluster[uuid:%s] bukan cluster baremetal", + "ORG_ZSTACK_NETWORK_OVN_10017": "Tidak dapat menambahkan SDN host karena VTEP IP tidak dikonfigurasi.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10034": "server PXE baremetal [uuid:%s] sudah terpasang pada cluster [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10035": "server PXE baremetal [UUID: %s] tidak kompatibel dengan instance baremetal dalam cluster [UUID: %s], karena IP NIC yang ada %s berada di luar rentang DHCP server PXE (%s ~ %s).", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10036": "server PXE baremetal [UUID: %s] tidak terkait dengan cluster [UUID: %s]", + "ORG_ZSTACK_STORAGE_MIGRATION_10030": "Penyimpanan primer tujuan tidak terpasang pada cluster yang berbagi jaringan level 2 yang sama dengan cluster sumber.", + "ORG_ZSTACK_STORAGE_MIGRATION_10033": "tidak mendukung migrasi penyimpanan sementara volume bersama[uuid: %s, name: %s] terpasang", + "ORG_ZSTACK_STORAGE_MIGRATION_10034": "Tidak dapat memigrasikan volume dari instance sumber ke instance target", + "ORG_ZSTACK_STORAGE_MIGRATION_10031": "Volume [UUID:%s] masih terpasang ke VM [UUID:%s], harap lepaskan sebelum migrasi", + "ORG_ZSTACK_STORAGE_MIGRATION_10032": "tidak dapat memigrasikan volume data[uuid:%s] antara penyimpanan primer blok bersama ketika mesin virtual[vmuuid:%s] tidak dihentikan", + "ORG_ZSTACK_STORAGE_MIGRATION_10035": "tidak dapat memigrasikan volume[%s] karena statusnya Disabled", + "ORG_ZSTACK_STORAGE_MIGRATION_10036": "Tidak ada host tersedia untuk migrasi langsung berbasis blok: %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10019": "tidak dapat menemukan SNSTextTemplate dengan UUID:%s, mungkin telah dihapus atau dihapus dari penyimpanan cloud", + "ORG_ZSTACK_NETWORK_OVN_10023": "tidak dapat memodifikasi vmnic ke l3network [uuid:%s] karena host [uuid:%s] yang terkait dengan mesin virtual tidak terhubung ke SDN controller [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10028": "gagal建立 koneksi ke %s, harap verifikasi konfigurasi jaringan antara node manajemen ZStack dan server PXE bare-metal", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10016": "platform/aplikasi endpoint [%s] tidak mendukung template yang ditentukan pengguna", + "ORG_ZSTACK_NETWORK_OVN_10022": "tidak dapat memodifikasi VMNIC ke jaringan L3 [UUID:%s] karena SDN controller [UUID:%s] tidak ditemukan", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10029": "Tidak ditemukan repositori lokal di bawah /opt/zstack-dvd dari %s, harap unduh ISO ZStack dan buat repositori lokal terlebih dahulu", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10015": "jenis platform aplikasi tidak valid[%s]", + "ORG_ZSTACK_NETWORK_OVN_10021": "tidak dapat melampirkan jaringan L3 ke VM karena host [uuid:%s] dari VM tidak terhubung ke SDN controller [uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10018": "tidak dapat menemukan topik[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10020": "tidak dapat melampirkan jaringan L3 ke VM karena SDN controller [uuid:%s] tidak ditemukan", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10017": "parameter: %s tidak didukung oleh ZStack, nilai yang tersedia untuk parameter adalah: %s", + "ORG_ZSTACK_NETWORK_OVN_10026": "gagal menyinkronkan pengaturan kualitas jaringan ke ovn controller[uuid:%s, ip:%s], karena %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10011": "Kode template SMS harus berupa string dengan panjang 13 karakter. Namun, kode template event yang diberikan: [%s] memiliki [%d] karakter", + "ORG_ZSTACK_NETWORK_OVN_10025": "gagal mengambil NIC QoS dari OVN controller[uuid:%s, ip:%s], karena %s", + "ORG_ZSTACK_NETWORK_OVN_10024": "gagal mengatur NIC QoS pada OVN controller[uuid:%s, ip:%s], karena %s", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10020": "Tipe penyimpanan cadangan tidak didukung untuk server bare-metal", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10010": "Panjang kode template SMS harus 13 karakter. Menerima kode template alarm: [%s] dengan [%d] karakter", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10023": "Netmask DHCP Range Server PXE %s tidak valid untuk deployment mesin virtual", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10024": "Mulai Range DHCP Server PXE %s dan Berhenti Range %s tidak termasuk dalam subnet mask yang sama", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10025": "Server PXE dengan hostname sudah ada", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10026": "Sudah ada gateway Baremetal2 dengan IP manajemen %s; harap tidak menggunakannya untuk membuat server PXE Baremetal", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10027": "storagePath harus berupa path absolut yang menentukan lokasi lengkap dalam sistem file virtual", + "ORG_ZSTACK_STORAGE_MIGRATION_10022": "Gambar[uuid:%s] tidak ditemukan di penyimpanan cadangan sumber[uuid:%s]", + "ORG_ZSTACK_STORAGE_MIGRATION_10023": "Tidak dapat memigrasikan gambar dari lokasi sumber ke lokasi tujuan", + "ORG_ZSTACK_STORAGE_MIGRATION_10020": "Penyimpanan Blok Sumber dan Penyimpanan Blok Tujuan tidak boleh Dinonaktifkan.", + "ORG_ZSTACK_STORAGE_MIGRATION_10021": "Gambar[uuid:%s] tidak dalam keadaan Siaga dan karena itu tidak dapat dimigrasikan.", + "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10001": "sinyal hidup host %s tidak diterima", + "ORG_ZSTACK_STORAGE_MIGRATION_10026": "Volume[uuid:%s] tidak dalam keadaan Siaga dan tidak dapat dimigrasikan.", + "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10000": "tidak ditemukan ID host untuk host UUID[%s] dan penyimpanan utama UUID[%s]", + "ORG_ZSTACK_STORAGE_MIGRATION_10027": "Tidak dapat memigrasikan volume root dari instance mesin virtual ketika tidak dalam keadaan berhenti. Pastikan instance dihentikan sebelum mencoba memigrasikan volume root.", + "ORG_ZSTACK_STORAGE_MIGRATION_10024": "Volume[uuid:%s] sudah berada dalam Pool[uuid:%s], tidak dapat dimigrasikan.", + "ORG_ZSTACK_STORAGE_MIGRATION_10025": "Sesi PowerShell Sumber dan Tujuan tidak boleh dalam keadaan Nonaktif atau Pemeliharaan.", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10009": "Panjang tanda tangan SMS Alibaba Cloud harus antara 2 hingga 12 karakter. Mendapat tanda: [%s] dengan [%d] karakter.", + "ORG_ZSTACK_STORAGE_MIGRATION_10028": "Migrasi penyimpanan VM tidak didukung untuk VM[uuid:%s, nama: %s] ketika volume bersama terpasang.", + "ORG_ZSTACK_STORAGE_MIGRATION_10029": "Tidak dapat memigrasikan volume root dari instance VM yang memiliki volume data terpasang. Lepaskan semua volume data sebelum memigrasikan volume root.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10017": "gagal memasang cache baremetal untuk gambar[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10019": "Tidak cukup ruang tersisa di cache gambar baremetal untuk gambar[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10011": "gagal membuat konfigurasi DHCP untuk chassis [uuid:%s] di server PXE [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10012": "gagal menghapus konfigurasi DHCP dari chassis[uuid:%s] di server PXE[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10013": "UUID dari agen server PXE baremetal telah berubah [diharapkan: %s, aktual: %s]. Kemungkinan besar ini disebabkan oleh mulai ulang manual agen. Silakan hubungkan ulang untuk menyinkronkan status.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10005": "tidak dapat menemukan direktori: %s di dasbor", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10016": "tidak dapat terhubung ke server PXE baremetal [url:%s], karena %s", + "ORG_ZSTACK_LICENSE_10002": "Kode permintaan lisensi yang diberikan %s tidak valid untuk alokasi sumber daya cloud. Silakan verifikasi dan coba lagi.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10003": "eksekusi sqlite3 gagal karena: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10000": "metode tidak didukung: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10001": "kesalahan permintaan http! kode status: %s, kesalahan: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10011": "Penyimpanan backup Ceph yang terpasang tidak mendukung migrasi penyimpanan berbasis ISO.", + "ORG_ZSTACK_STORAGE_MIGRATION_10015": "tidak mendukung migrasi penyimpanan dari [%s] ke [%s] lingkungan virtual", + "ORG_ZSTACK_STORAGE_MIGRATION_10016": "VM[uuid:%s] berjalan tetapi UUID host hilang", + "ORG_ZSTACK_STORAGE_MIGRATION_10013": "tidak mendukung migrasi penyimpanan dari [%s] ke [%s] dengan volume data", + "ORG_ZSTACK_STORAGE_MIGRATION_10014": "tidak mendukung migrasi penyimpanan dari [%s] ke [%s] menggunakan snapshot", + "ORG_ZSTACK_STORAGE_MIGRATION_10019": "BS Sumber dan BS Target tidak boleh sama.", + "ORG_ZSTACK_STORAGE_MIGRATION_10017": "Hanya mendukung migrasi penyimpanan langsung volume data menggunakan parameter dataVolumes.", + "ORG_ZSTACK_STORAGE_MIGRATION_10018": "tidak mendukung migrasi penyimpanan langsung dari [%s] ke [%s] untuk volume selain volume root", + "ORG_ZSTACK_NETWORK_OVN_10001": "tidak dapat menambahkan VM NIC ke grup keamanan karena VM NIC SDN [uuid:%s] tidak cocok dengan grup keamanan SDN [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10006": "gagal membuat instance bm proxy nginx pada baremetal pxeserver[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10000": "tidak dapat menghubungkan jaringan L3 ke grup keamanan karena jaringan L3 SDN [uuid:%s] tidak cocok dengan grup keamanan SDN [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10007": "gagal menghapus instance bm proxy nginx pada baremetal pxeserver[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10008": "gagal memulai baremetal PXE server[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10009": "gagal menghentikan baremetal PXE server[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10005": "tidak dapat membuat grup keamanan karena OVS controller[uuid:%s, type: %s] tidak ditemukan", + "ORG_ZSTACK_NETWORK_OVN_10004": "Tidak dapat membuat grup keamanan karena OVN controller ditentukan. Pastikan Anda tidak menentukan OVN controller saat membuat grup keamanan.", + "ORG_ZSTACK_NETWORK_OVN_10003": "Tidak dapat menghapus host karena %d instance OVN controller berjalan di host", + "ORG_ZSTACK_NETWORK_OVN_10002": "tidak dapat membuat jaringan Layer 3 karena OVN tidak mendukung tipe L3: %s, kategori: %s", + "ORG_ZSTACK_NETWORK_OVN_10009": "tidak dapat menambahkan host SDN karena antarmuka jaringan [%s] tidak ditemukan", + "ORG_ZSTACK_NETWORK_OVN_10008": "Tidak dapat membuat SDN L2 network karena UUID SDN controller tidak ada. Pastikan UUID SDN controller dikonfigurasi dengan benar.", + "ORG_ZSTACK_NETWORK_OVN_10007": "tidak dapat menghubungkan layanan jaringan[%s] ke jaringan OVS", + "ORG_ZSTACK_GUESTTOOLS_PVPANIC_10000": "tidak dapat men-deploy mesin virtual tanpa jalur file sumber yang valid", + "ORG_ZSTACK_NETWORK_OVN_10006": "tidak dapat menghubungkan layanan jaringan OVN ke jaringan dengan vSwitchType[%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10001": "gagal menginisialisasi konfigurasi pada baremetal PXE server[uuid:%s]", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_MARKETPLACE_10000": "filterName harus diatur ke marketplace:true atau marketplace:false untuk penyaringan yang tepat di layanan marketplace.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10002": "gagal membuat konfigurasi instance baremetal pada pxeserver[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10003": "gagal menghapus konfigurasi instance baremetal pada pxeserver[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10004": "gagal membuat BM instance NOVA proxy pada baremetal PXE server[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10005": "gagal menghapus instance bm novnc proxy pada baremetal pxeserver[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_10005": "L3Network[uuid:%s] tidak memiliki layanan jaringan[type:%s] yang diaktifkan atau tidak ada provider yang menawarkan layanan jaringan ini.", + "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10000": "kemampuan yang tidak didukung: SEND_SNS_MESSAGE", + "ORG_ZSTACK_NETWORK_SERVICE_10004": "Gagal menerapkan layanan jaringan[%s] ke mesin virtual[uuid: %s]", + "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10001": "gagal mengirim notifikasi SNS pada plugin %s", + "ORG_ZSTACK_NETWORK_SERVICE_10007": "layanan jaringan untuk provider[uuid:%s] harus ditentukan", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10021": "tidak ada jaringan provisioning baremetal2 yang ditemukan di cluster[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10020": "tidak ada Baremetal2 gateway yang dapat digunakan ditemukan di cluster[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_10001": "L3Network [UUID: %s] tidak memiliki konfigurasi host route service.", + "ORG_ZSTACK_NETWORK_SERVICE_10000": "L3Network [UUID: %s] menyediakan tipe null", + "ORG_ZSTACK_LICENSE_10019": "vendor host yang tidak terduga untuk template MINI VM", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10022": "jaringan provisi baremetal2 [uuid:%s] tidak dapat digunakan; pastikan sudah diaktifkan.", + "ORG_ZSTACK_NETWORK_SERVICE_10009": "penyedia layanan jaringan dengan UUID [%s] tidak menawarkan layanan untuk %s", + "ORG_ZSTACK_NETWORK_OVN_10052": "gagal menghapus port OVS ke host [uuid:%s] untuk nics [%s], error: %s", + "ORG_ZSTACK_NETWORK_SERVICE_10008": "tidak dapat menemukan penyedia layanan jaringan[uuid:%s] atau tidak menawarkan layanan apapun", + "ORG_ZSTACK_NETWORK_OVN_10051": "gagal menghapus port OVS pada host [UUID:%s] untuk NICs [%s], error: %s", + "ORG_ZSTACK_NETWORK_OVN_10050": "gagal menyinkronkan port OVS dengan host[uuid:%s] untuk interface jaringan [%s], error: %s", + "ORG_ZSTACK_NETWORK_OVN_10056": "kesalahan запрос статус кластера untuk verifikasi node yang dikeluarikan %s", + "ORG_ZSTACK_NETWORK_OVN_10055": "gagal menyinkronkan pengaturan Quality of Service ke OVN controller[uuid:%s, ip:%s], error: %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORK_10000": "tidak dapat mengonfigurasi jaringan VXLAN untuk mesin virtual [uuid:%s] pada host tujuan [uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10054": "gagal mengatur requested chassis port OVS ke host[uuid:%s] untuk LSP[%s], error: %s", + "ORG_ZSTACK_NETWORK_OVN_10053": "gagal mengatur requested chassis port OVS pada host[uuid:%s] untuk LSP[%s], error: %s", + "ORG_ZSTACK_NETWORK_OVN_10059": "gagal menambahkan opsi DHCP ke OVN controller[uuid:%s, ip:%s], karena %s", + "ORG_ZSTACK_NETWORK_OVN_10058": "Hasil status cluster kosong diterima dari agent; harap verifikasi konfigurasi dan konektivitas agent.", + "ORG_ZSTACK_NETWORK_OVN_10057": "Gagal mengambil status cluster: %s", + "ORG_ZSTACK_NETWORK_SERVICE_10010": "Sebuah layanan jaringan [%s] telah dilampirkan ke jaringan Layer 3 [UUID: %s].", + "ORG_ZSTACK_LICENSE_10023": "Gagal menghapus lisensi untuk mesin virtual %s karena kesalahan yang tidak diketahui. Harap hubungi dukungan untuk bantuan.", + "ORG_ZSTACK_LICENSE_10003": "Timestamp yang diberikan tidak valid. Harap pastikan sesuai dengan standar ISO 8601 (YYYY-MM-DDTHH:mm:ss).", + "ORG_ZSTACK_LICENSE_10004": "Panjang file lisensi yang didekode tidak terduga: %d. Diperlukan panjang yang valid untuk layanan komputasi awan.", + "ORG_ZSTACK_LICENSE_10005": "Dekode gagal karena %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10010": "tidak ditemukan chassis server fisik yang tersedia di cluster baremetal2[uuids:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_10012": "networkServices tidak boleh kosong", + "ORG_ZSTACK_NETWORK_SERVICE_10011": "Alamat IP tidak cukup untuk alokasi saat melampirkan layanan DHCP ke jaringan L3 [uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_10014": "tidak dapat menemukan NetworkService Dhcp Backend [jenis provider: %s]", + "ORG_ZSTACK_NETWORK_OVN_10062": "gagal melakukan ping ke OVN controller[uuid:%s, ip:%s], karena %s", + "ORG_ZSTACK_NETWORK_OVN_10061": "Tidak dapat mengirim perintah ke OVN controller[uuid:%s, ip:%s], NfvInstanceGroup[uuid:%s, name:%s] status adalah %s, hanya kelompok Healthy atau Degraded yang dapat menerima perintah", + "ORG_ZSTACK_NETWORK_OVN_10060": "ovn controller[uuid:%s] tidak terhubung, status saat ini: %s", + "ORG_ZSTACK_NETWORK_OVN_10067": "IP [%s] bukan Virtual IP yang valid di lingkungan saat ini. Harap gunakan alamat Virtual IP dari NFV Instance Group.", + "ORG_ZSTACK_NETWORK_OVN_10066": "tidak dapat menemukan mesin virtual [uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10064": "tidak dapat menemukan interface jaringan mesin virtual [internalName:%s]", + "ORG_ZSTACK_NETWORK_OVN_10069": "ping kontroler SDN gagal, error: %s", + "ORG_ZSTACK_NETWORK_OVN_10068": "IP [%s] tidak terkait dengan grup instans NFV Pengontrol SDN OVN manapun. Harap gunakan alamat VIP dari grup instans NFV Pengontrol OVN.", + "ORG_ZSTACK_CORE_10000": "tidak ada executor ditemukan untuk resource UUID[%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10016": "nama bond %s sudah ada", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10018": "tidak dapat menemukan baremetal2 chassis dengan UUID [%s], kemungkinan tidak ada", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10017": "nic dengan alamat MAC sudah di-bond", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10000": "Gagal memvalidasi universal SMS dengan supplier[%s]", + "ORG_ZSTACK_LICENSE_10037": "MN[uuid:%s]: CloudInstanceNotDefinedException", + "ORG_ZSTACK_LICENSE_10038": "Ada beberapa Management Node tetapi hanya lisensi untuk %s yang disediakan.", + "ORG_ZSTACK_LICENSE_10039": "Lingkungan MN HA, tetapi hanya lisensi yang diperbarui untuk %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10001": "arsitektur CPU host [arch:%s] dan cluster [arch:%s] tidak cocok", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10000": "format informasi perangkat keras baremetal2 chassis salah: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10003": "format informasi perangkat keras NIC baremetal2 chassis salah: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10002": "hanya baremetal2 chassis dengan mode boot %s yang didukung", + "ORG_ZSTACK_NETWORK_OVN_10032": "Gagal mengonfigurasi node klaster OVN untuk instans NFV [UUID:%s], karena %s", + "ORG_ZSTACK_NETWORK_OVN_10031": "Tidak ada instans yang ditemukan di NfvInstanceGroup[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10038": "Melepaskan NfvInstance[uuid:%s] gagal karena instans tidak ditemukan", + "ORG_ZSTACK_NETWORK_OVN_10035": "jaringan L2 [UUID:%s] tidak terkait dengan kontroler SDN", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10005": "format informasi disk baremetal2 chassis salah: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10004": "Harus ada satu dan hanya satu provision NIC yang terkait dengan chassis BareMetal2.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10006": "Mesin virtual dengan alamat MAC duplikat terdeteksi pada compute node lain. Harap selesaikan konflik ini.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10009": "Tidak ditemukan sumber daya server fisik yang tersedia untuk deployment baremetal2.%s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10008": "BareMetal2 Chassis[uuid:%s] tidak ada atau dinonaktifkan", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10002": "supplier[%s] tidak valid", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10001": "Gagal memvalidasi universal SMS untuk instance layanan cloud %s", + "ORG_ZSTACK_CORE_GC_10001": "tidak dapat memicu pekerjaan garbage collection yang sudah selesai[uuid:%s, name:%s]", + "ORG_ZSTACK_LICENSE_10046": "tidak dapat menemukan file lisensi[uuid:%s, type:%s] di jalur yang ditentukan %s", + "ORG_ZSTACK_LICENSE_10028": "gagal mencabut lisensi untuk modul %s", + "ORG_ZSTACK_LICENSE_10029": "UKey tidak didukung (arsitektur: %s)", + "ORG_ZSTACK_NETWORK_OVN_10041": "tidak dapat melampirkan jaringan L3 ke security group karena kontroler SDN [uuid:%s] tidak ditemukan", + "ORG_ZSTACK_NETWORK_OVN_10040": "IP Manajemen tidak ditemukan untuk melepaskan Instance NFVI [UUID:%s]", + "ORG_ZSTACK_NETWORK_OVN_10045": "gagal memulai layanan Open vSwitch pada host[uuid:%s], error: %s", + "ORG_ZSTACK_NETWORK_OVN_10043": "gagal menginstal paket ovs ke host[uuid:%s], error: %s", + "ORG_ZSTACK_NETWORK_OVN_10042": "tidak dapat menghubungkan jaringan L3 ke grup keamanan karena pengontrol SDN [uuid:%s] tidak terhubung [status:%s]", + "ORG_ZSTACK_NETWORK_OVN_10049": "gagal menyinkronkan port OVS pada host [UUID:%s] untuk antarmuka jaringan [%s], error: %s", + "ORG_ZSTACK_NETWORK_OVN_10048": "gagal menambahkan port OVS ke host [UUID:%s] untuk NIC [%s], error: %s", + "ORG_ZSTACK_NETWORK_OVN_10047": "gagal menambahkan port OVS pada host [UUID:%s] untuk NIC [%s], error: %s", + "ORG_ZSTACK_LICENSE_10030": "Lisensi UKey lokal tidak ditemukan atau berhasil diperbarui. Pastikan UKey Anda terhubung dengan baik dan memiliki lisensi untuk layanan komputasi awan.", + "ORG_ZSTACK_LICENSE_10031": "perbarui lisensi mesin virtual lokal: %s", + "ORG_ZSTACK_LICENSE_10032": "Tidak ada compute instance yang tersedia untuk memperbarui UKey", + "ORG_ZSTACK_GUESTTOOLS_KVM_10001": "gagal melepaskan guest tools di mesin virtual[uuid:%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10000": "gagal mengambil informasi guest tools dari vm[uuid:%s], alasan:%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10033": "id perangkat pci[%s] bukan integer yang valid di tag[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10034": "spesifikasi perangkat mdev dengan UUID [%s] tidak ada", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10031": "ID Perangkat PCI hilang di tag[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10032": "ID Perangkat PCI harus lebih besar dari 0 di tag[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10030": "spesifikasi perangkat pci [uuid:%s] tidak ada, berasal dari tag [%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10006": "gagal mengambil status guest tools dari prometheus: [metric=%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10005": "gagal melepaskan ISO guest tools dari VM[UUID:%s], karena:%s", + "ORG_ZSTACK_GUESTTOOLS_KVM_10004": "gagal melampirkan ISO guest tools ke VM[UUID:%s], karena:%s", + "ORG_ZSTACK_GUESTTOOLS_KVM_10003": "gagal mengunduh ISO guest tools karena tidak ada host KVM [uuid:%s] yang ditemukan", + "ORG_ZSTACK_LICENSE_10048": "Kadaluarsa lisensi: Lisensi lingkungan komputasi awan Anda telah berakhir. Hubungi dukungan untuk memperbarui lisensi Anda.", + "ORG_ZSTACK_LICENSE_10049": "tidak didukung: hapus lisensi[%s] dari kunci perangkat keras", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10024": "tidak ada spesifikasi perangkat PCI yang tersedia untuk mesin virtual[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10025": "spesifikasi perangkat PCI [uuid:%s] tidak tersedia untuk mesin virtual [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10023": "gagal mendapatkan spesifikasi perangkat PCI yang tersedia untuk VM[uuid:%s]: %s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10020": "instance vm [uuid:%s, state:%s] perlu dimatikan untuk menghapus spesifikasi perangkat mdev [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10027": "why volume[uuid:%s, installPath:%s] tidak ada di direktori %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10026": "host[uuid:%s] mungkin memasang penyimpanan yang berbeda dari Kebijakan Manajemen Penyimpanan[uuid:%s], harap verifikasi ini.", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10024": "hosts[uuid:%s] memiliki path mount yang sama tapi sebenarnya dipasang ke penyimpanan yang berbeda.", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10028": "Spesifikasi perangkat mdev [uuid:%s] tidak tersedia untuk mesin virtual [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10029": "UUID spesifikasi perangkat PCI hilang dalam tag[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10026": "tidak ada spesifikasi perangkat mdev yang tersedia untuk mesin virtual[uuid:%s]", + "ORG_ZSTACK_LICENSE_10050": "Lisensi platform Hybrid sudah digunakan. Harap hapus lisensi platform Hybrid dan lisensi add-ons Hybrid secara bersamaan menggunakan DeleteLicenseAction dengan UUID lisensi Hybrid[uuid=%s].", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10011": "vm[uuid:%s] tidak memiliki spesifikasi perangkat pci[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10012": "Instance vm [UUID: %s, state: %s] perlu dimatikan untuk menghapus spesifikasi perangkat pci [UUID: %s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10019": "vm[uuid:%s] tidak memiliki spesifikasi perangkat mdev[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10017": "vm[uuid:%s] sudah memiliki spesifikasi perangkat mdev [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10018": "Instance vm [uuid:%s, state:%s] memerlukan penghentian untuk mengatur spesifikasi perangkat mdev", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10015": "Instance vm [uuid:%s, state:%s] memerlukan penghentian untuk mengatur spesifikasi perangkat pci", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10009": "tidak dapat menemukan affinity group [uuid:%s], mungkin telah dihapus atau dihentikan", + "ORG_ZSTACK_COMPUTE_VM_10309": "IP[%s] tidak tersedia pada jaringan VPC[uuid:%s] karena: %s", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10006": "Ada mesin virtual lain pada host ini [uuid: %s] yang termasuk dalam affinity group [%s] yang sama.", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10005": "VM [uuid: %s] sudah ditetapkan ke affinity group [uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10307": "format alamat IP statis[%s] salah", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10008": "vm [uuid:%s] tidak memenuhi affinity group [uuid:%s]", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10007": "affinityGroup [uuid:%s] gagal memesan host [uuid:%s] untuk virtualMachine [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10003": "Hanya satu dari cluster UUID, host UUID, atau VM UUID yang dapat ditentukan pada satu waktu.", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10008": "vm[uuid:%s] sudah memiliki spesifikasi perangkat PCI[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10006": "VM harus dijeda untuk mengatur spesifikasi perangkat PCI: uuid=%s, state=%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10007": "Jenis perangkat PCI tidak valid: %s, jenis yang valid untuk lingkungan virtualisasi cloud meliputi: %s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10004": "Tidak ditemukan compute resource yang diaktifkan", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10001": "tidak dapat menghapus sistem tag[%s]. Plugin load balancer bergantung padanya; Anda hanya dapat memperbaruinya.", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10002": "AffinityGroup [uuid: %s] tidak ada", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10002": "nic dengan UUID %s tidak ditemukan. Harap perbaiki network tag %s dari load balancer Anda.", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10001": "VM [uuid: %s] sudah terkait dengan affinity group [uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10303": "pembaruan vm[%s] prioritas ke [%s] gagal karena %s", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10004": "Tidak dapat beroperasi pada affinity group [uuid: %s] yang tidak diaktifkan di lingkungan cloud", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10000": "tidak dapat menemukan load balancer[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10302": "VM[uuid:%s] hanya dapat memasang %s perangkat CD-ROM", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10003": "Tidak dapat mengoperasikan grup affinitas yang dibuat oleh sistem. Silakan hubungi dukungan untuk bantuan.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10005": "algoritma balance[%s] tidak valid, algoritma yang valid adalah %s", + "ORG_ZSTACK_COMPUTE_VM_10301": "VM[uuid:%s] sudah memiliki ISO[uuid:%s] yang terpasang", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10006": "ambang batas unhealthy[%s] tidak valid, nilai harus berupa angka", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10003": "bobot load balancer[%s] tidak valid, ID instance tidak berada dalam rentang [%d, %d]", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10000": "VM hanya dapat mengubah grup affinitasnya dalam status [%s,%s], tetapi VM saat ini berada dalam status [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10004": "bobot balancer[%s] tidak valid, nilai bukan angka", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10009": "waktu koneksi idle[%s] tidak valid, pastikan %s berupa nilai numerik", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10007": "ambang batas healthy[%s] tidak valid, masukkan nilai numerik", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10008": "waktu healthy[%s] tidak valid, pastikan %s berupa nilai numerik", + "ORG_ZSTACK_TICKET_IAM2_10002": "operasi ditolak karena flow collection [uuid:%s] tidak termasuk dalam proyek [uuid:%s]", + "ORG_ZSTACK_TICKET_IAM2_10003": "ID virtual instance [uuid:%s] tidak berwenang untuk mengelola tiket [uuid:%s, name:%s]", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10004": "Topik Kafka tidak boleh kosong. Pastikan nama topik dikonfigurasi dengan benar.", + "ORG_ZSTACK_TICKET_IAM2_10000": "operasi ditolak karena penghapusan pengirim tiket [uuid:%s]; hanya penghapusan tiket [uuid:%s, name:%s] yang diizinkan sekarang", + "ORG_ZSTACK_TICKET_IAM2_10001": "Operasi ditolak karena proyek [UUID:%s] yang terkait dengan tiket telah dihapus. Tiket [UUID:%s, name:%s] hanya dapat dihapus sekarang.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10001": "Mode Syslog tidak boleh kosong", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10000": "Indeks untuk instance cloud tidak boleh kosong. Harap berikan nilai indeks yang valid.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10003": "Format label Loki harus berupa key=value", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10002": "Label Loki tidak boleh kosong. Pastikan semua nilai label didefinisikan dengan benar.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10018": "Alamat VTEP VXLAN untuk host [UUID: %s] dan pool jaringan [UUID: %s] sudah ada", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10017": "%s bukan alamat IPv4 yang valid", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10016": "ip[%s] l2NetworkUuid[%s] clusterUuid[%s] Alamat IP sudah ada di tabel VTEP lokal", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10021": "tidak dapat membuat rentang VNI karena L2 UUID[%s] bukan bagian dari pool jaringan VXLAN", + "ORG_ZSTACK_ALIYUN_CORE_IDENTITYZONE_10000": "harus menentukan zoneId untuk jaringan Aliyun VPC privat", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10012": "ID instance[%s] tidak valid, %s bukan identifier instance yang valid", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10010": "interval health check[%s] tidak valid, nilai harus berupa angka", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10011": "nilai koneksi maksimum[%s] tidak valid, pastikan %s berupa nilai numerik", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10016": "target health check[%s] tidak valid, port[%s] harus berupa nilai numerik", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10017": "gagal memasang VIP ke load balancer karena VIP[%s] tidak memiliki alamat IP terkait", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10014": "target health check[%s] tidak valid, protokol checking[%s] tidak valid, protokol yang valid adalah %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10015": "target pemeriksaan kesehatan tidak valid [%s], port [%s] tidak berada dalam rentang valid [1, 65535]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10018": "gagal menghubungkan IPv4 VIP ke load balancer karena load balancer [%s] sudah memiliki IPv4 VIP [%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10009": "gagal merealisasikan pool jaringan VXLAN [uuid:%s, type:%s] pada host KVM [uuid:%s], karena %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10019": "gagal menghubungkan IPv6 VIP ke load balancer karena load balancer [%s] sudah memiliki IPv6 VIP [%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10004": "gagal membuat bridge [%s] untuk l2Network [uuid:%s, type:%s, vni:%d] pada host KVM [uuid:%s], karena %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10003": "gagal menemukan VTEP pada host [UUID: %s], harap hubungkan kembali pool VXLAN [UUID: %s] ke cluster", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10002": "menemukan beberapa alamat IP VTEP [%s] untuk satu host [UUID:%s]. Harap hapus host dan tambahkan kembali", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10008": "gagal memvalidasi cidr [%s] untuk l2VxlanNetworkPool [uuid:%s, name:%s] pada host kvm [uuid:%s], %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10007": "gagal menghapus bridge [%s] untuk l2Network [uuid:%s, type:%s, vni:%s] pada host KVM [uuid:%s], karena %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10006": "gagal memvalidasi cidr [%s] untuk l2VxlanNetwork [uuid:%s, name:%s] pada host kvm [uuid:%s], %s", + "ORG_ZSTACK_CRYPTO_CCS_10001": "pengguna [uuid=%s] tidak ada di lingkungan cloud", + "ORG_ZSTACK_CRYPTO_CCS_10002": "UUID sertifikat tidak ada dan tag sistem UKey tidak ada. Harap pastikan keduanya dikonfigurasi dengan benar", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10020": "cloud tidak dapat menghapus vip [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10023": "ketidaksesuaian jenis penyedia layanan terdeteksi. Load balancer [uuid:%s] disediakan oleh penyedia layanan [type:%s], tetapi penyedia layanan baru [type:%s] sedang dicoba", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10024": "ada listener dengan port yang sama [%s] dan load balancer yang sama [UUID:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10022": "tidak dapat mengambil jenis penyedia layanan untuk listener load balancer [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10027": "bobot balancer tidak valid untuk antarmuka jaringan: %s, %d tidak berada dalam rentang valid [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10028": "tidak dapat mengambil kandidat vmnic karena baik UUID load balancer maupun UUID grup server tidak ditentukan. Harap pastikan identifier ini ditentukan dengan benar", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10026": "parameter pemeriksaan kesehatan tidak valid [%s], formatnya harus method:URI:status_codes, contoh GET:/index.html:http_2xx", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10029": "tidak dapat mengambil kandidat jaringan Layer 3 karena baik UUID Load Balancer maupun UUID Grup Server tidak ditentukan", + "ORG_ZSTACK_CRYPTO_CCS_10008": "sertifikat [uuid=%s] tidak ditemukan di penyimpanan sertifikat", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10030": "tidak dapat melepas VM NIC dari listener load balancer [uuid:%s] karena grup server default yang terkait dengan listener telah dihapus", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10031": "tidak dapat membuat load balancer karena parameter VIP dan IPv6 VIP kosong. Harap berikan alamat IP yang valid", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10034": "VIP load balancer [%s] tidak boleh menjadi alamat IP pertama atau terakhir dalam blok CIDR yang terkait dengan jenis pool alamat publik", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10035": "gagal membuat loadbalancer cloud karena param vipUuid menunjuk ke VIP [%s] yang bukan antarmuka mesin virtual IPv4", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10032": "tidak dapat membuat load balancer karena L3 network dari VIP dan IPv6 VIP bukan L3 network yang sama. Harap pastikan mereka berada di L3 network yang sama", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10033": "VIP [UUID:%s] telah digunakan oleh entitas layanan jaringan lain [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10038": "kegagalan operasi, entri IP duplikat/berlebihan di %s dari grup daftar kontrol akses:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10039": "kegagalan operasi, format IP hanya mendukung ip/iprange/cidr, tetapi ditemukan %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10036": "gagal membuat load balancer cloud karena parameter ipv6VipUuid menunjuk ke VIP [%s], yang bukan VIP IPv6", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10037": "kegagalan operasi, tidak mendukung versi IP %d", + "ORG_ZSTACK_VPC_HA_10001": "Tidak dapat memperbarui layanan jaringan ini karena VPC [UUID:%s] tidak mendukung pembaruan versi layanan jaringan.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10025": "L2Network[uuid:%s] bukan dari tipe L2VxlanNetwork", + "ORG_ZSTACK_VPC_HA_10002": "Tidak dapat memperbarui layanan jaringan ini karena VPC [UUID:%s] menggunakan versi kernel yang sudah usang:[%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10024": "vlan[%s] bukan VNI yang valid", + "ORG_ZSTACK_VPC_HA_10003": "Tidak dapat menerapkan source network address translation dengan jaringan publik non-default karena fitur multi-SNAT dinonaktifkan.", + "ORG_ZSTACK_VPC_HA_10004": "Tidak dapat menerapkan SNAT dengan L3 Network ini karena L3 network [uuid:%s] adalah jaringan privat.", + "ORG_ZSTACK_VPC_HA_10005": "Tidak dapat menerapkan SNAT dengan L3 Network ini karena L3 network [uuid:%s] tidak terlampir ke router VPC", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10029": "format CIDR salah dalam system tag [%s]", + "ORG_ZSTACK_VPC_HA_10006": "alamat IP monitor cloud tidak valid [%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10028": "system tag [%s] salah, harus salah satu dari berikut: [EC2, GCE, AWS_VPC]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10027": "Harap input satu system tag seperti: [%s]", + "ORG_ZSTACK_VPC_HA_10008": "vpcHaRouter [uuid:%s] telah dihapus", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10042": "Tidak dapat melampirkan security group [%s] dengan versi IP berbeda ke LoadBalancer [%s].", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10031": "pool jaringan vXLAN tidak mendukung pembuatan L3 networks.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10040": "rentang IP [%s, %s] tumpang tindih dengan IP awal: %s dan IP akhir: %s dari grup access control list: %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10030": "rentang VNI tumpang tindih dengan %s [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10045": "redirect access-control-list groups[uuid:%s] hanya dapat diasosiasikan dengan load balancer listener dan harus ditetapkan ke server group.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10046": "akses-control-list groups[uuid:%s] ke load balancer listener[uuid:%s] harus berupa HTTPS atau HTTP", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10043": "domain[%s], url[%s] duplikat/tumpang tindih aturan redirect dengan grup access control list:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10044": "access-control-list groups[uuid:%s] dikonfigurasi untuk redirect, tetapi beberapa entri access-control-list tidak memiliki aturan redirect dan berisi entri IP.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10049": "access-control-list groups[uuid:%s] telah dilampirkan ke load balancer listener lain[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10048": "access-control-list groups[uuid:%s] tidak berisi aturan redirect", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10001": "Akun tidak memiliki VIP yang ditetapkan.", + "ORG_ZSTACK_COMPUTE_VM_10239": "CreateVmInstanceMsg tidak boleh null. Harap pastikan pesan permintaan diinisialisasi dengan benar sebelum mengajukan permintaan.", + "ORG_ZSTACK_COMPUTE_VM_10237": "zoneUuid harus ditentukan karena gambar berada pada beberapa backup storage.", + "ORG_ZSTACK_COMPUTE_VM_10236": "tidak ditemukan Layer2 Networks di cluster yang telah melampirkan ke primary storages[uuids:%s]", + "ORG_ZSTACK_COMPUTE_VM_10235": "Primary storages dengan UUIDs:%s belum melampirkan cluster manapun di zone dengan UUID:%s.", + "ORG_ZSTACK_COMPUTE_VM_10234": "tidak ditemukan primary storage yang dapat diakses oleh backup storage[uuid:%s, type:%s]", + "ORG_ZSTACK_COMPUTE_VM_10233": "Gambar dengan UUID [uuid:%s] tidak tersimpan pada backup storage manapun yang telah dilampirkan ke zone dengan UUID [uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_10232": "Sertifikat TLS Spice tidak ada. Harap verifikasi apakah Spice TLS diaktifkan.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10002": "tidak dapat membuat instance virtual router karena jaringan virtual router tumpang tindih dengan jaringan privat dalam konfigurasi IP.%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10001": "gagal menghapus Virtual Router Bootstrap ISO[%s] pada host KVM[uuid:%s] untuk virtual router[uuid:%s], karena %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10000": "gagal membuat Virtual Router Bootstrap ISO[%s] pada host KVM[uuid:%s, ip:%s] untuk virtual router[uuid:%s], karena %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10005": "jaringan dari instance virtual router dengan UUID:%s tidak boleh sama dengan jaringan privat L3 UUID:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10004": "tidak ditemukan penawaran instance virtual router dengan UUID:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10009": "tidak dapat menambahkan rentang IP karena jaringan L3 [UUID:%s] adalah jaringan manajemen dari virtual router", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10008": "tidak dapat menambahkan rentang IP karena jaringan L3 [UUID:%s] adalah jaringan manajemen dari penawaran virtual router", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10007": "Gagal memulai L3 virtual router [UUID: %s]", + "ORG_ZSTACK_COMPUTE_VM_10242": "kegagalan menangani pasangan kunci ssh saat membuat vm karena [%s]", + "ORG_ZSTACK_COMPUTE_VM_10241": "kegagalan menangani tag sistem saat membuat VM karena [%s]", + "ORG_ZSTACK_COMPUTE_VM_10240": "gagal menginisialisasi tag sistem untuk mesin virtual karena %s", + "ORG_ZSTACK_COMPUTE_VM_10249": "cpuCores harus berupa nilai integer yang valid", + "ORG_ZSTACK_COMPUTE_VM_10248": "cpuSockets harus berupa bilangan bulat positif yang mewakili jumlah soket CPU.", + "ORG_ZSTACK_COMPUTE_VM_10247": "perangkat boot[%s] tidak valid dalam daftar urutan boot[%s]", + "ORG_ZSTACK_COMPUTE_VM_10246": "konflik terdeteksi untuk hostname dalam tag sistem; VM lain dengan UUID %s sudah memiliki hostname %s pada jaringan L3 UUID %s", + "ORG_ZSTACK_COMPUTE_VM_10245": "hanya satu tag sistem hostname yang diizinkan, tetapi %s diterima", + "ORG_ZSTACK_COMPUTE_VM_10244": "hostname[%s] yang ditentukan dalam tag sistem bukan nama domain yang valid", + "ORG_ZSTACK_COMPUTE_VM_10243": "Tidak dapat mengaktifkan fungsi ini. Mesin virtual [uuid: %s] memiliki beberapa kartu antarmuka jaringan (NIC) yang terkait dengan jaringan L3 [uuid: %s].", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10013": "gagal memperbarui jaringan default virtual router [uuid:%s] karena %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10012": "gagal melampirkan layanan jaringan virtual router ke l3Network[uuid:%s]. Pemilihan port forwarding memerlukan konfigurasi_snat.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10011": "gagal melampirkan layanan jaringan virtual router ke l3Network[uuid:%s]. Ketika Elastic IP (EIP) dipilih, Source Network Address Translation (SNAT) juga harus dikonfigurasi.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10010": "tidak dapat menambahkan gambar karena tag sistem [%s] menyertakan jenis gambar appliance yang tidak valid [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10017": "virtual router [name:%s, uuid:%s, current state:%s] tidak operasional dan tidak dapat melakukan operasi yang diperlukan. Silakan coba lagi setelah berjalan.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10015": "gagal menyinkronkan VIP [ips: %s] pada virtual router [uuid:%s] untuk migrasi panas virtual router karena %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10014": "VirtualMachineType %s tidak valid", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10000": "tidak dapat mengubah pemilik sumber daya karena instance mesin virtual [uuid:%s] sudah dikaitkan dengan grup keamanan", + "ORG_ZSTACK_TEST_COMPUTE_HOSTALLOCATOR_10000": "Sesuai tujuan: Tindakan ini disengaja dan selaras dengan arsitektur komputasi cloud kami. Harap pastikan semua konfigurasi mesin virtual mematuhi standar keamanan dan kinerja kami.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10019": "virtual router[uuid:%s] tidak memiliki NIC manajemen yang mampu melakukan panggilan HTTP ke %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10018": "virtual router [uuid: %s] dalam status %s yang tidak dapat melakukan panggilan HTTP ke %s", + "ORG_ZSTACK_COMPUTE_VM_10253": "hanya satu tag sistem bootMode yang diizinkan, tetapi %d tag ditemukan", + "ORG_ZSTACK_COMPUTE_VM_10252": "Mesin virtual harus memiliki maksimal satu tag sistem data pengguna.", + "ORG_ZSTACK_COMPUTE_VM_10251": "Sudah memiliki satu tag sistem yang ditentukan pengguna untuk VM[uuid: %s].", + "ORG_ZSTACK_COMPUTE_VM_10250": "cpuThreads harus berupa nilai integer", + "ORG_ZSTACK_COMPUTE_VM_10259": "pengalihan USB[%s] tidak valid, %s bukan tag USBRedirect yang valid", + "ORG_ZSTACK_COMPUTE_VM_10258": "parameter[%s] tidak valid, nilai [%s] bukan tipe boolean", + "ORG_ZSTACK_COMPUTE_VM_10257": "format tag[%s] tidak valid", + "ORG_ZSTACK_COMPUTE_VM_10256": "tipe mesin vm memerlukan [q35, pcie, virtual], tetapi mendapatkan [%s]", + "ORG_ZSTACK_COMPUTE_VM_10254": "[%s] yang ditentukan dalam tag sistem [%s] bukan mode boot yang valid untuk penyediaan instans cloud.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10020": "tidak dapat menambahkan antarmuka jaringan [ip:%s, ip6:%s, mac:%s] ke router virtual untuk mesin virtual [uuid:%s ip:%s], karena %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10024": "tidak dapat mengatur jaringan default karena L3 UUID[:%s] merujuk pada jaringan manajemen", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10023": "l3 UUID [%s] tidak dikaitkan dengan router virtual [UUID:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10022": "l3 uuid[:%s] sama dengan jaringan default dari router virtual [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10021": "tidak dapat menambahkan IP server ke grup server load balancer karena load balancer bersama tidak memiliki penyedia layanan. Pastikan antarmuka jaringan virtual (VMNIC) ditambahkan terlebih dahulu.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10010": "Gagal membuat VIP karena versi jaringan virtual tidak dapat ditentukan. Harap periksa pengaturan konfigurasi jaringan Anda.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10012": "penyedia layanan dari VIP[UUID:%s, name:%s, IP:%s] telah diatur ke %s", + "ORG_ZSTACK_TICKET_EXECUTOR_10001": "gagal mengambil nilai dari event: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10025": "tidak dapat mengatur jaringan default karena l3 UUID[:%s] bukan jaringan publik", + "ORG_ZSTACK_TICKET_EXECUTOR_10000": "Tidak ada kelas API [name:%s] yang ditemukan di namespace yang ditentukan. Pastikan nama kelas dan namespace benar.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10016": "tidak dapat mengatur grup keamanan VM NIC karena VM NIC [uuid:%s] tidak dilampirkan ke grup keamanan manapun", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10015": "tidak dapat mengatur grup keamanan VM NIC karena VM NIC [UUID:%s] tidak ditemukan", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10007": "requiredIp[%s] bukan alamat IPv4 yang valid", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10018": "tidak dapat mengatur grup keamanan VM NIC karena prioritas tidak valid; prioritas[%d] harus lebih besar dari atau sama dengan 1", + "ORG_ZSTACK_COMPUTE_10003": "bandwidth keluar[%d] dari antarmuka jaringan mesin virtual berada di luar rentang valid [8192, 32212254720]", + "ORG_ZSTACK_COMPUTE_VM_10264": "vm[uuid:%s, name:%s] telah dihentikan", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10017": "tidak dapat mengatur grup keamanan VM NIC karena grup keamanan[uuid:%s] tidak ditemukan", + "ORG_ZSTACK_COMPUTE_10004": "bandwidth masuk VM NIC melebihi rentang valid [8192, 32212254720]", + "ORG_ZSTACK_COMPUTE_VM_10263": "Resource[uuid:%s] adalah volume root, dan Anda tidak dapat langsung mengubah pemiliknya. Sebagai gantinya, ubah pemilik mesin virtual tempat volume root tersebut berada.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10009": "alamat IP yang diperlukan [%s] sudah dialokasikan", + "ORG_ZSTACK_COMPUTE_10001": "VM NIC l3NetworkUuid tidak boleh null", + "ORG_ZSTACK_COMPUTE_VM_10262": "rootDiskOfferingUuid tidak boleh null saat membuat VM tanpa image.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10008": "Sudah ada VIP[%s] yang dikaitkan dengan L3 Network[UUID:%s].", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10019": "tidak dapat menetapkan grup keamanan VM NIC karena duplikat prioritas; kedua grup keamanan %s dan %s memiliki prioritas %d", + "ORG_ZSTACK_COMPUTE_10002": "l3NetworkUuid dari VM NIC tidak ada dalam l3[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10003": "tidak dapat menghapus ip, karena ip[uuid:%s] adalah virtual IP", + "ORG_ZSTACK_COMPUTE_VM_10260": "usbRedirect[%s] tidak valid, %s bukan tipe boolean", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10002": "Status VIP tidak dapat diakses oleh akun ini. Silakan periksa izin akun Anda dan coba lagi.", + "ORG_ZSTACK_COMPUTE_10000": "Parameter antarmuka jaringan duplikat terdeteksi. Pastikan setiap antarmuka jaringan memiliki parameter yang unik.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10005": "strategi alokasi IP[%s] tidak didukung", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10004": "System VIP tidak dapat dihapus melalui API. Silakan hubungi dukungan untuk bantuan.", + "ORG_ZSTACK_COMPUTE_VM_10269": "VM[UUID:%s] tidak memiliki NIC yang terhubung ke L3 network[UUID:%s]", + "ORG_ZSTACK_COMPUTE_10007": "driver jaringan VM %s belum didukung", + "ORG_ZSTACK_COMPUTE_VM_10268": "mendapatkan status yang tidak dikenali dari VM[uuid:%s] di host[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10267": "gagal memeriksa status VM [uuid:%s] di host [uuid:%s], %s", + "ORG_ZSTACK_COMPUTE_10005": "jumlah multi-queue [%d] dari antarmuka jaringan VM berada di luar rentang valid [1, 256]", + "ORG_ZSTACK_COMPUTE_10006": "vm nic dari l3[uuid:%s] state[%s] tidak dalam status yang diharapkan atau %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10031": "tidak dapat membuat virtual router offering karena jaringan manajemen belum mendukung IPv6", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10030": "jaringan manajemen [uuid:%s] tidak berada di zona ketersediaan yang sama [uuid:%s] dengan offering yang akan dibuat.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10035": "L3 network [UUID: %s] memiliki layanan SNAT yang diaktifkan; oleh karena itu, tidak dapat digunakan sebagai jaringan manajemen.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10034": "image[uuid:%s] memiliki format %s yang tidak didukung, tidak dapat digunakan untuk konfigurasi virtual router", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10033": "tipe media image[uuid:%s] adalah %s, yang tidak memenuhi persyaratan untuk image virtual router, yang tipe medianya harus %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10032": "jaringan publik dengan UUID %s tidak berada di zona ketersediaan yang sama dengan offering yang akan dibuat.", + "ORG_ZSTACK_STORAGE_VOLUME_10087": "Image dengan UUID [uuid:%s] dan nama [name:%s] telah dihapus dari semua backup storage.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10039": "jaringan manajemen [UUID:%s, gateway:%s] tidak dapat dijangkau", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10038": "jaringan manajemen[uuid:%s] tidak memiliki rentang IP yang dikonfigurasi", + "ORG_ZSTACK_STORAGE_VOLUME_10086": "tipe primaryStorage [%s] belum mendukung volume bersama", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10037": "L3 network dengan UUID [uuid: %s] memiliki alamat jaringan yang sama dengan [uuid: %s] dan tidak dapat digunakan untuk virtual router.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10036": "L3 network [UUID: %s] memiliki layanan SNAT yang diaktifkan dan tidak dapat digunakan sebagai jaringan publik.", + "ORG_ZSTACK_STORAGE_VOLUME_10088": "tidak dapat menemukan backup storage yang memenuhi kondisi berikut untuk image[uuid:%s]: 1. status Enabled 2. status Connected 3. terpasang di zona tempat primary storage[uuid:%s] berada.", + "ORG_ZSTACK_STORAGE_VOLUME_10083": "UUID volume duplikat: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10082": "Tidak dapat mengembalikan ke snapshot yang bukan yang terbaru", + "ORG_ZSTACK_STORAGE_VOLUME_10085": "gagal mendapatkan tipe penyimpanan primer", + "ORG_ZSTACK_STORAGE_VOLUME_10092": "Volume target dihapus selama pembuatan volume.%s", + "ORG_ZSTACK_STORAGE_VOLUME_10091": "konflik UUID penyimpanan primer, penyimpanan primer yang ditentukan oleh disk offering adalah %s, dan penyimpanan primer yang ditentukan dalam parameter pembuatan adalah %s", + "ORG_ZSTACK_STORAGE_VOLUME_10093": "tidak boleh ada lebih dari satu implementasi mesin virtual %s.", + "ORG_ZSTACK_STORAGE_VOLUME_10096": "tidak dapat mengunduh ISO ke penyimpanan primer karena: %s", + "ORG_ZSTACK_ZDFS_10000": "ping ke zDFS gagal, %s", + "ORG_ZSTACK_COMPUTE_VM_10204": "format JSON tidak valid, penyebab: %s", + "ORG_ZSTACK_COMPUTE_VM_10203": "l3NetworkUuids dan vmNicInventories tidak boleh keduanya kosong atau keduanya diatur secara bersamaan.", + "ORG_ZSTACK_COMPUTE_VM_10200": "volume[uuid:%s] tidak dapat memenuhi persyaratan [state:Enabled status:Ready]", + "ORG_ZSTACK_COMPUTE_VM_10219": "API ini sudah usang dan tidak lagi didukung di lingkungan komputasi cloud. Harap pertimbangkan untuk menggunakan API terbaru yang tersedia untuk operasi Anda.", + "ORG_ZSTACK_COMPUTE_VM_10218": "Tidak dapat memperbarui kata sandi konsol untuk VM[uuid:%s] karena tidak ada kata sandi konsol yang saat ini dikonfigurasi.", + "ORG_ZSTACK_ZDFS_10002": "telah terjadi masalah ZDFS dengan hostname[%s]", + "ORG_ZSTACK_ZDFS_10001": "menghubungkan ke zDFS gagal, %s", + "ORG_ZSTACK_COMPUTE_VM_10217": "Tidak dapat memperbarui kata sandi konsol untuk VM[uuid:%s] karena tidak dalam keadaan 'Running'. Keadaan saat ini adalah '%s'.", + "ORG_ZSTACK_COMPUTE_VM_10216": "Kata sandi konsol tidak boleh dimulai dengan \"password\" untuk menghindari kerentanan keamanan VNC yang potensial.", + "ORG_ZSTACK_COMPUTE_VM_10215": "Jangan izinkan mounting file ISO yang sama beberapa kali", + "ORG_ZSTACK_COMPUTE_VM_10214": "Mesin virtual dengan UUID [uuid=%s] tidak ada", + "ORG_ZSTACK_COMPUTE_VM_10220": "TheCdRom[%s]SudahMenjadiDefault", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10002": "Hostname untuk instance cloud Anda tidak boleh null. Harap berikan hostname yang valid.", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10000": "facilityId tidak boleh null", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10001": "fasilitas logging tidak valid %s", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10006": "server syslog[address: %s] tidak tersedia", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10007": "server syslog[address: %s:%s] tidak tersedia", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10004": "Protokol tidak boleh null. Harap pastikan protokol yang valid diberikan.", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10005": "protokol %s tidak didukung di lingkungan komputasi cloud", + "ORG_ZSTACK_COMPUTE_VM_10228": "Mengharapkan alamat MAC unicast, menemukan alamat MAC multicast [%s]", + "ORG_ZSTACK_COMPUTE_VM_10227": "Alamat jaringan %s tidak diizinkan untuk instance %d", + "ORG_ZSTACK_COMPUTE_VM_10226": "Alamat MAC tidak valid [%s]", + "ORG_ZSTACK_COMPUTE_VM_10225": "Ini bukan alamat MAC yang valid [%s]", + "ORG_ZSTACK_COMPUTE_VM_10224": "Topologi CPU tidak benar. Inti CPU aktual: %s, soket dikonfigurasi: %s, inti per soket: %s, thread per inti: %s; Soket terhitung: %s, inti: %s, thread: %s", + "ORG_ZSTACK_COMPUTE_VM_10221": "vm[uuid:%s] hanya dapat melakukan fstrim ketika statusnya Running; status saat ini adalah %s", + "ORG_ZSTACK_STORAGE_VOLUME_10046": "Volume dengan UUID [%s] tidak dalam keadaan dihapus. Operasi ini dimaksudkan untuk memulihkan volume data yang sebelumnya dihapus.", + "ORG_ZSTACK_STORAGE_VOLUME_10049": "image[uuid:%s] tidak Enabled, melainkan %s", + "ORG_ZSTACK_STORAGE_VOLUME_10048": "image[uuid:%s] bukan tipe yang diharapkan, tipenya adalah %s", + "ORG_ZSTACK_STORAGE_VOLUME_10042": "volume[uuid:%s] tidak dalam keadaan enabled, status saat ini adalah %s, pembuatan snapshot tidak dimungkinkan", + "ORG_ZSTACK_STORAGE_VOLUME_10045": "volume[uuid:%s] tidak tersedia untuk pembuatan snapshot, status saat ini adalah %s", + "ORG_ZSTACK_STORAGE_VOLUME_10044": "Tidak dapat mengambil memory snapshot, VM status saat ini[%s], namun status yang diharapkan adalah [%s, %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10041": "volume[uuid:%s, type:%s], tidak dapat membuat snapshot", + "ORG_ZSTACK_LOGIN_10022": "Atribut tidak valid. Atribut[%s] diperlukan, namun ditemukan beberapa rekaman [%s] yang tidak cocok. Harap pastikan semua atribut ditentukan dan dicocokkan dengan benar.", + "ORG_ZSTACK_LOGIN_10024": "strategy adalah kolom wajib %", + "ORG_ZSTACK_LOGIN_10023": "Format JSON tidak valid untuk data konfigurasi cloud. Harap pastikan semua kolom JSON diformat dengan benar dan mematuhi skema yang ditentukan.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10007": "keyLabel %s dan encryptedResult %s tidak konsisten", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10006": "flkSec securityMachine tidak sehat: %s", + "ORG_ZSTACK_LOGIN_10029": "name harus menggunakan nilai dalam rentang parameter yang ditentukan %s", + "ORG_ZSTACK_LOGIN_10026": "atribut wajib diisi untuk provisi sumber daya cloud %", + "ORG_ZSTACK_LOGIN_10025": "name adalah kolom wajib %", + "ORG_ZSTACK_LOGIN_10028": "optional adalah kolom wajib untuk konfigurasi virtual machine%", + "ORG_ZSTACK_LOGIN_10027": "type adalah kolom wajib %", + "ORG_ZSTACK_STORAGE_VOLUME_10058": "Volume root [uuid:%s, name:%s] tidak dapat dilampirkan.", + "ORG_ZSTACK_STORAGE_VOLUME_10057": "VM [UUID:%s] tidak mendukung lampiran volume online [%s] karena tipe platform gambarnya tidak kompatibel.", + "ORG_ZSTACK_STORAGE_VOLUME_10059": "volume data [UUID:%s] dinonaktifkan; lampiran tidak diperbolehkan.", + "ORG_ZSTACK_STORAGE_VOLUME_10054": "volume data [UUID:%s] tidak dilampirkan ke mesin virtual mana pun dan karena itu tidak dapat dilepaskan.", + "ORG_ZSTACK_STORAGE_VOLUME_10053": "volume[uuid:%s] berstatus[%s], volume data hanya dapat dilampirkan ketika status tersedia atau attaching", + "ORG_ZSTACK_STORAGE_VOLUME_10056": "volume[uuid:%s, name:%s, type:%s] tidak dapat dilepaskan", + "ORG_ZSTACK_CORE_PLUGIN_10001": "plugin[%s] name, product key, dan vendor tidak boleh null", + "ORG_ZSTACK_STORAGE_VOLUME_10055": "Untuk melepaskan volume data yang dapat dibagikan dengan UUID [%s], UUID mesin virtual diperlukan.", + "ORG_ZSTACK_STORAGE_VOLUME_10050": "image[uuid:%s] tidak Ready, berada dalam status %s", + "ORG_ZSTACK_STORAGE_VOLUME_10052": "volume[uuid:%s] berstatus[%s], volume data hanya dapat dilampirkan ketika statusnya %s", + "ORG_ZSTACK_STORAGE_VOLUME_10051": "volume root [uuid:%s] tidak dapat dilampirkan ke mesin virtual", + "ORG_ZSTACK_LOGIN_10011": "Gagal memvalidasi entri DNS [%s], kemungkinan telah dihapus", + "ORG_ZSTACK_CORE_PLUGIN_10000": "nama plugin tidak diketahui untuk produk cloud: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10069": "volume[uuid:%s, type:%s] tidak dapat dihapus", + "ORG_ZSTACK_STORAGE_VOLUME_10068": "Pengaturan ukuran disk yang tidak terduga untuk mesin virtual %s. Harap pastikan ukuran disk yang ditentukan berada dalam rentang yang diizinkan dan kompatibel dengan konfigurasi lingkungan cloud Anda.", + "ORG_ZSTACK_STORAGE_VOLUME_10065": "Tidak dapat melampirkan volume ke VM, tidak ada cluster komputasi yang tersedia", + "ORG_ZSTACK_STORAGE_VOLUME_10064": "volume data dengan UUID [%s] memiliki format [%s] yang hanya dapat dipasang ke hypervisor jenis [%s], tetapi VM memiliki jenis hypervisor [%s]. Oleh karena itu, pemasangan tidak dimungkinkan.", + "ORG_ZSTACK_RESOURCECONFIG_10009": "akun tidak memiliki akses ke sumber daya[uuid: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10067": "Tidak diizinkan untuk mencadangkan volume root, uuid:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10066": "Tidak dapat melampirkan volume ke VM yang berjalan di host[uuid: %s] yang terputus dari penyimpanan volume[uuid: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10061": "volume data [UUID:%s] telah dipasang ke mesin virtual lain dan tidak dapat dipasang ulang.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_10000": "atribut[name:%s] adalah atribut yang dipesan yang tidak dapat diperbarui di lingkungan komputasi cloud.", + "ORG_ZSTACK_NETWORK_OVN_10074": "Pengendali OVN SDN [UUID: %s, Name: %s] dalam keadaan Terputus; tidak dapat menambahkan host [UUID: %s].", + "ORG_ZSTACK_STORAGE_VOLUME_10060": "Volume dengan UUID [%s] dalam keadaan dihapus; oleh karena itu, operasi tidak dapat dilakukan.", + "ORG_ZSTACK_NETWORK_OVN_10073": "gagal menambahkan logical switch[uuid:%s, name:%s] ke pengendali OVN[uuid:%s, ip:%s], karena %s", + "ORG_ZSTACK_STORAGE_VOLUME_10063": "volume data dengan UUID [%s] dengan format [%s] tidak didukung untuk dipasang ke hypervisor apa pun.", + "ORG_ZSTACK_STORAGE_VOLUME_10062": "volume data hanya dapat dipasang ketika status adalah [active, available], status saat ini adalah %s", + "ORG_ZSTACK_NETWORK_OVN_10071": "gagal menyinkronkan logical switch ke pengendali OVS[uuid:%s, ip:%s], karena %s", + "ORG_ZSTACK_LOGIN_10000": "ZStack sedang memuat organisasi LDAP dari database; Harap jangan melakukan operasi sinkronisasi pada saat ini.", + "ORG_ZSTACK_NETWORK_OVN_10078": "NfvInstance[uuid:%s] tidak ditemukan", + "ORG_ZSTACK_NETWORK_OVN_10077": "Jaringan L2 [UUID:%s] tidak terhubung ke pengendali OVN", + "ORG_ZSTACK_NETWORK_OVN_10076": "gagal menghapus logical switch port dari pengendali OVS[uuid:%s, ip:%s], karena %s", + "ORG_ZSTACK_STORAGE_VOLUME_10070": "volume[uuid:%s] sudah dalam keadaan dihapus", + "ORG_ZSTACK_LOGIN_10001": "Gagal menyinkronkan entri LDAP[], karena %s", + "ORG_ZSTACK_NETWORK_OVN_10075": "gagal menambahkan logical switch ports ke pengendali OVN[uuid:%s, ip:%s], karena %s", + "ORG_ZSTACK_V2V_10037": "host[uuid:%s] tidak terhubung", + "ORG_ZSTACK_V2V_10038": "primaryStorage[uuid:%s] tidak terhubung", + "ORG_ZSTACK_V2V_10035": "tidak dapat mengalokasikan %d byte pada host konversi[uuid:%s], kekurangan kapasitas yang tersedia", + "ORG_ZSTACK_NETWORK_OVN_10079": "NfvInstanceGroup[uuid:%s] tidak ditemukan", + "ORG_ZSTACK_LOGIN_10008": "Gagal memvalidasi UID[%s], kemungkinan karena penghapusan atau kedaluwarsa", + "ORG_ZSTACK_LOGIN_10007": "Tidak dapat menyinkronkan server LDAP/AD yang cakupannya bukan %s", + "ORG_ZSTACK_V2V_10031": "Tag Sistem QoS Tidak Valid untuk Migrasi V2V Harap periksa tag sistem dan pastikan sesuai dengan standar komputasi awan.", + "ORG_ZSTACK_V2V_10032": "bandwidth jaringan tidak valid[%s], harus lebih besar dari atau sama dengan 1048576 byte per detik", + "ORG_ZSTACK_LOGIN_10009": "Gagal membuat ID virtual IAM untuk UID[%s], karena %s", + "ORG_ZSTACK_LOGIN_10004": "gagal menyinkronkan organisasi LDAP di lingkungan awan", + "ORG_ZSTACK_BAREMETAL2_10001": "Konfigurasi Chassis IPMI Tidak Valid: Parameter 'reboot' harus diatur ke 'No' ketika parameter 'provisionIp' diberikan.", + "ORG_ZSTACK_V2V_10030": "telah terjadi migrasi VM dari host dengan hostUuid %s", + "ORG_ZSTACK_BAREMETAL2_10002": "Konfigurasi Chassis IPMI Tidak Valid: 'platform' harus ditentukan sebagai 'Linux' ketika 'provisionIp' diberikan.", + "ORG_ZSTACK_LOGIN_10006": "Gagal menyinkronkan organisasi karena %s", + "ORG_ZSTACK_LOGIN_10005": "Gagal mengubah entri LDAP menjadi node organisasi", + "ORG_ZSTACK_BAREMETAL2_10000": "Konfigurasi Chassis IPMI Tidak Valid: 'provisionType' harus diatur ke 'Direct' ketika 'provisionIp' ditentukan.", + "ORG_ZSTACK_STORAGE_VOLUME_10079": "tidak dapat melepaskan volume [%s] dari instance. mungkin sudah dilepaskan", + "ORG_ZSTACK_STORAGE_VOLUME_10076": "tidak dapat melampirkan volume[%s] ke host[%s], karena sedang dilampirkan ke host[%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10075": "Jalur mount harus berupa jalur absolut. Harap berikan jalur absolut yang valid.", + "ORG_ZSTACK_NETWORK_OVN_10080": "NfvInstanceGroup[uuid:%s] tidak memiliki IP Virtual yang dikonfigurasi", + "ORG_ZSTACK_STORAGE_VOLUME_10078": "tidak dapat melampirkan volume[%s] ke host[%s], karena volume lain menempati jalur mount[%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10077": "tidak dapat melampirkan volume [%s] ke host [%s] karena sudah ter-mount pada jalur [%s] di host [%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10072": "Tidak diizinkan mengubah status volume root, UUID: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10071": "tidak dapat menghapus volume [%s] karena dilampirkan ke host [%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10074": "tidak dapat melampirkan volume[%s] ke instance[%s], karena instance[status:%s] tidak operasional", + "ORG_ZSTACK_NETWORK_OVN_10083": "Gagal memperbarui node cluster OVN untuk Instance NFV [uuid:%s], karena %s", + "ORG_ZSTACK_STORAGE_VOLUME_10073": "tidak dapat mengubah status volume karena dilampirkan ke host %s", + "ORG_ZSTACK_NETWORK_OVN_10082": "Tidak ada instance yang ditemukan untuk konfigurasi cluster di NfvInstanceGroup[uuid:%s]", + "ORG_ZSTACK_RESOURCECONFIG_10002": "ResourceConfig [category:%s, name:%s] tidak dapat dikaitkan dengan resourceType: %s", + "ORG_ZSTACK_RESOURCECONFIG_10001": "tidak dapat menemukan resource[uuid: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10081": "tidak dapat menemukan file sumber di snapshot tree yang digunakan dari volume[uuid: %s]", + "ORG_ZSTACK_V2V_10028": "tidak dapat menemukan tipe untuk VM sumber [url:%s]", + "ORG_ZSTACK_RESOURCECONFIG_10000": "resource memiliki tipe resource yang tidak konsisten. Detail: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10080": "tidak dapat meratakan volume yang dapat dibagikan[uuid:%s]", + "ORG_ZSTACK_V2V_10029": "tidak dapat menemukan factory untuk VM sumber [url:%s, v2vType:%s]", + "ORG_ZSTACK_RESOURCECONFIG_10007": "konfigurasi global [category:%s, name:%s] tidak dapat binding ke resource", + "ORG_ZSTACK_V2V_10026": "Unable to find Network[uuid:%s] to start the current VM, it may have been deleted. Operation Suggestion: Terminate this VM and create a new one.", + "ORG_ZSTACK_RESOURCECONFIG_10006": "tidak ada konfigurasi global[category:%s, name:%s] yang ditemukan", + "ORG_ZSTACK_V2V_10024": "bukan waktu untuk instance shutdown", + "ORG_ZSTACK_V2V_10025": "conversionHost[uuid:%s, hostUuid:%s] tidak terhubung", + "ORG_ZSTACK_V2V_10022": "Ada beberapa pekerjaan v2v yang sedang berlangsung. Tidak dapat melepaskan volume[%s] dari host[%s].", + "ORG_ZSTACK_V2V_10020": "primary storage[uuid:%s] tidak aktif maupun terpasang", + "ORG_ZSTACK_V2V_10021": "Ada pekerjaan migrasi V2V yang sedang berlangsung. Pastikan tidak ada volume[%s] yang terpasang pada host[%s].", + "ORG_ZSTACK_STORAGE_VOLUME_10007": "iothread memerlukan versi QEMU >= %s, tetapi host menjalankan versi %s.", + "ORG_ZSTACK_STORAGE_VOLUME_10009": "root volume [%s] tidak dapat menetapkan pin thread I/O.", + "ORG_ZSTACK_STORAGE_VOLUME_10008": "iothread memerlukan versi libvirt minimal %s, tetapi host memiliki versi %s.", + "ORG_ZSTACK_STORAGE_VOLUME_10003": "Primary storage saat ini %s bukan tipe Ceph dan karenanya tidak dapat diakses.", + "ORG_ZSTACK_STORAGE_VOLUME_10005": "Tipe primary storage saat ini tidak mendukung volume block. Tipe yang didukung termasuk %s.", + "ORG_ZSTACK_STORAGE_VOLUME_10004": "ID path akses dan IQN untuk volume block tipe Ceph tidak boleh kosong. Pastikan keduanya accessPathId dan accessPathIqn disediakan.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10000": "Pengujian koneksi JitClientFactory gagal", + "ORG_ZSTACK_SSO_CAS_FILTER_10000": "URL tidak valid, UUID klien hilang", + "ORG_ZSTACK_SSO_CAS_FILTER_10001": "Instance klien CAS hilang, harap instantiate klien CAS sebelum integrasi SSO", + "ORG_ZSTACK_COMPUTE_VM_10275": "VM[uuid:%s] tidak dalam keadaan Running.", + "ORG_ZSTACK_CONSOLE_10011": "Agen console tidak terhubung; ini mungkin karena inisialisasi node manajemen. Harap tunggu agen console terhubung, atau hubungkan secara manual jika terputus dalam waktu lama.", + "ORG_ZSTACK_CONSOLE_10010": "vm[uuid:%s] tidak dalam keadaan %s, keadaan saat ini adalah %s", + "ORG_ZSTACK_COMPUTE_VM_10273": "gagal membuat template dari root volume[uuid:%s] pada primary storage[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10270": "Mesin virtual telah dihapus. Harap periksa console manajemen instance untuk detail.", + "ORG_ZSTACK_CONSOLE_10013": "console proxy[uuid: %s, status: %s] pada agent[ip: %s] tidak terhubung, gagal menghapusnya", + "ORG_ZSTACK_CONSOLE_10012": "tidak dapat menemukan IP host dari VM[uuid:%s], apakah VM sedang berjalan???", + "ORG_ZSTACK_COMPUTE_VM_10279": "Gagal memperbarui VM[uuid=%s] pada hypervisor: Modifikasi properti tertentu gagal", + "ORG_ZSTACK_COMPUTE_VM_10278": "Gagal memperbarui vm[uuid=%s] pada hypervisor.", + "ORG_ZSTACK_COMPUTE_VM_10277": "ISO dengan UUID [uuid:%s] berada pada backup storage yang tidak kompatibel dengan primary storage [uuid:%s] tempat VM [name:%s, uuid:%s] berada.", + "ORG_ZSTACK_COMPUTE_VM_10276": "tidak dapat memperbarui kata sandi console VM[uuid:%s], VM tidak berjalan di host manapun", + "ORG_ZSTACK_STORAGE_VOLUME_10018": "Tidak dapat mengubah ukuran volume [%s] karena dalam keadaan Disabled", + "ORG_ZSTACK_STORAGE_VOLUME_10017": "volume[uuid:%s] bukan volume data", + "ORG_ZSTACK_STORAGE_VOLUME_10019": "Minimal salah satu dari vmInstanceUuid atau instanceUuid harus ditentukan.", + "ORG_ZSTACK_STORAGE_VOLUME_10014": "tidak mendukung pengambilan snapshot volume[uuid:%s, uuid:%s] pada VM[uuid:%s, uuid:%s] yang berbeda", + "ORG_ZSTACK_STORAGE_VOLUME_10013": "volume[uuid:%s] tidak dapat ditemukan", + "ORG_ZSTACK_STORAGE_VOLUME_10016": "status vm[uuid: %s] adalah %s, pembuatan snapshot tidak diizinkan", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10013": "mesin keamanan jit tidak sehat: koneksi socket ke %s:%s gagal", + "ORG_ZSTACK_STORAGE_VOLUME_10015": "volume[uuid:%s] tidak tersedia", + "ORG_ZSTACK_STORAGE_VOLUME_10010": "ID thread I/O saat ini[%s] tidak cocok dengan ID thread I/O volume[%s] yang terpasang.", + "ORG_ZSTACK_STORAGE_VOLUME_10012": "validasi snapshot tidak didukung untuk volume[uuid: %s]. VM yang terpasang tidak berada dalam salah satu status [%s, %s].", + "ORG_ZSTACK_STORAGE_VOLUME_10011": "validasi snapshot tidak didukung untuk volume[UUID: %s]. Volume harus terpasang pada mesin virtual.", + "ORG_ZSTACK_CONSOLE_10000": "File kunci pribadi Ansible tidak ditemukan. Pastikan jalur file kunci pribadi benar dan dapat diakses.", + "ORG_ZSTACK_COMPUTE_VM_10285": "Gagal melepaskan volume [uuid=%s] dari VM [uuid=%s]", + "ORG_ZSTACK_COMPUTE_VM_10284": "Melepaskan volume tidak diizinkan ketika VM dalam status [%s]", + "ORG_ZSTACK_COMPUTE_VM_10283": "ISO[uuid:%s] tidak terpasang pada VirtualMachine[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10282": "gagal memperbarui vm[uuid=%s] pada hypervisor: Modifikasi properti tertentu gagal", + "ORG_ZSTACK_CONSOLE_10004": "Gagal menyambungkan kembali ke konsol proxy untuk mesin virtual. Periksa konektivitas jaringan dan pastikan mesin virtual berjalan.", + "ORG_ZSTACK_COMPUTE_VM_10281": "gagal memperbarui vm[uuid=%s] pada node hypervisor", + "ORG_ZSTACK_CONSOLE_10003": "gagal mengonfigurasi IP yang diabaikan konsol proxy [code:%d] atau port konsol proxy [code:%d]", + "ORG_ZSTACK_COMPUTE_VM_10280": "tidak dapat membuat mesin virtual, mesin virtual dengan nama [%s] sudah ada", + "ORG_ZSTACK_CONSOLE_10002": "Ada proses lain yang menggunakan port: %s", + "ORG_ZSTACK_CONSOLE_10001": "ID node manajemen tidak valid[%s]", + "ORG_ZSTACK_CONSOLE_10008": "tidak dapat memverifikasi ketersediaan konsol proxy karena %s", + "ORG_ZSTACK_CONSOLE_10007": "membuat koneksi VNC: URI tidak terduga: %s", + "ORG_ZSTACK_COMPUTE_VM_10288": "Satu VM tidak dapat membuat %s CD-ROM; VM hanya dapat memasang %s CD-ROM.", + "ORG_ZSTACK_CONSOLE_10009": "kesalahan operasi, karena:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10029": "Operasi ekspansi tidak diizinkan karena host dinonaktifkan. Pastikan host aktif sebelum melakukan operasi ini.", + "ORG_ZSTACK_STORAGE_VOLUME_10028": "Ukuran increment minimum untuk alokasi memori harus lebih besar dari 4 MB.", + "ORG_ZSTACK_STORAGE_VOLUME_10025": "Anda tidak dapat menetapkan batas bandwidth baca/tulis dan batas bandwidth total secara bersamaan untuk mesin virtual. Harap tentukan satu jenis batas.", + "ORG_ZSTACK_STORAGE_VOLUME_10024": "Anda tidak dapat mengonfigurasi batas IOPS baca/tulis dan batas IOPS total secara bersamaan untuk instance Anda. Harap tentukan satu jenis batas IOPS.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10023": "pengecualian tidak tertangani saat mengambil atribut dengan keamanan JIT diaktifkan: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10027": "Tidak dapat memperkecil ukuran volume[%s][uuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10026": "Bandwidth volume tidak boleh null; tentukan nilai bandwidth volume yang valid.", + "ORG_ZSTACK_STORAGE_VOLUME_10021": "volume[uuid:%s] bukan volume root", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10022": "Pengambilan atribut mesin keamanan JIT gagal, kode status: %s, detail: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10020": "Tidak ada volume dengan UUID: %s dan VM Instance UUID: %s yang dapat ditemukan", + "ORG_ZSTACK_STORAGE_VOLUME_10023": "Tidak dapat mengonfigurasi set parameter lama dan baru secara bersamaan dalam instance mesin virtual", + "ORG_ZSTACK_STORAGE_VOLUME_10022": "SharedVolume tidak mendukung pengaturan bandwidth", + "ORG_ZSTACK_COMPUTE_VM_10293": "tidak ada metode untuk menentukan ukuran image untuk %s, silakan laporkan pengecualian", + "ORG_ZSTACK_STORAGE_VOLUME_10035": "Hanya mendukung volume yang dilepas, gunakan SetVmBootVolumeMsg sebagai gantinya", + "ORG_ZSTACK_ZWATCH_PROMETHEUS_10000": "Host[uuid:%s] tidak ditemukan di database cloud", + "ORG_ZSTACK_STORAGE_VOLUME_10038": "hypervisor[%s] membatasi VM tunggal ke maksimal %s data volume; VM ini [uuid:%s] memiliki %s data volume yang terpasang", + "ORG_ZSTACK_STORAGE_VOLUME_10032": "tidak dapat menemukan image cache [Image UUID: %s] untuk inisialisasi ulang volume", + "ORG_ZSTACK_STORAGE_VOLUME_10031": "shared volume[uuid: %s] telah dipasang ke instance vm yang tidak berhenti[uuids: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10034": "volume[uuid%s] harus dipasang ke instance", + "ORG_ZSTACK_STORAGE_VOLUME_10033": "Volume [UUID: %s, nama: %s] masih digunakan dan tidak dapat dihapus. Pastikan volume dihapus sebelum mencoba menghapusnya.", + "ORG_ZSTACK_STORAGE_VOLUME_10030": "Operasi ekspansi tidak diizinkan karena status host dinonaktifkan", + "ORG_ZSTACK_LOGIN_10033": "Saat ini tidak ada server LDAP/AD yang dikonfigurasi di lingkungan Anda. Silakan konfigurasi server LDAP/AD terlebih dahulu.", + "ORG_ZSTACK_LOGIN_10032": "Tidak dapat mengikat UID LDAP %s ini ke ID pengguna virtual [uuid:%s]", + "ORG_ZSTACK_LOGIN_10034": "UID ini sudah digunakan. Silakan pilih yang lain.", + "ORG_ZSTACK_LOGIN_10030": "Atribut tidak valid. Atribut[%s] diperlukan, tetapi ditemukan beberapa catatan yang tidak cocok dalam konfigurasi mesin virtual. Pastikan semua atribut ditentukan dengan benar dan semua sumber daya mesin virtual dikonfigurasi dengan tepat.", + "ORG_ZSTACK_STORAGE_CDP_10091": "Kapasitas maksimum tidak valid[%d], utilisasi saat ini adalah %d", + "ORG_ZSTACK_STORAGE_CDP_10089": "hostname tidak ditemukan untuk backup storage[uuid: %s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10009": "fungsi kripto diaktifkan tetapi resource pool[%s] untuk login otomatis tidak dikonfigurasi", + "ORG_ZSTACK_SSO_SAML2_10001": "Metadata Identity Provider Base64 tidak valid (konten yang didekode kosong)", + "ORG_ZSTACK_SSO_SAML2_10002": "Gagal mendekode metadata Identity Provider dari encoding Base64", + "ORG_ZSTACK_SSO_SAML2_10000": "Metadata IdP tidak dikonfigurasi. Silakan berikan metadata yang valid.", + "ORG_ZSTACK_ZSV_10002": "Lepaskan volume yang dapat dibagikan atau perangkat LUN sebelum mengoperasikan grup snapshot", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10000": "tidak ada klien untuk instance keamanan[model=%s]", + "ORG_ZSTACK_ZSV_10001": "volume %s masih memiliki grup snapshot, tidak dapat menghapusnya", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10001": "tidak ada pabrik klien mesin keamanan untuk mesin keamanan[tipe=%s]", + "ORG_ZSTACK_ZSV_10000": "volume %s masih memiliki grup snapshot yang terkait dengan VM %s; oleh karena itu, tidak dapat dipasang ke VM lain", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10002": "SecurityMachineManagerImpl: SecurityMachineEncrypt gagal untuk instance %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_HTTP_10001": "Kesalahan penyimpanan template HTTP, silakan periksa konten template: %s", + "ORG_ZSTACK_STORAGE_CDP_10097": "Pekerjaan pembuatan VM telah dibatalkan. Silakan periksa parameter Anda dan coba lagi.", + "ORG_ZSTACK_STORAGE_CDP_10095": "Pembatalan pekerjaan revert: Operasi untuk mengembalikan perubahan telah dibatalkan. Pastikan semua tugas dependen selesai sebelum mencoba revert lagi.", + "ORG_ZSTACK_ACCESSKEY_10002": "[Account ID: %s, User ID: %s] bukan akun atau proyek/pengguna IAM2 yang valid", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10019": "gagal membuat koneksi ke chassis [uuid:%s], silakan verifikasi konfigurasi ipmi.", + "ORG_ZSTACK_ACCESSKEY_10001": "Jika Access Key yang ditentukan diharapkan, baik AccessKeyID dan AccessKeySecret harus diberikan secara bersamaan.", + "ORG_ZSTACK_ACCESSKEY_10004": "jumlah accessKey untuk [account ID: %s, user ID: %s] melebihi batas maksimum", + "ORG_ZSTACK_ACCESSKEY_10000": "tidak memiliki izin untuk melakukan operasi untuk [accountUuid:%s, userUuid:%s]", + "ORG_ZSTACK_TEST_10008": "Saya tidak boleh ada dalam daftar kesalahan", + "ORG_ZSTACK_TEST_10009": "Saya juga tidak boleh dicantumkan sebagai kesalahan.", + "ORG_ZSTACK_TEST_10006": "Penerapan cloud selesai, sesuai rencana.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10020": "gagal memuat informasi chassis dari file, karena: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10029": "Tugas keamanan mesin koneksi lain sedang berjalan. Silakan batalkan tugas baru dan tunggu hingga selesai.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10026": "securityMachine dinonaktifkan. Gagal mendeteksi heartbeat. Pastikan securityMachine diaktifkan dan dikonfigurasi dengan benar.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10027": "Deteksi heartbeat instance %s gagal", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10028": "Pengecualian deteksi heartbeat %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10021": "Dekripsi data[%s] atau tipe algoritma enkripsi[%s] kosong", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10022": "tipe algoritma dekripsi tidak valid: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10024": "Fungsi enkripsi tidak dapat dinonaktifkan karena setidaknya ada satu mesin virtual aman yang disinkronkan di pool sumber daya yang menyediakan layanan. Pastikan jumlah mesin virtual aman yang disinkronkan dikurangi menjadi nol sebelum menonaktifkan fungsi enkripsi.", + "ORG_ZSTACK_TEST_10004": "Saya juga tidak boleh ada dalam daftar kesalahan karena %d", + "ORG_ZSTACK_TEST_10005": "dengan sengaja %d", + "ORG_ZSTACK_SNS_SYSTEM_10002": "Sumber daya API tidak dapat dihapus", + "ORG_ZSTACK_TEST_10003": "Saya tidak boleh ada dalam daftar kesalahan %d", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10019": "tipe enkripsi tidak diketahui[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10014": "tidak dapat menemukan model untuk pool sumber daya rahasia [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10015": "status saat ini[%s] tidak memungkinkan modifikasi status manual", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10016": "Tidak dapat menonaktifkan semua VM keamanan ketika fungsi kriptografi diaktifkan. Pastikan setidaknya satu VM keamanan aktif.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10017": "Verifikasi bahwa UUID pool sumber daya dikonfigurasi untuk autentikasi.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10010": "fungsi kripto diaktifkan tetapi pool sumber daya[%s] untuk perlindungan data tidak dikonfigurasi.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10013": "periksa model[%s] tipe[%s] pengecualian ketersediaan klien dan server", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10003": "Koneksi SSH gagal terhubung. Harap periksa pengaturan instans cloud dan konfigurasi jaringan Anda.", + "ORG_ZSTACK_AI_VM_10006": "tidak dapat menemukan grup instans model layanan dengan UUID: %s, gagal menyimpan instans model layanan", + "ORG_ZSTACK_AI_VM_10007": "vm instance, config yaml, atau service yaml kosong untuk konteks penerapan model layanan: %s", + "ORG_ZSTACK_AI_VM_10008": "konteks penerapan atau mesin virtual kosong untuk instans %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10000": "tidak dapat mereplikasi %s ke %s, error: %s", + "ORG_ZSTACK_AI_VM_10009": "gagal membatalkan tugas, %s", + "ORG_ZSTACK_SNS_SYSTEM_10000": "Topik alarm sistem tidak dapat dihapus karena ada sumber daya terkait. Harap pastikan semua sumber daya bergantung telah dihapus sebelum mencoba menghapus lagi.", + "ORG_ZSTACK_AI_VM_10002": "Tidak dapat menemukan IP NIC VM dalam jaringan L3 default [UUID: %s] yang diperlukan untuk layanan model terdistribusi", + "ORG_ZSTACK_SNS_SYSTEM_10001": "hanya endpoint HTTP yang dapat berlangganan topik API; endpoint yang diberikan[tipe:%s] bukan endpoint HTTP yang valid", + "ORG_ZSTACK_AI_VM_10003": "ModelServiceSession tidak boleh kosong. Harap pastikan sesi yang valid telah dibuat untuk layanan model cloud.", + "ORG_ZSTACK_AI_VM_10004": "tidak dapat mengurai konfigurasi YAML untuk model layanan, definisi layanan: %s", + "ORG_ZSTACK_AI_VM_10000": "tidak dapat menemukan gambar [uuid: %s]", + "ORG_ZSTACK_AI_VM_10001": "tidak dapat mengambil UUID gambar dari YAML: %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10015": "Jaringan[%s] telah ditambahkan ke grup HA[%s].", + "ORG_ZSTACK_ROUTEPROTOCOL_10014": "Jaringan[%s] telah ditambahkan ke area virtual router[%s].", + "ORG_ZSTACK_ROUTEPROTOCOL_10017": "ID Router[%s] tidak unik dalam sistem cloud ini", + "ORG_ZSTACK_ROUTEPROTOCOL_10016": "ID Router[%s] tidak sesuai dengan format IPv4", + "ORG_ZSTACK_AI_VM_10011": "Tidak dapat mengambil status dari instan karena URL instan kosong. Harap berikan URL instan yang valid dan coba lagi.", + "ORG_ZSTACK_HYBRID_BACKUP_10000": "%s hanya dapat dipanggil oleh akun administratif di lingkungan cloud.", + "ORG_ZSTACK_EXTERNALSERVICE_CRONJOB_10001": "Cron daemon tidak berjalan. Harap pastikan itu dimulai dan dikonfigurasi dengan benar.", + "ORG_ZSTACK_ROUTEPROTOCOL_10003": "[%s] tidak sesuai dengan format alamat IPv4", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10030": "check-all-security-machine-token-sync gagal untuk semua mesin virtual di lingkungan cloud. Harap periksa token keamanan dan konfigurasi mesin Anda.", + "ORG_ZSTACK_ROUTEPROTOCOL_10008": "AreaId[%s] telah disediakan", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10031": "FlkSecClientFactory koneksi tes gagal", + "ORG_ZSTACK_ROUTEPROTOCOL_10009": "KeyID dan password tidak boleh kosong ketika tipe autentikasi adalah %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10027": "gagal menghasilkan token perlindungan data untuk mesin keamanan %s karena %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10029": "gagal mendapatkan hasil enkripsi untuk contoh keamanan %s karena %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10011": "Panjang password tidak boleh melebihi 8 byte ketika tipe autentikasi adalah %s.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10028": "gagal menghasilkan token HMAC untuk mesin keamanan %s karena %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10010": "password tidak boleh kosong ketika tipe autentikasi adalah %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10013": "Semua jaringan harus dikaitkan dengan router virtual [%s]", + "ORG_ZSTACK_ROUTEPROTOCOL_10012": "AreaId[%s] harus merupakan pengidentifikasi zona yang valid", + "ORG_ZSTACK_ALIYUN_IDENTITYZONE_10000": "Tidak ditemukan kredensial identitas untuk sumber daya yang diminta. Pastikan Anda telah memberikan access key dan secret key yang valid.", + "ORG_ZSTACK_STORAGE_CDP_10005": "BackupStorage[uuid: %s] telah dihapus", + "ORG_ZSTACK_STORAGE_CDP_10001": "kvmagent tidak merespons %d kali", + "ORG_ZSTACK_STORAGE_CDP_10004": "Tidak ditemukan mesin virtual untuk tugas Cloud Deployment Pipeline[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10000": "Agen KVM telah dimulai ulang. Silakan periksa apakah ini memengaruhi mesin virtual Anda.", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10011": "Jaringan VXLAN perangkat keras hanya dapat dibuat dalam kumpulan VXLAN perangkat keras.", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10010": "HANYA jaringan VXLAN perangkat keras yang dapat dibuat dalam kumpulan VXLAN perangkat keras.", + "ORG_ZSTACK_STORAGE_CDP_10016": "libvirt pada host [UUID: %s] tidak mendukung pembuatan tugas CDP. Silakan verifikasi versi libvirt.", + "ORG_ZSTACK_HYBRID_DATACENTER_10003": "Pusat Data [%s] masih melakukan sinkronisasi; silakan tunggu.", + "ORG_ZSTACK_STORAGE_CDP_10017": "qemu pada host [UUID: %s] tidak mendukung pembuatan tugas CDP. Silakan verifikasi versi qemu.", + "ORG_ZSTACK_HYBRID_DATACENTER_10002": "wilayah yang ditentukan di aliyun tidak valid, yang berisi: %s", + "ORG_ZSTACK_STORAGE_CDP_10018": "Versi QEMU yang berjalan pada VM[uuid:%s] tidak mendukung fungsi mirrorBitmap. Pastikan Anda menggunakan versi QEMU yang kompatibel.", + "ORG_ZSTACK_STORAGE_CDP_10012": "query-mirror: Host tidak ditemukan untuk VM[uuid:%s]", + "ORG_ZSTACK_AI_EVALUATION_10000": "Tidak ada grup dengan UUID: %s yang dapat ditemukan dalam database.", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10002": "gagal membuat jembatan jaringan VXLAN[%s] untuk perangkat keras[uuid:%s, type:%s, vlan:%s] pada host KVM[uuid:%s], karena %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10001": "tidak ada Pengendali Pabrik SDN untuk Jenis Pengendali SDN:%s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10000": "Tidak ada pengendali SDN untuk kumpulan VXLAN [uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10006": "tidak dapat mengonfigurasi jaringan VXLAN untuk VM dengan UUID [%s] pada host tujuan dengan UUID [%s]", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10005": "tidak dapat menemukan pengendali SDN %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10003": "gagal memeriksa jembatan[%s] untuk hardwareVxlan[uuid:%s, name:%s] pada host KVM[uuid:%s], %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10009": "kumpulan jaringan VXLAN perangkat keras harus mengonfigurasi antarmuka fisik %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10008": "kumpulan jaringan VXLAN perangkat keras tidak mendukung pembuatan jaringan L3", + "ORG_ZSTACK_HYBRID_DATACENTER_10001": "regionId [%s] telah dibuat oleh access key [%s]", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10007": "gagal memverifikasi antarmuka jaringan fisik untuk HardwareVxlanPool [uuid: %s, name: %s] pada host KVM [uuid: %s], %s", + "ORG_ZSTACK_HYBRID_DATACENTER_10000": "dcType tidak mendukung jenis [%s]", + "ORG_ZSTACK_STORAGE_CDP_10027": "string waktu tidak valid: %s, harus diformat sesuai format offset ISO, misalnya %s", + "ORG_ZSTACK_STORAGE_CDP_10023": "Instance mesin virtual saat ini sedang menjalankan tugas Continuous Data Protection (CDP). Melampirkan volume akan melebihi ukuran yang direncanakan untuk cadangan penuh. Harap sesuaikan ukuran tugas CDP dan coba lagi.", + "ORG_ZSTACK_STORAGE_CDP_10024": "VM[%s] untuk volume[%s] sedang berjalan pada Continuous Data Protection (CDP), oleh karena itu perubahan ukuran tidak dimungkinkan saat ini.", + "ORG_ZSTACK_STORAGE_CDP_10025": "Tugas CDP[uuid: %s] mengalami perubahan status abnormal, dari status lama: %s ke status baru: %s karena %s.", + "ORG_ZSTACK_STORAGE_CDP_10026": "Tugas CDP masih aktif", + "ORG_ZSTACK_STORAGE_CDP_10022": "gagal menemukan tugas CDP[uuid:%s]", + "ORG_ZSTACK_AI_EVALUATION_10001": "tidak ada instance backend yang cocok dari grup[uuid: %s, type:%s] yang ada", + "ORG_ZSTACK_AI_EVALUATION_10002": "Tidak dapat menemukan Model Service Instance Group VO menggunakan UUID grup layanan model yang diberikan. Ini menunjukkan bahwa grup layanan terkait yang menjalankan tugas evaluasi tidak dapat ditemukan. Akibatnya, tugas tetap dalam status menengah alih-alih ditandai sebagai Selesai. Tugas akan diperbarui secara otomatis menjadi 'Gagal' dan kesalahan akan didokumentasikan.", + "ORG_ZSTACK_LOGINCONTROL_10002": "Ekspresi aturan tidak valid, gagal menambahkan aturan kontrol akses: %s", + "ORG_ZSTACK_LOGINCONTROL_10005": "kunci tidak dikenali: %s", + "ORG_ZSTACK_LOGINCONTROL_10006": "hilang key:value untuk konfigurasi sumber daya %s", + "ORG_ZSTACK_PORTAL_APIMEDIATOR_10008": "resourceUuid[%s] bukan UUID yang valid. UUID yang valid (v4 disarankan) harus diformat tanpa tanda hubung dan cocok dengan regex '[0-9a-f]{8}[0-9a-f]{4}[1-5][0-9a-f]{3}[89ab][0-9a-f]{3}[0-9a-f]{12}'. Untuk informasi lebih lanjut, lihat http://en.wikipedia.org/wiki/Universally_unique_identifier.", + "ORG_ZSTACK_LOGINCONTROL_10007": "Format yang salah untuk pengaturan konfigurasi kekuatan kata sandi", + "ORG_ZSTACK_LOGINCONTROL_10008": "Nilai minimum tidak boleh lebih besar dari nilai maksimum", + "ORG_ZSTACK_STORAGE_CDP_10039": "Backup storage tidak ditemukan[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10034": "Tipe tugas yang tidak terduga[uuid: %s, type: %s] di lingkungan komputasi awan", + "ORG_ZSTACK_STORAGE_CDP_10035": "Kapasitas maksimal tidak ditemukan untuk tugas Cloud Data Protection[uuid: %s], silakan perbarui.", + "ORG_ZSTACK_STORAGE_CDP_10036": "Latensi maksimal tidak ditemukan untuk CDPSessionTask[uuid: %s], silakan perbarui.", + "ORG_ZSTACK_STORAGE_CDP_10037": "VM[uuid: %s] sudah dihentikan", + "ORG_ZSTACK_STORAGE_CDP_10031": "VM tidak dimatikan, status saat ini: %s", + "ORG_ZSTACK_STORAGE_CDP_10032": "Volume bersama[%s] masih digunakan oleh mesin virtual lain.", + "ORG_ZSTACK_STORAGE_CDP_10033": "Tugas tidak ditemukan[uuid: %s]", + "ORG_ZSTACK_LOGINCONTROL_10012": "Tidak ada pengguna tersedia dengan nama: %s, type: %s di lingkungan virtual", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10011": "Permintaan API menentukan tipe chassis IPMI, tetapi pesan yang diterima bukan dari tipe APICreateBareMetal2ChassisHardwareInfoMsg. Harap pastikan tipe pesan sesuai dengan tipe chassis yang ditentukan.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10012": "menerima informasi perangkat keras untuk chassis baremetal yang tidak diketahui[ipmi_addr:%s, ipmi_port:%d]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10010": "gagal memuat informasi chassis BareMetal2 IPMI dari file, karena: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10015": "gagal melakukan power reset chassis IPMI baremetal2[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10016": "Gagal melakukan boot IPXI jarak jauh untuk instance[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10013": "gagal menyalakan chassis IPMI baremetal2[UUID:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10014": "gagal mematikan chassis IPMI baremetal2[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10049": "VM [UUID: %s] sudah memulai tugas CDP; oleh karena itu, pekerjaan cadangan tidak dapat dibuat secara bersamaan.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10008": "Instansi Bare Metal Windows Local Disk tidak mendukung pembuatan mesin virtual secara otomatis.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10009": "tidak ada gateway baremetal2 yang dapat digunakan di cluster[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10006": "Cluster[uuid:%s] bukan lingkungan virtualisasi BareMetal2.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10007": "Cluster[uuid:%s] tidak diaktifkan.", + "ORG_ZSTACK_STORAGE_CDP_10045": "argumen wajib tidak ada: %s", + "ORG_ZSTACK_STORAGE_CDP_10046": "Waktu retensi per hari dan RP harian sejak hari tidak boleh sama. Pastikan keduanya diatur ke nilai yang berbeda.", + "ORG_ZSTACK_STORAGE_CDP_10047": "diharapkan satu UUID mesin virtual, tetapi diberikan %d", + "ORG_ZSTACK_STORAGE_CDP_10048": "sumber daya [uuid: %s] bukan instance mesin virtual", + "ORG_ZSTACK_STORAGE_CDP_10041": "Penyimpanan cadangan [UUID: %s] tidak terhubung ke lingkungan cloud. Pastikan sudah dikonfigurasi dan diintegrasikan dengan benar.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10005": "Cluster[uuid:%s] bukan konfigurasi cluster baremetal.", + "ORG_ZSTACK_STORAGE_CDP_10042": "VM [UUID: %s] sudah memiliki pekerjaan cadangan; oleh karena itu, tidak dapat memiliki tugas Continuous Data Protection (CDP) yang diaktifkan secara bersamaan.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10007": "Alamat dan Port IPMI sudah ada.", + "ORG_ZSTACK_STORAGE_CDP_10044": "Alokasi sumber daya virtual harus lebih besar dari alokasi sumber daya fisik", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10001": "Pastikan hal berikut untuk建立 koneksi ke server bare-metal: 1. Verifikasi bahwa interface IPMI aktif; 2. Konfirmasi bahwa alamat IPMI, port, nama pengguna, dan kata sandi akurat; 3. Pastikan IPMI over LAN diaktifkan di pengaturan BIOS.", + "ORG_ZSTACK_STORAGE_CDP_10040": "Penyimpanan cadangan[uuid: %s] dinonaktifkan di lingkungan cloud.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10009": "chassis baremetal dengan UUID: %s dikonfigurasi untuk menggunakan pxeserver dengan UUID: %s, tetapi permintaan DHCP sebenarnya ditangani oleh pxeserver dengan UUID: %s.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10008": "tidak ada server PXE baremetal yang dapat digunakan yang terpasang pada cluster[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10000": "Bare Metal IPMI 2 Chassis %s memiliki dua entri yang ada", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10001": "Alamat IPMI %s tidak valid", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10004": "Baremetal Chassis dengan Alamat IPMI %s dan Port %d sudah dibuat.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10005": "Cluster[uuid:%s] tidak ada.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10002": "Gagal建立 koneksi dengan node baremetal. Harap verifikasi: 1. Koneksi IPMI aktif; 2. Alamat IPMI, port, nama pengguna, dan kata sandi benar; 3. IPMI over LAN diaktifkan di pengaturan BIOS.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10003": "BareMetal2 Chassis dengan Alamat IPMI %s dan Port %d sudah dibuat.", + "ORG_ZSTACK_STORAGE_CDP_10056": "beberapa root disk ditemukan: %s", + "ORG_ZSTACK_STORAGE_CDP_10058": "Tidak ditemukan volume root untuk VM cadangan.%s", + "ORG_ZSTACK_STORAGE_CDP_10059": "volume %s termasuk dalam cadangan tetapi terlepas dari VM [UUID: %s]. Silakan pasang kembali ke VM atau hapus dari set cadangan.", + "ORG_ZSTACK_STORAGE_CDP_10053": "Tidak ditemukan tugas Cloud Drive Provisioning untuk VM[uuid: %s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10015": "Gagal menyalakan chassis baremetal secara jarak jauh[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10054": "Tugas CDP untuk VM[uuid: %s] tidak ditemukan di Backstore[uuid: %s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10018": "Gagal melakukan boot PXE instance secara jarak jauh[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10055": "recoverVm: host[uuid: %s] tidak ditemukan untuk virtualMachine[uuid: %s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10017": "Gagal melakukan power reset chassis baremetal secara jarak jauh[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10050": "tidak dapat meminta penyimpanan utama [uuid:%s] untuk kemampuan snapshot volume; lihat detail [%s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10014": "gagal menghapus baremetal chassis %s", + "ORG_ZSTACK_STORAGE_CDP_10051": "recoverVm: UUID host tidak tersedia dan host asli untuk VM[uuid: %s] tidak dapat ditemukan.", + "ORG_ZSTACK_SSHKEYPAIR_10009": "Pasangan kunci SSH [uuid:%s] tidak terpasang pada mesin virtual [uuid:%s].", + "ORG_ZSTACK_SSHKEYPAIR_10008": "Pasangan kunci SSH [uuid:%s] sudah terpasang pada mesin virtual [uuid:].", + "ORG_ZSTACK_SSHKEYPAIR_10007": "sshKeyPair[uuid:%s] sedang digunakan.", + "ORG_ZSTACK_STORAGE_CDP_10067": "tidak dapat menemukan volume root dari backup CDP %s:%d", + "ORG_ZSTACK_STORAGE_CDP_10068": "volume root tidak ditemukan dari backup CDP %s:%d", + "ORG_ZSTACK_SSHKEYPAIR_10011": "tipe sumber daya %s tidak didukung untuk pemasangan pasangan kunci SSH; tipe yang diizinkan adalah %s", + "ORG_ZSTACK_SSHKEYPAIR_10010": "vmInstance[uuid:%s] tidak dalam keadaan berjalan.", + "ORG_ZSTACK_STORAGE_CDP_10063": "Proses Penerapan Cloud VM[uuid: %s] tidak ditemukan", + "ORG_ZSTACK_STORAGE_CDP_10064": "Instans VM tidak ditemukan untuk tugas Pipeline Penerapan Cloud[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10065": "Tidak ada catatan volume yang ditemukan dari backup mesin virtual. Harap verifikasi konfigurasi VM dan pengaturan backup.", + "ORG_ZSTACK_STORAGE_CDP_10066": "beberapa disk root ditemukan dari backup CDP %s:%d", + "ORG_ZSTACK_V2V_KVM_10003": "VM UUID hilang di 'srcVmUrl'", + "ORG_ZSTACK_STORAGE_CDP_10060": "volume[uuid: %s] ukuran tidak cocok: diharapkan %d byte, menerima ukuran berbeda", + "ORG_ZSTACK_V2V_KVM_10004": "tidak ada disk root yang ditemukan untuk instance: %s", + "ORG_ZSTACK_STORAGE_CDP_10061": "mengubah ukuran volume[uuid: %s] gagal: %s", + "ORG_ZSTACK_STORAGE_CDP_10062": "volume[uuid: %s] memiliki jalur volume yang tidak terduga: %s", + "ORG_ZSTACK_V2V_KVM_10007": "gagal membersihkan host konversi KVM V2V[hostUuid:%s], karena %s", + "ORG_ZSTACK_STORAGE_CDP_10078": "tidak dapat menemukan kebijakan CDP untuk VM[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10075": "tidak ada titik pemulihan yang ditemukan dengan ID grup %d", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10018": "variabel tidak valid: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10075": "penyimpanan utama NFS [uuid:%s, name:%s] tidak dapat menemukan klaster host yang terpasang untuk melakukan operasi", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10077": "tidak ada host yang ditemukan untuk volume[uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10020": "perlu sebuah List untuk sumber daya [%s] output di sini, tetapi mendapat objek tunggal.", + "ORG_ZSTACK_ZBOX_10007": "zbox[name:%s] tidak dalam keadaan Ready, status saat ini adalah %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10025": "Beberapa tindakan tidak valid dalam konteks manajemen sumber daya cloud. Harap verifikasi parameter dan coba lagi.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10022": "sumber daya [%s] harus dikonfigurasi sebelumnya!", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10006": "host tujuan [UUID:%s] tidak memiliki kapasitas fisik yang cukup untuk penyimpanan utama [UUID:%s], karena ambang batas adalah %f sementara kapasitas fisik yang tersedia adalah %d", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10007": "Volume dengan UUID [%s] tidak berada dalam status 'Siap'; oleh karena itu, volume tersebut tidak dapat dipindahkan.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10008": "Volume data [UUID: %s, nama: %s] masih terpasang pada mesin virtual [UUID: %s]. Harap lepaskan sebelum memulai migrasi.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10009": "Volume dengan UUID %s adalah volume root dari VM dengan UUID %s. Saat ini VM berada dalam status %s. Harap hentikan VM sebelum memulai migrasi.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10002": "Volume dengan UUID [%s] sudah terpasang pada host dengan UUID [%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10003": "penyimpanan utama [UUID:%s] tidak ditemukan", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10004": "Penyimpanan utama [UUID:%s] dinonaktifkan atau migrasi dingin selama pemeliharaan tidak diizinkan.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10005": "Host tujuan dengan UUID [%s] tidak termasuk dalam penyimpanan utama lokal dengan UUID [%s] tempat volume dengan UUID [%s] berada.", + "ORG_ZSTACK_ZBOX_10001": "zbox[UUID:%s] masih digunakan; tidak dapat dikeluarkan.", + "ORG_ZSTACK_ZBOX_10002": "zbox[UUID:%s] tidak berada dalam status Ready dan karena itu tidak dapat menyinkronkan kapasitas.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10000": "Tidak ada host yang dapat menyediakan kapasitas penyimpanan yang diperlukan untuk semua volume VM [UUID:%s].", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10004": "Akun Aliyun [UUID:%s] tidak ada", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10001": "Volume dengan UUID [%s] tidak terpasang pada penyimpanan utama lokal mana pun.", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10005": "nomor telepon[%s] tidak valid, pastikan diformat sebagai +86-12345678901", + "ORG_ZSTACK_ZBOX_10005": "zbox[UUID: %s] tampaknya telah dihapus", + "ORG_ZSTACK_ZBOX_10006": "Perangkat USB [uuid:%s] telah terpasang ke VM [uuid:%s], tidak dapat ditambahkan ke Zbox.", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10000": "Template teks peristiwa SMS Aliyun tidak ditemukan. Harap pastikan template telah dikonfigurasi dengan benar dan coba lagi.", + "ORG_ZSTACK_ZBOX_10003": "hanya file dalam jalur yang dipasang [mountPath: %s] di zbox yang dapat dihapus. tetapi [%s] yang diteruskan.", + "ORG_ZSTACK_ZBOX_10004": "zbox[nama:%s] tidak berada dalam status Ready, status saat ini adalah %s", + "ORG_ZSTACK_SSHKEYPAIR_10006": "Pasangan kunci SSH %s sudah diunggah.", + "ORG_ZSTACK_SSHKEYPAIR_10005": "kesalahan operasi, karena: %s", + "ORG_ZSTACK_SSHKEYPAIR_10003": "pasangan kunci SSH [uuid:%s] tidak dapat dikaitkan dengan vm [uuid:%s] karena kunci tidak ditemukan", + "ORG_ZSTACK_SSHKEYPAIR_10002": "gagal memuat kunci publik: %s, kesalahan: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10043": "Pengujian koneksi InfoSecClientFactory gagal", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10044": "saat ini tidak mendukung pembuatan %s kumpulan sumber daya di lingkungan ini", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10041": "gagal mengekstrak nama istimewa subjek dari kunci publik: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10042": "verifikasi-semua-token-keamanan-mesin-virtual-ada gagal untuk semua mesin virtual", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10040": "gagal mengurai kunci publik terenkripsi", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10058": "penyimpanan utama NFS [uuid:%s, nama:%s] tidak dapat menemukan host yang dapat digunakan untuk membuat volume data [uuid:%s, nama:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10054": "vm[uuid:%s] tidak berada dalam status Berjalan, Dijeda, atau Dihentikan; status saat ini adalah %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10055": "penyimpanan utama dengan UUID:%s tidak terpasang pada klaster apa pun", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10050": "Penyedia backend yang dapat digunakan tidak ditemukan. Pastikan penyedia cloud yang valid dikonfigurasi dan coba lagi.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10051": "tidak ada host dalam keadaan Connected yang dimana penyimpanan utama NFS [uuid:%s, name:%s] terpasang ditemukan untuk mengembalikan volume [uuid:%s] ke snapshot [uuid:%s, name:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10052": "tidak ada host dalam status connected yang dimana penyimpanan utama NFS [uuid:%s, name:%s] terpasang ditemukan untuk mengembalikan volume [uuid:%s] ke image [uuid:%s]", + "ORG_ZSTACK_IAM2_10019": "Tidak dapat mengurai ekspresi cron. Pastikan formatnya benar sesuai spesifikasi format cron standar.", + "ORG_ZSTACK_IAM2_10018": "proyek[UUID: %s, name:%s] berada dalam keadaan %s yang tidak mengizinkan operasi[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10038": "gagal menghasilkan token perlindungan data %s untuk peralatan keamanan %s karena %s", + "ORG_ZSTACK_IAM2_10015": "Organisasi dengan UUID %s tidak dapat ditetapkan sebagai anak dari dirinya sendiri atau organisasi induk UUID %s.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10039": "gagal menghasilkan token HMAC %s untuk peralatan keamanan %s karena %s", + "ORG_ZSTACK_IAM2_10014": "Organisasi saat ini [uuid:%s] sudah tidak aktif, harap aktifkan", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10036": "generate-token gagal untuk alokasi sumber daya cloud", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10037": "gagal menghasilkan token yang diaktifkan untuk mesin keamanan %s karena %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10034": "Mengimpor kunci rahasia gagal. Pastikan kunci dikonfigurasi dengan benar dan dapat diakses di lingkungan cloud Anda.", + "ORG_ZSTACK_IAM2_10011": "ID instance virtual salah[uuid:%s], baik instance tidak ada atau kata sandi salah", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10005": "format tipe tidak valid [%s]", + "ORG_ZSTACK_IAM2_10010": "tidak ada akun yang ditemukan untuk proyek[uuid:%s, name:%s] pastikan Anda memiliki izin dan kredensial yang benar dikonfigurasi untuk lingkungan cloud Anda.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10035": "koneksi ke contoh keamanan %s gagal selama proses menghasilkan kunci pengujian karena %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10006": "hanya mendukung sumber daya Cloud, tetapi mendapat [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10032": "Gagal mengekspor kunci rahasia: %s", + "ORG_ZSTACK_IAM2_10013": "ID virtual tidak termasuk dalam proyek", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10003": "tidak dapat mendukung jenis tindakan seperti ini: %s", + "ORG_ZSTACK_IAM2_10012": "ID virtual[name:%s] dinonaktifkan karena pengaturan konfigurasi", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10030": "encryptSubjectDN tidak boleh null", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10031": "gagal mengurai amplop metadata untuk contoh cloud %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10002": "tidak dapat mendukung jenis sumber daya cloud seperti ini: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10068": "Penyimpanan utama NFS [uuid:%s, name:%s] tidak terpasang ke klaster mana pun atau tidak ada host di klaster yang terpasang yang terhubung.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10009": "tipe tidak valid: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10007": "hanya mendukung Resource atau Action, tetapi mendapat [%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10008": "Nilai default harus dalam format JSON seperti yang ditentukan oleh Tipe [%s], tetapi [%s] ditemukan.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10029": "cipherText tidak boleh null", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10027": "Gagal menemukan kunci rahasia untuk mengakses sumber daya terenkripsi. Pastikan kunci rahasia dikonfigurasi dengan benar dan memiliki izin yang diperlukan.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10028": "gagal mengurai kunci rahasia, error: %s", + "ORG_ZSTACK_IAM2_10022": "Instance virtual saat ini [ID: %s] sudah tidak berlaku, silakan aktifkan kembali.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10016": "referensi variabel dinamis tidak valid, yang harus dalam format ${variable:default}", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10024": "enkripsi HMAC file besar gagal, kode: %s, detail: %s", + "ORG_ZSTACK_IAM2_10021": "Pengguna[%s] bukan pengguna platform terdaftar", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10017": "Kata kerja yang ditentukan harus berisi '::' untuk menunjukkan namespace dan metode!", + "ORG_ZSTACK_IAM2_10024": "Kata sandi lama tidak cocok dengan kata sandi asli. Tidak dapat memperbarui kata sandi ID mesin virtual [uuid:%s].", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10014": "Format JSON tidak benar, penyebab: %s", + "ORG_ZSTACK_IAM2_10023": "hanya administrator dan instance virtual itu sendiri yang dapat melakukan pembaruan", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10015": "tidak dapat menemukan file properti resource set sebelumnya!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10012": "decoder tidak valid: %s!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10013": "Tidak ditemukan elemen root di CloudFormation template Anda, silakan periksa definisi template Anda!", + "ORG_ZSTACK_IAM2_10020": "Kuota[nama:%s] dari Akun[uuid:%s] tidak dapat diatur ke %d karena akan melebihi kuota organisasi[uuid:%s].", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10011": "tipe adalah: %s, tapi tipe yang diharapkan: %s", + "ORG_ZSTACK_PCIDEVICE_10058": "Host [%s] gagal masuk mode pemeliharaan. VM [%s] tidak dapat dimigrasikan secara otomatis karena adanya perangkat PCI.", + "ORG_ZSTACK_PCIDEVICE_10056": "gagal memulai VM[UUID:%s] karena tidak semua perangkat PCI[UUIDs:%s] ada", + "ORG_ZSTACK_PCIDEVICE_10059": "perangkat pci [uuid:%s] tidak dapat dipasang ke vm [uuid:%s] karena status tidak benar", + "ORG_ZSTACK_PCIDEVICE_10050": "silakan unmount semua perangkat GPU dari VM[%s] dan coba lagi", + "ORG_ZSTACK_PCIDEVICE_10053": "perangkat PCI yang ditentukan tidak berada di lokasi yang sama: Perangkat PCI dengan UUID [%s] berada di host dengan UUID [%s] sementara perangkat PCI lainnya dengan UUID [%s] berada di host berbeda dengan UUID [%s]", + "ORG_ZSTACK_PCIDEVICE_10052": "silakan unmount perangkat PCI lainnya dari VM[%s] dan coba lagi", + "ORG_ZSTACK_PCIDEVICE_10051": "silakan unmount semua perangkat GPU dari VM[%s] dan coba lagi", + "ORG_ZSTACK_PCIDEVICE_10068": "tidak dapat memigrasikan volume root [uuid:%s] karena memiliki perangkat PCI yang terpasang", + "ORG_ZSTACK_PCIDEVICE_10066": "tidak dapat memigrasikan VM[UUID:%s] karena perangkat PCI terpasang", + "ORG_ZSTACK_PCIDEVICE_10061": "gagal menemukan perangkat PCI yang cukup dengan spesifikasi [uuid:%s] di host tujuan [uuid:%s] untuk mesin virtual [uuid:%s]", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10003": "Tidak ada plugin backup storage yang terdaftar dengan identitas: %s", + "ORG_ZSTACK_PCIDEVICE_10065": "vm[%s] instance tidak ada; tidak dapat dipasang ke perangkat PCI[%s]", + "ORG_ZSTACK_PCIDEVICE_10064": "Tidak dapat memasang perangkat PCI [uuid:%s] ke VM [uuid:%s] karena masalah alokasi sumber daya host.", + "ORG_ZSTACK_PCIDEVICE_10063": "Perangkat PCI [%s] tidak semua tersedia untuk digunakan.", + "ORG_ZSTACK_PCIDEVICE_10062": "ada masalah dengan grup IOMMU dari perangkat PCI[uuid:%s]", + "ORG_ZSTACK_IAM2_10008": "virtualID[uuid:%s] tidak ada dalam proyek[uuid:%s]", + "ORG_ZSTACK_IAM2_10009": "project[name:%s] tidak ada", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10000": "jalur instalasi kosong dikembalikan dari driver: %s", + "ORG_ZSTACK_IAM2_10004": "gagal memuat informasi ID VirtualMachine dari file karena\\n%s", + "ORG_ZSTACK_IAM2_10003": "Ada %d masalah dengan kode.", + "ORG_ZSTACK_IAM2_10006": "gagal membangun informasi ID Virtual Machine dari file.", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10001": "%s: status kesehatan: %s", + "ORG_ZSTACK_IAM2_10005": "UUID [%s] sudah ada. Silakan coba yang lain.", + "ORG_ZSTACK_MEMORY_10000": "tidak ada data ditemukan untuk %s di host[%s]", + "ORG_ZSTACK_PCIDEVICE_10036": "tidak dapat SR-IOV memvirtualisasi perangkat PCI pada host [UUID:%s] yang terpasang ke VM", + "ORG_ZSTACK_PCIDEVICE_10035": "Perangkat PCI di host [UUID:%s] sudah divirtualisasi SRIOV.", + "ORG_ZSTACK_PCIDEVICE_10034": "tidak dapat mengaktifkan SRIOV untuk perangkat karena IOMMU dinonaktifkan pada host [UUID:%s]", + "ORG_ZSTACK_PCIDEVICE_10033": "pci device [uuid:%s] tidak tersedia", + "ORG_ZSTACK_PCIDEVICE_10039": "Perangkat PCI [UUID:%s] tidak ada atau tidak divirtualisasi SRIOV.", + "ORG_ZSTACK_PCIDEVICE_10037": "hanya %d perangkat PCI virtual yang dapat dihasilkan oleh domain %s di host[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10109": "backup storage[uuid: %s] sudah di-upgrade", + "ORG_ZSTACK_STORAGE_CDP_10104": "task[uuid:%s] telah dihentikan", + "ORG_ZSTACK_STORAGE_CDP_10105": "Tugas CDP sedang menggabungkan data; jangan lakukan operasi pengambilan.", + "ORG_ZSTACK_STORAGE_CDP_10106": "Tugas CDP[uuid:%s] melebihi pemanfaatan penyimpanan: maksimum %d GB, digunakan %d GB.", + "ORG_ZSTACK_STORAGE_CDP_10107": "Status Instance VM yang tidak terduga: %s", + "ORG_ZSTACK_STORAGE_CDP_10102": "Tugas CDP[uuid: %s] tidak memiliki mesin virtual terkait", + "ORG_ZSTACK_PCIDEVICE_10047": "pci device [uuid:%s] is not virtualized into managed devices", + "ORG_ZSTACK_PCIDEVICE_10045": "pci device [uuid:%s] cannot be virtualized by mdev specification [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_10044": "PCI device [UUID:%s] cannot be virtualized into MDEVs. Ensure it is enabled and detached.", + "ORG_ZSTACK_PCIDEVICE_10049": "The host [UUID:%s] that the PCI device [UUID:%s] is attached to is not connected.", + "ORG_ZSTACK_PCIDEVICE_10048": "PCI devices generated from [UUID:%s] still attached to VM instance", + "ORG_ZSTACK_STORAGE_CDP_10119": "unexpected task type: %s", + "ORG_ZSTACK_PCIDEVICE_10043": "cannot unassign PCI device[%s] because its virtual functions are in use.\\nDetails:\\n%s", + "ORG_ZSTACK_PCIDEVICE_10042": "cannot ungenerate PCI device[%s] as it is not a GPU or Network Interface Controller.", + "ORG_ZSTACK_PCIDEVICE_10041": "Could not ungenerate virtual PCI devices on host [uuid:%s] as they are still attached to a VM.", + "ORG_ZSTACK_PCIDEVICE_10040": "could not ungenerate pci device [uuid:%s] as the host [uuid:%s] is not connected", + "ORG_ZSTACK_STORAGE_CDP_10117": "Tugas CDP[uuid: %s] tidak ditemukan", + "ORG_ZSTACK_STORAGE_CDP_10118": "Tugas CDP[uuid: %s] status berubah secara tidak normal, status lama: %s, status baru: %s karena melebihi kuota penyimpanan, saat ini: %d, kuota: %d.", + "ORG_ZSTACK_STORAGE_CDP_10111": "Versi QEMU-img dari penyimpanan cadangan [UUID: %s] perlu ditingkatkan.", + "ORG_ZSTACK_STORAGE_CDP_10112": "Tidak ditemukan tugas Cloud Data Protection untuk VM: %s", + "ORG_ZSTACK_STORAGE_CDP_10113": "Tidak ada penyimpanan cadangan yang dikonfigurasi untuk mesin virtual: %s", + "ORG_ZSTACK_STORAGE_CDP_10114": "Tidak ditemukan CdpBackupFactory dengan tipe[%s] di lingkungan cloud", + "ORG_ZSTACK_STORAGE_CDP_10110": "Arsitektur penyimpanan cadangan [UUID: %s] tidak mendukung peningkatan tugas perlindungan data berkelanjutan", + "ORG_ZSTACK_IDENTITY_10072": "tidak dapat memperbarui Kuota[nama: %s] untuk akun[identifier: %s]", + "ORG_ZSTACK_IDENTITY_10071": "tidak dapat menemukan pemeriksa pembaruan kuota untuk kuota[uuid:%s, type:%s]", + "ORG_ZSTACK_AI_CONTAINER_10001": "pusat model dengan uuid %s tidak ditemukan di lingkungan cloud", + "ORG_ZSTACK_AI_CONTAINER_10005": "Gagal mengambil URL layanan, kemungkinan karena alamat IP layanan null. Harap verifikasi konfigurasi jaringan Kubernetes.", + "ORG_ZSTACK_AI_CONTAINER_10004": "Gagal membuat layanan Kubernetes di lingkungan cloud", + "ORG_ZSTACK_AI_CONTAINER_10003": "Gagal membuat Kubernetes Deployment untuk aplikasi %s di namespace %s karena keterbatasan atau masalah konfigurasi sumber daya komputasi cloud. Harap periksa alokasi sumber daya dan konfigurasi penerapan Anda.", + "ORG_ZSTACK_AI_CONTAINER_10009": "endpoint dengan UUID %s tidak ditemukan, tidak dapat menyinkronkan sumber daya kontainer di database", + "ORG_ZSTACK_AI_CONTAINER_10007": "Gagal menginisialisasi layanan penyimpanan di klaster Kubernetes", + "ORG_ZSTACK_AI_CONTAINER_10006": "Gagal membuat kebijakan jaringan untuk instance layanan model distribusi %s", + "ORG_ZSTACK_TAG2_10011": "sumber daya[uuid:%s] telah dikaitkan dengan %d tag dan tidak dapat menambahkan lebih banyak.", + "ORG_ZSTACK_IDENTITY_10063": "pernyataan harus memiliki kolom tindakan yang tidak kosong. Pernyataan tidak valid[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10006": "telah ada penyimpanan utama NFS dengan URL %s di zona[uuid:%s]", + "ORG_ZSTACK_IDENTITY_10062": "Pernyataan harus menentukan kolom tindakan. Pernyataan tidak valid[%s]", + "ORG_ZSTACK_IDENTITY_10061": "Pernyataan harus menetapkan nilai atau memiliki efek pada status. Pernyataan tidak valid[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10008": "Ditemukan beberapa blok CIDR yang terkait dengan antarmuka jaringan. Harap tentukan satu blok CIDR atau periksa konfigurasi jaringan Anda.", + "ORG_ZSTACK_IDENTITY_10060": "grup[nama: %s, uuid: %s] tidak dikaitkan dengan akun[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10009": "blok CIDR tidak valid: %s", + "ORG_ZSTACK_IDENTITY_10067": "Nama akun administrator tidak dapat diperbarui. Harap pastikan Anda menggunakan sintaks dan parameter yang benar untuk memodifikasi informasi akun. Untuk detail lebih lanjut, lihat dokumentasi resmi.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10002": "tidak dapat menemukan host yang terhubung di klaster untuk grup penempatan yang ditentukan [uuid: %s]", + "ORG_ZSTACK_IDENTITY_10066": "Kata sandi yang diberikan tidak cocok dengan kata sandi saat ini untuk akun [UUID: %s]. Harap pastikan keakuratan dan coba lagi.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10003": "tidak dapat menemukan host yang terhubung untuk menjalankan perintah untuk penyimpanan utama NFS [uuid:%s]", + "ORG_ZSTACK_IDENTITY_10065": "Sebuah akun sudah memiliki nama yang cocok dengan %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10004": "tidak dapat menemukan host dengan koneksi NFS yang terhubung untuk menjalankan perintah untuk penyimpanan utama NFS [uuid:%s]", + "ORG_ZSTACK_IDENTITY_10069": "akun[uuid: %s, name: %s] adalah akun standar dan tidak memiliki otoritas untuk mereset kata sandi akun lain[uuid: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10000": "Penyimpanan primer NFS [uuid:%s] tidak terpasang pada klaster komputasi manapun dan karena itu tidak dapat menghapus volume root [uuid:%s] dari mesin virtual [uuid:%s].", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10004": "hanya gambar baremetal2 dengan mode boot %s yang didukung", + "ORG_ZSTACK_IDENTITY_10068": "Hanya akun administratif yang dapat memperbarui kata sandi mereka.", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10003": "Atribut bootMode wajib diisi untuk gambar baremetal2.", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10002": "hanya template volume root dengan format raw/qcow2 yang dapat diberi tag baremetal2", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10001": "hanya satu tag sistem tipe baremetal2 yang diizinkan, tetapi %d ditemukan", + "ORG_ZSTACK_AI_CONTAINER_10012": "gagal menemukan nama pod berdasarkan ip %s", + "ORG_ZSTACK_AI_CONTAINER_10011": "Gagal mengambil alamat IP pod, tidak dapat menambahkan entri ke tabel endpoint kontainer. Pastikan pod berjalan dan dapat diakses.", + "ORG_ZSTACK_AI_CONTAINER_10010": "klaster dengan uuid %s tidak ditemukan dalam lingkungan virtualisasi", + "ORG_ZSTACK_COMPUTE_VM_NUMA_10003": "set CPU tidak valid [%s]", + "ORG_ZSTACK_AI_CONTAINER_10016": "gagal mengambil penerapan k8s %s", + "ORG_ZSTACK_AI_CONTAINER_10015": "gagal menghapus layanan Kubernetes karena %s", + "ORG_ZSTACK_TAG2_10008": "semua tipe token harus ditentukan", + "ORG_ZSTACK_AI_CONTAINER_10014": "gagal menghapus penerapan Kubernetes, karena %s", + "ORG_ZSTACK_AI_CONTAINER_10013": "gagal menambahkan label %s ke pod %s", + "ORG_ZSTACK_TAG2_10006": "Spesifikasi warna tidak valid[%s], harus berupa kode heksadesimal yang valid seperti #FF00FF", + "ORG_ZSTACK_TAG2_10007": "Dapatkan format[%s], format harus berupa name::{tokenName1}::{tokenName2} ... ::{tokenNameN} atau {tokenName1}::{tokenName2} ... ::{tokenNameN}. Nama tidak boleh mengandung '{}:'.", + "ORG_ZSTACK_AI_CONTAINER_10019": "format YAML tidak valid: %s", + "ORG_ZSTACK_TAG2_10004": "pola tag sederhana kosong atau berisi token tidak valid", + "ORG_ZSTACK_AI_CONTAINER_10018": "penerapan %s tidak memiliki informasi instance", + "ORG_ZSTACK_TAG2_10005": "UUID tag tidak valid %s, tipe tag harus berupa tipe sederhana", + "ORG_ZSTACK_AI_CONTAINER_10017": "penerapan %s tidak ada", + "ORG_ZSTACK_IDENTITY_10070": "tidak dapat menemukan Kuota[name: %s] untuk akun[uuid: %s]", + "ORG_ZSTACK_TAG2_10002": "tidak dapat memperbarui format pola tag sederhana untuk metadata sumber daya cloud", + "ORG_ZSTACK_TAG2_10003": "Ditemukan nama sumber daya duplikat. Silakan periksa dan selesaikan.", + "ORG_ZSTACK_SNS_PLATFORM_WECOM_10000": "gagal mengirim pesan ke WeCom. status: %s, body: %s", + "ORG_ZSTACK_TAG2_10000": "Pelanggaran keunikan tag: Tag tipe [%s] dengan nama [%s] sudah ada di bawah akun [%d].", + "ORG_ZSTACK_TAG2_10001": "Anda hanya dapat memperbarui ID token.", + "ORG_ZSTACK_PCIDEVICE_10072": "spesifikasi perangkat pci[uuid:%s] tidak ada", + "ORG_ZSTACK_PCIDEVICE_10071": "tipe ilegal[%s] untuk perangkat PCI, hanya tipe yang didukung yang legal", + "ORG_ZSTACK_PCIDEVICE_10070": "perangkat pci [uuid:%s] tidak ada", + "ORG_ZSTACK_PCIDEVICE_10075": "perangkat PCI [UUID:%s] tidak ada atau dinonaktifkan untuk VM [UUID:%s]", + "ORG_ZSTACK_PCIDEVICE_10073": "tipe ilegal[%s] untuk spesifikasi perangkat PCI, hanya tipe yang didukung yang legal", + "ORG_ZSTACK_AI_CONTAINER_10023": "YAML deployment Kubernetes tidak valid: %s", + "ORG_ZSTACK_AI_CONTAINER_10020": "gagal menambal deployment Kubernetes %s untuk menghentikan semua pod", + "ORG_ZSTACK_AI_CONTAINER_10025": "grup instance layanan model %s tidak ditemukan di database", + "ORG_ZSTACK_AI_CONTAINER_10024": "gagal menambal deployment k8s %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10039": "gagal membuat volume root[uuid:%s] dari gambar yang di-cache[path:%s] karena kesalahan di lingkungan virtualisasi", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10040": "originText atau certificateText tidak boleh kosong", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10036": "gagal menghapus bit[%s] pada penyimpanan utama NFS[uuid:%s], error: %s, akan membersihkan jalur instalasi, pinv.getUuid(), rsp.getError()", + "ORG_ZSTACK_NETWORK_L3_10067": "Kegagalan DNS pada jaringan Layer 3 [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10037": "gagal mengembalikan volume[uuid:%s] ke snapshot[uuid:%s] pada host KVM[uuid:%s, ip:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10038": "gagal mengembalikan volume[uuid:%s] ke gambar[uuid:%s] pada host KVM[uuid:%s, ip:%s], %s", + "ORG_ZSTACK_CRYPTO_AUTH_10020": "Tidak dapat membuat kelas untuk %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10032": "gagal memeriksa keberadaan %s pada penyimpanan utama NFS[uuid:%s], error: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10034": "tidak dapat membuat volume kosong[uuid:%s, name:%s] pada host KVM[uuid:%s, ip:%s], karena %s", + "ORG_ZSTACK_CRYPTO_AUTH_10029": "Gagal menemukan informasi sertifikat untuk mesin virtual %s. Pastikan sertifikat yang diperlukan dikonfigurasi dengan benar dan diunggah ke lingkungan cloud.", + "ORG_ZSTACK_CRYPTO_AUTH_10028": "gagal meng解析 teks biasa dalam parameter enkripsi ke objek JSON: %s", + "ORG_ZSTACK_HYGON_10006": "VM[uuid:%s] tidak ditemukan", + "ORG_ZSTACK_HYGON_10005": "Host dengan UUID %s memiliki %d mesin virtual yang berjalan dengan Fitur Keamanan Hygon enabled. Harap matikan terlebih dahulu.", + "ORG_ZSTACK_HYGON_10004": "host[uuid:%s] tidak terhubung", + "ORG_ZSTACK_HYGON_10003": "Host[UUID:%s] memerlukan parameter 'enableCgroupDeviceAcl' lebih dari 0 untuk perangkat mdev Hygon. Harap konfigurasi pengaturan ini sebelum membuat perangkat mdev.", + "ORG_ZSTACK_HYGON_10002": "Host [UUID:%s] memerlukan konfigurasi 'reconnect.host.restart.libvirtd.service' diatur ke 'true' untuk perangkat mdev Hygon. Harap konfigurasi pengaturan ini sebelum membuat perangkat mdev.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10017": "pembuatan sertifikat gagal untuk instans cloud %s", + "ORG_ZSTACK_HYGON_10000": "tidak dapat membatalkan pembuatan perangkat mdev, masih ada %d perangkat mdev yang masih terpasang ke VM pada host [uuid: %s]. Harap pastikan semua VM yang menggunakan perangkat ini dihentikan terlebih dahulu.", + "ORG_ZSTACK_NETWORK_L3_10073": "Tidak ada rute host untuk prefix[%s] pada jaringan Layer 3[uuid:%s].", + "ORG_ZSTACK_NETWORK_L3_10072": "prefix [%s] bukan CIDR jaringan IPv4 yang valid", + "ORG_ZSTACK_NETWORK_L3_10071": "sudah ada rute host untuk prefix[%s] pada jaringan L3[uuid:%s]", + "ORG_ZSTACK_HYGON_10009": "gagal mengalokasikan perangkat MDEV Hygon karena alokasi bersamaan. Harap coba lagi nanti.", + "ORG_ZSTACK_NETWORK_L3_10070": "next-hop[%s] bukan alamat IPv4 yang valid", + "ORG_ZSTACK_HYGON_10008": "perangkat Hygon IOMMU Group tidak cukup pada host[uuid:%s]. Diperlukan: %d", + "ORG_ZSTACK_HYGON_10007": "tidak dapat mengubah pengaturan Hygon Security Element saat VM[uuid:%s] dalam keadaan [%s], harap hentikan VM sebelum melakukan perubahan", + "ORG_ZSTACK_TICKET_ENTITY_10001": "operasi ditolak. tiket dalam status %s, tidak dapat melakukan operasi[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10031": "grup keamanan [%s] tidak ada", + "ORG_ZSTACK_IDENTITY_10022": "tidak dapat menemukan sumber daya[UUID:%s]; UUID sumber daya salah atau sumber daya adalah sumber daya administratif", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10049": "Tidak dapat menemukan backend yang dapat digunakan untuk alokasi sumber daya cloud. Harap pastikan layanan backend Anda dikonfigurasi dengan benar dan tersedia.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10042": "tidak ada host dalam klaster[uuid:%s] yang tersedia untuk koneksi", + "ORG_ZSTACK_IDENTITY_10026": "%s bukan endpoint API yang diakui", + "ORG_ZSTACK_IDENTITY_10025": "pengguna yang ditentukan oleh userUuid[%s] tidak termasuk dalam akun saat ini, dan akun saat ini tidak memiliki hak istimewa administratif, sehingga tidak dapat memverifikasi izin pengguna", + "ORG_ZSTACK_IDENTITY_10029": "tidak dapat menemukan akun[uuid:%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10001": "model instance keamanan[uuid:%s] tidak valid", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10037": "tipe algoritma %s tidak valid, tipe yang didukung meliputi: %s.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10002": "instance keamanan [%s] gagal memicu sinkronisasi manual, harap konfirmasi apakah instance keamanan telah menyinkronkan kunci!", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10038": "sumber daya pool[%s] yang ditentukan untuk perlindungan data tidak ada", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10000": "secretResourcePool[uuid:%s] tidak dalam keadaan yang diharapkan %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10032": "telah terjadi insiden keamanan dengan IP manajemen [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10033": "managementIp[%s] bukan alamat IPv4 yang valid", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10034": "gagal membuat koneksi ke instance keamanan %s[%s], karena %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10035": "Setelah mengaktifkan fungsi kriptografi, setidaknya satu instance keamanan harus disimpan di pool sumber daya yang sesuai.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10017": "tidak dapat membuat direktori[installUrl:%s] pada host KVM[uuid:%s, ip:%s], karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10018": "Tidak ada host dalam klaster yang terhubung atau penyimpanan primer [uuid:%s] yang dilampirkan ke klaster mana pun", + "ORG_ZSTACK_IDENTITY_10050": "toPublic disetel ke false, accountUUIDs tidak boleh kosong atau nol. Harap pastikan UUID diberikan.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10019": "gagal melakukan ping ke penyimpanan primer NFS [uuid:%s] dari host [uuid:%s], karena masalah jaringan atau ketidaktersediaan. putuskan koneksi host-ps ini.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10013": "gagal mentransfer [%s] dari penyimpanan cadangan SFTP [hostname:%s] ke penyimpanan primer NFS [uuid:%s, path:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10014": "gagal mengunggah bit dari penyimpanan primer NFS[uuid:%s, mountpoint:%s] ke penyimpanan cadangan SFTP[hostname:%s, path:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10016": "tidak dapat melampirkan penyimpanan primer[uuid:%s, name:%s] ke klaster[uuid:%s]. Host KVM dalam klaster menggunakan qemu-img dengan versi[%s]; namun, penyimpanan primer dilampirkan ke klaster lain yang memiliki host KVM menggunakan qemu-img dengan versi[%s]. Versi qemu-img lebih besar dari %s tidak kompatibel dengan yang lebih kecil dari %s, yang dapat menyebabkan operasi snapshot volume gagal. Harap hindari melampirkan penyimpanan primer ke klaster dengan distribusi Linux yang berbeda untuk mencegah ketidakcocokan versi qemu-img.", + "ORG_ZSTACK_IDENTITY_10059": "pengguna[nama: %s, uuid: %s] tidak terkait dengan akun[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10010": "Alamat IP [%s] tidak termasuk dalam blok CIDR [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10011": "Terdapat %s mesin virtual yang berjalan pada penyimpanan primer NFS, harap hentikan dan coba lagi:", + "ORG_ZSTACK_IDENTITY_10057": "kebijakan[nama: %s, uuid: %s] tidak termasuk ke dalam akun[uuid: %s]", + "ORG_ZSTACK_CRYPTO_AUTH_10009": "model pool sumber daya rahasia salah, diharapkan %s, tetapi ditemukan %s", + "ORG_ZSTACK_CRYPTO_AUTH_10008": "gagal menemukan model untuk pool sumber daya rahasia [%s]", + "ORG_ZSTACK_CRYPTO_AUTH_10006": "Operasi tidak didukung di lingkungan cloud saat ini. Pastikan instance mesin virtual Anda mendukung operasi yang diperlukan.", + "ORG_ZSTACK_IDENTITY_10041": "Tidak dapat membuat grup. Grup dengan nama yang sama sudah ada di bawah akun [UUID: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10028": "Host yang dipilih [UUID:%s] untuk migrasi penyimpanan tidak tersedia.", + "ORG_ZSTACK_CRYPTO_AUTH_10016": "Gagal membuat koneksi dengan node layanan kriptografi jarak jauh. Pastikan layanan berjalan dan konektivitas jaringan dikonfigurasi dengan benar.", + "ORG_ZSTACK_IDENTITY_10040": "accountName dan accountUuid tidak boleh keduanya kosong; setidaknya satu harus ditentukan.", + "ORG_ZSTACK_CRYPTO_AUTH_10015": "Autentikasi identitas tidak menentukan pool sumber daya untuk mengalokasikan sumber daya. Pastikan pool sumber daya diidentifikasi dan ditentukan dengan benar untuk layanan.", + "ORG_ZSTACK_IDENTITY_10045": "Tidak dapat menghapus akun administratif bawaan. Silakan gunakan akun non-bawaan untuk penghapusan.", + "ORG_ZSTACK_IDENTITY_10044": "Akun %s dilarang menghapus dirinya sendiri. Silakan hubungi administrator untuk mendapatkan bantuan.", + "ORG_ZSTACK_IDENTITY_10043": "Tidak dapat membuat akun. Akun dengan nama yang sama sudah ada.", + "ORG_ZSTACK_IDENTITY_10042": "Tidak dapat membuat pengguna. Pengguna dengan nama yang sama sudah ada di bawah akun [UUID: %s].", + "ORG_ZSTACK_IDENTITY_10049": "Semua pemeriksaan autentikasi gagal, dan daftar UUID akun yang ditentukan kosong atau tidak valid. Harap verifikasi input Anda dan pastikan UUID akun yang valid disediakan.", + "ORG_ZSTACK_IDENTITY_10048": "Sesi Anda dikaitkan dengan pengguna. Anda tidak dapat mengambil identitas pengguna lain [uuid:%s].", + "ORG_ZSTACK_IDENTITY_10047": "Sesi saat ini adalah sesi berbasis akun. Harap tentukan 'uuid' pengguna yang ingin Anda perbarui.", + "ORG_ZSTACK_IDENTITY_10046": "Hanya administrator yang dapat mengakhiri akses akun.", + "ORG_ZSTACK_CRYPTO_AUTH_10019": "Gagal mendapatkan kata sandi integritas dari database karena %s tidak menghasilkan kata sandi integritas", + "ORG_ZSTACK_VHOST_KVM_10000": "Disk vHostUser hanya mendukung mode virtio. Harap verifikasi bahwa platform gambar memiliki driver virtio yang diperlukan terinstal.", + "ORG_ZSTACK_VHOST_KVM_10001": "Disk vhost-user tidak mendukung mode virtio-scsi; harap nonaktifkan mode virtio-scsi.", + "ORG_ZSTACK_NETWORK_L3_10029": "%s bukan alamat IPv6 yang valid untuk konfigurasi sumber daya cloud", + "ORG_ZSTACK_USBDEVICE_10005": "PassThrough hanya didukung untuk penggunaan pada VM yang berjalan di lingkungan host.", + "ORG_ZSTACK_ALIYUN_ECS_10019": "Hanya pengguna administratif yang dapat menetapkan parameter [onlyZstack] ke false.", + "ORG_ZSTACK_STORAGE_BACKUP_10018": "gagal membuat gambar dari cadangan %s", + "ORG_ZSTACK_ALIYUN_ECS_10018": "Hanya instance ECS pascabayar yang mendukung penghapusan jarak jauh; jenis tagihan ECS yang ditunjukkan adalah: %s", + "ORG_ZSTACK_USBDEVICE_10002": "Jumlah perangkat USB yang dipasang ke VM telah mencapai batas. Penggunaan saat ini: %s", + "ORG_ZSTACK_ALIYUN_ECS_10017": "Hanya hapus instance ECS dengan status Berjalan atau Berhenti, status saat ini adalah %s", + "ORG_ZSTACK_NETWORK_L3_10025": "tidak dapat memperoleh IP bebas dengan start[ip:%s] karena start[ip:%s] bukan alamat IPv6 yang valid", + "ORG_ZSTACK_USBDEVICE_10009": "tidak dapat memigrasikan VM [uuid:%s] karena memiliki perangkat USB yang terpasang melalui passthrough", + "ORG_ZSTACK_STORAGE_BACKUP_10015": "tidak dapat mengalokasikan %s pada penyimpanan cadangan[uuid:%s], hanya tersedia %s", + "ORG_ZSTACK_NETWORK_L3_10024": "tidak dapat memperoleh IP gratis dengan start[ip:%s] karena start[ip:%s] bukan alamat IPv4 yang valid", + "ORG_ZSTACK_USBDEVICE_10008": "vm[%s] tidak dapat memulai karena pengalihan USB ke host belum ditetapkan", + "ORG_ZSTACK_NETWORK_L3_10023": "tidak dapat memperoleh IP gratis dengan start[ip:%s], karena l3Network[uuid:%s] dikonfigurasi untuk mode dual stack", + "ORG_ZSTACK_USBDEVICE_10007": "USB sudah terikat ke mesin virtual [UUID:%s] dan tidak dapat terikat ke VM lain.", + "ORG_ZSTACK_STORAGE_BACKUP_10013": "primary storage yang diperlukan[uuid:%s, type:%s] tidak mendukung backup storage manapun.", + "ORG_ZSTACK_NETWORK_L3_10022": "ipRangeUuid dan l3NetworkUuid tidak boleh keduanya null; setidaknya satu harus ditetapkan.", + "ORG_ZSTACK_USBDEVICE_10006": "tidak dapat melampirkan perangkat USB [uuid:%s] ke VM [uuid:%s], kemungkinan alasan meliputi: perangkat tidak diaktifkan atau telah dipasang ke VM lain, atau perangkat dan VM tidak berada di host yang sama.", + "ORG_ZSTACK_ALIYUN_ECS_10015": "Gambar telah dihapus! Pastikan gambar telah dihentikan dengan benar dan semua sumber daya dibebaskan sebelum penghapusan.", + "ORG_ZSTACK_ALIYUN_ECS_10014": "gambar ecs ada secara remote, nama: %s, waktu pembuatan: %s", + "ORG_ZSTACK_ALIYUN_ECS_10013": "Gambar ECS ada secara remote dan lokal, UUID gambar ECS: %s, nama: %s, waktu pembuatan: %s", + "ORG_ZSTACK_NETWORK_L3_10032": "Pool alamat IPv6 tidak didukung; oleh karena itu, penambahan rentang IP tidak dimungkinkan. Pastikan konfigurasi jaringan Anda mendukung IPv6 sebelum melanjutkan.", + "ORG_ZSTACK_STORAGE_BACKUP_10011": "hanya satu tag sistem jaringan data backup storage yang diperbolehkan, tetapi %s diperoleh", + "ORG_ZSTACK_NETWORK_L3_10030": "[startIp %s, endIp %s, prefixLen %d, gateway %s] bukan rentang IPv6 yang valid untuk konfigurasi jaringan cloud.", + "ORG_ZSTACK_STORAGE_BACKUP_10010": "Reservasi kapasitas pada semua node backup storage gagal. Silakan periksa ketersediaan sumber daya backup storage Anda.", + "ORG_ZSTACK_USBDEVICE_10016": "Anda dapat memasang maksimal %s perangkat USB 3.0 ke satu instance mesin virtual.", + "ORG_ZSTACK_USBDEVICE_10015": "Anda dapat memasang maksimal %s perangkat USB 2.0 ke satu instance VM.", + "ORG_ZSTACK_NETWORK_L3_10038": "CIDR jaringan baru [%s] berbeda dari CIDR jaringan lama [%s]", + "ORG_ZSTACK_USBDEVICE_10014": "Anda dapat memasang maksimal %s perangkat USB 1.0 ke satu instance VM.", + "ORG_ZSTACK_NETWORK_L3_10037": "rentang IP baru [startIP:%s, endIP:%s] tumpang tindih dengan rentang IP yang ada [startIP:%s, endIP:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10028": "backup volume [uuid:%s] tidak ditemukan dalam volume penyimpanan [uuid:%s]", + "ORG_ZSTACK_NETWORK_L3_10036": "panjang prefix ipv6 harus %d untuk Stateless-DHCP atau SLAAC", + "ORG_ZSTACK_NETWORK_L3_10035": "addressMode[%s] berbeda dari address mode L3Network[%s]", + "ORG_ZSTACK_USBDEVICE_10019": "Perangkat USB [UUID:%s] tidak dalam keadaan dapat dipasang sebesar %s", + "ORG_ZSTACK_NETWORK_L3_10034": "Jaringan sistem saat ini tidak mendukung IPv6, oleh karena itu penambahan rentang IP tidak didukung saat ini. Pastikan konfigurasi jaringan Anda mendukung IPv6 sebelum mencoba operasi ini.", + "ORG_ZSTACK_USBDEVICE_10018": "Perangkat USB [UUID:%s] sudah dipasang ke mesin virtual lain [UUID:%s].", + "ORG_ZSTACK_NETWORK_L3_10033": "panjang prefix rentang IP berada di luar rentang valid [%d - %d]", + "ORG_ZSTACK_USBDEVICE_10017": "Perangkat USB [UUID: %s] sudah dipasang ke VM yang sama [UUID: %s].", + "ORG_ZSTACK_STORAGE_BACKUP_10024": "Backup volume [uuid:%s] tidak ditemukan pada node penyimpanan [uuid:%s]", + "ORG_ZSTACK_ALIYUN_ECS_10022": "IP privat ada di VSwitch: %s, dialokasikan ke ECS: %s", + "ORG_ZSTACK_ALIYUN_ECS_10021": "%s tidak dalam rentang CIDR: %s", + "ORG_ZSTACK_ALIYUN_ECS_10020": "Alamat IP Tersedia untuk vSwitch Tidak Mencukupi, Saat Ini (%d)", + "ORG_ZSTACK_USBDEVICE_10012": "tidak dapat memigrasikan VM [uuid:%s] karena memiliki perangkat PCI yang terpasang", + "ORG_ZSTACK_ALIYUN_ECS_10027": "Penawaran instance atau jenis instance harus ditentukan!", + "ORG_ZSTACK_USBDEVICE_10011": "tidak dapat memigrasikan volume root [uuid:%s] karena terdapat perangkat penyimpanan yang terpasang", + "ORG_ZSTACK_ALIYUN_ECS_10026": "%s bukan jenis volume yang valid, jenis yang valid adalah [%s]", + "ORG_ZSTACK_ALIYUN_ECS_10025": "%s bukan alamat IPv4 yang valid", + "ORG_ZSTACK_ALIYUN_ECS_10024": "bandwidth harus ditentukan saat mengalokasikan alamat IP publik", + "ORG_ZSTACK_NETWORK_L3_10043": "%s bukan masker CIDR jaringan yang valid", + "ORG_ZSTACK_STORAGE_BACKUP_10023": "Salah satu penyimpanan backup [UUID: %s] berada dalam keadaan %s, oleh karena itu tidak dapat melakukan operasi sinkronisasi.", + "ORG_ZSTACK_NETWORK_L3_10042": "gateway[gatewayId] tidak berada dalam subnet subnetId", + "ORG_ZSTACK_STORAGE_BACKUP_10022": "Tidak ditemukan Pabrik Backup Volume dengan jenis[%s]", + "ORG_ZSTACK_NETWORK_L3_10041": "%s bukan CIDR jaringan yang valid karena tidak berisi alamat IP yang dapat digunakan", + "ORG_ZSTACK_STORAGE_BACKUP_10021": "VM Saat Ini[UUID: %s] dari volume backup bukan lagi VM[UUID: %s] yang digunakan untuk backup.", + "ORG_ZSTACK_STORAGE_BACKUP_10020": "sinkronisasi file metadata backup volume di penyimpanan gambar[uuid:%s] mengalami kesalahan I/O: %s", + "ORG_ZSTACK_NETWORK_L3_10049": "jaringan l3 [uuid %s: nama %s] bukan jaringan publik; oleh karena itu rentang kumpulan alamat tidak dapat ditambahkan.", + "ORG_ZSTACK_NETWORK_L3_10047": "bukan kombinasi yang valid dari sistem dan kategori, hanya platform komputasi cloud tertentu yang valid", + "ORG_ZSTACK_NETWORK_L3_10046": "%s bukan nama domain FQDN yang valid", + "ORG_ZSTACK_NETWORK_L3_10045": "jenis jaringan l3[%s] tidak didukung", + "ORG_ZSTACK_NETWORK_L3_10044": "ipRangeUuids, L3NetworkUuids, dan zoneUuids masing-masing harus berisi setidaknya satu daftar non-kosong, atau semua nilai harus disetel ke true.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10023": "tidak dapat melampirkan aturan penerusan port dengan CIDR yang diizinkan karena vmNic[uuid:%s] sudah memiliki aturan yang tumpang tindih dengan rentang port privat target[%s, %s] dan memiliki jenis protokol yang sama[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10024": "tidak dapat melampirkan aturan penerusan port karena vmNic [uuid:%s] sudah memiliki aturan yang bertentangan yang tumpang tindih dengan rentang port privat target [%s, %s], dan berbagi jenis protokol yang sama [%s].", + "ORG_ZSTACK_SNMP_10010": "Gagal %s agen SNMP karena kata sandi privasi tidak boleh kosong.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10021": "VMNic [UUID:%s] sudah memiliki aturan penerusan port dengan VIP yang berbeda dari [UUID:%s].", + "ORG_ZSTACK_ALIYUN_NAS_CORE_10000": "Penyimpanan Utama [%s] masih operasional; oleh karena itu penghapusan grup akses tidak dimungkinkan.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10022": "UUID vmNic[%s] tidak diizinkan untuk menambahkan penerusan port dengan aturan CIDR yang diizinkan karena sudah memiliki IP publik yang terkait.", + "ORG_ZSTACK_NETWORK_L3_10054": "Alokasi IP tidak boleh berisi alamat jaringan atau alamat broadcast. Harap pastikan IP yang disediakan adalah alamat host yang valid dalam subnet.", + "ORG_ZSTACK_NETWORK_L3_10053": "gateway[gatewayId] tidak berada dalam subnet subnetId/cidrBlock", + "ORG_ZSTACK_NETWORK_L3_10052": "Rentang IP [%s ~ %s] mencakup alamat link-local, yang dipesan untuk virtualisasi dan tidak boleh digunakan.", + "ORG_ZSTACK_NETWORK_L3_10051": "Rentang IP [%s ~ %s] berisi alamat Kelas E, yang dipesan.", + "ORG_ZSTACK_NETWORK_L3_10050": "Rentang IP [%s ~ %s] mencakup alamat Kelas D, yang dipesan untuk komunikasi multicast.", + "ORG_ZSTACK_STORAGE_BACKUP_10008": "setelah mengurangi kapasitas cadangan, tidak ada penyimpanan cadangan yang tersedia dengan kapasitas yang diperlukan[%s bytes]", + "ORG_ZSTACK_STORAGE_BACKUP_10006": "penyimpanan cadangan [UUID:%s] telah dikaitkan dengan zona [UUID:%s]", + "ORG_ZSTACK_NETWORK_L3_10059": "alamat IP awal [%s] berada setelah alamat IP akhir [%s]", + "ORG_ZSTACK_ALIYUN_ECS_10006": "dekode url gagal: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10005": "penyimpanan cadangan dengan UUID:%s belum dilampirkan ke zona dengan UUID:%s", + "ORG_ZSTACK_NETWORK_L3_10058": "netmask[%s] bukan netmask yang valid dan harus ditentukan untuk menghindari netmask rentang IP tidak valid 0.0.0.0.", + "ORG_ZSTACK_STORAGE_BACKUP_10004": "zoneUuids dan backupStorageUuids keduanya harus memiliki setidaknya satu daftar non-kosong, atau keduanya diatur ke true.", + "ORG_ZSTACK_NETWORK_L3_10057": "gateway[%s] bukan alamat IPv4 yang valid", + "ORG_ZSTACK_STORAGE_BACKUP_10003": "%s tidak boleh null dalam konfigurasi mesin virtual", + "ORG_ZSTACK_NETWORK_L3_10056": "IP akhir[%s] bukan alamat IPv4 yang valid", + "ORG_ZSTACK_NETWORK_L3_10055": "IP awal[%s] bukan alamat IPv4 yang valid", + "ORG_ZSTACK_CORE_SALT_10000": "SCP tidak ditemukan dalam sistem[%s], tidak dapat membuat konfigurasi salt.", + "ORG_ZSTACK_ALIYUN_ECS_10004": "tidak ditemukan disk sistem untuk instance: [%s], id instance adalah: [%s]", + "ORG_ZSTACK_CORE_SALT_10003": "gagal menjalankan salt state[%s] pada instance[%s], gagal setelah %s percobaan", + "ORG_ZSTACK_ALIYUN_ECS_10003": "zona ketersediaan ini [%s] tidak dapat mendukung jenis instance [%s] saat ini, silakan pilih jenis instance atau zona ketersediaan lainnya.", + "ORG_ZSTACK_ALIYUN_ECS_10002": "Tidak ada jenis instance yang tersedia saat ini. Silakan periksa kembali nanti atau ubah spesifikasi Anda.", + "ORG_ZSTACK_SNMP_10000": "pembuatan agen SNMP gagal karena sudah ada satu.", + "ORG_ZSTACK_SNMP_10001": "Gagal mengakhiri layanan agen SNMP, pastikan instance agen SNMP dibuat terlebih dahulu.", + "ORG_ZSTACK_NETWORK_L3_10065": "Menambahkan rentang IP normal memerlukan penentuan alamat IP gateway.", + "ORG_ZSTACK_SNMP_10002": "Gagal mengkonfigurasi agen SNMP. Pastikan agen SNMP dibuat terlebih dahulu.", + "ORG_ZSTACK_NETWORK_L3_10064": "gateway rentang IP yang baru ditambahkan %s berbeda dari gateway yang ada %s", + "ORG_ZSTACK_SNMP_10003": "Gagal memulai agen SNMP, silakan buat agen SNMP terlebih dahulu.", + "ORG_ZSTACK_NETWORK_L3_10063": "gateway[%s] tidak boleh menjadi bagian dari rentang[%s, %s]", + "ORG_ZSTACK_SNMP_10004": "Gagal %s agen SNMP karena readCommunity tidak boleh kosong ketika versi adalah v2c", + "ORG_ZSTACK_NETWORK_L3_10062": "endpoint [%s] tidak berada dalam subnet %s/%d", + "ORG_ZSTACK_SNMP_10005": "Gagal %s agen SNMP karena userName tidak boleh kosong ketika versi adalah v3", + "ORG_ZSTACK_NETWORK_L3_10061": "beberapa blok CIDR tidak diizinkan pada jaringan L3 yang sama. Rentang IP yang ada [uuid:%s, CIDR:%s] sudah ada; oleh karena itu, blok CIDR baru [%s] tidak valid.", + "ORG_ZSTACK_SNMP_10006": "Gagal %s agen SNMP, algoritma autentikasi tidak boleh null ketika kata sandi tidak diberikan.", + "ORG_ZSTACK_NETWORK_L3_10060": "tumpang tindih dengan rentang IP[uuid:%s, start_ip:%s, end_ip: %s]", + "ORG_ZSTACK_SNMP_10007": "Gagal %s agen SNMP karena kata sandi autentikasi kosong.", + "ORG_ZSTACK_SNMP_10008": "Gagal %s agen SNMP karena konfigurasi enkripsi data memerlukan verifikasi pengguna untuk diatur terlebih dahulu.", + "ORG_ZSTACK_XINFINI_10019": "gagal mengambil detail node %s, verifikasi konfigurasi alamat IP dan peran", + "ORG_ZSTACK_XINFINI_10018": "Tidak ditemukan node mesin virtual", + "ORG_ZSTACK_XINFINI_10017": "Tidak ditemukan instance mesin virtual yang terhubung. Pastikan node terhubung dengan benar dan coba lagi.", + "ORG_ZSTACK_XINFINI_10016": "protokol[%s] tidak didukung untuk koneksi aktif", + "ORG_ZSTACK_XINFINI_10015": "tidak didukung untuk mendapatkan informasi volume dari [%s]", + "ORG_ZSTACK_XINFINI_10014": "protokol penyimpanan[%s] tidak didukung", + "ORG_ZSTACK_XINFINI_10013": "protokol[%s] tidak didukung untuk deaktivasi", + "ORG_ZSTACK_XINFINI_10012": "tidak dapat mengambil detail volume [%s], kemungkinan karena penghapusan", + "ORG_ZSTACK_XINFINI_10010": "konfigurasi kosong, tidak dapat menemukan instance xinfini", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10021": "IP %s yang diperlukan telah dialokasikan ke instance lain", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10022": "requiredIp %s berada di luar rentang DHCP %s ~ %s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10020": "gagal mengalokasikan IP dari jaringan provisi Baremetal2[uuid:%s]", + "ORG_ZSTACK_XINFINI_10009": "menghapus klien iscsi gagal %s", + "ORG_ZSTACK_XINFINI_10008": "menghapus pemetaan grup klien volume gagal %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10002": "Ada instance BM yang menggunakan alamat IP yang dialokasikan dari L2[uuid:%s].", + "ORG_ZSTACK_XINFINI_10007": "menghapus snapshot volume gagal %s", + "ORG_ZSTACK_XINFINI_10006": "snapshot [id:%s, name:%s] memiliki %d volume yang dikloning, nama volume: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10004": "Ada instance BM yang menggunakan alamat IP yang dialokasikan dari rentang IP [uuid:%s].", + "ORG_ZSTACK_XINFINI_10005": "menghapus volume gagal karena %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10003": "Ada instance BM yang menggunakan alamat IP yang dialokasikan dari jaringan L3 [UUID:%s].", + "ORG_ZSTACK_XINFINI_10004": "menghapus bdev gagal %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10006": "Gagal menyalakan server baremetal[uuid:%s] secara jarak jauh %s", + "ORG_ZSTACK_XINFINI_10003": "bdc dengan ip %s tidak ditemukan di lingkungan cloud.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10005": "gagal mengalokasikan server PXE baremetal, pastikan ada server PXE dengan kapasitas yang cukup yang terhubung ke klaster[uuid:%s]", + "ORG_ZSTACK_XINFINI_10002": "permintaan xinfini gagal, pesan: %s.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10008": "Chassis baremetal [uuid:%s] tidak ada", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10009": "jaringan provisi baremetal2 dengan UUID: %s sudah terhubung ke klaster dengan UUID: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10007": "Gagal mematikan chassis baremetal[uuid:%s] secara jarak jauh", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10008": "gagal melepas perangkat yang dikelola secara hot-unplug dari mesin virtual yang berjalan, karena:%s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10010": "tidak dapat menghubungkan jaringan provisi Baremetal2 [uuid:%s] ke klaster [uuid:%s] karena sudah memiliki jaringan yang dikonfigurasi", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10011": "tidak dapat menghubungkan jaringan provisi BareMetal2 ke klaster karena keduanya tidak berada di zona ketersediaan yang sama", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10007": "vm[uuid:%s] tidak dapat dimulai pada host yang memiliki perangkat mdev[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10004": "gagal menghubungkan perangkat mdev secara dinamis ke vm yang berjalan, karena:%s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10002": "perangkat mdev dengan UUID:%s tidak dapat terhubung ke VM dengan UUID:%s karena status tidak benar", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10003": "perangkat mdev [%s] tidak tersedia di lingkungan virtualisasi", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10000": "Host [%s] gagal memasuki mode pemeliharaan karena VM [%s] memiliki perangkat MDEV yang terhubung dan tidak dapat dimigrasikan secara otomatis", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10018": "gagal memperbarui jaringan yang diprovisikan[uuid:%s] di gateway[uuid:%s]: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10009": "Chassis baremetal [UUID:%s] tidak diaktifkan atau tersedia. Silakan pilih yang lain.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10001": "perangkat pci [uuid:%s] diketahui sebagai mdev namun spesifikasinya tidak dapat ditemukan, sehingga proses dibatalkan", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10016": "tidak semua jaringan provisi baremetal2 ada di %s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10014": "tidak dapat melepaskan jaringan provisi baremetal2 [uuid:%s] karena ada instance yang berjalan bergantung padanya", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10015": "networkUuids adalah daftar kosong", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10012": "tidak dapat menghubungkan jaringan provisi BareMetal2 ke klaster karena setiap gateway yang terhubung ke klaster dengan jaringan provisi yang sama harus diverifikasi. Pastikan semua gateway yang relevan konsisten sebelum melanjutkan.", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10013": "jaringan yang diprovisikan tidak boleh memiliki nama antarmuka yang sama dengan jaringan l2 yang sudah terhubung ke klaster", + "ORG_ZSTACK_NETWORK_L3_10006": "tidak dapat memesan rentang IP karena tidak ada subnet IPv4 yang tersedia", + "ORG_ZSTACK_NETWORK_L3_10005": "tidak dapat memesan rentang IP karena IP akhir [%s] lebih kecil dari IP awal [%s]", + "ORG_ZSTACK_NETWORK_L3_10004": "tidak dapat memesan rentang IP karena IP akhir[%s] bukan alamat IPv6 yang valid", + "ORG_ZSTACK_NETWORK_L3_10003": "tidak dapat memesan rentang IP karena IP akhir[%s] bukan alamat IPv4 yang valid", + "ORG_ZSTACK_NETWORK_L3_10002": "tidak dapat memesan rentang IP karena alamat IP awal [%s] tidak valid", + "ORG_ZSTACK_NETWORK_L3_10000": "dapat menghapus alamat IP karena digunakan oleh Kontroler Antarmuka Jaringan VM [UUID:%s]", + "ORG_ZSTACK_NETWORK_L3_10009": "tidak dapat memesan rentang IP karena tidak ada subnet IPv6 yang tersedia. Periksa konfigurasi jaringan Anda atau coba pesan subnet IPv4 sebagai gantinya.", + "ORG_ZSTACK_KVM_10001": "gagal memuat informasi host dari file karena\\n%s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10019": "perangkat mdev dengan UUID: %s tidak terhubung ke VM dengan UUID: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10017": "VM[UUID:%s] yang memiliki perangkat SE-MDEV tidak dapat terhubung lebih banyak SE-MDEV[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10018": "IOMMU dari host [uuid:%s] yang mengelola perangkat pci [uuid:%s] tidak dikonfigurasi sebagai [%s] atau [%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10015": "vm[uuid:%s] memiliki perangkat mdev yang terhubung berada di host yang berbeda dari perangkat mdev[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10014": "vm[uuid:%s] memiliki perangkat pci yang terhubung berada di host yang berbeda dari perangkat mdev[uuid:%s]", + "ORG_ZSTACK_NETWORK_L3_10010": "tidak dapat memesan rentang IP karena IP yang dipesan tidak berada dalam rentang IP yang ditentukan[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10011": "Tidak dapat mengubah status perangkat mdev yang saat ini terhubung ke mesin virtual. Lepaskan perangkat sebelum melakukan perubahan.", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10007": "tidak dapat menghapus jaringan provisi BareMetal2 [uuid:%s] ketika instance bergantung padanya", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10012": "tidak dapat memasang perangkat mdev [uuid:%s] ke VM, pastikan perangkat diaktifkan dan tidak terpasang", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10008": "tidak dapat memasang jaringan provisi BareMetal2 ke cluster non-BareMetal2", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10005": "netmask rentang DHCP jaringan provisi baremetal2 %s tidak valid", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10006": "IP mulai %s dan IP berhenti %s jaringan provisi baremetal2 tidak termasuk dalam subnet mask yang sama", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10003": "tidak dapat memperbarui konfigurasi DHCP jaringan yang diprovisikan BareMetal2 [uuid:%s] ketika instance bergantung padanya", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10002": "sudah ada jaringan provisi baremetal2 dengan interface DHCP %s, dengan konfigurasi berikut: IP awal %s, IP akhir %s, netmask %s, dan gateway %s", + "ORG_ZSTACK_NETWORK_L3_10018": "tidak ada rentang IP yang ditentukan untuk layer 3[%s]", + "ORG_ZSTACK_NETWORK_L3_10015": "Anda harus memperbarui baik sistem maupun kategori dalam konfigurasi cloud Anda", + "ORG_ZSTACK_XINFINI_10027": "Fitur untuk membatalkan ekspor NVMeOF saat ini tidak didukung", + "ORG_ZSTACK_NETWORK_L3_10014": "Tidak dapat menghapus rentang IP standar terakhir karena masih ada pool alamat yang ada", + "ORG_ZSTACK_XINFINI_10026": "tidak ada gateway aktif yang ditemukan untuk klien[%s]", + "ORG_ZSTACK_NETWORK_L3_10013": "tidak dapat mengatur mtu karena jaringan l2[uuid:%s] dari jaringan l3 [uuid:%s] memiliki nilai mtu yang melebihi batas jaringan novlan", + "ORG_ZSTACK_XINFINI_10025": "ekspor NVMe over Fabrics (OF) saat ini tidak didukung", + "ORG_ZSTACK_XINFINI_10024": "xinfini hanya mendukung pengaturan tingkat QoS total", + "ORG_ZSTACK_NETWORK_L3_10011": "tidak dapat memesan rentang IP karena rentang baru tumpang tindih dengan rentang yang ada [%s:%s]", + "ORG_ZSTACK_XINFINI_10023": "Tidak ada pool yang tersedia dengan ruang[%d] dan status sehat yang cukup", + "ORG_ZSTACK_XINFINI_10021": "gagal mendapatkan detail mesin virtual pool[id:%d, name:%s]", + "ORG_ZSTACK_XINFINI_10020": "Tidak ditemukan pool sumber daya komputasi. Pastikan pool telah dibuat dan tersedia untuk digunakan", + "ORG_ZSTACK_KVM_10010": "host [UUID: %s] tidak memiliki detail model CPU. Silakan hubungkan kembali host untuk menyelesaikan ini", + "ORG_ZSTACK_KVM_10011": "alasan untuk memaksa jalankan harus ditentukan", + "ORG_ZSTACK_NETWORK_L3_10019": "ip[%s] tidak berada dalam rentang cidr dari pool ip[uuid:%s, cidr:%s] yang terkait dengan jaringan l3[%s]", + "ORG_ZSTACK_KVM_10012": "host[uuid:%s] telah dihentikan", + "ORG_ZSTACK_KVM_10002": "Sistem operasi [OS] dari host [hostname:%s, IP:%s] tidak valid", + "ORG_ZSTACK_KVM_10003": "cluster[uuid:%s] sudah memiliki host dengan versi OS [%s], tetapi host yang baru ditambahkan [name:%s ip:%s] memiliki versi OS yang berbeda [%s]", + "ORG_ZSTACK_KVM_10004": "vm[uuid:%s] rusak karena kegagalan kernel", + "ORG_ZSTACK_KVM_10005": "host[uuid: %s] kesalahan memori ECC dipicu, detail: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10029": "perangkat terkelola yang ditentukan tidak berada di host yang sama: perangkat terkelola[uuid: %s] pada host[uuid: %s] sementara perangkat terkelola[uuid: %s] pada host[uuid: %s]", + "ORG_ZSTACK_KVM_10006": "Masih ada host yang tidak memiliki arsitektur CPU yang sama, detail: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10026": "Tidak dapat menghapus perangkat mdev ketika terpasang ke instance mesin virtual. Silakan lepaskan perangkat sebelum menghapus", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10027": "gagal memulai VM[UUID:%s] karena tidak semua spesifikasi MDEV[UUIDs:%s] ada", + "ORG_ZSTACK_KVM_10008": "ID PCI Bridge harus bernilai lebih dari 0 dan kurang dari 32", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10024": "tidak dapat memasang perangkat terkelola ke instans mesin virtual yang tidak dalam keadaan berhenti", + "ORG_ZSTACK_KVM_10009": "keadaan vm saat ini[%s], memodifikasi virtioSCSI memerlukan vm dalam keadaan[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10025": "tipe perangkat mdev ilegal [%s], hanya perangkat virtual yang legal", + "ORG_ZSTACK_NETWORK_L3_10021": "ID Cloud Instance tidak valid[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10022": "UUID cluster, UUID host, atau UUID VM tidak dapat disetel secara bersamaan.%s", + "ORG_ZSTACK_NETWORK_L3_10020": "ip[%s] dalam rentang IP[uuid:%s, startIp:%s, endIp:%s] yang terkait dengan jaringan L3[%s], ini tidak diizinkan", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10023": "Cluster tidak ada atau dinonaktifkan. Pastikan cluster telah dibuat dan diaktifkan dengan benar.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10020": "host dengan UUID [%s] yang memiliki perangkat mdev dengan UUID [%s] tidak cocok dengan [%s] atau [%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10021": "Tidak dapat melepas perangkat mdev dari instans VM ketika tidak dalam keadaan berhenti. Pastikan instans VM dihentikan sebelum melepas perangkat mdev.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10053": "Tidak ada Virtual Private Cloud (VPC) yang dikonfigurasi pada Pengontrol SDN [IP:%s].", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10054": "Tag sistem untuk ID VPC wajib diisi. Harap berikan nilai yang valid.", + "ORG_ZSTACK_MACVLAN_10002": "gagal memeriksa antarmuka VLAN[%s] untuk jaringan L2VLAN[uuid:%s, name:%s] pada host KVM[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10051": "tidak ada sakelar yang dikonfigurasi pada pengontrol sdn [ip:%s]", + "ORG_ZSTACK_MACVLAN_10005": "tidak dapat melampirkan layanan jaringan ke jaringan L3 [uuid:%s], karena jaringan L2 [uuid:%s, vSwitchType:%s] tidak mendukung layanan jaringan L3 apa pun untuk jaringan L3 dasar publik", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10052": "Tidak ada sakelar SDN yang terpasang ke controller.%s", + "ORG_ZSTACK_MACVLAN_10004": "hanya %s yang mendukung jaringan MACVLAN模式", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10057": "gagal mengambil sakelar logis untuk jaringan layer 2 %s", + "ORG_ZSTACK_MACVLAN_10007": "tidak dapat melampirkan layanan jaringan ke jaringan L3 dengan UUID: %s, karena jaringan L2 dengan UUID: %s hanya mendukung vRouter sebagai penyedia jaringan untuk jaringan L3 dasar privat.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10058": "mendapatkan sakelar logis untuk jaringan Layer 2 gagal dengan hasil: %s", + "ORG_ZSTACK_MACVLAN_10006": "tidak dapat melampirkan layanan jaringan ke jaringan L3 dengan UUID: %s, karena jaringan L2 dengan UUID: %s hanya mendukung vRouter sebagai penyedia jaringan untuk jaringan L3 VPC dan tidak mendukung vSwitchType: %s.", + "ORG_ZSTACK_MACVLAN_10009": "Host KVM hanya mendukung jaringan L2 dengan vSwitchType yang disetel ke OVS. Pastikan host Anda adalah jenis KVM dan vSwitchType dikonfigurasi sebagai OVS.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10056": "tidak dapat mengambil informasi port sakelar fisik karena: %s", + "ORG_ZSTACK_MACVLAN_10008": "tidak dapat melampirkan layanan jaringan ke jaringan L3 [uuid:%s], karena jaringan L2 [uuid:%s, vSwitch Type:%s] hanya mendukung load balancer untuk jaringan L3 dasar privat", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10075": "Volume root telah dihapus dan tidak dapat diimajinasikan ulang saat ini. Silakan hubungi dukungan untuk bantuan.", + "ORG_ZSTACK_STORAGE_CEPH_10023": "Masalah mungkin karena ID kunci akses atau kunci akses rahasia atau nomor port SSH yang salah atau koneksi jaringan yang tidak stabil di lingkungan cloud Anda. Harap verifikasi pengaturan ini.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10050": "Tidak ada tenant pada pengontrol SDN [IP:%s]", + "ORG_ZSTACK_STORAGE_CEPH_10020": "poolName dapat null tetapi tidak boleh string kosong", + "ORG_ZSTACK_KVM_10022": "koneksi ssh ke host[%s] username[%s] pada port[%s] gagal, karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10073": "tidak dapat membuat volume kosong[uuid:%s, name:%s] pada host KVM[uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_10021": "poolName harus ditentukan ketika importImages diaktifkan", + "ORG_ZSTACK_KVM_10023": "Host[%s] belum dinyalakan dalam %d detik karena alasan yang tidak diketahui. Silakan periksa status host melalui BMC[%s].", + "ORG_ZSTACK_STORAGE_BACKUP_10092": "gagal melewati verifikasi keamanan restore:\\n%s", + "ORG_ZSTACK_KVM_10014": "host %s tidak dikelola oleh node manajemen saat ini", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10000": "executeSlbGroupConfigTask nama tugas tidak diketahui: %s", + "ORG_ZSTACK_MEVOCO_10049": "Tidak dapat menemukan informasi konfigurasi untuk node A", + "ORG_ZSTACK_STORAGE_BACKUP_10091": "penyimpanan backup [UUID:%s] tidak diaktifkan atau dikonfigurasi", + "ORG_ZSTACK_KVM_10015": "host %s tidak terhubung, lewati untuk memulai ulang agen KVM", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10039": "tidak dapat memigrasikan volume root [uuid:%s] karena ada perangkat device yang dikelola yang terpasang", + "ORG_ZSTACK_MEVOCO_10048": "Tidak dapat menetapkan konfigurasi lokal dan konfigurasi cloud secara bersamaan. Harap tentukan satu lingkungan penerapan.", + "ORG_ZSTACK_STORAGE_BACKUP_10090": "backup database [uuid:%s] belum ada", + "ORG_ZSTACK_KVM_10016": "tugas yang berjalan ada pada host %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10081": "tidak dapat menemukan file flag [%s] pada node komputasi [%s], karena: %s", + "ORG_ZSTACK_MEVOCO_10047": "alamat IP manajemen host yang tidak terduga: [%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10037": "tidak dapat memigrasikan VM[UUID:%s] karena ada perangkat mdev yang terpasang", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10035": "tidak dapat menemukan perangkat mdev[uuid:%s], mungkin telah dihapus atau dilepaskan", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10036": "perangkat mdev dengan UUID: %s tidak ada atau dinonaktifkan untuk VM dengan UUID: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10034": "gagal menemukan perangkat mdev spesifikasi yang cukup [uuid:%s] di host tujuan [uuid:%s] untuk mesin virtual [uuid:%s]", + "ORG_ZSTACK_MEVOCO_10041": "nilai tidak valid[%s], ZStack tidak mendukung jenis alokasi host seperti ini", + "ORG_ZSTACK_STORAGE_BACKUP_10099": "database backup[uuid:%s] is not enabled and ready", + "ORG_ZSTACK_STORAGE_CDP_10120": "Unable to find connected backup storage[uuid: %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10098": "volume[uuid:%s] has been deleted and state changes are not permitted", + "ORG_ZSTACK_MEVOCO_10040": "invalid value[%s], it's not a valid floating-point number", + "ORG_ZSTACK_STORAGE_CDP_10121": "The operation involves volume [UUID: %s] that will create a chain-type snapshot. Consequently, you cannot perform this operation when a Continuous Data Protection (CDP) task is running on the virtual machine instance.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10032": "failed to determine candidate hosts to start vm[uuid:%s], %s", + "ORG_ZSTACK_STORAGE_BACKUP_10097": "No available object storage bucket found for backup, skipping this job.%s", + "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10001": "Removing a system topic from a system alarm is forbidden. Please provide valid topic and alarm UUIDs.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10005": "Cannot find public network interface of SLB instance", + "ORG_ZSTACK_MEVOCO_10046": "obj is not an instance of NicQos! Please ensure that the object type matches the expected type.", + "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10000": "alarm[uuid:%s] adalah alert yang dihasilkan oleh sistem dan tidak dapat dihapus", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10004": "tugas konfigurasi slb instance[uuid:%s] versi:%d gagal %d kali", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10003": "tidak dapat menemukan instance SLB yang tersedia di group[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10094": "versi backup database[%s] tidak cocok dengan versi saat ini[%s]", + "ORG_ZSTACK_MACVLAN_10000": "gagal merealisasikan bridge untuk l2VlanNetwork[uuid:%s, name:%s] di host KVM[uuid:%s], %s", + "ORG_ZSTACK_MEVOCO_10043": "nilai %s adalah[%s], yang bertentangan dengan nilai %s [%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10093": "Gagal mengalokasikan port bebas untuk mendengarkan. Harap pastikan port yang diperlukan tidak digunakan oleh aplikasi lain. Jika masalah berlanjut, pertimbangkan untuk memeriksa konfigurasi jaringan Anda atau hubungi dukungan untuk bantuan lebih lanjut.", + "ORG_ZSTACK_MEVOCO_10060": "Gagal mengatur alamat untuk node A", + "ORG_ZSTACK_KVM_10030": "pemeriksaan kapasitas host gagal, karena:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10082": "tidak dapat membuat file flag [%s] pada instance [%s], karena: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10060": "mendapatkan logical switch gagal: uuid: %s", + "ORG_ZSTACK_KVM_10032": "Kapasitas memori yang tersedia untuk host [UUID: %s] [%s MB] lebih rendah dari kapasitas yang dicadangkan [%s MB]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10083": "Tidak ada penyimpanan utama LocalStorage (state=%s, status=%s) pada cluster (%s). Ketika cluster memasang beberapa penyimpanan utama, sistem secara default menggunakan penyimpanan utama lokal. Harap verifikasi state dan status penyimpanan utama dan pastikan telah dipasang ke cluster.", + "ORG_ZSTACK_KVM_10033": "tidak dapat mendaftarkan colo heartbeat untuk vm[uuid:%s] di host kvm [uuid:%s, ip:%s], karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10084": "Tipe penyimpanan utama [uuid:%s] yang dipilih bukan penyimpanan lokal. Harap verifikasi apakah sumber daya dapat dibuat di penyimpanan lain yang tersedia ketika cluster telah memasang penyimpanan utama lokal.", + "ORG_ZSTACK_KVM_10034": "tidak dapat memulai virtual machine colo synchronization [uuid:%s] di host kvm [uuid:%s, ip:%s], karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10085": "Cluster memasang beberapa perangkat penyimpanan utama [Local Storage (%s), penyimpanan utama non-LocalStorage lainnya], oleh karena itu, spesifikasi primaryStorageUuidForDataVolume tidak diizinkan %s.", + "ORG_ZSTACK_KVM_10024": "Host[%s] belum dimatikan dalam %d detik karena alasan yang tidak diketahui. Harap periksa status host melalui BMC[%s].", + "ORG_ZSTACK_MEVOCO_10059": "Instance ini tidak terkait dengan node A", + "ORG_ZSTACK_MEVOCO_10058": "ada beberapa node dalam mode factory; detail ARPing: %s", + "ORG_ZSTACK_MEVOCO_10053": "curl bootstrap agent selesai, kode return: %s, stdout: %s, stderr: %s", + "ORG_ZSTACK_MEVOCO_10052": "tidak dapat mengambil hasil bootstrap job %s setelah 900 detik", + "ORG_ZSTACK_MEVOCO_10050": "tidak dapat menemukan informasi alamat node A dari bootstrap agent", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10040": "tidak dapat melakukan migrasi VM[UUID:%s] karena memiliki perangkat MDEV yang terpasang", + "ORG_ZSTACK_MEVOCO_10057": "update mode factory node A gagal, detail: %s", + "ORG_ZSTACK_MEVOCO_10056": "Semua node manajemen update ke mode factory gagal, detail: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10013": "Alamat MAC %s tidak valid. Seharusnya diformat sebagai 6c:b3:11:1b:0b:1e", + "ORG_ZSTACK_HA_10014": "tidak dapat mengatur FT pada VM [uuid:%s] karena perangkat USB terpasang melalui passthrough", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10012": "baremetal PXE server [UUID:%s] tidak diaktifkan maupun terhubung, harap verifikasi statusnya.", + "ORG_ZSTACK_HA_10015": "tidak dapat mengatur FT pada virtual machine [uuid:%s] karena perangkat mdev terpasang", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10015": "Deteksi UUID bond duplikat untuk mesin virtual %s. Pastikan UUID unik untuk konfigurasi bonding.", + "ORG_ZSTACK_HA_10016": "Node manajemen gagal menemukan host. Pastikan host terdaftar dengan benar dan dapat diakses dalam lingkungan cloud.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10014": "Chassis baremetal [UUID: %s] tidak memiliki antarmuka jaringan dengan alamat MAC %s", + "ORG_ZSTACK_HA_10017": "Nilai[%s] berada di luar rentang valid [0, 1].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10057": "host[uuid: %s] dari penyimpanan primer lokal[uuid: %s] tidak memiliki kapasitas yang cukup[saat ini: %s byte, diperlukan: %s]", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10017": "Deteksi UUID Jaringan L3 Duplikat", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10058": "tidak dapat menemukan host yang memiliki sumber daya[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10016": "Network Bonding Baremetal tidak didukung", + "ORG_ZSTACK_HA_10011": "tidak dapat mengatur FT pada VM[uuid:%s] karena tidak dalam keadaan berhenti", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10059": "Resource[uuid:%s] hanya dapat dioperasikan pada host[uuid:%s], tetapi host telah dihentikan", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10019": "Jaringan Layer 3 yang dipilih tidak dapat ditugaskan ke chassis [UUID:%s].", + "ORG_ZSTACK_HA_10012": "tidak dapat mengatur FT pada VM[uuid:%s] karena satu atau lebih volume data masih terpasang", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10018": "Jaringan layer 3 yang ditentukan tidak ada. Silakan verifikasi nama jaringan dan coba lagi.", + "ORG_ZSTACK_HA_10013": "tidak dapat mengatur FT pada VM[uuid:%s] karena perangkat PCI terpasang", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10053": "Untuk menyediakan volume data pada penyimpanan primer lokal, Anda harus menentukan host tempat volume data akan dibuat menggunakan tag sistem [%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10054": "Host [UUID:%s] tidak terkait dengan penyimpanan primer lokal [UUID:%s].", + "ORG_ZSTACK_KVM_10040": "gagal menambah jumlah CPU VM, detail kesalahan: %s", + "ORG_ZSTACK_HA_10018": "VM[uuid:%s] lokasi penyimpanan volume sedang dalam pemeliharaan", + "ORG_ZSTACK_KVM_10043": "tidak dapat terhubung ke KVM[ip:%s, username:%s, SSH port:%d] untuk melakukan validasi DNS; harap verifikasi kredensial.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10050": "Tidak dapat melakukan live migrate VM [uuid:%s] dengan volume data pada penyimpanan lokal. Volume data harus dilepas terlebih dahulu.", + "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10001": "Objek kueri null. Harap pastikan parameter kueri diinisialisasi dengan benar sebelum mengeksekusi tugas komputasi awan.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10051": "tidak dapat melakukan live migrate VM[UUID:%s] dengan penyimpanan lokal. Hanya tamu Linux yang didukung. Platform saat ini adalah [%s].", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10011": "Tidak ditemukan informasi perangkat keras untuk chassis baremetal[uuid:%s], harap pilih yang lain.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10052": "tidak dapat melakukan live migrate VM[UUID:%s] dengan ISO terpasang pada penyimpanan lokal. Silakan lepaskan semua ISO terlebih dahulu.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10010": "tidak ada server PXE yang sesuai terdeteksi, harap verifikasi konfigurasi chassis baremetal[uuid:%s] kembali", + "ORG_ZSTACK_KVM_10035": "tidak dapat mengonfigurasi VM sekunder[UUID:%s] pada host KVM [UUID:%s, IP:%s], karena %s", + "ORG_ZSTACK_MEVOCO_10028": "Jaringan L3 dengan UUID [%s] tidak ditemukan. Harap verifikasi dan perbaiki tag sistem [%s] yang terkait dengan IP statis Anda.", + "ORG_ZSTACK_STORAGE_BACKUP_10070": "tidak dapat menemukan backup volume dengan UUID: %s", + "ORG_ZSTACK_KVM_10036": "tidak dapat mengonfigurasi VM primer[UUID:%s] pada host KVM[UUID:%s, IP:%s], karena %s", + "ORG_ZSTACK_MEVOCO_10027": "nilai IOPS tidak valid untuk volume [%s] melebihi batas maksimum %d", + "ORG_ZSTACK_KVM_10037": "tidak dapat mengambil perangkat boot awal dari VM [UUID:%s] pada host KVM [UUID:%s, IP:%s], karena %s", + "ORG_ZSTACK_MEVOCO_10026": "IOPS volume[%s] tidak valid, bukan angka yang valid", + "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10000": "Minimal satu Host UUID diperlukan saat melakukan query pada Namespace Prometheus pihak ketiga. Pastikan Host UUID tercakup dalam label parameter query.", + "ORG_ZSTACK_KVM_10038": "gagal mengambil alamat perangkat vm[uuid:%s], karena:%s", + "ORG_ZSTACK_MEVOCO_10025": "nilai IOPS[%s] tidak valid, harus lebih besar dari 1 (termasuk 1)", + "ORG_ZSTACK_KVM_10039": "gagal mengambil informasi virtualizer host[uuid:%s], karena:%s", + "ORG_ZSTACK_MEVOCO_10029": "Akses perangkat USB terbatas hanya untuk akun administratif. Pastikan Anda masuk dengan akun yang memiliki hak istimewa administratif.", + "ORG_ZSTACK_STORAGE_BACKUP_10078": "penyimpanan cadangan tidak dapat berlanjut karena statusnya adalah %s", + "ORG_ZSTACK_MEVOCO_10020": "bandwidth volume[%s] tidak valid, harus berupa nilai numerik", + "ORG_ZSTACK_STORAGE_BACKUP_10077": "penyimpanan cadangan tidak dapat berlanjut karena statusnya adalah %s", + "ORG_ZSTACK_STORAGE_BACKUP_10076": "Penyimpanan cadangan [UUID: %s, Nama: %s] tidak memiliki kapasitas yang cukup untuk mengunduh gambar [%s]. Ukuran yang diperlukan: %s, ukuran yang tersedia: %s.", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10001": "Semua node Ceph MON terputus pada penyimpanan cadangan Ceph [uuid:%s].", + "ORG_ZSTACK_STORAGE_BACKUP_10075": "Ukuran gambar yang diambil dari URL %s adalah %d byte, terlalu kecil untuk sebuah gambar. Harap verifikasi URL kembali.", + "ORG_ZSTACK_STORAGE_BACKUP_10074": "gagal mengambil header dari URL gambar %s", + "ORG_ZSTACK_STORAGE_BACKUP_10073": "gagal mengambil header dari URL gambar %s: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10072": "Harap hentikan node lain terlebih dahulu!", + "ORG_ZSTACK_MEVOCO_10021": "bandwidth volume[%s] melebihi nilai maksimum yang diizinkan sebesar %d", + "ORG_ZSTACK_STORAGE_BACKUP_10071": "Klaster VM [%%s] tidak berada di lokasi yang sama dengan klaster penyimpanan primer [%%s].", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10023": "tidak dapat menghapus instance baremetal yang tidak dalam status Dimusnahkan", + "ORG_ZSTACK_HA_10005": "host gagal memindai port host target[uuid:%s, ip:%s]", + "ORG_ZSTACK_IDENTITY_LOGIN_10000": "metode autentikasi %s tidak didukung", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10068": "Klaster [UUID=%s] dipasang dengan beberapa penyimpanan primer, termasuk LocalStorage dan penyimpanan primer non-LocalStorage lainnya. Anda harus menentukan penyimpanan primer tempat disk data berada.", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10003": "Gagal memigrasi Gambar %s dari Penyimpanan Backend %s ke Penyimpanan Backend %s. penyebab: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10002": "Ditemukan ID trash (%s) pada Penyimpanan Cadangan [%s] untuk jalur instalasi migrasi [%s]. Harap bersihkan terlebih dahulu menggunakan 'APICleanUpTrashOnBackupStorageMsg' jika Anda tetap ingin memigrasi gambar [%s].", + "ORG_ZSTACK_HA_10000": "Instance mesin virtual kemungkinan sudah dihentikan. Melewati pemeriksaan kesehatan.", + "ORG_ZSTACK_HA_10001": "tidak dapat menemukan mesin virtual dengan nama:[%s] dan uuid:[%s], host uuid adalah null", + "ORG_ZSTACK_HA_10002": "Tidak ditemukan instance HAHostChecker, tidak dapat melakukan pemeriksaan ketersediaan tinggi. Harap pastikan semua komponen yang diperlukan dikonfigurasi dengan benar.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10064": "Penggunaan kapasitas fisik host [uuid:%s] telah melampaui ambang batas [%s]. Harap pertimbangkan untuk menskalakan atau mengoptimalkan sumber daya Anda.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10067": "Klaster[uuid=%s] dikonfigurasi untuk memasang beberapa solusi penyimpanan primer, termasuk LocalStorage dan penyimpanan primer non-LocalStorage lainnya. Anda harus menentukan penyimpanan primer mana yang berisi disk root.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10060": "Host KVM [UUID: %s] gagal ditambahkan ke penyimpanan primer lokal [UUID: %s], %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10020": "Hanya gambar ISO yang didukung untuk penerapan layanan bare metal di ZStack.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10061": "tidak dapat membuat volume snapshot kosong[name:%s, jalur instalasi: %s] pada host KVM[uuid:%s, ip:%s], karena %s", + "ORG_ZSTACK_KVM_10054": "tidak dapat melakukan penggabungan snapshot volume ketika mesin virtual [uuid:%s] berada dalam keadaan %s. Operasi ini hanya diperbolehkan ketika mesin virtual berada dalam keadaan Berjalan atau Berhenti.", + "ORG_ZSTACK_HA_10008": "terjadi pengecualian saat menyinkronkan keadaan self-fencer dari host [UUID: %s], %s", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10000": "folder[%s] tidak ditemukan pada server manajemen awan[%s]", + "ORG_ZSTACK_KVM_10055": "penggabungan snapshot volume langsung memerlukan versi libvirt yang lebih besar dari %s, versi saat ini adalah %s. Harap hentikan VM dan coba lagi atau lepaskan volume data jika diperlukan.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10062": "gagal mentransfer bit dari penyimpanan cadangan SFTP[hostname:%s, path: %s] ke penyimpanan primer lokal[uuid:%s, path: %s], %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10022": "Tidak dapat memulihkan instance baremetal yang tidak berada dalam keadaan Destroyed. Harap pastikan instance berada dalam keadaan Destroyed sebelum mencoba pemulihan.", + "ORG_ZSTACK_HA_10009": "Parameter %s tidak dapat disetel ke '%s' karena jaringan penyimpanan tidak tersedia dan ketersediaan tinggi harus tetap diaktifkan.", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10001": "namespace[%s] tidak memiliki metric[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10063": "gagal mengunggah bit dari penyimpanan lokal[uuid:%s, path:%s] ke penyimpanan cadangan SFTP[hostname:%s, remotePath:%s], %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10021": "Hanya Image Store Backup Storage yang didukung di ZStack Bare Metal Service.", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10002": "metric[%s] dari namespace[%s] tidak memiliki label bernama %s", + "ORG_ZSTACK_MEVOCO_10039": "nilai[%s] tidak valid, harus berupa double antara (0, 1] termasuk 1", + "ORG_ZSTACK_KVM_10047": "Host [UUID: %s, status: %s] tidak terhubung.", + "ORG_ZSTACK_COMPUTE_OVS_10000": "format konfigurasi sumber daya OVS CPU pinning:[%s] salah.", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10001": "disengaja 1: File sumber tidak ditemukan. Harap pastikan semua file yang diperlukan diunggah dengan benar dan disertakan dalam pengaturan proyek Anda.", + "ORG_ZSTACK_MEVOCO_10037": "nilai[%s] tidak valid, harus berupa angka floating-point positif lebih besar dari 0", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10002": "disengaja: 2 - Kesalahan ini menunjukkan bahwa operasi dihentikan atau dimodifikasi secara sengaja selama eksekusi. Harap periksa parameter input Anda dan pastikan它们 memenuhi persyaratan untuk lingkungan komputasi awan.", + "ORG_ZSTACK_MEVOCO_10031": "Kode keamanan[%s] tidak dikenal untuk autentikasi", + "ORG_ZSTACK_STORAGE_BACKUP_10089": "kegagalan operasi metadata cadangan volume karena %s", + "ORG_ZSTACK_STORAGE_BACKUP_10087": "kegagalan pembuatan file metadata cadangan volume pada image store[uuid:%s] karena kesalahan IO: %s", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10000": "disengaja: 3 Instance awan sedang dihentikan. Harap konfirmasi tindakan tersebut.", + "ORG_ZSTACK_MEVOCO_10034": "Sistem operasi host [UUID:%s] %s %s terlalu usang untuk mendukung QoS untuk jaringan atau I/O disk. Harap pilih instance lain tanpa konfigurasi QoS.", + "ORG_ZSTACK_MEVOCO_10033": "%s bukan notasi CIDR yang valid", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10010": "tidak dapat menambahkan Huawei iMaster SDN controller dengan rentang VLAN [%s, %s] tidak valid", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10008": "iso[uuid: %s] dipasang ke vm[uuid: ], tetapi file ISO tidak terletak di penyimpanan blok apa pun. Anda harus melepasnya sebelum memigrasikan VM.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10009": "gagal menemukan block SCSI LUN untuk volume: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10035": "host[uuid:%s] tidak dapat mengakses penyimpanan lokal[uuid:%s], kemungkinan karena pelepasan", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10013": "tidak dapat membuat Huawei iMaster NSE L3 network tanpa UUID router logis", + "ORG_ZSTACK_MEVOCO_10093": "DeleteVolumeQos [%s] diabaikan karena hak istimewa akun.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10036": "resource[uuid:%s, type: %s] tidak tersedia pada penyimpanan primer lokal[uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10014": "tidak dapat membuat jaringan Huawei iMaster L3 dengan jaringan L2 [uuid:%s] karena sudah ada", + "ORG_ZSTACK_MEVOCO_10092": "mode kualitas layanan volume tidak valid: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10037": "resource[uuid:%s, type: %s] pada penyimpanan primer lokal[uuid:%s] dipetakan ke beberapa hypervisor%sWithMultipleHypervisors", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10011": "tidak dapat menambahkan Huawei iMaster SDN Controller tanpa rentang VLAN atau ID VLAN yang ditentukan", + "ORG_ZSTACK_MEVOCO_10091": "Tidak ada volume yang terpasang pada instance ini. Silakan pasang volume untuk melanjutkan.", + "ORG_ZSTACK_STORAGE_BACKUP_10058": "Tidak dapat menentukan penyimpanan primer yang terpasang ke klaster berbeda.", + "ORG_ZSTACK_STORAGE_BACKUP_10057": "Minimal salah satu dari parameter berikut harus ditentukan: UUID Jaringan L3, UUID Zona, UUID Klaster, UUID Host.", + "ORG_ZSTACK_MEVOCO_10090": "tidak dapat mengambil snapshot untuk volume yang terpasang ke beberapa VM", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10033": "Tidak dapat membuat data volume[uuid: %s] pada penyimpanan primer lokal[uuid:%s], karena UUID host tidak ditentukan.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10034": "Tidak ada keadaan host yang diaktifkan. Silakan verifikasi ketersediaan sumber daya host.", + "ORG_ZSTACK_KVM_10064": "gagal untuk memperbarui antarmuka jaringan untuk mesin virtual [vm:%s] pada host KVM [uuid:%s, ip:%s], karena %s", + "ORG_ZSTACK_KVM_10065": "gagal untuk memasang nic dengan UUID: %s ke VM UUID: %s pada host KVM dengan UUID: %s dan IP: %s, karena %s. Silakan coba lagi atau hapus perangkat dengan UUID: %s secara manual.", + "ORG_ZSTACK_KVM_10066": "gagal untuk memasang nic dengan UUID: %s ke VM UUID: %s pada host KVM dengan UUID: %s dan IP: %s karena %s", + "ORG_ZSTACK_KVM_10067": "gagal untuk melepas data volume[uuid:%s, installPath:%s] dari vm[uuid:%s, name:%s] pada host KVM[uuid:%s, ip:%s], karena %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10005": "aturan penerusan port [uuid:%s] telah dihapus", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10006": "Aturan penerusan port [uuid:%s] tidak diaktifkan, keadaan saat ini adalah %s", + "ORG_ZSTACK_KVM_10059": "vm[uuid:%s] tidak dalam keadaan Berjalan atau Berhenti, status saat ini[%s]", + "ORG_ZSTACK_TICKET_10000": "ticket[uuid:%s, name:%s] hanya dapat diperbarui setelah dibatalkan; status saat ini adalah %s", + "ORG_ZSTACK_TICKET_10001": "operasi ditolak. operasi perlu dilakukan oleh akun/virtual ID[uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10017": "mendapatkan token dari pengontrol SDN [IP:%s] gagal untuk mengambil data", + "ORG_ZSTACK_MEVOCO_10086": "VM[uuid:%s] telah berhenti beroperasi. Silakan coba lagi nanti.", + "ORG_ZSTACK_STORAGE_BACKUP_10056": "VM saat ini[UUID: %s] dari volume[UUID: %s] bukan lagi VM[UUID: %s] yang digunakan untuk cadangan", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10003": "Tidak dapat menjalankan alur pemetaan LUN ke host karena metadata referensi host PS kosong. Silakan periksa konfigurasi host dan pastikan metadata yang diperlukan sudah diisi.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10018": "mendapatkan token dari pengontrol sdn [ip:%s] gagal karena %s", + "ORG_ZSTACK_MEVOCO_10085": "Tidak dapat menemukan snapshot dari volume UUID [uuid: %s]. Mungkin tidak ada rantai snapshot yang memerlukan validasi.", + "ORG_ZSTACK_STORAGE_BACKUP_10055": "snapshot volume root dari grup[uuid:%s] tidak ditemukan", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10000": "Tidak dapat menjalankan pemetaan unit logis ke host karena perangkat backend null.%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10015": "tidak dapat menghapus Huawei Logical Router [UUID:%s] karena terhubung dengan Jaringan L3 [UUID:%s]", + "ORG_ZSTACK_MEVOCO_10084": "tidak dapat menemukan snapshot terbaru dari volume [uuid: %s]. Mungkin tidak ada chain snapshot yang ada untuk validasi.", + "ORG_ZSTACK_STORAGE_BACKUP_10054": "Tidak ada volume backup ditemukan untuk group UUID: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10016": "gagal mendapatkan token dari SDN controller [IP:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10001": "Tidak dapat menjalankan flow pemetaan LUN ke host karena referensi host PS kosong. Harap pastikan referensi host diatur dengan benar.", + "ORG_ZSTACK_MEVOCO_10083": "tidak dapat menemukan snapshot yang ditentukan dalam tree snapshot volume [UUID: %s]. Mungkin tidak ada chain snapshot yang perlu divalidasi.", + "ORG_ZSTACK_STORAGE_BACKUP_10053": "Resource[uuid: %s] telah memulai tugas CDP; oleh karena itu, job backup tidak dapat dibuat secara bersamaan.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10006": "KVM host [UUID: %s] gagal ditambahkan ke block primary storage [UUID: %s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10009": "port forwarding rule[uuid:%s] tidak diaktifkan, state saat ini adalah %s. Sebuah rule hanya dapat dilampirkan ketika state-nya diaktifkan.", + "ORG_ZSTACK_STORAGE_BACKUP_10052": "Gagal membuat backup untuk VM[uuid:%s], karena tidak dalam state[%s, %s]", + "ORG_ZSTACK_MEVOCO_10089": "Tidak dapat mengambil snapshot untuk volumes[%s] karena volume[UUID: %s] didefinisikan beberapa kali", + "ORG_ZSTACK_STORAGE_BACKUP_10051": "Volume[uuid:%s] bukan root volume", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10019": "gagal menghapus token dari SDN controller [IP:%s] karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10004": "Tidak dapat menjalankan flow pemetaan volume ke host karena ID volume tidak valid.%s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10007": "port forwarding rule [uuid:%s] belum dilampirkan ke interface jaringan virtual machine manapun, tidak dapat melepaskan", + "ORG_ZSTACK_MEVOCO_10088": "tidak dapat mengambil snapshot untuk volumes[%s] ketika volume[uuid: %s] tidak dilampirkan", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10005": "Tidak dapat menjalankan flow pemetaan LUN ke host karena tipe LUN tidak valid: %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10008": "port forwarding rule [uuid:%s] telah diasosiasikan dengan vm nic [uuid:%s], tidak dapat dialokasikan kembali", + "ORG_ZSTACK_MEVOCO_10087": "VM yang Running[uuid:%s] tidak memiliki Host UUID yang diasosiasikan.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10020": "gagal mendapatkan tenant dari SDN controller [IP:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10021": "gagal mendapatkan tenant dari SDN controller [IP:%s] karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10019": "block primary storage [uuid:%s, name:%s] tidak dapat menemukan host yang tersedia dalam cluster yang dilampirkan untuk instansiasi volume", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10024": "Gagal mendapatkan logical switch port dari SDN controller [IP:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10047": "tidak dapat melampirkan data volume [uuid:%s] ke VM [uuid:%s]. Root volume VM dan data volume keduanya terletak pada local primary storage tetapi berada di host yang berbeda. Root volume [uuid:%s] dihosting pada host [uuid:%s], sedangkan data volume [uuid:%s] dihosting pada host [uuid:%s].", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10025": "gagal mendapatkan informasi switch port dari sdn controller [ip:%s] karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10048": "Data volume[name: %s, UUID: %s] terletak pada local storage[UUID: %s]; namun, host tempat data volume berada telah dihapus. Pemulihan volume ini tidak mungkin dilakukan.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10022": "gagal mendapatkan switch device dari SDN controller [ip:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10069": "VM sedang membuat job backup dan tidak dapat mengaktifkan tugas CDP secara bersamaan. Harap pastikan semua job backup selesai sebelum mengaktifkan CDP.", + "ORG_ZSTACK_KVM_10070": "gagal menghentikan virtual machine[uuid:%s name:%s] pada KVM host[uuid:%s, ip:%s], karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10049": "tidak dapat memulihkan vm[uuid:%s, name:%s]. Root volume vm terletak pada local storage[uuid:%s]; namun, host tempat root volume berada telah dihapus.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10023": "gagal mendapatkan switch device dari SDN controller [IP:%s] karena %s", + "ORG_ZSTACK_STORAGE_BACKUP_10068": "Klaster host [uuid: %s] tidak berada di lokasi yang sama dengan klaster volume [uuid: %s]. Pastikan penyimpanan utama berada dalam klaster yang sama.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10020": "VM [Nama: %s UUID: %s] sudah memiliki aturan port forwarding dengan VIP yang berbeda dari [UUID: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10044": "pembuatan bergantung pada cache image [uuid: %s, host uuids yang berlokasi: [%s]], tidak dapat membuat di tempat lain.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10045": "penyimpanan lokal tidak mendukung live migration untuk hypervisor[%s]", + "ORG_ZSTACK_KVM_10075": "gagal menghentikan vm[uuid:%s name:%s] pada host kvm[uuid:%s ip:%s], karena %s", + "ORG_ZSTACK_KVM_10078": "host[uuid:%s] tidak memiliki kapasitas yang cukup untuk mengalokasikan cpu[%s] dan memory[%s bytes].", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10017": "Rentang port VIP [vipStartPort:%s, vipEndPort:%s] tumpang tindih dengan aturan jaringan [uuid:%s, vipStartPort:%s, vipEndPort:%s]", + "ORG_ZSTACK_KVM_10069": "gagal melampirkan data volume[uuid:%s, installPath:%s] ke vm[uuid:%s, name:%s] pada host KVM[uuid:%s, ip:%s], karena %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10014": "CIDR tidak valid[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10015": "CIDR tidak valid[%s], hanya alamat IPv4 yang didukung", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10012": "tidak dapat membuat aturan port forwarding, karena rentang port VIP [vipStartPort:%s, vipEndPort:%s] tidak kompatibel dengan rentang port privat [privateStartPort:%s, privateEndPort:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10010": "tidak dapat menemukan SCSI LUN untuk daftar volume:%s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10013": "untuk port forwarding berbasis rentang, ukuran rentang port harus cocok; ukuran rentang VIP [%s, %s] tidak cocok dengan [%s, %s]", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10010": "jaringan l3 guest VM dan jaringan l3 VIP aturan port forwarding adalah jaringan yang sama (uuid: %s, uuid: %s)", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10028": "gagal mendapatkan fabric dari SDN controller [ip:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10013": "Operasi pengambilan snapshot volume pada beberapa host secara bersamaan ketika Ceph terlibat tidak didukung.", + "ORG_ZSTACK_MEVOCO_10097": "Cuplikan kode Java yang disediakan tidak memiliki file sumbernya. Pastikan semua file yang diperlukan disertakan dan kompilasi ulang. Selain itu, pesan kesalahan \"unknown message version\" menunjukkan format pesan yang tidak didukung atau tidak dikenali. Periksa versi pesan dan pastikan kompatibel dengan sistem.", + "ORG_ZSTACK_STORAGE_BACKUP_10067": "Tidak ditemukan bucket penyimpanan objek yang tersedia untuk operasi backup. Pastikan layanan penyimpanan objek dikonfigurasi dengan benar dan dapat diakses dalam lingkungan cloud.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10014": "Gagal memetakan LUN ke host sebelum melampirkan volume ke VM", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10029": "gagal mendapatkan jaringan fabric dari SDN controller [ip:%s] karena %s", + "ORG_ZSTACK_MEVOCO_10096": "akun non-admin tidak dapat melebihi batas bandwidth maksimum %s", + "ORG_ZSTACK_STORAGE_BACKUP_10066": "VM tidak dalam keadaan berhenti: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10026": "gagal mendapatkan VPC dari SDN controller [IP:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10011": "gagal menukar informasi SCSI LUN block:%s", + "ORG_ZSTACK_MEVOCO_10095": "SetVolumeQosMsg versi 1 tidak digunakan lagi dalam lingkungan komputasi cloud; harap migr ke versi 2 untuk performa dan kompatibilitas optimal.", + "ORG_ZSTACK_STORAGE_BACKUP_10065": "VM tidak ditemukan dengan backup volume [uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10027": "gagal mendapatkan VPC dari SDN controller [IP:%s] karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10012": "gagal membersihkan sumber daya setelah melepaskan volume karena %s", + "ORG_ZSTACK_MEVOCO_10094": "Tidak dapat menghapus volume QoS VM pada host %s karena VM saat ini dalam keadaan %s, tetapi keadaan yang didukung adalah [%s, %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10064": "volume asli[uuid:%s] untuk backup[uuid:%s] tidak lagi terpasang ke mesin virtual[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10063": "snapshot cadangan asli untuk backup[uuid:%s] telah dihapus, tidak dapat mengembalikan volume ke sana", + "ORG_ZSTACK_MEVOCO_10099": "Akun non-admin hanya diizinkan untuk menetapkan batas total %s untuk sumber daya virtual.", + "ORG_ZSTACK_STORAGE_BACKUP_10061": "cadangan volume [uuid:%s] saat ini dalam keadaan %s dan tidak dapat digunakan untuk pemulihan volume.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10016": "primaryStorageUuid wajib diisi saat mengunduh cache gambar.", + "ORG_ZSTACK_MEVOCO_10098": "Jenis batas Quality of Service (QoS) yang tidak diketahui ditentukan. Harap pastikan jenis batas QoS dikonfigurasi dengan benar.", + "ORG_ZSTACK_STORAGE_BACKUP_10060": "tidak dapat membuat VM dari cadangan volume [uuid:%s] yang bukan cadangan volume root", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10017": "VM memiliki beberapa volume lokal pada host yang berbeda [%s]. Harap periksa volume lokal VM yang tidak normal.", + "ORG_ZSTACK_STORAGE_CEPH_10004": "url pemantauan[%s] tidak valid, hostname tidak boleh null. Format url pemantauan yang valid adalah %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10032": "get iMaster Logical Switch [%s] tidak ada respons", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10018": "Volume pada host [Host UUID: %s] tidak dapat dipasang ke VM karena VM memiliki volume lokal pada host lain [Host UUID: %s].", + "ORG_ZSTACK_STORAGE_CEPH_10005": "url pemantauan[%s] tidak valid, port SSH berada di luar rentang yang valid (1-65535). Url pemantauan yang valid harus dalam format %s", + "ORG_ZSTACK_STORAGE_CEPH_10002": "url pemantauan[%s] tidak valid, komponen username SSH:kata sandi SSH tidak valid. Format url pemantauan yang valid adalah %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10030": "pembuatan Huawei iMaster Logical Switch [%s] gagal karena %s", + "ORG_ZSTACK_STORAGE_CEPH_10003": "url pemantauan[%s] tidak valid. Username dan password SSH harus dipisahkan dengan ':' dan tidak boleh kosong. Format url pemantauan yang valid adalah %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10035": "[%s] Huawei iMaster Virtual Switch Port [%s] gagal karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10013": "Dua cluster dengan UUID %s dan %s tidak dapat berkomunikasi dalam jaringan L2 saat melakukan migrasi VM dengan UUID %s ke cluster lain.", + "ORG_ZSTACK_STORAGE_CEPH_10008": "Ceph pool dengan UUID:%s sudah ada dan digunakan di tempat lain dalam lingkungan ZStack; oleh karena itu, tidak dapat digunakan kembali.", + "ORG_ZSTACK_STORAGE_BACKUP_10038": "url tidak valid[%s], harus dalam format hostname:/path", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10036": "get informasi port logical switch untuk logical switch[%s] gagal karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10014": "URL[%s] bukan jalur absolut yang valid yang dimulai dengan '/'. Harap pastikan dimulai dengan 'http://' atau 'https://'.", + "ORG_ZSTACK_STORAGE_CEPH_10009": "tidak dapat menambahkan penyimpanan primer Ceph karena saat ini digunakan oleh host MON [%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10037": "jenis mount tidak valid[%s], harus [NFS, SSHFS, NBD]", + "ORG_ZSTACK_STORAGE_CEPH_10006": "kegagalan operasi: nama pool tidak boleh menyertakan karakter ASCII yang tidak dapat dicetak [poolName:%s]", + "ORG_ZSTACK_KVM_10080": "Ketika platform VM adalah Other, jumlah dataVolumes dan cdroms tidak boleh melebihi 3; saat ini %s.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10033": "delete Huawei iMaster Virtual Switch [%s] gagal karena %s", + "ORG_ZSTACK_STORAGE_BACKUP_10036": "derajat [%s] harus berupa nilai bilangan bulat positif", + "ORG_ZSTACK_STORAGE_CEPH_10007": "kegagalan pembuatan, nama pool duplikat[%s]. Pool dengan nama yang sama sudah ada[uuid:%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10016": "host mesin virtual [hostUuid:%s] berbeda dari host volume [hostUuid:%s]. Volume tidak dapat dipasang ke mesin virtual.", + "ORG_ZSTACK_STORAGE_BACKUP_10035": "[%s] bukan CIDR standar, apakah maksudnya [%s]?", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10034": "update Huawei iMaster Logical Switch [%s] gagal karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10010": "Volume dengan UUID [%s] adalah volume root dari VM dengan UUID [%s]. Saat ini, VM masih memiliki %s volume data yang terpasang; lepaskan sebelum migrasi.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10011": "Volume [UUID:%s] adalah volume root dari VM [UUID:%s]. Saat ini, mesin virtual masih memiliki ISO yang terpasang; lepaskan sebelum migrasi.", + "ORG_ZSTACK_KVM_10088": "gagal memeriksa antarmuka jaringan fisik [nama: %s] pada host KVM [UUID:%s, IP:%s]", + "ORG_ZSTACK_KVM_10079": "Host[%s] pembaruan konfigurasi saluran Spice gagal karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10021": "volume: %s tidak terpasang, gagal membuat cache gambar untuk volume", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10024": "gagal menemukan jalur instalasi untuk mengunduh volume: %s, siapkan sebelum melanjutkan", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10039": "hapus Huawei iMaster Logical Router[%s] gagal, karena %s", + "ORG_ZSTACK_MEVOCO_10064": "networkInboundBandwidthFormatError %s", + "ORG_ZSTACK_STORAGE_BACKUP_10034": "Volume backup [uuid:%s] tidak ditemukan pada media penyimpanan manapun", + "ORG_ZSTACK_MEVOCO_10063": "bandwidth jaringan masuk melebihi nilai maksimum yang diizinkan yaitu 32 Gbps", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10025": "gagal menemukan host untuk mengunduh volume %s", + "ORG_ZSTACK_STORAGE_BACKUP_10033": "Tidak memiliki izin untuk backup volume dalam grup UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10022": "tidak dapat menemukan host tujuan untuk volume: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10037": "hapus Huawei iMaster Virtual Switch Port [%s] gagal karena %s", + "ORG_ZSTACK_STORAGE_BACKUP_10032": "Multiple root disks ditemukan dalam grup uuid: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10023": "Gagal menemukan host untuk memetakan volume %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10038": "buat Huawei iMaster Virtual Router[%s] gagal, karena %s", + "ORG_ZSTACK_MEVOCO_10061": "status node manajemen bukan %s", + "ORG_ZSTACK_STORAGE_BACKUP_10031": "Volume root hilang dalam grup UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10026": "Gagal mendapatkan referensi initiator host, hubungkan kembali host ini: %s", + "ORG_ZSTACK_MEVOCO_10066": "networkOutboundBandwidthFormatError %s", + "ORG_ZSTACK_MEVOCO_10065": "bandwidth jaringan keluar melebihi nilai maksimum 32 Gbps", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10042": "buat Huawei IMaster subnet[%s] gagal, karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10028": "gagal mengunduh gambar[uuid:%s] ke semua host dalam penyimpanan lokal[uuid:%s]. %s", + "ORG_ZSTACK_STORAGE_CEPH_10015": "monUrl[%s] tidak valid. URL yang valid harus dalam format %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10043": "hapus Huawei iMaster subnet[%s] gagal, karena %s", + "ORG_ZSTACK_STORAGE_CEPH_10016": "dataVolumePoolName dapat null tapi tidak boleh berupa string kosong.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10040": "buat Huawei iMaster virtual network link[%s] gagal, karena %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10041": "hapus Huawei iMaster virtual network link[%s] gagal, karena %s", + "ORG_ZSTACK_STORAGE_CEPH_10019": "tidak dapat menambahkan Ceph backup storage karena sudah ada Ceph backup storage yang menggunakan mon[hostnames:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10046": "Tidak ada antarmuka jaringan virtual baru yang dibuat, yang seharusnya tidak terjadi.", + "ORG_ZSTACK_MEVOCO_10082": "Gagal menetapkan pin thread I/O [%d] [%s] pada mesin virtual [%s]: %s.", + "ORG_ZSTACK_STORAGE_BACKUP_10049": "Gagal membuat cadangan volume untuk volume[uuid:%s], karena volume yang terpasang tidak dalam keadaan[%s, %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10025": "Penyimpanan utama [UUID:%s] dinonaktifkan; migrasi dingin tidak diizinkan.", + "ORG_ZSTACK_STORAGE_BACKUP_10048": "Gagal membuat cadangan volume untuk volume[uuid:%s], karena VM tidak dalam keadaan[%s, %s]", + "ORG_ZSTACK_STORAGE_CEPH_10017": "rootVolumePoolName dapat null tetapi tidak boleh berupa string kosong.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10026": "volume[uuid:%s] tidak lagi terpasang pada penyimpanan lokal, mungkin telah dihapus atau dilepas", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10044": "gagal mendapatkan informasi sistem dari pengendali SDN [IP:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10047": "Gagal membuat cadangan volume untuk volume[uuid:%s], karena tidak terpasang pada instans VM apa pun", + "ORG_ZSTACK_STORAGE_CEPH_10018": "imageCachePoolName dapat null tetapi tidak boleh berupa string kosong", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10045": "gagal mendapatkan informasi sistem dari pengendali SDN [IP:%s] karena %s", + "ORG_ZSTACK_STORAGE_BACKUP_10046": "Tidak dapat membuat cadangan untuk volume yang dapat dibagikan[uuid:%s]", + "ORG_ZSTACK_KVM_10093": "tidak dapat terhubung ke host KVM[uuid:%s, ip:%s, url:%s], karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10022": "Untuk membuat volume pada penyimpanan utama lokal, Anda harus menentukan host tempat volume akan dibuat menggunakan tag sistem [%s].", + "ORG_ZSTACK_KVM_10096": "host tidak dapat mengakses penyimpanan utama apa pun, silakan periksa konfigurasi penyimpanan Anda atau hubungi dukungan untuk mendapatkan bantuan %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10023": "Format URI tidak valid. Contoh yang benar meliputi file://$URL, hostUuid://$HOSTUUID, atau volume://$VOLUMEUUID.", + "ORG_ZSTACK_STORAGE_CEPH_10012": "Node Mono yang sama tidak dapat ditambahkan beberapa kali.", + "ORG_ZSTACK_KVM_10099": "port SSH host[%s][%s] tidak dapat dijangkau setelah %s detik, koneksi waktu habis", + "ORG_ZSTACK_STORAGE_CEPH_10010": "Tidak dapat menambahkan host yang sama [%s] ke klaster mons", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10031": "mencadangkan snapshot ke penyimpanan cadangan adalah fitur yang tidak digunakan lagi dan tidak didukung pada penyimpanan utama blok.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10032": "gagal menemukan klaster untuk volume komit pada ps:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10035": "UUID penyimpanan utama wajib diisi saat menghapus LUN", + "ORG_ZSTACK_MEVOCO_10075": "Disk yang dapat dibagikan saat ini hanya mendukung tipe virtio-scsi.", + "ORG_ZSTACK_STORAGE_BACKUP_10045": "Deteksi tidak terduga pada penyimpanan cadangan[tipe:%s,uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10036": "UUID host wajib diisi saat mengambil nama inisiator host", + "ORG_ZSTACK_MEVOCO_10074": "Volume yang dapat dibagikan[uuid:%s] sudah terpasang pada Mesin Virtual[uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10048": "Tidak ada antarmuka jaringan virtual baru yang dibuat, ini seharusnya tidak terjadi.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10033": "gagal menemukan host untuk volume komit:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10034": "gagal mengunduh[%s] dari Penyimpanan Cadangan[hostname:%s] ke Penyimpanan Utama Blok[uuid:%s, path:%s], %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10049": "tidak ada fabric SDN yang dikonfigurasi pada pengendali [ip:%s]", + "ORG_ZSTACK_MEVOCO_10078": "Versi lisensi saat ini tidak mendukung modifikasi konfigurasi sumber daya ini [name:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10037": "initiatorName %s sedang digunakan oleh host lain, harap regenerasi initiator untuk host %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10038": "gagal menemukan template volume berdasarkan name:%s", + "ORG_ZSTACK_MEVOCO_10076": "volume(s) yang dapat dibagi [UUID: %s] terpasang; snapshot grup tidak didukung.", + "ORG_ZSTACK_AI_MESSAGE_10002": "Tidak dapat membatalkan tugas pembuatan dataset karena resource UUID[%s] atau model center UUID[%s] adalah null", + "ORG_ZSTACK_AI_MESSAGE_10001": "Tidak dapat membatalkan tugas unduhan layanan model karena resource UUID[%s] atau model center UUID[%s] adalah null", + "ORG_ZSTACK_IPSEC_VYOS_10009": "penerapan ke grup HA gagal karena %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10013": "Gagal melakukan panggilan HTTP ke semua instance Prometheus di lingkungan cloud.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10012": "tipe data tidak diketahui %s untuk kunci = %s", + "ORG_ZSTACK_ENCRYPT_10000": "gagal mengurai pesan API: tidak dapat mengurai parameter enkripsi dengan tipe %s", + "ORG_ZSTACK_ENCRYPT_10002": "gagal mengurai pesan API: ditemukan %d parameter enkripsi system tags, diharapkan 1", + "ORG_ZSTACK_IPSEC_VYOS_10001": "VYOS tidak mendukung AES-192 sebagai Algoritma Enkripsi IKE; opsi yang tersedia termasuk AES-128 dan AES-256.", + "ORG_ZSTACK_IPSEC_VYOS_10000": "CIDR jarak jauh [%s] tumpang tindih dengan CIDR antarmuka Virtual Router [%s]", + "ORG_ZSTACK_IPSEC_VYOS_10003": "vyos tidak mendukung %d sebagai Grup DH IKE", + "ORG_ZSTACK_IPSEC_VYOS_10002": "vyOS tidak mendukung AES-192 sebagai PolicyEncryptionAlgorithm; opsi yang tersedia adalah AES-128 dan AES-256, serta 3DES.", + "ORG_ZSTACK_COMPUTE_VM_10000": "status VM[uuid:%s] bukan dalam status Running; oleh karena itu, sinkronisasi jam tidak dapat dilakukan.", + "ORG_ZSTACK_COMPUTE_VM_10008": "vm[uuid:%s] adalah bagian dari klaster[uuid:%s], tetapi tidak ada host yang tersedia dalam klaster. Oleh karena itu, perubahan gambar untuk vm ini tidak dapat diproses.", + "ORG_ZSTACK_COMPUTE_VM_10007": "vm[uuid:%s] UUID klaster adalah null, tidak dapat mengubah gambar untuknya", + "ORG_ZSTACK_COMPUTE_VM_10006": "Status VM bukan Stopped: %s. Tindakan 'changevmimage' tidak dapat dilakukan.", + "ORG_ZSTACK_COMPUTE_VM_10005": "xml hook dengan UUID: %s terpasang ke VM dengan UUID: %s berhasil, tetapi gagal me-restart VM. Detail: %s", + "ORG_ZSTACK_COMPUTE_VM_10004": "xml hook dengan UUID: %s berhasil dilepas dari VM dengan UUID: %s, tetapi mengalami masalah saat restart VM. Detail: %s", + "ORG_ZSTACK_COMPUTE_VM_10003": "Hot-adding tidak dinonaktifkan; harap pastikan konfigurasi NUMA diset sebelum membuka mesin virtual.", + "ORG_ZSTACK_COMPUTE_VM_10011": "Parameter direction harus diset ke IN atau OUT.", + "ORG_ZSTACK_COMPUTE_VM_10010": "tidak dapat menemukan backup storage, tidak dapat melakukan commit volume snapshot[psUuid:%s] sebagai image, UUID PS tujuan diperlukan:%s", + "ORG_ZSTACK_COMPUTE_VM_10018": "Validasi state gagal selama operasi perubahan kata sandi.%s", + "ORG_ZSTACK_COMPUTE_VM_10017": "tidak ditemukan host tujuan di database berdasarkan UUID: %s, tidak dapat mengirimkan perintah perubahan kata sandi ke host!", + "ORG_ZSTACK_STORAGE_DEVICE_10036": "pemindaian hba gagal: %s", + "ORG_ZSTACK_COMPUTE_VM_10015": "UUID host vm [%s] adalah null, tidak dapat menyinkronkan kualitas layanan jaringan", + "ORG_ZSTACK_COMPUTE_VM_10014": "vm [%s] harus dalam status Running atau Paused untuk menyinkronkan pengaturan QoS NIC", + "ORG_ZSTACK_STORAGE_DEVICE_10031": "instance vm[uuid: %s] host[uuid: %s] gagal memasang scsi lun[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10013": "outboundBandwidth harus diset tidak lebih dari %s.", + "ORG_ZSTACK_COMPUTE_VM_10012": "inboundBandwidth harus diset tidak lebih dari %s Gbps.", + "ORG_ZSTACK_STORAGE_DEVICE_10030": "instance vm[%s] status [%s] tidak berada dalam status yang diizinkan untuk operasi yang ditentukan[%s]", + "ORG_ZSTACK_COMPUTE_VM_10022": "Gagal mengatur tingkat keamanan karena fitur keamanan dinonaktifkan. Harap pastikan fitur keamanan diaktifkan sebelum melakukan konfigurasi ini.", + "ORG_ZSTACK_COMPUTE_VM_10020": "Jumlah volume data melebihi batas yang ditentukan [num: %s]. Harap kurangi jumlah volume data saat membuat mesin virtual.", + "ORG_ZSTACK_STORAGE_DEVICE_10028": "SCSI LUN yang ditentukan [WWID: %s] tidak ada atau dinonaktifkan", + "ORG_ZSTACK_STORAGE_DEVICE_10029": "scsi[%s] lun[wwid:%s] telah dipasang ke vm[%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10026": "Konfigurasi iSCSI berbeda ditemukan pada host [UUID:%s, targets:%s] dan host [UUID:%s, targets:%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10027": "Jenis disk berbeda ditemukan di seluruh host untuk LUN [serial:%s], tidak dapat melampirkannya ke cluster", + "ORG_ZSTACK_COMPUTE_VM_10029": "tidak dapat mengkloning VM karena awalan ditentukan untuk jaringan[uuid:%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10024": "Rekaman SCSI LUN [%(s)s] tidak ditemukan di host [%(s)s]", + "ORG_ZSTACK_COMPUTE_VM_10028": "tidak dapat mengkloning vm karena alamat IPv6[%s] tidak valid", + "ORG_ZSTACK_STORAGE_DEVICE_10025": "jenis hypervisor tidak terduga[%s] untuk host mesin virtual [%s]", + "ORG_ZSTACK_COMPUTE_VM_10027": "tidak dapat mengkloning VM karena netmask ditentukan untuk jaringan[uuid:%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10022": "target NVMe berbeda ditemukan pada host[hostUuid:%s, targets:%s] dan host[hostUuid:%s, targets:%s]", + "ORG_ZSTACK_COMPUTE_VM_10026": "tidak dapat mengkloning vm karena alamat IP yang ditentukan[%s] tidak valid", + "ORG_ZSTACK_STORAGE_DEVICE_10023": "SCSI LUN[%s] dipasang pada mesin virtual [%s]", + "ORG_ZSTACK_COMPUTE_VM_10025": "tidak dapat mengkloning VM karena jaringan Lapisan 3[uuid:%s] tidak ditemukan", + "ORG_ZSTACK_STORAGE_DEVICE_10020": "instance vm[%s] status[%s] tidak berada dalam status yang diizinkan untuk operasi[%s]", + "ORG_ZSTACK_COMPUTE_VM_10024": "Kode tingkat keamanan tidak diketahui[%s], nilai yang didukung adalah [0-7]", + "ORG_ZSTACK_STORAGE_DEVICE_10021": "instance vm[%s] gagal memasang scsi lun[uuid: %s] pada host[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10023": "Tidak dapat mengatur tingkat keamanan untuk VM yang tidak diaktifkan [uuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10002": "Penyimpanan utama saat ini %s tidak memiliki token pihak ketiga yang dikonfigurasi, dan karena itu volume blok tidak dapat dibuat sementara", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10001": "URL sumber daya virtual yang dialokasikan tidak valid:%s", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10000": "Alokasi URL gagal. Harap pastikan URL benar dan tersedia. Jika masalah berlanjut, hubungi dukungan untuk bantuan lebih lanjut.", + "ORG_ZSTACK_STORAGE_DEVICE_10017": "scsi lun[wwid:%s] telah dipasang ke vm[%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10015": "scisLun[uuids:%s] tidak dipasang ke cluster host[uuid:%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10016": "harap lepaskan semua perangkat blok yang terkait dengan VM[%s] dan coba lagi", + "ORG_ZSTACK_STORAGE_DEVICE_10014": "scsi lun[wwid: %s] telah dipasang ke instance mesin virtual %s", + "ORG_ZSTACK_STORAGE_DEVICE_10011": "Server iSCSI [UUID: %s] tidak terkait dengan cluster [UUID: %s]", + "ORG_ZSTACK_STORAGE_DEVICE_10012": "Server iSCSI [UUID: %s] masih terhubung dengan klaster [UUID: %s]", + "ORG_ZSTACK_STORAGE_DEVICE_10010": "Server iSCSI [UUID: %s] sudah terhubung dengan klaster [UUID: %s]", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10008": "CIDR lokal dan CIDR jarak jauh harus merupakan rentang Cidr yang valid!", + "ORG_ZSTACK_NETWORK_SERVICE_HEADER_NFVINSTGROUP_10000": "Kueri status klaster tidak didukung untuk jenis instance NFV ini.", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10001": "VPN Gateway [%s] sudah ada, tidak dapat menghapus dari jarak jauh.", + "ORG_ZSTACK_STORAGE_DEVICE_10008": "Server iSCSI [IP: %s, Port: %s] sudah ada", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10005": "%s bukan alamat IPv4 yang valid untuk konfigurasi deployment cloud", + "ORG_ZSTACK_STORAGE_DEVICE_10009": "IP server iSCSI: %s tidak valid", + "ORG_ZSTACK_STORAGE_DEVICE_10006": "Server NVMe dengan UUID: %s sudah terhubung dengan klaster dengan UUID: %s", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10007": "CIDR jarak jauh harus merupakan notasi CIDR yang valid!", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10006": "localCidr harus merupakan Cidr yang valid!", + "ORG_ZSTACK_STORAGE_DEVICE_10004": "Server NVMe [ip: %s, port: %s, transport: %s] sudah ada di lingkungan cloud.", + "ORG_ZSTACK_STORAGE_DEVICE_10005": "IP Server NVMe: %s tidak valid", + "ORG_ZSTACK_STORAGE_DEVICE_10003": "tidak mendukung migrasi VM[uuid:%s] dengan penyimpanan bersama", + "ORG_ZSTACK_STORAGE_DEVICE_10000": "scsi lun dengan uuid: %s dan uuid: %s tidak berbagi host yang sama", + "ORG_ZSTACK_STORAGE_DEVICE_10001": "scsi lun [uuid: %s] berada dalam keadaan dinonaktifkan", + "ORG_ZSTACK_ALIYUN_NETWORK_VPN_10000": "VPN gateway dan user gateway harus berada di data center yang sama.", + "ORG_ZSTACK_IPSEC_VYOS_10016": "membuat ipsec ke ha route gagal karena %s", + "ORG_ZSTACK_IPSEC_VYOS_10015": "menghapus ipsec dari ha group gagal karena %s", + "ORG_ZSTACK_COMPUTE_BONDING_10001": "interface sudah dibuat di host", + "ORG_ZSTACK_COMPUTE_BONDING_10008": "kartu bonding tidak dapat memiliki interface dalam bond dengan kecepatan berbeda pada host[%s].", + "ORG_ZSTACK_COMPUTE_BONDING_10007": "tidak dapat memiliki interface[%s] dalam bond yang telah divirtualisasi SRIOV.", + "ORG_ZSTACK_COMPUTE_BONDING_10006": "tidak dapat memiliki interface dalam bond yang telah digunakan sebagai network bridge, yang sudah digunakan oleh host[%s].", + "ORG_ZSTACK_COMPUTE_BONDING_10005": "tidak dapat memiliki interface yang sudah digunakan dalam bond yang sudah digunakan oleh host[%s].", + "ORG_ZSTACK_IPSEC_VYOS_10012": "update ipsec version gagal karena:vpc[%s] tidak ada", + "ORG_ZSTACK_COMPUTE_BONDING_10009": "tidak ada slave network interface pada host[uuid:%s]", + "ORG_ZSTACK_IPSEC_VYOS_10013": "sinkronisasi ke HA group gagal karena:%s", + "ORG_ZSTACK_MEVOCO_10105": "Akun non-administrator tidak dapat menetapkan batas baca/tulis %s lebih besar dari: %s/%s", + "ORG_ZSTACK_SIMULATOR_10002": "Instance ditetapkan ke keadaan terputus", + "ORG_ZSTACK_MEVOCO_10104": "Akun non-admin tidak dapat menetapkan write [storage limit] sebagai tidak terbatas.", + "ORG_ZSTACK_MEVOCO_10103": "Akun non-admin tidak dapat menetapkan batas I/O baca menjadi tidak terbatas.", + "ORG_ZSTACK_MEVOCO_10102": "Akun non-administratif hanya diizinkan untuk mengonfigurasi batas %s baca/tulis.", + "ORG_ZSTACK_MEVOCO_10109": "UUID host vm [%s] adalah null, tidak dapat menyinkronkan kualitas layanan volume", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10016": "Tes koneksi FiSecClientFactory gagal", + "ORG_ZSTACK_MEVOCO_10108": "vm [%s] harus dalam status Berjalan atau Dijeda untuk menyinkronkan kualitas layanan volume", + "ORG_ZSTACK_MEVOCO_10107": "volume [%s] tidak terpasang pada mesin virtual mana pun (atau mesin virtual tidak ada), tidak dapat menyinkronkan kualitas layanan volume", + "ORG_ZSTACK_SIMULATOR_10004": "Kesalahan \"on purpose\" menunjukkan tindakan yang disengaja, bukan kegagalan sistem. Harap berikan detail lebih lanjut tentang tujuan yang dimaksud untuk melanjutkan.", + "ORG_ZSTACK_MEVOCO_10106": "volume [%s] tidak terpasang pada mesin virtual mana pun; oleh karena itu, kualitas layanan (QoS) tidak dapat diambil melalui forceSync.", + "ORG_ZSTACK_MEVOCO_10101": "Akun non-administrator tidak dapat menetapkan batas total %s lebih besar dari: %s", + "ORG_ZSTACK_MEVOCO_10100": "Akun non-admin tidak dapat menetapkan batas total %s menjadi tak terbatas.", + "ORG_ZSTACK_COMPUTE_BONDING_10011": "Tidak dapat melakukan binding dengan antarmuka yang dikonfigurasi dengan alamat IP VTEP. Harap pastikan IP VTEP dikonfigurasi dengan benar dan dapat dijangkau.", + "ORG_ZSTACK_COMPUTE_BONDING_10010": "Tidak dapat melakukan binding dengan antarmuka yang sesuai dengan jaringan manajemen. Harap pastikan antarmuka jaringan virtual dikonfigurasi dengan benar dan sesuai dengan jaringan manajemen yang ditentukan.%s", + "ORG_ZSTACK_COMPUTE_BONDING_10015": "Kartu bonding tidak dapat memiliki antarmuka[%s] yang telah divirtualisasi SR-IOV", + "ORG_ZSTACK_COMPUTE_BONDING_10014": "Kartu bonding tidak dapat memiliki antarmuka yang telah digunakan sebagai jembatan jaringan, yang sudah digunakan oleh host[%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10013": "Kartu bonding tidak dapat memiliki antarmuka yang sudah digunakan yang sudah digunakan oleh host[%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10012": "tidak dapat memiliki antarmuka dalam bond yang tidak berada pada host yang sama[%s].", + "ORG_ZSTACK_COMPUTE_BONDING_10019": "[bonding] tidak dapat memiliki [%s] antarmuka, harus antara 1 dan 2", + "ORG_ZSTACK_COMPUTE_BONDING_10018": "[kartu bonding] tidak dapat memiliki [jumlah antarmuka] diatur ke [%s], harus berupa angka antara [1~8].", + "ORG_ZSTACK_COMPUTE_BONDING_10017": "Antarmuka bonding [%s] tidak dapat menentukan xmit_hash_policy yang berbeda, hanya mode 802.3ad yang mendukung penentuan kebijakan yang berbeda.", + "ORG_ZSTACK_COMPUTE_BONDING_10016": "Kartu bonding tidak dapat memiliki antarmuka dengan kecepatan berbeda pada host[%s]", + "ORG_ZSTACK_MEVOCO_10113": "Volume[UUID:%s] menggunakan protokol vhost-user, yang tidak kompatibel dengan I/O asinkron asli. Harap nonaktifkan aio.native atau pilih protokol volume yang berbeda.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10003": "gagal建立 koneksi ke sumber daya pool rahasia[uuid: %s]", + "ORG_ZSTACK_MEVOCO_10112": "Versi lisensi saat ini tidak mendukung modifikasi konfigurasi global ini [nama:%s].", + "ORG_ZSTACK_MEVOCO_10111": "gagal melepaskan volume yang dapat dibagikan dari VMInstance: [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10005": "Inisialisasi klien %s gagal: properti pool sumber daya rahasia tidak valid.", + "ORG_ZSTACK_MEVOCO_10110": "gagal melepaskan volume yang dapat dibagikan[uuid:%s] dari Instance[uuid:%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10006": "Plugin (UUID: %s) tidak dapat dihapus karena dikaitkan dengan pool sumber daya rahasia berikut: [%s].", + "ORG_ZSTACK_MEDIATOR_10005": "VIP [UUID:%s] sudah terikat dengan layanan lain [%s].", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10007": "ID organisasi[uuid:%s] sudah memiliki atribut operasi, tidak dapat menambahkan %s", + "ORG_ZSTACK_MEDIATOR_10006": "Rentang port saat ini [%s, %s] bentrok dengan rentang port layanan sistem [%s, %s] untuk VIP [UUID: %s] protokol: %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10008": "tidak dapat menemukan zona dengan uuid:%s", + "ORG_ZSTACK_MEDIATOR_10007": "Rentang port saat ini [%s, %s] bentrok dengan rentang port yang digunakan [%s, %s] untuk VIP [UUID: %s] protokol: %s", + "ORG_ZSTACK_COMPUTE_VM_10080": "vm[uuid:%s] pengulangan ID perangkat CD-ROM", + "ORG_ZSTACK_COMPUTE_VM_10077": "VM[uuid:%s] telah memasang ISO[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10074": "memori yang dipesan[%s] melebihi ukuran memori yang tersedia[%s]", + "ORG_ZSTACK_COMPUTE_VM_10073": "Pengaturan CPU dan memori yang tidak terduga. Harap pastikan nilai yang ditentukan kompatibel dengan jenis instance dan persyaratan Anda.", + "ORG_ZSTACK_COMPUTE_VM_10071": "gagal menemukan host untuk vm[uuid=%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10000": "virtual ID[uuid:%s] sudah memiliki atribut terkait administrasi; oleh karena itu, tidak dapat ditugaskan %s.", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10000": "zona identitas [%s] sudah ada, uuid: %s", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10001": "regionId: [%s] bukan region Aliyun dan ZStack yang valid, harap pilih yang lain", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10002": "jenis [%s] tidak cocok dengan jenis pusat data yang diharapkan [%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10003": "project[uuid:%s] sudah memiliki administrator project yang ditunjuk", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10003": "UUID pusat data atau ID region harus diset, harap periksa parameter.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10004": "project[uuid:%s] tidak ada", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10004": "Zona Identitas [%s] masih melakukan sinkronisasi, harap tunggu.", + "ORG_ZSTACK_COMPUTE_VM_10079": "tidak ada rentang IP yang tersedia pada jaringan L3 [%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10005": "virtual ID [UUID:%s] sudah memiliki atribut operator project yang ditugaskan.", + "ORG_ZSTACK_COMPUTE_VM_10078": "Semua CD-ROM VM[UUID:%s] telah memasang gambar ISO", + "ORG_ZSTACK_COMPUTE_VM_10090": "Gagal membuat instans volume karena host VM [UUID: %s] dan penyimpanan primer yang dialokasikan [UUID: %s] tidak terhubung.", + "ORG_ZSTACK_COMPUTE_VM_10088": "keadaan vm saat ini[%s], mengubah virtio memerlukan vm berada dalam keadaan[%s]", + "ORG_ZSTACK_COMPUTE_VM_10084": "tidak dapat menemukan ISO [UUID:%s] di penyimpanan cadangan terhubung manapun yang terkait dengan zona [UUID:%s]. Harap verifikasi hal berikut:", + "ORG_ZSTACK_COMPUTE_VM_10083": "1. Pastikan penyimpanan cadangan terpasang pada zona yang benar tempat VM [NAME: %s, UUID:%s] berjalan.", + "ORG_ZSTACK_COMPUTE_VM_10081": "2. Konfirmasi penyimpanan cadangan dalam keadaan aktif; jika tidak, coba hubungkan kembali.", + "ORG_ZSTACK_KVM_HYPERVISOR_10000": "tidak ada penyimpanan primer yang ditentukan%s tersedia", + "ORG_ZSTACK_COMPUTE_VM_10099": "pembuatan bergantung pada cache gambar[uuid:%s, terletak pada ps uuids: [%s]], tidak dapat membuat di tempat lain.", + "ORG_ZSTACK_COMPUTE_VM_10098": "Gagal mengumpulkan informasi virtualisasi host", + "ORG_ZSTACK_COMPUTE_VM_10097": "Tidak dapat beralih ke jaringan L3. Jaringan L3 [uuid:%s] termasuk ke jaringan L2 [uuids:%s] yang belum terpasang pada klaster manapun.", + "ORG_ZSTACK_COMPUTE_VM_10096": "Tidak dapat beralih ke jaringan L3. Jaringan L3 yang ditentukan [uuid:%s] termasuk ke jaringan L2 yang berbeda [uuids:%s].", + "ORG_ZSTACK_COMPUTE_VM_10094": "tidak dapat beralih ke jaringan L3. Jaringan L3 yang ditentukan [uuid:%s] tidak memiliki rentang IP yang dikonfigurasi.", + "ORG_ZSTACK_COMPUTE_VM_10093": "tidak dapat beralih ke jaringan L3. VM [uuid: %s] tidak dalam keadaan Running atau Stopped; keadaan saat ini adalah %s", + "ORG_ZSTACK_COMPUTE_VM_10092": "Tidak dapat mengambil tangkapan layar VM [uuid:%s] yang tidak dalam keadaan Berjalan.", + "ORG_ZSTACK_MEDIATOR_10002": "tidak dapat memasang jaringan Layer 3. CIDR jaringan L3 [%s] yang akan dipasang tumpang tindih dengan CIDR jaringan L3 [%s] yang sudah terpasang pada VM", + "ORG_ZSTACK_MEDIATOR_10003": "VM[name:%s, UUID:%s] sudah memiliki aturan penerusan port%s yang dikonfigurasi", + "ORG_ZSTACK_MEDIATOR_10004": "VM[name:%s, uuid:%s] sudah memiliki alamat Elastic IP%s yang terpasang", + "ORG_ZSTACK_COMPUTE_VM_10033": "tidak dapat mengkloning VM karena ukuran default L3 UUID bukan 1", + "ORG_ZSTACK_COMPUTE_VM_10032": "tidak dapat mengkloning vm karena keadaan[%s] tidak valid", + "ORG_ZSTACK_COMPUTE_VM_10031": "tidak dapat mengkloning vm karena tipe driver[%s] tidak valid", + "ORG_ZSTACK_COMPUTE_VM_10030": "tidak dapat mengkloning vm karena NicType[%s] tidak valid", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10002": "Ditemukan jalur sampah terkait (%s) di Penyimpanan Primer [%s] untuk jalur instalasi migrasi [%s]. Harap bersihkan terlebih dahulu menggunakan 'APICleanUpTrashOnPrimaryStorageMsg' jika tetap ingin memigrasikan volume [%s].", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10000": "Tidak dapat menemukan host yang terhubung untuk melakukan operasi migrasi penyimpanan. Harap pastikan host target tersedia dan dikonfigurasi dengan benar di lingkungan cloud.", + "ORG_ZSTACK_COMPUTE_VM_10039": "Operasi ini hanya diizinkan pada instance VM pengguna.", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10003": "volume[uuid:%s] memiliki ketergantungan pada gambar[uuid:%s], ketergantungan lain termasuk gambar[%s]", + "ORG_ZSTACK_COMPUTE_VM_10038": "Antarmuka jaringan %s tidak terpasang pada VM", + "ORG_ZSTACK_COMPUTE_VM_10037": "Tidak ada kapasitas sumber daya yang cukup untuk pengkloningan VM ke VM [UUID: %s], volume [UUID: %s] pada penyimpanan primer [UUID: %s]. Kapasitas yang diperlukan adalah %s byte, sementara kapasitas yang tersedia saat ini adalah %s byte.", + "ORG_ZSTACK_COMPUTE_VM_10036": "pembuatan VM cepat hanya mendukung pengkloningan volume data pada penyimpanan primer yang sama [UUID: %s] dengan VM asli [UUID: %s].", + "ORG_ZSTACK_COMPUTE_VM_10035": "pembuatan VM cepat hanya mendukung pengkloningan volume root pada penyimpanan primer yang sama [UUID: %s] dengan VM asli [UUID: %s].", + "ORG_ZSTACK_COMPUTE_VM_10034": "Operasi ini hanya diizinkan pada instance VM pengguna.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10005": "Jika jenis klaster adalah baremetal, jenis hipervisor juga harus baremetal; sebaliknya, jika jenis hipervisor adalah baremetal, jenis klaster harus baremetal.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10008": "Ada host dalam klaster [uuid:%s] dalam keadaan Pra-Pemeliharaan; oleh karena itu, pembaruan OS tidak dimungkinkan saat ini.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10009": "Tidak semua host dalam klaster [uuid:%s] dalam keadaan Aktif; oleh karena itu, hak sistem operasi klaster tidak dapat diperbarui saat ini.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10006": "Hanya sistem operasi mesin virtual berbasis KVM yang dapat diperbarui saat ini.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10007": "Host [UUID: %s] bukan anggota klaster [UUID: %s]. Harap verifikasi UUID host dan pastikan milik klaster ini.", + "ORG_ZSTACK_COMPUTE_VM_10044": "Jangan ubah gambar VM ketika tidak dalam keadaan berhenti.", + "ORG_ZSTACK_COMPUTE_VM_10043": "pengguna tidak memiliki hak istimewa untuk mengubah gambar VM %s", + "ORG_ZSTACK_COMPUTE_VM_10042": "lalu lintas bersih tidak didukung untuk tipe VM [%s]", + "ORG_ZSTACK_COMPUTE_VM_10041": "Alamat MAC duplikat [%s]", + "ORG_ZSTACK_COMPUTE_CLUSTER_10000": "akses memori tidak boleh dibagikan jika halaman besar dinonaktifkan di klaster [uuid: %s]. Harap aktifkan halaman besar menggunakan UpdateResourceConfig [category=%s name=%s value=%s resourceUuid=%s] terlebih dahulu.", + "ORG_ZSTACK_COMPUTE_VM_10040": "Operasi ini hanya diizinkan ketika keadaan VM [%s] berhenti.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10001": "halaman besar tidak boleh dinonaktifkan jika mode akses memori disetel ke bersama di klaster [uuid:%s]. Harap perbarui mode akses memori menggunakan UpdateResourceConfig [category=%s name=%s value=%s resourceUuid=%s] terlebih dahulu.", + "ORG_ZSTACK_COMPUTE_VM_10049": "UUID atau Akun Cloud atau Token Autentikasi harus ditentukan.%s", + "ORG_ZSTACK_COMPUTE_VM_10048": "instance[uuid:%s] tidak dapat diubah ke image[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10047": "vm[uuid:%s] tidak memiliki jaringan L3 default, sehingga tidak dapat mengubah imagenya.", + "ORG_ZSTACK_COMPUTE_VM_10046": "Pastikan VM host terakhir [UUID:%s] dalam keadaan Running dan Connected", + "ORG_ZSTACK_COMPUTE_VM_10045": "Pastikan mesin penyimpanan utama virtual [UUID:%s] diaktifkan dan terhubung.", + "ORG_ZSTACK_IAM2_CONTAINER_10009": "gagal membuka file konfigurasi Kubernetes: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10007": "Gagal mengambil proyek yang diizinkan karena konten null", + "ORG_ZSTACK_COMPUTE_VM_10055": "Parameter 'uuids' harus mereferensikan entitas VmInstanceVO atau HostVO.", + "ORG_ZSTACK_IAM2_CONTAINER_10008": "gagal menemukan konfigurasi Kubernetes di path: %s", + "ORG_ZSTACK_COMPUTE_VM_10054": "nic id: %s tidak ada dalam konfigurasi jaringan virtual...", + "ORG_ZSTACK_IAM2_CONTAINER_10005": "Gagal mengambil tag image karena respons halaman null. Silakan periksa endpoint API tag image dan pastikan dikonfigurasi dengan benar.", + "ORG_ZSTACK_COMPUTE_VM_10053": "Kartu antarmuka jaringan tidak mendukung penerapan pengaturan Quality of Service (QoS) secara bersamaan dengan layanan Port Mirroring.", + "ORG_ZSTACK_IAM2_CONTAINER_10006": "Gagal mengambil image karena konten null.%s", + "ORG_ZSTACK_COMPUTE_VM_10052": "Bandwidth keluar dan bandwidth masuk harus ditentukan untuk setidaknya satu arah.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10008": "Grup akses yang terkait sudah: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10003": "gagal menyiapkan klaster tercontainerisasi untuk proyek[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10051": "Jumlah Monitor harus salah satu dari berikut: 1, 2, atau 4.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10007": "Target mount NAS [%s] sudah ada di filesystem: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10004": "Gagal mengambil tag image karena konten null.%s", + "ORG_ZSTACK_COMPUTE_VM_10050": "arah harus ditetapkan dalam (in, out), tetapi adalah %s", + "ORG_ZSTACK_IAM2_CONTAINER_10001": "gagal memperbarui quota untuk container %s", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10009": "aturan grup akses [%s] sudah ada dalam grup akses [%s]", + "ORG_ZSTACK_IAM2_CONTAINER_10002": "gagal menyiapkan container proyek[uuid: %s], karena proyek tidak ditemukan di database", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10003": "domain mount tidak valid setelah %d milidetik, menghapusnya...", + "ORG_ZSTACK_IAM2_CONTAINER_10000": "gagal memperbarui quota proyek[uuid: %s] di sisi container karena kesalahan tak terduga", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10006": "Tidak ada grup akses NAS yang tersedia; silakan buat setidaknya satu.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10005": "tidak ada target mount [%s] di NAS: %s", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10000": "tidak ada filesystem [%%s] ditemukan di region: %%s", + "ORG_ZSTACK_COMPUTE_VM_10059": "Tidak ditemukan preferensi akun. Silakan kirim perintah perubahan kata sandi ke host mesin virtual!", + "ORG_ZSTACK_COMPUTE_VM_10058": "Tidak ditemukan host tujuan di database; tidak dapat mengirim perintah perubahan kata sandi ke host!", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10002": "Beberapa penyimpanan utama [%%s] terkait dengan NAS ini; silakan hapus penyimpanan utama sebelum menghapusnya.", + "ORG_ZSTACK_COMPUTE_VM_10057": "hanya host dengan UUID(s): %s yang dapat mengakses volume data.", + "ORG_ZSTACK_COMPUTE_VM_10056": "resource[UUIDs:%s] tidak dikelola oleh account[UUID:%s]", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10001": "sistem file NAS sudah ada di datacenter: %s", + "ORG_ZSTACK_COMPUTE_VM_10063": "Kata sandi yang diberikan tidak memenuhi persyaratan kompleksitas. Harus mengandung setidaknya satu angka, satu karakter huruf besar, satu karakter huruf kecil, dan satu karakter khusus.", + "ORG_ZSTACK_COMPUTE_VM_10062": "panjang kata sandi harus [%s-%s karakter]", + "ORG_ZSTACK_COMPUTE_VM_10061": "disk tidak mendukung pemasangan. tipe disk adalah %s", + "ORG_ZSTACK_COMPUTE_VM_10060": "Parameter disk AO salah. Anda perlu mengatur salah satu properti berikut: ukuran, UUID template, UUID disk offering, atau UUID sumber-tipe sumber. Hanya satu dari properti ini yang harus ditentukan.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10010": "grup akses [%s] sudah ada di datacenter [%s]", + "ORG_ZSTACK_COMPUTE_VM_10068": "tidak ada tipe antarmuka jaringan yang tersedia pada jaringan L3 [%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10015": "Tidak dapat membuat mesin virtual sekunder karena mesin virtual utama dalam keadaan berhenti. Harap mulai mesin virtual utama sebelum membuat mesin virtual sekunder.", + "ORG_ZSTACK_COMPUTE_SRIOV_10014": "SR-IOV dan VFHA tidak dapat diaktifkan secara bersamaan untuk memasang jaringan L3 ke VM. Harap pastikan hanya satu dari opsi ini yang dikonfigurasi.", + "ORG_ZSTACK_COMPUTE_SRIOV_10015": "Tidak dapat mengubah antarmuka jaringan fungsi virtual ke tipe standar", + "ORG_ZSTACK_FAULTTOLERANCE_10013": "Tugas pengumpulan sampah toleransi kesalahan lainnya sedang berjalan. Harap batalkan tugas baru dan tunggu hingga selesai.", + "ORG_ZSTACK_COMPUTE_SRIOV_10016": "Tidak dapat mengubah antarmuka jaringan ke tipe VF. Harap pastikan instance target mendukung jaringan vf.", + "ORG_ZSTACK_COMPUTE_SRIOV_10017": "antarmuka jaringan vm dengan UUID:%s tidak ada", + "ORG_ZSTACK_FAULTTOLERANCE_10011": "grup mesin virtual toleransi kesalahan hilang", + "ORG_ZSTACK_FAULTTOLERANCE_10010": "Tidak dapat memigrasikan VM utama ft[uuid:%s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10019": "hanya SR-IOV yang didukung", + "ORG_ZSTACK_MONITORING_MEDIA_10001": "Gagal membuat koneksi ke server SMTP di host: %s, port: %d. Harap verifikasi kebenaran pengaturan smtpServer dan smtpPort.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10038": "Tubuh kondisi tidak dapat mendukung nilai null atau array JSON!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10037": "Hanya mendukung Fungsi Template ZStack di bidang 'Condition'!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10036": "Nilai harus bertipe boolean di bidang 'Condition'", + "ORG_ZSTACK_MONITORING_MEDIA_10000": "Masalah mungkin disebabkan oleh ID kunci akses atau kunci akses rahasia yang salah atau izin IAM yang tidak mencukupi untuk pengguna yang ditentukan. Harap verifikasi kredensial Anda dan pastikan pengguna memiliki izin yang diperlukan di lingkungan komputasi awan Anda.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10035": "Kunci kondisi: %s hanya mendukung 1 elemen dalam objek JSON nilai, tetapi %d elemen yang diberikan!", + "ORG_ZSTACK_FAULTTOLERANCE_10019": "Gagal melakukan failover. VM utama tidak diketahui dan tidak ada alamat jaringan toleransi kesalahan yang tersedia. Harap periksa konfigurasi Anda.", + "ORG_ZSTACK_FAULTTOLERANCE_10018": "pvm[uuid:%s] tidak ada", + "ORG_ZSTACK_FAULTTOLERANCE_10017": "tidak dapat failover vm[uuid:%s]. Grup mesin virtual toleransi kesalahan terkait tidak ada", + "ORG_ZSTACK_COMPUTE_SRIOV_10012": "vm nic [uuid:%s] sudah bertipe %s; tidak perlu diubah", + "ORG_ZSTACK_FAULTTOLERANCE_10016": "Pembuatan SVM berhasil, tetapi terjadi kesalahan selama permintaan mulai VM sekunder. Harap periksa konfigurasi SVM dan pastikan semua prasyarat untuk memulai VM sekunder terpenuhi.", + "ORG_ZSTACK_COMPUTE_SRIOV_10013": "Ubah tipe antarmuka jaringan mesin virtual hanya saat mesin tersebut berhenti.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10009": "Autentikasi dua faktor gagal karena tidak ada token dalam tag sistem msg.%s", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10008": "Autentikasi dua faktor gagal karena pesan tidak berisi tag sistem.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10004": "Autentikasi dua faktor tidak diaktifkan untuk akun Anda. Silakan aktifkan untuk melanjutkan.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10001": "Jenis Akun Tidak Didukung: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10026": "Port VM Toleran Kesalahan Tidak Ditemukan", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10011": "Gagal memverifikasi kode autentikasi dua faktor untuk sumber daya virtual %s. Silakan periksa kode Anda dan coba lagi.", + "ORG_ZSTACK_DAHO_CORE_10003": "Membuat tugas Daho VLL gagal! Pastikan semua file sumber diunggah dengan benar dan dapat diakses di lingkungan cloud.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10010": "Autentikasi dua faktor gagal karena tidak ada rahasia yang didefinisikan untuk %s:%s", + "ORG_ZSTACK_FAULTTOLERANCE_10024": "Tidak dapat memulai mesin virtual sekunder karena mesin virtual utama dalam keadaan berhenti. Silakan mulai mesin virtual utama terlebih dahulu.", + "ORG_ZSTACK_DAHO_CORE_10004": "Tidak ditemukan akun Alibaba Cloud untuk accountUuid: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10022": "Tidak dapat menemukan IP yang tersedia dari jaringan toleran kesalahan saat ini. Silakan verifikasi bahwa konfigurasi global [kategori: Toleransi Kesalahan, nama: fault.tolerance.network.cidr] sudah diatur dengan benar, dan pastikan host [uuid:%s] memiliki alamat IP dalam rentang CIDR yang ditentukan.", + "ORG_ZSTACK_FAULTTOLERANCE_10021": "Terjadi pengecualian yang tidak terduga selama manajemen sumber daya cloud. Silakan periksa parameter input Anda dan pastikan berada dalam rentang yang valid. Jika masalah berlanjut, pertimbangkan untuk meninjau konfigurasi lingkungan komputasi cloud atau hubungi dukungan untuk bantuan lebih lanjut.", + "ORG_ZSTACK_DAHO_CORE_10007": "Kebijakan expire: %s bukan konfigurasi yang valid", + "ORG_ZSTACK_FAULTTOLERANCE_10020": "Gagal melakukan failover. VM sekunder tidak diketahui dan tidak ada alamat jaringan toleran kesalahan yang tersedia. Silakan periksa konfigurasi Anda.", + "ORG_ZSTACK_DAHO_CORE_10008": "vlanId[%s] sudah ada!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10026": "Bobot CfnRootDecoder harus antara 0-100, di mana 0 menunjukkan decoding prioritas dan nilai defaultnya adalah 50.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10025": "Parameter body root harus berupa objek JSON!", + "ORG_ZSTACK_COMPUTE_SRIOV_10020": "%s tidak mendukung SRIOV", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10024": "Type diperlukan untuk Parameter, tetapi tidak ditemukan di %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10021": "Tag enableSRIOV tidak didukung untuk jenis VM [%s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10022": "gagal melakukan pra-penanganan antarmuka jaringan virtual sebelum memigrasi VM[uuid:%s] ke host[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10028": "nomor port yang dialokasikan lebih kecil dari yang diminta untuk nic [uuid: %s] pada host [uuid: %s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10023": "gagal melakukan pasca-penanganan antarmuka jaringan virtual setelah memigrasi VM[uuid:%s] ke host[uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10029": "Body nilai pemetaan tidak mendukung array JSON! Pastikan nilai pemetaan adalah tipe skalar atau kompleks yang didukung oleh platform komputasi cloud Anda.", + "ORG_ZSTACK_FAULTTOLERANCE_10027": "gagal mengalokasikan port untuk nic[uuid: %s] pada host[uuid: %s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10028": "tidak dapat menemukan pesan: %s untuk membuat sumber daya", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10030": "Body nilai pemetaan tidak dapat mendukung nilai null! Pastikan semua body nilai pemetaan diinisialisasi.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10031": "mappingName harus ditemukan dalam hasil CloudFormation JSON atau akan dianggap tidak valid.", + "ORG_ZSTACK_FAULTTOLERANCE_10037": "Tidak dapat fail-over VM[uuid:%s] karena grup VM toleran kesalahan tidak dalam salah satu status berikut: [%s, %s]", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10005": "tidak dapat melampirkan L2VirtualSwitchNetwork karena tidak ada host di cluster[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10036": "Tidak dapat melakukan fail-over VM[UUID:%s], pastikan ini adalah grup VM fault-tolerant.", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10006": "tidak dapat menghubungkan L2 Virtual Switch Network karena interface[%s] harus dibuat di host[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10035": "Tidak dapat melakukan fail over VM[UUID:%s], pastikan failover diaktifkan di GlobalConfig.", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10007": "tidak dapat membuat layer 3 network pada virtual switch[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10034": "tidak dapat menghapus L3 network [uuid:%s]. VM Fault-tolerant [%s] masih dalam keadaan [%s, %s]. Harap hentikan VM fault-tolerant terkait sebelum mencoba menghapus L3 network.", + "ORG_ZSTACK_FAULTTOLERANCE_10033": "image[uuid:%s] masih digunakan oleh VM fault-tolerance[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10004": "tidak dapat menemukan KVM host yang terhubung untuk melakukan operasi; tampaknya semua host di cluster yang dilampirkan dengan shared block group storage [uuid:%s] terputus.", + "ORG_ZSTACK_FAULTTOLERANCE_10032": "volume dengan index: %d dari pvm[uuid:%s] dan svm[uuid:%s] memiliki cache volume dengan ukuran berbeda; starting tidak diizinkan", + "ORG_ZSTACK_FAULTTOLERANCE_10031": "volume dengan index: %d dari pvm[uuid:%s] dan svm[uuid:%s] memiliki ukuran berbeda; starting tidak diizinkan", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10003": "tidak dapat membuat L2PortGroupNetwork karena L2VirtualSwitchNetwork[uuid:%s] sudah berisi L2PortGroupNetworks dengan vlanId[%s] yang sama", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10002": "KVM host yang volume[uuid%s]-nya terpasang kehilangan koneksi ke shared block storage group[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10030": "pvm[uuid:%s] dan svm[uuid:%s] nomor volume tidak cocok; starting tidak diizinkan.", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10004": "tidak dapat menghubungkan L2VirtualSwitchNetwork karena interface[%s] di cluster[uuid:%s] sudah digunakan oleh L2VirtualSwitchNetwork lain", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10001": "Tidak dapat menemukan volume untuk beroperasi di shared block group primary storage.%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10002": "Tidak ada virtual router yang dikonfigurasi untuk layanan VYOS DHCP.%s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10006": "shared volume tidak mendukung thin provisioning", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10001": "tidak dapat menambahkan entri DHCP ke virtual router VM[UUID:%s IP:%s] karena %s, entri DHCP[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10039": "operasi saat ini[API:%s] tidak didukung ketika FT VM[UUID:%s, state:%s] tidak dalam keadaan berhenti", + "ORG_ZSTACK_FAULTTOLERANCE_10038": "Tidak dapat melakukan pemeliharaan host karena FT VMs[%s] sedang dalam recovery", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10011": "vm[uuid:%s] tidak dalam keadaan Running, Paused, atau Stopped, keadaan saat ini[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10048": "tidak dapat memperbarui platform ft vm[uuid:%s], perlu menghentikan kedua vm dan memastikan keduanya dalam keadaan berhenti sebelum melanjutkan", + "ORG_ZSTACK_FAULTTOLERANCE_10047": "tidak dapat memperbarui ukuran memori ft vm[uuid:%s], karena memerlukan penghentian kedua vm", + "ORG_ZSTACK_FAULTTOLERANCE_10046": "tidak dapat memperbarui jumlah cpu ft vm[uuid:%s], perlu menghentikan kedua vm dan restart mereka", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10005": "L2 network tidak boleh memiliki nama interface yang sama dengan provision network yang sudah terpasang di cluster.", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10004": "Jangan tambahkan host ke BareMetal2 cluster.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10015": "Image dengan UUID [uuid: %s] dan nama [name: %s] tidak ditemukan di backup storage manapun.", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10003": "Arsitektur harus ditentukan saat membuat BareMetal2 cluster baru.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10014": "Image [UUID: %s, name: %s] tidak tersedia untuk didownload di backup storage manapun:", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10002": "1. Verifikasi bahwa image tidak dalam keadaan dihapus.", + "ORG_ZSTACK_FAULTTOLERANCE_10042": "2. Pastikan backup storage yang ditandai Ready untuk image ini terpasang di zone [UUID: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10013": "tidak didukung untuk snapshot merge online dari volume yang dapat dibagikan [uuid: %s] pada sharedblock", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10001": "Tidak dapat melampirkan penyimpanan lokal ke klaster baremetal. Pastikan klaster mendukung lampiran penyimpanan lokal.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10012": "Volume [UUID: %s] dilampirkan ke VM [UUID: %s] yang berada dalam keadaan %s; oleh karena itu, snapshot merge tidak dapat dilakukan.", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10000": "Tidak dapat melampirkan Ceph pihak ketiga dengan token ke klaster aarch64. Pastikan kompatibilitas versi Ceph dengan arsitektur klaster.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10017": "hosts[uuid:%s] memiliki UUID disk yang terkait dengan penyimpanan blok bersama, tetapi penyimpanan aktualnya berbeda.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10016": "tidak ada host yang terhubung ditemukan dalam klaster [uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10049": "operasi saat ini tidak didukung pada mesin virtual kelompok fault-tolerant [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_NETWORK_10004": "alamat mac %s sudah merupakan antarmuka budak bond", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10000": "tidak dapat memprogram entri DHCP yang disajikan oleh router virtual [uuid:%s, ip:%s], %s", + "ORG_ZSTACK_BAREMETAL_NETWORK_10003": "Alamat MAC %s tidak milik sasis dengan UUID %s", + "ORG_ZSTACK_BAREMETAL_NETWORK_10002": "Alamat budak %s tidak valid. Seharusnya dalam format alamat MAC yang dipisahkan dengan koma, seperti 6c:b3:11:1b:0b:1e,6c:b3:11:1b:0b:1f.", + "ORG_ZSTACK_BAREMETAL_NETWORK_10001": "nama bond %s sudah ada dalam konfigurasi jaringan virtual", + "ORG_ZSTACK_BAREMETAL_NETWORK_10000": "Membuat BM Bonding hanya diizinkan sebelum membuat BM Instance.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10022": "tidak dapat menemukan backup storage[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10058": "Tidak diizinkan alamat MAC sama [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10021": "status yang diharapkan adalah %s dan status saat ini adalah %s", + "ORG_ZSTACK_FAULTTOLERANCE_10057": "Ft jaringan tidak dikonfigurasi", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10020": "Operasi untuk mengonversi volume thin ke volume thick saat ini tidak didukung. Silakan lihat dokumentasi terbaru untuk opsi konversi volume yang tersedia.", + "ORG_ZSTACK_FAULTTOLERANCE_10056": "Gagal membuat virtual machine failover, harap aktifkan teknologi failover di GlobalConfig", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10001": "tidak dapat menemukan EIP IP tamu: %s di VM NIC IP: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10055": "Tidak dapat memigrasikan instance mesin virtual sekunder FT", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10002": "eip [uuid:%s] telah dihapus", + "ORG_ZSTACK_FAULTTOLERANCE_10054": "Tidak dapat memigrasikan instance VM primer FT", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10025": "QEMU2 shared volume[uuid:%s] tidak didukung", + "ORG_ZSTACK_FAULTTOLERANCE_10053": "operasi saat ini tidak didukung pada mesin virtual sekunder [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10024": "VM[uuid:%s] memiliki beberapa ISO dari penyimpanan primer yang berbeda: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10029": "Operasi ini hanya mendukung instance mesin virtual lengkap. Pastikan Anda menggunakan spesifikasi instance yang lengkap.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10027": "Tidak dapat menemukan host yang tersedia untuk mengambil snapshot untuk volume[uuid: %s] pada primary storage blok bersama[uuid: %s].", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10005": "either Elastic IP UUID atau Virtual IP UUID harus ditentukan", + "ORG_ZSTACK_FAULTTOLERANCE_10051": "operasi saat ini tidak didukung pada mesin virtual sekunder transfer file [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10006": "eip dengan uuid:%s tidak dalam keadaan aktif, lampiran ke vm nic tidak dimungkinkan", + "ORG_ZSTACK_FAULTTOLERANCE_10050": "operasi saat ini tidak didukung pada VM primer toleran kesalahan[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10003": "Tidak dapat melampirkan jaringan L3 [uuid:%s, name:%s] ke VM [uuid:%s, name:%s], karena jaringan L3 menyediakan Elastic IP (EIP) ke salah satu NIC VM", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10004": "vmNic [UUID:%s] tidak terlampir pada vmInstance dan karena itu tidak dapat mengambil EIP yang dapat dilampirkan", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10009": "eip dengan uuid: %s hanya dapat dilampirkan ketika keadaannya adalah %s, tetapi keadaannya saat ini adalah %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10007": "ip [uuid:%s] dikaitkan dengan vm nic [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10008": "eIP dengan UUID: %s telah dilampirkan ke VM NIC lain dengan UUID: %s dan tidak dapat dilampirkan kembali", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10033": "tidak dapat menemukan host KVM yang terhubung untuk melakukan operasi; tampaknya semua host yang terhubung dengan penyimpanan blok bersama [uuid:%s] terputus", + "ORG_ZSTACK_FAULTTOLERANCE_10069": "cluster[uuid:%s] ditentukan tetapi dinonaktifkan; oleh karena itu, VM tidak dapat dibuat darinya", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10032": "tidak dapat menemukan host yang terhubung ke penyimpanan utama dengan UUID: %s dan penyimpanan utama dengan UUID: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10068": "zone[uuid:%s] ditentukan tetapi dinonaktifkan; oleh karena itu, VM tidak dapat dibuat darinya", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10031": "Tidak dapat menemukan host yang tersedia untuk migrasi untuk volume[uuid: %s] pada penyimpanan utama grup blok bersama[uuid: %s] dan [uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10030": "Tidak dapat menemukan host yang tersedia untuk migrasi volume[uuid: %s] antara penyimpanan utama grup blok bersama[uuid: %s] dan [uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10037": "tidak dapat memperkecil snapshot %s karena mesin virtual %s tidak dalam keadaan Berjalan atau Berhenti", + "ORG_ZSTACK_FAULTTOLERANCE_10065": "Tidak dapat menambahkan UUID yang sama ke l3Network, UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10035": "tidak dapat memperkecil snapshot %s karena volume %s belum siap", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10038": "mendapatkan jalur instalasi null dalam snapshot untuk mesin virtual %s", + "ORG_ZSTACK_ALIYUN_BACKUP_10000": "Tidak ditemukan bucket penyimpanan untuk operasi cadangan. Pastikan bucket yang valid telah dikonfigurasi.%s", + "ORG_ZSTACK_FAULTTOLERANCE_10062": "image[uuid:%s] berformat: %s, hanya format valid yang dapat digunakan untuk membuat VM", + "ORG_ZSTACK_FAULTTOLERANCE_10061": "image[uuid:%s] berjenis media: %s; hanya template volume root yang dapat digunakan untuk membuat VM", + "ORG_ZSTACK_TICKET_IAM2_API_10004": "Satu kebijakan reservasi hanya dapat dikaitkan dengan satu koleksi alur", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10044": "Tidak ditemukan host yang terhubung untuk menarik snapshot pada penyimpanan utama[uuid:%s] untuk volume[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10020": "vip[uuid:%s] tidak dalam keadaan yang diharapkan[%s], keadaan saat ini adalah %s", + "ORG_ZSTACK_SNS_PLATFORM_MICROSOFTTEAMS_10000": "gagal mengirim pesan ke Microsoft Teams. status: %s, body: %s", + "ORG_ZSTACK_TICKET_IAM2_API_10003": "Diperlukan nama untuk membuat alur di lingkungan komputasi awan", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10043": "Tidak ditemukan host yang terhubung untuk melakukan snapshot pada penyimpanan utama[uuid:%s] untuk volume[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10079": "tidak dapat memulai vm[uuid:%s]. Tidak memiliki kartu antarmuka jaringan (NIC) yang terlampir, harap lampirkan NIC dan coba lagi", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10042": "jalur instalasi aktif %s gagal, karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10041": "snapshot anak aktif gagal karena %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10023": "UUID vmNic[%s] tidak diizinkan untuk menambahkan EIP karena sudah memiliki aturan Port Forwarding dengan CIDR yang diizinkan", + "ORG_ZSTACK_FAULTTOLERANCE_10077": "Mesin virtual toleran-gangguan saat ini dalam keadaan tidak diketahui dan tidak dapat dihentikan. Silakan coba melakukan failover manual.", + "ORG_ZSTACK_TICKET_IAM2_API_10008": "Nama sumber daya tidak boleh kosong. Harap berikan nama yang valid untuk sumber daya.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10048": "tag ukuran inisialisasi thin provisioning tidak valid [%s]", + "ORG_ZSTACK_TICKET_IAM2_API_10007": "judul peninjau tidak valid %s, nilai yang valid adalah %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10021": "jaringan l3 tamu dari vm nic[uuid:%s] dan jaringan l3 vip dari vip[uuid:%s] adalah jaringan yang sama", + "ORG_ZSTACK_TICKET_IAM2_API_10006": "Minimal satu flow diperlukan untuk membuat kumpulan flow.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10022": "Keadaan VM[%s] tidak diizinkan untuk melakukan operasi EIP. Harap tunggu proses VM selesai.", + "ORG_ZSTACK_TICKET_IAM2_API_10005": "Operasi peran Administrator atau IAM diperlukan sebagai peninjau alur kerja terakhir.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10045": "nonaktifkan installPath gagal karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10049": "ukuran inisialisasi thin provisioning tidak valid[%s], harus lebih besar dari atau sama dengan %s", + "ORG_ZSTACK_FAULTTOLERANCE_10073": "defaultL3NetworkUuid[uuid:%s] tidak ditemukan di l3NetworkUuids[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10071": "host[uuid:%s] ditentukan tetapi status koneksinya adalah %s, tidak dapat membuat VM darinya", + "ORG_ZSTACK_FAULTTOLERANCE_10070": "host[uuid:%s] ditentukan tetapi dinonaktifkan; oleh karena itu, VM tidak dapat dibuat darinya.", + "ORG_ZSTACK_TICKET_IAM2_API_10009": "UUID peninjau tidak boleh kosong", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10051": "thinProvisioningInitializeSize[%s] tidak valid melebihi batas maksimum %d", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10050": "thinProvisioningInitializeSize[%s] tidak valid, bukan nilai ukuran yang valid", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10055": "Host dengan UUID [uuid: %s] tidak tersedia untuk mengubah ukuran volume dengan UUID [uuid: %s] pada penyimpanan primer grup blok bersama dengan UUID [uuid: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10054": "tidak dapat menemukan host dengan penyimpanan blok terhubung untuk mengeksekusi perintah untuk penyimpanan primer grup blok bersama[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10053": "tidak dapat menemukan host yang tersedia untuk mengeksekusi perintah untuk penyimpanan primer grup blok bersama[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10052": "nilai[%s] bukan pangkat 2", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10012": "Alamat IP [uuid:%s] tidak termasuk dalam antarmuka jaringan [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10059": "tidak dapat menemukan klaster yang terpasang pada penyimpanan primer grup blok bersama [uuid: %S]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10058": "penyimpanan primer mount point bersama[uuid:%s, name:%s] tidak dapat menemukan host yang tersedia dalam klaster yang terpasang untuk menginstansiasi volume", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10013": "eip[uuid:%s] belum terpasang pada antarmuka jaringan mesin virtual mana pun", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10010": "antarmuka jaringan vm tidak memiliki IP yang digunakan yang kompatibel untuk EIP dengan UUID %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10057": "volume[uuid:%s] tidak ditemukan dalam kumpulan penyimpanan", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10011": "jaringan l3 tamu dari VM NIC dan jaringan l3 VIP dari EIP adalah jaringan yang sama [uuid:%s] dan [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10056": "penyimpanan primer [uuid:%s] tidak ditemukan", + "ORG_ZSTACK_TICKET_IAM2_API_10011": "ID virtual [UUID] tidak termasuk dalam proyek [UUID]", + "ORG_ZSTACK_TICKET_IAM2_API_10010": "tidak dapat menemukan pemetaan IAM-ke-VirtualID [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10017": "VM [UUID:%s] yang terkait dengan EIP sudah terhubung ke jaringan publik [UUID:%s], yang merupakan asal dari VIP [UUID:%s, Name:%s, IP:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10014": "Versi IP VIP [%d] berbeda dengan versi IP guest [%d].", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10015": "VIP[%s] berada dalam rentang IP guest [%s - %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10062": "SharedBlock primary storage [uuid:%s, name:%s] belum terpasang ke klaster compute manapun, atau tidak ada host yang terhubung di klaster yang terpasang.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10018": "VIP [UUID:%s] telah ditempati oleh entitas layanan jaringan lain [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10019": "EIP tidak dapat dibuat pada system VIP. Harap pastikan Anda menggunakan alamat IP publik untuk asosiasi EIP.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10047": "gagal mendapatkan hash image, karena:%s", + "ORG_ZSTACK_SNS_PLATFORM_FEISHU_10000": "gagal mengirim pesan ke FeiShu. status: %s, body: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10042": "UUID dari image store backup storage agent telah berubah [diharapkan: %s, aktual: %s]. Ini kemungkinan besar karena agen dimulai ulang secara manual. Harap lakukan reconnect untuk mensinkronkan status.", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10000": "Gagal mengambil informasi klaster Zaku, error: %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10002": "Gagal mengambil klaster zaku [id:%s], error: %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10001": "Gagal mengambil informasi klaster Zaku; konten response kosong. Harap periksa parameter permintaan dan konektivitas jaringan Anda.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10000": "tidak dapat menemukan quota untuk security group untuk project %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10004": "Gagal mengekstrak action ID dari response API", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10003": "Gagal mengambil klaster Zaku [id:%s], konten response kosong", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10006": "Gagal mem-parse response cloud: %s", + "ORG_ZSTACK_SNS_10015": "platformUuid dan endpointUuid tidak dapat ditentukan secara bersamaan. Harap periksa parameter input Anda.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10001": "Quota security group tidak boleh kurang dari 1. Harap sesuaikan pengaturan ke nilai minimal 1.", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10005": "Operasi async timed out setelah %d detik", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10004": "l3Uuid di label tidak konsisten dengan l3Uuid di parameter", + "ORG_ZSTACK_SNS_10013": "password tidak boleh null", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10003": "system tag diminta. perlu menentukan default security group untuk VM NIC dengan mengatur system tag L3_NETWORK_SECURITY_GROUP_UUIDS_REF dengan format l3::{%s}::SecurityGroupUuids::{%s}, karena security group dipaksa aktif", + "ORG_ZSTACK_SNS_10012": "username tidak boleh null", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10006": "Karena security group dipaksa aktif, securityGroupUuid di tag harus berada dalam project[%s].", + "ORG_ZSTACK_SNS_10011": "smtpPort tidak boleh null", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10005": "Owner [UUID: %s] dari security group [UUID: %s] termasuk ke IAM2 project lain.", + "ORG_ZSTACK_SNS_10010": "smtpServer tidak boleh null", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10008": "Security group default %s tidak dapat dihapus ketika fitur enforced security group diaktifkan.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10007": "nics yang terpasang ke l3Network [uuid:%s] terkait dengan security group. Sebelum melepaskan l3Network dari security group, Anda perlu melepaskan nics terlebih dahulu.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10039": "Lisensi komersial diperlukan untuk menggunakan layanan ImageStore di lingkungan cloud kami.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10009": "Grup keamanan %s ini terkait dengan mesin virtual, harap putuskan hubungannya sebelum melanjutkan.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10035": "penyimpanan gambar [%s] tidak dapat menambahkan gambar karena digunakan untuk cadangan jarak jauh", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10032": "penyimpanan cadangan[UUID:%s] tidak memiliki kapasitas[%s] yang cukup untuk mengekspor gambar mesin virtual", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10002": "router virtual[name: %s, uuid: %s] gagal menyinkronkan snat%s karena %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10031": "gambar[%s] tidak ditemukan pada penyimpanan cadangan[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10001": "l3Network tamu[uuid:%s, name:%s] membutuhkan layanan SNAT dari router virtual, tetapi l3Network publik[uuid:%s] yang terkait dengan penawaran router virtual[uuid: %s, name:%s] identik dengan l3Network tamu.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10020": "notifySugonSdn: gagal memberitahu Sugon SDN tentang vrouter untuk VM [uuid:%s] di host tujuan[uuid:%s], error adalah:%s", + "ORG_ZSTACK_SNS_10029": "pengidentifikasi sumber daya awan [%s] sudah ada", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10011": "akun[%s] tidak diizinkan melakukan operasi pada grup keamanan default", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10010": "akun[%s] tidak dapat melakukan operasi pada grup keamanan default[%s]", + "ORG_ZSTACK_SNS_10026": "tidak dapat memperbarui alamat email menjadi %s karena sudah ada di titik akhir [UUID:%s]", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10012": "antarmuka jaringan vm [UUID: %s] hanya dapat menjadi bagian dari satu grup keamanan; oleh karena itu, tidak dapat dihapus dari grup keamanan saat ini [UUID: %s].", + "ORG_ZSTACK_SNS_10024": "tidak dapat menambahkan alamat email yang sama ke titik akhir[uuid:%s]", + "ORG_ZSTACK_SNS_10023": "tidak dapat menemukan plugin[%s]", + "ORG_ZSTACK_SNS_10022": "tidak dapat membuat platform SNMP dengan alamat yang sama[%s:%s]", + "ORG_ZSTACK_SNS_10021": "Tidak dapat membuat koneksi karena parameter null. Harap pastikan semua parameter yang diperlukan dikonfigurasi dengan benar.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10029": "tidak mengimplementasikan tipe target jarak jauh: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10028": "gagal mengemas gambar yang diekspor karena %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10027": "beberapa gambar [%s] tidak diekspor ke penyimpanan cadangan [uuid: %s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10026": "gagal menghapus paket gambar karena: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10022": "gagal mengatur kapasitas maksimum pada penyimpanan gambar[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10021": "gagal mengatur kapasitas maksimum pada penyimpanan gambar[uuid:%s], karena: %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10019": "notifySugonSdn: gagal memberitahu Sugon SDN tentang vrouter untuk VM [uuid:%s] di host tujuan [uuid:%s]", + "ORG_ZSTACK_SNS_10038": "Tidak dapat membuat titik akhir email SNS tanpa menentukan alamat email penerima.", + "ORG_ZSTACK_SNS_10037": "nama pengguna dan kata sandi harus keduanya tidak ada atau diberikan bersama-sama", + "ORG_ZSTACK_SNS_10036": "nomor telepon[%s] tidak valid, harap pastikan formatnya +86-12388889999", + "ORG_ZSTACK_SNS_10035": "[%s] bukan alamat IP yang valid", + "ORG_ZSTACK_SNS_10034": "jalur penyimpanan awan tidak valid[%s]", + "ORG_ZSTACK_SNS_10031": "nomor telepon [%s] tidak ada", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10018": "Tidak ada respons dari contoh awan atau mesin virtual. Harap per status contoh dan konfigurasi jaringan.", + "ORG_ZSTACK_SNS_10030": "Daftar nomor telepon mesin virtual kosong. Silakan periksa dan pastikan nomor telepon yang diperlukan telah disediakan.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10016": "gagal mengambil gambar dari penyimpanan cadangan dengan UUID: %s, alasan: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10015": "File sertifikat untuk mengunduh gambar tidak ditemukan: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10013": "tidak dapat terhubung ke SimpleHttpBackupStorage[url:%s], karena: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10010": "Gagal menerima respons tugas! Silakan periksa konfigurasi instance dan pengaturan jaringan Anda.", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_10000": "pembuatan bergantung pada cache gambar[uuid:%s, URL lokasi: [%s]], tidak dapat membuat dari lokasi lain.", + "ORG_ZSTACK_SNS_10045": "Operasi tidak diizinkan untuk platform mesin virtual tingkat sistem. Pastikan Anda memodifikasi sumber daya ruang pengguna.", + "ORG_ZSTACK_SNS_10044": "Tidak dapat memvalidasi SMS universal tanpa menentukan nomor telepon.", + "ORG_ZSTACK_SNS_10043": "userId [%s] sudah ada di lingkungan cloud", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10008": "gagal membersihkan metadata gambar pada penyimpanan utama %s, kesalahan: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10007": "Sinkronisasi gagal karena file sumber tidak ditemukan. Pastikan semua file yang diperlukan ada dan coba lagi sinkronisasi.", + "ORG_ZSTACK_SNS_10041": "nomor telepon cloud[%s] sudah ada", + "ORG_ZSTACK_SNS_10040": "alamat email tidak valid[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10005": "tidak dapat menemukan host yang terhubung di klaster tempat penyimpanan utama [uuid: %s] terhubung", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10004": "tidak dapat melakukan commit penyimpanan cadangan yang ditentukan oleh UUID: %s karena kesalahan: %s", + "ORG_ZSTACK_MONITORING_10004": "tidak dapat menemukan jenis untuk sumber daya[uuid:%s]", + "ORG_ZSTACK_MONITORING_10005": "tidak ada metrik pemantauan yang ditemukan untuk resourceType[%s] dan item[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10002": "tidak dapat mengalokasikan penyimpanan cadangan yang ditentukan oleh UUID: %s karena keterbatasan sumber daya atau UUID tidak valid: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10000": "kesalahan解析 waktu pembuatan: %s", + "ORG_ZSTACK_MONITORING_10000": "tidak dapat menemukan pemicu pemantauan[uuid:%s], mungkin telah dihapus atau dinonaktifkan", + "ORG_ZSTACK_MONITORING_10001": "tidak dapat menemukan tindakan pemicu pemantauan[uuid:%s], mungkin telah dihapus atau dicabut", + "ORG_ZSTACK_MONITORING_10002": "sumber daya[tipe:%s] tidak memiliki metrik pemantauan apa pun", + "ORG_ZSTACK_MONITORING_10003": "Sumber daya dengan UUID [%s] tidak termasuk dalam akun dengan UUID [%s].", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10002": "instance[%s] tidak terkait dengan grup apa pun", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10001": "Instance[%s] sudah ditugaskan ke grup", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10003": "Grup pemantauan [%s] tidak terkait dengan template pemantauan.", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10006": "Batas instance untuk grup telah tercapai. Harap hapus instance yang ada atau hubungi dukungan untuk meningkatkan batas.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10001": "Body output tidak mendukung nilai JSON null! Pastikan semua bidang ditentukan dengan benar dan bukan null.", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10005": "Aturan template telah mencapai batas maksimum %d entri. Pertimbangkan untuk meningkatkan skala template Anda atau hubungi dukungan untuk bantuan.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10000": "hanya layanan cloud-native yang dapat diizinkan di Outputs, tetapi ditemukan %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10016": "Tipe Resource harus berupa String!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10014": "Body root Mappings harus berupa objek JSON!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10018": "Metadata root Resource harus berupa objek JSON!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10023": "Body Parameters tidak dapat mendukung nilai null!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10022": "nama parameter tidak didukung: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10020": "paramName harus ditemukan dalam hasil template CloudFormation JSON atau dianggap tidak valid.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10001": "entity kosong, tidak dapat menentukan TableName", + "ORG_ZSTACK_FAULTTOLERANCE_10004": "gagal mengalokasikan port pada host[uuid: %s]", + "ORG_ZSTACK_ZQL_AST_VISITORS_10000": "Kondisi join hilang untuk tabel %s dalam query Anda. Pastikan Anda telah menentukan kondisi join dengan benar.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10003": "Daftar field kosong; oleh karena itu, kami tidak dapat mengambil nama kolom. Pastikan daftar field Anda berisi data yang diperlukan.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10002": "entity kosong, tidak dapat mengambil columnName", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10005": "Body Mapping tidak mendukung nilai non-map!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10004": "[%s] tidak valid di CloudFormation Outputs!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10003": "Description di Outputs harus bertipe String!", + "ORG_ZSTACK_FAULTTOLERANCE_10009": "Tidak dapat melakukan migrasi VM sekunder ft[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10008": "Tidak dapat memulai mesin virtual sekunder karena mesin virtual utama masih dalam keadaan berhenti. Pastikan VM utama berjalan sebelum mencoba memulai VM sekunder.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10009": "Body nilai Resource tidak dapat mendukung nilai null! Pastikan semua parameter resource diinisialisasi dengan benar sebelum deployment.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10004": "Fungsi yang ditentukan tidak boleh null. Pastikan fungsi tersebut diinisialisasi dengan benar sebelum digunakan.", + "ORG_ZSTACK_FAULTTOLERANCE_10007": "tidak dapat mengambil host UUID dari VM utama [uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10008": "Resource %s tidak dapat bergantung pada dirinya sendiri, harap periksa referensi diri dalam Resource [%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10005": "jumlah port yang dialokasikan lebih kecil dari yang diminta pada host[uuid: %s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10006": "Body Mapping tidak mendukung nilai null! Pastikan semua field JSON didefinisikan dengan benar dan tidak null.", + "ORG_ZSTACK_SNS_10009": "uuid [%%s] sudah ada di lingkungan cloud.", + "ORG_ZSTACK_SNS_10007": "tidak dapat menemukan SNS Application Endpoint dengan UUID: %s, mungkin telah dihapus", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10012": "kunci tidak didukung [%s] dalam pemetaan resource [%s]", + "ORG_ZSTACK_SNS_10006": "tidak dapat menemukan SNSApplicationPlatform[uuid:%s], mungkin telah dihentikan", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10011": "resourceName harus ditemukan dalam output template atau merupakan CloudFormation JSON yang tidak valid.", + "ORG_ZSTACK_SNS_10005": "Jenis endpoint %s yang ditentukan tidak dapat ditemukan. Pastikan jenis endpoint yang valid diberikan.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10010": "kunci resource tidak didukung: %s", + "ORG_ZSTACK_SNS_10003": "tidak dapat menemukan SNS Topic dengan UUID:%s, mungkin telah dihapus", + "ORG_ZSTACK_SNS_10002": "Titik akhir aplikasi dinonaktifkan. Harap periksa pengaturan konfigurasi Anda atau hubungi dukungan untuk bantuan.", + "ORG_ZSTACK_SNS_10001": "Platform aplikasi dinonaktifkan. Harap hubungi administrator Anda untuk mengaktifkannya atau periksa dokumentasi untuk alternatif yang tersedia.", + "ORG_ZSTACK_SNS_10000": "Topik %s tidak sedang dikonsumsi oleh titik akhir yang berlangganan.", + "ORG_ZSTACK_CLOUDFORMATION_10002": "Format Versi Template ZStack tidak valid: [%s, versi yang diharapkan adalah %s]", + "ORG_ZSTACK_CLOUDFORMATION_10001": "Template harus berisi penanda ZStackTemplateFormatVersion.", + "ORG_ZSTACK_CLOUDFORMATION_10000": "Elemen null ditemukan dalam konten template. Konten template mungkin merujuk pada sumber daya cloud atau konfigurasi mesin virtual. Harap pastikan semua elemen didefinisikan dan diinisialisasi dengan benar.", + "ORG_ZSTACK_CLOUDFORMATION_10009": "template [%s] dinonaktifkan di lingkungan virtualisasi", + "ORG_ZSTACK_CLOUDFORMATION_10008": "ResourceStackVO [%s] telah dihapus!", + "ORG_ZSTACK_CLOUDFORMATION_10007": "ResourceStackVO: [%s] telah dihentikan...", + "ORG_ZSTACK_CLOUDFORMATION_10005": "tidak ditemukan UUID stack untuk VM instance[%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10035": "Gagal memesan kapasitas host untuk semua host kandidat. Harap periksa ketersediaan host target dan pastikan mereka memiliki sumber daya yang cukup untuk memenuhi persyaratan reservasi.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10034": "[Alokasi Host]: %s pada host[uuid:%s]. Coba alokasikan ke host berikutnya. %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10037": "setelah pemfilteran, HostAllocatorFilterExtensionPoint[%s] mengembalikan nol host kandidat, menunjukkan: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10036": "Tidak ditemukan host dengan kriteria yang ditentukan", + "ORG_ZSTACK_CLOUDFORMATION_10025": "status %s diharapkan!", + "ORG_ZSTACK_EXPON_10002": "permintaan eksponensial gagal, kode %s, pesan: %s.", + "ORG_ZSTACK_EXPON_10003": "tidak dapat menemukan volume [name:%s] setelah menyalin snapshot", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10000": "virtual router[name: %s, uuid: %s] gagal mengonfigurasi DNS%s, %s", + "ORG_ZSTACK_CLOUDFORMATION_10022": "restart resource stack hanya mendukung status %s!", + "ORG_ZSTACK_CLOUDFORMATION_10021": "tidak dapat menemukan resource stack dengan uuid [%s]", + "ORG_ZSTACK_CLOUDFORMATION_10020": "tidak dapat menemukan alamat IP default pada mesin virtual[%s]", + "ORG_ZSTACK_CLOUDFORMATION_10028": "templateContent dan url tidak boleh keduanya kosong atau keduanya diatur!", + "ORG_ZSTACK_CLOUDFORMATION_10026": "templateContent dan templateUuid tidak boleh keduanya kosong!", + "ORG_ZSTACK_HYBRID_ACCOUNT_10000": "keyType tidak didukung type [%s]", + "ORG_ZSTACK_HYBRID_ACCOUNT_10002": "key: [%s] dengan type: [%s] sudah ada untuk account UUID: [%s]", + "ORG_ZSTACK_HYBRID_ACCOUNT_10003": "parameter [accountUuid] hanya dapat digunakan oleh pengguna administratif!", + "ORG_ZSTACK_HYBRID_ACCOUNT_10004": "key: [%s] sudah ada untuk account UUID: [%s]", + "ORG_ZSTACK_CLOUDFORMATION_10014": "Konten harus diatur oleh konten template atau URL!", + "ORG_ZSTACK_CLOUDFORMATION_10013": "tidak dapat menghapus atau memperbarui sistem template: %s", + "ORG_ZSTACK_CLOUDFORMATION_10012": "StackTemplateVO telah dihapus dari repositori template cloud. Harap verifikasi dan unggah ulang template.", + "ORG_ZSTACK_CLOUDFORMATION_10011": "tidak dapat menemukan parameter untuk %s, yang berjenis %s, silakan periksa parameter", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10002": "tidak dapat menghubungkan kumpulan perangkat keras VXLAN karena: %s", + "ORG_ZSTACK_CLOUDFORMATION_10010": "templateContent harus ditentukan!", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10003": "tidak dapat membuat jaringan perangkat keras L2 VXLAN tanpa ID VLAN yang ditentukan", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10000": "tidak dapat menghubungkan jaringan level 2 ke klaster karena host[uuid:%s] tidak memiliki antarmuka virtual[name:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10001": "tidak dapat menghubungkan kumpulan perangkat keras VXLAN karena tidak dapat menemukan port switch untuk host[uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_10019": "tidak dapat menemukan nama bridge l2 dari l2[%s] dari systemTag", + "ORG_ZSTACK_CLOUDFORMATION_10018": "Parameter filterName harus diatur ke cloudformation:true atau cloudformation:false.", + "ORG_ZSTACK_CLOUDFORMATION_10017": "StackTemplateVO: [%s] telah dihapus dari repositori awan...", + "ORG_ZSTACK_CLOUDFORMATION_10016": "versi template CloudFormation tidak valid: %s", + "ORG_ZSTACK_CLOUDFORMATION_10015": "Gagal mengambil konten input untuk sumber daya awan. Pastikan file sumber diunggah dan dikonfigurasi dengan benar.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10006": "tidak dapat membuat jaringan Huawei iMaster SDN VXLAN tanpa ID VPC", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10007": "tidak dapat menambahkan rentang vni karena rentang vni yang ditentukan [%d-%d] tidak valid", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10004": "tidak dapat membuat jaringan Huawei iMaster SDN VXLAN karena ID VLAN [%s] berada di luar rentang yang valid: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10005": "tidak dapat membuat jaringan Huawei iMaster SDN VXLAN tanpa vpcId dan tenantId", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10009": "tidak dapat menambahkan Huawei iMaster SDN Controller ke jaringan tanpa menentukan rentang VLAN", + "ORG_ZSTACK_NETWORK_L2_10013": "tidak dapat memodifikasi VLAN untuk Jaringan L2 [UUID:%s] karena masih memiliki host dalam keadaan terhubung atau terputus", + "ORG_ZSTACK_NETWORK_L2_10012": "jenis virtual switch tidak didukung[%s]", + "ORG_ZSTACK_NETWORK_L2_10015": "tidak dapat memodifikasi VLAN untuk l2Network[uuid:%s] karena jaringan ini terisolasi", + "ORG_ZSTACK_NETWORK_L2_10014": "tidak dapat memodifikasi VLAN untuk l2Network[uuid:%s] karena dibatasi secara eksklusif untuk klaster KVM", + "ORG_ZSTACK_NETWORK_L2_10017": "vlan[%s] tidak valid untuk konfigurasi jaringan awan", + "ORG_ZSTACK_NETWORK_L2_10016": "vlan diperlukan untuk ChangeL2NetworkVlanId dengan jenis[%s]", + "ORG_ZSTACK_NETWORK_L2_10019": "vLAN tidak diizinkan untuk ChangeL2NetworkVlanId dengan jenis[%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10000": "tidak ada host kandidat yang memiliki versi[%s] tersedia untuk penerapan", + "ORG_ZSTACK_NETWORK_L2_10018": "Telah terjadi jaringan L2 yang dilampirkan ke klaster dengan ID jaringan virtual [%s] dan antarmuka fisik [%s]. Gagal mengubah jaringan L2 [uuid: %s].", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10083": "SimpleHttpBackupStorage yang ada dengan hostname[%s] terdeteksi", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10082": "URL tidak valid[%s], URL harus berupa jalur absolut yang dimulai dengan '/'", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10080": "jalur file berisi karakter tidak valid: %s", + "ORG_ZSTACK_NETWORK_L2_10020": "Gagal memodifikasi l2Network [uuid:%s] yang dilampirkan ke klaster dengan antarmuka fisik [%s].", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10079": "URL berisi jalur tidak valid [/dev atau /proc atau /sys], yang tidak didukung di lingkungan komputasi awan. Silakan gunakan jalur yang valid untuk permintaan Anda.", + "ORG_ZSTACK_CLOUDFORMATION_10034": "templateContent dan uuid tidak boleh keduanya kosong atau keduanya diatur!", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10078": "path absolut ke file sumber diperlukan: %s", + "ORG_ZSTACK_NETWORK_L2_10006": "Terdapat jaringan L2 dengan UUID: %s dan nama: %s yang melekat pada cluster dengan UUID: %s yang terkait dengan antarmuka fisik [%s]. Gagal memasang jaringan L2 dengan UUID: %s.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10077": "Path file sumber diperlukan untuk melanjutkan tinjauan atau pengeditan kode. Harap berikan path file.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10076": "penyimpanan cadangan duplikat. Terdapat penyimpanan cadangan image store[hostname:%s]", + "ORG_ZSTACK_NETWORK_L2_10008": "l2Network [UUID: %s] terkait dengan cluster [UUID: %s], dan tidak dapat dialokasikan ulang.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10075": "hostname[%s] bukan nama DNS atau alamat IP yang valid", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10011": "DiskOfferingTagAllocatorExtensionPoint[%s] mengembalikan nol host kandidat", + "ORG_ZSTACK_CLOUDFORMATION_10030": "hanya administrator yang memiliki hak untuk mengaktifkan atau menonaktifkan StackTemplate sistem", + "ORG_ZSTACK_NETWORK_L2_10007": "Terdapat L2 Vlan Network [uuid:%s, name:%s] yang melekat pada cluster [uuid:%s] yang memiliki antarmuka fisik [%s] dan VLAN [%s]. Gagal memasang L2 Vlan Network [uuid:%s].", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10010": "InstanceOfferingTagAllocatorExtensionPoint[%s] mengembalikan nol host kandidat", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10073": "penyimpanan cadangan sumber tidak berisi image[%s]", + "ORG_ZSTACK_NETWORK_L2_10009": "tidak dapat memasang jaringan L2 karena ada jaringan lain dengan jenis vSwitch berbeda pada antarmuka fisik %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10072": "penyimpanan sumber[%s] tidak berisi image[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10071": "penyimpanan cadangan target [uuid:%s] sudah berisi image [uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10070": "gagal menghapus file metadata image: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10009": "penyimpanan cadangan [UUID: %s, type: %s] memerlukan penyimpanan primer yang terikat, namun belum ada penyimpanan primer yang ditambahkan.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10001": "Image dengan UUID [uuid:%s] dan nama [name:%s] telah dihapus dari semua penyimpanan cadangan.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10004": "binding sumber daya tidak mendukung tipe %s belum", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10003": "Tidak ditemukan host di zones[uuids:%s] yang melekat pada penyimpanan cadangan tempat image[%s] berada.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10005": "tidak ditemukan host tersedia dengan sumber daya terikat %s", + "ORG_ZSTACK_NETWORK_L2_10011": "tipe l2Network tidak didukung[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10003": "virtual router[uuid:%s, ip:%s] gagal mengonfigurasi DNS%s untuk L3 Network[uuid:%s, name:%s], %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10008": "Image[uuid:%s] terletak pada penyimpanan cadangan[uuid:%s, type:%s] yang memerlukan interaksi dengan penyimpanan primer[uuid:%s]; namun, tidak ditemukan host yang sesuai untuk memfasilitasi interaksi ini.", + "ORG_ZSTACK_NETWORK_L2_10010": "l2Network[uuid:%s] belum melekat pada cluster[uuid:%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10007": "Image[uuid:%s, name:%s] disimpan pada penyimpanan cadangan[uuid:%s, type:%s] yang memerlukan penyimpanan primer dengan tipe %s; namun, tidak ditemukan host dengan penyimpanan primer yang kompatibel.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10068": "Periksa file metadata image: %s gagal", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10066": "Buat file metadata image: %s gagal", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10065": "Buat sinkronisasi metadata image gagal: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10022": "tidak dapat menemukan volume root dari instance[uuid:%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10021": "tidak ditemukan host dengan CPU[%s], memory[%s bytes] yang tersedia", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10000": "tidak dapat melampirkan eip karena tidak ada gateway untuk antarmuka jaringan [uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10062": "AddImage dilarang di Disaster Recovery BS: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10001": "L2Network tempat L3Network VIP berbasis belum dilampirkan ke klaster tempat vmNic[uuid:%s] berada.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10002": "tidak dapat mengikat lebih dari 1 EIP ke VM NIC dengan UUID:%s tipe flat", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10060": "path gambar hilang pada instance[%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10015": "tidak dapat menemukan primary storage yang tersedia [state: %s, status: %s, kapasitas tersedia %d bytes]. Harap verifikasi state dan status primary storage dan pastikan terhubung ke klaster.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10014": "tidak ditemukan host di klaster yang telah dilampirkan ke primary storage %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10016": "tidak dapat menemukan primary storage yang tersedia [state: %s atau %s, status: %s]. Harap verifikasi state dan status primary storage dan pastikan terhubung ke klaster.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10031": "tidak ditemukan host yang diaktifkan di [%s] host kandidat dengan tipe hypervisor [%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10030": "tidak ditemukan host yang diaktifkan di daftar host kandidat [%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10033": "Tidak ditemukan host dengan state=Enabled dan status=Connected", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10032": "tidak ditemukan host dengan state=Enabled status=Connected hypervisorType=%s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10012": "tidak ada objek %s ditemukan di bucket %s", + "ORG_ZSTACK_UTILS_10000": "gagal membuat access secret untuk virtual machine instance %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10024": "UUID volume atau UUID volume snapshot harus ditentukan", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10023": "Tidak ditemukan host di klaster yang telah dilampirkan ke semua primary storage %s tempat volume VM[UUID:%s] berada.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10026": "Setelah mengecualikan host yang dihindari, tidak ada kandidat yang tersisa di pool.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10025": "zoneUuids, clusterUuids, dan hostUuids masing-masing harus berisi setidaknya satu daftar non-kosong, atau semua nilai harus disetel ke true.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10015": "Aliyun EBS Backup Storage tidak mendukung penghitungan hash gambar.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10027": "Tidak ditemukan host di klaster yang telah dilampirkan ke L2Networks yang memiliki L3Networks terkait%s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10029": "tidak ditemukan host yang terhubung di [%s] host kandidat", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10005": "Pilih strategi load balancing, Anda harus mengatur tipe algoritma", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10008": "Tidak ditemukan host dengan kurang dari %s virtual machine", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10022": "Akun [UUID:%s] tidak memiliki akses ke sumber daya [UUID:%s, type:L3NetworkVO].", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10024": "ubah IP server dhcp ke [%s], tetapi menerima [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10025": "UUID L3 Network tidak boleh null", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10003": "Pengaturan penyedia cloud salah, nilai yang valid adalah %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10021": "UUID sesi/akun tidak valid. Harap verifikasi dan coba lagi.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10000": "URL endpoint Ocean harus dikonfigurasi untuk penyimpanan cadangan Alibaba Cloud EBS.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10017": "tidak dapat menerapkan operasi EIP untuk VM[uuid:%s, state:%s], karena hostUUID tidak dapat ditemukan", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10009": "Aliyun EBS Backup Storage tidak mendukung pembatalan proses unduhan gambar.", + "ORG_ZSTACK_CORE_TIMEOUT_10000": "batas waktu API tidak dapat diatur lebih kecil dari %s milidetik", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10002": "tidak dapat menghapus bucket OSS [%s], karena masih berisi instance Aliyun EBS Backup Storage, pastikan semua instance backup storage terkait dihapus terlebih dahulu.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10004": "primary storage saat ini tidak mendukung jenis protokol yang ditentukan; pastikan protokol ditambahkan ke storage terlebih dahulu.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10003": "parameter [protocol] kosong. Untuk primary storage tipe [%s], protokol block volume harus ditentukan.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10000": "Kesalahan jalur sumber daya cloud: Harap verifikasi lokasi dan keberadaan file.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10002": "nama: [%s] sudah ada. Nama block volume harus unik dalam tipe primary storage [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10010": "tidak dapat mengambil IP server DHCPv6 untuk jaringan Layer 3 [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10009": "tidak dapat mengambil IP server DHCPv4 untuk jaringan layer 3 [uuid:%s]", + "ORG_ZSTACK_POLICYROUTE_10029": "Tidak dapat menghapus tabel rute kebijakan sistem", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10005": "host[uuid:%s] tidak di-provision", + "ORG_ZSTACK_POLICYROUTE_10027": "Tidak dapat menghapus set rute kebijakan yang ditentukan sistem. Pastikan set rute tersebut tidak digunakan oleh sumber daya aktif mana pun sebelum mencoba menghapusnya.", + "ORG_ZSTACK_POLICYROUTE_10028": "Tidak dapat menemukan instance virtual router yang terkait. Pastikan virtual router dikonfigurasi dengan benar dan tersedia.", + "ORG_ZSTACK_POLICYROUTE_10025": "ruleSet[%s] masih terkait dengan kartu antarmuka jaringan (NIC)", + "ORG_ZSTACK_POLICYROUTE_10020": "VRouter[%s] sudah memiliki tabel rute berbasis kebijakan [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10044": "Hanya dapat mengubah IP server DHCP jika DHCP datar diaktifkan.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10045": "tidak dapat mengubah IP server DHCP karena %s bukan pemilik jaringan Layer 3[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10046": "Tidak dapat mengubah IP server DHCPv4 karena tidak ada rentang alamat IPv4 yang dikonfigurasi.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10047": "tidak dapat menetapkan IP server DHCPv4 karena IP yang diberikan [%s] bukan CIDR yang valid untuk jaringan L3 [%s]", + "ORG_ZSTACK_IDENTITY_RBAC_10011": "operasi[API:%s] ditolak secara default karena alasan keamanan. Silakan hubungi administrator untuk menyelesaikan masalah ini.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10041": "Tidak dapat menetapkan IP server DHCPv6 karena tidak ada rentang IPv6 yang dikonfigurasi.", + "ORG_ZSTACK_IDENTITY_RBAC_10012": "operasi ditolak oleh kebijakan [nama: %s uuid: %s]", + "ORG_ZSTACK_IDENTITY_RBAC_10013": "operasi ditolak oleh kebijakan[nama:%s, uuid:%s], bidang[%s] tidak diizinkan untuk diubah", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10037": "tidak dapat menghapus alamat IP karena IP [%s] adalah alamat IP server DHCP", + "ORG_ZSTACK_POLICYROUTE_10018": "Tidak dapat memperbarui set rute kebijakan sistem. Pastikan Anda memiliki izin yang diperlukan dan coba lagi.", + "ORG_ZSTACK_POLICYROUTE_10019": "Tidak dapat memperbarui tabel rute berbasis kebijakan sistem. Pastikan Anda memiliki izin yang diperlukan dan coba lagi.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10039": "Tidak dapat menetapkan IP server DHCPv4 karena tidak ada rentang alamat IPv4 yang dikonfigurasi.", + "ORG_ZSTACK_POLICYROUTE_10017": "Tidak dapat menemukan Virtual Router yang terkait", + "ORG_ZSTACK_POLICYROUTE_10014": "jenis protokol %s tidak sah", + "ORG_ZSTACK_POLICYROUTE_10015": "RuleSet[%s] sudah berisi aturan dengan nomor %s.", + "ORG_ZSTACK_POLICYROUTE_10013": "kegagalan operasi, format IP hanya mendukung IPv4/range/CIDR, tetapi menemukan %s", + "ORG_ZSTACK_POLICYROUTE_10010": "NextHopIp harus dalam format IPv4 tetapi menemukan [%s]", + "ORG_ZSTACK_CORE_REST_10012": "tidak dapat mengambil %s dalam %sms", + "ORG_ZSTACK_QUERY_10021": "field[%s] bukan primitif dari inventory %s; Anda tidak dapat menentukannya di parameter 'fields'; field yang valid adalah %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10034": "IP server DHCP [%s] sudah ada dalam jaringan L3 [%s]", + "ORG_ZSTACK_QUERY_10020": "class metadata entity[%s] tidak memiliki field[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10035": "IP server DHCP [%s] tidak boleh sama dengan IP gateway", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10036": "IP server DHCP [%s] tidak dapat dikonfigurasi ke pengaturan jaringan L3 sistem", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10030": "alamat IP server DHCP [%s] bukan alamat IPv4 yang valid", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10031": "IP server DHCP [%s] tidak berada dalam CIDR yang ditentukan [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10032": "IP server DHCP [%s] bukan alamat IPv6 yang valid", + "ORG_ZSTACK_IDENTITY_RBAC_10004": "Anda tidak diotorisasi untuk memperbarui peran sistem atau yang sudah ditentukan. Silakan hubungi administrator Anda untuk mendapatkan bantuan.", + "ORG_ZSTACK_POLICYROUTE_10009": "DestinationCidr harus dalam format CIDR tetapi menemukan [%s]", + "ORG_ZSTACK_IDENTITY_RBAC_10007": "izin ditolak, akun [uuid:%s] tidak diotorisasi untuk mengakses sumber daya [uuid:%s, type:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10027": "tidak dapat mengonfigurasi DHCP untuk mesin virtual [uuid:%s] di host tujuan [uuid:%s]", + "ORG_ZSTACK_IDENTITY_RBAC_10008": "izin ditolak, akun [uuid:%s] tidak diotorisasi untuk mengelola sumber daya yang diberi tag [uuid:%s, type:%s]", + "ORG_ZSTACK_POLICYROUTE_10008": "VRouter[%s] sudah memiliki rule set dengan nama %s", + "ORG_ZSTACK_IDENTITY_RBAC_10005": "Anda tidak diotorisasi untuk menghapus peran sistem atau yang sudah ditentukan. Silakan hubungi administrator Anda untuk mendapatkan bantuan.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10029": "panjang prefix rentang IP minimum untuk jaringan flat adalah %d", + "ORG_ZSTACK_POLICYROUTE_10003": "l3[%s] sudah memiliki rule set rute kebijakan yang dilampirkan", + "ORG_ZSTACK_IDENTITY_RBAC_10009": "Akun [UUID:%s] tidak memiliki akses ke sumber daya [UUID:%s, Type:%s]", + "ORG_ZSTACK_POLICYROUTE_10000": "Jaringan rute default tidak dapat dimodifikasi ketika rute kebijakan sistem diaktifkan.", + "ORG_ZSTACK_QUERY_10018": "nama kondisi[%s] tidak valid, tidak ada field seperti itu yang ditemukan di class inventory[%s]", + "ORG_ZSTACK_QUERY_10017": "\"value\" dari kondisi query %s tidak boleh null untuk pemfilteran sumber daya cloud", + "ORG_ZSTACK_QUERY_10015": "filterName harus diformat sebagai [filterType:condition(s)]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_10000": "gagal membuat string signature API ocean: %s", + "ORG_ZSTACK_QUERY_10019": "nama kondisi[%s] tidak valid: field[%s] dari inventory[%s] dianotasi sebagai @UnqueryableField", + "ORG_ZSTACK_ALIYUN_PANGU_10001": "appName: %s, partitionName: %s sudah ada di identityZone: %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10050": "tidak dapat mengatur IP server DHCP, karena IP[%s] sudah dialokasikan", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10051": "tidak dapat mengatur IP server DHCPv6 karena IP[%s] sudah digunakan", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10053": "alokasi IP server DHCP gagal.%s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10048": "tidak dapat mengubah IP server DHCPv6 karena tidak ada rentang IPv6 yang dikonfigurasi", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10049": "tidak dapat mengatur IP server DHCPv6 karena IP[%s] bukan CIDR yang valid untuk jaringan L3 [%s]", + "ORG_ZSTACK_USBDEVICE_10026": "lepaskan semua perangkat USB dari VM[%s] dan coba lagi", + "ORG_ZSTACK_USBDEVICE_10025": "tidak dapat melepaskan perangkat USB[uuid:%s] ketika terhubung ke instance VM", + "ORG_ZSTACK_USBDEVICE_10024": "instance VM [uuid:%s] tidak dalam keadaan dapat dipasang untuk perangkat USB %s", + "ORG_ZSTACK_USBDEVICE_10023": "Instance VM yang perangkat USB [uuid:%s] terhubung tidak dalam keadaan dapat dilepas: %s", + "ORG_ZSTACK_USBDEVICE_10022": "Perangkat USB [UUID:%s] tidak terhubung ke instance mesin virtual manapun", + "ORG_ZSTACK_USBDEVICE_10021": "Host yang perangkat USB [uuid:%s] dipasang tidak dalam keadaan [%s] atau status [%s] yang valid", + "ORG_ZSTACK_USBDEVICE_10020": "instance VM[UUID:%s] tidak dalam keadaan dapat dipasang untuk perangkat USB: %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10005": "Jaringan L3 [uuid:%s] tidak ada", + "ORG_ZSTACK_COMPUTE_SRIOV_10006": "%s, karena tidak ada perangkat SRIOV yang tersedia pada l3Network [uuid:%s] dari host [uuid:%s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10007": "tidak dapat mengubah keadaan HA VF NIC karena VF NIC [UUID:%s] tidak ada", + "ORG_ZSTACK_COMPUTE_SRIOV_10008": "tidak dapat mengubah keadaan ketersediaan tinggi kartu antarmuka jaringan virtual karena keadaan ketersediaan tinggi[%s] tidak valid", + "ORG_ZSTACK_COMPUTE_SRIOV_10009": "Jaringan L2 [UUID:%s] tidak ditemukan", + "ORG_ZSTACK_COMPUTE_SRIOV_10000": "gagal mengatur MAC VF NIC pada host[uuid:%s, ip:%s], karena %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10001": "gagal mengubah keadaan HA kartu antarmuka jaringan virtual, kesalahan: %s", + "ORG_ZSTACK_DRS_10000": "Klaster[%s] telah memulai Layanan Replikasi Data", + "ORG_ZSTACK_DRS_10002": "Nilai ambang batas tidak boleh kosong. Pastikan pengaturan ambang batas dikonfigurasi dengan benar.", + "ORG_ZSTACK_DRS_10001": "DRS dinonaktifkan untuk mesin virtual ini. Pastikan DRS diaktifkan untuk mengoptimalkan alokasi sumber daya.", + "ORG_ZSTACK_DRS_10004": "operator ambang batas tidak sah[%s]", + "ORG_ZSTACK_DRS_10003": "nama ambang batas tidak sah[%s]", + "ORG_ZSTACK_DRS_10006": "nilai ambang batas tidak sah, rentang valid: (0, 100]", + "ORG_ZSTACK_DRS_10005": "Nilai ambang batas untuk pemantauan sumber daya cloud tidak boleh kosong.%s", + "ORG_ZSTACK_DRS_10008": "Status DRG[%s] adalah %s", + "ORG_ZSTACK_DRS_10007": "GlobalConfig ENABLE_DRS dinonaktifkan", + "ORG_ZSTACK_DRS_10009": "Tingkat otomatisasi DRS[%s] tidak diatur ke mode manual", + "ORG_ZSTACK_ZWATCH_FUNCTION_10012": "nilai[%s] bukan angka integer yang valid", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10018": "tidak dapat menjalankan operasi API. Jaringan backend [UUID:%s] terhubung ke router VPC [UUID:%s], yang tidak terhubung ke jaringan depan [UUID:%s]", + "ORG_ZSTACK_ZWATCH_FUNCTION_10011": "argumen tidak valid[limit:%s], tidak boleh bernilai negatif", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10019": "Jaringan backend [UUID:%s] harus berupa jaringan VPC karena jaringan backend lainnya dikonfigurasi sebagai jaringan VPC.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10010": "argumen tidak diketahui[%s]", + "ORG_ZSTACK_DRS_10020": "Menghapus aDRS tidak diizinkan sementara VM sedang dimigrasikan.", + "ORG_ZSTACK_DRS_10011": "Berhasil dieksekusi; penerapan ulang tidak diizinkan", + "ORG_ZSTACK_DRS_10010": "saran[%s] telah kedaluwarsa karena ketidakaktifan", + "ORG_ZSTACK_DRS_10013": "VM[%s] tidak dalam keadaan berjalan", + "ORG_ZSTACK_DRS_10012": "VM[%s] telah dihentikan", + "ORG_ZSTACK_DRS_10015": "Klaster[%s] tidak mendukung penskalaan sumber daya dinamis.", + "ORG_ZSTACK_DRS_10014": "VM[%s] tidak lagi berada di host sumber[%s].", + "ORG_ZSTACK_DRS_10017": "Daftar UUID host kosong. Harap pastikan setidaknya satu UUID host disediakan.", + "ORG_ZSTACK_DRS_10016": "Tidak dapat membuat instance DRDS, %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10013": "jaringan backend [uuid:%s] harus berupa jaringan VPC karena jaringan Layer 3 depan adalah jaringan VPC", + "ORG_ZSTACK_ZWATCH_FUNCTION_10005": "argumen tidak valid[start:%s], tidak boleh berupa angka negatif dalam lingkungan komputasi awan", + "ORG_ZSTACK_DRS_10019": "Saran tidak diizinkan selama penjadwalan tugas", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10014": "tidak dapat mengeksekusi operasi API. Jaringan backend [UUID:%s] tidak terhubung ke router VPC. Harap pastikan jaringan terhubung dengan benar sebelum mencoba lagi.", + "ORG_ZSTACK_DRS_10018": "Gagal mengquery data pemanfaatan host", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10015": "Jaringan backend dikaitkan dengan router VPC [uuid:%s] sementara jaringan depan dikaitkan dengan router VPC yang berbeda [uuid:%s]. Harap pastikan kedua jaringan dikaitkan dengan router VPC yang sama.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10016": "tidak dapat mengeksekusi operasi API. Jaringan backend [uuid:%s] harus berupa jaringan datar pribadi karena jaringan L3 depan adalah jaringan datar pribadi.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10002": "fungsi tidak diketahui[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10010": "CIDR jaringan backend tumpang tindih dengan CIDR jaringan L3 depan", + "ORG_ZSTACK_ZWATCH_FUNCTION_10008": "nilai tidak valid[%s] untuk argumen[%s] dalam konfigurasi lingkungan komputasi awan", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10011": "CIDR jaringan backend [%s] tumpang tindih dengan CIDR jaringan L3 manajemen [%s]. Harap pastikan tidak ada tumpang tindih antara CIDR jaringan untuk menghindari konflik konfigurasi. Jaringan backend UUID [%s] dan jaringan L3 manajemen UUID [%s] terpengaruh.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10012": "tidak dapat mengeksekusi operasi API. Jaringan frontend [UUID:%s] tidak terhubung ke router VPC", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10001": "tidak dapat menemukan grup OSD terkait CEPH pool [%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10000": "CEPH pool yang diperlukan[uuid:%s] tidak dapat memenuhi kondisi [availableSize > %d byte], ukuran yang tersedia saat ini %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10006": "tidak dapat membuat instance SLB karena gambar [uuid:%s] telah dihapus", + "ORG_ZSTACK_ZWATCH_FUNCTION_10001": "argumen duplikat[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10007": "Pembuatan instance SLB gagal karena mencapai batas instance maksimum.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10000": "argumen yang diperlukan[%s] hilang untuk konfigurasi instance awan", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10008": "tidak dapat membuat grup SLB karena tipe jaringan L3 depan tidak valid %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10009": "CIDR jaringan depan [%s] bertabrakan dengan CIDR jaringan L3 manajemen [%s]", + "ORG_ZSTACK_DRS_10022": "Penjadwalan tidak diizinkan selama migrasi mesin virtual.", + "ORG_ZSTACK_DRS_10023": "Kekurangan data pemanfaatan CPU dan memori host", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10002": "cloud tidak dapat menghapus VIP[%s]. Harap pastikan SLB[uuid:%s] dihapus terlebih dahulu.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10003": "tidak dapat membuat instans SLB karena tidak ada grup SLB load balancer [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10004": "tidak dapat membuat instans SLB karena tidak ada penawaran SLB yang dikonfigurasi untuk grup SLB [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10005": "tidak dapat membuat instans SLB karena UUID gambar dari penawaran SLB [uuid:%s] adalah null", + "ORG_ZSTACK_CORE_ENCRYPT_10000": "Kesalahan enkripsi : %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10000": "tidak dapat找到 antarmuka jaringan dari instans SLB [uuid:%s] yang dilampirkan ke jaringan L3 depan grup SLB [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10001": "tidak dapat menghapus rentang ip [%s], harap hapus load balancer [uuid:%s] terlebih dahulu", + "ORG_ZSTACK_IDENTITY_10011": "Kata sandi lama tidak cocok dengan kata sandi asli. Tidak dapat memperbarui kata sandi pengguna[%s].", + "ORG_ZSTACK_IDENTITY_10010": "Pengguna dengan UUID [%s] tidak memiliki keterkaitan dengan akun yang memiliki UUID [%s].", + "ORG_ZSTACK_IDENTITY_10016": "Kuota[name:%s] untuk akun[uuid:%s] tidak dapat disetel ke %d", + "ORG_ZSTACK_IDENTITY_10017": "Akun [UUID:%s] memanfaatkan [Name:%s, Usage Value:%s] melebihi kuota yang diminta: %d", + "ORG_ZSTACK_IDENTITY_10001": "Kredensial autentikasi tidak benar. Harap verifikasi kata sandi Anda dan coba lagi.", + "ORG_ZSTACK_IDENTITY_10009": "akun [UUID: %s] tidak memiliki akses ke sumber daya [UUID: %s]", + "ORG_ZSTACK_IDENTITY_10008": "Grup pengguna dengan UUID [%s] tidak termasuk dalam akun dengan UUID [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10003": "gagal untuk melepaskan vip%s karena %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10009": "layanan[uuid: %s] sudah terikat ke server observabilitas", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10002": "gagal untuk menyinkronkan VIP [ips: %s] pada router virtual [uuid:%s] untuk melampirkan NIC [uuid: %s, ip: %s], karena %s", + "ORG_ZSTACK_OVF_10025": "Hanya mesin virtual dalam keadaan: %s dapat diekspor.", + "ORG_ZSTACK_OVF_10026": "gagal untuk mengurai jsonCreateVmParam dalam APICreateVmInstanceFromOvfMsg Parameter Permintaan Tidak Valid", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10006": "D找到 penawaran router virtual [uuid:%s] untuk L3Network [uuid:%s] di zona [uuid:%s]; namun, jaringan IP publik [uuid:%s] tidak cocok dengan VIP [uuid:%s]. Anda mungkin perlu menentukan penawaran router virtual tertentu menggunakan tag sistem guestL3Network::l3NetworkUuid.", + "ORG_ZSTACK_OVF_10023": "Eksport VM memerlukan penyimpanan cadangan ImageStore, tetapi backupStorageUuid yang diberikan: %s bukan penyimpanan cadangan ImageStore.", + "ORG_ZSTACK_OBSERVABILITYSERVER_10006": "server observabilitas dengan UUID: %s tidak diaktifkan", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10005": "router virtual[uuid:%s, state:%s] tidak aktif", + "ORG_ZSTACK_OVF_10024": "Tidak找到 mesin virtual yang akan diekspor dengan UUID: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10007": "gambar dari penawaran server observabilitas[UUID: %s] hilang", + "ORG_ZSTACK_OVF_10021": "Gagal membuat VM dari OVF karena disk root dari mesin virtual tidak dapat找到. Harap pastikan disk yang diperlukan dikonfigurasi dengan benar dan tersedia.", + "ORG_ZSTACK_OVF_10022": "VM[UUID: %s] sudah diekspor sebagai paket OVA[UUID: %s]. Harap hapus paket dan coba lagi.", + "ORG_ZSTACK_KVM_XMLHOOK_10001": "xml hook dengan UUID %s berhasil diperbarui, tetapi gagal memulai ulang VM dengan UUID %s. Detail: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10003": "tidak dapat menemukan router virtual untuk layanan: %s, tipe: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10010": "server observabilitas dengan UUID: %s tidak beroperasi; tidak dapat melampirkan layanan", + "ORG_ZSTACK_OVF_10018": "Gagal membaca file OVF untuk mesin virtual %s. Harap periksa jalur file dan izin.", + "ORG_ZSTACK_OVF_10017": "paket OVA[uuid: %s] tidak ditemukan di repositori mesin virtual.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10057": "tidak dapat menemukan UUID grup SLB dari load balancer[uuid:%s,tipe:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_FILESYSTEM_10000": "heartbeat host[uuid:%s] belum diperbarui baru-baru ini", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_HA_10000": "titik ekstensi grup HA belum diinisialisasi", + "ORG_ZSTACK_OVF_10030": "eksekusi long job[uuid:%s] gagal", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10040": "tidak dapat menambahkan vmnic ke grup server load balancer karena jaringan l3 [uuid:%s] terhubung ke router vpc yang berbeda", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10041": "tidak dapat menambahkan VMNIC ke grup server load balancer karena jaringan L3 tidak terhubung ke instance SLB", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10046": "tidak dapat membuat instance SLB karena instance lain [UUID: %s, nama: %s] sudah ada untuk grup SLB", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10047": "Tidak dapat membuat instance SLB karena dua instance sudah dibuat untuk grup SLB.", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10001": "gagal mengunggah bit dari penyimpanan NFS [uuid:%s, path:%s] ke penyimpanan gambar [hostname:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10042": "tidak dapat mengubah IP monitor grup SLB karena IP monitor %s tidak valid", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10043": "tidak dapat mengalihkan grup SLB [uuid:%s] ke mode ketersediaan tinggi karena status instance [%s] tidak dihentikan", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10044": "gagal membuat VIP%s pada router virtual[UUID:%s], karena %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10000": "gagal mengunduh bit dari penyimpanan gambar backup storage[hostname:%s, path: %s] ke penyimpanan utama NFS[uuid:%s, path: %s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10045": "membuat affinity group untuk instance SLB [uuid:%s] gagal", + "ORG_ZSTACK_IAM2_API_10011": "atribut[uuid:%s] tidak dikaitkan dengan grup yang ditentukan", + "ORG_ZSTACK_IAM2_API_10012": "atribut[uuid:%s] tidak dikaitkan dengan organisasi manapun", + "ORG_ZSTACK_IAM2_API_10013": "atribut[uuid:%s] tidak dikaitkan dengan proyek manapun", + "ORG_ZSTACK_IAM2_API_10014": "atribut[uuid:%s] tidak dikaitkan dengan ID instance virtual manapun", + "ORG_ZSTACK_IAM2_API_10015": "Kebijakan retirement harus dihapus sebelum menarik proyek keluar dari status Retired.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10039": "tidak dapat menambahkan vmnic ke grup server load balancer karena jaringan l3 [uuid:%s] terhubung ke router vpc manapun", + "ORG_ZSTACK_IAM2_API_10016": "login dilarang karena proyek dalam status %s", + "ORG_ZSTACK_IAM2_API_10017": "tidak ada quota[name:%s] yang ada", + "ORG_ZSTACK_IAM2_API_10018": "Batas CPU untuk kontainer (%s) harus lebih besar dari jumlah CPU yang diminta (%s).", + "ORG_ZSTACK_IAM2_API_10019": "Batas ukuran memori untuk kontainer harus lebih besar dari ukuran memori yang diminta.", + "ORG_ZSTACK_OVF_10003": "Pengontrol manajemen volume tidak ditemukan. Harap pastikan layanan manajemen volume Anda dikonfigurasi dan berjalan dengan benar.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10007": "VipQoS untuk Vip [uuid: %s] tidak ada", + "ORG_ZSTACK_OVF_10004": "Pengontrol driver CD tidak ditemukan. Harap pastikan driver virtualisasi yang diperlukan diinstal dan dikonfigurasi untuk instance Anda.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10008": "Tidak dapat menghapus Quality of Service untuk Virtual IP [uuid: %s]. Ini terkait dengan VPC Shared Quality of Service.", + "ORG_ZSTACK_OVF_10001": "Spesifikasi kapasitas disk ilegal: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10005": "Tidak dapat mengatur Quality of Service (Qos) untuk VIP [UUID: %s]. Ini telah dilampirkan ke VpcSharedQos.", + "ORG_ZSTACK_OVF_10002": "Ukuran provisioned disk ilegal: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10006": "VIP QoS untuk VIP [uuid: %s] port %s tidak ada", + "ORG_ZSTACK_OVF_10000": "Referensi disk tidak ditemukan untuk disk %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10009": "Tidak dapat menemukan backend VIP QoS untuk VIP [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10010": "VpcSharedQos harus menentukan Bandwidth", + "ORG_ZSTACK_IPSEC_10028": "Jaringan L3 [%s] tidak dilampirkan ke IPsec tunnel [UUID :%s]", + "ORG_ZSTACK_AUTOSCALING_10000": "UUID jaringan L3 tidak valid[%s] untuk listener yang terkait dengan load balancer[%s], semua jaringan harus dilampirkan ke router virtual yang sama dengan layanan LB dan menjadi bagian dari konfigurasi jaringan VRouter yang sama", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10011": "VPC perlu dilampirkan ke L3[%s] terlebih dahulu", + "ORG_ZSTACK_IPSEC_10029": "CIDR [%s] sudah termasuk dalam konfigurasi IPsec [UUID :%s]", + "ORG_ZSTACK_AUTOSCALING_10001": "melepaskan autoScalingTemplate[%s] dari AutoScalingGroup gagal, error adalah %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10030": "tidak dapat melampirkan jaringan L3 dengan UUID [%s] ke instance SLB karena format IPv6 prefix [%s] tidak valid", + "ORG_ZSTACK_AUTOSCALING_10003": "listener dengan UUID: %s sedang digunakan oleh autoScalingVmTemplate[%s] dan tidak dapat dihapus", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10014": "VpcSharedQos tidak dapat melampirkan VIP ini karena sudah dilampirkan ke VpcSharedQos lain.", + "ORG_ZSTACK_IPSEC_10025": "Jaringan L3 [%s] tidak dapat dilampirkan ke IPsec [UUID:%s] beberapa kali", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10012": "Parameter AttachVipToVpcSharedQos harus menentukan VipUuids atau VipLists", + "ORG_ZSTACK_IPSEC_10026": "harus menyertakan jaringan Layer 3 di APIAttachL3NetworksToIPsecConnectionMsg", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10013": "VpcSharedQos tidak dapat melampirkan VIP ini, karena VIP[%s] tidak berada dalam jaringan L3[%s].", + "ORG_ZSTACK_IPSEC_10027": "Jaringan L3 [%s] bukan jaringan VPC dan tidak dapat dilampirkan atau dilepaskan dari IPsec.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10035": "tidak dapat membuat load balancer karena VIP [uuid:%s] sudah terkait dengan layanan jaringan lain [%s]", + "ORG_ZSTACK_IPSEC_10020": "alamat peer[%s] bukan alamat IPv4 yang valid", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10036": "tidak dapat membuat load balancer karena VIP [uuid:%s] sudah dilampirkan ke router VPC [%s]", + "ORG_ZSTACK_IPSEC_10021": "Kunci autentikasi tidak boleh mengandung spasi kosong atau karakter khusus seperti %s.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10037": "tidak dapat membuat load balancer karena grup SLB tidak valid [uuid:%s]", + "ORG_ZSTACK_IPSEC_10022": "VIP IPsec [%s] tidak boleh menjadi alamat IP pertama atau terakhir dalam rentang CIDR yang terkait dengan jenis pool alamat publik.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10038": "tidak dapat menambahkan NIC server backend ke grup server [uuid:%s], karena UUID NIC adalah null", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10031": "tidak dapat melampirkan jaringan L3 dengan UUID [%s] ke instance SLB karena alamat IP dan prefix harus ditentukan dalam tag sistem", + "ORG_ZSTACK_AUTOSCALING_10004": "Instance tidak ada dalam grup scaling. Silakan verifikasi ID instance dan nama grup scaling [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10032": "tidak dapat melepaskan jaringan L3 front-end [uuid:%s] dari instance SLB", + "ORG_ZSTACK_AUTOSCALING_10005": "alarm dengan UUID:%s dikaitkan dengan autoScalingGroup[%s] dan tidak dapat dihapus", + "ORG_ZSTACK_IAM2_API_10020": "organisasi[uuid:%s] adalah Cloud Tenant dan tidak dapat memiliki organisasi induk", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10033": "tidak dapat melepaskan jaringan L3 manajemen [uuid:%s] dari instance SLB", + "ORG_ZSTACK_AUTOSCALING_10006": "rule[%s] dinonaktifkan", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10034": "tidak dapat melepaskan NIC [uuid:%s] dari instance SLB karena itu adalah antarmuka jaringan Layer 3 backend terakhir", + "ORG_ZSTACK_IAM2_API_10021": "organisasi induk [uuid:%s] tidak dapat menjadi organisasi anak [uuid:%s] dalam struktur organisasi bersarang", + "ORG_ZSTACK_IAM2_API_10022": "nama ID mesin virtual duplikat[%s]", + "ORG_ZSTACK_IAM2_API_10023": "nama lingkungan virtual duplikat[%s]", + "ORG_ZSTACK_IAM2_API_10024": "nama proyek[%s] tidak valid, proyek dengan nama yang sama sudah ada", + "ORG_ZSTACK_IAM2_API_10025": "IAM2OrganizationVO[uuid:%s] tidak ada", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10028": "tidak dapat melampirkan jaringan L3 dengan UUID [%s] ke instance SLB karena alamat IP dan netmask harus ditentukan dalam tag sistem", + "ORG_ZSTACK_IAM2_API_10026": "Proyek [UUID=%s] telah dikaitkan dengan organisasi [UUID=%s].", + "ORG_ZSTACK_OBSERVABILITYSERVER_10019": "Waktu mulai harus lebih kecil dari waktu akhir untuk penjadwalan yang valid di lingkungan cloud.", + "ORG_ZSTACK_IAM2_API_10027": "Proyek [UUID=%s] tidak dikaitkan dengan lingkungan cloud.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10029": "tidak dapat melampirkan jaringan L3 dengan UUID [%s] ke instance SLB karena format alamat IPv6 tidak valid [%s]", + "ORG_ZSTACK_IAM2_API_10028": "organisasi%s tidak diizinkan menjadi anak dari organisasi lain", + "ORG_ZSTACK_IAM2_API_10029": "ID virtual [UUID: %s] tidak termasuk dalam proyek [UUID: %s]", + "ORG_ZSTACK_OBSERVABILITYSERVER_10015": "tidak dapat menemukan jenis layanan ObservabilityServer: %s", + "ORG_ZSTACK_OVF_10015": "penyimpanan backup[UUID: %s] tidak memiliki kapasitas yang tersedia cukup untuk mengekspor VM[UUID: %s], kapasitas yang diperlukan adalah: %d", + "ORG_ZSTACK_OBSERVABILITYSERVER_10016": "layanan[uuid: %s] dengan jenis %s tidak dapat dilepaskan dari observability server[uuid: %s] karena: %s", + "ORG_ZSTACK_OVF_10012": "Konfigurasi CPU 'CoresPerSocket' tidak valid: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10017": "layanan[uuid: %s] tidak dikaitkan dengan observability server[uuid: %s]", + "ORG_ZSTACK_OBSERVABILITYSERVER_10018": "Waktu mulai dan akhir harus ditentukan keduanya untuk periode provisi instance cloud.", + "ORG_ZSTACK_OVF_10010": "'VirtualQuantity' CPU Virtual tidak ditemukan", + "ORG_ZSTACK_OBSERVABILITYSERVER_10011": "instance observability server[uuid: %s] tidak ditemukan", + "ORG_ZSTACK_OVF_10011": "Nilai CPU 'vCPU' tidak valid: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10013": "layanan[uuid: %s] dengan tipe %s tidak dapat dilampirkan ke server observabilitas[uuid: %s] karena: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10000": "Quality of Service (QoS) VIP untuk IPv6 akan segera diimplementasikan.", + "ORG_ZSTACK_ALIYUN_STORAGE_SNAPSHOT_10000": "Operasi ini hanya diizinkan ketika status instance ECS sedang berjalan atau berhenti.", + "ORG_ZSTACK_OVF_10009": "CPU 'InstanceID' tidak ditemukan. Harap verifikasi ID instance dan pastikan CPU telah ditetapkan dengan benar.", + "ORG_ZSTACK_OBSERVABILITYSERVER_10020": "Format tanggal-waktu tidak valid. Diharapkan format ISO-8601 dengan detail zona waktu opsional: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10021": "server observabilitas [UUID: %s] tidak aktif; tidak dapat mengambil data layanan", + "ORG_ZSTACK_OVF_10007": "Memori virtual 'VirtualQuantity' tidak ditemukan", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10003": "SetVipQos harus menentukan InboundBandwidth atau OutboundBandwidth.", + "ORG_ZSTACK_OVF_10008": "Nilai Memori Mesin Virtual tidak valid: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10004": "Tidak dapat menetapkan Quality of Service (QoS) untuk IP Virtual (VIP) ini. Tidak semua jaringan Layer 3 peer menyediakan layanan VIP QoS.", + "ORG_ZSTACK_OVF_10005": "Adaptor Ethernet: %s tidak terhubung ke jaringan.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10001": "QoS VIP untuk VIP [uuid: %s] port %s sudah ada", + "ORG_ZSTACK_OVF_10006": "Mesin virtual '%s' tidak ditemukan", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10002": "Quality of Service VIP untuk VIP [uuid: %s] sudah ada", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10024": "tidak dapat membuat grup SLB karena tipe backend instance tidak valid %s", + "ORG_ZSTACK_IPSEC_10031": "tidak dapat mengubah status karena IPsec [uuid:%s] tidak dalam status siap", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10025": "tidak dapat membuat grup SLB karena IP monitor tidak valid %s", + "ORG_ZSTACK_IPSEC_10032": "tidak dapat menyambungkan kembali terowongan IPsec ini [uuid:%s], harap tingkatkan versi IPsec", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10026": "tidak dapat melampirkan jaringan L3 dengan UUID [%s] ke instance SLB karena format alamat IPv4 tidak valid [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10027": "tidak dapat melampirkan jaringan L3 dengan UUID [%s] ke instance SLB karena kesalahan format netmask IPv4 [%s]", + "ORG_ZSTACK_IAM2_API_10030": "operasi ilegal, tidak dapat menambahkan Role[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10021": "Jaringan backend [UUID:%s] terhubung ke router VPC [UUID:%s], sementara jaringan backend lainnya terhubung ke router VPC [UUID:%s].", + "ORG_ZSTACK_IAM2_API_10031": "tidak dapat beroperasi pada ID mesin virtual yang usang: %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10022": "tidak dapat mengeksekusi operasi API. Jaringan backend [uuid:%s] tidak dapat menjadi jaringan VPC karena jaringan backend lainnya bukan jaringan VPC.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10023": "tidak dapat membuat grup SLB karena tipe deployment tidak valid %s", + "ORG_ZSTACK_IPSEC_10030": "CIDR [%s] tidak berada dalam CIDR yang ditentukan IPsec UUID [%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10026": "Kesalahan operasi: Gagal mengambil respons dari layanan komputasi awan", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10028": "mencadangkan snapshot ke penyimpanan cadangan adalah fitur yang tidak digunakan lagi dan akan dihapus di versi platform awan mendatang", + "ORG_ZSTACK_IAM2_API_10000": "nama atribut tidak boleh kosong, nilai[%s]", + "ORG_ZSTACK_IAM2_API_10001": "nama atribut[%s] melebihi panjang maksimum 2048 karakter", + "ORG_ZSTACK_IAM2_API_10002": "nilai atribut[name:%s] melebihi panjang maksimum 2048 karakter", + "ORG_ZSTACK_IAM2_API_10003": "Organisasi[UUID: %s] telah melebihi Batas yang Diminta untuk [Nama: %s, Nilai yang Digunakan: %s].", + "ORG_ZSTACK_IAM2_API_10005": "%s bukan nilai yang valid untuk kontrol lalu lintas jaringan. Nilai yang valid adalah allow/reject antara rentang IP tertentu.", + "ORG_ZSTACK_IAM2_API_10006": "Unit organisasi default[%s] tidak dapat dihapus", + "ORG_ZSTACK_IAM2_API_10007": "identifier template duplikat[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10018": "VpcSharedQos tidak dapat melepaskan Vip ini karena Vpc[%s] tidak terhubung", + "ORG_ZSTACK_IAM2_API_10009": "Nama pengguna 'admin' sudah dipesan di lingkungan komputasi cloud untuk menunjukkan hak istimewa administratif. Silakan pilih nama lain untuk pengguna Anda.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10016": "Parameter DetachVipFromVpcSharedQos harus menentukan VipUuids atau VipLists", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10017": "VpcSharedQos tidak dapat melepaskan VIP ini, karena VIP[%s] tidak terpasang", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10010": "penyimpanan utama ceph [uuid:%s] mungkin telah dihapus atau dihentikan.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10013": "Penyimpanan utama Ceph [UUID: %s, nama: %s] tidak tersedia, karena satu Monitor [UUID: %s] melaporkan kegagalan operasi [%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10012": "Terdapat penyimpanan utama CEPH lain dengan FSID yang sama; Anda tidak dapat menambahkan konfigurasi CEPH yang sama sebagai dua penyimpanan utama yang berbeda.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10015": "Tidak dapat建立 koneksi dengan penyimpanan utama [%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10017": "node monitor [ip:%s] mengembalikan fsid[%s] yang berbeda dari fsid cluster saat ini[%s], apakah Anda salah menambahkan node monitor yang tidak termasuk dalam cluster ini?", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10016": "Tidak dapat menambahkan node MON ke solusi penyimpanan utama berbasis Ceph", + "ORG_ZSTACK_IAM2_API_10010": "nama tidak valid[%s], proyek atau akun dengan pengenal yang sama sudah ada", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10008": "tidak dapat terhubung ke penyimpanan utama Ceph [UUID:%s], gagal menghubungkan semua monitor Ceph.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10007": "semua monitor tidak dapat mengeksekusi permintaan HTTP[%s]", + "ORG_ZSTACK_ZOPS_10009": "gagal mengambil sumber chrony, karena:%s", + "ORG_ZSTACK_ZOPS_10005": "%s tidak dapat dijangkau dari %s karena:%s", + "ORG_ZSTACK_ZOPS_10004": "gagal mengkonfigurasi sumber waktu '%s' di %s, karena:%s, raw: %s", + "ORG_ZSTACK_ZOPS_10007": "%s gagal memverifikasi status kesehatan cluster Ceph karena: %s", + "ORG_ZSTACK_ZOPS_10006": "gagal memverifikasi apakah %s dapat dijangkau dari %s karena:%s", + "ORG_ZSTACK_ZOPS_10001": "%s bukan alamat IP instance cloud yang valid", + "ORG_ZSTACK_ZOPS_10003": "%s bukan alamat IP atau hostname yang valid", + "ORG_ZSTACK_ZOPS_10002": "Server Chrony internal dan eksternal tidak boleh kosong secara bersamaan. Harap pastikan keduanya dikonfigurasi dengan benar.", + "ORG_ZSTACK_ZOPS_10010": "gagal mengambil sumber chrony %s, karena:%s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10001": "Penyimpanan cadangan [UUID: %s, Nama: %s, FSID: %s] bukan bagian dari cluster Ceph yang sama dengan penyimpanan utama [UUID: %s, Nama: %s, FSID: %s].", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10004": "gagal menyimpan cache gambar terenkripsi: %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10005": "fsid tidak konsisten antara penyimpanan utama [ps(%s)] dan penyimpanan cadangan [bs(%s)]. Oleh karena itu, pembuatan template dilarang.", + "ORG_ZSTACK_ZOPS_10019": "gagal menghapus server chrony lama di zstack.properties di %s, karena:%s", + "ORG_ZSTACK_ZOPS_10016": "ZStone saat ini tidak mendukung pembaruan server chrony secara online. Harap pastikan semua perubahan dilakukan secara offline sebelum deployment.", + "ORG_ZSTACK_ZOPS_10015": "%s tidak dapat dijangkau dari lingkungan mesin virtual saat ini", + "ORG_ZSTACK_ZOPS_10018": "Status klaster CEPH tidak sehat. Harap verifikasi lingkungan Anda terlebih dahulu! %s", + "ORG_ZSTACK_ZOPS_10012": "gagal memeriksa apakah %s dapat dijangkau dari host %s karena tidak berada di bawah pengelolaan kami", + "ORG_ZSTACK_ZOPS_10011": "gagal menyinkronkan server chrony di %s karena:%s, raw: %s", + "ORG_ZSTACK_ZOPS_10014": "%s tidak dapat ditetapkan sebagai server waktu chrony eksternal!", + "ORG_ZSTACK_ZOPS_10020": "gagal mengonfigurasi server chrony %s di zstack.properties di %s, karena:%s", + "ORG_ZSTACK_PROXY_10000": "Tidak dapat menemukan Konfigurasi Proxy Pengguna dengan UUID %s", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10005": "gagal memulai server redireksi USB dari host[uuid:%s]", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10004": "tidak dapat memulai layanan USB pada host[%s], karena host tidak terhubung", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10003": "host[%s] telah memulai lebih dari 64 port redireksi USB", + "ORG_ZSTACK_COMPUTE_HOST_10085": "Tidak dapat mengonfigurasi jaringan manajemen pada antarmuka karena diatur ke mode penugasan otomatis.", + "ORG_ZSTACK_COMPUTE_HOST_10084": "Tidak dapat melepaskan jaringan manajemen dari antarmuka karena merupakan jenis yang ditetapkan secara otomatis.", + "ORG_ZSTACK_COMPUTE_HOST_10087": "Tidak dapat melepaskan jaringan manajemen dari antarmuka bonding karena menggunakan akuisisi IP otomatis.", + "ORG_ZSTACK_COMPUTE_HOST_10081": "Tidak dapat mengonfigurasi alamat IP untuk antarmuka slave bridge", + "ORG_ZSTACK_COMPUTE_HOST_10080": "Alamat IP telah ditetapkan ke antarmuka lain. Harap pastikan alamat IP unik di semua antarmuka jaringan.", + "ORG_ZSTACK_COMPUTE_HOST_10083": "UUID bonding tidak valid untuk antarmuka jaringan virtual %s", + "ORG_ZSTACK_COMPUTE_HOST_10089": "Jenis layanan yang ditentukan tidak valid. Harap gunakan jenis layanan yang valid untuk lingkungan komputasi cloud.", + "ORG_ZSTACK_COMPUTE_HOST_10088": "Tidak dapat menetapkan jaringan manajemen pada bonding karena jaringan manajemen menggunakan penugasan otomatis.", + "ORG_ZSTACK_COMPUTE_HOST_10090": "simulasi mematikan mesin virtual[%s] melalui IPMI gagal.", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10001": "Gagal membuat koneksi ke server SMTP di host: %s dan port: %d. Harap verifikasi kebenaran konfigurasi smtpServer dan smtpPort. [error=%s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10002": "tidak dapat membuat koneksi ke server SMTP[server: %s, port: %s] dalam 15 detik", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10003": "Error validasi server SMTP: %s", + "ORG_ZSTACK_AI_COLLECTOR_10000": "Tidak ditemukan konteks deploy untuk pengumpulan metadata MindIE di lingkungan virtual. Harap pastikan sumber daya cloud dikonfigurasi dengan benar dan tersedia.", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10004": "Titik akhir yang ditentukan dinonaktifkan. Harap konfigurasi titik akhir Anda.", + "ORG_ZSTACK_AI_COLLECTOR_10001": "Beberapa konteks deployment tidak memiliki inventaris mesin virtual, mencegah pengumpulan metadata MindIE.", + "ORG_ZSTACK_COMPUTE_HOST_10096": "reset daya host[%s] melalui IPMI gagal.", + "ORG_ZSTACK_COMPUTE_HOST_10095": "simulasi reset daya mesin virtual melalui IPMI gagal. [%s]", + "ORG_ZSTACK_COMPUTE_HOST_10098": "host[%s] menerima nilai pengembalian yang tidak terduga", + "ORG_ZSTACK_COMPUTE_HOST_10097": "Informasi IPMI tidak lengkap untuk instance %s. Silakan periksa dan berikan detail yang diperlukan.", + "ORG_ZSTACK_COMPUTE_HOST_10092": "power on instance tiruan oleh IPMI gagal untuk host[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10091": "power off host[%s] oleh IPMI gagal.", + "ORG_ZSTACK_COMPUTE_HOST_10094": "reboot host[%s:%d] gagal karena instance sudah dalam keadaan power off", + "ORG_ZSTACK_COMPUTE_HOST_10093": "power on host[%s] oleh IPMI gagal.", + "ORG_ZSTACK_COMPUTE_HOST_10099": "host[%s] tidak dapat建立 koneksi dengan ipmi[%s], reason:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10002": "tidak dapat memverifikasi MD5 checksum file dalam direktori[%s].\\nstdout:%s\\nstderr:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10003": "tidak dapat memverifikasi MD5 checksum file dalam folder[%s] pada host[ip:%s].\\nstdout:%s\\nstderr:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10000": "Nama pengguna, kata sandi, atau nomor port mungkin salah. Silakan verifikasi dan coba lagi.", + "ORG_ZSTACK_COMPUTE_HOST_10065": "gagal mengupdate label jaringan host [uuid:%s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10000": "Masalah mungkin disebabkan oleh access key atau secret key yang salah atau izin IAM ditolak. [error=%s]", + "ORG_ZSTACK_COMPUTE_HOST_10064": "gagal menghapus label jaringan host [uuid:%s]", + "ORG_ZSTACK_COMPUTE_HOST_10067": "format alamat IP tidak valid[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10066": "host(s) [%s] tidak terhubung, power off tidak didukung", + "ORG_ZSTACK_COMPUTE_HOST_10069": "set IP tidak valid, harus ditentukan dengan netmask dalam notasi CIDR", + "ORG_ZSTACK_COMPUTE_HOST_10068": "format subnet mask tidak valid[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10073": "Tidak dapat mengonfigurasi alamat IP pada interface slave bonding", + "ORG_ZSTACK_COMPUTE_HOST_10070": "Tidak dapat mengonfigurasi alamat IP untuk interface jaringan manajemen.%s", + "ORG_ZSTACK_COMPUTE_HOST_10078": "Tidak dapat mengonfigurasi alamat IP untuk interface bonding yang terkait dengan jaringan manajemen", + "ORG_ZSTACK_COMPUTE_HOST_10077": "UUID interface yang ditentukan tidak valid", + "ORG_ZSTACK_IMAGE_10019": "Sesi upload telah kedaluwarsa. Pastikan sesi upload Anda aktif dan coba lagi.", + "ORG_ZSTACK_IMAGE_10016": "Gagal karena reboot node manajemen.", + "ORG_ZSTACK_IMAGE_10015": "jalur gambar tidak berada dalam daftar yang disetujui: %s", + "ORG_ZSTACK_IMAGE_10014": "Semua instance di server ini tidak dapat mengakses gambar", + "ORG_ZSTACK_IMAGE_10013": "jalur gambar [%s] termasuk dalam daftar hitam %s", + "ORG_ZSTACK_IMAGE_10012": "Jalur absolut harus ditentukan untuk file sumber. Harap berikan jalur lengkap ke file.", + "ORG_ZSTACK_IMAGE_10011": "URL yang diberikan harus dimulai dengan 'file:///', 'http://', 'https://', 'ftp://', 'sftp://', atau '/'.", + "ORG_ZSTACK_IMAGE_10010": "tidak ada backup storage yang ditentukan di uuids%s tersedia untuk menambahkan gambar ini; mereka tidak dalam status %s atau tidak dalam keadaan %s, atau UUID adalah UUID backup storage yang tidak valid", + "ORG_ZSTACK_IMAGE_10009": "format gambar tidak didukung[%s]", + "ORG_ZSTACK_IMAGE_10008": "format tidak diketahui[%s]", + "ORG_ZSTACK_IMAGE_10007": "ISO tidak dapat digunakan sebagai citra disk sistem.", + "ORG_ZSTACK_IMAGE_10006": "snapshot volume[uuid:%s] tidak diaktifkan, statusnya %s", + "ORG_ZSTACK_IMAGE_10005": "snapshot volume[uuid:%s] tidak Ready, statusnya %s", + "ORG_ZSTACK_IMAGE_10004": "volume[uuid:%s] tidak diaktifkan, status saat ini %s", + "ORG_ZSTACK_IMAGE_10003": "volume[uuid:%s] tidak Ready, statusnya %s", + "ORG_ZSTACK_IMAGE_10002": "Arsitektur AArch64 tidak mendukung fitur warisan. Harap pastikan konfigurasi Anda kompatibel dengan arsitektur AArch64.", + "ORG_ZSTACK_ALIYUN_ACCOUNT_10000": "tidak dapat establish koneksi ke [%s] dalam %d milidetik, menunjukkan bahwa layanan Alibaba Cloud OpenAPI tidak dapat diakses.", + "ORG_ZSTACK_IMAGE_10039": "Tidak ditemukan penyimpanan cadangan yang terhubung untuk image[uuid:%s, name:%s]", + "ORG_ZSTACK_IMAGE_10038": "Image dengan UUID [uuid:%s] dan nama [name:%s] tidak tersimpan di penyimpanan cadangan manapun.", + "ORG_ZSTACK_IMAGE_10037": "gagal membuat template data volume dari volume[uuid:%s] di semua penyimpanan cadangan%s. Lihat penyebab salah satu kesalahan", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10041": "mengharapkan nilai boolean atau Condition lain, Conditions saat ini mencakup: %s, tetapi mendapatkan %s", + "ORG_ZSTACK_IMAGE_10036": "gagal mengalokasikan semua penyimpanan cadangan[uuid:%s], daftar kesalahan: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10040": "Instance EC2 null! Harap pastikan ID instance benar dan tidak null.", + "ORG_ZSTACK_IMAGE_10035": "Tidak dapat menemukan solusi penyimpanan cadangan yang tepat. Harap pastikan konfigurasi penyimpanan cloud Anda benar dan dapat diakses.", + "ORG_ZSTACK_IMAGE_10034": "gagal membuat image dari volume root[uuid:%s] di semua penyimpanan cadangan; harap periksa penyebab salah satu kesalahan", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10002": "sumber daya tidak mencukupi untuk image[uuid:%s] download selama migrasi penyimpanan volume[uuid:%s], kapasitas yang diperlukan: %s, kapasitas fisik yang tersedia saat ini: %s", + "ORG_ZSTACK_IMAGE_10032": "tidak dapat mengalokasikan penyimpanan cadangan yang ditentukan oleh UUIDs%s, daftar kesalahan: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10003": "Kapasitas tidak mencukupi untuk migrasi penyimpanan volume [UUID: %s]; kapasitas yang diperlukan: %d, kapasitas fisik yang tersedia saat ini: %d", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10004": "data pada PS sumber[uuid:%s] telah dibuang dan rollback tidak didukung", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10005": "Migrasi volume tanpa snapshot pada shared block storage tidak didukung dan tidak dapat dibatalkan.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10000": "Ditemukan ID trash (%s) di Primary Storage [%s] untuk migrate install path [%s]. Harap bersihkan terlebih dahulu menggunakan 'APICleanUpTrashOnPrimaryStorageMsg' jika Anda tetap ingin memigrasikan volume [%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10001": "tidak dapat menemukan image dengan UUID:%s di penyimpanan cadangan manapun yang terhubung ke zona dengan UUID:%s. Harap periksa berikut:", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10039": "1. Pastikan penyimpanan cadangan terhubung ke zona dengan UUID:%s.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10032": "2. Verifikasi bahwa penyimpanan cadangan dalam keadaan terhubung; coba hubungkan kembali jika perlu.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10036": "hanya method yang dapat didefinisikan dalam Function, tetapi menemukan %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10035": "Fn::FindInMap tidak dapat menemukan resources [%s] dalam Resources map!", + "ORG_ZSTACK_CORE_ERRORCODE_10007": "Tidak ditemukan Reference [%s]!", + "ORG_ZSTACK_CORE_ERRORCODE_10005": "fungsi yang tidak didukung [%s] tidak didukung dalam template sumber daya ZStack!", + "ORG_ZSTACK_IMAGE_10026": "Argumen input 'regex' atau 'category' harus ditentukan untuk pemfilteran sumber daya cloud.", + "ORG_ZSTACK_CORE_ERRORCODE_10006": "elaboration code harus berupa nilai numerik!", + "ORG_ZSTACK_IMAGE_10025": "gambar sumber [%s] tidak ada", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10051": "%s tidak dapat dikonversi ke CloudString", + "ORG_ZSTACK_CORE_ERRORCODE_10003": "%s bukan direktori yang valid atau kosong", + "ORG_ZSTACK_CORE_ERRORCODE_10004": "kesalahan pembacaan saat mengolah file template [%s] gagal, karena: %s", + "ORG_ZSTACK_IMAGE_10023": "vm instance[uuid:%s] tidak memiliki volume root", + "ORG_ZSTACK_IMAGE_10022": "vm instance [uuid:%s] tidak memiliki volume yang terpasang", + "ORG_ZSTACK_IMAGE_10021": "penyimpanan backup[uuid:%s] tidak dalam keadaan terhubung, status saat ini adalah %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10042": "mengharapkan nilai boolean 'true' atau 'false' untuk objek, tetapi mendapatkan %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10046": "Fn::GetAtt tidak dapat menemukan sumber daya yang ditentukan [%s] dalam daftar sumber daya!", + "ORG_ZSTACK_SSO_SAML2_SERVICE_10000": "iam2 berisi pengguna dengan nama yang sama[%s], jenis yang diharapkan[%s] tetapi menemukan jenis[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10119": "Host [%s] tidak memiliki perangkat IPMI yang dikonfigurasi atau perangkat IPMI tidak memiliki alamat. Setelah mengonfigurasi alamat IPMI, harap hubungkan kembali host untuk menyegarkan informasi IPMI-nya.", + "ORG_ZSTACK_ZQL_AST_VISITORS_PLUGIN_10000": "Bidang yang akan dijumlahkan harus ditentukan.", + "ORG_ZSTACK_SSO_SAML2_SERVICE_10001": "login SAML duplikat[%s] untuk jenis[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10120": "gagal memig vm[uuid:%s] di host[uuid:%s, name:%s, ip:%s], akan mencoba pencopotan yang anggun.", + "ORG_ZSTACK_CORE_ERRORCODE_10001": "File sumber dan konten JSON tidak boleh kosong secara bersamaan. Harap pastikan bahwa file sumber yang valid atau konten JSON diberikan.", + "ORG_ZSTACK_CORE_ERRORCODE_10002": "Tidak dapat memindai direktori sumber daya: %s", + "ORG_ZSTACK_CORE_ERRORCODE_10000": "Tidak ada file atau konten input yang diberikan untuk konfigurasi sumber daya komputasi awan", + "ORG_ZSTACK_COMPUTE_HOST_10124": "Percobaan koneksi host gagal, permintaan ping batas waktu. Harap verifikasi konektivitas jaringan dan pastikan host beroperasi.", + "ORG_ZSTACK_COMPUTE_HOST_10104": "Host dengan IP manajemen [%s] untuk hypervisor [%s] telah terdeteksi.", + "ORG_ZSTACK_COMPUTE_HOST_10103": "cluster[uuid:%s] memiliki jenis hypervisor yang tidak terdefinisi", + "ORG_ZSTACK_COMPUTE_HOST_10106": "arsitektur cluster[uuid:%s] adalah %s, yang tidak cocok dengan arsitektur host[name:%s, ip:%s] yaitu %s", + "ORG_ZSTACK_COMPUTE_HOST_10105": "setelah menghubungkan, host[name:%s, ip:%s] mengembalikan arsitektur virtual null", + "ORG_ZSTACK_COMPUTE_HOST_10100": "ipmi host[%s] tidak dapat dijangkau karena %s", + "ORG_ZSTACK_COMPUTE_HOST_10102": "cluster[uuid:%s] tidak ada", + "ORG_ZSTACK_SCHEDULER_10008": "unit waktu yang ditentukan tidak valid: %s", + "ORG_ZSTACK_SCHEDULER_10005": "volume[%s] tidak mendukung kebijakan retensi snapshot", + "ORG_ZSTACK_SCHEDULER_10006": "snapshotMaxNumber: Format tidak benar karena %s", + "ORG_ZSTACK_COMPUTE_HOST_10108": "jenis layanan jaringan host sistem[%s] tidak dapat dihentikan", + "ORG_ZSTACK_COMPUTE_HOST_10107": "penyimpanan primer [uuid:%s] telah terputus, dan host tidak lagi memiliki sumber daya penyimpanan primer yang terpasang", + "ORG_ZSTACK_COMPUTE_HOST_10109": "jenis layanan jaringan host sistem[%s] tidak dapat diperbarui karena pengaturan virtualisasi yang berkonflik", + "ORG_ZSTACK_SCHEDULER_10002": "Tugas sebelumnya belum berhasil diselesaikan. Melewati tugas ini.", + "ORG_ZSTACK_COMPUTE_HOST_10114": "tidak dapat memelihara host[uuid:%s, status:%s] yang tidak Connected", + "ORG_ZSTACK_COMPUTE_HOST_10111": "Instance server WebSSH tidak aktif. Pastikan server SSH cloud (%s) berjalan dan dikonfigurasi dengan benar.", + "ORG_ZSTACK_COMPUTE_HOST_10110": "telah ada tipe layanan jaringan host[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10113": "managementIp[%s] bukan alamat IPv4 atau hostname yang valid", + "ORG_ZSTACK_COMPUTE_HOST_10112": "telah ada host dengan IP manajemen[%s]", + "ORG_ZSTACK_SCHEDULER_10018": "VM telah menjadwalkan pekerjaan dengan tipe [%s]", + "ORG_ZSTACK_SCHEDULER_10016": "VM dari volume root [%s] tidak tersedia. Harap verifikasi apakah VM tersebut ada.", + "ORG_ZSTACK_SCHEDULER_10017": "snapshotGroupMaxNumber: Format tidak benar karena %s", + "ORG_ZSTACK_SCHEDULER_10014": "Volume[%s] tidak tersedia. Harap verifikasi apakah volume ada dan terpasang dengan benar.", + "ORG_ZSTACK_SCHEDULER_10015": "volume[%s] bukan volume root", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10068": "tidak ada volume ditemukan di migrateVolumeStructs selama migrasi antara shared block group primary storage!", + "ORG_ZSTACK_SCHEDULER_10013": "field[%s] tidak boleh kosong untuk konfigurasi cloud instance", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10067": "struktur migrasi volume kosong di migrateVolumesBetweenSharedBlockGroupPrimaryStorageMsg!", + "ORG_ZSTACK_VPCFIREWALL_10027": "ruleSet[%s] sudah memiliki aturan dengan nomor aturan yang ditentukan %s.", + "ORG_ZSTACK_IPSEC_10006": "Jaringan [UUID: %s] tidak memiliki layanan IPsec yang diaktifkan.", + "ORG_ZSTACK_VPCFIREWALL_10028": "tidak dapat menambahkan aturan firewall[%d] hanya protokol TCP atau UDP yang dapat menggunakan port", + "ORG_ZSTACK_IPSEC_10007": "remote CIDR[%s] tumpang tindih dengan CIDR yang ada", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10000": "VM NICs baru yang ditambahkan dan VM NICs yang dilampirkan tidak berada pada virtual router yang sama; mereka berada pada virtual router berbeda dengan UUID: %s dan %s.", + "ORG_ZSTACK_IPSEC_10008": "remote CIDR[%s] dan remote CIDR[%s] tumpang tindih", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10001": "VM NICs baru yang ditambahkan[uuids:%s] dan L3 networks peer[uuids:%s] dari load balancer[uuid: %s]'s VIP tidak berada pada virtual router yang sama, mereka berada pada virtual router berbeda dengan UUIDs[uuids:%s]", + "ORG_ZSTACK_IPSEC_10009": "CIDR[%s] dari router lokal dan CIDR[%s] dari router remote tumpang tindih", + "ORG_ZSTACK_IPSEC_10002": "Rentang port saat ini [%s, %s] bentrok dengan rentang port yang digunakan [%s, %s] untuk VIP [uuid: %s] protokol: UDP", + "ORG_ZSTACK_IPSEC_10003": "cidr[%s] dari L3Network yang dilampirkan [uuid:%s] tumpang tindih dengan ipsec remote cidr[%s] dari uuid:%s", + "ORG_ZSTACK_VPCFIREWALL_10029": "tidak dapat menambahkan aturan firewall[%d] hanya protokol TCP yang dapat menggunakan TCP flags", + "ORG_ZSTACK_IPSEC_10005": "File sumber untuk kode Java tidak ditemukan. Harap pastikan file yang diperlukan diunggah dan disertakan dalam proyek Anda.", + "ORG_ZSTACK_VPCFIREWALL_10020": "tidak dapat melampirkan rule set default ke kartu antarmuka jaringan lain", + "ORG_ZSTACK_IPSEC_10000": "tidak dapat menemukan Koneksi IPsec [UUID:%s], mungkin telah dihapus", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10006": "vmnic harus ditentukan untuk berbagi sumber daya load balancer.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10073": "VM [UUID: %s] tidak memiliki soket QMP tambahan yang dikonfigurasi. Ini mungkin karena VM dimulai tanpa konfigurasi global [vm.additionalQmp] diaktifkan. Harap pastikan konfigurasi ini diaktifkan dan reboot VM di ZStack.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10007": "tidak dapat menemukan router virtual untuk load balancer [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10072": "primary storage [UUID: %s] telah melampirkan SCSI LUN [WWID: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10071": "tidak dapat menemukan jenis hypervisor yang sesuai untuk primary storage [uuid:%s] untuk menangani format gambar atau format volume [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10004": "segarkan sertifikat load balancer karena:%s", + "ORG_ZSTACK_VPCFIREWALL_10021": "ruleSet[%s] sudah berisi l3[%s]", + "ORG_ZSTACK_SCHEDULER_10009": "trigger job[uuid: %s] gagal, karena terjadi kesalahan dalam proses provisioning instance mesin virtual", + "ORG_ZSTACK_ZWATCH_MYSQL_10001": "tidak ditemukan instance database MySQL[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10005": "segarkan listener load balancer karena:%s", + "ORG_ZSTACK_VPCFIREWALL_10022": "sudah memiliki aturan dengan nomor[%s]", + "ORG_ZSTACK_SCHEDULER_10029": "Tidak dapat menambahkan job[uuid:%s] ke trigger yang sudah usang[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10077": "shared volume[uuid: %s] pada shared block group primary storage tidak dapat diubah ukurannya", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10076": "tidak dapat menemukan volume[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10075": "shared block[UUID:%s, diskUUID:%s, description:%s] sudah ada dalam shared block group[UUID:%s] di shared block group baru", + "ORG_ZSTACK_SCHEDULER_10028": "Tidak dapat menambahkan job dengan UUID [%s] ke trigger dengan UUID [%s] yang sama dua kali", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10074": "harus menentukan setidaknya satu disk ketika menambahkan shared block group untuk primary storage", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10079": "tidak dapat menemukan persiapan volume[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10078": "shared volume[UUID: %s] pada shared block group primary storage terpasang ke instance VM yang tidak dihentikan[UUID: %s]", + "ORG_ZSTACK_SCHEDULER_10021": "interval harus ditentukan ketika menggunakan penjadwal sederhana untuk operasi berulang lebih dari sekali", + "ORG_ZSTACK_VPCFIREWALL_10016": "Hanya protokol TCP atau UDP yang dapat menggunakan port di lingkungan komputasi awan", + "ORG_ZSTACK_VPCFIREWALL_10017": "Hanya protokol TCP yang dapat menggunakan flag TCP", + "ORG_ZSTACK_IPSEC_10018": "VIP[uuid:%s] telah digunakan untuk %s instance(s)", + "ORG_ZSTACK_VPCFIREWALL_10014": "ruleSet[%s] sudah memiliki aturan dengan prioritas yang sama %d", + "ORG_ZSTACK_IPSEC_10019": "alamat peer[%s] tidak dapat sama dengan alamat VIP", + "ORG_ZSTACK_VPCFIREWALL_10015": "tidak dapat memperbarui aturan default[%s]", + "ORG_ZSTACK_IPSEC_10013": "Semua jaringan dalam IPsec Connection yang sama harus diasosiasikan dengan Virtual Private Cloud (VPC) router yang sama", + "ORG_ZSTACK_IPSEC_10014": "Tidak ada master VPC untuk HA group %s", + "ORG_ZSTACK_VPCFIREWALL_10018": "Protokol ICMP adalah satu-satunya protokol yang dapat menggunakan tipe ICMP. Harap pastikan kode Anda menentukan protokol yang benar", + "ORG_ZSTACK_IPSEC_10015": "Ada VPC[%s] yang menggunakan plugin IPsec lama; harap upgrade untuk membuat koneksi IPsec", + "ORG_ZSTACK_VPCFIREWALL_10019": "indeks aturan [%%s] tidak valid", + "ORG_ZSTACK_IPSEC_10016": "Sudah ada koneksi IPsec[uuid:%s, name:%s] dengan virtual router dan alamat peer yang sama", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10080": "gunakan penyimpanan thick-provisioning sebagai volume cache; provisioning volume [%s] adalah %s", + "ORG_ZSTACK_IPSEC_10010": "Semua jaringan dalam koneksi IPsec yang sama harus memiliki jenis yang sama.", + "ORG_ZSTACK_IPSEC_10011": "IPsecConnection hanya dapat memiliki 1 jaringan untuk %s", + "ORG_ZSTACK_IPSEC_10012": "L3Network [UUID: %s] belum dilampirkan ke router VPC", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10084": "tidak dapat mengambil UUID klaster dari volume %s", + "ORG_ZSTACK_VPCFIREWALL_10010": "sudah memiliki template aturan dengan nama %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10081": "SCSI LUN dengan UUID [%s] dan WWID [%s] sudah dilampirkan ke penyimpanan utama dengan UUID [%s].", + "ORG_ZSTACK_SCHEDULER_10038": "Format ekspresi cron tidak valid. Pastikan mengikuti sintaks CRON standar.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10086": "tidak dapat menemukan host KVM yang memenuhi syarat untuk penyimpanan utama grup blok bersama[uuid: %s]", + "ORG_ZSTACK_SCHEDULER_10039": "Tugas cron harus mengikuti format: \"0 0/3 17-23 * * ?\"", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10085": "sanlock menunjukkan bahwa host %s tidak dapat dijangkau pada %s", + "ORG_ZSTACK_SCHEDULER_10036": "stopTime telah melampaui waktu saat ini di lingkungan virtual. Pastikan stopTime diatur ke titik waktu di masa depan.", + "ORG_ZSTACK_SCHEDULER_10037": "cron harus dikonfigurasi saat menggunakan penjadwal cron", + "ORG_ZSTACK_SCHEDULER_10034": "Durasi timeout berada di luar rentang yang valid", + "ORG_ZSTACK_SCHEDULER_10035": "stopTime melebihi rentang valid untuk format timestamp MySQL", + "ORG_ZSTACK_SCHEDULER_10032": "startTime harus ditentukan agar penjadwal sederhana dapat berfungsi dengan benar.", + "ORG_ZSTACK_SCHEDULER_10033": "schedulerInterval harus dikonfigurasi agar penjadwal sederhana dapat berfungsi dengan benar.", + "ORG_ZSTACK_SCHEDULER_10030": "Ada [%d] pemicu yang ditambahkan ke job[uuid:%s], melebihi jumlah maksimum pemicu yang diizinkan.", + "ORG_ZSTACK_SCHEDULER_10031": "Ada [%d] pemicu yang ditambahkan ke grup job [UUID:%s], dan tidak ada pemicu tambahan yang dapat ditambahkan.", + "ORG_ZSTACK_VPCFIREWALL_10005": "router [uuid:%s] tidak memiliki router master", + "ORG_ZSTACK_VPCFIREWALL_10006": "VPC Router[uuid:%s] sudah memiliki firewall yang dikonfigurasi.", + "ORG_ZSTACK_VPCFIREWALL_10003": "Tidak dapat menghapus set aturan default sistem", + "ORG_ZSTACK_VPCFIREWALL_10004": "Tidak dapat menghapus aturan sistem default", + "ORG_ZSTACK_VPCFIREWALL_10001": "Hanya set aturan yang ditentukan sistem yang dapat memodifikasi jenis tindakan.", + "ORG_ZSTACK_VPCFIREWALL_10000": "tidak dapat melepas set aturan default dalam jaringan virtual", + "ORG_ZSTACK_SCHEDULER_10045": "grup job telah berisi %d tugas, hanya %d slot tersisa", + "ORG_ZSTACK_SCHEDULER_10043": "Tidak ditemukan Scheduler Job Factory dengan tipe[%s]", + "ORG_ZSTACK_SCHEDULER_10044": "%d tugas memiliki tipe instance yang berbeda dari grup job", + "ORG_ZSTACK_SCHEDULER_10041": "startTime harus berupa bilangan bulat positif atau 0", + "ORG_ZSTACK_SCHEDULER_10042": "Waktu mulai yang ditentukan untuk instance Anda berada di luar rentang. Pastikan berada dalam parameter yang valid.", + "ORG_ZSTACK_SCHEDULER_10040": "Konfigurasi penjadwal cron hanya memerlukan penentuan ekspresi tugas cron.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10005": "Harap integrasikan zbox ke dalam node manajemen untuk alokasi sumber daya cloud.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10006": "gagal mencadangkan database: %s", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10003": "layanan[%s] tidak aktif", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10007": "Ada cadangan eksternal lain [UUID: %s] dalam mode pemulihan.", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10002": "layanan[%s] tidak mendukung pengisian ulang konfigurasi", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10008": "baik UUID host maupun UUID penyimpanan cadangan kosong. Anda harus menentukan setidaknya salah satunya.", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10001": "layanan[%s] tidak ditemukan", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10001": "beberapa pemulihan volume[uuids:%s] gagal. Anda dapat memulainya lagi dengan menghubungkan ulang.", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10000": "layanan[%s] telah terdaftar dan sekarang aktif di lingkungan cloud.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10002": "tidak dapat menemukan file konfigurasi pemulihan recover.conf di bawah direktori instalasi cadangan zbox.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10004": "Zbox harus dilampirkan ke host terlebih dahulu.", + "ORG_ZSTACK_VPCFIREWALL_10069": "tidak dapat menemukan template set IP firewall VPC dengan UUID: %s, mungkin telah dihapus", + "ORG_ZSTACK_VPCFIREWALL_10063": "lampirkan set aturan firewall[%s] gagal karena kesalahan terkait konfigurasi jaringan virtual", + "ORG_ZSTACK_VPCFIREWALL_10064": "melepaskan ruleSet gagal, mungkin karena penghapusan", + "ORG_ZSTACK_VPCFIREWALL_10061": "menghapus aturan firewall gagal pada vRouter[%s], karena %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10010": "Fn::Select indeks di luar rentang, harap verifikasi konfigurasi JSON Anda!", + "ORG_ZSTACK_VPCFIREWALL_10062": "mengubah status aturan firewall pada vRouter[%s] gagal karena %s", + "ORG_ZSTACK_VPCFIREWALL_10067": "tidak dapat menemukan firewall VPC dengan UUID: %s terkait router virtual", + "ORG_ZSTACK_VPCFIREWALL_10068": "tidak dapat menemukan set aturan firewall VPC dengan UUID: %s, mungkin telah dihapus", + "ORG_ZSTACK_VPCFIREWALL_10065": "melepaskan set aturan firewall[%s] gagal karena %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10014": "Parameter [%s] tidak ditemukan!", + "ORG_ZSTACK_VPCFIREWALL_10066": "tidak dapat menemukan firewall VPC dengan UUID: %s, mungkin telah dihapus", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10013": "Parameter [%s] tidak memiliki nilai yang ditentukan atau nilai default ditemukan!", + "ORG_ZSTACK_VPCFIREWALL_10060": "membuat set aturan firewall[%s] gagal karena %s", + "ORG_ZSTACK_IMAGE_10046": "Gambar dengan UUID [uuid:%s] dan nama [name:%s] belum dihapus dari penyimpanan cadangan dengan UUID [uuid:%s].", + "ORG_ZSTACK_IMAGE_10045": "Gambar dengan UUID [uuid:%s] dan nama [name:%s] tidak tersedia di penyimpanan cadangan dengan UUID [uuid:%s].", + "ORG_ZSTACK_IMAGE_10044": "Gambar dengan UUID [uuid:%s] dan nama [name:%s] belum dihapus dari penyimpanan cadangan mana pun.", + "ORG_ZSTACK_IMAGE_10043": "Gambar dengan UUID [uuid:%s] dan nama [name:%s] memiliki status [status:%s] pada penyimpanan cadangan dengan UUID [uuid penyimpanan cadangan:%s], yang bukan Deleted.", + "ORG_ZSTACK_IMAGE_10040": "melepaskan iso dengan uuid=%s gagal, kesalahan adalah %s", + "ORG_ZSTACK_VPCFIREWALL_10058": "hapus aturan firewall pada vRouter[%s] karena %s", + "ORG_ZSTACK_VPCFIREWALL_10052": "ruleset default %s hanya dapat dipasang ke satu interface forward, tetapi ditemukan beberapa interface terkait: %s", + "ORG_ZSTACK_VPCFIREWALL_10050": "firewall %s VPC terkait tidak dalam keadaan berjalan", + "ORG_ZSTACK_VPCFIREWALL_10051": "tidak dapat menghapus rule set [%s] karena masih terpasang pada kartu antarmuka jaringan", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10020": "tidak dapat menemukan kondisi [%s] dalam daftar 'Conditions'", + "ORG_ZSTACK_VPCFIREWALL_10056": "Tidak dapat menemukan alamat MAC yang terkait dengan l3[%] pada vRouter[%s]", + "ORG_ZSTACK_VPCFIREWALL_10057": "pembuatan firewall rule[%s] gagal karena %s", + "ORG_ZSTACK_VPCFIREWALL_10054": "konfigurasi sinkronisasi firewall gagal karena %s", + "ORG_ZSTACK_VPCFIREWALL_10055": "pembaruan tindakan rule set firewall gagal karena %s", + "ORG_ZSTACK_VPCFIREWALL_10049": "tidak ada perubahan yang terdeteksi dalam ruleset %s", + "ORG_ZSTACK_VPCFIREWALL_10047": "melepas firewall rule set dari jaringan[%s] gagal, karena %s", + "ORG_ZSTACK_VPCFIREWALL_10048": "menemukan nomor aturan duplikat %s pada firewall %s, l3 %s, forward %s", + "ORG_ZSTACK_SSO_CAS_SERVICE_10002": "iam2 berisi pengguna dengan nama[%s] yang sama", + "ORG_ZSTACK_SSO_CAS_SERVICE_10003": "percobaan login duplikat untuk tipe pengguna[%s]", + "ORG_ZSTACK_SSO_CAS_SERVICE_10004": "Tidak dapat menemukan CasLogin untuk tipe(%s)", + "ORG_ZSTACK_VPCFIREWALL_10041": "tidak dapat menambahkan aturan firewall karena panjang deskripsi %s tidak valid untuk nomor aturan %d", + "ORG_ZSTACK_VPCFIREWALL_10040": "tidak dapat menambahkan aturan firewall karena tidak ada status untuk nomor aturan:%d", + "ORG_ZSTACK_VPCFIREWALL_10045": "Aturan firewall dalam file konfigurasi mengandung kesalahan sintaks: %s", + "ORG_ZSTACK_VPCFIREWALL_10046": "pasang firewall rule set[%s] ke jaringan layer 3[%s] gagal karena %s", + "ORG_ZSTACK_VPCFIREWALL_10044": "File konfigurasi untuk instans mesin virtual memiliki kesalahan format. Harap periksa file dan pastikan mematuhi skema yang diperlukan.", + "ORG_ZSTACK_VPCFIREWALL_10038": "tidak dapat menambahkan aturan firewall karena panjang IP sumber: %s tidak valid untuk nomor aturan: %d", + "ORG_ZSTACK_VPCFIREWALL_10039": "tidak dapat menambahkan aturan firewall karena panjang IP tujuan: %s tidak valid untuk nomor aturan: %d", + "ORG_ZSTACK_VPCFIREWALL_10036": "tidak dapat menambahkan aturan firewall karena nomor aturan %d tidak valid", + "ORG_ZSTACK_VPCFIREWALL_10037": "tidak dapat menambahkan aturan firewall karena tidak ada tindakan yang ditentukan untuk ruleNo:%d", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10002": "perintah inisialisasi vyos gagal karena:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10001": "tidak dapat membuat koneksi SSH ke virtual router[%s] setelah mengatur pengaturan SSH", + "ORG_ZSTACK_VPCFIREWALL_10030": "tidak dapat menambahkan firewall rule[%d] karena hanya protokol ICMP yang mendukung tipe spesifik", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10003": "gagal mengubah tindakan default firewall antarmuka jaringan [ip:%s, mac:%s] untuk virtual router [uuid:%s], karena %s", + "ORG_ZSTACK_VPCFIREWALL_10031": "tidak dapat menambahkan firewall rule[%d] karena hanya protokol TCP atau UDP yang didukung untuk aturan berbasis port", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10006": "tidak dapat memulai server DHCP pada VM virtual router[uuid:%s] karena %s", + "ORG_ZSTACK_ZWATCH_FUNCTION_10014": "argumen yang diperlukan untuk tipe instance hilang dalam template cloud formation", + "ORG_ZSTACK_ZWATCH_FUNCTION_10013": "Terdeteksi argumen yang tidak diketahui. Harap pastikan semua parameter baris perintah valid dan lihat dokumentasi untuk daftar argumen yang diterima.", + "ORG_ZSTACK_VPCFIREWALL_10034": "tidak dapat menambahkan aturan firewall[%d] karena hanya protokol TCP yang mendukung flag TCP di lingkungan ini", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10007": "tidak dapat menghentikan server DHCP pada instance router virtual [uuid:%s] karena %s", + "ORG_ZSTACK_VPCFIREWALL_10035": "tidak dapat menambahkan aturan firewall[%d] karena error %s" +} \ No newline at end of file diff --git a/conf/i18n/globalErrorCodeMapping/global-error-ja-JP.json b/conf/i18n/globalErrorCodeMapping/global-error-ja-JP.json new file mode 100644 index 00000000000..2924f658479 --- /dev/null +++ b/conf/i18n/globalErrorCodeMapping/global-error-ja-JP.json @@ -0,0 +1,4717 @@ +{ + "ORG_ZSTACK_XINFINI_SDK_10001": "APIレスポンスをクラス[%s]にフォーマットできませんでした。resultString: %s、exception: %s", + "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10001": "データセンタータイプ [%s] はここではサポートされていません!", + "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10000": "%s 設定タイプには 'endpoint' 引数を設定する必要があります", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10080": "Baremetal2インスタンスの作成で適切なコンピュートゾーンを決定できません。ゾーンを明示的に指定してください。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10084": "ベアメタルインスタンスの作成時に、シャーシUUIDもシャーシオファリングUUIDも設定されていません。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10082": "シャーシにイメージ[%s]を収容するための容量が不十分です", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10081": "必要なディスク[%s]はシャーシ[%s]に属していません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10087": "%s はBaremetal2インスタンスが実行中状態の場合にのみ作成または削除できます。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10086": "%s は作成または削除の操作 통해서のみ管理できます", + "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10000": "入力形式が不正です。カンマ区切りの数字のみが許可されています(例: %s)", + "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10001": "ホストVMには利用可能なCPUが%d個だけです", + "ORG_ZSTACK_ZWATCH_UTILS_10001": "リソース[%s]はzwatchリターン句をサポートしていません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10002": "ID認証機能は有効ですが、関連付けられたリソースプールが構成されていません。リソースプールを構成して再試行してください。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10003": "リソースプール %s は使用中のため解放できません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10000": "有効化できる仮想マシンが見つかりません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10001": "トークンタイプ %s は無効です。クラウドコンピューティング環境で使用されるタイプのトークンのみがサポートされています。", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10059": "許可されたノードのライセンスが空です", + "ORG_ZSTACK_STORAGE_PRIMARY_10039": "プライマリストレージ[uuid:%s]が存在しません", + "ORG_ZSTACK_V2V_10019": "UUID:%s のプライマリストレージは仮想マシンの移行v2vでサポートされていません", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10007": "ボリュームスナップショット[uuid:%s, name:%s]のステータスの問題により失敗しました", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10006": "プライマリストレージ[uuid:%s]からボリューム[uuid:%s, installPath:%s]のサイズを取得できませんでした。理由: %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10005": "プライマリストレージ[uuid:%s]からボリューム[uuid:%s, installPath:%s]のサイズを取得できませんでした。%s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10004": "vm[uuid:%s]は実行中、一時停止、破棄、または停止状態ではありません。現在の状態[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_10040": "クラウド環境にプライマリストレージ[uuid=%s]が存在しません", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10003": "ボリュームUUID: %s のボリュームが見つかりません", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10002": "スナップショットまたはその子孫にボリューム[uuids:%s]への参照があります", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10001": "ボリュームスナップショット[uuid:%s, name:%s]が見つかりません。 이전 작업에 의해 삭제되었을 수 있습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_10047": "cidr[%s] 入力形式が無効です", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10050": "ZSha2が別の管理ノードの存在を示していますが、このノードはデータベースに見つかりません。管理ノードの存在を確認してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_10046": "プライマリストレージのCIDRシステムタグは1つのみ許可されていますが、%d個検出されました", + "ORG_ZSTACK_STORAGE_PRIMARY_10049": "clusterUuidの競合。インスタンスオファリングによって指定されたクラスタは%sであり、作成パラメータによって指定されたクラスタは%sです", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10052": "App IDの登録解除が見つかりません!App IDを確認して再試行してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_10042": "リソースをプロビジョニングする前に、インスタンスタイプと必要なストレージを指定してください。", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10008": "ボリューム[uuid:%s]をスナップショット[uuid:%s]にリセットできません。vm[uuid:%s]のボリュームは停止状態ではありません。現在のステータスは%sです", + "ORG_ZSTACK_STORAGE_PRIMARY_10044": "適切なプライマリストレージが見つかりません。エラー: %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10000": "グループのステータスの更新に失敗しました: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10050": "primaryStorageUuidの競合。インスタンスオファリングによって指定されたプライマリストレージは%sであり、作成パラメータによって指定されたプライマリストレージは%sです。", + "ORG_ZSTACK_V2V_10008": "ネットワーク[%s]で同じMACアドレス[%s]は許可されていません", + "ORG_ZSTACK_V2V_10009": "ネットワーク[%s]でMACアドレス[%s]が重複しています", + "ORG_ZSTACK_STORAGE_PRIMARY_10052": "primaryStorageUuidの競合。ディスクオファリングによって指定されたプライマリストレージは%sであり、作成パラメータによって指定されたプライマリストレージは%sです。", + "ORG_ZSTACK_V2V_10006": "変換ホスト[uuid:%s]の基盤となるコンピューティングインスタンスはConnectedである必要があります", + "ORG_ZSTACK_V2V_10007": "変換ホスト[uuid:%s]はプライマリストレージ[uuid:%s]への接続を確立できません", + "ORG_ZSTACK_V2V_10004": "VMインスタンス[UUID:%s]が存在しないか、VMware VMインスタンスではありません", + "ORG_ZSTACK_V2V_10005": "conversionHostUuidはnullであってはなりません。有効なホストUUIDが提供されていることを確認してください。", + "ORG_ZSTACK_V2V_10002": "v2v変換ホストのストレージパスは絶対パスでなければなりません。有効な絶対パスを指定してください。", + "ORG_ZSTACK_V2V_10003": "無効なv2v URL: %s", + "ORG_ZSTACK_V2V_10000": "クラウドデプロイメントに進む前にホスト[uuid:%s]のステータスはConnectedである必要があります。", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10021": "メモリスナップショットを取得できません。予想されるVMステータスは[%s, %s]です", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10020": "ボリュームスナップショット[uuids:%s]は無効な状態であり、ボolumeリバージョンのために使用できません。", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10029": "削除ジョブのキャンセルに失敗しました。Volume[uuid:%s]のattached VMは状態%sではありません。オフラインスナップショットの削除はサポートされていないため、キャンセルできません。", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10028": "削除ジョブのキャンセルに失敗しました。Volume[uuid:%s]は存在しない仮想マシンに関連付けられています。オフラインスナップショットの削除はキャンセルをサポートしていません。", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10027": "削除ジョブのキャンセルに失敗しました。Volume[uuid:%s]はどのVMにもattachedされておらず、オフラインスナップショットの削除はキャンセルをサポートしていません。", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10026": "削除ジョブのキャンセルに失敗しました。Volume[uuid:%s]は存在しません。", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10025": "スナップショット[uuid:%s]のボリュームUUIDが見つかりません", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10024": "異なるボリュームからのスナップショットの削除はサポートされていません[UUID: %s, %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10023": "スナップショット[uuid:%s]の元のボリュームが削除されました。ボリュームを元の状態に戻すことはできません", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10022": "ボリュームスナップショット[uuid:%s]は現在のところ状態%sであり、ボリュームリバートに使用できません", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10018": "スナップショットが見つかりません: %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10017": "プライマリストレージ[uuid:%s]はボリュームスナップショットをサポートしていません。したがって、ボリューム[uuid:%s]のスナップショットを作成できません。", + "ORG_ZSTACK_YUNSHAN_UTIL_10000": "NSP URLがnullです。クラウドコンピューティングサービスのNSPを構成してください。", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10016": "ボリュームスナップショット機能向けにプライマリストレージ [uuid:%s] をリクエストできません", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10015": "プライマリストレージ [%s] のタイプが見つかりません", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10012": "ボリューム [UUID:%s] の最大スナップショット数 (%d) はサポートされていません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10027": "SanSecClientFactory 接続テストに失敗しました", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10019": "このリソースタイプ %s はメモリスナップショット参照のクエリをサポートしていません", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10007": "panguPartitionUuid [%s] は identityZoneUuid [%s] と一致しません", + "ORG_ZSTACK_APPLIANCEVM_10006": "アプライアンス VM [uuid:%s] はステータス %s であり、%s への HTTP コールを実行できません", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10006": "panguPartitionUuid または identityZoneUuid を指定する必要があります。", + "ORG_ZSTACK_AI_10120": "クラウド環境にモデルセンター [uuid:%s] が見つかりません", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10008": "ID ゾーン [%s] を削除できません。Aliyun Ebs プライマリストレージインスタンスがまだ含まれているため、まず関連するすべてのストレージリソースを削除してください。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10061": "プロトコル [%s] は空白の宛先ポート範囲を許可しないため、セキュリティグループルールを変更できませんでした", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10060": "指定されたプロトコル [%s] は宛先ポート範囲の設定をサポートしていないため、セキュリティグループルールを変更できませんでした", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10063": "重複するルール [%s] がデータベースに UUID %s ですでに存在するため、セキュリティグループルールを変更できませんでした", + "ORG_ZSTACK_APPLIANCEVM_10000": "アプライアンスブートストラップ情報の設定エラー:%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10062": "指定されたプロトコル [%s] は宛先ポート範囲の設定が必要なため、セキュリティグループルールを変更できませんでした", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10033": "インスタンスオファリング [uuid:%s] は NFV インスタンスグループ [%s] で使用中のため削除できません", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10001": "ALIYUN EBS は現在、実行中の VM のサイズ変更をサポートしていません。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10031": "ステータスが初期化中ではない場合、NFV インスタンスグループ [uuid:%s, name:%s] をプロビジョニングできません", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10000": "ボリューム %s からデバイスパスが見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10032": "メンバーがない NfvInstanceGroup [uuid:%s, name:%s] をプロビジョニングできません。プロビジョニング前にグループ内に少なくとも1つの NFV インスタンスを作成してください。", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10003": "ISO [%s] が接続されています。再度接続するには、まず切り離してください。", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10006": "無効な CPU [CPU_ID]、ホスト [HOST_UUID] には指定された ID [%s] の CPU がありません", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10030": "仮想 IP が構成されていない NfvInstanceGroup [uuid:%s, name:%s] をプロビジョニングできません。プロビジョニング前にグループの仮想 IP を構成してください。", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10005": "URL は http:// または https:// で始まる必要がありますが、%s が取得されました", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10004": "Alibaba Cloud EBS プライマリストレージには、Ocean エンドポイントの URL を構成する必要があります。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10019": "リソースの名前 [%s] は無効です。名前は次の要件に従う必要があります:", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10013": "- 1 ~ 128 文字の長さ", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10012": "- 大文字、小文字、数字、アンダースコア (_)、ハイフン (-) で構成", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10018": "- アルファベット文字 (文字) で開始", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10028": "- スペースで開始または終了しない", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10017": "クラスター[uuid:%s]にBareMetal2ゲートウェイが見つかりません", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10010": "新しいCloudFile[%s]の作成に失敗しました", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10029": "NfvInstanceGroup [uuid:%s]が見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10026": "NFVインスタンス[uuid:%s]をグループ[uuid:%s, name:%s]から切り離せません。唯一のメンバーであるためです。グループは少なくとも1つのメンバーを持つ必要があります。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10027": "NFVインスタンス[uuid:%s]をグループ[uuid:%s, name:%s]から切り離せません。唯一の実行中メンバーであるためです。少なくとも1つの追加メンバーが実行状態である必要があります。", + "ORG_ZSTACK_AI_10129": "トークンの%sから予期しないnull値が取得されました: %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10024": "NFVインスタンス[uuid:%s]が見つかりません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10016": "クラウドリソース検証のための入力%sの署名検証に失敗しました", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10025": "NFVインスタンス[uuid:%s]をグループ[uuid:%s, name:%s]から関連付け解除できません。現在関連付けられていないためです。現在のステータスの詳細は%sです", + "ORG_ZSTACK_STORAGE_PRIMARY_10003": "バックアップストレージ[UUID: %s]は、プライマリストレージ[UUID: %s]が属するゾーン[UUID: %s]に関連付けられていません", + "ORG_ZSTACK_AI_10127": "モードパラメータは空であってはなりません。有効なモード値を指定してください。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10011": "ベアメタルインスタンス[uuid:%s]のクラスター[uuids:%s]でのコンピュートノードの割り当てに失敗しました", + "ORG_ZSTACK_AI_10128": "現在許可されている値は['%s']です", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10010": "ベアメタルインスタンス[uuid:%s]のクラスター[uuids:%s]でのゲートウェイの割り当てに失敗しました", + "ORG_ZSTACK_AI_10125": "無効なモデル分類: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10004": "ボリューム[uuid:%s]は実行中のVMに接続されています。ボリュームを接続するにはVMを停止する必要があります。", + "ORG_ZSTACK_AI_10126": "ModelServiceVO[uuid: %s]に保存された設定が無効です: %s", + "ORG_ZSTACK_AI_10123": "UUID: %sのモデルセンターが見つかりません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10015": "プロビジョニングされたIP%sはDHCP範囲%s ~ %sの外にあります", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10014": "プロビジョニングされたIP%sは別のインスタンスによって使用されています", + "ORG_ZSTACK_AI_10121": "モデルセンターインスタンスが見つかりません。まずモデルセンターインスタンスを作成してください。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10013": "要件を満たすBareMetal2クラスター[UUID:%s]はありますが、これらのクラスターにはプロビジョニングされたネットワークが接続されていません。", + "ORG_ZSTACK_STORAGE_PRIMARY_10000": "無効化されたプライマリストレージ[uuid:%s]にISOを接続できません", + "ORG_ZSTACK_AI_10122": "ModelServiceInstanceGroupVO[uuid: %s]のシステムタグ作成に失敗しました。理由: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10012": "クラスター[uuid:%s]にbaremetal2ノードが見つかりません", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10019": "無効なインストールパス: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10010": "ボリュームID: %sを追加しようとしましたが、URLに別のボリュームIDがすでに存在します: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10012": "hostUuid [%s]はURLにすでに存在します: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10014": "無効なインストールURL: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10015": "ホスト上のデバイスパスが見つかりません: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10008": "Baremetal2コンピュートクラスタが見つかりません", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10002": "vm[uuid:%s]のhost[uuid:%s]でvHost User Clientの生成に失敗しました: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10007": "使用するBareMetal2クラスタを決定するための情報が不足しています。%s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10006": "zone[uuid:%s]にアタッチされたバックアップストレージにISO[uuid:%s]が含まれていません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10005": "接続されたバックアップストレージにUUID [%s]のイメージが見つかりません。以下の点を確認してください:", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10000": "1. バックアップストレージが、UUID [%s]の仮想マシン(VM)[%s]が配置されているゾーンにアタッチされていることを確認してください。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10009": "2. バックアップストレージが接続状態であることを確認してください。接続されていない場合は、再接続を試みてください。", + "ORG_ZSTACK_STORAGE_PRIMARY_10014": "vm[uuid:%s]のhost[uuid:%s]でvHost User Clientの削除に失敗しました: %s", + "ORG_ZSTACK_AI_10116": "ベアメタルインスタンス[uuid:%s]のクラスタ[uuids:%s]でのプライマリストレージの割り当てに失敗しました", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10000": "UUID:%sのプライマリストレージは、UUID:%sのクラスタにまだアタッチされているため削除できません", + "ORG_ZSTACK_AI_10117": "クラウド環境内にサービスインスタンスグループが見つかりません。構成を確認してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_10016": "baremetal2インスタンス[uuid:%s]は存在しないか接続されていないため、パスワードを変更できません", + "ORG_ZSTACK_AI_10114": "UUID [%s]のデータセットが見つかりません", + "ORG_ZSTACK_AI_10115": "プライマリストレージがメンテナンス中のボリューム[uuid:%s]をアタッチできません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10004": "モデルサービスインスタンスグループ[UUID: %s]が見つからないため、サービス起動待機の生存チェックを中断します", + "ORG_ZSTACK_AI_10112": "「グループUUID」または「すべて同期」のいずれかを指定する必要があります", + "ORG_ZSTACK_AI_10113": "ゾーンUUID [%s]に関連する接続されたバックアップストレージにUUID [%s]のイメージが見つかりません。以下の点を確認してください:", + "ORG_ZSTACK_AI_10111": "1. バックアップストレージが、VM名[%s] (UUID: %s) が配置されている正しいゾーンにアタッチされていることを確認してください。", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10001": "2. バックアップストレージが接続状態であることを確認してください。接続されていない場合は、再接続を試みてください。", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10037": "サポートされていないモデルサービスタイプ: %s、再起動操作を処理する対応するバックエンドが見つかりません", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10003": "モデルサービスインスタンスグループ[UUID: %s]が見つからないため、サービス起動待ちスキップをスキップします", + "ORG_ZSTACK_STORAGE_PRIMARY_10018": "モデルサービスインスタンス[uuid: %s]が見つかりません", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10032": "LLDPインターフェース情報を取得できませんでした。データを受信するように構成されていないためです。", + "ORG_ZSTACK_STORAGE_PRIMARY_10017": "UUID [%s]のライセンス認証ノードが見つかりません", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10033": "[%s]のLLDP参照の取得に失敗しました", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10085": "zoneUuids、clusterUuids、およびprimaryStorageUuidsは、それぞれ少なくとも1つの空でないリストを含めるか、すべての値をtrueに設定する必要があります", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10000": "ライセンスサーバー環境へのアップグレード前に、許可されていないノードが存在するはずです。アップグレードプロセス前に、すべてのノードが有効なライセンスを持っていることを確認してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_10019": "プライマリストレージ[%s]にはすでにoutputProtocol[%s]が存在するため、再度追加する必要はありません", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10087": "関連するライセンス仮想ノードの一部が终止されていません。%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10011": "UUID:%sのセキュリティグループはL3ネットワークUUID:%sに関連付けられていないため、デタッチできません", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10086": "異なるセキュリティグループからのセキュリティグループルールを削除できません", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10089": "L3ネットワーク[uuid:%s]にはネットワークサービスタイプ[%s]が有効になっていません", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10088": "UUID:%sのセキュリティグループはL3ネットワークUUID:%sに関連付けられています,因此,再次附加できません", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10010": "NFVインスタンスを作成できません,グループ[uuid:%s, name:%s]はすでに%d人のメンバーを持っており,最大許容値は3です", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10026": "relativeTime[%s]は無効です,許可される最大値を超えています", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10025": "relativeTime[%s]は無効です,10sや1hなどの形式で指定する必要があります", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10008": "グループ[uuid:%s, name:%s]がアクティブモードのとき,NFVインスタンスを作成できません。まずメンテナンスモードに変更してください", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10009": "グループ[uuid:%s, name:%s]が%sステータスのとき,NFVインスタンスを作成できません", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10006": "NFVインスタンスグループ%s [uuid:%s]のNFVインスタンス%s [uuid:%s]のHAステータスが%sから%sに変更されました", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10039": "vhostボリュームはbareMetalInstance2への接続をサポートしていません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10038": "MAC:%sのNICは,L3ネットワークにすでにボンディングされているため,接続できません", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10004": "すべてのノードがクラウドデプロイに期待される状態にありません。すべてのノードのステータスを確認し,操作に必要な条件を満たしていることを確認してください", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10002": "NFVインスタンスグループ[uuid:%s]のアフィニティグループの作成に失敗しました", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10033": "L3ネットワークをBareMetalインスタンスに接続する場合,customMACは必須です", + "ORG_ZSTACK_STORAGE_PRIMARY_10024": "ボリュームが存在するプライマリストレージ[uuid:%s]が有効でないか,接続されていません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10032": "L2ネットワークタイプ%sはBaremetal2インスタンスでサポートされていません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10031": "Baremetal2インスタンスはIPバージョン%dのLayer 3ネットワークのみサポートします", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10031": "ライセンスサーバのみがライセンスクライアントインスタンスの登録を解除する権限を持っています", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10030": "Baremetal2インスタンス[uuid:%s]にはコンピュートノードが割り当てられていません。インスタンスを開始して再試行してください", + "ORG_ZSTACK_STORAGE_PRIMARY_10021": "プライマリストレージとクラスタは同一のアベイラビリティゾーンにありません[uuid:%s] [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10037": "MACアドレス%sはすでに割り当てられています,別のものを試してください", + "ORG_ZSTACK_STORAGE_PRIMARY_10020": "プライマリストレージ[uuid:%s]はクラスタ[uuid:%s]に接続されています", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10036": "シャーシ[uuid:%s]で実行中のbaremetal2インスタンス[uuid:%s]には,MACアドレス%sを持つプロビジョニング以外のNICがありません", + "ORG_ZSTACK_STORAGE_PRIMARY_10023": "'UUID'と'Type'は両方同時に設定するか,両方とも設定しないかのいずれかです!", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10035": "重複したMACアドレス%s", + "ORG_ZSTACK_STORAGE_PRIMARY_10022": "URL[%s]はすでに使用されており,同一のクラスタ内で重複できません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10034": "%sは有効なMACアドレスではありません", + "ORG_ZSTACK_AI_10130": "予期しない値が取得されました: %s from %s,許可される値はクラウドリソースメトリクスの定義範囲内です", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10026": "クラウドコンピューティング環境に対するライセンスタイプ%sは無効です", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10027": "ライセンスサーバーを登録するとき,許可された仮想マシンは存在しません%s", + "ORG_ZSTACK_STORAGE_PRIMARY_10029": "プライマリストレージ[uuid:%s]で%sバイトを確保できません。利用可能な容量が不足しています。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10093": "UUID:%sのVM NICは、セキュリティグループUUID:%sに関連付けられたL3ネットワーク上にありません。", + "ORG_ZSTACK_STORAGE_PRIMARY_10028": "予約容量を削減した後、必要なサイズのプライマリストレージが不足しています。おそらくプライマリストレージの物理容量設定の閾値が低いためです。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10096": "remoteSecurityGroupUuids:%sに重複するUUIDが存在するため、セキュリティグループルールを追加できませんでした。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10095": "ルールリストは空、または%dを超えてはならないため、セキュリティグループルールを追加できませんでした。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10098": "リモートセキュリティグループUUIDが既存のエエントリーと競合しています。セキュリティグループルールを確認して更新してください。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10022": "通常動作モードの場合、グループ[uuid:%s, name:%s]からNFVインスタンスをdetachできません。まずメンテナンスモードに切り替えでください。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10097": "セキュリティグループ[uuid:%s]が存在しないため、セキュリティグループルールを追加できませんでした。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10023": "ステータスが%sの場合、グループ[uuid:%s, name:%s]からNFVインスタンスをdetachできません。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10020": "NFVインスタンスをグループ[uuid:%s, name:%s]にattachできません。グループのステータスは%sで、メンバーは%d名です。attachは、グループが空の場合、または1-2名のメンバーでHealthy/Degraded状態の場合にのみ許可されます。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10099": "優先度は%dより大きいか、%dに等しい必要があるため、セキュリティグループルールを追加できませんでした。", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10018": "方向[%s]は無効です。サポートされている方向のみが許可されています。", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10024": "タイプ[%s]は無効です。プリミティブタイプまたは一般的に使用される参照タイプのみが許可されています。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10019": "ステータスが%sの場合、グループ[UUID: %s, Name: %s]にNFVインスタンスをattachできません。", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10023": "右側の値[%s]は無効です。浮動小数点数である必要があります。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10029": "baremetal2インスタンス[uuid:%s]は停止していないため、別のシャーシプランに変更できません。", + "ORG_ZSTACK_STORAGE_PRIMARY_10030": "回避するためにプライマリストレージ%sを削除した後、利用可能な候補のプライマリストレージがなくなりました。クラスター内のプライマリストレージのステータスと状態を確認してください。", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10022": "右側の値[%s]は無効です。0より大きく1より小さい浮動小数点数である必要があります。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10017": "NFVインスタンス[uuid:%s]をグループ[uuid:%s, name:%s]にattachできません。このインスタンスはクラスタステータスが%sのこのグループのメンバーです。インスタンスがLeader、Follower、Leaving、またはJoining Candidate状態の場合、attachは許可されません。", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10021": "引数%sは無効です。このコンテキストでは引数は許可されていません。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10018": "通常動作モードの場合、グループ[UUID:%s, Name:%s]にNFVインスタンスをattachできません。まずグループをメンテナンスモードに切り替えてください。", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10020": "右側の値[%s]は無効です。クラウドコンピューティング環境では、有効な数値タイプ(int、long、float、double)である必要があります。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10015": "syncNfvInstGroupはメンテナンスモードでのみ許可されています。現在のモード:%s。まずメンテナンスモードに変更してください。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10013": "INITIALIZING状態の間は操作モードを変更できません。変更を行う前に、グループが準備できていることを確認してください。現在のステータス:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_10036": "PrimaryStorageTagAllocatorExtensionPoint[%s]は条件を満たすプライマリストレージ候補を0個返します。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10022": "ローカルbaremetalインスタンスでは現在の操作はサポートされていません。操作が仮想化環境内で実行されていることを確認してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_10035": "PrimaryStorageFeatureAllocatorFlow[%s]は実行可能なプライマリストレージ候補を0個返します。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10021": "baremetalインスタンスはVM NICネットワーク設定を変更することが許可されていません。互換性のあるインスタンスタイプを使用していることを確認してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_10038": "%sは無効です。%sは有効なインスタンスUUIDではありません。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10020": "BareMetal2インスタンスへのEIPのアタッチは、VPCネットワークのみサポートしています。", + "ORG_ZSTACK_STORAGE_PRIMARY_10037": "プライマリストレージ [uuid:%s] は接続状態ではありません。現在のステータスは %s です", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10026": "baremetal2 インスタンス[uuid:%s]は動作中ですが、エージェントが接続されていません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10025": "baremetal2 インスタンス[uuid:%s]は電源オフになっていません", + "ORG_ZSTACK_STORAGE_PRIMARY_10034": "ユーザー定義タグ[%s]を持つプライマリストレージが見つかりません。ユーザー定義タグはインスタンスOfferingまたはディスクOfferingで指定されます", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10024": "baremetal2 インスタンス[uuid:%s]は接続されていません", + "ORG_ZSTACK_STORAGE_PRIMARY_10033": "プライマリストレージ[uuid:%s]が見つかりません。UUIDはインスタンスOfferingまたはディスクOfferingの仕様で指定されています", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10023": "この操作はBareMetal2インスタンスではサポートされていません。仮想化環境との互換性があることを確認してください", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10051": "UUID:%sのbaremetal2シャーシは存在しません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10050": "インスタンスにはすでにシャーシOfferingが割り当てられているため、chassisOfferingUuidを設定する必要はありません", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10021": "VM NICセキュリティグループを設定できませんでした。指定されたセキュリティグループ[uuid:%s]はあなたのアカウント[uuid:%s]の所有物ではなく、管理者のものでもありません", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10020": "VM NICセキュリティグループを設定できませんでした。セキュリティグループ[uuid:%s]が重複しています", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10023": "VM NICセキュリティグループを設定できませんでした。無効な優先度です。連続した優先度が必要ですが、%d と %d が見つかりました", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10022": "VM NICセキュリティグループを設定できませんでした。無効な優先度です。優先度は1から始まる必要がありますが、[%d]になっています", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10025": "VM NICセキュリティグループを設定できませんでした。管理者セキュリティグループの優先度[%d]はユーザグループより高くする必要があります", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10027": "セキュリティグループのルール状態を変更できませんでした。セキュリティグループ[uuid:%s]が見つかりませんでした", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10026": "セキュリティグループのルール状態を変更できませんでした。ルールUUIDリストが空です。続行するには有効なルールUUIDを提供してください", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10029": "セキュリティグループのルール状態を変更できませんでした。状態変更を必要とするセキュリティグループルールがありません", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10028": "セキュリティグループのルール状態を変更できませんでした。セキュリティグループルール[uuid:%s]が見つかりませんでした", + "ORG_ZSTACK_ZWATCH_10004": "一部のメッセージは有効期限が切れ、システムの制約により変更が許可されていません。システムはこれらの期限切れメッセージを自動的にクリーンアップします。操作は後ほど再試行してください", + "ORG_ZSTACK_ZWATCH_10003": "無効なアクションタイプ: %s。書き込みまたは削除操作のみサポートしています", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10054": "baremetal2シャーシ[uuid:%s]はすでに別のリソースに割り当てられています", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10053": "baremetal2シャーシ[uuid:%s]は有効になっていません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10052": "baremetal2シャーシ[uuid:%s]はシャーシOffering[uuid:%s]に関連付けられていません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10059": "シャーシUUIDとシャーシOffering UUIDを同時に設定しないでください", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10057": "クラスター[uuid:%s]は指定されていますが、有効なBaremetal2クラスターではありません。そのため、Baremetal2インスタンスをそこから作成できません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10056": "ゾーン[uuid:%s]は指定されていますが、有効になっていません。そのため、baremetal2インスタンスを作成できません", + "ORG_ZSTACK_AI_SERVICE_10001": "モデルサービスUUID: %s とアカウントUUID: %s でApplication Development Service VOが見つかりませんでした", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10040": "サードパーティCephを他のプライマリストレージタイプと混合することはできません。ストレージ構成の一貫性を確認してください", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10030": "VM NICセキュリティポリシーを変更できませんでした。イングレスポリシーとエGRESSポリシーの両方をnullにすることはできません。少なくとも一方のポリシーが定義されていることを確認してください", + "ORG_ZSTACK_ZWATCH_10002": "無効なzwatch句付き戻り値: %s, %s", + "ORG_ZSTACK_ZWATCH_10001": "zwatchリターン句に不明なパラメータ[%s]があります。指定されたクラウドコンピューティング環境に対して有効なパラメータであることを確認してください。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10032": "無効なエグレスポリシー[%s]のため、VM NICセキュリティポリシーを変更できませんでした。", + "ORG_ZSTACK_AI_SERVICE_10005": "テストが必要なタスクがありません。失敗としてマークします。%s", + "ORG_ZSTACK_AI_SERVICE_10004": "サービスインスタンスが見つかりません。インスタンスが適切に作成され、評価タスクに関連付けられていることを確認してください。タスクの提出に失敗しました。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10031": "無効なイングレースルール[%s]のため、VM NICセキュリティポリシーを変更できませんでした。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10034": "VM NIC [UUID:%s]に関連付けられたセキュリティポリシーがないため、VM NICセキュリティポリシーを変更できませんでした。", + "ORG_ZSTACK_AI_SERVICE_10003": "評価タスクの提出に利用可能なUUID [%s]のサービスグループが見つかりません。失敗を報告します。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10033": "VM NIC [uuid:%s]が見つからないため、VM NICセキュリティポリシーを変更できませんでした。", + "ORG_ZSTACK_AI_SERVICE_10002": "テスト用のモデルサービスインスタンスグループ [UUID: %s] に利用可能なURLがありません。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10036": "セキュリティグループ[uuid:%s]が存在しないため、セキュリティグループルール優先度を変更できませんでした。", + "ORG_ZSTACK_AI_SERVICE_10008": "すべてのコンピューティングインスタンスの起動に失敗しました。%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10035": "無効なタイプ[%s]のため、セキュリティグループルール優先度を変更できませんでした。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10038": "セキュリティグループ[uuid:%s]のルール数が予期される数と一致しないため、セキュリティグループルール優先度を変更できませんでした。", + "ORG_ZSTACK_AI_SERVICE_10006": "%sでの評価開始中にエラーが発生しました。理由: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10037": "ルールリストが空のため、セキュリティグループルール優先度を変更できませんでした。この操作を試みる前に、ルールが定義されていることを確認してください。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10039": "ルール優先度[%d]が無効なため、セキュリティグループルール優先度を変更できませんでした。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10049": "インスタンスにはすでにシャーシが割り当てられているため、chassisOfferingUuidを設定する必要はありません。", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10004": "レスポンスデータに有効なライセンスがないため、プライマリストレージ [%s] のライセンス情報を取得できませんでした。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10044": "UUID: %sのbaremetal2ゲートウェイは、UUID: %sのクラスターに属していません。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10043": "UUID: %sのbaremetal2ゲートウェイは存在しないか、有効でないか、接続されていません。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10042": "クラスター[uuid:%s]は有効なbaremetal2クラスターではありません。この中のインスタンス[uuid:%s]を起動することはできません。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10041": "リモートプロビジョニングインスタンスは、プロビジョニングNICをbond %sに接続することをサポートしていません。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10047": "baremetal2シャーシオファリング[uuid:%s]は有効ではありません。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10046": "baremetal2シャーシオファリング [UUID:%s] は存在しません。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10045": "Baremetalインスタンス [uuid:%s] を開始するには、シャーシUUIDまたはシャーシオファリングUUIDを指定してください。", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10029": "スナップショットの作成がタイムアウトしました。進捗は %d%% です。", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10028": "EBSプライマリストレージは、現時点ではサイズの縮小をサポートしていません。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10073": "イメージ[uuid:%s]の形式は: %sです。BareMetal2インスタンスでサポートされている形式は%sのみです。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10072": "イメージ[uuid:%s]のメディアタイプは: %sです。ルートボリュームテンプレートのみを使用してbaremetalインスタンスを作成できます。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10041": "UUID:%sのルールがUUID:%sのセキュリティグループに関連付けられていないため、セキュリティグループルール優先度を変更できませんでした。", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10071": "イメージ[uuid:%s]の準備が完了していないため、baremetal2インスタンスを作成できません", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10040": "priority[%d]が重複しているため、セキュリティグループのルール優先度を更新できませんでした", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10070": "イメージ[uuid:%s]が有効化されていないため、baremetal2インスタンスを作成できません", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10043": "重複するルールUUIDが存在するため、セキュリティグループのルール優先度を更新できませんでした", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10021": "スナップショットのインストールパスが無効です: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10042": "指定された優先度[%d]がセキュリティグループ[uuid:%s]内に存在しないため、ルール優先度を更新できませんでした", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10045": "指定されたルールはデフォルトルールであるため、説明とステータスのみを更新できます", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10044": "指定されたUUID[%s]のセキュリティグループルールが存在しないため、ルールを更新できませんでした", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10022": "Alibaba Cloud EBSプライマリストレージ[UUID:%s, Name:%s]は、ボリュームをインスタンス化するために接続されたクラスタ内で利用可能なホストを見つけることができません", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10047": "セキュリティグループ%sは最大%dルールの制限を超えているため、ルールを更新できませんでした", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10025": "イメージからスナップショットが見つかりません: %s。イメージは削除された可能性があります", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10046": "ルール[%s]の優先度をデフォルトルールの優先度[%d]に設定できないため、ルールを更新できませんでした", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10024": "クラウド環境はサポートされていません", + "ORG_ZSTACK_COMPUTE_CPUPINNING_10002": "インスタンス構成に指定されたcpuset[%s]が無効です。cpusetが有効であり、適切なCPUコアのセットを指していることを確認してください", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10049": "無効な状態[%s]のため、ルールを更新できませんでした", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10027": "次のホストへのtdcのインストールに失敗しました: [%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10048": "%sルールの最大優先度制限が[%d]のため、ルールを更新できませんでした", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10026": "次のクラスタとの接続の確立に失敗しました: [%s]", + "ORG_ZSTACK_COMPUTE_CPUPINNING_10000": "invalid CPU pinning reference[%s]。正しい例は[1,3:3-6,^5]または[1-2,4:6]です", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10004": "宛先ホスト[uuid:%s]で仮想マシーン[uuid:%s]のvhost-userクライアントを生成できません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10077": "baremetal2クラスタ[arch:%s]とイメージ[arch:%s]のアーキテクチャが一致しません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10076": "インスタンスとイメージまたはオファリングの間に異なるブートモードが検出されました。一致していることを確認してください", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10075": "ブートモード%sのイメージのみ、Baremetal2インスタンスの作成をサポートしています", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10074": "イメージ[uuid:%s]はBareMetal2イメージではないため、BareMetal2インスタンスの作成に使用できません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10079": "ルートボリュームのプライマリストレージとデータボリュームのプライマリストレージは、同じクラスタ内である必要があります", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10078": "すべてのディスクオファリング[UUIDs:%s]が有効化されていないため、BareMetal2インスタンスを作成できません", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10050": "無効なアクション[%s]のため、ルールを更新できませんでした", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10062": "baremetal2シャーシオファリング[uuid:%s]が有効化されていないため、baremetal2インスタンスを作成できません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10061": "baremetal2シャーシ[uuid:%s]が利用可能な状態ではないため、baremetal2インスタンスを作成できません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10060": "UUID:%sのbaremetal2シャーシが有効化されていないため、baremetal2インスタンスを作成できません", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10051": "セキュリティグループルールを無効なプロトコル[%s]のため変更できませんでした", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10054": "送信元IP範囲[%s]が指定されているため、セキュリティグループルールを変更できませんのリモートセキュリティグループUUID [%s]は空にする必要があります", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10031": "Aliyun EBS PrimaryStorageはAliyun EBS BSタイプのみサポートしています。実際のタイプ: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10056": "タイプEgressでは送信元IP範囲を指定できないため、セキュリティグループエグレスルールを変更できません", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10034": "リソース[uuid: %s]が見つかりません", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10055": "このルール[%s]ではdstIpRangeを指定できないため、セキュリティグループ ingressルールを変更できません", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10058": "リモートセキュリティグループ[uuid:%s]が見つからないため、セキュリティグループルールを変更できませんでした", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10057": "宛先IP範囲[%s]が指定されているため、セキュリティグループルールを変更できません。リモートセキュリティグループUUID [%s]は空にする必要があります", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10059": "リモートセキュリティグループ[UUID:%s]が設定されているため、送信元IP範囲と宛先IP範囲は空にする必要があります", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10066": "シャーシがダイレクトモードでない限り、イメージは空にできません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10065": "UUID: %sのbaremetal2ゲートウェイは、UUID: %sのシャーシと同じクラスタ内に配置されていません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10064": "baremetal2ゲートウェイ[UUID: %s]が接続されていないため、その baremetal2インスタンスを作成できません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10063": "UUID:%sのbaremetal2ゲートウェイが有効になっていないため、baremetal2インスタンスを作成できません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10069": "シャーシディスク[%s]にはイメージ[%s]を格納するための容量が十分にありません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10068": "イメージ[uuid:%s]がイメージリポジトリに存在しません", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10067": "ダイレクトモードではイメージの選択をサポートしていません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREBLOCK_10000": "shareblockはホスト %sが%s到達不能であることを示しています", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10100": "無効なプロトコル[%s]のため、セキュリティグループルールを追加できませんでした。有効なプロトコルは%sです", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10102": "無効なIPバージョン[%d]が指定されました。有効なバージョンは%d/%dです", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10101": "無効なアクション[%s]のため、セキュリティグループルールを追加できませんでした。有効なアクションは%sです", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10104": "許可されたCIDR [%s]と宛先IP範囲[%s]が競合しているため、セキュリティグループルールを追加できませんでした", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10103": "送信元IP範囲[%s]はエグレスルールに設定できないため、セキュリティグループルールを追加できませんでした", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10106": "宛先IP範囲[%s]は ingressルールに設定できないため、セキュリティグループルールを追加できませんでした", + "ORG_ZSTACK_COMPUTE_HOST_10041": "KVMホスト[UUID: %s]上のネットワークボンディング[%s]のVLAN ID [%s]の確認に失敗しました。%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10105": "IP範囲[%s]とリモートセキュリティグループUUID[%s]が競合しているため、セキュリティグループルールを追加できませんでした", + "ORG_ZSTACK_COMPUTE_HOST_10043": "KVMホスト[UUID: %s]上のネットワークインターフェース[%s]のVLAN ID [%s]の確認に失敗しました。%s", + "ORG_ZSTACK_VPC_10048": "DNSアドレス[%s]はVPCルータ[uuid:%s]に追加済みです", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10107": "許可されたCIDR [%s]が送信元IP範囲[%s]と競合しているため、セキュリティグループルールを追加できませんでした", + "ORG_ZSTACK_VPC_10047": "vPC L3ネットワークは、vRouterに関連する操作(VMの起動/停止、ロードバランサーの作成など)を実行する前に、vPC vRouterに関連付けられている必要があります", + "ORG_ZSTACK_ALIYUN_CORE_10022": "スナップショットタスクのステータスは完了しました %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10109": "プロトコルタイプALLまたはICMPではdstPortRange[%s]を設定できないため、セキュリティグループルールを追加できませんでした", + "ORG_ZSTACK_ALIYUN_CORE_10023": "HybridClientインスタンスはこの操作をサポートしていません。互換性のあるクライアントタイプを使用してください。", + "ORG_ZSTACK_ALIYUN_CORE_10021": "スナップショットタスクは%dミリ秒以内に完了できません。現在の進行状況は%d%%、ステータスは%sです", + "ORG_ZSTACK_ALIYUN_CORE_10026": "Ocean APIエンドポイントはnullにできません。有効なエンドスコアを指定してください。", + "ORG_ZSTACK_VPC_10042": "仮想ルータ%s上のサービス%sの状態を取得することはサポートされていません", + "ORG_ZSTACK_COMPUTE_HOST_10048": "ボンディングIPの更新に失敗しました。理由: %s", + "ORG_ZSTACK_VPC_10041": "仮想ルータ%sへの分散ルーティングの状態を設定できません", + "ORG_ZSTACK_ALIYUN_CORE_10024": "accessKeyとsecretAccessKeyを設定する必要があります", + "ORG_ZSTACK_VPC_10040": "仮想ルータ%sへの分散ルーティングの接続を取得できません", + "ORG_ZSTACK_COMPUTE_HOST_10044": "KVMホスト[UUID: %s]のネットワークボンディング[%s]へのサービスタイプ[%s]の設定に失敗しました。%s", + "ORG_ZSTACK_VPC_10045": "仮想ルータ%sへのサービス%sの状態の更新はサポートされていません", + "ORG_ZSTACK_COMPUTE_HOST_10047": "インターフェースIPの更新に失敗しました。理由: %s", + "ORG_ZSTACK_COMPUTE_HOST_10046": "KVMホスト[UUID: %s]のネットワークインターフェース[%s]へのサービスタイプ[%s]の設定に失敗しました。%s", + "ORG_ZSTACK_VPC_10043": "仮想ルータ%sへの分散ルーティングの状態を取得できません", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10111": "セキュリティグループルールを追加できませんでした。終了ポート[%d]は開始ポート[%d]以上である必要があります", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10110": "プロトコルタイプALLまたはICMPはstartPortまたはendPortの設定をサポートしていません。セキュリティグループルール設定のプロトコルが適切であることを確認してください。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10113": "プロトコルタイプTCP/UDPには宛先ポート範囲の指定が必要です。必要なポート範囲を指定して再試行してください。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10112": "dstPortRange[%s]がstartPort[%s]と競合するため、セキュリティグループルールを追加できませんでした", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10115": "指定されたセキュリティグループに重複するルール[%s]が既に存在するため、セキュリティグループルールを追加できませんでした", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10114": "ルール [%s] と [%s] が重複しているため、セキュリティグループルールを追加できませんでした", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10117": "セキュリティグループ%sは%dルールの最大制限に達しているため、セキュリティグループルールを追加できませんでした", + "ORG_ZSTACK_COMPUTE_HOST_10052": "ホスト[UUID:%s]のVLAN IDの取得に失敗しました : %s", + "ORG_ZSTACK_VPC_10039": "L3ネットワーク[uuid:%s]へのIPv6範囲の追加ができません。仮想ルータ[uuid:%s]のCIDR[%s]と重複しています", + "ORG_ZSTACK_ALIYUN_IMAGE_10002": "この操作はカスタムイメージのみに制限されています。", + "ORG_ZSTACK_CORE_CONFIG_10002": "グローバル設定が見つかりません[カテゴリ: %s, 名前: %s]", + "ORG_ZSTACK_VPC_10038": "L3ネットワーク[UUID:%s]へのIP範囲の追加ができません。仮想ルータ[UUID:%s]のCIDR[%s]と重複しています", + "ORG_ZSTACK_ALIYUN_IMAGE_10003": "ミラーはプライマリディスクのみ作成できます。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10119": "セキュリティグループ%sは%dルールの最大制限を超過しているため、セキュリティグループルールを追加できませんでした", + "ORG_ZSTACK_NETWORK_PLUGIN_10001": "Gratuitous ARPの解放を実行します。理由:%s", + "ORG_ZSTACK_VPC_10037": "DNSアドレス[%s]はVPCルータ[uuid:%s]に関連付けられていません", + "ORG_ZSTACK_VPC_10036": "dns[%s]は有効なIPアドレスではありません", + "ORG_ZSTACK_CORE_CONFIG_10004": "クラウドリソースの検証をスキップすることは許可されていません。", + "ORG_ZSTACK_NETWORK_PLUGIN_10000": "gratuitous ARPの適用エラーです。理由:%s", + "ORG_ZSTACK_ALIYUN_IMAGE_10001": "指定されたイメージは現在データセンターにインポートされています...", + "ORG_ZSTACK_ALIYUN_CORE_10011": "長さゼロのファイルをVMイメージとして入力することはできません!", + "ORG_ZSTACK_ALIYUN_IMAGE_10006": "イメージベースのストレージバックアップサービスのみをサポートします", + "ORG_ZSTACK_ALIYUN_IMAGE_10007": "イメージ名はhttp://またはhttps://で始めることはできません。有効なイメージ名を使用してください。", + "ORG_ZSTACK_ALIYUN_IMAGE_10004": "データセンターに関連付けられたOSSバケットがありません: %s", + "ORG_ZSTACK_ALIYUN_IMAGE_10005": "ECSシステムイメージをリモートで削除することはできません", + "ORG_ZSTACK_VPC_10031": "L3ネットワーク[UUID: %s]のL2ネットワーク[UUID: %s]はクラスター[UUID: %s]にアタッチされていません", + "ORG_ZSTACK_VPC_10030": "L3ネットワーク[uuid:%s]にIP範囲がアタッチされていません", + "ORG_ZSTACK_ALIYUN_CORE_10016": "有効なクラウドリソース識別子を提供してください!", + "ORG_ZSTACK_ALIYUN_CORE_10013": "権限がありません: %s", + "ORG_ZSTACK_VPC_10035": "VIPが含まれているため、L3ネットワーク[UUID:%s]はまずアタッチする必要があります", + "ORG_ZSTACK_COMPUTE_HOST_10055": "クラスター[uuids:%s, hypervisorType:%s]は存在しません!", + "ORG_ZSTACK_VPC_10034": "指定された静的IPアドレス[%s]は、レイヤー3ネットワーク[UUID: %s]のゲートウェイIP[%s]と一致しません", + "ORG_ZSTACK_ALIYUN_CORE_10017": "Javaコードの実行に失敗しました、エラーコード: %s、エラーメッセージ: %s", + "ORG_ZSTACK_COMPUTE_HOST_10058": "ホスト[uuid:%s]は指定されたリソースを見つけることができません", + "ORG_ZSTACK_VPC_10033": "L3ネットワーク[uuid:%s]のゲートウェイは別のインスタンス/IP:%sによって使用されています", + "ORG_ZSTACK_ALIYUN_CORE_10018": "デバイスの準備ができていません(%dミリ秒以内)", + "ORG_ZSTACK_VPC_10032": "パブリックネットワーク[UUID: %s] VIP [UUID: %s, IP: %s]は、VPC VR [UUID: %s]上にないため、L3ネットワーク[UUID: %s]とピアリングできません", + "ORG_ZSTACK_COMPUTE_HOST_10019": "VMが[%s]状態の場合にのみライブスナップショットの実行をサポートしていますが、VMは現在[%s]状態にあります", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10120": "セキュリティグループルールを追加できませんでした。優先度[%d]は連続している必要があります。イングレスルールの最大許可優先度は[%d]です。", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10000": "監視IPアドレスがないため、プライマリストレージ[%s]のライセンス情報を取得できませんでした", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10001": "データが返されなかったため、プライマリストレージ[%s]のライセンス情報を取得できませんでした", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10122": "現在のインスタンス[uuid:%s]へのセキュリティグループルールの適用に失敗しました", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10002": "有効期限がnullのため、プライマリストレージ [%s] のライセンス情報を取得できませんでした", + "ORG_ZSTACK_ALIYUN_IMAGE_10008": "イメージUUID: %s用のバックアップストレージが設定されていません", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10121": "セキュリティグループルールを追加できませんでした。優先度[%d]は連続している必要があります。エグレスルールの最大許可優先度は[%d]です。", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10003": "プライマリストレージ[%s]のライセンス情報の日付形式[%s]を解析できませんでした", + "ORG_ZSTACK_ALIYUN_IMAGE_10009": "イメージUuid: %sのバックアップストレージ容量を超えました。手動で指定してください", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10124": "l3ネットワーク[uuid:%s]でネットワークサービス[type:%s]が有効になっていません", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10123": "一部の仮想マシンにセキュリティグループルールを適用できませんでした", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10125": "ルール[uuid:%s]が見つからないため、優先度を変更できませんでした", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10128": "nic[uuid:%s]に関連付けられているl3ネットワーク[uuid:%s]でネットワークサービス[type:%s]が有効になっていません", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10127": "UUID:%sのVM nicがUUID:%sのセキュリティグループにアタッチされました", + "ORG_ZSTACK_ALIYUN_IMAGE_10011": "イメージ [%s]は現在有効になっていません", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10129": "UUID [%s]のセキュリティグループは您的アカウントのUUID [%s]または管理者のものではありません", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10004": "仮想ID[uuid:%s]は組織[uuid:%s]に属していません", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10005": "組織[uuid:%s]にはすでに指定されたスーパーバイザーがいます", + "ORG_ZSTACK_ALIYUN_CORE_10001": "SDKへのエンドポイント追加に失敗しました。原因: %s", + "ORG_ZSTACK_ALIYUN_CORE_10005": "accessKeyとsecretAccessKeyを構成する必要があります!", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10003": "仮想ID[uuid:%s]は存在しません", + "ORG_ZSTACK_COMPUTE_HOST_10028": "nic[%s]が削除されました", + "ORG_ZSTACK_COMPUTE_HOST_10023": "操作エラーです。理由は: %s", + "ORG_ZSTACK_ALIYUN_CORE_10009": "メッセージからaccess key idまたはsecret access keyが見つかりません", + "ORG_ZSTACK_ALIYUN_IMAGE_10010": "Aliyunイメージインポートの有効なプラットフォーム:[%s]、有効な値は: [%s]", + "ORG_ZSTACK_ALIYUN_CORE_10006": "リージョン識別子を指定する必要があります!", + "ORG_ZSTACK_COMPUTE_HOST_10038": "仮想マシンデータ%の削除に失敗しました", + "ORG_ZSTACK_COMPUTE_HOST_10037": "仮想マシン構成ファイルのセットに失敗しました: %s", + "ORG_ZSTACK_COMPUTE_HOST_10039": "メモリバルーンの適用に失敗しました: %s", + "ORG_ZSTACK_COMPUTE_HOST_10036": "VMホスト名のセットに失敗しました: %s", + "ORG_ZSTACK_COMPUTE_HOST_10035": "VMポート構成の同期に失敗しました: %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10009": "無効なラベルです。'op'フィールドがnull、または有効なRegexまたはEqualではありません。%s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10008": "無効なラベルです。'key'フィールドはnullにできません。有効なキー値を入力してください。%s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10007": "ValueCondition文字列[%s]には'value'をキーとしてが必要です", + "ORG_ZSTACK_ZWATCH_DATATYPE_10006": "ラベル文字列[%s]に有効な操作が含まれていません", + "ORG_ZSTACK_COMPUTE_VM_10319": "VmInstanceDestroyVmExtensionPoint[%s]は%sのためvm[uuid:%s]の終了を拒否しました", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10006": "ボリューム [%s]のタイプが無効です。", + "ORG_ZSTACK_COMPUTE_VM_10318": "VmInstanceRebootExtensionPoint[%s]は%sのためvm[uuid:%s]の再起動を拒否しました", + "ORG_ZSTACK_COMPUTE_VM_10317": "VmInstanceStartNewCreatedVmExtensionPoint[%s]は、%sのため、VM[uuid:%s]の起動を拒否しました", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10004": "Ceph PS[uuid:%s]内のボリューム%sのスナップショットIDの取得に失敗しました", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10002": "Cephプール[uuid:%s]内のボリューム%sのインストールパスの確認に失敗しました", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10001": "プールサービスの応答から指定されたプール[PoolName:%s]が見つかりません: %s", + "ORG_ZSTACK_VPC_10006": "クラウド環境にVIP[uuid:%s]が見つかりません", + "ORG_ZSTACK_VPC_10005": "仮想ルータ[UUID:%s]のイメージタイプが%sではないため、IPv6 EIPをアタッチできませんでした", + "ORG_ZSTACK_VPC_10003": "VPCルータ[%s]へのSSH接続を確立できません。SSHポートが閉じているようです", + "ORG_ZSTACK_VPC_10009": "VMNic[uuid:%s]が見つかりません", + "ORG_ZSTACK_VPC_10008": "UUID:%sのEIPが見つかりません", + "ORG_ZSTACK_COMPUTE_VM_10316": "VMのホストを特定できません。仮想マシン[%s]を起動してから、ディスクのマウントを再試行してください", + "ORG_ZSTACK_COMPUTE_HOST_10005": "ホスト[uuid:%s]への同期クロックタスクの設定に失敗しました", + "ORG_ZSTACK_ZWATCH_DATATYPE_10001": "無効な式: %s。クラウドコンピューティングまたは仮想化設定のコンテキスト内で、関連する機能が見つかりません", + "ORG_ZSTACK_COMPUTE_HOST_10004": "ホスト[uuid:%s, name:%s]は状態[%s]のため、必要な操作を実行できません", + "ORG_ZSTACK_COMPUTE_VM_10315": "ゲートウェイエラーです。期待値: %s、実際の値: %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10000": "無効な関数: %s。クラウドコンピューティング環境のパラメータ型が無効です", + "ORG_ZSTACK_COMPUTE_VM_10314": "IPv6プレフィックス長エラーです。%sから%sの範囲の値を期待しましたが、%sを受信しました", + "ORG_ZSTACK_COMPUTE_VM_10313": "IPv6プレフィックス長を設定する必要があります", + "ORG_ZSTACK_VPC_10002": "L3ネットワーク[UUID: %s]のゲートウェイはVPC VR[UUID: %s]占用されています", + "ORG_ZSTACK_COMPUTE_VM_10311": "ネットマスクエラーです。期待値: %s、実際の値: %s", + "ORG_ZSTACK_COMPUTE_HOST_10000": "GPU情報の同期に失敗しました: %s", + "ORG_ZSTACK_VPC_10001": "レイヤー3ネットワーク[uuid:%s]のIP範囲が存在しません", + "ORG_ZSTACK_COMPUTE_VM_10310": "サブネットマスクを指定する必要があります", + "ORG_ZSTACK_VPC_10000": "VPC VR[uuid:%s]からNICをデタッチできません", + "ORG_ZSTACK_COMPUTE_HOST_10009": "ホスト[uuid:%s]へのPCIデバイスの割り当てに失敗しました", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10051": "URI形式が無効です。正しい例: ceph:/// または volume://", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10050": "Ceph ps[uuid=%s]のルートプール名が見つかりません", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10052": "ボリュームチェーンの削除エラーです。ボリュームの削除を続行します", + "ORG_ZSTACK_COMPUTE_VM_10320": "VmInstanceStartExtensionPoint[%s]は、%sのため、仮想機械[uuid:%s]の起動を拒否します", + "ORG_ZSTACK_COMPUTE_HOST_10013": "インスタンス[uuid:%s]のネットワークインターフェース[name:%s]が見つかりません", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10008": "暗号化%s[id:%s]に失敗しました: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_SMP_10000": "共有マウントポイントプライマリストレージ[uuid:%s, name:%s]は、接続されたコンピュートクラスタ内で利用可能なホストを見つけることができません", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10005": "クラウドコンピューティング環境ではEncryptColumnIntegrityFactoryの操作はサポートされていません", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10002": "%s[%s]の整合性検証エラー、原因: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10000": "%s[%s]の暗号化エラー、原因:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10017": "操作を実行するために接続されたKVMホストを見つけることができません。共有マウントポイントストレージ[uuid:%s]に接続されたクラスタ内のすべてのホストが切断されているようです。", + "ORG_ZSTACK_VPC_10027": "VPC router[UUID:%s]の状態が実行中または停止中ではないため、L3ネットワークをアタッチできませんでした", + "ORG_ZSTACK_VPC_10025": "VPCネットワーク[uuid:%s]はすでにVPC router [uuid:%s]にアタッチされています。", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10013": "URLに無効なディレクトリパス[%s]が含まれています。有効なパスはインスタンスのファイルシステム内である必要があり、/dev、/proc、/sysなどの特殊ディレクトリを含まないでください。提供されたURLが正しいことを確認してください。", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10042": "ルートボリュームのRBDイメージウォッチャーの取得に失敗しました、%s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10041": "CEPHプール冲突、指定されたディスクオファリングのCEPHプールは%sであり、作成パラメータで指定されたCEPHプールは%sです", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10010": "ボリューム[uuid:%s]はボリューム[%s]を参照しているため、ボリュームとその子孫をフラット化之前にボリュームタイプを変更することはできません", + "ORG_ZSTACK_VPC_10029": "VPC router[UUID:%s]の状態とピア状態の両方が実行中でも停止中でもないため、L3ネットワークをアタッチできませんでした", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10044": "プライマリストレージプール[poolName=%s]を見つけることができません", + "ORG_ZSTACK_VPC_10020": "L3ネットワーク[uuid:%s]は、VIP [%s]にアタッチされたネットワークサービスがまだ使用中のため、VPC vrouter [uuid:%s]からデタッチできません", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10043": "ルートボリューム[%s]はすでに使用中(Ceph RBDイメージ[%s]にアクティブなウォッチャーが存在する可能性があります)ため、潜在的なスプリットブレインシナリオを防ぐために、VMの起動は禁止されています", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10046": "プライマリストレージ[%s]にストレージプールを割り当てできません、目的: %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10045": "cephプライマリストレージプール[poolName=%s]には、要求されたサイズ%sを収容するための十分な仮想容量がありません", + "ORG_ZSTACK_VPC_10024": "VPC L3ネットワークのみをVPC vRouterにアタッチできます", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10047": "CephプライマリストレージMONノード[UUID:%s]のステータスを更新できません。これは削除されています。この警告は無視してかまいません。", + "ORG_ZSTACK_VPC_10023": "バーチャルルーターオファリング[uuid: %s]のイメージが見つかりません", + "ORG_ZSTACK_VPC_10022": "UUID: %sのバーチャルルーターオファリングは有効になっていません", + "ORG_ZSTACK_VPC_10021": "vPC L3ネットワーク[UUID:%s]は、VM NIC [%s]がまだ使用中のため、vPC router [UUID:%s]からデタッチできません", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10006": "クラウド環境ではサポートされていない操作です。クラウドコンピューティング操作でサポートされているAPIを使用していることを確認してください。", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10005": "パラメータが不足しています、virtualMachineInstanceUuid: %sが要求されています", + "ORG_ZSTACK_VPC_10017": "パブリックネットワークは元のバーチャルプライベートクラウドからデタッチできません", + "ORG_ZSTACK_VPC_10016": "デフォルトルートネットワークはデタッチできません", + "ORG_ZSTACK_VPC_10015": "管理ネットワークはデタッチできません。この操作を試みる前に、すべての依存リソースが転送または終了していることを確認してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10003": "SMPプライマリストレージ[uuid:%s]のコマンドを実行するために接続されたホストを見つけることができません", + "ORG_ZSTACK_VPC_10014": "バーチャルルーター[uuid:%s]は望ましい状態またはステータスにありません", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10002": "SMPプライマリストレージ[uuid:%s]のコマンドを実行するために接続されたホストを見つけることができません", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10001": "SMPプライマリストレージ[uuid:%s]はコンピュートクラスタに接続されていないため、仮想マシン[uuid:%s]のルートボリューム[uuid:%s]を削除できません。", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10007": "UUID:%sの仮想マシンが見つかりません", + "ORG_ZSTACK_VPC_10019": "マスターとスレーブの状態が一致しないため、VPCルーター[uuid:%s]からL3ネットワークをデタッチできませんでした", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10008": "uuid:%sの仮想マシンデバイスが見つかりません", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10030": "準備ができてアクセス可能な画像がないため、画像を[%s]からプライマリストレージ[%s]にダウンロードするためのバックアップストレージが見つかりません", + "ORG_ZSTACK_VPC_10018": "状態が実行中または停止していないため、VPCルーター[uuid:%s]からL3ネットワークをデタッチできませんでした", + "ORG_ZSTACK_ALIYUN_CORE_10037": "画像はリモートに既に存在します。整合性を確保するために、まず同期を使用してください。", + "ORG_ZSTACK_ALIYUN_CORE_10035": "%sミリ秒後もエントリは引き続きアクティブです", + "ORG_ZSTACK_ALIYUN_CORE_10036": "ECSインスタンス[%s]が見つかりません。Aliyunコンソールに存在するか確認してください", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10037": "プライマリストレージ[uuid:%s]に接続されたCeph MONが見つかりません", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10001": "パラメータが不足しています: resourceUuid %s、vmInstanceUuid %sが要求されています", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10002": "必須パラメータが不足しています: resource UUID。有効なresource UUIDを入力してください。", + "ORG_ZSTACK_VPC_10012": "仮想ルーター[uuid:%s]はVPCルーターではありません", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10039": "CEPHプールの競合: インスタンスオファリングで指定されたCEPHプールは%sで、作成パラメータで指定されたCEPHプールは%sです", + "ORG_ZSTACK_VPC_10011": "ネットワークインターフェース[uuid:%s]の状態を更新できませんでした。管理ネットワークインターフェースはサポートされていません", + "ORG_ZSTACK_ALIYUN_CORE_10039": "regionId[%s]はAliyunでは無効です!", + "ORG_ZSTACK_VPC_10010": "VM NIC[UUID:%s]を削除できませんでした。VM[UUID:%s]はアプライアンスVMです。API APIDetachL3NetworkFromVmを使用してください。", + "ORG_ZSTACK_SNMP_AGENT_10006": "ポート%sでのSNMPエージェントセッション[%s]の終了に失敗しました。理由は%sです", + "ORG_ZSTACK_SNMP_AGENT_10005": "SNMPエージェントのポートを%sから%sに変更できませんでした。理由は%sです", + "ORG_ZSTACK_SNMP_AGENT_10004": "SNMP[uuid:%s]インスタンスはプロビジョニングされていません", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10009": "EC2インスタンス[%s]の状態は実行中または停止である必要があります", + "ORG_ZSTACK_STORAGE_ZBS_10003": "mdsUrl[%s]が無効です。SSHユーザー名とパスワードは':'で区切る必要があり、空にすることはできません。有効なmdsUrl形式は%sです", + "ORG_ZSTACK_STORAGE_ZBS_10004": "管理サービスURL[%s]が無効です。ホスト名はnullにできません。有効な管理サービスURL形式は%sです", + "ORG_ZSTACK_STORAGE_ZBS_10002": "MDS URL[%s]が無効です。SSHユーザー名:SSHパスワードの部分が無効です。有効なMDS URL形式は%sです", + "ORG_ZSTACK_APPCENTER_10006": "%sはString値を必要としましたが、不正なタイプを受信しました", + "ORG_ZSTACK_APPCENTER_10005": "%sはBoolean値を必要としましたが、不正なタイプを受信しました", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10004": "ディスク[%%s]はどのインスタンスにも接続されていません", + "ORG_ZSTACK_APPCENTER_10004": "%sはNumber値を必要としましたが、不正なタイプを受信しました", + "ORG_ZSTACK_STORAGE_ZBS_10005": "MDS URL[%s]が無効です。SSHポートが有効な範囲(1-65535)外です。有効なMDS URLは%sの形式である必要があります。", + "ORG_ZSTACK_APPCENTER_10003": "%sはpreParametersで指定されていますが、設定されていません", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10006": "データパーティションのみをECSインスタンスに接続できます。", + "ORG_ZSTACK_APPCENTER_10002": "適切な構成のため、filterNameはappcenter:trueまたはappcenter:falseに設定する必要があります。", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10007": "このパーティションはECSインスタンスに接続できません。ECSインスタンスがパーティションの接続を許可する状態であることを確認してください。", + "ORG_ZSTACK_SNMP_AGENT_10003": "%s ポートでSNMPエージェントを起動できませんでした(理由: %s)", + "ORG_ZSTACK_APPCENTER_10001": "PublishAppVO[uuid: %s] は存在しません", + "ORG_ZSTACK_SNMP_AGENT_10002": "SNMPエージェント[%s]の起動に失敗しました。クラウド構成[%s]を確認してください", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10001": "インスタンスのルートパーティションは削除できません", + "ORG_ZSTACK_SNMP_AGENT_10001": "複数のSnmpAgentVOインスタンスが存在します。使用するものを指定してください。", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10002": "パーティションカテゴリがエフェメラルの場合、deleteWithInstance プロパティを false に設定することはできません", + "ORG_ZSTACK_SNMP_AGENT_10000": "SnmpAgentVO インスタンスが存在しないため、SnmpAgentImpl をインスタンス化できません。SnmpAgentVO が適切に設定およびデプロイされていることを確認してください。", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10003": "パーティションカテゴリがクラウドでポータブルでない場合、deleteWithInstance プロパティを false に設定することはできません", + "ORG_ZSTACK_CORE_WEBHOOK_10000": "無効な URL[%s]", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10010": "パーティションとECSインスタンスは同一の可用性ゾーンに存在する必要があります", + "ORG_ZSTACK_TEST_AOP_10001": "ユニットテストでは、クラウドコンピューティングインフラストラクチャまたは仮想化環境の問題により失敗することが必要です", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10015": "パーティションを作成またはサイズを管理するには、リクエストパラメータにパーティションサイズまたはスナップショットIDを指定する必要があります。パーティションサイズを提供するか、既存の使用してください", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10016": "ルートパーティションスナップショットからパーティションを作成することはできません。この操作には非ルートパーティションスナップショットまたはルートパーティションのコピーを使用してください。", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10017": "パーティション名または説明は 'http://' または 'https://' で始めることはできません。有効な文字を使用してパーティションに名前を付けてください。", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10011": "パーティション [%s] はすでにインスタンス [%s] に接続されています", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10012": "データパーティションのみをECSインスタンスに接続できます。", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10013": "現在使用中のインスタンスにはパーティションを接続できません。新しいパーティションを接続する前にインスタンスを停止してください。", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10014": "非弾性パーティションは関連インスタンスと同時にのみ破棄できます", + "ORG_ZSTACK_STORAGE_ZBS_10021": "無効な論理的パーティション名[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10022": "無効なプール名[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10020": "クラウドリソース参照のURI構文が無効です: %s", + "ORG_ZSTACK_STORAGE_ZBS_10025": "重複したMDS[%s]の追加は許可されていません", + "ORG_ZSTACK_STORAGE_ZBS_10026": "論理的プール[%s]の物理リソースが見つかりません", + "ORG_ZSTACK_STORAGE_ZBS_10023": "少なくとも1つのコンピュートプールが構成されていることを確認してください", + "ORG_ZSTACK_STORAGE_ZBS_10024": "少なくとも1つのMetadata Serviceインスタンスが構成されていることを確認してください", + "ORG_ZSTACK_STORAGE_ZBS_10027": "ZBSプライマリストレージ[uuid:%s]のMDS[%s]が見つかりません", + "ORG_ZSTACK_STORAGE_ZBS_10028": "ZBSプライマリストレージ [uuid:%s] のすべてのMDSノードが接続状態ではありません", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10001": "クラウド環境内で定義済みの事前構成テンプレートを削除できません。サポートまでお問い合わせください。", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10002": "この環境では定義済み構成テンプレートの状態を変更できません。利用可能な仮想マシンイメージを使用するか、カスタム構成を作成してください。", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10000": "定義済みインスタンスタイプテンプレートを更新できません", + "ORG_ZSTACK_MTTYDEVICE_10001": "mttyデバイス[uuid:%s]から生成されたmdevデバイスがVMにまだ接続されています", + "ORG_ZSTACK_MTTYDEVICE_10000": "mttyデバイス [UUID:%s]はmdevsリソースに仮想化されていません", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10004": "UUID: %s のPreconfiguration Template VOが見つからない可能性があります。削除された可能性があります", + "ORG_ZSTACK_MTTYDEVICE_10004": "MTtyデバイス [UUID:%s]を含むホスト [UUID:%s]が接続されていません。", + "ORG_ZSTACK_MTTYDEVICE_10003": "mttyデバイス [UUID:%s]はmdevsに仮想化できません", + "ORG_ZSTACK_HYGON_KVM_10004": "ホスト[UUID:%s]からHygon CPUデバイス情報の取得に失敗しました: %s", + "ORG_ZSTACK_STORAGE_ZBS_10014": "ZBSプライマリストレージ[uuid:%s]は削除されたか、関連付けが解除された可能性があります", + "ORG_ZSTACK_STORAGE_ZBS_10015": "KVMホスト[UUID:%s]が見つかりません。クライアントをデプロイできません", + "ORG_ZSTACK_STORAGE_ZBS_10012": "ZBSプライマリストレージ[uuid:%s]に接続できません。すべてのメタデータサーバーへの接続に失敗しました", + "ORG_ZSTACK_STORAGE_ZBS_10016": "アドオン情報がnullです。プライマリストレージ[uuid:%s]の準備ができていません。pingタスクをスキップします", + "ORG_ZSTACK_ZWATCH_DATATYPE_10010": "ラベルが無効です。'value'フィールドをnullにできません。有効な値を入力してください。%s", + "ORG_ZSTACK_STORAGE_ZBS_10017": "十分な容量[%d]と必要なURL: %sを持つ利用可能な論理ボリュームがありません", + "ORG_ZSTACK_HYGON_KVM_10003": "Hygon IOMMUデバイスの生成解除に失敗しました。原因是:%s", + "ORG_ZSTACK_HYGON_KVM_10002": "mdevデバイスを生成解除できません。ホスト[uuid:%s]上のVMに%d個のmdevデバイスが接続されています。まず影響を受けるすべての仮想マシンを停止または移行してください。", + "ORG_ZSTACK_HYGON_KVM_10001": "ホスト[UUID:%s]でPCI BDF %sのCCPデバイスが見つかりません。まずHygonデバイスを同期してください", + "ORG_ZSTACK_HYGON_KVM_10000": "Hygon IOMMUデバイスの生成に失敗しました。原因是:%s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10021": "InfluxDBインスタンスのクエリに失敗しました。%s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10023": "InfluxDBリテンション policy'%s'の変更に失敗しました。%s", + "ORG_ZSTACK_STORAGE_MIGRATION_10000": "VM[UUID: %s]のストレージ移行のための物理リソースが十分ではありません。必要な容量(イメージキャッシュを含む): %s、現在の利用可能な物理容量: %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10024": "InfluxDBリテンション policy'%s'の作成に失敗しました。%s", + "ORG_ZSTACK_STORAGE_MIGRATION_10001": "ストレージ移行ではvmの状態[%s]はサポートされていません", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10025": "InfluxDBの応答が無効です: %s。列にメトリック名が見つかりません", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10026": "InfluxDB'%s'のデフォルトユーザーの作成に失敗しました。%s", + "ORG_ZSTACK_STORAGE_MIGRATION_10004": "仮想マシンインスタンスのキャンセルはサポートされていません", + "ORG_ZSTACK_STORAGE_MIGRATION_10005": "VM[uuid: %s]は存在しません", + "ORG_ZSTACK_STORAGE_MIGRATION_10003": "サポートされていないストレージ移行タイプ: %s から %s へ", + "ORG_ZSTACK_STORAGE_MIGRATION_10008": "vmブロックマイグレーションに失敗しました: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10009": "ターゲットプライマリストレージは現在のホストの移行操作をサポートしていません。ストレージが移行操作と互換性があることを確認して、再試行してください。", + "ORG_ZSTACK_STORAGE_MIGRATION_10006": "VM状態[%s]のストレージ移行キャンセルはサポートされていません", + "ORG_ZSTACK_STORAGE_MIGRATION_10007": "VM移行`%s`のホスト候補の決定に失敗しました。ターゲットホストとネットワーク接続を確認してください。", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10005": "virtio driverデバイスの形式が無効です: %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10004": "VM[uuid:%s]からのvirtio ISOのデタッチに失敗しました: サポートされていません", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10003": "vm[uuid:%s]からのvirtioデバイスのデタッチに失敗しました", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10002": "mn[uuid:%s]でファイル[%s]のmd5の読み取りに失敗したため、virtio driverのアタッチに失敗しました: %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10001": "mn[uuid:%s]内のファイル[%s]のMD5が無効なため、virtio driverのアタッチに失敗しました", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10000": "mn[uuid:%s]でファイル[%s]のmd5の読み取りに失敗したため、virtio driverのアタッチに失敗しました: バーチャルディスクファイルがclasspathに見つかりません", + "ORG_ZSTACK_DIRECTORY_10010": "指定されたディレクトリタイプ %s はサポートされていません。サポートされているタイプは %s です。", + "ORG_ZSTACK_SCHEDULER_VM_10001": "vm[uuid:%s]は終了しているため、ステータスの変更は許可されていません", + "ORG_ZSTACK_STORAGE_ZBS_10040": "MDS[%s]メタデータの取得に失敗しました。ZBS構成を確認してください", + "ORG_ZSTACK_STORAGE_ZBS_10032": "すべてのメタデータサーバーがHTTPリクエスト[%s]を実行できません", + "ORG_ZSTACK_STORAGE_ZBS_10036": "ZBSプライマリストレージMDS[%s]のバージョンが管理ノード[%s]と一致しません。MDSを再接続し、SSH接続を確認してください。", + "ORG_ZSTACK_STORAGE_ZBS_10037": "MDaaS URLsはnullまたは空にできません", + "ORG_ZSTACK_STORAGE_ZBS_10034": "ZBSプライマリストレージMDS[%s]からメタデータを同期できません。原因是 %s", + "ORG_ZSTACK_STORAGE_ZBS_10038": "すべてのメタデータサービスインスタンスから論理ボリュームを検出できません。詳細: %s", + "ORG_ZSTACK_STORAGE_ZBS_10039": "MDS[%s]とのSSH接続の確立に失敗しました、またはzbs-toolsがインストールされていません。SSH構成を確認し、必要な依存関係がインストールされていることを確認してください。", + "ORG_ZSTACK_DIRECTORY_10006": "ディレクトリ %s とディレクトリ %s の間に循環依存が検出されました。これにより、仮想環境のプロビジョニングで設定冲突または無限ループが発生する可能性があります。", + "ORG_ZSTACK_DIRECTORY_10003": "指定された名前にサポートされていない文字が含まれています。クラウドコンピューティング環境では、名前には中国語の文字、英字、数字、スペース、および次の特殊文字のみを含めることができます: ()()[]@._-+ 。名前がこれらのガイドラインに従っていることを確認してください。", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10000": "イベントバスにEventFamily[name:%s]が見つかりません", + "ORG_ZSTACK_DIRECTORY_10004": "すべてのリソースのzoneUuidはディレクトリzoneUuid[%s]と一致している必要があります", + "ORG_ZSTACK_DIRECTORY_10001": "リソースタイプ %s はクラウドディレクトリでサポートされていません。許可されているタイプは %s です。", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10002": "指定された名前空間またはイベントファミリーリポジトリにEventFamily[name:%s, namespace:%s]が見つかりません", + "ORG_ZSTACK_DIRECTORY_10000": "リソース %s はすでにディレクトリUUID[%s]にバインドされています。複数のパスはサポートされていません。", + "ORG_ZSTACK_NAS_10002": "type[%s]のNasFileSystemFactoryが重複しています", + "ORG_ZSTACK_NAS_10000": "NASファイルシステム[%%s]は 아직 존재하지 않습니다", + "ORG_ZSTACK_NAS_10001": "type: %s のNASファクトリーが見つかりません", + "ORG_ZSTACK_DIRECTORY_10009": "ディレクトリの作成に失敗しました。パスが正しく指定されていること、および4レベル以上の仮想ディレクトリれていないことを確認してください。", + "ORG_ZSTACK_DIRECTORY_10008": "ディレクトリ名が重複しています。ボリューム[uuid: %s]という名前 %s はすでに存在します", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10011": "無効なクエリタグ[%s]です。許可されるタグ名は%sです", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10012": "名前に[%s]を持つEvent Familyが複数存在します。ラベル[%s]を指定する必要があります。", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10006": "データボリューム[%s]が存在するVMにはメモリスナップショットが存在するため、detachできません。", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10005": "メモリスナップショットグループがあるため、ボリューム%sを仮想マシンインスタンス%sにattachできません", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10004": "データボリューム[%s]が存在するVMにはメモリスナップショットが存在するため、削除できません。", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10003": "ボリューム{volume_id}は存在しません", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10001": "L3ネットワーク[uuid: %s]を持つネットワークは、Volume Snapshot Group [uuid: %s]によって参照されています。このL3ネットワークを削除する前に、Volume Snapshot Groupを削除してください。", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10000": "デフォルトのL3ネットワークUUIDが存在しません", + "ORG_ZSTACK_AI_10086": "ModelServiceGroupは%sによって仍然参照されているため、削除できません", + "ORG_ZSTACK_AI_10087": "taskUuidを空にすることはできません。タスクを送信する前に適切に設定してください。", + "ORG_ZSTACK_AI_10084": "システムインスタンス[uuid: %s]は削除できません", + "ORG_ZSTACK_AI_10082": "モデルの削除に失敗しました。モデル[uuid: %s]は仍然%sによって使用されています", + "ORG_ZSTACK_AI_10083": "モデル[uuid: %s]はクラウドリポジトリに存在しません", + "ORG_ZSTACK_AI_10080": "ModelEvalサービスタイプがデプロイされている場合、Custom URLにはモデルフィールドが必要です。%s", + "ORG_ZSTACK_AI_10081": "L3ネットワークUUID %sにはDHCPサービスが有効になっていません。静的IPを割り当てるには静的IPシステムタグが必要です。", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10007": "ストレージスナップショットを含む複数のホストで同時にボリュームスナップショットを取得する操作はサポートされていません。", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10008": "インストールURL[%s]のストレージ容量が見つかりません", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10005": "ID: %sのプライマリストレージプラグインが登録されていません", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10006": "タイプ[%s]のストレージソリューションでプロトコル[%s]はサポートされていません", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10009": "ブロックストレージボリュームが見つかりません。ブロックストレージボリュームにアクセスパスが設定されていることを確認してください。", + "ORG_ZSTACK_CONFIGURATION_10009": "予約メモリサイズ[%s bytes]が利用可能なメモリサイズ[%s bytes]を超えています", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10010": "プライマリストレージ[uuid:%s]をサポートするためのバックアップストレージタイプが指定されていません", + "ORG_ZSTACK_CONFIGURATION_10008": "メモリサイズ[%s bytes]はモダンなOSのブートストラップには不十分です。クラウド仮想環境では最低16MBを推奨します。", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10011": "関連するイメージが削除され、そのキャッシュが見つからないため、ルートボリューム[%s]をを再初期化できません", + "ORG_ZSTACK_MULTICAST_ROUTER_10005": "マルチキャストルータ[uuid:%s]はVPC Routerに関連付けられていません", + "ORG_ZSTACK_CONFIGURATION_10007": "vcpu数[%s]は1未満です", + "ORG_ZSTACK_MULTICAST_ROUTER_10006": "Rendezvous Point [%s]はユニキャストIPアドレスではありません", + "ORG_ZSTACK_CONFIGURATION_10006": "サポートされていないインスタンスタイプ[%s]", + "ORG_ZSTACK_MULTICAST_ROUTER_10007": "グループアドレス[%s]はマルチキャストグループアドレスではありません", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014": "ストレージは正常ではありません:%s", + "ORG_ZSTACK_MULTICAST_ROUTER_10000": "マルチキャストルーター[uuid:%s]はVPCルーターに関連付けられていません", + "ORG_ZSTACK_MULTICAST_ROUTER_10001": "マルチキャストは既にVPCルーターUUID[:%s]で有効化されています", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012": "内部スナップショットパス[%s]から所有ボリュームパスが見つかりません。正規表現[%s]がスナップショットパスに一致しません", + "ORG_ZSTACK_MULTICAST_ROUTER_10002": "マルチキャストルーター[uuid:%s]のvPCルーターは削除されています", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10013": "外部プライマリストレージ[%s]へのpingに失敗しました。ネットワーク接続またはストレージサービスの状態を確認してください。%s", + "ORG_ZSTACK_CONFIGURATION_10001": "インスタンスオファリング[UUID: %s]には既にユーザー定義のシステムタグが存在します。", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10004": "トークン応答がnullです。認証プロセスが正しく構成されていること、およびトークンエンドポイントが有効な応答を返していることを確認してください。", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10003": "タイプ(%s)のOAuth2Login実装が見つかりません", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10005": "%sはnullです: ソースファイルパスが正しく指定されていることを確認してください。", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10000": "タイプ[%s]のOAuth2認証ハンドラが重複しています", + "ORG_ZSTACK_CONFIGURATION_10004": "インスタンスオファリングに複数のシステムタグを設定することはできません。", + "ORG_ZSTACK_CONFIGURATION_10003": "ディスクオファリング[UUID: %s]には既にユーザー定義のシステムタグが存在します。", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10002": "タイプ(%s)のOAuth2プロバイダーが見つかりません", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10001": "名前[%s]のOAuth2プロバイダー[%s]が重複しています", + "ORG_ZSTACK_AI_10075": "ContainerModelServiceにはdockerImageを指定する必要があります。", + "ORG_ZSTACK_AI_10076": "UUID:%sのモデルセンターがUUID:%sのモデルサービスに見つかりません", + "ORG_ZSTACK_AI_10071": "vmImageUuidはVirtualMachineモデルサービスの必須パラメータです。有効なvmImageUuid値を指定してください。", + "ORG_ZSTACK_AI_10072": "指定されたVMイメージUUIDは無効です。有効なUUIDを確認して指定してください。", + "ORG_ZSTACK_AI_10070": "モデルサービスタイプ[%s]は依存モデルサービスグループUUIDを持つべきではありません", + "ORG_ZSTACK_MULTICAST_ROUTER_10008": "マルチキャストルーター[uuid:%s]のRPアドレスペア[%s: %s]は既に存在します", + "ORG_ZSTACK_MULTICAST_ROUTER_10009": "マルチキャスト路由器[uuid:%s]のrpcアドレスタプル[%s : %s]が存在しません", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10015": "ユーザー[%s]のアップロードに失敗しました: ユーザーはクラウド環境に既に存在します", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10017": "コード応答の取得でエラーが発生しました: %s", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10016": "ユーザー[%s]のアップロードに失敗しました: %s", + "ORG_ZSTACK_AI_10079": "ModelEvalサービスタイプには、指定されたmodelServiceGroupUuids内の既存のモデルサービスまたは使用するための有効なURLが必要です。", + "ORG_ZSTACK_AI_10077": "配置メッセージにL3ネットワークUUIDが提供されておらず、モデルセンター[UUID:%s]にはserviceNetworkUuidまたはstorageNetworkUuidが構成されていません。", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10012": "iam2に同名のユーザー[%s]が存在します", + "ORG_ZSTACK_AI_10078": "クラウド環境設定で環境変数の値はnullであってはなりません。すべての必須変数が正しく設定されていることを確認してください。", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_SUPPLIER_EMAY_10000": "サプライヤー[%s]でのパラメータが無効です", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10026": "クラウドサービスから取得したユーザー名がnullです。ユーザー認証構成を確認してください。", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10025": "パラメータの取得に失敗しました[%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10028": "Plugin [uuid:%s]は、サードパーティログイン認証のためにOAuth2クライアント[uuids:%s]によって使用されています。", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10027": "ローカルユーザーに同じ名前のユーザーが存在します[%s]", + "ORG_ZSTACK_AI_10097": "グループ[uuid: %s]内のモデルサービスのタイプに整合性がありません。期待されるタイプ: %s、実際のタイプ: %s", + "ORG_ZSTACK_AI_10098": "バーチャル化環境内にモデルサービスのバックエンド[type: %s]が見つかりません", + "ORG_ZSTACK_AI_10095": "グループ[uuid: %s]内のすべてのモデルサービスはserviceBootUptimeを設定する必要があります", + "ORG_ZSTACK_AI_10096": "グループ[uuid: %s]内でノードランク0のモデルサービスインスタンスが見つかりません", + "ORG_ZSTACK_AI_10093": "モデルサービスインスタンス[uuid: %s]はアクティブではなく準備完了状態でもありませんが、エラーコードが見つかりません", + "ORG_ZSTACK_AI_10094": "予期しないコンテンツ: %sサービスのYAMLはnullとして解析されました", + "ORG_ZSTACK_AI_10091": "準備完了ステータスの取得に失敗しました。理由: %s", + "ORG_ZSTACK_AI_10092": "モデルサービスインスタンス[uuid: %s]は利用できず、準備完了状態ではありません。理由: %s", + "ORG_ZSTACK_AI_10090": "NGINX設定の再読み込みに失敗しました: %s", + "ORG_ZSTACK_VROUTERROUTE_10010": "宛先[%s]はブラックホールルートとスタティックルートを同時に持つことはできません", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10000": "外部プライマリストレージが見つかりません[uuid:%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10031": "%sから%sへの処理に失敗しました、ステータスコード: %s、レスポンス本文: %s", + "ORG_ZSTACK_VROUTERROUTE_10012": "宛先: %sの重複するBlack Hole Routeエントリを追加できません", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10030": "HTTPエラー、ステータスコード: %s、レスポンス本文: %s", + "ORG_ZSTACK_VROUTERROUTE_10011": "重複するスタティックルートエントリを追加できません、宛先: %s、ターゲット: %s、タイプ: %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10003": "locationUrl:%sの必要な容量条件を満たせません[availableSize > %dバイト]、現在の利用可能なサイズ %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10004": "UUID[%s]を持つボリュームがインストールパスに見つかりません", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10001": "外部ストレージサービスへの接続を確立できません。ストレージサービスがクラウド環境内で正しく構成され、アクセス可能であることを確認してください。", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10032": "%sから%sへの処理に失敗しました、IOエラー: %s", + "ORG_ZSTACK_AI_10099": "モデルサービスインスタンスグループ[uuid: %s]が存在しません", + "ORG_ZSTACK_VROUTERROUTE_10001": "バーチャルルータータイプ[%s]のサービスファクトリーが見つかりません", + "ORG_ZSTACK_VROUTERROUTE_10000": "バーチャルルーター[uuid:%s]が見つかりません", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10015": "Ceph BS[uuid=%s]のプール名が見つかりません", + "ORG_ZSTACK_VROUTERROUTE_10003": "ルートテーブルが見つかりません[uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10012": "CephバックアップストレージMON[UUID:%s]のステータスを更新できません。削除されています。このエラーは無視できます。", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10000": "ホストスケジューリンググループが見つかりません[uuid:%s]、削除または再割り当てされた可能性があります", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10003": "ホスト[UUID:%s]はすでにホストスケジューリンググループ[UUID:%s]に接続されています。", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10004": "UUID %s のホストがnullです。クラスタ構成を確認してください。", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10001": "仮想マシンスケジューリングルール[uuid:%s]が見つかりません。削除された可能性があります", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10002": "仮想マシンスケジューリンググループ[uuid:%s]が見つかりません。削除された可能性があります", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10011": "CEPHバックアップストレージはイメージチェックサムの計算をサポートしていません。", + "ORG_ZSTACK_SNS_PLATFORM_HTTP_10000": "HTTP POSTリクエスト失敗。ステータス: %s、本文: %s", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10007": "イメージ[uuid: %s]はバックアップストレージ[uuid:%s, name:%s]で利用できません", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10005": "同じFSIDを持つ別のCEPHバックアップストレージが存在します。同じCEPHセットアップを2つの異なるバックアップストレージとして追加することはできません。[name:%s, uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10003": "Cephバックアップストレージ[UUID:%s]に接続できません。すべてのCephモニターへの接続に失敗しました。", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10002": "CephMon[hostname:%s]はバックアップストレージ[uuid:%s]で見つかりません", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10009": "CEPHバックアップストレージクラスターへのMONノードの追加に失敗しました", + "ORG_ZSTACK_MULTICAST_ROUTER_BACKEND_10000": "マルチキャストルーター[uuid:%s]はバックエンドでマルチキャストを有効にしている間に削除されました", + "ORG_ZSTACK_LDAP_10016": "LDAPエントリのクエリに失敗しました、%s", + "ORG_ZSTACK_LDAP_10017": "LDAPエントリ[filter: %s]のクエリが%sのため失敗しました", + "ORG_ZSTACK_LDAP_10012": "LDAP/ADサーバーへの接続を確立できません、提供された資格情報が無効です。ユーザーDNとパスワードを確認してください。", + "ORG_ZSTACK_LDAP_10013": "LDAP/ADサーバーへの接続を確立できません、通信エラーです。IPアドレス、ポート番号、ベースDNを確認してください。", + "ORG_ZSTACK_LDAP_10014": "LDAP/ADサーバーへの接続を確立できません、%s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10005": "現在のライセンス[%s]はイメージストアバックアップストレージ操作に対して無効です", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10004": "CephPrimaryStorage[%s]は存在しません!", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10001": "イメージ[uuid:%s]はクラウドストレージリポジトリから削除されています", + "ORG_ZSTACK_LDAP_10010": "無効なLdapServerType[%s]、有効な値: [%, %s]", + "ORG_ZSTACK_LDAP_10007": "アカウント[UUID:%s]が見つかりません!!!", + "ORG_ZSTACK_LDAP_10008": "クラウド環境構成でサポートされていないLDAP/ADサーバースコープです。スコープが仮想化およびクラウドコンピューティング標準と互換性があることを確認してください。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10000": "仮想ルータ[uuid:%s]上の仮想マシンネットワークインターフェース[uuid:%s]のエラスティックIP [uuid:%s, name:%s, ip:%s]の作成に失敗しました。%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10001": "ゾーン[uuid:%s]のL3Network [uuid:%s]に対して仮想ルータオファリング[uuid:%s]が見つかりましたが、ネットワークのパブリックIP構成がエラスティックIP [uuid:%s]と一致しません。L3Network [uuid:%s]のシステムタグguestL3Network::l3NetworkUuidを使用して、特定の仮想ルータオファリングを指定する必要があるかもしれません。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10002": "仮想ルータ[uuid:%s]上のvm nic [uuid:%s]からのEIP [uuid:%s, name:%s, ip:%s]のデタッチに失敗しました。%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10004": "仮想ルータ[uuid:%s]でのEIPの同期に失敗しました。エラーの詳細: %s", + "ORG_ZSTACK_AI_10004": "randomUuidが予期した値と一致しません。UUID生成ロジックを確認してください。", + "ORG_ZSTACK_AI_10005": "モデルセンターが見つかりません。モデルセンターサービスがクラウド環境に適切にデプロイおよび構成されていることを確認してください。", + "ORG_ZSTACK_AI_10003": "randomUuidがnullです。使用前に有効なUUIDが生成されていることを確認してください。", + "ORG_ZSTACK_AI_10001": "指定されたモデルセンター管理IPアドレス %sが無効です。有効なIPであることを確認して再試行してください。", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10027": "vm[uuid:%s]がホスト[uuid:%s]で実行中ですが、VMスケジューリンググループ[uuid:%s]に関連するスケジューリングポリシー[%s]に準拠していません。", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10028": "vm[uuid:%s]がホスト[uuid:%s]で実行中ですが、仮想マシンスケジューリンググループ[uuid:%s]に関連するスケジューリングルール[%s]に準拠していません。", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10019": "VMスケジューリンググループ[UUID:%s]にはすでに実行済みの排他的またはアフィニティベースのVMスケジューリングポリシーがアタッチされています。このグループに再度実行が必要なタイプのポリシーをアップすることはできません。", + "ORG_ZSTACK_AI_10028": "modelServicesはnullまたは空にできません。サービスインスタンスが適切に初期化および構成されていることを確認してください。", + "ORG_ZSTACK_AI_10029": "modelServicesは、一貫性のために仮想インスタンスと同じモデルUUIDを使用する必要があります。", + "ORG_ZSTACK_AI_10026": "serviceNetworkUuid %sはシステムレイヤー3ネットワークではありません", + "ORG_ZSTACK_AI_10027": "storageNetworkUuid %sはシステムレイヤー3ネットワークではありません", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10025": "vm[uuid:%s]がホスト[uuid:%s]で実行中ですが、仮想マシンのスケジューリンググループ[uuid:%s]に関連するスケジューリングポリシーに準拠していません。", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10026": "hostGroup[uuid:%s]には割り当てられたホストがありません", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10024": "vmスケジューリンググループ[uuid:%s]がvm [uuid:%s]のホスト[uuid:%s]を確保できませんでした", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10007": "vm[uuid:%s]はすでにvmスケジューリンググループ[uuid:%s]に関連付けられています", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10008": "ゾーンの不一致が検出されました:VM[UUID: %s, Zone UUID: %s]はスケジューリングルールグループ[UUID: %s, Zone UUID: %s]とは異なります", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10005": "ホストスケジューリンググループに追加できるホストは、を有効にし、管理ノード(MN)に接続されている必要があります。", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10006": "ゾーンの不一致が検出されました:ホスト[uuid: %s, zone uuid: %s]のゾーンはホストスケジューリングルールグループ[uuid: %s, zone uuid: %s]とは異なります", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10009": "vmは[%s,%s]状態でのみVMスケジューリンググループを変更できますが、現在は[%s]状態です", + "ORG_ZSTACK_TEMPLATECONFIG_10000": "いずれのTemplateConfigsも見つかりません:[template UUID: %s]", + "ORG_ZSTACK_TICKET_API_10002": "構成にアカウントシステムタイプ[%s]が定義されていません", + "ORG_ZSTACK_TICKET_API_10003": "チケットタイプがクラウド環境構成に見つかりません。%s", + "ORG_ZSTACK_TICKET_API_10004": "一致するチケットフローコレクションまたはデフォルトのチケットフローコレクションが見つかりません。flowCollectionUuidを指定するか、システムのデフォルトのチケットフローコレクションを作成してください。", + "ORG_ZSTACK_TEMPLATECONFIG_10003": "テンプレート構成が見つかりません:[category: %s, name: %s, template UUID: %s]", + "ORG_ZSTACK_TICKET_API_10005": "チケットフローコレクション[UUID:%s]がチケットタイプ[UUID:%s]と一致しません", + "ORG_ZSTACK_TICKET_API_10006": "チケットフローコレクション[uuid:%s]が無効です。管理者にお問い合わせください。", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10000": "Aliyun NASプライマリストレージ[UUID:%s, Name:%s]は、ボリュームをインスタンス化するための添付されたクラスター内で利用可能なホストを見つけられません。", + "ORG_ZSTACK_TICKET_API_10007": "チケットフローコレクション[UUID:%s]は無効であるため、使用できません。", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10001": "Alibaba Cloud NASプライマリストレージ[UUID:%s, Name:%s]は、プライマリストレージ上のビットを削除するための添付されたクラスター内で利用可能なホストを見つけられません。", + "ORG_ZSTACK_TICKET_API_10008": "無効なリクエストです。指定された名前空間またはスコープ内にAPI[%s]が見つかりません", + "ORG_ZSTACK_TICKET_API_10009": "無効なリクエスト、apiBodyからAPI[%s]を作成できません、%s", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10010": "VPC VMスケジューリンググループは操作できません", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10011": "ゾーンのUUIDはnullではありません", + "ORG_ZSTACK_TEMPLATECONFIG_10005": "いずれのTemplateConfigsも見つかりません:[templateUUID: %s]", + "ORG_ZSTACK_AI_10012": "architectureImagesはnullまたは空であってはなりません。クラウド仮想化環境では、これらが適切に構成されていることを確認してください。", + "ORG_ZSTACK_AI_10042": "無効なCloudFormationテンプレート形式: %s", + "ORG_ZSTACK_AI_10043": "YAML設定と個別パラメータの更新は、クラウドコンピューティング環境では同時に使用できません。設定を更新する方法を選択してください。", + "ORG_ZSTACK_AI_10040": "servicePortsに重複する値を含めることはできません: %s", + "ORG_ZSTACK_AI_10041": "serviceBootupTimeは範囲[1,65535]内でなければなりません", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10006": "マウントパスのホストでの確認に失敗しました: %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10005": "Aliyun NASプライマリストorage[UUID: %s, name: %s]がいずれのクラスターにも接続されていないか、接続されているクラスターに接続されたホストがありません。", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10009": "イメージキャッシュのクリーンアップに使用できるホストが見つかりません。イメージキャッシュ用に、少なくとも1つのホストが利用可能であり、適切に構成されていることを確認してください。", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10013": "クラスターへのプライマリストorageの接続に失敗しました。クラスター内のKVMホスト[uuid:%s, name:%s]はqemu-imgバージョン[%s]を使用していますが、プライマリストorageが接続されているクラスターのKVMホスト[uuid:%s]はqemu-imgバージョン[%s]を使用しています。%sより大きいqemu-imgバージョンは%sより小さいバージョンと互換性がなく、ボリュームスナップショット操作が失敗する可能性があります。qemu-imgのバージョン不一致を防ぐため、異なるLinuxディストリビューションを持つクラスターへのプライマリストorageの接続は避けてください。", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10014": "イメージキャッシュをダウンロードできる利用可能なコンピューティングリソースが見つかりませんでした!", + "ORG_ZSTACK_AI_10049": "アーキテクチャイメージマッピング内のCPUアーキテクチャは空にできません。有効なCPUアーキテクチャが指定されていることを確認してください。", + "ORG_ZSTACK_AI_10046": "GPUベンダー%sは仕様UUIDリストを提供する必要があります", + "ORG_ZSTACK_AI_10047": "ベンダー%sのGPU仕様UUIDが%sに見つかりません: %s", + "ORG_ZSTACK_AI_10044": "アーキテクチャイメージマッピング内のGPUベンダー仕様マッピングは空にできません。GPUベンダーが正しく指定されていることを確認してください。", + "ORG_ZSTACK_AI_10045": "アーキテクチャイメージマッピング内のGPUベンダーは空にできません。有効なGPUベンダー名を入力してください。", + "ORG_ZSTACK_AI_10031": "modelServices UUIDはnullであってはなりません。modelServicesに有効なUUIDが提供されていることを確認してください。", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10008": "メタデータエンベロープの解析に失敗しました: %s, %s", + "ORG_ZSTACK_AI_10032": "nodeRankは[0, %s)の範囲内である必要がありますが、%sを受信しました", + "ORG_ZSTACK_AI_10030": "modelServicesはコンピュートノードと同じzone UUIDを使用する必要があります。", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10003": "ソースファイルパスが無効な引数です", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10004": "提供された暗号化キーでデータの復号化に失敗しました。キーを確認して再試行してください。", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10017": "AliyunNasAccessGroupVO[%s]は存在しません。削除された可能性があります!", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10018": "EcsVSwitchVO[%s]は存在しません。削除された可能性があります!", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10020": "プライマリストorage: %sで操作を実行できる利用可能なホストが見つかりません", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10021": "ホスト[UUID:%s]からAliyun NASプライマリストorage[UUID:%s]へのpingに失敗しました。理由は%sです。このホスト-NAS接続を切断してください。", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10024": "タイプ[%s]のBackupStorageKVMFactoryが見つかりません", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10025": "ボリュームを管理するホストが見つかりません: [%s]", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10023": "NASプライマリストorageがマウントされていません。まず初期化してください!", + "ORG_ZSTACK_AI_10039": "servicePortsは範囲[1,65535]内でなければなりませんが、%sを受信しました", + "ORG_ZSTACK_AI_10037": "serviceLivezは'/'で始まり、スペースを含まず、長さは512文字以内である必要があります。", + "ORG_ZSTACK_AI_10038": "serviceReadyzは/で始まり、スペースを含まず、長さが最大512文字である必要があります", + "ORG_ZSTACK_AI_10035": "無効なフレームワーク: %s、有効な値: EC2, GCE, Azure, OpenStack", + "ORG_ZSTACK_AI_10036": "無効なフレームワーク: %s", + "ORG_ZSTACK_AI_10033": "無効なPCIデバイス識別子: %s", + "ORG_ZSTACK_AI_10034": "nodeRankは一意である必要がありますが、%sが取得されました", + "ORG_ZSTACK_ACL_10001": "%s 重複/重複IPエントリがアクセス制御リストグループ:%sにあります", + "ORG_ZSTACK_AI_10064": "無効なデータセットスキーマ構造: %s", + "ORG_ZSTACK_ACL_10000": "IPバージョン%dをサポートしていません", + "ORG_ZSTACK_AI_10065": "システムプリセットデータセットはAPI呼び出しを介して更新できません。サポートにお問い合わせください。", + "ORG_ZSTACK_AI_10062": "データセットは使用中であり、APIで削除できません。削除を試みる前に、関連するすべてのリソースが终止されていることを確認してください。", + "ORG_ZSTACK_AI_10063": "updateDatasetStructsはnullまたは空にできません。続行前に、データセット構造が適切に定義され入力されていることを確認してください。", + "ORG_ZSTACK_AI_10060": "モデルサービスグループ[UUID: %s]で使用されているため、VMインスタンスを终止できません", + "ORG_ZSTACK_ZSV_COMPUTER_VM_10000": "vm名%sはクラウド環境に既に存在しています", + "ORG_ZSTACK_AI_10061": "アプリケーションインスタンスグループの共有は許可されていません: %s", + "ORG_ZSTACK_ACL_10009": "アクセス制御リストグループ[%s]は既に1つのリダイレクトルールを所持しており、別のものを追加できません", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10028": "マウントパスを確認できる利用可能なコンピューティングリソースがありません!", + "ORG_ZSTACK_ACL_10008": "アクセス制御リストグループ[%s]は既にIPエントリを所持しているため、リダイレクトルールを追加できません", + "ORG_ZSTACK_ACL_10007": "アクセス制御リストグループ[%s]は既にリダイレクトルールを所持しているため、IPエントリを追加できません", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10026": "プライマリでボリュームサイズを同期するホストが見つけられません: %s", + "ORG_ZSTACK_ACL_10006": "アクセス制御リストグループ[%s]は%d IPエントリを超えることはできません", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10027": "イメージ[%s]は削除されており、そこからルートボリュームを再初期化できません", + "ORG_ZSTACK_SCHEDULER_SNAPSHOT_10000": "ルートボリューム[%s]のVMはDestroyed状態にあります。このジョブでは状態変更は許可されていません", + "ORG_ZSTACK_ACL_10005": "アクセス制御リストグループ[%s]は既にリダイレクトルールを所持しているため、IPエントリを追加できません", + "ORG_ZSTACK_ACL_10004": "無効なルール式です。クラウドコンピューティング標準に準拠していることを確認してください(例: %sのプレースホルダの正しい使用方法)。詳細: %s", + "ORG_ZSTACK_ACL_10003": "IP範囲[%s, %s]はアクセス制御リストグループ:%s内で[%s, %s]と重複しています", + "ORG_ZSTACK_ACL_10002": "IP形式はip/iprange/cidrのみサポートしていますが、%sが見つかりました", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10031": "Aliyun NAS PrimaryStorageはimagestore BSのみサポートしています。実際のタイプ: %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10000": "InfoSecEncryptDriver暗号化失敗(リソース: %s)", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10001": "InfoSecEncryptDriver復号失敗(仮想リソース: %s)", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10002": "暗号化データ[%s]または暗号化アルゴリズムタイプ[%s]はnullです", + "ORG_ZSTACK_AI_10068": "モデル評価にはModelServiceType.ModelEvalが必要です", + "ORG_ZSTACK_AI_10069": "モデル評価には、データセットUUIDまたはプロンプトのいずれかが必要です。", + "ORG_ZSTACK_AI_10066": "ModelServiceVOのUUIDは必須です。有効なUUIDを提供してください。", + "ORG_ZSTACK_AI_10067": "serviceTypeを指定する必要があります", + "ORG_ZSTACK_ACL_10012": "url[%s]は有効なクラウドストレージパスではありません", + "ORG_ZSTACK_AI_10053": "アーキテクチャ%sのイメージ[uuid:%s]は無効であり、使用できません", + "ORG_ZSTACK_ACL_10011": "domain[%s]は有効なドメイン名ではありません", + "ORG_ZSTACK_AI_10054": "指定されたアーキテクチャ%sのイメージ[uuid:%s]は利用できず、使用できません", + "ORG_ZSTACK_ACL_10010": "ドメインとURLの両方を空にすることはできません。有効なドメインまたはURLのいずれかを指定してください。", + "ORG_ZSTACK_AI_10051": "アーキテクチャ%sには、仮想マシンイメージID(vmImageUuid)またはコンテナイメージ(dockerImage)の少なくとも1つを指定する必要があります", + "ORG_ZSTACK_AI_10052": "アーキテクチャ%sの無効なイメージUUID: %s", + "ORG_ZSTACK_AI_10050": "アーキテクチャイメージマッピングにおける無効なCPUアーキテクチャタイプ: %s、サポートされるタイプ: %s", + "ORG_ZSTACK_AI_10059": "データセットメッセージのデータタイプのバリエーションが多すぎます: %s、単一タイプに減らしてください", + "ORG_ZSTACK_AI_10057": "データタイプと使用シナリオを指定せずにデータセットを作成することは、クラウドコンピューティング環境では許可されていません。データセットの詳細を提供してください。", + "ORG_ZSTACK_AI_10058": "データセットを追加する際には、少なくとも1つのデータセットデータタイプを指定する必要があります", + "ORG_ZSTACK_AI_10055": "アーキテクチャイメージマッピングで重複するCPUアーキテクチャが指定されています: %s", + "ORG_ZSTACK_AI_10056": "アーキテクチャイメージは空にできません", + "ORG_ZSTACK_VMWARE_10101": "%sのストレージ一覧取得に失敗しました", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10051": "LUN名は必須ですが、nullが渡されました。有効なLUN名を指定してください。", + "ORG_ZSTACK_VMWARE_10102": "VirtualMachineのデータストアが見つかりません: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10054": "ボリューム%sのスナップショット取得に失敗しました。ID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10053": "lun:%sのスナップショット取得に失敗しました", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10012": "SFTPバックアップストレージはイメージハッシュの計算をサポートしていません。", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10050": "イニシエータ[%s]はXStorに既に存在しており、ホスト[%s]に接続されていません。イニシエータ名が一意であることを確認してください。", + "ORG_ZSTACK_ALIYUN_NETWORK_10020": "実行中または停止状態にあるEC2インスタンスのみがEIPをアタッチできますが、ECS [%s]は現在[%s]状態です。", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10016": "イメージメタデータファイルの作成に失敗しました: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10017": "イメージメタデータファイルのチェックに失敗しました: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10018": "イメージメタデータファイル: %sが存在しません", + "ORG_ZSTACK_ZWATCH_ALARM_10022": "アラーム[uuid:%s]に対して重複するアクション[uuid:%s, type:%s]があります", + "ORG_ZSTACK_ZWATCH_ALARM_10021": "アクション[uuid:%s, type:%s]はクラウドコンピューティング環境に見つかりません", + "ORG_ZSTACK_ZWATCH_ALARM_10020": "アクションタイプ[%s]が無効です", + "ORG_ZSTACK_ZWATCH_ALARM_10026": "重複するキー[%s]が異なる値{%s}を持っています", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10170": "共有ロードバランササーバーグループ%sにサーバーIPを追加できませんでした", + "ORG_ZSTACK_ZWATCH_ALARM_10025": "メトリクスに、指定されたラベル[%s]がありません", + "ORG_ZSTACK_ZWATCH_ALARM_10023": "UUID [uuid:%s]のアラームに重複するラベルが定義されています", + "ORG_ZSTACK_ZWATCH_ALARM_10029": "メトリクス[%s]は管理者向けに制限されており、現在のユーザーロールでは利用できません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10171": "vmincsとサーバーIPがnullのため、バックエンドサーバーを変更できませんでした", + "ORG_ZSTACK_ZWATCH_ALARM_10028": "名前空間[%s]にはメトリクス[%s]が含まれていません", + "ORG_ZSTACK_ZWATCH_ALARM_10027": "名前空間[%s]はサポートされていません", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10049": "LUN IDが無効です。クラウドストレージデバイスの必要なフォーマットと値に準拠していることを確認してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10048": "LUNマッピングIDは必須であり、nullまたは0にすることはできません。有効なLUNマッピングIDを提供してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10045": "ボリュームマッピングの取得に失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10044": "LUN %sのセッション状態の確認に失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10047": "LUNマッピングIDを取得する方法がないため、操作に失敗しました。", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10046": "LUN %sの残りの作成済みLUN数の取得に失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10041": "スナップショットIDは必須ですが、取得しました:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10040": "インスタンス %sのスナップショットのクエリに失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10043": "スナップショット:%sへの復帰に失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10020": "SFTPバックアップストレージ%sのボリュームテンプレートを作成するには、VMを停止してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10042": "スナップショット %sの削除に失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10023": "バックアップストレージが重複しています。SFTPバックアップストレージ[hostname:%s]が既に存在しています", + "ORG_ZSTACK_LICENSE_CUBE_10000": "ライセンス検証のソースコードコンテキストをnullにすることはできません。有効なコンテキスト文字列を提供してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10038": "ストレージプール %sの取得に失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10037": "lun %sの削除に失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10039": "ボリューム %sのスナップショット作成に失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10034": "lunマッピングIDは必須ですが、取得しました:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10033": "lun %sをホストグループ%sにマッピングできませんでした。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10036": "lun IDは必須ですが、取得しました:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10035": "lunマッピング %sの削除に失敗しました。理由: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_10004": "ECSインスタンス[%s]が存在しません。確認してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10001": "%sはイメージストアバックアップストレージ[hostname:%s, path: %s]からローカルプライマリストレージ[uuid:%s, path: %s]への仮想マシンビットのダウンロードに失敗しました、%s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10002": "ローカルストレージ[uuid:%s, path:%s]からイメージストア[hostname:%s]へのビットアップロードに失敗しました、%s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10020": "l3ネットワーク%sとVPC %sは既に接続されています。確認してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10000": "ソースVMにはホスト[UUID: %s]にローカルデータボリュームがありますが、fast clone APIはVMをホスト[%s]にクローンしようとしました。これはfast clone機能ではサポートされていません。", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10000": "AutoScalingRuleSchedulerJobTriggerVO[UUID:%s]は%s状態にあります。状態変更は許可されていません", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10001": "AutoScalingRuleSchedulerJobTriggerVO[uuid:%s]はクールダウン期間中です", + "ORG_ZSTACK_ALIYUN_NETWORK_10008": "仮想ボーダー:%sは終了されました", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10002": "AutoScalingRuleVO[uuid:%s]は%s状態にあります。状態遷移は許可されていません", + "ORG_ZSTACK_ALIYUN_NETWORK_10005": "実行中または停止状態のECSインスタのみがEIPをデタッチできますが、現在のECS [%s]の状態は[%s]です。", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10018": "CpeIpはIPv4アドレスである必要がありますが、現在%sです", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10017": "このクラウド環境では管理ユーザーのみが接続を確立できます。", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10019": "cpeIpは有効なIPv4アドレスである必要があります", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10000": "SftpBackupStorageはURL[%s]内のscheme[%s]をサポートしていません", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10014": "%sの仮想マシンバックアップが見つかりません", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10013": "%sの仮想マシンが見つかりません", + "ORG_ZSTACK_ALIYUN_NETWORK_10010": "宛先CIDR [%s]は既に存在しており、別のインスタンスID [%s]を指しています。確認するか、まず削除してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10061": "イメージキャッシュLUN情報の取得に失敗しました", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10016": "サポートされていないインスタンスタイプです:%s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10003": "イメージのダウンロードキャンセルに失敗しました。原因是%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10060": "新しいイメージキャッシュの準備がされていません。しばらく待ってから再試行してください。", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10015": "%sのネットワークが見つかりません", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10004": "SFTPバックアップストレージエージェントのUUIDが変更されました[予想:%s、実際の:%s]。これはエージェントの手動再起動による可能性があります。ステータスを同期するには再接続を発行してください。", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10010": "L3ネットワーク:%sのCIDRが見つかりません", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10012": "%sの仮想プライベートネットワークが見つかりません", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10059": "ボリュームが見つかりません:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10055": "XSStorクラスターが異常です、クラスター情報[clusterDataState: %s, clusterHealthyState: %s, clusterRunningState: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10058": "指定されたLUN IDが無効です", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10057": "ホスト%sとのLUN %sのセッションが仮想化環境でアクティブではありません。", + "ORG_ZSTACK_HYBRID_NETWORK_10027": "cidrは別のvswitchと重複しています:%s", + "ORG_ZSTACK_HYBRID_NETWORK_10028": "無効なCIDRブロックです:%sは'10.0.0.0/8'、'172.16.0.0/12'、または'192.168.0.0/16'の範囲内である必要があります", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10010": "インスタンス%sの終了に失敗しました。理由: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10009": "レイヤー3ネットワークの仮想ネットワークインターフェースが見つかりません: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10029": "そのような仮想ボーダールーターは存在しません: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10003": "カスタムCIDR [%s]はVBR [%s]に既に存在しており、ターゲットCIDR [%s]と重複しています。まず確認して削除してください。", + "ORG_ZSTACK_HYBRID_NETWORK_10020": "ネクストホップのルーターインターフェースは%sに属していますが、エントリは%sに属しています", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10001": "Vbr: [%s]は接続を確立中です。しばらくお待ちください...", + "ORG_ZSTACK_HYBRID_NETWORK_10021": "そのような仮想プライベートゲートウェイは存在しません: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10000": "カスタムCIDR [%s]は仮想ルーター [%s]に既に存在しており、ターゲットCIDR [%s]と重複しています。まず確認して削除してください。", + "ORG_ZSTACK_HYBRID_NETWORK_10022": "ルートエントリ作成用のネクストホップタイプ [%s]はサポートされていません!", + "ORG_ZSTACK_HYBRID_NETWORK_10024": "仮想ボーダールーターはネクストホップタイプとしてルーターインターフェースのみをサポートします", + "ORG_ZSTACK_HYBRID_NETWORK_10026": "vSwitchのCIDR [%s]はVPCのCIDR [%s]の範囲内にありません", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10008": "インスタンス%sをホストグループ%sに追加失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10005": "アクセスゾーンのサブネットの取得に失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10004": "アクセスゾーンの同期に失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10007": "インスタンス%sの照会に失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10006": "全インスタンスの照会に失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10001": "イニシエーター: %sのホストへの追加に失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10000": "XStorデバイスでの認証に失敗しました: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10002": "LUN: %sから%sへのコピーに失敗しました。理由: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10038": "eip[%s]とecs[%s]は同一のアベイラビリティゾーンに存在する必要があります", + "ORG_ZSTACK_VMWARE_10135": "ZStack UUIDをVCenter Managed Entityへの設定に失敗しました[name:%s, mor:%s]。理由: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10039": "eipのデタッチに失敗しました: [%s]。インスタンスにアタッチされていません", + "ORG_ZSTACK_VMWARE_10132": "データディスク %sにユニット番号が利用できません", + "ORG_ZSTACK_VMWARE_10133": "distributedSwitch [%s]のdvPortGroup作成に失敗しました: %s", + "ORG_ZSTACK_VMWARE_10130": "ボリューム[%s]の削除に失敗しました: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10030": "そのような仮想ルーターは存在しません: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10031": "localGatewayはIPv4アドレスではありません: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10032": "peerGatewayは有効なIPv4アドレスではありません: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10033": "peerGatewayは有効なサブネットマスクではありません: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10034": "vlanIdは数値である必要があります: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10035": "EIP を ECS [%s] にアタッチできませんでした: EIP [%s] はすでに ECS [%s] にアタッチされています", + "ORG_ZSTACK_HYBRID_NETWORK_10036": "ECS [%s] はすでにパブリック IP アドレスを持っています", + "ORG_ZSTACK_HYBRID_NETWORK_10037": "ECS [%s] に EIP [%s] をアタッチできませんでした。ECS はすでに EIP に関連付けられています", + "ORG_ZSTACK_SSO_SERVICE_10014": "ユーザー %s の仮想 ID が存在しません", + "ORG_ZSTACK_VMWARE_10129": "仮想ディスクマネージャーサービスを利用できません。サービスが実行中かどうかを確認するか、サポートにお問い合わせください。", + "ORG_ZSTACK_SSO_SERVICE_10011": "response にエラーがあります: ソースファイルがクラウドストレージシステムに見つかりません。ファイルパスを確認し、仮想化環境に正しくアップロードされていることを確認してください。", + "ORG_ZSTACK_SSO_SERVICE_10010": "redirectUrl が無効です: %s", + "ORG_ZSTACK_VMWARE_10128": "データストアのデータセンターが見つかりません。%s", + "ORG_ZSTACK_SSO_SERVICE_10013": "ユーザー %s のアカウントが存在しません", + "ORG_ZSTACK_SSO_SERVICE_10012": "SSO クライアント [UUID: %s] のユーザー情報マッピング構成の生成に失敗しました: カスタム属性マッピングが定義されていません。", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10030": "ホストグループ %s の LUN マッピングのクエリに失敗しました: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10005": "ルーターインターフェースは同一データセンター内である必要がありますが、ri[%s] は dc[%s] にあり、ri[%s] は dc[%s] にあります", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10032": "クラスター情報の取得に失敗しました: %s", + "ORG_ZSTACK_VMWARE_10121": "%s の dvPortGroup の作成に失敗しました", + "ORG_ZSTACK_HYBRID_NETWORK_10007": "ルーターインターフェース[%s] はアイドル状態ではありません。現在のステータスは %s です", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10031": "LUN マッピング %s のクエリに失敗しました: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10009": "ルーターインターフェース[%s] にはすでにアクティブな接続があります。それは %s です", + "ORG_ZSTACK_VMWARE_10120": "vCenter [%s] に dvSwitch [%s] が見つかりません。dvSwitch が存在し、正しく構成されていることを確認してください。", + "ORG_ZSTACK_GUESTTOOLS_10009": "ホスト [UUID:%s] 用の適切なゲスト OS ツール ISO が管理ノード [UUID:%s] に見つかりません。", + "ORG_ZSTACK_GUESTTOOLS_10007": "VM[uuid:%s] の最新のゲストツールを取得できません。それは実行中ではないか、ボリューム回復中のためです。", + "ORG_ZSTACK_ZWATCH_ALARM_10000": "イベントサブスクリプション [uuid:%s] が見つかりません。削除または取り消された可能性があります", + "ORG_ZSTACK_GUESTTOOLS_10008": "VM[UUID:%s] の最新のゲストツールを取得できません。これはユーザー管理 VM ではありません", + "ORG_ZSTACK_GUESTTOOLS_10005": "仮想マシン[uuid:%s] の qgaStateChange に失敗しました", + "ORG_ZSTACK_GUESTTOOLS_10006": "VM [uuid:%s] の最新のゲストツールを取得できません。そのハイパーバイザータイプはサポートされていません", + "ORG_ZSTACK_GUESTTOOLS_10004": "qga ファイルのアップロードに失敗しました[%s]", + "ORG_ZSTACK_GUESTTOOLS_10001": "VM-%s でエラーが発生しました: %s", + "ORG_ZSTACK_ZWATCH_ALARM_10002": "メトリック[%s] のリピート間隔の値は 1 時間より小さくできません", + "ORG_ZSTACK_GUESTTOOLS_10002": "仮想 machine-%s へのファイルのアップロードに失敗しました: %s", + "ORG_ZSTACK_ZWATCH_ALARM_10001": "アラーム[uuid:%s] が見つかりません。削除または期限切れの可能性があります", + "ORG_ZSTACK_SSO_SERVICE_10008": "クラウド環境構成にトークン %s が存在しません。確認して再入力してください。", + "ORG_ZSTACK_AI_10109": "モデルセンター [uuid: %s] インスタンスが見つかりません", + "ORG_ZSTACK_SSO_SERVICE_10007": "Keycloakへの管理者資格情報のアップロードに失敗しました。クラウドデプロイメントのために、必要な権限とネットワーク構成が正しく設定されていることを確認してください。", + "ORG_ZSTACK_ZWATCH_ALARM_10007": "イベントサブスクリプションには既にラベル[%s]が含まれています", + "ORG_ZSTACK_AI_10107": "モデルサービスインスタンスグループ[uuid: %s]内で、ノードランク0のモデルサービスインスタンス(プライマリ)が見つかりません", + "ORG_ZSTACK_ZWATCH_ALARM_10006": "イベントにラベル[%s]が含まれていません", + "ORG_ZSTACK_SSO_SERVICE_10009": "%s データタイプはクラウドコンピューティング環境でサポートされていません", + "ORG_ZSTACK_AI_10108": "モデルサービスインスタンスグループ %s はクラウド環境に見つかりません", + "ORG_ZSTACK_ZWATCH_ALARM_10005": "UUID [%s] のアクションは、UUID [%s] のイベントサブスクリプションに既に関連付けられています。", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10027": "LUN名 %s の作成に失敗しました、エラーメッセージ: %s", + "ORG_ZSTACK_SSO_SERVICE_10004": "IdPメタデータURLが必要です。%s", + "ORG_ZSTACK_AI_10105": "モデルサービスのデプロイは成功しましたが、モデルサービスインスタンスのUUIDが欠落しています。インスタンス構成を確認してください。", + "ORG_ZSTACK_SSO_SERVICE_10003": "無効な認証エンドポイントURL: %s", + "ORG_ZSTACK_AI_10106": "モデルサービスインスタンスのUUIDが空です。モデルサービスインスタンスを処理できません。UUIDが提供されていることを確認してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10029": "LUNマッピング情報を照会する際にはLUN IDが必須です。", + "ORG_ZSTACK_SSO_SERVICE_10006": "無効なアイデンティティプロバイダーメタデータ: %s", + "ORG_ZSTACK_AI_10103": "モデルサービスインスタンスグループ [UUID: %s] が見つかりません。サービス実行のリソース作成をスキップしています", + "ORG_ZSTACK_VMWARE_10118": "ホスト %s のポートグループ作成に失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10028": "LUN %s の照会に失敗しました。理由: %s", + "ORG_ZSTACK_AI_10104": "モデルサービスのデプロイreplyは成功しましたが、モデルサービスインスタンスグループ[uuid: %s] が仮想マシンインスタンスプールに見つかりません", + "ORG_ZSTACK_VMWARE_10119": "ホスト %s のポートグループ作成に失敗しました", + "ORG_ZSTACK_AI_10101": "モデルサービスインスタンスグループ[uuid: %s] のモデルストレージバックエンドが見つかりません", + "ORG_ZSTACK_VMWARE_10116": "ポートグループ[%s]はホスト[%s]に既に存在していますが、別のVLAN ID(%d)が付与されています", + "ORG_ZSTACK_AI_10102": "モデルサービスインスタンス識別子の割り当てに失敗しました。理由: %s", + "ORG_ZSTACK_VMWARE_10117": "ポートグループ[%s]はホスト[%s]に既に存在します。新しいポートグループを別の名で作成するか、既存のポートグループを手動で削除してクラスタに再接続してください。", + "ORG_ZSTACK_SSO_SERVICE_10002": "SSOクライアントはアイデンティティタイプ [%s] ではありません。push操作は許可されていません。", + "ORG_ZSTACK_VMWARE_10114": "dvSwitch名 [%s] は一意ではありません", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10024": "LUN名 %s の作成に失敗しました。原因を特定できません", + "ORG_ZSTACK_SSO_SERVICE_10001": "UUID [%s] のSSOクライアントが存在しません。", + "ORG_ZSTACK_AI_10100": "モデルサービスインスタンスグループ[uuid: %s] のモデルサービスUUIDがnullです", + "ORG_ZSTACK_VMWARE_10115": "ホスト[%s:%s] がvCenterインベントリに見つかりません", + "ORG_ZSTACK_VMWARE_10112": "dvSwitchのリスト取得が失敗しました: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10016": "%s は有効なCIDRブロックではありません", + "ORG_ZSTACK_VMWARE_10113": "vCenterクラスタ[%s]名の取得に失敗しました", + "ORG_ZSTACK_HYBRID_NETWORK_10017": "同じパラメータを持つセキュリティグループルールが既に存在します。新しいルールを作成するには、既存ルールを変更または削除してください。", + "ORG_ZSTACK_VMWARE_10110": "VMのゲストツールがインストールされていないか、実行されていません: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10018": "dstCidrBlock[%s] は有効なIPv4またはIPv6アドレス範囲ではありません", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10020": "LUN名の更新に失敗しました: %s、エラーメッセージ: %s", + "ORG_ZSTACK_VMWARE_10111": "仮想マシンへのファイルアップロードに失敗しました: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10019": "そのようなECSインスタンスは存在しません: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10010": "仮想ルーターがVBRタイプの場合、accessPointUuidはnullにできません。", + "ORG_ZSTACK_HYBRID_NETWORK_10011": "VirtualBorderRouterVOにそのようなルーターUUID[%s]が見つかりません", + "ORG_ZSTACK_GUESTTOOLS_10018": "VM[UUID:%s]を移行できませんでした。vfNicがアタッチされていますが、ゲストツールが実行されていません", + "ORG_ZSTACK_ZWATCH_ALARM_10011": "イベント[%s]にラベル[%s]が不足しています", + "ORG_ZSTACK_HYBRID_NETWORK_10012": "VpcVirtualRouterVOにルーターUUID[%s]が見つかりません", + "ORG_ZSTACK_GUESTTOOLS_10019": "ゲストツールが実行されていないため、L3ネットワークをVM [UUID:%s]にアタッチできませんでした。", + "ORG_ZSTACK_ZWATCH_ALARM_10010": "名前空間[%s]にはイベント[%s]が含まれていません", + "ORG_ZSTACK_HYBRID_NETWORK_10013": "サポートされていないルータータイプです: %s", + "ORG_ZSTACK_GUESTTOOLS_10016": "VF NIC [UUID:%s]が見つからないため、VF NIC HA状態を変更できませんでした", + "ORG_ZSTACK_HYBRID_NETWORK_10014": "システムレベルの仮想マシンエントリを削除できません", + "ORG_ZSTACK_GUESTTOOLS_10017": "ゲストツールが実行されていないため、高可用性用の仮想ネットワークインターフェースカードの状態を変更できませんでした。この操作を再度実行する前に、ゲストツールがインストールされ実行されていることを確認してください。", + "ORG_ZSTACK_HYBRID_NETWORK_10015": "VPCでは内部アクセスボックスのみサポートしています", + "ORG_ZSTACK_GUESTTOOLS_10014": "スクリプトには、対応するパラメータのないプレースホルダー%sが含まれています。クラウドコンピューティング環境の適切な構成を確保するため、runtimeParamsを使用してこれらのプレースホルダーの値を提供してください。", + "ORG_ZSTACK_ZWATCH_ALARM_10015": "メトリック[name:%s]ではPeriodフィールドはサポートされていません", + "ORG_ZSTACK_GUESTTOOLS_10015": "VM [UUID:%s]がVF Nicに接続されていますが、ゲストツールが実行されていないため、プライマリストレージを移行できませんでした", + "ORG_ZSTACK_ZWATCH_ALARM_10014": "メトリック[name:%s]ではPeriodフィールドをnullにできません", + "ORG_ZSTACK_GUESTTOOLS_10012": "encodingTypeとscriptContentは、クラウド展開設定において両方存在するか、両方存在しないかのいずれかである必要があります。", + "ORG_ZSTACK_ZWATCH_ALARM_10013": "指定されたクラウド名前空間レジストリに名前空間[%s]が見つかりません", + "ORG_ZSTACK_GUESTTOOLS_10013": "無効なrenderParams形式です。キーと値のペアの有効なJSON配列である必要があります。例: [{\\\"key\\\":\\\"k1\\\",\\\"value\\\":\\\"v1\\\"}]。エラー: %s", + "ORG_ZSTACK_GUESTTOOLS_10010": "ホスト[uuid:%s]でのゲストツールの確認に失敗しました", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10019": "パスによるLUNのクエリに失敗しました: %s、エラーメッセージ: %s", + "ORG_ZSTACK_GUESTTOOLS_10011": "VM UUIDの設定に失敗しました: %s NAME: %s ホスト名。原因: QEMU Guest Agentが実行されていないか、DHCPサービスが存在しません", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10016": "ホストグループの追加に失敗しました: %s、エラーメッセージ: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10015": "ホストグループのクエリに失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10017": "LUNのクエリに失敗しました: %s、エラーメッセージ: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10012": "ホストグループ%sの削除に失敗しました。理由: %s", + "ORG_ZSTACK_VMWARE_10105": "コンピュートホスト%sのリソースプールが見つかりません", + "ORG_ZSTACK_VMWARE_10106": "ホスト%sのリソースプールの検索に失敗しました", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10014": "イニシエーター%sの削除に失敗しました。理由: %s", + "ORG_ZSTACK_VMWARE_10103": "ESX VM UUID [%s:%s]の設定に失敗しました。理由: [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10013": "ホスト識別子是必須ですが、取得できませんでした: %s", + "ORG_ZSTACK_VMWARE_10104": "テンプレート[%%s]はクラウドテンプレートリポジトリに見つかりません", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10029": "UUID: %sのビルドレススタンスが見つからないか、削除中のステータスです", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10028": "イメージ[%s]のUUIDが見つかりません", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10027": "imageStoreがクラウドストレージサービスに接続されていません。クラウドストレージサービスが正しく構成されていることを確認し、再試行してください。", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10026": "imageStoreが有効化されていません。クラウド環境設定でimageStoreが構成され、有効化されていることを確認してください。", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10024": "ビルドアプリケーション[%s]が見つかりません", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10022": "ビルドシステム[UUID: %s]がコンピュートゾーン[UUID: %s]にアタッチされていません", + "ORG_ZSTACK_CONTAINER_10040": "利用可能なクラスターへのデプロイ作成に失敗しました。試行したクラスター数: %d、详细信息: %s", + "ORG_ZSTACK_FLOWMETER_10013": "%sとのCollectorの重複があります", + "ORG_ZSTACK_FLOWMETER_10014": "クラウドリソースプロビジョニング要求に指定されたパラメータがありません。%sを指定してください。", + "ORG_ZSTACK_FLOWMETER_10015": "[%s]はIPアドレス形式に準拠していません", + "ORG_ZSTACK_FLOWMETER_10016": "FlowCollector[%s]は存在しません", + "ORG_ZSTACK_GUESTTOOLS_10029": "VM [uuid:%s]からゲストツール情報を取得できません。VMが実行されていないためです", + "ORG_ZSTACK_CONTAINER_10043": "クラウドサービスのクエリに失敗しました: %s、理由: %s", + "ORG_ZSTACK_FLOWMETER_10017": "FlowMeter[%s]は存在しません", + "ORG_ZSTACK_FLOWMETER_10018": "FlowMeter[%s]はIPv6バージョン[%s]をサポートしていません", + "ORG_ZSTACK_GUESTTOOLS_10027": "VM [UUID:%s]にゲストツールISOをアタッチできません。ユーザVMではないためです", + "ORG_ZSTACK_CONTAINER_10045": "サービスの作成に失敗しました。理由: %s", + "ORG_ZSTACK_FLOWMETER_10019": "Collector [%s %d]は%sと重複しています", + "ORG_ZSTACK_GUESTTOOLS_10028": "VM [uuid:%s]にゲストツールISOをアタッチできません。CDROMデバイスがないためです", + "ORG_ZSTACK_CONTAINER_10037": "コンテナ化されたクラスタが見つかりません。詳細についてはNativeClusterVOを確認してください。", + "ORG_ZSTACK_GUESTTOOLS_10025": "ハイパーバイザタイプがサポートされていないため、VM [uuid:%s] にゲストツールISOを接続できません", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10057": "ipmitoolを使用してベアメタルシャーシ[uuid:%s]をシャットダウンできませんでした", + "ORG_ZSTACK_GUESTTOOLS_10026": "VM [UUID:%s] が実行されていないため、ゲストツールISOを接続できません", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10058": "bmエージェント経由でベアメタルインスタンス[uuid:%s]をシャットダウンできませんでした。理由: %s", + "ORG_ZSTACK_GUESTTOOLS_10023": "ゲストツールのバージョンがこの機能するには低すぎるため、vm[uuid:%s]のネットワーク設定に失敗しました", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10059": "baremetal2シャーシ[uuid:%s]は%d秒後もまだ電源がオフになっていません", + "ORG_ZSTACK_GUESTTOOLS_10024": "ゲストツールが実行されていないため、vm[uuid:%s]のネットワーク設定に失敗しました", + "ORG_ZSTACK_GUESTTOOLS_10021": "ホスト名で競合が検出されました。UUID [%s]の別のVMがUUID [%s]のL3ネットワーク上で既にホスト名 [%s]を使用しています", + "ORG_ZSTACK_GUESTTOOLS_10022": "仮想マシンが実行されていないため、vm[uuid:%s]のネットワーク設定に失敗しました", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10054": "ゲートウェイ[uuid:%s]経由でベアメタル2インスタンス[uuid:%s]への接続を確立できませんでした。理由: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10055": "ゲートウェイ[uuid:%s]経由でベアメタルインスタンス[uuid:%s]のパスワードを変更できませんでした。理由: %s", + "ORG_ZSTACK_GUESTTOOLS_10020": "VMホスト名を設定できません。VM [UUID:%s]にはデフォルトのレイヤー3ネットワークがありません", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10056": "ipmitoolを使用してベアメタルシャーシ[uuid:%s]の電源を入れることができませんでした", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10021": "ビルドシステム[%s]が見つかりません", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10020": "ビルドシステム[UUID: %s]がゾーン[UUID: %s]にアタッチされました", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10050": "ゲートウェイ[uuid:%s]内のベアメタルインスタンス[uuid:%s]のコンソールプロキシを作成できませんでした。理由: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10051": "ベアメタルインスタンス[uuid:%s]のデフォルトネットワークをl3[uuid:%s]からl3[uuid:%s]に切り替えることができませんでした。理由: %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10018": "appId[%s:%s]が別のBuildAppインスタンスによって重複しているため、BuildAppの追加に失敗しました", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10017": "接続の問題により、ローカルストレージビルドシステム[url: %s]に接続できません", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10016": "appId[%s]が別のBuildAppによって重複しているため、BuildAppの作成に失敗しました", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10015": "ビルドシステムが「停止」状態のため、ビルドアプリケーションは無効になっています。アプリケーションを有効にするには、ビルドシステムを起動してください。", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10014": "rest call %sが失敗しました。理由: %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10013": "ビルドアプリは%s状態にあり、現在の操作はサポートされていません", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10012": "UUID[%s]のビルドアプリケーションが見つかりません", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10011": "ビルドシステムが%s状態のため、操作を実行できません", + "ORG_ZSTACK_CONTAINER_10031": "デプロイメントが見つかりません: %s", + "ORG_ZSTACK_FLOWMETER_10003": "ネットワーク[%s]はフローメーター[%s]に統合されています", + "ORG_ZSTACK_FLOWMETER_10004": "仮想ルーターは既に別のフローメーターに追加されています。重複していないことを確認してください。", + "ORG_ZSTACK_FLOWMETER_10005": "無効なタイプパラメータは%sであり、有効な範囲%sからである必要があります", + "ORG_ZSTACK_CONTAINER_10032": "デプロイのパッチ適用に失敗しました:%s", + "ORG_ZSTACK_CONTAINER_10034": "デプロイの置換に失敗しました:%s", + "ORG_ZSTACK_CONTAINER_10026": "サービスの削除に失敗しました:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10046": "ゲートウェイ[uuid:%s]でプロビジョニングネットワークを破棄できませんでした:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10047": "ベアメタルインスタンス[uuid:%s]のプロビジョニング済みNICが見つかりません", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10048": "ゲートウェイ[uuid:%s]でベアメタルインスタンス[uuid:%s]のプロビジョニング設定を作成できませんでした:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10049": "ゲートウェイ[uuid:%s]でベアメタルインスタンス[uuid:%s]のプロビジョニング設定を削除できませんでした:%s", + "ORG_ZSTACK_IMAGEREPLICATOR_10000": "ターゲットバックアップストレージ[uuid:%s]が使用できなくなりました", + "ORG_ZSTACK_GUESTTOOLS_10032": "VM[uuid:%s]は削除されているため、ゲストツールの状態を更新できません", + "ORG_ZSTACK_ALIYUN_OSS_10002": "AWSアクセスキーID、シークレットアクセスキー、リージョンは同時に設定する必要があります。", + "ORG_ZSTACK_CONTAINER_10029": "APIエラー:ソースファイルがクラウドストレージシステムに見つかりません。ファイルパスを確認し、再試行してください。", + "ORG_ZSTACK_IMAGEREPLICATOR_10001": "1つ以上のバックアップストレージ[uuids:%s]がレプリケーショングループ[uuid:%s]に追加されました。", + "ORG_ZSTACK_ALIYUN_OSS_10003": "OSSバケットが空ではありません!操作を続行する前にバケットが空であることを確認してください。", + "ORG_ZSTACK_GUESTTOOLS_10030": "VM[UUID:%s]からゲストツール情報を取得できません。これはユーザVMではありません", + "ORG_ZSTACK_ALIYUN_OSS_10000": "ossBucket [%s]はデータセンター[%s]に既に登録されています", + "ORG_ZSTACK_GUESTTOOLS_10031": "デバッグパラメータが無効です:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10045": "ゲートウェイ[uuid:%s]でプロビジョニングネットワークを準備できませんでした:%s", + "ORG_ZSTACK_ALIYUN_OSS_10001": "OssBucket[%s]は関連付けられていません。", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10010": "エクスポートIDとビルドアプリケーションUUIDの両方が設定されていますが、一致しません。%sと%dの値を確認してください。", + "ORG_ZSTACK_IMAGEREPLICATOR_10002": "バックアップストレージ[uuids:%s]はImageStoreInstanceタイプではありません", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10040": "イメージデータのローカルディスクへの変換に失敗しました。十分なストレージリソースと正しい権限があることを確認してください。問題が解決しない場合は、イメージ管理にオブジェクトストレージサービスの使用を検討してください。", + "ORG_ZSTACK_IMAGEREPLICATOR_10003": "バックアップストレージ[UUIDs:%s]はどのゾーンにも関連付けられていません", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10041": "ベアメタル2インスタンス[uuid:%s]のボリューム変換がシャーシ[uuid:%s]で失敗しました。%d分後にタイムアウト", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10035": "ボリューム[uuid:%s]のiSCSIターゲットIQNまたはゲートウェイIPをプライマリストレージ[uuid:%s]から取得できませんでした", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10037": "シャーシ:%sのディスクにはWWN情報がありません。シャーシを検査して再試行してください", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10031": "ゲートウェイ[uuid:%s]を通じてベアメタルインスタンス[uuid:%s]からプロビジョニング済みNICをボンディングから切り離せませんでした:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10032": "ベアメタル2インスタンス[uuid:%s]は接続されていないため、プロビジョニング済みNICをボンディングに接続できません。", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10033": "ゲートウェイ[uuid:%s]を通じてベアメタルインスタンス[uuid:%s]にプロビジョニング済みNICをボンディングに接続できませんでした:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10030": "ベアメタル2インスタンス[uuid:%s]は接続されていないため、プロビジョニングNICをボンディング構成から切り離すことができません。", + "ORG_ZSTACK_CONTAINER_10051": "アカウント[uuid:%s]のKubernetesクライアントの取得に失敗しました", + "ORG_ZSTACK_CONTAINER_10050": "クラスタ %s のKubernetes設定が空です", + "ORG_ZSTACK_CONTAINER_10052": "kube configファイルの内容を利用できません: %s", + "ORG_ZSTACK_CORE_PROGRESS_10000": "パラメータapiId[%s]はクラウドサービス設定において有効なUUIDではありません。", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10029": "ベアメタルインスタンス[uuid:%s]のゲートウェイ[uuid:%s]で、ボリュームをシャーシローカルディスク設定に変換する削除に失敗しました", + "ORG_ZSTACK_CONTAINER_10056": "UUID: %s のコンテナバックアップストレージが見つかりません", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10024": "プロビジョニングIP %s はゲートウェイ %s に接続できないため利用できません。詳細エラー:%s", + "ORG_ZSTACK_CONTAINER_10047": "サービス[%s]のステータスバンドルの取得に失敗しました", + "ORG_ZSTACK_CONTAINER_10049": "指定されたクラスタID: %s でクラスタが見つかりません", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10027": "ベアメタルインスタンス[uuid:%s]のゲートウェイ[uuid:%s]でシャーシの検査に失敗しました。理由:%s", + "ORG_ZSTACK_STORAGE_CBT_10020": "予期しないVM[UUID: %s]の状態: %s、想定されるVMの状態は実行中(Running)です。", + "ORG_ZSTACK_STORAGE_CBT_10021": "VM [UUID: %s] は既にバックアップタスクを作成しているため、CBTタスクの有効化を同時に許可することはできません。", + "ORG_ZSTACK_STORAGE_CBT_10016": "VM %s に対してハイパーバイザタイプが指定されていません", + "ORG_ZSTACK_STORAGE_CBT_10017": "設定されたクラウドストレージプロバイダにタイプ[%s]のCBTBackupFactoryが見つかりません", + "ORG_ZSTACK_STORAGE_CBT_10014": "VM [uuid: %s] は既にタスク: %s によって保護されています", + "ORG_ZSTACK_STORAGE_CBT_10015": "cbtボリュームの作成に失敗しました。詳細: %s", + "ORG_ZSTACK_STORAGE_CBT_10018": "CVMタスクが見つかりません[uuid: %s]", + "ORG_ZSTACK_STORAGE_CBT_10019": "Cbtタスク [UUID: %s] は既に有効です。無効化してください。", + "ORG_ZSTACK_CONTAINER_10000": "コンテナバックアップストレージは指定されたフォーマット %s をサポートしていません", + "ORG_ZSTACK_CONTAINER_10002": "エンドポイント[%s]のアベイラビリティゾーンが見つかりません", + "ORG_ZSTACK_IAM2_RBAC_10006": "このクラウド環境では操作[%s]が拒否されています", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10008": "tfコントローラから仮想ネットワーク[uuid:%s]の取得に失敗しました", + "ORG_ZSTACK_IAM2_RBAC_10001": "プロジェクトがセキュリティグループの強制使用を必要とするため、仮想マシン操作にはシステムタグが必須です。", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10009": "tfコントローラでのtf l2ネットワーク[name:%s]の更新に失敗しました", + "ORG_ZSTACK_IAM2_RBAC_10000": "l3ネットワーク [uuid:%s] がコンピュートクラスタに接続されていないため、VMインスタンスの作成に失敗しました", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10006": "tfコントローラでのtf L2ネットワーク[name:%s]の作成に失敗しました", + "ORG_ZSTACK_IAM2_RBAC_10003": "プロジェクト[uuid:%s]は廃止済みであり、すべての操作が拒否されます。", + "ORG_ZSTACK_IAM2_RBAC_10002": "アカウント[uuid:%s]のプロジェクトが存在しません", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10005": "Terraformコントローラでのプロジェクト[uuid:%s]の取得に失敗しました", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10002": "TensorFlowコントローラでのデフォルトドメインの取得に失敗しました。%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10003": "ZStack Admin用のTFプロジェクトをTFコントローラ上に作成できませんでした", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10000": "指定された名前のSDN Controllerは既に存在します。別の名前を選択するか、既存のものを使用してください。", + "ORG_ZSTACK_STORAGE_CBT_10012": "CBTタスク[uuid: %s]のリソースが見つかりません", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10001": "ZStackデータベースからデフォルト管理者アカウントを取得できませんでした", + "ORG_ZSTACK_STORAGE_CBT_10013": "仮想マシン: %sのホストが見つかりません", + "ORG_ZSTACK_STORAGE_CBT_10011": "ボリューム[uuid:%s]は既にvmInstance[uuid:%s]にエクスポートされています。", + "ORG_ZSTACK_STORAGE_CBT_10006": "Cloud Block Storageタスク[uuid:%s]が見つかりません", + "ORG_ZSTACK_STORAGE_CBT_10009": "vm[uuid: %s]は現在実行中です。停止后再試行してください。", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10004": "式のパラメータ'%s'の型が正しくありません。%sである必要がありますが、%sが指定されました", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10003": "クラウドコンピューティング式でパラメータ'%s'が不足しています", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10000": "無効な式: %s, %s 式がクラウドコンピューティング環境で有効であることを確認してください。", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10001": "無効な式: %s、有効なクラウドコンピューティング式が見つかりません", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10019": "tf controllerへのtf l3サブネット[name:%s]の追加に失敗しました:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10082": "UUID: %sのbaremetal2 gatewayが接続されていないため、UUID: %sのインスタンスのコンソールURLを生成できません。", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10016": "tf controllerでのtf l3ネットワーク[name:%s]の更新に失敗しました:%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10013": "tf controllerでのtf L3ネットワーク[name:%s]の削除に失敗しました:%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10011": "tf controllerでのl2ネットワーク[uuid:%s]の削除に失敗しました", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10080": "gateway[uuid:%s]でのプロビジョニングネットワーク[uuid:%s]の準備に失敗しました:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10081": "baremetal2インスタンス[uuid:%s]が存在しないため、そのコンソールURLを生成できません。", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10007": "buildAppUuidとexportIdの両方をnullにすることはできません。buildAppUuidまたはexportIdのいずれかが提供されていることを確認してください。", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10006": "バックアップストレージのUUIDとホスト名の両方が設定されていますが、異なるホストを参照しています", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10005": "ホスト名: %sのバックアップストレージが複数見つかりました。代わりにbackupStorageUuidを使用してください", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10004": "ホスト名: %sのimage storeが見つかりません", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10003": "バックアップストレージのUUIDとホスト名の両方がnullです。バックアップストレージとホスト名の設定を確認してください。", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10002": "dataPathは'/'で始まる必要がありますが、実際には[%s]が指定されました", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10001": "このホスト[%s]で別のビルドシステム[UUID: %s, name: %s]が同じURL[%s]を使用しています", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10000": "build-app[%s]はエクスポート中またはエクスポート準備中の状態です。まず終了または削除してください。", + "ORG_ZSTACK_CAS_10000": "CASドライバー設定のプロパティが不足しています", + "ORG_ZSTACK_CAS_10002": "仮想マシンID[name:%s]が正しくありません。存在しないか、パスワードが間違っています", + "ORG_ZSTACK_CONTAINER_10020": "ネットワークポリシーの削除に失敗しました:%s", + "ORG_ZSTACK_CAS_10001": "サポートされていないCASドライバー:%s", + "ORG_ZSTACK_CONTAINER_10022": "ネットワークポリシーの作成時にクラスタIDがnullです", + "ORG_ZSTACK_CAS_10003": "CASにそのようなデータ型[%s]は定義されていません", + "ORG_ZSTACK_CONTAINER_10024": "%sのため、ネットワークポリシーの作成に失敗しました", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10009": "ビルドエクスポート履歴にID %sのエクスポートタスクが見つかりません。エクスポートタスクIDを確認して再試行してください。", + "ORG_ZSTACK_CONTAINER_10023": "クラスタID: %sからApiClientを取得できません", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10008": "buildAppUuidとbuildSystemUuidの両方をnullにすることはできません。buildAppUuidまたはbuildSystemUuidのいずれかが提供されていることを確認してください。", + "ORG_ZSTACK_CONTAINER_10015": "%sのため、デプロイの削除に失敗しました", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10079": "クラスタ[uuid:%s]のハイパーバイザータイプが無効です", + "ORG_ZSTACK_CONTAINER_10017": "ポッド[name=%s, namespace=%s]が見つかりません", + "ORG_ZSTACK_CONTAINER_10016": "原因不明のエラーによりデプロイの終了に失敗しました。%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10075": "ブロックボリューム%sのアクセスパス[iscsiPath: %s]のゲートウェイIPアドレスの取得に失敗しました(原因: %s)", + "ORG_ZSTACK_CONTAINER_10018": "%sのため、ポッドへのラベルの追加に失敗しました", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10076": "ゲートウェイ[uuid:%s]を通じてベアメタルインスタンス[uuid:%s]からボリューム[uuid:%s]をデタッチできませんでした(原因: %s)", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10028": "TensorFlowコントローラー上のレイヤー3ネットワーク[name:%s]へのDNS設定の追加に失敗しました(原因: %s)", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10077": "ゲートウェイ[uuid:%s]内のベアメタルインスタンス[uuid:%s]のボリューム[uuid:%s]の破棄に失敗しました(原因: %s)", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10078": "プライマリストレージ[uuid:%s]のすべてのCeph MONが正常な状態ではありません", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10072": "ベアメタル2インスタンス[uuid:%s]が接続されていないため、ボolumeをアタッチできません。", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10073": "外部プライマリストレージ%sでのボリュームLUN IDの取得に失敗しました。ストレージシステムが正しく構成され、アクセス可能であることを確認してください。", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10025": "トラフィックマネージャーコントローラー上の仮想ネットワーク[name:%s]からのホストルートの削除に失敗しました(原因: %s)", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10074": "ゲートウェイ[uuid:%s]内のベアメタルインスタンス[uuid:%s]のボリューム[uuid:%s]のLUN IDの取得に失敗しました(原因: %s)", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10022": "tf controller上のlayer-3 network[name:%s]へのhost routerの追加に失敗しました:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10070": "UUID: %sのボリュームをUUID: %sのベアメタルインスタンスにUUID: %sのゲートウェイを通じてアタッチできませんでした(原因: %s)", + "ORG_ZSTACK_FLOWMETER_10021": "%sは数値でなければなりません", + "ORG_ZSTACK_LOG4J2_10001": "不明なlog4j2アペンダータイプ %s", + "ORG_ZSTACK_LOG4J2_10000": "Log4j2アペンダータイプ:%sのファクトリが見つかりません。", + "ORG_ZSTACK_CONTAINER_10011": "uuid[%s]のホストが見つかりません", + "ORG_ZSTACK_CONTAINER_10013": "コンテナ管理エンドポイント[uuid:%s]が見つかりません", + "ORG_ZSTACK_CONTAINER_10012": "ベンダー[%s]のプロバイダが見つかりません", + "ORG_ZSTACK_CONTAINER_10004": "ホスト[%s]はエンドポイント[%s]に関連付けられていません", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10068": "ゲートウェイ[uuid:%s]を通じてベアメタルインスタンス[uuid:%s]のボリューム[uuid:%s]のプロビジョニングに失敗しました(原因: %s)", + "ORG_ZSTACK_CONTAINER_10005": "エンドポイント[%s]のクラスタが見つかりません", + "ORG_ZSTACK_CONTAINER_10008": "クラスタ[%s]のインスタンス一覧の取得に失敗しました: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10064": "UUID:%sのNICをUUID:%sのBaremetal2インスタンスにUUID:%sのGateway経由で接続できませんでした:%s", + "ORG_ZSTACK_CONTAINER_10007": "ゾーン[%s]がエンドポイント[%s]と一致しません", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10065": "baremetal2インスタンス[uuid:%s]は接続されていません。したがって、ネットワークインターフェースから切り離すことはできません。", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10066": "ネットワークインターフェース[uuid:%s]をUUID:%sのベアメタルインスタンスからUUID:%sのGateway経由で切り離すことができませんでした:%s", + "ORG_ZSTACK_CONTAINER_10009": "クラスタ[%s]は異なるアベイラビリティゾーン[%s]でエンドポイント[%s]に既に存在します", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10060": "プロビジョニングネットワーク[uuid:%s]上のすべてのBareMetal2ゲートウェイが接続されていることを確認してください。", + "ORG_ZSTACK_CONFIGURATION_10011": "サポートされていないプライマリストレージ割り当て戦略[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10061": "VMインスタンスUUIDのリストが空です。少なくとも1つの有効なUUIDを指定してください。", + "ORG_ZSTACK_CONFIGURATION_10010": "サポートされていないホスト割り当て戦略[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10062": "baremetal2ゲートウェイ[UUID: %s, ステータス: %s]は接続されていません", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10063": "baremetal2インスタンス[uuid:%s]は接続されていません。したがって、NICを接続することはできません。", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10031": "tfコントローラーでレイヤー3ネットワーク[name:%s]からDNS設定を削除できませんでした:%s", + "ORG_ZSTACK_STORAGE_BACKUP_10119": "installPathとbootstrap URLの両方が必要です。", + "ORG_ZSTACK_STORAGE_BACKUP_10118": "クラウド環境でのバックアップからのデータベースのリストアは許可されていません。", + "ORG_ZSTACK_STORAGE_BACKUP_10117": "データベースバックアップ[uuid:%s]はバックアップストレージ[uuid:%s]にエクスポートされています", + "ORG_ZSTACK_STORAGE_BACKUP_10116": "データベースバックアップ[UUID %s]はバックアップストレージ[UUID: %s]からエクスポートされていません", + "ORG_ZSTACK_STORAGE_BACKUP_10115": "現在のバックアップストレージの状態[%s]では操作[%s]を実行できません。有効な状態は%sです", + "ORG_ZSTACK_STORAGE_BACKUP_10114": "SSHキーを使用してピアノードとのSSH接続を確立できません。ネットワーク接続とSSHキーの設定を確認してください。", + "ORG_ZSTACK_STORAGE_BACKUP_10113": "bandWidthは正の値である必要があります", + "ORG_ZSTACK_STORAGE_BACKUP_10112": "ジョーパラメータにリモート保持値がありません:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10039": "VM[uuid:%s]は停止しておらず、特定のホストで実行されていません。", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10007": "組み込みのセキュリティ管理者ロールは、組み込みのセキュリティ管理者ロールによって削除することはできません。", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10038": "ボリューム[uuid:%s]は、停止状態ではなく、特定のホストで実行されていない1つ以上のVM[uuid:%s]に接続されています。", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10008": "システム管理者ロールをシステム管理者ユーザーグループから取り消すことはできません", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10009": "組み込みの監査管理者を削除できません。システム提供の役割を変更しようとしていないことを確認してください。", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10003": "このリソースの初期ユーザーの名前は更新できません。", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10034": "ホスト%sでボリューム%sのレプリケーションが見つかりません", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10004": "%sはクラウドコンピューティング仮想化環境で予約済みのキーワードです。別の名前を選択してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10037": "プライマリストレージのUUIDはnullにできません。プライマリストレージには有効なUUIDを指定してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10036": "無効なリソースUUID %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10006": "組み込み管理者ユーザーから監査管理者ロールを取り消すことはできません", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10042": "ZBoxからビットを復元する前に、ミニストレージ[UUID: %s]を空にする必要があります。クリーンアップしてください。", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10001": "FluentBit出力タイプ %s のファクトリが見つかりません。", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10010": "組み込みセキュリティ管理者を削除できません。システム提供のロールを変更しようとしていないことを確認してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10041": "ハイパーバイザ[%s]とバックアップストレージタイプ[%s]をサポートするLocalStorageBackupStorageMediatorがありません", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10011": "組み込みシステム管理者から権限を取り消すことはできません。", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10003": "ホスト名またはIDはnullにできません。有効なホスト名またはIDを指定してください。", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10012": "追加するロールが同じアイデンティティを持ち、仮想化環境内で互換性があることを確認してください。", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10002": "不明なFluentBit出力プラグインタイプ %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10013": "仮想ID[uuid:%s]のアイデンティティにロール: %s を追加できません", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10005": "ポート番号はnullにできません", + "ORG_ZSTACK_APPCENTER_UTILS_10000": "以下の場所に生のテンプレートJSONファイルが見つかりません: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10004": "ログストレージサーバー[アドレス: %s]は利用できません", + "ORG_ZSTACK_APPCENTER_UTILS_10001": "クラウドリソース設定のJSONテンプレートを生成できません", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10040": "ホスト[uuid:%s]が有効化されておらず接続状態でもないため、%sに失敗しました。", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10007": "新しい設定にエラーがあり、サービス例外が発生しています。設定パラメータを再度確認してください。詳細: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10006": "ログサーバーの作成に失敗しました。新しく渡された設定パラメータが正しくないため、Fluent Bitサービスが非アクティブ状態になった可能性があります。設定の正確性を再確認してください。", + "ORG_ZSTACK_STORAGE_BACKUP_10111": "ジョーパラメータにリモート保持タイプがありません", + "ORG_ZSTACK_STORAGE_BACKUP_10110": "ジョーパラメータ設定に'retentionValue'がありません", + "ORG_ZSTACK_STORAGE_BACKUP_10129": "ルートボリュームUUID: %s を持つインスタンスが見つかりません", + "ORG_ZSTACK_STORAGE_BACKUP_10124": "ボリューム[uuid:%s]のVMが見つかりません", + "ORG_ZSTACK_STORAGE_BACKUP_10123": "共有ボリューム attachment でこの操作はサポートされていません", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10028": "ボリューム[uuid:%s]の画像[uuid:%s]を取得できるバックアップストレージがありません", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10005": "インポートされたパッケージまたはクラスにJoinTypeが見つかりません。正しいパッケージをインポートし、クラスに定義されたJoinTypeが含まれていることを確認してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10029": "画像[uuid: %s]にはバックアップストレージ[uuid: %s]への参照がありません", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10000": "[CloudFunction]からの出力が空です", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10001": "アクション[%s]の呼び出しに失敗しました。原因: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10023": "ホスト[%s]での操作を期待していましたが、利用可能で有効化されているホストは %s のみです", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10002": "action: %s はIAMロール %s ではサポートされていません", + "ORG_ZSTACK_STORAGE_BACKUP_10120": "databaseBackup[uuid:%s]は有効化されておらず、利用できません", + "ORG_ZSTACK_STORAGE_SNAPSHOT_REFERENCE_10000": "UUID %s のボリュームは他のボリューム [%s] から参照されています。インストールパスを変更する前に、これらのボリュームとその子孫をフラット化してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10017": "ボリューム %s の作成に必要なクラスタ %s がプライマリストレージ %s に接続されていません", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10016": "ボリューム [uuid:%s]のレプリケーションネットワーク状態がStandAloneモードに入りました。全ホストが接続状態のため、まず回復してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10018": "ボリューム作成に必要なクラスタ %s で利用可能なホストが見つかりません", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10013": "ミニプライマリストレージ[uuid: %s]のホスト[uuid: %s]に十分な容量がありません[現在: %s バイト、必要: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10017": "UUID: %s のbaremetal2ゲートウェイはUUID: %s のクラスタと同じゾーンに配置されていません", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10012": "ホスト[UUID: %s]のプライマリストレージ[UUID: %s]に十分なスペースを確保できません。物理容量が不足しています。", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10018": "それに依存するアクティブなインスタンスが存在するため、Baremetal2ゲートウェイ[uuid:%s]のクラスタを変更できません", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10015": "ボリューム[uuid:%s]のレプリケーションはデータを同期中であるため、同期が完了するまでお待ちください", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10019": "クラスタ[%s]はbaremetalタイプではありません", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10014": "ミニストレージシステム[uuid: %s]でボリューム[uuid: %s]のサイズ変更に利用できるホストが見つかりません", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10013": "クラスタ[uuid:%s]は利用できません", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10014": "クラスタ[uuid:%s]はベアメタル仮想化クラスタではありません", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10022": "ホスト %s でストレージ同期ポートを確保できません: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10015": "ゲートウェイ[uuid:%s]は利用できません", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10021": "プライマリストレージ[uuid: %s]のコマンドを実行できる利用可能なホストが見つかりません", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10016": "UUID: %s のbaremetal2ゲートウェイはすでにUUID: %s のクラスタの一部です", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10010": "baremetal2ゲートウェイ[uuid:%s]は1つのコンピュートクラスタにのみ接続できます", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10011": "baremetal2ゲートウェイ [UUID: %s]はクラスタ [UUID: %s]に接続されていないため、切り離しは不要です。", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10012": "UUID:%s のbaremetal2ゲートウェイは現在1つのクラスタにのみ接続されています。切り離さないでください。", + "ORG_ZSTACK_STORAGE_BACKUP_10108": "ジョブパラメータに'retentionPolicyType'と'retentionPeriod'がありません", + "ORG_ZSTACK_STORAGE_BACKUP_10107": "予期しないバックアップストレージUUID: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10106": "バックアップストレージUUIDのリストが空です。操作を続行するには、有効なバックアップストレージUUIDを指定してください。", + "ORG_ZSTACK_STORAGE_BACKUP_10105": "ジョブパラメータに'backupStorageUuids'がありません。必要なバックアップストレージUUIDがすべて指定されていることを確認してください。", + "ORG_ZSTACK_STORAGE_BACKUP_10104": "必要なジョブパラメータがありません: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10103": "予期しないタスクステータス: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10102": "同期タスクがソースファイル缺失により失敗しました。必要なファイルがすべてアップロードされていることを確認してから再試行してください。", + "ORG_ZSTACK_STORAGE_BACKUP_10101": "ストレージリポジトリ[uuid:%s]にデータベースバックアップ[uuid:%s]が見つかりません", + "ORG_ZSTACK_LOGIN_PLUGIN_10002": "プラグインログイン機能を使用する際にLoginUserInfoが見つかりません", + "ORG_ZSTACK_LOGIN_PLUGIN_10001": "%sという名前のログインペルが見つかりません", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10005": "ミニストレージ[UUID: %s, name: %s]は、ボリュームをインスタンス化するために接続されたクラスタ内で利用可能なホストを見つけることができません", + "ORG_ZSTACK_LOGIN_PLUGIN_10000": "loginPluginNameが見つかりません。ログイン認証に有効なplugin名を提供してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10007": "リクエストを割り当てるコンピュートインスタンスを特定できません。インスタンスがクラウド環境で適切にレジストされ、タグ付けされていることを確認してください。問題が解決しない場合は、サポートにお問い合わせください。", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10002": "ホスト[uuid:%s]はクラウド環境に接続されていません", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10014": "プロジェクトに管理者権限を追加できません", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10006": "管理IP %sを持つbaremetal2ノード", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10001": "インスタンス[UUID:%s]にキャッシュされたボリュームがまだ存在するため、キャッシュボリュームURLを更新できません", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10015": "仮想_machine IDホワイトリスト[uuid:%s]によって操作は許可されていません", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10007": "管理IP %sを持つホストで問題が発生しました", + "ORG_ZSTACK_KVM_10110": "ホスト[IP:%s]はデータベースに固有識別子[HostUuid:%s]が存在するため、接管されました", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10004": "APIRecoverResourceSplitBrainMsgのリソースタイプ[%s]は、クラウドリソースリカバリに対して無効です", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10016": "仮想_machineブラックリスト[uuid:%s]によって操作は拒否されました", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10008": "BareMetal2ゲートウェイ[uuid:%s]を非BareMetal2クラスタ[uuid:%s]に接続できません", + "ORG_ZSTACK_KVM_10111": "ホストのCPUアーキテクチャを特定できません;ユーザー名とパスワードを確認してください;%s", + "ORG_ZSTACK_STORAGE_BACKUP_10109": "ジョブパラメータ設定に'retentionType'が見つかりません", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10009": "UUID: %sのbaremetal2ゲートウェイは既にUUID: %sのクラスタに接続されています", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10002": "管理IP %sを持つbaremetal PXEサーバーが既に存在します;Baremetal2ゲートウェイの作成に使用しないでください", + "ORG_ZSTACK_KVM_10103": "DNS検証を実行するためにKVM[ip:%s, username:%s, sshPort: %d]に接続できません;ユーザー名とパスワードの正確性を確認してください", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10004": "管理IP[%s]は有効なIPv4アドレスまたはホスト名ではありません", + "ORG_ZSTACK_KVM_10104": "%s内のすべてのDNS/IPアドレスへのpingに失敗しました;ネットワーク接続と/etc/resolv.confのDNS設定を確認し、インスタンスがパブリックインターネットにアクセスできることを確認してください", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10010": "接続された仮想_machineが見つかりません、ミニストレージ操作に失敗しました", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10005": "非BareMetal2クラスタ[uuid:%s]にBareMetal2ゲートウェイを追加できません", + "ORG_ZSTACK_KVM_10105": "管理_nodeのアクセシビリティを確認するためにKVM[ip:%s, username:%s, SSH port:%d]に接続できません;認証情報が正しいかどうかを確認してください;%s", + "ORG_ZSTACK_VPC_HA_VPCHAGC_10000": "VR[uuid: %s]インスタンスは実行されていません", + "ORG_ZSTACK_KVM_10106": "KVMホスト[ip:%s]は管理_nodeのコールバックURLにアクセスできません。KVMホストが管理IP[%s]に到達できないようです。%s %s", + "ORG_ZSTACK_VPC_HA_VPCHAGC_10001": "VR[uuid: %s]インスタンスが接続されていません", + "ORG_ZSTACK_KVM_10107": "ホストが接管されたかどうかを確認できません、因為%s", + "ORG_ZSTACK_KVM_10108": "フラグのタイムスタンプを取得できません、因為%s", + "ORG_ZSTACK_KVM_10109": "ホスト [IP:%s] は、接手フラグ [HostUuid:%s] が既に存在し、更新时间 [utime %d] がホスト ping 間隔 [ping interval %d] を超過していないため、取得されました。", + "ORG_ZSTACK_STORAGE_BACKUP_10100": "バックアップストレージ [UUIDs: %s, %s] のいずれかが %s の状態にあるため、同期操作を実行できません。", + "ORG_ZSTACK_AUTOSCALING_GROUP_10009": "instance offering [UUID:%s] は無効です。この VM を作成できません。", + "ORG_ZSTACK_AUTOSCALING_GROUP_10008": "リソースが見つかりません: UUID [%s] の InstanceOfferingVO は利用できません。", + "ORG_ZSTACK_AUTOSCALING_GROUP_10007": "リソースが見つかりません: UUID [%s] の AutoScalingVmTemplateVO は利用できません。", + "ORG_ZSTACK_AUTOSCALING_GROUP_10006": "autoScalingGroup[%s] は、新しく作成した VM をセキュリティグループに完全に追加できませんでした、エラー: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10005": "VM NIC をセキュリティグループに追加できませんでした、UUID=%s のセキュリティグループが見つかりません。", + "ORG_ZSTACK_AUTOSCALING_GROUP_10004": "autoScalingGroup[%s] は、新しく作成した VM をロードバランサーに完全に追加できませんでした、エラー: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10003": "VM NIC をロードバランサーに追加できませんでした、UUIDs=%s のロードバランサーが見つかりません。", + "ORG_ZSTACK_AUTOSCALING_GROUP_10002": "autoScalingGroup[%s] の VM 作成が完全に失敗しました、エラー: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10000": "同じスケーリンググループ内で、同時に実行できるスケーリングアクティビティは 1 つだけです。", + "ORG_ZSTACK_KVM_10120": "host[uuid:%s] の設定が変更されました、旧: %s、新: %s", + "ORG_ZSTACK_KVM_10121": "host[uuid:%s] は電源オフ状態になりました、通知を送信します", + "ORG_ZSTACK_KVM_10112": "ホストの CPU アーキテクチャはクラスター設定と一致しません", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10000": "クラウドストレージ設定内のパス文字列 %s が無効です", + "ORG_ZSTACK_KVM_10115": "host [uuid:%s] は QEMU/Libvirt バージョンが一致しないため、クラスター [uuid:%s] に追加できません", + "ORG_ZSTACK_KVM_10117": "host [uuid:%s] は CPU アーキテクチャ仕様が一致しないため、クラスター [uuid:%s] に追加できません", + "ORG_ZSTACK_KVM_10119": "/proc/cpuinfo で VTx も VTd も検出できません。BIOS 設定でハードウェア仮想化が有効になっていることを確認してください。", + "ORG_ZSTACK_AUTOSCALING_GROUP_10019": "リソースが見つかりません: L3 ネットワーク (UUID: %s) が見つかりません", + "ORG_ZSTACK_AUTOSCALING_GROUP_10018": "UUIDs:%s のディスク offering は無効です。したがって、これらの offering から VM を作成することはできません。", + "ORG_ZSTACK_AUTOSCALING_GROUP_10017": "リソースが見つかりません: UUID [%s] の Disk Offering が見つかりません", + "ORG_ZSTACK_AUTOSCALING_GROUP_10016": "system-image[uuid:%s] はユーザー VM の作成に使用できません", + "ORG_ZSTACK_AUTOSCALING_GROUP_10015": "イメージメディアタイプが ISO の場合、rootDiskOfferingUuid は null にできません", + "ORG_ZSTACK_AUTOSCALING_GROUP_10014": "image[uuid:%s] はメディアタイプ: %s です。VM の作成には RootVolumeTemplate と ISO のみが使用できます", + "ORG_ZSTACK_AUTOSCALING_GROUP_10013": "image[uuid:%s] は現時点では利用できません。VM を作成する前に、それが準備できていることを確認してください。", + "ORG_ZSTACK_AUTOSCALING_GROUP_10012": "image[uuid:%s] は無効です。このイメージからの VM 作成は許可されていません。", + "ORG_ZSTACK_AUTOSCALING_GROUP_10011": "リソースが見つかりません: UUID [%s] のイメージが見つかりません", + "ORG_ZSTACK_AUTOSCALING_GROUP_10010": "instance offering [UUID: %s, type: %s] は User VM タイプではありません。したがって、この VM を作成することはできません。", + "ORG_ZSTACK_KVM_10130": "インスタンスへのボリュームのアタッチに失敗しました。理由: %s", + "ORG_ZSTACK_KVM_10131": "インスタンスからのボリュームのデタッチに失敗しました。理由: %s", + "ORG_ZSTACK_KVM_10132": "vm[%s]のディスク領域解放に失敗しました。原因:%s", + "ORG_ZSTACK_KVM_10123": "host[%s]が%d秒以内にシャットダウンしませんでした", + "ORG_ZSTACK_KVM_10125": "host[UUID:%s]上のファイル%sの確認に失敗しました", + "ORG_ZSTACK_KVM_10126": "ホストはメンテナンス準備状態のため、現在オペレーティングシステムを更新できません。メンテナンス操作を完了するか、サポートにお問い合わせください。", + "ORG_ZSTACK_KVM_10127": "ホストは接続状態ではないため、OS更新操作を実行できません。OSを更新する前にホストが接続されていることを確認してください。", + "ORG_ZSTACK_COMPUTE_BONDING_10022": "スレーブUUIDまたはスレーブ名のいずれかが必要です", + "ORG_ZSTACK_COMPUTE_BONDING_10021": "UUID:%sのホストにはインターフェースが存在しません", + "ORG_ZSTACK_VMWARE_10069": "インスタンスID [%s]が見つかりません", + "ORG_ZSTACK_COMPUTE_BONDING_10020": "インターフェース%sはホスト上に存在しません", + "ORG_ZSTACK_VMWARE_10067": "vm [%s]が見つかりません", + "ORG_ZSTACK_COMPUTE_BONDING_10026": "管理ネットワークに関連付けられたボンディングインターフェースを削除できません。続行前に管理ネットワークが使用されていないことを確認してください。", + "ORG_ZSTACK_VMWARE_10064": "VMインスタンスが見つかりません: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10029": "自動スケーリンググループのアクティビティ調整をスキップする必要があります", + "ORG_ZSTACK_COMPUTE_BONDING_10025": "ボンディングモード[%s]が無効です", + "ORG_ZSTACK_VMWARE_10065": "バーチャルマシンのシャットダウンに失敗しました: %s, %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10028": "クラウドコンピューティングサービスから削除されたインスタンスリストを取得できません", + "ORG_ZSTACK_VMWARE_10062": "VMの再開に失敗しました、タスクステータス: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10027": "起動されたインスタンスの数が許可された制限を超えています。%s", + "ORG_ZSTACK_COMPUTE_BONDING_10023": "複数のSR-IOV Devが選択されているため、SR-IOVインターフェース[%s]をボンディングに追加できません", + "ORG_ZSTACK_VMWARE_10063": "バーチャルマシン[%s]の再開に失敗しました: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10026": "autoScalingGroup[%s]がVM[%s]を完全に終了できませんでした、エラーは%sです", + "ORG_ZSTACK_VMWARE_10060": "VM [%s]の中断に失敗しました: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10025": "autoScalingGroup[%s]にはVMテンプレートがアタッチされていません", + "ORG_ZSTACK_COMPUTE_BONDING_10029": "SR-IOV対応インターフェースが既に含まれているため、ボンディング[%s]に新しいインターフェースを追加できません", + "ORG_ZSTACK_AUTOSCALING_GROUP_10024": "自動スケーリンググループ[%s]は予期しない状態に 있습니다、期待される状態: %s", + "ORG_ZSTACK_COMPUTE_BONDING_10028": "インターフェースをボンディング[%s]に繰り返しアタッチすることはできません。", + "ORG_ZSTACK_AUTOSCALING_GROUP_10023": "defaultL3NetworkUuid[uuid:%s]はl3NetworkUuids %sに存在しません", + "ORG_ZSTACK_SNS_PLATFORM_DINGTALK_10000": "DingTalkへのメッセージ送信に失敗しました。ステータス: %s、本文: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10022": "l3NetworkUuidsに複数のレイヤー3ネットワークが指定されていますが、defaultL3NetworkUuidがnullです", + "ORG_ZSTACK_KVM_10140": "KVMホスト[uuid:%s]上でl2Network[uuid:%s, type:%s, vlan:%s]のブリッジ[%s]の作成に失敗しました。理由は: %s", + "ORG_ZSTACK_COMPUTE_BONDING_10027": "VTEP IPで構成されたボンディングインターフェースを削除できません。最初にすべての関連付けられた仮想ネットワークの関連付けを解除してください。", + "ORG_ZSTACK_KVM_10141": "KVMホスト[uuid:%s]上のl2VlanNetwork[uuid:%s, name:%s]のブリッジ[%s]のチェックに失敗しました、%s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10021": "l3Network[uuid:%s]はシステムネットワークであり、ユーザーのVM作成には使用できません。", + "ORG_ZSTACK_AUTOSCALING_GROUP_10020": "UUID:%sのl3Networkは無効になっています。したがって、このネットワークでのVM作成は許可されていません。", + "ORG_ZSTACK_KVM_10143": "KVMホスト[uuid:%s]上のl2Network[uuid:%s, type:%s, vlan:%s]のブリッジ[%s]の削除に失敗しました、%sの理由で", + "ORG_ZSTACK_KVM_10144": "CPUモードがnoneに設定されている場合、ハイパーバイザー機能を無効にできないため、VMを起動できませんでした。CPU構成設定を確認してください。", + "ORG_ZSTACK_KVM_10134": "XMLフック[%s]はVM %sに関連付けられているため、削除前にバインドを解除してください", + "ORG_ZSTACK_KVM_10136": "システムタイプのXMLフックはクラウドコンピューティング環境では許可されていません。すべてのシステムレベル構成が仮想化標準に準拠していることを確認してください。", + "ORG_ZSTACK_KVM_10137": "XMLフック名[%s]は仮想マシン構成にすでに存在します", + "ORG_ZSTACK_KVM_10138": "管理IP[%s]を持つKVMホストが存在します", + "ORG_ZSTACK_KVM_10139": "%sにVLANデバイスを作成できません。名前が長すぎます", + "ORG_ZSTACK_VMWARE_10059": "VMの一時停止に失敗しました、タスクステータス: %s", + "ORG_ZSTACK_COMPUTE_BONDING_10033": "L2ネットワーク[uuid:%s]が存在しません", + "ORG_ZSTACK_BILLING_10008": "開始日は終了日より前でなければなりません", + "ORG_ZSTACK_COMPUTE_BONDING_10032": "ボンディング[%s]からインターフェースを繰り返し切り離すことはできません", + "ORG_ZSTACK_COMPUTE_BONDING_10031": "ボンディング[%s]の状態がボンディング中のため、インターフェース[%s]を切り離すことはできません", + "ORG_ZSTACK_COMPUTE_BONDING_10030": "SR-IOVインターフェース[%s]をボンディングに追加できません。ボンディング内の1つのインターフェースのみがSR-IOVを有効にできます", + "ORG_ZSTACK_BILLING_10005": "このリソースの請求は無効になっています。このサービスを使用するには請求が有効になっていることを確認してください", + "ORG_ZSTACK_COMPUTE_BONDING_10037": "L2ネットワークをクラスタ[UUID: %s]にアタッチできません。ホスト[UUID: %s]上のインターフェース[UUID: %s, name: %s]はサービスタイプに関連付けられていますが、その中にTenantNetworkが含まれていません", + "ORG_ZSTACK_BILLING_10004": "サポートされていない請求リソースタイプ[%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10036": "L2ネットワークをクラスタ[UUID]にアタッチできません。ホスト[UUID]上のボンディングインターフェース[UUID, name]にはボンディングサービスタイプの関連付けがありますが、TenantNetworkサービスタイプがありません", + "ORG_ZSTACK_BILLING_10003": "ユーザーに正しい価格構成が設定されていることを確認してください、例: `priceUserConfig:{\\nvolume:{\\npriceKeyName:\\\"priceKeyName\\\"}}`", + "ORG_ZSTACK_COMPUTE_BONDING_10035": "L2ネットワークをクラスタ[uuid:%s]にアタッチできません。物理インターフェース[%s]は1つ以上のホストのボンディングで使用されています。競合するホスト: [%s]", + "ORG_ZSTACK_VMWARE_10051": "vmUuid [%s]はESXホストシステム[%s]に見つかりません", + "ORG_ZSTACK_BILLING_10002": "ユーザーに正しい価格構成が設定されていることを確認してください、例: `priceUserConfig:{rootVolume:{priceKeyName:\\\"priceKeyName\\\"}}`", + "ORG_ZSTACK_COMPUTE_BONDING_10034": "L2ネットワーク[uuid:%s]の物理インターフェース定義が空です", + "ORG_ZSTACK_BILLING_10001": "dateInLongは%sミリ秒未満です", + "ORG_ZSTACK_BILLING_10000": "priceKeyNameがnullです。価格のキー名が正しく構成されていることを確認してください", + "ORG_ZSTACK_VMWARE_10050": "vCenter[uuid:%s]と同期中、後で再試行してください", + "ORG_ZSTACK_KVM_10150": "メッセージ%sからvmUuidを取得できません", + "ORG_ZSTACK_KVM_10151": "仮想マシンの同期がホスト[uuid:%s, ip:%s]で失敗しました: %s", + "ORG_ZSTACK_COMPUTE_BONDING_10038": "Linuxボンディングのホスト[uuid:%s]への追加に失敗しました: %s", + "ORG_ZSTACK_KVM_10152": "VM[%s]が長期間シャットダウン状態のままです。ステータスを確認してください。", + "ORG_ZSTACK_AUTOSCALING_GROUP_10032": "サポートされていない削除ポリシーの種類[%s]", + "ORG_ZSTACK_V2V_VMWARE_10015": "ホスト%sのCIDR %sに利用可能なIPがありません。ホストを再接続してIPを更新してください。", + "ORG_ZSTACK_KVM_10154": "KVMホスト[uuid: %s]上のl2Network[uuid:%s, name:%s]のブリッジ[%s]更新に失敗しました: %s", + "ORG_ZSTACK_V2V_VMWARE_10016": "VM変換の長時間実行中のジョブ[uuid:%s]がすでに存在します: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10030": "deleteAutoScalingRule[%s]のトリガーが失敗しました。エラー: %s", + "ORG_ZSTACK_V2V_VMWARE_10017": "仮想マシン%sの変換ホスト依存関係の更新に失敗しました", + "ORG_ZSTACK_KVM_10146": "KVMホスト[uuid:%s]へのセキュリティグループルールの適用に失敗しました: %s", + "ORG_ZSTACK_KVM_10147": "KVMホスト[uuid:%s]でのセキュリティグループデフォルトルールの確認に失敗しました: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10101": "HTTPリダイレクトURLを指定せずにリダイレクトポートまたはステータスコードを割り当てることができません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10009": "ハートビートの検出に失敗しました。コード: %s、詳細: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10104": "loadBalancerリスナー[%s]はセッション永続性の状態変更をサポートしていません", + "ORG_ZSTACK_IAM2SCRIPT_10010": "指定されたスクリプトエグゼキュータは、このクラウドコンピューティング環境ではサポートされていません。サポートされているエグゼキュータリストを参照してください。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10105": "クラウド環境では、HTTPからHTTPSへのリダイレクトとセッション永続性を同時にサポートできません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10102": "HTTPからHTTPSへのリダイレクトを指定する場合、HTTP以外のプロトコルはサポートできません", + "ORG_ZSTACK_VMWARE_10048": "ホストはクラウド環境に接続されていません。ホストが正しく設定され、認可されていることを確認してください。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10108": "リスナー[%s]はセッション永続性を変更します。ロードバランシングアルゴリズムを指定する必要があります。", + "ORG_ZSTACK_V2V_VMWARE_10007": "URL %sの解析に失敗しました", + "ORG_ZSTACK_COMPUTE_BONDING_10044": "ホスト[uuid:%s]のlinuxボンディングへのNIC接続に失敗しました: %s", + "ORG_ZSTACK_VMWARE_10046": "vCenterでは、NICはホットオペレーションをサポートしていないため、NICを取り外すことはできません。", + "ORG_ZSTACK_BILLING_10019": "GPU価格はGPU UUID %sにバインドする必要があります", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10109": "リスナー[%s]の%sロードバランシングアルゴリズムは、iphashを明示的に割り当てること以外、セッション永続性の変更をサポートしていません", + "ORG_ZSTACK_V2V_VMWARE_10008": "データセンター名に特殊文字を含めることはできません %s", + "ORG_ZSTACK_IAM2SCRIPT_10002": "スクリプトの内容が空白です。Javaコードスニペットが正しく定義され、ソースファイルに含まれていることを確認してください。", + "ORG_ZSTACK_BILLING_10018": "GPU価格は有効なGPU UUIDにバインドする必要があります。空でないUUIDを提供してください。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10106": "リスナー[%s]はHTTPモードがhttp-tunnelに設定されている場合、セッション永続性の書き換えを変更できません", + "ORG_ZSTACK_V2V_VMWARE_10009": "ターゲットVM名に特殊文字を含めることはできません %s", + "ORG_ZSTACK_IAM2SCRIPT_10001": "スクリプト内容のデコードに失敗しました。ソースファイルが利用可能な状態であり、クラウドコンピューティング環境用に正しくフォーマットされていることを確認してください。", + "ORG_ZSTACK_COMPUTE_BONDING_10042": "Linuxボンディングをホスト[uuid:%s]から削除できませんでした: %s", + "ORG_ZSTACK_VMWARE_10044": "HOST CPUとGuest OSに互換性がありません。HOST CPUが必要な仮想化技術をサポートしていることを確認するか、Guest OSを互換性のあるバージョンに更新してください。", + "ORG_ZSTACK_BILLING_10017": "価格は0から999999999.99の範囲内でなければなりません。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10107": "listener[%s]はセッション永続化をIPハッシュに変更します。ソースバランサーアルゴリズムを指定する必要があります。", + "ORG_ZSTACK_VMWARE_10045": "仮想マシン%sとホスト%sの互換性チェックに失敗しました。", + "ORG_ZSTACK_BILLING_10016": "割り当ての最小リソース単位はバイトではなくメガバイトです。", + "ORG_ZSTACK_SDNCONTROLLER_10008": "SDN L2ネットワーク[UUID:%s]はコントローラに接続されていません。", + "ORG_ZSTACK_IAM2SCRIPT_10007": "IAM2スクリプト機能が有効になっていません。クラウド環境でIAM2サービスが有効になっていることを確認してください。", + "ORG_ZSTACK_BILLING_10015": "resourceName[%s]はクラウドコンピューティングコンテキストでは無効な識別子です。", + "ORG_ZSTACK_IAM2SCRIPT_10005": "スクリプト実行の出力を取得できません。クラウドインスタンスとネットワーク設定を確認してください。", + "ORG_ZSTACK_COMPUTE_BONDING_10046": "ホスト[uuid:%s]のLinuxボンディングからNICをデタッチできませんでした: %s", + "ORG_ZSTACK_VMWARE_10040": "宛先ホストのUUIDが見つかりません。ターゲットホストのUUIDが正しく指定されていることを確認してください。", + "ORG_ZSTACK_IAM2SCRIPT_10004": "iam2スクリプトの実行に失敗しました。必要なクラウドコンピューティング環境が正しく設定されていることを確認してください。", + "ORG_ZSTACK_VMWARE_10041": "ターゲットホストは仮想マシン管理をサポートしていません。宛先ホストがESXまたはvSphereホストであることを確認してください。", + "ORG_ZSTACK_KVM_10161": "仮想マシン[uuid:%s]のVNCポート番号[%d]が予期しない値です。", + "ORG_ZSTACK_IAM2SCRIPT_10009": "パラメータの数が許可された制限を超えています。", + "ORG_ZSTACK_IAM2SCRIPT_10008": "スクリプトにはコードが含まれていません。入力に有効なJavaコードが含まれていることを確認してください。", + "ORG_ZSTACK_SDNCONTROLLER_10000": "SDN Controller UUIDがAPIリクエストのsystemTagsに指定されていないため、SDN L2ネットワークを作成できません。SDN Controller UUIDが正しく指定されていることを確認してください。", + "ORG_ZSTACK_V2V_VMWARE_10003": "クラスタ名には次の文字を含めることはできません: %s", + "ORG_ZSTACK_SDNCONTROLLER_10002": "レイヤー2ネットワーク[uuid:%s, vswitchType:%s]のSDNコントローラが見つかりません", + "ORG_ZSTACK_SDNCONTROLLER_10001": "SDN Controller UUIDがAPIリクエストに含まれていないため、SDN L2ネットワークを作成できません。UUIDが含まれていることを確認してください。", + "ORG_ZSTACK_V2V_VMWARE_10006": "v2v移行前にVMインスタンス%sを停止できませんでした", + "ORG_ZSTACK_KVM_10157": "reply[%s]はKVMHostAsyncHttpCallResponseではありません", + "ORG_ZSTACK_KVM_10158": "reply[%s]は空のレスポンスボディを返しました", + "ORG_ZSTACK_KVM_10159": "%s 操作に失敗しました: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10040": "EIPを削除する場合、EcsInstanceは実行中または停止状態である必要があります。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10111": "listener[%s]はアイドルタイムアウトとcookie名の変更をサポートしません。セッション永続化を指定する必要があります。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10112": "listener[%s]はセッション永続化が無効になっている場合にアイドルタイムアウトの変更をサポートしません。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10110": "listener[%s]の%sロードバランシングアルゴリズムは、明示的にdisableを割り当てること以外のセッション永続化の変更をサポートしていません。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10115": "無効なセッションアイドルタイムアウト[%s]です。[%s~%s]の正の整数である必要があります。", + "ORG_ZSTACK_COMPUTE_BONDING_10040": "ホスト[uuid:%s]のLinuxボンディングの更新に失敗しました: %s", + "ORG_ZSTACK_VMWARE_10039": "メタデータリクエストにホストUUIDがありません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10116": "HTTPヘルスチェックプロトコルは、健全性チェックパラメータ%sに対して指定する必要があります", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10113": "listener[%s]は、セッション永続性がrewriteに設定されていない場合、cookie名の変更をサポートしていません", + "ORG_ZSTACK_VMWARE_10037": "分散バーチャルスイッチまたは適格なバーチャルスイッチが見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10114": "listener[%s]は、cookie名を変更せずにセッション based URL書き換えの変更をサポートしていません", + "ORG_ZSTACK_VMWARE_10038": "vCenter %sのデータストア%sが見つかりません", + "ORG_ZSTACK_BILLING_10009": "resourceTypeとresourceUUIDを同時に空にすることはできません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10119": "無効なヘルスチェックターゲット[%s]です。形式はcheckProtocol:portである必要があります(例: tcp:default)", + "ORG_ZSTACK_SDNCONTROLLER_10015": "type: %sはサポートリストにないため、SDNコントローラを追加できませんでした", + "ORG_ZSTACK_SDNCONTROLLER_10014": "リモートセキュリティグループコントローラUUID[:%s]がローカルセキュリティグループコントローラUUID[:%s]と一致しないため、セキュリティグループルールを追加できませんでした", + "ORG_ZSTACK_VMWARE_10036": "クラスタリング操作に利用可能なコンピュートリソースがありません。%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10117": "HTTPヘルスチェックプロトコルの想定ステータスコード[%s]が無効です", + "ORG_ZSTACK_SDNCONTROLLER_10017": "controller [IP:%s]は既に登録されているため、SDNコントローラを追加できませんでした", + "ORG_ZSTACK_VMWARE_10033": "vCenter [%s]とのSSLハンドシェイクに失敗しました。非セキュアなTLS 1.0が使用されています。必要に応じてJDK設定でTLS 1.0を有効にしてください", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10118": "プロトコル[%s]のリスナーはセキュリティポリシーの選択をサポートしていません", + "ORG_ZSTACK_SDNCONTROLLER_10016": "ip[%s]は有効なユニキャストアドレスではないため、SDNコントローラを追加できませんでした", + "ORG_ZSTACK_VMWARE_10034": "vCenter [%s]とのSSLハンドシェイクに失敗しました。ポート番号[%d]を確認してください", + "ORG_ZSTACK_BILLING_10027": "請求が有効です。この操作は請求が無効な場合にのみ許可されます", + "ORG_ZSTACK_SDNCONTROLLER_10019": "サブネットマスクが指定されていないため、ホスト[UUID:%s]をSDNコントローラ[UUID:%s]に追加できませんでした", + "ORG_ZSTACK_VMWARE_10031": "ユーザー資格情報でvCenter Server [%s]へのログインに失敗しました。ネットワーク接続と提供された資格情報を確認してください", + "ORG_ZSTACK_BILLING_10026": "endDateはstartDateより前に設定できません", + "ORG_ZSTACK_SDNCONTROLLER_10018": "ホスト[uuid:%s]は別のSDNコントローラに既に接続しているため、SDNコントローラ[uuid:%s]に追加できませんでした", + "ORG_ZSTACK_VMWARE_10032": "vCenter [%s]からのレスポンス解析に失敗しました。ポート番号[%d]を確認してください", + "ORG_ZSTACK_BILLING_10025": "endDateInLongが設定されています。データ整合性と仮想化標準への準拠を確保するため、クラウド環境での変更は許可されていません", + "ORG_ZSTACK_BILLING_10024": "endDateInLongとsetEndDateInLongBaseOnCurrentTimeを同時に設定することはできません。どちらかを設定してください", + "ORG_ZSTACK_VMWARE_10030": "クラウドリソースへの接続に失敗しました: %s", + "ORG_ZSTACK_BILLING_10023": "endDateInLongに負の値は許可されていません", + "ORG_ZSTACK_BILLING_10022": "accountUuidとtableUuidは同時に指定できません。いずれか一方のみを設定してください", + "ORG_ZSTACK_BILLING_10021": "このpriceTable[uuid=%s]は、このクラウド環境では削除が許可されていません", + "ORG_ZSTACK_BILLING_10020": "アカウント[uuid=%s]に価格表が関連付けられています", + "ORG_ZSTACK_LONGJOB_10007": "すでに成功した長時間実行中のジョブをキャンセルすることはできません", + "ORG_ZSTACK_SDNCONTROLLER_10011": "Pull tenant 操作は H3C VCFC V2X コントローラでのみサポートされています", + "ORG_ZSTACK_LONGJOB_10008": "失敗した長時間実行中のジョブをキャンセルすることはできません", + "ORG_ZSTACK_LONGJOB_10009": "長時間実行中のジョブは、成功、キャンセル、または失敗した場合にのみ削除してください", + "ORG_ZSTACK_SDNCONTROLLER_10013": "SDN コントローラが異なるため、vmnic をセキュリティグループに追加できませんでした [NIC コントローラ UUID: %s, セキュリティグループ コントローラ UUID: %s]", + "ORG_ZSTACK_SDNCONTROLLER_10012": "tenant データの取得に失敗しました: %s", + "ORG_ZSTACK_LONGJOB_10010": "longjob は、成功、キャンセル、または失敗した場合にのみ再実行できます", + "ORG_ZSTACK_LONGJOB_10011": "一時停止状態の長時間のタスクのみ再開できます", + "ORG_ZSTACK_LONGJOB_10012": "%s に対応する長時間実行中のタスクがありません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10122": "クラウドはプロトコル [%s] のリスナーが HTTP バージョン [%s] を選択をサポートしていないため、ロードバランサーリスナを変更できません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10123": "クラウドは HTTPS プロトコルが HTTP バージョンのみをサポートしているため [%s]、ロードバランサーリスナを変更できません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10120": "プロトコル [%s] のリスナーは、このヘルスチェックと互換性がありません: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10121": "HTTP ヘルスチェックプロトコルを指定してください。healthCheckMethod や healthCheckURI など、健康状態確認パラメータを含める必要があります", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10126": "クラウドは、プロトコル [%s] のリスナーがコンテンツの圧縮をサポートしていないため、ロードバランサーリスナの変更をサポートしていません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10127": "クラウドは圧縮アルゴリズム [%s] のみをサポートしているため、ロードバランサーリスナを変更できません", + "ORG_ZSTACK_VMWARE_10029": "ログイン失敗しました。認証情報を確認し、クラウドコンピューティングサービスに正しいログインパラメータを使用していることを確認してください", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10124": "クラウドは TCP プロトコルのリスナーがパラメータ設定に TCP プロキシのみをサポートしているため、ロードバランサーリスナを変更できません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10125": "クラウドは TCP プロキシプロトコル %s のみをサポートしているため、ロードバランサーリスナを変更できません", + "ORG_ZSTACK_VMWARE_10027": "VCenter[uuid:%s] が見つかりません: 指定された UUID の仮想化環境は存在しません", + "ORG_ZSTACK_TAG_10004": "リソースタイプ [%s] に一致するシステムタグがありません [%s]", + "ORG_ZSTACK_SDNCONTROLLER_10026": "SDN コントローラ [uuid:%s, vendorType:%s, vendorVersion:%s] では Pull tenant 操作はサポートされていません。この操作は H3C VCFC V2 コントローラでのみサポートされています", + "ORG_ZSTACK_LOG_10007": "不明なログ設定タイプ %s", + "ORG_ZSTACK_SDNCONTROLLER_10025": "SDN コントローラ [UUID:%s] が見つかりません", + "ORG_ZSTACK_TAG_10005": "リソースタイプ [%s] のシステムタグ [%s] の検証に失敗しました", + "ORG_ZSTACK_LOG_10006": "ログサーバの不明な設定タイプ %s", + "ORG_ZSTACK_SDNCONTROLLER_10028": "VLAN 範囲 [%s] が正しい形式ではないため、SDN コントローラを変更できませんでした", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10128": "IP バージョン [%s] が無効です。IPv4 または IPv6 である必要があります", + "ORG_ZSTACK_LOG_10005": "アカウント [uuid:%s] にはログサーバを追加する権限がありません。この権限を持つのは管理者アカウントのみです", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10129": "デフォルトのサーバグループ [uuid:%s] を削除できません", + "ORG_ZSTACK_LOG_10004": "アクセス拒否: アカウント[uuid:%s]は管理ノードのログを取得する権限がありません。この権限は管理アカウントのみが持有しています。", + "ORG_ZSTACK_TAG_10008": "tag[%s]は管理目的のみ使用可能です", + "ORG_ZSTACK_LOG_10003": "アカウント[UUID:%s]はログサーバー[UUID:%s]で操作を実行する権限がありません。", + "ORG_ZSTACK_SDNCONTROLLER_10029": "VLAN range[%s]が他のVLAN rangeと重複しているため、SDN controllerを変更できませんでした", + "ORG_ZSTACK_LOG_10002": "type:%sのファクトリーが見つかりません", + "ORG_ZSTACK_TAG_10006": "%sに一致するシステムタグが見つかりません", + "ORG_ZSTACK_SDNCONTROLLER_10020": "vTEP IPがホスト[UUID:%s]によって使用されているため、ホスト[UUID:%s]をSDN controller[UUID:%s]に追加できません", + "ORG_ZSTACK_SDNCONTROLLER_10022": "ホスト[uuid:%s]はSDN controller[uuid:%s]に追加されていないため、ホストを更新できませんでした", + "ORG_ZSTACK_TAG_10000": "重複するタグ[tag:%s, Type:%s, Resource_Type:%s, Resource_Uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10021": "ホスト[uuid:%s]はSDN controller[uuid:%s]に登録されていないため、登録解除できませんでした", + "ORG_ZSTACK_SDNCONTROLLER_10024": "SDN controller[uuid:%s]の一部のテナントが削除されているため、L3ネットワークをVMにアタッチできません。テナントの同期を実行してステータスを更新してください。", + "ORG_ZSTACK_SDNCONTROLLER_10023": "ネットマスクが指定されていたため、SDN controller[uuid:%s]のホスト[uuid:%s]を更新できませんでした", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10000": "バッチデータの整合性チェックが失敗しました。未対応のリソースタイプ: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10002": "整合性リソースの追加に失敗しました。未対応のリソースタイプ: %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10002": "テンプレートエラー: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10134": "VMNicの重み[%s]が無効な数値のため、バックエンドサーバーVMNicをサーバーグループ[UUID:%s]に追加できませんでした", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10008": "ID:%sの画像キャッシュの取得に失敗しました: GetImageHashValueReply.hashValueがnullです", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10009": "仮想マシンの環境問題により、画像キャッシュ[%s]の整合性検証が失敗しました", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10000": "このタイプの利用可能なテンプレートがありません: %s,", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10132": "VMNICが存在しないため、UUID:%sのVMNICをUUID:%sのサーバーグループに追加できませんでした", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10137": "NIC IP[ipAddress:%s]が重複しているため、バックエンドサーバーNICをサーバーグループ[uuid:%s]に追加できませんでした", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10003": "データ保護のencryptType[%s]が無効です", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10138": "リスナー[uuid:%s]がこのサーバーグループのネットワークインターフェースをすでにアタッチしているため、仮想マシンのネットワークインターフェース[uuid:%s]をサーバーグループ[uuid:%s]に追加できません", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10004": "スナップショット[uuid:%s]は仮想化環境で暗号化されていません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10135": "UUIDs:%sのL3ネットワークは、VM nicsに関連付けられていますが、ネットワークサービス:%sが有効になっていません", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10005": "ボリュームスナップショット[%s]の整合性検証が、状態の一貫性がないため失敗しました", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10136": "VM NICs [UUID: %s]は、すでにロードバランサーサーバーグループ[UUID: %s]に関連付けられています。", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10006": "暗号化エラー: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10139": "IP [IP Address:%s]がすでに登録されているため、バックエンドサーバーIPをサーバーグループ[UUID:%s]に追加できませんでした", + "ORG_ZSTACK_VMWARE_10097": "VCENTER[%s]が運用ステータスではありません。現在のステータス: %s", + "ORG_ZSTACK_VMWARE_10098": "vdiskが見つかりません: %s", + "ORG_ZSTACK_VMWARE_10095": "最近のタスクリストの取得に失敗しました。詳細: %s", + "ORG_ZSTACK_VMWARE_10096": "VCENTER_SERVER_NOT_FOUND", + "ORG_ZSTACK_VMWARE_10093": "vCenterバックアップストレージはイメージハッシュの計算をサポートしていません。", + "ORG_ZSTACK_VMWARE_10091": "%s の機能はクラウド環境ではまだサポートされていません。", + "ORG_ZSTACK_TAG_10011": "tag[uuid:%s] は固有のシステムタグであるため、削除できません。", + "ORG_ZSTACK_TAG_10012": "引数 'resourceType' が予期されるUUIDと一致しません。リソースタイプが正しくUUIDとして指定されていることを確認してください。", + "ORG_ZSTACK_VMWARE_10090": "イメージ %s がバッキングストアに見つかりません。イメージパスが正しいことを確認して、再試行してください。", + "ORG_ZSTACK_TAG_10010": "タグシステム %s にリソースタイプが見つかりません", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10010": "暗号化イメージキャッシュ[id:%s] 失敗: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10011": "nodeType %s の整合性ファイル[path:%s] は仮想化環境にすでに存在します", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10012": "無効なノードタイプ[%s]", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10013": "整合性ファイル[%s.%s]の追加に失敗しました。これはディレクトリです。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10141": "無効な重み[serverIp:%s, weight:%s]、重みは有効な範囲[%d, %d]内にありません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10143": "サーバーIP [uuid:%s] はすでにロードバランササーバーグループ [uuid:%s] に関連付けられています", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10148": "loadbalancerServerGroup [%s] は存在しません", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10014": "整合性ファイル[%s.%s]は存在しません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10149": "VMNicまたはIPアドレスがnullです。ネットワーク構成設定を確認してください。", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10015": "ホスト %s は存在しません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10146": "vmnicsはすべてサーバーグループ [%s] に関連付けられていません", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10000": "外部プライマリストレージ[uuid:%s, name:%s] は異常なステータスを返します: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10016": "%s のためシェル実行に失敗しました", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10001": "ボリュームのアクティブクライアントを検索[uuid:%s, mountPath %s, client:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10147": "サーバーIPはすべてサーバーグループ [%s] に関連付けられていません", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10017": "整合性検証ファイル[%s.%s]の追加に失敗しました。理由: %s", + "ORG_ZSTACK_VMWARE_10088": "vCenterバックアップストレージはイメージのダウンロードキャンセルをサポートしていません。", + "ORG_ZSTACK_VMWARE_10086": "%s リソースはすでにプロビジョニングされています", + "ORG_ZSTACK_VMWARE_10085": "予期しないプロトコル: %s", + "ORG_ZSTACK_VMWARE_10082": "%s にデータストアが接続されていません", + "ORG_ZSTACK_VMWARE_10083": "%s のデータストアが見つかりません", + "ORG_ZSTACK_VMWARE_10080": "vCenter[uuid=%s]は無効です。このvCenterでは読み取り操作のみを実行できます。設定変更を行うには、UpdateVCenterAction {uuid=%s state=Enabled}を使用してvCenter構成を更新してください。", + "ORG_ZSTACK_VMWARE_10081": "", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10021": "VCENTER[uuid=%s]は無効です。これらのVCENTERでは読み取り操作のみを実行できます。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10151": "", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10152": "暗号化スナップショット[uuid:%s]の失敗: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10150": "", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10155": "ネットワークインターフェース[uuid:%s]がすでに関連付けられているため、UUID:%sのサーバーグループをUUID:%sのリスナーに追加できませんでした。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10156": "", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10153": "サーバーIPアドレスがすでに登録されているため、サーバーインスタンス[uuid:%s]をリスナー[uuid:%s]に追加できませんでした。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10154": "", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10159": "サーバーグループ[uuid:%s]はすでにリスナー[uuid:%s]に追加されているため、追加できませんでした。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10157": "", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10158": "UDPリスナーはIPv4バックエンドアドレスをIPv6にマップできないため、サーバーグループ[uuid:%s]をリスナー[uuid:%s]に追加できませんでした。", + "ORG_ZSTACK_VMWARE_10078": "", + "ORG_ZSTACK_VMWARE_10076": "HTTPリダイレクトがHTTPSに有効になっているため、サーバーグループ[uuid:%s]をリスナー[uuid:%s]から削除できませんでした。", + "ORG_ZSTACK_VMWARE_10073": "", + "ORG_ZSTACK_VMWARE_10071": "UDPリスナーはIPv4とIPv6のVIPアドレスを同時に持つことができないため、サーバーグループ[uuid:%s]をリスナー[uuid:%s]に追加できませんでした。", + "ORG_ZSTACK_VMWARE_10072": "", + "ORG_ZSTACK_VMWARE_10070": "UDPリスナーはIPv6バックエンドアドレスをIPv4アドレスにマップできないため、サーバーグループ[uuid:%s]をリスナー[uuid:%s]に追加できませんでした。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10162": "", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10163": "サーバーグループ[uuid:%s]に関連付けられたロードバランサーが見つかりませんでした。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10160": "", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10161": "サーバーグループ[uuid:%s]はロードバランサー[uuid:%s]に登録されていないため、登録解除できませんでした。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10166": "", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10167": "ロードバランサーUuid [%s]は存在しません。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10164": "", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10165": "現在のクラウドコンピューティング環境ではこの操作はサポートされていません。リクエストがクラウドリソースでサポートされている操作と一致していることを確認してください。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10168": "", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10169": "VMの電源投入に失敗しました、タスクステータス: %s", + "ORG_ZSTACK_VPC_HA_10010": "", + "ORG_ZSTACK_COMPUTE_VM_10119": "インスタンス提供のオンライン変更が無効になっているため、仮想マシンはオンラインCPU/メモリの更新を実行できません。VMを停止してからCPU/メモリの更新を再試行してください。", + "ORG_ZSTACK_VPC_HA_10011": "HAグループの管理L3および公開L3ネットワーク[uuid:%s]が、提供されたL3ネットワーク[uuid:%s]と一致しません。", + "ORG_ZSTACK_VPC_HA_10012": "vPCルータのL3ネットワーク[UUID:%s]がHAグループのL3ネットワーク[UUID:%s]と一致しません。このルータを削除して再作成してください。", + "ORG_ZSTACK_VPC_HA_10013": "vPCルータが高可用性グループ[uuid:%s]にアタッチされました", + "ORG_ZSTACK_VPC_HA_10014": "vpc haグループ[uuid:%s]が存在しません", + "ORG_ZSTACK_VPC_HA_10015": "複数のvPCルータがHAグループ[uuid:%s]にアタッチされています", + "ORG_ZSTACK_VPC_HA_10016": "vPCルータ[UUID:%s]は、公開ネットワークが管理ネットワークと同一であるため、HAルータにアップグレードできません", + "ORG_ZSTACK_VPC_HA_10017": "高可用性グループ[uuid:%s]のアフィニティグループの作成に失敗しました", + "ORG_ZSTACK_VPC_HA_10018": "VPC HAグループ%s[uuid:%s]のインスタンス%s[uuid:%s]のhaステータスが%sから%sに変更されました", + "ORG_ZSTACK_VPC_HA_10019": "インスタンス[uuid:%s, name:%s, type:%s]のhaステータスが%sから%sに変更されました", + "ORG_ZSTACK_VPC_HA_10009": "ルータ[uuid:%s]のマスタルータが存在しません", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10000": "nfvインスタンスの初期化コマンドが失敗しました: %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10002": "NFVインスタンスVM[uuid:%s]のネットワークインタフェースファイアウォールデフォルトポリシーの変更に失敗しました。理由: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10053": "アクセス制御リストグループ[uuid:%s]はリダイレクトするように構成されていますが、一部のアクセス制御リストエントリにIPルールがありません。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10050": "ロードバランサーリスナー[UUID:%s]は%d個を超えるリダイレクトルールアクセス制御リストグループをアタッチできません。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10051": "ロードバランサーリスナー[uuid:%s]にアクセス制御リストグループ[uuid:%s]のリダイレクトルールが関連付けられています", + "ORG_ZSTACK_COMPUTE_VM_10118": "VM[UUID:%s]は最後の移行後も一時停止しています。再度移行を試みる前に再開してください。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10056": "ロードバランサーリスナー[uuid:%s]は%d個を超えるアクセス制御リストグループをアタッチできません", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10008": "この仮想マシンインスタンスタイプではデタッチはサポートされていません。", + "ORG_ZSTACK_COMPUTE_VM_10117": "UUID:%sのVMは既にUUID:%sのホストでホストされています", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10057": "サーバグループ[%s]はロードバランサーリスナー[%s]にアタッチされていません", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10007": "このNFVインスタンスタイプではプロビジョニング構成の更新はサポートされていません。", + "ORG_ZSTACK_COMPUTE_VM_10116": "イメージメディアタイプがISOの場合、rootDiskSizeを指定する必要があります。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10054": "アクセス制御リストグループ[uuid:%s]は既にロードバランサーリスナー[uuid:%s]に関連付けられています。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10055": "ロードバランサーリスナー[uuid:%s]には%sタイプのアクセス制御リストグループのみがアタッチされています。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10009": "この仮想化ネットワーク機能インスタンスタイプではクリーンデータはサポートされていません。", + "ORG_ZSTACK_COMPUTE_VM_10114": "現在のプラットフォーム%sはNIC.driverの更新をまだサポートしていません。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10004": "SSH設定の構成後、NFVインスタンス[%s]へのSSH接続を確立できません", + "ORG_ZSTACK_COMPUTE_VM_10113": "状態が[%s]である仮想Machine[uuid:%s]のCD-ROMを作成できません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10058": "acl[%s]はロードバランサーリスナー[%s]にアタッチされていません", + "ORG_ZSTACK_COMPUTE_VM_10112": "イメージ[name:%s, uuid:%s]はISOです。したがって、rootDiskSizeを指定する必要があります。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10006": "NFVインスタンスステータスの更新に失敗しました: %s", + "ORG_ZSTACK_COMPUTE_VM_10111": "インスタンスのCPUおよびメモリの割り当て設定が不足しています。続行するには、必要な値を指定してください。", + "ORG_ZSTACK_VPC_HA_10020": "HAグループのUUIDがnilです。設定を確認し、UUIDが正しく設定されていることを確認してください。", + "ORG_ZSTACK_COMPUTE_VM_10121": "VM[%s]が実行中の場合、容量を減らすことはできません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10060": "VM NIC [uuid:%s]はデフォルトのサーバグループ[uuid:%s]に既に関連付けられているため、VM NICをロードバランサリスナーに接続できませんでした。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10061": "UDPリスナーはIPv4とIPv6の仮想IPを同時に持つことはできません。リスナーにIPv4またはIPv6のどちらかを設定してください。", + "ORG_ZSTACK_COMPUTE_VM_10129": "%sはクラウド展開に有効なIPv4アドレスではありません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10068": "リダイレクトステータス[%s]は無効です。[有効なHTTPステータスコード]のみサポートしています", + "ORG_ZSTACK_COMPUTE_VM_10128": "VM[uuid:%s]が実行中のため、メモリサイズを減らすことはできません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10065": "リスナーには%d個を超えるアクセス制御リストグループを接続できません", + "ORG_ZSTACK_COMPUTE_VM_10127": "実行中のVM[uuid:%s]のCPUを減らすことはできません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10066": "ロードバランサーリスナー[%s]はセッション永続性状態の割り当てをサポートしていません", + "ORG_ZSTACK_COMPUTE_VM_10126": "VM[uuid:%s]の状態は%sです。CPUまたはメモリを更新できるのは[%s]の状態のみです。", + "ORG_ZSTACK_COMPUTE_VM_10125": "メモリのホットプラグインが無効になっているため、仮想マシンはメモリホットプラグイン操作を実行できません。仮想マシンを停止してから、メモリホットプラグイン操作を再度試みてください。", + "ORG_ZSTACK_COMPUTE_VM_10124": "CPUのホット追加が無効になっているため、仮想マシンはCPUホット追加を実行できません。VMを停止してから、CPUホット追加を再度試みてください。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10069": "ステータスコード[%s]は無効です。[クラウドコンピューティング環境における有効なステータスコード]のみサポートしています", + "ORG_ZSTACK_COMPUTE_VM_10122": "reservedMemorySize[%s]がmemorySize[%s]を超えています", + "ORG_ZSTACK_COMPUTE_VM_10132": "%sはクラウドリソース設定に有効なIPv6アドレスではありません", + "ORG_ZSTACK_COMPUTE_VM_10131": "IPアドレス[%s]は指定されたIP範囲[%s]内にありません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10074": "ロードバランサー[%s]リスナー[%s]はセッション永続性状態の割り当てをサポートしていません。明示的なiphash割り当てが必要です。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10075": "セッション永続性タイプ[%s]は無効です。%sのみサポートしています", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10072": "セッション永続性ステータス[%s]は無効です。%sのみサポートしています", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10073": "ロードバランサー[%s]リスナー[%s]はセッション永続性状態の割り当てをサポートしていません。明示的な無効化が必要です。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10078": "セッションCookie名[%s]が無効です。英数字とアンダースコアのみを含める必要があります", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10079": "ロードバランサー[%s]リスナー[%s]はアイドルタイムアウトとCookie名を同時に割り当てることはできません", + "ORG_ZSTACK_COMPUTE_VM_10139": "IPv6アドレスにはプレフィックス長を含める必要があります", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10076": "セッションアイドルタイムアウト[%s]が無効です。[%s〜%s]の正の整数である必要があります", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10077": "セッションCookie名[%s]が無効です。[%d]文字より短くする必要があります", + "ORG_ZSTACK_COMPUTE_VM_10137": "IPv4アドレスにはサブネットマスクが必要です", + "ORG_ZSTACK_COMPUTE_VM_10136": "静的IP [%s]の形式が正しくありません", + "ORG_ZSTACK_COMPUTE_VM_10135": "IPアドレスが指定されていないため、インスタンスのIPアドレスを設定できませんでした。ネットワーク設定を構成する前に、IPアドレスが提供されていることを確認してください。", + "ORG_ZSTACK_COMPUTE_VM_10134": "IPアドレス [%s]は、指定されたIP範囲[startIp %s, endIp %s]内にありません", + "ORG_ZSTACK_COMPUTE_VM_10133": "IPアドレス [%s]はすでにVM NIC [uuid:%s]に割り当てられています。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10081": "セッション永続化が無効になっている場合、loadBalancer[%s] listener[%s]はアイドルタイムアウトとcookie名の割り当てをサポートしていません", + "ORG_ZSTACK_COMPUTE_VM_10143": "VM [uuid:%s]の静的IP [%s]を解放できませんでした。存在しません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10082": "loadBalancer[%s] listener[%s]は、cookie名を指定せずにセッション永続化の上書きを割り当てることをサポートしていません", + "ORG_ZSTACK_COMPUTE_VM_10142": "VM[uuid:%s]にはL3ネットワーク[uuid:%s]に接続されたネットワークインターフェースがありません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10080": "loadBalancer[%s] listener[%s]は、アイドルタイムアウトとcookie名の割り当てをサポートしていません。セッション永続性を指定する必要があります。", + "ORG_ZSTACK_COMPUTE_VM_10140": "IPアドレス [%s]はすでにvmNicに割り当てられています", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10085": "loadBalancer[%s] listener[%s]は、ソースベースのロードバランシングアルゴリズムを使用する場合のセッション永続化ポリシーの割り当てをサポートしていません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10086": "loadBalancer[%s]は、listener[%s]のiphashを使用したセッション永続化の割り当てをサポートしていません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10083": "loadBalancer[%s] listener[%s]は、上書きモードを指定せずにセッション永続化のアイドルタイムアウトを割り当てることをサポートしていません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10084": "loadBalancer[%s] listener[%s]は、挿入モードを指定せずにcookieNameでセッション永続化を割り当てることをサポートしていません", + "ORG_ZSTACK_COMPUTE_VM_10149": "サポートされていないイメージメディアタイプ: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10087": "無効な最大接続数[%s]。指定された値は上限閾値%dを超えています", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10088": "ポートの競合loadBalancerPort[%s]。別のリスナー[uuid:%s]がそのポートを使用しています", + "ORG_ZSTACK_COMPUTE_VM_10147": "メモリスナップショットを持つVM %sは、ブートボリュームの設定をサポートしていません", + "ORG_ZSTACK_COMPUTE_VM_10146": "ボリューム[uuid:%s]は仮想マシーン[uuid:%s]に接続する必要があります", + "ORG_ZSTACK_COMPUTE_VM_10145": "このインスタンスのブートボリュームを共有可能として構成することはできません。", + "ORG_ZSTACK_COMPUTE_VM_10144": "ブート順序 %%s内の無効なブートデバイス[%%s]", + "ORG_ZSTACK_VMWARE_10024": "データストアが分離される前に同期できません", + "ORG_ZSTACK_VMWARE_10025": "vCenter[uuid:%s]でタスクが実行中です。後ほど再試行してください。", + "ORG_ZSTACK_VMWARE_10023": "vCenterへの接続に失敗しました: %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10008": "コントローラ[ip:%s]にVirtual Network Identifier (VNI)範囲が構成されていないため、SDNコントローラを初期化できませんでした", + "ORG_ZSTACK_VMWARE_10020": "仮想マシーン %sの利用可能なVNCポートがありません", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10009": "SDNコントローラ[ip:%s]からVNI範囲情報を取得できませんでした。原因是 %s", + "ORG_ZSTACK_VMWARE_10021": "vCenter %sのサービスインスタンスの取得に失敗しました。原因是 %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10092": "クラウドはロードバランサーリスナーの作成に失敗しました。TCPプロトコルのリスナーはTCPプロキシプロトコルのパラメータのみをサポートします。", + "ORG_ZSTACK_MEVOCO_10006": "クラウドコンピューティング環境でのvirtio-scsiボリューム[%s]のmultiQueues設定はサポートされていない操作です。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10093": "クラウドはTCPプロキシプロトコル%sのみをサポートしているため、ロードバランサーリスナーを作成できません", + "ORG_ZSTACK_MEVOCO_10005": "ルートボリューム[%s]に複数のキューを使用するように設定することはサポートされていない操作です", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10091": "HTTPSプロトコルのリスナーはHTTPバージョン[h1, h2]のみをサポートしているため、クラウドコンピューティングリソースの作成に失敗しました。リクエストの互換性を確認してください", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10010": "H3C VCFC V2コントローラーでH3CテナントUUIDが必須パラメータであるため、ハードウェアVXLANネットワークを作成できませんでした。必要なUUIDを提供して続行してください", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10096": "タイプ%sのロードバランサーリスナーは証明書を必要としません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10097": "ロードバランサーリスナー[uuid:%s]はすでに証明書[uuid:%s]を持っています", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10094": "[%s]プロトコルのリスナーはコンテンツ圧縮をサポートしていないため、クラウドはロードバランサーリスナーの作成に失敗しました", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10095": "クラウドは圧縮アルゴリズム[%s]のみをサポートしているため、ロードバランサーリスナーを作成できません", + "ORG_ZSTACK_MEVOCO_10007": "共有可能なボリュームの場合、サポートされる唯一のプライマリストレージタイプは%sで、現在%sです", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10015": "指定されたL2ネットワーク[uuid:%s]がVXLANネットワークプールインスタンスではないため、VNI範囲を作成できませんでした", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10016": "H3CコントローラーはVNIをVLAN IDとして使用するため、範囲は1-4094以内である必要があります。VNI値はVLAN ID規格に準拠する必要があります", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10017": "VNI範囲[%s-%s]は、SDNコントローラーで設定されたいずれのVNIによってもカバーされていないため、作成できませんでした", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10098": "証明書[uuid:%s]はロードバランサーリスナー[uuid:%s]に関連付けられていません", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10018": "SDNコントローラー[uuid:%s]が動作していないため、IPv6範囲を追加できませんでした。現在のステータス: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10099": "healthCheckターゲット[%s]エラーです。'default'または1~65535の範囲のポート番号である必要があります", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10011": "指定されたテナントがSDNコントローラーの管理システムに存在しないため、ハードウェアVXLANネットワークを作成できませんでした。テナントIDを確認し、クラウド環境で正しく構成されていることを確認してください", + "ORG_ZSTACK_MEVOCO_10002": "null VolumeQoSからIOPSモードが見つかりません", + "ORG_ZSTACK_VMWARE_10017": "L2[UUID:%s]はvCenter[UUID:%s]クラスター[UUID:%s]に属していません", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10012": "SDNコントローラー[ip:%s]が応答しなかったため、VXLANネットワークを作成できませんでした", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10013": "SDNコントローラー[IP:%s]でVXLANネットワークを作成できませんでした。理由: %s", + "ORG_ZSTACK_MEVOCO_10000": "ZStackは一時停止されており、読み取り専用操作以外のすべてのAPI呼び出しは拒否されます。読み取り専用以外の操作を続行する場合は、'%s'をsystemTagsに追加してください", + "ORG_ZSTACK_VMWARE_10015": "コンピュートクラスター%s内にホストが見つかりません", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10014": "SDNコントローラー[IP:%s]でVXLANネットワークを削除できませんでした。理由: %s", + "ORG_ZSTACK_VMWARE_10016": "vSwitch/dvSwitchが見つかりません: %s、または異なるESXホスト上のvSwitchが同じポートグループを持っていません", + "ORG_ZSTACK_VMWARE_10013": "NICドライバー%sは 아직 지원되지 않습니다", + "ORG_ZSTACK_VMWARE_10014": "クラスター[uuid:%s]とレイヤー2ネットワーク[uuid:%s]は異なるデータセンターに属しています", + "ORG_ZSTACK_VMWARE_10011": "domainName[%s]は有効なDNSホスト名またはIPアドレスではありません", + "ORG_ZSTACK_VMWARE_10012": "vCenter [ドメイン名:%s]が追加されました", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10019": "ネットワークCIDRによるIPv6範囲の追加に失敗しました。SDNコントローラー[uuid:%s]に接続されていないためです。現在のステータス: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10000": "このリクエストに使用可能なベアメタルゲートウェイが見つかりません。ベアメタルノードがクラウドコンピューティング環境正しく構成され、登録されていることを確認してください", + "ORG_ZSTACK_VMWARE_10010": "vCenterログインユーザー名が必要です。", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10002": "BareMetal2ゲートウェイリソースの割り当てに失敗しました", + "ORG_ZSTACK_CORE_DEBUG_10000": "タスク情報(%s)がクラウドコンピューティング環境に見つかりません。すべての必要なタスクの詳細が適切に構成されアップロードされていることを確認してください。", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10020": "SDNコントローラー[uuid:%s]が接続されていないため、IP範囲を追加できませんでした。現在のステータス:%s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10021": "SDNコントローラー[uuid:%s]が接続されていないため、ネットワークCIDRによるIP範囲を追加できませんでした。現在のステータス:%s", + "ORG_ZSTACK_MEVOCO_10014": "無効なネットワーク帯域幅[%s]です。数値ではありません", + "ORG_ZSTACK_MEVOCO_10019": "無効なボリューム帯域幅[%s]です。1024 Mbps以上である必要があります", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10028": "SDNコントローラー[ip:%s]が応答しなかったため、テナントを取得できませんでした", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10029": "SDNコントローラー[ip:%s]にデフォルトテナントが構成されていないため、SDNコントローラーを初期化できませんでした", + "ORG_ZSTACK_VMWARE_10009": "ESXホスト[ESXi Version:%s]上の仮想マシン[UUID:%s]ではコンソールパスワードがサポートされていません", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10022": "H3C VCFC V2 SDNコントローラーはLayer 3ネットワーキングをサポートしていないため、Layer 3ネットワークを作成できません[type:%s, category:%s]", + "ORG_ZSTACK_MEVOCO_10013": "無効なネットワーク帯域幅[%s]です。%d Mbps以上である必要があります", + "ORG_ZSTACK_VMWARE_10006": "VM[%s]のルートディスク使用率統計の取得に失敗しました", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10023": "H3C VCFC V2コントローラーではテナントUUIDが必須パラメータであるため、ハードウェアVXLANネットワークを作成できませんでした。提供されていることを確認してください。", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10024": "H3C VCFC V1コントローラーにはVDS UUIDシステムタグが必須であるため、H3C VCFCコントローラーを追加できませんでした", + "ORG_ZSTACK_VMWARE_10005": "インストールパスからVMインスタンスを取得できませんでした:%s", + "ORG_ZSTACK_VMWARE_10002": "仮想データセンターが見つかりません", + "ORG_ZSTACK_VMWARE_10000": "仮想ディスク管理サービスが見つかりません", + "ORG_ZSTACK_VMWARE_10001": "クラウドストレージ操作用のファイルマネージャーが構成されていません。有効なファイルマネージャーが%s操作を処理するように設定されていることを確認してください。", + "ORG_ZSTACK_VPC_HA_VYOS_10000": "仮想ルーター[uuid:%s]でHAを有効化できませんでした、%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10011": "NFVインスタンス[uuid:%s]は%sのステータスにあり、%sへのHTTP呼び出しを実行できません", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10010": "NFVインスタンス[name:%s, UUID:%s, 現在の状態:%s]は実行されていないため、必要な操作を実行できません。インスタンスが実行中になったら操作を再試行してください。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10013": "ネットワークインターフェース[ip:%s, mac:%s]をNFVインスタンス[uuid:%s ip:%s]に追加できません、%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10012": "NFVインスタンス[uuid:%s]には、%sへのHTTP呼び出しを実行できる管理ネットワークインターフェースがありません", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10004": "ソフトウェア定義ネットワーク(SDN)コントローラー[ip:%s]のプライマリノードを判別できませんでした。理由:%s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10005": "SDNコントローラー[IP:%s]が応答しなかったため、認証できませんでした", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_10000": "vm[uuid:%s]ストレージ移行 장기 실행 작업[uuid:%s]が管理ノードの再起動により失敗しました", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10006": "SDNコントローラー[IP:%s]で認証できませんでした。理由:%s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10007": "SDNコントローラー[ip:%s]が応答しなかったため、VNI範囲情報を取得できませんでした", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10000": "SDNコントローラーでのサブネット作成に失敗したため、IP範囲を追加できませんでした。ネットワーク構成を確認するか、サポートにお問い合わせください。", + "ORG_ZSTACK_COMPUTE_VM_10103": "L3ネットワークに変更できません。L3ネットワーク[uuid:%s]はシステムネットワークであり、VMはユーザーVMです。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10015": "フローデータパラメータにVMInstanceSpecが見つかりません。すべての必須仕様が含まれていることを確認してください。", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10001": "ネットワークにIP範囲を追加できませんでした(理由: %s)", + "ORG_ZSTACK_COMPUTE_VM_10102": "L3ネットワークに切り替えることができません。UUID [uuid:%s]のL3ネットワークは無効です", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10014": "画像[UUID:%s]を削除できません。NFVインスタンスグループ[UUID:%s]によって使用されています", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10002": "レイヤー3ネットワークからIP範囲を削除できませんでした(理由: %s)", + "ORG_ZSTACK_COMPUTE_VM_10101": "非ゲストL3ネットワークに切り替えることができません。UUID [uuid:%s]のL3ネットワークはVM [uuid: %s]にすでに関連付けられています", + "ORG_ZSTACK_COMPUTE_VM_10100": "L3ネットワークに変更できません。UUID [uuid:%s]のL3ネットワークはUUID [%s]のVMにすでに接続されています", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10003": "SDNコントローラー[IP:%s]が応答しなかったため、クラスターリーダーを特定できませんでした", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10016": "VMインスタンス仕様にVMインベントリまたはUUIDがnullです", + "ORG_ZSTACK_PORTMIRROR_10008": "PortMirrorサービスは、ハイバーバータイプのためNIC [%s]をサポートしていません", + "ORG_ZSTACK_PORTMIRROR_10009": "PortMirrorサービスは、VMのデフォルト以外のインターフェースではないNIC [%s]にミラーリングできません", + "ORG_ZSTACK_ZWATCH_API_10019": "クエリ期間は%sを超えることができません", + "ORG_ZSTACK_COMPUTE_VM_10198": "共有可能なボリュームからVMインスタンスを作成できません。ボリュームが共有可能として設定されていないことを確認して、再試行してください", + "ORG_ZSTACK_PORTMIRROR_10000": "無効なパラメータ [%s]、有効なPort Mirroring Networkを参照していることを確認してください", + "ORG_ZSTACK_COMPUTE_VM_10197": "次のプロパティのいずれかを設定する必要があります: %s", + "ORG_ZSTACK_PORTMIRROR_10001": "ネットワーク[%s]はPort Mirroringサービスに関連付けられています", + "ORG_ZSTACK_ZWATCH_API_10028": "アカウント[uuid: %s]にはリソース[uuid: %s]の権限がありません", + "ORG_ZSTACK_COMPUTE_VM_10196": "次のプロパティを同時に設定することはできません: %s", + "ORG_ZSTACK_PORTMIRROR_10002": "Port Mirroringサービス[%s]は作成されていません", + "ORG_ZSTACK_PORTMIRROR_10003": "NIC [%(device_id)s, %(network_interface_id)s]はサービス[%(service_id)s]によってミラーリングされています", + "ORG_ZSTACK_COMPUTE_VM_10194": "インスタンスに対して次のいずれかを指定する必要があります: msg内のアーキテクチャまたは画像[uuid:%s]", + "ORG_ZSTACK_PORTMIRROR_10004": "NIC[%s]はサービス[%s]でミラーリングできません", + "ORG_ZSTACK_ZWATCH_API_10025": "無効なラベル[%s]、クラウドリソースの有効なクエリ可能ラベルは%sです", + "ORG_ZSTACK_COMPUTE_VM_10193": "ゲストオペレーティングシステムに対して次のいずれかを指定する必要があります: msg内のfield guestOsTypeまたは画像[uuid:%s]", + "ORG_ZSTACK_ZWATCH_API_10024": "メトリック[%s]にはフィルター[%s]がありません", + "ORG_ZSTACK_COMPUTE_VM_10192": "メッセージまたは画像[uuid:%s]に対して次のいずれかを指定する必要があります: platformまたはimageID", + "ORG_ZSTACK_PORTMIRROR_10007": "PortMirrorサービスはNIC[%s]のミラーリングをサポートしていません", + "ORG_ZSTACK_ZWATCH_API_10021": "メトリック[%s]をネームスペース[%s]で見つけられません", + "ORG_ZSTACK_COMPUTE_VM_10199": "接続されたボリュームからVMインスタンスを作成できませんでした。ボリュームが使用可能な状態であることを確認して、再試行してください", + "ORG_ZSTACK_PORTMIRROR_10011": "PortMirrorサービスは、nic[%s]からnic[%s]へのミラートンネルを確立できません。ミラーネットワーク[%s]が無効です。", + "ORG_ZSTACK_PORTMIRROR_10012": "PortMirrorサービスは、ネットワークインターフェース[%s]をそれ自体にミラーリングできません", + "ORG_ZSTACK_ZWATCH_API_10039": "ラベルのJSON形式が無効です。labelsJsonStrが正しくフォーマットされていることを確認してください。", + "ORG_ZSTACK_PORTMIRROR_10013": "PortMirrorサービスは、QoS(Quality of Service)が 구성된ネットワークインターフェースと互換性がありません。", + "ORG_ZSTACK_ZWATCH_API_10038": "名前空間[%%s]にはメトリクス[%%s]が存在しません", + "ORG_ZSTACK_PORTMIRROR_10014": "hypervisorからポートミラーセッション[%s]の削除に失敗しました。詳細:%s", + "ORG_ZSTACK_ZWATCH_API_10037": "システムに名前空間が定義されていません", + "ORG_ZSTACK_PORTMIRROR_10015": "hypervisorからポートミラーセッション[%s]の解放に失敗しました。詳細:%s", + "ORG_ZSTACK_ZWATCH_API_10036": "URL形式が無効です。http(s)で始まる必要があります。", + "ORG_ZSTACK_PORTMIRROR_10016": "セッション[uuid:%s]の内部IDが見つかりません。ホストでセッション制限を超えていませんか?", + "ORG_ZSTACK_ZWATCH_API_10033": "endTime[%s, %sms]はstartTime[%s, %sms]より前であってはなりません", + "ORG_ZSTACK_ZWATCH_API_10032": "メトリクス[%s]のラベルには[%s]が含まれていません", + "ORG_ZSTACK_ZWATCH_API_10031": "名前空間[%s]が見つかりません", + "ORG_ZSTACK_ZWATCH_API_10030": "名前空間がallに設定されている場合、メトリクスとラベルの指定はサポートされていません。", + "ORG_ZSTACK_PORTMIRROR_10010": "PortMirrorサービスは、VMのインターフェースではないNIC [%s]をミラーリングできません。", + "ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10009": "ホスト[uuid:%s]からPCIデバイス情報の取得に失敗しました", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10030": "SDNコントローラー[ip:%s]との通信問題により、デフォルトテナントを取得できませんでした", + "ORG_ZSTACK_ZWATCH_API_10046": "時間間隔が%d日を超えています", + "ORG_ZSTACK_ZWATCH_API_10045": "endTime[%s]はstartTime[%s]より前であってはなりません", + "ORG_ZSTACK_ZWATCH_API_10044": "インスタンス[%s]が無効です", + "ORG_ZSTACK_ZWATCH_API_10043": "ECSインスタンスのアラート確認レコードが存在しません", + "ORG_ZSTACK_ZWATCH_API_10042": "startTime[%s]がendTime[%s]より後です", + "ORG_ZSTACK_ZWATCH_API_10041": "プラットフォーム[url=%s]は既に存在します", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10033": "SDNコントローラー[ip:%s]が応答しなかったため、VXLANネットワークを削除できませんでした", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10004": "操作エラー、VIP %sはVMインスタンスにバインドされていません", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10000": "ポートフォワーディングルール[vip ip: %s, private ip: %s, vip start port: %d, vip end port: %d, private start port: %d, private end port: %d]の作成に失敗しました。理由:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10001": "ポートフォワーディングルール%sの取消に失敗しました。理由:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10002": "仮想ルーター[name: %s, uuid: %s]が提供するポートフォワーディングルールの同期に失敗しました。理由:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10003": "L3ネットワーク[uuid:%s](ゾーン[uuid:%s])に仮想ルーターオファリング[uuid:%s]が見つかりました。しかし、ネットワークのパブリックネットワーク[uuid:%s]はポートフォワーディングルール[uuid:%s]と一致しません。システムタグguestL3Network::l3NetworkUuidを使用して特定の仮想ルーターオファリングを指定する必要があるかもしれません。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10004": "仮想ルーターはポートフォワーディング範囲リダイレクトをサポートしていません。VIPポートの開始はプライベートポートの開始と等しく、VIPポートの終了はプライベートポートの終了と等しい必要があります。しかし、このルールは範囲が一致しません:VIPポート[%s, %s]、プライベートポート[%s, %s]。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10005": "バーチャルルーター[uuid:%s]へのポート転送の追加に失敗しました、%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10006": "バーチャルルーター[uuid:%s]からのポート転送の取り消しに失敗しました、エラー: %s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10003": "セカンダリストレージデバイスの削除に失敗しました、理由:%s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10004": "ホスト[UUID:%s]からMTTYデバイス情報の取得に失敗しました", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10001": "数量を超えました。デバイス[uuid: %s]は許可された数量[%d]を超える数のSEデバイスを必要としています。", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10002": "ストレージデバイスの生成に失敗しました、理由:%s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10000": "指定されたパーツ番号[value:%s]は、このクラウド環境において有効なインスタンスIDではありません。", + "ORG_ZSTACK_CORE_CLOUDBUS_10021": "メッセージが正しいJSON形式ではありません、%s", + "ORG_ZSTACK_COMPUTE_VDPA_10009": "%sのみがvdpaアクセラレーション技術をサポートします", + "ORG_ZSTACK_COMPUTE_VDPA_10007": "PCIデバイス[uuid:%s]を生成できませんでした、別のL2インスタンス[uuid:%s]がクラスターに接続された物理ネットワークインターフェースを使用しています", + "ORG_ZSTACK_COMPUTE_VDPA_10006": "PCIデバイス[uuid:%s]を削除できませんでした、別のL2インスタンス[uuid:%s]がクラスターに接続された物理ネットワークインターフェースを使用しています", + "ORG_ZSTACK_COMPUTE_VDPA_10005": "KVMホスト[uuid:%s]上のl2Network[uuid:%s, type:%s]のブリッジ[%s]の削除に失敗しました、理由:%s", + "ORG_ZSTACK_COMPUTE_VDPA_10004": "KVMホスト[uuid: %s]上のl2NoVlanNetwork[uuid:%s, name:%s]のブリッジ[%s]の確認に失敗しました、%s", + "ORG_ZSTACK_COMPUTE_VDPA_10003": "KVMホスト[uuid:%s]上のl2Network[uuid:%s, type:%s]のブリッジ[%s]の作成に失敗しました、理由:%s", + "ORG_ZSTACK_COMPUTE_VDPA_10002": "移行先ホスト[uuid:%s]からVM[uuid:%s]のvdpaをリストアします", + "ORG_ZSTACK_COMPUTE_VDPA_10001": "移行先ホスト[uuid:%s]上のVM[uuid:%s]のvdpaデバイスを解放します", + "ORG_ZSTACK_COMPUTE_VM_10152": "VM[uuid:%s]は複数のISOに接続されています。detach時にはisoUuidを指定してください。", + "ORG_ZSTACK_COMPUTE_VM_10151": "VM[uuid:%s]はISO CD-ROM[uuid:%s]をマウントしています", + "ORG_ZSTACK_COMPUTE_VM_10150": "UUID:%sのvirtualCDROMは存在しません", + "ORG_ZSTACK_COMPUTE_VM_10159": "レイヤー3ネットワークを接続できません。レイヤー3ネットワーク [uuid:%s]は、まだどのクラスターにも接続されていないレイヤー2ネットワーク [uuids:%s]に属しています。", + "ORG_ZSTACK_COMPUTE_VM_10158": "レイヤー3ネットワークを接続できません。指定されたL3ネットワーク [uuid:%s]は、別のレイヤー2ネットワーク [uuids:%s]に属しています。", + "ORG_ZSTACK_COMPUTE_VM_10157": "レイヤー3ネットワークを接続できません。指定されたレイヤー3ネットワーク [uuid:%s]にはIP範囲が定義されていません。", + "ORG_ZSTACK_COMPUTE_VM_10156": "レイヤー3ネットワークを接続できません。VM [uuid: %s]は実行中または停止状態ではありません。現在の状態は%sです", + "ORG_ZSTACK_COMPUTE_VDPA_10015": "VM[uuid:%s]のホスト[uuid:%s]へのvDPAsの確保に失敗しました:%s", + "ORG_ZSTACK_COMPUTE_VDPA_10013": "VM[UUID:%s]のホスト[UUID:%s]上のvDPAsの削除に失敗しました:%s", + "ORG_ZSTACK_COMPUTE_VDPA_10012": "ホスト [UUID:%s]のL2ネットワーク [UUID:%s]はSRIOV仮想化されていません", + "ORG_ZSTACK_COMPUTE_VDPA_10011": "クラスター[uuid:%s]はovs-dpdkをサポートしていません", + "ORG_ZSTACK_COMPUTE_VDPA_10010": "物理インターフェース:[%s]のvSwitchを作成できません。すでに別のvSwitchタイプで使用されています。", + "ORG_ZSTACK_COMPUTE_VM_10163": "レイヤー3ネットワークを接続できません。UUID [uuid:%s]のレイヤー3ネットワークはシステムネットワークですが、VMはユーザーVMです。", + "ORG_ZSTACK_COMPUTE_VM_10162": "レイヤー3ネットワークを接続できません。UUID [%s]のレイヤー3ネットワークは無効です", + "ORG_ZSTACK_COMPUTE_VM_10161": "ゲスト以外のL3ネットワークを仮想マシンにアタッチできません,因为它はすでに別の仮想マシンにアタッチされています (uuid: %s)", + "ORG_ZSTACK_COMPUTE_VM_10160": "Layer 3ネットワークをアタッチできません。指定されたLayer 3ネットワーク [uuid:%s] はすでに仮想マシン [uuid: %s] にアタッチされています。", + "ORG_ZSTACK_COMPUTE_VM_10168": "静的IP [%s] はすでにLayer 3ネットワーク [uuid:%s] 上のリソースに割り当てられています。", + "ORG_ZSTACK_COMPUTE_VM_10167": "静的IP [%s] はLayer 3ネットワーク [uuid:%s] のIP範囲内にありません。", + "ORG_ZSTACK_COMPUTE_VM_10166": "静的IP L3 UUID[%s] はNIC L3リスト [%s] に含まれていません", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10009": "IAM2ProjectVO[uuid:%s] は%s状態にありません。状態変更は許可されていません", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10008": "プロジェクト [UUID:%s, Name:%s] にはすでにログイン有効期限戦略が設定されています。", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10007": "日付または時間[%s]が無効です。它は現在のタイムスタンプ[%s]より前であってはなりません", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10006": "支出値[%s]が無効です。例:10.001のような形式でなければなりません", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10005": "支出値[%s]が無効です。支出値は0と%fの間でなければなりません", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10004": "時間[%s]が無効です。10m、1h、2dなどの形式でなければなりません", + "ORG_ZSTACK_CORE_CLOUDBUS_10001": "タイプ[%s]のwebhookでは、opaqueフィールドをnullにできません", + "ORG_ZSTACK_COMPUTE_VM_10176": "NICをアタッチできません。它的L2ネットワーク [uuid:%s] はコンピュートクラスタにアタッチされていません。", + "ORG_ZSTACK_ZWATCH_API_10007": "dataStartTimeおよびdataEndTimeパラメータは省略できません。它们が提供されていることを確認してください。", + "ORG_ZSTACK_COMPUTE_VM_10175": "NICをアタッチできません。它的Layer 3ネットワーク [uuid:%s] はシステムネットワークですが、VMはユーザーVMです。", + "ORG_ZSTACK_ZWATCH_API_10006": "dataUuidは省略できません", + "ORG_ZSTACK_COMPUTE_VM_10174": "NICをアタッチできません。它的Layer 3ネットワーク [uuid:%s] は無効です", + "ORG_ZSTACK_COMPUTE_VM_10173": "NICをゲスト以外のL3ネットワークにアタッチできません。L3ネットワーク [uuid:%s] はすでにVM [uuid:%s] にアタッチされています。", + "ORG_ZSTACK_COMPUTE_VM_10172": "UUID [%s] のL3ネットワークはすでに別のVM (UUID [%s]) にアタッチされています。新しいVMにアタッチするには、まず既存のVMからデタッチしてください。", + "ORG_ZSTACK_COMPUTE_VM_10171": "NICはすでにVM [UUID: %s] にアタッチされています。再度アタッチしようとしないようにしてください。", + "ORG_ZSTACK_COMPUTE_VM_10170": "NICをアタッチできません。VM[uuid: %s] は実行中または停止状態ではありません。現在の状態は%sです", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10011": "プロジェクト [UUID:%s, Name:%s] にはすでに退職ポリシーが定義されています。", + "ORG_ZSTACK_COMPUTE_VM_10179": "L3ネットワークをVM [uuid: %s] からデタッチできません。VMは実行中または停止状態ではありません。現在の状態は%sです", + "ORG_ZSTACK_COMPUTE_VM_10178": "ネットワークインターフェース [uuid: %s] の状態を更新できませんでした。サポートされていないネットワークインターフェースタイプ [%s] のためです", + "ORG_ZSTACK_CORE_UPGRADE_10000": "Api: %sはallowedApiListGrayscaleUpgradingに従って許可されていません:%s。", + "ORG_ZSTACK_CORE_UPGRADE_10003": "エージェントバージョンが見つかりません。グレースケールアップグレード中はクラスタOSのアップグレードはサポートされていません。アップグレードプロセスを開始する前に、エージェントバージョンがインストールされていることを確認してください。", + "ORG_ZSTACK_CORE_UPGRADE_10002": "クラスタ全体のホストのOSを更新したい場合は、%sによってグレースケールアップグレードを無効にしてください。あるいは、特定のホストUUIDでクラスタOSを更新してみてください。", + "ORG_ZSTACK_CORE_UPGRADE_10004": "Host[UUID: %s] エージェントバージョンはアップグレードされていません。OSを更新する前にホストを再接続してください。", + "ORG_ZSTACK_ZWATCH_API_10008": "dataStartTime[%s] はdataEndTime[%s]より後です", + "ORG_ZSTACK_COMPUTE_VM_10187": "imageUuidがnullの場合、placeholder_for_image_uuidが不足しています", + "ORG_ZSTACK_COMPUTE_VM_10186": "ルートディスクがありません。インスタンスにルートボリュームが接続されていることを確認してください。", + "ORG_ZSTACK_COMPUTE_VM_10185": "データディスクの構成が無効です。dataDiskSizesで指定されたサイズは0より大きくなければなりません。", + "ORG_ZSTACK_COMPUTE_VM_10182": "ルートボリュームの設定が無効です", + "ORG_ZSTACK_COMPUTE_VM_10181": "イメージのメディアタイプはISOですが、ルートディスクの設定がありません", + "ORG_ZSTACK_COMPUTE_VM_10180": "vm[uuid:%s]は、ステータスがRunningまたはStoppedのときにのみボリュームを接続できます。現在のステータスは%sです。", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10003": "日付[%s]が無効です。yyyy-MM-dd HH:mm:ss ZZZの形式でなければなりません", + "ORG_ZSTACK_ZWATCH_API_10010": "namespace名は%sなどの予約キーワードで始めることはできません", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10002": "means[%s]が無効です。クラウド環境のリソースクォータまたはメトリクスを指定するために使用できます", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10001": "パラメータの値が無効です、%s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10000": "リソースリミットに無効な値が指定されました。'at'、'after'、または'exceed'接尾辞のない数値を指定してください。有効な数値を入力してください。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10030": "PXEサーバのDHCPインターフェース%sが存在しないか、IPアドレスがありません。", + "ORG_ZSTACK_NETWORK_OVN_10012": "ネットワークインターフェース[%s]にIPアドレス[%s]があるため、SDNホストを追加できません", + "ORG_ZSTACK_NETWORK_OVN_10011": "NIC[%s]がSR-IOV仮想化状態のため、SDNホストを追加できません", + "ORG_ZSTACK_NETWORK_OVN_10010": "NIC[%s]のタイプ[%s]がLinuxボンディングに使用されているため、SDNホストを追加できません", + "ORG_ZSTACK_NETWORK_OVN_10016": "KVMホストのみがOVS DPDKをサポートするため、SDNホストの追加に失敗しました。", + "ORG_ZSTACK_APIMEDIATOR_10000": "同じホスト(ホスト名:%s)に複数のバックアップストレージインスタンスが識別されました。バックアップストレージ[SftpBackupStorage hostname:%s]が既に存在します。追加するバックアップストレージのタイプは%sです。", + "ORG_ZSTACK_NETWORK_OVN_10015": "ボンディングモード[%s]がOVNでサポートされていないため、SDNホストを追加できません", + "ORG_ZSTACK_NETWORK_OVN_10014": "NIC[%s]がVXLAN VTEPインターフェースに使用されているため、SDNホストを追加できません", + "ORG_ZSTACK_NETWORK_OVN_10013": "NIC[%s]がL2ネットワーク[name:%s]に接続されているため、SDNホストを追加できません", + "ORG_ZSTACK_APIMEDIATOR_10001": "同じホスト(ホスト名:%s)に複数のバックアップストレージサービスが実行されています。イメージストアバックアップストレージサービス[hostname:%s]が存在します。追加するバックアップストレージのタイプは%sです。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10031": "%s ~ %sはDHCPインターフェース%sへの接続を確立できません", + "ORG_ZSTACK_NETWORK_OVN_10019": "UUID [%s]のホストはクラスタUUID [%s]でヒュージページが有効になっていないため、SDNコントローラに追加することが許可されていません。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10032": "クラスタ[uuid:%s]とpxeserver[uuid:%s]は同一个ゾーン内にありません", + "ORG_ZSTACK_NETWORK_OVN_10018": "ネットワークマスクが指定されていないため、SDNホストを追加できません。%s", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10033": "クラスタ[uuid:%s]はベアメタルクラスタではありません", + "ORG_ZSTACK_NETWORK_OVN_10017": "VTEP IPが構成されていないため、SDNホストを追加できません。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10034": "ベアメタルPXEサーバ[uuid:%s]はすでにクラスタ[uuid:%s]に接続されています", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10035": "ベアメタルPXEサーバ[UUID: %s]はクラスタ[UUID: %s]のベアメタルインスタンスと互換性がありません。既存のNIC IP %sがPXEサーバのDHCP範囲(%s ~ %s)外にあります。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10036": "ベアメタルPXEサーバ[UUID: %s]はクラスタ[UUID: %s]に関連付けられていません", + "ORG_ZSTACK_STORAGE_MIGRATION_10030": "接続先プライマリストレージは、ソースクラスタと同じレベル2ネットワークを共有するクラスタに接続されていません。", + "ORG_ZSTACK_STORAGE_MIGRATION_10033": "共有ボリューム[uuid: %s, name: %s]が接続されている間、ストレージマイグレーションはサポートされていません", + "ORG_ZSTACK_STORAGE_MIGRATION_10034": "ボリュームをソースインスタンスからターゲットインスタンスに移行できません。", + "ORG_ZSTACK_STORAGE_MIGRATION_10031": "ボリューム[UUID:%s]は依然としてVM[UUID:%s]に接続されています。移行前に接続を切断してください。", + "ORG_ZSTACK_STORAGE_MIGRATION_10032": "仮想マシン[vmuuid:%s]が停止していない場合、共有ブロックプライマリストレージ間でデータボリューム[uuid:%s]を移行できません。", + "ORG_ZSTACK_STORAGE_MIGRATION_10035": "ボリューム[%s]の状態が無効のため移行できません", + "ORG_ZSTACK_STORAGE_MIGRATION_10036": "ブロックベースのライブマイグレーションに利用可能なホストがありません: %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10019": "UUID:%sのSNSTextTemplateが見つかりません。クラウドストレージから削除された可能性があります。", + "ORG_ZSTACK_NETWORK_OVN_10023": "仮想マシンに関連付けられたホスト[uuid:%s]がSDNコントローラ[uuid:%s]に接続されていないため、vmnicをl3network[uuid:%s]に変更できませんでした", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10028": "%sへの接続を確立できませんでした。ZStack管理ノードとベアメタルPXEサーバー間のネットワーク設定を確認してください", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10016": "アプリケーションプラットフォーム/エンドポイント[%s]はユーザー定義テンプレートをサポートしていません", + "ORG_ZSTACK_NETWORK_OVN_10022": "SDNコントローラ[UUID:%s]が見つからなかったため、VMNICをL3ネットワーク[UUID:%s]に変更できませんでした", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10029": "%sの/opt/zstack-dvd以下にローカルリポジトリが見つかりません。まずzStack ISOをダウンロードしてローカルリポジトリを作成してください。", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10015": "無効なアプリケーションプラットフォームタイプ[%s]", + "ORG_ZSTACK_NETWORK_OVN_10021": "VMのホスト[uuid:%s]がSDNコントローラ[uuid:%s]に接続されていないため、L3ネットワークをVMに接続できませんでした", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10018": "トピック[uuid:%s]が見つかりません", + "ORG_ZSTACK_NETWORK_OVN_10020": "SDNコントローラ[uuid:%s]が見つからなかったため、L3ネットワークをVMに接続できませんでした", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10017": "パラメータ: %sはZStackでサポートされていません。利用可能なパラメータ値は: %s", + "ORG_ZSTACK_NETWORK_OVN_10026": "SDNコントローラ[uuid:%s, ip:%s]へのネットワークQoS設定の同期に失敗しました。理由: %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10011": "SMSテンプレートコードは13文字の文字列である必要があります。しかし、提供されたイベントテンプレートコード: [%s]は[%d]文字です。", + "ORG_ZSTACK_NETWORK_OVN_10025": "OVNコントローラ[uuid:%s, ip:%s]からNIC QoSの取得に失敗しました。理由: %s", + "ORG_ZSTACK_NETWORK_OVN_10024": "OVNコントローラ[uuid:%s, ip:%s]でのNIC QoS設定に失敗しました。理由: %s", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10020": "ベアメタルサーバーでサポートされていないバックアップストレージタイプ", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10010": "SMSテンプレートコードの長さは13文字である必要があります。受け取ったアラートテンプレートコード: [%s]は[%d]文字です。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10023": "PXEサーバのDHCP範囲ネットマスク%sは仮想マシン展開に対して無効です。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10024": "PXEサーバのDHCP範囲開始%sと範囲終了%sは同一のサブネットマスクに属していません。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10025": "ホスト名を持つPXEサーバーはすでに存在します。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10026": "管理IP%sを持つBaremetal2ゲートウェイがすでに存在します。ベアメタルPXEサーバーの作成には使用しないでください。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10027": "storagePathは仮想ファイルシステム内の完全な場所を指定する絶対パスである必要があります。", + "ORG_ZSTACK_STORAGE_MIGRATION_10022": "ソースバックアップストレージ[uuid:%s]内にイメージ[uuid:%s]が見つかりません。", + "ORG_ZSTACK_STORAGE_MIGRATION_10023": "イメージをソースの場所から宛先の場所に移行できません。", + "ORG_ZSTACK_STORAGE_MIGRATION_10020": "ソースブロックストレージとデスティネーションブロックストレージは無効にしてはなりません。", + "ORG_ZSTACK_STORAGE_MIGRATION_10021": "イメージ[uuid:%s]は Ready 状態ではないため、移行できません。", + "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10001": "ホスト %s のハートビートが受信されていません", + "ORG_ZSTACK_STORAGE_MIGRATION_10026": "ボリューム[uuid:%s]は Ready 状態ではないため、移行できません。", + "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10000": "ホスト UUID[%s] とプライマリストレージ UUID[%s] のホスト ID が見つかりません", + "ORG_ZSTACK_STORAGE_MIGRATION_10027": "仮想マシンインスタンスが停止状態でない場合、ルートボリュームを移行できません。ルートボリュームを移行する前に、インスタンスが停止していることを確認してください。", + "ORG_ZSTACK_STORAGE_MIGRATION_10024": "ボリューム[uuid:%s]は既にプール[uuid:%s]に存在するため、移行できません。", + "ORG_ZSTACK_STORAGE_MIGRATION_10025": "ソースとデスティネーションの PowerShell セッションは、Disabled 状態や Maintenance 状態にしてはなりません。", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10009": "Alibaba Cloud SMS サインの長さは 2 文字から 12 文字の間である必要があります。サイン: [%s] は [%d] 文字です。", + "ORG_ZSTACK_STORAGE_MIGRATION_10028": "共有ボリュームがアタッチされている場合、VM[uuid:%s, name: %s] のストレージライブマイグレーションはサポートされていません。", + "ORG_ZSTACK_STORAGE_MIGRATION_10029": "データボリュームがアタッチされている VM インスタンスのルートボリュームは移行できません。ルートボリュームを移行する前に、すべてのデータボリュームをデタッチしてください。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10017": "イメージ[uuid:%s]のベアメタルキャッシュのマウントに失敗しました", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10019": "イメージ[uuid:%s]のベアメタルイメージキャッシュに十分な空き容量がありません", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10011": "PXE サーバー[uuid:%s]上でシャーシ[uuid:%s]の DHCP 設定の作成に失敗しました", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10012": "PXE サーバー[uuid:%s]上でシャーシ[uuid:%s]の DHCP 設定の削除に失敗しました", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10013": "ベアメタル PXE サーバーエージェントの UUID が変更されました [期待値: %s, 実際の値: %s]。これはエージェントの手動再起動による可能性が高いです。状態を同期するには再接続してください。", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10005": "ダッシュボード内にディレクトリが見つかりません: %s", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10016": "ベアメタル PXE サーバー[url:%s]に接続できません。理由: %s", + "ORG_ZSTACK_LICENSE_10002": "提供されたライセンスリクエストコード %s はクラウドリソース割り当てに対して無効です。確認して再試行してください。", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10003": "sqlite3 の実行に失敗しました。理由: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10000": "サポートされていないメソッドです: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10001": "HTTP リクエストエラー!ステータスコード: %s, エラー: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10011": "アタッチされた Ceph バックアップストレージは ISO ベースのストレージマイグレーションをサポートしていません。", + "ORG_ZSTACK_STORAGE_MIGRATION_10015": "[%s] から [%s] への仮想環境へのストレージマイグレーションはサポートされていません", + "ORG_ZSTACK_STORAGE_MIGRATION_10016": "VM[uuid:%s]は実行中ですが、ホスト UUID がありません", + "ORG_ZSTACK_STORAGE_MIGRATION_10013": "[%s] から [%s] へのデータボリュームを含むストレージマイグレーションはサポートされていません", + "ORG_ZSTACK_STORAGE_MIGRATION_10014": "[%s] から [%s] へのスナップショットを使用したストレージマイグレーションはサポートされていません", + "ORG_ZSTACK_STORAGE_MIGRATION_10019": "ソース BS とターゲット BS を同じにすることはできません。", + "ORG_ZSTACK_STORAGE_MIGRATION_10017": "データボリュームパラメータを使用したデータボリュームのライブストレージマイグレーションのみサポートします。", + "ORG_ZSTACK_STORAGE_MIGRATION_10018": "ルートボリューム以外的 [%s] から [%s] へのボリュームのライブストレージマイグレーションはサポートされていません", + "ORG_ZSTACK_NETWORK_OVN_10001": "VM NICをセキュリティグループに追加できませんでした。VM NICのSDN [uuid:%s]がセキュリティグループのSDN [uuid:%s]と一致しません", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10006": "baremetal pxeserver[uuid:%s]でbmインスタンスのnginxプロキシを作成できませんでした", + "ORG_ZSTACK_NETWORK_OVN_10000": "L3ネットワークをセキュリティグループにアタッチできませんでした。L3ネットワークのSDN [uuid:%s]がセキュリティグループのSDN [uuid:%s]と一致しません", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10007": "baremetal pxeserver[uuid:%s]でbmインスタンスのnginxプロキシを削除できませんでした", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10008": "baremetal PXE server[uuid:%s]の起動に失敗しました", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10009": "baremetal PXE server[uuid:%s]の停止に失敗しました", + "ORG_ZSTACK_NETWORK_OVN_10005": "OVS controller[uuid:%s, type: %s]が見つからないため、セキュリティグループを作成できません", + "ORG_ZSTACK_NETWORK_OVN_10004": "OVN controllerが指定されているため、セキュリティグループを作成できません。セキュリティグループ作成時にOVN controllerを指定しないことを確認してください。", + "ORG_ZSTACK_NETWORK_OVN_10003": "ホスト上に%d個のOVN controllerインスタンスが実行しているため、ホストを削除できません", + "ORG_ZSTACK_NETWORK_OVN_10002": "OVNはL3タイプ: %s、カテゴリ: %sをサポートしていないため、レイヤー3ネットワークを作成できません", + "ORG_ZSTACK_NETWORK_OVN_10009": "ネットワークインターフェース[%s]が見つからないため、SDNホストを追加できません", + "ORG_ZSTACK_NETWORK_OVN_10008": "SDN L2ネットワークを作成できません。SDN controller UUIDが指定されていません。SDN controller UUIDが正しく構成されていることを確認してください。", + "ORG_ZSTACK_NETWORK_OVN_10007": "ネットワークサービス[%s]をOVSネットワークにアタッチできません", + "ORG_ZSTACK_GUESTTOOLS_PVPANIC_10000": "有効なソースファイルパスなしで仮想マシンをデプロイできません", + "ORG_ZSTACK_NETWORK_OVN_10006": "vSwitchType[%s]のネットワークにOVNネットワークサービスをアタッチできません", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10001": "baremetal PXE server[uuid:%s]で構成の初期化に失敗しました", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_MARKETPLACE_10000": "marketplaceサービスで適切にフィルタリングするには、filterNameをmarketplace:trueまたはmarketplace:falseに設定する必要があります。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10002": "pxeserver[uuid:%s]でbaremetalインスタンス構成を作成できませんでした", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10003": "pxeserver[uuid:%s]でbaremetalインスタンス構成を削除できませんでした", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10004": "baremetal PXE server[uuid:%s]でBMインスタンスNOVAプロキシを作成できませんでした", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10005": "pxeserver[uuid:%s]でbmインスタンスnovncプロキシを削除できませんでした", + "ORG_ZSTACK_NETWORK_SERVICE_10005": "L3Network[uuid:%s]にはネットワークサービス[type:%s]が有効になっていないか、このネットワークサービスを提供するプロバイダがありません。", + "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10000": "サポートされていない機能: SEND_SSNS_MESSAGE", + "ORG_ZSTACK_NETWORK_SERVICE_10004": "仮想マシン[uuid: %s]へのネットワークサービス[%s]の適用に失敗しました", + "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10001": "プラグイン%sでのSNS通知の送信に失敗しました", + "ORG_ZSTACK_NETWORK_SERVICE_10007": "プロバイダ[uuid:%s]のネットワークサービスを定義する必要があります", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10021": "クラスタ[uuid:%s]内でbaremetal2プロビジョニングネットワークが見つかりません", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10020": "クラスタ[uuid:%s]内で使用可能なBaremetal2ゲートウェイが見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_10001": "L3Network [UUID: %s]にはホストルートサービスが構成されていません。", + "ORG_ZSTACK_NETWORK_SERVICE_10000": "L3Network [UUID: %s]はnullタイプを提供します", + "ORG_ZSTACK_LICENSE_10019": "MINI VMテンプレートで予期しないホストベンダー", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10022": "baremetal2プロビジョニングネットワーク[uuid:%s]が利用できません。有効にしてください。", + "ORG_ZSTACK_NETWORK_SERVICE_10009": "UUID [%s]のネットワークサービスプロバイダは%sのサービスを提供していません", + "ORG_ZSTACK_NETWORK_OVN_10052": "NIC [%s]のホスト[uuid:%s]へのOVSポート削除に失敗しました。エラー: %s", + "ORG_ZSTACK_NETWORK_SERVICE_10008": "ネットワークサービスプロバイダ[uuid:%s]が見つからないか、サービスを提供していません", + "ORG_ZSTACK_NETWORK_OVN_10051": "NICs [%s]のホスト[UUID:%s]へのOVSポート削除に失敗しました。エラー: %s", + "ORG_ZSTACK_NETWORK_OVN_10050": "ネットワークインターフェース [%s]のホスト[uuid:%s]とのOVSポート同期に失敗しました。エラー: %s", + "ORG_ZSTACK_NETWORK_OVN_10056": "ノードがキックアウトされたことを確認するためのクラスタステータス取得エラー %s", + "ORG_ZSTACK_NETWORK_OVN_10055": "OVN controller[uuid:%s, ip:%s]へのQuality of Service設定同期に失敗しました。エラー: %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORK_10000": "宛先ホスト[uuid:%s]上の仮想머신[uuid:%s]に対してVXLANネットワークを構成できません", + "ORG_ZSTACK_NETWORK_OVN_10054": "LSP[%s]のホスト[uuid:%s]へ要求されたOVSポートチャシスの設定に失敗しました。エラー: %s", + "ORG_ZSTACK_NETWORK_OVN_10053": "LSP[%s]のホスト[uuid:%s]へ要求されたOVSポートチャシスの設定に失敗しました。エラー: %s", + "ORG_ZSTACK_NETWORK_OVN_10059": "OVN controller[uuid:%s, ip:%s]へのDHCPオプション追加に失敗しました。理由: %s", + "ORG_ZSTACK_NETWORK_OVN_10058": "エージェントから空のクラスタステータス結果が返されました。エージェントの設定と接続性を確認してください。", + "ORG_ZSTACK_NETWORK_OVN_10057": "クラスタステータスの取得に失敗しました: %s", + "ORG_ZSTACK_NETWORK_SERVICE_10010": "ネットワークサービス[%s]がLayer 3ネットワーク[UUID: %s]にアタッチされました。", + "ORG_ZSTACK_LICENSE_10023": "仮想머신 %s のライセンス削除に失敗しました。詳細についてはサポートにお問い合わせください。", + "ORG_ZSTACK_LICENSE_10003": "提供されたタイムスタンプが無効です。ISO 8601形式(YYYY-MM-DDTHH:mm:ss)に準拠していることを確認してください。", + "ORG_ZSTACK_LICENSE_10004": "デコードされたライセンスファイルの長さが予期しない値です: %d。クラウドコンピューティングサービスには有効な長さが必要です。", + "ORG_ZSTACK_LICENSE_10005": "デコード失敗: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10010": "baremetal2クラスタ[uuids:%s]で利用可能な物理サーバ chassisが見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_10012": "networkServicesは空であってはなりません", + "ORG_ZSTACK_NETWORK_SERVICE_10011": "DHCPサービスをL3ネットワーク[uuid:%s]にアタッチする際、IPアドレスの割り当てが不十分です。", + "ORG_ZSTACK_NETWORK_SERVICE_10014": "NetworkService Dhcp Backendが見つけません[provider type: %s]", + "ORG_ZSTACK_NETWORK_OVN_10062": "OVN controller[uuid:%s, ip:%s]へのpingに失敗しました。理由: %s", + "ORG_ZSTACK_NETWORK_OVN_10061": "OVN controller[uuid:%s, ip:%s]へコマンドを送信できません。NFVInstanceGroup[uuid:%s, name:%s]のステータスは%sです。HealthyまたはDegradedのグループのみがコマンドを受け付けられます", + "ORG_ZSTACK_NETWORK_OVN_10060": "ovn controller[uuid:%s]が接続されていません。現在のステータス: %s", + "ORG_ZSTACK_NETWORK_OVN_10067": "IP [%s]は現在の環境で有効なバーチャルIPではありません。NFV Instance GroupのバーチャルIPアドレスを使用してください。", + "ORG_ZSTACK_NETWORK_OVN_10066": "仮想머신[uuid:%s]が見つかりません", + "ORG_ZSTACK_NETWORK_OVN_10064": "仮想머신ネットワークインターフェース[internalName:%s]が見つかりません", + "ORG_ZSTACK_NETWORK_OVN_10069": "SDNコントローラへのpingが失敗しました、エラー: %s", + "ORG_ZSTACK_NETWORK_OVN_10068": "IP [%s] はどのOVN SDN Controller NFV Instance Groupにも関連付けられていません。OVN Controller NFV Instance GroupのVIPアドレスを使用してください。", + "ORG_ZSTACK_CORE_10000": "リソースUUID[%s]の実行者が見つかりません", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10016": "bond名 %s はすでに存在します", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10018": "UUID [%s] のbaremetal2 chassisが見つかりません。存在しない可能性があります", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10017": "MACアドレスを持つNICはすでにボンディングされています", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10000": "サプライヤー[%s]とのuniversal SMSの検証に失敗しました", + "ORG_ZSTACK_LICENSE_10037": "MN[uuid:%s]: CloudInstanceNotDefinedException", + "ORG_ZSTACK_LICENSE_10038": "複数のManagement Nodeが存在しますが、ライセンスは%s分のみ提供されています", + "ORG_ZSTACK_LICENSE_10039": "MN HA環境ですが、ライセンスは%s用のみ更新されています", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10001": "ホスト[arch:%s]のCPUアーキテクチャとクラスタ[arch:%s]が一致しません", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10000": "baremetal2 chassisハードウェア情報のフォーマットが正しくありません: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10003": "baremetal2 chassis NICハードウェア情報のフォーマットが正しくありません: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10002": "ブートモード%sのbaremetal2 chassisのみサポートされています", + "ORG_ZSTACK_NETWORK_OVN_10032": "NFV Instance[UUID:%s]のOVNクラスタノード構成に失敗しました、原因: %s", + "ORG_ZSTACK_NETWORK_OVN_10031": "NfvInstanceGroup[uuid:%s]内にインスタンスが見つかりません", + "ORG_ZSTACK_NETWORK_OVN_10038": "NfvInstance[uuid:%s]のデタッチに失敗しました。インスタンスが見つかりません", + "ORG_ZSTACK_NETWORK_OVN_10035": "L2ネットワーク[UUID:%s]はSDNコントローラに関連付けられていません", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10005": "baremetal2 chassisディスクハードウェア情報のフォーマットが正しくありません: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10004": "BareMetal2 chassisにはプロビジョNICが1つだけ関連付けられている必要があります", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10006": "別のコンピュートノードで重複したMACアドレスを持つ仮想マシンが検出されました。この競合を解決してください。", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10009": "baremetal2展開に利用可能な物理サーバーリソースが見つかりません。%s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10008": "BareMetal2 Chassis[uuid:%s]が存在しないか、無効化されています", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10002": "サプライヤー[%s]が無効です", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10001": "クラウドサービスインスタンス%sのuniversal SMS検証に失敗しました", + "ORG_ZSTACK_CORE_GC_10001": "完了済みのガベージコレクションジョブをトリガーできません[uuid:%s, name:%s]", + "ORG_ZSTACK_LICENSE_10046": "指定されたパス%sにライセンス[uuid:%s, type:%s]ファイルが見つかりません", + "ORG_ZSTACK_LICENSE_10028": "モジュール%sのライセンス取り消しに失敗しました", + "ORG_ZSTACK_LICENSE_10029": "UKeyはサポートされていません(アーキテクチャ: %s)", + "ORG_ZSTACK_NETWORK_OVN_10041": "SDNコントローラ[uuid:%s]が見つからないため、L3ネットワークをセキュリティグループにアタッチできません", + "ORG_ZSTACK_NETWORK_OVN_10040": "NFVIインスタンス[UUID:%s]のデタッチに必要な管理IPが見つかりません", + "ORG_ZSTACK_NETWORK_OVN_10045": "ホスト[uuid:%s]でOpen vSwitchサービスの起動に失敗しました、エラー: %s", + "ORG_ZSTACK_NETWORK_OVN_10043": "ホスト[uuid:%s]へのovsパッケージのインストールに失敗しました、エラー: %s", + "ORG_ZSTACK_NETWORK_OVN_10042": "SDNコントローラー[uuid:%s]が接続されていないため[status:%s]、L3ネットワークをセキュリティグループにアタッチできません", + "ORG_ZSTACK_NETWORK_OVN_10049": "ホスト[UUID:%s]のネットワークインターフェース[%s]のOVSポート同期に失敗しました、エラー: %s", + "ORG_ZSTACK_NETWORK_OVN_10048": "ホスト[UUID:%s]のNIC [%s]へのOVSポート追加に失敗しました、エラー: %s", + "ORG_ZSTACK_NETWORK_OVN_10047": "ホスト[UUID:%s]のNIC [%s]へのOVSポート追加に失敗しました、エラー: %s", + "ORG_ZSTACK_LICENSE_10030": "UKeyライセンスが見つからないか、正常に更新できませんでした。UKeyが適切に接続され、クラウドコンピューティングサービスのライセンスが付与されていることを確認してください。", + "ORG_ZSTACK_LICENSE_10031": "ローカル仮想マシンのライセンスを更新します: %s", + "ORG_ZSTACK_LICENSE_10032": "UKeyを更新するために利用可能なコンピュートインスタンスがありません", + "ORG_ZSTACK_GUESTTOOLS_KVM_10001": "仮想マシン[uuid:%s]からゲストツールをデタッチできませんでした", + "ORG_ZSTACK_GUESTTOOLS_KVM_10000": "vm[uuid:%s]からゲストツール情報を取得できませんでした、理由:%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10033": "pciデバイスID[%s]はタグ[%s]において有効な整数ではありません", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10034": "UUID [%s]を持つmdevデバイス仕様が存在しません", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10031": "PCIデバイスIDがタグ[%s]にありません", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10032": "PCIデバイスIDはタグ[%s]で0より大きくなければなりません", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10030": "pciデバイス仕様[uuid:%s]が存在しません、タグ [%s]から派生", + "ORG_ZSTACK_GUESTTOOLS_KVM_10006": "prometheusからゲストツールステータスの取得に失敗しました:[metric=%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10005": "VM[UUID:%s]からゲストツールISOをデタッチできませんでした、理由:%s", + "ORG_ZSTACK_GUESTTOOLS_KVM_10004": "VM[UUID:%s]にゲストツールISOをアタッチできませんでした、理由:%s", + "ORG_ZSTACK_GUESTTOOLS_KVM_10003": "KVMホスト[uuid:%s]が見つからなかったため、ゲストツールISOのダウンロードに失敗しました", + "ORG_ZSTACK_LICENSE_10048": "ライセンス期限切れ: クラウドコンピューティング環境のライセンスの期限が切れています。サポートに連絡してライセンスを更新してください。", + "ORG_ZSTACK_LICENSE_10049": "サポートされていません: ハードウェアキーからライセンス[%s]を削除します", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10024": "仮想マシン[uuid:%s]に利用可能なPCIデバイス仕様がありません", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10025": "PCIデバイス仕様[uuid:%s]は仮想_machine [uuid:%s]には利用できません", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10023": "VM[uuid:%s]の利用可能なPCIデバイス仕様の取得に失敗しました: %s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10020": "vmインスタンス[uuid:%s, state:%s]はmdevデバイス仕様[uuid:%s]を削除するためにシャットダウンが必要です", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10027": "ボリューム[uuid:%s, installPath:%s]がディレクトリ%sにありません", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10026": "ホスト[uuid:%s]がストレージ管理ポリシー[uuid:%s]とは異なるストレージをマウントしている可能性があります、確認してください", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10024": "ホスト[uuid:%s]が同じマウントパスを持っている,但实际上是不同的存储にマウントされています", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10028": "mdevデバイス仕様[uuid:%s]は仮想マシン[uuid:%s]では利用できません", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10029": "タグ[%s]にPCIデバイス仕様のUUIDがありません", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10026": "仮想マシン[uuid:%s]にはmdevデバイス仕様が利用できません", + "ORG_ZSTACK_LICENSE_10050": "ハイブリッドプラットフォームライセンスはすでに使用されています。DeleteLicenseActionでハイブリッドライセンスUUID[uuid=%s]を使用して、ハイブリッドプラットフォームライセンスとハイブリッドアドオンライセンスを同時に削除してください。", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10011": "vm[uuid:%s]にはPCIデバイス仕様[uuid:%s]がありません", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10012": "vmインスタンス[UUID: %s, state: %s]は、PCIデバイス仕様[UUID: %s]を削除するためにシャットダウンする必要があります", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10019": "vm[uuid:%s]にはmdevデバイス仕様[uuid:%s]がありません", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10017": "vm[uuid:%s]にはすでにmdevデバイス仕様[uuid:%s]があります", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10018": "vmインスタンス[uuid:%s, state:%s]はmdevデバイス仕様を設定するために停止する必要があります", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10015": "vmインスタンス[uuid:%s, state:%s]はPCIデバイス仕様を設定するために停止する必要があります", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10009": "アフィニティグループ[uuid:%s]が見つかりません。削除または終了した可能性があります", + "ORG_ZSTACK_COMPUTE_VM_10309": "IP[%s]はVPCネットワーク[uuid:%s]では利用できません。理由: %s", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10006": "このホスト[uuid: %s]には同じアフィニティグループ[%s]に属する他の仮想マシンがあります", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10005": "VM [uuid: %s]はすでにアフィニティグループ[uuid: %s]に割り当てられています", + "ORG_ZSTACK_COMPUTE_VM_10307": "静的IPアドレス[%s]の形式が正しくありません", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10008": "vm [uuid:%s]はアフィニティグループ[uuid:%s]の条件を満たしていません", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10007": "affinityGroup [uuid:%s]は仮想マシン[uuid:%s]のホスト[uuid:%s]を確保できませんでした", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10003": "クラスタUUID、ホストUUID、またはVMUUIDは同時に1つだけが指定できます", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10008": "vm[uuid:%s]にはすでにPCIデバイス仕様[uuid:%s]があります", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10006": "PCIデバイス仕様を設定するにはVMを一時停止する必要があります: uuid=%s, state=%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10007": "無効なPCIデバイスタイプ: %s。クラウド仮想化環境で使用可能なタイプ: %s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10004": "有効なコンピュートリソースが見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10001": "システムタグ[%s]を削除できません。ロードバランサープラグインが依存しているため、更新のみ可能です", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10002": "AffinityGroup [uuid: %s]は存在しません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10002": "UUID %sのnicが見つかりません。ロードバランサーのネットワークタグ%sを修正してください", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10001": "VM [uuid: %s]はすでにアフィニティグループ[uuid: %s]に関連付けられています", + "ORG_ZSTACK_COMPUTE_VM_10303": "vm[%s]の優先度を[%s]への更新に失敗しました。理由: %s", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10004": "クラウド環境で有効化されていないアフィニティグループ[uuid: %s]を操作できません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10000": "ロードバランサー[uuid:%s]が見つかりません", + "ORG_ZSTACK_COMPUTE_VM_10302": "VM[uuid:%s]はCD-ROMデバイスを%s台だけ接続できます", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10003": "システムによって作成されたアフィニティグループを操作できません。サポートにお問い合わせください。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10005": "無効なバランスアルゴリズム[%s]、有効なアルゴリズムは%sです", + "ORG_ZSTACK_COMPUTE_VM_10301": "VM[uuid:%s]にはすでにISO[uuid:%s]が接続されています", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10006": "無効な異常なし閾値[%s]、値は数値である必要があります", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10003": "無効なロードバランサーの重み[%s]、インスタンスIDが範囲[%d, %d]内にありません", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10000": "VMは[%s,%s]状態でのみアフィニティグループを変更できますが、VMは現在[%s]状態にあります。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10004": "無効なバランサーの重み[%s]、値は数値ではありません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10009": "無効な接続アイドルタイムアウト[%s]、%sが数値であることを確認してください", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10007": "無効な異常あり閾値[%s]、数値を入力してください", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10008": "無効な健全性タイムアウト[%s]、%sが数値であることを確認してください", + "ORG_ZSTACK_TICKET_IAM2_10002": "フローコレクション[uuid:%s]はプロジェクト[uuid:%s]に属していないため、操作が拒否されました", + "ORG_ZSTACK_TICKET_IAM2_10003": "仮想インスタンスID[uuid:%s]はチケット[uuid:%s, name:%s]を管理する権限がありません", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10004": "Kafkaトピックはnullにできません。トピック名が適切に構成されていることを確認してください。", + "ORG_ZSTACK_TICKET_IAM2_10000": "チケット提出者[uuid:%s]の削除のため、操作が拒否されました。 сейчасはチケット[uuid:%s, name:%s]のみ削除が許可されています", + "ORG_ZSTACK_TICKET_IAM2_10001": "チケットに関連付けられたプロジェクト[UUID:%s]が削除されているため、操作が拒否されました。チケット[UUID:%s, name:%s]は現在削除のみ可能です。", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10001": "Syslogモードはnullにできません", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10000": "クラウドインスタンスのインデックスはnullにできません。有効なインデックス値を入力してください。", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10003": "Lokiラベルの形式はkey=valueである必要があります", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10002": "Lokiラベルはnullにできません。すべてのラベル値が適切に定義されていることを確認してください。", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10018": "ホスト[UUID: %s]とネットワークプール[UUID: %s]のvxLAN VTEPアドレスはすでに存在します", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10017": "%sは有効なIPv4アドレスではありません", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10016": "IP[%s] l2NetworkUuid[%s] clusterUuid[%s] IPアドレスはローカルVTEPテーブルに存在します", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10021": "L2 UUID[%s]がVXLANネットワークプールの一部ではないため、VNI範囲を作成できません", + "ORG_ZSTACK_ALIYUN_CORE_IDENTITYZONE_10000": "プライベートAliyun VPCネットワークにはzoneIdを指定する必要があります", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10012": "無効なインスタンスID[%s]、%sは有効なインスタンス識別子ではありません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10010": "無効なヘルスチェック間隔[%s]、値は数値である必要があります", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10011": "無効な最大接続値[%s]、%sが数値であることを確認してください", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10016": "無効なヘルスチェックターゲット[%s]、ポート[%s]は数値である必要があります", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10017": "VIPをロードバランサーに接続できませんでした。VIP[%s]には関連付けられたIPアドレスがありません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10014": "無効なヘルスチェックターゲット[%s]、チェックプロトコル[%s]は無効です。有効なプロトコルは%sです", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10015": "無効なヘルスチェックターゲット[%s]、ポート[%s]は[1, 65535]の有効な範囲内にありません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10018": "IPv4 VIPをロードバランサーにアタッチ失敗、ロードバランサー[%s]は既にIPv4 VIP[%s]を持っています", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10009": "KVMホスト[uuid:%s]上でVXLANネットワークプール[uuid:%s, type:%s]の実体化に失敗しました、%sのため", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10019": "IPv6 VIPをロードバランサーにアタッチ失敗、ロードバランサー[%s]は既にIPv6 VIP[%s]を持っています", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10004": "KVMホスト[uuid:%s]上でl2Network[uuid:%s, type:%s, vni:%d]のブリッジ[%s]作成に失敗しました、%sのため", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10003": "ホスト[UUID: %s]上のVTEPが見つかりません。VXLANプール[UUID: %s]をクラスターに再アタッチしてください。", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10002": "1つのホスト[UUID:%s]に対して複数のVTEP IPアドレス[%s]が見つかりました。ホストを削除して再度追加してください。", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10008": "kvmホスト[uuid:%s]上のl2VxlanNetworkPool[uuid:%s, name:%s]のCIDR[%s]検証に失敗しました、%s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10007": "KVMホスト[uuid:%s]上のl2Network[uuid:%s, type:%s, vni:%s]のブリッジ[%s]削除に失敗しました、%sのため", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10006": "kvmホスト[uuid:%s]上のl2VxlanNetwork[uuid:%s, name:%s]のCIDR[%s]検証に失敗しました、%s", + "ORG_ZSTACK_CRYPTO_CCS_10001": "ユーザー[uuid=%s]はクラウド環境に存在しません", + "ORG_ZSTACK_CRYPTO_CCS_10002": "証明書UUIDが欠落しており、UKeyシステムタグが存在しません。両方が正しく構成されていることを確認してください。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10020": "vip[%s]を削除できません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10023": "サービスプロバイダータイプの不一致が検出されました。ロードバランサー[uuid:%s]はサービスプロバイダー[type:%s]によって提供されていますが、[type:%s]の新しいサービスプロバイダーが追加しようとされています。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10024": "同じポート[%s]と、同じロードバランサー[UUID:%s]を持つリスナーが存在します。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10022": "ロードバランサーリスナー[uuid:%s]のサービスプロバイダータイプを取得できません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10027": "ネットワークインターフェースのバランサー_weight: %sが無効です、%dは有効な範囲[%d, %d]内にありません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10028": "ロードバランサーUUIDとサーバーグループUUIDの両方が指定されていないため、候補vmnicを取得できませんでした。これらの識別子が正しく指定されていることを確認してください。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10026": "無効なヘルスチェックパラメータ[%s]、形式はmethod:URI:status_codesである必要があります(例: GET:/index.html:http_2xx)", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10029": "ロードバランサーUUIDとサーバーグループUUIDの両方が指定されていないため、候補レイヤー3ネットワークを取得できませんでした。", + "ORG_ZSTACK_CRYPTO_CCS_10008": "証明書[uuid=%s]は証明書ストアに見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10030": "リスナーに関連付けられているデフォルトサーバーグループが削除されているため、ロードバランサーリスナー[uuid:%s]からVM NICをデタッチできませんでした", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10031": "VIPとIPv6 VIPパラメータが空のため、ロードバランサーを作成できませんでした。有効なIPアドレスを指定してください。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10034": "ロードバランサーVIP [%s]は、パブリックアドレスプールタイプに関連付けられたCIDRブロックの最初または最後のIPアドレスであってはなりません。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10035": "パラメータvipUuidが指すVIP[%s]がIPv4仮想マシンインターフェースではないため、loadbalancerを作成できませんでした。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10032": "VIPとIPv6 VIPのL3ネットワークが同じL3ネットワークではないため、ロードバランサーを作成できませんでした。 它们が同じL3ネットワークにあることを確認してください。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10033": "VIP [UUID:%s]は別のネットワークサービスエンティティ[%s]によって占有されています。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10038": "操作失敗、アクセス制御リストグループ:%sの%sに重複/重なり合うIPエントリがあります", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10039": "操作失敗、IP形式はip/iprange/cidrのみサポートしていますが、%sが見つかりました", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10036": "パラメータipv6VipUuidが指すVIP [%s]がIPv6 VIPではないため、ロードバランサーを作成できませんでした。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10037": "操作失敗、このIPバージョン%dはサポートされていません", + "ORG_ZSTACK_VPC_HA_10001": "VPC [UUID:%s]がネットワークサービスバージョンの更新をサポートしていないため、このネットワークサービスを更新できませんでした", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10025": "L2Network[uuid:%s]はL2VxlanNetworkタイプではありません", + "ORG_ZSTACK_VPC_HA_10002": "VPC [UUID:%s]が古いカーネルバージョン:[%s]を使用しているため、このネットワークサービスを更新できませんでした", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10024": "vlan[%s]は有効なVNIではありません", + "ORG_ZSTACK_VPC_HA_10003": "マルチSNAT機能が無効になっているため、デフォルト以外のパブリックネットワークでソースNATを適用できませんでした", + "ORG_ZSTACK_VPC_HA_10004": "L3ネットワーク[uuid:%s]がプライベートネットワークであるため、このL3ネットワークでSNATを適用できませんでした", + "ORG_ZSTACK_VPC_HA_10005": "L3ネットワーク[uuid:%s]がVPCルーターに接続されていないため、このL3ネットワークでSNATを適用できませんでした", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10029": "システムタグ[%s]のCIDR形式が正しくありません", + "ORG_ZSTACK_VPC_HA_10006": "クラウドモニターIPアドレス[%s]が無効です", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10028": "システムタグ[%s]が正しくありません。以下のいずれかにする必要があります: [EC2, GCE, AWS_VPC]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10027": "以下のようなシステムタグを1つ入力してください: [%s]", + "ORG_ZSTACK_VPC_HA_10008": "vpcHaRouter [uuid:%s]は削除されています", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10042": "IPバージョンが異なるセキュリティグループ[%s]をLoadBalancer[%s]にアタッチすることはできません", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10031": "vXLANネットワークプールはL3ネットワークの作成をサポートしていません", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10040": "IP範囲[%s, %s]はアクセスコントロールリストグループ:%sの開始IP:%sと終了IP:%sと重複しています", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10030": "VNI範囲が%s [%s]と重複しています", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10045": "リダイレクトアクセスコントロールリストグループ[uuid:%s]はロードバランサーレイナーに関連付けることができ、サーバーグループに割り当てる必要があります", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10046": "アクセスコントロールリストグループ[uuid:%s]のロードバランサーレイナー[uuid:%s]へのアattachmentはHTTPSまたはHTTPである必要があります", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10043": "ドメイン[%s]、URL[%s]がアクセスコントロールリストグループ:%sのリダイレクトルールと重複しています", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10044": "アクセスコントロールリストグループ[uuid:%s]はリダイレクトするように構成されていますが、一部のアクセスコントロールリストエントリにはリダイレクトルールがなく、IPエントリが含まれています", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10049": "アクセスコントロールリストグループ[uuid:%s]はすでに別のロードバランサーレイナー[uuid:%s]にアタッチされています", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10048": "アクセスコントロールリストグループ[uuid:%s]にはリダイレクトルールが含まれていません", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10001": "アカウントには割り当てられたVIPがありません", + "ORG_ZSTACK_COMPUTE_VM_10239": "CreateVmInstanceMsgはnullにできません。リクエストを送信する前にリクエストメッセージが適切に初期化されていることを確認してください", + "ORG_ZSTACK_COMPUTE_VM_10237": "イメージが複数のバックアップストレージにあるため、zoneUuidを指定する必要があります", + "ORG_ZSTACK_COMPUTE_VM_10236": "プライマリストレージ[uuids:%s]がアタッチされたクラスター内にLayer2ネットワークが見つかりません", + "ORG_ZSTACK_COMPUTE_VM_10235": "UUIDs:%sのプライマリストレージは、UUID:%sのゾーン内のクラスターに何もアタッチされていません", + "ORG_ZSTACK_COMPUTE_VM_10234": "バックアップストレージ[uuid:%s, type:%s]からアクセス可能なプライマリストレージが見つかりません", + "ORG_ZSTACK_COMPUTE_VM_10233": "UUID [uuid:%s]の画像は、UUID [uuid:%s]のゾーンにアタッチされたバックアップストレージに保存されていません", + "ORG_ZSTACK_COMPUTE_VM_10232": "Spice TLS証明書が存在しません。Spice TLSが有効かどうか確認してください。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10002": "IP設定内のプライベートネットワークと仮想ルーターネットワークが重叠しているため、仮想ルーターインスタンスを作成できません。%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10001": "仮想ルーター[uuid:%s]用のKVMホスト[uuid:%s]からVirtual Router Bootstrap ISO[%s]を削除できませんでした。理由: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10000": "仮想ルーター[uuid:%s]用のKVMホスト[uuid:%s, ip:%s]にVirtual Router Bootstrap ISO[%s]を作成できませんでした。理由: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10005": "UUID:%sの仮想ルーターインスタンスのネットワークは、プライベートL3ネットワークUUID:%sと同じにできません。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10004": "UUID:%sの仮想ルーターインスタンスオファリングは見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10009": "L3ネットワーク[UUID:%s]は仮想ルーターの管理ネットワークであるため、IP範囲を追加できません", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10008": "L3ネットワーク[UUID:%s]は仮想ルーターオファリングの管理ネットワークであるため、IP範囲を追加できません", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10007": "仮想路由器L3の起動に失敗しました[UUID: %s]", + "ORG_ZSTACK_COMPUTE_VM_10242": "VM作成時のSSHキーペア処理で失敗しました。理由: [%s]", + "ORG_ZSTACK_COMPUTE_VM_10241": "VM作成時のシステムタグ処理で失敗しました。理由: [%s]", + "ORG_ZSTACK_COMPUTE_VM_10240": "仮想マシンのシステムタグのインスタンス化に失敗しました。理由: %s", + "ORG_ZSTACK_COMPUTE_VM_10249": "cpuCoresは有効な整数値である必要があります", + "ORG_ZSTACK_COMPUTE_VM_10248": "cpuSocketsはCPUソケット数を表す正の整数である必要があります。", + "ORG_ZSTACK_COMPUTE_VM_10247": "ブート順序リスト[%s]内のブートデバイス[%s]が無効です", + "ORG_ZSTACK_COMPUTE_VM_10246": "システムタグ内のホスト名で競合が検出されました。UUID %sの別のVMがL3ネットワークUUID %sでホスト名%sを既に使用しています", + "ORG_ZSTACK_COMPUTE_VM_10245": "ホスト名のシステムタグは1つだけ許可されていますが、%s個受信しました", + "ORG_ZSTACK_COMPUTE_VM_10244": "システムタグで指定されたホスト名[%s]は有効なドメイン名ではありません", + "ORG_ZSTACK_COMPUTE_VM_10243": "この機能を有効にできません。仮想マシン[uuid: %s]には、L3ネットワーク[uuid: %s]に関連付けられた複数のネットワークインターフェースカード(NIC)があります。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10013": "仮想ルーター[uuid:%s]のデフォルトネットワークの更新に失敗しました。理由: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10012": "l3Network[uuid:%s]への仮想ルーターネットワークサービスのアタッチに失敗しました。ポートフォワーディングの選択にはsnat_configurationが必要です。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10011": "l3Network[uuid:%s]への仮想ルーターネットワークサービスのアタッチに失敗しました。Elastic IP (EIP)を選択する場合、Source Network Address Translation (SNAT)も構成する必要があります。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10010": "イメージを追加できませんでした。システムタグ[%s]は無効なアプライアンスイメージタイプ[%s]が含まれています", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10017": "仮想ルーター[name:%s, uuid:%s, 現在の状態:%s]は動作可能状態ではないため、必要な操作を実行できません。実行中になるまで再試行してください。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10015": "仮想ルーターのホットマイグレーション用の仮想ルーター[uuid:%s]上のVIP[ips: %s]の同期に失敗しました。理由: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10014": "無効なVirtualMachineType %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10000": "リソース所有者を変更できませんでした。仮想マシンインスタンス[uuid:%s]は既にセキュリティグループに関連付けられています", + "ORG_ZSTACK_TEST_COMPUTE_HOSTALLOCATOR_10000": "意図的な操作: このアクションはクラウドコンピューティングアーキテクチャの設計に沿ったものです。すべての仮想マシンの構成がセキュリティおよびパフォーマンス基準に準拠していることを確認してください。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10019": "仮想ルーター[uuid:%s]には、%sへのHTTP呼び出しが可能な管理NICがありません", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10018": "仮想ルーター[uuid: %s]は%sのステータスであり、%sへのHTTP呼び出しを行うことができません", + "ORG_ZSTACK_COMPUTE_VM_10253": "bootModeシステムタグは1つしか許可されていませんが、%d個検出されました", + "ORG_ZSTACK_COMPUTE_VM_10252": "仮想マシンは最大1つのユーザーデータシステムタグを持つ必要があります。", + "ORG_ZSTACK_COMPUTE_VM_10251": "VM[uuid: %s]にはすでにユーザー定義のシステムタグがあります。", + "ORG_ZSTACK_COMPUTE_VM_10250": "cpuThreadsは整数値である必要があります", + "ORG_ZSTACK_COMPUTE_VM_10259": "無効なUSBリダイレクト[%s]、%sは有効なUSBRedirectタグではありません", + "ORG_ZSTACK_COMPUTE_VM_10258": "無効なパラメータ[%s]、値[%s]はブール型ではありません", + "ORG_ZSTACK_COMPUTE_VM_10257": "無効なフォーマットタグ[%s]", + "ORG_ZSTACK_COMPUTE_VM_10256": "VMマシナリータイプは[q35, pcie, virtual]が必要ですが、[%s]が指定されました", + "ORG_ZSTACK_COMPUTE_VM_10254": "システムタグ[%s]で指定された[%s]は、クラウドインスタンスプロビジョニングの有効なブートモードではありません。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10020": "仮想マシーン[uuid:%s ip:%s]の仮想ルータへネットワークインターフェース[ip:%s, ip6:%s, mac:%s]を追加できませんでした。理由:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10024": "デフォルトネットワークを設定できませんでした。L3 UUID[:%s]は管理ネットワークを参照しているためです。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10023": "L3 UUID [%s]は仮想ルータ[UUID:%s]に関連付けられていません。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10022": "l3 uuid[:%s]は仮想ルータのデフォルトネットワーク[uuid:%s]と同じです。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10021": "ロードバランササーバーグループへのサーバーIP追加に失敗しました。共有ロードバランサにサービスプロバイダがないためです。まず仮想ネットワークインターフェース(VMNIC)が追加されていることを確認してください。", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10010": "仮想ネットワークバージョンが確定できないため、VIPの作成に失敗しました。ネットワーク設定を確認してください。", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10012": "VIP[UUID:%s, name:%s, IP:%s]のサービスプロバイダは%sに設定されています。", + "ORG_ZSTACK_TICKET_EXECUTOR_10001": "イベントからの値取得に失敗しました:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10025": "デフォルトネットワークを設定できませんでした。l3 UUID[:%s]はパブリックネットワークではありません。", + "ORG_ZSTACK_TICKET_EXECUTOR_10000": "指定された名前空間にAPIクラス[name:%s]が見つかりません。クラス名と名前空間が正しいことを確認してください。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10016": "VM NICセキュリティグループを設定できませんでした。VM NIC [uuid:%s]はどのセキュリティグループにもアタッチされていません。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10015": "VM NICセキュリティグループを設定できませんでした。VM NIC [UUID:%s]が見つかりません。", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10007": "requiredIp[%s]は有効なIPv4アドレスではありません。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10018": "VM NICセキュリティグループを設定できませんでした。優先度が無効です。優先度[%d]は1以上である必要があります。", + "ORG_ZSTACK_COMPUTE_10003": "仮想マシンのネットワークインターフェースのアウトバウンドバンド幅[%d]が有効な範囲[8192, 32212254720]を超えています。", + "ORG_ZSTACK_COMPUTE_VM_10264": "vm[uuid:%s, name:%s]は終了しています。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10017": "VM NICセキュリティグループを設定できませんでした。セキュリティグループ[uuid:%s]が見つかりません。", + "ORG_ZSTACK_COMPUTE_10004": "VM NICのインバウンドバンド幅が有効な範囲[8192, 32212254720]を超えています。", + "ORG_ZSTACK_COMPUTE_VM_10263": "リソース[uuid:%s]はルートボリュームです。所有者を直接変更することはできません。代わりに、所属する仮想マシンの所有者を変更してください。", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10009": "必要なIPアドレス[%s]はすでに割り当てられています。", + "ORG_ZSTACK_COMPUTE_10001": "VM NIC l3NetworkUuidはnullにできません。", + "ORG_ZSTACK_COMPUTE_VM_10262": "イメージなしでVMを作成する場合、rootDiskOfferingUuidはnullにできません。", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10008": "L3 Network[UUID:%s]にはすでにVIP[%s]が関連付けられています。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10019": "重複する優先順位のため、VM NICセキュリティグループを設定できませんでした。両方のセキュリティグループ%sと%sは優先順位%dを持っています", + "ORG_ZSTACK_COMPUTE_10002": "VM NICのl3NetworkUuidはl3[%s]にありません", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10003": "ip[uuid:%s]は仮想IPであるため、IPを削除できませんでした", + "ORG_ZSTACK_COMPUTE_VM_10260": "usbRedirect[%s]が無効です。%sはブール型ではありません", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10002": "VIPステータスはこのアカウントからアクセスできません。アカウントの権限を確認し、もう一度お試しください。", + "ORG_ZSTACK_COMPUTE_10000": "重複したネットワークインターフェースパラメータが検出されました。各ネットワークインターフェースに独自のパラメータがあることを確認してください。", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10005": "サポートされていないIP割り当て戦略[%s]です", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10004": "System VIPはAPIで削除できません。サポートにお問い合わせください。", + "ORG_ZSTACK_COMPUTE_VM_10269": "VM[UUID:%s]にはL3 network[UUID:%s]に接続されたNICがありません", + "ORG_ZSTACK_COMPUTE_10007": "vmネットワークドライバー%sはまだサポートされていません", + "ORG_ZSTACK_COMPUTE_VM_10268": "ホスト[uuid:%s]上のVM[uuid:%s]の認識できない状態を受信しました", + "ORG_ZSTACK_COMPUTE_VM_10267": "ホスト[uuid:%s]上のVM[uuid:%s]の状態の確認に失敗しました。%s", + "ORG_ZSTACK_COMPUTE_10005": "VMネットワークインターフェースのマルチキュー番号[%d]は有効範囲[1, 256]外です", + "ORG_ZSTACK_COMPUTE_10006": "l3[uuid:%s]のvm nic状態[%s]は予期された状態ではありません、または%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10031": "管理ネットワークがIPv6をまだサポートしていないため、バーチャルルータオファリングを作成できません", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10030": "管理ネットワーク[uuid:%s]はこのオファリングの作成先となる可用性ゾーン[uuid:%s]にありません", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10035": "L3ネットワーク[UUID:%s]はSNATサービスが有効になっているため、管理ネットワークとして使用できません。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10034": "イメージ[uuid:%s]はサポートされていないフォーマット%sで、バーチャルルータ設定に使用できません", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10033": "イメージ[uuid:%s]のメディアタイプは%sで、バーチャルルータイメージの必要条件である%sに準拠していません", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10032": "UUID %sの公開ネットワークはこのオファリングの作成先となる可用性ゾーンにありません。", + "ORG_ZSTACK_STORAGE_VOLUME_10087": "UUID [uuid:%s]、名前[name:%s]のイメージはすべてのバックアップストレージから削除されています。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10039": "管理ネットワーク[UUID:%s, gateway:%s]に到達できません", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10038": "管理ネットワーク[uuid:%s]にはIP範囲が設定されていません", + "ORG_ZSTACK_STORAGE_VOLUME_10086": "プライマリストレージタイプ[%s]は共有ボリュームをまだサポートしていません", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10037": "UUID [uuid:%s]のL3ネットワークは[uuid:%s]と同じネットワークアドレスを持っており、バーチャルルータに使用できません。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10036": "L3ネットワーク[UUID:%s]はSNATサービスを有効にしており、公開ネットワークとして使用できません。", + "ORG_ZSTACK_STORAGE_VOLUME_10088": "イメージ[uuid:%s]の以下の条件を満たすバックアップストレージが見つかりません: 1. 状態がEnabled 2. ステータスがConnected 3. プライマリストレージ[uuid:%s]が存在するゾーンにアタッチされている", + "ORG_ZSTACK_STORAGE_VOLUME_10083": "重複するボリュームUUID: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10082": "最新ではないスナップショットへのUndoは不可能のようです", + "ORG_ZSTACK_STORAGE_VOLUME_10085": "プライマリストorageタイプの取得に失敗しました", + "ORG_ZSTACK_STORAGE_VOLUME_10092": "ボリューム作成中にターゲットボリュームが削除されました。%s", + "ORG_ZSTACK_STORAGE_VOLUME_10091": "プライマリストorageのUUIDが競合しています。ディスクオファリングで指定されたプライマリストorageは%sで、作成パラメータで指定されたプライマリストorageは%sです", + "ORG_ZSTACK_STORAGE_VOLUME_10093": "%s仮想マシンの実装は複数存在してはいけません", + "ORG_ZSTACK_STORAGE_VOLUME_10096": "ISOをプライマリストorageにダウンロードできませんでした。理由: %s", + "ORG_ZSTACK_ZDFS_10000": "zDFSへのpingに失敗しました。%s", + "ORG_ZSTACK_COMPUTE_VM_10204": "JSON形式が無効です。原因: %s", + "ORG_ZSTACK_COMPUTE_VM_10203": "l3NetworkUuidsとvmNicInventoriesは同時に空,也不能同时设定", + "ORG_ZSTACK_COMPUTE_VM_10200": "ボリューム[uuid:%s]は要件を満たすことができませんでした [state:Enabled status:Ready]", + "ORG_ZSTACK_COMPUTE_VM_10219": "このAPIは非推奨となり、クラウドコンピューティング環境ではサポート対象外となりました。最新のAPIの使用をご検討ください", + "ORG_ZSTACK_COMPUTE_VM_10218": "VM[uuid:%s]のコンソールパスワードを更新できません。コンソールパスワードが現在設定されていません", + "ORG_ZSTACK_ZDFS_10002": "ホスト名[%s]でZDFSの問題が発生しました", + "ORG_ZSTACK_ZDFS_10001": "zDFSへの接続に失敗しました。%s", + "ORG_ZSTACK_COMPUTE_VM_10217": "VM[uuid:%s]のコンソールパスワードを更新できません。VMは'Running'状態ではありません。現在の状態は'%s'です", + "ORG_ZSTACK_COMPUTE_VM_10216": "VNCの脆弱性を避けるため、コンソールパスワードは\"password\"で開始してはなりません", + "ORG_ZSTACK_COMPUTE_VM_10215": "同じISOファイルを複数回マウントすることは許可されていません", + "ORG_ZSTACK_COMPUTE_VM_10214": "UUID [uuid=%s]の仮想マシンは存在しません", + "ORG_ZSTACK_COMPUTE_VM_10220": "CdRom[%s]はすでにデフォルトです", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10002": "クラウドインスタンスのホスト名はnullにできません。有効なホスト名を指定してください", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10000": "facilityIdはnullにできません", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10001": "無効なロギングファシリティ %s", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10006": "syslogサーバ[アドレス: %s]が利用できません", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10007": "syslogサーバ[アドレス: %s:%s]が利用できません", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10004": "プロトコルはnullにできません。有効なプロトコルを指定してください", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10005": "クラウドコンピューティング環境でサポートされていないプロトコル %s", + "ORG_ZSTACK_COMPUTE_VM_10228": "ユニキャストMACアドレス期待、マルチキャストMACアドレス発見[%s]", + "ORG_ZSTACK_COMPUTE_VM_10227": "インスタンス%dに対して禁止されたネットワークアドレス%s", + "ORG_ZSTACK_COMPUTE_VM_10226": "無効なMACアドレス[%s]", + "ORG_ZSTACK_COMPUTE_VM_10225": "これは有効なMACアドレスではありません[%s]", + "ORG_ZSTACK_COMPUTE_VM_10224": "CPUトポロジーが正しくありません。実際のCPUコア数: %s、構成されたソケット数: %s、ソケットあたりのコア数: %s、コアあたりのスレッド数: %s; 計算されたソケット数: %s、コア数: %s、スレッド数: %s", + "ORG_ZSTACK_COMPUTE_VM_10221": "vm[uuid:%s]は状態がRunningの場合にのみfstrimを実行できます; 現在の状態は%sです", + "ORG_ZSTACK_STORAGE_VOLUME_10046": "UUID [%s]のボリュームは削除済み状態ではありません。この操作は以前削除されたデータボリュームを回復することを目的としています。", + "ORG_ZSTACK_STORAGE_VOLUME_10049": "image[uuid:%s]はEnabledではありません、状態は%sです", + "ORG_ZSTACK_STORAGE_VOLUME_10048": "image[uuid:%s]は予期されたタイプではありません、タイプは%sです", + "ORG_ZSTACK_STORAGE_VOLUME_10042": "volume[uuid:%s]は有効な状態ではありません、現在のステータスは%sです、スナップショットの作成は不可能です", + "ORG_ZSTACK_STORAGE_VOLUME_10045": "volume[uuid:%s]はスナップショット作成に利用可能な状態ではありません、現在のステータスは%sです", + "ORG_ZSTACK_STORAGE_VOLUME_10044": "メモリスナップショットを取得できません、VMの現在の状態は[%s]ですが、期待される状態は[%s, %s]です", + "ORG_ZSTACK_STORAGE_VOLUME_10041": "volume[uuid:%s, type:%s]、スナップショットを作成できません", + "ORG_ZSTACK_LOGIN_10022": "属性が無効です。属性[%s]は必須ですが、一部のレコード[%s]が一致しません。すべての属性が正しく指定され、一致していることを確認してください。", + "ORG_ZSTACK_LOGIN_10024": "strategyは必須フィールドです %", + "ORG_ZSTACK_LOGIN_10023": "クラウド設定データのJSON形式が無効です。すべてのJSONフィールドが正しくフォーマットされ、指定されたスキーマに従っていることを確認してください。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10007": "keyLabel %sとencryptedResult %sは一致しません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10006": "flkSec securityMachineのヘルスチェックに失敗しました: %s", + "ORG_ZSTACK_LOGIN_10029": "nameは指定されたパラメータ範囲内の値を使用する必要があります %s", + "ORG_ZSTACK_LOGIN_10026": "クラウドリソースプロビジョニングには属性が必須です %", + "ORG_ZSTACK_LOGIN_10025": "nameは必須フィールドです %", + "ORG_ZSTACK_LOGIN_10028": "仮想マシン設定にはoptionalが必須フィールドです%", + "ORG_ZSTACK_LOGIN_10027": "typeは必須フィールドです %", + "ORG_ZSTACK_STORAGE_VOLUME_10058": "ルートボリューム[uuid:%s, name:%s]はアタッチできません。", + "ORG_ZSTACK_STORAGE_VOLUME_10057": "VM [UUID:%s]はイメージプラットフォームタイプが互換性がないため、ボリューム[%s]のオンラインアタッチメントをサポートしていません。", + "ORG_ZSTACK_STORAGE_VOLUME_10059": "データボリューム[UUID:%s]は無効です; アタッチメントは許可されません。", + "ORG_ZSTACK_STORAGE_VOLUME_10054": "データボリューム[UUID:%s]はどの仮想マシンにもアタッチされていないため、デタッチできません。", + "ORG_ZSTACK_STORAGE_VOLUME_10053": "volume[uuid:%s]はステータス[%s]です、データボリュームはステータスがavailableまたはattachingの場合にのみアタッチできます", + "ORG_ZSTACK_STORAGE_VOLUME_10056": "volume[uuid:%s, name:%s, type:%s]はデタッチできません", + "ORG_ZSTACK_CORE_PLUGIN_10001": "plugin[%s] name、product key、vendorはnullにできません", + "ORG_ZSTACK_STORAGE_VOLUME_10055": "UUID [%s]の共有可能データボリュームをデタッチするには、仮想マシンのUUIDが必要です。", + "ORG_ZSTACK_STORAGE_VOLUME_10050": "image[uuid:%s]はReadyではありません、状態は%sです", + "ORG_ZSTACK_STORAGE_VOLUME_10052": "volume[uuid:%s]は状態[%s]です、データボリュームは状態が%sの場合にのみアタッチできます", + "ORG_ZSTACK_STORAGE_VOLUME_10051": "ルートボリューム[uuid:%s]は仮想マシンにアタッチできません", + "ORG_ZSTACK_LOGIN_10011": "DNSエントリ[%s]の検証に失敗しました。おそらく削除されました", + "ORG_ZSTACK_CORE_PLUGIN_10000": "クラウド製品の不明なプラグイン名: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10069": "ボリューム[uuid:%s, type:%s]を削除できません", + "ORG_ZSTACK_STORAGE_VOLUME_10068": "仮想マシン%sのディスクサイズ設定が予期されていません。指定されたディスクサイズが無効範囲内であり、クラウド環境の設定と互換性があることを確認してください。", + "ORG_ZSTACK_STORAGE_VOLUME_10065": "VMにボリュームを接続できません。利用可能なコンピュートクラスタがありません", + "ORG_ZSTACK_STORAGE_VOLUME_10064": "UUID [%s]のデータボリュームは形式[%s]を持っており、タイプ[%s]のハイパーバイザーにのみ接続できますが、VMのハイパーバイザータイプは[%s]です。したがって、接続は不可能です。", + "ORG_ZSTACK_RESOURCECONFIG_10009": "アカウントはリソース[uuid: %s]にアクセスできません", + "ORG_ZSTACK_STORAGE_VOLUME_10067": "ルートボリュームのバックアップは許可されていません、uuid:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10066": "VMをホスト[uuid: %s]に接続できません。ホストはボリュームのストレージ[uuid: %s]から切断されています", + "ORG_ZSTACK_STORAGE_VOLUME_10061": "データボリューム[UUID:%s]は別の仮想マシンに接続されており、再接続できません。", + "ORG_ZSTACK_IAM2_ATTRIBUTE_10000": "属性[name:%s]はクラウドコンピューティング環境で更新できない予約済み属性です。", + "ORG_ZSTACK_NETWORK_OVN_10074": "OVN SDNコントローラー[UUID: %s, 名前: %s]は切断状態にあります。ホスト[UUID: %s]を追加できません。", + "ORG_ZSTACK_STORAGE_VOLUME_10060": "UUID [%s]のボリュームは削除状態にあります。したがって、操作を実行できません。", + "ORG_ZSTACK_NETWORK_OVN_10073": "論理スイッチ[uuid:%s, name:%s]をOVNコントローラー[uuid:%s, ip:%s]に追加できませんでした。なぜなら%s", + "ORG_ZSTACK_STORAGE_VOLUME_10063": "UUID [%s]のデータボリュームは形式[%s]を持っており、ハイパーバーへの接続はサポートされていません。", + "ORG_ZSTACK_STORAGE_VOLUME_10062": "ステータスが[active, available]の場合にのみデータボリュームを接続できます。現在のステータスは%sです", + "ORG_ZSTACK_NETWORK_OVN_10071": "OVSコントローラー[uuid:%s, ip:%s]への論理スイッチの同期に失敗しました。なぜ냐하면%s", + "ORG_ZSTACK_LOGIN_10000": "ZStackは現在、データベースからLDAP組織を読み込んでいます。この時点で同期操作を実行しないでください。", + "ORG_ZSTACK_NETWORK_OVN_10078": "NfvInstance[uuid:%s]が見つかりません", + "ORG_ZSTACK_NETWORK_OVN_10077": "L2ネットワーク[UUID:%s]はOVNコントローラーに接続されていません", + "ORG_ZSTACK_NETWORK_OVN_10076": "OVSコントローラー[uuid:%s, ip:%s]から論理スイッチポートを削除できませんでした。なぜなら%s", + "ORG_ZSTACK_STORAGE_VOLUME_10070": "ボリューム[uuid:%s]は既に削除状態です", + "ORG_ZSTACK_LOGIN_10001": "LDAPエントリ[]の同期に失敗しました。なぜなら%s", + "ORG_ZSTACK_NETWORK_OVN_10075": "OVNコントローラー[uuid:%s, ip:%s]に論理スイッチポートを追加できませんでした。なぜなら%s", + "ORG_ZSTACK_V2V_10037": "ホスト[uuid:%s]は接続されていません", + "ORG_ZSTACK_V2V_10038": "プライマリストレージ[uuid:%s]は接続されていません", + "ORG_ZSTACK_V2V_10035": "変換ホスト[uuid:%s]で%dバイトを割り当てできません。利用可能な容量が不足しています", + "ORG_ZSTACK_NETWORK_OVN_10079": "NfvInstanceGroup[uuid:%s]が見つかりません", + "ORG_ZSTACK_LOGIN_10008": "UID[%s]の検証に失敗しました。おそらく削除または期限切れのため", + "ORG_ZSTACK_LOGIN_10007": "スコープが%sでないLDAP/ADサーバーを同期できません", + "ORG_ZSTACK_V2V_10031": "V2V移行のQoSシステムタグが無効です。システムタグを確認し、コンピューティング規格に準拠していることを確認してください。", + "ORG_ZSTACK_V2V_10032": "ネットワーク帯域幅[%s]が無効です。1秒あたり1048576バイト以上である必要があります", + "ORG_ZSTACK_LOGIN_10009": "UID[%s]のIAM仮想ID作成に失敗しました。原因是%s", + "ORG_ZSTACK_LOGIN_10004": "クラウド環境でのLDAP組織同期に失敗しました", + "ORG_ZSTACK_BAREMETAL2_10001": "IPMIシャーシ設定が無効です: 'provisionIp'パラメータが指定されている場合、'reboot'パラメータは'No'に設定する必要があります", + "ORG_ZSTACK_V2V_10030": "ホストUuid %sからVMマイグレーションがありました", + "ORG_ZSTACK_BAREMETAL2_10002": "IPMIシャーシ設定が無効です: 'provisionIp'が指定されている場合、'platform'は'Linux'として指定する必要があります", + "ORG_ZSTACK_LOGIN_10006": "組織の同期に失敗しました。原因是%s", + "ORG_ZSTACK_LOGIN_10005": "LDAPエントリから組織ノードへの変換に失敗しました", + "ORG_ZSTACK_BAREMETAL2_10000": "IPMIシャーシ設定が無効です: 'provisionIp'が指定されている場合、'provisionType'は'Direct'に設定する必要があります", + "ORG_ZSTACK_STORAGE_VOLUME_10079": "インスタンスからボリューム[%s]をデタッチできません。既にデタッチされている可能性があります", + "ORG_ZSTACK_STORAGE_VOLUME_10076": "ボリューム[%s]をホスト[%s]にアタッチできません。現在、ホスト[%s]にアタッチ中のためです", + "ORG_ZSTACK_STORAGE_VOLUME_10075": "マウントパスは絶対パスである必要があります。有効な絶対パスを指定してください", + "ORG_ZSTACK_NETWORK_OVN_10080": "NfvInstanceGroup[uuid:%s]にはバーチャルIPが設定されていません", + "ORG_ZSTACK_STORAGE_VOLUME_10078": "ボリューム[%s]をホスト[%s]にアタッチできません。マウントパス[%s]が別のボリュームに使用されています", + "ORG_ZSTACK_STORAGE_VOLUME_10077": "ボリューム[%s]をホスト[%s]にアタッチできません。ホスト[%s]上的パス[%s]に既にマウントされています", + "ORG_ZSTACK_STORAGE_VOLUME_10072": "ルートボリュームの状態を変更することは許可されていません、UUID: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10071": "ボリューム[%s]を削除できません。ホスト[%s]にアタッチされています", + "ORG_ZSTACK_STORAGE_VOLUME_10074": "ボリューム[%s]をインスタンス[%s]にアタッチできません。インスタンス[status:%s]が動作状態ではありません", + "ORG_ZSTACK_NETWORK_OVN_10083": "NFVインスタンス[uuid:%s]のOVNクラスタノード更新に失敗しました。原因是%s", + "ORG_ZSTACK_STORAGE_VOLUME_10073": "ボリュームの状態を変更できません。ホスト%sにアタッチされています", + "ORG_ZSTACK_NETWORK_OVN_10082": "NfvInstanceGroup[uuid:%s]でクラスタ設定のインスタンスが見つかりません", + "ORG_ZSTACK_RESOURCECONFIG_10002": "ResourceConfig[category:%s, name:%s]はresourceType: %sに関連付けできません", + "ORG_ZSTACK_RESOURCECONFIG_10001": "リソース[uuid: %s]が見つかりません", + "ORG_ZSTACK_STORAGE_VOLUME_10081": "ボリューム[uuid: %s]の使用中スナップショットツリー内のソースファイルが見つかりません", + "ORG_ZSTACK_V2V_10028": "ソースVM[type for source VM [url:%s]が見つかりません", + "ORG_ZSTACK_RESOURCECONFIG_10000": "リソースのリソースタイプが矛盾しています。詳細: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10080": "共有可能ボリューム[uuid:%s]をフラット化できません", + "ORG_ZSTACK_V2V_10029": "ソースVM[url:%s]のファクトリが見つかりません", + "ORG_ZSTACK_RESOURCECONFIG_10007": "グローバル設定[category:%s, name:%s]をリソースにバインドできません", + "ORG_ZSTACK_V2V_10026": "現在のVMを起動するためのネットワーク[uuid:%s]が見つかりません。削除された可能性があります。操作提案: このVMを終了し、新しいものを作成してください。", + "ORG_ZSTACK_RESOURCECONFIG_10006": "グローバル設定[カテゴリ:%s, 名前:%s]が見つかりません", + "ORG_ZSTACK_V2V_10024": "インスタンスのシャットダウン時間ではありません", + "ORG_ZSTACK_V2V_10025": "変換ホスト[uuid:%s, hostUuid:%s]が接続されていません", + "ORG_ZSTACK_V2V_10022": "v2vジョブが進行中です。ボリューム[%s]をホスト[%s]からデタッチできません。", + "ORG_ZSTACK_V2V_10020": "プライマリストレージ[uuid:%s]はアクティブでもアタッチでもありません", + "ORG_ZSTACK_V2V_10021": "V2V移行ジョブが進行中です。ボリューム[%s]がホスト[%s]にアタッチされていないことを確認してください。", + "ORG_ZSTACK_STORAGE_VOLUME_10007": "iothreadにはQEMUバージョン%s以上が必要ですが、ホストはバージョン%sを実行しています。", + "ORG_ZSTACK_STORAGE_VOLUME_10009": "ルートボリューム[%s]はI/Oスレッドピンを設定できません。", + "ORG_ZSTACK_STORAGE_VOLUME_10008": "iothreadにはlibvirtバージョン%s以上が必要ですが、ホストはバージョン%sを持っています。", + "ORG_ZSTACK_STORAGE_VOLUME_10003": "現在のプライマリストレージ%sはCephタイプではないため、アクセスできません。", + "ORG_ZSTACK_STORAGE_VOLUME_10005": "現在のプライマリストレージタイプはブロックボリュームをサポートしていません。サポートされているタイプには%sが含まれます。", + "ORG_ZSTACK_STORAGE_VOLUME_10004": "CephタイプのブロックボリュームのアクセスパスIDとIQNはnullにできません。accessPathIdとaccessPathIqnの両方が提供されていることを確認してください。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10000": "JitClientFactory接続テストが失敗しました", + "ORG_ZSTACK_SSO_CAS_FILTER_10000": "URLが無効です。クライアントUUIDがありません", + "ORG_ZSTACK_SSO_CAS_FILTER_10001": "CASクライアントインスタンスがありません。SSO統合前にCASクライアントをインスタンス化してください", + "ORG_ZSTACK_COMPUTE_VM_10275": "VM[uuid:%s]はRunning状態ではありません。", + "ORG_ZSTACK_CONSOLE_10011": "コンソールエージェントが接続されていません。これは管理ノードの初期化による可能性があります。コンソールエージェントが接続するまで待つ、または長時間切断されている場合は手動で再接続してください。", + "ORG_ZSTACK_CONSOLE_10010": "vm[uuid:%s]は%s状態ではありません。現在の状態は%sです", + "ORG_ZSTACK_COMPUTE_VM_10273": "プライマリストレージ[uuid:%s]上のルートボリューム[uuid:%s]からテンプレートを作成できませんでした", + "ORG_ZSTACK_COMPUTE_VM_10270": "仮想マシンが削除されました。詳細についてはインスタンス管理コンソールを確認してください。", + "ORG_ZSTACK_CONSOLE_10013": "エージェント[ip: %s]上のコンソールプロキシ[uuid: %s, status: %s]が接続されていません。削除に失敗しました", + "ORG_ZSTACK_CONSOLE_10012": "VM[uuid:%s]のホストIPが見つかりません。VMは実行中ですか???", + "ORG_ZSTACK_COMPUTE_VM_10279": "ハイパーバイザー上でVM[uuid=%s]の更新に失敗しました: 特定プロパティの変更に失敗しました", + "ORG_ZSTACK_COMPUTE_VM_10278": "ハイパーバイザー上でvm[uuid=%s]の更新に失敗しました。", + "ORG_ZSTACK_COMPUTE_VM_10277": "UUID [uuid:%s]のISOは、VM [name:%s, uuid:%s]が配置されているプライマリストレージ [uuid:%s]と互換性のないバックアップストレージにあります。", + "ORG_ZSTACK_COMPUTE_VM_10276": "VM[uuid:%s]のコンソールパスワードを更新できません。VMはどのホスト上也", + "ORG_ZSTACK_STORAGE_VOLUME_10018": "ボリューム[%s]はDisabled状態のため、リサイズできません", + "ORG_ZSTACK_STORAGE_VOLUME_10017": "ボリューム[uuid:%s]はデータボリュームではありません", + "ORG_ZSTACK_STORAGE_VOLUME_10019": "vmInstanceUuidまたはinstanceUuidの少なくとも一方を指定する必要があります", + "ORG_ZSTACK_STORAGE_VOLUME_10014": "異なるVM[uuid:%s, uuid:%s]上のボリューム[uuid:%s, uuid:%s]のスナップショット作成はサポートされていません", + "ORG_ZSTACK_STORAGE_VOLUME_10013": "ボリューム[uuid:%s]が見つかりません", + "ORG_ZSTACK_STORAGE_VOLUME_10016": "vm[uuid:%s]の状態は%sです。スナップショット作成は許可されていません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10013": "jitセキュリティマシンが異常です: %s:%sへのソケット接続に失敗しました", + "ORG_ZSTACK_STORAGE_VOLUME_10015": "ボリューム[uuid:%s]は利用できません", + "ORG_ZSTACK_STORAGE_VOLUME_10010": "現在のI/OスレッドID[%s]は、接続されたボリューム[%s]のI/OスレッドID[%s]と一致しません", + "ORG_ZSTACK_STORAGE_VOLUME_10012": "ボリューム[uuid:%s]のスナップショットバリデーションはサポートされていません。接続されているVMは[%s, %s]のいずれの状態でもありません", + "ORG_ZSTACK_STORAGE_VOLUME_10011": "ボリューム[uuid:%s]のスナップショットバリデーションはサポートされていません。ボリュームは仮想マシンに接続されていません", + "ORG_ZSTACK_CONSOLE_10000": "Ansibleのプライベートキーファイルが見つかりません。プライベートキーのパスが正しいことを確認し、アクセス可能にしてください", + "ORG_ZSTACK_COMPUTE_VM_10285": "ボリューム[uuid=%s]をVM[uuid=%s]からデタッチできませんでした", + "ORG_ZSTACK_COMPUTE_VM_10284": "VMが[%s]状態の場合、ボリュームのデタッチは許可されていません", + "ORG_ZSTACK_COMPUTE_VM_10283": "ISO[uuid:%s]はVirtualMachine[uuid:%s]に接続されていません", + "ORG_ZSTACK_COMPUTE_VM_10282": "vm[uuid=%s]のハイパーバイザーへの更新に失敗しました:特定のプロパティの変更に失敗しました", + "ORG_ZSTACK_CONSOLE_10004": "仮想マシンのコンソールプロキシへの再接続に失敗しました。ネットワーク接続を確認し、仮想マシンが実行中であることを確認してください", + "ORG_ZSTACK_COMPUTE_VM_10281": "vm[uuid=%s]のハイパーバイザーノードへの更新に失敗しました", + "ORG_ZSTACK_CONSOLE_10003": "コンソールプロキシのオーバーライドIP[code:%d]またはコンソールプロキシポート[code:%d]の設定に失敗しました", + "ORG_ZSTACK_COMPUTE_VM_10280": "仮想マシンの作成に失敗しました。名前[%s]の仮想マシンはすでに存在します", + "ORG_ZSTACK_CONSOLE_10002": "別のプロセスがポートを使用しています: %s", + "ORG_ZSTACK_CONSOLE_10001": "無効な管理ノードID[%s]", + "ORG_ZSTACK_CONSOLE_10008": "%sのため、コンソールプロキシの可用性を確認できません", + "ORG_ZSTACK_CONSOLE_10007": "VNC接続の確立:予期しないURI: %s", + "ORG_ZSTACK_COMPUTE_VM_10288": "1つのVMで%s個のCD-ROMを作成できません。VMは%s個のCD-ROMのみ接続できます", + "ORG_ZSTACK_CONSOLE_10009": "操作エラーです。理由:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10029": "ホストが無効になっているため、拡張操作は許可されていません。この操作を実行する前に、ホストがアクティブであることを確認してください", + "ORG_ZSTACK_STORAGE_VOLUME_10028": "メモリ割り当ての最小増分サイズは4MBより大きくなければなりません", + "ORG_ZSTACK_STORAGE_VOLUME_10025": "仮想マシンの読み取り/書き込み帯域幅制限と合計帯域幅制限を同時に設定することはできません。1種類の制限を指定してください", + "ORG_ZSTACK_STORAGE_VOLUME_10024": "インスタンスの読み取り/書き込みIOPS制限と合計IOPS制限を同時に設定することはできません。1種類のIOPS制限を指定してください", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10023": "JITセキュリティ有効時の属性取得中に未処理の例外が発生しました: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10027": "ボリューム[uuid:%s]の[%s]サイズを縮小することはできません", + "ORG_ZSTACK_STORAGE_VOLUME_10026": "ボリューム帯域幅はnullにできません。有効なボリューム帯域幅値を指定してください", + "ORG_ZSTACK_STORAGE_VOLUME_10021": "ボリューム[uuid:%s]はルートボリュームではありません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10022": "JITセキュリティマシンの属性取得に失敗しました、ステータスコード: %s、詳細: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10020": "UUID: %sおよびVMインスタンスUUID: %sのボリュームが見つかりません", + "ORG_ZSTACK_STORAGE_VOLUME_10023": "仮想マシンインスタンスで従来のパラメータセットと新しいパラメータセットを同時に設定することはできません", + "ORG_ZSTACK_STORAGE_VOLUME_10022": "SharedVolumeは帯域幅の設定をサポートしていません", + "ORG_ZSTACK_COMPUTE_VM_10293": "%sの画像サイズを決定する方法がありません、例外を報告してください", + "ORG_ZSTACK_STORAGE_VOLUME_10035": "切り離されたボリュームのみサポートします、代わりにSetVmBootVolumeMsgを使用してください", + "ORG_ZSTACK_ZWATCH_PROMETHEUS_10000": "クラウドデータベースにホスト[uuid:%s]が見つかりません", + "ORG_ZSTACK_STORAGE_VOLUME_10038": "ハイパーバイザ[%s]は単一のVMを最大%s個のデータボリュームに制限しています。このVM [uuid:%s]には%s個のデータボリュームが接続されています", + "ORG_ZSTACK_STORAGE_VOLUME_10032": "ボリュームの再初期化用のイメージキャッシュ[Image UUID: %s]が見つかりません", + "ORG_ZSTACK_STORAGE_VOLUME_10031": "共有ボリューム[uuid: %s]は停止されていないVMインスタンス[uuids: %s]に接続されています", + "ORG_ZSTACK_STORAGE_VOLUME_10034": "SecurityMachineManagerImpl: インスタンス%sのSecurityMachineEncryptに失敗しました", + "ORG_ZSTACK_STORAGE_VOLUME_10033": "ボリューム[UUID: %s, name: %s]は仍在使用中で、削除できません。ボリュームが削除されていることを確認してから再試行してください。", + "ORG_ZSTACK_STORAGE_VOLUME_10030": "ホストの無効化状態により拡張操作が許可されていません", + "ORG_ZSTACK_LOGIN_10033": "現在、環境にLDAP/ADサーバーが構成されていません。まずLDAP/ADサーバーを構成してください。", + "ORG_ZSTACK_LOGIN_10032": "このLDAP UID %sを仮想ユーザーID [uuid:%s]にバインドできません", + "ORG_ZSTACK_LOGIN_10034": "このUIDは既に使用されています別のを選択してください。", + "ORG_ZSTACK_LOGIN_10030": "属性が無効です。属性[%s]が必要ですが、仮想マシン構成で一致しないレコードが見つかりました。すべての属性が正しく指定され、すべての仮想マシンリソースが適切に構成されていることを確認してください。", + "ORG_ZSTACK_STORAGE_CDP_10091": "最大容量[%d]が無効です、現在の使用率は %d です", + "ORG_ZSTACK_STORAGE_CDP_10089": "バックアップストレージ[uuid: %s]のホスト名が見つかりません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10009": "暗号化機能は有効ですが、自動ログイン用のリソースプール[%s]が構成されていません。", + "ORG_ZSTACK_SSO_SAML2_10001": "Identity Provider メタデータが無効な Base64 です(デコードされたコンテンツが空です)。", + "ORG_ZSTACK_SSO_SAML2_10002": "Base64 エンコーディングから Identity Provider メタデータのデコードに失敗しました", + "ORG_ZSTACK_SSO_SAML2_10000": "IdP メタデータが構成されていません。有効なメタデータを入力してください。", + "ORG_ZSTACK_ZSV_10002": "スナップショットグループを操作する前に、共有可能ボリュームまたは LUN デバイスを切り離してください。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10000": "セキュリティインスタンスのクライアントがありません[model=%s]", + "ORG_ZSTACK_ZSV_10001": "ボリューム %s にはまだスナップショットグループがあるため、削除できません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10001": "セキュリティマシーンテーブルのセキュリティマシーンクライアントファクトリがありません[type=%s]", + "ORG_ZSTACK_ZSV_10000": "ボリューム %s には VM %s に関連するスナップショットグループが関連付けられているため、別の VM にはアタッチできません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10002": "SecurityMachineManagerImpl: インスタンス %s の SecurityMachineEncrypt に失敗しました", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_HTTP_10001": "HTTPテンプレート保存エラーです。テンプレート内容を確認してください: %s", + "ORG_ZSTACK_STORAGE_CDP_10097": "VM作成ジョブがキャンセルされました。パラメータを確認し、再試行してください。", + "ORG_ZSTACK_STORAGE_CDP_10095": "取り消しジョブのキャンセル: 変更取り消し操作がキャンセルされました。すべての依存タスクが完了してから、再試行してください。", + "ORG_ZSTACK_ACCESSKEY_10002": "[Account ID: %s, User ID: %s] は有効なアカウントまたはIAM2プロジェクト/ユーザーではありません", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10019": "シャーシ [uuid:%s] への接続の確立に失敗しました。IPMI設定を確認してください。", + "ORG_ZSTACK_ACCESSKEY_10001": "指定されたAccess Keyが必要な場合は、AccessKeyIDとAccessKeySecretの両方を同時に指定する必要があります。", + "ORG_ZSTACK_ACCESSKEY_10004": "[account ID: %s, user ID: %s] のaccessKey数が最大制限を超えています", + "ORG_ZSTACK_ACCESSKEY_10000": "[accountUuid:%s, userUuid:%s] の操作を実行する権限がありません", + "ORG_ZSTACK_TEST_10008": "エラーリストに存在不应该在", + "ORG_ZSTACK_TEST_10009": "错误列表中也不应该出现我", + "ORG_ZSTACK_TEST_10006": "クラウド展開が完了しました。意図したとおりです。", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10020": "ファイルからシャーシ情報を読み込めません。理由: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10029": "別の接続セキュリティマシーンバスクが実行されています。新しいタスクをキャンセルし、完了するまでお待ちください。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10026": "securityMachineが無効です。ハートビートの検出に失敗しました。securityMachineが有効で正しく構成されていることを確認してください。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10027": "%s インスタンスのハートビート検出に失敗しました", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10028": "%s ハートビート検出例外", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10021": "データ[%s]の復号化または暗号化アルゴリズムタイプ[%s]がnullです", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10022": "無効な復号化アルゴリズムタイプ: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10024": "暗号化機能を無効にすることはできません。リソースプール内にサービスを提供する同期されたセキュア仮想マシンが少なくとも1台存在します。暗号化機能を無効にする前に、同期されたセキュア仮想マシンの数を0に減らしてください。", + "ORG_ZSTACK_TEST_10004": "同样地,我也不应该出现在错误列表中,原因是 %d", + "ORG_ZSTACK_TEST_10005": "有意 %d", + "ORG_ZSTACK_SNS_SYSTEM_10002": "APIリソースを削除できません", + "ORG_ZSTACK_TEST_10003": "我也不应该出现在错误列表中 %d", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10019": "不明な暗号化タイプ[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10014": "シークレットリソースプール [%s] のモデルが見つかりません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10015": "現在の状態[%s]では手動の状態変更が許可されていません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10016": "暗号化機能が有効な場合、すべてのセキュリティVMを無効にすることはできません。少なくとも1つのセキュリティVMがアクティブであることを確認してください。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10017": "リソースプールUUIDが認証用に構成されていることを確認してください。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10010": "暗号化機能は有効ですが、データ保護用のリソースプール[%s]が構成されていません。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10013": "モデル[%s]タイプ[%s]のクライアントとサーバーの可用性例外", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10003": "SSH接続の確立に失敗しました。クラウドインスタンスの設定とネットワーク構成を確認してください。", + "ORG_ZSTACK_AI_VM_10006": "UUID: %sのモデルサービスインスタンスグループが見つかりません。モデルサービスインスタンスの保存に失敗しました", + "ORG_ZSTACK_AI_VM_10007": "モデルサービスデプロイコンテキスト: %sのvmインスタンス、config yaml、またはservice yamlがnullです", + "ORG_ZSTACK_AI_VM_10008": "インスタンス%sのデプロイコンテキストまたは仮想マシンがnullです", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10000": "%sから%sへのレプリケーションが失敗しました。エラー: %s", + "ORG_ZSTACK_AI_VM_10009": "タスクのキャンセルに失敗しました、%s", + "ORG_ZSTACK_SNS_SYSTEM_10000": "関連するリソースのため、システムアラームトピックを削除できません。削除を再試行する前に、依存するすべてのリソースが削除されていることを確認してください。", + "ORG_ZSTACK_AI_VM_10002": "分散モデルサービスに必要なデフォルトL3ネットワーク[UUID: %s]にVM NICのIPが見つかりません", + "ORG_ZSTACK_SNS_SYSTEM_10001": "APIトピックを購読できるのはHTTPエンドポイントのみです。提供されたエンドポイント[type:%s]は有効なHTTPエンドポイントではありません", + "ORG_ZSTACK_AI_VM_10003": "ModelServiceSessionはnullにできません。クラウドモデルサービスに対して有効なセッションが確立されていることを確認してください。", + "ORG_ZSTACK_AI_VM_10004": "モデルサービスのYAML設定を解析できません。サービス定義: %s", + "ORG_ZSTACK_AI_VM_10000": "画像[uuid: %s]が見つかりません", + "ORG_ZSTACK_AI_VM_10001": "YAMLから画像UUIDを取得できません: %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10015": "ネットワーク[%s]はHAグループ[%s]に追加されました。", + "ORG_ZSTACK_ROUTEPROTOCOL_10014": "ネットワーク[%s]はバーチャルルーターエリア[%s]に追加されました。", + "ORG_ZSTACK_ROUTEPROTOCOL_10017": "ルーターID[%s]はこのクラウドシステム内において一意ではありません", + "ORG_ZSTACK_ROUTEPROTOCOL_10016": "ルーターID[%s]はIPv4形式に準拠していません", + "ORG_ZSTACK_AI_VM_10011": "インスタンスURLが空のため、ステータスを取得できません。有効なインスタンスURLを提供して、再試行してください。", + "ORG_ZSTACK_HYBRID_BACKUP_10000": "%sはクラウド環境での管理者アカウントによってのみ呼び出すことができます。", + "ORG_ZSTACK_EXTERNALSERVICE_CRONJOB_10001": "cronデーモンが実行されていません。開始され正しく構成されていることを確認してください。", + "ORG_ZSTACK_ROUTEPROTOCOL_10003": "[%s] は IPv4 アドレス形式に準拠していません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10030": "クラウド環境内のすべての仮想マシンの check-all-security-machine-token-sync に失敗しました。セキュリティトークンとマシンの構成を確認してください。", + "ORG_ZSTACK_ROUTEPROTOCOL_10008": "AreaId[%s] がプロビジョニング済みです", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10031": "FlkSecClientFactory 接続テストに失敗しました", + "ORG_ZSTACK_ROUTEPROTOCOL_10009": "認証タイプが %s の場合、KeyID とパスワードは null であってはなりません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10027": "セキュリティマシーン %s のデータ保護トークンの生成に失敗しました。理由: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10029": "セキュリティインスタンス %s の暗号化結果の取得に失敗しました。理由: %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10011": "認証タイプが %s の場合、パスワードの長さは 8 バイトを超えてはなりません。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10028": "セキュリティマシーン %s の HMAC トークン生成に失敗しました。理由: %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10010": "認証タイプが %s の場合、パスワードは null であってはなりません", + "ORG_ZSTACK_ROUTEPROTOCOL_10013": "すべてのネットワークは仮想ルーター [%s] に関連付けられている必要があります", + "ORG_ZSTACK_ROUTEPROTOCOL_10012": "AreaId[%s] は有効なゾーン識別子である必要があります", + "ORG_ZSTACK_ALIYUN_IDENTITYZONE_10000": "要求されたリソースのアイデンティティ認証情報が見つかりません。有効なアクセスキーとシークレットキーを提供していることを確認してください。", + "ORG_ZSTACK_STORAGE_CDP_10005": "BackupStorage[uuid: %s] はすでに削除されています", + "ORG_ZSTACK_STORAGE_CDP_10001": "kvmagent は %d 回応答がありません", + "ORG_ZSTACK_STORAGE_CDP_10004": "クラウドデプロイパイプラインタスク[uuid: %s] に関連する仮想マシンが見つかりません", + "ORG_ZSTACK_STORAGE_CDP_10000": "KVM エージェントが再起動されました。仮想マシンに影響がないか確認してください。", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10011": "ハードウェア VXLAN ネットワークは、ハードウェア VXLAN プール内にのみ作成できます。", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10010": "ハードウェア VXLAN プール内にはハードウェア VXLAN ネットワークのみを作成できます。", + "ORG_ZSTACK_STORAGE_CDP_10016": "ホスト [UUID: %s] の libvirt は CDP タスクの作成をサポートしていません。libvirt バージョンを確認してください。", + "ORG_ZSTACK_HYBRID_DATACENTER_10003": "データセンター [%s] は現在同期中のため、お待ちください。", + "ORG_ZSTACK_STORAGE_CDP_10017": "ホスト [UUID: %s] の qemu は CDP タスクの作成をサポートしていません。qemu バージョンを確認してください。", + "ORG_ZSTACK_HYBRID_DATACENTER_10002": "aliyun で指定されたリージョン %s は無効です", + "ORG_ZSTACK_STORAGE_CDP_10018": "VM[uuid:%s] で実行されている QEMU バージョンは mirrorBitmap 機能をサポートしていません。互換性のある QEMU バージョンを使用していることを確認してください。", + "ORG_ZSTACK_STORAGE_CDP_10012": "query-mirror: VM[uuid:%s] のホストが見つかりません", + "ORG_ZSTACK_AI_EVALUATION_10000": "UUID: %s のグループはデータベースに見つかりません", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10002": "KVM ホスト[uuid:%s] でハードウェアデバイス[uuid:%s, type:%s, vlan:%s] の VXLAN ネットワークブリッジ[%s] の作成に失敗しました。理由: %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10001": "SDN コントローラータイプ:%s の SDN コントローラー工場が存在しません", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10000": "VXLAN プール [uuid:%s] の SDN コントローラーが存在しません", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10006": "VM UUID [%s] の VXLAN ネットワークを宛先ホスト UUID [%s] に設定できません", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10005": "SDN コントローラー %s が見つかりません", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10003": "KVM ホスト[uuid:%s] でハードウェアVxlan[uuid:%s, name:%s] のブリッジ[%s] のチェックに失敗しました。%s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10009": "ハードウェア VXLAN ネットワークプールは物理インターフェース %s を設定する必要があります", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10008": "ハードウェア VXLAN ネットワークプールは L3 ネットワークの作成をサポートしていません", + "ORG_ZSTACK_HYBRID_DATACENTER_10001": "regionId [%s] はアクセスキー [%s] ですでに作成されています", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10007": "KVM ホスト[uuid:%s] で HardwareVxlanPool [uuid: %s, name: %s] の物理ネットワークインターフェースの検証に失敗しました。%s", + "ORG_ZSTACK_HYBRID_DATACENTER_10000": "dcType [%s] はサポートされていないタイプです", + "ORG_ZSTACK_STORAGE_CDP_10027": "無効な時間文字列: %s は ISO オフセット形式(例: %s)に従ってフォーマットする必要があります", + "ORG_ZSTACK_STORAGE_CDP_10023": "仮想マシンインスタンスは現在 Continuous Data Protection (CDP) タスクを実行中です。ボリュームを接続するとフルバックアップに必要な計画サイズを超えます。CDP タスクのサイズを調整して再試行してください。", + "ORG_ZSTACK_STORAGE_CDP_10024": "ボリューム[%s] の VM[%s] は現在 Continuous Data Protection (CDP) で実行中のため、現在サイズ変更できません。", + "ORG_ZSTACK_STORAGE_CDP_10025": "CDPタスク[uuid: %s]が異常なステータス変更を検出しました。古いステータス: %sから新しいステータス: %sへ、原因: %s", + "ORG_ZSTACK_STORAGE_CDP_10026": "CDPタスクは引き続きアクティブです", + "ORG_ZSTACK_STORAGE_CDP_10022": "CDPタスク[uuid:%s]が見つかりません", + "ORG_ZSTACK_AI_EVALUATION_10001": "グループ[uuid: %s, type:%s]のバックエンドインスタンスが一致しません", + "ORG_ZSTACK_AI_EVALUATION_10002": "提供されたモデルサービスグループUUIDを使用してModel Service Instance Group VOを見つけることができません。これは、評価タスクを実行する関連サービスグループが見つからないことを示しています。その結果、タスクは「完了」としてマークされる代わりに中間ステータスに残ります。タスクは自動的に「失敗」に更新され、エラーは記録されます。", + "ORG_ZSTACK_LOGINCONTROL_10002": "無効なルール式です。アクセス制御ルールの追加に失敗しました: %s", + "ORG_ZSTACK_LOGINCONTROL_10005": "認識できないキー: %s", + "ORG_ZSTACK_LOGINCONTROL_10006": "%sリソース設定のキー:値が不足しています", + "ORG_ZSTACK_PORTAL_APIMEDIATOR_10008": "resourceUuid[%s]は有効なUUIDではありません。有効なUUID(v4推奨)はハイフンなしでフォーマットされ、正規表現'[0-9a-f]{8}[0-9a-f]{4}[1-5][0-9a-f]{3}[89ab][0-9a-f]{3}[0-9a-f]{12}'に一致する必要があります。詳細については、http://en.wikipedia.org/wiki/Universally_unique_identifier を参照してください。", + "ORG_ZSTACK_LOGINCONTROL_10007": "パスワード強度設定のフォーマットが正しくありません", + "ORG_ZSTACK_LOGINCONTROL_10008": "最小値は最大値より大きくすることはできません", + "ORG_ZSTACK_STORAGE_CDP_10039": "バックアップストレージが見つかりません[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10034": "クラウドコンピューティング環境で予期しないタスクタイプ[uuid: %s, type: %s]", + "ORG_ZSTACK_STORAGE_CDP_10035": "Cloud Data Protectionタスク[uuid: %s]の最大容量が見つかりません。更新してください。", + "ORG_ZSTACK_STORAGE_CDP_10036": "CDPSessionTask[uuid: %s]の最大レイテンシが見つかりません。更新してください。", + "ORG_ZSTACK_STORAGE_CDP_10037": "VM[uuid: %s]はすでに終了しています", + "ORG_ZSTACK_STORAGE_CDP_10031": "VMがシャットダウンされていません。現在のステータス: %s", + "ORG_ZSTACK_STORAGE_CDP_10032": "共有ボリューム[%s]は他の仮想マシンによって使用されています。", + "ORG_ZSTACK_STORAGE_CDP_10033": "タスクが見つかりません[uuid: %s]", + "ORG_ZSTACK_LOGINCONTROL_10012": "仮想環境に名前: %s、タイプ: %sのユーザーが見つかりません", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10011": "APIリクエストではIPMIシャーシタイプが指定されていますが、受信したメッセージはAPICreateBareMetal2ChassisHardwareInfoMsgタイプではありません。メッセージタイプが指定されたシャーシタイプと一致していることを確認してください。", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10012": "不明なベアメタルシャーシのハードウェア情報を受信しました[ipmi_addr:%s, ipmi_port:%d]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10010": "ファイルからBareMetal2 IPMIシャーシ情報を読み込めません。理由: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10015": "BareMetal2 IPMIシャーシーのパワーリセットに失敗しました[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10016": "インスタンスのリモートIPXEブートに失敗しました[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10013": "BareMetal2 IPMIシャーシーの電源投入に失敗しました[UUID:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10014": "BareMetal2 IPMIシャーシーの電源切断に失敗しました[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10049": "VM [UUID: %s]はすでにCDPタスクを開始しているため、バックアップジョブを同時に作成することはできません。", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10008": "Windows Local Diskベアメタルインスタンスは仮想マシンの自動作成をサポートしていません。", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10009": "クラスター[uuid:%s]で利用できるベアメタル2ゲートウェイがありません", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10006": "Cluster[uuid:%s]はBareMetal2仮想化環境ではありません。", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10007": "Cluster[uuid:%s]は有効になっていません。", + "ORG_ZSTACK_STORAGE_CDP_10045": "必須引数が不足しています: %s", + "ORG_ZSTACK_STORAGE_CDP_10046": "1日あたりの保持期間と1日あたりのRP開始日は同じにできません。異なる値を設定してください。", + "ORG_ZSTACK_STORAGE_CDP_10047": "1つの仮想マシンUUIDが必要ですが、%d個指定されています。", + "ORG_ZSTACK_STORAGE_CDP_10048": "リソース[uuid: %s]は仮想マシンインスタンスではありません。", + "ORG_ZSTACK_STORAGE_CDP_10041": "バックアップストレージ[UUID: %s]はクラウド環境に接続されていません。適切に設定され統合されていることを確認してください。", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10005": "Cluster[uuid:%s]はベアメタルクラスタ構成ではありません。", + "ORG_ZSTACK_STORAGE_CDP_10042": "VM[UUID: %s]は既にバックアップ job が作成されているため、Continuous Data Protection(CDP)タスクを同時に有効にすることはできません。", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10007": "IPMIアドレスとポートは既に存在します。", + "ORG_ZSTACK_STORAGE_CDP_10044": "仮想リソースの割り当ては物理リソースの割り当てより大きくなければなりません", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10001": "ベアメタルサーバーへの接続を確立するには、以下を確認してください: 1. IPMIインターフェースがアクティブであることを確認します; 2. IPMIアドレス、ポート、ユーザー名、パスワードが正しいことを確認します; 3. BIOS設定でIPMI over LANが有効になっていることを確認します。", + "ORG_ZSTACK_STORAGE_CDP_10040": "バックアップストレージ[uuid: %s]はクラウド環境で無効になっています。", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10009": "UUID: %sのベアメタルシャーシはUUID: %sのpxeserverを使用するように構成されていますが、DHC要求は実際にはUUID: %sのpxeserverによって処理されました。", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10008": "クラスタ[uuid:%s]に接続された使用可能なベアメタルPXEサーバーがありません", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10000": "ベアメタルIPMI 2シャーシ%sには2つの既存エントリがあります", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10001": "IPMIアドレス %sは無効です", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10004": "IPMIアドレス %sとポート %dのベアメタルシャーシは既に作成されています。", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10005": "Cluster[uuid:%s]は存在しません。", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10002": "ベアメタルノードとの接続を確立できませんでした。以下を確認してください: 1. IPMI接続がアクティブです; 2. IPMIアドレス、ポート、ユーザー名、パスワードが正しいです; 3. BIOS設定でIPMI over LANが有効になっています。", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10003": "IPMIアドレス %sとポート %dのBareMetal2シャーシは既に作成されています。", + "ORG_ZSTACK_STORAGE_CDP_10056": "複数のルートディスクが見つかりました: %s", + "ORG_ZSTACK_STORAGE_CDP_10058": "VMバックアップのルートボリュームが見つかりません。%s", + "ORG_ZSTACK_STORAGE_CDP_10059": "ボリューム %sはバックアップに含まれていますが、VM[UUID: %s]から切り離されています。VMに再度接続するか、バックアップセットから削除してください。", + "ORG_ZSTACK_STORAGE_CDP_10053": "VM[uuid: %s]のCloud Drive Provisioningタスクが見つかりません", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10015": "ベアメタルシャーシ[uuid:%s]のリモート電源投入に失敗しました", + "ORG_ZSTACK_STORAGE_CDP_10054": "VM[uuid: %s]のCDPタスクはBackstore[uuid: %s]に見つかりません", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10018": "インスタンス[uuid:%s]のリモートPXEブートに失敗しました", + "ORG_ZSTACK_STORAGE_CDP_10055": "recoverVm: 仮想Machine[uuid: %s]のホスト[uuid: %s]が見つかりません", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10017": "ベアメタルシャーシ[uuid:%s]のリモートパワーリセットに失敗しました", + "ORG_ZSTACK_STORAGE_CDP_10050": "ボリュームスナップショット機能用のプライマリストレージ [uuid:%s] を要求できません。詳細については [%s] を参照してください", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10014": "ベアメタルシャーシ %s の削除に失敗しました", + "ORG_ZSTACK_STORAGE_CDP_10051": "recoverVm: ホストUUIDが提供されず、VM[uuid: %s] の元のホストが見つかりません。", + "ORG_ZSTACK_SSHKEYPAIR_10009": "SSHキーペア [uuid:%s] は仮想マシン [uuid:%s] にアタッチされていません。", + "ORG_ZSTACK_SSHKEYPAIR_10008": "SSHキーペア [uuid:%s] はすでに仮想マシン [uuid:] にアタッチされています。", + "ORG_ZSTACK_SSHKEYPAIR_10007": "sshKeyPair[uuid:%s] は現在使用中です。", + "ORG_ZSTACK_STORAGE_CDP_10067": "CDPバックアップ %s:%d からルートボリュームが見つかりません", + "ORG_ZSTACK_STORAGE_CDP_10068": "CDPバックアップ %s:%d からルートボリュームが見つかりません", + "ORG_ZSTACK_SSHKEYPAIR_10011": "リソースタイプ %s はSSHキーペアのアタッチでサポートされていません。許可されるタイプは %s です", + "ORG_ZSTACK_SSHKEYPAIR_10010": "vmInstance[uuid:%s] は実行中の状態ではありません。", + "ORG_ZSTACK_STORAGE_CDP_10063": "VMクラウドデプロイプロセス[uuid: %s] が見つかりません", + "ORG_ZSTACK_STORAGE_CDP_10064": "クラウドデプロイパイプラインタスク[uuid: %s] のVMインスタンスが見つかりません", + "ORG_ZSTACK_STORAGE_CDP_10065": "仮想マシンバックアップからボリュームレコードが見つかりません。VM設定とバックアップ設定を確認してください。", + "ORG_ZSTACK_STORAGE_CDP_10066": "CDPバックアップ %s:%d から複数のルートディスクが見つかりました", + "ORG_ZSTACK_V2V_KVM_10003": "'srcVmUrl' にVM UUIDがありません", + "ORG_ZSTACK_STORAGE_CDP_10060": "予期せぬボリューム[uuid: %s] サイズ不一致: 想定サイズ %d バイトと異なるサイズを受信しました", + "ORG_ZSTACK_V2V_KVM_10004": "インスタンスのルートディスクが見つかりません: %s", + "ORG_ZSTACK_STORAGE_CDP_10061": "ボリューム[uuid: %s] のリサイズに失敗しました: %s", + "ORG_ZSTACK_STORAGE_CDP_10062": "ボリューム[uuid: %s] に予期せぬボリュームパスがあります: %s", + "ORG_ZSTACK_V2V_KVM_10007": "KVM V2V変換ホスト[hostUuid:%s] のクリーンアップに失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_CDP_10078": "VM[uuid: %s] のCDPポリシーが見つかりません", + "ORG_ZSTACK_STORAGE_CDP_10075": "グループID %d のリカバリポイントが見つかりません", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10018": "無効な変数: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10075": "NFSプライマリストレージ[uuid:%s, name:%s] は、操作を実行するためにアタッチされたホストクラスターが見つかりません", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10077": "ボリューム[uuid:%s] のホストが見つかりません", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10020": "リソース [%s] のリスト出力が必要ですが、単一のオブジェクトが返されました", + "ORG_ZSTACK_ZBOX_10007": "zbox[name:%s] はReady状態ではありません。現在のステータスは %s です", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10025": "クラウドリソース管理のコンテキストでは一部のアクションが無効です。パラメータを確認して再試行してください。", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10022": "リソース [%s] は事前に設定する必要があります!", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10006": "宛先ホスト [UUID:%s] にはプライマリストレージ [UUID:%s] 用の十分な物理容量がありません。閾値は %f で、利用可能な物理容量は %d です", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10007": "UUID [%s]のボリュームは'Ready'状態ではないため、移行できません。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10008": "データボリューム[UUID: %s, name: %s]は仍然として仮想マ...[Note: This appears to be truncated in the original input]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10009": "UUID %sのボリュームはUUID %sのVMのルートボリュームです。現在、VMは%sの状態です。移行を開始する前にVMを停止してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10002": "UUID [%s]のボリュームはすでにUUID [%s]のホストに接続されています。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10003": "プライマリストレージ[UUID:%s]が見つかりません", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10004": "プライマリストレージ[UUID:%s]は無効になっているか、メンテナンス中のコールドマイグレーションが許可されていません。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10005": "UUID [%s]の宛先ホストは、ボリュームUUID [%s]が存在するUUID [%s]のローカルプライマリストレージに属していません。", + "ORG_ZSTACK_ZBOX_10001": "zbox[UUID:%s]は仍然使用中のため、取り出すことができません。", + "ORG_ZSTACK_ZBOX_10002": "zbox[UUID:%s]はReady状態ではないため、容量を同期できません。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10000": "VM [UUID:%s]のすべてのボリュームに必要なストレージ容量を提供できるホストがありません。", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10004": "Aliyunアカウント[UUID:%s]は存在しません", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10001": "UUID [%s]のボリュームはどのローカルプライマリストレージにも接続されていません。", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10005": "電話番号[%s]が無効です。+86-12345678901の形式で入力してください", + "ORG_ZSTACK_ZBOX_10005": "zbox[UUID: %s]は削除された可能性があります", + "ORG_ZSTACK_ZBOX_10006": "USBデバイス[uuid:%s]はVM [uuid:%s]に接続されており、Zboxに追加できません。", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10000": "Aliyun SMSイベントテキストテンプレートが見つかりません。正しく設定されていることを確認して、再試行してください。", + "ORG_ZSTACK_ZBOX_10003": "zboxのマウントパス[mountPath: %s]内のファイルのみ削除できますが、[%s]が渡されました。", + "ORG_ZSTACK_ZBOX_10004": "zbox[name:%s]はReady状態ではありません。現在の状態は%sです", + "ORG_ZSTACK_SSHKEYPAIR_10006": "SSHキーペア%sはすでにアップロードされています。", + "ORG_ZSTACK_SSHKEYPAIR_10005": "操作エラー、原因: %s", + "ORG_ZSTACK_SSHKEYPAIR_10003": "SSHキーペア[uuid:%s]はVM [uuid:%s]に関連付けられません。キーが見つかりません", + "ORG_ZSTACK_SSHKEYPAIR_10002": "公開キーの読み込みに失敗しました: %s、エラー: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10043": "InfoSecClientFactory接続テストに失敗しました", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10044": "現在、この環境では%sリソースプールの作成はサポートされていません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10041": "公開キーからサブジェクト識別名の抽出に失敗しました: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10042": "すべての仮想マシンのセキュリティマストークン存在チェックに失敗しました", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10040": "暗号化された公開キーの解析に失敗しました", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10058": "NFSプライマリストレージ[uuid:%s, name:%s]は、データボリューム[uuid:%s, name:%s]を作成するための使用可能なホストを見つけられません", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10054": "vm[uuid:%s]はRunning、Paused、またはStopped状態ではありません。現在の状態は%sです", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10055": "UUID:%sのプライマリストレージはどのクラスターにも接続されていません", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10050": "使用可能なバックエンドプロバイダが見つかりません。有効なクラウドプロバイダが構成されていることを確認して、もう一度お試しください。", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10051": "NFSプライマリストレージ [uuid:%s, name:%s] が接続されている「Connected」状態のホストが見つかりません。ボリューム [uuid:%s] をスナップショット [uuid:%s, name:%s] に戻す操作を実行できません。", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10052": "NFSプライマリストレージ [uuid:%s, name:%s] が接続されている接続状態のホストが見つかりません。ボリューム [uuid:%s] をイメージ [uuid:%s] に戻す操作を実行できません。", + "ORG_ZSTACK_IAM2_10019": "cron式を解析できません。標準のcron形式仕様に 따라正しくフォーマットされていることを確認してください。", + "ORG_ZSTACK_IAM2_10018": "プロジェクト [UUID: %s, name:%s] は %s の状態のため、操作 [%s] は許可されていません。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10038": "セキュリティアプライアンス %s のデータ保護トークン %s の生成に失敗しました。原因是: %s", + "ORG_ZSTACK_IAM2_10015": "UUID %s の組織を、その親組織のUUID %s の子として設定することはできません。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10039": "セキュリティアプライアンス %s のHMACトークン %s の生成に失敗しました。原因是: %s", + "ORG_ZSTACK_IAM2_10014": "現在の組織 [uuid:%s] は古い状態のため、アクティブ化してください。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10036": "クラウドリソース割り当てのトークン生成に失敗しました。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10037": "セキュリティマシーン %s のアクティブ化トークン生成に失敗しました。原因是: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10034": "秘密鍵のインポートに失敗しました。鍵が正しく構成されており、クラウド環境でアクセス可能であることを確認してください。", + "ORG_ZSTACK_IAM2_10011": "仮想インスタンスID [uuid:%s] が正しくありません。インスタンスが存在しないか、パスワードが間違っています。", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10005": "無効なタイプ形式 [%s]", + "ORG_ZSTACK_IAM2_10010": "プロジェクト [uuid:%s, name:%s] のアカウントが見つかりません。クラウド環境に正しいアクセス権限と認証情報が構成されていることを確認してください。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10035": "テスト鍵の生成中にセキュリティインスタンス %s への接続が失敗しました。原因是: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10006": "Cloudリソースのみサポートしていますが、 [%s] が指定されました。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10032": "秘密鍵のエクスポートに失敗しました: %s", + "ORG_ZSTACK_IAM2_10013": "仮想IDはプロジェクトに属していません。", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10003": "このアクションタイプ [%s] はサポートされていません。", + "ORG_ZSTACK_IAM2_10012": "仮想ID [name:%s] は設定により無効化されています。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10030": "encryptSubjectDNはnullであってはなりません。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10031": "クラウドインスタンス %s のメタデータエンベロープの解析に失敗しました。", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10002": "このクラウドリソースタイプ [%s] はサポートされていません。", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10068": "NFSプライマリストレージ [uuid:%s, name:%s] はどのクラスタにも接続されていません、または接続されたクラスタに接続されているホストがありません。", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10009": "無効なタイプ: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10007": "ResourceまたはActionのみサポートしていますが、 [%s] が指定されました。", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10008": "デフォルト値はタイプ [%s] で指定されたJSON形式でなければなりませんが、 [%s] が検出されました。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10029": "cipherTextはnullであってはなりません。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10027": "暗号化されたリソースにアクセスするための秘密鍵が見つかりません。秘密鍵が正しく構成されており、必要なアクセス権限があることを確認してください。", + "ORG_ZSTACK_IAM2_10009": "プロジェクト[name:%s]は存在しません", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10000": "ドライバーからnullのインストールパスが返されました: %s", + "ORG_ZSTACK_IAM2_10004": "ファイルからVirtualMachine ID情報を読み込めません\\n%s", + "ORG_ZSTACK_IAM2_10003": "コードに%d個の問題があります。", + "ORG_ZSTACK_IAM2_10006": "ファイルからVirtual Machine ID情報の構築に失敗しました。", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10001": "%s: ヘルスステータス: %s", + "ORG_ZSTACK_IAM2_10005": "UUID [%s]は既に存在します。別のものを試してください。", + "ORG_ZSTACK_MEMORY_10000": "host[%s]上に%sのデータが見つかりません", + "ORG_ZSTACK_PCIDEVICE_10036": "VMに接続されているhost [UUID:%s]上のPCIデバイスをSR-IOV仮想化できません", + "ORG_ZSTACK_PCIDEVICE_10035": "host [UUID:%s]内のPCIデバイスは既にSRIOV仮想化されています。", + "ORG_ZSTACK_PCIDEVICE_10034": "host [UUID:%s]でIOMMUが無効になっているため、デバイスのSRIOVを有効にできませんでした", + "ORG_ZSTACK_PCIDEVICE_10033": "PCIデバイス[uuid:%s]は利用できません", + "ORG_ZSTACK_PCIDEVICE_10039": "PCIデバイス[UUID:%s]は存在しないか、SRIOV仮想化されていません", + "ORG_ZSTACK_PCIDEVICE_10037": "ホスト[uuid:%s]では%sドメインあたり%d個の仮想PCIデバイスのみを生成できます", + "ORG_ZSTACK_STORAGE_CDP_10109": "バックアップストレージ[uuid:%s]はすでにアップグレードされています", + "ORG_ZSTACK_STORAGE_CDP_10104": "タスク[uuid:%s]は终止されました", + "ORG_ZSTACK_STORAGE_CDP_10105": "CDPタスクはデータマージ中です。ピッキング操作を開始しないでください", + "ORG_ZSTACK_STORAGE_CDP_10106": "CDPタスク[uuid:%s]がストレージ使用量を超えました:最大%d GB、使用済み%d GB", + "ORG_ZSTACK_STORAGE_CDP_10107": "予期しないVMインスタンス状態: %s", + "ORG_ZSTACK_STORAGE_CDP_10102": "CDPタスク[uuid:%s]に関連付けられた仮想マシンが見つかりません", + "ORG_ZSTACK_PCIDEVICE_10047": "PCIデバイス[uuid:%s]は管理デバイスに仮想化されていません", + "ORG_ZSTACK_PCIDEVICE_10045": "PCIデバイス [uuid:%s] はmdev仕様 [uuid:%s] によって仮想化できません", + "ORG_ZSTACK_PCIDEVICE_10044": "PCIデバイス [UUID:%s] をMDEVに仮想化できません。有効化と切り離しを確認してください。", + "ORG_ZSTACK_PCIDEVICE_10049": "PCIデバイス [UUID:%s] が接続されているホスト [UUID:%s] は接続されていません。", + "ORG_ZSTACK_PCIDEVICE_10048": "から生成されたPCIデバイスはまだVMインスタンスに接続されています", + "ORG_ZSTACK_STORAGE_CDP_10119": "予期しないタスクタイプ: %s", + "ORG_ZSTACK_PCIDEVICE_10043": "PCIデバイス[%s]の割り当てを解除できません。その仮想機能が使用中です。\\n詳細:\\n%s", + "ORG_ZSTACK_PCIDEVICE_10042": "PCIデバイス[%s]の生成解除ができません。これはGPUでもネットワークインターフェースコントローラーでもないため。", + "ORG_ZSTACK_PCIDEVICE_10041": "ホスト[uuid:%s]上の仮想PCIデバイスを生成解除できません。これらはまだVMに接続されています。", + "ORG_ZSTACK_PCIDEVICE_10040": "PCIデバイス[uuid:%s]の生成解除に失敗しました。ホスト[uuid:%s]が接続されていません。", + "ORG_ZSTACK_STORAGE_CDP_10117": "CDPタスク[uuid: %s]が見つかりません", + "ORG_ZSTACK_STORAGE_CDP_10118": "CDPタスク[uuid: %s]のステータスが異常に変更されました。古いステータス: %s、新しいステータス: %s。ストレージクォータを超過したため、現在の値: %d、クォータ: %d。", + "ORG_ZSTACK_STORAGE_CDP_10111": "バックアップストレージ[UUID: %s]のQEMU-imgバージョンをアップグレードする必要があります。", + "ORG_ZSTACK_STORAGE_CDP_10112": "VM %s に対してCloud Data Protectionタスクが見つかりません", + "ORG_ZSTACK_STORAGE_CDP_10113": "仮想マシン %s に対してバックアップストレージが設定されていません", + "ORG_ZSTACK_STORAGE_CDP_10114": "クラウド環境にタイプ[%s]のCdpBackupFactoryが見つかりません", + "ORG_ZSTACK_STORAGE_CDP_10110": "バックアップストレージ[UUID: %s]のアーキテクチャは、継続的データ保護タスクのアップグレードをサポートしていません", + "ORG_ZSTACK_IDENTITY_10072": "アカウント[identifier: %s]のクォータ[name: %s]を更新できません", + "ORG_ZSTACK_IDENTITY_10071": "クォータ[uuid:%s, type:%s]のクォータ更新チェッカーが見つかりません", + "ORG_ZSTACK_AI_CONTAINER_10001": "クラウド環境にuuid %sのモデルセンターが見つかりません", + "ORG_ZSTACK_AI_CONTAINER_10005": "サービスURLの取得に失敗しました。サービスIPアドレスがnullである可能性があります。Kubernetesネットワーク構成を確認してください。", + "ORG_ZSTACK_AI_CONTAINER_10004": "クラウド環境でのKubernetesサービスの作成に失敗しました", + "ORG_ZSTACK_AI_CONTAINER_10003": "クラウドコンピューティングリソースの制約または構成の問題により、名前空間 %s 内のアプリケーション %s 用のKubernetes Deploymentの作成に失敗しました。リソース割り当てと展開構成を確認してください。", + "ORG_ZSTACK_AI_CONTAINER_10009": "エンドポイント[UUID: %s]が見つからないため、データベース内のコンテナリソースを同期できません", + "ORG_ZSTACK_AI_CONTAINER_10007": "Kubernetesクラスタでのストレージサービスの初期化に失敗しました", + "ORG_ZSTACK_AI_CONTAINER_10006": "分散モデルサービスインスタンス %s のネットワークポリシーの作成に失敗しました", + "ORG_ZSTACK_TAG2_10011": "リソース[uuid:%s]は %d 個のタグに関連付けられており、これ以上追加できません。", + "ORG_ZSTACK_IDENTITY_10063": "ステートメントには空ではないアクションフィールドが必要です。無効なステートメント[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10006": "ゾーン[uuid:%s]にURL %s のNFSプライマリストレージが既に存在します", + "ORG_ZSTACK_IDENTITY_10062": "ステートメントはアクションフィールドを指定する必要があります。無効なステートメント[%s]", + "ORG_ZSTACK_IDENTITY_10061": "ステートメントは値を割り当てるか、状態に効果を与える必要があります。無効なステートメント[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10008": "ネットワークインターフェースに関連付けられたCIDRブロックが複数見つかりました。単一のCIDRブロックを指定するか、ネットワーク構成を確認してください。", + "ORG_ZSTACK_IDENTITY_10060": "グループ[name: %s, uuid: %s]はアカウント[uuid: %s]に関連付けられていません", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10009": "無効なCIDRブロック: %s", + "ORG_ZSTACK_IDENTITY_10067": "管理者アカウントの名前は更新できません。アカウント情報の変更に正しい構文とパラメータを使用していることを確認してください。詳細については、公式ドキュメントを参照してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10002": "指定されたプレースメントグループ[uuid: %s]のクラスタに接続されたホストが見つかりません", + "ORG_ZSTACK_IDENTITY_10066": "提供されたパスワードはアカウント[UUID: %s]のパスワードと一致しません。正確性を確認して再試行してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10003": "NFSプライマリストレージ[uuid:%s]でコマンドを実行するための接続されたホストが見つかりません", + "ORG_ZSTACK_IDENTITY_10065": "アカウントにはすでに %s と一致する名前が存在します", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10004": "NFSプライマリストレージ[uuid:%s]でコマンドを実行するための接続されたNFS接続を持つホストが見つかりません", + "ORG_ZSTACK_IDENTITY_10069": "アカウント[uuid: %s, name: %s]は標準アカウントであり、別のアカウント[uuid: %s]のパスワードをリセットする権限がありません。", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10000": "NFSプライマリストレージ[uuid:%s]はコンピュートクラスタに接続されていないため、仮想マシン[uuid:%s]のルートボリューム[uuid:%s]を削除できません。", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10004": "boot mode %sのbaremetal2イメージのみサポートされています", + "ORG_ZSTACK_IDENTITY_10068": "管理者アカウントのみがパスワードを更新できます。", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10003": "bootMode属性はbaremetal2イメージに必須です。", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10002": "raw/qcow2形式のルートボリュームテンプレートのみにbaremetal2タグを付与できます", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10001": "baremetal2タイプのシステムタグは1つのみ許可されていますが、%d個発見されました", + "ORG_ZSTACK_AI_CONTAINER_10012": "IP %sからpod名を取得できませんでした", + "ORG_ZSTACK_AI_CONTAINER_10011": "Pod IPアドレスの取得に失敗しました。コンテナエンドポイントテーブルにエントリを追加できません。Podが実行中でありアクセス可能であることを確認してください。", + "ORG_ZSTACK_AI_CONTAINER_10010": "仮想化環境にuuid %sのクラスタが見つかりません", + "ORG_ZSTACK_COMPUTE_VM_NUMA_10003": "CPUセット[%s]が無効です", + "ORG_ZSTACK_AI_CONTAINER_10016": "k8sデプロイメント%sの取得に失敗しました", + "ORG_ZSTACK_AI_CONTAINER_10015": "Kubernetesサービスの削除に失敗しました: %s", + "ORG_ZSTACK_TAG2_10008": "すべてのトークンタイプを指定する必要があります", + "ORG_ZSTACK_AI_CONTAINER_10014": "Kubernetesデプロイメントの削除に失敗しました: %s", + "ORG_ZSTACK_AI_CONTAINER_10013": "pod %sへのラベル%sの追加に失敗しました", + "ORG_ZSTACK_TAG2_10006": "色の指定[%s]が無効です。#FF00FFのような有効な16進コードである必要があります", + "ORG_ZSTACK_TAG2_10007": "フォーマット[%s]を取得しました。フォーマットはname::{tokenName1}::{tokenName2} ... ::{tokenNameN}または{tokenName1}::{tokenName2} ... ::{tokenNameN}のいずれかである必要があります。名前には'{}:'を含めないでください。", + "ORG_ZSTACK_AI_CONTAINER_10019": "YAML形式が無効です: %s", + "ORG_ZSTACK_TAG2_10004": "シンプルタグパターンが空か、無効なトークンが含まれています", + "ORG_ZSTACK_AI_CONTAINER_10018": "デプロイメント%sにはインスタンス情報がありません", + "ORG_ZSTACK_TAG2_10005": "タグUUIDs %sが無効です。タグタイプはシンプルタイプでなければなりません", + "ORG_ZSTACK_AI_CONTAINER_10017": "デプロイメント%sは存在しません", + "ORG_ZSTACK_IDENTITY_10070": "アカウント[uuid: %s]のQuota[name: %s]が見つかりません", + "ORG_ZSTACK_TAG2_10002": "クラウドリソースメタデータのシンプルタグパターン形式を更新できません", + "ORG_ZSTACK_TAG2_10003": "重複するリソース名が見つかりました。確認して解決してください。", + "ORG_ZSTACK_SNS_PLATFORM_WECOM_10000": "WeComへのメッセージ送信に失敗しました。ステータス: %s、本文: %s", + "ORG_ZSTACK_TAG2_10000": "タグのユニーク制約違反: タイプ[%s]、名前[%s]のタグはアカウント[%d]の下に既に存在します。", + "ORG_ZSTACK_TAG2_10001": "トークンIDのみを更新できます。", + "ORG_ZSTACK_PCIDEVICE_10072": "pciデバイス仕様[uuid:%s]は存在しません", + "ORG_ZSTACK_PCIDEVICE_10071": "PCIデバイスのタイプ[%s]が無効です。サポートされているタイプのみが有効です", + "ORG_ZSTACK_PCIDEVICE_10070": "pciデバイス[uuid:%s]が存在しません", + "ORG_ZSTACK_PCIDEVICE_10075": "PCIデバイス[UUID:%s]が存在しないか、VM[UUID:%s]で無効になっています", + "ORG_ZSTACK_PCIDEVICE_10073": "PCIデバイス仕様のタイプ[%s]が無効です。サポートされているタイプのみが有効です", + "ORG_ZSTACK_AI_CONTAINER_10023": "無効なKubernetesデプロイメントYAML: %s", + "ORG_ZSTACK_AI_CONTAINER_10020": "すべてのPodを終了するためにKubernetesデプロイメント%sにパッチを適用できませんでした", + "ORG_ZSTACK_AI_CONTAINER_10025": "モデルサービスインスタンスグループ%sがデータベースに見つかりません", + "ORG_ZSTACK_AI_CONTAINER_10024": "k8sデプロイメント%sにパッチを適用できませんでした", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10039": "仮想化環境のエラーにより、キャッシュされたイメージ[path:%s]からルートボリューム[uuid:%s]を作成できませんでした", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10040": "originTextまたはcertificateTextはnullにできません", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10036": "NFSプライマリストレージ[uuid:%s]でビット[%s]を削除できませんでした。エラー: %s、インストールパスをクリーンアップします、pinv.getUuid()、rsp.getError()", + "ORG_ZSTACK_NETWORK_L3_10067": "レイヤー3ネットワーク[uuid:%s]でDNS障害が発生しました", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10037": "KVMホスト[uuid:%s, ip:%s]でボリューム[uuid:%s]をスナップショット[uuid:%s]にリストアできませんでした、%s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10038": "KVMホスト[uuid:%s, ip:%s]でボリューム[uuid:%s]をイメージ[uuid:%s]にリストアできませんでした、%s", + "ORG_ZSTACK_CRYPTO_AUTH_10020": "%sのクラスを生成できません", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10032": "NFSプライマリストレージ[uuid:%s]で%sの存在確認に失敗しました。エラー: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10034": "原因により、KVMホスト[uuid:%s, ip:%s]で空のボリューム[uuid:%s, name:%s]を作成できません", + "ORG_ZSTACK_CRYPTO_AUTH_10029": "仮想マシン%sの証明書情報が見つかりません。必要な証明書が正しく構成され、クラウド環境にアップロードされていることを確認してください。", + "ORG_ZSTACK_CRYPTO_AUTH_10028": "暗号化パラメータの平文をJSONオブジェクトに解析できませんでした: %s", + "ORG_ZSTACK_HYGON_10006": "VM[uuid:%s]が見つかりません", + "ORG_ZSTACK_HYGON_10005": "UUID %sのホストには、Hygonセキュリティ機能が有効な仮想マシン%d台が実行中です。まずそれらをシャットダウンしてください。", + "ORG_ZSTACK_HYGON_10004": "ホスト[uuid:%s]に接続されていません", + "ORG_ZSTACK_HYGON_10003": "ホスト[UUID:%s]には、Hygon mdevデバイス向けに'enableCgroupDeviceAcl'パラメータを0より大きく設定する必要があります。mdevデバイスを生成する前にこの設定を構成してください。", + "ORG_ZSTACK_HYGON_10002": "ホスト[UUID:%s]には、Hygon mdevデバイス向けに'reconnect.host.restart.libvirtd.service'構成を'true'に設定する必要があります。mdevデバイスを生成する前にこの設定を構成してください。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10017": "クラウドインスタンス%sの証明書生成に失敗しました", + "ORG_ZSTACK_HYGON_10000": "mdevデバイスを生成解除できません。ホスト[uuid: %s]のVMにmdevデバイス%d個がまだ接続されています。これらのデバイスを使用しているすべてのVMがまず停止されていることを確認してください。", + "ORG_ZSTACK_NETWORK_L3_10073": "レイヤー3ネットワーク[uuid:%s]にプレフィックス[%s]のホストリートがありません。", + "ORG_ZSTACK_NETWORK_L3_10072": "プレフィックス[%s]は有効なIPv4ネットワークCIDRではありません", + "ORG_ZSTACK_NETWORK_L3_10071": "レイヤー3ネットワーク[uuid:%s]にプレフィックス[%s]のホストリートがすでに存在します", + "ORG_ZSTACK_HYGON_10009": "同時割り当てのため、Hygon MDEVデバイスの割り当てに失敗しました。後ほど再試行してください。", + "ORG_ZSTACK_NETWORK_L3_10070": "next-hop[%s]は有効なIPv4アドレスではありません", + "ORG_ZSTACK_HYGON_10008": "host[uuid:%s]上のHygon IOMMU Groupデバイスが不足しています。必要数: %d", + "ORG_ZSTACK_HYGON_10007": "VM[uuid:%s]が[%s]状態の間、Hygon Security Element設定を変更できません。変更を行う前にVMを停止してください", + "ORG_ZSTACK_TICKET_ENTITY_10001": "操作が拒否されました。チケットのステータスは%sのため、操作[%s]を実行できません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10031": "セキュリティグループ[%s]は存在しません", + "ORG_ZSTACK_IDENTITY_10022": "リソース[UUID:%s]が見つかりません。リソースUUIDが正しくないか、管理リソースです", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10049": "クラウドリソース割り当てに使用可能なバックエンドが見つかりません。バックエンドサービスが正しく構成され、利用可能であることを確認してください", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10042": "cluster[uuid:%s]内の利用可能なホストがありません", + "ORG_ZSTACK_IDENTITY_10026": "%sは認識されたAPIエンドポイントではありません", + "ORG_ZSTACK_IDENTITY_10025": "userUuid[%s]で指定されたユーザーは現在のアカウントに属しておらず、現在のアカウントには管理権限がないため、ユーザーの権限を確認できません", + "ORG_ZSTACK_IDENTITY_10029": "account[uuid:%s]が見つかりません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10001": "security instance[uuid:%s]のモデルが無効です", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10037": "アルゴリズムタイプ%sは無効です。サポートされているタイプ: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10002": "security instance [%s]の手動同期トリガーに失敗しました。security instanceがキーを同期したか確認してください", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10038": "データ保護で指定されたリソースプール[%s]は存在しません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10000": "secretResourcePool[uuid:%s]は予期された状態%sではありません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10032": "管理IP[%s]でセキュリティインシデントが発生しました", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10033": "managementIp[%s]は有効なIPv4アドレスではありません", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10034": "%s[%s]へのセキュリティインスタンス接続の確立に失敗しました。理由: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10035": "暗号化機能を有効にした後、対応するリソースプールに少なくとも1つのセキュリティインスタンスを確保する必要があります", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10017": "KVM host[uuid:%s, ip:%s]上にディレクトリ[installUrl:%s]を作成できませんでした。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10018": "クラスターに接続されているホストがなく、primary storage [uuid:%s]もどのクラスターにも接続されていません", + "ORG_ZSTACK_IDENTITY_10050": "toPublicがfalseに設定されている場合、accountUUIDsはnullまたは空にできません。UUIDが提供されていることを確認してください", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10019": "host [uuid:%s]からNFS primary storage [uuid:%s]へのpingに失敗しました。ネットワーク問題または利用不可のためです。このhost-ps接続を切断してください", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10013": "SFTP backup storage[hostname:%s]からNFS primary storage[uuid:%s, path:%s]への[%s]の転送に失敗しました。%s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10014": "NFS primary storage[uuid:%s, mountpoint:%s]からSFTP backup storage[hostname:%s, path:%s]へのビットアップロードに失敗しました。%s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10016": "primary storage[uuid:%s, name:%s]をcluster[uuid:%s]に接続できません。クラスターのKVMホストはqemu-imgバージョン[%s]を使用していますが、primary storageはqemu-imgバージョン[%s]を使用する別のクラスターに接続されています。qemu-imgバージョン%sより上和バージョン%s未満は互換性がなく、ボリュームスナップショット操作が失敗する可能性があります。qemu-imgバージョンの不一致を防ぐために、異なるLinuxディストリビューションを持つクラスターへのprimary storageの接続避けてください", + "ORG_ZSTACK_IDENTITY_10059": "user[name: %s, uuid: %s]はaccount[uuid: %s]に関連付けられていません", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10010": "IPアドレス[%s]はCIDRブロック[%s]に属していません", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10011": "NFS primary storage上で仮想マシンが%s台実行されています。停止してから再試行してください:", + "ORG_ZSTACK_IDENTITY_10057": "ポリシー[name: %s, uuid: %s]はアカウント[uuid: %s]に属していません", + "ORG_ZSTACK_CRYPTO_AUTH_10009": "シークレットリソースプールのモデルが正しくありません。期待値: %s、実際の値: %s", + "ORG_ZSTACK_CRYPTO_AUTH_10008": "シークレットリソースプール[%s]のモデルが見つかりません", + "ORG_ZSTACK_CRYPTO_AUTH_10006": "このクラウド環境ではこの操作はサポートされていません。仮想マシンインスタンスが必要な操作をサポートしていることを確認してください。", + "ORG_ZSTACK_IDENTITY_10041": "グループを作成できません。アカウント[UUID: %s]に同じ名前のグループが既に存在しています。", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10028": "ストレージ移行用に選択されたホスト[UUID:%s]は利用できません。", + "ORG_ZSTACK_CRYPTO_AUTH_10016": "リモートの暗号化サービスノードとの接続を確立できませんでした。サービスが起動して実行されていること、およびネットワーク接続が正しく構成されていることを確認してください。", + "ORG_ZSTACK_IDENTITY_10040": "accountNameとaccountUuidの両方をnullにすることはできません。少なくとも一方を指定してください。", + "ORG_ZSTACK_CRYPTO_AUTH_10015": "アイデンティティ認証でリソースを割り当てるリソースプールが指定されていません。リソースプールがサービスに対して正しく識別され、指定されていることを確認してください。", + "ORG_ZSTACK_IDENTITY_10045": "組み込みの管理者アカウントは削除できません。削除には組み込み以外のアカウントを使用してください。", + "ORG_ZSTACK_IDENTITY_10044": "アカウント %s は自身を削除することは禁止されています。管理者にお問い合わせください。", + "ORG_ZSTACK_IDENTITY_10043": "アカウントを作成できません。同じ名前のアカウントが既に存在しています。", + "ORG_ZSTACK_IDENTITY_10042": "ユーザを作成できません。アカウント[UUID: %s]に同じ名前のユーザーが既に存在しています。", + "ORG_ZSTACK_IDENTITY_10049": "すべての認証チェックが失敗しました。指定されたアカウントUUIDリストがnullまたは空です。入力内容を確認し、有効なアカウントUUIDが提供されていることを確認してください。", + "ORG_ZSTACK_IDENTITY_10048": "セッションはユーザーに関連付けられています。別のユーザー[uuid:%s]のアイデンティティを引き受けることはできません。", + "ORG_ZSTACK_IDENTITY_10047": "現在のセッションはアカウントベースのセッションです。更新するユーザーの'uuid'を指定してください。", + "ORG_ZSTACK_IDENTITY_10046": "アカウントアクセスの終了は管理者のみが行えます。", + "ORG_ZSTACK_CRYPTO_AUTH_10019": "データベースから整合性パスワードの取得に失敗しました。%sが整合性パスワードを生成していないためです", + "ORG_ZSTACK_VHOST_KVM_10000": "vHostUserディスクはvirtioモードのみをサポートします。イメージプラットフォームに必要なvirtioドライバーがインストールされていることを確認してください。", + "ORG_ZSTACK_VHOST_KVM_10001": "vhost-userディスクはvirtio-scsiモードをサポートしません。virtio-scsiモードを無効にしてください。", + "ORG_ZSTACK_NETWORK_L3_10029": "%sはクラウドリソース構成の有効なIPv6アドレスではありません", + "ORG_ZSTACK_USBDEVICE_10005": "PassThroughはホスト環境で実行されているVMでのみ使用できます。", + "ORG_ZSTACK_ALIYUN_ECS_10019": "パラメータ[onlyZstack]をfalseに設定できるのは管理者のみです。", + "ORG_ZSTACK_STORAGE_BACKUP_10018": "バックアップ%sからイメージを作成できませんでした", + "ORG_ZSTACK_ALIYUN_ECS_10018": "リモート削除をサポートするのは後払いECSインスタンスのみです。指定されたECS課金タイプは: %s", + "ORG_ZSTACK_USBDEVICE_10002": "VMに接続されたUSBデバイスの数が上限に達しました。現在の使用量: %s", + "ORG_ZSTACK_ALIYUN_ECS_10017": "ステータスがRunningまたはStopのECSインスタンスのみを削除できます。現在のステータス: %s", + "ORG_ZSTACK_NETWORK_L3_10025": "開始位置[ip:%s]から空きIPを取得できませんでした。開始位置[ip:%s]は有効なIPv6アドレスではありません", + "ORG_ZSTACK_USBDEVICE_10009": "VM[uuid:%s]を移行できません。パススルー経由でUSBデバイスが接続されているためです", + "ORG_ZSTACK_STORAGE_BACKUP_10015": "バックアップストレージ[uuid:%s]に%sを割り当てできません。利用可能な容量は%sのみです", + "ORG_ZSTACK_NETWORK_L3_10024": "start[ip:%s]で空きIPを取得できませんでした。start[ip:%s]は有効なIPv4アドレスではありません", + "ORG_ZSTACK_USBDEVICE_10008": "VM[%s]はホストへのUSBリダイレクトが確立されていないため起動できません", + "ORG_ZSTACK_NETWORK_L3_10023": "l3Network[uuid:%s]がデュアルスタックモードに設定されているため、start[ip:%s]で空きIPを取得できませんでした", + "ORG_ZSTACK_USBDEVICE_10007": "USBはすでに仮想マシーン[UUID:%s]にバインドされており、別のVMにバインドできません", + "ORG_ZSTACK_STORAGE_BACKUP_10013": "必要なプライマリストレージ[uuid:%s, type:%s]はバックアップストレージをサポートしていません", + "ORG_ZSTACK_NETWORK_L3_10022": "ipRangeUuidとl3NetworkUuidの両方をnullにすることはできません。少なくとも一方を設定する必要があります", + "ORG_ZSTACK_USBDEVICE_10006": "USBデバイス[uuid:%s]をVM[uuid:%s]にアタッチできません。考えられる理由: デバイスが有効でない、別のVMにアタッチされている、またはデバイスとVMが同じホスト上没有りません", + "ORG_ZSTACK_ALIYUN_ECS_10015": "イメージは削除されました!イメージが適切に終了し、すべてのリソースが削除前に解放されたことを確認してください", + "ORG_ZSTACK_ALIYUN_ECS_10014": "ecsイメージがリモートに存在します。名前: %s、作成時間: %s", + "ORG_ZSTACK_ALIYUN_ECS_10013": "ecsイメージはリモートとローカルの両方に存在します。ecsイメージUUID: %s、名前: %s、作成時間: %s", + "ORG_ZSTACK_NETWORK_L3_10032": "IPv6アドレスプールはサポートされていません。IP範囲の追加は可能です。IPv6をサポートするようにネットワーク構成を設定してからやり直してください", + "ORG_ZSTACK_STORAGE_BACKUP_10011": "バックアップストレージデータネットワークシステムタグは1つしか許可されていませんが、%s個取得されました", + "ORG_ZSTACK_NETWORK_L3_10030": "[startIp %s, endIp %s, prefixLen %d, gateway %s]はクラウドネットワーキング構成に対して有効なIPv6範囲を表していません", + "ORG_ZSTACK_STORAGE_BACKUP_10010": "すべてのバックアップストレージノードでの容量確保に失敗しました。バックアップストレージリソースの可用性を確認してください", + "ORG_ZSTACK_USBDEVICE_10016": "1つの仮想マシーンインスタンスには最大%s個のUSB 3.0デバイスをアタッチできます", + "ORG_ZSTACK_USBDEVICE_10015": "1つのVMインスタンスには最大%s個のUSB 2.0デバイスをアタッチできます", + "ORG_ZSTACK_NETWORK_L3_10038": "新しいネットワークCIDR [%s]は古いネットワークCIDR [%s]と異なります", + "ORG_ZSTACK_USBDEVICE_10014": "1つのVMインスタンスには最大%s個のUSB 1.0デバイスをアタッチできます", + "ORG_ZSTACK_NETWORK_L3_10037": "新しいIP範囲[startIP:%s, endIP:%s]は既存のIP範囲[startIP:%s, endIP:%s]と重複しています", + "ORG_ZSTACK_STORAGE_BACKUP_10028": "ボリュームバックアップ[uuid:%s]がストレージボリューム[uuid:%s]に見つかりません", + "ORG_ZSTACK_NETWORK_L3_10036": "IPv6プレフィックス長はStateless-DHCPまたはSLAACで%dである必要があります", + "ORG_ZSTACK_NETWORK_L3_10035": "addressMode[%s]はL3ネットワークアドレスモード[%s]と異なります", + "ORG_ZSTACK_USBDEVICE_10019": "USBデバイス[UUID:%s]は%sのアタッチ可能な状態にありません", + "ORG_ZSTACK_NETWORK_L3_10034": "システムネットワークは現在IPv6をサポートしていないため、IP範囲の追加はサポートされていません。IPv6をサポートするようにネットワーク構成を設定してからこの操作を再試行してください", + "ORG_ZSTACK_USBDEVICE_10018": "USBデバイス[UUID:%s]はすでに別の仮想マシーン[UUID:%s]にアタッチされています", + "ORG_ZSTACK_NETWORK_L3_10033": "IP範囲プレフィックス長は有効範囲[%d - %d]外です", + "ORG_ZSTACK_USBDEVICE_10017": "USBデバイス[UUID:%s]はすでに同じVM[UUID:%s]にアタッチされています", + "ORG_ZSTACK_STORAGE_BACKUP_10024": "ボリュームバックアップ[uuid:%s]がストレージノード[uuid:%s]に見つかりません", + "ORG_ZSTACK_ALIYUN_ECS_10022": "プライベートIPがVSwitchに存在します: %s、ECSに割り当てられています: %s", + "ORG_ZSTACK_ALIYUN_ECS_10021": "%sはCIDR範囲: %s内にありません", + "ORG_ZSTACK_ALIYUN_ECS_10020": "vSwitchのIPアドレスが不足しています、現在 (%d)", + "ORG_ZSTACK_USBDEVICE_10012": "PCIデバイスが接続されているため、VM [uuid:%s]を移行できません", + "ORG_ZSTACK_ALIYUN_ECS_10027": "インスタンス offering またはインスタンスタイプを指定する必要があります!", + "ORG_ZSTACK_USBDEVICE_10011": "ストレージデバイスが接続されているため、ルートボリューム [uuid:%s]を移行できません", + "ORG_ZSTACK_ALIYUN_ECS_10026": "%s は有効なボリュームタイプではありません。有効なタイプ: [%s]", + "ORG_ZSTACK_ALIYUN_ECS_10025": "%s は有効なIPv4アドレスではありません", + "ORG_ZSTACK_ALIYUN_ECS_10024": "パブリックIPアドレスの割り当て時には帯域幅を指定する必要があります", + "ORG_ZSTACK_NETWORK_L3_10043": "%s は有効なネットワークCIDRマスクではありません", + "ORG_ZSTACK_STORAGE_BACKUP_10023": "バックアップストレージの1つ [UUID: %s] が %s の状態であるため、同期操作を実行できません。", + "ORG_ZSTACK_NETWORK_L3_10042": "ゲートウェイ[gatewayId]はサブネットsubnetId内にありません", + "ORG_ZSTACK_STORAGE_BACKUP_10022": "タイプ[%s]のボリュームバックアップファクトリーが見つかりません", + "ORG_ZSTACK_NETWORK_L3_10041": "%s は使用可能なIPアドレスを含まないため、有効なネットワークCIDRではありません", + "ORG_ZSTACK_STORAGE_BACKUP_10021": "バックアップボリュームの現在のVM[UUID: %s]は、バックアップに使用されたVM[UUID: %s]とは異なります。", + "ORG_ZSTACK_STORAGE_BACKUP_10020": "イメージストア[uuid:%s]内のボリュームバックアップメタデータファイルの同期中にI/Oエラーが発生しました: %s", + "ORG_ZSTACK_NETWORK_L3_10049": "l3ネットワーク [uuid %s: name %s]はパブリックネットワークではないため、アドレスプール範囲を追加できません。", + "ORG_ZSTACK_NETWORK_L3_10047": "システムとカテゴリの組み合わせが無効です。有効なのは特定のクラウドコンピューティングプラットフォームのみです", + "ORG_ZSTACK_NETWORK_L3_10046": "%s は有効なFQDNドメイン名ではありません", + "ORG_ZSTACK_NETWORK_L3_10045": "未対応のL3ネットワークタイプ[%s]", + "ORG_ZSTACK_NETWORK_L3_10044": "ipRangeUuids、L3NetworkUuids、zoneUuidsはそれぞれ少なくとも1つの空でないリストを含むか、すべての値をtrueに設定する必要があります。", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10023": "vmNic[uuid:%s]にはターゲットプライベートポート範囲[%s, %s]と同一のプロトコルタイプ[%s]が重複するルールが既に存在するため、許可CIDR付きポートフォワーディングルールを接続できませんでした", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10024": "vmNic [uuid:%s]にはターゲットプライベートポート範囲[%s, %s]と同一のプロトコルタイプ[%s]が重複する競合するルールが既に存在するため、ポートフォワーディングルールを接続できませんでした", + "ORG_ZSTACK_SNMP_10010": "プライバシー密码为空,%s SNMP代理失败。", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10021": "VMNic [UUID:%s] には、[UUID:%s]とは異なるVIPを持つポートフォワーディングルールがすでに存在しています。", + "ORG_ZSTACK_ALIYUN_NAS_CORE_10000": "プライマリストレージ [%s] はまだ運用中であるため、アクセスグループの削除は行えません。", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10022": "vmNic UUID[%s] にはすでにパブリックIPが関連付けられているため、許可CIDRルールを使用したポートフォワーディングの追加は許可されていません。", + "ORG_ZSTACK_NETWORK_L3_10054": "IP割り当てにはネットワークアドレスやブロードキャストアドレスを含めることはできません。指定されたIPがサブネット内の有効なホストアドレスであることを確認してください。", + "ORG_ZSTACK_NETWORK_L3_10053": "ゲートウェイ[gatewayId]はサブネットsubnetId/cidrBlock内にありません", + "ORG_ZSTACK_NETWORK_L3_10052": "IP範囲 [%s ~ %s] にはリンクローカルアドレスが含まれており、これらは仮想化のために予約されているため、使用しないでください。", + "ORG_ZSTACK_NETWORK_L3_10051": "IP範囲 [%s ~ %s] にはEクラスアドレスが含まれており、これらは予約されています。", + "ORG_ZSTACK_NETWORK_L3_10050": "IP範囲 [%s ~ %s] にはDクラスアドレスが含まれており、これはマルチキャスト通信用に予約されています。", + "ORG_ZSTACK_STORAGE_BACKUP_10008": "予約容量を引いた後、必要な容量[%sバイト]のバックアップストレージが利用できません", + "ORG_ZSTACK_STORAGE_BACKUP_10006": "バックアップストレージ[UUID:%s]がゾーン[UUID:%s]に関連付けられました", + "ORG_ZSTACK_NETWORK_L3_10059": "開始IPアドレス[%s]が終了IPアドレス[%s]の後になっています", + "ORG_ZSTACK_ALIYUN_ECS_10006": "URLのデコードに失敗しました: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10005": "UUID:%sのバックアップストレージはUUID:%sのゾーンにアタッチされていません", + "ORG_ZSTACK_NETWORK_L3_10058": "ネットマスク[%s]は有効なネットマスクではありません。無効なIP範囲ネットマスク0.0.0.0を避けるために指定する必要があります。", + "ORG_ZSTACK_STORAGE_BACKUP_10004": "zoneUuidsとbackupStorageUuidsの両方に少なくとも1つの空でないリストがあるか、両方ともtrueに設定する必要があります。", + "ORG_ZSTACK_NETWORK_L3_10057": "ゲートウェイ[%s]は有効なIPv4アドレスではありません", + "ORG_ZSTACK_STORAGE_BACKUP_10003": "仮想マシン設定において%sはnullであってはなりません", + "ORG_ZSTACK_NETWORK_L3_10056": "終了IP[%s]は有効なIPv4アドレスではありません", + "ORG_ZSTACK_NETWORK_L3_10055": "開始IP[%s]は有効なIPv4アドレスではありません", + "ORG_ZSTACK_CORE_SALT_10000": "システムが[%s]でSCPが見つからないため、salt設定を確立できません。", + "ORG_ZSTACK_ALIYUN_ECS_10004": "インスタンスのシステムディスクが見つかりません: [%s], インスタンスID: [%s]", + "ORG_ZSTACK_CORE_SALT_10003": "インスタンス[%s]でsalt状態[%s]の実行に失敗しました。%s回のリトライ後に失敗しました", + "ORG_ZSTACK_ALIYUN_ECS_10003": "このアベイラビリティゾーン[%s]は現在インスタンスタイプ[%s]をサポートしていません、別のインスタンスタイプまたはアベイラビリティゾーンを選択してください。", + "ORG_ZSTACK_ALIYUN_ECS_10002": "現在利用可能なインスタンスタイプがありません。後でもう一度確認するか、仕様を変更してください。", + "ORG_ZSTACK_SNMP_10000": "SNMPエージェントの作成に失敗しました。すでに存在しています。", + "ORG_ZSTACK_SNMP_10001": "SNMPエージェントサービスの終了に失敗しました。まずSNMPエージェントインスタンスが作成されていることを確認してください。", + "ORG_ZSTACK_NETWORK_L3_10065": "通常IP範囲の追加にはゲートウェイIPアドレスの指定が必要です。", + "ORG_ZSTACK_SNMP_10002": "SNMPエージェント設定の更新に失敗しました。まずSNMPエージェントが作成されていることを確認してください。", + "ORG_ZSTACK_NETWORK_L3_10064": "新しく追加されたIP範囲のゲートウェイ%sは既存のゲートウェイ%sとは異なります", + "ORG_ZSTACK_SNMP_10003": "SNMPエージェントの起動に失敗しました。まずSNMPエージェントを作成してください。", + "ORG_ZSTACK_NETWORK_L3_10063": "ゲートウェイ[%s]は範囲[%s, %s]の一部であってはなりません", + "ORG_ZSTACK_SNMP_10004": "SNMPエージェントの%sに失敗しました。versionがv2cの場合、readCommunityは空であってはなりません", + "ORG_ZSTACK_NETWORK_L3_10062": "エンドポイント[%s]はサブネット%s/%d内にありません", + "ORG_ZSTACK_SNMP_10005": "SNMPエージェントの%sに失敗しました。versionがv3の場合、userNameは空であってはなりません", + "ORG_ZSTACK_NETWORK_L3_10061": "同じL3ネットワークに複数のCIDRブロックは許可されていません。既存のIP範囲[uuid:%s, CIDR:%s]が既に存在するため、新しいCIDRブロック[%s]は無効です。", + "ORG_ZSTACK_SNMP_10006": "SNMPエージェントの%sに失敗しました。パスワードが提供されていない場合、認証アルゴリズムはnullであってはなりません", + "ORG_ZSTACK_NETWORK_L3_10060": "IP範囲と重複しています[uuid:%s, start_ip:%s, end_ip: %s]", + "ORG_ZSTACK_SNMP_10007": "SNMPエージェントの%sに失敗しました。認証パスワードが空です。", + "ORG_ZSTACK_SNMP_10008": "SNMPエージェントの%sに失敗しました。データ暗号化設定には、まずユーザー確認を設定する必要があります。", + "ORG_ZSTACK_XINFINI_10019": "ノード%sの詳細情報の取得に失敗しました。IPアドレスとロール設定を確認してください", + "ORG_ZSTACK_XINFINI_10018": "仮想マシンノードが見つかりません", + "ORG_ZSTACK_XINFINI_10017": "接続された仮想マシンインスタンスが見つかりません。ノードが正しく接続されていることを確認して、再試行してください。", + "ORG_ZSTACK_XINFINI_10016": "アクティブな接続でサポートされていないプロトコル[%s]です", + "ORG_ZSTACK_XINFINI_10015": "[%s]からボリューム情報を取得することはサポートされていません", + "ORG_ZSTACK_XINFINI_10014": "ストレージプロトコル[%s]はサポートされていません", + "ORG_ZSTACK_XINFINI_10013": "非アクティブ化でサポートされていないプロトコル[%s]です", + "ORG_ZSTACK_XINFINI_10012": "ボリュームの詳細[%s]を取得できません。おそらく削除されたためです", + "ORG_ZSTACK_XINFINI_10010": "空の設定です。インスタンスxinfiniを検出できません", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10021": "必要なIP %sは別のインスタンスに割り当てられています", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10022": "requiredIp %sはDHCP範囲%s ~ %sの外にあります", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10020": "Baremetal2プロビジョニングネットワーク[uuid:%s]からのIP割り当てに失敗しました", + "ORG_ZSTACK_XINFINI_10009": "iscsiクライアントの削除に失敗しました%s", + "ORG_ZSTACK_XINFINI_10008": "ボリュームクライアントグループマッピングの削除に失敗しました%s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10002": "L2[uuid:%s]からIPアドレスを割り当てられているBMインスタンスが存在します。", + "ORG_ZSTACK_XINFINI_10007": "ボリュームスナップショットの削除に失敗しました%s", + "ORG_ZSTACK_XINFINI_10006": "スナップショット[id:%s, name:%s]には%d個のクローンボリュームがあります。ボリューム名: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10004": "IP範囲[uuid:%s]からIPアドレスを割り当てられているBMインスタンスが存在します。", + "ORG_ZSTACK_XINFINI_10005": "ボリュームの削除に失敗しました。理由: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10003": "L3ネットワーク[UUID:%s]からIPアドレスを割り当てられているBMインスタンスが存在します。", + "ORG_ZSTACK_XINFINI_10004": "bdevの削除に失敗しました%s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10006": "ベアメタルサーバー[uuid:%s]のリモート電源%sに失敗しました", + "ORG_ZSTACK_XINFINI_10003": "IP %sを持つbdcはクラウド環境に見つかりません。", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10005": "ベア-metal PXEサーバーの割り当てに失敗しました。十分な利用可能な容量を持つPXEサーバーがクラスタ[uuid:%s]に接続されていることを確認してください", + "ORG_ZSTACK_XINFINI_10002": "xinfiniリクエストに失敗しました。メッセージ: %s。", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10008": "ベアメタルシャーシ[uuid:%s]は存在しません", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10009": "UUID: %sのbaremetal2プロビジョニングネットワークは、すでにUUID: %sのクラスタに接続されています", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10007": "ベアメタルシャーシ[uuid:%s]のリモート電源オフに失敗しました", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10008": "実行中の仮想マシンからの管理対象デバイスのホットアンプラグに失敗しました。理由:%s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10010": "Baremetal2プロビジョニングネットワーク[uuid:%s]をクラスタ[uuid:%s]にアタッチできません。ネットワークがすでに構成されているため", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10011": "BareMetal2プロビジョニングネットワークをクラスタにアタッチできません。同じアベイラビリティゾーンにないため", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10007": "vm[uuid:%s]はmdevデバイス[uuid:%s]を保持するホストで起動できません", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10004": "実行中のvmへのmdevデバイスの動的アタッチに失敗しました。理由:%s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10002": "UUID:%sのmdevデバイスはステータスが正しくないため、UUID:%sのVMにアタッチできません", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10003": "mdevデバイス[%s]は仮想化環境で利用できません", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10000": "ホスト[%s]はメンテナンスモードになれませんでした。VM [%s]がMDEVデバイスをアタッチしており、自動的にマイグレーションできないためです", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10018": "ゲートウェイ[uuid:%s]内のプロビジョニングネットワーク[uuid:%s]の更新に失敗しました:%s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10009": "Baremetalシャーシ[UUID:%s]が有効または利用できません。別のものを選択してください。", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10001": "pciデバイス[uuid:%s]はmdevであることが知られていますが、その仕様が見つからないため、プロセスを中止します。", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10016": "すべてのbaremetal2プロビジョニングネットワークが%sに存在しません", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10014": "それに依存する実行中のインスタンスがあるため、Baremetal2プロビジョニングネットワーク[uuid:%s]をデタッチできません", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10015": "networkUuidsが空のリストです", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10012": "BareMetal2プロビジョニングネットワークをクラスタにアタッチできません。同じプロビジョニングネットワークを持つクラスタにアタッチされたすべてのゲートウェイが検証されている必要があります。続行前に、すべての関連ゲートウェイが一貫していることを確認してください。", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10013": "プロビジョニングネットワークは、クラスタにすでにアタッチされているl2ネットワークと同じインターフェース名を持つことはできません", + "ORG_ZSTACK_NETWORK_L3_10006": "利用可能なIPv4サブネットがないため、IP範囲を予約できませんでした。", + "ORG_ZSTACK_NETWORK_L3_10005": "エンドIP[%s]が開始IP[%s]より小さいため、IP範囲を予約できませんでした", + "ORG_ZSTACK_NETWORK_L3_10004": "エンドIP[%s]が有効なIPv6アドレスではないため、IP範囲を予約できませんでした", + "ORG_ZSTACK_NETWORK_L3_10003": "エンドIP[%s]が有効なIPv4アドレスではないため、IP範囲を予約できませんでした", + "ORG_ZSTACK_NETWORK_L3_10002": "開始IPアドレス[%s]が無効なため、IP範囲を予約できませんでした", + "ORG_ZSTACK_NETWORK_L3_10000": "VMネットワークインターフェースコントローラ[UUID:%s]によって使用されているため、IPアドレスを削除できませんでした", + "ORG_ZSTACK_NETWORK_L3_10009": "IPv6サブネットが利用できないため、IP範囲を予約できませんでした。ネットワーク構成を確認するか、代わりにIPv4サブネットを予約してみてください。", + "ORG_ZSTACK_KVM_10001": "ファイルからホスト情報を読み込めませんでした\\n%s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10019": "UUID:%sのmdevデバイスはUUID:%sのVMにアタッチされていません", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10017": "SE-MDEVデバイスを保持するVM[UUID:%s]は、さらにSE-MDEV[%s]をアタッチできません", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10018": "PCIデバイス[uuid:%s]を管理するホスト[uuid:%s]のIOMMUが[%s]または[%s]として構成されていません。", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10015": "vm[uuid:%s]には異なるホスト上にあるmdevデバイスがアタッチされています: mdevデバイス[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10014": "vm[uuid:%s]には異なるホスト上にあるPCIデバイスがアタッチされています: mdevデバイス[uuid:%s]", + "ORG_ZSTACK_NETWORK_L3_10010": "予約されたIPが指定されたIP範囲[%s]内にないため、IP範囲を予約できませんでした", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10011": "現在仮想マシンにアタッチされているmdevデバイスのステータスは変更できません。変更を行う前にデバイスをデタッチしてください。", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10007": "BareMetal2プロビジョニングネットワーク[uuid:%s]はインスタンスに依存しているため削除できません", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10012": "mdevデバイス[uuid:%s]をVMに接続できません。有効になっていること、および接続されていないことを確認してください", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10008": "BareMetal2プロビジョニングネットワークを非BareMetal2クラスタに接続できません", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10005": "baremetal2プロビジョニングネットワークのDHCP範囲ネットマスク%sが無効です", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10006": "baremetal2プロビジョニングネットワークの開始IP %sと終了IP %sが同一サブネットマスクに属していません", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10003": "BareMetal2プロビジョニングネットワーク[uuid:%s]はインスタンスに依存しているため、DHCP設定を更新できません", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10002": "DHCPインターフェース%sを持つbaremetal2プロビジョニングネットワークが既に存在しています。設定: 開始IP %s、終了IP %s、ネットマスク%s、ゲートウェイ%s", + "ORG_ZSTACK_NETWORK_L3_10018": "レイヤー3[%s]のIP範囲が指定されていません", + "ORG_ZSTACK_NETWORK_L3_10015": "クラウド設定ではシステムとカテゴリの両方を更新する必要があります", + "ORG_ZSTACK_XINFINI_10027": "NVMeOFのエクスポート解除機能は現在サポートされていません", + "ORG_ZSTACK_NETWORK_L3_10014": "アドレスプールが存在するため、最後の標準IP範囲を削除できません", + "ORG_ZSTACK_XINFINI_10026": "クライアント[%s]のアクティブゲートウェイが検出されません", + "ORG_ZSTACK_NETWORK_L3_10013": "l3ネットワーク[uuid:%s]のl2ネットワーク[uuid:%s]のMTU値がnovlanネットワークの制限を超えているため、MTUを設定できませんでした", + "ORG_ZSTACK_XINFINI_10025": "NVMe over Fabrics (OF)エクスポートは現在サポートされていません", + "ORG_ZSTACK_XINFINI_10024": "xinfiniは合計QoSレベルの設定のみサポートします", + "ORG_ZSTACK_NETWORK_L3_10011": "新しい範囲が既存の範囲[%s:%s]と重複しているため、IP範囲を予約できませんでした", + "ORG_ZSTACK_XINFINI_10023": "十分な容量[%d]と正常なステータスを持つ利用可能なプールがありません", + "ORG_ZSTACK_XINFINI_10021": "プール[id:%d, name:%s]の仮想マシン詳細の取得に失敗しました", + "ORG_ZSTACK_XINFINI_10020": "コンピュートリソースプールが見つかりません。プールが作成され、使用可能であることを確認してください", + "ORG_ZSTACK_KVM_10010": "ホスト[UUID: %s]にCPUモデルの詳細がありません。この問題を解決するには、ホストを再接続してください", + "ORG_ZSTACK_KVM_10011": "強制実行の理由を指定する必要があります", + "ORG_ZSTACK_NETWORK_L3_10019": "IP[%s]はl3ネットワーク[%s]に関連するIPプール[uuid:%s, cidr:%s]のCIDR範囲内にありません", + "ORG_ZSTACK_KVM_10012": "ホスト[uuid:%s]は終了しています", + "ORG_ZSTACK_KVM_10002": "ホスト[hostname:%s, IP:%s]のオペレーティングシステム[OS]が無効です", + "ORG_ZSTACK_KVM_10003": "クラスタ[uuid:%s]にはOSバージョン[%s]のホストが既に存在していますが、新しく追加されたホスト[name:%s ip:%s]は異なるOSバージョン[%s]を持っています", + "ORG_ZSTACK_KVM_10004": "カーネル障害によりvm[uuid:%s]がクラッシュしました", + "ORG_ZSTACK_KVM_10005": "ホスト[uuid: %s]でメモリECCエラーが発生しました。詳細: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10029": "指定された管理対象デバイスが同じホスト上にありません: 管理対象デバイス[uuid: %s]はホスト[uuid: %s]上に、管理対象デバイス[uuid: %s]はホスト[uuid: %s]上にあります", + "ORG_ZSTACK_KVM_10006": "同じCPUアーキテクチャを持たないホストがまだ存在します。詳細: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10026": "仮想マシンインスタンスに接続されているため、mdevデバイスを削除できません。削除前にデバイスを切り離してください", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10027": "VM[UUID:%s]を起動できませんでした。すべてのMDEV仕様[UUIDs:%s]が存在しないためです", + "ORG_ZSTACK_KVM_10008": "PCI Bridge IDは0より大きく32より小さい値である必要があります", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10024": "停止状態ではない仮想マシンインスタンスに管理デバイスを接続できません", + "ORG_ZSTACK_KVM_10009": "vm現在の状態[%s]、virtioSCSIの変更にはvmが状態[%s]である必要があります", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10025": "不正なmdevデバイスタイプ[%s]です。仮想デバイスのみが有効です", + "ORG_ZSTACK_NETWORK_L3_10021": "無効なクラウドインスタンスID[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10022": "クラスタUUID、ホストUUID、またはVM UUIDを同時に設定できません。%s", + "ORG_ZSTACK_NETWORK_L3_10020": "IP[%s]はL3ネットワーク[%s]に関連付けられたIP範囲[uuid:%s, startIp:%s, endIp:%s]内にあります。これは許可されていません", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10023": "クラスタが存在しないか、無効です。クラスタが正しく作成され、有効になっていることを確認してください", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10020": "mdevデバイスUUID [%s]を持つホストUUID [%s]は、[%s]または[%s]のいずれとも一致しません", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10021": "VMインスタンスが停止状態ではないため、mdevデバイスをVMインスタンスから切り離すことができません。mdevデバイスを切り離す前に、VMインスタンスが停止していることを確認してください", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10053": "SDNコントローラー[IP:%s]にはVirtual Private Cloud(VPC)が構成されていません", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10054": "VPC IDのシステムタグは必須です。有効な値を入力してください", + "ORG_ZSTACK_MACVLAN_10002": "KVMホスト[uuid:%s]上のL2VLANネットワーク[uuid:%s, name:%s]のVLANインターフェース[%s]の確認に失敗しました。%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10051": "SDNコントローラーにスイッチが構成されていません[ip:%s]", + "ORG_ZSTACK_MACVLAN_10005": "L3ネットワーク[uuid:%s]にネットワークサービスを接続できませんでした。L2ネットワーク[uuid:%s, vSwitchType:%s]はパブリック基本L3ネットワークのL3ネットワークサービスをサポートしていないため", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10052": "SDNスイッチがコントローラーに接続されていません。%s", + "ORG_ZSTACK_MACVLAN_10004": "%sのみがMACVLANネットワークモードをサポートします", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10057": "レイヤー2ネットワーク%sの論理スイッチの取得に失敗しました", + "ORG_ZSTACK_MACVLAN_10007": "UUID:%sのL3ネットワークにネットワークサービスを接続できませんでした。UUID:%sのL2ネットワークはプライベート基本L3ネットワークのネットワークプロバイダーとしてvRouterのみをサポートしているため", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10058": "レイヤー2ネットワークの論理スイッチの取得に失敗しました。結果:%s", + "ORG_ZSTACK_MACVLAN_10006": "UUID:%sのL3ネットワークにネットワークサービスを接続できませんでした。UUID:%sのL2ネットワークはVPC L3ネットワークのネットワークプロバイダーとしてvRouterのみをサポートしており、vSwitchType:%sをサポートしていないため", + "ORG_ZSTACK_MACVLAN_10009": "KVMホストはvSwitchTypeをOVSに設定したL2 networkingのみをサポートします。ホストがKVMタイプであり、vSwitchTypeがOVSとして構成されていることを確認してください", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10056": "物理スイッチポート情報を取得できません。理由:%s", + "ORG_ZSTACK_MACVLAN_10008": "L3ネットワーク[uuid:%s]にネットワークサービスを接続できませんでした。L2ネットワーク[uuid:%s, vSwitch Type:%s]はプライベート基本L3ネットワークのロードバランサのみをサポートしているため", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10075": "ルートボリュームは削除されており、現時点で再イメージ化できません。サポートにお問い合わせください", + "ORG_ZSTACK_STORAGE_CEPH_10023": "問題は、不正なアクセスキーID、シークレットアクセスキー、SSHポート番号、またはクラウド環境内の不安定なネットワーク接続而导致可能性があります。これらの設定を確認してください", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10050": "SDNコントローラーにテナントがありません[IP:%s]", + "ORG_ZSTACK_STORAGE_CEPH_10020": "poolNameはnullことができますが、空の文字列であってはなりません", + "ORG_ZSTACK_KVM_10022": "ホスト[%s]のユーザー名[%s]、ポート[%s]へのSSH接続が失敗しました。理由:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10073": "KVMホスト[uuid:%s]上に空のボリューム[uuid:%s, name:%s]を作成できません", + "ORG_ZSTACK_STORAGE_CEPH_10021": "importImagesが有効な場合、poolNameを指定する必要があります", + "ORG_ZSTACK_KVM_10023": "ホスト[%s]は原因不明により%d秒以内に電源が入っていません。BMC[%s]経由でホストの状態を確認してください。", + "ORG_ZSTACK_STORAGE_BACKUP_10092": "リストアのセキュリティ検証に失敗しました:\\n%s", + "ORG_ZSTACK_KVM_10014": "ホスト%sは現在の管理ノードによって管理されていません", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10000": "executeSlbGroupConfigTask 不明なタスク名: %s", + "ORG_ZSTACK_MEVOCO_10049": "ノードAの設定情報が見つかりません", + "ORG_ZSTACK_STORAGE_BACKUP_10091": "バックアップストレージ[UUID:%s]が有効でないか、構成されていません", + "ORG_ZSTACK_KVM_10015": "ホスト%sが接続されていないため、KVMエージェントの再起動をスキップします", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10039": "管理対象デバイスデバイスが接続されているため、ルートボリューム[uuid:%s]を移行できません", + "ORG_ZSTACK_MEVOCO_10048": "ローカル構成とクラウド構成を同時に設定することはできません。単一のデプロイ環境を指定してください。", + "ORG_ZSTACK_STORAGE_BACKUP_10090": "データベースバックアップ[uuid:%s]は、まだ存在しません", + "ORG_ZSTACK_KVM_10016": "ホスト%sで実行中のタスクが存在します", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10081": "計算ノード[%s]にフラグファイル[%s]が見つかりません。理由: %s", + "ORG_ZSTACK_MEVOCO_10047": "予期しないホスト管理IPアドレス: [%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10037": "mdevデバイスが接続されているため、VM[UUID:%s]を移行できません", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10035": "mdevデバイス[uuid:%s]が見つかりません。削除または解放された可能性があります", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10036": "UUID: %sのmdevデバイスは、UUID: %sのVMに対して存在しないか、無効です", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10034": "仮想マシン[uuid:%s]のデスティネーションホスト[uuid:%s]内で仕様[uuid:%s]の十分なmdevデバイスを見つけることができませんでした", + "ORG_ZSTACK_MEVOCO_10041": "無効な値[%s]、ZStackはこの種のホスト割り当てタイプをサポートしていません", + "ORG_ZSTACK_STORAGE_BACKUP_10099": "データベースバックアップ[uuid:%s]が有効で準備できていません", + "ORG_ZSTACK_STORAGE_CDP_10120": "接続されたバックアップストレージ[uuid: %s]が見つかりません", + "ORG_ZSTACK_STORAGE_BACKUP_10098": "ボリューム[uuid:%s]は削除されており、状態の変更は許可されていません", + "ORG_ZSTACK_MEVOCO_10040": "無効な値[%s]、有効な浮動小数点数ではありません", + "ORG_ZSTACK_STORAGE_CDP_10121": "操作にはチェーン型スナップショットを作成するボリューム[UUID: %s]が関与するため、仮想マシンインスタンスで継続的データ保護(CDP)タスクが実行されている場合、この操作を実行できません。", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10032": "VM[uuid:%s]を開始する候補ホストを決定できませんでした、%s", + "ORG_ZSTACK_STORAGE_BACKUP_10097": "バックアップに使用できるオブジェクトストレージバケットが見つかりません、このジョブをスキップします。%s", + "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10001": "システムアラームからシステムトピックを削除することは禁止されています。有効なトピックとアラームのUUIDを指定してください。", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10005": "SLBインスタンスのパブリックネットワークインターフェースが見つかりません", + "ORG_ZSTACK_MEVOCO_10046": "objはNicQosのインスタンスではありません。オブジェクトタイプが予想されるタイプと一致していることを確認してください。", + "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10000": "アラーム[uuid:%s]はシステム生成のアラートのため削除できません", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10004": "slbインスタンス[uuid:%s]設定タスク version:%dは%d回失敗しました", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10003": "グループ[uuid:%s]内で利用可能なSLBインスタンスが見つかりません", + "ORG_ZSTACK_STORAGE_BACKUP_10094": "データベースバックアップバージョン[%s]は現在のバージョン[%s]と一致しません", + "ORG_ZSTACK_MACVLAN_10000": "KVMホスト[uuid:%s]上でl2VlanNetwork[uuid:%s, name:%s]のブリッジを実現できませんでした, %s", + "ORG_ZSTACK_MEVOCO_10043": "%sの値は[%s]で、%sの値[%s]と競合しています", + "ORG_ZSTACK_STORAGE_BACKUP_10093": "リスニング用の空きポートの確保に失敗しました。必要なポートが他のアプリケーションで使用されていないことを確認してください。問題が解決しない場合は、ネットワーク設定を確認するか、サポートに連絡して進一步の支援を受けてください。", + "ORG_ZSTACK_MEVOCO_10060": "ノードAのアドレス設定に失敗しました", + "ORG_ZSTACK_KVM_10030": "ホスト容量の確認に失敗しました, 理由:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10082": "インスタンス [%s]上にフラグファイル [%s]を作成できません, 理由: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10060": "論理スイッチの取得に失敗しました: uuid: %s", + "ORG_ZSTACK_KVM_10032": "ホスト [UUID: %s]の利用可能なメモリ容量[%s MB]は予約容量[%s MB]を下回っています", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10083": "クラスタ(%s)にはローカルストレージプライマリストレージが存在しません (state=%s, status=%s)。クラスタが複数のプライマリストレージをマウントしている場合、システムはローカルプライマリストレージをデフォルトで使用します。プライマリストレージのstateとstatusを確認し、クラスタにアタッチされていることを確認してください。", + "ORG_ZSTACK_KVM_10033": "kvmホスト [uuid:%s, ip:%s]上のvm[uuid:%s]のcoloハートビートを登録できません, 理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10084": "選択されたプライマリストレージ[uuid:%s]のタイプはローカルストレージではありません。クラスタがローカルプライマリストレージをアタッチしている場合、リソースが他の利用可能なストレージで作成可能か確認してください。", + "ORG_ZSTACK_KVM_10034": "kvmホスト [uuid:%s, ip:%s]上でcolo同期仮想マシン[uuid:%s]を起動できません, 理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10085": "クラスタは複数のプライマリストレージデバイス[ローカルストレージ(%s)、他の非ローカルストレージプライマリストレージ]をマウントしているため、primaryStorageUuidForDataVolumeの指定は許可されていません %s。", + "ORG_ZSTACK_KVM_10024": "ホスト[%s]は%d秒以内にシャットダウンされていません(原因不明)。BMC[%s]を通じてホストのステータスを確認してください。", + "ORG_ZSTACK_MEVOCO_10059": "このインスタンスはノードAに関連付けられていません", + "ORG_ZSTACK_MEVOCO_10058": "ファクトリモードのノードが存在します。ARPingの詳細: %s", + "ORG_ZSTACK_MEVOCO_10053": "curlブートストラップエージェントが完了しました, リターンコード: %s, stdout: %s, stderr: %s", + "ORG_ZSTACK_MEVOCO_10052": "900秒後もブートストラップジョブ%sの結果を取得できません", + "ORG_ZSTACK_MEVOCO_10050": "ブートストラップエージェントからノードAのアドレス情報が見つかりません", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10040": "MDEVデバイスがアタッチされているため、VM[UUID:%s]をマイグレーションできません", + "ORG_ZSTACK_MEVOCO_10057": "ノードAのファクトリモード更新に失敗しました, 詳細: %s", + "ORG_ZSTACK_MEVOCO_10056": "すべての管理ノードのファクトリモード更新に失敗しました, 詳細: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10013": "MACアドレス%sは無効です。6c:b3:11:1b:0b:1eの形式で指定してください", + "ORG_ZSTACK_HA_10014": "USBデバイスがパススルーを介してアタッチされているため、VM [uuid:%s]にFTを設定できません", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10012": "ベアメタルPXEサーバー[UUID:%s]は有効でも接続でもありません。ステータスを確認してください。", + "ORG_ZSTACK_HA_10015": "mdevデバイスがアタッチされているため、仮想マシン[uuid:%s]にFTを設定できません", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10015": "仮想マシン %s のボンディング UUID が重複しています。ボンディング設定で UUID が一意であることを確認してください。", + "ORG_ZSTACK_HA_10016": "管理ノードがホストを検出できません。ホストがクラウド環境内で適切に登録され、アクセス可能であることを確認してください。", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10014": "ベアメタルシャーシ [UUID: %s] には MAC アドレス %s のネットワークインターフェースがありません。", + "ORG_ZSTACK_HA_10017": "値 [%s] が有効な範囲 [0, 1] 外です。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10057": "ローカルプライマリストレージ [uuid: %s] のホスト [uuid: %s] に十分な容量がありません [現在: %s バイト、必要: %s]。", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10017": "重複した L3 ネットワーク UUID が検出されました。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10058": "リソース [uuid:%s] を持つホストが見つかりません。", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10016": "ベアメタルネットワークボンディングはサポートされていません。", + "ORG_ZSTACK_HA_10011": "VM [uuid:%s] は停止状態ではないため、FT を設定できません。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10059": "リソース [uuid:%s] はホスト [uuid:%s] でのみ操作できますが、当該ホストは終了しています。", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10019": "選択したレイヤー 3 ネットワークはシャーシ [UUID:%s] に割り当てられません。", + "ORG_ZSTACK_HA_10012": "VM [uuid:%s] にはデータボリュームがまだアタッチされているため、FT を設定できません。", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10018": "指定されたレイヤー 3 ネットワークは存在しません。ネットワーク名を確認して再試行してください。", + "ORG_ZSTACK_HA_10013": "VM [uuid:%s] には PCI デバイスがアタッチされているため、FT を設定できません。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10053": "ローカルプライマリストレージにデータボリュームをプロビジョニングするには、システムタグ [%s] を使用してデータボリュームを作成するホストを指定する必要があります。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10054": "ホスト [UUID:%s] はローカルプライマリストレージ [UUID:%s] に関連付けられていません。", + "ORG_ZSTACK_KVM_10040": "VM の CPU 数の増加に失敗しました。エラーの詳細: %s。", + "ORG_ZSTACK_HA_10018": "VM [uuid:%s] のボリューム格納場所であるプライマリストorage はメンテナンス中です。", + "ORG_ZSTACK_KVM_10043": "DNS 検証を実行するために KVM [ip:%s, username:%s, SSH ポート:%d] に接続できません。認証情報を確認してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10050": "ローカルストレージ上のデータボリュームを持つ VM [uuid:%s] をライブマイグレーションできません。データボリュームを 먼저デタッチしてください。", + "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10001": "クエリオブジェクトが null です。クラウドコンピューティングタスクを実行する前に、クエリパラメータが適切に初期化されていることを確認してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10051": "ローカルストレージを持つ VM [UUID:%s] をライブマイグレーションできません。Linux ゲストのみサポートされています。現在のプラットフォームは [%s] です。", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10011": "ベアメタルシャーシ [uuid:%s] のハードウェア情報が見つかり、別のものを選択してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10052": "ローカルストレージに ISO がアタッチされた VM [UUID:%s] をライブマイグレーションできません。すべての ISO をまずデタッチしてください。", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10010": "対応する PXE サーバーが検出されません。ベアメタルシャーシ [uuid:%s] の構成を再度確認してください。", + "ORG_ZSTACK_KVM_10035": "secundario VM [UUID:%s] を KVM ホスト [UUID:%s, IP:%s] に構成できません。理由は %s です。", + "ORG_ZSTACK_MEVOCO_10028": "UUID [%s] を持つ L3 ネットワークが見つかりません。静的 IP に関連付けられたシステムタグ [%s] を確認して修正してください。", + "ORG_ZSTACK_STORAGE_BACKUP_10070": "UUID: %s のボリュームバックアップが見つかりません。", + "ORG_ZSTACK_KVM_10036": "primario VM [UUID:%s] を KVM ホスト [UUID:%s, IP:%s] に構成できません。理由は %s です。", + "ORG_ZSTACK_MEVOCO_10027": "ボリューム [%s] の IOPS 値 %d が最大制限を超えています。", + "ORG_ZSTACK_KVM_10037": "VM [UUID:%s]のKVMホスト[UUID:%s, IP:%s]から初期ブートデバイスを取得できません。理由:%s", + "ORG_ZSTACK_MEVOCO_10026": "無効なボリュームIOPS[%s]は有効な数値ではありません", + "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10000": "サードパーティPrometheus Namespaceを查询するには、少なくとも1つのホストUUIDが必要です。クエリ呼び出しパラメータのラベルにホストUUIDが含まれていることを確認してください。", + "ORG_ZSTACK_KVM_10038": "vm[uuid:%s]のデバイスアドレスの取得に失敗しました。理由:%s", + "ORG_ZSTACK_MEVOCO_10025": "無効なIOPS値[%s]は1以上である必要があります", + "ORG_ZSTACK_KVM_10039": "host[uuid:%s]の仮想化情報取得に失敗しました。理由:%s", + "ORG_ZSTACK_MEVOCO_10029": "USBデバイスへのアクセスは管理者アカウントに制限されています。管理者権限を持つアカウントでログインしていることを確認してください。", + "ORG_ZSTACK_STORAGE_BACKUP_10078": "バックアップストレージの状態が%sであるため、処理を実行できません", + "ORG_ZSTACK_MEVOCO_10020": "無効なボリューム帯域幅[%s]は数値である必要があります", + "ORG_ZSTACK_STORAGE_BACKUP_10077": "バックアップストレージのステータスが%sであるため、処理を実行できません", + "ORG_ZSTACK_STORAGE_BACKUP_10076": "バックアップストレージ[UUID: %s, Name: %s]には、イメージ[%s]をダウンロードするための容量が十分ではありません。必要なサイズ:%s、利用可能なサイズ:%s。", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10001": "Cephバックアップストレージ[uuid:%s]のすべてのCeph MONノードが切断されています。", + "ORG_ZSTACK_STORAGE_BACKUP_10075": "URL %sから取得したイメージサイズは%dバイトですが、イメージとしては小さすぎます。URLを再度確認してください。", + "ORG_ZSTACK_STORAGE_BACKUP_10074": "イメージURL %sからヘッダーを取得できませんでした", + "ORG_ZSTACK_STORAGE_BACKUP_10073": "イメージURL %sからヘッダーを取得できませんでした:%s", + "ORG_ZSTACK_STORAGE_BACKUP_10072": "まず他のノードを終了してください!", + "ORG_ZSTACK_MEVOCO_10021": "無効なボリューム帯域幅[%s]は、最大許容値%dを超えています", + "ORG_ZSTACK_STORAGE_BACKUP_10071": "VMクラスタ[%%s]は、プライマリストレージクラスタ[%%s]と同じ場所に配置されていません。", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10023": "破棄状態ではないベアメタルインスタンスを削除できません", + "ORG_ZSTACK_HA_10005": "対象ホスト[uuid:%s, ip:%s]のポートスキャンに失敗しました", + "ORG_ZSTACK_IDENTITY_LOGIN_10000": "サポートされていない認証方法%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10068": "クラスタ[UUID=%s]にはLocalStorageと他の非LocalStorageプライマリストレージを含む複数のプライマリストレージがマウントされています。データディスクがあるプライマリストレージを指定する必要があります。", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10003": "バックエンドストレージ%sからバックエンドストレージ%sへのイメージ%sの移行に失敗しました。原因:%s", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10002": "移行インストールパス[%s]に対して、バックアップストレージ[%s]にゴミID(%s)が見つかりました。イメージ[%s]の移行を強行する場合は、'APICleanUpTrashOnBackupStorageMsg'を使用してまずクリーンアップしてください。", + "ORG_ZSTACK_HA_10000": "仮想マシンインスタンスは終了した可能性が高いです。ヘルスチェックをスキップします。", + "ORG_ZSTACK_HA_10001": "name:[%s] and uuid:[%s]の仮想マシンが見つかりません、ホストUUIDはnullです", + "ORG_ZSTACK_HA_10002": "HAHostCheckerインスタンスが見つからないため、高可用性チェックを実行できません。必要なコンポーネントが適切に構成されていることを確認してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10064": "ホスト[uuid:%s]の物理容量使用率がしきい値[%s]を超えました。リソースのスケーリングまたは最適化を検討してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10067": "クラスタ[uuid=%s]にはLocalStorageと他の非LocalStorageプライマリストレージを含む複数のプライマリストレージ解決策が構成されています。ルートディスクを含むプライマリストレージを指定する必要があります。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10060": "KVMホスト[UUID: %s]をローカルプライマリストレージ[UUID: %s]に追加できませんでした、%s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10020": "ZStackのベアメタルサービスデプロイメントでは、ISOイメージのみサポートされています。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10061": "KVMホスト[uuid:%s, ip:%s]上に空のスナップショットボリューム[name:%s, install path: %s]を作成できません。理由は: %s", + "ORG_ZSTACK_KVM_10054": "仮想マシン[uuid:%s]が%s状態のため、ボリュームスナップショットのマージを実行できません。この操作は仮想マシンがRunningまたはStopped状態の場合にのみ許可されます。", + "ORG_ZSTACK_HA_10008": "ホスト[UUID: %s]からself-fencer状態を同期中に例外が発生しました: %s", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10000": "クラウド管理サーバ[%s]上にフォルダ[%s]が見つかりません", + "ORG_ZSTACK_KVM_10055": "ライブボリュームスナップショットマージにはlibvirtバージョン%sより大きいバージョンが必要です。現在のバージョンは%sです。VMを停止して操作を再試行するか、必要に応じてデータボリュームを切り離してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10062": "SFTPバックアップストレージ[hostname:%s, path:%s]からローカルプライマリストレージ[uuid:%s, path:%s]へのビット転送に失敗しました。%s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10022": "Destroyed状態以外のベアメタルインスタンスは復元できません。復元を試みる前にインスタンスがDestroyed状態であることを確認してください。", + "ORG_ZSTACK_HA_10009": "ストレージネットワークが利用不可能で、高可用性を有効なままにする必要があるため、パラメータ%sを'%s'に設定できません。", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10001": "名前空間[%s]にメトリック[%s]がありません", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10063": "ローカルストレージ[uuid:%s, path:%s]からSFTPバックアップストレージ[hostname:%s, remotePath:%s]へのビットアップロードに失敗しました。%s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10021": "ZStackベアメタルサービスでは、Image Storeバックアップストレージのみサポートされています。", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10002": "名前空間[%s]のメトリック[%s]にはラベル名%sがありません", + "ORG_ZSTACK_MEVOCO_10039": "無効な値[%s]です。0より大きく1以下のdouble値である必要があります", + "ORG_ZSTACK_KVM_10047": "ホスト[UUID: %s, status: %s]は接続されていません。", + "ORG_ZSTACK_COMPUTE_OVS_10000": "ovs CPUピン留めリソース設定:[%s]の形式エラーです。", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10001": "意図的なエラー1: ソースファイルが見つかりませんでした。必要なすべてのファイルが正しくアップロードされ、プロジェクト設定に含まれていることを確認してください。", + "ORG_ZSTACK_MEVOCO_10037": "無効な値[%s]です。0より大きい正の浮動小数点数である必要があります", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10002": "意図的なエラー2 - このエラーは、実行中に操作が意図的に終了または変更されたことを示します。入力パラメータを確認し、クラウドコンピューティング環境の要件を満たしていることを確認してください。", + "ORG_ZSTACK_MEVOCO_10031": "認証のための未知のセキュリティコード[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10089": "ボリュームバックアップメタデータ操作の失敗理由は%s", + "ORG_ZSTACK_STORAGE_BACKUP_10087": "イメージストア[uuid:%s]でのボリュームバックアップメタデータファイルの生成がIOエラーのため失敗しました: %s", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10000": "意図的なエラー3 - クラウドインスタンスが终止されています。操作を確認してください。", + "ORG_ZSTACK_MEVOCO_10034": "ホスト[UUID:%s]のOS %s %sは、ネットワークまたはディスクI/OのQoSをサポートするには古すぎます。QoS構成のない別のインスタンスを選択してください。", + "ORG_ZSTACK_MEVOCO_10033": "%sは有効なCIDR表記ではありません", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10010": "VLAN範囲[%s, %s]が無効なため、Huawei iMaster SDNコントローラを追加できませんでした", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10008": "ISO[uuid: %s]はVM[uuid: ]にアタッチされていますが、ISOファイルはブロックストレージ上にありません。VMを移行する前にデタッチする必要があります。", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10009": "ボリューム:%sのブロックSCSI LUNが見つかりません", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10035": "ホスト[uuid:%s]がローカルストレージ[uuid:%s]にアクセスできません。おそらくデタッチためです", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10013": "論理路由器UUIDなしでHuawei iMaster NSE L3ネットワークを作成できませんでした", + "ORG_ZSTACK_MEVOCO_10093": "DeleteVolumeQos [%s]はアカウント権限により無視されました。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10036": "resource[uuid:%s, type: %s]はローカルプライマリストレージ[uuid:%s]で利用できません", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10014": "L2ネットワーク[uuid:%s]を持つHuawei iMaster L3ネットワークを作成できませんでした。既に存在するためです", + "ORG_ZSTACK_MEVOCO_10092": "無効なボリュームQoSモード: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10037": "ローカルプライマリストレージ[uuid:%s]上のresource[uuid:%s, type: %s]が複数のハイパーバイザーにマッピングされています%sWithMultipleHypervisors", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10011": "指定されたVLAN範囲またはVLAN IDなしでHuawei iMaster SDNコントローラーを追加できませんでした", + "ORG_ZSTACK_MEVOCO_10091": "このインスタンスにはボリュームがアタッチされていません。続行するにはボリュームをアタッチしてください。", + "ORG_ZSTACK_STORAGE_BACKUP_10058": "別のクラスターにアタッチされているプライマリストレージは指定できません。", + "ORG_ZSTACK_STORAGE_BACKUP_10057": "次のパラメータの少なくとも1つを指定する必要があります: L3ネットワークUUID、ゾーンUUID、クラスターUUID、ホストUUID。", + "ORG_ZSTACK_MEVOCO_10090": "複数のVMにアタッチされたボリュームのスナップショットを取得できません", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10033": "ホストUUIDが指定されていないため、ローカルプライマリストレージ[uuid:%s]にデータボリューム[uuid: %s]を作成できません。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10034": "有効なホスト状態がありません。ホストリソースの可用性を確認してください。", + "ORG_ZSTACK_KVM_10064": "KVMホスト[uuid:%s, ip:%s]上の仮想マシン[vm:%s]のネットワークインターフェース更新に失敗しました。理由: %s", + "ORG_ZSTACK_KVM_10065": "KVMホスト(UUID: %s, IP: %s)へのNIC UUID: %sのVM UUID: %sへのアタッチに失敗しました。理由: %s。再試行するか、UUID: %sのデバイスを手動で削除してください。", + "ORG_ZSTACK_KVM_10066": "KVMホスト(UUID: %s, IP: %s)へのNIC UUID: %sのVM UUID: %sへのアタッチに失敗しました。理由: %s", + "ORG_ZSTACK_KVM_10067": "KVMホスト[uuid:%s, ip:%s]上のVM[uuid:%s, name:%s]からのデータボリューム[uuid:%s, installPath:%s]のデタッチに失敗しました。理由: %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10005": "ポートフォワーディングルール[uuid:%s]が削除されました", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10006": "ポートフォワーディングルール[uuid:%s]が有効になっていません。現在の状態は%sです", + "ORG_ZSTACK_KVM_10059": "VM[uuid:%s]は実行中または停止状態ではありません。現在のステータス[%s]", + "ORG_ZSTACK_TICKET_10000": "チケット[uuid:%s, name:%s]はキャンセルされた後にのみ更新できます。現在のステータスは%sです", + "ORG_ZSTACK_TICKET_10001": "操作が拒否されました。この操作はアカウント/仮想ID[uuid:%s]によって実行する必要があります", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10017": "SDNコントローラー[IP:%s]からトークンを取得できませんでした", + "ORG_ZSTACK_MEVOCO_10086": "VM[uuid:%s]は動作を停止しました。後で再試行してください。", + "ORG_ZSTACK_STORAGE_BACKUP_10056": "ボリューム[UUID: %s]の現在のVM[UUID: %s]は、バックアップに使用されていたVM[UUID: %s]ではなくなりました", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10003": "ホストへのLUNマッピングフローを実行できません。PSホスト参照メタデータが空です。ホスト構成を確認し、必要なメタデータが入力されていることを確認してください。", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10018": "sdnコントローラー[ip:%s]からトークンを取得できませんでした。理由: %s", + "ORG_ZSTACK_MEVOCO_10085": "ボリュームUUID [uuid: %s]からスナップショットが見つかりません。おそらくスナップショットチェーンの検証は必要ありません。", + "ORG_ZSTACK_STORAGE_BACKUP_10055": "グループ[uuid:%s]のrootボリュームスナップショットが見つかりません", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10000": "nullバックエンドデバイスにより、論理ユニットをホストへのマッピングを実行できません。%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10015": "L3ネットワーク[UUID:%s]に関連付けられているため、Huawei論理ルーター[UUID:%s]を削除できませんでした", + "ORG_ZSTACK_MEVOCO_10084": "ボリューム[uuid: %s]から最新のスナップショットが見つかりません。スナップショットチェーンが存在しない可能性があります。", + "ORG_ZSTACK_STORAGE_BACKUP_10054": "グループUUID: %sのバックアップボリュームが見つかりません", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10016": "SDNコントローラ[IP:%s]のトークン取得に失敗しました", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10001": "PSホスト参照がnullのため、LUNをホストにマッピングするフローを実行できません。ホスト参照が適切に設定されていることを確認してください。", + "ORG_ZSTACK_MEVOCO_10083": "ボリュームのスナップショットツリー[UUID: %s]内に指定されたスナップショットが見つかりません。検証が必要なスナップショットチェーンが存在しない可能性があります。", + "ORG_ZSTACK_STORAGE_BACKUP_10053": "リソース[uuid: %s]はすでにCDPタスクを開始しているため、バックアップジョブを同時に作成することはできません。", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10006": "KVMホスト[UUID: %s]をブロックプライマリストレージ[UUID: %s]に追加できませんでした、%s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10009": "ポートフォワーディングルール[uuid:%s]は有効になっていません。現在の状態は%sです。ルールは有効状態の場合のみアタッチできます。", + "ORG_ZSTACK_STORAGE_BACKUP_10052": "VM[uuid:%s]は[%s, %s]の状態ではないため、バックアップの作成に失敗しました", + "ORG_ZSTACK_MEVOCO_10089": "ボリューム[%s]のスナップショットを取得できません。ボリューム[UUID: %s]が複数回定義されています", + "ORG_ZSTACK_STORAGE_BACKUP_10051": "ボリューム[uuid: %s]はルートボリュームではありません", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10019": "SDNコントローラ[IP:%s]のトークン削除に失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10004": "ボリュームIDが無効なため、ボリュームをホストにマッピングするフローを実行できません。%s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10007": "ポートフォワーディングルール[uuid:%s]はどの仮想マシンネットワークインターフェースにもアタッチされていないため、デタッチできません", + "ORG_ZSTACK_MEVOCO_10088": "ボリューム[uuid: %s]がアタッチされていないため、ボリューム[%s]のスナップショットを取得できません", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10005": "LUNタイプが無効なため、LUNをホストにマッピングするフローを実行できません: %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10008": "ポートフォワーディングルール[uuid:%s]はすでにvm nic[uuid:%s]に関連付けられているため、再割り当てできません", + "ORG_ZSTACK_MEVOCO_10087": "実行中のVM[uuid:%s]に関連付けられたホストUUIDがありません。", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10020": "SDNコントローラ[IP:%s]のテナント取得に失敗しました", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10021": "SDNコントローラ[IP:%s]のテナント取得に失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10019": "ブロックプライマリストレージ[uuid:%s, name:%s]は、ボリュームインスタンス化のためにアタッチされたクラスタ内で利用可能なホストを見つけることができません", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10024": "SDNコントローラ[IP:%s]から論理スイッチポートの取得に失敗しました", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10047": "データボリューム[uuid:%s]をVM[uuid:%s]にアタッチできません。VMのルートボリュームとデータボリュームの両方がローカルプライマリストレージ上にありますが、異なるホスト上にあります。ルートボリューム[uuid:%s]はホスト[uuid:%s]上にあり、データボリューム[uuid:%s]はホスト[uuid:%s]上にあります。", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10025": "SDNコントローラ[ip:%s]からスイッチポート情報の取得に失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10048": "データボリューム[name: %s, UUID: %s]はローカルストレージ[UUID: %s]上にありますが、データボリュームが存在するホストは削除されています。このボリュームの回復は不可能です。", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10022": "SDNコントローラ[ip:%s]のスイッチデバイス取得に失敗しました", + "ORG_ZSTACK_STORAGE_BACKUP_10069": "VMは現在バックアップジョブを作成中のため、CDPタスクを同時に有効にすることはできません。CDPを有効にする前に、すべてのバックアップジョブが完了していることを確認してください。", + "ORG_ZSTACK_KVM_10070": "KVMホスト[uuid:%s, ip:%s]上の仮想Machine[uuid:%s name:%s]の終了に失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10049": "vm[uuid:%s, name:%s]を回復できません。vmのルートボリュームはローカルストレージ[uuid:%s]上にありますが、ルートボリュームが存在するホストは削除されています。", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10023": "SDNコントローラ[IP:%s]のスイッチデバイス取得に失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10068": "ホストクラスタ [uuid: %s] はボリュームクラスタ [uuid: %s] と同じ場所にありません。プライマリストレージが同じクラスタ内であることを確認してください。", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10020": "VM [Name: %s UUID: %s] は [UUID: %s] とは異なる VIP を持つポート転送ルールをすでに持っています。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10044": "作成はイメージキャッシュ [uuid: %s, located host uuids: [%s]] に依存しているため、他の場所では作成できません。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10045": "ローカルストレージはハイパーバイザー [%s] のライブマイグレーションをサポートしていません", + "ORG_ZSTACK_KVM_10075": "KVM ホスト [uuid:%s ip:%s] 上で VM [uuid:%s name:%s] を停止できませんでした、理由: %s", + "ORG_ZSTACK_KVM_10078": "ホスト [uuid:%s] には CPU [%s] とメモリ [%s バイト] を割り当てる十分な容量がありません。", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10017": "VIP ポート範囲 [vipStartPort:%s, vipEndPort:%s] はネットワークルール [uuid:%s, vipStartPort:%s, vipEndPort:%s] と重複しています", + "ORG_ZSTACK_KVM_10069": "KVM ホスト [uuid:%s, ip:%s] 上で VM [uuid:%s, name:%s] にデータボリューム [uuid:%s, installPath:%s] をアタッチできませんでした、理由: %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10014": "無効な CIDR [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10015": "無効な CIDR [%s]、IPv4 アドレスのみサポートされています", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10012": "ポート転送ルールを作成できませんでした、VIP ポート範囲 [vipStartPort:%s, vipEndPort:%s] はプライベートポート範囲 [privateStartPort:%s, privateEndPort:%s] と互換性がありません", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10010": "ボリュームリスト %s の SCSI LUN が見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10013": "範囲ベースのポート転送では、ポート範囲のサイズが一致する必要があります。VIP 範囲 [%s, %s] のサイズは [%s, %s] と一致しません", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10010": "VM NIC のゲスト L3 ネットワークとポート転送規則の VIP L3 ネットワークは同一のネットワークです (uuid: %s, uuid: %s)", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10028": "SDN コントローラ [ip:%s] のファブリック取得に失敗しました", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10013": "Ceph を含む複数のホストで同時にボリュームスナップショットを取得する操作はサポートされていません。", + "ORG_ZSTACK_MEVOCO_10097": "提供された Java コード スニペットにソース ファイルがありません。必要なすべてのファイルが含まれていることを確認し、再コンパイルしてください。さらに、エラー メッセージ \"unknown message version\" は、サポートされていないか認識されないメッセージ形式を示しています。メッセージ バージョンを確認し、システムと互換性があることを確認してください。", + "ORG_ZSTACK_STORAGE_BACKUP_10067": "バックアップ操作に使用可能なオブジェクトストレージ バケットが見つかりません。オブジェクトストレージサービスがクラウド環境内で正しく構成され、アクセス可能であることを確認してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10014": "ボリュームを VM にアタッチする前に LUN をホストにマッピングできませんでした", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10029": "SDN コントローラ [ip:%s] からファブリック ネットワークを取得できませんでした、理由: %s", + "ORG_ZSTACK_MEVOCO_10096": "非管理者アカウントは最大帯域幅制限 %s を超えることはできません", + "ORG_ZSTACK_STORAGE_BACKUP_10066": "VM は停止状態ではありません: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10026": "SDN コントローラ [IP:%s] の VPC 取得に失敗しました", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10011": "ブロック SCSI LUN 情報の交換に失敗しました:%s", + "ORG_ZSTACK_MEVOCO_10095": "SetVolumeQosMsg バージョン 1 はクラウドコンピューティング環境では非推奨です。最適なパフォーマンスと互換性のため、バージョン 2 に移行してください。", + "ORG_ZSTACK_STORAGE_BACKUP_10065": "ボリュームバックアップ [uuid:%s] で VM が見つかりません", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10027": "SDN コントローラ [IP:%s] の VPC 取得に失敗しました、理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10012": "ボリュームのアタッチ解除後にリソースをクリーンアップできませんでした、理由: %s", + "ORG_ZSTACK_MEVOCO_10094": "ホスト %s で VM のボリューム QoS を削除できません。現在の VM は %s の状態ですが、サポートされる状態は [%s, %s] です", + "ORG_ZSTACK_STORAGE_BACKUP_10064": "バックアップ [uuid:%s] の元のボリューム [uuid:%s] は仮想マシン [uuid:%s] にアタッチされなくなりました", + "ORG_ZSTACK_STORAGE_BACKUP_10063": "バックアップの元のスナップショット[uuid:%s]が削除されており、ボリュームを元に戻せません", + "ORG_ZSTACK_MEVOCO_10099": "管理者以外のアカウントは、バーチャルリソースの合計%s制限のみ設定できます。", + "ORG_ZSTACK_STORAGE_BACKUP_10061": "ボリュームバックアップ[uuid:%s]は現在の状態が%sであり、ボリストアの復元には使用できません。", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10016": "イメージキャッシュのダウンロード時にはprimaryStorageUuidが必須です。", + "ORG_ZSTACK_MEVOCO_10098": "未知のサービス品質(QoS)制限タイプが指定されました。QoS制限タイプが正しく構成されていることを確認してください。", + "ORG_ZSTACK_STORAGE_BACKUP_10060": "ルートボリュームバックアップではないボリュームバックアップ[uuid:%s]からVMを作成できません", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10017": "VMには異なるホスト[%s]に複数のローカルボリュームがあります。異常なVMローカルボリュームを確認してください。", + "ORG_ZSTACK_STORAGE_CEPH_10004": "無効な監視URL[%s]、ホスト名はnullにはできません。有効な監視URL形式は%sです", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10032": "iMaster論理スイッチ[%s]の取得で応答がありません", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10018": "VMには他のホスト[Host UUID: %s]にローカルボリュームがあるため、ホスト[Host UUID: %s]上のボリュームをVMに接続できません。", + "ORG_ZSTACK_STORAGE_CEPH_10005": "無効な監視URL[%s]、SSHポートが無効な範囲(1-65535)です。有効な監視URLの形式は%sです", + "ORG_ZSTACK_STORAGE_CEPH_10002": "無効な監視URL[%s]、SSHユーザー名:SSHパスワードコンポーネントが無効です。有効な監視URL形式は%sです", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10030": "%sのため、Huawei iMaster論理スイッチ[%s]の作成に失敗しました", + "ORG_ZSTACK_STORAGE_CEPH_10003": "無効な監視URL[%s]。SSHユーザー名とパスワードは':'で区切る必要があり、空にできません。有効な監視URL形式は%sです", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10035": "[%s] Huawei iMasterバーチャルスイッチポート[%s]が%sのため失敗しました", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10013": "VMをUUID %sで別のクラスターに移行する際、L2ネットワーク内でUUID %sとUUID %sの2つのクラスターが通信できません。", + "ORG_ZSTACK_STORAGE_CEPH_10008": "UUID:%sのCephプールはZStack環境内の他の場所で既に使用されているため、再利用できません。", + "ORG_ZSTACK_STORAGE_BACKUP_10038": "無効なURL[%s]、形式はhostname:/pathである必要があります", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10036": "論理スイッチ[%s]のポート情報の取得が%sのため失敗しました", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10014": "URL[%s]は'/'で始まる有効な絶対パスではありません。'http://'または'https://'で始まることを確認してください。", + "ORG_ZSTACK_STORAGE_CEPH_10009": "MONホスト[%s]によって現在使用中のため、Cephプライマリストレージを追加できません", + "ORG_ZSTACK_STORAGE_BACKUP_10037": "無効なマウントタイプ[%s]、[NFS, SSHFS, NBD]である必要があります", + "ORG_ZSTACK_STORAGE_CEPH_10006": "操作失敗: プール名に印字不可能なASCII文字を含めることはできません[poolName:%s]", + "ORG_ZSTACK_KVM_10080": "VMプラットフォームがOtherの場合、dataVolumesとcdromsの数は3を超えることはできません。現在は%sです。", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10033": "%sのため、Huawei iMasterバーチャルスイッチ[%s]の削除に失敗しました", + "ORG_ZSTACK_STORAGE_BACKUP_10036": "数値[%s]は正の整数である必要があります", + "ORG_ZSTACK_STORAGE_CEPH_10007": "作成失敗、重複するプール名[%s]。同じ名前のプールが既に存在します[uuid:%s]。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10016": "仮想マシン[hostUuid:%s]のホストはボリューム[hostUuid:%s]のホストとは異なります。ボリュームを仮想マシンの接続できません。", + "ORG_ZSTACK_STORAGE_BACKUP_10035": "[%s]は標準のCIDRではありません、[%s]という意味でしょうか?", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10034": "%sのため、Huawei iMaster論理スイッチ[%s]の更新に失敗しました", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10010": "UUID [%s]のボリュームは、UUID [%s]のVMのルートボリュームです。現在、VMには%s個のデータボリュームが接続されています。移行前にデタッチしてください。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10011": "ボリューム[UUID:%s]は、VM [UUID:%s]のルートボリュームです сейчас виртуальマシンにはISOが接続されています。移行前にデタッチしてください。", + "ORG_ZSTACK_KVM_10088": "KVMホスト[UUID:%s, IP:%s]で物理ネットワークインターフェース[names: %s]の確認に失敗しました", + "ORG_ZSTACK_KVM_10079": "Host[%s]のSpiceチャネル設定の更新に失敗しました。原因是%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10021": "ボリューム: %sは接続されていません、ボリュームのイメージキャッシュ作成に失敗しました", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10024": "ボリュームのダウンロードパスを見つけることができませんでした。進む前に準備してください", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10039": "Huawei iMaster NCE 論理ルーター[%s]の削除に失敗しました。原因是%s", + "ORG_ZSTACK_MEVOCO_10064": "ネットワーク受信帯域幅フォーマットエラー %s", + "ORG_ZSTACK_STORAGE_BACKUP_10034": "ストレージにボリュームバックアップ[uuid:%s]が見つかりません", + "ORG_ZSTACK_MEVOCO_10063": "ネットワーク受信帯域幅が最大値の32 Gbpsを超えています", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10025": "ボリューム%sのダウンロード先ホストを見つけることができません", + "ORG_ZSTACK_STORAGE_BACKUP_10033": "グループUUID: %s内のボリュームバックアップに対する権限がありません", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10022": "ボリューム: %sの移行先ホストを見つけることができません", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10037": "Huawei iMaster 仮想スイッチポート[%s]の削除に失敗しました。原因是%s", + "ORG_ZSTACK_STORAGE_BACKUP_10032": "グループuuid: %s内に複数のルートディスクが見つかりました", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10023": "ボリューム%sのマッピング先ホストを見つけることができませんでした", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10038": "Huawei iMaster 仮想ルーター[%s]の作成に失敗しました。原因是%s", + "ORG_ZSTACK_MEVOCO_10061": "マネジメントノードのステータスが%sではありません", + "ORG_ZSTACK_STORAGE_BACKUP_10031": "グループUUID: %s内にルートボリュームが見つかりません", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10026": "ホストイニシエイタ参照の取得に失敗しました。このホストを再接続してください: %s", + "ORG_ZSTACK_MEVOCO_10066": "ネットワーク送信帯域幅フォーマットエラー %s", + "ORG_ZSTACK_MEVOCO_10065": "ネットワーク送信帯域幅が最大値の32 Gbpsを超えています", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10042": "Huawei iMaster サブネット[%s]の作成に失敗しました。原因是%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10028": "ローカルストレージ[uuid:%s]内のすべてのホストへのイメージ[uuid:%s]のダウンロードに失敗しました。 %s", + "ORG_ZSTACK_STORAGE_CEPH_10015": "monUrl[%s]が無効です。有効なURLは%sの形式である必要があります", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10043": "Huawei iMaster サブネット[%s]の削除に失敗しました。原因是%s", + "ORG_ZSTACK_STORAGE_CEPH_10016": "dataVolumePoolNameはnull可以是空字符串,但不能是空字符串。", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10040": "Huawei iMaster 仮想ネットワークリンク[%s]の作成に失敗しました。原因是%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10041": "Huawei iMaster 仮想ネットワークリンク[%s]の削除に失敗しました。原因是%s", + "ORG_ZSTACK_STORAGE_CEPH_10019": "Cephバックアップストレージを追加できませんでした。なぜなら、mon[hostnames:%s]を使用しているCephバックアップストレージがすでに存在するためです", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10046": "新しい仮想ネットワークインターフェースが確立されていません。これは発生しないはずです。", + "ORG_ZSTACK_MEVOCO_10082": "仮想マシン [%3$s] への I/O スレッド [%1$d] ピン [%2$s] の設定に失敗しました: %4$s", + "ORG_ZSTACK_STORAGE_BACKUP_10049": "ボリューム [uuid:%s] のバックアップの作成に失敗しました。アタッチされているボリュームが [%s, %s] の状態ではないためです。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10025": "プライマリストレージ [UUID:%s] は無効です。コールドマイグレーションは許可されていません。", + "ORG_ZSTACK_STORAGE_BACKUP_10048": "ボリューム [uuid:%s] のバックアップの作成に失敗しました。VM が [%s, %s] の状態ではないためです。", + "ORG_ZSTACK_STORAGE_CEPH_10017": "rootVolumePoolName は null かもしれませんが、空の文字列であってはなりません。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10026": "ボリューム [uuid:%s] はローカルストレージにアタッチされていません。削除またはデタッチされた可能性があります。", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10044": "SDN コントローラー [IP:%s] のシステム情報の取得に失敗しました", + "ORG_ZSTACK_STORAGE_BACKUP_10047": "ボリューム [uuid:%s] のバックアップの作成に失敗しました、どの VM インスタンスにもアタッチされていないためです。", + "ORG_ZSTACK_STORAGE_CEPH_10018": "imageCachePoolName は null かもしれませんが、空の文字列であってはなりません。", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10045": "SDN コントローラー [IP:%s] のシステム情報の取得に失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10046": "シェア可能ボリューム [uuid:%s] のバックアップを作成できません", + "ORG_ZSTACK_KVM_10093": "KVM ホスト [uuid:%s, ip:%s, url:%s] への接続に失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10022": "ローカルプライマリストレージにボリュームを作成するには、システムタグ [%s] を使用してボリュームを作成するホストを指定する必要があります。", + "ORG_ZSTACK_KVM_10096": "ホストがいずれのプライマリストレージにアクセスできません。ストレージ構成を確認するか、サポートにお問い合わせください %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10023": "URI 形式が無効です。正しい例: file://$URL, hostUuid://$HOSTUUID, volume://$VOLUMEUUID", + "ORG_ZSTACK_STORAGE_CEPH_10012": "同じ Mono ノードを複数回追加することはできません。", + "ORG_ZSTACK_KVM_10099": "ホスト [%s] の SSH ポート [%s] が %s 秒後に到達不能になりました。接続タイムアウト", + "ORG_ZSTACK_STORAGE_CEPH_10010": "同じホスト [%s] をクラスタ mons に追加することはできません", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10031": "スナップショットのバックアップストレージへのバックアップは、非推奨の機能であり、ブロックプライマリストレージではサポートされていません。", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10032": "ps:%s 上のコミットボリュームのクラスタが見つかりません", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10035": "LUN を削除する際には、プライマリストレージの UUID が必要です。", + "ORG_ZSTACK_MEVOCO_10075": "シェア可能ディスクは現在、virtio-scsi タイプのみサポートしています。", + "ORG_ZSTACK_STORAGE_BACKUP_10045": "予期しないバックアップストレージ [type:%s,uuid:%s] が検出されました", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10036": "ホストイニシエーター名を取得する際には、ホストの UUID が必要です。", + "ORG_ZSTACK_MEVOCO_10074": "シェア可能ボリューム [uuid:%s] はすでに仮想マシーン [uuid:%s] にアタッチされています。", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10048": "新しい仮想ネットワークインターフェースが作成されませんでした。これは発生しないはずです。", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10033": "コミットボリューム:%s のホストが見つかりません", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10034": "バックアップストレージ [hostname:%s] からブロックプライマリストレージ [uuid:%s, path:%s] への [%s] のダウンロードに失敗しました。%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10049": "コントローラー [ip:%s] には SDN ファブリックが構成されていません", + "ORG_ZSTACK_MEVOCO_10078": "現在のライセンスバージョンでは、このリソース設定の変更はサポートされていません [name:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10037": "initiatorName %s は別のホストで使用されています。ホスト %s のイニエーターを再生成してください", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10038": "名前:%s のボリュームテンプレートが見つかりません", + "ORG_ZSTACK_MEVOCO_10076": "共有可能ボリューム [UUID: %s] が接続されています。グループスナップショットはサポートされていません。", + "ORG_ZSTACK_AI_MESSAGE_10002": "リソース UUID[%s] またはモデルセンター UUID[%s] が null であるため、データセット作成ジョブをキャンセルできません", + "ORG_ZSTACK_AI_MESSAGE_10001": "リソース UUID[%s] またはモデルセンター UUID[%s] が null であるため、モデルサービスダウンロードタスクをキャンセルできません", + "ORG_ZSTACK_IPSEC_VYOS_10009": "HA グループへの適用に失敗しました: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10013": "クラウド環境内のすべての Prometheus インスタンスへの HTTP 呼び出しに失敗しました。", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10012": "キー = %s の不明のデータタイプ %s", + "ORG_ZSTACK_ENCRYPT_10000": "API メッセージの解析に失敗しました: タイプ %s の暗号化パラメータを解析できません", + "ORG_ZSTACK_ENCRYPT_10002": "API メッセージの解析に失敗しました: %d 個の暗号化パラメータシステムタグが見つかりました。1 つを期待しています", + "ORG_ZSTACK_IPSEC_VYOS_10001": "VYOS は IKE 暗号化アルゴリズムとして AES-192 をサポートしていません。利用可能なオプションは AES-128 および AES-256 です。", + "ORG_ZSTACK_IPSEC_VYOS_10000": "リモート CIDR [%s] は Virtual Router インターフェース CIDR [%s] と重複しています", + "ORG_ZSTACK_IPSEC_VYOS_10003": "vyos は IKE DH グループ %d をサポートしていません", + "ORG_ZSTACK_IPSEC_VYOS_10002": "vyOS は PolicyEncryptionAlgorithm として AES-192 をサポートしていません。利用可能なオプションは AES-128、AES-256、および 3DES です。", + "ORG_ZSTACK_COMPUTE_VM_10000": "VM[uuid:%s] の状態が実行中ではないため、時刻同期を実行できません。", + "ORG_ZSTACK_COMPUTE_VM_10008": "vm[uuid:%s] はクラスタ[uuid:%s] に所属していますが、クラスタ内に利用可能なホストがありません。そのため、この vm のイメージ変更を処理できません。", + "ORG_ZSTACK_COMPUTE_VM_10007": "vm[uuid:%s] のクラスタ UUID が null です。イメージを変更できません", + "ORG_ZSTACK_COMPUTE_VM_10006": "VM の状態が停止していません: %s。'changevmimage' アクションを実行できません。", + "ORG_ZSTACK_COMPUTE_VM_10005": "UUID: %s の xml hook が UUID: %s の VM に正常に接続されましたが、VM の再起動に失敗しました。詳細: %s", + "ORG_ZSTACK_COMPUTE_VM_10004": "UUID: %s の xml hook が UUID: %s の VM から正常に接続解除されましたが、VM の再起動で問題が発生しました。詳細: %s", + "ORG_ZSTACK_COMPUTE_VM_10003": "Hot-adding は無効になっていません。仮想マシン開く前に NUMA 設定がされていることを確認してください。", + "ORG_ZSTACK_COMPUTE_VM_10011": "direction パラメータは IN または OUT に設定する必要があります。", + "ORG_ZSTACK_COMPUTE_VM_10010": "バックアップストレージが見つかりません。ボリュームスナップショット[psUuid:%s]をイメージとしてコミットできません。宛先に必要な PS UUID:%s", + "ORG_ZSTACK_COMPUTE_VM_10018": "パスワード変更操作中に状態の検証に失敗しました。%s", + "ORG_ZSTACK_COMPUTE_VM_10017": "UUID: %s の宛先ホストがデータベースに見つかりません。ホストにパスワード変更コマンドを送信できません!", + "ORG_ZSTACK_STORAGE_DEVICE_10036": "hba スキャンに失敗しました: %s", + "ORG_ZSTACK_COMPUTE_VM_10015": "vm [%s] のホスト UUID が null です。ネットワーク Quality of Service を同期できません", + "ORG_ZSTACK_COMPUTE_VM_10014": "vm [%s] は、NIC QoS 設定を同期するために実行中または一時停止状態である必要があります", + "ORG_ZSTACK_STORAGE_DEVICE_10031": "vm インスタンス[uuid: %s] host[uuid: %s] で scsi lun[uuid: %s] の接続に失敗しました", + "ORG_ZSTACK_COMPUTE_VM_10013": "outboundBandwidthは%s以下に設定する必要があります。", + "ORG_ZSTACK_COMPUTE_VM_10012": "inboundBandwidthは%s Gbps以下に設定する必要があります。", + "ORG_ZSTACK_STORAGE_DEVICE_10030": "vm instance[%s]の状態[%s]は、指定された操作[%s]に対して許可された状態にありません。", + "ORG_ZSTACK_COMPUTE_VM_10022": "セキュリティ機能が無効になっているため、セキュリティレベルの設定に失敗しました。この構成を行う前に、セキュリティ機能が有効になっていることを確認してください。", + "ORG_ZSTACK_COMPUTE_VM_10020": "データボリュームの数が指定された制限[num: %s]を超えています。仮想マシンを作成する際にデータボリュームの数を減らしてください。", + "ORG_ZSTACK_STORAGE_DEVICE_10028": "指定されたSCSI LUN [WWID: %s]は存在しないか、無効です。", + "ORG_ZSTACK_STORAGE_DEVICE_10029": "scsi[%s] lun[wwid:%s]はvm[%s]に接続されています。", + "ORG_ZSTACK_STORAGE_DEVICE_10026": "ホスト[UUID:%s, targets:%s]とホスト[UUID:%s, targets:%s]で異なるiSCSI構成が見つかりました。", + "ORG_ZSTACK_STORAGE_DEVICE_10027": "LUN[serial:%s]のホスト間で異なるディスクタイプが見つかったため、クラスタに接続できません。", + "ORG_ZSTACK_COMPUTE_VM_10029": "could not clone VM because a prefix is specified for network[uuid:%s] - this appears to be a duplicate or incorrect entry, I'll skip it", + "ORG_ZSTACK_STORAGE_DEVICE_10024": "ネットワーク[uuid:%s]にプレフィックスが指定されているため、VMをクローンできませんでした。", + "ORG_ZSTACK_COMPUTE_VM_10028": "SCSI LUN [%(s)s]の記録がホスト[%(s)s]に見つかりません。", + "ORG_ZSTACK_STORAGE_DEVICE_10025": "IPv6アドレス[%s]が無効なため、vmをクローンできませんでした。", + "ORG_ZSTACK_COMPUTE_VM_10027": "仮想マシンホスト[%s]のハイパーバイザータイプ[%s]が予期しないものです。", + "ORG_ZSTACK_STORAGE_DEVICE_10022": "ネットワーク[uuid:%s]にネットマスクが指定されているため、VMをクローンできませんでした。", + "ORG_ZSTACK_COMPUTE_VM_10026": "ホスト[hostUuid:%s, targets:%s]とホスト[hostUuid:%s, targets:%s]で異なるNVMeターゲットが見つかりました。", + "ORG_ZSTACK_STORAGE_DEVICE_10023": "指定されたIPアドレス[%s]が無効なため、vmをクローンできませんでした。", + "ORG_ZSTACK_COMPUTE_VM_10025": "SCSI LUN[%s]は仮想マシン[%s]に接続されています。", + "ORG_ZSTACK_STORAGE_DEVICE_10020": "レイヤー3ネットワーク[uuid:%s]が見つからないため、VMをクローンできませんでした。", + "ORG_ZSTACK_COMPUTE_VM_10024": "vm instance[%s]の状態[%s]は、操作[%s]に対して許可された状態にありません。", + "ORG_ZSTACK_STORAGE_DEVICE_10021": "不明なセキュリティレベルコード[%s]です。サポートされている値は[0-7]です。", + "ORG_ZSTACK_COMPUTE_VM_10023": "vm instance[%s]はホスト[uuid: %s]でscsi lun[uuid: %s]の接続に失敗しました。", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10002": "VM [uuid:%s]を有効にしていないため、セキュリティレベルを設定できません。", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10001": "現在のプライマリストレージ%sにはサードパーティトークンが構成されていないため、一時的にブロックボリュームを作成できません。", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10000": "割り当てられた仮想リソースURL:%sが無効です。", + "ORG_ZSTACK_STORAGE_DEVICE_10017": "URLの割り当てに失敗しました。URLが正しいことを確認してください。問題が解決しない場合は、サポートに連絡してください。", + "ORG_ZSTACK_STORAGE_DEVICE_10015": "scsi lun[wwid:%s]はvm[%s]に接続されています。", + "ORG_ZSTACK_STORAGE_DEVICE_10016": "scisLun[uuids:%s]はホスト[uuid:%s]のクラスタに接続されていません。", + "ORG_ZSTACK_STORAGE_DEVICE_10014": "VM[%s]に関連付けられたすべてのブロックデバイスのアンマウントを行い、再試行してください。", + "ORG_ZSTACK_STORAGE_DEVICE_10011": "scsi lun[wwid: %s]は仮想マシンインスタンス%sに接続されています。", + "ORG_ZSTACK_STORAGE_DEVICE_10012": "iSCSIサーバー[UUID: %s]は仍然としてクラスター[UUID: %s]に関連付けられています", + "ORG_ZSTACK_STORAGE_DEVICE_10010": "iSCSIサーバー[UUID: %s]はすでにクラスター[UUID: %s]に接続されています", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10008": "ローカルCIDRとリモートCIDRは有効なCidr範囲である必要があります!", + "ORG_ZSTACK_NETWORK_SERVICE_HEADER_NFVINSTGROUP_10000": "このNFVインスタンスタイプではクラスター状態のクエリはサポートされていません。", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10001": "VPNゲートウェイ[%s]が存在するため、リモートで削除できません。", + "ORG_ZSTACK_STORAGE_DEVICE_10008": "iSCSIサーバー[IP: %s, Port: %s]はすでに存在します", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10005": "%sはクラウドデプロイメント設定用の有効なIPv4アドレスではありません", + "ORG_ZSTACK_STORAGE_DEVICE_10009": "iSCSIサーバーIP: %sは無効です", + "ORG_ZSTACK_STORAGE_DEVICE_10006": "UUID: %sのNVMeサーバーはすでにUUID: %sのクラスターに接続されています", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10007": "リモートCIDRは有効なCIDR表記である必要があります!", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10006": "localCidrは有効なCidrである必要があります!", + "ORG_ZSTACK_STORAGE_DEVICE_10004": "NVMeサーバー[ip: %s, port: %s, transport: %s]はすでにクラウド環境に存在します", + "ORG_ZSTACK_STORAGE_DEVICE_10005": "NVMeサーバーIP: %sは無効です", + "ORG_ZSTACK_STORAGE_DEVICE_10003": "共有ストレージを持つVM[uuid:%s]の移行はサポートされていません", + "ORG_ZSTACK_STORAGE_DEVICE_10000": "uuid: %sとuuid: %sのscsi lunは共通のホストを共有していません", + "ORG_ZSTACK_STORAGE_DEVICE_10001": "scsi lun [uuid: %s]は無効な状態です", + "ORG_ZSTACK_ALIYUN_NETWORK_VPN_10000": "VPNゲートウェイとユーザーゲートウェイは同一个データセンターにある必要があります。", + "ORG_ZSTACK_IPSEC_VYOS_10016": "ipsec to haルートの作成に失敗しました:%s", + "ORG_ZSTACK_IPSEC_VYOS_10015": "haグループからのipsecの削除に失敗しました:%s", + "ORG_ZSTACK_COMPUTE_BONDING_10001": "インターフェースはすでにホスト上に作成されています", + "ORG_ZSTACK_COMPUTE_BONDING_10008": "ボンディングカードはホスト[%s]で異なる速度のボンディング内のインターフェースを持つことはできません。", + "ORG_ZSTACK_COMPUTE_BONDING_10007": "インターフェース[%s]はSRIOV仮想化されているボンディング内に配置することはできません。", + "ORG_ZSTACK_COMPUTE_BONDING_10006": "ホスト[%s]ですでに使用されているネットワークブリッジとして使用されているボンディング内にインターフェースを配置することはできません。", + "ORG_ZSTACK_COMPUTE_BONDING_10005": "ホスト[%s]ですでに使用されているボンディング内に占有されたインターフェースを配置することはできません。", + "ORG_ZSTACK_IPSEC_VYOS_10012": "ipsecバージョンの更新に失敗しました:vpc[%s]は存在しません", + "ORG_ZSTACK_COMPUTE_BONDING_10009": "ホスト[uuid:%s]上にスレーブネットワークインターフェースが存在しません", + "ORG_ZSTACK_IPSEC_VYOS_10013": "HAグループへの同期に失敗しました:%s", + "ORG_ZSTACK_MEVOCO_10105": "管理者以外のアカウントは読み取り/書き込みの%s制限を%s/%sより大きく設定することはできません", + "ORG_ZSTACK_SIMULATOR_10002": "インスタンスは切断された状態に設定されています", + "ORG_ZSTACK_MEVOCO_10104": "管理者以外のアカウントは書き込み[ストレージ制限]を無制限に設定することはできません", + "ORG_ZSTACK_MEVOCO_10103": "管理者以外のアカウントは、読み取りI/O制限を無制限に設定できません。", + "ORG_ZSTACK_MEVOCO_10102": "管理者以外のアカウントは、読み取り/書き込み%s制限のみ設定できます。", + "ORG_ZSTACK_MEVOCO_10109": "vm [%s]のホストUUIDがnullです。ボリュームQoSを同期できません。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10016": "FiSecClientFactory接続テストに失敗しました", + "ORG_ZSTACK_MEVOCO_10108": "vm [%s]はボリュームQoSを同期するために実行中または一時停止状態である必要があります", + "ORG_ZSTACK_MEVOCO_10107": "ボリューム[%s]がどの仮想マシンにも接続されていません(または仮想マシンが存在しません)。ボリュームQoSを同期できません。", + "ORG_ZSTACK_SIMULATOR_10004": "エラー\"on purpose\"はシステム障害ではなく意図的なアクションを示しています。詳細を進めるために、意図の目的について詳しく教えてください。", + "ORG_ZSTACK_MEVOCO_10106": "ボリューム[%s]がどの仮想マシンにも接続されていないため、forceSyncでQoSを取得できません。", + "ORG_ZSTACK_MEVOCO_10101": "管理者以外のアカウントは、合計%s制限を以下よりも大きく設定できません: %s", + "ORG_ZSTACK_MEVOCO_10100": "管理者以外のアカウントは、合計%s制限を無制限に設定できません。", + "ORG_ZSTACK_COMPUTE_BONDING_10011": "VTEP IPアドレスで構成されたインターフェースにバインドできません。VTEP IPが正しく構成され到達可能であることを確認してください。", + "ORG_ZSTACK_COMPUTE_BONDING_10010": "管理ネットワークに対応するインターフェースにバインドできません。仮想ネットワークインターフェースが正しく構成され、指定された管理ネットワークに対応していることを確認してください。%s", + "ORG_ZSTACK_COMPUTE_BONDING_10015": "ボンディングカードには、SR-IOV仮想化されたインターフェース[%s]を含めることはできません", + "ORG_ZSTACK_COMPUTE_BONDING_10014": "ボンディングカードには、すでにホスト[%s]で使用されているネットワークブリッジとして使用されたインターフェースを含めることはできません", + "ORG_ZSTACK_COMPUTE_BONDING_10013": "ボンディングカードには、すでにホスト[%s]で使用されている占有インターフェースを含めることはできません", + "ORG_ZSTACK_COMPUTE_BONDING_10012": "ボンディング内のインターフェースは、同じホスト[%s]上に存在する必要があります。", + "ORG_ZSTACK_COMPUTE_BONDING_10019": "[ボンディング]は[%s]個のインターフェースを持つことはできません。1〜2の間である必要があります", + "ORG_ZSTACK_COMPUTE_BONDING_10018": "[ボンディングカード]の[インターフェース数]を[%s]に設定することはできません。[1〜8]の数値である必要があります", + "ORG_ZSTACK_COMPUTE_BONDING_10017": "[%s]ボンディングインターフェースは、異なるxmit_hash_policyを指定できません。モード802.3adのみが異なるポリシーの指定をサポートしています。", + "ORG_ZSTACK_COMPUTE_BONDING_10016": "ボンディングカードには、ホスト[%s]上で異なる速度を持つインターフェースを含めることはできません", + "ORG_ZSTACK_MEVOCO_10113": "Volume[UUID:%s]はvhost-userプロトコルを使用しています。これはネイティブ非同期I/Oと互換性がありません。aio.nativeを無効にするか、別のボリュームプロトコルを選択してください。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10003": "シークレットリソースプール[uuid: %s]への接続を確立できませんでした", + "ORG_ZSTACK_MEVOCO_10112": "現在のライセンスバージョンでは、このグローバル設定の変更はサポートされていません[name:%s]。", + "ORG_ZSTACK_MEVOCO_10111": "VMInstanceからの共有ボリュームのデタッチに失敗しました: [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10005": "%sクライアントの初期化に失敗しました: シークレットリソースプールプロパティが無効です。", + "ORG_ZSTACK_MEVOCO_10110": "Instance[uuid:%s]からの共有ボリューム[uuid:%s]のデタッチに失敗しました", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10006": "Plugin (UUID: %s)는 다음 비밀 리소스 풀과 연결되어 있으므로 삭제할 수 없습니다: [%s].", + "ORG_ZSTACK_MEDIATOR_10005": "VIP [UUID:%s]はすでに別のサービス[%s]にバインドされています。", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10007": "組織ID[uuid:%s]にはすでに操作属性が存在するため、%sを追加できません", + "ORG_ZSTACK_MEDIATOR_10006": "現在のポート範囲[%s, %s]は、VIP [UUID: %s]プロトコル: %sのシステムサービスポート範囲[%s, %s]と競合しています", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10008": "uuid:%s のゾーンが見つかりません", + "ORG_ZSTACK_MEDIATOR_10007": "現在のポート範囲 [%s, %s] は、VIP [UUID: %s] プロトコル: %s の使用済みポート範囲 [%s, %s] と競合しています", + "ORG_ZSTACK_COMPUTE_VM_10080": "vm[uuid:%s] CD-ROM デバイスIDの重複", + "ORG_ZSTACK_COMPUTE_VM_10077": "VM[uuid:%s] に ISO[uuid:%s] がアタッチされています", + "ORG_ZSTACK_COMPUTE_VM_10074": "予約メモリ[%s] が利用可能なメモリサイズ[%s] を超えています", + "ORG_ZSTACK_COMPUTE_VM_10073": "予期しない CPU とメモリの設定です。指定値がインスタンスタイプと要件と互換性があることを確認してください。", + "ORG_ZSTACK_COMPUTE_VM_10071": "vm[uuid=%s] のホストが見つかりません", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10000": "仮想ID[uuid:%s] には管理関連的属性が既に割り当てられているため、%s を割り当てることができません。", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10000": "IDゾーン [%s] は既に存在しています、uuid: %s", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10001": "regionId: [%s] は有効な Aliyun および ZStack リージョンではありません、別のものを選択してください", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10002": "タイプ [%s] は予期されるデータセンタータイプ [%s] と一致しません", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10003": "project[uuid:%s] には既に指定されたプロジェクト管理者がいます", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10003": "データセンター UUID またはリージョン ID のいずれかを設定する必要があります、パラメータを確認してください", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10004": "project[uuid:%s] は存在しません", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10004": "IDゾーン [%s] はまだ同期中ですから、お待ちください", + "ORG_ZSTACK_COMPUTE_VM_10079": "L3 ネットワーク [%s] 上に利用可能な IP 範囲がありません", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10005": "仮想ID [UUID:%s] には既にプロジェクトオペレータ属性が割り当てられています", + "ORG_ZSTACK_COMPUTE_VM_10078": "すべての VM[UUID:%s] CD-ROM に ISO イメージがマウントされています", + "ORG_ZSTACK_COMPUTE_VM_10090": "VM のホスト [UUID: %s] と割り当てられたプライマリストレージ [UUID: %s] が接続されていないため、ボリュームのインスタンス化に失敗しました", + "ORG_ZSTACK_COMPUTE_VM_10088": "VM の現在の状態 [%s]、virtio の変更には VM が状態 [%s] である必要があります", + "ORG_ZSTACK_COMPUTE_VM_10084": "ISO [UUID:%s] が見つかりません - ゾーン [UUID:%s] に関連付けられた接続されたバックアップストレージに存在しません。 以下を確認してください:", + "ORG_ZSTACK_COMPUTE_VM_10083": "1. バックアップストレージが VM [NAME: %s, UUID:%s] が実行されている正しいゾーンに接続されていることを確認します。", + "ORG_ZSTACK_COMPUTE_VM_10081": "2. バックアップストレージがアクティブ状態であることを確認します。アクティブでない場合は、再接続を試みてください。", + "ORG_ZSTACK_KVM_HYPERVISOR_10000": "指定されたプライマリストレージ %s はいずれも利用できません", + "ORG_ZSTACK_COMPUTE_VM_10099": "作成はイメージキャッシュ [uuid:%s, 所在地 ps uuids: [%s]] に依存しているため、他の場所には作成できません。", + "ORG_ZSTACK_COMPUTE_VM_10098": "ホスト仮想化情報の収集に失敗しました", + "ORG_ZSTACK_COMPUTE_VM_10097": "L3 ネットワークに切り替えることができません。L3 ネットワーク [uuid:%s] は、L2 ネットワーク [uuids:%s] に属していますが、いずれもクラスタに接続されていません。", + "ORG_ZSTACK_COMPUTE_VM_10096": "L3 ネットワークに切り替えることができません。指定された L3 ネットワーク [uuid:%s] は、異なる L2 ネットワーク [uuids:%s] に属しています。", + "ORG_ZSTACK_COMPUTE_VM_10094": "L3 ネットワークに切り替えることができません。指定された L3 ネットワーク [uuid:%s] には IP 範囲が設定されていません。", + "ORG_ZSTACK_COMPUTE_VM_10093": "L3 ネットワークに切り替えることができません。VM [uuid: %s] は実行中または停止状態ではありません。現在の状態は %s です", + "ORG_ZSTACK_COMPUTE_VM_10092": "VM [uuid:%s]は実行状態ではないため、スクリーンショットをキャプチャできません。", + "ORG_ZSTACK_MEDIATOR_10002": "レイヤー3ネットワークをアタッチできません。アタッチするL3ネットワーク[%s]のCIDRは、VMに既にアタッチされているL3ネットワーク[%s]のCIDRと重複しています。", + "ORG_ZSTACK_MEDIATOR_10003": "VM[name:%s, UUID:%s]には既にポートフォワードルール%sが設定されています。", + "ORG_ZSTACK_MEDIATOR_10004": "VM[name:%s, uuid:%s]には既にElastic IPアドレス%sがアタッチされています。", + "ORG_ZSTACK_COMPUTE_VM_10033": "デフォルトのL3 UUIDのサイズが1ではないため、VMをクローンできませんでした。", + "ORG_ZSTACK_COMPUTE_VM_10032": "状態[%s]が無効なため、VMをクローンできませんでした。", + "ORG_ZSTACK_COMPUTE_VM_10031": "ドライバーの種類[%s]が無効なため、VMをクローンできませんでした。", + "ORG_ZSTACK_COMPUTE_VM_10030": "NicType[%s]が無効なため、VMをクローンできませんでした。", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10002": "移行インストールパス[%s]のプライマリストレージ[%s]に関連するゴミパス(%s)が見つかりました。ボリューム[%s]を移行する場合は、まず'APICleanUpTrashOnPrimaryStorageMsg'を使用してそれらをクリーンアップしてください。", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10000": "ストレージ移行操作を実行するための接続されたホストが見つかりません。ターゲットホストがクラウド環境で利用可能な状態であり、適切に構成されていることを確認してください。", + "ORG_ZSTACK_COMPUTE_VM_10039": "この操作はユーザVMインスタンスでのみ許可されています。", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10003": "ボリューム[uuid:%s]はイメージ[uuid:%s]に依存しています。他の依存関係にはイメージ[%s]が含まれています。", + "ORG_ZSTACK_COMPUTE_VM_10038": "ネットワークインターフェース%sはVMにアタッチされていません。", + "ORG_ZSTACK_COMPUTE_VM_10037": "プライマリストレージ[UUID: %s]上のVM [UUID: %s]、ボリューム[UUID: %s]をクローンするための容量リソースが不足しています。必要な容量は%sバイトですが、現在の使用可能な容量は%sバイトです。", + "ORG_ZSTACK_COMPUTE_VM_10036": "高速VM作成は、元のVM [UUID: %s]と同じプライマリストレージ[UUID: %s]上のデータボリュームのクローンのみサポートします。", + "ORG_ZSTACK_COMPUTE_VM_10035": "高速VM作成は、元のVM [UUID: %s]と同じプライマリストレージ[UUID: %s]上のルートボリュームのクローンのみサポートします。", + "ORG_ZSTACK_COMPUTE_VM_10034": "この操作はユーザVMインスタンスでのみ許可されています。", + "ORG_ZSTACK_COMPUTE_CLUSTER_10005": "クラスタタイプがベアメタルの場合、ハイパーバイザータイプもベアメタルである必要があります。逆に、ハイパーバイザータイプがベアメタルの場合、クラスタタイプもベアメタルである必要があります。", + "ORG_ZSTACK_COMPUTE_CLUSTER_10008": "クラスタ[uuid:%s]にはプレメンテナンス状態のホストが存在するため、現時点ではOSを更新できません。", + "ORG_ZSTACK_COMPUTE_CLUSTER_10009": "クラスタ[uuid:%s]のすべてのホストがアクティブ状態ではないため、現時点ではクラスタOS権限を更新できません。", + "ORG_ZSTACK_COMPUTE_CLUSTER_10006": "現時点では、KVMベースの仮想マシンのOSのみを更新できます。", + "ORG_ZSTACK_COMPUTE_CLUSTER_10007": "ホスト[UUID: %s]はクラスタ[UUID: %s]のメンバーではありません。ホストのUUIDを確認し、このクラスタに属していることを確認してください。", + "ORG_ZSTACK_COMPUTE_VM_10044": "VMイメージが停止状態でない間は、VMイメージを変更しないでください。", + "ORG_ZSTACK_COMPUTE_VM_10043": "ユーザーにはVM %sのイメージを変更する権限がありません。", + "ORG_ZSTACK_COMPUTE_VM_10042": "VMタイプ[%s]ではクリ_trafficはサポートされていません。", + "ORG_ZSTACK_COMPUTE_VM_10041": "重複するMACアドレス[%s]", + "ORG_ZSTACK_COMPUTE_CLUSTER_10000": "クラスタ[uuid: %s]でヒュージページが無効になっている場合、メモリアクセスを共有にする必要はありません。最初にUpdateResourceConfig [category=%s name=%s value=%s resourceUuid=%s]を使用してヒュージページを有効にしてください。", + "ORG_ZSTACK_COMPUTE_VM_10040": "VM [%s]の状態が停止している場合にのみ、この操作は許可されます。", + "ORG_ZSTACK_COMPUTE_CLUSTER_10001": "クラスタ[uuid:%s]でメモリアクセスモードが共有に設定されている場合、ヒュージページを無効にする必要はありません。最初にUpdateResourceConfig [category=%s name=%s value=%s resourceUuid=%s]を使用してメモリアクセスモードを更新してください。", + "ORG_ZSTACK_COMPUTE_VM_10049": "UUID、クラウドアカウント、または認証トークンのいずれかを指定する必要があります。%s", + "ORG_ZSTACK_COMPUTE_VM_10048": "instance[uuid:%s]をimage[uuid:%s]に変更できません", + "ORG_ZSTACK_COMPUTE_VM_10047": "vm[uuid:%s]にはデフォルトのL3ネットワークがないため、イメージを変更できません。", + "ORG_ZSTACK_COMPUTE_VM_10046": "最後のホストVM [UUID:%s]が実行中であり接続されていることを確認してください", + "ORG_ZSTACK_COMPUTE_VM_10045": "プライマリストレージ仮想マシン[UUID:%s]が有効で接続されていることを確認してください。", + "ORG_ZSTACK_IAM2_CONTAINER_10009": "Kubernetes設定ファイルを開くのに失敗しました: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10007": "nullコンテンツのため、許可されたプロジェクトの取得に失敗しました", + "ORG_ZSTACK_COMPUTE_VM_10055": "'uuids'パラメータはVmInstanceVOまたはHostVOエンティティを参照する必要があります。", + "ORG_ZSTACK_IAM2_CONTAINER_10008": "パスにKubernetes設定が見つかりません: %s", + "ORG_ZSTACK_COMPUTE_VM_10054": "nic id: %sは仮想ネットワーク構成に存在しません...", + "ORG_ZSTACK_IAM2_CONTAINER_10005": "nullページ応答のため、イメージタグの取得に失敗しました。イメージタグAPIエンドポイントを確認し、適切に構成されていることを確認してください。", + "ORG_ZSTACK_COMPUTE_VM_10053": "ネットワークインターフェースカードは、QoS設定とポートミラーリングサービスを同時に適用することはできません。", + "ORG_ZSTACK_IAM2_CONTAINER_10006": "nullコンテンツのため、イメージの取得に失敗しました。%s", + "ORG_ZSTACK_COMPUTE_VM_10052": "アウトバウンド帯域幅とインバウンド帯域幅の少なくとも一方を指定する必要があります。", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10008": "関連するアクセスグループはすでに次の状態です: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10003": "プロジェクト[uuid: %s]のコンテナ化クラスタのセットアップに失敗しました", + "ORG_ZSTACK_COMPUTE_VM_10051": "モニター数は1、2、または4のいずれかである必要があります。", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10007": "NASファイルシステム[%s]にマウントターゲット[%s]は既に存在します", + "ORG_ZSTACK_IAM2_CONTAINER_10004": "nullコンテンツのため、イメージタグの取得に失敗しました。%s", + "ORG_ZSTACK_COMPUTE_VM_10050": "directionは(in, out)内で設定する必要がありますが、%sでした", + "ORG_ZSTACK_IAM2_CONTAINER_10001": "コンテナ%sのクォータ更新に失敗しました", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10009": "アクセスグループルール[%s]はアクセスグループ[%s]内に既に存在します", + "ORG_ZSTACK_IAM2_CONTAINER_10002": "プロジェクト[uuid: %s]のコンテナセットアップに失敗しました。プロジェクトがデータベースに見つからなかったため", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10003": "%dミリ秒後にマウントドメインが無効です削除します...", + "ORG_ZSTACK_IAM2_CONTAINER_10000": "予期せぬエラーにより、コンテナ側のプロジェクト[uuid: %s]のクォータ更新に失敗しました", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10006": "NASアクセスグループがありません。少なくとも1つ作成してください。", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10005": "NAS[%s]にマウントターゲット[%s]が存在しません", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10000": "リージョン%%sにファイルシステム[%%s]が見つかりません", + "ORG_ZSTACK_COMPUTE_VM_10059": "アカウントの設定が見つかりません。パスワード変更コマンドを仮想マシンホストに送信してください!", + "ORG_ZSTACK_COMPUTE_VM_10058": "データベースに宛先ホストが見つかりません。ホストへのパスワード変更コマンドを送信できません!", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10002": "いくつかのプライマリストorage[%%s]がこのNASに関連付けられています。削除する前にプライマリストレージを削除してください。", + "ORG_ZSTACK_COMPUTE_VM_10057": "UUID が %s のホストのみがデータボリュームにアクセスできます。", + "ORG_ZSTACK_COMPUTE_VM_10056": "resource[UUIDs:%s] は account[UUID:%s] によって管理されていません", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10001": "NAS ファイルシステムはデータセンターに既に存在します: %s", + "ORG_ZSTACK_COMPUTE_VM_10063": "指定されたパスワードは複雑さの要件を満たしていません。少なくとも1つの数字、1つの大文字、1つの小文字、および1つの特殊文字を含める必要があります。", + "ORG_ZSTACK_COMPUTE_VM_10062": "パスワードの長さは [%s-%s 文字] である必要があります", + "ORG_ZSTACK_COMPUTE_VM_10061": "このディスクは接続をサポートしていません。ディスクタイプは %s です", + "ORG_ZSTACK_COMPUTE_VM_10060": "ディスク AO パラメータが正しくありません。size、template UUID、disk offering UUID、または source UUID-source type のいずれかのプロパティを設定する必要があります。これらのプロパティのうち、1つだけが指定されている必要があります。", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10010": "アクセスグループ [%s] はデータセンター [%s] に既に存在します", + "ORG_ZSTACK_COMPUTE_VM_10068": "L3 ネットワーク [%s] で利用可能なネットワークインターフェースタイプがありません", + "ORG_ZSTACK_FAULTTOLERANCE_10015": "プライマリ仮想マシンが停止状態であるため、セカンダリ仮想マシンの作成できません。セカンダリ仮想マシンを作成する前にプライマリ仮想マシンを起動してください。", + "ORG_ZSTACK_COMPUTE_SRIOV_10014": "VM に L3 ネットワークを接続する際に SR-IOV と VFHA を同時に有効にすることはできません。いずれか一方のみが構成されていることを確認してください。", + "ORG_ZSTACK_COMPUTE_SRIOV_10015": "仮想ファンクションネットワークインターフェースを標準タイプに変更できません", + "ORG_ZSTACK_FAULTTOLERANCE_10013": "別のフォールトトレランスガベージコレクションティスクが現在実行されています。新しいタスクをキャンセルし、完了するまで待ってください。", + "ORG_ZSTACK_COMPUTE_SRIOV_10016": "ネットワークインターフェースを VF タイプに変更できません。ターゲットインスタンスが vf ネットワーキングをサポートしていることを確認してください。", + "ORG_ZSTACK_COMPUTE_SRIOV_10017": "UUID:%s の VM ネットワークインターフェースは存在しません", + "ORG_ZSTACK_FAULTTOLERANCE_10011": "フォールトトレラント仮想マシングループが見つかりません", + "ORG_ZSTACK_FAULTTOLERANCE_10010": "ft プライマリ VM[uuid:%s] を移行できません", + "ORG_ZSTACK_COMPUTE_SRIOV_10019": "SR-IOV のみサポートされています", + "ORG_ZSTACK_MONITORING_MEDIA_10001": "ホスト: %s、ポート: %d の SMTP サーバーへの接続に失敗しました。smtpServer および smtpPort 設定の正確性を確認してください。", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10038": "条件ボディは JSON null または配列値をサポートしていません!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10037": "'条件' フィールドでは ZStack テンプレート関数のみをサポートします!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10036": "'条件' フィールドの値はブール型である必要があります", + "ORG_ZSTACK_MONITORING_MEDIA_10000": "問題は、アクセスキー ID またはシークレットアクセスキーが正しくないか、指定されたユーザーの IAM 権限が不十分である可能性があります。クラウドコンピューティング環境で資格情報と必要な権限を持っていることを確認してください。", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10035": "条件キー: %s は値の JSON オブジェクトで1つの要素のみをサポートしていますが、%d 個の要素が提供されました!", + "ORG_ZSTACK_FAULTTOLERANCE_10019": "フェイルオーバーの実行に失敗しました。プライマリ VM が不明で、フォールトトレランスネットワークアドレスが利用できません。構成を確認してください。", + "ORG_ZSTACK_FAULTTOLERANCE_10018": "pvm[uuid:%s] は存在しません", + "ORG_ZSTACK_FAULTTOLERANCE_10017": "vm[uuid:%s] をフェイルオーバーできませんでした。関連するフォールトトレラント仮想マシングループが存在しません", + "ORG_ZSTACK_COMPUTE_SRIOV_10012": "vm nic [uuid:%s] はすでに %s タイプです。変更の必要はありません", + "ORG_ZSTACK_FAULTTOLERANCE_10016": "SVM の作成は成功しましたが、セカンダリ VM 起動リクエスト中にエラーが発生しました。SVM の構成を確認し、セカンダリ VM の起動の前提条件をすべて満たしていることを確認してください。", + "ORG_ZSTACK_COMPUTE_SRIOV_10013": "仮想マシンのネットワークインターフェースタイプは、停止している場合にのみ変更してください。", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10009": "2要素認証がmsgシステムタグにトークンがないため失敗しました。%s", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10008": "2要素認証がメッセージにシステムタグを含まないため失敗しました。", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10004": "アカウントで2要素認証が有効になっていません。続けるには有効にしてください。", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10001": "サポートされていないアカウントタイプ: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10026": "フォールトトレラントVMポートが見つかりません", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10011": "仮想リソース%sの2要素認証コードの検証に失敗しました。コードを確認して再度お試しください。", + "ORG_ZSTACK_DAHO_CORE_10003": "Daho VLLタスクの作成に失敗しました!すべてのソースファイルがクラウド環境に正しくアップロードされ、アクセス可能であることを確認してください。", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10010": "%s:%sにシークレットが定義されていないため、2要素認証に失敗しました", + "ORG_ZSTACK_FAULTTOLERANCE_10024": "プライマリ仮想マシンが停止状態のため、セカンダリ仮想マシンを起動できません。最初にプライマリ仮想マシンを起動してください。", + "ORG_ZSTACK_DAHO_CORE_10004": "accountUuid: %sのAlibaba Cloudアカウントが見つかりません", + "ORG_ZSTACK_FAULTTOLERANCE_10022": "現在のフォールトトレラントネットワークから利用可能なIPが見つかりません。グローバル設定[カテゴリ: フォールトトレラント, 名前: fault.tolerance.network.cidr]が正しく設定されていること、およびホスト[uuid:%s]が指定されたCIDR範囲内のIPアドレスを持っていることを確認してください。", + "ORG_ZSTACK_FAULTTOLERANCE_10021": "クラウドリソース管理中に予期しない例外が発生しました。入力パラメータが有効範囲内であることを確認してください。問題が解決しない場合は、クラウドコンピューティング環境の設定を確認するか、サポートに連絡してさらなる支援を受けてください。", + "ORG_ZSTACK_DAHO_CORE_10007": "expire policy: %sは有効な設定ではありません", + "ORG_ZSTACK_FAULTTOLERANCE_10020": "フェイルオーバーの実行に失敗しました。セカンダリVMが不明で、フォールトトレラントネットワークアドレスが利用できません。設定を確認してください。", + "ORG_ZSTACK_DAHO_CORE_10008": "vlanId[%s]は既に存在します!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10026": "CfnRootDecoderの重みは0-100の範囲である必要があり、0は優先デコードを示し、デフォルト値は50です。", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10025": "パラメータのルートボディはJSONオブジェクトである必要があります!", + "ORG_ZSTACK_COMPUTE_SRIOV_10020": "%sはSRIOVをサポートしていません", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10024": "パラメータにはTypeが必要ですが、%sに見つかりません", + "ORG_ZSTACK_COMPUTE_SRIOV_10021": "VMタイプ[%s]ではenableSRIOVタグはサポートされていません", + "ORG_ZSTACK_COMPUTE_SRIOV_10022": "VM[uuid:%s]をホスト[uuid:%s]に移行する前に仮想ネットワークインターフェイスの事前処理に失敗しました", + "ORG_ZSTACK_FAULTTOLERANCE_10028": "ホスト[uuid:%s]上のNIC[uuid:%s]に対して要求されたより小さいポート番号が割り当てられました", + "ORG_ZSTACK_COMPUTE_SRIOV_10023": "VM[uuid:%s]をホスト[uuid:%s]に移行した後、仮想ネットワークインターフェイスの後処理に失敗しました", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10029": "マッピング値のボディはJSON配列をサポートしていません!マッピング値がスカラーまたはクラウドコンピューティングプラットフォームでサポートされている複合型であることを確認してください。", + "ORG_ZSTACK_FAULTTOLERANCE_10027": "ホスト[uuid:%s]上のNIC[uuid:%s]のポート割り当てに失敗しました", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10028": "リソースの作成に必要なメッセージ%sが見つかりません", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10030": "マッピング値のボディはnull値をサポートしていません!すべてのマッピング値ボディが初期化されていることを確認してください。", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10031": "mappingNameはCloudFormation JSON結果に見出される必要ありません,否则将被视为无效。", + "ORG_ZSTACK_FAULTTOLERANCE_10037": "VM[uuid:%s]をフェイルオーバーできません。フォールトトレラントVMグループは次のステータスのいずれでもありません: [%s, %s]", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10005": "クラスタ[uuid:%s]にホストがないため、L2VirtualSwitchNetworkをアタッチできません", + "ORG_ZSTACK_FAULTTOLERANCE_10036": "VM[UUID:%s]のフェイルオーバーに失敗しました。フォールトトレラントVMグループであることを確認してください。", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10006": "インターフェース[%s]はホスト[uuid:%s]に作成する必要があるため、L2バーチャルスイッチネットワークをアタッチできませんでした", + "ORG_ZSTACK_FAULTTOLERANCE_10035": "VM[UUID:%s]のフェイルオーバーができません。GlobalConfigでフェイルオーバーが有効になっていることを確認してください。", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10007": "バーチャルスイッチ[uuid:%s]上にレイヤー3ネットワークを作成できませんでした", + "ORG_ZSTACK_FAULTTOLERANCE_10034": "L3ネットワーク[uuid:%s]を削除できませんでした。フォールトトレラントVM [%s]は引き続き [%s, %s]の状態です。L3ネットワークを削除する前に、関連するフォールトトレラントVMを停止してください。", + "ORG_ZSTACK_FAULTTOLERANCE_10033": "イメージ[uuid:%s]はフォールトトレラントVM[uuid:%s]によって引き続き使用されています", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10004": "操作を実行するために接続されたKVMホストが見つかりません。共有ブロックグループストレージ[uuid:%s]にアタッチされたすべてのホストが切断されているようです。", + "ORG_ZSTACK_FAULTTOLERANCE_10032": "pvm[uuid:%s]とsvm[uuid:%s]のインデックス:%dのボリュームが異なるサイズのキャッシュボリュームを持っています。起動は許可されていません", + "ORG_ZSTACK_FAULTTOLERANCE_10031": "pvm[uuid:%s]とsvm[uuid:%s]のインデックス:%dのボリュームのサイズが異なります。起動は許可されていません", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10003": "L2バーチャルスイッチネットワーク[uuid:%s]には既に同じvlanId[%s]のL2PortGroupNetworkが含まれているため、L2PortGroupNetworkを作成できませんでした", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10002": "ボリューム[uuid:%s]がアタッチされているKVMホストは、共有ブロックストレージグループ[uuid:%s]への接続が失われました", + "ORG_ZSTACK_FAULTTOLERANCE_10030": "pvm[uuid:%s]とsvm[uuid:%s]のボリューム番号が一致しません。起動は許可されていません", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10004": "クラスター[uuid:%s]のインターフェース[%s]は既に別のL2バーチャルスイッチネットワークで使用されているため、L2バーチャルスイッチネットワークをアタッチできませんでした", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10001": "共有ブロックグループプライマリストレージで操作するボリュームが見つかりません。%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10002": "VYOS DHCPサービスに仮想ルーターが構成されていません。%s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10006": "共有ボリュームはシンプロビジョニングをサポートしていません", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10001": "仮想ルーターVM[UUID:%s IP:%s]にDHCPエントリを追加できません。%sの理由により、DHCPエントリ[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10039": "現在の操作[API:%s]は、FT VM[UUID:%s, state:%s]が停止状態でない場合はサポートされていません", + "ORG_ZSTACK_FAULTTOLERANCE_10038": "ホストを維持できません。FT VM [%s]は回復中のためです", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10011": "vm[uuid:%s]は実行中、一時停止中、または停止状態ではありません。現在の状態[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10048": "ft vm[uuid:%s]のプラットフォームを更新できません。両方のvmを停止し、停止状態であることを確認してから続行してください", + "ORG_ZSTACK_FAULTTOLERANCE_10047": "両方のvmを停止する必要があるため、ft vm[uuid:%s]のメモリサイズを更新できません", + "ORG_ZSTACK_FAULTTOLERANCE_10046": "ft vm[uuid:%s]のCPU数を更新できません。両方のvmを停止して再起動する必要があります", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10005": "L2ネットワークは、クラスターに既に接続されているプロビジョンネットワークと同じインターフェース名を持つことはできません", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10004": "BareMetal2クラスターにホストを追加しないでください", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10015": "UUID [uuid: %s]と名前 [name: %s]のイメージは、どのバックアップストレージにも見つかりません", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10003": "新しいBareMetal2クラスターを作成する場合、アーキテクチャを指定する必要があります", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10014": "イメージ [UUID: %s, name: %s]は、どのバックアップストレージでもダウンロードできません:", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10002": "クラスタータイプとハイパーバイザータイプは、両方ともBaremetalに設定するか、いずれも設定しない必要があります", + "ORG_ZSTACK_FAULTTOLERANCE_10042": "VMレベルを%sに設定できません。GlobalConfigでフェイルオーバーが有効になっていることを確認してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10013": "共有ボリューム[uuid: %s]の共有ブロックでのオンラインマージ スナップショットはサポートされていません", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10001": "ベアメタルクラスターにローカルストレージを接続できません。クラスターがローカルストレージ接続をサポートしていることを確認してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10012": "ボリューム[UUID: %s]は状態%sのVM[UUID: %s]に接続されているため、スナップショットマージを実行できません。", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10000": "トークン付きのサードパーティCephをaarch64クラスターに接続できません。Cephバージョンがクラスターアーキテクチャと互換性があることを確認してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10017": "ホスト[uuid:%s]は共有ブロックストレージに関連付けられているディスクUUIDを持っていますが、実際のストレージが異なります。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10016": "クラスター[uuid:%s]に接続されているホストが見つかりません", + "ORG_ZSTACK_FAULTTOLERANCE_10049": "フォールトトレラントグループ仮想マジン[uuid:%s]では現在の操作はサポートされていません", + "ORG_ZSTACK_BAREMETAL_NETWORK_10004": "MACアドレス%sはボンドスレーブインターフェースとしてすでに使用されています", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10000": "仮想ルーター[uuid:%s, ip:%s]が提供するDHCPエントリをプログラムできません。%s", + "ORG_ZSTACK_BAREMETAL_NETWORK_10003": "MACアドレス%sはUUID%sのシャーシに属していません", + "ORG_ZSTACK_BAREMETAL_NETWORK_10002": "スレーブアドレス%sが無効です。MACアドレスをカンマ区切りで指定してください(例:6c:b3:11:1b:0b:1e,6c:b3:11:1b:0b:1f)。", + "ORG_ZSTACK_BAREMETAL_NETWORK_10001": "仮想ネットワーク設定内でボンド名%sはすでに存在します", + "ORG_ZSTACK_BAREMETAL_NETWORK_10000": "BMインスタンスの作成前にのみBMボンディングの作成が許可されます。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10022": "バックアップストレージ[uuid:%s]が見つかりません", + "ORG_ZSTACK_FAULTTOLERANCE_10058": "同じMACアドレス[%s]は許可されていません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10021": "ステータスは%sであるべきで、現在の状態は%sです", + "ORG_ZSTACK_FAULTTOLERANCE_10057": "Ftネットワークが構成されていません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10020": "シン volumeからシックvolumeへの変換の操作は現時点ではサポートされていません。利用可能なvolume変換オプションについては、最新のドキュメントを参照してください。", + "ORG_ZSTACK_FAULTTOLERANCE_10056": "フェールオーバー仮想マージャンの作成に失敗しました。GlobalConfigでフェールオーバーテchnologyを有効にしてください", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10001": "VM NIC IP:%sにEIPゲストIP:%sが見つかりません", + "ORG_ZSTACK_FAULTTOLERANCE_10055": "FTセカンダリ仮想マージンインスタンスを移行できません", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10002": "EIP[uuid:%s]は削除されています", + "ORG_ZSTACK_FAULTTOLERANCE_10054": "FTプライマリVMインスタンスを移行できません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10025": "QEMU2共有ボリューム[uuid:%s]はサポートされていません", + "ORG_ZSTACK_FAULTTOLERANCE_10053": "セカンダリ仮想マージン[uuid:%s]では現在の操作はサポートされていません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10024": "VM[uuid:%s]には異なるプライマリストレージからの複数のISOがあります:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10029": "この操作は完全な仮想マージンインスタンスのみをサポートしています。完全なインスタンス仕様を使用していることを確認してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10027": "共有ブロックグループプライマリストレージ[uuid: %s]上のボリューム[uuid: %s]のスナップショットを取得するために利用可能なホストが見つかりません。", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10005": "Elastic IP UUIDまたはVirtual IP UUIDのいずれかを指定する必要があります", + "ORG_ZSTACK_FAULTTOLERANCE_10051": "ファイル転送セカンダリ仮想マージン [uuid:%s]では現在の操作はサポートされていません", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10006": "uuid:%s の EIP は有効な状態ではないため、VM NIC への接続は不可能です", + "ORG_ZSTACK_FAULTTOLERANCE_10050": "現在の操作はフォールトトレラントなプライマリ VM [uuid:%s] ではサポートされていません", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10003": "L3 ネットワーク [uuid:%s, name:%s] を VM [uuid:%s, name:%s] に接続できません。L3 ネットワークは VM の NIC の 1 つに Elastic IP (EIP) を提供しているためです。", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10004": "vmNic [UUID:%s] は vmInstance に接続されていないため、接続可能な EIP を取得できません。", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10009": "uuid: %s の EIP は状態が %s の場合のみ接続可能ですが、現在のステータスは %s です", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10007": "IP [uuid:%s] は VM NIC [%s] に関連付けられています", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10008": "UUID: %s の EIP はすでに UUID: %s の別の VM NIC に接続されており、再接続することはできません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10033": "操作を実行するために接続された KVM ホストが見つかりません。共有ブロックストレージ [uuid:%s] に接続されているすべてのホストが切断されているようです。", + "ORG_ZSTACK_FAULTTOLERANCE_10069": "クラスタ [uuid:%s] は指定されていますが、無効化されています。したがって、VM はそこから作成できません。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10032": "UUID: %s のプライマリストレージと UUID: %s のプライマリストレージの両方に接続されているホストが見つかりません", + "ORG_ZSTACK_FAULTTOLERANCE_10068": "ゾーン [uuid:%s] は指定されていますが、無効化されています。したがって、VM はそこから作成できません。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10031": "共有ブロックグループプライマリストレージ [uuid: %s] と [uuid: %s] 上のボリューム [uuid: %s] を移行するための利用可能なホストが見つかりません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10030": "共有ブロックグループプライマリストレージ [uuid: %s] と [uuid: %s] の間でボリューム [uuid: %s] を移行するための利用可能なホストが見つかりません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10037": "仮想マシン %s が実行中または停止状態ではないため、スナップショット %s を縮小できません", + "ORG_ZSTACK_FAULTTOLERANCE_10065": "同じ UUID を l3Network に追加することはできません。UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10035": "ボリューム %s が準備されていないため、スナップショット %s を縮小できません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10038": "仮想マシン %s のスナップショットでインストールパスが null です", + "ORG_ZSTACK_ALIYUN_BACKUP_10000": "バックアップ操作用のストレージバケットが見つかりません。有効なバケットが構成されていることを確認してください。%s", + "ORG_ZSTACK_FAULTTOLERANCE_10062": "イメージ [uuid:%s] の形式は %s です。VM を作成できるのは有効な形式のみです", + "ORG_ZSTACK_FAULTTOLERANCE_10061": "イメージ [uuid:%s] のメディアタイプは %s です。VM を作成できるのはルートボリュームテンプレートのみです。", + "ORG_ZSTACK_TICKET_IAM2_API_10004": "1 つの予約ポリシーは 1 つのフローコレクションのみに関連付けることができます。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10044": "ボリューム [uuid:%s] のプライマリストレージ [uuid:%s] 上でスナップショットをプルするための接続されたホストが見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10020": "vip [uuid:%s] は予期される状態 [%s] にありません。現在の状態は %s です", + "ORG_ZSTACK_SNS_PLATFORM_MICROSOFTTEAMS_10000": "Microsoft Teams へのメッセージ送信に失敗しました。ステータス: %s、本文: %s", + "ORG_ZSTACK_TICKET_IAM2_API_10003": "クラウドコンピューティング環境でフローを作成するには名前が必要です。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10043": "ボリューム [uuid:%s] のプライマリストレージ [uuid:%s] 上でスナップショットをコミットするための接続されたホストが見つかりません", + "ORG_ZSTACK_FAULTTOLERANCE_10079": "VM [uuid:%s] を起動できません。ネットワークインターフェースカード (NIC) が接続されていません。NIC を接続してから再試行してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10042": "アクティブなインストールパス %s は失敗しました。理由: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10041": "子のアクティブスナップショットが失敗しました。理由: %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10023": "vmNic UUID [%s] は、許可された CIDR を持つポート転送ルールがすでに存在するため、EIP を追加することができません。", + "ORG_ZSTACK_FAULTTOLERANCE_10077": "現在のフォールトolerant仮想マシンは不明な状態であり、停止できません。手動フェイルオーバーを実行してください。", + "ORG_ZSTACK_TICKET_IAM2_API_10008": "リソースの名前はnullにできません。有効なリソース名を入力してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10048": "無効なシンプロビジョニング初期化サイズタグ[%s]", + "ORG_ZSTACK_TICKET_IAM2_API_10007": "無効な承認者タイトル %s、有効な値は %s です", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10021": "VM NICのゲストL3ネットワーク[uuid:%s]とVIPのVIP L3ネットワーク[uuid:%s]は同一のネットワークです", + "ORG_ZSTACK_TICKET_IAM2_API_10006": "フローコレクションを作成するには、少なくとも1つのフローが必要です。", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10022": "VMの状態[%s]はEIP操作を実行できません。VMプロセスが完了するまでお待ちください。", + "ORG_ZSTACK_TICKET_IAM2_API_10005": "最後のワークフローの承認者として管理者またはIAMロールの操作が必要です。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10045": "インストールパスの非アクティブ化に失敗しました: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10049": "無効なシンプロビジョニング初期化サイズ[%s]、%s以上に設定する必要があります", + "ORG_ZSTACK_FAULTTOLERANCE_10073": "defaultL3NetworkUuid[uuid:%s]はl3NetworkUuids[%s]に見つかりません", + "ORG_ZSTACK_FAULTTOLERANCE_10071": "ホスト[uuid:%s]が指定されていますが、接続ステータスが%sのため、VMを作成できません", + "ORG_ZSTACK_FAULTTOLERANCE_10070": "ホスト[uuid:%s]が指定されていますが、無効になっているため、VMを作成できません。", + "ORG_ZSTACK_TICKET_IAM2_API_10009": "承認者のUUIDはnullにできません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10051": "無効なthinProvisioningInitializeSize[%s]は最大制限%dを超えています", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10050": "無効なthinProvisioningInitializeSize[%s]、有効なサイズ値ではありません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10055": "UUID [uuid: %s]のホストは、UUID [uuid: %s]の共有ブロックグループプライマリストレージ上でUUID [uuid: %s]のボリュームをリサイズできません。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10054": "共有ブロックグループプライマリストレージ[uuid:%s]のコマンドを実行するための接続された共有ブロックストレージを持つホストが見つかりません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10053": "共有ブロックグループプライマリストレージ[uuid:%s]のコマンドを実行するための利用可能なホストが見つかりません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10052": "値[%s]は2の累乗ではありません", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10012": "IPアドレス[uuid:%s]はネットワークインターフェース[uuid:%s]に属していません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10059": "共有ブロックグループプライマリストレージ[uuid: %s]に接続されたクラスターが見つかりません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10058": "共有マウントポイントプライマリストレージ[uuid:%s, name:%s]は、ボリュームをインスタンス化するための接続されたクラスター内で利用可能なホストを見つけることができません", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10013": "eip[uuid:%s]はどの仮想マシンのネットワークインターフェースにも接続されていません", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10010": "VMのネットワークインターフェースには、UUID %sのEIPと互換性のある使用済みIPがありません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10057": "ストレージプールにボリューム[uuid:%s]が見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10011": "VM NICのゲストL3ネットワークとEIPのVIP L3ネットワークは同一のネットワークです[uuid:%s]と[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10056": "プライマリストレージ[uuid:%s]が見つかりません", + "ORG_ZSTACK_TICKET_IAM2_API_10011": "仮想ID [UUID]はプロジェクト [UUID]に属していません", + "ORG_ZSTACK_TICKET_IAM2_API_10010": "IAM-to-VirtualIDマッピング[uuid:%s]が見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10017": "EIPに関連するVM [UUID:%s]は、VIP [UUID:%s, Name:%s, IP:%s]の発信元であるパブリックネットワーク [UUID:%s]に既に接続されています。", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10014": "VIP IPバージョン [%d]はゲストIPバージョン [%d]と異なります。", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10015": "VIP[%s]はゲストIP範囲 [%s - %s]内にあります", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10062": "SharedBlockプライマリストレージ [uuid:%s, name:%s]はコンピュートクラスタに接続されていないか、接続されたクラスタに接続されたホストがありません。", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10018": "VIP [UUID:%s]は別のネットワークサービスエンティティ [%s]によって使用されています。", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10019": "システムVIPにはEIPを作成できません。EIPの関連付けにはパブリックIPアドレスを使用していることを確認してください。", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10047": "イメージハッシュの取得に失敗しました。理由:%s", + "ORG_ZSTACK_SNS_PLATFORM_FEISHU_10000": "FeiShuへのメッセージ送信に失敗しました。ステータス: %s, 本文: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10042": "イメージストアバックアップストレージエージェントのUUIDが変更されました [期待値: %s, 実際値: %s]。これはエージェントが手動で再起動されたことが原因と思われます。ステータスを同期するには再接続を実行してください。", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10000": "Zakuクラスタ情報の取得に失敗しました。エラー: %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10002": "Zakuクラスタの取得に失敗しました[id:%s]。エラー: %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10001": "Zakuクラスタ情報の取得に失敗しました。レスポンスコンテンツがnullです。リクエストパラメータとネットワーク接続を確認してください。", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10000": "プロジェクト %sのセキュリティグループのクォータが見つかりません", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10004": "APIレスポンスからアクションIDの抽出に失敗しました", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10003": "Zakuクラスタの取得に失敗しました[id:%s]。レスポンスコンテンツがnullです", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10006": "クラウドレスポンスの解析に失敗しました: %s", + "ORG_ZSTACK_SNS_10015": "platformUuidとendpointUuidは同時に指定できません。入力パラメータを確認してください。", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10001": "セキュリティグループのクォータは1未満にはできません。設定を少なくとも1以上に調整してください。", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10005": "非同期操作が %d 秒後にタイムアウトしました", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10004": "ラベル内のl3Uuidとパラメータ内のl3Uuidが一致しません", + "ORG_ZSTACK_SNS_10013": "パスワードはnullにできません", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10003": "システムタグが要求されました。強制セキュリティグループが有効になっているため、システムタグ L3_NETWORK_SECURITY_GROUP_UUIDS_REFをフォーマット l3::{%s}::SecurityGroupUuids::{%s}で設定して、VM NICのデフォルトセキュリティグループを指定する必要があります", + "ORG_ZSTACK_SNS_10012": "ユーザー名はnullにできません", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10006": "強制セキュリティグループが有効になっているため、タグ内のsecurityGroupUuidはプロジェクト[%s]内に存在する必要があります。", + "ORG_ZSTACK_SNS_10011": "smtpPortはnullにできません", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10005": "セキュリティグループ [UUID: %s]の所有者 [UUID: %s]は別のIAM2プロジェクトに属しています。", + "ORG_ZSTACK_SNS_10010": "smtpServerはnullにできません", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10008": "強制セキュリティグループ機能が有効な場合、デフォルトセキュリティグループ %sを削除できません。", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10007": "l3Network [uuid:%s]に接続されたNICはセキュリティグループに関連付けられています。l3Networkをセキュリティグループから切り離す前に、NICを切り離す必要があります。", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10039": "クラウド環境でImageStoreサービスを利用するには、商用ライセンスが必要です。", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10009": "このセキュリティグループ %s は仮想マシンに関連付けられています。続行前に解除してください。", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10035": "イメージストア [%s] はバックアップリモートに使用されているため、イメージを追加できません", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10032": "バックアップストレージ[UUID:%s] には、仮想マシンイメージをエクスポートするための十分な容量[%s]がありません", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10002": "仮想ルーター[name: %s, uuid: %s] の snat%s 同期が失敗しました。原因是 %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10031": "イメージ[%s] はバックアップストレージ[%s] に見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10001": "ゲスト l3Network[uuid:%s, name:%s] は仮想ルーターからの SNAT サービスを必要としますが、仮想ルーターオファリング[uuid: %s, name:%s] に関連するパブリック l3Network[uuid:%s] はゲスト l3Network と同じです。", + "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10020": "notifySugonSdn: 送信先ホスト[uuid:%s] 上の VM [uuid:%s] の vrouter について Sugon SDN への通知に失敗しました。エラー:%s", + "ORG_ZSTACK_SNS_10029": "クラウドリソース識別子 [%s] はすでに存在します", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10011": "アカウント[%s] はデフォルトセキュリティグループでの操作が許可されていません", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10010": "アカウント[%s] はデフォルトセキュリティグループ[%s] で操作を実行できません", + "ORG_ZSTACK_SNS_10026": "メールアドレス %s には更新できません。エンドポイント [UUID:%s] にすでに存在するため", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10012": "VM のネットワークインターフェース [UUID: %s] は1つのセキュリティグループにのみ属せるため、現在のセキュリティグループ [UUID: %s] から削除することはできません。", + "ORG_ZSTACK_SNS_10024": "同じメールアドレスをエンドポイント[uuid:%s] に追加することはできません", + "ORG_ZSTACK_SNS_10023": "プラグイン[%s] が見つかりません", + "ORG_ZSTACK_SNS_10022": "同じアドレス[%s:%s] で SNMP プラットフォームを作成できません", + "ORG_ZSTACK_SNS_10021": "すべてのパラメータが null のため接続を確立できません。すべてのパラメータが正しく構成されていることを確認してください。", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10029": "リモートターゲットタイプが実装されていません: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10028": "エクスポートされたイメージのパッケージ化に失敗しました。原因是 %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10027": "一部のイメージ [%s] はバックアップストレージ [uuid: %s] にエクスポートされませんでした", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10026": "イメージパッケージの削除に失敗しました。原因是 %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10022": "イメージストア[uuid:%s] に最大容量を設定できませんでした", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10021": "イメージストア[uuid:%s] に最大容量を設定できませんでした。原因是 %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10019": "notifySugonSdn: 送信先ホスト [uuid:%s] 上の VM [uuid:%s] の vrouter について Sugon SDN への通知に失敗しました", + "ORG_ZSTACK_SNS_10038": "受信者のメールアドレスを指定せずに SNS メールエンドポイントを作成することはできません", + "ORG_ZSTACK_SNS_10037": "ユーザー名とパスワードは両方とも存在しないか、 함께 提供する必要があります", + "ORG_ZSTACK_SNS_10036": "電話番号[%s] が無効です。+86-12388889999 形式で入力してください", + "ORG_ZSTACK_SNS_10035": "[%s] は有効な IP アドレスではありません", + "ORG_ZSTACK_SNS_10034": "クラウドストレージパス[%s] が無効です", + "ORG_ZSTACK_SNS_10031": "電話番号 [%s] は存在しません", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10018": "クラウドインスタンスまたは仮想マシンからの応答がありません。インスタンスのステータスとネットワーク構成を確認してください。", + "ORG_ZSTACK_SNS_10030": "仮想マシンの電話番号リストが空です。必要な電話番号がプロビジョニングされていることを確認してください。", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10016": "UUID: %sのバックアップストレージからイメージを取得できませんでした。理由: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10015": "イメージのダウンロードに必要な証明書ファイルがありません: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10013": "SimpleHttpBackupStorage[url:%s]に接続できません。理由: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10010": "タスク応答の受信に失敗しました。インスタンス構成とネットワーク設定を確認してください。", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_10000": "作成はイメージキャッシュ[uuid:%s, location URLs: [%s]]に依存しています。他の場所から作成することはできません。", + "ORG_ZSTACK_SNS_10045": "システムレベルの仮想マシンプラットフォームではこの操作は許可されていません。ユーザースペースのリソースを修正していることを確認してください。", + "ORG_ZSTACK_SNS_10044": "電話番号を指定せずにユニバーサルSMSを検証することはできません。", + "ORG_ZSTACK_SNS_10043": "userId [%s]はクラウド環境に既に存在します", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10008": "プライマリストレージ %s上のイメージメタデータのクリーンアップに失敗しました。エラー: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10007": "ソースファイルが見つからないため、同期状態に失敗しました。必要なファイルがすべて存在することを確認し、再試行してください。", + "ORG_ZSTACK_SNS_10041": "クラウド電話番号[%s]は既に存在します", + "ORG_ZSTACK_SNS_10040": "無効なメールアドレス[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10005": "プライマリストレージ [uuid: %s]が接続されているクラスタに接続されたホストが見つかりません", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10004": "エラーのため、UUIDで指定されたバックアップストレージをコミットできません: %s", + "ORG_ZSTACK_MONITORING_10004": "リソース[uuid:%s]のタイプが見つかりません", + "ORG_ZSTACK_MONITORING_10005": "resourceType[%s]とitem[%s]のモニタリングメトリックが見つかりません", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10002": "リソースの制約または無効なUUIDのため、UUIDで指定されたバックアップストレージを割り当てできません: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10000": "作成時刻の解析エラー: %s", + "ORG_ZSTACK_MONITORING_10000": "モニタートリガー[uuid:%s]が見つかりません。削除または無効になっている可能性があります", + "ORG_ZSTACK_MONITORING_10001": "モニタートリガーアクション[uuid:%s]が見つかりません。削除または取り消しされている可能性があります", + "ORG_ZSTACK_MONITORING_10002": "リソース[type:%s]にはモニタリングメトリックがありません", + "ORG_ZSTACK_MONITORING_10003": "UUID [%s]のリソースは、UUID [%s]のアカウントに属していません。", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10002": "インスタンス[%s]はいかなるグループにも関連付けられていません", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10001": "インスタンス[%s]は既にグループに割り当てられています", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10003": "モニタリンググループ [%s]はモニタリングテンプレートに関連付けられていません。", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10006": "グループのインスタンス制限に達しました。既存のインスタンスを終了するか、制限を増やすためにサポートに連絡してください。", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10001": "出力ボディはJSONのnull値をサポートしていません!すべてのフィールドが適切に定義され、nullでないことを確認してください。", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10005": "テンプレートルールは%dエントリの最大制限に達しています。テンプレートのスケーリングを検討するか、サポートに連絡して assistance.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10000": "出力にはクラウドネイティブサービスのみが許可されていますが、%sが見つかりました", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10016": "Resource Typeは文字列である必要があります!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10014": "MappingsのルートボディはJSONオブジェクトである必要があります!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10018": "ResourceのルートメタデータはJSONオブジェクトである必要があります!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10023": "Parametersボディはnull値をサポートできません!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10022": "パラメータ名はサポートされていません: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10020": "paramNameはCloudFormation JSONテンプレート結果に見つかるか、無効と見なされます。", + "ORG_ZSTACK_ZQL_AST_VISITORS_10001": "entityが空です。TableNameを特定できません", + "ORG_ZSTACK_FAULTTOLERANCE_10004": "ホストでのポート割り当てに失敗しました[uuid: %s]", + "ORG_ZSTACK_ZQL_AST_VISITORS_10000": "クエリ内のテーブル%sにJoin条件がありません。正しく指定されていることを確認してください。", + "ORG_ZSTACK_ZQL_AST_VISITORS_10003": "フィールドリストが空です。そのため、列名を取得できません。フィールドリストに必要なデータが含まれていることを確認してください。", + "ORG_ZSTACK_ZQL_AST_VISITORS_10002": "entityが空です。columnNameを取得できません", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10005": "Mappingボディはマップ以外の値をサポートしません!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10004": "CloudFormation Outputsにおいて[%s]は無効です!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10003": "Outputs内のDescriptionは文字列タイプである必要があります!", + "ORG_ZSTACK_FAULTTOLERANCE_10009": "ftセカンダリVMをマイグレーションできません[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10008": "プライマリ仮想マシンが停止状態のため、セカンダリ仮想マシンを開始できません。セカンダリVMを開始する前に、プライマリVMが実行中であることを確認してください。", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10009": "Resourceのvalueボディはnull値をサポートできません!デプロイ前にすべてのリソースパラメータが適切に初期化されていることを確認してください。", + "ORG_ZSTACK_ZQL_AST_VISITORS_10004": "指定された関数はnullにできません。使用前に適切に関数が初期化されていることを確認してください。", + "ORG_ZSTACK_FAULTTOLERANCE_10007": "プライマリVMのUUIDを取得できませんでした[uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10008": "Resource %sは自身に依存できません。Resource [%s]内の自己参照を確認してください", + "ORG_ZSTACK_FAULTTOLERANCE_10005": "ホストでの割り当てられたポート数が要求を下回っています[uuid: %s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10006": "Mappingボディはnull値をサポートできません!すべてのJSONフィールドが適切に定義され、nullでないことを確認してください。", + "ORG_ZSTACK_SNS_10009": "UUID [%s]はクラウド環境にすでに存在しています。", + "ORG_ZSTACK_SNS_10007": "UUID: %sのSNS Application Endpointが見つかりません。削除された可能性があります", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10012": "リソースマッピング[%s]内でサポートされていないキー[%s]です", + "ORG_ZSTACK_SNS_10006": "SNSApplicationPlatform[uuid:%s]が見つかりません。終了した可能性があります", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10011": "resourceNameはテンプレート出力に見つかるか、無効なCloudFormation JSONです。", + "ORG_ZSTACK_SNS_10005": "指定されたエンドポイントタイプ%sが見つかりません。有効なエンドポイントタイプが提供されていることを確認してください。", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10010": "サポートされていないリソースキー: %s", + "ORG_ZSTACK_SNS_10003": "UUID:%sのSNS Topicが見つかりません。削除された可能性があります", + "ORG_ZSTACK_SNS_10002": "アプリケーションエンドポイントが無効です。構成設定を確認するか、サポートにお問い合わせください。", + "ORG_ZSTACK_SNS_10001": "アプリケーションプラットフォームが無効です。管理者把它を有効にするか、利用可能な代替手段についてはドキュメントを確認してください。", + "ORG_ZSTACK_SNS_10000": "トピック %s は、サブスクライブされているエンドポイントによって消費されていません。", + "ORG_ZSTACK_CLOUDFORMATION_10002": "無効な ZStack テンプレート形式バージョン: [%s、期待されるバージョンは %s です]", + "ORG_ZSTACK_CLOUDFORMATION_10001": "テンプレートには ZStackTemplateFormatVersion マーカーが含まれている必要があります。", + "ORG_ZSTACK_CLOUDFORMATION_10000": "テンプレートコンテンツで null 要素が取得されました テンプレートコンテンツはクラウドリソースまたは仮想マシンの構成を参照している可能性があります。要素がすべて適切に定義および初期化されていることを確認してください。", + "ORG_ZSTACK_CLOUDFORMATION_10009": "テンプレート [%s] は仮想化環境で無効です", + "ORG_ZSTACK_CLOUDFORMATION_10008": "ResourceStackVO [%s] はすでに削除されています!", + "ORG_ZSTACK_CLOUDFORMATION_10007": "ResourceStackVO: [%s] は終了しています...", + "ORG_ZSTACK_CLOUDFORMATION_10005": "VM インスタンス [%s] のスタック UUID が見つかりません", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10035": "候補ホストすべてのホスト容量を確保できませんでした。ターゲットホストの可用性と、予約要件を満たす十分なリソースがあることを確認してください。", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10034": "[ホスト割り当て]: %s on host[uuid:%s]。次のホストへの割り当てを試みます。%s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10037": "フィルタリング後、HostAllocatorFilterExtensionPoint[%s] はゼロの候補ホストを返し、次のことを示しています: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10036": "指定された基準に一致するホストが見つかりません", + "ORG_ZSTACK_CLOUDFORMATION_10025": "%s ステータスを期待しています!", + "ORG_ZSTACK_EXPON_10002": "指数関数的リクエストが失敗しました。コード %s、メッセージ: %s。", + "ORG_ZSTACK_EXPON_10003": "スナップショットのコピー後にボリューム [name:%s] が見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10000": "バーチャルルーター[name: %s, uuid: %s] は DNS%s の構成に失敗しました: %s", + "ORG_ZSTACK_CLOUDFORMATION_10022": "再起動リソーススタックは %s ステータスのみサポートします!", + "ORG_ZSTACK_CLOUDFORMATION_10021": "uuid [%s] のリソーススタックが見つかりません", + "ORG_ZSTACK_CLOUDFORMATION_10020": "仮想マシン [%s] でデフォルト IP アドレスが見つかりません", + "ORG_ZSTACK_CLOUDFORMATION_10028": "templateContent と url は両方とも空にすることも両方とも設定することもできません!", + "ORG_ZSTACK_CLOUDFORMATION_10026": "templateContent と templateUuid は両方とも空にすることはできません!", + "ORG_ZSTACK_HYBRID_ACCOUNT_10000": "keyType はサポートされていないタイプ [%s] です", + "ORG_ZSTACK_HYBRID_ACCOUNT_10002": "タイプ: %s のキー: [%s] はアカウント UUID: [%s] にすでに存在します", + "ORG_ZSTACK_HYBRID_ACCOUNT_10003": "パラメータ [accountUuid] は管理ユーザーのみが使用できます!", + "ORG_ZSTACK_HYBRID_ACCOUNT_10004": "キー: [%s] はアカウント UUID: [%s] にすでに存在します", + "ORG_ZSTACK_CLOUDFORMATION_10014": "テンプレートコンテンツまたは URL によってコンテンツが設定されている必要があります!", + "ORG_ZSTACK_CLOUDFORMATION_10013": "システムテンプレートを削除または更新できません: %s", + "ORG_ZSTACK_CLOUDFORMATION_10012": "StackTemplateVO はクラウドテンプレートリポジトリから削除されています。テンプレートを確認して再アップロードしてください。", + "ORG_ZSTACK_CLOUDFORMATION_10011": "%s(タイプ:%s)のパラメータが見つかりません。パラメータを確認してください", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10002": "ハードウェアVXLANプールをアタッチできませんでした:%s", + "ORG_ZSTACK_CLOUDFORMATION_10010": "templateContentを指定する必要があります!", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10003": "VLAN IDが指定されていないため、L2ハードウェアVXLANネットワークを作成できません", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10000": "host[uuid:%s]に仮想インターフェース[name:%s]がないため、レベル2ネットワークをクラスタにアタッチできません", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10001": "host[uuid:%s]のスイッチポートが見つからないため、ハードウェアVXLANプールをアタッチできません", + "ORG_ZSTACK_CLOUDFORMATION_10019": "systemTagからl2[%s]のl2ブリッジ名が見つかりません", + "ORG_ZSTACK_CLOUDFORMATION_10018": "パラメータfilterNameはcloudformation:trueまたはcloudformation:falseに設定する必要があります。", + "ORG_ZSTACK_CLOUDFORMATION_10017": "StackTemplateVO:[%s]はクラウドリポジトリから削除されています...", + "ORG_ZSTACK_CLOUDFORMATION_10016": "無効なCloudFormationテンプレートバージョン:%s", + "ORG_ZSTACK_CLOUDFORMATION_10015": "クラウドリソースのコンテンツ入力の取得に失敗しました。ソースファイルが正しくアップロードおよび構成されていることを確認してください。", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10006": "VPC IDが指定されていないため、Huawei iMaster SDN VXLANネットワークを作成できません", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10007": "指定されたvni範囲[%d-%d]が無効なため、vni範囲を追加できませんでした", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10004": "VLAN ID [%s]が有効な範囲:%sを超えているため、Huawei iMaster SDN VXLANネットワークを作成できませんでした", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10005": "vpcIdとtenantIdが指定されていないため、Huawei iMaster SDN VXLANネットワークを作成できません", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10009": "VLAN範囲が指定されていないため、Huawei iMaster SDN Controllerをネットワークに追加できませんでした", + "ORG_ZSTACK_NETWORK_L2_10013": "L2ネットワーク[UUID:%s]のVLANを変更できません。ホストが接続中または切断中の状態にあるためです", + "ORG_ZSTACK_NETWORK_L2_10012": "仮想スイッチタイプ[%s]はサポートされていません", + "ORG_ZSTACK_NETWORK_L2_10015": "l2Network[uuid:%s]のVLANを変更できません。このネットワークは隔離されています", + "ORG_ZSTACK_NETWORK_L2_10014": "l2Network[uuid:%s]のVLANを変更できません。このネットワークはKVMクラスタに限定されています", + "ORG_ZSTACK_NETWORK_L2_10017": "vlan[%s]はクラウドネットワーク設定が無効です", + "ORG_ZSTACK_NETWORK_L2_10016": "タイプ[%s]のChangeL2NetworkVlanIdにはvlanが必要です", + "ORG_ZSTACK_NETWORK_L2_10019": "タイプ[%s]のChangeL2NetworkVlanIdにはvLANは許可されていません", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10000": "デプロイメントに利用可能なバージョン[%s]の候補ホストがありません", + "ORG_ZSTACK_NETWORK_L2_10018": "仮想ネットワークID [%s]と物理インターフェース [%s]を持つL2ネットワークがクラスタにアタッチされています。L2ネットワーク[uuid: %s]の変更に失敗しました。", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10083": "ホスト名[%s]の既存のSimpleHttpBackupStorageが検出されました", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10082": "URL[%s]が無効です。URLは'/'で始まる絶対パスである必要があります", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10080": "ファイルパスに無効な文字が含まれています:%s", + "ORG_ZSTACK_NETWORK_L2_10020": "物理インターフェース [%s]を持つクラスタにアタッチされたl2Network [uuid:%s]の変更に失敗しました。", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10079": "URLに無効なパス[/devまたは/procまたは/sys]が含まれています。これはクラウドコンピューティング環境ではサポートされていません。リクエストには有効なパスを使用してください。", + "ORG_ZSTACK_CLOUDFORMATION_10034": "templateContentとuuidの両方が空、または両方が設定されているいずれも許可されません!", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10078": "ソースファイルへの絶対パスが必要です: %s", + "ORG_ZSTACK_NETWORK_L2_10006": "UUID: %s、名前: %sのL2ネットワークが、物理インターフェース[%s]に関連付けられたUUID: %sのクラスターにアタッチされています。L2ネットワークのUUID: %sのアタッチに失敗しました。", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10077": "コードレビューまたは編集を続行するには、ソースファイルパスが必要です。ファイルパスを入力してください。", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10076": "バックアップストレージが重複しています。イメージストアバックアップストレージ[hostname:%s]が存在します", + "ORG_ZSTACK_NETWORK_L2_10008": "l2Network [UUID: %s]はクラスター [UUID: %s]に関連付けられており、再割り当てできません。", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10075": "hostname[%s]は有効なDNS名またはIPアドレスではありません", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10011": "DiskOfferingTagAllocatorExtensionPoint[%s]は候補ホストを返しませんでした", + "ORG_ZSTACK_CLOUDFORMATION_10030": "システムを有効化または無効化する権限は管理者のみに付与されています", + "ORG_ZSTACK_NETWORK_L2_10007": "L2 VLANネットワーク[uuid:%s, name:%s]が物理インターフェース[%s]とVLAN[%s]を持つクラスター[uuid:%s]にアタッチされています。L2 VLANネットワーク[uuid:%s]のアタッチに失敗しました。", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10010": "InstanceOfferingTagAllocatorExtensionPoint[%s]は候補ホストを返しませんでした", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10073": "ソースバックアップストレージにはイメージ[%s]が含まれていません", + "ORG_ZSTACK_NETWORK_L2_10009": "物理インターフェース%sに異なるvSwitchタイプを持つ別のネットワークが存在するため、L2ネットワークをアタッチできませんでした", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10072": "ソースストレージ[%s]にはイメージ[%s]が含まれていません", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10071": "ターゲットバックアップストレージ[uuid:%s]には이미이미[uuid:%s]が既に含まれています", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10070": "イメージメタデータファイルの削除に失敗しました: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10009": "バックアップストレージ[UUID: %s, type: %s]にはバインドされたプライマリストレージが必要ですが、まだプライマリストレージが追加されていません。", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10001": "UUID [uuid:%s]、名前[name:%s]のイメージはすべてのバックアップストレージから削除されました。", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10004": "リソースバインディングはタイプ%sをまだサポートしていません", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10003": "イメージ[%s]が配置されているバックアップストレージにアタッチされているホストがゾーン[uuids:%s]に見つかりません。", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10005": "バインドされたリソース%sを持つ利用可能なホストが見つかりません", + "ORG_ZSTACK_NETWORK_L2_10011": "サポートされていないl2Networkタイプ[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10003": "仮想ルーター[uuid:%s, ip:%s]のL3ネットワーク[uuid:%s, name:%s]向けDNS%sの設定に失敗しました、%s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10008": "イメージ[uuid:%s]はプライマリストorage[uuid:%s]との相互作用を必要とするバックアップストレージ[uuid:%s, type:%s]上にありますが、この相互作用を促進するための適切なホストが見つかりませんでした。", + "ORG_ZSTACK_NETWORK_L2_10010": "l2Network[uuid:%s]はクラスター[uuid:%s]にアタッチされていません", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10007": "イメージ[uuid:%s, name:%s]はタイプ%sのプライマリストレージを必要とするバックアップストレージ[uuid:%s, type:%s]上にありますが、互換性のあるプライマリストレージを持つホストが見つかりませんでした。", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10068": "イメージメタデータファイルのチェック: %sに失敗しました", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10066": "イメージメタデータファイルの作成: %sに失敗しました", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10065": "イメージメタデータの同期の作成に失敗しました: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10022": "インスタンス[uuid:%s]のルートボリュームが見つかりません", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10021": "CPU[%s]、メモリ[%sバイト]を利用可能なホストが見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10000": "ネットワークインターフェース[uuid:%s]にゲートウェイがないため、EIPをアタッチできませんでした", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10062": "ディザスタリカバリBSでAddImageは禁止されています: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10001": "VIPのL3Networkが基づくL2Networkが、vmNic[uuid:%s]が存在するクラスタにアタッチされていません", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10002": "フラットタイプのVM NIC (UUID:%s) に1つより多くのEIPをバインドすることはできません", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10060": "インスタンス[%s]にイメージパスがありません", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10015": "利用可能なプライマリストレージが見つかりません [状態: %s、ステータス: %s、利用可能容量 %dバイト]。プライマリストレージの状態とステータスを確認し、クラスタにアタッチされていることを確認してください", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10014": "プライマリストorage %sにアタッチされたクラスタ内にホストが見つかりません", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10016": "利用可能なプライマリストレージが見つかりません [状態: %s または %s、ステータス: %s]。プライマリストレージの状態とステータスを確認し、クラスタにアタッチされていることを確認してください", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10031": "ハイパーバイザタイプ [%s] の [%s] の候補ホスト内で有効なホストが見つかりません", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10030": "[%s] の候補ホストリスト内で有効なホストが見つかりません", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10033": "state=Enabled および status=Connected のホストが見つかりません", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10032": "state=Enabled、status=Connected、hypervisorType=%s のホストが見つかりません", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10012": "バケット %s にオブジェクト %s が見つかりません", + "ORG_ZSTACK_UTILS_10000": "仮想マシンインスタンス %s のアクセスシークレットの生成に失敗しました", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10024": "ボリュームUUIDまたはボリュームスナップショットUUIDのいずれかを指定する必要があります", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10023": "VM[UUID:%s]のボリュームが存在するすべてのプライマリストorage %sにアタッチされたクラスタ内にホストが見つかりません", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10026": "回避ホストを除外した後、プールに残った候補がありません", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10025": "zoneUuids、clusterUuids、およびhostUuidsはそれぞれ少なくとも1つの空でないリストを含むか、すべての値をtrueに設定する必要があります", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10015": "Aliyun EBSバックアップストレージはイメージハッシュの計算をサポートしていません", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10027": "関連するL3Networkを持つL2Networkにアタッチされたクラスタ内にホストが見つかりません%s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10029": "[%s] の候補ホスト内で接続されたホストが見つかりません", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10005": "ロードバランシング戦略を選択するには、アルゴリズムタイプを設定する必要があります", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10008": "仮想マシンが %s 台未満のホストが見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10022": "アカウント [UUID:%s] はリソース [UUID:%s、type:L3NetworkVO] へのアクセス権がありません", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10024": "DHCPサーバーIPを [%s] に変更しましたが、受信したのは [%s] でした", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10025": "L3 Network UUIDはnullにできません", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10003": "クラウドプロバイダの設定が正しくありません。有効な値は %s です", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10021": "セッション/アカウントUUIDが無効です。確認して再試行してください", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10000": "Alibaba Cloud EBSバックアップストレージにはOceanエンドポイントURLを設定する必要があります", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10017": "VM[uuid:%s, state:%s]にEIP操作を適用できません。hostUUIDが見つからないためです。", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10009": "Aliyun EBSバックアップストレージは、イメージダウンロードプロセスのキャンセルをサポートしていません。", + "ORG_ZSTACK_CORE_TIMEOUT_10000": "APIタイムアウトは%sミリ秒より小さく設定できません。", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10002": "OSSバケット[%s]を削除できません。Aliyun EBSバックアップストレージインスタンスがまだ含まれているためです。関連するバックアップストレージインスタンスがすべて削除されていることを確認してください。", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10004": "現在のプライマリストレージは、指定されたプロトコルタイプをサポートしていません。プロトコルがストレージに追加されていることを確認してください。", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10003": "[protocol]パラメータがnullです。タイプ[%s]のプライマリストレージでは、ブロックボリュームプロトコルを指定する必要があります。", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10000": "クラウドリソースパスエラー: ファイルの場所と存在を確認してください。", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10002": "名前: [%s]は既に存在します。ブロックボリューム名はプライマリストレージタイプ[%s]内で一意である必要があります。", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10010": "レイヤー3ネットワーク[uuid:%s]のDHCPv6サーバーIPを取得できませんでした。", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10009": "レイヤー3ネットワーク[uuid:%s]のDHCPv4サーバーIPを取得できませんでした。", + "ORG_ZSTACK_POLICYROUTE_10029": "システムポリシールートテーブルは削除できません。", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10005": "ホスト[uuid:%s]はプロビジョニングされていません。", + "ORG_ZSTACK_POLICYROUTE_10027": "システム定義のポリシールートセットは削除できません。削除を試みる前に、このルートセットがいかなるアクティブなリソースによっても使用されていないことを確認してください。", + "ORG_ZSTACK_POLICYROUTE_10028": "関連する仮想ルーターインスタンスが見つかりません。仮想ルーターが適切に構成され、利用可能であることを確認してください。", + "ORG_ZSTACK_POLICYROUTE_10025": "ルールセット[%s]は仍然ネットワークインターフェースカード(NIC)に関連付けられています。", + "ORG_ZSTACK_POLICYROUTE_10020": "VRouter[%s]は既にポリシーベースのルートテーブル[%s]を持っています。", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10044": "フラットDHCPが有効な場合のみDHCPサーバーIPを変更できます。", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10045": "%sはレイヤー3ネットワーク[uuid:%s]の所有者ではないため、DHCPサーバーIPを変更できませんでした。", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10046": "IPv4アドレス範囲が構成されていないため、DHCPv4サーバーIPを変更できませんでした。", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10047": "提供されたIP[%s]はL3ネットワーク[%s]の有効なCIDRではないため、DHCP v4サーバーIPを設定できませんでした。", + "ORG_ZSTACK_IDENTITY_RBAC_10011": "操作[API:%s]はセキュリティ上の理由によりデフォルトで拒否されています。この問題を解決するには管理者にお問い合わせください。", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10041": "IPv6範囲が構成されていないため、DHCPv6サーバーIPを設定できませんでした。", + "ORG_ZSTACK_IDENTITY_RBAC_10012": "操作はポリシー[name: %s uuid: %s]によって拒否されています。", + "ORG_ZSTACK_IDENTITY_RBAC_10013": "操作はポリシー[name:%s, uuid:%s]によって拒否されています。フィールド[%s]は変更が許可されていません。", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10037": "IP[%s]はDHCPサーバーIPアドレスであるため、IPアドレスを削除できませんでした。", + "ORG_ZSTACK_POLICYROUTE_10018": "システムポリシールートセットを更新できません。必要な権限があることを確認してから再試行してください。", + "ORG_ZSTACK_POLICYROUTE_10019": "システムポリシーベースのルートテーブルを更新できません。必要な権限があることを確認してから再試行してください。", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10039": "IPv4アドレス範囲が構成されていないため、DHCPv4サーバーIPを設定できませんでした。", + "ORG_ZSTACK_POLICYROUTE_10017": "関連する仮想ルーターが見つかりません。", + "ORG_ZSTACK_POLICYROUTE_10014": "不正なプロトコルタイプ %s", + "ORG_ZSTACK_POLICYROUTE_10015": "RuleSet[%s] にはすでに番号 %s のルールが含まれています。", + "ORG_ZSTACK_POLICYROUTE_10013": "操作失敗、IP形式はIPv4/IP範囲/CIDRのみサポートしていますが、%s が見つかりました", + "ORG_ZSTACK_POLICYROUTE_10010": "NextHopIpはIPv4形式である必要がありますが、[%s] が見つかりました", + "ORG_ZSTACK_CORE_REST_10012": "%s を %sms 以内に取得できません", + "ORG_ZSTACK_QUERY_10021": "field[%s] はインベントリ %s のプリミティブではありません。パラメータ 'fields' で指定することはできません。有効なフィールドは %s です", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10034": "DHCPサーバーIP [%s] はすでにL3ネットワーク [%s] に存在します", + "ORG_ZSTACK_QUERY_10020": "エンティティメタデータクラス [%s] にはフィールド [%s] がありません", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10035": "DHCPサーバーIP [%s] はゲートウェイIPと同一にすることはできません", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10036": "DHCPサーバーIP [%s] はシステムL3ネットワーク設定に設定することはできません", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10030": "DHCPサーバーIPアドレス [%s] は有効なIPv4アドレスではありません", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10031": "DHCPサーバーIP [%s] は指定されたCIDR [%s] の範囲外です", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10032": "DHCPサーバーIP [%s] は有効なIPv6アドレスではありません", + "ORG_ZSTACK_IDENTITY_RBAC_10004": "システムロールまたは定義済みロールを更新する権限がありません。管理者にお問い合わせください。", + "ORG_ZSTACK_POLICYROUTE_10009": "DestinationCidrはCIDR形式である必要がありますが、[%s] が見つかりました", + "ORG_ZSTACK_IDENTITY_RBAC_10007": "権限がありません。アカウント [uuid:%s] はリソース [uuid:%s, type:%s] へのアクセスが許可されていません", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10027": "宛先ホスト [uuid:%s] で仮想マシン [uuid:%s] のDHCPを設定できません", + "ORG_ZSTACK_IDENTITY_RBAC_10008": "権限がありません。アカウント [uuid:%s] はタグ付きリソース [uuid:%s, type:%s] の管理が許可されていません", + "ORG_ZSTACK_POLICYROUTE_10008": "VRouter[%s] にはすでに %s という名前のルールセットが存在します", + "ORG_ZSTACK_IDENTITY_RBAC_10005": "システムロールまたは定義済みロールを削除する権限がありません。管理者にお問い合わせください。", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10029": "フラットネットワークの最小IP範囲プレフィックス長は %d です", + "ORG_ZSTACK_POLICYROUTE_10003": "l3[%s] にはすでにポリシールートルールセットがアタッチされています", + "ORG_ZSTACK_IDENTITY_RBAC_10009": "アカウント [UUID:%s] はリソース [UUID:%s, Type:%s] へのアクセス権がありません", + "ORG_ZSTACK_POLICYROUTE_10000": "システムポリシールートが有効な場合、デフォルトルートネットワークは変更できません", + "ORG_ZSTACK_QUERY_10018": "条件名 [%s] が無効です。インベントリクラス [%s] にそのようなフィールドは見つかりません", + "ORG_ZSTACK_QUERY_10017": "クラウドリソースフィルタリングのクエリ条件 %s の \"value\" はnullにできません", + "ORG_ZSTACK_QUERY_10015": "filterNameは [filterType:condition(s)] の形式でなければなりません", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_10000": "ocean API署名文字列の作成に失敗しました: %s", + "ORG_ZSTACK_QUERY_10019": "条件名 [%s] が無効です: インベントリ [%s] のフィールド [%s] は @UnqueryableField と注釈付けられています", + "ORG_ZSTACK_ALIYUN_PANGU_10001": "identityZone: %s に appName: %s, partitionName: %s はすでに存在します", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10050": "DHCPサーバーIPを設定できませんでした。IP [%s] はすでに割り当てられています", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10051": "IP[%s]が使用されているため、DHCPv6サーバーIPを設定できません", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10053": "DHCPサーバーIPの割り当てに失敗しました。%s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10048": "IPv6範囲が設定されていないため、DHCPv6サーバーIPを変更できません", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10049": "IP[%s]はL3ネットワーク[%s]の有効なCIDRではないため、DHCPv6サーバーIPを設定できません", + "ORG_ZSTACK_USBDEVICE_10026": "VM[%s]からすべてのUSBデバイスをアンマウントして、再試行してください", + "ORG_ZSTACK_USBDEVICE_10025": "USBデバイス[uuid:%s]はVMインスタンスに接続されているため、切り離せません", + "ORG_ZSTACK_USBDEVICE_10024": "VMインスタンス[uuid:%s]はUSBデバイス%sを接続できる状態ではありません", + "ORG_ZSTACK_USBDEVICE_10023": "USBデバイス[uuid:%s]が接続されているVMインスタンスは切り離せる状態ではありません: %s", + "ORG_ZSTACK_USBDEVICE_10022": "USBデバイス[UUID:%s]はどの仮想マシンインスタンスにも接続されていません", + "ORG_ZSTACK_USBDEVICE_10021": "USBデバイス[uuid:%s]が接続されているホストは無効な状態[%s]またはステータス[%s]です", + "ORG_ZSTACK_USBDEVICE_10020": "VMインスタンス[UUID:%s]はUSBデバイス%sを接続できる状態ではありません", + "ORG_ZSTACK_COMPUTE_SRIOV_10005": "L3ネットワーク[uuid:%s]が存在しません", + "ORG_ZSTACK_COMPUTE_SRIOV_10006": "ホスト[l3Network [uuid:%s]にSRIOVデバイスがないため、%s", + "ORG_ZSTACK_COMPUTE_SRIOV_10007": "VF NIC [UUID:%s]が存在しないため、VF NIC HA状態を変更できませんでした", + "ORG_ZSTACK_COMPUTE_SRIOV_10008": "高可用性状態[%s]が無効なため、仮想ネットワークインターフェースカードの高可用性状態を変更できませんでした", + "ORG_ZSTACK_COMPUTE_SRIOV_10009": "L2ネットワーク[UUID:%s]が見つかりません", + "ORG_ZSTACK_COMPUTE_SRIOV_10000": "ホスト[uuid:%s, ip:%s]でのVF NIC MACの設定に失敗しました。理由: %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10001": "仮想ネットワークインターフェースカードHA状態の変更に失敗しました。エラー: %s", + "ORG_ZSTACK_DRS_10000": "クラスター[%s]がデータレプリケーションサービスを開始しました", + "ORG_ZSTACK_DRS_10002": "閾値を設定してください。閾値設定が適切に構成されていることを確認してください。", + "ORG_ZSTACK_DRS_10001": "この仮想マシンではDRSが無効になっています。リソース割り当てを最適化するために、DRSが有効になっていることを確認してください。", + "ORG_ZSTACK_DRS_10004": "無効な閾値オペレーター[%s]", + "ORG_ZSTACK_DRS_10003": "無効な閾値名[%s]", + "ORG_ZSTACK_DRS_10006": "無効な閾値です。有効範囲: (0, 100]", + "ORG_ZSTACK_DRS_10005": "クラウドリソース監視の閾値を設定してください。%s", + "ORG_ZSTACK_DRS_10008": "DRG[%s]のステータスは%sです", + "ORG_ZSTACK_DRS_10007": "GlobalConfig ENABLE_DRSが無効になっています", + "ORG_ZSTACK_DRS_10009": "DRS[%s]の自動化レベルがマニュアルモードに設定されていません", + "ORG_ZSTACK_ZWATCH_FUNCTION_10012": "値[%s]は有効な整数ではありません", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10018": "API操作を実行できませんでした。バックエンドネットワーク[UUID:%s]はVPCルーター[UUID:%s]に接続されていますが、フロントネットワーク[UUID:%s]には接続されていません。", + "ORG_ZSTACK_ZWATCH_FUNCTION_10011": "無効な引数[limit:%s]、負の値にはできません", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10019": "バックエンドネットワーク[UUID:%s]は、別のバックエンドネットワークがVPCネットワークとして構成されているため、VPCネットワークである必要があります。", + "ORG_ZSTACK_ZWATCH_FUNCTION_10010": "不明な引数[%s]", + "ORG_ZSTACK_DRS_10020": "VM移行中はDRSの削除は許可されていません。", + "ORG_ZSTACK_DRS_10011": "正常に実行されました。再度デプロイは許可されていません。", + "ORG_ZSTACK_DRS_10010": "advice[%s]が非アクティブのため期限切れになりました", + "ORG_ZSTACK_DRS_10013": "VM[%s]は実行状態ではありません", + "ORG_ZSTACK_DRS_10012": "VM[%s]は終了されました", + "ORG_ZSTACK_DRS_10015": "クラスタ[%s]は動的リソーススケーリングをサポートしていません。", + "ORG_ZSTACK_DRS_10014": "VM[%s]はソースホスト[%s]に存在しなくなりました。", + "ORG_ZSTACK_DRS_10017": "ホストUUIDのリストが空です。少なくとも1つのホストUUIDが提供されていることを確認してください。", + "ORG_ZSTACK_DRS_10016": "DRDSインスタンスを作成できません、%s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10013": "バックエンドネットワーク[uuid:%s]は、フロント Layer 3 ネットワークがVPCネットワークであるため、VPCネットワークである必要があります。", + "ORG_ZSTACK_ZWATCH_FUNCTION_10005": "無効な引数[start:%s]、クラウドコンピューティング環境では負の値にはできません", + "ORG_ZSTACK_DRS_10019": "タスクスケジューリング中はadviceは許可されません", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10014": "API操作を実行できませんでした。バックエンドネットワーク[UUID:%s]はVPC路由器に接続されていません。再試行前にネットワークが適切に接続されていることを確認してください。", + "ORG_ZSTACK_DRS_10018": "ホスト使用率データのクエリに失敗しました", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10015": "バックエンドネットワークはVPC路由器[uuid:%s]に関連付けられていますが、フロントエンドネットワークは別のVPC路由器[uuid:%s]に関連付けられています。両方のネットワークが同じVPC路由器に関連付けられていることを確認してください。", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10016": "API操作を実行できませんでした。バックエンドネットワーク[uuid:%s]は、フロント L3 ネットワークがプライベートフラットネットワークであるため、プライベートフラットネットワークである必要があります。", + "ORG_ZSTACK_ZWATCH_FUNCTION_10002": "不明な関数[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10010": "バックエンドネットワークCIDRはフロント L3 ネットワークCIDRと重複しています", + "ORG_ZSTACK_ZWATCH_FUNCTION_10008": "クラウドコンピューティング環境構成で引数[%s]の値[%s]が無効です", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10011": "バックエンドネットワークCIDR [%s]は管理 L3 ネットワークCIDR [%s]と重複しています。構成の競合を避けるため、ネットワークCIDR間に重複がないことを確認してください。バックエンドネットワークUUID [%s]と管理 L3 ネットワークUUID [%s]が影響を受けます。", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10012": "API操作を実行できませんでした。フロントエンドネットワーク[UUID:%s]はVPC路由器に接続されていません", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10001": "CEPHプール[%s]に関連するOSDグループが見つかりません", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10000": "必要なCEPHプール[uuid:%s]は条件[availableSize > %d バイト]を満たせません、現在の利用可能サイズ %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10006": "イメージ[uuid:%s]が削除されているため、SLBインスタンスを作成できませんでした", + "ORG_ZSTACK_ZWATCH_FUNCTION_10001": "重複する引数[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10007": "最大インスタンス制限に達したため、SLBインスタンスの作成に失敗しました。", + "ORG_ZSTACK_ZWATCH_FUNCTION_10000": "クラウドインスタンス構成に必要な引数[%s]が見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10008": "SLBグループを作成できませんでした。無効なフロントL3ネットワークタイプのためです: %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10009": "フロントネットワークCIDR [%s]は、管理L3ネットワークCIDR [%s]と重複しています", + "ORG_ZSTACK_DRS_10022": "仮想マシンの移行中はスケジューリングが許可されていません。", + "ORG_ZSTACK_DRS_10023": "ホストCPUおよびメモリの使用率データがありません", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10002": "クラウドはVIP[%s]を削除できません。最初にSLB[uuid:%s]が削除されていることを確認してください。", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10003": "ロードバランサSLBグループ[uuid:%s]が存在しないため、SLBインスタンスを作成できませんでした", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10004": "SLBグループ[uuid:%s]に対してSLBオファリングが設定されていないため、SLBインスタンスを作成できませんでした", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10005": "SLBオファリング[uuid:%s]のimage UUIDがnullであるため、SLBインスタンスを作成できませんでした", + "ORG_ZSTACK_CORE_ENCRYPT_10000": "暗号化エラー : %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10000": "SLBグループフロントLayer3ネットワーク[uuid:%s]にアタッチされているSLBインスタンス[uuid:%s]のネットワークインターフェースが見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10001": "IP範囲[%s]を削除できません。まずロードバランサ[uuid:%s]を削除してください", + "ORG_ZSTACK_IDENTITY_10011": "元のパスワードが一致しないため、ユーザー[%s]のパスワードを更新できません。", + "ORG_ZSTACK_IDENTITY_10010": "UUID [%s]のユーザーは、UUID [%s]のアカウントとの関連付けがありません。", + "ORG_ZSTACK_IDENTITY_10016": "アカウント[uuid:%s]のクォータ[name:%s]を%dに設定できません", + "ORG_ZSTACK_IDENTITY_10017": "アカウント[UUID:%s]は[Name:%s, Usage Value:%s]を使用しており、要求クォータ%dを超えています", + "ORG_ZSTACK_IDENTITY_10001": "認証資格情報が正しくありません。パスワードを確認し、再度お試しください。", + "ORG_ZSTACK_IDENTITY_10009": "アカウント[UUID: %s]はリソース[UUID: %s]へのアクセス権がありません", + "ORG_ZSTACK_IDENTITY_10008": "UUID [%s]のユーザーグループは、UUID [%s]のアカウントに属していません。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10003": "VIP%sの解放に失敗しました: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10009": "サービス[uuid: %s]はすでに監視サーバーにバインドされています", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10002": "仮想ルータ[uuid:%s]のVIP[ips: %s]を仮想ルータ[uuid:%s]に同期しようとして失敗しました(NIC[uuid: %s, ip: %s])、原因: %s", + "ORG_ZSTACK_OVF_10025": "状態が%sの仮想マ者のみエクスポートできます。", + "ORG_ZSTACK_OVF_10026": "APICreateVmInstanceFromOvfMsgでjsonCreateVmParamの解析に失敗しました。リクエストパラメータが無効です", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10006": "ゾーン[uuid:%s]のL3Network[uuid:%s]に対して仮想ルータオファリング[uuid:%s]が見つかりました。ただし、ネットワークの公開IPネットワーク[uuid:%s]はVIP[uuid:%s]と一致しません。システムタグguestL3Network::l3NetworkUuidを使用して特定の仮想ルータオファリングを指定する必要がある場合があります。", + "ORG_ZSTACK_OVF_10023": "VMのエクスポートにはImageStoreバックアップストレージが必要です指定されたbackupStorageUuid: %sはImageStoreバックアップストレージではありません。", + "ORG_ZSTACK_OBSERVABILITYSERVER_10006": "UUID: %sの監視サーバーは有効化されていません", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10005": "仮想ルータ[uuid:%s, state:%s]はアクティブではありません", + "ORG_ZSTACK_OVF_10024": "エクスポート対象の仮想マシンがUUID: %sで見つかりません", + "ORG_ZSTACK_OBSERVABILITYSERVER_10007": "監視サーバーオファリング[UUID: %s]のイメージが見つかりません", + "ORG_ZSTACK_OVF_10021": "OVFからVMを作成できませんでした。仮想マシンのルートディスクが見つかりません。必要なディスクが適切に構成され、利用可能であることを確認してください。", + "ORG_ZSTACK_OVF_10022": "VM[UUID: %s]はすでにOVAパッケージ[UUID: %s]としてエクスポートされています。パッケージを削除して再試行してください。", + "ORG_ZSTACK_KVM_XMLHOOK_10001": "UUID %sのxml hookは正常に更新されましたが、VM with UUID %sの再起動に失敗しました。詳細: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10003": "サービス: %s、タイプ: %sの仮想ルーターが見つかりません", + "ORG_ZSTACK_OBSERVABILITYSERVER_10010": "UUID: %sのオブザーバビリティサーバーが操作不能ですサービスをアタッチできません", + "ORG_ZSTACK_OVF_10018": "仮想マシン%sのOVFファイルの読み取りに失敗しました。ファイルパスと権限を確認してください。", + "ORG_ZSTACK_OVF_10017": "仮想マシンのリポジトリ内でOVAパッケージ[uuid: %s]が見つかりません。", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10057": "ロードバランサー[uuid:%s, type:%s]のSLBグループUUIDが見つかりません", + "ORG_ZSTACK_STORAGE_PRIMARY_FILESYSTEM_10000": "host[uuid:%s]のハートビートが最近更新されていません", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_HA_10000": "HAグループの拡張ポイントは初期化されていません", + "ORG_ZSTACK_OVF_10030": "長時間ジョブ[uuid:%s]の実行に失敗しました", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10040": "L3ネットワーク[uuid:%s]が異なるVPCルーターに接続されているため、vmnicをロードバランサーのサーバーグループに追加できませんでした", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10041": "L3ネットワークがSLBインスタンスに接続されていないため、VMNICをロードバランサーのサーバーグループに追加できませんでした", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10046": "SLBグループに対して別のインスタンス[UUID: %s, name: %s]がすでに存在するため、SLBインスタンスを作成できませんでした", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10047": "SLBグループに対して2つのインスタンスがすでに作成されているため、SLBインスタンスを作成できませんでした。", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10001": "NFSストレージ[uuid:%s, path:%s]からイメージストア[hostname:%s]へのビットアップロードに失敗しました、%s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10042": "無効なモニターIP %sのため、SLBグループのモニターIPを変更できませんでした", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10043": "インスタンスの状態[%s]が停止していないため、SLBグループ[uuid:%s]を高可用性モードに切り替えることができませんでした", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10044": "仮想ルーター[UUID:%s]上でVIP%sを作成できませんでした、 потому что %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10000": "イメージストアバックアップストレージ[hostname:%s, path: %s]からNFSプライマリストレージ[uuid:%s, path: %s]へのビットダウンロードに失敗しました、%s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10045": "SLBインスタンス[uuid:%s]のアフィニティグループの作成に失敗しました", + "ORG_ZSTACK_IAM2_API_10011": "属性[uuid:%s]がいかなる定義されたグループにも関連付けられていません", + "ORG_ZSTACK_IAM2_API_10012": "属性[uuid:%s]がいかなる組織にも関連付けられていません", + "ORG_ZSTACK_IAM2_API_10013": "属性[uuid:%s]がいかなるプロジェクトにも関連付けられていません", + "ORG_ZSTACK_IAM2_API_10014": "属性[uuid:%s]がいかなる仮想インスタンスIDにも関連付けられていません", + "ORG_ZSTACK_IAM2_API_10015": "プロジェクトを_retired_stateから取り出す前に、退職ポリシーを削除する必要があります。", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10039": "L3ネットワーク[uuid:%s]が какой-либо VPCルーターに接続されているため、vmnicをロードバランサーのサーバーグループに追加できませんでした", + "ORG_ZSTACK_IAM2_API_10016": "プロジェクトは%sの状態にあるため、ログインは禁止されています", + "ORG_ZSTACK_IAM2_API_10017": "クオータ[name:%s]は存在しません", + "ORG_ZSTACK_IAM2_API_10018": "コンテナのCPU制限(%s)는要求されたCPU量(%s)より大きくなければなりません。", + "ORG_ZSTACK_IAM2_API_10019": "コンテナのメモリサイズ制限は要求されたメモリサイズより大きくなければなりません。", + "ORG_ZSTACK_OVF_10003": "ボリューム管理コントローラが見つかりません。ボリューム管理サービスが正しく構成され、実行されていることを確認してください。", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10007": "VIP [uuid: %s] の VipQoS が存在しません", + "ORG_ZSTACK_OVF_10004": "CD Driver Controller が見つかりません。必要な仮想化ドライバーがインスタンスにインストールされ、構成されていることを確認してください。", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10008": "仮想IP [uuid: %s] のサービス品質(Quality of Service)を削除できません。これは VPC Shared Quality of Service に関連付けられています。", + "ORG_ZSTACK_OVF_10001": "不正なディスク容量指定: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10005": "VIP [UUID: %s] にサービス品質(Qos)を設定できません。これは VpcSharedQos にすでにアタッチされています。", + "ORG_ZSTACK_OVF_10002": "不正なディスクプロビジョニングサイズ: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10006": "VIP [uuid: %s] ポート %s の VIP QoS が存在しません", + "ORG_ZSTACK_OVF_10000": "ディスク %s のディスク参照が見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10009": "VIP [uuid:%s] の VIP QoS バックエンドが見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10010": "VpcSharedQos は帯域幅を指定する必要があります", + "ORG_ZSTACK_IPSEC_10028": "L3 ネットワーク [%s] は IPsec トンネル [UUID :%s] にアタッチされていません", + "ORG_ZSTACK_AUTOSCALING_10000": "ロードバランサー [%s] に関連するリスナーの L3 ネットワーク UUID [%s] が無効です。すべてのネットワークは LB サービスと同じ仮想ルーターにアタッチされ、同じ VRouter ネットワーク構成の一部である必要があります", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10011": "VPC はまず L3 [%s] にアタッチされている必要があります", + "ORG_ZSTACK_IPSEC_10029": "CIDR [%s] は IPsec 構成 [UUID :%s] にすでに含まれています", + "ORG_ZSTACK_AUTOSCALING_10001": "AutoScalingGroup から autoScalingTemplate [%s] をデタッチできませんでした、エラー: %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10030": "IPv6 プレフィックス [%s] の形式が無効なため、UUID [%s] の L3 ネットワークを SLB インスタンスにアタッチできません", + "ORG_ZSTACK_AUTOSCALING_10003": "UUID: %s のリスナーは autoScalingVmTemplate [%s] で使用されているため、削除できません", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10014": "VpcSharedQos はこの VIP をアタッチできません。これはすでに別の VpcSharedQos にアタッチされています。", + "ORG_ZSTACK_IPSEC_10025": "L3 ネットワーク [%s] は IPsec [UUID:%s] に複数回アタッチできません", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10012": "AttachVipToVpcSharedQos パラメータでは VipUuids または VipLists を指定する必要があります", + "ORG_ZSTACK_IPSEC_10026": "APIAttachL3NetworksToIPsecConnectionMsg に Layer 3 ネットワークを含める必要があります", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10013": "VpcSharedQos はこの VIP をアattachできません。VIP [%s] は L3 ネットワーク [%s] 内にありません。", + "ORG_ZSTACK_IPSEC_10027": "L3 ネットワーク [%s] は VPC ネットワークではなく、IPsec にアタッチまたはデタッチできません。", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10035": "VIP [uuid:%s] はすでに別のネットワークサービス [%s] に関連付けられているため、ロードバランサーを作成できません", + "ORG_ZSTACK_IPSEC_10020": "ピアアドレス [%s] は有効な IPv4 アドレスではありません", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10036": "VIP [uuid:%s] はすでに VPC ルーター [%s] にアattachされているため、ロードバランサーを作成できません", + "ORG_ZSTACK_IPSEC_10021": "認証キーは空白や %s などの特殊文字を含んではいけません", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10037": "無効な SLB グループ [uuid:%s] のため、ロードバランサーを作成できません", + "ORG_ZSTACK_IPSEC_10022": "IPsec VIP [%s] はパブリックアドレスプールタイプに関連する CIDR 範囲の最初または最後の IP アドレスであってはいけません", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10038": "バックエンドサーバーNICをサーバーグループ[uuid:%s]に追加できませんでした。NIC UUIDがnullです", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10031": "IPアドレスとプレフィックスがシステムタグに指定されていないため、UUID [%s]のL3ネットワークをSLBインスタンスに接続できません", + "ORG_ZSTACK_AUTOSCALING_10004": "インスタンスがスケーリンググループ内に存在しません。インスタンスIDとスケーリンググループ名[%s]を確認してください", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10032": "フロントエンドL3ネットワーク[uuid:%s]をSLBインスタンスから切り離せません", + "ORG_ZSTACK_AUTOSCALING_10005": "UUID:%sのアラームはautoScalingGroup[%s]に関連付けられており、削除できません", + "ORG_ZSTACK_IAM2_API_10020": "organization[uuid:%s]はクラウドテナントであり、親組織を持つことはできません", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10033": "管理L3ネットワーク[uuid:%s]をSLBインスタンスから切り離せません", + "ORG_ZSTACK_AUTOSCALING_10006": "ルール[%s]は無効です", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10034": "最後のバックエンドレイヤー3ネットワークインターフェースであるため、NIC [uuid:%s]をSLBインスタンスから切り離せません", + "ORG_ZSTACK_IAM2_API_10021": "親組織[uuid:%s]は、ネストされた組織構造内で子組織[uuid:%s]になることはできません", + "ORG_ZSTACK_IAM2_API_10022": "仮想マシンID名[%s]が重複しています", + "ORG_ZSTACK_IAM2_API_10023": "仮想環境名[%s]が重複しています", + "ORG_ZSTACK_IAM2_API_10024": "プロジェクト名[%s]が無効です。同じ名前のプロジェクトが既に存在します", + "ORG_ZSTACK_IAM2_API_10025": "IAM2OrganizationVO[uuid:%s]は存在しません", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10028": "IPアドレスとネットマスクがシステムタグに指定されていないため、UUID [%s]のL3ネットワークをSLBインスタンスに接続できません", + "ORG_ZSTACK_IAM2_API_10026": "プロジェクト[UUID=%s]は組織[UUID=%s]に関連付けられています", + "ORG_ZSTACK_OBSERVABILITYSERVER_10019": "クラウド環境での有効なスケーリングのため、開始時間は終了時間より前でなければなりません", + "ORG_ZSTACK_IAM2_API_10027": "プロジェクト[UUID=%s]はクラウド環境に関連付けられていません", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10029": "IPv6アドレス形式[%s]が無効なため、UUID [%s]のL3ネットワークをSLBインスタンスに接続できません", + "ORG_ZSTACK_IAM2_API_10028": "組織%sは他の組織の子にすることはできません", + "ORG_ZSTACK_IAM2_API_10029": "仮想ID[UUID: %s]はプロジェクト[UUID: %s]に属していません", + "ORG_ZSTACK_OBSERVABILITYSERVER_10015": "サービスタイプ%sのObservabilityServerが見つかりません", + "ORG_ZSTACK_OVF_10015": "バックアップストレージ[UUID: %s]にはVM[UUID: %s]をエクスポートするための十分な容量がありません。必要な容量は: %dです", + "ORG_ZSTACK_OBSERVABILITYSERVER_10016": "タイプ%sのサービス[uuid: %s]は、次の原因によりオブザーバビリティサーバー[uuid: %s]から切り離せません: %s", + "ORG_ZSTACK_OVF_10012": "CPU 'CoresPerSocket'設定値[%s]が無効です", + "ORG_ZSTACK_OBSERVABILITYSERVER_10017": "サービス[uuid: %s]はオブザーバビリティサーバー[uuid: %s]に関連付けられていません", + "ORG_ZSTACK_OBSERVABILITYSERVER_10018": "クラウドインスタンスプロビジョニング期間には、開始時間と終了時間の両方を指定する必要があります", + "ORG_ZSTACK_OVF_10010": "仮想CPU 'VirtualQuantity'が見つかりません", + "ORG_ZSTACK_OBSERVABILITYSERVER_10011": "オブザーバビリティサーバーインスタンス[uuid: %s]が見つかりません", + "ORG_ZSTACK_OVF_10011": "CPU 'vCPU'値[%s]が無効です", + "ORG_ZSTACK_OBSERVABILITYSERVER_10013": "サービス[uuid: %s](タイプ %s)は、次 reason: %sのため、監視サーバー[uuid: %s]に接続できません", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10000": "IPv6のVIPサービス品質(QoS)は間もなく実装されます。", + "ORG_ZSTACK_ALIYUN_STORAGE_SNAPSHOT_10000": "この操作は、ECSインスタンスの状態が「実行中」または「停止」の場合にのみ許可されます。", + "ORG_ZSTACK_OVF_10009": "CPU 'InstanceID'が見つかりません。インスタンスIDを確認し、CPUが正しく割り当てられていることを確認してください。", + "ORG_ZSTACK_OBSERVABILITYSERVER_10020": "無効な日時形式です。オプションのタイムゾーン詳細を含むISO-8601形式が必要です: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10021": "監視サーバー[UUID: %s]がアクティブでないため、サービスデータを取得できません", + "ORG_ZSTACK_OVF_10007": "仮想メモリ'VirtualQuantity'が見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10003": "SetVipQosでは、InboundBandwidthまたはOutboundBandwidthのいずれかを指定する必要があります。", + "ORG_ZSTACK_OVF_10008": "無効な仮想マシンメモリの値: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10004": "このバーチャルIP(VIP)にサービス品質(QoS)を設定できません。すべてのピアLayer 3ネットワークがVIP QoSサービスを提供しているわけではありません。", + "ORG_ZSTACK_OVF_10005": "イーサネットアダプタ: %sはネットワークに接続されていません。", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10001": "VIP [uuid: %s]ポート %sのVIP QoSは既に存在します", + "ORG_ZSTACK_OVF_10006": "仮想マシン'%s'が見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10002": "VIP [uuid: %s]のVIP Quality of Serviceは既に存在します", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10024": "バックエンドインスタンスタイプ %sが無効なため、SLBグループを作成できませんでした", + "ORG_ZSTACK_IPSEC_10031": "IPsec [uuid:%s]が準備完了状態ではないため、状態を変更できません", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10025": "モニタリングIP %sが無効なため、SLBグループを作成できませんでした", + "ORG_ZSTACK_IPSEC_10032": "このIPsecトンネル[uuid:%s]を再接続できませんでした。IPsecバージョンをアップグレードしてください", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10026": "IPv4アドレス形式 [%s]が無効なため、UUID [%s]のL3ネットワークをSLBインスタンスに接続できません", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10027": "IPv4ネットマスク形式エラー [%s]のため、UUID [%s]のL3ネットワークをSLBインスタンスに接続できません", + "ORG_ZSTACK_IAM2_API_10030": "不正な操作です。Role[%s]を追加できません", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10021": "バックエンドネットワーク[UUID:%s]はVPCルータ[UUID:%s]に接続されていますが、他のバックエンドネットワークはVPCルータ[UUID:%s]に接続されています。", + "ORG_ZSTACK_IAM2_API_10031": "古い仮想マシンIDに対しては操作できません: %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10022": "API操作を実行できませんでした。バックエンドネットワーク[uuid:%s]はVPCネットワークにできません。他のバックエンドネットワークはVPCネットワークではありません。", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10023": "デプロイメントタイプ %sが無効なため、SLBグループを作成できませんでした", + "ORG_ZSTACK_IPSEC_10030": "CIDR [%s]はIPsec UUID [%s]の定義されたCIDR内にありません", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10026": "操作エラー: クラウドコンピューティングサービスからの応答の取得に失敗しました", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10028": "バックアップストレージへのスナップショットのバックアップは非推奨機能であり、将来のバージョンのクラウドプラットフォームで削除されます", + "ORG_ZSTACK_IAM2_API_10000": "属性名はnullにできません、値[%s]", + "ORG_ZSTACK_IAM2_API_10001": "属性名[%s]は最大長2048文字を超えています", + "ORG_ZSTACK_IAM2_API_10002": "attribute[name:%s] の値は2048文字の最大長を超えています", + "ORG_ZSTACK_IAM2_API_10003": "組織[UUID: %s]が[名前: %s, 使用値: %s]の要求制限を超えています", + "ORG_ZSTACK_IAM2_API_10005": "%sはネットワークトラフィック制御の有効な値ではありません。有効な値は特定のIP範囲間のallow/rejectです", + "ORG_ZSTACK_IAM2_API_10006": "デフォルトの組織ユニット[%s]は削除できません", + "ORG_ZSTACK_IAM2_API_10007": "重複するテンプレート識別子[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10018": "VpcSharedQosはVpc[%s]が接続されていないため、このVipをデタッチできません", + "ORG_ZSTACK_IAM2_API_10009": "ユーザー名'admin'は、管理権限を示すクラウドコンピューティング環境で予約されています別のユーザー名を選択してください", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10016": "DetachVipFromVpcSharedQosパラメータはVipUuidsまたはVipListsを指定する必要があります", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10017": "VpcSharedQosはVIP[%s]がアタッチされていないため、このVIPをデタッチできません", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10010": "cephプライマリストア[uuid:%s]は削除または終了された可能性があります", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10013": "cephプライマリストア[UUID: %s, 名前: %s]は利用できません。1つのモニタ[UUID: %s]が操作失敗[%s]を報告しています", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10012": "同じFSIDを持つ別のCEPHプライマリストーラが存在するため、同じCEPH設定を2つの異なるプライマリストアとして追加することはできません", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10015": "ストレージノード(%s)との接続を確立できません", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10017": "モニタノード[ip:%s]がFSID[%s]を返しましたが、現在のクラスターのFSID[%s]と一致しません。このクラスターに属していないモニタノードを誤って追加していませんか?", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10016": "CephベースのプライマリストレージソリューションへのMONノードの追加に失敗しました", + "ORG_ZSTACK_IAM2_API_10010": "無効な名前[%s]、同じ識別子を持つプロジェクトまたはアカウントがすでに存在します", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10008": "cephプライマリストア[UUID:%s]への接続に失敗し、すべてのCephモニタへの接続に失敗しました", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10007": "すべてのモニタがHTTPリクエスト[%s]を実行できません", + "ORG_ZSTACK_ZOPS_10009": "chronyソースの取得に失敗しました。理由:%s", + "ORG_ZSTACK_ZOPS_10005": "%sは%sから到達不能です。理由:%s", + "ORG_ZSTACK_ZOPS_10004": "'%s'の時間ソースの構成に失敗しました。理由:%s、生:%s", + "ORG_ZSTACK_ZOPS_10007": "%sは次の 이유로Cephクラスターの健全性ステータスの検証に失敗しました: %s", + "ORG_ZSTACK_ZOPS_10006": "%sが%sから到達可能かどうかの検証に失敗しました。理由:%s", + "ORG_ZSTACK_ZOPS_10001": "%sは有効なクラウドインスタンスIPアドレスではありません", + "ORG_ZSTACK_ZOPS_10003": "%sは有効なIPアドレスまたはホスト名ではありません", + "ORG_ZSTACK_ZOPS_10002": "内部および外部のChronyサーバーを同時にnullにすることはできません。両方が適切に構成されていることを確認してください", + "ORG_ZSTACK_ZOPS_10010": "%sのchronyソースの取得に失敗しました。理由:%s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10001": "バックアップストレージ[UUID: %s, 名前: %s, FSID: %s]は、プライマリストレージ[UUID: %s, 名前: %s, FSID: %s]と同じCephクラスターの一部ではありません", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10004": "暗号化されたイメージキャッシュの保存に失敗しました: %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10005": "プライマリストレージ[ps(%s)]とバックアップストレージ[bs(%s)]の間のFSIDが一致しません。したがって、テンプレートの作成は禁止されています", + "ORG_ZSTACK_ZOPS_10019": "%s内のzstack.propertiesから古い chrony サーバーを削除できませんでした。理由:%s", + "ORG_ZSTACK_ZOPS_10016": "ZStoneは現在、chrony サーバーのオンライン更新をサポートしていません。デプロイ前にすべての変更がオフラインで行われていることを確認してください。", + "ORG_ZSTACK_ZOPS_10015": "%sは現在の仮想マシン環境から到達できません", + "ORG_ZSTACK_ZOPS_10018": "CEPH クラスターのステータスが正常ではありません。まず環境を確認してください! %s", + "ORG_ZSTACK_ZOPS_10012": "%sがホスト %sから到達可能かどうかを確認できません。管理下にないためです", + "ORG_ZSTACK_ZOPS_10011": "%s内の chrony サーバーと同期できませんでした。理由:%s、生データ: %s", + "ORG_ZSTACK_ZOPS_10014": "%sを外部 chrony タイムサーバーとして指定できません!", + "ORG_ZSTACK_ZOPS_10020": "%s内のzstack.propertiesに chrony %s サーバーを設定できませんでした。理由:%s", + "ORG_ZSTACK_PROXY_10000": "UUID %s のユーザー プロキシ設定が見つかりません", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10005": "ホスト[uuid:%s]から USB リダイレクト サーバーを起動できませんでした", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10004": "ホスト[%s]で USB サービスを起動できません。ホストが接続されていないためです", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10003": "ホスト[%s]が 64 を超える USB リダイレクト ポートを開始しました", + "ORG_ZSTACK_COMPUTE_HOST_10085": "インターフェースの管理ネットワークを構成できません。自動割り当てモードに設定されているため", + "ORG_ZSTACK_COMPUTE_HOST_10084": "インターフェースから管理ネットワークをデタッチできません。自動割り当てタイプのため", + "ORG_ZSTACK_COMPUTE_HOST_10087": "ボンディング インターフェースから管理ネットワークをデタッチできません。自動 IP 取得を使用するため", + "ORG_ZSTACK_COMPUTE_HOST_10081": "ブリッジ スレーブ インターフェースの IP アドレスを構成できません", + "ORG_ZSTACK_COMPUTE_HOST_10080": "IP アドレスはすでに別のインターフェースに割り当てられています。すべてのネットワークインターフェースで IP アドレスが一意であることを確認してください", + "ORG_ZSTACK_COMPUTE_HOST_10083": "仮想ネットワークインターフェース %s のボンディング UUID が無効です", + "ORG_ZSTACK_COMPUTE_HOST_10089": "指定されたサービスタイプが無効です。クラウドコンピューティング環境で有効なサービスタイプを使用していることを確認してください", + "ORG_ZSTACK_COMPUTE_HOST_10088": "管理ネットワークが自動割り当てを使用しているため、ボンディングに管理ネットワークを設定できません", + "ORG_ZSTACK_COMPUTE_HOST_10090": "IPMI による仮想マシン[%s]のモック電源オフに失敗しました", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10001": "ホスト: %s、ポート: %d の SMTP サーバーへの接続を確立できませんでした。smtpServer と smtpPort 構成の正確性を確認してください。[error=%s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10002": "15秒以内に SMTP サーバー[server: %s, port: %s]への接続を確立できません", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10003": "SMTP サーバー検証エラー: %s", + "ORG_ZSTACK_AI_COLLECTOR_10000": "仮想環境で MindIE メタデータ収集用のデプロイ コンテキストが見つかりません。必要なクラウドリソースが適切に構成され、利用可能であることを確認してください。", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10004": "指定されたエンドポイントが無効です。エンドポイント構成を確認してください。", + "ORG_ZSTACK_AI_COLLECTOR_10001": "一部のデプロイ コンテキストに仮想マシンのインベントリがないため、MindIE メタデータの収集ができません。", + "ORG_ZSTACK_COMPUTE_HOST_10096": "IPMI によるホスト[%s]の電源リセットに失敗しました", + "ORG_ZSTACK_COMPUTE_HOST_10095": "IPMI による仮想マシンのモック電源リセットに失敗しました。[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10098": "ホスト[%s]が予期しない戻り値を受信しました", + "ORG_ZSTACK_COMPUTE_HOST_10097": "インスタンス %s のIPMI情報が不完全です。必要な詳細を確認して入力してください。", + "ORG_ZSTACK_COMPUTE_HOST_10092": "ホスト[%s]のインスタンスをIPMIでモック電源オンに失敗しました", + "ORG_ZSTACK_COMPUTE_HOST_10091": "IPMIによるホスト[%s]の電源オフに失敗しました。", + "ORG_ZSTACK_COMPUTE_HOST_10094": "インスタンスは既に電源オフしているため、ホスト[%s:%d]の再起動に失敗しました", + "ORG_ZSTACK_COMPUTE_HOST_10093": "IPMIによるホスト[%s]の電源オンに失敗しました。", + "ORG_ZSTACK_COMPUTE_HOST_10099": "ホスト[%s]はipmi[%s]との接続を確立できません。理由:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10002": "ディレクトリ[%s]のファイルのMD5チェックサムを確認できません。\\nstdout:%s\\nstderr:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10003": "ホスト[ip:%s]のフォルダ[%s]のファイルのMD5チェックサムを確認できません。\\nstdout:%s\\nstderr:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10000": "ユーザー名、パスポート、またはポート番号が正しくない可能性があります。確認して再度お試しください。", + "ORG_ZSTACK_COMPUTE_HOST_10065": "ホストネットワークラベルの更新に失敗しました [uuid:%s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10000": "アクセスキー、シークレットキーが正しくないか、IAMポリシーの権限が不足している可能性があります。 [error=%s]", + "ORG_ZSTACK_COMPUTE_HOST_10064": "ホストネットワークラベルの削除に失敗しました [uuid:%s]", + "ORG_ZSTACK_COMPUTE_HOST_10067": "IPアドレス形式が無効です[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10066": "ホスト [%s] は接続されていないため、電源オフはサポートされていません", + "ORG_ZSTACK_COMPUTE_HOST_10069": "IPセットが無効です。CIDR表記でネットマスクを指定する必要があります", + "ORG_ZSTACK_COMPUTE_HOST_10068": "サブネットマスク形式が無効です[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10073": "ボンディングスレーブインターフェースにIPアドレスを設定できません", + "ORG_ZSTACK_COMPUTE_HOST_10070": "管理ネットワークインターフェースにIPアドレスを設定できません。%s", + "ORG_ZSTACK_COMPUTE_HOST_10078": "管理ネットワークに関連するボンディングインターフェースにIPアドレスを設定できません", + "ORG_ZSTACK_COMPUTE_HOST_10077": "指定されたインターフェースUUIDが無効です", + "ORG_ZSTACK_IMAGE_10019": "アップロードセッションの有効期限が切れています。アップロードセッションがアクティブであることを確認して再度お試しください。", + "ORG_ZSTACK_IMAGE_10016": "管理ノードの再起動により失敗しました。", + "ORG_ZSTACK_IMAGE_10015": "イメージパスが承認リストにありません: %s", + "ORG_ZSTACK_IMAGE_10014": "このサーバーのすべてのインスタンスがイメージにアクセスできません", + "ORG_ZSTACK_IMAGE_10013": "イメージパス [%s] はブラックリスト %s に含まれています", + "ORG_ZSTACK_IMAGE_10012": "ソースファイルには絶対パスを指定する必要があります。ファイルのフルパスを入力してください。", + "ORG_ZSTACK_IMAGE_10011": "指定されたURLは 'file:///', 'http://', 'https://', 'ftp://', 'sftp://', '/' のいずれかで始まっている必要があります。", + "ORG_ZSTACK_IMAGE_10010": "uuids%s で指定されたバックアップストレージは追加可能なものがありません。ステータスが %s でなかったり、ステートが %s でなかったり、UUIDが無効なバックアップストレージUUIDです", + "ORG_ZSTACK_IMAGE_10009": "サポートされていないイメージ形式[%s]", + "ORG_ZSTACK_IMAGE_10008": "不明な形式[%s]", + "ORG_ZSTACK_IMAGE_10007": "ISOはシステムディスクイメージとして使用できません。", + "ORG_ZSTACK_IMAGE_10006": "ボリュームスナップショット[uuid:%s]は有効化されていません: %s", + "ORG_ZSTACK_IMAGE_10005": "ボリュームスナップショット[uuid:%s]はReadyではありません。状態は%sです", + "ORG_ZSTACK_IMAGE_10004": "ボリューム[uuid:%s]は有効化されていません。現在の状態: %s", + "ORG_ZSTACK_IMAGE_10003": "ボリューム[uuid:%s]はReadyではありません。状態: %s", + "ORG_ZSTACK_IMAGE_10002": "AArch64アーキテクチャはレガシー機能をサポートしていません。設定がAArch64アーキテクチャと互換性があることを確認してください。", + "ORG_ZSTACK_ALIYUN_ACCOUNT_10000": "[%s]への接続を%dミリ秒以内に確立できませんでした。これはAlibaba Cloud OpenAPIサービスにアクセスできないことを示しています。", + "ORG_ZSTACK_IMAGE_10039": "イメージ[uuid:%s, name:%s]の接続されたバックアップストレージが見つかりません", + "ORG_ZSTACK_IMAGE_10038": "UUID [uuid:%s]と名前[name:%s]を持つイメージは、どのバックアップストレージにも保存されていません", + "ORG_ZSTACK_IMAGE_10037": "すべてのバックアップストレージでボリューム[uuid:%s]からデータボリュームテンプレートの作成に失敗しました。エラーの原因については、いずれかのエラー原因を参照してください", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10041": "真偽値または別のConditionが必要です。現在のConditions: %s、実際には%s", + "ORG_ZSTACK_IMAGE_10036": "バックアップストレージ[uuid:%s]の割り当てに失敗しました。エラーの一覧: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10040": "EC2インスタンスがnullです!インスタンスIDが正しくnullでないことを確認してください。", + "ORG_ZSTACK_IMAGE_10035": "適切なバックアップストレージソリューションが見つかりません。クラウドストレージの設定が正しくアクセス可能であることを確認してください。", + "ORG_ZSTACK_IMAGE_10034": "すべてのバックアップストレージでルートボリューム[uuid:%s]からイメージの作成に失敗しました。いずれかのエラーの原因を確認してください", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10002": "ボリューム[uuid:%s]のストレージ移行中のイメージ[uuid:%s]ダウンロードにリソースが不足しています。必要な容量: %s、現在の空き物理容量: %s", + "ORG_ZSTACK_IMAGE_10032": "指定されたUUID%sのバックアップストレージを割り当てできません。エラーの一覧: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10003": "ボリューム [UUID: %s] のストレージ移行に容量が不十分です。必要な容量: %d、現在の空き物理容量: %d", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10004": "ソースPS[uuid: %s]のデータは破棄されており、ロールバックはサポートされていません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10005": "共有ブロックストレージ上のスナップショットなしのボリュームの移行はサポートされておらず、キャンセルすることはできません。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10000": "プライマリストレージ [%s] で migrate install パス [%s] のゴミID (%s) が見つかりました。ボリューム [%s] の移行を希望する場合は、まず 'APICleanUpTrashOnPrimaryStorageMsg' を使用してクリーンアップしてください。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10001": "UUID:%sのゾーンにUUID:%sの接続されたバックアップストレージでUUID:%sのイメージが見つかりません。以下のことを確認してください:", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10039": "1. バックアップストレージがUUID:%sのゾーンに接続されていることを確認してください。", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10032": "2. バックアップストレージが接続状態であることを確認してください。必要に応じて再接続を試みてください。", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10036": "Function内で定義できるのはメソッドのみですが、%sが見つかりました", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10035": "Fn::FindInMapがResourcesマップ内でリソース [%s] を見つけることができません!", + "ORG_ZSTACK_CORE_ERRORCODE_10007": "リファレンス [%s] が見つかりません!", + "ORG_ZSTACK_CORE_ERRORCODE_10005": "サポートされていない機能 [%s] はZStackリソーステンプレートでサポートされていません!", + "ORG_ZSTACK_IMAGE_10026": "クラウドリソースフィルタリングには'regex'または'category'の入力引数を指定する必要があります。", + "ORG_ZSTACK_CORE_ERRORCODE_10006": "詳細化コードは数値である必要があります!", + "ORG_ZSTACK_IMAGE_10025": "ソースイメージ [%s] は存在しません", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10051": "%s は CloudString に変換できません", + "ORG_ZSTACK_CORE_ERRORCODE_10003": "%s は有効なディレクトリではないか、空です", + "ORG_ZSTACK_CORE_ERRORCODE_10004": "テンプレートファイルの処理中に読み取りエラーが発生しました [%s]、原因: %s", + "ORG_ZSTACK_IMAGE_10023": "vm インスタンス [uuid:%s] にはルートボリュームがありません", + "ORG_ZSTACK_IMAGE_10022": "vm インスタンス [uuid:%s] にはアタッチされたボリュームがありません", + "ORG_ZSTACK_IMAGE_10021": "バックアップストレージ [uuid:%s] は接続状態ではありません、現在のステータスは %s です", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10042": "オブジェクトには 'true' または 'false' のブール値を期待しますが、%s が取得されました", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10046": "Fn::GetAtt はリソースリスト内に指定されたリソース [%s] を見つけることができません", + "ORG_ZSTACK_SSO_SAML2_SERVICE_10000": "iam2 には同名のユーザー [%s] が含まれています、期待されるタイプ [%s] ですが、タイプ [%s] が見つかりました", + "ORG_ZSTACK_COMPUTE_HOST_10119": "ホスト [%s] には IPMI デバイスが構成されていないか、IPMI デバイスにアドレスがありません。IPMI アドレスを構成した後、ホストを再接続して IPMI 情報を更新してください", + "ORG_ZSTACK_ZQL_AST_VISITORS_PLUGIN_10000": "合計するフィールドを指定する必要があります", + "ORG_ZSTACK_SSO_SAML2_SERVICE_10001": "タイプ [%s] の SAML ログイン [%s] が重複しています", + "ORG_ZSTACK_COMPUTE_HOST_10120": "ホスト [uuid:%s, name:%s, ip:%s] での vm [uuid:%s] の移行に失敗しました、グレースフルシャットダウンを試みます", + "ORG_ZSTACK_CORE_ERRORCODE_10001": "ソースファイルと JSON コンテンツを同時に空にすることはできません。有効なソースファイルを提供するか、JSON コンテンツを指定してください", + "ORG_ZSTACK_CORE_ERRORCODE_10002": "リソースディレクトリのスキャンに失敗しました: %s", + "ORG_ZSTACK_CORE_ERRORCODE_10000": "クラウドコンピューティングリソースの設定に対してファイルまたは入力コンテンツが提供されていません", + "ORG_ZSTACK_COMPUTE_HOST_10124": "ホスト接続試行が失敗しました、ping 要求がタイムアウトしました。ネットワーク接続を確認し、ホストが動作していることを確認してください", + "ORG_ZSTACK_COMPUTE_HOST_10104": "ハイパーバイザー [%s] 用の管理 IP [%s] を持つホストが検出されました", + "ORG_ZSTACK_COMPUTE_HOST_10103": "クラスタ [uuid:%s] には未定義のハイパーバイザータイプがあります", + "ORG_ZSTACK_COMPUTE_HOST_10106": "クラスタ [uuid:%s] のアーキテクチャは %s ですが、ホスト [name:%s, ip:%s] のアーキテクチャ %s と一致しません", + "ORG_ZSTACK_COMPUTE_HOST_10105": "接続後、ホスト [name:%s, ip:%s] は null 仮想アーキテクチャを返します", + "ORG_ZSTACK_COMPUTE_HOST_10100": "ホスト ipmi [%s] は %s のため到達できません", + "ORG_ZSTACK_COMPUTE_HOST_10102": "クラスタ [uuid:%s] は存在しません", + "ORG_ZSTACK_SCHEDULER_10008": "無効な時間単位が指定されました: %s", + "ORG_ZSTACK_SCHEDULER_10005": "ボリューム [%s] はスナップショット保持ポリシーをサポートしていません", + "ORG_ZSTACK_SCHEDULER_10006": "snapshotMaxNumber: 形式が正しくありません、原因: %s", + "ORG_ZSTACK_COMPUTE_HOST_10108": "システムホストネットワークサービスタイプ [%s] は終了できません", + "ORG_ZSTACK_COMPUTE_HOST_10107": "プライマリストレージ [uuid:%s] が切断され、ホストにはアタッチされたプライマリストレージリソースがなくなりました", + "ORG_ZSTACK_COMPUTE_HOST_10109": "仮想化設定の競合のため、システムホストネットワークサービスタイプ [%s] は更新できません", + "ORG_ZSTACK_SCHEDULER_10002": "前のタスクが正常に完了していません。このタスクをスキップします。", + "ORG_ZSTACK_COMPUTE_HOST_10114": "接続されていないホスト[uuid:%s, status:%s]を維持できません", + "ORG_ZSTACK_COMPUTE_HOST_10111": "WebSSHサーバーインスタンスがアクティブではありません。クラウドSSHサーバー(%s)が実行され、適切に設定されていることを確認してください。", + "ORG_ZSTACK_COMPUTE_HOST_10110": "ホストネットワークサービスタイプ[%s]が存在します", + "ORG_ZSTACK_COMPUTE_HOST_10113": "managementIp[%s]は有効なIPv4アドレスまたはホスト名ではありません", + "ORG_ZSTACK_COMPUTE_HOST_10112": "管理IP[%s]を持つホストが存在します", + "ORG_ZSTACK_SCHEDULER_10018": "VMはすでにタイプ[%s]のスケジュール済みジョブを持っています", + "ORG_ZSTACK_SCHEDULER_10016": "ルートボリューム[%s]のVMが利用できません。VMが存在することを確認してください。", + "ORG_ZSTACK_SCHEDULER_10017": "snapshotGroupMaxNumber: 形式が正しくありません。理由: %s", + "ORG_ZSTACK_SCHEDULER_10014": "ボリューム[%s]は利用できません。ボリュームが存在し、適切にアタッチされていることを確認してください。", + "ORG_ZSTACK_SCHEDULER_10015": "ボリューム[%s]はルートボリュームではありません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10068": "共有ブロックグループプライマリストレージ間の移行中に、migrateVolumeStructsにボリュームが見つかりません!", + "ORG_ZSTACK_SCHEDULER_10013": "クラウドインスタンス設定で、フィールド[%s]は空にできません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10067": "migrateVolumesBetweenSharedBlockGroupPrimaryStorageMsgのボリューム移行構造が空です!", + "ORG_ZSTACK_VPCFIREWALL_10027": "ルールセット[%s]にはすでにルール番号%sのルールが存在します", + "ORG_ZSTACK_IPSEC_10006": "ネットワーク[UUID: %s]にはIPsecサービスが有効になっていません", + "ORG_ZSTACK_VPCFIREWALL_10028": "ファイアウォールルール[%d]を追加できません。TCPまたはUDPプロトコルのみがポートを使用できます", + "ORG_ZSTACK_IPSEC_10007": "リモートCIDR[%s]は既存のCIDRと重複しています", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10000": "新規追加VM NICとアタッチ済みVM NICが同一の仮想ルーター上にありません。異なる仮想ルーター上にあり、UUIDは%sと%sです", + "ORG_ZSTACK_IPSEC_10008": "リモートCIDR[%s]とリモートCIDR[%s]が重複しています", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10001": "新規追加VM NIC[uuids:%s]とロードバランサー[uuid: %s]のVIPのピアL3ネットワーク[uuids:%s]が同一の仮想ルーター上にありません。異なる仮想ルーター上にあり、UUID[uuids:%s]です", + "ORG_ZSTACK_IPSEC_10009": "ローカルルーターのCIDR[%s]とリモートルーターのCIDR[%s]が重複しています", + "ORG_ZSTACK_IPSEC_10002": "現在のポート範囲[%s, %s]はVIP[uuid: %s]プロトコル: UDPの使用済みポート範囲[%s, %s]と重複しています", + "ORG_ZSTACK_IPSEC_10003": "アタッチされたL3ネットワーク[uuid:%s]のcidr[%s]は、uuid:%sのIPsecリモートcidr[%s]と重複しています", + "ORG_ZSTACK_VPCFIREWALL_10029": "ファイアウォールルール[%d]を追加できません。TCPプロトコルのみがTCPフラグを使用できます", + "ORG_ZSTACK_IPSEC_10005": "Javaコードのソースファイルが見つかりません。必要なファイルがアップロードされ、プロジェクトに含まれていることを確認してください。", + "ORG_ZSTACK_VPCFIREWALL_10020": "デフォルトのルールセットを別のネットワークインターフェースカードにアタッチできません", + "ORG_ZSTACK_IPSEC_10000": "IPsec接続[UUID:%s]が見つかりません。削除された可能性があります", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10006": "ロードバランサーリソースを共有するためにvmnicを指定する必要があります。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10073": "VM[UUID: %s]には追加のQMPソケットが構成されていません。これは、VMがグローバル設定[vm.additionalQmp]を有効にせずに起動したことが原因の可能性があります。この設定が有効になっていることを確認し、ZStackでVMを再起動してください。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10007": "ロードバランサー[uuid:%s]の仮想ルーターが見つかりません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10072": "プライマリストレージ[UUID: %s]にSCSI LUN [WWID: %s]が接続されています", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10071": "イメージフォーマットまたはボリュームフォーマット[%s]を処理するために、プライマリストレージ[uuid:%s]に適したハイパーバイザータイプが見つかりません", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10004": "ロードバランサー証明書を更新します。理由:%s", + "ORG_ZSTACK_VPCFIREWALL_10021": "ruleSet[%s]にはすでにl3[%s]が含まれています", + "ORG_ZSTACK_SCHEDULER_10009": "トリガージョブ[uuid: %s]が失敗しました。仮想マシンインスタンスのプロビジョニングプロセスでエラーが発生しました", + "ORG_ZSTACK_ZWATCH_MYSQL_10001": "MySQLデータベースインスタンスが見つかりません[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10005": "ロードバランサーリスナーを更新します。理由:%s", + "ORG_ZSTACK_VPCFIREWALL_10022": "同じ番号[%s]のルールがすでに存在します", + "ORG_ZSTACK_SCHEDULER_10029": "古いトリガー[uuid:%s]にジョブ[uuid:%s]を追加できません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10077": "共有ブロックグループプライマリストレージ上の共有ボリューム[uuid: %s]はリサイズできません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10076": "ボリューム[uuid: %s]が見つかりません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10075": "新しい共有ブロックグループ内の共有ブロックグループ[UUID:%s]に、共有ブロック[UUID:%s, diskUUID:%s, description:%s]がすでに存在します", + "ORG_ZSTACK_SCHEDULER_10028": "UUID [%s]の同じトリガーには、UUID [%s]のジョブを2回追加できません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10074": "プライマリストレージに共有ブロックグループを追加する場合は、少なくとも1つのディスクを指定する必要があります", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10079": "ボリューム[%s]の準備が見つかりません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10078": "共有ブロックグループプライマリストレージ上の共有ボリューム[UUID: %s]は、停止していないVMインスタンス[UUIDs: %s]に接続されています", + "ORG_ZSTACK_SCHEDULER_10021": "2回以上繰り返し操作にシンプルなスケジューラを使用する場合は、間隔を指定する必要があります", + "ORG_ZSTACK_VPCFIREWALL_10016": "クラウドコンピューティング環境では、TCPまたはUDPプロトコルのみがポートを使用できます", + "ORG_ZSTACK_VPCFIREWALL_10017": "TCPフラグを使用できるのはTCPプロトコルのみです", + "ORG_ZSTACK_IPSEC_10018": "VIP[uuid:%s]は%sインスタンスで使用されています", + "ORG_ZSTACK_VPCFIREWALL_10014": "ruleSet[%s]には同じ優先度%dのルールがすでに存在します", + "ORG_ZSTACK_IPSEC_10019": "ピアアドレス[%s]をVIPアドレスと同じにすることはできません", + "ORG_ZSTACK_VPCFIREWALL_10015": "デフォルトルール[%s]を更新できません", + "ORG_ZSTACK_IPSEC_10013": "同じIPsec接続内のすべてのネットワークは、同じバーチャルプライベートクラウド(VPC)ルーターに関連付けられている必要があります", + "ORG_ZSTACK_IPSEC_10014": "HAグループ%sの master VPCが存在しません", + "ORG_ZSTACK_VPCFIREWALL_10018": "ICMPプロトコルはICMPタイプを使用できる唯一のプロトコルです。正しいプロトコルを指定してください", + "ORG_ZSTACK_IPSEC_10015": "古いIPsecプラグインを使用しているVPC[%s]があります。IPsec接続を作成するにはアップグレードしてください", + "ORG_ZSTACK_VPCFIREWALL_10019": "ルール[%%s]の索引が無効です", + "ORG_ZSTACK_IPSEC_10016": "同じ仮想ルーターとピアアドレスを持つIPsec接続[uuid:%s, name:%s]がすでに存在します", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10080": "キャッシュボリュームとしてシックプロビジョニングストレージを使用する; ボリューム[%s]のプロビジョニングは%sです", + "ORG_ZSTACK_IPSEC_10010": "同じIPsec接続内のすべてのネットワークは同一タイプでなければなりません。", + "ORG_ZSTACK_IPSEC_10011": "IPsecConnectionは%sに対して1つのネットワークのみ持つことができます", + "ORG_ZSTACK_IPSEC_10012": "L3Network [UUID: %s]はVPCルータに接続されていません", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10084": "ボリューム%sのクラスタUUIDを取得できません", + "ORG_ZSTACK_VPCFIREWALL_10010": "すでにルールテンプレート名が%sで存在しています", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10081": "UUID [%s]およびWWID [%s]のSCSI LUNは、すでにUUID [%s]のプライマリストレージに接続されています。", + "ORG_ZSTACK_SCHEDULER_10038": "無効なcron表現形式です。標準のCRON構文に従っていることを確認してください。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10086": "共有ブロックグループプライマリストレージ[uuid: %s]の適切なKVMホストが見つかりません", + "ORG_ZSTACK_SCHEDULER_10039": "cronタスクは次の形式に従う必要があります: \"0 0/3 17-23 * * ?\"", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10085": "sanlockはホスト%sが%sで到達不能であることを示しています", + "ORG_ZSTACK_SCHEDULER_10036": "stopTimeが仮想環境内の現在時刻を超えています。stopTimeが将来の日時に設定されていることを確認してください。", + "ORG_ZSTACK_SCHEDULER_10037": "cronスケジューラを使用する場合、cronを設定する必要があります", + "ORG_ZSTACK_SCHEDULER_10034": "持続時間が有効な範囲外です", + "ORG_ZSTACK_SCHEDULER_10035": "stopTimeがMySQLタイムスタンプ形式の有効な範囲を超えています", + "ORG_ZSTACK_SCHEDULER_10032": "シンプルスケジューラが正しく機能するためにはstartTimeを指定する必要があります", + "ORG_ZSTACK_SCHEDULER_10033": "シンプルスケジョーラが正しく機能するためにはschedulerIntervalを設定する必要があります", + "ORG_ZSTACK_SCHEDULER_10030": "トリガーが[uuid:%s]のjobに追加されました[%d]個、最大許容数を超えています", + "ORG_ZSTACK_SCHEDULER_10031": "トリガーが[UUID:%s]のjobグループに追加されました[%d]個、これ以上追加できません", + "ORG_ZSTACK_VPCFIREWALL_10005": "ルーター[uuid:%s]にはマスタールーターがありません", + "ORG_ZSTACK_VPCFIREWALL_10006": "VPC Router[uuid:%s]にはすでにファイアウォールが設定されています。", + "ORG_ZSTACK_VPCFIREWALL_10003": "システムデフォルトルールセットは削除できません", + "ORG_ZSTACK_VPCFIREWALL_10004": "デフォルトのシステムルールは削除できません", + "ORG_ZSTACK_VPCFIREWALL_10001": "アクションタイプを変更できるのはシステム定義のルールセットのみです。", + "ORG_ZSTACK_VPCFIREWALL_10000": "仮想ネットワーク内のデフォルトルールセットは切り離せません", + "ORG_ZSTACK_SCHEDULER_10045": "jobグループには%d個のタスクが含まれており、残りのスロットは%dです", + "ORG_ZSTACK_SCHEDULER_10043": "型[%s]のScheduler Job Factoryが見つかりません", + "ORG_ZSTACK_SCHEDULER_10044": "%d個のタスクがjobグループとは異なるインスタンスタイプを持っています", + "ORG_ZSTACK_SCHEDULER_10041": "startTimeは正の整数または0でなければなりません", + "ORG_ZSTACK_SCHEDULER_10042": "指定されたインスタンスの開始時間が範囲外です。有効なパラメータ内に収まっていることを確認してください。", + "ORG_ZSTACK_SCHEDULER_10040": "Cronスケジューラの設定は、cronタスクの式を指定するだけで済みます。", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10005": "クラウドリソース割り当てのために、zboxを管理ノードに統合してください。", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10006": "データベースのバックアップに失敗しました: %s", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10003": "サービス[%s]はアクティブではありません", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10007": "復旧モードに別の外部バックアップ[UUID: %s]が存在します。", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10002": "サービス[%s]は設定の再読み込みをサポートしていません", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10008": "ホストUUIDとバックアップストレージUUIDの両方が空です。少なくとも一方を指定する必要があります。", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10001": "サービス[%s]は検出されていません", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10001": "一部のボリューム復旧[uuids:%s]に失敗しました。再接続することで再トリガーできます。", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10000": "サービス[%s]が登録され、クラウド環境でアクティブになりました。", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10002": "zboxバックアップインストールディレクトリの下に復旧設定ファイルrecover.confが見つかりません。", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10004": "Zboxはまずホストに接続する必要があります。", + "ORG_ZSTACK_VPCFIREWALL_10069": "UUID: %sのVPCファイアウォールIPセットテンプレートが見つかりません。削除された可能性があります。", + "ORG_ZSTACK_VPCFIREWALL_10063": "仮想ネットワーク設定に関するエラーにより、ファイアウォールルールセット[%s]の接続に失敗しました", + "ORG_ZSTACK_VPCFIREWALL_10064": "ルールセットの接続解除に失敗しました。おそらく削除のためです", + "ORG_ZSTACK_VPCFIREWALL_10061": "vRouter[%s]でのファイアウォールルールの削除に失敗しました。原因是%s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10010": "Fn::Selectのインデックスが範囲外です。JSON設定を確認してください!", + "ORG_ZSTACK_VPCFIREWALL_10062": "vRouter[%s]でのファイアウォールルール状態の変更に失敗しました。原因是%s", + "ORG_ZSTACK_VPCFIREWALL_10067": "UUID: %sに関連するVPCファイアウォールが見つかりません", + "ORG_ZSTACK_VPCFIREWALL_10068": "UUID: %sのVPCファイアウォールルールセットが見つかりません。削除された可能性があります。", + "ORG_ZSTACK_VPCFIREWALL_10065": "ファイアウォールルールセット[%s]の接続解除に失敗しました。原因是%s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10014": "パラメータ[%s]が見つかりません!", + "ORG_ZSTACK_VPCFIREWALL_10066": "UUID: %sのVPCファイアウォールが見つかりません。削除された可能性があります。", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10013": "パラメータ[%s]には指定値またはデフォルト値が見つかりません!", + "ORG_ZSTACK_VPCFIREWALL_10060": "ファイアウォールルールセット[%s]の作成に失敗しました。原因是%s", + "ORG_ZSTACK_IMAGE_10046": "UUID [uuid:%s]、名前[name:%s]の画像は、UUID [uuid:%s]のバックアップストレージから削除されていません。", + "ORG_ZSTACK_IMAGE_10045": "UUID [uuid:%s]、名前[name:%s]の画像は、UUID [uuid:%s]のバックアップストレージで利用できません。", + "ORG_ZSTACK_IMAGE_10044": "UUID [uuid:%s]、名前[name:%s]の画像は、どのバックアップストレージからも削除されていません。", + "ORG_ZSTACK_IMAGE_10043": "UUID [uuid:%s]、名前[name:%s]の画像は、UUID [backup storage uuid:%s]のバックアップストレージでステータス[status:%s]になっていますが、Deletedではありません。", + "ORG_ZSTACK_IMAGE_10040": "uuid=%sのISOの接続解除に失敗しました。エラーは%sです", + "ORG_ZSTACK_VPCFIREWALL_10058": "vRouter[%s]のファイアウォールルールを削除します。理由: %s", + "ORG_ZSTACK_VPCFIREWALL_10052": "デフォルトルールセット%sは1つのインターフェースフォワードにのみアタッチ可能ですが、複数の関連インターフェースが見つかりました: %s", + "ORG_ZSTACK_VPCFIREWALL_10050": "ファイアウォール%sに関連するVPCは実行状態ではありません", + "ORG_ZSTACK_VPCFIREWALL_10051": "ルールセット[%s]はネットワークインターフェースカードにまだアタッチされているため削除できません", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10020": "'Conditions'リスト内に条件[%s]が見つかりません", + "ORG_ZSTACK_VPCFIREWALL_10056": "vRouter[%s]上のl3[%]に関連するMACアドレスが見つかりません", + "ORG_ZSTACK_VPCFIREWALL_10057": "ファイアウォールルール[%s]の作成に失敗しました。理由: %s", + "ORG_ZSTACK_VPCFIREWALL_10054": "ファイアウォール設定の同期に失敗しました。理由: %s", + "ORG_ZSTACK_VPCFIREWALL_10055": "ファイアウォールルールセットアクションの更新に失敗しました。理由: %s", + "ORG_ZSTACK_VPCFIREWALL_10049": "ルールセット%sに変更が検出されませんでした", + "ORG_ZSTACK_VPCFIREWALL_10047": "ネットワーク[%s]からのファイアウォールルールセットdetachに失敗しました。理由: %s", + "ORG_ZSTACK_VPCFIREWALL_10048": "ファイアウォール%s、l3%s、forward%sで重複するルール番号%sが見つかりました", + "ORG_ZSTACK_SSO_CAS_SERVICE_10002": "iam2に同名のユーザー[%s]が含まれています", + "ORG_ZSTACK_SSO_CAS_SERVICE_10003": "ユーザータイプ[%s]の重複ログイン試行", + "ORG_ZSTACK_SSO_CAS_SERVICE_10004": "タイプ(%s)のCasLoginが見つかりません", + "ORG_ZSTACK_VPCFIREWALL_10041": "ルール番号%dの説明文の長さが%sで無効なため、ファイアウォールルールを追加できませんでした", + "ORG_ZSTACK_VPCFIREWALL_10040": "ルール番号:%dの状態が存在しないため、ファイアウォールルールを追加できませんでした", + "ORG_ZSTACK_VPCFIREWALL_10045": "設定ファイルのファイアウォールルールに構文エラーが含まれています: %s", + "ORG_ZSTACK_VPCFIREWALL_10046": "ファイアウォールルールセット[%s]をレイヤー3ネットワーク[%s]にアタッチできませんでした。理由: %s", + "ORG_ZSTACK_VPCFIREWALL_10044": "仮想マシンインスタンスの設定ファイルに形式エラーがあります。ファイルを Required Schema に準拠しているか確認してください。", + "ORG_ZSTACK_VPCFIREWALL_10038": "ソースIPの長さ:%sがルール番号:%dで無効なため、ファイアウォールルールを追加できませんでした", + "ORG_ZSTACK_VPCFIREWALL_10039": "送信先IPの長さ:%sがルール番号:%dで無効なため、ファイアウォールルールを追加できませんでした", + "ORG_ZSTACK_VPCFIREWALL_10036": "ルール番号%dが無効なため、ファイアウォールルールを追加できませんでした", + "ORG_ZSTACK_VPCFIREWALL_10037": "ルール番号:%dに定義されたアクションが存在しないため、ファイアウォールルールを追加できませんでした", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10002": "vyos初期化コマンドが失敗しました。理由:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10001": "SSH設定後、仮想ルーター[%s]へのSSH接続を確立できませんでした", + "ORG_ZSTACK_VPCFIREWALL_10030": "ICMPプロトコルのみが特定のタイプをサポートするため、ファイアウォールルール[%d]を追加できませんでした", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10003": "仮想ルーター[uuid:%s]のネットワークインターフェース[ip:%s, mac:%s]のファイアウォールデフォルトアクション変更に失敗しました。理由: %s", + "ORG_ZSTACK_VPCFIREWALL_10031": "ポートベースのルールはTCPまたはUDPプロトコルのみがサポートされているため、ファイアウォールルール[%d]を追加できませんでした", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10006": "仮想ルーターVM[uuid:%s]でDHCPサーバーを起動できませんでした。理由: %s", + "ORG_ZSTACK_ZWATCH_FUNCTION_10014": "クラウドフォーメーションテンプレートでインスタンスタイプの必須引数が不足しています", + "ORG_ZSTACK_ZWATCH_FUNCTION_10013": "不明な引数が検出されました。すべてのコマンドラインパラメータが有効であることを確認し、許可される引数の一覧についてはドキュメントを参照してください。", + "ORG_ZSTACK_VPCFIREWALL_10034": "この環境ではTCPプロトコルのみがTCPフラグをサポートするため、ファイアウォールルール[%d]を追加できませんでした", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10007": "仮想ルーターインスタンス[uuid:%s]上のDHCPサーバーを停止できません。理由は%s", + "ORG_ZSTACK_VPCFIREWALL_10035": "%sエラーのため、ファイアウォールルール[%d]を追加できませんでした", + "ORG_ZSTACK_PCIDEVICE_10056": "VM[UUID:%s]の起動に失敗しました。すべてのPCIデバイス[UUIDs:%s]が存在しないため", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10011": "タイプは %s ですが、予期されたタイプは %s です", + "ORG_ZSTACK_PCIDEVICE_10053": "指定されたPCIデバイスは同じ場所にありません: UUID [%s] のPCIデバイスはUUID [%s] のホスト上にありますが、別のPCIデバイスUUID [%s] はUUID [%s] の異なるホスト上にあります", + "ORG_ZSTACK_IAM2_10024": "元のパスワードと一致しません。仮想マシンID [uuid:%s] のパスワードを更新できません。", + "ORG_ZSTACK_IAM2_10008": "virtualID[uuid:%s]はプロジェクト[uuid:%s]内に存在しません", + "ORG_ZSTACK_IAM2_10021": "ユーザー[%s]は登録されたプラットフォームユーザーではありません", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10015": "以前のプロパティファイルリソースセットが見つかりません!", + "ORG_ZSTACK_IAM2_10023": "管理者および仮想インスタンス本身のみが更新を実行できます", + "ORG_ZSTACK_PCIDEVICE_10050": "VM[%s]からすべてのGPUデバイスを取り外してから、再試行してください", + "ORG_ZSTACK_PCIDEVICE_10062": "PCIデバイス[uuid:%s]のIOMMUグループに問題があります", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10014": "不正なJSON形式です。原因: %s", + "ORG_ZSTACK_PCIDEVICE_10068": "PCIデバイスが接続されているため、ルートボリューム[uuid:%s]を移行できません", + "ORG_ZSTACK_PCIDEVICE_10061": "仮想マシン[uuid:%s]の宛先ホスト[uuid:%s]に仕様[uuid:%s]の十分なPCIデバイスが見つかりません", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10003": "ID: %sのバックアップストレージプラグインが登録されていません", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10017": "指定された動詞には名前空間とメソッドを示す'::'を含める必要があります!", + "ORG_ZSTACK_PCIDEVICE_10051": "VM[%s]のすべてのGPUデバイスのアンマウントを行い、再度お試しください", + "ORG_ZSTACK_PCIDEVICE_10065": "vm[%s]インスタンスが存在しません。PCIデバイス[%s]にバインドできません", + "ORG_ZSTACK_PCIDEVICE_10066": "PCIデバイスが接続されているため、VM[UUID:%s]を移行できません", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10013": "CloudFormationテンプレートにルート要素が見つかりません。テンプレート定義を確認してください!", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10028": "シークレットキーの解析に失敗しました、エラー: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10012": "無効なデコーダー: %s!", + "ORG_ZSTACK_IAM2_10022": "現在の仮想インスタンス [ID: %s] は期限切れです。再度アクティブ化してください。", + "ORG_ZSTACK_IAM2_10020": "アカウント[uuid:%s]のクオータ[name:%s]を%dに設定できません。組織[uuid:%s]のクオータを超過するためです。", + "ORG_ZSTACK_PCIDEVICE_10059": "pciデバイス [uuid:%s] はステータスが不正なため、vm [uuid:%s] に取り付けできません", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10016": "無効な動的変数参照です。${variable:default}の形式で指定してください", + "ORG_ZSTACK_PCIDEVICE_10064": "ホストリソース割り当ての問題により、PCIデバイス[uuid:%s]をVM [uuid:%s]に接続できません", + "ORG_ZSTACK_PCIDEVICE_10063": "PCIデバイス[%s]がすべて使用可能ではありません", + "ORG_ZSTACK_PCIDEVICE_10058": "ホスト [%s] のメンテナンスモードへの移行に失敗しました。PCIデバイスの存在により、VM [%s] は自動移行できません。", + "ORG_ZSTACK_PCIDEVICE_10052": "VM[%s]の他のPCIデバイスを取り外してから、再試行してください", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10024": "大規模ファイルのHMAC暗号化に失敗しました、コード: %s、詳細: %s" +} \ No newline at end of file diff --git a/conf/i18n/globalErrorCodeMapping/global-error-ko-KR.json b/conf/i18n/globalErrorCodeMapping/global-error-ko-KR.json new file mode 100644 index 00000000000..c73d9f274a1 --- /dev/null +++ b/conf/i18n/globalErrorCodeMapping/global-error-ko-KR.json @@ -0,0 +1,4717 @@ +{ + "ORG_ZSTACK_XINFINI_SDK_10001": "API 응답을 클래스[%s]로 포맷 실패, 결과 문자열: %s, 예외: %s", + "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10001": "여기서 지원되지 않는 데이터센터 타입 [%s]입니다!", + "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10000": "%s 구성 타입에 대해 'endpoint' 인수가 설정되어야 합니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10080": "Baremetal2 인스턴스 생성에서 적절한 컴퓨트 존을 확인할 수 없습니다. 명시적으로 존을 지정해 주세요.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10084": "베어메탈 인스턴스 생성 시 chassis UUID도 chassis offering UUID도 설정되지 않았습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10082": "chassis에 이미지[%s]를 위한 충분한 용량이 없습니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10081": "필요한 디스크[%s]가 chassis[%s]에 속해 있지 않습니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10087": "Baremetal2 인스턴스가 Running 상태일 때만 %s을 생성하거나 삭제할 수 있습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10086": "%s은 생성 또는 삭제 작업으로만 관리할 수 있습니다", + "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10000": "잘못된 입력 형식입니다. 숫자의 쉼표로 구분된 목록만 허용됩니다 (예: %s).", + "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10001": "호스트 VM에 사용 가능한 CPU가 %개만 있습니다.", + "ORG_ZSTACK_ZWATCH_UTILS_10001": "resource[%s]는 zwatch return 절을 지원하지 않습니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10002": "ID 인증 기능이 활성화되어 있지만 연결된 리소스 풀이 구성되어 있지 않습니다. 리소스 풀을 구성하고 다시 시도해 주세요.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10003": "사용 중인 리소스 풀 %s은 해제할 수 없습니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10000": "활성화할 수 있는 가상 머신이 없습니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10001": "잘못된 토큰 타입 %s, 클라우드 컴퓨팅 환경에서 사용되는 토큰 타입만 지원합니다.", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10059": "승인된 노드에 대한 빈 라이선스가 필요합니다", + "ORG_ZSTACK_STORAGE_PRIMARY_10039": "기본 스토리지[uuid:%s]가 존재하지 않습니다", + "ORG_ZSTACK_V2V_10019": "UUID:%s의 기본 스토리지는 가상 머신 마이그레이션 v2v에 지원되지 않습니다", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10007": "상태 이벤트 [%s]로 인해 볼륨 스냅샷 [uuid:%s, name:%s] 전환 실패", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10006": "기본 스토리지[uuid:%s]에서 볼륨[uuid:%s, installPath:%s] 크기를 검색하지 못함, 원인: %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10005": "기본 스토리지[uuid:%s]에서 볼륨[uuid:%s, installPath:%s] 크기를 검색하지 못함, %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10004": "vm[uuid:%s]은 Running, Paused, Destroyed, 또는 Stopped 상태가 아닙니다; 현재 상태[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_10040": "기본 스토리지[uuid=%s]가 클라우드 환경에 존재하지 않습니다", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10003": "볼륨 UUID: %s에 대한 볼륨을 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10002": "스냅샷 또는 그 하위 항목이 볼륨[uuids:%s]을 참조하고 있습니다", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10001": "볼륨 스냅샷 [uuid:%s, name:%s]을 찾을 수 없습니다, 이전 작업에서 삭제되었을 수 있습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_10047": "cidr[%s] 잘못된 입력 형식", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10050": "ZSha2가 다른 관리 노드의 존재를 나타내지만 이 노드가 데이터베이스에서 발견되지 않습니다. 관리 노드의 존재를 확인해 주세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_10046": "기본 스토리지 CIDR 시스템 태그는 하나만 허용되지만 %d개를 찾았습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_10049": "clusterUuid 충돌: 인스턴스 오퍼링에서 지정한 클러스터가 %s이며, 생성 파라미터에서 지정한 클러스터가 %s입니다", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10052": "등록 취소할 App ID를 찾을 수 없습니다! App ID를 확인하고 다시 시도하세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_10042": "리소스를 프로비저닝하기 전에 인스턴스 유형과 원하는 스토리지를 지정하세요.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10008": "볼륨[uuid:%s]을 스냅샷[uuid:%s]으로 재설정할 수 없습니다, vm[uuid:%s] 볼륨이 Stopped 상태가 아니며, 현재 상태는 %s입니다", + "ORG_ZSTACK_STORAGE_PRIMARY_10044": "적합한 기본 스토리지를 찾을 수 없습니다; 오류: %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10000": "그룹 상태 업데이트 실패: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10050": "primaryStorageUuid 충돌: 인스턴스 오퍼링에서 지정한 기본 스토리지가 %s이며, 생성 파라미터에서 지정한 기본 스토리지가 %s입니다", + "ORG_ZSTACK_V2V_10008": "네트워크[%s]에서 동일한 MAC 주소 [%s]가 허용되지 않습니다", + "ORG_ZSTACK_V2V_10009": "네트워크[%s]에서 중복된 MAC 주소 [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_10052": "primaryStorageUuid 충돌: 디스크 오퍼링에서 지정한 기본 스토리지가 %s이며, 생성 파라미터에서 지정한 기본 스토리지가 %s입니다", + "ORG_ZSTACK_V2V_10006": "변환 호스트[uuid:%s]의 기본 컴퓨팅 인스턴스가 Connected 상태여야 합니다", + "ORG_ZSTACK_V2V_10007": "변환 호스트[uuid:%s]가 기본 스토리지[uuid:%s]에 연결을 수립할 수 없습니다", + "ORG_ZSTACK_V2V_10004": "VM 인스턴스[UUID:%s]가 존재하지 않거나 VMware VM 인스턴스가 아닙니다", + "ORG_ZSTACK_V2V_10005": "conversionHostUuid는 null이 아니어야 합니다. 유효한 호스트 UUID가 제공되었는지 확인하세요.", + "ORG_ZSTACK_V2V_10002": "v2v 변환 호스트 스토리지 경로는 절대 경로여야 합니다. 유효한 절대 경로를 제공하세요.", + "ORG_ZSTACK_V2V_10003": "잘못된 v2V URL: %s", + "ORG_ZSTACK_V2V_10000": "클라우드 배포를 진행하기 전에 호스트[uuid:%s]의 상태가 Connected여야 합니다.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10021": "메모리 스냅샷을 생성할 수 없습니다, 예상되는 VM 상태는 [%s, %s]입니다", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10020": "볼륨 스냅샷[uuids:%s]이 비활성화된 상태이며 볼륨 복원에 사용할 수 없습니다.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10029": "삭제 작업을 취소하지 못했습니다. 볼륨[uuid:%s]이 연결된 VM이 %s 상태가 아닙니다; 오프라인 스냅샷 삭제는 지원되지 않으며 취소할 수 없습니다.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10028": "삭제 작업을 취소하지 못했습니다. 볼륨[uuid:%s]이 존재하지 않는 가상 머신과 연결되어 있습니다; 오프라인 스냅샷 삭제는 취소를 지원하지 않습니다.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10027": "삭제 작업을 취소하지 못했습니다. 볼륨[uuid:%s]이 어떤 VM에도 연결되어 있지 않으며, 오프라인 스냅샷 삭제는 취소를 지원하지 않습니다.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10026": "삭제 작업을 취소하지 못했습니다. 볼륨[uuid:%s]이 존재하지 않습니다.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10025": "스냅샷[uuid: %s]의 볼륨 UUID를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10024": "서로 다른 볼륨에서 스냅샷 삭제는 지원되지 않습니다 [UUID: %s, %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10023": "스냅샷의 원본 볼륨[uuid:%s]이 삭제되었습니다; 볼륨을 원래 상태로 복원할 수 없습니다", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10022": "볼륨 스냅샷[uuid:%s]이 현재 %s 상태이며 볼륨 복원에 사용할 수 없습니다", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10018": "스냅샷을 찾을 수 없습니다: %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10017": "기본 스토리지[uuid:%s]가 볼륨 스냅샷을 지원하지 않습니다; 따라서 볼륨[uuid:%s]의 스냅샷을 생성할 수 없습니다.", + "ORG_ZSTACK_YUNSHAN_UTIL_10000": "NSP URL이 null입니다. 클라우드 컴퓨팅 서비스 NSP를 구성하세요.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10016": "볼륨 스냅샷 기능을 위해 기본 스토리지 [uuid:%s]를 요청할 수 없습니다", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10015": "기본 스토리지 [%s]의 유형을 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10012": "볼륨 [UUID:%s]에 대해 지원되지 않는 최대 스냅샷 수 (%d)", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10027": "SanSecClientFactory 연결 테스트 실패", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10019": "이 리소스 유형 %s는 메모리 스냅샷 참조 쿼리를 지원하지 않습니다", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10007": "panguPartitionUuid [%s]가 identityZoneUuid [%s]와 일치하지 않습니다", + "ORG_ZSTACK_APPLIANCEVM_10006": "어플라이언스 vm[uuid:%s]가 %s 상태에 있어 %s에 HTTP 호출을 할 수 없습니다", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10006": "panguPartitionUuid 또는 identityZoneUuid를 지정해야 합니다.", + "ORG_ZSTACK_AI_10120": "클라우드 환경에서 모델 센터 [uuid:%s]를 찾을 수 없습니다", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10008": "Aliyun Ebs 기본 스토리지 인스턴스가 여전히 포함되어 있으므로 아이덴티티 영역 [%s]를 삭제할 수 없습니다. 먼저 모든 관련 스토리지 리소스가 삭제되었는지 확인하십시오.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10061": "프로토콜 [%s]가 빈 대상 포트 범위를 허용하지 않으므로 보안 그룹 규칙을 수정할 수 없습니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10060": "지정된 프로토콜 [%s]가 대상 포트 범위 설정을 지원하지 않으므로 보안 그룹 규칙을 수정할 수 없습니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10063": "UUID %s인 데이터베이스에 동일한 규칙 [%s]가 이미 존재하므로 보안 그룹 규칙을 수정할 수 없습니다", + "ORG_ZSTACK_APPLIANCEVM_10000": "어플라이언스 부트스트랩 정보를 설정하는 동안 오류 발생:%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10062": "지정된 프로토콜 [%s]가 대상 포트 범위 설정이 필요하므로 보안 그룹 규칙을 수정할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10033": "NFV 인스턴스 그룹 [%s]에서 사용 중이므로 인스턴스 오퍼링 [uuid:%s]을 삭제할 수 없습니다", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10001": "ALIYUN EBS는 현재 실행 중인 VM의 크기 조정을 지원하지 않습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10031": "상태가 초기화가 아닌 경우 NFV 인스턴스 그룹 [uuid:%s, name:%s]을 프로비저닝할 수 없습니다.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10000": "볼륨 %s에서 장치 경로를 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10032": "멤버 인스턴스가 없는 NfvInstanceGroup[uuid:%s, name:%s]을 프로비저닝할 수 없습니다. 프로비저닝 전에 그룹 내에 최소 하나 이상의 NFV 인스턴스를 생성하십시오.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10003": "ISO [%s]가 연결되어 있습니다. 다시 연결하기 전에 분리하십시오.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10006": "잘못된 CPU [CPU_ID], 지정된 ID [%s]의 CPU가 호스트 [HOST_UUID]에 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10030": "가상 IP가 구성되지 않은 NfvInstanceGroup[uuid:%s, name:%s]을 프로비저닝할 수 없습니다. 프로비저닝 전에 그룹에 가상 IP를 구성하십시오.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10005": "URL은 http:// 또는 https://로 시작해야 하지만 %s입니다", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10004": "Alibaba Cloud EBS 기본 스토리지에 대해 Ocean 엔드포인트 URL을 구성해야 합니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10019": "리소스의 이름[%s]이 잘못되었습니다. 이름은 다음 요구사항을 충족해야 합니다:", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10013": "- 1자 이상 128자 이하", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10012": "- 대문자, 소문자, 숫자, 밑줄(_), 하이픈(-) 포함", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10018": "- 알파벳 문자(글자)로 시작", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10028": "- 공백으로 시작하거나 끝나지 않음", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10017": "클러스터[uuid:%s]에서 BareMetal2 게이트웨이를 찾을 수 없습니다", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10010": "새로운 CloudFile[%s] 생성 실패", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10029": "NfvInstanceGroup [uuid:%s]을 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10026": "NFV 인스턴스[uuid:%s]를 그룹[uuid:%s, name:%s]에서 분리할 수 없습니다. 해당 인스턴스가 유일한 멤버입니다. 그룹은 최소 하나의 멤버를 포함해야 합니다.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10027": "NFV 인스턴스[uuid:%s]를 그룹[uuid:%s, name:%s]에서 분리할 수 없습니다. 해당 인스턴스가 유일한 실행 중 멤버입니다. 최소 하나 이상의 추가 멤버가 실행 중 상태여야 합니다.", + "ORG_ZSTACK_AI_10129": "토큰의 %s에서 예상치 못한 null 값을 받았습니다: %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10024": "NFV 인스턴스 [uuid:%s]을 찾을 수 없습니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10016": "클라우드 리소스 유효성 검사를 위한 %s 서명 검증 실패", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10025": "NFV 인스턴스[uuid:%s]를 그룹[uuid:%s, name:%s]에서 연결 해제할 수 없습니다. 현재 연결되어 있지 않습니다. 현재 상태 상세 정보: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10003": "백업 스토리지[UUID: %s]가 기본 스토리지[UUID: %s]가 속한 영역[UUID: %s]과 연결되어 있지 않습니다", + "ORG_ZSTACK_AI_10127": "mode 매개변수는 비어 있을 수 없습니다. 유효한 mode 값을 제공하십시오.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10011": "베어메탈 인스턴스[uuid:%s]를 위해 클러스터[uuids:%s]에서 컴퓨트 노드 할당 실패", + "ORG_ZSTACK_AI_10128": "현재 허용되는 값은 ['%s']입니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10010": "베어메탈 인스턴스[uuid:%s]를 위해 클러스터[uuids:%s]에서 게이트웨이 할당 실패", + "ORG_ZSTACK_AI_10125": "잘못된 모델 분류: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10004": "볼륨[uuid:%s]이 실행 중인 VM에 연결되어 있습니다. 볼륨을 연결하기 전에 VM을 중지해야 합니다.", + "ORG_ZSTACK_AI_10126": "ModelServiceVO[uuid: %s]에 저장된 잘못된 구성: %s", + "ORG_ZSTACK_AI_10123": "UUID: %s인 모델 센터를 찾을 수 없습니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10015": "프로비저닝된 IP %s가 DHCP 범위 %s ~ %s를 벗어났습니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10014": "프로비저닝된 IP %s가 다른 인스턴스에서 사용 중입니다", + "ORG_ZSTACK_AI_10121": "모델 센터 인스턴스를 찾을 수 없습니다. 먼저 모델 센터 인스턴스를 생성하십시오.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10013": "섀시와 게이트웨이 요구 사항을 충족하는 BareMetal2 클러스터[UUID:%s]만 있지만, 이러한 클러스터에는 프로비저닝된 네트워크가 연결되어 있지 않습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_10000": "비활성화된 기본 스토리지[uuid:%s]에 ISO를 연결할 수 없습니다", + "ORG_ZSTACK_AI_10122": "ModelServiceInstanceGroupVO[uuid: %s]의 시스템 태그 생성 실패: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10012": "클러스터[uuid:%s]에서 baremetal2 노드를 찾을 수 없습니다", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10019": "잘못된 설치 경로: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10010": "볼륨 ID: %s를 추가하려고 하지만 URL에 이미 다른 볼륨 ID가 존재합니다: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10012": "hostUuid [%s]가 URL에 이미 존재합니다: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10014": "잘못된 설치 URL: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10015": "호스트에서 장치 경로를 찾을 수 없습니다: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10008": "베어메탈2 컴퓨트 클러스터를 찾을 수 없습니다", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10002": "vm[uuid:%s]에 대해 호스트[uuid:%s]에서 vHost User Client를 생성하지 못함: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10007": "사용할 베어메탈2 클러스터를 결정하기 위한 정보가 부족합니다.%s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10006": "영역 [uuid:%s]에 연결된 백업 스토리지에 ISO [uuid:%s]가 포함되어 있지 않습니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10005": "연결된 백업 스토리지에서 UUID [%s]가 있는 이미지를 찾을 수 없습니다. 다음을 확인하세요:\\n1. [%s]라는 이름의 VM(가상 머신)이 UUID [%s]로 상주하는 영역에 백업 스토리지가 연결되어 있는지 확인합니다.\\n2. 백업 스토리지가 연결 상태인지 확인합니다. 연결되지 않은 경우 재연결을 시도하세요.", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10000": "vm[uuid:%s]에 대해 호스트[uuid:%s]에서 vHost User Client를 삭제하지 못함: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10009": "베어메탈 인스턴스 [uuid:%s]에 대해 클러스터 [uuids:%s]에서 주 스토리지를 할당하지 못함", + "ORG_ZSTACK_STORAGE_PRIMARY_10014": "UUID:%s인 주 스토리지는 여전히 클러스터 UUID:%s에 연결되어 있으므로 삭제할 수 없습니다", + "ORG_ZSTACK_AI_10116": "클라우드 환경에서 서비스 인스턴스 그룹을 찾을 수 없습니다. 구성을 확인하세요.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10000": "베어메탈2 인스턴스[uuid:%s]가 존재하지 않거나 연결되어 있지 않습니다. 따라서 비밀번호를 변경할 수 없습니다.", + "ORG_ZSTACK_AI_10117": "UUID [%s]가 있는 데이터세트를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_10016": "유지보수 중인 주 스토리지를 가진 볼륨[uuid:%s]을 연결할 수 없습니다", + "ORG_ZSTACK_AI_10114": "모델 서비스 인스턴스 그룹 [UUID: %s]을 찾을 수 없음; 서비스 시작 대기 활성성 확인 중단", + "ORG_ZSTACK_AI_10115": "'그룹 UUID' 또는 '전체 동기화'를 제공해야 합니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10004": "영역 UUID [%s]에 연결된 백업 스토리지에서 UUID [%s]가 있는 이미지를 찾을 수 없습니다. 다음을 확인하세요:\\n1. VM [%s] (UUID: %s)가 상주하는 올바른 영역에 백업 스토리지가 연결되어 있는지 확인합니다.\\n2. 백업 스토리지가 연결 상태인지 확인합니다. 연결되지 않은 경우 재연결을 시도하세요.", + "ORG_ZSTACK_AI_10112": "지원되지 않는 모델 서비스 유형: %s, 재시작 작업을 처리할 해당 백엔드를 찾을 수 없음", + "ORG_ZSTACK_AI_10113": "모델 서비스 인스턴스 그룹 [UUID: %s]을 찾을 수 없음, 서비스 시작 대기 흐름 건너뛰기", + "ORG_ZSTACK_AI_10111": "모델 서비스 인스턴스[uuid: %s]를 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10001": "LLDP 인터페이스 정보를 검색할 수 없습니다 (데이터를 수신하도록 구성되지 않음)", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10037": "UUID [%s]의 라이선스 인증 노드를 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10003": "[%s]에 대한 LLDP 참조를 가져오지 못함", + "ORG_ZSTACK_STORAGE_PRIMARY_10018": "zoneUuids, clusterUuids, primaryStorageUuids는 각각 최소 하나의 비어 있지 않은 목록을 포함하거나, 모든 값을 true로 설정해야 합니다", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10032": "라이선스 서버 환경으로 업그레이드하기 전에 무단 노드가 존재해서는 안 됩니다. 업그레이드 프로세스 전에 모든 노드에 유효한 라이선스가 있는지 확인하세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_10017": "주 스토리지[%s]에 outputProtocol[%s]이(가) 이미 존재하므로 다시 추가할 필요가 없습니다", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10033": "일부 관련 라이선스 가상 노드가 종료되지 않았습니다.%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10085": "보안 그룹 UUID:%s가 L3 네트워크 UUID:%s와 연결되지 않았으므로 분리할 수 없습니다", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10000": "다른 호스트의 인터페이스에 대해 LLDP 모드를 변경할 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_10019": "UUID:%s인 주 스토리지가 아직 클러스터 UUID:%s에 연결되지 않았습니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10087": "기본 규칙[uuid:%s]을 삭제할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10011": "상태가 Operating일 때 NfvInstanceGroup[uuid:%s, name:%s]을 삭제할 수 없습니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10086": "다른 보안 그룹의 보안 그룹 규칙을 삭제할 수 없습니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10089": "L3 네트워크[uuid:%s]에 네트워크 서비스 유형[%s]이(가) 활성화되어 있지 않습니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10088": "UUID:%s 보안 그룹이 L3 네트워크 UUID:%s에 연결되어 있으므로 다시 연결할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10010": "NFV 인스턴스를 생성할 수 없습니다. 그룹[uuid:%s, name:%s]이(가) 이미 %d명의 구성원을 가지고 있으며, 최대 허용 수는 3입니다", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10026": "relativeTime[%s]이(가) 잘못되었습니다. 최대 허용 값을 초과합니다", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10025": "relativeTime[%s]이(가) 잘못되었습니다. 10s 또는 1h와 같은 형식으로 지정해야 합니다.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10008": "그룹[uuid:%s, name:%s]이(가) 활성 모드에 있을 때 NFV 인스턴스를 생성할 수 없습니다. 먼저 유지 관리 모드로 변경하세요.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10009": "그룹[uuid:%s, name:%s]이(가) %s 상태일 때 NFV 인스턴스를 생성할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10006": "NFV 인스턴스 그룹 %s [uuid: %s]의 NFV 인스턴스 %s [uuid: %s]의 haStatus가 %s에서 %s(으)로 변경되었습니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10039": "vhost 볼륨은 bareMetalInstance2에 연결할 수 없습니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10038": "MAC:%s가(이) 포함된 NIC는 이미 본딩되었으므로 L3 네트워크에 연결할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10004": "클라우드 배포를 위한 모든 노드가 예상된 상태에 있지 않습니다. 모든 노드의 상태를 확인하고 운영에 필요한 조건을 충족하는지 확인하세요.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10002": "NFV 인스턴스 그룹[uuid:%s]에 대한 선호도 그룹을 생성하지 못함", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10033": "L3 네트워크를 BareMetal 인스턴스에 연결할 때 customMAC이 필수입니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_10024": "볼륨이 있는 기본 스토리지[uuid: %s]가 활성화되어 있지 않거나 연결되어 있지 않습니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10032": "L2 네트워크 유형 %s은(는) Baremetal2 인스턴스에서 지원되지 않습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10031": "IP 버전 %d인 레이어 3 네트워크만 Baremetal2 인스턴스에서 지원됩니다.", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10031": "라이선스 서버만 라이선스 클라이언트 인스턴스의 등록을 취소할 수 있습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10030": "Baremetal2 인스턴스[uuid:%s]에 컴퓨트 노드가 할당되지 않았습니다. 인스턴스를 시작하고 다시 시도하세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_10021": "기본 스토리지와 클러스터가 동일한 가용성 영역[uuid:%s] [uuid:%s]에 있지 않습니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10037": "MAC 주소 %s이(가) 이미 할당되어 있습니다. 다른 주소를 시도하세요", + "ORG_ZSTACK_STORAGE_PRIMARY_10020": "기본 스토리지[uuid:%s]가 클러스터[uuid:%s]에 연결되어 있습니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10036": "섀시[uuid:%s]에서 실행 중인 baremetal2 인스턴스[uuid:%s]에 MAC 주소 %s가(이) 포함된 비프로비저닝 NIC가 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_10023": "'UUID'와 'Type'을 동시에 설정하거나 동시에 설정하지 않아야 합니다!", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10035": "중복된 MAC 주소 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10022": "URL[%s]이(가) 이미 사용 중이며 동일한 클러스터 내에서 중복될 수 없습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10034": "%s은(는) 유효한 MAC 주소가 아닙니다", + "ORG_ZSTACK_AI_10130": "예기치 않은 값을 얻었습니다: %s from %s. 클라우드 리소스 메트릭에 대해 사전 정의된 범위 내의 값이 필요합니다", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10026": "클라우드 컴퓨팅 환경에 대해 잘못된 라이선스 유형 %s", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10027": "라이선스 서버를 등록할 때 권한 있는 가상 머신이 없어야 합니다.%s", + "ORG_ZSTACK_STORAGE_PRIMARY_10029": "1차 저장소에서 %s바이트를 예약할 수 없습니다[uuid:%s], 가용 용량이 부족합니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10093": "보안 그룹 UUID:%s와 연결된 L3 네트워크에 VM NIC UUID:%s가 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_10028": "예약 용량을 제외한 후, 필요한 크기의 1차 저장소가 부족합니다. 1차 저장소의 물리적 용량 설정 임계값이 낮아서일 수 있습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10096": "원격 보안 그룹 UUID:%s가 중복되어 있어 보안 그룹 규칙을 추가할 수 없습니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10095": "규칙 목록이 비어있거나 최대 개수 %d를 초과하여 보안 그룹 규칙을 추가할 수 없습니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10098": "원격 보안 그룹 UUID가 기존 항목과 충돌합니다. 보안 그룹 규칙을 확인하고 업데이트하세요.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10022": "정상 운영 모드에서는 NFV 인스턴스를 그룹에서 분리할 수 없습니다[uuid:%s, name:%s]. 먼저 유지 관리 모드로 전환하세요.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10097": "보안 그룹 [uuid:%s]이 존재하지 않아 보안 그룹 규칙을 추가할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10023": "상태가 %s일 때 NFV 인스턴스를 그룹에서 분리할 수 없습니다[uuid:%s, name:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10020": "그룹 상태가 %s이고 멤버가 %d명일 때 NFV 인스턴스를 그룹에 연결할 수 없습니다. 연결은 그룹이 비어있거나 Healthy/Degraded 상태에서 멤버가 1-2명인 경우에만 허용됩니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10099": "보안 그룹 규칙을 추가할 수 없습니다. 우선순위는 %d보다 크거나 %d와 같아야 합니다", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10018": "방향[%s]이 잘못되었습니다. 지원되는 방향만 허용됩니다", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10024": "타입[%s]이 잘못되었습니다. 기본 타입 또는 일반적으로 사용되는 참조 타입만 허용됩니다", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10019": "NFV 인스턴스를 그룹 [UUID: %s, Name: %s]에 연결할 수 없습니다. 상태가 %s입니다", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10023": "오른쪽 값[%s]이 잘못되었습니다. 부동소수점 숫자여야 합니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10029": "baremetal2 인스턴스[uuid:%s]가 중지되지 않아 다른 chassis offering으로 변경할 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_10030": "회피할 1차 저장소%s를 제거한 후 후보 1차 저장소가 더 이상 없습니다. 클러스터 내 1차 저장소의 상태를 확인하세요.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10022": "오른쪽 값[%s]이 잘못되었습니다. 0보다 크고 1보다 작은 부동소수점 숫자여야 합니다", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10017": "NFV 인스턴스[uuid:%s]를 그룹[uuid:%s, name:%s]에 연결할 수 없습니다. 해당 인스턴스는 클러스터 상태가 %s인 이 그룹에 이미 속해 있습니다. 인스턴스가 Leader, Follower, Leaving 또는 Joining Candidate 상태인 경우 연결이 허용되지 않습니다.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10021": "잘못된 인수 %s, 이 컨텍스트에서는 인수가 허용되지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10018": "정상 운영 모드에서는 NFV 인스턴스를 그룹[UUID:%s, Name:%s]에 연결할 수 없습니다. 먼저 그룹을 유지 관리 모드로 전환하세요.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10020": "오른쪽 값[%s]이 잘못되었습니다. 클라우드 컴퓨팅 환경에서 유효한 숫자 타입(int, long, float, double)이어야 합니다", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10015": "syncNfvInstGroup은 유지 관리 모드에서만 허용됩니다. 현재 모드: %s. 먼저 유지 관리 모드로 변경하세요.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10013": "INITIALIZING 상태에서는 운영 모드를 변경할 수 없습니다. 변경하기 전에 그룹이 준비되었는지 확인하세요. 현재 상태: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10036": "PrimaryStorageTagAllocatorExtensionPoint[%s]가 적합한 1차 저장소 후보를 0개 반환합니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10022": "로컬 baremetal 인스턴스에서는 현재 작업이 지원되지 않습니다. 가상화된 환경에서 작업을 수행하세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_10035": "PrimaryStorageFeatureAllocatorFlow[%s]가 실행 가능한 1차 저장소 후보를 0개 반환합니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10021": "bare metal 인스턴스는 VM NIC 네트워크 설정을 수정할 수 없습니다. 호환되는 인스턴스 타입을 사용하세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_10038": "%s이(가) 잘못되었습니다. %s은(는) 유효한 인스턴스 UUID가 아닙니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10020": "BareMetal2 인스턴스에 EIP를 연결하려면 VPC 네트워크만 지원됩니다", + "ORG_ZSTACK_STORAGE_PRIMARY_10037": "주 스토리지 [uuid:%s]가 연결 상태가 아닙니다. 현재 상태: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10026": "baremetal2 인스턴스[uuid:%s]는 운영 중이지만 에이전트가 연결되어 있지 않습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10025": "baremetal2 인스턴스[uuid:%s]가 종료되지 않았습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_10034": "사용자 정의 태그[%s]에 해당하는 주 스토리지를 찾을 수 없습니다. 사용자 정의 태그는 인스턴스 오퍼링 또는 디스크 오퍼링에 지정됩니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10024": "baremetal2 인스턴스[uuid:%s]가 연결되어 있지 않습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_10033": "주 스토리지[uuid:%s]를 찾을 수 없습니다. 이 UUID는 인스턴스 오퍼링 또는 디스크 오퍼링仕様に 지정됩니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10023": "BareMetal2 인스턴스에서는 이 작업이 지원되지 않습니다. 가상화 환경과의 호환성을 확인해 주세요.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10051": "UUID:%s인 baremetal2 섀시가 존재하지 않습니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10050": "인스턴스에 이미 섀시 오퍼링이 할당되었으므로 chassisOfferingUuid를 설정할 필요가 없습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10021": "VM NIC 보안 그룹을 설정할 수 없습니다. 지정된 보안 그룹[uuid:%s]가 사용자 계정[uuid:%s] 또는 관리자에게 속하지 않습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10020": "VM NIC 보안 그룹을 설정할 수 없습니다. 중복된 보안 그룹[uuid:%s]이(가) 있습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10023": "VM NIC 보안 그룹을 설정할 수 없습니다. 우선순위가 잘못되었습니다. 연속된 우선순위가 필요하지만 %d와(과) %d을(을) 찾았습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10022": "VM NIC 보안 그룹을 설정할 수 없습니다. 우선순위가 잘못되었습니다. 우선순위는 1부터 시작해야 하지만 [%d]입니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10025": "VM NIC 보안 그룹을 설정할 수 없습니다. 관리자 보안 그룹 우선순위[%d]가 사용자 그룹보다 높아야 합니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10027": "보안 그룹[uuid:%s]을(를) 찾을 수 없으므로 보안 그룹 규칙 상태를 변경할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10026": "보안 그룹 규칙 상태를 업데이트할 수 없습니다. 규칙 UUID 목록이 비어 있습니다. 진행하려면 유효한 규칙 UUID를 제공해 주세요.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10029": "보안 그룹 규칙 상태를 수정할 수 없습니다. 변경이 필요한 보안 그룹 규칙이 없습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10028": "보안 그룹 규칙[uuid:%s]을(를) 찾을 수 없으므로 보안 그룹 규칙 상태를 변경할 수 없습니다.", + "ORG_ZSTACK_ZWATCH_10004": "일부 메시지가 만료되어 시스템 제약으로 인해 수정이 허용되지 않습니다. 시스템에서 이러한 만료된 메시지를 자동으로 정리합니다. 나중에 작업을 다시 시도해 주세요.", + "ORG_ZSTACK_ZWATCH_10003": "잘못된 작업 유형: %s. 쓰기 또는 삭제 작업만 지원됩니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10054": "baremetal2 섀시[uuid:%s]가 이미 다른 리소스에 할당되었습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10053": "baremetal2 섀시[uuid:%s]가 활성화되어 있지 않습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10052": "baremetal2 섀시[uuid:%s]가 섀시 오퍼링[uuid:%s]과(와) 연결되어 있지 않습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10059": "섀시 UUID와 섀시 오퍼링 UUID를 동시에 설정하지 마세요.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10057": "클러스터[uuid:%s]가 지정되었지만 활성화된 Baremetal2 클러스터가 아닙니다. 따라서 Baremetal2 인스턴스를 생성할 수 없습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10056": "영역[uuid:%s]가 지정되었지만 활성화되어 있지 않습니다. 따라서 baremetal2 인스턴스를 생성할 수 없습니다.", + "ORG_ZSTACK_AI_SERVICE_10001": "모델 서비스 UUID: %s 및 계정 UUID: %s로 Application Development Service VO를 찾지 못했습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10040": "타사 Ceph를 다른 주 스토리지 유형과 혼합할 수 없습니다. 저장소 구성의 일관성을 확인해 주세요.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10030": "VM NIC 보안 정책을 수정할 수 없습니다. 인그레스 및 이그레스 정책이 모두 null일 수는 없습니다. 최소 하나의 정책이 정의되어 있는지 확인해 주세요.", + "ORG_ZSTACK_ZWATCH_10002": "잘못된 zwatch 반환: %s, %s", + "ORG_ZSTACK_ZWATCH_10001": "zwatch 반환 절에서 알 수 없는 매개변수[%s]가 있습니다. 지정된 클라우드 컴퓨팅 환경에 대해 유효한 매개변인지 확인하십시오", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10032": "잘못된 이그레스 정책[%s]로 인해 VM NIC 보안 정책을 변경할 수 없습니다", + "ORG_ZSTACK_AI_SERVICE_10005": "테스트가 필요한 작업이 없습니다. 실패로 표시합니다.%s", + "ORG_ZSTACK_AI_SERVICE_10004": "서비스 인스턴스를 찾을 수 없습니다. 인스턴스가 올바르게 생성되고 평가 작업과 연결되어 있는지 확인하십시오. 작업 제출에 실패했습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10031": "잘못된 인그레스 규칙[%s]로 인해 VM NIC 보안 정책을 변경할 수 없습니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10034": "VM NIC [UUID:%s]에 연결된 보안 정책이 없으므로 VM NIC 보안 정책을 변경할 수 없습니다", + "ORG_ZSTACK_AI_SERVICE_10003": "UUID [%s]의 서비스 그룹을 찾을 수 없어 평가 작업을 제출할 수 없습니다. 실패를 보고합니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10033": "VM NIC [uuid:%s]를 찾을 수 없으므로 VM NIC 보안 정책을 변경할 수 없습니다", + "ORG_ZSTACK_AI_SERVICE_10002": "테스트를 위한 모델 서비스 인스턴스 그룹 [UUID: %s]에 사용 가능한 URL이 없습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10036": "보안 그룹 [uuid:%s]이 존재하지 않으므로 보안 그룹 규칙 우선순위를 업데이트할 수 없습니다", + "ORG_ZSTACK_AI_SERVICE_10008": "모든 컴퓨트 인스턴스 시작에 실패했습니다.%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10035": "잘못된 유형[%s]으로 인해 보안 그룹 규칙 우선순위를 업데이트할 수 없습니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10038": "보안 그룹 [uuid:%s]의 규칙 수가 예상되는 수와 일치하지 않으므로 보안 그룹 규칙 우선순위를 업데이트할 수 없습니다", + "ORG_ZSTACK_AI_SERVICE_10006": "%s에서 평가 시작 중 오류가 발생했습니다. 이유: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10037": "규칙 목록이 비어 있으므로 보안 그룹 규칙 우선순위를 업데이트할 수 없습니다. 이 작업을 시도하기 전에 규칙이 정의되어 있는지 확인하십시오.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10039": "규칙 우선순위[%d]가 유효하지 않으므로 보안 그룹 규칙 우선순위를 업데이트할 수 없습니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10049": "인스턴스에 이미 섀시가 할당되어 있으므로 chassisOfferingUuid를 설정할 필요가 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10004": "응답 데이터에 사용 가능한 라이선스가 없음을 나타내므로 기본 저장소 [%s]의 라이선스 정보를 검색하지 못했습니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10044": "UUID: %s의 baremetal2 게이트웨이가 UUID: %s의 클러스터에 속해 있지 않습니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10043": "UUID: %s의 baremetal2 게이트웨이가 존재하지 않거나 활성화되지 않았거나 연결되지 않았습니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10042": "클러스터[uuid:%s]가 활성화된 baremetal2 클러스터가 아닙니다. 해당 클러스터 내에서 인스턴스[uuid:%s]를 시작할 수 없습니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10041": "원격 프로비저닝 인스턴스는 프로비저닝 NIC를 본딩에 연결하는 것을 지원하지 않습니다 %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10047": "baremetal2 섀시 오퍼링[uuid:%s]이 활성화되어 있지 않습니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10046": "baremetal2 섀시 오퍼링 [UUID:%s]이 존재하지 않습니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10045": "Baremetal 인스턴스 [uuid:%s]를 시작하려면 섀시 UUID 또는 섀시 오퍼링 UUID를 지정하십시오.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10029": "스냅샷 생성 시간 초과, 진행률이 %d%입니다", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10028": "EBS 프라이머리 스토리지는 현재 크기 축소를 지원하지 않습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10073": "이미지[uuid:%s]의 형식: %s입니다. BareMetal2 인스턴스에서 지원되는 형식은 %s뿐입니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10072": "이미지[uuid:%s]의 미디어 유형: %s입니다. 루트 볼륨 템플릿만 사용하여 베어메탈 인스턴스를 생성할 수 있습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10041": "UUID:%s의 규칙이 UUID:%s의 보안 그룹과 연결되어 있지 않으므로 보안 그룹 규칙 우선순위를 업데이트할 수 없습니다", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10071": "image[uuid:%s]가 준비되지 않았습니다. baremetal2 인스턴스를 생성할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10040": "우선순위[%d]가 중복되어 보안 그룹 규칙 우선순위를 업데이트할 수 없습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10070": "image[uuid:%s]가 활성화되지 않았습니다. 따라서 baremetal2 인스턴스를 생성할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10043": "중복된 규칙 UUID가 존재하여 보안 그룹 규칙 우선순위를 업데이트할 수 없습니다.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10021": "스냅샷 설치 경로가 잘못되었습니다: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10042": "지정된 우선순위 [%d]가 보안 그룹 [uuid:%s] 내에 존재하지 않아 보안 그룹 규칙 우선순위를 업데이트할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10045": "기본 규칙이므로 보안 그룹 규칙을 수정할 수 없습니다. 설명과 상태만 업데이트할 수 있습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10044": "UUID[%s]인 지정된 보안 그룹 규칙이 존재하지 않아 보안 그룹 규칙을 수정할 수 없습니다.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10022": "Alibaba Cloud EBS 주 저장소[UUID:%s, Name:%s]가 볼륨 생성을 위해 연결된 클러스터 내에서 사용 가능한 호스트를 찾을 수 없습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10047": "보안 그룹 %s가 최대 %d개의 규칙 제한을 초과하여 보안 그룹 규칙을 수정할 수 없습니다.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10025": "이미지에서 스냅샷을 찾을 수 없습니다: %s, 이미지가 삭제되었을 수 있습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10046": "규칙 [%s]의 우선순위를 기본 규칙 우선순위 [%d]로 설정할 수 없어 보안 그룹 규칙을 수정할 수 없습니다.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10024": "클라우드 환경이 지원되지 않습니다.", + "ORG_ZSTACK_COMPUTE_CPUPINNING_10002": "인스턴스 구성에 지정된 cpuset [%s]가 잘못되었습니다. cpuset이 유효하고 적절한 CPU 코어 집합을 참조하는지 확인하십시오.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10049": "잘못된 상태[%s]로 인해 보안 그룹 규칙을 수정할 수 없습니다.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10027": "다음 호스트에 tdc를 설치하지 못했습니다: [%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10048": "%s 규칙의 최대 우선순위 제한이 [%d]이므로 보안 그룹 규칙을 수정할 수 없습니다.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10026": "다음 클러스터와의 연결을 설정하지 못했습니다: [%s]", + "ORG_ZSTACK_COMPUTE_CPUPINNING_10000": "CPU 핀닝 참조[%s]가 잘못되었습니다. 올바른 예는 [1,3:3-6,^5] 또는 [1-2,4:6]입니다.", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10004": "대상 호스트 [uuid:%s]에서 가상 머신 [uuid:%s]의 vhost-user 클라이언트를 생성할 수 없습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10077": "baremetal2 클러스터[arch:%s]와 이미지[arch:%s]의 아키텍처가 일치하지 않습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10076": "인스턴스와 이미지 또는 오ffering 간의 부트 모드가 다르게 감지되었습니다. 일치하는지 확인하십시오.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10075": "부트 모드 %s인 이미지만 Baremetal2 인스턴스 생성을 지원합니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10074": "image[uuid:%s]가 BareMetal2 이미지가 아닙니다. 따라서 BareMetal2 인스턴스를 생성하는 데 사용할 수 없습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10079": "루트 볼륨의 주 저장소와 데이터 볼륨의 주 저장소는 동일한 클러스터 내에 있어야 합니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10078": "모든 디스크 offering [UUIDs:%s]가 활성화되어 있지 않습니다. 따라서 BareMetal2 인스턴스를 생성할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10050": "잘못된 작업[%s]으로 인해 보안 그룹 규칙을 수정할 수 없습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10062": "baremetal2 chassis offering[uuid:%s]가 활성화되어 있지 않습니다. 따라서 baremetal2 인스턴스를 생성할 수 없습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10061": "baremetal2 chassis[uuid:%s]를 사용할 수 없습니다. 따라서 baremetal2 인스턴스를 생성할 수 없습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10060": "baremetal2 chassis UUID:%s가 활성화되어 있지 않습니다. 따라서 baremetal2 인스턴스를 생성할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10051": "보안 그룹 규칙을 수정할 수 없습니다. 잘못된 프로토콜[%s]이(가) 지정되었습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10054": "보안 그룹 규칙을 수정할 수 없습니다. 소스 IP 범위 [%s]가 지정되었습니다; 원격 보안 그룹 UUID [%s]는 비워두어야 합니다.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10031": "Aliyun EBS PrimaryStorage는 Aliyun EBS BS 유형만 지원합니다. 실제 유형: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10056": "보안 그룹 egress 규칙을 수정할 수 없습니다. 유형 Egress에는 소스 IP 범위를 지정할 수 없습니다.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10034": "리소스[uuid: %s]를 찾을 수 없습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10055": "보안 그룹 ingress 규칙을 수정할 수 없습니다. dstIpRange는 이 규칙[%s]에 대해 지정할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10058": "보안 그룹 규칙을 수정할 수 없습니다. 원격 보안 그룹 [uuid:%s]을(를) 찾을 수 없습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10057": "보안 그룹 규칙을 수정할 수 없습니다. 대상 IP 범위 [%s]가 지정되었습니다; 원격 보안 그룹 UUID [%s]는 비워두어야 합니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10059": "보안 그룹 규칙을 수정할 수 없습니다. 원격 보안 그룹 [UUID:%s]이(가) 구성되어 있습니다; 소스 IP 범위와 대상 IP 범위는 비워두어야 합니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10066": "섀시가 직접 모드에 있지 않은 경우 이미지는 비어 있을 수 없습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10065": "UUID: %s인 baremetal2 게이트웨이는 UUID: %s인 섀시와 동일한 클러스터 내에 공동 배치되어 있지 않습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10064": "baremetal2 게이트웨이 [UUID: %s]가 연결되어 있지 않습니다; 따라서 baremetal2 인스턴스를 생성할 수 없습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10063": "baremetal2 게이트웨이 [UUID:%s]가 활성화되어 있지 않습니다; 따라서 baremetal2 인스턴스를 생성할 수 없습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10069": "섀시 디스크[%s]에 이미지[%s]를 저장할 용량이 충분하지 않습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10068": "이미지[uuid:%s]가 이미지 저장소에 존재하지 않습니다.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10067": "직접 모드는 이미지 선택을 지원하지 않습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREBLOCK_10000": "shareblock은 호스트 %s가 %s에서 연결할 수 없음을 나타냅니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10100": "잘못된 프로토콜[%s]로 인해 보안 그룹 규칙을 추가할 수 없습니다; 유효한 프로토콜은 %s입니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10102": "잘못된 IP 버전 [%d]이(가) 지정되어 보안 그룹 규칙을 추가할 수 없습니다; 유효한 버전은 %d/%d입니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10101": "잘못된 작업[%s]로 인해 보안 그룹 규칙을 추가할 수 없습니다; 유효한 작업은 %s입니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10104": "허용된 CIDR [%s]과(와) 대상 IP 범위 [%s]가 충돌하여 보안 그룹 규칙을 추가할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10103": "소스 IP 범위 [%s]가 egress 규칙에 대해 설정할 수 없어 보안 그룹 규칙을 추가할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10106": "대상 IP 범위[%s]가 ingress 규칙에 대해 설정할 수 없어 보안 그룹 규칙을 추가할 수 없습니다.", + "ORG_ZSTACK_COMPUTE_HOST_10041": "KVM 호스트 [UUID: %s]에서 네트워크 본딩 [%s]에 대한 VLAN ID [%s]를 확인할 실패했습니다, %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10105": "IP 범위[%s]와(과) 원격 보안 그룹 UUID[%s]가 충돌하여 보안 그룹 규칙을 추가할 수 없습니다.", + "ORG_ZSTACK_COMPUTE_HOST_10043": "KVM 호스트 [UUID: %s]에서 네트워크 인터페이스 [%s]에 대한 VLAN ID [%s]를 확인할 실패했습니다, %s", + "ORG_ZSTACK_VPC_10048": "DNS 주소 [%s]가 VPC 라우터 [uuid:%s]에 추가되었습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10107": "허용된 CIDR [%s]가 소스 IP 범위 [%s]와(과) 충돌하여 보안 그룹 규칙을 추가할 수 없습니다.", + "ORG_ZSTACK_VPC_10047": "vPC L3 네트워크는 vRouter 관련 작업(예: VM 시작/중지, 로드 밸런서 생성 등)을 수행하기 전에 vPC vRouter와 연결되어야 합니다.", + "ORG_ZSTACK_ALIYUN_CORE_10022": "스냅샷 작업 상태가 %s로 완료되었습니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10109": "보안 그룹 규칙을 추가할 수 없습니다. 프로토콜 유형 ALL 또는 ICMP는 dstPortRange[%s]를 설정할 수 없습니다", + "ORG_ZSTACK_ALIYUN_CORE_10023": "HybridClient 인스턴스에서는 이 작업이 지원되지 않습니다. 호환되는 클라이언트 유형을 사용하세요.", + "ORG_ZSTACK_ALIYUN_CORE_10021": "스냅샷 작업이 %d밀리초 내에 완료될 수 없습니다. 현재 진행률은 %d%%이며, 상태는 %s입니다", + "ORG_ZSTACK_ALIYUN_CORE_10026": "Ocean API 엔드포인트는 null일 수 없습니다. 유효한 엔드포인트를 제공하세요.", + "ORG_ZSTACK_VPC_10042": "가상 라우터 %s에서 서비스 %s의 상태를 검색하는 것은 지원되지 않습니다", + "ORG_ZSTACK_COMPUTE_HOST_10048": "본딩 IP를 업데이트하지 못했습니다. 이유: %s", + "ORG_ZSTACK_VPC_10041": "가상 라우터 %s에 분산 라우팅 상태를 설정할 수 없습니다", + "ORG_ZSTACK_ALIYUN_CORE_10024": "accessKey와 secretAccessKey를 구성해야 합니다", + "ORG_ZSTACK_VPC_10040": "가상 라우터 %s에 대한 분산 라우팅 연결을 검색할 수 없습니다", + "ORG_ZSTACK_COMPUTE_HOST_10044": "KVM 호스트[UUID: %s]에서 네트워크 본딩[%s]에 대한 서비스 유형[%s]을 설정하지 못했습니다, %s", + "ORG_ZSTACK_VPC_10045": "가상 라우터 %s에 대한 서비스 %s 상태를 업데이트하는 것은 지원되지 않습니다", + "ORG_ZSTACK_COMPUTE_HOST_10047": "인터페이스 IP를 업데이트하지 못했습니다. 이유: %s", + "ORG_ZSTACK_COMPUTE_HOST_10046": "KVM 호스트[UUID: %s]에서 네트워크 인터페이스[%s]에 대한 서비스 유형[%s]을 설정하지 못했습니다, %s", + "ORG_ZSTACK_VPC_10043": "가상 라우터 %s에 대한 분산 라우팅 상태를 검색할 수 없습니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10111": "보안 그룹 규칙을 추가할 수 없습니다. 끝 포트 [%d]는 시작 포트 [%d]보다 크거나 같아야 합니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10110": "프로토콜 유형 ALL 또는 ICMP는 startPort 또는 endPort 설정을 지원하지 않습니다. 보안 그룹 규칙 구성에 적합한 프로토콜인지 확인하세요.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10113": "프로토콜 유형 TCP/UDP는 대상 포트 범위를 지정해야 합니다. 필요한 포트 범위를 제공하고 다시 시도하세요.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10112": "보안 그룹 규칙을 추가할 수 없습니다. dstPortRange[%s]가 startPort[%s]와 충돌합니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10115": "보안 그룹 규칙을 추가할 수 없습니다. 지정된 보안 그룹에 대한 데이터베이스에 중복 규칙[%s]이 이미 존재합니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10114": "보안 그룹 규칙을 추가할 수 없습니다. 규칙 [%s]와 [%s]이(가) 중복됩니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10117": "보안 그룹 규칙을 추가할 수 없습니다. 보안 그룹 %s가 최대 %d개 규칙 제한에 도달했습니다", + "ORG_ZSTACK_COMPUTE_HOST_10052": "호스트 [UUID:%s]에 대한 VLAN ID를 검색하지 못했습니다: %s", + "ORG_ZSTACK_VPC_10039": "L3 네트워크 [uuid:%s]에 IPv6 범위를 추가할 수 없습니다. 가상 라우터 [uuid:%s]의 CIDR [%s]와重叠됩니다", + "ORG_ZSTACK_ALIYUN_IMAGE_10002": "이 작업은 사용자 정의 이미지에만 제한됩니다.", + "ORG_ZSTACK_CORE_CONFIG_10002": "전역 구성[카테고리: %s, 이름: %s]을 찾을 수 없습니다", + "ORG_ZSTACK_VPC_10038": "L3 네트워크 [UUID:%s]에 IP 범위를 추가할 수 없습니다. 가상 라우터 [UUID:%s]의 CIDR [%s]와重叠됩니다", + "ORG_ZSTACK_ALIYUN_IMAGE_10003": "미러는 기본 디스크만 생성할 수 있습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10119": "보안 그룹 규칙을 추가할 수 없습니다. 보안 그룹 %s가 최대 %d개 규칙 제한을 초과했습니다", + "ORG_ZSTACK_NETWORK_PLUGIN_10001": "gratuitous ARP 해제 이유:%s", + "ORG_ZSTACK_VPC_10037": "DNS 주소 [%s]가 VPC 라우터 [uuid:%s]와 연결되어 있지 않습니다", + "ORG_ZSTACK_VPC_10036": "dns[%s]는 유효한 IP 주소가 아닙니다", + "ORG_ZSTACK_CORE_CONFIG_10004": "클라우드 리소스의 검증 건너뛰기를 허용하지 않습니다.", + "ORG_ZSTACK_NETWORK_PLUGIN_10000": "gratuitous ARP 적용 오류 발생 원인:%s", + "ORG_ZSTACK_ALIYUN_IMAGE_10001": "지정된 이미지를 현재 데이터센터로 가져오는 중입니다...", + "ORG_ZSTACK_ALIYUN_CORE_10011": "VM 이미지로 빈 파일(0바이트)을 입력할 수 없습니다!", + "ORG_ZSTACK_ALIYUN_IMAGE_10006": "이미지 기반 스토리지 백업 서비스만 지원합니다", + "ORG_ZSTACK_ALIYUN_IMAGE_10007": "이미지 이름이 http:// 또는 https://로 시작할 수 없습니다. 유효한 이미지 이름을 사용하세요.", + "ORG_ZSTACK_ALIYUN_IMAGE_10004": "데이터센터와 연결된 OSS 버킷이 없습니다: %s", + "ORG_ZSTACK_ALIYUN_IMAGE_10005": "ECS 시스템 이미지를 원격으로 삭제할 수 없습니다", + "ORG_ZSTACK_VPC_10031": "L3 네트워크 [UUID: %s]의 L2 네트워크 [UUID: %s]가 클러스터 [UUID: %s]에 연결되어 있지 않습니다", + "ORG_ZSTACK_VPC_10030": "L3 네트워크[uuid:%s]에 연결된 IP 범위가 없습니다", + "ORG_ZSTACK_ALIYUN_CORE_10016": "유효한 클라우드 리소스 식별자를 제공하세요!", + "ORG_ZSTACK_ALIYUN_CORE_10013": "권한이 거부되었습니다: %s", + "ORG_ZSTACK_VPC_10035": "L3 네트워크 [UUID:%s]는 VIP를 포함하므로 먼저 연결해야 합니다.", + "ORG_ZSTACK_COMPUTE_HOST_10055": "클러스터[uuids:%s, hypervisorType:%s]가 존재하지 않습니다!", + "ORG_ZSTACK_VPC_10034": "지정된 정적 IP 주소 [%s]가 Layer 3 네트워크 [UUID: %s]의 게이트웨이 IP [%s]와 일치하지 않습니다.", + "ORG_ZSTACK_ALIYUN_CORE_10017": "Java 코드 실행 실패, 오류 코드: %s, 오류 메시지: %s", + "ORG_ZSTACK_COMPUTE_HOST_10058": "호스트[uuid:%s]에서 지정된 리소스를 찾을 수 없습니다", + "ORG_ZSTACK_VPC_10033": "L3 네트워크 [uuid:%s]의 게이트웨이가 다른 인스턴스/IP:%s에 의해 사용 중입니다", + "ORG_ZSTACK_ALIYUN_CORE_10018": "%d 밀리초 내에 디바이스가 준비되지 않았습니다", + "ORG_ZSTACK_VPC_10032": "공용 네트워크 [UUID: %s] VIP [UUID: %s, IP: %s]는 VPC VR [UUID: %s]에 위치하지 않으므로 L3 네트워크 [UUID: %s]와 피어링할 수 없습니다", + "ORG_ZSTACK_COMPUTE_HOST_10019": "VM이 [%s] 상태일 때만 라이브 스냅샷 수행을 지원하지만, 현재 VM은 [%s] 상태입니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10120": "보안 그룹 규칙을 추가할 수 없습니다. 우선순위[%d]는 연속적이어야 합니다. 입력 규칙의 최대 허용 우선순위는 [%d]입니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10000": "모니터링 IP 주소가 없어서 기본 스토리지[%s] 라이선스 정보를 가져오지 못했습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10001": "기본 스토리지[%s]의 라이선스 정보를 가져오지 못했습니다. 데이터가 반환되지 않았습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10122": "현재 인스턴스[uuid:%s]에 보안 그룹 규칙을 적용하지 못했습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10002": "기본 스토리지 [%s]의 라이선스 정보를 가져오지 못했습니다. 만료 시간이 null입니다.", + "ORG_ZSTACK_ALIYUN_IMAGE_10008": "이미지 UUID에 대한 백업 스토리가 구성되지 않았습니다: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10121": "보안 그룹 규칙을 추가할 수 없습니다. 우선순위[%d]는 연속적이어야 합니다. 출력 규칙의 최대 허용 우선순위는 [%d]입니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10003": "기본 스토리지[%s] 라이선스 정보의 날짜 형식[%s]을 파싱하지 못했습니다", + "ORG_ZSTACK_ALIYUN_IMAGE_10009": "imageUuid: %s에 대한 백업 저장소 용량을 초과했습니다. 수동으로 지정해주세요.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10124": "l3 Network[uuid:%s]에서 네트워크 서비스[type:%s]가 활성화되어 있지 않습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10123": "일부 가상 머신에 보안 그룹 규칙을 적용하지 못했습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10125": "규칙[uuid:%s]을 찾을 수 없어 우선순위를 변경하지 못했습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10128": "nic[uuid:%s]에 연결된 l3 Network[uuid:%s]에서 네트워크 서비스[type:%s]가 활성화되어 있지 않습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10127": "UUID:%s인 VM nic가 UUID:%s인 보안 그룹에 연결되었습니다.", + "ORG_ZSTACK_ALIYUN_IMAGE_10011": "이미지 [%s]가 현재 활성화되어 있지 않습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10129": "UUID [%s]인 보안 그룹이 귀하의 계정 UUID [%s] 또는 관리자의 소유가 아닙니다.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10004": "virtual ID[uuid:%s]가 조직[uuid:%s]에 속하지 않습니다.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10005": "조직[uuid:%s]에는 이미 지정된 수퍼바이저가 있습니다.", + "ORG_ZSTACK_ALIYUN_CORE_10001": "SDK에 엔드포인트를 추가하지 못했습니다. 이유: %s", + "ORG_ZSTACK_ALIYUN_CORE_10005": "accessKey와 secretAccessKey를 구성해야 합니다!", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10003": "virtual ID[uuid:%s]가 존재하지 않습니다.", + "ORG_ZSTACK_COMPUTE_HOST_10028": "nic[%s]가 제거되었습니다.", + "ORG_ZSTACK_COMPUTE_HOST_10023": "작업 오류, 이유: %s", + "ORG_ZSTACK_ALIYUN_CORE_10009": "메시지에서 access key id 또는 secret access key를 찾을 수 없습니다.", + "ORG_ZSTACK_ALIYUN_IMAGE_10010": "Aliyun 이미지 가져오기에 대한 유효한 플랫폼:[%s], 유효한 값: [%s]", + "ORG_ZSTACK_ALIYUN_CORE_10006": "지역 식별자를 지정해야 합니다!", + "ORG_ZSTACK_COMPUTE_HOST_10038": "가상 머신 파일 삭제 실패: %s", + "ORG_ZSTACK_COMPUTE_HOST_10037": "가상 머신 구성 파일 설정 실패: %s", + "ORG_ZSTACK_COMPUTE_HOST_10039": "메모리 볼루닝 적용 실패: %s", + "ORG_ZSTACK_COMPUTE_HOST_10036": "VM 호스트네임 설정 실패: %s", + "ORG_ZSTACK_COMPUTE_HOST_10035": "VM 포트 구성 동기화 실패: %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10009": "잘못된 레이블, 'op' 필드가 null이거나 유효한 Regex 또는 Equal이 아닙니다. %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10008": "잘못된 레이블, 'key' 필드가 null일 수 없습니다. 유효한 키 값을 제공해주세요.%s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10007": "ValueCondition 문자열[%s]에는 'value' 키가 필요합니다.", + "ORG_ZSTACK_ZWATCH_DATATYPE_10006": "레이블 문자열[%s]에 유효한 작업이 포함되어 있지 않습니다.", + "ORG_ZSTACK_COMPUTE_VM_10319": "VmInstanceDestroyVmExtensionPoint[%s]가 vm[uuid:%s] 종료를 거부했습니다. 이유: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10006": "볼륨 [%s]의 유형이 유효하지 않습니다.", + "ORG_ZSTACK_COMPUTE_VM_10318": "VmInstanceRebootExtensionPoint[%s]가 vm[uuid:%s] 재시동을 거부했습니다. 이유: %s", + "ORG_ZSTACK_COMPUTE_VM_10317": "VmInstanceStartNewCreatedVmExtensionPoint[%s]가 VM[uuid:%s]을(를) 시작을 거부했습니다. 이유: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10004": "Ceph PS[uuid:%s]에서 볼륨 %s의 스냅샷 ID를 가져오지 못했습니다.", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10002": "Ceph 풀 [uuid:%s]에서 볼륨 %s의 설치 경로를 확인하지 못했습니다.", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10001": "풀 서비스 응답에서 지정된 풀[PoolName:%s]을(를) 찾을 수 없습니다: %s", + "ORG_ZSTACK_VPC_10006": "클라우드 환경에서 VIP[uuid:%s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_VPC_10005": "가상 라우터 [UUID:%s]의 이미지 유형이 %s가 아니므로 IPv6 EIP를 연결할 수 없습니다", + "ORG_ZSTACK_VPC_10003": "VPC 라우터[%s]에 SSH 연결을 설정할 수 없습니다. SSH 포트가 닫혀 있는 것으로 보입니다", + "ORG_ZSTACK_VPC_10009": "VMNic[uuid:%s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_VPC_10008": "UUID:%s인 EIP를 찾을 수 없습니다", + "ORG_ZSTACK_COMPUTE_VM_10316": "VM의 호스트를 찾을 수 없습니다. 가상 머신 [%s]을(를) 먼저 시작한 후 디스크 마운트를 시도해 주세요.", + "ORG_ZSTACK_COMPUTE_HOST_10005": "호스트[uuid:%s]에서 동기화 클럭 작업 설정에 실패했습니다.", + "ORG_ZSTACK_ZWATCH_DATATYPE_10001": "잘못된 표현식: %s, 클라우드 컴퓨팅 또는 가상화 설정 컨텍스트에서 관련 함수를 찾을 수 없습니다", + "ORG_ZSTACK_COMPUTE_HOST_10004": "호스트[uuid:%s, name:%s]가 상태[%s]에 있어 필요한 작업을 실행할 수 없습니다", + "ORG_ZSTACK_COMPUTE_VM_10315": "게이트웨이 오류, 예상: %s, 실제: %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10000": "잘못된 함수: %s, 클라우드 컴퓨팅 환경에 대한 잘못된 매개변수 유형입니다", + "ORG_ZSTACK_COMPUTE_VM_10314": "IPv6 접두사 길이 오류, %s와(과) %s 사이의 값이 필요합니다, 받은 값: %s", + "ORG_ZSTACK_COMPUTE_VM_10313": "IPv6 접두사 길이를 구성해야 합니다", + "ORG_ZSTACK_VPC_10002": "L3 네트워크 [UUID: %s]의 게이트웨이가 VPC VR [UUID: %s]에서 사용 중입니다", + "ORG_ZSTACK_COMPUTE_VM_10311": "넷마스크 오류, 예상: %s, 받은 값: %s", + "ORG_ZSTACK_COMPUTE_HOST_10000": "GPU 정보 동기화 실패: %s", + "ORG_ZSTACK_VPC_10001": "Layer 3 네트워크[uuid:%s]에 IP 범위가 없습니다", + "ORG_ZSTACK_COMPUTE_VM_10310": "서브넷 마스크를 지정해야 합니다.", + "ORG_ZSTACK_VPC_10000": "VPC VR[uuid:%s]에서 NIC를 분리할 수 없습니다", + "ORG_ZSTACK_COMPUTE_HOST_10009": "호스트[uuid:%s]에 PCI 장치를 할당하지 못했습니다.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10051": "잘못된 URI 형식. 올바른 예시: ceph:/// 또는 volume://", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10050": "Ceph ps[uuid=%s] 루트 풀 이름을 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10052": "볼륨 체인 삭제 오류, 볼륨 삭제를 계속 진행합니다", + "ORG_ZSTACK_COMPUTE_VM_10320": "VmInstanceStartExtensionPoint[%s]가 가상 머신[uuid:%s]을(를) 시작을 거부합니다. 이유: %s", + "ORG_ZSTACK_COMPUTE_HOST_10013": "인스턴스[uuid:%s]의 네트워크 인터페이스[name:%s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10008": "암호화 %s[id:%s] 실패: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_SMP_10000": "공유 마운트 포인트 기본 스토리지[uuid:%s, name:%s]가 연결된 컴퓨트 클러스터 내에서 사용 가능한 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10005": "클라우드 컴퓨팅 환경에서 EncryptColumnIntegrityFactory에 대해 지원되지 않는 작업입니다", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10002": "%s[%s] 무결성 검증 오류, 원인: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10000": "%s[%s] 암호화 오류, 원인: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10017": "작업을 수행할 수 있는 연결된 KVM 호스트를 찾을 수 없습니다; 공유 마운트 포인트 스토리지[uuid:%s]에 연결된 클러스터의 모든 호스트가 연결 해제된 것 같습니다.", + "ORG_ZSTACK_VPC_10027": "VPC 라우터[UUID:%s]에 L3 네트워크를 연결할 수 없습니다. 해당 상태가 실행 중이거나 중지되지 않았기 때문입니다.", + "ORG_ZSTACK_VPC_10025": "VPC 네트워크 [uuid:%s]는 이미 VPC 라우터 [uuid:%s]에 연결되어 있습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10013": "URL에 잘못된 디렉토리 경로 [%s]가 포함되어 있습니다. 유효한 경로는 인스턴스의 파일 시스템 내에 있어야 하며 /dev, /proc, 또는 /sys와 같은 특수 디렉토리를 포함하지 않아야 합니다. 제공된 URL이 정확한지 확인하십시오.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10042": "루트 볼륨 RBD 이미지 감시자를 가져오지 못함, %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10041": "CEPH 풀 충돌, 디스크 오퍼링에서 지정한 CEPH 풀은 %s이고, 생성 매개변수에서 지정한 CEPH 풀은 %s입니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10010": "볼륨[uuid:%s]이(가) 볼륨[%s]을(를) 참조하고 있습니다; 따라서 볼륨을 평탄화하지 않고는 볼륨 유형을 변경할 수 없습니다", + "ORG_ZSTACK_VPC_10029": "VPC 라우터[UUID:%s]에 L3 네트워크를 연결할 수 없습니다. 해당 상태와 피어 상태 모두 실행 중이거나 중지되지 않았기 때문입니다.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10044": "Ceph 기본 스토리지 풀[poolName=%s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_VPC_10020": "L3 네트워크 [uuid:%s]은(는) VIP에 연결된 네트워크 서비스 [%s]가 여전히 사용 중이므로 VPC 라우터 [uuid:%s]에서 분리할 수 없습니다", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10043": "루트 볼륨[%s]이(가) 이미 사용 중입니다(Ceph RBD 이미지[%s]에 활성 감시자가 있음을 나타냄). 잠재적인 스플릿-브레인 시나리오를 방지하기 위해 VM 시작이 금지됩니다", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10046": "기본 스토리지[%s]에 대한 스토리지 풀을 할당할 수 없습니다, 목적: %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10045": "cephPrimaryStorage 풀[poolName=%s]에 요청된 크기 %s를 수용할 수 있는 사용 가능한 가상 용량이 부족합니다", + "ORG_ZSTACK_VPC_10024": "VPC L3 네트워크만 VPC 라우터에 연결할 수 있습니다", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10047": "Ceph 기본 스토리지 MON 노드 [UUID:%s]의 상태를 업데이트할 수 없습니다. 삭제되었기 때문입니다. 이 경고는 무시할 수 있습니다", + "ORG_ZSTACK_VPC_10023": "가상 라우터 오퍼링 [uuid: %s]의 이미지가 없습니다", + "ORG_ZSTACK_VPC_10022": "UUID: %s의 가상 라우터 오퍼링이 활성화되지 않았습니다", + "ORG_ZSTACK_VPC_10021": "VPC L3 네트워크 [UUID:%s]은(는) VM NIC [%s]가 여전히 사용 중이므로 VPC 라우터 [UUID:%s]에서 분리할 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10006": "클라우드 환경에서 지원되지 않는 작업입니다. 클라우드 컴퓨팅 작업에 지원되는 API를 사용하고 있는지 확인하십시오", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10005": "누락된 매개변수, virtualMachineInstanceUuid: %s가 요청됨", + "ORG_ZSTACK_VPC_10017": "공용 네트워크는 원래 가상 프라이빗 클라우드에서 분리할 수 없습니다", + "ORG_ZSTACK_VPC_10016": "기본 경로 네트워크는 분리할 수 없습니다", + "ORG_ZSTACK_VPC_10015": "관리 네트워크는 분리할 수 없습니다. 이 작업을 시도하기 전에 모든 종속 리소스가 이전되었거나 종료되었는지 확인하십시오", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10003": "SMP 기본 스토리지 [uuid:%s]에 대한 명령을 실행할 수 있는 연결된 SMP 연결을 가진 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_VPC_10014": "가상 라우터 [uuid:%s]이(가) 원하는 상태나 상태에 있지 않습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10002": "SMP 기본 스토리지[uuid:%s]에 대한 명령을 실행할 수 있는 연결된 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10001": "SMP 주 스토리지 [uuid:%s]가 컴퓨트 클러스터에 연결되어 있지 않아 가상 머신 [uuid:%s]의 루트 볼륨 [uuid:%s]을(expunge) 삭제할 수 없습니다.", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10007": "UUID가 %s인 가상 머신을 찾을 수 없습니다", + "ORG_ZSTACK_VPC_10019": "마스터와 슬레이브의 상태가 일치하지 않아 VPC 라우터[uuid:%s]에서 L3 네트워크를 분리할 수 없습니다", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10008": "uuid가 %s인 가상 머신 디바이스를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10030": "준비되고 접근 가능한 이미지가 부족하여 이미지 [%s]를 주 스토리지 [%s]로 다운로드할 백업 스토리지를 찾을 수 없습니다", + "ORG_ZSTACK_VPC_10018": "VPC 라우터[uuid:%s]의 상태가 실행 중이거나 중지되어 있지 않아 L3 네트워크를 분리할 수 없습니다", + "ORG_ZSTACK_ALIYUN_CORE_10037": "이미지가 원격지에 존재합니다. 동기화(sync)를 먼저 사용하여 일관성을 확보하세요.", + "ORG_ZSTACK_ALIYUN_CORE_10035": "%s ms 후에 항목이 여전히 활성화되어 있습니다", + "ORG_ZSTACK_ALIYUN_CORE_10036": "ECS 인스턴스 [%s]를 찾을 수 없습니다. Aliyun 콘솔에 존재하는지 확인하세요", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10037": "주 스토리지[uuid:%s]에 연결된 Ceph MON을 찾을 수 없습니다", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10001": "필수 매개변수 누락: resourceUuid %s, vmInstanceUuid %s가 요청되었습니다", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10002": "필수 매개변수 누락: resource UUID. 유효한 resource UUID를 제공하세요.", + "ORG_ZSTACK_VPC_10012": "가상 라우터 [uuid:%s]는 VPC 라우터가 아닙니다", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10039": "CEPH 풀 충돌, 인스턴스 오퍼링에서 지정한 CEPH 풀은 %s이고 생성 매개변수에서 지정한 CEPH 풀은 %s입니다", + "ORG_ZSTACK_VPC_10011": "네트워크 인터페이스 [uuid:%s] 상태를 업데이트할 수 없습니다. 관리 네트워크 인터페이스가 지원되지 않습니다", + "ORG_ZSTACK_ALIYUN_CORE_10039": "regionId[%s]가 Aliyun에 따라 유효하지 않습니다!", + "ORG_ZSTACK_VPC_10010": "VM [UUID:%s]가 어플라이언스 VM이므로 VM NIC [UUID:%s]를 삭제할 수 없습니다. APIDetachL3NetworkFromVm API를 사용하세요.", + "ORG_ZSTACK_SNMP_AGENT_10006": "%s에서 포트 %s로 SNMP 에이전트 세션[%s]을(를) 종료하지 못했습니다.原因是 %s", + "ORG_ZSTACK_SNMP_AGENT_10005": "%s에서 %s로 SNMP 에이전트 포트를 수정하지 못했습니다.原因是 %s", + "ORG_ZSTACK_SNMP_AGENT_10004": "SNMP[uuid:%s] 인스턴스가 프로비저닝되지 않았습니다", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10009": "EC2 인스턴스 [%s]의 상태는 실행 중이거나 중지되어야 합니다", + "ORG_ZSTACK_STORAGE_ZBS_10003": "mdsUrl[%s]가 유효하지 않습니다. SSH 사용자명과 비밀번호는 ':'로 구분되어야 하며 비어 있을 수 없습니다. 유효한 mdsUrl 형식은 %s입니다", + "ORG_ZSTACK_STORAGE_ZBS_10004": "관리 서비스 URL[%s]이(가) 유효하지 않습니다. 호스트명은 null일 수 없습니다. 유효한 관리 서비스 URL 형식은 %s입니다", + "ORG_ZSTACK_STORAGE_ZBS_10002": "MDS URL[%s]이(가) 유효하지 않습니다. SSH 사용자명:SSH 비밀번호 부분이 유효하지 않습니다. 유효한 MDS URL 형식은 %s입니다", + "ORG_ZSTACK_APPCENTER_10006": "%s은(는) String 값을 필요로 하지만 잘못된 타입을 받았습니다", + "ORG_ZSTACK_APPCENTER_10005": "%s은(는) Boolean 값을 필요로 하지만 잘못된 타입을 받았습니다", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10004": "디스크 [%%s]가 어떤 인스턴스에도 연결되어 있지 않습니다", + "ORG_ZSTACK_APPCENTER_10004": "%s은(는) Number 값을 필요로 하지만 잘못된 타입을 받았습니다", + "ORG_ZSTACK_STORAGE_ZBS_10005": "MDS URL[%s]이(가) 유효하지 않습니다. SSH 포트가 유효한 범위(1-65535)를 벗어났습니다. 유효한 MDS URL 형식은 %s입니다", + "ORG_ZSTACK_APPCENTER_10003": "%s이(가) preParameters에 지정되어 있지만 구성되지 않았습니다", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10006": "데이터 디스크만 ECS 인스턴스에 연결할 수 있습니다.", + "ORG_ZSTACK_APPCENTER_10002": "proper 구성을 위해 filterName을 appcenter:true 또는 appcenter:false로 설정해야 합니다.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10007": "디스크를 어떤 ECS 인스턴스에도 연결할 수 없습니다. ECS 인스턴스가 디스크 연결을 허용하는 상태인지 확인하십시오.", + "ORG_ZSTACK_SNMP_AGENT_10003": "%s 포트에서 SNMP 에이전트를 시작하지 못했습니다. 원인: %s", + "ORG_ZSTACK_APPCENTER_10001": "PublishAppVO[uuid: %s]가 존재하지 않습니다", + "ORG_ZSTACK_SNMP_AGENT_10002": "SNMP 에이전트[%s]를 시작하지 못했습니다. 클라우드 구성[%s]을 확인하십시오.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10001": "인스턴스의 루트 볼륨은 삭제할 수 없습니다", + "ORG_ZSTACK_SNMP_AGENT_10001": "둘 이상의 SnmpAgentVO 인스턴스가 존재합니다. 사용할 인스턴스를 지정하십시오.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10002": "디스크 카테고리가 ephemeral일 경우 디스크의 deleteWithInstance 속성을 false로 설정할 수 없습니다.", + "ORG_ZSTACK_SNMP_AGENT_10000": "SnmpAgentVO 인스턴스가 없어 SnmpAgentImpl을 인스턴스화할 수 없습니다. SnmpAgentVO가 올바르게 구성 및 배포되었는지 확인하십시오.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10003": "디스크 카테고리가 cloud이고 portable이 아닐 경우 디스크의 deleteWithInstance 속성을 false로 설정할 수 없습니다.", + "ORG_ZSTACK_CORE_WEBHOOK_10000": "잘못된 URL[%s]", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10010": "디스크와 ECS 인스턴스는 같은 가용 영역에 있어야 합니다.", + "ORG_ZSTACK_TEST_AOP_10001": "단위 테스트는 클라우드 컴퓨팅 인프라 또는 가상화 환경의 문제로 인해 실패해야 합니다.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10015": "디스크를 생성하거나 크기를 관리하려면 요청 파라미터에 디스크 크기 또는 스냅샷 ID를 지정해야 합니다. 디스크 크기를 제공하거나 기존 스냅샷을 사용하십시오.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10016": "루트 볼륨 스냅샷에서 디스크를 생성할 수 없습니다. 이 작업에는 비루트 볼륨 스냅샷 또는 루트 볼륨 사본을 사용하십시오.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10017": "디스크 이름이나 설명은 'http://' 또는 'https://'로 시작할 수 없습니다. 디스크 이름에 유효한 문자를 사용하십시오.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10011": "볼륨 [%s]이(가) 이미 인스턴스 [%s]에 연결되어 있습니다.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10012": "데이터 디스크만 ECS 인스턴스에 연결할 수 있습니다.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10013": "현재 사용 중인 인스턴스에는 디스크를 연결할 수 없습니다. 새 디스크를 연결하기 전에 인스턴스를 중지하십시오.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10014": "비탄성 디스크는 연결된 인스턴스와 함께만销毁할 수 있습니다.", + "ORG_ZSTACK_STORAGE_ZBS_10021": "잘못된 논리적 볼륨 이름[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10022": "잘못된 풀 이름[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10020": "클라우드 리소스 참조에 대한 잘못된 URI 구문: %s", + "ORG_ZSTACK_STORAGE_ZBS_10025": "중복 MDS[%s] 추가는 허용되지 않습니다.", + "ORG_ZSTACK_STORAGE_ZBS_10026": "논리적 풀[%s]에 대한 물리적 리소스를 찾을 수 없습니다.", + "ORG_ZSTACK_STORAGE_ZBS_10023": "최소 하나 이상의 컴퓨트 풀이 구성되어 있는지 확인하십시오.", + "ORG_ZSTACK_STORAGE_ZBS_10024": "최소 하나 이상의 메타데이터 서비스 인스턴스가 구성되어 있는지 확인하십시오.", + "ORG_ZSTACK_STORAGE_ZBS_10027": "zBS 기본 저장소[uuid:%s]의 노드에서 MDS[%s]를 찾을 수 없습니다.", + "ORG_ZSTACK_STORAGE_ZBS_10028": "ZBS 기본 저장소 [uuid:%s]의 모든 MDS 노드가 Connected 상태가 아닙니다.", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10001": "클라우드 환경에서 사전 정의된 사전 구성 템플릿을 삭제할 수 없습니다. 지원팀에 문의하여 도움을 받으세요.", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10002": "", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10000": "이 환경에서 사전 정의된 구성 템플릿의 상태를 수정할 수 없습니다. 사용 가능한 가상 머신 이미지를 사용하거나 사용자 정의 구성을 대신 만드세요.", + "ORG_ZSTACK_MTTYDEVICE_10001": "", + "ORG_ZSTACK_MTTYDEVICE_10000": "사전 정의된 인스턴스 유형 템플릿을 업데이트할 수 없습니다.", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10004": "", + "ORG_ZSTACK_MTTYDEVICE_10004": "mtty 장치[uuid:%s]에서 생성된 mdev 장치가 VM에 여전히 연결되어 있습니다.", + "ORG_ZSTACK_MTTYDEVICE_10003": "", + "ORG_ZSTACK_HYGON_KVM_10004": "mtty 장치 [UUID:%s]가 mdevs 리소스로 가상화되지 않았습니다.", + "ORG_ZSTACK_STORAGE_ZBS_10014": "", + "ORG_ZSTACK_STORAGE_ZBS_10015": "UUID: %s의 Preconfiguration Template VO를 찾을 수 없습니다. 삭제되었을 수 있습니다.", + "ORG_ZSTACK_STORAGE_ZBS_10012": "", + "ORG_ZSTACK_STORAGE_ZBS_10016": "MTty 장치 [UUID:%s]를 포함하는 호스트 [UUID:%s]가 연결되어 있지 않습니다.", + "ORG_ZSTACK_ZWATCH_DATATYPE_10010": "", + "ORG_ZSTACK_STORAGE_ZBS_10017": "mtty 장치 [UUID:%s]를 mdevs로 가상화할 수 없습니다.", + "ORG_ZSTACK_HYGON_KVM_10003": "", + "ORG_ZSTACK_HYGON_KVM_10002": "호스트[UUID:%s]에서 Hygon CPU 장치 정보를 가져오지 못했습니다: %s", + "ORG_ZSTACK_HYGON_KVM_10001": "", + "ORG_ZSTACK_HYGON_KVM_10000": "ZBS 기본 저장소[uuid:%s]가 삭제되었거나 연결이 해제되었을 수 있습니다.", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10021": "", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10023": "KVM 호스트[UUID:%s]를 찾을 수 없습니다. 클라이언트를 배포할 수 없습니다.", + "ORG_ZSTACK_STORAGE_MIGRATION_10000": "", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10024": "ZBS 기본 저장소[uuid:%s]에 연결할 수 없습니다. 모든 메타데이터 서버에 연결하지 못했습니다.", + "ORG_ZSTACK_STORAGE_MIGRATION_10001": "", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10025": "addon 정보가 null입니다. 기본 저장소[uuid:%s]가 준비되지 않았습니다. ping 작업을 건너뜁니다.", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10026": "", + "ORG_ZSTACK_STORAGE_MIGRATION_10004": "잘못된 레이블입니다. 'value' 필드는 null일 수 없습니다. 유효한 값을 제공하세요.%s", + "ORG_ZSTACK_STORAGE_MIGRATION_10005": "", + "ORG_ZSTACK_STORAGE_MIGRATION_10003": "충분한 공간[%d]과 필요한 URL: %s를 가진 사용 가능한 논리적 볼륨이 없습니다.", + "ORG_ZSTACK_STORAGE_MIGRATION_10008": "", + "ORG_ZSTACK_STORAGE_MIGRATION_10009": "대상 기본 스토리지가 현재 호스트에 대한 마이그레이션 작업을 지원하지 않습니다. 스토리지가 마이그레이션 작업과 호환되는지 확인하고 다시 시도하십시오.", + "ORG_ZSTACK_STORAGE_MIGRATION_10006": "스토리지 마이그레이션 취소에 VM 상태[%s]를 지원하지 않음", + "ORG_ZSTACK_STORAGE_MIGRATION_10007": "VM 마이그레이션 `%s`에 대한 호스트 후보를 결정하지 못했습니다. 대상 호스트와 네트워크 연결을 확인하십시오.", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10005": "virtio 드라이버 장치 형식이 잘못됨: %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10004": "VM[uuid:%s]에서 virtio ISO 분리 실패: 지원되지 않음", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10003": "VM[uuid:%s]에서 virtio 장치 분리 실패", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10002": "mn[uuid:%s]에서 파일[%s]의 md5 읽기 실패로 virtio 드라이버 연결 실패: %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10001": "mn[uuid:%s]의 파일[%s]에 대한 잘못된 MD5로 virtio 드라이버 연결 실패", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10000": "mn[uuid:%s]에서 파일[%s]의 md5 읽기 실패로 virtio 드라이버 연결 실패: 클래스 경로에서 가상 디스크 파일을 찾을 수 없음", + "ORG_ZSTACK_DIRECTORY_10010": "지정된 디렉터리 유형 %s은(는) 지원되지 않음; 지원되는 유형은 %s입니다.", + "ORG_ZSTACK_SCHEDULER_VM_10001": "VM[uuid:%s]이(가) 종료되었으므로 상태 변경이 허용되지 않음", + "ORG_ZSTACK_STORAGE_ZBS_10040": "MDS[%s] 메타데이터를 가져오지 못했습니다. ZBS 구성을 확인하십시오.", + "ORG_ZSTACK_STORAGE_ZBS_10032": "모든 메타데이터 서버가 HTTP 요청[%s]을(를) 실행할 수 없습니다.", + "ORG_ZSTACK_STORAGE_ZBS_10036": "ZBS 기본 스토리지 MDS[%s] 버전이 관리 노드[%s]와 일치하지 않습니다. MDS를 다시 연결하고 SSH 연결을 확인하십시오.", + "ORG_ZSTACK_STORAGE_ZBS_10037": "MDaaS URL은 null이거나 비어 있을 수 없습니다.", + "ORG_ZSTACK_STORAGE_ZBS_10034": "ZBS 기본 스토리지 MDS[%s]에서 메타데이터를 동기화할 수 없습니다. 원인: %s", + "ORG_ZSTACK_STORAGE_ZBS_10038": "모든 메타데이터 서비스 인스턴스에서 논리적 볼륨을 검색할 수 없습니다. 세부 정보: %s", + "ORG_ZSTACK_STORAGE_ZBS_10039": "SSH 연결을 설정하지 못했거나 MDS[%s]에 zbs-tools가 설치되어 있지 않습니다. SSH 구성을 확인하고 필요한 종속성이 설치되어 있는지 확인하십시오.", + "ORG_ZSTACK_DIRECTORY_10006": "디렉터리 %s와(과) 디렉터리 %s 사이에 순환 종속성이 감지되었습니다.이로 인해 가상 환경 프로비저닝에서 구성 충돌이나 무한 루프가 발생할 수 있습니다.", + "ORG_ZSTACK_DIRECTORY_10003": "제공한 이름에 지원되지 않는 문자가 포함되어 있습니다. 클라우드 컴퓨팅 환경에서 이름은 중국어 문자, 영어 문자, 숫자, 공백 및 다음 특수 문자만 포함할 수 있습니다: ()()[]@._-+ . 이름이 이러한 지침을 준수하는지 확인하십시오.", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10000": "이벤트 버스에서 EventFamily[name:%s]을(를) 찾을 수 없습니다.", + "ORG_ZSTACK_DIRECTORY_10004": "모든 리소스 zoneUuid는 디렉터리 zoneUuid[%s]와(과) 일치해야 합니다.", + "ORG_ZSTACK_DIRECTORY_10001": "클라우드 디렉터리에서 리소스 유형 %s은(는) 지원되지 않습니다. 허용되는 유형은 %s입니다.", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10002": "지정된 네임스페이스 또는 이벤트 패밀리 리포지토리에서 EventFamily[name:%s, namespace:%s]을(를) 찾을 수 없습니다.", + "ORG_ZSTACK_DIRECTORY_10000": "리소스 %s이(가) 이미 디렉터리 UUID[%s]에 바인딩되었습니다. 여러 경로는 지원되지 않습니다.", + "ORG_ZSTACK_NAS_10002": "type[%s]에 대한 중복 NasFileSystemFactory", + "ORG_ZSTACK_NAS_10000": "NAS 파일 시스템 [%%s]이(가) 아직 존재하지 않습니다.", + "ORG_ZSTACK_NAS_10001": "type: %s에 대한 NAS 팩터리를 찾을 수 없습니다.", + "ORG_ZSTACK_DIRECTORY_10009": "디렉터리 생성에 실패했습니다. 경로가 올바르게 지정되었는지 확인하고 4단계의 가상 디렉터리를 초과하지 않는지 확인하십시오.", + "ORG_ZSTACK_DIRECTORY_10008": "디렉터리 이름이 중복됩니다. 이름이 %s인 볼륨[uuid: %s]이(가) 이미 존재합니다.", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10011": "잘못된 쿼리 태그[%s]입니다. 허용되는 태그 이름은 %s입니다.", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10012": "[%s] 이름의 Event Family가 여러 개 있습니다. 반드시 레이블 [%s]을(를) 지정해야 합니다.", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10006": "데이터 볼륨 [%s]이(가) 있는 VM에 메모리 스냅샷이 있으므로 분리할 수 없습니다.", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10005": "메모리 스냅샷 그룹이 있는 가상 머신 인스턴스 %s에 볼륨 %s을(를) 연결할 수 없습니다.", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10004": "데이터 볼륨 [%s]이(가) 있는 VM에 메모리 스냅샷이 있으므로 삭제가 허용되지 않습니다.", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10003": "볼륨 {volume_id}이(가) 존재하지 않습니다", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10001": "L3 네트워크 [uuid: %s]가 Volume Snapshot Group [uuid: %s]에서 참조되고 있습니다. 이 L3 네트워크를 삭제하기 전에 Volume Snapshot Group을 삭제하십시오.", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10000": "기본 L3 네트워크 UUID가 존재하지 않습니다", + "ORG_ZSTACK_AI_10086": "ModelServiceGroup이 여전히 %s에서 참조되고 있어 삭제할 수 없습니다", + "ORG_ZSTACK_AI_10087": "taskUuid는 비어 있을 수 없습니다. 작업을 제출하기 전에 올바르게 설정되었는지 확인하십시오.", + "ORG_ZSTACK_AI_10084": "시스템 인스턴스[uuid: %s]은(는) 삭제할 수 없습니다", + "ORG_ZSTACK_AI_10082": "모델 삭제 실패, 모델[uuid: %s]이(가) 여전히 %s에서 사용 중입니다", + "ORG_ZSTACK_AI_10083": "모델[uuid: %s]이(가) 클라우드 저장소에 존재하지 않습니다", + "ORG_ZSTACK_AI_10080": "ModelEval 서비스 유형이 배포된 경우 사용자 정의 URL에는 모델 필드가 필요합니다.%s", + "ORG_ZSTACK_AI_10081": "L3 네트워크 UUID %s에 DHCP 서비스가 활성화되어 있지 않습니다. 정적 IP를 할당하려면 정적 IP 시스템 태그가 필요합니다.", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10007": "저장소 스냅샷을 포함하여 여러 호스트에서 동시에 볼륨 스냅샷을 생성하는 작업은 지원되지 않습니다.", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10008": "설치 URL[%s]에 대한 저장소 공간을 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10005": "ID %s에 등록된 기본 저장소 플러그인이 없습니다", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10006": "[%s] 유형의 저장소 솔루션에서 프로토콜[%s]을(를) 지원하지 않습니다", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10009": "블록 저장소 볼륨을 찾을 수 없습니다. 블록 저장소 볼륨에 대한 액세스 경로가 구성되어 있는지 확인하십시오.", + "ORG_ZSTACK_CONFIGURATION_10009": "예약된 메모리 크기[%s 바이트]가 사용 가능한 메모리 크기[%s 바이트]를 초과합니다", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10010": "기본 저장소[uuid:%s]를 지원하기 위해 백업 저장소 유형이 지정되지 않았습니다", + "ORG_ZSTACK_CONFIGURATION_10008": "메모리 크기[%s 바이트]가 최신 운영 체제 부트스트랩에 부족합니다. 클라우드 가상 환경에서는 최소 16MB를 권장합니다.", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10011": "연결된 이미지가 삭제되어 캐시를 찾을 수 없으므로 루트 볼륨 [%s]을(를) 다시 초기화할 수 없습니다", + "ORG_ZSTACK_MULTICAST_ROUTER_10005": "멀티캐스트 라우터 [uuid:%s]가 VPC Router와 연결되어 있지 않습니다", + "ORG_ZSTACK_CONFIGURATION_10007": "vcpu 수[%s]가 1보다 작습니다", + "ORG_ZSTACK_MULTICAST_ROUTER_10006": "Rendezvous Point [%s]은(는) 유니캐스트 IP 주소가 아닙니다", + "ORG_ZSTACK_CONFIGURATION_10006": "지원되지 않는 인스턴스 유형[%s]", + "ORG_ZSTACK_MULTICAST_ROUTER_10007": "그룹 주소 [%s]는 멀티캐스트 그룹 주소가 아닙니다", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014": "저장소가 정상 상태가 아닙니다:%s", + "ORG_ZSTACK_MULTICAST_ROUTER_10000": "multicastRouter[uuid:%s]가 VPC 라우터와 연결되지 않았습니다", + "ORG_ZSTACK_MULTICAST_ROUTER_10001": "VPC 라우터 UUID[:%s]에서 멀티캐스트가 이미 활성화되어 있습니다", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012": "정규식[%s]이 스냅샷 경로와 일치하지 않아 내부 스냅샷 경로[%s]에서 소유 볼륨 경로를 찾을 수 없습니다", + "ORG_ZSTACK_MULTICAST_ROUTER_10002": "멀티캐스트 라우터 [uuid:%s]의 vPC 라우터가 삭제되었습니다", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10013": "외부 기본 스토리지[%s] ping 실패, 네트워크 연결 또는 스토리지 서비스 상태를 확인하십시오.%s", + "ORG_ZSTACK_CONFIGURATION_10001": "인스턴스 오퍼링 [UUID: %s]에 대한 사용자 정의 시스템 태그가 이미 존재합니다.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10004": "토큰 응답이 null입니다. 인증 프로세스가 올바르게 구성되어 있고 토큰 엔드포인트가 유효한 응답을 반환하는지 확인하십시오.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10003": "타입(%s)에 대한 OAuth2Login 구현을 찾을 수 없습니다", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10005": "%s이(가) null입니다: 소스 파일 경로가 올바르게 지정되었는지 확인하십시오.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10000": "타입[%s]에 대한 중복 OAuth2 인증 핸들러", + "ORG_ZSTACK_CONFIGURATION_10004": "인스턴스 오퍼링에 대한 시스템 태그는 둘 이상 있을 수 없습니다.", + "ORG_ZSTACK_CONFIGURATION_10003": "디스크 오퍼링 [UUID: %s]에 대한 사용자 정의 시스템 태그가 이미 존재합니다.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10002": "타입(%s)에 대한 OAuth2 제공자를 찾을 수 없습니다", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10001": "이름[%s]에 대한 중복 OAuth2 제공자[%s]", + "ORG_ZSTACK_AI_10075": "ContainerModelService에는 dockerImage를 지정해야 합니다.", + "ORG_ZSTACK_AI_10076": "UUID:%s인 모델 서비스를 위한 모델 센터 UUID:%s를 찾을 수 없습니다", + "ORG_ZSTACK_AI_10071": "vmImageUuid는 VirtualMachine 모델 서비스에 필요한 매개변수입니다. 유효한 vmImageUuid 값을 제공하십시오.", + "ORG_ZSTACK_AI_10072": "지정된 VM 이미지 UUID가 잘못되었습니다. 확인하고 유효한 UUID를 제공하십시오.", + "ORG_ZSTACK_AI_10070": "ModelServiceType[%s]은(는) 종속 모델 서비스 그룹 UUID를 가질 수 없습니다", + "ORG_ZSTACK_MULTICAST_ROUTER_10008": "멀티캐스트 라우터 [uuid:%s]에 대한 RP 주소 쌍 [%s: %s]이(가) 이미 존재합니다", + "ORG_ZSTACK_MULTICAST_ROUTER_10009": "멀티캐스트 라우터 [uuid:%s]에 대한 rpc 주소 튜플 [%s : %s]이(가) 존재하지 않습니다", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10015": "사용자[%s] 업로드 실패: 클라우드 환경에 사용자가 이미 존재합니다", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10017": "코드 응답 가져오기 오류: %s", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10016": "사용자[%s] 업로드 실패: %s", + "ORG_ZSTACK_AI_10079": "ModelEval 서비스 유형은 지정된 modelServiceGroupUuids 내의 기존 모델 서비스 또는 사용을 위한 유효한 URL이 필요합니다.", + "ORG_ZSTACK_AI_10077": "배포 메시지에 L3 네트워크 UUID가 제공되지 않았으며, 모델 센터 [UUID:%s]에는 serviceNetworkUuid 또는 storageNetworkUuid가 구성되어 있지 않습니다.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10012": "iam2에 이름이 [%s]인 동일한 사용자가 있습니다", + "ORG_ZSTACK_AI_10078": "클라우드 환경 구성에서 환경 변수 값이 null이 아니어야 합니다. 모든 필수 변수가 올바르게 설정되었는지 확인하십시오.", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_SUPPLIER_EMAY_10000": "공급자[%s]와(과) 잘못된 매개변수", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10026": "클라우드 서비스에서 검색한 사용자 이름이 null입니다. 사용자 인증 구성을 확인하십시오.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10025": "파라미터[%s]를 가져오지 못함", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10028": "플러그인 [uuid:%s]이(가) OAuth2 클라이언트 [uuids:%s]에서 서드파티 로그인 인증에 사용되고 있습니다.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10027": "로컬 사용자에게 동일한 이름[%s]의 사용자가 있습니다", + "ORG_ZSTACK_AI_10097": "그룹[uuid: %s] 내의 모델 서비스 유형이 일치하지 않습니다. 예상 유형: %s, 발견된 유형: %s", + "ORG_ZSTACK_AI_10098": "가상화된 환경에서 모델 서비스 백엔드[type: %s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_AI_10095": "그룹[uuid: %s] 내의 모든 모델 서비스는 serviceBootUptime을 구성해야 합니다", + "ORG_ZSTACK_AI_10096": "그룹[uuid: %s]에서 노드 순위 0의 모델 서비스 인스턴스를 찾을 수 없습니다", + "ORG_ZSTACK_AI_10093": "모델 서비스 인스턴스[uuid: %s]이(가) 활성화되지 않고 준비되지 않았지만 오류 코드를 찾을 수 없습니다", + "ORG_ZSTACK_AI_10094": "예기치 않은 내용: %s 서비스의 YAML이 null로 파싱됨", + "ORG_ZSTACK_AI_10091": "준비 상태를 가져오지 못함: %s", + "ORG_ZSTACK_AI_10092": "모델 서비스 인스턴스[uuid: %s]이(가) %s로 인해 사용 가능하지 않고 준비되지 않았습니다", + "ORG_ZSTACK_AI_10090": "NGINX 구성 다시 로드 실패: %s", + "ORG_ZSTACK_VROUTERROUTE_10010": "대상[%s]은(는) 블랙홀과 정적 경로를 동시에 가질 수 없습니다", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10000": "외부 기본 스토리지[uuid:%s]를 찾을 수 없습니다", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10031": "%s에 %s 실패, 상태 코드: %s, 응답 본문: %s", + "ORG_ZSTACK_VROUTERROUTE_10012": "대상에 중복 블랙홀 경로 항목을 추가할 수 없습니다: %s", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10030": "HTTP 오류, 상태 코드: %s, 응답 본문: %s", + "ORG_ZSTACK_VROUTERROUTE_10011": "중복 정적 경로 항목을 추가할 수 없습니다, 대상: %s, 대상: %s, 유형: %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10003": "locationUrl:%s의 필수 공간 조건을 충족할 수 없음 [availableSize > %d바이트], 현재 사용 가능한 크기 %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10004": "UUID [%s] 설치 경로의 볼륨을 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10001": "외부 스토리지 서비스에 연결할 수 없습니다. 스토리지 서비스가 클라우드 환경 내에서 올바르게 구성되고 접근 가능한지 확인하십시오.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10032": "%s에 %s 실패, IO 오류: %s", + "ORG_ZSTACK_AI_10099": "모델 서비스 인스턴스 그룹[uuid: %s]이(가) 존재하지 않습니다", + "ORG_ZSTACK_VROUTERROUTE_10001": "가상 라우터 유형[%s]에 대한 서비스 팩토리를 찾을 수 없습니다", + "ORG_ZSTACK_VROUTERROUTE_10000": "가상 라우터[uuid:%s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10015": "Ceph BS[uuid=%s] 풀 이름을 찾을 수 없습니다", + "ORG_ZSTACK_VROUTERROUTE_10003": "라우트 테이블 [uuid:%s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10012": "Ceph 백업 스토리지 MON [UUID:%s]의 상태를 업데이트할 수 없습니다. 삭제되었습니다. 이 오류는 무시할 수 있습니다.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10000": "호스트 스케줄링 그룹[uuid:%s]을(를) 찾을 수 없습니다. 삭제되거나 재할당되었을 수 있습니다", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10003": "호스트 [UUID:%s]이(가) 이미 호스트 스케줄링 그룹 [UUID:%s]에 연결되어 있습니다.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10004": "UUID %s인 호스트가 null입니다. 클러스터 구성을 확인해 주세요.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10001": "가상 머신 스케줄링 규칙[uuid:%s]을 찾을 수 없습니다. 삭제되었을 수 있습니다", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10002": "가상 머신 스케줄링 그룹[uuid:%s]을 찾을 수 없습니다. 삭제되었을 수 있습니다", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10011": "CEPH 백업 스토리지는 이미지 체크섬 계산을 지원하지 않습니다.", + "ORG_ZSTACK_SNS_PLATFORM_HTTP_10000": "HTTP POST 요청 실패. 상태: %s, 본문: %s", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10007": "이미지[uuid: %s]가 백업 스토리지[uuid:%s, name:%s]에서 사용 가능하지 않습니다", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10005": "동일한 FSID를 가진 다른 CEPH 백업 스토리지가 있습니다. 동일한 CEPH 설정을 두 개의 다른 백업 스토리지로 추가할 수 없습니다.[name:%s, uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10003": "CEPH 백업 스토리지[UUID:%s]에 연결할 수 없습니다. 모든 Ceph 모니터 연결에 실패했습니다.", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10002": "백업 스토리지[uuid:%s]에서 CephMon[hostname:%s]을 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10009": "CEPH 백업 스토리지 클러스터에 MON 노드를 추가할 수 없습니다", + "ORG_ZSTACK_MULTICAST_ROUTER_BACKEND_10000": "백엔드에서 멀티캐스트를 활성화하는 동안 멀티캐스트 라우터 [uuid:%s]가 삭제되었습니다", + "ORG_ZSTACK_LDAP_10016": "LDAP 항목 조회 실패, %s", + "ORG_ZSTACK_LDAP_10017": "LDAP 항목 조회[필터: %s] 실패, 원인: %s", + "ORG_ZSTACK_LDAP_10012": "LDAP/AD 서버에 연결할 수 없습니다. 제공된 자격 증명이 잘못되었습니다. 사용자 DN과 암호를 확인해 주세요.", + "ORG_ZSTACK_LDAP_10013": "LDAP/AD 서버에 연결할 수 없습니다. 통신 실패입니다. IP 주소, 포트 번호 및 Base DN을 확인해 주세요.", + "ORG_ZSTACK_LDAP_10014": "LDAP/AD 서버에 연결할 수 없습니다, %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10005": "현재 라이선스[%s]는 이미지 스토어 백업 스토리지 작업에 유효하지 않습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10004": "CephPrimaryStorage[%s]가 존재하지 않습니다!", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10001": "이미지 [uuid:%s]가 클라우드 저장소 저장소에서 삭제되었습니다", + "ORG_ZSTACK_LDAP_10010": "잘못된 LdapServerType[%s], 유효한 값: [%, %s]", + "ORG_ZSTACK_LDAP_10007": "계정[UUID:%s]을 찾을 수 없습니다!!!", + "ORG_ZSTACK_LDAP_10008": "클라우드 환경 구성에 대해 지원되지 않는 LDAP/AD 서버 범위입니다. 범위가 가상화 및 클라우드 컴퓨팅 표준과 호환되는지 확인해 주세요.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10000": "가상 라우터 [uuid:%s]의 가상 머신 네트워크 인터페이스 [uuid:%s]에 대한 탄력적 IP [uuid:%s, name:%s, ip:%s] 생성 실패, %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10001": "영역 [uuid:%s]의 L3Network [uuid:%s]에 대한 가상 라우터 오퍼링 [uuid:%s]을 찾았습니다. 그러나 네트워크의 공용 IP 구성은 탄력적 IP [uuid:%s]와 일치하지 않습니다. L3Network [uuid:%s]에 시스템 태그 guestL3Network::l3NetworkUuid를 사용하여 특정 가상 라우터 오퍼링을 지정해야 할 수 있습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10002": "가상 라우터 [uuid:%s]의 VM NIC [uuid:%s]에서 EIP [uuid:%s, name:%s, ip:%s] 분리 실패, %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10004": "가상 라우터[uuid:%s]에서 EIP 동기화 실패, 오류 상세 정보: %s", + "ORG_ZSTACK_AI_10004": "randomUuid가 예상 값과 일치하지 않습니다. UUID 생성 로직을 확인해 주세요.", + "ORG_ZSTACK_AI_10005": "모델 센터를 찾을 수 없습니다. 모델 센터 서비스가 클라우드 환경에 적절하게 배포 및 구성되어 있는지 확인해 주세요.", + "ORG_ZSTACK_AI_10003": "randomUuid가 null입니다. 사용 전에 유효한 UUID가 생성되었는지 확인해 주세요.", + "ORG_ZSTACK_AI_10001": "제공된 모델 센터 관리 IP 주소 %s가 잘못되었습니다. 유효한 IP인지 확인하고 다시 시도해 주세요.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10027": "vm[uuid:%s]이(가) 현재 host[uuid:%s]에서 실행되고 있습니다. 이 호스트는 vm scheduling group[uuid:%s]에 연결된 scheduling policy[%s]을(를) 준수하지 않습니다.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10028": "vm[uuid:%s]이(가) 현재 host[uuid:%s]에서 실행되고 있습니다. 이 호스트는 virtual machine scheduling group[uuid:%s]에 연결된 scheduling rule[%s]을(를) 준수하지 않습니다.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10019": "VM scheduling group [UUID:%s]에는 이미 실행된 exclusive 또는 affinity 기반 VM scheduling policy가 연결되어 있습니다. 실행이 필요한 이러한 유형의 정책을 이 그룹에 다시 연결할 수 없습니다.", + "ORG_ZSTACK_AI_10028": "modelServices는 null이거나 비어 있을 수 없습니다. 서비스 인스턴스가 올바르게 초기화 및 구성되어 있는지 확인하십시오.", + "ORG_ZSTACK_AI_10029": "modelServices는 일관성을 위해 가상 인스턴스와 동일한 model UUID를 사용해야 합니다.", + "ORG_ZSTACK_AI_10026": "serviceNetworkUuid %s은(는) system Layer 3 network가 아닙니다.", + "ORG_ZSTACK_AI_10027": "storageNetworkUuid %s은(는) system Layer 3 network가 아닙니다.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10025": "vm[uuid:%s]이(가) 현재 host[uuid:%s]에서 실행되고 있습니다. 이 호스트는 virtual machine의 scheduling group[uuid:%s]에 연결된 scheduling policy를 준수하지 않습니다.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10026": "hostGroup[uuid:%s]에는 할당된 호스트가 없습니다.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10024": "vm scheduling group[uuid:%s]이(가) vm [uuid:%s]을(를) 위해 host [uuid:%s]을(를) 예약하지 못했습니다.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10007": "vm[uuid:%s]은(는) 이미 vm scheduling group[uuid:%s]에 연결되어 있습니다.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10008": "일치하지 않는 zone이 감지되었습니다: VM[UUID: %s, Zone UUID: %s]이(가) 해당 scheduling rule group[UUID: %s, Zone UUID: %s]과(와) 다릅니다.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10005": "host scheduling group에 추가할 수 있는 호스트는 활성화되어 있고 Management Node(MN)에 연결되어 있어야 합니다.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10006": "일치하지 않는 zone이 감지되었습니다: host [uuid: %s, zone uuid: %s]의 zone이 host scheduling rule group [uuid: %s, zone uuid: %s]과(와) 다릅니다.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10009": "vm은 [%s,%s] 상태에서만 VM scheduling group을 변경할 수 있지만, 현재 상태는 [%s]입니다.", + "ORG_ZSTACK_TEMPLATECONFIG_10000": "TemplateConfigs를 찾을 수 없습니다: [template UUID: %s]", + "ORG_ZSTACK_TICKET_API_10002": "구성에 정의된 account system type [%s]이(가) 없습니다.", + "ORG_ZSTACK_TICKET_API_10003": "클라우드 환경 구성에서 ticket type을 찾을 수 없습니다.%s", + "ORG_ZSTACK_TICKET_API_10004": "일치하는 ticket flow collection이나 기본 ticket flow collection을 찾을 수 없습니다. flowCollectionUuid를 지정하거나 시스템에서 기본 ticket flow collection을 생성하십시오.", + "ORG_ZSTACK_TEMPLATECONFIG_10003": "Template Configuration을 찾을 수 없습니다[category: %s, name: %s, template UUID: %s]", + "ORG_ZSTACK_TICKET_API_10005": "Ticket flow collection [UUID:%s]이(가) ticket type [UUID:%s]과(와) 일치하지 않습니다.", + "ORG_ZSTACK_TICKET_API_10006": "Ticket flow collection[uuid:%s]이(가) 유효하지 않습니다. 수정을 위해 관리자에게 문의하십시오.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10000": "Aliyun NAS primary storage [UUID:%s, Name:%s]은(는) 볼륨 인스턴스화를 위해 연결된 클러스터 내에서 사용 가능한 호스트를 찾을 수 없습니다.", + "ORG_ZSTACK_TICKET_API_10007": "Ticket flow collection [UUID:%s]이(가) 비활성화되어 있어 사용할 수 없습니다.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10001": "Alibaba Cloud NAS primary storage [UUID:%s, Name:%s]은(는) primary storage에서 bits를 삭제하기 위해 연결된 클러스터 내에서 사용 가능한 호스트를 찾을 수 없습니다.", + "ORG_ZSTACK_TICKET_API_10008": "잘못된 요청입니다. 지정된 namespace나 scope에서 API[%s]을(를) 찾을 수 없습니다.", + "ORG_ZSTACK_TICKET_API_10009": "잘못된 요청입니다. apiBody에서 API[%s]을(를) 생성할 수 없습니다, %s", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10010": "VPC VM scheduling group을操作할 수 없습니다.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10011": "availability zone의 UUID는 null이 아닙니다.", + "ORG_ZSTACK_TEMPLATECONFIG_10005": "TemplateConfigs를 찾을 수 없습니다: [templateUUID: %s]", + "ORG_ZSTACK_AI_10012": "클라우드 가상화 환경에서 architectureImages는 null이거나 비어 있을 수 없습니다. 올바르게 구성되어 있는지 확인하세요.", + "ORG_ZSTACK_AI_10042": "잘못된 CloudFormation 템플릿 형식: %s", + "ORG_ZSTACK_AI_10043": "클라우드 컴퓨팅 환경에서 YAML 구성과 개별 매개변수 업데이트는 상호 배타적입니다. 설정을 업데이트하는 방법 하나를 선택하세요.", + "ORG_ZSTACK_AI_10040": "servicePorts에 중복된 값이 포함될 수 없습니다: %s", + "ORG_ZSTACK_AI_10041": "serviceBootupTime은 [1,65535] 범위 내에 있어야 합니다", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10006": "호스트에서 마운트 경로를 확인하지 못했습니다: %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10005": "Aliyun NAS 기본 스토리지 [UUID: %s, name: %s]가 클러스터에 연결되지 않았거나, 연결된 클러스터에 연결된 호스트가 없습니다.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10009": "이미지 캐시를 정리할 호스트를 찾을 수 없습니다. 이미지 캐싱에 적어도 하나의 호스트가 사용 가능하고 올바르게 구성되어 있는지 확인하세요.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10013": "클러스터에 기본 스토리지를 연결할 수 없습니다. 클러스터의 KVM 호스트 [uuid:%s, name:%s]가 qemu-img 버전 [%s]을 사용하는 반면, 기본 스토리지가 연결된 클러스터의 KVM 호스트 [uuid:%s]는 qemu-img 버전 [%s]을 사용합니다. %s보다 큰 qemu-img 버전은 %s보다 작은 버전과 호환되지 않아 볼륨 스냅샷 작업이 실패할 수 있습니다. qemu-img 버전 불일치를 방지하기 위해 서로 다른 Linux 배포판을 가진 클러스터에 기본 스토리지를 연결하는 것을 피하세요.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10014": "이미지 캐시를 다운로드할 사용 가능한 컴퓨트 리소스를 찾을 수 없습니다!", + "ORG_ZSTACK_AI_10049": "아키텍처 이미지 매핑의 CPU 아키텍처는 비어 있을 수 없습니다. 유효한 CPU 아키텍처가 지정되어 있는지 확인하세요.", + "ORG_ZSTACK_AI_10046": "GPU 벤더 %s는 사양 UUID 목록을 제공해야 합니다", + "ORG_ZSTACK_AI_10047": "벤더 %s에 대한 GPU 사양 UUID가 %s에서 찾을 수 없습니다: %s", + "ORG_ZSTACK_AI_10044": "아키텍처 이미지 매핑의 GPU 벤더 사양 매핑은 비어 있을 수 없습니다. GPU 벤더가 올바르게 지정되어 있는지 확인하세요.", + "ORG_ZSTACK_AI_10045": "아키텍처 이미지 매핑의 GPU 벤더는 비어 있을 수 없습니다. 유효한 GPU 벤더 이름을 제공하세요.", + "ORG_ZSTACK_AI_10031": "modelServices UUID는 null이 아니어야 합니다. modelServices에 유효한 UUID가 제공되었는지 확인하세요.", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10008": "메타데이터信封을 구문 분석하지 못했습니다: %s, %s", + "ORG_ZSTACK_AI_10032": "nodeRank는 [0, %s) 범위 내에 있어야 하지만, %s을(를) 받았습니다", + "ORG_ZSTACK_AI_10030": "modelServices는 컴퓨트 노드와 동일한 zone UUID를 사용해야 합니다.", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10003": "소스 파일 경로에 대한 잘못된 인수", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10004": "제공된 암호화 키를 사용하여 데이터 암호를 해독하지 못했습니다. 키를 확인하고 다시 시도하세요.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10017": "AliyunNasAccessGroupVO[%s]이(가) 존재하지 않습니다. 삭제되었을 수 있습니다!", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10018": "EcsVSwitchVO[%s]이(가) 존재하지 않습니다. 삭제되었을 수 있습니다!", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10020": "기본 스토리지에서 작업을 수행할 사용 가능한 호스트를 찾을 수 없습니다: %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10021": "호스트[UUID:%s]에서 Aliyun NAS 기본 스토리지[UUID:%s]에 ping하지 못했습니다. 이유: %s. 이 호스트-NAS 연결을 끊으세요.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10024": "type[%s]에 대한 BackupStorageKVMFactory를 찾을 수 없습니다", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10025": "볼륨을 관리할 호스트를 찾을 수 없습니다: [%s]", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10023": "NAS 기본 스토리지가 마운트되지 않았습니다. 먼저 초기화하세요!", + "ORG_ZSTACK_AI_10039": "servicePorts는 [1,65535] 범위 내에 있어야 하지만, %s을(를) 받았습니다", + "ORG_ZSTACK_AI_10037": "serviceLivez는 '/'로 시작하고 공백을 포함하지 않아야 하며, 길이가 512자를 초과하지 않아야 합니다.", + "ORG_ZSTACK_AI_10038": "serviceReadyz는 /로 시작해야 하며, 공백을 포함할 수 없으며 길이는 최대 512자까지 허용됩니다.", + "ORG_ZSTACK_AI_10035": "잘못된 프레임워크: %s, 유효한 값은: EC2, GCE, Azure, OpenStack", + "ORG_ZSTACK_AI_10036": "잘못된 프레임워크: %s", + "ORG_ZSTACK_AI_10033": "잘못된 PCI 장치 식별자: %s", + "ORG_ZSTACK_AI_10034": "nodeRank는 고유해야 하지만, %s를(을) 얻었습니다", + "ORG_ZSTACK_ACL_10001": "%s IP 항목이 접근 제어 목록 그룹과 중복/겹침:%s", + "ORG_ZSTACK_AI_10064": "잘못된 데이터셋 스키마 구조: %s", + "ORG_ZSTACK_ACL_10000": "IP 버전 %d를(을) 지원하지 않습니다", + "ORG_ZSTACK_AI_10065": "시스템 사전 설정 데이터셋은 API 호출을 통해 업데이트할 수 없습니다. 지원을 위해 문의하시기 바랍니다.", + "ORG_ZSTACK_AI_10062": "데이터셋이 사용 중이므로 API를 통해 삭제할 수 없습니다. 삭제를 시도하기 전에 관련된 모든 리소스가 종료되었는지 확인하십시오.", + "ORG_ZSTACK_AI_10063": "updateDatasetStructures는 null이거나 비어 있을 수 없습니다. 진행하기 전에 데이터셋 구조가 올바르게 정의되고 채워졌는지 확인하십시오.", + "ORG_ZSTACK_AI_10060": "VM 인스턴스를 종료할 수 없습니다. 모델 서비스 그룹에서 사용 중입니다 [UUID: %s]", + "ORG_ZSTACK_ZSV_COMPUTER_VM_10000": "VM 이름 %s가(은) 클라우드 환경에 이미 존재합니다", + "ORG_ZSTACK_AI_10061": "애플리케이션 인스턴스 그룹의 공유가 허용되지 않습니다: %s", + "ORG_ZSTACK_ACL_10009": "접근 제어 목록 그룹[%s]에는 이미 리다이렉트 규칙이 하나 있으므로 추가할 수 없습니다", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10028": "마운트 경로를 확인할 수 있는 사용 가능한 컴퓨트 리소스가 없습니다!", + "ORG_ZSTACK_ACL_10008": "접근 제어 목록 그룹[%s]에는 이미 IP 항목이 있으므로 리다이렉트 규칙을 추가할 수 없습니다", + "ORG_ZSTACK_ACL_10007": "접근 제어 목록 그룹[%s]에는 이미 리다이렉트 규칙이 있으므로 IP 항목을 추가할 수 없습니다", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10026": "기본에서 볼륨 크기를 동기화할 호스트를 찾을 수 없습니다: %s", + "ORG_ZSTACK_ACL_10006": "접근 제어 목록 그룹[%s]은(는) %d IP 항목을 초과할 수 없습니다", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10027": "이미지 [%s]가(은) 삭제되었으므로 해당 이미지에서 루트 볼륨을 재초기화할 수 없습니다", + "ORG_ZSTACK_SCHEDULER_SNAPSHOT_10000": "루트 볼륨 [%s]의 VM이(가) Destroyed 상태입니다. 이 작업에 대해 상태 변경이 허용되지 않습니다.", + "ORG_ZSTACK_ACL_10005": "접근 제어 목록 그룹[%s]에는 이미 리다이렉트 규칙이 있으므로 IP 항목을 추가할 수 없습니다", + "ORG_ZSTACK_ACL_10004": "잘못된 규칙 표현식입니다. 클라우드 컴퓨팅 표준(예: 플레이스홀더에 %s 올바른 사용)을 준수하는지 확인하십시오. 세부 정보: %s", + "ORG_ZSTACK_ACL_10003": "IP 범위 [%s, %s]가(은) 접근 제어 목록 그룹[%s] 내의 [%s, %s]과(와) 겹칩니다", + "ORG_ZSTACK_ACL_10002": "IP 형식은 ip/iprange/cidr만 지원하지만 %s을(를) 찾았습니다", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10031": "Aliyun NAS PrimaryStorage는 imagestore BS만 지원합니다. 수신된 실제 유형: %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10000": "InfoSecEncryptDriver 암호화가 리소스 %s에 대해 실패했습니다", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10001": "InfoSecEncryptDriver 복호화가 가상 리소스 %s에 대해 실패했습니다", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10002": "암호화 데이터[%s] 또는 암호화 알고리즘 유형[%s]이(가) null입니다", + "ORG_ZSTACK_AI_10068": "모델 평가에는 ModelServiceType.ModelEval이 필요합니다.", + "ORG_ZSTACK_AI_10069": "모델 평가에는 데이터셋 UUID 또는 프롬프트 중 하나가 필요합니다.", + "ORG_ZSTACK_AI_10066": "ModelServiceVO의 UUID는 필수입니다. 유효한 UUID를 제공해 주세요.", + "ORG_ZSTACK_AI_10067": "serviceType을 지정해야 합니다.", + "ORG_ZSTACK_ACL_10012": "url[%s]은(는) 유효한 클라우드 스토리지 경로가 아닙니다.", + "ORG_ZSTACK_AI_10053": "아키텍처 %s용 이미지 [uuid:%s]가 비활성화되어 있어 사용할 수 없습니다.", + "ORG_ZSTACK_ACL_10011": "domain[%s]은(는) 유효한 도메인 이름이 아닙니다.", + "ORG_ZSTACK_AI_10054": "지정된 아키텍처 %s용 이미지 [uuid:%s]을(를) 사용할 수 없습니다.", + "ORG_ZSTACK_ACL_10010": "도메인과 URL을 모두 비울 수는 없습니다. 유효한 도메인이나 URL을 제공해 주세요.", + "ORG_ZSTACK_AI_10051": "아키텍처 %s에 대해 가상 머신 이미지 식별자(vmImageUuid) 또는 컨테이너 이미지(dockerImage) 중 하나 이상을 지정해야 합니다.", + "ORG_ZSTACK_AI_10052": "아키텍처 %s에 대한 이미지 UUID가 유효하지 않습니다: %s", + "ORG_ZSTACK_AI_10050": "아키텍처 이미지 매핑에서 CPU 아키텍처 유형이 유효하지 않습니다: %s, 지원되는 유형: %s", + "ORG_ZSTACK_AI_10059": "데이터셋 메시지에 데이터 유형 변형이 너무 많습니다: %s, 단일 유형으로 줄여 주세요.", + "ORG_ZSTACK_AI_10057": "클라우드 컴퓨팅 환경에서는 데이터 유형과 사용 시나리오를 지정하지 않고 데이터셋을 생성할 수 없습니다. 데이터셋에 필요한 세부 정보를 제공해 주세요.", + "ORG_ZSTACK_AI_10058": "데이터셋을 추가할 때 하나 이상의 데이터 유형을 지정해야 합니다.", + "ORG_ZSTACK_AI_10055": "아키텍처 이미지 매핑에서 중복된 CPU 아키텍처가 지정되었습니다: %s", + "ORG_ZSTACK_AI_10056": "아키텍처 이미지는 비어 있을 수 없습니다.", + "ORG_ZSTACK_VMWARE_10101": "%s에 대한 스토리지 목록 조회 실패", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10051": "LUN 이름은 필수이지만 null이 수신되었습니다. 유효한 LUN 이름을 제공해 주세요.", + "ORG_ZSTACK_VMWARE_10102": "VirtualMachine에 대한 데이터스토어를 찾을 수 없습니다: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10054": "볼륨:%s의 스냅샷 가져오기 실패, ID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10053": "LUN:%s의 스냅샷 가져오기 실패", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10012": "SFTP 백업 스토리지는 이미지 해시 계산을 지원하지 않습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10050": "initiator[%s]이(가) XStor에 이미 존재하며 호스트[%s]에 연결되어 있지 않습니다. initiator 이름이 고유한지 확인해 주세요.", + "ORG_ZSTACK_ALIYUN_NETWORK_10020": "실행 중 또는 중지 상태의 EC2 인스턴스에만 EIP를 연결할 수 있지만, ECS [%s]은(는) 현재 [%s] 상태입니다.", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10016": "이미지 메타데이터 파일 생성 실패: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10017": "이미지 메타데이터 파일 확인 실패: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10018": "이미지 메타데이터 파일이 존재하지 않습니다: %s", + "ORG_ZSTACK_ZWATCH_ALARM_10022": "알람[uuid:%s]에 대해 중복 작업[uuid:%s, type:%s]이(가) 있습니다.", + "ORG_ZSTACK_ZWATCH_ALARM_10021": "클라우드 컴퓨팅 환경에서 작업[uuid:%s, type:%s]을(를) 찾을 수 없습니다.", + "ORG_ZSTACK_ZWATCH_ALARM_10020": "잘못된 작업 유형[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10026": "중복된 키[%s]가 다른 값{%s}%과 함께 있습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10170": "공유 로드 밸런서 서버 그룹 %s에 서버 IP를 추가할 수 없습니다", + "ORG_ZSTACK_ZWATCH_ALARM_10025": "메트릭에 지정된 라벨[%s]이 없습니다", + "ORG_ZSTACK_ZWATCH_ALARM_10023": "UUID [uuid:%s]가 있는 알람에 중복된 라벨이 정의되어 있습니다", + "ORG_ZSTACK_ZWATCH_ALARM_10029": "메트릭[%s]은 관리자에게만 제한되어 있으며, 현재 사용자 역할에서는 사용할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10171": "vmincs와 서버 IP가 null이므로 백엔드 서버를 수정할 수 없습니다", + "ORG_ZSTACK_ZWATCH_ALARM_10028": "네임스페이스[%s]에 메트릭[%s]이 포함되어 있지 않습니다", + "ORG_ZSTACK_ZWATCH_ALARM_10027": "네임스페이스[%s]가 지원되지 않습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10049": "LUN ID가 잘못되었습니다. 클라우드 저장 장치에 필요한 형식과 값을 준수했는지 확인하십시오", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10048": "LUN 매핑 ID는 필수이며 null이나 0일 수 없습니다. 유효한 LUN 매핑 ID를 제공하십시오", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10045": "볼륨 매핑을 가져오지 못했습니다. 원인: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10044": "LUN %s 세션 상태를 확인하지 못했습니다. 원인: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10047": "LUN 매핑 ID를 검색하는 메커니즘이 없으므로 작업이 실패했습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10046": "LUN %s의 남은 생성 가능 LUN数を取得できませんでした. 原因: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10041": "스냅샷 ID는 필수이나 받았습니다:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10040": "인스턴스 %s에 대한 스냅샷을 쿼리하지 못했습니다. 원인: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10043": "스냅샷:%s로 복원하지 못했습니다. 원인: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10020": "SFTP 백업 저장소 %s에 대한 볼륨 템플릿을 생성하기 전에 VM을 중지하십시오", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10042": "스냅샷 %s를 삭제하지 못했습니다. 원인: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10023": "중복된 백업 저장소입니다. SFTP 백업 저장소[hostname:%s]가 이미 존재합니다", + "ORG_ZSTACK_LICENSE_CUBE_10000": "라이선스 유효성 검사를 위한 소스 코드 컨텍스트는 null일 수 없습니다. 유효한 컨텍스트 문자열을 제공하십시오", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10038": "저장소 풀 %s를 가져오지 못했습니다. 원인: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10037": "lun %s를 삭제하지 못했습니다. 원인: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10039": "볼륨 %s에 대한 스냅샷을 생성하지 못했습니다. 원인: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10034": "lun 매핑 id는 필수이나 받았습니다:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10033": "lun %s를 호스트 그룹 %s에 매핑하지 못했습니다. 원인: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10036": "lun id는 필수이나 받았습니다:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10035": "lun 매핑 %s를 삭제하지 못했습니다. 원인: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_10004": "ecs 인스턴스[%s]가 존재하지 않습니다. 확인하십시오", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10001": "%s가 이미지 저장소 백업 스토리지[hostname:%s, path: %s]에서 로컬 주 스토리지[uuid:%s, path: %s]로 가상 머신 데이터를 다운로드하지 못했습니다, %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10002": "로컬 스토리지[uuid:%s, path:%s]에서 이미지 저장소[hostname:%s]로 데이터를 업로드하지 못했습니다, %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10020": "L3 네트워크 %s와 VPC %s가 이미 연결되어 있습니다. 확인해 주세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10000": "소스 VM이 호스트[UUID: %s]에 로컬 데이터 볼륨을 가지고 있지만, fast clone API가 VM을 호스트[%s]로 클론하려고 시도합니다. 이는 fast clone 기능에서 지원되지 않습니다.", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10000": "AutoScalingRuleSchedulerJobTriggerVO[UUID:%s]가 %s 상태입니다. 상태 변경이 허용되지 않습니다.", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10001": "AutoScalingRuleSchedulerJobTriggerVO[uuid:%s]가 쿨다운 기간입니다.", + "ORG_ZSTACK_ALIYUN_NETWORK_10008": "가상 경계: %s가 종료되었습니다.", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10002": "AutoScalingRuleVO[uuid:%s]가 %s 상태입니다. 상태 전환이 허용되지 않습니다.", + "ORG_ZSTACK_ALIYUN_NETWORK_10005": "실행 중이거나 중지된 상태의 ECS 인스턴스만 EIP를 분리할 수 있지만, ECS [%s]의 현재 상태는 [%s]입니다.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10018": "CpeIp는 IPv4 주소여야 하지만, 현재 %s입니다.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10017": "이 클라우드 환경에서는 관리자 사용자만 연결을 설정할 수 있습니다.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10019": "cpeIp는 유효한 IPv4 주소여야 합니다.", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10000": "SftpBackupStorage가 URL[%s]의 스키마[%s]를 지원하지 않습니다.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10014": "%s에 대한 가상 머신 백업을 찾을 수 없습니다.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10013": "%s에 대한 가상 머신을 찾을 수 없습니다.", + "ORG_ZSTACK_ALIYUN_NETWORK_10010": "대상 CIDR [%s]가 이미 존재하며 다른 인스턴스 ID [%s]를 가리킵니다. 먼저 확인하거나 삭제해 주세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10061": "이미지 캐시 LUN 정보를 가져오지 못했습니다.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10016": "지원되지 않는 인스턴스 유형: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10003": "이미지 다운로드 취소에 실패했습니다, %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10060": "새 이미지 캐시가 준비되지 않았습니다. 잠시 후 다시 시도해 주세요.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10015": "%s에 대한 네트워크를 찾을 수 없습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10004": "SFTP 백업 스토리지 에이전트의 UUID가 변경되었습니다[예상: %s, 실제: %s]. 이는 대부분 에이전트의 수동 재시작으로 인한 것입니다. 상태를 동기화하기 위해 재연결을 실행해 주세요.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10010": "L3 네트워크에 대한 CIDR을 찾을 수 없습니다: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10012": "%s에 대한 가상 사설 네트워크를 찾을 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10059": "볼륨을 찾을 수 없습니다: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10055": "XSStor 클러스터가 비정상입니다, 클러스터 정보[clusterDataState: %s, clusterHealthyState: %s, clusterRunningState: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10058": "잘못된 논리 유닛 번호(LUN) ID가 지정되었습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10057": "호스트 %s와 lun %s에 대한 세션이 가상화된 환경에서 활성 상태가 아닙니다.", + "ORG_ZSTACK_HYBRID_NETWORK_10027": "CIDR이 다른 vswitch와 중첩됩니다: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10028": "잘못된 CIDR 블록: %s는 '10.0.0.0/8', '172.16.0.0/12' 또는 '192.168.0.0/16' 범위 내에 있어야 합니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10010": "인스턴스 %s를 종료하지 못함: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10009": "레이어 3 네트워크에 대한 가상 네트워크 인터페이스를 찾을 수 없음: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10029": "해당 가상 border router가 없음: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10003": "사용자 정의 CIDR [%s]이(가) VBR [%s]에 이미 존재하며, 대상 CIDR [%s]과(와) overlapping됩니다. 먼저 확인하고 삭제하십시오.", + "ORG_ZSTACK_HYBRID_NETWORK_10020": "next-hop 라우터 인터페이스가 %s에 속하지만, 해당 항목은 %s에 속함", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10001": "Vbr: [%s] 연결 설정 중입니다. 잠시만 기다려...", + "ORG_ZSTACK_HYBRID_NETWORK_10021": "해당 가상 private gateway가 없음: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10000": "사용자 정의 CIDR [%s]이(가) 가상 라우터 [%s]에 이미 존재하며, 대상 CIDR [%s]과(와) overlapping됩니다. 먼저 확인하고 삭제하십시오.", + "ORG_ZSTACK_HYBRID_NETWORK_10022": "next hop 타입 [%s]은(는) 경로 항목 생성을 지원하지 않습니다!", + "ORG_ZSTACK_HYBRID_NETWORK_10024": "가상 border router는 router interface만 next hop 타입으로 지원합니다", + "ORG_ZSTACK_HYBRID_NETWORK_10026": "vswitch의 CIDR [%s]은(는) VPC의 [%s] 내에 포함되지 않음", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10008": "인스턴스 %s을(를) 호스트 그룹 %s에 추가하지 못함: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10005": "access zone의 서브넷을 가져오지 못함: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10004": "access zone을 동기화하지 못함: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10007": "인스턴스 %s을(를) 조회하지 못함: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10006": "모든 인스턴스를 조회하지 못함: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10001": "initiator: %s을(를) 호스트에 추가하지 못함: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10000": "XStor 장치 인증 실패: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10002": "LUN: %s을(를) %s(으)로 복사하지 못함: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10038": "eip[%s]와(과) ecs[%s]는 동일한 가용 영역에 있어야 합니다", + "ORG_ZSTACK_VMWARE_10135": "ZStack UUID를 VCenter Managed Entity에 설정하지 못함 [name:%s, mor:%s]: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10039": "eip를 분리할 수 없음: [%s], 어떤 인스턴스에도 연결되어 있지 않습니다", + "ORG_ZSTACK_VMWARE_10132": "데이터 디스크 %s에 사용 가능한 unit 번호가 없음", + "ORG_ZSTACK_VMWARE_10133": "distributedSwitch [%s]에 대한 dvPortGroup 생성 실패: %s", + "ORG_ZSTACK_VMWARE_10130": "볼륨[%s] 삭제 실패: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10030": "해당 가상 라우터가 존재하지 않음: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10031": "localGateway가 IPv4 주소가 아닙니다: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10032": "peerGateway가 유효한 IPv4 주소가 아닙니다: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10033": "peerGateway가 유효한 Subnet Mask가 아닙니다: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10034": "vlanId는 숫자 값이어야 합니다: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10035": "[%s]에 eip를 연결할 수 없습니다: [%s], eip :[%s]가 이미 ecs:[%s]에 연결되어 있습니다", + "ORG_ZSTACK_HYBRID_NETWORK_10036": "ecs [%s]가 이미 공용 IP 주소를 가지고 있습니다", + "ORG_ZSTACK_HYBRID_NETWORK_10037": "ECS [%s]에 EIP [%s]를 연결할 수 없습니다. ECS가 이미 EIP와 연결되어 있습니다", + "ORG_ZSTACK_SSO_SERVICE_10014": "사용자 %s의 가상 ID가 존재하지 않습니다", + "ORG_ZSTACK_VMWARE_10129": "가상 디스크 관리자 서비스를 사용할 수 없습니다. 서비스가 실행 중인지 확인하거나 지원팀에 문의하세요.", + "ORG_ZSTACK_SSO_SERVICE_10011": "응답에 오류가 발생했습니다: 클라우드 스토리지 시스템에서 소스 파일을 찾을 수 없습니다. 파일 경로를 확인하고 가상화된 환경에 올바르게 업로드되었는지 확인하세요.", + "ORG_ZSTACK_SSO_SERVICE_10010": "redirectUrl이 잘못되었습니다, %s", + "ORG_ZSTACK_VMWARE_10128": "데이터 저장소에 대한 데이터 센터를 찾을 수 없습니다.%s", + "ORG_ZSTACK_SSO_SERVICE_10013": "사용자 %s의 계정이 존재하지 않습니다", + "ORG_ZSTACK_SSO_SERVICE_10012": "SSO 클라이언트 [UUID: %s]에 대한 사용자 정보 매핑 구성을 생성하지 못했습니다: 사용자 정의 속성 매핑이 정의되지 않았습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10030": "호스트 그룹 %s에 대한 LUN 매핑을 조회할 수 없습니다 (이유: %s)", + "ORG_ZSTACK_HYBRID_NETWORK_10005": "라우터 인터페이스는 동일한 데이터 센터 내에 있어야 하지만, ri[%s]는 dc[%s]에 있고 ri[%s]는 dc[%s]에 있습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10032": "클러스터 정보를 가져올 수 없습니다 (이유: %s)", + "ORG_ZSTACK_VMWARE_10121": "%s에 대한 dvPortGroup 생성 실패", + "ORG_ZSTACK_HYBRID_NETWORK_10007": "라우터 인터페이스[%s]가 유휴 상태가 아닙니다, 현재 상태는 %s입니다", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10031": "LUN 매핑 %s를 조회할 수 없습니다 (이유: %s)", + "ORG_ZSTACK_HYBRID_NETWORK_10009": "라우터 인터페이스[%s]에 이미 활성 연결이 있습니다, 상태는 %s입니다", + "ORG_ZSTACK_VMWARE_10120": "vCenter [%s]에서 dvSwitch [%s]를 찾을 수 없습니다. dvSwitch가 존재하고 올바르게 구성되어 있는지 확인하세요.", + "ORG_ZSTACK_GUESTTOOLS_10009": "관리 노드 [UUID:%s]에서 호스트 [UUID:%s]에 적합한 guest OS 도구 ISO를 찾을 수 없습니다.", + "ORG_ZSTACK_GUESTTOOLS_10007": "vm[uuid:%s]에 대한 최신 guest 도구를 가져올 수 없습니다. 실행 중이 아니거나 볼륨 복구 중이기 때문입니다.", + "ORG_ZSTACK_ZWATCH_ALARM_10000": "이벤트 구독 [uuid:%s]을(를) 찾을 수 없습니다. 삭제되었거나 취소되었을 수 있습니다", + "ORG_ZSTACK_GUESTTOOLS_10008": "VM[UUID:%s]에 대한 최신 guest 도구를 가져올 수 없습니다. 사용자 관리 VM이 아니기 때문입니다.", + "ORG_ZSTACK_GUESTTOOLS_10005": "가상 머신[uuid:%s]에 대한 qgaStateChange 실패", + "ORG_ZSTACK_GUESTTOOLS_10006": "VM [uuid:%s]에 대한 최신 guest 도구를 가져올 수 없습니다. 하이퍼바이저 유형이 지원되지 않습니다", + "ORG_ZSTACK_GUESTTOOLS_10004": "qga 파일 업로드 실패[%s]", + "ORG_ZSTACK_GUESTTOOLS_10001": "VM-%s에 오류가 발생했습니다: %s", + "ORG_ZSTACK_ZWATCH_ALARM_10002": "메트릭[%s] 반복 간격 값은 1시간 미만일 수 없습니다", + "ORG_ZSTACK_GUESTTOOLS_10002": "가상 머신-%s에 파일 업로드 실패, %s", + "ORG_ZSTACK_ZWATCH_ALARM_10001": "알람[uuid:%s]을(를) 찾을 수 없습니다. 삭제되었거나 만료되었을 수 있습니다", + "ORG_ZSTACK_SSO_SERVICE_10008": "토큰 %s가 클라우드 환경 구성에 존재하지 않습니다. 확인하고 다시 입력하세요.", + "ORG_ZSTACK_AI_10109": "모델 센터 [uuid: %s] 인스턴스를 찾을 수 없음", + "ORG_ZSTACK_SSO_SERVICE_10007": "관리자 자격 증명을 Keycloak에 업로드하지 못했습니다. 클라우드 배포를 위해 필요한 권한과 네트워크 구성이 올바르게 설정되어 있는지 확인하세요.", + "ORG_ZSTACK_ZWATCH_ALARM_10007": "이벤트 구독에 이미 레이블[%s]이(가) 있습니다", + "ORG_ZSTACK_AI_10107": "모델 서비스 인스턴스 그룹[uuid: %s]에서 노드 순위 0인 모델 서비스 인스턴스(기본)를 찾을 수 없음", + "ORG_ZSTACK_ZWATCH_ALARM_10006": "이벤트에 레이블[%s]이(가) 없습니다", + "ORG_ZSTACK_SSO_SERVICE_10009": "%s 데이터 유형은 클라우드 컴퓨팅 환경에서 지원되지 않습니다", + "ORG_ZSTACK_AI_10108": "클라우드 환경에서 모델 서비스 인스턴스 그룹 %s을(를) 찾을 수 없음", + "ORG_ZSTACK_ZWATCH_ALARM_10005": "UUID [%s]인 작업이 이미 UUID [%s]인 이벤트 구독과 연결되어 있습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10027": "LUN 이름 생성 실패: %s, 오류 메시지: %s", + "ORG_ZSTACK_SSO_SERVICE_10004": "IdP 메타데이터 URL이 필요합니다.%s", + "ORG_ZSTACK_AI_10105": "모델 서비스 배포에 성공했지만 모델 서비스 인스턴스 UUID가 없습니다. 인스턴스 구성을 확인하세요.", + "ORG_ZSTACK_SSO_SERVICE_10003": "잘못된 인증 엔드포인트 URL: %s", + "ORG_ZSTACK_AI_10106": "모델 서비스 인스턴스 UUID가 비어 있습니다. 모델 서비스 인스턴스를 처리할 수 없습니다. UUID가 제공되었는지 확인하세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10029": "LUN 매핑 정보를 조회할 때는 LUN ID가 필수입니다.", + "ORG_ZSTACK_SSO_SERVICE_10006": "잘못된 ID 제공자 메타데이터: %s", + "ORG_ZSTACK_AI_10103": "모델 서비스 인스턴스 그룹 [UUID: %s]을(를) 찾을 수 없어 서비스 실행을 위한 리소스 생성을 건너뜁니다.", + "ORG_ZSTACK_VMWARE_10118": "호스트 %s에 대한 포트 그룹 생성 실패: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10028": "%s로 인해 LUN %s 조회 실패", + "ORG_ZSTACK_AI_10104": "모델 서비스 배포 응답에 성공했지만 모델 서비스 인스턴스 그룹[uuid: %s]을(를) 가상 머신 인스턴스 풀에서 찾을 수 없습니다", + "ORG_ZSTACK_VMWARE_10119": "호스트 %s에 대한 포트 그룹 생성 실패", + "ORG_ZSTACK_AI_10101": "모델 서비스 인스턴스 그룹[uuid: %s]에 대한 모델 스토리지 백엔드를 찾을 수 없음", + "ORG_ZSTACK_VMWARE_10116": "포트그룹[%s]이(가) 호스트[%s]에 이미 존재하지만 다른 VLAN ID(%d)를 사용하고 있습니다", + "ORG_ZSTACK_AI_10102": "모델 서비스 인스턴스 식별자 할당 실패: %s", + "ORG_ZSTACK_VMWARE_10117": "포트그룹[%s]이(가) 호스트[%s]에 이미 존재합니다. 다른 이름으로 새 포트 그룹을 생성하거나 기존 포트 그룹을 수동으로 삭제하고 클러스터에 다시 연결하세요.", + "ORG_ZSTACK_SSO_SERVICE_10002": "SSO 클라이언트가 ID 유형 [%s]이(가) 아니므로 푸시 작업이 허용되지 않습니다.", + "ORG_ZSTACK_VMWARE_10114": "dvSwitch 이름 [%s]이(가) 고유하지 않습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10024": "LUN 이름 생성 실패: %s, 원인을 찾을 수 없습니다", + "ORG_ZSTACK_SSO_SERVICE_10001": "UUID [%s]인 SSO 클라이언트가 존재하지 않습니다.", + "ORG_ZSTACK_AI_10100": "모델 서비스 인스턴스 그룹[uuid: %s]의 모델 서비스 UUID가 null입니다", + "ORG_ZSTACK_VMWARE_10115": "vCenter 인벤토리에서 호스트[%s:%s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_VMWARE_10112": "dvSwitch 나열 실패: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10016": "%s은(는) 유효한 CIDR 블록이 아닙니다", + "ORG_ZSTACK_VMWARE_10113": "vCenter 클러스터[%s] 이름 가져오기 실패", + "ORG_ZSTACK_HYBRID_NETWORK_10017": "동일한 매개변수를 가진 보안 그룹 규칙이 이미 존재합니다. 새 규칙을 생성하기 전에 기존 규칙을 수정하거나 삭제하세요.", + "ORG_ZSTACK_VMWARE_10110": "VM에 guest tools가 설치되어 있지 않거나 실행 중이 아닙니다: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10018": "dstCidrBlock[%s]은(는) 유효한 IPv4 또는 IPv6 주소 범위가 아닙니다", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10020": "LUN 이름 업데이트 실패: %s, 오류 메시지: %s", + "ORG_ZSTACK_VMWARE_10111": "가상 시스템 파일 업로드 실패: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10019": "해당 ECS 인스턴스가 존재하지 않습니다: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10010": "가상 라우터가 VBR 유형인 경우 accessPointUuid는 null일 수 없습니다.", + "ORG_ZSTACK_HYBRID_NETWORK_10011": "VirtualBorderRouterVO에서 해당 라우터 UUID[%s]를 찾을 수 없습니다.", + "ORG_ZSTACK_GUESTTOOLS_10018": "vfNic가 연결되어 있지만 guest tools가 실행 중이 아니므로 VM[UUID:%s]을(를) 마이그레이션할 수 없습니다.", + "ORG_ZSTACK_ZWATCH_ALARM_10011": "이벤트[%s]에 레이블[%s]이(가) 없습니다.", + "ORG_ZSTACK_HYBRID_NETWORK_10012": "VpcVirtualRouterVO에서 라우터 UUID[%s]을(를) 찾을 수 없습니다.", + "ORG_ZSTACK_GUESTTOOLS_10019": "guest tools가 실행 중이 아니므로 L3 네트워크를 VM [UUID:%s]에 연결할 수 없습니다.", + "ORG_ZSTACK_ZWATCH_ALARM_10010": "네임스페이스[%s]에 이벤트[%s]이(가) 포함되어 있지 않습니다.", + "ORG_ZSTACK_HYBRID_NETWORK_10013": "지원되지 않는 라우터 유형: %s", + "ORG_ZSTACK_GUESTTOOLS_10016": "VF NIC [UUID:%s]을(를) 찾을 수 없어 VF NIC HA 상태를 변경할 수 없습니다.", + "ORG_ZSTACK_HYBRID_NETWORK_10014": "시스템 수준 가상 시스템 항목을 삭제할 수 없습니다.", + "ORG_ZSTACK_GUESTTOOLS_10017": "게스트 도구가 실행 중이 아니라서 가상 네트워크 인터페이스 카드의 고가용성 상태를 변경하지 못했습니다. 이 작업을 다시 시도하기 전에 게스트 도구가 설치되어 실행되고 있는지 확인하세요.", + "ORG_ZSTACK_HYBRID_NETWORK_10015": "VPC에서만 인트라넷 액세스 규칙을 지원합니다.", + "ORG_ZSTACK_GUESTTOOLS_10014": "스크립트에 해당 매개변수가 없는 플레이스홀더 %s이(가) 포함되어 있습니다. 클라우드 컴퓨팅 환경의 적절한 구성을 위해 runtimeParams를 통해 이러한 플레이스홀더에 대한 값을 제공하세요.", + "ORG_ZSTACK_ZWATCH_ALARM_10015": "메트릭[name:%s]에 대해 Period 필드가 지원되지 않습니다.", + "ORG_ZSTACK_GUESTTOOLS_10015": "VM [UUID:%s]에 VF Nic가 연결되어 있지만 Guest Tools가 실행 중이 아니어서 기본 스토리지를 마이그레이션할 수 없습니다.", + "ORG_ZSTACK_ZWATCH_ALARM_10014": "메트릭[name:%s]에 대해 Period 필드는 null일 수 없습니다.", + "ORG_ZSTACK_GUESTTOOLS_10012": "cloud 배포 구성에서 encodingType과 scriptContent는 반드시 함께 존재하거나 함께 존재하지 않아야 합니다.", + "ORG_ZSTACK_ZWATCH_ALARM_10013": "지정된 클라우드 네임스페이스 레지스트리에서 네임스페이스[%s]을(를) 찾을 수 없습니다.", + "ORG_ZSTACK_GUESTTOOLS_10013": "renderParams 형식이 잘못되었습니다. 키-값 쌍의 유효한 JSON 배열이어야 합니다. 예: [{\\\"key\\\":\\\"k1\\\",\\\"value\\\":\\\"v1\\\"}]. 오류: %s", + "ORG_ZSTACK_GUESTTOOLS_10010": "호스트[uuid:%s]에서 guest tools 확인 실패", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10019": "경로로 LUN 쿼리 실패: %s, 오류 메시지: %s", + "ORG_ZSTACK_GUESTTOOLS_10011": "VM UUID 설정 실패: %s NAME: %s 호스트명 (QEMU 게스트 에이전트가 실행되지 않고 DHCP 서비스가 없기 때문)", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10016": "호스트 그룹 추가 실패: %s, 오류 메시지: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10015": "호스트 그룹 쿼리 실패 (이유: %s)", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10017": "LUN 쿼리 실패: %s, 오류 메시지: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10012": "호스트 그룹 %s 삭제 실패 (이유: %s)", + "ORG_ZSTACK_VMWARE_10105": "컴퓨트 호스트 %s에 대한 리소스 풀을 찾을 수 없음", + "ORG_ZSTACK_VMWARE_10106": "호스트 %s에 대한 리소스 풀 검색 실패", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10014": "이니시에이터 %s 삭제 실패 (이유: %s)", + "ORG_ZSTACK_VMWARE_10103": "ESX VM UUID [%s:%s] 설정 실패 (이유: [%s])", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10013": "호스트 식별자가 필수 항목이나Got:%s", + "ORG_ZSTACK_VMWARE_10104": "클라우드 템플릿 저장소에서 템플릿 [%s]을(를) 찾을 수 없음", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10029": "UUID: %s(으)로 빌드 인스턴스를 찾을 수 없거나 삭제 중 상태임", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10028": "이미지[%s]에 대한 UUID를 찾을 수 없음", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10027": "imageStore가 클라우드 저장소 서비스에 연결되어 있지 않습니다. 클라우드 저장소 서비스가 올바르게 구성되어 있는지 확인하고 다시 시도하십시오.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10026": "imageStore가 활성화되어 있지 않습니다. 클라우드 환경 설정에서 imageStore가 구성되고 활성화되어 있는지 확인하십시오.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10024": "빌드 애플리케이션 [%s]을(를) 찾을 수 없음", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10022": "빌드 시스템 [UUID: %s]이(가) 컴퓨트 존 [UUID: %s]에 연결되어 있지 않습니다", + "ORG_ZSTACK_CONTAINER_10040": "사용 가능한 클러스터에 배포 생성 실패. %d개 클러스터 시도함: %s", + "ORG_ZSTACK_FLOWMETER_10013": "%s와(과) 중복되는 Collector", + "ORG_ZSTACK_FLOWMETER_10014": "클라우드 리소스 프로비저닝 요청에 지정된 매개변수가 없습니다. %s을(를) 지정하십시오.", + "ORG_ZSTACK_FLOWMETER_10015": "[%s]이(가) IP 주소 형식을 준수하지 않습니다", + "ORG_ZSTACK_FLOWMETER_10016": "FlowCollector[%s]이(가) 존재하지 않습니다", + "ORG_ZSTACK_GUESTTOOLS_10029": "VM [uuid:%s]이(가) 실행 중이 아니므로 게스트 도구 정보를 검색할 수 없습니다", + "ORG_ZSTACK_CONTAINER_10043": "클라우드 서비스 쿼리 실패: %s (이유: %s)", + "ORG_ZSTACK_FLOWMETER_10017": "FlowMeter[%s]이(가) 존재하지 않습니다", + "ORG_ZSTACK_FLOWMETER_10018": "FlowMeter[%s]이(가) IPv6 버전 [%s]을(를) 지원하지 않음", + "ORG_ZSTACK_GUESTTOOLS_10027": "VM [UUID:%s]이(가) 사용자 VM이 아니므로 게스트 도구 ISO를 연결할 수 없습니다", + "ORG_ZSTACK_CONTAINER_10045": "서비스 생성 실패 (이유: %s)", + "ORG_ZSTACK_FLOWMETER_10019": "Collector [%s %d]이(가) %s와(과) 중복됨", + "ORG_ZSTACK_GUESTTOOLS_10028": "VM [uuid:%s]에 CDROM 장치가 없으므로 게스트 도구 ISO를 연결할 수 없습니다", + "ORG_ZSTACK_CONTAINER_10037": "컨테이너화된 클러스터를 찾을 수 없습니다. 자세한 내용은 NativeClusterVO를 확인하세요.", + "ORG_ZSTACK_GUESTTOOLS_10025": "하이퍼바이저 유형이 지원되지 않으므로 VM [uuid:%s]에 게스트 도구 ISO를 연결할 수 없습니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10057": "ipmitool을 사용하여 베어메탈 섀시[uuid:%s]를 종료하지 못했습니다", + "ORG_ZSTACK_GUESTTOOLS_10026": "VM [UUID:%s]이 실행 중이 아니므로 게스트 도구 ISO를 연결할 수 없습니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10058": "bm 에이전트를 통해 베어메탈 인스턴스[uuid:%s]를 종료하지 못했습니다, 이유: %s", + "ORG_ZSTACK_GUESTTOOLS_10023": "게스트 도구 버전이 이 기능에 너무 낮으므로 vm[uuid:%s] 네트워크 구성을 업데이트하지 못했습니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10059": "%d초 후에도 baremetal2 섀시[uuid:%s]가 여전히 전원이 꺼지지 않았습니다", + "ORG_ZSTACK_GUESTTOOLS_10024": "게스트 도구가 실행 중이 아니므로 vm[uuid:%s] 네트워크 구성을 업데이트하지 못했습니다", + "ORG_ZSTACK_GUESTTOOLS_10021": "호스트네임 충돌이 감지되었습니다. UUID [%s]인 다른 VM이 L3 네트워크 UUID [%s]에서 이미 호스트네임 [%s]을 사용하고 있습니다.", + "ORG_ZSTACK_GUESTTOOLS_10022": "가상 머신이 실행 중이 아니므로 vm[uuid:%s] 네트워크 구성을 업데이트하지 못했습니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10054": "게이트웨이[uuid:%s]를 통해 baremetal2 인스턴스[uuid:%s]와의 연결을 수립하지 못했습니다, 원인: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10055": "게이트웨이[uuid:%s]를 통해 베어메탈 인스턴스[uuid:%s]의 비밀번호를 변경하지 못했습니다, 이유: %s", + "ORG_ZSTACK_GUESTTOOLS_10020": "VM 호스트네임을 설정할 수 없습니다. VM [UUID:%s]에 기본 L3 네트워크가 없습니다.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10056": "ipmitool을 사용하여 베어메탈 섀시[uuid:%s]를 전원 켜기하지 못했습니다", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10021": "빌드 시스템 [%s]을 찾을 수 없습니다", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10020": "빌드 시스템 [UUID: %s]가 영역 [UUID: %s]에 연결되었습니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10050": "게이트웨이[uuid:%s]에서 베어메탈 인스턴스[uuid:%s]의 콘솔 프록시를 생성하지 못했습니다, 이유: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10051": "베어메탈 인스턴스[uuid:%s]의 기본 네트워크를 l3[uuid:%s]에서 l3[uuid:%s]로 전환하지 못했습니다, 원인: %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10018": "appId[%s:%s]가 다른 BuildApp 인스턴스에서 중복되어 Add BuildApp에 실패했습니다", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10017": "로컬 스토리지 빌드 시스템[url: %s]에 연결할 수 없음, 연결 문제로 인해", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10016": "appId[%s]가 다른 BuildApp에서 중복되어 Create BuildApp에 실패했습니다", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10015": "빌드 시스템이 'Stopped' 상태이므로 빌드 응용 프로그램이 비활성화되었습니다. 응용 프로그램을 활성화하려면 빌드 시스템을 시작하세요.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10014": "rest 호출 %s 실패, 이유: %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10013": "빌드 앱이 %s 상태이므로 현재 작업을 지원하지 않습니다.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10012": "UUID[%s]로 빌드 응용 프로그램을 찾을 수 없습니다", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10011": "빌드 시스템이 %s 상태이므로 작업을 수행할 수 없습니다", + "ORG_ZSTACK_CONTAINER_10031": "배치를 찾을 수 없습니다: %s", + "ORG_ZSTACK_FLOWMETER_10003": "네트워크[%s]가 흐름 미터[%s]에 통합되었습니다.", + "ORG_ZSTACK_FLOWMETER_10004": "가상 라우터가 다른 흐름 미터에 추가되었습니다. 중복되지 않았는지 확인하세요.", + "ORG_ZSTACK_FLOWMETER_10005": "잘못된 타입 매개변수 %s은(는) 유효한 범위 %s에서 제공되어야 합니다", + "ORG_ZSTACK_CONTAINER_10032": "%s로 배포 패치 실패", + "ORG_ZSTACK_CONTAINER_10034": "%s로 배포 교체 실패", + "ORG_ZSTACK_CONTAINER_10026": "%s로 서비스 삭제 실패", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10046": "게이트웨이[uuid:%s]에서 프로비저닝 네트워크 제거 실패: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10047": "베어메탈 인스턴스[uuid:%s]에 프로비저닝된 NIC 없음", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10048": "게이트웨이[uuid:%s]에서 베어메탈 인스턴스[uuid:%s]의 프로비저닝 설정 생성 실패: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10049": "게이트웨이[uuid:%s]에서 베어메탈 인스턴스[uuid:%s]의 프로비저닝 설정 삭제 실패: %s", + "ORG_ZSTACK_IMAGEREPLICATOR_10000": "대상 백업 저장소[uuid:%s]가 사용 불가 상태가 됨", + "ORG_ZSTACK_GUESTTOOLS_10032": "VM [uuid:%s]이 삭제되어 게스트 도구 상태를 업데이트할 수 없음", + "ORG_ZSTACK_ALIYUN_OSS_10002": "AWS 액세스 키 ID, 시크릿 액세스 키, 리전을 동시에 설정해야 합니다.", + "ORG_ZSTACK_CONTAINER_10029": "API 오류: 소스 파일이 클라우드 저장소 시스템에서 찾을 수 없습니다. 파일 경로를 확인하고 다시 시도하십시오.", + "ORG_ZSTACK_IMAGEREPLICATOR_10001": "하나 이상의 백업 저장소[uuids:%s]가 복제 그룹[uuid:%s]에 추가되었습니다.", + "ORG_ZSTACK_ALIYUN_OSS_10003": "OSS 버킷이 비어있지 않습니다! 작업을 진행하기 전에 버킷이 비어있는지 확인하십시오.", + "ORG_ZSTACK_GUESTTOOLS_10030": "VM [UUID:%s]이 사용자 VM이 아니므로 게스트 도구 정보를 가져올 수 없습니다.", + "ORG_ZSTACK_ALIYUN_OSS_10000": "ossBucket [%s]이(가) 이미 데이터센터 [%s]에 등록되어 있습니다.", + "ORG_ZSTACK_GUESTTOOLS_10031": "잘못된 디버그 매개변수: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10045": "게이트웨이[uuid:%s]에서 프로비저닝 네트워크 준비 실패: %s", + "ORG_ZSTACK_ALIYUN_OSS_10001": "OssBucket[%s]이(가) 연결되어 있지 않습니다.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10010": "내보내기 ID와 빌드 애플리케이션 UUID가 모두 설정되어 있지만 일치하지 않습니다. %s 및 %d의 값을 확인하십시오.", + "ORG_ZSTACK_IMAGEREPLICATOR_10002": "백업 저장소[uuids:%s]이(가) ImageStoreInstance 유형이 아닙니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10040": "이미지 데이터를 로컬 디스크로 변환하지 못했습니다. 저장소 리소스와 권한이 충분한지 확인하십시오. 문제가 지속되면 이미지 관리를 위해 객체 저장소 서비스 사용을 고려하십시오.", + "ORG_ZSTACK_IMAGEREPLICATOR_10003": "백업 저장소 [UUIDs:%s]이(가) 어떤 Zone과도 연결되어 있지 않습니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10041": "베어메탈2 인스턴스 [uuid:%s]의 볼륨 변환이 섀시 [uuid:%s]에서 실패함, %d분 타임아웃", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10035": "기본 저장소 [uuid:%s]에서 볼륨 [uuid:%s]의 iSCSI 대상 IQN 또는 게이트웨이 IP를 가져오지 못함", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10037": "섀시:%s 디스크에 WWN 정보가 없습니다. 섀시를 점검하고 다시 시도하십시오.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10031": "게이트웨이 [uuid:%s]를 통해 베어메탈 인스턴스 [uuid:%s]에서 본딩의 프로비저닝된 NIC 분리 실패: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10032": "베어메탈2 인스턴스[uuid:%s]이(가) 연결되어 있지 않습니다; 따라서 프로비저닝된 NIC를 본딩에 연결할 수 없습니다.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10033": "게이트웨이 [uuid:%s]를 통해 베어메탈 인스턴스 [uuid:%s]에서 본딩의 프로비저닝된 NIC 연결 실패: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10030": "베어메탈2 인스턴스[uuid:%s]이(가) 연결되어 있지 않습니다; 따라서 프로비저닝 NIC를 본딩 구성에서 분리할 수 없습니다.", + "ORG_ZSTACK_CONTAINER_10051": "계정[uuid:%s]에 대한 Kubernetes 클라이언트를 찾지 못함", + "ORG_ZSTACK_CONTAINER_10050": "%s 클러스터의 Kubernetes 구성이 null입니다", + "ORG_ZSTACK_CONTAINER_10052": "kube 설정 파일 내용을 활용하지 못했습니다: %s", + "ORG_ZSTACK_CORE_PROGRESS_10000": "매개변수 apiId[%s]는 클라우드 서비스 구성에 대해 유효한 UUID가 아닙니다.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10029": "베어메탈 인스턴스[uuid:%s]에 대해 게이트웨이[uuid:%s]에서 볼륨을 섀시 로컬 디스크 구성으로 변환하는 항목을 삭제하지 못했습니다", + "ORG_ZSTACK_CONTAINER_10056": "UUID로 컨테이너 백업 스토리지를 찾을 수 없습니다: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10024": "프로비저닝된 IP %s는 게이트웨이 %s에 연결할 수 없으므로 사용할 수 없습니다; 상세 오류:%s", + "ORG_ZSTACK_CONTAINER_10047": "서비스[%s]의 서비스 상태 번들을 가져오지 못했습니다", + "ORG_ZSTACK_CONTAINER_10049": "지정된 클러스터 ID로 클러스터를 찾을 수 없습니다: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10027": "게이트웨이[uuid:%s]를 통해 인스턴스[uuid:%s]의 베어메탈2 섀시를 검사하지 못했습니다. 이유: %s", + "ORG_ZSTACK_STORAGE_CBT_10020": "예상치 못한 VM[UUID: %s] 상태: %s, 예상되는 VM 상태는 Running입니다.", + "ORG_ZSTACK_STORAGE_CBT_10021": "VM [UUID: %s]은(는) 이미 백업 작업이 생성되었습니다; 따라서 CBT 작업을 동시에 활성화하는 것은 허용되지 않습니다.", + "ORG_ZSTACK_STORAGE_CBT_10016": "VM %s에 하이퍼바이저 유형이 지정되지 않았습니다", + "ORG_ZSTACK_STORAGE_CBT_10017": "구성된 클라우드 스토리지 공급자에서 유형[%s]의 CBTBackupFactory를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_CBT_10014": "VM [uuid: %s]이(가) 작업으로 보호되었습니다: %s", + "ORG_ZSTACK_STORAGE_CBT_10015": "cbt 볼륨 생성 실패. 세부 정보: %s", + "ORG_ZSTACK_STORAGE_CBT_10018": "CVM 작업을 찾을 수 없습니다[uuid: %s]", + "ORG_ZSTACK_STORAGE_CBT_10019": "Cbt 작업 [UUID: %s]이(가) 이미 활성화되어 있습니다. 비활성화해 주세요.", + "ORG_ZSTACK_CONTAINER_10000": "컨테이너 백업 스토리지가 지정된 형식 %s을(를) 지원하지 않습니다", + "ORG_ZSTACK_CONTAINER_10002": "엔드포인트[%s]에 대한 가용 영역을 찾을 수 없습니다", + "ORG_ZSTACK_IAM2_RBAC_10006": "이 클라우드 컴퓨팅 환경에서 작업[%s]이(가) 거부되었습니다", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10008": "tf 컨트롤러에서 가상 네트워크[uuid:%s]를 가져오지 못했습니다", + "ORG_ZSTACK_IAM2_RBAC_10001": "프로젝트에 강제 보안 그룹 사용이 필요하므로 가상 머신 작업에 시스템 태그가 필수입니다.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10009": "tf 컨트롤러에서 tf l2 네트워크[name:%s] 업데이트 실패", + "ORG_ZSTACK_IAM2_RBAC_10000": "l3 네트워크 [uuid:%s]가 컴퓨트 클러스터에 연결되지 않아 VM 인스턴스 생성 실패", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10006": "tf 컨트롤러에서 tf L2 네트워크[name:%s] 생성 실패", + "ORG_ZSTACK_IAM2_RBAC_10003": "프로젝트[uuid:%s]이(가) 사용 중지되어 모든 작업이 거부됩니다.", + "ORG_ZSTACK_IAM2_RBAC_10002": "계정[uuid:%s]의 프로젝트가 존재하지 않습니다", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10005": "Terraform 컨트롤러에서 프로젝트[uuid:%s]를 가져오지 못했습니다", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10002": "TensorFlow 컨트롤러에서 기본 도메인 검색 실패.%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10003": "TF Controller에서 ZStack Admin용 TF 프로젝트 생성 실패", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10000": "지정된 이름의 SDN 컨트롤러가 이미 존재합니다. 다른 이름을 선택하거나 기존 컨트롤러를 사용하세요.", + "ORG_ZSTACK_STORAGE_CBT_10012": "CBT 태스크에 대한 리소스를 찾을 수 없습니다[uuid: %s]", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10001": "ZStack 데이터베이스에서 기본 관리자 계정을 가져오지 못했습니다", + "ORG_ZSTACK_STORAGE_CBT_10013": "가상 머신의 호스트를 찾을 수 없습니다: %s", + "ORG_ZSTACK_STORAGE_CBT_10011": "볼륨[uuid:%s]은(는) 이미 vmInstance[uuid:%s]에 대해 내보내졌습니다.", + "ORG_ZSTACK_STORAGE_CBT_10006": "Cloud Block Storage 태스크를 찾을 수 없습니다[uuid:%s]", + "ORG_ZSTACK_STORAGE_CBT_10009": "vm[uuid: %s]이(가) 현재 실행 중입니다. 중지한 후 다시 시도하세요.", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10004": "표현식의 매개변수 '%s'의 타입이 잘못되었습니다. 타입은 %s이어야 하지만, %s을(를) 받았습니다.", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10003": "클라우드 컴퓨팅 표현식에서 매개변수 '%s'이(가) 누락되었습니다.", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10000": "잘못된 표현식: %s, %s 클라우드 컴퓨팅 환경에 대해 표현식이 유효한지 확인하세요.", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10001": "잘못된 표현식: %s, 유효한 클라우드 컴퓨팅 표현식을 찾을 수 없습니다.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10019": "tf 컨트롤러에서 tf l3 서브넷[name:%s] 추가 실패: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10082": "UUID: %s인 baremetal2 게이트웨이가 연결되지 않았습니다. 따라서 UUID: %s인 인스턴스의 콘솔 URL을 생성할 수 없습니다.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10016": "tf 컨트롤러에서 tf l3 네트워크[name:%s] 업데이트 실패: %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10013": "tf 컨트롤러에서 tf L3 네트워크[name:%s] 삭제 실패: %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10011": "tf 컨트롤러에서 l2 네트워크[uuid:%s] 삭제 실패", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10080": "게이트웨이[uuid:%s]에서 프로비저닝 네트워크[uuid:%s] 준비 실패: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10081": "baremetal2 인스턴스[uuid:%s]가 존재하지 않습니다. 따라서 해당 인스턴스의 콘솔 URL을 생성할 수 없습니다.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10007": "buildAppUuid와 exportId를 동시에 null로 설정할 수 없습니다. buildAppUuid 또는 exportId 중 하나가 제공되었는지 확인하세요.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10006": "백업 스토리지 UUID와 호스트명이 모두 설정되어 있지만 서로 다른 호스트를 참조합니다.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10005": "호스트명: %s과(와) 일치하는 백업 스토리지를 둘 이상 찾았습니다. 대신 backupStorageUuid를 사용하세요.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10004": "호스트명: %s인 이미지 스토리지를 찾을 수 없습니다.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10003": "백업 스토리지 UUID와 호스트명 모두 null입니다. 백업 스토리지 및 호스트명에 대한 구성 설정을 확인하세요.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10002": "dataPath는 '/'로 시작해야 하지만, [%s]을(를) 받았습니다.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10001": "이 호스트[%s]에서 동일한 URL[%s]을(를) 사용하는 다른 빌드 시스템[UUID: %s, name: %s]이(가) 있습니다.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10000": "빌드 앱[%s]이(가) 내보내지거나 내보내는 중 상태입니다. 먼저 종료하거나 제거하세요.", + "ORG_ZSTACK_CAS_10000": "CAS 드라이버 구성에 필요한 속성이 누락되었습니다.", + "ORG_ZSTACK_CAS_10002": "잘못된 가상 머신 ID[name:%s], 존재하지 않거나 잘못된 비밀번호입니다.", + "ORG_ZSTACK_CONTAINER_10020": "네트워크 정책 삭제 실패: %s", + "ORG_ZSTACK_CAS_10001": "지원되지 않는 CAS 드라이버: %s", + "ORG_ZSTACK_CONTAINER_10022": "클러스터 ID가 네트워크 정책 생성 시 null입니다", + "ORG_ZSTACK_CAS_10003": "CAS에 해당 데이터 타입[%s]이(가) 정의되어 있지 않습니다.", + "ORG_ZSTACK_CONTAINER_10024": "%s로 인해 네트워크 정책 생성에 실패했습니다", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10009": "빌드 내보내기 기록에서 ID %s의 내보내기 작업을 찾을 수 없습니다. 내보내기 작업 ID를 확인하고 다시 시도하세요.", + "ORG_ZSTACK_CONTAINER_10023": "클러스터 ID로 ApiClient를 검색할 수 없습니다: %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10008": "buildAppUuid와 buildSystemUuid가 모두 null일 수는 없습니다. buildAppUuid 또는 buildSystemUuid 중 하나가 제공되었는지 확인하세요.", + "ORG_ZSTACK_CONTAINER_10015": "%s로 인해 배포 삭제에 실패했습니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10079": "클러스터[uuid:%s] 하이퍼바이저 유형이 유효하지 않습니다", + "ORG_ZSTACK_CONTAINER_10017": "포드를 찾을 수 없습니다[이름=%s, 네임스페이스=%s]", + "ORG_ZSTACK_CONTAINER_10016": "지정되지 않은 오류로 인해 배포 종료에 실패했습니다.%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10075": "블록 볼륨 %s에 대한 액세스 경로[iscsiPath: %s]의 게이트웨이 IP 주소를 검색하지 못했습니다. 원인: %s", + "ORG_ZSTACK_CONTAINER_10018": "%s로 인해 포드에 레이블을 추가하지 못했습니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10076": "게이트웨이[uuid:%s]를 통해 베어메탈 인스턴스[uuid:%s]에서 볼륨[uuid:%s]을 분리하지 못했습니다. 원인: %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10028": "TensorFlow 컨트롤러에서 레이어 3 네트워크[이름:%s]에 DNS 구성을 추가하지 못했습니다. 원인: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10077": "게이트웨이[uuid:%s]에서 베어메탈 인스턴스[uuid:%s]의 볼륨[uuid:%s]을 파괴하지 못했습니다. 원인: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10078": "기본 스토리지[uuid:%s]의 모든 Ceph MON이 정상 상태가 아닙니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10072": "베어메탈2 인스턴스[uuid:%s]가 연결되어 있지 않습니다. 따라서 볼륨을 연결할 수 없습니다.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10073": "외부 기본 스토리지 %s에서 볼륨 LUN ID를 검색하지 못했습니다. 스토리지 시스템이 올바르게 구성되어 있고 접근 가능한지 확인하세요.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10025": "트래픽 관리자 컨트롤러에서 가상 네트워크[이름:%s]의 호스트 경로를 삭제하지 못했습니다. 원인: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10074": "게이트웨이[uuid:%s]에서 베어메탈 인스턴스[uuid:%s]의 볼륨[uuid:%s] LUN ID를 검색하지 못했습니다. 원인: %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10022": "tf 컨트롤러에서 레이어-3 네트워크[이름:%s]에 호스트 라우터를 추가하지 못했습니다. 원인: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10070": "게이트웨이[uuid:%s]를 통해 베어메탈 인스턴스[uuid:%s]에 UUID: %s인 볼륨을 연결하지 못했습니다. 원인: %s", + "ORG_ZSTACK_FLOWMETER_10021": "%s는 숫자 값이어야 합니다.", + "ORG_ZSTACK_LOG4J2_10001": "알 수 없는 log4j2 어펜더 유형 %s", + "ORG_ZSTACK_LOG4J2_10000": "Log4j2 어펜더 유형:%s에 대한 팩토리를 찾을 수 없습니다.", + "ORG_ZSTACK_CONTAINER_10011": "uuid[%s]에 대한 호스트를 찾을 수 없습니다.", + "ORG_ZSTACK_CONTAINER_10013": "클러스터[uuid:%s]의 하이퍼바이저 유형이 유효하지 않습니다", + "ORG_ZSTACK_CONTAINER_10012": "컨테이너 관리 엔드포인트를 찾을 수 없습니다[uuid:%s]", + "ORG_ZSTACK_CONTAINER_10004": "벤더[%s]에 대한 공급자를 찾을 수 없습니다.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10068": "호스트[%s]가 엔드포인트[%s]와 연결되어 있지 않습니다.", + "ORG_ZSTACK_CONTAINER_10005": "endpoint[%s]에 대한 클러스터를 찾을 수 없습니다", + "ORG_ZSTACK_CONTAINER_10008": "클러스터[%s]의 인스턴스 목록을 가져오지 못했습니다: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10064": "UUID:%s인 NIC를 UUID:%s인 Baremetal2 인스턴스에 UUID:%s인 Gateway를 통해 연결하지 못했습니다: %s", + "ORG_ZSTACK_CONTAINER_10007": "Zone[%s]이(가) Endpoint[%s]와 일치하지 않습니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10065": "baremetal2 인스턴스[uuid:%s]이(가) 연결되어 있지 않습니다. 따라서 네트워크 인터페이스에서 분리할 수 없습니다.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10066": "네트워크 인터페이스 [uuid:%s]를 [uuid:%s]인 bare metal 인스턴스에서 [uuid:%s]인 gateway를 통해 분리하지 못했습니다: %s", + "ORG_ZSTACK_CONTAINER_10009": "클러스터[%s]이(가) 다른 가용성 영역[%s]으로 endpoint[%s]에 이미 존재합니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10060": "프로비저닝 네트워크 [uuid:%s]의 모든 BareMetal2 gateway가 연결되어 있는지 확인하십시오.", + "ORG_ZSTACK_CONFIGURATION_10011": "지원되지 않는 주 스토리지 할당 전략[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10061": "VM 인스턴스 UUID 목록이 비어 있습니다. 최소 하나 이상의 유효한 UUID를 제공하십시오.", + "ORG_ZSTACK_CONFIGURATION_10010": "지원되지 않는 호스트 할당 전략[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10062": "baremetal2 gateway [UUID: %s, 상태: %s]이(가) 연결되어 있지 않습니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10063": "baremetal2 인스턴스[uuid:%s]이(가) 연결되어 있지 않습니다. 따라서 NIC를 연결할 수 없습니다.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10031": "tf controller에서 레이어 3 네트워크 [name:%s]의 DNS 구성을 삭제하지 못했습니다: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10119": "installPath와 bootstrap URL이 모두 필요합니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10118": "클라우드 환경에서 백업에서 데이터베이스를 덮어쓰지 마십시오.", + "ORG_ZSTACK_STORAGE_BACKUP_10117": "데이터베이스 백업[uuid:%s]이(가) 백업 스토리지[uuid:%s]로 내보내졌습니다", + "ORG_ZSTACK_STORAGE_BACKUP_10116": "데이터베이스 백업 [UUID %s]이(가) 백업 스토리지 [UUID: %s]에서 내보내지지 않았습니다", + "ORG_ZSTACK_STORAGE_BACKUP_10115": "현재 백업 스토리지 상태[%s]이(가) 작업[%s]을 진행할 수 없습니다. 유효한 상태는 %s입니다", + "ORG_ZSTACK_STORAGE_BACKUP_10114": "SSH 키를 사용하여 피어 노드에 SSH 연결을 수립할 수 없습니다. 네트워크 연결성과 SSH 키 구성을 확인하십시오.", + "ORG_ZSTACK_STORAGE_BACKUP_10113": "bandWidth는 양수 값이어야 합니다", + "ORG_ZSTACK_STORAGE_BACKUP_10112": "작업 매개변수에서 원격 보존 값이 누락되었습니다: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10039": "VM[uuid:%s]이(가) 중지되지 않았으며 특정 호스트에서 실행되지 않습니다.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10007": "내장된 보안 관리자 역할은 내장된 보안 관리자 역할로 제거할 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10038": "볼륨[uuid:%s]이(가) 중지되지 않았으며 특정 호스트에서 실행되지 않는 하나 이상의 VM[uuid:%s]에 연결되어 있습니다.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10008": "시스템 관리자 사용자 그룹에서 시스템 관리자 역할을 취소할 수 없습니다", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10009": "내장된 감사 관리자를 삭제할 수 없습니다. 시스템 제공 역할을 수정하지 않도록 하십시오.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10003": "이 리소스의 초기 사용자 이름은 업데이트할 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10034": "호스트 %s에서 볼륨 %s의 복제를 찾을 수 없습니다", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10004": "%s는 클라우드 컴퓨팅 가상화 환경에서 예약된 키워드입니다. 다른 이름을 선택하십시오.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10037": "기본 스토리지 UUID는 null일 수 없습니다. 기본 스토리지에 유효한 UUID가 제공되었는지 확인하십시오.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10036": "잘못된 리소스 UUID %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10006": "기본 제공 감사 관리자 역할은 내장된 관리자 사용자에게서 철회할 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10042": "ZBox에서 비트를 복원하기 전에 미니 스토리지 [UUID: %s]가 비어 있어야 합니다. 정리하십시오.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10001": "FluentBit 출력 유형에 대한 팩토리를 찾을 수 없습니다: %s.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10010": "기본 제공 보안 관리자를 삭제할 수 없습니다. 시스템 제공 역할을 수정하지 않도록 하십시오.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10041": "하이퍼바이저[%s] 및 백업 스토리지 유형[%s]을 지원하는 LocalStorageBackupStorageMediator가 없습니다", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10011": "기본 제공 시스템 관리자의 권한을 철회할 수 없습니다.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10003": "호스트 이름 또는 ID는 null일 수 없습니다. 유효한 호스트 이름 또는 ID를 제공하십시오.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10012": "추가하려는 역할이 동일한 ID를 가지며 가상화 환경 내에서 호환되는지 확인하십시오.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10002": "알 수 없는 FluentBit 출력 플러그인 유형 %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10013": "가상 ID[uuid:%s]에 대해 역할: %s을(를) ID: %s에 추가할 수 없습니다", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10005": "포트 번호는 null일 수 없습니다", + "ORG_ZSTACK_APPCENTER_UTILS_10000": "원본 템플릿 JSON 파일을 다음 경로에서 찾을 수 없습니다: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10004": "로그 스토리지 서버 [주소: %s]를 사용할 수 없습니다", + "ORG_ZSTACK_APPCENTER_UTILS_10001": "클라우드 리소스 구성에 대한 JSON 템플릿을 생성할 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10040": "호스트[uuid:%s]가 활성화되어 있지 않고 연결 상태가 아니기 때문에 %s 실패했습니다.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10007": "새 구성에 오류가 있어 서비스 예외가 발생했습니다. 구성 매개변수를 다시 확인하십시오. 세부 정보: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10006": "로그 서버 생성에 실패했습니다. 잘못된 새로 전달된 구성 매개변수로 인해 Fluent Bit 서비스가 비활성 상태가 되었을 수 있습니다. 구성의 정확성을 다시 확인하십시오.", + "ORG_ZSTACK_STORAGE_BACKUP_10111": "작업 매개변수에 원격 보존 유형이 누락되었습니다", + "ORG_ZSTACK_STORAGE_BACKUP_10110": "작업 매개변수 구성에 'retentionValue'가 누락되었습니다", + "ORG_ZSTACK_STORAGE_BACKUP_10129": "루트 볼륨 UUID: %s(과(와)) 일치하는 인스턴스를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_BACKUP_10124": "볼륨[uuid:%s]에 대한 VM을 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_BACKUP_10123": "공유 볼륨 연결에서 지원되지 않는 작업입니다", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10028": "볼륨[uuid:%s]에 대해 이미지[uuid:%s]를 검색할 수 있는 백업 스토리지가 없습니다", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10005": "가져온 패키리 또는 클래스에서 JoinType을 찾을 수 없습니다. 올바른 패키지를 가져왔고 클래스에 정의된 JoinType이 포함되어 있는지 확인하십시오.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10029": "이미지[uuid: %s]에 백업 스토리지[uuid: %s]에 대한 참조가 없습니다", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10000": "[CloudFunction]의 출력이 비어 있습니다", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10001": "작업[%s] 호출 실패, 원인: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10023": "호스트[%s]에서 작업을 기대하지만 사용 가능한 호스트는 %s뿐입니다", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10002": "작업: IAM 역할 %s에 대해 %s는 지원되지 않습니다", + "ORG_ZSTACK_STORAGE_BACKUP_10120": "databaseBackup[uuid:%s]이 활성화되어 있지 않거나 사용할 수 없습니다", + "ORG_ZSTACK_STORAGE_SNAPSHOT_REFERENCE_10000": "UUID %s의 볼륨이 다른 볼륨 [%s]에서 참조되고 있습니다. 설치 경로를 변경하기 전에 이러한 볼륨과 해당 하위 볼륨을 평탄화하세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10017": "볼륨 %s 생성을 위해 필수 클러스터 %s가 기본 저장소 %s에 연결되어 있지 않습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10016": "볼륨 [uuid:%s]의 복제 네트워크 상태가 StandAlone 모드로 전환되었으며, 모든 호스트가 Connected 상태입니다. 먼저 복구하세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10018": "볼륨 생성을 위해 필수 클러스터 %s에서 사용 가능한 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10013": "미니 기본 저장소[uuid:%s]의 호스트[uuid:%s]에 충분한 용량이 없습니다[현재: %s 바이트, 필요: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10017": "UUID: %s인 baremetal2 게이트웨이는 UUID: %s인 클러스터와 동일한 영역에 공존하지 않습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10012": "호스트 [UUID: %s]에 기본 저장소 [UUID: %s]에 대한 충분한 공간을 할당할 수 없습니다. 물리적 용량이 부족합니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10018": "활성 인스턴스가 이에 의존하는 경우 Baremetal2 게이트웨이 [uuid:%s]의 클러스터를 수정할 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10015": "볼륨[uuid:%s] 복제가 데이터를 동기화 중입니다. 동기화가 완료될 때까지 기다려 주세요.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10019": "클러스터[%s]은(는) baremetal 유형이 아닙니다", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10014": "미니 저장소 시스템[uuid:%s]에서 볼륨[uuid: %s]을(를) 크기 조정할 수 있는 사용 가능한 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10013": "클러스터[uuid:%s]을(를) 사용할 수 없습니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10014": "클러스터[uuid:%s]은(는) 베어메탈 가상화 클러스터가 아닙니다", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10022": "호스트 %s에 저장소 동기화 포트를 할당할 수 없습니다: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10015": "게이트웨이[uuid:%s]을(를) 사용할 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10021": "기본 저장소[uuid: %s]에 대해 명령을 실행할 사용 가능한 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10016": "UUID: %s인 baremetal2 게이트웨이는 이미 UUID: %s인 클러스터의 일부입니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10010": "baremetal2 게이트웨이[uuid:%s]은(는) 하나의 컴퓨트 클러스터에만 연결할 수 있습니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10011": "baremetal2 게이트웨이 [UUID: %s]이(가) 클러스터 [UUID: %s]에 연결되어 있지 않습니다. 분리할 필요가 없습니다.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10012": "UUID:%s인 baremetal2 게이트웨이는 현재 하나의 클러스터에만 연결되어 있습니다. 분리하지 마세요.", + "ORG_ZSTACK_STORAGE_BACKUP_10108": "작업 매개변수에서 'retentionPolicyType' 및 'retentionPeriod'이(가) 누락되었습니다", + "ORG_ZSTACK_STORAGE_BACKUP_10107": "예기치 않은 백업 저장소 UUID: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10106": "작업 매개변수 'backupStorageUuids'이(가) 비어 있습니다. 작업이 진행되려면 유효한 백업 저장소 UUID가 제공되었는지 확인하세요.", + "ORG_ZSTACK_STORAGE_BACKUP_10105": "작업 매개변수에서 'backupStorageUuids'이(가) 누락되었습니다. 필요한 모든 백업 저장소 UUID가 지정되었는지 확인하세요.", + "ORG_ZSTACK_STORAGE_BACKUP_10104": "필요한 작업 매개변수가 누락되었습니다: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10103": "예기치 않은 작업 상태: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10102": "소스 파일이 누락되어 동기화 작업이 실패했습니다. 필요한 모든 파일이 업로드되었는지 확인하고 다시 시도하세요.", + "ORG_ZSTACK_STORAGE_BACKUP_10101": "저장소 저장소[uuid:%s]에서 데이터베이스 백업[uuid:%s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_LOGIN_PLUGIN_10002": "플러그인 로그인 기능을 사용”时 LoginUserInfo가 누락되었습니다.", + "ORG_ZSTACK_LOGIN_PLUGIN_10001": "%s라는 이름의 로그인 플러그인을 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10005": "미니 스토리지 [UUID: %s, name: %s]가 연결된 클러스터 내에서 볼륨을 생성하기 위한 사용 가능한 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_LOGIN_PLUGIN_10000": "loginPluginName이 누락되었습니다. 로그인 인증을 위한 유효한 플러그인 이름을 제공해 주세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10007": "요청을 할당할 컴퓨트 인스턴스를 확인할 수 없습니다. 인스턴스가 클라우드 환경에 제대로 등록되고 태그되어 있는지 확인해 주세요. 문제가 지속되면 지원을 연락해 주세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10002": "호스트[uuid:%s]가 클라우드 환경에 연결되어 있지 않습니다", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10014": "프로젝트에 관리 권한을 추가할 수 없습니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10006": "관리 IP %s를 가진 baremetal2 노드", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10001": "인스턴스 [UUID:%s]에 캐시된 볼륨이 남아 있어 캐시 볼륨 URL을 업데이트할 수 없습니다", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10015": "가상 머신 ID 화이트리스트[uuid:%s]에 의해 작업이 허용되지 않습니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10007": "관리 IP %s를 가진 호스트에 문제가 발생했습니다.", + "ORG_ZSTACK_KVM_10110": "호스트 [IP:%s]가 데이터베이스의 고유 식별자 [HostUuid:%s]로 인해 인해 작업이 중단되었습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10004": "cloudResourceRecovery에 대한 APIRecoverResourceSplitBrainMsg의 ResourceType [%s]이(가) 유효하지 않습니다.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10016": "가상 머신 ID 블랙리스트[uuid:%s]에 의해 작업이 거부됩니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10008": "BareMetal2 게이트웨이[uuid:%s]를 비 BareMetal2 클러스터[uuid:%s]에 연결할 수 없습니다", + "ORG_ZSTACK_KVM_10111": "호스트 CPU 아키텍처를 확인할 수 없습니다; 사용자 이름과 비밀번호를 확인해 주세요; %s", + "ORG_ZSTACK_STORAGE_BACKUP_10109": "작업 매개변수 구성에서 'retentionType'이 누락되었습니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10009": "UUID: %s를 가진 baremetal2 게이트웨이가 이미 UUID: %s를 가진 클러스터에 연결되어 있습니다", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10002": "관리 IP %s를 가진 baremetal PXE 서버가 이미 존재합니다; BareMetal2 게이트웨이 생성에 사용하지 마세요.", + "ORG_ZSTACK_KVM_10103": "KVM[ip:%s, username:%s, sshPort:%d]에 연결하여 DNS 유효성 검사를 수행할 수 없습니다; 사용자 이름과 비밀번호의 정확성을 확인해 주세요.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10004": "관리 IP[%s]가 유효한 IPv4 주소 또는 호스트명이 아닙니다", + "ORG_ZSTACK_KVM_10104": "%s의 모든 DNS/IP 주소에 대한 ping에 실패했습니다; 네트워크 연결 및 /etc/resolv.conf의 DNS 설정을 확인하여 인스턴스가 공용 인터넷에 접근할 수 있는지 확인해 주세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10010": "연결된 가상 머신을 찾을 수 없습니다, 미니 스토리지 작업 실패", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10005": "비 BareMetal2 클러스터[uuid:%s]에 BareMetal2 게이트웨이를 추가할 수 없습니다", + "ORG_ZSTACK_KVM_10105": "KVM[ip:%s, username:%s, SSH 포트:%d]에 연결하여 관리 노드 접근성을 확인할 수 없습니다; 자격 증명이 올바른지 확인해 주세요; %s", + "ORG_ZSTACK_VPC_HA_VPCHAGC_10000": "VR[uuid: %s] 인스턴스가 실행 중이지 않습니다", + "ORG_ZSTACK_KVM_10106": "KVM 호스트[ip:%s]가 관리 노드의 콜백 URL에 접근할 수 없습니다. KVM 호스트가 관리 IP [%s]에 연결할 수 없는 것으로 보입니다. %s %s", + "ORG_ZSTACK_VPC_HA_VPCHAGC_10001": "VR[uuid: %s] 인스턴스가 연결되지 않음", + "ORG_ZSTACK_KVM_10107": "호스트가 %s 때문에 인계될 수 있는지 확인할 수 없음", + "ORG_ZSTACK_KVM_10108": "%s 때문에 플래그의 타임스탬프를 검색할 수 없습니다", + "ORG_ZSTACK_KVM_10109": "호스트 [IP:%s]가 인수되었습니다. 인수 플래그 [HostUuid:%s]가 이미 존재하고 업데이트 시간 [utime %d]이 호스트 핑 간격 [ping interval %d]을 초과하지 않았기 때문입니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10100": "백업 저장소 중 하나 [UUIDs: %s, %s]가 %s 상태에 있으므로 동기화 작업을 수행할 수 없습니다.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10009": "인스턴스 오퍼링 [UUID:%s]가 비활성화되어 있습니다. VM을 생성할 수 없습니다.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10008": "리소스를 찾을 수 없습니다: UUID [%s]의 InstanceOfferingVO를 사용할 수 없습니다.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10007": "리소스를 찾을 수 없습니다: UUID [%s]의 AutoScalingVmTemplateVO를 사용할 수 없습니다.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10006": "autoScalingGroup[%s]이 새로 생성된 VM을 보안 그룹에 완전히 추가하지 못했습니다. 오류: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10005": "VM NIC를 보안 그룹에 추가 실패, UUID=%s인 보안 그룹을 찾을 수 없습니다.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10004": "autoScalingGroup[%s]이 새로 생성된 VM을 로드 밸런서에 완전히 추가하지 못했습니다. 오류: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10003": "VM NIC를 로드 밸런서에 추가 실패, UUIDs=%s인 로드 밸런서를 찾을 수 없습니다.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10002": "autoScalingGroup[%s] VM 생성 완전히 실패, 오류: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10000": "동일한 스케일링 그룹 내에서 한 번에 하나의 스케일링 활동만 실행될 수 있습니다.", + "ORG_ZSTACK_KVM_10120": "host[uuid:%s]의 구성이 변경되었습니다. 이전: %s, 새로운: %s", + "ORG_ZSTACK_KVM_10121": "host[uuid:%s]가 전원 끄 상태로 전환되었습니다. 알림 전송", + "ORG_ZSTACK_KVM_10112": "호스트 CPU 아키텍처가 클러스터 구성과 일치하지 않습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10000": "클라우드 저장소 구성에서 경로 문자열 %s이(가) 유효하지 않습니다.", + "ORG_ZSTACK_KVM_10115": "호스트 [uuid:%s]가 QEMU/Libvirt 버전이 일치하지 않아 클러스터 [uuid:%s]에 추가될 수 없습니다.", + "ORG_ZSTACK_KVM_10117": "호스트 [uuid:%s]가 CPU 아키텍처 사양이 일치하지 않아 클러스터 [uuid:%s]에 추가될 수 없습니다.", + "ORG_ZSTACK_KVM_10119": "/proc/cpuinfo에서 VTx 또는 VTd를 감지할 수 없습니다. BIOS 설정에서 하드웨어 가상화가 활성화되어 있는지 확인하십시오.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10019": "리소스를 찾을 수 없습니다: L3 네트워크 (UUID: %s)를 찾을 수 없습니다.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10018": "UUIDs:%s인 디스크 오퍼링이 비활성화되어 있습니다. 따라서 이러한 오퍼링에서 VM을 생성할 수 없습니다.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10017": "리소스를 찾을 수 없습니다: UUID [%s]인 디스크 오퍼링을 찾을 수 없습니다.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10016": "system-image[uuid:%s]은(는) 사용자 VM을 생성하는 데 사용할 수 없습니다.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10015": "이미지 미디어 유형이 ISO일 때 rootDiskOfferingUuid는 null일 수 없습니다.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10014": "image[uuid:%s]의 미디어 유형은 %s입니다. VM 생성에는 RootVolumeTemplate과 ISO만 사용할 수 있습니다.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10013": "image[uuid:%s]은(는) 현재 사용할 수 없습니다. VM을 생성하기 전에 준비 상태인지 확인하십시오.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10012": "image[uuid:%s]이(가) 비활성화되어 있습니다. 이 이미지에서 VM을 생성할 수 없습니다.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10011": "리소스를 찾을 수 없습니다: UUID [%s]인 이미지를 찾을 수 없습니다.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10010": "인스턴스 오퍼링 [UUID: %s, type: %s]은(는) User VM 유형이 아닙니다. 따라서 VM을 생성할 수 없습니다.", + "ORG_ZSTACK_KVM_10130": "볼륨을 인스턴스에 연결하지 못했습니다. 이유: %s", + "ORG_ZSTACK_KVM_10131": "볼륨을 인스턴스에서 분리하지 못했습니다. 이유: %s", + "ORG_ZSTACK_KVM_10132": "vm[%s] 디스크 공간 해제 실패, 원인:%s", + "ORG_ZSTACK_KVM_10123": "host[%s]이(가) %d초 내에 종료되지 않았습니다", + "ORG_ZSTACK_KVM_10125": "host[UUID:%s]에서 파일 %s 확인 실패", + "ORG_ZSTACK_KVM_10126": "호스트가 사전 유지보수 상태이므로 현재 운영 체제를 업데이트할 수 없습니다. 유지보수 작업을 완료하거나 지원을 문의하세요.", + "ORG_ZSTACK_KVM_10127": "호스트가 연결 상태가 아니므로 OS 업데이트 작업을 수행할 수 없습니다. OS 업데이트 전에 호스트가 연결되어 있는지 확인하세요.", + "ORG_ZSTACK_COMPUTE_BONDING_10022": "slave UUID와 slave 이름 중 하나가 필요합니다", + "ORG_ZSTACK_COMPUTE_BONDING_10021": "UUID가 %s인 호스트에 인터페이스가 없습니다", + "ORG_ZSTACK_VMWARE_10069": "instance id [%s]를 찾을 수 없습니다", + "ORG_ZSTACK_COMPUTE_BONDING_10020": "인터페이스 %s가 호스트에 존재하지 않습니다", + "ORG_ZSTACK_VMWARE_10067": "vm [%%s]를 찾을 수 없습니다", + "ORG_ZSTACK_COMPUTE_BONDING_10026": "관리 네트워크와 연결된 본딩 인터페이스를 삭제할 수 없습니다. 계속하기 전에 관리 네트워크가 사용 중이 아닌지 확인하세요.", + "ORG_ZSTACK_VMWARE_10064": "VM Instance를 찾을 수 없습니다: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10029": "자동 스케일링 그룹 활동 조정을 건너뛰어야 합니다", + "ORG_ZSTACK_COMPUTE_BONDING_10025": "잘못된 본딩 모드[%s]", + "ORG_ZSTACK_VMWARE_10065": "가상 시스템 종료 실패: %s, %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10028": "클라우드 컴퓨 서비스에서 삭제된 인스턴스 목록을 가져올 수 없습니다", + "ORG_ZSTACK_VMWARE_10062": "VM 재개 실패, 작업 상태: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10027": "시작된 인스턴스 수가 허용된 제한을 초과합니다.%s", + "ORG_ZSTACK_COMPUTE_BONDING_10023": "SR-IOV 인터페이스 [%s]를 본딩에 추가할 수 없습니다. SR-IOV Dev가 두 개 이상 선택되었기 때문입니다", + "ORG_ZSTACK_VMWARE_10063": "가상 시스템 [%s] 재개 실패: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10026": "autoScalingGroup[%s]가 VM[%s]을(를) 완전히 종료하지 못했습니다, 오류: %s", + "ORG_ZSTACK_VMWARE_10060": "VM [%s] 일시 중단 실패: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10025": "autoScalingGroup[%s]이(가) 어떤 VM 템플릿에도 연결되어 있지 않습니다", + "ORG_ZSTACK_COMPUTE_BONDING_10029": "본딩[%s]에 이미 SR-IOV 지원 인터페이스가 포함되어 있으므로 새 인터페이스를 추가할 수 없습니다", + "ORG_ZSTACK_AUTOSCALING_GROUP_10024": "자동 스케일링 그룹[%s]이(가) 예상하지 못한 상태입니다, 예상 상태: %s 상태", + "ORG_ZSTACK_COMPUTE_BONDING_10028": "본딩[%s]에 인터페이스를 반복적으로 연결할 수 없습니다.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10023": "defaultL3NetworkUuid[uuid:%s]가 l3NetworkUuids %s에 존재하지 않습니다", + "ORG_ZSTACK_SNS_PLATFORM_DINGTALK_10000": "DingTalk로 메시지 전송 실패. 상태: %s, 본문: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10022": "l3NetworkUuids에 둘 이상의 Layer 3 네트워크가 지정되어 있지만 defaultL3NetworkUuid가 null입니다", + "ORG_ZSTACK_KVM_10140": "KVM host[uuid:%s]에서 l2Network[uuid:%s, type:%s, vlan:%s]를 위한 브리지[%s] 생성 실패, 원인: %s", + "ORG_ZSTACK_KVM_10151": "호스트[uuid:%s, ip:%s]에서 가상 머신 동기화 실패: %s", + "ORG_ZSTACK_COMPUTE_BONDING_10038": "호스트[uuid:%s]에 Linux 본딩 추가 실패: %s", + "ORG_ZSTACK_KVM_10152": "VM[%s]이(가) 장기간 종료 상태입니다. 상태를 확인해 주세요.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10032": "지원되지 않는 제거 정책 유형[%s]", + "ORG_ZSTACK_V2V_VMWARE_10015": "호스트 %s에서 CIDR %s에 사용 가능한 IP가 없습니다. IP를 새로 고치려면 호스트를 다시 연결해 주세요.", + "ORG_ZSTACK_KVM_10154": "KVM 호스트[uuid:%s]에서 l2Network[uuid:%s, name:%s]의 브리지[%s] 업데이트 실패: %s", + "ORG_ZSTACK_V2V_VMWARE_10016": "VM을 %s에서 변환하는 실행 중인 작업[uuid:%s]이(가) 이미 있습니다.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10030": "deleteAutoScalingRule[%s] 트리거 실패, 오류: %s", + "ORG_ZSTACK_V2V_VMWARE_10017": "가상 머신 %s의 변환 호스트 종속성 업데이트 실패", + "ORG_ZSTACK_KVM_10146": "KVM 호스트[uuid:%s]에 보안 그룹 규칙 적용 실패: %s", + "ORG_ZSTACK_KVM_10147": "KVM 호스트[uuid:%s]에서 보안 그룹 기본 규칙 확인 실패: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10101": "HTTP 리다이렉트 URL을 지정하지 않고 리다이렉트 포트 또는 상태 코드를 할당할 수 없습니다.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10009": "하트비트 감지 실패, 코드: %s, 상세 정보: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10104": "로드 밸런서 리스너[%s]는 세션 지속성 상태 수정을 지원하지 않습니다.", + "ORG_ZSTACK_IAM2SCRIPT_10010": "이 클라우드 컴퓨팅 환경에서는 지정된 스크립트 실행자가 지원되지 않습니다. 지원되는 실행자 목록을 참조하세요.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10105": "클라우드 환경에서 HTTP 리다이렉트 및 세션 지속성을 동시에 지원할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10102": "HTTP를 HTTPS로 리다이렉트를 지정할 때 HTTP 외의 프로토콜은 지원되지 않습니다.", + "ORG_ZSTACK_VMWARE_10048": "호스트가 클라우드 환경에 연결되어 있지 않습니다. 호스트가 올바르게 구성 및 승인되었는지 확인해 주세요.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10108": "리스너[%s]가 세션 지속성을 수정합니다. 로드 밸런싱 알고리즘을 지정해야 합니다.", + "ORG_ZSTACK_V2V_VMWARE_10007": "URL %s 구문 분석 실패", + "ORG_ZSTACK_COMPUTE_BONDING_10044": "호스트[uuid:%s]에서 Linux 본딩에 NIC 연결 실패: %s", + "ORG_ZSTACK_VMWARE_10046": "vCenter에서 핫플러그 작업에 대해 네트워크 인터페이스 카드(NIC)가 지원되지 않으므로 NIC를 분리할 수 없습니다.", + "ORG_ZSTACK_BILLING_10019": "GPU 가격이 GPU UUID %s에 바인딩되어야 합니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10109": "리스너[%s] %s 로드 밸런싱 알고리즘은 iphash을 명시적으로 할당하지 않고는 세션 지속성 수정을 지원하지 않습니다.", + "ORG_ZSTACK_V2V_VMWARE_10008": "dataCenter 이름에 특수 문자 %s를 포함할 수 없습니다.", + "ORG_ZSTACK_IAM2SCRIPT_10002": "스크립트 내용이 비어 있습니다. Java 코드 스니펫이 소스 파일에 올바르게 정의되어 있는지 확인하세요.", + "ORG_ZSTACK_BILLING_10018": "GPU 가격이 유효한 GPU UUID에 바인딩되어야 합니다. 빈이 아닌 UUID를 제공하세요.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10106": "리스너[%s]는 HTTP 모드가 http-tunnel로 설정된 경우 세션 지속성 재작성을 수정할 수 없습니다.", + "ORG_ZSTACK_V2V_VMWARE_10009": "대상 VM 이름에 특수 문자 %s를 포함할 수 없습니다.", + "ORG_ZSTACK_IAM2SCRIPT_10001": "스크립트 콘텐츠를 디코딩 실패합니다. 소스 파일이 사용 가능하고 클라우드 컴퓨팅 환경에 맞게 올바르게 형식화되었는지 확인하세요.", + "ORG_ZSTACK_COMPUTE_BONDING_10042": "호스트[uuid:%s]에서 Linux 본드를 제거하지 못함: %s", + "ORG_ZSTACK_VMWARE_10044": "호스트 CPU와 Guest OS가 호환되지 않습니다. 호스트 CPU가 필요한 가상화 기술을 지원하는지 확인하거나 Guest OS를 호환되는 버전으로 업데이트하세요.", + "ORG_ZSTACK_BILLING_10017": "가격은 0에서 999999999.99 사이여야 합니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10107": "리스너[%s]가 세션 지속성을 IP 해시로 변경합니다. 소스 로드 밸런서 알고리즘을 지정해야 합니다.", + "ORG_ZSTACK_VMWARE_10045": "호스트 %s에서 가상 머신 %s의 호환성 확인이 실패했습니다.", + "ORG_ZSTACK_BILLING_10016": "할당의 최소 리소스 단위는 바이트가 아닌 메가바이트입니다.", + "ORG_ZSTACK_SDNCONTROLLER_10008": "SDN L2 네트워크[UUID:%s]가 컨트롤러에 연결되지 않았습니다.", + "ORG_ZSTACK_IAM2SCRIPT_10007": "IAM2 스크립트 기능이 활성화되어 있지 않습니다. 클라우드 환경에서 IAM2 서비스가 활성화되어 있는지 확인하세요.", + "ORG_ZSTACK_BILLING_10015": "resourceName[%s]은(는) 클라우드 컴퓨팅 컨텍스트에서 유효하지 않은 식별자입니다.", + "ORG_ZSTACK_IAM2SCRIPT_10005": "스크립트 실행 출력을 검색할 수 없습니다. 클라우드 인스턴스 및 네트워크 설정을 확인하세요.", + "ORG_ZSTACK_COMPUTE_BONDING_10046": "호스트[uuid:%s]에서 Linux 본딩의 NIC 분리 실패: %s", + "ORG_ZSTACK_VMWARE_10040": "대상 호스트 UUID가 누락되었습니다. 대상 호스트의 UUID가 올바르게 지정되어 있는지 확인하세요.", + "ORG_ZSTACK_IAM2SCRIPT_10004": "iam2 스크립트 실행 실패. 필요한 클라우드 컴퓨팅 환경이 제대로 설정되어 있는지 확인하세요.", + "ORG_ZSTACK_VMWARE_10041": "대상 호스트가 가상 머신 관리를 지원하지 않습니다. 대상 호스트가 ESX 또는 vSphere 호스트인지 확인하세요.", + "ORG_ZSTACK_KVM_10161": "가상 머신[uuid:%s]에 대해 예기치 않은 VNC 포트 번호[%d]입니다.", + "ORG_ZSTACK_IAM2SCRIPT_10009": "매개변수 수가 허용 제한을 초과합니다.", + "ORG_ZSTACK_IAM2SCRIPT_10008": "스크립트에 코드가 포함되어 있지 않습니다. 입력에 유효한 Java 코드가 포함되어 있는지 확인하세요.", + "ORG_ZSTACK_SDNCONTROLLER_10000": "API 요청의 systemTags에서 SDN 컨트롤러 UUID가 누락되어 SDN L2 네트워크를 생성할 수 없습니다. SDN 컨트롤러 UUID가 올바르게 지정되어 있는지 확인하세요.", + "ORG_ZSTACK_V2V_VMWARE_10003": "클러스터 이름에는 다음 문자가 포함될 수 없습니다: %s", + "ORG_ZSTACK_SDNCONTROLLER_10002": "레이어 2 네트워크[uuid:%s, vswitchType:%s]에 대한 SDN 컨트롤러를 찾을 수 없습니다.", + "ORG_ZSTACK_SDNCONTROLLER_10001": "API 요청에서 SDN 컨트롤러 UUID가 누락되어 SDN L2 네트워크를 생성할 수 없습니다. UUID가 포함되어 있는지 확인하세요.", + "ORG_ZSTACK_V2V_VMWARE_10006": "v2v 마이그레이션 전에 VM 인스턴스 %s를 중지하지 못함", + "ORG_ZSTACK_KVM_10157": "응답[%s]은(는) KVMHostAsyncHttpCallResponse가 아닙니다", + "ORG_ZSTACK_KVM_10158": "응답[%s]이(가) 빈 응답 본문으로 반환됨", + "ORG_ZSTACK_KVM_10159": "%s 작업 실패: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10040": "EIP를 삭제할 때 EcsInstance는 실행 중 또는 중지 상태여야 합니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10111": "리스너[%s]는 유휴 시간 제한 및 쿠키 이름 수정을 지원하지 않습니다. 세션 지속성이 지정되어야 합니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10112": "리스너[%s]는 세션 지속성이 비활성화되어 있을 때 유휴 시간 제한 수정을 지원하지 않습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10110": "리스너[%s] %s 로드 밸런싱 알고리즘은 명시적으로 비활성화를 할당하지 않고는 세션 지속성 수정을 지원하지 않습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10115": "유효하지 않은 세션 유휴 시간 제한[%s]은(는) [%s~%s] 사이의 양의 정수여야 합니다.", + "ORG_ZSTACK_COMPUTE_BONDING_10040": "Linux bonding 업데이트 실패 (host[uuid:%s]): %s", + "ORG_ZSTACK_VMWARE_10039": "메타데이터 요청에서 호스트 UUID 누락", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10116": "%s의 상태 확인 파라미터에 대해 HTTP 상태 확인 프로토콜을 지정해야 합니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10113": "세션 지속성이 rewrite로 설정되지 않은 경우 listener[%s]는 쿠키 이름 수정을 지원하지 않습니다.", + "ORG_ZSTACK_VMWARE_10037": "분산 가상 스위치 또는 적합한 가상 스위치를 찾을 수 없음", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10114": "listener[%s]는 쿠키 이름 변경 없이 세션 기반 URL 재작성 수정을 지원하지 않습니다.", + "ORG_ZSTACK_VMWARE_10038": "vCenter %s에 대한 데이터스토어 %s를 찾을 수 없음", + "ORG_ZSTACK_BILLING_10009": "resourceType과 resourceUUID는 동시에 비어 있을 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10119": "잘못된 상태 확인 대상[%s], 형식은 checkProtocol:port여야 합니다 (예: tcp:default)", + "ORG_ZSTACK_SDNCONTROLLER_10015": "SDN 컨트롤러 추가 실패: type: %s가 지원 목록에 없음: %s", + "ORG_ZSTACK_SDNCONTROLLER_10014": "보안 그룹 규칙 추가 실패: 원격 보안 그룹 컨트롤러 UUID[:%s]가 로컬 보안 그룹 컨트롤러 UUID[:%s]와 일치하지 않음", + "ORG_ZSTACK_VMWARE_10036": "클러스터링 작업에 사용할 수 있는 컴퓨트 리소스가 없습니다.%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10117": "HTTP 상태 확인 프로토콜의 예상 상태 코드 [%s]가 유효하지 않습니다.", + "ORG_ZSTACK_SDNCONTROLLER_10017": "SDN 컨트롤러 추가 실패: 컨트롤러 [IP:%s]가 이미 등록되어 있습니다.", + "ORG_ZSTACK_VMWARE_10033": "vCenter [%s]와의 SSL 핸드셰이크 실패: 안전하지 않은 TLS 1.0이 사용되고 있습니다. 필요한 경우 JDK 구성에서 TLS 1.0을 수동으로 활성화하세요.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10118": "프로토콜 [%s]의 리스너는 보안 정책 선택을 지원하지 않습니다.", + "ORG_ZSTACK_SDNCONTROLLER_10016": "SDN 컨트롤러 추가 실패: ip[%s]가 유효한 유니캐스트 주소가 아닙니다.", + "ORG_ZSTACK_VMWARE_10034": "vCenter [%s]와의 SSL 핸드셰이크 실패, 포트 번호 [%d]를 확인하세요.", + "ORG_ZSTACK_BILLING_10027": "과금이 활성화되어 있습니다. 이 작업은 과금이 비활성화된 경우에만 허용됩니다.", + "ORG_ZSTACK_SDNCONTROLLER_10019": "서브넷 마스크가 지정되지 않아 호스트 [UUID:%s]를 SDN 컨트롤러 [UUID:%s]에 추가할 수 없습니다.", + "ORG_ZSTACK_VMWARE_10031": "vCenter Server [%s]에 대한 로그인이 사용자 자격 증명으로 실패했습니다. 네트워크 연결 및 제공된 자격 증명을 확인하세요.", + "ORG_ZSTACK_BILLING_10026": "endDate가 startDate보다 빠를 수 없습니다.", + "ORG_ZSTACK_SDNCONTROLLER_10018": "호스트[uuid:%s]가 이미 다른 SDN 컨트롤러에 연결되어 있어 SDN 컨트롤러[uuid:%s]에 추가할 수 없습니다.", + "ORG_ZSTACK_VMWARE_10032": "vCenter [%s]의 응답 파싱 실패, 포트 번호 [%d]를 확인하세요.", + "ORG_ZSTACK_BILLING_10025": "endDateInLong이 설정되어 있어 데이터 일관성 및 가상화 표준 준수를 위해 클라우드 환경에서의 수정이 허용되지 않습니다.", + "ORG_ZSTACK_BILLING_10024": "endDateInLong과 setEndDateInLongBaseOnCurrentTime을 동시에 구성할 수 없습니다. 설정에서 하나를 선택하세요.", + "ORG_ZSTACK_VMWARE_10030": "클라우드 리소스 연결 실패: %s", + "ORG_ZSTACK_BILLING_10023": "endDateInLong은 음수 값을 사용할 수 없습니다.", + "ORG_ZSTACK_BILLING_10022": "accountUuid와 tableUuid는 상호 배타적입니다. 둘 중 하나만 설정할 수 있습니다.", + "ORG_ZSTACK_BILLING_10021": "이 클라우드 환경에서 priceTable[uuid=%s] 삭제가 허용되지 않습니다.", + "ORG_ZSTACK_BILLING_10020": "계정[uuid=%s]이(가) 가격표를 연결했습니다", + "ORG_ZSTACK_LONGJOB_10007": "이미 성공한 장기 실행 작업은 취소할 수 없습니다", + "ORG_ZSTACK_SDNCONTROLLER_10011": "풀 테넌트 작업은 H3C VCFC V2X 컨트롤러에서만 지원됩니다", + "ORG_ZSTACK_LONGJOB_10008": "실패한 장기 실행 작업은 취소할 수 없습니다", + "ORG_ZSTACK_LONGJOB_10009": "장기 실행 작업은 성공하거나 취소되거나 실패한 경우에만 삭제하세요.", + "ORG_ZSTACK_SDNCONTROLLER_10013": "SDN 컨트롤러가 다르기 때문에 vmnic을 보안 그룹에 추가할 수 없습니다 [NIC 컨트롤러 UUID: %s, 보안 그룹 컨트롤러 UUID: %s]", + "ORG_ZSTACK_SDNCONTROLLER_10012": "테넌트 데이터 검색 실패: %s", + "ORG_ZSTACK_LONGJOB_10010": "장기 작업은 성공하거나 취소되거나 실패한 경우에만 다시 실행할 수 있습니다", + "ORG_ZSTACK_LONGJOB_10011": "일시 중단된 상태의 장기 작업만 다시 시작할 수 있습니다", + "ORG_ZSTACK_LONGJOB_10012": "%s에 해당하는 장기 실행 작업이 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10122": "클라우드는 프로토콜 [%s]의 수신기가 HTTP 버전 [%s] 선택을 지원하지 않으므로 로드 밸런서 수신기를 수정할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10123": "클라우드는 HTTPS 프로토콜이 HTTP 버전 [%s]만 지원하므로 로드 밸런서 수신기를 수정할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10120": "프로토콜 [%s]의 수신기가 이 상태 확인 [%s]과(와) 호환되지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10121": "HTTP 상태 확인 프로토콜을 지정해야 합니다. healthCheckMethod 및 healthCheckURI와 같은 정상 확인 매개변수를 포함하세요.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10126": "클라우드는 프로토콜 [%s]의 수신기가 콘텐츠 압축을 지원하지 않으므로 로드 밸런서 수신기 변경을 지원하지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10127": "클라우드는 압축 알고리즘 [%s]만 지원하므로 로드 밸런서 수신기를 수정할 수 없습니다", + "ORG_ZSTACK_VMWARE_10029": "로그인 실패. 자격 증명을 확인하고 클라우드 컴퓨팅 서비스에 올바른 로그인 매개변수를 사용하고 있는지 확인하세요.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10124": "클라우드는 TCP 프로토콜 수신기가 매개변수 설정에 TCP 프록시만 지원하므로 로드 밸런서 수신기를 수정할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10125": "클라우드는 TCP 프록시 프로토콜 %s만 지원하므로 로드 밸런서 수신기를 수정할 수 없습니다", + "ORG_ZSTACK_VMWARE_10027": "VCenter[uuid:%s]을(를) 찾을 수 없습니다: 지정된 UUID의 가상화 환경이 존재하지 않습니다.", + "ORG_ZSTACK_TAG_10004": "리소스 유형[%s]에 일치하는 시스템 태그가 없습니다[%s]", + "ORG_ZSTACK_SDNCONTROLLER_10026": "풀 테넌트 작업은 SDN 컨트롤러 [uuid:%s, vendorType:%s, vendorVersion:%s]에서 지원되지 않습니다. 이 작업은 H3C VCFC V2 컨트롤러만 지원합니다.", + "ORG_ZSTACK_LOG_10007": "알 수 없는 로그 구성 유형 %s", + "ORG_ZSTACK_SDNCONTROLLER_10025": "SDN 컨트롤러 [UUID:%s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_TAG_10005": "리소스 유형[%s]에 대한 시스템 태그 [%s] 검증 실패", + "ORG_ZSTACK_LOG_10006": "로그 서버에 대한 알 수 없는 구성 유형 %s", + "ORG_ZSTACK_SDNCONTROLLER_10028": "VLAN 범위[%s]가 올바른 형식이 아니므로 SDN 컨트롤러를 변경할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10128": "잘못된 IP 버전[%s]입니다. IPv4 또는 IPv6이어야 합니다.", + "ORG_ZSTACK_LOG_10005": "계정 [uuid:%s]에 추가 로그 서버를 추가할 권한이 없습니다. 이 권한은 관리자 계정만 보유합니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10129": "기본 서버 그룹[uuid:%s]을(를) 삭제할 수 없습니다", + "ORG_ZSTACK_LOG_10004": "접근 거부: Account[uuid:%s] 관리자 노드 로그를 검색할 권한이 없습니다. 이 권한은 관리자 계정만 가집니다.", + "ORG_ZSTACK_TAG_10008": "tag[%s]는 관리용으로만 사용됩니다", + "ORG_ZSTACK_LOG_10003": "계정 [UUID:%s]은(는) 로그 서버 [UUID:%s]에서 작업을 수행할 권한이 없습니다.", + "ORG_ZSTACK_SDNCONTROLLER_10029": "VLAN 범위[%s]가 다른 VLAN 범위와 중복되어 SDN 컨트롤러를 변경할 수 없습니다", + "ORG_ZSTACK_LOG_10002": "type:%s에 대한 팩토리를 찾을 수 없습니다", + "ORG_ZSTACK_TAG_10006": "%s에 대한 일치하는 시스템 태그를 찾을 수 없습니다", + "ORG_ZSTACK_SDNCONTROLLER_10020": "vTEP IP가 호스트 [UUID:%s]에서 사용 중이므로 호스트 [UUID:%s]을(를) SDN 컨트롤러 [UUID:%s]에 추가할 수 없습니다", + "ORG_ZSTACK_SDNCONTROLLER_10022": "호스트가 SDN 컨트롤러에 추가되지 않았으므로 SDN 컨트롤러 [uuid:%s]의 호스트 [uuid:%s]을(를) 업데이트할 수 없습니다", + "ORG_ZSTACK_TAG_10000": "중복된 태그[tag:%s, Type:%s, Resource_Type:%s, Resource_Uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10021": "호스트가 SDN 컨트롤러에 등록되지 않았으므로 SDN 컨트롤러 [uuid:%s]에서 호스트 [uuid:%s]의 등록을 취소할 수 없습니다", + "ORG_ZSTACK_SDNCONTROLLER_10024": "SDN 컨트롤러 [uuid:%s]의 일부 테넌트가 삭제되어 VM에 L3 네트워크를 연결할 수 없습니다. 먼저 테넌트 동기화를 실행하여 테넌트 상태를 업데이트하십시오.", + "ORG_ZSTACK_SDNCONTROLLER_10023": "넷마스크가 지정되었으므로 SDN 컨트롤러 [uuid:%s]의 호스트 [uuid:%s]을(를) 업데이트할 수 없습니다", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10000": "배치 데이터 무결성 확인 실패, 지원되지 않는 리소스 유형: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10002": "무결성 리소스 추가 실패, 지원되지 않는 리소스 유형: %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10002": "템플릿 오류: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10134": "VMNic 가중치 [%s]가 유효한 숫자가 아니므로 백엔드 서버 VMNic을(를) 서버 그룹 [UUID:%s]에 추가할 수 없습니다", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10008": "ID:%s로 이미지 캐시를 검색하지 못함: GetImageHashValueReply.hashValue이(가) null입니다", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10009": "가상 머신 환경 문제로 인해 이미지 캐시[%s] 일관성 확인 실패", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10000": "이 유형의 사용 가능한 템플릿이 없습니다: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10132": "VMNIC이 존재하지 않으므로 UUID:%s인 백엔드 서버 VMNIC을(를) UUID:%s인 서버 그룹에 추가할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10137": "NIC IP [ipAddress:%s]가 중복되어 백엔드 서버 NIC을(를) 서버 그룹 [uuid:%s]에 추가할 수 없습니다", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10003": "시작 데이터 보호 encryptType[%s]이(가) 유효하지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10138": "侦听기 [uuid:%s]가 이미 이 서버 그룹의 네트워크 인터페이스를 연결했으므로 가상 머신 네트워크 인터페이스 [uuid:%s]을(를) 서버 그룹 [uuid:%s]에 추가할 수 없습니다", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10004": "스냅샷[uuid:%s]이(가) 가상화 환경에서 암호화되지 않았습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10135": "L3 네트워크(UUID:%s)가 VM nic과 연결되어 있어 네트워크 서비스:%s가 활성화되지 않았습니다", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10005": "상태 불일치로 인해 볼륨 스냅샷[%s] 일관성 확인 실패", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10136": "VM NIC [UUID: %s]이(가) 이미 로드 밸런서 서버 그룹 [UUID: %s]과(와) 연결되어 있습니다.", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10006": "암호화 오류: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10139": "IP [IP Address:%s]가 이미 등록되어 있으므로 백엔드 서버 IP을(를) 서버 그룹 [UUID:%s]에 추가할 수 없습니다", + "ORG_ZSTACK_VMWARE_10097": "VCENTER[%s]이(가) 운영 상태가 아닙니다, 현재 상태: %s", + "ORG_ZSTACK_VMWARE_10098": "vdisk를 찾을 수 없습니다: %s", + "ORG_ZSTACK_VMWARE_10095": "최근 작업 목록을 가져오지 못했습니다, 세부 정보: %s", + "ORG_ZSTACK_VMWARE_10096": "L2 네트워크 [uuid:%s]의 물리적 인터페이스 정의가 비어 있습니다", + "ORG_ZSTACK_VMWARE_10093": "vCenter 백업 스토리지는 이미지 해시 계산을 지원하지 않습니다.", + "ORG_ZSTACK_VMWARE_10091": "%s 기능은 클라우드 환경에서 아직 지원되지 않습니다.", + "ORG_ZSTACK_TAG_10011": "tag[uuid:%s]는 본질적인 시스템 태그이므로 제거할 수 없습니다.", + "ORG_ZSTACK_TAG_10012": "'resourceType' 인수가 예상된 UUID와 일치하지 않습니다. resource type이 올바르게 UUID로 지정되었는지 확인하세요.", + "ORG_ZSTACK_VMWARE_10090": "이미지 %s를 backing store에서 찾을 수 없습니다. 이미지 경로가 올바른지 확인하고 다시 시도하세요.", + "ORG_ZSTACK_TAG_10010": "tag 시스템 %s에서 resource type을 찾을 수 없습니다.", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10010": "암호화 이미지 캐시[id:%s] 실패: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10011": "nodeType %s 무결성 파일[path:%s]이(가) 가상화된 환경에 이미 존재합니다", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10012": "유효하지 않은 node type[%s]", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10013": "무결성 파일[%s.%s] 추가 실패, 현재 디렉터리입니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10141": "유효하지 않은 가중치[serverIp:%s, weight:%s], 가중치가 유효한 범위 [%d, %d] 내에 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10143": "서버 IP [uuid:%s]가 이미 로드 밸런서 서버 그룹 [uuid:%s]에 연결되어 있습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10148": "loadbalancerServerGroup [%s]이(가) 존재하지 않습니다", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10014": "무결성 파일[%s.%s]이(가) 존재하지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10149": "VMNic 또는 IP 주소가 null입니다. 네트워크 구성 설정을 확인하세요.", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10015": "호스트 %s이(가) 존재하지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10146": "vmnics이(가) 모두 서버 그룹 [%s]과(와) 연결되어 있지 않습니다", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10000": "외부 기본 스토리지[uuid:%s, name:%s]가 비정상 상태를 반환합니다: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10016": "%s로 인해 셸 실행이 실패했습니다.", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10001": "볼륨에 대한 활성 클라이언트 찾기[uuid:%s, mountPath %s, client:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10147": "서버 IP가 모두 서버 그룹 [%s]과(와) 연결되어 있지 않습니다", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10017": "무결성 검증 파일[%s.%s] 추가 실패, 이유: %s", + "ORG_ZSTACK_VMWARE_10088": "vCenter 백업 스토리지는 이미지 다운로드 취소를 지원하지 않습니다.", + "ORG_ZSTACK_VMWARE_10086": "%s 리소스가 이미 프로비저닝되었습니다.", + "ORG_ZSTACK_VMWARE_10085": "예기치 않은 프로토콜: %s", + "ORG_ZSTACK_VMWARE_10082": "%s에 연결된 데이터 저장소가 없습니다", + "ORG_ZSTACK_VMWARE_10083": "%s에 대한 데이터 저장소를 찾을 수 없습니다", + "ORG_ZSTACK_VMWARE_10080": "vCenter[uuid=%s]가 비활성화되었습니다. 이 vCenter에서 읽기 전용 작업만 수행할 수 있습니다. 구성 변경을 하려면 UpdateVCenterAction을 사용하여 vCenter 구성을 업데이트하세요 {uuid=%s state=Enabled}", + "ORG_ZSTACK_VMWARE_10081": "VCENTER[uuid=%s]가 비활성화되었습니다. 이러한 VCENTER에서 읽기 전용 작업만 수행할 수 있습니다.", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10021": "암호화된 스냅샷[uuid:%s] 실패: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10151": "네트워크 인터페이스 UUID:%s가 이미 연결되어 있기 때문에 UUID:%s의 서버 그룹을 UUID:%s의_listener에 추가할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10152": "서버 IP 주소가 이미 등록되어 있어 UUID:%s의 서버 인스턴스를 UUID:%s의_listener에 추가할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10150": "이미 추가되어 있기 때문에 UUID:%s의 서버 그룹을 UUID:%s의_listener에 추가할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10155": "UDP 리스너가 IPv4 백엔드 주소를 IPv6에 매핑할 수 없기 때문에 UUID:%s의 서버 그룹을 UUID:%s의_listener에 추가할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10156": "HTTP 리디렉션이 HTTPS로 활성화되어 있어 UUID:%s의 서버 그룹을 UUID:%s의_listener에서 제거할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10153": "UDP 리스너가 IPv4와 IPv6 VIP 주소를 동시에 가질 수 없기 때문에 UUID:%s의 서버 그룹을 UUID:%s의_listener에 추가할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10154": "UDP 리스너가 IPv6 백엔드 주소를 IPv4 주소에 매핑할 수 없기 때문에 UUID:%s의 서버 그룹을 UUID:%s의_listener에 추가할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10159": "서버 그룹 [uuid:%s]에 연결된 로드 밸런서를 찾을 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10157": "서버 그룹 [uuid:%s]이(가) 로드 밸런서 [uuid:%s]에 등록되어 있지 않아 등록 취소할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10158": "로드 밸런서Uuid [%s]가 존재하지 않습니다.", + "ORG_ZSTACK_VMWARE_10078": "현재 클라우드 컴퓨팅 환경에서는 이 작업이 지원되지 않습니다. 요청이 클라우드 리소스에 대해 지원되는 작업과 일치하는지 확인하세요.", + "ORG_ZSTACK_VMWARE_10076": "VM 전원 켜기 실패, 작업 상태: %s", + "ORG_ZSTACK_VMWARE_10073": "VM [%s]이(가) vCenter 인벤토리에서 찾을 수 없습니다.", + "ORG_ZSTACK_VMWARE_10071": "ESX 호스트 UUID=%s에서 UUID=%s인 VM을 찾지 못했습니다.", + "ORG_ZSTACK_VMWARE_10072": "ESX VM[uuid=%s] 구성 업데이트 실패. 자세한 내용은 로그를 참조하세요.", + "ORG_ZSTACK_VMWARE_10070": "이미지 [%s]이(가) 레지스트리 또는 로컬 캐시에서 찾을 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10162": "VMNIC 가중치[%s]가 유효한 숫자가 아니기 때문에 백엔드 서버 VMNIC를 서버 그룹[uuid:%s]으로 변경할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10163": "유효하지 않은 밸런서 가중치[vimNic:%s], 가중치는 null일 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10160": "서버 그룹 [uuid:%s]에 VMNIC [uuid:%s]이(가) 없기 때문에 백엔드 서버 VMNIC를 업데이트할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10161": "유효하지 않은 밸런서 가중치[vimNic:%s], 가중치 값이 범위를 벗어났습니다 [%d, %d].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10166": "유효하지 않은 밸런서 가중치[serverIp:%s,weight:%s], 가중치가 유효한 범위 내에 있지 않습니다 [%d, %d].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10167": "VMNIC 가중치 [%s]가 유효한 숫자가 아니기 때문에 백엔드 서버 IP를 서버 그룹 [UUID:%s]에 추가할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10164": "VMNIC UUID가 null이기 때문에 서버 그룹 [UUID:%s]의 백엔드 서버 VMNIC를 업데이트할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10165": "서버 그룹 [uuid:%s]에 IP [ipAddress:%s]이(가) 없기 때문에 백엔드 서버 IP를 업데이트할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10168": "유효하지 않은 밸런서 가중치[serverIp:%s], 가중치는 null일 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10169": "IP [IP Address:%s]가 유효하지 않기 때문에 백엔드 서버 IP를 서버 그룹 [UUID:%s]에 추가할 수 없습니다.", + "ORG_ZSTACK_VPC_HA_10010": "HA 그룹 [uuid:%s]에 2개 이상의 VPC 라우터가 연결되어 있습니다.", + "ORG_ZSTACK_COMPUTE_VM_10119": "인스턴스 온라인 수정이 비활성화되어 있어 가상 머신이 온라인 CPU/메모리 업데이트를 수행할 수 없습니다. VM을 중지한 후 CPU/메모리 업데이트를 다시 시도하십시오.", + "ORG_ZSTACK_VPC_HA_10011": "", + "ORG_ZSTACK_VPC_HA_10012": "HA 그룹 관리 L3 및 공용 L3 네트워크 [uuid:%s]가 제공된 L3 네트워크 [uuid:%s]와 다릅니다.", + "ORG_ZSTACK_VPC_HA_10013": "", + "ORG_ZSTACK_VPC_HA_10014": "vPC 라우터 L3 네트워크 [UUID:%s]가 HA 그룹 L3 네트워크 [UUID:%s]와 일치하지 않습니다. 이 라우터를 삭제하고 다시 생성하십시오.", + "ORG_ZSTACK_VPC_HA_10015": "", + "ORG_ZSTACK_VPC_HA_10016": "vPC 라우터가 고가용성 그룹 [uuid:%s]에 연결되었습니다.", + "ORG_ZSTACK_VPC_HA_10017": "", + "ORG_ZSTACK_VPC_HA_10018": "vpc ha 그룹 [uuid:%s]이(가) 존재하지 않습니다", + "ORG_ZSTACK_VPC_HA_10019": "", + "ORG_ZSTACK_VPC_HA_10009": "HA 그룹 [uuid:%s]에 두 개 이상의 VPC 라우터가 연결되어 있습니다", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10000": "", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10002": "vPC 라우터 [UUID:%s]는 공용 네트워크가 관리 네트워크와 동일하므로 HA 라우터로 업그레이드할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10053": "", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10050": "고가용성 그룹 [uuid:%s]에 대한 선호도 그룹 생성 실패", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10051": "", + "ORG_ZSTACK_COMPUTE_VM_10118": "VPC HA 그룹 %s [uuid: %s]의 인스턴스 %s [uuid: %s]의 haStatus가 %s에서 %s(으)로 변경되었습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10056": "", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10008": "인스턴스[uuid: %s, name: %s, type: %s]의 haStatus가 %s에서 %s(으)로 변경되었습니다", + "ORG_ZSTACK_COMPUTE_VM_10117": "", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10057": "라우터 [uuid:%s]에 마스터 라우터가 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10007": "", + "ORG_ZSTACK_COMPUTE_VM_10116": "nfv 인스턴스 초기화 명령 실패 원인:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10054": "", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10055": "NFV 인스턴스 VM[uuid:%s]의 네트워크 인터페이스 방화벽 기본 정책을 수정하지 못했습니다. 원인: %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10009": "", + "ORG_ZSTACK_COMPUTE_VM_10114": "접근 제어 목록 그룹[uuid:%s]이(가) 리다이렉트하도록 구성되어 있지만 일부 접근 제어 목록 항목에 IP 규칙이 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10004": "", + "ORG_ZSTACK_COMPUTE_VM_10113": "로드 밸런서 리스너 [UUID:%s]은(는) %d개 이상의 리다이렉트 규칙 접근 제어 목록 그룹을 연결할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10058": "", + "ORG_ZSTACK_COMPUTE_VM_10136": "정적 IP [%s]가 잘못된 형식입니다", + "ORG_ZSTACK_COMPUTE_VM_10135": "IP 주소가 지정되지 않았으므로 인스턴스에 IP 주소를 설정할 수 없습니다. 네트워크 설정을 구성하기 전에 IP 주소가 제공되었는지 확인하세요.", + "ORG_ZSTACK_COMPUTE_VM_10134": "IP 주소 [%s]가 지정된 IP 범위 [시작IP %s, 종료IP %s] 내에 없습니다", + "ORG_ZSTACK_COMPUTE_VM_10133": "IP 주소 [%s]가 이미 VM NIC [uuid:%s]에 할당되어 있습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10081": "세션 지속성이 비활성화된 경우 loadBalancer[%s] listener[%s]는 유휴 시간 초과 및 쿠키 이름 할당을 지원하지 않습니다", + "ORG_ZSTACK_COMPUTE_VM_10143": "VM [uuid:%s]에 대한 정적 IP [%s]가 존재하지 않아 해제할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10082": "쿠키 이름을 지정하지 않으면 loadBalancer[%s] listener[%s]는 세션 지속성 재작성 할당을 지원하지 않습니다", + "ORG_ZSTACK_COMPUTE_VM_10142": "VM[uuid:%s]에 L3 네트워크[uuid:%s]에 연결된 네트워크 인터페이스가 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10080": "loadBalancer[%s] listener[%s]는 유휴 시간 초과 및 쿠키 이름 할당을 지원하지 않습니다. 세션 지속성이 지정되어야 합니다.", + "ORG_ZSTACK_COMPUTE_VM_10140": "IP 주소 [%s]가 이미 vmNic에 할당되어 있습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10085": "소스 기반 부하 분산 알고리즘인 경우 loadBalancer[%s] listener[%s]는 세션 지속성 정책 할당을 지원하지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10086": "loadBalancer[%s]는 listener[%s]에 iphash를 사용한 세션 지속성 할당을 지원하지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10083": "재작성 모드를 지정하지 않으면 loadBalancer[%s] listener[%s]는 세션 지속성 유휴 시간 초과 할당을 지원하지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10084": "삽입 모드를 지정하지 않으면 loadBalancer[%s] listener[%s]는 쿠키Name으로 세션 지속성 할당을 지원하지 않습니다", + "ORG_ZSTACK_COMPUTE_VM_10149": "지원되지 않는 이미지 미디어 유형: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10087": "유효하지 않은 최대 연결[%s], 지정된 값이 %d의 상한 임계값을 초과합니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10088": "충돌 loadBalancerPort[%s], 다른 listener[uuid:%s]가 해당 포트를 사용 중입니다", + "ORG_ZSTACK_COMPUTE_VM_10147": "메모리 스냅샷이 있는 VM %s는 부트 볼륨 설정을 지원하지 않습니다", + "ORG_ZSTACK_COMPUTE_VM_10146": "volume[uuid:%s]는 virtual machine[uuid:%s]에 연결되어야 합니다", + "ORG_ZSTACK_COMPUTE_VM_10145": "이 인스턴스의 부트 볼륨은 공유 가능으로 구성될 수 없습니다.", + "ORG_ZSTACK_COMPUTE_VM_10144": "부트 순서 %%s에서 유효하지 않은 부트 장치 [%%s]", + "ORG_ZSTACK_VMWARE_10024": "데이터 저장소가 격리되기 전에 동기화할 수 없습니다", + "ORG_ZSTACK_VMWARE_10025": "vCenter[uuid:%s]에서 실행 중인 작업이 있습니다. 나중에 다시 시도하세요.", + "ORG_ZSTACK_VMWARE_10023": "vCenter에 연결 실패: %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10008": "컨트롤러[ip:%s]에 Virtual Network Identifier (VNI) 범위가 구성되지 않았으므로 SDN 컨트롤러를 초기화할 수 없습니다", + "ORG_ZSTACK_VMWARE_10020": "가상 머신 %s에 사용 가능한 VNC 포트가 없습니다", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10009": "SDN 컨트롤러[ip:%s]에서 VNI 범위 정보를 가져올 수 없습니다. 이유: %s", + "ORG_ZSTACK_VMWARE_10021": "vCenter %s에 대한 서비스 인스턴스를 가져오지 못함: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10092": "클라우드에서 로드 밸런서 리스너를 생성하지 못했습니다. TCP 프로토콜 리스너는 TCP 프록시 프로토콜 매개변수만 지원하기 때문입니다.", + "ORG_ZSTACK_MEVOCO_10006": "클라우드 컴퓨팅 환경에서 virtio-scsi volume[%s] multiQueues 설정에 대한 지원되지 않는 작업입니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10093": "클라우드에서 로드 밸런서 리스너를 생성할 수 없습니다. TCP 프록시 프로토콜 %s만 지원합니다.", + "ORG_ZSTACK_MEVOCO_10005": "루트 볼륨[%s]에 대해 다중 큐를 사용하도록 설정하는 작업이 지원되지 않습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10091": "HTTPS 프로토콜 리스너가 HTTP 버전 [h1, h2]만 지원하기 때문에 클라우드 컴퓨팅 리소스 생성에 실패했습니다. 요청의 호환성을 확인해 주세요.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10010": "H3C VCFC V2 컨트롤러에 H3C 테넌트 UUID가 필수 매개변수이므로 하드웨어 VXLAN 네트워크를 생성할 수 없습니다. 진행하려면 필요한 UUID를 제공해 주세요.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10096": "%s 유형의 로드 밸런서 리스너는 인증서가 필요하지 않습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10097": "로드 밸런서 리스너 [uuid:%s]가 이미 인증서[uuid:%s]를 보유하고 있습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10094": "[%s] 프로토콜의 리스너가 콘텐츠 압축을 지원하지 않아 클라우드에서 로드 밸런서 리스너를 생성하지 못했습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10095": "클라우드에서 로드 밸런서 리스너를 생성할 수 없습니다. 압축 알고리즘 [%s]만 지원됩니다.", + "ORG_ZSTACK_MEVOCO_10007": "공유 가능한 볼륨의 경우 지원되는 기본 스토리지 유형은 %s이며, 현재 유형은 %s입니다.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10015": "지정된 L2 네트워크 [uuid:%s]가 VXLAN 네트워크 풀 인스턴스가 아니므로 VNI 범위를 생성할 수 없습니다.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10016": "H3C 컨트롤러가 VNI를 VLAN ID로 사용하므로 VNI 범위 [%s-%s]를 생성할 수 없습니다. 범위는 1-4094 내에 있어야 합니다. VNI 값은 가상 네트워크 구현을 위한 VLAN ID 표준을 준수해야 합니다.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10017": "SDN 컨트롤러의 구성된 VNI 중 어느 것에도 포함되지 않으므로 VNI 범위 [%s-%s]를 생성할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10098": "인증서 [uuid:%s]가 로드 밸런서 리스너 [uuid:%s]와 연결되어 있지 않습니다.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10018": "SDN 컨트롤러 [uuid:%s]가 작동 중이 아니므로 IPv6 범위를 추가할 수 없습니다. 현재 상태: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10099": "healthCheck 대상 [%s] 오류, 'default'이거나 1~65535 사이의 포트 번호여야 합니다.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10011": "SDN 컨트롤러 관리 시스템에 지정된 테넌트가 존재하지 않아 하드웨어 VXLAN 네트워크를 생성할 수 없습니다. 테넌트 ID를 확인하고 클라우드 환경에 올바르게 구성되어 있는지 확인해 주세요.", + "ORG_ZSTACK_MEVOCO_10002": "null VolumeQoS에서 IOPS 모드를 찾을 수 없습니다.", + "ORG_ZSTACK_VMWARE_10017": "L2[UUID:%s]가 vCenter[UUID:%s] 클러스터[UUID:%s]에 속하지 않습니다.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10012": "SDN 컨트롤러 [ip:%s]가 응답하지 않아 VXLAN 네트워크를 생성할 수 없습니다.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10013": "SDN 컨트롤러 [IP:%s]에서 VXLAN 네트워크를 생성할 수 없습니다. 이유: %s", + "ORG_ZSTACK_MEVOCO_10000": "ZStack이 일시 중지되었으며 읽기 전용 작업 외의 모든 API 호출이 거부됩니다. 읽기 전용이 아닌 작업을 진행하려면 systemTags에 '%s'를 추가해 주세요.", + "ORG_ZSTACK_VMWARE_10015": "컴퓨티 클러스터 %s 내에서 호스트를 찾을 수 없습니다.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10014": "SDN 컨트롤러 [IP:%s]에서 VXLAN 네트워크를 삭제할 수 없습니다. 이유: %s", + "ORG_ZSTACK_VMWARE_10016": "vSwitch/dvSwitch를 찾을 수 없음: %s, 또는 다른 ESX 호스트의 vSwitch가 동일한 포트 그룹을 가지고 있지 않습니다.", + "ORG_ZSTACK_VMWARE_10013": "NIC 드라이버 %s는 아직 지원되지 않습니다.", + "ORG_ZSTACK_VMWARE_10014": "클러스터[uuid:%s]와 레이어 2 네트워크[uuid:%s]가 서로 다른 데이터 센터에 속합니다.", + "ORG_ZSTACK_VMWARE_10011": "도메인 이름[%s]이 유효한 DNS 호스트 이름 또는 IP 주소가 아닙니다.", + "ORG_ZSTACK_VMWARE_10012": "vCenter [Domain Name:%s]가 추가되었습니다.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10019": "SDN 컨트롤러 [uuid:%s]가 연결되어 있지 않아 네트워크 CIDR로 IPv6 범위를 추가할 수 없습니다. 현재 상태: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10000": "이 요청에 사용 가능한 베어메탈 게이트웨이를 찾을 수 없습니다. 베어메탈 노드가 클라우드 컴퓨팅 환경에 제대로 구성 및 등록되어 있는지 확인해 주세요.", + "ORG_ZSTACK_VMWARE_10010": "vCenter 로그인 사용자명이 필요합니다.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10002": "BareMetal2 게이트웨이 리소스를 할당하지 못했습니다", + "ORG_ZSTACK_CORE_DEBUG_10000": "작업 정보(%s)가 컴퓨팅 클라우드 환경에서 찾을 수 없습니다. 모든 필요한 작업 세부 정보가 올바르게 구성 및 업로드되었는지 확인하세요.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10020": "SDN 컨트롤러[uuid:%s]가 연결되지 않아 IP 범위를 추가할 수 없습니다. 현재 상태: %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10021": "SDN 컨트롤러[uuid:%s]가 연결되지 않아 네트워크 CIDR로 IP 범위를 추가할 수 없습니다. 현재 상태: %s", + "ORG_ZSTACK_MEVOCO_10014": "잘못된 네트워크 대역폭[%s]입니다. 숫자 값이 아닙니다", + "ORG_ZSTACK_MEVOCO_10019": "잘못된 볼륨 대역폭[%s]입니다. 1024 Mbps 이상이어야 합니다", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10028": "SDN 컨트롤러[ip:%s]가 응답하지 않아 테넌트를 가져올 수 없습니다", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10029": "컨트롤러[ip:%s]에 기본 테넌트가 구성되어 있지 않아 SDN 컨트롤러를 초기화할 수 없습니다", + "ORG_ZSTACK_VMWARE_10009": "ESX 호스트[ESXi Version:%s]의 가상 머신[UUID:%s]은 콘솔 비밀번호를 지원하지 않습니다", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10022": "H3C VCFC V2 SDN 컨트롤러는 레이어 3 네트워킹을 지원하지 않아 레이어 3 네트워크를 생성할 수 없습니다[type:%s, category:%s]", + "ORG_ZSTACK_MEVOCO_10013": "잘못된 네트워크 대역폭[%s]입니다. %d Mbps 이상이어야 합니다", + "ORG_ZSTACK_VMWARE_10006": "VM[%s] 루트 디스크 사용량 통계를 가져오지 못했습니다", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10023": "하드웨어 VXLAN 네트워크를 생성할 수 없습니다. H3C VCFC V2 컨트롤러에는 테넌트 UUID가 필수 매개변수입니다. 제공되었는지 확인하세요.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10024": "H3C VCFC V1 컨트롤러에는 VDS UUID 시스템 태그가 필요하므로 H3C VCFC 컨트롤러를 추가할 수 없습니다", + "ORG_ZSTACK_VMWARE_10005": "설치 경로에서 VM 인스턴스를 가져오지 못했습니다: %s", + "ORG_ZSTACK_VMWARE_10002": "가상 데이터 센터를 찾을 수 없습니다", + "ORG_ZSTACK_VMWARE_10000": "가상 디스크 관리 서비스를 찾을 수 없습니다", + "ORG_ZSTACK_VMWARE_10001": "클라우드 저장소 작업을 위한 파일 관리자가 구성되지 않았습니다. %s 작업을 처리하기 위해 유효한 파일 관리자가 설정되었는지 확인하세요.", + "ORG_ZSTACK_VPC_HA_VYOS_10000": "가상 라우터[uuid:%s]에서 HA를 활성화하지 못했습니다, %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10011": "NFV 인스턴스[uuid:%s]가 %s 상태로 있어 %s에 HTTP 호출을 수행할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10010": "NFV 인스턴트[name:%s, UUID:%s, 현재 상태:%s]가 실행 중이 아니므로 필요한 작업을 수행할 수 없습니다. 인스턴스가 실행되면 다시 시도하세요.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10013": "NFV 인스턴스[uuid:%s ip:%s]에 네트워크 인터페이스[ip:%s, mac:%s]을 추가할 수 없습니다.原因是 %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10012": "NFV 인스턴스[uuid:%s]가 %s에 HTTP 호출을 수행할 수 있는 관리 네트워크 인터페이스가 없습니다", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10004": "SDN 컨트롤러[ip:%s]의 기본 노드를 확인할 수 없습니다. 이유는 %s입니다", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10005": "컨트롤러[IP:%s]가 응답하지 않아 SDN 컨트롤러 인증을 수행할 수 없습니다", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_10000": "관리 노드 재시작으로 인해 VM[uuid:%s] 저장소 마이그레이션 장기 실행 작업[uuid:%s]이 실패했습니다", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10006": "SDN 컨트롤러[IP:%s]를 인증할 수 없습니다. 이유는 %s입니다", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10007": "SDN 컨트롤러[ip:%s]가 응답하지 않아 VNI 범위 정보를 가져올 수 없습니다", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10000": "SDN 컨트롤러에서 서브넷 생성에 실패하여 IP 범위를 추가할 수 없습니다. 네트워크 구성을 확인하거나 지원팀에 문의하세요.", + "ORG_ZSTACK_COMPUTE_VM_10103": "L3 네트워크로 변경할 수 없습니다. L3 네트워크 [uuid:%s]는 시스템 네트워크이며 VM은 사용자 VM입니다.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10015": "흐름 데이터 매개변수에서 VMInstanceSpec을 찾을 수 없습니다. 필요한 모든 사양이 포함되어 있는지 확인하세요.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10001": "%s 때문에 네트워크에 IP 범위를 추가할 수 없습니다.", + "ORG_ZSTACK_COMPUTE_VM_10102": "L3 네트워크로 전환할 수 없습니다. UUID [uuid:%s]의 L3 네트워크가 비활성화되어 있습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10014": "[UUID:%s] 이미지는 NFV 인스턴스 그룹 [UUID:%s]에서 사용 중이므로 삭제할 수 없습니다.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10002": "%s 때문에 레이어 3 네트워크에서 IP 범위를 삭제할 수 없습니다.", + "ORG_ZSTACK_COMPUTE_VM_10101": "비게스트 L3 네트워크로 전환할 수 없습니다. UUID [uuid:%s]의 L3 네트워크는 이미 VM [uuid: %s]과 연결되어 있습니다.", + "ORG_ZSTACK_COMPUTE_VM_10100": "L3 네트워크로 변경할 수 없습니다. UUID [uuid:%s]의 L3 네트워크는 이미 VM UUID [%s]에 연결되어 있습니다.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10003": "SDN 컨트롤러 [IP:%s]가 응답하지 않아 클러스터 리더를 확인할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10016": "VM 인스턴스 사양에서 VM 인벤토리 또는 UUID가 null입니다.", + "ORG_ZSTACK_PORTMIRROR_10008": "PortMirror 서비스는 하이퍼바이저 유형으로 인해 NIC [%s]를 지원하지 않습니다.", + "ORG_ZSTACK_PORTMIRROR_10009": "PortMirror 서비스는 VM의 기본이 아닌 인터페이스가 아닌 NIC [%s]에 미러링할 수 없습니다.", + "ORG_ZSTACK_ZWATCH_API_10019": "쿼리 지속 시간은 %s을 초과할 수 없습니다.", + "ORG_ZSTACK_COMPUTE_VM_10198": "공유 가능한 볼륨에서 VM 인스턴스를 생성할 수 없습니다. 볼륨이 공유 가능으로 설정되어 있지 않은지 확인하고 다시 시도하세요.", + "ORG_ZSTACK_PORTMIRROR_10000": "잘못된 매개변수 [%s], 유효한 Port Mirroring Network를 참조하는지 확인하세요.", + "ORG_ZSTACK_COMPUTE_VM_10197": "다음 속성 중 하나를 설정해야 합니다: %s", + "ORG_ZSTACK_PORTMIRROR_10001": "네트워크[%s]가 Port Mirroring 서비스와 연결되어 있습니다.", + "ORG_ZSTACK_ZWATCH_API_10028": "계정[uuid: %s]에 자원[uuid: %s]에 대한 권한이 없습니다.", + "ORG_ZSTACK_COMPUTE_VM_10196": "다음 속성을 동시에 구성할 수 없습니다: %s", + "ORG_ZSTACK_PORTMIRROR_10002": "Port Mirroring 서비스[%s]가 생성되지 않았습니다.", + "ORG_ZSTACK_PORTMIRROR_10003": "NIC [%(device_id)s, %(network_interface_id)s]가 서비스 [%(service_id)s]에 의해 미러링되었습니다.", + "ORG_ZSTACK_COMPUTE_VM_10194": "인스턴스에 다음 중 하나를 지정해야 합니다: 메시지의 아키텍처 또는 이미지[uuid:%s]", + "ORG_ZSTACK_PORTMIRROR_10004": "NIC[%s]를 사용하여 서비스[%s]에 미러링할 수 없습니다.", + "ORG_ZSTACK_ZWATCH_API_10025": "잘못된 레이블[%s], 클라우드 리소스에 대한 유효한 쿼리 가능 레이블은 %s입니다.", + "ORG_ZSTACK_COMPUTE_VM_10193": "게스트 운영 체제에 다음 중 하나를 지정해야 합니다: 메시지의 guestOsType 필드 또는 이미지[uuid:%s].", + "ORG_ZSTACK_ZWATCH_API_10024": "메트릭[%s]에 필터[%s]가 없습니다.", + "ORG_ZSTACK_COMPUTE_VM_10192": "메시지 또는 이미지 [uuid:%s]에 다음 중 하나를 지정해야 합니다: platform 또는 imageID.", + "ORG_ZSTACK_PORTMIRROR_10007": "PortMirror 서비스가 NIC[%s] 미러링을 지원하지 않습니다.", + "ORG_ZSTACK_ZWATCH_API_10021": "네임스페이스[%s]에서 메트릭[%s]을 찾을 수 없습니다.", + "ORG_ZSTACK_COMPUTE_VM_10199": "연결된 볼륨에서 VM 인스턴스를 생성할 수 없습니다. 볼륨이 사용 가능한 상태인지 확인하고 다시 시도하세요.", + "ORG_ZSTACK_PORTMIRROR_10011": "PortMirror 서비스가 미러 네트워크[%s]가 유효하지 않기 때문에 nic[%s]에서 nic[%s](으)로 미러 터널을 설정할 수 없습니다.", + "ORG_ZSTACK_PORTMIRROR_10012": "PortMirror 서비스가 네트워크 인터페이스[%s]를 그 자체로 미러링할 수 없습니다.", + "ORG_ZSTACK_ZWATCH_API_10039": "라벨의 JSON 형식이 유효하지 않습니다. labelsJsonStr이 올바르게 포맷되었는지 확인하세요.", + "ORG_ZSTACK_PORTMIRROR_10013": "PortMirror 서비스가 서비스 품질(QoS)이 구성된 네트워크 인터페이스와 호환되지 않습니다.", + "ORG_ZSTACK_ZWATCH_API_10038": "네임스페이스[%%s]에 메트릭[%%s](이)가 없습니다.", + "ORG_ZSTACK_PORTMIRROR_10014": "하이퍼바이저에서 포트 미러 세션[%s]을(를) 삭제하지 못했습니다, 세부 정보: %s.", + "ORG_ZSTACK_ZWATCH_API_10037": "시스템에 정의된 네임스페이스가 없습니다.", + "ORG_ZSTACK_PORTMIRROR_10015": "하이퍼바이저에서 포트 미러 세션[%s]을(를) 해제하지 못했습니다, 세부 정보: %s.", + "ORG_ZSTACK_ZWATCH_API_10036": "URL 형식이 유효하지 않습니다. http(s)로 시작해야 합니다.", + "ORG_ZSTACK_PORTMIRROR_10016": "세션[uuid:%s]의 내부 ID를 찾을 수 없습니다. 호스트에서 세션 제한이 초과되었습니까???", + "ORG_ZSTACK_ZWATCH_API_10033": "종료 시간[%s, %sms]은(는) 시작 시간[%s, %sms]보다 앞서 있을 수 없습니다.", + "ORG_ZSTACK_ZWATCH_API_10032": "메트릭[%s]의 라벨에 [%s](이)가 포함되지 않습니다.", + "ORG_ZSTACK_ZWATCH_API_10031": "네임스페이스[%s]을(를) 찾을 수 없습니다.", + "ORG_ZSTACK_ZWATCH_API_10030": "네임스페이스가 all로 설정된 경우, 메트릭과 라벨 지정은 지원되지 않습니다.", + "ORG_ZSTACK_PORTMIRROR_10010": "PortMirror 서비스가 VM의 인터페이스가 아닌 NIC [%s]을(를) 미러링할 수 없습니다.", + "ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10009": "호스트[uuid:%s]에서 PCI 장치 정보를 가져오지 못했습니다.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10030": "통신 문제로 인해 SDN 컨트롤러[ip:%s]에서 기본 테넌트를 검색할 수 없습니다.", + "ORG_ZSTACK_ZWATCH_API_10046": "시간 간격이 %d일을 초과합니다.", + "ORG_ZSTACK_ZWATCH_API_10045": "종료 시간[%s]은(는) 시작 시간[%s]보다 앞서 있을 수 없습니다.", + "ORG_ZSTACK_ZWATCH_API_10044": "인스턴스[%s]가 유효하지 않습니다.", + "ORG_ZSTACK_ZWATCH_API_10043": "ECS 인스턴스 경고 승인 레코드가 존재하지 않습니다.", + "ORG_ZSTACK_ZWATCH_API_10042": "시작 시간[%s]이(가) 종료 시간[%s]보다 늦습니다.", + "ORG_ZSTACK_ZWATCH_API_10041": "플랫폼[url=%s]이(가) 이미 존재합니다.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10033": "SDN 컨트롤러[ip:%s]가 응답하지 않아 VXLAN 네트워크를 삭제할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10004": "작업 오류, VIP %s이(가) VM 인스턴스에 바인딩되지 않았습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10000": "포트 포워딩 규칙 생성 실패[vip IP: %s, private IP: %s, vip 시작 포트: %d, vip 종료 포트: %d, private 시작 포트: %d, private 종료 포트: %d], 이유: %s.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10001": "포트 포워딩 규칙 %s을(를) 해지하지 못했습니다, 이유: %s.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10002": "가상 라우터[name: %s, uuid: %s]에서 제공하는 포트 포워딩 규칙 동기화 실패, 이유: %s.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10003": "영역[uuid:%s]의 L3 네트워크[uuid:%s]에 대한 가상 라우터 제공자[uuid:%s]를 찾았습니다. 그러나 네트워크의 공개 네트워크[uuid:%s]가 포트 포워딩 규칙[uuid:%s]과(와) 일치하지 않습니다. 시스템 태그 guestL3Network::l3NetworkUuid를 사용하여 특정 가상 라우터 제공자를 지정해야 할 수 있습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10004": "가상 라우터가 포트 포워딩 범위 리다이렉션을 지원하지 않습니다. VIP 포트 시작은 private 포트 시작과 같아야 하고 VIP 포트 종료는 private 포트 종료와 같아야 합니다. 그러나 이 규칙의 범위가 일치하지 않습니다: VIP 포트[%s, %s], private 포트[%s, %s].", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10005": "가상 라우터[uuid:%s]에 포트 포워딩을 추가하지 못했습니다, %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10006": "가상 라우터[uuid:%s]의 포트 포워딩을 취소하지 못했습니다, 오류: %s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10003": "보조 스토리지 장치를 생성 취소하지 못했습니다: %s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10004": "호스트[UUID:%s]에서 MTTY 장치 정보를 가져오지 못했습니다", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10001": "수량이 초과되었습니다. 장치[uuid: %s]가 허용된 수량[%d]을 초과하는 SE 장치 수를 필요로 합니다.", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10002": "스토리지 장치를 생성하지 못했습니다: %s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10000": "지정된 부품 번호[value:%s]는 이 클라우드 환경에서 유효한 인스턴스 ID가 아닙니다.", + "ORG_ZSTACK_CORE_CLOUDBUS_10021": "메시지가 올바른 JSON 형식이 아닙니다, %s", + "ORG_ZSTACK_COMPUTE_VDPA_10009": "%s만 vdpa 가속 기술을 지원합니다", + "ORG_ZSTACK_COMPUTE_VDPA_10007": "PCI 장치[uuid:%s]를 생성할 수 없습니다. 다른 L2 인스턴스[uuid:%s]가 클러스터에 연결된 물리적 네트워크 인터페이스를 사용 중입니다", + "ORG_ZSTACK_COMPUTE_VDPA_10006": "PCI 장치[uuid:%s]를 생성 취소할 수 없습니다. 다른 L2 인스턴스[uuid:%s]가 클러스터에 연결된 물리적 네트워크 인터페이스를 사용 중입니다", + "ORG_ZSTACK_COMPUTE_VDPA_10005": "KVM 호스트[uuid:%s]에서 l2Network[uuid:%s, type:%s]의 브리지[%s]를 삭제하지 못했습니다, %s로 인해", + "ORG_ZSTACK_COMPUTE_VDPA_10004": "KVM 호스트[uuid: %s]에서 l2NoVlanNetwork[uuid:%s, name:%s]의 브리지[%s]를 확인하지 못했습니다, %s", + "ORG_ZSTACK_COMPUTE_VDPA_10003": "KVM 호스트[uuid:%s]에서 l2Network[uuid:%s, type:%s]의 브리지[%s]를 생성하지 못했습니다, %s로 인해", + "ORG_ZSTACK_COMPUTE_VDPA_10002": "대상 호스트[uuid:%s]에서 vm[uuid:%s]의 vdpa 복원", + "ORG_ZSTACK_COMPUTE_VDPA_10001": "대상 호스트[uuid:%s]에서 vm[uuid:%s]의 vdpa 장치 해제", + "ORG_ZSTACK_COMPUTE_VM_10152": "VM[uuid:%s]이 여러 ISO에 연결되어 있습니다. 분리时请指定 isoUuid", + "ORG_ZSTACK_COMPUTE_VM_10151": "VM[uuid:%s]이 ISO CD-ROM[uuid:%s]을 마운트했습니다", + "ORG_ZSTACK_COMPUTE_VM_10150": "UUID:%s의 virtualCDROM이 존재하지 않습니다", + "ORG_ZSTACK_COMPUTE_VM_10159": "레이어 3 네트워크를 연결할 수 없습니다. 레이어 3 네트워크 [uuid:%s]가 클러스터에 연결되지 않은 레이어 2 네트워크 [uuids:%s]에 속해 있습니다", + "ORG_ZSTACK_COMPUTE_VM_10158": "레이어 3 네트워크를 연결할 수 없습니다. 지정된 L3 네트워크 [uuid:%s]가 다른 레이어 2 네트워크 [uuids:%s]에 속해 있습니다", + "ORG_ZSTACK_COMPUTE_VM_10157": "레이어 3 네트워크를 연결할 수 없습니다. 지정된 레이어 3 네트워크 [uuid:%s]에 IP 범위가 정의되지 않았습니다", + "ORG_ZSTACK_COMPUTE_VM_10156": "레이어 3 네트워크를 연결할 수 없습니다. VM [uuid: %s]이 실행 중 또는 중지 상태가 아닙니다. 현재 상태는 %s입니다", + "ORG_ZSTACK_COMPUTE_VDPA_10015": "VM[uuid:%s]을(를) 위해 호스트[uuid:%s]에서 vDPA를 할당하지 못했습니다: %s", + "ORG_ZSTACK_COMPUTE_VDPA_10013": "VM[UUID:%s]을(를) 위해 호스트[UUID:%s]에서 vDPA를 삭제하지 못했습니다: %s", + "ORG_ZSTACK_COMPUTE_VDPA_10012": "호스트 [UUID:%s]의 L2 네트워크 [UUID:%s]이(가) SRIOV 가상화되지 않았습니다", + "ORG_ZSTACK_COMPUTE_VDPA_10011": "클러스터[uuid:%s]이(가) ovs-dpdk을(를) 지원하지 않습니다", + "ORG_ZSTACK_COMPUTE_VDPA_10010": "이미 다른 vSwitch 유형에서 사용 중인 물리적 인터페이스:[%s]로 vSwitch를 생성할 수 없습니다", + "ORG_ZSTACK_COMPUTE_VM_10163": "레이어 3 네트워크를 연결할 수 없습니다. UUID [uuid:%s]의 레이어 3 네트워크는 시스템 네트워크이지만 VM은 사용자 VM입니다", + "ORG_ZSTACK_COMPUTE_VM_10162": "레이어 3 네트워크를 연결할 수 없습니다. UUID [%s]의 레이어 3 네트워크가 비활성화되었습니다", + "ORG_ZSTACK_COMPUTE_VM_10186": "루트 디스크가 누락되었습니다. 인스턴스에 루트 볼륨이 연결되어 있는지 확인하십시오.", + "ORG_ZSTACK_COMPUTE_VM_10185": "데이터 디스크에 예상치 못한 구성입니다. dataDiskSizes에 지정된 크기는 0보다 커야 합니다.", + "ORG_ZSTACK_COMPUTE_VM_10182": "예상치 못한 루트 볼륨 설정", + "ORG_ZSTACK_COMPUTE_VM_10181": "이미지 미디어 유형이 ISO이지만 루트 디스크 설정이 누락되었습니다", + "ORG_ZSTACK_COMPUTE_VM_10180": "vm[uuid:%s]은(는) 상태가 Running 또는 Stopped일 때만 볼륨을 연결할 수 있습니다. 현재 상태는 %s입니다.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10003": "잘못된 날짜[%s], yyyy-MM-dd HH:mm:ss ZZZ 형식이어야 합니다", + "ORG_ZSTACK_ZWATCH_API_10010": "네임스페이스 이름은 %s와 같은 예약 키워드로 시작할 수 없습니다.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10002": "잘못된 의미[%s], 클라우드 환경에서 리소스 할당량 또는 메트릭을 지정하기 위한 허용된 의미", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10001": "매개변수에 대한 잘못된 값, %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10000": "리소스 한도에 지정된 값이 잘못되었습니다. 'at', 'after', 'exceed' 접미사 없이 숫자 값을 제공하십시오. 유효한 숫자를 입력하십시오.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10030": "PXE Server DHCP Interface %s가 존재하지 않거나 IP 주소가 없습니다.", + "ORG_ZSTACK_NETWORK_OVN_10012": "네트워크 인터페이스 [%s]에 IP 주소 [%s]가 있어 SDN 호스트를 추가할 수 없습니다.", + "ORG_ZSTACK_NETWORK_OVN_10011": "NIC[%s]가 SR-IOV 가상화 상태에 있어 SDN 호스트를 추가할 수 없습니다.", + "ORG_ZSTACK_NETWORK_OVN_10010": "NIC[%s]의 유형 [%s]이(가) Linux 본딩에 사용되어 SDN 호스트를 추가할 수 없습니다.", + "ORG_ZSTACK_NETWORK_OVN_10016": "SDN 호스트 추가에 실패했습니다. OVS DPDK는 KVM 호스트만 지원합니다.", + "ORG_ZSTACK_APIMEDIATOR_10000": "호스트 이름으로 식별된 동일한 호스트에 둘 이상의 백업 스토리지 인스턴스가 발견되었습니다. 백업 스토리지 [hostname:%s]이(가) 이미 존재합니다. 추가할 백업 스토리지 유형은 %s입니다.", + "ORG_ZSTACK_NETWORK_OVN_10015": "본드 모드[%s]가 OVN에서 지원되지 않아 SDN 호스트를 추가할 수 없습니다.", + "ORG_ZSTACK_NETWORK_OVN_10014": "NIC[%s]이(가) VXLAN VTEP 인터페이스에 사용되어 SDN 호스트를 추가할 수 없습니다.", + "ORG_ZSTACK_NETWORK_OVN_10013": "NIC[%s]이(가) L2 네트워크[name:%s]에 연결되어 있어 SDN 호스트를 추가할 수 없습니다.", + "ORG_ZSTACK_APIMEDIATOR_10001": "호스트 이름으로 식별된 동일한 호스트에서 둘 이상의 백업 스토리지 서비스가 실행 중입니다. 이미지 스토어 백업 스토리지 서비스 [hostname:%s]이(가) 존재합니다. 추가할 백업 스토리지 유형은 %s입니다.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10031": "%s ~ %s은(는) DHCP 인터페이스 %s에 연결할 수 없습니다.", + "ORG_ZSTACK_NETWORK_OVN_10019": "UUID [%s]를 가진 호스트가 클러스터 UUID [%s]에서 hugepages를 활성화하지 않았으므로 SDN 컨트롤러에 추가할 수 없습니다.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10032": "cluster[uuid:%s]와 pxeserver[uuid:%s]이(가) 동일한 영역에 있지 않습니다.", + "ORG_ZSTACK_NETWORK_OVN_10018": "네트워크 마스크가 지정되지 않아 SDN 호스트를 추가할 수 없습니다.%s", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10033": "cluster[uuid:%s]은(는) 베어메탈 클러스터가 아닙니다.", + "ORG_ZSTACK_NETWORK_OVN_10017": "VTEP IP가 구성되지 않아 SDN 호스트를 추가할 수 없습니다.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10034": "베어메탈 PXE 서버 [uuid:%s]이(가) 이미 클러스터 [uuid:%s]에 연결되어 있습니다.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10035": "베어메탈 PXE 서버 [UUID: %s]이(가) 클러스터 [UUID: %s]의 베어메탈 인스턴스와 호환되지 않습니다. 기존 NIC IP %s이(가) PXE 서버의 DHCP 범위(%s ~ %s) 밖에 있습니다.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10036": "베어메탈 PXE 서버 [UUID: %s]이(가) 클러스터 [UUID: %s]과(와) 연결되어 있지 않습니다.", + "ORG_ZSTACK_STORAGE_MIGRATION_10030": "대상 기본 스토리지가 소스 클러스터와 동일한 레벨 2 네트워크를 공유하는 클러스터에 연결되어 있지 않습니다.", + "ORG_ZSTACK_STORAGE_MIGRATION_10033": "공유 볼륨[uuid: %s, name: %s]이 연결되어 있는 동안에는 스토리지 마이그레이션을 지원하지 않습니다", + "ORG_ZSTACK_STORAGE_MIGRATION_10034": "", + "ORG_ZSTACK_STORAGE_MIGRATION_10031": "소스 인스턴스에서 대상 인스턴스로 볼륨을 마이그레이션할 수 없습니다", + "ORG_ZSTACK_STORAGE_MIGRATION_10032": "", + "ORG_ZSTACK_STORAGE_MIGRATION_10035": "볼륨[UUID:%s]이(가) VM[UUID:%s]에 여전히 연결되어 있습니다. 마이그레이션 전에 연결을 해제하세요", + "ORG_ZSTACK_STORAGE_MIGRATION_10036": "", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10019": "가상 머신[vmuuid:%s]이(가) 중지되지 않은 경우 공유 블록 기본 스토리지 간에 데이터 볼륨[uuid:%s]을(를) 마이그레이션할 수 없습니다", + "ORG_ZSTACK_NETWORK_OVN_10023": "", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10028": "볼륨[%s]의 상태가 비활성화되어 있어 마이그레이션할 수 없습니다", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10016": "", + "ORG_ZSTACK_NETWORK_OVN_10022": "블록 기반 라이브 마이그레이션을 위한 사용 가능한 호스트가 없습니다: %s", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10029": "", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10015": "UUID:%s(으)로 SNSTextTemplate을(를) 찾을 수 없습니다. 클라우드 스토리지에서 삭제되었거나 제거되었을 수 있습니다", + "ORG_ZSTACK_NETWORK_OVN_10021": "", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10018": "가상 머신과 연결된 호스트[uuid:%s]가 SDN 컨트롤러[uuid:%s]에 연결되어 있지 않아 vmnic을 l3network[uuid:%s](으)로 수정할 수 없습니다", + "ORG_ZSTACK_NETWORK_OVN_10020": "", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10017": "%s에 대한 연결을Establish할 수 없습니다. ZStack 관리 노드와 베어메탈 PXE 서버 간의 네트워크 구성을 확인하세요", + "ORG_ZSTACK_NETWORK_OVN_10026": "", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10011": "애플리케이션 플랫폼/엔드포인트[%s]는 사용자 정의 템플릿을 지원하지 않습니다", + "ORG_ZSTACK_NETWORK_OVN_10025": "", + "ORG_ZSTACK_NETWORK_OVN_10024": "SDN 컨트롤러[UUID:%s]을(를) 찾을 수 없어 VMNIC을 L3 네트워크[UUID:%s](으)로 수정할 수 없습니다", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10020": "", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10010": "%s의 /opt/zstack-dvd 아래에 로컬 리포지토리가 없습니다. 먼저 zStack ISO를 다운로드하고 로컬 리포지토리를 생성하세요", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10023": "", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10024": "지원되지 않는 애플리케이션 플랫폼 유형[%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10025": "", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10026": "VM의 호스트[uuid:%s]가 SDN 컨트롤러[uuid:%s]에 연결되어 있지 않아 L3 네트워크를 VM에 연결할 수 없습니다", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10027": "", + "ORG_ZSTACK_STORAGE_MIGRATION_10022": "주제[uuid:%s]를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_MIGRATION_10023": "", + "ORG_ZSTACK_STORAGE_MIGRATION_10020": "소스 블록 스토리지와 대상 블록 스토리지는 비활성화 상태가 아니어야 합니다.", + "ORG_ZSTACK_STORAGE_MIGRATION_10021": "이미지[uuid:%s]가 준비 상태가 아니므로 마이그레이션할 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10001": "호스트 %s의 하트비트가 수신되지 않았습니다", + "ORG_ZSTACK_STORAGE_MIGRATION_10026": "볼륨[uuid:%s]이 준비 상태가 아니므로 마이그레이션할 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10000": "호스트 UUID[%s] 및 기본 스토리지 UUID[%s]에 대한 호스트 ID를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_MIGRATION_10027": "가상 머신 인스턴스가 정지 상태가 아닌 경우 루트 볼륨을 마이그레이션할 수 없습니다. 루트 볼륨을 마이그레이션하기 전에 인스턴스가 정지되어 있는지 확인하세요.", + "ORG_ZSTACK_STORAGE_MIGRATION_10024": "볼륨[uuid:%s]이 이미 풀[uuid:%s]에 있으므로 마이그레이션할 수 없습니다.", + "ORG_ZSTACK_STORAGE_MIGRATION_10025": "소스 및 대상 PowerShell 세션은 비활성화 또는 유지보수 상태가 아니어야 합니다.", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10009": "알리바바 클라우드 SMS 서명의 길이는 2에서 12자 사이여야 합니다. 서명: [%s]이(가) [%d]자입니다.", + "ORG_ZSTACK_STORAGE_MIGRATION_10028": "공유 볼륨이 연결된 VM[uuid:%s, 이름: %s]의 VM 스토리지 마이그레이션은 지원되지 않습니다.", + "ORG_ZSTACK_STORAGE_MIGRATION_10029": "데이터 볼륨이 연결된 VM 인스턴스의 루트 볼륨을 마이그레이션할 수 없습니다. 루트 볼륨을 마이그레이션하기 전에 모든 데이터 볼륨을 분리하세요.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10017": "이미지[uuid:%s]의 베어메탈 캐시 마운트 실패", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10019": "이미지[uuid:%s]를 위한 베어메탈 이미지 캐시에 남은 공간이 부족합니다", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10011": "PXE 서버[uuid:%s]에서 섀시[uuid:%s]의 DHCP 구성 생성 실패", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10012": "PXE 서버[uuid:%s]에서 섀시[uuid:%s]의 DHCP 구성 삭제 실패", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10013": "베어메탈 PXE 서버 에이전트의 UUID가 변경되었습니다 [예상: %s, 실제: %s]. 이는 에이전트의 수동 재시작으로 인한 것일 수 있습니다. 상태를 동기화하려면 다시 연결하세요.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10005": "대시보드에서 디렉토리를 찾을 수 없습니다: %s", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10016": "베어메탈 PXE 서버[url:%s]에 연결할 수 없습니다. 이유: %s", + "ORG_ZSTACK_LICENSE_10002": "클라우드 리소스 할당에 제공된 라이선스 요청 코드 %s가 잘못되었습니다. 확인하고 다시 시도하세요.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10003": "다음으로 인해 sqlite3 실행 실패: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10000": "지원되지 않는 방법: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10001": "HTTP 요청 오류! 상태 코드: %s, 오류: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10011": "연결된 Ceph 백업 스토리지는 ISO 기반 스토리지 마이그레이션을 지원하지 않습니다.", + "ORG_ZSTACK_STORAGE_MIGRATION_10015": "[%s]에서 [%s] 가상 환경으로의 스토리지 마이그레이션을 지원하지 않습니다", + "ORG_ZSTACK_STORAGE_MIGRATION_10016": "VM[uuid:%s]이(가) 실행 중이지만 호스트 UUID가 누락되었습니다", + "ORG_ZSTACK_STORAGE_MIGRATION_10013": "[%s]에서 [%s](으)로 데이터 볼륨이 있는 스토리지 마이그레이션을 지원하지 않습니다", + "ORG_ZSTACK_STORAGE_MIGRATION_10014": "[%s]에서 [%s](으)로 스냅샷을 사용한 스토리지 마이그레이션을 지원하지 않습니다", + "ORG_ZSTACK_STORAGE_MIGRATION_10019": "소스 BS와 대상 BS는 동일할 수 없습니다.", + "ORG_ZSTACK_STORAGE_MIGRATION_10017": "dataVolumes 매개변수를 사용한 데이터 볼륨 라이브 스토리지 마이그레이션만 지원됩니다.", + "ORG_ZSTACK_STORAGE_MIGRATION_10018": "루트 볼륨이 아닌 볼륨의 [%s]에서 [%s](으)로의 라이브 스토리지 마이그레이션을 지원하지 않습니다", + "ORG_ZSTACK_NETWORK_OVN_10001": "VM NIC를 보안 그룹에 추가할 수 없습니다. VM NIC SDN [uuid:%s]이(가) 보안 그룹 SDN [uuid:%s]과(와) 일치하지 않습니다.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10006": "baremetal pxeserver[uuid:%s]에서 bm 인스턴스 nginx 프록시를 생성하지 못했습니다.", + "ORG_ZSTACK_NETWORK_OVN_10000": "L3 네트워크를 보안 그룹에 연결할 수 없습니다. L3 네트워크 SDN [uuid:%s]이(가) 보안 그룹 SDN [uuid:%s]과(와) 일치하지 않습니다.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10007": "baremetal pxeserver[uuid:%s]에서 bm 인스턴스 nginx 프록시를 삭제하지 못했습니다.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10008": "baremetal PXE 서버[uuid:%s]를 시작하지 못했습니다.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10009": "baremetal PXE 서버[uuid:%s]를 중지하지 못했습니다.", + "ORG_ZSTACK_NETWORK_OVN_10005": "OVS 컨트롤러[uuid:%s, type: %s]를 찾을 수 없어 보안 그룹을 생성할 수 없습니다.", + "ORG_ZSTACK_NETWORK_OVN_10004": "OVN 컨트롤러가 지정되어 있어 보안 그룹을 생성할 수 없습니다. 보안 그룹 생성 시 OVN 컨트롤러를 지정하지 않았는지 확인하세요.", + "ORG_ZSTACK_NETWORK_OVN_10003": "호스트에서 %d개의 OVN 컨트롤러 인스턴스가 실행 중이므로 호스트를 삭제할 수 없습니다.", + "ORG_ZSTACK_NETWORK_OVN_10002": "OVN이 L3 타입: %s, 카테고리: %s을(를) 지원하지 않아 레이어 3 네트워크를 생성할 수 없습니다.", + "ORG_ZSTACK_NETWORK_OVN_10009": "네트워크 인터페이스 [%s]를 찾을 수 없어 SDN 호스트를 추가할 수 없습니다.", + "ORG_ZSTACK_NETWORK_OVN_10008": "SDN 컨트롤러 UUID가 누락되어 SDN L2 네트워크를 생성할 수 없습니다. SDN 컨트롤러 UUID가 올바르게 구성되어 있는지 확인하세요.", + "ORG_ZSTACK_NETWORK_OVN_10007": "네트워크 서비스[%s]를 OVS 네트워크에 연결할 수 없습니다.", + "ORG_ZSTACK_GUESTTOOLS_PVPANIC_10000": "유효한 소스 파일 경로 없이 가상 머신을 배포할 수 없습니다.", + "ORG_ZSTACK_NETWORK_OVN_10006": "vSwitchType[%s]이(가) 포함된 네트워크에 OVN 네트워크 서비스를 연결할 수 없습니다.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10001": "baremetal PXE 서버[uuid:%s]에서 구성을 초기화하지 못했습니다.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_MARKETPLACE_10000": "marketplace 서비스에서 적절한 필터링을 위해 filterName을 marketplace:true 또는 marketplace:false로 설정해야 합니다.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10002": "pxeserver[uuid:%s]에서 baremetal 인스턴스 구성을 생성하지 못했습니다.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10003": "pxeserver[uuid:%s]에서 baremetal 인스턴스 구성을 삭제하지 못했습니다.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10004": "baremetal PXE 서버[uuid:%s]에서 BM 인스턴스 NOVA 프록시를 생성하지 못했습니다.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10005": "baremetal pxeserver[uuid:%s]에서 bm 인스턴스 novnc 프록시를 삭제하지 못했습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_10005": "L3Network[uuid:%s]에 네트워크 서비스[type:%s]가 활성화되어 있지 않거나 이 네트워크 서비스를 제공하는 제공자가 없습니다.", + "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10000": "지원되지 않는 기능: SEND_SNS_MESSAGE", + "ORG_ZSTACK_NETWORK_SERVICE_10004": "네트워크 서비스[%s]를 가상 머신[uuid: %s]에 적용하지 못했습니다.", + "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10001": "플러그인 %s에서 SNS 알림을 보내지 못했습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_10007": "제공자[uuid:%s]에 대한 네트워크 서비스를 정의해야 합니다.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10021": "클러스터[uuid:%s]에서 baremetal2 프로비저닝 네트워크를 찾을 수 없습니다.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10020": "클러스터[uuid:%s]에서 사용 가능한 Baremetal2 게이트웨이를 찾을 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_10001": "L3Network [UUID: %s]에 호스트 라우트 서비스가 구성되어 있지 않습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_10000": "L3Network [UUID: %s]이(가) null 타입을 제공합니다.", + "ORG_ZSTACK_LICENSE_10019": "MINI VM 템플릿에 대해 예기치 않은 호스트 벤더", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10022": "baremetal2 프로비저닝 네트워크 [uuid:%s]가 사용 불가능합니다; 활성화되어 있는지 확인하세요.", + "ORG_ZSTACK_NETWORK_SERVICE_10009": "UUID [%s]의 네트워크 서비스 제공자가 %s에 대한 서비스를 제공하지 않습니다", + "ORG_ZSTACK_NETWORK_OVN_10052": "호스트 [uuid:%s]에 대한 NIC [%s]의 OVS 포트 삭제 실패, 오류: %s", + "ORG_ZSTACK_NETWORK_SERVICE_10008": "네트워크 서비스 제공자[uuid:%s]를 찾을 수 없거나 서비스를 제공하지 않습니다", + "ORG_ZSTACK_NETWORK_OVN_10051": "호스트 [UUID:%s]에서 NIC [%s]에 대한 OVS 포트 삭제 실패, 오류: %s", + "ORG_ZSTACK_NETWORK_OVN_10050": "호스트[uuid:%s]의 네트워크 인터페이스 [%s]와 OVS 포트 동기화 실패, 오류: %s", + "ORG_ZSTACK_NETWORK_OVN_10056": "노드 강제 종료 확인을 위한 클러스터 상태 쿼리 오류 %s", + "ORG_ZSTACK_NETWORK_OVN_10055": "OVN 컨트롤러[uuid:%s, ip:%s]에 대한 QoS 설정 동기화 실패, 오류: %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORK_10000": "대상 호스트 [uuid:%s]에서 가상 머신 [uuid:%s]에 대해 VXLAN 네트워크를 구성할 수 없습니다", + "ORG_ZSTACK_NETWORK_OVN_10054": "LSP[%s]에 대해 호스트[uuid:%s]에 OVS 포트 요청된 섀시 설정 실패, 오류: %s", + "ORG_ZSTACK_NETWORK_OVN_10053": "LSP[%s]에 대해 호스트[uuid:%s]에 OVS 포트 요청된 섀시 설정 실패, 오류: %s", + "ORG_ZSTACK_NETWORK_OVN_10059": "OVN 컨트롤러[uuid:%s, ip:%s]에 DHCP 옵션 추가 실패, 이유: %s", + "ORG_ZSTACK_NETWORK_OVN_10058": "에이전트에서 빈 클러스터 상태 결과 수신; 에이전트의 구성 및 연결성을 확인하세요.", + "ORG_ZSTACK_NETWORK_OVN_10057": "클러스터 상태 검색 실패: %s", + "ORG_ZSTACK_NETWORK_SERVICE_10010": "네트워크 서비스 [%s]가 Layer 3 네트워크 [UUID: %s]에 연결되었습니다.", + "ORG_ZSTACK_LICENSE_10023": "가상 머신 %s의 라이선스 삭제 실패 - 알 수 없는 오류입니다. 지원팀에 문의하세요.", + "ORG_ZSTACK_LICENSE_10003": "제공된 타임스탬프가 유효하지 않습니다. ISO 8601 표준(YYYY-MM-DDTHH:mm:ss)을 준수하는지 확인하세요.", + "ORG_ZSTACK_LICENSE_10004": "예상치 못한 디코딩된 라이선스 파일 길이: %d. 클라우드 컴퓨팅 서비스에 대해 유효한 길이가 필요합니다.", + "ORG_ZSTACK_LICENSE_10005": "디코딩 실패 이유: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10010": "baremetal2 클러스터[uuids:%s]에서 사용 가능한 물리적 서버 섀시를 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_10012": "networkServices는 비어 있을 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_10011": "L3 네트워크 [uuid:%s]에 DHCP 서비스를 연결할 때 할당할 IP 주소가 부족합니다.", + "ORG_ZSTACK_NETWORK_SERVICE_10014": "NetworkService Dhcp 백엔드를 찾을 수 없음 [프로바이더 유형: %s]", + "ORG_ZSTACK_NETWORK_OVN_10062": "OVN 컨트롤러[uuid:%s, ip:%s] ping 실패, 이유: %s", + "ORG_ZSTACK_NETWORK_OVN_10061": "OVN 컨트롤러[uuid:%s, ip:%s]에 명령을 전송할 수 없음, NfvInstanceGroup[uuid:%s, name:%s] 상태가 %s입니다, Healthy 또는 Degraded 그룹만 명령을 수락할 수 있습니다", + "ORG_ZSTACK_NETWORK_OVN_10060": "OVN 컨트롤러[uuid:%s]가 연결되어 있지 않음, 현재 상태: %s", + "ORG_ZSTACK_NETWORK_OVN_10067": "[%s]가 현재 환경에서 유효한 Virtual IP가 아닙니다. NFV Instance Group의 Virtual IP 주소를 사용하세요.", + "ORG_ZSTACK_NETWORK_OVN_10066": "가상 머신 [uuid:%s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_OVN_10064": "가상 머신 네트워크 인터페이스 [internalName:%s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_OVN_10069": "SDN 컨트롤러 ping 실패, 오류: %s", + "ORG_ZSTACK_NETWORK_OVN_10068": "IP [%s]가 어떤 OVN SDN Controller NFV 인스턴스 그룹과도 연결되지 않았습니다. OVN Controller NFV 인스턴스 그룹의 VIP 주소를 사용하세요.", + "ORG_ZSTACK_CORE_10000": "리소스 UUID[%s]에 대한 실행자를 찾을 수 없음", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10016": "bond 이름 %s이(가) 이미 존재함", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10018": "UUID [%s]의 baremetal2シャ이스를 찾을 수 없습니다. 존재하지 않을 수 있습니다.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10017": "MAC 주소의 NIC가 이미 bond됨", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10000": "공급자[%s]와(과) universal SMS 검증 실패", + "ORG_ZSTACK_LICENSE_10037": "", + "ORG_ZSTACK_LICENSE_10038": "관리 노드가 여러 개 존재하지만 %s에 대한 라이선스만 제공됩니다.", + "ORG_ZSTACK_LICENSE_10039": "MN HA 환경이지만 %s에 대한 업데이트된 라이선스만 있습니다.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10001": "호스트 [arch:%s]의 CPU 아키텍처와 클러스터 [arch:%s]가 일치하지 않음", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10000": "잘못된 baremetal2シャ시스 하드웨어 정보 형식: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10003": "잘못된 baremetal2シャ시스 NIC 하드웨어 정보 형식: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10002": "부트 모드 %s인 baremetal2シャ시스만 지원됩니다.", + "ORG_ZSTACK_NETWORK_OVN_10032": "NFV 인스턴스 [UUID:%s]에 대한 OVN 클러스터 노드 구성 실패: %s", + "ORG_ZSTACK_NETWORK_OVN_10031": "NfvInstanceGroup[uuid:%s]에서 인스턴스를 찾을 수 없음", + "ORG_ZSTACK_NETWORK_OVN_10038": "인스턴스를 찾을 수 없어 NfvInstance[uuid:%s] 분리 실패", + "ORG_ZSTACK_NETWORK_OVN_10035": "L2 네트워크 [UUID:%s]가 SDN 컨트롤러와 연결되지 않음", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10005": "잘못된 baremetal2シャ시스 디스크 하드웨어 정보 형식: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10004": "BareMetal2シャ시스에는Provision NIC가 반드시 하나만 연결되어야 합니다.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10006": "다른 컴퓨트 노드에서 중복 MAC 주소의 가상 머신이 감지되었습니다. 이 충돌을 해결하세요.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10009": "baremetal2 배포를 위한 사용 가능한 물리적 서버 리소스를 찾을 수 없습니다.%s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10008": "BareMetal2 Chassis[uuid:%s]이(가) 존재하지 않거나 비활성화되어 있습니다.", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10002": "잘못된 공급자[%s]", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10001": "클라우드 서비스 인스턴스 %s에 대한 universal SMS 검증 실패", + "ORG_ZSTACK_CORE_GC_10001": "완료된 가비지 컬렉션 작업을 트리거할 수 없습니다[uuid:%s, name:%s]", + "ORG_ZSTACK_LICENSE_10046": "지정된 경로에서 라이선스[uuid:%s, type:%s] 파일을 찾을 수 없음", + "ORG_ZSTACK_LICENSE_10028": "모듈 %s에 대한 라이선스 취소 실패", + "ORG_ZSTACK_LICENSE_10029": "UKey가 지원되지 않음 (아키텍처: %s)", + "ORG_ZSTACK_NETWORK_OVN_10041": "SDN 컨트롤러 [uuid:%s]를 찾을 수 없어 L3 네트워크를 보안 그룹에 연결할 수 없습니다", + "ORG_ZSTACK_NETWORK_OVN_10040": "NFVI 인스턴스 [UUID:%s] 분리를 위한 관리 IP를 찾을 수 없음", + "ORG_ZSTACK_NETWORK_OVN_10045": "호스트[uuid:%s]에서 Open vSwitch 서비스를 시작하지 못함, 오류: %s", + "ORG_ZSTACK_NETWORK_OVN_10043": "호스트[uuid:%s]에 OVS 패키지를 설치하지 못함, 오류: %s", + "ORG_ZSTACK_NETWORK_OVN_10042": "SDN 컨트롤러 [uuid:%s]가 연결되지 않음 [status:%s] 때문에 L3 네트워크를 보안 그룹에 연결할 수 없음", + "ORG_ZSTACK_NETWORK_OVN_10049": "네트워크 인터페이스 [%s]를 위해 호스트 [UUID:%s]에서 OVS 포트를 동기화하지 못함, 오류: %s", + "ORG_ZSTACK_NETWORK_OVN_10048": "NIC [%s]를 위해 호스트 [UUID:%s]에 OVS 포트를 추가하지 못함, 오류: %s", + "ORG_ZSTACK_NETWORK_OVN_10047": "NIC [%s]를 위해 호스트 [UUID:%s]에서 OVS 포트를 추가하지 못함, 오류: %s", + "ORG_ZSTACK_LICENSE_10030": "로컬 UKey 라이선스를 찾을 수 없거나 업데이트하지 못했습니다. UKey가 클라우드 컴퓨팅 서비스에 제대로 연결되고 라이선스가 부여되었는지 확인하세요.", + "ORG_ZSTACK_LICENSE_10031": "로컬 가상 머신 라이선스 업데이트: %s", + "ORG_ZSTACK_LICENSE_10032": "UKey를 업데이트할 수 있는 사용 가능한 컴퓨션 인스턴스가 없음", + "ORG_ZSTACK_GUESTTOOLS_KVM_10001": "가상 머신[uuid:%s]에서 게스트 도구를 분리하지 못함", + "ORG_ZSTACK_GUESTTOOLS_KVM_10000": "vm[uuid:%s]에서 게스트 도구 정보를 가져오지 못함, 이유:%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10033": "pci 장치 id[%s]가 태그[%s]에서 유효한 정수가 아님", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10034": "UUID [%s]를 가진 mdev 장치 명세가 존재하지 않음", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10031": "태그[%s]에서 PCI 장치 ID가 누락됨", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10032": "태그[%s]에서 PCI 장치 ID는 0보다 커야 함", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10030": "pci 장치 명세 [uuid:%s]가 존재하지 않음, 태그 [%s]에서 파생됨", + "ORG_ZSTACK_GUESTTOOLS_KVM_10006": "Prometheus에서 게스트 도구 상태를 가져오지 못함: [metric=%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10005": "VM[UUID:%s]에서 게스트 도구 ISO를 분리하지 못함, 이유:%s", + "ORG_ZSTACK_GUESTTOOLS_KVM_10004": "VM[UUID:%s]에 게스트 도구 ISO를 연결하지 못함, 이유:%s", + "ORG_ZSTACK_GUESTTOOLS_KVM_10003": "KVM 호스트 [uuid:%s]를 찾을 수 없어 게스트 도구 ISO를 다운로드하지 못함", + "ORG_ZSTACK_LICENSE_10048": "라이선스 만료: 클라우드 컴퓨팅 환경 라이선스가 만료되었습니다. 라이선스 갱신을 위해 지원팀에 문의하세요.", + "ORG_ZSTACK_LICENSE_10049": "지원되지 않음: 하드웨어 키에서 라이선스[%s] 삭제", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10024": "가상 머신[uuid:%s]에 사용 가능한 PCI 장치 명세가 없음", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10025": "PCI 장치 명세 [uuid:%s]가 가상 머신 [uuid:%s]에 사용할 수 없음", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10023": "VM[uuid:%s]에 사용 가능한 PCI 장치 명세를 가져오지 못함: %s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10020": "vm 인스턴스 [uuid:%s, state:%s]는 mdev 장치 명세 [uuid:%s]를 제거하기 위해 종료되어야 함", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10027": "볼륨[uuid:%s, installPath:%s]가 디렉토리 %s에 없음", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10026": "호스트[uuid:%s]가 스토리지 관리 정책[uuid:%s]과 다른 스토리지를 마운트했을 수 있습니다. 확인하세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10024": "호스트[uuid:%s]가 동일한 마운트 경로를 가지지만 실제로 다른 스토리지에 마운트되어 있습니다.", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10028": "mdev 디바이스 사양 [uuid:%s]가 가상 머신 [uuid:%s]에 사용할 수 없습니다", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10029": "태그[%s]에서 PCI 디바이스 사양 UUID가 누락되었습니다", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10026": "가상 머신[uuid:%s]에 사용 가능한 mdev 디바이스 사양이 없습니다", + "ORG_ZSTACK_LICENSE_10050": "하이브리드 플랫폼 라이선스가 이미 사용 중입니다. 하이브리드 라이선스 UUID[uuid=%s]로 DeleteLicenseAction을 사용하여 하이브리드 플랫폼 라이선스와 하이브리드 추가 기능 라이선스를 동시에 제거하십시오.", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10011": "vm[uuid:%s]에 PCI 디바이스 사양[uuid:%s]이 없습니다", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10012": "vm 인스턴스 [UUID: %s, state: %s]를 종료해야 PCI 디바이스 사양 [UUID: %s]을 제거할 수 있습니다", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10019": "vm[uuid:%s]에 mdev 디바이스 사양[uuid:%s]이 없습니다", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10017": "vm[uuid:%s]에 이미 mdev 디바이스 사양[uuid:%s]이 있습니다", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10018": "vm 인스턴스 [uuid:%s, state:%s]를 종료해야 mdev 디바이스 사양을 설정할 수 있습니다", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10015": "vm 인스턴스 [uuid:%s, state:%s]를 종료해야 PCI 디바이스 사양을 설정할 수 있습니다", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10009": "어피니티 그룹 [uuid:%s]을(를) 찾을 수 없습니다. 삭제되었거나 종료되었을 수 있습니다", + "ORG_ZSTACK_COMPUTE_VM_10309": "IP[%s]가 VPC 네트워크[uuid:%s]에서 사용할 수 없습니다. 이유: %s", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10006": "이 호스트 [uuid: %s]에 동일한 어피니티 그룹 [%s]에 속한 다른 가상 머신이 있습니다", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10005": "VM [uuid: %s]이(가) 이미 어피니티 그룹 [uuid: %s]에 할당되어 있습니다", + "ORG_ZSTACK_COMPUTE_VM_10307": "정적 IP 주소[%s] 형식 오류입니다", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10008": "vm [uuid:%s]이(가) 어피니티 그룹 [uuid:%s]의 조건을 충족하지 않습니다", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10007": "어피니티 그룹[uuid:%s]이(가) 가상 머신[uuid:%s]을(를) 위한 호스트[uuid:%s] 예약에 실패했습니다", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10003": "클러스터 UUID, 호스트 UUID, VM UUID는 동시에 하나만 지정할 수 있습니다", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10008": "vm[uuid:%s]에 이미 PCI 디바이스 사양[uuid:%s]이 있습니다", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10006": "PCI 디바이스 사양을 설정하려면 VM이 일시 정지 상태여야 합니다: uuid=%s, state=%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10007": "잘못된 PCI 디바이스 유형: %s, 클라우드 가상화 환경에 유효한 유형: %s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10004": "활성화된 컴퓨트 리소스를 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10001": "시스템 태그[%s]을(를) 삭제할 수 없습니다. 로드 밸런스 플러그인에 종속되어 있습니다. 업데이트만 할 수 있습니다.", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10002": "어피니티 그룹 [uuid: %s]이(가) 존재하지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10002": "UUID %s의 nic을(를) 찾을 수 없습니다. 로드 밸런스의 네트워크 태그 %s을(를) 수정하십시오.", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10001": "VM [uuid: %s]이(가) 이미 어피니티 그룹 [uuid: %s]에 연결되어 있습니다", + "ORG_ZSTACK_COMPUTE_VM_10303": "vm[%s] 우선순위를 [%s](으)로 변경 실패: %s", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10004": "클라우드 환경에서 활성화되지 않은 어피니티 그룹 [uuid: %s]에 대해 작업할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10000": "로드 밸런서[uuid:%s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_COMPUTE_VM_10302": "VM[uuid:%s]은(는) CD-ROM 디바이스를 %s개만 연결할 수 있습니다", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10003": "시스템에서 생성한 어피니티 그룹을 조작할 수 없습니다. 지원을 문의하시기 바랍니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10005": "잘못된 밸런스 알고리즘[%s], 유효한 알고리즘은 %s입니다", + "ORG_ZSTACK_COMPUTE_VM_10301": "VM[uuid:%s]에 이미 ISO[uuid:%s]가 연결되어 있습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10006": "잘못된 비정상 임계값[%s], 값은 숫자여야 합니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10003": "잘못된 로드 밸런서 가중치[%s], 인스턴스 ID가 [%d, %d] 범위에 있지 않습니다", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10000": "VM은 [%s,%s] 상태에서만 어피니티 그룹을 변경할 수 있지만, 현재 VM은 [%s] 상태입니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10004": "잘못된 밸런서 가중치[%s], 값이 숫자가 아닙니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10009": "잘못된 연결 유휴 시간 초과[%s], %s가 숫자 값인지 확인하시기 바랍니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10007": "잘못된 정상 임계값[%s], 숫자 값을 입력하시기 바랍니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10008": "잘못된 정상 시간 초과[%s], %s가 숫자 값인지 확인하시기 바랍니다", + "ORG_ZSTACK_TICKET_IAM2_10002": "흐름 수집[uuid:%s]이(가) 프로젝트[uuid:%s]에 속하지 않기 때문에 작업이 거부되었습니다", + "ORG_ZSTACK_TICKET_IAM2_10003": "가상 인스턴스 ID[uuid:%s]가 티켓[uuid:%s, name:%s]을(를) 관리할 권한이 없습니다", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10004": "Kafka 토픽은 null일 수 없습니다. 토픽 이름이 올바르게 구성되어 있는지 확인하시기 바랍니다.", + "ORG_ZSTACK_TICKET_IAM2_10000": "티켓 제출자[uuid:%s]의 삭제로 인해 작업이 거부되었습니다. 현재는 티켓[uuid:%s, name:%s]만 삭제할 수 있습니다", + "ORG_ZSTACK_TICKET_IAM2_10001": "티켓과 연결된 프로젝트[UUID:%s]가 삭제되었기 때문에 작업이 거부되었습니다. 이제 티켓[UUID:%s, name:%s]만 삭제할 수 있습니다", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10001": "Syslog 모드는 null일 수 없습니다", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10000": "클라우드 인스턴스의 인덱스는 null일 수 없습니다. 유효한 인덱스 값을 제공하시기 바랍니다.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10003": "Loki 레이블 형식은 key=value여야 합니다", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10002": "Loki 레이블은 null일 수 없습니다. 모든 레이블 값이 올바르게 정의되어 있는지 확인하시기 바랍니다.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10018": "호스트[UUID: %s] 및 네트워크 풀[UUID: %s]에 대한 vxLAN VTEP 주소가 이미 존재합니다", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10017": "%s은(는) 유효한 IPv4 주소가 아닙니다", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10016": "ip[%s] l2NetworkUuid[%s] clusterUuid[%s] IP 주소가 로컬 VTEP 테이블에 존재합니다", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10021": "L2 UUID[%s]가 VXLAN 네트워크 풀의 일부가 아니기 때문에 VNI 범위를 생성할 수 없습니다", + "ORG_ZSTACK_ALIYUN_CORE_IDENTITYZONE_10000": "프라이빗 Aliyun VPC 네트워크에 대해 zoneId를 지정해야 합니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10012": "잘못된 인스턴스 ID[%s], %s은(는) 유효한 인스턴스 식별자가 아닙니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10010": "잘못된 헬스 체크 간격[%s], 값은 숫자여야 합니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10011": "잘못된 최대 연결 값[%s], %s이(가) 숫자 값인지 확인하시기 바랍니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10016": "잘못된 헬스 체크 대상[%s], 포트[%s]는 숫자 값이어야 합니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10017": "VIP[%s]에 연결된 IP 주소가 없어 로드 밸런서에 VIP를 연결할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10014": "잘못된 헬스 체크 대상[%s], 확인 프로토콜[%s]이(가) 잘못되었습니다, 유효한 프로토콜은 %s입니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10015": "잘못된 헬스 체크 대상[%s], 포트[%s]가 [1, 65535] 유효 범위 내에 있지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10018": "로드 밸런서에 IPv4 VIP를 연결 실패 - 로드 밸런서[%s]가 이미 IPv4 VIP[%s]를 가지고 있습니다", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10009": "KVM 호스트[uuid:%s]에서 VXLAN 네트워크 풀[uuid:%s, type:%s]을 실현 실패 - %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10019": "로드 밸런서에 IPv6 VIP를 연결 실패 - 로드 밸런서[%s]가 이미 IPv6 VIP[%s]를 가지고 있습니다", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10004": "KVM 호스트[uuid:%s]에서 l2Network[uuid:%s, type:%s, vni:%d]를 위한 브릿지[%s] 생성 실패 - %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10003": "호스트[UUID: %s]에서 VTEP을 찾지 못했습니다. VXLAN 풀[UUID: %s]을 클러스터에 다시 연결해 주세요.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10002": "호스트 [UUID:%s]에 대해 여러 VTEP IP 주소 [%s]가 발견되었습니다. 호스트를 삭제하고 다시 추가해 주세요.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10008": "kvm 호스트[uuid:%s]에서 l2VxlanNetworkPool[uuid:%s, name:%s]의 CIDR[%s] 검증 실패 - %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10007": "KVM 호스트[uuid:%s]에서 l2Network[uuid:%s, type:%s, vni:%s]를 위한 브릿지[%s] 삭제 실패 - %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10006": "kvm 호스트[uuid:%s]에서 l2VxlanNetwork[uuid:%s, name:%s]의 CIDR[%s] 검증 실패 - %s", + "ORG_ZSTACK_CRYPTO_CCS_10001": "클라우드 환경에 사용자[uuid=%s]가 존재하지 않습니다", + "ORG_ZSTACK_CRYPTO_CCS_10002": "인증서 UUID가 누락되었고 UKey 시스템 태그가 존재하지 않습니다. 둘 다 올바르게 구성되어 있는지 확인해 주세요.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10020": "vip[%s]을 삭제할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10023": "서비스 제공자 유형 불일치 감지 - 로드 밸런서 [uuid:%s]는 서비스 제공자 [type:%s]에서 제공되지만 [type:%s] 유형의 새 서비스 제공자를 시도하고 있습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10024": "동일한 포트 [%s]와 동일한 로드 밸런서 [UUID:%s]에 리스너가 이미 존재합니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10022": "로드 밸런서 리스너[uuid:%s]의 서비스 제공자 유형을 가져올 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10027": "네트워크 인터페이스의 밸런서 가중치가 잘못되었습니다: %s, %d가 유효 범위 [%d, %d] 내에 있지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10028": "후보 vmnic을 가져올 수 없습니다 - 로드 밸런서 UUID와 서버 그룹 UUID가 모두 지정되지 않았습니다. 올바르게 지정되어 있는지 확인해 주세요.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10026": "잘못된 헬스 체크 매개변수[%s], 형식은 method:URI:status_codes여야 합니다 (예: GET:/index.html:http_2xx)", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10029": "후보 L3 네트워크를 가져올 수 없습니다 - 로드 밸런서 UUID와 서버 그룹 UUID가 모두 지정되지 않았습니다.", + "ORG_ZSTACK_CRYPTO_CCS_10008": "인증서 저장소에서 인증서[uuid=%s]를 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10030": "리스너와 연결된 기본 서버 그룹이 삭제되었기 때문에 로드 밸런서 리스너[uuid:%s]에서 VM NIC을 분리할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10031": "VIP와 IPv6 VIP 매개변수가 비어 있어서 로드 밸런서를 생성할 수 없습니다. 유효한 IP 주소를 제공해 주세요.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10034": "로드 밸런서 VIP [%s]는 공개 주소 풀 유형과 연결된 CIDR 블록 내의 첫 번째 또는 마지막 IP 주소가 아니어야 합니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10035": "로드 밸런서 생성 실패 - 매개변수 vipUuid가 가리키는 VIP[%s]가 IPv4 가상 머신 인터페이스가 아닙니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10032": "VIP와 IPv6 VIP의 L3 네트워크가 동일한 L3 네트워크가 아니어서 로드 밸런서를 생성할 수 없습니다. 동일한 L3 네트워크에 있는지 확인해 주세요.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10033": "VIP [UUID:%s]가 다른 네트워크 서비스 엔티티 [%s]에 의해 사용 중입니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10038": "작업 실패 - 접근 제어 목록 그룹:%s의 %s에 중복/겹치는 IP 항목이 있습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10039": "작업 실패 - IP 형식은 ip/iprange/cidr만 지원하지만 %s이(가) 발견되었습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10036": "매개변수 ipv6VipUuid가 가리키하는 VIP [%s]가 IPv6 VIP가 아니어서 로드 밸런서를 생성할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10037": "작동 실패, IP 버전 %d을(를) 지원하지 않습니다", + "ORG_ZSTACK_VPC_HA_10001": "VPC [UUID:%s]가 네트워크 서비스 버전 업데이트를 지원하지 않아 이 네트워크 서비스를 업데이트할 수 없습니다", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10025": "L2Network[uuid:%s]은(는) L2VxlanNetwork 유형이 아닙니다", + "ORG_ZSTACK_VPC_HA_10002": "VPC [UUID:%s]가 오래된 커널 버전:[%s]을(를) 사용하고 있어 이 네트워크 서비스를 업데이트할 수 없습니다", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10024": "vlan[%s]은(는) 유효한 VNI가 아닙니다", + "ORG_ZSTACK_VPC_HA_10003": "multi-SNAT 기능이 비활성화되어 있어 기본이 아닌 공용 네트워크로 소스 네트워크 주소 변환을 적용할 수 없습니다", + "ORG_ZSTACK_VPC_HA_10004": "L3 네트워크 [uuid:%s]가 프라이빗 네트워크이므로 이 L3 네트워크로 SNAT를 적용할 수 없습니다", + "ORG_ZSTACK_VPC_HA_10005": "L3 네트워크 [uuid:%s]가 VPC 라우터에 연결되지 않았으므로 이 L3 네트워크로 SNAT를 적용할 수 없습니다", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10029": "시스템 태그 [%s]의 CIDR 형식이 잘못되었습니다", + "ORG_ZSTACK_VPC_HA_10006": "클라우드 모니터 IP 주소 [%s]가 잘못되었습니다", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10028": "시스템 태그 [%s]가 잘못되었습니다. 다음 중 하나여야 합니다: [EC2, GCE, AWS_VPC]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10027": "[%s]과(와) 같은 하나의 시스템 태그를 입력하세요", + "ORG_ZSTACK_VPC_HA_10008": "vpcHaRouter [uuid:%s]이(가) 삭제되었습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10042": "다른 IP 버전을 가진 보안 그룹 [%s]을(를) LoadBalancer [%s]에 연결할 수 없습니다", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10031": "vXLAN 네트워크 풀은 L3 네트워크 생성을 지원하지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10040": "IP 범위 [%s, %s]가 접근 제어 목록 그룹: %s의 시작 IP: %s 및 종료 IP: %s와重叠됩니다", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10030": "%s [%s]과(와) VNI 범위가重叠됩니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10045": "접근 제어 목록 그룹[uuid:%s]은(는) 로드 밸런서 리스너에만 연결할 수 있으며 서버 그룹에 할당되어야 합니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10046": "접근 제어 목록 그룹[uuid:%s]의 로드 밸런서 리스너[uuid:%s] 연결은 HTTPS 또는 HTTP여야 합니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10043": "도메인[%s], URL[%s]이(가) 접근 제어 목록 그룹:%s과(와) 규칙을 중복/重叠합니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10044": "접근 제어 목록 그룹[uuid:%s]이(가) 리다이렉트하도록 구성되어 있지만 일부 접근 제어 항목에 리다이렉트 규칙이 없으며 IP 항목이 포함되어 있습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10049": "접근 제어 목록 그룹[uuid:%s]이(가) 다른 로드 밸런서 리스너[uuid:%s]에 연결되어 있습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10048": "접근 제어 목록 그룹[uuid:%s]에 리다이렉트 규칙이 포함되어 있지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10001": "계정에 할당된 VIP가 없습니다", + "ORG_ZSTACK_COMPUTE_VM_10239": "CreateVmInstanceMsg가 null일 수 없습니다. 요청을 제출하기 전에 요청 메시지가 올바르게 초기화되었는지 확인하세요", + "ORG_ZSTACK_COMPUTE_VM_10237": "이미지가 여러 백업 스토리지에 있으므로 zoneUuid를 지정해야 합니다", + "ORG_ZSTACK_COMPUTE_VM_10236": "기본 스토리지[uuids:%s]에 연결된 클러스터에서 Layer2 네트워크를 찾을 수 없습니다", + "ORG_ZSTACK_COMPUTE_VM_10235": "UUID가 %s인 기본 스토리지가 UUID가 %s인 영역의 클러스터에 연결되어 있지 않습니다", + "ORG_ZSTACK_COMPUTE_VM_10234": "백업 스토리지[uuid:%s, type:%s]에 접근할 수 있는 기본 스토리지를 찾을 수 없습니다", + "ORG_ZSTACK_COMPUTE_VM_10233": "UUID [uuid:%s]인 이미지가 UUID가 %s인 영역에 연결된 백업 스토리지에 저장되어 있지 않습니다", + "ORG_ZSTACK_COMPUTE_VM_10232": "Spice TLS 인증서가 존재하지 않습니다. Spice TLS가 활성화되어 있는지 확인하세요.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10002": "IP 구성에서 가상 라우터 네트워크가 프라이빗 네트워크와 overlapping되어 있어 가상 라우터 인스턴스를 생성할 수 없습니다.%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10001": "가상 라우터[uuid:%s]를 위한 KVM 호스트[uuid:%s]에서 Virtual Router Bootstrap ISO[%s]를 삭제하지 못했습니다. 이유: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10000": "가상 라우터[uuid:%s]를 위한 KVM 호스트[uuid:%s, ip:%s]에서 Virtual Router Bootstrap ISO[%s]를 생성하지 못했습니다. 이유: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10005": "UUID:%s인 가상 라우터 인스턴스의 네트워크가 프라이빗 L3 네트워크 UUID:%s와 동일할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10004": "UUID:%s인 가상 라우터 인스턴스 offering을 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10009": "L3 네트워크[UUID:%s]가 가상 라우터의 관리 네트워크이므로 IP 범위를 추가할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10008": "L3 네트워크[UUID:%s]가 가상 라우터 offering의 관리 네트워크이므로 IP 범위를 추가할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10007": "가상 라우터 L3[UUID: %s] 시작 실패", + "ORG_ZSTACK_COMPUTE_VM_10242": "VM 생성 중 SSH 키 페어 처리 실패: [%s]", + "ORG_ZSTACK_COMPUTE_VM_10241": "VM 생성 중 시스템 태그 처리 실패: [%s]", + "ORG_ZSTACK_COMPUTE_VM_10240": "가상 머신에 대한 시스템 태그 인스턴스화 실패: %s", + "ORG_ZSTACK_COMPUTE_VM_10249": "cpuCores는 유효한 정수 값이어야 합니다", + "ORG_ZSTACK_COMPUTE_VM_10248": "cpuSockets는 CPU 소켓 수를 나타내는 양의 정수여야 합니다.", + "ORG_ZSTACK_COMPUTE_VM_10247": "부트 순서 목록[%s]에서 부트 장치[%s]가 유효하지 않습니다", + "ORG_ZSTACK_COMPUTE_VM_10246": "시스템 태그에서 호스트네임 충돌 감지: UUID %s인 다른 VM이 L3 네트워크 UUID %s에 이미 호스트네임 %s를 가지고 있습니다", + "ORG_ZSTACK_COMPUTE_VM_10245": "호스트네임 시스템 태그는 하나만 허용되지만 %s개를 받았습니다", + "ORG_ZSTACK_COMPUTE_VM_10244": "시스템 태그에 지정된 호스트네임[%s]은(는) 유효한 도메인 이름이 아닙니다", + "ORG_ZSTACK_COMPUTE_VM_10243": "이 기능을 활성화할 수 없습니다. 가상 머신[uuid: %s]이 L3 네트워크[uuid: %s]에 연결된 여러 네트워크 인터페이스 카드(NIC)를 가지고 있습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10013": "가상 라우터[uuid:%s]의 기본 네트워크 업데이트 실패: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10012": "l3Network[uuid:%s]에 가상 라우터 네트워크 서비스 연결 실패. 포트 포워딩 선택에는 snat 구성이 필요합니다.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10011": "l3Network[uuid:%s]에 가상 라우터 네트워크 서비스 연결 실패. 탄성 IP(EIP)를 선택하면 소스 네트워크 주소 변환(SNAT)도 구성해야 합니다.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10010": "시스템 태그[%s]에 잘못된 어플라이언스 이미지 유형[%s]이 포함되어 있어 이미지를 추가할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10017": "가상 라우터[name:%s, uuid:%s, 현재 상태:%s]가 작동 중이 아니므로 필요한 작업을 수행할 수 없습니다. 실행 중일 때 다시 시도하세요.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10015": "가상 라우터 핫 마이그레이션을 위해 가상 라우터[uuid:%s]에서 VIP[ips: %s] 동기화 실패: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10014": "유효하지 않은 VirtualMachineType %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10000": "가상 머신 인스턴스[uuid:%s]가 이미 보안 그룹과 연결되어 있으므로 리소스 소유자를 변경할 수 없습니다", + "ORG_ZSTACK_TEST_COMPUTE_HOSTALLOCATOR_10000": "의도적: 이 작업은 클라우드 컴퓨팅 아키텍처 설계에 따라 의도적인 것입니다. 모든 가상 머신 구성이 보안 및 성능 표준을 준수하는지 확인하세요.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10019": "가상 라우터[uuid:%s]에 %s에 HTTP 호출을 할 수 있는 관리 NIC가 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10018": "가상 라우터[uuid: %s]가 %s에 HTTP 호출을 할 수 없는 상태인 %s에 있습니다", + "ORG_ZSTACK_COMPUTE_VM_10253": "bootMode 시스템 태그는 하나만 허용되지만, %d개의 태그가 발견되었습니다", + "ORG_ZSTACK_COMPUTE_VM_10252": "가상 머신은 최대 하나의 사용자 데이터 시스템 태그를 가져야 합니다.", + "ORG_ZSTACK_COMPUTE_VM_10251": "VM[uuid: %s]에 이미 사용자 정의 시스템 태그가 있습니다.", + "ORG_ZSTACK_COMPUTE_VM_10250": "cpuThreads는 정수 값이어야 합니다", + "ORG_ZSTACK_COMPUTE_VM_10259": "잘못된 USB 리다이렉션[%s], %s은(는) 유효한 USBRedirect 태그가 아닙니다", + "ORG_ZSTACK_COMPUTE_VM_10258": "잘못된 매개변수[%s], 값 [%s]은(는) 부울 타입이 아닙니다", + "ORG_ZSTACK_COMPUTE_VM_10257": "잘못된 형식 태그[%s]", + "ORG_ZSTACK_COMPUTE_VM_10256": "vm 머신 타입은 [q35, pcie, virtual]이 필요하지만, [%s](이)가 입력되었습니다", + "ORG_ZSTACK_COMPUTE_VM_10254": "클라우드 인스턴스 프로비저닝에 대해 시스템 태그[%s]에 지정된 [%s]은(는) 유효한 부트 모드가 아닙니다.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10020": "가상 머신[uuid:%s ip:%s]의 가상 라우터에 네트워크 인터페이스[ip:%s, ip6:%s, mac:%s]을(를) 추가할 수 없습니다. 왜냐하면 %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10024": "L3 UUID[:%s]가 관리 네트워크를 참조하기 때문에 기본 네트워크를 설정할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10023": "l3 UUID [%s]가 가상 라우터[UUID:%s]와 연결되지 않았습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10022": "l3 uuid[:%s]가 가상 라우터[uuid:%s]의 기본 네트워크와 동일합니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10021": "공유 로드 밸런서에 서비스 제공자가 없기 때문에 로드 밸런서 서버 그룹에 서버 IP를 추가할 수 없습니다. 먼저 가상 네트워크 인터페이스(VMNIC)가 추가되었는지 확인하십시오.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10010": "VIP 생성에 실패했습니다. 가상 네트워크 버전을 확인할 수 없습니다. 네트워크 구성 설정을 확인하십시오.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10012": "VIP[UUID:%s, name:%s, IP:%s]의 서비스 제공자가 %s(으)로 설정되었습니다", + "ORG_ZSTACK_TICKET_EXECUTOR_10001": "이벤트에서 값을 가져오지 못했습니다: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10025": "l3 UUID[:%s]가 공용 네트워크가 아니기 때문에 기본 네트워크를 설정할 수 없습니다", + "ORG_ZSTACK_TICKET_EXECUTOR_10000": "지정된 네임스페이스에서 API 클래스[name:%s]를 찾을 수 없습니다. 클래스 이름과 네임스페이스가 올바른지 확인하십시오.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10016": "VM NIC[uuid:%s]가 보안 그룹에 연결되지 않았기 때문에 VM NIC 보안 그룹을 설정할 수 없습니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10015": "VM NIC[UUID:%s]를 찾을 수 없기 때문에 VM NIC 보안 그룹을 설정할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10007": "requiredIp[%s]은(는) 유효한 IPv4 주소가 아닙니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10018": "잘못된 우선순위 때문에 VM NIC 보안 그룹을 설정할 수 없습니다; 우선순위[%d]은(는) 1 이상이어야 합니다", + "ORG_ZSTACK_COMPUTE_10003": "가상 머신 네트워크 인터페이스의 아웃바운드 대역폭[%d]이(가) 유효한 범위 [8192, 32212254720]을(를) 벗어났습니다", + "ORG_ZSTACK_COMPUTE_VM_10264": "vm[uuid:%s, name:%s]이(가) 종료되었습니다", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10017": "보안 그룹[uuid:%s]을(를) 찾을 수 없기 때문에 VM NIC 보안 그룹을 설정할 수 없습니다", + "ORG_ZSTACK_COMPUTE_10004": "VM NIC의 인바운드 대역폭이 유효한 범위 [8192, 32212254720]을(를) 초과합니다", + "ORG_ZSTACK_COMPUTE_VM_10263": "리소스[uuid:%s]가 루트 볼륨이므로 소유자를 직접 변경할 수 없습니다. 대신 루트 볼륨이 속한 가상 머신의 소유자를 변경하십시오.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10009": "필요한 IP 주소 [%s]이(가) 이미 할당되어 있습니다", + "ORG_ZSTACK_COMPUTE_10001": "VM NIC l3NetworkUuid는 null일 수 없습니다", + "ORG_ZSTACK_COMPUTE_VM_10262": "이미지가 없는 VM 생성 시 rootDiskOfferingUuid는 null일 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10008": "L3 네트워크[UUID:%s]에 이미 연결된 VIP[%s]가 있습니다.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10019": "중복된 우선순위 때문에 VM NIC 보안 그룹을 설정할 수 없습니다; 보안 그룹 %s와 %s 모두 우선순위 %d를 가지고 있습니다", + "ORG_ZSTACK_COMPUTE_10002": "VM NIC의 l3NetworkUuid가 l3[%s]에 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10003": "ip를 삭제할 수 없습니다, ip[uuid:%s]가 가상 IP입니다", + "ORG_ZSTACK_COMPUTE_VM_10260": "잘못된 usbRedirect[%s], %s는 불리언 타입이 아닙니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10002": "이 계정으로 VIP 상태에 접근할 수 없습니다. 계정 권한을 확인하고 다시 시도해 주세요.", + "ORG_ZSTACK_COMPUTE_10000": "중복된 네트워크 인터페이스 파라미터가 감지되었습니다. 각 네트워크 인터페이스가 고유한 파라미터를 갖도록 해 주세요.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10005": "지원되지 않는 IP 할당 전략[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10004": "시스템 VIP는 API를 통해 삭제할 수 없습니다. 지원을 위해 문의해 주세요.", + "ORG_ZSTACK_COMPUTE_VM_10269": "VM[UUID:%s]에 L3 네트워크[UUID:%s]에 연결된 NIC가 없습니다", + "ORG_ZSTACK_COMPUTE_10007": "vm 네트워크 드라이버 %s는 아직 지원되지 않습니다", + "ORG_ZSTACK_COMPUTE_VM_10268": "호스트[uuid:%s]에서 VM[uuid:%s]의 인식할 수 없는 상태를 받았습니다", + "ORG_ZSTACK_COMPUTE_VM_10267": "호스트[uuid:%s]에서 VM [uuid:%s]의 상태 확인에 실패했습니다, %s", + "ORG_ZSTACK_COMPUTE_10005": "VM 네트워크 인터페이스의 멀티큐 번호 [%d]가 유효 범위 [1, 256]을 벗어났습니다", + "ORG_ZSTACK_COMPUTE_10006": "l3[uuid:%s]의 vm nic 상태[%s]가 예상 상태가 아니거나 %s입니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10031": "관리 네트워크가 아직 IPv6을 지원하지 않아 가상 라우터 오퍼링을 생성할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10030": "관리 네트워크 [uuid:%s]가 이 오퍼링을 생성하려는 가용 영역 [uuid:%s]에 있지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10035": "L3 네트워크 [UUID: %s]에 SNAT 서비스가 활성화되어 있으므로 관리 네트워크로 사용할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10034": "image[uuid:%s]가 지원되지 않는 형식 %s이므로 가상 라우터 구성에 사용할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10033": "image[uuid:%s]의 미디어 타입이 %s로, 가상 라우터 이미지의 요구사항(미디어 타입이 %s이어야 함)을 충족하지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10032": "UUID %s인 공개 네트워크가 이 오퍼링을 생성하려는 가용 영역에 있지 않습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10087": "UUID [uuid:%s] 및 이름 [name:%s]인 이미지가 모든 백업 스토리지에서 삭제되었습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10039": "관리 네트워크 [UUID:%s, gateway:%s]에 연결할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10038": "관리 네트워크[uuid:%s]에 구성된 IP 범위가 없습니다", + "ORG_ZSTACK_STORAGE_VOLUME_10086": "primaryStorage 타입 [%s]이 아직 공유 볼륨을 지원하지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10037": "UUID [uuid: %s]인 L3 네트워크가 [uuid: %s]와 동일한 네트워크 주소를 가지고 있어 가상 라우터에 사용할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10036": "L3 네트워크 [UUID: %s]에 SNAT 서비스가 활성화되어 있어 공개 네트워크로 사용할 수 없습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10088": "image[uuid:%s]에 대해 다음 조건을 만족하는 백업 스토리지를 찾을 수 없습니다: 1. 상태가 Enabled 2. 상태가 Connected 3. primary storage[uuid:%s]가 있는 zone에 연결됨", + "ORG_ZSTACK_STORAGE_VOLUME_10083": "중복된 볼륨 UUID: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10082": "최신 스냅샷이 아닌 상태로 되돌릴 수 없습니다", + "ORG_ZSTACK_STORAGE_VOLUME_10085": "기본 스토리지 유형을 가져오지 못함", + "ORG_ZSTACK_STORAGE_VOLUME_10092": "볼륨 생성 중 대상 볼륨이 제거되었습니다.%s", + "ORG_ZSTACK_STORAGE_VOLUME_10091": "기본 스토리지 UUID 충돌, 디스크 오퍼링에서 지정한 기본 스토리지는 %s이며, 생성 매개변수에서 지정한 기본 스토리지는 %s입니다", + "ORG_ZSTACK_STORAGE_VOLUME_10093": "%s 가상 머신 구현이 두 개 이상 있어서는 안 됩니다", + "ORG_ZSTACK_STORAGE_VOLUME_10096": "기본 스토리지에 ISO를 다운로드할 수 없습니다. 이유: %s", + "ORG_ZSTACK_ZDFS_10000": "zDFS에 ping 실패, %s", + "ORG_ZSTACK_COMPUTE_VM_10204": "잘못된 JSON 형식, 원인: %s", + "ORG_ZSTACK_COMPUTE_VM_10203": "l3NetworkUuids와 vmNicInventories는 동시에 비어 있거나 동시에 설정되어서는 안 됩니다", + "ORG_ZSTACK_COMPUTE_VM_10200": "volume[uuid:%s]이(가) 요구 사항을 충족하지 못했습니다 [state:Enabled status:Ready]", + "ORG_ZSTACK_COMPUTE_VM_10219": "이 API는 더 이상 지원되지 않으며 클라우드 컴퓨팅 환경에서는 사용되지 않습니다. 작업에 최신 사용 가능한 API 사용을 고려해 주세요.", + "ORG_ZSTACK_COMPUTE_VM_10218": "현재 콘솔 비밀번호가 구성되지 않았으므로 VM[uuid:%s]의 콘솔 비밀번호를 업데이트할 수 없습니다", + "ORG_ZSTACK_ZDFS_10002": "hostname[%s]에서 ZDFS 문제가 발생했습니다", + "ORG_ZSTACK_ZDFS_10001": "zDFS에 연결 실패, %s", + "ORG_ZSTACK_COMPUTE_VM_10217": "VM[uuid:%s]이(가) 'Running' 상태가 아니므로 콘솔 비밀번호를 업데이트할 수 없습니다. 현재 상태는 '%s'입니다", + "ORG_ZSTACK_COMPUTE_VM_10216": "잠재적인 VNC 보안 취약점을 방지하기 위해 콘솔 비밀번호는 \"password\"로 시작해서는 안 됩니다", + "ORG_ZSTACK_COMPUTE_VM_10215": "동일한 ISO 파일을 여러 번 마운트하도록 허용하지 마세요", + "ORG_ZSTACK_COMPUTE_VM_10214": "UUID [uuid=%s]인 가상 머신이 존재하지 않습니다", + "ORG_ZSTACK_COMPUTE_VM_10220": "CdRom[%s]이(가) 이미 기본값입니다", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10002": "클라우드 인스턴스의 호스트 이름은 null일 수 없습니다. 유효한 호스트 이름을 제공해 주세요", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10000": "facilityId는 null일 수 없습니다", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10001": "잘못된 로깅 시설 %s", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10006": "syslog 서버[address: %s]를 사용할 수 없습니다", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10007": "syslog 서버[address: %s:%s]를 사용할 수 없습니다", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10004": "프로토콜은 null일 수 없습니다. 유효한 프로토콜을 제공해 주세요", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10005": "클라우드 컴퓨팅 환경에서 지원되지 않는 프로토콜 %s", + "ORG_ZSTACK_COMPUTE_VM_10228": "유니캐스트 MAC 주소가 예상되었으나 멀티캐스트 MAC 주소 [%s]를 찾았습니다", + "ORG_ZSTACK_COMPUTE_VM_10227": "인스턴스 %d에 대해 허용되지 않는 네트워크 주소 %s", + "ORG_ZSTACK_COMPUTE_VM_10226": "잘못된 MAC 주소 [%s]", + "ORG_ZSTACK_COMPUTE_VM_10225": "이것은 유효한 MAC 주소가 아닙니다 [%s]", + "ORG_ZSTACK_COMPUTE_VM_10224": "CPU 토폴로지가 잘못되었습니다. 실제 CPU 코어: %s, 구성된 소켓: %s, 소켓당 코어: %s, 코어당 스레드: %s; 계산된 소켓: %s, 코어: %s, 스레드: %s", + "ORG_ZSTACK_COMPUTE_VM_10221": "vm[uuid:%s]은(는) 상태가 Running일 때만 fstrim을 수행할 수 있습니다; 현재 상태는 %s", + "ORG_ZSTACK_STORAGE_VOLUME_10046": "UUID [%s]인 볼륨이 삭제된 상태가 아닙니다. 이 작업은 이전에 삭제된 데이터 볼륨을 복구하기 위한 것입니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10049": "image[uuid:%s]은(는) Enabled 상태가 아닙니다, 현재 %s입니다", + "ORG_ZSTACK_STORAGE_VOLUME_10048": "image[uuid:%s]은(는) 예상된 타입이 아닙니다, 타입이 %s입니다", + "ORG_ZSTACK_STORAGE_VOLUME_10042": "volume[uuid:%s]은(는) 활성화 상태가 아닙니다, 현재 상태는 %s이며, 스냅샷 생성이 불가능합니다", + "ORG_ZSTACK_STORAGE_VOLUME_10045": "volume[uuid:%s]은(를) 스냅샷 생성에 사용할 수 없습니다, 현재 상태는 %s입니다", + "ORG_ZSTACK_STORAGE_VOLUME_10044": "메모리 스냅샷을 생성할 수 없습니다, VM 현재 상태[%s], 예상 상태는 [%s, %s]입니다", + "ORG_ZSTACK_STORAGE_VOLUME_10041": "volume[uuid:%s, type:%s], 스냅샷을 생성할 수 없습니다", + "ORG_ZSTACK_LOGIN_10022": "잘못된 속성입니다. 속성[%s]이(가) 필수이지만, 일치하지 않는 일부 레코드[%s]가 발견되었습니다. 모든 속성이 올바르게 지정되고 일치하는지 확인하세요.", + "ORG_ZSTACK_LOGIN_10024": "strategy는 필수 필드입니다 %", + "ORG_ZSTACK_LOGIN_10023": "클라우드 구성 데이터의 JSON 형식이 잘못되었습니다. 모든 JSON 필드가 올바르게 형식화되고 지정된 스키마를 준수하는지 확인하세요.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10007": "keyLabel %s와 encryptedResult %s가 일치하지 않습니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10006": "flkSec 보안 시스템이 비정상입니다: %s", + "ORG_ZSTACK_LOGIN_10029": "이름은 지정된 매개변수 범위 내의 값을 사용해야 합니다 %s", + "ORG_ZSTACK_LOGIN_10026": "클라우드 리소스 프로비저닝에는 속성이 필수입니다 %", + "ORG_ZSTACK_LOGIN_10025": "name은 필수 필드입니다 %", + "ORG_ZSTACK_LOGIN_10028": "가상 머신 구성에 optional은 필수 필드입니다%", + "ORG_ZSTACK_LOGIN_10027": "type은 필수 필드입니다 %", + "ORG_ZSTACK_STORAGE_VOLUME_10058": "루트 볼륨 [uuid:%s, name:%s]을(를) 연결할 수 없습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10057": "VM [UUID:%s]은(는) 이미지 플랫폼 유형이 호환되지 않으므로 볼륨 [%s]을(를) 온라인 연결할 수 없습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10059": "데이터 볼륨 [UUID:%s]이(가) 비활성화되어 있습니다; 연결이 허용되지 않습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10054": "데이터 볼륨 [UUID:%s]이(가) 어떤 가상 머신에도 연결되어 있지 않아 분리할 수 없습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10053": "volume[uuid:%s]이(가) 상태[%s]에 있습니다, 데이터 볼륨은 상태가 available 또는 attaching일 때만 연결할 수 있습니다", + "ORG_ZSTACK_STORAGE_VOLUME_10056": "volume[uuid:%s, name:%s, type:%s]을(를) 분리할 수 없습니다", + "ORG_ZSTACK_CORE_PLUGIN_10001": "plugin[%s] 이름, 제품 키 및 공급업체는 null일 수 없습니다", + "ORG_ZSTACK_STORAGE_VOLUME_10055": "UUID [%s]인 공유 데이터 볼륨을 분리하려면 가상 머신의 UUID가 필요합니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10050": "image[uuid:%s]이(가) Ready 상태가 아닙니다, 현재 %s 상태입니다", + "ORG_ZSTACK_STORAGE_VOLUME_10052": "volume[uuid:%s]이(가) 상태[%s]에 있습니다, 데이터 볼륨은 상태가 %s일 때만 연결할 수 있습니다", + "ORG_ZSTACK_STORAGE_VOLUME_10051": "루트 볼륨 [uuid:%s]을(를) 가상 머신에 연결할 수 없습니다", + "ORG_ZSTACK_LOGIN_10011": "DNS 항목 [%s] 유효성 검사에 실패했습니다, 아마 삭제된 것 같습니다", + "ORG_ZSTACK_CORE_PLUGIN_10000": "클라우드 제품에 대한 알 수 없는 플러그인 이름: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10069": "볼륨[uuid:%s, type:%s]을(를) 삭제할 수 없습니다", + "ORG_ZSTACK_STORAGE_VOLUME_10068": "가상 머신 %s의 예상치 못한 디스크 크기 설정입니다. 지정된 디스크 크기가 허용 범위 내에 있고 클라우드 환경 구성과 호환되는지 확인하십시오.", + "ORG_ZSTACK_STORAGE_VOLUME_10065": "VM에 볼륨을 연결할 수 없습니다, 사용 가능한 컴퓨트 클러스터가 없습니다", + "ORG_ZSTACK_STORAGE_VOLUME_10064": "UUID [%s]인 데이터 볼륨이 [%s] 형식을 가지고 있어 [%s] 유형의 하이퍼바이저에만 연결할 수 있지만, VM의 하이퍼바이저 유형은 [%s]입니다. 따라서 연결이 불가능합니다.", + "ORG_ZSTACK_RESOURCECONFIG_10009": "계정이 리소스[uuid: %s]에 접근할 수 없습니다", + "ORG_ZSTACK_STORAGE_VOLUME_10067": "루트 볼륨을 백업할 수 없습니다, uuid:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10066": "볼륨의 저장소[uuid: %s]와 연결이 끊긴 호스트[uuid: %s]에서 실행 중인 VM에 볼륨을 연결할 수 없습니다", + "ORG_ZSTACK_STORAGE_VOLUME_10061": "데이터 볼륨 [UUID:%s]이(가) 다른 가상 머신에 연결되어 있으므로 다시 연결할 수 없습니다.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_10000": "속성[name:%s]은(는) 클라우드 컴퓨팅 환경에서 업데이트할 수 없는 예약된 속성입니다.", + "ORG_ZSTACK_NETWORK_OVN_10074": "OVN SDN 컨트롤러 [UUID: %s, Name: %s]이(가) 연결 해제 상태입니다; 호스트[UUID: %s]을(를) 추가할 수 없습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10060": "UUID [%s]인 볼륨이 삭제된 상태이므로 작업을 수행할 수 없습니다.", + "ORG_ZSTACK_NETWORK_OVN_10073": "OVN 컨트롤러[uuid:%s, ip:%s]에 논리 스위치[uuid:%s, name:%s]을(를) 추가하지 못했습니다, 왜냐하면 %s", + "ORG_ZSTACK_STORAGE_VOLUME_10063": "형식 [%s]인 UUID [%s]의 데이터 볼륨은 어떤 하이퍼바이저에도 연결할 수 없습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10062": "데이터 볼륨은 상태가 [active, available]일 때만 연결할 수 있습니다, 현재 상태는 %s입니다", + "ORG_ZSTACK_NETWORK_OVN_10071": "OVS 컨트롤러[uuid:%s, ip:%s]에 논리 스위치를 동기화하지 못했습니다, %s로 인해", + "ORG_ZSTACK_LOGIN_10000": "ZStack이 현재 데이터베이스에서 LDAP 조직을 로딩 중입니다; 이때 동기화 작업을 실행하지 마십시오.", + "ORG_ZSTACK_NETWORK_OVN_10078": "NfvInstance[uuid:%s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_OVN_10077": "L2 네트워크 [UUID:%s]이(가) OVN 컨트롤러에 연결되어 있지 않습니다", + "ORG_ZSTACK_NETWORK_OVN_10076": "OVS 컨트롤러[uuid:%s, ip:%s]에서 논리 스위치 포트를 삭제하지 못했습니다, 왜냐하면 %s", + "ORG_ZSTACK_STORAGE_VOLUME_10070": "볼륨[uuid:%s]이(가) 이미 삭제된 상태입니다", + "ORG_ZSTACK_LOGIN_10001": "LDAP 항목[]을(를) 동기화하지 못했습니다, %s로 인해", + "ORG_ZSTACK_NETWORK_OVN_10075": "OVN 컨트롤러[uuid:%s, ip:%s]에 논리 스위치 포트를 추가하지 못했습니다, 왜냐하면 %s", + "ORG_ZSTACK_V2V_10037": "호스트[uuid:%s]이(가) 연결되어 있지 않습니다", + "ORG_ZSTACK_V2V_10038": "기본 저장소[uuid%s]이(가) 연결되어 있지 않습니다", + "ORG_ZSTACK_V2V_10035": "변환 호스트[uuid:%s]에 %d 바이트를 할당할 수 없습니다, 사용 가능한 용량이 부족합니다", + "ORG_ZSTACK_NETWORK_OVN_10079": "NfvInstanceGroup[uuid:%s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_LOGIN_10008": "UID[%s]의 유효성 검사에 실패했습니다, 삭제 또는 만료로 인해 발생할 수 있습니다", + "ORG_ZSTACK_LOGIN_10007": "범위가 %s이(가) 아닌 LDAP/AD 서버를 동기화할 수 없습니다", + "ORG_ZSTACK_V2V_10031": "V2V 마이그레이션을 위한 잘못된 QoS 시스템 태그입니다. 시스템 태그를 확인하고 클라우드 컴퓨팅 표준을 준수하는지 확인하세요.", + "ORG_ZSTACK_V2V_10032": "잘못된 네트워크 대역폭[%s]입니다. 초당 1048576 바이트 이상이어야 합니다.", + "ORG_ZSTACK_LOGIN_10009": "UID[%s]에 대한 IAM 가상 ID를 생성하지 못했습니다. 이유: %s", + "ORG_ZSTACK_LOGIN_10004": "클라우드 환경에서 LDAP 조직을 동기화하지 못했습니다.", + "ORG_ZSTACK_BAREMETAL2_10001": "잘못된 IPMI 섀시 구성: 'provisionIp' 매개변수가 제공될 때 'reboot' 매개변수는 'No'로 설정해야 합니다.", + "ORG_ZSTACK_V2V_10030": "hostUuid %s의 호스트에서 VM 마이그레이션이 발생했습니다.", + "ORG_ZSTACK_BAREMETAL2_10002": "잘못된 IPMI 섀시 구성: 'provisionIp'가 제공될 때 'platform'은 'Linux'로 지정해야 합니다.", + "ORG_ZSTACK_LOGIN_10006": "조직을 동기화하지 못했습니다. 이유: %s", + "ORG_ZSTACK_LOGIN_10005": "LDAP 엔트리를 조직 노드로 변환하지 못했습니다.", + "ORG_ZSTACK_BAREMETAL2_10000": "잘못된 IPMI 섀시 구성: 'provisionIp'가 지정되면 'provisionType'은 'Direct'로 설정해야 합니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10079": "볼륨 [%s]를 인스턴스에서 분리할 수 없습니다. 이미 분리되었을 수 있습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10076": "볼륨[%s]를 호스트[%s]에 연결할 수 없습니다. 현재 호스트[%s]에 연결 중입니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10075": "마운트 경로는 절대 경로여야 합니다. 유효한 절대 경로를 제공하세요.", + "ORG_ZSTACK_NETWORK_OVN_10080": "NfvInstanceGroup[uuid:%s]에 구성된 가상 IP가 없습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10078": "마운트 경로[%s]를 다른 볼륨이 사용 중이므로 볼륨[%s]를 호스트[%s]에 연결할 수 없습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10077": "호스트[%s]의 경로[%s]에 이미 마운트되어 있으므로 볼륨 [%s]를 호스트 [%s]에 연결할 수 없습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10072": "루트 볼륨의 상태를 변경할 수 없습니다. UUID: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10071": "볼륨 [%s]를 삭제할 수 없습니다. 호스트 [%s]에 연결되어 있습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10074": "인스턴스[상태:%s]가 작동 중이 아니므로 볼륨[%s]를 인스턴스[%s]에 연결할 수 없습니다.", + "ORG_ZSTACK_NETWORK_OVN_10083": "NFV 인스턴스 [uuid:%s]의 OVN 클러스터 노드를 업데이트하지 못했습니다. 이유: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10073": "볼륨이 호스트 %s에 연결되어 있으므로 볼륨 상태를 변경할 수 없습니다.", + "ORG_ZSTACK_NETWORK_OVN_10082": "NfvInstanceGroup[uuid:%s]에서 클러스터 구성을 위한 인스턴스를 찾을 수 없습니다.", + "ORG_ZSTACK_RESOURCECONFIG_10002": "ResourceConfig [category:%s, name:%s]를 resourceType: %s과(와) 연결할 수 없습니다.", + "ORG_ZSTACK_RESOURCECONFIG_10001": "리소스를 찾을 수 없습니다[uuid: %s].", + "ORG_ZSTACK_STORAGE_VOLUME_10081": "볼륨[uuid: %s]의 사용된 스냅샷 트리에서 소스 파일을 찾을 수 없습니다.", + "ORG_ZSTACK_V2V_10028": "소스 VM의 타입을 찾을 수 없습니다[url:%s].", + "ORG_ZSTACK_RESOURCECONFIG_10000": "리소스의 리소스 타입이 일관되지 않습니다. 세부 정보: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10080": "공유 가능한 볼륨[uuid:%s]을(를) 평탄화할 수 없습니다.", + "ORG_ZSTACK_V2V_10029": "소스 VM의 팩터리를 찾을 수 없습니다[url:%s, v2vType:%s].", + "ORG_ZSTACK_RESOURCECONFIG_10007": "전역 구성 [category:%s, name:%s]를 리소스에 바인딩할 수 없습니다.", + "ORG_ZSTACK_V2V_10026": "현재 VM을 시작하기 위한 Network[uuid:%s]을(를) 찾을 수 없습니다. 삭제되었을 수 있습니다. 작업 제안: 이 VM을 종료하고 새로 만드세요.", + "ORG_ZSTACK_RESOURCECONFIG_10006": "전역 구성[category:%s, name:%s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_V2V_10024": "인스턴스 종료 시간이 아닙니다", + "ORG_ZSTACK_V2V_10025": "conversionHost[uuid:%s, hostUuid:%s]이(가) 연결되어 있지 않습니다", + "ORG_ZSTACK_V2V_10022": "일부 v2v 작업이 진행 중입니다. volume[%s]을(를) host[%s]에서 분리할 수 없습니다.", + "ORG_ZSTACK_V2V_10020": "primary storage[uuid:%s]이(가) 활성화되어 있지도 연결되어 있지 않습니다", + "ORG_ZSTACK_V2V_10021": "V2V 마이그레이션 작업이 진행 중입니다. volume[%s]이(가) host[%s]에 연결되어 있지 않은지 확인하세요.", + "ORG_ZSTACK_STORAGE_VOLUME_10007": "iothread는 QEMU 버전 >= %s이(가) 필요하지만, 호스트는 버전 %s을(를) 실행 중입니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10009": "root volume [%s]은(는) I/O 스레드 핀을 설정할 수 없습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10008": "iothread는 libvirt 버전 >= %s이(가) 필요하지만, 호스트는 버전 %s을(를) 가지고 있습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10003": "현재 primary storage %s은(는) Ceph 유형이 아니므로 접근할 수 없습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10005": "현재 primary storage 유형은 block volume을 지원하지 않습니다. 지원되는 유형: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10004": "Ceph 유형 block volume의 접근 경로 ID와 IQN은 null일 수 없습니다. accessPathId와 accessPathIqn이 모두 제공되었는지 확인하세요.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10000": "JitClientFactory 연결 테스트 실패", + "ORG_ZSTACK_SSO_CAS_FILTER_10000": "URL이 잘못되었습니다. 클라이언트 UUID가 누락되었습니다.", + "ORG_ZSTACK_SSO_CAS_FILTER_10001": "CAS 클라이언트 인스턴스가 누락되었습니다. SSO 통합 전에 CAS 클라이언트를 인스턴스화하세요.", + "ORG_ZSTACK_COMPUTE_VM_10275": "VM[uuid:%s]이(가) Running 상태가 아닙니다.", + "ORG_ZSTACK_CONSOLE_10011": "콘솔 에이전트가 연결되어 있지 않습니다. 관리 노드 초기화 때문일 수 있습니다. 콘솔 에이전트가 연결될 때까지 기다리거나, 오랫동안 연결이 끊어진 경우 수동으로 재연결하세요.", + "ORG_ZSTACK_CONSOLE_10010": "vm[uuid:%s]이(가) %s 상태가 아닙니다. 현재 상태는 %s입니다.", + "ORG_ZSTACK_COMPUTE_VM_10273": "primary storage[uuid:%s]에서 root volume[uuid:%s]으로부터 템플릿을 생성하지 못했습니다.", + "ORG_ZSTACK_COMPUTE_VM_10270": "가상 머신이 삭제되었습니다. 세부 내용은 인스턴스 관리 콘솔을 확인하세요.", + "ORG_ZSTACK_CONSOLE_10013": "agent[ip: %s]의 콘솔 프록시[uuid: %s, status: %s]가 연결되어 있지 않아 삭제하지 못했습니다.", + "ORG_ZSTACK_CONSOLE_10012": "VM[uuid:%s]의 호스트 IP를 찾을 수 없습니다. VM이 실행 중인가요???", + "ORG_ZSTACK_COMPUTE_VM_10279": "하이퍼바이저에서 VM[uuid=%s] 업데이트 실패: 특정 속성 수정 실패", + "ORG_ZSTACK_COMPUTE_VM_10278": "하이퍼바이저에서 vm[uuid=%s]을(를) 업데이트하지 못했습니다.", + "ORG_ZSTACK_COMPUTE_VM_10277": "UUID [uuid:%s]를 가진 ISO가 VM [name:%s, uuid:%s]이(가) 있는 primary storage [uuid:%s]와 호환되지 않는 backup storage에 있습니다.", + "ORG_ZSTACK_COMPUTE_VM_10276": "VM[uuid:%s]의 콘솔 비밀번호를 업데이트할 수 없습니다. VM이 어떤 호스트에서도 실행되고 있지 않습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10018": "volume [%s]은(는) Disabled 상태이므로 크기 조정할 수 없습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10017": "volume[uuid:%s]이(가) data volume이 아닙니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10019": "vmInstanceUuid 또는 instanceUuid 중 하나 이상을 지정해야 합니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10014": "다른 VM[uuid:%s, uuid:%s]의 볼륨[uuid:%s, uuid:%s] 스냅샷 촬영은 지원되지 않습니다", + "ORG_ZSTACK_STORAGE_VOLUME_10013": "volume[uuid:%s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_VOLUME_10016": "vm[uuid:%s]의 상태가 %s이므로 스냅샷 생성이 허용되지 않습니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10013": "jit 보안 컴퓨터 비정상: %s:%s 소켓 연결 실패", + "ORG_ZSTACK_STORAGE_VOLUME_10015": "volume[uuid:%s]을(를) 사용할 수 없습니다", + "ORG_ZSTACK_STORAGE_VOLUME_10010": "현재 I/O 스레드 ID[%s]가 연결된 볼륨[%s]의 I/O 스레드 ID[%s]와 일치하지 않습니다", + "ORG_ZSTACK_STORAGE_VOLUME_10012": "volume[uuid:%s]에 대한 스냅샷 유효성 검사가 지원되지 않습니다. 연결된 VM이 [%s, %s] 상태 중 하나가 아닙니다", + "ORG_ZSTACK_STORAGE_VOLUME_10011": "volume[UUID:%s]에 대한 스냅샷 유효성 검사가 지원되지 않습니다. 해당 볼륨은 가상 머신에 연결되어야 합니다", + "ORG_ZSTACK_CONSOLE_10000": "Ansible 개인 키 파일을 찾을 수 없습니다. 개인 키 파일 경로가 올바르고 접근 가능한지 확인하십시오", + "ORG_ZSTACK_COMPUTE_VM_10285": "VM[uuid=%s]에서 volume[uuid=%s] 분리 실패", + "ORG_ZSTACK_COMPUTE_VM_10284": "VM이 [%s] 상태에 있을 때는 볼륨 분리가 허용되지 않습니다", + "ORG_ZSTACK_COMPUTE_VM_10283": "ISO[uuid:%s]가 VirtualMachine[uuid:%s]에 연결되어 있지 않습니다", + "ORG_ZSTACK_COMPUTE_VM_10282": "hypervisor에서 vm[uuid=%s] 업데이트 실패: 특정 속성 수정 실패", + "ORG_ZSTACK_CONSOLE_10004": "가상 머신에 대한 콘솔 프록시 재연결 실패. 네트워크 연결을 확인하고 가상 머신이 실행 중인지 확인하십시오", + "ORG_ZSTACK_COMPUTE_VM_10281": "hypervisor 노드에서 vm[uuid=%s] 업데이트 실패", + "ORG_ZSTACK_CONSOLE_10003": "콘솔 프록시 재정의 IP [code:%d] 또는 콘솔 프록시 포트 [code:%d] 구성 실패", + "ORG_ZSTACK_COMPUTE_VM_10280": "가상 머신을 생성할 수 없습니다. 이름 [%s]인 가상 머신이 이미 존재합니다", + "ORG_ZSTACK_CONSOLE_10002": "해당 포트를 사용하는 다른 프로세스가 있습니다: %s", + "ORG_ZSTACK_CONSOLE_10001": "잘못된 관리 노드 ID[%s]", + "ORG_ZSTACK_CONSOLE_10008": "콘솔 프록시 가용성을 확인할 수 없습니다: %s", + "ORG_ZSTACK_CONSOLE_10007": "VNC 연결 수립: 예기치 않은 URI: %s", + "ORG_ZSTACK_COMPUTE_VM_10288": "하나의 VM이 %s개의 CD-ROM을 생성할 수 없습니다; VM은 최대 %s개의 CD-ROM만 연결할 수 있습니다", + "ORG_ZSTACK_CONSOLE_10009": "작업 오류, 원인: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10029": "호스트가 비활성화되어 있어 확장 작업이 허용되지 않습니다. 이 작업을 수행하기 전에 호스트가 활성화되어 있는지 확인하십시오", + "ORG_ZSTACK_STORAGE_VOLUME_10028": "메모리 할당의 최소 증가 크기는 4MB보다 커야 합니다", + "ORG_ZSTACK_STORAGE_VOLUME_10025": "가상 머신에 대해 읽기/쓰기 대역폭 제한과 총 대역폭 제한을 동시에 설정할 수 없습니다. 제한 유형을 하나만 지정하십시오", + "ORG_ZSTACK_STORAGE_VOLUME_10024": "인스턴스에 대해 읽기/쓰기 IOPS 제한과 총 IOPS 제한을 동시에 구성할 수 없습니다. IOPS 제한 유형을 하나만 지정하십시오", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10023": "JIT 보안이 활성화된 상태에서 속성 검색 중 처리되지 않은 예외 발생: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10027": "[%s] volume[uuid:%s]의 크기를 축소할 수 없습니다", + "ORG_ZSTACK_STORAGE_VOLUME_10026": "볼륨 대역폭은 null일 수 없습니다; 유효한 볼륨 대역폭 값을 지정하십시오", + "ORG_ZSTACK_STORAGE_VOLUME_10021": "volume[uuid:%s]이(가) 루트 볼륨이 아닙니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10022": "JIT 보안 머신 속성 가져오기 실패, 상태 코드: %s, 세부 정보: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10020": "UUID: %s 및 VM 인스턴스 UUID: %s인 볼륨을 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_VOLUME_10023": "가상 머신 인스턴스에서 레거시와 새 매개 변수 세트를 동시에 구성할 수 없습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10022": "SharedVolume은 대역폭 설정을 지원하지 않습니다.", + "ORG_ZSTACK_COMPUTE_VM_10293": "%s의 이미지 크기를 결정할 방법이 없습니다. 예외를 보고해 주세요.", + "ORG_ZSTACK_STORAGE_VOLUME_10035": "분리된 볼륨만 지원합니다. 대신 SetVmBootVolumeMsg를 사용하세요.", + "ORG_ZSTACK_ZWATCH_PROMETHEUS_10000": "Host[uuid:%s]이(가) 클라우드 데이터베이스에서 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_VOLUME_10038": "hypervisor[%s]가 단일 VM에 최대 %s개의 데이터 볼륨만 지원하도록 제한합니다. 이 VM [uuid:%s]에는 %s개의 데이터 볼륨이 연결되어 있습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10032": "볼륨 재초기화를 위한 이미지 캐시 [Image UUID: %s]를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_VOLUME_10031": "공유 볼륨[uuid: %s]이(가) 정지되지 않은 VM 인스턴스에 연결되어 있습니다[uuids: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10034": "volume[uuid:%s]이(가) 인스턴스에 연결되어야 합니다.", + "ORG_ZSTACK_STORAGE_VOLUME_10033": "볼륨 [UUID: %s, name: %s]이(가) 여전히 사용 중이므로 삭제할 수 없습니다. 삭제를 시도하기 전에 볼륨이 삭제되었는지 확인하세요.", + "ORG_ZSTACK_STORAGE_VOLUME_10030": "호스트 비활성 상태로 인해 확장 작업이 허용되지 않습니다", + "ORG_ZSTACK_LOGIN_10033": "현재 환경에 LDAP/AD 서버가 구성되어 있지 않습니다. 먼저 LDAP/AD 서버를 구성하세요.", + "ORG_ZSTACK_LOGIN_10032": "이 LDAP UID %s를 가상 사용자 ID [uuid:%s]에 바인딩할 수 없습니다", + "ORG_ZSTACK_LOGIN_10034": "이 UID는 이미 사용 중입니다. 다른 UID를 선택하세요.", + "ORG_ZSTACK_LOGIN_10030": "잘못된 속성입니다. 속성[%s]이(가) 필수이지만 가상 머신 구성에서 일치하지 않는 일부 레코드가 발견되었습니다. 모든 속성이 올바르게 지정되고 모든 가상 머신 리소스가 제대로 구성되었는지 확인하세요.", + "ORG_ZSTACK_STORAGE_CDP_10091": "잘못된 최대 용량[%d], 현재 사용률은 %d입니다", + "ORG_ZSTACK_STORAGE_CDP_10089": "백업 스토리지[uuid: %s]에 대한 호스트 이름을 찾을 수 없습니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10009": "암호화 기능이 활성화되어 있지만 자동 로그인을 위한 리소스 풀[%s]이(가) 구성되어 있지 않습니다.", + "ORG_ZSTACK_SSO_SAML2_10001": "ID 제공자 메타데이터가 잘못된 Base64입니다(디코딩된 콘텐츠가 비어 있음).", + "ORG_ZSTACK_SSO_SAML2_10002": "Base64 인코딩에서 ID 제공자 메타데이터를 디코딩하지 못함", + "ORG_ZSTACK_SSO_SAML2_10000": "IDP 메타데이터가 구성되지 않았습니다. 유효한 메타데이터를 제공하세요.", + "ORG_ZSTACK_ZSV_10002": "스냅샷 그룹을操作하기 전에 공유 볼륨 또는 LUN 장치를 분리하세요.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10000": "보안 인스턴스에 대한 클라이언트가 없습니다[model=%s]", + "ORG_ZSTACK_ZSV_10001": "볼륨 %s에 여전히 스냅샷 그룹이 있으므로 삭제할 수 없습니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10001": "보안 머신[type=%s]에 대한 보안 머신 클라이언트 팩토리가 없습니다", + "ORG_ZSTACK_ZSV_10000": "볼륨 %s에 VM %s와 연결된 스냅샷 그룹이 still 존재합니다. 따라서 다른 VM에 연결할 수 없습니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10002": "SecurityMachineManagerImpl: 인스턴스 %s에 대해 SecurityMachineEncrypt 실패", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_HTTP_10001": "HTTP 템플릿 저장 오류입니다. 템플릿 내용을 확인하세요: %s", + "ORG_ZSTACK_STORAGE_CDP_10097": "VM 생성 작업이 취소되었습니다. 매개변수를 확인하고 다시 시도하세요.", + "ORG_ZSTACK_STORAGE_CDP_10095": "작업 복원 취소: 변경 사항 복원 작업이 취소되었습니다. 다시 복원을 시도하기 전에 모든 종속 작업이 완료되었는지 확인하세요.", + "ORG_ZSTACK_ACCESSKEY_10002": "[Account ID: %s, User ID: %s]은(는) 유효한 계정 또는 IAM2 프로젝트/사용자가 아닙니다", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10019": "섀시[uuid:%s]에 대한 연결을 설정하지 못했습니다. ipmi 구성을 확인하세요.", + "ORG_ZSTACK_ACCESSKEY_10001": "지정된 Access Key가 필요한 경우, AccessKeyID와 AccessKeySecret을 동시에 제공해야 합니다.", + "ORG_ZSTACK_ACCESSKEY_10004": "[account ID: %s, user ID: %s]의 accessKey 수가 최대 제한을 초과합니다", + "ORG_ZSTACK_ACCESSKEY_10000": "[accountUuid:%s, userUuid:%s]에 대해 작업을 수행할 권한이 없습니다", + "ORG_ZSTACK_TEST_10008": "저는 오류 목록에 있으면 안 됩니다", + "ORG_ZSTACK_TEST_10009": "저도 오류로 나열되어서는 안 됩니다.", + "ORG_ZSTACK_TEST_10006": "다른 연결 보안 머신 작업이 실행 중입니다. 새 작업을 취소하고 완료될 때까지 기다리세요.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10020": "securityMachine이 비활성화되었습니다. 하트비트를 감지하지 못했습니다. securityMachine이 활성화되어 있고 제대로 구성되어 있는지 확인하세요.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10029": "%s 인스턴스 하트비트 감지 실패", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10026": "%s 하트비트 감지 예외", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10027": "암호 해독 데이터[%s] 또는 암호화 알고리즘 유형[%s]이 null입니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10028": "유효하지 않은 암호 해독 알고리즘 유형: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10021": "서비스 제공 리소스 풀에 동기화된 보안 가상 머신이 하나 이상 있으므로 암호화 기능을 비활성화할 수 없습니다. 암호화 기능을 비활성화하기 전에 동기화된 보안 가상 머신 수를 0으로 줄이세요.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10022": "%d로 인해 저도 오류 목록에 있으면 안 됩니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10024": "의도적으로 %d", + "ORG_ZSTACK_TEST_10004": "API 리소스를 삭제할 수 없습니다", + "ORG_ZSTACK_TEST_10005": "저는 오류 목록에 있으면 안 됩니다 %d", + "ORG_ZSTACK_SNS_SYSTEM_10002": "알 수 없는 암호화 유형[%s]", + "ORG_ZSTACK_TEST_10003": "비밀 리소스 풀[%s]에 대한 모델을 찾을 수 없습니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10019": "현재 상태[%s]에서는 수동 상태 수정이 허용되지 않습니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10014": "암호화 기능이 활성화된 경우 모든 보안 VM을 비활성화할 수 없습니다. 최소 하나의 보안 VM이 활성화되어 있는지 확인하세요.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10015": "리소스 풀 UUID가 인증에 구성되어 있는지 확인하세요.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10016": "암호화 기능이 활성화되어 있지만 데이터 보호를 위한 리소스 풀[%s]이 구성되지 않았습니다.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10017": "모델[%s] 유형[%s] 클라이언트 및 서버 가용성 확인 예외", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10010": "에이전트 버전을 찾을 수 없습니다. 그레이스케일 업그레이드 중 클러스터 OS 업그레이드는 지원되지 않습니다. 업그레이드 프로세스를 시작하기 전에 에이전트 버전이 설치되어 있는지 확인하세요.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10013": "", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10003": "SSH 연결을 설정하지 못했습니다. 클라우드 인스턴스 설정과 네트워크 구성을 확인해 주세요.", + "ORG_ZSTACK_AI_VM_10006": "UUID: %s로 모델 서비스 인스턴스 그룹을 찾을 수 없습니다. 모델 서비스 인스턴스를 저장하지 못했습니다", + "ORG_ZSTACK_AI_VM_10007": "모델 서비스 배포 컨텍스트에 대해 vm 인스턴스, config yaml 또는 service yaml이 null입니다: %s", + "ORG_ZSTACK_AI_VM_10008": "인스턴스 %s에 대해 배포 컨텍스트 또는 가상 머신이 null입니다", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10000": "%s를 %s로 복제할 수 없습니다, 오류: %s", + "ORG_ZSTACK_AI_VM_10009": "작업을 취소하지 못했습니다, %s", + "ORG_ZSTACK_SNS_SYSTEM_10000": "관련 리소스로 인해 시스템 알람 토픽을 삭제할 수 없습니다. 삭제를 다시 시도하기 전에 모든 종속 리소스가 제거되었는지 확인해 주세요.", + "ORG_ZSTACK_AI_VM_10002": "분산 모델 서비스에 필요한 기본 L3 네트워크[UUID: %s]에서 VM NIC의 IP를 찾을 수 없습니다", + "ORG_ZSTACK_SNS_SYSTEM_10001": "HTTP 엔드포인트만 API 토픽을 구독할 수 있습니다; 제공된 엔드포인트[type:%s]는 유효한 HTTP 엔드포인트가 아닙니다", + "ORG_ZSTACK_AI_VM_10003": "ModelServiceSession은 null일 수 없습니다. 클라우드 모델 서비스에 대해 유효한 세션이 설정되었는지 확인해 주세요.", + "ORG_ZSTACK_AI_VM_10004": "모델 서비스에 대한 YAML 구성을 파싱할 수 없습니다, 서비스 정의: %s", + "ORG_ZSTACK_AI_VM_10000": "이미지[uuid: %s]를 찾을 수 없습니다", + "ORG_ZSTACK_AI_VM_10001": "YAML에서 이미지 UUID를 가져올 수 없습니다: %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10015": "네트워크[%s]가 HA 그룹[%s]에 추가되었습니다.", + "ORG_ZSTACK_ROUTEPROTOCOL_10014": "네트워크[%s]가 가상 라우터 영역[%s]에 추가되었습니다.", + "ORG_ZSTACK_ROUTEPROTOCOL_10017": "라우터 ID[%s]는 이 클라우드 시스템 내에서 고유하지 않습니다", + "ORG_ZSTACK_ROUTEPROTOCOL_10016": "라우터 ID[%s]는 IPv4 형식을 준수하지 않습니다", + "ORG_ZSTACK_AI_VM_10011": "빈 인스턴스 URL로 인해 인스턴스에서 상태를 검색할 수 없습니다. 유효한 인스턴스 URL을 제공하고 다시 시도해 주세요.", + "ORG_ZSTACK_HYBRID_BACKUP_10000": "%s는 클라우드 환경의 관리 계정에서만 호출할 수 있습니다.", + "ORG_ZSTACK_EXTERNALSERVICE_CRONJOB_10001": "cron 데몬이 실행되고 있지 않습니다. 시작되고 올바르게 구성되었는지 확인해 주세요.", + "ORG_ZSTACK_ROUTEPROTOCOL_10003": "[%s]는 IPv4 주소 형식을 준수하지 않습니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10030": "클라우드 환경의 모든 가상 머신에 대해 check-all-security-machine-token-sync가 실패했습니다. 보안 토큰과 머신 구성을 확인해 주세요.", + "ORG_ZSTACK_ROUTEPROTOCOL_10008": "AreaId[%s]가 이미 프로비저닝되었습니다.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10031": "FlkSecClientFactory 연결 테스트가 실패했습니다.", + "ORG_ZSTACK_ROUTEPROTOCOL_10009": "인증 유형이 %s일 때 KeyID와 비밀번호는 null이 아니어야 합니다.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10027": "보안 머신 %s의 데이터 보호 토큰을 생성하지 못했습니다: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10029": "보안 인스턴스 %s의 암호화 결과를 가져오지 못했습니다: %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10011": "인증 유형이 %s일 때 비밀번호 길이는 8바이트를 초과하지 않아야 합니다.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10028": "보안 머신 %s의 HMAC 토큰을 생성하지 못했습니다: %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10010": "인증 유형이 %s일 때 비밀번호는 null이 아니어야 합니다.", + "ORG_ZSTACK_ROUTEPROTOCOL_10013": "모든 네트워크는 가상 라우터 [%s]와 연결되어야 합니다", + "ORG_ZSTACK_ROUTEPROTOCOL_10012": "AreaId[%s]는 유효한 영역 식별자여야 합니다", + "ORG_ZSTACK_ALIYUN_IDENTITYZONE_10000": "요청한 리소스에 대한 아이덴티티 Credentials을 찾을 수 없습니다. 유효한 access key와 secret key를 제공했는지 확인해 주세요.", + "ORG_ZSTACK_STORAGE_CDP_10005": "BackupStorage[uuid: %s]가 이미 삭제되었습니다", + "ORG_ZSTACK_STORAGE_CDP_10001": "kvmagent가 %d번 동안 응답이 없습니다", + "ORG_ZSTACK_STORAGE_CDP_10004": "Cloud Deployment Pipeline 작업[uuid: %s]에 대한 가상 머신을 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_CDP_10000": "KVM agent가 재시작되었습니다. 가상 머신에 영향이 있는지 확인해 주세요.", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10011": "하드웨어 VXLAN 네트워크는 하드웨어 VXLAN 풀 내에서만 생성할 수 있습니다.", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10010": "하드웨어 VXLAN 풀 내에서는 하드웨어 VXLAN 네트워크만 생성할 수 있습니다.", + "ORG_ZSTACK_STORAGE_CDP_10016": "호스트 [UUID: %s]의 libvirt는 CDP 작업 생성을 지원하지 않습니다. libvirt 버전을 확인해 주세요.", + "ORG_ZSTACK_HYBRID_DATACENTER_10003": "데이터 센터 [%s]가 현재 동기화 중입니다. 잠시 기다려 주세요.", + "ORG_ZSTACK_STORAGE_CDP_10017": "호스트 [UUID: %s]의 qemu는 CDP 작업 생성을 지원하지 않습니다. qemu 버전을 확인해 주세요.", + "ORG_ZSTACK_HYBRID_DATACENTER_10002": "aliyun에 지정된 유효하지 않은 지역: %s", + "ORG_ZSTACK_STORAGE_CDP_10018": "VM[uuid:%s]에서 실행 중인 QEMU 버전은 mirrorBitmap 기능을 지원하지 않습니다. 호환되는 QEMU 버전을 사용하고 있는지 확인해 주세요.", + "ORG_ZSTACK_STORAGE_CDP_10012": "query-mirror: VM[uuid:%s]에 대한 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_AI_EVALUATION_10000": "데이터베이스에서 UUID: %s의 그룹을 찾을 수 없습니다.", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10002": "KVM 호스트[uuid:%s]에서 하드웨어 디바이스[uuid:%s, type:%s, vlan:%s]에 대한 vxlan 네트워크 브리지[%s] 생성 실패, 원인: %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10001": "SDN 컨트롤러 타입:%s에 대한 SDN 컨트롤러 팩토리가 없습니다", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10000": "VXLAN 풀 [uuid:%s]에 대한 SDN 컨트롤러가 없습니다", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10006": "UUID [%s]의 VM에 대해 대상 호스트 UUID [%s]에서 VXLAN 네트워크를 구성할 수 없습니다", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10005": "SDN 컨트롤러 %s를 찾을 수 없습니다", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10003": "KVM 호스트[uuid:%s]에서 하드웨어Vxlan[uuid:%s, name:%s]에 대한 브리지[%s] 확인 실패, %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10009": "하드웨어 VXLAN 네트워크 풀은 물리적 인터페이스 %s를 구성해야 합니다", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10008": "하드웨어 VXLAN 네트워크 풀은 L3 네트워크 생성을 지원하지 않습니다", + "ORG_ZSTACK_HYBRID_DATACENTER_10001": "regionId [%s]가 access key [%s]에 의해 이미 생성되었습니다", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10007": "KVM 호스트[uuid:%s]에서 HardwareVxlanPool [uuid: %s, name: %s]에 대한 물리적 네트워크 인터페이스 확인 실패, %s", + "ORG_ZSTACK_HYBRID_DATACENTER_10000": "지원되지 않는 dcType [%s]", + "ORG_ZSTACK_STORAGE_CDP_10027": "유효하지 않은 시간 문자열: %s, ISO offset 형식(예: %s)에 따라 서식 지정해야 합니다", + "ORG_ZSTACK_STORAGE_CDP_10023": "가상 머신 인스턴스가 현재 CDP(Continuous Data Protection) 작업을 실행 중입니다. 볼륨 연결이 전체 백업에 필요한 계획된 크기를 초과합니다. CDP 작업 크기를 조정하고 다시 시도해 주세요.", + "ORG_ZSTACK_STORAGE_CDP_10024": "볼륨[%s]에 대한 VM[%s]이 현재 CDP(Continuous Data Protection)를 실행 중이므로 현재 크기 조정이 불가능합니다.", + "ORG_ZSTACK_STORAGE_CDP_10025": "CDP 태스크[uuid: %s]가 비정상적인 상태 변경을 감지했습니다. 이전 상태: %s, 새 상태: %s, 원인: %s.", + "ORG_ZSTACK_STORAGE_CDP_10026": "CDP 태스크가 아직 활성 상태입니다", + "ORG_ZSTACK_STORAGE_CDP_10022": "CDP 태스크를 찾을 수 없습니다[uuid:%s]", + "ORG_ZSTACK_AI_EVALUATION_10001": "그룹[uuid: %s, type:%s]에 일치하는 백엔드 인스턴스가 존재하지 않습니다", + "ORG_ZSTACK_AI_EVALUATION_10002": "제공된 모델 서비스 그룹 UUID를 사용하여 Model Service Instance Group VO를 찾을 수 없습니다. 이는 평가 작업을 실행하는 관련 서비스 그룹을 찾을 수 없음을 의미합니다. 결과적으로 작업은 완료된 것으로 표시되지 않고 중간 상태로 유지됩니다. 작업은 자동으로 '실패'로 업데이트되고 오류가 문서화됩니다.", + "ORG_ZSTACK_LOGINCONTROL_10002": "잘못된 규칙 표현식, 액세스 제어 규칙 추가 실패: %s", + "ORG_ZSTACK_LOGINCONTROL_10005": "인식할 수 없는 키: %s", + "ORG_ZSTACK_LOGINCONTROL_10006": "%s 리소스 구성에 대한 키:값이 누락되었습니다", + "ORG_ZSTACK_PORTAL_APIMEDIATOR_10008": "resourceUuid[%s]가 유효한 UUID가 아닙니다. 유효한 UUID(v4 권장)는 하이픈 없이 형식화되어야 하며 정규식 '[0-9a-f]{8}[0-9a-f]{4}[1-5][0-9a-f]{3}[89ab][0-9a-f]{3}[0-9a-f]{12}'와 일치해야 합니다. 자세한 내용은 http://en.wikipedia.org/wiki/Universally_unique_identifier를 참조하세요.", + "ORG_ZSTACK_LOGINCONTROL_10007": "비밀번호 강도 구성 설정의 형식이 올바르지 않습니다", + "ORG_ZSTACK_LOGINCONTROL_10008": "최소값이 최대값보다 클 수 없습니다", + "ORG_ZSTACK_STORAGE_CDP_10039": "백업 스토리지를 찾을 수 없습니다[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10034": "클라우드 컴퓨팅 환경에서 예기치 않은 태스크 유형[uuid: %s, type: %s]", + "ORG_ZSTACK_STORAGE_CDP_10035": "Cloud Data Protection 태스크[uuid: %s]의 최대 용량을 찾을 수 없습니다. 업데이트해주세요.", + "ORG_ZSTACK_STORAGE_CDP_10036": "CDPSessionTask[uuid: %s]의 최대 지연 시간을 찾을 수 없습니다. 업데이트해주세요.", + "ORG_ZSTACK_STORAGE_CDP_10037": "VM[uuid: %s]이(가) 이미 종료되었습니다", + "ORG_ZSTACK_STORAGE_CDP_10031": "VM이 종료되지 않았습니다, 현재 상태: %s", + "ORG_ZSTACK_STORAGE_CDP_10032": "공유 볼륨[%s]이(가) 다른 가상 머신에서仍然 사용 중입니다.", + "ORG_ZSTACK_STORAGE_CDP_10033": "태스크를 찾을 수 없습니다[uuid: %s]", + "ORG_ZSTACK_LOGINCONTROL_10012": "가상 환경에 이름: %s, 유형: %s의 사용 가능한 사용자가 없습니다", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10011": "API 요청에서 IPMI chassis 유형을 지정했지만, 수신된 메시지가 APICreateBareMetal2ChassisHardwareInfoMsg 유형이 아닙니다. 메시지 유형이 지정된 chassis 유형과 일치하는지 확인해주세요.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10012": "알 수 없는 baremetal chassis에 대한 하드웨어 정보를 수신했습니다[ipmi_addr:%s, ipmi_port:%d]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10010": "파일에서 BareMetal2 IPMI chassis 정보를 로드하지 못했습니다. 원인: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10015": "baremetal2 IPMI chassis[uuid:%s] 전원 리셋 실패", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10016": "인스턴스 원격 IPXE 부팅 실패[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10013": "baremetal2 IPMI chassis 전원 켜기 실패[UUID:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10014": "baremetal2 IPMI chassis 전원 끄기 실패[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10049": "VM [UUID: %s]이(가) 이미 CDP 태스크를 시작했습니다. 따라서 백업 작업을 동시에 생성할 수 없습니다.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10008": "Windows Local Disk Bare Metal 인스턴스는 가상 머신의 자동 생성을 지원하지 않습니다.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10009": "클러스터[uuid:%s]에서 사용 가능한 baremetal2 게이트웨이가 없습니다", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10006": "Cluster[uuid:%s]는 BareMetal2 가상화 환경이 아닙니다.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10007": "Cluster[uuid:%s]가 활성화되어 있지 않습니다.", + "ORG_ZSTACK_STORAGE_CDP_10045": "필수 인수가 누락되었습니다: %s", + "ORG_ZSTACK_STORAGE_CDP_10046": "일일 보존 시간과 일일 RP 생성 일수는 같을 수 없습니다. 서로 다른 값으로 설정해 주세요.", + "ORG_ZSTACK_STORAGE_CDP_10047": "가상 머신 UUID가 하나 필요하지만 %d개가 제공되었습니다.", + "ORG_ZSTACK_STORAGE_CDP_10048": "리소스 [uuid: %s]는 가상 머신 인스턴스가 아닙니다.", + "ORG_ZSTACK_STORAGE_CDP_10041": "백업 스토리지 [UUID: %s]가 클라우드 환경에 연결되어 있지 않습니다. 올바르게 구성 및 통합되어 있는지 확인해 주세요.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10005": "Cluster[uuid:%s]는 베어메탈 클러스터 구성이 아닙니다.", + "ORG_ZSTACK_STORAGE_CDP_10042": "VM [UUID: %s]에 이미 백업 작업이 생성되어 있어, 동시에 연속 데이터 보호(CDP) 작업을 활성화할 수 없습니다.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10007": "IPMI 주소와 포트가 이미 존재합니다.", + "ORG_ZSTACK_STORAGE_CDP_10044": "가상 리소스 할당은 물리적 리소스 할당보다 커야 합니다.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10001": "베어메탈 서버에 연결하려면 다음을 확인해 주세요: 1. IPMI 인터페이스가 활성화되어 있는지 확인; 2. IPMI 주소, 포트, 사용자 이름 및 비밀번호가 정확한지 확인; 3. BIOS 설정에서 IPMI over LAN이 활성화되어 있는지 확인.", + "ORG_ZSTACK_STORAGE_CDP_10040": "백업 스토리지[uuid: %s]가 클라우드 환경에서 비활성화되어 있습니다.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10009": "UUID가 %s인 베어메탈 섀시는 UUID가 %s인 pxeserver를 사용하도록 구성되어 있지만, DHCP 요청은 실제로 UUID가 %s인 pxeserver에서 처리되었습니다.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10008": "cluster[uuid:%s]에 연결된 사용 가능한 베어메탈 PXE 서버가 없습니다.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10000": "베어메탈 IPMI 2 섀시 %s에 두 개의 기존 항목이 있습니다.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10001": "IPMI 주소 %s가 유효하지 않습니다.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10004": "IPMI 주소 %s 및 포트 %d를 가진 베어메탈 섀시가 이미 생성되어 있습니다.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10005": "Cluster[uuid:%s]이(가) 존재하지 않습니다.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10002": "베어메탈 노드와의 연결을 수립하지 못했습니다. 다음을 확인해 주세요: 1. IPMI 연결이 활성화되어 있습니다; 2. IPMI 주소, 포트, 사용자 이름 및 비밀번호가 올바릅니다; 3. BIOS 설정에서 IPMI over LAN이 활성화되어 있습니다.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10003": "IPMI 주소 %s 및 포트 %d를 가진 BareMetal2 섀시가 이미 생성되어 있습니다.", + "ORG_ZSTACK_STORAGE_CDP_10056": "여러 개의 루트 디스크가 발견되었습니다: %s", + "ORG_ZSTACK_STORAGE_CDP_10058": "VM 백업을 위한 루트 볼륨을 찾지 못했습니다.%s", + "ORG_ZSTACK_STORAGE_CDP_10059": "볼륨 %s가 백업에 포함되어 있지만 VM [UUID: %s]에서 분리되어 있습니다. VM에 다시 연결하거나 백업 세트에서 제거해 주세요.", + "ORG_ZSTACK_STORAGE_CDP_10053": "VM[uuid: %s]에 대한 Cloud Drive Provisioning 작업을 찾지 못했습니다.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10015": "베어메탈 섀시[uuid:%s]의 원격 전원 켜기에 실패했습니다.", + "ORG_ZSTACK_STORAGE_CDP_10054": "VM[uuid: %s]에 대한 CDP 작업이 Backstore[uuid: %s]에서 찾지 못했습니다.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10018": "인스턴스[uuid:%s]의 원격 PXE 부팅에 실패했습니다.", + "ORG_ZSTACK_STORAGE_CDP_10055": "recoverVm: 가상Machine[uuid: %s]에 대한 host[uuid: %s]를 찾지 못했습니다.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10017": "베어메탈 섀시[uuid:%s]의 원격 전원 리셋에 실패했습니다.", + "ORG_ZSTACK_STORAGE_CDP_10050": "볼륨 스냅샷 기능에 대해 기본 저장소 [uuid:%s]를 요청할 수 없습니다. 세부 사항 [%s]을 참조하세요", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10014": "베어메탈 chassis %s 삭제 실패", + "ORG_ZSTACK_STORAGE_CDP_10051": "recoverVm: 호스트 UUID가 제공되지 않았으며 VM[uuid: %s]의 원본 호스트를 찾을 수 없습니다.", + "ORG_ZSTACK_SSHKEYPAIR_10009": "SSH 키 쌍 [uuid:%s]이 가상 머신 [uuid:%s]에 연결되지 않았습니다.", + "ORG_ZSTACK_SSHKEYPAIR_10008": "SSH 키 쌍 [uuid:%s]이 이미 가상 머신 [uuid:]에 연결되어 있습니다.", + "ORG_ZSTACK_SSHKEYPAIR_10007": "sshKeyPair[uuid:%s]이 현재 사용 중입니다.", + "ORG_ZSTACK_STORAGE_CDP_10067": "CDP 백업 %s:%d에서 루트 볼륨을 찾을 수 없습니다.", + "ORG_ZSTACK_STORAGE_CDP_10068": "CDP 백업 %s:%d에서 루트 볼륨을 찾을 수 없습니다.", + "ORG_ZSTACK_SSHKEYPAIR_10011": "SSH 키 쌍 연결에 지원되지 않는 리소스 유형 %s입니다. 허용되는 유형은 %s입니다.", + "ORG_ZSTACK_SSHKEYPAIR_10010": "vmInstance[uuid:%s]이 실행 상태가 아닙니다.", + "ORG_ZSTACK_STORAGE_CDP_10063": "VM 클라우드 배포 프로세스[uuid: %s]를 찾을 수 없습니다.", + "ORG_ZSTACK_STORAGE_CDP_10064": "클라우드 배포 파이프라인 태스크에 대한 VM 인스턴스를 찾을 수 없습니다[uuid: %s].", + "ORG_ZSTACK_STORAGE_CDP_10065": "가상 머신 백업에서 볼륨 레코드를 찾을 수 없습니다. VM 구성 및 백업 설정을 확인하세요.", + "ORG_ZSTACK_STORAGE_CDP_10066": "CDP 백업 %s:%d에서 여러 개의 루트 디스크를 찾았습니다.", + "ORG_ZSTACK_V2V_KVM_10003": "'srcVmUrl'에서 VM UUID가 누락되었습니다.", + "ORG_ZSTACK_STORAGE_CDP_10060": "예기치 않은 볼륨[uuid: %s] 크기 불일치: 예상 크기 %d바이트, 다른 크기 수신", + "ORG_ZSTACK_V2V_KVM_10004": "인스턴스에서 루트 디스크를 찾을 수 없습니다: %s", + "ORG_ZSTACK_STORAGE_CDP_10061": "볼륨[uuid: %s] 크기 조정 실패: %s", + "ORG_ZSTACK_STORAGE_CDP_10062": "볼륨[uuid: %s]에 예기치 않은 볼륨 경로가 있습니다: %s", + "ORG_ZSTACK_V2V_KVM_10007": "KVM V2V 변환 호스트 정리 실패[hostUuid:%s], 이유: %s", + "ORG_ZSTACK_STORAGE_CDP_10078": "VM[uuid: %s]에 대한 CDP 정책을 찾을 수 없습니다.", + "ORG_ZSTACK_STORAGE_CDP_10075": "그룹 ID %d로Recovery Point를 찾을 수 없습니다.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10018": "잘못된 변수: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10075": "NFS 기본 저장소[uuid:%s, name:%s]에서 작업을 수행할 연결된 호스트 클러스터를 찾을 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10077": "볼륨[uuid:%s]에 대한 호스트를 찾을 수 없습니다.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10020": "리소스 [%s]에 대한 List가 필요하지만 단일 객체를 얻었습니다.", + "ORG_ZSTACK_ZBOX_10007": "zbox[name:%s]이 Ready 상태가 아닙니다, 현재 상태는 %s입니다.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10025": "클라우드 리소스 관리 컨텍스트에서 일부 작업이 유효하지 않습니다. 매개변수를 확인하고 다시 시도하세요.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10022": "리소스 [%s]이 먼저 구성되어야 합니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10006": "대상 호스트 [UUID:%s]에 기본 저장소 [UUID:%s]에 대한 충분한 물리적 용량이 없습니다. 임계값은 %f이며 사용 가능한 물리적 용량은 %d입니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10007": "UUID [%s]가 있는 볼륨이 '준비' 상태가 아니므로 마이그레이션할 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10008": "데이터 볼륨 [UUID: %s, 이름: %s]이(가) 여전히 가상 머신 [UUID: %s]에 연결되어 있습니다. 마이그레이션을 시작하기 전에 연결을 해제하세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10009": "UUID %s가 있는 볼륨은 UUID %s가 있는 VM의 루트 볼륨입니다. 현재 VM은 %s 상태입니다. 마이그레이션을 시작하기 전에 VM을 중지하세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10002": "UUID [%s]가 있는 볼륨은 이미 UUID [%s]가 있는 호스트에 연결되어 있습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10003": "기본 스토리지 [UUID:%s]를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10004": "기본 스토리지 [UUID:%s]가 비활성화되었거나 유지 보수 중 콜드 마이그레이션이 허용되지 않습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10005": "UUID [%s]가 있는 대상 호스트는 UUID [%s]가 있는 로컬 기본 스토리지(볼륨 UUID [%s]가 있는 위치)에 속하지 않습니다.", + "ORG_ZSTACK_ZBOX_10001": "zbox[UUID:%s]가 여전히 사용 중이므로 꺼낼 수 없습니다.", + "ORG_ZSTACK_ZBOX_10002": "zbox[UUID:%s]가 준비 상태가 아니므로 용량을 동기화할 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10000": "VM [UUID:%s]의 모든 볼륨에 대해 필요한 스토리지 용량을 제공할 수 있는 호스트가 없습니다.", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10004": "Aliyun 계정 [UUID:%s]이(가) 존재하지 않습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10001": "UUID [%s]가 있는 볼륨이 로컬 기본 스토리지에도 연결되어 있지 않습니다.", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10005": "잘못된 전화번호[%s]입니다. +86-12345678901 형식인지 확인하세요", + "ORG_ZSTACK_ZBOX_10005": "zbox[UUID: %s]이(가) 삭제된 것으로 보입니다", + "ORG_ZSTACK_ZBOX_10006": "USB 장치 [uuid:%s]이(가) VM [uuid:%s]에 연결되어 있어 Zbox에 추가할 수 없습니다.", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10000": "Aliyun SMS 이벤트 텍스트 템플릿을 찾을 수 없습니다. 템플릿이 올바르게 구성되어 있는지 확인하고 다시 시도하세요.", + "ORG_ZSTACK_ZBOX_10003": "zbox의 마운트된 경로 [mountPath: %s] 내의 파일만 삭제할 수 있습니다. 그러나 [%s]이(가) 전달되었습니다.", + "ORG_ZSTACK_ZBOX_10004": "zbox[이름:%s]이(가) 준비 상태가 아닙니다. 현재 상태는 %s입니다.", + "ORG_ZSTACK_SSHKEYPAIR_10006": "SSH 키 쌍 %s이(가) 이미 업로드되었습니다.", + "ORG_ZSTACK_SSHKEYPAIR_10005": "작업 오류입니다. 이유: %s", + "ORG_ZSTACK_SSHKEYPAIR_10003": "SSH 키 쌍 [uuid:%s]을(를) 찾을 수 없기 때문에 VM [uuid:%s]과(와) 연결할 수 없습니다.", + "ORG_ZSTACK_SSHKEYPAIR_10002": "공개 키 로드 실패: %s, 오류: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10043": "InfoSecClientFactory 연결 테스트 실패", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10044": "현재 이 환경에서 %s 리소스 풀 생성을 지원하지 않습니다.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10041": "공개 키에서 주제 식별 이름 추출 실패: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10042": "모든 가상 머신에 대해 check-all-security-machine-token-exist 실패", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10040": "암호화된 공개 키 구문 분석 실패", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10058": "NFS 기본 스토리지 [uuid:%s, 이름:%s]에서 데이터 볼륨 [uuid:%s, 이름:%s]을(를) 생성할 수 있는 사용 가능한 호스트를 찾을 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10054": "vm[uuid:%s]이(가) 실행 중, 일시 중지 또는 중지 상태가 아닙니다. 현재 상태는 %s입니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10055": "UUID:%s가 있는 기본 스토리어가 어떤 클러스터에도 연결되어 있지 않습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10050": "사용 가능한 백엔드 제공자를 찾을 수 없습니다. 유효한 클라우드 제공자가 구성되어 있는지 확인하고 다시 시도하십시오.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10051": "NFS 기본 스토리지 [uuid:%s, name:%s]가 연결된 연결 상태의 호스트를 찾을 수 없습니다. 볼륨 [uuid:%s]을(를) 스냅샷 [uuid:%s, name:%s]으로 복원할 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10052": "NFS 기본 스토리지 [uuid:%s, name:%s]가 연결된 연결 상태의 호스트를 찾을 수 없습니다. 볼륨 [uuid:%s]을(를) 이미지 [uuid:%s]로 복원할 수 없습니다.", + "ORG_ZSTACK_IAM2_10019": "cron 표현식을 구문 분석할 수 없습니다. 표준 cron 형식仕様に 따라 올바르게 형식화되어 있는지 확인하십시오.", + "ORG_ZSTACK_IAM2_10018": "프로젝트[UUID: %s, name:%s]가 %s 상태에 있어 [%s] 작업이 허용되지 않습니다.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10038": "보안 어플라이언스 %s에 대한 데이터 보호 토큰 %s 생성 실패: %s", + "ORG_ZSTACK_IAM2_10015": "UUID %s인 조직을 해당 부모 조직 UUID %s의 하위 조직으로 설정할 수 없습니다.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10039": "보안 어플라이언스 %s에 대한 HMAC 토큰 %s 생성 실패: %s", + "ORG_ZSTACK_IAM2_10014": "현재 조직 [uuid:%s]이(가) 비활성 상태입니다. 활성화하십시오.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10036": "클라우드 리소스 할당을 위한 토큰 생성 실패", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10037": "보안 머신 %s에 대한 활성화된 토큰 생성 실패: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10034": "시크릿 키 가져오기 실패. 키가 올바르게 구성되어 있고 클라우드 환경에서 접근 가능한지 확인하십시오.", + "ORG_ZSTACK_IAM2_10011": "잘못된 가상 인스턴스 ID[uuid:%s]입니다. 인스턴스가 존재하지 않거나 비밀번호가 잘못되었습니다.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10005": "잘못된 형식 유형 [%s]", + "ORG_ZSTACK_IAM2_10010": "프로젝트[uuid:%s, name:%s]에 대한 계정을 찾을 수 없습니다. 클라우드 환경에 대한 올바른 권한과 자격 증명이 구성되어 있는지 확인하십시오.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10035": "테스트 키 생성 과정에서 보안 인스턴스 %s에 대한 연결이 실패했습니다: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10006": "클라우드 리소스만 지원하지만 [%s](이)가 제공되었습니다.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10032": "시크릿 키 내보내기 실패: %s", + "ORG_ZSTACK_IAM2_10013": "가상 ID가 프로젝트에 속하지 않습니다.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10003": "이러한 작업 유형을 지원할 수 없습니다: %s", + "ORG_ZSTACK_IAM2_10012": "가상 ID[name:%s]가 구성 설정으로 인해 비활성화되었습니다.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10030": "encryptSubjectDN은 null일 수 없습니다.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10031": "클라우드 인스턴스 %s에 대한 메타데이터信封 구문 분석 실패", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10002": "이러한 클라우드 리소스 유형을 지원할 수 없습니다: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10068": "NFS 기본 스토리지 [uuid:%s, name:%s]가 어떤 클러스터에도 연결되어 있지 않거나 연결된 클러스터에 연결된 호스트가 없습니다.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10009": "잘못된 유형: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10007": "Resource 또는 Action만 지원하지만 [%s](이)가 제공되었습니다.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10008": "기본값은 [%s] 유형에서 지정한 대로 JSON 형식이어야 하지만 [%s](이)가 발견되었습니다.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10029": "cipherText는 null일 수 없습니다.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10027": "암호화된 리소스에 접근하기 위한 시크릿 키를 찾을 수 없습니다. 시크릿 키가 올바르게 구성되어 있고 필요한 권한이 있는지 확인하십시오.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10028": "비밀 키를 파싱하지 못했습니다, 오류: %s", + "ORG_ZSTACK_IAM2_10022": "현재 가상 인스턴스 [ID: %s]가 유효하지 않습니다. 다시 활성화해 주세요.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10016": "잘못된 동적 변수 참조입니다. ${variable:default} 형식이어야 합니다.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10024": "큰 파일 HMAC 암호화에 실패했습니다, 코드: %s, 상세 정보: %s", + "ORG_ZSTACK_IAM2_10021": "사용자[%s]는 등록된 플랫폼 사용자가 아닙니다", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10017": "지정된 동사는 네임스페이스와 메서드를 나타내기 위해 '::'를 포함해야 합니다!", + "ORG_ZSTACK_IAM2_10024": "이전 비밀번호가 원래 비밀번호와 일치하지 않습니다. 가상 머신 ID [uuid:%s] 비밀번호를 업데이트할 수 없습니다.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10014": "잘못된 JSON 형식입니다, 원인: %s", + "ORG_ZSTACK_IAM2_10023": "관리자와 가상 인스턴스 자체만 업데이트를 수행할 수 있습니다", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10015": "속성 파일 리소스 세트를 찾을 수 없습니다!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10012": "잘못된 디코더: %s!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10013": "CloudFormation 템플릿에서 루트 요소를 찾을 수 없습니다. 템플릿 정의를 확인해 주세요!", + "ORG_ZSTACK_IAM2_10020": "조직[uuid:%s]의 할당량을 초과하므로 계정[uuid:%s]의 할당량[name:%s]을 %d으로(로) 설정할 수 없습니다.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10011": "타입은: %s이지만 예상된 타입: %s입니다", + "ORG_ZSTACK_PCIDEVICE_10058": "호스트 [%s]가 유지 관리 모드로 전환하지 못했습니다. VM [%s]은(는) PCI 장치가 있어 자동 마이그레이션할 수 없습니다.", + "ORG_ZSTACK_PCIDEVICE_10056": "모든 PCI 장치[UUIDs:%s]가 존재하지 않아 VM[UUID:%s]을(를) 시작하지 못했습니다", + "ORG_ZSTACK_PCIDEVICE_10059": "pci 장치 [uuid:%s]가 잘못된 상태로 인해 vm [uuid:%s]에 연결될 수 없습니다", + "ORG_ZSTACK_PCIDEVICE_10050": "VM[%s]에서 모든 GPU 장치를 마운트 해제하고 다시 시도해 주세요", + "ORG_ZSTACK_PCIDEVICE_10053": "지정된 PCI 장치가 동일 위치에 있지 않습니다: UUID [%s]의 PCI 장치는 UUID [%s]의 호스트에 있는 반면 다른 UUID [%s]의 PCI 장치는 다른 UUID [%s]의 호스트에 있습니다", + "ORG_ZSTACK_PCIDEVICE_10052": "VM[%s]의 다른 PCI 장치를 마운트 해제하고 다시 시도해 주세요", + "ORG_ZSTACK_PCIDEVICE_10051": "VM[%s]의 모든 GPU 장치를 마운트 해제하고 다시 시도해 주세요", + "ORG_ZSTACK_PCIDEVICE_10068": "연결된 PCI 장치가 있어 루트 볼륨 [uuid:%s]을(를) 마이그레이션할 수 없습니다", + "ORG_ZSTACK_PCIDEVICE_10066": "PCI 장치가 연결되어 있어 VM[UUID:%s]을(를) 마이그레이션할 수 없습니다", + "ORG_ZSTACK_PCIDEVICE_10061": "대상 호스트 [uuid:%s]에서 가상 머신 [uuid:%s]에 대한 사양 [uuid:%s]의 충분한 PCI 장치를 찾지 못했습니다", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10003": "ID: %s로 등록된 백업 스토리지 플러그인이 없습니다", + "ORG_ZSTACK_PCIDEVICE_10065": "vm[%s] 인스턴스가 존재하지 않습니다; PCI 장치[%s]에 바인딩할 수 없습니다", + "ORG_ZSTACK_PCIDEVICE_10064": "호스트 리소스 할당 문제로 인해 PCI 장치 [uuid:%s]을(를) VM [uuid:%s]에 연결할 수 없습니다.", + "ORG_ZSTACK_PCIDEVICE_10063": "PCI 장치 [%s]이(가) 모두 사용 가능하지 않습니다.", + "ORG_ZSTACK_PCIDEVICE_10062": "PCI 장치[uuid:%s]의 IOMMU 그룹에 문제가 있습니다", + "ORG_ZSTACK_IAM2_10008": "virtualID[uuid:%s]이(가) 프로젝트[uuid:%s] 내에 존재하지 않습니다", + "ORG_ZSTACK_IAM2_10009": "project[name:%s]가 존재하지 않습니다", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10000": "드라이버에서 null 설치 경로가 반환되었습니다: %s", + "ORG_ZSTACK_IAM2_10004": "파일에서 VirtualMachine ID 정보를 로드할 수 없습니다\\n%s", + "ORG_ZSTACK_IAM2_10003": "코드에 %d개의 문제가 있습니다.", + "ORG_ZSTACK_IAM2_10006": "파일에서 Virtual Machine ID 정보를 빌드하지 못했습니다.", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10001": "%s: 상태: %s", + "ORG_ZSTACK_IAM2_10005": "UUID [%s]가 이미 존재합니다. 다른 것을 시도해 주세요.", + "ORG_ZSTACK_MEMORY_10000": "host[%s]에서 %s의 데이터를 찾을 수 없습니다", + "ORG_ZSTACK_PCIDEVICE_10036": "VM에 연결된 호스트 [UUID:%s]의 PCI 장치를 SR-IOV 가상화할 수 없습니다", + "ORG_ZSTACK_PCIDEVICE_10035": "호스트 [UUID:%s]의 PCI 장치가 이미 SRIOV 가상화되어 있습니다.", + "ORG_ZSTACK_PCIDEVICE_10034": "호스트 [UUID:%s]에서 IOMMU가 비활성화되어 있어 장치에 SRIOV를 활성화할 수 없습니다", + "ORG_ZSTACK_PCIDEVICE_10033": "pci 장치 [uuid:%s]를 사용할 수 없습니다", + "ORG_ZSTACK_PCIDEVICE_10039": "PCI 장치 [UUID:%s]가 존재하지 않거나 SRIOV 가상화되지 않았습니다.", + "ORG_ZSTACK_PCIDEVICE_10037": "host[uuid:%s]의 %s 도메인에서 생성할 수 있는 가상 PCI 장치는 %d개뿐입니다.", + "ORG_ZSTACK_STORAGE_CDP_10109": "백업 저장소[uuid: %s]가 이미 업그레이드되었습니다", + "ORG_ZSTACK_STORAGE_CDP_10104": "작업[uuid:%s]이(가) 종료되었습니다", + "ORG_ZSTACK_STORAGE_CDP_10105": "CDP 작업이 데이터를 병합하고 있습니다. 픽업 작업을 시작하지 마세요.", + "ORG_ZSTACK_STORAGE_CDP_10106": "CDP 작업[uuid:%s]이(가) 저장소 사용량을 초과했습니다: 최대 %d GB, 사용량 %d GB.", + "ORG_ZSTACK_STORAGE_CDP_10107": "예상치 못한 VM 인스턴스 상태: %s", + "ORG_ZSTACK_STORAGE_CDP_10102": "CDP 작업[uuid: %s]에 연결된 가상 머신이 없습니다", + "ORG_ZSTACK_PCIDEVICE_10047": "pci 장치 [uuid:%s]가 관리 장치로 가상화되지 않았습니다", + "ORG_ZSTACK_PCIDEVICE_10045": "pci 장치 [uuid:%s]를 mdev 사양 [uuid:%s]으로 가상화할 수 없습니다", + "ORG_ZSTACK_PCIDEVICE_10044": "PCI 장치 [UUID:%s]를 MDEV로 가상화할 수 없습니다. 활성화되어 있고 분리되어 있는지 확인하세요.", + "ORG_ZSTACK_PCIDEVICE_10049": "PCI 장치 [UUID:%s]가 연결된 호스트 [UUID:%s]가 연결되어 있지 않습니다.", + "ORG_ZSTACK_PCIDEVICE_10048": "[UUID:%s]에서 생성된 PCI 장치가 여전히 VM 인스턴스에 연결되어 있습니다.", + "ORG_ZSTACK_STORAGE_CDP_10119": "예상하지 못한 작업 유형: %s", + "ORG_ZSTACK_PCIDEVICE_10043": "PCI 장치[%s]의 가상 기능이 사용 중이므로 할당을 취소할 수 없습니다.\\n세부 정보:\\n%s", + "ORG_ZSTACK_PCIDEVICE_10042": "PCI 장치[%s]의 할당을 취소할 수 없습니다. GPU 또는 네트워크 인터페이스 컨트롤러가 아니기 때문입니다.", + "ORG_ZSTACK_PCIDEVICE_10041": "가상 PCI 장치가 VM에 연결되어 있으므로 호스트 [uuid:%s]에서 가상 PCI 장치를 생성 취소할 수 없습니다.", + "ORG_ZSTACK_PCIDEVICE_10040": "호스트 [uuid:%s]가 연결되지 않았으므로 pci 장치 [uuid:%s]의 할당을 취소할 수 없습니다", + "ORG_ZSTACK_STORAGE_CDP_10117": "CDP 태스크[uuid: %s]를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_CDP_10118": "CDP 태스크[uuid: %s]의 상태가 비정상적으로 변경되었습니다. 이전 상태: %s, 새 상태: %s - 저장 공간 할당량을 초과했습니다. 현재: %d, 할당량: %d.", + "ORG_ZSTACK_STORAGE_CDP_10111": "백업 저장소[UUID: %s]의 QEMU-img 버전을 업그레이드해야 합니다.", + "ORG_ZSTACK_STORAGE_CDP_10112": "VM에 대한 클라우드 데이터 보호 작업을 찾을 수 없습니다: %s", + "ORG_ZSTACK_STORAGE_CDP_10113": "가상 머신에 구성된 백업 저장소가 없습니다: %s", + "ORG_ZSTACK_STORAGE_CDP_10114": "클라우드 환경에서 타입[%s]의 CdpBackupFactory를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_CDP_10110": "백업 저장소[UUID: %s]의 아키텍처는 연속 데이터 보호 작업 업그레이드를 지원하지 않습니다", + "ORG_ZSTACK_IDENTITY_10072": "계정[식별자: %s]의 할당량[name: %s]을 업데이트할 수 없습니다", + "ORG_ZSTACK_IDENTITY_10071": "할당량[uuid:%s, type:%s]에 대한 할당량 업데이트 확인자를 찾을 수 없습니다", + "ORG_ZSTACK_AI_CONTAINER_10001": "uuid %s를 가진 모델 센터를 클라우드 환경에서 찾을 수 없습니다", + "ORG_ZSTACK_AI_CONTAINER_10005": "서비스 URL을 가져오지 못했습니다. 서비스 IP 주소가 null일 수 있습니다. Kubernetes 네트워크 구성을 확인하십시오.", + "ORG_ZSTACK_AI_CONTAINER_10004": "클라우드 환경에서 Kubernetes 서비스를 생성하지 못했습니다", + "ORG_ZSTACK_AI_CONTAINER_10003": "클라우드 컴퓨팅 리소스 제약 또는 구성 문제로 인해 네임스페이스 %s에서 애플리케이션 %s에 대한 Kubernetes Deployment를 생성하지 못했습니다. 리소스 할당 및 배포 구성을 확인하십시오.", + "ORG_ZSTACK_AI_CONTAINER_10009": "UUID %s를 가진 엔드포인트를 찾을 수 없어 데이터베이스에서 컨테이너 리소스를 동기화할 수 없습니다", + "ORG_ZSTACK_AI_CONTAINER_10007": "Kubernetes 클러스터에서 스토리지 서비스를 초기화하지 못했습니다", + "ORG_ZSTACK_AI_CONTAINER_10006": "배포 모델 서비스 인스턴스 %s에 대한 네트워크 정책을 생성하지 못했습니다", + "ORG_ZSTACK_TAG2_10011": "리소스[uuid:%s]가 %d개의 태그와 연결되어 있어 추가 태그를 수용할 수 없습니다", + "ORG_ZSTACK_IDENTITY_10063": "문에는 빈이 아닌 action 필드가 있어야 합니다. 잘못된 문[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10006": "zone[uuid: %s]에 URL %s를 가진 NFS 주 저장소가 있습니다", + "ORG_ZSTACK_IDENTITY_10062": "문은 action 필드를 지정해야 합니다. 잘못된 문[%s]", + "ORG_ZSTACK_IDENTITY_10061": "문은 값을 할당하거나 상태에 영향을 미쳐야 합니다. 잘못된 문[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10008": "네트워크 인터페이스와 연결된 CIDR 블록이 여러 개 발견되었습니다. 단일 CIDR 블록을 지정하거나 네트워크 구성을 확인하십시오.", + "ORG_ZSTACK_IDENTITY_10060": "그룹[name: %s, uuid: %s]이(가) 계정[uuid: %s]과(와) 연결되어 있지 않습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10009": "잘못된 CIDR 블록: %s", + "ORG_ZSTACK_IDENTITY_10067": "관리자 계정의 이름은 업데이트할 수 없습니다. 계정 정보를 수정하기 위해 올바른 구성과 매개변수를 사용하고 있는지 확인하십시오. 자세한 내용은 공식 문서를 참조하십시오.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10002": "지정된 배치 그룹[uuid: %s]에서 연결된 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_IDENTITY_10066": "제공된 암호가 계정[UUID: %s]의 현재 암호와 일치하지 않습니다. 정확성을 확인하고 다시 시도하십시오.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10003": "NFS 주 저장소[uuid:%s]에 대한 명령을 실행할 연결된 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_IDENTITY_10065": "계정이 이미 %s와(과) 일치하는 이름을 가지고 있습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10004": "NFS 주 저장소[uuid:%s]에 대한 명령을 실행할 연결된 NFS 연결이 있는 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_IDENTITY_10069": "account[uuid: %s, name: %s]은 표준 계정이며 다른 계정[uuid: %s]의 비밀번호를 재설정할 권한이 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10000": "NFS 주 스토리지 [uuid:%s]가 어떤 컴퓨트 클러스터에도 연결되어 있지 않으므로 가상 머신 [uuid:%s]의 루트 볼륨 [uuid:%s]을 제거할 수 없습니다.", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10004": "부트 모드 %s인 baremetal2 이미지만 지원됩니다.", + "ORG_ZSTACK_IDENTITY_10068": "관리자 계정만 비밀번호를 업데이트할 수 있습니다.", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10003": "bootMode 속성은 baremetal2 이미지에 필수입니다.", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10002": "raw/qcow2 형식의 루트 볼륨 템플릿만 baremetal2로 태그할 수 있습니다.", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10001": "baremetal2 유형의 시스템 태그는 하나만 허용되지만, %d개가 발견되었습니다.", + "ORG_ZSTACK_AI_CONTAINER_10012": "IP %s으로 포드 이름을 찾을 수 없습니다.", + "ORG_ZSTACK_AI_CONTAINER_10011": "포드 IP 주소를 검색할 수 없어 컨테이너 엔드포인트 테이블에 항목을 추가할 수 없습니다. 포드가 실행되고 접근 가능한지 확인하세요.", + "ORG_ZSTACK_AI_CONTAINER_10010": "가상화 환경에서 UUID %s인 클러스터를 찾을 수 없습니다.", + "ORG_ZSTACK_COMPUTE_VM_NUMA_10003": "CPU 세트 [%s]가 잘못되었습니다.", + "ORG_ZSTACK_AI_CONTAINER_10016": "k8s 배포 %s을(를) 검색하지 못했습니다.", + "ORG_ZSTACK_AI_CONTAINER_10015": "Kubernetes 서비스를 삭제할 수 없습니다.原因是 %s", + "ORG_ZSTACK_TAG2_10008": "모든 토큰 유형을 지정해야 합니다.", + "ORG_ZSTACK_AI_CONTAINER_10014": "Kubernetes 배포를 삭제할 수 없습니다.原因是 %s", + "ORG_ZSTACK_AI_CONTAINER_10013": "포드 %s에 레이블 %s을(를) 추가하지 못했습니다.", + "ORG_ZSTACK_TAG2_10006": "색상 사양 [%s]이 잘못되었습니다. #FF00FF와 같은 유효한 16진수 코드여야 합니다.", + "ORG_ZSTACK_TAG2_10007": "형식 [%s]을(를) 가져왔습니다. 형식은 name::{tokenName1}::{tokenName2} ... ::{tokenNameN} 또는 {tokenName1}::{tokenName2} ... ::{tokenNameN}이어야 합니다. 이름에는 '{}:'가 포함되지 않아야 합니다.", + "ORG_ZSTACK_AI_CONTAINER_10019": "YAML 형식이 잘못되었습니다: %s", + "ORG_ZSTACK_TAG2_10004": "단순 태그 패턴이 비어있거나 잘못된 토큰이 포함되어 있습니다.", + "ORG_ZSTACK_AI_CONTAINER_10018": "배포 %s에 인스턴스 정보가 없습니다.", + "ORG_ZSTACK_TAG2_10005": "잘못된 태그 UUID %s, 태그 유형은 단순 유형이어야 합니다.", + "ORG_ZSTACK_AI_CONTAINER_10017": "배포 %s이(가) 존재하지 않습니다.", + "ORG_ZSTACK_IDENTITY_10070": "계정[uuid: %s]에 대한 Quota[name: %s]를 찾을 수 없습니다.", + "ORG_ZSTACK_TAG2_10002": "클라우드 리소스 메타데이터의 단순 태그 패턴 형식을 업데이트할 수 없습니다.", + "ORG_ZSTACK_TAG2_10003": "중복된 리소스 이름이 발견되었습니다. 확인하고 해결하세요.", + "ORG_ZSTACK_SNS_PLATFORM_WECOM_10000": "WeCom으로 메시지를 보내지 못했습니다. 상태: %s, 본문: %s", + "ORG_ZSTACK_TAG2_10000": "태그 고유성 위반: 유형 [%s]의 태그가 이름 [%s]으로 계정 [%d] 아래에 이미 존재합니다.", + "ORG_ZSTACK_TAG2_10001": "토큰 ID만 업데이트할 수 있습니다.", + "ORG_ZSTACK_PCIDEVICE_10072": "UUID %s인 PCI 장치 사양이 존재하지 않습니다.", + "ORG_ZSTACK_PCIDEVICE_10071": "PCI 디바이스에 대해 지원되지 않는 유형[%s]입니다. 지원되는 유형만 허용됩니다.", + "ORG_ZSTACK_PCIDEVICE_10070": "PCI 디바이스 [uuid:%s]가 존재하지 않습니다", + "ORG_ZSTACK_PCIDEVICE_10075": "PCI 디바이스 [UUID:%s]가 존재하지 않거나 VM [UUID:%s]에 대해 비활성화되어 있습니다", + "ORG_ZSTACK_PCIDEVICE_10073": "PCI 디바이스 사양에 대해 지원되지 않는 유형[%s]입니다. 지원되는 유형만 허용됩니다.", + "ORG_ZSTACK_AI_CONTAINER_10023": "잘못된 Kubernetes 배포 YAML: %s", + "ORG_ZSTACK_AI_CONTAINER_10020": "모든 Pod를 종료하기 위해 Kubernetes 배포 %s를 패치하지 못함", + "ORG_ZSTACK_AI_CONTAINER_10025": "데이터베이스에서 모델 서비스 인스턴스 그룹 %s를 찾을 수 없습니다", + "ORG_ZSTACK_AI_CONTAINER_10024": "k8s 배포 %s를 패치하지 못함", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10039": "가상화 환경 오류로 인해 캐시된 이미지[path:%s]에서 루트 볼륨[uuid:%s]을 생성하지 못함", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10040": "originText 또는 certificateText는 null일 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10036": "NFS 기본 스토리지[uuid:%s]에서 비트[%s]를 삭제하지 못함, 오류: %s, 설치 경로를 정리할 것입니다, pinv.getUuid(), rsp.getError()", + "ORG_ZSTACK_NETWORK_L3_10067": "레이어 3 네트워크 [uuid:%s]에서 DNS 실패", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10037": "KVM 호스트[uuid:%s, ip:%s]에서 스냅샷[uuid:%s]으로 볼륨[uuid:%s]을 복원하지 못함, %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10038": "KVM 호스트[uuid:%s, ip:%s]에서 이미지[uuid:%s]로 볼륨[uuid:%s]을 복원하지 못함, %s", + "ORG_ZSTACK_CRYPTO_AUTH_10020": "%s에 대한 클래스를 생성할 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10032": "NFS 기본 스토리지[uuid:%s]에서 %s의 존재를 확인하지 못함, 오류: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10034": "KVM 호스트[uuid:%s, ip:%s]에서 빈 볼륨[uuid:%s, name:%s]을 생성할 수 없습니다, 이유: %s", + "ORG_ZSTACK_CRYPTO_AUTH_10029": "가상 머신 %s에 대한 인증서 정보를 찾을 수 없습니다. 필요한 인증서가 클라우드 환경에 올바르게 구성 및 업로드되어 있는지 확인하십시오.", + "ORG_ZSTACK_CRYPTO_AUTH_10028": "암호화 매개변수의 일반 텍스트를 JSON 객체로 파싱하지 못함: %s", + "ORG_ZSTACK_HYGON_10006": "VM[uuid:%s]을 찾을 수 없습니다", + "ORG_ZSTACK_HYGON_10005": "UUID %s를 가진 호스트에는 Hygon 보안 기능이 활성화된 실행 중인 가상 머신 %d개가 있습니다. 먼저 종료하십시오.", + "ORG_ZSTACK_HYGON_10004": "호스트[uuid:%s]가 연결되어 있지 않습니다", + "ORG_ZSTACK_HYGON_10003": "호스트[UUID:%s]에는 Hygon mdev 디바이스에 대해 'enableCgroupDeviceAcl' 매개변수를 0보다 크게 설정해야 합니다. mdev 디바이스를 생성하기 전에 이 설정을 구성하십시오.", + "ORG_ZSTACK_HYGON_10002": "호스트[UUID:%s]에는 Hygon mdev 디바이스에 대해 'reconnect.host.restart.libvirtd.service' 구성을 'true'로 설정해야 합니다. mdev 디바이스를 생성하기 전에 이 설정을 구성하십시오.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10017": "클라우드 인스턴스 %s에 대한 인증서 생성 실패", + "ORG_ZSTACK_HYGON_10000": "mdev 디바이스를 생성 해제할 수 없습니다. 호스트 [uuid: %s]의 VM에 여전히 %d개의 mdev 디바이스가 연결되어 있습니다. 이러한 디바이스를 사용하는 모든 VM이 먼저 중지되었는지 확인하십시오.", + "ORG_ZSTACK_NETWORK_L3_10073": "레이어 3 네트워크[uuid:%s]에서 접두사[%s]에 대한 호스트 경로가 없습니다.", + "ORG_ZSTACK_NETWORK_L3_10072": "접두사 [%s]은(는) 유효한 IPv4 네트워크 CIDR이 아닙니다", + "ORG_ZSTACK_NETWORK_L3_10071": "레이어 3 네트워크[uuid:%s]에 접두사[%s]에 대한 호스트 경로가 이미 있습니다", + "ORG_ZSTACK_HYGON_10009": "동시 할당으로 인해 Hygon MDEV 디바이스를 할당하지 못했습니다. 나중에 다시 시도하십시오.", + "ORG_ZSTACK_NETWORK_L3_10070": "next-hop[%s]은(는) 유효한 IPv4 주소가 아닙니다", + "ORG_ZSTACK_HYGON_10008": "호스트[uuid:%s]에 Hygon IOMMU Group 장치가 부족합니다. 필수: %d", + "ORG_ZSTACK_HYGON_10007": "VM[uuid:%s]이(가) [%s] 상태에 있으므로 Hygon Security Element 설정을 수정할 수 없습니다. 변경하기 전에 VM을 중지하세요", + "ORG_ZSTACK_TICKET_ENTITY_10001": "작업이 거부되었습니다. 티켓이 %s 상태이므로 [%s] 작업을 수행할 수 없습니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10031": "보안 그룹 [%s]이(가) 존재하지 않습니다", + "ORG_ZSTACK_IDENTITY_10022": "리소스[UUID:%s]을(를) 찾을 수 없습니다. 잘못된 리소스 UUID이거나 관리 리소스입니다", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10049": "클라우드 리소스 할당에 사용할 수 있는 백엔드를 찾을 수 없습니다. 백엔드 서비스가 제대로 구성되어 있고 사용 가능한지 확인하세요", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10042": "클러스터[uuid:%s]에서 연결 가능한 호스트가 없습니다", + "ORG_ZSTACK_IDENTITY_10026": "%s은(는) 인식된 API 엔드포인트가 아닙니다", + "ORG_ZSTACK_IDENTITY_10025": "userUuid[%s]로 지정된 사용자가 현재 계정에 속하지 않으며, 현재 계정에 관리 권한이 없어 사용자의 권한을 확인할 수 없습니다", + "ORG_ZSTACK_IDENTITY_10029": "계정[uuid:%s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10001": "보안 인스턴스[uuid:%s] 모델이 유효하지 않습니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10037": "잘못된 알고리즘 유형 %s입니다. 지원되는 유형은 다음과 같습니다: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10002": "보안 인스턴스 [%s]이(가) 수동 동기화를 트리거하지 못했습니다. 보안 인스턴스가 키를 동기화했는지 확인하세요", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10038": "데이터 보호에 지정된 리소스 풀[%s]이(가) 존재하지 않습니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10000": "secretResourcePool[uuid:%s]이(가) 예상 상태 %s가 아닙니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10032": "관리 IP [%s]에 보안 사고가 발생했습니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10033": "managementIp[%s]은(는) 유효한 IPv4 주소가 아닙니다", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10034": "%s[%s] 보안 인스턴드에 대한 연결을 수립하지 못했습니다. 원인: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10035": "암호화 기능을 활성화한 후에는 해당 리소스 풀에 보안 인스턴스를 최소 하나 이상 유지해야 합니다", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10017": "KVM 호스트[uuid:%s, ip:%s]에 디렉토리[installUrl:%s]을(를) 생성할 수 없습니다. 원인: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10018": "클러스터에 연결된 호스트가 없거나 기본 저장소[uuid:%s]가 클러스터에 연결되어 있지 않습니다", + "ORG_ZSTACK_IDENTITY_10050": "toPublic이 false로 설정되어 있으므로 accountUUIDs는 null이거나 비어 있을 수 없습니다. UUID가 제공되었는지 확인하세요", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10019": "네트워크 문제 또는 사용 불가로 인해 호스트[uuid:%s]에서 NFS 기본 저장소[uuid:%s]에 ping하지 못했습니다. 이 호스트-ps 연결을断开하세요", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10013": "SFTP 백업 저장소[hostname:%s]에서 NFS 기본 저장소[uuid:%s, path:%s]로 [%s] 전송 실패: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10014": "NFS 기본 저장소[uuid:%s, mountpoint:%s]에서 SFTP 백업 저장소[hostname:%s, path:%s]로 비트 업로드 실패: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10016": "기본 저장소[uuid:%s, name:%s]을(를) 클러스터[uuid:%s]에 연결할 수 없습니다. 클러스터의 KVM 호스트가 qemu-img 버전[%s]을(를) 사용하지만, 기본 저장소는 qemu-img 버전[%s]을(를) 사용하는 다른 클러스터에 연결되어 있습니다. %s보다 큰 qemu-img 버전은 %s보다 작은 버전과 호환되지 않아 볼륨 스냅샷 작업이 실패할 수 있습니다. qemu-img 버전 불일치를 방지하려면 기본 저장소를 다른 Linux 배포판이 있는 클러스터에 연결하지 마세요", + "ORG_ZSTACK_IDENTITY_10059": "사용자[name: %s, uuid: %s]가 계정[uuid: %s]에 연결되어 있지 않습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10010": "IP 주소 [%s]이(가) CIDR 블록 [%s]에 속하지 않습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10011": "NFS 기본 저장소에 실행 중인 가상 머신이 %s개 있습니다. 중지한 후 다시 시도하세요:", + "ORG_ZSTACK_IDENTITY_10057": "정책[name: %s, uuid: %s]은(는) 계정[uuid: %s]에 속하지 않습니다", + "ORG_ZSTACK_CRYPTO_AUTH_10009": "잘못된 비밀 리소스 풀 모델입니다. 예상된 것: %s, 발견된 것: %s", + "ORG_ZSTACK_CRYPTO_AUTH_10008": "비밀 리소스 풀 [%s]의 모델을 찾지 못했습니다", + "ORG_ZSTACK_CRYPTO_AUTH_10006": "현재 클라우드 환경에서는 이 작업이 지원되지 않습니다. 가상 머신 인스턴스가 필요한 작업을 지원하는지 확인하십시오.", + "ORG_ZSTACK_IDENTITY_10041": "그룹을 생성할 수 없습니다. 계정 [UUID: %s]에 동일한 이름의 그룹이 이미 존재합니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10028": "저장소 마이그레이션을 위해 선택한 호스트 [UUID:%s]를 사용할 수 없습니다.", + "ORG_ZSTACK_CRYPTO_AUTH_10016": "원격 암호화 서비스 노드와의 연결을 수립하지 못했습니다. 서비스가 실행 중이고 네트워크 연결이 올바르게 구성되어 있는지 확인하십시오.", + "ORG_ZSTACK_IDENTITY_10040": "accountName과 accountUuid는 모두 null일 수 없습니다. 최소한 하나를 지정해야 합니다.", + "ORG_ZSTACK_CRYPTO_AUTH_10015": "ID 인증이 리소스를 할당할 리소스 풀을 지정하지 않습니다. 리소스 풀이 서비스에 대해 올바르게 식별되고 지정되었는지 확인하십시오.", + "ORG_ZSTACK_IDENTITY_10045": "내장 관리자 계정은 삭제할 수 없습니다. 삭제에는 비내장 계정을 사용하십시오.", + "ORG_ZSTACK_IDENTITY_10044": "계정 %s은(는) 자신의 삭제를 금지합니다. 관리자에게 문의하여 도움을 받으십시오.", + "ORG_ZSTACK_IDENTITY_10043": "계정을 생성할 수 없습니다. 동일한 이름의 계정이 이미 존재합니다.", + "ORG_ZSTACK_IDENTITY_10042": "사용자를 생성할 수 없습니다. 계정 [UUID: %s]에 동일한 이름의 사용자가 이미 존재합니다.", + "ORG_ZSTACK_IDENTITY_10049": "모든 인증 확인이 실패했으며 지정된 계정 UUID 목록이 null이거나 비어 있습니다. 입력을 확인하고 유효한 계정 UUID가 제공되었는지 확인하십시오.", + "ORG_ZSTACK_IDENTITY_10048": "현재 세션은 사용자와 연결되어 있습니다. 다른 사용자의 정체성 [uuid:%s]을(를) 가정할 수 없습니다.", + "ORG_ZSTACK_IDENTITY_10047": "현재 세션은 계정 기반 세션입니다. 업데이트하려는 사용자의 'uuid'를 지정하십시오.", + "ORG_ZSTACK_IDENTITY_10046": "관리자만 계정 액세스를 종료할 수 있습니다.", + "ORG_ZSTACK_CRYPTO_AUTH_10019": "데이터베이스에서 무결성 비밀번호를 가져오지 못했습니다. %s이(가) 무결성 비밀번호를 생성하지 않았기 때문입니다.", + "ORG_ZSTACK_VHOST_KVM_10000": "vHostUser 디스크는 virtio 모드만 지원합니다. 이미지 플랫폼에 필요한 virtio 드라이버가 설치되어 있는지 확인하십시오.", + "ORG_ZSTACK_VHOST_KVM_10001": "vhost-user 디스크는 virtio-scsi 모드를 지원하지 않습니다. virtio-scsi 모드를 비활성화하십시오.", + "ORG_ZSTACK_NETWORK_L3_10029": "%s은(는) 클라우드 리소스 구성에 유효한 IPv6 주소가 아닙니다", + "ORG_ZSTACK_USBDEVICE_10005": "PassThrough는 호스트 환경에서 실행되는 VM에서만 사용하도록 지원됩니다.", + "ORG_ZSTACK_ALIYUN_ECS_10019": "관리자 사용자만 매개변수 [onlyZstack]을 false로 설정할 수 있습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10018": "백업 %s에서 이미지를 생성하지 못했습니다", + "ORG_ZSTACK_ALIYUN_ECS_10018": "원격 삭제는 후불 ECS 인스턴스만 지원합니다. 표시된 ECS 충전 유형은: %s", + "ORG_ZSTACK_USBDEVICE_10002": "VM에 연결된 USB 장치 수가 제한에 도달했습니다. 현재 사용량: %s", + "ORG_ZSTACK_ALIYUN_ECS_10017": "상태가 Running 또는 Stopped인 ECS 인스턴스만 삭제할 수 있습니다. 현재 상태는 %s입니다", + "ORG_ZSTACK_NETWORK_L3_10025": "start[ip:%s]로 무료 IP를 가져올 수 없습니다. start[ip:%s]은(는) 유효한 IPv6 주소가 아닙니다", + "ORG_ZSTACK_USBDEVICE_10009": "VM [uuid:%s]은(는) passthrough를 통해 USB 장치가 연결되어 있으므로 마이그레이션할 수 없습니다", + "ORG_ZSTACK_STORAGE_BACKUP_10015": "백업 저장소[uuid:%s]에 %s을(를) 할당할 수 없습니다. 사용 가능한 것이 %s만 있습니다", + "ORG_ZSTACK_NETWORK_L3_10024": "start[ip:%s]로 무료 IP를 가져올 수 없습니다. start[ip:%s]은(는) 유효한 IPv4 주소가 아닙니다", + "ORG_ZSTACK_USBDEVICE_10008": "vm[%s]은(는) 호스트에 대한 USB 리디렉션이 설정되지 않았기 때문에 시작할 수 없습니다", + "ORG_ZSTACK_NETWORK_L3_10023": "l3Network[uuid:%s]이(가) 이중 스택 모드로 구성되어 있으므로 start[ip:%s]로 무료 IP를 가져올 수 없습니다", + "ORG_ZSTACK_USBDEVICE_10007": "USB가 이미 가상 머신 [UUID:%s]에 바인딩되어 있으므로 다른 VM에 바인딩할 수 없습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10013": "필요한 기본 스토리지[uuid:%s, type:%s]이(가) 백업 스토리지를 지원하지 않습니다.", + "ORG_ZSTACK_NETWORK_L3_10022": "ipRangeUuid와 l3NetworkUuid는 모두 null일 수 없습니다. 최소한 하나는 설정되어야 합니다.", + "ORG_ZSTACK_USBDEVICE_10006": "USB 장치 [uuid:%s]를 VM [uuid:%s]에 연결할 수 없습니다. 가능한 원인: 장치가 활성화되지 않았거나 다른 VM에 연결되어 있거나, 장치와 VM이 동일한 호스트에 없습니다.", + "ORG_ZSTACK_ALIYUN_ECS_10015": "이미지가 삭제되었습니다! 이미지가 적절하게 종료되고 모든 리소스가 삭제 전에 해제되었는지 확인하세요.", + "ORG_ZSTACK_ALIYUN_ECS_10014": "원격에 ecs 이미지가 존재합니다, 이름: %s, 생성 시간: %s", + "ORG_ZSTACK_ALIYUN_ECS_10013": "ECS 이미지가 원격과 로컬 모두에 존재합니다, ECS 이미지 UUID: %s, 이름: %s, 생성 시간: %s", + "ORG_ZSTACK_NETWORK_L3_10032": "IPv6 주소 풀이 지원되지 않습니다. 따라서 IP 범위 추가가 불가능합니다. 작업을 진행하기 전에 네트워크 구성이 IPv6를 지원하는지 확인하세요.", + "ORG_ZSTACK_STORAGE_BACKUP_10011": "백업 스토리지 데이터 네트워크 시스템 태그는 하나만 허용되지만 %s개가 발견되었습니다.", + "ORG_ZSTACK_NETWORK_L3_10030": "[startIp %s, endIp %s, prefixLen %d, gateway %s]은(는) 클라우드 네트워킹 구성에 대한 유효한 IPv6 범위를 나타내지 않습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10010": "모든 백업 스토리지 노드에서 용량 예약에 실패했습니다. 백업 스토리지 리소스의 가용성을 확인하세요.", + "ORG_ZSTACK_USBDEVICE_10016": "하나의 가상 머신 인스턴스에 최대 %s개의 USB 3.0 장치를 연결할 수 있습니다.", + "ORG_ZSTACK_USBDEVICE_10015": "하나의 VM 인스턴스에 최대 %s개의 USB 2.0 장치를 연결할 수 있습니다.", + "ORG_ZSTACK_NETWORK_L3_10038": "새 네트워크 CIDR [%s]이(가) 이전 네트워크 CIDR [%s]과(와) 다릅니다.", + "ORG_ZSTACK_USBDEVICE_10014": "하나의 VM 인스턴스에 최대 %s개의 USB 1.0 장치를 연결할 수 있습니다.", + "ORG_ZSTACK_NETWORK_L3_10037": "새 IP 범위 [startIP:%s, endIP:%s]이(가) 기존 IP 범위 [startIP:%s, endIP:%s]과(와) 중첩됩니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10028": "스토리지 볼륨 [uuid:%s]에서 볼륨 백업 [uuid:%s]을(를) 찾을 수 없습니다.", + "ORG_ZSTACK_NETWORK_L3_10036": "IPv6 접두사 길이는 Stateless-DHCP 또는 SLAAC에 대해 %d이어야 합니다.", + "ORG_ZSTACK_NETWORK_L3_10035": "addressMode[%s]이(가) L3Network 주소 모드[%s]과(와) 다릅니다.", + "ORG_ZSTACK_USBDEVICE_10019": "USB 장치 [UUID:%s]이(가) %s의 연결 가능한 상태에 있지 않습니다.", + "ORG_ZSTACK_NETWORK_L3_10034": "시스템 네트워크가 현재 IPv6을 지원하지 않으므로 IP 범위 추가가 지원되지 않습니다. 이 작업을 수행하기 전에 네트워크 구성이 IPv6을 지원하는지 확인하세요.", + "ORG_ZSTACK_USBDEVICE_10018": "USB 장치 [UUID:%s]이(가) 이미 다른 가상 머신 [UUID:%s]에 연결되어 있습니다.", + "ORG_ZSTACK_NETWORK_L3_10033": "IP 범위 접두사 길이가 유효한 범위 [%d - %d]를 벗어났습니다.", + "ORG_ZSTACK_USBDEVICE_10017": "USB 장치 [UUID: %s]이(가) 동일한 VM [UUID: %s]에 이미 연결되어 있습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10024": "스토리지 노드 [uuid:%s]에서 볼륨 백업 [uuid:%s]을(를) 찾을 수 없습니다.", + "ORG_ZSTACK_ALIYUN_ECS_10022": "VSwitch에 사설 IP가 존재합니다: %s, ECS에 할당됨: %s", + "ORG_ZSTACK_ALIYUN_ECS_10021": "%s은(는) CIDR 범위 내에 있지 않습니다: %s", + "ORG_ZSTACK_ALIYUN_ECS_10020": "vSwitch 사용 가능한 IP 주소가 부족합니다, 현재 (%d)", + "ORG_ZSTACK_USBDEVICE_10012": "PCI 디바이스가 연결되어 있어 VM [uuid:%s]을 마이그레이션할 수 없습니다", + "ORG_ZSTACK_ALIYUN_ECS_10027": "인스턴스 offering 또는 인스턴스 타입을 지정해야 합니다!", + "ORG_ZSTACK_USBDEVICE_10011": "스토리지 디바이스가 연결되어 있어 루트 볼륨 [uuid:%s]을 마이그레이션할 수 없습니다", + "ORG_ZSTACK_ALIYUN_ECS_10026": "%s은(는) 유효한 볼륨 타입이 아닙니다, 유효한 타입은 [%s]입니다", + "ORG_ZSTACK_ALIYUN_ECS_10025": "%s은(는) 유효한 IPv4 주소가 아닙니다", + "ORG_ZSTACK_ALIYUN_ECS_10024": "공용 IP 주소를 할당할 때 대역폭을 지정해야 합니다", + "ORG_ZSTACK_NETWORK_L3_10043": "%s은(는) 유효한 네트워크 CIDR 마스크가 아닙니다", + "ORG_ZSTACK_STORAGE_BACKUP_10023": "백업 스토리지 중 하나 [UUID: %s]가 %s 상태에 있으므로 동기화 작업을 수행할 수 없습니다.", + "ORG_ZSTACK_NETWORK_L3_10042": "게이트웨이[gatewayId]가 서브넷 subnetId 내에 있지 않습니다", + "ORG_ZSTACK_STORAGE_BACKUP_10022": "타입[%s]의 볼륨 백업 팩토리를 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_L3_10041": "%s은(는) 유효한 네트워크 CIDR이 아니라 사용 가능한 IP 주소가 포함되어 있지 않습니다", + "ORG_ZSTACK_STORAGE_BACKUP_10021": "백업 볼륨의 현재 VM[UUID: %s]이 백업에 사용된 VM[UUID: %s]이 더 이상 아닙니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10020": "이미지 스토리지[uuid:%s]에서 볼륨 백업 메타데이터 파일을 동기화하는 중 I/O 오류 발생: %s", + "ORG_ZSTACK_NETWORK_L3_10049": "l3 네트워크 [uuid %s: 이름 %s]가 공용 네트워크가 아닙니다; 따라서 주소 풀 범위를 추가할 수 없습니다.", + "ORG_ZSTACK_NETWORK_L3_10047": "시스템과 카테고성의 조합이 유효하지 않습니다, 특정 클라우드 컴퓨팅 플랫폼만 유효합니다", + "ORG_ZSTACK_NETWORK_L3_10046": "%s은(는) 유효한 FQDN 도메인 이름이 아닙니다", + "ORG_ZSTACK_NETWORK_L3_10045": "지원되지 않는 L3 네트워크 타입[%s]", + "ORG_ZSTACK_NETWORK_L3_10044": "ipRangeUuids, L3NetworkUuids, zoneUuids는 각각 최소 하나의 비어 있지 않은 리스트를 포함하거나, 모든 값을 true로 설정해야 합니다.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10023": "vmNic[uuid:%s]이(가) 대상 프라이빗 포트 범위[%s, %s]와 동일한 프로토콜 타입[%s]을 가진 규칙이 이미 있으므로 CIDR이 허용된 포트 포워딩 규칙을 연결할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10024": "vmNic [uuid:%s]이(가) 대상 프라이빗 포트 범위 [%s, %s]와重叠하고 동일한 프로토토 타입 [%s]을 가진 충돌 규칙이 이미 있으므로 포트 포워딩 규칙을 연결할 수 없습니다.", + "ORG_ZSTACK_SNMP_10010": "프라이버시 비밀번호가 비어 있을 수 없으므로 SNMP 에이전트를 %s하지 못했습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10021": "VMNic [UUID:%s]에 [UUID:%s]과(와) 다른 VIP를 가진 포트 포워딩 규칙이 이미 있습니다.", + "ORG_ZSTACK_ALIYUN_NAS_CORE_10000": "기본 스토리지 [%s]가 여전히 운영 중이므로 접근 그룹 삭제가 불가능합니다.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10022": "vmNic UUID[%s]에 이미 공용 IP가 연결되어 있으므로 CIDR 규칙이 허용된 포트 포워딩을 추가할 수 없습니다.", + "ORG_ZSTACK_NETWORK_L3_10054": "IP 할당에 네트워크 주소나 브로드캐스트 주소가 포함될 수 없습니다. 제공된 IP가 서브넷 내의 유효한 호스트 주소인지 확인하십시오.", + "ORG_ZSTACK_NETWORK_L3_10053": "게이트웨이[gatewayId]가 서브넷 subnetId/cidrBlock 내에 있지 않습니다", + "ORG_ZSTACK_NETWORK_L3_10052": "IP 범위 [%s ~ %s]에 링크-로컬 주소가 포함되어 있으며, 이는 가상화를 위해 예약되어 있으므로 사용하면 안 됩니다.", + "ORG_ZSTACK_NETWORK_L3_10051": "IP 범위 [%s ~ %s]에 E 클래스 주소가 포함되어 있으며, 이는 예약된 주소입니다.", + "ORG_ZSTACK_NETWORK_L3_10050": "IP 범위 [%s ~ %s]에 D 클래스 주소가 포함되어 있으며, 이는 멀티캐스트 통신을 위해 예약되어 있습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10008": "예약 용량을 차감한 후, 필요한 용량[%s 바이트]을 가진 사용 가능한 백업 스토리지가 없습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10006": "백업 스토리지 [UUID:%s]가 영역 [UUID:%s]에 연결되었습니다.", + "ORG_ZSTACK_NETWORK_L3_10059": "시작 IP 주소 [%s]가 종료 IP 주소 [%s]보다 뒤에 있습니다.", + "ORG_ZSTACK_ALIYUN_ECS_10006": "URL 디코딩 실패: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10005": "UUID:%s를 가진 백업 스토리지가 UUID:%s를 가진 영역에 연결되지 않았습니다.", + "ORG_ZSTACK_NETWORK_L3_10058": "넷마스크[%s]가 유효한 넷마스크가 아니며, 잘못된 IP 범위 넷마스크 0.0.0.0을 피하기 위해 지정해야 합니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10004": "zoneUuids와 backupStorageUuids는 모두 최소 하나의 비어 있지 않은 리스트를 포함하거나, 모두 true로 설정되어야 합니다.", + "ORG_ZSTACK_NETWORK_L3_10057": "게이트웨이[%s]가 유효한 IPv4 주소가 아닙니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10003": "가상 머신 구성에서 %s는 null이 아니어야 합니다.", + "ORG_ZSTACK_NETWORK_L3_10056": "종료 IP[%s]가 유효한 IPv4 주소가 아닙니다.", + "ORG_ZSTACK_NETWORK_L3_10055": "시작 IP[%s]가 유효한 IPv4 주소가 아닙니다.", + "ORG_ZSTACK_CORE_SALT_10000": "시스템에서 SCP를 찾을 수 없습니다[%s], 솔트 구성을 설정할 수 없습니다.", + "ORG_ZSTACK_ALIYUN_ECS_10004": "인스턴스에서 시스템 디스크를 찾을 수 없습니다: [%s], 인스턴스 ID는: [%s]", + "ORG_ZSTACK_CORE_SALT_10003": "인스턴스[%s]에서 솔트 상태[%s]를 실행하지 못했습니다, %s번 재시도 후 실패", + "ORG_ZSTACK_ALIYUN_ECS_10003": "이 가용 영역 [%s]은 현재 인스턴스 유형 [%s]을 지원할 수 없습니다. 다른 인스턴스 유형이나 가용 영역을 선택하세요.", + "ORG_ZSTACK_ALIYUN_ECS_10002": "현재 사용 가능한 인스턴스 유형이 없습니다. 나중에 다시 확인하거나 사양을 수정하세요.", + "ORG_ZSTACK_SNMP_10000": "SNMP 에이전트 생성에 실패했습니다. 이미 존재합니다.", + "ORG_ZSTACK_SNMP_10001": "SNMP 에이전트 서비스를 종료하지 못했습니다. 먼저 SNMP 에이전트 인스턴스가 생성되었는지 확인하세요.", + "ORG_ZSTACK_NETWORK_L3_10065": "일반 IP 범위를 추가하려면 게이트웨이 IP 주소를 지정해야 합니다.", + "ORG_ZSTACK_SNMP_10002": "SNMP 에이전트 구성을 업데이트하지 못했습니다. 먼저 SNMP 에이전트가 생성되었는지 확인하세요.", + "ORG_ZSTACK_NETWORK_L3_10064": "새로 추가된 IP 범위 게이트웨이 %s가 기존 게이트웨이 %s와 다릅니다.", + "ORG_ZSTACK_SNMP_10003": "Failed to SNMP 에이전트를 생성하세요.", + "ORG_ZSTACK_NETWORK_L3_10063": "게이트웨이[%s]는 범위[%s, %s]에 포함될 수 없습니다.", + "ORG_ZSTACK_SNMP_10004": "버전을 v2c로 설정할 때 readCommunity가 비어 있을 수 없으므로 SNMP 에이전트 %s에 실패했습니다.", + "ORG_ZSTACK_NETWORK_L3_10062": "엔드포인트 [%s]가 서브넷 %s/%d 내에 있지 않습니다.", + "ORG_ZSTACK_SNMP_10005": "버전을 v3로 설정할 때 userName이 비어 있을 수 없으므로 SNMP 에이전트 %s에 실패했습니다.", + "ORG_ZSTACK_NETWORK_L3_10061": "동일한 L3 네트워크에서 여러 CIDR 블록이 허용되지 않습니다. 기존 IP 범위 [uuid:%s, CIDR:%s]가 이미 존재하므로, 새 CIDR 블록 [%s]이(가) 잘못되었습니다.", + "ORG_ZSTACK_SNMP_10006": "비밀번호가 제공되지 않을 때 인증 알고리즘이 null일 수 없으므로 SNMP 에이전트 %s에 실패했습니다.", + "ORG_ZSTACK_NETWORK_L3_10060": "IP 범위와 중첩됩니다[uuid:%s, start_ip:%s, end_ip: %s]", + "ORG_ZSTACK_SNMP_10007": "인증 비밀번호가 비어 있으므로 SNMP 에이전트 %s에 실패했습니다.", + "ORG_ZSTACK_SNMP_10008": "데이터 암호화 구성이 먼저 사용자 확인을 요구하므로 %s SNMP 에이전트에 실패했습니다.", + "ORG_ZSTACK_XINFINI_10019": "노드 %s 세부 정보를 가져오지 못했습니다. IP 주소 및 역할 구성을 확인하세요", + "ORG_ZSTACK_XINFINI_10018": "가상 머신 노드를 찾을 수 없습니다", + "ORG_ZSTACK_XINFINI_10017": "연결된 가상 머신 인스턴스를 찾을 수 없습니다. 노드가 제대로 연결되었는지 확인하고 다시 시도하세요.", + "ORG_ZSTACK_XINFINI_10016": "활성 연결에 대해 지원되지 않는 프로토콜[%s]입니다", + "ORG_ZSTACK_XINFINI_10015": "[%s]에서 볼륨 정보를 가져오는 것이 지원되지 않습니다", + "ORG_ZSTACK_XINFINI_10014": "지원되지 않는 스토리지 프로토콜[%s]입니다", + "ORG_ZSTACK_XINFINI_10013": "비활성화에 대해 지원되지 않는 프로토콜[%s]입니다", + "ORG_ZSTACK_XINFINI_10012": "[%s]의 볼륨 세부 정보를 가져올 수 없습니다. 삭제 때문일 수 있습니다", + "ORG_ZSTACK_XINFINI_10010": "빈 구성으로, 인스턴스 xinfini을 발견할 수 없습니다", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10021": "필요한 IP %s가 다른 인스턴스에 할당되어 있습니다", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10022": "requiredIp %s가 DHCP 범위 %s ~ %s를 벗어났습니다", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10020": "Baremetal2 프로비저닝 네트워크[uuid:%s]에서 IP를 할당하지 못했습니다", + "ORG_ZSTACK_XINFINI_10009": "iscsi 클라이언트 삭제 실패 %s", + "ORG_ZSTACK_XINFINI_10008": "볼륨 클라이언트 그룹 매핑 삭제 실패 %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10002": "L2[uuid:%s]에서 할당된 IP 주소를 사용하는 BM 인스턴스가 있습니다.", + "ORG_ZSTACK_XINFINI_10007": "볼륨 스냅샷 삭제 실패 %s", + "ORG_ZSTACK_XINFINI_10006": "스냅샷[id:%s, name:%s]에 %d개의 복제된 볼륨이 있습니다, 볼륨 이름: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10004": "IP 범위[uuid:%s]에서 할당된 IP 주소를 사용하는 BM 인스턴스가 있습니다.", + "ORG_ZSTACK_XINFINI_10005": "볼륨 삭제 실패: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10003": "L3 네트워크[UUID:%s]에서 할당된 IP 주소를 사용하는 BM 인스턴스가 있습니다.", + "ORG_ZSTACK_XINFINI_10004": "bdev 삭제 실패 %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10006": "베어메탈 서버[uuid:%s]를 원격으로 %s 전원 공급하는 데 실패했습니다", + "ORG_ZSTACK_XINFINI_10003": "IP %s가 있는 bdc를 클라우드 환경에서 찾을 수 없습니다.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10005": "베어메탈 PXE 서버를 할당하지 못했습니다. 클러스터[uuid:%s]에 충분한 사용 가능한 용량이 있는 PXE 서버가 연결되어 있는지 확인하세요", + "ORG_ZSTACK_XINFINI_10002": "xinfini 요청 실패, 메시지: %s.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10008": "베어메탈 섀시[uuid:%s]가 존재하지 않습니다", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10009": "UUID: %s인 baremetal2 프로비저닝 네트워크가 이미 UUID: %s인 클러스터에 연결되어 있습니다", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10007": "베어메탈 섀시[uuid:%s]를 원격으로 끄는 데 실패했습니다", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10008": "실행 중인 가상 머신에서 관리 장치를 핫 언플러그하지 못했습니다. 이유:%s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10010": "Baremetal2 프로비저닝 네트워크 [uuid:%s]를 클러스터 [uuid:%s]에 연결할 수 없습니다. 이미 네트워크가 구성되어 있기 때문입니다", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10011": "BareMetal2 프로비저닝 네트워크를 클러스터에 연결할 수 없습니다. 가용성 영역이 동일하지 않기 때문입니다", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10007": "vm[uuid:%s]은(는) mdev 디바이스[uuid:%s]를 보유한 호스트에서 시작할 수 없습니다", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10004": "실행 중인 vm에 mdev 디바이스를 동적으로 연결하지 못했습니다. 원인:%s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10002": "UUID:%s인 mdev 디바이스는 잘못된 상태로 인해 UUID:%s인 VM에 연결할 수 없습니다", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10003": "mdev 디바이스 [%s]는 가상화 환경에서 사용할 수 없습니다", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10000": "호스트 [%s]가 유지보수 모드로 전환하지 못했습니다. VM [%s]이(가) MDEV 디바이스를 연결하고 있어 자동 마이그레이션할 수 없기 때문입니다.", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10018": "게이트웨이 [uuid:%s]에서 프로비저닝된 네트워크[uuid:%s]를 업데이트하지 못했습니다: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10009": "Baremetal chassis [UUID:%s]가 활성화되어 있지 않거나 사용 가능하지 않습니다. 다른 것을 선택하십시오.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10001": "pci 디바이스 [uuid:%s]가 mdev임을 알고 있지만 사양을 찾을 수 없어 프로세스가 중단됩니다.", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10016": "모든 baremetal2 프로비저닝 네트워크가 %s에 존재하지 않습니다", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10014": "프로비저닝된 네트워크 [uuid:%s]에 의존하는 실행 중인 인스턴스가 있으므로 Baremetal2 프로비저닝 네트워크를 분리할 수 없습니다", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10015": "networkUuids가 빈 목록입니다", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10012": "BareMetal2 프로비저닝 네트워크를 클러스터에 연결할 수 없습니다. 동일한 프로비저닝 네트워크가 연결된 클러스터에 연결된 모든 게이트웨이를 확인해야 합니다. 계속하기 전에 모든 관련 게이트웨이가 일관되는지 확인하십시오.", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10013": "프로비저닝된 네트워크는 클러스터에 이미 연결된 l2 네트워크와 동일한 인터페이스 이름을 가지지 않아야 합니다", + "ORG_ZSTACK_NETWORK_L3_10006": "사용 가능한 IPv4 서브넷이 없어 IP 범위를 예약할 수 없습니다.", + "ORG_ZSTACK_NETWORK_L3_10005": "종료 IP [%s]가 시작 IP [%s]보다 작으므로 IP 범위를 예약할 수 없었습니다", + "ORG_ZSTACK_NETWORK_L3_10004": "종료 IP [%s]가 유효한 IPv6 주소가 아니므로 IP 범위를 예약할 수 없었습니다", + "ORG_ZSTACK_NETWORK_L3_10003": "종료 IP [%s]가 유효한 IPv4 주소가 아니므로 IP 범위를 예약할 수 없었습니다", + "ORG_ZSTACK_NETWORK_L3_10002": "시작 IP 주소 [%s]가 잘못되어 IP 범위를 예약할 수 없습니다", + "ORG_ZSTACK_NETWORK_L3_10000": "VM 네트워크 인터페이스 컨트롤러 [UUID:%s]에서 사용 중이므로 IP 주소를 삭제할 수 있습니다", + "ORG_ZSTACK_NETWORK_L3_10009": "사용 가능한 IPv6 서브넷이 없어 IP 범위를 예약할 수 없습니다. 네트워크 구성을 확인하거나 대신 IPv4 서브넷 예약을 시도하십시오.", + "ORG_ZSTACK_KVM_10001": "파일에서 호스트 정보를 로드하지 못했습니다. 원인\\n%s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10019": "UUID: %s인 mdev 디바이스가 UUID: %s인 VM에 연결되어 있지 않습니다", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10017": "SE-MDEV 디바이스를 보유한 VM[UUID:%s]은(는) 더 많은 SE-MDEV[%s]를 연결할 수 없습니다", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10018": "PCI 디바이스 [uuid:%s]를 관리하는 호스트 [uuid:%s]의 IOMMU가 [%s] 또는 [%s]로 구성되어 있지 않습니다.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10015": "vm[uuid:%s]에 연결된 mdev 디바이스가 mdev 디바이스[uuid:%s]와 다른 호스트에 있습니다", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10014": "vm[uuid:%s]에 연결된 PCI 디바이스가 mdev 디바이스[uuid:%s]와 다른 호스트에 있습니다", + "ORG_ZSTACK_NETWORK_L3_10010": "예약된 IP가 지정된 IP 범위[%s] 내에 있지 않아 IP 범위를 예약할 수 없었습니다", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10011": "현재 가상 머신에 연결된 mdev 디바이스의 상태를 수정할 수 없습니다. 변경하려면 먼저 디바이스를 분리하십시오.", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10007": "인스턴스가 BareMetal2 프로비저닝 네트워크 [uuid:%s]에 종속되어 있으므로 삭제할 수 없습니다", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10012": "mdev 장치 [uuid:%s]를 VM에 연결할 수 없습니다. 활성화되어 있고 연결되어 있지 않은지 확인하세요", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10008": "BareMetal2 클러스터가 아닌 클러스터에 BareMetal2 프로비저닝 네트워크를 연결할 수 없습니다", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10005": "baremetal2 프로비저닝 네트워크 DHCP 범위 넷마스크 %s가 유효하지 않습니다", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10006": "baremetal2 프로비저닝 네트워크 시작 IP %s와 종료 IP %s가 동일한 서브넷 마스크에 속하지 않습니다", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10003": "인스턴스가 BareMetal2 프로비저닝 네트워크 [uuid:%s]에 종속되어 있으므로 DHCP 구성을 업데이트할 수 없습니다", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10002": "DHCP 인터페이스 %s의 baremetal2 프로비저닝 네트워크가 이미 존재합니다. 다음 구성: 시작 IP %s, 종료 IP %s, 넷마스크 %s, 게이트웨이 %s", + "ORG_ZSTACK_NETWORK_L3_10018": "layer 3[%s]에 IP 범위가 지정되지 않았습니다", + "ORG_ZSTACK_NETWORK_L3_10015": "클라우드 구성에서 시스템과 카테고리를 모두 업데이트해야 합니다.", + "ORG_ZSTACK_XINFINI_10027": "NVMeOF 내보내기 기능은 현재 지원되지 않습니다.", + "ORG_ZSTACK_NETWORK_L3_10014": "주소 풀이 여전히 존재하므로 마지막 표준 IP 범위를 삭제할 수 없습니다.", + "ORG_ZSTACK_XINFINI_10026": "클라이언트[%s]에 대한 활성 게이트웨이가 발견되지 않았습니다", + "ORG_ZSTACK_NETWORK_L3_10013": "l3 네트워크 [uuid:%s]의 l2 네트워크 [uuid:%s]의 mtu 값이 novlan 네트워크의 제한을 초과하여 mtu를 설정할 수 없습니다", + "ORG_ZSTACK_XINFINI_10025": "NVMe over Fabrics (OF) 내보내기는 현재 지원되지 않습니다.", + "ORG_ZSTACK_XINFINI_10024": "xinfini는 총 QoS 레벨 설정만 지원합니다", + "ORG_ZSTACK_NETWORK_L3_10011": "새 범위가 기존 범위 [%s:%s]와重叠하여 IP 범위를 예약할 수 없습니다", + "ORG_ZSTACK_XINFINI_10023": "충분한 공간[%d]과 정상 상태를 가진 사용 가능한 풀이 없습니다", + "ORG_ZSTACK_XINFINI_10021": "풀[id:%d, name:%s] 가상 머신 정보를 가져오지 못했습니다", + "ORG_ZSTACK_XINFINI_10020": "계산 리소스 풀이 없습니다. 풀이 생성되어 사용 가능한지 확인하세요.", + "ORG_ZSTACK_KVM_10010": "호스트 [UUID: %s]에 CPU 모델 세부 정보가 없습니다. 이 문제를 해결하려면 호스트를 다시 연결하세요.", + "ORG_ZSTACK_KVM_10011": "강제 실행의 이유를 지정해야 합니다.", + "ORG_ZSTACK_NETWORK_L3_10019": "ip[%s]가 l3 네트워크[%s]와 연결된 IP 풀 [uuid:%s, cidr:%s]의 CIDR 범위에 있지 않습니다", + "ORG_ZSTACK_KVM_10012": "호스트[uuid:%s]가 종료되었습니다", + "ORG_ZSTACK_KVM_10002": "호스트 [hostname:%s, IP:%s]의 운영 체제 [OS]가 유효하지 않습니다", + "ORG_ZSTACK_KVM_10003": "클러스터[uuid:%s]에 OS 버전 [%s]의 호스트가 이미 존재하지만, 새로 추가된 호스트 [name:%s ip:%s]의 OS 버전은 [%s]입니다.", + "ORG_ZSTACK_KVM_10004": "vm[uuid:%s]가 커널 실패로 인해 충돌했습니다", + "ORG_ZSTACK_KVM_10005": "호스트[uuid: %s] 메모리 ECC 오류가 발생했습니다, 세부 정보: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10029": "지정된 관리 장치가 동일한 호스트에 있지 않습니다: 관리 장치[uuid: %s]가 호스트[uuid: %s]에 있는 반면 관리 장치[uuid: %s]가 호스트[uuid: %s]에 있습니다", + "ORG_ZSTACK_KVM_10006": "여전히 CPU 아키텍처가 같은 호스트가 있습니다, 세부 정보: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10026": "mdev 장치가 가상 머신 인스턴스에 연결되어 있으면 삭제할 수 없습니다. 삭제하기 전에 장치를 분리하세요.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10027": "VM[UUID:%s]를 시작하지 못함 - 모든 MDEV 사양[UUIDs:%s]이 존재하지 않음", + "ORG_ZSTACK_KVM_10008": "PCI Bridge ID는 0보다 크고 32보다 작아야 합니다", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10024": "중지 상태가 아닌 가상 머신 인스턴스에 관리 장치를 연결할 수 없습니다", + "ORG_ZSTACK_KVM_10009": "VM 현재 상태[%s] - virtioSCSI 수정을 위해서는 VM이 [%s] 상태여야 합니다", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10025": "잘못된 mdev 장치 유형 [%s] - 가상 장치만 허용됩니다", + "ORG_ZSTACK_NETWORK_L3_10021": "잘못된 클라우드 인스턴스 ID[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10022": "클러스터 UUID, 호스트 UUID 또는 VM UUID를 동시에 설정할 수 없습니다.%s", + "ORG_ZSTACK_NETWORK_L3_10020": "IP[%s]가 L3 네트워크[%s]에 연결된 IP 범위[uuid:%s, startIp:%s, endIp:%s] 내에 있습니다 - 허용되지 않음", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10023": "클러스터가 존재하지 않거나 비활성화되어 있습니다. 클러스터가 제대로 생성되고 활성화되어 있는지 확인하세요.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10020": "mdev 장치[UUID:%s]를 보유한 호스트 UUID [%s]가 [%s] 또는 [%s]과 일치하지 않습니다", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10021": "VM 인스턴스가 중지 상태가 아닐 때 mdev 장치를 분리할 수 없습니다. mdev 장치를 분리하기 전에 VM 인스턴스가 중지되어 있는지 확인하세요.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10053": "SDN 컨트롤러[IP:%s]에 구성된 가상 프라이빗 클라우드(VPC)가 없습니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10054": "VPC ID에 대한 시스템 태그는 필수입니다. 유효한 값을 제공하세요.", + "ORG_ZSTACK_MACVLAN_10002": "KVM 호스트[uuid:%s]에서 L2VLAN 네트워크[uuid:%s, name:%s]에 대한 VLAN 인터페이스[%s] 확인 실패 - %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10051": "SDN 컨트롤러에 구성된 스위치가 없습니다 [ip:%s]", + "ORG_ZSTACK_MACVLAN_10005": "L3 네트워크[uuid:%s]에 네트워크 서비스를 연결할 수 없습니다 - 개인용 기본 L3 네트워크에 대해 L2 네트워크[uuid:%s, vSwitchType:%s]가 L3 네트워크 서비스를 지원하지 않습니다", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10052": "컨트롤러에 연결된 SDN 스위치가 없습니다.%s", + "ORG_ZSTACK_MACVLAN_10004": "%s만 MACVLAN 네트워킹 모드를 지원합니다", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10057": "레이어 2 네트워크 %s에 대한 논리적 스위치를 가져오지 못함", + "ORG_ZSTACK_MACVLAN_10007": "UUID: %s인 L3 네트워크에 네트워크 서비스를 연결할 수 없습니다 - UUID: %s인 L2 네트워크가 개인용 기본 L3 네트워크에 대해 vRouter만 네트워크 제공자로 지원합니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10058": "레이어 2 네트워크에 대한 논리적 스위치 가져오기가 결과로 실패함: %s", + "ORG_ZSTACK_MACVLAN_10006": "UUID: %s인 L3 네트워크에 네트워크 서비스를 연결할 수 없습니다 - UUID: %s인 L2 네트워크가 VPC L3 네트워크에 대해 vRouter만 네트워크 제공자로 지원하며 vSwitchType: %s을 지원하지 않습니다.", + "ORG_ZSTACK_MACVLAN_10009": "KVM 호스트는 OVS로 설정된 vSwitchType의 L2 네트워킹만 지원합니다. 호스트가 KVM 유형이고 vSwitchType이 OVS로 구성되어 있는지 확인하세요.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10056": "물리적 스위치 포트 정보를 가져올 수 없습니다: %s", + "ORG_ZSTACK_MACVLAN_10008": "L3 네트워크[uuid:%s]에 네트워크 서비스를 연결할 수 없습니다 - L2 네트워크[uuid:%s, vSwitchType:%s]가 개인용 기본 L3 네트워크에 대해 로드 밸런서만 지원합니다", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10075": "루트 볼륨이 삭제되어 현재 이미지를 다시 만들 수 없습니다. 지원팀에 문의하세요.", + "ORG_ZSTACK_STORAGE_CEPH_10023": "문제는 액세스 키 ID, 비밀 액세스 키, SSH 포트 번호 또는 클라우드 환경의 불안정한 네트워크 연결로 인한 것일 수 있습니다. 이러한 설정을 확인하세요.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10050": "SDN 컨트롤러[IP:%s]에 테넌트가 없습니다", + "ORG_ZSTACK_STORAGE_CEPH_10020": "poolName은 null일 수 있지만 빈 문자열이어서는 안 됩니다", + "ORG_ZSTACK_KVM_10022": "호스트[%s], 사용자명[%s], 포트[%s]에 대한 SSH 연결이 실패함 - %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10073": "KVM 호스트[uuid:%s]에 빈 볼륨[uuid:%s, name:%s]을(를) 생성할 수 없습니다", + "ORG_ZSTACK_STORAGE_CEPH_10021": "importImages가 활성화된 경우 poolName을(를) 지정해야 합니다", + "ORG_ZSTACK_KVM_10023": "알 수 없는 이유로 호스트[%s]가 %d초 이내에 전원이 켜지지 않았습니다. BMC[%s]를(을) 통해 호스트 상태를 확인해 주세요.", + "ORG_ZSTACK_STORAGE_BACKUP_10092": "복원 보안 검증에 실패했습니다:\\n%s", + "ORG_ZSTACK_KVM_10014": "호스트 %s는 현재 관리 노드에서 관리되지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10000": "executeSlbGroupConfigTask 알 수 없는 작업 이름: %s", + "ORG_ZSTACK_MEVOCO_10049": "노드 A에 대한 구성 정보를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_BACKUP_10091": "백업 저장소 [UUID:%s]가 활성화되거나 구성되지 않았습니다", + "ORG_ZSTACK_KVM_10015": "호스트 %s가 연결되지 않아 KVM 에이전트 재시작을 건너뜁니다", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10039": "관리 장치가 연결되어 있어 루트 볼륨 [uuid:%s]을(를) 마이그레이션할 수 없습니다", + "ORG_ZSTACK_MEVOCO_10048": "로컬 구성과 클라우드 구성을 동시에 설정할 수 없습니다. 단일 배포 환경을 지정해 주세요.", + "ORG_ZSTACK_STORAGE_BACKUP_10090": "데이터베이스 백업 [uuid:%s]이(가) 아직 존재하지 않습니다", + "ORG_ZSTACK_KVM_10016": "호스트 %s에 실행 중인 작업이 존재합니다", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10081": "계산 노드 [%2$s]에서 플래그 파일 [%1$s]을(를) 찾을 수 없습니다. 이유: %3$s", + "ORG_ZSTACK_MEVOCO_10047": "예상치 못한 호스트 관리 IP 주소: [%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10037": "mdev 장치가 연결되어 있어 VM[UUID:%s]을(를) 마이그레이션할 수 없습니다", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10035": "mdev 장치[uuid:%s]을(를) 찾을 수 없습니다. 삭제되었거나 해제되었을 수 있습니다", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10036": "VM[UUID:%2$s]에 대한 mdev 장치 UUID: %s가 존재하지 않거나 비활성화되었습니다", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10034": "가상 머신 [uuid:%3$s]에 대해 대상 호스트 [uuid:%s]에서 사양 [uuid:%s]의 충분한 mdev 장치를 찾지 못했습니다", + "ORG_ZSTACK_MEVOCO_10041": "잘못된 값[%s], ZStack은 이러한 호스트 할당 유형을 지원하지 않습니다", + "ORG_ZSTACK_STORAGE_BACKUP_10099": "데이터베이스 백업[uuid:%s]이(가) 활성화되고 준비되지 않았습니다", + "ORG_ZSTACK_STORAGE_CDP_10120": "연결된 백업 저장소[uuid: %s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_BACKUP_10098": "볼륨[uuid:%s]이(가) 삭제되었으며 상태 변경이 허용되지 않습니다", + "ORG_ZSTACK_MEVOCO_10040": "잘못된 값[%s], 유효한 부동소수점 숫자가 아닙니다", + "ORG_ZSTACK_STORAGE_CDP_10121": "이 작업은 체인형 스냅샷을 생성할 볼륨 [UUID: %s]을(를) 포함합니다. 따라서 가상 머신 인스턴스에서 연속 데이터 보호(CDP) 작업이 실행 중인 경우 이 작업을 수행할 수 없습니다.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10032": "VM[uuid:%s]을(를) 시작할 후보 호스트를 결정하지 못했습니다. %s", + "ORG_ZSTACK_STORAGE_BACKUP_10097": "백업을 위해 사용 가능한 객체 스토리지 버킷을 찾지 못했습니다. 이 작업을 건너뜁니다.%s", + "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10001": "시스템 알람에서 시스템 토픽 제거는 금지되어 있습니다. 유효한 토픽 및 알람 UUID를 제공해 주세요.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10005": "SLB 인스턴스의 공용 네트워크 인터페이스를 찾을 수 없습니다", + "ORG_ZSTACK_MEVOCO_10046": "obj가 NicQos의 인스턴스가 아닙니다. 개체 유형이 예상 유형과 일치하는지 확인해 주세요.", + "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10000": "알람[uuid:%s]은 시스템에서 생성된 알ерт로 삭제할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10004": "SLB 인스턴스[uuid:%s] 구성 작업 버전:%d이(가) %d번 실패했습니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10003": "그룹[uuid:%s]에서 사용 가능한 SLB 인스턴스를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_BACKUP_10094": "데이터베이스 백업 버전[%s]이(가) 현재 버전[%s]과 일치하지 않습니다", + "ORG_ZSTACK_MACVLAN_10000": "KVM 호스트[uuid:%s]에서 l2VlanNetwork[uuid:%s, name:%s]의 브리지를 실현하지 못했습니다, %s", + "ORG_ZSTACK_MEVOCO_10043": "%s 값이(가) [%s]인 반면 %s 값은 [%s]이어서 충돌합니다", + "ORG_ZSTACK_STORAGE_BACKUP_10093": "listening을 위한 무료 포트를 할당하지 못했습니다. 필수 포트가 다른 애플리케이션에서 사용되고 있지 않은지 확인하세요. 문제가 지속되면 네트워크 구성을 확인하거나 지원을 문의하세요.", + "ORG_ZSTACK_MEVOCO_10060": "노드 A의 주소를 설정하지 못했습니다", + "ORG_ZSTACK_KVM_10030": "호스트 용량 확인 실패, 이유:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10082": "인스턴스 [%s]에 플래그 파일 [%s]을(를) 생성할 수 없습니다, 이유: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10060": "논리적 스위치 가져오기 실패: uuid: %s", + "ORG_ZSTACK_KVM_10032": "호스트[UUID: %s]의 사용 가능한 메모리 용량 [%s MB]이(가) 예약된 용량 [%s MB]보다 낮습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10083": "클러스터(%s)에 LocalStorage 기본 저장소가 없습니다(state=%s, status=%s). 클러스터에 여러 기본 저장소가 마운트되면 시스템은 기본적으로 로컬 기본 저장소를 사용합니다. 기본 저장소의 상태와_status를 확인하고 클러스터에 연결되었는지 확인하세요.", + "ORG_ZSTACK_KVM_10033": "kvm 호스트 [uuid:%s, ip:%s]에서 vm[uuid:%s]의 colo heartbeat를 등록할 수 없습니다, 이유: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10084": "선택한 기본 저장소[uuid:%s]의 유형이 로컬 저장소가 아닙니다. 클러스터에 로컬 기본 저장소가 연결된 경우 다른 사용 가능한 저장소에서 리소스를 생성할 수 있는지 확인하세요.", + "ORG_ZSTACK_KVM_10034": "kvm 호스트 [uuid:%s, ip:%s]에서colo 동기화 가상 머신[uuid:%s]을(를) 시작할 수 없습니다, 이유: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10085": "클러스터에 여러 기본 저장소[로컬 저장소(%s), 기타 비로컬 기본 저장소]가 마운트되어 있으므로 primaryStorageUuidForDataVolume 지정이 허용되지 않습니다 %s.", + "ORG_ZSTACK_KVM_10024": "알 수 없는 이유로 호스트[%s]가 %d초 내에 종료되지 않았습니다. BMC[%s]를 통해 호스트 상태를 확인하세요.", + "ORG_ZSTACK_MEVOCO_10059": "이 인스턴스는 노드 A와 연결되어 있지 않습니다", + "ORG_ZSTACK_MEVOCO_10058": "공장 모드에 있는 노드가 있습니다; ARPing 세부 정보: %s", + "ORG_ZSTACK_MEVOCO_10053": "curl 부트스트랩 에이전트 완료, 반환 코드: %s, 표준 출력: %s, 표준 오류: %s", + "ORG_ZSTACK_MEVOCO_10052": "900초 후 부트스트랩 작업 %s 결과를 가져올 수 없습니다", + "ORG_ZSTACK_MEVOCO_10050": "부트스트랩 에이전트에서 노드 A의 주소 정보를 찾을 수 없습니다", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10040": "MDEV 장치가 연결되어 있으므로 VM[UUID:%s]을(를) 마이그레이션할 수 없습니다", + "ORG_ZSTACK_MEVOCO_10057": "노드 A의 공장 모드 업데이트 실패, 세부 정보: %s", + "ORG_ZSTACK_MEVOCO_10056": "모든 관리 노드의 공장 모드 업데이트 실패, 세부 정보: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10013": "MAC 주소 %s이(가) 잘못되었습니다. 6c:b3:11:1b:0b:1e 형식이어야 합니다", + "ORG_ZSTACK_HA_10014": "USB 장치가 passthrough를 통해 연결되어 있으므로 VM [uuid:%s]에 FT를 설정할 수 없습니다", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10012": "베어메탈 PXE 서버 [UUID:%s]이(가) 활성화되어 있지도 연결되어 있지도 않습니다. 상태를 확인하세요.", + "ORG_ZSTACK_HA_10015": "mdev 장치가 연결되어 있으므로 가상 머신[uuid:%s]에 FT를 설정할 수 없습니다", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10015": "가상 머신 %s에 중복된 본드 UUID가 감지되었습니다. 본딩 구성에 고유한 UUID가 있는지 확인하십시오.", + "ORG_ZSTACK_HA_10016": "관리 노드가 호스트를 검색하지 못합니다. 호스트가 클라우드 환경 내에 올바르게 등록되어 있고 접근 가능한지 확인하십시오.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10014": "베어메탈 섀시 [UUID: %s]에 MAC 주소 %s의 네트워크 인터페이스가 없습니다.", + "ORG_ZSTACK_HA_10017": "값[%s]이(가) 유효한 범위 [0, 1]을 벗어났습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10057": "로컬 기본 저장소[uuid: %s]의 호스트[uuid: %s]에 충분한 용량이 없습니다[현재: %s바이트, 필요: %s].", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10017": "중복된 L3 네트워크 UUID가 감지되었습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10058": "리소스[uuid:%s]가 있는 호스트를 찾을 수 없습니다.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10016": "베어메탈 네트워크 본딩이 지원되지 않습니다.", + "ORG_ZSTACK_HA_10011": "VM[uuid:%s]이(가) 중지 상태가 아니므로 FT를 설정할 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10059": "리소스[uuid:%s]는 호스트[uuid:%s]에서만 작업할 수 있지만, 해당 호스트가 종료되었습니다.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10019": "선택한 레이어 3 네트워크를 섀시 [UUID:%s]에 할당할 수 없습니다.", + "ORG_ZSTACK_HA_10012": "하나 이상의 데이터 볼륨이 여전히 연결되어 있으므로 VM[uuid:%s]에 FT를 설정할 수 없습니다.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10018": "지정된 레이어 3 네트워크가 존재하지 않습니다. 네트워크 이름을 확인하고 다시 시도하십시오.", + "ORG_ZSTACK_HA_10013": "PCI 장치가 연결되어 있으므로 VM[uuid:%s]에 FT를 설정할 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10053": "로컬 기본 저장소에 데이터 볼륨을 프로비저닝하려면 시스템 태그 [%s]를 사용하여 데이터 볼륨이 생성될 호스트를 지정해야 합니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10054": "호스트 [UUID:%s]가 로컬 기본 저장소 [UUID:%s]와 연결되어 있지 않습니다.", + "ORG_ZSTACK_KVM_10040": "VM CPU 수를 늘리지 못했습니다, 오류 상세 정보: %s.", + "ORG_ZSTACK_HA_10018": "VM[uuid:%s]의 볼륨 저장 위치 기본 저장소가 유지 관리를 진행 중입니다.", + "ORG_ZSTACK_KVM_10043": "DNS 유효성 검사를 수행하기 위해 KVM[ip:%s, username:%s, SSH 포트:%d]에 연결할 수 없습니다. 자격 증명을 확인하십시오.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10050": "로컬 저장소에 데이터 볼륨이 있는 VM [uuid:%s]을(를) 라이브 마이그레이션할 수 없습니다. 먼저 데이터 볼륨을 분리해야 합니다.", + "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10001": "쿼리 객체가 null입니다. 클라우드 컴퓨팅 작업을 실행하기 전에 쿼리 매개 변수가 올바르게 초기화되었는지 확인하십시오.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10051": "로컬 저장소로 VM[UUID:%s]을(를) 라이브 마이그레이션할 수 없습니다. Linux 게스트만 지원됩니다. 현재 플랫폼은 [%s]입니다.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10011": "베어메탈 섀시[uuid:%s]에 대한 하드웨어 정보를 찾을 수 없습니다. 다른 것을 선택하십시오.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10052": "로컬 저장소에 ISO가 연결된 VM[UUID:%s]을(를) 라이브 마이그레이션할 수 없습니다. 먼저 모든 ISO를 분리하십시오.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10010": "해당 PXE 서버가 감지되지 않았습니다. 베어메탈 섀시[uuid:%s] 구성을 다시 확인하십시오.", + "ORG_ZSTACK_KVM_10035": "%s로 인해 KVM 호스트 [UUID:%s, IP:%s]에서 보조 VM[UUID:%s]을(를) 구성할 수 없습니다.", + "ORG_ZSTACK_MEVOCO_10028": "UUID [%s]가 있는 L3 네트워크를 찾을 수 없습니다. 정적 IP와 연결된 시스템 태그 [%s]를 확인하고 수정하십시오.", + "ORG_ZSTACK_STORAGE_BACKUP_10070": "UUID: %s가 있는 볼륨 백업을 찾을 수 없습니다.", + "ORG_ZSTACK_KVM_10036": "%s로 인해 KVM 호스트[UUID:%s, IP:%s]에서 기본 VM[UUID:%s]을(를) 구성할 수 없습니다.", + "ORG_ZSTACK_MEVOCO_10027": "볼륨 [%s]의 IOPS 값이 잘못되었습니다. 최대 제한인 %d을(를) 초과합니다.", + "ORG_ZSTACK_KVM_10037": "VM [UUID:%s]의 KVM 호스트 [UUID:%s, IP:%s]에서 초기 부팅 장치를 검색할 수 없습니다. 사유: %s", + "ORG_ZSTACK_MEVOCO_10026": "잘못된 볼륨 IOPS[%s]는 유효한 숫자가 아닙니다", + "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10000": "서드파티 Prometheus Namespace를 쿼리할 때 최소 하나의 Host UUID가 필요합니다. 쿼리 호출 파라미터의 라벨에 Host UUID가 포함되어 있는지 확인하세요.", + "ORG_ZSTACK_KVM_10038": "vm[uuid:%s] 장치 주소를 검색하지 못했습니다. 사유:%s", + "ORG_ZSTACK_MEVOCO_10025": "잘못된 IOPS 값[%s]입니다. 1 이상이어야 합니다 (1 포함)", + "ORG_ZSTACK_KVM_10039": "host[uuid:%s]의 가상화 정보를 검색하지 못했습니다. 이유:%s", + "ORG_ZSTACK_MEVOCO_10029": "USB 장치 접근은 관리자 계정으로 제한됩니다. 관리자 권한이 있는 계정으로 로그인했는지 확인하세요.", + "ORG_ZSTACK_STORAGE_BACKUP_10078": "백업 스토리지가 %s 상태이기 때문에 진행할 수 없습니다", + "ORG_ZSTACK_MEVOCO_10020": "잘못된 볼륨 대역폭[%s]은 숫자 값이어야 합니다", + "ORG_ZSTACK_STORAGE_BACKUP_10077": "백업 스토리지가 %s 상태이기 때문에 진행할 수 없습니다", + "ORG_ZSTACK_STORAGE_BACKUP_10076": "백업 스토리지 [UUID: %s, Name: %s]에 이미지 [%s]를 다운로드할 용량이 부족합니다. 필요 크기: %s, 사용 가능 크기: %s.", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10001": "Ceph 백업 스토리지 [uuid:%s]의 모든 Ceph MON 노드가 연결 해제되었습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10075": "URL %s에서 가져온 이미지 크기가 %d 바이트로, 이미지로서 너무 작습니다. URL을 다시 확인하세요.", + "ORG_ZSTACK_STORAGE_BACKUP_10074": "이미지 URL %s에서 헤더를 가져오지 못했습니다", + "ORG_ZSTACK_STORAGE_BACKUP_10073": "이미지 URL %s에서 헤더를 가져오지 못했습니다: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10072": "먼저 다른 노드를 종료하세요!", + "ORG_ZSTACK_MEVOCO_10021": "잘못된 볼륨 대역폭[%s]이(가) 최대 허용 값 %d을(를) 초과합니다", + "ORG_ZSTACK_STORAGE_BACKUP_10071": "VM 클러스터 [%s]가 기본 스토리지 클러스터 [%s]와 동일한 위치에 있지 않습니다.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10023": "파괴된 상태가 아닌 베어메탈 인스턴스를 제거할 수 없습니다", + "ORG_ZSTACK_HA_10005": "호스트 스캔에 실패했습니다 [uuid:%s, ip:%s]", + "ORG_ZSTACK_IDENTITY_LOGIN_10000": "지원되지 않는 인증 방법 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10068": "클러스터 [UUID=%s]에 LocalStorage 및 기타 비-LocalStorage 기본 스토리지를 포함하여 여러 개의 기본 스토리지가 마운트되어 있습니다. 데이터 디스크가 있는 기본 스토리지를 지정해야 합니다.", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10003": "이미지 %s를 백엔드 스토리지 %s에서 백엔드 스토리지 %s로 마이그레이션하지 못했습니다. 원인: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10002": "마이그레이션 설치 경로 [%s]에 대한 백업 스토리지 [%s]에서 휴지통 ID (%s)를 찾았습니다. 이미지 [%s] 마이그레이션을 계속하려면 'APICleanUpTrashOnBackupStorageMsg'를 사용하여 먼저 정리하세요.", + "ORG_ZSTACK_HA_10000": "가상 머신 인스턴스가 종료된 것 같습니다. 상태 확인 건너뛰는 중.", + "ORG_ZSTACK_HA_10001": "이름:[%s] 및 uuid:[%s]로 가상 머신을 찾을 수 없습니다, 호스트 uuid가 null입니다", + "ORG_ZSTACK_HA_10002": "HAHostChecker 인스턴스를 찾지 못하여 고가용성 검사를 수행할 수 없습니다. 필요한 모든 구성 요소가 적절하게 구성되어 있는지 확인하세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10064": "호스트 [uuid:%s]의 물리적 용량 사용량이 임계값 [%s]을 초과했습니다. 리소스 확장 또는 최적화를 고려하세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10067": "클러스터[uuid=%s]에 LocalStorage 및 기타 비-LocalStorage 기본 스토리지를 포함하여 여러 개의 기본 스토리지 솔루션이 구성되어 있습니다. 루트 디스크가 있는 기본 스토리지를 지정해야 합니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10060": "KVM 호스트 [UUID: %s]를 로컬 기본 스토리지 [UUID: %s]에 추가하지 못했습니다. %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10020": "ZStack의 베어 메탈 서비스 배포에서는 ISO 이미지만 지원됩니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10061": "KVM 호스트[uuid:%s, ip:%s]에 빈 스냅샷 볼륨[이름:%s, 설치 경로: %s]을(를) 생성할 수 없습니다. 이유: %s", + "ORG_ZSTACK_KVM_10054": "가상 머신[uuid:%s]이(가) %s 상태이므로 볼륨 스냅샷 병합을 수행할 수 없습니다. 이 작업은 가상 머신이 실행 중이거나 중지된 상태에서만 허용됩니다.", + "ORG_ZSTACK_HA_10008": "호스트[UUID: %s]에서 자체 페이서 상태를 동기화하는 동안 예외가 발생했습니다: %s", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10000": "클라우드 관리 서버[%s]에서 폴더[%s]를(을) 찾을 수 없습니다.", + "ORG_ZSTACK_KVM_10055": "라이브 볼륨 스냅샷 병합에는 %s보다 높은 libvirt 버전이 필요합니다. 현재 버전은 %s입니다. VM을 중지하고 작업을 재시도하거나 필요한 경우 데이터 볼륨을 분리하십시오.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10062": "SFTP 백업 스토리지[호스트명:%s, 경로: %s]에서 로컬 기본 스토리지[uuid:%s, 경로: %s](으)로 비트 전송에 실패했습니다. %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10022": "Destroyed 상태에 있지 않은 베어메탈 인스턴스는 복구할 수 없습니다. 복구를 시도하기 전에 인스턴스가 Destroyed 상태인지 확인하십시오.", + "ORG_ZSTACK_HA_10009": "스토리지 네트워크를 사용할 수 없으므로 고가용성을 유지해야 하므로 %s 매개변수를 '%s'(으)로 설정할 수 없습니다.", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10001": "네임스페이스[%s]에 메트릭[%s]이(가) 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10063": "로컬 스토리지[uuid:%s, 경로:%s]에서 SFTP 백업 스토리지[호스트명:%s, 원격 경로:%s](으)로 비트 업로드에 실패했습니다. %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10021": "ZStack 베어 메탈 서비스에서는 이미지 스토어 백업 스토리지만 지원됩니다.", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10002": "네임스페이스[%s]의 메트릭[%s]에 %s라는 레이블이 없습니다.", + "ORG_ZSTACK_MEVOCO_10039": "잘못된 값[%s]입니다. (0, 1] 범위 내의 double 값이어야 합니다 (1 포함).", + "ORG_ZSTACK_KVM_10047": "호스트[UUID: %s, 상태: %s]가 연결되어 있지 않습니다.", + "ORG_ZSTACK_COMPUTE_OVS_10000": "ovs CPU 피닝 리소스 구성:[%s] 형식 오류입니다.", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10001": "의도적으로 1: 소스 파일을 찾을 수 없습니다. 필요한 모든 파일이 올바르게 업로드되고 프로젝트 설정에 포함되어 있는지 확인하십시오.", + "ORG_ZSTACK_MEVOCO_10037": "잘못된 값[%s]입니다. 0보다 커야 하는 양의 부동 소수점 숫자여야 합니다.", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10002": "의도적으로: 2 - 이 오류는 실행 중 작업이 의도적으로 종료되었거나 수정되었음을 나타냅니다. 입력 매개변수를 확인하고 클라우드 컴퓨팅 환경의 요구 사항을 충족하는지 확인하십시오.", + "ORG_ZSTACK_MEVOCO_10031": "인증에 대한 알 수 없는 보안 코드[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10089": "%s로 인해 볼륨 백업 메타데이터 작업이 실패했습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10087": "이미지 스토어[uuid:%s]에 볼륨 백업 메타데이터 파일을 생성하지 못했습니다. IO 오류: %s", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10000": "의도적으로: 3 - 클라우드 인스턴스가 종료되고 있습니다. 작업을 확인하십시오.", + "ORG_ZSTACK_MEVOCO_10034": "호스트[UUID:%s]의 운영 체제 %s %s가 네트워크 또는 디스크 I/O에 대한 QoS를 지원하기 너무 오래되었습니다. QoS 구성 없이 다른 인스턴스를 선택하십시오.", + "ORG_ZSTACK_MEVOCO_10033": "%s은(는) 유효한 CIDR 표기법이 아닙니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10010": "잘못된 VLAN 범위 [%s, %s]로 Huawei iMaster SDN 컨트롤러를 추가할 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10008": "ISO[uuid: %s]가 VM[uuid: ]에 연결되어 있지만 ISO 파일이 블록 스토리지에 없습니다. VM을 마이그레이션하기 전에 분리해야 합니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10009": "볼륨 %s에 대한 블록 SCSI LUN을 찾을 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10035": "호스트[uuid:%s]가 로컬 스토리지[uuid:%s]에 액세스할 수 없습니다. 분리 때문일 수 있습니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10013": "논리적 라우터 UUID 없이 Huawei iMaster NSE L3 네트워크를 생성할 수 없습니다.", + "ORG_ZSTACK_MEVOCO_10093": "DeleteVolumeQos [%s]가 계정 권한으로 인해 무시되었습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10036": "리소스[uuid:%s, type: %s]가 로컬 기본 스토리지[uuid:%s]에서 사용 가능하지 않습니다", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10014": "L2 네트워크 [uuid:%s]로 Huawei iMaster L3 네트워크를 생성할 수 없습니다. 이미 존재하기 때문입니다", + "ORG_ZSTACK_MEVOCO_10092": "잘못된 볼륨 서비스 품질 모드: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10037": "로컬 기본 스토리지[uuid:%s]의 리소스[uuid:%s, type: %s]가 여러 하이퍼바이저에 매핑됩니다%sWithMultipleHypervisors", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10011": "VLAN 범위나 VLAN ID 없이 Huawei iMaster SDN 컨트롤러를 추가할 수 없습니다", + "ORG_ZSTACK_MEVOCO_10091": "이 인스턴스에 연결된 볼륨이 없습니다. 진행하려면 볼륨을 연결하세요.", + "ORG_ZSTACK_STORAGE_BACKUP_10058": "다른 클러스터에 연결된 기본 스토리지를 지정할 수 없습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10057": "다음 매개변수 중 하나 이상을 지정해야 합니다: L3 네트워크 UUID, Zone UUID, 클러스터 UUID, 호스트 UUID", + "ORG_ZSTACK_MEVOCO_10090": "여러 VM에 연결된 볼륨의 스냅샷을 생성할 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10033": "호스트 UUID가 지정되지 않았기 때문에 로컬 기본 스토리지[uuid:%s]에 데이터 볼륨[uuid: %s]을 생성할 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10034": "활성화된 호스트 상태가 없습니다. 호스트 리소스의 가용성을 확인하세요.", + "ORG_ZSTACK_KVM_10064": "KVM 호스트[uuid:%s, ip:%s]에서 가상 머신[vm:%s]의 네트워크 인터페이스를 업데이트하지 못했습니다. 이유: %s", + "ORG_ZSTACK_KVM_10065": "KVM 호스트[UUID: %s, IP: %s]에 NIC UUID: %s를 VM UUID: %s에 연결하지 못했습니다. 이유: %s. 다시 시도하거나 UUID: %s의 장치를 수동으로 삭제하세요.", + "ORG_ZSTACK_KVM_10066": "KVM 호스트[UUID: %s, IP: %s]에 NIC UUID: %s를 VM UUID: %s에 연결하지 못했습니다. 이유: %s", + "ORG_ZSTACK_KVM_10067": "KVM 호스트[uuid:%s, ip:%s]에서 VM[uuid:%s, name:%s]의 데이터 볼륨[uuid:%s, installPath:%s]를 분리하지 못했습니다. 이유: %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10005": "포트 포워딩 규칙 [uuid:%s]이 삭제되었습니다", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10006": "포트 포워딩 규칙 [uuid:%s]이 활성화되지 않았습니다. 현재 상태: %s", + "ORG_ZSTACK_KVM_10059": "VM[uuid:%s]이 실행 중 또는 중지 상태가 아닙니다. 현재 상태[%s]", + "ORG_ZSTACK_TICKET_10000": "티켓[uuid:%s, name:%s]은 취소된 후에만 업데이트할 수 있습니다. 현재 상태: %s", + "ORG_ZSTACK_TICKET_10001": "작업이 거부되었습니다. 작업은 계정/가상 ID[uuid:%s]에 의해 수행되어야 합니다", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10017": "SDN 컨트롤러[IP:%s]에서 토큰을 가져오지 못했습니다", + "ORG_ZSTACK_MEVOCO_10086": "VM[uuid:%s]이 작동을 중지했습니다. 나중에 다시 시도하세요.", + "ORG_ZSTACK_STORAGE_BACKUP_10056": "볼륨[UUID: %s]의 현재 VM[UUID: %s]이 백업에 사용된 VM[UUID: %s]이 더 이상 아닙니다", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10003": "호스트에 LUN을 매핑 흐름을 실행할 수 없습니다. PS 호스트 참조 메타데이터가 비어 있습니다. 호스트 구성을 확인하고 필요한 메타데이터가 채워져 있는지 확인하세요.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10018": "SDN 컨트롤러[ip:%s]에서 토큰을 가져오지 못했습니다. 이유: %s", + "ORG_ZSTACK_MEVOCO_10085": "볼륨 UUID [uuid: %s]에서 스냅샷을 찾을 수 없습니다. 검증이 필요한 스냅샷 체인이 없을 수 있습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10055": "그룹[uuid:%s]의 루트 볼륨 스냅샷을 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10000": "백엔드 장치가 null이기 때문에 논리 유닛을 호스트에 매핑을 실행할 수 없습니다.%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10015": "L3 네트워크 [UUID:%s]과 연결되어 있기 때문에 Huawei 논리 라우터 [UUID:%s]을 삭제할 수 없습니다", + "ORG_ZSTACK_MEVOCO_10084": "볼륨 [uuid: %s]에서 최신 스냅샷을 찾을 수 없습니다. 유효화를 위한 스냅샷 체인이 존재하지 않을 수 있습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10054": "그룹 UUID에 대한 백업 볼륨을 찾을 수 없습니다: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10016": "SDN 컨트롤러 [IP:%s]의 토큰을 가져오지 못함", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10001": "PS 호스트 참조가 null이므로 LUN을 호스트에 매핑하는 흐름을 실행할 수 없습니다. 호스트 참조가 올바르게 설정되어 있는지 확인하세요.", + "ORG_ZSTACK_MEVOCO_10083": "볼륨의 [UUID: %s] 스냅샷 트리에서 지정된 스냅샷을 찾을 수 없습니다. 유효화가 필요한 스냅샷 체인이 존재하지 않을 수 있습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10053": "리소스[uuid: %s]가 이미 CDP 작업을 시작했으므로, 백업 작업을 동시에 생성할 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10006": "KVM 호스트 [UUID: %s]가 블록 기본 스토리지 [UUID: %s]에 추가되지 못함, %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10009": "포트 포워딩 규칙[uuid:%s]이 활성화되지 않았습니다, 현재 상태는 %s입니다. 규칙은 활성화된 상태일 때만 연결할 수 있습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10052": "VM[uuid:%s]의 백업을 생성하지 못했습니다. 해당 VM이[%s, %s] 상태가 아니기 때문입니다.", + "ORG_ZSTACK_MEVOCO_10089": "볼륨[%s]의 스냅샷을 생성할 수 없습니다. 볼륨[UUID: %s]이 여러 번 정의되어 있기 때문입니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10051": "볼륨[uuid: %s]은(는) 루트 볼륨이 아닙니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10019": "SDN 컨트롤러 [IP:%s]의 토큰을 삭제하지 못함: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10004": "잘못된 볼륨 ID로 인해 볼륨을 호스트에 매핑하는 흐름을 실행할 수 없습니다.%s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10007": "포트 포워딩 규칙 [uuid:%s]이(가) 어떤 가상 머신 네트워크 인터페이스에도 연결되어 있지 않아 분리할 수 없습니다.", + "ORG_ZSTACK_MEVOCO_10088": "볼륨[uuid: %s]이(가) 연결되어 있지 않은 상태에서 볼륨[%s]의 스냅샷을 생성할 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10005": "잘못된 LUN 유형으로 인해 LUN을 호스트에 매핑하는 흐름을 실행할 수 없습니다: %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10008": "포트 포워딩 규칙 [uuid:%s]이(가) 이미 vm nic [uuid:%s]에 연결되어 있어 다시 할당할 수 없습니다.", + "ORG_ZSTACK_MEVOCO_10087": "실행 중인 VM[uuid:%s]에 연결된 호스트 UUID가 없습니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10020": "SDN 컨트롤러 [IP:%s]의 테넌트를 가져오지 못함", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10021": "SDN 컨트롤러 [IP:%s]의 테넌트를 가져오지 못함: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10019": "블록 기본 스토리지 [uuid:%s, name:%s]가 볼륨 인스턴스화를 위해 연결된 클러스터 내에서 사용 가능한 호스트를 찾을 수 없습니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10024": "SDN 컨트롤러 [IP:%s]에서 논리 스위치 포트를 가져오지 못함", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10047": "데이터 볼륨 [uuid:%s]을(를) VM [uuid:%s]에 연결할 수 없습니다. VM의 루트 볼륨과 데이터 볼륨이 모두 로컬 기본 스토리지에 있지만 서로 다른 호스트에 있습니다. 루트 볼륨 [uuid:%s]은(는) 호스트 [uuid:%s]에 있고, 데이터 볼륨 [uuid:%s]은(는) 호스트 [uuid:%s]에 있습니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10025": "sdn 컨트롤러에서 스위치 포트 정보를 가져오지 못함 [ip:%s]: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10048": "데이터 볼륨 [name: %s, UUID: %s]이(가) 로컬 스토리지 [UUID: %s]에 있습니다. 그러나 데이터 볼륨이 있는 호스트가 삭제되었습니다. 이 볼륨을 복구할 수 없습니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10022": "SDN 컨트롤러의 스위치 디바이스를 가져오지 못함 [ip:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10069": "VM이 현재 백업 작업을 생성 중이므로 CDP 작업을 동시에 활성화할 수 없습니다. CDP를 활성화하기 전에 모든 백업 작업이 완료되었는지 확인하세요.", + "ORG_ZSTACK_KVM_10070": "KVM 호스트[uuid:%s, ip:%s]에서 가상 머신[uuid:%s name:%s]을(를) 종료하지 못함: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10049": "vm[uuid:%s, name:%s]을(를) 복구할 수 없습니다. vm의 루트 볼륨이 로컬 스토리지[uuid:%s]에 있지만, 루트 볼륨이 있는 호스트가 삭제되었습니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10023": "SDN 컨트롤러의 스위치 디바이스를 가져오지 못함 [IP:%s]: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10068": "호스트 클러스터 [uuid: %s]가 볼륨 클러스터 [uuid: %s]와(과) 동일한 위치에 있지 않습니다. 1차 스토리지가 동일한 클러스터 내에 있는지 확인하십시오.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10020": "VM [이름: %s UUID: %s]이(가) [UUID: %s]와(과) 다른 VIP로 포트 포워딩 규칙을 이미 가지고 있습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10044": "생성 작업이 이미지 캐시 [uuid: %s, 위치 호스트 uuids: [%s]]에 의존하므로, 다른 위치에서 생성할 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10045": "로컬 스토리지는 하이퍼바이저[%s]에 대한 라이브 마이그레이션을 지원하지 않습니다.", + "ORG_ZSTACK_KVM_10075": "KVM 호스트[uuid:%s ip:%s]에서 VM[uuid:%s 이름:%s]을(를) 중지하지 못했습니다. 이유는 %s입니다.", + "ORG_ZSTACK_KVM_10078": "호스트[uuid:%s]에 CPU[%s]와 메모리[%s 바이트]를 할당할 수 있는 충분한 용량이 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10017": "VIP 포트 범위 [vipStartPort:%s, vipEndPort:%s]가 네트워크 규칙 [uuid:%s, vipStartPort:%s, vipEndPort:%s]과(와)重叠됩니다.", + "ORG_ZSTACK_KVM_10069": "KVM 호스트[uuid:%s ip:%s]에서 데이터 볼륨[uuid:%s 설치 경로:%s]을(를) VM[uuid:%s 이름:%s]에 연결하지 못했습니다. 이유는 %s입니다.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10014": "잘못된 CIDR[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10015": "잘못된 CIDR[%s], IPv4 주소만 지원됩니다.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10012": "VIP 포트 범위 [vipStartPort:%s, vipEndPort:%s]가 프라이빗 포트 범위 [privateStartPort:%s, privateEndPort:%s]와(과) 호환되지 않아 포트 포워딩 규칙을 생성할 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10010": "볼륨 목록에 대한 SCSI LUN을 찾을 수 없습니다:%s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10013": "범위 기반 포트 포워딩의 경우 포트 범위 크기가 일치해야 합니다. VIP 범위 [%s, %s]의 크기가 [%s, %s]의 크기와 일치하지 않습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10010": "VM NIC의 게스트 L3 네트워크와 포트 포워딩 규칙의 VIP L3 네트워크가 동일한 네트워크입니다 (uuid: %s, uuid: %s)", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10028": "SDN 컨트롤러[ip:%s]의 패브릭을 가져오지 못했습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10013": "Ceph가 포함된 경우 여러 호스트에서 동시에 볼륨 스냅샷을 생성하는 작업은 지원되지 않습니다.", + "ORG_ZSTACK_MEVOCO_10097": "제공된 Java 코드 스니펫에 소스 파일이 누락되었습니다. 모든 필요한 파일이 포함되어 있는지 확인하고 다시 컴파일하십시오. 또한, \"unknown message version\" 오류 메시지는 지원되지 않거나 인식되지 않는 메시지 형식을 나타냅니다. 메시지 버전을 확인하고 시스템과 호환되는지 확인하십시오.", + "ORG_ZSTACK_STORAGE_BACKUP_10067": "백업 작업에 사용 가능한 객체 스토리지 버킷을 찾을 수 없습니다. 객체 스토리지 서비스가 클라우드 환경 내에서 올바르게 구성되고 접근 가능한지 확인하십시오.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10014": "VM에 볼륨을 연결하기 전에 LUN을 호스트에 매핑하지 못했습니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10029": "%s로 인해 SDN 컨트롤러[ip:%s]에서 패브릭 네트워크를 가져오지 못했습니다.", + "ORG_ZSTACK_MEVOCO_10096": "관리자 권한이 없는 계정은 최대 대역폭 제한 %s를 초과할 수 없습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10066": "VM이 중지 상태가 아닙니다: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10026": "SDN 컨트롤러[IP:%s]의 VPC를 가져오지 못했습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10011": "블록 SCSI LUN 정보 교환 실패:%s", + "ORG_ZSTACK_MEVOCO_10095": "SetVolumeQosMsg 버전 1은 클라우드 컴퓨팅 환경에서 더 이상 사용되지 않습니다. 최적의 성능과 호환성을 위해 버전 2로 마이그레이션하십시오.", + "ORG_ZSTACK_STORAGE_BACKUP_10065": "볼륨 백업[uuid:%s]으로 VM을 찾을 수 없습니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10027": "%s로 인해 SDN 컨트롤러[IP:%s]의 VPC를 가져오지 못했습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10012": "볼륨 분리 후 리소스 정리 실패: %s", + "ORG_ZSTACK_MEVOCO_10094": "현재 VM이 %s 상태이므로 호스트 %s에서 VM의 볼륨 QoS를 삭제할 수 없습니다. 지원되는 상태는 [%s, %s]입니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10064": "백업[uuid:%s]의 원본 볼륨[uuid:%s]이 더 이상 가상 머신[uuid:%s]에 연결되어 있지 않습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10063": "백업용 원본 스냅샷[uuid:%s]이(가) 삭제되어 볼륨을 해당 스냅샷으로 복원할 수 없습니다", + "ORG_ZSTACK_MEVOCO_10099": "비관리자 계정은 가상 리소스에 대한 총 %s 제한만 설정할 수 있습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10061": "볼륨 백업[uuid:%s]이(가) 현재 %s 상태이므로 볼륨 복원에 사용할 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10016": "이미지 캐시를 다운로드할 때는 primaryStorageUuid가 필수입니다.", + "ORG_ZSTACK_MEVOCO_10098": "알 수 없는 서비스 품질(QoS) 제한 유형이 지정되었습니다. QoS 제한 유형이 올바르게 구성되어 있는지 확인하십시오.", + "ORG_ZSTACK_STORAGE_BACKUP_10060": "루트 볼륨 백업이 아닌 볼륨 백업[uuid:%s]에서 VM을 생성할 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10017": "VM에 다른 호스트 [%s]에 여러 개의 로컬 볼륨이 있습니다. 비정상적인 VM 로컬 볼륨을 확인하십시오.", + "ORG_ZSTACK_STORAGE_CEPH_10004": "잘못된 모니터링 URL[%s], 호스트 이름은 null일 수 없습니다. 유효한 모니터링 URL 형식은 %s입니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10032": "iMaster 논리 스위치 [%s] 응답 없음", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10018": "호스트[Host UUID: %s]의 볼륨은 VM이 다른 호스트[Host UUID: %s]에 로컬 볼륨을 가지고 있으므로 VM에 연결할 수 없습니다.", + "ORG_ZSTACK_STORAGE_CEPH_10005": "잘못된 모니터링 URL[%s], SSH 포트가 유효한 범위(1-65535)를 벗어났습니다. 유효한 모니터링 URL 형식은 %s입니다.", + "ORG_ZSTACK_STORAGE_CEPH_10002": "비관리자 계정은 가상 리소스에 대한 총 %s 제한만 설정할 수 있습니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10030": "볼륨 백업[uuid:%s]이(가) 현재 %s 상태이므로 볼륨 복원에 사용할 수 없습니다.", + "ORG_ZSTACK_STORAGE_CEPH_10003": "이미지 캐시를 다운로드할 때는 primaryStorageUuid가 필수입니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10035": "알 수 없는 서비스 품질(QoS) 제한 유형이 지정되었습니다. QoS 제한 유형이 올바르게 구성되어 있는지 확인하십시오.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10013": "루트 볼륨 백업이 아닌 볼륨 백업[uuid:%s]에서 VM을 생성할 수 없습니다", + "ORG_ZSTACK_STORAGE_CEPH_10008": "VM에 다른 호스트 [%s]에 여러 개의 로컬 볼륨이 있습니다. 비정상적인 VM 로컬 볼륨을 확인하십시오.", + "ORG_ZSTACK_STORAGE_BACKUP_10038": "잘못된 모니터링 URL[%s], 호스트 이름은 null일 수 없습니다. 유효한 모니터링 URL 형식은 %s입니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10036": "iMaster 논리 스위치 [%s] 응답 없음", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10014": "호스트[Host UUID: %s]의 볼륨은 VM이 다른 호스트[Host UUID: %s]에 로컬 볼륨을 가지고 있으므로 VM에 연결할 수 없습니다.", + "ORG_ZSTACK_STORAGE_CEPH_10009": "잘못된 모니터링 URL[%s], SSH 포트가 유효한 범위(1-65535)를 벗어났습니다. 유효한 모니터링 URL 형식은 %s입니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10037": "잘못된 모니터링 URL[%s], SSH 사용자명:SSH 암호 구성 요소가 유효하지 않습니다. 유효한 모니터링 URL 형식은 %s입니다.", + "ORG_ZSTACK_STORAGE_CEPH_10006": "Huawei iMaster 논리 스위치 [%s] 생성 실패: %s", + "ORG_ZSTACK_KVM_10080": "잘못된 모니터링 URL[%s]. SSH 사용자명과 암호는 ':'로 구분해야 하며 빈 값일 수 없습니다. 유효한 모니터링 URL 형식은 %s입니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10033": "[%s] Huawei iMaster 가상 스위치 포트 [%s] 실패: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10036": "VM을 다른 클러스터로 마이그레이션할 때 UUID가 %s인 클러스터와 UUID가 %s인 클러스터는 L2 네트워크 내에서 통신할 수 없습니다.", + "ORG_ZSTACK_STORAGE_CEPH_10007": "Ceph 풀[UUID:%s]이(가) 이미 존재하며 ZStack 환경의 다른 곳에서 사용 중이므로 재사용할 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10016": "잘못된 url[%s], 형식은 hostname:/path이어야 합니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10035": "논리 스위치[%s]의 포트 정보를 가져오지 못했습니다: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10034": "URL[%s]이(가) '/'로 시작하는 유효한 절대 경로가 아닙니다. 'http://' 또는 'https://'로 시작해야 합니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10010": "UUID [%s]인 볼륨은 VM UUID [%s]의 루트 볼륨입니다. 현재 VM에는 %s개의 데이터 볼륨이 연결되어 있습니다. 마이그레이션 전에 연결을 해제해 주세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10011": "볼륨 [UUID:%s]은 VM [UUID:%s]의 루트 볼륨입니다. 현재 가상 머신에 ISO가 연결되어 있습니다. 마이그레이션 전에 연결을 해제해 주세요.", + "ORG_ZSTACK_KVM_10088": "KVM 호스트[UUID:%s, IP:%s]에서 물리적 네트워크 인터페이스[이름: %s] 확인 실패", + "ORG_ZSTACK_KVM_10079": "호스트[%s]의 Spice 채널 구성 업데이트 실패: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10021": "볼륨: %s이(가) 연결되어 있지 않아 볼륨에 대한 이미지 캐시 생성 실패", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10024": "볼륨 다운로드 경로를 찾을 수 없음: %s, 진행하기 전에 준비해 주세요", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10039": "Huawei iMaster NCE 논리 라우터[%s] 삭제 실패, 원인: %s", + "ORG_ZSTACK_MEVOCO_10064": "전체 클러스스트의 호스트 OS를 업데이트하려면 먼저 %s으로(로) 그레이스케일 업그레이드를 비활성화하세요. 또는 특정 호스트 UUID로 클러스터 OS를 업데이트해 보세요.", + "ORG_ZSTACK_STORAGE_BACKUP_10034": "볼륨 백업 [uuid:%s]이(가) 어떤 저장 매체에서도 찾을 수 없음", + "ORG_ZSTACK_MEVOCO_10063": "네트워크 인바운드 대역폭이 최대 허용 값인 32 Gbps를 초과합니다", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10025": "볼륨 %s을(를) 다운로드할 호스트를 찾을 수 없음", + "ORG_ZSTACK_STORAGE_BACKUP_10033": "그룹 UUID: %s 내의 볼륨 백업에 대한 권한이 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10022": "볼륨: %s에 대한 대상 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10037": "Huawei iMaster 가상 스위치 포트 [%s] 삭제 실패, 원인: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10032": "그룹 uuid: %s 내에서 여러 개의 루트 디스크가 발견됨", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10023": "볼륨 %s을(를) 매핑할 호스트를 찾지 못함", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10038": "Huawei iMaster 가상 라우터[%s] 생성 실패, 원인: %s", + "ORG_ZSTACK_MEVOCO_10061": "관리 노드 상태가 %s이(가) 아닙니다", + "ORG_ZSTACK_STORAGE_BACKUP_10031": "그룹 UUID: %s 내에서 루트 볼륨이 누락됨", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10026": "호스트 이니시에이터 참조를 가져오지 못함, 이 호스트를 다시 연결해 주세요: %s", + "ORG_ZSTACK_MEVOCO_10066": "", + "ORG_ZSTACK_MEVOCO_10065": "네트워크 아웃바운드 대역폭이 32 Gbps의 최대 값을 초과합니다", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10042": "Huawei iMaster 서브넷[%s] 생성 실패, 원인: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10028": "로컬 저장소[uuid:%s]의 모든 호스트로 이미지[uuid:%s] 다운로드 실패. %s", + "ORG_ZSTACK_STORAGE_CEPH_10015": "잘못된 monUrl[%s]. 유효한 URL은 %s 형식이어야 합니다", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10043": "Huawei iMaster 서브넷[%s] 삭제 실패, 원인: %s", + "ORG_ZSTACK_STORAGE_CEPH_10016": "dataVolumePoolName은 null일 수 있지만 빈 문자열이어서는 안 됩니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10040": "Huawei iMaster 가상 네트워크 링크[%s] 생성 실패, 원인: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10041": "Huawei iMaster 가상 네트워크 링크[%s] 삭제 실패, 원인: %s", + "ORG_ZSTACK_STORAGE_CEPH_10019": "mon[호스트 이름:%s]을 사용하는 Ceph 백업 저장소가 이미 있으므로 Ceph 백업 저장소를 추가할 수 없습니다", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10046": "새로운 가상 네트워크 인터페이스가 생성되지 않았습니다. 이는 발생해서는 안 됩니다.", + "ORG_ZSTACK_MEVOCO_10082": "가상 머신 [%s]에 I/O 스레드 [%d] pin [%s]을(를) 설정 실패: %s.", + "ORG_ZSTACK_STORAGE_BACKUP_10049": "볼륨[uuid:%s]의 볼륨 백업을 생성 실패, 연결된 볼륨이 [%s, %s] 상태가 아니기 때문입니다", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10025": "기본 스토리지 [UUID:%s]가 비활성화되었습니다. 콜드 마이그레이션이 허용되지 않습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10048": "볼륨[uuid:%s]의 볼륨 백업을 생성 실패, VM이 [%s, %s] 상태가 아니기 때문입니다", + "ORG_ZSTACK_STORAGE_CEPH_10017": "rootVolumePoolName은 null일 수 있지만 빈 문자열이어서는 안 됩니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10026": "볼륨[uuid:%s]은(는) 더 이상 로컬 스토리지에 연결되어 있지 않습니다. 삭제되었거나 분리되었을 수 있습니다", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10044": "SDN 컨트롤러 [IP:%s]의 시스템 정보를 가져오지 못했습니다", + "ORG_ZSTACK_STORAGE_BACKUP_10047": "볼륨[uuid:%s]의 볼륨 백업을 생성 실패, 어떤 VM 인스턴스에도 연결되어 있지 않기 때문입니다", + "ORG_ZSTACK_STORAGE_CEPH_10018": "imageCachePoolName은 null일 수 있지만 빈 문자열이어서는 안 됩니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10045": "SDN 컨트롤러 [IP:%s]의 시스템 정보를 가져오지 못했습니다: %s로 인한 실패", + "ORG_ZSTACK_STORAGE_BACKUP_10046": "공유 볼륨[uuid:%s]에 대한 볼륨 백업을 생성할 수 없습니다", + "ORG_ZSTACK_KVM_10093": "KVM 호스트[uuid:%s, ip:%s, url:%s]에 연결할 수 없음: %s로 인한 실패", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10022": "로컬 기본 스토리지에 볼륨을 생성하려면 시스템 태그 [%s]를 사용하여 볼륨이 생성될 호스트를 지정해야 합니다.", + "ORG_ZSTACK_KVM_10096": "호스트가 어떤 기본 스토리지에 접근할 수 없습니다. 스토리지 구성을 확인하거나 지원팀에 문의하세요 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10023": "잘못된 URI 형식입니다. 올바른 예시: file://$URL, hostUuid://$HOSTUUID, volume://$VOLUMEUUID", + "ORG_ZSTACK_STORAGE_CEPH_10012": "동일한 Mono 노드를 여러 번 추가할 수 없습니다.", + "ORG_ZSTACK_KVM_10099": "호스트[%s] SSH 포트[%s]가 %s초 후에 도달 불가능함, 연결 타임아웃", + "ORG_ZSTACK_STORAGE_CEPH_10010": "동일한 호스트 [%s]를 클러스터 mons에 추가할 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10031": "백업 스토리지로 스냅샷을 백업하는 기능은 더 이상 사용되지 않으며 블록 기본 스토리지에서 지원되지 않습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10032": "ps:%s에서 커밋 볼륨에 대한 클러스터를 찾지 못함", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10035": "LUN 삭제 시 기본 스토리지 UUID가 필수입니다", + "ORG_ZSTACK_MEVOCO_10075": "공유 디스크는 현재 virtio-scsi 유형만 지원합니다.", + "ORG_ZSTACK_STORAGE_BACKUP_10045": "예상치 못한 백업 스토리지[type:%s,uuid:%s] 감지됨", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10036": "호스트 이니시에이터명을 가져올 때 호스트 UUID가 필수입니다", + "ORG_ZSTACK_MEVOCO_10074": "공유 볼륨[uuid:%s]이(가) 이미 가상 머신[uuid:%s]에 연결되어 있습니다", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10048": "새로운 가상 네트워크 인터페이스가 생성되지 않았습니다. 이는 발생해서는 안 됩니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10033": "커밋 볼륨에 대한 호스트를 찾지 못함:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10034": "[%s]을(를) 백업 스토리지[hostname:%s]에서 블록 기본 스토리지[uuid:%s, path:%s]로 다운로드 실패: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10049": "컨트롤러 [ip:%s]에 SDN 패브릭이 구성되어 있지 않습니다", + "ORG_ZSTACK_MEVOCO_10078": "현재 라이선스 버전은 이 리소스 구성 수정을 지원하지 않습니다 [name:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10037": "initiatorName %s가 다른 호스트에서 사용 중입니다. 호스트 %s의 이니시에이터를 다시 생성해주세요", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10038": "이름으로 볼륨 템플릿을 찾을 수 없습니다:%s", + "ORG_ZSTACK_MEVOCO_10076": "공유 볼륨 [UUID: %s]이(가) 연결되어 있습니다. 그룹 스냅샷은 지원되지 않습니다.", + "ORG_ZSTACK_AI_MESSAGE_10002": "리소스 UUID[%s] 또는 모델 센터 UUID[%s]가 null이므로 데이터세트 생성 작업을 취소할 수 없습니다", + "ORG_ZSTACK_AI_MESSAGE_10001": "리소스 UUID[%s] 또는 모델 센터 UUID[%s]가 null이므로 모델 서비스 다운로드 작업을 취소할 수 없습니다", + "ORG_ZSTACK_IPSEC_VYOS_10009": "HA 그룹 적용 실패: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10013": "클라우드 환경의 모든 Prometheus 인스턴스에 HTTP 호출을 수행하지 못했습니다.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10012": "키 = %s에 대해 알 수 없는 데이터 타입 %s입니다", + "ORG_ZSTACK_ENCRYPT_10000": "API 메시지 파싱 실패: 타입 %s의 암호화 파라미터를 파싱할 수 없습니다", + "ORG_ZSTACK_ENCRYPT_10002": "API 메시지 파싱 실패: %d개의 암호화 파라미터 시스템 태그를 찾았습니다. 1개를 예상했습니다.", + "ORG_ZSTACK_IPSEC_VYOS_10001": "VYOS는 IKE 암호화 알고리즘으로 AES-192를 지원하지 않습니다. 사용 가능한 옵션은 AES-128 및 AES-256입니다.", + "ORG_ZSTACK_IPSEC_VYOS_10000": "원격 CIDR [%s]이(가) Virtual Router 인터페이스 CIDR [%s]과(와) 중첩됩니다", + "ORG_ZSTACK_IPSEC_VYOS_10003": "vyos는 IKE DH 그룹 %d을(를) 지원하지 않습니다", + "ORG_ZSTACK_IPSEC_VYOS_10002": "vyOS는 PolicyEncryptionAlgorithm으로 AES-192를 지원하지 않습니다. 사용 가능한 옵션은 AES-128, AES-256 및 3DES입니다.", + "ORG_ZSTACK_COMPUTE_VM_10000": "VM[uuid:%s]의 상태가 실행 중이 아닙니다. 따라서 시간 동기화를 수행할 수 없습니다.", + "ORG_ZSTACK_COMPUTE_VM_10008": "vm[uuid:%s]이(가) 클러스터[uuid:%s]에 속해 있지만 클러스터 내에서 사용 가능한 호스트가 없습니다. 따라서 이 vm의 이미지 변경을 처리할 수 없습니다.", + "ORG_ZSTACK_COMPUTE_VM_10007": "vm[uuid:%s] 클러스터 UUID가 null입니다. 이미지를 변경할 수 없습니다", + "ORG_ZSTACK_COMPUTE_VM_10006": "VM의 상태가 Stopped가 아닙니다: %s. 'changevmimage' 작업을 수행할 수 없습니다.", + "ORG_ZSTACK_COMPUTE_VM_10005": "UUID: %s인 xml 후크가 UUID: %s인 VM에 성공적으로 연결되었지만 VM을 재시작하지 못했습니다. 세부 정보: %s", + "ORG_ZSTACK_COMPUTE_VM_10004": "UUID: %s인 xml 후크가 UUID: %s인 VM에서 성공적으로 분리되었지만 VM 재시작 중 문제가 발생했습니다. 세부 정보: %s", + "ORG_ZSTACK_COMPUTE_VM_10003": "Hot-adding이 비활성화되지 않았습니다. 가상 머신을 열기 전에 NUMA 구성을 설정해주세요.", + "ORG_ZSTACK_COMPUTE_VM_10011": "방향 매개변수는 IN 또는 OUT으로 설정되어야 합니다.", + "ORG_ZSTACK_COMPUTE_VM_10010": "백업 스토리지를 찾을 수 없습니다. 볼륨 스냅샷[psUuid:%s]을 이미지로 커밋할 수 없습니다. 대상 필수 PS UUID:%s", + "ORG_ZSTACK_COMPUTE_VM_10018": "암호 변경 작업 중 상태 검증 실패:%s", + "ORG_ZSTACK_COMPUTE_VM_10017": "데이터베이스에서 UUID: %s로 대상 호스트를 찾을 수 없습니다. 호스트에 암호 변경 명령을 보낼 수 없습니다!", + "ORG_ZSTACK_STORAGE_DEVICE_10036": "hba 스캔 실패: %s", + "ORG_ZSTACK_COMPUTE_VM_10015": "vm [%s]의 호스트 UUID가 null입니다. 네트워크 서비스 품질을 동기화할 수 없습니다", + "ORG_ZSTACK_COMPUTE_VM_10014": "vm [%s]은(는) NIC QoS 설정을 동기화하기 위해 Running 또는 Paused 상태여야 합니다", + "ORG_ZSTACK_STORAGE_DEVICE_10031": "vm 인스턴스[uuid: %s]가 SCSI lun[uuid: %s] 연결에 실패했습니다", + "ORG_ZSTACK_COMPUTE_VM_10013": "아웃바운드 대역폭은 %s 이하로 설정해야 합니다.", + "ORG_ZSTACK_COMPUTE_VM_10012": "인바운드 대역폭은 %s Gbps 이하로 설정해야 합니다.", + "ORG_ZSTACK_STORAGE_DEVICE_10030": "vm 인스턴스[%s]의 상태 [%s]가 지정된 작업[%s]에 허용된 상태가 아닙니다", + "ORG_ZSTACK_COMPUTE_VM_10022": "보안 기능이 비활성화되어 보안 수준을 설정하지 못했습니다. 이 구성을 변경하기 전에 보안 기능이 활성화되어 있는지 확인하세요.", + "ORG_ZSTACK_COMPUTE_VM_10020": "데이터 볼륨 수가 지정된 제한 [num: %s]을 초과합니다. 가상 머신을 생성할 때 데이터 볼륨 수를 줄이세요.", + "ORG_ZSTACK_STORAGE_DEVICE_10028": "지정된 SCSI LUN [WWID: %s]이(가) 존재하지 않거나 비활성화되어 있습니다", + "ORG_ZSTACK_STORAGE_DEVICE_10029": "scsi[%s] lun[wwid:%s]이(가) vm[%s]에 연결되어 있습니다", + "ORG_ZSTACK_STORAGE_DEVICE_10026": "호스트 [UUID:%s, targets:%s]와 호스트 [UUID:%s, targets:%s]에서 서로 다른 iSCSI 구성이 발견되었습니다.", + "ORG_ZSTACK_STORAGE_DEVICE_10027": "LUN [serial:%s]에 대해 호스트 간에 다른 디스크 유형이 발견되어 클러스터에 연결할 수 없습니다.", + "ORG_ZSTACK_COMPUTE_VM_10029": "네트워크[uuid:%s]에 접두사가 지정되어 VM을 복제할 수 없습니다.", + "ORG_ZSTACK_STORAGE_DEVICE_10024": "SCSI LUN [%(s)s] 레코드가 호스트 [%(s)s]에서 발견되지 않았습니다.", + "ORG_ZSTACK_COMPUTE_VM_10028": "IPv6 주소[%s]가 유효하지 않아 VM을 복제할 수 없습니다.", + "ORG_ZSTACK_STORAGE_DEVICE_10025": "가상 머신 호스트 [%s]에 대해 예기치 않은 하이퍼바이저 유형[%s]입니다.", + "ORG_ZSTACK_COMPUTE_VM_10027": "네트워크[uuid:%s]에 넷마스크가 지정되어 VM을 복제할 수 없습니다.", + "ORG_ZSTACK_STORAGE_DEVICE_10022": "호스트[hostUuid:%s, targets:%s]와 호스트[hostUuid:%s, targets:%s]에서 서로 다른 NVMe 대상이 발견되었습니다.", + "ORG_ZSTACK_COMPUTE_VM_10026": "지정된 IP 주소[%s]가 유효하지 않아 VM을 복제할 수 없습니다.", + "ORG_ZSTACK_STORAGE_DEVICE_10023": "SCSI LUN[%s]이(가) 가상 머신 [%s]에 연결되어 있습니다.", + "ORG_ZSTACK_COMPUTE_VM_10025": "레이어 3 네트워크[uuid:%s]를 찾을 수 없어 VM을 복제할 수 없습니다.", + "ORG_ZSTACK_STORAGE_DEVICE_10020": "vm 인스턴스[%s]의 상태[%s]가 작업[%s]에 허용된 상태가 아닙니다.", + "ORG_ZSTACK_COMPUTE_VM_10024": "알 수 없는 보안 수준 코드[%s], 지원되는 값은 [0-7]입니다.", + "ORG_ZSTACK_STORAGE_DEVICE_10021": "vm 인스턴스[%s]이(가) 호스트[uuid: %s]에서 scsi lun[uuid: %s]을(를) 연결하지 못했습니다.", + "ORG_ZSTACK_COMPUTE_VM_10023": "VM [uuid:%s]을(를) 활성화하지 않은 상태에서는 보안 수준을 설정할 수 없습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10002": "현재 기본 스토리지 %s에 서드파티 토큰이 구성되어 있지 않아 일시적으로 블록 볼륨을 생성할 수 없습니다.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10001": "잘못된 할당된 가상 리소스 URL:%s", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10000": "URL 할당에 실패했습니다. URL이 올바른지 사용 가능한지 확인하세요. 문제가 지속되면 지원을 통해 추가 도움을 받으세요.", + "ORG_ZSTACK_STORAGE_DEVICE_10017": "scsi lun[wwid:%s]이(가) vm[%s]에 연결되어 있습니다.", + "ORG_ZSTACK_STORAGE_DEVICE_10015": "scisLun[uuids:%s]이(가) 호스트[uuid:%s]의 클러스터에 연결되어 있지 않습니다.", + "ORG_ZSTACK_STORAGE_DEVICE_10016": "VM[%s]과(와) 관련된 모든 블록 장치의 마운트를 해제하고 다시 시도하세요.", + "ORG_ZSTACK_STORAGE_DEVICE_10014": "scsi lun[wwid: %s]이(가) 가상 머신 인스턴스 %s에 연결되어 있습니다.", + "ORG_ZSTACK_STORAGE_DEVICE_10011": "iSCSI 서버 [UUID: %s]이(가) 클러스터 [UUID: %s]과(와) 연결되어 있지 않습니다.", + "ORG_ZSTACK_STORAGE_DEVICE_10012": "iSCSI 서버 [UUID: %s]가 여전히 클러스터 [UUID: %s]와 연결되어 있습니다", + "ORG_ZSTACK_STORAGE_DEVICE_10010": "iSCSI 서버 [UUID: %s]가 이미 클러스터 [UUID: %s]에 연결되어 있습니다", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10008": "로컬 CIDR과 원격 CIDR은 유효한 CIDR 범위여야 합니다!", + "ORG_ZSTACK_NETWORK_SERVICE_HEADER_NFVINSTGROUP_10000": "이 NFV 인스턴스 유형에서는 클러스터 상태 조회가 지원되지 않습니다.", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10001": "VPN Gateway [%s]가 존재하여 원격으로 삭제할 수 없습니다.", + "ORG_ZSTACK_STORAGE_DEVICE_10008": "iSCSI 서버 [IP: %s, Port: %s]가 이미 존재합니다", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10005": "%s은(는) 클라우드 배포 구성에 유효한 IPv4 주소가 아닙니다", + "ORG_ZSTACK_STORAGE_DEVICE_10009": "iSCSI 서버 IP: %s가 유효하지 않습니다", + "ORG_ZSTACK_STORAGE_DEVICE_10006": "UUID: %s인 NVMe 서버가 이미 UUID: %s인 클러스터에 연결되어 있습니다", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10007": "원격 CIDR은 유효한 CIDR 표기법이어야 합니다!", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10006": "localCidr은 유효한 CIDR이어야 합니다!", + "ORG_ZSTACK_STORAGE_DEVICE_10004": "NVMe 서버 [IP: %s, 포트: %s, 전송 프로토콜: %s]가 클라우드 환경에 이미 존재합니다", + "ORG_ZSTACK_STORAGE_DEVICE_10005": "NVMe 서버 IP: %s이(가) 유효하지 않습니다", + "ORG_ZSTACK_STORAGE_DEVICE_10003": "공유 저장소가 있는 VM[uuid:%s]의 마이그레이션은 지원되지 않습니다", + "ORG_ZSTACK_STORAGE_DEVICE_10000": "uuid: %s 및 uuid: %s인 scsi lun이 공통 호스트를 공유하지 않습니다", + "ORG_ZSTACK_STORAGE_DEVICE_10001": "scsi lun [uuid: %s]이(가) 비활성화 상태입니다", + "ORG_ZSTACK_ALIYUN_NETWORK_VPN_10000": "VPN gateway와 user gateway는 동일한 데이터 센터에 있어야 합니다.", + "ORG_ZSTACK_IPSEC_VYOS_10016": "%s로 인해 HA 라우트에 ipsec 생성 실패", + "ORG_ZSTACK_IPSEC_VYOS_10015": "%s로 인해 HA 그룹에서 ipsec 삭제 실패", + "ORG_ZSTACK_COMPUTE_BONDING_10001": "인터페이스가 이미 호스트에 생성되어 있습니다", + "ORG_ZSTACK_COMPUTE_BONDING_10008": "본딩 카드는 호스트[%s]에서 서로 다른 속도의 본딩에 인터페이스를 가질 수 없습니다.", + "ORG_ZSTACK_COMPUTE_BONDING_10007": "본딩에서 SRIOV 가상화된 인터페이스[%s]를 가질 수 없습니다.", + "ORG_ZSTACK_COMPUTE_BONDING_10006": "호스트[%s]에서 이미 사용된 네트워크 브릿지로 사용된 본딩에 인터페이스를 가질 수 없습니다.", + "ORG_ZSTACK_COMPUTE_BONDING_10005": "호스트[%s]에서 이미 사용 중인 본딩에 사용 중인 인터페이스를 가질 수 없습니다.", + "ORG_ZSTACK_IPSEC_VYOS_10012": "ipsec 버전 업데이트 실패: vpc[%s]가 존재하지 않습니다", + "ORG_ZSTACK_COMPUTE_BONDING_10009": "호스트[uuid:%s]에 슬레이브 네트워크 인터페이스가 없습니다", + "ORG_ZSTACK_IPSEC_VYOS_10013": "HA 그룹에 동기화 실패:%s", + "ORG_ZSTACK_MEVOCO_10105": "비관리자 계정이 읽기/쓰기 %s 제한을 %s/%s보다 크게 설정할 수 없습니다", + "ORG_ZSTACK_SIMULATOR_10002": "인스턴스가 연결 해제 상태로 설정되었습니다", + "ORG_ZSTACK_MEVOCO_10104": "비관리자 계정이 쓰기 [저장소 제한]을 무제한으로 설정할 수 없습니다.", + "ORG_ZSTACK_MEVOCO_10103": "관리자 권한이 아닌 계정은 읽기 I/O 제한을 무제한으로 설정할 수 없습니다.", + "ORG_ZSTACK_MEVOCO_10102": "관리자 권한이 아닌 계정은 읽기/쓰기 %s 제한만 구성할 수 있습니다.", + "ORG_ZSTACK_MEVOCO_10109": "vm [%s]의 호스트 UUID가 null입니다. 볼륨 QoS를 동기화할 수 없습니다.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10016": "FiSecClientFactory 연결 테스트 실패", + "ORG_ZSTACK_MEVOCO_10108": "vm [%s]은(는) 볼륨 QoS를 동기화하려면 Running 또는 Paused 상태여야 합니다.", + "ORG_ZSTACK_MEVOCO_10107": "volume [%s]이(가) 가상 머신에 연결되어 있지 않거나(가상 머신이 존재하지 않음), 볼륨 QoS를 동기화할 수 없습니다.", + "ORG_ZSTACK_SIMULATOR_10004": "\"on purpose\" 오류는 시스템 장애가 아닌 의도적인 동작을 나타냅니다. 진행하려면 의도된 목적에 대한 자세한 내용을 제공해 주십시오.", + "ORG_ZSTACK_MEVOCO_10106": "volume [%s]이(가) 가상 머신에 연결되어 있지 않습니다. 따라서 forceSync를 통해 QoS를 검색할 수 없습니다.", + "ORG_ZSTACK_MEVOCO_10101": "관리자 권한이 아닌 계정은 총 %s 제한을 다음보다 크게 설정할 수 없습니다: %s", + "ORG_ZSTACK_MEVOCO_10100": "관리자 권한이 아닌 계정은 총 %s 제한을 무한대로 설정할 수 없습니다.", + "ORG_ZSTACK_COMPUTE_BONDING_10011": "VTEP IP 주소로 구성된 인터페이스와 바인딩할 수 없습니다. VTEP IP가 올바르게 구성되어 있고 도달 가능한지 확인해 주십시오.", + "ORG_ZSTACK_COMPUTE_BONDING_10010": "관리 네트워크에 해당하는 인터페이스와 바인딩할 수 없습니다. 가상 네트워크 인터페이스가 올바르게 구성되어 있고 지정된 관리 네트워크에 해당하는지 확인해 주십시오.%s", + "ORG_ZSTACK_COMPUTE_BONDING_10015": "본딩 카드는 SR-IOV 가상화된 인터페이스[%s]를 가질 수 없습니다.", + "ORG_ZSTACK_COMPUTE_BONDING_10014": "본딩 카드는 호스트[%s]에서 이미 사용된 네트워크 브릿지로 사용된 인터페이스를 가질 수 없습니다.", + "ORG_ZSTACK_COMPUTE_BONDING_10013": "본딩 카드는 호스트[%s]에서 이미 사용된 점유된 인터페이스를 가질 수 없습니다.", + "ORG_ZSTACK_COMPUTE_BONDING_10012": "동일한 호스트[%s]에 있지 않은 본딩의 인터페이스를 가질 수 없습니다.", + "ORG_ZSTACK_COMPUTE_BONDING_10019": "[본딩]은(는) [%s]개의 인터페이스를 가질 수 없으며, 1에서 2 사이여야 합니다.", + "ORG_ZSTACK_COMPUTE_BONDING_10018": "[본딩 카드]은(는) [인터페이스 수]를 [%s](으)로 설정할 수 없으며, [1~8] 사이의 숫자여야 합니다.", + "ORG_ZSTACK_COMPUTE_BONDING_10017": "[%s] 본딩 인터페이스는 다른 xmit_hash_policy를 지정할 수 없습니다. 모드 802.3ad만 다른 정책을 지정하는 것을 지원합니다.", + "ORG_ZSTACK_COMPUTE_BONDING_10016": "본딩 카드는 호스트[%s]에서 서로 다른 속도를 가진 인터페이스를 가질 수 없습니다.", + "ORG_ZSTACK_MEVOCO_10113": "Volume[UUID:%s]은(는) vhost-user 프로토콜을 사용하며, 이는 네이티브 비동기 I/O와 호환되지 않습니다. aio.native를 비활성화하거나 다른 볼륨 프로토콜을 선택해 주십시오.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10003": "비밀 리소스 풀[uuid: %s]에 대한 연결 실패", + "ORG_ZSTACK_MEVOCO_10112": "현재 라이선스 버전은 이 글로벌 구성[name:%s] 수정을 지원하지 않습니다.", + "ORG_ZSTACK_MEVOCO_10111": "VMInstance에서 공유 가능한 볼륨 분리 실패: [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10005": "%s 클라이언트 초기화 실패: 비밀 리소스 풀 속성이 유효하지 않습니다.", + "ORG_ZSTACK_MEVOCO_10110": "Instance[uuid:%s]에서 공유 가능한 볼륨[uuid:%s] 분리 실패", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10006": "플러그인(UUID: %s)은(는) 다음 비밀 리소스 풀과 연결되어 있으므로 삭제할 수 없습니다: [%s].", + "ORG_ZSTACK_MEDIATOR_10005": "VIP [UUID:%s]이(가) 이미 다른 서비스[%s]에 바인딩되어 있습니다.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10007": "조직 ID[uuid:%s]에 이미 작업 속성이 있어 %s을(를) 추가할 수 없습니다.", + "ORG_ZSTACK_MEDIATOR_10006": "현재 포트 범위 [%s, %s]이(가) VIP [UUID: %s] 프로토콜: %s에 대해 시스템 서비스 포트 범위 [%s, %s]와 충돌합니다.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10008": "uuid:%s인 영역을 찾을 수 없습니다", + "ORG_ZSTACK_MEDIATOR_10007": "현재 포트 범위 [%s, %s]가 VIP [UUID: %s] 프로토콜: %s에 대한 사용 중인 포트 범위 [%s, %s]와 충돌합니다", + "ORG_ZSTACK_COMPUTE_VM_10080": "vm[uuid:%s] CD-ROM 장치 ID가 중복됩니다", + "ORG_ZSTACK_COMPUTE_VM_10077": "VM[uuid:%s]에 ISO[uuid:%s]가 연결되어 있습니다", + "ORG_ZSTACK_COMPUTE_VM_10074": "예약된 메모리[%s]가 사용 가능한 메모리 크기[%s]를 초과합니다", + "ORG_ZSTACK_COMPUTE_VM_10073": "예기치 않은 CPU 및 메모리 설정입니다. 지정된 값이 인스턴스 유형 및 요구 사항과 호환되는지 확인하십시오.", + "ORG_ZSTACK_COMPUTE_VM_10071": "vm[uuid=%s]에 대한 호스트를 찾지 못했습니다", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10000": "가상 ID[uuid:%s]에 이미 관리 관련 속성이 있으므로 %s를 할당할 수 없습니다.", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10000": "신원 영역 [%s]이(가) 이미 존재합니다, uuid: %s", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10001": "regionId: [%s]이(가) 유효한 Aliyun 및 ZStack 영역이 아닙니다. 다른 영역을 선택하십시오", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10002": "유형 [%s]이(가) 예상되는 데이터 센터 유형 [%s]과 일치하지 않습니다", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10003": "project[uuid:%s]에 이미 지정된 프로젝트 관리자가 있습니다", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10003": "데이터 센터 UUID 또는 region ID를 설정해야 합니다. 매개변수를 확인하십시오.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10004": "project[uuid:%s]이(가) 존재하지 않습니다", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10004": "신원 영역 [%s]이(가) 아직 동기화 중입니다. 기다려 주십시오.", + "ORG_ZSTACK_COMPUTE_VM_10079": "L3 네트워크 [%s]에서 사용 가능한 IP 범위가 없습니다", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10005": "가상 ID [UUID:%s]에 이미 프로젝트 운영자 속성이 할당되어 있습니다.", + "ORG_ZSTACK_COMPUTE_VM_10078": "모든 VM[UUID:%s] CD-ROM에 ISO 이미지가 마운트되었습니다", + "ORG_ZSTACK_COMPUTE_VM_10090": "볼륨을 인스턴스화하지 못했습니다. VM의 호스트 [UUID: %s]와 할당된 기본 스토리지 [UUID: %s]가 연결되어 있지 않습니다.", + "ORG_ZSTACK_COMPUTE_VM_10088": "vm 현재 상태[%s], virtio 수정에는 vm이 [%s] 상태여야 합니다", + "ORG_ZSTACK_COMPUTE_VM_10084": "영역 [UUID:%s]에 연결된 백업 스토리지에서 ISO [UUID:%s]을(를) 찾을 수 없습니다. 다음을 확인하십시오:", + "ORG_ZSTACK_COMPUTE_VM_10083": "1. VM [NAME: %s, UUID:%s]이(가) 실행 중인 올바른 영역에 백업 스토리가 연결되어 있는지 확인합니다.", + "ORG_ZSTACK_COMPUTE_VM_10081": "2. 백업 스토리지가 활성 상태인지 확인합니다. 그렇지 않으면 재연결을 시도합니다.", + "ORG_ZSTACK_KVM_HYPERVISOR_10000": "지정된 기본 스토리지%s가 모두 사용할 수 없습니다", + "ORG_ZSTACK_COMPUTE_VM_10099": "생성에 이미지 캐시[uuid:%s, 위치 ps uuids: [%s]]가 필요하므로 다른 곳에서 생성할 수 없습니다.", + "ORG_ZSTACK_COMPUTE_VM_10098": "호스트 가상화 정보를 수집하지 못했습니다", + "ORG_ZSTACK_COMPUTE_VM_10097": "L3 네트워크로 전환할 수 없습니다. L3 네트워크 [uuid:%s]이(가) 어떤 클러스터에도 연결되지 않은 L2 네트워크 [uuids:%s]에 속해 있습니다.", + "ORG_ZSTACK_COMPUTE_VM_10096": "L3 네트워크로 전환할 수 없습니다. 지정된 L3 네트워크 [uuid:%s]이(가) 다른 L2 네트워크 [uuids:%s]에 속해 있습니다.", + "ORG_ZSTACK_COMPUTE_VM_10094": "L3 네트워크로 전환할 수 없습니다. 지정된 L3 네트워크 [uuid:%s]에 IP 범위가 구성되어 있지 않습니다.", + "ORG_ZSTACK_COMPUTE_VM_10093": "L3 네트워크로 전환할 수 없습니다. VM [uuid: %s]이(가) 실행 중이거나 중지된 상태가 아닙니다. 현재 상태는 %s입니다", + "ORG_ZSTACK_COMPUTE_VM_10092": "실행 중 상태가 아닌 VM [uuid:%s]의 스크린샷을 캡처할 수 없습니다.", + "ORG_ZSTACK_MEDIATOR_10002": "Layer 3 네트워크를 연결할 수 없습니다. 연결할 L3 네트워크의 CIDR [%s]가 VM에 이미 연결된 L3 네트워크의 CIDR [%s]와 중첩됩니다.", + "ORG_ZSTACK_MEDIATOR_10003": "VM[name:%s, UUID:%s]에 이미 포트 포워딩 규칙%s가 구성되어 있습니다.", + "ORG_ZSTACK_MEDIATOR_10004": "VM[name:%s, uuid:%s]에 이미 일부 Elastic IP 주소%s가 연결되어 있습니다.", + "ORG_ZSTACK_COMPUTE_VM_10033": "기본 L3 UUID 크기가 1이 아니므로 VM을 복제할 수 없습니다.", + "ORG_ZSTACK_COMPUTE_VM_10032": "상태[%s]가 유효하지 않으므로 VM을 복제할 수 없습니다.", + "ORG_ZSTACK_COMPUTE_VM_10031": "드라이버 유형[%s]이 유효하지 않으므로 VM을 복제할 수 없습니다.", + "ORG_ZSTACK_COMPUTE_VM_10030": "NicType[%s]이 유효하지 않으므로 VM을 복제할 수 없습니다.", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10002": "마이그레이션 설치 경로 [%s]에 대해 기본 스토리지 [%s]에서 관련 쓰레기 경로(%s)를 발견했습니다. 볼륨 [%s]을 마이그레이션하려면 먼저 'APICleanUpTrashOnPrimaryStorageMsg'를 사용하여 정리하십시오.", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10000": "스토리지 마이그레이션 작업을 수행할 수 있는 연결된 호스트를 찾을 수 없습니다. 대상 호스트가 클라우드 환경에서 사용 가능하고 올바르게 구성되어 있는지 확인하십시오.", + "ORG_ZSTACK_COMPUTE_VM_10039": "이 작업은 사용자 VM 인스턴스에서만 허용됩니다.", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10003": "볼륨[uuid:%s]이(가) 이미지[uuid:%s]에 종속되어 있으며, 다른 종속 항목에는 이미지[%s]가 포함됩니다.", + "ORG_ZSTACK_COMPUTE_VM_10038": "네트워크 인터페이스 %s가 VM에 연결되어 있지 않습니다.", + "ORG_ZSTACK_COMPUTE_VM_10037": "기본 스토리지 [UUID: %s]에서 VM [UUID: %s], 볼륨 [UUID: %s]을(를) 복제하기 위한 용량 리소스가 부족합니다. 필요한 용량은 %s 바이트이고, 현재 사용 가능한 용량은 %s 바이트입니다.", + "ORG_ZSTACK_COMPUTE_VM_10036": "VM 빠른 생성은 원본 VM [UUID: %s]과(와) 동일한 기본 스토리지 [UUID: %s]에서만 데이터 볼륨 복제를 지원합니다.", + "ORG_ZSTACK_COMPUTE_VM_10035": "VM 빠른 생성은 원본 VM [UUID: %s]과(와) 동일한 기본 스토리지 [UUID: %s]에서만 루트 볼륨 복제를 지원합니다.", + "ORG_ZSTACK_COMPUTE_VM_10034": "이 작업은 사용자 VM 인스턴스에서만 허용됩니다.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10005": "클러스터 유형이 베어메탈인 경우 하이퍼바이저 유형도 베어메탈이어야 합니다. 반대로 하이퍼바이저 유형이 베어메탈인 경우 클러스터 유형도 베어메탈이어야 합니다.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10008": "클러스터 [uuid:%s]에 유지 관리 전 상태의 호스트가 있으므로 현재 OS를 업데이트할 수 없습니다.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10009": "클러스터 [uuid:%s]의 모든 호스트가 활성 상태가 아니므로 현재 클러스터 운영 체제 권한을 업데이트할 수 없습니다.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10006": "현재는 KVM 기반 가상 시스템의 운영 체제만 업데이트할 수 있습니다.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10007": "호스트 [UUID: %s]가 클러스터 [UUID: %s]의 구성원이 아닙니다. 호스트 UUID를 확인하고 이 클러스터에 속해 있는지 확인하십시오.", + "ORG_ZSTACK_COMPUTE_VM_10044": "VM이停止 상태가 아닐 때 VM 이미지를 수정하지 마십시오.", + "ORG_ZSTACK_COMPUTE_VM_10043": "사용자에게 VM %s의 이미지를 변경할 권한이 없습니다.", + "ORG_ZSTACK_COMPUTE_VM_10042": "VM 유형 [%s]에 대해 클린 트래픽이 지원되지 않습니다.", + "ORG_ZSTACK_COMPUTE_VM_10041": "중복된 MAC 주소 [%s]", + "ORG_ZSTACK_COMPUTE_CLUSTER_10000": "클러스터 [uuid: %s]에서 huge pages가 비활성화된 경우 메모리 액세스를 공유해서는 안 됩니다. 먼저 UpdateResourceConfig [category=%s name=%s value=%s resourceUuid=%s]를 사용하여 huge pages를 활성화하십시오.", + "ORG_ZSTACK_COMPUTE_VM_10040": "VM [%s] 상태가停止일 때만 작업이 허용됩니다.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10001": "클러스터 [uuid:%s]에서 메모리 액세스 모드가 공유로 설정된 경우 huge pages를 비활성화해서는 안 됩니다. 먼저 UpdateResourceConfig [category=%s name=%s value=%s resourceUuid=%s]를 사용하여 메모리 액세스 모드를 업데이트하십시오.", + "ORG_ZSTACK_COMPUTE_VM_10049": "UUID 또는 Cloud Account 또는 Authentication Token 중 하나는 반드시 지정해야 합니다.%s", + "ORG_ZSTACK_COMPUTE_VM_10048": "instance[uuid:%s]를 image[uuid:%s]로 변경할 수 없습니다", + "ORG_ZSTACK_COMPUTE_VM_10047": "vm[uuid:%s]에 기본 L3 네트워크가 없어 이미지를 변경할 수 없습니다.", + "ORG_ZSTACK_COMPUTE_VM_10046": "VM [UUID:%s]이 마지막으로 있었던 호스트가 실행 중이고 연결되어 있는지 확인하세요", + "ORG_ZSTACK_COMPUTE_VM_10045": "기본 스토리지 가상 머신 [UUID:%s]가 활성화되어 있고 연결되어 있는지 확인하세요.", + "ORG_ZSTACK_IAM2_CONTAINER_10009": "Kubernetes 구성 파일을 열지 못했습니다: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10007": "null 내용으로 인해 권한 있는 프로젝트를 검색하지 못했습니다", + "ORG_ZSTACK_COMPUTE_VM_10055": "'uuids' 매개변수는 VmInstanceVO 또는 HostVO 엔티티를 참조해야 합니다.", + "ORG_ZSTACK_IAM2_CONTAINER_10008": "경로에서 Kubernetes 구성을 찾지 못했습니다: %s", + "ORG_ZSTACK_COMPUTE_VM_10054": "가상 네트워크 구성에 nic id: %s가 존재하지 않습니다...", + "ORG_ZSTACK_IAM2_CONTAINER_10005": "null 페이지 응답으로 인해 이미지 태그를 검색하지 못했습니다. 이미지 태그 API 엔드포인트를 확인하고 제대로 구성되어 있는지 확인하세요.", + "ORG_ZSTACK_COMPUTE_VM_10053": "네트워크 인터페이스 카드는 포트 미러링 서비스와 동시에 QoS(Quality of Service) 설정을 적용할 수 없습니다.", + "ORG_ZSTACK_IAM2_CONTAINER_10006": "null 내용으로 인해 이미지를 검색하지 못했습니다.%s", + "ORG_ZSTACK_COMPUTE_VM_10052": "인바운드 대역폭과 아웃바운드 대역폭 중 적어도 하나 이상을 지정해야 합니다.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10008": "연결된 액세스 그룹이 이미 있습니다: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10003": "프로젝트[uuid: %s]의 컨테이너화된 클러스터를 설정하지 못했습니다", + "ORG_ZSTACK_COMPUTE_VM_10051": "모니터 카운트는 1, 2 또는 4 중 하나여야 합니다.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10007": "NAS 마운트 대상 [%s]이(가) 파일 시스템에 이미 존재합니다: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10004": "null 내용으로 인해 이미지 태그를 검색하지 못했습니다.%s", + "ORG_ZSTACK_COMPUTE_VM_10050": "방향은 (in, out) 내에서 설정해야 하지만 %s입니다", + "ORG_ZSTACK_IAM2_CONTAINER_10001": "컨테이너 %s의 할당량을 업데이트하지 못했습니다", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10009": "액세스 그룹 규칙 [%s]이(가) 액세스 그룹 [%s]에 이미 존재합니다", + "ORG_ZSTACK_IAM2_CONTAINER_10002": "데이터베이스에서 프로젝트를 찾지 못했기 때문에 프로젝트[uuid: %s] 컨테이너를 설정하지 못했습니다", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10003": "마운트 도메인이 %d밀리초 후에 유효하지 않습니다. 삭제합니다...", + "ORG_ZSTACK_IAM2_CONTAINER_10000": "예기치 않은 오류로 인해 컨테이너 측에서 프로젝트[uuid: %s]의 할당량을 업데이트하지 못했습니다", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10006": "사용 가능한 NAS 액세스 그룹이 없습니다. 최소 하나를 생성하세요.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10005": "NAS에 해당 마운트 대상 [%s]이(가) 없습니다: %s", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10000": "리전에서 파일 시스템 [%%s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_COMPUTE_VM_10059": "계정 환경 설정을 찾지 못했습니다. 가상 머신 호스트에 암호 변경 명령을 보내세요!", + "ORG_ZSTACK_COMPUTE_VM_10058": "데이터베이스에서 대상 호스트를 찾지 못했습니다. 호스트에 암호 변경 명령을 보낼 수 없습니다!", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10002": "일부 기본 스토리지 [%%s]이(가) 이 NAS와 연결되어 있습니다. 삭제하기 전에 기본 스토리지를 삭제하세요.", + "ORG_ZSTACK_COMPUTE_VM_10057": "UUID(s)가 %s인 호스트만 데이터 볼륨에 액세스할 수 있습니다.", + "ORG_ZSTACK_COMPUTE_VM_10056": "리소스[UUIDs:%s]는 계정[UUID:%s]에서 관리하지 않습니다", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10001": "데이터센터에 NAS 파일 시스템이 이미 존재합니다: %s", + "ORG_ZSTACK_COMPUTE_VM_10063": "제공된 비밀번호가 복잡성 요구 사항을 충족하지 않습니다. 최소 하나의 숫자,一个大문자,一个小문자, 그리고 특수 문자를 포함해야 합니다.", + "ORG_ZSTACK_COMPUTE_VM_10062": "비밀번호 길이는 [%s-%s자]여야 합니다", + "ORG_ZSTACK_COMPUTE_VM_10061": "해당 디스크는 연결을 지원하지 않습니다. 디스크 유형은 %s입니다", + "ORG_ZSTACK_COMPUTE_VM_10060": "디스크 AO 매개변수가 잘못되었습니다. size, 템플릿 UUID, 디스크 오퍼링 UUID 또는 source UUID-source 유형 중 하나의 속성을 설정해야 합니다. 이 속성 중 하나만 지정해야 합니다.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10010": "액세스 그룹 [%s]이(가) 데이터센터 [%s]에 이미 존재합니다", + "ORG_ZSTACK_COMPUTE_VM_10068": "L3 네트워크 [%s]에서 사용 가능한 네트워크 인터페이스 유형이 없습니다", + "ORG_ZSTACK_FAULTTOLERANCE_10015": "보조 가상 머신을 생성할 수 없습니다. 주 가상 머신이 중지 상태입니다. 보조 가상 머신을 생성하기 전에 주 가상 머신을 시작하세요.", + "ORG_ZSTACK_COMPUTE_SRIOV_10014": "L3 네트워크를 VM에 연결할 때 SR-IOV와 VFHA를 동시에 활성화할 수 없습니다. 이 옵션 중 하나만 구성되어 있는지 확인하세요.", + "ORG_ZSTACK_COMPUTE_SRIOV_10015": "가상 기능 네트워크 인터페이스를 표준 유형으로 변경할 수 없습니다", + "ORG_ZSTACK_FAULTTOLERANCE_10013": "현재 다른 폴트-tolerant 가비지 컬렉션 작업이 실행 중입니다. 새 작업을 취소하고 완료될 때까지 기다리세요.", + "ORG_ZSTACK_COMPUTE_SRIOV_10016": "네트워크 인터페이스를 VF 유형으로 변경할 수 없습니다. 대상 인스턴스가 vf 네트워킹을 지원하는지 확인하세요.", + "ORG_ZSTACK_COMPUTE_SRIOV_10017": "UUID:%s인 VM 네트워크 인터페이스가 존재하지 않습니다", + "ORG_ZSTACK_FAULTTOLERANCE_10011": "폴트-tolerant 가상 머신 그룹이 누락되었습니다", + "ORG_ZSTACK_FAULTTOLERANCE_10010": "ft 주 VM[uuid:%s]을(를) 마이그레이션할 수 없습니다", + "ORG_ZSTACK_COMPUTE_SRIOV_10019": "SR-IOV만 지원됩니다", + "ORG_ZSTACK_MONITORING_MEDIA_10001": "호스트: %s, 포트: %d의 SMTP 서버에 연결하지 못했습니다. smtpServer 및 smtpPort 설정의 정확성을 확인하세요.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10038": "조건 본문은 JSON null 또는 배열 값을 지원할 수 없습니다!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10037": "'Condition' 필드에서는 ZStack 템플릿 기능만 지원됩니다!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10036": "'Condition' 필드의 값은 부울 유형이어야 합니다", + "ORG_ZSTACK_MONITORING_MEDIA_10000": "문제가 잘못된 access key ID 또는 secret access key 또는 지정된 사용자에 대한 IAM 권한 부족 때문일 수 있습니다. 자격 증명을 확인하고 사용자가 클라우드 컴퓨팅 환경에서 필요한 권한을 가지고 있는지 확인하세요.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10035": "조건 키: %s은(는) 값의 JSON 개체에서 1개의 요소만 지원하지만 %d개의 요소가 제공되었습니다!", + "ORG_ZSTACK_FAULTTOLERANCE_10019": "장애 조치를 수행할 수 없습니다. 주 VM을 알 수 없으며 폴트 tolerance 네트워크 주소를 사용할 수 없습니다. 구성을 확인하세요.", + "ORG_ZSTACK_FAULTTOLERANCE_10018": "pvm[uuid:%s]이(가) 존재하지 않습니다", + "ORG_ZSTACK_FAULTTOLERANCE_10017": "vm[uuid:%s]을(를) 장애 조치할 수 없습니다. 관련 폴트-tolerant 가상 머신 그룹이 존재하지 않습니다", + "ORG_ZSTACK_COMPUTE_SRIOV_10012": "vm nic [uuid:%s]이(가) 이미 %s 유형입니다. 수정할 필요가 없습니다", + "ORG_ZSTACK_FAULTTOLERANCE_10016": "SVM 생성은 성공했지만 보조 VM 시작 요청 중에 오류가 발생했습니다. SVM 구성을 확인하고 보조 VM 시작을 위한 모든 전제 조건이 충족되었는지 확인하세요.", + "ORG_ZSTACK_COMPUTE_SRIOV_10013": "가상 머신의 네트워크 인터페이스 유형은 중지된 경우에만 수정하세요.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10009": "2단계 인증이 실패했습니다. msg 시스템 태그에 토큰이 없습니다.%s", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10008": "2단계 인증이 실패했습니다. 메시지에 시스템 태그가 포함되어 있지 않습니다.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10004": "계정에서 2단계 인증이 활성화되어 있지 않습니다. 계속 진행하려면 활성화해 주세요.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10001": "지원되지 않는 계정 유형: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10026": "내결함성 VM 포트를 찾을 수 없습니다", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10011": "가상 리소스 %s에 대한 2단계 인증 코드 확인이 실패했습니다. 코드를 확인하고 다시 시도해 주세요.", + "ORG_ZSTACK_DAHO_CORE_10003": "Daho VLL 작업 생성 실패! 모든 소스 파일이 올바르게 업로드되어 클라우드 환경에서 접근 가능한지 확인해 주세요.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10010": "2단계 인증이 실패했습니다. %s:%s에 대한 시크릿이 정의되어 있지 않습니다.", + "ORG_ZSTACK_FAULTTOLERANCE_10024": "보조 가상 시스템을 시작할 수 없습니다. 주 가상 시스템이 중지 상태입니다. 먼저 주 가상 시스템을 시작해 주세요.", + "ORG_ZSTACK_DAHO_CORE_10004": "accountUuid: %s에 대한 Alibaba Cloud 계정을 찾을 수 없습니다", + "ORG_ZSTACK_FAULTTOLERANCE_10022": "현재 내결함성 네트워크에서 사용 가능한 IP를 찾을 수 없습니다. 전역 구성 [범주: 내결함성, 이름: fault.tolerance.network.cidr]이 올바르게 설정되어 있는지 확인하고, 호스트 [uuid:%s]가 지정된 CIDR 범위 내에 IP 주소를 가지고 있는지 확인해 주세요.", + "ORG_ZSTACK_FAULTTOLERANCE_10021": "클라우드 리소스 관리 중 예상치 못한 예외가 발생했습니다. 입력 매개변수가 유효한 범위 내에 있는지 확인해 주세요. 문제가 지속되면 클라우드 컴퓨팅 환경 구성을 검토하거나 지원팀에 문의해 주세요.", + "ORG_ZSTACK_DAHO_CORE_10007": "만료 정책: %s은(는) 유효한 구성이 아닙니다", + "ORG_ZSTACK_FAULTTOLERANCE_10020": "페일오버를 수행하지 못했습니다. 보조 VM을 알 수 없고 사용 가능한 내결함성 네트워크 주소가 없습니다. 구성을 확인해 주세요.", + "ORG_ZSTACK_DAHO_CORE_10008": "vlanId[%s]이(가) 이미 존재합니다!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10026": "CfnRootDecoder의 가중치는 0-100 사이여야 하며, 0은 우선순위 디코딩을 나타내고 기본값은 50입니다.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10025": "매개변수 루트 본문은 JSON 객체여야 합니다!", + "ORG_ZSTACK_COMPUTE_SRIOV_10020": "%s은(는) SRIOV를 지원하지 않습니다", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10024": "매개변수에 Type이 필요하지만 %s에서 찾을 수 없습니다", + "ORG_ZSTACK_COMPUTE_SRIOV_10021": "VM 유형 [%s]에 대해 enableSRIOV 태그가 지원되지 않습니다", + "ORG_ZSTACK_COMPUTE_SRIOV_10022": "VM[uuid:%s]을(를) 호스트[uuid:%s]로 마이그레이션하기 전에 가상 네트워크 인터페이스를 사전 처리하지 못했습니다", + "ORG_ZSTACK_FAULTTOLERANCE_10028": "호스트 [uuid: %s]의 nic [uuid: %s]에 대해 요청된 것보다 작은 포트 번호가 할당되었습니다", + "ORG_ZSTACK_COMPUTE_SRIOV_10023": "VM[uuid:%s]을(를) 호스트[uuid:%s]로 마이그레이션한 후 가상 네트워크 인터페이스를 사후 처리하지 못했습니다", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10029": "매핑 값 본문은 JSON 배열을 지원하지 않습니다! 매핑 값이 클라우드 컴퓨팅 플랫폼에서 지원하는 스칼라 또는 복합 유형인지 확인해 주세요.", + "ORG_ZSTACK_FAULTTOLERANCE_10027": "호스트 [uuid: %s]의 nic[uuid: %s]에 대해 포트를 할당하지 못했습니다", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10028": "리소스를 생성하기 위한 메시지: %s을(를) 찾을 수 없습니다", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10030": "매핑 값 본문은 null 값을 지원할 수 없습니다! 모든 매핑 값 본문이 초기화되어 있는지 확인해 주세요.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10031": "CloudFormation JSON 결과에서 mappingName을 찾지 못하면无效로 간주됩니다.", + "ORG_ZSTACK_FAULTTOLERANCE_10037": "VM[uuid:%s]을(를) 페일오버할 수 없습니다. 내결함성 VM 그룹이 다음 상태 중 하나가 아닙니다: [%s, %s]", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10005": "클러스터[uuid:%s]에 호스트가 없기 때문에 L2VirtualSwitchNetwork를 연결할 수 없습니다", + "ORG_ZSTACK_FAULTTOLERANCE_10036": "VM[UUID:%s]을(를) 페일오버할 수 없습니다. 내결함성 VM 그룹인지 확인해 주세요.", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10006": "인터페이스[%s]가 호스트[uuid:%s]에 생성되어야 하므로 L2 가상 스위치 네트워크를 연결할 수 없습니다.", + "ORG_ZSTACK_FAULTTOLERANCE_10035": "VM[UUID:%s]을(를) 페일오버할 수 없습니다. GlobalConfig에서 페일오버가 활성화되어 있는지 확인해 주세요.", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10007": "가상 스위치[uuid:%s]에 레이어 3 네트워크를 생성할 수 없습니다.", + "ORG_ZSTACK_FAULTTOLERANCE_10034": "L3 네트워크[uuid:%s]를 삭제할 수 없습니다. 내결함성 VM [%s]이(가) 여전히 [%s, %s] 상태에 있습니다. L3 네트워크를 삭제하기 전에 관련 내결함성 VM을 중지해 주세요.", + "ORG_ZSTACK_FAULTTOLERANCE_10033": "이미지[uuid:%s]가 여전히 내결함성 VM[uuid:%s]에 의해 사용되고 있습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10004": "작업을 수행하기 위해 연결된 KVM 호스트를 찾을 수 없습니다. 공유 블록 그룹 스토리지[uuid:%s]에 연결된 클러스터의 모든 호스트가 연결 해제된 것 같습니다.", + "ORG_ZSTACK_FAULTTOLERANCE_10032": "pvm[uuid:%s]과(와) svm[uuid:%s]의 인덱스가 %d인 볼륨이 서로 다른 크기의 캐시 볼륨을 가지고 있어 시작할 수 없습니다.", + "ORG_ZSTACK_FAULTTOLERANCE_10031": "pvm[uuid:%s]과(와) svm[uuid:%s]의 인덱스가 %d인 볼륨이 서로 다른 크기를 가지고 있어 시작할 수 없습니다.", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10003": "동일한 vlanId[%s]를 가진 L2PortGroupNetworks가 이미 포함되어 있으므로 L2PortGroupNetwork를 생성할 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10002": "볼륨[uuid:%s]이(가) 연결된 KVM 호스트가 공유 블록 스토리지 그룹[uuid:%s]과의 연결을 끊었습니다.", + "ORG_ZSTACK_FAULTTOLERANCE_10030": "pvm[uuid:%s]과(와) svm[uuid:%s]의 볼륨 번호가 일치하지 않아 시작할 수 없습니다.", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10004": "클러스터[uuid:%s]의 인터페이스[%s]가 이미 다른 L2VirtualSwitchNetwork에서 사용 중이므로 L2VirtualSwitchNetwork를 연결할 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10001": "공유 블록 그룹 기본 스토리지에서 운영할 볼륨을 찾을 수 없습니다.%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10002": "VYOS DHCP 서비스에 구성된 가상 라우터가 없습니다.%s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10006": "공유 볼륨은 씬 프로비저닝을 지원하지 않습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10001": "%s로 인해 가상 라우터 VM[UUID:%s IP:%s]에 DHCP 항목을 추가할 수 없습니다. DHCP 항목[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10039": "FT VM[UUID:%s, state:%s]이(가) 정지 상태가 아닌 경우 현재 작업[API:%s]이(가) 지원되지 않습니다.", + "ORG_ZSTACK_FAULTTOLERANCE_10038": "FT VMs[%s]가 복구 중이므로 호스트를 유지할 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10011": "vm[uuid:%s]이(가) 실행 중, 일시 중지됨 또는 정지 상태가 아닙니다. 현재 상태[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10048": "ft vm[uuid:%s] 플랫폼을 업데이트할 수 없습니다. 진행하기 전에 두 VM을 모두 정지하고 정지 상태인지 확인해야 합니다.", + "ORG_ZSTACK_FAULTTOLERANCE_10047": "ft vm[uuid:%s]의 메모리 크기를 업데이트할 수 없습니다. 두 VM을 정지해야 하기 때문입니다.", + "ORG_ZSTACK_FAULTTOLERANCE_10046": "ft vm[uuid:%s]의 CPU 수를 업데이트할 수 없습니다. 두 VM을 정지하고 다시 시작해야 합니다.", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10005": "L2 네트워크는 클러스터에 이미 연결된 프로비저닝 네트워크와 동일한 인터페이스 이름을 가질 수 없습니다.", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10004": "BareMetal2 클러스터에 호스트를 추가하지 마세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10015": "UUID [uuid: %s] 및 이름 [name: %s]인 이미지가 백업 스토리지에서 발견되지 않았습니다.", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10003": "새 BareMetal2 클러스터를 생성할 때 아키텍처를 지정해야 합니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10014": "이미지 [UUID: %s, name: %s]이(가) 백업 스토리지에서 다운로드할 수 없습니다:", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10002": "1. 이미지가 삭제 상태가 아닌지 확인합니다.", + "ORG_ZSTACK_FAULTTOLERANCE_10042": "2. 이 이미지에 대해 Ready로 표시된 백업 스토orage가_zone [UUID: %s]에 연결되어 있는지 확인합니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10013": "공유 볼륨[uuid: %s]의 온라인 병합 스냅샷이 공유 블록에서 지원되지 않습니다", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10001": "베어메탈 클러스터에 로컬 스토리지를 연결할 수 없습니다. 클러스터가 로컬 스토리지 연결을 지원하는지 확인하십시오.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10012": "볼륨[UUID: %s]이(가) %s 상태의 VM[UUID: %s]에 연결되어 있으므로 스냅샷 병합을 수행할 수 없습니다.", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10000": "토큰이 있는 서드파티 Ceph를 aarch64 클러스터에 연결할 수 없습니다. Ceph 버전과 클러스터 아키텍처의 호환성을 확인하십시오.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10017": "호스트[uuid:%s]에 공유 블록 스토리지와 연결된 디스크 UUID가 있지만, 실제 스토리지가 다릅니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10016": "클러스터[uuid:%s]에서 연결된 호스트를 찾을 수 없습니다.", + "ORG_ZSTACK_FAULTTOLERANCE_10049": "현재 작업은 내결함성 그룹 가상 머신[uuid:%s]에서 지원되지 않습니다.", + "ORG_ZSTACK_BAREMETAL_NETWORK_10004": "MAC 주소 %s는 이미 본드 슬레이브 인터페이스입니다.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10000": "가상 라우터[uuid:%s, ip:%s]에 DHCP 항목을 프로그래밍할 수 없습니다, %s.", + "ORG_ZSTACK_BAREMETAL_NETWORK_10003": "MAC 주소 %s는 UUID가 %s인 섀시에 속하지 않습니다.", + "ORG_ZSTACK_BAREMETAL_NETWORK_10002": "슬레이브 주소 %s가 잘못되었습니다. 6c:b3:11:1b:0b:1e,6c:b3:11:1b:0b:1f과 같이 쉼표로 구분된 MAC 주소 형식이어야 합니다.", + "ORG_ZSTACK_BAREMETAL_NETWORK_10001": "본드 이름 %s가 가상 네트워크 구성에 이미 존재합니다.", + "ORG_ZSTACK_BAREMETAL_NETWORK_10000": "BM 인스턴스 생성 전에만 BM 본딩 생성이 허용됩니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10022": "백업 스토리지[uuid:%s]를 찾을 수 없습니다.", + "ORG_ZSTACK_FAULTTOLERANCE_10058": "동일한 MAC 주소 [%s]가 허용되지 않습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10021": "예상 상태는 %s이고 현재 상태는 %s입니다.", + "ORG_ZSTACK_FAULTTOLERANCE_10057": "Ft 네트워크가 구성되지 않았습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10020": "씬 볼륨을 씩 볼륨으로 변환하는 작업은 현재 지원되지 않습니다. 사용 가능한 볼륨 변환 옵션에 대해서는 최신 문서를 참조하십시오.", + "ORG_ZSTACK_FAULTTOLERANCE_10056": "페일오버 가상 머신 생성에 실패했습니다. GlobalConfig에서 페일오버 기술을 활성화하십시오.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10001": "EIP 게스트 IP를 찾을 수 없습니다: %s, VM NIC IP: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10055": "FT 이차 가상 머신 인스턴스를 마이그레이션할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10002": "eip [uuid:%s]가 삭제되었습니다.", + "ORG_ZSTACK_FAULTTOLERANCE_10054": "FT 기본 VM 인스턴스를 마이그레이션할 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10025": "QEMU2 공유 볼륨[uuid:%s]이 지원되지 않습니다.", + "ORG_ZSTACK_FAULTTOLERANCE_10053": "현재 작업은 이차 가상 머신[uuid:%s]에서 지원되지 않습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10024": "VM[uuid:%s]에 서로 다른 기본 스토리지의 여러 ISO가 있습니다: %s.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10029": "이 작업은 전체 가상 머신 인스턴스만 지원합니다. 완전한 인스턴스 사양을 사용하고 있는지 확인하십시오.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10027": "공유 블록 그룹 기본 스토리지[uuid: %s]에서 볼륨[uuid: %s]에 대한 스냅샷을 찍을 수 있는 사용 가능한 호스트를 찾을 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10005": "Elastic IP UUID 또는 Virtual IP UUID 중 하나를 지정해야 합니다.", + "ORG_ZSTACK_FAULTTOLERANCE_10051": "현재 작업은 파일 전송 이차 가상 머신 [uuid:%s]에서 지원되지 않습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10006": "uuid:%s가 있는 EIP가 활성화 상태가 아니라서 VM NIC에 연결할 수 없습니다", + "ORG_ZSTACK_FAULTTOLERANCE_10050": "현재 작업이 내결함성 기본 VM[uuid:%s]에서 지원되지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10003": "L3 네트워크[uuid:%s, name:%s]가 VM의 NIC 중 하나에 탄력적 IP(EIP)를 제공하고 있어서 VM[uuid:%s, name:%s]에 연결할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10004": "vmNic [UUID:%s]가 vmInstance에 연결되어 있지 않아서 연결 가능한 EIP를 검색할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10009": "uuid: %s가 있는 EIP는 상태가 %s일 때만 연결할 수 있지만, 현재 상태는 %s입니다", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10007": "IP [uuid:%s]가 VM NIC [%s]에 연결되어 있습니다", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10008": "UUID: %s인 eIP가 이미 다른 VM NIC(UUID: %s)에 연결되어 있어 다시 연결할 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10033": "작업을 수행할 수 있는 연결된 KVM 호스트를 찾을 수 없습니다. 공유 블록 스토리지[uuid:%s]에 연결된 모든 호스트가 연결 해제된 것 같습니다", + "ORG_ZSTACK_FAULTTOLERANCE_10069": "cluster[uuid:%s]가 지정되어 있지만 비활성화되어 있어서 이 cluster에서 VM을 만들 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10032": "UUID: %s인 기본 스토리지와 UUID: %s인 기본 스토리지 모두에 연결된 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_FAULTTOLERANCE_10068": "zone[uuid:%s]가 지정되어 있지만 비활성화되어 있어서 이 zone에서 VM을 만들 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10031": "공유 블록 그룹 기본 스토리지[uuid:%s]와 [uuid:%s]에서 volume[uuid:%s]을 마이그레이션할 수 있는 사용 가능한 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10030": "공유 블록 그룹 기본 스토리지[uuid:%s]와 [uuid:%s] 사이에서 volume[uuid:%s]을 마이그레이션할 수 있는 사용 가능한 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10037": "가상 머신 %s가 실행 중이거나 중지된 상태가 아니라서 스냅샷 %s를 축소할 수 없습니다", + "ORG_ZSTACK_FAULTTOLERANCE_10065": "동일한 UUID를 l3Network에 추가할 수 없습니다, UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10035": "volume %s가 준비되지 않아서 스냅샷 %s를 축소할 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10038": "가상 머신 %s의 스냅샷에서 설치 경로를 가져올 수 없습니다", + "ORG_ZSTACK_ALIYUN_BACKUP_10000": "백업 작업을 위한 스토리지 버킷을 찾을 수 없습니다. 유효한 버킷이 구성되어 있는지 확인하십시오.%s", + "ORG_ZSTACK_FAULTTOLERANCE_10062": "image[uuid:%s]의 형식은: %s이며, VM을 만드는 데에는 유효한 형식만 사용할 수 있습니다", + "ORG_ZSTACK_FAULTTOLERANCE_10061": "image[uuid:%s]의 미디어 유형은: %s이며, VM을 만드는 데에는 루트 볼륨 템플릿만 사용할 수 있습니다", + "ORG_ZSTACK_TICKET_IAM2_API_10004": "하나의 예약 정책은 하나의 흐름 컬렉션에만 연결할 수 있습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10044": "volume[uuid:%s]에 대해 기본 스토리지[uuid:%s]에서 스냅샷을 가져올 연결된 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10020": "vip[uuid:%s]가 예상 상태[%s]가 아니라서, 현재 상태는 %s입니다", + "ORG_ZSTACK_SNS_PLATFORM_MICROSOFTTEAMS_10000": "Microsoft Teams로 메시지를 보내지 못했습니다. 상태: %s, 본문: %s", + "ORG_ZSTACK_TICKET_IAM2_API_10003": "클라우드 컴퓨팅 환경에서 흐름을 만들려면 이름이 필요합니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10043": "volume[uuid:%s]에 대해 기본 스토리지[uuid:%s]에서 스냅샷을 커밋할 연결된 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_FAULTTOLERANCE_10079": "vm[uuid:%s]을 시작할 수 없습니다. 네트워크 인터페이스 카드(NIC)가 연결되어 있지 않습니다. NIC를 연결하고 다시 시도하십시오", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10042": "활성화 설치 경로 %s가 실패했습니다. 이유: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10041": "활성화된 자식 스냅샷이 실패했습니다. 이유: %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10023": "vmNic UUID[%s]는 이미 허용된 CIDR가 있는 포트 포워딩 규칙이 있어서 EIP를 추가할 수 없습니다", + "ORG_ZSTACK_FAULTTOLERANCE_10077": "현재 내결함성 가상 머신이 알 수 없는 상태이며 중지할 수 없습니다. 수동 장애 조치를 시도해 주세요.", + "ORG_ZSTACK_TICKET_IAM2_API_10008": "리소스 이름은 null일 수 없습니다. 리소스에 대한 유효한 이름을 제공해 주세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10048": "thin provisioning 초기화 크기 태그[%s]가 잘못되었습니다", + "ORG_ZSTACK_TICKET_IAM2_API_10007": "승인자 제목 %s가 잘못되었습니다, 유효한 값은 %s입니다", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10021": "VM NIC의 게스트 L3 네트워크[uuid:%s]와 VIP의 VIP L3 네트워크[uuid:%s]가 동일한 네트워크입니다", + "ORG_ZSTACK_TICKET_IAM2_API_10006": "흐름 컬렉션을 생성하려면 최소 하나의 흐름이 필요합니다.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10022": "VM 상태[%s]는 EIP 작업을 수행할 수 없습니다. VM 프로세스가 완료될 때까지 기다려 주세요.", + "ORG_ZSTACK_TICKET_IAM2_API_10005": "마지막 워크플로의 승인자로 관리자 또는 IAM 역할 작업이 필요합니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10045": "installPath 비활성화가 %s로 인해 실패했습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10049": "thin provisioning 초기화 크기[%s]가 잘못되었습니다. %s보다 크거나 같아야 합니다", + "ORG_ZSTACK_FAULTTOLERANCE_10073": "defaultL3NetworkUuid[uuid:%s]가 l3NetworkUuids[%s]에서 찾을 수 없습니다", + "ORG_ZSTACK_FAULTTOLERANCE_10071": "host[uuid:%s]가 지정되었지만 연결 상태가 %s이므로 VM을 생성할 수 없습니다", + "ORG_ZSTACK_FAULTTOLERANCE_10070": "host[uuid:%s]가 지정되었지만 비활성화되어 있어 VM을 생성할 수 없습니다", + "ORG_ZSTACK_TICKET_IAM2_API_10009": "승인자 UUID는 null일 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10051": "thinProvisioningInitializeSize[%s]가 %d의 최대 제한을 초과합니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10050": "thinProvisioningInitializeSize[%s]가 잘못되었습니다. 유효한 크기 값이 아닙니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10055": "UUID [uuid: %s]를 가진 호스트가 UUID [uuid: %s]의 볼륨을 UUID [uuid: %s]의 공유 블록 그룹 기본 저장소에서 크기 조정할 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10054": "shared block group primary storage[uuid:%s]에 대한 명령을 실행하기 위해 연결된 공유 블록 저장소가 있는 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10053": "shared block group primary storage[uuid:%s]에 대한 명령을 실행할 수 있는 사용 가능한 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10052": "값[%s]은 2의 제곱이 아닙니다", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10012": "IP 주소 [uuid:%s]가 네트워크 인터페이스 [uuid:%s]에 속하지 않습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10059": "shared block group primary storage [uuid: %S]에 연결된 클러스터를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10058": "공유 마운트 포인트 기본 저장소[uuid:%s, name:%s]가 연결된 클러스터 내에서 볼륨을 인스턴스화할 수 있는 사용 가능한 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10013": "eip[uuid:%s]가 가상 머신의 네트워크 인터페이스에 연결되어 있지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10010": "vm 네트워크 인터페이스가 UUID %s의 EIP에 대한 호환 가능한 사용 중인 IP가 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10057": "스토리지 풀에서 volume[uuid:%s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10011": "VM NIC의 게스트 L3 네트워크와 EIP의 VIP L3 네트워크가 동일한 네트워크입니다 [uuid:%s] 및 [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10056": "호스트[UUID: %s]의 에이전트 버전이 업그레이드되지 않았습니다. 운영 체제 업데이트를 수행하기 전에 호스트를 다시 연결하세요.", + "ORG_ZSTACK_TICKET_IAM2_API_10011": "", + "ORG_ZSTACK_TICKET_IAM2_API_10010": "dataStartTime[%s]이(가) dataEndTime[%s]보다 늦습니다", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10017": "EIP와 연결된 VM [UUID:%s]이(가) 이미 공용 네트워크 [UUID:%s]에 연결되어 있으며, VIP [UUID:%s, Name:%s, IP:%s]가 해당 네트워크에서 비롯됩니다.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10014": "VIP IP 버전 [%d]이(가) 게스트 IP 버전 [%d]과(와) 다릅니다.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10015": "VIP[%s]이(가) 게스트 IP 범위 [%s - %s] 내에 있습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10062": "SharedBlock 기본 스토리지 [uuid:%s, name:%s]이(가) 어떤 컴퓨트 클러스터에도 연결되어 있지 않거나, 연결된 클러스터에 연결된 호스트가 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10018": "VIP [UUID:%s]이(가) 다른 네트워크 서비스 엔티티 [%s]에 의해 사용 중입니다.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10019": "EIP는 시스템 VIP에 생성할 수 없습니다. EIP 연결에 공용 IP 주소를 사용하고 있는지 확인하십시오.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10047": "이미지 해시 가져오기 실패, 원인: %s", + "ORG_ZSTACK_SNS_PLATFORM_FEISHU_10000": "FeiShu로 메시지 전송 실패. 상태: %s, 본문: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10042": "이미지 스토리지 백업 스토리지 에이전트의 UUID가 변경되었습니다 [예상: %s, 실제: %s]. 이는 에이ジェ트가 수동으로 재시작된 것일 수 있습니다. 상태 동기화를 위해 재연결을 실행하십시오.", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10000": "Zaku 클러스터 정보를 가져오지 못했습니다, 오류: %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10002": "Zaku 클러스터 [id:%s]를 가져오지 못했습니다, 오류: %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10001": "Zaku 클러스터 정보를 가져오지 못했습니다. 응답 내용이 null입니다. 요청 매개변수와 네트워크 연결을 확인하십시오.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10000": "프로젝트 %s에 대한 보안 그룹의 할당량을 찾을 수 없습니다.", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10004": "API 응답에서 작업 ID를 추출하지 못했습니다.", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10003": "Zaku 클러스터 [id:%s]를 가져오지 못했습니다, 응답 내용이 null입니다.", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10006": "클라우드 응답을 파싱하지 못했습니다: %s", + "ORG_ZSTACK_SNS_10015": "platformUuid와 endpointUuid를 동시에 지정할 수 없습니다. 입력 매개변수를 확인하십시오.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10001": "보안 그룹 할당량은 1보다 작을 수 없습니다. 최소 1 이상의 값으로 설정을 조정하십시오.", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10005": "비동기 작업이 %d초 후에 시간 초과되었습니다.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10004": "레이블의 l3Uuid가 매개변수의 l3Uuid와 일치하지 않습니다.", + "ORG_ZSTACK_SNS_10013": "비밀번호는 null일 수 없습니다.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10003": "시스템 태그가 요청되었습니다. 보안 그룹 강제 적용이 활성화되어 있으므로, 시스템 태그 L3_NETWORK_SECURITY_GROUP_UUIDS_REF를 형식 l3::{%s}::SecurityGroupUuids::{%s}로 설정하여 VM NIC에 대한 기본 보안 그룹을 지정해야 합니다.", + "ORG_ZSTACK_SNS_10012": "사용자 이름은 null일 수 없습니다.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10006": "보안 그룹 강제 적용이 활성화되어 있으므로, 태그의 securityGroupUuid가 프로젝트[%s] 내에 있어야 합니다.", + "ORG_ZSTACK_SNS_10011": "smtpPort는 null일 수 없습니다.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10005": "보안 그룹 [UUID: %s]의 소유자 [UUID: %s]가 다른 IAM2 프로젝트에 속해 있습니다.", + "ORG_ZSTACK_SNS_10010": "smtpServer는 null일 수 없습니다.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10008": "보안 그룹 강제 적용 기능이 활성화되어 있는 경우 기본 보안 그룹 %s을(를) 삭제할 수 없습니다.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10007": "l3Network [uuid:%s]에 연결된 NIC가 보안 그룹과 연결되어 있습니다. l3Network를 보안 그룹에서 분리하기 전에 NIC를 먼저 분리해야 합니다.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10039": "당사 클라우드 환경에서 ImageStore 서비스를 이용하려면 상업용 라이선스가 필요합니다.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10009": "이 보안 그룹 %s는 가상 머신과 연결되어 있습니다. 계속하기 전에 연결을 해제하십시오.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10035": "이미지 저장소 [%s]는 백업 원격으로 사용 중이므로 이미지를 추가할 수 없습니다", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10032": "백업 저장소[UUID:%s]에 가상 머신 이미지를 내보낼 수 있는 충분한 용량[%s]이 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10002": "가상 라우터[이름: %s, uuid: %s]가 snat%s를 동기화하지 못했습니다. 원인: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10031": "백업 저장소[%s]에서 이미지[%s]를 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10001": "게스트 l3Network[uuid:%s, 이름:%s]는 가상 라우터의 SNAT 서비스가 필요하지만, 가상 라우터 offering[uuid: %s, 이름:%s]과 연결된 공용 l3Network[uuid:%s]가 게스트 l3Network와 동일합니다.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10020": "notifySugonSdn: VM [uuid:%s]의 vrouter를 대상 호스트[uuid:%s]에 대해 Sugon SDN에 알리지 못했습니다. 오류: %s", + "ORG_ZSTACK_SNS_10029": "클라우드 리소스 식별자 [%s]가 이미 존재합니다", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10011": "계정[%s]은 기본 보안 그룹에 대한 작업을 수행할 수 없습니다", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10010": "계정[%s]은 기본 보안 그룹[%s]에 대한 작업을 수행할 수 없습니다", + "ORG_ZSTACK_SNS_10026": "%s(으)로 이메일 주소를 업데이트할 수 없습니다. 이미 엔드포인트 [UUID:%s]에 존재하기 때문입니다", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10012": "VM의 네트워크 인터페이스 [UUID: %s]는 하나의 보안 그룹에만 속할 수 있습니다. 따라서 현재 보안 그룹 [UUID: %s]에서 제거할 수 없습니다.", + "ORG_ZSTACK_SNS_10024": "동일한 이메일 주소를 엔드포인트[uuid:%s]에 추가할 수 없습니다", + "ORG_ZSTACK_SNS_10023": "플러그인[%s]을 찾을 수 없습니다", + "ORG_ZSTACK_SNS_10022": "동일한 주소[%s:%s]로 SNMP 플랫폼을 생성할 수 없습니다", + "ORG_ZSTACK_SNS_10021": "null 매개 변수 때문에 연결을 설정할 수 없습니다. 필요한 모든 매개 변수가 올바르게 구성되어 있는지 확인하십시오.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10029": "원격 대상 유형 %s이(가) 구현되지 않았습니다", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10028": "%s 때문에 내보낸 이미지를 패키지하지 못했습니다", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10027": "일부 이미지 [%s]가 백업 저장소 [uuid: %s]로 내보내지지 않았습니다", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10026": "이미지 패키지를 삭제하지 못했습니다. 원인: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10022": "이미지 저장소[uuid:%s]에 최대 용량을 설정하지 못했습니다", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10021": "이미지 저장소[uuid:%s]에 최대 용량을 설정하지 못했습니다. 원인: %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10019": "notifySugonSdn: VM [uuid:%s]의 vrouter를 대상 호스트 [uuid:%s]에 대해 Sugon SDN에 알리지 못했습니다", + "ORG_ZSTACK_SNS_10038": "수신자 이메일 주소를 지정하지 않고 SNS 이메일 엔드포인트를 생성할 수 없습니다", + "ORG_ZSTACK_SNS_10037": "사용자 이름과 비밀번호는 모두 없거나 함께 제공되어야 합니다", + "ORG_ZSTACK_SNS_10036": "유효하지 않은 전화 번호[%s]입니다. +86-12388889999 형식으로 입력하십시오", + "ORG_ZSTACK_SNS_10035": "[%s]은(는) 유효한 IP 주소가 아닙니다", + "ORG_ZSTACK_SNS_10034": "유효하지 않은 클라우드 저장소 경로[%s]", + "ORG_ZSTACK_SNS_10031": "전화 번호 [%s]이(가) 존재하지 않습니다", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10018": "클라우드 인스턴스 또는 가상 머신에서 응답이 없습니다. 인스턴스 상태와 네트워크 구성을 확인하십시오.", + "ORG_ZSTACK_SNS_10030": "가상 머신의 전화번호 목록이 비어 있습니다. 필요한 전화번호가 프로비저닝되었는지 확인하세요.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10016": "백업 저장소에서 UUID: %s 이미지를 가져오지 못했습니다. 이유: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10015": "이미지 다운로드에 필요한 인증서 파일이 없습니다: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10013": "SimpleHttpBackupStorage[url:%s]에 연결할 수 없습니다. 이유: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10010": "작업 응답을 받지 못했습니다! 인스턴스 구성과 네트워크 설정을 확인하세요.", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_10000": "생성이 이미지 캐시[uuid:%s, 위치 URL: [%s]]에 의존합니다. 다른 위치에서 생성할 수 없습니다.", + "ORG_ZSTACK_SNS_10045": "시스템 수준 가상 머신 플랫폼에서는 이 작업이 허용되지 않습니다. 사용자 공간 리소스를 수정하고 있는지 확인하세요.", + "ORG_ZSTACK_SNS_10044": "전화번호를 지정하지 않으면 범용 SMS를 검증할 수 없습니다.", + "ORG_ZSTACK_SNS_10043": "userId [%s]가 클라우드 환경에 이미 존재합니다.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10008": "기본 저장소 %s에서 이미지 메타데이터를 정리하지 못했습니다. 오류: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10007": "소스 파일이 누락되어 동기화 상태가 실패했습니다. 필요한 모든 파일이 있는지 확인하고 동기화를 다시 시도하세요.", + "ORG_ZSTACK_SNS_10041": "클라우드 전화번호[%s]가 이미 존재합니다.", + "ORG_ZSTACK_SNS_10040": "유효하지 않은 이메일 주소[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10005": "기본 저장소 [uuid: %s]가 연결된 클러스터에서 연결된 호스트를 찾을 수 없습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10004": "UUIDs: %s로 지정된 백업 저장소를 커밋할 수 없습니다. 오류로 인해: %s", + "ORG_ZSTACK_MONITORING_10004": "리소스[uuid:%s]의 타입을 찾을 수 없습니다.", + "ORG_ZSTACK_MONITORING_10005": "resourceType[%s] 및 항목[%s]에 대한 모니터링 메트릭을 찾을 수 없습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10002": "UUIDs: %s로 지정된 백업 저장소를 할당할 수 없습니다. 리소스 제약 조건 또는 잘못된 UUIDs로 인해: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10000": "생성 시간 파싱 오류: %s", + "ORG_ZSTACK_MONITORING_10000": "모니터 트리거[uuid:%s]를 찾을 수 없습니다. 삭제되었거나 비활성화되었을 수 있습니다.", + "ORG_ZSTACK_MONITORING_10001": "모니터 트리거 액션[uuid:%s]를 찾을 수 없습니다. 삭제되었거나 취소되었을 수 있습니다.", + "ORG_ZSTACK_MONITORING_10002": "리소스[type:%s]에 모니터링 메트릭이 없습니다.", + "ORG_ZSTACK_MONITORING_10003": "UUID [%s]의 리소스는 UUID [%s]의 계정에 속하지 않습니다.", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10002": "인스턴스[%s]가 어떤 그룹에도 연결되어 있지 않습니다.", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10001": "인스턴스[%s]가 이미 해당 그룹에 할당되어 있습니다.", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10003": "모니터링 그룹 [%s]가 모니터링 템플릿에 연결되어 있지 않습니다.", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10006": "그룹의 인스턴스 제한에 도달했습니다. 기존 인스턴스를 종료하거나 제한 증가를 위해 지원팀에 문의하세요.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10001": "출력 본문에서 JSON null 값을 지원하지 않습니다! 모든 필드가 적절하게 정의되어 있고 null이 아닌지 확인하세요.", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10005": "템플릿 규칙이 %d 항목의 최대 제한에 도달했습니다. 템플릿 확장을 고려하거나 지원을 위해 문의하세요.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10000": "출력에서는 클라우드 네이티브 서비스만 허용되지만 %s를 찾았습니다.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10016": "리소스 타입은 문자열이어야 합니다!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10014": "매핑 루트 본체는 JSON 객체여야 합니다!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10018": "리소스 루트 메타데이터는 JSON 객체여야 합니다!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10023": "매개변수 본체는 null 값을 지원할 수 없습니다!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10022": "지원되지 않는 매개변수 이름: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10020": "paramName은 CloudFormation JSON 템플릿 결과에서 찾을 수 있어야 하며, 그렇지 않으면 유효하지 않은 것으로 간주됩니다.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10001": "엔티티가 비어 있으므로 TableName을 확인할 수 없습니다", + "ORG_ZSTACK_FAULTTOLERANCE_10004": "호스트에서 포트를 할당하지 못했습니다[uuid: %s]", + "ORG_ZSTACK_ZQL_AST_VISITORS_10000": "쿼리의 테이블 %s에 조인 조건이 없습니다. 조인 조건이 올바르게 지정되어 있는지 확인하세요.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10003": "필드 목록이 비어 있으므로 열 이름을 확인할 수 없습니다. 필드 목록에 필요한 데이터가 포함되어 있는지 확인하세요.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10002": "엔티티가 비어 있으므로 columnName을 확인할 수 없습니다", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10005": "매핑 본체는 맵이 아닌 값을 지원하지 않습니다!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10004": "[%s]은(는) CloudFormation 출력에서 유효하지 않습니다!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10003": "출력의 설명은 문자열 유형이어야 합니다!", + "ORG_ZSTACK_FAULTTOLERANCE_10009": "보조 VM을 마이그레이션할 수 없습니다[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10008": "기본 가상 머신이 여전히 중지 상태이므로 보조 가상 머신을 시작할 수 없습니다. 보조 VM을 시작하기 전에 기본 VM이 실행 중인지 확인하세요.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10009": "리소스 값 본체는 null 값을 지원할 수 없습니다! 배포 전에 모든 리소스 매개변수가 올바르게 초기화되었는지 확인하세요.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10004": "지정된 함수는 null일 수 없습니다. 사용 전에 함수가 올바르게 초기화되었는지 확인하세요.", + "ORG_ZSTACK_FAULTTOLERANCE_10007": "기본 VM의 호스트 UUID를 검색할 수 없습니다[uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10008": "리소스 %s은(는) 자체를 참조할 수 없으므로 리소스 [%s]에서 자체 참조를 확인하세요", + "ORG_ZSTACK_FAULTTOLERANCE_10005": "요청된 것보다 적은 포트가 호스트에 할당되었습니다[uuid: %s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10006": "매핑 본체는 null 값을 지원할 수 없습니다! 모든 JSON 필드가 올바르게 정의되고 null이 아닌지 확인하세요.", + "ORG_ZSTACK_SNS_10009": "uuid [%%s]가 클라우드 환경에 이미 존재합니다.", + "ORG_ZSTACK_SNS_10007": "UUID: %s로 SNS Application Endpoint를 찾을 수 없습니다. 삭제되었을 수 있습니다", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10012": "리소스 매핑 [%s]에서 지원되지 않는 키 [%s]", + "ORG_ZSTACK_SNS_10006": "SNSApplicationPlatform[uuid:%s]을(를) 찾을 수 없습니다. 종료되었을 수 있습니다", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10011": "resourceName은 템플릿 출력에서 찾을 수 없거나 유효하지 않은 CloudFormation JSON입니다.", + "ORG_ZSTACK_SNS_10005": "지정된 엔드포인트 유형 %s를 찾을 수 없습니다. 유효한 엔드포인트 유형이 제공되었는지 확인하세요.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10010": "지원되지 않는 리소스 키: %s", + "ORG_ZSTACK_SNS_10003": "UUID:%s로 SNS Topic을 찾을 수 없습니다. 삭제되었을 수 있습니다", + "ORG_ZSTACK_SNS_10002": "애플리케이션 엔드포인트가 비활성화되었습니다. 구성 설정을 확인하거나 지원을 문의하세요.", + "ORG_ZSTACK_SNS_10001": "애플리케이션 플랫폼이 비활성화되었습니다. 관리자에게 문의하여 활성화하거나 사용 가능한 대안에 대해 문서를 확인하세요.", + "ORG_ZSTACK_SNS_10000": "%s 토픽이 구독된 엔드포인트에서 소비되고 있지 않습니다.", + "ORG_ZSTACK_CLOUDFORMATION_10002": "잘못된 ZStack 템플릿 형식 버전: [%s, 예상 버전은 %s입니다]", + "ORG_ZSTACK_CLOUDFORMATION_10001": "템플릿에는 ZStackTemplateFormatVersion 마커가 포함되어야 합니다.", + "ORG_ZSTACK_CLOUDFORMATION_10000": "템플릿 콘텐츠에서 null 요소를 검색했습니다. 템플릿 콘텐츠는 클라우드 리소스 또는 가상 머신 구성을 참조할 수 있습니다. 모든 요소가 올바르게 정의되고 초기화되었는지 확인하세요.", + "ORG_ZSTACK_CLOUDFORMATION_10009": "템플릿 [%s]가 가상화 환경에서 비활성화되어 있습니다", + "ORG_ZSTACK_CLOUDFORMATION_10008": "ResourceStackVO [%s]가 이미 삭제되었습니다!", + "ORG_ZSTACK_CLOUDFORMATION_10007": "ResourceStackVO: [%s]가 종료되었습니다...", + "ORG_ZSTACK_CLOUDFORMATION_10005": "VM 인스턴스[%s]에 대한 스택 UUID를 찾을 수 없습니다", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10035": "모든 후보 호스트에 대한 호스트 용량 예약에 실패했습니다. 대상 호스트의 가용성을 확인하고 예약 요구 사항을 충족할 수 있는 충분한 리소스가 있는지 확인하세요.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10034": "[호스트 할당]: %s 호스트[uuid:%s]에서. 다음 호스트로 할당 시도. %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10037": "필터링 후, HostAllocatorFilterExtensionPoint[%s]가 0개의 후보 호스트를 반환했습니다: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10036": "지정된 기준에 맞는 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_CLOUDFORMATION_10025": "%s 상태를 예상했습니다!", + "ORG_ZSTACK_EXPON_10002": "지수적 요청 실패, 코드 %s, 메시지: %s.", + "ORG_ZSTACK_EXPON_10003": "스냅샷 복사 후 볼륨[name:%s]을 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10000": "가상 라우터[name: %s, uuid: %s]가 DNS 구성에 실패했습니다%s, %s", + "ORG_ZSTACK_CLOUDFORMATION_10022": "리소스 스택 재시작은 %s 상태만 지원합니다!", + "ORG_ZSTACK_CLOUDFORMATION_10021": "uuid [%s]로 리소스 스택을 찾을 수 없습니다", + "ORG_ZSTACK_CLOUDFORMATION_10020": "가상 머신[%s]에서 기본 IP 주소를 찾을 수 없습니다", + "ORG_ZSTACK_CLOUDFORMATION_10028": "templateContent와 url은 둘 다 비어 있거나 둘 다 설정되어서는 안 됩니다!", + "ORG_ZSTACK_CLOUDFORMATION_10026": "templateContent와 templateUuid는 둘 다 비어 있거나 둘 다 설정되어서는 안 됩니다!", + "ORG_ZSTACK_HYBRID_ACCOUNT_10000": "지원되지 않는 keyType 유형 [%s]", + "ORG_ZSTACK_HYBRID_ACCOUNT_10002": "유형이 [%s]인 키: [%s]가 계정 UUID에 이미 존재합니다: [%s]", + "ORG_ZSTACK_HYBRID_ACCOUNT_10003": "매개변수 [accountUuid]는 관리 사용자만 사용할 수 있습니다!", + "ORG_ZSTACK_HYBRID_ACCOUNT_10004": "계정 UUID에 대해 키: [%s]가 이미 존재합니다: [%s]", + "ORG_ZSTACK_CLOUDFORMATION_10014": "콘텐츠는 템플릿 콘텐츠 또는 URL로 설정되어야 합니다!", + "ORG_ZSTACK_CLOUDFORMATION_10013": "시스템 템플릿을 삭제하거나 업데이트할 수 없습니다: %s", + "ORG_ZSTACK_CLOUDFORMATION_10012": "클라우드 템플릿 저장소에서 StackTemplateVO가 삭제되었습니다. 템플릿을 확인하고 다시 업로드하세요.", + "ORG_ZSTACK_CLOUDFORMATION_10011": "%s(타입: %s)에 대한 매개변수를 찾을 수 없습니다. 매개변수를 확인하세요.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10002": "하드웨어 VXLAN 풀을 연결할 수 없습니다. 이유: %s", + "ORG_ZSTACK_CLOUDFORMATION_10010": "templateContent를 지정해야 합니다!", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10003": "VLAN ID를 지정하지 않아 L2 하드웨어 VXLAN 네트워크를 생성할 수 없습니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10000": "호스트[uuid:%s]에 가상 인터페이스[name:%s]가 없으므로 레벨 2 네트워크를 클러스터에 연결할 수 없습니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10001": "호스트[uuid:%s]에 대한 스위치 포트를 찾을 수 없어 하드웨어 VXLAN 풀을 연결할 수 없습니다.", + "ORG_ZSTACK_CLOUDFORMATION_10019": "systemTag에서 l2[%s]의 l2 브리지 이름을 찾을 수 없습니다.", + "ORG_ZSTACK_CLOUDFORMATION_10018": "filterName 매개변수는 cloudformation:true 또는 cloudformation:false로 설정해야 합니다.", + "ORG_ZSTACK_CLOUDFORMATION_10017": "StackTemplateVO: [%s]가 클라우드 리포지토리에서 삭제되었습니다...", + "ORG_ZSTACK_CLOUDFORMATION_10016": "잘못된 CloudFormation 템플릿 버전: %s", + "ORG_ZSTACK_CLOUDFORMATION_10015": "클라우드 리소스의 콘텐츠 입력을 가져오지 못했습니다. 소스 파일이 제대로 업로드되고 구성되었는지 확인하세요.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10006": "VPC ID를 지정하지 않아 Huawei iMaster SDN VXLAN 네트워크를 생성할 수 없습니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10007": "지정된 vni 범위 [%d-%d]가 잘못되어 추가할 수 없습니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10004": "VLAN ID [%s]가 유효한 범위를 벗어나기 때문에 Huawei iMaster SDN VXLAN 네트워크를 생성할 수 없습니다: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10005": "vpcId와 tenantId를 지정하지 않아 Huawei iMaster SDN VXLAN 네트워크를 생성할 수 없습니다.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10009": "VLAN 범위를 지정하지 않고 Huawei iMaster SDN Controller를 네트워크에 추가할 수 없습니다.", + "ORG_ZSTACK_NETWORK_L2_10013": "연결 또는 분리 상태의 호스트가 있으므로 L2 네트워크 [UUID:%s]의 VLAN을 수정할 수 없습니다.", + "ORG_ZSTACK_NETWORK_L2_10012": "지원되지 않는 가상 스위치 유형[%s]", + "ORG_ZSTACK_NETWORK_L2_10015": "이 네트워크가 격상되어 있으므로 l2Network[uuid:%s]의 VLAN을 수정할 수 없습니다.", + "ORG_ZSTACK_NETWORK_L2_10014": "이 네트워크가 KVM 클러스터에 전용으로 제한되어 있으므로 l2Network[uuid:%s]의 VLAN을 수정할 수 없습니다.", + "ORG_ZSTACK_NETWORK_L2_10017": "vlan[%s]이(가) 클라우드 네트워크 구성에 잘못되었습니다.", + "ORG_ZSTACK_NETWORK_L2_10016": "type[%s]인 경우 ChangeL2NetworkVlanId에 VLAN이 필요합니다.", + "ORG_ZSTACK_NETWORK_L2_10019": "type[%s]인 경우 ChangeL2NetworkVlanId에 vLAN이 허용되지 않습니다.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10000": "버전[%s]을(를) 사용할 수 있는 후보 호스트가 없습니다.", + "ORG_ZSTACK_NETWORK_L2_10018": "가상 네트워크 ID [%s] 및 물리적 인터페이스 [%s]와 함께 L2 네트워크가 클러스터에 연결되었습니다. L2 네트워크 변경 실패 [uuid: %s].", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10083": "호스트네임[%s]의 기존 SimpleHttpBackupStorage가 감지되었습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10082": "잘못된 URL[%s], URL은 '/'로 시작하는 절대 경로여야 합니다.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10080": "파일 경로에 잘못된 문자가 포함되어 있습니다: %s", + "ORG_ZSTACK_NETWORK_L2_10020": "물리적 인터페이스 [%s]가 있는 클러스터에 연결된 l2Network [uuid:%s]를 수정하지 못했습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10079": "URL에 [/dev 또는 /proc 또는 /sys]와 같은 잘못된 경로가 포함되어 있어 클라우드 컴퓨팅 환경에서 지원되지 않습니다. 요청에 유효한 경로를 사용하세요.", + "ORG_ZSTACK_CLOUDFORMATION_10034": "템플릿 콘텐츠와 UUID는 모두 비어 있거나 모두 설정될 수 없습니다!", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10078": "소스 파일에 대한 절대 경로가 필요합니다: %s", + "ORG_ZSTACK_NETWORK_L2_10006": "UUID: %s 및 이름: %s인 L2 네트워크가 물리적 인터페이스 [%s]와 연결된 클러스터 UUID: %s에 연결되어 있습니다. UUID: %s인 L2 네트워크 연결에 실패했습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10077": "코드 검토 또는 편집을 진행하려면 소스 파일 경로가 필요합니다. 파일 경로를 제공해 주세요.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10076": "중복 백업 스토리지입니다. 이미지 스토어 백업 스토리지가 있습니다 [hostname:%s]", + "ORG_ZSTACK_NETWORK_L2_10008": "l2Network [UUID: %s]가 클러스터 [UUID: %s]와 연결되어 있어 재할당할 수 없습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10075": "hostname[%s]은(는) 유효한 DNS 이름 또는 IP 주소가 아닙니다", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10011": "DiskOfferingTagAllocatorExtensionPoint[%s]가 0개의 후보 호스트를 반환했습니다", + "ORG_ZSTACK_CLOUDFORMATION_10030": "시스템 스택 템플릿을 활성화 또는 비활성화할 권한은 관리자에게만 있습니다", + "ORG_ZSTACK_NETWORK_L2_10007": "물리적 인터페이스 [%s] 및 VLAN [%s]이(가) 있는 클러스터 [uuid:%s]에 연결된 L2 VLAN 네트워크 [uuid:%s, name:%s]가 있습니다. L2 VLAN 네트워크 [uuid:%s] 연결에 실패했습니다.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10010": "InstanceOfferingTagAllocatorExtensionPoint[%s]가 0개의 후보 호스트를 반환했습니다", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10073": "src 백업 스토리지에 이미지[%s]가 포함되어 있지 않습니다", + "ORG_ZSTACK_NETWORK_L2_10009": "물리적 인터페이스 %s에 다른 vSwitch 유형의 다른 네트워크가 있어 L2 네트워크를 연결할 수 없습니다", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10072": "소스 스토리지[%s]에 이미지[%s]가 포함되어 있지 않습니다", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10071": "대상 백업 스토리지 [uuid:%s]에 이미 이미지 [uuid:%s]가 포함되어 있습니다", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10070": "이미지 메타데이터 파일 삭제 실패: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10009": "백업 스토리지 [UUID: %s, type: %s]는 바인딩된 기본 스토리지가 필요하지만, 아직 기본 스토리지가 추가되지 않았습니다.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10001": "UUID [uuid:%s] 및 이름 [name:%s]인 이미지가 모든 백업 스토리지에서 삭제되었습니다.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10004": "리소스 바인딩은 아직 type %s를 지원하지 않습니다", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10003": "이미지[%s]가 있는 백업 스토리지에 연결된 zones[uuids:%s]에서 호스트를 찾을 수 없습니다.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10005": "바인딩된 리소스 %s를 가진 사용 가능한 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_L2_10011": "지원되지 않는 l2Network 유형[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10003": "가상 라우터[uuid:%s, ip:%s]가 L3 네트워크[uuid:%s, name:%s]에 대한 DNS%s 구성에 실패했습니다, %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10008": "이미지[uuid:%s]가 기본 스토리지[uuid:%s]와의 상호작용이 필요한 백업 스토리지[uuid:%s, type:%s]에 있지만, 이 상호작용을 촉진할 적합한 호스트를 찾을 수 없습니다.", + "ORG_ZSTACK_NETWORK_L2_10010": "l2Network[uuid:%s]가 클러스터[uuid:%s]에 연결되어 있지 않습니다", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10007": "이미지[uuid:%s, name:%s]가 %s 유형의 기본 스토리지를 필요로 하는 백업 스토리지[uuid:%s, type:%s]에 저장되어 있지만, 호환 가능한 기본 스토리지를 가진 호스트를 찾을 수 없습니다.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10068": "이미지 메타데이터 파일 확인: %s 실패", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10066": "이미지 메타데이터 파일 생성: %s 실패", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10065": "이미지 메타데이터 동기화 생성 실패: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10022": "인스턴스[uuid:%s]의 루트 볼륨을 찾을 수 없습니다", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10021": "CPU[%s], 메모리[%s 바이트]를 사용 가능한 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10000": "네트워크 인터페이스 [uuid:%s]에 게이트웨이가 없어 EIP를 연결할 수 없습니다", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10062": "재해 복구 BS에서 AddImage가 금지되어 있습니다: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10001": "VIP의 L3Network가 기반하는 L2Network가 vmNic[uuid:%s]이 있는 클러스터에 연결되지 않았습니다", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10002": "플랫 유형의 VM NIC(UUID:%s)에 1개 이상의 EIP를 연결할 수 없습니다", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10060": "인스턴스[%s]에 이미지 경로가 없습니다", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10015": "사용 가능한 기본 저장소를 찾을 수 없습니다 [상태: %s, 상태: %s, 사용 가능한 용량 %d 바이트]. 기본 저장소의 상태를 확인하고 클러스터에 연결되어 있는지 확인하십시오", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10014": "기본 저장소 %s에 연결된 클러스터에서 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10016": "사용 가능한 기본 저장소를 찾을 수 없습니다 [상태: %s 또는 %s, 상태: %s]. 기본 저장소의 상태를 확인하고 클러스터에 연결되어 있는지 확인하십시오", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10031": "[%s] 후보 호스트에서 하이퍼바이저 유형 [%s]을 가진 활성화된 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10030": "[%s] 후보 호스트 목록에서 활성화된 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10033": "상태=활성화 및 상태=연결된 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10032": "상태=활성화 상태=연결 하이퍼바이저Type=%s인 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10012": "버킷 %s에서 %s 객체를 찾을 수 없습니다", + "ORG_ZSTACK_UTILS_10000": "가상 머신 인스턴스 %s의 액세스 시크릿 생성 실패", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10024": "볼륨 UUID 또는 볼륨 스냅샷 UUID를 지정해야 합니다", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10023": "VM[UUID:%s]의 볼륨이 있는 기본 저장소 %s에 연결된 클러스터에서 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10026": "회피할 호스트를 제외한 후 풀에 후보가 남아 있지 않습니다", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10025": "zoneUuids, clusterUuids, hostUuids는 각각 비어 있지 않은 리스트를 하나 이상 포함하거나 모든 값을 true로 설정해야 합니다", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10015": "Aliyun EBS 백업 저장소는 이미지 해시 계산을 지원하지 않습니다", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10027": "연결된 L3Networks가 있는 L2Networks에 연결된 클러스터에서 호스트를 찾을 수 없습니다%s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10029": "[%s] 후보 호스트에서 연결된 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10005": "로드 밸런싱 전략을 선택하려면 알고리즘 유형을 설정해야 합니다", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10008": "가상 머신이 %s개 미만인 호스트를 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10022": "계정 [UUID:%s]이(가) 리소스 [UUID:%s, type:L3NetworkVO]에 대한 액세스 권한이 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10024": "DHCP 서버 IP를 [%s](으)로 변경하지만 [%s]를(을) 받았습니다", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10025": "L3 네트워크 UUID는 null일 수 없습니다", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10003": "클라우드 제공자 설정이 잘못되었습니다. 유효한 값은 %s입니다", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10021": "세션/계정 UUID가 잘못되었습니다. 확인 후 다시 시도하십시오", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10000": "Alibaba Cloud EBS 백업 저장소에 Ocean 엔드포인트 URL을 구성해야 합니다", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10017": "VM에 EIP 작업을 적용할 수 없습니다[uuid:%s, state:%s]. hostUUID를 찾을 수 없습니다.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10009": "Aliyun EBS 백업 스토리지는 이미지 다운로드 프로세스 취소를 지원하지 않습니다.", + "ORG_ZSTACK_CORE_TIMEOUT_10000": "api timeout은 %s 밀리초보다 작게 설정할 수 없습니다.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10002": "OSS 버킷 [%s]을(를) 삭제할 수 없습니다. 여전히 Aliyun EBS 백업 스토리지 인스턴스가 포함되어 있습니다. 먼저 모든 관련 백업 스토리지 인스턴스가 삭제되었는지 확인하세요.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10004": "현재 기본 스토리지가 지정된 프로토콜 유형을 지원하지 않습니다. 먼저 프로토콜이 스토리지에 추가되었는지 확인하세요.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10003": "[protocol] 매개변수가 null입니다. [%s] 유형의 기본 스토리지에 대해 블록 볼륨 프로토콜을 지정해야 합니다.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10000": "클라우드 리소스 경로 오류: 파일 위치 및 존재 여부를 확인하세요.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10002": "이름: [%s]이(가) 이미 존재합니다. 블록 볼륨 이름은 기본 스토리지 유형 [%s] 내에서 고유해야 합니다.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10010": "레이어 3 네트워크에 대한 DHCPv6 서버 IP를 검색할 수 없습니다[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10009": "레이어 3 네트워크에 대한 DHCPv4 서버 IP를 검색할 수 없습니다[uuid:%s]", + "ORG_ZSTACK_POLICYROUTE_10029": "시스템 정책 라우팅 테이블을 삭제할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10005": "호스트가 프로비저닝되지 않았습니다[uuid:%s]", + "ORG_ZSTACK_POLICYROUTE_10027": "시스템 정의 정책 라우팅 세트를 삭제할 수 없습니다. 삭제하기 전에 이 라우팅 세트가 활성 리소스에서 사용되고 있지 않은지 확인하세요.", + "ORG_ZSTACK_POLICYROUTE_10028": "연결된 가상 라우터 인스턴스를 찾을 수 없습니다. 가상 라우터가 올바르게 구성되어 사용 가능한지 확인하세요.", + "ORG_ZSTACK_POLICYROUTE_10025": "ruleSet[%s]이(가) 네트워크 인터페이스 카드(NIC)에 여전히 연결되어 있습니다.", + "ORG_ZSTACK_POLICYROUTE_10020": "VRouter[%s]에 이미 정책 기반 라우팅 테이블 [%s]이(가) 있습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10044": "플랫 DHCP가 활성화된 경우에만 DHCP 서버 IP를 수정할 수 있습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10045": "%s가 레이어 3 네트워크의 소유자가 아니기 때문에 DHCP 서버 IP를 수정할 수 없습니다[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10046": "IPv4 주소 범위가 구성되지 않았기 때문에 DHCPv4 서버 IP를 변경할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10047": "제공된 IP [%s]가 L3 네트워크 [%s]에 대한 유효한 CIDR이 아니기 때문에 DHCP v4 서버 IP를 설정할 수 없습니다.", + "ORG_ZSTACK_IDENTITY_RBAC_10011": "작업[API:%s]이(가) 보안상의 이유로 기본적으로 거부됩니다. 이 문제를 해결하려면 관리자에게 문의하세요.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10041": "IPv6 범위가 구성되지 않았기 때문에 DHCPv6 서버 IP를 설정할 수 없습니다.", + "ORG_ZSTACK_IDENTITY_RBAC_10012": "작업이 정책[name: %s uuid: %s]에 의해 거부되었습니다.", + "ORG_ZSTACK_IDENTITY_RBAC_10013": "작업이 정책[name:%s, uuid:%s]에 의해 거부되었습니다. 필드[%s]을(를) 수정할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10037": "IP 주소를 삭제할 수 없습니다. IP [%s]가 DHCP 서버 IP 주소입니다.", + "ORG_ZSTACK_POLICYROUTE_10018": "시스템 정책 라우팅 세트를 업데이트할 수 있습니다. 필요한 권한이 있는지 확인하고 다시 시도하세요.", + "ORG_ZSTACK_POLICYROUTE_10019": "시스템 정책 기반 라우팅 테이블을 업데이트할 수 없습니다. 필요한 권한이 있는지 확인하고 다시 시도하세요.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10039": "IPv4 주소 범위가 구성되지 않았기 때문에 DHCPv4 서버 IP를 설정할 수 있습니다.", + "ORG_ZSTACK_POLICYROUTE_10017": "연결된 가상 라우터를 찾을 수 없습니다.", + "ORG_ZSTACK_POLICYROUTE_10014": "잘못된 프로토콜 유형 %s", + "ORG_ZSTACK_POLICYROUTE_10015": "RuleSet[%s]에 이미 번호가 %s인 규칙이 포함되어 있습니다.", + "ORG_ZSTACK_POLICYROUTE_10013": "작업 실패, IP 형식은 IPv4/IP 범위/CIDR만 지원하지만 %s를 찾았습니다", + "ORG_ZSTACK_POLICYROUTE_10010": "NextHopIp는 IPv4 형식이어야 하지만 [%s]를 찾았습니다", + "ORG_ZSTACK_CORE_REST_10012": "%sms 내에 %s를 검색할 수 없습니다", + "ORG_ZSTACK_QUERY_10021": "필드[%s]는 인벤토리 %s의 기본 요소가 아닙니다; 'fields' 매개변수에 지정할 수 없습니다; 유효한 필드는 %s입니다", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10034": "DHCP 서버 IP [%s]가 이미 L3 네트워크 [%s]에 존재합니다", + "ORG_ZSTACK_QUERY_10020": "엔티티 메타데이터 클래스[%s]에 필드[%s]가 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10035": "DHCP 서버 IP [%s]는 게이트웨이 IP와 같지 않아야 합니다", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10036": "DHCP 서버 IP [%s]를 시스템 L3 네트워크 설정에 구성할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10030": "DHCP 서버 IP 주소 [%s]는 유효한 IPv4 주소가 아닙니다", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10031": "DHCP 서버 IP [%s]가 지정된 CIDR [%s] 내에 있지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10032": "DHCP 서버 IP [%s]는 유효한 IPv6 주소가 아닙니다", + "ORG_ZSTACK_IDENTITY_RBAC_10004": "시스템 또는 사전 정의된 역할을 업데이트할 권한이 없습니다. 도움이 필요하시면 관리자에게 문의하십시오.", + "ORG_ZSTACK_POLICYROUTE_10009": "DestinationCidr은 CIDR 형식이어야 하지만 [%s]를 찾았습니다", + "ORG_ZSTACK_IDENTITY_RBAC_10007": "권한이 거부되었습니다, 계정 [uuid:%s]이(가) 리소스 [uuid:%s, type:%s]에 액세스할 권한이 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10027": "대상 호스트 [uuid:%s]에서 가상 머신 [uuid:%s]에 DHCP를 구성할 수 없습니다", + "ORG_ZSTACK_IDENTITY_RBAC_10008": "권한이 거부되었습니다, 계정 [uuid:%s]이(가) 태그된 리소스 [uuid:%s, type:%s]를 관리할 권한이 없습니다", + "ORG_ZSTACK_POLICYROUTE_10008": "VRouter[%s]에 이미 %s라는 규칙 세트가 있습니다", + "ORG_ZSTACK_IDENTITY_RBAC_10005": "시스템 또는 사전 정의된 역할을 삭제할 권한이 없습니다. 도움이 필요하시면 관리자에게 문의하십시오.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10029": "플랫 네트워크의 최소 IP 범위 접두사 길이는 %d입니다", + "ORG_ZSTACK_POLICYROUTE_10003": "l3[%s]에 이미 연결된 정책 경로 규칙 세트가 있습니다", + "ORG_ZSTACK_IDENTITY_RBAC_10009": "계정 [UUID:%s]이(가) 리소스 [UUID:%s, Type:%s]에 대한 액세스 권한이 없습니다", + "ORG_ZSTACK_POLICYROUTE_10000": "시스템 정책 경로가 활성화된 경우 기본 경로 네트워크를 수정할 수 없습니다.", + "ORG_ZSTACK_QUERY_10018": "조건 이름[%s]이(가)无效합니다, 인벤토리 클래스[%s]에서 해당 필드를 찾을 수 없습니다", + "ORG_ZSTACK_QUERY_10017": "클라우드 리소스 필터링을 위해 쿼리 조건 %s의 \"value\"는 null일 수 없습니다", + "ORG_ZSTACK_QUERY_10015": "filterName은 [filterType:condition(s)] 형식이어야 합니다", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_10000": "ocean API 서명 문자열 생성 실패: %s", + "ORG_ZSTACK_QUERY_10019": "조건 이름[%s]이(가)无效합니다: 인벤토리[%s]의 필드[%s]이(가) @UnqueryableField로 주석 처리되어 있습니다", + "ORG_ZSTACK_ALIYUN_PANGU_10001": "appName: %s, partitionName: %s이(가) identityZone: %s에 이미 존재합니다", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10050": "DHCP 서버 IP를 설정할 수 없습니다, IP[%s]가 할당되었습니다", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10051": "DHCPv6 서버 IP를 설정할 수 없습니다. IP[%s]가 사용 중이기 때문입니다.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10053": "DHCP 서버 IP 할당 실패.%s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10048": "IPv6 범위가 구성되지 않아 DHCPv6 서버 IP를 변경할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10049": "IP[%s]가 L3 네트워크 [%s]에 대한 유효한 CIDR이 아니므로 DHCPv6 서버 IP를 설정할 수 없습니다.", + "ORG_ZSTACK_USBDEVICE_10026": "VM[%s]에서 모든 USB 장치의 마운트를 해제하고 다시 시도하십시오.", + "ORG_ZSTACK_USBDEVICE_10025": "VM 인스턴스에 연결된 USB 장치[uuid:%s]의 연결을 해제할 수 없습니다.", + "ORG_ZSTACK_USBDEVICE_10024": "VM 인스턴스[uuid:%s]가 USB 장치 %s를 연결할 수 있는 상태가 아닙니다.", + "ORG_ZSTACK_USBDEVICE_10023": "USB 장치[uuid:%s]가 연결된 VM 인스턴스가 연결을 해제할 수 있는 상태가 아닙니다: %s", + "ORG_ZSTACK_USBDEVICE_10022": "USB 장치[UUID:%s]가 어떤 가상 머신 인스턴스에도 연결되어 있지 않습니다.", + "ORG_ZSTACK_USBDEVICE_10021": "USB 장치[uuid:%s]가 연결된 호스트가 유효한 상태 [%s] 또는 상태 [%s]에 있지 않습니다.", + "ORG_ZSTACK_USBDEVICE_10020": "VM 인스턴스[UUID:%s]가 USB 장치를 연결할 수 있는 상태가 아닙니다: %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10005": "L3 네트워크[uuid:%s]가 존재하지 않습니다", + "ORG_ZSTACK_COMPUTE_SRIOV_10006": "호스트 [uuid:%s]의 l3Network [uuid:%s]에 SRIOV 장치가 없기 때문에 %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10007": "VF NIC [UUID:%s]가 존재하지 않아 VF NIC HA 상태를 변경할 수 없습니다.", + "ORG_ZSTACK_COMPUTE_SRIOV_10008": "고가용성 상태[%s]가 유효하지 않아 가상 네트워크 인터페이스 카드의 고가용성 상태를 변경할 수 없습니다.", + "ORG_ZSTACK_COMPUTE_SRIOV_10009": "L2 네트워크[UUID:%s]를 찾을 수 없습니다.", + "ORG_ZSTACK_COMPUTE_SRIOV_10000": "호스트[uuid:%s, ip:%s]에서 VF NIC MAC을 설정하지 못했습니다. 이유: %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10001": "가상 네트워크 인터페이스 카드 HA 상태를 변경하지 못했습니다. 오류: %s", + "ORG_ZSTACK_DRS_10000": "클러스터[%s]가 데이터 복제 서비스를 시작했습니다.", + "ORG_ZSTACK_DRS_10002": "임계값이 비어 있을 수 없습니다. 임계값 설정이 올바르게 구성되어 있는지 확인하십시오.", + "ORG_ZSTACK_DRS_10001": "이 가상 머신에 대해 DRS가 비활성화되었습니다. 리소스 할당을 최적화하려면 DRS가 활성화되어 있는지 확인하십시오.", + "ORG_ZSTACK_DRS_10004": "유효하지 않은 임계값 연산자[%s]", + "ORG_ZSTACK_DRS_10003": "유효하지 않은 임계값 이름[%s]", + "ORG_ZSTACK_DRS_10006": "유효하지 않은 임계값, 유효 범위: (0, 100]", + "ORG_ZSTACK_DRS_10005": "클라우드 리소스 모니터링의 임계값 값이 비어 있을 수 없습니다.%s", + "ORG_ZSTACK_DRS_10008": "DRG[%s] 상태는 %s입니다.", + "ORG_ZSTACK_DRS_10007": "GlobalConfig ENABLE_DRS가 비활성화되었습니다.", + "ORG_ZSTACK_DRS_10009": "DRS[%s] 자동화 수준이 수동 모드로 설정되어 있지 않습니다.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10012": "값[%s]이(가) 유효한 정수가 아닙니다.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10018": "API 작업을 실행할 수 없습니다. 백엔드 네트워크[UUID:%s]가 VPC 라우터[UUID:%s]에 연결되어 있지만 프론트 네트워크[UUID:%s]에 연결되어 있지 않습니다.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10011": "유효하지 않은 인자[limit:%s], 음수 값은 사용할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10019": "백엔드 네트워크[UUID:%s]는 다른 백엔드 네트워크가 VPC 네트워크로 구성되어 있으므로 VPC 네트워크여야 합니다.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10010": "알 수 없는 인자[%s]", + "ORG_ZSTACK_DRS_10020": "VM 마이그레이션 중에는 DRS 삭제가 허용되지 않습니다.", + "ORG_ZSTACK_DRS_10011": "성공적으로 실행되었습니다. 반복 배포는 허용되지 않습니다.", + "ORG_ZSTACK_DRS_10010": "advice[%s]가 비활성화로 인해 만료되었습니다", + "ORG_ZSTACK_DRS_10013": "VM[%s]이(가) 실행 상태가 아닙니다", + "ORG_ZSTACK_DRS_10012": "VM[%s]이(가) 종료되었습니다", + "ORG_ZSTACK_DRS_10015": "클러스터[%s]는 동적 리소스 확장을 지원하지 않습니다.", + "ORG_ZSTACK_DRS_10014": "VM[%s]이(가) 더 이상 원본 호스트[%s]에 없습니다.", + "ORG_ZSTACK_DRS_10017": "호스트 UUID 목록이 비어 있습니다. 최소 하나 이상의 호스트 UUID가 제공되었는지 확인하십시오.", + "ORG_ZSTACK_DRS_10016": "DRDS 인스턴스를 생성할 수 없습니다, %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10013": "백엔드 네트워크[uuid:%s]는 프론트 Layer 3 네트워크가 VPC 네트워크이므로 VPC 네트워크여야 합니다.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10005": "유효하지 않은 인자[start:%s], 클라우드 컴퓨팅 환경에서는 음수 값이 될 수 없습니다", + "ORG_ZSTACK_DRS_10019": "작업 스케줄링 중에는 advice가 허용되지 않습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10014": "API 작업을 실행할 수 없습니다. 백엔드 네트워크[UUID:%s]가 VPC 라우터에 연결되어 있지 않습니다. 다시 시도하기 전에 네트워크가 올바르게 연결되었는지 확인하십시오.", + "ORG_ZSTACK_DRS_10018": "호스트 활용률 데이터 쿼리 실패", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10015": "백엔드 네트워크가 VPC 라우터[uuid:%s]와 연결되어 있는 반면 프론트엔드 네트워크는 다른 VPC 라우터[uuid:%s]와 연결되어 있습니다. 두 네트워크가 모두 동일한 VPC 라우터와 연결되어 있는지 확인하십시오.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10016": "API 작업을 실행할 수 없습니다. 백엔드 네트워크[uuid:%s]는 프론트 L3 네트워크가 프라이빗 플랫 네트워크이므로 프라이빗 플랫 네트워크여야 합니다.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10002": "알 수 없는 함수[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10010": "백엔드 네트워크 CIDR가 프론트 L3 네트워크 CIDR와重叠됩니다", + "ORG_ZSTACK_ZWATCH_FUNCTION_10008": "클라우드 컴퓨팅 환경 구성에서 인자[%s]에 대한 유효하지 않은 값[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10011": "백엔드 네트워크 CIDR [%s]가 관리 L3 네트워크 CIDR [%s]와 overlapping됩니다. 구성 충돌을 방지하기 위해 네트워크 CIDR 사이에 겹침이 없는지 확인하십시오. 백엔드 네트워크 UUID [%s]와 관리 L3 네트워크 UUID [%s]가 영향을 받습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10012": "API 작업을 실행할 수 없습니다. 프론트엔드 네트워크[UUID:%s]가 VPC 라우터에 연결되어 있지 않습니다", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10001": "관련 OSD 그룹을 찾을 수 없습니다 CEPH 풀 [%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10000": "필요한 Ceph 풀[uuid:%s]이(가) 조건[availableSize > %d 바이트]을(를) 충족할 수 없습니다, 현재 사용 가능한 크기 %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10006": "이미지[uuid:%s]가 삭제되었기 때문에 SLB 인스턴스를 생성할 수 없습니다", + "ORG_ZSTACK_ZWATCH_FUNCTION_10001": "중복된 인자[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10007": "최대 인스턴스 제한에 도달하여 SLB 인스턴스 생성에 실패했습니다.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10000": "클라우드 인스턴스 구성에 필요한 인자[%s]가 누락되었습니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10008": "front L3 네트워크 유형 %s이(가) 잘못되어 SLB 그룹을 생성할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10009": "프론트 네트워크 CIDR [%s]이(가) 관리 L3 네트워크 CIDR [%s]과(와) 겹칩니다", + "ORG_ZSTACK_DRS_10022": "가상 머신 마이그레이션 중에는 스케줄링이 허용되지 않습니다", + "ORG_ZSTACK_DRS_10023": "호스트 CPU 및 메모리 사용량 데이터가 부족합니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10002": "클라우드에서 VIP[%s]을(를) 삭제할 수 없습니다. 먼저 SLB[uuid:%s]이(가) 삭제되었는지 확인하세요", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10003": "로드 밸런서 SLB 그룹 [uuid:%s]이(가) 없어 SLB 인스턴스를 생성할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10004": "SLB 그룹 [uuid:%s]에 대해 구성된 SLB 오퍼링이 없어 SLB 인스턴스를 생성할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10005": "SLB 오퍼링 [uuid:%s]의 이미지 UUID가 null이어서 SLB 인스턴스를 생성할 수 없습니다", + "ORG_ZSTACK_CORE_ENCRYPT_10000": "암호화 오류: %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10000": "SLB 그룹 프론트 L3 네트워크 [uuid:%s]에 연결된 SLB 인스턴스 [uuid:%s]의 네트워크 인터페이스를 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10001": "IP 범위 [%s]을(를) 삭제할 수 없습니다. 먼저 로드 밸런서 [uuid:%s]을(를) 삭제하세요", + "ORG_ZSTACK_IDENTITY_10011": "이전 비밀번호가 원래 비밀번호와 일치하지 않습니다. 사용자[%s]의 비밀번호를 업데이트할 수 없습니다", + "ORG_ZSTACK_IDENTITY_10010": "UUID [%s]인 사용자는 UUID [%s]인 계정과 연결되어 있지 않습니다", + "ORG_ZSTACK_IDENTITY_10016": "계정[uuid:%s]의 할당량[name:%s]을(를) %d(으)로 설정할 수 없습니다", + "ORG_ZSTACK_IDENTITY_10017": "계정[UUID:%s]이(가) 사용한 [Name:%s, 사용량 값:%s]이(가) 요청 할당량을 초과합니다: %d", + "ORG_ZSTACK_IDENTITY_10001": "인증 자격 증명이 잘못되었습니다. 비밀번호를 확인하고 다시 시도하세요", + "ORG_ZSTACK_IDENTITY_10009": "계정[UUID: %s]이(가) 리소스[UUID: %s]에 대한 액세스 권한이 없습니다", + "ORG_ZSTACK_IDENTITY_10008": "UUID [%s]인 사용자 그룹은 UUID [%s]인 계정에 속하지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10003": "%s로 인해 VIP%s을(를) 해제하지 못했습니다", + "ORG_ZSTACK_OBSERVABILITYSERVER_10009": "서비스[uuid: %s]이(가) 이미 관측성 서버에 바인딩되어 있습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10002": "NIC[uuid: %s, ip: %s] 연결을 위해 가상 라우터[uuid:%s]에서 VIP[ips: %s]을(를) 동기화하지 못했습니다. 원인: %s", + "ORG_ZSTACK_OVF_10025": "%s 상태의 가상 머신만 내보낼 수 있습니다", + "ORG_ZSTACK_OVF_10026": "APICreateVmInstanceFromOvfMsg의 jsonCreateVmParam을 파싱하지 못했습니다. 요청 매개변수가 잘못되었습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10006": "영역[uuid:%s]의 L3네트워크[uuid:%s]에 대한 가상 라우터 오퍼링[uuid:%s]을(를) 찾았지만, 네트워크의 공용 IP 네트워크[uuid:%s]가 VIP[uuid:%s]과(와) 일치하지 않습니다. 시스템 태그 guestL3Network::l3NetworkUuid를 사용하여 특정 가상 라우터 오퍼링을 지정해야 할 수 있습니다", + "ORG_ZSTACK_OVF_10023": "VM 내보내기에는 ImageStore 백업 스토리지가 필요하지만, 지정된 backupStorageUuid: %s은(는) ImageStore 백업 스토리지가 아닙니다", + "ORG_ZSTACK_OBSERVABILITYSERVER_10006": "UUID: %s인 관측성 서버가 활성화되어 있지 않습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10005": "가상 라우터[uuid:%s, 상태:%s]이(가) 활성화되어 있지 않습니다", + "ORG_ZSTACK_OVF_10024": "UUID: %s인 내보내기 대상 가상 머신을 찾을 수 없습니다", + "ORG_ZSTACK_OBSERVABILITYSERVER_10007": "관측성 서버 오퍼링[UUID: %s]의 이미지가 누락되었습니다", + "ORG_ZSTACK_OVF_10021": "OVF에서 VM을 생성하지 못했습니다. 가상 머미신의 루트 디스크를 찾을 수 없습니다. 필요한 디스크가 올바르게 구성되어 있는지 확인하세요", + "ORG_ZSTACK_OVF_10022": "VM[UUID: %s]이(가) 이미 OVA 패키지[UUID: %s]로 내보내져 있습니다. 패키지를 삭제하고 다시 시도하세요.", + "ORG_ZSTACK_KVM_XMLHOOK_10001": "xml hook with UUID %s이(가) 성공적으로 업데이트되었지만, VM with UUID %s을(를) 재시작하지 못했습니다. 세부 정보: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10003": "서비스: %s, 유형: %s에 대한 가상 라우터를 찾을 수 없습니다", + "ORG_ZSTACK_OBSERVABILITYSERVER_10010": "observability 서버 with UUID: %s이(가) 작동 중이 아닙니다. 서비스를 연결할 수 없습니다", + "ORG_ZSTACK_OVF_10018": "가상 머신 %s의 OVF 파일을 읽지 못했습니다. 파일 경로와 권한을 확인하세요.", + "ORG_ZSTACK_OVF_10017": "가상 머신 리포지토리에서 ova 패키지[uuid: %s]을(를) 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10057": "로드 밸런서[uuid:%s,type:%s]의 SLB 그룹 UUID를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_FILESYSTEM_10000": "호스트[uuid:%s]의ハートби트가最近更新されていません", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_HA_10000": "HA 그룹 확장 포인트가 초기화되지 않았습니다", + "ORG_ZSTACK_OVF_10030": "장기 작업[uuid:%s] 실행 실패", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10040": "l3 네트워크[uuid:%s]가다른 VPC 라우터에 연결되어 있어 VMNIC를 로드 밸런서 서버 그룹에 추가할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10041": "L3 네트워크가 SLB 인스턴스에 연결되어 있지 않아 VMNIC를 로드 밸런서 서버 그룹에 추가할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10046": "SLB 그룹에 대해 다른 인스턴스[UUID: %s, name: %s]가 이미 존재하므로 SLB 인스턴스를 생성할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10047": "SLB 그룹에 대해 이미 두 개의 인스턴스가 생성되었으므로 SLB 인스턴스를 생성할 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10001": "NFS 스토리지[uuid:%s, path:%s]에서 이미지 스토어[hostname:%s]로 비트 업로드 실패, %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10042": "잘못된 모니터 IP %s로 인해 SLB 그룹 모니터 IP를 변경할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10043": "인스턴스 상태[%s]가 중지되지 않아 SLB 그룹[uuid:%s]을(를) 고가용성 모드로 전환할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10044": "가상 라우터[UUID:%s]에서 VIP를 생성하지 못했습니다%s. %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10000": "이미지 스토어 백업 스토리지[hostname:%s, path: %s]에서 NFS 기본 스토리지[uuid:%s, path:%s]로 비트 다운로드 실패, %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10045": "SLB 인스턴스[uuid:%s]에 대한 어피니티 그룹 생성 실패", + "ORG_ZSTACK_IAM2_API_10011": "속성[uuid:%s]이(가) 정의된 그룹과 연결되지 않았습니다", + "ORG_ZSTACK_IAM2_API_10012": "속성[uuid:%s]이(가) 어떤 조직과도 연결되지 않았습니다", + "ORG_ZSTACK_IAM2_API_10013": "속성[uuid:%s]이(가) 어떤 프로젝트와도 연결되지 않았습니다", + "ORG_ZSTACK_IAM2_API_10014": "속성[uuid:%s]이(가) 어떤 가상 인스턴스 ID와도 연결되지 않았습니다", + "ORG_ZSTACK_IAM2_API_10015": "프로젝트를 퇴직 상태에서 빼내기 전에 퇴직 정책을 삭제해야 합니다.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10039": "l3 네트워크[uuid:%s]가 VPC 라우터에 연결되어 있어 VMNIC를 로드 밸런서 서버 그룹에 추가할 수 없습니다", + "ORG_ZSTACK_IAM2_API_10016": "프로젝트가 %s 상태에 있어 로그인이 금지됩니다", + "ORG_ZSTACK_IAM2_API_10017": "할당량[name:%s]이(가) 존재하지 않습니다", + "ORG_ZSTACK_IAM2_API_10018": "컨테이너의 CPU 제한(%s)이 요청된 CPU 양(%s)보다 커야 합니다.", + "ORG_ZSTACK_IAM2_API_10019": "컨테이너의 메모리 크기 제한이 요청된 메모리 크기보다 커야 합니다.", + "ORG_ZSTACK_OVF_10003": "볼륨 관리 컨트롤러를 찾을 수 없습니다. 볼륨 관리 서비스가 올바르게 구성되어 실행 중인지 확인하십시오.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10007": "Vip [uuid: %s]에 대한 VipQoS가 존재하지 않습니다", + "ORG_ZSTACK_OVF_10004": "CD 드라이버 컨트롤러를 찾을 수 없습니다. 인스턴스에 필요한 가상화 드라이버가 설치되어 구성되어 있는지 확인하십시오.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10008": "가상 IP [uuid: %s]의 서비스 품질(QoS)을 삭제할 수 없습니다. VPC 공유 서비스 품질과 연결되어 있습니다.", + "ORG_ZSTACK_OVF_10001": "잘못된 디스크 용량 사양: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10005": "VIP [UUID: %s]의 서비스 품질(QoS)을 설정할 수 없습니다. VpcSharedQos에 연결되어 있습니다.", + "ORG_ZSTACK_OVF_10002": "잘못된 디스크 프로비저닝 크기: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10006": "VIP [uuid: %s] 포트 %s에 대한 VIP QoS가 존재하지 않습니다", + "ORG_ZSTACK_OVF_10000": "디스크 %s에 대한 디스크 참조를 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10009": "VIP [uuid:%s]에 대한 VIP QoS 백엔드를 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10010": "VpcSharedQos는 Bandwidth를 지정해야 합니다", + "ORG_ZSTACK_IPSEC_10028": "L3 네트워크 [%s]가 IPsec 터널 [UUID:%s]에 연결되어 있지 않습니다", + "ORG_ZSTACK_AUTOSCALING_10000": "로드 밸런서[%s]와 연결된 리스너에 대한 L3 네트워크 UUID[%s]가 잘못되었습니다. 모든 네트워크는 LB 서비스와 동일한 가상 라우터에 연결되어야 하고 동일한 VRouter 네트워크 구성의 일부여야 합니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10011": "VPC를 먼저 L3[%s]에 연결해야 합니다", + "ORG_ZSTACK_IPSEC_10029": "CIDR [%s]가 IPsec 구성 [UUID:%s]에 이미 포함되어 있습니다", + "ORG_ZSTACK_AUTOSCALING_10001": "AutoScalingGroup에서 오토스케일링 템플릿[%s]을 분리하지 못했습니다, 오류: %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10030": "잘못된 IPv6 접두사 [%s] 형식으로 인해 L3 네트워크 UUID [%s]를 SLB 인스턴스에 연결할 수 없습니다", + "ORG_ZSTACK_AUTOSCALING_10003": "UUID: %s인 리스너가 오토스케일링 VM 템플릿[%s]에서 사용 중이므로 삭제할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10014": "VpcSharedQos는 이미 다른 VpcSharedQos에 연결된 이 VIP를 연결할 수 없습니다", + "ORG_ZSTACK_IPSEC_10025": "L3 네트워크 [%s]를 IPsec [UUID:%s]에 여러 번 연결할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10012": "AttachVipToVpcSharedQos 매개변수는 VipUuids 또는 VipLists를 지정해야 합니다", + "ORG_ZSTACK_IPSEC_10026": "APIAttachL3NetworksToIPsecConnectionMsg에 Layer 3 네트워크를 포함해야 합니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10013": "VpcSharedQos는 이 VIP를 연결할 수 없습니다. VIP[%s]가 L3 네트워크[%s] 내에 없기 때문입니다.", + "ORG_ZSTACK_IPSEC_10027": "L3 네트워크 [%s]는 VPC 네트워크가 아니므로 IPsec에 연결하거나 분리할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10035": "VIP [uuid:%s]가 이미 다른 네트워크 서비스 [%s]와 연결되어 있어 로드 밸런서를 생성할 수 없습니다", + "ORG_ZSTACK_IPSEC_10020": "피어 주소[%s]가 유효한 IPv4 주소가 아닙니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10036": "VIP [uuid:%s]가 이미 VPC 라우터 [%s]에 연결되어 있어 로드 밸런서를 생성할 수 없습니다", + "ORG_ZSTACK_IPSEC_10021": "인증 키는 공백이나 %s와 같은 특수 문자를 포함하지 않아야 합니다.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10037": "잘못된 SLB 그룹 [uuid:%s]으로 인해 로드 밸런서를 생성할 수 없습니다", + "ORG_ZSTACK_IPSEC_10022": "IPsec VIP [%s]는 공용 주소 풀 유형과 연결된 CIDR 범위의 첫 번째나 마지막 IP 주소가 아니어야 합니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10038": "백엔드 서버 NIC를 서버 그룹[uuid:%s]에 추가할 수 없습니다. NIC UUID가 null이기 때문입니다.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10031": "IP 주소와 접두사가 시스템 태그에 지정되어야 하므로, UUID [%s]인 L3 네트워크를 SLB 인스턴스에 연결할 수 없습니다.", + "ORG_ZSTACK_AUTOSCALING_10004": "인스턴스가 스케일링 그룹 내에 존재하지 않습니다. 인스턴스 ID와 스케일링 그룹 이름[%s]을 확인해 주세요.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10032": "프론트엔드 L3 네트워크[uuid:%s]를 SLB 인스턴스에서 분리할 수 없습니다.", + "ORG_ZSTACK_AUTOSCALING_10005": "UUID:%s인 알람이 autoScalingGroup[%s]과 연결되어 있어 삭제할 수 없습니다.", + "ORG_ZSTACK_IAM2_API_10020": "조직[uuid:%s]은(는) 클라우드 테넌트이며 상위 조직을 가질 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10033": "관리 L3 네트워크[uuid:%s]를 SLB 인스턴스에서 분리할 수 없습니다.", + "ORG_ZSTACK_AUTOSCALING_10006": "규칙[%s]이(가) 비활성화되어 있습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10034": "마지막 백엔드 레이어 3 네트워크 인터페이스이므로, NIC [uuid:%s]를 SLB 인스턴스에서 분리할 수 없습니다.", + "ORG_ZSTACK_IAM2_API_10021": "상위 조직 [uuid:%s]은(는) 중첩된 조직 구조 내에서 하위 조직 [uuid:%s]이(가) 될 수 없습니다.", + "ORG_ZSTACK_IAM2_API_10022": "가상 머신 ID 이름[%s]이(가) 중복됩니다.", + "ORG_ZSTACK_IAM2_API_10023": "가상 환경 이름[%s]이(가) 중복됩니다.", + "ORG_ZSTACK_IAM2_API_10024": "프로젝트 이름[%s]이(가) 유효하지 않습니다. 동일한 이름의 프로젝트가 이미 존재합니다.", + "ORG_ZSTACK_IAM2_API_10025": "IAM2OrganizationVO[uuid:%s]이(가) 존재하지 않습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10028": "IP 주소와 넷마스크가 시스템 태그에 지정되어야 하므로, UUID [%s]인 L3 네트워크를 SLB 인스턴스에 연결할 수 없습니다.", + "ORG_ZSTACK_IAM2_API_10026": "프로젝트[UUID=%s]가(이) 조직[UUID=%s]과(와) 연결되어 있습니다.", + "ORG_ZSTACK_OBSERVABILITYSERVER_10019": "클라우드 환경에서 유효한 스케줄링을 위해 시작 시간이 종료 시간보다 작아야 합니다.", + "ORG_ZSTACK_IAM2_API_10027": "프로젝트[UUID=%s]가(이) 클라우드 환경과 연결되어 있지 않습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10029": "잘못된 IPv6 주소 형식[%s]으로 인해, UUID [%s]인 L3 네트워크를 SLB 인스턴스에 연결할 수 없습니다.", + "ORG_ZSTACK_IAM2_API_10028": "조직%s은(는) 다른 조직의 하위가 될 수 없습니다.", + "ORG_ZSTACK_IAM2_API_10029": "가상 ID [UUID: %s]이(가) 프로젝트 [UUID: %s]에 속하지 않습니다.", + "ORG_ZSTACK_OBSERVABILITYSERVER_10015": "ObservabilityServer 서비스 유형을 찾을 수 없습니다: %s", + "ORG_ZSTACK_OVF_10015": "백업 스토리지[UUID: %s]에 VM[UUID: %s]을(를) 내보내기 위한 충분한 가용 용량이 없습니다. 필요한 용량은: %d", + "ORG_ZSTACK_OBSERVABILITYSERVER_10016": "%s 유형의 서비스[uuid: %s]을(를) 관측 가능성 서버[uuid: %s]에서 분리할 수 없습니다. 이유: %s", + "ORG_ZSTACK_OVF_10012": "잘못된 CPU 'CoresPerSocket' 구성 값: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10017": "서비스[uuid: %s]가(이) 관측 가능성 서버[uuid: %s]과(와) 연결되어 있지 않습니다.", + "ORG_ZSTACK_OBSERVABILITYSERVER_10018": "클라우드 인스턴스 프로비저닝 기간에 대해 시작 시간과 종료 시간 모두 지정해야 합니다.", + "ORG_ZSTACK_OVF_10010": "가상 CPU 'VirtualQuantity'를 찾을 수 없습니다.", + "ORG_ZSTACK_OBSERVABILITYSERVER_10011": "관측 가능성 서버 인스턴스[uuid: %s]을(를) 찾을 수 없습니다.", + "ORG_ZSTACK_OVF_10011": "잘못된 CPU 'vCPU' 값: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10013": "서비스[uuid: %s](이)가 %s 유형이므로 관측성 서버[uuid: %s]에 연결할 수 없습니다: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10000": "IPv6용 VIP 서비스 품질(QoS)은 곧 구현될 예정입니다.", + "ORG_ZSTACK_ALIYUN_STORAGE_SNAPSHOT_10000": "ECS 인스턴스 상태가 실행 중이거나 중지된 경우에만 이 작업이 허용됩니다.", + "ORG_ZSTACK_OVF_10009": "CPU 'InstanceID'를 찾을 수 없습니다. 인스턴스 ID를 확인하고 CPU가 올바르게 할당되었는지 확인하십시오.", + "ORG_ZSTACK_OBSERVABILITYSERVER_10020": "잘못된 날짜-시간 형식입니다. 선택적 시간대 세부 정보가 포함된 ISO-8601 형식이 필요합니다: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10021": "관측성 서버[UUID: %s]가 활성화되지 않습니다; 서비스 데이터를 검색할 수 없습니다", + "ORG_ZSTACK_OVF_10007": "가상 메모리 'VirtualQuantity'를 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10003": "SetVipQos는 인바운드 대역폭 또는 아웃바운드 대역폭을 지정해야 합니다.", + "ORG_ZSTACK_OVF_10008": "잘못된 가상 머신 메모리 값: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10004": "이 가상 IP(VIP)에 대해 서비스 품질(QoS)을 설정할 수 없습니다. 모든 피어 레이어 3 네트워크가 VIP QoS 서비스를 제공하는 것이 아닙니다.", + "ORG_ZSTACK_OVF_10005": "이더넷 어댑터: %s가 네트워크에 연결되어 있지 않습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10001": "VIP [uuid: %s] 포트 %s에 대한 VIP QoS가 이미 존재합니다", + "ORG_ZSTACK_OVF_10006": "가상 머신 '%s'을(를) 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10002": "VIP [uuid: %s]에 대한 VIP 서비스 품질(QoS)이 이미 존재합니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10024": "잘못된 백엔드 인스턴스 유형 %s로 인해 SLB 그룹을 생성할 수 없었습니다", + "ORG_ZSTACK_IPSEC_10031": "IPsec [uuid:%s]이(가) 준비 상태가 아니므로 상태를 변경할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10025": "잘못된 모니터 IP %s로 인해 SLB 그룹을 생성할 수 없었습니다", + "ORG_ZSTACK_IPSEC_10032": "이 IPsec 터널 [uuid:%s]을(를) 재연결할 수 없습니다. IPsec 버전을 업그레이드하십시오", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10026": "IPv4 주소 형식 [%s]이(가) 잘못되어 UUID [%s]인 L3 네트워크를 SLB 인스턴스에 연결할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10027": "IPv4 넷마스크 형식 오류 [%s]로 인해 UUID [%s]인 L3 네트워크를 SLB 인스턴스에 연결할 수 없습니다", + "ORG_ZSTACK_IAM2_API_10030": "불법 작업, Role[%s]을(를) 추가할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10021": "백엔드 네트워크 [UUID:%s]이(가) VPC 라우터 [UUID:%s]에 연결되어 있는 반면, 다른 백엔드 네트워크들은 VPC 라우터 [UUID:%s]에 연결되어 있습니다.", + "ORG_ZSTACK_IAM2_API_10031": "오래된 가상 머신 ID에서 작업을 수행할 수 없습니다: %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10022": "API 작업을 실행할 수 없습니다. 백엔드 네트워크 [uuid:%s]은(는) 다른 백엔드 네트워크들이 VPC 네트워크가 아니므로 VPC 네트워크일 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10023": "잘못된 배포 유형 %s로 인해 SLB 그룹을 생성할 수 없었습니다", + "ORG_ZSTACK_IPSEC_10030": "CIDR [%s]이(가) IPsec UUID [%s]의 정의된 CIDR 내에 있지 않습니다", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10026": "작업 오류: 클라우드 컴퓨팅 서비스에서 응답을 가져오지 못했습니다", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10028": "백업 스토리지에 스냅샷을 백업하는 것은 더 이상 사용되지 않는 기능이며 향후 클라우드 플랫폼 버전에서 제거될 예정입니다", + "ORG_ZSTACK_IAM2_API_10000": "속성 이름은 null일 수 없습니다, 값[%s]", + "ORG_ZSTACK_IAM2_API_10001": "속성 이름[%s]이(가) 최대 길이 2048자를 초과합니다", + "ORG_ZSTACK_IAM2_API_10002": "속성[name:%s] 값이 2048자의 최대 길이를 초과합니다", + "ORG_ZSTACK_IAM2_API_10003": "조직[UUID: %s]이(가) [이름: %s, 사용 값: %s]에 대해 요청된 제한을 초과했습니다", + "ORG_ZSTACK_IAM2_API_10005": "%s는 네트워크 트래픽 제어에 대한 유효한 값이 아닙니다. 유효한 값은 특정 IP 범위 간의 allow/reject입니다", + "ORG_ZSTACK_IAM2_API_10006": "기본 조직 단위[%s]은(는) 삭제할 수 없습니다", + "ORG_ZSTACK_IAM2_API_10007": "템플릿 식별자[%s]가 중복됩니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10018": "VpcSharedQos은(는) Vpc[%s]이(가) 연결되어 있지 않기 때문에 이 Vip를 분리할 수 없습니다", + "ORG_ZSTACK_IAM2_API_10009": "'admin' 사용자명은 클라우드 컴퓨팅 환경에서 관리자 권한을 나타내기 위해 예약되어 있습니다. 다른 이름을 선택해 주세요", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10016": "DetachVipFromVpcSharedQos 매개변수는 VipUuids 또는 VipLists를 지정해야 합니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10017": "VpcSharedQos은(는) Vip[%s]이(가) 연결되어 있지 않기 때문에 이 VIP를 분리할 수 없습니다", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10010": "Ceph 기본 저장소[uuid:%s]이(가) 삭제되거나 종료되었을 수 있습니다", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10013": "Ceph 기본 저장소[UUID: %s, 이름: %s]이(가) 사용할 수 없습니다. 하나의 모니터[UUID: %s]가 작업 실패[%s]를 보고했습니다", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10012": "동일한 FSID를 가진 다른 Ceph 기본 저장소가 있습니다. 동일한 Ceph 구성을 두 개의 다른 기본 저장소로 추가할 수 없습니다", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10015": "저장소 노드(%s)와 연결을 수립할 수 없습니다", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10017": "모니터 노드[ip:%s]가 현재 클러스터의 fsid[%s]와 다른 fsid[%s]를 반환합니다. 이 클러스터에 속하지 않는 모니터 노드를 실수로 추가하고 계십니까?", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10016": "Ceph 기반 기본 저장소 솔루션에 MON 노드를 추가할 수 없습니다", + "ORG_ZSTACK_IAM2_API_10010": "이름[%s]이(가) 유효하지 않습니다. 동일한 식별자를 가진 프로젝트 또는 계정이 이미 존재합니다", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10008": "Ceph 기본 저장소[UUID:%s]에 연결할 수 없습니다. 모든 Ceph 모니터 연결에 실패했습니다", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10007": "모든 모니터를 실행할 수 없습니다 HTTP 요청[%s]", + "ORG_ZSTACK_ZOPS_10009": "chrony 소스를 검색하지 못했습니다, 원인:%s", + "ORG_ZSTACK_ZOPS_10005": "%s이(가) %s에서 도달할 수 없습니다, 원인:%s", + "ORG_ZSTACK_ZOPS_10004": "%s의 시간 소스 '%s'를 구성하지 못했습니다, 원인:%s, 원시: %s", + "ORG_ZSTACK_ZOPS_10007": "%s이(가) Ceph 클러스터 상태를 확인하지 못했습니다, 원인: %s", + "ORG_ZSTACK_ZOPS_10006": "%s이(가) %s에서 도달할 수 있는지 확인하지 못했습니다, 원인:%s", + "ORG_ZSTACK_ZOPS_10001": "%s은(는) 유효한 클라우드 인스턴스 IP 주소가 아닙니다", + "ORG_ZSTACK_ZOPS_10003": "%s은(는) 유효한 IP 주소 또는 호스트명이 아닙니다", + "ORG_ZSTACK_ZOPS_10002": "내부 및 외부 Chrony 서버를 동시에 null로 설정할 수 없습니다. 둘 다 제대로 구성되어 있는지 확인해 주세요", + "ORG_ZSTACK_ZOPS_10010": "%s의 chrony 소스를 검색하지 못했습니다, 원인:%s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10001": "백업 저장소[UUID: %s, 이름: %s, FSID: %s]은(는) 기본 저장소[UUID: %s, 이름: %s, FSID: %s]와 동일한 Ceph 클러스터의 구성원이 아닙니다", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10004": "암호화된 이미지 캐시를 저장하지 못했습니다: %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10005": "기본 저장소[ps(%s)]와 백업 저장소[bs(%s)] 간의 fsid가 일치하지 않습니다. 따라서 템플릿 생성은 금지됩니다", + "ORG_ZSTACK_ZOPS_10019": "%s에서 zstack.properties의 기존 chrony 서버 삭제 실패, 원인:%s", + "ORG_ZSTACK_ZOPS_10016": "ZStone는 현재 chrony 서버 온라인 업데이트를 지원하지 않습니다. 배포 전에 모든 변경사항이 오프라인에서 이루어졌는지 확인하세요.", + "ORG_ZSTACK_ZOPS_10015": "%s가 현재 가상 머신 환경에서 연결할 수 없습니다", + "ORG_ZSTACK_ZOPS_10018": "CEPH 클러스터 상태가 정상이 아닙니다. 먼저 환경을 확인하세요! %s", + "ORG_ZSTACK_ZOPS_10012": "%s가 관리 대상이 아니기 때문에 호스트 %s에서 %s에 연결할 수 있는지 확인하지 못함", + "ORG_ZSTACK_ZOPS_10011": "%s에서 chrony 서버 동기화 실패, 원인:%s, 원시:%s", + "ORG_ZSTACK_ZOPS_10014": "%s를 외부 chrony 시간 서버로 지정할 수 없습니다!", + "ORG_ZSTACK_ZOPS_10020": "%s에서 zstack.properties의 chrony %s 서버 구성 실패, 원인:%s", + "ORG_ZSTACK_PROXY_10000": "UUID %s로 사용자 프록시 구성을 찾을 수 없습니다", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10005": "호스트[uuid:%s]에서 USB 리디렉션 서버 시작 실패", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10004": "호스트[%s]가 연결되지 않아 USB 서비스를 시작할 수 없습니다", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10003": "호스트[%s]가 64개 이상의 USB 리디렉션 포트를 시작했습니다", + "ORG_ZSTACK_COMPUTE_HOST_10085": "인터페이스가 자동 할당 모드로 설정되어 있어 관리 네트워크를 구성할 수 없습니다", + "ORG_ZSTACK_COMPUTE_HOST_10084": "자동으로 할당된 유형이기 때문에 인터페이스에서 관리 네트워크를 분리할 수 없습니다", + "ORG_ZSTACK_COMPUTE_HOST_10087": "자동 IP 획득을 사용하는 본딩 인터페이스에서 관리 네트워크를 분리할 수 없습니다", + "ORG_ZSTACK_COMPUTE_HOST_10081": "브리지 슬레이브 인터페이스의 IP 주소를 구성할 수 없습니다", + "ORG_ZSTACK_COMPUTE_HOST_10080": "IP 주소가 이미 다른 인터페이스에 할당되어 있습니다. 모든 네트워크 인터페이스에서 IP 주소가 고유한지 확인하세요.", + "ORG_ZSTACK_COMPUTE_HOST_10083": "가상 네트워크 인터페이스 %s의 본딩 UUID가 잘못되었습니다", + "ORG_ZSTACK_COMPUTE_HOST_10089": "지정된 서비스 유형이 잘못되었습니다. 클라우드 컴퓨팅 환경에 유효한 서비스 유형을 사용하고 있는지 확인하세요.", + "ORG_ZSTACK_COMPUTE_HOST_10088": "관리 네트워크가 자동 할당을 사용하기 때문에 본딩에 관리 네트워크를 설정할 수 없습니다", + "ORG_ZSTACK_COMPUTE_HOST_10090": "IPMI를 통한 가상 머신[%s]의 모의 전원 끄기 실패", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10001": "호스트: %s 및 포트: %d의 SMTP 서버에 연결하지 못했습니다. smtpServer 및 smtpPort 구성의 정확성을 확인하세요. [error=%s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10002": "15초 이내에 SMTP 서버[서버: %s, 포트: %s]에 연결할 수 없습니다", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10003": "SMTP 서버 검증 오류: %s", + "ORG_ZSTACK_AI_COLLECTOR_10000": "가상 환경에서 MindIE 메타데이터 수집을 위한 배포 컨텍스트를 찾을 수 없습니다. 필수 클라우드 리소스가 올바르게 구성되고 사용 가능한지 확인하세요.", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10004": "지정된 엔드포인트가 비활성화되었습니다. 엔드포인트 구성을 확인하세요.", + "ORG_ZSTACK_AI_COLLECTOR_10001": "일부 배포 컨텍스트에 가상 머신 인벤토리가 없어 MindIE 메타데이터를 수집할 수 없습니다", + "ORG_ZSTACK_COMPUTE_HOST_10096": "IPMI를 통한 호스트[%s]의 전원 재설정 실패", + "ORG_ZSTACK_COMPUTE_HOST_10095": "IPMI를 통한 가상 머신의 모의 전원 재설정 실패 [%s]", + "ORG_ZSTACK_COMPUTE_HOST_10098": "호스트[%s]가 예상치 못한 반환 값을 받았습니다", + "ORG_ZSTACK_COMPUTE_HOST_10097": "인스턴스 %s의 IPMI 정보가 불완전합니다. 필수 세부 정보를 확인하고 제공해 주세요.", + "ORG_ZSTACK_COMPUTE_HOST_10092": "호스트[%s]의 인스턴스를 IPMI로 모의 전원 켜기가 실패했습니다.", + "ORG_ZSTACK_COMPUTE_HOST_10091": "호스트[%s]를 IPMI로 전원 끄기가 실패했습니다.", + "ORG_ZSTACK_COMPUTE_HOST_10094": "인스턴스가 이미 꺼져 있기 때문에 호스트[%s:%d] 재부팅이 실패했습니다.", + "ORG_ZSTACK_COMPUTE_HOST_10093": "호스트[%s]를 IPMI로 전원 켜기가 실패했습니다.", + "ORG_ZSTACK_COMPUTE_HOST_10099": "호스트[%s]가 ipmi[%s]와 연결을 수립할 수 없습니다, 원인:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10002": "디렉토리[%s]의 파일 MD5 체크섬을 확인할 수 없습니다.\\nstdout:%s\\nstderr:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10003": "호스트[ip:%s]의 폴더[%s]에 있는 파일 MD5 체크섬을 확인할 수 없습니다.\\nstdout:%s\\nstderr:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10000": "사용자 이름, 비밀번호 또는 포트 번호가 잘못되었을 수 있습니다. 확인 후 다시 시도해 주세요.", + "ORG_ZSTACK_COMPUTE_HOST_10065": "호스트 네트워크 레이블 업데이트 실패 [uuid:%s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10000": "잘못된 액세스 키 또는 시크릿 키, 또는 IAM 정책 권한 거부로 인한 문제일 수 있습니다. [error=%s]", + "ORG_ZSTACK_COMPUTE_HOST_10064": "호스트 네트워크 레이블 삭제 실패 [uuid:%s]", + "ORG_ZSTACK_COMPUTE_HOST_10067": "잘못된 IP 주소 형식[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10066": "호스트 [%s]가 연결되어 있지 않아 전원 끄기가 지원되지 않습니다", + "ORG_ZSTACK_COMPUTE_HOST_10069": "잘못된 IP 세트입니다. CIDR 표기법으로 넷마스크를 지정해야 합니다", + "ORG_ZSTACK_COMPUTE_HOST_10068": "잘못된 서브넷 마스크 형식[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10073": "본딩 슬레이브 인터페이스에 IP 주소를 구성할 수 없습니다", + "ORG_ZSTACK_COMPUTE_HOST_10070": "관리 네트워크 인터페이스에 IP 주소를 구성할 수 없습니다.%s", + "ORG_ZSTACK_COMPUTE_HOST_10078": "관리 네트워크와 관련된 본딩 인터페이스에 IP 주소를 구성할 수 없습니다", + "ORG_ZSTACK_COMPUTE_HOST_10077": "잘못된 인터페이스 UUID가 지정되었습니다", + "ORG_ZSTACK_IMAGE_10019": "업로드 세션이 만료되었습니다. 업로드 세션이 활성화되어 있는지 확인하고 다시 시도해 주세요.", + "ORG_ZSTACK_IMAGE_10016": "관리 노드 재부팅으로 인해 실패했습니다.", + "ORG_ZSTACK_IMAGE_10015": "이미지 경로가 승인된 목록에 없습니다: %s", + "ORG_ZSTACK_IMAGE_10014": "이 서버의 모든 인스턴스가 이미지에 액세스할 수 없습니다", + "ORG_ZSTACK_IMAGE_10013": "이미지 경로 [%s]가 블랙리스트 %s에 포함되어 있습니다", + "ORG_ZSTACK_IMAGE_10012": "소스 파일에 절대 경로를 지정해야 합니다. 파일의 전체 경로를 제공해 주세요.", + "ORG_ZSTACK_IMAGE_10011": "제공된 URL은 'file:///', 'http://', 'https://', 'ftp://', 'sftp://', 또는 '/'로 시작해야 합니다.", + "ORG_ZSTACK_IMAGE_10010": "이 이미지를 추가하기 위해 uuids%s에 지정된 백업 스토리지가 없습니다. 상태가 %s가 아니거나 상태가 %s가 아니거나 UUID가 잘못된 백업 스토리지 UUID입니다", + "ORG_ZSTACK_IMAGE_10009": "지원되지 않는 이미지 형식[%s]", + "ORG_ZSTACK_IMAGE_10008": "알 수 없는 형식[%s]", + "ORG_ZSTACK_IMAGE_10007": "ISO는 시스템 디스크 이미지로 사용할 수 없습니다.", + "ORG_ZSTACK_IMAGE_10006": "볼륨 스냅샷[uuid:%s]이(가) 활성화되어 있지 않습니다. 현재 상태: %s", + "ORG_ZSTACK_IMAGE_10005": "볼륨 스냅샷[uuid:%s]이(가) 준비 상태가 아닙니다. 현재 상태: %s", + "ORG_ZSTACK_IMAGE_10004": "볼륨[uuid:%s]이(가) 활성화되어 있지 않습니다. 현재 상태: %s", + "ORG_ZSTACK_IMAGE_10003": "볼륨[uuid:%s]이(가) 준비 상태가 아닙니다. 현재 상태: %s", + "ORG_ZSTACK_IMAGE_10002": "AArch64 아키텍처는 레거시 기능을 지원하지 않습니다. 구성 설정이 AArch64 아키텍처와 호환되는지 확인하십시오.", + "ORG_ZSTACK_ALIYUN_ACCOUNT_10000": "%d밀리초 이내에 [%s]에 연결할 수 없습니다. Alibaba Cloud OpenAPI 서비스에 접근할 수 없음을 의미합니다.", + "ORG_ZSTACK_IMAGE_10039": "이미지[uuid:%s, name:%s]에 대한 연결된 백업 스토리지를 찾을 수 없습니다.", + "ORG_ZSTACK_IMAGE_10038": "UUID [uuid:%s] 및 이름 [name:%s]의 이미지가 어떤 백업 스토리지에도 저장되어 있지 않습니다.", + "ORG_ZSTACK_IMAGE_10037": "모든 백업 스토리지에서 볼륨[uuid:%s]으로부터 데이터 볼륨 템플릿을 생성하지 못했습니다. 오류 원인 중 하나를 참조하십시오", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10041": "불리언 값 또는 다른 Condition이 필요합니다. 현재 Conditions: %s, però got %s", + "ORG_ZSTACK_IMAGE_10036": "모든 백업 스토리지[uuid:%s] 할당에 실패했습니다. 오류 목록: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10040": "EC2 인스턴스가 null입니다! 인스턴스 ID가 올바르고 null이 아닌지 확인하십시오.", + "ORG_ZSTACK_IMAGE_10035": "적절한 백업 스토리지 솔루션을 찾을 수 없습니다. 클라우드 스토리지 구성이 올바르고 접근 가능한지 확인하십시오.", + "ORG_ZSTACK_IMAGE_10034": "모든 백업 스토리지에서 루트 볼륨[uuid:%s]으로부터 이미지를 생성하지 못했습니다. 오류 원인 중 하나를 확인하십시오", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10002": "볼륨[uuid:%s] 스토리지 마이그레이션 중 이미지[uuid:%s] 다운로드에 대한 리소스가 부족합니다. 필요 용량: %s, 현재 사용 가능한 물리적 용량: %s", + "ORG_ZSTACK_IMAGE_10032": "지정된 UUID의 백업 스토리지를 할당할 수 없습니다%s. 오류 목록: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10003": "볼륨 [UUID: %s] 스토리지 마이그레이션을 위한 용량이 부족합니다. 필요 용량: %d, 현재 사용 가능한 물리적 용량: %d", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10004": "소스 PS[uuid: %s]의 데이터가 삭제되었으며 롤백이 지원되지 않습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10005": "공유 블록 스토리지에서 스냅샷 없이 볼륨을 마이그레이션하는 것은 지원되지 않으며 취소할 수 없습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10000": "마이그레이션 설치 경로 [%s]에 대해 기본 스토리지 [%s]에서 trash ID (%s)를 찾았습니다. [%s] 볼륨을 마이그레이션하려면 'APICleanUpTrashOnPrimaryStorageMsg'를 사용하여 먼저 정리하십시오.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10001": "UUID:%s의 영역에 연결된 백업 스토리지에서 UUID:%s의 이미지를 찾을 수 없습니다. 다음을 확인하십시오:", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10039": "1. 백업 스토리가 UUID:%s의 영역에 연결되어 있는지 확인하십시오.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10032": "2. 백업 스토리지가 연결 상태인지 확인하고, 필요시 재연결을 시도하십시오.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10036": "Function 내에서 메서드만 정의할 수 있습니다.그러나 %s을(를) 찾았습니다", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10035": "Fn::FindInMap에서 Resources 맵 내에서 리소스 [%s]을(를) 찾을 수 없습니다!", + "ORG_ZSTACK_CORE_ERRORCODE_10007": "참조 [%s]을(를) 찾을 수 없습니다!", + "ORG_ZSTACK_CORE_ERRORCODE_10005": "지원되지 않는 함수 [%s]는 ZStack 리소스 템플릿에서 지원되지 않습니다!", + "ORG_ZSTACK_IMAGE_10026": "클라우드 리소스 필터링을 위해 'regex' 또는 'category' 입력 인수를 지정해야 합니다.", + "ORG_ZSTACK_CORE_ERRORCODE_10006": "상세 코드必须是 숫자 값이어야 합니다!", + "ORG_ZSTACK_IMAGE_10025": "소스 이미지 [%s]가 존재하지 않습니다", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10051": "%s를 CloudString으로 변환할 수 없습니다", + "ORG_ZSTACK_CORE_ERRORCODE_10003": "%s는 유효하지 않거나 빈 디렉터리입니다", + "ORG_ZSTACK_CORE_ERRORCODE_10004": "템플릿 파일 처리 중 읽기 오류 [%s] 실패, 원인: %s", + "ORG_ZSTACK_IMAGE_10023": "vm 인스턴스[uuid:%s]에 루트 볼륨이 없습니다", + "ORG_ZSTACK_IMAGE_10022": "vm 인스턴스[uuid:%s]에 연결된 볼륨이 없습니다", + "ORG_ZSTACK_IMAGE_10021": "백업 저장소[uuid:%s]가 연결 상태가 아닙니다, 현재 상태: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10042": "개체에 대해 'true' 또는 'false' 부울 값을 예상했으나, %s을(를) 얻었습니다", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10046": "Fn::GetAtt가 리소스 목록에서 지정된 리소스 [%s]를 찾을 수 없습니다!", + "ORG_ZSTACK_SSO_SAML2_SERVICE_10000": "iam2에 동일한 이름[%s]의 사용자가 있습니다, 예상된 유형[%s]이지만 발견된 유형[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10119": "호스트 [%s]에 IPMI 장치가 구성되지 않았거나 IPMI 장치에 주소가 누락되었습니다. IPMI 주소를 구성한 후 호스트를 다시 연결하여 IPMI 정보를 새로고침하십시오.", + "ORG_ZSTACK_ZQL_AST_VISITORS_PLUGIN_10000": "합산할 필드를 지정해야 합니다.", + "ORG_ZSTACK_SSO_SAML2_SERVICE_10001": "중복된 SAML 로그인[%s] 유형[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10120": "호스트[uuid:%s, name:%s, ip:%s]에서 vm[uuid:%s] 마이그레이션 실패, 정상 종료를 시도합니다.", + "ORG_ZSTACK_CORE_ERRORCODE_10001": "소스 파일과 JSON 콘텐츠를 동시에 비울 수 없습니다. 유효한 소스 파일이 제공되거나 JSON 콘텐츠가 지정되었는지 확인하십시오.", + "ORG_ZSTACK_CORE_ERRORCODE_10002": "리소스 디렉터리 스캔 실패: %s", + "ORG_ZSTACK_CORE_ERRORCODE_10000": "클라우드 컴퓨팅 리소스 구성에 대해 파일이나 입력 콘텐츠가 제공되지 않았습니다", + "ORG_ZSTACK_COMPUTE_HOST_10124": "호스트 연결 시도 실패, ping 요청 시간 초과. 네트워크 연결성을 확인하고 호스트가 작동 중인지 확인하십시오.", + "ORG_ZSTACK_COMPUTE_HOST_10104": "하이퍼바이저 [%s]에 대한 관리 IP [%s]인 호스트가 감지되었습니다.", + "ORG_ZSTACK_COMPUTE_HOST_10103": "cluster[uuid:%s]에 정의되지 않은 하이퍼바이저 유형이 있습니다", + "ORG_ZSTACK_COMPUTE_HOST_10106": "cluster[uuid:%s]의 아키텍처는 %s로, 호스트[name:%s, ip:%s]의 아키텍처 %s과(와) 일치하지 않습니다", + "ORG_ZSTACK_COMPUTE_HOST_10105": "연결 후, host[name:%s, ip:%s]가 null 가상 아키텍처를 반환합니다", + "ORG_ZSTACK_COMPUTE_HOST_10100": "host ipmi[%s]에 연결할 수 없습니다, 원인: %s", + "ORG_ZSTACK_COMPUTE_HOST_10102": "cluster[uuid:%s]가 존재하지 않습니다", + "ORG_ZSTACK_SCHEDULER_10008": "잘못된 시간 단위가 지정되었습니다: %s", + "ORG_ZSTACK_SCHEDULER_10005": "volume[%s]은(는) 스냅샷 보존 정책을 지원하지 않습니다", + "ORG_ZSTACK_SCHEDULER_10006": "snapshotMaxNumber: %s로 인해 형식이 올바르지 않습니다", + "ORG_ZSTACK_COMPUTE_HOST_10108": "시스템 호스트 네트워크 서비스 유형[%s]을(를) 종료할 수 없습니다", + "ORG_ZSTACK_COMPUTE_HOST_10107": "primary storage[uuid:%s]가 연결 해제되어, 호스트에 연결된 primary storage 리소스가 더 이상 없습니다", + "ORG_ZSTACK_COMPUTE_HOST_10109": "시스템 호스트 네트워크 서비스 유형[%s]은(는) 충돌하는 가상화 설정으로 인해 업데이트할 수 없습니다", + "ORG_ZSTACK_SCHEDULER_10002": "이전 작업이 성공적으로 완료되지 않았습니다. 이 작업을 건너뜁니다.", + "ORG_ZSTACK_COMPUTE_HOST_10114": "연결되지 않은 호스트[uuid:%s, status:%s]를 유지할 수 없습니다", + "ORG_ZSTACK_COMPUTE_HOST_10111": "WebSSH 서버 인스턴스가 활성화되어 있지 않습니다. 클라우드 SSH 서버(%s)가 실행되고 올바르게 구성되어 있는지 확인하세요.", + "ORG_ZSTACK_COMPUTE_HOST_10110": "호스트 네트워크 서비스 유형[%s]이(가) 존재합니다", + "ORG_ZSTACK_COMPUTE_HOST_10113": "managementIp[%s]은(는) 유효한 IPv4 주소 또는 호스트명이 아닙니다", + "ORG_ZSTACK_COMPUTE_HOST_10112": "관리 IP[%s]을(를) 가진 호스트가 존재합니다", + "ORG_ZSTACK_SCHEDULER_10018": "VM에 이미 [%s] 유형의 작업이 예약되어 있습니다", + "ORG_ZSTACK_SCHEDULER_10016": "루트 볼륨 [%s]의 VM을 사용할 수 없습니다. VM이 존재하는지 확인하세요.", + "ORG_ZSTACK_SCHEDULER_10017": "snapshotGroupMaxNumber: 형식이 %s로 인해 올바르지 않습니다", + "ORG_ZSTACK_SCHEDULER_10014": "볼륨[%s]을(를) 사용할 수 없습니다. 볼륨이 존재하고 올바르게 연결되어 있는지 확인하세요.", + "ORG_ZSTACK_SCHEDULER_10015": "볼륨[%s]은(는) 루트 볼륨이 아닙니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10068": "공유 블록 그룹 기본 스토리지 간 마이그레이션 중 migrateVolumeStructs에서 볼륨을 찾을 수 없습니다!", + "ORG_ZSTACK_SCHEDULER_10013": "클라우드 인스턴스 구성에서 필드[%s]은(는) 비어 있을 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10067": "migrateVolumesBetweenSharedBlockGroupPrimaryStorageMsg에서 빈 볼륨 마이그레이션 구조!", + "ORG_ZSTACK_VPCFIREWALL_10027": "규칙 집합[%s]에 이미 지정된 규칙 번호 %s가 있는 규칙이 있습니다.", + "ORG_ZSTACK_IPSEC_10006": "네트워크 [UUID: %s]에 IPsec 서비스가 활성화되어 있지 않습니다.", + "ORG_ZSTACK_VPCFIREWALL_10028": "방화벽 규칙[%d]을(를) 추가할 수 없습니다. 포트는 TCP 또는 UDP 프로토콜만 사용할 수 있습니다", + "ORG_ZSTACK_IPSEC_10007": "원격 CIDR[%s]이(가) 기존 CIDR과 중첩됩니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10000": "새로 추가된 VM NIC와 연결된 VM NIC가 동일한 가상 라우터에 있지 않습니다. UUID가 %s와(과) %s인 다른 가상 라우터에 있습니다.", + "ORG_ZSTACK_IPSEC_10008": "원격 CIDR[%s]과(와) 원격 CIDR[%s]이(가) 중첩됩니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10001": "새로 추가된 VM NIC[uuids:%s]과(와) 부하 분산기[uuid: %s]의 VIP의 피어 L3 네트워크[uuids:%s]가 동일한 가상 라우터에 있지 않습니다. UUID[uuids:%s]인 다른 가상 라우터에 있습니다.", + "ORG_ZSTACK_IPSEC_10009": "로컬 라우터의 CIDR[%s]과(와) 원격 라우터의 CIDR[%s]이(가) 중첩됩니다", + "ORG_ZSTACK_IPSEC_10002": "현재 포트 범위 [%s, %s]이(가) VIP [uuid: %s] 프로토콜: UDP에 대해 사용된 포트 범위 [%s, %s]와(과) 충돌합니다", + "ORG_ZSTACK_IPSEC_10003": "연결된 L3Network [uuid:%s]의 cidr[%s]이(가) uuid:%s의 ipsec 원격 cidr[%s]과(와) 중첩됩니다", + "ORG_ZSTACK_VPCFIREWALL_10029": "방화벽 규칙[%d]을(를) 추가할 수 있습니다. TCP 플래그는 TCP 프로토콜만 사용할 수 있습니다", + "ORG_ZSTACK_IPSEC_10005": "Java 코드의 소스 파일을 찾을 수 없습니다. 필요한 파일이 업로드되어 프로젝트에 포함되어 있는지 확인하세요.", + "ORG_ZSTACK_VPCFIREWALL_10020": "기본 규칙 집합을 다른 네트워크 인터페이스 카드에 연결할 수 없습니다", + "ORG_ZSTACK_IPSEC_10000": "IPsec 연결 [UUID:%s]을(를) 찾을 수 없습니다. 삭제되었을 수 있습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10006": "부하 분산 리소스를 공유하려면 vmnic을 지정해야 합니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10073": "VM [UUID: %s]에 추가 QMP 소켓이 구성되어 있지 않습니다. 이는 VM이 글로벌 구성 [vm.additionalQmp] 없이 시작되었기 때문일 수 있습니다. 이 구성이 활성화되어 있는지 확인하고 ZStack에서 VM을 재부팅하세요.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10007": "로드 밸런서에 대한 가상 라우터를 찾을 수 없음 [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10072": "주 스토리지 [UUID: %s]에 SCSI LUN [WWID: %s]이 연결되어 있습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10071": "이미지 포맷 또는 볼륨 포맷 [%s]을 처리할 주 스토리지 [uuid:%s]에 적합한 하이퍼바이저 타입을 찾을 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10004": "로드 밸런서 인증서 갱신 이유:%s", + "ORG_ZSTACK_VPCFIREWALL_10021": "ruleSet[%s]에 이미 l3[%s]가 포함되어 있습니다", + "ORG_ZSTACK_SCHEDULER_10009": "트리거 작업[uuid: %s] 실패, 가상 머신 인스턴스 프로비저닝 과정에서 오류 발생", + "ORG_ZSTACK_ZWATCH_MYSQL_10001": "MySQL 데이터베이스 인스턴스를 찾을 수 없음[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10005": "로드 밸런서 리스너 갱신 이유:%s", + "ORG_ZSTACK_VPCFIREWALL_10022": "동일한 번호를 가진 규칙이 이미 존재함[%s]", + "ORG_ZSTACK_SCHEDULER_10029": "오래된 트리거[uuid:%s]에 작업[uuid:%s]을 추가할 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10077": "공유 블록 그룹 주 스토리지의 공유 볼륨[uuid: %s]은 크기를 조정할 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10076": "볼륨을 찾을 수 없음[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10075": "새 공유 블록 그룹의 공유 블록 그룹[UUID: %s] 내에 공유 블록[UUID:%s, diskUUID:%s, description:%s]이 이미 존재합니다", + "ORG_ZSTACK_SCHEDULER_10028": "동일한 UUID [%s]의 트리거에 UUID [%s]의 작업을 두 번 추가할 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10074": "주 스토리지의 공유 블록 그룹을 추가할 때 최소 하나의 디스크를 지정해야 합니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10079": "볼륨[%s]의 준비를 찾을 수 없습니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10078": "공유 블록 그룹 주 스토리지의 공유 볼륨[UUID: %s]이 정지되지 않은 VM 인스턴스[UUIDs: %s]에 연결되어 있습니다", + "ORG_ZSTACK_SCHEDULER_10021": "한 번 이상 반복 작업을 위해 단순 스케줄러를 사용할 경우 간격을 지정해야 합니다", + "ORG_ZSTACK_VPCFIREWALL_10016": "클라우드 컴퓨팅 환경에서는 TCP 또는 UDP 프로토콜만 포트를 사용할 수 있습니다.", + "ORG_ZSTACK_VPCFIREWALL_10017": "TCP 플래그는 TCP 프로토콜만 사용할 수 있습니다.", + "ORG_ZSTACK_IPSEC_10018": "VIP[uuid:%s]가 %s 인스턴스에서 사용 중입니다", + "ORG_ZSTACK_VPCFIREWALL_10014": "ruleSet[%s]에 동일한 우선순위 %d의 규칙이 이미 존재합니다.", + "ORG_ZSTACK_IPSEC_10019": "피어 주소[%s]가 VIP 주소와 동일할 수 없습니다", + "ORG_ZSTACK_VPCFIREWALL_10015": "기본 규칙[%s]을 업데이트할 수 없습니다", + "ORG_ZSTACK_IPSEC_10013": "동일한 IPsec 연결 내의 모든 네트워크는 동일한 VPC(Virtual Private Cloud) 라우터와 연결되어야 합니다.", + "ORG_ZSTACK_IPSEC_10014": "HA 그룹 %s의 마스터 VPC가 없습니다", + "ORG_ZSTACK_VPCFIREWALL_10018": "ICMP 프로토콜은 ICMP 타입을 사용할 수 있는 유일한 프로토콜입니다. 올바른 프로토콜을 지정했는지 확인하세요.", + "ORG_ZSTACK_IPSEC_10015": "이전 IPsec 플러그인을 사용하는 VPC[%s]가 있습니다. IPsec 연결을 생성하려면 업그레이드하세요.", + "ORG_ZSTACK_VPCFIREWALL_10019": "규칙 [%%s] 인덱스가 유효하지 않습니다", + "ORG_ZSTACK_IPSEC_10016": "동일한 가상 라우터와 피어 주소를 가진 IPsec 연결[uuid:%s, name:%s]이 이미 존재합니다", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10080": "캐시 볼륨으로 Thick-Provisioned 스토리지를 사용합니다. 볼륨 [%s]의 프로비저닝은 %s입니다.", + "ORG_ZSTACK_IPSEC_10010": "동일한 IPsec 연결 내의 모든 네트워크는 동일한 유형이어야 합니다.", + "ORG_ZSTACK_IPSEC_10011": "IPsecConnection은 %s에 대해 1개의 네트워크만 가질 수 있습니다.", + "ORG_ZSTACK_IPSEC_10012": "L3Network [UUID: %s]는 VPC 라우터에 연결되지 않았습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10084": "볼륨 %s의 클러스터 UUID를 검색할 수 없습니다.", + "ORG_ZSTACK_VPCFIREWALL_10010": "이미 이름이 %s인 규칙 템플릿이 있습니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10081": "UUID [%s] 및 WWID [%s]가 있는 SCSI LUN이 이미 UUID [%s]인 기본 스토리지에 연결되어 있습니다.", + "ORG_ZSTACK_SCHEDULER_10038": "cron 표현식 형식이 잘못되었습니다. 표준 CRON 구문을 따르는지 확인하세요.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10086": "공유 블록 그룹 기본 스토리지 [uuid: %s]에 대한 적합한 KVM 호스트를 찾을 수 없습니다.", + "ORG_ZSTACK_SCHEDULER_10039": "cron 작업은 \"0 0/3 17-23 * * ?\" 형식을 따라야 합니다.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10085": "sanlock이 호스트 %s가 %s에서 연결할 수 없음을 나타냅니다.", + "ORG_ZSTACK_SCHEDULER_10036": "stopTime이 가상 환경의 현재 시간을 초과했습니다. stopTime이 미래 시점으로 설정되어 있는지 확인하세요.", + "ORG_ZSTACK_SCHEDULER_10037": "cron 스케줄러를 사용할 때 cron을 구성해야 합니다.", + "ORG_ZSTACK_SCHEDULER_10034": "지속 시간 제한 시간이 유효 범위를 벗어났습니다.", + "ORG_ZSTACK_SCHEDULER_10035": "stopTime이 MySQL 타임스탬프 형식의 유효 범위를 초과합니다.", + "ORG_ZSTACK_SCHEDULER_10032": "simple 스케줄러가 올바르게 작동하려면 startTime을 지정해야 합니다.", + "ORG_ZSTACK_SCHEDULER_10033": "simple 스케줄러가 올바르게 작동하려면 schedulerInterval을 구성해야 합니다.", + "ORG_ZSTACK_SCHEDULER_10030": "작업[uuid:%s]에 [%d]개의 트리거가 추가되어 최대 허용 트리거 수를 초과합니다.", + "ORG_ZSTACK_SCHEDULER_10031": "작업 그룹 [UUID:%s]에 [%d]개의 트리거가 추가되어 더 이상 트리거를 추가할 수 없습니다.", + "ORG_ZSTACK_VPCFIREWALL_10005": "라우터 [uuid:%s]에는 마스터 라우터가 없습니다.", + "ORG_ZSTACK_VPCFIREWALL_10006": "VPC 라우터[uuid:%s]에는 이미 방화벽이 구성되어 있습니다.", + "ORG_ZSTACK_VPCFIREWALL_10003": "시스템 기본 규칙 세트를 삭제할 수 없습니다.", + "ORG_ZSTACK_VPCFIREWALL_10004": "기본 시스템 규칙을 삭제할 수 없습니다.", + "ORG_ZSTACK_VPCFIREWALL_10001": "시스템 정의 규칙 세트만 작업 유형을 수정할 수 있습니다.", + "ORG_ZSTACK_VPCFIREWALL_10000": "가상 네트워크에서 기본 규칙 세트를 분리할 수 없습니다.", + "ORG_ZSTACK_SCHEDULER_10045": "작업 그룹에 %d개의 작업이 포함되어 있어 %d개의 슬롯만 남아 있습니다.", + "ORG_ZSTACK_SCHEDULER_10043": "[%s] 유형의 스케줄러 작업 팩토리를 찾을 수 없습니다.", + "ORG_ZSTACK_SCHEDULER_10044": "%d개의 작업이 작업 그룹과 다른 인스턴스 유형을 가집니다.", + "ORG_ZSTACK_SCHEDULER_10041": "startTime은 양의 정수 또는 0이어야 합니다.", + "ORG_ZSTACK_SCHEDULER_10042": "인스턴스에 지정된 시작 시간이 범위를 벗어났습니다. 유효한 매개변수 내에 있는지 확인하세요.", + "ORG_ZSTACK_SCHEDULER_10040": "크론 스케줄러 구성은 cron 작업 표현식 지정만 필요합니다.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10005": "클라우드 리소스 할당을 위해 zbox를 관리 노드에 통합해 주세요.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10006": "데이터베이스 백업 실패: %s", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10003": "service[%s]이(가) 활성화되지 않았습니다", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10007": "복구 모드에 다른 외부 백업 [UUID: %s]이(가) 있습니다.", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10002": "service[%s]은(는) 구성 다시 로드를 지원하지 않습니다", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10008": "호스트 UUID와 백업 스토리지 UUID가 모두 비어 있습니다. 둘 중 하나 이상을 지정해야 합니다.", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10001": "service[%s]이(가) 검색되지 않았습니다", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10001": "일부 볼륨 복구[uuids:%s] 실패했습니다. 다시 연결하여 다시 트리거할 수 있습니다.", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10000": "service[%s]이(가) 등록되었으며 클라우드 환경에서 활성화되었습니다.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10002": "zbox 백업 설치 디렉터리 아래에서 복구 구성 파일 recover.conf을(를) 찾을 수 없습니다.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10004": "zbox를 먼저 호스트에 연결해야 합니다.", + "ORG_ZSTACK_VPCFIREWALL_10069": "UUID: %s(으)로 VPC 방화벽 IP 세트 템플릿을 찾을 수 없습니다. 삭제되었을 수 있습니다.", + "ORG_ZSTACK_VPCFIREWALL_10063": "가상 네트워크 구성 관련 오류로 인해 방화벽 규칙 세트[%s] 연결 실패", + "ORG_ZSTACK_VPCFIREWALL_10064": "규칙 세트 분리 실패, 삭제로 인한 것일 수 있습니다.", + "ORG_ZSTACK_VPCFIREWALL_10061": "vRouter[%s]에서 방화벽 규칙 삭제 실패, %s로 인해", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10010": "Fn::Select 인덱스가 범위를 벗어났습니다. JSON 구성을 확인해 주세요!", + "ORG_ZSTACK_VPCFIREWALL_10062": "vRouter[%s]에서 방화벽 규칙 상태 변경 실패, %s로 인해", + "ORG_ZSTACK_VPCFIREWALL_10067": "관련 가상 라우터의 UUID: %s(으)로 VPC 방화벽을 찾을 수 없습니다.", + "ORG_ZSTACK_VPCFIREWALL_10068": "UUID: %s(으)로 VPC 방화벽 규칙 세트를 찾을 수 없습니다. 삭제되었을 수 있습니다.", + "ORG_ZSTACK_VPCFIREWALL_10065": "%s로 인해 방화벽 규칙 세트[%s] 분리 실패", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10014": "[%s] 매개 변수를 찾을 수 없습니다!", + "ORG_ZSTACK_VPCFIREWALL_10066": "UUID: %s(으)로 VPC 방화벽을 찾을 수 없습니다. 삭제되었을 수 있습니다.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10013": "[%s] 매개 변수에 지정된 값이나 기본값이 없습니다!", + "ORG_ZSTACK_VPCFIREWALL_10060": "%s로 인해 방화벽 규칙 세트[%s] 생성 실패", + "ORG_ZSTACK_IMAGE_10046": "UUID [uuid:%s] 및 이름 [name:%s]의 이미지가 UUID [uuid:%s]의 백업 스토리지에서 삭제되지 않았습니다.", + "ORG_ZSTACK_IMAGE_10045": "UUID [uuid:%s] 및 이름 [name:%s]의 이미지가 UUID [uuid:%s]의 백업 스토리지에서 사용할 수 없습니다.", + "ORG_ZSTACK_IMAGE_10044": "UUID [uuid:%s] 및 이름 [name:%s]의 이미지가 어떤 백업 스토리지에서도 삭제되지 않았습니다.", + "ORG_ZSTACK_IMAGE_10043": "UUID [uuid:%s] 및 이름 [name:%s]의 이미지가 UUID [backup storage uuid:%s]의 백업 스토리지에서 상태 [status:%s]를 가지고 있으며 Deleted가 아닙니다.", + "ORG_ZSTACK_IMAGE_10040": "uuid=%s로 iso 분리 실패, 오류: %s", + "ORG_ZSTACK_VPCFIREWALL_10058": "vRouter[%s]에서 방화벽 규칙을 삭제함: %s", + "ORG_ZSTACK_VPCFIREWALL_10052": "기본 규칙집합 %s는 하나의 인터페이스 포워드에 연결할 수만 있지만, 여러 관련 인터페이스가 발견됨: %s", + "ORG_ZSTACK_VPCFIREWALL_10050": "방화벽 %s 관련 VPC가 실행 상태가 아님", + "ORG_ZSTACK_VPCFIREWALL_10051": "네트워크 인터페이스 카드에 여전히 연결되어 있으므로 규칙집합 [%s]을 삭제할 수 없음", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10020": "'Conditions' 목록에서 조건 [%s]을 찾을 수 없음", + "ORG_ZSTACK_VPCFIREWALL_10056": "vRouter[%s]에서 l3[%s]과 연결된 MAC 주소를 찾을 수 없음", + "ORG_ZSTACK_VPCFIREWALL_10057": "방화벽 규칙[%s] 생성 실패: %s", + "ORG_ZSTACK_VPCFIREWALL_10054": "방화벽 구성 동기화 실패: %s", + "ORG_ZSTACK_VPCFIREWALL_10055": "방화벽 규칙집합 동작 업데이트 실패: %s", + "ORG_ZSTACK_VPCFIREWALL_10049": "규칙집합 %s에서 변경 사항이 감지되지 않음", + "ORG_ZSTACK_VPCFIREWALL_10047": "네트워크[%s]에서 방화벽 규칙집합 분리 실패: %s", + "ORG_ZSTACK_VPCFIREWALL_10048": "방화벽 %s, l3 %s, 포워드 %s에서 중복 규칙 번호 %s 발견", + "ORG_ZSTACK_SSO_CAS_SERVICE_10002": "iam2에 동일한 이름[%s]의 사용자가 포함되어 있음", + "ORG_ZSTACK_SSO_CAS_SERVICE_10003": "사용자 유형[%s]에 대한 중복 로그인 시도", + "ORG_ZSTACK_SSO_CAS_SERVICE_10004": "유형(%s)에 대한 CasLogin을 찾을 수 없음", + "ORG_ZSTACK_VPCFIREWALL_10041": "규칙 번호 %d에 대한 설명 길이 %s가 유효하지 않아 방화벽 규칙을 추가할 수 없음", + "ORG_ZSTACK_VPCFIREWALL_10040": "규칙 번호:%d에 대한 상태가 없어 방화벽 규칙을 추가할 수 없음", + "ORG_ZSTACK_VPCFIREWALL_10045": "구성 파일의 방화벽 규칙에 구문 오류가 있음: %s", + "ORG_ZSTACK_VPCFIREWALL_10046": "레이어 3 네트워크[%s]에 방화벽 규칙집합[%s] 연결 실패: %s", + "ORG_ZSTACK_VPCFIREWALL_10044": "가상 머신 인스턴스의 구성 파일에 형식 오류가 있습니다. 파일을 확인하고 필수 스키마를 준수하세요.", + "ORG_ZSTACK_VPCFIREWALL_10038": "소스 IP 길이: %s가 규칙 번호: %d에 대해 유효하지 않아 방화벽 규칙을 추가할 수 없음", + "ORG_ZSTACK_VPCFIREWALL_10039": "대상 IP 길이: %s가 규칙 번호: %d에 대해 유효하지 않아 방화벽 규칙을 추가할 수 없음", + "ORG_ZSTACK_VPCFIREWALL_10036": "규칙 번호 %d가 유효하지 않아 방화벽 규칙을 추가할 수 없음", + "ORG_ZSTACK_VPCFIREWALL_10037": "규칙번호:%d에 대해 정의된 동작이 없어 방화벽 규칙을 추가할 수 없음", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10002": "vyos 초기화 명령 실패:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10001": "SSH 설정 구성 후 가상 라우터[%s]에 SSH 연결을 설정할 수 없음", + "ORG_ZSTACK_VPCFIREWALL_10030": "ICMP 프로토콜만 특정 유형을 지원하므로 방화벽 규칙[%d]을 추가할 수 없음", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10003": "가상 라우터 [uuid:%s]의 네트워크 인터페이스 [ip:%s, mac:%s] 방화벽 기본 동작 변경 실패: %s", + "ORG_ZSTACK_VPCFIREWALL_10031": "포트 기반 규칙에 대해 TCP 또는 UDP 프로토콜만 지원되므로 방화벽 규칙[%d]을 추가할 수 없음", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10006": "가상 라우터 VM[uuid:%s]에서 DHCP 서버를 시작할 수 없음: %s", + "ORG_ZSTACK_ZWATCH_FUNCTION_10014": "클라우드 형성 템플릿에서 인스턴스 유형에 필요한 인수가 누락되었습니다", + "ORG_ZSTACK_ZWATCH_FUNCTION_10013": "알 수 없는 인수가 감지되었습니다. 모든 명령줄 매개 변수가 유효한지 확인하고 허용되는 인수 목록에 대한 설명서를 참조하십시오.", + "ORG_ZSTACK_VPCFIREWALL_10034": "이 환경에서는 TCP 프로토콜만 TCP 플래그를 지원하므로 방화벽 규칙[%d]을 추가할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10007": "가상 라우터 인스턴스 [uuid:%s]에서 DHCP 서버를 중지할 수 없습니다. 이유: %s", + "ORG_ZSTACK_VPCFIREWALL_10035": "%s 오류로 인해 방화벽 규칙[%d]을 추가할 수 없습니다", + "ORG_ZSTACK_BILLING_10000": "", + "ORG_ZSTACK_COMPUTE_VM_10176": "NIC를 연결할 수 없습니다. 해당 L2 네트워크 [uuid:%s]가 어떤 컴퓨트 클러스터에도 연결되어 있지 않습니다.", + "ORG_ZSTACK_COMPUTE_BONDING_10037": "L2 네트워크를 클러스터 [UUID: %s]에 연결할 수 없습니다. 호스트 [UUID: %s]의 인터페이스 [UUID: %s, name: %s]가 서비스 유형과 연결되어 있지만 TenantNetwork가 포함되어 있지 않습니다.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10021": "l3Network[uuid:%s]는 시스템 네트워크이므로 사용자 VM 생성에 사용할 수 없습니다.", + "ORG_ZSTACK_BILLING_10005": "이 리소스에 대한 과금이 비활성화되어 있습니다. 이 서비스를 사용하려면 과금이 활성화되어 있는지 확인하세요.", + "ORG_ZSTACK_COMPUTE_VM_10168": "정적 IP [%s]가 이미 레이어 3 네트워크 [uuid:%s]의 리소스에 할당되어 있습니다.", + "ORG_ZSTACK_ZWATCH_API_10007": "dataStartTime 및 dataEndTime 매개변수는 생략할 수 없습니다. 제공되었는지 확인하세요.", + "ORG_ZSTACK_COMPUTE_VM_10173": "비게스트 L3 네트워크에 NIC를 연결할 수 없습니다. L3 네트워크 [uuid:%s]가 이미 VM [uuid:%s]에 연결되어 있습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10075": "세션 지속성 유형 [%s]이(가) 잘못되었습니다. 다음만 지원됩니다: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10020": "UUID:%s인 l3Network가 비활성화되었습니다. 따라서 이 네트워크에서 VM 생성이 허용되지 않습니다.", + "ORG_ZSTACK_COMPUTE_VM_10111": "", + "ORG_ZSTACK_COMPUTE_VM_10174": "NIC를 연결할 수 없습니다. 해당 레이어 3 네트워크 [uuid:%s]가 비활성화되어 있습니다.", + "ORG_ZSTACK_COMPUTE_VM_10178": "프로젝트[UUID:%s, Name:%s]에 이미 종료 정책이 정의되어 있습니다.", + "ORG_ZSTACK_COMPUTE_VM_10172": "UUID [%s]를 가진 L3 네트워크가 이미 UUID [%s]를 가진 다른 VM에 연결되어 있습니다. 새 VM에 연결하려면 기존 VM에서 먼저 분리하세요.", + "ORG_ZSTACK_KVM_10141": "KVM 호스트[uuid:%s]에서 l2VlanNetwork[uuid:%s, name:%s]의 브리지[%s]를 확인하지 못했습니다, %s", + "ORG_ZSTACK_KVM_10143": "KVM 호스트[uuid:%s]에서 l2Network[uuid:%s, type:%s, vlan:%s]의 브리지[%s]를 삭제하지 못했습니다, 왜냐하면 %s", + "ORG_ZSTACK_COMPUTE_VM_10137": "IPv4 주소는 서브넷 마스크가 필요합니다", + "ORG_ZSTACK_COMPUTE_VM_10121": "", + "ORG_ZSTACK_COMPUTE_BONDING_10034": "", + "ORG_ZSTACK_COMPUTE_VM_10170": "", + "ORG_ZSTACK_COMPUTE_VM_10132": "%s은(는) 클라우드 리소스 구성에 유효한 IPv6 주소가 아닙니다", + "ORG_ZSTACK_COMPUTE_VM_10166": "정적 IP L3 UUID[%s]가 NIC L3 목록[%s]에 포함되어 있지 않습니다", + "ORG_ZSTACK_COMPUTE_VM_10161": "비게스트 L3 네트워크를 가상 머신에 연결할 수 없습니다. 해당 네트워크는 이미 다른 가상 머신( uuid: %s)에 연결되어 있습니다", + "ORG_ZSTACK_ZWATCH_API_10008": "", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10005": "잘못된 지출 값[%s]입니다. 지출 값은 0과 %f 사이여야 합니다.", + "ORG_ZSTACK_COMPUTE_VM_10124": "CPU 핫 추가가 비활성화되어 있어 가상 시스템에서 CPU 핫 추가 작업을 수행할 수 없습니다. VM을 중지한 후 CPU 핫 추가를 다시 시도하십시오.", + "ORG_ZSTACK_COMPUTE_BONDING_10036": "클러스터에 L2 네트워크를 연결할 수 없습니다 [UUID]. 호스트 [UUID]의 본딩 인터페이스 [UUID, name]에는 본딩 서비스 유형 연결이 있지만 TenantNetwork 서비스 유형이 없습니다.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10008": "프로젝트[UUID:%s, Name:%s]에는 이미 로그인 만료 전략이 구성되어 있습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10066": "로드 밸런서 리스너[%s]는 세션 지속성 상태 할당을 지원하지 않습니다", + "ORG_ZSTACK_COMPUTE_VM_10128": "VM[uuid:%s]의 메모리 크기는 실행 중일 때 줄일 수 없습니다", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10004": "잘못된 시간[%s]입니다. 10m, 1h, 2d와 같은 형식이어야 합니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10079": "로드 밸런서[%s] 리스너[%s]는 유휴 시간 제한과 쿠키 이름을 동시에 할당하는 것을 지원하지 않습니다", + "ORG_ZSTACK_KVM_10150": "", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10006": "잘못된 지출 값[%s]입니다. 예를 들어 10.001 형식이어야 합니다.", + "ORG_ZSTACK_ZWATCH_API_10006": "dataUuid는 생략할 수 없습니다", + "ORG_ZSTACK_BILLING_10001": "ESX 호스트 시스템 [%s]에서 vmUuid [%s]를 찾을 수 없습니다", + "ORG_ZSTACK_COMPUTE_BONDING_10033": "L2 네트워크 [uuid:%s]가 존재하지 않습니다", + "ORG_ZSTACK_COMPUTE_VM_10125": "메모리 핫 플러그가 비활성화되어 있어 가상 시스템에서 메모리 핫 플러그 작업을 수행할 수 없습니다. 가상 시스템을 중지한 후 메모리 핫 플러그 작업을 다시 시도하십시오.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10072": "세션 지속성 상태 [%s]이(가) 잘못되었습니다. 다음만 지원됩니다: %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10011": "NIC를 연결할 수 없습니다. VM[uuid: %s]이(가) Running 또는 Stopped 상태가 아닙니다. 현재 상태는 %s입니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10073": "로드 밸런서[%s] 리스너[%s]는 세션 지속성 상태 할당을 지원하지 않습니다. 명시적 비활성화가 필요합니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10061": "", + "ORG_ZSTACK_KVM_10144": "VM 시작에 실패했습니다. CPU 모드가 none으로 설정된 경우 하이퍼바이저 기능을 비활성화할 수 없습니다. CPU 구성 설정을 확인하세요.", + "ORG_ZSTACK_CORE_UPGRADE_10004": "지원되지 않는 네트워크 인터페이스 유형[%s]으로 인해 네트워크 인터페이스[uuid: %s] 상태를 업데이트할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10074": "로드 밸런서[%s] 리스너[%s]는 세션 지속성 상태 할당을 지원하지 않습니다. 명시적 IP 해시 할정이 필요합니다.", + "ORG_ZSTACK_COMPUTE_BONDING_10030": "SR-IOV 인터페이스 [%s]를 본딩에 추가할 수 없습니다. 본딩에서 하나의 인터페이스만 SR-IOV를 활성화할 수 있습니다.", + "ORG_ZSTACK_COMPUTE_VM_10122": "reservedMemorySize[%s]가 memorySize[%s]를 초과합니다", + "ORG_ZSTACK_COMPUTE_BONDING_10035": "사용자에 대해 올바른 가격 구성이 설정되어 있는지 확인하세요. 예시: `priceUserConfig:{\\nvolume:{\\npriceKeyName:\\\"priceKeyName\\\"}}`", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10068": "", + "ORG_ZSTACK_COMPUTE_VM_10179": "", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10006": "dateInLong이 %s 밀리초보다 작습니다", + "ORG_ZSTACK_KVM_10136": "시스템 유형 XML hook은 클라우드 컴퓨팅 환경에서 허용되지 않습니다. 모든 시스템 수준 구성이 가상화 표준을 준수하는지 확인하세요.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10065": "리스너에 접근 제어 목록 그룹을 %d개보다 많이 연결할 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10069": "상태 코드 [%s]가 잘못되었습니다. 클라우드 컴퓨팅 환경에서 유효한 상태 코드만 지원됩니다", + "ORG_ZSTACK_BILLING_10003": "", + "ORG_ZSTACK_KVM_10138": "관리 IP[%s]가 있는 KVM 호스트가 있습니다", + "ORG_ZSTACK_BILLING_10002": "클러스터에 L2 네트워크를 연결할 수 없습니다 [uuid:%s]: 물리적 인터페이스 [%s]가 하나 이상의 호스트에서 본딩에 사용됩니다. 충돌 호스트: [%s]", + "ORG_ZSTACK_COMPUTE_VM_10139": "IPv6 주소는 접두사 길이를 포함해야 합니다", + "ORG_ZSTACK_VPC_HA_10020": "priceKeyName이 null입니다. 가격 키 이름이 올바르게 구성되어 있는지 확인하세요.", + "ORG_ZSTACK_COMPUTE_BONDING_10027": "VTEP IP로 구성된 본딩 인터페이스를 삭제할 수 없습니다. 먼저 연결된 모든 가상 네트워크를 연결 해제하세요.", + "ORG_ZSTACK_COMPUTE_BONDING_10032": "본딩[%s]에서 인터페이스를 반복적으로 분리할 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10060": "vCenter[uuid:%s]와 동기화 중입니다. 나중에 다시 시도하세요.", + "ORG_ZSTACK_CORE_CLOUDBUS_10001": "type[%s] 웹훅의 경우 opaque 필드가 null일 수 없습니다", + "ORG_ZSTACK_BILLING_10004": "지원되지 않는 과금 리소스 유형 [%s]", + "ORG_ZSTACK_COMPUTE_VM_10175": "NIC를 연결할 수 없습니다. 해당 레이어 3 네트워크 [uuid:%s]는 시스템 네트워크이지만 VM은 사용자 VM입니다.", + "ORG_ZSTACK_CORE_UPGRADE_10002": "", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10076": "세션 유휴 시간 제한 [%s]이(가) 잘못되었습니다. [%s~%s] 사이의 양의 정수여야 합니다", + "ORG_ZSTACK_COMPUTE_VM_10167": "정적 IP [%s]가 레이어 3 네트워크 [uuid:%s]의 어떤 IP 범위에도 포함되지 않습니다.", + "ORG_ZSTACK_CORE_UPGRADE_10000": "", + "ORG_ZSTACK_BILLING_10008": "시작일은 종료일보다 앞서야 합니다.", + "ORG_ZSTACK_COMPUTE_VM_10112": "", + "ORG_ZSTACK_COMPUTE_BONDING_10031": "본딩 상태에 있는 본딩[%s]에서 인터페이스[%s]를 분리할 수 없습니다.", + "ORG_ZSTACK_VMWARE_10059": "VM을 일시 중단하지 못했습니다, 작업 상태: %s", + "ORG_ZSTACK_COMPUTE_VM_10160": "레이어 3 네트워크를 연결할 수 없습니다. 지정된 레이어 3 네트워크 [uuid:%s]가 이미 가상 머신 [uuid: %s]에 연결되어 있습니다.", + "ORG_ZSTACK_COMPUTE_VM_10131": "IP 주소 [%s]가 지정된 IP 범위 [%s] 내에 없습니다", + "ORG_ZSTACK_KVM_10139": "이름이 너무 길기 때문에 %s에서 VLAN 장치를 만들 수 없습니다", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10078": "세션 쿠키 이름 [%s]이(가) 잘못되었습니다. 영숫자 문자와 밑줄만 포함해야 합니다", + "ORG_ZSTACK_COMPUTE_VM_10126": "VM[uuid:%s]의 상태가 %s입니다. CPU 또는 메모리를 업데이트하려면 다음 상태여야 합니다: [%s]", + "ORG_ZSTACK_KVM_10137": "XML hook 이름 [%s]이 이미 가상 머신 구성에 있습니다.", + "ORG_ZSTACK_COMPUTE_VM_10171": "NIC가 VM[UUID: %s]에 연결되었습니다. 다시 연결하기 전에 NIC가 이미 연결되어 있지 않은지 확인하세요.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10009": "IAM2ProjectVO[uuid:%s]가 %s 상태가 아니므로 상태 변경이 허용되지 않습니다", + "ORG_ZSTACK_VMWARE_10051": "", + "ORG_ZSTACK_VMWARE_10050": "사용자에 대해 올바른 가격 구성이 설정되어 있는지 확인하세요. 예시: `priceUserConfig:{rootVolume:{priceKeyName:\"priceKeyName\"}}`", + "ORG_ZSTACK_KVM_10134": "XML hook[%s]가 VM %s에 연결되어 있으므로 삭제하기 전에 연결을 해제하세요", + "ORG_ZSTACK_COMPUTE_VM_10187": "Api: %s은(는) allowedApiListGrayscaleUpgrading에 따라 허용되지 않습니다: %s", + "ORG_ZSTACK_CORE_UPGRADE_10003": "VM[uuid: %s]에서 L3 네트워크를 분리할 수 없습니다. VM이 Running 또는 Stopped 상태가 아닙니다. 현재 상태는 %s입니다", + "ORG_ZSTACK_COMPUTE_VM_10129": "메시지 %s에서 vmUuid를 검색할 수 없습니다", + "ORG_ZSTACK_COMPUTE_VM_10127": "실행 중인 VM[uuid:%s]의 CPU를 줄일 수 없습니다", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10007": "잘못된 날짜 또는 시간[%s]으로, 현재 타임스탬프[%s]보다 이전일 수 없습니다.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10077": "세션 쿠키 이름 [%s]이(가) 잘못되었습니다. [%d]자 미만이어야 합니다" +} \ No newline at end of file diff --git a/conf/i18n/globalErrorCodeMapping/global-error-ru-RU.json b/conf/i18n/globalErrorCodeMapping/global-error-ru-RU.json new file mode 100644 index 00000000000..2454d7e5658 --- /dev/null +++ b/conf/i18n/globalErrorCodeMapping/global-error-ru-RU.json @@ -0,0 +1,4717 @@ +{ + "ORG_ZSTACK_XINFINI_SDK_10001": "Не удалось отформатировать API-ответ в класс[%s], resultString: %s, exception: %s", + "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10001": "Тип дата-центра [%s] здесь не поддерживается!", + "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10000": "Аргумент 'endpoint' должен быть установлен для типа конфигурации %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10080": "Создание экземпляра Baremetal2 не может определить подходящую вычислительную зону. Пожалуйста, укажите зону явно.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10084": "При создании baremetal-экземпляра не установлен ни UUID шасси, ни UUID предложения шасси.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10082": "Шасси не имеет достаточной емкости для образа[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10081": "Требуемый диск[%s] не принадлежит шасси[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10087": "%s может быть создан или удален только когда экземпляр Baremetal2 находится в состоянии Running.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10086": "%s может управляться только через операции создания или удаления", + "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10000": "Неверный формат ввода. Принимается только разделенный запятыми список чисел (например, %s).", + "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10001": "Хостовая виртуальная машина имеет доступных только %d процессоров.", + "ORG_ZSTACK_ZWATCH_UTILS_10001": "Ресурс[%s] не поддерживает предложение zwatch return", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10002": "Функция аутентификации идентичности включена, но связанный пул ресурсов не настроен. Пожалуйста, настройте пул ресурсов и попробуйте снова.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10003": "Невозможно освободить пул ресурсов %s, пока он используется", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10000": "Нет виртуальной машины, которую можно активировать", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10001": "Неверный тип токена %s, поддерживаются только токены типов, используемых в облачных вычислительных средах.", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10059": "Требуется пустая лицензия для авторизованных узлов", + "ORG_ZSTACK_STORAGE_PRIMARY_10039": "Первичное хранилище[uuid:%s] не существует", + "ORG_ZSTACK_V2V_10019": "Первичное хранилище с UUID:%s не поддерживается для миграции виртуальных машин v2v", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10007": "Не удалось перейти к снимку тома [uuid:%s, name:%s] из-за события статуса [%s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10006": "Не удалось получить размер тома[uuid:%s, installPath:%s] с первичного хранилища[uuid:%s], из-за %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10005": "Не удалось получить размер тома[uuid:%s, installPath:%s] с первичного хранилища[uuid:%s], %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10004": "Виртуальная машина[uuid:%s] не находится в состоянии Running, Paused, Destroyed или Stopped; текущее состояние[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_10040": "Первичное хранилище[uuid=%s] не существует в облачной среде", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10003": "Том не найден для UUID тома: %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10002": "Снимок или его потомок имеет ссылку на том[uuids:%s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10001": "Невозможно найти снимок тома [uuid:%s, name:%s], он мог быть удален предыдущей операцией", + "ORG_ZSTACK_STORAGE_PRIMARY_10047": "cidr[%s] Неверный формат ввода", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10050": "ZSha2 указывает на присутствие другого управляющего узла; однако этот узел не найден в базе данных. Пожалуйста, проверьте существование управляющего узла.", + "ORG_ZSTACK_STORAGE_PRIMARY_10046": "Разрешена только одна системная метка CIDR для первичного хранилища, но получено %d", + "ORG_ZSTACK_STORAGE_PRIMARY_10049": "конфликт clusterUuid, кластер, указанный в предложении экземпляра: %s, а кластер, указанный в параметре создания: %s", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10052": "App ID для отмены регистрации не найден! Пожалуйста, проверьте App ID и попробуйте снова.", + "ORG_ZSTACK_STORAGE_PRIMARY_10042": "Пожалуйста, укажите тип экземпляра и требуемое хранилище перед выделением ресурсов.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10008": "невозможно сбросить том[uuid:%s] к снимку[uuid:%s], том ВМ[uuid:%s] не находится в состоянии Stopped, текущее состояние: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10044": "невозможно найти подходящее основное хранилище; ошибки: %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10000": "не удалось обновить статус группы: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10050": "конфликт primaryStorageUuid, основное хранилище, указанное в предложении экземпляра: %s, а основное хранилище, указанное в параметре создания: %s", + "ORG_ZSTACK_V2V_10008": "Не допускается одинаковый MAC-адрес [%s] в сети[%s]", + "ORG_ZSTACK_V2V_10009": "Дублирующийся MAC-адрес [%s] в сети[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_10052": "конфликт primaryStorageUuid, основное хранилище, указанное в предложении диска: %s, а основное хранилище, указанное в параметре создания: %s", + "ORG_ZSTACK_V2V_10006": "базовый вычислительный экземпляр хоста конвертации[uuid:%s] должен быть в состоянии Connected", + "ORG_ZSTACK_V2V_10007": "хост конвертации[uuid:%s] не может установить соединение с основным хранилищем[uuid:%s]", + "ORG_ZSTACK_V2V_10004": "Экземпляр ВМ [UUID:%s] не существует или не является экземпляром VMware VM", + "ORG_ZSTACK_V2V_10005": "conversionHostUuid не должен быть null. Пожалуйста, убедитесь, что предоставлен корректный UUID хоста.", + "ORG_ZSTACK_V2V_10002": "путь хранилища хоста v2v конвертации должен быть абсолютным путем. Пожалуйста, укажите корректный абсолютный путь.", + "ORG_ZSTACK_V2V_10003": "неверный v2v URL: %s", + "ORG_ZSTACK_V2V_10000": "Статус хоста [uuid:%s] должен быть Connected перед продолжением развёртывания в облаке.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10021": "Невозможно создать снимок памяти, ожидаемые состояния ВМ: [%s, %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10020": "снимок тома[uuids:%s] находится в отключённом состоянии и не может быть использован для восстановления тома.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10029": "не удалось отменить задачу удаления. Том[uuid:%s] с присоединённой ВМ не в состоянии %s; автономное удаление снимков не поддерживается и не может быть отменено.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10028": "не удалось отменить задачу удаления. Том[uuid:%s] связан с несуществующей виртуальной машиной; автономное удаление снимков не поддерживает отмену.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10027": "не удалось отменить задачу удаления. Том[uuid:%s] не присоединён ни к какой ВМ, и автономное удаление снимков не поддерживает отмену.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10026": "не удалось отменить задачу удаления. Том[uuid:%s] не существует.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10025": "невозможно найти UUID тома для снимков[uuid: %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10024": "Не поддерживается удаление снимков из разных томов [UUID: %s, %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10023": "исходный том для снимка [uuid:%s] был удалён; невозможно восстановить том в исходное состояние", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10022": "снимок тома [uuid:%s] находится в состоянии %s и не может быть использован для восстановления тома", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10018": "невозможно найти снимок: %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10017": "основное хранилище[uuid:%s] не поддерживает снимки томов; therefore, снимок для тома[uuid:%s] не может быть создан.", + "ORG_ZSTACK_YUNSHAN_UTIL_10000": "NSP URL равен null, пожалуйста, настройте NSP для Облачной Вычислительной Службы.", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10016": "невозможно запросить основное хранилище [uuid:%s] для возможности снимка тома", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10015": "невозможно найти тип для основного хранилища [%s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10012": "Неподдерживаемое максимальное количество снимков (%d) для тома [UUID:%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10027": "Тест соединения SanSecClientFactory не пройден", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10019": "этот тип ресурса %s не поддерживает запрос ссылок на снимки памяти", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10007": "panguPartitionUuid [%s] не соответствует identityZoneUuid [%s]", + "ORG_ZSTACK_APPLIANCEVM_10006": "виртуальное устройство [uuid:%s] находится в статусе %s и не может выполнить HTTP-вызов к %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10006": "необходимо указать panguPartitionUuid или identityZoneUuid", + "ORG_ZSTACK_AI_10120": "центр моделей [uuid:%s] не найден в облачной среде", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10008": "невозможно удалить зону идентификации [%s], так как она все еще содержит экземпляры основного хранилища Aliyun Ebs, убедитесь, что все связанные ресурсы хранения удалены", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10061": "невозможно изменить правило группы безопасности, так как протокол [%s] не допускает пустой диапазон портов назначения", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10060": "невозможно изменить правило группы безопасности, так как указанный протокол [%s] не поддерживает установку диапазона портов назначения", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10063": "невозможно изменить правило группы безопасности, так как дублирующееся правило [%s] уже существует в базе данных с UUID %s", + "ORG_ZSTACK_APPLIANCEVM_10000": "ошибка установки информации загрузки устройства:%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10062": "невозможно изменить правило группы безопасности, так как указанный протокол [%s] требует установки диапазона портов назначения", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10033": "невозможно удалить предложение экземпляра [uuid:%s], так как оно используется группами экземпляров NFV [%s]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10001": "ALIYUN EBS НЕ ПОДДЕРЖИВАЕТ ИЗМЕНЕНИЕ РАЗМЕРА РАБОТАЮЩЕЙ ВМ В НАСТОЯЩЕЕ ВРЕМЯ", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10031": "Невозможно подготовить группу экземпляров NFV [uuid:%s, name:%s], когда статус не инициализирован", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10000": "невозможно найти путь к устройству из тома: %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10032": "Невозможно подготовить NfvInstanceGroup[uuid:%s, name:%s] без экземпляров-членов. Создайте хотя бы один экземпляр NFV в группе перед подготовкой", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10003": "ISO [%s] подключен. Отключите ее перед повторным подключением", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10006": "недопустимый CPU [CPU_ID], хост [HOST_UUID] не имеет CPU с указанным ID [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10030": "Невозможно подготовить NfvInstanceGroup[uuid:%s, name:%s] без настроенного виртуального IP. Настройте виртуальный IP для группы перед подготовкой", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10005": "URL должен начинаться с http:// или https://, но получено %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10004": "URL для конечной точки Ocean должен быть настроен для основного хранилища Alibaba Cloud EBS", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10019": "Имя[%s] недопустимо для ресурса. Имя должно соответствовать следующим требованиям:", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10013": "- Длина от 1 до 128 символов.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10012": "- Состоять из прописных и строчных букв, цифр, подчеркиваний (_) и дефисов (-).", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10018": "- Начинаться с буквы.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10028": "- Не начинаться и не заканчиваться пробелом.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10017": "В кластере [uuid:%s] не найден шлюз BareMetal2", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10010": "не удалось создать новый CloudFile[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10029": "NfvInstanceGroup [uuid:%s] не найден", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10026": "Невозможно отсоединить экземпляр NFV [uuid:%s] от группы [uuid:%s, name:%s], так как он является единственным участником. Группа должна содержать как минимум одного участника.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10027": "Невозможно отсоединить экземпляр NFV [uuid:%s] от группы [uuid:%s, name:%s], так как он является единственным работающим участником. По крайней мере один дополнительный участник должен находиться в состоянии Running.", + "ORG_ZSTACK_AI_10129": "Получено неожиданное значение null из %s токена: %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10024": "Экземпляр NFV [uuid:%s] не найден", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10016": "ошибка проверки подписи входного %s при валидации облачного ресурса", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10025": "Невозможно отсоединить экземпляр NFV [uuid:%s] от группы [uuid:%s, name:%s], так как он в данный момент не связан. Текущее состояние деталей: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10003": "резервное хранилище [UUID: %s] не связано с зоной [UUID: %s], к которой принадлежит основное хранилище [UUID: %s]", + "ORG_ZSTACK_AI_10127": "Параметр mode не должен быть пустым. Пожалуйста, укажите допустимое значение mode.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10011": "не удалось выделить вычислительный узел в кластерах [uuids:%s] для экземпляра baremetal [uuid:%s]", + "ORG_ZSTACK_AI_10128": "текущие допустимые значения: ['%s']", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10010": "не удалось выделить шлюз в кластерах [uuids:%s] для экземпляра baremetal [uuid:%s]", + "ORG_ZSTACK_AI_10125": "Неверная классификация модели: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10004": "том [uuid:%s] уже подключен к работающей ВМ. ВМ должна быть остановлена перед подключением тома.", + "ORG_ZSTACK_AI_10126": "Неверная конфигурация сохранена для ModelServiceVO[uuid: %s]: %s", + "ORG_ZSTACK_AI_10123": "невозможно найти центр модели с UUID: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10015": "предоставленный IP %s выходит за пределы диапазона DHCP %s ~ %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10014": "предоставленный IP %s уже занят другим экземпляром", + "ORG_ZSTACK_AI_10121": "Экземпляр Model Center не найден, пожалуйста, сначала создайте экземпляр Model Center.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10013": "Только кластеры BareMetal2 [UUID:%s] соответствуют требованиям для шасси и шлюза, но к этим кластерам не подключена подготовленная сеть.", + "ORG_ZSTACK_STORAGE_PRIMARY_10000": "невозможно подключить ISO к основному хранилищу [uuid:%s], которое отключено", + "ORG_ZSTACK_AI_10122": "не удалось создать системный тег для ModelServiceInstanceGroupVO[uuid: %s], причина: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10012": "узел baremetal2 не найден в кластере [uuid:%s]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10019": "неверный путь установки: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10010": "добавлен ID тома: %s, но другой ID тома уже существует в URL: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10012": "hostUuid [%s] уже существует в URL: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10014": "неверный URL установки: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10015": "невозможно найти путь к устройству на хосте: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10008": "Кластер вычислений Baremetal2 не найден", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10002": "не удалось создать vHost User Client на хосте[uuid:%s] для ВМ[uuid:%s] : %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10007": "Недостаточно данных для определения используемого кластера BareMetal2.%s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10006": "к зоне [uuid:%s] не присоединено хранилище резервных копий, содержащее ISO [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10005": "не удается найти образ с UUID [%s] ни в одном подключенном хранилище резервных копий. Пожалуйста, проверьте следующее:", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10000": "Убедитесь, что хранилище резервных копий присоединено к зоне, где находится виртуальная машина (ВМ) с именем [%s] и UUID [%s].", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10009": "Подтвердите, что хранилище резервных копий находится в подключенном состоянии. Если нет, попробуйте переподключить его.", + "ORG_ZSTACK_STORAGE_PRIMARY_10014": "не удалось удалить vHost User Client на хосте[uuid:%s] для ВМ[uuid:%s] : %s", + "ORG_ZSTACK_AI_10116": "не удалось выделить основное хранилище в кластерах [uuids:%s] для экземпляра bare metal [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10000": "основное хранилище с UUID:%s не может быть удалено, так как оно все еще присоединено к кластеру с UUID:%s.", + "ORG_ZSTACK_AI_10117": "Не удается найти группы экземпляров сервисов в облачной среде. Пожалуйста, проверьте конфигурацию.", + "ORG_ZSTACK_STORAGE_PRIMARY_10016": "экземпляр baremetal2[uuid:%s] не существует или не подключен; поэтому его пароль не может быть изменен.", + "ORG_ZSTACK_AI_10114": "Не удается найти набор данных с UUID [%s]", + "ORG_ZSTACK_AI_10115": "невозможно присоединить том[uuid:%s], основное хранилище которого находится на обслуживании", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10004": "группа экземпляров сервиса модели [UUID: %s] не найдена; прерывание проверки активности ожидания запуска сервиса", + "ORG_ZSTACK_AI_10112": "Необходимо указать либо 'UUID групп', либо 'Синхронизировать все'", + "ORG_ZSTACK_AI_10113": "не удается найти образ с UUID [%s] ни в одном подключенном хранилище резервных копий, связанном с UUID зоны [%s]. Пожалуйста, проверьте следующее:", + "ORG_ZSTACK_AI_10111": "Убедитесь, что хранилище резервных копий присоединено к правильной зоне, где находится ВМ с именем [%s] (UUID: %s).", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10001": "Подтвердите, что хранилище резервных копий находится в подключенном состоянии; если нет, попробуйте переподключить его.", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10037": "Неподдерживаемый тип сервиса модели: %s, невозможно найти соответствующий бэкенд для обработки операций перезапуска", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10003": "группа экземпляров сервиса модели [UUID: %s] не найдена, пропуск процесса ожидания запуска сервиса", + "ORG_ZSTACK_STORAGE_PRIMARY_10018": "Не удается найти экземпляр сервиса модели[uuid: %s]", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10032": "Не удалось получить информацию об интерфейсе LLDP, так как он не настроен для приема данных.", + "ORG_ZSTACK_STORAGE_PRIMARY_10017": "Не удается найти лицензированный авторизованный узел с UUID [%s]", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10033": "получение ссылки LLDP для[%s] не удалось", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10085": "zoneUuids, clusterUuids и primaryStorageUuids должны содержать хотя бы один непустой список, либо все значения должны быть установлены в true.", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10000": "Нелицензированные узлы не должны существовать перед обновлением до лицензированной серверной среды. Пожалуйста, убедитесь, что все узлы имеют действующие лицензии перед процессом обновления.", + "ORG_ZSTACK_STORAGE_PRIMARY_10019": "outputProtocol[%s] уже существует на основном хранилище[%s], нет необходимости добавлять снова", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10087": "Некоторые связанные лицензированные виртуальные узлы не были завершены.%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10011": "группа безопасности с UUID:%s не была связана с сетью L3 UUID:%s, отсоединение невозможно", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10086": "Невозможно удалить правила группы безопасности из другой группы безопасности", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10089": "L3 сеть [uuid:%s] не имеет включенного типа сетевой службы [%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10088": "Группа безопасности с UUID:%s была связана с L3 сетью UUID:%s; поэтому она не может быть присоединена снова.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10010": "Невозможно создать экземпляр NFV, группа [uuid:%s, name:%s] уже имеет %d членов, максимально допустимое количество - 3", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10026": "relativeTime [%s] недействителен, он превышает максимально допустимое значение", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10025": "relativeTime [%s] недействителен; он должен быть указан в формате, например, 10s или 1h.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10008": "Невозможно создать экземпляр NFV, когда группа [uuid:%s, name:%s] находится в активном режиме. Пожалуйста, сначала переключите в режим обслуживания.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10009": "Невозможно создать экземпляр NFV, когда группа [uuid:%s, name:%s] имеет статус %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10006": "nfv экземпляр %s [uuid: %s] группы nfv экземпляров %s [uuid: %s] haStatus изменился с %s на %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10039": "том vhost не поддерживает присоединение к bareMetalInstance2", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10038": "NIC с MAC:%s не может быть присоединен к L3 сети, так как он был объединен в-bond", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10004": "Все узлы не находятся в ожидаемом состоянии для облачного развертывания. Пожалуйста, проверьте статус всех узлов и убедитесь, что они соответствуют необходимым условиям для работы.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10002": "создание affinity группы для группы экземпляров NFV [uuid:%s] не удалось", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10033": "customMAC является обязательным при присоединении L3 сети к BareMetal экземпляру.", + "ORG_ZSTACK_STORAGE_PRIMARY_10024": "основное хранилище(а) [uuid: %s], где расположены тома, не включено или не подключено", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10032": "тип L2 сети %s не поддерживается экземплярами Baremetal2.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10031": "только L3 сеть с версией IP %d поддерживается экземпляром Baremetal2", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10031": "Только сервер лицензий имеет право отменять регистрацию лицензированного клиентского экземпляра.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10030": "Экземпляр Baremetal2 [uuid:%s] не был выделен для вычислительного узла; пожалуйста, запустите экземпляр и попробуйте снова.", + "ORG_ZSTACK_STORAGE_PRIMARY_10021": "основное хранилище и кластер не находятся в одной зоне доступности [uuid:%s] [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10037": "MAC адрес %s уже назначен, пожалуйста, попробуйте другой", + "ORG_ZSTACK_STORAGE_PRIMARY_10020": "основное хранилище [uuid:%s] было присоединено к кластеру [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10036": "baremetal2 экземпляр [uuid:%s], работающий на шасси [uuid:%s], не имеет не-provisioning NIC с MAC адресом %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10023": "'UUID' и 'Type' должны быть установлены одновременно для обоих или ни для одного!", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10035": "дублирующийся MAC адрес %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10022": "URL [%s] уже используется и не может быть дублирован в пределах одного кластера.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10034": "%s не является допустимым MAC адресом", + "ORG_ZSTACK_AI_10130": "Получено неожиданное значение: %s от %s, ожидаемые значения находятся в пределах определенного диапазона для метрик облачных ресурсов", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10026": "недопустимый тип лицензии %s для облачной вычислительной среды", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10027": "При регистрации сервера лицензий не должно быть авторизованных виртуальных машин.%s", + "ORG_ZSTACK_STORAGE_PRIMARY_10029": "невозможно зарезервировать %s байт на основном хранилище[uuid:%s], недостаточно доступной емкости", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10093": "Сетевые интерфейсы VM с UUIDs:%s не находятся в сетях L3, связанных с группой безопасности UUID:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_10028": "После вычитания зарезервированной емкости недостаточно основного хранилища необходимого размера, возможно, из-за более низкого порога для настройки физической емкости основного хранилища.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10096": "невозможно добавить правило группы безопасности, так как существует дубликат UUID в remoteSecurityGroupUuids: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10095": "невозможно добавить правило группы безопасности, так как список правил не может быть пустым или превышать максимальное количество %d", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10098": "UUID удаленной группы безопасности конфликтует с существующей записью. Пожалуйста, проверьте и обновите правило группы безопасности.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10022": "Невозможно отсоединить экземпляр NFV от группы[uuid:%s, name:%s] в нормальном операционном режиме. Сначала переключитесь в режим обслуживания.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10097": "невозможно добавить правило группы безопасности, так как группа безопасности[uuid:%s] не существует", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10023": "Невозможно отсоединить экземпляр NFV от группы[uuid:%s, name:%s], когда статус %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10020": "Невозможно присоединить экземпляр NFV к группе[uuid:%s, name:%s]. Статус группы: %s с %d участниками. Присоединение разрешено только когда: группа пуста или находится в состоянии Healthy/Degraded с 1-2 участниками.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10099": "невозможно добавить правило группы безопасности, так как приоритет должен быть больше %d или равен %d", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10018": "недопустимое направление[%s], поддерживаются только разрешенные направления", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10024": "недопустимый тип[%s], допускаются только примитивные типы или часто используемые ссылочные типы", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10019": "Невозможно присоединить экземпляр NFV к группе[UUID: %s, Name: %s], когда его статус %s", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10023": "недопустимое значение[%s], должно быть числом с плавающей точкой", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10029": "экземпляр baremetal2[uuid:%s] не остановлен и не может быть изменен на другое шасси offering.", + "ORG_ZSTACK_STORAGE_PRIMARY_10030": "После удаления основного хранилища%s во избежание нет доступных кандидатов основного хранилища. Пожалуйста, проверьте статус и состояние основного хранилища в кластере.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10022": "недопустимое значение[%s], должно быть числом с плавающей точкой больше нуля и меньше единицы", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10017": "Невозможно присоединить экземпляр NFV[uuid:%s] к группе[uuid:%s, name:%s]. Экземпляр уже является частью этой группы со статусом кластера %s. Присоединение не допускается, когда экземпляр находится в состояниях Leader, Follower, Leaving или Joining Candidate.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10021": "недопустимые аргументы %s, в данном контексте аргументы не разрешены", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10018": "Невозможно присоединить экземпляр NFV к группе[UUID:%s, Name:%s] в нормальном режиме работы. Сначала переключите группу в режим обслуживания.", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10020": "недопустимое значение[%s], должен быть допустимый числовой тип (int, long, float, double) в облачных вычислительных средах", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10015": "syncNfvInstGroup разрешен только в режиме обслуживания. Текущий режим: %s. Сначала переключитесь в режим обслуживания.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10013": "Невозможно изменить операционный режим в состоянии INITIALIZING. Пожалуйста, убедитесь, что группа готова перед внесением изменений. Текущий статус: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10036": "PrimaryStorageTagAllocatorExtensionPoint[%s] возвращает нуль подходящих кандидатов основного хранилища", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10022": "Текущая операция не поддерживается на локальном экземпляре baremetal. Пожалуйста, убедитесь, что операция выполняется в виртуализированной среде.", + "ORG_ZSTACK_STORAGE_PRIMARY_10035": "PrimaryStorageFeatureAllocatorFlow[%s] возвращает нуль жизнеспособных кандидатов основного хранилища", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10021": "Экземпляру bare metal не разрешено изменять настройки сети VM NIC. Пожалуйста, убедитесь, что вы используете совместимый тип экземпляра.", + "ORG_ZSTACK_STORAGE_PRIMARY_10038": "%s недопустим. %s не является допустимым UUID экземпляра", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10020": "Только поддержка VPC сети для присоединения EIP к экземплярам BareMetal2.", + "ORG_ZSTACK_STORAGE_PRIMARY_10037": "основное хранилище [uuid:%s] не находится в подключенном состоянии, текущий статус: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10026": "экземпляр baremetal2 [uuid:%s] работает, но его агент не подключен", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10025": "экземпляр baremetal2 [uuid:%s] не выключен", + "ORG_ZSTACK_STORAGE_PRIMARY_10034": "не удается найти основное хранилище с пользовательским тегом [%s]. Пользовательский тег указывается в предложении экземпляра или предложении диска", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10024": "экземпляр baremetal2 [uuid:%s] не подключен", + "ORG_ZSTACK_STORAGE_PRIMARY_10033": "не удается найти основное хранилище [uuid:%s], UUID указан в спецификации предложения экземпляра или предложения диска", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10023": "операция не поддерживается для экземпляров BareMetal2. Пожалуйста, обеспечьте совместимость с виртуализированными средами", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10051": "шасси baremetal2 с UUID:%s не существует", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10050": "нет необходимости устанавливать chassisOfferingUuid, так как экземпляру уже назначено предложение шасси", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10021": "не удалось установить группу безопасности для сетевого интерфейса VM, так как указанная группа безопасности [uuid:%s] не принадлежит вашей учетной записи [uuid:%s] или администратору", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10020": "не удалось установить группу безопасности для сетевого интерфейса VM из-за дублирующейся группы безопасности [uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10023": "не удалось установить группу безопасности для сетевого интерфейса VM из-за недопустимого приоритета; ожидались последовательные приоритеты, но найдены %d и %d", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10022": "не удалось установить группу безопасности для сетевого интерфейса VM из-за недопустимого приоритета; приоритет должен начинаться с 1, но [%d]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10025": "не удалось установить группу безопасности для сетевого интерфейса VM, так как приоритет административной группы безопасности [%d] должен быть выше, чем у пользовательских групп", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10027": "не удалось изменить состояние правила группы безопасности, так как группа безопасности [uuid:%s] не найдена", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10026": "не удалось обновить состояние правила группы безопасности, так как список UUID правил пуст. Пожалуйста, укажите допустимые UUID правил для продолжения", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10029": "не удалось изменить состояние правила группы безопасности, так как нет правил группы безопасности, требующих изменения состояния", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10028": "не удалось изменить состояние правила группы безопасности, так как правило группы безопасности [uuid:%s] не найдено", + "ORG_ZSTACK_ZWATCH_10004": "некоторые сообщения истекли и не допускают изменения из-за ограничений системы. Система автоматически очистит эти истекшие сообщения. Пожалуйста, повторите операцию позже", + "ORG_ZSTACK_ZWATCH_10003": "недопустимый тип действия: %s, поддерживаются только операции записи или удаления", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10054": "шасси baremetal2 [uuid:%s] уже выделено для другого ресурса", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10053": "шасси baremetal2 [uuid:%s] не включено", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10052": "шасси baremetal2 [uuid:%s] не связано с предложением шасси [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10059": "пожалуйста, не указывайте одновременно UUID шасси и UUID предложения шасси", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10057": "кластер [uuid:%s] указан, но он не является включенным кластером Baremetal2; следовательно, экземпляр Baremetal2 не может быть создан из него", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10056": "зона [uuid:%s] указана, но она не включена; следовательно, экземпляр baremetal2 не может быть создан", + "ORG_ZSTACK_AI_SERVICE_10001": "не удалось найти VO службы разработки приложений с UUID модели сервиса: %s и UUID учетной записи: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10040": "сторонний Ceph нельзя смешивать с другими типами основного хранилища. Пожалуйста, обеспечьте согласованность в конфигурации хранилища", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10030": "не удалось изменить политику безопасности сетевого интерфейса VM, так как и входящая, и исходящая политики не могут быть пустыми. Пожалуйста, убедитесь, что определена хотя бы одна политика", + "ORG_ZSTACK_ZWATCH_10002": "недопустимый возврат zwatch с условием: %s, %s", + "ORG_ZSTACK_ZWATCH_10001": "неизвестный параметр[%s] в предложении возврата zwatch, убедитесь, что это допустимый параметр для указанной облачной вычислительной среды", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10032": "", + "ORG_ZSTACK_AI_SERVICE_10005": "не удалось изменить политику безопасности VM NIC из-за недопустимой политики egress[%s]", + "ORG_ZSTACK_AI_SERVICE_10004": "", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10031": "Нет задач, требующих тестирования, отмечено как сбой.%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10034": "", + "ORG_ZSTACK_AI_SERVICE_10003": "Не удается найти экземпляр службы; убедитесь, что экземпляр правильно создан и связан с вашей задачей оценки. Отправка задачи не удалась.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10033": "", + "ORG_ZSTACK_AI_SERVICE_10002": "не удалось изменить политику безопасности VM NIC из-за недопустимого правила ingress[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10036": "", + "ORG_ZSTACK_AI_SERVICE_10008": "не удалось изменить политику безопасности VM NIC, потому что VM NIC [UUID:%s] не имеет связанной политики безопасности", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10035": "", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10038": "невозможно найти группу служб с UUID [%s], доступную для отправки задачи оценки, сообщается о сбое", + "ORG_ZSTACK_AI_SERVICE_10006": "", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10037": "не удалось изменить политику безопасности VM NIC, потому что VM NIC [uuid:%s] не найдена", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10039": "", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10049": "Группа экземпляров модели службы [UUID: %s] для тестирования не имеет доступных URL-адресов.", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10004": "", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10044": "не удалось обновить приоритет правила группы безопасности, потому что группа безопасности [uuid:%s] не существует", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10043": "", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10042": "Все вычислительные экземпляры не удалось запустить.%s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10041": "", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10047": "не удалось обновить приоритет правила группы безопасности из-за недопустимого типа[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10046": "", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10045": "не удалось обновить приоритет правила группы безопасности, потому что количество правил в группе безопасности [uuid:%s] не соответствует ожидаемому количеству", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10029": "", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10028": "Ошибка при запуске оценки на %s, потому что %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10073": "", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10072": "Не удалось обновить приоритет правила группы безопасности, потому что список правил пуст. Убедитесь, что правила определены перед попыткой этой операции.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10041": "", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10071": "образ[uuid:%s] не готов, невозможно создать экземпляр baremetal2 из него", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10040": "невозможно обновить приоритет правила группы безопасности, так как приоритет[%d] дублируется", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10070": "образ[uuid:%s] не включен; поэтому экземпляр baremetal2 не может быть создан из него.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10043": "невозможно обновить приоритет правила группы безопасности, так как существует дублирующийся UUID правила", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10021": "неверный путь установки снимка: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10042": "невозможно обновить приоритет правила группы безопасности, так как указанный приоритет [%d] не существует в группе безопасности [uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10045": "невозможно изменить правило группы безопасности, так как указанное правило является правилом по умолчанию; можно обновить только описание и статус", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10044": "невозможно изменить правило группы безопасности, так как указанное правило группы безопасности с UUID[%s] не существует", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10022": "Основное хранилище Alibaba Cloud EBS[UUID:%s, Name:%s] не может найти доступный хост в присоединенных кластерах для создания тома.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10047": "невозможно изменить правило группы безопасности, так как группа безопасности %s превысила свой максимальный лимит в %d правил", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10025": "невозможно найти снимок в образе: %s, возможно, образ был удален", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10046": "невозможно изменить правило группы безопасности, так как приоритет правила [%s] не может быть установлен на приоритет правила по умолчанию [%d]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10024": "Облачная среда не поддерживается", + "ORG_ZSTACK_COMPUTE_CPUPINNING_10002": "Указан недопустимый cpuset [%s] для конфигурации экземпляра. Пожалуйста, убедитесь, что cpuset допустим и ссылается на правильный набор ядер ЦП.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10049": "невозможно изменить правило группы безопасности из-за недопустимого состояния[%s]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10027": "не удалось установить tdc на следующих хостах: [%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10048": "невозможно изменить правило группы безопасности из-за максимального лимита приоритета %s правила, равного [%d]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10026": "не удалось установить соединение со следующими кластерами: [%s]", + "ORG_ZSTACK_COMPUTE_CPUPINNING_10000": "недопустимая ссылка CPU pinning[%s]. Правильные примеры: [1,3:3-6,^5] или [1-2,4:6].", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10004": "невозможно сгенерировать vhost-user клиент для виртуальной машины [uuid:%s] на целевом хосте [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10077": "архитектура baremetal2 кластера[arch:%s] и образа[arch:%s] не совпадают", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10076": "Обнаружены разные режимы загрузки между экземпляром и образом или предложением. Пожалуйста, убедитесь, что они совпадают.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10075": "поддерживаются только образы с режимом загрузки %s для создания экземпляров Baremetal2", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10074": "образ[uuid:%s] не является образом BareMetal2; поэтому он не может быть использован для создания экземпляра BareMetal2.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10079": "Основное хранилище для корневого тома и основное хранилище для тома данных должны находиться в одном кластере.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10078": "не все дисковые предложения [UUIDs:%s] включены; поэтому экземпляр BareMetal2 не может быть создан из них.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10050": "невозможно изменить правило группы безопасности из-за недопустимого действия[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10062": "предложение baremetal2 шасси[uuid:%s] не включено; поэтому экземпляр baremetal2 не может быть создан из него.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10061": "baremetal2 шасси[uuid:%s] не доступно; поэтому экземпляр baremetal2 не может быть создан из него.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10060": "baremetal2 шасси с UUID:%s не включено; поэтому экземпляр baremetal2 не может быть создан из него.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10051": "невозможно изменить правило группы безопасности из-за недопустимого протокола[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10054": "невозможно изменить правило группы безопасности, поскольку указан диапазон исходных IP [%s]; UUID удаленной группы безопасности [%s] должен быть пустым", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10031": "Aliyun EBS PrimaryStorage поддерживает только тип Aliyun EBS BS, фактически получен тип: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10056": "невозможно изменить правило исходящего трафика группы безопасности, поскольку диапазон исходных IP не может быть указан для типа Egress", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10034": "ресурс[uuid: %s] не найден", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10055": "невозможно изменить правило входящего трафика группы безопасности, поскольку dstIpRange не может быть указан для этого правила[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10058": "невозможно изменить правило группы безопасности, поскольку удаленная группа безопасности [uuid:%s] не найдена", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10057": "невозможно изменить правило группы безопасности, поскольку указан диапазон назначения IP [%s]; UUID удаленной группы безопасности [%s] должен быть пустым", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10059": "невозможно изменить правило группы безопасности, поскольку настроена удаленная группа безопасности [UUID:%s]; диапазон исходных IP и диапазон назначения IP должны быть пустыми", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10066": "образ не может быть пустым, если шасси находится в прямом режиме", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10065": "baremetal2 шлюз с UUID: %s не расположен в том же кластере, что и шасси с UUID: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10064": "baremetal2 шлюз [UUID: %s] не подключен; следовательно, экземпляр baremetal2 не может быть создан из него.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10063": "baremetal2 шлюз с UUID:%s не включен; следовательно, экземпляр baremetal2 не может быть создан из него.", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10069": "Диск шасси[%s] не имеет достаточной емкости для образа[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10068": "образ[uuid:%s] не существует в репозитории образов", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10067": "Прямой режим не поддерживает выбор образов.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREBLOCK_10000": "shareblock указывает, что хост %s недоступен на %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10100": "невозможно добавить правило группы безопасности из-за недопустимого протокола[%s]; допустимые протоколы: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10102": "невозможно добавить правило группы безопасности, поскольку указана недопустимая версия IP [%d]; допустимые версии: %d/%d", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10101": "невозможно добавить правило группы безопасности из-за недопустимого действия[%s]; допустимые действия включают %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10104": "невозможно добавить правило группы безопасности, поскольку разрешенный CIDR [%s] и диапазон назначения IP [%s] конфликтуют", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10103": "невозможно добавить правило группы безопасности, поскольку диапазон исходных IP [%s] не может быть установлен для правила исходящего трафика", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10106": "невозможно добавить правило группы безопасности, поскольку диапазон назначения IP[%s] не может быть установлен для правила входящего трафика", + "ORG_ZSTACK_COMPUTE_HOST_10041": "не удалось проверить VLAN ID [%s] для сетевой связки [%s] на KVM хосте [UUID: %s], %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10105": "невозможно добавить правило группы безопасности, поскольку IP диапазон[%s] и UUID удаленной группы безопасности[%s] конфликтуют", + "ORG_ZSTACK_COMPUTE_HOST_10043": "не удалось проверить VLAN ID [%s] для сетевого интерфейса [%s] на KVM хосте [UUID: %s], %s", + "ORG_ZSTACK_VPC_10048": "адрес DNS [%s] был добавлен к VPC маршрутизатору [uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10107": "невозможно добавить правило группы безопасности, поскольку разрешенный CIDR [%s] конфликтует с диапазоном исходных IP [%s]", + "ORG_ZSTACK_VPC_10047": "vPC L3 сеть должна быть связана с vPC vRouter перед выполнением любых операций, связанных с vRouter (таких как запуск/остановка ВМ, создание балансировщиков нагрузки и т.д.).", + "ORG_ZSTACK_ALIYUN_CORE_10022": "статус задачи моментального снимка завершен %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10109": "не удалось добавить правило группы безопасности, так как тип протокола ALL или ICMP не может установить dstPortRange[%s]", + "ORG_ZSTACK_ALIYUN_CORE_10023": "Эта операция не поддерживается для экземпляров HybridClient. Пожалуйста, используйте совместимый тип клиента.", + "ORG_ZSTACK_ALIYUN_CORE_10021": "задача создания снимка не может завершиться в течение %d миллисекунд, текущий прогресс %d%, статус %s", + "ORG_ZSTACK_ALIYUN_CORE_10026": "Конечная точка Ocean API не может быть пустой. Пожалуйста, укажите корректную конечную точку.", + "ORG_ZSTACK_VPC_10042": "получение состояния службы %s на виртуальном маршрутизаторе %s не поддерживается", + "ORG_ZSTACK_COMPUTE_HOST_10048": "не удалось обновить bonding IP, так как %s", + "ORG_ZSTACK_VPC_10041": "невозможно установить состояние распределенной маршрутизации для виртуального маршрутизатора %s", + "ORG_ZSTACK_ALIYUN_CORE_10024": "accessKey и secretAccessKey должны быть настроены", + "ORG_ZSTACK_VPC_10040": "невозможно получить соединения для распределенной маршрутизации на виртуальном маршрутизаторе %s", + "ORG_ZSTACK_COMPUTE_HOST_10044": "не удалось установить тип службы[%s] для network bonding[%s] на KVM-хосте[UUID: %s], %s", + "ORG_ZSTACK_VPC_10045": "обновление состояния службы %s на виртуальном маршрутизаторе %s не поддерживается", + "ORG_ZSTACK_COMPUTE_HOST_10047": "не удалось обновить IP интерфейса, так как %s", + "ORG_ZSTACK_COMPUTE_HOST_10046": "не удалось установить тип службы[%s] для сетевого интерфейса[%s] на KVM-хосте[UUID: %s], %s", + "ORG_ZSTACK_VPC_10043": "невозможно получить состояние распределенной маршрутизации на виртуальном маршрутизаторе %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10111": "не удалось добавить правило группы безопасности, так как конечный порт [%d] должен быть больше или равен начальному порту [%d]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10110": "Тип протокола ALL или ICMP не поддерживает установку startPort или endPort. Пожалуйста, убедитесь, что протокол соответствует конфигурации правила группы безопасности.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10113": "Для протокола TCP/UDP необходимо указать диапазон портов назначения. Пожалуйста, укажите необходимый диапазон портов и повторите попытку.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10112": "не удалось добавить правило группы безопасности, так как dstPortRange[%s] конфликтует с startPort[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10115": "не удалось добавить правило группы безопасности, так как дублирующееся правило[%s] уже существует в базе данных для указанной группы безопасности", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10114": "не удалось добавить правило группы безопасности, так как правила [%s] и [%s] дублируются", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10117": "не удалось добавить правило группы безопасности, так как группа безопасности %s достигла максимального предела в %d правил", + "ORG_ZSTACK_COMPUTE_HOST_10052": "не удалось получить VLAN ID для хоста [UUID:%s] : %s", + "ORG_ZSTACK_VPC_10039": "не удалось добавить IPv6 диапазон в L3 сеть [uuid:%s], так как он перекрывается с CIDR [%s] виртуального маршрутизатора [uuid:%s]", + "ORG_ZSTACK_ALIYUN_IMAGE_10002": "Операция доступна только для пользовательских образов.", + "ORG_ZSTACK_CORE_CONFIG_10002": "Не удалось найти Global Configuration[категория: %s, имя: %s]", + "ORG_ZSTACK_VPC_10038": "не удалось добавить IP диапазон в L3 сеть [UUID:%s], так как он перекрывается с CIDR [%s] виртуального маршрутизатора [UUID:%s]", + "ORG_ZSTACK_ALIYUN_IMAGE_10003": "Только первичные диски могут создавать зеркала.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10119": "не удалось добавить правило группы безопасности, так как группа безопасности %s превысила максимальный предел в %d правил", + "ORG_ZSTACK_NETWORK_PLUGIN_10001": "освобождение gratuitous ARP по причине:%s", + "ORG_ZSTACK_VPC_10037": "dns адрес [%s] не связан с vpc маршрутизатором [uuid:%s]", + "ORG_ZSTACK_VPC_10036": "dns[%s] не является допустимым IP-адресом", + "ORG_ZSTACK_CORE_CONFIG_10004": "Не разрешать пропуск проверки для облачных ресурсов.", + "ORG_ZSTACK_NETWORK_PLUGIN_10000": "ошибка применения gratuitous ARP из-за:%s", + "ORG_ZSTACK_ALIYUN_IMAGE_10001": "Указанное изображение в настоящее время импортируется в дата-центр...", + "ORG_ZSTACK_ALIYUN_CORE_10011": "невозможно ввести файл нулевой длины как образ ВМ!", + "ORG_ZSTACK_ALIYUN_IMAGE_10006": "Поддерживается только служба резервного копирования хранилища на основе образов", + "ORG_ZSTACK_ALIYUN_IMAGE_10007": "Имя образа не может начинаться с http:// или https://. Пожалуйста, используйте допустимое имя образа.", + "ORG_ZSTACK_ALIYUN_IMAGE_10004": "нет OSS-корзины, связанной с дата-центром: %s", + "ORG_ZSTACK_ALIYUN_IMAGE_10005": "Невозможно удалить системный образ ECS удаленно", + "ORG_ZSTACK_VPC_10031": "L2 сеть [UUID: %s] сети L3 [UUID: %s] не присоединена к кластеру [UUID: %s]", + "ORG_ZSTACK_VPC_10030": "к сети L3[uuid:%s] не присоединены IP-диапазоны", + "ORG_ZSTACK_ALIYUN_CORE_10016": "Пожалуйста, укажите допустимый идентификатор облачного ресурса!", + "ORG_ZSTACK_ALIYUN_CORE_10013": "В доступе отказано для: %s", + "ORG_ZSTACK_VPC_10035": "Сеть L3 [UUID:%s] должна быть сначала присоединена, так как она содержит VIP.", + "ORG_ZSTACK_COMPUTE_HOST_10055": "кластер[uuids:%s, hypervisorType:%s] не существует!", + "ORG_ZSTACK_VPC_10034": "Указанный статический IP-адрес [%s] не соответствует IP-адресам шлюза [%s] сети уровня 3 [UUID: %s].", + "ORG_ZSTACK_ALIYUN_CORE_10017": "Ошибка выполнения Java-кода, код ошибки: %s, сообщение об ошибке: %s", + "ORG_ZSTACK_COMPUTE_HOST_10058": "хост[uuid:%s] не может найти указанный ресурс", + "ORG_ZSTACK_VPC_10033": "шлюз сети l3 [uuid:%s] уже занят другим экземпляром/ip:%s", + "ORG_ZSTACK_ALIYUN_CORE_10018": "Устройство не готово в течение %d миллисекунд", + "ORG_ZSTACK_VPC_10032": "публичная сеть [UUID: %s] VIP [UUID: %s, IP: %s] не может установить пиринг с сетью L3 [UUID: %s], так как она не расположена на VPC VR [UUID: %s]", + "ORG_ZSTACK_COMPUTE_HOST_10019": "поддерживается только создание live-снимков ВМ, когда она находится в состоянии [%s], но ВМ в настоящее время находится в состоянии [%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10120": "не удалось добавить правило группы безопасности, так как приоритет[%d] должен быть последовательным; максимально допустимый приоритет для входящих правил составляет [%d].", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10000": "не удалось получить информацию о лицензии основного хранилища[%s] из-за отсутствия IP-адреса мониторинга", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10001": "не удалось получить информацию о лицензии для основного хранилища[%s], так как данные не были возвращены", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10122": "не удалось применить правила группы безопасности к текущему экземпляру[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10002": "не удалось получить информацию о лицензии основного хранилища [%s], так как время истечения срока действия равно null", + "ORG_ZSTACK_ALIYUN_IMAGE_10008": "для образа UUID: %s не настроено резервное хранилище", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10121": "не удалось добавить правило группы безопасности, так как приоритет[%d] должен быть последовательным; максимально допустимый приоритет для исходящих правил составляет [%d].", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10003": "не удалось разобрать формат даты[%s] информации о лицензии основного хранилища[%s]", + "ORG_ZSTACK_ALIYUN_IMAGE_10009": "Превышена емкость хранилища резервных копий для imageUuid: %s, укажите его вручную", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10124": "сетевая служба[type:%s] не включена в l3 Network[uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10123": "Не удалось применить правила группы безопасности к некоторым виртуальным машинам", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10125": "не удалось изменить приоритет правила[uuid:%s], поскольку оно не найдено", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10128": "сетевая служба[type:%s] не включена в l3 Network[uuid:%s], связанной с nic[uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10127": "vm nic с UUID:%s была присоединена к группе безопасности с UUID:%s", + "ORG_ZSTACK_ALIYUN_IMAGE_10011": "образ [%s] сейчас не включен", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10129": "группа безопасности с UUID [%s] не принадлежит вашей учетной записи с UUID [%s] или администратору", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10004": "виртуальный ID[uuid:%s] не принадлежит организации[uuid:%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10005": "организация[uuid:%s] уже имеет назначенного супервизора", + "ORG_ZSTACK_ALIYUN_CORE_10001": "добавление конечной точки в SDK не удалось, по причине: %s", + "ORG_ZSTACK_ALIYUN_CORE_10005": "accessKey и secretAccessKey должны быть настроены!", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10003": "виртуальный ID[uuid:%s] не существует", + "ORG_ZSTACK_COMPUTE_HOST_10028": "nic[%s] удален", + "ORG_ZSTACK_COMPUTE_HOST_10023": "ошибка операции, потому что %s", + "ORG_ZSTACK_ALIYUN_CORE_10009": "невозможно найти access key id или secret access key из сообщения", + "ORG_ZSTACK_ALIYUN_IMAGE_10010": "допустимая платформа:[%s] для импорта образа Aliyun, допустимые значения: [%s]", + "ORG_ZSTACK_ALIYUN_CORE_10006": "Идентификатор региона должен быть указан!", + "ORG_ZSTACK_COMPUTE_HOST_10038": "удаление файла виртуальной машины не удалось: %s", + "ORG_ZSTACK_COMPUTE_HOST_10037": "установка файла конфигурации виртуальной машины не удалась: %s", + "ORG_ZSTACK_COMPUTE_HOST_10039": "применение memory balloon не удалось: %s", + "ORG_ZSTACK_COMPUTE_HOST_10036": "установка имени хоста VM не удалась: %s", + "ORG_ZSTACK_COMPUTE_HOST_10035": "синхронизация конфигурации порта VM не удалась: %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10009": "неверная метка, поле 'op' пустое или не является допустимым Regex или Equal. %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10008": "неверная метка, поле 'key' не может быть пустым. Пожалуйста, предоставьте допустимое значение ключа.%s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10007": "строка ValueCondition[%s] требует 'value' в качестве ключа", + "ORG_ZSTACK_ZWATCH_DATATYPE_10006": "строка метки[%s] не содержит допустимой операции", + "ORG_ZSTACK_COMPUTE_VM_10319": "VmInstanceDestroyVmExtensionPoint[%s] отказывается завершать работу vm[uuid:%s] по причине %s", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10006": "Тип тома [%s] недопустим.", + "ORG_ZSTACK_COMPUTE_VM_10318": "VmInstanceRebootExtensionPoint[%s] отказывается перезагружать vm[uuid:%s] по причине %s", + "ORG_ZSTACK_COMPUTE_VM_10317": "VmInstanceStartNewCreatedVmExtensionPoint[%s] отказывается запускать ВМ[uuid:%s] из-за %s", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10004": "Не удалось получить идентификаторы снимков для тома %s в Ceph PS[uuid:%s].", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10002": "Не удалось проверить путь установки тома %s в пуле Ceph [uuid:%s].", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10001": "не удалось найти указанный пул[PoolName:%s] в ответе сервиса пулов: %s", + "ORG_ZSTACK_VPC_10006": "VIP[uuid:%s] не найден в облачной среде", + "ORG_ZSTACK_VPC_10005": "не удалось присоединить IPv6 EIP, поскольку тип образа виртуального роутера [UUID:%s] не %s", + "ORG_ZSTACK_VPC_10003": "не удалось установить SSH-соединение с VPC роутером[%s], порт SSH закрыт", + "ORG_ZSTACK_VPC_10009": "VMNic[uuid:%s] не найден", + "ORG_ZSTACK_VPC_10008": "EIP с UUID:%s не найден", + "ORG_ZSTACK_COMPUTE_VM_10316": "Не удалось определить хост ВМ. Пожалуйста, запустите виртуальную машину [%s], а затем попробуйте примонтировать диск.", + "ORG_ZSTACK_COMPUTE_HOST_10005": "не удалось установить задачу синхронизации часов на хосте[uuid:%s]", + "ORG_ZSTACK_ZWATCH_DATATYPE_10001": "недопустимое выражение: %s, связанная функция не найдена в контексте облачных вычислений или виртуализации", + "ORG_ZSTACK_COMPUTE_HOST_10004": "хост[uuid:%s, name:%s] в состоянии[%s], невозможно выполнить требуемую операцию", + "ORG_ZSTACK_COMPUTE_VM_10315": "ошибка шлюза, ожидается: %s, получено: %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10000": "недопустимая функция: %s, недопустимый тип параметра для среды облачных вычислений", + "ORG_ZSTACK_COMPUTE_VM_10314": "ошибка длины префикса IPv6, ожидается значение между %s и %s, получено: %s", + "ORG_ZSTACK_COMPUTE_VM_10313": "Длина префикса IPv6 должна быть настроена", + "ORG_ZSTACK_VPC_10002": "шлюз L3 сети [UUID: %s] уже используется на VPC VR [UUID: %s]", + "ORG_ZSTACK_COMPUTE_VM_10311": "ошибка маски подсети, ожидается: %s, получено: %s", + "ORG_ZSTACK_COMPUTE_HOST_10000": "не удалось синхронизировать информацию о GPU: %s", + "ORG_ZSTACK_VPC_10001": "Нет IP-диапазона для L3 сети[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10310": "Маска подсети должна быть указана", + "ORG_ZSTACK_VPC_10000": "невозможно отсоединить NIC от VPC VR[uuid:%s]", + "ORG_ZSTACK_COMPUTE_HOST_10009": "не удалось выделить PCI устройство для хоста[uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10051": "Неверный формат URI. Правильный пример: ceph:/// или volume://", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10050": "Ceph ps[uuid=%s] Корневое имя пула не найдено", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10052": "ошибка удаления цепочки тома, продолжение удаления тома", + "ORG_ZSTACK_COMPUTE_VM_10320": "VmInstanceStartExtensionPoint[%s] отказывается запускать виртуальную машину[uuid:%s], так как %s", + "ORG_ZSTACK_COMPUTE_HOST_10013": "сетевой интерфейс[name:%s] экземпляра[uuid:%s] не найден", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10008": "шифрование %s[id:%s] не удалось: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_SMP_10000": "основное хранилище с общей точкой монтирования[uuid:%s, name:%s] не может найти доступный хост в подключенных вычислительных кластерах", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10005": "неподдерживаемая операция для EncryptColumnIntegrityFactory в облачной вычислительной среде", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10002": "%s[%s] ошибка проверки целостности, причина: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10000": "%s[%s] ошибка шифрования, причина:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10017": "невозможно найти подключенный KVM-хост для выполнения операции; похоже, что все хосты в кластерах, подключенных к хранилищу с общей точкой монтирования[uuid:%s], отключены.", + "ORG_ZSTACK_VPC_10027": "невозможно присоединить сеть L3 к VPC-роутеру[UUID:%s], так как его состояние не является запущенным или остановленным", + "ORG_ZSTACK_VPC_10025": "VPC-сеть [uuid:%s] уже присоединена к VPC-роутеру [uuid:%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10013": "URL содержит недопустимый путь к каталогу [%s]. Допустимые пути должны находиться в файловой системе экземпляра и не включать специальные каталоги, такие как /dev, /proc или /sys. Пожалуйста, убедитесь, что предоставленный URL корректен.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10042": "не удалось получить наблюдателей образа RBD корневого тома, %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10041": "конфликт пула CEPH, пул CEPH, указанный в дисковом предложении: %s, а пул CEPH, указанный в параметре создания: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10010": "том[uuid:%s] имеет ссылку на том[%s]; поэтому тип тома не может быть изменен до уплощения тома и его потомков.", + "ORG_ZSTACK_VPC_10029": "невозможно присоединить сеть L3 к VPC-роутеру[UUID:%s], так как и его состояние, и состояние пира не являются ни запущенными, ни остановленными", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10044": "невозможно найти пул основного хранилища Ceph[poolName=%s]", + "ORG_ZSTACK_VPC_10020": "сеть l3 [uuid:%s] не может отсоединиться от VPC-роутера [uuid:%s], так как сетевые службы, присоединенные к VIP-адресам [%s], все еще используются.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10043": "корневой том[%s] уже используется (что указывает на наличие активных наблюдателей образа Ceph RBD[%s]), для предотвращения потенциальных сценариев split-brain запуск VM запрещен.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10046": "невозможно выделить пул хранилища для основного хранилища[%s], назначение: %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10045": "пул основного хранилища ceph[poolName=%s] имеет недостаточную доступную виртуальную емкость для размещения запрошенного размера %s.", + "ORG_ZSTACK_VPC_10024": "Только VPC L3 сеть может быть присоединена к VPC vRouter.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10047": "невозможно обновить статус узла MON основного хранилища Ceph [UUID:%s], так как он был удален. Это предупреждение можно игнорировать.", + "ORG_ZSTACK_VPC_10023": "образ предложения виртуального роутера [uuid: %s] отсутствует", + "ORG_ZSTACK_VPC_10022": "предложение виртуального роутера с UUID: %s не включено", + "ORG_ZSTACK_VPC_10021": "VPC L3 сеть [UUID:%s] не может отсоединиться от VPC-роутера [UUID:%s], так как VM NICs [%s] все еще используются.", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10006": "Неподдерживаемая операция в облачной среде. Пожалуйста, убедитесь, что вы используете поддерживаемые API для облачных вычислительных операций.", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10005": "отсутствует параметр, запрошен virtualMachineInstanceUuid: %s", + "ORG_ZSTACK_VPC_10017": "Публичная сеть не может быть отсоединена от исходной виртуальной частной сети.", + "ORG_ZSTACK_VPC_10016": "Сеть маршрута по умолчанию не может быть отсоединена", + "ORG_ZSTACK_VPC_10015": "Управляющая сеть не может быть отсоединена. Пожалуйста, убедитесь, что все зависимые ресурсы были переданы или завершены перед выполнением этой операции.", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10003": "невозможно найти хост с подключением SMP для выполнения команд для основного хранилища SMP [uuid:%s]", + "ORG_ZSTACK_VPC_10014": "виртуальный роутер [uuid:%s] не находится в желаемом состоянии или статусе", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10002": "невозможно найти подключенный хост для выполнения команды для основного хранилища SMP[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10001": "первичное хранилище SMP [uuid:%s] не присоединено ни к одному вычислительному кластеру и поэтому не может удалить корневой том [uuid:%s] виртуальной машины [uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10007": "не удается найти виртуальную машину с UUID: %s", + "ORG_ZSTACK_VPC_10019": "не удалось отсоединить сеть L3 от VPC-роутера [uuid:%s], так как состояния основного и резервного узлов несовместимы", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10008": "не удается найти устройство виртуальной машины с uuid: %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10030": "не удается найти резервное хранилище для загрузки образа [%s] в первичное хранилище [%s] из-за отсутствия готового и доступного образа", + "ORG_ZSTACK_VPC_10018": "не удалось отсоединить сеть L3 от VPC-роутера [uuid:%s], так как его состояние не является запущенным или остановленным", + "ORG_ZSTACK_ALIYUN_CORE_10037": "образ уже существует удаленно; сначала используйте sync для обеспечения согласованности", + "ORG_ZSTACK_ALIYUN_CORE_10035": "запись все еще активна после %s мс", + "ORG_ZSTACK_ALIYUN_CORE_10036": "не удается найти ECS-экземпляр [%s], проверьте его наличие в консоли Aliyun", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10037": "не удается найти подключенный Ceph MON для первичного хранилища [uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10001": "отсутствует параметр: resourceUuid %s, запрошено vmInstanceUuid %s", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10002": "отсутствует обязательный параметр: resource UUID. Укажите корректный resource UUID", + "ORG_ZSTACK_VPC_10012": "виртуальный роутер [uuid:%s] не является VPC-роутером", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10039": "конфликт CEPH-пула, CEPH-пул, указанный в предложении экземпляра: %s, а CEPH-пул, указанный в параметре создания: %s", + "ORG_ZSTACK_VPC_10011": "не удалось обновить состояние сетевого интерфейса [uuid:%s], так как управляющий сетевой интерфейс не поддерживается", + "ORG_ZSTACK_ALIYUN_CORE_10039": "regionId[%s] недействителен согласно Aliyun!", + "ORG_ZSTACK_VPC_10010": "не удалось удалить VM NIC [UUID:%s], так как VM [UUID:%s] является служебной VM. Используйте API APIDetachL3NetworkFromVm", + "ORG_ZSTACK_SNMP_AGENT_10006": "не удалось завершить сеанс агента SNMP [%s] на порту %s, причина: %s", + "ORG_ZSTACK_SNMP_AGENT_10005": "не удалось изменить порт агента SNMP с %s на %s, причина: %s", + "ORG_ZSTACK_SNMP_AGENT_10004": "экземпляр snmp [uuid:%s] не был подготовлен", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10009": "состояние EC2-экземпляра [%s] должно быть запущенным или остановленным", + "ORG_ZSTACK_STORAGE_ZBS_10003": "неверный mdsUrl[%s]. Имя пользователя и пароль SSH должны быть разделены ':' и не могут быть пустыми. Корректный формат mdsUrl: %s", + "ORG_ZSTACK_STORAGE_ZBS_10004": "неверный URL сервиса управления [%s], имя узла не может быть пустым. Корректный формат URL сервиса управления: %s", + "ORG_ZSTACK_STORAGE_ZBS_10002": "неверный MDS URL [%s], часть SSH username:SSH password недействительна. Корректный формат MDS URL: %s", + "ORG_ZSTACK_APPCENTER_10006": "%s требует строковое значение, но получен неверный тип", + "ORG_ZSTACK_APPCENTER_10005": "%s требует булево значение, но получен неверный тип", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10004": "диск [%%s] не присоединен ни к одному экземпляру", + "ORG_ZSTACK_APPCENTER_10004": "%s требует числовое значение, но получен неверный тип", + "ORG_ZSTACK_STORAGE_ZBS_10005": "неверный MDS URL [%s], SSH-порт вне допустимого диапазона (1-65535). Корректный MDS URL должен быть в формате: %s", + "ORG_ZSTACK_APPCENTER_10003": "%s указан в preParameters, но не настроен", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10006": "Только диск с данными может быть подключен к экземпляру ECS.", + "ORG_ZSTACK_APPCENTER_10002": "filterName должен быть установлен в appcenter:true или appcenter:false для правильной конфигурации.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10007": "Диск не может быть подключен ни к одному экземпляру ECS. Убедитесь, что экземпляр ECS находится в состоянии, позволяющем подключение дисков.", + "ORG_ZSTACK_SNMP_AGENT_10003": "не удалось запустить SNMP-агент на порту %s из-за %s", + "ORG_ZSTACK_APPCENTER_10001": "PublishAppVO[uuid: %s] не существует", + "ORG_ZSTACK_SNMP_AGENT_10002": "не удалось запустить SNMP-агент[%s], пожалуйста, проверьте конфигурацию облака[%s]", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10001": "Корневой том экземпляра не может быть удален", + "ORG_ZSTACK_SNMP_AGENT_10001": "Существует более одного экземпляра SnmpAgentVO. Пожалуйста, укажите, какой из них использовать.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10002": "Вы не можете установить свойство deleteWithInstance диска в false, если категория диска ephemeral.", + "ORG_ZSTACK_SNMP_AGENT_10000": "Невозможно создать экземпляр SnmpAgentImpl из-за отсутствия экземпляра SnmpAgentVO. Убедитесь, что SnmpAgentVO правильно настроен и развернут.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10003": "Вы не можете установить свойство deleteWithInstance диска в false, если категория диска cloud и он не является переносимым.", + "ORG_ZSTACK_CORE_WEBHOOK_10000": "Неверный URL[%s]", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10010": "Диск и экземпляры ECS должны находиться в одной зоне доступности", + "ORG_ZSTACK_TEST_AOP_10001": "модульный тест требует сбоя из-за проблем в инфраструктуре облачных вычислений или среде виртуализации", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10015": "Размер диска или ID снимка должны быть указаны в параметрах запроса для создания диска или управления его размером. Пожалуйста, укажите размер диста или используйте существующий снимок.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10016": "Вам не разрешено создавать диск из снимка корневого тома. Пожалуйста, используйте снимок некорневого тома или копию корневого тома для этой операции.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10017": "Имя или описание диска не может начинаться с 'http://' или 'https://'. Пожалуйста, используйте допустимые символы для именования дисков.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10011": "Том [%s] уже подключен к экземпляру [%s]", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10012": "Только диск с данными может быть подключен к экземпляру ECS.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10013": "Невозможно подключить диск к экземпляру, который в данный момент используется. Пожалуйста, остановите экземпляр перед подключением нового диска.", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10014": "Неэластичный диск может быть уничтожен только вместе с связанными экземплярами", + "ORG_ZSTACK_STORAGE_ZBS_10021": "неверное имя логического тома[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10022": "неверное имя пула[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10020": "неверный синтаксис URI для ссылки на облачный ресурс: %s", + "ORG_ZSTACK_STORAGE_ZBS_10025": "не разрешено добавлять дубликат MDS[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10026": "невозможно найти физический ресурс для логического пула[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10023": "Пожалуйста, убедитесь, что настроен хотя бы один вычислительный пул.", + "ORG_ZSTACK_STORAGE_ZBS_10024": "Убедитесь, что настроен хотя бы один экземпляр Metadata Service", + "ORG_ZSTACK_STORAGE_ZBS_10027": "MDS[%s] не найден для zBS первичного хранилища[uuid:%s] узла", + "ORG_ZSTACK_STORAGE_ZBS_10028": "Все узлы MDS первичного хранилища ZBS [uuid:%s] не находятся в состоянии Connected", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10001": "Невозможно удалить предопределенные шаблоны предконфигурации в облачной среде. Пожалуйста, обратитесь в службу поддержки за помощью.", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10002": "Невозможно изменить состояние предопределенных шаблонов конфигурации в этой среде. Пожалуйста, используйте доступные образы виртуальных машин или создайте пользовательские конфигурации вместо этого.", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10000": "Невозможно обновить предопределенные шаблоны типов экземпляров", + "ORG_ZSTACK_MTTYDEVICE_10001": "Устройства mdev, сгенерированные из устройства mtty[uuid:%s], все еще подключены к ВМ", + "ORG_ZSTACK_MTTYDEVICE_10000": "Устройство mtty [UUID:%s] не виртуализировано в ресурсы mdevs", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10004": "Не удается найти VO шаблона предконфигурации с UUID: %s, возможно, он был удален", + "ORG_ZSTACK_MTTYDEVICE_10004": "Хост [UUID:%s], содержащий устройство MTty [UUID:%s], не подключен.", + "ORG_ZSTACK_MTTYDEVICE_10003": "Устройство mtty [UUID:%s] невозможно виртуализировать в mdevs", + "ORG_ZSTACK_HYGON_KVM_10004": "Не удалось получить информацию об устройстве Hygon CPU от хоста[UUID:%s]: %s", + "ORG_ZSTACK_STORAGE_ZBS_10014": "Первичное хранилище ZBS [uuid:%s] могло быть удалено или отсоединено", + "ORG_ZSTACK_STORAGE_ZBS_10015": "Невозможно найти KVM хост [UUID:%s], невозможно развернуть клиент", + "ORG_ZSTACK_STORAGE_ZBS_10012": "Невозможно подключиться к первичному хранилищу ZBS[uuid:%s], не удалось подключить все Metadata Servers", + "ORG_ZSTACK_STORAGE_ZBS_10016": "Информация о дополнении равна null, первичное хранилище[uuid:%s] не готово, пропуск задачи ping", + "ORG_ZSTACK_ZWATCH_DATATYPE_10010": "Неверная метка, поле 'value' не может быть null. Пожалуйста, предоставьте допустимое значение.%s", + "ORG_ZSTACK_STORAGE_ZBS_10017": "Нет доступного логического тома с достаточным пространством[%d] и требуемым URL: %s", + "ORG_ZSTACK_HYGON_KVM_10003": "Не удалось отменить генерацию устройств Hygon IOMMU по причине:%s", + "ORG_ZSTACK_HYGON_KVM_10002": "Невозможно отменить генерацию устройств mdev, к ВМ на хосте[uuid:%s] подключено %d устройств mdev. Сначала остановите или перенесите все затронутые виртуальные машины.", + "ORG_ZSTACK_HYGON_KVM_10001": "Не удается найти CCP устройства для PCI BDF %s на хосте[UUID:%s], сначала синхронизируйте устройства Hygon", + "ORG_ZSTACK_HYGON_KVM_10000": "Не удалось создать устройства Hygon IOMMU по причине:%s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10021": "Невозможно запросить экземпляр InfluxDB, %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10023": "Не удалось изменить политику хранения InfluxDB '%s', %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10000": "Недостаточно физических ресурсов для миграции хранилища ВМ[UUID: %s]; требуемая емкость (включая кэш образа): %s, текущая доступная физическая емкость: %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10024": "Не удалось создать политику хранения InfluxDB '%s', %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10001": "Состояние ВМ[%s] не поддерживается для миграции хранилища", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10025": "Неверный ответ InfluxDB: %s, имя метрики не найдено в столбцах", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10026": "Не удалось создать пользователя по умолчанию для InfluxDB '%s', %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10004": "Отмена экземпляра виртуальной машины не поддерживается", + "ORG_ZSTACK_STORAGE_MIGRATION_10005": "ВМ[uuid: %s] не существует", + "ORG_ZSTACK_STORAGE_MIGRATION_10003": "Неподдерживаемый тип миграции хранилища: с %s на %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10008": "Миграция блочного хранилища ВМ не удалась: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10009": "Целевое основное хранилище не поддерживает операции миграции для текущего хоста. Пожалуйста, убедитесь, что хранилище совместимо с операциями миграции, и повторите попытку.", + "ORG_ZSTACK_STORAGE_MIGRATION_10006": "состояние ВМ [%s] не поддерживается для отмены миграции хранилища", + "ORG_ZSTACK_STORAGE_MIGRATION_10007": "Не удалось определить кандидатов хостов для миграции ВМ `%s`. Пожалуйста, проверьте целевые хосты и сетевое соединение.", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10005": "неверный формат устройства драйвера virtio: %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10004": "не удалось отключить virtio ISO от ВМ[uuid:%s]: не поддерживается", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10003": "не удалось отключить virtio устройство от ВМ[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10002": "не удалось подключить драйвер virtio, так как не удалось прочитать md5 файла[%s] в mn[uuid:%s]: %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10001": "не удалось подключить драйвер virtio из-за неверного MD5 файла[%s] в mn[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10000": "не удалось подключить драйвер virtio, так как не удалось прочитать md5 файла[%s] в mn[uuid:%s]: файл виртуального диска не найден в classpath", + "ORG_ZSTACK_DIRECTORY_10010": "Указанный тип каталога %s не поддерживается; поддерживаемые типы включают %s.", + "ORG_ZSTACK_SCHEDULER_VM_10001": "ВМ[uuid:%s] была завершена, изменение состояния не допускается", + "ORG_ZSTACK_STORAGE_ZBS_10040": "не удалось получить метаданные MDS[%s], пожалуйста, проверьте конфигурацию ZBS", + "ORG_ZSTACK_STORAGE_ZBS_10032": "все серверы метаданных не могут выполнить HTTP-запрос[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10036": "Несоответствие версии MDS[%s] основного хранилища ZBS с управляющим узлом[%s], пожалуйста, переподключите MDS и проверьте SSH-соединение.", + "ORG_ZSTACK_STORAGE_ZBS_10037": "MDaaS URLs не могут быть пустыми или нулевыми", + "ORG_ZSTACK_STORAGE_ZBS_10034": "не удалось синхронизировать метаданные из MDS[%s] основного хранилища ZBS из-за %s", + "ORG_ZSTACK_STORAGE_ZBS_10038": "не удалось обнаружить логические тома со всех экземпляров службы метаданных, детали: %s", + "ORG_ZSTACK_STORAGE_ZBS_10039": "Не удалось установить SSH-соединение или zbs-tools не установлен в MDS[%s]. Пожалуйста, проверьте конфигурацию SSH и убедитесь, что необходимые зависимости установлены.", + "ORG_ZSTACK_DIRECTORY_10006": "обнаружена циклическая зависимость между каталогом %s и каталогом %s, что может привести к конфликтам конфигурации или бесконечному циклу при подготовке виртуальной среды", + "ORG_ZSTACK_DIRECTORY_10003": "Введенное вами имя содержит неподдерживаемые символы. В облачных вычислениях имена могут включать только китайские символы, английские буквы, цифры, пробелы и следующие специальные символы: ()()[]@._-+ . Пожалуйста, убедитесь, что ваше имя соответствует этим требованиям.", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10000": "невозможно найти EventFamily[имя:%s] в шине событий", + "ORG_ZSTACK_DIRECTORY_10004": "все ресурсы zoneUuid должны быть согласованы с zoneUuid[%s] каталога", + "ORG_ZSTACK_DIRECTORY_10001": "типы ресурсов %s не поддерживаются облачным каталогом, допустимые типы: %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10002": "невозможно найти EventFamily[имя:%s, пространство имен:%s] в указанном пространстве имен или репозитории семейств событий", + "ORG_ZSTACK_DIRECTORY_10000": "ресурс %s уже привязан к UUID[%s] каталога; множественные пути не поддерживаются", + "ORG_ZSTACK_NAS_10002": "дублирующая фабрика NasFileSystem для типа[%s]", + "ORG_ZSTACK_NAS_10000": "Файловая система NAS [%%s] еще не существует", + "ORG_ZSTACK_NAS_10001": "невозможно найти фабрику NAS для типа: %s", + "ORG_ZSTACK_DIRECTORY_10009": "Не удалось создать каталог; убедитесь, что путь указан правильно и не превышает четырех уровней виртуальных каталогов.", + "ORG_ZSTACK_DIRECTORY_10008": "дублирующееся имя каталога, том[uuid: %s] с именем %s уже существует", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10011": "недопустимый тег запроса[%s]. Допустимые имена тегов: %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10012": "Существует несколько семейств событий с именем [%s], необходимо указать метку [%s].", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10006": "Виртуальная машина, на которой расположен том данных [%s], имеет снимок памяти; поэтому его нельзя отсоединить.", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10005": "невозможно подключить том %s к экземпляру виртуальной машины %s с группой снимков памяти", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10004": "Виртуальная машина, на которой расположен том данных [%s], имеет снимок памяти; удаление запрещено", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10003": "Том {volume_id} не существует", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10001": "Сеть с L3 сетью [uuid: %s] используется группой снимков томов [uuid: %s]. Пожалуйста, удалите группу снимков томов перед удалением этой L3 сети.", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10000": "UUID сети L3 по умолчанию не существует", + "ORG_ZSTACK_AI_10086": "ModelServiceGroup все еще используется %s, не может быть удален", + "ORG_ZSTACK_AI_10087": "taskUuid не должен быть пустым. Пожалуйста, убедитесь, что он правильно установлен перед отправкой задачи.", + "ORG_ZSTACK_AI_10084": "Системный экземпляр[uuid: %s] не может быть удален", + "ORG_ZSTACK_AI_10082": "Не удалось удалить модель, модель[uuid: %s] все еще используется %s", + "ORG_ZSTACK_AI_10083": "Модель[uuid: %s] не существует в облачном репозитории", + "ORG_ZSTACK_AI_10080": "Пользовательский URL требует поле модели при развертывании типа сервиса ModelEval.%s", + "ORG_ZSTACK_AI_10081": "L3 сеть UUID %s не имеет включенной службы DHCP; для назначения статических IP-адресов требуется системный тег статического IP.", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10007": "Операция создания снимков томов на нескольких хостах одновременно, включая снимки хранилища, не поддерживается.", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10008": "невозможно найти пространство хранения для URL установки[%s]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10005": "Нет зарегистрированного плагина первичного хранилища с идентификатором: %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10006": "протокол[%s] не поддерживается для типа[%s] хранилища", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10009": "Не удается найти блочное хранилище томов; убедитесь, что путь доступа настроен для блочного хранилища томов.", + "ORG_ZSTACK_CONFIGURATION_10009": "размер зарезервированной памяти[%s байт] превышает доступный размер памяти[%s байт]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10010": "не указан тип резервного хранилища для поддержки первичного хранилища[uuid:%s]", + "ORG_ZSTACK_CONFIGURATION_10008": "размер памяти[%s байт] недостаточен для загрузки современной операционной системы; рекомендуется минимум 16 МБ в облачных виртуальных средах", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10011": "невозможно переинициализировать корневой том [%s], потому что связанный образ был удален и его кэш не может быть найден", + "ORG_ZSTACK_MULTICAST_ROUTER_10005": "мультикаст-маршрутизатор [uuid:%s] не связан с VPC-маршрутизатором", + "ORG_ZSTACK_CONFIGURATION_10007": "количество vcpu[%s] меньше 1", + "ORG_ZSTACK_MULTICAST_ROUTER_10006": "Rendezvous Point [%s] не является одноадресным IP-адресом", + "ORG_ZSTACK_CONFIGURATION_10006": "неподдерживаемый тип экземпляра[%s]", + "ORG_ZSTACK_MULTICAST_ROUTER_10007": "групповой адрес [%s] не является мультикаст-групповым адресом", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014": "хранилище нездорово:%s", + "ORG_ZSTACK_MULTICAST_ROUTER_10000": "multicastRouter[uuid:%s] не был связан с VPC-роутером", + "ORG_ZSTACK_MULTICAST_ROUTER_10001": "multicast уже включен на VPC-роутере UUID[:%s]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012": "невозможно найти путь к принадлежащему тому из внутреннего пути снимка[%s], так как регулярное выражение[%s] не соответствует пути снимка", + "ORG_ZSTACK_MULTICAST_ROUTER_10002": "VPC-роутер для multicast-роутера [uuid:%s] был удален", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10013": "пинг внешнего основного хранилища[%s] не удался, проверьте сетевое подключение или состояние сервиса хранилища.%s", + "ORG_ZSTACK_CONFIGURATION_10001": "Уже существует один пользовательский системный тег для предложения экземпляра [UUID: %s].", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10004": "Ответ токена пуст. Убедитесь, что процесс аутентификации настроен правильно и конечная точка токена возвращает корректный ответ.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10003": "Не удается найти реализацию OAuth2Login для типа(%s)", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10005": "%s имеет значение null: убедитесь, что путь к исходному файлу указан правильно.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10000": "дублирующийся OAuth2 обработчик аутентификации для типа[%s]", + "ORG_ZSTACK_CONFIGURATION_10004": "Не должно быть более одного системного тега для предложения экземпляра.", + "ORG_ZSTACK_CONFIGURATION_10003": "Уже существует один пользовательский системный тег для предложения диска [UUID: %s].", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10002": "Не удается найти OAuth2 провайдера для типа(%s)", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10001": "дублирующийся OAuth2 провайдер[%s] для имени[%s]", + "ORG_ZSTACK_AI_10075": "dockerImage должен быть указан для ContainerModelService.", + "ORG_ZSTACK_AI_10076": "Model center с UUID:%s не найден для model service с UUID:%s", + "ORG_ZSTACK_AI_10071": "vmImageUuid является обязательным параметром для VirtualMachine model service. Пожалуйста, укажите корректное значение vmImageUuid.", + "ORG_ZSTACK_AI_10072": "Указанный UUID VM образа недействителен. Пожалуйста, проверьте и укажите корректный UUID.", + "ORG_ZSTACK_AI_10070": "ModelServiceType[%s] не должен иметь зависимые UUID групп model service", + "ORG_ZSTACK_MULTICAST_ROUTER_10008": "Пара адресов RP [%s: %s] уже существует для multicast роутера [uuid:%s]", + "ORG_ZSTACK_MULTICAST_ROUTER_10009": "кортеж rpc адресов [%s : %s] не существует для multicast роутера [uuid:%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10015": "Не удалось загрузить пользователя[%s]: пользователь уже существует в облачной среде", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10017": "get code response имеет ошибку: %s", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10016": "Не удалось загрузить пользователя[%s]: %s", + "ORG_ZSTACK_AI_10079": "ModelEval serviceType требует существующего model service в указанных modelServiceGroupUuids или корректного URL для использования.", + "ORG_ZSTACK_AI_10077": "L3 network UUID не предоставлен в сообщении о развертывании, и model center [UUID:%s] не имеет настроенных serviceNetworkUuid или storageNetworkUuid.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10012": "iam2 имеет пользователя с тем же именем[%s]", + "ORG_ZSTACK_AI_10078": "Значения переменных окружения не должны быть null в конфигурации вашей облачной среды. Пожалуйста, убедитесь, что все обязательные переменные правильно настроены.", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_SUPPLIER_EMAY_10000": "неверный параметр с поставщиком[%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10026": "Имя пользователя, полученное из облачного сервиса, имеет значение null. Пожалуйста, проверьте конфигурацию аутентификации пользователя.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10025": "Не удалось получить параметры[%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10028": "Плагин [uuid:%s] используется OAuth2 клиентами [uuids:%s] для аутентификации сторонних логинов.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10027": "Локальный пользователь имеет пользователя с таким же именем[%s]", + "ORG_ZSTACK_AI_10097": "Сервисы модели в группе[uuid: %s] имеют несовместимые типы, ожидаемый тип: %s, но найден тип: %s", + "ORG_ZSTACK_AI_10098": "Бэкенд сервиса модели[type: %s] не найден в виртуализированной среде", + "ORG_ZSTACK_AI_10095": "Все сервисы модели в группе[uuid: %s] должны настроить serviceBootUptime", + "ORG_ZSTACK_AI_10096": "Не найден экземпляр сервиса модели с node rank 0 в группе[uuid: %s]", + "ORG_ZSTACK_AI_10093": "Экземпляр сервиса модели[uuid: %s] не активен и не готов, но код ошибки не найден", + "ORG_ZSTACK_AI_10094": "Неожиданное содержимое: YAML сервиса %s разобран как null", + "ORG_ZSTACK_AI_10091": "Не удалось получить статус готовности по причине %s", + "ORG_ZSTACK_AI_10092": "Экземпляр сервиса модели[uuid: %s] недоступен и не готов по причине %s", + "ORG_ZSTACK_AI_10090": "Не удалось перезагрузить конфигурацию NGINX: %s", + "ORG_ZSTACK_VROUTERROUTE_10010": "Назначение[%s] не может иметь одновременно черную дыру и статические маршруты", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10000": "Не удается найти внешнее основное хранилище[uuid:%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10031": "Ошибка %s в %s, код статуса: %s, тело ответа: %s", + "ORG_ZSTACK_VROUTERROUTE_10012": "Невозможно добавить дублирующую запись маршрута Черной дыры для назначения: %s", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10030": "ОШИБКА HTTP, код статуса: %s, тело ответа: %s", + "ORG_ZSTACK_VROUTERROUTE_10011": "Невозможно добавить дублирующую запись статического маршрута, назначение: %s, цель: %s, тип: %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10003": "Требуемое пространство по адресу locationUrl:%s не может удовлетворить условиям [availableSize > %d байт], текущий доступный размер %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10004": "Не удается найти том с UUID [%s] путь установки", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10001": "Не удалось установить соединение со службой внешнего хранилища. Убедитесь, что ваша служба хранилища правильно настроена и доступна в облачной среде.", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10032": "Ошибка %s в %s, IO ошибка: %s", + "ORG_ZSTACK_AI_10099": "Группа экземпляров сервиса модели[uuid: %s] не существует", + "ORG_ZSTACK_VROUTERROUTE_10001": "Не удается найти фабрику сервисов для типа виртуального роутера[%s]", + "ORG_ZSTACK_VROUTERROUTE_10000": "Виртуальный роутер [uuid:%s] не может быть найден", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10015": "Ceph BS[uuid=%s] имя пула не найдено", + "ORG_ZSTACK_VROUTERROUTE_10003": "Не удается найти таблицу маршрутизации [uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10012": "Невозможно обновить статус Ceph backup storage MON [UUID:%s], он был удален. Эту ошибку можно игнорировать.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10000": "Не удается найти группу планирования хоста[uuid:%s], она могла быть удалена или переназначена", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10003": "Хост [UUID:%s] уже присоединен к группе планирования хоста [UUID:%s].", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10004": "Хост с UUID %s имеет значение null. Пожалуйста, проверьте конфигурацию кластера.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10001": "невозможно найти правило планирования виртуальной машины[uuid:%s], возможно, оно было удалено", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10002": "невозможно найти группу планирования виртуальной машины[uuid:%s], возможно, она была удалена", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10011": "Резервное хранилище CEPH не поддерживает вычисление контрольной суммы образа.", + "ORG_ZSTACK_SNS_PLATFORM_HTTP_10000": "Ошибка HTTP POST-запроса. статус: %s, тело: %s", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10007": "образ[uuid: %s] недоступен в резервном хранилище[uuid:%s, name:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10005": "Существует другое резервное хранилище CEPH с тем же FSID; невозможно добавить одну и ту же конфигурацию CEPH как два разных резервных хранилища.[name:%s, uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10003": "невозможно подключиться к резервному хранилищу Ceph[UUID:%s], не удалось подключить все Ceph-мониторы.", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10002": "CephMon[hostname:%s] не найден в резервном хранилище[uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10009": "Не удалось добавить MON-узел в кластер резервного хранилища Ceph", + "ORG_ZSTACK_MULTICAST_ROUTER_BACKEND_10000": "multicast-роутер [uuid:%s] был удалён во время включения multicast на бэкенде", + "ORG_ZSTACK_LDAP_10016": "ошибка запроса LDAP-записи, %s", + "ORG_ZSTACK_LDAP_10017": "ошибка запроса ldap-записи[фильтр: %s] по причине %s", + "ORG_ZSTACK_LDAP_10012": "Не удалось установить соединение с LDAP/AD-сервером, предоставлены неверные учётные данные. Пожалуйста, проверьте User DN и пароль.", + "ORG_ZSTACK_LDAP_10013": "Не удалось установить соединение с LDAP/AD-сервером, ошибка связи. Пожалуйста, проверьте IP-адрес, номер порта и Base DN.", + "ORG_ZSTACK_LDAP_10014": "Не удалось установить соединение с LDAP/AD-сервером, %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10005": "текущая лицензия[%s] недействительна для операций резервного хранилища хранилища образов", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10004": "CephPrimaryStorage[%s] не существует!", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10001": "образ [uuid:%s] был удалён из репозитория облачного хранилища", + "ORG_ZSTACK_LDAP_10010": "Неверный LdapServerType[%s], допустимые значения: [%, %s]", + "ORG_ZSTACK_LDAP_10007": "Аккаунт[UUID:%s] не найден!!!", + "ORG_ZSTACK_LDAP_10008": "Неподдерживаемая область LDAP/AD-сервера для конфигурации облачной среды. Пожалуйста, убедитесь, что область совместима со стандартами виртуализации и облачных вычислений.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10000": "не удалось создать elastic IP [uuid:%s, name:%s, ip:%s] для сетевого интерфейса виртуальной машины [uuid:%s] на виртуальном роутере [uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10001": "Найдено предложение виртуального роутера [uuid:%s] для L3Network [uuid:%s] в зоне [uuid:%s]; однако конфигурация публичного IP сети не соответствует Elastic IP [uuid:%s]. Возможно, потребуется указать конкретное предложение виртуального роутера с помощью системного тега guestL3Network::l3NetworkUuid для L3Network [uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10002": "не удалось отсоединить eip [uuid:%s, name:%s, ip:%s] от vm nic [uuid:%s] на виртуальном роутере [uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10004": "не удалось синхронизировать eip на виртуальном роутере[uuid:%s], детали ошибки: %s", + "ORG_ZSTACK_AI_10004": "randomUuid не соответствует ожидаемому значению. Пожалуйста, проверьте логику генерации UUID.", + "ORG_ZSTACK_AI_10005": "Model Center не найден. Пожалуйста, убедитесь, что сервис Model Center правильно развёрнут и настроен в вашей облачной среде.", + "ORG_ZSTACK_AI_10003": "randomUuid имеет значение null. Пожалуйста, убедитесь, что сгенерирован корректный UUID перед использованием.", + "ORG_ZSTACK_AI_10001": "Предоставленный IP-адрес управления Model Center %s недействителен. Пожалуйста, убедитесь, что это корректный IP, и повторите попытку.", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10027": "ВМ[uuid:%s] теперь работает на хосте[uuid:%s], что не соответствует политике планирования[%s], связанной с группой планирования ВМ[uuid:%s].", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10028": "ВМ[uuid:%s] теперь работает на хосте[uuid:%s], что не соответствует правилу планирования[%s], связанному с группой планирования виртуальных машин[uuid:%s].", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10019": "Группа планирования ВМ [UUID:%s] уже имеет присоединенную выполненную исключительную или основанную на близости политику планирования ВМ. Вы не можете снова присоединять любой тип политики, требующей выполнения, к этой группе.", + "ORG_ZSTACK_AI_10028": "modelServices не может быть null или пустым. Пожалуйста, убедитесь, что ваш экземпляр сервиса правильно инициализирован и настроен.", + "ORG_ZSTACK_AI_10029": "modelServices должен использовать тот же UUID модели, что и виртуальные экземпляры для согласованности.", + "ORG_ZSTACK_AI_10026": "serviceNetworkUuid %s не является системной сетью Уровня 3", + "ORG_ZSTACK_AI_10027": "storageNetworkUuid %s не является системной сетью Уровня 3", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10025": "ВМ[uuid:%s] теперь работает на хосте[uuid:%s], что не соответствует политике планирования, связанной с группой планирования виртуальной машины[uuid:%s].", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10026": "hostGroup[uuid:%s] не имеет назначенных хостов", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10024": "группа планирования ВМ[uuid:%s] не смогла зарезервировать хост[uuid:%s] для ВМ[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10007": "ВМ[uuid:%s] уже связана с группой планирования ВМ[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10008": "обнаружена несовпадающая зона: ВМ[UUID: %s, Zone UUID: %s] отличается от ее группы правил планирования[UUID: %s, Zone UUID: %s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10005": "Хосты, которые можно добавить в группу планирования хостов, должны быть включены и подключены к Узлу Управления (MN).", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10006": "обнаружена несовпадающая зона, зона хоста[uuid: %s, zone uuid: %s] отличается от группы правил планирования хостов[uuid: %s, zone uuid: %s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10009": "ВМ может изменить свою группу планирования ВМ только в состояниях[%s,%s], но в данный момент она находится в состоянии[%s]", + "ORG_ZSTACK_TEMPLATECONFIG_10000": "Не удалось найти какие-либо TemplateConfigs: [template UUID: %s]", + "ORG_ZSTACK_TICKET_API_10002": "системный тип учетной записи[%s] не определен в конфигурации", + "ORG_ZSTACK_TICKET_API_10003": "Тип билета не найден в конфигурации облачной среды.%s", + "ORG_ZSTACK_TICKET_API_10004": "Не найдена соответствующая коллекция потоков билетов или коллекция потоков билетов по умолчанию. Пожалуйста, укажите flowCollectionUuid или создайте коллекцию потоков билетов по умолчанию в системе.", + "ORG_ZSTACK_TEMPLATECONFIG_10003": "Не удалось найти Конфигурацию Шаблона[category: %s, name: %s, template UUID: %s]", + "ORG_ZSTACK_TICKET_API_10005": "Коллекция потоков билетов [UUID:%s] не соответствует типу билета [UUID:%s]", + "ORG_ZSTACK_TICKET_API_10006": "Коллекция потоков билетов[uuid:%s] недействительна. Пожалуйста, свяжитесь с администратором для исправления.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10000": "Основное хранилище Aliyun NAS [UUID:%s, Name:%s] не может найти доступный хост в присоединенных кластерах для создания экземпляра тома.", + "ORG_ZSTACK_TICKET_API_10007": "Коллекция потоков билетов [UUID:%s] отключена и не может быть использована.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10001": "Основное хранилище Alibaba Cloud NAS [UUID:%s, Name:%s] не может найти доступный хост в присоединенных кластерах для удаления данных на основном хранилище.", + "ORG_ZSTACK_TICKET_API_10008": "неверный запрос. API[%s] не найден в указанном пространстве имен или области видимости", + "ORG_ZSTACK_TICKET_API_10009": "неверный запрос, невозможно создать API[%s] из apiBody, %s", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10010": "невозможно управлять группой планирования ВМ VPC", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10011": "UUID зоны доступности не должен быть null.", + "ORG_ZSTACK_TEMPLATECONFIG_10005": "Не удалось найти какие-либо TemplateConfigs: [templateUUID: %s]", + "ORG_ZSTACK_AI_10012": "architectureImages не должен быть null или пустым в средах облачной виртуализации. Пожалуйста, убедитесь, что он правильно настроен.", + "ORG_ZSTACK_AI_10042": "Неверный формат шаблона CloudFormation: %s", + "ORG_ZSTACK_AI_10043": "Конфигурация YAML и обновления отдельных параметров являются взаимоисключающими в средах облачных вычислений. Пожалуйста, выберите один метод для обновления настроек.", + "ORG_ZSTACK_AI_10040": "servicePorts не может содержать дублирующиеся значения: %s", + "ORG_ZSTACK_AI_10041": "serviceBootupTime должен быть в диапазоне [1,65535]", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10006": "не удалось проверить путь монтирования на хосте: %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10005": "Первичное хранилище Aliyun NAS [UUID: %s, name: %s] не присоединено ни к одному кластеру, или в присоединенных кластерах нет подключенных хостов.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10009": "Не удалось найти хост для очистки кэша образов. Пожалуйста, убедитесь, что по крайней мере один хост доступен и правильно настроен для кэширования образов.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10013": "не удалось присоединить первичное хранилище к кластеру. KVM-хост [uuid:%s, name:%s] в кластере использует qemu-img версии [%s]; однако первичное хранилище присоединено к кластеру, который имеет KVM-хост [uuid:%s], использующий qemu-img версии [%s]. Версии qemu-img выше %s несовместимы с версиями ниже %s, что может привести к сбою операций создания снимков томов. Пожалуйста, избегайте присоединения первичного хранилища к кластерам с различными дистрибутивами Linux для предотвращения несоответствий версий qemu-img.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10014": "Нет доступных вычислительных ресурсов для загрузки кэша образов!", + "ORG_ZSTACK_AI_10049": "Архитектура ЦП в сопоставлении образов архитектуры не может быть пустой. Пожалуйста, убедитесь, что указана допустимая архитектура ЦП.", + "ORG_ZSTACK_AI_10046": "Поставщик GPU %s должен предоставить список UUID спецификаций", + "ORG_ZSTACK_AI_10047": "UUID спецификации GPU для поставщика %s не найдены в %s: %s", + "ORG_ZSTACK_AI_10044": "Сопоставление спецификаций поставщика GPU в сопоставлении образов архитектуры не может быть пустым. Пожалуйста, убедитесь, что поставщик GPU указан правильно.", + "ORG_ZSTACK_AI_10045": "Поставщик GPU в сопоставлении образов архитектуры не может быть пустым. Пожалуйста, укажите допустимое имя поставщика GPU.", + "ORG_ZSTACK_AI_10031": "UUID modelServices не должен быть null. Пожалуйста, убедитесь, что указан допустимый UUID для modelServices.", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10008": "не удалось разобрать конверт метаданных: %s, %s", + "ORG_ZSTACK_AI_10032": "nodeRank должен быть в диапазоне [0, %s), но получено %s", + "ORG_ZSTACK_AI_10030": "modelServices должен использовать тот же UUID зоны, что и вычислительные узлы.", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10003": "недопустимый аргумент для пути к исходному файлу", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10004": "Не удалось расшифровать данные с помощью предоставленного ключа шифрования. Пожалуйста, проверьте ключ и повторите попытку.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10017": "AliyunNasAccessGroupVO[%s] не существует, возможно, был удален!", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10018": "EcsVSwitchVO[%s] не существует, возможно, был удален!", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10020": "не удалось найти доступный хост для выполнения операции в первичном хранилище: %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10021": "не удалось выполнить пинг первичного хранилища Aliyun NAS[UUID:%s] с хоста[UUID:%s], так как %s. Отключите это соединение хост-NAS.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10024": "не найден BackupStorageKVMFactory для типа[%s]", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10025": "не найден хост для управления томом: [%s]", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10023": "Первичное хранилище NAS не смонтировано, пожалуйста, сначала инициализируйте его!", + "ORG_ZSTACK_AI_10039": "servicePorts должен быть в диапазоне [1,65535], но получено: %s", + "ORG_ZSTACK_AI_10037": "serviceLivez должен начинаться с '/' и не содержать пробелов; его длина не должна превышать 512 символов.", + "ORG_ZSTACK_AI_10038": "serviceReadyz должен начинаться с /, не содержать пробелов и иметь длину до 512 символов", + "ORG_ZSTACK_AI_10035": "Неверный фреймворк: %s, допустимые значения: EC2, GCE, Azure, OpenStack", + "ORG_ZSTACK_AI_10036": "Неверный фреймворк: %s", + "ORG_ZSTACK_AI_10033": "Неверный идентификатор PCI-устройства: %s", + "ORG_ZSTACK_AI_10034": "nodeRank должен быть уникальным, но получено %s", + "ORG_ZSTACK_ACL_10001": "%s дублирующаяся/перекрывающаяся IP-запись в группе списка контроля доступа:%s", + "ORG_ZSTACK_AI_10064": "Неверные структуры схемы набора данных: %s", + "ORG_ZSTACK_ACL_10000": "не поддерживает версию IP %d", + "ORG_ZSTACK_AI_10065": "Системные предустановленные наборы данных нельзя обновлять через вызовы API. Пожалуйста, обратитесь в службу поддержки за помощью.", + "ORG_ZSTACK_AI_10062": "Набор данных используется и не может быть удалён через API. Пожалуйста, убедитесь, что все связанные ресурсы завершены перед попыткой удаления.", + "ORG_ZSTACK_AI_10063": "updateDatasetStructs не может быть null или пустым. Пожалуйста, убедитесь, что структура набора данных правильно определена и заполнена перед продолжением.", + "ORG_ZSTACK_AI_10060": "Невозможно завершить работу экземпляра VM, поскольку он используется группой сервисов модели [UUID: %s]", + "ORG_ZSTACK_ZSV_COMPUTER_VM_10000": "имя VM %s уже существует в облачной среде", + "ORG_ZSTACK_AI_10061": "Совместное использование групп экземпляров приложения не допускается: %s", + "ORG_ZSTACK_ACL_10009": "группы списка контроля доступа[%s] уже имеют одно правило перенаправления и не могут добавить другое", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10028": "Нет доступных вычислительных ресурсов для проверки пути монтирования!", + "ORG_ZSTACK_ACL_10008": "группы списка контроля доступа[%s] уже имеют IP-запись, невозможно добавить правило перенаправления", + "ORG_ZSTACK_ACL_10007": "группы списка контроля доступа[%s] уже имеют правило перенаправления; поэтому IP-запись не может быть добавлена.", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10026": "невозможно найти хост для синхронизации размера тома в primary: %s", + "ORG_ZSTACK_ACL_10006": "группы списка контроля доступа[%s] не могут превышать %d IP-записей", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10027": "образ [%s] был удалён, невозможно повторно инициализировать корневой том из него", + "ORG_ZSTACK_SCHEDULER_SNAPSHOT_10000": "VM корневого тома [%s] находится в состоянии Destroyed. Изменения состояния для этой задачи не допускаются.", + "ORG_ZSTACK_ACL_10005": "группы списка контроля доступа[%s] уже имеют правило перенаправления; поэтому IP-запись не может быть добавлена.", + "ORG_ZSTACK_ACL_10004": "Неверное выражение правила, пожалуйста, убедитесь, что оно соответствует стандартам облачных вычислений, например, правильное использование %s для заполнителей. Подробности: %s", + "ORG_ZSTACK_ACL_10003": "диапазон IP [%s, %s] перекрывается с [%s, %s] в группе списка контроля доступа:%s", + "ORG_ZSTACK_ACL_10002": "формат IP поддерживает только ip/iprange/cidr, но найдено %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10031": "Aliyun NAS PrimaryStorage поддерживает только imagestore BS; фактически полученный тип: %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10000": "InfoSecEncryptDriver шифрование не удалось для ресурса %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10001": "InfoSecEncryptDriver дешифрование не удалось для виртуального ресурса %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10002": "encrypt data[%s] или тип алгоритма шифрования[%s] равно null", + "ORG_ZSTACK_AI_10068": "Оценка модели требует ModelServiceType.ModelEval", + "ORG_ZSTACK_AI_10069": "Для оценки модели требуется один из UUID наборов данных или промпт.", + "ORG_ZSTACK_AI_10066": "UUID ModelServiceVO обязателен. Пожалуйста, предоставьте корректный UUID.", + "ORG_ZSTACK_AI_10067": "serviceType должен быть указан", + "ORG_ZSTACK_ACL_10012": "url[%s] не является допустимым путём к облачному хранилищу", + "ORG_ZSTACK_AI_10053": "Образ [uuid:%s] для архитектуры %s отключён и не может быть использован", + "ORG_ZSTACK_ACL_10011": "domain[%s] не является допустимым доменным именем", + "ORG_ZSTACK_AI_10054": "Образ [uuid:%s] для указанной архитектуры %s недоступен и не может быть использован", + "ORG_ZSTACK_ACL_10010": "Domain и URL не могут быть пустыми одновременно. Пожалуйста, укажите корректный domain или URL.", + "ORG_ZSTACK_AI_10051": "Для архитектуры %s должен быть указан хотя бы один идентификатор образа виртуальной машины (vmImageUuid) или контейнерный образ (dockerImage)", + "ORG_ZSTACK_AI_10052": "Недопустимый UUID образа для архитектуры %s: %s", + "ORG_ZSTACK_AI_10050": "Недопустимый тип CPU архитектуры в сопоставлении образов архитектуры: %s, поддерживаемые типы включают: %s", + "ORG_ZSTACK_AI_10059": "Слишком много вариаций типов данных в сообщениях набора данных: %s, пожалуйста, сократите до одного типа", + "ORG_ZSTACK_AI_10057": "Создание набора данных без указания типа данных и сценариев использования не допускается в облачных вычислениях. Пожалуйста, укажите необходимые сведения для вашего набора данных.", + "ORG_ZSTACK_AI_10058": "При добавлении набора данных должен быть указан хотя бы один тип данных набора данных.", + "ORG_ZSTACK_AI_10055": "Дублирующаяся CPU архитектура указана в сопоставлении образов архитектуры: %s", + "ORG_ZSTACK_AI_10056": "образы архитектуры не могут быть пустыми", + "ORG_ZSTACK_VMWARE_10101": "не удалось получить список хранилища для %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10051": "Имя LUN обязательно, но получено null. Пожалуйста, убедитесь, что указано корректное имя LUN.", + "ORG_ZSTACK_VMWARE_10102": "Хранилище данных не найдено для VirtualMachine: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10054": "не удалось получить снимок для тома:%s с id:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10053": "не удалось получить снимок для lun:%s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10012": "SFTP хранилище резервных копий не поддерживает вычисление хешей образов.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10050": "initiator[%s] уже существует в XStor и не присоединён к host[%s]. Пожалуйста, убедитесь, что имя инициатора уникально.", + "ORG_ZSTACK_ALIYUN_NETWORK_10020": "Только EC2 экземпляры в состоянии running или stopped могут быть присоединены к EIP, но ECS [%s] в данный момент находится в состоянии [%s].", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10016": "создание файла метаданных образа: %s не удалось", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10017": "проверка файла метаданных образа: %s не удалась", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10018": "файл метаданных образа: %s не существует", + "ORG_ZSTACK_ZWATCH_ALARM_10022": "дублирующееся действие[uuid:%s, type:%s] для alarm[uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10021": "действие[uuid:%s, type:%s] не найдено в облачной вычислительной среде", + "ORG_ZSTACK_ZWATCH_ALARM_10020": "неверный тип действия[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10026": "дублирующийся ключ[%s] с разными значениями{%s}%", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10170": "не удалось добавить IP сервера в группу серверов общего балансировщика нагрузки %s", + "ORG_ZSTACK_ZWATCH_ALARM_10025": "метрика не содержит указанную метку[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10023": "дублирующаяся метка определена для сигнала тревоги с UUID [uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10029": "метрика[%s] ограничена для администраторов и недоступна для вашей текущей роли пользователя.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10171": "не удалось изменить backend-сервер, так как vmincs и IP-адреса серверов равны null", + "ORG_ZSTACK_ZWATCH_ALARM_10028": "namespace[%s] не содержит метрику[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10027": "namespace[%s] не поддерживается", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10049": "LUN ID недействителен. Пожалуйста, убедитесь, что он соответствует требуемому формату и значениям для облачных хранилищ.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10048": "LUN mapping ID является обязательным и не может быть null или нулем. Пожалуйста, укажите действительный LUN mapping ID.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10045": "не удалось получить сопоставления томов, причина: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10044": "не удалось проверить состояние сеанса LUN %s, причина: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10047": "Механизм получения LUN mapping ID отсутствует; поэтому операция не выполнена.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10046": "не удалось получить количество оставшихся созданных LUN для LUN %s, причина: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10041": "snapshot ID является обязательным, но получено:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10040": "не удалось запросить снимки для экземпляра %s, причина: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10043": "не удалось восстановить снимок:%s, причина: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10020": "Пожалуйста, остановите VM перед созданием шаблона тома для SFTP хранилища резервных копий %s.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10042": "не удалось удалить снимок %s, причина: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10023": "дублирующееся хранилище резервных копий. Уже существует SFTP хранилище резервных копий[hostname:%s]", + "ORG_ZSTACK_LICENSE_CUBE_10000": "Контекст исходного кода не может быть null для проверки лицензии. Пожалуйста, предоставьте действительную контекстную строку.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10038": "не удалось получить пул хранения %s, причина: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10037": "не удалось удалить lun %s, причина: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10039": "не удалось создать снимок для тома %s, причина: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10034": "lun mapping id является обязательным, но получено:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10033": "не удалось сопоставить lun %s с группой хостов %s, причина: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10036": "lun id является обязательным, но получено:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10035": "не удалось удалить сопоставление lun %s, причина: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_10004": "ecs экземпляр[%s] не существует, пожалуйста, проверьте его.", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10001": "Ошибка загрузки компонентов виртуальной машины %s с резервного хранилища образа [hostname:%s, path: %s] в локальное основное хранилище [uuid:%s, path: %s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10002": "Ошибка загрузки компонентов из локального хранилища [uuid:%s, path:%s] в хранилище образов [hostname:%s], %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10020": "Сеть l3 %s и VPC %s уже соединены. Пожалуйста, проверьте.", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10000": "Исходная ВМ имеет локальный том данных на хосте [UUID: %s], но Fast Clone API пытается клонировать ВМ на хост [%s], что не поддерживается функцией быстрого клонирования.", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10000": "AutoScalingRuleSchedulerJobTriggerVO[UUID:%s] находится в состоянии %s, изменение состояния не разрешено", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10001": "AutoScalingRuleSchedulerJobTriggerVO[uuid:%s] находится в периоде охлаждения", + "ORG_ZSTACK_ALIYUN_NETWORK_10008": "Виртуальная граница: %s была завершена", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10002": "AutoScalingRuleVO[uuid:%s] находится в состоянии %s, переход состояния не разрешен", + "ORG_ZSTACK_ALIYUN_NETWORK_10005": "Только ECS-инстансы в состоянии \"работает\" или \"остановлен\" могут отсоединить EIP, но текущий статус ECS [%s] — [%s].", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10018": "CpeIp должен быть IPv4-адресом, но сейчас это %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10017": "Только административные пользователи могут устанавливать соединения в этой облачной среде.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10019": "cpeIp должен быть допустимым IPv4-адресом", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10000": "SftpBackupStorage не поддерживает схему [%s] в URL [%s]", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10014": "резервная копия виртуальной машины не найдена для: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10013": "виртуальная машина не найдена для: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_10010": "целевой CIDR [%s] уже существует и указывает на другой ID инстанса [%s]. Пожалуйста, проверьте или сначала удалите его.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10061": "Не удалось получить информацию о LUN кэша образа", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10016": "неподдерживаемый тип инстанса: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10003": "не удалось отменить загрузку образа, потому что %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10060": "Новый кэш образа не готов. Пожалуйста, подождите и повторите попытку.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10015": "сеть не найдена для: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10004": "UUID агента SFTP Backup Storage изменился [ожидалось: %s, фактически: %s], что скорее всего вызвано ручным перезапуском агента. Пожалуйста, выполните переподключение для синхронизации статуса.", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10010": "CIDR не найден для сети L3: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10012": "виртуальная частная сеть не найдена для: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10059": "не удается найти том: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10055": "Кластер XSStor нездоров, информация о кластере [clusterDataState: %s, clusterHealthyState: %s, clusterRunningState: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10058": "указан недопустимый идентификатор логического номера устройства (LUN)", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10057": "Сессия для LUN %s с хостом %s не активна в виртуализованной среде.", + "ORG_ZSTACK_HYBRID_NETWORK_10027": "cidr перекрывается другим виртуальным коммутатором: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10028": "недопустимый блок CIDR: %s должен находиться в диапазонах '10.0.0.0/8', '172.16.0.0/12' или '192.168.0.0/16'", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10010": "Не удалось завершить работу экземпляра %s из-за %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10009": "Виртуальный сетевой интерфейс не найден для сети уровня 3: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10029": "Виртуальный пограничный маршрутизатор не найден: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10003": "Пользовательский CIDR [%s] уже существует в VBR [%s], пересекается с целевым CIDR [%s]. Проверьте и удалите его сначала.", + "ORG_ZSTACK_HYBRID_NETWORK_10020": "Интерфейс маршрутизатора следующего перехода принадлежит %s, но запись принадлежит %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10001": "Vbr: [%s] сейчас устанавливает соединение, пожалуйста, подождите...", + "ORG_ZSTACK_HYBRID_NETWORK_10021": "Виртуальный частный шлюз не найден: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10000": "Пользовательский CIDR [%s] уже существует в виртуальном маршрутизаторе [%s], пересекается с целевым CIDR [%s]. Проверьте и удалите его сначала.", + "ORG_ZSTACK_HYBRID_NETWORK_10022": "Тип следующего перехода [%s] не поддерживается для создания записи маршрута!", + "ORG_ZSTACK_HYBRID_NETWORK_10024": "Виртуальный пограничный маршрутизатор поддерживает только интерфейс маршрутизатора как тип следующего перехода", + "ORG_ZSTACK_HYBRID_NETWORK_10026": "CIDR vswitch [%s] не входит в диапазон VPC [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10008": "Не удалось добавить экземпляр %s в группу хостов %s, из-за %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10005": "Не удалось получить подсеть зоны доступа из-за %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10004": "Не удалось синхронизировать зоны доступа из-за %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10007": "Не удалось запросить экземпляры %s из-за %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10006": "Не удалось запросить все экземпляры из-за %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10001": "Не удалось добавить инициатор: %s на хост, из-за %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10000": "Не удалось выполнить аутентификацию с устройством XStor: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10002": "Не удалось скопировать LUN: %s в %s, из-за %s", + "ORG_ZSTACK_HYBRID_NETWORK_10038": "eip[%s] и ecs[%s] должны находиться в одной зоне доступности", + "ORG_ZSTACK_VMWARE_10135": "Не удалось установить ZStack UUID для управляемой сущности VCenter [name:%s, mor:%s] из-за %s", + "ORG_ZSTACK_HYBRID_NETWORK_10039": "Невозможно отсоединить eip: [%s], он не присоединен ни к одному экземпляру", + "ORG_ZSTACK_VMWARE_10132": "Номер устройства недоступен для диска данных %s", + "ORG_ZSTACK_VMWARE_10133": "Создание dvPortGroup не удалось для distributedSwitch [%s], %s", + "ORG_ZSTACK_VMWARE_10130": "Удаление тома[%s] не удалось: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10030": "Такой виртуальный маршрутизатор не существует: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10031": "localGateway не является IPv4 адресом: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10032": "peerGateway не является допустимым IPv4 адресом: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10033": "peerGateway не является допустимой маской подсети: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10034": "vlanId должен быть числовым значением: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10035": "не удалось подключить EIP к ECS: [%s], EIP [%s] уже подключен к ECS [%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10036": "ECS [%s] уже имеет публичный IP-адрес", + "ORG_ZSTACK_HYBRID_NETWORK_10037": "не удалось подключить EIP [%s] к ECS [%s], так как ECS уже связан с EIP", + "ORG_ZSTACK_SSO_SERVICE_10014": "Виртуальный ID не существует для пользователя %s", + "ORG_ZSTACK_VMWARE_10129": "Служба менеджера виртуальных дисков недоступна. Пожалуйста, проверьте, работает ли служба, или обратитесь в службу поддержки.", + "ORG_ZSTACK_SSO_SERVICE_10011": "в ответе ошибка: исходный файл не найден в системе облачного хранения. Пожалуйста, проверьте путь к файлу и убедитесь, что он правильно загружен в виртуализированную среду.", + "ORG_ZSTACK_SSO_SERVICE_10010": "redirectUrl недействителен, %s", + "ORG_ZSTACK_VMWARE_10128": "Дата-центр не найден для хранилища данных.%s", + "ORG_ZSTACK_SSO_SERVICE_10013": "аккаунт не существует для пользователя %s", + "ORG_ZSTACK_SSO_SERVICE_10012": "Не удалось сгенерировать конфигурацию сопоставления информации пользователя для SSO-клиента [UUID: %s]: пользовательские сопоставления атрибутов не определены.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10030": "не удалось запросить LUN-сопоставление для группы хостов %s из-за %s", + "ORG_ZSTACK_HYBRID_NETWORK_10005": "интерфейс маршрутизатора должен находиться в том же дата-центре, но ri[%s] находится в dc[%s], а ri[%s] находится в dc[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10032": "не удалось получить информацию о кластере из-за %s", + "ORG_ZSTACK_VMWARE_10121": "создание dvPortGroup не удалось для %s", + "ORG_ZSTACK_HYBRID_NETWORK_10007": "интерфейс маршрутизатора[%s] не находится в состоянии ожидания, текущий статус: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10031": "не удалось запросить LUN-сопоставление %s из-за %s", + "ORG_ZSTACK_HYBRID_NETWORK_10009": "интерфейс маршрутизатора[%s] уже имеет активное подключение, это %s", + "ORG_ZSTACK_VMWARE_10120": "dvSwitch [%s] не найден на vCenter [%s]. Пожалуйста, убедитесь, что dvSwitch существует и правильно настроен.", + "ORG_ZSTACK_GUESTTOOLS_10009": "Подходящий ISO-образ гостевых ОС не найден на управляющем узле [UUID:%s] для хоста [UUID:%s].", + "ORG_ZSTACK_GUESTTOOLS_10007": "невозможно получить последние гостевые инструменты для vm[uuid:%s], так как она не запущена или выполняется восстановление тома.", + "ORG_ZSTACK_ZWATCH_ALARM_10000": "не удалось найти подписку на событие [uuid:%s], она могла быть удалена или отозвана", + "ORG_ZSTACK_GUESTTOOLS_10008": "невозможно получить последние гостевые инструменты для VM[UUID:%s], так как это не управляемая пользователем VM", + "ORG_ZSTACK_GUESTTOOLS_10005": "изменение состояния qga не удалось для виртуальной машины[uuid:%s]", + "ORG_ZSTACK_GUESTTOOLS_10006": "невозможно получить последние гостевые инструменты для VM [uuid:%s], так как тип гипервизора не поддерживается", + "ORG_ZSTACK_GUESTTOOLS_10004": "загрузка файла qga не удалась[%s]", + "ORG_ZSTACK_GUESTTOOLS_10001": "Произошла ошибка на VM-%s: %s", + "ORG_ZSTACK_ZWATCH_ALARM_10002": "значение повторного интервала для метрики[%s] не может быть меньше 1 часа", + "ORG_ZSTACK_GUESTTOOLS_10002": "загрузка файла не удалась на виртуальную машину-%s, %s", + "ORG_ZSTACK_ZWATCH_ALARM_10001": "не удалось найти аларм[uuid:%s], он мог быть удален или истек", + "ORG_ZSTACK_SSO_SERVICE_10008": "Токен %s не существует в конфигурации облачной среды. Пожалуйста, проверьте и повторно введите токен.", + "ORG_ZSTACK_AI_10109": "Центр моделей с UUID [%s] не найден", + "ORG_ZSTACK_SSO_SERVICE_10007": "Не удалось загрузить учетные данные администратора в Keycloak. Убедитесь, что необходимые разрешения и сетевые конфигурации правильно настроены для облачного развертывания.", + "ORG_ZSTACK_ZWATCH_ALARM_10007": "Подписка на событие уже имеет метку [%s]", + "ORG_ZSTACK_AI_10107": "Экземпляр сервиса моделей (основной) с рангом узла 0 не найден в группе экземпляров сервиса моделей [UUID: %s]", + "ORG_ZSTACK_ZWATCH_ALARM_10006": "Событие не имеет метки [%s]", + "ORG_ZSTACK_SSO_SERVICE_10009": "Тип данных %s не поддерживается в облачных вычислительных средах", + "ORG_ZSTACK_AI_10108": "Группа экземпляров сервиса моделей %s не найдена в облачной среде", + "ORG_ZSTACK_ZWATCH_ALARM_10005": "Действие с UUID [%s] уже связано с подпиской на событие с UUID [%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10027": "Не удалось создать имя LUN: %s, сообщение об ошибке: %s", + "ORG_ZSTACK_SSO_SERVICE_10004": "Требуется URL метаданных IdP.%s", + "ORG_ZSTACK_AI_10105": "Развертывание сервиса моделей выполнено успешно, но UUID экземпляра сервиса моделей отсутствует. Проверьте конфигурацию экземпляра.", + "ORG_ZSTACK_SSO_SERVICE_10003": "Недопустимый URL конечной точки авторизации: %s", + "ORG_ZSTACK_AI_10106": "UUID экземпляров сервиса моделей пусты; невозможно обработать экземпляры сервиса моделей. Убедитесь, что UUID предоставлены.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10029": "Идентификатор LUN является обязательным при запросе информации о сопоставлении LUN.", + "ORG_ZSTACK_SSO_SERVICE_10006": "Недопустимые метаданные поставщика идентификационных данных: %s", + "ORG_ZSTACK_AI_10103": "Группа экземпляров сервиса моделей [UUID: %s] не найдена, пропускается создание ресурса для выполнения сервиса", + "ORG_ZSTACK_VMWARE_10118": "Не удалось создать группу портов для узла %s, причина: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10028": "Не удалось запросить LUN %s из-за %s", + "ORG_ZSTACK_AI_10104": "Ответ развертывания сервиса моделей успешен, но группа экземпляров сервиса моделей [UUID: %s] не найдена в пуле экземпляров виртуальных машин", + "ORG_ZSTACK_VMWARE_10119": "Не удалось создать группу портов для узла %s", + "ORG_ZSTACK_AI_10101": "Бэкенд хранилища моделей не найден для группы экземпляров сервиса моделей [UUID: %s]", + "ORG_ZSTACK_VMWARE_10116": "Группа портов [%s] уже существует на узле [%s], но с другим идентификатором VLAN (%d)", + "ORG_ZSTACK_AI_10102": "Не удалось выделить идентификатор экземпляра сервиса моделей, причина: %s", + "ORG_ZSTACK_VMWARE_10117": "Группа портов [%s] уже существует на узле [%s]. Пожалуйста, создайте новую группу портов с другим именем или вручную удалите существующую группу портов и снова присоедините ее к кластеру.", + "ORG_ZSTACK_SSO_SERVICE_10002": "Клиент SSO не является типом идентификации [%s], операция отправки не разрешена.", + "ORG_ZSTACK_VMWARE_10114": "Имя dvSwitch [%s] не является уникальным", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10024": "Не удалось создать имя LUN: %s, невозможно найти первопричину", + "ORG_ZSTACK_SSO_SERVICE_10001": "Клиент SSO с UUID [%s] не существует.", + "ORG_ZSTACK_AI_10100": "Группа экземпляров сервиса моделей [UUID: %s] UUID сервиса моделей пуст", + "ORG_ZSTACK_VMWARE_10115": "Узел [%s:%s] не найден в инвентаре vCenter", + "ORG_ZSTACK_VMWARE_10112": "не удалось получить список dvSwitch для %s", + "ORG_ZSTACK_HYBRID_NETWORK_10016": "%s не является допустимым блоком CIDR", + "ORG_ZSTACK_VMWARE_10113": "не удалось получить имя кластера vCenter[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10017": "Правило группы безопасности с такими же параметрами уже существует. Пожалуйста, измените или удалите существующее правило перед созданием нового.", + "ORG_ZSTACK_VMWARE_10110": "гостевые инструменты не установлены или не запущены для ВМ: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10018": "dstCidrBlock[%s] не является допустимым диапазоном адресов IPv4 или IPv6", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10020": "не удалось обновить имя LUN: %s, сообщение об ошибке: %s", + "ORG_ZSTACK_VMWARE_10111": "не удалось загрузить файл для виртуальной машины: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10019": "такой ECS-инстанс не существует: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10010": "accessPointUuid не может быть null, если виртуальный маршрутизатор имеет тип VBR.", + "ORG_ZSTACK_HYBRID_NETWORK_10011": "невозможно найти такой UUID маршрутизатора[%s] в VirtualBorderRouterVO", + "ORG_ZSTACK_GUESTTOOLS_10018": "невозможно выполнить миграцию ВМ[UUID:%s], так как vfNic присоединен, но гостевые инструменты не запущены", + "ORG_ZSTACK_ZWATCH_ALARM_10011": "событие[%s] не имеет метки[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10012": "невозможно найти UUID маршрутизатора[%s] в VpcVirtualRouterVO", + "ORG_ZSTACK_GUESTTOOLS_10019": "невозможно присоединить сеть L3 к ВМ [UUID:%s], так как гостевые инструменты не запущены.", + "ORG_ZSTACK_ZWATCH_ALARM_10010": "пространство имен[%s] не содержит событие[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10013": "неподдерживаемый тип маршрутизатора: %s", + "ORG_ZSTACK_GUESTTOOLS_10016": "невозможно изменить состояние HA VF NIC, так как VF NIC [UUID:%s] не найден", + "ORG_ZSTACK_HYBRID_NETWORK_10014": "Невозможно удалить запись системной виртуальной машины", + "ORG_ZSTACK_GUESTTOOLS_10017": "Не удалось изменить состояние виртуальной сетевой карты для обеспечения высокой доступности, так как гостевые инструменты не запущены. Пожалуйста, убедитесь, что гостевые инструменты установлены и запущены перед повторной попыткой выполнения этой операции.", + "ORG_ZSTACK_HYBRID_NETWORK_10015": "поддерживается только правило внутреннего доступа в VPC", + "ORG_ZSTACK_GUESTTOOLS_10014": "Сценарий содержит заполнитель %s, для которого нет соответствующих параметров. Пожалуйста, предоставьте значения для этих заполнителей через runtimeParams для обеспечения правильной настройки вашей облачной вычислительной среды.", + "ORG_ZSTACK_ZWATCH_ALARM_10015": "Поле Period не поддерживается для метрики [name:%s]", + "ORG_ZSTACK_GUESTTOOLS_10015": "невозможно выполнить миграцию основного хранилища, так как ВМ [UUID:%s] присоединена к VF Nic, но Guest Tools не запущены", + "ORG_ZSTACK_ZWATCH_ALARM_10014": "Поле Period не может быть null для метрики [name:%s]", + "ORG_ZSTACK_GUESTTOOLS_10012": "encodingType и scriptContent должны либо присутствовать оба, либо отсутствовать оба в конфигурации вашего облачного развертывания.", + "ORG_ZSTACK_ZWATCH_ALARM_10013": "пространство имен[%s] не найдено в указанном реестре пространств имен облака", + "ORG_ZSTACK_GUESTTOOLS_10013": "Неверный формат renderParams, должен быть допустимым JSON-массивом пар ключ-значение. Пример: [{\\\"key\\\":\\\"k1\\\",\\\"value\\\":\\\"v1\\\"}]. Ошибка: %s", + "ORG_ZSTACK_GUESTTOOLS_10010": "не удалось проверить гостевые инструменты на хосте[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10019": "не удалось запросить LUN по пути: %s, сообщение об ошибке: %s", + "ORG_ZSTACK_GUESTTOOLS_10011": "не удалось установить VM UUID: %s ИМЯ: %s hostname, так как QEMU Guest Agent не запущен и нет DHCP-сервиса", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10016": "не удалось добавить группу хостов: %s, сообщение об ошибке: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10015": "не удалось запросить группу хостов из-за %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10017": "не удалось запросить LUN: %s, сообщение об ошибке: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10012": "не удалось удалить группу хостов %s из-за %s", + "ORG_ZSTACK_VMWARE_10105": "пул ресурсов не найден для вычислительного хоста %s", + "ORG_ZSTACK_VMWARE_10106": "не удалось найти пул ресурсов для хоста %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10014": "не удалось удалить инициатор %s из-за %s", + "ORG_ZSTACK_VMWARE_10103": "не удалось установить ESX VM UUID [%s:%s] из-за [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10013": "идентификатор хоста обязателен, но получено:%s", + "ORG_ZSTACK_VMWARE_10104": "шаблон [%%s] не найден в репозитории облачных шаблонов", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10029": "невозможно найти экземпляр сборки с UUID: %s, или он находится в статусе удаления", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10028": "невозможно найти UUID для образа[%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10027": "imageStore не подключен к облачному хранилищу. Пожалуйста, убедитесь, что ваш облачный сервис настроен правильно и попробуйте снова.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10026": "imageStore не включен. Пожалуйста, убедитесь, что imageStore настроен и включен в настройках вашего облачного окружения.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10024": "невозможно найти приложение сборки: [%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10022": "система сборки [UUID: %s] не присоединена к вычислительной зоне [UUID: %s]", + "ORG_ZSTACK_CONTAINER_10040": "Не удалось создать развертывание ни на одном доступном кластере. Попробовано %d кластеров: %s", + "ORG_ZSTACK_FLOWMETER_10013": "Коллектор дублируется с %s", + "ORG_ZSTACK_FLOWMETER_10014": "Не указаны параметры для запроса на подготовку облачных ресурсов. Пожалуйста, укажите %s.", + "ORG_ZSTACK_FLOWMETER_10015": "[%s] не соответствует формату IP-адреса", + "ORG_ZSTACK_FLOWMETER_10016": "FlowCollector[%s] не существует", + "ORG_ZSTACK_GUESTTOOLS_10029": "невозможно получить информацию о гостевых инструментах с VM [uuid:%s], так как она не запущена", + "ORG_ZSTACK_CONTAINER_10043": "Не удалось запросить облачный сервис: %s, из-за %s", + "ORG_ZSTACK_FLOWMETER_10017": "FlowMeter[%s] не существует", + "ORG_ZSTACK_FLOWMETER_10018": "FlowMeter[%s] не поддерживает версию IPv6 [%s]", + "ORG_ZSTACK_GUESTTOOLS_10027": "невозможно присоединить ISO гостевых инструментов к VM [UUID:%s], так как это не пользовательская VM", + "ORG_ZSTACK_CONTAINER_10045": "Не удалось создать сервис из-за %s", + "ORG_ZSTACK_FLOWMETER_10019": "Коллектор [%s %d] дублируется с %s", + "ORG_ZSTACK_GUESTTOOLS_10028": "невозможно присоединить ISO гостевых инструментов к VM [uuid:%s], так как у неё нет CDROM-устройства", + "ORG_ZSTACK_CONTAINER_10037": "Контейнеризированные кластеры не найдены. Пожалуйста, проверьте NativeClusterVO для получения деталей.", + "ORG_ZSTACK_GUESTTOOLS_10025": "невозможно присоединить ISO инструментов гостя к ВМ [uuid:%s], так как тип гипервизора не поддерживается", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10057": "не удалось выключить шасси baremetal[uuid:%s] с помощью ipmitool", + "ORG_ZSTACK_GUESTTOOLS_10026": "невозможно присоединить ISO инструментов гостя к ВМ [UUID:%s], так как она не запущена", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10058": "не удалось выключить экземпляр baremetal[uuid:%s] через bm агент, причина: %s", + "ORG_ZSTACK_GUESTTOOLS_10023": "не удалось обновить сетевую конфигурацию ВМ[uuid:%s], так как версия инструментов гостя слишком низкая для этой функции", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10059": "шасси baremetal2[uuid:%s] все еще не выключено спустя %d секунд", + "ORG_ZSTACK_GUESTTOOLS_10024": "не удалось обновить сетевую конфигурацию ВМ[uuid:%s], так как инструменты гостя не запущены", + "ORG_ZSTACK_GUESTTOOLS_10021": "Обнаружен конфликт с именем хоста. Другая ВМ с UUID [%s] уже использует имя хоста [%s] в сети L3 с UUID [%s]", + "ORG_ZSTACK_GUESTTOOLS_10022": "не удалось обновить сетевую конфигурацию ВМ[uuid:%s], так как виртуальная машина не запущена", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10054": "не удалось установить соединение с экземпляром baremetal2 [uuid:%s] через шлюз [uuid:%s], из-за %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10055": "не удалось изменить пароль экземпляра baremetal[uuid:%s] через шлюз[uuid:%s], так как %s", + "ORG_ZSTACK_GUESTTOOLS_10020": "невозможно установить имя хоста ВМ. ВМ [UUID:%s] не имеет сети L3 по умолчанию", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10056": "не удалось включить шасси baremetal[uuid:%s] с помощью ipmitool", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10021": "невозможно найти систему сборки [%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10020": "система сборки [UUID: %s] уже присоединена к зоне [UUID: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10050": "не удалось создать консольный прокси для экземпляра baremetal[uuid:%s] в шлюзе[uuid:%s], так как %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10051": "не удалось переключить сеть по умолчанию с l3[uuid:%s] на l3[uuid:%s] для экземпляра baremetal[uuid:%s], из-за %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10018": "не удалось добавить BuildApp, так как appId[%s:%s] дублируется другим экземпляром BuildApp", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10017": "невозможно подключиться к локальной системе сборки хранилища [url: %s] из-за проблемы с подключением", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10016": "не удалось создать BuildApp, так как appId[%s] дублируется другим BuildApp", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10015": "Приложение сборки отключено, так как система сборки находится в состоянии 'Остановлена'. Пожалуйста, запустите систему сборки для включения приложения", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10014": "вызов rest %s не удался, причина: %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10013": "приложение сборки находится в состоянии %s, которое не поддерживает текущую операцию", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10012": "невозможно найти приложение сборки по UUID[%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10011": "невозможно выполнить операцию, так как система сборки находится в состоянии %s", + "ORG_ZSTACK_CONTAINER_10031": "Развертывание не найдено: %s", + "ORG_ZSTACK_FLOWMETER_10003": "Сеть[%s] уже интегрирована в измеритель потока[%s]", + "ORG_ZSTACK_FLOWMETER_10004": "Виртуальный маршрутизатор уже добавлен в другой измеритель потока. Пожалуйста, убедитесь, что он не дублируется", + "ORG_ZSTACK_FLOWMETER_10005": "недопустимый тип параметра %s, должен быть из допустимого диапазона %s", + "ORG_ZSTACK_CONTAINER_10032": "Не удалось применить исправление к развертыванию из-за %s", + "ORG_ZSTACK_CONTAINER_10034": "Не удалось заменить развертывание из-за %s", + "ORG_ZSTACK_CONTAINER_10026": "Не удалось удалить сервис из-за %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10046": "не удалось уничтожить сеть подготовки в шлюзе[uuid:%s], потому что %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10047": "не найден подготовленный сетевой интерфейс для baremetal-экземпляра[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10048": "не удалось создать конфигурации подготовки для baremetal-экземпляра[uuid:%s] в шлюзе[uuid:%s], потому что %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10049": "не удалось удалить конфигурации подготовки для baremetal-экземпляра[uuid:%s] в шлюзе[uuid:%s], потому что %s", + "ORG_ZSTACK_IMAGEREPLICATOR_10000": "целевое хранилище резервных копий[uuid:%s] стало недоступным для использования", + "ORG_ZSTACK_GUESTTOOLS_10032": "невозможно обновить состояние гостевых инструментов для ВМ [uuid:%s], так как ВМ была удалена", + "ORG_ZSTACK_ALIYUN_OSS_10002": "AWS access key ID, secret access key и region должны быть установлены одновременно.", + "ORG_ZSTACK_CONTAINER_10029": "Ошибка API: исходный файл не найден в системе облачного хранения. Проверьте путь к файлу и повторите попытку.", + "ORG_ZSTACK_IMAGEREPLICATOR_10001": "Одно или несколько хранилищ резервных копий[uuids:%s] были добавлены в группу репликации[uuid:%s].", + "ORG_ZSTACK_ALIYUN_OSS_10003": "OSS bucket не пуст! Убедитесь, что корзина пуста, прежде чем продолжить операцию.", + "ORG_ZSTACK_GUESTTOOLS_10030": "невозможно получить информацию о гостевых инструментах ВМ [UUID:%s], так как это не пользовательская ВМ", + "ORG_ZSTACK_ALIYUN_OSS_10000": "ossBucket [%s] уже зарегистрирован в dataCenter [%s]", + "ORG_ZSTACK_GUESTTOOLS_10031": "неверный параметр отладки: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10045": "не удалось подготовить сеть подготовки в шлюзе[uuid:%s], потому что %s", + "ORG_ZSTACK_ALIYUN_OSS_10001": "OssBucket[%s] не связан.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10010": "Установлены и export ID, и UUID сборки приложения, но они не совпадают. Проверьте значения %s и %d.", + "ORG_ZSTACK_IMAGEREPLICATOR_10002": "Хранилище резервных копий[uuids:%s] не типа ImageStoreInstance", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10040": "Не удалось преобразовать данные образа в локальный диск. Убедитесь в достаточности ресурсов хранилища и правильности разрешений. Если проблема сохраняется, рассмотрите использование сервисов объектного хранения для управления образами.", + "ORG_ZSTACK_IMAGEREPLICATOR_10003": "Хранилище резервных копий [UUIDs:%s] не связано ни с одной Зоной", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10041": "baremetal2 экземпляр [uuid:%s] преобразование тома на шасси [uuid:%s] не удалось, таймаут после %d минут", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10035": "Не удалось получить iSCSI target IQN или IP-адрес шлюза для тома [uuid:%s] с основного хранилища [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10037": "шасси:%s диск не имеет информации WWN, проверьте шасси и повторите попытку", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10031": "не удалось отсоединить подготовленный сетевой интерфейс от объединения на baremetal-экземпляре [uuid:%s] через шлюз [uuid:%s], потому что %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10032": "baremetal2 экземпляр[uuid:%s] не подключен; поэтому он не может присоединить подготовленный сетевой интерфейс к объединению.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10033": "не удалось присоединить подготовленный сетевой интерфейс к объединению на baremetal-экземпляре [uuid:%s] через шлюз [uuid:%s], потому что %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10030": "baremetal2 экземпляр[uuid:%s] не подключен; поэтому он не может отсоединить подготовленный сетевой интерфейс от конфигурации объединения.", + "ORG_ZSTACK_CONTAINER_10051": "Не удалось найти Kubernetes клиент для учетной записи[uuid:%s]", + "ORG_ZSTACK_CONTAINER_10050": "Конфигурация Kubernetes для кластера %s равна null", + "ORG_ZSTACK_CONTAINER_10052": "не удалось использовать содержимое файла kube config: %s", + "ORG_ZSTACK_CORE_PROGRESS_10000": "параметр apiId[%s] не является допустимым UUID для конфигурации облачного сервиса.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10029": "не удалось удалить конфигурации преобразования тома в локальный диск шасси в шлюзе[uuid:%s] для baremetal instance[uuid:%s]", + "ORG_ZSTACK_CONTAINER_10056": "Не удается найти хранилище резервных копий контейнеров с UUID: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10024": "provisioned_ip %s недоступен, так как не может подключиться к шлюзу %s; подробная ошибка:%s", + "ORG_ZSTACK_CONTAINER_10047": "Не удалось получить пакет состояния сервиса для сервиса[%s]", + "ORG_ZSTACK_CONTAINER_10049": "Не удается найти кластер по указанному идентификатору кластера: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10027": "не удалось проверить baremetal шасси по instance[uuid:%s] через шлюз[uuid:%s], так как %s", + "ORG_ZSTACK_STORAGE_CBT_10020": "Неожиданное состояние VM[UUID: %s]: %s, ожидаемое состояние VM - Running.", + "ORG_ZSTACK_STORAGE_CBT_10021": "VM [UUID: %s] уже имеет задание резервного копирования; поэтому одновременное включение задания CBT не допускается.", + "ORG_ZSTACK_STORAGE_CBT_10016": "Не указан тип гипервизора для VM %s", + "ORG_ZSTACK_STORAGE_CBT_10017": "Не найден CBTBackupFactory типа[%s] в настроенных провайдерах облачного хранилища", + "ORG_ZSTACK_STORAGE_CBT_10014": "VM [uuid: %s] уже защищена заданием: %s", + "ORG_ZSTACK_STORAGE_CBT_10015": "не удалось создать тома cbt. подробности: %s", + "ORG_ZSTACK_STORAGE_CBT_10018": "Задание CVM не найдено[uuid: %s]", + "ORG_ZSTACK_STORAGE_CBT_10019": "Задание Cbt [UUID: %s] уже включено. Пожалуйста, отключите его.", + "ORG_ZSTACK_CONTAINER_10000": "хранилище резервных копий контейнеров не поддерживает указанный формат %s", + "ORG_ZSTACK_CONTAINER_10002": "Зона доступности не найдена для endpoint[%s]", + "ORG_ZSTACK_IAM2_RBAC_10006": "операции[%s] запрещены в этой облачной вычислительной среде", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10008": "не удалось получить виртуальную сеть[uuid:%s] из tf контроллера", + "ORG_ZSTACK_IAM2_RBAC_10001": "Поскольку проект требует обязательного использования группы безопасности, системный тег обязателен для операций с виртуальной машиной.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10009": "не удалось обновить tf l2 сеть[name:%s] на tf контроллере", + "ORG_ZSTACK_IAM2_RBAC_10000": "создание VM экземпляра не удалось, так как l3 сеть[uuid:%s] не присоединена ни к одному кластеру вычислений", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10006": "создание tf L2 сети[name:%s] на tf контроллере не удалось", + "ORG_ZSTACK_IAM2_RBAC_10003": "проект[uuid:%s] выведен из эксплуатации, все операции отклоняются.", + "ORG_ZSTACK_IAM2_RBAC_10002": "проект учетной записи[uuid:%s] не существует", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10005": "не удалось получить проект[uuid:%s] на Terraform контроллере", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10002": "Ошибка получения домена по умолчанию на TensorFlow контроллере.%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10003": "Создание TF проекта для ZStack Admin на TF контроллере не удалось", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10000": "SDN-контроллер с указанным именем уже существует. Пожалуйста, выберите другое имя или используйте существующий.", + "ORG_ZSTACK_STORAGE_CBT_10012": "", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10001": "невозможно найти ресурс для задачи CBT[uuid: %s]", + "ORG_ZSTACK_STORAGE_CBT_10013": "", + "ORG_ZSTACK_STORAGE_CBT_10011": "Не удалось получить учетную запись администратора по умолчанию из базы данных ZStack", + "ORG_ZSTACK_STORAGE_CBT_10006": "", + "ORG_ZSTACK_STORAGE_CBT_10009": "хост не найден для виртуальной машины: %s", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10004": "", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10003": "том[uuid:%s] уже экспортирован для vmInstance[uuid:%s].", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10000": "", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10001": "невозможно найти задачу Cloud Block Storage[uuid:%s]", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10019": "", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10082": "vm[uuid: %s] в данный момент запущена. Пожалуйста, остановите её и попробуйте снова.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10016": "", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10013": "неверный тип параметра '%s' в выражении, он должен быть типа %s, но получен %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10011": "", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10080": "отсутствует параметр '%s' в облачном вычислении", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10081": "", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10007": "недопустимое выражение: %s, %s Пожалуйста, убедитесь, что выражения допустимы для облачных вычислительных сред.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10006": "", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10005": "недопустимое выражение: %s, допустимое облачное выражение не найдено", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10004": "", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10003": "добавление tf l3 подсети[name:%s] на tf контроллере не удалось из-за:%s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10002": "", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10001": "baremetal2 шлюз с UUID: %s не подключен; поэтому URL консоли не может быть сгенерирован для экземпляра с UUID: %s.", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10000": "", + "ORG_ZSTACK_CAS_10000": "обновление tf l3 сети[name:%s] на tf контроллере не удалось из-за:%s", + "ORG_ZSTACK_CAS_10002": "", + "ORG_ZSTACK_CONTAINER_10020": "удаление tf L3 сети[name:%s] на tf контроллере не удалось из-за:%s", + "ORG_ZSTACK_CAS_10001": "", + "ORG_ZSTACK_CONTAINER_10022": "Идентификатор кластера равен null при создании сетевой политики", + "ORG_ZSTACK_CAS_10003": "Такой тип данных[%s] не определен в CAS.", + "ORG_ZSTACK_CONTAINER_10024": "Не удалось создать сетевую политику из-за %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10009": "Задача экспорта с идентификатором %s не найдена в истории экспорта сборки. Проверьте идентификатор задачи экспорта и повторите попытку.", + "ORG_ZSTACK_CONTAINER_10023": "не удается получить ApiClient по идентификатору кластера: %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10008": "buildAppUuid и buildSystemUuid не могут быть одновременно null. Убедитесь, что предоставлен либо buildAppUuid, либо buildSystemUuid.", + "ORG_ZSTACK_CONTAINER_10015": "Не удалось удалить развертывание из-за %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10079": "hypervisor type недействителен для кластера[uuid:%s]", + "ORG_ZSTACK_CONTAINER_10017": "Не удается найти под[имя=%s, пространство имен=%s]", + "ORG_ZSTACK_CONTAINER_10016": "Не удалось завершить развертывание из-за неуказанной ошибки.%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10075": "не удалось получить IP-адреса шлюза для пути доступа [iscsiPath: %s] для блочного тома %s из-за %s", + "ORG_ZSTACK_CONTAINER_10018": "Не удалось добавить метку к поду из-за %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10076": "не удалось отключить том[uuid:%s] от экземпляра baremetal[uuid:%s] через шлюз[uuid:%s], потому что %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10028": "добавление конфигурации DNS к сети уровня 3 [имя:%s] на контроллере TensorFlow не удалось из-за:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10077": "не удалось уничтожить том[uuid:%s] для экземпляра baremetal[uuid:%s] в шлюзе[uuid:%s], потому что %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10078": "Все Ceph MON основного хранилища [uuid:%s] не находятся в работоспособном состоянии", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10072": "экземпляр baremetal2[uuid:%s] не подключен; поэтому том не может быть к нему подключен.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10073": "Не удалось получить LUN ID тома на внешнем основном хранилище %s. Убедитесь, что система хранения правильно настроена и доступна.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10025": "удаление маршрута хоста из виртуальной сети[имя:%s] на контроллере менеджера трафика не удалось из-за:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10074": "не удалось получить LUN ID тома [uuid:%s] для экземпляра bare metal [uuid:%s] в шлюзе [uuid:%s] из-за %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10022": "добавление маршрутизатора хоста к сети уровня-3[имя:%s] на tf контроллере не удалось из-за:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10070": "не удалось подключить том с UUID: %s к экземпляру baremetal с UUID: %s через шлюз с UUID: %s из-за %s", + "ORG_ZSTACK_FLOWMETER_10021": "%s должно быть числовым значением", + "ORG_ZSTACK_LOG4J2_10001": "Неизвестный тип appender log4j2 %s", + "ORG_ZSTACK_LOG4J2_10000": "Фабрика не найдена для типа appender Log4j2:%s.", + "ORG_ZSTACK_CONTAINER_10011": "Хост не найден для uuid[%s]", + "ORG_ZSTACK_CONTAINER_10013": "Не удается найти Endpoint управления контейнерами [uuid:%s]", + "ORG_ZSTACK_CONTAINER_10012": "Провайдер не найден для поставщика[%s]", + "ORG_ZSTACK_CONTAINER_10004": "Хост[%s] не связан с endpoint[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10068": "не удалось подготовить том[uuid:%s] для экземпляра baremetal[uuid:%s] через шлюз[uuid:%s], потому что %s", + "ORG_ZSTACK_CONTAINER_10005": "Кластер не найден для endpoint[%s]", + "ORG_ZSTACK_CONTAINER_10008": "Не удалось получить список экземпляров для кластера[%s]: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10064": "не удалось подключить сетевую карту с UUID:%s к экземпляру Baremetal2 с UUID:%s через Gateway с UUID:%s из-за %s", + "ORG_ZSTACK_CONTAINER_10007": "Зона[%s] не соответствует Endpoint[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10065": "экземпляр baremetal2[uuid:%s] не подключен; поэтому его невозможно отключить от сетевого интерфейса.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10066": "не удалось отключить сетевой интерфейс [uuid:%s] от bare metal instance [uuid:%s] через gateway [uuid:%s], потому что %s", + "ORG_ZSTACK_CONTAINER_10009": "Кластер[%s] уже существует в endpoint[%s] с другой зоной доступности[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10060": "Убедитесь, что все BareMetal2 шлюзы в сети подготовки [uuid:%s] подключены.", + "ORG_ZSTACK_CONFIGURATION_10011": "неподдерживаемая стратегия выделения основного хранилища[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10061": "Список UUID виртуальных машин пуст. Пожалуйста, укажите хотя бы один корректный UUID.", + "ORG_ZSTACK_CONFIGURATION_10010": "неподдерживаемая стратегия выделения хоста[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10062": "baremetal2 шлюз [UUID: %s, статус: %s] не подключен", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10063": "экземпляр baremetal2[uuid:%s] не подключен; поэтому к нему невозможно подключить сетевую карту.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10031": "не удалось удалить конфигурацию DNS из сети уровня 3 [name:%s] на tf controller из-за:%s", + "ORG_ZSTACK_STORAGE_BACKUP_10119": "installPath и bootstrap URL являются обязательными.", + "ORG_ZSTACK_STORAGE_BACKUP_10118": "Не разрешено перезаписывать базу данных из резервной копии в облачной среде.", + "ORG_ZSTACK_STORAGE_BACKUP_10117": "резервная копия базы данных[uuid:%s] была экспортирована в хранилище резервных копий[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10116": "резервная копия базы данных [UUID %s] не была экспортирована из хранилища резервных копий [UUID: %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10115": "текущее состояние хранилища резервных копий[%s] не позволяет выполнить операцию[%s], допустимые состояния: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10114": "Не удалось установить SSH-соединение с соседним узлом с помощью SSH-ключа. Пожалуйста, проверьте сетевое подключение и конфигурацию SSH-ключа.", + "ORG_ZSTACK_STORAGE_BACKUP_10113": "bandWidth должно быть положительным значением", + "ORG_ZSTACK_STORAGE_BACKUP_10112": "В параметрах задания отсутствует значение удаленного хранения: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10039": "Виртуальные машины[uuid:%s] не остановлены и не работают на конкретном хосте.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10007": "Встроенная роль администратора безопасности не может быть удалена встроенной ролью администратора безопасности.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10038": "том[uuid:%s] подключен к одной или нескольким виртуальным машинам[uuid:%s], которые не находятся в остановленном состоянии и не работают на конкретном хосте.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10008": "невозможно отозвать роль системного администратора у группы пользователей системных администраторов", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10009": "Невозможно удалить встроенного аудитора. Пожалуйста, убедитесь, что вы не пытаетесь изменить системную роль.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10003": "Имя начального пользователя для этого ресурса не может быть обновлено.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10034": "невозможно найти репликацию тома %s на хосте %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10004": "%s является зарезервированным ключевым словом в средах виртуализации облачных вычислений, пожалуйста, выберите другое имя.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10037": "UUID основного хранилища не может быть null. Пожалуйста, убедитесь, что для основного хранилища предоставлен допустимый UUID.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10036": "Недействительный UUID ресурса %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10006": "невозможно отозвать роль аудит-администратора у встроенного пользователя-администратора", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10042": "mini storage [UUID: %s] должен быть пустым перед восстановлением данных из ZBox. Пожалуйста, очистите его.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10001": "Фабрика для типа вывода FluentBit не найдена: %s.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10010": "Невозможно удалить встроенного администратора безопасности. Пожалуйста, убедитесь, что вы не пытаетесь изменить системную роль.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10041": "нет LocalStorageBackupStorageMediator, поддерживающего гипервизор[%s] и тип резервного хранилища[%s]", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10011": "Невозможно отозвать привилегии у встроенного системного администратора.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10003": "Имя хоста или ID не может быть null. Пожалуйста, предоставьте допустимое имя хоста или ID.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10012": "Убедитесь, что роли, которые вы хотите добавить, имеют одинаковую идентичность и совместимы в вашей среде виртуализации.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10002": "Неизвестный тип плагина вывода FluentBit %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10013": "Невозможно добавить роль: %s к идентичности: %s для виртуального ID[uuid:%s]", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10005": "Номер порта не может быть null", + "ORG_ZSTACK_APPCENTER_UTILS_10000": "невозможно найти JSON файл шаблона по адресу: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10004": "сервер хранения журналов [адрес: %s] недоступен", + "ORG_ZSTACK_APPCENTER_UTILS_10001": "Не удалось сгенерировать JSON шаблон для конфигурации облачного ресурса", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10040": "Не удалось %s, так как хосты[uuid:%s] не включены и не имеют статуса подключения.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10007": "Новая конфигурация содержит ошибки, что приводит к исключениям службы. Пожалуйста, проверьте параметры конфигурации еще раз. Подробности: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10006": "Создание сервера журналов не удалось. Неправильно переданные параметры конфигурации могли привести к тому, что служба Fluent Bit перейдет в неактивное состояние. Пожалуйста, дважды проверьте конфигурацию на точность.", + "ORG_ZSTACK_STORAGE_BACKUP_10111": "отсутствует тип удаленного хранения в параметрах задания", + "ORG_ZSTACK_STORAGE_BACKUP_10110": "отсутствует 'retentionValue' в конфигурации параметров задания", + "ORG_ZSTACK_STORAGE_BACKUP_10129": "Экземпляр с UUID корневого тома не найден: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10124": "ВМ для тома[uuid:%s] не найдена", + "ORG_ZSTACK_STORAGE_BACKUP_10123": "Операция не поддерживается для общего подключения тома", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10028": "резервное хранилище не может получить изображение[uuid:%s] для тома[uuid:%s]", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10005": "Не удается найти JoinType в импортированном пакете или классе. Пожалуйста, убедитесь, что вы импортировали правильный пакет и класс содержит определенный JoinType.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10029": "изображение[uuid: %s] не имеет ссылки на резервное хранилище[uuid: %s]", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10000": "вывод из [CloudFunction] пуст", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10001": "вызов действия[%s] не удался, причина: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10023": "ожидается операция на хостах[%s], но доступны и включены только хосты %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10002": "действие: %s не поддерживается для IAM роли: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10120": "databaseBackup[uuid:%s] не включен и недоступен", + "ORG_ZSTACK_STORAGE_SNAPSHOT_REFERENCE_10000": "Том с UUID %s был указан другими томами [%s]. Пожалуйста, объедините эти тома и их потомков перед изменением пути установки.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10017": "требуемый кластер %s не подключен к основному хранилищу %s для создания тома %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10016": "статус репликационной сети тома [uuid:%s] перешел в режим StandAlone, при этом все хосты находятся в состоянии Connected; пожалуйста, сначала восстановите его.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10018": "невозможно найти доступный хост в требуемом кластере %s для создания тома", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10013": "хост[uuid: %s] мини-основного хранилища[uuid: %s] не имеет достаточной емкости[текущая: %s байт, требуется: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10017": "baremetal2 шлюз с UUID: %s не расположен в той же зоне, что и кластер с UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10012": "невозможно выделить достаточное пространство для основного хранилища [UUID: %s] на хосте [UUID: %s], недостаточная физическая емкость", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10018": "невозможно изменить кластер baremetal2 шлюза [uuid:%s] при наличии активных экземпляров, которые от него зависят", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10015": "том[uuid:%s] выполняет синхронизацию репликации, пожалуйста, дождитесь завершения синхронизации.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10019": "кластер[%s] не является типом baremetal", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10014": "невозможно найти доступный хост для изменения размера тома[uuid: %s] в системе мини-хранилища[uuid: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10013": "кластер[uuid:%s] недоступен", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10014": "кластер[uuid:%s] не является кластером виртуализации bare metal", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10022": "невозможно выделить порт синхронизации хранилища на хосте %s: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10015": "шлюз[uuid:%s] недоступен", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10021": "невозможно найти доступный хост для выполнения команды для основного хранилища[uuid: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10016": "baremetal2 шлюз с UUID: %s уже является частью кластера с UUID: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10010": "baremetal2 шлюз[uuid:%s] может быть подключен только к одному вычислительному кластеру", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10011": "baremetal2 шлюз [UUID: %s] не подключен к кластеру [UUID: %s], отключение не требуется.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10012": "baremetal2 шлюз с UUID:%s в настоящее время подключен только к одному кластеру; не отключайте его.", + "ORG_ZSTACK_STORAGE_BACKUP_10108": "отсутствуют 'retentionPolicyType' и 'retentionPeriod' в параметрах задания", + "ORG_ZSTACK_STORAGE_BACKUP_10107": "неожиданный UUID хранилища резервных копий: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10106": "Параметр задания 'backupStorageUuids' пуст. Пожалуйста, убедитесь, что предоставлены допустимые UUID хранилища резервных копий для продолжения операции.", + "ORG_ZSTACK_STORAGE_BACKUP_10105": "отсутствуют 'backupStorageUuids' в параметрах задания, пожалуйста, убедитесь, что указаны все необходимые UUID хранилища резервных копий", + "ORG_ZSTACK_STORAGE_BACKUP_10104": "отсутствуют обязательные параметры задания: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10103": "неожиданный статус задачи: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10102": "Синхронизация не удалась из-за отсутствия исходного файла. Пожалуйста, убедитесь, что все необходимые файлы загружены, и повторите попытку.", + "ORG_ZSTACK_STORAGE_BACKUP_10101": "резервная копия базы данных[uuid:%s] не найдена в репозитории хранилища[uuid:%s]", + "ORG_ZSTACK_LOGIN_PLUGIN_10002": "отсутствует LoginUserInfo при использовании функционала входа через плагин", + "ORG_ZSTACK_LOGIN_PLUGIN_10001": "плагин входа с именем %s не найден", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10005": "mini storage [UUID: %s, name: %s] не может найти доступный хост в подключенных кластерах для создания тома", + "ORG_ZSTACK_LOGIN_PLUGIN_10000": "loginPluginName отсутствует. Пожалуйста, укажите корректное имя плагина для аутентификации при входе.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10007": "Не удается определить, какому вычислительному экземпляру назначить запрос. Пожалуйста, убедитесь, что ваши экземпляры правильно зарегистрированы и помечены в облачной среде. Если проблема сохраняется, обратитесь в службу поддержки за дополнительной помощью.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10002": "хост[uuid:%s] не подключен к облачной среде", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10014": "невозможно добавить административные привилегии проекту", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10006": "baremetal2 узел с управляющим IP %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10001": "На инстансе [UUID:%s] все еще существует кэшированный том, невозможно обновить URL кэшированного тома", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10015": "операция не разрешена белым списком виртуальных машин [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10007": "Хост с управляющим IP %s столкнулся с проблемой.", + "ORG_ZSTACK_KVM_10110": "Хост [IP:%s] был перехвачен из-за наличия его уникального идентификатора [HostUuid:%s] в базе данных.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10004": "ResourceType [%s] из APIRecoverResourceSplitBrainMsg недействителен для восстановления облачного ресурса.", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10016": "операция запрещена черным списком виртуальных машин [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10008": "невозможно подключить BareMetal2 шлюз [uuid:%s] к не-BareMetal2 кластеру [uuid:%s]", + "ORG_ZSTACK_KVM_10111": "невозможно определить архитектуру процессора хоста; пожалуйста, проверьте имя пользователя и пароль; %s", + "ORG_ZSTACK_STORAGE_BACKUP_10109": "отсутствует 'retentionType' в конфигурации параметров задания", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10009": "baremetal2 шлюз с UUID: %s уже подключен к кластеру с UUID: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10002": "Уже существует baremetal PXE сервер с управляющим IP %s; пожалуйста, не используйте его для создания Baremetal2 шлюза.", + "ORG_ZSTACK_KVM_10103": "невозможно подключиться к KVM[ip:%s, username:%s, sshPort: %d] для выполнения DNS-проверки; пожалуйста, проверьте корректность имени пользователя и пароля.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10004": "управляющий ip[%s] не является допустимым IPv4-адресом или именем хоста", + "ORG_ZSTACK_KVM_10104": "не удалось выполнить пинг всех DNS/IP-адресов в %s; пожалуйста, проверьте сетевое подключение и настройки DNS в /etc/resolv.conf, чтобы убедиться, что ваш экземпляр имеет доступ к публичному интернету.", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10010": "Виртуальная машина не найдена, операция mini storage не выполнена", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10005": "невозможно добавить BareMetal2 шлюз в не-BareMetal2 кластер[uuid:%s]", + "ORG_ZSTACK_KVM_10105": "невозможно подключиться к KVM[ip:%s, username:%s, SSH port:%d] для проверки доступности управляющего узла; пожалуйста, проверьте правильность учетных данных; %s", + "ORG_ZSTACK_VPC_HA_VPCHAGC_10000": "VR[uuid: %s] экземпляр не запущен", + "ORG_ZSTACK_KVM_10106": "KVM-хост [ip:%s] не может получить доступ к URL обратного вызова управляющего узла. Похоже, что KVM-хост не может связаться с управляющим IP [%s]. %s %s", + "ORG_ZSTACK_VPC_HA_VPCHAGC_10001": "VR[uuid: %s] экземпляр не подключен", + "ORG_ZSTACK_KVM_10107": "невозможно проверить, пере ли хост, потому что %s", + "ORG_ZSTACK_KVM_10108": "Не удалось получить метку времени флага, потому что %s", + "ORG_ZSTACK_KVM_10109": "Хост [IP:%s] был перехвачен, так как флаг перехвата [HostUuid:%s] уже существует и время обновления [utime %d] не превысило интервал пинга хоста [ping interval %d].", + "ORG_ZSTACK_STORAGE_BACKUP_10100": "Одно из хранилищ резервных копий [UUIDs: %s, %s] находится в состоянии %s, и поэтому не может выполнить операцию синхронизации.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10009": "предложение экземпляра [UUID:%s] отключено; невозможно создать ВМ из него", + "ORG_ZSTACK_AUTOSCALING_GROUP_10008": "Ресурс не найден: InstanceOfferingVO с UUID [%s] недоступен.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10007": "Ресурс не найден: AutoScalingVmTemplateVO с UUID [%s] недоступен.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10006": "autoScalingGroup[%s] не удалось полностью добавить newly created VM в группу безопасности, ошибки: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10005": "не удалось добавить VM NIC в группу безопасности, Не найдена группа безопасности с UUID=%s.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10004": "autoScalingGroup[%s] не удалось полностью добавить newly created VM в loadBalancer, ошибки: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10003": "не удалось добавить VM NIC в load balancer, Не найден load balancer с UUIDs=%s.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10002": "autoScalingGroup[%s] создание VM полностью не удалось, ошибки: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10000": "Внутри одной группы масштабирования может выполняться только одна операция масштабирования одновременно.", + "ORG_ZSTACK_KVM_10120": "конфигурация хоста[uuid:%s] изменена, старая: %s, новая: %s", + "ORG_ZSTACK_KVM_10121": "хост[uuid:%s] входит в выключенное состояние, отправка уведомления", + "ORG_ZSTACK_KVM_10112": "архитектура CPU хоста не соответствует конфигурации кластера", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10000": "недопустимая строка пути %s в конфигурации облачного хранилища", + "ORG_ZSTACK_KVM_10115": "хост [uuid:%s] не может быть добавлен в кластер [uuid:%s] из-за несовместимой версии QEMU/Libvirt", + "ORG_ZSTACK_KVM_10117": "хост [uuid:%s] не может быть добавлен в кластер [uuid:%s] из-за несовместимых спецификаций архитектуры CPU", + "ORG_ZSTACK_KVM_10119": "невозможно обнаружить VTx или VTd в /proc/cpuinfo. Пожалуйста, убедитесь, что аппаратная виртуализация включена в настройках BIOS.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10019": "Ресурс не найден: L3 Network (UUID: %s) не найден", + "ORG_ZSTACK_AUTOSCALING_GROUP_10018": "дисковые предложения с UUIDs:%s отключены; поэтому создание VM из этих предложений невозможно.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10017": "Ресурс не найден: Disk Offering с UUID [%s] не найден", + "ORG_ZSTACK_AUTOSCALING_GROUP_10016": "system-image[uuid:%s] не может использоваться для создания пользовательской VM", + "ORG_ZSTACK_AUTOSCALING_GROUP_10015": "rootDiskOfferingUuid не может быть null, когда тип медиа образа ISO", + "ORG_ZSTACK_AUTOSCALING_GROUP_10014": "image[uuid:%s] имеет тип медиа: %s, только RootVolumeTemplate и ISO могут использоваться для создания VM", + "ORG_ZSTACK_AUTOSCALING_GROUP_10013": "image[uuid:%s] в данный момент недоступна, пожалуйста, убедитесь, что она готова перед созданием VM из нее.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10012": "image[uuid:%s] отключена. Создание VM из этого образа не разрешено.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10011": "Ресурс не найден: образ с UUID [%s] не найден", + "ORG_ZSTACK_AUTOSCALING_GROUP_10010": "предложение экземпляра [UUID: %s, тип: %s] не является типом User VM; поэтому VM не может быть создана из него.", + "ORG_ZSTACK_KVM_10130": "не удалось подключить том к экземпляру, причина:%s", + "ORG_ZSTACK_KVM_10131": "не удалось отключить том от экземпляра, причина:%s", + "ORG_ZSTACK_KVM_10132": "vm[%s] не удалось освободить дисковое пространство, причина:%s", + "ORG_ZSTACK_KVM_10123": "хост[%s] не был выключен в течение %d секунд", + "ORG_ZSTACK_KVM_10125": "не удалось проверить файл %s на хосте[UUID:%s]", + "ORG_ZSTACK_KVM_10126": "Хост находится в состоянии предобслуживания, и его операционная система не может быть обновлена в данный момент. Завершите операции обслуживания или обратитесь в службу поддержки за помощью.", + "ORG_ZSTACK_KVM_10127": "Хост не находится в подключенном состоянии; поэтому операции обновления ОС не могут быть выполнены. Убедитесь, что хост подключен, прежде чем пытаться обновить ОС.", + "ORG_ZSTACK_COMPUTE_BONDING_10022": "требуется один из UUID подчиненных устройств или имен подчиненных устройств", + "ORG_ZSTACK_COMPUTE_BONDING_10021": "На хосте нет интерфейса с UUID: %s", + "ORG_ZSTACK_VMWARE_10069": "идентификатор экземпляра [%s] не найден", + "ORG_ZSTACK_COMPUTE_BONDING_10020": "интерфейс %s не существует на хостах", + "ORG_ZSTACK_VMWARE_10067": "vm [%s] не найден", + "ORG_ZSTACK_COMPUTE_BONDING_10026": "Невозможно удалить объединяющий интерфейс, связанный с управляющей сетью. Перед продолжением убедитесь, что управляющая сеть не используется.", + "ORG_ZSTACK_VMWARE_10064": "Экземпляр ВМ не найден: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10029": "Необходимо пропустить настройку активности группы автоматического масштабирования", + "ORG_ZSTACK_COMPUTE_BONDING_10025": "недопустимый режим объединения[%s]", + "ORG_ZSTACK_VMWARE_10065": "не удалось выключить виртуальную машину: %s, %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10028": "Невозможно получить список удаленных экземпляров из службы облачных вычислений", + "ORG_ZSTACK_VMWARE_10062": "не удалось возобновить ВМ, статус задачи: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10027": "Количество запущенных экземпляров превышает допустимый предел.%s", + "ORG_ZSTACK_COMPUTE_BONDING_10023": "Невозможно добавить SR-IOV интерфейс [%s] к объединению, поскольку выбрано более одного SR-IOV устройства", + "ORG_ZSTACK_VMWARE_10063": "не удалось возобновить виртуальную машину [%s]: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10026": "autoScalingGroup[%s] не удалось полностью завершить ВМ[%s], ошибки: %s", + "ORG_ZSTACK_VMWARE_10060": "не удалось приостановить ВМ [%s]: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10025": "autoScalingGroup[%s] не привязан ни к одному шаблону ВМ", + "ORG_ZSTACK_COMPUTE_BONDING_10029": "невозможно добавить новые интерфейсы к объединению[%s], так как оно уже содержит интерфейс с SR-IOV", + "ORG_ZSTACK_AUTOSCALING_GROUP_10024": "группа автоматического масштабирования[%s] находится в неожиданном состоянии, ожидается: %s состояние", + "ORG_ZSTACK_COMPUTE_BONDING_10028": "невозможно повторно привязывать интерфейсы к объединению[%s].", + "ORG_ZSTACK_AUTOSCALING_GROUP_10023": "defaultL3NetworkUuid[uuid:%s] не существует в l3NetworkUuids %s", + "ORG_ZSTACK_SNS_PLATFORM_DINGTALK_10000": "не удалось отправить сообщения в DingTalk. статус: %s, тело: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10022": "Указано более одной сети уровня 3 в l3NetworkUuids, но defaultL3NetworkUuid пуст", + "ORG_ZSTACK_KVM_10140": "не удалось создать мост[%s] для l2Network[uuid:%s, type:%s, vlan:%s] на KVM хосте[uuid:%s], потому что %s", + "ORG_ZSTACK_COMPUTE_BONDING_10027": "Невозможно удалить интерфейс bonding, настроенный с VTEP IP. Пожалуйста, сначала убедитесь, что все связанные виртуальные сети отключены.", + "ORG_ZSTACK_KVM_10141": "не удалось проверить мост[%s] для l2VlanNetwork[uuid:%s, name:%s] на KVM хосте[uuid:%s], %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10021": "l3Network[uuid:%s] является системной сетью и не может быть использована для создания пользовательских ВМ.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10020": "l3Network с UUID:%s отключена; поэтому создание ВМ в этой сети не разрешено.", + "ORG_ZSTACK_KVM_10143": "не удалось удалить мост[%s] для l2Network[uuid:%s, type:%s, vlan:%s] на KVM хосте[uuid:%s], потому что %s", + "ORG_ZSTACK_KVM_10144": "Не удалось запустить ВМ, потому что функция гипервизора не может быть отключена при установке режима ЦП в none. Пожалуйста, проверьте настройки конфигурации ЦП.", + "ORG_ZSTACK_KVM_10134": "XML хук[%s] связан с ВМ %s, поэтому пожалуйста отсоедините его перед удалением", + "ORG_ZSTACK_KVM_10136": "Системные XML хуки не допускаются в облачных вычислительных средах. Пожалуйста, убедитесь, что все системные конфигурации соответствуют стандартам виртуализации.", + "ORG_ZSTACK_KVM_10137": "Имя XML хука [%s] уже существует в конфигурации виртуальной машины.", + "ORG_ZSTACK_KVM_10138": "существует KVM хост с IP управления[%s]", + "ORG_ZSTACK_KVM_10139": "невозможно создать VLAN устройство на %s, потому что имя слишком длинное", + "ORG_ZSTACK_VMWARE_10059": "не удалось приостановить ВМ, статус задачи: %s", + "ORG_ZSTACK_COMPUTE_BONDING_10033": "L2 сеть [uuid:%s] не существует", + "ORG_ZSTACK_BILLING_10008": "Дата начала должна быть раньше даты окончания.", + "ORG_ZSTACK_COMPUTE_BONDING_10032": "невозможно повторно отсоединять интерфейсы от bond[%s].", + "ORG_ZSTACK_COMPUTE_BONDING_10031": "невозможно отсоединить интерфейс[%s] от bond[%s], который находится в связанном состоянии.", + "ORG_ZSTACK_COMPUTE_BONDING_10030": "Невозможно добавить SR-IOV интерфейс [%s] к Bonding, потому что только один интерфейс в bond может иметь SR-IOV.", + "ORG_ZSTACK_BILLING_10005": "Биллинг отключен для этого ресурса. Пожалуйста, убедитесь, что биллинг включен для использования этого сервиса.", + "ORG_ZSTACK_COMPUTE_BONDING_10037": "Невозможно подключить L2 сеть к кластеру [UUID: %s]. Интерфейс [UUID: %s, name:%s] на хосте [UUID: %s] связан с типами сервисов, но не включает TenantNetwork.", + "ORG_ZSTACK_BILLING_10004": "неподдерживаемый тип ресурса биллинга [%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10036": "Невозможно подключить L2 сеть к кластеру [UUID]. Bonding интерфейс [UUID, name] на хосте [UUID] имеет связи с типами сервисов bonding, но не имеет тип сервиса TenantNetwork.", + "ORG_ZSTACK_BILLING_10003": "Пожалуйста, убедитесь, что правильная конфигурация ценообразования установлена для пользователя, например: `priceUserConfig:{\\nvolume:{\\npriceKeyName:\"priceKeyName\"}}`", + "ORG_ZSTACK_COMPUTE_BONDING_10035": "Невозможно подключить L2 сеть к кластеру [uuid:%s]: физический интерфейс [%s] используется в bond на одном или более хостах. Конфликтующие хосты: [%s]", + "ORG_ZSTACK_VMWARE_10051": "vmUuid [%s] не найден в ESX хост системе [%s]", + "ORG_ZSTACK_BILLING_10002": "Пожалуйста, убедитесь, что правильная конфигурация ценообразования для пользователя установлена, например: `priceUserConfig:{rootVolume:{priceKeyName:\"priceKeyName\"}}`", + "ORG_ZSTACK_COMPUTE_BONDING_10034": "L2 сеть [uuid:%s] имеет пустое определение физического интерфейса", + "ORG_ZSTACK_BILLING_10001": "dateInLong меньше %s миллисекунд", + "ORG_ZSTACK_BILLING_10000": "priceKeyName равен null. Пожалуйста, убедитесь, что имя ключа для ценообразования настроено правильно.", + "ORG_ZSTACK_VMWARE_10050": "Синхронизация с vCenter[uuid:%s], пожалуйста, попробуйте позже.", + "ORG_ZSTACK_KVM_10150": "невозможно получить vmUuid из сообщения %s", + "ORG_ZSTACK_KVM_10151": "не удалось синхронизировать виртуальную машину на хосте[uuid:%s, ip:%s] по причине %s", + "ORG_ZSTACK_COMPUTE_BONDING_10038": "не удалось добавить Linux bonding хосту[uuid:%s] : %s", + "ORG_ZSTACK_KVM_10152": "ВМ[%s] находится в выключенном состоянии в течение продолжительного времени; пожалуйста, проверьте её состояние.", + "ORG_ZSTACK_AUTOSCALING_GROUP_10032": "Неподдерживаемый тип политики удаления[%s]", + "ORG_ZSTACK_V2V_VMWARE_10015": "В CIDR %s на хосте %s не найдено доступных IP-адресов; пожалуйста, переподключите хост для обновления IP-адресов.", + "ORG_ZSTACK_KVM_10154": "не удалось обновить bridge[%s] для l2Network[uuid:%s, name:%s] на KVM хосте[uuid: %s], %s", + "ORG_ZSTACK_V2V_VMWARE_10016": "Уже выполняется длительное задание[uuid:%s] по конвертации ВМ из %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10030": "deleteAutoScalingRule[%s] триггеры не сработали, ошибки: %s", + "ORG_ZSTACK_V2V_VMWARE_10017": "Не удалось обновить зависимость хоста конвертации для виртуальной машины %s", + "ORG_ZSTACK_KVM_10146": "не удалось применить правила группы безопасности к KVM хосту[uuid:%s], потому что %s", + "ORG_ZSTACK_KVM_10147": "не удалось проверить правила по умолчанию группы безопасности на KVM хосте[uuid:%s], потому что %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10101": "невозможно назначить порт перенаправления или код статуса без указания URL перенаправления HTTP", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10009": "не удалось обнаружить heartbeat, код: %s, детали: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10104": "loadBalancer listener[%s] не поддерживает изменение состояния сохранения сессии", + "ORG_ZSTACK_IAM2SCRIPT_10010": "Указанный script executor не поддерживается в этой облачной вычислительной среде. Пожалуйста, обратитесь к списку поддерживаемых executors для получения дополнительной информации.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10105": "невозможно одновременно поддерживать HTTP перенаправление на HTTPS и сохранение сессии в облачной среде", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10102": "невозможно поддерживать протоколы, отличные от HTTP, при указании перенаправления HTTP на HTTPS", + "ORG_ZSTACK_VMWARE_10048": "Хост не подключен к облачной среде. Пожалуйста, убедитесь, что хост правильно настроен и авторизован.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10108": "listener[%s] изменяет сохранение сессии; необходимо указать алгоритм балансировки нагрузки", + "ORG_ZSTACK_V2V_VMWARE_10007": "Не удалось разобрать URL %s", + "ORG_ZSTACK_COMPUTE_BONDING_10044": "не удалось подключить nic к linux bonding на хосте[uuid:%s] : %s", + "ORG_ZSTACK_VMWARE_10046": "Невозможно отключить NIC, поскольку сетевая карта (NIC) не поддерживает операции горячей замены в vCenter.", + "ORG_ZSTACK_BILLING_10019": "цена GPU должна быть привязана к UUID GPU %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10109": "listener[%s] %s алгоритм балансировки нагрузки не поддерживает изменение сохранения сессии, кроме как явное указание iphash", + "ORG_ZSTACK_V2V_VMWARE_10008": "имя dataCenter не может содержать специальные символы %s", + "ORG_ZSTACK_IAM2SCRIPT_10002": "Содержимое скрипта пусто. Пожалуйста, убедитесь, что ваш Java код корректно определен и включен в исходный файл.", + "ORG_ZSTACK_BILLING_10018": "Цена GPU должна быть привязана к допустимому UUID GPU. Пожалуйста, укажите непустой UUID.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10106": "listener[%s] не может изменить перезапись сохранения сессии, когда HTTP режим установлен в http-tunnel", + "ORG_ZSTACK_V2V_VMWARE_10009": "Имя целевой ВМ не может содержать специальные символы %s", + "ORG_ZSTACK_IAM2SCRIPT_10001": "Не удалось декодировать содержимое скрипта. Пожалуйста, убедитесь, что исходный файл доступен и правильно отформатирован для облачных вычислительных сред.", + "ORG_ZSTACK_COMPUTE_BONDING_10042": "не удалось удалить Linux bond с хоста[uuid:%s] : %s", + "ORG_ZSTACK_VMWARE_10044": "HOST CPU и Guest OS несовместимы. Пожалуйста, убедитесь, что ваш HOST CPU поддерживает необходимые технологии виртуализации, или обновите Guest OS до совместимой версии.", + "ORG_ZSTACK_BILLING_10017": "цена должна быть в диапазоне от 0 до 999999999.99", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10107": "listener[%s] изменяет сохранение сессии на IP hash; необходимо указать алгоритм балансировки источника", + "ORG_ZSTACK_VMWARE_10045": "Проверка совместимости с виртуальной машиной %s не удалась на хосте %s", + "ORG_ZSTACK_BILLING_10016": "Минимальная единица ресурса для выделения - мегабайт, а не байт.", + "ORG_ZSTACK_SDNCONTROLLER_10008": "SDN L2 сеть [UUID:%s] не подключена к контроллеру", + "ORG_ZSTACK_IAM2SCRIPT_10007": "Функция IAM2 script не включена. Пожалуйста, убедитесь, что сервис IAM2 активирован в вашей облачной среде.", + "ORG_ZSTACK_BILLING_10015": "resourceName[%s] является недопустимым идентификатором в контексте облачных вычислений", + "ORG_ZSTACK_IAM2SCRIPT_10005": "Не удалось получить вывод выполнения скрипта. Пожалуйста, проверьте настройки облачного экземпляра и сети.", + "ORG_ZSTACK_COMPUTE_BONDING_10046": "не удалось отсоединить NIC от Linux bonding на хосте[uuid:%s] : %s", + "ORG_ZSTACK_VMWARE_10040": "Отсутствует UUID целевого хоста. Пожалуйста, убедитесь, что UUID для целевого хоста указан правильно.", + "ORG_ZSTACK_IAM2SCRIPT_10004": "Запуск iam2 script не удался. Пожалуйста, проверьте, правильно ли настроена необходимая облачная вычислительная среда.", + "ORG_ZSTACK_VMWARE_10041": "Целевой хост не поддерживает управление виртуальными машинами. Пожалуйста, убедитесь, что хост назначения является ESX или vSphere хостом.", + "ORG_ZSTACK_KVM_10161": "Неожиданный номер порта VNC[%d] для виртуальной машины [uuid:%s]", + "ORG_ZSTACK_IAM2SCRIPT_10009": "Количество параметров превышает допустимый предел.", + "ORG_ZSTACK_IAM2SCRIPT_10008": "Скрипт не содержит никакого кода. Пожалуйста, убедитесь, что ваш ввод включает корректный Java код.", + "ORG_ZSTACK_SDNCONTROLLER_10000": "Невозможно создать SDN L2 сеть из-за отсутствия UUID SDN Controller в systemTags API запроса. Пожалуйста, убедитесь, что UUID SDN Controller указан правильно.", + "ORG_ZSTACK_V2V_VMWARE_10003": "Имя кластера не может содержать следующие символы: %s", + "ORG_ZSTACK_SDNCONTROLLER_10002": "невозможно найти SDN контроллер для сети уровня 2[uuid:%s, vswitchType:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10001": "Невозможно создать SDN L2 сеть, потому что UUID SDN контроллера отсутствует в API запросе. Пожалуйста, убедитесь, что UUID включен.", + "ORG_ZSTACK_V2V_VMWARE_10006": "не удалось остановить экземпляр VM %s перед v2v миграцией", + "ORG_ZSTACK_KVM_10157": "reply[%s] не является KVMHostAsyncHttpCallResponse", + "ORG_ZSTACK_KVM_10158": "reply[%s] возвращен с пустым телом ответа", + "ORG_ZSTACK_KVM_10159": "операция %s не удалась: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10040": "EcsInstance должен быть в состоянии running или stopped при удалении EIP.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10111": "listener[%s] не поддерживает изменение idle timeout и имени cookie; должно быть указано сохранение сессии.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10112": "listener[%s] не поддерживает изменение idle timeout, когда сохранение сессии отключено", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10110": "listener[%s] %s алгоритм балансировки нагрузки не поддерживает изменение сохранения сессии, кроме как явным присваиванием disable.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10115": "недопустимый session idle timeout[%s], он должен быть положительным целым числом в диапазоне[%s~%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10040": "не удалось обновить Linux bonding на хосте[uuid:%s] : %s", + "ORG_ZSTACK_VMWARE_10039": "В запросе метаданных отсутствует UUID хоста", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10116": "Протокол HTTP health check должен быть указан для его параметра проверки работоспособности %s.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10113": "listener[%s] не поддерживает изменение имени cookie, когда сохраняемость сессии не установлена в rewrite.", + "ORG_ZSTACK_VMWARE_10037": "Распределенный виртуальный коммутатор или квалифицированный виртуальный коммутатор не найден", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10114": "listener[%s] не поддерживает изменение перезаписи URL на основе сессии без изменения имени cookie", + "ORG_ZSTACK_VMWARE_10038": "Datastore %s не найден для vCenter %s", + "ORG_ZSTACK_BILLING_10009": "resourceType и resourceUUID не могут быть пустыми одновременно", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10119": "неверный health check target[%s], формат должен быть checkProtocol:port, например, tcp:default", + "ORG_ZSTACK_SDNCONTROLLER_10015": "не удалось добавить SDN контроллер, так как тип: %s не входит в список поддерживаемых: %s", + "ORG_ZSTACK_SDNCONTROLLER_10014": "не удалось добавить правило группы безопасности, так как UUID[:%s] удаленного контроллера группы безопасности не соответствует UUID[:%s] локального контроллера группы безопасности", + "ORG_ZSTACK_VMWARE_10036": "Нет доступных вычислительных ресурсов для операций кластеризации.%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10117": "ожидаемый код состояния HTTP health check [%s] недействителен", + "ORG_ZSTACK_SDNCONTROLLER_10017": "не удалось добавить SDN контроллер, так как контроллер [IP:%s] уже зарегистрирован", + "ORG_ZSTACK_VMWARE_10033": "SSL handshake с vCenter [%s] не удался из-за использования небезопасного TLS 1.0. При необходимости вручную включите TLS 1.0 в конфигурации JDK.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10118": "listener с протоколом [%s] не поддерживает выбор политики безопасности", + "ORG_ZSTACK_SDNCONTROLLER_10016": "не удалось добавить SDN контроллер, так как ip[%s] не является допустимым одноадресным адресом", + "ORG_ZSTACK_VMWARE_10034": "SSL handshake с vCenter [%s] не удался, пожалуйста, проверьте номер порта [%d].", + "ORG_ZSTACK_BILLING_10027": "Биллинг включен. Эта операция разрешена только когда биллинг отключен.", + "ORG_ZSTACK_SDNCONTROLLER_10019": "не удалось добавить хост [UUID:%s] к SDN контроллеру [UUID:%s], так как маска подсети не указана", + "ORG_ZSTACK_VMWARE_10031": "Вход в vCenter Server [%s] не удался с учетными данными пользователя. Пожалуйста, проверьте сетевое подключение и предоставленные учетные данные.", + "ORG_ZSTACK_BILLING_10026": "endDate не может быть раньше startDate", + "ORG_ZSTACK_SDNCONTROLLER_10018": "не удалось добавить хост[uuid:%s] к SDN контроллеру[uuid:%s], так как он уже подключен к другому SDN контроллеру", + "ORG_ZSTACK_VMWARE_10032": "Не удалось разобрать ответ от vCenter [%s], пожалуйста, проверьте номер порта [%d].", + "ORG_ZSTACK_BILLING_10025": "endDateInLong установлено, модификация запрещена в облачных средах для обеспечения целостности данных и соответствия стандартам виртуализации.", + "ORG_ZSTACK_BILLING_10024": "endDateInLong и setEndDateInLongBaseOnCurrentTime не должны быть настроены одновременно. Пожалуйста, выберите один из вариантов для ваших настроек.", + "ORG_ZSTACK_VMWARE_10030": "подключение к облачному ресурсу не удалось: %s", + "ORG_ZSTACK_BILLING_10023": "endDateInLong не может иметь отрицательное значение", + "ORG_ZSTACK_BILLING_10022": "accountUuid и tableUuid являются взаимоисключающими; может быть установлен только один из них.", + "ORG_ZSTACK_BILLING_10021": "Этот priceTable[uuid=%s] не может быть удален в этой облачной среде.", + "ORG_ZSTACK_BILLING_10020": "Аккаунт[uuid=%s] присоединил прайс-лист", + "ORG_ZSTACK_LONGJOB_10007": "Невозможно отменить длительное задание, которое уже успешно завершено", + "ORG_ZSTACK_SDNCONTROLLER_10011": "Операция Pull tenant поддерживается только для контроллеров H3C VCFC V2X", + "ORG_ZSTACK_LONGJOB_10008": "Невозможно отменить длительное задание, которое завершилось с ошибкой", + "ORG_ZSTACK_LONGJOB_10009": "Удаляйте длительные задания только когда они успешно завершены, отменены или завершились с ошибкой", + "ORG_ZSTACK_SDNCONTROLLER_10013": "невозможно добавить vmnic в группу безопасности, так как у них разные SDN контроллеры [NIC controller UUID: %s, Security Group controller UUID: %s]", + "ORG_ZSTACK_SDNCONTROLLER_10012": "Не удалось получить данные арендатора: %s", + "ORG_ZSTACK_LONGJOB_10010": "перезапускайте длительное задание только когда оно успешно завершено, отменено или завершилось с ошибкой", + "ORG_ZSTACK_LONGJOB_10011": "можно возобновить только длительное задание в состоянии Приостановлено", + "ORG_ZSTACK_LONGJOB_10012": "%s не имеет соответствующего длительного задания", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10122": "облако не может изменить прослушиватель балансировщика нагрузки, поскольку прослушиватель с протоколом [%s] не поддерживает выбор версии HTTP [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10123": "облако не может изменить прослушиватель балансировщика нагрузки, поскольку протокол HTTPS поддерживает только версию HTTP: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10120": "прослушиватель с протоколом [%s] несовместим с этой проверкой работоспособности:[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10121": "Необходимо указать протокол HTTP для проверки работоспособности. Пожалуйста, включите его параметры проверки, такие как healthCheckMethod и healthCheckURI", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10126": "облако не поддерживает изменение прослушивателя балансировщика нагрузки, поскольку прослушиватель с протоколом [%s] не поддерживает сжатие контента", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10127": "облако не может изменить прослушиватель балансировщика нагрузки, поскольку поддерживает только алгоритмы сжатия [%s]", + "ORG_ZSTACK_VMWARE_10029": "Вход не выполнен. Пожалуйста, проверьте свои учетные данные и убедитесь, что вы используете правильные параметры входа для облачных вычислительных услуг", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10124": "облако не может изменить прослушиватель балансировщика нагрузки, поскольку прослушиватель с протоколом TCP поддерживает только TCP прокси для настроек параметров", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10125": "облако не может изменить прослушиватель балансировщика нагрузки, поскольку поддерживает только протокол TCP прокси %s", + "ORG_ZSTACK_VMWARE_10027": "VCenter[uuid:%s] не найден: Виртуализационная среда с указанным UUID не существует", + "ORG_ZSTACK_TAG_10004": "нет системного тега[%s] для типа ресурса[%s]", + "ORG_ZSTACK_SDNCONTROLLER_10026": "Операция Pull tenant не поддерживается для SDN контроллера [uuid:%s, vendorType:%s, vendorVersion:%s]. Только контроллеры H3C VCFC V2 поддерживают эту операцию", + "ORG_ZSTACK_LOG_10007": "Неизвестный тип конфигурации журнала %s", + "ORG_ZSTACK_SDNCONTROLLER_10025": "SDN контроллер [UUID:%s] не найден", + "ORG_ZSTACK_TAG_10005": "проверка системного тега [%s] для типа ресурса[%s] не удалась", + "ORG_ZSTACK_LOG_10006": "Неизвестный тип конфигурации для сервера журнала %s", + "ORG_ZSTACK_SDNCONTROLLER_10028": "невозможно изменить SDN контроллер, поскольку диапазон VLAN[%s] имеет неверный формат", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10128": "неверная версия IP[%s], должно быть IPv4 или IPv6", + "ORG_ZSTACK_LOG_10005": "Аккаунт [uuid:%s] не имеет права добавлять дополнительные серверы журналов. Только учетные записи администраторов обладают этим правом", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10129": "невозможно удалить группу серверов по умолчанию[uuid:%s]", + "ORG_ZSTACK_LOG_10004": "Доступ запрещён: Учётная запись[uuid:%s] не авторизована для получения журналов управляющего узла. Только административные учётные записи обладают этим правом.", + "ORG_ZSTACK_TAG_10008": "tag[%s] предназначен только для административного использования", + "ORG_ZSTACK_LOG_10003": "Учётная запись [UUID:%s] не авторизована для выполнения операций на сервере журналов [UUID:%s].", + "ORG_ZSTACK_SDNCONTROLLER_10029": "Не удалось изменить SDN-контроллер, так как диапазон VLAN[%s] перекрывается с другим диапазоном VLAN", + "ORG_ZSTACK_LOG_10002": "Фабрика не найдена для типа:%s", + "ORG_ZSTACK_TAG_10006": "Соответствующий системный тег не найден для %s", + "ORG_ZSTACK_SDNCONTROLLER_10020": "Не удалось добавить хост [UUID:%s] в SDN-контроллер [UUID:%s], так как IP-адрес vTEP используется хостом [UUID:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10022": "Не удалось обновить хост [uuid:%s] SDN-контроллера [uuid:%s], поскольку хост не был добавлен в SDN-контроллер", + "ORG_ZSTACK_TAG_10000": "Дублированный тег[tag:%s, Type:%s, Resource_Type:%s, Resource_Uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10021": "Не удалось отменить регистрацию хоста [uuid:%s] в SDN-контроллере [uuid:%s], так как хост не был зарегистрирован в SDN-контроллере", + "ORG_ZSTACK_SDNCONTROLLER_10024": "Невозможно подключить сеть L3 к ВМ, так как некоторые арендаторы в SDN-контроллере [uuid:%s] были удалены. Сначала запустите синхронизацию арендаторов для обновления статуса арендатора.", + "ORG_ZSTACK_SDNCONTROLLER_10023": "Не удалось обновить хост[uuid:%s] SDN-контроллера[uuid:%s], так как была указана маска подсети", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10000": "Ошибка проверки целостности пакетных данных, неподдерживаемый тип ресурса: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10002": "Ошибка добавления ресурса целостности, неподдерживаемый тип ресурса: %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10002": "Ошибка шаблона: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10134": "Не удалось добавить VMNic серверного компонента в группу серверов [UUID:%s], так как вес VMNic [%s] не является допустимым числом", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10008": "Не удалось получить кэш образа с ID:%s: GetImageHashValueReply.hashValue имеет значение NULL", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10009": "Ошибка проверки согласованности кэша образа [%s] из-за проблем со средой виртуальной машины", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10000": "Нет доступного шаблона этого типа: %s,", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10132": "Не удалось добавить VMNIC серверного компонента с UUID:%s в группу серверов с UUID:%s, так как VMNIC не существует", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10137": "Не удалось добавить NIC серверного компонента в группу серверов [uuid:%s], так как IP-адрес NIC [ipAddress:%s] дублируется", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10003": "Недопустимый тип шифрования start data protection[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10138": "Невозможно добавить сетевой интерфейс виртуальной машины [uuid:%s] в группу серверов [uuid:%s], так как прослушиватель [uuid:%s] уже подключил сетевой интерфейс этой группы серверов", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10004": "Снимок[uuid:%s] не зашифрован в виртуализированной среде", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10135": "Сети L3 с UUID:%s, связанные с VM nics, не имеют включённой сетевой службы:%s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10005": "Ошибка проверки согласованности снимка тома [%s] из-за несогласованного состояния", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10136": "VM NICs [UUID: %s] уже связаны с группой серверов балансировщика нагрузки [UUID: %s].", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10006": "Ошибка шифрования: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10139": "Не удалось добавить IP-адрес серверного компонента в группу серверов [UUID:%s], так как IP-адрес [IP Address:%s] уже зарегистрирован", + "ORG_ZSTACK_VMWARE_10097": "VCENTER[%s] не находится в рабочем состоянии, текущее состояние: %s", + "ORG_ZSTACK_VMWARE_10098": "vdisk не найден: %s", + "ORG_ZSTACK_VMWARE_10095": "Не удалось получить список последних задач, подробности: %s", + "ORG_ZSTACK_VMWARE_10096": "VCENTER_SERVER_NOT_FOUND", + "ORG_ZSTACK_VMWARE_10093": "Резервное хранилище vCenter не поддерживает вычисление хэшей образов.", + "ORG_ZSTACK_VMWARE_10091": "Функция %s пока не поддерживается в облачных средах.", + "ORG_ZSTACK_TAG_10011": "тег[uuid:%s] является встроенным системным тегом и не может быть удален.", + "ORG_ZSTACK_TAG_10012": "Аргумент 'resourceType' не соответствует ожидаемому UUID. Убедитесь, что тип ресурса корректно указан как UUID.", + "ORG_ZSTACK_VMWARE_10090": "Образ %s не найден в резервном хранилище. Убедитесь, что путь к образу указан правильно, и повторите попытку.", + "ORG_ZSTACK_TAG_10010": "тип ресурса не найден в системе тегов %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10010": "ошибка кэша образов шифрования[id:%s]: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10011": "файл целостности nodeType %s[path:%s] уже существует в виртуализированной среде", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10012": "недопустимый тип узла[%s]", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10013": "не удалось добавить файл целостности[%s.%s], это теперь директория.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10141": "недопустимый вес[serverIp:%s, weight:%s], вес не в пределах допустимого диапазона [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10143": "IP-адреса серверов [uuid:%s] уже связаны с группой серверов балансировщика нагрузки [uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10148": "loadbalancerServerGroup [%s] не существует", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10014": "файл целостности[%s.%s] не существует", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10149": "VMNic или IP-адрес равен нулю. Проверьте настройки сетевой конфигурации.", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10015": "хост %s не существует", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10146": "все vmnics не связаны с группой серверов [%s]", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10000": "внешнее основное хранилище[uuid:%s, name:%s] возвращает неработоспособный статус: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10016": "Ошибка выполнения shell, причина: %s", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10001": "поиск активных клиентов для тома[uuid:%s, mountPath %s, client:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10147": "все IP-адреса серверов не связаны с группой серверов [%s]", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10017": "добавление файла проверки целостности[%s.%s] не удалось, причина: %s", + "ORG_ZSTACK_VMWARE_10088": "Резервное хранилище vCenter не поддерживает отмену загрузки образа.", + "ORG_ZSTACK_VMWARE_10086": "ресурс %s уже подготовлен", + "ORG_ZSTACK_VMWARE_10085": "неожиданный протокол: %s", + "ORG_ZSTACK_VMWARE_10082": "Нет хранилища данных, подключенного к %s", + "ORG_ZSTACK_VMWARE_10083": "Хранилище данных не найдено для %s", + "ORG_ZSTACK_VMWARE_10080": "vCenter[uuid=%s] отключен. Вы можете выполнять только операции чтения на этом vCenter. Для внесения изменений в конфигурацию обновите конфигурацию vCenter с помощью UpdateVCenterAction {uuid=%s state=Enabled}", + "ORG_ZSTACK_VMWARE_10081": "VCENTER[uuid=%s] отключены. Вы можете выполнять только операции чтения с этими VCENTER.", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10021": "ошибка зашифрованного снимка[uuid:%s]: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10151": "не удалось добавить группу серверов с UUID:%s в прослушиватель с UUID:%s, так как сетевой интерфейс с UUID:%s уже связан", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10152": "не удалось добавить экземпляр сервера [uuid:%s] в прослушиватель [uuid:%s], так как IP-адрес сервера уже зарегистрирован", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10150": "не удалось добавить группу серверов [uuid:%s] в прослушиватель [uuid:%s], так как она уже была добавлена", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10155": "не удалось добавить группу серверов[uuid:%s] в прослушиватель [uuid:%s], так как UDP-прослушиватель не может сопоставить IPv4-адреса внутренних серверов с IPv6", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10156": "не удалось удалить группы серверов [uuid:%s] из прослушивателя [uuid:%s], так как включено перенаправление HTTP на HTTPS", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10153": "не удалось добавить группу серверов[uuid:%s] в прослушиватель [uuid:%s], так как UDP-прослушиватель не может одновременно иметь VIP-адреса IPv4 и IPv6", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10154": "не удалось добавить группу серверов[uuid:%s] в прослушиватель [uuid:%s], так как UDP-прослушиватель не может сопоставить IPv6-адреса внутренних серверов с IPv4", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10159": "не удалось найти балансировщик нагрузки, связанный с группой серверов [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10157": "не удалось отменить регистрацию группы серверов [uuid:%s] от балансировщика нагрузки [uuid=%s], так как она не была зарегистрирована", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10158": "балансировщик нагрузки с UUID [%s] не существует", + "ORG_ZSTACK_VMWARE_10078": "Операция не поддерживается в текущей облачной вычислительной среде. Пожалуйста, убедитесь, что ваш запрос соответствует поддерживаемым операциям для облачных ресурсов.", + "ORG_ZSTACK_VMWARE_10076": "не удалось включить VM, статус задачи: %s", + "ORG_ZSTACK_VMWARE_10073": "VM [%s] не найдена в инвентаре vCenter", + "ORG_ZSTACK_VMWARE_10071": "Не удалось найти VM с UUID=%s на хосте ESX с UUID=%s", + "ORG_ZSTACK_VMWARE_10072": "Не удалось обновить конфигурацию ESX VM[uuid=%s]. Подробности смотрите в журнале.", + "ORG_ZSTACK_VMWARE_10070": "Образ [%s] не найден в реестре или локальном кэше", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10162": "не удалось изменить VMNIC внутреннего сервера на группу серверов[uuid:%s], так как вес VMNIC [%s] не является допустимым числом", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10163": "недопустимый вес балансировщика[vimNic:%s], вес не может быть пустым", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10160": "не удалось обновить VMNIC внутреннего сервера группы серверов, так как группа серверов [uuid:%s] не имеет VMNIC [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10161": "недопустимый вес балансировщика[vimNic:%s], значение веса вне допустимого диапазона [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10166": "недопустимый вес балансировщика[serverIp:%s,weight:%s], вес не входит в допустимый диапазон [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10167": "не удалось добавить IP-адрес внутреннего сервера в группу серверов [UUID:%s], так как вес VMNIC [%s] не является допустимым числом", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10164": "не удалось обновить VMNIC внутреннего сервера группы серверов [UUID:%s], так как UUID VMNIC пустой", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10165": "не удалось обновить IP-адрес внутреннего сервера группы серверов, так как группа серверов [uuid:%s] не имеет IP [ipAddress:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10168": "недопустимый вес балансировщика[serverIp:%s], вес не может быть пустым", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10169": "не удалось добавить IP-адрес внутреннего сервера в группу серверов [UUID:%s], так как IP [IP Address:%s] недопустим", + "ORG_ZSTACK_VPC_HA_10010": "К группе HA [uuid:%s] подключено более 2 маршрутизаторов VPC.", + "ORG_ZSTACK_COMPUTE_VM_10119": "Виртуальная машина не может выполнять оперативное обновление ЦП/памяти, так как опция \"Оперативное изменение предложения экземпляра\" отключена. Пожалуйста, остановите ВМ и повторите попытку обновления ЦП/памяти.", + "ORG_ZSTACK_VPC_HA_10011": "Сети L3 управления и общедоступные сети L3 группы HA [uuid:%s] отличаются от предлагаемых сетей L3 [uuid:%s].", + "ORG_ZSTACK_VPC_HA_10012": "Сети L3 маршрутизатора vPC [UUID:%s] не соответствуют сетям L3 группы HA [UUID:%s]. Пожалуйста, удалите этот маршрутизатор и создайте его заново.", + "ORG_ZSTACK_VPC_HA_10013": "Маршрутизатор vPC был присоединен к группе высокой доступности [uuid:%s]", + "ORG_ZSTACK_VPC_HA_10014": "Группа HA для vPC [uuid:%s] не существует", + "ORG_ZSTACK_VPC_HA_10015": "К группе HA [uuid:%s] присоединено более одного маршрутизатора VPC", + "ORG_ZSTACK_VPC_HA_10016": "Маршрутизатор vPC [UUID:%s] не может быть обновлен до маршрутизатора HA, так как его общедоступная сеть идентична сети управления.", + "ORG_ZSTACK_VPC_HA_10017": "Не удалось создать группу близости для группы высокой доступности [uuid:%s]", + "ORG_ZSTACK_VPC_HA_10018": "Статус HA экземпляра %s [uuid: %s] группы HA VPC %s [uuid: %s] изменился с %s на %s", + "ORG_ZSTACK_VPC_HA_10019": "Статус HA экземпляра [uuid: %s, name: %s, type: %s] изменился с %s на %s", + "ORG_ZSTACK_VPC_HA_10009": "Для маршрутизатора [uuid:%s] отсутствует главный маршрутизатор", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10000": "Команда инициализации экземпляра NFV не выполнена из-за:%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10002": "Не удалось изменить политику межсетевого экрана по умолчанию для сетевого интерфейса ВМ экземпляра NFV [uuid:%s], так как %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10053": "Группы списка контроля доступа [uuid:%s] настроены для перенаправления, но некоторые записи списка контроля доступа не имеют IP-правил.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10050": "Прослушиватель балансировщика нагрузки [UUID:%s] не может присоединить более %d групп списка контроля доступа с правилами перенаправления.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10051": "Прослушиватель балансировщика нагрузки [uuid:%s] имел правило перенаправления, связанное с группами списка контроля доступа [uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10118": "Виртуальная машина [UUID:%s] все еще приостановлена после последней миграции; пожалуйста, возобновите ее перед повторной попыткой миграции.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10056": "Прослушиватель балансировщика нагрузки [uuid:%s] не может присоединить более %d групп списка контроля доступа", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10008": "Отсоединение не поддерживается для этого типа экземпляра виртуальной машины.", + "ORG_ZSTACK_COMPUTE_VM_10117": "Виртуальная машина с UUID:%s уже размещена на хосте с UUID:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10057": "Группа серверов [%s] не присоединена к прослушивателю балансировщика нагрузки [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10007": "Обновление конфигурации подготовки не поддерживается для этого типа экземпляра NFV.", + "ORG_ZSTACK_COMPUTE_VM_10116": "rootDiskSize должен быть указан, когда тип носителя образа - ISO.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10054": "Группы списка контроля доступа [uuid:%s] уже связаны с прослушивателем балансировщика нагрузки [uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10055": "Прослушиватель балансировщика нагрузки [uuid:%s] присоединил только группу списка контроля доступа типа %s.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10009": "Очистка данных не поддерживается для этого типа экземпляра виртуализованной сетевой функции.", + "ORG_ZSTACK_COMPUTE_VM_10114": "Текущая платформа %s еще не поддерживает обновление драйверов сетевых карт.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10004": "Не удалось установить SSH-соединение с экземпляром NFV [%s] после настройки параметров SSH", + "ORG_ZSTACK_COMPUTE_VM_10113": "Невозможно создать CD-ROM для виртуальной машины [uuid:%s], которая находится в состоянии [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10058": "Список контроля доступа [%s] не присоединен к прослушивателю балансировщика нагрузки [%s]", + "ORG_ZSTACK_COMPUTE_VM_10112": "Образ [name:%s, uuid:%s] является ISO; поэтому необходимо указать rootDiskSize.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10006": "Не удалось обновить статус экземпляра NFV: %s", + "ORG_ZSTACK_COMPUTE_VM_10111": "Отсутствуют настройки выделения ЦП и памяти для вашего экземпляра. Пожалуйста, укажите необходимые значения для продолжения.", + "ORG_ZSTACK_VPC_HA_10020": "UUID группы HA равен nil. Пожалуйста, проверьте конфигурацию и убедитесь, что UUID установлен правильно.", + "ORG_ZSTACK_COMPUTE_VM_10121": "Невозможно уменьшить емкость, когда ВМ[%s] запущена", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10060": "Не удалось подключить сетевой интерфейс ВМ к прослушивателю балансировщика нагрузки, поскольку сетевой интерфейс ВМ [uuid:%s] уже связан с группой серверов по умолчанию [uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10061": "Прослушиватели UDP не могут одновременно иметь виртуальные IP-адреса IPv4 и IPv6. Пожалуйста, настройте либо IPv4, либо IPv6 для вашего прослушивателя.", + "ORG_ZSTACK_COMPUTE_VM_10129": "%s не является допустимым IPv4-адресом для облачного развертывания", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10068": "Недопустимый статус перенаправления [%s], поддерживаются только [допустимые коды состояния HTTP]", + "ORG_ZSTACK_COMPUTE_VM_10128": "Невозможно уменьшить размер памяти ВМ[uuid:%s], когда она запущена", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10065": "Невозможно подключить более %d групп списка управления доступом к прослушивателю", + "ORG_ZSTACK_COMPUTE_VM_10127": "Невозможно уменьшить ЦП работающей ВМ[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10066": "Прослушиватель балансировщика нагрузки[%s] не поддерживает присвоение состояния постоянства сессии", + "ORG_ZSTACK_COMPUTE_VM_10126": "Состояние ВМ [uuid:%s] — %s. Для обновления ЦП или памяти допускаются только следующие состояния [%s].", + "ORG_ZSTACK_COMPUTE_VM_10125": "Виртуальная машина не может выполнять операции горячего добавления памяти, поскольку горячее добавление памяти отключено. Пожалуйста, остановите виртуальную машину, а затем повторите попытку операции горячего добавления памяти.", + "ORG_ZSTACK_COMPUTE_VM_10124": "Виртуальная машина не может выполнять горячее добавление ЦП, поскольку горячее добавление ЦП отключено. Пожалуйста, остановите ВМ, а затем повторите попытку горячего добавления ЦП.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10069": "Недопустимый код статуса [%s], поддерживаются только [допустимые коды статуса в облачной вычислительной среде]", + "ORG_ZSTACK_COMPUTE_VM_10122": "reservedMemorySize[%s] превышает memorySize[%s]", + "ORG_ZSTACK_COMPUTE_VM_10132": "%s не является допустимым IPv6-адресом для конфигурации облачного ресурса", + "ORG_ZSTACK_COMPUTE_VM_10131": "IP-адрес [%s] не находится в пределах указанного IP-диапазона [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10074": "Прослушиватель[%s] балансировщика нагрузки[%s] не поддерживает присвоение состояния постоянства сессии; требуется явное назначение iphash.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10075": "Недопустимый тип постоянства сессии[%s], поддерживается только %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10072": "Недопустимый статус постоянства сессии [%s], поддерживается только %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10073": "Прослушиватель[%s] балансировщика нагрузки[%s] не поддерживает присвоение состояния постоянства сессии; требуется явное отключение.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10078": "Недопустимое имя сессионной куки[%s], оно должно содержать только буквенно-цифровые символы и символы подчеркивания", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10079": "Прослушиватель[%s] балансировщика нагрузки[%s] не поддерживает одновременное присвоение времени простоя и имени куки", + "ORG_ZSTACK_COMPUTE_VM_10139": "IPv6-адрес должен включать длину префикса", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10076": "Недопустимое время простоя сессии[%s], оно должно быть положительным целым числом в диапазоне[%s~%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10077": "Недопустимое имя сессионной куки[%s], оно должно быть короче [%d] символов", + "ORG_ZSTACK_COMPUTE_VM_10137": "IPv4-адрес требует маску подсети", + "ORG_ZSTACK_COMPUTE_VM_10136": "Статический IP [%s] имеет неправильный формат", + "ORG_ZSTACK_COMPUTE_VM_10135": "Не удалось установить IP-адрес для экземпляра, так как IP-адрес не указан. Пожалуйста, убедитесь, что IP-адрес предоставлен перед попыткой настроить сетевые параметры.", + "ORG_ZSTACK_COMPUTE_VM_10134": "IP-адрес [%s] не находится в указанном диапазоне IP [startIp %s, endIp %s]", + "ORG_ZSTACK_COMPUTE_VM_10133": "IP-адрес [%s] уже назначен сетевому интерфейсу ВМ [uuid:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10081": "Балансировщик нагрузки[%s] listener[%s] не поддерживает назначение времени ожидания и имени cookie, когда постоянство сеанса отключено", + "ORG_ZSTACK_COMPUTE_VM_10143": "Не удалось освободить статический IP [%s] для ВМ [uuid:%s], так как он не существует", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10082": "Балансировщик нагрузки[%s] listener[%s] не поддерживает назначение перезаписи постоянства сеанса без указания имени cookie", + "ORG_ZSTACK_COMPUTE_VM_10142": "ВМ[uuid:%s] не имеет сетевого интерфейса, подключенного к сети L3[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10080": "Балансировщик нагрузки[%s] listener[%s] не поддерживает назначение времени ожидания и имени cookie; должно быть указано постоянство сеанса.", + "ORG_ZSTACK_COMPUTE_VM_10140": "IP-адрес [%s] уже назначен vmNic", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10085": "Балансировщик нагрузки[%s] listener[%s] не поддерживает назначение политик постоянства сеанса, когда алгоритм балансировки нагрузки основан на источнике.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10086": "Балансировщик нагрузки[%s] не поддерживает использование iphash для постоянства сеанса listener[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10083": "Балансировщик нагрузки[%s] listener[%s] не поддерживает назначение времени ожидания постоянства сеанса без указания режима перезаписи", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10084": "Балансировщик нагрузки[%s] listener[%s] не поддерживает назначение постоянства сеанса с cookieName без указания режима вставки", + "ORG_ZSTACK_COMPUTE_VM_10149": "Неподдерживаемый тип медиа изображения: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10087": "недопустимое максимальное количество подключений[%s], указанное значение превышает верхний порог %d", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10088": "конфликт порта балансировщика нагрузки[%s], другой listener[uuid:%s] использует этот порт", + "ORG_ZSTACK_COMPUTE_VM_10147": "ВМ %s со снимками памяти не поддерживает установку загрузочного тома", + "ORG_ZSTACK_COMPUTE_VM_10146": "том[uuid:%s] должен быть присоединен к виртуальной машине[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10145": "Загрузочный том этого экземпляра не может быть настроен как общий.", + "ORG_ZSTACK_COMPUTE_VM_10144": "недопустимое загрузочное устройство [%%s] в порядке загрузки %%s", + "ORG_ZSTACK_VMWARE_10024": "Невозможно выполнить синхронизацию до изоляции хранилищ данных", + "ORG_ZSTACK_VMWARE_10025": "Выполняются задачи на vCenter[uuid:%s], пожалуйста, повторите попытку позже.", + "ORG_ZSTACK_VMWARE_10023": "не удалось подключиться к vCenter: %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10008": "Не удалось инициализировать SDN-контроллер, так как диапазоны VNI не настроены на контроллере [ip:%s]", + "ORG_ZSTACK_VMWARE_10020": "Нет доступных VNC-портов для виртуальной машины %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10009": "Не удалось получить информацию о диапазоне VNI от SDN-контроллера [ip:%s] из-за %s", + "ORG_ZSTACK_VMWARE_10021": "получение экземпляра сервиса для vCenter %s не удалось из-за %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10092": "облако не смогло создать listener балансировщика нагрузки, так как listener с протоколом TCP поддерживает только параметры TCP-прокси протокола.", + "ORG_ZSTACK_MEVOCO_10006": "неподдерживаемая операция для установки multiQueues тома[%s] virtio-scsi в облачной вычислительной среде.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10093": "облако не может создать прослушиватель балансировщика нагрузки, так как поддерживает только протокол TCP proxy %s", + "ORG_ZSTACK_MEVOCO_10005": "неподдерживаемая операция для установки корневого тома [%s] на использование нескольких очередей.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10091": "Создание облачного вычислительного ресурса завершилось ошибкой из-за прослушивателя с протоколом HTTPS, который поддерживает только версии HTTP [h1, h2]. Пожалуйста, обеспечьте совместимость вашего запроса.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10010": "Не удалось создать аппаратную сеть VXLAN, поскольку H3C tenant UUID является обязательным параметром для контроллера H3C VCFC V2. Пожалуйста, укажите необходимый UUID для продолжения.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10096": "прослушиватель балансировщика нагрузки типа %s не требует сертификата", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10097": "прослушиватель балансировщика нагрузки [uuid:%s] уже имеет сертификат [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10094": "облаку не удалось создать прослушиватель балансировщика нагрузки, поскольку прослушиватель с протоколом [%s] не поддерживает сжатие контента", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10095": "облако не может создать прослушиватель балансировщика нагрузки, так как поддерживает только алгоритмы сжатия [%s]", + "ORG_ZSTACK_MEVOCO_10007": "для общего тома единственным поддерживаемым типом основного хранилища является %s, текущий %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10015": "Не удалось создать диапазон VNI, так как указанная сеть L2 [uuid:%s] не является экземпляром пула сетей VXLAN.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10016": "Не удалось создать диапазон VNI [%s-%s], поскольку контроллеры H3C используют VNI как идентификатор VLAN, и диапазон должен быть в пределах 1-4094. Значения VNI должны соответствовать стандартам идентификаторов VLAN для реализации виртуальных сетей.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10017": "Не удалось создать диапазон VNI [%s-%s], так как он не покрывается ни одним из настроенных VNI контроллера SDN.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10098": "сертификат [uuid:%s] не связан с прослушивателем балансировщика нагрузки [uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10018": "Не удалось добавить диапазон IPv6, так как SDN-контроллер [uuid:%s] не работает. Текущий статус: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10099": "ошибка цели проверки состояния [%s], должно быть 'default' или номер порта в диапазоне [1~65535]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10011": "Не удалось создать аппаратную сеть VXLAN, так как указанный арендатор не существует в системе управления SDN-контроллера. Пожалуйста, проверьте идентификатор арендатора и убедитесь, что он правильно настроен в облачной среде.", + "ORG_ZSTACK_MEVOCO_10002": "невозможно найти режим IOPS из нулевого VolumeQoS", + "ORG_ZSTACK_VMWARE_10017": "L2[UUID:%s] не принадлежит кластеру vCenter[UUID:%s] [UUID:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10012": "Не удалось создать сеть VXLAN, так как SDN-контроллер [ip:%s] не ответил", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10013": "Не удалось создать сеть VXLAN на SDN-контроллере [IP:%s] из-за %s", + "ORG_ZSTACK_MEVOCO_10000": "ZStack был приостановлен, и все вызовы API, кроме операций чтения, отклоняются. Если вам нужно выполнить операцию, не связанную с чтением, добавьте '%s' в systemTags.", + "ORG_ZSTACK_VMWARE_10015": "В вычислительном кластере не найдено хостов: %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10014": "Не удалось удалить сеть VXLAN на SDN-контроллере [IP:%s] из-за %s", + "ORG_ZSTACK_VMWARE_10016": "vSwitch/dvSwitch не найден: %s, или vSwitch на другом ESX-хосте не имеет ту же группу портов", + "ORG_ZSTACK_VMWARE_10013": "Драйвер сетевого адаптера %s пока не поддерживается", + "ORG_ZSTACK_VMWARE_10014": "Кластер[uuid:%s] и сеть второго уровня[uuid:%s] принадлежат разным центрам обработки данных", + "ORG_ZSTACK_VMWARE_10011": "domainName[%s] не является допустимым DNS-именем или IP-адресом", + "ORG_ZSTACK_VMWARE_10012": "vCenter [Доменное имя:%s] был добавлен", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10019": "Не удалось добавить диапазон IPv6 по CIDR сети, так как SDN-контроллер [uuid:%s] не подключен. Текущий статус: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10000": "Не найден доступный baremetal-шлюз для этого запроса. Пожалуйста, убедитесь, что ваши baremetal-узлы правильно настроены и зарегистрированы в облачной вычислительной среде.", + "ORG_ZSTACK_VMWARE_10010": "Требуется имя пользователя для входа в vCenter.", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10002": "Не удалось выделить ресурс шлюза BareMetal2", + "ORG_ZSTACK_CORE_DEBUG_10000": "Информация о задаче (%s) не найдена в облачной вычислительной среде. Пожалуйста, убедитесь, что все необходимые детали задачи правильно настроены и загружены.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10020": "Не удалось добавить IP-диапазон, потому что SDN-контроллер [uuid:%s] не подключен. Текущий статус: %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10021": "Не удалось добавить IP-диапазон по сетевому CIDR, потому что SDN-контроллер [uuid:%s] не подключен. Текущий статус: %s", + "ORG_ZSTACK_MEVOCO_10014": "Недопустимая пропускная способность сети [%s], это не числовое значение", + "ORG_ZSTACK_MEVOCO_10019": "Недопустимая пропускная способность тома [%s], она должна быть больше или равна 1024 Мбит/с", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10028": "Не удалось получить список тенантов, потому что SDN-контроллер [ip:%s] не ответил", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10029": "Не удалось инициализировать SDN-контроллер, потому что на контроллере [ip:%s] не настроен тенант по умолчанию", + "ORG_ZSTACK_VMWARE_10009": "Консольный пароль не поддерживается виртуальной машиной [UUID:%s] на ESX-хосте [Версия ESXi:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10022": "Невозможно создать сеть уровня 3, потому что SDN-контроллер H3C VCFC V2 не поддерживает сети уровня 3 [тип:%s, категория:%s]", + "ORG_ZSTACK_MEVOCO_10013": "Недопустимая пропускная способность сети [%s], она должна быть больше или равна %d Мбит/с", + "ORG_ZSTACK_VMWARE_10006": "Не удалось получить статистику использования корневого диска ВМ[%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10023": "Невозможно создать аппаратную VXLAN-сеть, потому что UUID тенанта является обязательным параметром для контроллера H3C VCFC V2. Пожалуйста, убедитесь, что он предоставлен.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10024": "Не удалось добавить контроллер H3C VCFC, потому что системный тег VDS UUID требуется для контроллеров H3C VCFC V1", + "ORG_ZSTACK_VMWARE_10005": "Не удалось получить экземпляр ВМ из пути установки: %s", + "ORG_ZSTACK_VMWARE_10002": "Виртуальный дата-центр не найден", + "ORG_ZSTACK_VMWARE_10000": "Служба управления виртуальными дисками не найдена", + "ORG_ZSTACK_VMWARE_10001": "Файловый менеджер не настроен для операций облачного хранения. Пожалуйста, убедитесь, что установлен действительный файловый менеджер для обработки операций %s.", + "ORG_ZSTACK_VPC_HA_VYOS_10000": "Не удалось включить HA на виртуальном роутере[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10011": "NFV-экземпляр [uuid:%s] находится в состоянии %s, и не может выполнить HTTP-запрос к %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10010": "NFV-экземпляр [имя:%s, UUID:%s, текущее состояние:%s] не запущен и не может выполнить требуемую операцию. Пожалуйста, повторите операцию после запуска экземпляра.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10013": "Невозможно добавить сетевой интерфейс [ip:%s, mac:%s] к NFV-экземпляру [uuid:%s ip:%s], потому что %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10012": "NFV-экземпляр [uuid:%s] не имеет управляющего сетевого интерфейса для выполнения HTTP-запроса к %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10004": "Не удалось определить основной узел для SDN-контроллера [ip:%s] из-за %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10005": "Не удалось аутентифицироваться с SDN-контроллером, потому что контроллер [IP:%s] не ответил", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_10000": "Длительная задача миграции хранилища ВМ[uuid:%s] [uuid:%s] не выполнена из-за перезапуска управляющего узла", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10006": "Не удалось аутентифицироваться с SDN-контроллером [IP:%s], потому что %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10007": "Не удалось получить информацию о диапазоне VNI, потому что SDN-контроллер [ip:%s] не ответил", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10000": "Не удалось добавить IP-диапазон, потому что создание подсети на SDN-контроллере не удалось. Пожалуйста, проверьте конфигурацию сети или обратитесь в службу поддержки за помощью.", + "ORG_ZSTACK_COMPUTE_VM_10103": "Невозможно переключиться на L3 сеть. L3 сеть [uuid:%s] является системной сетью, а ВМ - пользовательской ВМ.", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10015": "VMInstanceSpec не найден в параметрах данных потока. Пожалуйста, убедитесь, что все необходимые спецификации включены.", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10001": "Не удалось добавить IP-диапазон в сеть, так как %s", + "ORG_ZSTACK_COMPUTE_VM_10102": "Невозможно переключиться на L3 сеть. L3 сеть с UUID [uuid:%s] отключена", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10014": "Невозможно удалить образ [UUID:%s], так как он используется группой экземпляров NFV [UUID:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10002": "Не удалось удалить IP-диапазон из сети Layer 3, так как %s", + "ORG_ZSTACK_COMPUTE_VM_10101": "Невозможно переключиться на не-гостевую L3 сеть. L3 сеть с UUID [uuid:%s] уже связана с ВМ [uuid: %s].", + "ORG_ZSTACK_COMPUTE_VM_10100": "Невозможно переключиться на L3 сеть. L3 сеть с UUID [uuid:%s] уже привязана к ВМ с UUID [%s].", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10003": "Не удалось определить лидера кластера, так как SDN контроллер [IP:%s] не ответил", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10016": "VM Inventory или UUID равен null в спецификации экземпляра ВМ", + "ORG_ZSTACK_PORTMIRROR_10008": "Сервис PortMirror не поддерживает NIC [%s] из-за его типа гипервизора.", + "ORG_ZSTACK_PORTMIRROR_10009": "Сервис PortMirror не может зеркалировать на NIC [%s], который не является нестандартным интерфейсом ВМ.", + "ORG_ZSTACK_ZWATCH_API_10019": "Длительность запроса не может превышать %s", + "ORG_ZSTACK_COMPUTE_VM_10198": "Невозможно создать экземпляр ВМ из общего тома. Пожалуйста, убедитесь, что том не установлен как общий и попробуйте снова.", + "ORG_ZSTACK_PORTMIRROR_10000": "Неверный параметр [%s], убедитесь, что он ссылается на допустимую сеть Port Mirroring", + "ORG_ZSTACK_COMPUTE_VM_10197": "Необходимо установить одно из следующих свойств: %s", + "ORG_ZSTACK_PORTMIRROR_10001": "Сеть[%s] уже связана с сервисом Port Mirroring", + "ORG_ZSTACK_ZWATCH_API_10028": "Учетная запись[uuid: %s] не имеет разрешений для ресурса[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10196": "Невозможно настроить следующие свойства одновременно: %s", + "ORG_ZSTACK_PORTMIRROR_10002": "Сервис Port Mirroring[%s] не был создан", + "ORG_ZSTACK_PORTMIRROR_10003": "NIC [%(device_id)s, %(network_interface_id)s] уже зеркалируется сервисом [%(service_id)s]", + "ORG_ZSTACK_COMPUTE_VM_10194": "Для экземпляра должно быть указано хотя бы одно из следующего: архитектура в msg или образ[uuid:%s]", + "ORG_ZSTACK_PORTMIRROR_10004": "NIC[%s] не может быть зеркалирован для сервиса[%s] с использованием", + "ORG_ZSTACK_ZWATCH_API_10025": "Неверная метка[%s], допустимые метки для запросов облачных ресурсов: %s", + "ORG_ZSTACK_COMPUTE_VM_10193": "Для гостевой операционной системы должно быть указано хотя бы одно из следующего: поле guestOsType в msg или образ[uuid:%s].", + "ORG_ZSTACK_ZWATCH_API_10024": "Метрика[%s] не имеет фильтра[%s]", + "ORG_ZSTACK_COMPUTE_VM_10192": "Для сообщения или образа [uuid:%s] должно быть указано хотя бы одно из следующего: platform или imageID.", + "ORG_ZSTACK_PORTMIRROR_10007": "Сервис PortMirror не поддерживает зеркалирование NIC[%s].", + "ORG_ZSTACK_ZWATCH_API_10021": "Невозможно найти метрику[%s] в пространстве имен[%s]", + "ORG_ZSTACK_COMPUTE_VM_10199": "Не удалось создать экземпляр ВМ из присоединенного тома. Пожалуйста, убедитесь, что том находится в пригодном для использования состоянии, и попробуйте снова.", + "ORG_ZSTACK_PORTMIRROR_10011": "Служба PortMirror не может установить зеркальный туннель для сетевого интерфейса [%s] к сетевому интерфейсу [%s], потому что зеркальная сеть [%s] некорректна.", + "ORG_ZSTACK_PORTMIRROR_10012": "Служба PortMirror не может зеркалировать сетевой интерфейс [%s] на самого себя", + "ORG_ZSTACK_ZWATCH_API_10039": "Неверный формат JSON для меток. Пожалуйста, убедитесь, что labelsJsonStr правильно отформатирован.", + "ORG_ZSTACK_PORTMIRROR_10013": "Служба PortMirror несовместима с сетевым интерфейсом, настроенным с Качеством обслуживания (QoS).", + "ORG_ZSTACK_ZWATCH_API_10038": "Пространство имён [%s] не имеет метрики [%s]", + "ORG_ZSTACK_PORTMIRROR_10014": "не удалось удалить сессию зеркалирования портов [%s] с гипервизора, подробности: %s", + "ORG_ZSTACK_ZWATCH_API_10037": "В системе не определено пространство имён", + "ORG_ZSTACK_PORTMIRROR_10015": "не удалось освободить сессию зеркалирования портов [%s] с гипервизора, подробности: %s", + "ORG_ZSTACK_ZWATCH_API_10036": "Неверный формат URL; он должен начинаться с http(s).", + "ORG_ZSTACK_PORTMIRROR_10016": "не удаётся найти внутренний ID сессии [uuid:%s], не превышен ли лимит сессий на хосте???", + "ORG_ZSTACK_ZWATCH_API_10033": "endTime[%s, %sms] не должен быть раньше startTime[%s, %sms]", + "ORG_ZSTACK_ZWATCH_API_10032": "метрика [%s] не включает метку [%s]", + "ORG_ZSTACK_ZWATCH_API_10031": "не удаётся найти пространство имён [%s]", + "ORG_ZSTACK_ZWATCH_API_10030": "Если пространство имён установлено как all, указание метрик и меток не поддерживается.", + "ORG_ZSTACK_PORTMIRROR_10010": "Служба PortMirror не может зеркалировать сетевой интерфейс [%s], который не является интерфейсом какой-либо ВМ.", + "ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10009": "не удалось получить информацию о PCI устройстве с хоста [uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10030": "Не удалось получить tenant по умолчанию от SDN контроллера [ip:%s] из-за проблем со связью", + "ORG_ZSTACK_ZWATCH_API_10046": "Временной интервал превышает %d дней", + "ORG_ZSTACK_ZWATCH_API_10045": "endTime[%s] не должен быть раньше startTime[%s]", + "ORG_ZSTACK_ZWATCH_API_10044": "неверный экземпляр [%s]", + "ORG_ZSTACK_ZWATCH_API_10043": "Запись подтверждения оповещения для ECS экземпляра не существует", + "ORG_ZSTACK_ZWATCH_API_10042": "startTime[%s] позже, чем endTime[%s]", + "ORG_ZSTACK_ZWATCH_API_10041": "платформа [url=%s] уже существует", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10033": "Не удалось удалить VXLAN сеть, потому что SDN контроллер [ip:%s] не ответил", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10004": "ошибка операции, VIP %s не привязан к экземпляру ВМ", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10000": "не удалось создать правило переадресации портов [vip ip: %s, private ip: %s, vip start port: %d, vip end port: %d, private start port: %d, private end port: %d], потому что %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10001": "не удалось отозвать правила переадресации портов %s из-за %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10002": "не удалось синхронизировать правила переадресации портов, обслуживаемые виртуальным роутером [name: %s, uuid: %s], потому что %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10003": "Найден виртуальный роутер [uuid:%s] для L3 сети [uuid:%s] в зоне [uuid:%s]; однако публичная сеть сети [uuid:%s] не соответствует правилу переадресации портов [uuid:%s]. Возможно, потребуется указать конкретное предложение виртуального роутера, используя системный тег guestL3Network::l3NetworkUuid.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10004": "виртуальный роутер не поддерживает переадресацию диапазонов портов; VIP порт start должен равняться private порту start, а VIP порт end должен равняться private порту end. Однако это правило имеет несовпадающий диапазон: VIP порт [%s, %s], private порт [%s, %s].", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10005": "не удалось добавить переадресацию портов на виртуальном роутере[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10006": "не удалось отменить переадресацию портов на виртуальном роутере[uuid:%s], ошибка: %s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10003": "не удалось удалить вторичные устройства хранения данных по причине:%s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10004": "не удалось получить информацию об устройстве MTTY от хоста[UUID:%s]", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10001": "Превышено количество. Устройство[uuid: %s] требует количество устройств SE, превышающее допустимое количество[%d].", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10002": "не удалось создать устройства хранения данных по причине:%s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10000": "Указанный номер части[value:%s] не является допустимым ID экземпляра в данной облачной среде.", + "ORG_ZSTACK_CORE_CLOUDBUS_10021": "сообщение имеет некорректный формат JSON, %s", + "ORG_ZSTACK_COMPUTE_VDPA_10009": "только %s поддерживают технологию ускорения vdpa", + "ORG_ZSTACK_COMPUTE_VDPA_10007": "невозможно создать PCI-устройство[uuid:%s], потому что другой экземпляр L2[uuid:%s] использует физический сетевой интерфейс, подключенный к кластеру", + "ORG_ZSTACK_COMPUTE_VDPA_10006": "невозможно удалить PCI-устройство[uuid:%s], потому что другой экземпляр L2[uuid:%s] использует физический сетевой интерфейс, подключенный к кластеру", + "ORG_ZSTACK_COMPUTE_VDPA_10005": "не удалось удалить мост[%s] для l2Network[uuid:%s, type:%s] на KVM хосте[uuid:%s], по причине %s", + "ORG_ZSTACK_COMPUTE_VDPA_10004": "не удалось проверить мост[%s] для l2NoVlanNetwork[uuid:%s, name:%s] на KVM хосте[uuid: %s], %s", + "ORG_ZSTACK_COMPUTE_VDPA_10003": "не удалось создать мост[%s] для l2Network[uuid:%s, type:%s] на KVM хосте[uuid:%s], по причине %s", + "ORG_ZSTACK_COMPUTE_VDPA_10002": "восстановление vdpa для VM[uuid:%s] с целевого хоста[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VDPA_10001": "освобождение vdpa устройства для VM[uuid:%s] на целевом хосте[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10152": "VM[uuid:%s] подключена к нескольким ISO, укажите isoUuid при отключении.", + "ORG_ZSTACK_COMPUTE_VM_10151": "VM[uuid:%s] смонтировала ISO CD-ROM[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10150": "virtualCDROM с UUID:%s не существует", + "ORG_ZSTACK_COMPUTE_VM_10159": "Невозможно подключить сеть уровня 3. Сеть уровня 3 [uuid:%s] принадлежит сетям уровня 2 [uuids:%s], которые не подключены ни к одному кластеру.", + "ORG_ZSTACK_COMPUTE_VM_10158": "Невозможно подключить сеть уровня 3. Указанная сеть L3 [uuid:%s] принадлежит другой сети уровня 2 [uuids:%s].", + "ORG_ZSTACK_COMPUTE_VM_10157": "невозможно подключить сеть уровня 3. Указанная сеть уровня 3 [uuid:%s] не имеет определенного диапазона IP-адресов.", + "ORG_ZSTACK_COMPUTE_VM_10156": "невозможно подключить сеть уровня 3. VM [uuid: %s] не находится в состоянии Работает или Остановлена; текущее состояние: %s", + "ORG_ZSTACK_COMPUTE_VDPA_10015": "не удалось выделить vDPA на хосте[uuid:%s] для VM[uuid:%s]: %s", + "ORG_ZSTACK_COMPUTE_VDPA_10013": "не удалось удалить vDPA на хосте[UUID:%s] для VM[UUID:%s]: %s", + "ORG_ZSTACK_COMPUTE_VDPA_10012": "L2 сеть [UUID:%s] на хосте [UUID:%s] не имеет SRIOV виртуализации", + "ORG_ZSTACK_COMPUTE_VDPA_10011": "кластер[uuid:%s] не поддерживает ovs-dpdk", + "ORG_ZSTACK_COMPUTE_VDPA_10010": "невозможно создать vSwitch с физическим интерфейсом:[%s], который уже используется другим типом vSwitch.", + "ORG_ZSTACK_COMPUTE_VM_10163": "невозможно подключить сеть уровня 3. Сеть уровня 3 с UUID [uuid:%s] является системной сетью, а VM является пользовательской VM.", + "ORG_ZSTACK_COMPUTE_VM_10162": "невозможно подключить сеть уровня 3. Сеть уровня 3 с UUID [%s] отключена", + "ORG_ZSTACK_COMPUTE_VM_10161": "невозможно подключить L3 сеть, не являющуюся гостевой, к виртуальной машине, так как она уже подключена к другой виртуальной машине (uuid: %s)", + "ORG_ZSTACK_COMPUTE_VM_10160": "Невозможно подключить сеть уровня 3. Указанная сеть уровня 3 [uuid:%s] уже подключена к виртуальной машине [uuid: %s].", + "ORG_ZSTACK_COMPUTE_VM_10168": "Статический IP [%s] уже назначен ресурсу в сети уровня 3 [uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_10167": "Статический IP [%s] не входит ни в один диапазон IP-адресов сети уровня 3 [uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_10166": "UUID статического IP L3 [%s] не включен в список L3 NIC [%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10009": "IAM2ProjectVO[uuid:%s] не находится в состоянии %s, изменение состояния не разрешено", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10008": "Проект [UUID:%s, Name:%s] уже имеет настроенную стратегию истечения срока действия входа.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10007": "неверная дата или время[%s], она не может быть раньше текущей метки времени[%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10006": "неверное значение расходов[%s], оно должно быть в формате, например, 10.001", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10005": "неверное значение расходов[%s], значение расходов должно быть между 0 и %f", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10004": "неверное время[%s], оно должно быть в формате, например, 10m, 1h или 2d", + "ORG_ZSTACK_CORE_CLOUDBUS_10001": "для веб-хуков с типом[%s], поле opaque не может быть null", + "ORG_ZSTACK_COMPUTE_VM_10176": "Невозможно подключить NIC. Его L2 сеть [uuid:%s] не подключена ни к одному вычислительному кластеру.", + "ORG_ZSTACK_ZWATCH_API_10007": "Параметры dataStartTime и dataEndTime не могут быть опущены. Убедитесь, что они предоставлены.", + "ORG_ZSTACK_COMPUTE_VM_10175": "Невозможно подключить NIC. Его сеть уровня 3 [uuid:%s] является системной сетью, тогда как ВМ является пользовательской ВМ.", + "ORG_ZSTACK_ZWATCH_API_10006": "dataUuid не может быть опущен", + "ORG_ZSTACK_COMPUTE_VM_10174": "невозможно подключить nic. Его сеть уровня 3 [uuid:%s] отключена", + "ORG_ZSTACK_COMPUTE_VM_10173": "Невозможно подключить NIC к L3 сети, не являющейся гостевой. L3 сеть [uuid:%s] уже подключена к ВМ [uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_10172": "Сеть уровня 3 с UUID [%s] уже подключена к другой ВМ с UUID [%s]. Отключите её от существующей ВМ перед подключением к новой.", + "ORG_ZSTACK_COMPUTE_VM_10171": "NIC уже подключен к ВМ [UUID: %s]. Убедитесь, что NIC не подключен, прежде чем пытаться подключить его снова.", + "ORG_ZSTACK_COMPUTE_VM_10170": "невозможно подключить nic. ВМ[uuid: %s] не находится в состоянии Running или Stopped; текущее состояние %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10011": "Проект [UUID:%s, Name:%s] уже имеет определенную политику выбытия.", + "ORG_ZSTACK_COMPUTE_VM_10179": "невозможно отключить L3 сеть от ВМ [uuid: %s]; ВМ не находится в состоянии Running или Stopped; текущее состояние %s", + "ORG_ZSTACK_COMPUTE_VM_10178": "не удалось обновить состояние сетевого интерфейса [uuid: %s], из-за неподдерживаемого типа сетевого интерфейса [%s]", + "ORG_ZSTACK_CORE_UPGRADE_10000": "Api: %s не разрешен в соответствии со списком разрешенных API при сером обновлении: %s.", + "ORG_ZSTACK_CORE_UPGRADE_10003": "Не удается найти версию агента; обновление ОС кластера не поддерживается во время серого обновления. Пожалуйста, убедитесь, что версия агента установлена перед началом процесса обновления.", + "ORG_ZSTACK_CORE_UPGRADE_10002": "Отключите серое обновление с помощью %s перед обновлением ОС хостов всего кластера. Альтернативно, попробуйте обновить ОС кластера с определенным UUID хоста.", + "ORG_ZSTACK_CORE_UPGRADE_10004": "Хост[UUID: %s] версия агента не была обновлена. Пожалуйста, переподключите хост перед выполнением обновления операционной системы.", + "ORG_ZSTACK_ZWATCH_API_10008": "dataStartTime[%s] позже, чем dataEndTime[%s]", + "ORG_ZSTACK_COMPUTE_VM_10187": "когда imageUuid равен null, placeholder_for_image_uuid_is_missing", + "ORG_ZSTACK_COMPUTE_VM_10186": "Корневой диск отсутствует. Пожалуйста, убедитесь, что корневой том подключен к вашему экземпляру.", + "ORG_ZSTACK_COMPUTE_VM_10185": "Неожиданная конфигурация для дисков данных. Размеры, указанные в dataDiskSizes, должны быть больше 0.", + "ORG_ZSTACK_COMPUTE_VM_10182": "Неожиданные настройки корневого тома", + "ORG_ZSTACK_COMPUTE_VM_10181": "Тип носителя образа ISO, но настройки корневого диска отсутствуют", + "ORG_ZSTACK_COMPUTE_VM_10180": "vm[uuid:%s] может подключать том только в состоянии Running или Stopped; текущее состояние: %s.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10003": "неверная дата[%s], она должна быть в формате yyyy-MM-dd HH:mm:ss ZZZ", + "ORG_ZSTACK_ZWATCH_API_10010": "Имя пространства имен не может начинаться с зарезервированного ключевого слова, например %s.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10002": "неверное средство[%s], допустимые средства предназначены для указания квот ресурсов или метрик в облачной среде", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10001": "неверное значение для параметра, %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10000": "Указан неверный лимит ресурсов; ожидается числовое значение без суффиксов 'at', 'after' или 'exceed'. Пожалуйста, укажите корректное число.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10030": "PXE Server DHCP Interface %s does not exist, or it does not have an IP address.", + "ORG_ZSTACK_NETWORK_OVN_10012": "cannot add SDN host because network interface [%s] has IP address [%s]", + "ORG_ZSTACK_NETWORK_OVN_10011": "cannot add SDN host because NIC[%s] is in SR-IOV virtualized state", + "ORG_ZSTACK_NETWORK_OVN_10010": "cannot add SDN host because NIC[%s]'s type [%s] is used for Linux bonding", + "ORG_ZSTACK_NETWORK_OVN_10016": "SDN host addition failed because only KVM hosts support OVS DPDK.", + "ORG_ZSTACK_APIMEDIATOR_10000": "More than one Backup Storage instance on the same host identified by hostname. There has been an SftpBackupStorage [hostname:%s] existing. The Backup Storage type to be added is %s.", + "ORG_ZSTACK_NETWORK_OVN_10015": "cannot add SDN host because bond mode[%s] is not supported by OVN", + "ORG_ZSTACK_NETWORK_OVN_10014": "cannot add SDN host because NIC[%s] is used for VXLAN VTEP interface", + "ORG_ZSTACK_NETWORK_OVN_10013": "cannot add SDN host because NIC[%s] has been attached to L2 network[name:%s]", + "ORG_ZSTACK_APIMEDIATOR_10001": "More than one Backup Storage service running on the same host identified by hostname. There exists an Image Store Backup Storage service [hostname:%s]. The type of Backup Storage to be added is %s.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10031": "%s ~ %s cannot establish a connection to the DHCP interface %s", + "ORG_ZSTACK_NETWORK_OVN_10019": "Хост с UUID [%s] в кластере с UUID [%s] не имеет включенных hugepages; поэтому его нельзя добавить в SDN контроллер.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10032": "cluster[uuid:%s] and pxeserver[uuid:%s] do not reside within the same zone", + "ORG_ZSTACK_NETWORK_OVN_10018": "Cannot add SDN host because a network mask has not been specified.%s", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10033": "cluster[uuid:%s] is not a baremetal cluster", + "ORG_ZSTACK_NETWORK_OVN_10017": "Cannot add SDN host because VTEP IP is not configured.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10034": "baremetal PXE server [uuid:%s] is already attached to cluster [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10035": "baremetal PXE server [UUID: %s] is not compatible with baremetal instances in cluster [UUID: %s], as the existing NIC IP %s falls outside of the PXE server's DHCP range (%s ~ %s).", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10036": "baremetal PXE server [UUID: %s] is not associated with cluster [UUID: %s]", + "ORG_ZSTACK_STORAGE_MIGRATION_10030": "The destination primary storage is not attached to a cluster that shares the same level 2 networks as the source cluster.", + "ORG_ZSTACK_STORAGE_MIGRATION_10033": "не поддерживают миграцию хранилища, пока подключен общий том[uuid: %s, name: %s]", + "ORG_ZSTACK_STORAGE_MIGRATION_10034": "Невозможно перенести том с исходного экземпляра на целевой экземпляр.", + "ORG_ZSTACK_STORAGE_MIGRATION_10031": "Том [UUID:%s] все еще подключен к ВМ [UUID:%s], отключите его перед миграцией.", + "ORG_ZSTACK_STORAGE_MIGRATION_10032": "невозможно перенести том данных[uuid:%s] между общими блочными основными хранилищами, когда виртуальная машина[vmuuid:%s] не остановлена.", + "ORG_ZSTACK_STORAGE_MIGRATION_10035": "невозможно перенести том[%s], так как его состояние - \"Отключено\"", + "ORG_ZSTACK_STORAGE_MIGRATION_10036": "Нет доступных хостов для миграции на основе блоков в реальном времени: %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10019": "не удалось найти SNSTextTemplate с UUID:%s, он мог быть удален или удален из облачного хранилища.", + "ORG_ZSTACK_NETWORK_OVN_10023": "невозможно изменить vmnic на l3network [uuid:%s], так как хост [uuid:%s], связанный с виртуальной машиной, не подключен к SDN-контроллеру [uuid:%s].", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10028": "не удалось установить соединение с %s, проверьте конфигурацию сети между узлом управления ZStack и PXE-сервером для bare-metal", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10016": "платформа/конечная точка приложения [%s] не поддерживает пользовательские шаблоны", + "ORG_ZSTACK_NETWORK_OVN_10022": "невозможно изменить VMNIC на L3 сеть [UUID:%s], так как SDN-контроллер [UUID:%s] не найден", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10029": "Локальный репозиторий не найден в /opt/zstack-dvd для %s, сначала загрузите zStack ISO и создайте локальный репозиторий.", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10015": "недопустимый тип платформы приложения[%s]", + "ORG_ZSTACK_NETWORK_OVN_10021": "невозможно подключить L3 сеть к ВМ, так как хост [uuid:%s] ВМ не подключен к SDN-контроллеру [uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10018": "невозможно найти тему[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10020": "невозможно подключить L3 сеть к ВМ, так как SDN-контроллер [uuid:%s] не найден", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10017": "параметры: %s не поддерживаются ZStack, доступные значения для параметров: %s", + "ORG_ZSTACK_NETWORK_OVN_10026": "не удалось синхронизировать настройки качества обслуживания сети с контроллером OVN[uuid:%s, ip:%s], из-за %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10011": "Код шаблона SMS должен быть строкой длиной 13 символов. Однако предоставленный код шаблона события: [%s] имеет [%d] символов.", + "ORG_ZSTACK_NETWORK_OVN_10025": "не удалось получить QoS NIC от контроллера OVN[uuid:%s, ip:%s], из-за %s", + "ORG_ZSTACK_NETWORK_OVN_10024": "не удалось установить QoS NIC на контроллере OVN[uuid:%s, ip:%s], потому что %s", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10020": "Неподдерживаемый тип резервного хранилища для bare-metal сервера", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10010": "Длина кода шаблона SMS должна быть 13 символов. Полученный код шаблона аварийного сигнала: [%s] с [%d] символами.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10023": "Маска подсети диапазона DHCP PXE-сервера %s недопустима для развертывания виртуальной машины.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10024": "Начало диапазона DHCP PXE-сервера %s и конец диапазона %s не принадлежат одной подсети маски подсети.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10025": "PXE-сервер с таким именем узла уже существует.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10026": "Уже существует шлюз Baremetal2 с IP-адресом управления %s; пожалуйста, не используйте его для создания PXE-сервера Baremetal.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10027": "storagePath должен быть абсолютным путем, указывающим полное местоположение в виртуальной файловой системе.", + "ORG_ZSTACK_STORAGE_MIGRATION_10022": "Образ[uuid:%s] не найден в исходном резервном хранилище[uuid:%s].", + "ORG_ZSTACK_STORAGE_MIGRATION_10023": "Невозможно перенести образ из исходного местоположения в целевое местоположение.", + "ORG_ZSTACK_STORAGE_MIGRATION_10020": "Исходное блочное хранилище и целевое блочное хранилище не должны быть отключены.", + "ORG_ZSTACK_STORAGE_MIGRATION_10021": "Образ[uuid:%s] не находится в состоянии Ready и поэтому не может быть перенесен.", + "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10001": "Сигнал heartbeat от хоста %s не получен", + "ORG_ZSTACK_STORAGE_MIGRATION_10026": "Том[uuid:%s] не находится в состоянии Ready и не может быть перенесен.", + "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10000": "Идентификатор хоста не найден для UUID хоста[%s] и UUID основного хранилища[%s]", + "ORG_ZSTACK_STORAGE_MIGRATION_10027": "Невозможно перенести корневой том экземпляра виртуальной машины, когда он не находится в остановленном состоянии. Перед попыткой переноса корневого тома убедитесь, что экземпляр остановлен.", + "ORG_ZSTACK_STORAGE_MIGRATION_10024": "Том[uuid:%s] уже находится в пуле[uuid:%s], невозможно перенести.", + "ORG_ZSTACK_STORAGE_MIGRATION_10025": "Исходный и целевой сеансы PowerShell не должны находиться в состоянии Disabled или Maintenance.", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10009": "Длина подписи Alibaba Cloud SMS должна быть от 2 до 12 символов. Получена подпись: [%s] с количеством символов [%d].", + "ORG_ZSTACK_STORAGE_MIGRATION_10028": "Миграция хранилища ВМ не поддерживается для ВМ[uuid:%s, name: %s], когда подключен общий том.", + "ORG_ZSTACK_STORAGE_MIGRATION_10029": "Невозможно перенести корневой том экземпляра ВМ, к которому подключены тома данных. Перед переносом корневого тома отключите все тома данных.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10017": "Не удалось смонтировать кэш baremetal для образа[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10019": "Недостаточно места в кэше baremetal для образа[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10011": "Не удалось создать конфигурацию DHCP для шасси [uuid:%s] на PXE-сервере [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10012": "Не удалось удалить конфигурацию DHCP шасси[uuid:%s] на PXE-сервере[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10013": "UUID агента PXE-сервера baremetal изменился [ожидалось: %s, получено: %s]. Скорее всего, это связано с ручным перезапуском агента. Повторно подключитесь для синхронизации состояния.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10005": "Не удается найти каталог: %s на панели мониторинга", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10016": "Невозможно подключиться к PXE-серверу baremetal [url:%s], причина: %s", + "ORG_ZSTACK_LICENSE_10002": "Предоставленный код запроса лицензии %s недействителен для выделения облачных ресурсов. Проверьте и повторите попытку.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10003": "Ошибка выполнения sqlite3 по причине: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10000": "Неподдерживаемый метод: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10001": "Ошибка HTTP-запроса! Код состояния: %s, ошибка: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10011": "Подключенное резервное хранилище Ceph не поддерживает миграцию хранилища на основе ISO.", + "ORG_ZSTACK_STORAGE_MIGRATION_10015": "Не поддерживается миграция хранилища из [%s] в [%s] виртуальную среду", + "ORG_ZSTACK_STORAGE_MIGRATION_10016": "ВМ[uuid:%s] запущена, но UUID хоста отсутствует", + "ORG_ZSTACK_STORAGE_MIGRATION_10013": "Не поддерживается миграция хранилища из [%s] в [%s] с томами данных", + "ORG_ZSTACK_STORAGE_MIGRATION_10014": "Не поддерживается миграция хранилища из [%s] в [%s] с использованием снимков", + "ORG_ZSTACK_STORAGE_MIGRATION_10019": "Исходное BS и целевое BS не могут быть одинаковыми.", + "ORG_ZSTACK_STORAGE_MIGRATION_10017": "Поддерживается только живая миграция хранилища томов данных с использованием параметра dataVolumes.", + "ORG_ZSTACK_STORAGE_MIGRATION_10018": "Не поддерживается живая миграция хранилища из [%s] в [%s] для томов, отличных от корневого", + "ORG_ZSTACK_NETWORK_OVN_10001": "не удалось добавить VM NIC в группу безопасности, так как SDN VM NIC [uuid:%s] не соответствует SDN группы безопасности [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10006": "не удалось создать bm instance nginx proxy на baremetal pxeserver[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10000": "не удалось подключить L3 сеть к группе безопасности, так как SDN сети L3 [uuid:%s] не соответствует SDN группы безопасности [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10007": "не удалось удалить bm instance nginx proxy на baremetal pxeserver[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10008": "не удалось запустить baremetal PXE server[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10009": "не удалось остановить baremetal PXE server[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10005": "невозможно создать группу безопасности, так как OVS controller[uuid:%s, type: %s] не найден", + "ORG_ZSTACK_NETWORK_OVN_10004": "Невозможно создать группу безопасности, так как указан OVN controller. Пожалуйста, убедитесь, что OVN controller не указан при создании группы безопасности.", + "ORG_ZSTACK_NETWORK_OVN_10003": "Невозможно удалить хост, так как на хосте запущено %d экземпляров OVN controller", + "ORG_ZSTACK_NETWORK_OVN_10002": "невозможно создать Layer 3 сеть, так как OVN не поддерживает тип L3: %s, категория: %s", + "ORG_ZSTACK_NETWORK_OVN_10009": "невозможно добавить SDN хост, так как сетевой интерфейс [%s] не найден", + "ORG_ZSTACK_NETWORK_OVN_10008": "Невозможно создать SDN L2 сеть, так как отсутствует UUID SDN controller. Пожалуйста, убедитесь, что UUID SDN controller настроен правильно.", + "ORG_ZSTACK_NETWORK_OVN_10007": "невозможно подключить сетевой сервис[%s] к OVS сети", + "ORG_ZSTACK_GUESTTOOLS_PVPANIC_10000": "невозможно развернуть виртуальные машины без допустимого пути к исходному файлу", + "ORG_ZSTACK_NETWORK_OVN_10006": "невозможно подключить OVN сетевой сервис к сети с vSwitchType[%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10001": "не удалось инициализировать конфигурации на baremetal PXE server[uuid:%s]", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_MARKETPLACE_10000": "filterName должен быть установлен в marketplace:true или marketplace:false для правильной фильтрации в сервисе marketplace.", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10002": "не удалось создать конфигурации baremetal instance на pxeserver[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10003": "не удалось удалить конфигурации baremetal instance на pxeserver[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10004": "не удалось создать BM instance NOVA proxy на baremetal PXE server[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10005": "не удалось удалить bm instance novnc proxy на baremetal pxeserver[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_10005": "L3Network[uuid:%s] не имеет включенного сетевого сервиса[type:%s] или нет провайдера, предлагающего этот сетевой сервис.", + "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10000": "неподдерживаемая возможность: SEND_SNS_MESSAGE", + "ORG_ZSTACK_NETWORK_SERVICE_10004": "Не удалось применить сетевой сервис[%s] к виртуальной машине[uuid: %s]", + "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10001": "не удалось отправить SNS уведомление на plugin %s", + "ORG_ZSTACK_NETWORK_SERVICE_10007": "сетевой сервис для провайдера[uuid:%s] должен быть определен", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10021": "не найдена baremetal2 provisioning сеть в cluster[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10020": "не найден используемый Baremetal2 gateway в cluster[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_10001": "L3Network [UUID: %s] не имеет настроенного host route сервиса.", + "ORG_ZSTACK_NETWORK_SERVICE_10000": "L3Network [UUID: %s] предоставляет null тип", + "ORG_ZSTACK_LICENSE_10019": "неожиданный поставщик узла для шаблона MINI VM", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10022": "сеть подготовки baremetal2 [uuid:%s] непригодна для использования; убедитесь, что она включена.", + "ORG_ZSTACK_NETWORK_SERVICE_10009": "поставщик сетевых услуг с UUID [%s] не предоставляет услуги для %s", + "ORG_ZSTACK_NETWORK_OVN_10052": "не удалось удалить порт OVS для узла [uuid:%s] для сетевых интерфейсов [%s], ошибка: %s", + "ORG_ZSTACK_NETWORK_SERVICE_10008": "невозможно найти поставщика сетевых услуг [uuid:%s] или он не предоставляет никаких услуг", + "ORG_ZSTACK_NETWORK_OVN_10051": "не удалось удалить порт OVS на узле [UUID:%s] для сетевых интерфейсов [%s], ошибка: %s", + "ORG_ZSTACK_NETWORK_OVN_10050": "не удалось синхронизировать порт OVS с узлом [uuid:%s] для сетевых интерфейсов [%s], ошибка: %s", + "ORG_ZSTACK_NETWORK_OVN_10056": "ошибка при запросе статуса кластера для проверки исключения узлов %s", + "ORG_ZSTACK_NETWORK_OVN_10055": "не удалось синхронизировать настройки Quality of Service с контроллером OVN [uuid:%s, ip:%s], ошибка: %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORK_10000": "невозможно настроить сеть VXLAN для виртуальной машины [uuid:%s] на целевом узле [uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10054": "не удалось установить запрошенное шасси порта OVS для узла [uuid:%s] для LSP[%s], ошибка: %s", + "ORG_ZSTACK_NETWORK_OVN_10053": "не удалось установить запрошенное шасси порта OVS на узле [uuid:%s] для LSP[%s], ошибка: %s", + "ORG_ZSTACK_NETWORK_OVN_10059": "не удалось добавить параметры DHCP в контроллер OVN [uuid:%s, ip:%s], потому что %s", + "ORG_ZSTACK_NETWORK_OVN_10058": "Получен пустой результат статуса кластера от агента; проверьте конфигурацию и подключение агента.", + "ORG_ZSTACK_NETWORK_OVN_10057": "Не удалось получить статус кластера: %s", + "ORG_ZSTACK_NETWORK_SERVICE_10010": "Сетевая служба [%s] была присоединена к сети уровня 3 [UUID: %s].", + "ORG_ZSTACK_LICENSE_10023": "Не удалось удалить лицензию для виртуальной машины %s из-за неизвестной ошибки. Обратитесь за помощью в службу поддержки.", + "ORG_ZSTACK_LICENSE_10003": "Предоставленная метка времени недействительна. Убедитесь, что она соответствует стандарту ISO 8601 (YYYY-MM-DDTHH:mm:ss).", + "ORG_ZSTACK_LICENSE_10004": "Получена неожиданная длина декодированного файла лицензии: %d. Ожидалась допустимая длина для облачных вычислительных услуг.", + "ORG_ZSTACK_LICENSE_10005": "Ошибка декодирования из-за %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10010": "физические серверные шасси не найдены в кластерах baremetal2 [uuids:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_10012": "networkServices не должно быть пустым", + "ORG_ZSTACK_NETWORK_SERVICE_10011": "При присоединении DHCP-службы к сети L3 [uuid:%s] недостаточно IP-адресов для выделения.", + "ORG_ZSTACK_NETWORK_SERVICE_10014": "невозможно найти NetworkService Dhcp Backend [тип провайдера: %s]", + "ORG_ZSTACK_NETWORK_OVN_10062": "не удалось выполнить пинг контроллера OVN [uuid:%s, ip:%s], из-за %s", + "ORG_ZSTACK_NETWORK_OVN_10061": "Невозможно отправить команду контроллеру OVN [uuid:%s, ip:%s], NfvInstanceGroup[uuid:%s, name:%s] статус %s, команды принимают только группы со статусом Healthy или Degraded", + "ORG_ZSTACK_NETWORK_OVN_10060": "контроллер OVN [uuid:%s] не подключен, текущий статус: %s", + "ORG_ZSTACK_NETWORK_OVN_10067": "IP [%s] не является допустимым Virtual IP в текущей среде. Используйте виртуальный IP-адрес группы NFV Instance Group.", + "ORG_ZSTACK_NETWORK_OVN_10066": "невозможно найти виртуальную машину [uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10064": "невозможно найти сетевой интерфейс виртуальной машины [internalName:%s]", + "ORG_ZSTACK_NETWORK_OVN_10069": "не удалось проверить связь с SDN-контроллером, ошибка: %s", + "ORG_ZSTACK_NETWORK_OVN_10068": "IP [%s] не связан ни с одной группой экземпляров NFV контроллера OVN SDN. Пожалуйста, используйте VIP-адрес группы экземпляров контроллера OVN.", + "ORG_ZSTACK_CORE_10000": "исполнитель не найден для ресурса UUID[%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10016": "имя bond %s уже существует", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10018": "невозможно найти шасси baremetal2 с UUID [%s], возможно, оно не существует", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10017": "сетевой адаптер с MAC-адресом уже объединен в bond", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10000": "не удалось проверить универсальный SMS с поставщиком[%s]", + "ORG_ZSTACK_LICENSE_10037": "MN[uuid:%s]: CloudInstanceNotDefinedException", + "ORG_ZSTACK_LICENSE_10038": "Существует несколько управляющих узлов, но предоставлены лицензии только для %s.", + "ORG_ZSTACK_LICENSE_10039": "Среда MN HA, но обновлена лицензия только для %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10001": "архитектура ЦП хоста [arch:%s] и кластера [arch:%s] не совпадают", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10000": "неверный формат информации о оборудовании шасси baremetal2: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10003": "неверный формат информации о оборудовании сетевых адаптеров шасси baremetal2: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10002": "поддерживаются только шасси baremetal2 с режимом загрузки %s", + "ORG_ZSTACK_NETWORK_OVN_10032": "не удалось настроить узлы кластера OVN для экземпляра NFV [UUID:%s], потому что %s", + "ORG_ZSTACK_NETWORK_OVN_10031": "экземпляры не найдены в NfvInstanceGroup[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10038": "отсоединение NfvInstance[uuid:%s] не удалось, так как экземпляр не найден", + "ORG_ZSTACK_NETWORK_OVN_10035": "сеть L2 [UUID:%s] не связана с SDN-контроллером", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10005": "неверный формат информации о дисковом оборудовании шасси baremetal2: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10004": "с шасси BareMetal2 должен быть связан ровно один provision NIC.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10006": "Обнаружена виртуальная машина с повторяющимся MAC-адресом на другом вычислительном узле. Пожалуйста, устраните этот конфликт.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10009": "не найдены доступные физические серверные ресурсы для развертывания baremetal2.%s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10008": "BareMetal2 Chassis[uuid:%s] не существует или отключен", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10002": "неверный поставщик[%s]", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10001": "не удалось проверить универсальный SMS для облачного сервисного экземпляра %s", + "ORG_ZSTACK_CORE_GC_10001": "невозможно запустить завершенную задачу сборки мусора[uuid:%s, name:%s]", + "ORG_ZSTACK_LICENSE_10046": "невозможно найти файл лицензии[uuid:%s, type:%s] по указанному пути %s", + "ORG_ZSTACK_LICENSE_10028": "не удалось отозвать лицензию для модуля %s", + "ORG_ZSTACK_LICENSE_10029": "UKey не поддерживается (архитектура: %s)", + "ORG_ZSTACK_NETWORK_OVN_10041": "невозможно присоединить сеть L3 к группе безопасности, так как SDN-контроллер [uuid:%s] не найден", + "ORG_ZSTACK_NETWORK_OVN_10040": "Управляющий IP не найден для отсоединения экземпляра NFVI [UUID:%s]", + "ORG_ZSTACK_NETWORK_OVN_10045": "не удалось запустить службу Open vSwitch на хосте[uuid:%s], ошибка: %s", + "ORG_ZSTACK_NETWORK_OVN_10043": "не удалось установить пакет ovs на хост[uuid:%s], ошибка: %s", + "ORG_ZSTACK_NETWORK_OVN_10042": "не удалось подключить сеть L3 к группе безопасности, так как SDN-контроллер [uuid:%s] не подключен [status:%s]", + "ORG_ZSTACK_NETWORK_OVN_10049": "не удалось синхронизировать порт OVS на хосте [UUID:%s] для сетевых интерфейсов [%s], ошибка: %s", + "ORG_ZSTACK_NETWORK_OVN_10048": "не удалось добавить порт OVS на хосте [UUID:%s] для NICs [%s], ошибка: %s", + "ORG_ZSTACK_NETWORK_OVN_10047": "не удалось добавить порт OVS на хосте [UUID:%s] для NICs [%s], ошибка: %s", + "ORG_ZSTACK_LICENSE_10030": "Лицензия UKey не найдена или не обновлена успешно. Пожалуйста, убедитесь, что ваш UKey правильно подключен и лицензирован для облачных вычислений.", + "ORG_ZSTACK_LICENSE_10031": "обновить локальную лицензию виртуальной машины: %s", + "ORG_ZSTACK_LICENSE_10032": "Нет доступного вычислительного экземпляра для обновления UKey", + "ORG_ZSTACK_GUESTTOOLS_KVM_10001": "не удалось отсоединить гостевые инструменты в виртуальной машине[uuid:%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10000": "не удалось получить информацию о гостевых инструментах из vm[uuid:%s], причина:%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10033": "id pci устройства[%s] не является допустимым целым числом в теге[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10034": "спецификация mdev устройства с UUID [%s] не существует", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10031": "ID PCI устройства отсутствует в теге[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10032": "ID PCI устройства должен быть больше 0 в теге[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10030": "спецификация pci устройства [uuid:%s] не существует, получено из тега [%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10006": "не удалось получить статус гостевых инструментов из prometheus: [metric=%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10005": "не удалось отсоединить ISO гостевых инструментов от VM[UUID:%s], причина:%s", + "ORG_ZSTACK_GUESTTOOLS_KVM_10004": "не удалось присоединить ISO гостевых инструментов к VM[UUID:%s], причина:%s", + "ORG_ZSTACK_GUESTTOOLS_KVM_10003": "не удалось загрузить ISO гостевых инструментов, так как KVM хост [uuid:%s] не найден", + "ORG_ZSTACK_LICENSE_10048": "Истечение срока действия лицензии: Срок действия лицензии вашей облачной вычислительной среды истек. Пожалуйста, обратитесь в поддержку для продления лицензии.", + "ORG_ZSTACK_LICENSE_10049": "не поддерживается: удалить лицензию[%s] из аппаратного ключа", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10024": "спецификация PCI устройства недоступна для виртуальной машины[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10025": "спецификация PCI устройства [uuid:%s] недоступна для виртуальной машины [uuid:%s].", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10023": "не удалось получить доступную спецификацию PCI устройства для VM[uuid:%s]: %s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10020": "экземпляр vm [uuid:%s, state:%s] должен быть выключен для удаления спецификации mdev устройства [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10027": "том[uuid:%s, installPath:%s] не находится в директории %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10026": "хост[uuid:%s] может монтировать хранилище, отличающееся от Политики управления хранилищем[uuid:%s], пожалуйста, проверьте это.", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10024": "хосты[uuid:%s] имеют одинаковый путь монтирования, но фактически смонтированы в разные хранилища.", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10028": "Спецификация устройства mdev [uuid:%s] недоступна для виртуальной машины [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10029": "UUID спецификации PCI-устройства отсутствует в теге[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10026": "Нет доступной спецификации устройства mdev для виртуальной машины[uuid:%s]", + "ORG_ZSTACK_LICENSE_10050": "Лицензия гибридной платформы уже используется. Пожалуйста, удалите лицензию гибридной платформы и лицензию гибридных дополнений одновременно, используя DeleteLicenseAction с UUID гибридной лицензии[uuid=%s].", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10011": "vm[uuid:%s] не имеет спецификации PCI-устройства[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10012": "Экземпляр VM [UUID: %s, состояние: %s] должен быть выключен для удаления спецификации PCI-устройства [UUID: %s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10019": "vm[uuid:%s] не имеет спецификации устройства mdev[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10017": "vm[uuid:%s] уже имеет спецификацию устройства mdev [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10018": "Экземпляр VM [uuid:%s, состояние:%s] требует остановки для установки спецификации устройства mdev", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10015": "Экземпляр VM [uuid:%s, состояние:%s] требует остановки для установки спецификаций PCI-устройств", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10009": "Не удается найти группу близости [uuid:%s], она могла быть удалена или завершена", + "ORG_ZSTACK_COMPUTE_VM_10309": "IP[%s] недоступен в сети VPC[uuid:%s] по причине: %s", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10006": "На этом хосте [uuid: %s] есть другие виртуальные машины, принадлежащие той же группе близости [%s].", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10005": "VM [uuid: %s] уже назначена группе близости [uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10307": "Ошибка формата статического IP-адреса[%s]", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10008": "vm [uuid:%s] не соответствует группе близости [uuid:%s]", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10007": "affinityGroup [uuid:%s] не удалось зарезервировать хост [uuid:%s] для virtualMachine [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10003": "Можно указать только один из UUID: кластера, хоста или VM одновременно.", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10008": "vm[uuid:%s] уже имеет спецификацию PCI-устройства[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10006": "VM должна быть приостановлена для установки спецификации PCI-устройства: uuid=%s, состояние=%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10007": "Неверный тип PCI-устройства: %s, допустимые типы для облачных виртуализованных сред: %s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10004": "Включенный вычислительный ресурс не найден", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10001": "Невозможно удалить системный тег[%s]. Плагин балансировщика нагрузки зависит от него; вы можете только обновить его.", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10002": "AffinityGroup [uuid: %s] не существует", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10002": "NIC с UUID %s не найден. Пожалуйста, исправьте ваш сетевой тег %s балансировщика нагрузки.", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10001": "VM [uuid: %s] уже связана с группой близости [uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10303": "обновление приоритета vm[%s] до [%s] не удалось из-за %s", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10004": "Невозможно оперировать с группой близости [uuid: %s], которая не включена в облачной среде", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10000": "не удается найти балансировщик нагрузки[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10302": "VM[uuid:%s] может иметь только %s CD-ROM устройств", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10003": "Невозможно выполнить операцию с группой близости, созданной системой. Пожалуйста, обратитесь в службу поддержки за помощью.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10005": "недопустимый алгоритм балансировки[%s], допустимые алгоритмы: %s", + "ORG_ZSTACK_COMPUTE_VM_10301": "ВМ[uuid:%s] уже имеет присоединённый ISO[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10006": "недопустимый порог нездорового состояния[%s], значение должно быть числом", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10003": "недопустимый вес балансировщика нагрузки[%s], идентификатор экземпляра не в диапазоне [%d, %d]", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10000": "ВМ может изменить свою группу близости только в состояниях [%s,%s], но в данный момент ВМ находится в состоянии [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10004": "недопустимый вес балансировщика[%s], значение не является числом", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10009": "недопустимый тайм-аут простоя соединения[%s], пожалуйста, убедитесь, что %s является числовым значением", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10007": "недопустимый порог работоспособности[%s], пожалуйста, введите числовое значение", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10008": "недопустимый тайм-аут работоспособности[%s], пожалуйста, убедитесь, что %s является числовым значением", + "ORG_ZSTACK_TICKET_IAM2_10002": "операция отклонена, поскольку коллекция потоков [uuid:%s] не принадлежит проекту [uuid:%s]", + "ORG_ZSTACK_TICKET_IAM2_10003": "виртуальный идентификатор экземпляра [uuid:%s] не авторизован для управления заявкой [uuid:%s, name:%s]", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10004": "темы Kafka не могут быть пустыми. Пожалуйста, убедитесь, что имя темы настроено правильно.", + "ORG_ZSTACK_TICKET_IAM2_10000": "операция отклонена в связи с удалением отправителя заявки [uuid:%s]; в настоящее время допускается только удаление заявки [uuid:%s, name:%s]", + "ORG_ZSTACK_TICKET_IAM2_10001": "операция отклонена, поскольку проект [UUID:%s], связанный с заявкой, был удалён. Заявка [UUID:%s, name:%s] может быть только удалена.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10001": "режим Syslog не может быть пустым", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10000": "индекс для облачного экземпляра не может быть пустым. Пожалуйста, укажите допустимое значение индекса.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10003": "формат меток Loki должен быть key=value", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10002": "метки Loki не могут быть пустыми. Пожалуйста, убедитесь, что все значения меток правильно определены.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10018": "адрес VTEP vxLAN для хоста [UUID: %s] и пула сетей [UUID: %s] уже существует", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10017": "%s не является допустимым IPv4-адресом", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10016": "ip[%s] l2NetworkUuid[%s] clusterUuid[%s] IP-адрес существует в локальной таблице VTEP", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10021": "невозможно создать диапазон VNI, поскольку L2 UUID[%s] не входит в пул сети VXLAN", + "ORG_ZSTACK_ALIYUN_CORE_IDENTITYZONE_10000": "необходимо указать zoneId для частных сетей Aliyun VPC", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10012": "недопустимый идентификатор экземпляра[%s], %s не является допустимым идентификатором экземпляра", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10010": "недопустимый интервал проверки работоспособности[%s], значение должно быть числом", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10011": "недопустимое значение максимального количества соединений[%s], пожалуйста, убедитесь, что %s является числовым значением", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10016": "недопустимая цель проверки работоспособности[%s], порт[%s] должен быть числовым значением", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10017": "не удалось присоединить VIP к балансировщику нагрузки, поскольку VIP[%s] не имеет связанного IP-адреса", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10014": "недопустимая цель проверки работоспособности[%s], протокол проверки[%s] недопустим, допустимые протоколы: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10015": "недопустимая цель проверки состояния[%s], порт[%s] не входит в допустимый диапазон [1, 65535]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10018": "не удалось присоединить IPv4 VIP к балансировщику нагрузки, так как балансировщик нагрузки[%s] уже имеет IPv4 VIP[%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10009": "не удалось реализовать пул сетей VXLAN[uuid:%s, type:%s] на KVM-хосте[uuid:%s], потому что %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10019": "не удалось присоединить IPv6 VIP к балансировщику нагрузки, так как балансировщик нагрузки[%s] уже имеет IPv6 VIP[%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10004": "не удалось создать мост[%s] для l2Network[uuid:%s, type:%s, vni:%d] на KVM-хосте[uuid:%s], потому что %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10003": "не удалось найти VTEP на хосте[UUID: %s], пожалуйста, повторно присоедините пул VXLAN[UUID: %s] к кластеру", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10002": "найдено несколько IP-адресов VTEP[%s] для одного хоста[UUID:%s]. Пожалуйста, удалите хост и добавьте его снова", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10008": "не удалось проверить CIDR[%s] для l2VxlanNetworkPool[uuid:%s, name:%s] на KVM-хосте[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10007": "не удалось удалить мост[%s] для l2Network[uuid:%s, type:%s, vni:%s] на KVM-хосте[uuid:%s], из-за %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10006": "не удалось проверить CIDR[%s] для l2VxlanNetwork[uuid:%s, name:%s] на KVM-хосте[uuid:%s], %s", + "ORG_ZSTACK_CRYPTO_CCS_10001": "пользователь[uuid=%s] не существует в облачной среде", + "ORG_ZSTACK_CRYPTO_CCS_10002": "UUID сертификата отсутствует и системный тег UKey не существует. Пожалуйста, убедитесь, что оба параметра настроены правильно", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10020": "невозможно удалить VIP[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10023": "обнаружено несоответствие типа поставщика услуг. Балансировщик нагрузки[uuid:%s] предоставляется поставщиком услуг[type:%s], но делается попытка использовать нового поставщика услуг[type:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10024": "существует listener с тем же портом[%s] и тем же балансировщиком нагрузки[UUID:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10022": "невозможно получить тип поставщика услуг для listener балансировщика нагрузки[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10027": "недопустимый вес балансировщика для сетевого интерфейса: %s, %d не входит в допустимый диапазон [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10028": "невозможно получить кандидата vmnic, так как не указаны UUID балансировщика нагрузки и UUID группы серверов. Пожалуйста, убедитесь, что эти идентификаторы указаны правильно", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10026": "недопустимые параметры проверки состояния[%s], формат должен быть method:URI:status_codes, например, GET:/index.html:http_2xx", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10029": "невозможно получить кандидата сети уровня 3, так как не указаны UUID балансировщика нагрузки и UUID группы серверов", + "ORG_ZSTACK_CRYPTO_CCS_10008": "сертификат[uuid=%s] не найден в хранилище сертификатов", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10030": "невозможно отсоединить VM NIC от listener балансировщика нагрузки[uuid:%s], потому что группа серверов по умолчанию, связанная с listener, была удалена", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10031": "невозможно создать балансировщик нагрузки, так как параметры VIP и IPv6 VIP пусты. Пожалуйста, укажите допустимые IP-адреса", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10034": "VIP балансировщика нагрузки[%s] не должен быть первым или последним IP-адресом в блоке CIDR, связанном с типом пула публичных адресов", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10035": "не удалось создать балансировщик нагрузки, так как параметр vipUuid указывает на VIP[%s], который не является IPv4 интерфейсом виртуальной машины", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10032": "невозможно создать балансировщик нагрузки, так как L3 сеть VIP и IPv6 VIP не являются одной и той же L3 сетью. Пожалуйста, убедитесь, что они находятся в одной L3 сети", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10033": "VIP[UUID:%s] уже занят другой сущностью сетевой службы[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10038": "ошибка операции, дублирующаяся/перекрывающаяся запись IP в %s группы списка контроля доступа:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10039": "ошибка операции, формат IP поддерживает только ip/iprange/cidr, но найдено %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10036": "не удалось создать балансировщик нагрузки, так как параметр ipv6VipUuid указывает на VIP[%s], который не является IPv6 VIP", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10037": "сбой операции, версия IP %d не поддерживается", + "ORG_ZSTACK_VPC_HA_10001": "Не удалось обновить эту сетевую службу, так как VPC [UUID:%s] не поддерживает обновления версии сетевой службы.", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10025": "L2Network[uuid:%s] не относится к типу L2VxlanNetwork", + "ORG_ZSTACK_VPC_HA_10002": "Не удалось обновить эту сетевую службу, так как VPC [UUID:%s] использует устаревшую версию ядра:[%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10024": "vlan[%s] не является допустимым VNI", + "ORG_ZSTACK_VPC_HA_10003": "Невозможно применить преобразование исходных сетевых адресов с нестандартной общедоступной сетью, так как функция multi-SNAT отключена.", + "ORG_ZSTACK_VPC_HA_10004": "Невозможно применить SNAT с этой L3 Network, так как L3 network [uuid:%s] является частной сетью.", + "ORG_ZSTACK_VPC_HA_10005": "Невозможно применить SNAT с этой L3 Network, так как L3 network [uuid:%s] не подключена к маршрутизатору VPC", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10029": "неверный формат CIDR в системном теге [%s]", + "ORG_ZSTACK_VPC_HA_10006": "недопустимый IP-адрес облачного монитора [%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10028": "неверный системный тег [%s], должен быть одним из следующих: [EC2, GCE, AWS_VPC]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10027": "Пожалуйста, введите один системный тег, например: [%s]", + "ORG_ZSTACK_VPC_HA_10008": "vpcHaRouter [uuid:%s] был удалён", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10042": "Невозможно применить группу безопасности [%s] с другой версией IP к балансировщику нагрузки [%s].", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10031": "Пул сетей vXLAN не поддерживает создание L3 сетей.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10040": "диапазон IP [%s, %s] перекрывается с начальным IP: %s и конечным IP: %s группы списка контроля доступа: %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10030": "перекрытие диапазона VNI с %s [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10045": "перенаправление групп списка контроля доступа[uuid:%s] может быть связано только с прослушивателем балансировщика нагрузки и должно быть назначено группе серверов.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10046": "присоединение групп списка контроля доступа[uuid:%s] к прослушивателю балансировщика нагрузки[uuid:%s] должно быть либо HTTPS, либо HTTP", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10043": "домен[%s], url[%s] дублирующее/перекрывающееся правило перенаправления с группой списка контроля доступа:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10044": "группы списка контроля доступа[uuid:%s] настроены на перенаправление, но некоторые записи списка контроля доступа не имеют правила перенаправления и содержат IP-записи.", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10049": "группа списка контроля доступа[uuid:%s] уже присоединена к другому прослушивателю балансировщика нагрузки[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10048": "группа списка контроля доступа[uuid:%s] не содержит правила перенаправления", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10001": "У учетной записи нет назначенных VIP-адресов.", + "ORG_ZSTACK_COMPUTE_VM_10239": "CreateVmInstanceMsg не может быть пустым. Пожалуйста, убедитесь, что запрос инициализирован правильно перед отправкой.", + "ORG_ZSTACK_COMPUTE_VM_10237": "zoneUuid должен быть указан, так как образ расположен на нескольких хранилищах резервных копий.", + "ORG_ZSTACK_COMPUTE_VM_10236": "L2 сети не найдены в кластерах, которые подключены к основным хранилищам[uuids:%s]", + "ORG_ZSTACK_COMPUTE_VM_10235": "Основные хранилища с UUID:%s не имеют подключенных кластеров в зоне с UUID:%s.", + "ORG_ZSTACK_COMPUTE_VM_10234": "не найдено доступное основное хранилище для хранилища резервных копий[uuid:%s, type:%s]", + "ORG_ZSTACK_COMPUTE_VM_10233": "Образ с UUID [uuid:%s] не хранится ни на одном хранилище резервных копий, которое подключено к зоне с UUID [uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_10232": "Сертификат Spice TLS не существует. Пожалуйста, проверьте, включен ли Spice TLS.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10002": "невозможно создать экземпляр виртуального маршрутизатора, поскольку сеть виртуального маршрутизатора перекрывается с частной сетью в конфигурации IP.%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10001": "не удалось удалить Virtual Router Bootstrap ISO[%s] на KVM хосте[uuid:%s] для виртуального маршрутизатора[uuid:%s], потому что %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10000": "не удалось создать Virtual Router Bootstrap ISO[%s] на KVM хосте[uuid:%s, ip:%s] для виртуального маршрутизатора[uuid:%s], потому что %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10005": "сеть экземпляра виртуального маршрутизатора с UUID:%s не может быть такой же, как частная сеть L3 UUID:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10004": "Предложение экземпляра виртуального маршрутизатора с UUID:%s не найдено", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10009": "невозможно добавить IP-диапазон, так как сеть L3 [UUID:%s] является управляющей сетью виртуального маршрутизатора", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10008": "невозможно добавить IP-диапазон, так как сеть L3 [UUID:%s] является управляющей сетью предложения виртуального маршрутизатора", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10007": "Не удалось запустить L3 виртуального маршрутизатора [UUID: %s]", + "ORG_ZSTACK_COMPUTE_VM_10242": "ошибка обработки пары ключей SSH при создании ВМ, потому что [%s]", + "ORG_ZSTACK_COMPUTE_VM_10241": "ошибка обработки системного тега при создании ВМ, потому что [%s]", + "ORG_ZSTACK_COMPUTE_VM_10240": "не удалось создать системный тег для виртуальной машины, потому что %s", + "ORG_ZSTACK_COMPUTE_VM_10249": "cpuCores должно быть допустимым целочисленным значением", + "ORG_ZSTACK_COMPUTE_VM_10248": "cpuSockets должно быть положительным целым числом, представляющим количество сокетов ЦП.", + "ORG_ZSTACK_COMPUTE_VM_10247": "недопустимое загрузочное устройство[%s] в списке порядка загрузки[%s]", + "ORG_ZSTACK_COMPUTE_VM_10246": "обнаружен конфликт имени хоста в системных тегах; другая ВМ с UUID %s уже имеет имя хоста %s в сети L3 UUID %s", + "ORG_ZSTACK_COMPUTE_VM_10245": "разрешен только один системный тег имени хоста, но получено %s", + "ORG_ZSTACK_COMPUTE_VM_10244": "имя хоста[%s], указанное в системном теге, не является допустимым доменным именем", + "ORG_ZSTACK_COMPUTE_VM_10243": "Не удалось включить эту функцию. Виртуальная машина [uuid: %s] имеет несколько сетевых карт (NIC), связанных с сетью L3 [uuid: %s].", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10013": "не удалось обновить сеть по умолчанию для виртуального маршрутизатора [uuid:%s], потому что %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10012": "не удалось присоединить сетевые сервисы виртуального маршрутизатора к l3Network[uuid:%s]. Выбор переадресации портов требует конфигурации_snat.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10011": "не удалось присоединить сетевые сервисы виртуального маршрутизатора к l3Network[uuid:%s]. При выборе Elastic IP (EIP) также должна быть настроена Source Network Address Translation (SNAT).", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10010": "невозможно добавить образ, потому что системный тег [%s] содержит недопустимый тип образа устройства [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10017": "виртуальный маршрутизатор [name:%s, uuid:%s, текущее состояние:%s] не работает и не может выполнить требуемую операцию. Повторите попытку, когда он запустится.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10015": "не удалось синхронизировать VIP [ips: %s] на виртуальном маршрутизаторе [uuid:%s] для горячей миграции виртуального маршрутизатора, потому что %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10014": "недопустимый VirtualMachineType %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10000": "невозможно изменить владельца ресурса, потому что экземпляр виртуальной машины [uuid:%s] уже связан с группой безопасности", + "ORG_ZSTACK_TEST_COMPUTE_HOSTALLOCATOR_10000": "Намеренно: Это действие соответствует архитектуре наших облачных вычислений. Пожалуйста, убедитесь, что все конфигурации виртуальных машин соответствуют нашим стандартам безопасности и производительности.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10019": "виртуальный маршрутизатор[uuid:%s] не имеет управляющего NIC, способного выполнить HTTP-вызов к %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10018": "виртуальный маршрутизатор [uuid: %s] находится в состоянии %s, при котором невозможно выполнить HTTP-вызовы к %s", + "ORG_ZSTACK_COMPUTE_VM_10253": "разрешен только один системный тег bootMode, но найдено %d тегов", + "ORG_ZSTACK_COMPUTE_VM_10252": "Виртуальная машина должна иметь не более одного системного тега пользовательских данных", + "ORG_ZSTACK_COMPUTE_VM_10251": "Уже существует один пользовательский системный тег для VM[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10250": "cpuThreads должно быть целочисленным значением", + "ORG_ZSTACK_COMPUTE_VM_10259": "недопустимое перенаправление USB[%s], %s не является допустимым тегом USBRedirect", + "ORG_ZSTACK_COMPUTE_VM_10258": "недопустимый параметр[%s], значение [%s] не является логическим типом", + "ORG_ZSTACK_COMPUTE_VM_10257": "недопустимый тег формата[%s]", + "ORG_ZSTACK_COMPUTE_VM_10256": "тип VM требует [q35, pcie, virtual], но получено [%s]", + "ORG_ZSTACK_COMPUTE_VM_10254": "[%s], указанный в системном теге [%s], не является допустимым режимом загрузки для подготовки облачного экземпляра", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10020": "невозможно добавить сетевой интерфейс [ip:%s, ip6:%s, mac:%s] к виртуальному маршрутизатору для виртуальной машины [uuid:%s ip:%s], потому что %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10024": "невозможно установить сеть по умолчанию, так как L3 UUID[:%s] ссылается на управленческую сеть", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10023": "l3 UUID [%s] не связан с виртуальным маршрутизатором [UUID:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10022": "l3 uuid[:%s] совпадает с сетью по умолчанию виртуального маршрутизатора [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10021": "невозможно добавить IP-адрес сервера в группу серверов балансировщика нагрузки, так как общий балансировщик нагрузки не имеет поставщика услуг. Сначала убедитесь, что добавлен виртуальный сетевой интерфейс (VMNIC).", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10010": "Не удалось создать VIP, так как не удалось определить версию виртуальной сети. Проверьте настройки конфигурации сети.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10012": "поставщик услуг для VIP[UUID:%s, name:%s, IP:%s] установлен в %s", + "ORG_ZSTACK_TICKET_EXECUTOR_10001": "не удалось получить значение из события: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10025": "невозможно установить сеть по умолчанию, так как l3 UUID[:%s] не является публичной сетью", + "ORG_ZSTACK_TICKET_EXECUTOR_10000": "Класс API [name:%s] не найден в указанном пространстве имен. Убедитесь, что имя класса и пространство имен указаны правильно.", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10016": "невозможно установить группу безопасности для VM NIC, так как VM NIC [uuid:%s] не привязан ни к одной группе безопасности", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10015": "невозможно установить группу безопасности для VM NIC, так как VM NIC [UUID:%s] не найден", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10007": "requiredIp[%s] не является допустимым IPv4-адресом", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10018": "невозможно установить группу безопасности для VM NIC из-за недопустимого приоритета; приоритет[%d] должен быть больше или равен 1", + "ORG_ZSTACK_COMPUTE_10003": "исходящая пропускная способность[%d] сетевого интерфейса виртуальной машины выходит за пределы допустимого диапазона [8192, 32212254720]", + "ORG_ZSTACK_COMPUTE_VM_10264": "vm[uuid:%s, name:%s] был завершен", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10017": "невозможно установить группу безопасности для VM NIC, так как группа безопасности[uuid:%s] не найдена", + "ORG_ZSTACK_COMPUTE_10004": "входящая пропускная способность VM NIC превышает допустимый диапазон [8192, 32212254720]", + "ORG_ZSTACK_COMPUTE_VM_10263": "Ресурс[uuid:%s] является корневым томом, и вы не можете напрямую изменить его владельца. Вместо этого измените владельца виртуальной машины, которой принадлежит корневой том.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10009": "требуемый IP-адрес [%s] уже выделен", + "ORG_ZSTACK_COMPUTE_10001": "VM NIC l3NetworkUuid не может быть null", + "ORG_ZSTACK_COMPUTE_VM_10262": "rootDiskOfferingUuid не может быть null при создании ВМ без образа.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10008": "VIP[%s] уже связан с L3 сетью[UUID:%s].", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10019": "не удалось установить группу безопасности для VM NIC из-за дублирующего приоритета; обе группы безопасности %s и %s имеют приоритет %d", + "ORG_ZSTACK_COMPUTE_10002": "l3NetworkUuid VM NIC не находится в l3[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10003": "невозможно удалить ip, так как ip[uuid:%s] является виртуальным IP", + "ORG_ZSTACK_COMPUTE_VM_10260": "неверный usbRedirect[%s], %s не является булевым типом", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10002": "Статус VIP недоступен для этой учетной записи. Пожалуйста, проверьте разрешения вашей учетной записи и попробуйте снова.", + "ORG_ZSTACK_COMPUTE_10000": "Обнаружены дублирующиеся параметры сетевого интерфейса. Пожалуйста, убедитесь, что каждый сетевой интерфейс имеет уникальные параметры.", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10005": "неподдерживаемая стратегия выделения IP[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10004": "Системный VIP не может быть удален через API. Пожалуйста, обратитесь в службу поддержки за помощью.", + "ORG_ZSTACK_COMPUTE_VM_10269": "ВМ[UUID:%s] не имеет NIC, подключенного к L3 сети[UUID:%s]", + "ORG_ZSTACK_COMPUTE_10007": "сетевой драйвер ВМ %s пока не поддерживается", + "ORG_ZSTACK_COMPUTE_VM_10268": "получено нераспознанное состояние ВМ[uuid:%s] на хосте[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10267": "не удалось проверить состояние ВМ [uuid:%s] на хосте [uuid:%s], %s", + "ORG_ZSTACK_COMPUTE_10005": "количество очередей [%d] сетевого интерфейса ВМ выходит за пределы допустимого диапазона [1, 256]", + "ORG_ZSTACK_COMPUTE_10006": "vm nic l3[uuid:%s] состояние[%s] не соответствует ожидаемому состоянию или %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10031": "невозможно создать предложение виртуального роутера, так как управляющая сеть еще не поддерживает IPv6", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10030": "управляющая сеть [uuid:%s] не находится в той же зоне доступности [uuid:%s], в которой предполагается создать это предложение.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10035": "L3 сеть [UUID: %s] имеет включенный SNAT сервис; поэтому она не может использоваться в качестве управляющей сети.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10034": "образ[uuid:%s] имеет неподдерживаемый формат %s, не может использоваться для конфигурации виртуального роутера", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10033": "тип медиа образа[uuid:%s] %s, что не соответствует требованиям к образу виртуального роутера, тип медиа должен быть %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10032": "публичная сеть с UUID %s не находится в той же зоне доступности, в которой предполагается создать это предложение.", + "ORG_ZSTACK_STORAGE_VOLUME_10087": "Образ с UUID [uuid:%s] и именем [name:%s] был удален из всего резервного хранилища.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10039": "управляющая сеть [UUID:%s, шлюз:%s] недоступна", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10038": "управляющая сеть[uuid:%s] не имеет настроенного диапазона IP", + "ORG_ZSTACK_STORAGE_VOLUME_10086": "тип основного хранилища [%s] пока не поддерживает общие тома", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10037": "L3 сеть с UUID [uuid: %s] имеет тот же сетевой адрес, что и [uuid: %s], и не может использоваться для виртуального роутера.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10036": "L3 сеть [UUID: %s] имеет включенные SNAT сервисы и не может использоваться в качестве публичной сети.", + "ORG_ZSTACK_STORAGE_VOLUME_10088": "невозможно найти резервное хранилище, удовлетворяющее следующим условиям для образа[uuid:%s]: 1. состояние Enabled 2. статус Connected 3. прикреплено к зоне, где находится основное хранилище[uuid:%s].", + "ORG_ZSTACK_STORAGE_VOLUME_10083": "дублирующиеся UUID томов: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10082": "Невозможно отменить к непоследнему снимку", + "ORG_ZSTACK_STORAGE_VOLUME_10085": "не удалось получить тип основного хранилища", + "ORG_ZSTACK_STORAGE_VOLUME_10092": "Целевой том был удален во время создания тома.%s", + "ORG_ZSTACK_STORAGE_VOLUME_10091": "конфликт UUID основного хранилища, основное хранилище, указанное в дисковой опции, это %s, а основное хранилище, указанное в параметре создания, это %s", + "ORG_ZSTACK_STORAGE_VOLUME_10093": "не должно быть более одной реализации виртуальной машины %s.", + "ORG_ZSTACK_STORAGE_VOLUME_10096": "невозможно загрузить ISO в основное хранилище, потому что: %s", + "ORG_ZSTACK_ZDFS_10000": "пинг до zDFS не удался, %s", + "ORG_ZSTACK_COMPUTE_VM_10204": "неверный формат JSON, причина: %s", + "ORG_ZSTACK_COMPUTE_VM_10203": "l3NetworkUuids и vmNicInventories не должны быть одновременно пустыми или установленными одновременно.", + "ORG_ZSTACK_COMPUTE_VM_10200": "том[uuid:%s] не соответствует требованиям [состояние:Включено статус:Готов]", + "ORG_ZSTACK_COMPUTE_VM_10219": "Этот API устарел и больше не поддерживается в облачных вычислениях. Пожалуйста, рассмотрите использование последнего доступного API для ваших операций.", + "ORG_ZSTACK_COMPUTE_VM_10218": "Невозможно обновить пароль консоли для VM[uuid:%s], так как пароль консоли в данный момент не настроен.", + "ORG_ZSTACK_ZDFS_10002": "произошла проблема ZDFS с именем хоста[%s]", + "ORG_ZSTACK_ZDFS_10001": "подключение к zDFS не удалось, %s", + "ORG_ZSTACK_COMPUTE_VM_10217": "Невозможно обновить пароль консоли для VM[uuid:%s], так как она не находится в состоянии 'Запущена'. Текущее состояние: '%s'.", + "ORG_ZSTACK_COMPUTE_VM_10216": "Пароль консоли не должен начинаться с \"password\", чтобы избежать потенциальных уязвимостей безопасности VNC.", + "ORG_ZSTACK_COMPUTE_VM_10215": "Не разрешено монтировать один и тот же файл ISO несколько раз", + "ORG_ZSTACK_COMPUTE_VM_10214": "Виртуальная машина с UUID [uuid=%s] не существует", + "ORG_ZSTACK_COMPUTE_VM_10220": "CdRom[%s] уже является стандартным", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10002": "Имя хоста для вашего облачного экземпляра не может быть null. Пожалуйста, укажите допустимое имя хоста.", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10000": "facilityId не может быть null", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10001": "неверный объект ведения журнала %s", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10006": "syslog сервер[адрес: %s] недоступен", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10007": "syslog сервер[адрес: %s:%s] недоступен", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10004": "Протокол не может быть null. Пожалуйста, убедитесь, что указан допустимый протокол.", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10005": "неподдерживаемый протокол %s в облачной вычислительной среде", + "ORG_ZSTACK_COMPUTE_VM_10228": "Ожидался одноадресный MAC-адрес, найден многоадресный MAC-адрес [%s]", + "ORG_ZSTACK_COMPUTE_VM_10227": "Запрещенный сетевой адрес %s для экземпляра %d", + "ORG_ZSTACK_COMPUTE_VM_10226": "Неверный MAC-адрес [%s]", + "ORG_ZSTACK_COMPUTE_VM_10225": "Это недействительный MAC-адрес [%s]", + "ORG_ZSTACK_COMPUTE_VM_10224": "Топология ЦП неверна. Фактические ядра ЦП: %s, настроенные сокеты: %s, ядра на сокет: %s, потоки на ядро: %s; Рассчитанные сокеты: %s, ядра: %s, потоки: %s", + "ORG_ZSTACK_COMPUTE_VM_10221": "vm[uuid:%s] может выполнять fstrim только в состоянии Running; текущее состояние: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10046": "Том с UUID [%s] не находится в удаленном состоянии. Эта операция предназначена для восстановления ранее удаленного тома данных.", + "ORG_ZSTACK_STORAGE_VOLUME_10049": "image[uuid:%s] не в состоянии Enabled, текущее состояние: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10048": "image[uuid:%s] не соответствует ожидаемому типу, текущий тип: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10042": "volume[uuid:%s] не в состоянии enabled, текущее состояние: %s, создание снимка невозможно", + "ORG_ZSTACK_STORAGE_VOLUME_10045": "volume[uuid:%s] недоступен для создания снимка, текущий статус: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10044": "Невозможно создать снимок памяти, текущее состояние ВМ[%s], но ожидаемые состояния: [%s, %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10041": "volume[uuid:%s, type:%s], невозможно создать снимок", + "ORG_ZSTACK_LOGIN_10022": "Неверный атрибут. Атрибут[%s] обязателен, но найдены записи [%s], которые не соответствуют. Убедитесь, что все атрибуты указаны и сопоставлены правильно.", + "ORG_ZSTACK_LOGIN_10024": "strategy является обязательным полем %", + "ORG_ZSTACK_LOGIN_10023": "Неверный формат JSON для данных облачной конфигурации. Убедитесь, что все поля JSON правильно отформатированы и соответствуют указанной схеме.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10007": "keyLabel %s и encryptedResult %s несовместимы", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10006": "flkSec securityMachine неработоспособен: %s", + "ORG_ZSTACK_LOGIN_10029": "name должно использовать значения в указанном диапазоне параметров %s", + "ORG_ZSTACK_LOGIN_10026": "атрибут обязателен для подготовки облачного ресурса %", + "ORG_ZSTACK_LOGIN_10025": "name является обязательным полем %", + "ORG_ZSTACK_LOGIN_10028": "optional является обязательным полем для конфигурации виртуальной машины%", + "ORG_ZSTACK_LOGIN_10027": "type является обязательным полем %", + "ORG_ZSTACK_STORAGE_VOLUME_10058": "Корневой том [uuid:%s, name:%s] невозможно подключить.", + "ORG_ZSTACK_STORAGE_VOLUME_10057": "ВМ [UUID:%s] не поддерживает оперативное подключение тома [%s], так как тип платформы образа несовместим.", + "ORG_ZSTACK_STORAGE_VOLUME_10059": "том данных [UUID:%s] отключен; подключение не разрешено.", + "ORG_ZSTACK_STORAGE_VOLUME_10054": "том данных [UUID:%s] не подключен ни к одной виртуальной машине и поэтому не может быть отключен.", + "ORG_ZSTACK_STORAGE_VOLUME_10053": "volume[uuid:%s] имеет статус[%s], том данных может быть подключен только когда статус available или attaching", + "ORG_ZSTACK_STORAGE_VOLUME_10056": "volume[uuid:%s, name:%s, type:%s] невозможно отключить", + "ORG_ZSTACK_CORE_PLUGIN_10001": "plugin[%s] имя, ключ продукта и поставщик не могут быть пустыми", + "ORG_ZSTACK_STORAGE_VOLUME_10055": "Для отключения общего тома данных с UUID [%s] требуется UUID виртуальной машины.", + "ORG_ZSTACK_STORAGE_VOLUME_10050": "image[uuid:%s] не в состоянии Ready, текущее состояние: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10052": "volume[uuid:%s] находится в состоянии[%s], том данных может быть подключен только когда его состояние %s", + "ORG_ZSTACK_STORAGE_VOLUME_10051": "корневой том [uuid:%s] невозможно подключить к виртуальной машине", + "ORG_ZSTACK_LOGIN_10011": "Ошибка проверки DNS-записи [%s], возможно, она была удалена", + "ORG_ZSTACK_CORE_PLUGIN_10000": "неизвестное имя плагина для облачного продукта: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10069": "том[uuid:%s, type:%s] не может быть удалён", + "ORG_ZSTACK_STORAGE_VOLUME_10068": "Неожиданные настройки размера диска для виртуальной машины %s. Пожалуйста, убедитесь, что указанный размер диска находится в пределах допустимого диапазона и совместим с конфигурацией вашей облачной среды.", + "ORG_ZSTACK_STORAGE_VOLUME_10065": "Невозможно подключить том к ВМ, нет доступного вычислительного кластера", + "ORG_ZSTACK_STORAGE_VOLUME_10064": "том данных с UUID [%s] имеет формат [%s], который может быть подключён только к гипервизору типа [%s], но ВМ имеет гипервизор типа [%s]. Поэтому подключение невозможно.", + "ORG_ZSTACK_RESOURCECONFIG_10009": "у учётной записи нет доступа к ресурсу[uuid: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10067": "Резервное копирование корневого тома запрещено, uuid:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10066": "Невозможно подключить том к ВМ, работающей на хосте[uuid: %s], который отключён от хранилища тома[uuid: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10061": "том данных [UUID:%s] уже подключён к другой виртуальной машине и не может быть повторно подключён.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_10000": "атрибут[name:%s] является зарезервированным атрибутом, который нельзя обновить в облачных вычислительных средах.", + "ORG_ZSTACK_NETWORK_OVN_10074": "OVN SDN Controller [UUID: %s, Name: %s] находится в отключённом состоянии; невозможно добавить хост [UUID: %s].", + "ORG_ZSTACK_STORAGE_VOLUME_10060": "том с UUID [%s] находится в удалённом состоянии; поэтому операция не может быть выполнена.", + "ORG_ZSTACK_NETWORK_OVN_10073": "не удалось добавить логический коммутатор[uuid:%s, name:%s] к контроллеру OVN[uuid:%s, ip:%s], потому что %s", + "ORG_ZSTACK_STORAGE_VOLUME_10063": "том данных с UUID [%s] формата [%s] не поддерживает подключение ни к одному гипервизору.", + "ORG_ZSTACK_STORAGE_VOLUME_10062": "том данных может быть подключён только если его статус [active, available], текущий статус %s", + "ORG_ZSTACK_NETWORK_OVN_10071": "не удалось синхронизировать логический коммутатор с контроллером OVS[uuid:%s, ip:%s], из-за %s", + "ORG_ZSTACK_LOGIN_10000": "ZStack в данный момент загружает организации LDAP из базы данных; пожалуйста, не выполняйте операции синхронизации в данный момент.", + "ORG_ZSTACK_NETWORK_OVN_10078": "NfvInstance[uuid:%s] не найден", + "ORG_ZSTACK_NETWORK_OVN_10077": "L2 сеть [UUID:%s] не подключена к контроллеру OVN", + "ORG_ZSTACK_NETWORK_OVN_10076": "не удалось удалить порт логического коммутатора из контроллера OVS[uuid:%s, ip:%s], потому что %s", + "ORG_ZSTACK_STORAGE_VOLUME_10070": "том[uuid:%s] уже находится в удалённом состоянии", + "ORG_ZSTACK_LOGIN_10001": "Ошибка синхронизации записи LDAP[], потому что %s", + "ORG_ZSTACK_NETWORK_OVN_10075": "не удалось добавить порты логического коммутатора к контроллеру OVN[uuid:%s, ip:%s], потому что %s", + "ORG_ZSTACK_V2V_10037": "хост[uuid:%s] не подключён", + "ORG_ZSTACK_V2V_10038": "primaryStorage[uuid:%s] не подключён", + "ORG_ZSTACK_V2V_10035": "невозможно выделить %d байт на хосте конвертации[uuid:%s], недостаточно доступной ёмкости", + "ORG_ZSTACK_NETWORK_OVN_10079": "NfvInstanceGroup[uuid:%s] не найден", + "ORG_ZSTACK_LOGIN_10008": "Ошибка проверки UID[%s], возможно из-за удаления или истечения срока действия", + "ORG_ZSTACK_LOGIN_10007": "Невозможно синхронизировать сервер LDAP/AD, область действия которого не %s", + "ORG_ZSTACK_V2V_10031": "Неверный системный тег QoS для V2V миграции Пожалуйста, проверьте системный тег и убедитесь, что он соответствует стандартам облачных вычислений.", + "ORG_ZSTACK_V2V_10032": "некорректная сетевая пропускная способность[%s], она должна быть больше или равна 1048576 байт в секунду", + "ORG_ZSTACK_LOGIN_10009": "Не удалось создать виртуальный ID IAM для UID[%s], потому что %s", + "ORG_ZSTACK_LOGIN_10004": "не удалось синхронизировать LDAP организацию в облачной среде", + "ORG_ZSTACK_BAREMETAL2_10001": "Неверная конфигурация IPMI Chassis: параметр 'reboot' должен быть установлен в 'No', когда предоставлен параметр 'provisionIp'.", + "ORG_ZSTACK_V2V_10030": "произошла VM миграция с хоста с hostUuid %s", + "ORG_ZSTACK_BAREMETAL2_10002": "Неверная конфигурация IPMI Chassis: 'platform' должен быть указан как 'Linux', когда предоставлен 'provisionIp'.", + "ORG_ZSTACK_LOGIN_10006": "Не удалось синхронизировать организации, потому что %s", + "ORG_ZSTACK_LOGIN_10005": "Не удалось преобразовать LDAP запись в организационный узел", + "ORG_ZSTACK_BAREMETAL2_10000": "Неверная конфигурация IPMI Chassis: 'provisionType' должен быть установлен в 'Direct', когда указан 'provisionIp'.", + "ORG_ZSTACK_STORAGE_VOLUME_10079": "невозможно отключить том [%s] от экземпляра. Возможно, он уже был отключен", + "ORG_ZSTACK_STORAGE_VOLUME_10076": "невозможно подключить том[%s] к хосту[%s], так как он в данный момент подключается к хосту[%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10075": "Путь монтирования должен быть абсолютным. Пожалуйста, предоставьте корректный абсолютный путь.", + "ORG_ZSTACK_NETWORK_OVN_10080": "NfvInstanceGroup[uuid:%s] не имеет настроенного виртуального IP", + "ORG_ZSTACK_STORAGE_VOLUME_10078": "невозможно подключить том[%s] к хосту[%s], так как другой том занимает путь монтирования[%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10077": "невозможно подключить том [%s] к хосту [%s], так как он уже смонтирован по пути [%s] на хосте [%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10072": "Запрещено изменять состояние корневого тома, UUID: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10071": "невозможно удалить том [%s], так как он подключен к хосту [%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10074": "невозможно подключить том[%s] к экземпляру[%s], потому что экземпляр[status:%s] не является рабочим", + "ORG_ZSTACK_NETWORK_OVN_10083": "Не удалось обновить узлы кластера OVN для NFV экземпляра [uuid:%s], потому что %s", + "ORG_ZSTACK_STORAGE_VOLUME_10073": "невозможно изменить состояние тома, так как он подключен к хосту %s", + "ORG_ZSTACK_NETWORK_OVN_10082": "Экземпляры не найдены для конфигурации кластера в NfvInstanceGroup[uuid:%s]", + "ORG_ZSTACK_RESOURCECONFIG_10002": "ResourceConfig [category:%s, name:%s] не может быть связан с resourceType: %s", + "ORG_ZSTACK_RESOURCECONFIG_10001": "невозможно найти ресурс[uuid: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10081": "невозможно найти исходный файл в используемом дереве снимков тома[uuid: %s]", + "ORG_ZSTACK_V2V_10028": "невозможно найти тип для исходной VM [url:%s]", + "ORG_ZSTACK_RESOURCECONFIG_10000": "ресурсы имеют несовместимые типы ресурсов. Подробности: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10080": "невозможно сплющить общий том[uuid:%s]", + "ORG_ZSTACK_V2V_10029": "невозможно найти фабрику для исходной VM [url:%s, v2vType:%s]", + "ORG_ZSTACK_RESOURCECONFIG_10007": "глобальная конфигурация [category:%s, name:%s] не может быть привязана к ресурсу", + "ORG_ZSTACK_V2V_10026": "Не удалось найти сеть[uuid:%s] для запуска текущей ВМ, возможно, она была удалена. Рекомендация: Завершите эту ВМ и создайте новую.", + "ORG_ZSTACK_RESOURCECONFIG_10006": "глобальная конфигурация[category:%s, name:%s] не найдена", + "ORG_ZSTACK_V2V_10024": "не время для завершения работы экземпляра", + "ORG_ZSTACK_V2V_10025": "хост конвертации[uuid:%s, hostUuid:%s] не подключен", + "ORG_ZSTACK_V2V_10022": "Выполняются задачи v2v. Невозможно отключить том[%s] от хоста[%s].", + "ORG_ZSTACK_V2V_10020": "основное хранилище[uuid:%s] ни активно, ни подключено", + "ORG_ZSTACK_V2V_10021": "Выполняются задачи миграции V2V. Пожалуйста, убедитесь, что том[%s] не подключен к хосту[%s].", + "ORG_ZSTACK_STORAGE_VOLUME_10007": "iothread требует версию QEMU >= %s, но хост работает на версии %s.", + "ORG_ZSTACK_STORAGE_VOLUME_10009": "том root [%s] не может установить закрепление I/O thread.", + "ORG_ZSTACK_STORAGE_VOLUME_10008": "iothread требует версию libvirt не меньше %s, но хост имеет версию %s.", + "ORG_ZSTACK_STORAGE_VOLUME_10003": "Текущее основное хранилище %s не относится к типу Ceph и поэтому недоступно.", + "ORG_ZSTACK_STORAGE_VOLUME_10005": "текущий тип основного хранилища не поддерживает блочные тома. Поддерживаемые типы включают %s.", + "ORG_ZSTACK_STORAGE_VOLUME_10004": "Путь доступа и IQN для блочного тома типа Ceph не могут быть пустыми. Пожалуйста, убедитесь, что предоставлены оба параметра: accessPathId и accessPathIqn.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10000": "Тест подключения JitClientFactory не пройден", + "ORG_ZSTACK_SSO_CAS_FILTER_10000": "URL недействителен, отсутствует UUID клиента", + "ORG_ZSTACK_SSO_CAS_FILTER_10001": "отсутствует экземпляр CAS клиента, пожалуйста, создайте экземпляр CAS клиента перед интеграцией SSO", + "ORG_ZSTACK_COMPUTE_VM_10275": "ВМ[uuid:%s] не находится в состоянии Running.", + "ORG_ZSTACK_CONSOLE_10011": "Агент консоли не подключен; вероятно, это связано с инициализацией управляющего узла. Пожалуйста, дождитесь подключения агента консоли или вручную переподключите его, если он был отключен в течение длительного времени.", + "ORG_ZSTACK_CONSOLE_10010": "vm[uuid:%s] не находится в состоянии %s, текущее состояние: %s", + "ORG_ZSTACK_COMPUTE_VM_10273": "не удалось создать шаблон из корневого тома[uuid:%s] на основном хранилище[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10270": "Виртуальная машина была удалена. Пожалуйста, проверьте консоль управления экземплярами для получения подробной информации.", + "ORG_ZSTACK_CONSOLE_10013": "консольный прокси[uuid: %s, status: %s] на агенте[ip: %s] не подключен, невозможно удалить его", + "ORG_ZSTACK_CONSOLE_10012": "невозможно найти IP-адрес хоста для ВМ[uuid:%s], работает ли ВМ???", + "ORG_ZSTACK_COMPUTE_VM_10279": "Не удалось обновить ВМ[uuid=%s] на гипервизоре: изменение определенных свойств не удалось", + "ORG_ZSTACK_COMPUTE_VM_10278": "Не удалось обновить vm[uuid=%s] на гипервизоре.", + "ORG_ZSTACK_COMPUTE_VM_10277": "ISO с UUID [uuid:%s] расположено на резервном хранилище, несовместимом с основным хранилищем [uuid:%s], где находится ВМ [name:%s, uuid:%s].", + "ORG_ZSTACK_COMPUTE_VM_10276": "невозможно обновить консольный пароль ВМ[uuid:%s], ВМ не запущена ни на одном хосте", + "ORG_ZSTACK_STORAGE_VOLUME_10018": "Невозможно изменить размер тома [%s], так как он находится в отключенном состоянии", + "ORG_ZSTACK_STORAGE_VOLUME_10017": "том[uuid:%s] не является томом данных", + "ORG_ZSTACK_STORAGE_VOLUME_10019": "Должен быть указан хотя бы один из параметров: vmInstanceUuid или instanceUuid.", + "ORG_ZSTACK_STORAGE_VOLUME_10014": "не поддерживает создание снимков томов[uuid:%s, uuid:%s] на разных ВМ[uuid:%s, uuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10013": "том[uuid:%s] не найден", + "ORG_ZSTACK_STORAGE_VOLUME_10016": "состояние ВМ[uuid: %s] — %s, создание снимка не разрешено", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10013": "компьютер безопасности jit неработоспособен: сбой подключения сокета к %s:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10015": "том[uuid:%s] недоступен", + "ORG_ZSTACK_STORAGE_VOLUME_10010": "текущий ID потока ввода-вывода[%s] не соответствует ID потока ввода-вывода присоединенного тома[%s][%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10012": "проверка снимков не поддерживается для тома[uuid: %s]. Присоединенная ВМ не находится в одном из состояний [%s, %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10011": "проверка снимков не поддерживается для тома[UUID: %s]. Том должен быть присоединен к виртуальной машине", + "ORG_ZSTACK_CONSOLE_10000": "файл закрытого ключа Ansible не найден. Убедитесь, что путь к файлу закрытого ключа указан правильно и файл доступен", + "ORG_ZSTACK_COMPUTE_VM_10285": "не удалось отсоединить том [uuid=%s] от ВМ [uuid=%s]", + "ORG_ZSTACK_COMPUTE_VM_10284": "отсоединение тома не разрешено, когда ВМ находится в состоянии [%s]", + "ORG_ZSTACK_COMPUTE_VM_10283": "ISO[uuid:%s] не присоединен к виртуальной машине[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10282": "не удалось обновить ВМ[uuid=%s] на гипервизоре: изменение определенных свойств не удалось", + "ORG_ZSTACK_CONSOLE_10004": "не удалось повторно подключиться к прокси-консоли виртуальной машины. Проверьте сетевое подключение и убедитесь, что виртуальная машина запущена", + "ORG_ZSTACK_COMPUTE_VM_10281": "не удалось обновить ВМ[uuid=%s] на узле гипервизора", + "ORG_ZSTACK_CONSOLE_10003": "не удалось настроить переопределенный IP прокси-консоли [code:%d] или порт прокси-консоли [code:%d]", + "ORG_ZSTACK_COMPUTE_VM_10280": "невозможно создать виртуальную машину, виртуальная машина с именем [%s] уже существует", + "ORG_ZSTACK_CONSOLE_10002": "другой процесс использует порт: %s", + "ORG_ZSTACK_CONSOLE_10001": "недопустимый ID управляющего узла[%s]", + "ORG_ZSTACK_CONSOLE_10008": "невозможно проверить доступность прокси-консоли из-за %s", + "ORG_ZSTACK_CONSOLE_10007": "установить VNC-соединение: неожиданный URI: %s", + "ORG_ZSTACK_COMPUTE_VM_10288": "одна ВМ не может создать %s CD-ROM; ВМ может присоединить только %s CD-ROM", + "ORG_ZSTACK_CONSOLE_10009": "ошибка операции, причина:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10029": "операция расширения не разрешена, так как хост отключен. Убедитесь, что хост активен, прежде чем выполнять эту операцию", + "ORG_ZSTACK_STORAGE_VOLUME_10028": "минимальный размер приращения для выделения памяти должен быть больше 4 МБ", + "ORG_ZSTACK_STORAGE_VOLUME_10025": "невозможно одновременно установить ограничения пропускной способности чтения/записи и общего ограничения пропускной способности для виртуальной машины. Укажите один тип ограничения", + "ORG_ZSTACK_STORAGE_VOLUME_10024": "невозможно одновременно настроить ограничения IOPS чтения/записи и общего ограничения IOPS для вашего экземпляра. Укажите один тип ограничения IOPS", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10023": "необработанное исключение при получении атрибутов с включенной безопасностью JIT: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10027": "невозможно уменьшить размер тома[uuid:%s] [%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10026": "пропускная способность тома не может быть пустой; укажите допустимое значение пропускной способности тома", + "ORG_ZSTACK_STORAGE_VOLUME_10021": "том[uuid:%s] не является корневым томом", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10022": "Не удалось получить атрибуты JIT security machine, код статуса: %s, детали: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10020": "Не найден том с UUID: %s и UUID экземпляра ВМ: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10023": "Невозможно одновременно настроить устаревший и новый наборы параметров в экземпляре виртуальной машины.", + "ORG_ZSTACK_STORAGE_VOLUME_10022": "SharedVolume не поддерживает установку пропускной способности.", + "ORG_ZSTACK_COMPUTE_VM_10293": "нет метода для определения размера образа для %s, пожалуйста, сообщите об исключении.", + "ORG_ZSTACK_STORAGE_VOLUME_10035": "Поддерживаются только отключенные тома, используйте SetVmBootVolumeMsg.", + "ORG_ZSTACK_ZWATCH_PROMETHEUS_10000": "Хост[uuid:%s] не найден в облачной базе данных", + "ORG_ZSTACK_STORAGE_VOLUME_10038": "гипервизор[%s] ограничивает максимальное количество томов данных для одной ВМ до %s; у данной ВМ [uuid:%s] подключено %s томов данных.", + "ORG_ZSTACK_STORAGE_VOLUME_10032": "не удалось найти кэш образа [Image UUID: %s] для переинициализации тома", + "ORG_ZSTACK_STORAGE_VOLUME_10031": "общий том[uuid: %s] подключен к незавершенным экземплярам ВМ[uuids: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10034": "том[uuid:%s] должен быть подключен к экземпляру.", + "ORG_ZSTACK_STORAGE_VOLUME_10033": "Том [UUID: %s, имя: %s] все еще используется и не может быть удален. Убедитесь, что том удален перед попыткой его удаления.", + "ORG_ZSTACK_STORAGE_VOLUME_10030": "Операция расширения не разрешена из-за отключенного состояния хоста", + "ORG_ZSTACK_LOGIN_10033": "В настоящее время в вашей среде не настроен LDAP/AD сервер. Пожалуйста, сначала настройте LDAP/AD сервер.", + "ORG_ZSTACK_LOGIN_10032": "Не удалось привязать данный LDAP UID %s к виртуальному идентификатору пользователя [uuid:%s]", + "ORG_ZSTACK_LOGIN_10034": "Данный UID уже используется. Пожалуйста, выберите другой.", + "ORG_ZSTACK_LOGIN_10030": "Неверный атрибут. Атрибут[%s] обязателен, но найдены записи, не соответствующие конфигурации виртуальной машины. Убедитесь, что все атрибуты указаны правильно и все ресурсы виртуальной машины настроены корректно.", + "ORG_ZSTACK_STORAGE_CDP_10091": "Неверная максимальная емкость[%d], текущее использование: %d", + "ORG_ZSTACK_STORAGE_CDP_10089": "имя хоста не найдено для хранилища резервных копий[uuid: %s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10009": "криптографическая функция включена, но пул ресурсов[%s] для автоматического входа не настроен.", + "ORG_ZSTACK_SSO_SAML2_10001": "Метаданные Identity Provider содержат недопустимые Base64 (декодированное содержимое пусто).", + "ORG_ZSTACK_SSO_SAML2_10002": "Не удалось декодировать метаданные Identity Provider из кодировки Base64", + "ORG_ZSTACK_SSO_SAML2_10000": "Метаданные IdP не настроены. Пожалуйста, предоставьте корректные метаданные.", + "ORG_ZSTACK_ZSV_10002": "Отключите общий том или LUN устройство перед операцией с группой снимков.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10000": "нет клиента для security instance[model=%s]", + "ORG_ZSTACK_ZSV_10001": "том %s все еще имеет группы снимков, невозможно удалить его", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10001": "нет фабрики клиентов security machine для security machine[type=%s]", + "ORG_ZSTACK_ZSV_10000": "том %s все еще имеет группу снимков, связанную с ВМ %s; поэтому он не может быть подключен к другой ВМ", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10002": "SecurityMachineManagerImpl: SecurityMachineEncrypt не выполнен для экземпляра %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_HTTP_10001": "Ошибка сохранения HTTP-шаблона, проверьте содержимое шаблона: %s", + "ORG_ZSTACK_STORAGE_CDP_10097": "Задача создания ВМ была отменена. Проверьте параметры и попробуйте снова.", + "ORG_ZSTACK_STORAGE_CDP_10095": "Отмена операции отката: Операция отката изменений была отменена. Убедитесь, что все зависимые задачи завершены, прежде чем пытаться выполнить откат снова.", + "ORG_ZSTACK_ACCESSKEY_10002": "[Account ID: %s, User ID: %s] не является допустимой учетной записью или проектом/пользователем IAM2", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10019": "не удалось установить соединение с шасси [uuid:%s], проверьте конфигурацию IPMI.", + "ORG_ZSTACK_ACCESSKEY_10001": "Если требуется указанный Access Key, необходимо одновременно предоставить как AccessKeyID, так и AccessKeySecret.", + "ORG_ZSTACK_ACCESSKEY_10004": "количество accessKey для [account ID: %s, user ID: %s] превышает максимальный предел", + "ORG_ZSTACK_ACCESSKEY_10000": "нет разрешения на выполнение операции для [accountUuid:%s, userUuid:%s]", + "ORG_ZSTACK_TEST_10008": "Я не должен быть в списке ошибок", + "ORG_ZSTACK_TEST_10009": "Я также не должен быть в списке ошибок.", + "ORG_ZSTACK_TEST_10006": "Облачное развертывание завершено, как и планировалось.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10020": "не удалось загрузить информацию о шасси из файла, причина: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10029": "Выполняется другая задача защищенного соединения. Отмените новую задачу и дождитесь ее завершения.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10026": "securityMachine отключен. Не удалось обнаружить heartbeat. Убедитесь, что securityMachine включен и правильно настроен.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10027": "%s определение heartbeat экземпляра не удалось", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10028": "%s обнаружение heartbeat исключение", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10021": "расшифровать данные[%s] или тип алгоритма шифрования[%s] равно null", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10022": "недействительный тип алгоритма дешифрования: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10024": "Функция шифрования не может быть отключена, так как в пуле ресурсов есть хотя бы одна синхронизированная защищенная виртуальная машина, предоставляющая службу. Убедитесь, что количество синхронизированных защищенных виртуальных машин сокращено до нуля, прежде чем отключать функцию шифрования.", + "ORG_ZSTACK_TEST_10004": "Я также не должен быть в списке ошибок из-за %d", + "ORG_ZSTACK_TEST_10005": "намеренно %d", + "ORG_ZSTACK_SNS_SYSTEM_10002": "API ресурс не может быть удален", + "ORG_ZSTACK_TEST_10003": "Я не должен быть в списке ошибок %d", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10019": "неизвестный тип шифрования[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10014": "не удается найти модель для секретного пула ресурсов [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10015": "текущее состояние[%s] не допускает ручного изменения состояния", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10016": "Невозможно отключить все защищенные ВМ, когда криптографические функции включены. Убедитесь, что хотя бы одна защищенная ВМ активна.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10017": "Проверьте, что UUID пула ресурсов настроен для аутентификации.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10010": "функция crypto включена, но пул ресурсов[%s] для защиты данных не настроен.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10013": "проверка модели[%s] типа[%s] доступности клиента и сервера исключение", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10003": "Не удалось установить SSH-соединение. Пожалуйста, проверьте настройки облачного экземпляра и конфигурации сети.", + "ORG_ZSTACK_AI_VM_10006": "не удается найти группу экземпляров модельного сервиса с UUID: %s, не удалось сохранить экземпляр модельного сервиса", + "ORG_ZSTACK_AI_VM_10007": "vm instance, config yaml, или service yaml равны null для контекста развертывания модельного сервиса: %s", + "ORG_ZSTACK_AI_VM_10008": "контекст развертывания или виртуальная машина равны null для экземпляра %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10000": "невозможно реплицировать %s в %s, ошибка: %s", + "ORG_ZSTACK_AI_VM_10009": "не удалось отменить задачу, %s", + "ORG_ZSTACK_SNS_SYSTEM_10000": "Системная тема сигнализации не может быть удалена из-за связанных ресурсов. Пожалуйста, убедитесь, что все зависимые ресурсы были удалены перед повторной попыткой удаления.", + "ORG_ZSTACK_AI_VM_10002": "Не удается найти IP-адрес VM NIC в сети L3 по умолчанию [UUID: %s], который требуется для распределенного модельного сервиса", + "ORG_ZSTACK_SNS_SYSTEM_10001": "только HTTP endpoint может подписываться на тему API; предоставленный endpoint[type:%s] не является допустимым HTTP endpoint", + "ORG_ZSTACK_AI_VM_10003": "ModelServiceSession не может быть null. Пожалуйста, убедитесь, что установлена допустимая сессия для облачных модельных сервисов.", + "ORG_ZSTACK_AI_VM_10004": "невозможно разобрать YAML конфигурацию для модельного сервиса, определение сервиса: %s", + "ORG_ZSTACK_AI_VM_10000": "невозможно найти образ [uuid: %s]", + "ORG_ZSTACK_AI_VM_10001": "невозможно получить UUID образа из YAML: %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10015": "Сеть[%s] была добавлена в группу HA[%s].", + "ORG_ZSTACK_ROUTEPROTOCOL_10014": "Сеть[%s] была добавлена в область виртуального роутера[%s].", + "ORG_ZSTACK_ROUTEPROTOCOL_10017": "Идентификатор роутера[%s] не является уникальным в рамках данной облачной системы", + "ORG_ZSTACK_ROUTEPROTOCOL_10016": "Идентификатор роутера[%s] не соответствует формату IPv4", + "ORG_ZSTACK_AI_VM_10011": "Невозможно получить статус экземпляра из-за пустого URL экземпляра. Пожалуйста, укажите допустимый URL экземпляра и повторите попытку.", + "ORG_ZSTACK_HYBRID_BACKUP_10000": "%s может быть вызван только административной учетной записью в облачной среде.", + "ORG_ZSTACK_EXTERNALSERVICE_CRONJOB_10001": "Cron демон не запущен. Пожалуйста, убедитесь, что он запущен и настроен правильно.", + "ORG_ZSTACK_ROUTEPROTOCOL_10003": "[%s] не соответствует формату IPv4 адреса", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10030": "check-all-security-machine-token-sync не удался для всех виртуальных машин в облачной среде. Пожалуйста, проверьте ваши токены безопасности и конфигурации машин.", + "ORG_ZSTACK_ROUTEPROTOCOL_10008": "AreaId[%s] уже подготовлен", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10031": "Тест подключения FlkSecClientFactory не удался", + "ORG_ZSTACK_ROUTEPROTOCOL_10009": "KeyID и пароль не должны быть null при типе аутентификации %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10027": "не удалось сгенерировать токен защиты данных для защитной машины %s из-за %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10029": "не удалось получить результаты шифрования для защитного экземпляра %s из-за %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10011": "Длина пароля не должна превышать 8 байт при типе аутентификации %s.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10028": "не удалось сгенерировать HMAC токен для защитной машины %s из-за %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10010": "пароль не должен быть null при типе аутентификации %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10013": "Все сети должны быть связаны с виртуальным маршрутизатором [%s]", + "ORG_ZSTACK_ROUTEPROTOCOL_10012": "AreaId[%s] должен быть допустимым идентификатором зоны", + "ORG_ZSTACK_ALIYUN_IDENTITYZONE_10000": "Идентификационные данные для запрошенного ресурса не найдены. Убедитесь, что вы предоставили действительные ключ доступа и секретный ключ.", + "ORG_ZSTACK_STORAGE_CDP_10005": "BackupStorage[uuid: %s] уже был удален", + "ORG_ZSTACK_STORAGE_CDP_10001": "kvmagent не отвечает %d раз", + "ORG_ZSTACK_STORAGE_CDP_10004": "Виртуальная машина не найдена для задачи Cloud Deployment Pipeline[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10000": "Агент KVM был перезапущен. Проверьте, влияет ли это на ваши виртуальные машины.", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10011": "Аппаратная сеть VXLAN может быть создана только в пределах аппаратного пула VXLAN.", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10010": "ТОЛЬКО аппаратная сеть VXLAN может быть создана в пределах аппаратного пула VXLAN.", + "ORG_ZSTACK_STORAGE_CDP_10016": "libvirt на хосте [UUID: %s] не поддерживает создание задач CDP. Проверьте версию libvirt.", + "ORG_ZSTACK_HYBRID_DATACENTER_10003": "Центр обработки данных [%s] все еще выполняет синхронизацию; пожалуйста, подождите.", + "ORG_ZSTACK_STORAGE_CDP_10017": "qemu на хосте [UUID: %s] не поддерживает создание задач CDP. Проверьте версию qemu.", + "ORG_ZSTACK_HYBRID_DATACENTER_10002": "указана недопустимая область в aliyun, которая содержит: %s", + "ORG_ZSTACK_STORAGE_CDP_10018": "Версия QEMU, работающая на ВМ[uuid:%s], не поддерживает функциональность mirrorBitmap. Убедитесь, что вы используете совместимую версию QEMU.", + "ORG_ZSTACK_STORAGE_CDP_10012": "query-mirror: Хост не найден для ВМ[uuid:%s]", + "ORG_ZSTACK_AI_EVALUATION_10000": "Группа с UUID: %s не найдена в базе данных.", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10002": "не удалось создать мост сети vxlan[%s] для аппаратного устройства[uuid:%s, type:%s, vlan:%s] на хосте KVM[uuid:%s], потому что %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10001": "нет фабрики SDN Controller для типа SDN Controller:%s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10000": "SDN контроллер для пула VXLAN [uuid:%s] не существует", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10006": "невозможно настроить сеть VXLAN для ВМ с UUID [%s] на целевом хосте с UUID [%s]", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10005": "невозможно найти SDN контроллер %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10003": "не удалось проверить мост[%s] для hardwareVxlan[uuid:%s, name:%s] на хосте KVM[uuid:%s], %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10009": "аппаратный пул сетей VXLAN должен настроить физический интерфейс %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10008": "аппаратный пул сетей VXLAN не поддерживает создание сетей L3", + "ORG_ZSTACK_HYBRID_DATACENTER_10001": "regionId [%s] уже был создан с ключом доступа [%s]", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10007": "не удалось проверить физический сетевой интерфейс для HardwareVxlanPool [uuid: %s, name: %s] на хосте KVM [uuid: %s], %s", + "ORG_ZSTACK_HYBRID_DATACENTER_10000": "dcType неподдерживаемый тип [%s]", + "ORG_ZSTACK_STORAGE_CDP_10027": "недопустимая строка времени: %s, должна быть отформатирована в соответствии с форматом ISO offset, например, %s", + "ORG_ZSTACK_STORAGE_CDP_10023": "Виртуальная машина в данный момент выполняет задачу защиты непрерывных данных (CDP). Присоединение тома превысит планируемый размер, необходимый для полных резервных копий. Измените размер задачи CDP и повторите попытку.", + "ORG_ZSTACK_STORAGE_CDP_10024": "ВМ[%s] для тома[%s] в данный момент работает в режиме защиты непрерывных данных (CDP), поэтому изменение размера в данный момент невозможно.", + "ORG_ZSTACK_STORAGE_CDP_10025": "Задача CDP[uuid: %s] столкнулась с аномальным изменением статуса, со старого статуса: %s на новый статус: %s по причине %s.", + "ORG_ZSTACK_STORAGE_CDP_10026": "Задача CDP всё ещё активна", + "ORG_ZSTACK_STORAGE_CDP_10022": "не удалось найти задачу CDP[uuid:%s]", + "ORG_ZSTACK_AI_EVALUATION_10001": "не существует подходящего внутреннего экземпляра группы[uuid: %s, type:%s]", + "ORG_ZSTACK_AI_EVALUATION_10002": "Не удаётся найти Model Service Instance Group VO с предоставленным UUID группы модельных служб. Это указывает на то, что связанная группа служб, выполняющая задачи оценки, не может быть найдена. В результате задачи остаются в промежуточном статусе вместо того, чтобы быть отмеченными как «Завершённые». Задачи будут автоматически обновлены до статуса «Неудавшиеся», а ошибки будут задокументированы.", + "ORG_ZSTACK_LOGINCONTROL_10002": "Неверное выражение правила, не удалось добавить правило контроля доступа: %s", + "ORG_ZSTACK_LOGINCONTROL_10005": "нераспознанный ключ: %s", + "ORG_ZSTACK_LOGINCONTROL_10006": "отсутствует key:value для конфигурации ресурса %s", + "ORG_ZSTACK_PORTAL_APIMEDIATOR_10008": "resourceUuid[%s] не является допустимым UUID. Допустимый UUID (рекомендуется v4) должен быть отформатирован без дефисов и соответствовать регулярному выражению '[0-9a-f]{8}[0-9a-f]{4}[1-5][0-9a-f]{3}[89ab][0-9a-f]{3}[0-9a-f]{12}'. Для получения дополнительной информации см. http://en.wikipedia.org/wiki/Universally_unique_identifier.", + "ORG_ZSTACK_LOGINCONTROL_10007": "Неверный формат настроек конфигурации сложности пароля", + "ORG_ZSTACK_LOGINCONTROL_10008": "Минимальное значение не может быть больше максимального значения", + "ORG_ZSTACK_STORAGE_CDP_10039": "Хранилище резервных копий не найдено[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10034": "Неожиданный тип задачи[uuid: %s, type: %s] в облачной вычислительной среде", + "ORG_ZSTACK_STORAGE_CDP_10035": "Не найдена максимальная ёмкость для задачи Cloud Data Protection[uuid: %s], пожалуйста, обновите её.", + "ORG_ZSTACK_STORAGE_CDP_10036": "Не найдена максимальная задержка для CDPSessionTask[uuid: %s], пожалуйста, обновите её.", + "ORG_ZSTACK_STORAGE_CDP_10037": "ВМ[uuid: %s] уже была завершена", + "ORG_ZSTACK_STORAGE_CDP_10031": "ВМ не выключена, текущее состояние: %s", + "ORG_ZSTACK_STORAGE_CDP_10032": "Общий том[%s] всё ещё используется другими виртуальными машинами.", + "ORG_ZSTACK_STORAGE_CDP_10033": "Задача не найдена[uuid: %s]", + "ORG_ZSTACK_LOGINCONTROL_10012": "Нет доступного пользователя с именем: %s, type: %s в виртуальной среде", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10011": "API-запрос указывает тип шасси IPMI, но полученное сообщение не имеет тип APICreateBareMetal2ChassisHardwareInfoMsg. Пожалуйста, убедитесь, что тип сообщения соответствует указанному типу шасси.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10012": "получена информация о оборудовании для неизвестного baremetal шасси[ipmi_addr:%s, ipmi_port:%d]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10010": "не удалось загрузить информацию о шасси BareMetal2 IPMI из файла по причине: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10015": "не удалось выполнить перезагрузку питания baremetal2 IPMI шасси[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10016": "Не удалось удалённо загрузить экземпляр через IPXE[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10013": "не удалось включить питание baremetal2 IPMI шасси[UUID:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10014": "не удалось выключить питание baremetal2 IPMI шасси[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10049": "ВМ [UUID: %s] уже инициировала задачу CDP; поэтому задание резервного копирования не может быть создано одновременно.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10008": "Экземпляры Windows Local Disk Bare Metal не поддерживают автоматическое создание виртуальных машин.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10009": "нет доступного baremetal2 шлюза в кластере[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10006": "Кластер[uuid:%s] не является средой виртуализации BareMetal2.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10007": "Кластер[uuid:%s] не включен.", + "ORG_ZSTACK_STORAGE_CDP_10045": "отсутствуют обязательные аргументы: %s", + "ORG_ZSTACK_STORAGE_CDP_10046": "Время хранения за день и ежедневная точка восстановления с начала дня не могут быть одинаковыми. Пожалуйста, убедитесь, что они установлены разными значениями.", + "ORG_ZSTACK_STORAGE_CDP_10047": "ожидался один UUID виртуальной машины, но получено %d", + "ORG_ZSTACK_STORAGE_CDP_10048": "ресурс [uuid: %s] не является экземпляром виртуальной машины", + "ORG_ZSTACK_STORAGE_CDP_10041": "Хранилище резервных копий [UUID: %s] не подключено к облачной среде. Пожалуйста, убедитесь, что оно правильно настроено и интегрировано.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10005": "Кластер[uuid:%s] не является конфигурацией baremetal кластера.", + "ORG_ZSTACK_STORAGE_CDP_10042": "Для ВМ [UUID: %s] уже создано задание резервного копирования; поэтому для нее не может быть одновременно включена задача непрерывной защиты данных (CDP).", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10007": "Адрес и порт IPMI уже существуют.", + "ORG_ZSTACK_STORAGE_CDP_10044": "Выделение виртуальных ресурсов должно быть больше, чем выделение физических ресурсов", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10001": "Пожалуйста, выполните следующие условия для подключения к bare-metal серверу: 1. Проверьте, что интерфейс IPMI активен; 2. Убедитесь, что адрес IPMI, порт, имя пользователя и пароль указаны верно; 3. Убедитесь, что IPMI over LAN включен в настройках BIOS.", + "ORG_ZSTACK_STORAGE_CDP_10040": "Хранилище резервных копий[uuid: %s] отключено в облачной среде.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10009": "baremetal шасси с UUID: %s настроено на использование pxeserver с UUID: %s, но DHCP-запрос был фактически обработан pxeserver с UUID: %s.", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10008": "к кластеру[uuid:%s] не привязан доступный baremetal PXE сервер", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10000": "Bare Metal IPMI 2 Chassis %s имеет две существующие записи", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10001": "Адрес IPMI %s недействителен", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10004": "Baremetal шасси с IPMI адресом %s и портом %d уже создано.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10005": "Кластер[uuid:%s] не существует.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10002": "Не удалось установить соединение с baremetal узлом. Пожалуйста, проверьте: 1. Активность IPMI соединения; 2. Корректность IPMI адреса, порта, имени пользователя и пароля; 3. Включение IPMI over LAN в настройках BIOS.", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10003": "BareMetal2 шасси с IPMI адресом %s и портом %d уже создано.", + "ORG_ZSTACK_STORAGE_CDP_10056": "обнаружено несколько корневых дисков: %s", + "ORG_ZSTACK_STORAGE_CDP_10058": "Корневой том для резервной копии ВМ не найден.%s", + "ORG_ZSTACK_STORAGE_CDP_10059": "том %s включен в резервную копию, но отключен от ВМ [UUID: %s]. Пожалуйста, либо подключите его обратно к ВМ, либо удалите из набора резервного копирования.", + "ORG_ZSTACK_STORAGE_CDP_10053": "Задача Cloud Drive Provisioning для ВМ[uuid: %s] не найдена", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10015": "Не удалось удаленно включить питание baremetal шасси[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10054": "Задача CDP для ВМ[uuid: %s] не найдена на Backstore[uuid: %s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10018": "Не удалось удаленно загрузить через PXE экземпляр[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10055": "recoverVm: хост[uuid: %s] не найден для виртуальной машины[uuid: %s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10017": "Не удалось удаленно перезагрузить питание baremetal шасси[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10050": "невозможно запросить основное хранилище [uuid:%s] для функции снимков томов; подробности [%s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10014": "не удалось удалить шасси baremetal %s", + "ORG_ZSTACK_STORAGE_CDP_10051": "recoverVm: UUID хоста не указан, и исходный хост для VM[uuid: %s] не найден.", + "ORG_ZSTACK_SSHKEYPAIR_10009": "Пара SSH-ключей [uuid:%s] не была привязана к виртуальной машине [uuid:%s].", + "ORG_ZSTACK_SSHKEYPAIR_10008": "Пара SSH-ключей [uuid:%s] уже привязана к виртуальной машине [uuid:].", + "ORG_ZSTACK_SSHKEYPAIR_10007": "sshKeyPair[uuid:%s] в данный момент используется.", + "ORG_ZSTACK_STORAGE_CDP_10067": "невозможно найти корневой том из CDP-резервной копии %s:%d", + "ORG_ZSTACK_STORAGE_CDP_10068": "корневой том не найден из CDP-резервной копии %s:%d", + "ORG_ZSTACK_SSHKEYPAIR_10011": "типы ресурсов %s не поддерживаются для привязки пары SSH-ключей; допустимые типы: %s", + "ORG_ZSTACK_SSHKEYPAIR_10010": "vmInstance[uuid:%s] не находится в запущенном состоянии.", + "ORG_ZSTACK_STORAGE_CDP_10063": "Процесс облачного развертывания VM[uuid: %s] не найден", + "ORG_ZSTACK_STORAGE_CDP_10064": "Экземпляр VM не найден для задачи конвейера облачного развертывания[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10065": "Записи томов не найдены из резервной копии виртуальной машины. Пожалуйста, проверьте конфигурацию VM и настройки резервного копирования.", + "ORG_ZSTACK_STORAGE_CDP_10066": "найдено несколько корневых дисков из CDP-резервной копии %s:%d", + "ORG_ZSTACK_V2V_KVM_10003": "отсутствует UUID VM в 'srcVmUrl'", + "ORG_ZSTACK_STORAGE_CDP_10060": "неожиданное несоответствие размера тома[uuid: %s]: ожидается %d байт, получен другой размер", + "ORG_ZSTACK_V2V_KVM_10004": "корневой диск не найден для экземпляра: %s", + "ORG_ZSTACK_STORAGE_CDP_10061": "изменение размера тома[uuid: %s] не удалось: %s", + "ORG_ZSTACK_STORAGE_CDP_10062": "том[uuid: %s] имеет неожиданный путь тома: %s", + "ORG_ZSTACK_V2V_KVM_10007": "не удалось очистить KVM V2V хост конвертации[hostUuid:%s], поскольку %s", + "ORG_ZSTACK_STORAGE_CDP_10078": "невозможно найти CDP-политику для VM[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10075": "Точка восстановления с идентификатором группы %d не найдена", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10018": "недопустимая переменная: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10075": "основное хранилище NFS [uuid:%s, name:%s] не может найти присоединенные кластеры хостов для выполнения операции", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10077": "хост не найден для тома[uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10020": "необходим List для ресурса [%s] на выходе, но получен одиночный объект.", + "ORG_ZSTACK_ZBOX_10007": "zbox[name:%s] не в состоянии Ready, текущий статус %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10025": "Некоторые действия недопустимы в контексте управления облачными ресурсами. Пожалуйста, проверьте параметры и повторите попытку.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10022": "ресурс [%s] необходимо настроить перед выполнением!", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10006": "целевой хост [UUID:%s] не имеет достаточной физической емкости для основного хранилища [UUID:%s], поскольку порог составляет %f, а доступная физическая емкость составляет %d", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10007": "Том с UUID [%s] не находится в состоянии 'Ready'; поэтому он не может быть перенесен.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10008": "Том данных [UUID: %s, name: %s] все еще присоединен к виртуальной машине [UUID: %s]. Пожалуйста, отсоедините его перед инициацией миграции.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10009": "Том с UUID %s является корневым томом ВМ с UUID %s. В настоящее время ВМ находится в состоянии %s. Пожалуйста, остановите ВМ перед инициацией миграции.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10002": "Том с UUID [%s] уже присоединен к хосту с UUID [%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10003": "основное хранилище [UUID:%s] не найдено", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10004": "Основное хранилище [UUID:%s] отключено или холодная миграция во время обслуживания не разрешена.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10005": "Хост назначения с UUID [%s] не принадлежит локальному основному хранилищу с UUID [%s], где расположен том с UUID [%s].", + "ORG_ZSTACK_ZBOX_10001": "zbox[UUID:%s] все еще используется; невозможно извлечь.", + "ORG_ZSTACK_ZBOX_10002": "zbox[UUID:%s] не находится в состоянии Ready и поэтому не может синхронизировать емкость.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10000": "Нет хостов, которые могут предоставить необходимую емкость хранения для всех томов ВМ [UUID:%s].", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10004": "Аккаунт Aliyun [UUID:%s] не существует", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10001": "Том с UUID [%s] не присоединен ни к какому локальному основному хранилищу.", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10005": "неверный номер телефона[%s], убедитесь, что он отформатирован как +86-12345678901", + "ORG_ZSTACK_ZBOX_10005": "zbox[UUID: %s] по-видимому был удален", + "ORG_ZSTACK_ZBOX_10006": "USB-устройство [uuid:%s] присоединено к ВМ [uuid:%s], оно не может быть добавлено в Zbox.", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10000": "Шаблон текста события SMS Aliyun не найден. Пожалуйста, убедитесь, что шаблон был правильно настроен, и попробуйте снова.", + "ORG_ZSTACK_ZBOX_10003": "можно удалить только файл в смонтированном пути [mountPath: %s] на zbox. но был передан [%s].", + "ORG_ZSTACK_ZBOX_10004": "zbox[name:%s] не находится в состоянии Ready, текущее состояние %s", + "ORG_ZSTACK_SSHKEYPAIR_10006": "Пара ключей SSH %s уже загружена.", + "ORG_ZSTACK_SSHKEYPAIR_10005": "ошибка операции, причина: %s", + "ORG_ZSTACK_SSHKEYPAIR_10003": "пара ключей ssh [uuid:%s] не может быть связана с vm [uuid:%s], так как ключ не найден", + "ORG_ZSTACK_SSHKEYPAIR_10002": "не удалось загрузить открытый ключ: %s, err: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10043": "тест подключения InfoSecClientFactory не удался", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10044": "в настоящее время не поддерживается создание %s пулов ресурсов в этой среде", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10041": "не удалось извлечь различаемое имя субъекта из открытого ключа: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10042": "проверка-все-существования-токенов-безопасности-машины не удалась для всех виртуальных машин", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10040": "не удалось разобрать зашифрованный открытый ключ", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10058": "NFS основное хранилище [uuid:%s, name:%s] не может найти доступный хост для создания тома данных [uuid:%s, name:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10054": "vm[uuid:%s] не находится в состоянии Running, Paused или Stopped; текущее состояние %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10055": "основное хранилище с UUID:%s не присоединено ни к одному кластеру", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10050": "Не найден используемый бэкенд-провайдер. Пожалуйста, убедитесь, что настроен корректный облачный провайдер, и попробуйте снова.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10051": "Не найден хост в состоянии Connected, к которому подключено основное хранилище NFS [uuid:%s, name:%s], для возврата тома [uuid:%s] к снимку [uuid:%s, name:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10052": "Не найден хост в подключенном состоянии, к которому подключено основное хранилище NFS [uuid:%s, name:%s], для возврата тома [uuid:%s] к образу [uuid:%s]", + "ORG_ZSTACK_IAM2_10019": "Не удалось разобрать выражение cron. Пожалуйста, убедитесь, что оно отформатировано корректно в соответствии со стандартными спецификациями формата cron.", + "ORG_ZSTACK_IAM2_10018": "проект[UUID: %s, name:%s] находится в состоянии %s, что запрещает операцию[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10038": "не удалось сгенерировать токен защиты данных %s для устройства безопасности %s, потому что %s", + "ORG_ZSTACK_IAM2_10015": "Организация с UUID %s не может быть установлена как дочерняя по отношению к себе или к родительской организации с UUID %s.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10039": "не удалось сгенерировать HMAC-токен %s для устройства безопасности %s, потому что %s", + "ORG_ZSTACK_IAM2_10014": "Текущая организация [uuid:%s] устарела, пожалуйста, активируйте её", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10036": "сбой генерации токена для выделения облачных ресурсов", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10037": "не удалось сгенерировать активированный токен для защищённой машины %s, потому что %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10034": "Импорт секретного ключа не удался. Пожалуйста, убедитесь, что ключ правильно настроен и доступен в вашей облачной среде.", + "ORG_ZSTACK_IAM2_10011": "неверный ID виртуального экземпляра[uuid:%s], либо экземпляр не существует, либо пароль неверен", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10005": "неверный формат типа [%s]", + "ORG_ZSTACK_IAM2_10010": "аккаунт не найден для проекта[uuid:%s, name:%s] пожалуйста, убедитесь, что у вас настроены правильные разрешения и учётные данные для вашей облачной среды.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10035": "соединение с защищённым экземпляром %s не удалось в процессе генерации тестового ключа, потому что %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10006": "поддерживаются только облачные ресурсы, но получен[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10032": "Не удалось экспортировать секретный ключ: %s", + "ORG_ZSTACK_IAM2_10013": "виртуальный ID не принадлежит проекту", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10003": "такой тип действия не поддерживается: %s", + "ORG_ZSTACK_IAM2_10012": "виртуальный ID[name:%s] отключён из-за настроек конфигурации", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10030": "encryptSubjectDN не может быть null", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10031": "не удалось разобрать метаданные конверта для облачного экземпляра %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10002": "такой тип облачного ресурса не поддерживается: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10068": "Основное хранилище NFS [uuid:%s, name:%s] не подключено ни к каким кластерам или нет подключённых хостов в подключённых кластерах.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10009": "неверный тип: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10007": "поддерживаются только Resource или Action, но получен[%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10008": "Значение по умолчанию должно быть в формате JSON, как указано типом [%s], но найдено [%s].", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10029": "cipherText не должен быть null", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10027": "Не удалось найти секретный ключ для доступа к зашифрованным ресурсам. Пожалуйста, убедитесь, что секретный ключ правильно настроен и имеет необходимые разрешения.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10028": "Не удалось разобрать секретный ключ, ошибка: %s", + "ORG_ZSTACK_IAM2_10022": "Текущая виртуальная машина [ID: %s] устарела, пожалуйста, реактивируйте её.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10016": "недопустимая ссылка на динамическую переменную, которая должна быть в формате ${variable:default}", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10024": "Ошибка HMAC-шифрования большого файла, код: %s, детали: %s", + "ORG_ZSTACK_IAM2_10021": "Пользователь[%s] не является зарегистрированным пользователем платформы", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10017": "Указанный глагол должен содержать '::' для обозначения пространства имён и метода!", + "ORG_ZSTACK_IAM2_10024": "Старый пароль не соответствует оригинальному паролю. Невозможно обновить пароль виртуальной машины [uuid:%s].", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10014": "Неверный формат JSON, причина: %s", + "ORG_ZSTACK_IAM2_10023": "только администраторы и сама виртуальная машина могут выполнять обновления", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10015": "невозможно найти набор ресурсов файла свойств заранее!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10012": "недопустимый декодер: %s!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10013": "Корневой элемент в вашем шаблоне CloudFormation не найден, пожалуйста, проверьте определение шаблона!", + "ORG_ZSTACK_IAM2_10020": "Квота[name:%s] учетной записи[uuid:%s] не может быть установлена в %d, так как это превысит квоту организации[uuid:%s].", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10011": "тип: %s, но ожидаемый тип: %s", + "ORG_ZSTACK_PCIDEVICE_10058": "Хост [%s] не смог перейти в режим обслуживания. ВМ [%s] не может быть автоматически мигрирована из-за наличия PCI-устройства.", + "ORG_ZSTACK_PCIDEVICE_10056": "не удалось запустить ВМ[UUID:%s], потому что не все PCI-устройства[UUIDs:%s] существуют", + "ORG_ZSTACK_PCIDEVICE_10059": "PCI-устройство [uuid:%s] не может быть подключено к ВМ [uuid:%s] из-за неверного статуса", + "ORG_ZSTACK_PCIDEVICE_10050": "пожалуйста, отключите все GPU-устройства от ВМ[%s] и попробуйте снова", + "ORG_ZSTACK_PCIDEVICE_10053": "указанные PCI-устройства не расположены вместе: PCI-устройство с UUID [%s] находится на хосте с UUID [%s], тогда как другое PCI-устройство с UUID [%s] находится на другом хосте с UUID [%s]", + "ORG_ZSTACK_PCIDEVICE_10052": "пожалуйста, отключите другие PCI-устройства от ВМ[%s] и попробуйте снова", + "ORG_ZSTACK_PCIDEVICE_10051": "пожалуйста, отключите все GPU-устройства от ВМ[%s] и попробуйте снова", + "ORG_ZSTACK_PCIDEVICE_10068": "невозможно мигрировать корневой том [uuid:%s], так как к нему подключены PCI-устройства", + "ORG_ZSTACK_PCIDEVICE_10066": "невозможно мигрировать ВМ[UUID:%s], так как подключено PCI-устройство", + "ORG_ZSTACK_PCIDEVICE_10061": "не удалось найти достаточное PCI-устройство спецификации [uuid:%s] на целевом хосте [uuid:%s] для виртуальной машины [uuid:%s]", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10003": "Ни один плагин хранилища резервных копий не зарегистрирован с идентификатором: %s", + "ORG_ZSTACK_PCIDEVICE_10065": "экземпляр ВМ[%s] не существует; невозможно привязать к PCI-устройству[%s]", + "ORG_ZSTACK_PCIDEVICE_10064": "Невозможно подключить PCI-устройство [uuid:%s] к ВМ [uuid:%s] из-за проблем с выделением ресурсов хоста.", + "ORG_ZSTACK_PCIDEVICE_10063": "PCI-устройства [%s] не все доступны для использования.", + "ORG_ZSTACK_PCIDEVICE_10062": "что-то не так с группой IOMMU PCI-устройства[uuid:%s]", + "ORG_ZSTACK_IAM2_10008": "virtualID[uuid:%s] не существует в проекте[uuid:%s]", + "ORG_ZSTACK_IAM2_10009": "Проект [name:%s] не существует", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10000": "Драйвер вернул пустой путь установки: %s", + "ORG_ZSTACK_IAM2_10004": "Не удалось загрузить информацию об ID виртуальной машины из файла, так как\\n%s", + "ORG_ZSTACK_IAM2_10003": "В коде обнаружено %d проблем.", + "ORG_ZSTACK_IAM2_10006": "Не удалось создать информацию об ID виртуальной машины из файла.", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10001": "%s: состояние работоспособности: %s", + "ORG_ZSTACK_IAM2_10005": "UUID [%s] уже существует. Пожалуйста, попробуйте другой.", + "ORG_ZSTACK_MEMORY_10000": "Данные для %s на хосте [%s] не найдены", + "ORG_ZSTACK_PCIDEVICE_10036": "Невозможно выполнить SR-IOV виртуализацию PCI-устройств на хосте [UUID:%s], которые подключены к ВМ", + "ORG_ZSTACK_PCIDEVICE_10035": "PCI-устройства на хосте [UUID:%s] уже виртуализированы SRIOV.", + "ORG_ZSTACK_PCIDEVICE_10034": "Не удалось включить SRIOV для устройства, так как IOMMU отключен на хосте [UUID:%s]", + "ORG_ZSTACK_PCIDEVICE_10033": "PCI-устройство [uuid:%s] недоступно", + "ORG_ZSTACK_PCIDEVICE_10039": "PCI-устройство [UUID:%s] не существует или не виртуализировано SRIOV.", + "ORG_ZSTACK_PCIDEVICE_10037": "Только %d виртуальных PCI-устройств может быть сгенерировано доменами %s на хосте [uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10109": "Резервное хранилище [uuid: %s] уже обновлено", + "ORG_ZSTACK_STORAGE_CDP_10104": "Задача [uuid:%s] была завершена", + "ORG_ZSTACK_STORAGE_CDP_10105": "Задача CDP объединяет данные; пожалуйста, не инициируйте операцию получения.", + "ORG_ZSTACK_STORAGE_CDP_10106": "Задача CDP [uuid:%s] превысила использование хранилища: максимум %d ГБ, использовано %d ГБ.", + "ORG_ZSTACK_STORAGE_CDP_10107": "Неожиданное состояние экземпляра ВМ: %s", + "ORG_ZSTACK_STORAGE_CDP_10102": "Задача CDP [uuid: %s] не связана с виртуальной машиной", + "ORG_ZSTACK_PCIDEVICE_10047": "PCI-устройство [uuid:%s] не виртуализировано в управляемые устройства", + "ORG_ZSTACK_PCIDEVICE_10045": "PCI-устройство [uuid:%s] не может быть виртуализировано по спецификации mdev [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_10044": "PCI-устройство [UUID:%s] не может быть виртуализировано в MDEV. Убедитесь, что оно включено и отключено.", + "ORG_ZSTACK_PCIDEVICE_10049": "Хост [UUID:%s], к которому подключено PCI-устройство [UUID:%s], не подключен.", + "ORG_ZSTACK_PCIDEVICE_10048": "PCI-устройства, сгенерированные из [UUID:%s], все еще подключены к экземпляру ВМ", + "ORG_ZSTACK_STORAGE_CDP_10119": "неожиданный тип задачи: %s", + "ORG_ZSTACK_PCIDEVICE_10043": "невозможно отменить назначение PCI-устройства [%s], так как его виртуальные функции используются.\\nПодробности:\\n%s", + "ORG_ZSTACK_PCIDEVICE_10042": "невозможно отменить генерацию PCI-устройства [%s], так как оно не является GPU или сетевым контроллером.", + "ORG_ZSTACK_PCIDEVICE_10041": "Не удалось отменить генерацию виртуальных PCI-устройств на хосте [uuid:%s], так как они все еще подключены к ВМ.", + "ORG_ZSTACK_PCIDEVICE_10040": "не удалось отменить генерацию pci-устройства [uuid:%s], так как хост [uuid:%s] не подключен", + "ORG_ZSTACK_STORAGE_CDP_10117": "Задача CDP [uuid: %s] не найдена", + "ORG_ZSTACK_STORAGE_CDP_10118": "Статус задачи CDP [uuid: %s] изменился аномально, старый статус: %s, новый статус: %s из-за превышения квоты хранилища, текущее: %d, квота: %d.", + "ORG_ZSTACK_STORAGE_CDP_10111": "Версия QEMU-img резервного хранилища [UUID: %s] требует обновления.", + "ORG_ZSTACK_STORAGE_CDP_10112": "Задача Cloud Data Protection для ВМ не найдена: %s", + "ORG_ZSTACK_STORAGE_CDP_10113": "Резервное хранилище для виртуальной машины не настроено: %s", + "ORG_ZSTACK_STORAGE_CDP_10114": "CdpBackupFactory типа [%s] не найден в облачной среде", + "ORG_ZSTACK_STORAGE_CDP_10110": "Архитектура резервного хранилища [UUID: %s] не поддерживает обновление задачи непрерывной защиты данных", + "ORG_ZSTACK_IDENTITY_10072": "невозможно обновить квоту [имя: %s] для учетной записи [идентификатор: %s]", + "ORG_ZSTACK_IDENTITY_10071": "невозможно найти проверяющий элемент для обновления квоты [uuid:%s, тип:%s]", + "ORG_ZSTACK_AI_CONTAINER_10001": "центр моделей с uuid %s не найден в облачной среде", + "ORG_ZSTACK_AI_CONTAINER_10005": "Не удалось получить URL-адрес службы, возможно, из-за нулевого IP-адреса службы. Проверьте конфигурацию сети Kubernetes.", + "ORG_ZSTACK_AI_CONTAINER_10004": "Не удалось создать службу Kubernetes в облачной среде", + "ORG_ZSTACK_AI_CONTAINER_10003": "Не удалось создать развертывание Kubernetes для приложения %s в пространстве имен %s из-за ограничений или проблем конфигурации вычислительных ресурсов облака. Проверьте выделение ресурсов и конфигурацию развертывания.", + "ORG_ZSTACK_AI_CONTAINER_10009": "конечная точка с UUID %s не найдена, невозможно синхронизировать ресурсы контейнера в базе данных", + "ORG_ZSTACK_AI_CONTAINER_10007": "Не удалось инициализировать службу хранилища в кластере Kubernetes", + "ORG_ZSTACK_AI_CONTAINER_10006": "Не удалось создать сетевую политику для экземпляра службы модели распределения %s", + "ORG_ZSTACK_TAG2_10011": "ресурс [uuid:%s] связан с %d тегами и не может вместить дополнительные", + "ORG_ZSTACK_IDENTITY_10063": "оператор должен иметь непустое поле действия. Неверный оператор [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10006": "в зоне [uuid:%s] уже существует основное хранилище NFS с URL %s", + "ORG_ZSTACK_IDENTITY_10062": "Оператор должен указывать поле действия. Неверный оператор [%s]", + "ORG_ZSTACK_IDENTITY_10061": "Оператор должен присваивать значение или влиять на состояние. Неверный оператор [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10008": "Обнаружено несколько блоков CIDR, связанных с сетевым интерфейсом. Укажите один блок CIDR или проверьте конфигурацию сети.", + "ORG_ZSTACK_IDENTITY_10060": "группа [имя: %s, uuid: %s] не связана с учетной записью [uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10009": "неверный блок CIDR: %s", + "ORG_ZSTACK_IDENTITY_10067": "Имя учетной записи администратора не может быть обновлено. Убедитесь, что вы используете правильный синтаксис и параметры для изменения информации учетной записи. Дополнительные сведения см. в официальной документации.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10002": "невозможно найти подключенный хост в кластере для указанной группы размещения [uuid: %s]", + "ORG_ZSTACK_IDENTITY_10066": "Предоставленный пароль не соответствует текущему паролю для учетной записи [UUID: %s]. Убедитесь в правильности и повторите попытку.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10003": "невозможно найти подключенный хост для выполнения команды для основного хранилища NFS [uuid:%s]", + "ORG_ZSTACK_IDENTITY_10065": "Учетная запись уже имеет имя, соответствующее %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10004": "невозможно найти хост с подключением NFS для выполнения команд для основного хранилища NFS [uuid:%s]", + "ORG_ZSTACK_IDENTITY_10069": "Учётная запись[uuid: %s, name: %s] является стандартной учётной записью и не имеет полномочий для сброса пароля другой учётной записи[uuid: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10000": "Основное хранилище NFS [uuid:%s] не присоединено ни к одному вычислительному кластеру и поэтому не может удалить корневой том [uuid:%s] виртуальной машины [uuid:%s].", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10004": "поддерживается только baremetal2 образ с режимом загрузки %s", + "ORG_ZSTACK_IDENTITY_10068": "Только административные учётные записи могут обновлять свои пароли.", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10003": "Атрибут bootMode является обязательным для baremetal2 образов.", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10002": "только шаблон корневого тома в формате raw/qcow2 может быть помечен как baremetal2", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10001": "допускается только один системный тег типа baremetal2, но найдено %d", + "ORG_ZSTACK_AI_CONTAINER_10012": "не удалось найти имя пода по ip %s", + "ORG_ZSTACK_AI_CONTAINER_10011": "Не удалось получить IP-адрес пода, невозможно добавить запись в таблицу конечных точек контейнера. Убедитесь, что под запущен и доступен.", + "ORG_ZSTACK_AI_CONTAINER_10010": "кластер с uuid %s не найден в виртуализированной среде", + "ORG_ZSTACK_COMPUTE_VM_NUMA_10003": "недопустимый набор CPU [%s]", + "ORG_ZSTACK_AI_CONTAINER_10016": "не удалось получить k8s развёртывание %s", + "ORG_ZSTACK_AI_CONTAINER_10015": "не удалось удалить Kubernetes сервис, так как %s", + "ORG_ZSTACK_TAG2_10008": "должны быть указаны все типы токенов", + "ORG_ZSTACK_AI_CONTAINER_10014": "не удалось удалить Kubernetes развёртывание, так как %s", + "ORG_ZSTACK_AI_CONTAINER_10013": "не удалось добавить метку %s к пода %s", + "ORG_ZSTACK_TAG2_10006": "Недопустимая спецификация цвета[%s], должен быть действительный шестнадцатеричный код, например #FF00FF", + "ORG_ZSTACK_TAG2_10007": "Получен формат[%s], формат должен быть либо name::{tokenName1}::{tokenName2} ... ::{tokenNameN}, либо {tokenName1}::{tokenName2} ... ::{tokenNameN}. Имена не должны содержать '{}:'.", + "ORG_ZSTACK_AI_CONTAINER_10019": "недопустимый формат YAML: %s", + "ORG_ZSTACK_TAG2_10004": "шаблон простого тега пуст или содержит недопустимые токены", + "ORG_ZSTACK_AI_CONTAINER_10018": "развёртывание %s не имеет информации об экземпляре", + "ORG_ZSTACK_TAG2_10005": "недопустимые UUID тегов %s, тип тега должен быть простым типом", + "ORG_ZSTACK_AI_CONTAINER_10017": "развёртывание %s не существует", + "ORG_ZSTACK_IDENTITY_10070": "не удаётся найти Quota[name: %s] для учётной записи[uuid: %s]", + "ORG_ZSTACK_TAG2_10002": "невозможно обновить формат шаблона простого тега для метаданных облачного ресурса", + "ORG_ZSTACK_TAG2_10003": "Обнаружено дублирование имени ресурса. Проверьте и устраните.", + "ORG_ZSTACK_SNS_PLATFORM_WECOM_10000": "не удалось отправить сообщения в WeCom. статус: %s, тело: %s", + "ORG_ZSTACK_TAG2_10000": "Нарушение уникальности тега: тег типа [%s] с именем [%s] уже существует в учётной записи [%d].", + "ORG_ZSTACK_TAG2_10001": "Вы можете обновить только идентификатор токена.", + "ORG_ZSTACK_PCIDEVICE_10072": "спецификация pci устройства[uuid:%s] не существует", + "ORG_ZSTACK_PCIDEVICE_10071": "недопустимый тип[%s] для PCI-устройства, допустимы только поддерживаемые типы", + "ORG_ZSTACK_PCIDEVICE_10070": "PCI-устройство [uuid:%s] не существует", + "ORG_ZSTACK_PCIDEVICE_10075": "PCI-устройство [UUID:%s] не существует или отключено для ВМ [UUID:%s]", + "ORG_ZSTACK_PCIDEVICE_10073": "недопустимый тип[%s] для спецификации PCI-устройства, допустимы только поддерживаемые типы", + "ORG_ZSTACK_AI_CONTAINER_10023": "Недопустимый Kubernetes deployment YAML: %s", + "ORG_ZSTACK_AI_CONTAINER_10020": "не удалось пропатчить Kubernetes deployment %s для завершения всех подов", + "ORG_ZSTACK_AI_CONTAINER_10025": "группа экземпляров сервиса модели %s не найдена в базе данных", + "ORG_ZSTACK_AI_CONTAINER_10024": "не удалось пропатчить k8s deployment %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10039": "не удалось создать корневой том[uuid:%s] из кэшированного образа[path:%s] из-за ошибки в среде виртуализации", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10040": "originText или certificateText не могут быть null", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10036": "не удалось удалить бит[%s] на основном хранилище NFS[uuid:%s], ошибка: %s, будет очищен путь установки, pinv.getUuid(), rsp.getError()", + "ORG_ZSTACK_NETWORK_L3_10067": "DNS-ошибка в сети Layer 3 [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10037": "не удалось откатить том[uuid:%s] к снимку[uuid:%s] на KVM-хосте[uuid:%s, ip:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10038": "не удалось откатить том[uuid:%s] к образу[uuid:%s] на KVM-хосте[uuid:%s, ip:%s], %s", + "ORG_ZSTACK_CRYPTO_AUTH_10020": "Не удалось сгенерировать класс для %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10032": "не удалось проверить существование %s на основном хранилище NFS[uuid:%s], ошибка: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10034": "не удалось создать пустой том[uuid:%s, name:%s] на KVM-хосте[uuid:%s, ip:%s], потому что %s", + "ORG_ZSTACK_CRYPTO_AUTH_10029": "Не удалось найти информацию о сертификате для виртуальной машины %s. Пожалуйста, убедитесь, что необходимые сертификаты правильно настроены и загружены в облачную среду.", + "ORG_ZSTACK_CRYPTO_AUTH_10028": "не удалось разобрать открытый текст в параметре шифрования в JSON-объект: %s", + "ORG_ZSTACK_HYGON_10006": "ВМ[uuid:%s] не найдена", + "ORG_ZSTACK_HYGON_10005": "На хосте с UUID %s запущено %d виртуальных машин с включенными функциями безопасности Hygon. Пожалуйста, сначала выключите их.", + "ORG_ZSTACK_HYGON_10004": "хост[uuid:%s] не подключен", + "ORG_ZSTACK_HYGON_10003": "Хост[UUID:%s] требует, чтобы параметр 'enableCgroupDeviceAcl' был больше 0 для устройств Hygon mdev. Пожалуйста, настройте этот параметр перед генерацией устройств mdev.", + "ORG_ZSTACK_HYGON_10002": "Хост[UUID:%s] требует, чтобы конфигурация 'reconnect.host.restart.libvirtd.service' была установлена в 'true' для устройств Hygon mdev. Пожалуйста, настройте этот параметр перед генерацией устройств mdev.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10017": "генерация сертификата не удалась для облачного экземпляра %s", + "ORG_ZSTACK_HYGON_10000": "невозможно удалить устройства mdev, так как %d устройство(в) mdev все еще присоединено к ВМ на хосте [uuid: %s]. Пожалуйста, убедитесь, что все ВМ, использующие эти устройства, сначала остановлены.", + "ORG_ZSTACK_NETWORK_L3_10073": "Нет маршрута хоста для префикса[%s] в сети Layer 3[uuid:%s].", + "ORG_ZSTACK_NETWORK_L3_10072": "префикс [%s] не является допустимой сетью IPv4 CIDR", + "ORG_ZSTACK_NETWORK_L3_10071": "уже существует маршрут хоста для префикса[%s] в сети L3[uuid:%s]", + "ORG_ZSTACK_HYGON_10009": "не удалось выделить устройства Hygon MDEV из-за одновременного выделения. Пожалуйста, повторите позже.", + "ORG_ZSTACK_NETWORK_L3_10070": "next-hop[%s] не является допустимым IPv4-адресом", + "ORG_ZSTACK_HYGON_10008": "недостаточно устройств Hygon IOMMU Group на хосте[uuid:%s]. Требуется: %d", + "ORG_ZSTACK_HYGON_10007": "невозможно изменить настройки Hygon Security Element, пока VM[uuid:%s] находится в состоянии [%s], пожалуйста, остановите VM перед внесением изменений", + "ORG_ZSTACK_TICKET_ENTITY_10001": "операция отклонена. заявка находится в статусе %s, невозможно выполнить операцию[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10031": "группа безопасности [%s] не существует", + "ORG_ZSTACK_IDENTITY_10022": "невозможно найти ресурс[UUID:%s]; неверный UUID ресурса или ресурс является административным ресурсом", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10049": "Не удается найти рабочий бэкенд для выделения облачных ресурсов. Пожалуйста, убедитесь, что ваши бэкенд-сервисы правильно настроены и доступны.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10042": "нет доступных хостов для подключения в кластере[uuid:%s]", + "ORG_ZSTACK_IDENTITY_10026": "%s не является распознанной конечной точкой API", + "ORG_ZSTACK_IDENTITY_10025": "Пользователь, указанный userUuid[%s], не принадлежит текущей учетной записи, и у текущей учетной записи отсутствуют административные привилегии, поэтому она не может проверить разрешения пользователя.", + "ORG_ZSTACK_IDENTITY_10029": "невозможно найти учетную запись[uuid:%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10001": "модель экземпляра безопасности[uuid:%s] недействительна", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10037": "неверный тип алгоритма %s, поддерживаемые типы включают: %s.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10002": "экземпляру безопасности [%s] не удалось вручную запустить синхронизацию, пожалуйста, подтвердите, синхронизировал ли экземпляр безопасности ключ!", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10038": "указанный пул ресурсов[%s] для защиты данных не существует", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10000": "secretResourcePool[uuid:%s] не находится в ожидаемом состоянии %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10032": "произошел инцидент безопасности с IP-адресом управления [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10033": "managementIp[%s] не является допустимым IPv4-адресом", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10034": "не удалось установить соединение с экземпляром безопасности %s[%s], из-за %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10035": "После включения криптографической функции в соответствующем пуле ресурсов должен быть зарезервирован хотя бы один экземпляр безопасности.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10017": "невозможно создать каталог[installUrl:%s] на хосте KVM[uuid:%s, ip:%s], потому что %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10018": "Ни один хост в кластере не подключен или основное хранилище [uuid:%s] не присоединено ни к одному кластеру", + "ORG_ZSTACK_IDENTITY_10050": "toPublic установлен в false, accountUUIDs не могут быть пустыми или нулевыми. Пожалуйста, убедитесь, что UUID предоставлены.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10019": "не удалось выполнить ping основного хранилища NFS [uuid:%s] с хоста [uuid:%s] из-за проблем с сетью или недоступности. отключите это соединение хост-ps.", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10013": "не удалось передать [%s] с резервного хранилища SFTP [hostname:%s] в основное хранилище NFS [uuid:%s, path:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10014": "не удалось загрузить данные с основного хранилища NFS[uuid:%s, mountpoint:%s] в резервное хранилище SFTP[hostname:%s, path:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10016": "невозможно присоединить основное хранилище[uuid:%s, name:%s] к кластеру[uuid:%s]. KVM-хост в кластере использует qemu-img версии[%s]; однако основное хранилище присоединено к другому кластеру, в котором KVM-хост использует qemu-img версии[%s]. Версии qemu-img выше %s несовместимы с версиями ниже %s, что может привести к сбою операций снимков томов. Пожалуйста, избегайте присоединения основного хранилища к кластерам с разными дистрибутивами Linux, чтобы предотвратить несоответствие версий qemu-img.", + "ORG_ZSTACK_IDENTITY_10059": "пользователь[name: %s, uuid: %s] не связан с учетной записью[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10010": "IP-адрес [%s] не принадлежит блоку CIDR [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10011": "На основном хранилище NFS запущено %s виртуальных машин, пожалуйста, остановите их и попробуйте снова:", + "ORG_ZSTACK_IDENTITY_10057": "политика[name: %s, uuid: %s] не принадлежит учетной записи[uuid: %s]", + "ORG_ZSTACK_CRYPTO_AUTH_10009": "неверная модель секретного пула ресурсов, ожидалось %s, но найдено %s", + "ORG_ZSTACK_CRYPTO_AUTH_10008": "не удалось найти модель для секретного пула ресурсов [%s]", + "ORG_ZSTACK_CRYPTO_AUTH_10006": "Данная операция не поддерживается в текущей облачной среде. Пожалуйста, убедитесь, что ваша виртуальная машина поддерживает требуемую операцию.", + "ORG_ZSTACK_IDENTITY_10041": "Невозможно создать группу. Группа с таким именем уже существует в учетной записи [UUID: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10028": "Выбранный хост [UUID:%s] для миграции хранилища недоступен.", + "ORG_ZSTACK_CRYPTO_AUTH_10016": "Не удалось установить соединение с удаленным узлом криптографической службы. Пожалуйста, убедитесь, что служба запущена и работает, а сетевое подключение правильно настроено.", + "ORG_ZSTACK_IDENTITY_10040": "accountName и accountUuid не могут быть одновременно null; необходимо указать хотя бы один из них.", + "ORG_ZSTACK_CRYPTO_AUTH_10015": "Идентификационная аутентификация не указывает пул ресурсов для выделения ресурсов. Пожалуйста, убедитесь, что пул ресурсов правильно определен и указан для службы.", + "ORG_ZSTACK_IDENTITY_10045": "Невозможно удалить встроенную административную учетную запись. Пожалуйста, используйте невстроенную учетную запись для удаления.", + "ORG_ZSTACK_IDENTITY_10044": "Учетная запись %s не может удалить саму себя. Пожалуйста, обратитесь к администратору за помощью.", + "ORG_ZSTACK_IDENTITY_10043": "Невозможно создать учетную запись. Учетная запись с таким именем уже существует.", + "ORG_ZSTACK_IDENTITY_10042": "Невозможно создать пользователя. Пользователь с таким именем уже существует в учетной записи [UUID: %s].", + "ORG_ZSTACK_IDENTITY_10049": "Все проверки аутентификации завершились неудачно, и указанный список UUID учетных записей имеет значение null или пуст. Пожалуйста, проверьте ввод и убедитесь, что предоставлены действительные UUID учетных записей.", + "ORG_ZSTACK_IDENTITY_10048": "Ваша сеанс связана с пользователем. Вы не можете принять личность другого пользователя [uuid:%s].", + "ORG_ZSTACK_IDENTITY_10047": "Текущий сеанс является сеансом на основе учетной записи. Пожалуйста, укажите 'uuid' пользователя, которого вы хотите обновить.", + "ORG_ZSTACK_IDENTITY_10046": "Только администратор может прекратить доступ к учетной записи.", + "ORG_ZSTACK_CRYPTO_AUTH_10019": "Не удалось получить пароль целостности из базы данных, так как %s не сгенерировал пароль целостности", + "ORG_ZSTACK_VHOST_KVM_10000": "Диск vHostUser поддерживает только режим virtio. Пожалуйста, убедитесь, что на платформе образа установлены необходимые драйверы virtio.", + "ORG_ZSTACK_VHOST_KVM_10001": "Диск vhost-user не поддерживает режим virtio-scsi; пожалуйста, отключите режим virtio-scsi.", + "ORG_ZSTACK_NETWORK_L3_10029": "%s не является допустимым IPv6-адресом для конфигурации облачного ресурса", + "ORG_ZSTACK_USBDEVICE_10005": "PassThrough поддерживается только на VM, работающей в хостовой среде.", + "ORG_ZSTACK_ALIYUN_ECS_10019": "Только административные пользователи могут установить параметр [onlyZstack] в значение false.", + "ORG_ZSTACK_STORAGE_BACKUP_10018": "не удалось создать образ из резервной копии %s", + "ORG_ZSTACK_ALIYUN_ECS_10018": "Только ECS-экземпляры с постоплатой поддерживают удаленное удаление; указанный тип оплаты ECS: %s", + "ORG_ZSTACK_USBDEVICE_10002": "Количество USB-устройств, подключенных к VM, достигло предела. Текущее использование: %s", + "ORG_ZSTACK_ALIYUN_ECS_10017": "Можно удалять только ECS-экземпляры со статусом Running или Stopped, текущий статус: %s", + "ORG_ZSTACK_NETWORK_L3_10025": "невозможно получить свободный IP с началом[ip:%s], так как начало[ip:%s] не является допустимым IPv6-адресом", + "ORG_ZSTACK_USBDEVICE_10009": "невозможно мигрировать VM [uuid:%s], так как к ней подключены USB-устройства через passthrough", + "ORG_ZSTACK_STORAGE_BACKUP_10015": "невозможно выделить %s на хранилище резервных копий[uuid:%s], доступно только %s", + "ORG_ZSTACK_NETWORK_L3_10024": "не удалось получить свободный IP с start[ip:%s], так как start[ip:%s] не является допустимым IPv4-адресом", + "ORG_ZSTACK_USBDEVICE_10008": "vm[%s] не может запуститься, так как перенаправление USB на хост не установлено", + "ORG_ZSTACK_NETWORK_L3_10023": "не удалось получить свободный IP с start[ip:%s], так как l3Network[uuid:%s] настроен в режиме двойного стека", + "ORG_ZSTACK_USBDEVICE_10007": "USB уже привязан к виртуальной машине [UUID:%s] и не может быть привязан к другой ВМ.", + "ORG_ZSTACK_STORAGE_BACKUP_10013": "требуемое primary storage[uuid:%s, type:%s] не поддерживает резервное хранилище.", + "ORG_ZSTACK_NETWORK_L3_10022": "ipRangeUuid и l3NetworkUuid не могут быть одновременно пустыми; хотя бы один должен быть установлен.", + "ORG_ZSTACK_USBDEVICE_10006": "невозможно подключить USB-устройство [uuid:%s] к ВМ [uuid:%s], возможные причины: устройство не включено или уже подключено к другой ВМ, либо устройство и ВМ находятся на разных хостах.", + "ORG_ZSTACK_ALIYUN_ECS_10015": "Образ был удалён! Убедитесь, что образ был правильно завершён и все ресурсы освобождены перед удалением.", + "ORG_ZSTACK_ALIYUN_ECS_10014": "образ ECS существует удалённо, имя: %s, время создания: %s", + "ORG_ZSTACK_ALIYUN_ECS_10013": "образ ECS существует как удалённо, так и локально, UUID образа ECS: %s, имя: %s, время создания: %s", + "ORG_ZSTACK_NETWORK_L3_10032": "Пул IPv6-адресов не поддерживается; поэтому добавление IP-диапазона невозможно. Убедитесь, что ваша сетевая конфигурация поддерживает IPv6 перед продолжением.", + "ORG_ZSTACK_STORAGE_BACKUP_10011": "допускается только один system tag сети данных backup storage, но получено %s", + "ORG_ZSTACK_NETWORK_L3_10030": "[startIp %s, endIp %s, prefixLen %d, gateway %s] не является допустимым IPv6-диапазоном для конфигураций облачной сети.", + "ORG_ZSTACK_STORAGE_BACKUP_10010": "Резервирование ёмкости на всех узлах backup storage не удалось. Проверьте доступность ресурсов backup storage.", + "ORG_ZSTACK_USBDEVICE_10016": "Вы можете подключить не более %s устройств USB 3.0 к одной виртуальной машине.", + "ORG_ZSTACK_USBDEVICE_10015": "Вы можете подключить не более %s устройств USB 2.0 к одной ВМ.", + "ORG_ZSTACK_NETWORK_L3_10038": "новый сетевой CIDR [%s] отличается от старого сетевого CIDR [%s]", + "ORG_ZSTACK_USBDEVICE_10014": "Вы можете подключить не более %s устройств USB 1.0 к одной ВМ.", + "ORG_ZSTACK_NETWORK_L3_10037": "новый IP-диапазон [startIP:%s, endIP:%s] пересекается с существующим IP-диапазоном [startIP:%s, endIP:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10028": "резервная копия тома [uuid:%s] не найдена в хранилище томов [uuid:%s]", + "ORG_ZSTACK_NETWORK_L3_10036": "длина IPv6-префикса должна быть %d для Stateless-DHCP или SLAAC", + "ORG_ZSTACK_NETWORK_L3_10035": "addressMode[%s] отличается от режима адреса L3Network[%s]", + "ORG_ZSTACK_USBDEVICE_10019": "USB-устройство [UUID:%s] не находится в подключаемом состоянии %s", + "ORG_ZSTACK_NETWORK_L3_10034": "Системная сеть в настоящее время не поддерживает IPv6, поэтому добавление IP-диапазона в данный момент не поддерживается. Убедитесь, что ваша сетевая конфигурация поддерживает IPv6 перед выполнением этой операции.", + "ORG_ZSTACK_USBDEVICE_10018": "USB-устройство [UUID:%s] уже подключено к другой виртуальной машине [UUID:%s].", + "ORG_ZSTACK_NETWORK_L3_10033": "длина префикса IP-диапазона выходит за пределы допустимого диапазона [%d - %d]", + "ORG_ZSTACK_USBDEVICE_10017": "USB-устройство [UUID: %s] уже подключено к той же ВМ [UUID: %s].", + "ORG_ZSTACK_STORAGE_BACKUP_10024": "Резервная копия тома [uuid:%s] не найдена на узле хранилища [uuid:%s]", + "ORG_ZSTACK_ALIYUN_ECS_10022": "частный IP существует в VSwitch: %s, выделен для ECS: %s", + "ORG_ZSTACK_ALIYUN_ECS_10021": "%s не входит в диапазон CIDR: %s", + "ORG_ZSTACK_ALIYUN_ECS_10020": "Доступных IP-адресов для vSwitch недостаточно, в настоящее время (%d)", + "ORG_ZSTACK_USBDEVICE_10012": "невозможно перенести ВМ [uuid:%s], так как к ней подключены PCI-устройства", + "ORG_ZSTACK_ALIYUN_ECS_10027": "Необходимо указать предложение экземпляра или тип экземпляра!", + "ORG_ZSTACK_USBDEVICE_10011": "невозможно перенести корневой том [uuid:%s], так как к нему подключены устройства хранения", + "ORG_ZSTACK_ALIYUN_ECS_10026": "%s не является допустимым типом тома, допустимые типы: [%s]", + "ORG_ZSTACK_ALIYUN_ECS_10025": "%s не является допустимым IPv4-адресом", + "ORG_ZSTACK_ALIYUN_ECS_10024": "при выделении публичного IP-адреса необходимо указать пропускную способность", + "ORG_ZSTACK_NETWORK_L3_10043": "%s не является допустимой сетевой маской CIDR", + "ORG_ZSTACK_STORAGE_BACKUP_10023": "Одно из хранилищ резервных копий [UUID: %s] находится в состоянии %s, поэтому не может выполнить операцию синхронизации.", + "ORG_ZSTACK_NETWORK_L3_10042": "шлюз[gatewayId] не находится в подсети subnetId", + "ORG_ZSTACK_STORAGE_BACKUP_10022": "Фабрика резервных копий томов типа [%s] не найдена", + "ORG_ZSTACK_NETWORK_L3_10041": "%s не является допустимой сетью CIDR, так как не содержит доступных IP-адресов", + "ORG_ZSTACK_STORAGE_BACKUP_10021": "Текущая ВМ[UUID: %s] резервного тома больше не является ВМ[UUID: %s], которая использовалась для резервного копирования.", + "ORG_ZSTACK_STORAGE_BACKUP_10020": "при синхронизации файла метаданных резервной копии тома в хранилище образов[uuid:%s] произошла ошибка ввода-вывода: %s", + "ORG_ZSTACK_NETWORK_L3_10049": "L3 сеть [uuid %s: имя %s] не является публичной сетью; поэтому невозможно добавить диапазон пула адресов.", + "ORG_ZSTACK_NETWORK_L3_10047": "недопустимое сочетание системы и категории, допустимы только определенные облачные платформы", + "ORG_ZSTACK_NETWORK_L3_10046": "%s не является допустимым доменным именем FQDN", + "ORG_ZSTACK_NETWORK_L3_10045": "неподдерживаемый тип L3 сети[%s]", + "ORG_ZSTACK_NETWORK_L3_10044": "ipRangeUuids, L3NetworkUuids и zoneUuids должны содержать хотя бы один непустой список, либо все значения должны быть установлены в true.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10023": "невозможно присоединить правило переадресации портов с разрешенным CIDR, так как vmNic[uuid:%s] уже имеет правила, перекрывающие целевые диапазоны частных портов[%s, %s] и имеющие тот же тип протокола[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10024": "невозможно присоединить правило переадресации портов, так как vmNic[uuid:%s] уже имеет конфликтующее правило, перекрывающее целевой диапазон частных портов[%s, %s] и имеющее тот же тип протокола[%s].", + "ORG_ZSTACK_SNMP_10010": "Не удалось %s SNMP-агента, так как пароль конфиденциальности не может быть пустым.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10021": "VMNic [UUID:%s] уже имеет правила переадресации портов с отличающимися VIP от [UUID:%s].", + "ORG_ZSTACK_ALIYUN_NAS_CORE_10000": "Основное хранилище [%s] все еще работает; поэтому удаление группы доступа невозможно.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10022": "vmNic UUID[%s] не разрешено добавлять переадресацию портов с правилом разрешенного CIDR, так как у него уже есть связанный публичный IP-адрес.", + "ORG_ZSTACK_NETWORK_L3_10054": "Выделение IP-адреса не может содержать сетевые адреса или широковещательные адреса. Пожалуйста, убедитесь, что предоставленный IP-адрес является допустимым адресом хоста в подсети.", + "ORG_ZSTACK_NETWORK_L3_10053": "шлюз[gatewayId] не находится в подсети subnetId/cidrBlock", + "ORG_ZSTACK_NETWORK_L3_10052": "Диапазон IP-адресов [%s ~ %s] содержит link-local адреса, которые зарезервированы для виртуализации и не должны использоваться.", + "ORG_ZSTACK_NETWORK_L3_10051": "Диапазон IP-адресов [%s ~ %s] содержит адреса класса E, которые являются зарезервированными.", + "ORG_ZSTACK_NETWORK_L3_10050": "Диапазон IP-адресов [%s ~ %s] содержит D-класс адресов, которые зарезервированы для многоадресной связи.", + "ORG_ZSTACK_STORAGE_BACKUP_10008": "после вычитания зарезервированной емкости нет доступного хранилища резервных копий с требуемой емкостью [%s байт]", + "ORG_ZSTACK_STORAGE_BACKUP_10006": "хранилище резервных копий [UUID:%s] было связано с зоной [UUID:%s]", + "ORG_ZSTACK_NETWORK_L3_10059": "начальный IP-адрес [%s] находится после конечного IP-адреса [%s]", + "ORG_ZSTACK_ALIYUN_ECS_10006": "не удалось декодировать URL: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10005": "хранилище резервных копий с UUID:%s не привязано к зоне с UUID:%s", + "ORG_ZSTACK_NETWORK_L3_10058": "сетевая маска [%s] недействительна и должна быть указана, чтобы избежать недействительной маски подсети 0.0.0.0 для диапазона IP-адресов.", + "ORG_ZSTACK_STORAGE_BACKUP_10004": "zoneUuids и backupStorageUuids должны оба содержать хотя бы один непустой список, или оба быть установлены в значение true.", + "ORG_ZSTACK_NETWORK_L3_10057": "шлюз [%s] не является допустимым IPv4-адресом", + "ORG_ZSTACK_STORAGE_BACKUP_10003": "%s не должен быть null в конфигурации виртуальной машины", + "ORG_ZSTACK_NETWORK_L3_10056": "конечный IP [%s] не является допустимым IPv4-адресом", + "ORG_ZSTACK_NETWORK_L3_10055": "начальный IP [%s] не является допустимым IPv4-адресом", + "ORG_ZSTACK_CORE_SALT_10000": "SCP не найден в системе [%s], невозможно установить конфигурацию Salt.", + "ORG_ZSTACK_ALIYUN_ECS_10004": "системный диск не найден для экземпляра: [%s], id экземпляра: [%s]", + "ORG_ZSTACK_CORE_SALT_10003": "не удалось выполнить состояние Salt [%s] на экземпляре [%s], неудача после %s попыток", + "ORG_ZSTACK_ALIYUN_ECS_10003": "Эта зона доступности [%s] в настоящее время не поддерживает тип экземпляра [%s], пожалуйста, выберите другой тип экземпляра или зону доступности.", + "ORG_ZSTACK_ALIYUN_ECS_10002": "В настоящее время нет доступных типов экземпляров. Пожалуйста, проверьте позже или измените ваши спецификации.", + "ORG_ZSTACK_SNMP_10000": "Создание агента SNMP не удалось, так как агент уже существует.", + "ORG_ZSTACK_SNMP_10001": "Не удалось завершить работу службы агента SNMP, пожалуйста, убедитесь, что сначала создан экземпляр агента SNMP.", + "ORG_ZSTACK_NETWORK_L3_10065": "Добавление обычного IP-диапазона требует указания IP-адреса шлюза.", + "ORG_ZSTACK_SNMP_10002": "Не удалось обновить конфигурацию агента SNMP. Пожалуйста, убедитесь, что агент SNMP создан сначала.", + "ORG_ZSTACK_NETWORK_L3_10064": "шлюз нового добавленного IP-диапазона %s отличается от существующего шлюза %s", + "ORG_ZSTACK_SNMP_10003": "Не удалось запустить агент SNMP, пожалуйста, сначала создайте агент SNMP.", + "ORG_ZSTACK_NETWORK_L3_10063": "шлюз [%s] не может быть частью диапазона [%s, %s]", + "ORG_ZSTACK_SNMP_10004": "Не удалось %s агент SNMP, потому что readCommunity не может быть пустым, когда версия v2c", + "ORG_ZSTACK_NETWORK_L3_10062": "конечная точка [%s] не находится в подсети %s/%d", + "ORG_ZSTACK_SNMP_10005": "Не удалось %s агент SNMP, потому что userName не может быть пустым, когда версия v3", + "ORG_ZSTACK_NETWORK_L3_10061": "несколько CIDR-блоков не допускаются в одной и той же L3-сети. Существующий IP-диапазон [uuid:%s, CIDR:%s] уже существует; поэтому новый CIDR-блок [%s] недействителен.", + "ORG_ZSTACK_SNMP_10006": "Не удалось %s агент SNMP, алгоритм аутентификации не может быть null, когда пароль не предоставлен.", + "ORG_ZSTACK_NETWORK_L3_10060": "перекрытие с IP-диапазоном [uuid:%s, start_ip:%s, end_ip: %s]", + "ORG_ZSTACK_SNMP_10007": "Не удалось %s агент SNMP из-за пустого пароля аутентификации.", + "ORG_ZSTACK_SNMP_10008": "Не удалось %s SNMP агент, так как для конфигурации шифрования данных требуется сначала установить пользовательскую проверку.", + "ORG_ZSTACK_XINFINI_10019": "не удалось получить детали узла %s, проверьте IP-адрес и конфигурацию роли", + "ORG_ZSTACK_XINFINI_10018": "Узел виртуальной машины не найден", + "ORG_ZSTACK_XINFINI_10017": "Не найден подключенный экземпляр виртуальной машины. Пожалуйста, убедитесь, что узел правильно подключен, и попробуйте снова.", + "ORG_ZSTACK_XINFINI_10016": "не поддерживаемый протокол[%s] для активного соединения", + "ORG_ZSTACK_XINFINI_10015": "не поддерживаемое получение информации о томе от [%s]", + "ORG_ZSTACK_XINFINI_10014": "не поддерживаемый протокол хранения[%s]", + "ORG_ZSTACK_XINFINI_10013": "не поддерживаемый протокол[%s] для деактивации", + "ORG_ZSTACK_XINFINI_10012": "не удалось получить детали тома [%s], возможно из-за удаления", + "ORG_ZSTACK_XINFINI_10010": "пустая конфигурация, невозможно обнаружить экземпляр xinfini", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10021": "требуемый IP %s уже выделен другому экземпляру", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10022": "требуемый IP %s находится за пределами диапазона DHCP %s ~ %s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10020": "не удалось выделить IP из сети предоставления Baremetal2[uuid:%s]", + "ORG_ZSTACK_XINFINI_10009": "удаление iscsi клиента не удалось %s", + "ORG_ZSTACK_XINFINI_10008": "удаление сопоставления группы клиентов тома не удалось %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10002": "Существуют BM экземпляры, использующие IP-адреса, выделенные из L2[uuid:%s].", + "ORG_ZSTACK_XINFINI_10007": "удаление снимка тома не удалось %s", + "ORG_ZSTACK_XINFINI_10006": "снимок [id:%s, name:%s] имеет %d клонированных томов, имена томов: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10004": "Существуют BM экземпляры, использующие IP-адреса, выделенные из IP диапазона [uuid:%s].", + "ORG_ZSTACK_XINFINI_10005": "удаление тома не удалось из-за %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10003": "Существуют BM экземпляры, использующие IP-адреса, выделенные из сети L3 [UUID:%s].", + "ORG_ZSTACK_XINFINI_10004": "удаление bdev не удалось %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10006": "Не удалось удалённо включить %s baremetal сервер[uuid:%s]", + "ORG_ZSTACK_XINFINI_10003": "bdc с IP %s не найден в облачной среде.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10005": "не удалось выделить baremetal PXE сервер, убедитесь, что PXE сервер с достаточной доступной ёмкостью присоединён к кластеру[uuid:%s]", + "ORG_ZSTACK_XINFINI_10002": "запрос xinfini не удался, сообщение: %s.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10008": "Baremetal шасси [uuid:%s] не существует", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10009": "сеть предоставления baremetal2 с UUID: %s уже присоединена к кластеру с UUID: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10007": "Не удалось удалённо выключить baremetal шасси[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10008": "не удалось горячо отсоединить управляемое устройство от работающей виртуальной машины, потому что:%s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10010": "невозможно подключить сеть подготовки Baremetal2 [uuid:%s] к кластеру [uuid:%s], так как у него уже настроена сеть", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10011": "невозможно подключить сеть подготовки BareMetal2 к кластеру, так как они находятся в разных зонах доступности", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10007": "ВМ [uuid:%s] не может запуститься на хосте, который содержит устройство mdev [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10004": "не удалось динамически подключить устройство mdev к запущенной ВМ, причина:%s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10002": "устройство mdev с UUID:%s не может быть подключено к ВМ с UUID:%s из-за неверного статуса", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10003": "устройство mdev [%s] недоступно в виртуализированной среде", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10000": "хост [%s] не может перейти в режим обслуживания, так как ВМ [%s] имеет подключенные устройства MDEV и не может быть автоматически мигрирована", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10018": "не удалось обновить подготовленную сеть [uuid:%s] в шлюзе [uuid:%s]: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10009": "шасси Baremetal [UUID:%s] не включено или недоступно. Пожалуйста, выберите другое.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10001": "PCI устройство [uuid:%s] известно как mdev, но его спецификация не найдена, поэтому процесс прерывается", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10016": "не все сети подготовки baremetal2 существуют в %s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10014": "невозможно отключить сеть подготовки Baremetal2 [uuid:%s], так как существуют запущенные экземпляры, зависящие от нее", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10015": "networkUuids является пустым списком", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10012": "невозможно подключить сеть подготовки BareMetal2 к кластеру, так как каждый шлюз, подключенный к кластерам с той же сетью подготовки, должен быть проверен. Пожалуйста, убедитесь, что все соответствующие шлюзы согласованы перед продолжением.", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10013": "подготовленная сеть не должна иметь то же имя интерфейса, что и сети L2, уже подключенные к кластеру", + "ORG_ZSTACK_NETWORK_L3_10006": "Не удалось зарезервировать диапазон IP-адресов, так как нет доступной подсети IPv4.", + "ORG_ZSTACK_NETWORK_L3_10005": "не удалось зарезервировать диапазон IP-адресов, так как конечный IP [%s] меньше начального IP [%s]", + "ORG_ZSTACK_NETWORK_L3_10004": "не удалось зарезервировать диапазон IP-адресов, так как конечный IP [%s] не является допустимым адресом IPv6", + "ORG_ZSTACK_NETWORK_L3_10003": "не удалось зарезервировать диапазон IP-адресов, так как конечный IP [%s] не является допустимым адресом IPv4", + "ORG_ZSTACK_NETWORK_L3_10002": "не удалось зарезервировать диапазон IP-адресов, так как начальный IP-адрес [%s] недействителен", + "ORG_ZSTACK_NETWORK_L3_10000": "нельзя удалить IP-адрес, так как он используется контроллером сетевого интерфейса ВМ [UUID:%s]", + "ORG_ZSTACK_NETWORK_L3_10009": "Не удалось зарезервировать диапазон IP-адресов, так как нет доступной подсети IPv6. Пожалуйста, проверьте конфигурацию сети или попробуйте зарезервировать подсеть IPv4.", + "ORG_ZSTACK_KVM_10001": "не удалось загрузить информацию о хосте из файла, так как\\n%s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10019": "устройство mdev с UUID: %s не подключено к ВМ с UUID: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10017": "ВМ [UUID:%s], содержащая устройство SE-MDEV, не может подключить больше устройств SE-MDEV [%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10018": "IOMMU хоста [uuid:%s], управляющего PCI устройством [uuid:%s], не настроена как [%s] или [%s].", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10015": "ВМ [uuid:%s] имеет подключенные устройства mdev, которые находятся на другом хосте, чем устройство mdev [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10014": "ВМ [uuid:%s] имеет подключенные PCI устройства, которые находятся на другом хосте, чем устройство mdev [uuid:%s]", + "ORG_ZSTACK_NETWORK_L3_10010": "не удалось зарезервировать диапазон IP-адресов, так как зарезервированный IP не находится в указанном диапазоне IP [%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10011": "Невозможно изменить состояние устройства mdev, которое в данный момент подключено к виртуальной машине. Пожалуйста, отключите устройство перед внесением изменений.", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10007": "Невозможно удалить сеть подготовки BareMetal2 [uuid:%s], когда от неё зависят экземпляры", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10012": "Невозможно подключить устройство mdev [uuid:%s] к ВМ, убедитесь, что оно включено и не подключено", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10008": "Невозможно подключить сеть подготовки BareMetal2 к кластеру, не поддерживающему BareMetal2", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10005": "Маска подсети DHCP %s для сети подготовки baremetal2 недействительна", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10006": "Начальный IP %s и конечный IP %s сети подготовки baremetal2 не принадлежат одной подсети", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10003": "Невозможно обновить конфигурацию DHCP подготовленной сети BareMetal2 [uuid:%s], когда от неё зависят экземпляры", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10002": "Сеть подготовки baremetal2 с интерфейсом DHCP %s уже существует со следующей конфигурацией: начальный IP %s, конечный IP %s, маска подсети %s и шлюз %s", + "ORG_ZSTACK_NETWORK_L3_10018": "Не указан IP-диапазон для уровня 3[%s]", + "ORG_ZSTACK_NETWORK_L3_10015": "Необходимо обновить как систему, так и категорию в конфигурации вашего облака", + "ORG_ZSTACK_XINFINI_10027": "Функция отключения экспорта NVMeOF в данный момент не поддерживается", + "ORG_ZSTACK_NETWORK_L3_10014": "Невозможно удалить последний стандартный IP-диапазон, поскольку всё ещё присутствует пул адресов", + "ORG_ZSTACK_XINFINI_10026": "Не обнаружен активный шлюз для клиента[%s]", + "ORG_ZSTACK_NETWORK_L3_10013": "невозможно установить MTU, так как L2 сеть[uuid:%s] L3 сети [uuid:%s] имеет значение MTU, превышающее лимит сети novlan", + "ORG_ZSTACK_XINFINI_10025": "Экспорт NVMe over Fabrics (OF) в данный момент не поддерживается", + "ORG_ZSTACK_XINFINI_10024": "xinfini поддерживает только установку общего уровня QoS", + "ORG_ZSTACK_NETWORK_L3_10011": "невозможно зарезервировать IP-диапазон, поскольку новый диапазон пересекается с существующим диапазоном [%s:%s]", + "ORG_ZSTACK_XINFINI_10023": "Нет доступного пула с достаточным пространством[%d] и работоспособным статусом", + "ORG_ZSTACK_XINFINI_10021": "не удалось получить детали виртуальной машины для пула[id:%d, name:%s]", + "ORG_ZSTACK_XINFINI_10020": "Пулы вычислительных ресурсов не найдены. Пожалуйста, убедитесь, что пул создан и доступен для использования", + "ORG_ZSTACK_KVM_10010": "Узел [UUID: %s] не имеет информации о модели ЦП. Пожалуйста, переподключите узел для решения этой проблемы", + "ORG_ZSTACK_KVM_10011": "Необходимо указать причину принудительного запуска", + "ORG_ZSTACK_NETWORK_L3_10019": "IP[%s] не входит в диапазон cidr IP-пула[uuid:%s, cidr:%s], связанного с L3 сетью[%s]", + "ORG_ZSTACK_KVM_10012": "Узел[uuid:%s] был удалён", + "ORG_ZSTACK_KVM_10002": "Операционная система [OS] узла [hostname:%s, IP:%s] недействительна", + "ORG_ZSTACK_KVM_10003": "Кластер[uuid:%s] уже имеет узел с версией ОС [%s], но недавно добавленный узел [name:%s ip:%s] имеет другую версию ОС [%s]", + "ORG_ZSTACK_KVM_10004": "ВМ[uuid:%s] аварийно завершена из-за сбоя ядра", + "ORG_ZSTACK_KVM_10005": "Узел[uuid: %s] обнаружил ошибку памяти ECC, подробности: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10029": "указанные управляемые устройства находятся не на одном узле: управляемое устройство[uuid: %s] на узле[uuid: %s], тогда как управляемое устройство[uuid: %s] на узле[uuid: %s]", + "ORG_ZSTACK_KVM_10006": "Имеются узлы с различной архитектурой ЦП, подробности: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10026": "Невозможно удалить устройство mdev, пока оно подключено к экземпляру виртуальной машины. Отключите устройство перед удалением", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10027": "не удалось запустить ВМ[UUID:%s], так как не все спецификации MDEV[UUIDs:%s] существуют", + "ORG_ZSTACK_KVM_10008": "идентификатор PCI-моста должен быть больше 0 и меньше 32", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10024": "невозможно подключить управляемое устройство к экземпляру виртуальной машины, которая не находится в остановленном состоянии", + "ORG_ZSTACK_KVM_10009": "текущее состояние ВМ[%s], для изменения virtioSCSI требуется, чтобы ВМ находилась в состоянии[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10025": "недопустимый тип устройства mdev [%s], допустимы только виртуальные устройства", + "ORG_ZSTACK_NETWORK_L3_10021": "недопустимый идентификатор облачного экземпляра[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10022": "идентификаторы кластеров UUID, идентификатор хоста UUID или идентификатор ВМ UUID не могут быть установлены одновременно.%s", + "ORG_ZSTACK_NETWORK_L3_10020": "IP-адрес[%s] в пределах IP-диапазона[uuid:%s, startIp:%s, endIp:%s], связанного с сетью L3[%s], это не допускается", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10023": "Кластеры не существуют или отключены. Убедитесь, что кластеры были правильно созданы и включены.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10020": "хост с UUID [%s], на котором находится устройство mdev с UUID [%s], не соответствует ни [%s], ни [%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10021": "Невозможно отключить устройство mdev от экземпляра ВМ, когда она не находится в остановленном состоянии. Убедитесь, что экземпляр ВМ остановлен перед отключением устройства mdev.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10053": "на SDN-контроллере [IP:%s] не настроена виртуальная частная сеть (VPC).", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10054": "системный тег для идентификатора VPC является обязательным. Пожалуйста, укажите допустимое значение.", + "ORG_ZSTACK_MACVLAN_10002": "не удалось проверить VLAN-интерфейс[%s] для сети L2VLAN[uuid:%s, name:%s] на хосте KVM[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10051": "на SDN-контроллере не настроен коммутатор [ip:%s]", + "ORG_ZSTACK_MACVLAN_10005": "невозможно подключить сетевую службу к сети L3 [uuid:%s], так как сеть L2 [uuid:%s, vSwitchType:%s] не поддерживает какие-либо службы L3 для общедоступной базовой сети L3", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10052": "к контроллеру не подключен SDN-коммутатор.%s", + "ORG_ZSTACK_MACVLAN_10004": "только %s поддерживают режим сети MACVLAN", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10057": "не удалось получить логический коммутатор для сети уровня 2 %s", + "ORG_ZSTACK_MACVLAN_10007": "невозможно подключить сетевую службу к сети L3 с UUID: %s, так как сеть L2 с UUID: %s поддерживает только vRouter в качестве сетевого провайдера для частных базовых сетей L3.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10058": "получение логического коммутатора для сети уровня 2 завершилось с ошибкой: %s", + "ORG_ZSTACK_MACVLAN_10006": "невозможно подключить сетевую службу к сети L3 с UUID: %s, так как сеть L2 с UUID: %s поддерживает только vRouter в качестве сетевого провайдера для сетей VPC L3 и не поддерживает vSwitchType: %s.", + "ORG_ZSTACK_MACVLAN_10009": "хосты KVM поддерживают только сети L2 с vSwitchType, установленным в OVS. Убедитесь, что ваш хост имеет тип KVM и vSwitchType настроен как OVS.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10056": "невозможно получить информацию о порту физического коммутатора по причине: %s", + "ORG_ZSTACK_MACVLAN_10008": "невозможно подключить сетевую службу к сети L3 [uuid:%s], так как сеть L2 [uuid:%s, vSwitch Type:%s] поддерживает только балансировщик нагрузки для частных базовых сетей L3", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10075": "корневой том был удален и не может быть переустановлен в данный момент. Пожалуйста, обратитесь в службу поддержки за помощью.", + "ORG_ZSTACK_STORAGE_CEPH_10023": "проблема может быть связана с неправильным идентификатором ключа доступа, секретным ключом доступа, номером порта SSH или нестабильным сетевым подключением в вашей облачной среде. Пожалуйста, проверьте эти настройки.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10050": "на SDN-контроллере отсутствует арендатор [IP:%s]", + "ORG_ZSTACK_STORAGE_CEPH_10020": "poolName может быть null, но не должен быть пустой строкой", + "ORG_ZSTACK_KVM_10022": "SSH-подключение к хосту[%s] с именем пользователя[%s] на порту[%s] не удалось по причине %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10073": "невозможно создать пустой том[uuid:%s, name:%s] на KVM хосте[uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_10021": "poolName должен быть указан, когда importImages включен", + "ORG_ZSTACK_KVM_10023": "Хост[%s] не был включен в течение %d секунд по неизвестной причине. Пожалуйста, проверьте статус хоста через BMC[%s].", + "ORG_ZSTACK_STORAGE_BACKUP_10092": "не удалось пройти проверку безопасности восстановления:\\n%s", + "ORG_ZSTACK_KVM_10014": "хост %s не управляется текущим управляющим узлом", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10000": "executeSlbGroupConfigTask неизвестное имя задачи: %s", + "ORG_ZSTACK_MEVOCO_10049": "Невозможно найти конфигурационную информацию для узла A", + "ORG_ZSTACK_STORAGE_BACKUP_10091": "хранилище резервных копий [UUID:%s] не включено или не настроено", + "ORG_ZSTACK_KVM_10015": "хост %s не подключен, пропускаем перезапуск KVM агента", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10039": "невозможно перенести корневой том [uuid:%s], так как подключены управляемые устройства", + "ORG_ZSTACK_MEVOCO_10048": "Невозможно одновременно установить локальную и облачную конфигурацию. Пожалуйста, укажите одну среду развертывания.", + "ORG_ZSTACK_STORAGE_BACKUP_10090": "резервная копия базы данных [uuid:%s] еще не существует", + "ORG_ZSTACK_KVM_10016": "выполняющаяся задача существует на хосте %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10081": "невозможно найти флаг файл [%s] на вычислительном узле [%s], потому что: %s", + "ORG_ZSTACK_MEVOCO_10047": "неожиданные IP-адреса управления хоста: [%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10037": "невозможно перенести ВМ[UUID:%s], так как подключено mdev устройство", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10035": "невозможно найти mdev устройство[uuid:%s], оно могло быть удалено или освобождено", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10036": "mdev устройство с UUID: %s не существует или отключено для ВМ с UUID: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10034": "не удалось найти достаточное количество mdev устройств спецификации [uuid:%s] на целевом хосте [uuid:%s] для виртуальной машины [uuid:%s]", + "ORG_ZSTACK_MEVOCO_10041": "недопустимое значение[%s], ZStack не поддерживает такой тип выделения хоста", + "ORG_ZSTACK_STORAGE_BACKUP_10099": "резервная копия базы данных[uuid:%s] не включена и не готова", + "ORG_ZSTACK_STORAGE_CDP_10120": "Не удается найти подключенное хранилище резервных копий[uuid: %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10098": "том[uuid:%s] был удален, изменение состояния не разрешено", + "ORG_ZSTACK_MEVOCO_10040": "недопустимое значение[%s], это не допустимое число с плавающей точкой", + "ORG_ZSTACK_STORAGE_CDP_10121": "Операция включает том [UUID: %s], который создаст цепочечный снимок. Следовательно, вы не можете выполнить эту операцию, когда задача непрерывной защиты данных (CDP) выполняется на экземпляре виртуальной машины.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10032": "не удалось определить подходящие хосты для запуска ВМ[uuid:%s], %s", + "ORG_ZSTACK_STORAGE_BACKUP_10097": "Не найдено доступное хранилище объектов для резервного копирования, пропускаем эту задачу.%s", + "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10001": "Удаление системной темы из системного сигнала тревоги запрещено. Пожалуйста, укажите корректные UUID темы и сигнала тревоги.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10005": "Невозможно найти публичный сетевой интерфейс экземпляра SLB", + "ORG_ZSTACK_MEVOCO_10046": "obj не является экземпляром NicQos! Пожалуйста, убедитесь, что тип объекта соответствует ожидаемому типу.", + "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10000": "alarm[uuid:%s] — это системное предупреждение, которое нельзя удалить", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10004": "задача конфигурации версии:%d для экземпляра SLB[uuid:%s] не удалась %d раз", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10003": "невозможно найти доступный экземпляр SLB в группе[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10094": "версия резервной копии базы данных[%s] не соответствует текущей версии[%s]", + "ORG_ZSTACK_MACVLAN_10000": "не удалось создать мост для l2VlanNetwork[uuid:%s, name:%s] на хосте KVM[uuid:%s], %s", + "ORG_ZSTACK_MEVOCO_10043": "значение %s — [%s], что конфликтует со значением %s [%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10093": "Не удалось выделить свободный порт для прослушивания. Пожалуйста, убедитесь, что необходимые порты не используются другими приложениями. Если проблема не устранена, проверьте конфигурацию сети или обратитесь в службу поддержки за дополнительной помощью.", + "ORG_ZSTACK_MEVOCO_10060": "Не удалось установить адрес для узла A", + "ORG_ZSTACK_KVM_10030": "проверка емкости хоста не удалась, причина:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10082": "невозможно создать флаг-маркер [%s] на экземпляре [%s], причина: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10060": "не удалось получить логический коммутатор: uuid: %s", + "ORG_ZSTACK_KVM_10032": "доступная память хоста [UUID: %s] [%s МБ] меньше зарезервированной памяти [%s МБ]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10083": "Локальное хранилище первичной системы хранения (state=%s, status=%s) отсутствует в кластере (%s). При монтировании нескольких первичных хранилищ система по умолчанию использует локальное хранилище. Пожалуйста, проверьте состояние и статус первичного хранилища и убедитесь, что оно подключено к кластеру.", + "ORG_ZSTACK_KVM_10033": "невозможно зарегистрировать colo heartbeat для VM[uuid:%s] на хосте KVM [uuid:%s, ip:%s], причина: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10084": "выбранный тип первичного хранилища [uuid:%s] не является локальным хранилищем. Пожалуйста, проверьте, можно ли создать ресурс на другом доступном хранилище, если к кластеру подключено локальное первичное хранилище.", + "ORG_ZSTACK_KVM_10034": "невозможно запустить виртуальную машину синхронизации colo [uuid:%s] на хосте KVM [uuid:%s, ip:%s], причина: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10085": "кластер монтирует несколько первичных хранилищ [Локальное хранилище (%s), другое хранилище, отличное от локального], поэтому указание primaryStorageUuidForDataVolume не допускается %s.", + "ORG_ZSTACK_KVM_10024": "хост [%s] не был выключен в течение %d секунд по неизвестной причине. Пожалуйста, проверьте состояние хоста через BMC[%s].", + "ORG_ZSTACK_MEVOCO_10059": "данный экземпляр не связан с узлом A", + "ORG_ZSTACK_MEVOCO_10058": "существует узел в режиме производства; подробности ARPing: %s", + "ORG_ZSTACK_MEVOCO_10053": "агент bootstrap curl завершен, код возврата: %s, stdout: %s, stderr: %s", + "ORG_ZSTACK_MEVOCO_10052": "невозможно получить результат задачи bootstrap %s после 900 секунд", + "ORG_ZSTACK_MEVOCO_10050": "невозможно получить информацию об адресе узла A от агента bootstrap", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10040": "невозможно мигрировать VM[UUID:%s], так как к ней подключены устройства MDEV", + "ORG_ZSTACK_MEVOCO_10057": "не удалось перевести узел A в режим производства, подробности: %s", + "ORG_ZSTACK_MEVOCO_10056": "не удалось перевести все управляющие узлы в режим производства, подробности: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10013": "MAC-адрес %s недействителен. Он должен быть в формате 6c:b3:11:1b:0b:1e", + "ORG_ZSTACK_HA_10014": "невозможно установить FT на VM [uuid:%s], так как USB-устройства подключены через passthrough", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10012": "PXE-сервер baremetal [UUID:%s] не включен и не подключен, пожалуйста, проверьте его состояние.", + "ORG_ZSTACK_HA_10015": "невозможно установить FT на виртуальную машину [uuid:%s], так как подключено устройство mdev", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10015": "Обнаружен дублирующийся UUID bond для виртуальной машины %s. Пожалуйста, убедитесь в уникальности UUID для конфигураций bonding.", + "ORG_ZSTACK_HA_10016": "Узел управления не может обнаружить хост. Пожалуйста, убедитесь, что хост правильно зарегистрирован и доступен в облачной среде.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10014": "Baremetal шасси [UUID: %s] не имеет сетевого интерфейса с MAC-адресом %s", + "ORG_ZSTACK_HA_10017": "Значение [%s] выходит за пределы допустимого диапазона [0, 1].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10057": "Хост [uuid: %s] локального основного хранилища [uuid: %s] не имеет достаточной емкости [текущая: %s байт, требуется: %s]", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10017": "Обнаружен дублирующийся UUID L3 сети", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10058": "Не удалось найти хост с ресурсом [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10016": "Baremetal Network Bonding не поддерживается", + "ORG_ZSTACK_HA_10011": "Невозможно установить FT на ВМ [uuid:%s], так как она не находится в остановленном состоянии", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10059": "Ресурс [uuid:%s] может управляться только на хосте [uuid:%s], но хост был завершен", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10019": "Выбранная сеть уровня 3 не может быть назначена шасси [UUID:%s].", + "ORG_ZSTACK_HA_10012": "Невозможно установить FT на ВМ [uuid:%s], так как один или несколько томов данных все еще подключены", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10018": "Указанная сеть уровня 3 не существует. Пожалуйста, проверьте имя сети и попробуйте снова.", + "ORG_ZSTACK_HA_10013": "Невозможно установить FT на ВМ [uuid:%s], так как подключено PCI-устройство", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10053": "Для подготовки тома данных на локальном основном хранилище необходимо указать хост, на котором том данных будет создан, используя системный тег [%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10054": "Хост [UUID:%s] не связан с локальным основным хранилищем [UUID:%s].", + "ORG_ZSTACK_KVM_10040": "Не удалось увеличить количество CPU ВМ, подробности ошибки: %s", + "ORG_ZSTACK_HA_10018": "VM[uuid:%s] расположение тома в хранилище находится на техническом обслуживании", + "ORG_ZSTACK_KVM_10043": "Невозможно подключиться к KVM[ip:%s, username:%s, SSH port:%d] для выполнения DNS-валидации; пожалуйста, проверьте учетные данные.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10050": "Невозможно выполнить live-миграцию ВМ [uuid:%s] с томами данных на локальном хранилище. Томы данных должны быть отключены сначала.", + "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10001": "Объект запроса равен null. Пожалуйста, убедитесь, что параметры запроса правильно инициализированы перед выполнением задачи облачных вычислений.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10051": "Невозможно выполнить live-миграцию ВМ[UUID:%s] с локальным хранилищем. Поддерживаются только Linux-гости. Текущая платформа [%s].", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10011": "Информация о оборудовании не найдена для baremetal шасси[uuid:%s], пожалуйста, выберите другое", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10052": "Невозможно выполнить live-миграцию ВМ[UUID:%s] с подключенным ISO на локальном хранилище. Пожалуйста, отключите все ISO сначала.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10010": "Соответствующий PXE-сервер не обнаружен, пожалуйста, проверьте конфигурацию baremetal шасси[uuid:%s] снова", + "ORG_ZSTACK_KVM_10035": "Невозможно настроить вторичную ВМ[UUID:%s] на KVM хосте [UUID:%s, IP:%s], так как %s", + "ORG_ZSTACK_MEVOCO_10028": "L3 сеть с UUID [%s] не найдена. Пожалуйста, проверьте и исправьте ваш системный тег [%s], связанный со статическим IP.", + "ORG_ZSTACK_STORAGE_BACKUP_10070": "Не удалось найти резервную копию тома с UUID: %s", + "ORG_ZSTACK_KVM_10036": "Невозможно настроить первичную ВМ[UUID:%s] на KVM хосте[UUID:%s, IP:%s], так как %s", + "ORG_ZSTACK_MEVOCO_10027": "Неверное значение IOPS для тома [%s] превышает максимальный лимит %d", + "ORG_ZSTACK_KVM_10037": "не удалось получить начальное загрузочное устройство ВМ [UUID:%s] на хосте KVM [UUID:%s, IP:%s], из-за %s", + "ORG_ZSTACK_MEVOCO_10026": "неверное значение IOPS[%s] не является допустимым числом", + "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10000": "При запросе пространства имен стороннего Prometheus требуется как минимум один UUID хоста. Убедитесь, что UUID хоста включен в метки параметров вызова запроса.", + "ORG_ZSTACK_KVM_10038": "не удалось получить адрес устройства ВМ[uuid:%s], из-за:%s", + "ORG_ZSTACK_MEVOCO_10025": "неверное значение IOPS[%s], оно должно быть больше 1 (включая 1)", + "ORG_ZSTACK_KVM_10039": "не удалось получить информацию о виртуализаторе хоста[uuid:%s], потому что:%s", + "ORG_ZSTACK_MEVOCO_10029": "Доступ к USB-устройствам ограничен только административными учетными записями. Убедитесь, что вы вошли в систему с учетной записью, имеющей административные привилегии.", + "ORG_ZSTACK_STORAGE_BACKUP_10078": "резервное хранилище не может продолжить работу из-за своего состояния %s", + "ORG_ZSTACK_MEVOCO_10020": "неверная пропускная способность тома[%s] должна быть числовым значением", + "ORG_ZSTACK_STORAGE_BACKUP_10077": "резервное хранилище не может продолжить работу из-за своего статуса %s", + "ORG_ZSTACK_STORAGE_BACKUP_10076": "Резервное хранилище [UUID: %s, Имя: %s] не имеет достаточной емкости для загрузки образа [%s]. Требуемый размер: %s, доступный размер: %s.", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10001": "Все узлы Ceph MON отключены в резервном хранилище Ceph [uuid:%s].", + "ORG_ZSTACK_STORAGE_BACKUP_10075": "Размер образа, полученного по URL %s, составляет %d байт, что слишком мало для образа. Пожалуйста, проверьте URL еще раз.", + "ORG_ZSTACK_STORAGE_BACKUP_10074": "не удалось получить заголовок из URL образа %s", + "ORG_ZSTACK_STORAGE_BACKUP_10073": "не удалось получить заголовок из URL образа %s: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10072": "Сначала завершите работу других узлов!", + "ORG_ZSTACK_MEVOCO_10021": "неверная пропускная способность тома[%s] превышает максимально допустимое значение %d", + "ORG_ZSTACK_STORAGE_BACKUP_10071": "Кластер ВМ [%%s] не совмещен с кластером основного хранилища [%%s].", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10023": "невозможно окончательно удалить экземпляр baremetal, который не находится в состоянии \"Уничтожено\"", + "ORG_ZSTACK_HA_10005": "узлы не смогли просканировать порты целевого хоста[uuid:%s, ip:%s]", + "ORG_ZSTACK_IDENTITY_LOGIN_10000": "неподдерживаемый метод аутентификации %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10068": "Кластер [UUID=%s] подключен к нескольким основным хранилищам, включая LocalStorage и другие основные хранилища, не являющиеся LocalStorage. Вы должны указать основное хранилище, где расположен диск с данными.", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10003": "Не удалось мигрировать образ %s из backend-хранилища %s в backend-хранилище %s. причина: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10002": "На резервном хранилище [%s] найден ID мусора (%s) для пути установки миграции [%s]. Сначала очистите его с помощью 'APICleanUpTrashOnBackupStorageMsg', если вы настаиваете на миграции образа [%s].", + "ORG_ZSTACK_HA_10000": "Экземпляр виртуальной машины, вероятно, был завершен. Пропуск проверок состояния.", + "ORG_ZSTACK_HA_10001": "не удается найти виртуальную машину с именем:[%s] и uuid:[%s], uuid хоста пуст", + "ORG_ZSTACK_HA_10002": "Экземпляр HAHostChecker не найден, невозможно выполнить проверки высокой доступности. Пожалуйста, убедитесь, что все необходимые компоненты правильно настроены.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10064": "Использование физической емкости хоста [uuid:%s] превысило порог [%s]. Пожалуйста, рассмотрите возможность масштабирования или оптимизации ресурсов.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10067": "Кластер[uuid=%s] настроен для подключения нескольких решений основного хранения, включая LocalStorage и другие основные хранилища, не являющиеся LocalStorage. Вы должны указать, какое основное хранилище содержит корневой диск.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10060": "Хост KVM [UUID: %s] не может быть добавлен в локальное основное хранилище [UUID: %s], %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10020": "Только образы ISO поддерживаются для развёртывания служб bare metal в ZStack.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10061": "невозможно создать пустой том снимка[имя:%s, путь установки: %s] на KVM-хосте[uuid:%s, ip:%s], потому что %s", + "ORG_ZSTACK_KVM_10054": "невозможно выполнить слияние снимков тома, когда виртуальная машина[uuid:%s] находится в состоянии %s. Операция разрешена только когда виртуальная машина находится в состоянии Running или Stopped.", + "ORG_ZSTACK_HA_10008": "произошла ошибка при синхронизации состояния self-fencer с хоста[UUID: %s], %s", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10000": "папка[%s] не найдена на сервере облачного управления[%s]", + "ORG_ZSTACK_KVM_10055": "слияние снимков живого тома требует версию libvirt выше %s, текущая версия %s. Пожалуйста, остановите ВМ и повторите операцию или отсоедините том данных при необходимости.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10062": "не удалось передать данные с SFTP-хранилища резервных копий[hostname:%s, path: %s] в локальное основное хранилище[uuid:%s, path: %s], %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10022": "Невозможно восстановить экземпляр bare metal, который не находится в состоянии Destroyed. Пожалуйста, убедитесь, что экземпляр находится в состоянии Destroyed перед попыткой восстановления.", + "ORG_ZSTACK_HA_10009": "Параметр %s не может быть установлен в '%s', потому что сеть хранения недоступна, а высокая доступность должна оставаться включённой.", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10001": "пространство имён[%s] не содержит метрику[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10063": "не удалось загрузить данные с локального хранилища[uuid:%s, path:%s] в SFTP-хранилище резервных копий[hostname:%s, remotePath:%s], %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10021": "Только хранилище резервных копий Image Store поддерживается в службе ZStack Bare Metal.", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10002": "метрика[%s] пространства имён[%s] не содержит метку с именем %s", + "ORG_ZSTACK_MEVOCO_10039": "недопустимое значение[%s], оно должно быть двойным числом в диапазоне (0, 1], включая 1", + "ORG_ZSTACK_KVM_10047": "Хост[UUID: %s, status: %s] не подключён.", + "ORG_ZSTACK_COMPUTE_OVS_10000": "ошибка формата конфигурации ресурса CPU pinning OVS:[%s].", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10001": "намеренно 1: Исходный файл не найден. Пожалуйста, убедитесь, что все необходимые файлы правильно загружены и включены в настройки вашего проекта.", + "ORG_ZSTACK_MEVOCO_10037": "недопустимое значение[%s], оно должно быть положительным числом с плавающей точкой больше 0", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10002": "намеренно: 2 - Эта ошибка указывает на то, что операция была намеренно прервана или изменена во время выполнения. Пожалуйста, проверьте входные параметры и убедитесь, что они соответствуют требованиям облачной вычислительной среды.", + "ORG_ZSTACK_MEVOCO_10031": "Неизвестный код безопасности[%s] для аутентификации", + "ORG_ZSTACK_STORAGE_BACKUP_10089": "сбой операции метаданных резервного копия тома из-за %s", + "ORG_ZSTACK_STORAGE_BACKUP_10087": "сбой генерации файла метаданных резервного копия тома в хранилище образов[uuid:%s] из-за ошибки ввода-вывода: %s", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10000": "намеренно: 3 Облачные экземпляры завершаются. Пожалуйста, подтвердите действие.", + "ORG_ZSTACK_MEVOCO_10034": "Операционная система хоста[UUID:%s] %s %s слишком устаревшая для поддержки QoS для сетевого или дискового ввода-вывода. Пожалуйста, выберите другой экземпляр без конфигурации QoS.", + "ORG_ZSTACK_MEVOCO_10033": "%s не является допустимой нотацией CIDR", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10010": "невозможно добавить контроллер Huawei iMaster SDN с недопустимым диапазоном VLAN[%s, %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10008": "iso[uuid: %s] присоединён к vm[uuid: ], но файл ISO не расположен ни на каком блочном хранилище. Вы должны отсоединить его перед миграцией ВМ.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10009": "не удалось найти блочный SCSI LUN для тома: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10035": "хост[uuid:%s] не может получить доступ к локальному хранилищу[uuid:%s], возможно, из-за отсоединения", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10013": "невозможно создать сеть Huawei iMaster NSE L3 без UUID логического маршрутизатора", + "ORG_ZSTACK_MEVOCO_10093": "DeleteVolumeQos [%s] игнорируется из-за привилегий учетной записи.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10036": "ресурс[uuid:%s, тип: %s] недоступен на локальном основном хранилище[uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10014": "невозможно создать сеть Huawei iMaster L3 с сетью L2 [uuid:%s], так как она уже существует", + "ORG_ZSTACK_MEVOCO_10092": "неверный режим качества обслуживания тома: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10037": "ресурс[uuid:%s, тип: %s] на локальном основном хранилище[uuid:%s] сопоставлен с несколькими гипервизорами%sWithMultipleHypervisors", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10011": "невозможно добавить контроллер Huawei iMaster SDN без указанного диапазона VLAN или идентификатора VLAN", + "ORG_ZSTACK_MEVOCO_10091": "К этому экземпляру не подключены тома. Пожалуйста, подключите том для продолжения.", + "ORG_ZSTACK_STORAGE_BACKUP_10058": "Невозможно указать основное хранилище, подключенное к другому кластеру.", + "ORG_ZSTACK_STORAGE_BACKUP_10057": "Должен быть указан хотя бы один из следующих параметров: UUID сети L3, UUID зоны, UUID кластера, UUID хоста.", + "ORG_ZSTACK_MEVOCO_10090": "невозможно создать снимок для томов, подключенных к нескольким виртуальным машинам", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10033": "Не удалось создать том данных[uuid: %s] на локальном основном хранилище[uuid:%s], так как UUID хоста не указан.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10034": "Ни один хост не включен. Пожалуйста, проверьте доступность ресурсов хоста.", + "ORG_ZSTACK_KVM_10064": "не удалось обновить сетевой интерфейс для виртуальной машины [vm:%s] на хосте KVM [uuid:%s, ip:%s], так как %s", + "ORG_ZSTACK_KVM_10065": "не удалось подключить сетевой адаптер с UUID: %s к виртуальной машине UUID: %s на хосте KVM с UUID: %s и IP: %s, так как %s. Пожалуйста, повторите попытку или удалите устройство с UUID: %s вручную.", + "ORG_ZSTACK_KVM_10066": "не удалось подключить сетевой адаптер с UUID: %s к виртуальной машине UUID: %s на хосте KVM с UUID: %s и IP: %s, так как %s", + "ORG_ZSTACK_KVM_10067": "не удалось отключить том данных[uuid:%s, installPath:%s] от виртуальной машины[uuid:%s, name:%s] на хосте KVM[uuid:%s, ip:%s], из-за %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10005": "правило переадресации портов [uuid:%s] было удалено", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10006": "Правило переадресации портов [uuid:%s] не включено, текущее состояние %s", + "ORG_ZSTACK_KVM_10059": "виртуальная машина[uuid:%s] не в состоянии Работает или Остановлена, текущее состояние[%s]", + "ORG_ZSTACK_TICKET_10000": "заявка[uuid:%s, name:%s] может быть обновлена только после ее отмены; текущее состояние %s", + "ORG_ZSTACK_TICKET_10001": "операция отклонена. операция должна быть выполнена учетной записью/виртуальным идентификатором[uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10017": "получить токен от SDN контроллера [IP:%s] не удалось получить данные", + "ORG_ZSTACK_MEVOCO_10086": "Виртуальная машина[uuid:%s] прекратила работу. Повторите попытку позже.", + "ORG_ZSTACK_STORAGE_BACKUP_10056": "Текущая виртуальная машина[UUID: %s] тома[UUID: %s] больше не является виртуальной машиной[UUID: %s], которая использовалась для резервного копирования", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10003": "Невозможно выполнить поток сопоставления LUN с хостом, так как метаданные ссылки хоста основного хранилища пусты. Пожалуйста, проверьте конфигурацию хоста и убедитесь, что необходимые метаданные заполнены.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10018": "получить токен от sdn контроллера [ip:%s] не удалось, так как %s", + "ORG_ZSTACK_MEVOCO_10085": "Не удается найти снимки тома с UUID [uuid: %s]. Возможно, нет цепочки снимков, требующей проверки.", + "ORG_ZSTACK_STORAGE_BACKUP_10055": "снимок корневого тома группы[uuid:%s] не найден", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10000": "Невозможно выполнить сопоставление логического устройства с хостом из-за пустого серверного устройства.%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10015": "невозможно удалить логический маршрутизатор Huawei [UUID:%s], так как он связан с сетью L3 [UUID:%s]", + "ORG_ZSTACK_MEVOCO_10084": "не удается найти последний снимок из тома [uuid: %s]. Возможно, цепочка снимков для проверки не существует.", + "ORG_ZSTACK_STORAGE_BACKUP_10054": "Резервный том не найден для группы UUID: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10016": "не удалось получить токен SDN-контроллера [IP:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10001": "Невозможно выполнить сопоставление LUN с хостом, так как ссылка на хост PS равна null. Пожалуйста, убедитесь, что ссылка на хост правильно установлена.", + "ORG_ZSTACK_MEVOCO_10083": "не удается найти указанный снимок в дереве снимков тома [UUID: %s]. Возможно, цепочка снимков, которую необходимо проверить, не существует.", + "ORG_ZSTACK_STORAGE_BACKUP_10053": "Ресурс [uuid: %s] уже инициировал задачу CDP; поэтому задание резервного копирования не может быть создано одновременно.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10006": "Не удалось добавить KVM-хост [UUID: %s] в блочное основное хранилище [UUID: %s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10009": "правило переадресации портов [uuid:%s] не включено, текущее состояние %s. Правило может быть прикреплено только если его состояние включено.", + "ORG_ZSTACK_STORAGE_BACKUP_10052": "Не удалось создать резервные копии для ВМ[uuid:%s], так как она не находится в состоянии[%s, %s]", + "ORG_ZSTACK_MEVOCO_10089": "Невозможно создать снимок для томов[%s], так как том[UUID: %s] определен несколько раз", + "ORG_ZSTACK_STORAGE_BACKUP_10051": "Том[uuid: %s] не является корневым томом", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10019": "не удалось удалить токен SDN-контроллера [IP:%s] по причине %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10004": "Невозможно выполнить сопоставление тома с хостом из-за неверного идентификатора тома.%s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10007": "правило переадресации портов [uuid:%s] не присоединено ни к одному сетевому интерфейсу виртуальной машины, невозможно отсоединить", + "ORG_ZSTACK_MEVOCO_10088": "невозможно создать снимок для томов[%s], так как том[uuid: %s] не подключен", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10005": "Невозможно выполнить сопоставление LUN с хостом из-за неверного типа LUN: %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10008": "правило переадресации портов [uuid:%s] уже связано с сетевым интерфейсом ВМ [uuid:%s], не может быть переназначено повторно", + "ORG_ZSTACK_MEVOCO_10087": "Работающая ВМ[uuid:%s] не имеет связанного UUID хоста.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10020": "не удалось получить арендатора SDN-контроллера [IP:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10021": "не удалось получить арендатора SDN-контроллера [IP:%s] по причине %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10019": "блочное основное хранилище [uuid:%s, name:%s] не может найти доступный хост в присоединенных кластерах для создания экземпляра тома", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10024": "Не удалось получить логический порт коммутатора от SDN-контроллера [IP:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10047": "невозможно подключить том данных [uuid:%s] к ВМ [uuid:%s]. И корневой том ВМ, и том данных расположены на локальном основном хранилище, но находятся на разных хостах. Корневой том [uuid:%s] размещен на хосте [uuid:%s], тогда как том данных [uuid:%s] размещен на хосте [uuid:%s].", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10025": "не удалось получить информацию о порте коммутатора от SDN-контроллера [ip:%s] по причине %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10048": "Том данных [name: %s, UUID: %s] расположен на локальном хранилище [UUID: %s]; однако хост, на котором находится том данных, был удален. Восстановление этого тома невозможно.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10022": "не удалось получить устройство коммутатора от SDN-контроллера [ip:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10069": "В настоящее время ВМ создает задание резервного копирования, и задача CDP не может быть включена одновременно. Пожалуйста, убедитесь, что все задания резервного копирования завершены перед включением CDP.", + "ORG_ZSTACK_KVM_10070": "не удалось завершить работу виртуальной машины[uuid:%s name:%s] на KVM-хосте[uuid:%s, ip:%s] по причине %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10049": "невозможно восстановить ВМ[uuid:%s, name:%s]. Корневой том ВМ расположен на локальном хранилище[uuid:%s]; однако хост, на котором находится корневой том, был удален.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10023": "не удалось получить устройство коммутатора от SDN-контроллера [IP:%s] по причине %s", + "ORG_ZSTACK_STORAGE_BACKUP_10068": "Кластер хостов [uuid: %s] не расположен в том же месте, что и кластер томов [uuid: %s]. Пожалуйста, убедитесь, что основное хранилище находится в том же кластере.", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10020": "ВМ [Name: %s UUID: %s] уже имеет правила переадресации портов с отличными VIP от [UUID: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10044": "создание зависит от кэша образов [uuid: %s, расположенные хосты uuids: [%s]], невозможно создать в другом месте.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10045": "локальное хранилище не поддерживает живую миграцию для гипервизора[%s]", + "ORG_ZSTACK_KVM_10075": "не удалось остановить vm[uuid:%s name:%s] на хосте kvm[uuid:%s ip:%s], потому что %s", + "ORG_ZSTACK_KVM_10078": "хост[uuid:%s] не имеет достаточной емкости для выделения cpu[%s] и памяти[%s bytes].", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10017": "диапазон портов VIP [vipStartPort:%s, vipEndPort:%s] пересекается с сетевым правилом [uuid:%s, vipStartPort:%s, vipEndPort:%s]", + "ORG_ZSTACK_KVM_10069": "не удалось подключить том данных[uuid:%s, installPath:%s] к vm[uuid:%s, name:%s] на хосте KVM[uuid:%s, ip:%s], потому что %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10014": "неверный CIDR[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10015": "неверный CIDR[%s], поддерживаются только IPv4-адреса", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10012": "невозможно создать правило переадресации портов, потому что диапазон портов VIP [vipStartPort:%s, vipEndPort:%s] несовместим с частным диапазоном портов [privateStartPort:%s, privateEndPort:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10010": "невозможно найти SCSI LUN для списка томов:%s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10013": "для диапазонной переадресации портов размеры диапазонов портов должны совпадать; размер диапазона VIP [%s, %s] не совпадает с [%s, %s]", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10010": "l3 сеть VM NIC и l3 сеть VIP правила переадресации портов являются одной и той же сетью (uuid: %s, uuid: %s)", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10028": "получение fabric от SDN-контроллера [ip:%s] не удалось", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10013": "Операция создания снимков томов на нескольких хостах одновременно с использованием Ceph не поддерживается.", + "ORG_ZSTACK_MEVOCO_10097": "Предоставленный фрагмент кода Java отсутствует в исходном файле. Пожалуйста, убедитесь, что все необходимые файлы включены, и перекомпилируйте. Кроме того, сообщение об ошибке \"unknown message version\" указывает на неподдерживаемый или неопознанный формат сообщения. Пожалуйста, проверьте версию сообщения и убедитесь, что она совместима с системой.", + "ORG_ZSTACK_STORAGE_BACKUP_10067": "Не найдена доступная корзина объектного хранилища для операций резервного копирования. Пожалуйста, убедитесь, что ваш сервис объектного хранения правильно настроен и доступен в облачной среде.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10014": "Не удалось сопоставить LUN с хостом перед подключением тома к ВМ", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10029": "получение сети fabric от SDN-контроллера [ip:%s] не удалось, потому что %s", + "ORG_ZSTACK_MEVOCO_10096": "учетная запись неадминистратора не может превышать максимальный предел пропускной способности %s", + "ORG_ZSTACK_STORAGE_BACKUP_10066": "ВМ не находится в состоянии остановки: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10026": "получение VPC от SDN-контроллера [IP:%s] не удалось", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10011": "не удалось обменяться информацией о блочном SCSI LUN:%s", + "ORG_ZSTACK_MEVOCO_10095": "SetVolumeQosMsg версия 1 устарела в облачных вычислениях; пожалуйста, перейдите на версию 2 для оптимальной производительности и совместимости.", + "ORG_ZSTACK_STORAGE_BACKUP_10065": "ВМ не найдена с резервной копией тома [uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10027": "получение VPC от SDN-контроллера [IP:%s] не удалось, потому что %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10012": "не удалось очистить ресурсы после отключения тома, потому что %s", + "ORG_ZSTACK_MEVOCO_10094": "Невозможно удалить QoS тома ВМ на хосте %s, потому что текущая ВМ находится в состоянии %s, но поддерживаемые состояния [%s, %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10064": "исходный том[uuid:%s] для резервной копии[uuid:%s] больше не подключен к виртуальной машине[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10063": "Оригинальный снимок для резервного копирования[uuid:%s] был удален, невозможно восстановить том до него", + "ORG_ZSTACK_MEVOCO_10099": "Учетная запись без прав администратора может установить только общий лимит %s для виртуальных ресурсов.", + "ORG_ZSTACK_STORAGE_BACKUP_10061": "Резервная копия тома [uuid:%s] в данный момент находится в состоянии %s и не может быть использована для восстановления тома.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10016": "primaryStorageUuid является обязательным при загрузке кэша образов.", + "ORG_ZSTACK_MEVOCO_10098": "Указан неизвестный тип ограничения Quality of Service (QoS). Пожалуйста, убедитесь, что тип ограничения QoS настроен правильно.", + "ORG_ZSTACK_STORAGE_BACKUP_10060": "Невозможно создать ВМ из резервной копии тома [uuid:%s], которая не является резервной копией корневого тома", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10017": "ВМ имеет несколько локальных томов на разных хостах [%s]. Пожалуйста, проверьте аномальные локальные тома ВМ.", + "ORG_ZSTACK_STORAGE_CEPH_10004": "Неверный URL мониторинга[%s], имя хоста не может быть пустым. Допустимый формат URL мониторинга: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10032": "Получить логический переключатель iMaster [%s] нет ответа", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10018": "Том на хосте [Host UUID: %s] не может быть подключен к ВМ, поскольку ВМ имеет локальные тома на других хостах [Host UUID: %s].", + "ORG_ZSTACK_STORAGE_CEPH_10005": "Неверный URL мониторинга[%s], порт SSH выходит за пределы допустимого диапазона (1-65535). Допустимый URL мониторинга должен быть в формате %s", + "ORG_ZSTACK_STORAGE_CEPH_10002": "Неверный URL мониторинга[%s], компонент SSH имя пользователя:SSH пароль недействителен. Допустимый формат URL мониторинга: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10030": "Создание Huawei iMaster Logical Switch [%s] не удалось из-за %s", + "ORG_ZSTACK_STORAGE_CEPH_10003": "Неверный URL мониторинга[%s]. Имя пользователя SSH и пароль должны быть разделены ':' и не могут быть пустыми. Допустимый формат URL мониторинга: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10035": "[%s] Huawei iMaster Virtual Switch Port [%s] не удалось из-за %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10013": "Два кластера с UUID %s и %s не могут взаимодействовать в сети L2 при миграции ВМ с UUID %s в другой кластер.", + "ORG_ZSTACK_STORAGE_CEPH_10008": "Пул Ceph с UUID:%s уже существует и используется в другом месте в среде ZStack; поэтому он не может быть повторно использован.", + "ORG_ZSTACK_STORAGE_BACKUP_10038": "неверный url[%s], должен быть в формате hostname:/path", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10036": "получить информацию о порте логического переключателя для логического переключателя[%s] не удалось из-за %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10014": "URL[%s] не является допустимым абсолютным путем, начинающимся с '/'. Пожалуйста, убедитесь, что он начинается с 'http://' или 'https://'.", + "ORG_ZSTACK_STORAGE_CEPH_10009": "невозможно добавить Ceph основное хранилище, так как оно в настоящее время используется MON хостами [%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10037": "неверный тип монтирования[%s], должен быть [NFS, SSHFS, NBD]", + "ORG_ZSTACK_STORAGE_CEPH_10006": "ошибка операции: имя пула не может содержать непечатаемые ASCII символы [poolName:%s]", + "ORG_ZSTACK_KVM_10080": "Если платформа ВМ Other, количество dataVolumes и cdrom не может превышать 3; в данный момент %s.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10033": "удаление Huawei iMaster Virtual Switch [%s] не удалось из-за %s", + "ORG_ZSTACK_STORAGE_BACKUP_10036": "степень [%s] должна быть положительным целым числом", + "ORG_ZSTACK_STORAGE_CEPH_10007": "ошибка создания, дублирующееся имя пула[%s]. Пул с таким именем уже существует[uuid:%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10016": "Хост виртуальной машины [hostUuid:%s] отличается от хоста тома [hostUuid:%s]. Том не может быть подключен к виртуальной машине.", + "ORG_ZSTACK_STORAGE_BACKUP_10035": "[%s] не является стандартным CIDR, вы имели в виду [%s]?", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10034": "обновление Huawei iMaster Logical Switch [%s] не удалось из-за %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10010": "Том с UUID [%s] является корневым томом ВМ с UUID [%s]. В настоящее время к ВМ все еще прикреплено %s томов данных; открепите их перед миграцией.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10011": "Том [UUID:%s] является корневым томом ВМ [UUID:%s]. В настоящее время к виртуальной машине все еще прикреплен ISO; открепите его перед миграцией.", + "ORG_ZSTACK_KVM_10088": "не удалось проверить физические сетевые интерфейсы[имена: %s] на KVM-хосте[UUID:%s, IP:%s]", + "ORG_ZSTACK_KVM_10079": "Не удалось обновить конфигурацию канала Spice на хосте[%s], потому что %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10021": "том: %s не прикреплен, не удалось создать кэш образов для тома", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10024": "не удалось найти путь установки для загрузки тома: %s, подготовьте его перед продолжением", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10039": "не удалось удалить Huawei iMaster NCE Logical Router[%s], потому что %s", + "ORG_ZSTACK_MEVOCO_10064": "networkInboundBandwidthFormatError %s", + "ORG_ZSTACK_STORAGE_BACKUP_10034": "Резервная копия тома [uuid:%s] не найдена ни на одном носителе", + "ORG_ZSTACK_MEVOCO_10063": "Превышена максимальная пропускная способность входящего трафика 32 Гбит/с", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10025": "не удалось найти хост для загрузки тома %s", + "ORG_ZSTACK_STORAGE_BACKUP_10033": "Нет разрешения на резервные копии томов в группе UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10022": "невозможно найти целевой хост для тома: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10037": "не удалось удалить Huawei iMaster Virtual Switch Port [%s], потому что %s", + "ORG_ZSTACK_STORAGE_BACKUP_10032": "Обнаружено несколько корневых дисков в группе uuid: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10023": "Не удалось найти хост для сопоставления тома %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10038": "создание Huawei iMaster Virtual Router[%s] не удалось, потому что %s", + "ORG_ZSTACK_MEVOCO_10061": "статус узла управления не %s", + "ORG_ZSTACK_STORAGE_BACKUP_10031": "Отсутствует корневой том в группе UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10026": "Не удалось получить ссылку инициатора хоста, переподключите этот хост: %s", + "ORG_ZSTACK_MEVOCO_10066": "networkOutboundBandwidthFormatError %s", + "ORG_ZSTACK_MEVOCO_10065": "пропускная способность исходящего трафика превышает максимальное значение 32 Гбит/с", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10042": "создание Huawei IMaster subnet[%s] не удалось, потому что %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10028": "не удалось загрузить образ[uuid:%s] на все хосты в локальном хранилище[uuid:%s]. %s", + "ORG_ZSTACK_STORAGE_CEPH_10015": "неверный monUrl[%s]. Допустимый URL должен быть в формате %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10043": "удаление Huawei iMaster subnet[%s] не удалось, потому что %s", + "ORG_ZSTACK_STORAGE_CEPH_10016": "dataVolumePoolName может быть null, но не должен быть пустой строкой.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10040": "создание Huawei iMaster virtual network link[%s] не удалось, потому что %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10041": "удаление Huawei iMaster virtual network link[%s] не удалось, потому что %s", + "ORG_ZSTACK_STORAGE_CEPH_10019": "невозможно добавить Ceph backup storage, так как уже существует Ceph backup storage с mon[имена хостов:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10046": "Не был создан новый виртуальный сетевой интерфейс, чего не должно происходить.", + "ORG_ZSTACK_MEVOCO_10082": "Не удалось установить привязку [%s] для I/O потока [%d] на виртуальной машине [%s]: %s.", + "ORG_ZSTACK_STORAGE_BACKUP_10049": "Не удалось создать резервную копию тома[uuid:%s], так как присоединенный том не находится в состоянии[%s, %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10025": "Основное хранилище [UUID:%s] отключено; холодная миграция не разрешена.", + "ORG_ZSTACK_STORAGE_BACKUP_10048": "Не удалось создать резервную копию тома[uuid:%s], так как ВМ не находится в состоянии[%s, %s].", + "ORG_ZSTACK_STORAGE_CEPH_10017": "rootVolumePoolName может быть null, но не должен быть пустой строкой.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10026": "том[uuid:%s] больше не присоединен к локальному хранилищу, он мог быть удален или отсоединен.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10044": "Не удалось получить системную информацию SDN контроллера [IP:%s].", + "ORG_ZSTACK_STORAGE_BACKUP_10047": "Не удалось создать резервную копию тома[uuid:%s], так как он не присоединен ни к одной ВМ.", + "ORG_ZSTACK_STORAGE_CEPH_10018": "imageCachePoolName может быть null, но не должен быть пустой строкой.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10045": "Не удалось получить системную информацию SDN контроллера [IP:%s] по причине: %s.", + "ORG_ZSTACK_STORAGE_BACKUP_10046": "Невозможно создать резервную копию для общего тома[uuid:%s].", + "ORG_ZSTACK_KVM_10093": "Не удалось подключиться к KVM хосту[uuid:%s, ip:%s, url:%s], причина: %s.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10022": "Для создания тома на локальном основном хранилище необходимо указать хост, где том будет создан, используя системный тег [%s].", + "ORG_ZSTACK_KVM_10096": "хост не имеет доступа ни к одному основному хранилищу, проверьте конфигурацию хранилища или обратитесь в поддержку %s.", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10023": "Неверный формат URI. Правильные примеры: file://$URL, hostUuid://$HOSTUUID, или volume://$VOLUMEUUID.", + "ORG_ZSTACK_STORAGE_CEPH_10012": "Один и тот же Mono узел не может быть добавлен несколько раз.", + "ORG_ZSTACK_KVM_10099": "SSH порт[%s] хоста[%s] недоступен после %s секунд, превышено время ожидания подключения.", + "ORG_ZSTACK_STORAGE_CEPH_10010": "Невозможно добавить тот же хост [%s] в кластерные mon-узлы.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10031": "Резервное копирование снимков в хранилище резервных копий - устаревшая функция и не поддерживается на блочном основном хранилище.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10032": "Не удалось найти кластер для фиксации тома на ps:%s.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10035": "UUID основного хранилища обязателен при удалении LUN.", + "ORG_ZSTACK_MEVOCO_10075": "Общие диски в настоящее время поддерживают только тип virtio-scsi.", + "ORG_ZSTACK_STORAGE_BACKUP_10045": "Обнаружено неожиданное хранилище резервных копий[type:%s,uuid:%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10036": "UUID хоста обязателен при получении имени инициатора хоста.", + "ORG_ZSTACK_MEVOCO_10074": "Общий том[uuid:%s] уже присоединен к виртуальной машине[uuid:%s].", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10048": "Новый виртуальный сетевой интерфейс не создан, чего не должно происходить.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10033": "Не удалось найти хост для фиксации тома:%s.", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10034": "Не удалось загрузить[%s] с хранилища резервных копий[hostname:%s] на блочное основное хранилище[uuid:%s, path:%s], %s.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10049": "На контроллере [ip:%s] не настроена SDN-фабрика.", + "ORG_ZSTACK_MEVOCO_10078": "Текущая версия лицензии не поддерживает изменение конфигурации данного ресурса [name:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10037": "initiatorName %s уже используется другим хостом, пожалуйста, пересоздайте инициатор для хоста %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10038": "не удалось найти шаблон тома по имени:%s", + "ORG_ZSTACK_MEVOCO_10076": "Общие тома [UUID: %s] подключены; групповой снапшот не поддерживается.", + "ORG_ZSTACK_AI_MESSAGE_10002": "Невозможно отменить задачу создания набора данных, так как ресурс UUID[%s] или UUID центра моделей[%s] имеет значение null", + "ORG_ZSTACK_AI_MESSAGE_10001": "Невозможно отменить задачу загрузки сервиса модели, так как ресурс UUID[%s] или UUID центра моделей[%s] имеет значение null", + "ORG_ZSTACK_IPSEC_VYOS_10009": "применение к группе HA не удалось из-за %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10013": "Не удалось выполнить HTTP-вызовы ко всем экземплярам Prometheus в облачной среде.", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10012": "неизвестный тип данных %s для ключа = %s", + "ORG_ZSTACK_ENCRYPT_10000": "не удалось разобрать API-сообщение: невозможно разобрать параметр шифрования с типом %s", + "ORG_ZSTACK_ENCRYPT_10002": "не удалось разобрать API-сообщение: найдено %d параметров шифрования в системных тегах, ожидается 1", + "ORG_ZSTACK_IPSEC_VYOS_10001": "VYOS не поддерживает AES-192 как алгоритм шифрования IKE; доступные варианты: AES-128 и AES-256.", + "ORG_ZSTACK_IPSEC_VYOS_10000": "удаленный CIDR [%s] перекрывается с CIDR интерфейса виртуального маршрутизатора [%s]", + "ORG_ZSTACK_IPSEC_VYOS_10003": "vyos не поддерживает %d как группу DH IKE", + "ORG_ZSTACK_IPSEC_VYOS_10002": "vyOS не поддерживает AES-192 как PolicyEncryptionAlgorithm; доступные варианты: AES-128, AES-256 и 3DES.", + "ORG_ZSTACK_COMPUTE_VM_10000": "состояние VM[uuid:%s] не является Running; поэтому синхронизация часов невозможна.", + "ORG_ZSTACK_COMPUTE_VM_10008": "vm[uuid:%s] является частью кластера[uuid:%s], но в кластере нет доступных хостов. Поэтому изменение образа для данной vm невозможно.", + "ORG_ZSTACK_COMPUTE_VM_10007": "vm[uuid:%s] UUID кластера равен null, невозможно изменить образ", + "ORG_ZSTACK_COMPUTE_VM_10006": "Состояние VM не является Stopped: %s. Действие 'changevmimage' не может быть выполнено.", + "ORG_ZSTACK_COMPUTE_VM_10005": "XML-хук с UUID: %s успешно присоединен к VM с UUID: %s, но не удалось перезапустить VM. Подробности: %s", + "ORG_ZSTACK_COMPUTE_VM_10004": "XML-хук с UUID: %s успешно отсоединен от VM с UUID: %s, но возникли проблемы при перезапуске VM. Подробности: %s", + "ORG_ZSTACK_COMPUTE_VM_10003": "Hot-adding не отключен; пожалуйста, убедитесь, что конфигурация NUMA установлена перед открытием виртуальной машины.", + "ORG_ZSTACK_COMPUTE_VM_10011": "Параметр direction должен быть установлен в значение IN или OUT.", + "ORG_ZSTACK_COMPUTE_VM_10010": "не удалось найти хранилище резервных копий, невозможно зафиксировать снапшот тома[psUuid:%s] как образ, требуется UUID целевого PS:%s", + "ORG_ZSTACK_COMPUTE_VM_10018": "Ошибка проверки состояния при операции смены пароля.%s", + "ORG_ZSTACK_COMPUTE_VM_10017": "целевой хост не найден в базе данных по UUID: %s, невозможно отправить команду смены пароля хосту!", + "ORG_ZSTACK_STORAGE_DEVICE_10036": "сканирование hba не удалось: %s", + "ORG_ZSTACK_COMPUTE_VM_10015": "UUID хоста vm [%s] равен null, невозможно синхронизировать качество обслуживания сети", + "ORG_ZSTACK_COMPUTE_VM_10014": "vm [%s] должен находиться в состоянии Running или Paused для синхронизации настроек QoS сетевого интерфейса", + "ORG_ZSTACK_STORAGE_DEVICE_10031": "vm instance[uuid: %s] host[uuid: %s] не удалось присоединить SCSI lun[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10013": "Исходящая пропускная способность должна быть установлена не более %s.", + "ORG_ZSTACK_COMPUTE_VM_10012": "Входящая пропускная способность должна быть установлена не более %s Гбит/с.", + "ORG_ZSTACK_STORAGE_DEVICE_10030": "Экземпляр ВМ[%s] находится в состоянии [%s], которое не допускается для указанной операции[%s]", + "ORG_ZSTACK_COMPUTE_VM_10022": "Не удалось установить уровень безопасности, так как функции безопасности отключены. Перед выполнением этой настройки убедитесь, что функции безопасности включены.", + "ORG_ZSTACK_COMPUTE_VM_10020": "Количество томов данных превышает установленный лимит [номер: %s]. Пожалуйста, уменьшите количество томов данных при создании виртуальной машины.", + "ORG_ZSTACK_STORAGE_DEVICE_10028": "Указанный SCSI LUN [WWID: %s] не существует или отключен", + "ORG_ZSTACK_STORAGE_DEVICE_10029": "scsi[%s] lun[wwid:%s] уже подключен к ВМ[%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10026": "Обнаружены разные конфигурации iSCSI на хосте [UUID:%s, targets:%s] и хосте [UUID:%s, targets:%s].", + "ORG_ZSTACK_STORAGE_DEVICE_10027": "Обнаружены разные типы дисков на хостах для LUN [serial:%s], невозможно подключить его к кластеру.", + "ORG_ZSTACK_COMPUTE_VM_10029": "Невозможно клонировать ВМ, так как указан префикс для сети[uuid:%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10024": "Запись SCSI LUN[%(s)s] не найдена на хосте [%(s)s]", + "ORG_ZSTACK_COMPUTE_VM_10028": "Невозможно клонировать ВМ, так как адрес IPv6[%s] недействителен", + "ORG_ZSTACK_STORAGE_DEVICE_10025": "Неожиданный тип гипервизора[%s] для хоста виртуальной машины [%s]", + "ORG_ZSTACK_COMPUTE_VM_10027": "Невозможно клонировать ВМ, так как указан сетевой маска для сети[uuid:%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10022": "Обнаружены разные цели NVMe на хосте[hostUuid:%s, targets:%s] и хосте[hostUuid:%s, targets:%s]", + "ORG_ZSTACK_COMPUTE_VM_10026": "Невозможно клонировать ВМ, так как указанный IP-адрес[%s] недействителен", + "ORG_ZSTACK_STORAGE_DEVICE_10023": "SCSI LUN[%s] подключен к виртуальной машине [%s]", + "ORG_ZSTACK_COMPUTE_VM_10025": "Невозможно клонировать ВМ, так как сеть уровня 3[uuid:%s] не найдена", + "ORG_ZSTACK_STORAGE_DEVICE_10020": "Экземпляр ВМ[%s] находится в состоянии[%s], которое не допускается для операции[%s]", + "ORG_ZSTACK_COMPUTE_VM_10024": "Неизвестный код уровня безопасности[%s], поддерживаемые значения [0-7]", + "ORG_ZSTACK_STORAGE_DEVICE_10021": "Экземпляр ВМ[%s] не удалось подключить SCSI LUN[uuid: %s] к хосту[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10023": "Невозможно установить уровень безопасности для неактивной ВМ [uuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10002": "Текущее основное хранилище %s не имеет настроенного токена третьей стороны, поэтому временно невозможно создать блочный том.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10001": "Недействительный URL выделенного виртуального ресурса:%s", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10000": "Ошибка выделения URL. Пожалуйста, убедитесь, что URL правильный и доступный. Если проблема не устранена, обратитесь в службу поддержки за дальнейшей помощью.", + "ORG_ZSTACK_STORAGE_DEVICE_10017": "SCSI LUN[wwid:%s] уже подключен к ВМ[%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10015": "scisLun[uuids:%s] не подключены к кластеру хоста[uuid:%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10016": "Пожалуйста, отключите все блочные устройства, связанные с ВМ[%s], и попробуйте снова", + "ORG_ZSTACK_STORAGE_DEVICE_10014": "SCSI LUN[wwid: %s] уже подключен к экземпляру виртуальной машины %s", + "ORG_ZSTACK_STORAGE_DEVICE_10011": "iSCSI сервер [UUID: %s] не связан с кластером [UUID: %s]", + "ORG_ZSTACK_STORAGE_DEVICE_10012": "iSCSI-сервер [UUID: %s] всё ещё связан с кластером [UUID: %s]", + "ORG_ZSTACK_STORAGE_DEVICE_10010": "iSCSI-сервер [UUID: %s] уже присоединён к кластеру [UUID: %s]", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10008": "локальный CIDR и удалённый CIDR должны быть допустимыми диапазонами CIDR!", + "ORG_ZSTACK_NETWORK_SERVICE_HEADER_NFVINSTGROUP_10000": "Запрос статуса кластера не поддерживается для этого типа экземпляра NFV.", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10001": "VPN-шлюз [%s] существует, невозможно удалить удалённо.", + "ORG_ZSTACK_STORAGE_DEVICE_10008": "iSCSI-сервер [IP: %s, Port: %s] уже существует", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10005": "%s не является допустимым IPv4-адресом для конфигураций облачного развёртывания", + "ORG_ZSTACK_STORAGE_DEVICE_10009": "IP-адрес iSCSI-сервера: %s недействителен", + "ORG_ZSTACK_STORAGE_DEVICE_10006": "NVMe-сервер с UUID: %s уже присоединён к кластеру с UUID: %s", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10007": "удалённый CIDR должен быть допустимой нотацией CIDR!", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10006": "localCidr должен быть допустимым CIDR!", + "ORG_ZSTACK_STORAGE_DEVICE_10004": "NVMe-сервер [ip: %s, port: %s, transport: %s] уже существует в облачной среде.", + "ORG_ZSTACK_STORAGE_DEVICE_10005": "IP-адрес NVMe-сервера: %s недействителен", + "ORG_ZSTACK_STORAGE_DEVICE_10003": "миграция ВМ [uuid:%s] с общим хранилищем не поддерживается", + "ORG_ZSTACK_STORAGE_DEVICE_10000": "SCSI LUN с uuid: %s и uuid: %s не имеют общего хоста", + "ORG_ZSTACK_STORAGE_DEVICE_10001": "SCSI LUN [uuid: %s] находится в отключённом состоянии", + "ORG_ZSTACK_ALIYUN_NETWORK_VPN_10000": "VPN-шлюз и пользовательский шлюз должны быть в одном дата-центре.", + "ORG_ZSTACK_IPSEC_VYOS_10016": "создание ipsec для HA-маршрута не удалось из-за %s", + "ORG_ZSTACK_IPSEC_VYOS_10015": "удаление ipsec из HA-группы не удалось из-за %s", + "ORG_ZSTACK_COMPUTE_BONDING_10001": "интерфейс уже создан на хосте", + "ORG_ZSTACK_COMPUTE_BONDING_10008": "bonding-карта не может иметь интерфейсы в bond с разными скоростями на хосте[%s].", + "ORG_ZSTACK_COMPUTE_BONDING_10007": "невозможно иметь интерфейс[%s] в bond, который был виртуализирован SRIOV.", + "ORG_ZSTACK_COMPUTE_BONDING_10006": "невозможно иметь интерфейсы в bond, который использовался как сетевой мост, уже используемый хостом[%s].", + "ORG_ZSTACK_COMPUTE_BONDING_10005": "невозможно иметь занятые интерфейсы в bond, который уже используется хостом[%s].", + "ORG_ZSTACK_IPSEC_VYOS_10012": "обновление версии ipsec не удалось: vpc[%s] не существует", + "ORG_ZSTACK_COMPUTE_BONDING_10009": "на хосте[uuid:%s] нет slave сетевого интерфейса", + "ORG_ZSTACK_IPSEC_VYOS_10013": "синхронизация с HA-группой не удалась из-за:%s", + "ORG_ZSTACK_MEVOCO_10105": "Учётная запись без прав администратора не может устанавливать лимиты чтения/записи %s больше: %s/%s", + "ORG_ZSTACK_SIMULATOR_10002": "Экземпляр переведён в отключённое состояние", + "ORG_ZSTACK_MEVOCO_10104": "Учётная запись без прав администратора не может установить неограниченный лимит записи [storage limit].", + "ORG_ZSTACK_MEVOCO_10103": "Неадминистративная учетная запись не может установить неограниченные лимиты на чтение I/O.", + "ORG_ZSTACK_MEVOCO_10102": "Неадминистративной учетной записи разрешается настраивать только лимиты чтения/записи %s.", + "ORG_ZSTACK_MEVOCO_10109": "UUID хоста vm [%s] имеет значение null, невозможно синхронизировать качество обслуживания тома", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10016": "Тест подключения FiSecClientFactory не пройден", + "ORG_ZSTACK_MEVOCO_10108": "vm [%s] должен находиться в состоянии Running или Paused для синхронизации качества обслуживания тома", + "ORG_ZSTACK_MEVOCO_10107": "том [%s] не подключен ни к одной виртуальной машине (или виртуальная машина не существует), невозможно синхронизировать качество обслуживания тома", + "ORG_ZSTACK_SIMULATOR_10004": "Ошибка \"on purpose\" указывает на преднамеренное действие, а не на сбой системы. Пожалуйста, предоставьте дополнительные сведения о предполагаемой цели для продолжения.", + "ORG_ZSTACK_MEVOCO_10106": "том [%s] не подключен ни к одной виртуальной машине; поэтому качество обслуживания (QoS) не может быть получено через forceSync.", + "ORG_ZSTACK_MEVOCO_10101": "Учетная запись без прав администратора не может установить общий лимит %s больше, чем: %s", + "ORG_ZSTACK_MEVOCO_10100": "Учетная запись без прав администратора не может установить общие лимиты %s как бесконечные.", + "ORG_ZSTACK_COMPUTE_BONDING_10011": "Невозможно выполнить привязку к интерфейсу, настроенному с IP-адресом VTEP. Пожалуйста, убедитесь, что IP VTEP настроен правильно и доступен.", + "ORG_ZSTACK_COMPUTE_BONDING_10010": "Невозможно выполнить привязку к интерфейсу, соответствующему сети управления. Пожалуйста, убедитесь, что виртуальный сетевой интерфейс настроен правильно и соответствует указанной сети управления.%s", + "ORG_ZSTACK_COMPUTE_BONDING_10015": "Карта bonding не может иметь интерфейс[%s], который был виртуализирован SR-IOV", + "ORG_ZSTACK_COMPUTE_BONDING_10014": "Карта bonding не может иметь интерфейсы, которые использовались как сетевой мост, который уже использовался хостом[%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10013": "Карта bonding не может иметь занятые интерфейсы, которые уже использовались хостом[%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10012": "невозможно иметь интерфейсы в bond, которые не находятся на том же хосте[%s].", + "ORG_ZSTACK_COMPUTE_BONDING_10019": "[bonding] не может иметь [%s] интерфейсов, их количество должно быть от 1 до 2", + "ORG_ZSTACK_COMPUTE_BONDING_10018": "[карта bonding] не может иметь [количество интерфейсов] установленное в [%s], это должно быть число от [1~8].", + "ORG_ZSTACK_COMPUTE_BONDING_10017": "[%s] интерфейс bonding не может указывать другую политику xmit_hash_policy, только режим 802.3ad поддерживает указание другой политики.", + "ORG_ZSTACK_COMPUTE_BONDING_10016": "Карта bonding не может иметь интерфейсы с разными скоростями на хосте[%s]", + "ORG_ZSTACK_MEVOCO_10113": "Volume[UUID:%s] использует протокол vhost-user, который несовместим с нативным асинхронным I/O. Пожалуйста, отключите aio.native или выберите другой протокол тома.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10003": "не удалось установить подключение к пулу секретных ресурсов[uuid: %s]", + "ORG_ZSTACK_MEVOCO_10112": "Текущая версия лицензии не поддерживает изменение этой глобальной конфигурации [name:%s].", + "ORG_ZSTACK_MEVOCO_10111": "не удалось отсоединить общий том от VMInstance: [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10005": "Инициализация клиента %s не пройдена: свойство пула секретных ресурсов недопустимо.", + "ORG_ZSTACK_MEVOCO_10110": "не удалось отсоединить общий том[uuid:%s] от Instance[uuid:%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10006": "Плагин (UUID: %s) не может быть удален, поскольку он связан со следующими пулами секретных ресурсов: [%s].", + "ORG_ZSTACK_MEDIATOR_10005": "VIP [UUID:%s] уже привязан к другой службе [%s].", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10007": "ID организации[uuid:%s] уже имеет атрибуты операции, невозможно добавить %s", + "ORG_ZSTACK_MEDIATOR_10006": "Текущий диапазон портов [%s, %s] конфликтует с диапазоном портов системной службы [%s, %s] для VIP [UUID: %s] протокол: %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10008": "Не удается найти зону с uuid:%s", + "ORG_ZSTACK_MEDIATOR_10007": "Текущий диапазон портов [%s, %s] конфликтует с используемым диапазоном портов [%s, %s] для VIP [UUID: %s] протокол: %s", + "ORG_ZSTACK_COMPUTE_VM_10080": "vm[uuid:%s] повторяющийся идентификатор устройства CD-ROM", + "ORG_ZSTACK_COMPUTE_VM_10077": "VM[uuid:%s] имеет подключенный ISO[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10074": "зарезервированная память[%s] превышает доступный размер памяти[%s]", + "ORG_ZSTACK_COMPUTE_VM_10073": "Неожиданные настройки ЦП и памяти. Пожалуйста, убедитесь, что указанные значения совместимы с вашим типом экземпляра и требованиями.", + "ORG_ZSTACK_COMPUTE_VM_10071": "не удалось найти хост для vm[uuid=%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10000": "виртуальный ID[uuid:%s] уже имеет атрибуты, связанные с администрированием; поэтому он не может быть назначен %s.", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10000": "зона идентичности [%s] уже существует, uuid: %s", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10001": "regionId: [%s] не является допустимым регионом Aliyun и ZStack, пожалуйста, выберите другой", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10002": "тип [%s] не соответствует ожидаемому типу центра обработки данных [%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10003": "проект[uuid:%s] уже имеет назначенного администратора проекта", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10003": "должен быть установлен либо UUID центра обработки данных, либо ID региона, пожалуйста, проверьте параметры.", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10004": "проект[uuid:%s] не существует", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10004": "Зона идентичности [%s] все еще синхронизируется, пожалуйста, подождите.", + "ORG_ZSTACK_COMPUTE_VM_10079": "нет доступного диапазона IP в сети L3 [%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10005": "виртуальный ID [UUID:%s] уже имеет атрибут оператора проекта.", + "ORG_ZSTACK_COMPUTE_VM_10078": "Все CD-ROM VM[UUID:%s] смонтировали образы ISO", + "ORG_ZSTACK_COMPUTE_VM_10090": "Не удалось создать том, так как хост VM [UUID: %s] и выделенное основное хранилище [UUID: %s] не подключены.", + "ORG_ZSTACK_COMPUTE_VM_10088": "текущее состояние vm[%s], изменение virtio требует, чтобы vm была в состоянии[%s]", + "ORG_ZSTACK_COMPUTE_VM_10084": "не удается найти ISO [UUID:%s] ни в одном подключенном резервном хранилище, связанном с зоной [UUID:%s]. Пожалуйста, проверьте следующее:", + "ORG_ZSTACK_COMPUTE_VM_10083": "1. Убедитесь, что резервное хранилище подключено к правильной зоне, где запущена VM [NAME: %s, UUID:%s].", + "ORG_ZSTACK_COMPUTE_VM_10081": "2. Подтвердите, что резервное хранилище находится в активном состоянии; если нет, попытайтесь переподключить его.", + "ORG_ZSTACK_KVM_HYPERVISOR_10000": "ни одно из указанных основных хранилищ%s не доступно", + "ORG_ZSTACK_COMPUTE_VM_10099": "создание зависит от кэша образа[uuid:%s, расположенный ps uuids: [%s]], невозможно создать в другом месте.", + "ORG_ZSTACK_COMPUTE_VM_10098": "Не удалось собрать информацию о виртуализации хоста", + "ORG_ZSTACK_COMPUTE_VM_10097": "Невозможно переключиться на сеть L3. Сеть L3 [uuid:%s] принадлежит сетям L2 [uuids:%s], которые не были подключены ни к одному кластеру.", + "ORG_ZSTACK_COMPUTE_VM_10096": "Невозможно переключиться на сеть L3. Указанная сеть L3 [uuid:%s] принадлежит другой сети L2 [uuids:%s].", + "ORG_ZSTACK_COMPUTE_VM_10094": "невозможно переключиться на сеть L3. Указанная сеть L3 [uuid:%s] не имеет настроенного диапазона IP.", + "ORG_ZSTACK_COMPUTE_VM_10093": "невозможно переключиться на сеть L3. VM [uuid: %s] не находится в состоянии Running или Stopped; текущее состояние %s", + "ORG_ZSTACK_COMPUTE_VM_10092": "Невозможно сделать снимок экрана ВМ [uuid:%s], которая не находится в состоянии Running.", + "ORG_ZSTACK_MEDIATOR_10002": "Невозможно подключить сеть уровня 3. CIDR сети L3 [%s] для подключения перекрывается с CIDR сети L3 [%s], уже подключенной к ВМ", + "ORG_ZSTACK_MEDIATOR_10003": "ВМ [name:%s, UUID:%s] уже имеет настроенные правила переадресации портов%s", + "ORG_ZSTACK_MEDIATOR_10004": "ВМ [name:%s, uuid:%s] уже имеет привязанные эластичные IP-адреса%s", + "ORG_ZSTACK_COMPUTE_VM_10033": "Невозможно клонировать ВМ, так как размер UUID L3 по умолчанию не равен 1", + "ORG_ZSTACK_COMPUTE_VM_10032": "Невозможно клонировать ВМ, так как состояние[%s] недопустимо", + "ORG_ZSTACK_COMPUTE_VM_10031": "Невозможно клонировать ВМ, так как тип драйвера[%s] недопустим", + "ORG_ZSTACK_COMPUTE_VM_10030": "Невозможно клонировать ВМ, так как тип Nic[%s] недопустим", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10002": "Обнаружены связанные пути в корзине (%s) в основном хранилище [%s] для пути установки миграции [%s]. Пожалуйста, очистите их сначала с помощью 'APICleanUpTrashOnPrimaryStorageMsg', если вы настаиваете на миграции тома [%s].", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10000": "Невозможно найти подключенный хост для выполнения операции миграции хранилища. Пожалуйста, убедитесь, что целевой хост доступен и правильно настроен в облачной среде.", + "ORG_ZSTACK_COMPUTE_VM_10039": "Операция допустима только для пользовательских экземпляров ВМ.", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10003": "Том [uuid:%s] имеет зависимость от образа [uuid:%s], другие зависимости включают образы[%s]", + "ORG_ZSTACK_COMPUTE_VM_10038": "Сетевой интерфейс %s не подключен к ВМ", + "ORG_ZSTACK_COMPUTE_VM_10037": "Недостаточно ресурсов емкости для клонирования ВМ [UUID: %s], томов [UUID: %s] на основном хранилище [UUID: %s]. Требуемая емкость составляет %s байт, тогда как текущая доступная емкость составляет %s байт.", + "ORG_ZSTACK_COMPUTE_VM_10036": "Быстрое создание ВМ поддерживает только клонирование тома данных на том же основном хранилище [UUID: %s], что и исходная ВМ [UUID: %s].", + "ORG_ZSTACK_COMPUTE_VM_10035": "Быстрое создание ВМ поддерживает только клонирование корневого тома на том же основном хранилище [UUID: %s], что и исходная ВМ [UUID: %s].", + "ORG_ZSTACK_COMPUTE_VM_10034": "Операция допустима только для пользовательских экземпляров ВМ.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10005": "Если тип кластера является baremetal, тип гипервизора также должен быть baremetal; и наоборот, если тип гипервизора является baremetal, тип кластера должен быть baremetal.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10008": "В кластере [uuid:%s] имеются хосты в состоянии Pre-Maintenance; поэтому обновление ОС в данный момент невозможно.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10009": "Не все хосты в кластере [uuid:%s] находятся в состоянии Active; поэтому права операционной системы кластера не могут быть обновлены в данный момент.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10006": "Только операционные системы виртуальных машин на базе KVM могут быть обновлены в данный момент.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10007": "Хост [UUID: %s] не является членом кластера [UUID: %s]. Пожалуйста, проверьте UUID хоста и убедитесь, что он принадлежит этому кластеру.", + "ORG_ZSTACK_COMPUTE_VM_10044": "Не изменяйте образ ВМ, когда он не находится в остановленном состоянии.", + "ORG_ZSTACK_COMPUTE_VM_10043": "Пользователь не имеет привилегий для изменения образа ВМ %s", + "ORG_ZSTACK_COMPUTE_VM_10042": "Очистка трафика не поддерживается для типа ВМ [%s]", + "ORG_ZSTACK_COMPUTE_VM_10041": "Дубликат MAC-адреса [%s]", + "ORG_ZSTACK_COMPUTE_CLUSTER_10000": "Доступ к памяти не должен быть общим, если огромные страницы отключены в кластере [uuid: %s]. Пожалуйста, включите огромные страницы с помощью UpdateResourceConfig [category=%s name=%s value=%s resourceUuid=%s] сначала.", + "ORG_ZSTACK_COMPUTE_VM_10040": "Операция допустима только когда состояние ВМ [%s] остановлено.", + "ORG_ZSTACK_COMPUTE_CLUSTER_10001": "Огромные страницы не должны быть отключены, если режим доступа к памяти установлен как общий в кластере [uuid:%s]. Пожалуйста, обновите режим доступа к памяти с помощью UpdateResourceConfig [category=%s name=%s value=%s resourceUuid=%s] сначала.", + "ORG_ZSTACK_COMPUTE_VM_10049": "Необходимо указать хотя бы один из параметров: UUID, облачная учетная запись или токен аутентификации.%s", + "ORG_ZSTACK_COMPUTE_VM_10048": "экземпляр[uuid:%s] не может быть изменен на образ[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10047": "vm[uuid:%s] не имеет сети L3 по умолчанию, поэтому не может изменить свой образ.", + "ORG_ZSTACK_COMPUTE_VM_10046": "Убедитесь, что последний хост VM [UUID:%s] находится в состоянии Running и Connected", + "ORG_ZSTACK_COMPUTE_VM_10045": "Убедитесь, что виртуальная машина первичного хранилища [UUID:%s] включена и подключена.", + "ORG_ZSTACK_IAM2_CONTAINER_10009": "не удалось открыть файл конфигурации Kubernetes: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10007": "Не удалось получить авторизованные проекты из-за нулевого содержимого", + "ORG_ZSTACK_COMPUTE_VM_10055": "Параметр 'uuids' должен ссылаться на сущность VmInstanceVO или HostVO.", + "ORG_ZSTACK_IAM2_CONTAINER_10008": "не удалось найти конфигурацию Kubernetes по пути: %s", + "ORG_ZSTACK_COMPUTE_VM_10054": "id сетевой карты: %s не существует в конфигурации виртуальной сети...", + "ORG_ZSTACK_IAM2_CONTAINER_10005": "Не удалось получить теги образа из-за нулевого ответа страницы. Проверьте API endpoint тегов образа и убедитесь, что он правильно настроен.", + "ORG_ZSTACK_COMPUTE_VM_10053": "Сетевая адаптерная карта не поддерживает одновременное применение настроек Quality of Service (QoS) с сервисом Port Mirroring.", + "ORG_ZSTACK_IAM2_CONTAINER_10006": "Не удалось получить образы из-за нулевого содержимого.%s", + "ORG_ZSTACK_COMPUTE_VM_10052": "исходящая и входящая пропускная способность должны быть указаны хотя бы в одном направлении.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10008": "связанная группа доступа уже: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10003": "не удалось настроить контейнеризированный кластер для проекта[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10051": "Количество мониторов должно быть одним из следующих: 1, 2 или 4.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10007": "цель монтирования nas [%s] уже существует в файловой системе: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10004": "Не удалось получить теги образа из-за нулевого содержимого.%s", + "ORG_ZSTACK_COMPUTE_VM_10050": "направление должно быть установлено в пределах (in, out), но было %s", + "ORG_ZSTACK_IAM2_CONTAINER_10001": "не удалось обновить квоту для контейнера %s", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10009": "правило группы доступа [%s] уже существует в группе доступа [%s]", + "ORG_ZSTACK_IAM2_CONTAINER_10002": "не удалось настроить контейнер проекта[uuid: %s], потому что проект не найден в базе данных", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10003": "домен монтирования не действителен после %d миллисекунд, удалить его...", + "ORG_ZSTACK_IAM2_CONTAINER_10000": "не удалось обновить квоту проекта[uuid: %s] на стороне контейнера из-за непредвиденной ошибки", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10006": "Нет доступных групп доступа NAS; пожалуйста, создайте хотя бы одну.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10005": "нет такой цели монтирования [%s] в NAS: %s", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10000": "файловая система [%%s] не найдена в регионе: %%s", + "ORG_ZSTACK_COMPUTE_VM_10059": "Предпочтение учетной записи не найдено. Пожалуйста, отправьте команду смены пароля хосту виртуальной машины!", + "ORG_ZSTACK_COMPUTE_VM_10058": "Целевой хост не найден в базе данных; невозможно отправить команду смены пароля хосту!", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10002": "Некоторые первичные хранилища [%%s] связаны с этим NAS; пожалуйста, удалите первичные хранилища перед удалением.", + "ORG_ZSTACK_COMPUTE_VM_10057": "Только хосты с UUID: %s могут получить доступ к тому данных.", + "ORG_ZSTACK_COMPUTE_VM_10056": "Ресурс[UUIDs:%s] не управляется учетной записью[UUID:%s]", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10001": "Файловая система NAS уже существует в датацентре: %s", + "ORG_ZSTACK_COMPUTE_VM_10063": "Предоставленный пароль не соответствует требованиям сложности. Он должен содержать как минимум одну цифру, одну заглавную букву, одну строчную букву и один специальный символ.", + "ORG_ZSTACK_COMPUTE_VM_10062": "Длина пароля должна быть [%s-%s символов]", + "ORG_ZSTACK_COMPUTE_VM_10061": "Диск не поддерживает подключение. Тип диска: %s", + "ORG_ZSTACK_COMPUTE_VM_10060": "Параметр диска AO некорректен. Необходимо указать одно из следующих свойств: size, template UUID, disk offering UUID или source UUID-source type. Должно быть указано только одно из этих свойств.", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10010": "Группа доступа [%s] уже существует в датацентре [%s]", + "ORG_ZSTACK_COMPUTE_VM_10068": "На L3 сети [%s] нет доступного типа сетевого интерфейса", + "ORG_ZSTACK_FAULTTOLERANCE_10015": "Невозможно создать вторичную виртуальную машину, так как первичная виртуальная машина находится в остановленном состоянии. Пожалуйста, запустите первичную виртуальную машину перед созданием вторичной.", + "ORG_ZSTACK_COMPUTE_SRIOV_10014": "SR-IOV и VFHA не могут быть включены одновременно при подключении L3 сети к виртуальной машине. Пожалуйста, убедитесь, что настроен только один из этих параметров.", + "ORG_ZSTACK_COMPUTE_SRIOV_10015": "Невозможно изменить сетевой интерфейс виртуальной функции на стандартный тип", + "ORG_ZSTACK_FAULTTOLERANCE_10013": "В настоящее время выполняется другая задача сборки мусора для отказоустойчивости. Пожалуйста, отмените новую задачу и дождитесь ее завершения.", + "ORG_ZSTACK_COMPUTE_SRIOV_10016": "Невозможно изменить сетевой интерфейс на тип VF. Пожалуйста, убедитесь, что целевой экземпляр поддерживает vf сеть.", + "ORG_ZSTACK_COMPUTE_SRIOV_10017": "Сетевой интерфейс виртуальной машины с UUID:%s не существует", + "ORG_ZSTACK_FAULTTOLERANCE_10011": "Отсутствует группа отказоустойчивых виртуальных машин", + "ORG_ZSTACK_FAULTTOLERANCE_10010": "Невозможно выполнить миграцию ft primary VM[uuid:%s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10019": "Поддерживается только SR-IOV", + "ORG_ZSTACK_MONITORING_MEDIA_10001": "Не удалось установить соединение с SMTP-сервером по адресу: %s, порт: %d. Пожалуйста, проверьте правильность настроек smtpServer и smtpPort.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10038": "Тело условия не может поддерживать значения JSON null или массивы!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10037": "Поле 'Condition' поддерживает только функции ZStack Template!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10036": "Значение в поле 'Condition' должно быть булева типа", + "ORG_ZSTACK_MONITORING_MEDIA_10000": "Проблема может быть связана с неверным идентификатором ключа доступа или секретным ключом доступа, либо недостаточными IAM разрешениями для указанного пользователя. Пожалуйста, проверьте ваши учетные данные и убедитесь, что пользователь имеет необходимые разрешения в вашей облачной среде.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10035": "Ключ условия: %s поддерживает только 1 элемент в JSON-объекте значения, но было предоставлено %d элементов!", + "ORG_ZSTACK_FAULTTOLERANCE_10019": "Не удалось выполнить переключение. Основная виртуальная машина неизвестна и сетевой адрес отказоустойчивости недоступен. Пожалуйста, проверьте вашу конфигурацию.", + "ORG_ZSTACK_FAULTTOLERANCE_10018": "pvm[uuid:%s] не существует", + "ORG_ZSTACK_FAULTTOLERANCE_10017": "Не удалось выполнить переключение для vm[uuid:%s]. Связанная группа отказоустойчивых виртуальных машин не существует", + "ORG_ZSTACK_COMPUTE_SRIOV_10012": "Сетевой интерфейс виртуальной машины [uuid:%s] уже имеет тип %s; нет необходимости изменять", + "ORG_ZSTACK_FAULTTOLERANCE_10016": "Создание SVM прошло успешно, но произошла ошибка при запросе на запуск вторичной виртуальной машины. Пожалуйста, проверьте конфигурацию SVM и убедитесь, что все предпосылки для запуска вторичной виртуальной машины выполнены.", + "ORG_ZSTACK_COMPUTE_SRIOV_10013": "Изменяйте тип сетевого интерфейса виртуальной машины только когда она остановлена.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10009": "Двухфакторная аутентификация не удалась из-за отсутствия токена в системном теге msg.%s", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10008": "Двухфакторная аутентификация не удалась, поскольку сообщение не содержит системных тегов.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10004": "Двухфакторная аутентификация не включена для вашей учетной записи. Пожалуйста, включите ее для продолжения.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10001": "Неподдерживаемый тип учетной записи: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10026": "Порт отказоустойчивой ВМ не найден", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10011": "Не удалось проверить код двухфакторной аутентификации для виртуального ресурса %s. Пожалуйста, проверьте код и попробуйте снова.", + "ORG_ZSTACK_DAHO_CORE_10003": "Не удалось создать задачу Daho VLL! Пожалуйста, убедитесь, что все исходные файлы правильно загружены и доступны в облачной среде.", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10010": "двухфакторная аутентификация не удалась, так как для %s:%s не определен секрет", + "ORG_ZSTACK_FAULTTOLERANCE_10024": "Невозможно запустить вторичную виртуальную машину, так как первичная виртуальная машина находится в остановленном состоянии. Сначала запустите первичную виртуальную машину.", + "ORG_ZSTACK_DAHO_CORE_10004": "учетная запись Alibaba Cloud не найдена для accountUuid: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10022": "Невозможно найти доступный IP-адрес из текущей отказоустойчивой сети. Пожалуйста, проверьте, что глобальная конфигурация [категория: Отказоустойчивость, имя: fault.tolerance.network.cidr] задана правильно, и что хост [uuid:%s] имеет IP-адрес в указанном диапазоне CIDR.", + "ORG_ZSTACK_FAULTTOLERANCE_10021": "Произошла непредвиденная ошибка во время управления облачными ресурсами. Пожалуйста, проверьте входные параметры и убедитесь, что они находятся в допустимых диапазонах. Если проблема сохраняется, рассмотрите возможность проверки конфигурации облачной вычислительной среды или обратитесь в службу поддержки за дополнительной помощью.", + "ORG_ZSTACK_DAHO_CORE_10007": "политика истечения срока: %s не является допустимой конфигурацией", + "ORG_ZSTACK_FAULTTOLERANCE_10020": "Не удалось выполнить переключение. Вторичная ВМ неизвестна и нет доступных адресов отказоустойчивой сети. Пожалуйста, проверьте конфигурацию.", + "ORG_ZSTACK_DAHO_CORE_10008": "vlanId[%s] уже существует!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10026": "Вес CfnRootDecoder должен быть между 0-100, где 0 указывает на приоритетное декодирование, а значение по умолчанию равно 50.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10025": "Тело параметров должно быть JSON-объектом!", + "ORG_ZSTACK_COMPUTE_SRIOV_10020": "%s не поддерживает SRIOV", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10024": "Type является обязательным для Parameters, но не найден в %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10021": "тег enableSRIOV не поддерживается для типа ВМ [%s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10022": "не удалось предварительно обработать виртуальный сетевой интерфейс перед миграцией ВМ[uuid:%s] на хост[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10028": "выделенный номер порта меньше запрошенного для nic [uuid: %s] на хосте [uuid: %s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10023": "не удалось выполнить постобработку виртуального сетевого интерфейса после миграции ВМ[uuid:%s] на хост[uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10029": "Тело значения сопоставления не поддерживает JSON-массив! Пожалуйста, убедитесь, что значение сопоставления является скалярным или сложным типом, поддерживаемым вашей облачной вычислительной платформой.", + "ORG_ZSTACK_FAULTTOLERANCE_10027": "не удалось выделить порт для nic[uuid: %s] на хосте[uuid: %s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10028": "невозможно найти сообщение: %s для создания ресурса", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10030": "Тело значения сопоставления не может поддерживать значения NULL! Пожалуйста, убедитесь, что все тела значений сопоставления инициализированы.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10031": "mappingName должен быть найден в результате CloudFormation JSON, иначе он будет считаться недействительным.", + "ORG_ZSTACK_FAULTTOLERANCE_10037": "Невозможно выполнить переключение для ВМ[uuid:%s], так как группа отказоустойчивых ВМ не находится в одном из следующих статусов: [%s, %s]", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10005": "невозможно присоединить L2VirtualSwitchNetwork, так как в кластере[uuid:%s] нет хостов", + "ORG_ZSTACK_FAULTTOLERANCE_10036": "Невозможно выполнить переключение на резервную ВМ[UUID:%s], пожалуйста, подтвердите, что она является частью отказоустойчивой группы ВМ.", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10006": "Невозможно присоединить сеть L2 Virtual Switch, поскольку интерфейс[%s] должен быть создан на хосте[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10035": "Невозможно выполнить переключение на резервную ВМ[UUID:%s], пожалуйста, убедитесь, что переключение включено в GlobalConfig.", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10007": "Невозможно создать сеть уровня 3 на виртуальном коммутаторе[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10034": "Невозможно удалить сеть L3 [uuid:%s]. Отказоустойчивая ВМ [%s] все еще находится в состояниях [%s, %s]. Пожалуйста, остановите связанные отказоустойчивые ВМ перед попыткой удаления сети L3.", + "ORG_ZSTACK_FAULTTOLERANCE_10033": "образ[uuid:%s] все еще используется отказоустойчивой ВМ[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10004": "невозможно найти подключенный KVM-хост для выполнения операции; похоже, что все хосты в кластерах, подключенных к группе блочного хранилища[uuid:%s], отключены.", + "ORG_ZSTACK_FAULTTOLERANCE_10032": "том с индексом: %d pvm[uuid:%s] и svm[uuid:%s] имеет кэш-том с другим размером; запуск запрещен", + "ORG_ZSTACK_FAULTTOLERANCE_10031": "том с индексом: %d pvm[uuid:%s] и svm[uuid:%s] имеют разные размеры; запуск запрещен", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10003": "Невозможно создать L2PortGroupNetwork, поскольку L2VirtualSwitchNetwork[uuid:%s] уже содержит L2PortGroupNetworks с тем же vlanId[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10002": "KVM-хост, к которому присоединен том[uuid:%s], потерял связь с группой общего блочного хранилища[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10030": "количество томов pvm[uuid:%s] и svm[uuid:%s] не совпадает; запуск запрещен.", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10004": "Невозможно присоединить L2VirtualSwitchNetwork, поскольку интерфейс[%s] в кластере[uuid:%s] уже используется другой L2VirtualSwitchNetwork", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10001": "Не удалось найти том для операции в основном хранилище группы общих блоков.%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10002": "Виртуальный маршрутизатор не настроен для службы VYOS DHCP.%s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10006": "общий том не поддерживает тонкое выделение ресурсов", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10001": "невозможно добавить записи DHCP в виртуальную маршрутизатор ВМ[UUID:%s IP:%s] из-за %s, запись DHCP[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10039": "текущая операция[API:%s] не поддерживается, когда отказоустойчивая ВМ[UUID:%s, состояние:%s] не находится в остановленном состоянии", + "ORG_ZSTACK_FAULTTOLERANCE_10038": "Невозможно обслуживать хост, поскольку отказоустойчивые ВМ[%s] находятся в процессе восстановления", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10011": "vm[uuid:%s] не находится в состоянии Работает, Приостановлена или Остановлена, текущее состояние[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10048": "невозможно обновить платформу отказоустойчивой ВМ[uuid:%s], необходимо остановить обе ВМ и убедиться, что они находятся в остановленном состоянии перед продолжением", + "ORG_ZSTACK_FAULTTOLERANCE_10047": "невозможно обновить размер памяти отказоустойчивой ВМ[uuid:%s], так как это требует остановки обеих ВМ", + "ORG_ZSTACK_FAULTTOLERANCE_10046": "невозможно обновить количество процессоров отказоустойчивой ВМ[uuid:%s], необходимо остановить обе ВМ и перезапустить их", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10005": "L2 сеть не должна иметь то же имя интерфейса, что и сеть подготовки, которая уже присоединена к кластеру.", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10004": "Не добавляйте хост в BareMetal2 кластер.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10015": "Образ с UUID [uuid: %s] и именем [name: %s] не найден ни на одном резервном хранилище.", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10003": "При создании новых BareMetal2 кластеров должна быть указана архитектура.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10014": "Образ [UUID: %s, name: %s] недоступен для загрузки ни на одном резервном хранилище:", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10002": "1. Убедитесь, что образ не находится в удаленном состоянии.", + "ORG_ZSTACK_FAULTTOLERANCE_10042": "2. Убедитесь, что резервное хранилище, отмеченное как Готовое для этого образа, присоединено к зоне [UUID: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10013": "не поддерживается для операции слияния снимков в онлайн-режиме общего тома[uuid: %s] на sharedblock", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10001": "", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10012": "Невозможно подключить локальное хранилище к кластеру baremetal. Пожалуйста, убедитесь, что кластер поддерживает подключение локального хранилища.", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10000": "", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10017": "Том [UUID: %s] присоединен к виртуальной машине [UUID: %s], которая находится в состоянии %s; поэтому операция слияния снимков не может быть выполнена.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10016": "", + "ORG_ZSTACK_FAULTTOLERANCE_10049": "Невозможно подключить сторонний Ceph с токеном к кластеру aarch64. Пожалуйста, убедитесь в совместимости версии Ceph с архитектурой кластера.", + "ORG_ZSTACK_BAREMETAL_NETWORK_10004": "", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10000": "Узлы[uuid:%s] имеют диск UUID, который связан с блочным хранилищем общего доступа, но фактическое хранилище отличается.", + "ORG_ZSTACK_BAREMETAL_NETWORK_10003": "", + "ORG_ZSTACK_BAREMETAL_NETWORK_10002": "В кластере[uuid:%s] не найдено ни одного подключенного узла", + "ORG_ZSTACK_BAREMETAL_NETWORK_10001": "", + "ORG_ZSTACK_BAREMETAL_NETWORK_10000": "Текущая операция не поддерживается на виртуальной машине группы с отказоустойчивостью[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10022": "", + "ORG_ZSTACK_FAULTTOLERANCE_10058": "MAC-адрес %s уже является интерфейсом bond-slave", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10021": "", + "ORG_ZSTACK_FAULTTOLERANCE_10057": "Невозможно настроить записи DHCP, обслуживаемые виртуальным маршрутизатором[uuid:%s, ip:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10020": "", + "ORG_ZSTACK_FAULTTOLERANCE_10056": "MAC-адрес %s не принадлежит шасси с UUID %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10001": "", + "ORG_ZSTACK_FAULTTOLERANCE_10055": "Адрес Slave %s недействителен. Он должен быть в формате MAC-адресов, разделенных запятыми, например 6c:b3:11:1b:0b:1e,6c:b3:11:1b:0b:1f.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10002": "", + "ORG_ZSTACK_FAULTTOLERANCE_10054": "Имя bond %s уже существует в конфигурации виртуальной сети", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10025": "", + "ORG_ZSTACK_FAULTTOLERANCE_10053": "Создание BM Bonding допускается только до создания BM Instance.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10024": "", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10029": "не удается найти резервное хранилище[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10027": "", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10005": "Не допускается одинаковый MAC-адрес [%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10051": "", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10006": "eip с uuid:%s не находится в включенном состоянии, присоединение к vm nic невозможно", + "ORG_ZSTACK_FAULTTOLERANCE_10050": "текущая операция не поддерживается на отказоустойчивой первичной VM[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10003": "Невозможно присоединить L3 сеть [uuid:%s, name:%s] к VM [uuid:%s, name:%s], так как L3 сеть предоставляет Elastic IP (EIP) одному из NIC VM.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10004": "vmNic [UUID:%s] не присоединен к vmInstance и поэтому не может получить доступные для присоединения EIPs.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10009": "eip с uuid: %s может быть присоединен только когда его состояние %s, но его текущее состояние %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10007": "ip [uuid:%s] связан с vm nic [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10008": "eIP с UUID: %s уже присоединен к другому VM NIC с UUID: %s и не может быть присоединен снова.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10033": "невозможно найти подключенный KVM хост для выполнения операции; похоже, что все хосты, подключенные к общему блочному хранилищу [uuid:%s], отключены.", + "ORG_ZSTACK_FAULTTOLERANCE_10069": "cluster[uuid:%s] указан, но он отключен; поэтому VM не может быть создана из него.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10032": "невозможно найти хосты, которые подключены как к основному хранилищу с UUID: %s, так и к основному хранилищу с UUID: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10068": "zone[uuid:%s] указана, но она отключена; поэтому VM не может быть создана из нее.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10031": "Не удалось найти доступный хост для миграции тома[uuid: %s] на общем блочном групповом основном хранилище[uuid: %s] и [uuid: %s].", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10030": "Не удалось найти доступный хост для миграции тома[uuid: %s] между общими блочными групповыми основными хранилищами[uuid: %s] и [uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10037": "невозможно уменьшить снимок %s, потому что виртуальная машина %s не находится в состоянии Работает или Остановлена", + "ORG_ZSTACK_FAULTTOLERANCE_10065": "Нельзя добавить тот же UUID в l3Network, UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10035": "невозможно уменьшить снимок %s из-за того, что том %s не готов", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10038": "получить пустой путь установки в снимке для виртуальной машины %s", + "ORG_ZSTACK_ALIYUN_BACKUP_10000": "Хранилище бакетов не найдено для операций резервного копирования. Пожалуйста, убедитесь, что настроен действительный бакет.%s", + "ORG_ZSTACK_FAULTTOLERANCE_10062": "image[uuid:%s] имеет формат: %s, только допустимые форматы могут использоваться для создания VM", + "ORG_ZSTACK_FAULTTOLERANCE_10061": "image[uuid:%s] имеет тип медиа: %s; только шаблоны корневых томов могут использоваться для создания VM.", + "ORG_ZSTACK_TICKET_IAM2_API_10004": "Одна политика резервирования может быть связана только с одной коллекцией потоков.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10044": "Не найден подключенный хост для получения снимка на основном хранилище[uuid:%s] для тома[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10020": "vip[uuid:%s] не находится в ожидаемом состоянии[%s], текущее состояние %s", + "ORG_ZSTACK_SNS_PLATFORM_MICROSOFTTEAMS_10000": "не удалось отправить сообщения в Microsoft Teams. статус: %s, тело: %s", + "ORG_ZSTACK_TICKET_IAM2_API_10003": "Для создания потока в облачной вычислительной среде требуется имя.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10043": "Не найден подключенный хост для фиксации снимка на основном хранилище[uuid:%s] для тома[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10079": "невозможно запустить vm[uuid:%s]. У него нет присоединенной сетевой карты (NIC), пожалуйста, присоедините NIC и попробуйте снова.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10042": "активный installPath %s не удался, потому что %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10041": "активные дочерние снимки не удались потому что %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10023": "vmNic UUID[%s] не разрешено добавлять EIP, потому что у него уже есть правило Port Forwarding с разрешенным CIDR.", + "ORG_ZSTACK_FAULTTOLERANCE_10077": "Текущая отказоустойчивая виртуальная машина находится в неизвестном состоянии и не может быть остановлена. Пожалуйста, попробуйте выполнить ручной переход на резервный ресурс.", + "ORG_ZSTACK_TICKET_IAM2_API_10008": "Имя ресурса не может быть пустым. Пожалуйста, укажите допустимое имя для ресурса.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10048": "недопустимый тег начального размера тонкого резервирования[%s]", + "ORG_ZSTACK_TICKET_IAM2_API_10007": "недопустимый титул утверждающего %s, допустимые значения: %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10021": "гостевая l3 сеть vm nic[uuid:%s] и l3 сеть vip vip[uuid:%s] являются одной сетью", + "ORG_ZSTACK_TICKET_IAM2_API_10006": "Для создания коллекции потоков требуется хотя бы один поток.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10022": "Состояние VM[%s] не допускает выполнения операций EIP. Пожалуйста, дождитесь завершения процесса VM.", + "ORG_ZSTACK_TICKET_IAM2_API_10005": "В качестве утверждающего последнего рабочего процесса требуется роль администратора или IAM.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10045": "деактивировать installPath не удалось, так как %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10049": "недопустимый начальный размер тонкого резервирования[%s], он должен быть больше или равен %s", + "ORG_ZSTACK_FAULTTOLERANCE_10073": "defaultL3NetworkUuid[uuid:%s] не найден в l3NetworkUuids[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10071": "указан хост[uuid:%s], но его статус подключения %s, невозможно создать VM", + "ORG_ZSTACK_FAULTTOLERANCE_10070": "указан хост[uuid:%s], но он отключен; поэтому VM не может быть создан.", + "ORG_ZSTACK_TICKET_IAM2_API_10009": "UUID утверждающего не может быть пустым", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10051": "недопустимый thinProvisioningInitializeSize[%s] превышает максимальный предел %d", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10050": "недопустимый thinProvisioningInitializeSize[%s], это не допустимое значение размера", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10055": "Хост с UUID [uuid:%s] недоступен для изменения размера тома с UUID [uuid:%s] на общем блочном групповом основном хранилище с UUID [uuid:%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10054": "невозможно найти хост с подключенным общим блочным хранилищем для выполнения команды для общего блочного группового основного хранилища[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10053": "невозможно найти доступный хост для выполнения команды для общего блочного группового основного хранилища[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10052": "значение[%s] не является степенью двойки", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10012": "IP-адрес [uuid:%s] не принадлежит сетевому интерфейсу [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10059": "невозможно найти какой-либо кластер, подключенный к общему блочному групповому основному хранилищу [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10058": "основное хранилище с общей точкой монтирования[uuid:%s, name:%s] не может найти какой-либо доступный хост в подключенных кластерах для создания тома", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10013": "eip[uuid:%s] не присоединен к сетевому интерфейсу какой-либо виртуальной машины", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10010": "сетевой интерфейс vm не имеет совместимого используемого IP для EIP с UUID %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10057": "том[uuid:%s] не найден в пуле хранилища", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10011": "гостевая l3Network VM NIC и VIP l3Network EIP являются одной сетью [uuid:%s] и [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10056": "основное хранилище [uuid:%s] не найдено", + "ORG_ZSTACK_TICKET_IAM2_API_10011": "виртуальный ID [UUID] не принадлежит проекту [UUID]", + "ORG_ZSTACK_TICKET_IAM2_API_10010": "невозможно найти IAM-to-VirtualID mapping [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10017": "Виртуальная машина [UUID:%s], связанная с EIP, уже подключена к публичной сети [UUID:%s], от которой происходит VIP [UUID:%s, Имя:%s, IP:%s].", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10014": "Версия IP VIP [%d] отличается от версии IP гостевой системы [%d].", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10015": "VIP[%s] находится в пределах гостевого диапазона IP [%s - %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10062": "Основное хранилище SharedBlock [uuid:%s, name:%s] не присоединено ни к одному кластеру вычислений, или в присоединенных кластерах нет подключенных хостов.", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10018": "VIP [UUID:%s] уже занят другой сущностью сетевого сервиса [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10019": "EIP не может быть создан на системном VIP. Убедитесь, что вы используете публичный IP-адрес для привязки EIP.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10047": "не удалось получить хэш образа, причина:%s", + "ORG_ZSTACK_SNS_PLATFORM_FEISHU_10000": "не удалось отправить сообщения в FeiShu. статус: %s, тело: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10042": "UUID агента резервного хранилища образа изменился [ожидалось: %s, фактически: %s]. Это скорее всего вызвано ручным перезапуском агента. Пожалуйста, выполните повторное подключение для синхронизации статуса.", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10000": "Не удалось получить информацию о кластере Zaku, ошибка: %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10002": "Не удалось получить кластер Zaku [id:%s], ошибка: %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10001": "Не удалось получить информацию о кластере Zaku; содержимое ответа пусто. Пожалуйста, проверьте параметры вашего запроса и сетевое подключение.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10000": "невозможно найти квоту для группы безопасности для проекта %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10004": "Не удалось извлечь ID действия из ответа API", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10003": "Не удалось получить кластер Zaku [id:%s], содержимое ответа пусто", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10006": "Не удалось разобрать облачный ответ: %s", + "ORG_ZSTACK_SNS_10015": "platformUuid и endpointUuid не могут быть указаны одновременно. Пожалуйста, проверьте входные параметры.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10001": "Квота группы безопасности не может быть меньше 1. Пожалуйста, измените настройку на значение не менее 1.", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10005": "Асинхронная операция истекла по таймауту после %d секунд", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10004": "l3Uuid в метке не соответствует l3Uuid в параметре", + "ORG_ZSTACK_SNS_10013": "пароль не может быть пустым", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10003": "запрошен системный тег. необходимо указать группу безопасности по умолчанию для VM NIC, установив системный тег L3_NETWORK_SECURITY_GROUP_UUIDS_REF с форматом l3::{%s}::SecurityGroupUuids::{%s}, так как принудительная группа безопасности включена", + "ORG_ZSTACK_SNS_10012": "имя пользователя не может быть пустым", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10006": "Поскольку принудительная группа безопасности включена, securityGroupUuid в теге должен находиться в пределах проекта[%s].", + "ORG_ZSTACK_SNS_10011": "smtpPort не может быть пустым", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10005": "Владелец [UUID: %s] группы безопасности [UUID: %s] принадлежит другому IAM2 проекту.", + "ORG_ZSTACK_SNS_10010": "smtpServer не может быть пустым", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10008": "Группа безопасности по умолчанию %s не может быть удалена, когда функция принудительной группы безопасности включена.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10007": "NIC, присоединенные к l3Network [uuid:%s], связаны с группой безопасности. Перед отсоединением l3Network от группы безопасности вам необходимо отсоединить NIC.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10039": "Для использования сервиса ImageStore в нашем облачном окружении требуется коммерческая лицензия.", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10009": "Эта группа безопасности %s связана с виртуальной машиной, пожалуйста, отсоедините её перед продолжением.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10035": "хранилище образов [%s] не может добавить образ, так как оно используется для удалённого резервного копирования", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10032": "резервное хранилище[UUID:%s] имеет недостаточную ёмкость[%s] для экспорта образа виртуальной машины", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10002": "виртуальный маршрутизатор[имя: %s, uuid: %s] не смог синхронизировать snat%s из-за %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10031": "образ[%s] не найден на резервном хранилище[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10001": "гостевой l3Network[uuid:%s, имя:%s] требует сервис SNAT от виртуального маршрутизатора, но публичный l3Network[uuid:%s], связанный с предложением виртуального маршрутизатора[uuid: %s, имя:%s], идентичен гостевому l3Network.", + "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10020": "notifySugonSdn: не удалось уведомить Sugon SDN о vrouter для VM [uuid:%s] на целевом хосте[uuid:%s], ошибка:%s", + "ORG_ZSTACK_SNS_10029": "идентификатор облачного ресурса [%s] уже существует", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10011": "учётная запись[%s] не имеет разрешения выполнять операции с группой безопасности по умолчанию", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10010": "учётная запись[%s] не может выполнять операции с группой безопасности по умолчанию[%s]", + "ORG_ZSTACK_SNS_10026": "невозможно обновить адрес электронной почты на %s, так как он уже существует в конечной точке [UUID:%s]", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10012": "сетевой интерфейс виртуальной машины [UUID: %s] может быть частью только одной группы безопасности; поэтому он не может быть удалён из текущей группы безопасности [UUID: %s].", + "ORG_ZSTACK_SNS_10024": "невозможно добавить тот же адрес электронной почты в конечную точку[uuid:%s]", + "ORG_ZSTACK_SNS_10023": "невозможно найти плагин[%s]", + "ORG_ZSTACK_SNS_10022": "невозможно создать SNMP-платформу с тем же адресом[%s:%s]", + "ORG_ZSTACK_SNS_10021": "Невозможно установить соединение из-за нулевых параметров. Пожалуйста, убедитесь, что все необходимые параметры настроены правильно.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10029": "удалённый тип цели не реализован: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10028": "не удалось упаковать экспортированные образы из-за %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10027": "некоторые образы [%s] не были экспортированы в резервное хранилище [uuid: %s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10026": "не удалось удалить пакет образов потому: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10022": "не удалось установить максимальную ёмкость на хранилище образов[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10021": "не удалось установить максимальную ёмкость на хранилище образов[uuid:%s], потому: %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10019": "notifySugonSdn: не удалось уведомить Sugon SDN о vrouter для VM [uuid:%s] на целевом хосте [uuid:%s]", + "ORG_ZSTACK_SNS_10038": "Невозможно создать SNS-конечную точку электрон почты без указания адресов электронной почты получателей.", + "ORG_ZSTACK_SNS_10037": "имя пользователя и пароль должны либо оба отсутствовать, либо быть предоставлены вместе", + "ORG_ZSTACK_SNS_10036": "неверный номер телефона[%s], пожалуйста, убедитесь, что он отформатирован как +86-12388889999", + "ORG_ZSTACK_SNS_10035": "[%s] не является допустимым IP-адресом", + "ORG_ZSTACK_SNS_10034": "неверный путь облачного хранилища[%s]", + "ORG_ZSTACK_SNS_10031": "номер телефона [%s] не существует", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10018": "Нет ответа от облачного экземпляра или виртуальной машины. Пожалуйста, проверьте состояние экземпляра и конфигурацию сети.", + "ORG_ZSTACK_SNS_10030": "Список телефонных номеров виртуальной машины пуст. Пожалуйста, проверьте и убедитесь, что необходимые телефонные номера подготовлены.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10016": "не удалось получить образ из резервного хранилища с UUID: %s, причина: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10015": "Отсутствует файл сертификата для загрузки образа: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10013": "не удалось подключиться к SimpleHttpBackupStorage[url:%s], причина: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10010": "Не удалось получить ответ задачи! Пожалуйста, проверьте конфигурацию экземпляра и настройки сети.", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_10000": "создание зависит от кэша образов[uuid:%s, URL-адреса расположения: [%s]], невозможно создать из других расположений.", + "ORG_ZSTACK_SNS_10045": "Операция запрещена для системной платформы виртуальных машин. Пожалуйста, убедитесь, что вы изменяете ресурсы пользовательского пространства.", + "ORG_ZSTACK_SNS_10044": "Невозможно проверить универсальную SMS без указания номера телефона.", + "ORG_ZSTACK_SNS_10043": "userId [%s] уже существует в облачной среде", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10008": "не удалось очистить метаданные образа на основном хранилище %s, ошибка: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10007": "Синхронизация не удалась из-за отсутствующего исходного файла. Пожалуйста, убедитесь, что все необходимые файлы присутствуют, и повторите попытку синхронизации.", + "ORG_ZSTACK_SNS_10041": "облачный номер телефона[%s] уже существует", + "ORG_ZSTACK_SNS_10040": "недействительный адрес электронной почты[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10005": "невозможно найти подключенный хост в кластере, к которому присоединено основное хранилище [uuid: %s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10004": "не удалось зафиксировать резервное хранилище, указанное UUID: %s, из-за ошибки: %s", + "ORG_ZSTACK_MONITORING_10004": "невозможно найти тип для ресурса[uuid:%s]", + "ORG_ZSTACK_MONITORING_10005": "не найдены метрики мониторинга для resourceType[%s] и item[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10002": "не удалось выделить резервное хранилище, указанное UUID: %s, из-за ограничений ресурсов или недействительных UUID: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10000": "ошибка разбора времени создания: %s", + "ORG_ZSTACK_MONITORING_10000": "невозможно найти монитор триггера[uuid:%s], он мог быть удален или отключен", + "ORG_ZSTACK_MONITORING_10001": "невозможно найти действие монитор триггера[uuid:%s], оно могло быть удалено или отозвано", + "ORG_ZSTACK_MONITORING_10002": "ресурс[type:%s] не имеет метрик мониторинга", + "ORG_ZSTACK_MONITORING_10003": "Ресурс с UUID [%s] не принадлежит учетной записи с UUID [%s].", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10002": "экземпляр[%s] не связан ни с какой группой", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10001": "Экземпляр[%s] уже назначен в группу", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10003": "Мониторинговая группа [%s] не связана с шаблоном мониторинга.", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10006": "Достигнут лимит экземпляров для группы. Пожалуйста, завершите работу существующего экземпляра или обратитесь в поддержку для увеличения лимита.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10001": "Тело вывода не поддерживает значения JSON null! Пожалуйста, убедитесь, что все поля правильно определены и не являются null.", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10005": "Правило шаблона достигло максимального лимита в %d записей. Рассмотрите возможность масштабирования вашего шаблона или обратитесь в поддержку за помощью.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10000": "в Outputs могут быть разрешены только облачные сервисы, но найдено %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10016": "Тип ресурса должен быть строкой!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10014": "Тело корневого элемента Mappings должно быть JSON-объектом!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10018": "Метаданные корневого ресурса должны быть JSON-объектом!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10023": "Тело Parameters не может содержать значения null!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10022": "имя параметра не поддерживается: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10020": "paramName должен быть найден в результатах шаблона CloudFormation JSON, иначе он считается недействительным.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10001": "сущность пуста, невозможно определить TableName", + "ORG_ZSTACK_FAULTTOLERANCE_10004": "не удалось выделить порт на хосте[uuid: %s]", + "ORG_ZSTACK_ZQL_AST_VISITORS_10000": "Условие Join отсутствует для таблицы %s в вашем запросе. Пожалуйста, убедитесь, что условие join указано правильно.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10003": "Список полей пуст; поэтому мы не можем получить имя столбца. Пожалуйста, убедитесь, что ваш список полей содержит необходимые данные.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10002": "сущность пуста, невозможно получить columnName", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10005": "Тело Mapping не поддерживает значения, отличные от map!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10004": "[%s] недействителен в CloudFormation Outputs!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10003": "Description в Outputs должен быть типа String!", + "ORG_ZSTACK_FAULTTOLERANCE_10009": "Не удалось выполнить миграцию вторичной VM[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10008": "Невозможно запустить вторичную виртуальную машину, так как первая виртуальная машина все еще находится в остановленном состоянии. Пожалуйста, убедитесь, что основная VM запущена, прежде чем пытаться запустить вторичную VM.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10009": "Тело значения ресурса не может содержать значения null! Пожалуйста, убедитесь, что все параметры ресурса правильно инициализированы перед развертыванием.", + "ORG_ZSTACK_ZQL_AST_VISITORS_10004": "Указанная функция не может быть null. Пожалуйста, убедитесь, что функция правильно инициализирована перед использованием.", + "ORG_ZSTACK_FAULTTOLERANCE_10007": "не удалось получить UUID хоста основной VM [uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10008": "Ресурс %s не может зависеть от самого себя, пожалуйста, проверьте самоссылку в Resource [%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10005": "выделено портов меньше, чем запрошено на хосте[uuid: %s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10006": "Тело Mapping не поддерживает значения null! Пожалуйста, убедитесь, что все поля JSON правильно определены и не являются null.", + "ORG_ZSTACK_SNS_10009": "uuid [%%s] уже существует в облачной среде.", + "ORG_ZSTACK_SNS_10007": "невозможно найти конечную точку приложения SNS с UUID: %s, возможно, она была удалена", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10012": "неподдерживаемый ключ [%s] в маппинге ресурса [%s]", + "ORG_ZSTACK_SNS_10006": "невозможно найти SNSApplicationPlatform[uuid:%s], возможно, она была завершена", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10011": "resourceName должен быть найден в выводе шаблона или это недействительный CloudFormation JSON.", + "ORG_ZSTACK_SNS_10005": "Указанный тип конечной точки %s не найден. Пожалуйста, убедитесь, что предоставлен допустимый тип конечной точки.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10010": "неподдерживаемые ключи ресурса: %s", + "ORG_ZSTACK_SNS_10003": "невозможно найти SNS Topic с UUID:%s, возможно, она была удалена", + "ORG_ZSTACK_SNS_10002": "Конечная точка приложения отключена. Проверьте настройки конфигурации или обратитесь в службу поддержки за помощью.", + "ORG_ZSTACK_SNS_10001": "Платформа приложения отключена. Обратитесь к администратору, чтобы включить её, или ознакомьтесь с документацией о доступных альтернативах.", + "ORG_ZSTACK_SNS_10000": "Тема %s не потребляется ни одной из подписанных конечных точек.", + "ORG_ZSTACK_CLOUDFORMATION_10002": "Неверная версия формата шаблона ZStack: [%s, ожидаемая версия: %s]", + "ORG_ZSTACK_CLOUDFORMATION_10001": "Шаблон должен содержать маркер ZStackTemplateFormatVersion.", + "ORG_ZSTACK_CLOUDFORMATION_10000": "Обнаружен пустой элемент в содержимом шаблона. Содержимое шаблона может ссылаться на облачный ресурс или конфигурацию виртуальной машины. Пожалуйста, убедитесь, что все элементы правильно определены и инициализированы.", + "ORG_ZSTACK_CLOUDFORMATION_10009": "Шаблон [%s] отключен в среде виртуализации", + "ORG_ZSTACK_CLOUDFORMATION_10008": "ResourceStackVO [%s] уже был удалён!", + "ORG_ZSTACK_CLOUDFORMATION_10007": "ResourceStackVO: [%s] был завершён...", + "ORG_ZSTACK_CLOUDFORMATION_10005": "UUID стека не найден для VM-экземпляра [%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10035": "Не удалось зарезервировать ёмкость хоста для всех кандидат-хостов. Проверьте доступность целевых хостов и убедитесь, что у них достаточно ресурсов для выполнения требований резервирования.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10034": "[Распределение хостов]: %s на хосте[uuid:%s]. Попытка распределения на следующий хост. %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10037": "После фильтрации HostAllocatorFilterExtensionPoint[%s] возвращает ноль кандидат-хостов, причина: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10036": "Хост с указанными критериями не найден", + "ORG_ZSTACK_CLOUDFORMATION_10025": "ожидается статус %s!", + "ORG_ZSTACK_EXPON_10002": "экспоненциальный запрос не выполнен, код %s, сообщение: %s.", + "ORG_ZSTACK_EXPON_10003": "невозможно найти том [name:%s] после копирования снимка", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10000": "виртуальный маршрутизатор[name: %s, uuid: %s] не смог настроить DNS%s, %s", + "ORG_ZSTACK_CLOUDFORMATION_10022": "перезапуск стека ресурсов поддерживается только для статуса %s!", + "ORG_ZSTACK_CLOUDFORMATION_10021": "невозможно найти стек ресурсов с uuid [%s]", + "ORG_ZSTACK_CLOUDFORMATION_10020": "невозможно найти IP-адрес по умолчанию на виртуальной машине [%s]", + "ORG_ZSTACK_CLOUDFORMATION_10028": "templateContent и url не должны быть одновременно пустыми или одновременно установленными!", + "ORG_ZSTACK_CLOUDFORMATION_10026": "templateContent и templateUuid не должны быть одновременно пустыми!", + "ORG_ZSTACK_HYBRID_ACCOUNT_10000": "keyType не поддерживает тип [%s]", + "ORG_ZSTACK_HYBRID_ACCOUNT_10002": "ключ: [%s] с типом: [%s] уже существует для UUID учётной записи: [%s]", + "ORG_ZSTACK_HYBRID_ACCOUNT_10003": "параметры [accountUuid] могут использоваться только административными пользователями!", + "ORG_ZSTACK_HYBRID_ACCOUNT_10004": "ключ: [%s] уже существует для UUID учётной записи: [%s]", + "ORG_ZSTACK_CLOUDFORMATION_10014": "Содержимое должно быть установлено через template content или URL!", + "ORG_ZSTACK_CLOUDFORMATION_10013": "невозможно удалить или обновить системный шаблон: %s", + "ORG_ZSTACK_CLOUDFORMATION_10012": "StackTemplateVO был удалён из репозитория облачных шаблонов. Пожалуйста, проверьте и повторно загрузите шаблон.", + "ORG_ZSTACK_CLOUDFORMATION_10011": "не удается найти параметры для %s, который имеет тип %s, пожалуйста, проверьте параметры", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10002": "не удалось подключить аппаратный пул VXLAN по причине: %s", + "ORG_ZSTACK_CLOUDFORMATION_10010": "templateContent должен быть указан!", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10003": "не удалось создать аппаратную сеть L2 VXLAN без указания идентификатора VLAN", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10000": "не удалось подключить сеть уровня 2 к кластеру, так как хост[uuid:%s] не имеет виртуального интерфейса[name:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10001": "не удалось подключить аппаратный пул VXLAN, так как невозможно найти порт коммутатора для хоста[uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_10019": "невозможно найти имя l2-моста l2[%s] из systemTag", + "ORG_ZSTACK_CLOUDFORMATION_10018": "Параметр filterName должен быть установлен в значение cloudformation:true или cloudformation:false.", + "ORG_ZSTACK_CLOUDFORMATION_10017": "StackTemplateVO: [%s] был удален из облачного репозитория...", + "ORG_ZSTACK_CLOUDFORMATION_10016": "неверная версия шаблона CloudFormation: %s", + "ORG_ZSTACK_CLOUDFORMATION_10015": "Не удалось получить входные данные содержимого для облачного ресурса. Пожалуйста, убедитесь, что исходные файлы правильно загружены и настроены.", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10006": "не удалось создать сеть VXLAN Huawei iMaster SDN без указания идентификатора VPC", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10007": "не удалось добавить диапазон vni, так как указанный диапазон vni [%d-%d] недействителен", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10004": "не удалось создать сеть VXLAN Huawei iMaster SDN, так как идентификатор VLAN [%s] выходит за пределы допустимого диапазона: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10005": "не удалось создать сеть VXLAN Huawei iMaster SDN без vpcId и tenantId", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10009": "не удалось добавить контроллер Huawei iMaster SDN в сеть без указания диапазона VLAN", + "ORG_ZSTACK_NETWORK_L2_10013": "невозможно изменить VLAN для сети L2 [UUID:%s], так как к ней все еще подключены хосты в состоянии подключения или отключения", + "ORG_ZSTACK_NETWORK_L2_10012": "неподдерживаемый тип виртуального коммутатора[%s]", + "ORG_ZSTACK_NETWORK_L2_10015": "невозможно изменить VLAN для l2Network[uuid:%s], так как эта сеть изолирована", + "ORG_ZSTACK_NETWORK_L2_10014": "невозможно изменить VLAN для l2Network[uuid:%s], так как она ограничена исключительно кластером KVM", + "ORG_ZSTACK_NETWORK_L2_10017": "vlan[%s] недействителен для конфигурации облачной сети", + "ORG_ZSTACK_NETWORK_L2_10016": "vlan является обязательным для ChangeL2NetworkVlanId с типом[%s]", + "ORG_ZSTACK_NETWORK_L2_10019": "vLAN не разрешен для ChangeL2NetworkVlanId с типом[%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10000": "нет подходящего хоста с доступной версией[%s] для развертывания", + "ORG_ZSTACK_NETWORK_L2_10018": "К кластеру была присоединена сеть L2 с идентификатором виртуальной сети [%s] и физическим интерфейсом [%s]. Не удалось изменить сеть L2 [uuid: %s].", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10083": "обнаружен существующий SimpleHttpBackupStorage с именем хоста[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10082": "недействительный URL[%s], URL должен быть абсолютным путем, начинающимся с '/'", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10080": "путь к файлу содержит недопустимый символ: %s", + "ORG_ZSTACK_NETWORK_L2_10020": "Не удалось изменить l2Network [uuid:%s], присоединенную к кластеру с физическим интерфейсом [%s].", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10079": "URL содержит недопустимый путь [/dev или /proc или /sys], который не поддерживается в облачных вычислительных средах. Пожалуйста, используйте допустимый путь для вашего запроса.", + "ORG_ZSTACK_CLOUDFORMATION_10034": "templateContent и uuid не должны быть оба пустыми или оба установлены!", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10078": "требуется абсолютный путь к исходному файлу: %s", + "ORG_ZSTACK_NETWORK_L2_10006": "Существует L2 сеть с UUID: %s и именем: %s, присоединенная к кластеру с UUID: %s, которая связана с физическим интерфейсом [%s]. Не удалось присоединить L2 сеть с UUID: %s.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10077": "Для продолжения проверки или редактирования кода требуется путь к исходному файлу. Пожалуйста, укажите путь к файлу.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10076": "дублирующееся хранилище резервных копий. Существует хранилище резервных копий образа [hostname:%s]", + "ORG_ZSTACK_NETWORK_L2_10008": "L2 сеть [UUID: %s] связана с кластером [UUID: %s] и не может быть переназначена.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10075": "hostname[%s] не является допустимым DNS-именем или IP-адресом", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10011": "DiskOfferingTagAllocatorExtensionPoint[%s] вернул ноль подходящих хостов", + "ORG_ZSTACK_CLOUDFORMATION_10030": "только администраторы имеют право включать или отключать системный StackTemplate", + "ORG_ZSTACK_NETWORK_L2_10007": "Существует L2 VLAN сеть [uuid:%s, name:%s], присоединенная к кластеру [uuid:%s], имеющему физический интерфейс [%s] и VLAN [%s]. Не удалось присоединить L2 VLAN сеть [uuid:%s].", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10010": "InstanceOfferingTagAllocatorExtensionPoint[%s] вернул ноль подходящих хостов", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10073": "исходное хранилище резервных копий не содержит образ[%s]", + "ORG_ZSTACK_NETWORK_L2_10009": "невозможно присоединить L2 сеть, так как существует другая сеть с другим типом vSwitch на физическом интерфейсе %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10072": "исходное хранилище[%s] не содержит образ[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10071": "целевое хранилище резервных копий [uuid:%s] уже содержит образ [uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10070": "не удалось удалить файл метаданных образа: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10009": "для хранилища резервных копий [UUID: %s, type: %s] требуется связанное основное хранилище, однако основное хранилище еще не добавлено.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10001": "Образ с UUID [uuid:%s] и именем [name:%s] был удален из всех хранилищ резервных копий.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10004": "привязка ресурсов не поддерживает тип %s пока", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10003": "В зонах[uuids:%s] не найден хост, присоединенный к хранилищу резервных копий, где расположен образ[%s].", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10005": "не найден доступный хост с привязанным ресурсом %s", + "ORG_ZSTACK_NETWORK_L2_10011": "неподдерживаемый тип L2 сети[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10003": "виртуальный роутер[uuid:%s, ip:%s] не смог настроить DNS%s для L3 сети[uuid:%s, name:%s], %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10008": "Образ[uuid:%s] расположен на хранилище резервных копий[uuid:%s, type:%s], которое требует взаимодействия с основным хранилищем[uuid:%s]; однако не найден подходящий хост для обеспечения этого взаимодействия.", + "ORG_ZSTACK_NETWORK_L2_10010": "L2 сеть[uuid:%s] не присоединена к кластеру[uuid:%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10007": "Образ[uuid:%s, name:%s] хранится на хранилище резервных копий[uuid:%s, type:%s], которое требует основное хранилище типов %s; однако не найден хост с совместимым основным хранилищем.", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10068": "Проверка файла метаданных образа: %s не удалась", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10066": "Создание файла метаданных образа: %s не удалось", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10065": "Ошибка синхронизации создания метаданных образа: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10022": "невозможно найти корневой том экземпляра[uuid:%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10021": "не найден хост с доступными ЦП[%s], памятью[%s байт]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10000": "не удалось присоединить EIP, так как для сетевого интерфейса [uuid:%s] нет шлюза", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10062": "AddImage запрещен в Disaster Recovery BS: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10001": "L2Network, на которой базируется L3Network VIP, не присоединен к кластеру, где находится vmNic[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10002": "невозможно привязать более 1 EIP к VM NIC с UUID:%s типа flat", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10060": "отсутствует путь к образу на экземпляре[%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10015": "невозможно найти доступное основное хранилище [состояние: %s, статус: %s, доступная емкость %d байт]. Пожалуйста, проверьте состояние и статус основного хранилища и убедитесь, что оно присоединено к кластеру.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10014": "не найден хост в кластерах, присоединенных к основному хранилищу %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10016": "невозможно найти доступное основное хранилище [состояние: %s или %s, статус: %s]. Пожалуйста, проверьте состояние и статус основного хранилища и убедитесь, что оно присоединено к кластеру.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10031": "не найдено включенных хостов в [%s] кандидатных хостах с типом гипервизора [%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10030": "не найдено включенных хостов в [%s] списке кандидатных хостов", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10033": "Не найден хост с состоянием=Включен и статусом=Подключен", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10032": "не найден хост с состоянием=Включен статус=Подключен гипервизор=%s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10012": "такой объект %s не найден в bucket %s", + "ORG_ZSTACK_UTILS_10000": "не удалось сгенерировать ключ доступа для виртуальной машины %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10024": "необходимо указать либо UUID тома, либо UUID снимка тома", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10023": "Не найден хост в кластерах, присоединенных ко всем основным хранилищам %s, где находятся тома VM[UUID:%s].", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10026": "После исключения избегаемых хостов не осталось кандидатов в пуле.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10025": "zoneUuids, clusterUuids и hostUuids должны каждый содержать как минимум один непустой список, либо все значения должны быть установлены в true.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10015": "Aliyun EBS Backup Storage не поддерживает вычисление хэшей образов.", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10027": "Не найден хост в кластерах, присоединенных к L2Networks, которые имеют связанные L3Networks%s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10029": "не найдено подключенных хостов в [%s] кандидатных хостах", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10005": "Выберите стратегию балансировки нагрузки, необходимо установить тип алгоритма", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10008": "Не найден хост с менее чем %s виртуальными машинами", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10022": "Учетная запись [UUID:%s] не имеет доступа к ресурсу [UUID:%s, тип:L3NetworkVO].", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10024": "изменить IP DHCP сервера на [%s], но получено [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10025": "UUID L3 Network не может быть пустым", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10003": "Неверные настройки облачного провайдера, допустимое значение %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10021": "UUID сессии/учетной записи недействителен. Пожалуйста, проверьте и попробуйте снова.", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10000": "Ocean endpoint URL должен быть настроен для Alibaba Cloud EBS backup storage.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10017": "невозможно применить операцию EIP для VM[uuid:%s, state:%s], так как hostUUID не найден", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10009": "Aliyun EBS Backup Storage не поддерживает отмену процесса загрузки образа.", + "ORG_ZSTACK_CORE_TIMEOUT_10000": "таймаут api не может быть установлен меньше %s миллисекунд", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10002": "невозможно удалить OSS bucket [%s], так как он все еще содержит экземпляры Aliyun EBS Backup Storage, пожалуйста, убедитесь, что все связанные экземпляры backup storage удалены сначала.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10004": "текущее primary storage не поддерживает указанный тип протокола; пожалуйста, убедитесь, что протокол добавлен в storage сначала.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10003": "параметр [protocol] имеет значение null. Для primary storage типа [%s], block volume protocol должен быть указан.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10000": "Ошибка пути к cloud resource: Пожалуйста, проверьте расположение и существование файла.", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10002": "имя: [%s] уже существует. Имена block volume должны быть уникальны внутри типа primary storage [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10010": "невозможно получить DHCPv6 server IP для Layer 3 network [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10009": "невозможно получить DHCPv4 server IP для layer 3 network [uuid:%s]", + "ORG_ZSTACK_POLICYROUTE_10029": "Невозможно удалить системную таблицу маршрутизации политик", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10005": "host[uuid:%s] не подготовлен", + "ORG_ZSTACK_POLICYROUTE_10027": "Невозможно удалить системно определенный набор политик маршрутизации. Пожалуйста, убедитесь, что этот набор политик не используется какими-либо активными ресурсами перед попыткой удаления.", + "ORG_ZSTACK_POLICYROUTE_10028": "Невозможно найти связанный экземпляр виртуального маршрутизатора. Пожалуйста, убедитесь, что виртуальный маршрутизатор правильно настроен и доступен.", + "ORG_ZSTACK_POLICYROUTE_10025": "ruleSet[%s] все еще связан с сетевой картой (NIC)", + "ORG_ZSTACK_POLICYROUTE_10020": "VRouter[%s] уже имеет таблицу маршрутизации на основе политик [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10044": "Можно изменить DHCP server IP только если включен flat DHCP.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10045": "невозможно изменить DHCP server IP, потому что %s не является владельцем Layer 3 network[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10046": "Невозможно изменить DHCPv4 server IP, так как нет настроенного диапазона IPv4 адресов.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10047": "невозможно установить DHCP v4 server IP, так как предоставленный IP [%s] не является допустимым CIDR для L3 network [%s]", + "ORG_ZSTACK_IDENTITY_RBAC_10011": "операция[API:%s] отклонена по умолчанию по соображениям безопасности. Пожалуйста, свяжитесь с вашим администратором для решения этой проблемы.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10041": "Можно установить DHCPv6 server IP, так как нет настроенного диапазона IPv6.", + "ORG_ZSTACK_IDENTITY_RBAC_10012": "операция отклонена политикой [name: %s uuid: %s]", + "ORG_ZSTACK_IDENTITY_RBAC_10013": "операция отклонена политикой[name:%s, uuid:%s], поле[%s] не разрешено для изменения", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10037": "невозможно удалить ip адрес, потому что ip [%s] является DHCP server IP адресом", + "ORG_ZSTACK_POLICYROUTE_10018": "Невозможно обновить системный набор политик маршрутизации. Пожалуйста, убедитесь, что у вас есть необходимые разрешения и попробуйте снова.", + "ORG_ZSTACK_POLICYROUTE_10019": "Невозможно обновить системную таблицу маршрутизации на основе политик. Пожалуйста, убедитесь, что у вас есть необходимые разрешения и попробуйте снова.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10039": "Можно установить DHCPv4 server IP, так как нет настроенного диапазона IPv4.", + "ORG_ZSTACK_POLICYROUTE_10017": "Невозможно найти связанный Virtual Router", + "ORG_ZSTACK_POLICYROUTE_10014": "недопустимый тип протокола %s", + "ORG_ZSTACK_POLICYROUTE_10015": "Набор правил [%s] уже содержит правило с номером %s.", + "ORG_ZSTACK_POLICYROUTE_10013": "Ошибка операции, формат IP поддерживает только IPv4/IP-диапазон/CIDR, но найдено %s", + "ORG_ZSTACK_POLICYROUTE_10010": "NextHopIp должен быть в формате IPv4, но найдено [%s]", + "ORG_ZSTACK_CORE_REST_10012": "Не удалось получить %s за %sмс", + "ORG_ZSTACK_QUERY_10021": "Поле [%s] не является примитивом инвентаря %s; вы не можете указать его в параметре 'fields'; допустимые поля: %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10034": "IP-адрес DHCP-сервера [%s] уже существует в L3-сети [%s]", + "ORG_ZSTACK_QUERY_10020": "Класс метаданных сущности [%s] не содержит поле [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10035": "IP-адрес DHCP-сервера [%s] не должен совпадать с IP-адресом шлюза", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10036": "IP-адрес DHCP-сервера [%s] не может быть настроен в системных параметрах L3-сети", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10030": "IP-адрес DHCP-сервера [%s] не является допустимым IPv4-адресом", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10031": "IP-адрес DHCP-сервера [%s] не входит в указанный CIDR [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10032": "IP-адрес DHCP-сервера [%s] не является допустимым IPv6-адресом", + "ORG_ZSTACK_IDENTITY_RBAC_10004": "Вы не авторизованы для обновления системной или предопределенной роли. Пожалуйста, обратитесь к администратору за помощью.", + "ORG_ZSTACK_POLICYROUTE_10009": "DestinationCidr должен быть в формате CIDR, но найдено [%s]", + "ORG_ZSTACK_IDENTITY_RBAC_10007": "В доступе отказано, учетная запись [uuid:%s] не авторизована для доступа к ресурсу [uuid:%s, type:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10027": "Невозможно настроить DHCP для виртуальной машины [uuid:%s] на целевом хосте [uuid:%s]", + "ORG_ZSTACK_IDENTITY_RBAC_10008": "В доступе отказано, учетная запись [uuid:%s] не авторизована для управления тегированным ресурсом [uuid:%s, type:%s]", + "ORG_ZSTACK_POLICYROUTE_10008": "VRouter[%s] уже имеет набор правил с именем %s", + "ORG_ZSTACK_IDENTITY_RBAC_10005": "Вы не авторизованы для удаления системной или предопределенной роли. Пожалуйста, обратитесь к администратору за помощью.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10029": "Минимальная длина префикса IP-диапазона для плоской сети составляет %d", + "ORG_ZSTACK_POLICYROUTE_10003": "l3[%s] уже имеет прикрепленный набор правил политики маршрутизации", + "ORG_ZSTACK_IDENTITY_RBAC_10009": "Учетная запись [UUID:%s] не имеет доступа к ресурсам [UUID:%s, Type:%s]", + "ORG_ZSTACK_POLICYROUTE_10000": "Сеть маршрута по умолчанию не может быть изменена при включенных системных политиках маршрутизации.", + "ORG_ZSTACK_QUERY_10018": "Имя условия [%s] недействительно, поле не найдено в классе инвентаря [%s]", + "ORG_ZSTACK_QUERY_10017": "\"value\" условия запроса %s не может быть null для фильтрации облачных ресурсов", + "ORG_ZSTACK_QUERY_10015": "filterName должен быть в формате [filterType:condition(s)]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_10000": "Не удалось создать строку подписи API ocean: %s", + "ORG_ZSTACK_QUERY_10019": "Имя условия [%s] недействительно: поле [%s] инвентаря [%s] помечено как @UnqueryableField", + "ORG_ZSTACK_ALIYUN_PANGU_10001": "appName: %s, partitionName: %s уже существует в identityZone: %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10050": "Невозможно установить IP-адрес DHCP-сервера, так как IP [%s] уже выделен", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10051": "Не удалось установить IP-адрес DHCPv6-сервера, так как IP[%s] уже используется", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10053": "Не удалось выделить IP-адрес DHCP-сервера.%s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10048": "Не удалось изменить IP-адрес DHCPv6-сервера, так как не настроен диапазон IPv6.", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10049": "Не удалось установить IP-адрес DHCPv6-сервера, так как IP[%s] не является допустимой нотацией CIDR для L3-сети [%s]", + "ORG_ZSTACK_USBDEVICE_10026": "Пожалуйста, отключите все USB-устройства от ВМ[%s] и попробуйте снова", + "ORG_ZSTACK_USBDEVICE_10025": "Невозможно отсоединить USB-устройство[uuid:%s], когда оно подключено к экземпляру ВМ", + "ORG_ZSTACK_USBDEVICE_10024": "Экземпляр ВМ [uuid:%s] не находится в подсоединяемом состоянии для USB-устройства %s", + "ORG_ZSTACK_USBDEVICE_10023": "Экземпляр ВМ, к которому подключено USB-устройство [uuid:%s], не находится в отсоединяемом состоянии: %s", + "ORG_ZSTACK_USBDEVICE_10022": "USB-устройство [UUID:%s] не подключено ни к одному экземпляру виртуальной машины.", + "ORG_ZSTACK_USBDEVICE_10021": "Хост, к которому подключено USB-устройство [uuid:%s], не находится в допустимом состоянии [%s] или статусе [%s].", + "ORG_ZSTACK_USBDEVICE_10020": "Экземпляр ВМ[UUID:%s] не находится в подсоединяемом состоянии для USB-устройства: %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10005": "L3 Сеть [uuid:%s] не существует", + "ORG_ZSTACK_COMPUTE_SRIOV_10006": "%s, так как нет доступного SRIOV-устройства в L3 сети [uuid:%s] хоста [uuid:%s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10007": "не удалось изменить состояние HA для VF NIC, так как VF NIC [UUID:%s] не существует", + "ORG_ZSTACK_COMPUTE_SRIOV_10008": "не удалось изменить состояние высокой доступности виртуальной сетевой карты, так как состояние высокой доступности[%s] недопустимо", + "ORG_ZSTACK_COMPUTE_SRIOV_10009": "L2 Сеть [UUID:%s] не найдена", + "ORG_ZSTACK_COMPUTE_SRIOV_10000": "не удалось установить MAC-адрес VF NIC на хосте[uuid:%s, ip:%s], так как %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10001": "не удалось изменить состояние HA виртуальной сетевой карты, ошибка: %s", + "ORG_ZSTACK_DRS_10000": "Кластер[%s] инициировал Службу Репликации Данных", + "ORG_ZSTACK_DRS_10002": "Пороговые значения не могут быть пустыми. Пожалуйста, убедитесь, что пороговые настройки правильно настроены.", + "ORG_ZSTACK_DRS_10001": "DRS отключен для этой виртуальной машины. Пожалуйста, убедитесь, что DRS включен для оптимизации распределения ресурсов.", + "ORG_ZSTACK_DRS_10004": "недопустимый оператор порога[%s]", + "ORG_ZSTACK_DRS_10003": "недопустимое имя порога[%s]", + "ORG_ZSTACK_DRS_10006": "недопустимое значение порога, допустимый диапазон: (0, 100]", + "ORG_ZSTACK_DRS_10005": "Пороговое значение для мониторинга облачных ресурсов не может быть пустым.%s", + "ORG_ZSTACK_DRS_10008": "Статус DRG[%s] — %s", + "ORG_ZSTACK_DRS_10007": "GlobalConfig ENABLE_DRS отключен", + "ORG_ZSTACK_DRS_10009": "Уровень автоматизации DRS[%s] не установлен в ручной режим", + "ORG_ZSTACK_ZWATCH_FUNCTION_10012": "значение[%s] не является допустимым целым числом", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10018": "не удалось выполнить операцию API. Внутренняя сеть [UUID:%s] подключена к VPC роутеру [UUID:%s], который не подключен к внешней сети [UUID:%s].", + "ORG_ZSTACK_ZWATCH_FUNCTION_10011": "неверный аргумент[limit:%s], он не может быть отрицательным значением", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10019": "Серверная сеть [UUID:%s] должна быть сетью VPC, так как другая серверная сеть настроена как сеть VPC.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10010": "неизвестный аргумент[%s]", + "ORG_ZSTACK_DRS_10020": "Удаление DRS не допускается во время миграции ВМ.", + "ORG_ZSTACK_DRS_10011": "Успешно выполнено; повторное развертывание не допускается", + "ORG_ZSTACK_DRS_10010": "advice[%s] истек из-за неактивности", + "ORG_ZSTACK_DRS_10013": "ВМ[%s] не находится в рабочем состоянии", + "ORG_ZSTACK_DRS_10012": "ВМ[%s] была завершена", + "ORG_ZSTACK_DRS_10015": "Кластер[%s] не поддерживает динамическое масштабирование ресурсов.", + "ORG_ZSTACK_DRS_10014": "ВМ[%s] больше не находится на исходном хосте[%s].", + "ORG_ZSTACK_DRS_10017": "Список UUID хостов пуст. Пожалуйста, убедитесь, что предоставлен хотя бы один UUID хоста.", + "ORG_ZSTACK_DRS_10016": "Не удалось создать экземпляр DRDS, %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10013": "серверная сеть [uuid:%s] должна быть сетью VPC, так как передняя сеть L3 является сетью VPC", + "ORG_ZSTACK_ZWATCH_FUNCTION_10005": "неверный аргумент[start:%s], он не может быть отрицательным числом в облачной вычислительной среде", + "ORG_ZSTACK_DRS_10019": "advice не допускается во время планирования задачи", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10014": "не удалось выполнить операцию API. Серверная сеть [UUID:%s] не подключена к маршрутизатору VPC. Пожалуйста, убедитесь, что сеть правильно подключена перед повторной попыткой.", + "ORG_ZSTACK_DRS_10018": "Не удалось запросить данные об использовании хоста", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10015": "Серверная сеть связана с маршрутизатором VPC [uuid:%s], в то время как передняя сеть связана с другим маршрутизатором VPC [uuid:%s]. Пожалуйста, убедитесь, что обе сети связаны с одним и тем же маршрутизатором VPC.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10016": "не удалось выполнить операцию API. Серверная сеть [uuid:%s] должна быть частной плоской сетью, так как передняя сеть L3 является частной плоской сетью.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10002": "неизвестная функция[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10010": "CIDR серверной сети перекрывается с CIDR передней сети L3", + "ORG_ZSTACK_ZWATCH_FUNCTION_10008": "неверное значение[%s] для аргумента[%s] в конфигурации облачной вычислительной среды", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10011": "CIDR серверной сети [%s] перекрывается с CIDR управляющей сети L3 [%s]. Пожалуйста, убедитесь в отсутствии перекрытия между CIDR сетей для избежания конфликтов конфигурации. Затронуты UUID серверной сети [%s] и UUID управляющей сети [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10012": "не удалось выполнить операцию API. Передняя сеть [UUID:%s] не подключена к маршрутизатору VPC", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10001": "не удалось найти группу OSD, связанную с пулом CEPH [%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10000": "требуемый пул Ceph [uuid:%s] не может удовлетворить условие [availableSize > %d байт], текущий доступный размер %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10006": "не удалось создать экземпляр SLB, так как образ [uuid:%s] был удален", + "ORG_ZSTACK_ZWATCH_FUNCTION_10001": "дублирующийся аргумент[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10007": "Создание экземпляра SLB не удалось из-за достижения максимального лимита экземпляров.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10000": "отсутствует обязательный аргумент[%s] для конфигурации облачного экземпляра", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10008": "невозможно создать группу SLB из-за недопустимого типа сети L3 %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10009": "CIDR сети [%s] перекрывается с CIDR управляющей сети L3 [%s]", + "ORG_ZSTACK_DRS_10022": "Планирование не допускается во время миграции виртуальной машины.", + "ORG_ZSTACK_DRS_10023": "Отсутствуют данные об использовании ЦП и памяти хоста", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10002": "облако не может удалить VIP[%s]. Сначала убедитесь, что SLB[uuid:%s] удален.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10003": "невозможно создать экземпляр SLB, так как группа балансировщика нагрузки SLB [uuid:%s] не существует", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10004": "невозможно создать экземпляр SLB, так как для группы SLB [uuid:%s] не настроено предложение SLB", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10005": "невозможно создать экземпляр SLB, так как UUID образа предложения SLB [uuid:%s] равен null", + "ORG_ZSTACK_CORE_ENCRYPT_10000": "Ошибка шифрования : %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10000": "невозможно найти сетевой интерфейс экземпляра SLB [uuid:%s], который подключен к сети L3 группы SLB [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10001": "невозможно удалить диапазон IP [%s], сначала удалите балансировщик нагрузки [uuid:%s]", + "ORG_ZSTACK_IDENTITY_10011": "Старый пароль не соответствует исходному паролю. Невозможно обновить пароль пользователя[%s].", + "ORG_ZSTACK_IDENTITY_10010": "Пользователь с UUID [%s] не имеет связи с учетной записью с UUID [%s].", + "ORG_ZSTACK_IDENTITY_10016": "Квота[name:%s] для учетной записи[uuid:%s] не может быть установлена в %d", + "ORG_ZSTACK_IDENTITY_10017": "Учетная запись [UUID:%s] использовала [Name:%s, Значение использования:%s] превышает запрошенную квоту: %d", + "ORG_ZSTACK_IDENTITY_10001": "Неверные учетные данные аутентификации. Пожалуйста, проверьте свой пароль и попробуйте снова.", + "ORG_ZSTACK_IDENTITY_10009": "учетная запись [UUID: %s] не имеет доступа к ресурсу [UUID: %s]", + "ORG_ZSTACK_IDENTITY_10008": "Группа пользователей с UUID [%s] не принадлежит учетной записи с UUID [%s].", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10003": "не удалось освободить vip%s из-за %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10009": "сервис[uuid: %s] уже привязан к серверу наблюдаемости", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10002": "не удалось синхронизировать VIP [ips: %s] на виртуальном маршрутизаторе [uuid:%s] для привязки NIC [uuid: %s, ip: %s], из-за %s", + "ORG_ZSTACK_OVF_10025": "Только виртуальная машина в состоянии: %s может быть экспортирована.", + "ORG_ZSTACK_OVF_10026": "не удалось разобрать jsonCreateVmParam в APICreateVmInstanceFromOvfMsg Недопустимые параметры запроса", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10006": "Найдено предложение виртуального маршрутизатора [uuid:%s] для L3Network [uuid:%s] в зоне [uuid:%s]; однако общедоступная IP-сеть сети [uuid:%s] не соответствует VIP [uuid:%s]. Возможно, потребуется указать конкретное предложение виртуального маршрутизатора с помощью системного тега guestL3Network::l3NetworkUuid.", + "ORG_ZSTACK_OVF_10023": "Для экспорта VM требуется резервное хранилище ImageStore, но данный backupStorageUuid: %s не является резервным хранилищем ImageStore.", + "ORG_ZSTACK_OBSERVABILITYSERVER_10006": "сервер наблюдаемости с UUID: %s не включен", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10005": "виртуальный маршрутизатор[uuid:%s, state:%s] не активен", + "ORG_ZSTACK_OVF_10024": "Не найдена виртуальная машина для экспорта с UUID: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10007": "образ предложения сервера наблюдаемости[UUID: %s] отсутствует", + "ORG_ZSTACK_OVF_10021": "Не удалось создать VM из OVF, поскольку не найден системный диск виртуальной машины. Пожалуйста, убедитесь, что требуемый диск правильно настроен и доступен.", + "ORG_ZSTACK_OVF_10022": "VM[UUID: %s] уже экспортирован как OVA-пакет[UUID: %s]. Пожалуйста, удалите пакет и попробуйте снова.", + "ORG_ZSTACK_KVM_XMLHOOK_10001": "xml hook с UUID %s был успешно обновлён, но не удалось перезапустить VM с UUID %s. Подробности: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10003": "невозможно найти виртуальный маршрутизатор для сервиса: %s, тип: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10010": "сервер observability с UUID: %s не работает; невозможно присоединить сервис", + "ORG_ZSTACK_OVF_10018": "Не удалось прочитать OVF-файл для виртуальной машины %s. Пожалуйста, проверьте путь к файлу и права доступа.", + "ORG_ZSTACK_OVF_10017": "ova-пакет[uuid: %s] не найден в репозитории виртуальных машин.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10057": "невозможно найти UUID группы SLB для балансировщика нагрузки[uuid:%s,type:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_FILESYSTEM_10000": "heartbeat узла[uuid:%s] не обновлялся недавно", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_HA_10000": "Точка расширения HA группы не инициализирована", + "ORG_ZSTACK_OVF_10030": "выполнение длительного задания[uuid:%s] не удалось", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10040": "невозможно добавить vmnic в группу серверов балансировщика нагрузки, так как l3 сеть [uuid:%s] подключена к другому vpc-маршрутизатору", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10041": "невозможно добавить VMNIC в группу серверов балансировщика нагрузки, так как L3 сеть не подключена к экземпляру SLB", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10046": "невозможно создать экземпляр SLB, так как другой экземпляр [UUID: %s, name: %s] уже существует для группы SLB", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10047": "Не удалось создать экземпляр SLB, так как для группы SLB уже создано два экземпляра.", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10001": "не удалось загрузить данные с NFS-хранилища [uuid:%s, path:%s] в хранилище образов [hostname:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10042": "невозможно изменить IP монитора группы SLB, так как указан недопустимый IP монитора %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10043": "невозможно переключить группу SLB [uuid:%s] в режим высокой доступности, так как состояние экземпляра [%s] не является остановленным", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10044": "не удалось создать VIP%s на виртуальном маршрутизаторе[UUID:%s], потому что %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10000": "не удалось загрузить данные с хранилища образов резервного копирования[hostname:%s, path: %s] в основное NFS-хранилище[uuid:%s, path: %s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10045": "создание affinity группы для экземпляра SLB [uuid:%s] не удалось", + "ORG_ZSTACK_IAM2_API_10011": "атрибут[uuid:%s] не связан ни с одной определённой группой", + "ORG_ZSTACK_IAM2_API_10012": "атрибут[uuid:%s] не связан ни с одной организацией", + "ORG_ZSTACK_IAM2_API_10013": "атрибут[uuid:%s] не связан ни с одним проектом", + "ORG_ZSTACK_IAM2_API_10014": "атрибут[uuid:%s] не связан ни с одним ID виртуального экземпляра", + "ORG_ZSTACK_IAM2_API_10015": "Политика退休 необходимо удалить перед выводом проекта из退休 состояния.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10039": "невозможно добавить vmnic в группу серверов балансировщика нагрузки, так как l3 сеть [uuid:%s] подключена к любому vpc-маршрутизатору", + "ORG_ZSTACK_IAM2_API_10016": "вход запрещён, так как проект находится в состоянии %s", + "ORG_ZSTACK_IAM2_API_10017": "квота[name:%s] не существует", + "ORG_ZSTACK_IAM2_API_10018": "Ограничение CPU для контейнера (%s) должно быть больше запрошенного объёма CPU (%s).", + "ORG_ZSTACK_IAM2_API_10019": "Ограничение размера памяти для контейнера должно быть больше запрошенного размера памяти.", + "ORG_ZSTACK_OVF_10003": "Контроллер управления томами не найден. Пожалуйста, убедитесь, что ваша служба управления томами правильно настроена и запущена.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10007": "VipQoS для Vip [uuid: %s] не существует", + "ORG_ZSTACK_OVF_10004": "Контроллер драйвера CD не найден. Пожалуйста, убедитесь, что необходимые драйверы виртуализации установлены и настроены для вашего экземпляра.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10008": "Невозможно удалить Quality of Service для Virtual IP [uuid: %s]. Он связан с VPC Shared Quality of Service.", + "ORG_ZSTACK_OVF_10001": "Недопустимое указание емкости диска: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10005": "Невозможно установить Quality of Service (Qos) для VIP [UUID: %s]. Он уже присоединен к VpcSharedQos.", + "ORG_ZSTACK_OVF_10002": "Недопустимый размер выделенного диска: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10006": "VIP QoS для VIP [uuid: %s] порт %s не существует", + "ORG_ZSTACK_OVF_10000": "Ссылка на диск не найдена для диска %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10009": "Не удается найти VIP QoS backend для VIP [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10010": "VpcSharedQos должен указывать Bandwidth", + "ORG_ZSTACK_IPSEC_10028": "L3 сеть [%s] не присоединена к IPsec туннелю [UUID :%s]", + "ORG_ZSTACK_AUTOSCALING_10000": "недопустимые UUID L3 сетей[%s] для listener, связанного с load balancer[%s], все сети должны быть присоединены к тому же виртуальному маршрутизатору, что и LB сервис, и быть частью той же конфигурации сети VRouter", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10011": "VPC необходимо сначала присоединить к L3[%s]", + "ORG_ZSTACK_IPSEC_10029": "CIDR [%s] уже включен в конфигурацию IPsec [UUID :%s]", + "ORG_ZSTACK_AUTOSCALING_10001": "не удалось отсоединить autoScalingTemplate[%s] от AutoScalingGroup, ошибки: %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10030": "невозможно присоединить L3 сеть с UUID [%s] к SLB экземпляру из-за недопустимого формата IPv6 префикса [%s]", + "ORG_ZSTACK_AUTOSCALING_10003": "listeners с UUID: %s используются autoScalingVmTemplate[%s] и не могут быть удалены", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10014": "VpcSharedQos не может присоединить этот VIP, так как он уже присоединен к другому VpcSharedQos.", + "ORG_ZSTACK_IPSEC_10025": "L3 сеть [%s] не может быть присоединена к IPsec [UUID:%s] несколько раз", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10012": "Параметр AttachVipToVpcSharedQos должен указывать VipUuids или VipLists", + "ORG_ZSTACK_IPSEC_10026": "необходимо включить Layer 3 сети в APIAttachL3NetworksToIPsecConnectionMsg", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10013": "VpcSharedQos не может присоединить этот VIP, так как VIP[%s] не находится в L3 сети[%s].", + "ORG_ZSTACK_IPSEC_10027": "L3 сеть [%s] не является VPC сетью и не может быть присоединена или отсоединена к IPsec.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10035": "невозможно создать load balancer, так как VIP [uuid:%s] уже связан с другой сетевой службой [%s]", + "ORG_ZSTACK_IPSEC_10020": "адрес пира[%s] не является допустимым IPv4 адресом", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10036": "невозможно создать load balancer, так как VIP [uuid:%s] уже присоединен к VPC маршрутизатору [%s]", + "ORG_ZSTACK_IPSEC_10021": "Ключ аутентификации не должен содержать пробелы или специальные символы, такие как %s.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10037": "невозможно создать load balancer из-за недопустимой SLB группы [uuid:%s]", + "ORG_ZSTACK_IPSEC_10022": "IPsec VIP [%s] не должен быть первым или последним IP адресом в диапазоне CIDR, связанном с типом пула публичных адресов.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10038": "не удалось добавить сетевой интерфейс сервера-получателя в группу серверов [uuid:%s], так как UUID сетевого интерфейса имеет значение null", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10031": "", + "ORG_ZSTACK_AUTOSCALING_10004": "невозможно подключить сеть L3 с UUID [%s] к экземпляру SLB, так как IP-адрес и префикс должны быть указаны в системных тегах", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10032": "", + "ORG_ZSTACK_AUTOSCALING_10005": "Экземпляр не существует в группе масштабирования. Пожалуйста, проверьте ID экземпляра и название группы масштабирования [%s].", + "ORG_ZSTACK_IAM2_API_10020": "", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10033": "невозможно отключить интерфейсную сеть L3 [uuid:%s] от экземпляра SLB", + "ORG_ZSTACK_AUTOSCALING_10006": "", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10034": "оповещения с UUID:%s связаны с autoScalingGroup[%s] и не могут быть удалены", + "ORG_ZSTACK_IAM2_API_10021": "", + "ORG_ZSTACK_IAM2_API_10022": "организация[uuid:%s] является облачным арендатором и не может иметь родительскую организацию", + "ORG_ZSTACK_IAM2_API_10023": "", + "ORG_ZSTACK_IAM2_API_10024": "невозможно отключить управляющую сеть L3 [uuid:%s] от экземпляра SLB", + "ORG_ZSTACK_IAM2_API_10025": "", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10028": "правило[%s] отключено", + "ORG_ZSTACK_IAM2_API_10026": "", + "ORG_ZSTACK_OBSERVABILITYSERVER_10019": "невозможно отключить сетевой интерфейс [uuid:%s] от экземпляра SLB, так как это последний сетевой интерфейс L3 сервера-получателя", + "ORG_ZSTACK_IAM2_API_10027": "", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10029": "родительская организация [uuid:%s] не может быть дочерней организацией [uuid:%s] во вложенной организационной структуре", + "ORG_ZSTACK_IAM2_API_10028": "", + "ORG_ZSTACK_IAM2_API_10029": "дублирующееся имя виртуальной машины[%s]", + "ORG_ZSTACK_OBSERVABILITYSERVER_10015": "", + "ORG_ZSTACK_OVF_10015": "дублирующееся имя виртуальной среды[%s]", + "ORG_ZSTACK_OBSERVABILITYSERVER_10016": "", + "ORG_ZSTACK_OVF_10012": "недопустимое имя проекта[%s], проект с таким именем уже существует", + "ORG_ZSTACK_OBSERVABILITYSERVER_10017": "", + "ORG_ZSTACK_OBSERVABILITYSERVER_10018": "IAM2OrganizationVO[uuid:%s] не существует", + "ORG_ZSTACK_OVF_10010": "", + "ORG_ZSTACK_OBSERVABILITYSERVER_10011": "невозможно подключить сеть L3 с UUID [%s] к экземпляру SLB, так как IP-адрес и маска подсети должны быть указаны в системных тегах", + "ORG_ZSTACK_OVF_10011": "", + "ORG_ZSTACK_OBSERVABILITYSERVER_10013": "сервис[uuid: %s] с типом %s не может быть присоединен к серверу observability[uuid: %s] по причине: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10000": "Качество обслуживания (QoS) VIP для IPv6 будет реализовано в ближайшее время.", + "ORG_ZSTACK_ALIYUN_STORAGE_SNAPSHOT_10000": "Операция разрешена только когда статус ECS-экземпляра \"работает\" или \"остановлен\".", + "ORG_ZSTACK_OVF_10009": "CPU 'InstanceID' не найден. Пожалуйста, проверьте ID экземпляра и убедитесь, что CPU правильно назначен.", + "ORG_ZSTACK_OBSERVABILITYSERVER_10020": "Неверный формат даты-времени. Ожидается формат ISO-8601 с необязательной информацией о часовом поясе: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10021": "сервер observability [UUID: %s] не активен; невозможно получить данные сервиса", + "ORG_ZSTACK_OVF_10007": "Виртуальная память 'VirtualQuantity' не найдена", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10003": "SetVipQos должен указать либо InboundBandwidth, либо OutboundBandwidth.", + "ORG_ZSTACK_OVF_10008": "Неверное значение памяти виртуальной машины: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10004": "Невозможно установить качество обслуживания (QoS) для этого виртуального IP (VIP). Не все одноранговые сети уровня 3 предоставляют сервис VIP QoS.", + "ORG_ZSTACK_OVF_10005": "Ethernet-адаптер: %s не подключен к сети.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10001": "QoS для VIP [uuid: %s] порт %s уже существует", + "ORG_ZSTACK_OVF_10006": "Виртуальная машина '%s' не найдена", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10002": "Качество обслуживания (QoS) для VIP [uuid: %s] уже существует", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10024": "не удалось создать группу SLB из-за неверного типа серверного экземпляра %s", + "ORG_ZSTACK_IPSEC_10031": "невозможно изменить состояние, поскольку IPsec [uuid:%s] не в готовом состоянии", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10025": "не удалось создать группу SLB из-за неверного IP монитора %s", + "ORG_ZSTACK_IPSEC_10032": "невозможно переподключить этот туннель IPsec [uuid:%s], пожалуйста, обновите версию IPsec", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10026": "невозможно присоединить сеть L3 с UUID [%s] к экземпляру SLB из-за неверного формата IPv4 адреса [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10027": "невозможно присоединить сеть L3 с UUID [%s] к экземпляру SLB из-за ошибки формата IPv4 маски подсети [%s]", + "ORG_ZSTACK_IAM2_API_10030": "недопустимая операция, невозможно добавить роль[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10021": "Серверная сеть [UUID:%s] подключена к VPC-роутеру [UUID:%s], в то время как другие серверные сети подключены к VPC-роутеру [UUID:%s].", + "ORG_ZSTACK_IAM2_API_10031": "невозможно выполнить операцию с устаревшими ID виртуальных машин: %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10022": "не удалось выполнить API-операцию. Серверная сеть [uuid:%s] не может быть сетью VPC, поскольку другие серверные сети не являются сетями VPC.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10023": "не удалось создать группу SLB из-за неверного типа развертывания %s", + "ORG_ZSTACK_IPSEC_10030": "CIDR [%s] не входит в определенные CIDR IPsec UUID [%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10026": "Ошибка операции: не удалось получить ответ от облачного вычислительного сервиса", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10028": "резервное копирование снимков в хранилище резервных копий является устаревшей функцией и будет удалено в будущей версии облачной платформы", + "ORG_ZSTACK_IAM2_API_10000": "имя атрибута не может быть пустым, значение[%s]", + "ORG_ZSTACK_IAM2_API_10001": "имя атрибута[%s] превышает максимальную длину в 2048 символов", + "ORG_ZSTACK_IAM2_API_10002": "атрибут[имя:%s] значение превышает максимальную длину в 2048 символов", + "ORG_ZSTACK_IAM2_API_10003": "Организация[UUID: %s] превысила запрошенный лимит для [Имя: %s, Используемое значение: %s].", + "ORG_ZSTACK_IAM2_API_10005": "%s не является допустимым значением для управления сетевым трафиком. Допустимые значения: allow/reject между определенными IP-диапазонами.", + "ORG_ZSTACK_IAM2_API_10006": "Организационная единица по умолчанию[%s] не может быть удалена", + "ORG_ZSTACK_IAM2_API_10007": "дублирующийся идентификатор шаблона[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10018": "VpcSharedQos не может отсоединить этот Vip, так как Vpc[%s] не подключен", + "ORG_ZSTACK_IAM2_API_10009": "Имя пользователя 'admin' зарезервировано в облачных вычислительных средах для обозначения административных привилегий. Пожалуйста, выберите другое имя для вашего пользователя.", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10016": "Параметр DetachVipFromVpcSharedQos должен указывать VipUuids или VipLists", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10017": "VpcSharedQos не может отсоединить этот VIP, так как VIP[%s] не присоединен", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10010": "основное хранилище ceph [uuid:%s] возможно было удалено или завершено.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10013": "основное хранилище Ceph [UUID: %s, имя: %s] недоступно, так как один монитор [UUID: %s] сообщает об ошибке операции [%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10012": "Существует другое основное хранилище CEPH с тем же FSID; вы не можете добавить одну и ту же конфигурацию CEPH как два разных основных хранилища.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10015": "Не удалось установить соединение с узлами хранилища (%s)", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10017": "узел монитора [ip:%s] возвращает fsid[%s], отличающийся от текущего fsid кластера[%s], вы случайно добавляете узел монитора, не принадлежащий этому кластеру?", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10016": "Не удалось добавить узел MON в решение основного хранилища на основе Ceph", + "ORG_ZSTACK_IAM2_API_10010": "недопустимое имя[%s], проект или учетная запись с таким идентификатором уже существует", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10008": "не удалось подключиться к основному хранилищу Ceph [UUID:%s], не удалось подключиться ко всем мониторам Ceph.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10007": "все мониторы не могут выполнить HTTP-запрос[%s]", + "ORG_ZSTACK_ZOPS_10009": "не удалось получить источники chrony, причина:%s", + "ORG_ZSTACK_ZOPS_10005": "%s недоступен из %s по причине:%s", + "ORG_ZSTACK_ZOPS_10004": "не удалось настроить источники времени '%s' в %s, причина:%s, raw: %s", + "ORG_ZSTACK_ZOPS_10007": "%s не удалось проверить состояние работоспособности кластера Ceph по причине: %s", + "ORG_ZSTACK_ZOPS_10006": "не удалось проверить, доступен ли %s из %s по причине:%s", + "ORG_ZSTACK_ZOPS_10001": "%s не является допустимым IP-адресом облачного экземпляра", + "ORG_ZSTACK_ZOPS_10003": "%s не является допустимым IP-адресом или именем хоста", + "ORG_ZSTACK_ZOPS_10002": "Внутренние и внешние серверы Chrony не могут быть нулевыми одновременно. Пожалуйста, убедитесь, что оба настроены правильно.", + "ORG_ZSTACK_ZOPS_10010": "не удалось получить источники chrony для %s, причина:%s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10001": "Резервное хранилище [UUID: %s, Имя: %s, FSID: %s] не является частью того же кластера Ceph, что и основное хранилище [UUID: %s, Имя: %s, FSID: %s].", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10004": "не удалось сохранить зашифрованный кэш образа: %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10005": "fsid не согласуется между основным хранилищем [ps(%s)] и резервным хранилищем [bs(%s)]. Создание шаблона therefore запрещено.", + "ORG_ZSTACK_ZOPS_10019": "Не удалось удалить старый chrony сервер в zstack.properties в %s, потому что:%s", + "ORG_ZSTACK_ZOPS_10016": "ZStone в настоящее время не поддерживает онлайн-обновление chrony серверов. Пожалуйста, убедитесь, что все изменения вносятся офлайн перед развертыванием.", + "ORG_ZSTACK_ZOPS_10015": "%s недоступен из текущей среды виртуальной машины", + "ORG_ZSTACK_ZOPS_10018": "Статус CEPH кластера нездоров. Пожалуйста, сначала проверьте вашу среду! %s", + "ORG_ZSTACK_ZOPS_10012": "Не удалось проверить, доступен ли %s с хоста %s, потому что он не находится под нашим управлением", + "ORG_ZSTACK_ZOPS_10011": "Не удалось синхронизировать chrony сервер в %s, потому что:%s, исходное: %s", + "ORG_ZSTACK_ZOPS_10014": "%s не может быть назначен как внешний chrony NTP-сервер!", + "ORG_ZSTACK_ZOPS_10020": "Не удалось настроить chrony %s сервер в zstack.properties в %s, потому что:%s", + "ORG_ZSTACK_PROXY_10000": "Невозможно найти конфигурацию пользовательского прокси с UUID %s", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10005": "Не удалось запустить сервер USB-перенаправления с хоста[uuid:%s]", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10004": "Невозможно запустить USB-сервис на хосте[%s], потому что хост не подключен", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10003": "Хост[%s] инициализировал более 64 портов USB-перенаправления", + "ORG_ZSTACK_COMPUTE_HOST_10085": "Невозможно настроить сеть управления на интерфейсе, так как он установлен в режим автоматического назначения.", + "ORG_ZSTACK_COMPUTE_HOST_10084": "Невозможно отключить сеть управления от интерфейса, так как это автоматически назначенный тип.", + "ORG_ZSTACK_COMPUTE_HOST_10087": "Невозможно отключить сеть управления от bonding-интерфейса, так как он использует автоматическое получение IP-адреса.", + "ORG_ZSTACK_COMPUTE_HOST_10081": "Невозможно настроить IP-адреса для подчиненных интерфейсов моста", + "ORG_ZSTACK_COMPUTE_HOST_10080": "IP-адрес уже назначен другому интерфейсу. Пожалуйста, убедитесь, что IP-адрес уникален для всех сетевых интерфейсов.", + "ORG_ZSTACK_COMPUTE_HOST_10083": "Недопустимый bonding UUID для виртуального сетевого интерфейса %s", + "ORG_ZSTACK_COMPUTE_HOST_10089": "Указан недопустимый тип сервиса. Пожалуйста, убедитесь, что вы используете допустимый тип сервиса для облачных вычислительных сред.", + "ORG_ZSTACK_COMPUTE_HOST_10088": "Невозможно установить сеть управления на bonding, так как сеть управления использует автоматическое назначение.", + "ORG_ZSTACK_COMPUTE_HOST_10090": "Имитация выключения виртуальной машины[%s] через IPMI не удалась.", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10001": "Не удалось установить соединение с SMTP сервером на хосте: %s и порту: %d. Пожалуйста, проверьте правильность конфигурации smtpServer и smtpPort. [ошибка=%s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10002": "Невозможно установить соединение с SMTP сервером[сервер: %s, порт: %s] в течение 15 секунд", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10003": "Ошибка валидации SMTP сервера: %s", + "ORG_ZSTACK_AI_COLLECTOR_10000": "Контексты развертывания для сбора метаданных MindIE в виртуальной среде не найдены. Пожалуйста, убедитесь, что необходимые облачные ресурсы правильно настроены и доступны.", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10004": "Указанная конечная точка отключена. Пожалуйста, проверьте конфигурацию вашей конечной точки.", + "ORG_ZSTACK_AI_COLLECTOR_10001": "Некоторые контексты развертывания не содержат инвентарь виртуальных машин, что препятствует сбору метаданных MindIE.", + "ORG_ZSTACK_COMPUTE_HOST_10096": "Сброс питания хоста[%s] через IPMI не удался.", + "ORG_ZSTACK_COMPUTE_HOST_10095": "Имитация сброса питания виртуальной машины через IPMI не удалась. [%s]", + "ORG_ZSTACK_COMPUTE_HOST_10098": "Хост[%s] получил неожиданное возвращаемое значение", + "ORG_ZSTACK_COMPUTE_HOST_10097": "Информация IPMI неполна для экземпляра %s. Пожалуйста, проверьте и предоставьте необходимые детали.", + "ORG_ZSTACK_COMPUTE_HOST_10092": "не удалось включить экземпляр через IPMI для хоста[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10091": "не удалось выключить хост[%s] через IPMI.", + "ORG_ZSTACK_COMPUTE_HOST_10094": "перезагрузка хоста[%s:%d] не удалась, так как экземпляр уже выключен", + "ORG_ZSTACK_COMPUTE_HOST_10093": "включение хоста[%s] через IPMI не удалось.", + "ORG_ZSTACK_COMPUTE_HOST_10099": "хост[%s] не может установить соединение с ipmi[%s], причина:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10002": "невозможно проверить MD5 контрольную сумму файлов в директории[%s].\\nstdout:%s\\nstderr:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10003": "невозможно проверить MD5 контрольную сумму файлов в папке[%s] на хосте[ip:%s].\\nstdout:%s\\nstderr:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10000": "Имя пользователя, пароль или номер порта могут быть неверными. Пожалуйста, проверьте и попробуйте снова.", + "ORG_ZSTACK_COMPUTE_HOST_10065": "не удалось обновить сетевую метку хоста [uuid:%s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10000": "Проблема может быть вызвана неверным ключом доступа или секретным ключом или отказом в разрешении IAM политики. [ошибка=%s]", + "ORG_ZSTACK_COMPUTE_HOST_10064": "не удалось удалить сетевую метку хоста [uuid:%s]", + "ORG_ZSTACK_COMPUTE_HOST_10067": "неверный формат IP адреса[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10066": "хост(ы) [%s] не подключен, выключение не поддерживается", + "ORG_ZSTACK_COMPUTE_HOST_10069": "неверный набор IP, он должен быть указан с маской подсети в CIDR нотации", + "ORG_ZSTACK_COMPUTE_HOST_10068": "неверный формат маски подсети[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10073": "Невозможно настроить IP адрес на слейв интерфейсах bonding", + "ORG_ZSTACK_COMPUTE_HOST_10070": "Невозможно настроить IP адрес для интерфейса управления сети.%s", + "ORG_ZSTACK_COMPUTE_HOST_10078": "Невозможно настроить IP адрес для bonding интерфейса, связанного с сетью управления", + "ORG_ZSTACK_COMPUTE_HOST_10077": "указан неверный UUID интерфейса", + "ORG_ZSTACK_IMAGE_10019": "Сессия загрузки истекла. Пожалуйста, убедитесь, что ваша сессия загрузки активна и попробуйте снова.", + "ORG_ZSTACK_IMAGE_10016": "Не удалось из-за перезагрузки управляющего узла.", + "ORG_ZSTACK_IMAGE_10015": "путь к образу не входит в одобренный список: %s", + "ORG_ZSTACK_IMAGE_10014": "Все экземпляры на этом сервере не могут получить доступ к образам", + "ORG_ZSTACK_IMAGE_10013": "путь к образу [%s] включен в черный список %s", + "ORG_ZSTACK_IMAGE_10012": "Должен быть указан абсолютный путь для исходного файла. Пожалуйста, предоставьте полный путь к файлу.", + "ORG_ZSTACK_IMAGE_10011": "Предоставленный URL должен начинаться с 'file:///', 'http://', 'https://', 'ftp://', 'sftp://' или '/'.", + "ORG_ZSTACK_IMAGE_10010": "нет доступного хранилища резервных копий, указанного в uuids%s для добавления этого образа; они не в статусе %s или не в состоянии %s, или UUID является неверным UUID хранилища резервных копий", + "ORG_ZSTACK_IMAGE_10009": "неподдерживаемый формат образа[%s]", + "ORG_ZSTACK_IMAGE_10008": "неизвестный формат[%s]", + "ORG_ZSTACK_IMAGE_10007": "ISO нельзя использовать как образ системного диска.", + "ORG_ZSTACK_IMAGE_10006": "снимок тома[uuid:%s] не включен, он %s", + "ORG_ZSTACK_IMAGE_10005": "снимок тома[uuid:%s] не готов, он в состоянии %s", + "ORG_ZSTACK_IMAGE_10004": "том[uuid:%s] не включен, он в настоящее время %s", + "ORG_ZSTACK_IMAGE_10003": "том[uuid:%s] не готов, он %s", + "ORG_ZSTACK_IMAGE_10002": "Архитектура AArch64 не поддерживает устаревшие функции. Пожалуйста, убедитесь, что ваша конфигурация совместима с архитектурой AArch64.", + "ORG_ZSTACK_ALIYUN_ACCOUNT_10000": "невозможно установить соединение с [%s] в течение %d миллисекунд, что указывает на недоступность сервиса Alibaba Cloud OpenAPI.", + "ORG_ZSTACK_IMAGE_10039": "Не найдено подключенное хранилище резервных копий для образа[uuid:%s, name:%s]", + "ORG_ZSTACK_IMAGE_10038": "Образ с UUID [uuid:%s] и именем [name:%s] не хранится ни на одном хранилище резервных копий.", + "ORG_ZSTACK_IMAGE_10037": "не удалось создать шаблон тома из тома[uuid:%s] на всех хранилищах резервных копий%s. Подробности в одном из сообщений об ошибках", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10041": "ожидается логическое значение или другое Condition, текущие Conditions включают: %s, но получено %s", + "ORG_ZSTACK_IMAGE_10036": "не удалось выделить все хранилища резервных копий[uuid:%s], список ошибок: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10040": "EC2 экземпляр равен null! Пожалуйста, убедитесь, что идентификатор экземпляра правильный и не null.", + "ORG_ZSTACK_IMAGE_10035": "Не удалось найти подходящее решение для хранилища резервных копий. Пожалуйста, убедитесь, что конфигурация облачного хранилища правильна и доступна.", + "ORG_ZSTACK_IMAGE_10034": "не удалось создать образ из корневого тома[uuid:%s] на всех хранилищах резервных копий; пожалуйста, проверьте причину одной из ошибок", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10002": "недостаточно ресурсов для загрузки образа[uuid:%s] во время миграции хранилища тома[uuid:%s], требуемая емкость: %s, текущая доступная физическая емкость: %s", + "ORG_ZSTACK_IMAGE_10032": "невозможно выделить хранилище резервных копий, указанное UUIDs%s, список ошибок: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10003": "Недостаточно емкости для миграции хранилища тома [UUID: %s]; требуемая емкость: %d, текущая доступная физическая емкость: %d", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10004": "данные на исходном PS[uuid:%s] были отброшены, и откат не поддерживается", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10005": "Миграция тома без снимка на общем блочном хранилище не поддерживается и не может быть отменена.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10000": "Найден ID корзины (%s) в основном хранилище [%s] для пути установки миграции [%s]. Пожалуйста, сначала очистите его с помощью 'APICleanUpTrashOnPrimaryStorageMsg', если вы настаиваете на миграции тома [%s].", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10001": "невозможно найти образ с UUID:%s ни в одном подключенном хранилище резервных копий, присоединенном к зоне с UUID:%s. Пожалуйста, проверьте следующее:", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10039": "1. Убедитесь, что хранилище резервных копий присоединено к зоне с UUID:%s.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10032": "2. Проверьте, что хранилище резервных копий находится в подключенном состоянии; при необходимости попробуйте переподключить его.", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10036": "только методы могут быть определены внутри Function, но найдено %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10035": "Fn::FindInMap не может найти ресурсы [%s] в карте Resources!", + "ORG_ZSTACK_CORE_ERRORCODE_10007": "Ссылка [%s] не найдена!", + "ORG_ZSTACK_CORE_ERRORCODE_10005": "неподдерживаемые функции [%s] не поддерживаются в шаблоне ресурсов ZStack!", + "ORG_ZSTACK_IMAGE_10026": "Для фильтрации облачных ресурсов необходимо указать входные аргументы 'regex' или 'category'.", + "ORG_ZSTACK_CORE_ERRORCODE_10006": "код разработки должен быть числовым значением!", + "ORG_ZSTACK_IMAGE_10025": "исходный образ [%s] не существует", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10051": "%s невозможно преобразовать в CloudString", + "ORG_ZSTACK_CORE_ERRORCODE_10003": "%s не является допустимым или пустым каталогом", + "ORG_ZSTACK_CORE_ERRORCODE_10004": "ошибка чтения при обработке файлов шаблонов [%s] не удалось, по причине: %s", + "ORG_ZSTACK_IMAGE_10023": "экземпляр vm[uuid:%s] не имеет корневого тома", + "ORG_ZSTACK_IMAGE_10022": "экземпляр vm [uuid:%s] не имеет подключенного тома", + "ORG_ZSTACK_IMAGE_10021": "резервное хранилище[uuid:%s] не находится в подключенном состоянии, текущий статус: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10042": "ожидается булево значение 'true' или 'false' для объекта, но получено %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10046": "Fn::GetAtt не может найти указанные ресурсы [%s] в списке ресурсов!", + "ORG_ZSTACK_SSO_SAML2_SERVICE_10000": "iam2 содержит пользователя с таким же именем[%s], ожидаемый тип[%s], но найден тип[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10119": "Хост [%s] не имеет настроенного IPMI-устройства или IPMI-устройство не имеет адреса. После настройки IPMI-адреса, пожалуйста, переподключите хост для обновления информации IPMI.", + "ORG_ZSTACK_ZQL_AST_VISITORS_PLUGIN_10000": "Поле для суммирования должно быть указано.", + "ORG_ZSTACK_SSO_SAML2_SERVICE_10001": "дубликат SAML-входа[%s] для типа[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10120": "не удалось выполнить миграцию vm[uuid:%s] на хосте[uuid:%s, name:%s, ip:%s], будет предпринята попытка корректного завершения работы.", + "ORG_ZSTACK_CORE_ERRORCODE_10001": "Оба параметра: исходный файл и JSON-содержимое, не могут быть пустыми одновременно. Пожалуйста, убедитесь, что указан либо допустимый исходный файл, либо JSON-содержимое.", + "ORG_ZSTACK_CORE_ERRORCODE_10002": "Не удалось сканировать каталог ресурсов: %s", + "ORG_ZSTACK_CORE_ERRORCODE_10000": "Файл или входное содержимое для конфигурации облачных вычислительных ресурсов не предоставлены", + "ORG_ZSTACK_COMPUTE_HOST_10124": "Попытка подключения хоста не удалась, запрос ping истек. Пожалуйста, проверьте сетевое подключение и убедитесь, что хост работает.", + "ORG_ZSTACK_COMPUTE_HOST_10104": "Обнаружен хост с IP-адресом управления [%s] для гипервизора [%s].", + "ORG_ZSTACK_COMPUTE_HOST_10103": "cluster[uuid:%s] имеет неопределенный тип гипервизора", + "ORG_ZSTACK_COMPUTE_HOST_10106": "архитектура cluster[uuid:%s] — %s, что не соответствует архитектуре хоста[name:%s, ip:%s], которая составляет %s", + "ORG_ZSTACK_COMPUTE_HOST_10105": "после подключения хост[name:%s, ip:%s] возвращает нулевую виртуальную архитектуру", + "ORG_ZSTACK_COMPUTE_HOST_10100": "ipmi хоста[%s] недоступен по причине %s", + "ORG_ZSTACK_COMPUTE_HOST_10102": "cluster[uuid:%s] не существует", + "ORG_ZSTACK_SCHEDULER_10008": "указана недопустимая единица времени: %s", + "ORG_ZSTACK_SCHEDULER_10005": "том[%s] не поддерживает политики хранения снимков", + "ORG_ZSTACK_SCHEDULER_10006": "snapshotMaxNumber: формат неверен по причине %s", + "ORG_ZSTACK_COMPUTE_HOST_10108": "системный тип сетевой службы хоста[%s] не может быть завершен", + "ORG_ZSTACK_COMPUTE_HOST_10107": "основное хранилище [uuid:%s] было отключено, и хост больше не имеет подключенного ресурса основного хранилища", + "ORG_ZSTACK_COMPUTE_HOST_10109": "системный тип сетевой службы хоста[%s] не может быть обновлен из-за конфликтующих настроек виртуализации", + "ORG_ZSTACK_SCHEDULER_10002": "Предыдущая задача не была выполнена успешно. Пропускаем эту задачу.", + "ORG_ZSTACK_COMPUTE_HOST_10114": "невозможно обслуживать хост[uuid:%s, status:%s], который не имеет статус Connected", + "ORG_ZSTACK_COMPUTE_HOST_10111": "Экземпляр WebSSH сервера не активен. Пожалуйста, убедитесь, что ваш облачный SSH сервер (%s) запущен и правильно настроен.", + "ORG_ZSTACK_COMPUTE_HOST_10110": "произошла ошибка сетевого сервиса хоста с типом[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10113": "managementIp[%s] не является допустимым IPv4 адресом или именем хоста", + "ORG_ZSTACK_COMPUTE_HOST_10112": "обнаружен хост с управляющим IP[%s]", + "ORG_ZSTACK_SCHEDULER_10018": "Виртуальная машина уже имеет запланированную задачу типа [%s]", + "ORG_ZSTACK_SCHEDULER_10016": "виртуальная машина с корневым томом[%s] недоступна. Пожалуйста, проверьте существование виртуальной машины.", + "ORG_ZSTACK_SCHEDULER_10017": "snapshotGroupMaxNumber: Формат некорректен из-за %s", + "ORG_ZSTACK_SCHEDULER_10014": "Том[%s] недоступен. Пожалуйста, проверьте существование тома и его правильное подключение.", + "ORG_ZSTACK_SCHEDULER_10015": "том[%s] не является корневым томом", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10068": "не найден том в migrateVolumeStructs при миграции между основным хранилищем общих блочных групп!", + "ORG_ZSTACK_SCHEDULER_10013": "поле[%s] не может быть пустым для конфигурации облачного экземпляра", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10067": "пустые структуры миграции томов в migrateVolumesBetweenSharedBlockGroupPrimaryStorageMsg!", + "ORG_ZSTACK_VPCFIREWALL_10027": "набор правил[%s] уже содержит правило с указанным номером %s.", + "ORG_ZSTACK_IPSEC_10006": "Сеть [UUID: %s] не имеет активированной службы IPsec.", + "ORG_ZSTACK_VPCFIREWALL_10028": "невозможно добавить правило брандмауэра[%d]; только TCP или UDP протоколы могут использовать порт", + "ORG_ZSTACK_IPSEC_10007": "удаленный CIDR[%s] пересекается с существующими CIDR", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10000": "новые добавляемые VM NIC и присоединенные VM NIC не находятся на одном виртуальном маршрутизаторе; они находятся на разных виртуальных маршрутизаторах с UUID: %s и %s.", + "ORG_ZSTACK_IPSEC_10008": "удаленный CIDR[%s] и удаленный CIDR[%s] пересекаются", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10001": "новые добавляемые VM NIC[uuids:%s] и пиринговые L3 сети[uuids:%s] VIP балансировщика нагрузки[uuid: %s] не находятся на одном виртуальном маршрутизаторе, они находятся на разных виртуальных маршрутизаторах с UUID[uuids:%s]", + "ORG_ZSTACK_IPSEC_10009": "CIDR[%s] локального маршрутизатора и CIDR[%s] удаленного маршрутизатора пересекаются", + "ORG_ZSTACK_IPSEC_10002": "Текущий диапазон портов [%s, %s] конфликтует с используемым диапазоном портов [%s, %s] для VIP [uuid: %s] протокол: UDP", + "ORG_ZSTACK_IPSEC_10003": "cidr[%s] присоединенной L3Network [uuid:%s] пересекается с удаленным ipsec cidr[%s] uuid:%s", + "ORG_ZSTACK_VPCFIREWALL_10029": "невозможно добавить правило брандмауэра[%d]; только TCP протокол может использовать TCP флаги", + "ORG_ZSTACK_IPSEC_10005": "Исходный файл для Java кода не найден. Пожалуйста, убедитесь, что необходимые файлы загружены и включены в ваш проект.", + "ORG_ZSTACK_VPCFIREWALL_10020": "невозможно присоедиить набор правил по умолчанию к другой сетевой карте", + "ORG_ZSTACK_IPSEC_10000": "невозможно найти IPsec соединение [UUID:%s], оно могло быть удалено", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10006": "vmnic должен быть указан для предоставления ресурсов балансировщика нагрузки.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10073": "Виртуальная машина [UUID: %s] не имеет настроенного дополнительного сокета QMP. Это может быть связано с запуском виртуальной машины без включенной глобальной конфигурации [vm.additionalQmp]. Пожалуйста, включите эту конфигурацию и перезапустите виртуальную машину в ZStack.", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10007": "не удается найти виртуальный маршрутизатор для балансировщика нагрузки [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10072": "основное хранилище [UUID: %s] подключено к SCSI LUN [WWID: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10071": "не удается найти подходящий тип гипервизора для основного хранилища [uuid:%s] для обработки формата образа или формата тома [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10004": "обновить сертификат балансировщика нагрузки по причине:%s", + "ORG_ZSTACK_VPCFIREWALL_10021": "ruleSet[%s] уже содержит l3[%s]", + "ORG_ZSTACK_SCHEDULER_10009": "запуск задания[uuid: %s] не удался, так как произошла ошибка в процессе подготовки экземпляра виртуальной машины", + "ORG_ZSTACK_ZWATCH_MYSQL_10001": "не найден экземпляр базы данных MySQL[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10005": "обновить прослушиватель балансировщика нагрузки по причине:%s", + "ORG_ZSTACK_VPCFIREWALL_10022": "уже существует правило с номером[%s]", + "ORG_ZSTACK_SCHEDULER_10029": "Невозможно добавить задание[uuid:%s] к устаревшему триггеру[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10077": "общий том[uuid: %s] на основном хранилище общей блочной группы не может быть изменен", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10076": "не удается найти том[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10075": "общий блок[UUID:%s, diskUUID:%s, description:%s] уже существует в общей блочной группе[UUID:%s] в новой общей блочной группе", + "ORG_ZSTACK_SCHEDULER_10028": "Невозможно добавить задание с UUID [%s] к тому же триггеру с UUID [%s] дважды", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10074": "необходимо указать хотя бы один диск при добавлении общей блочной группы для основного хранилища", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10079": "не удается найти подготовку тома[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10078": "общий том[UUID: %s] на основном хранилище общей блочной группы подключен к незавершенным экземплярам ВМ[UUIDs: %s]", + "ORG_ZSTACK_SCHEDULER_10021": "необходимо указать интервал при использовании простого планировщика для повторных операций более одного раза", + "ORG_ZSTACK_VPCFIREWALL_10016": "Только протоколы TCP или UDP могут использовать порты в облачных вычислительных средах.", + "ORG_ZSTACK_VPCFIREWALL_10017": "Только протокол TCP может использовать флаги TCP.", + "ORG_ZSTACK_IPSEC_10018": "VIP[uuid:%s] уже используется для %s экземпляра(ов)", + "ORG_ZSTACK_VPCFIREWALL_10014": "ruleSet[%s] уже содержит правило с тем же приоритетом %d.", + "ORG_ZSTACK_IPSEC_10019": "адрес пира[%s] не может совпадать с адресом VIP", + "ORG_ZSTACK_VPCFIREWALL_10015": "невозможно обновить правило по умолчанию[%s]", + "ORG_ZSTACK_IPSEC_10013": "Все сети в рамках одного IPsec-соединения должны быть связаны с одним и тем же маршрутизатором Виртуального частного облака (VPC).", + "ORG_ZSTACK_IPSEC_10014": "Нет главного VPC для группы HA %s", + "ORG_ZSTACK_VPCFIREWALL_10018": "Протокол ICMP — единственный протокол, который может использовать типы ICMP. Пожалуйста, убедитесь, что ваш код указывает правильный протокол.", + "ORG_ZSTACK_IPSEC_10015": "Существует VPC[%s] с устаревшим IPsec-плагином; пожалуйста, обновите его для создания IPsec-соединения.", + "ORG_ZSTACK_VPCFIREWALL_10019": "индекс правила [%%s] недействителен", + "ORG_ZSTACK_IPSEC_10016": "Уже существует IPsec-соединение[uuid:%s, name:%s] с тем же виртуальным маршрутизатором и адресом пира.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10080": "использовать хранилище с толстой подготовкой как том кэша; подготовка тома [%s] - %s", + "ORG_ZSTACK_IPSEC_10010": "Все сети в рамках одного IPsec-соединения должны быть одного типа.", + "ORG_ZSTACK_IPSEC_10011": "IPsecConnection может иметь только 1 сеть для %s", + "ORG_ZSTACK_IPSEC_10012": "L3Network [UUID: %s] не присоединен к VPC-роутеру", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10084": "невозможно получить UUID кластера тома %s", + "ORG_ZSTACK_VPCFIREWALL_10010": "уже имеет шаблон правил с именем %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10081": "SCSI LUN с UUID [%s] и WWID [%s] уже присоединен к основному хранилищу с UUID [%s].", + "ORG_ZSTACK_SCHEDULER_10038": "Неверный формат cron-выражения. Пожалуйста, убедитесь, что оно соответствует стандартному синтаксису CRON.", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10086": "невозможно найти подходящий KVM-хост для основного хранилища группы разделяемых блоков[uuid: %s]", + "ORG_ZSTACK_SCHEDULER_10039": "Cron-задача должна следовать формату: \"0 0/3 17-23 * * ?\"", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10085": "sanlock указывает, что хост %s недоступен на %s", + "ORG_ZSTACK_SCHEDULER_10036": "stopTime превысило текущее время в виртуальной среде. Пожалуйста, убедитесь, что stopTime установлено на будущее время.", + "ORG_ZSTACK_SCHEDULER_10037": "cron должен быть настроен при использовании cron-планировщика", + "ORG_ZSTACK_SCHEDULER_10034": "Duration timeout вне допустимого диапазона", + "ORG_ZSTACK_SCHEDULER_10035": "stopTime превышает допустимый диапазон для формата метки времени MySQL", + "ORG_ZSTACK_SCHEDULER_10032": "startTime должен быть указан для корректной работы простого планировщика.", + "ORG_ZSTACK_SCHEDULER_10033": "schedulerInterval должен быть настроен для корректной работы простого планировщика.", + "ORG_ZSTACK_SCHEDULER_10030": "Добавлено [%d] триггеров к задаче[uuid:%s], что превышает максимально допустимое количество триггеров.", + "ORG_ZSTACK_SCHEDULER_10031": "К группе задач [UUID:%s] добавлено [%d] триггеров, и дополнительные триггеры не могут быть добавлены.", + "ORG_ZSTACK_VPCFIREWALL_10005": "роутер [uuid:%s] не имеет главного роутера", + "ORG_ZSTACK_VPCFIREWALL_10006": "VPC Router[uuid:%s] уже имеет настроенный межсетевой экран.", + "ORG_ZSTACK_VPCFIREWALL_10003": "Невозможно удалить набор системных правил по умолчанию", + "ORG_ZSTACK_VPCFIREWALL_10004": "Невозможно удалить системное правило по умолчанию", + "ORG_ZSTACK_VPCFIREWALL_10001": "Только системные наборы правил могут изменять типы действий.", + "ORG_ZSTACK_VPCFIREWALL_10000": "невозможно отсоединить набор правил по умолчанию в виртуальной сети", + "ORG_ZSTACK_SCHEDULER_10045": "группа задач содержит %d задач, осталось %d слотов", + "ORG_ZSTACK_SCHEDULER_10043": "Scheduler Job Factory типа[%s] не найден", + "ORG_ZSTACK_SCHEDULER_10044": "%d задач имеют различные типы экземпляров от группы задач", + "ORG_ZSTACK_SCHEDULER_10041": "startTime должно быть положительным целым числом или 0", + "ORG_ZSTACK_SCHEDULER_10042": "Указанное время запуска для вашего экземпляра вне диапазона. Пожалуйста, убедитесь, что оно находится в допустимых параметрах.", + "ORG_ZSTACK_SCHEDULER_10040": "Конфигурация планировщика cron требует только указания выражения cron-задачи.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10005": "Пожалуйста, интегрируйте zbox в управляющий узел для распределения облачных ресурсов.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10006": "не удалось создать резервную копию базы данных: %s", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10003": "сервис[%s] не активен", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10007": "Существует другая внешняя резервная копия [UUID: %s] в режиме восстановления.", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10002": "сервис[%s] не поддерживает перезагрузку конфигурации", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10008": "Идентификаторы UUID хостов и хранилища резервных копий пусты. Вы должны указать хотя бы один из них.", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10001": "сервис[%s] не обнаружен", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10001": "восстановление некоторых томов[uuids:%s] не удалось. Вы можете повторить попытку, повторно подключив его.", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10000": "сервис[%s] был зарегистрирован и теперь активен в облачной среде.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10002": "невозможно найти файл конфигурации восстановления recover.conf в директории установки zbox backup.", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10004": "Zbox должен быть сначала присоединен к хосту.", + "ORG_ZSTACK_VPCFIREWALL_10069": "невозможно найти шаблон набора IP-адресов VPC firewall с UUID: %s, возможно, он был удален", + "ORG_ZSTACK_VPCFIREWALL_10063": "присоединение набора правил firewall[%s] не удалось из-за ошибки, связанной с конфигурацией виртуальной сети", + "ORG_ZSTACK_VPCFIREWALL_10064": "отсоединение набора правил не удалось, возможно, из-за удаления", + "ORG_ZSTACK_VPCFIREWALL_10061": "удаление правила firewall не удалось на vRouter[%s], из-за %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10010": "Fn::Select индекс вне диапазона, пожалуйста, проверьте вашу конфигурацию JSON!", + "ORG_ZSTACK_VPCFIREWALL_10062": "изменение состояния правила firewall на vRouter[%s] не удалось из-за %s", + "ORG_ZSTACK_VPCFIREWALL_10067": "невозможно найти VPC firewall с UUID: %s связанный с виртуальным маршрутизатором", + "ORG_ZSTACK_VPCFIREWALL_10068": "невозможно найти набор правил VPC firewall с UUID: %s, возможно, он был удален", + "ORG_ZSTACK_VPCFIREWALL_10065": "отсоединение набора правил firewall[%s] не удалось из-за %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10014": "Параметр [%s] не найден!", + "ORG_ZSTACK_VPCFIREWALL_10066": "невозможно найти VPC firewall с UUID: %s, возможно, он был удален", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10013": "Параметр [%s] не имеет указанного значения или значения по умолчанию!", + "ORG_ZSTACK_VPCFIREWALL_10060": "создание набора правил firewall[%s] не удалось из-за %s", + "ORG_ZSTACK_IMAGE_10046": "Образ с UUID [uuid:%s] и именем [name:%s] не был удален из хранилища резервных копий с UUID [uuid:%s].", + "ORG_ZSTACK_IMAGE_10045": "Образ с UUID [uuid:%s] и именем [name:%s] недоступен в хранилище резервных копий с UUID [uuid:%s].", + "ORG_ZSTACK_IMAGE_10044": "Образ с UUID [uuid:%s] и именем [name:%s] не был удален ни из одного хранилища резервных копий.", + "ORG_ZSTACK_IMAGE_10043": "Образ с UUID [uuid:%s] и именем [name:%s] имеет статус [status:%s] в хранилище резервных копий с UUID [backup storage uuid:%s], который не является Deleted.", + "ORG_ZSTACK_IMAGE_10040": "отсоединение iso с uuid=%s не удалось, ошибки: %s", + "ORG_ZSTACK_VPCFIREWALL_10058": "Удалить правило брандмауэра на vRouter[%s] из-за %s", + "ORG_ZSTACK_VPCFIREWALL_10052": "набор правил по умолчанию %s может быть привязан только к одному интерфейсу forward, но найдено несколько связанных интерфейсов: %s", + "ORG_ZSTACK_VPCFIREWALL_10050": "брандмауэр %s связанный VPC не находится в рабочем состоянии", + "ORG_ZSTACK_VPCFIREWALL_10051": "невозможно удалить набор правил [%s], так как он все еще привязан к сетевой карте", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10020": "невозможно найти условие [%s] в списке 'Conditions'", + "ORG_ZSTACK_VPCFIREWALL_10056": "Не удается найти MAC-адрес, связанный с l3[%] на vRouter[%s]", + "ORG_ZSTACK_VPCFIREWALL_10057": "создание правила брандмауэра[%s] не удалось из-за %s", + "ORG_ZSTACK_VPCFIREWALL_10054": "синхронизация конфигурации брандмауэра не удалась из-за %s", + "ORG_ZSTACK_VPCFIREWALL_10055": "не удалось обновить действие набора правил брандмауэра из-за %s", + "ORG_ZSTACK_VPCFIREWALL_10049": "изменений в наборе правил %s не обнаружено", + "ORG_ZSTACK_VPCFIREWALL_10047": "отсоединение набора правил брандмауэра от сети[%s] не удалось, потому что %s", + "ORG_ZSTACK_VPCFIREWALL_10048": "найдены повторяющиеся номера правил %s на брандмауэре %s, l3 %s, forward %s", + "ORG_ZSTACK_SSO_CAS_SERVICE_10002": "iam2 содержит пользователя с таким же именем[%s]", + "ORG_ZSTACK_SSO_CAS_SERVICE_10003": "повторная попытка входа для типа пользователя[%s]", + "ORG_ZSTACK_SSO_CAS_SERVICE_10004": "Не удается найти CasLogin для типа(%s)", + "ORG_ZSTACK_VPCFIREWALL_10041": "невозможно добавить правило брандмауэра, так как длина описания %s недействительна для номера правила %d", + "ORG_ZSTACK_VPCFIREWALL_10040": "невозможно добавить правило брандмауэра, так как для номера правила:%d нет состояния", + "ORG_ZSTACK_VPCFIREWALL_10045": "Правила брандмауэра в файле конфигурации содержат синтаксические ошибки: %s", + "ORG_ZSTACK_VPCFIREWALL_10046": "привязка набора правил брандмауэра[%s] к сети уровня 3[%s] не удалась из-за %s", + "ORG_ZSTACK_VPCFIREWALL_10044": "Ошибка формата файла конфигурации для экземпляра виртуальной машины. Проверьте файл и убедитесь, что он соответствует требуемой схеме.", + "ORG_ZSTACK_VPCFIREWALL_10038": "невозможно добавить правило брандмауэра, так как длина исходного IP: %s недействительна для номера правила: %d", + "ORG_ZSTACK_VPCFIREWALL_10039": "невозможно добавить правило брандмауэра, так как длина IP-адреса назначения: %s недействительна для номера правила: %d", + "ORG_ZSTACK_VPCFIREWALL_10036": "невозможно добавить правило брандмауэра, так как номер правила %d недействителен", + "ORG_ZSTACK_VPCFIREWALL_10037": "невозможно добавить правило брандмауэра, так как для правила с номером:%d не определено действие", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10002": "команда инициализации vyos не удалась из-за:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10001": "не удалось установить SSH-соединение с виртуальным маршрутизатором[%s] после настройки параметров SSH", + "ORG_ZSTACK_VPCFIREWALL_10030": "невозможно добавить правило брандмауэра[%d], так как только протокол ICMP поддерживает определенные типы", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10003": "не удалось изменить действие по умолчанию брандмауэра для сетевого интерфейса [ip:%s, mac:%s] на виртуальном маршрутизаторе [uuid:%s], потому что %s", + "ORG_ZSTACK_VPCFIREWALL_10031": "невозможно добавить правило брандмауэра[%d], так как только протоколы TCP или UDP поддерживают правила на основе портов", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10006": "не удалось запустить DHCP-сервер на виртуальной машине маршрутизатора[uuid:%s] из-за %s", + "ORG_ZSTACK_ZWATCH_FUNCTION_10014": "отсутствует обязательный аргумент для типа экземпляра в шаблоне cloud formation", + "ORG_ZSTACK_ZWATCH_FUNCTION_10013": "Обнаружены неизвестные аргументы. Убедитесь, что все параметры командной строки действительны, и обратитесь к документации для получения списка допустимых аргументов.", + "ORG_ZSTACK_VPCFIREWALL_10034": "не удалось добавить правило брандмауэра[%d], так как только протокол TCP поддерживает TCP-флаги в этой среде", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10007": "не удалось остановить DHCP-сервер на экземпляре виртуального маршрутизатора [uuid:%s], поскольку %s", + "ORG_ZSTACK_VPCFIREWALL_10035": "не удалось добавить правило брандмауэра[%d] из-за ошибки %s" +} \ No newline at end of file diff --git a/conf/i18n/globalErrorCodeMapping/global-error-th-TH.json b/conf/i18n/globalErrorCodeMapping/global-error-th-TH.json new file mode 100644 index 00000000000..9db32b34264 --- /dev/null +++ b/conf/i18n/globalErrorCodeMapping/global-error-th-TH.json @@ -0,0 +1,4717 @@ +{ + "ORG_ZSTACK_XINFINI_SDK_10001": "จัดรูปแบบการตอบกลับ API ไปยัง class[%s] ล้มเหลว, resultString: %s, exception: %s", + "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10001": "ชนิดศูนย์ข้อมูล [%s] ไม่รองรับที่นี่!", + "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10000": "argument 'endpoint' ต้องถูกตั้งค่าสำหรับชนิดการกำหนดค่า %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10080": "การสร้าง instance Baremetal2 ไม่สามารถกำหนด compute zone ที่เหมาะสมได้ โปรดระบุ zone อย่างชัดเจน", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10084": "ไม่ได้ตั้งค่า chassis UUID หรือ chassis offering UUID เมื่อสร้าง baremetal instance", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10082": "chassis ไม่มีความจุเพียงพอสำหรับ image[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10081": "disk[%s] ที่ต้องการไม่ได้อยู่ใน chassis[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10087": "%s สามารถถูกสร้างหรือลบได้เฉพาะเมื่อ Baremetal2 instance อยู่ในสถานะ Running", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10086": "%s สามารถจัดการได้เฉพาะผ่านการดำเนินการสร้างหรือลบเท่านั้น", + "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10000": "รูปแบบข้อมูลไม่ถูกต้อง ยอมรับเฉพาะรายการตัวเลขคั่นด้วยเครื่องหมายจุลภาคเท่านั้น (เช่น %s)", + "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10001": "host VM มี CPU เพียง %d ตัวที่พร้อมใช้งาน", + "ORG_ZSTACK_ZWATCH_UTILS_10001": "resource[%s] ไม่รองรับ zwatch return with clause", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10002": "ฟีเจอร์ identity authentication ถูกเปิดใช้งานแต่ resource pool ที่เกี่ยวข้องไม่ได้ถูกกำหนดค่า โปรดกำหนดค่า resource pool และลองใหม่", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10003": "ไม่สามารถปล่อย resource pool %s ได้ในขณะที่กำลังใช้งานอยู่", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10000": "ไม่มี virtual machine ที่สามารถเปิดใช้งานได้", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10001": "ชนิด token %s ไม่ถูกต้อง รองรับเฉพาะ tokens ของชนิดที่ใช้ในสภาพแวดล้อม cloud computing เท่านั้น", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10059": "ต้องการ license ว่างสำหรับ authorized nodes", + "ORG_ZSTACK_STORAGE_PRIMARY_10039": "ไม่มี primary storage[uuid:%s] อยู่", + "ORG_ZSTACK_V2V_10019": "primary storage ที่มี UUID:%s ไม่รองรับสำหรับการย้าย virtual machine v2v", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10007": "ล้มเหลวในการเปลี่ยนสถานะ volume snapshot [uuid:%s, name:%s] เนื่องจาก status event [%s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10006": "ล้มเหลวในการดึงขนาด volume[uuid:%s, installPath:%s] จาก primary storage[uuid:%s], เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10005": "ล้มเหลวในการดึงขนาด volume[uuid:%s, installPath:%s] จาก primary storage[uuid:%s], %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10004": "vm[uuid:%s] ไม่ได้อยู่ในสถานะ Running, Paused, Destroyed หรือ Stopped; สถานะปัจจุบัน[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_10040": "primaryStorage[uuid=%s] ไม่มีอยู่ในสภาพแวดล้อม cloud", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10003": "ไม่พบ volume สำหรับ volume UUID: %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10002": "snapshot หรือ descendant มีการอ้างอิงถึง volume[uuids:%s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10001": "ไม่พบ volume snapshot [uuid:%s, name:%s], อาจถูกลบโดยการดำเนินการก่อนหน้า", + "ORG_ZSTACK_STORAGE_PRIMARY_10047": "cidr[%s] รูปแบบข้อมูลไม่ถูกต้อง", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10050": "ZSha2 บ่งชี้ถึงการมีอยู่ของ management node อื่น แต่ไม่พบ node นี้ในฐานข้อมูล โปรดตรวจสอบการมีอยู่ของ management node", + "ORG_ZSTACK_STORAGE_PRIMARY_10046": "อนุญาตเฉพาะหนึ่ง primary storage CIDR system tag เท่านั้น แต่พบ %d 个", + "ORG_ZSTACK_STORAGE_PRIMARY_10049": "ความขัดแย้งของ clusterUuid, คลัสเตอร์ที่ระบุโดย instance offering คือ %s และคลัสเตอร์ที่ระบุในพารามิเตอร์การสร้างคือ %s", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10052": "ไม่พบ App ID ที่จะยกเลิกการลงทะเบียน! กรุณาตรวจสอบ App ID และลองอีกครั้ง", + "ORG_ZSTACK_STORAGE_PRIMARY_10042": "กรุณาระบุประเภท instance และพื้นที่จัดเก็บที่ต้องการก่อนจัดหาทรัพยากร", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10008": "ไม่สามารถรีเซ็ต volume[uuid:%s] ไปยัง snapshot[uuid:%s], volume ของ vm[uuid:%s] ไม่อยู่ในสถานะ Stopped, สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10044": "ไม่พบ primary storage ที่มีคุณสมบัติเหมาะสม; ข้อผิดพลาดคือ %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10000": "ไม่สามารถอัปเดตสถานะกลุ่ม: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10050": "ความขัดแย้งของ primaryStorageUuid: primary storage ที่ระบุโดย instance offering คือ %s ในขณะที่ primary storage ที่ระบุในพารามิเตอร์การสร้างคือ %s", + "ORG_ZSTACK_V2V_10008": "ไม่อนุญาตให้มี MAC address [%s] ซ้ำกันใน network[%s]", + "ORG_ZSTACK_V2V_10009": "MAC address [%s] ซ้ำกันใน network[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_10052": "ความขัดแย้งของ primaryStorageUuid: primary storage ที่ระบุโดย disk offering คือ %s ในขณะที่ primary storage ที่ระบุในพารามิเตอร์การสร้างคือ %s", + "ORG_ZSTACK_V2V_10006": "compute instance พื้นฐานของ conversion host[uuid:%s] ควรอยู่ในสถานะ Connected", + "ORG_ZSTACK_V2V_10007": "conversion host[uuid:%s] ไม่สามารถสร้างการเชื่อมต่อกับ primary storage[uuid:%s]", + "ORG_ZSTACK_V2V_10004": "VM instance [UUID:%s] ไม่มีอยู่หรือไม่ใช่ VMware VM instance", + "ORG_ZSTACK_V2V_10005": "conversionHostUuid ไม่ควรเป็น null กรุณาตรวจสอบว่าได้ระบุ host UUID ที่ถูกต้อง", + "ORG_ZSTACK_V2V_10002": "path พื้นที่จัดเก็บของ v2v conversion host ต้องเป็น absolute path กรุณาระบุ absolute path ที่ถูกต้อง", + "ORG_ZSTACK_V2V_10003": "v2V URL ไม่ถูกต้อง: %s", + "ORG_ZSTACK_V2V_10000": "สถานะของ host [uuid:%s] ต้องอยู่ในสถานะ Connected ก่อนดำเนินการ deploy ระบบคลาวด์", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10021": "ไม่สามารถสร้าง memory snapshot, สถานะ VM ที่คาดหวังคือ [%s, %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10020": "volume snapshot[uuids:%s] อยู่ในสถานะ disabled และไม่สามารถใช้สำหรับการ revert volume", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10029": "ไม่สามารถยกเลิก job การลบ Volume[uuid:%s] ที่แนบกับ VM ไม่อยู่ในสถานะ %s; การลบ snapshot แบบ offline ไม่รองรับการยกเลิกและไม่สามารถยกเลิกได้", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10028": "ไม่สามารถยกเลิก job การลบ Volume[uuid:%s] เชื่อมโยงกับ virtual machine ที่ไม่มีอยู่; การลบ snapshot แบบ offline ไม่รองรับการยกเลิก", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10027": "ไม่สามารถยกเลิก job การลบ Volume[uuid:%s] ไม่ได้แนบกับ VM ใดๆ และการลบ snapshot แบบ offline ไม่รองรับการยกเลิก", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10026": "ไม่สามารถยกเลิก job การลบ Volume[uuid:%s] ไม่มีอยู่", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10025": "ไม่พบ volume UUID สำหรับ snapshots[uuid: %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10024": "ไม่รองรับการลบ snapshot จาก volume ที่แตกต่างกัน [UUID: %s, %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10023": "volume ต้นทางสำหรับ snapshot [uuid:%s] ถูกลบไปแล้ว; ไม่สามารถ revert volume กลับไปยังสถานะต้นทางได้", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10022": "volume snapshot [uuid:%s] อยู่ในสถานะ %s ปัจจุบันและไม่สามารถใช้สำหรับการ revert volume", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10018": "ไม่พบ snapshot: %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10017": "primary storage[uuid:%s] ไม่รองรับ volume snapshots; ดังนั้นไม่สามารถสร้าง snapshot สำหรับ volume[uuid:%s] ได้", + "ORG_ZSTACK_YUNSHAN_UTIL_10000": "NSP URL เป็น null กรุณากำหนดค่า Cloud Computing Service NSP", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10016": "ไม่สามารถขอพื้นที่จัดเก็บหลัก [uuid:%s] สำหรับความสามารถในการสร้างสแนปช็อตของโวลูม", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10015": "ไม่พบประเภทสำหรับพื้นที่จัดเก็บหลัก [%s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10012": "จำนวนสแนปช็อตสูงสุดที่ไม่รองรับ (%d) สำหรับโวลูม [UUID:%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10027": "การทดสอบการเชื่อมต่อ SanSecClientFactory ล้มเหลว", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10019": "ประเภททรัพยากร %s นี้ไม่รองรับการสืบค้นข้อมูลอ้างอิงสแนปช็อตหน่วยความจำ", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10007": "panguPartitionUuid [%s] ไม่ตรงกับ identityZoneUuid [%s]", + "ORG_ZSTACK_APPLIANCEVM_10006": "appliance vm[uuid:%s] อยู่ในสถานะ %s ที่ไม่สามารถทำการเรียก HTTP ไปยัง %s ได้", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10006": "ต้องระบุ panguPartitionUuid หรือ identityZoneUuid", + "ORG_ZSTACK_AI_10120": "ศูนย์โมเดล [uuid:%s] ไม่พบในสภาพแวดล้อมคลาวด์", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10008": "ไม่สามารถลบ identity zone [%s] ได้ เนื่องจากยังมี instance ของ Aliyun Ebs Primary Storage อยู่ โปรดตรวจสอบให้แน่ใจว่าได้ลบทรัพยากรจัดเก็บที่เกี่ยวข้องทั้งหมดแล้ว", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10061": "ไม่สามารถแก้ไขกฎกลุ่มความปลอดภัยได้เนื่องจากโปรโตคอล [%s] ไม่อนุญาตให้ช่วงพอร์ตปลายทางว่างเปล่า", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10060": "ไม่สามารถแก้ไขกฎกลุ่มความปลอดภัยได้เนื่องจากโปรโตคอลที่ระบุ [%s] ไม่รองรับการตั้งค่าช่วงพอร์ตปลายทาง", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10063": "ไม่สามารถแก้ไขกฎกลุ่มความปลอดภัยได้เนื่องจากกฎที่ซ้ำกัน [%s] มีอยู่ในฐานข้อมูลแล้วพร้อม UUID %s", + "ORG_ZSTACK_APPLIANCEVM_10000": "เกิดข้อผิดพลาดในการตั้งค่าข้อมูล bootstrap ของ appliance เนื่องจาก:%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10062": "ไม่สามารถแก้ไขกฎกลุ่มความปลอดภัยได้เนื่องจากโปรโตคอลที่ระบุ [%s] กำหนดให้ต้องตั้งค่าช่วงพอร์ตปลายทาง", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10033": "ไม่สามารถลบ instance offering [uuid:%s] ได้เนื่องจากมีการใช้งานโดยกลุ่ม NFV instance [%s]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10001": "ALIYUN EBS ไม่รองรับการปรับขนาด VM ที่กำลังทำงานอยู่ในขณะนี้", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10031": "ไม่สามารถจัดหา NFV Instance Group [uuid:%s, name:%s] ได้เมื่อสถานะไม่อยู่ในขั้นตอนการเริ่มต้น", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10000": "ไม่พบเส้นทางอุปกรณ์จากโวลูม: %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10032": "ไม่สามารถจัดหา NfvInstanceGroup[uuid:%s, name:%s] ได้เนื่องจากไม่มี instance สมาชิก โปรดสร้าง NFV instance อย่างน้อยหนึ่งรายการภายในกลุ่มก่อนการจัดหา", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10003": "ISO [%s] ถูกต่อเชื่อมอยู่ โปรดถอดการเชื่อมต่อก่อนการเชื่อมต่อใหม่", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10006": "CPU ไม่ถูกต้อง [CPU_ID], host [HOST_UUID] ไม่มี CPU ที่มี ID ที่ระบุ [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10030": "ไม่สามารถจัดหา NfvInstanceGroup[uuid:%s, name:%s] ได้เนื่องจากไม่มี Virtual IP ที่กำหนดค่า โปรดกำหนดค่า Virtual IP สำหรับกลุ่มก่อนการจัดหา", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10005": "URL ต้องเริ่มต้นด้วย http:// หรือ https:// แต่ได้รับ %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10004": "ต้องกำหนดค่า URL สำหรับ Ocean endpoint สำหรับ Alibaba Cloud EBS Primary Storage", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10019": "ชื่อ[%s] ไม่ถูกต้องสำหรับทรัพยากร ชื่อต้องเป็นไปตามข้อกำหนดต่อไปนี้:", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10013": "- มีความยาวระหว่าง 1 ถึง 128 ตัวอักษร", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10012": "- ประกอบด้วยตัวพิมพ์ใหญ่ ตัวพิมพ์เล็ก ตัวเลข ขีดล่าง (_) และขีดกลาง (-)", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10018": "- เริ่มต้นด้วยตัวอักษร", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10028": "- ไม่เริ่มต้นหรือสิ้นสุดด้วยช่องว่าง", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10017": "ไม่พบ BareMetal2 gateway ใน cluster[uuid:%s]", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10010": "สร้าง CloudFile ใหม่ล้มเหลว[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10029": "ไม่พบ NfvInstanceGroup [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10026": "ไม่สามารถแยก NFV instance[uuid:%s] ออกจาก group[uuid:%s, name:%s] เนื่องจากมันเป็นสมาชิกเพียงหนึ่งเดียว กลุ่มต้องมีสมาชิกอย่างน้อยหนึ่งคน", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10027": "ไม่สามารถแยก NFV instance [uuid:%s] ออกจาก group [uuid:%s, name:%s] เนื่องจากมันเป็นสมาชิกที่กำลังทำงานอยู่เพียงหนึ่งเดียว ต้องมีสมาชิกอย่างน้อยหนึ่งคนที่อยู่ในสถานะ Running", + "ORG_ZSTACK_AI_10129": "ได้รับค่า null ที่ไม่คาดคิดจาก %s ของ token: %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10024": "ไม่พบ NFV instance [uuid:%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10016": "input %s ล้มเหลวในการตรวจสอบลายเซ็นสำหรับการตรวจสอบความถูกต้องของ cloud resource", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10025": "ไม่สามารถยกเลิกการเชื่อมโยง NFV instance [uuid:%s] จาก group [uuid:%s, name:%s] เนื่องจากไม่ได้เชื่อมโยงอยู่ในปัจจุบัน สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10003": "backup storage [UUID: %s] ไม่ได้เชื่อมโยงกับ zone [UUID: %s] ซึ่งเป็น primary storage [UUID: %s] ที่เป็นของ", + "ORG_ZSTACK_AI_10127": "พารามิเตอร์ mode ต้องไม่ว่างเปล่า โปรดระบุค่า mode ที่ถูกต้อง", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10011": "จัดสรร compute node ใน clusters[uuids:%s] ล้มเหลวสำหรับ baremetal instance[uuid:%s]", + "ORG_ZSTACK_AI_10128": "ค่าที่อนุญาตในปัจจุบันคือ ['%s']", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10010": "จัดสรร gateway ใน clusters [uuids:%s] ล้มเหลวสำหรับ baremetal instance [uuid:%s]", + "ORG_ZSTACK_AI_10125": "การจำแนกแบบจำลองไม่ถูกต้อง: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10004": "volume[uuid:%s] ถูกแนบไปกับ VM ที่กำลังทำงานอยู่ ควรหยุด VM ก่อนแนบ volume", + "ORG_ZSTACK_AI_10126": "การกำหนดค่าที่เก็บไว้ไม่ถูกต้องสำหรับ ModelServiceVO[uuid: %s]: %s", + "ORG_ZSTACK_AI_10123": "ไม่พบ model center ด้วย UUID: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10015": "IP ที่จัดสรร %s อยู่นอกช่วง DHCP %s ~ %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10014": "IP ที่จัดสรร %s ถูกครอบครองโดย instance อื่นแล้ว", + "ORG_ZSTACK_AI_10121": "ไม่พบ Model Center instance โปรดสร้าง Model Center instance ก่อน", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10013": "เฉพาะ BareMetal2 clusters [UUID:%s] ตรงตามข้อกำหนดสำหรับ chassis และ gateway แต่ clusters เหล่านี้ไม่มี network ที่จัดสรรแนบมาด้วย", + "ORG_ZSTACK_STORAGE_PRIMARY_10000": "ไม่สามารถแนบ ISO ไปยัง primary storage [uuid:%s] ที่ถูกปิดใช้งาน", + "ORG_ZSTACK_AI_10122": "สร้าง system tag สำหรับ ModelServiceInstanceGroupVO[uuid: %s] ล้มเหลว เนื่องจาก %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10012": "ไม่พบ baremetal2 node ใน cluster[uuid:%s]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10019": "install path ไม่ถูกต้อง: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10010": "เพิ่ม volume ID: %s แต่มี volume ID อื่นอยู่ใน URL อยู่แล้ว: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10012": "hostUuid [%s] มีอยู่ใน URL อยู่แล้ว: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10014": "installation URL ไม่ถูกต้อง: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10015": "ไม่พบ device path บน host: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10008": "ไม่พบ Baremetal2 Compute Cluster", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10002": "สร้าง vHost User Client บน host[uuid:%s] สำหรับ vm[uuid:%s] ล้มเหลว : %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10007": "ข้อมูลไม่เพียงพอที่จะระบุ BareMetal2 cluster ที่จะใช้งาน%s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10006": "ไม่มี backup storage ที่แนบกับ zone [uuid:%s] ที่มี ISO [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10005": "ไม่พบ image ที่มี UUID [%s] ใน backup storage ที่เชื่อมต่อใดๆ โปรดตรวจสอบดังต่อไปนี้:", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10000": "1. ตรวจสอบว่า backup storage แนบกับ zone ที่ virtual machine (VM) ชื่อ [%s] พร้อม UUID [%s] อยู่", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10009": "2. ยืนยันว่า backup storage อยู่ในสถานะเชื่อมต่อ หากไม่ได้ ให้พยายามเชื่อมต่อใหม่", + "ORG_ZSTACK_STORAGE_PRIMARY_10014": "ลบ vHost User Client บน host[uuid:%s] สำหรับ vm[uuid:%s] ล้มเหลว : %s", + "ORG_ZSTACK_AI_10116": "จัดสรร primary storage ใน clusters [uuids:%s] สำหรับ bare metal instance [uuid:%s] ล้มเหลว", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10000": "primary storage ที่มี UUID:%s ไม่สามารถลบได้เนื่องจากยังแนบอยู่กับ cluster ที่มี UUID:%s", + "ORG_ZSTACK_AI_10117": "ไม่สามารถค้นหา service instance group ใดๆ ในสภาพแวดล้อม cloud ได้ โปรดตรวจสอบการตั้งค่าของคุณ", + "ORG_ZSTACK_STORAGE_PRIMARY_10016": "baremetal2 instance[uuid:%s] ไม่มีอยู่หรือไม่ได้เชื่อมต่อ ดังนั้นรหัสผ่านไม่สามารถเปลี่ยนได้", + "ORG_ZSTACK_AI_10114": "ไม่พบ dataset ที่มี UUID [%s]", + "ORG_ZSTACK_AI_10115": "ไม่สามารถแนบ volume[uuid:%s] ที่ primary storage กำลังอยู่ในระหว่างการบำรุงรักษา", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10004": "ไม่พบ model service instance group [UUID: %s]; หยุดการตรวจสอบ aliveness ของ waiting-for-service-start-up", + "ORG_ZSTACK_AI_10112": "ต้องระบุ 'group UUIDs' หรือ 'Sync All'", + "ORG_ZSTACK_AI_10113": "ไม่พบ image ที่มี UUID [%s] ใน backup storage ที่เชื่อมต่อใดๆ ที่เกี่ยวข้องกับ zone UUID [%s] โปรดตรวจสอบดังต่อไปนี้:", + "ORG_ZSTACK_AI_10111": "1. ตรวจสอบว่า backup storage แนบกับ zone ที่ถูกต้องซึ่ง VM ชื่อ [%s] (UUID: %s) อยู่", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10001": "2. ยืนยันว่า backup storage อยู่ในสถานะเชื่อมต่อ หากไม่ได้ ให้พยายามเชื่อมต่อใหม่", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10037": "ประเภท model service ที่ไม่รองรับ: %s ไม่สามารถค้นหา backend ที่เกี่ยวข้องเพื่อจัดการการดำเนินการ restart", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10003": "ไม่พบ model service instance group [UUID: %s] ข้าม waiting-for-service-start-up flow", + "ORG_ZSTACK_STORAGE_PRIMARY_10018": "ไม่พบ model service instance[uuid: %s]", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10032": "ไม่สามารถดึงข้อมูล LLDP interface เนื่องจากไม่ได้กำหนดค่าให้รับข้อมูล", + "ORG_ZSTACK_STORAGE_PRIMARY_10017": "ไม่พบ licensed authorized node ที่มี UUID [%s]", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10033": "ดึง LLDP reference สำหรับ[%s] ล้มเหลว", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10085": "zoneUuids, clusterUuids และ primaryStorageUuids ต้องมีรายการที่ไม่ว่างเปล่าอย่างน้อยหนึ่งรายการ หรือค่าทั้งหมดต้องถูกตั้งเป็น true", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10000": "ไม่ควรมี Unauthorized nodes ก่อนการอัปเกรดเป็นสภาพแวดล้อม licensed server โปรดตรวจสอบว่า nodes ทั้งหมดมี license ที่ถูกต้องก่อนกระบวนการอัปเกรด", + "ORG_ZSTACK_STORAGE_PRIMARY_10019": "outputProtocol[%s] มีอยู่แล้วบน primary storage[%s] ไม่จำเป็นต้องเพิ่มอีก", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10087": "licensed virtual nodes ที่เกี่ยวข้องบางส่วนไม่ได้ถูก terminated%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10011": "security group ที่มี UUID:%s ไม่ได้เชื่อมโยงกับ L3 network UUID:%s การแยกไม่สามารถทำได้", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10086": "ไม่สามารถลบกฎกลุ่มความปลอดภัยจากกลุ่มความปลอดภัยอื่นได้", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10089": "เครือข่าย L3[uuid:%s] ไม่มีประเภทบริการเครือข่าย[%s]ที่เปิดใช้งาน", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10088": "กลุ่มความปลอดภัยที่มี UUID:%s ได้เชื่อมโยงกับเครือข่าย L3 UUID:%s แล้ว จึงไม่สามารถแนบได้อีก", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10010": "ไม่สามารถสร้างอินสแตนซ์ NFV ได้ กลุ่ม[uuid:%s, name:%s]มีสมาชิก %d คนแล้ว จำนวนสูงสุดที่อนุญาตคือ 3", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10026": "relativeTime[%s] ไม่ถูกต้อง ค่าเกินจำนวนสูงสุดที่อนุญาต", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10025": "relativeTime[%s] ไม่ถูกต้อง ต้องระบุในรูปแบบเช่น 10s หรือ 1h", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10008": "ไม่สามารถสร้างอินสแตนซ์ NFV ได้เมื่อกลุ่ม [uuid:%s, name:%s] อยู่ในโหมด Active กรุณาเปลี่ยนเป็นโหมด Maintenance ก่อน", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10009": "ไม่สามารถสร้างอินสแตนซ์ NFV ได้เมื่อกลุ่ม[uuid:%s, name:%s]อยู่ในสถานะ %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10006": "อินสแตนซ์ NFV %s [uuid: %s] ของกลุ่มอินสแตนซ์ NFV %s [uuid: %s] สถานะ HA เปลี่ยนจาก %s เป็น %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10039": "วอลุ่ม vhost ไม่รองรับการแนบกับ bareMetalInstance2", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10038": "NIC ที่มี MAC:%s ไม่สามารถแนบกับเครือข่าย L3 ได้เนื่องจากถูกบอนด์แล้ว", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10004": "โหนดทั้งหมดไม่อยู่ในสถานะที่คาดหวังสำหรับการปรับใช้คลาวด์ กรุณาตรวจสอบสถานะของโหนดทั้งหมดและตรวจสอบให้แน่ใจว่าเป็นไปตามเงื่อนไขที่ต้องการสำหรับการดำเนินงาน", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10002": "สร้าง affinity group สำหรับกลุ่มอินสแตนซ์ NFV [uuid:%s] ล้มเหลว", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10033": "customMAC เป็นสิ่งจำเป็นเมื่อแนบเครือข่าย L3 กับ BareMetal instance", + "ORG_ZSTACK_STORAGE_PRIMARY_10024": "พื้นที่เก็บข้อหลัก[uuid: %s] ที่วอลุ่มตั้งอยู่ไม่ได้เปิดใช้งานหรือเชื่อมต่อ", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10032": "ประเภทเครือข่าย L2 %s ไม่รองรับโดย Baremetal2 instances", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10031": "รองรับเฉพาะเครือข่าย Layer 3 ที่มี IP version %d โดย Baremetal2 instance", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10031": "เฉพาะเซิร์ฟเวอร์ลิขสิทธิ์เท่านั้นที่ได้รับอนุญาตให้ยกเลิกการลงทะเบียนอินสแตนซ์ไคลเอนต์ที่มีลิขสิทธิ์", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10030": "Baremetal2 instance[uuid:%s] ยังไม่ได้รับการจัดสรรโหนดคอมพิวเตอร์ กรุณาเริ่มต้นอินสแตนซ์และลองอีกครั้ง", + "ORG_ZSTACK_STORAGE_PRIMARY_10021": "พื้นที่เก็บข้อหลักและคลัสเตอร์ไม่อยู่ในโซนความพร้อมใช้งานเดียวกัน[uuid:%s] [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10037": "ที่อยู่ MAC %s ถูกใช้งานแล้ว กรุณาลองที่อื่น", + "ORG_ZSTACK_STORAGE_PRIMARY_10020": "พื้นที่เก็บข้อหลัก [uuid:%s] ถูกแนบกับคลัสเตอร์ [uuid:%s] แล้ว", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10036": "baremetal2 instance[uuid:%s] ที่ทำงานบนแชสซี[uuid:%s] ไม่มี NIC ที่ไม่ใช่ provisioning พร้อมที่อยู่ MAC %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10023": "'UUID' และ 'Type' ต้องตั้งค่าพร้อมกันทั้งคู่หรือไม่ตั้งค่าทั้งคู่!", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10035": "ที่อยู่ MAC %s ซ้ำกัน", + "ORG_ZSTACK_STORAGE_PRIMARY_10022": "URL[%s] ถูกใช้งานแล้วและไม่สามารถซ้ำกันในคลัสเตอร์เดียวกัน", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10034": "%s ไม่ใช่ที่อยู่ MAC ที่ถูกต้อง", + "ORG_ZSTACK_AI_10130": "ได้รับค่าที่ไม่คาดคิด: %s จาก %s ค่าที่คาดหวังอยู่ในช่วงที่กำหนดไว้สำหรับเมตริกทรัพยากรคลาวด์", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10026": "ประเภทลิขสิทธิ์ %s ไม่ถูกต้องสำหรับสภาพแวดล้อมการประมวลผลคลาวด์", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10027": "ไม่ควรมีเครื่องเสมือนที่ได้รับอนุญาตเมื่อลงทะเบียนเซิร์ฟเวอร์ลิขสิทธิ์ %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10029": "ไม่สามารถจอง %s ไบต์บนพื้นที่จัดเก็บหลัก[uuid:%s] เนื่องจากพื้นที่ว่างไม่เพียงพอ", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10093": "VM nics ที่มี UUIDs:%s ไม่ได้อยู่บนเครือข่าย L3 ที่เชื่อมโยงกับ security group UUID:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_10028": "หลังจากหักความจุที่จองไว้แล้ว พื้นที่จัดเก็บหลักไม่เพียงพอสำหรับขนาดที่ต้องการ อาจเกิดจากเกณฑ์ขั้นต่ำสำหรับการตั้งค่าความจุทางกายภาพของพื้นที่จัดเก็บหลักต่ำเกินไป", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10096": "ไม่สามารถเพิ่มกฎ security group ได้เนื่องจากมี UUID ซ้ำอยู่ใน remoteSecurityGroupUuids: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10095": "ไม่สามารถเพิ่มกฎ security group ได้เนื่องจากรายการกฎไม่สามารถว่างเปล่าหรือเกินจำนวนสูงสุด %d", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10098": "UUID ของ remote security group ขัดแย้งกับรายการที่มีอยู่ โปรดตรวจสอบและอัปเดตกฎ security group", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10022": "ไม่สามารถถอด NFV instance ออกจากกลุ่ม [uuid:%s, name:%s] ในโหมดการทำงานปกติ โปรดเปลี่ยนเป็นโหมดบำรุงรักษาก่อน", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10097": "ไม่สามารถเพิ่มกฎ security group ได้เนื่องจาก security group [uuid:%s] ไม่มีอยู่", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10023": "ไม่สามารถถอด NFV instance ออกจากกลุ่ม[uuid:%s, name:%s] เมื่อสถานะคือ %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10020": "ไม่สามารถแนบ NFV instance เข้ากับกลุ่ม [uuid:%s, name:%s] ได้ สถานะกลุ่มคือ %s โดยมีสมาชิก %d รายการ การแนบอนุญาตเฉพาะเมื่อ: กลุ่มว่างเปล่าหรืออยู่ในสถานะ Healthy/Degraded พร้อมสมาชิก 1-2 รายการ", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10099": "ไม่สามารถเพิ่มกฎ security group ได้เนื่องจาก priority ต้องมากกว่า %d หรือเท่ากับ %d", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10018": "direction[%s] ไม่ถูกต้อง อนุญาตเฉพาะ directions ที่รองรับเท่านั้น", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10024": "type[%s] ไม่ถูกต้อง อนุญาตเฉพาะ primitive types หรือ reference types ที่ใช้กันทั่วไปเท่านั้น", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10019": "ไม่สามารถแนบ NFV instance เข้ากับกลุ่ม [UUID: %s, Name: %s] เมื่อสถานะคือ %s", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10023": "ค่า right value[%s] ไม่ถูกต้อง ต้องเป็น floating-point number", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10029": "baremetal2 instance[uuid:%s] ไม่ได้หยุดอยู่และไม่สามารถแก้ไขเป็น chassis offering อื่นได้", + "ORG_ZSTACK_STORAGE_PRIMARY_10030": "หลังจากลบพื้นที่จัดเก็บหลัก%s ออกเพื่อหลีกเลี่ยง ไม่มีพื้นที่จัดเก็บหลักที่ใช้งานได้อีกต่อไป โปรดตรวจสอบสถานะและสถานะของพื้นที่จัดเก็บหลักภายใน cluster", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10022": "ค่า right value[%s] ไม่ถูกต้อง ต้องเป็น floating-point number ที่มากกว่าศูนย์และน้อยกว่าหนึ่ง", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10017": "ไม่สามารถแนบ NFV instance [uuid:%s] เข้ากับกลุ่ม [uuid:%s, name:%s] ได้ Instance เป็นส่วนหนึ่งของกลุ่มนี้อยู่แล้วพร้อมสถานะ cluster เป็น %s ไม่อนุญาตให้แนบเมื่อ instance อยู่ในสถานะ Leader, Follower, Leaving หรือ Joining Candidate", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10021": "arguments %s ไม่ถูกต้อง ไม่อนุญาตให้มี arguments ในบริบทนี้", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10018": "ไม่สามารถแนบ NFV instance เข้ากับกลุ่ม [UUID:%s, Name:%s] ได้เมื่ออยู่ในโหมดการทำงานปกติ โปรดเปลี่ยนกลุ่มเป็นโหมดบำรุงรักษาก่อน", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10020": "ค่า right value[%s] ไม่ถูกต้อง ต้องเป็น numeric type ที่ถูกต้อง (int, long, float, double) ในสภาพแวดล้อม cloud computing", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10015": "syncNfvInstGroup อนุญาตเฉพาะในโหมดบำรุงรักษาเท่านั้น โหมดปัจจุบัน: %s โปรดเปลี่ยนเป็นโหมดบำรุงรักษาก่อน", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10013": "ไม่สามารถแก้ไขโหมดการทำงานได้เมื่ออยู่ในสถานะ INITIALIZING โปรดตรวจสอบให้แน่ใจว่ากลุ่มพร้อมก่อนทำการเปลี่ยนแปลง สถานะปัจจุบัน: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10036": "PrimaryStorageTagAllocatorExtensionPoint[%s] ส่งคืนผู้สมัครพื้นที่จัดเก็บหลักที่มีสิทธิ์เป็นศูนย์", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10022": "การดำเนินการปัจจุบันไม่รองรับบน local baremetal instance โปรดตรวจสอบให้แน่ใจว่าดำเนินการในสภาพแวดล้อมที่ virtualized", + "ORG_ZSTACK_STORAGE_PRIMARY_10035": "PrimaryStorageFeatureAllocatorFlow[%s] ส่งคืนผู้สมัครพื้นที่จัดเก็บหลักที่ใช้งานได้เป็นศูนย์", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10021": "bare metal instance ไม่ได้รับอนุญาตให้แก้ไขการตั้งค่าเครือข่าย VM NIC โปรดตรวจสอบให้แน่ใจว่าใช้ instance type ที่เข้ากันได้", + "ORG_ZSTACK_STORAGE_PRIMARY_10038": "%s ไม่ถูกต้อง %s ไม่ใช่ instance UUID ที่ถูกต้อง", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10020": "รองรับเฉพาะ VPC network สำหรับการแนบ EIP ไปยัง BareMetal2 instances เท่านั้น", + "ORG_ZSTACK_STORAGE_PRIMARY_10037": "พื้นที่เก็บข้อมูลหลัก [uuid:%s] ไม่อยู่ในสถานะเชื่อมต่อ สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10026": "อินสแตนซ์ baremetal2[uuid:%s] ทำงานอยู่ แต่เอเจนต์ไม่ได้เชื่อมต่อ", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10025": "อินสแตนซ์ baremetal2[uuid:%s] ไม่ได้ปิดเครื่อง", + "ORG_ZSTACK_STORAGE_PRIMARY_10034": "ไม่พบพื้นที่เก็บข้อมูลหลักที่มีแท็กที่ผู้ใช้กำหนด[%s] แท็กที่ผู้ใช้กำหนดระบุอยู่ใน instance offering หรือ disk offering", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10024": "อินสแตนซ์ baremetal2[uuid:%s] ไม่ได้เชื่อมต่อ", + "ORG_ZSTACK_STORAGE_PRIMARY_10033": "ไม่พบพื้นที่เก็บข้อมูลหลัก[uuid:%s] UUID ระบุอยู่ใน instance offering หรือ disk offering specification", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10023": "การดำเนินการนี้ไม่รองรับบนอินสแตนซ์ BareMetal2 โปรดตรวจสอบความเข้ากันได้กับสภาพแวดล้อมเสมือนจริง", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10051": "baremetal2 chassis ที่มี UUID:%s ไม่มีอยู่", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10050": "ไม่จำเป็นต้องตั้งค่า chassisOfferingUuid เนื่องจากอินสแตนซ์ได้รับการกำหนด chassis offering แล้ว", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10021": "ไม่สามารถตั้งค่ากลุ่มความปลอดภัย VM NIC ได้เนื่องจากกลุ่มความปลอดภัยที่ระบุ[uuid:%s] ไม่ได้เป็นของบัญชีของคุณ[uuid:%s] หรือผู้ดูแลระบบ", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10020": "ไม่สามารถตั้งค่ากลุ่มความปลอดภัย VM NIC ได้เนื่องจากมีกลุ่มความปลอดภัยซ้ำ[uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10023": "ไม่สามารถตั้งค่ากลุ่มความปลอดภัย VM NIC ได้เนื่องจากลำดับความสำคัญไม่ถูกต้อง คาดว่าลำดับความสำคัญจะต่อเนื่องกัน แต่พบ %d และ %d", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10022": "ไม่สามารถตั้งค่ากลุ่มความปลอดภัย VM NIC ได้เนื่องจากลำดับความสำคัญไม่ถูกต้อง ลำดับความสำคัญคาดว่าจะเริ่มที่ 1 แต่พบ[%d]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10025": "ไม่สามารถตั้งค่ากลุ่มความปลอดภัย VM NIC ได้เนื่องจากลำดับความสำคัญของกลุ่มความปลอดภัยผู้ดูแลระบบ[%d] ต้องสูงกว่ากลุ่มของผู้ใช้", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10027": "ไม่สามารถเปลี่ยนสถานะกฎกลุ่มความปลอดภัยได้เนื่องจากไม่พบกลุ่มความปลอดภัย[uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10026": "ไม่สามารถอัปเดตสถานะกฎกลุ่มความปลอดภัยได้เนื่องจากรายการ Rule UUIDs ว่างเปล่า โปรดระบุ Rule UUIDs ที่ถูกต้องเพื่อดำเนินการต่อ", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10029": "ไม่สามารถแก้ไขสถานะกฎกลุ่มความปลอดภัยได้เนื่องจากไม่มีกฎกลุ่มความปลอดภัยที่ต้องการเปลี่ยนสถานะ", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10028": "ไม่สามารถเปลี่ยนสถานะกฎกลุ่มความปลอดภัยได้เนื่องจากไม่พบกฎกลุ่มความปลอดภัย[uuid:%s]", + "ORG_ZSTACK_ZWATCH_10004": "ข้อความบางรายการหมดอายุและไม่ได้รับอนุญาตให้แก้ไขเนื่องจากข้อจำกัดของระบบ ระบบจะทำความสะอาดข้อความที่หมดอายุเหล่านี้โดยอัตโนมัติ โปรดลองดำเนินการอีกครั้งในภายหลัง", + "ORG_ZSTACK_ZWATCH_10003": "ประเภทการดำเนินการไม่ถูกต้อง: %s รองรับเฉพาะการดำเนินการเขียนหรือลบ", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10054": "baremetal2 chassis[uuid:%s] ถูกจัดสรรให้กับทรัพยากรอื่นแล้ว", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10053": "baremetal2 chassis[uuid:%s] ไม่ได้เปิดใช้งาน", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10052": "baremetal2 chassis[uuid:%s] ไม่ได้เชื่อมโยงกับ chassis offering[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10059": "โปรดอย่าตั้งค่า Chassis UUID และ Chassis Offering UUID พร้อมกัน", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10057": "cluster[uuid:%s] ระบุแต่ไม่ใช่ cluster Baremetal2 ที่เปิดใช้งาน ดังนั้นจึงไม่สามารถสร้างอินสแตนซ์ Baremetal2 จากมันได้", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10056": "zone[uuid:%s] ระบุแต่ไม่ได้เปิดใช้งาน ดังนั้นจึงไม่สามารถสร้างอินสแตนซ์ baremetal2 จากมันได้", + "ORG_ZSTACK_AI_SERVICE_10001": "ไม่สามารถค้นหา Application Development Service VO ด้วย model service UUID: %s และ account UUID: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10040": "Third-party Ceph ไม่สามารถผสมกับประเภทพื้นที่เก็บข้อมูลอื่นได้ โปรดตรวจสอบความสอดคล้องในการกำหนดค่าพื้นที่เก็บข้อมูลของคุณ", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10030": "ไม่สามารถแก้ไขนโยบาย VM NIC ได้เนื่องจากนโยบาย ingress และ egress ไม่สามารถเป็น null ทั้งคู่ได้ โปรดตรวจสอบให้แน่ใจว่ามีการกำหนดนโยบายอย่างน้อยหนึ่งรายการ", + "ORG_ZSTACK_ZWATCH_10002": "zwatch return ไม่ถูกต้องพร้อม clause: %s, %s", + "ORG_ZSTACK_ZWATCH_10001": "พารามิเตอร์ที่ไม่รู้จัก[%s] ใน zwatch return with clause กรุณาตรวจสอบว่าเป็นพารามิเตอร์ที่ถูกต้องสำหรับสภาพแวดล้อมการประมวลผลบนคลาวด์ที่ระบุ", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10032": "ไม่สามารถเปลี่ยนนโยบายความปลอดภัย VM NIC ได้เนื่องจากนโยบาย egress ที่ไม่ถูกต้อง[%s]", + "ORG_ZSTACK_AI_SERVICE_10005": "ไม่มีงานที่ต้องการทดสอบ ทำเครื่องหมายว่าล้มเหลว%s", + "ORG_ZSTACK_AI_SERVICE_10004": "ไม่พบ service instance; กรุณาตรวจสอบว่าอินสแตนซ์ถูกสร้างอย่างถูกต้องและเชื่อมโยงกับงานประเมินของคุณ การส่งงานล้มเหลว", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10031": "ไม่สามารถเปลี่ยนนโยบายความปลอดภัย VM NIC ได้เนื่องจากกฎ ingress ที่ไม่ถูกต้อง[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10034": "ไม่สามารถเปลี่ยนนโยบายความปลอดภัย VM NIC ได้เนื่องจาก VM NIC [UUID:%s] ไม่มีนโยบายความปลอดภัยที่เชื่อมโยง", + "ORG_ZSTACK_AI_SERVICE_10003": "ไม่พบ service group ที่มี UUID [%s] สำหรับส่งงานประเมิน รายงานความล้มเหลว", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10033": "ไม่สามารถเปลี่ยนนโยบายความปลอดภัย VM NIC ได้เนื่องจากไม่พบ VM NIC [uuid:%s]", + "ORG_ZSTACK_AI_SERVICE_10002": "Model service instance group [UUID: %s] สำหรับการทดสอบไม่มี URLs ที่พร้อมใช้งาน", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10036": "ไม่สามารถอัปเดตลำดับความสำคัญของกฎ security group ได้เนื่องจาก security group [uuid:%s] ไม่มีอยู่", + "ORG_ZSTACK_AI_SERVICE_10008": "อินสแตนซ์ประมวลผลทั้งหมดเริ่มต้นไม่สำเร็จ%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10035": "ไม่สามารถอัปเดตลำดับความสำคัญของกฎ security group ได้เนื่องจากประเภทที่ไม่ถูกต้อง[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10038": "ไม่สามารถอัปเดตลำดับความสำคัญของกฎ security group ได้เนื่องจากจำนวนกฎใน security group [uuid:%s] ไม่ตรงกับจำนวนที่คาดหวัง", + "ORG_ZSTACK_AI_SERVICE_10006": "เกิดข้อผิดพลาดขณะเริ่มการประเมินบน %s เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10037": "ไม่สามารถอัปเดตลำดับความสำคัญของกฎ security group ได้เนื่องจากรายการกฎว่างเปล่า กรุณาตรวจสอบว่ามีกฎที่กำหนดไว้ก่อนดำเนินการนี้", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10039": "ไม่สามารถอัปเดตลำดับความสำคัญของกฎ security group ได้เนื่องจากลำดับความสำคัญของกฎ[%d] ไม่ถูกต้อง", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10049": "ไม่จำเป็นต้องตั้งค่า chassisOfferingUuid เนื่องจากอินสแตนซ์ได้รับการกำหนด chassis แล้ว", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10004": "ไม่สามารถดึงข้อมูล license สำหรับ primary storage [%s] ได้ เนื่องจากข้อมูลตอบกลับระบุว่าไม่มี license ที่ใช้งานอยู่", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10044": "baremetal2 gateway ที่มี UUID: %s ไม่ได้เป็นส่วนหนึ่งของ cluster ที่มี UUID: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10043": "baremetal2 gateway ที่มี UUID: %s ไม่มีอยู่หรือไม่ได้เปิดใช้งานหรือไม่ได้เชื่อมต่อ", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10042": "cluster[uuid:%s] ไม่ใช่ baremetal2 cluster ที่เปิดใช้งาน ไม่สามารถเริ่มต้นอินสแตนซ์[uuid:%s] ภายในนี้ได้", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10041": "remote provision instance ไม่รองรับการแนบ provision NIC ไปยัง bond %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10047": "baremetal2 chassis offering[uuid:%s] ไม่ได้เปิดใช้งาน", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10046": "baremetal2 chassis offering [UUID:%s] ไม่มีอยู่", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10045": "กรุณาระบุ chassis UUID หรือ chassis offering UUID เพื่อเริ่มต้น Baremetal instance [uuid:%s]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10029": "สร้าง snapshot หมดเวลา ความคืบหน้า %d%", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10028": "EBS PrimaryStorage ไม่รองรับการลดขนาดในขณะนี้", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10073": "image[uuid:%s] มีรูปแบบ: %s รูปแบบที่รองรับสำหรับ BareMetal2 instances เท่านั้นคือ %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10072": "image[uuid:%s] มีประเภทสื่อ: %s; สามารถใช้เฉพาะ root volume template เพื่อสร้าง baremetal instance เท่านั้น", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10041": "ไม่สามารถอัปเดตลำดับความสำคัญของกฎ security group ได้เนื่องจากกฎที่มี UUID:%s ไม่ได้เชื่อมโยงกับ security group ที่มี UUID:%s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10071": "รูปภาพ[uuid:%s] ยังไม่พร้อมใช้งาน ไม่สามารถสร้างอินสแตนซ์ baremetal2 จากรูปภาพนี้ได้", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10040": "ไม่สามารถอัปเดตลำดับความสำคัญของกฎกลุ่มความปลอดภัยได้เนื่องจากลำดับความสำคัญ[%d] ซ้ำกัน", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10070": "รูปภาพ[uuid:%s] ไม่ได้เปิดใช้งาน จึงไม่สามารถสร้างอินสแตนซ์ baremetal2 จากรูปภาพนี้ได้", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10043": "ไม่สามารถอัปเดตลำดับความสำคัญของกฎกลุ่มความปลอดภัยได้เนื่องจากมี UUID ของกฎซ้ำกันอยู่", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10021": "เส้นทางการติดตั้งสแนปชอตไม่ถูกต้อง: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10042": "ไม่สามารถอัปเดตลำดับความสำคัญของกฎกลุ่มความปลอดภัยได้เนื่องจากลำดับความสำคัญที่ระบุ [%d] ไม่มีอยู่ในกลุ่มความปลอดภัย [uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10045": "ไม่สามารถแก้ไขกฎกลุ่มความปลอดภัยได้เนื่องจากกฎที่ระบุเป็นกฎเริ่มต้น สามารถอัปเดตได้เฉพาะคำอธิบายและสถานะเท่านั้น", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10044": "ไม่สามารถแก้ไขกฎกลุ่มความปลอดภัยได้เนื่องจากกฎกลุ่มความปลอดภัยที่มี UUID[%s] ไม่มีอยู่", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10022": "พื้นที่จัดเก็บหลัก Alibaba Cloud EBS[UUID:%s, Name:%s] ไม่พบโฮสต์ที่พร้อมใช้งานภายในคลัสเตอร์ที่แนบมาสำหรับสร้างโวลูม", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10047": "ไม่สามารถแก้ไขกฎกลุ่มความปลอดภัยได้เนื่องจากกลุ่มความปลอดภัย %s เกินขีดจำกัดสูงสุดของกฎ %d ข้อ", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10025": "ไม่พบสแนปชอตจากรูปภาพ: %s อาจเป็นไปได้ว่ารูปภาพถูกลบไปแล้ว", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10046": "ไม่สามารถแก้ไขกฎกลุ่มความปลอดภัยได้เนื่องจากลำดับความสำคัญของกฎ [%s] ไม่สามารถตั้งค่าเป็นลำดับความสำคัญของกฎเริ่มต้น [%d] ได้", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10024": "สภาพแวดล้อมคลาวด์ไม่รองรับ", + "ORG_ZSTACK_COMPUTE_CPUPINNING_10002": "cpuset [%s] ที่ระบุสำหรับการกำหนดค่าอินสแตนซ์ไม่ถูกต้อง โปรดตรวจสอบให้แน่ใจว่า cpuset ถูกต้องและอ้างอิงถึงชุด CPU cores ที่เหมาะสม", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10049": "ไม่สามารถแก้ไขกฎกลุ่มความปลอดภัยได้เนื่องจากสถานะไม่ถูกต้อง[%s]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10027": "ไม่สามารถติดตั้ง tdc บนโฮสต์ต่อไปนี้ได้: [%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10048": "ไม่สามารถแก้ไขกฎกลุ่มความปลอดภัยได้เนื่องจากขีดจำกัดลำดับความสำคัญสูงสุดของกฎ %s คือ [%d]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10026": "ไม่สามารถสร้างการเชื่อมต่อกับคลัสเตอร์ต่อไปนี้ได้: [%s]", + "ORG_ZSTACK_COMPUTE_CPUPINNING_10000": "การอ้างอิง CPU pinning [%s] ไม่ถูกต้อง ตัวอย่างที่ถูกต้อง ได้แก่ [1,3:3-6,^5] หรือ [1-2,4:6]", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10004": "ไม่สามารถสร้าง vhost-user client สำหรับเครื่องเสมือน [uuid:%s] บนโฮสต์ปลายทาง [uuid:%s] ได้", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10077": "สถาปัตยกรรมของคลัสเตอร์ baremetal2[arch:%s] และรูปภาพ[arch:%s] ไม่ตรงกัน", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10076": "ตรวจพบโหมดการบูตที่แตกต่างกันระหว่างอินสแตนซ์และรูปภาพหรือออฟเฟอร์ โปรดตรวจสอบให้แน่ใจว่าตรงกัน", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10075": "รองรับเฉพาะรูปภาพที่มีโหมดการบูต %s เท่านั้นสำหรับการสร้างอินสแตนซ์ Baremetal2", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10074": "รูปภาพ[uuid:%s] ไม่ใช่รูปภาพ BareMetal2 จึงไม่สามารถใช้สร้างอินสแตนซ์ BareMetal2 ได้", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10079": "พื้นที่จัดเก็บหลักสำหรับโวลูมรูทและพื้นที่จัดเก็บหลักสำหรับโวลูมข้อมูลต้องอยู่ในคลัสเตอร์เดียวกัน", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10078": "ข้อเสนอดิสก์ไม่ได้เปิดใช้งานทั้งหมด [UUIDs:%s] จึงไม่สามารถสร้างอินสแตนซ์ BareMetal2 จากข้อเสนอเหล่านี้ได้", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10050": "ไม่สามารถแก้ไขกฎกลุ่มความปลอดภัยได้เนื่องจากการดำเนินการไม่ถูกต้อง[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10062": "ข้อเสนอแชสซี baremetal2[uuid:%s] ไม่ได้เปิดใช้งาน จึงไม่สามารถสร้างอินสแตนซ์ baremetal2 จากข้อเสนอนี้ได้", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10061": "แชสซี baremetal2[uuid:%s] ไม่พร้อมใช้งาน จึงไม่สามารถสร้างอินสแตนซ์ baremetal2 จากแชสซีนี้ได้", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10060": "แชสซี baremetal2 ที่มี UUID:%s ไม่ได้เปิดใช้งาน จึงไม่สามารถสร้างอินสแตนซ์ baremetal2 จากแชสซีนี้ได้", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10051": "ไม่สามารถแก้ไขกฎกลุ่มความปลอดภัยเนื่องจากโปรโตคอลไม่ถูกต้อง[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10054": "ไม่สามารถแก้ไขกฎกลุ่มความปลอดภัยเนื่องจากระบุช่วง IP ต้นทาง [%s]; UUID ของกลุ่มความปลอดภัยระยะไกล [%s] ต้องเว้นว่าง", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10031": "Aliyun EBS PrimaryStorage รองรับเฉพาะประเภท Aliyun EBS BS เท่านั้น ได้รับจริง: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10056": "ไม่สามารถแก้ไขกฎ egress ของกลุ่มความปลอดภัยเนื่องจากไม่สามารถระบุช่วง IP ต้นทางสำหรับประเภท Egress", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10034": "ไม่พบทรัพยากร[uuid: %s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10055": "ไม่สามารถแก้ไขกฎ ingress ของกลุ่มความปลอดภัยเนื่องจากไม่สามารถระบุ dstIpRange สำหรับกฎนี้[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10058": "ไม่สามารถแก้ไขกฎกลุ่มความปลอดภัยเนื่องจากไม่พบกลุ่มความปลอดภัยระยะไกล [uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10057": "ไม่สามารถแก้ไขกฎกลุ่มความปลอดภัยเนื่องจากระบุช่วง IP ปลายทาง [%s]; UUID ของกลุ่มความปลอดภัยระยะไกล [%s] ต้องเว้นว่าง", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10059": "ไม่สามารถแก้ไขกฎกลุ่มความปลอดภัยเนื่องจากกำหนดค่ากลุ่มความปลอดภัยระยะไกล [UUID:%s]; ช่วง IP ต้นทางและช่วง IP ปลายทางต้องว่าง", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10066": "รูปภาพไม่สามารถว่างเปล่าได้จนกว่า chassis จะอยู่ในโหมด direct", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10065": "baremetal2 gateway ที่มี UUID: %s ไม่ได้อยู่ใน cluster เดียวกันกับ chassis ที่มี UUID: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10064": "baremetal2 gateway [UUID: %s] ไม่ได้เชื่อมต่อ; จึงไม่สามารถสร้าง instance baremetal2 จากมันได้", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10063": "baremetal2 gateway ที่มี UUID:%s ไม่ได้เปิดใช้งาน; จึงไม่สามารถสร้าง instance baremetal2 จากมันได้", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10069": "ดิสก์ของ Chassis[%s] ไม่มีความจุเพียงพอสำหรับรูปภาพ[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10068": "รูปภาพ[uuid:%s] ไม่มีอยู่ในคลังรูปภาพ", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10067": "โหมด Direct ไม่รองรับการเลือกรูปภาพ", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREBLOCK_10000": "shareblock ระบุว่า host %s ไม่สามารถเข้าถึงได้บน %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10100": "ไม่สามารถเพิ่มกฎกลุ่มความปลอดภัยเนื่องจากโปรโตคอลไม่ถูกต้อง[%s]; โปรโตคอลที่ถูกต้องคือ %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10102": "ไม่สามารถเพิ่มกฎกลุ่มความปลอดภัยเนื่องจากระบุเวอร์ชัน IP ไม่ถูกต้อง [%d]; เวอร์ชันที่ถูกต้องคือ %d/%d", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10101": "ไม่สามารถเพิ่มกฎกลุ่มความปลอดภัยเนื่องจาก action ไม่ถูกต้อง[%s]; action ที่ถูกต้องรวมถึง %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10104": "ไม่สามารถเพิ่มกฎกลุ่มความปลอดภัยเนื่องจาก CIDR ที่อนุญาต [%s] และช่วง IP ปลายทาง [%s] ขัดแย้งกัน", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10103": "ไม่สามารถเพิ่มกฎกลุ่มความปลอดภัยเนื่องจากช่วง IP ต้นทาง [%s] ไม่ได้รับอนุญาตให้ตั้งค่าสำหรับกฎ egress", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10106": "ไม่สามารถเพิ่มกฎกลุ่มความปลอดภัยเนื่องจากช่วง IP ปลายทาง[%s] ไม่ได้รับอนุญาตให้ตั้งค่าสำหรับกฎ ingress", + "ORG_ZSTACK_COMPUTE_HOST_10041": "ล้มเหลวในการตรวจสอบ VLAN ID [%s] สำหรับ network bonding [%s] บน KVM host [UUID: %s], %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10105": "ไม่สามารถเพิ่มกฎกลุ่มความปลอดภัยเนื่องจากช่วง IP[%s] และ UUID ของกลุ่มความปลอดภัยระยะไกล[%s] ขัดแย้งกัน", + "ORG_ZSTACK_COMPUTE_HOST_10043": "ล้มเหลวในการตรวจสอบ VLAN ID [%s] สำหรับ network interface [%s] บน KVM host [UUID: %s], %s", + "ORG_ZSTACK_VPC_10048": "ที่อยู่ dns [%s] ได้ถูกเพิ่มไปยัง VPC router แล้ว [uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10107": "ไม่สามารถเพิ่มกฎกลุ่มความปลอดภัยเนื่องจาก CIDR ที่อนุญาต [%s] ขัดแย้งกับช่วง IP ต้นทาง [%s]", + "ORG_ZSTACK_VPC_10047": "เครือข่าย L3 ของ VPC ต้องเชื่อมโยงกับ vRouter ของ VPC ก่อนดำเนินการใดๆ ที่เกี่ยวข้องกับ vRouter (เช่น เริ่ม/หยุด VMs, สร้", + "ORG_ZSTACK_ALIYUN_CORE_10022": "snapshot task status is finished %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10109": "ไม่สามารถเพิ่มกฎกลุ่มความปลอดภัยได้เนื่องจากประเภทโปรโตคอล ALL หรือ ICMP ไม่สามารถตั้งค่า dstPortRange[%s]", + "ORG_ZSTACK_ALIYUN_CORE_10023": "การดำเนินการนี้ไม่รองรับสำหรับอินสแตนซ์ HybridClient โปรดใช้ประเภทไคลเอนต์ที่เข้ากันได้", + "ORG_ZSTACK_ALIYUN_CORE_10021": "งานสแนปช็อตไม่สามารถเสร็จสิ้นภายใน %d มิลลิวินาที ความคืบหน้าปัจจุบันคือ %d%, สถานะคือ %s", + "ORG_ZSTACK_ALIYUN_CORE_10026": "จุดสิ้นสุด Ocean API ไม่สามารถเป็นค่าว่างได้ โปรดระบุจุดสิ้นสุดที่ถูกต้อง", + "ORG_ZSTACK_VPC_10042": "ไม่รองรับการเรียกดูสถานะของบริการ %s บนเราเตอร์เสมือน %s", + "ORG_ZSTACK_COMPUTE_HOST_10048": "ไม่สามารถอัปเดต IP การเชื่อมต่อได้ เนื่องจาก %s", + "ORG_ZSTACK_VPC_10041": "ไม่สามารถตั้งค่าสถานะของการกำหนดเส้นทางแบบกระจายไปยังเราเตอร์เสมือน %s", + "ORG_ZSTACK_ALIYUN_CORE_10024": "ต้องกำหนดค่า accessKey และ secretAccessKey", + "ORG_ZSTACK_VPC_10040": "ไม่สามารถเรียกดูการเชื่อมต่อสำหรับการกำหนดเส้นทางแบบกระจายไปยังเราเตอร์เสมือน %s", + "ORG_ZSTACK_COMPUTE_HOST_10044": "ไม่สามารถตั้งค่าประเภทบริการ[%s] สำหรับการเชื่อมต่อเครือข่าย[%s] บนโฮสต์ KVM[UUID: %s], %s", + "ORG_ZSTACK_VPC_10045": "ไม่รองรับการอัปเดตสถานะบริการ %s ไปยังเราเตอร์เสมือน %s", + "ORG_ZSTACK_COMPUTE_HOST_10047": "ไม่สามารถอัปเดต IP ของอินเทอร์เฟซได้ เนื่องจาก %s", + "ORG_ZSTACK_COMPUTE_HOST_10046": "ไม่สามารถตั้งค่าประเภทบริการ[%s] สำหรับอินเทอร์เฟซเครือข่าย[%s] บนโฮสต์ KVM[UUID: %s], %s", + "ORG_ZSTACK_VPC_10043": "ไม่สามารถเรียกดูสถานะของการกำหนดเส้นทางแบบกระจายไปยังเราเตอร์เสมือน %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10111": "ไม่สามารถเพิ่มกฎกลุ่มความปลอดภัยได้เนื่องจากพอร์ตปลายทาง [%d] ต้องมากกว่าหรือเท่ากับพอร์ตเริ่มต้น [%d]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10110": "ประเภทโปรโตคอล ALL หรือ ICMP ไม่รองรับการตั้งค่า startPort หรือ endPort โปรดตรวจสอบว่าโปรโตคอลเหมาะสมกับการกำหนดค่ากฎกลุ่มความปลอดภัยของคุณ", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10113": "ประเภทโปรโตคอล TCP/UDP ต้องระบุช่วงพอร์ตปลายทาง โปรดระบุช่วงพอร์ตที่จำเป็นและลองอีกครั้ง", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10112": "ไม่สามารถเพิ่มกฎกลุ่มความปลอดภัยได้เนื่องจาก dstPortRange[%s] ขัดแย้งกับ startPort[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10115": "ไม่สามารถเพิ่มกฎกลุ่มความปลอดภัยได้เนื่องจากกฎซ้ำ[%s] มีอยู่แล้วในฐานข้อมูลสำหรับกลุ่มความปลอดภัยที่ระบุ", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10114": "ไม่สามารถเพิ่มกฎกลุ่มความปลอดภัยได้เนื่องจากกฎ [%s] และ [%s] ซ้ำกัน", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10117": "ไม่สามารถเพิ่มกฎกลุ่มความปลอดภัยได้เนื่องจากกลุ่มความปลอดภัย %s ถึงขีดจำกัดสูงสุดของกฎ %d ข้อ", + "ORG_ZSTACK_COMPUTE_HOST_10052": "ไม่สามารถเรียกดู VLAN ID สำหรับโฮสต์ [UUID:%s] : %s", + "ORG_ZSTACK_VPC_10039": "ไม่สามารถเพิ่มช่วง IPv6 ไปยังเครือข่าย L3 [uuid:%s] เนื่องจากซ้อนทับกับ CIDR [%s] ของเราเตอร์เสมือน [uuid:%s]", + "ORG_ZSTACK_ALIYUN_IMAGE_10002": "การดำเนินการนี้จำกัดเฉพาะสำหรับรูปภาพที่กำหนดเองเท่านั้น", + "ORG_ZSTACK_CORE_CONFIG_10002": "ไม่สามารถค้นหาการกำหนดค่าทั่วไป[หมวดหมู่: %s, ชื่อ: %s]", + "ORG_ZSTACK_VPC_10038": "ไม่สามารถเพิ่มช่วง IP ไปยังเครือข่าย L3 [UUID:%s] เนื่องจากซ้อนทับกับ CIDR [%s] ของเราเตอร์เสมือน [UUID:%s]", + "ORG_ZSTACK_ALIYUN_IMAGE_10003": "เฉพาะดิสก์หลักเท่านั้นที่สามารถสร้างมิเรอร์ได้", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10119": "ไม่สามารถเพิ่มกฎกลุ่มความปลอดภัยได้เนื่องจากกลุ่มความปลอดภัย %s เกินขีดจำกัดสูงสุดของกฎ %d ข้อ", + "ORG_ZSTACK_NETWORK_PLUGIN_10001": "ปล่อย gratuitous ARP เนื่องจาก:%s", + "ORG_ZSTACK_VPC_10037": "ที่อยู่ dns [%s] ไม่ได้เชื่อมโยงกับเราเตอร์ vpc [uuid:%s]", + "ORG_ZSTACK_VPC_10036": "dns[%s] ไม่ใช่ที่อยู่ IP ที่ถูกต้อง", + "ORG_ZSTACK_CORE_CONFIG_10004": "ไม่อนุญาตให้ข้ามการตรวจสอบสำหรับทรัพยากรคลาวด์", + "ORG_ZSTACK_NETWORK_PLUGIN_10000": "เกิดข้อผิดพลาดในการใช้ gratuitous ARP เพราะ:%s", + "ORG_ZSTACK_ALIYUN_IMAGE_10001": "รูปภาพที่ระบุกำลังถูกนำเข้าสู่ศูนย์ข้อมูลอยู่ในขณะนี้...", + "ORG_ZSTACK_ALIYUN_CORE_10011": "ไม่สามารถใส่ไฟล์ที่มีขนาดศูนย์เป็นรูปภาพ VM ได้!", + "ORG_ZSTACK_ALIYUN_IMAGE_10006": "รองรับเฉพาะบริการสำรองข้อมูลที่เก็บข้อมูลแบบรูปภาพเท่านั้น", + "ORG_ZSTACK_ALIYUN_IMAGE_10007": "ชื่อรูปภาพไม่สามารถเริ่มต้นด้วย http:// หรือ https:// ได้ โปรดใช้ชื่อรูปภาพที่ถูกต้อง", + "ORG_ZSTACK_ALIYUN_IMAGE_10004": "ไม่มี OSS bucket ที่เชื่อมโยงกับศูนย์ข้อมูล: %s", + "ORG_ZSTACK_ALIYUN_IMAGE_10005": "ไม่สามารถลบรูปภาพระบบ ECS จากระยะได้", + "ORG_ZSTACK_VPC_10031": "เครือข่าย L2 [UUID: %s] ของเครือข่าย L3 [UUID: %s] ไม่ได้แนบอยู่กับคลัสเตอร์ [UUID: %s]", + "ORG_ZSTACK_VPC_10030": "ไม่มีช่วง IP ที่แนบกับเครือข่าย L3[uuid:%s]", + "ORG_ZSTACK_ALIYUN_CORE_10016": "โปรดระบุตัวระบุทรัพยากรคลาวด์ที่ถูกต้อง!", + "ORG_ZSTACK_ALIYUN_CORE_10013": "ปฏิเสธการเข้าถึงสำหรับ: %s", + "ORG_ZSTACK_VPC_10035": "เครือข่าย L3 [UUID:%s] ต้องถูกแนบก่อน เนื่องจากมี VIP อยู่", + "ORG_ZSTACK_COMPUTE_HOST_10055": "คลัสเตอร์[uuids:%s, hypervisorType:%s] ไม่มีอยู่!", + "ORG_ZSTACK_VPC_10034": "ที่อยู่ IP แบบคงที่ที่ระบุ [%s] ไม่ตรงกับ IP ของเกตเวย์ [%s] ของเครือข่าย Layer 3 [UUID: %s]", + "ORG_ZSTACK_ALIYUN_CORE_10017": "การดำเนินการโค้ด Java ล้มเหลว รหัสข้อผิดพลาด: %s, ข้อความข้อผิดพลาด: %s", + "ORG_ZSTACK_COMPUTE_HOST_10058": "โฮสต์[uuid:%s] ไม่พบทรัพยากรที่ระบุ", + "ORG_ZSTACK_VPC_10033": "เกตเวย์ของเครือข่าย l3 [uuid:%s] ถูกใช้งานโดยอินสแตนซ์/IP อื่นแล้ว:%s", + "ORG_ZSTACK_ALIYUN_CORE_10018": "อุปกรณ์ไม่พร้อมใช้งานภายใน %d มิลลิวินาที", + "ORG_ZSTACK_VPC_10032": "เครือข่ายสาธารณะ [UUID: %s] VIP [UUID: %s, IP: %s] ไม่สามารถเชื่อมต่อกับเครือข่าย L3 [UUID: %s] เนื่องจากไม่ได้อยู่บน VPC VR [UUID: %s]", + "ORG_ZSTACK_COMPUTE_HOST_10019": "รองรับเฉพาะการสร้างสแนปช็อตแบบสดบน VM เมื่ออยู่ในสถานะ [%s] แต่ VM อยู่ในสถานะ [%s] ตอนนี้", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10120": "ไม่สามารถเพิ่มกฎกลุ่มความปลอดภัยได้เนื่องจากลำดับความสำคัญ[%d] ต้องเป็นลำดับที่ต่อเนื่อง ลำดับความสำคัญสูงสุดที่อนุญาตสำหรับกฎ ingress คือ [%d]", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10000": "ไม่สามารถดึงข้อมูลใบอนุญาตของพื้นที่เก็บข้อมูลหลัก[%s] เนื่องจากไม่มี", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10001": "failed to retrieve license information for primary storage[%s], as no data was returned", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10122": "Failed to apply security group rules to current instance[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10002": "failed to retrieve primary storage [%s] license information because the expiration time is null", + "ORG_ZSTACK_ALIYUN_IMAGE_10008": "no backup storage configured for image UUID: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10121": "could not add security group rule because priority[%d] must be consecutive; the maximum allowed priority for egress rules is [%d].", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10003": "failed to parse the date format[%s] of the primary storage[%s] license information", + "ORG_ZSTACK_ALIYUN_IMAGE_10009": "เกินความจุพื้นที่สำรองข้อมูลสำหรับ imageUuid: %s กรุณาระบุด้วยตนเอง", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10124": "บริการเครือข่าย[type:%s] ไม่ได้เปิดใช้งานบน l3 Network[uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10123": "ไม่สามารถใช้กฎกลุ่มความปลอดภัยกับเครื่องเสมือนบางเครื่องได้", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10125": "ไม่สามารถเปลี่ยนลำดับความสำคัญของ rule[uuid:%s] เนื่องจากไม่พบ", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10128": "บริการเครือข่าย[type:%s] ไม่ได้เปิดใช้งานบน l3 Network[uuid:%s] ที่เชื่อมโยงกับ nic[uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10127": "vm nic ที่มี UUID:%s ได้ถูกแนบไปกับกลุ่มความปลอดภัยที่มี UUID:%s", + "ORG_ZSTACK_ALIYUN_IMAGE_10011": "รูปภาพ [%s] ไม่ได้เปิดใช้งานอยู่ในขณะนี้", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10129": "กลุ่มความปลอดภัยที่มี UUID [%s] ไม่ได้เป็นของบัญชีของคุณที่มี UUID [%s] หรือผู้ดูแลระบบ", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10004": "virtual ID[uuid:%s] ไม่ได้อยู่ในองค์กร[uuid:%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10005": "องค์กร[uuid:%s] มีผู้ดูแลที่กำหนดไว้แล้ว", + "ORG_ZSTACK_ALIYUN_CORE_10001": "เพิ่ม endpoint ไปยัง SDK ล้มเหลว เนื่องจาก: %s", + "ORG_ZSTACK_ALIYUN_CORE_10005": "ต้องกำหนดค่า accessKey และ secretAccessKey!", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10003": "virtual ID[uuid:%s] ไม่มีอยู่", + "ORG_ZSTACK_COMPUTE_HOST_10028": "nic[%s] ถูกลบออกแล้ว", + "ORG_ZSTACK_COMPUTE_HOST_10023": "เกิดข้อผิดพลาดในการดำเนินการ เนื่องจาก %s", + "ORG_ZSTACK_ALIYUN_CORE_10009": "ไม่พบ access key id หรือ secret access key จากข้อความ", + "ORG_ZSTACK_ALIYUN_IMAGE_10010": "platform ที่ถูกต้อง:[%s] สำหรับการนำเข้ารูปภาพ Aliyun ค่าที่ถูกต้องคือ: [%s]", + "ORG_ZSTACK_ALIYUN_CORE_10006": "ต้องระบุ region identifier!", + "ORG_ZSTACK_COMPUTE_HOST_10038": "ลบไฟล์เครื่องเสมือนล้มเหลว: %s", + "ORG_ZSTACK_COMPUTE_HOST_10037": "ตั้งค่าไฟล์กำหนดค่าเครื่องเสมือนล้มเหลว: %s", + "ORG_ZSTACK_COMPUTE_HOST_10039": "ใช้ memory balloon ล้มเหลว: %s", + "ORG_ZSTACK_COMPUTE_HOST_10036": "ตั้งค่า hostname ของ VM ล้มเหลว: %s", + "ORG_ZSTACK_COMPUTE_HOST_10035": "ซิงค์การตั้งค่าพอร์ต VM ล้มเหลว: %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10009": "label ไม่ถูกต้อง ฟิลด์ 'op' เป็นค่าว่างาหรือไม่ใช่ Regex หรือ Equal ที่ถูกต้อง %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10008": "label ไม่ถูกต้อง ฟิลด์ 'key' ไม่สามารถเป็นค่าว่างได้ กรุณาระบุค่า key ที่ถูกต้อง %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10007": "ValueCondition string[%s] ต้องการ 'value' เป็น key", + "ORG_ZSTACK_ZWATCH_DATATYPE_10006": "label string[%s] ไม่มี operation ที่ถูกต้อง", + "ORG_ZSTACK_COMPUTE_VM_10319": "VmInstanceDestroyVmExtensionPoint[%s] ปฏิเสธที่จะยุติการทำงานของ vm[uuid:%s] เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10006": "ประเภทของ volume [%s] ไม่ถูกต้อง", + "ORG_ZSTACK_COMPUTE_VM_10318": "VmInstanceRebootExtensionPoint[%s] ปฏิเสธที่จะรีบูต vm[uuid:%s] เนื่องจาก %s", + "ORG_ZSTACK_COMPUTE_VM_10317": "VmInstanceStartNewCreatedVmExtensionPoint[%s] ปฏิเสธที่จะเปิด VM[uuid:%s] เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10004": "ไม่สามารถดึง snapshot IDs สำหรับ volume %s ใน Ceph PS[uuid:%s]", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10002": "ไม่สามารถตรวจสอบเส้นทางการติดตั้งของ volume %s ใน Ceph pool [uuid:%s]", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10001": "ไม่พบ pool ที่ระบุ[PoolName:%s] จากการตอบกลับของ pool service: %s", + "ORG_ZSTACK_VPC_10006": "ไม่พบ VIP[uuid:%s] ในสภาพแวดล้อมคลาวด์", + "ORG_ZSTACK_VPC_10005": "ไม่สามารถแนบ IPv6 EIP ได้เนื่องจากประเภท image ของ virtual router [UUID:%s] ไม่ใช่ %s", + "ORG_ZSTACK_VPC_10003": "ไม่สามารถสร้างการเชื่อมต่อ SSH ไปยัง VPC router[%s] พอร์ต SSH ดูเหมือนจะปิดอยู่", + "ORG_ZSTACK_VPC_10009": "ไม่พบ VMNic[uuid:%s]", + "ORG_ZSTACK_VPC_10008": "ไม่พบ EIP ที่มี UUID:%s", + "ORG_ZSTACK_COMPUTE_VM_10316": "ไม่สามารถค้นหา host ของ VM ได้ โปรดเปิด virtual machine [%s] ก่อนแล้วจึงพยายาม mount disk", + "ORG_ZSTACK_COMPUTE_HOST_10005": "ไม่สามารถตั้งค่างาน clock synchronization บน host[uuid:%s]", + "ORG_ZSTACK_ZWATCH_DATATYPE_10001": "expression ไม่ถูกต้อง: %s, ไม่พบ function ที่เกี่ยวข้องในบริบทของ cloud computing หรือ virtualization settings", + "ORG_ZSTACK_COMPUTE_HOST_10004": "host[uuid:%s, name:%s] อยู่ในสถานะ[%s], ไม่สามารถดำเนินการที่ต้องการได้", + "ORG_ZSTACK_COMPUTE_VM_10315": "gateway error, คาดหวัง: %s, จริง: %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10000": "function ไม่ถูกต้อง: %s, ประเภท parameter ไม่ถูกต้องสำหรับสภาพแวดล้อม cloud computing", + "ORG_ZSTACK_COMPUTE_VM_10314": "ipv6 prefix length error, คาดหวังค่าระหว่าง %s และ %s, ได้รับ: %s", + "ORG_ZSTACK_COMPUTE_VM_10313": "ต้องกำหนดค่า IPv6 prefix length", + "ORG_ZSTACK_VPC_10002": "gateway ของ L3 network [UUID: %s] ถูกใช้งานแล้วบน VPC VR [UUID: %s]", + "ORG_ZSTACK_COMPUTE_VM_10311": "netmask error, คาดหวัง: %s, จริง: %s", + "ORG_ZSTACK_COMPUTE_HOST_10000": "sync GPU information ล้มเหลว: %s", + "ORG_ZSTACK_VPC_10001": "ไม่มี IP range สำหรับ Layer 3 network[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10310": "ต้องระบุ subnet mask", + "ORG_ZSTACK_VPC_10000": "ไม่สามารถ detach NIC จาก VPC VR[uuid:%s]", + "ORG_ZSTACK_COMPUTE_HOST_10009": "ไม่สามารถ allocate PCI device สำหรับ host[uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10051": "รูปแบบ URI ไม่ถูกต้อง ตัวอย่างที่ถูกต้อง: ceph:/// หรือ volume://", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10050": "Ceph ps[uuid=%s] ไม่พบ Root Pool Name", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10052": "delete volume chain error, ดำเนินการต่อกับการลบ volume", + "ORG_ZSTACK_COMPUTE_VM_10320": "VmInstanceStartExtensionPoint[%s] ปฏิเสธที่จะเปิด virtual machine[uuid:%s] เนื่องจาก %s", + "ORG_ZSTACK_COMPUTE_HOST_10013": "ไม่พบ networkInterface[name:%s] ของ instance[uuid:%s]", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10008": "encryption %s[id:%s] ล้มเหลว: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_SMP_10000": "ที่เก็บข้อหลักแบบ mount point ที่แชร์[uuid:%s, name:%s] ไม่พบโฮสต์ที่พร้อมใช้งานภายในคลัสเตอร์คอมพิวเตอร์ที่แนบมา", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10005": "การดำเนินการที่ไม่รองรับสำหรับ EncryptColumnIntegrityFactory ในสภาพแวดล้อมคลาวด์คอมพิวติ้ง", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10002": "%s[%s] ข้อผิดพลาดการตรวจสอบความถูกต้อง เนื่องจาก: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10000": "%s[%s] ข้อผิดพลาดการเข้ารหัส เนื่องจาก:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10017": "ไม่พบโฮสต์ KVM ที่เชื่อมต่อเพื่อดำเนินการ; ดูเหมือนว่าโฮสต์ทั้งหมดในคลัสเตอร์ที่แนบกับที่เก็บข้อหลักแบบ mount point ที่แชร์[uuid:%s] ถูกตัดการเชื่อมต่อ", + "ORG_ZSTACK_VPC_10027": "ไม่สามารถแนบ L3 network ไปยัง VPC router[UUID:%s] เนื่องจากสถานะของมันไม่ใช่กำลังทำงานหรือหยุด", + "ORG_ZSTACK_VPC_10025": "VPC network [uuid:%s] ถูกแนบไปยัง VPC router [uuid:%s] แล้ว", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10013": "URL มีเส้นทางไดเรกทอรีที่ไม่ถูกต้อง [%s] เส้นทางที่ถูกต้องควรอยู่ภายในระบบไฟล์ของ instance และไม่ควรรวมไดเรกทอรีพิเศษ เช่น /dev, /proc, หรือ /sys โปรดตรวจสอบว่า URL ที่ให้มาถูกต้อง", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10042": "ล้มเหลวในการดู watchers ของ RBD image ของ root volume, %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10041": "ความขัดแย้งของ CEPH pool, CEPH pool ที่ระบุโดย disk offering คือ %s และ CEPH pool ที่ระบุในพารามิเตอร์การสร้างคือ %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10010": "volume[uuid:%s] มีการอ้างอิงไปยัง volume[%s]; ดังนั้น ประเภทของ volume ไม่สามารถเปลี่ยนแปลงได้ก่อนที่จะทำ flattening ให้กับ volume และลูก ๆ ของมัน", + "ORG_ZSTACK_VPC_10029": "ไม่สามารถแนบ L3 network ไปยัง VPC router[UUID:%s] เนื่องจากทั้งสถานะของมันและสถานะของ peer ไม่ใช่กำลังทำงานหรือหยุด", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10044": "ไม่พบ Ceph primary storage pool[poolName=%s]", + "ORG_ZSTACK_VPC_10020": "l3 network [uuid:%s] ไม่สามารถถอดจาก vpc vrouter [uuid:%s] เนื่องจากบริการเครือข่ายที่แนบกับ VIPs [%s] ยังคงถูกใช้งาน", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10043": "rootVolume[%s] ถูกใช้งานอยู่แล้ว (บ่งชี้ว่า Ceph RBD image[%s] มี watchers ที่กำลังทำงาน) เพื่อป้องกันสถานการณ์ split-brain ที่อาจเกิดขึ้น ห้ามเริ่มต้น VM", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10046": "ไม่สามารถจัดสรร storage pool สำหรับ primaryStorage[%s], วัตถุประสงค์: %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10045": "cephPrimaryStorage pool[poolName=%s] �", + "ORG_ZSTACK_VPC_10024": "Only a VPC L3 network can be attached to a VPC vRouter.", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10047": "cannot update status of the Ceph primary storage MON node [UUID:%s], as it has been deleted. This warning can be ignored.", + "ORG_ZSTACK_VPC_10023": "the image of virtual router offering [uuid: %s] is missing", + "ORG_ZSTACK_VPC_10022": "virtual router offering with UUID: %s is not enabled", + "ORG_ZSTACK_VPC_10021": "vPC L3 network [UUID:%s] cannot detach from vPC router [UUID:%s] because VM NICs [%s] are still in use.", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10006": "Unsupported operation in cloud environment. Please ensure you are using supported APIs for cloud computing operations.", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10005": "missing parameter, virtualMachineInstanceUuid: %s is requested", + "ORG_ZSTACK_VPC_10017": "Public network cannot be detached from the original virtual private cloud.", + "ORG_ZSTACK_VPC_10016": "Default route network cannot be detached", + "ORG_ZSTACK_VPC_10015": "The management network cannot be detached. Please ensure that all dependent resources have been transferred or terminated before attempting this operation.", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10003": "cannot find a host with a connected SMP connection to execute commands for smp primary storage [uuid:%s]", + "ORG_ZSTACK_VPC_10014": "the virtual router [uuid:%s] is not in the desired state or status", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10002": "cannot find a connected host to execute command for SMP primary storage[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10001": "พื้นที่เก็บข้อมูลหลัก SMP [uuid:%s] ไม่ได้แนบกับคลัสเตอร์คอมพิวเตอร์ใดๆ และจึงไม่สามารถลบโวลูมรูท [uuid:%s] ของเครื่องเสมือน [uuid:%s] ได้", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10007": "", + "ORG_ZSTACK_VPC_10019": "ไม่พบเครื่องเสมือนที่มี UUID: %s", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10008": "", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10030": "ไม่สามารถถอดเครือขาย L3 จากเราเตอร์ VPC [uuid:%s] ได้เนื่องจากสถานะของ master และ slave ไม่สอดคล้องกัน", + "ORG_ZSTACK_VPC_10018": "", + "ORG_ZSTACK_ALIYUN_CORE_10037": "ไม่พบอุปกรณ์เครื่องเสมือนที่มี uuid: %s", + "ORG_ZSTACK_ALIYUN_CORE_10035": "", + "ORG_ZSTACK_ALIYUN_CORE_10036": "ไม่พบพื้นที่สำรองข้อมูลเพื่อดาวน์โหลดอิมเมจ [%s] ไปยังพื้นที่เก็บข้อมูลหลัก [%s] เนื่องจากไม่มีอิมเมจที่พร้อมและสามารถเข้าถึงได้", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10037": "", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10001": "ไม่สามารถถอดเครือขาย L3 จากเราเตอร์ VPC [uuid:%s] ได้เนื่องจากสถานะไม่ได้กำลังทำงานหรือหยุดอยู่", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10002": "", + "ORG_ZSTACK_VPC_10012": "อิมเมจมีอยู่ในระบบรีโมตอยู่แล้ว กรุณาใช้ sync ก่อนเพื่อให้แน่ใจว่าข้อมูลสอดคล้องกัน", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10039": "", + "ORG_ZSTACK_VPC_10011": "รายการยังคง active อยู่หลังจาก %s มิลลิวินาที", + "ORG_ZSTACK_ALIYUN_CORE_10039": "", + "ORG_ZSTACK_VPC_10010": "ไม่พบอินสแตนซ์ ECS [%s] กรุณาตรวจสอบว่ามีอยู่ใน Aliyun console หรือไม่", + "ORG_ZSTACK_SNMP_AGENT_10006": "", + "ORG_ZSTACK_SNMP_AGENT_10005": "ไม่พบ Ceph MON ที่เชื่อมต่อสำหรับพื้นที่เก็บข้อมูลหลัก [uuid:%s]", + "ORG_ZSTACK_SNMP_AGENT_10004": "", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10009": "พารามิเตอร์หายไป: resourceUuid %s, ต้องการ vmInstanceUuid %s", + "ORG_ZSTACK_STORAGE_ZBS_10003": "", + "ORG_ZSTACK_STORAGE_ZBS_10004": "พารามิเตอร์ที่จำเป็นหายไป: resource UUID กรุณาระบุ resource UUID ที่ถูกต้อง", + "ORG_ZSTACK_STORAGE_ZBS_10002": "", + "ORG_ZSTACK_APPCENTER_10006": "เราเตอร์เสมือน [uuid:%s] ไม่ใช่เราเตอร์ VPC", + "ORG_ZSTACK_APPCENTER_10005": "", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10004": "ความขัดแย้งของ CEPH pool, CEPH pool ที่ระบุโดย instance offering คือ %s และ CEPH pool ที่ระบุในพารามิเตอร์การสร้างคือ %s", + "ORG_ZSTACK_APPCENTER_10004": "", + "ORG_ZSTACK_STORAGE_ZBS_10005": "ไม่สามารถอัปเดตสถานะ network interface [uuid: %s] ได้ เนื่องจาก management network interface ไม่รองรับ", + "ORG_ZSTACK_APPCENTER_10003": "", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10006": "เฉพาะดิสก์ข้อมูลเท่านั้นที่สามารถต่อกับอินสแตนซ์ ECS ได้", + "ORG_ZSTACK_APPCENTER_10002": "filterName ต้องถูกตั้งค่าเป็น appcenter:true หรือ appcenter:false เพื่อการกำหนดค่าที่ถูกต้อง", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10007": "ดิสก์ไม่สามารถต่อกับอินสแตนซ์ ECS ใดๆ ได้ โปรดตรวจสอบว่าอินสแตนซ์ ECS อยู่ในสถานะที่อนุญาตให้ต่อดิสก์", + "ORG_ZSTACK_SNMP_AGENT_10003": "ไม่สามารถเริ่มต้น SNMP agent บนพอร์ต %s เนื่องจาก %s", + "ORG_ZSTACK_APPCENTER_10001": "PublishAppVO[uuid: %s] ไม่มีอยู่", + "ORG_ZSTACK_SNMP_AGENT_10002": "ไม่สามารถเริ่มต้น SNMP agent[%s] โปรดตรวจสอบการกำหนดค่าคลาวด์ของคุณ[%s]", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10001": "ไม่สามารถลบ root volume ของอินสแตนซ์ได้", + "ORG_ZSTACK_SNMP_AGENT_10001": "มี instance ของ SnmpAgentVO มากกว่าหนึ่ง โปรดระบุว่าจะใช้อันใด", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10002": "คุณไม่สามารถตั้งค่าคุณสมบัติ deleteWithInstance ของดิสก์เป็น false ได้ เมื่อประเภทดิสก์เป็น ephemeral", + "ORG_ZSTACK_SNMP_AGENT_10000": "ไม่สามารถสร้าง instance ของ SnmpAgentImpl เนื่องจากไม่มี instance ของ SnmpAgentVO โปรดตรวจสอบว่า SnmpAgentVO ถูกกำหนดค่าและใช้งานอย่างถูกต้อง", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10003": "คุณไม่สามารถตั้งค่าคุณสมบัติ deleteWithInstance ของดิสก์เป็น false ได้ เมื่อประเภทดิสก์เป็น cloud และไม่สามารถย้ายได้", + "ORG_ZSTACK_CORE_WEBHOOK_10000": "URL ไม่ถูกต้อง[%s]", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10010": "ดิสก์และอินสแตนซ์ ECS ต้องอยู่ในโซนความพร้อมใช้งานเดียวกัน", + "ORG_ZSTACK_TEST_AOP_10001": "การทดสอบ unit ต้องล้มเหลวเนื่องจากปัญหาในโครงสร้างพื้นฐานการคำนวณคลาวด์หรือสภาพแวดล้อมการจำลองเสมือน", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10015": "ขนาดดิสก์หรือ snapshot ID ต้องระบุในพารามิเตอร์คำขอเพื่อสร้างดิสก์หรือจัดการขนาด โปรดระบุขนาดดิสก์หรือใช้ snapshot ที่มีอยู่", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10016": "คุณไม่ได้รับอนุญาตให้สร้างดิสก์จาก root volume snapshot โปรดใช้ non-root volume snapshot หรือสำเนาของ root volume สำหรับการดำเนินการนี้", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10017": "ชื่อหรือคำอธิบายของดิสก์ไม่สามารถขึ้นต้นด้วย 'http://' หรือ 'https://' โปรดใช้อักขระที่ถูกต้องสำหรับการตั้งชื่อดิสก์", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10011": "volume [%s] ถูกต่อกับอินสแตนซ์ [%s] อยู่แล้ว", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10012": "เฉพาะดิสก์ข้อมูลเท่านั้นที่สามารถต่อกับอินสแตนซ์ ECS ได้", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10013": "ไม่สามารถต่อดิสก์กับอินสแตนซ์ที่กำลังใช้งานอยู่ โปรดหยุดอินสแตนซ์ก่อนต่อดิสก์ใหม่", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10014": "ดิสก์แบบ non-elastic สามารถถูกทำลายได้เฉพาะกับอินสแตนซ์ที่เกี่ยวข้องเท่านั้น", + "ORG_ZSTACK_STORAGE_ZBS_10021": "ชื่อ logical volume ไม่ถูกต้อง[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10022": "ชื่อ pool ไม่ถูกต้อง[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10020": "ไวยากรณ์ URI ไม่ถูกต้องสำหรับการอ้างอิงทรัพยากรคลาวด์: %s", + "ORG_ZSTACK_STORAGE_ZBS_10025": "ไม่อนุญาตให้เพิ่ม MDS ซ้ำ[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10026": "ไม่พบทรัพยากรทางกายภาพสำหรับ logical pool[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10023": "โปรดตรวจสอบว่ามี compute pool อย่างน้อยหนึ่ง pool ถูกกำหนดค่า", + "ORG_ZSTACK_STORAGE_ZBS_10024": "ตรวจสอบให้แน่ใจว่ามี instance ของ Metadata Service อย่างน้อยหนึ่ง instance ถูกกำหนดค่า", + "ORG_ZSTACK_STORAGE_ZBS_10027": "ไม่พบ MDS[%s] ของ zBS primary storage[node uuid:%s]", + "ORG_ZSTACK_STORAGE_ZBS_10028": "MDS nodes ทั้งหมดของ ZBS primary storage [uuid:%s] ไม่อยู่ในสถานะ Connected", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10001": "ไม่สามารถลบเทมเพลตการกำหนดค่าล่วงหน้าในสภาพแวดล้อมคลาวด์ได้ กรุณาติดต่อฝ่ายสนับสนุนเพื่อขอความช่วยเหลือ", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10002": "", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10000": "ไม่สามารถแก้ไขสถานะของเทมเพลตการกำหนดค่าล่วงหน้าในสภาพแวดล้อมนี้ได้ กรุณาใช้อิมเมจเครื่องเสมือนที่มีอยู่หรือสร้างการกำหนดค่าแบบกำหนดเองแทน", + "ORG_ZSTACK_MTTYDEVICE_10001": "", + "ORG_ZSTACK_MTTYDEVICE_10000": "ไม่สามารถอัปเดตเทมเพลตประเภทอินสแตนซ์ที่กำหนดไว้ล่วงหน้าได้", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10004": "", + "ORG_ZSTACK_MTTYDEVICE_10004": "อุปกรณ์ mdev ที่สร้างจากอุปกรณ์ mtty[uuid:%s] ยังคงถูกแนบอยู่กับ VM", + "ORG_ZSTACK_MTTYDEVICE_10003": "", + "ORG_ZSTACK_HYGON_KVM_10004": "อุปกรณ์ mtty [UUID:%s] ไม่ได้ถูกทำให้เป็นทรัพยากร mdevs", + "ORG_ZSTACK_STORAGE_ZBS_10014": "", + "ORG_ZSTACK_STORAGE_ZBS_10015": "ไม่พบ Preconfiguration Template VO ด้วย UUID: %s อาจถูกลบไปแล้ว", + "ORG_ZSTACK_STORAGE_ZBS_10012": "", + "ORG_ZSTACK_STORAGE_ZBS_10016": "โฮสต์ [UUID:%s] ที่มีอุปกรณ์ MTty [UUID:%s] ไม่ได้เชื่อมต่อ", + "ORG_ZSTACK_ZWATCH_DATATYPE_10010": "", + "ORG_ZSTACK_STORAGE_ZBS_10017": "อุปกรณ์ mtty [UUID:%s] ไม่สามารถทำให้เป็น mdevs ได้", + "ORG_ZSTACK_HYGON_KVM_10003": "", + "ORG_ZSTACK_HYGON_KVM_10002": "ดึงข้อมูลอุปกรณ์ CPU Hygon จากโฮสต์[UUID:%s] ล้มเหลว: %s", + "ORG_ZSTACK_HYGON_KVM_10001": "", + "ORG_ZSTACK_HYGON_KVM_10000": "พื้นที่เก็บข้อมูลหลัก ZBS [uuid:%s] อาจถูกลบหรือยกเลิกการเชื่อมโยงแล้ว", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10021": "", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10023": "ไม่พบโฮสต์ KVM [UUID:%s] ไม่สามารถปรับใช้ไคลเอนต์ได้", + "ORG_ZSTACK_STORAGE_MIGRATION_10000": "", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10024": "ไม่สามารถเชื่อมต่อกับพื้นที่เก็บข้อมูลหลัก ZBS[uuid:%s] ล้มเหลวในการเชื่อมต่อ Metadata Servers ทั้งหมด", + "ORG_ZSTACK_STORAGE_MIGRATION_10001": "", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10025": "ข้อมูล addon เป็น null พื้นที่เก็บข้อมูลหลัก[uuid:%s] ไม่พร้อมใช้งาน ข้ามงาน ping", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10026": "", + "ORG_ZSTACK_STORAGE_MIGRATION_10004": "ป้ายกำกับไม่ถูกต้อง ฟิลด์ 'value' ไม่สามารถเป็น null ได้ กรุณาระบุค่าที่ถูกต้อง%s", + "ORG_ZSTACK_STORAGE_MIGRATION_10005": "", + "ORG_ZSTACK_STORAGE_MIGRATION_10003": "ไม่มี logical volume ที่ว่าง�านพร้อมพื้นที่เพียงพอ[%d] และ URL ที่ร้องขอ: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10008": "", + "ORG_ZSTACK_STORAGE_MIGRATION_10009": "เป้าหมายพื้นที่จัดเก็บหลักไม่รองรับการดำเนินการย้ายสำหรับโฮสต์ปัจจุบัน โปรดตรวจสอบให้แน่ใจว่าพื้นที่จัดเก็บเข้ากันได้กับการดำเนินการย้ายและลองอีกครั้ง", + "ORG_ZSTACK_STORAGE_MIGRATION_10006": "ไม่รองรับสถานะ VM[%s] สำหรับการยกเลิกการย้ายพื้นที่จัดเก็บ", + "ORG_ZSTACK_STORAGE_MIGRATION_10007": "ล้มเหลวในการระบุโฮสต์ที่เป็นไปได้สำหรับการย้าย VM `%s` โปรดตรวจสอบโฮสต์เป้าหมายและการเชื่อมต่อเครือข่าย", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10005": "รูปแบบไม่ถูกต้องสำหรับอุปกรณ์ไดรเวอร์ virtio: %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10004": "ล้มเหลวในการถอด ISO virtio ออกจาก VM[uuid:%s]: ไม่รองรับ", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10003": "ล้มเหลวในการถอดอุปกรณ์ virtio ออกจาก vm[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10002": "ล้มเหลวในการต่อไดรเวอร์ virtio เนื่องจากอ่าน md5 ของไฟล์[%s] ล้มเหลวใน mn[uuid:%s]: %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10001": "ล้มเหลวในการต่อไดรเวอร์ virtio เนื่องจาก MD5 ของไฟล์[%s] ไม่ถูกต้องใน mn[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10000": "ล้มเหลวในการต่อไดรเวอร์ virtio เนื่องจากอ่าน md5 ของไฟล์[%s] ล้มเหลวใน mn[uuid:%s]: ไม่พบไฟล์ดิสก์เสมือนใน classpath", + "ORG_ZSTACK_DIRECTORY_10010": "ประเภทไดเรกทอรีที่ระบุ %s ไม่รองรับ ประเภทที่รองรับได้แก่ %s", + "ORG_ZSTACK_SCHEDULER_VM_10001": "vm[uuid:%s] ถูกยกเลิกแล้ว ไม่อนุญาตให้เปลี่ยนสถานะ", + "ORG_ZSTACK_STORAGE_ZBS_10040": "ล้มเหลวในการดึงข้อมูล MDS[%s] metadata โปรดตรวจสอบการกำหนดค่า ZBS", + "ORG_ZSTACK_STORAGE_ZBS_10032": "เซิร์ฟเวอร์ metadata ทั้งหมดไม่สามารถดำเนิน HTTP request[%s] ได้", + "ORG_ZSTACK_STORAGE_ZBS_10036": "เวอร์ชัน MDS[%s] ของ ZBS primary storage ไม่ตรงกับ management node[%s] โปรดเชื่อมต่อ MDS ใหม่และตรวจสอบการเชื่อมต่อ SSH", + "ORG_ZSTACK_STORAGE_ZBS_10037": "URL ของ MDaaS ไม่สามารถเป็นค่าว่างหรือ null ได้", + "ORG_ZSTACK_STORAGE_ZBS_10034": "ไม่สามารถซิงโครไนซ์ metadata จาก ZBS primary storage MDS[%s] ได้ เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_ZBS_10038": "ไม่สามารถค้นหา logical volumes จาก metadata service instances ทั้งหมดได้ รายละเอียด: %s", + "ORG_ZSTACK_STORAGE_ZBS_10039": "ล้มเหลวในการสร้างการเชื่อมต่อ SSH หรือ zbs-tools ไม่ได้ติดตั้งใน MDS[%s] โปรดตรวจสอบการกำหนดค่า SSH และตรวจสอบให้แน่ใจว่าติดตั้ง dependencies ที่จำเป็นแล้ว", + "ORG_ZSTACK_DIRECTORY_10006": "ตรวจพบการพึ่งพาเชิงวงจรระหว่างไดเรกทอรี %s และไดเรกทอรี %s ซึ่งอาจนำไปสู่ความขัดแย้งในการกำหนดค่าหรือวงวนไม่สิ้นสุดในการจัดเตรียมสภาพแวดล้อมเสมือน", + "ORG_ZSTACK_DIRECTORY_10003": "ชื่อที่คุณระบุประกอบด้วยอักขระที่ไม่รองรับ ในสภาพแวดล้อมคลาวด์คอมพิวติ้ง ชื่อสามารถประกอบด้วยอักษรจีน อักษรอังกฤษ ตัวเลข ช่องว่าง และอักขระพิเศษต่อไปนี้เท่านั้น: ()()[]@._-+ โปรดตรวจสอบให้แน่ใจว่าชื่อของคุณเป็นไปตามแนวทางเหล่านี้", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10000": "ไม่พบ EventFamily[name:%s] ใน event bus", + "ORG_ZSTACK_DIRECTORY_10004": "resources zoneUuid ทั้งหมดต้องตรงกับ directory zoneUuid[%s]", + "ORG_ZSTACK_DIRECTORY_10001": "ประเภท resource %s ไม่รองรับโดย cloud directory ประเภทที่อนุญาตได้แก่ %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10002": "ไม่พบ EventFamily[name:%s, namespace:%s] ใน namespace ที่ระบุหรือ event family repository", + "ORG_ZSTACK_DIRECTORY_10000": "resource %s ถูก bind ไปยัง directory UUID[%s] แล้ว ไม่รองรับหลาย paths", + "ORG_ZSTACK_NAS_10002": "มี NasFileSystemFactory ซ้ำสำหรับ type[%s]", + "ORG_ZSTACK_NAS_10000": "NAS file system [%%s] ยังไม่มีอยู่", + "ORG_ZSTACK_NAS_10001": "ไม่พบ NAS factory สำหรับ type: %s", + "ORG_ZSTACK_DIRECTORY_10009": "ล้มเหลวในการสร้างไดเรกทอรี โปรดตรวจสอบให้แน่ใจว่าระบุ path ถูกต้องและไม่เกินสี่ระดับของ virtual directories", + "ORG_ZSTACK_DIRECTORY_10008": "มีชื่อไดเรกทอรีซ้ำ volume[uuid: %s] ที่มีชื่อ %s มีอยู่แล้ว", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10011": "แท็กคำถาม[%s]ไม่ถูกต้อง ชื่อแท็กที่อนุญาตคือ %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10012": "มี Event Families หลายรายการที่มีชื่อ[%s] คุณต้องระบุ label [%s]", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10006": "VM ที่ data volume [%s] อยู่มี memory snapshot; ดังนั้นจึงไม่สามารถถอดได้", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10005": "ไม่สามารถ attach volume %s ไปยัง virtual machine instance %s ที่มี memory snapshot group", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10004": "VM ที่ data volume [%s] อยู่มี memory snapshot; ไม่อนุญาตให้ลบ", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10003": "volume {volume_id} ไม่มีอยู่", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10001": "network ที่มี L3 network [uuid: %s] ถูกอ้างอิงโดย Volume Snapshot Group [uuid: %s] กรุณาลบ Volume Snapshot Group ก่อนลบ L3 network นี้", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10000": "default L3 network UUID ไม่มีอยู่", + "ORG_ZSTACK_AI_10086": "ModelServiceGroup ยังถูกอ้างอิงโดย %s, ไม่สามารถลบได้", + "ORG_ZSTACK_AI_10087": "taskUuid ต้องไม่ว่างเปล่า กรุณาตรวจสอบว่าตั้งค่าอย่างถูกต้องก่อนส่งงาน", + "ORG_ZSTACK_AI_10084": "System instance[uuid: %s] ไม่สามารถลบได้", + "ORG_ZSTACK_AI_10082": "ลบ model ไม่สำเร็จ, model[uuid: %s] ยังถูกใช้งานโดย %s", + "ORG_ZSTACK_AI_10083": "Model[uuid: %s] ไม่มีอยู่ใน cloud repository", + "ORG_ZSTACK_AI_10080": "Custom URL ต้องการ field ของ model เมื่อ ModelEval service type ถูก deploy %s", + "ORG_ZSTACK_AI_10081": "L3 Network UUID %s ไม่มี DHCP service ที่เปิดใช้งาน; ต้องการ system tag แบบ static IP เพื่อกำหนด static IPs", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10007": "การดำเนินการ snapshot volume บนหลาย hosts พร้อมกันเมื่อรวม storage snapshots ไม่รองรับ", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10008": "ไม่พบพื้นที่จัดเก็บสำหรับ install URL[%s]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10005": "ไม่มี primary storage plugin ที่ลงทะเบียนกับ identity: %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10006": "ไม่รองรับ protocol[%s] บน storage solution ประเภท[%s]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10009": "ไม่พบ block storage volume; ตรวจสอบว่าได้กำหนด access path สำหรับ block storage volume แล้ว", + "ORG_ZSTACK_CONFIGURATION_10009": "ขนาดหน่วยความจำสำรอง[%s bytes] เกินขนาดหน่วยความจำที่มี[%s bytes]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10010": "ไม่ได้ระบุ backup storage type เพื่อรองรับ primary storage[uuid:%s]", + "ORG_ZSTACK_CONFIGURATION_10008": "ขนาดหน่วยความจำ[%s bytes] ไม่เพียงพอสำหรับการ boot ระบบปฏิบัติการยุคใหม่; แนะนำอย่างน้อย 16MB ในสภาพแวดล้อม cloud virtual", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10011": "ไม่สามารถ reinitialize root volume [%s] ได้เนื่องจาก image ที่เกี่ยวข้องถูกลบและไม่พบ cache", + "ORG_ZSTACK_MULTICAST_ROUTER_10005": "multicast router [uuid:%s] ไม่ได้เชื่อมโยงกับ VPC Router", + "ORG_ZSTACK_CONFIGURATION_10007": "vcpu count[%s] น้อยกว่า 1", + "ORG_ZSTACK_MULTICAST_ROUTER_10006": "Rendezvous Point [%s] ไม่ใช่ unicast IP address", + "ORG_ZSTACK_CONFIGURATION_10006": "instance type[%s] ไม่รองรับ", + "ORG_ZSTACK_MULTICAST_ROUTER_10007": "group address [%s] ไม่ใช่ multicast group address", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014": "storage ไม่พร้อมใช้งาน:%s", + "ORG_ZSTACK_MULTICAST_ROUTER_10000": "multicastRouter[uuid:%s] ไม่ได้เชื่อมโยงกับ VPC router", + "ORG_ZSTACK_MULTICAST_ROUTER_10001": "multicast เปิดใช้งานอยู่แล้วบน VPC router UUID[:%s]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012": "ไม่พบ path ของ volume ที่เป็นเจ้าของจาก internal snapshot path[%s] เนื่องจาก regex[%s] ไม่สามารถจับคู่กับ snapshot path ได้", + "ORG_ZSTACK_MULTICAST_ROUTER_10002": "vPC router สำหรับ multicast router [uuid:%s] ถูกลบไปแล้ว", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10013": "ping ไปยัง external primary storage[%s] ล้มเหลว กรุณาตรวจสอบการเชื่อมต่อเครือข่ายหรือสถานะของ storage service.%s", + "ORG_ZSTACK_CONFIGURATION_10001": "มี system tag ที่ผู้ใช้กำหนดเองอยู่แล้วสำหรับ instance offering [UUID: %s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10004": "การตอบสนองของ token เป็นค่าว่าง กรุณาตรวจสอบว่ากระบวนการยืนยันตัวตนของคุณกำหนดค่าอย่างถูกต้องและ token endpoint กำลังส่งคืนการตอบสนองที่ถูกต้อง", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10003": "ไม่พบการใช้งาน OAuth2Login สำหรับ type(%s)", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10005": "%s เป็นค่าว่าง: กรุณาตรวจสอบว่า path ของ source file ถูกระบุอย่างถูกต้อง", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10000": "มี OAuth2 authentication handler ซ้ำสำหรับ type[%s]", + "ORG_ZSTACK_CONFIGURATION_10004": "ไม่ควรมี system tag มากกว่าหนึ่งสำหรับ instance offering", + "ORG_ZSTACK_CONFIGURATION_10003": "มี system tag ที่ผู้ใช้กำหนดเองอยู่แล้วสำหรับ disk offering [UUID: %s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10002": "ไม่พบ OAuth2 Provider สำหรับ type(%s)", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10001": "มี OAuth2 provider ซ้ำ[%s] สำหรับ name[%s]", + "ORG_ZSTACK_AI_10075": "ต้องระบุ dockerImage สำหรับ ContainerModelService", + "ORG_ZSTACK_AI_10076": "ไม่พบ model center ที่มี UUID:%s สำหรับ model service ที่มี UUID:%s", + "ORG_ZSTACK_AI_10071": "vmImageUuid เป็นพารามิเตอร์ที่จำเป็นสำหรับ VirtualMachine model service กรุณาระบุค่า vmImageUuid ที่ถูกต้อง", + "ORG_ZSTACK_AI_10072": "VM image UUID ที่ระบุไม่ถูกต้อง กรุณาตรวจสอบและระบุ UUID ที่ถูกต้อง", + "ORG_ZSTACK_AI_10070": "ModelServiceType[%s] ไม่ควรมี dependent model service group UUIDs", + "ORG_ZSTACK_MULTICAST_ROUTER_10008": "RP address pair [%s: %s] มีอยู่แล้วสำหรับ multicast router [uuid:%s]", + "ORG_ZSTACK_MULTICAST_ROUTER_10009": "rpc address tuple [%s : %s] ไม่มีอยู่สำหรับ multicast router [uuid:%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10015": "อัปโหลด user[%s] ล้มเหลว: User มีอยู่แล้วใน cloud environment", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10017": "get code response มีข้อผิดพลาด: %s", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10016": "อัปโหลด user[%s] ล้มเหลว: %s", + "ORG_ZSTACK_AI_10079": "ModelEval serviceType ต้องการ model service ที่มีอยู่ภายใน modelServiceGroupUuids ที่ระบุหรือ URL ที่ถูกต้องเพื่อใช้งาน", + "ORG_ZSTACK_AI_10077": "ไม่ได้ระบุ L3 network UUID ใน deployment message และ model center [UUID:%s] ไม่มี serviceNetworkUuid หรือ storageNetworkUuid กำหนดค่า", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10012": "iam2 มี user ที่มีชื่อเหมือนกัน[%s]", + "ORG_ZSTACK_AI_10078": "ค่าของ environment variable ไม่ควรเป็นค่าว่างใน cloud environment configuration ของคุณ กรุณาตรวจสอบว่าตัวแปรที่จำเป็นทั้งหมดถูกกำหนดค่าอย่างถูกต้อง", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_SUPPLIER_EMAY_10000": "parameter ไม่ถูกต้อง มี supplier[%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10026": "username ที่ได้รับจาก cloud service เป็นค่าว่าง กรุณาตรวจสอบการกำหนดค่าการยืนยันตัวตนของ user", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10025": "ไม่สามารถรับพารามิเตอร์ได้ [%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10028": "ปลั๊กอิน [uuid:%s] ถูกใช้โดยไคลเอนต์ OAuth2 [uuids:%s] สำหรับการยืนยันตัวตนการเข้าสู่ระบบบุคคลที่สาม", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10027": "ผู้ใช้ในเครื่องมีผู้ใช้ที่มีชื่อเดียวกัน [%s]", + "ORG_ZSTACK_AI_10097": "บริการโมเดลภายในกลุ่ม [uuid: %s] มีประเภทที่ไม่สอดคล้องกัน คาดว่าจะเป็นประเภท: %s แต่พบประเภท: %s", + "ORG_ZSTACK_AI_10098": "แบ็คเอนด์บริการโมเดล [type: %s] ไม่พบในสภาพแวดล้อมเสมือน", + "ORG_ZSTACK_AI_10095": "บริการโมเดลทั้งหมดภายในกลุ่ม [uuid: %s] ต้องกำหนดค่า serviceBootUptime", + "ORG_ZSTACK_AI_10096": "ไม่พบอินสแตนซ์บริการโมเดลที่มี node rank 0 ในกลุ่ม [uuid: %s]", + "ORG_ZSTACK_AI_10093": "อินสแตนซ์บริการโมเดล [uuid: %s] ไม่ทำงานและไม่พร้อมใช้งาน แต่ไม่พบรหัสข้อผิดพลาด", + "ORG_ZSTACK_AI_10094": "เนื้อหาที่ไม่คาดคิด: YAML ของบริการ %s ถูกแยกวิเคราะห์เป็นค่าว่าง", + "ORG_ZSTACK_AI_10091": "ไม่สามารถรับสถานะความพร้อมใช้งานได้เนื่องจาก %s", + "ORG_ZSTACK_AI_10092": "อินสแตนซ์บริการโมเดล [uuid: %s] ไม่พร้อมใช้งานและไม่พร้อมเนื่องจาก %s", + "ORG_ZSTACK_AI_10090": "การโหลดคอนฟิกเกอร์ NGINX ใหม่ล้มเหลว: %s", + "ORG_ZSTACK_VROUTERROUTE_10010": "ปลายทาง [%s] ไม่สามารถมีทั้งเส้นทาง black hole และเส้นทางแบบคงที่พร้อมกันได้", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10000": "ไม่พบพื้นที่เก็บข้อหลักภายนอก [uuid:%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10031": "%s ไปยัง %s ล้มเหลว รหัสสถานะ: %s เนื้อหาการตอบกลับ: %s", + "ORG_ZSTACK_VROUTERROUTE_10012": "ไม่สามารถเพิ่มรายการเส้นทาง Black Hole ซ้ำสำหรับปลายทาง: %s", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10030": "ข้อผิดพลาด HTTP รหัสสถานะ: %s เนื้อหาการตอบกลับ: %s", + "ORG_ZSTACK_VROUTERROUTE_10011": "ไม่สามารถเพิ่มรายการเส้นทางแบบคงที่ซ้ำ ปลายทาง: %s เป้าหมาย: %s ประเภท: %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10003": "พื้นที่ว่างที่ต้องการที่ locationUrl:%s ไม่สามารถตอบสนองเงื่อนไข [availableSize > %d bytes] พื้นที่ว่างที่มีอยู่ %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10004": "ไม่พบ volume ที่มี UUID [%s] เส้นทางการติดตั้ง", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10001": "ไม่สามารถสร้างการเชื่อมต่อกับบริการพื้นที่เก็บข้อายนอก โปรดตรวจสอบว่าบริการพื้นที่เก็บข้อของคุณกำหนดค่าอย่างถูกต้องและสามารถเข้าถึงได้ในสภาพแวดล้อมคลาวด์", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10032": "%s ไปยัง %s ล้มเหลว ข้อผิดพลาด IO: %s", + "ORG_ZSTACK_AI_10099": "กลุ่มอินสแตนซ์บริการโมเดล [uuid: %s] ไม่มีอยู่", + "ORG_ZSTACK_VROUTERROUTE_10001": "ไม่พบโรงงานบริการสำหรับประเภทเราเตอร์เสมือน [%s]", + "ORG_ZSTACK_VROUTERROUTE_10000": "เราเตอร์เสมือน [uuid:%s] ไม่สามารถค้นหาได้", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10015": "Ceph BS[uuid=%s] ไม่พบชื่อ pool", + "ORG_ZSTACK_VROUTERROUTE_10003": "ไม่พบตารางเส้นทาง [uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10012": "ไม่สามารถอัปเดตสถานะของ Ceph backup storage MON [UUID:%s] ถูกลบแล้ว ข้อผิดพลาดนี้สามารถเพิกเฉยได้", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10000": "ไม่พบกลุ่มกำหนดตารางเวลาของโฮสต์ [uuid:%s] อาจถูกลบหรือถูกกำหนดใหม่", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10003": "โฮสต์ [UUID:%s] ถูกแนบอยู่กับกลุ่มกำหนดตารางเวลาของโฮสต์ [UUID:%s] อยู่แล้ว", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10004": "โฮสต์ที่มี UUID %s เป็นค่าว่าง กรุณาตรวจสอบการกำหนดค่าคลัสเตอร์", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10001": "ไม่พบกฎการจัดตารางเครื่องเสมือน [uuid:%s], อาจถูกลบไปแล้ว", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10002": "ไม่พบกลุ่มการจัดตารางเครื่องเสมือน [uuid:%s], อาจถูกลบไปแล้ว", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10011": "พื้นที่จัดเก็บข้อมูลสำรอง CEPH ไม่รองรับการคำนวณข้อมูลตรวจสอบรูปภาพ", + "ORG_ZSTACK_SNS_PLATFORM_HTTP_10000": "คำขอ HTTP POST ล้มเหลว สถานะ: %s, เนื้อหา: %s", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10007": "รูปภาพ [uuid: %s] ไม่พร้อมใช้งานบนพื้นที่จัดเก็บข้อมูลสำรอง [uuid:%s, name:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10005": "มีพื้นที่จัดเก็บข้อมูลสำรอง CEPH อื่นที่มี FSID เดียวกัน คุณไม่สามารถเพิ่มการตั้งค่า CEPH เดียวกันเป็นพื้นที่จัดเก็บข้อมูลสำรองสองแห่งได้ [name:%s, uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10003": "ไม่สามารถเชื่อมต่อกับพื้นที่จัดเก็บข้อมูลสำรอง Ceph [UUID:%s], ไม่สามารถเชื่อมต่อกับ Ceph monitors ทั้งหมดได้", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10002": "ไม่พบ CephMon [hostname:%s] บนพื้นที่จัดเก็บข้อมูลสำรอง [uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10009": "ไม่สามารถเพิ่มโหนด MON ไปยังคลัสเตอร์พื้นที่จัดเก็บข้อมูลสำรอง Ceph ได้", + "ORG_ZSTACK_MULTICAST_ROUTER_BACKEND_10000": "เราเตอร์ multicast [uuid:%s] ถูกลบไปในระหว่างการเปิดใช้งาน multicast บน backend", + "ORG_ZSTACK_LDAP_10016": "การสืบค้นรายการ LDAP ล้มเหลว, %s", + "ORG_ZSTACK_LDAP_10017": "การสืบค้นรายการ ldap [filter: %s] ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_LDAP_10012": "ไม่สามารถสร้างการเชื่อมต่อกับเซิร์ฟเวอร์ LDAP/AD, ข้อมูลประจำตัวไม่ถูกต้อง กรุณาตรวจสอบ User DN และรหัสผ่าน", + "ORG_ZSTACK_LDAP_10013": "ไม่สามารถสร้างการเชื่อมต่อกับเซิร์ฟเวอร์ LDAP/AD, ความล้มเหลวในการสื่อสาร กรุณาตรวจสอบที่อยู่ IP, หมายเลขพอร์ต และ Base DN", + "ORG_ZSTACK_LDAP_10014": "ไม่สามารถสร้างการเชื่อมต่อกับเซิร์ฟเวอร์ LDAP/AD, %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10005": "ใบอนุญาตปัจจุบัน [%s] ไม่ถูกต้องสำหรับการดำเนินงานพื้นที่จัดเก็บข้อมูลสำรองของรูปภาพ", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10004": "CephPrimaryStorage [%s] ไม่มีอยู่!", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10001": "รูปภาพ [uuid:%s] ถูกลบออกจากที่เก็บข้อมูลคลาวด์แล้ว", + "ORG_ZSTACK_LDAP_10010": "LdapServerType [%s] ไม่ถูกต้อง, ค่าที่ถูกต้อง: [%, %s]", + "ORG_ZSTACK_LDAP_10007": "ไม่พบบัญชี [UUID:%s]!!!", + "ORG_ZSTACK_LDAP_10008": "ไม่รองรับขอบเขตเซิร์ฟเวอร์ LDAP/AD สำหรับการกำหนดค่าสภาพแวดล้อมคลาวด์ กรุณาตรวจสอบว่าขอบเขตสอดคล้องกับมาตรฐานการคำนวณเสมือนและคลาวด์", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10000": "ล้มเหลวในการสร้าง elastic IP [uuid:%s, name:%s, ip:%s] สำหรับอินเทอร์เฟซเครือข่ายเครื่องเสมือน [uuid:%s] บน virtual router [uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10001": "พบข้อเสนอ virtual router [uuid:%s] สำหรับ L3Network [uuid:%s] ในโซน [uuid:%s]; อย่างไรก็ตาม การกำหนดค่า IP สาธารณะของเครือข่ายไม่ตรงกับ Elastic IP [uuid:%s] คุณอาจต้องระบุข้อเสนอ virtual router เฉพาะโดยใช้ system tag guestL3Network::l3NetworkUuid สำหรับ L3Network [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10002": "ล้มเหลวในการถอด eip [uuid:%s, name:%s, ip:%s] จาก vm nic [uuid:%s] บน virtual router [uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10004": "ล้มเหลวในการซิงโครไนซ์ eip บน virtual router [uuid:%s], รายละเอียดข้อผิดพลาด: %s", + "ORG_ZSTACK_AI_10004": "randomUuid ไม่ตรงกับค่าที่คาดหวัง กรุณาตรวจสอบตรรกะการสร้าง UUID", + "ORG_ZSTACK_AI_10005": "ไม่พบ Model Center กรุณาตรวจสอบว่าบริการ Model Center ถูกติดตั้งและกำหนดค่าอย่างถูกต้องในสภาพแวดล้อมคลาวด์ของคุณ", + "ORG_ZSTACK_AI_10003": "randomUuid เป็นค่าว่าง กรุณาตรวจสอบว่ามีการสร้าง UUID ที่ถูกต้องก่อนการใช้งาน", + "ORG_ZSTACK_AI_10001": "ที่อยู่ IP การจัดการ model center ที่ให้มา %s ไม่ถูกต้อง กรุณาตรวจสอบว่าเป็น IP ที่ถูกต้องแล้วลองอีกครั้ง", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10027": "vm[uuid:%s] กำลังทำงานบน host[uuid:%s] ซึ่งไม่เป็นไปตาม scheduling policy[%s] ที่เกี่ยวข้องกับ vm scheduling group[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10028": "vm[uuid:%s] กำลังทำงานบน host[uuid:%s] ซึ่งไม่เป็นไปตาม scheduling rule[%s] ที่เกี่ยวข้องกับ virtual machine scheduling group[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10019": "VM scheduling group [UUID:%s] มี exclusive หรือ affinity-based VM scheduling policy ที่ถูกดำเนินการแล้วแนบอยู่ ไม่สามารถแนบ policy ประเภทที่ต้องการการดำเนินการใดๆ กลับไปยังกลุ่มนี้ได้อีก", + "ORG_ZSTACK_AI_10028": "modelServices ไม่สามารถเป็น null หรือว่างได้ โปรดตรวจสอบให้แน่ใจว่า service instance ของคุณถูกเริ่มต้นและกำหนดค่าอย่างถูกต้อง", + "ORG_ZSTACK_AI_10029": "modelServices ควรใช้ model UUID เดียวกันกับ virtual instances เพื่อความสอดคล้อง", + "ORG_ZSTACK_AI_10026": "serviceNetworkUuid %s ไม่ใช่ system Layer 3 network", + "ORG_ZSTACK_AI_10027": "storageNetworkUuid %s ไม่ใช่ system Layer 3 network", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10025": "vm[uuid:%s] กำลังทำงานบน host[uuid:%s] ซึ่งไม่เป็นไปตาม scheduling policy ที่เกี่ยวข้องกับ virtual machine scheduling group[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10026": "hostGroup[uuid:%s] ไม่มี hosts ที่ถูกกำหนด", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10024": "vm scheduling group[uuid:%s] ไม่สามารถ reserve host [uuid:%s] สำหรับ vm [uuid:%s] ได้", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10007": "vm[uuid:%s] เชื่อมโยงกับ vm scheduling group[uuid:%s] อยู่แล้ว", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10008": "ตรวจพบ unmatched zone: VM[UUID: %s, Zone UUID: %s] แตกต่างจาก scheduling rule group ของมัน[UUID: %s, Zone UUID: %s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10005": "Hosts ที่คุณสามารถเพิ่มไปยัง host scheduling group ต้องถูกเปิดใช้งานและเชื่อมต่อกับ Management Node (MN)", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10006": "ตรวจพบ unmatched zone, zone ของ host [uuid: %s, zone uuid: %s] แตกต่างจาก host scheduling rule group [uuid: %s, zone uuid: %s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10009": "vm สามารถเปลี่ยน VM scheduling group ได้เฉพาะใน states [%s,%s] เท่านั้น แต่ปัจจุบันอยู่ใน state [%s]", + "ORG_ZSTACK_TEMPLATECONFIG_10000": "ไม่สามารถค้นหา TemplateConfigs ได้: [template UUID: %s]", + "ORG_ZSTACK_TICKET_API_10002": "ไม่มี account system type [%s] ถูกกำหนดไว้ใน configuration", + "ORG_ZSTACK_TICKET_API_10003": "ไม่พบ Ticket type ใน cloud environment configuration.%s", + "ORG_ZSTACK_TICKET_API_10004": "ไม่พบ matched ticket flow collection หรือ default ticket flow collection โปรดระบุ flowCollectionUuid หรือสร้าง default ticket flow collection ในระบบ", + "ORG_ZSTACK_TEMPLATECONFIG_10003": "ไม่สามารถค้นหา Template Configuration ได้[category: %s, name: %s, template UUID: %s]", + "ORG_ZSTACK_TICKET_API_10005": "Ticket flow collection [UUID:%s] ไม่ตรงกับ ticket type [UUID:%s]", + "ORG_ZSTACK_TICKET_API_10006": "Ticket flow collection[uuid:%s] ไม่ถูกต้อง โปรดติดต่อผู้ดูแลระบบเพื่อแก้ไข", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10000": "Aliyun NAS primary storage [UUID:%s, Name:%s] ไม่สามารถค้นหา host ที่พร้อมใช้งานภายใน clusters ที่แนบมาเพื่อสร้าง volume", + "ORG_ZSTACK_TICKET_API_10007": "Ticket flow collection [UUID:%s] ถูกปิดใช้งานและไม่สามารถใช้งานได้", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10001": "Alibaba Cloud NAS primary storage [UUID:%s, Name:%s] ไม่สามารถค้นหา host ที่พร้อมใช้งานใน attached clusters เพื่อลบ bits บน primary storage", + "ORG_ZSTACK_TICKET_API_10008": "request ไม่ถูกต้อง ไม่พบ API[%s] ใน namespace หรือ scope ที่ระบุ", + "ORG_ZSTACK_TICKET_API_10009": "request ไม่ถูกต้อง ไม่สามารถสร้าง API[%s] จาก apiBody, %s", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10010": "ไม่สามารถดำเนินการ VPC VM scheduling group ได้", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10011": "UUID ของ availability zone ไม่เป็น null", + "ORG_ZSTACK_TEMPLATECONFIG_10005": "ไม่สามารถค้นหา TemplateConfigs ได้: [templateUUID: %s]", + "ORG_ZSTACK_AI_10012": "architectureImages ต้องไม่เป็นค่าว่างหรือ null ในสภาพแวดล้อมการทำ Virtualization แบบ Cloud กรุณาตรวจสอบว่ากำหนดค่าอย่างถูกต้อง", + "ORG_ZSTACK_AI_10042": "รูปแบบ CloudFormation template ไม่ถูกต้อง: %s", + "ORG_ZSTACK_AI_10043": "การกำหนดค่า YAML และการอัปเดตพารามิเตอร์แยกกันเป็นสิ่งที่ขัดแย้งกันในสภาพแวดล้อม cloud computing กรุณาเลือกวิธีหนึ่งสำหรับการอัปเดตการตั้งค่า", + "ORG_ZSTACK_AI_10040": "servicePorts ไม่สามารถมีค่าซ้ำกันได้: %s", + "ORG_ZSTACK_AI_10041": "serviceBootupTime ต้องอยู่ในช่วง [1,65535]", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10006": "ไม่สามารถตรวจสอบ mount path บน host ได้: %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10005": "Aliyun NAS primary storage [UUID: %s, name: %s] ไม่ได้ถูก mount เข้ากับ cluster ใด หรือไม่มี host ที่เชื่อมต่อใน cluster ที่ mount", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10009": "ไม่พบ host สำหรับทำความสะอาด image cache กรุณาตรวจสอบว่ามี host ที่พร้อมใช้งานอย่างน้อยหนึ่งตัวและกำหนดค่าอย่างถูกต้องสำหรับ image caching", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10013": "ไม่สามารถ attach primary storage เข้ากับ cluster ได้ KVM host [uuid:%s, name:%s] ใน cluster ใช้ qemu-img เวอร์ชัน [%s] อย่างไรก็ตาม primary storage ถูก attach เข้ากับ cluster ที่มี KVM host [uuid:%s] ซึ่งใช้ qemu-img เวอร์ชัน [%s] qemu-img เวอร์ชันที่มากกว่า %s ไม่สามารถใช้งานร่วมกับเวอร์ชันที่น้อยกว่า %s ซึ่งอาจทำให้การทำ volume snapshot ล้มเหลว กรุณาหลีกเลี่ยงการ attach primary storage เข้ากับ cluster ที่มี Linux distribution ต่างกันเพื่อป้องกันความไม่สอดคล้องของเวอร์ชัน qemu-img", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10014": "ไม่มี compute resource ที่พร้อมใช้งานสำหรับดาวน์โหลด image cache!", + "ORG_ZSTACK_AI_10049": "CPU architecture ใน architecture image mapping ไม่สามารถเป็นค่าว่างได้ กรุณาตรวจสอบว่าระบุ CPU architecture ที่ถูกต้อง", + "ORG_ZSTACK_AI_10046": "GPU vendor %s ต้องให้รายการ specification UUID", + "ORG_ZSTACK_AI_10047": "ไม่พบ GPU specification UUID(s) สำหรับ vendor %s ใน %s: %s", + "ORG_ZSTACK_AI_10044": "การ map GPU vendor specification ใน architecture image mapping ไม่สามารถเป็นค่าว่างได้ กรุณาตรวจสอบว่าระบุ GPU vendor อย่างถูกต้อง", + "ORG_ZSTACK_AI_10045": "GPU vendor ใน architecture image mapping ไม่สามารถเป็นค่าว่างได้ กรุณาระบุชื่อ GPU vendor ที่ถูกต้อง", + "ORG_ZSTACK_AI_10031": "modelServices UUID ไม่ควรเป็น null กรุณาตรวจสอบว่าให้ UUID ที่ถูกต้องสำหรับ modelServices", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10008": "ไม่สามารถ parse metadata envelope ได้: %s, %s", + "ORG_ZSTACK_AI_10032": "nodeRank ต้องอยู่ในช่วง [0, %s) แต่ได้รับ %s", + "ORG_ZSTACK_AI_10030": "modelServices ควรใช้ zone UUID เดียวกันกับ compute nodes", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10003": "argument ไม่ถูกต้องสำหรับ source file path", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10004": "ไม่สามารถ decrypt ข้อมูลโดยใช้ encryption key ที่ให้มา กรุณาตรวจสอบ key และลองใหม่", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10017": "AliyunNasAccessGroupVO[%s] ไม่มีอยู่ อาจถูกลบไปแล้ว!", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10018": "EcsVSwitchVO[%s] ไม่มีอยู่ อาจถูกลบไปแล้ว!", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10020": "ไม่พบ host ที่พร้อมใช้งานสำหรับดำเนินการใน primary storage: %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10021": "ไม่สามารถ ping Aliyun NAS primary storage[UUID:%s] จาก host[UUID:%s] ได้ เนื่องจาก %s กรุณาตัดการเชื่อมต่อ host-NAS นี้", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10024": "ไม่พบ BackupStorageKVMFactory สำหรับ type[%s]", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10025": "ไม่พบ host สำหรับจัดการ volume: [%s]", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10023": "NAS primary storage ยังไม่ได้ mount กรุณา initialize ก่อน!", + "ORG_ZSTACK_AI_10039": "servicePorts ต้องอยู่ในช่วง [1,65535] แต่ได้รับ: %s", + "ORG_ZSTACK_AI_10037": "serviceLivez ต้องเริ่มต้นด้วย '/' และไม่มีช่องว่าง ความยาวไม่ควรเกิน 512 ตัวอักษร", + "ORG_ZSTACK_AI_10038": "serviceReadyz ต้องเริ่มต้นด้วย /, ไม่มีช่องว่าง และมีความยาวไม่เกิน 512 ตัวอักษร", + "ORG_ZSTACK_AI_10035": "Framework ไม่ถูกต้อง: %s, ค่าที่ถูกต้องคือ: EC2, GCE, Azure, OpenStack", + "ORG_ZSTACK_AI_10036": "Framework ไม่ถูกต้อง: %s", + "ORG_ZSTACK_AI_10033": "ตัวระบุอุปกรณ์ PCI ไม่ถูกต้อง: %s", + "ORG_ZSTACK_AI_10034": "nodeRank ควรเป็นค่าที่ไม่ซ้ำกัน แต่ได้รับ %s", + "ORG_ZSTACK_ACL_10001": "%s รายการ IP ซ้ำ/ทับซ้อนกับกลุ่มรายการควบคุมการเข้าถึง:%s", + "ORG_ZSTACK_AI_10064": "โครงสร้าง schema ชุดข้อมูลไม่ถูกต้อง: %s", + "ORG_ZSTACK_ACL_10000": "ไม่รองรับเวอร์ชัน IP %d", + "ORG_ZSTACK_AI_10065": "ชุดข้อมูลที่ตั้งค่าล่วงหน้าของระบบไม่ได้รับอนุญาตให้อัปเดตผ่านการเรียก API กรุณาติดต่อฝ่ายสนับสนุนเพื่อขอความช่วยเหลือ", + "ORG_ZSTACK_AI_10062": "ชุดข้อมูลกำลังถูกใช้งานและไม่สามารถลบผ่าน API ได้ กรุณาตรวจสอบให้แน่ใจว่าทรัพยากรที่เกี่ยวข้องทั้งหมดถูกยกเลิกแล้วก่อนดำเนินการลบ", + "ORG_ZSTACK_AI_10063": "updateDatasetStructs ไม่สามารถเป็น null หรือว่างได้ กรุณาตรวจสอบให้แน่ใจว่าโครงสร้างชุดข้อมูลถูกกำหนดและมีข้อมูลอย่างถูกต้องก่อนดำเนินการต่อ", + "ORG_ZSTACK_AI_10060": "ไม่สามารถยกเลิก VM instance ได้เนื่องจากมันถูกใช้งานโดยกลุ่มบริการโมเดล [UUID: %s]", + "ORG_ZSTACK_ZSV_COMPUTER_VM_10000": "ชื่อ VM %s มีอยู่แล้วในสภาพแวดล้อมคลาวด์", + "ORG_ZSTACK_AI_10061": "ไม่อนุญาตให้แชร์ Application Instance Groups: %s", + "ORG_ZSTACK_ACL_10009": "กลุ่มรายการควบคุมการเข้าถึง[%s] มีกฎการเปลี่ยนเส้นทางอยู่แล้วและไม่สามารถเพิ่มได้อีก", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10028": "ไม่พบทรัพยากรคอมพิวเตอร์ที่พร้อมใช้งานเพื่อตรวจสอบเส้นทางการ mount!", + "ORG_ZSTACK_ACL_10008": "กลุ่มรายการควบคุมการเข้าถึง[%s] มีรายการ IP อยู่แล้ว ไม่สามารถเพิ่มกฎการเปลี่ยนเส้นทางได้", + "ORG_ZSTACK_ACL_10007": "กลุ่มรายการควบคุมการเข้าถึง[%s] มีกฎการเปลี่ยนเส้นทางอยู่แล้ว ดังนั้นจึงไม่สามารถเพิ่มรายการ IP ได้", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10026": "ไม่พบโฮสต์สำหรับซิงโครไนซ์ขนาดโวลูมในไพรมารี: %s", + "ORG_ZSTACK_ACL_10006": "กลุ่มรายการควบคุมการเข้าถึง[%s] ไม่สามารถมีรายการ IP เกิน %d รายการ", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10027": "รูปภาพ [%s] ถูกลบไปแล้ว ไม่สามารถเริ่มต้น root volume ใหม่จากมันได้", + "ORG_ZSTACK_SCHEDULER_SNAPSHOT_10000": "VM ของ root volume [%s] อยู่ในสถานะ Destroyed ไม่อนุญาตให้เปลี่ยนสถานะสำหรับงานนี้", + "ORG_ZSTACK_ACL_10005": "กลุ่มรายการควบคุมการเข้าถึง[%s] มีกฎการเปลี่ยนเส้นทางอยู่แล้ว ดังนั้นจึงไม่สามารถเพิ่มรายการ IP ได้", + "ORG_ZSTACK_ACL_10004": "นิพจน์กฎไม่ถูกต้อง กรุณาตรวจสอบให้แน่ใจว่าเป็นไปตามมาตรฐานการคำนวณคลาวด์ เช่น การใช้ %s สำหรับ placeholder อย่างถูกต้อง รายละเอียด: %s", + "ORG_ZSTACK_ACL_10003": "ช่วง IP [%s, %s] ทับซ้อนกับ [%s, %s] ภายในกลุ่มรายการควบคุมการเข้าถึง:%s", + "ORG_ZSTACK_ACL_10002": "รูปแบบ IP รองรับเฉพาะ ip/iprange/cidr แต่พบ %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10031": "Aliyun NAS PrimaryStorage รองรับเฉพาะ imagestore BS; ประเภทที่ได้รับจริง: %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10000": "การเข้ารหัส InfoSecEncryptDriver ล้มเหลวสำหรับทรัพยากร %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10001": "การถอดรหัส InfoSecEncryptDriver ล้มเหลวสำหรับทรัพยากรเสมือน %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10002": "ข้อมูลเข้ารหัส[%s] หรือประเภทอัลกอริทึมการเข้ารหัส[%s] เป็น null", + "ORG_ZSTACK_AI_10068": "การประเมินแบบจำลองต้องการ ModelServiceType.ModelEval", + "ORG_ZSTACK_AI_10069": "ต้องระบุ UUID ของชุดข้อมูลหรือ prompt อย่างน้อยหนึ่งรายการสำหรับการประเมินแบบจำลอง", + "ORG_ZSTACK_AI_10066": "UUID ของ ModelServiceVO จำเป็นต้องระบุ โปรดระบุ UUID ที่ถูกต้อง", + "ORG_ZSTACK_AI_10067": "ต้องระบุ serviceType", + "ORG_ZSTACK_ACL_10012": "url[%s] ไม่ใช่เส้นทาง cloud storage ที่ถูกต้อง", + "ORG_ZSTACK_AI_10053": "Image [uuid:%s] สำหรับ architecture %s ถูกปิดใช้งานและไม่สามารถใช้งานได้", + "ORG_ZSTACK_ACL_10011": "domain[%s] ไม่ใช่ชื่อโดเมนที่ถูกต้อง", + "ORG_ZSTACK_AI_10054": "Image [uuid:%s] สำหรับ architecture %s ที่ระบุไม่พร้อมใช้งานและไม่สามารถใช้ได้", + "ORG_ZSTACK_ACL_10010": "Domain และ URL ไม่สามารถว่างทั้งคู่ได้ โปรดระบุ domain หรือ URL ที่ถูกต้องอย่างน้อยหนึ่งรายการ", + "ORG_ZSTACK_AI_10051": "ต้องระบุตัวระบุ virtual machine image (vmImageUuid) หรือ container image (dockerImage) อย่างน้อยหนึ่งรายการสำหรับ architecture %s", + "ORG_ZSTACK_AI_10052": "UUID ของ image ไม่ถูกต้องสำหรับ architecture %s: %s", + "ORG_ZSTACK_AI_10050": "ประเภท CPU architecture ไม่ถูกต้องใน architecture image mapping: %s ประเภทที่รองรับได้แก่: %s", + "ORG_ZSTACK_AI_10059": "มีการกำหนด data type variations มากเกินไปใน dataset messages: %s โปรดลดเหลือประเภทเดียว", + "ORG_ZSTACK_AI_10057": "ไม่อนุญาตให้สร้าง dataset โดยไม่ระบุ data type และ usage scenarios ในสภาพแวดล้อม cloud computing โปรดระบุรายละเอียดที่จำเป็นสำหรับ dataset ของคุณ", + "ORG_ZSTACK_AI_10058": "ต้องระบุ data type ของ dataset อย่างน้อยหนึ่งประเภทเมื่อเพิ่ม dataset", + "ORG_ZSTACK_AI_10055": "ระบุ CPU architecture ซ้ำใน architecture image mapping: %s", + "ORG_ZSTACK_AI_10056": "architecture images ไม่สามารถว่างได้", + "ORG_ZSTACK_VMWARE_10101": "list storage ล้มเหลวสำหรับ %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10051": "ชื่อ LUN จำเป็นต้องระบุแต่ได้รับค่า null โปรดตรวจสอบให้แน่ใจว่าระบุชื่อ LUN ที่ถูกต้อง", + "ORG_ZSTACK_VMWARE_10102": "ไม่พบ datastore สำหรับ VirtualMachine: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10054": "ล้มเหลวในการดึง snapshot สำหรับ volume:%s ของ id คือ :%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10053": "ล้มเหลวในการดึง snapshot สำหรับ lun:%s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10012": "SFTP backup storage ไม่รองรับการคำนวณ image hashes", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10050": "initiator[%s] มีอยู่แล้วใน XStor และไม่ได้แนบกับ host[%s] โปรดตรวจสอบให้แน่ใจว่าชื่อ initiator มีความเป็นเอกลักษณ์", + "ORG_ZSTACK_ALIYUN_NETWORK_10020": "เฉพาะ EC2 instances ที่อยู่ในสถานะ running หรือ stopped เท่านั้นที่สามารถแนบ EIP ได้ แต่ ECS [%s] อยู่ในสถานะ [%s]", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10016": "สร้าง image metadata file: %s ล้มเหลว", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10017": "ตรวจสอบ image metadata file: %s ล้มเหลว", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10018": "image metadata file: %s ไม่มีอยู่", + "ORG_ZSTACK_ZWATCH_ALARM_10022": "พบ action ที่ซ้ำกัน[uuid:%s, type:%s] สำหรับ alarm[uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10021": "ไม่พบ action[uuid:%s, type:%s] ในสภาพแวดล้อม cloud computing", + "ORG_ZSTACK_ZWATCH_ALARM_10020": "ประเภทการดำเนินการไม่ถูกต้อง[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10026": "รหัสซ้ำ[%s] พร้อมค่าที่แตกต่างกัน{%s}%", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10170": "ไม่สามารถเพิ่ม IP เซิร์ฟเวอร์ไปยังกลุ่มเซิร์ฟเวอร์ load balancer ที่แชร์ได้ %s", + "ORG_ZSTACK_ZWATCH_ALARM_10025": "เมทริกไม่มีป้ายกำกับที่ระบุ[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10023": "มีการกำหนดป้ายกำกับซ้ำสำหรับ alarm ที่มี UUID [uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10029": "เมทริก[%s] จำกัดสำหรับผู้ดูแลระบบและไม่พร้อมใช้งานสำหรับบทบาทผู้ใช้ปัจจุบันของคุณ", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10171": "ไม่สามารถแก้ไขเซิร์ฟเวอร์แบ็กเอนด์ได้เนื่องจาก vmincs และ IP เซิร์ฟเวอร์เป็นค่าว่าง", + "ORG_ZSTACK_ZWATCH_ALARM_10028": "namespace[%s] ไม่มีเมทริก[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10027": "namespace[%s] ไม่ได้รับการสนับสนุน", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10049": "LUN ID ไม่ถูกต้อง โปรดตรวจสอบว่าเป็นไปตามรูปแบบและค่าที่กำหนดสำหรับอุปกรณ์จัดเก็บข้อมูลคลาวด์", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10048": "LUN mapping ID เป็นข้อมูลบังคับและไม่สามารถเป็นค่าว่างหรือศูนย์ได้ โปรดระบุ LUN mapping ID ที่ถูกต้อง", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10045": "ล้มเหลวในการดึง volume mappings เนื่องจาก: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10044": "ล้มเหลวในการตรวจสอบสถานะ session ของ LUN %s เนื่องจาก: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10047": "ไม่มีกลไกในการดึง LUN mapping ID ดังนั้นการดำเนินการจึงล้มเหลว", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10046": "ล้มเหลวในการดึงจำนวน LUN ที่สร้างไว้ของ LUN %s เนื่องจาก: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10041": "snapshot ID เป็นข้อมูลบังคับแต่ได้รับ:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10040": "ล้มเหลวในการสอบถาม snapshots สำหรับ instance %s เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10043": "ล้มเหลวในการย้อนกลับ snapshot:%s เนื่องจาก: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10020": "โปรดหยุด VM ก่อนสร้าง volume template สำหรับ SFTP backup storage %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10042": "ล้มเหลวในการลบ snapshot %s เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10023": "มี backup storage ซ้ำ มี SFTP backup storage[hostname:%s] มีอยู่แล้ว", + "ORG_ZSTACK_LICENSE_CUBE_10000": "บริบท source code ไม่สามารถเป็นค่าว่างสำหรับการตรวจสอบ license ได้ โปรดระบุบริบท string ที่ถูกต้อง", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10038": "ล้มเหลวในการดึง storage pool %s เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10037": "ล้มเหลวในการลบ lun %s เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10039": "ล้มเหลวในการสร้าง snapshot สำหรับ volume %s เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10034": "lun mapping id เป็นข้อมูลบังคับแต่ได้รับ:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10033": "ล้มเหลวในการ map lun %s ไปยัง host group %s เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10036": "lun id เป็นข้อมูลบังคับแต่ได้รับ:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10035": "ล้มเหลวในการลบ lun mapping %s เนื่องจาก %s", + "ORG_ZSTACK_ALIYUN_NETWORK_10004": "ecs instance[%s] ไม่มีอยู่ โปรดตรวจสอบ", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10001": "%s ไม่สามารถดาวน์โหลดบิตของเครื่องเสมือนจากที่เก็บข้อมูลสำรองของคลังภาพ[hostname:%s, path: %s] ไปยังที่เก็บข้อมูลหลักในเครื่อง[uuid:%s, path: %s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10002": "", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10020": "ไม่สามารถอัปโหลดบิตจากที่เก็บข้อมูลในเครื่อง[uuid:%s, path:%s] ไปยังคลังภาพ [hostname:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10000": "", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10000": "เครือข่าย l3 %s และ VPC %s เชื่อมต่อกันอยู่แล้ว กรุณาตรวจสอบ", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10001": "", + "ORG_ZSTACK_ALIYUN_NETWORK_10008": "เครื่องเสมือนต้นทางมีวอลุมข้อมูลในเครื่องบนโฮสต์ [UUID: %s] แต่ API การโคลนแบบเร็วพยายามโคลนเครื่องเสมือนไปยังโฮสต์ [%s] ซึ่งไม่รองรับโดยฟีเจอร์การโคลนแบบเร็ว", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10002": "", + "ORG_ZSTACK_ALIYUN_NETWORK_10005": "AutoScalingRuleSchedulerJobTriggerVO[UUID:%s] อยู่ในสถานะ %s ไม่อนุญาตให้เปลี่ยนสถานะ", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10018": "", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10017": "AutoScalingRuleSchedulerJobTriggerVO[uuid:%s] อยู่ในช่วงเวลาคูลดาวน์", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10019": "", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10000": "border เสมือน: %s ถูกยกเลิกแล้ว", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10014": "", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10013": "AutoScalingRuleVO[uuid:%s] อยู่ในสถานะ %s ไม่อนุญาตให้เปลี่ยนสถานะ", + "ORG_ZSTACK_ALIYUN_NETWORK_10010": "", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10061": "อินสแตนซ์ ECS ในสถานะ running หรือ stopped เท่านั้นที่สามารถถอด EIP ได้ แต่สถานะปัจจุบันของ ECS [%s] คือ [%s]", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10016": "", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10003": "CpeIp ต้องเป็นที่อยู่ IPv4 แต่ปัจจุบันคือ %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10060": "", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10015": "เฉพาะผู้ใช้ที่มีสิทธิ์ดูแลระบบเท่านั้นที่สามารถสร้างการเชื่อมต่อในสภาพแวดล้อมคลาวด์นี้", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10004": "", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10010": "cpeIp ต้องเป็นที่อยู่ IPv4 ที่ถูกต้อง", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10012": "", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10059": "SftpBackupStorage ไม่รองรับ scheme[%s] ใน URL[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10055": "", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10058": "ไม่พบการสำรองข้อมูลเครื่องเสมือนสำหรับ: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10057": "", + "ORG_ZSTACK_HYBRID_NETWORK_10027": "ไม่พบเครื่องเสมือนสำหรับ: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10028": "", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10010": "ล้มเหลวในการยุติ instance %s เนื่องจาก %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10009": "ไม่พบ virtual network interface สำหรับ layer 3 network: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10029": "ไม่มี virtual border router ดังกล่าว: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10003": "custom CIDR [%s] มีอยู่แล้วใน VBR [%s], ทับซ้อนกับ target CIDR [%s] กรุณาตรวจสอบและลบก่อน", + "ORG_ZSTACK_HYBRID_NETWORK_10020": "next-hop router interface เป็นของ %s แต่ entry เป็นของ %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10001": "Vbr: [%s] กำลังสร้างการเชื่อมต่อ กรุณารอสักครู่...", + "ORG_ZSTACK_HYBRID_NETWORK_10021": "ไม่มี virtual private gateway ดังกล่าว: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10000": "custom CIDR [%s] มีอยู่แล้วใน virtual router [%s], ทับซ้อนกับ target CIDR [%s] กรุณาตรวจสอบและลบก่อน", + "ORG_ZSTACK_HYBRID_NETWORK_10022": "next hop type [%s] ไม่รองรับสำหรับการสร้าง route entry!", + "ORG_ZSTACK_HYBRID_NETWORK_10024": "virtual border router รองรับเฉพาะ router interface เป็น next hop type เท่านั้น", + "ORG_ZSTACK_HYBRID_NETWORK_10026": "vswitch's cidr [%s] ไม่อยู่ภายใน vpc's [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10008": "ล้มเหลวในการเพิ่ม instance %s เข้า host group %s เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10005": "ล้มเหลวในการรับ access zone's subnet เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10004": "ล้มเหลวในการ sync access zones เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10007": "ล้มเหลวในการ query instances %s เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10006": "ล้มเหลวในการ query all instances เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10001": "ล้มเหลวในการเพิ่ม initiator: %s เข้า host เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10000": "ล้มเหลวในการยืนยันตัวตนกับ XStor device: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10002": "ล้มเหลวในการ copy LUN: %s ไปยัง %s เนื่องจาก %s", + "ORG_ZSTACK_HYBRID_NETWORK_10038": "eip[%s] และ ecs[%s] ควรอยู่ใน availability zone เดียวกัน", + "ORG_ZSTACK_VMWARE_10135": "ล้มเหลวในการตั้งค่า ZStack UUID ให้กับ VCenter Managed Entity [name:%s, mor:%s] เนื่องจาก %s", + "ORG_ZSTACK_HYBRID_NETWORK_10039": "ไม่สามารถ detach eip: [%s], ไม่ได้แนบอยู่กับ instance ใด", + "ORG_ZSTACK_VMWARE_10132": "ไม่มี unit number สำหรับ data disk %s", + "ORG_ZSTACK_VMWARE_10133": "create dvPortGroup ล้มเหลวสำหรับ distributedSwitch [%s], %s", + "ORG_ZSTACK_VMWARE_10130": "delete volume[%s] ล้มเหลว: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10030": "ไม่มี virtual router ดังกล่าว: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10031": "localGateway ไม่ใช่ IPv4 address: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10032": "peerGateway ไม่ใช่ IPv4 address ที่ถูกต้อง: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10033": "peerGateway ไม่ใช่ Subnet Mask ที่ถูกต้อง: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10034": "vlanId ต้องเป็นค่าตัวเลข: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10035": "ไม่สามารถแนบ EIP ไปยัง ECS: [%s] ได้, EIP :[%s] ถูกแนบไปยัง ECS:[%s] อยู่แล้ว", + "ORG_ZSTACK_HYBRID_NETWORK_10036": "ECS [%s] มีที่อยู่ IP สาธารณะอยู่แล้ว", + "ORG_ZSTACK_HYBRID_NETWORK_10037": "ไม่สามารถแนบ EIP [%s] ไปยัง ECS [%s] ได้, เนื่องจาก ECS ถูกเชื่อมโยงกับ EIP อยู่แล้ว", + "ORG_ZSTACK_SSO_SERVICE_10014": "ไม่มี Virtual ID สำหรับผู้ใช้ %s", + "ORG_ZSTACK_VMWARE_10129": "บริการ Virtual disk manager ไม่พร้อมใช้งาน โปรดตรวจสอบว่าบริการกำลังทำงานอยู่หรือไม่ หรือติดต่อฝ่ายสนับสนุนเพื่อขอความช่วยเหลือ", + "ORG_ZSTACK_SSO_SERVICE_10011": "การตอบสนองมีข้อผิดพลาด: ไม่พบไฟล์ต้นทางในระบบจัดเก็บข้อมูลคลาวด์ โปรดตรวจสอบเส้นทางไฟล์และตรวจสอบว่าอัปโหลดไปยังสภาพแวดล้อมเสมือนอย่างถูกต้อง", + "ORG_ZSTACK_SSO_SERVICE_10010": "redirectUrl ไม่ถูกต้อง, %s", + "ORG_ZSTACK_VMWARE_10128": "ไม่พบศูนย์ข้อมูลสำหรับ datastore.%s", + "ORG_ZSTACK_SSO_SERVICE_10013": "ไม่มีบัญชีสำหรับผู้ใช้ %s", + "ORG_ZSTACK_SSO_SERVICE_10012": "ไม่สามารถสร้างการกำหนดค่าการแมปข้อมูลผู้ใช้สำหรับไคลเอนต์ SSO [UUID: %s] ได้: ไม่มีการกำหนดการแมปแอตทริบิวต์ที่กำหนดเอง", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10030": "ไม่สามารถสอบถามการแมป LUN สำหรับกลุ่มโฮสต์ %s ได้ เนื่องจาก %s", + "ORG_ZSTACK_HYBRID_NETWORK_10005": "router interface ต้องอยู่ในศูนย์ข้อมูลเดียวกัน, แต่ ri[%s] อยู่ใน dc[%s] และ ri[%s] อยู่ใน dc[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10032": "ไม่สามารถดึงข้อมูลคลัสเตอร์ได้ เนื่องจาก %s", + "ORG_ZSTACK_VMWARE_10121": "สร้าง dvPortGroup ล้มเหลวสำหรับ %s", + "ORG_ZSTACK_HYBRID_NETWORK_10007": "router interface[%s] ไม่อยู่ในสถานะว่าง, สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10031": "ไม่สามารถสอบถามการแมป LUN %s ได้ เนื่องจาก %s", + "ORG_ZSTACK_HYBRID_NETWORK_10009": "router interface[%s] มีการเชื่อมต่อที่ใช้งานอยู่แล้ว, มันคือ %s", + "ORG_ZSTACK_VMWARE_10120": "ไม่พบ dvSwitch [%s] บน vCenter [%s] โปรดตรวจสอบว่า dvSwitch มีอยู่และกำหนดค่าอย่างถูกต้อง", + "ORG_ZSTACK_GUESTTOOLS_10009": "ไม่พบ ISO ของเครื่องมือ guest OS ที่เหมาะสมบนโหนดการจัดการ [UUID:%s] สำหรับโฮสต์ [UUID:%s]", + "ORG_ZSTACK_GUESTTOOLS_10007": "ไม่สามารถรับเครื่องมือ guest tools ล่าสุดสำหรับ vm[uuid:%s] ได้ เนื่องจากไม่ได้ทำงานอยู่หรือกำลังกู้คืนโวลุม", + "ORG_ZSTACK_ZWATCH_ALARM_10000": "ไม่พบการสมัครใช้งานเหตุการณ์ [uuid:%s], อาจถูกลบหรือเพิกถ", + "ORG_ZSTACK_GUESTTOOLS_10008": "cannot obtain the latest guest tools for VM[UUID:%s] as it is not a user-managed VM", + "ORG_ZSTACK_GUESTTOOLS_10005": "qgaStateChange failed for virtual machine[uuid:%s]", + "ORG_ZSTACK_GUESTTOOLS_10006": "cannot retrieve the latest guest tools for VM [uuid:%s] as its hypervisor type is not supported", + "ORG_ZSTACK_GUESTTOOLS_10004": "qga file upload failed[%s]", + "ORG_ZSTACK_GUESTTOOLS_10001": "An error occurred on VM-%s: %s", + "ORG_ZSTACK_ZWATCH_ALARM_10002": "the metric[%s] repeat interval value cannot be less than 1 hour", + "ORG_ZSTACK_GUESTTOOLS_10002": "upload file failed to virtual machine-%s, %s", + "ORG_ZSTACK_ZWATCH_ALARM_10001": "cannot find the alarm[uuid:%s], it may have been deleted or expired", + "ORG_ZSTACK_SSO_SERVICE_10008": "Token %s does not exist in the cloud environment configuration. Please verify and re-enter the token.", + "ORG_ZSTACK_AI_10109": "ไม่พบ instance ของ model center [uuid: %s]", + "ORG_ZSTACK_SSO_SERVICE_10007": "ไม่สามารถอัปโหลดข้อมูลผู้ดูแลระบบไปยัง Keycloak ได้ โปรดตรวจสอบว่าสิทธิ์และการกำหนดค่าเครือข่ายที่จำเป็นได้รับการตั้งค่าอย่างถูกต้องสำหรับการ deploy บน cloud", + "ORG_ZSTACK_ZWATCH_ALARM_10007": "การสมัครรับ event มี label[%s] อยู่แล้ว", + "ORG_ZSTACK_AI_10107": "ไม่พบ model service instance (primary) ที่มี node rank 0 ใน model service instance group[uuid: %s]", + "ORG_ZSTACK_ZWATCH_ALARM_10006": "event ไม่มี label[%s]", + "ORG_ZSTACK_SSO_SERVICE_10009": "ประเภทข้อมูล %s ไม่รองรับในสภาพแวดล้อม cloud computing", + "ORG_ZSTACK_AI_10108": "ไม่พบ model service instance group %s ในสภาพแวดล้อม cloud", + "ORG_ZSTACK_ZWATCH_ALARM_10005": "action ที่มี UUID [%s] เชื่อมโยงกับ event subscription ที่มี UUID [%s] อยู่แล้ว", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10027": "สร้าง LUN name: %s ไม่สำเร็จ, ข้อความแสดงข้อผิดพลาด: %s", + "ORG_ZSTACK_SSO_SERVICE_10004": "ต้องระบุ IdP metadata URL %s", + "ORG_ZSTACK_AI_10105": "deploy model service สำเร็จ แต่ไม่พบ UUID ของ model service instance โปรดตรวจสอบการกำหนดค่า instance", + "ORG_ZSTACK_SSO_SERVICE_10003": "Authorization Endpoint URL ไม่ถูกต้อง: %s", + "ORG_ZSTACK_AI_10106": "UUID ของ model service instance ว่างเปล่า ไม่สามารถประมวลผล model service instances ได้ โปรดตรวจสอบว่าระบุ UUID แล้ว", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10029": "ต้องระบุ LUN ID เมื่อค้นหาข้อมูล LUN mapping", + "ORG_ZSTACK_SSO_SERVICE_10006": "Identity Provider metadata ไม่ถูกต้อง: %s", + "ORG_ZSTACK_AI_10103": "ไม่พบ model service instance group [UUID: %s], ข้ามการสร้างทรัพยากรสำหรับ service execution", + "ORG_ZSTACK_VMWARE_10118": "สร้าง port group สำหรับ host %s ไม่สำเร็จ เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10028": "ค้นหา LUN %s ไม่สำเร็จ เนื่องจาก %s", + "ORG_ZSTACK_AI_10104": "deploy model service reply สำเร็จ แต่ไม่พบ model service instance group[uuid: %s] ใน virtual machine instance pool", + "ORG_ZSTACK_VMWARE_10119": "สร้าง port group สำหรับ host %s ไม่สำเร็จ", + "ORG_ZSTACK_AI_10101": "ไม่พบ model storage backend สำหรับ model service instance group[uuid: %s]", + "ORG_ZSTACK_VMWARE_10116": "portgroup[%s] มีอยู่บน host[%s] แล้ว แต่มี VLAN ID(%d) ที่แตกต่างกัน", + "ORG_ZSTACK_AI_10102": "จัดสรร model service instance identifier ไม่สำเร็จ เนื่องจาก %s", + "ORG_ZSTACK_VMWARE_10117": "portgroup[%s] มีอยู่บน host[%s] แล้ว โปรดสร้าง port group ใหม่ที่มีชื่อต่างกัน หรือลบ port group ที่มีอยู่แล้วด้วยตนเองและแนบไปยัง cluster อีกครั้ง", + "ORG_ZSTACK_SSO_SERVICE_10002": "SSO client ไม่ใช่ identity type [%s], ไม่อนุญาตให้ดำเนินการ push", + "ORG_ZSTACK_VMWARE_10114": "dvSwitch name [%s] ไม่ซ้ำกัน", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10024": "สร้าง LUN name: %s ไม่สำเร็จ, ไม่พบสาเหตุ", + "ORG_ZSTACK_SSO_SERVICE_10001": "SSO client ที่มี UUID [%s] ไม่มีอยู่", + "ORG_ZSTACK_AI_10100": "model service instance group[uuid: %s] model service UUID เป็นค่าว่าง", + "ORG_ZSTACK_VMWARE_10115": "Host[%s:%s] ไม่พบใน vCenter inventory", + "ORG_ZSTACK_VMWARE_10112": "ไม่สามารถแสดงรายการ dvSwitch สำหรับ %s", + "ORG_ZSTACK_HYBRID_NETWORK_10016": "%s ไม่ใช่บล็อก CIDR ที่ถูกต้อง", + "ORG_ZSTACK_VMWARE_10113": "ไม่สามารถดึงชื่อคลัสเตอร์ vCenter[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10017": "กฎกลุ่มความปลอดภัยที่มีพารามิเตอร์เดียวกันมีอยู่แล้ว โปรดแก้ไขหรือลบกฎที่มีอยู่ก่อนสร้างกฎใหม่", + "ORG_ZSTACK_VMWARE_10110": "guest tools ไม่ได้ติดตั้งหรือทำงานสำหรับ VM: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10018": "dstCidrBlock[%s] ไม่ใช่ช่วงที่อยู่ IPv4 หรือ IPv6 ที่ถูกต้อง", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10020": "ไม่สามารถอัปเดตชื่อ LUN: %s, ข้อความข้อผิดพลาด: %s", + "ORG_ZSTACK_VMWARE_10111": "อัปโหลดไฟล์ล้มเหลวสำหรับเครื่องเสมือน: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10019": "ไม่มี ECS instance ดังกล่าว: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10010": "accessPointUuid ไม่สามารถเป็น null ได้หาก virtual router เป็นประเภท VBR", + "ORG_ZSTACK_HYBRID_NETWORK_10011": "ไม่พบ UUID ของ router [%s] ใน VirtualBorderRouterVO", + "ORG_ZSTACK_GUESTTOOLS_10018": "ไม่สามารถย้าย VM[UUID:%s] เนื่องจาก vfNic ถูกแนบแต่ guest tools ไม่ทำงาน", + "ORG_ZSTACK_ZWATCH_ALARM_10011": "event[%s] ขาด label[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10012": "ไม่พบ UUID ของ router [%s] ใน VpcVirtualRouterVO", + "ORG_ZSTACK_GUESTTOOLS_10019": "ไม่สามารถแนบเครือข่าย L3 ให้กับ VM [UUID:%s] เนื่องจาก guest tools ไม่ทำงาน", + "ORG_ZSTACK_ZWATCH_ALARM_10010": "namespace[%s] ไม่มี event[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10013": "ไม่รองรับประเภท router: %s", + "ORG_ZSTACK_GUESTTOOLS_10016": "ไม่สามารถเปลี่ยนสถานะ HA ของ VF NIC เนื่องจากไม่พบ VF NIC [UUID:%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10014": "ไม่สามารถลบรายการ virtual machine ระดับระบบได้", + "ORG_ZSTACK_GUESTTOOLS_10017": "ไม่สามารถเปลี่ยนสถานะของ virtual network interface card สำหรับ high availability ได้เนื่องจาก guest tools ไม่ทำงาน โปรดตรวจสอบให้แน่ใจว่า guest tools ติดตั้งและทำงานอยู่ก่อนดำเนินการนี้อีกครั้ง", + "ORG_ZSTACK_HYBRID_NETWORK_10015": "รองรับเฉพาะ intranet access rule ใน VPC", + "ORG_ZSTACK_GUESTTOOLS_10014": "สคริปต์มี placeholder %s ที่ไม่มีพารามิเตอร์ที่สอดคล้อง โปรดให้ค่าสำหรับ placeholder เหล่านี้ผ่าน runtimeParams เพื่อให้แน่ใจว่าการกำหนดค่าสภาพแวดล้อมการประมวลผลบนคลาวด์ของคุณถูกต้อง", + "ORG_ZSTACK_ZWATCH_ALARM_10015": "ฟิลด์ Period ไม่รองรับสำหรับ metric [name:%s]", + "ORG_ZSTACK_GUESTTOOLS_10015": "ไม่สามารถย้าง primary storage ได้เนื่องจาก VM [UUID:%s] ถูกแนบกับ VF Nic แต่ Guest Tools ไม่ทำงาน", + "ORG_ZSTACK_ZWATCH_ALARM_10014": "ฟิลด์ Period ไม่สามารถเป็น null ได้สำหรับ metric [name:%s]", + "ORG_ZSTACK_GUESTTOOLS_10012": "encodingType และ scriptContent ต้องมีทั้งคู่หรือไม่มีทั้งคู่ในการกำหนดค่าการปรับใช้คลาวด์ของคุณ", + "ORG_ZSTACK_ZWATCH_ALARM_10013": "ไม่พบ namespace[%s] ในรีจิสทรี namespace คลาวด์ที่ระบุ", + "ORG_ZSTACK_GUESTTOOLS_10013": "รูปแบบ renderParams ไม่ถูกต้อง ต้องเป็น JSON array ที่ถูกต้องของคู่ key-value ตัวอย่าง: [{\\\"key\\\":\\\"k1\\\",\\\"value\\\":\\\"v1\\\"}] ข้อผิดพลาด: %s", + "ORG_ZSTACK_GUESTTOOLS_10010": "ล้มเหลวในการตรวจสอบ guest tools บน host[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10019": "ไม่สามารถสอบถาม LUN ตาม path: %s, ข้อความข้อผิดพลาด: %s", + "ORG_ZSTACK_GUESTTOOLS_10011": "ไม่สามารถตั้งค่า VM UUID: %s NAME: %s hostname ได้เนื่องจาก QEMU Guest Agent ไม่ทำงานและไม่มีบริการ DHCP", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10016": "ไม่สามารถเพิ่มกลุ่มโฮสต์: %s, ข้อความแสดงข้อผิดพลาด: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10015": "ไม่สามารถค้นหากลุ่มโฮสต์เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10017": "ไม่สามารถค้นหา LUN: %s, ข้อความแสดงข้อผิดพลาด: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10012": "ไม่สามารถลบกลุ่มโฮสต์ %s เนื่องจาก %s", + "ORG_ZSTACK_VMWARE_10105": "ไม่พบพูลทรัพยากรสำหรับโฮสต์คอมพิวเตอร์ %s", + "ORG_ZSTACK_VMWARE_10106": "ไม่สามารถค้นหาพูลทรัพยากรสำหรับโฮสต์ %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10014": "ไม่สามารถลบ initiator %s เนื่องจาก %s", + "ORG_ZSTACK_VMWARE_10103": "ไม่สามารถตั้งค่า ESX VM UUID [%s:%s] ได้เนื่องจาก [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10013": "ตัวระบุโฮสต์จำเป็นต้องมีแต่ได้รับ:%s", + "ORG_ZSTACK_VMWARE_10104": "ไม่พบเทมเพลต [%%s] ในคลังเทมเพลตคลาวด์", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10029": "ไม่พบอินสแตนซ์บิลด์ที่มี UUID: %s หรืออยู่ในสถานะกำลังลบ", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10028": "ไม่พบ UUID สำหรับรูปภาพ[%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10027": "imageStore ไม่ได้เชื่อมต่อกับบริการจัดเก็บข้อมูลคลาวด์ โปรดตรวจสอบว่าบริการจัดเก็บข้อมูลคลาวด์ได้รับการกำหนดค่าอย่างถูกต้องแล้วลองใหม่", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10026": "imageStore ไม่ได้เปิดใช้งาน โปรดตรวจสอบว่า imageStore ได้รับการกำหนดค่าและเปิดใช้งานในการตั้งค่าสภาพแวดล้อมคลาวด์ของคุณแล้ว", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10024": "ไม่พบแอปพลิเคชันบิลด์: [%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10022": "ระบบบิลด์ [UUID: %s] ยังไม่ได้แนบกับโซนคอมพิวเตอร์ [UUID: %s]", + "ORG_ZSTACK_CONTAINER_10040": "สร้างการติดตั้งใดๆ บนคลัสเตอร์ที่มีอยู่ไม่สำเร็จ ลองใช้คลัสเตอร์ %d แห่ง: %s", + "ORG_ZSTACK_FLOWMETER_10013": "Collector ซ้ำกับ %s", + "ORG_ZSTACK_FLOWMETER_10014": "ไม่ได้ระบุพารามิเตอร์สำหรับคำขอจัดหาทรัพยากรคลาวด์ โปรดระบุ %s", + "ORG_ZSTACK_FLOWMETER_10015": "[%s] ไม่ตรงตามรูปแบบที่อยู่ IP", + "ORG_ZSTACK_FLOWMETER_10016": "FlowCollector[%s] ไม่มีอยู่", + "ORG_ZSTACK_GUESTTOOLS_10029": "ไม่สามารถดึงข้อมูลเครื่องมือแขกจาก VM [uuid:%s] เนื่องจากไม่ได้ทำงานอยู่", + "ORG_ZSTACK_CONTAINER_10043": "ไม่สามารถค้นหาบริการคลาวด์: %s, เนื่องจาก %s", + "ORG_ZSTACK_FLOWMETER_10017": "FlowMeter[%s] ไม่มีอยู่", + "ORG_ZSTACK_FLOWMETER_10018": "FlowMeter[%s] ไม่สนับสนุนเวอร์ชัน IPv6 [%s]", + "ORG_ZSTACK_GUESTTOOLS_10027": "ไม่สามารถแนบ ISO เครื่องมือแขกกับ VM [UUID:%s] เนื่องจากไม่ใช่ VM ของผู้ใช้", + "ORG_ZSTACK_CONTAINER_10045": "ไม่สามารถสร้างบริการเนื่องจาก %s", + "ORG_ZSTACK_FLOWMETER_10019": "Collector [%s %d] ซ้ำกับ %s", + "ORG_ZSTACK_GUESTTOOLS_10028": "ไม่สามารถแนบ ISO เครื่องมือแขกกับ VM [uuid:%s] เนื่องจากไม่มีอุปกรณ์ CDROM", + "ORG_ZSTACK_CONTAINER_10037": "ไม่พบคลัสเตอร์แบบคอนเทนเนอร์ใดๆ กรุณาตรวจสอบ NativeClusterVO สำหรับรายละเอียด", + "ORG_ZSTACK_GUESTTOOLS_10025": "ไม่สามารถแนบ guest tools ISO ไปยัง VM [uuid:%s] ได้เนื่องจากประเภท hypervisor ไม่รองรับ", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10057": "ไม่สามารถปิด baremetal chassis[uuid:%s] โดยใช้ ipmitool", + "ORG_ZSTACK_GUESTTOOLS_10026": "ไม่สามารถแนบ guest tools ISO ไปยัง VM [UUID:%s] ได้เนื่องจาก VM ไม่ได้ทำงานอยู่", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10058": "ไม่สามารถปิด baremetal instance[uuid:%s] ผ่าน bm agent, เหตุผล: %s", + "ORG_ZSTACK_GUESTTOOLS_10023": "ไม่สามารถอัปเดตการกำหนดค่าเครือข่ายของ vm[uuid:%s] ได้เนื่องจากเวอร์ชันของ guest tools ต่ำเกินไปสำหรับฟีเจอร์นี้", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10059": "baremetal2 chassis[uuid:%s] ยังไม่ถูกปิดเครื่องหลังจาก %d วินาที", + "ORG_ZSTACK_GUESTTOOLS_10024": "ไม่สามารถอัปเดตการกำหนดค่าเครือข่ายของ vm[uuid:%s] ได้เนื่องจาก guest tools ไม่ได้ทำงานอยู่", + "ORG_ZSTACK_GUESTTOOLS_10021": "ตรวจพบความขัดแย้งของชื่อโฮสต์ VM อื่นที่มี UUID [%s] ใช้ชื่อโฮสต์ [%s] อยู่แล้วบนเครือข่าย L3 ที่มี UUID [%s]", + "ORG_ZSTACK_GUESTTOOLS_10022": "ไม่สามารถอัปเดตการกำหนดค่าเครือข่ายของ vm[uuid:%s] ได้เนื่องจาก virtual machine ไม่ได้ทำงานอยู่", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10054": "ไม่สามารถสร้างการเชื่อมต่อกับ baremetal2 instance [uuid:%s] ผ่าน gateway [uuid:%s], เนื่องจาก %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10055": "ไม่สามารถเปลี่ยนรหัสผ่านของ baremetal instance[uuid:%s] ผ่าน gateway[uuid:%s], เนื่องจาก %s", + "ORG_ZSTACK_GUESTTOOLS_10020": "ไม่สามารถตั้งค่า VM hostname ได้ VM [UUID:%s] ไม่มี Layer 3 network เริ่มต้น", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10056": "ไม่สามารถเปิดเครื่อง baremetal chassis[uuid:%s] โดยใช้ ipmitool", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10021": "ไม่พบ build system [%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10020": "build system [UUID: %s] ได้ถูกแนบไปยัง zone [UUID: %s] แล้ว", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10050": "ไม่สามารถสร้าง console proxy สำหรับ baremetal instance[uuid:%s] ใน gateway[uuid:%s], เนื่องจาก %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10051": "ไม่สามารถสลับ default network จาก l3[uuid:%s] ไปยัง l3[uuid:%s] สำหรับ baremetal instance[uuid:%s], เนื่องจาก %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10018": "เพิ่ม BuildApp ล้มเหลวเนื่องจาก appId[%s:%s] ซ้ำกับ BuildApp instance อื่น", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10017": "ไม่สามารถเชื่อมต่อกับ local storage build system [url: %s], เนื่องจากปัญหาการเชื่อมต่อ", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10016": "สร้าง BuildApp ล้มเหลวเนื่องจาก appId[%s] ซ้ำกับ BuildApp อื่น", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10015": "build application ถูกปิดใช้งานเนื่องจาก build system อยู่ในสถานะ 'Stopped' กรุณาเริ่มต้น build system เพื่อเปิดใช้งาน application", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10014": "rest call %s ล้มเหลว, เนื่องจาก: %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10013": "build app อยู่ในสถานะ %s, ซึ่งไม่รองรับการดำเนินการปัจจุบัน", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10012": "ไม่พบ build application ด้วย UUID[%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10011": "ไม่สามารถดำเนินการได้เนื่องจาก build system อยู่ในสถานะ %s", + "ORG_ZSTACK_CONTAINER_10031": "ไม่พบ Deployment: %s", + "ORG_ZSTACK_FLOWMETER_10003": "เครือข่าย[%s] ได้ถูกรวมเข้ากับ flow meter[%s] แล้ว", + "ORG_ZSTACK_FLOWMETER_10004": "virtual router ได้ถูกเพิ่มไปยัง flow meter อื่นแล้ว กรุณาตรวจสอบว่าไม่มีการซ้ำซ้อน", + "ORG_ZSTACK_FLOWMETER_10005": "พารามิเตอร์ประเภทไม่ถูกต้องคือ %s และควรอยู่ในช่วงที่ถูกต้อง %s", + "ORG_ZSTACK_CONTAINER_10032": "แก้ไข deployment ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_CONTAINER_10034": "แทนที่ deployment ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_CONTAINER_10026": "ลบ service ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10046": "ทำลาย provisioning network ใน gateway[uuid:%s] ล้มเหลว เนื่องจาก %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10047": "ไม่พบ provisioned NIC สำหรับ baremetal instance[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10048": "สร้าง provisioning configurations สำหรับ baremetal instance[uuid:%s] ใน gateway[uuid:%s] ล้มเหลว เนื่องจาก %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10049": "ลบ provisioning configurations สำหรับ baremetal instance[uuid:%s] ใน gateway[uuid:%s] ล้มเหลว เนื่องจาก %s", + "ORG_ZSTACK_IMAGEREPLICATOR_10000": "backup storage เป้าหมาย[uuid:%s] ไม่พร้อมใช้งาน", + "ORG_ZSTACK_GUESTTOOLS_10032": "ไม่สามารถอัปเดตสถานะเครื่องมือสำหรับ guest สำหรับ vm [uuid:%s] เนื่องจาก vm ถูกลบไปแล้ว", + "ORG_ZSTACK_ALIYUN_OSS_10002": "ต้องตั้งค่า AWS access key ID, secret access key และ region พร้อมกันทั้งหมด", + "ORG_ZSTACK_CONTAINER_10029": "ข้อผิดพลาด API: ไม่พบไซล์ต้นทางในระบบ cloud storage โปรดตรวจสอบเส้นทางไซล์และลองอีกครั้ง", + "ORG_ZSTACK_IMAGEREPLICATOR_10001": "backup storage ตั้งแต่หนึ่งรายการขึ้นไป[uuids:%s] ถูกเพิ่มไปยัง replication group[uuid:%s] แล้ว", + "ORG_ZSTACK_ALIYUN_OSS_10003": "OSS bucket ไม่ว่าง! โปรดตรวจสอบให้แน่ใจว่า bucket ว่างก่อนดำเนินการต่อ", + "ORG_ZSTACK_GUESTTOOLS_10030": "ไม่สามารถดึงข้อมูลเครื่องมือสำหรับ guest จาก VM [UUID:%s] เนื่องจากไม่ใช่ user VM", + "ORG_ZSTACK_ALIYUN_OSS_10000": "ossBucket [%s] ลงทะเบียนใน dataCenter [%s] อยู่แล้ว", + "ORG_ZSTACK_GUESTTOOLS_10031": "พารามิเตอร์ debug ไม่ถูกต้อง: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10045": "เตรียม provisioning network ใน gateway[uuid:%s] ล้มเหลว เนื่องจาก %s", + "ORG_ZSTACK_ALIYUN_OSS_10001": "OssBucket[%s] ไม่ได้เชื่อมโยง", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10010": "export ID และ build application UUID ถูกตั้งค่าทั้งคู่แต่ไม่ตรงกัน โปรดตรวจสอบค่าของ %s และ %d", + "ORG_ZSTACK_IMAGEREPLICATOR_10002": "Backup storage[uuids:%s] ไม่ใช่ประเภท ImageStoreInstance", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10040": "การแปลงข้อมูล image เป็น local disk ล้มเหลว โปรดตรวจสอบให้แน่ใจว่ามีทรัพยากร storage เพียงพอและสิทธิ์ถูกต้อง หากปัญหายังคงอยู่ ให้พิจารณาใช้บริการ object storage สำหรับการจัดการ image", + "ORG_ZSTACK_IMAGEREPLICATOR_10003": "Backup storage [UUIDs:%s] ไม่ได้เชื่อมโยงกับ Zone ใดๆ", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10041": "baremetal2 instance [uuid:%s] การแปลง volume ล้มเหลวบน chassis [uuid:%s] หมดเวลาหลังจาก %d นาที", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10035": "ไม่สามารถดึง iSCSI target IQN หรือ gateway IP สำหรับ volume [uuid:%s] จาก primary storage [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10037": "chassis:%s disk ไม่มีข้อมูล WWN โปรดตรวจสอบ chassis และลองอีกครั้ง", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10031": "ถอด provisioned NIC ออกจาก bonding บน baremetal instance [uuid:%s] ผ่าน gateway [uuid:%s] ล้มเหลว เนื่องจาก %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10032": "baremetal2 instance[uuid:%s] ไม่ได้เชื่อมต่อ จึงไม่สามารถ attach provisioned NIC ไปยัง bond ได้", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10033": "attach provisioned NIC ไปยัง bonding บน baremetal instance [uuid:%s] ผ่าน gateway [uuid:%s] ล้มเหลว เนื่องจาก %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10030": "baremetal2 instance[uuid:%s] ไม่ได้เชื่อมต่อ จึงไม่สามารถถอด provisioning NIC ออกจาก bonding configuration ได้", + "ORG_ZSTACK_CONTAINER_10051": "ไม่พบ Kubernetes client สำหรับ account[uuid:%s]", + "ORG_ZSTACK_CONTAINER_10050": "การกำหนดค่า Kubernetes สำหรับคลัสเตอร์ %s เป็นค่าว่าง", + "ORG_ZSTACK_CONTAINER_10052": "ไม่สามารถใช้เนื้อหาไฟล์ kube config ได้: %s", + "ORG_ZSTACK_CORE_PROGRESS_10000": "พารามิเตอร์ apiId[%s] ไม่ใช่ UUID ที่ถูกต้องสำหรับการกำหนดค่าบริการคลาวด์", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10029": "ไม่สามารถลบการกำหนดค่าแปลง volume เป็น local disk ของ chassis ใน gateway[uuid:%s] สำหรับ baremetal instance[uuid:%s]", + "ORG_ZSTACK_CONTAINER_10056": "ไม่พบ Container Backup Storage ที่มี UUID: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10024": "provisioned_ip %s ไม่พร้อมใช้งานเนื่องจากไม่สามารถเชื่อมต่อกับ gateway %s; รายละเอียดข้อผิดพลาด:%s", + "ORG_ZSTACK_CONTAINER_10047": "ไม่สามารถดึงสถานะ service bundle สำหรับ service[%s] ได้", + "ORG_ZSTACK_CONTAINER_10049": "ไม่พบคลัสเตอร์ตาม cluster id ที่ระบุ: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10027": "ไม่สามารถตรวจสอบ BareMetal2 chassis โดย instance[uuid:%s] ผ่าน gateway[uuid:%s] เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_CBT_10020": "VM[UUID: %s] มีสถานะที่ไม่คาดคิด: %s, สถานะ VM ที่คาดหวังคือ Running", + "ORG_ZSTACK_STORAGE_CBT_10021": "VM [UUID: %s] ได้สร้างงาน backup แล้ว; ดังนั้นไม่อนุญาตให้เปิดใช้งาน CBT task พร้อมกัน", + "ORG_ZSTACK_STORAGE_CBT_10016": "ไม่ได้ระบุ hypervisor type สำหรับ VM %s", + "ORG_ZSTACK_STORAGE_CBT_10017": "ไม่พบ CBTBackupFactory ประเภท[%s] ใน cloud storage providers ที่กำหนดค่าไว้", + "ORG_ZSTACK_STORAGE_CBT_10014": "VM [uuid: %s] ได้รับการป้องกันโดย task: %s", + "ORG_ZSTACK_STORAGE_CBT_10015": "สร้าง cbt volumes ล้มเหลว รายละเอียด: %s", + "ORG_ZSTACK_STORAGE_CBT_10018": "ไม่พบ CVM task[uuid: %s]", + "ORG_ZSTACK_STORAGE_CBT_10019": "Cbt task [UUID: %s] ได้เปิดใช้งานแล้ว กรุณาปิดใช้งาน", + "ORG_ZSTACK_CONTAINER_10000": "container backup storage ไม่รองรับ format %s ที่ระบุ", + "ORG_ZSTACK_CONTAINER_10002": "ไม่พบ availability zone สำหรับ endpoint[%s]", + "ORG_ZSTACK_IAM2_RBAC_10006": "การดำเนินการ[%s] ถูกปฏิเสธในสภาพแวดล้อม cloud computing นี้", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10008": "ดึง virtual network[uuid:%s] จาก tf controller ล้มเหลว", + "ORG_ZSTACK_IAM2_RBAC_10001": "เนื่องจากโปรเจกต์ต้องการการใช้งาน security group แบบบังคับ ระบบ tag จึงจำเป็นสำหรับการดำเนินการ virtual machine", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10009": "อัปเดต tf l2 network[name:%s] บน tf controller ล้มเหลว", + "ORG_ZSTACK_IAM2_RBAC_10000": "สร้าง vm instance ล้มเหลวเนื่องจาก l3 network [uuid:%s] ไม่ได้แนบกับ compute clusters ใดๆ", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10006": "สร้าง tf L2 network[name:%s] บน tf controller ล้มเหลว", + "ORG_ZSTACK_IAM2_RBAC_10003": "project[uuid:%s] ถูกยกเลิกแล้วและการดำเนินการทั้งหมดถูกปฏิเสธ", + "ORG_ZSTACK_IAM2_RBAC_10002": "project ของ account[uuid:%s] ไม่มีอยู่", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10005": "ดึง project[uuid:%s] ล้มเหลวบน Terraform controller", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10002": "การดึง default domain ล้มเหลวบน TensorFlow controller.%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10003": "สร้าง TF project สำหรับ ZStack Admin บน TF Controller ล้มเหลว", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10000": "ตัวควบคุม SDN ที่มีชื่อที่ระบุมีอยู่แล้ว โปรดเลือกชื่ออื่นหรือใช้ชื่อที่มีอยู่", + "ORG_ZSTACK_STORAGE_CBT_10012": "ไม่พบทรัพยากรสำหรับงาน CBT[uuid: %s]", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10001": "ไม่สามารถดึงบัญชีผู้ดูแลระบบเริ่มต้นจากฐานข้อมูล ZStack", + "ORG_ZSTACK_STORAGE_CBT_10013": "ไม่พบโฮสต์สำหรับเครื่องเสมือน: %s", + "ORG_ZSTACK_STORAGE_CBT_10011": "โวลุม[uuid:%s]ถูกส่งออกแล้วสำหรับ vmInstance[uuid:%s]", + "ORG_ZSTACK_STORAGE_CBT_10006": "ไม่พบงาน Cloud Block Storage[uuid:%s]", + "ORG_ZSTACK_STORAGE_CBT_10009": "vm[uuid: %s] กำลังทำงานอยู่ โปรดหยุดก่อนแล้วลองอีกครั้ง", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10004": "ประเภทของพารามิเตอร์ '%s' ในนิพจน์ไม่ถูกต้อง ต้องเป็นประเภท %s แต่ได้รับ %s", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10003": "พารามิเตอร์ '%s' หายไปในนิพจน์การประมวลผลคลาวด์", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10000": "นิพจน์ไม่ถูกต้อง: %s, %s โปรดตรวจสอบว่านิพจน์ถูกต้องสำหรับสภาพแวดล้อมการประมวลผลคลาวด์", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10001": "นิพจน์ไม่ถูกต้อง: %s, ไม่พบนิพจน์การประมวลผลคลาวด์ที่ถูกต้อง", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10019": "เพิ่ม tf l3 subnet[name:%s] บน tf controller ล้มเหลวเนื่องจาก: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10082": "baremetal2 gateway ที่มี UUID: %s ไม่ได้เชื่อมต่อ ดังนั้นไม่สามารถสร้าง URL คอนโซลสำหรับอินสแตนซ์ที่มี UUID: %s ได้", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10016": "อัปเดต tf l3 network[name:%s] บน tf controller ล้มเหลวเนื่องจาก: %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10013": "ลบ tf L3 network[name:%s] บน tf controller ล้มเหลวเนื่องจาก: %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10011": "ลบ l2 network[uuid:%s] บน tf controller ล้มเหลว", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10080": "ไม่สามารถเตรียม provisioning network[uuid:%s] ใน gateway[uuid:%s]: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10081": "baremetal2 instance [uuid:%s] ไม่มีอยู่ ดังนั้นไม่สามารถสร้าง URL คอนโซลสำหรับอินสแตนซ์นี้ได้", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10007": "buildAppUuid และ exportId ไม่สามารถเป็น null พร้อมกันได้ โปรดตรวจสอบว่ามี buildAppUuid หรือ exportId อย่างน้อยหนึ่งรายการ", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10006": "ทั้ง backup storage UUID และ hostname ถูกตั้งค่า แต่อ้างอิงถึงโฮสต์ที่แตกต่างกัน", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10005": "พบ backup storage มากกว่าหนึ่งรายการที่มี hostname: %s โปรดใช้ backupStorageUuid แทน", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10004": "ไม่พบ image store ที่มี hostname: %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10003": "ทั้ง backup storage UUID และ hostname เป็น null โปรดตรวจสอบการตั้งค่าการกำหนดค่าสำหรับ backup storage และ hostname", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10002": "dataPath ต้องเริ่มต้นด้วย '/' แต่ได้รับ [%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10001": "ระบบบิลด์อื่น[UUID: %s, name: %s] ในโฮสต์นี้[%s] กำลังใช้ URL เดียวกัน[%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10000": "build-app[%s] อยู่ในสถานะกำลังส่งออกหรือส่งออกอยู่ โปรดยกเลิกหรือลบออกก่อน", + "ORG_ZSTACK_CAS_10000": "คุณสมบัติสำหรับการกำหนดค่า CAS driver หายไป", + "ORG_ZSTACK_CAS_10002": "รหัสเครื่องเสมือนไม่ถูกต้อง[name:%s] ไม่มีอยู่หรือรหัสผ่านไม่ถูกต้อง", + "ORG_ZSTACK_CONTAINER_10020": "ลบ network policy ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_CAS_10001": "CAS driver ที่ไม่รองรับ: %s", + "ORG_ZSTACK_CONTAINER_10022": "รหัสคลัสเตอร์เป็นค่าว่างเมื่อสร้างนโยบายเครือข่าย", + "ORG_ZSTACK_CAS_10003": "ไม่มีประเภทข้อมูลดังกล่าว[%s] ที่กำหนดไว้ใน CAS", + "ORG_ZSTACK_CONTAINER_10024": "ไม่สามารถสร้างนโยบายเครือข่ายได้เนื่องจาก %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10009": "ไม่พบงานส่งออกที่มีรหัส %s ในประวัติการส่งออก โปรดตรวจสอบรหัสงานส่งออกและลองอีกครั้ง", + "ORG_ZSTACK_CONTAINER_10023": "ไม่สามารถดึง ApiClient ด้วยรหัสคลัสเตอร์: %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10008": "buildAppUuid และ buildSystemUuid ไม่สามารถเป็นค่าว่างพร้อมกันได้ โปรดตรวจสอบว่ามีการระบุ buildAppUuid หรือ buildSystemUuid อย่างน้อยหนึ่งรายการ", + "ORG_ZSTACK_CONTAINER_10015": "ไม่สามารถลบการติดตั้งได้เนื่องจาก %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10079": "คลัสเตอร์[uuid:%s] ประเภทไฮเปอร์ไวเซอร์ไม่ถูกต้อง", + "ORG_ZSTACK_CONTAINER_10017": "ไม่พบ pod[ชื่อ=%s, เนมสเปซ=%s]", + "ORG_ZSTACK_CONTAINER_10016": "ไม่สามารถยุติการติดตั้งได้เนื่องจากข้อผิดพลาดที่ไม่ระบุ %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10075": "ไม่สามารถดึงที่อยู่ IP เกตเวย์ของเส้นทางการเข้าถึง [iscsiPath: %s] สำหรับ volume บล็อก %s เนื่องจาก %s", + "ORG_ZSTACK_CONTAINER_10018": "ไม่สามารถเพิ่มป้ายกำกับให้ pod ได้เนื่องจาก %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10076": "ไม่สามารถถอด volume[uuid:%s] จากอินสแตนซ์ baremetal[uuid:%s] ผ่านเกตเวย์[uuid:%s] เนื่องจาก %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10028": "เพิ่มการกำหนดค่า DNS ให้เครือข่าย layer 3 [ชื่อ:%s] บน TensorFlow controller ล้มเหลวเนื่องจาก:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10077": "ไม่สามารถทำลาย volume[uuid:%s] สำหรับอินสแตนซ์ baremetal[uuid:%s] ในเกตเวย์[uuid:%s] เนื่องจาก %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10078": "Ceph MON ทั้งหมดของ primary storage [uuid:%s] ไม่อยู่ในสถานะ Healthy", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10072": "อินสแตนซ์ baremetal2[uuid:%s] ไม่ได้เชื่อมต่อ ดังนั้น volume ไม่สามารถแนบได้", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10073": "ไม่สามารถดึง volume LUN ID บน external primary storage %s โปรดตรวจสอบว่าระบบจัดเก็บข้อมูลได้รับการกำหนดค่าอย่างถูกต้องและสามารถเข้าถึงได้", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10025": "ลบเส้นทางโฮสต์จากเครือข่ายเสมือน[ชื่อ:%s] บน traffic manager controller ล้มเหลวเนื่องจาก:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10074": "ไม่สามารถดึง volume [uuid:%s] LUN ID สำหรับอินสแตนซ์ bare metal [uuid:%s] ในเกตเวย์ [uuid:%s] เนื่องจาก %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10022": "เพิ่มเราเตอร์โฮสต์ให้เครือข่าย layer-3[ชื่อ:%s] บน tf controller ล้มเหลวเนื่องจาก:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10070": "ไม่สามารถแนบ volume ที่มี UUID: %s ให้กับอินสแตนซ์ baremetal ที่มี UUID: %s ผ่านเกตเวย์ที่มี UUID: %s เนื่องจาก %s", + "ORG_ZSTACK_FLOWMETER_10021": "%s ต้องเป็นค่าตัวเลข", + "ORG_ZSTACK_LOG4J2_10001": "ไม่รู้จักประเภท log4j2 appender %s", + "ORG_ZSTACK_LOG4J2_10000": "ไม่พบ factory สำหรับประเภท Log4j2 appender:%s", + "ORG_ZSTACK_CONTAINER_10011": "ไม่พบโฮสต์สำหรับ uuid[%s]", + "ORG_ZSTACK_CONTAINER_10013": "ไม่พบ Container Management Endpoint [uuid:%s]", + "ORG_ZSTACK_CONTAINER_10012": "ไม่พบ provider สำหรับ vendor[%s]", + "ORG_ZSTACK_CONTAINER_10004": "โฮสต์[%s] ไม่ได้เชื่อมโยงกับ endpoint[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10068": "ไม่สามารถจัดหา volume[uuid:%s] สำหรับอินสแตนซ์ baremetal[uuid:%s] ผ่านเกตเวย์[uuid:%s] เนื่องจาก %s", + "ORG_ZSTACK_CONTAINER_10005": "ไม่พบคลัสเตอร์สำหรับ endpoint[%s]", + "ORG_ZSTACK_CONTAINER_10008": "ไม่สามารถแสดงรายการ instances สำหรับคลัสเตอร์[%s]: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10064": "ไม่สามารถแนบ NIC ด้วย UUID:%s ให้กับ Baremetal2 instance ด้วย UUID:%s ผ่าน Gateway ด้วย UUID:%s เนื่องจาก %s", + "ORG_ZSTACK_CONTAINER_10007": "Zone[%s] ไม่ตรงกับ Endpoint[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10065": "baremetal2 instance[uuid:%s] ไม่ได้เชื่อมต่อ; ดังนั้นจึงไม่สามารถถอดออกจาก network interface ได้", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10066": "ไม่สามารถถอด network interface [uuid:%s] ออกจาก bare metal instance [uuid:%s] ผ่าน gateway [uuid:%s] เนื่องจาก %s", + "ORG_ZSTACK_CONTAINER_10009": "คลัสเตอร์[%s] มีอยู่แล้วใน endpoint[%s] พร้อม availability zone[%s] ที่แตกต่าง", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10060": "ตรวจสอบให้แน่ใจว่า BareMetal2 gateways ทั้งหมดบน provisioning network [uuid:%s] เชื่อมต่ออยู่", + "ORG_ZSTACK_CONFIGURATION_10011": "กลยุทธ์การจัดสรร primary storage [%s] ไม่ได้รับการสนับสนุน", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10061": "รายการ VM instance UUIDs ว่างเปล่า กรุณาระบุ UUID ที่ถูกต้องอย่างน้อย 1 รายการ", + "ORG_ZSTACK_CONFIGURATION_10010": "กลยุทธ์การจัดสรร host [%s] ไม่ได้รับการสนับสนุน", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10062": "baremetal2 gateway [UUID: %s, status: %s] ไม่ได้เชื่อมต่อ", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10063": "baremetal2 instance[uuid:%s] ไม่ได้เชื่อมต่อ; ดังนั้นจึงไม่สามารถแนบ NIC ได้", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10031": "ล้มเหลวในการลบ dns configuration จาก layer 3 network [name:%s] บน tf controller เนื่องจาก:%s", + "ORG_ZSTACK_STORAGE_BACKUP_10119": "ต้องระบุทั้ง installPath และ bootstrap URL", + "ORG_ZSTACK_STORAGE_BACKUP_10118": "ไม่อนุญาตให้ครอบคลุม database จาก backup ใน cloud environment", + "ORG_ZSTACK_STORAGE_BACKUP_10117": "database backup[uuid:%s] ได้ถูก export ไปยัง backup storage[uuid:%s] แล้ว", + "ORG_ZSTACK_STORAGE_BACKUP_10116": "database backup [UUID %s] ยังไม่ได้ถูก export จาก backup storage [UUID: %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10115": "สถานะปัจจุบันของ backup storage[%s] ไม่อนุญาตให้ดำเนินการ[%s], สถานะที่ถูกต้องคือ %s", + "ORG_ZSTACK_STORAGE_BACKUP_10114": "ไม่สามารถสร้างการเชื่อมต่อ SSH ไปยัง peer node โดยใช้ SSH key กรุณาตรวจสอบการเชื่อมต่อ network และการตั้งค่า SSH key", + "ORG_ZSTACK_STORAGE_BACKUP_10113": "bandWidth ต้องเป็นค่าบวก", + "ORG_ZSTACK_STORAGE_BACKUP_10112": "พารามิเตอร์งานขาด remote retention value: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10039": "VM[uuid:%s] ไม่ได้หยุดทำงานและไม่ได้ทำงานบน host ที่ระบุ", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10007": "built-in security admin role ไม่สามารถถูกลบโดย built-in security admin role", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10038": "volume[uuid:%s] ได้ถูกแนบกับ VM(s)[uuid:%s] หนึ่งตัวหรือมากกว่าที่ไม่ได้อยู่ในสถานะหยุดทำงานและไม่ได้ทำงานบน host ที่ระบุ", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10008": "ไม่สามารถเพิกถอน system administrator role จาก system administrator user group", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10009": "ไม่สามารถลบ built-in audit administrator กรุณาตรวจสอบให้แน่ใจว่าคุณไม่ได้พยายามแก้ไข system-provided role", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10003": "ชื่อของ initial user สำหรับ resource นี้ไม่สามารถอัปเดตได้", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10034": "ไม่สามารถหา replication ของ volume %s บน host %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10004": "%s เป็น reserved keyword ใน cloud computing virtualization environments, กรุณาเลือกชื่ออื่น", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10037": "UUID ของ primary storage ไม่สามารถเป็น null ได้ โปรดตรวจสอบว่าได้ระบุ UUID ที่ถูกต้องสำหรับ primary storage", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10036": "UUID ของ resource %s ไม่ถูกต้อง", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10006": "ไม่สามารถเพิกถอน role ของ audit admin จากผู้ใช้ที่เป็น built-in administrator", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10042": "mini storage [UUID: %s] ต้องว่างเปล่าก่อนการกู้คืน bits จาก ZBox โปรดทำความสะอาด", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10001": "ไม่พบ factory สำหรับ FluentBit output type: %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10010": "ไม่สามารถลบ built-in security administrator ได้ โปรดตรวจสอบว่าคุณไม่ได้พยายามแก้ไข role ที่ระบบจัดเตรียมไว้", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10041": "ไม่มี LocalStorageBackupStorageMediator ที่รองรับ hypervisor[%s] และ backup storage type[%s]", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10011": "ไม่สามารถเพิกถอน privileges จาก built-in system administrator", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10003": "host name หรือ ID ไม่สามารถเป็น null ได้ โปรดระบุ host name หรือ ID ที่ถูกต้อง", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10012": "ยืนยันว่า roles ที่คุณต้องการเพิ่มมี identity เดียวกันและเข้ากันได้ในสภาพแวดล้อม virtualization ของคุณ", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10002": "ไม่รู้จัก FluentBit output plugin type %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10013": "ไม่สามารถเพิ่ม role: %s ให้กับ identity: %s สำหรับ virtual ID[uuid:%s]", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10005": "หมายเลข port ไม่สามารถเป็น null ได้", + "ORG_ZSTACK_APPCENTER_UTILS_10000": "ไม่พบ raw template JSON file ที่: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10004": "log storage server [address: %s] ไม่พร้อมใช้งาน", + "ORG_ZSTACK_APPCENTER_UTILS_10001": "ไม่สามารถสร้าง JSON template สำหรับ cloud resource configuration", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10040": "Fail to %s เพราะ host(s)[uuid:%s] ไม่ได้ enabled และไม่อยู่ในสถานะ connected", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10007": "configuration ใหม่มี errors ทำให้เกิด service exceptions โปรดตรวจสอบ parameters ของ configuration อีกครั้ง รายละเอียด: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10006": "การสร้าง log server ล้มเหลว parameters ที่ส่งใหม่ไม่ถูกต้องอาจทำให้ Fluent Bit service เข้าสู่สถานะ inactive โปรดตรวจสอบความถูกต้องของ configuration อีกครั้ง", + "ORG_ZSTACK_STORAGE_BACKUP_10111": "ขาด remote retention type ใน job parameters", + "ORG_ZSTACK_STORAGE_BACKUP_10110": "ขาด 'retentionValue' ใน configuration ของ job parameters", + "ORG_ZSTACK_STORAGE_BACKUP_10129": "ไม่พบ instance ที่มี root volume UUID: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10124": "ไม่พบ VM สำหรับ volume[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10123": "operation ไม่รองรับบน shared volume attachment", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10028": "ไม่มี backup storage ที่สามารถ retrieve image[uuid:%s] สำหรับ volume[uuid:%s]", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10005": "ไม่พบ JoinType ใน imported package หรือ class โปรดตรวจสอบว่าคุณได้ import package ที่ถูกต้องและ class มี JoinType ที่กำหนดไว้", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10029": "image[uuid: %s] ไม่มี reference ไปยัง backup storage[uuid: %s]", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10000": "output จาก [CloudFunction] ว่างเปล่า", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10001": "call action[%s] ล้มเหลว, cause: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10023": "คาดหวัง operation บน hosts[%s] แต่มีเพียง hosts %s ที่พร้อมใช้งานและ enabled", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10002": "การดำเนินการ: %s ไม่รองรับสำหรับ IAM role: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10120": "databaseBackup[uuid:%s] ไม่ได้เปิดใช้งานและพร้อมใช้งาน", + "ORG_ZSTACK_STORAGE_SNAPSHOT_REFERENCE_10000": "วอลุมที่มี UUID %s ถูกอ้างอิงโดยวอลุมอื่น [%s] กรุณา flatten วอลุมเหล่านี้และลูกหลานก่อนเปลี่ยนเส้นทางการติดตั้ง", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10017": "cluster ที่ต้องการ %s ไม่ได้ติดตั้งกับ primary storage %s สำหรับการสร้างวอลุม %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10016": "สถานะเครือข่าย replication ของวอลุม [uuid:%s] เข้าสู่โหมด StandAlone ในขณะที่ hosts ทั้งหมดอยู่ในสถานะ Connected กรุณากู้คืนก่อน", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10018": "ไม่พบ host ที่พร้อมใช้งานใน cluster ที่ต้องการ %s สำหรับการสร้างวอลุม", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10013": "host[uuid: %s] ของ mini primary storage[uuid: %s] ไม่มีความจุเพียงพอ [ปัจจุบัน: %s ไบต์, ต้องการ: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10017": "baremetal2 gateway ที่มี UUID: %s ไม่ได้อยู่ในโซนเดียวกันกับ cluster ที่มี UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10012": "ไม่สามารถจัดสรรพื้นที่เพียงพอสำหรับ primary storage [UUID: %s] บน host [UUID: %s], ความจุทางกายภาพไม่เพียงพอ", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10018": "ไม่สามารถแก้ไข cluster ของ Baremetal2 gateway [uuid:%s] เมื่อมี instances ที่ใช้งานอยู่อาศัย gateway นี้", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10015": "volume[uuid:%s] กำลัง synchronize ข้อมูล replication กรุณารอจนกว่าการ synchronize จะเสร็จสิ้น", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10019": "cluster[%s] ไม่ใช่ baremetal type", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10014": "ไม่พบ host ที่พร้อมใช้งานสำหรับ resize volume[uuid: %s] บนระบบ mini storage[uuid: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10013": "cluster[uuid:%s] ไม่พร้อมใช้งาน", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10014": "cluster[uuid:%s] ไม่ใช่ bare metal virtualization cluster", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10022": "ไม่สามารถจัดสรร port การ synchronization สำหรับ storage บน host %s: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10015": "gateway[uuid:%s] ไม่พร้อมใช้งาน", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10021": "ไม่พบ host ที่พร้อมใช้งานสำหรับดำเนินการคำสั่งสำหรับ primary storage[uuid: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10016": "baremetal2 gateway ที่มี UUID: %s เป็นส่วนหนึ่งของ cluster ที่มี UUID: %s อยู่แล้ว", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10010": "baremetal2 gateway[uuid:%s] สามารถติดตั้งกับ compute cluster ได้เพียงหนึ่งเดียวเท่านั้น", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10011": "baremetal2 gateway [UUID: %s] ไม่ได้ติดตั้งกับ cluster [UUID: %s], การถอดการติดตั้งไม่จำเป็น", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10012": "baremetal2 gateway ที่มี UUID:%s ติดตั้งกับ cluster เดียวเท่านั้นในปัจจุบัน; อย่าถอดการติดตั้ง", + "ORG_ZSTACK_STORAGE_BACKUP_10108": "ขาด 'retentionPolicyType' และ 'retentionPeriod' ในพารามิเตอร์งาน", + "ORG_ZSTACK_STORAGE_BACKUP_10107": "backup storage UUID ที่ไม่คาดคิด: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10106": "พารามิเตอร์งาน 'backupStorageUuids' ว่างเปล่า กรุณาตรวจสอบให้แน่ใจว่ามี backup storage UUIDs ที่ถูกต้องสำหรับการดำเนินการ", + "ORG_ZSTACK_STORAGE_BACKUP_10105": "ขาด 'backupStorageUuids' ในพารามิเตอร์งาน กรุณาตรวจสอบให้แน่ใจว่ามี backup storage UUIDs ที่ต้องการทั้งหมดระบุ", + "ORG_ZSTACK_STORAGE_BACKUP_10104": "ขาดพารามิเตอร์งานที่ต้องการ: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10103": "สถานะงานที่ไม่คาดคิด: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10102": "Sync task ล้มเหลวเนื่องจากไฟล์ต้นฉบับหายไป กรุณาตรวจสอบให้แน่ใจว่ามีไฟล์ที่ต้องการทั้งหมดอัปโหลดแล้วและลองใหม่", + "ORG_ZSTACK_STORAGE_BACKUP_10101": "database backup[uuid:%s] ไม่พบใน storage repository[uuid:%s]", + "ORG_ZSTACK_LOGIN_PLUGIN_10002": "ข้อมูลผู้ใช้ล็อกอินหายไปเมื่อใช้ฟังก์ชันล็อกอินปลั๊กอิน", + "ORG_ZSTACK_LOGIN_PLUGIN_10001": "ไม่พบปลั๊กอินล็อกอินชื่อ %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10005": "มินิสโตเรจ [UUID: %s, name: %s] ไม่สามารถค้นหาโฮสต์ที่พร้อมใช้งานภายในคลัสเตอร์ที่แนบมาเพื่อสร้างวอลุม", + "ORG_ZSTACK_LOGIN_PLUGIN_10000": "ชื่อปลั๊กอินล็อกอินหายไป โปรดระบุชื่อปลั๊กอินที่ถูกต้องสำหรับการยืนยันตัวตนการล็อกอิน", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10007": "ไม่สามารถระบุว่าจะกำหนดคำขอให้กับอินสแตนซ์คำนวณใด โปรดตรวจสอบว่าอินสแตนซ์ของคุณลงทะเบียนและติดแท็กอย่างถูกต้องในสภาพแวดล้อมคลาวด์ หากปัญหายังคงอยู่ โปรดติดต่อฝ่ายสนับสนุนเพื่อขอความช่วยเหลือเพิ่มเติม", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10002": "โฮสต์[uuid:%s] ไม่ได้เชื่อมต่อกับสภาพแวดล้อมคลาวด์", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10014": "ไม่สามารถเพิ่มสิทธิ์ผู้ดูแลระบบให้กับโปรเจกต์ได้", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10006": "โหนด baremetal2 ที่มี IP การจัดการ %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10001": "ยังมีวอลุมแคชที่ถูกแคชอยู่ในอินสแตนซ์ [UUID:%s] ไม่สามารถอัปเดต URL ของวอลุมแคชได้", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10015": "การดำเนินการไม่ได้รับอนุญาตจากรายการอนุญาต ID เครื่องเสมือน [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10007": "โฮสต์ที่มี IP การจัดการ %s ประสบปัญหา", + "ORG_ZSTACK_KVM_10110": "โฮสต์ [IP:%s] ถูกรับช่วงเนื่องจากมีตัวระบุเฉพาะ [HostUuid:%s] อยู่ในฐานข้อมูล", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10004": "ResourceType [%s] ของ APIRecoverResourceSplitBrainMsg ไม่ถูกต้องสำหรับการกู้คืนทรัพยากรคลาวด์", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10016": "การดำเนินการถูกปฏิเสธโดยรายการปฏิเสธ ID เครื่องเสมือน [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10008": "ไม่สามารถแนบเกตเวย์ BareMetal2 [uuid:%s] กับคลัสเตอร์ที่ไม่ใช่ BareMetal2 [uuid:%s]", + "ORG_ZSTACK_KVM_10111": "ไม่สามารถระบุสถาปัตยกรรม CPU ของโฮสต์ได้ โปรดตรวจสอบชื่อผู้ใช้และรหัสผ่าน %s", + "ORG_ZSTACK_STORAGE_BACKUP_10109": "ขาด 'retentionType' ในการกำหนดค่าพารามิเตอร์งาน", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10009": "เกตเวย์ baremetal2 ที่มี UUID: %s แนบอยู่กับคลัสเตอร์ที่มี UUID: %s อยู่แล้ว", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10002": "มีเซิร์ฟเวอร์ PXE baremetal ที่มี IP การจัดการ %s อยู่แล้ว โปรดอย่าใช้เพื่อสร้างเกตเวย์ Baremetal2", + "ORG_ZSTACK_KVM_10103": "ไม่สามารถเชื่อมต่อกับ KVM[ip:%s, username:%s, sshPort: %d] เพื่อดำเนินการตรวจสอบ DNS ได้ โปรดตรวจสอบความถูกต้องของชื่อผู้ใช้และรหัสผ่าน", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10004": "IP การจัดการ[%s] ไม่ใช่ที่อยู่ IPv4 หรือชื่อโฮสต์ที่ถูกต้อง", + "ORG_ZSTACK_KVM_10104": "ล้มเหลวในการ ping ที่อยู่ DNS/IP ทั้งหมดใน %s โปรดตรวจสอบการเชื่อมต่อเครือข่ายและการตั้งค่า DNS ใน /etc/resolv.conf เพื่อให้แน่ใจว่าอินสแตนซ์ของคุณสามารถเข้าถึงอินเทอร์เน็ตสาธารณะได้", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10010": "ไม่พบเครื่องเสมือนที่เชื่อมต่อ การดำเนินการมินิสโตเรจล้มเหลว", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10005": "ไม่สามารถเพิ่มเกตเวย์ BareMetal2 ในคลัสเตอร์ที่ไม่ใช่ BareMetal2[uuid:%s]", + "ORG_ZSTACK_KVM_10105": "ไม่สามารถเชื่อมต่อกับ KVM[ip:%s, username:%s, SSH port:%d] เพื่อตรวจสอบการเข้าถึงของโหนดการจัดการได้ โปรดตรวจสอบว่าข้อมูลประจำตัวถูกต้องหรือไม่ %s", + "ORG_ZSTACK_VPC_HA_VPCHAGC_10000": "อินสแตนซ์ VR[uuid: %s] ไม่ได้ทำงานอยู่", + "ORG_ZSTACK_KVM_10106": "โฮสต์ KVM [ip:%s] ไม่สามารถเข้าถึง URL เรียกกลับของโหนดการจัดการได้ ดูเหมือนว่าโฮสต์ KVM ไม่สามารถเข้าถึง IP การจัดการ [%s] ได้ %s %s", + "ORG_ZSTACK_VPC_HA_VPCHAGC_10001": "อินสแตนซ์ VR[uuid: %s] ไม่ได้เชื่อมต่อ", + "ORG_ZSTACK_KVM_10107": "ไม่สามารถตรวจสอบได้ว่าโฮสต์ถูก接管 เพราะ %s", + "ORG_ZSTACK_KVM_10108": "ไม่สามารถดึงข้อมูล timestamp ของ flag ได้เพราะ %s", + "ORG_ZSTACK_KVM_10109": "โฮสต์ [IP:%s] ถูกยึดครองแล้ว เนื่องจากแฟล็กการยึดครอง [HostUuid:%s] มีอยู่แล้ว และเวลาอัปเดต [utime %d] ยังไม่เกินช่วงเวลา ping ของโฮสต์ [ping interval %d]", + "ORG_ZSTACK_STORAGE_BACKUP_10100": "หนึ่งในที่จัดเก็บข้อมูลสำรอง [UUIDs: %s, %s] อยู่ในสถานะ %s ดังนั้นจึงไม่สามารถดำเนินการซิงโครไนซ์ได้", + "ORG_ZSTACK_AUTOSCALING_GROUP_10009": "ข้อเสนออินสแตนซ์ [UUID:%s] ถูกปิดใช้งาน ไม่สามารถสร้าง VM จากมันได้", + "ORG_ZSTACK_AUTOSCALING_GROUP_10008": "ไม่พบทรัพยากร: InstanceOfferingVO ที่มี UUID [%s] ไม่พร้อมใช้งาน", + "ORG_ZSTACK_AUTOSCALING_GROUP_10007": "ไม่พบทรัพยากร: AutoScalingVmTemplateVO ที่มี UUID [%s] ไม่พร้อมใช้งาน", + "ORG_ZSTACK_AUTOSCALING_GROUP_10006": "autoScalingGroup[%s] ไม่สามารถเพิ่ม VM ที่สร้างใหม่เข้าสู่กลุ่มความปลอดภัยได้สมบูรณ์ ข้อผิดพลาดคือ %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10005": "การเพิ่ม VM NIC เข้าสู่กลุ่มความปลอดภัยล้มเหลว ไม่พบกลุ่มความปลอดภัยที่มี UUID=%s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10004": "autoScalingGroup[%s] ไม่สามารถเพิ่ม VM ที่สร้างใหม่เข้าสู่ loadBalancer ได้สมบูรณ์ ข้อผิดพลาดคือ %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10003": "การเพิ่ม VM NIC เข้าสู่ load balancer ล้มเหลว ไม่พบ load balancer ที่มี UUIDs=%s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10002": "autoScalingGroup[%s] การสร้าง VM ล้มเหลวอย่างสมบูรณ์ ข้อผิดพลาดคือ %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10000": "สามารถดำเนินการ scaling activity ได้เพียงครั้งเดียวต่อกลุ่ม scaling เดียวกันในเวลาเดียวกัน", + "ORG_ZSTACK_KVM_10120": "การกำหนดค่าของ host[uuid:%s] เปลี่ยนแปลงแล้ว, เก่า: %s, ใหม่: %s", + "ORG_ZSTACK_KVM_10121": "host[uuid:%s] เข้าสู่สถานะ powered-off, ส่งการแจ้งเตือน", + "ORG_ZSTACK_KVM_10112": "สถาปัตยกรรม CPU ของโฮสต์ไม่ตรงกับการกำหนดค่าคลัสเตอร์", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10000": "สตริงพาธ %s ไม่ถูกต้องในการกำหนดค่าพื้นที่จัดเก็บข้อมูลบนคลาวด์", + "ORG_ZSTACK_KVM_10115": "host [uuid:%s] ไม่สามารถเพิ่มเข้าสู่คลัสเตอร์ [uuid:%s] ได้เนื่องจากเวอร์ชัน QEMU/Libvirt ไม่ตรงกัน", + "ORG_ZSTACK_KVM_10117": "host [uuid:%s] ไม่สามารถเพิ่มเข้าสู่คลัสเตอร์ [uuid:%s] ได้เนื่องจากสถาปัตยกรรม CPU ไม่ตรงกัน", + "ORG_ZSTACK_KVM_10119": "ไม่สามารถตรวจพบ VTx หรือ VTd ใน /proc/cpuinfo โปรดตรวจสอบให้แน่ใจว่าการ virtualize ฮาร์ดแวร์ได้เปิดใช้งานในการตั้งค่า BIOS ของคุณแล้ว", + "ORG_ZSTACK_AUTOSCALING_GROUP_10019": "ไม่พบทรัพยากร: L3 Network (UUID: %s) ไม่พบ", + "ORG_ZSTACK_AUTOSCALING_GROUP_10018": "ข้อเสนอ disk ที่มี UUIDs:%s ถูกปิดใช้งาน ดังนั้นจึงไม่สามารถสร้าง VM จากข้อเสนอเหล่านี้ได้", + "ORG_ZSTACK_AUTOSCALING_GROUP_10017": "ไม่พบทรัพยากร: Disk Offering ที่มี UUID [%s] ไม่พบ", + "ORG_ZSTACK_AUTOSCALING_GROUP_10016": "system-image[uuid:%s] ไม่สามารถใช้สร้าง user VM ได้", + "ORG_ZSTACK_AUTOSCALING_GROUP_10015": "rootDiskOfferingUuid ไม่สามารถเป็น null ได้เมื่อประเภทสื่อของ image เป็น ISO", + "ORG_ZSTACK_AUTOSCALING_GROUP_10014": "image[uuid:%s] เป็นประเภทสื่อ: %s, สามารถใช้ได้เฉพาะ RootVolumeTemplate และ ISO เท่านั้นเพื่อสร้าง VM", + "ORG_ZSTACK_AUTOSCALING_GROUP_10013": "image[uuid:%s] ไม่พร้อมใช้งานในขณะนี้ โปรดตรวจสอบให้แน่ใจว่าพร้อมแล้วก่อนสร้าง VM จากมัน", + "ORG_ZSTACK_AUTOSCALING_GROUP_10012": "image[uuid:%s] ถูกปิดใช้งาน ไม่อนุญาตให้สร้าง VM จาก image นี้", + "ORG_ZSTACK_AUTOSCALING_GROUP_10011": "ไม่พบทรัพยากร: image ที่มี UUID [%s] ไม่พบ", + "ORG_ZSTACK_AUTOSCALING_GROUP_10010": "ข้อเสนออินสแตนซ์ [UUID: %s, ประเภท: %s] ไม่ใช่ประเภท User VM ดังนั้นจึงไม่สามารถสร้าง VM จากมันได้", + "ORG_ZSTACK_KVM_10130": "การแนบ volume เข้ากับ instance ล้มเหลว เพราะ:%s", + "ORG_ZSTACK_KVM_10131": "การถอด volume ออกจาก instance ล้มเหลว เพราะ:%s", + "ORG_ZSTACK_KVM_10132": "vm[%s] ไม่สามารถดำเนินการปลดปล่อยพื้นที่ดิสก์ได้ เนื่องจาก:%s", + "ORG_ZSTACK_KVM_10123": "host[%s] ไม่ได้ถูกปิดเครื่องภายใน %d วินาที", + "ORG_ZSTACK_KVM_10125": "ไม่สามารถตรวจสอบไฟล์ %s บน host[UUID:%s]", + "ORG_ZSTACK_KVM_10126": "โฮสต์อยู่ในสถานะก่อนการบำรุงรักษาและไม่สามารถอัปเดตระบบปฏิบัติการได้ในขณะนี้ กรุณาดำเนินการบำรุงรักษาให้เสร็จสิ้นหรือติดต่อฝ่ายสนับสนุนเพื่อขอความช่วยเหลือ", + "ORG_ZSTACK_KVM_10127": "โฮสต์ไม่ได้อยู่ในสถานะเชื่อมต่อ ดังนั้นจึงไม่สามารถดำเนินการอัปเดตระบบปฏิบัติการได้ โปรดตรวจสอบให้แน่ใจว่าโฮสต์เชื่อมต่ออยู่ก่อนทำการอัปเดตระบบปฏิบัติการ", + "ORG_ZSTACK_COMPUTE_BONDING_10022": "ต้องการ UUID หรือชื่อของ slave อย่างใดอย่างหนึ่ง", + "ORG_ZSTACK_COMPUTE_BONDING_10021": "ไม่มีอินเทอร์เฟซบนโฮสต์ที่มี UUID: %s", + "ORG_ZSTACK_VMWARE_10069": "ไม่พบ instance id [%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10020": "อินเทอร์เฟซ %s ไม่มีอยู่บนโฮสต์", + "ORG_ZSTACK_VMWARE_10067": "vm [%s] ไม่พบ", + "ORG_ZSTACK_COMPUTE_BONDING_10026": "ไม่สามารถลบ bonding interface ที่เชื่อมโยงกับเครือข่ายการจัดการได้ โปรดตรวจสอบให้แน่ใจว่าเครือข่ายการจัดการไม่ได้ใช้งานอยู่ก่อนดำเนินการ", + "ORG_ZSTACK_VMWARE_10064": "ไม่พบ VM Instance: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10029": "ต้องข้ามการปรับ auto-scaling group activity", + "ORG_ZSTACK_COMPUTE_BONDING_10025": "bonding mode[%s] ไม่ถูกต้อง", + "ORG_ZSTACK_VMWARE_10065": "ไม่สามารถปิดเครื่อง virtual machine ได้: %s, %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10028": "ไม่สามารถดึงรายการ instance ที่ถูกลบจาก cloud compute service", + "ORG_ZSTACK_VMWARE_10062": "ไม่สามารถ resume VM ได้, สถานะ task: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10027": "จำนวน instances ที่ launch เกินขีดจำกัดที่อนุญาต %s", + "ORG_ZSTACK_COMPUTE_BONDING_10023": "ไม่สามารถเพิ่ม SR-IOV interface [%s] ให้กับ Bonding เนื่องจากมีการเลือก SR-IOV Dev มากกว่าหนึ่งตัว", + "ORG_ZSTACK_VMWARE_10063": "ไม่สามารถ resume virtual machine [%s]: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10026": "autoScalingGroup[%s] ไม่สามารถ terminate VMs[%s] ได้อย่างสมบูรณ์, errors คือ %s", + "ORG_ZSTACK_VMWARE_10060": "ไม่สามารถ suspend VM [%s]: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10025": "autoScalingGroup[%s] ไม่ได้ผูกติดกับ VM template ใด", + "ORG_ZSTACK_COMPUTE_BONDING_10029": "ไม่สามารถเพิ่ม interfaces ใหม่ให้กับ bond[%s] เนื่องจากมันมี SR-IOV-enabled interface อยู่แล้ว", + "ORG_ZSTACK_AUTOSCALING_GROUP_10024": "auto scaling group[%s] อยู่ในสถานะที่ไม่คาดคิด, คาดหวัง: %s state", + "ORG_ZSTACK_COMPUTE_BONDING_10028": "ไม่สามารถ attach interfaces ซ้ำๆ ให้กับ bond[%s] ได้", + "ORG_ZSTACK_AUTOSCALING_GROUP_10023": "defaultL3NetworkUuid[uuid:%s] ไม่มีอยู่ใน l3NetworkUuids %s", + "ORG_ZSTACK_SNS_PLATFORM_DINGTALK_10000": "ไม่สามารถส่งข้อความไปยัง DingTalk ได้ status: %s, body: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10022": "มี Layer 3 network มากกว่าหนึ่งรายการที่ระบุใน l3NetworkUuids แต่ defaultL3NetworkUuid เป็น null", + "ORG_ZSTACK_KVM_10140": "ไม่สามารถสร้าง bridge[%s] สำหรับ l2Network[uuid:%s, type:%s, vlan:%s] บน KVM host[uuid:%s] ได้ เนื่องจาก %s", + "ORG_ZSTACK_COMPUTE_BONDING_10027": "ไม่สามารถลบ bonding interface ที่กำหนดค่าด้วย VTEP IP ได้ โปรดตรวจสอบให้แน่ใจว่า virtual networks ที่เกี่ยวข้องทั้งหมดถูกยกเลิกการเชื่อมโยงก่อน", + "ORG_ZSTACK_KVM_10141": "ล้มเหลวในการตรวจสอบ bridge[%s] สำหรับ l2VlanNetwork[uuid:%s, name:%s] บน KVM host[uuid:%s], %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10021": "l3Network[uuid:%s] เป็น system network และไม่สามารถใช้สร้าง user VMs ได้", + "ORG_ZSTACK_AUTOSCALING_GROUP_10020": "l3Network ที่มี UUID:%s ถูกปิดใช้งาน; ดังนั้นจึงไม่อนุญาตให้สร้าง VM บน network นี้", + "ORG_ZSTACK_KVM_10143": "ล้มเหลวในการลบ bridge[%s] สำหรับ l2Network[uuid:%s, type:%s, vlan:%s] บน KVM host[uuid:%s], เนื่องจาก %s", + "ORG_ZSTACK_KVM_10144": "ไม่สามารถเริ่มต้น VM ได้เนื่องจาก hypervisor feature ไม่สามารถปิดใช้งานได้เมื่อ CPU mode ถูกตั้งค่าเป็น none โปรดตรวจสอบการตั้งค่า CPU ของคุณ", + "ORG_ZSTACK_KVM_10134": "XML hook[%s] ถูกเชื่อมโยงกับ VM %s แล้ว ดังนั้นโปรดยกเลิกการเชื่อมโยงก่อนลบ", + "ORG_ZSTACK_KVM_10136": "System-type XML hooks ไม่ได้รับอนุญาตในสภาพแวดล้อม cloud computing โปรดตรวจสอบให้แน่ใจว่าการตั้งค่าระดับ system ทั้งหมดปฏิบัติตาม virtualization standards", + "ORG_ZSTACK_KVM_10137": "ชื่อ XML hook [%s] มีอยู่แล้วใน virtual machine configuration", + "ORG_ZSTACK_KVM_10138": "มี KVM host ที่มี management IP[%s] อยู่แล้ว", + "ORG_ZSTACK_KVM_10139": "ไม่สามารถสร้าง VLAN device บน %s เนื่องจากชื่อยาวเกินไป", + "ORG_ZSTACK_VMWARE_10059": "ล้มเหลวในการ suspend VM, task status: %s", + "ORG_ZSTACK_COMPUTE_BONDING_10033": "L2 network [uuid:%s] ไม่มีอยู่", + "ORG_ZSTACK_BILLING_10008": "วันที่เริ่มต้นต้องอยู่ก่อนวันที่สิ้นสุด", + "ORG_ZSTACK_COMPUTE_BONDING_10032": "ไม่สามารถ detach interfaces ซ้ำๆ จาก bond[%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10031": "ไม่สามารถ detach interface[%s] จาก bond[%s] ที่อยู่ในสถานะ bonded", + "ORG_ZSTACK_COMPUTE_BONDING_10030": "ไม่สามารถเพิ่ม SR-IOV interface [%s] ไปยัง Bonding ได้เนื่องจาก interface ใน bond หนึ่งเดียวเท่านั้นที่สามารถ enable SR-IOV ได้", + "ORG_ZSTACK_BILLING_10005": "Billing ถูกปิดใช้งานสำหรับ resource นี้ โปรดตรวจสอบให้แน่ใจว่า billing ถูกเปิดใช้งานเพื่อใช้บริการนี้", + "ORG_ZSTACK_COMPUTE_BONDING_10037": "ไม่สามารถ attach L2 network ไปยัง cluster [UUID: %s] Interface [UUID: %s, name: %s] บน host [UUID: %s] ถูกเชื่อมโยงกับ service types แต่ไม่มี TenantNetwork รวมอยู่ด้วย", + "ORG_ZSTACK_BILLING_10004": "billing resource type [%s] ไม่ได้รับการสนับสนุน", + "ORG_ZSTACK_COMPUTE_BONDING_10036": "ไม่สามารถ attach L2 network ไปยัง cluster [UUID] Bonding interface [UUID, name] บน host [UUID] มี bonding service type associations แต่ขาด TenantNetwork service type", + "ORG_ZSTACK_BILLING_10003": "โปรดตรวจสอบให้แน่ใจว่า price configuration ที่ถูกต้องถูกตั้งค่าสำหรับ user, ตัวอย่างเช่น: `priceUserConfig:{\\nvolume:{\\npriceKeyName:\"priceKeyName\"}}`", + "ORG_ZSTACK_COMPUTE_BONDING_10035": "ไม่สามารถ attach L2 network ไปยัง cluster [uuid:%s]: physical interface [%s] ถูกใช้ใน bond บน host หนึ่งหรือมากกว่า Conflicting hosts: [%s]", + "ORG_ZSTACK_VMWARE_10051": "vmUuid [%s] ไม่พบใน ESX host system [%s]", + "ORG_ZSTACK_BILLING_10002": "โปรดตรวจสอบให้แน่ใจว่า price configuration ที่ถูกต้องสำหรับ user ถูกตั้งค่า, ตัวอย่างเช่น: `priceUserConfig:{rootVolume:{priceKeyName:\"priceKeyName\"}}`", + "ORG_ZSTACK_COMPUTE_BONDING_10034": "L2 network [uuid:%s] มี physical interface definition ว่าง", + "ORG_ZSTACK_BILLING_10001": "dateInLong is less than %s milliseconds", + "ORG_ZSTACK_BILLING_10000": "priceKeyName is null. Please ensure that the key name for pricing is correctly configured.", + "ORG_ZSTACK_VMWARE_10050": "Syncing with vCenter[uuid:%s], please try again later.", + "ORG_ZSTACK_KVM_10150": "cannot retrieve vmUuid from message %s", + "ORG_ZSTACK_KVM_10151": "ไม่สามารถซิงโครไนซ์เครื่องเสมือนบนโฮสต์[uuid:%s, ip:%s] เนื่องจาก %s", + "ORG_ZSTACK_COMPUTE_BONDING_10038": "ไม่สามารถเพิ่ม Linux bonding ไปยังโฮสต์[uuid:%s] : %s", + "ORG_ZSTACK_KVM_10152": "VM[%s] อยู่ในสถานะปิดเครื่องเป็นระยะเวลานาน กรุณาตรวจสอบสถานะ", + "ORG_ZSTACK_AUTOSCALING_GROUP_10032": "ประเภทนโยบายการลบที่ไม่รองรับ[%s]", + "ORG_ZSTACK_V2V_VMWARE_10015": "ไม่พบ IP ที่พร้อมใช้งานใน CIDR %s บนโฮสต์ %s กรุณาเชื่อมต่อโฮสต์ใหม่เพื่อรีเฟรช IP", + "ORG_ZSTACK_KVM_10154": "ไม่สามารถอัพเดต bridge[%s] สำหรับ l2Network[uuid:%s, name:%s] บน KVM host[uuid:%s], %s", + "ORG_ZSTACK_V2V_VMWARE_10016": "มีงานที่กำลังทำงานอยู่แล้ว[uuid:%s] ที่กำลังแปลง VM จาก %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10030": "deleteAutoScalingRule[%s] เริ่มทำงานล้มเหลว ข้อผิดพลาดคือ %s", + "ORG_ZSTACK_V2V_VMWARE_10017": "ไม่สามารถอัพเดต dependency ของ conversion host สำหรับเครื่องเสมือน %s", + "ORG_ZSTACK_KVM_10146": "ไม่สามารถใช้งาน security group rules กับ KVM host [uuid:%s] เนื่องจาก %s", + "ORG_ZSTACK_KVM_10147": "ไม่สามารถตรวจสอบ default rules ของ security group บน KVM host[uuid:%s] เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10101": "ไม่สามารถกำหนด redirect port หรือ status code โดยไม่ระบุ HTTP redirect URL", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10009": "ไม่สามารถตรวจจับ heartbeat, code: %s, detail: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10104": "loadBalancer listener[%s] ไม่รองรับการแก้ไข session persistence state", + "ORG_ZSTACK_IAM2SCRIPT_10010": "script executor ที่ระบุไม่รองรับในสภาพแวดล้อม cloud computing นี้ กรุณาดูรายการ executor ที่รองรับเพื่อข้อมูลเพิ่มเติม", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10105": "ไม่สามารถรองรับ HTTP redirect ไปยัง HTTPS และ session persistence พร้อมกันในสภาพแวดล้อม cloud", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10102": "ไม่สามารถรองรับโปรโตคอลอื่นนอกจาก HTTP เมื่อระบุ HTTP to HTTPS redirect", + "ORG_ZSTACK_VMWARE_10048": "โฮสต์ไม่ได้เชื่อมต่อกับสภาพแวดล้อม cloud กรุณาตรวจสอบว่าโฮสต์ได้รับการกำหนดค่าและอนุญาตอย่างถูกต้อง", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10108": "listener[%s] แก้ไข session persistence; ต้องระบุ load balancing algorithm", + "ORG_ZSTACK_V2V_VMWARE_10007": "ไม่สามารถแยกวิเคราะห์ URL %s", + "ORG_ZSTACK_COMPUTE_BONDING_10044": "ไม่สามารถแนบ nic ไปยัง linux bonding บนโฮสต์[uuid:%s] : %s", + "ORG_ZSTACK_VMWARE_10046": "ไม่สามารถถอด NIC เนื่องจาก Network Interface Card (NIC) ไม่รองรับการทำ hotplug operations ใน vCenter", + "ORG_ZSTACK_BILLING_10019": "gpu price ต้องถูก bind กับ GPU UUID %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10109": "listener[%s] %s load balancing algorithm ไม่รองรับการแก้ไข session persistence ยกเว้นการกำหนด iphash อย่างชัดเจน", + "ORG_ZSTACK_V2V_VMWARE_10008": "ชื่อ dataCenter ไม่สามารถมีอักขระพิเศษ %s", + "ORG_ZSTACK_IAM2SCRIPT_10002": "เนื้อหาของ script ว่างเปล่า กรุณาตรวจสอบว่า Java code snippet ถูกกำหนดอย่างถูกต้องและรวมอยู่ใน source file", + "ORG_ZSTACK_BILLING_10018": "GPU price ต้องถูก bind กับ GPU UUID ที่ถูกต้อง กรุณาระบุ UUID ที่ไม่ว่างเปล่า", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10106": "listener[%s] ไม่สามารถแก้ไข session persistence rewrite เมื่อ HTTP mode ถูกตั้งค่าเป็น http-tunnel", + "ORG_ZSTACK_V2V_VMWARE_10009": "ชื่อ Target VM ไม่สามารถมีอักขระพิเศษ %s", + "ORG_ZSTACK_IAM2SCRIPT_10001": "ไม่สามารถถอดรหัส script content กรุณาตรวจสอบว่า source file พร้อมใช้งานและมีรูปแบบที่ถูกต้องสำหรับสภาพแวดล้อม cloud computing", + "ORG_ZSTACK_COMPUTE_BONDING_10042": "ไม่สามารถลบ Linux bond จาก host[uuid:%s] ได้ : %s", + "ORG_ZSTACK_VMWARE_10044": "HOST CPU และ Guest OS ไม่เข้ากัน โปรดตรวจสอบว่า HOST CPU รองรับเทคโนโลยี Virtualization ที่จำเป็นหรืออัปเดต Guest OS ให้เป็นเวอร์ชันที่เข้ากัน", + "ORG_ZSTACK_BILLING_10017": "ราคาต้องอยู่ในช่วง 0 ถึง 999999999.99", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10107": "listener[%s] เปลี่ยน session persistence เป็น IP hash; ต้องระบุ source balancer algorithm", + "ORG_ZSTACK_VMWARE_10045": "การตรวจสอบความเข้ากันได้กับ virtual machine %s ที่ host %s ล้มเหลว", + "ORG_ZSTACK_BILLING_10016": "หน่วยทรัพยากรขั้นต่ำสำหรับการจัดสรรคือเมกะไบต์ ไม่ใช่ไบต์", + "ORG_ZSTACK_SDNCONTROLLER_10008": "เครือข่าย SDN L2 [UUID:%s] ไม่ได้เชื่อมต่อกับ controller", + "ORG_ZSTACK_IAM2SCRIPT_10007": "ฟังก์ชันสคริปต์ IAM2 ไม่ได้เปิดใช้งาน โปรดตรวจสอบว่าบริการ IAM2 ถูกเปิดใช้งานในสภาพแวดล้อมคลาวด์ของคุณ", + "ORG_ZSTACK_BILLING_10015": "resourceName[%s] เป็นตัวระบุที่ไม่ถูกต้องในบริบท cloud computing", + "ORG_ZSTACK_IAM2SCRIPT_10005": "ไม่สามารถดึงผลลัพธ์การรันสคริปต์ได้ โปรดตรวจสอบ cloud instance และการตั้งค่าเครือข่าย", + "ORG_ZSTACK_COMPUTE_BONDING_10046": "ไม่สามารถถอด NIC จาก Linux bonding บน host[uuid:%s] ได้ : %s", + "ORG_ZSTACK_VMWARE_10040": "ขาด destination host UUID โปรดตรวจสอบว่า UUID สำหรับ target host ถูกระบุอย่างถูกต้อง", + "ORG_ZSTACK_IAM2SCRIPT_10004": "การรัน iam2 script ล้มเหลว โปรดตรวจสอบว่าสภาพแวดล้อม cloud computing ที่จำเป็นถูกตั้งค่าอย่างถูกต้อง", + "ORG_ZSTACK_VMWARE_10041": "target host ไม่รองรับการจัดการ virtual machine โปรดตรวจสอบว่า destination host เป็น ESX หรือ vSphere host", + "ORG_ZSTACK_KVM_10161": "หมายเลข VNC port ที่ไม่คาดคิด[%d] สำหรับ virtual machine [uuid:%s]", + "ORG_ZSTACK_IAM2SCRIPT_10009": "จำนวนพารามิเตอร์เกินขีดจำกัดที่อนุญาต", + "ORG_ZSTACK_IAM2SCRIPT_10008": "สคริปต์ไม่มีโค้ด โปรดตรวจสอบว่าอินพุตของคุณมี Java code ที่ถูกต้อง", + "ORG_ZSTACK_SDNCONTROLLER_10000": "ไม่สามารถสร้าง SDN L2 network เนื่องจากขาด SDN Controller UUID ใน systemTags ของ API request โปรดตรวจสอบว่า SDN Controller UUID ถูกระบุอย่างถูกต้อง", + "ORG_ZSTACK_V2V_VMWARE_10003": "ชื่อ Cluster ต้องไม่มีอักขระต่อไปนี้: %s", + "ORG_ZSTACK_SDNCONTROLLER_10002": "ไม่พบ SDN controller สำหรับ Layer 2 network[uuid:%s, vswitchType:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10001": "ไม่สามารถสร้าง SDN L2 network เนื่องจาก SDN controller UUID หายไปจาก API request โปรดตรวจสอบว่า UUID ถูกรวมอยู่", + "ORG_ZSTACK_V2V_VMWARE_10006": "ไม่สามารถหยุด VM instance %s ก่อน v2v migration", + "ORG_ZSTACK_KVM_10157": "reply[%s] ไม่ใช่ KVMHostAsyncHttpCallResponse", + "ORG_ZSTACK_KVM_10158": "reply[%s] ส่งคืนด้วย response body ว่างเปล่า", + "ORG_ZSTACK_KVM_10159": "%s operation ล้มเหลว: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10040": "EcsInstance ต้องอยู่ในสถานะ running หรือ stopped เมื่อลบ EIP", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10111": "listener[%s] ไม่รองรับการแก้ไข idle timeout และ cookie name; ต้องระบุ session persistence", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10112": "listener[%s] ไม่รองรับการแก้ไข idle timeout เมื่อ session persistence ถูกปิดใช้งาน", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10110": "listener[%s] %s load balancing algorithm ไม่รองรับการแก้ไข session persistence ยกเว้นโดยการกำหนด disable อย่างชัดเจน", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10115": "session idle timeout ที่ไม่ถูกต้อง[%s], ต้องเป็นจำนวนเต็มบวกระหว่าง[%s~%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10040": "ไม่สามารถอัปเดต Linux bonding บนโฮสต์[uuid:%s] ได้: %s", + "ORG_ZSTACK_VMWARE_10039": "ไม่พบ UUID ของโฮสต์ในคำขอ metadata", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10116": "ต้องระบุโปรโตคอล HTTP health check สำหรับพารามิเตอร์การตรวจสอบสุขภาพ %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10113": "listener[%s] ไม่สนับสนุนการแก้ไขชื่อ cookie เมื่อ session persistence ไม่ได้ตั้งค่าเป็น rewrite", + "ORG_ZSTACK_VMWARE_10037": "ไม่พบ distributed virtual switch หรือ qualified virtual switch", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10114": "listener[%s] ไม่สนับสนุนการแก้ไข session-based URL rewriting โดยไม่เปลี่ยนชื่อ cookie", + "ORG_ZSTACK_VMWARE_10038": "ไม่พบ Datastore %s สำหรับ vCenter %s", + "ORG_ZSTACK_BILLING_10009": "resourceType และ resourceUUID ไม่สามารถว่างเปล่าพร้อมกันได้", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10119": "health check target[%s] ไม่ถูกต้อง รูปแบบควรเป็น checkProtocol:port เช่น tcp:default", + "ORG_ZSTACK_SDNCONTROLLER_10015": "ไม่สามารถเพิ่ม SDN controller ได้เนื่องจาก type: %s ไม่อยู่ในรายการที่รองรับ: %s", + "ORG_ZSTACK_SDNCONTROLLER_10014": "ไม่สามารถเพิ่ม security group rule ได้เนื่องจาก remote security group controller UUID[:%s] ไม่ตรงกับ local security group controller UUID[:%s]", + "ORG_ZSTACK_VMWARE_10036": "ไม่มี compute resource ที่พร้อมใช้งานสำหรับการดำเนินการ clustering%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10117": "รหัสสถานะที่คาดหวัง [%s] ของ HTTP health check protocol ไม่ถูกต้อง", + "ORG_ZSTACK_SDNCONTROLLER_10017": "ไม่สามารถเพิ่ม SDN controller ได้เนื่องจาก controller [IP:%s] ลงทะเบียนแล้ว", + "ORG_ZSTACK_VMWARE_10033": "SSL handshake ล้มเหลวกับ vCenter [%s] เนื่องจากใช้ TLS 1.0 ที่ไม่ปลอดภัย ให้เปิดใช้งาน TLS 1.0 ในการกำหนดค่า JDK ด้วยตนเองหากจำเป็น", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10118": "listener ที่มีโปรโตคอล [%s] ไม่สนับสนุนการเลือก security policy", + "ORG_ZSTACK_SDNCONTROLLER_10016": "ไม่สามารถเพิ่ม SDN controller ได้เนื่องจาก ip[%s] ไม่ใช่ unicast address ที่ถูกต้อง", + "ORG_ZSTACK_VMWARE_10034": "SSL handshake ล้มเหลวกับ vCenter [%s] โปรดตรวจสอบหมายเลขพอร์ต [%d]", + "ORG_ZSTACK_BILLING_10027": "การเรียกเก็บเงินเปิดใช้งานอยู่ การดำเนินการนี้ได้รับอนุญาตเฉพาะเมื่อการเรียกเก็บเงินถูกปิดใช้งาน", + "ORG_ZSTACK_SDNCONTROLLER_10019": "ไม่สามารถเพิ่มโฮสต์ [UUID:%s] ไปยัง SDN controller [UUID:%s] ได้เนื่องจากไม่ได้ระบุ subnet mask", + "ORG_ZSTACK_VMWARE_10031": "เข้าสู่ระบบ vCenter Server [%s] ล้มเหลวด้วยข้อมูลผู้ใช้ โปรดตรวจสอบการเชื่อมต่อเครือข่ายและข้อมูลประจำตัวที่ให้มา", + "ORG_ZSTACK_BILLING_10026": "endDate ไม่สามารถเร็วกว่า startDate ได้", + "ORG_ZSTACK_SDNCONTROLLER_10018": "ไม่สามารถเพิ่มโฮสต์[uuid:%s] ไปยัง SDN controller[uuid:%s] ได้เนื่องจากติดต่อกับ SDN controller อื่นอยู่แล้ว", + "ORG_ZSTACK_VMWARE_10032": "การแยกวิเคราะห์ response จาก vCenter [%s] ล้มเหลว โปรดตรวจสอบหมายเลขพอร์ต [%d]", + "ORG_ZSTACK_BILLING_10025": "ตั้งค่า endDateInLong แล้ว ไม่อนุญาตให้แก้ไขใน cloud environment เพื่อรักษาความสอดคล้องของข้อมูลและปฏิบัติตามมาตรฐาน virtualization", + "ORG_ZSTACK_BILLING_10024": "ไม่ควรกำหนดค่า endDateInLong และ setEndDateInLongBaseOnCurrentTime พร้อมกัน โปรดเลือกหนึ่งสำหรับการตั้งค่าของคุณ", + "ORG_ZSTACK_VMWARE_10030": "เชื่อมต่อกับ cloud resource ล้มเหลว: %s", + "ORG_ZSTACK_BILLING_10023": "endDateInLong ไม่ได้รับอนุญาตให้มีค่าติดลบ", + "ORG_ZSTACK_BILLING_10022": "accountUuid และ tableUuid ไม่สามารถใช้พร้อมกันได้ ตั้งค่าได้เพียงหนึ่งเดียว", + "ORG_ZSTACK_BILLING_10021": "priceTable[uuid=%s] นี้ไม่ได้รับอนุญาตให้ลบใน cloud environment นี้", + "ORG_ZSTACK_BILLING_10020": "บัญชี[uuid=%s]ได้แนบตารางราคาแล้ว", + "ORG_ZSTACK_LONGJOB_10007": "ไม่สามารถยกเลิกงานที่ทำงานนานซึ่งดำเนินการสำเร็จแล้วได้", + "ORG_ZSTACK_SDNCONTROLLER_10011": "การดำเนินการ Pull tenant ได้รับการสนับสนุนเฉพาะสำหรับ H3C VCFC V2X controllers เท่านั้น", + "ORG_ZSTACK_LONGJOB_10008": "ไม่สามารถยกเลิกงานที่ทำงานนานซึ่งล้มเหลวแล้วได้", + "ORG_ZSTACK_LONGJOB_10009": "ลบงานที่ทำงานนานได้เฉพาะเมื่อดำเนินการสำเร็จ ถูกยกเลิก หรือล้มเหลวแล้วเท่านั้น", + "ORG_ZSTACK_SDNCONTROLLER_10013": "ไม่สามารถเพิ่ม vmnic เข้าสู่กลุ่มความปลอดภัยเนื่องจากมี SDN controller ที่แตกต่างกัน [NIC controller UUID: %s, Security Group controller UUID: %s]", + "ORG_ZSTACK_SDNCONTROLLER_10012": "ไม่สามารถดึงข้อมูล tenant ได้: %s", + "ORG_ZSTACK_LONGJOB_10010": "รัน longjob ใหม่ได้เฉพาะเมื่อดำเนินการสำเร็จ ถูกยกเลิก หรือล้มเหลวแล้วเท่านั้น", + "ORG_ZSTACK_LONGJOB_10011": "สามารถ resume longjob ได้เฉพาะเมื่ออยู่ในสถานะ Suspended เท่านั้น", + "ORG_ZSTACK_LONGJOB_10012": "%s ไม่มี long-running task ที่สอดคล้อง", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10122": "cloud ไม่สามารถแก้ไข load balancer listener ได้เนื่องจาก listener ที่มี protocol [%s] ไม่รองรับการเลือก HTTP version [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10123": "cloud ไม่สามารถแก้ไข load balancer listener ได้เนื่องจาก HTTPS protocol รองรับ HTTP version เท่านั้น: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10120": "listener ที่มี protocol [%s] ไม่สามารถใช้งานร่วมกับ health check นี้ได้:[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10121": "ต้องระบุ HTTP health check protocol โปรดรวมพารามิเตอร์การตรวจสอบสุขภาพ เช่น healthCheckMethod และ healthCheckURI", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10126": "cloud ไม่รองรับการเปลี่ยนแปลง load balancer listener เนื่องจาก listener ที่มี protocol [%s] ไม่รองรับการบีบอัดเนื้อหา", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10127": "cloud ไม่สามารถแก้ไข load balancer listener ได้เนื่องจากรองรับเฉพาะ compression algorithms [%s]", + "ORG_ZSTACK_VMWARE_10029": "เข้าสู่ระบบล้มเหลว โปรดตรวจสอบข้อมูลประจำตัวของคุณและให้แน่ใจว่าใช้พารามิเตอร์การเข้าสู่ระบบที่ถูกต้องสำหรับบริการ cloud computing", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10124": "cloud ไม่สามารถแก้ไข load balancer listener ได้เนื่องจาก TCP protocol listener รองรับเฉพาะ TCP proxy สำหรับการตั้งค่าพารามิเตอร์", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10125": "cloud ไม่สามารถแก้ไข load balancer listener ได้เนื่องจากรองรับเฉพาะ TCP proxy protocol %s", + "ORG_ZSTACK_VMWARE_10027": "VCenter[uuid:%s] ไม่พบ: สภาพแวดล้อม Virtualization ที่มี UUID ที่ระบุไม่มีอยู่", + "ORG_ZSTACK_TAG_10004": "ไม่มี system tag ที่ตรงกับ[%s] สำหรับ resource type[%s]", + "ORG_ZSTACK_SDNCONTROLLER_10026": "การดำเนินการ Pull tenant ไม่ได้รับการสนับสนุนสำหรับ SDN Controller [uuid:%s, vendorType:%s, vendorVersion:%s] เฉพาะ H3C VCFC V2 controllers เท่านั้นที่สนับสนุนการดำเนินการนี้", + "ORG_ZSTACK_LOG_10007": "ประเภทการกำหนดค่า log ไม่ทราบ %s", + "ORG_ZSTACK_SDNCONTROLLER_10025": "SDN controller [UUID:%s] ไม่พบ", + "ORG_ZSTACK_TAG_10005": "ตรวจสอบ system tag [%s] สำหรับ resource type[%s] ล้มเหลว", + "ORG_ZSTACK_LOG_10006": "ประเภทการกำหนดค่าที่ไม่รู้จักสำหรับ log server %s", + "ORG_ZSTACK_SDNCONTROLLER_10028": "ไม่สามารถเปลี่ยน SDN controller ได้เนื่องจาก VLAN range[%s] ไม่อยู่ในรูปแบบที่ถูกต้อง", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10128": "IP version[%s] ไม่ถูกต้อง ต้องเป็น IPv4 หรือ IPv6", + "ORG_ZSTACK_LOG_10005": "บัญชี [uuid:%s] ไม่มีสิทธิ์ในการเพิ่ม log servers เพิ่มเติม เฉพาะบัญชีผู้ดูแลระบบเท่านั้นที่มีสิทธิ์นี้", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10129": "ไม่อนุญาตให้ลบ default server group[uuid:%s]", + "ORG_ZSTACK_LOG_10004": "ปฏิเสธการเข้าถึง: บัญชี[uuid:%s] ไม่ได้รับอนุญาตให้ดึงข้อมูลบันทึกของโหนดการจัดการ เฉพาะบัญชีผู้ดูแลระบบเท่านั้นที่มีสิทธิ์นี้", + "ORG_ZSTACK_TAG_10008": "แท็ก[%s] ใช้สำหรับผู้ดูแลระบบเท่านั้น", + "ORG_ZSTACK_LOG_10003": "บัญชี[UUID:%s] ไม่ได้รับอนุญาตให้ดำเนินการบนเซิร์ฟเวอร์บันทึก[UUID:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10029": "ไม่สามารถเปลี่ยนตัวควบคุม SDN ได้เนื่องจากช่วง VLAN[%s] ทับซ้อนกับช่วง VLAN อื่น", + "ORG_ZSTACK_LOG_10002": "ไม่พบโรงงานสำหรับประเภท:%s", + "ORG_ZSTACK_TAG_10006": "ไม่พบแท็กระบบที่ตรงกับ %s", + "ORG_ZSTACK_SDNCONTROLLER_10020": "ไม่สามารถเพิ่มโฮสต์[UUID:%s]ลงในตัวควบคุม SDN[UUID:%s]ได้ เนื่องจาก IP vTEP ถูกใช้งานโดยโฮสต์[UUID:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10022": "ไม่สามารถอัปเดตโฮสต์[uuid:%s]ของตัวควบคุม SDN[uuid:%s]ได้ เนื่องจากโฮสต์ยังไม่ได้ถูกเพิ่มลงในตัวควบคุม SDN", + "ORG_ZSTACK_TAG_10000": "แท็กซ้ำซ้อน[แท็ก:%s, ประเภท:%s, ประเภท_ทรัพยากร:%s, UUID_ทรัพยากร:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10021": "ไม่สามารถยกเลิกการลงทะเบียนโฮสต์[uuid:%s]จากตัวควบคุม SDN[uuid:%s]ได้ เนื่องจากโฮสต์ยังไม่ได้ลงทะเบียนกับตัวควบคุม SDN", + "ORG_ZSTACK_SDNCONTROLLER_10024": "ไม่สามารถแนบเครือข่าย L3 กับ VM ได้เนื่องจากผู้เช่าบางรายในตัวควบคุม SDN[uuid:%s]ถูกลบไปแล้ว โปรดรันการซิงโครไนซ์ผู้เช่าก่อนเพื่ออัปเดตสถานะผู้เช่า", + "ORG_ZSTACK_SDNCONTROLLER_10023": "ไม่สามารถอัปเดตโฮสต์[uuid:%s]ของตัวควบคุม SDN[uuid:%s]ได้ เนื่องจากมีการระบุ netmask", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10000": "การตรวจสอบความสมบูรณ์ของข้อมูลแบบแบตช์ล้มเหลว ประเภททรัพยากรที่ไม่รองรับ:%s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10002": "การเพิ่มทรัพยากรความสมบูรณ์ล้มเหลว ประเภททรัพยากรที่ไม่รองรับ:%s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10002": "ข้อผิดพลาดเทมเพลต:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10134": "ไม่สามารถเพิ่ม VMNic ของเซิร์ฟเวอร์แบ็คเอนด์ลงในกลุ่มเซิร์ฟเวอร์[UUID:%s]ได้ เนื่องจากน้ำหนัก VMNic [%s] ไม่ใช่ตัวเลขที่ถูกต้อง", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10008": "การดึงข้อมูลแคชรูปภาพด้วย ID:%s ล้มเหลว: GetImageHashValueReply.hashValue เป็นค่าว่าง", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10009": "การตรวจสอบความสอดคล้องของแคชรูปภาพ[%s]ล้มเหลวเนื่องจากปัญหาสภาพแวดล้อมเครื่องเสมือน", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10000": "ไม่มีเทมเพลตที่ใช้ได้สำหรับประเภทนี้:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10132": "ไม่สามารถเพิ่ม VMNIC ของเซิร์ฟเวอร์แบ็คเอนด์ด้วย UUID:%s ลงในกลุ่มเซิร์ฟเวอร์ด้วย UUID:%s ได้ เนื่องจาก VMNIC ไม่มีอยู่", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10137": "ไม่สามารถเพิ่ม NIC ของเซิร์ฟเวอร์แบ็คเอนด์ลงในกลุ่มเซิร์ฟเวอร์[uuid:%s]ได้ เนื่องจาก IP ของ NIC [ipAddress:%s] ซ้ำกัน", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10003": "ประเภทการเข้ารหัส[start data protection encryptType:%s] ไม่ถูกต้อง", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10138": "ไม่สามารถเพิ่มอินเทอร์เฟซเครือข่ายเครื่องเสมือน[uuid:%s]ลงในกลุ่มเซิร์ฟเวอร์[uuid:%s]ได้ เนื่องจากตัวรับฟัง[uuid:%s]ได้แนบอินเทอร์เฟซเครือข่ายของกลุ่มเซิร์ฟเวอร์นี้ไปแล้ว", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10004": "สแนปช็อต[uuid:%s]ไม่ได้เข้ารหัสในสภาพแวดล้อมเสมือนจริง", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10135": "เครือข่าย L3 ที่มี UUIDs:%s ที่เชื่อมโยงกับ VM nics ไม่มีบริการเครือข่าย:%s เปิดใช้งาน", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10005": "การตรวจสอบความสอดคล้องของสแนปช็อตโวลุม[%s]ล้มเหลวเนื่องจากสถานะไม่สอดคล้องกัน", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10136": "VM NICs[UUID:%s]ได้เชื่อมโยงกับกลุ่มเซิร์ฟเวอร์ตัวสร้างภาระ[UUID:%s]อยู่แล้ว", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10006": "ข้อผิดพลาดการเข้ารหัส:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10139": "ไม่สามารถเพิ่ม IP ของเซิร์ฟเวอร์แบ็คเอนด์ลงในกลุ่มเซิร์ฟเวอร์[UUID:%s]ได้ เนื่องจาก IP [IP Address:%s] ลงทะเบียนแล้ว", + "ORG_ZSTACK_VMWARE_10097": "VCENTER[%s] ไม่อยู่ในสถานะปฏิบัติการ สถานะปัจจุบัน:%s", + "ORG_ZSTACK_VMWARE_10098": "ไม่พบ vdisk: %s", + "ORG_ZSTACK_VMWARE_10095": "การดึงรายการงานล่าสุดล้มเหลว, รายละเอียด: %s", + "ORG_ZSTACK_VMWARE_10096": "ไม่พบเซิร์ฟเวอร์ VCENTER", + "ORG_ZSTACK_VMWARE_10093": "พื้นที่จัดเก็บสำรองข้อมูล vCenter ไม่รองรับการคำนวณแฮชของอิมเมจ", + "ORG_ZSTACK_VMWARE_10091": "ฟีเจอร์สำหรับ %s ยังไม่รองรับในสภาพแวดล้อมคลาวด์", + "ORG_ZSTACK_TAG_10011": "แท็ก[uuid:%s] เป็นแท็กระบบที่ฝังอยู่และไม่สามารถลบออกได้", + "ORG_ZSTACK_TAG_10012": "อาร์กิวเมนต์ 'resourceType' ไม่ตรงกับ UUID ที่คาดหวัง โปรดตรวจสอบให้แน่ใจว่าประเภททรัพยากรระบุเป็น UUID อย่างถูกต้อง", + "ORG_ZSTACK_VMWARE_10090": "ไม่พบอิมเมจ %s ใน backing store โปรดตรวจสอบให้แน่ใจว่าเส้นทางอิมเมจถูกต้องและลองอีกครั้ง", + "ORG_ZSTACK_TAG_10010": "ไม่พบประเภททรัพยากรในระบบแท็ก %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10010": "การแคชอิมเมจเข้ารหัสล้มเหลว[id:%s]: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10011": "ไฟล์ความสมบูรณ์ของ nodeType %s[path:%s] มีอยู่แล้วในสภาพแวดล้อมเสมือน", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10012": "ประเภทโหนดไม่ถูกต้อง[%s]", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10013": "ล้มเหลวในการเพิ่มไฟล์ความสมบูรณ์[%s.%s], ตอนนี้เป็นไดเรกทอรีแล้ว", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10141": "น้ำหนักไม่ถูกต้อง[serverIp:%s, weight:%s], น้ำหนักไม่อยู่ในช่วงที่ถูกต้อง [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10143": "ไอพีเซิร์ฟเวอร์ [uuid:%s] เชื่อมโยงกับกลุ่มเซิร์ฟเวอร์ของตัวจำลองโหลดบาลานซ์อยู่แล้ว [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10148": "loadbalancerServerGroup [%s] ไม่มีอยู่", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10014": "ไฟล์ความสมบูรณ์[%s.%s] ไม่มีอยู่", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10149": "VMNic หรือ IP address เป็นค่าว่าง โปรดตรวจสอบการตั้งค่าการกำหนดค่าเครือข่ายของคุณ", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10015": "โฮสต์ %s ไม่มีอยู่", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10146": "vmnics ทั้งหมดไม่ได้เชื่อมโยงกับกลุ่มเซิร์ฟเวอร์ [%s]", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10000": "พื้นที่จัดเก็บข้อมูลหลักภายนอก[uuid:%s, name:%s] ส่งคืนสถานะไม่สมบูรณ์: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10016": "การดำเนินการเชลล์ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10001": "ค้นหาไคลเอนต์ที่ใช้งานอยู่สำหรับโวลุม[uuid:%s, mountPath %s, client:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10147": "ไอพีเซิร์ฟเวอร์ทั้งหมดไม่ได้เชื่อมโยงกับกลุ่มเซิร์ฟเวอร์ [%s]", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10017": "การเพิ่มไฟล์ความสมบูรณ์[%s.%s] ล้มเหลว, เพราะ %s", + "ORG_ZSTACK_VMWARE_10088": "vCenter Backup Storage ไม่รองรับการยกเลิกการดาวน์โหลดอิมเมจ", + "ORG_ZSTACK_VMWARE_10086": "ทรัพยากร %s จัดสรรแล้ว", + "ORG_ZSTACK_VMWARE_10085": "โปรโตคอลที่ไม่คาดคิด: %s", + "ORG_ZSTACK_VMWARE_10082": "ไม่มีที่จัดเก็บข้อมูลที่แนบกับ %s", + "ORG_ZSTACK_VMWARE_10083": "ไม่พบ Data-store สำหรับ %s", + "ORG_ZSTACK_VMWARE_10080": "vCenter[uuid=%s] ถูกปิดใช้งาน คุณสามารถดำเนินการอ่านอย่างเดียวบน vCenter นี้เท่านั้น หากต้องการทำการเปลี่ยนแปลงการกำหนดค่า ให้อัปเดตการกำหนดค่า vCenter โดยใช้ UpdateVCenterAction {uuid=%s state=Enabled}", + "ORG_ZSTACK_VMWARE_10081": "VCENTER[uuid=%s] ถูกปิดใช้งาน คุณสามารถดำเนินการอ่านอย่างเดียวบน VCENTER เหล่านี้เท่านั้น", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10021": "การสร้าง encrypted snapshot[uuid:%s] ล้มเหลว: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10151": "ไม่สามารถเพิ่มกลุ่มเซิร์ฟเวอร์ที่มี UUID:%s ไปยัง listener ที่มี UUID:%s เนื่องจาก network interface ที่มี UUID:%s เชื่อมโยงอยู่แล้ว", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10152": "ไม่สามารถเพิ่ม server instance [uuid:%s] ไปยัง listener [uuid:%s] เนื่องจากที่อยู่ IP ของเซิร์ฟเวอร์ลงทะเบียนอยู่แล้ว", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10150": "ไม่สามารถเพิ่มกลุ่มเซิร์ฟเวอร์ [uuid:%s] ไปยัง listener [uuid:%s] เนื่องจากเพิ่มไปแล้ว", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10155": "ไม่สามารถเพิ่มกลุ่มเซิร์ฟเวอร์[uuid:%s] ไปยัง listener [uuid:%s], เนื่องจาก UDP listener ไม่สามารถแมปที่อยู่ IPv4 backend ไปยัง IPv6 ได้", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10156": "ไม่สามารถลบกลุ่มเซิร์ฟเวอร์ [uuid:%s] จาก listener [uuid:%s] เนื่องจากมีการเปิดใช้งาน HTTP redirect ไปยัง HTTPS", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10153": "ไม่สามารถเพิ่มกลุ่มเซิร์ฟเวอร์[uuid:%s] ไปยัง listener [uuid:%s], เนื่องจาก UDP listener ไม่สามารถมีที่อยู่ VIP ทั้ง IPv4 และ IPv6 พร้อมกันได้", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10154": "ไม่สามารถเพิ่มกลุ่มเซิร์ฟเวอร์[uuid:%s] ไปยัง listener [uuid:%s], เนื่องจาก UDP listener ไม่สามารถแมปที่อยู่ IPv6 backend ไปยังที่อยู่ IPv4 ได้", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10159": "ไม่พบ load balancer ที่เชื่อมโยงกับกลุ่มเซิร์ฟเวอร์ [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10157": "ไม่สามารถยกเลิกการลงทะเบียนกลุ่มเซิร์ฟเวอร์ [uuid:%s] จาก load balancer [uuid:%s] เนื่องจากยังไม่ได้ลงทะเบียน", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10158": "loadBalancerUuid [%s] ไม่มีอยู่", + "ORG_ZSTACK_VMWARE_10078": "การดำเนินการนี้ไม่รองรับในสภาพแวดล้อม cloud computing ปัจจุบัน โปรดตรวจสอบว่าคำขอของคุณสอดคล้องกับการดำเนินการที่รองรับสำหรับทรัพยากร cloud", + "ORG_ZSTACK_VMWARE_10076": "การเปิดเครื่อง VM ล้มเหลว, สถานะ task: %s", + "ORG_ZSTACK_VMWARE_10073": "VM [%s] ไม่พบใน vCenter inventory", + "ORG_ZSTACK_VMWARE_10071": "ไม่พบ VM ที่มี UUID=%s บน ESX Host ที่มี UUID=%s", + "ORG_ZSTACK_VMWARE_10072": "การอัปเดตการกำหนดค่า ESX VM[uuid=%s] ล้มเหลว ดูรายละเอียดเพิ่มเติมใน log", + "ORG_ZSTACK_VMWARE_10070": "Image [%s] ไม่พบใน registry หรือ local cache", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10162": "ไม่สามารถเปลี่ยน backend server VMNIC เป็น serverGroup[uuid:%s] เนื่องจาก VMNIC weight[%s] ไม่ใช่ตัวเลขที่ถูกต้อง", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10163": "invalid balancer weight[vimNic:%s], weight ไม่สามารถเป็น null ได้", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10160": "ไม่สามารถอัปเดต backend server VMNIC ของกลุ่มเซิร์ฟเวอร์เนื่องจากกลุ่มเซิร์ฟเวอร์ [uuid:%s] ไม่มี VMNIC [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10161": "invalid balancer weight[vimNic:%s], ค่า weight อยู่นอกช่วง [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10166": "invalid balancer weight[serverIp:%s,weight:%s], weight ไม่อยู่ในช่วงที่ถูกต้อง [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10167": "ไม่สามารถเพิ่ม backend server IP ไปยังกลุ่มเซิร์ฟเวอร์ [UUID:%s], เนื่องจาก VMNIC weight [%s] ไม่ใช่ตัวเลขที่ถูกต้อง", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10164": "ไม่สามารถอัปเดต backend server VMNIC ของกลุ่มเซิร์ฟเวอร์ [UUID:%s], เนื่องจาก VMNIC UUID เป็น null", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10165": "ไม่สามารถอัปเดต backend server IP ของกลุ่มเซิร์ฟเวอร์เนื่องจากกลุ่มเซิร์ฟเวอร์ [uuid:%s] ไม่มี IP [ipAddress:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10168": "invalid balancer weight[serverIp:%s], weight ไม่สามารถเป็น null ได้", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10169": "ไม่สามารถเพิ่ม backend server IP ไปยังกลุ่มเซิร์ฟเวอร์ [UUID:%s], เนื่องจาก IP [IP Address:%s] ไม่ถูกต้อง", + "ORG_ZSTACK_VPC_HA_10010": "มี VPC routers มากกว่า 2 ตัวแนบม", + "ORG_ZSTACK_COMPUTE_VM_10119": "เครื่องเสมือนไม่สามารถดำเนินการอัพเดต CPU/หน่วยความจำแบบออนไลน์ได้เนื่องจาก Instance Offering Online Modification ถูกปิดใช้งาน กรุณาหยุดเครื่องเสมือนแล้วลองอัพเดต CPU/หน่วยความจำอีกครั้ง", + "ORG_ZSTACK_VPC_HA_10011": "เครือข่าย L3 สำหรับการจัดการและสาธารณะของกลุ่ม HA [uuid:%s] แตกต่างจากเครือข่าย L3 ที่เสนอ [uuid:%s]", + "ORG_ZSTACK_VPC_HA_10012": "เครือข่าย L3 ของเราเตอร์ vPC [UUID:%s] ไม่ตรงกับเครือข่าย L3 ของกลุ่ม HA [UUID:%s] กรุณาลบเราเตอร์นี้และสร้างใหม่", + "ORG_ZSTACK_VPC_HA_10013": "เราเตอร์ vPC ได้ถูกต่อเข้ากับกลุ่ม high-availability [uuid:%s]", + "ORG_ZSTACK_VPC_HA_10014": "กลุ่ม HA ของ vpc [uuid:%s] ไม่มีอยู่", + "ORG_ZSTACK_VPC_HA_10015": "มีเราเตอร์ vPC มากกว่าหนึ่งตัวที่ต่อเข้ากับกลุ่ม HA [uuid:%s]", + "ORG_ZSTACK_VPC_HA_10016": "เราเตอร์ vPC [UUID:%s] ไม่สามารถอัพเกรดเป็นเราเตอร์ HA ได้เนื่องจากเครือข่ายสาธารณะเหมือนกับเครือข่ายการจัดการ", + "ORG_ZSTACK_VPC_HA_10017": "สร้าง affinity group สำหรับกลุ่ม high availability [uuid:%s] ล้มเหลว", + "ORG_ZSTACK_VPC_HA_10018": "haStatus ของ instance %s [uuid: %s] ของกลุ่ม HA ของ VPC %s [uuid: %s] เปลี่ยนจาก %s เป็น %s", + "ORG_ZSTACK_VPC_HA_10019": "haStatus ของ instance[uuid: %s, name: %s, type: %s] เปลี่ยนจาก %s เป็น %s", + "ORG_ZSTACK_VPC_HA_10009": "ไม่มี master router สำหรับเราเตอร์ [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10000": "คำสั่งเริ่มต้นของ instance nfv ล้มเหลวเนื่องจาก:%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10002": "ไม่สามารถแก้ไขนโยบายเริ่มต้นของ firewall สำหรับ network interface ของ VM instance ของ NFV[uuid:%s] ได้เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10053": "access-control-list groups[uuid:%s] ถูกกำหนดค่าให้ redirect แต่บาง access-control-list entries ขาด IP rules", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10050": "load balancer listener [UUID:%s] ไม่สามารถต่อ redirect rule access control list groups ได้มากกว่า %d รายการ", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10051": "load balancer listener [uuid:%s] มี redirect rule ที่เชื่อมโยงกับ access control list groups [uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10118": "VM[UUID:%s] ยังคงหยุดชั่วคราวหลังการย้ายล่าสุด กรุณากลับมาทำงานต่อก่อนพยายามย้ายอีกครั้ง", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10056": "load balancer listener [uuid:%s] ไม่สามารถต่อ access control list groups ได้มากกว่า %d รายการ", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10008": "Detach ไม่รองรับสำหรับประเภท instance ของเครื่องเสมือนนี้", + "ORG_ZSTACK_COMPUTE_VM_10117": "VM ที่มี UUID:%s ได้ถูกโฮสต์บน host ที่มี UUID:%s อยู่แล้ว", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10057": "server group[%s] ไม่ได้ต่อกับ load balancer listener[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10007": "Update provisioning configuration ไม่รองรับสำหรับประเภท instance ของ NFV นี้", + "ORG_ZSTACK_COMPUTE_VM_10116": "ต้องระบุ rootDiskSize เมื่อ image media type เป็น ISO", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10054": "access control list groups[uuid:%s] เชื่อมโยงกับ load balancer listener[uuid:%s] อยู่แล้ว", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10055": "load balancer listener[uuid:%s] มีเพียง access control list group ประเภท %s ที่ต่ออยู่", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10009": "Clean data ไม่รองรับสำหรับประเภท instance ของ virtualized network function นี้", + "ORG_ZSTACK_COMPUTE_VM_10114": "แพลตฟอร์มปัจจุบัน %s ยังไม่รองรับการอัพเดต NIC drivers", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10004": "ไม่สามารถสร้าง SSH connection ไปยัง NFV instance [%s] หลังจากกำหนดค่า SSH settings", + "ORG_ZSTACK_COMPUTE_VM_10113": "ไม่สามารถสร้าง CD-ROM สำหรับเครื่องเสมือน [uuid:%s] ที่อยู่ในสถานะ [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10058": "acl[%s] ไม่ได้ต่อกับ load balancer listener[%s]", + "ORG_ZSTACK_COMPUTE_VM_10112": "image[name:%s, uuid:%s] เป็น ISO ดังนั้นต้องระบุ rootDiskSize", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10006": "ไม่สามารถอัปเดตสถานะอินสแตนซ์ NFV ได้: %s", + "ORG_ZSTACK_COMPUTE_VM_10111": "การตั้งค่าการจัดสรร CPU และหน่วยความจำสำหรับอินสแตนซ์ของคุณไม่ครบถ้วน โปรดระบุค่าที่จำเป็นเพื่อดำเนินการต่อ", + "ORG_ZSTACK_VPC_HA_10020": "UUID ของกลุ่ม HA เป็นค่าว่าง โปรดตรวจสอบการกำหนดค่าและตรวจสอบว่า UUID ถูกตั้งค่าอย่างถูกต้อง", + "ORG_ZSTACK_COMPUTE_VM_10121": "ไม่สามารถลดความจุได้เมื่อ VM[%s] กำลังทำงาน", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10060": "ไม่สามารถแนบ VM NIC เข้ากับ listener ของ load balancer ได้เนื่องจาก VM NIC [uuid:%s] เชื่อมโยงกับกลุ่ม server เริ่มต้น [uuid:%s] อยู่แล้ว", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10061": "listener ประเภท UDP ไม่สามารถมี virtual IP ทั้ง IPv4 และ IPv6 พร้อมกันได้ โปรดกำหนดค่า IPv4 หรือ IPv6 สำหรับ listener ของคุณ", + "ORG_ZSTACK_COMPUTE_VM_10129": "%s ไม่ใช่ IPv4 address ที่ถูกต้องสำหรับการ deploy บน cloud", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10068": "redirect status [%s] ไม่ถูกต้อง รองรับเฉพาะ [รหัสสถานะ HTTP ที่ถูกต้อง]", + "ORG_ZSTACK_COMPUTE_VM_10128": "ไม่สามารถลดขนาดหน่วยความจำของ vm[uuid:%s] ขณะที่กำลังทำงานอยู่", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10065": "ไม่สามารถแนบ access control list group เกิน %d กลุ่มให้กับ listener", + "ORG_ZSTACK_COMPUTE_VM_10127": "ไม่สามารถลด CPU ของ VM[uuid:%s] ที่กำลังทำงาน", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10066": "loadBalancer listener[%s] ไม่รองรับการกำหนด session persistence state", + "ORG_ZSTACK_COMPUTE_VM_10126": "สถานะของ VM [uuid:%s] คือ %s อนุญาตให้อัปเดต CPU หรือหน่วยความจำได้เฉพาะสถานะ [%s] เท่านั้น", + "ORG_ZSTACK_COMPUTE_VM_10125": "เครื่องเสมือนไม่สามารถดำเนินการ hot-plug หน่วยความจำได้เนื่องจาก memory hot-plug ถูกปิดใช้งาน โปรดหยุดเครื่องเสมือนแล้วลองดำเนินการ memory hot-plug อีกครั้ง", + "ORG_ZSTACK_COMPUTE_VM_10124": "เครื่องเสมือนไม่สามารถดำเนินการ CPU hot addition ได้เนื่องจาก CPU hot addition ถูกปิดใช้งาน โปรดหยุด VM แล้วลองดำเนินการ CPU hot addition อีกครั้ง", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10069": "รหัสสถานะ [%s] ไม่ถูกต้อง รองรับเฉพาะ [รหัสสถานะที่ถูกต้องในสภาพแวดล้อม cloud computing]", + "ORG_ZSTACK_COMPUTE_VM_10122": "reservedMemorySize[%s] มากกว่า memorySize[%s]", + "ORG_ZSTACK_COMPUTE_VM_10132": "%s ไม่ใช่ IPv6 address ที่ถูกต้องสำหรับการกำหนดค่าทรัพยากร cloud", + "ORG_ZSTACK_COMPUTE_VM_10131": "ip address [%s] ไม่อยู่ใน ip range [%s] ที่ระบุ", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10074": "loadBalancer[%s] listener[%s] ไม่รองรับการกำหนด session persistence state จำเป็นต้องกำหนด explicit iphash", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10075": "session persistence type[%s] ไม่ถูกต้อง รองรับเฉพาะ %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10072": "session persistence status [%s] ไม่ถูกต้อง รองรับเฉพาะ %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10073": "loadBalancer[%s] listener[%s] ไม่รองรับการกำหนด session persistence state จำเป็นต้องกำหนด explicit disable", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10078": "session cookie name[%s] ไม่ถูกต้อง ต้องประกอบด้วยตัวอักษรและตัวเลขเท่านั้น", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10079": "loadBalancer[%s] listener[%s] ไม่รองรับการกำหนด idle timeout และ cookie name พร้อมกัน", + "ORG_ZSTACK_COMPUTE_VM_10139": "IPv6 address ต้องมี prefix length", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10076": "session idle timeout[%s] ไม่ถูกต้อง ต้องเป็นจำนวนเต็มบวกระหว่าง [%s~%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10077": "session cookie name[%s] ไม่ถูกต้อง ต้องสั้นกว่า [%d] ตัวอักษร", + "ORG_ZSTACK_COMPUTE_VM_10137": "IPv4 address ต้องมี subnet mask", + "ORG_ZSTACK_COMPUTE_VM_10136": "ที่อยู่ IP แบบคงที่ [%s] มีรูปแบบไม่ถูกต้อง", + "ORG_ZSTACK_COMPUTE_VM_10135": "ไม่สามารถตั้งค่าที่อยู่ IP สำหรับอินสแตนซ์ได้ เนื่องจากไม่ได้ระบุที่อยู่ IP กรุณาตรวจสอบให้แน่ใจว่ามีการระบุที่อยู่ IP ก่อนดำเนินการกำหนดค่าการตั้งค่าเครือข่าย", + "ORG_ZSTACK_COMPUTE_VM_10134": "ที่อยู่ IP [%s] ไม่อยู่ในช่วง IP ที่กำหนด [startIp %s, endIp %s]", + "ORG_ZSTACK_COMPUTE_VM_10133": "ที่อยู่ IP [%s] ถูกกำหนดให้กับ VM NIC [uuid:%s] แล้ว", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10081": "loadBalancer[%s] listener[%s] ไม่รองรับการกำหนด idle timeout และชื่อ cookie เมื่อ session persistence ถูกปิดใช้งาน", + "ORG_ZSTACK_COMPUTE_VM_10143": "ไม่สามารถคืนค่า IP แบบคงที่ [%s] สำหรับ VM [uuid:%s] ได้เนื่องจากไม่มีอยู่จริง", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10082": "loadBalancer[%s] listener[%s] ไม่รองรับการกำหนด session persistence rewrite โดยไม่ระบุชื่อ cookie", + "ORG_ZSTACK_COMPUTE_VM_10142": "VM[uuid:%s] ไม่มี network interface ที่เชื่อมต่อกับ L3 network[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10080": "loadBalancer[%s] listener[%s] ไม่รองรับการกำหนด idle timeout และชื่อ cookie กรุณาระบุ session persistence", + "ORG_ZSTACK_COMPUTE_VM_10140": "ที่อยู่ IP [%s] ถูกกำหนดให้กับ vmNic แล้ว", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10085": "loadBalancer[%s] listener[%s] ไม่รองรับการกำหนด session persistence policies เมื่ออัลกอริทึมการ load balancing เป็นแบบ source-based", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10086": "loadBalancer[%s] ไม่รองรับการใช้ session persistence แบบ iphash สำหรับ listener[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10083": "loadBalancer[%s] listener[%s] ไม่รองรับการกำหนด session persistence idle timeout โดยไม่ระบุโหมด rewrite", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10084": "loadBalancer[%s] listener[%s] ไม่รองรับการกำหนด session persistence ด้วย cookieName โดยไม่ระบุโหมด insert", + "ORG_ZSTACK_COMPUTE_VM_10149": "ประเภทสื่อของ Image ไม่รองรับ: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10087": "ค่า maximum connection [%s] ไม่ถูกต้อง ค่าที่ระบุเกินขีดจำกัดสูงสุด %d", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10088": "conflict loadBalancerPort[%s] listener[uuid:%s] อื่นกำลังใช้งานพอร์ตนั้นอยู่", + "ORG_ZSTACK_COMPUTE_VM_10147": "VM %s ที่มี memory snapshots ไม่รองรับการตั้งค่า boot volume", + "ORG_ZSTACK_COMPUTE_VM_10146": "volume[uuid:%s] ต้องถูก attach กับ virtual machine[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10145": "boot volume ของอินสแตนซ์นี้ไม่สามารถกำหนดค่าเป็น shareable ได้", + "ORG_ZSTACK_COMPUTE_VM_10144": "boot device [%%s] ไม่ถูกต้องใน boot order %%s", + "ORG_ZSTACK_VMWARE_10024": "ไม่สามารถ synchronize ได้ก่อนที่ datastores จะถูก isolate", + "ORG_ZSTACK_VMWARE_10025": "มีงานกำลังดำเนินอยู่บน vCenter[uuid:%s] กรุณาลองใหม่ภายหลัง", + "ORG_ZSTACK_VMWARE_10023": "เชื่อมต่อ vCenter ล้มเหลว: %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10008": "ไม่สามารถเริ่มต้น SDN controller ได้เนื่องจากไม่มี VNI ranges ที่กำหนดค่าบน controller [ip:%s]", + "ORG_ZSTACK_VMWARE_10020": "ไม่มีพอร์ต VNC ที่ว่างสำหรับ virtual machine %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10009": "ไม่สามารถดึงข้อมูล VNI range จาก SDN controller [ip:%s] ได้เนื่องจาก %s", + "ORG_ZSTACK_VMWARE_10021": "get service instance สำหรับ vCenter %s ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10092": "cloud สร้าง load balancer listener ล้มเหลวเนื่องจาก listener ที่ใช้โปรโตคอล TCP รองรับเฉพาะ TCP proxy protocol parameters", + "ORG_ZSTACK_MEVOCO_10006": "ไม่รองรับการดำเนินการสำหรับการตั้งค่า multiQueues ของ virtio-scsi volume[%s] ในสภาพแวดล้อม cloud computing", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10093": "ไม่สามารถสร้าง load balancer listener ได้เนื่องจากระบบรองรับเฉพาะ TCP proxy protocol %s", + "ORG_ZSTACK_MEVOCO_10005": "การดำเนินการไม่ได้รับการสนับสนุนสำหรับการตั้งค่า root volume[%s] ให้ใช้ multiple queues", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10091": "การสร้างทรัพยากร cloud computing ล้มเหลวเนื่องจาก listener ที่มี protocol HTTPS รองรับเฉพาะ HTTP versions [h1, h2] โปรดตรวจสอบความเข้ากันได้ของคำขอของคุณ", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10010": "ไม่สามารถสร้าง hardware VXLAN network ได้เนื่องจาก H3C tenant UUID เป็นพารามิเตอร์ที่จำเป็นสำหรับ H3C VCFC V2 controller โปรดระบุ UUID ที่จำเป็นเพื่อดำเนินการต่อ", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10096": "load balancer listener ประเภท %s ไม่จำเป็นต้องใช้ certificate", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10097": "loadbalancer listener [uuid:%s] มี certificate[uuid:%s] อยู่แล้ว", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10094": "cloud ไม่สามารถสร้าง load balancer listener ได้เนื่องจาก listener ที่มี protocol [%s] ไม่รองรับการบีบอัดเนื้อหา", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10095": "cloud ไม่สามารถสร้าง load balancer listener ได้เนื่องจากระบบรองรับเฉพาะ compression algorithms [%s]", + "ORG_ZSTACK_MEVOCO_10007": "สำหรับ shareable volume ประเภท primary storage ที่รองรับเพียงอย่างเดียวคือ %s ปัจจุบันคือ %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10015": "ไม่สามารถสร้าง VNI range ได้เนื่องจาก L2 network [uuid:%s] ที่ระบุไม่ใช่ instance ของ VXLAN network pool", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10016": "ไม่สามารถสร้าง VNI range [%s-%s] ได้เนื่องจาก H3C controllers ใช้ VNI เป็น VLAN ID และ range ต้องอยู่ภายใน 1-4094 ค่า VNI ควรเป็นไปตามมาตรฐาน VLAN ID สำหรับการใช้งาน virtual network", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10017": "ไม่สามารถสร้าง VNI range [%s-%s] ได้เนื่องจากไม่ครอบคลุมโดย VNI ที่กำหนดค่าไว้ของ SDN controller ทุกตัว", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10098": "certificate [uuid:%s] ไม่ได้เชื่อมโยงกับ load balancer listener [uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10018": "ไม่สามารถเพิ่ม IPv6 range ได้เนื่องจาก SDN controller [uuid:%s] ไม่ทำงาน สถานะปัจจุบัน: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10099": "healthCheck target [%s] ผิดพลาด ต้องเป็น 'default' หรือหมายเลข port ระหว่าง [1~65535]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10011": "ไม่สามารถสร้าง hardware VXLAN network ได้เนื่องจาก tenant ที่ระบุไม่มีอยู่ในระบบจัดการ SDN controller โปรดตรวจสอบ tenant ID และตรวจสอบว่ากำหนดค่าถูกต้องในสภาพแวดล้อม cloud", + "ORG_ZSTACK_MEVOCO_10002": "ไม่พบ IOPS mode จาก VolumeQoS ที่เป็นค่าว่าง", + "ORG_ZSTACK_VMWARE_10017": "L2[UUID:%s] ไม่ได้อยู่ใน vCenter[UUID:%s] cluster[UUID:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10012": "ไม่สามารถสร้าง VXLAN network ได้เนื่องจาก SDN controller [ip:%s] ไม่ตอบสนอง", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10013": "ไม่สามารถสร้าง VXLAN network บน SDN controller [IP:%s] ได้เนื่องจาก %s", + "ORG_ZSTACK_MEVOCO_10000": "ZStack ถูกหยุดชั่วคราวและ API calls ทั้งหมดยกเว้นการดำเนินการแบบ read-only จะถูกปฏิเสธ หากคุณต้องการดำเนินการที่ไม่ใช่ read-only โปรดเพิ่ม '%s' ไปยัง systemTags", + "ORG_ZSTACK_VMWARE_10015": "ไม่พบ hosts ใน compute cluster: %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10014": "ไม่สามารถลบ VXLAN network บน SDN Controller [IP:%s] ได้เนื่องจาก %s", + "ORG_ZSTACK_VMWARE_10016": "ไม่พบ vSwitch/dvSwitch: %s หรือ vSwitch บน ESX host ที่แตกต่างไม่มี port group เดียวกัน", + "ORG_ZSTACK_VMWARE_10013": "NIC driver %s ยังไม่ได้รับการสนับสนุน", + "ORG_ZSTACK_VMWARE_10014": "Cluster[uuid:%s] และ Layer 2 Network[uuid:%s] อยู่ใน Data Centers ที่แตกต่างกัน", + "ORG_ZSTACK_VMWARE_10011": "domainName[%s] ไม่ใช่ DNS hostname หรือ IP address ที่ถูกต้อง", + "ORG_ZSTACK_VMWARE_10012": "vCenter [Domain Name:%s] ถูกเพิ่มแล้ว", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10019": "ไม่สามารถเพิ่ม IPv6 range โดยใช้ network CIDR ได้เนื่องจาก SDN controller [uuid:%s] ไม่ได้เชื่อมต่อ สถานะปัจจุบัน: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10000": "ไม่พบ baremetal gateway ที่ว่างสำหรับคำขอนี้ โปรดตรวจสอบว่า baremetal nodes ของคุณกำหนดค่าอย่างถูกต้องและลงทะเบียนกับสภาพแวดล้อม cloud computing", + "ORG_ZSTACK_VMWARE_10010": "ต้องระบุชื่อผู้ใช้สำหรับเข้าสู่ระบบ vCenter", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10002": "ไม่สามารถจัดสรรทรัพยากร BareMetal2 gateway ได้", + "ORG_ZSTACK_CORE_DEBUG_10000": "ไม่พบข้อมูลงาน (%s) ในสภาพแวดล้อมการประมวลผลแบบคลาวด์ โปรดตรวจสอบว่ารายละเอียดงานที่จำเป็นทั้งหมดได้รับการกำหนดค่าและอัปโหลดอย่างถูกต้อง", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10020": "ไม่สามารถเพิ่มช่วง IP ได้เนื่องจาก SDN controller [uuid:%s] ไม่ได้เชื่อมต่อ สถานะปัจจุบัน: %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10021": "ไม่สามารถเพิ่มช่วง IP ตาม network CIDR ได้เนื่องจาก SDN controller [uuid:%s] ไม่ได้เชื่อมต่อ สถานะปัจจุบัน: %s", + "ORG_ZSTACK_MEVOCO_10014": "แบนด์วิดธ์เครือข่ายไม่ถูกต้อง[%s] ไม่ใช่ค่าตัวเลข", + "ORG_ZSTACK_MEVOCO_10019": "แบนด์วิดธ์วอลุ่มไม่ถูกต้อง[%s] ต้องมีค่ามากกว่าหรือเท่ากับ 1024 Mbps", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10028": "ไม่สามารถดึงข้อมูล tenants ได้เนื่องจาก SDN controller [ip:%s] ไม่ตอบสนอง", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10029": "ไม่สามารถเริ่มต้น SDN controller ได้เนื่องจากไม่มี default tenant ที่กำหนดค่าบน controller [ip:%s]", + "ORG_ZSTACK_VMWARE_10009": "รหัสผ่าน console ไม่รองรับโดยเครื่องเสมือน [UUID:%s] บน ESX Host [ESXi Version:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10022": "ไม่สามารถสร้าง Layer 3 network ได้เนื่องจาก H3C VCFC V2 SDN controller ไม่รองรับ Layer 3 networking [type:%s, category:%s]", + "ORG_ZSTACK_MEVOCO_10013": "แบนด์วิดธ์เครือข่ายไม่ถูกต้อง[%s] ต้องมีค่ามากกว่าหรือเท่ากับ %d Mbps", + "ORG_ZSTACK_VMWARE_10006": "ไม่สามารถดึงสถิติการใช้งาน root disk ของ VM[%s] ได้", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10023": "ไม่สามารถสร้าง hardware VXLAN network ได้เนื่องจาก tenant UUID เป็นพารามิเตอร์ที่จำเป็นสำหรับ H3C VCFC V2 controller โปรดตรวจสอบว่าได้ระบุแล้ว", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10024": "ไม่สามารถเพิ่ม H3C VCFC controller ได้เนื่องจาก VDS UUID system tag จำเป็นสำหรับ H3C VCFC V1 controllers", + "ORG_ZSTACK_VMWARE_10005": "ไม่สามารถดึง VM instance จาก install path: %s ได้", + "ORG_ZSTACK_VMWARE_10002": "ไม่พบ virtual datacenter", + "ORG_ZSTACK_VMWARE_10000": "ไม่พบ virtual disk management service", + "ORG_ZSTACK_VMWARE_10001": "ไม่มี file manager ที่กำหนดค่าสำหรับการดำเนินงาน cloud storage โปรดตรวจสอบว่ามี file manager ที่ถูกต้องตั้งค่าเพื่อจัดการการดำเนินงาน %s", + "ORG_ZSTACK_VPC_HA_VYOS_10000": "ไม่สามารถเปิดใช้งาน HA บน virtual router[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10011": "nfv instance [uuid:%s] อยู่ในสถานะ %s ที่ไม่สามารถทำ HTTP call ไปยัง %s ได้", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10010": "NFV instance [name:%s, UUID:%s, current state:%s] ไม่ได้ทำงานอยู่และไม่สามารถดำเนินการที่ร้องขอได้ โปรดลองใหม่อีกครั้งเมื่อ instance ทำงานอยู่", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10013": "ไม่สามารถเพิ่ม network interface [ip:%s, mac:%s] ไปยัง NFV instance [uuid:%s ip:%s] ได้ เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10012": "nfv instance [uuid:%s] ไม่มี management network interface ที่สามารถทำ HTTP call ไปยัง %s ได้", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10004": "ไม่สามารถกำหนด primary node สำหรับ Software-Defined Network (SDN) controller [ip:%s] ได้เนื่องจาก %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10005": "ไม่สามารถยืนยันตัวตนกับ SDN controller ได้เนื่องจาก controller [IP:%s] ไม่ตอบสนอง", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_10000": "vm[uuid:%s] storage migration long-running job[uuid:%s] ล้มเหลวเนื่องจาก management node รีสตาร์ท", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10006": "ไม่สามารถยืนยันตัวตนกับ SDN Controller [IP:%s] ได้เนื่องจาก %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10007": "ไม่สามารถดึงข้อมูล VNI range ได้เนื่องจาก SDN controller [ip:%s] ไม่ตอบสนอง", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10000": "ไม่สามารถเพิ่มช่วง IP ได้เนื่องจากการสร้าง subnet ล้มเหลวบน SDN controller โปรดตรวจสอบการกำหนดค่าเครือข่ายหรือติดต่อฝ่ายสนับสนุนเพื่อขอความช่วยเหลือ", + "ORG_ZSTACK_COMPUTE_VM_10103": "ไม่สามารถเปลี่ยนเป็นเครือข่าย L3 ได้ เครือข่าย L3 [uuid:%s] เป็นเครือข่ายระบบและ VM เป็น VM ของผู้ใช้", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10015": "ไม่พบ VMInstanceSpec ในพารามิเตอร์ข้อมูล flow โปรดตรวจสอบว่าข้อกำหนดที่จำเป็นทั้งหมดรวมอยู่แล้ว", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10001": "ไม่สามารถเพิ่มช่วง IP ไปยังเครือข่ายได้เนื่องจาก %s", + "ORG_ZSTACK_COMPUTE_VM_10102": "ไม่สามารถสลับไปยังเครือข่าย L3 ได้ เครือข่าย L3 ที่มี UUID [uuid:%s] ถูกปิดใช้งาน", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10014": "ไม่สามารถลบ image [UUID:%s] ได้เนื่องจากมีการใช้งานโดยกลุ่มอินสแตนซ์ NFV [UUID:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10002": "ไม่สามารถลบช่วง IP จากเครือข่าย Layer 3 ได้เนื่องจาก %s", + "ORG_ZSTACK_COMPUTE_VM_10101": "ไม่สามารถสลับไปยังเครือข่าย L3 ที่ไม่ใช่ของ guest ได้ เครือข่าย L3 ที่มี UUID [uuid:%s] เชื่อมโยงกับ VM [uuid: %s] อยู่แล้ว", + "ORG_ZSTACK_COMPUTE_VM_10100": "ไม่สามารถเปลี่ยนเป็นเครือข่าย L3 ได้ เครือข่าย L3 ที่มี UUID [uuid:%s] แนบอยู่กับ VM ที่มี UUID [%s] อยู่แล้ว", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10003": "ไม่สามารถระบุตัวนำ cluster ได้เนื่องจาก SDN controller [IP:%s] ไม่ตอบสนอง", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10016": "VM Inventory หรือ UUID เป็นค่าว่างใน VM Instance Specification", + "ORG_ZSTACK_PORTMIRROR_10008": "บริการ PortMirror ไม่รองรับ NIC [%s] เนื่องจากประเภท hypervisor ของมัน", + "ORG_ZSTACK_PORTMIRROR_10009": "บริการ PortMirror ไม่สามารถ mirror ไปยัง NIC [%s] ที่ไม่ใช่ interface ที่ไม่ใช่ค่าเริ่มต้นของ VM", + "ORG_ZSTACK_ZWATCH_API_10019": "ระยะเวลาคำถามไม่สามารถเกิน %s", + "ORG_ZSTACK_COMPUTE_VM_10198": "ไม่สามารถสร้างอินสแตนซ์ VM จาก volume ที่แชร์ได้ โปรดตรวจสอบว่า volume ไม่ได้ถูกตั้งค่าเป็น shareable แล้วลองอีกครั้ง", + "ORG_ZSTACK_PORTMIRROR_10000": "พารามิเตอร์ [%s] ไม่ถูกต้อง โปรดตรวจสอบว่าอ้างอิงถึง Port Mirroring Network ที่ถูกต้อง", + "ORG_ZSTACK_COMPUTE_VM_10197": "ต้องตั้งค่าคุณสมบัติหนึ่งในต่อไปนี้: %s", + "ORG_ZSTACK_PORTMIRROR_10001": "เครือข่าย[%s] เชื่อมโยงกับบริการ Port Mirroring อยู่แล้ว", + "ORG_ZSTACK_ZWATCH_API_10028": "บัญชี[uuid: %s] ไม่มีสิทธิ์สำหรับทรัพยากร[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10196": "ไม่สามารถกำหนดค่าคุณสมบัติต่อไปนี้พร้อมกันได้: %s", + "ORG_ZSTACK_PORTMIRROR_10002": "บริการ Port Mirroring[%s] ยังไม่ได้ถูกสร้าง", + "ORG_ZSTACK_PORTMIRROR_10003": "NIC [%(device_id)s, %(network_interface_id)s] ถูก mirror โดยบริการ [%(service_id)s] อยู่แล้ว", + "ORG_ZSTACK_COMPUTE_VM_10194": "ควรระบุอย่างน้อยหนึ่งในต่อไปนี้สำหรับ instance: architecture ใน msg หรือ image[uuid:%s]", + "ORG_ZSTACK_PORTMIRROR_10004": "NIC[%s] ไม่สามารถ mirror สำหรับบริการ[%s] ได้โดยใช้", + "ORG_ZSTACK_ZWATCH_API_10025": "label[%s] ไม่ถูกต้อง labels ที่ถามได้สำหรับ cloud resources คือ %s", + "ORG_ZSTACK_COMPUTE_VM_10193": "ควรระบุอย่างน้อยหนึ่งในต่อไปนี้สำหรับระบบปฏิบัติการ guest: ฟิลด์ guestOsType ใน msg หรือ image[uuid:%s]", + "ORG_ZSTACK_ZWATCH_API_10024": "metric[%s] ไม่มี filter[%s]", + "ORG_ZSTACK_COMPUTE_VM_10192": "ควรระบุอย่างน้อยหนึ่งในต่อไปนี้สำหรับ message หรือ image [uuid:%s]: platform หรือ imageID", + "ORG_ZSTACK_PORTMIRROR_10007": "บริการ PortMirror ไม่รองรับการ mirror NIC[%s]", + "ORG_ZSTACK_ZWATCH_API_10021": "ไม่พบ metric[%s] ใน namespace[%s]", + "ORG_ZSTACK_COMPUTE_VM_10199": "ไม่สามารถสร้างอินสแตนซ์ VM จาก volume ที่แนบได้ โปรดตรวจสอบว่า volume อยู่ในสถานะที่ใช้งานได้แล้วลองอีกครั้ง", + "ORG_ZSTACK_PORTMIRROR_10011": "บริการ PortMirror ไม่สามารถสร้าง mirror tunnel สำหรับ nic[%s] ไปยัง nic[%s] เนื่องจาก mirror network[%s] ไม่ถูกต้อง", + "ORG_ZSTACK_PORTMIRROR_10012": "บริการ PortMirror ไม่สามารถ mirror network interface [%s] ไปยังตัวเอง", + "ORG_ZSTACK_ZWATCH_API_10039": "รูปแบบ JSON สำหรับ labels ไม่ถูกต้อง โปรดตรวจสอบว่า labelsJsonStr มีรูปแบบที่ถูกต้อง", + "ORG_ZSTACK_PORTMIRROR_10013": "บริการ PortMirror ไม่สามารถใช้งานร่วมกับ network interface ที่กำหนดค่า Quality of Service (QoS)", + "ORG_ZSTACK_ZWATCH_API_10038": "namespace [%%s] ไม่มี metric [%%s]", + "ORG_ZSTACK_PORTMIRROR_10014": "ไม่สามารถลบ port mirror session[%s] จาก hypervisor ได้ รายละเอียด: %s", + "ORG_ZSTACK_ZWATCH_API_10037": "ไม่มี namespace ที่กำหนดไว้ในระบบ", + "ORG_ZSTACK_PORTMIRROR_10015": "ไม่สามารถคืน port mirror session[%s] จาก hypervisor ได้ รายละเอียด: %s", + "ORG_ZSTACK_ZWATCH_API_10036": "รูปแบบ URL ไม่ถูกต้อง; ต้องเริ่มต้นด้วย http(s)", + "ORG_ZSTACK_PORTMIRROR_10016": "ไม่พบ internal ID ของ session[uuid:%s], มี session limit เกินบน host หรือไม่???", + "ORG_ZSTACK_ZWATCH_API_10033": "endTime[%s, %sms] ต้องไม่อยู่ก่อน startTime[%s, %sms]", + "ORG_ZSTACK_ZWATCH_API_10032": "labels ของ metric[%s] ไม่มี [%s]", + "ORG_ZSTACK_ZWATCH_API_10031": "ไม่พบ namespace[%s]", + "ORG_ZSTACK_ZWATCH_API_10030": "หาก namespace ถูกตั้งค่าเป็น all ไม่รองรับการระบุ metrics และ labels", + "ORG_ZSTACK_PORTMIRROR_10010": "บริการ PortMirror ไม่สามารถ mirror NIC [%s] ซึ่งไม่ใช่ interface ของ VM ใดๆ", + "ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10009": "ไม่สามารถดึงข้อมูล PCI device จาก host[uuid:%s] ได้", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10030": "ไม่สามารถดึง default tenant จาก SDN controller [ip:%s] เนื่องจากปัญหาการสื่อสาร", + "ORG_ZSTACK_ZWATCH_API_10046": "ช่วงเวลาเกิน %d วัน", + "ORG_ZSTACK_ZWATCH_API_10045": "endTime[%s] ต้องไม่อยู่ก่อน startTime[%s]", + "ORG_ZSTACK_ZWATCH_API_10044": "instance[%s] ไม่ถูกต้อง", + "ORG_ZSTACK_ZWATCH_API_10043": "ไม่มีบันทึกการยืนยันการแจ้งเตือนของ ECS instance", + "ORG_ZSTACK_ZWATCH_API_10042": "startTime[%s] อยู่หลัง endTime[%s]", + "ORG_ZSTACK_ZWATCH_API_10041": "platform[url=%s] มีอยู่แล้ว", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10033": "ไม่สามารถลบ VXLAN network ได้เนื่องจาก SDN controller [ip:%s] ไม่ตอบสนอง", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10004": "ข้อผิดพลาดการทำงาน, VIP %s ไม่ได้ถูก bind กับ VM instance", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10000": "ไม่สามารถสร้าง port forwarding rule[vip ip: %s, private ip: %s, vip start port: %d, vip end port: %d, private start port: %d, private end port: %d] เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10001": "ไม่สามารถ revoke port forwarding rules %s เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10002": "ไม่สามารถ sync port forwarding rules ที่ให้บริการโดย virtual router[name: %s, uuid: %s] เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10003": "พบ virtual router offering [uuid:%s] สำหรับ L3 Network [uuid:%s] ใน zone [uuid:%s]; อย่างไรก็ตาม public network [uuid:%s] ของ network ไม่ตรงกับ Port Forwarding rule [uuid:%s] คุณอาจต้องระบุ virtual router offering เฉพาะโดยใช้ system tag guestL3Network::l3NetworkUuid", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10004": "virtual router ไม่รองรับ port forwarding range redirection; VIP port start ต้องเท่ากับ private port start และ VIP port end ต้องเท่ากับ private port end แต่ rule นี้มีช่วงที่ไม่ตรงกัน: VIP port [%s, %s], private port [%s, %s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10005": "ไม่สามารถเพิ่มการส่งต่อพอร์ตบนเราเตอร์เสมือน[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10006": "ไม่สามารถเพิกถอนการส่งต่อพอร์ตบนเราเตอร์เสมือน[uuid:%s], ข้อผิดพลาด: %s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10003": "ไม่สามารถยกเลิกการสร้างอุปกรณ์จัดเก็บข้อมูลรองเนื่องจาก:%s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10004": "ไม่สามารถดึงข้อมูลอุปกรณ์ MTTY จากโฮสต์[UUID:%s] ได้", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10001": "จำนวนเกินขีดจำกัด อุปกรณ์[uuid: %s] ต้องการจำนวนอุปกรณ์ SE ที่เกินจำนวนที่อนุญาต[%d]", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10002": "ไม่สามารถสร้างอุปกรณ์จัดเก็บข้อมูลเนื่องจาก:%s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10000": "หมายเลขชิ้นส่วนที่ระบุ[value:%s] ไม่ใช่ instance ID ที่ถูกต้องในสภาพแวดล้อมคลาวด์นี้", + "ORG_ZSTACK_CORE_CLOUDBUS_10021": "ข้อความไม่อยู่ในรูปแบบ JSON ที่ถูกต้อง, %s", + "ORG_ZSTACK_COMPUTE_VDPA_10009": "เฉพาะ %s เท่านั้นที่รองรับเทคโนโลยีการเร่งความเร็ว vdpa", + "ORG_ZSTACK_COMPUTE_VDPA_10007": "ไม่สามารถสร้างอุปกรณ์ PCI[uuid:%s] เนื่องจาก L2 instance อื่น[uuid:%s] กำลังใช้งาน physical network interface ที่เชื่อมต่อกับ cluster อยู่", + "ORG_ZSTACK_COMPUTE_VDPA_10006": "ไม่สามารถยกเลิกการสร้างอุปกรณ์ PCI[uuid:%s], เนื่องจาก L2 instance อื่น[uuid:%s] กำลังใช้งาน physical network interface ที่เชื่อมต่อกับ cluster อยู่", + "ORG_ZSTACK_COMPUTE_VDPA_10005": "ไม่สามารถลบ bridge[%s] สำหรับ l2Network[uuid:%s, type:%s] บน KVM host[uuid:%s], เนื่องจาก %s", + "ORG_ZSTACK_COMPUTE_VDPA_10004": "ไม่สามารถตรวจสอบ bridge[%s] สำหรับ l2NoVlanNetwork[uuid:%s, name:%s] บน KVM host[uuid: %s], %s", + "ORG_ZSTACK_COMPUTE_VDPA_10003": "ไม่สามารถสร้าง bridge[%s] สำหรับ l2Network[uuid:%s, type:%s] บน KVM host[uuid:%s], เนื่องจาก %s", + "ORG_ZSTACK_COMPUTE_VDPA_10002": "กู้คืน vdpa สำหรับ vm[uuid:%s] จาก destination host[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VDPA_10001": "คืนอุปกรณ์ vdpa สำหรับ vm[uuid:%s] บน destination host[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10152": "VM[uuid:%s] ถูกแนบกับ ISO หลายตัว, กรุณาระบุ isoUuid เมื่อต้องการถอด", + "ORG_ZSTACK_COMPUTE_VM_10151": "VM[uuid:%s] ได้ติดตั้ง ISO CD-ROM แล้ว[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10150": "virtualCDROM ที่มี UUID:%s ไม่มีอยู่", + "ORG_ZSTACK_COMPUTE_VM_10159": "ไม่สามารถแนบ Layer 3 network ได้ Layer 3 network [uuid:%s] เป็นของ Layer 2 networks [uuids:%s] ที่ยังไม่ได้แนบกับ cluster ใด", + "ORG_ZSTACK_COMPUTE_VM_10158": "ไม่สามารถแนบ Layer 3 network ได้ Layer 3 network ที่ระบุ [uuid:%s] เป็นของ Layer 2 network อื่น [uuids:%s]", + "ORG_ZSTACK_COMPUTE_VM_10157": "ไม่สามารถแนบ Layer 3 network ได้ Layer 3 network ที่ระบุ [uuid:%s] ไม่มี IP range กำหนดไว้", + "ORG_ZSTACK_COMPUTE_VM_10156": "ไม่สามารถแนบ Layer 3 network ได้ VM [uuid: %s] ไม่ได้อยู่ในสถานะ Running หรือ Stopped; สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_COMPUTE_VDPA_10015": "ไม่สามารถจัดสรร vDPAs บน host[uuid:%s] สำหรับ VM[uuid:%s]: %s", + "ORG_ZSTACK_COMPUTE_VDPA_10013": "ไม่สามารถลบ vDPAs บน host[UUID:%s] สำหรับ VM[UUID:%s]: %s", + "ORG_ZSTACK_COMPUTE_VDPA_10012": "L2 network [UUID:%s] ใน host [UUID:%s] ไม่ได้เป็น SRIOV virtualized", + "ORG_ZSTACK_COMPUTE_VDPA_10011": "cluster[uuid:%s] ไม่รองรับ ovs-dpdk", + "ORG_ZSTACK_COMPUTE_VDPA_10010": "ไม่สามารถสร้าง vSwitch ด้วย physical interface:[%s] เนื่องจากกำลังถูกใช้งานโดย vSwitch ประเภทอื่นอยู่", + "ORG_ZSTACK_COMPUTE_VM_10163": "ไม่สามารถแนบ Layer 3 network ได้ Layer 3 network ที่มี UUID [uuid:%s] เป็น system network, ในขณะที่ VM เป็น user VM", + "ORG_ZSTACK_COMPUTE_VM_10162": "ไม่สามารถแนบ Layer 3 network ได้ Layer 3 network ที่มี UUID [%s] ถูกปิดใช้งานอยู่", + "ORG_ZSTACK_COMPUTE_VM_10161": "ไม่สามารถแนบเครือข่าย L3 ที่ไม่ใช่ของ guest เข้ากับเครื่องเสมือนได้ เนื่องจากมันถูกแนบเข้ากับเครื่องเสมือนอื่นแล้ว (uuid: %s)", + "ORG_ZSTACK_COMPUTE_VM_10160": "ไม่สามารถแนบเครือข่าย Layer 3 ได้ เครือข่าย Layer 3 ที่ระบุ [uuid:%s] ถูกแนบเข้ากับเครื่องเสมือน [uuid: %s] แล้ว", + "ORG_ZSTACK_COMPUTE_VM_10168": "IP แบบคงที่ [%s] ถูกกำหนดให้กับทรัพยากรบนเครือข่าย Layer 3 [uuid:%s] แล้ว", + "ORG_ZSTACK_COMPUTE_VM_10167": "IP แบบคงที่ [%s] ไม่อยู่ในช่วง IP ใดๆ ของเครือข่าย Layer 3 [uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10166": "static IP L3 UUID[%s] ไม่รวมอยู่ในรายการ NIC L3[%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10009": "IAM2ProjectVO[uuid:%s] ไม่อยู่ในสถานะ %s ไม่อนุญาตให้เปลี่ยนสถานะ", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10008": "โปรเจกต์ [UUID:%s, Name:%s] มีการกำหนดกลยุทธ์การหมดอายุการเข้าสู่ระบบอยู่แล้ว", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10007": "วันที่หรือเวลาไม่ถูกต้อง [%s] ไม่สามารถเร็วกว่าเวลาปัจจุบัน [%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10006": "ค่าการใช้จ่ายไม่ถูกต้อง [%s] ควรอยู่ในรูปแบบเช่น 10.001", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10005": "ค่าการใช้จ่ายไม่ถูกต้อง [%s] ค่าการใช้จ่ายควรอยู่ระหว่าง 0 และ %f", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10004": "เวลาไม่ถูกต้อง [%s] ควรอยู่ในรูปแบบเช่น 10m, 1h, หรือ 2d", + "ORG_ZSTACK_CORE_CLOUDBUS_10001": "สำหรับ webhook ประเภท[%s] ไม่สามารถให้ฟิลด์ opaque เป็นค่าว่างได้", + "ORG_ZSTACK_COMPUTE_VM_10176": "ไม่สามารถแนบ NIC ได้ เครือข่าย L2 [uuid:%s] ของมันยังไม่ได้แนบเข้ากับคลัสเตอร์ compute ใดๆ", + "ORG_ZSTACK_ZWATCH_API_10007": "ไม่สามารถละเว้นพารามิเตอร์ dataStartTime และ dataEndTime ได้ โปรดตรวจสอบให้แน่ใจว่ามีการระบุค่า", + "ORG_ZSTACK_COMPUTE_VM_10175": "ไม่สามารถแนบ NIC ได้ เครือข่าย Layer 3 [uuid:%s] เป็นเครือข่ายระบบ ในขณะที่ VM เป็น VM ของผู้ใช้", + "ORG_ZSTACK_ZWATCH_API_10006": "ไม่สามารถละเว้น dataUuid ได้", + "ORG_ZSTACK_COMPUTE_VM_10174": "ไม่สามารถแนบ nic ได้ เครือข่าย Layer 3 [uuid:%s] ถูกปิดใช้งานอยู่", + "ORG_ZSTACK_COMPUTE_VM_10173": "ไม่สามารถแนบ NIC เข้ากับเครือข่าย L3 ที่ไม่ใช่ของ guest ได้ เครือข่าย L3 [uuid:%s] ถูกแนบเข้ากับ VM [uuid:%s] แล้ว", + "ORG_ZSTACK_COMPUTE_VM_10172": "เครือข่าย L3 ที่มี UUID [%s] ถูกแนบเข้ากับ VM อื่นที่มี UUID [%s] อยู่แล้ว โปรดถอดจาก VM ที่มีอยู่ก่อนแนบเข้ากับ VM ใหม่", + "ORG_ZSTACK_COMPUTE_VM_10171": "NIC ถูกแนบเข้ากับ VM [UUID: %s] แล้ว โปรดตรวจสอบให้แน่ใจว่า NIC ไม่ได้ถูกแนบอยู่ก่อนพยายามแนบอีกครั้ง", + "ORG_ZSTACK_COMPUTE_VM_10170": "ไม่สามารถแนบ nic ได้ VM[uuid: %s] ไม่อยู่ในสถานะ Running หรือ Stopped สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10011": "โปรเจกต์ [UUID:%s, Name:%s] มีนโยบายการเกษียณอายุกำหนดไว้แล้ว", + "ORG_ZSTACK_COMPUTE_VM_10179": "ไม่สามารถถอดเครือข่าย L3 ออกจาก VM [uuid: %s] ได้ VM ไม่อยู่ในสถานะ Running หรือ Stopped สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_COMPUTE_VM_10178": "ไม่สามารถอัปเดตสถานะอินเทอร์เฟซเครือข่าย [uuid: %s] ได้ เนื่องจากประเภทอินเทอร์เฟซเครือข่าย [%s] ไม่รองรับ", + "ORG_ZSTACK_CORE_UPGRADE_10000": "Api: %s ไม่ได้รับอนุญาตตามรายการ allowedApiListGrayscaleUpgrading ที่อนุญาต: %s", + "ORG_ZSTACK_CORE_UPGRADE_10003": "ไม่พบเวอร์ชันของ agent การอัปเกรดระบบปฏิบัติการของคลัสเตอร์ไม่รองรับระหว่างการอัปเกรดแบบเทียบสี โปรดตรวจสอบให้แน่ใจว่าติดตั้งเวอร์ชัน agent แล้วก่อนเริ่มกระบวนการอัปเกรด", + "ORG_ZSTACK_CORE_UPGRADE_10002": "ปิดการใช้งานการอัปเกรดแบบเทียบสีโดย %s ก่อนที่คุณต้องการอัปเกรดระบบปฏิบัติการของ hosts ทั้งหมดของคลัสเตอร์ หรืออีกทางหนึ่ง ลองอัปเกรดระบบปฏิบัติการของคลัสเตอร์ด้วย UUID ของ host เฉพาะแทน", + "ORG_ZSTACK_CORE_UPGRADE_10004": "Host[UUID: %s] เวอร์ชัน agent ยังไม่ได้อัปเกรด โปรดเชื่อมต่อ host ใหม่ก่อนดำเนินการอัปเดตระบบปฏิบัติการ", + "ORG_ZSTACK_ZWATCH_API_10008": "dataStartTime[%s] มาหลัง dataEndTime[%s]", + "ORG_ZSTACK_COMPUTE_VM_10187": "เมื่อ imageUuid เป็น null จำเป็นต้องมี placeholder_for_image_uuid", + "ORG_ZSTACK_COMPUTE_VM_10186": "ดิสก์รูทหายไป โปรดตรวจสอบว่ามีโวลูมรูทติดตั้งอยู่กับอินสแตนซ์ของคุณ", + "ORG_ZSTACK_COMPUTE_VM_10185": "การกำหนดค่าสำหรับดิสก์ข้อมูลไม่ถูกต้อง ขนาดที่ระบุใน dataDiskSizes ต้องมากกว่า 0", + "ORG_ZSTACK_COMPUTE_VM_10182": "การตั้งค่าโวลูมรูทไม่ถูกต้อง", + "ORG_ZSTACK_COMPUTE_VM_10181": "ประเภทสื่อของอิมเมจเป็น ISO แต่การตั้งค่าดิสก์รูทหายไป", + "ORG_ZSTACK_COMPUTE_VM_10180": "vm[uuid:%s] สามารถต่อโวลูมได้เฉพาะเมื่อสถานะเป็น Running หรือ Stopped เท่านั้น สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10003": "วันที่ไม่ถูกต้อง[%s] ควรอยู่ในรูปแบบ yyyy-MM-dd HH:mm:ss ZZZ", + "ORG_ZSTACK_ZWATCH_API_10010": "ชื่อ namespace ไม่สามารถเริ่มต้นด้วยคำสงวน เช่น %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10002": "ความหมายไม่ถูกต้อง[%s] ความหมายที่อนุญาตได้สำหรับการระบุโควต้าทรัพยากรหรือเมทริกซ์ในสภาพแวดล้อมคลาวด์", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10001": "ค่าพารามิเตอร์ไม่ถูกต้อง, %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10000": "ระบุค่าขีดจำกัดทรัพยากรไม่ถูกต้อง คาดหวังค่าตัวเลขโดยไม่มีคำต่อท้าย 'at', 'after' หรือ 'exceed' โปรดให้ตัวเลขที่ถูกต้อง", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10030": "PXE Server DHCP Interface %s ไม่มีอยู่ หรือไม่มี IP address", + "ORG_ZSTACK_NETWORK_OVN_10012": "ไม่สามารถเพิ่ม SDN host เพราะ network interface [%s] มี IP address [%s] อยู่แล้ว", + "ORG_ZSTACK_NETWORK_OVN_10011": "ไม่สามารถเพิ่ม SDN host เพราะ NIC[%s] อยู่ในสถานะ SR-IOV virtualized", + "ORG_ZSTACK_NETWORK_OVN_10010": "ไม่สามารถเพิ่ม SDN host เพราะประเภท [%s] ของ NIC[%s] ถูกใช้สำหรับ Linux bonding", + "ORG_ZSTACK_NETWORK_OVN_10016": "การเพิ่ม SDN host ล้มเหลวเพราะเฉพาะ KVM hosts รองรับ OVS DPDK", + "ORG_ZSTACK_APIMEDIATOR_10000": "พบ Backup Storage instance มากกว่าหนึ่งตัวบน host เดียวกันที่ระบุด้วย hostname มี SftpBackupStorage [hostname:%s] อยู่แล้ว ประเภท Backup Storage ที่จะเพิ่มคือ %s", + "ORG_ZSTACK_NETWORK_OVN_10015": "ไม่สามารถเพิ่ม SDN host เพราะ bond mode[%s] ไม่รองรับโดย OVN", + "ORG_ZSTACK_NETWORK_OVN_10014": "ไม่สามารถเพิ่ม SDN host เพราะ NIC[%s] ถูกใช้สำหรับ VXLAN VTEP interface", + "ORG_ZSTACK_NETWORK_OVN_10013": "ไม่สามารถเพิ่ม SDN host เพราะ NIC[%s] ถูกต่อกับ L2 network[name:%s]", + "ORG_ZSTACK_APIMEDIATOR_10001": "พบบริการ Backup Storage มากกว่าหนึ่งตัวบน host เดียวกันที่ระบุด้วย hostname มีบริการ Image Store Backup Storage [hostname:%s] อยู่แล้ว ประเภท Backup Storage ที่จะเพิ่มคือ %s", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10031": "%s ~ %s ไม่สามารถเชื่อมต่อกับ DHCP interface %s", + "ORG_ZSTACK_NETWORK_OVN_10019": "host ที่มี UUID [%s] ใน cluster ที่มี UUID [%s] ไม่ได้เปิดใช้งาน hugepages ดังนั้นจึงไม่ได้รับอนุญาตให้เพิ่มเข้า SDN controller", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10032": "cluster[uuid:%s] และ pxeserver[uuid:%s] ไม่ได้อยู่ใน zone เดียวกัน", + "ORG_ZSTACK_NETWORK_OVN_10018": "ไม่สามารถเพิ่ม SDN host เพราะไม่ได้ระบุ network mask %s", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10033": "cluster[uuid:%s] ไม่ใช่ baremetal cluster", + "ORG_ZSTACK_NETWORK_OVN_10017": "ไม่สามารถเพิ่ม SDN host เพราะไม่ได้กำหนดค่า VTEP IP", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10034": "baremetal PXE server [uuid:%s] ติดตั้งอยู่กับ cluster [uuid:%s] แล้ว", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10035": "baremetal PXE server [UUID: %s] ไม่เข้ากันกับ baremetal instances ใน cluster [UUID: %s] เพราะ IP %s ของ NIC ที่มีอยู่อยู่นอกช่วง DHCP ของ PXE server (%s ~ %s)", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10036": "baremetal PXE server [UUID: %s] ไม่ได้เชื่อมโยงกับ cluster [UUID: %s]", + "ORG_ZSTACK_STORAGE_MIGRATION_10030": "primary storage ปลายทางไม่ได้ติดตั้งกับ cluster ที่มี level 2 networks เดียวกันกับ cluster ต้นทาง", + "ORG_ZSTACK_STORAGE_MIGRATION_10033": "ไม่รองรับการย้ายข้อมูลขณะที่ volume แบบแชร์[uuid: %s, name: %s] ถูกต่ออยู่", + "ORG_ZSTACK_STORAGE_MIGRATION_10034": "ไม่สามารถย้าย volume จาก instance ต้นทางไปยัง instance เป้าหมายได้", + "ORG_ZSTACK_STORAGE_MIGRATION_10031": "Volume [UUID:%s] ยังคงถูกต่อกับ VM [UUID:%s] อยู่ กรุณาถอดการเชื่อมต่อก่อนการย้าย", + "ORG_ZSTACK_STORAGE_MIGRATION_10032": "ไม่สามารถย้าย data volume[uuid:%s] ระหว่าง shared block primary storages ขณะที่ virtual machine[vmuuid:%s] หยุดทำงานไม่อยู่", + "ORG_ZSTACK_STORAGE_MIGRATION_10035": "ไม่สามารถย้าย volume[%s] ได้เนื่องจากสถานะเป็น Disabled", + "ORG_ZSTACK_STORAGE_MIGRATION_10036": "ไม่มี host ที่พร้อมสำหรับ block-based live migration: %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10019": "ไม่พบ SNSTextTemplate ที่มี UUID:%s อาจถูกลบหรือนำออกจาก cloud storage แล้ว", + "ORG_ZSTACK_NETWORK_OVN_10023": "ไม่สามารถแก้ไข vmnic เป็น l3network [uuid:%s] ได้เนื่องจาก host [uuid:%s] ที่เชื่อมโยงกับ virtual machine ไม่ได้เชื่อมต่อกับ SDN controller [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10028": "ไม่สามารถสร้างการเชื่อมต่อกับ %s ได้ กรุณาตรวจสอบการกำหนดค่าเครือข่ายระหว่าง ZStack management node และ bare-metal PXE server", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10016": "application platform/endpoint [%s] ไม่รองรับ user-defined templates", + "ORG_ZSTACK_NETWORK_OVN_10022": "ไม่สามารถแก้ไข VMNIC เป็น L3 network [UUID:%s] ได้เนื่องจากไม่พบ SDN controller [UUID:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10029": "ไม่พบ local repository ภายใต้ /opt/zstack-dvd ของ %s กรุณาดาวน์โหลด zStack ISO และสร้าง local repository ก่อน", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10015": "application platform type[%s] ไม่ถูกต้อง", + "ORG_ZSTACK_NETWORK_OVN_10021": "ไม่สามารถต่อ L3 network กับ VM ได้เนื่องจาก host [uuid:%s] ของ VM ไม่ได้ต่อกับ SDN controller [uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10018": "ไม่พบ topic[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10020": "ไม่สามารถต่อ L3 network กับ VM ได้เนื่องจากไม่พบ SDN controller [uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10017": "parameters: %s ไม่ได้รับการรองรับจาก ZStack ค่าที่ใช้ได้สำหรับ parameters คือ: %s", + "ORG_ZSTACK_NETWORK_OVN_10026": "ไม่สามารถซิงโครไนซ์ network quality of service settings ไปยัง ovn controller[uuid:%s, ip:%s] ได้ เนื่องจาก %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10011": "Sms template code ควรเป็น string ที่มีความยาว 13 ตัวอักษร แต่ event template code ที่ให้มา: [%s] มี [%d] ตัวอักษร", + "ORG_ZSTACK_NETWORK_OVN_10025": "ไม่สามารถดึง NIC QoS จาก OVN controller[uuid:%s, ip:%s] ได้ เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_OVN_10024": "ไม่สามารถตั้งค่า NIC QoS บน OVN controller[uuid:%s, ip:%s] ได้ เนื่องจาก %s", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10020": "backup storage type ไม่รองรับสำหรับ bare-metal server", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10010": "Sms template code ควรมีความยาว 13 ตัวอักษร ได้รับ alarm template code: [%s] ที่มี [%d] ตัวอักษร", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10023": "PXE Server DHCP Range Netmask %s ไม่ถูกต้องสำหรับ virtual machine deployment", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10024": "PXE Server DHCP Range Start %s และ Range Stop %s ไม่ได้อยู่ใน subnet mask เดียวกัน", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10025": "PXE Server ที่มี hostname นี้มีอยู่แล้ว", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10026": "มี Baremetal2 gateway ที่มี management IP %s อยู่แล้ว; กรุณาอย่าใช้ IP นี้สร้าง Baremetal PXE server", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10027": "storagePath ต้องเป็น absolute path ที่ระบุตำแหน่งที่อยู่ถัดไปใน virtual file system", + "ORG_ZSTACK_STORAGE_MIGRATION_10022": "Image[uuid:%s] ไม่พบใน source backup storage[uuid:%s]", + "ORG_ZSTACK_STORAGE_MIGRATION_10023": "ไม่สามารถย้าย image จาก source location ไปยัง destination location ได้", + "ORG_ZSTACK_STORAGE_MIGRATION_10020": "แหล่งจัดเก็บบล็อกและแหล่งจัดเก็บบล็อกปลายทางต้องไม่ถูกปิดใช้งาน", + "ORG_ZSTACK_STORAGE_MIGRATION_10021": "Image[uuid:%s] ไม่อยู่ในสถานะ Ready จึงไม่สามารถย้ายได้", + "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10001": "ไม่ได้รับ heartbeat ของ host %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10026": "Volume[uuid:%s] ไม่อยู่ในสถานะ Ready และไม่สามารถย้ายได้", + "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10000": "ไม่พบ host ID สำหรับ host UUID[%s] และ primary storage UUID[%s]", + "ORG_ZSTACK_STORAGE_MIGRATION_10027": "ไม่สามารถย้าย root volume ของ virtual machine instance ได้เมื่อมันไม่อยู่ในสถานะ stopped กรุณาแน่ใจว่า instance หยุดทำงานแล้วก่อนที่จะพยายามย้าย root volume", + "ORG_ZSTACK_STORAGE_MIGRATION_10024": "Volume[uuid:%s] อยู่ใน Pool[uuid:%s] อยู่แล้ว ไม่สามารถย้ายได้", + "ORG_ZSTACK_STORAGE_MIGRATION_10025": "Source และ Destination PowerShell sessions ต้องไม่อยู่ในสถานะ Disabled หรือ Maintenance", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10009": "ความยาวของ Alibaba Cloud SMS sign ต้องอยู่ระหว่าง 2 ถึง 12 ตัวอักษร ได้รับ sign: [%s] ที่มี [%d] ตัวอักษร", + "ORG_ZSTACK_STORAGE_MIGRATION_10028": "การย้าย storage ของ VM ไม่รองรับสำหรับ VM[uuid:%s, name: %s] เมื่อมี shared volume ติดอยู่", + "ORG_ZSTACK_STORAGE_MIGRATION_10029": "ไม่สามารถย้าย root volume ของ VM instance ที่มี data volumes ติดอยู่ได้ กรุณาถอด data volumes ทั้งหมดออกก่อนที่จะย้าย root volume", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10017": "ล้มเหลวในการ mount baremetal cache ของ image[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10019": "ไม่มีพื้นที่เพียงพอใน baremetal image cache สำหรับ image[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10011": "ล้มเหลวในการสร้าง DHCP configuration สำหรับ chassis [uuid:%s] บน PXE server [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10012": "ล้มเหลวในการลบ DHCP configuration ของ chassis[uuid:%s] บน PXE server[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10013": "UUID ของ baremetal PXE server agent เปลี่ยนแปลงแล้ว [คาดหวัง: %s, จริง: %s] นี่อาจเกิดจากการ restart agent ด้วยตนเอง กรุณาเชื่อมต่อใหม่เพื่อซิงโครไนซ์สถานะ", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10005": "ไม่พบ directory: %s ใน dashboard", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10016": "ไม่สามารถเชื่อมต่อกับ baremetal PXE server [url:%s] เพราะ %s", + "ORG_ZSTACK_LICENSE_10002": "รหัสคำขอ license %s ที่ให้มาไม่ถูกต้องสำหรับการจัดสรร cloud resource กรุณาตรวจสอบและลองใหม่", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10003": "sqlite3 execution ล้มเหลวเนื่องจาก: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10000": "method ที่ไม่รองรับ: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10001": "http request error! รหัสสถานะ: %s, ข้อผิดพลาด: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10011": "Ceph backup storage ที่ติดตั้งไม่รองรับการย้าย storage แบบ ISO-based", + "ORG_ZSTACK_STORAGE_MIGRATION_10015": "ไม่รองรับการย้าย storage จาก [%s] ไปยัง [%s] virtual environment", + "ORG_ZSTACK_STORAGE_MIGRATION_10016": "VM[uuid:%s] กำลังทำงานแต่ไม่พบ host UUID", + "ORG_ZSTACK_STORAGE_MIGRATION_10013": "ไม่รองรับการย้าย storage จาก [%s] ไปยัง [%s] พร้อมกับ data volumes", + "ORG_ZSTACK_STORAGE_MIGRATION_10014": "ไม่รองรับการย้าย storage จาก [%s] ไปยัง [%s] โดยใช้ snapshots", + "ORG_ZSTACK_STORAGE_MIGRATION_10019": "Source BS และ Target BS ไม่สามารถเป็นตัวเดียวกันได้", + "ORG_ZSTACK_STORAGE_MIGRATION_10017": "รองรับเฉพาะ data volume live storage migration โดยใช้ parameter dataVolumes", + "ORG_ZSTACK_STORAGE_MIGRATION_10018": "ไม่รองรับ live storage migration จาก [%s] ไปยัง [%s] สำหรับ volumes ที่ไม่ใช่ root volume", + "ORG_ZSTACK_NETWORK_OVN_10001": "ไม่สามารถเพิ่ม VM NIC ไปยังกลุ่มความปลอดภัยได้เนื่องจาก VM NIC SDN [uuid:%s] ไม่ตรงกับกลุ่มความปลอดภัย SDN [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10006": "ล้มเหลวในการสร้าง bm instance nginx proxy บน baremetal pxeserver[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10000": "ไม่สามารถแนบ L3 network ไปยังกลุ่มความปลอดภัยได้เนื่องจาก L3 network SDN [uuid:%s] ไม่ตรงกับกลุ่มความปลอดภัย SDN [uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10007": "ล้มเหลวในการลบ bm instance nginx proxy บน baremetal pxeserver[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10008": "ล้มเหลวในการเริ่มต้น baremetal PXE server[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10009": "ล้มเหลวในการหยุด baremetal PXE server[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10005": "ไม่สามารถสร้างกลุ่มความปลอดภัยได้เนื่องจากไม่พบ OVS controller[uuid:%s, type: %s]", + "ORG_ZSTACK_NETWORK_OVN_10004": "ไม่สามารถสร้างกลุ่มความปลอดภัยได้เนื่องจากระบุ OVN controller แล้ว โปรดตรวจสอบให้แน่ใจว่าไม่ได้ระบุ OVN controller เมื่อสร้างกลุ่มความปลอดภัย", + "ORG_ZSTACK_NETWORK_OVN_10003": "ไม่สามารถลบ host ได้เนื่องจากมี OVN controller instances %d ตัวที่ทำงานอยู่บน host", + "ORG_ZSTACK_NETWORK_OVN_10002": "ไม่สามารถสร้าง Layer 3 network ได้เนื่องจาก OVN ไม่รองรับ L3 type: %s, category: %s", + "ORG_ZSTACK_NETWORK_OVN_10009": "ไม่สามารถเพิ่ม SDN host ได้เนื่องจากไม่พบ network interface [%s]", + "ORG_ZSTACK_NETWORK_OVN_10008": "ไม่สามารถสร้าง SDN L2 network ได้เนื่องจากไม่พบ SDN controller UUID โปรดตรวจสอบให้แน่ใจว่า SDN controller UUID ถูกกำหนดค่าอย่างถูกต้อง", + "ORG_ZSTACK_NETWORK_OVN_10007": "ไม่สามารถแนบ network service[%s] ไปยัง OVS network ได้", + "ORG_ZSTACK_GUESTTOOLS_PVPANIC_10000": "ไม่สามารถ deploy virtual machines ได้โดยไม่มี source file path ที่ถูกต้อง", + "ORG_ZSTACK_NETWORK_OVN_10006": "ไม่สามารถแนบ OVN network service ไปยัง network ที่มี vSwitchType[%s] ได้", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10001": "ล้มเหลวในการเริ่มต้น configurations บน baremetal PXE server[uuid:%s]", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_MARKETPLACE_10000": "filterName ต้องถูกตั้งค่าเป็น marketplace:true หรือ marketplace:false เพื่อการกรองที่ถูกต้องใน marketplace service", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10002": "ล้มเหลวในการสร้าง baremetal instance configurations บน pxeserver[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10003": "ล้มเหลวในการลบ baremetal instance configurations บน pxeserver[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10004": "ล้มเหลวในการสร้าง BM instance NOVA proxy บน baremetal PXE server[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10005": "ล้มเหลวในการลบ bm instance novnc proxy บน baremetal pxeserver[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_10005": "L3Network[uuid:%s] ไม่ได้เปิดใช้งาน network service[type:%s] หรือไม่มี provider ที่ให้บริการ network service นี้", + "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10000": "ไม่รองรับ capability: SEND_SNS_MESSAGE", + "ORG_ZSTACK_NETWORK_SERVICE_10004": "ล้มเหลวในการใช้งาน network service[%s] กับ virtual machine[uuid: %s]", + "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10001": "ล้มเหลวในการส่ง SNS notification บน plugin %s", + "ORG_ZSTACK_NETWORK_SERVICE_10007": "network service สำหรับ provider[uuid:%s] ต้องถูกกำหนด", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10021": "ไม่พบ baremetal2 provisioning network ใน cluster[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10020": "ไม่พบ Baremetal2 gateway ที่ใช้งานได้ใน cluster[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_10001": "L3Network [UUID: %s] ไม่ได้กำหนดค่า host route service", + "ORG_ZSTACK_NETWORK_SERVICE_10000": "L3Network [UUID: %s] ให้ type เป็น null", + "ORG_ZSTACK_LICENSE_10019": "พบ host vendor ที่ไม่คาดหมายสำหรับ template MINI VM", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10022": "เครือข่าย provisioning ของ baremetal2 [uuid:%s] ไม่สามารถใช้งานได้; กรุณาตรวจสอบว่าเปิดใช้งานอยู่", + "ORG_ZSTACK_NETWORK_SERVICE_10009": "ผู้ให้บริการเครือข่ายที่มี UUID [%s] ไม่มีบริการสำหรับ %s", + "ORG_ZSTACK_NETWORK_OVN_10052": "ล้มเหลวในการลบพอร์ต OVS ไปยัง host [uuid:%s] สำหรับ nics [%s], ข้อผิดพลาด: %s", + "ORG_ZSTACK_NETWORK_SERVICE_10008": "ไม่พบผู้ให้บริการเครือข่าย[uuid:%s] หรือไม่มีบริการใดๆ", + "ORG_ZSTACK_NETWORK_OVN_10051": "ล้มเหลวในการลบพอร์ต OVS บน host [UUID:%s] สำหรับ NICs [%s], ข้อผิดพลาด: %s", + "ORG_ZSTACK_NETWORK_OVN_10050": "ล้มเหลวในการซิงโครไนซ์พอร์ต OVS กับ host[uuid:%s] สำหรับ network interfaces [%s], ข้อผิดพลาด: %s", + "ORG_ZSTACK_NETWORK_OVN_10056": "สถานะคลัสเตอร์คำถามสำหรับการตรวจสอบข้อผิดพลาดโหนดที่ถูกเตะออก %s", + "ORG_ZSTACK_NETWORK_OVN_10055": "ล้มเหลวในการซิงโครไนซ์การตั้งค่า Quality of Service ไปยัง OVN controller[uuid:%s, ip:%s], ข้อผิดพลาด: %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORK_10000": "ไม่สามารถกำหนดค่าเครือข่าย VXLAN สำหรับเครื่องเสมือน [uuid:%s] บน destination host [uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10054": "ล้มเหลวในการตั้งค่า OVS port requested chassis ไปยัง host[uuid:%s] สำหรับ LSP[%s], ข้อผิดพลาด: %s", + "ORG_ZSTACK_NETWORK_OVN_10053": "ล้มเหลวในการตั้งค่า OVS port requested chassis บน host[uuid:%s] สำหรับ LSP[%s], ข้อผิดพลาด: %s", + "ORG_ZSTACK_NETWORK_OVN_10059": "ล้มเหลวในการเพิ่ม DHCP options ไปยัง OVN controller[uuid:%s, ip:%s], เพราะ %s", + "ORG_ZSTACK_NETWORK_OVN_10058": "ได้รับผลลัพธ์สถานะคลัสเตอร์ว่างเปล่าจาก agent; กรุณาตรวจสอบการกำหนดค่าและการเชื่อมต่อของ agent", + "ORG_ZSTACK_NETWORK_OVN_10057": "ล้มเหลวในการดึงสถานะคลัสเตอร์: %s", + "ORG_ZSTACK_NETWORK_SERVICE_10010": "บริการเครือข่าย [%s] ได้ถูกแนบไปกับเครือข่าย Layer 3 [UUID: %s]", + "ORG_ZSTACK_LICENSE_10023": "ล้มเหลวในการลบ license สำหรับเครื่องเสมือน %s เนื่องจากข้อผิดพลาดที่ไม่รู้จัก กรุณาติดต่อฝ่ายสนับสนุนเพื่อขอความช่วยเหลือ", + "ORG_ZSTACK_LICENSE_10003": "ระบุ timestamp ไม่ถูกต้อง กรุณาตรวจสอบว่าเป็นไปตามมาตรฐาน ISO 8601 (YYYY-MM-DDTHH:mm:ss)", + "ORG_ZSTACK_LICENSE_10004": "ได้รับความยาวไฟล์ license ที่ถอดรหัสที่ไม่คาดหมาย: %d คาดหมายความยาวที่ถูกต้องสำหรับบริการ cloud computing", + "ORG_ZSTACK_LICENSE_10005": "การถอดรหัสล้มเหลวเพราะ %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10010": "ไม่พบ chassis server ทางกายภาพที่พร้อมใช้งานในคลัสเตอร์ baremetal2[uuids:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_10012": "networkServices ต้องไม่ว่างเปล่า", + "ORG_ZSTACK_NETWORK_SERVICE_10011": "มี IP address ไม่เพียงพอสำหรับการจัดสรรเมื่อแนบบริการ DHCP ไปยังเครือข่าย L3 [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_10014": "ไม่สามารถหา NetworkService Dhcp Backend [provider type: %s]", + "ORG_ZSTACK_NETWORK_OVN_10062": "ล้มเหลวในการ ping OVN controller[uuid:%s, ip:%s], เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_OVN_10061": "ไม่สามารถส่งคำสั่งไปยัง OVN controller[uuid:%s, ip:%s], NfvInstanceGroup[uuid:%s, name:%s] สถานะเป็น %s, เฉพาะกลุ่มที่มีสถานะ Healthy หรือ Degraded เท่านั้นที่รับคำสั่งได้", + "ORG_ZSTACK_NETWORK_OVN_10060": "ovn controller[uuid:%s] ไม่ได้เชื่อมต่อ, สถานะปัจจุบัน: %s", + "ORG_ZSTACK_NETWORK_OVN_10067": "IP [%s] ไม่ใช่ Virtual IP ที่ถูกต้องในสภาพแวดล้อมปัจจุบัน กรุณาใช้ Virtual IP address ของ NFV Instance Group", + "ORG_ZSTACK_NETWORK_OVN_10066": "ไม่พบเครื่องเสมือน [uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10064": "ไม่พบ network interface ของเครื่องเสมือน [internalName:%s]", + "ORG_ZSTACK_NETWORK_OVN_10069": "ไม่สามารถ ping SDN controller ได้, ข้อผิดพลาด: %s", + "ORG_ZSTACK_NETWORK_OVN_10068": "", + "ORG_ZSTACK_CORE_10000": "IP [%s] ไม่ได้เชื่อมโยงกับ OVN SDN Controller NFV Instance Group ใดๆ โปรดใช้ VIP address ของ OVN Controller NFV Instance Group", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10016": "", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10018": "ไม่พบ executor สำหรับ resource UUID[%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10017": "", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10000": "ชื่อ bond %s มีอยู่แล้ว", + "ORG_ZSTACK_LICENSE_10037": "", + "ORG_ZSTACK_LICENSE_10038": "ไม่พบ baremetal2 chassis ที่มี UUID [%s], อาจไม่มีอยู่จริง", + "ORG_ZSTACK_LICENSE_10039": "", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10001": "nic ที่มี MAC address ได้ถูก bond แล้ว", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10000": "", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10003": "ไม่สามารถตรวจสอบ universal SMS กับ supplier[%s] ได้", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10002": "", + "ORG_ZSTACK_NETWORK_OVN_10032": "MN[uuid:%s]: CloudInstanceNotDefinedException", + "ORG_ZSTACK_NETWORK_OVN_10031": "", + "ORG_ZSTACK_NETWORK_OVN_10038": "มี Management Node หลายตัว แต่มี license ให้สำหรับ %s เท่านั้น", + "ORG_ZSTACK_NETWORK_OVN_10035": "", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10005": "สภาพแวดล้อม MN HA แต่มี license ที่อัปเดตสำหรับ %s เท่านั้น", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10004": "", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10006": "สถาปัตยกรรม CPU ของ host [arch:%s] และ cluster [arch:%s] ไม่ตรงกัน", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10009": "", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10008": "รูปแบบข้อมูลฮาร์ดแวร์ baremetal2 chassis ไม่ถูกต้อง: %s", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10002": "", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10001": "รูปแบบข้อมูลฮาร์ดแวร์ NIC ของ baremetal2 chassis ไม่ถูกต้อง: %s", + "ORG_ZSTACK_CORE_GC_10001": "", + "ORG_ZSTACK_LICENSE_10046": "รองรับเฉพาะ baremetal2 chassis ที่มี boot mode %s เท่านั้น", + "ORG_ZSTACK_LICENSE_10028": "", + "ORG_ZSTACK_LICENSE_10029": "ไม่สามารถกำหนดค่า OVN cluster nodes สำหรับ NFV Instance [UUID:%s] ได้ เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_OVN_10041": "", + "ORG_ZSTACK_NETWORK_OVN_10040": "ไม่พบ Management IP สำหรับการถอด NFVI Instance [UUID:%s]", + "ORG_ZSTACK_NETWORK_OVN_10045": "ไม่สามารถเริ่มต้นบริการ Open vSwitch บน host[uuid:%s], ข้อผิดพลาด: %s", + "ORG_ZSTACK_NETWORK_OVN_10043": "ไม่สามารถติดตั้งแพ็คเกจ ovs บน host[uuid:%s], ข้อผิดพลาด: %s", + "ORG_ZSTACK_NETWORK_OVN_10042": "ไม่สามารถแนบ L3 network ไปยัง security group เนื่องจาก SDN controller [uuid:%s] ไม่ได้เชื่อมต่อ [status:%s]", + "ORG_ZSTACK_NETWORK_OVN_10049": "ไม่สามารถซิงโครไนซ์พอร์ต OVS บน host [UUID:%s] สำหรับ network interfaces [%s], ข้อผิดพลาด: %s", + "ORG_ZSTACK_NETWORK_OVN_10048": "ไม่สามารถเพิ่มพอร์ต OVS บน host [UUID:%s] สำหรับ NICs [%s], ข้อผิดพลาด: %s", + "ORG_ZSTACK_NETWORK_OVN_10047": "ไม่สามารถเพิ่มพอร์ต OVS บน host [UUID:%s] สำหรับ NICs [%s], ข้อผิดพลาด: %s", + "ORG_ZSTACK_LICENSE_10030": "ไม่พบหรืออัปเดต License ของ UKey สำเร็จ กรุณาตรวจสอบว่า UKey ของคุณเชื่อมต่ออย่างถูกต้องและมี License สำหรับบริการ cloud computing", + "ORG_ZSTACK_LICENSE_10031": "อัปเดต License ของ virtual machine ในเครื่อง: %s", + "ORG_ZSTACK_LICENSE_10032": "ไม่พบ compute instance ที่พร้อมใช้งานสำหรับอัปเดต UKey", + "ORG_ZSTACK_GUESTTOOLS_KVM_10001": "ไม่สามารถถอด guest tools ออกจาก virtual machine[uuid:%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10000": "ไม่สามารถดึงข้อมูล guest tools จาก vm[uuid:%s], เหตุผล:%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10033": "pci device id[%s] ไม่ใช่จำนวนเต็มที่ถูกต้องใน tag[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10034": "ข้อกำหนดอุปกรณ์ mdev พร้อม UUID [%s] ไม่มีอยู่", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10031": "PCI device ID หายไปใน tag[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10032": "PCI device ID ต้องมากกว่า 0 ใน tag[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10030": "ข้อกำหนดอุปกรณ์ pci [uuid:%s] ไม่มีอยู่, มาจาก tag [%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10006": "ไม่สามารถดึงสถานะ guest tools จาก prometheus: [metric=%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10005": "ไม่สามารถถอด guest tools ISO ออกจาก VM[UUID:%s], เพราะ:%s", + "ORG_ZSTACK_GUESTTOOLS_KVM_10004": "ไม่สามารถแนบ guest tools ISO ไปยัง VM[UUID:%s], เพราะ:%s", + "ORG_ZSTACK_GUESTTOOLS_KVM_10003": "ไม่สามารถดาวน์โหลด guest tools ISO เนื่องจากไม่พบ KVM host [uuid:%s]", + "ORG_ZSTACK_LICENSE_10048": "หมดอายุ License: License ของสภาพแวดล้อม cloud computing ของคุณหมดอายุแล้ว กรุณาติดต่อฝ่ายสนับสนุนเพื่อต่ออายุ License", + "ORG_ZSTACK_LICENSE_10049": "ไม่รองรับ: ลบ license[%s] จาก hardware key", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10024": "ไม่มีข้อกำหนดอุปกรณ์ PCI สำหรับ virtual machine[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10025": "ข้อกำหนดอุปกรณ์ PCI [uuid:%s] ไม่พร้อมใช้งานสำหรับ virtual machine [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10023": "ไม่สามารถดึงข้อกำหนดอุปกรณ์ PCI ที่พร้อมใช้งานสำหรับ VM[uuid:%s]: %s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10020": "vm instance [uuid:%s, state:%s] ต้องถูกปิดเครื่องเพื่อลบข้อกำหนดอุปกรณ์ mdev [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10027": "volume[uuid:%s, installPath:%s] ไม่อยู่ใน directory %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10026": "host[uuid:%s] อาจมีการ mount storage ที่แตกต่างจาก Storage Management Policy[uuid:%s], กรุณาตรวจสอบ", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10024": "hosts[uuid:%s] มี mount path เหมือนกันแต่ที่จริงแล้ว mount ไปยัง storage ที่แตกต่างกัน", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10028": "ข้อกำหนดอุปกรณ์ mdev [uuid:%s] ไม่พร้อมใช้งานสำหรับเครื่องเสมือน [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10029": "UUID ของข้อกำหนดอุปกรณ์ PCI หายไปในแท็ก[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10026": "ไม่มีข้อกำหนดอุปกรณ์ mdev พร้อมใช้งานสำหรับเครื่องเสมือน[uuid:%s]", + "ORG_ZSTACK_LICENSE_10050": "ไลเซนส์แพลตฟอร์มไฮบริดถูกใช้งานอยู่แล้ว กรุณาลบไลเซนส์แพลตฟอร์มไฮบริดและไลเซนส์ส่วนเสริมไฮบริดพร้อมกันโดยใช้ DeleteLicenseAction ด้วย UUID ของไลเซนส์ไฮบริด[uuid=%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10011": "เครื่องเสมือน[uuid:%s] ไม่มีข้อกำหนดอุปกรณ์ PCI[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10012": "อินสแตนซ์เครื่องเสมือน [UUID: %s, state: %s] ต้องปิดเครื่องเพื่อลบข้อกำหนดอุปกรณ์ PCI [UUID: %s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10019": "เครื่องเสมือน[uuid:%s] ไม่มีข้อกำหนดอุปกรณ์ mdev[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10017": "เครื่องเสมือน[uuid:%s] มีข้อกำหนดอุปกรณ์ mdev อยู่แล้ว [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10018": "อินสแตนซ์เครื่องเสมือน [uuid:%s, state:%s] ต้องหยุดเพื่อตั้งค่าข้อกำหนดอุปกรณ์ mdev", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10015": "อินสแตนซ์เครื่องเสมือน [uuid:%s, state:%s] ต้องหยุดเพื่อตั้งค่าข้อกำหนดอุปกรณ์ PCI", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10009": "ไม่พบกลุ่มความสัมพันธ์ [uuid:%s] กลุ่มอาจถูกลบหรือยกเลิกแล้ว", + "ORG_ZSTACK_COMPUTE_VM_10309": "IP[%s] ไม่พร้อมใช้งานบนเครือข่าย VPC[uuid:%s] เพราะ: %s", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10006": "มีเครื่องเสมือนอื่นบนโฮสต์นี้ [uuid: %s] ที่อยู่ในกลุ่มความสัมพันธ์เดียวกัน [%s]", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10005": "เครื่องเสมือน [uuid: %s] ถูกกำหนดให้กับกลุ่มความสัมพันธ์แล้ว [uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10307": "รูปแบบที่อยี่ห้อ IP คงที่[%s] ผิดพลาด", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10008": "เครื่องเสมือน [uuid:%s] ไม่ตรงตามข้อกำหนดของกลุ่มความสัมพันธ์ [uuid:%s]", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10007": "กลุ่มความสัมพันธ์[uuid:%s] จองโฮสต์[uuid:%s] สำหรับเครื่องเสมือน[uuid:%s] ไม่สำเร็จ", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10003": "สามารถระบุ UUID ของ cluster, host หรือ VM ได้ทีละรายการเท่านั้น", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10008": "เครื่องเสมือน[uuid:%s] มีข้อกำหนดอุปกรณ์ PCI อยู่แล้ว[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10006": "เครื่องเสมือนต้องอยู่ในสถานะหยุดชั่วคราวเพื่อตั้งค่าข้อกำหนดอุปกรณ์ PCI: uuid=%s, state=%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10007": "ประเภทอุปกรณ์ PCI ไม่ถูกต้อง: %s, ประเภทที่ถูกต้องสำหรับสภาพแวดล้อมการทำให้เป็นระบบคลาวด์รวมถึง: %s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10004": "ไม่พบทรัพยากรคำนวณที่เปิดใช้งาน", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10001": "ไม่สามารถลบแท็กระบบ[%s] ได้ ปลั๊กอินตัวสร้างภาระงานขึ้นอยู่กับมัน; คุณสามารถอัปเดตได้เท่านั้น", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10002": "กลุ่มความสัมพันธ์ [uuid: %s] ไม่มีอยู่", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10002": "ไม่พบ nic ที่มี UUID %s กรุณาแก้ไขแท็กเครือข่าย %s ของตัวสร้างภาระงาน", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10001": "เครื่องเสมือน [uuid: %s] เชื่อมโยงกับกลุ่มความสัมพันธ์แล้ว [uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10303": "อัปเดตลำดับความสำคัญ vm[%s] เป็น [%s] ไม่สำเร็จเพราะ %s", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10004": "ไม่สามารถดำเนินการกับกลุ่มความสัมพันธ์ [uuid: %s] ที่ไม่ได้เปิดใช้งานในสภาพแวดล้อมคลาวด์", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10000": "ไม่พบตัวสร้างภาระงาน[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10302": "เครื่องเสมือน[uuid:%s] สามารถต่ออุปกรณ์ CD-ROM ได้เท่านั้น %s ชิ้น", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10003": "ไม่สามารถดำเนินการกับกลุ่ม affinity ที่สร้างโดยระบบได้ กรุณาติดต่อฝ่ายสนับสนุนเพื่อขอความช่วยเหลือ", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10005": "อัลกอริทึมการ balance[%s] ไม่ถูกต้อง อัลกอริทึมที่ถูกต้องคือ %s", + "ORG_ZSTACK_COMPUTE_VM_10301": "VM[uuid:%s] มี ISO[uuid:%s] ติดตั้งอยู่แล้ว", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10006": "ค่า unhealthy threshold[%s] ไม่ถูกต้อง ค่าต้องเป็นตัวเลข", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10003": "น้ำหนัก load balancer[%s] ไม่ถูกต้อง instance ID ไม่อยู่ในช่วง [%d, %d]", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10000": "VM สามารถเปลี่ยนกลุ่ม affinity ได้เฉพาะในสถานะ [%s,%s] เท่านั้น แต่ VM อยู่ในสถานะ [%s] ในปัจจุบัน", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10004": "น้ำหนัก balancer[%s] ไม่ถูกต้อง ค่าไม่ใช่ตัวเลข", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10009": "ค่า connection idle timeout[%s] ไม่ถูกต้อง กรุณาตรวจสอบว่า %s เป็นค่าตัวเลข", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10007": "ค่า healthy threshold[%s] ไม่ถูกต้อง กรุณากรอกค่าตัวเลข", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10008": "ค่า healthy timeout[%s] ไม่ถูกต้อง กรุณาตรวจสอบว่า %s เป็นค่าตัวเลข", + "ORG_ZSTACK_TICKET_IAM2_10002": "ปฏิเสธการดำเนินการเนื่องจาก flow collection [uuid:%s] ไม่ได้เป็นของ project [uuid:%s]", + "ORG_ZSTACK_TICKET_IAM2_10003": "virtual instance ID [uuid:%s] ไม่ได้รับอนุญาตให้จัดการ ticket [uuid:%s, name:%s]", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10004": "Kafka topics ไม่สามารถเป็นค่าว่างได้ กรุณาตรวจสอบว่าชื่อ topic ถูกกำหนดค่าอย่างถูกต้อง", + "ORG_ZSTACK_TICKET_IAM2_10000": "ปฏิเสธการดำเนินการเนื่องจากผู้ส่ง ticket [uuid:%s] ถูกลบแล้ว; ขณะนี้อนุญาตให้ลบได้เฉพาะ ticket [uuid:%s, name:%s] เท่านั้น", + "ORG_ZSTACK_TICKET_IAM2_10001": "ปฏิเสธการดำเนินการเนื่องจาก project [UUID:%s] ที่เชื่อมโยงกับ ticket ถูกลบแล้ว ticket [UUID:%s, name:%s] สามารถลบได้เท่านั้นในตอนนี้", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10001": "Syslog mode ไม่สามารถเป็นค่าว่างได้", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10000": "index สำหรับ cloud instance ไม่สามารถเป็นค่าว่างได้ กรุณากรอกค่า index ที่ถูกต้อง", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10003": "รูปแบบของ Loki labels ควรเป็น key=value", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10002": "Loki labels ไม่สามารถเป็นค่าว่างได้ กรุณาตรวจสอบว่าค่า label ทั้งหมดถูกกำหนดอย่างถูกต้อง", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10018": "ที่อยู่ vxLAN VTEP สำหรับ host [UUID: %s] และ network pool [UUID: %s] มีอยู่แล้ว", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10017": "%s ไม่ใช่ที่อยู่ IPv4 ที่ถูกต้อง", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10016": "ip[%s] l2NetworkUuid[%s] clusterUuid[%s] ที่อยู่ IP มีอยู่ในตาราง VTEP ในเครื่องแล้ว", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10021": "ไม่สามารถสร้าง VNI range ได้เนื่องจาก L2 UUID[%s] ไม่ได้เป็นส่วนหนึ่งของ VXLAN network pool", + "ORG_ZSTACK_ALIYUN_CORE_IDENTITYZONE_10000": "ต้องระบุ zoneId สำหรับ private Aliyun VPC networks", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10012": "instance ID[%s] ไม่ถูกต้อง %s ไม่ใช่ instance identifier ที่ถูกต้อง", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10010": "ค่า health check interval[%s] ไม่ถูกต้อง ค่าต้องเป็นตัวเลข", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10011": "ค่า maximum connection[%s] ไม่ถูกต้อง กรุณาตรวจสอบว่า %s เป็นค่าตัวเลข", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10016": "health check target[%s] ไม่ถูกต้อง port[%s] ต้องเป็นค่าตัวเลข", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10017": "ไม่สามารถ attach VIP ให้ load balancer ได้เนื่องจาก VIP[%s] ไม่มีที่อยู่ IP ที่เชื่อมโยง", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10014": "health check target[%s] ไม่ถูกต้อง checking protocol[%s] ไม่ถูกต้อง protocols ที่ถูกต้องคือ %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10015": "เป้าหมายการตรวจสอบสุขภาพไม่ถูกต้อง [%s], พอร์ต [%s] อยู่นอกช่วงที่กำหนด [1, 65535]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10018": "ล้มเหลวในการแนบ IPv4 VIP ไปยัง load balancer เนื่องจาก load balancer[%s] มี IPv4 VIP[%s] อยู่แล้ว", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10009": "ล้มเหลวในการสร้าง VXLAN network pool[uuid:%s, type:%s] บน KVM host[uuid:%s], เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10019": "ล้มเหลวในการแนบ IPv6 VIP ไปยัง load balancer เนื่องจาก load balancer[%s] มี IPv6 VIP[%s] อยู่แล้ว", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10004": "ล้มเหลวในการสร้าง bridge[%s] สำหรับ l2Network[uuid:%s, type:%s, vni:%d] บน KVM host[uuid:%s], เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10003": "ล้มเหลวในการค้นหา VTEP บน host[UUID: %s], กรุณาแนบ VXLAN pool[UUID: %s] ไปยัง cluster ใหม่", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10002": "พบที่อยู่ IP ของ VTEP หลายที่ [%s] สำหรับ host เดียว [UUID:%s] กรุณาลบ host และเพิ่มใหม่อีกครั้ง", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10008": "ล้มเหลวในการตรวจสอบ cidr[%s] สำหรับ l2VxlanNetworkPool[uuid:%s, name:%s] บน kvm host[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10007": "ล้มเหลวในการลบ bridge[%s] สำหรับ l2Network[uuid:%s, type:%s, vni:%s] บน KVM host[uuid:%s], เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10006": "ล้มเหลวในการตรวจสอบ cidr[%s] สำหรับ l2VxlanNetwork[uuid:%s, name:%s] บน kvm host[uuid:%s], %s", + "ORG_ZSTACK_CRYPTO_CCS_10001": "user[uuid=%s] ไม่มีอยู่ในสภาพแวดล้อม cloud", + "ORG_ZSTACK_CRYPTO_CCS_10002": "UUID ของ certificate หายไปและ UKey system tag ไม่มีอยู่ กรุณาตรวจสอบว่าทั้งสองถูกกำหนดค่าอย่างถูกต้อง", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10020": "cloud ไม่สามารถลบ vip[%s] ได้", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10023": "ตรวจพบความไม่ตรงกันของประเภท service provider load balancer [uuid:%s] ให้บริการโดย service provider [type:%s], แต่มีการพยายามใช้ service provider ใหม่ของ [type:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10024": "มี listener ที่มีพอร์ตเดียวกัน [%s] และ load balancer เดียวกัน [UUID:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10022": "ไม่สามารถดึงประเภท service provider สำหรับ load balancer listener [uuid:%s] ได้", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10027": "น้ำหนัก balancer ไม่ถูกต้องสำหรับ network interface: %s, %d อยู่นอกช่วงที่กำหนด [%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10028": "ไม่สามารถดึง candidate vmnic ได้เนื่องจากทั้ง load balancer UUID และ server group UUID ไม่ได้ระบุ กรุณาตรวจสอบว่า identifiers เหล่านี้ถูกระบุอย่างถูกต้อง", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10026": "พารามิเตอร์การตรวจสอบสุขภาพไม่ถูกต้อง[%s], รูปแบบควรเป็น method:URI:status_codes, ตัวอย่างเช่น GET:/index.html:http_2xx", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10029": "ไม่สามารถดึง candidate Layer 3 network ได้เนื่องจากทั้ง Load Balancer UUID และ Server Group UUID ไม่ได้ระบุ", + "ORG_ZSTACK_CRYPTO_CCS_10008": "certificate[uuid=%s] ไม่พบใน certificate store", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10030": "ไม่สามารถถอด VM NIC ออกจาก load balancer listener[uuid:%s] ได้เนื่องจาก default server group ที่เชื่อมโยงกับ listener ถูกลบไปแล้ว", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10031": "ไม่สามารถสร้าง load balancer ได้เนื่องจากพารามิเตอร์ VIP และ IPv6 VIP ว่างเปล่า กรุณาระบุที่อยู่ IP ที่ถูกต้อง", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10034": "Load balancer VIP [%s] ต้องไม่เป็นที่อยู่ IP แรกหรือสุดท้ายภายใน CIDR block ที่เชื่อมโยงกับประเภท public address pool", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10035": "cloud ล้มเหลวในการสร้าง loadbalancer เนื่องจาก param vipUuid ชี้ไปยัง VIP[%s] ไม่ใช่ IPv4 virtual machine interface", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10032": "ไม่สามารถสร้าง load balancer ได้เนื่องจาก L3 network ของ VIP และ IPv6 VIP ไม่ใช่ L3 network เดียวกัน กรุณาตรวจสอบว่าอยู่ใน L3 network เดียวกัน", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10033": "VIP [UUID:%s] ถูกใช้งานโดย network service entity อื่นแล้ว [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10038": "การดำเนินการล้มเหลว, รายการ IP ซ้ำ/ทับซ้อนใน %s ของ access control list group:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10039": "การดำเนินการล้มเหลว, รูปแบบ IP รองรับเฉพาะ ip/iprange/cidr, แต่พบ %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10036": "cloud ล้มเหลวในการสร้าง load balancer เนื่องจากพารามิเตอร์ ipv6VipUuid ชี้ไปยัง VIP [%s], ซึ่งไม่ใช่ IPv6 VIP", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10037": "การดำเนินการล้มเหลว ไม่รองรับเวอร์ชัน IP %d", + "ORG_ZSTACK_VPC_HA_10001": "ไม่สามารถอัปเดตบริการเครือข่ายนี้ได้เนื่องจาก VPC [UUID:%s] ไม่รองรับการอัปเดตเวอร์ชันของบริการเครือข่าย", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10025": "L2Network[uuid:%s] ไม่ใช่ประเภท L2VxlanNetwork", + "ORG_ZSTACK_VPC_HA_10002": "ไม่สามารถอัปเดตบริการเครือข่ายนี้ได้เนื่องจาก VPC [UUID:%s] ใช้เวอร์ชัน kernel ที่ล้าสมัย:[%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10024": "vlan[%s] ไม่ใช่ VNI ที่ถูกต้อง", + "ORG_ZSTACK_VPC_HA_10003": "ไม่สามารถใช้การแปลงที่อยู่เครือข่ายต้นทางกับเครือข่ายสาธารณะที่ไม่ใช่ค่าเริ่มต้นได้เนื่องจากคุณสมบัติ multi-SNAT ถูกปิดใช้งาน", + "ORG_ZSTACK_VPC_HA_10004": "ไม่สามารถใช้ SNAT กับ L3 Network นี้ได้เนื่องจาก L3 network [uuid:%s] เป็นเครือข่ายส่วนตัว", + "ORG_ZSTACK_VPC_HA_10005": "ไม่สามารถใช้ SNAT กับ L3 Network นี้ได้เนื่องจาก L3 network [uuid:%s] ไม่ได้แนบกับ VPC router", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10029": "รูปแบบ CIDR ไม่ถูกต้องใน system tag [%s]", + "ORG_ZSTACK_VPC_HA_10006": "ที่อยู่ IP ของ cloud monitor ไม่ถูกต้อง [%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10028": "system tag [%s] ไม่ถูกต้อง ควรเป็นหนึ่งในรายการต่อไปนี้: [EC2, GCE, AWS_VPC]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10027": "กรุณากรอก system tag หนึ่งรายการเช่น: [%s]", + "ORG_ZSTACK_VPC_HA_10008": "vpcHaRouter [uuid:%s] ถูกลบไปแล้ว", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10042": "ไม่สามารถแนบ security group [%s] ที่มี IP version ต่างกันกับ LoadBalancer [%s] ได้", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10031": "พูลเครือข่าย vXLAN ไม่รองรับการสร้าง L3 networks", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10040": "ช่วง IP [%s, %s] ทับซ้อนกับ IP เริ่มต้น: %s และ IP สิ้นสุด: %s ของ access control list group: %s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10030": "ช่วง VNI ทับซ้อนกับ %s [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10045": "redirect access-control-list groups[uuid:%s] สามารถเชื่อมโยงได้เฉพาะกับ load balancer listener และต้องกำหนดให้กับ server group", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10046": "access-control-list groups[uuid:%s] ที่แนบกับ load balancer listener[uuid:%s] ต้องเป็น HTTPS หรือ HTTP", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10043": "domain[%s], url[%s] มี redirect rule ทับซ้อน/ซ้ำกันกับ access control list group:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10044": "access-control-list groups[uuid:%s] ถูกกำหนดให้ redirect แต่รายการ access-control-list บางรายการไม่มี redirect rule และมีรายการ IP", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10049": "access-control-list groups[uuid:%s] ได้ถูกแนบกับ load balancer listener อื่นแล้ว[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10048": "access-control-list groups[uuid:%s] ไม่มี redirect rule", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10001": "บัญชีไม่มี VIP ที่ถูกกำหนด", + "ORG_ZSTACK_COMPUTE_VM_10239": "CreateVmInstanceMsg ไม่สามารถเป็น null ได้ กรุณาตรวจสอบว่าข้อความคำขอถูกเริ่มต้นอย่างถูกต้องก่อนส่งคำขอ", + "ORG_ZSTACK_COMPUTE_VM_10237": "ต้องระบุ zoneUuid เนื่องจาก image อยู่บน backup storages หลายตัว", + "ORG_ZSTACK_COMPUTE_VM_10236": "ไม่พบ Layer2 Networks ใน clusters ที่แนบกับ primary storages[uuids:%s]", + "ORG_ZSTACK_COMPUTE_VM_10235": "Primary storages ที่มี UUIDs:%s ไม่ได้แนบ cluster ใดใน zone ที่มี UUID:%s", + "ORG_ZSTACK_COMPUTE_VM_10234": "ไม่พบ primary storage ที่เข้าถึงได้สำหรับ backup storage[uuid:%s, type:%s]", + "ORG_ZSTACK_COMPUTE_VM_10233": "Image ที่มี UUID [uuid:%s] ไม่ได้เก็บอยู่บน backup storage ใดที่แนบกับ zone ที่มี UUID [uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10232": "ใบรับรอง Spice TLS ไม่มีอยู่ กรุณาตรวจสอบว่า Spice TLS เปิดใช้งานอยู่หรือไม่", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10002": "ไม่สามารถสร้างอินสแตนซ์ virtual router ได้เนื่องจากเครือข่าย virtual router ทับซ้อนกับเครือข่ายส่วนตัวในการกำหนดค่า IP %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10001": "ล้มเหลวในการลบ Virtual Router Bootstrap ISO[%s] บนโฮสต์ KVM[uuid:%s] สำหรับ virtual router[uuid:%s] เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10000": "ล้มเหลวในการสร้าง Virtual Router Bootstrap ISO[%s] บนโฮสต์ KVM[uuid:%s, ip:%s] สำหรับ virtual router[uuid:%s] เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10005": "เครือข่ายของอินสแตนซ์ virtual router ที่มี UUID:%s ไม่สามารถเป็นเครือข่ายเดียวกันกับเครือข่าย L3 ส่วนตัว UUID:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10004": "ไม่พบข้อเสนออินสแตนซ์ virtual router ที่มี UUID:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10009": "ไม่สามารถเพิ่มช่วง IP ได้เนื่องจากเครือข่าย L3 [UUID:%s] เป็นเครือข่ายการจัดการของ virtual router", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10008": "ไม่สามารถเพิ่มช่วง IP ได้เนื่องจากเครือข่าย L3 [UUID:%s] เป็นเครือข่ายการจัดการของข้อเสนอ virtual router", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10007": "ล้มเหลวในการเริ่มต้น virtual router L3 [UUID: %s]", + "ORG_ZSTACK_COMPUTE_VM_10242": "ล้มเหลวในการจัดการคู่คีย์ SSH เมื่อสร้าง VM เนื่องจาก [%s]", + "ORG_ZSTACK_COMPUTE_VM_10241": "ล้มเหลวในการจัดการ system tag เมื่อสร้าง VM เนื่องจาก [%s]", + "ORG_ZSTACK_COMPUTE_VM_10240": "ล้มเหลวในการสร้าง system tag สำหรับเครื่องเสมือนเนื่องจาก %s", + "ORG_ZSTACK_COMPUTE_VM_10249": "cpuCores ต้องเป็นค่าจำนวนเต็มที่ถูกต้อง", + "ORG_ZSTACK_COMPUTE_VM_10248": "cpuSockets ต้องเป็นจำนวนเต็มบวกที่แสดงจำนวนซ็อกเก็ต CPU", + "ORG_ZSTACK_COMPUTE_VM_10247": "อุปกรณ์บูต [%s] ไม่ถูกต้องในรายการลำดับบูต [%s]", + "ORG_ZSTACK_COMPUTE_VM_10246": "ตรวจพบความขัดแย้งสำหรับ hostname ใน system tag; เครื่องเสมือนอื่นที่มี UUID %s มี hostname %s อยู่แล้วบนเครือข่าย L3 UUID %s", + "ORG_ZSTACK_COMPUTE_VM_10245": "อนุญาตให้มี system tag สำหรับ hostname ได้เพียงหนึ่งรายการ แต่ได้รับ %s", + "ORG_ZSTACK_COMPUTE_VM_10244": "hostname [%s] ที่ระบุใน system tag ไม่ใช่ชื่อโดเมนที่ถูกต้อง", + "ORG_ZSTACK_COMPUTE_VM_10243": "ไม่สามารถเปิดใช้งานฟังก์ชันนี้ เครื่องเสมือน [uuid: %s] มีการ์ดเครือข่ายหลายตัว (NIC) ที่เชื่อมโยงกับเครือข่าย L3 [uuid: %s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10013": "ล้มเหลวในการอัปเดตเครือข่ายเริ่มต้นของ virtual router [uuid:%s] เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10012": "ล้มเหลวในการแนบบริการเครือข่าย virtual router กับ l3Network[uuid:%s] การเลือก Port forwarding ต้องการการกำหนดค่า_snat", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10011": "ล้มเหลวในการแนบบริการเครือข่าย virtual router กับ l3Network[uuid:%s] เมื่อเลือก Elastic IP (EIP) ต้องกำหนดค่า Source Network Address Translation (SNAT) ด้วย", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10010": "ไม่สามารถเพิ่มรูปภาพได้เนื่องจาก system tag [%s] มีประเภทรูปภาพอุปกรณ์ [%s] ที่ไม่ถูกต้อง", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10017": "virtual router [name:%s, uuid:%s, current state:%s] ไม่พร้อมใช้งานและไม่สามารถดำเนินการที่ต้องการได้ กรุณาลองใหม่เมื่อกำลังทำงาน", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10015": "ล้มเหลวในการซิงโครไนซ์ VIP [ips: %s] บน virtual router [uuid:%s] สำหรับการย้ายร้อน virtual router เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10014": "VirtualMachineType %s ไม่ถูกต้อง", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10000": "ไม่สามารถเปลี่ยนเจ้าของทรัพยากรได้เนื่องจากอินสแตนซ์เครื่องเสมือน [uuid:%s] ได้เชื่อมโยงกับ security group แล้ว", + "ORG_ZSTACK_TEST_COMPUTE_HOSTALLOCATOR_10000": "โดยตั้งใจ: การดำเนินการนี้เป็นไปตามการออกแบบสถาปัตยกรรมการคำนวณบนคลาวด์ของเรา กรุณาตรวจสอบให้แน่ใจว่าการกำหนดค่าเครื่องเสมือนทั้งหมดเป็นไปตามมาตรฐานความปลอดภัยและประสิทธิภาพของเรา", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10019": "virtual router[uuid:%s] ขาด NIC การจัดการที่สามารถสร้างการเรียก HTTP ไปยัง %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10018": "virtual router [uuid: %s] อยู่ในสถานะ %s ที่ไม่สามารถสร้างการเรียก HTTP ไปยัง %s", + "ORG_ZSTACK_COMPUTE_VM_10253": "อนุญาตให้มีแท็กระบบ bootMode ได้เพียงหนึ่งเท่านั้น แต่พบ %d แท็ก", + "ORG_ZSTACK_COMPUTE_VM_10252": "เครื่องเสมือนควรมีแท็กระบบข้อมูลผู้ใช้ได้มากที่สุดหนึ่งแท็ก", + "ORG_ZSTACK_COMPUTE_VM_10251": "มีแท็กระบบที่ผู้ใช้กำหนดไว้แล้วสำหรับ VM[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10250": "cpuThreads ต้องเป็นค่าจำนวนเต็ม", + "ORG_ZSTACK_COMPUTE_VM_10259": "การเปลี่ยนเส้นทาง USB ไม่ถูกต้อง[%s], %s ไม่ใช่แท็ก USBRedirect ที่ถูกต้อง", + "ORG_ZSTACK_COMPUTE_VM_10258": "พารามิเตอร์ไม่ถูกต้อง[%s], ค่า [%s] ไม่ใช่ประเภทบูลีน", + "ORG_ZSTACK_COMPUTE_VM_10257": "รูปแบบแท็กไม่ถูกต้อง[%s]", + "ORG_ZSTACK_COMPUTE_VM_10256": "ประเภทเครื่อง vm ต้องการ [q35, pcie, virtual], แต่ได้ [%s]", + "ORG_ZSTACK_COMPUTE_VM_10254": "[%s] ที่ระบุในแท็กระบบ [%s] ไม่ใช่โหมดบูตที่ถูกต้องสำหรับการจัดเตรียมอินสแตนซ์คลาวด์", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10020": "ไม่สามารถเพิ่มอินเทอร์เฟซเครือข่าย [ip:%s, ip6:%s, mac:%s] ไปยังเราเตอร์เสมือนสำหรับเครื่องเสมือน [uuid:%s ip:%s] เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10024": "ไม่สามารถตั้งค่าเครือข่ายเริ่มต้นได้เนื่องจาก L3 UUID[:%s] อ้างถึงเครือข่ายการจัดการ", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10023": "l3 UUID [%s] ไม่ได้เชื่อมโยงกับเราเตอร์เสมือน [UUID:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10022": "l3 uuid[:%s] เหมือนกับเครือข่ายเริ่มต้นของเราเตอร์เสมือน [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10021": "ไม่สามารถเพิ่ม IP เซิร์ฟเวอร์ไปยังกลุ่มเซิร์ฟเวอร์ตัวสร้างภาระได้เนื่องจากตัวสร้างภาระที่ใช้ร่วมกันไม่มีผู้ให้บริการ โปรดตรวจสอบให้แน่ใจว่าได้เพิ่มอินเทอร์เฟซเครือข่ายเสมือน (VMNIC) ก่อน", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10010": "ไม่สามารถสร้าง VIP ได้เนื่องจากไม่สามารถระบุเวอร์ชันเครือข่ายเสมือนได้ โปรดตรวจสอบการตั้งค่าการกำหนดค่าเครือข่ายของคุณ", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10012": "ผู้ให้บริการของ VIP[UUID:%s, name:%s, IP:%s] ถูกตั้งค่าเป็น %s แล้ว", + "ORG_ZSTACK_TICKET_EXECUTOR_10001": "ไม่สามารถดึงค่าจากเหตุการณ์ได้: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10025": "ไม่สามารถตั้งค่าเครือข่ายเริ่มต้นได้เนื่องจาก l3 UUID[:%s] ไม่ใช่เครือข่ายสาธารณะ", + "ORG_ZSTACK_TICKET_EXECUTOR_10000": "ไม่พบคลาส API [name:%s] ใน namespace ที่ระบุ โปรดตรวจสอบให้แน่ใจว่าชื่อคลาสและ namespace ถูกต้อง", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10016": "ไม่สามารถตั้งค่ากลุ่มความปลอดภัย VM NIC ได้เนื่องจาก VM NIC [uuid:%s] ไม่ได้แนบอยู่กับกลุ่มความปลอดภัยใด", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10015": "ไม่สามารถตั้งค่ากลุ่มความปลอดภัย VM NIC ได้เนื่องจากไม่พบ VM NIC [UUID:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10007": "requiredIp[%s] ไม่ใช่ที่อยู่ IPv4 ที่ถูกต้อง", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10018": "ไม่สามารถตั้งค่ากลุ่มความปลอดภัย VM NIC ได้เนื่องจากลำดับความสำคัญไม่ถูกต้อง; ลำดับความสำคัญ[%d] ต้องมากกว่าหรือเท่ากับ 1", + "ORG_ZSTACK_COMPUTE_10003": "แบนด์วิดท์ขาออก[%d] ของอินเทอร์เฟซเครือข่ายเครื่องเสมือนอยู่นอกช่วงที่ถูกต้อง [8192, 32212254720]", + "ORG_ZSTACK_COMPUTE_VM_10264": "vm[uuid:%s, name:%s] ถูกยกเลิกแล้ว", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10017": "ไม่สามารถตั้งค่ากลุ่มความปลอดภัย VM NIC ได้เนื่องจากไม่พบกลุ่มความปลอดภัย[uuid:%s]", + "ORG_ZSTACK_COMPUTE_10004": "แบนด์วิดท์ขาเข้าของ VM NIC เกินช่วงที่ถูกต้อง [8192, 32212254720]", + "ORG_ZSTACK_COMPUTE_VM_10263": "ทรัพยากร[uuid:%s] เป็นโวลุมรูท และคุณไม่สามารถเปลี่ยนเจ้าของได้โดยตรง ให้เปลี่ยนเจ้าของของเครื่องเสมือนที่โวลุมรูทเป็นของแทน", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10009": "ที่อยู่ IP ที่ต้องการ [%s] ถูกจัดสรรไปแล้ว", + "ORG_ZSTACK_COMPUTE_10001": "VM NIC l3NetworkUuid ไม่สามารถเป็น null ได้", + "ORG_ZSTACK_COMPUTE_VM_10262": "rootDiskOfferingUuid ไม่สามารถเป็นค่าว่างได้เมื่อสร้าง VM โดยไม่มี image", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10008": "มี VIP[%s] ที่เชื่อมโยงกับ L3 Network[UUID:%s] อยู่แล้ว", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10019": "ไม่สามารถตั้งค่า security group ของ VM NIC ได้เนื่องจากมี priority ซ้ำ; security group ทั้งสอง %s และ %s มี priority %d", + "ORG_ZSTACK_COMPUTE_10002": "l3NetworkUuid ของ VM NIC ไม่อยู่ใน l3[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10003": "ไม่สามารถลบ IP ได้ เนื่องจาก ip[uuid:%s] เป็น virtual IP", + "ORG_ZSTACK_COMPUTE_VM_10260": "usbRedirect[%s] ไม่ถูกต้อง, %s ไม่ใช่ boolean type", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10002": "ไม่สามารถเข้าถึงสถานะ VIP ได้โดยบัญชีนี้ โปรดตรวจสอบสิทธิ์บัญชีและลองอีกครั้ง", + "ORG_ZSTACK_COMPUTE_10000": "ตรวจพบพารามิเตอร์ของ network interface ที่ซ้ำกัน โปรดตรวจสอบให้แน่ใจว่า network interface แต่ละตัวมีพารามิเตอร์ที่ไม่ซ้ำกัน", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10005": "IP allocation strategy ที่ไม่รองรับ[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10004": "System VIP ไม่สามารถลบผ่าน API ได้ โปรดติดต่อฝ่ายสนับสนุนเพื่อขอความช่วยเหลือ", + "ORG_ZSTACK_COMPUTE_VM_10269": "VM[UUID:%s] ไม่มี NIC ที่เชื่อมต่อกับ L3 network[UUID:%s]", + "ORG_ZSTACK_COMPUTE_10007": "vm network driver %s ยังไม่รองรับ", + "ORG_ZSTACK_COMPUTE_VM_10268": "ได้รับสถานะที่ไม่รู้จักของ VM[uuid:%s] บน host[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10267": "ไม่สามารถตรวจสอบสถานะของ VM [uuid:%s] บน host [uuid:%s], %s", + "ORG_ZSTACK_COMPUTE_10005": "multi-queue number [%d] ของ VM network interface อยู่นอกช่วงที่ถูกต้อง [1, 256]", + "ORG_ZSTACK_COMPUTE_10006": "vm nic ของ l3[uuid:%s] state[%s] ไม่อยู่ในสถานะที่คาดหวังหรือ %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10031": "ไม่สามารถสร้าง virtual router offering ได้เนื่องจาก management network ยังไม่รองรับ IPv6", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10030": "management network [uuid:%s] ไม่อยู่ใน availability zone เดียวกัน [uuid:%s] กับ offering ที่ตั้งใจจะสร้าง", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10035": "L3 network [UUID: %s] มีบริการ SNAT ที่เปิดใช้งานอยู่; ดังนั้นจึงไม่สามารถใช้เป็น management network ได้", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10034": "image[uuid:%s] มี format ที่ไม่รองรับ %s, ไม่สามารถใช้สำหรับการกำหนดค่า virtual router ได้", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10033": "media type ของ image[uuid:%s] คือ %s, ซึ่งไม่เป็นไปตามข้อกำหนดสำหรับ image ของ virtual router ที่ต้องมี media type เป็น %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10032": "public network ที่มี UUID %s ไม่อยู่ใน availability zone เดียวกันกับ offering ที่ตั้งใจจะสร้าง", + "ORG_ZSTACK_STORAGE_VOLUME_10087": "Image ที่มี UUID [uuid:%s] และชื่อ [name:%s] ถูกลบออกจาก backup storage ทั้งหมดแล้ว", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10039": "management network [UUID:%s, gateway:%s] ไม่สามารถเข้าถึงได้", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10038": "management network[uuid:%s] ไม่มี IP range ที่กำหนดค่า", + "ORG_ZSTACK_STORAGE_VOLUME_10086": "primaryStorage type [%s] ยังไม่รองรับ shared volumes", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10037": "L3 network ที่มี UUID [uuid: %s] มี network address เดียวกันกับ [uuid: %s] และไม่สามารถใช้สำหรับ virtual router ได้", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10036": "L3 network [UUID: %s] มีบริการ SNAT ที่เปิดใช้งานอยู่และไม่สามารถใช้เป็น public network ได้", + "ORG_ZSTACK_STORAGE_VOLUME_10088": "ไม่พบ backup storage ที่ตรงตามเงื่อนไขต่อไปนี้สำหรับ image[uuid:%s]: 1. state เป็น Enabled 2. status เป็น Connected 3. attached อยู่กับ zone ที่ primary storage[uuid:%s] ตั้งอยู่", + "ORG_ZSTACK_STORAGE_VOLUME_10083": "UUID ของ volume ซ้ำกัน: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10082": "ไม่สามารถย้อนกลับไปยัง snapshot ที่ไม่ใช่ล่าสุดได้", + "ORG_ZSTACK_STORAGE_VOLUME_10085": "ล้มเหลวในการรับประเภท primary storage", + "ORG_ZSTACK_STORAGE_VOLUME_10092": "วอลุมมีเป้าหมายถูกลบทิ้งระหว่างการสร้างวอลุม %s", + "ORG_ZSTACK_STORAGE_VOLUME_10091": "UUID ของ primary storage ขัดแย้ง primary storage ที่ระบุโดย disk offering คือ %s และ primary storage ที่ระบุในพารามิเตอร์การสร้างคือ %s", + "ORG_ZSTACK_STORAGE_VOLUME_10093": "ไม่ควรมี implementation ของ virtual machine %s มากกว่าหนึ่ง", + "ORG_ZSTACK_STORAGE_VOLUME_10096": "ไม่สามารถดาวน์โหลด ISO ไปยัง primary storage ได้เนื่องจาก: %s", + "ORG_ZSTACK_ZDFS_10000": "ping ไปยัง zDFS ล้มเหลว %s", + "ORG_ZSTACK_COMPUTE_VM_10204": "รูปแบบ JSON ไม่ถูกต้อง สาเหตุ: %s", + "ORG_ZSTACK_COMPUTE_VM_10203": "l3NetworkUuids และ vmNicInventories ต้องไม่ว่างเปล่าทั้งคู่หรือถูกตั้งค่าพร้อมกัน", + "ORG_ZSTACK_COMPUTE_VM_10200": "volume[uuid:%s] ไม่สามารถตอบสนองความต้องการได้ [สถานะ:Enabled สถานะ:Ready]", + "ORG_ZSTACK_COMPUTE_VM_10219": "API นี้ถูกยกเลิกแล้วและไม่ได้รับการสนับสนุนในสภาพแวดล้อม cloud computing อีกต่อไป โปรดพิจารณาใช้ API ล่าสุดที่มีให้สำหรับการดำเนินการของคุณ", + "ORG_ZSTACK_COMPUTE_VM_10218": "ไม่สามารถอัปเดตรหัสผ่าน console สำหรับ VM[uuid:%s] เนื่องจากไม่มีรหัสผ่าน console ที่กำหนดค่าในปัจจุบัน", + "ORG_ZSTACK_ZDFS_10002": "มีปัญหา ZDFS กับ hostname[%s]", + "ORG_ZSTACK_ZDFS_10001": "เชื่อมต่อไปยัง zDFS ล้มเหลว %s", + "ORG_ZSTACK_COMPUTE_VM_10217": "ไม่สามารถอัปเดตรหัสผ่าน console สำหรับ VM[uuid:%s] เนื่องจากไม่ได้อยู่ในสถานะ 'Running' สถานะปัจจุบันคือ '%s'", + "ORG_ZSTACK_COMPUTE_VM_10216": "รหัสผ่าน console ต้องไม่ขึ้นต้นด้วย \"password\" เพื่อหลีกเลี่ยงช่องโหว่ด้านความปลอดภัย VNC ที่อาจเกิดขึ้น", + "ORG_ZSTACK_COMPUTE_VM_10215": "ไม่อนุญาตให้ mount ไฟล์ ISO เดียวกันหลายครั้ง", + "ORG_ZSTACK_COMPUTE_VM_10214": "เครื่องเสมือนที่มี UUID [uuid=%s] ไม่มีอยู่", + "ORG_ZSTACK_COMPUTE_VM_10220": "TheCdRom[%s]IsAlreadytheDefault", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10002": "hostname สำหรับ cloud instance ของคุณไม่สามารถเป็น null ได้ โปรดระบุ hostname ที่ถูกต้อง", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10000": "facilityId ไม่สามารถเป็น null ได้", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10001": "logging facility %s ไม่ถูกต้อง", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10006": "syslog server[address: %s] ไม่พร้อมใช้งาน", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10007": "syslog server[address: %s:%s] ไม่พร้อมใช้งาน", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10004": "โปรโตคอลไม่สามารถเป็น null ได้ โปรดตรวจสอบว่ามีการระบุโปรโตคอลที่ถูกต้อง", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10005": "ไม่สนับสนุนโปรโตคอล %s ในสภาพแวดล้อม cloud computing", + "ORG_ZSTACK_COMPUTE_VM_10228": "คาดหวัง unicast MAC address พบ multicast MAC address [%s]", + "ORG_ZSTACK_COMPUTE_VM_10227": "ไม่อนุญาต network address %s สำหรับ instance %d", + "ORG_ZSTACK_COMPUTE_VM_10226": "MAC address [%s] ไม่ถูกต้อง", + "ORG_ZSTACK_COMPUTE_VM_10225": "นี่ไม่ใช่ MAC address ที่ถูกต้อง [%s]", + "ORG_ZSTACK_COMPUTE_VM_10224": "โทโพโลยี CPU ไม่ถูกต้อง คอร์ CPU จริง: %s, socket ที่กำหนดค่า: %s, คอร์ต่อ socket: %s, เทรดต่อคอร์: %s; socket ที่คำนวณได้: %s, คอร์: %s, เทรด: %s", + "ORG_ZSTACK_COMPUTE_VM_10221": "vm[uuid:%s] สามารถทำ fstrim ได้เฉพาะเมื่อสถานะเป็น Running; สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_STORAGE_VOLUME_10046": "volume ที่มี UUID [%s] ไม่อยู่ในสถานะ deleted การดำเนินการนี้มีไว้เพื่อกู้คืน data volume ที่ถูกลบไปก่อนหน้านี้", + "ORG_ZSTACK_STORAGE_VOLUME_10049": "image[uuid:%s] ไม่ได้อยู่ในสถานะ Enabled, มันคือ %s", + "ORG_ZSTACK_STORAGE_VOLUME_10048": "image[uuid:%s] ไม่ใช่ประเภทที่คาดหวัง, มันเป็นประเภท %s", + "ORG_ZSTACK_STORAGE_VOLUME_10042": "volume[uuid:%s] ไม่ได้อยู่ในสถานะ enabled, สถานะปัจจุบันคือ %s, ไม่สามารถสร้าง snapshot ได้", + "ORG_ZSTACK_STORAGE_VOLUME_10045": "volume[uuid:%s] ไม่พร้อมสำหรับการสร้าง snapshot, สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_STORAGE_VOLUME_10044": "ไม่สามารถถ่ายภาพหน่วยความจำได้, สถานะ VM ปัจจุบัน[%s], แต่คาดหวังสถานะคือ [%s, %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10041": "volume[uuid:%s, type:%s], ไม่สามารถสร้าง snapshot ได้", + "ORG_ZSTACK_LOGIN_10022": "แอตทริบิวต์ไม่ถูกต้อง แอตทริบิวต์[%s] จำเป็นต้องมี, แต่พบบางระเบียน [%s] ที่ไม่ตรงกัน โปรดตรวจสอบให้แน่ใจว่าแอตทริบิวต์ทั้งหมดระบุและตรงกันอย่างถูกต้อง", + "ORG_ZSTACK_LOGIN_10024": "strategy เป็นฟิลด์ที่จำเป็น %", + "ORG_ZSTACK_LOGIN_10023": "รูปแบบ JSON ไม่ถูกต้องสำหรับข้อมูลการกำหนดค่าคลาวด์ โปรดตรวจสอบให้แน่ใจว่าฟิลด์ JSON ทั้งหมดมีรูปแบบที่ถูกต้องและเป็นไปตาม schema ที่ระบุ", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10007": "keyLabel %s และ encryptedResult %s ไม่สอดคล้องกัน", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10006": "flkSec securityMachine ไม่สมบูรณ์: %s", + "ORG_ZSTACK_LOGIN_10029": "ชื่อควรใช้ค่าภายในช่วงพารามิเตอร์ที่ระบุ %s", + "ORG_ZSTACK_LOGIN_10026": "แอตทริบิวต์เป็นสิ่งจำเป็นสำหรับการจัดเตรียมทรัพยากรคลาวด์ %", + "ORG_ZSTACK_LOGIN_10025": "ชื่อเป็นฟิลด์ที่จำเป็น %", + "ORG_ZSTACK_LOGIN_10028": "optional เป็นฟิลด์ที่จำเป็นสำหรับการกำหนดค่าเครื่องเสมือน%", + "ORG_ZSTACK_LOGIN_10027": "type เป็นฟิลด์ที่จำเป็น %", + "ORG_ZSTACK_STORAGE_VOLUME_10058": "root volume [uuid:%s, name:%s] ไม่สามารถแนบได้", + "ORG_ZSTACK_STORAGE_VOLUME_10057": "VM [UUID:%s] ไม่รองรับการแนบ volume ออนไลน์ [%s] เนื่องจากประเภทแพลตฟอร์ม image ไม่เข้ากัน", + "ORG_ZSTACK_STORAGE_VOLUME_10059": "data volume [UUID:%s] ถูกปิดใช้งาน; ไม่อนุญาตให้แนบ", + "ORG_ZSTACK_STORAGE_VOLUME_10054": "data volume [UUID:%s] ไม่ได้แนบกับเครื่องเสมือนใดจึงไม่สามารถถอดออกได้", + "ORG_ZSTACK_STORAGE_VOLUME_10053": "volume[uuid:%s] อยู่ในสถานะ[%s], data volume สามารถแนบได้เฉพาะเมื่อสถานะเป็น available หรือ attaching", + "ORG_ZSTACK_STORAGE_VOLUME_10056": "volume[uuid:%s, name:%s, type:%s] ไม่สามารถถอดออกได้", + "ORG_ZSTACK_CORE_PLUGIN_10001": "plugin[%s] ชื่อ, product key และ vendor ไม่สามารถเป็นค่าว่างได้", + "ORG_ZSTACK_STORAGE_VOLUME_10055": "เพื่อถอด shareable data volume ที่มี UUID [%s], จำเป็นต้องมี UUID ของเครื่องเสมือน", + "ORG_ZSTACK_STORAGE_VOLUME_10050": "image[uuid:%s] ไม่ได้อยู่ในสถานะ Ready, มันอยู่ในสถานะ %s", + "ORG_ZSTACK_STORAGE_VOLUME_10052": "volume[uuid:%s] อยู่ในสถานะ[%s], data volume สามารถแนบได้เฉพาะเมื่อสถานะเป็น %s", + "ORG_ZSTACK_STORAGE_VOLUME_10051": "root volume [uuid:%s] ไม่สามารถแนบกับเครื่องเสมือนได้", + "ORG_ZSTACK_LOGIN_10011": "ไม่สามารถตรวจสอบรายการ DNS [%s] ได้ อาจถูกลบไปแล้ว", + "ORG_ZSTACK_CORE_PLUGIN_10000": "ชื่อปลั๊กอินไม่รู้จักสำหรับผลิตภัณฑ์คลาวด์: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10069": "ไม่สามารถลบโวลูม[uuid:%s, type:%s] ได้", + "ORG_ZSTACK_STORAGE_VOLUME_10068": "การตั้งค่าขนาดดิสก์ที่ไม่คาดคิดสำหรับเครื่องเสมือน %s โปรดตรวจสอบให้แน่ใจว่าขนาดดิสก์ที่ระบุอยู่ในช่วงที่อนุญาตและสอดคล้องกับการกำหนดค่าสภาพแวดล้อมคลาวด์ของคุณ", + "ORG_ZSTACK_STORAGE_VOLUME_10065": "ไม่สามารถแนบโวลูมกับ VM ได้ ไม่มีคลัสเตอร์คอมพิวเตอร์ที่พร้อมใช้งาน", + "ORG_ZSTACK_STORAGE_VOLUME_10064": "โวลูมข้อมูลที่มี UUID [%s] มีรูปแบบ [%s] ซึ่งสามารถแนบได้เฉพาะกับไฮเปอร์ไวเซอร์ประเภท [%s] แต่ VM มีไฮเปอร์ไวเซอร์ประเภท [%s] ดังนั้นจึงไม่สามารถแนบได้", + "ORG_ZSTACK_RESOURCECONFIG_10009": "บัญชีไม่มีสิทธิ์เข้าถึงทรัพยากร[uuid: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10067": "ไม่อนุญาตให้สำรองข้อมูลโวลูมรูท uuid:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10066": "ไม่สามารถแนบโวลูมกับ VM ที่ทำงานบนโฮสต์[uuid: %s] ซึ่งถูกตัดการเชื่อมต่อจากที่จัดเก็บโวลูม[uuid: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10061": "โวลูมข้อมูล [UUID:%s] ได้ถูกแนบกับเครื่องเสมือนอื่นแล้วและไม่สามารถแนบใหม่ได้", + "ORG_ZSTACK_IAM2_ATTRIBUTE_10000": "แอตทริบิวต์[name:%s] เป็นแอตทริบิวต์สงวนที่ไม่สามารถอัปเดตในสภาพแวดล้อมการประมวลผลบนคลาวด์ได้", + "ORG_ZSTACK_NETWORK_OVN_10074": "ตัวควบคุม OVN SDN [UUID: %s, Name: %s] อยู่ในสถานะตัดการเชื่อมต่อ ไม่สามารถเพิ่มโฮสต์[UUID: %s] ได้", + "ORG_ZSTACK_STORAGE_VOLUME_10060": "โวลูมที่มี UUID [%s] อยู่ในสถานะถูกลบ ดังนั้นจึงไม่สามารถดำเนินการได้", + "ORG_ZSTACK_NETWORK_OVN_10073": "ไม่สามารถเพิ่มสวิตช์ลอจิก[uuid:%s, name:%s] ไปยังตัวควบคุม OVN[uuid:%s, ip:%s] ได้ เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_VOLUME_10063": "โวลูมข้อมูลที่มี UUID [%s] มีรูปแบบ [%s] ไม่รองรับการแนบกับไฮเปอร์ไวเซอร์ใดๆ", + "ORG_ZSTACK_STORAGE_VOLUME_10062": "โวลูมข้อมูลสามารถแนบได้เฉพาะเมื่อสถานะเป็น [active, available] สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_NETWORK_OVN_10071": "ไม่สามารถซิงค์สวิตช์ลอจิกไปยังตัวควบคุม OVS[uuid:%s, ip:%s] ได้ เนื่องจาก %s", + "ORG_ZSTACK_LOGIN_10000": "ZStack กำลังโหลดองค์กร LDAP จากฐานข้อมูลอยู่ โปรดอย่าดำเนินการซิงค์ในขณะนี้", + "ORG_ZSTACK_NETWORK_OVN_10078": "NfvInstance[uuid:%s] ไม่พบ", + "ORG_ZSTACK_NETWORK_OVN_10077": "เครือข่าย L2 [UUID:%s] ไม่ได้เชื่อมต่อกับตัวควบคุม OVN", + "ORG_ZSTACK_NETWORK_OVN_10076": "ไม่สามารถลบพอร์ตสวิตช์ลอจิกจากตัวควบคุม OVS[uuid:%s, ip:%s] ได้ เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_VOLUME_10070": "โวลูม[uuid:%s] อยู่ในสถานะถูกลบแล้ว", + "ORG_ZSTACK_LOGIN_10001": "ไม่สามารถซิงค์รายการ LDAP[] ได้ เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_OVN_10075": "ไม่สามารถเพิ่มพอร์ตสวิตช์ลอจิกไปยังตัวควบคุม OVN[uuid:%s, ip:%s] ได้ เนื่องจาก %s", + "ORG_ZSTACK_V2V_10037": "โฮสต์[uuid:%s] ไม่ได้เชื่อมต่อ", + "ORG_ZSTACK_V2V_10038": "ที่จัดเก็บหลัก[uuid%s] ไม่ได้เชื่อมต่อ", + "ORG_ZSTACK_V2V_10035": "ไม่สามารถจัดสรร %d ไบต์บนโฮสต์การแปลง[uuid:%s] ได้ ขาดความจุที่พร้อมใช้งาน", + "ORG_ZSTACK_NETWORK_OVN_10079": "NfvInstanceGroup[uuid:%s] ไม่พบ", + "ORG_ZSTACK_LOGIN_10008": "ไม่สามารถตรวจสอบ UID[%s] ได้ อาจเกิดจากการลบหรือหมดอายุ", + "ORG_ZSTACK_LOGIN_10007": "ไม่สามารถซิงค์เซิร์ฟเวอร์ LDAP/AD ที่มีขอบเขตไม่ใช่ %s", + "ORG_ZSTACK_V2V_10031": "แท็กระบบ QoS ไม่ถูกต้องสำหรับการย้าย V2V โปรดตรวจสอบแท็กระบบและให้แน่ใจว่าเป็นไปตามมาตรฐานการประมวลผลบนคลาวด์", + "ORG_ZSTACK_V2V_10032": "แบนด์วิดเครือข่ายไม่ถูกต้อง[%s], ต้องมีค่ามากกว่าหรือเท่ากับ 1048576 ไบต์ต่อวินาที", + "ORG_ZSTACK_LOGIN_10009": "ไม่สามารถสร้าง IAM virtual ID สำหรับ UID[%s], เพราะ %s", + "ORG_ZSTACK_LOGIN_10004": "ไม่สามารถซิงโครไนซ์องค์กร LDAP ในสภาพแวดล้อมคลาวด์", + "ORG_ZSTACK_BAREMETAL2_10001": "การกำหนดค่า IPMI Chassis ไม่ถูกต้อง: พารามิเตอร์ 'reboot' ต้องตั้งค่าเป็น 'No' เมื่อมีพารามิเตอร์ 'provisionIp'", + "ORG_ZSTACK_V2V_10030": "มีการย้าย VM จากโฮสต์ที่มี hostUuid %s", + "ORG_ZSTACK_BAREMETAL2_10002": "การกำหนดค่า IPMI Chassis ไม่ถูกต้อง: 'platform' ต้องระบุเป็น 'Linux' เมื่อมี 'provisionIp'", + "ORG_ZSTACK_LOGIN_10006": "ไม่สามารถซิงโครไนซ์องค์กรได้ เพราะ %s", + "ORG_ZSTACK_LOGIN_10005": "ไม่สามารถแปลง LDAP entry เป็น organizational node", + "ORG_ZSTACK_BAREMETAL2_10000": "การกำหนดค่า IPMI Chassis ไม่ถูกต้อง: 'provisionType' ต้องตั้งค่าเป็น 'Direct' เมื่อมีการระบุ 'provisionIp'", + "ORG_ZSTACK_STORAGE_VOLUME_10079": "ไม่สามารถถอด volume [%s] จาก instance ได้ อาจถูกถอดไปแล้ว", + "ORG_ZSTACK_STORAGE_VOLUME_10076": "ไม่สามารถแนบ volume[%s] ให้กับ host[%s], เนื่องจากกำลังถูกแนบกับ host[%s] อยู่", + "ORG_ZSTACK_STORAGE_VOLUME_10075": "mount path ต้องเป็น absolute path โปรดระบุ absolute path ที่ถูกต้อง", + "ORG_ZSTACK_NETWORK_OVN_10080": "NfvInstanceGroup[uuid:%s] ไม่มี Virtual IP กำหนดค่า", + "ORG_ZSTACK_STORAGE_VOLUME_10078": "ไม่สามารถแนบ volume[%s] ให้กับ host[%s], เนื่องจาก volume อื่นกำลังใช้ mount path[%s] อยู่", + "ORG_ZSTACK_STORAGE_VOLUME_10077": "ไม่สามารถแนบ volume [%s] ให้กับ host [%s] เนื่องจากกำลัง mount บน path [%s] บน host [%s] อยู่แล้ว", + "ORG_ZSTACK_STORAGE_VOLUME_10072": "ไม่อนุญาตให้เปลี่ยนสถานะของ root volume, UUID: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10071": "ไม่สามารถลบ volume [%s] ได้เนื่องจากกำลังแนบกับ host [%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10074": "ไม่สามารถแนบ volume[%s] ให้กับ instance[%s], เนื่องจาก instance[status:%s] ไม่อยู่ในสถานะทำงาน", + "ORG_ZSTACK_NETWORK_OVN_10083": "ไม่สามารถอัพเดท OVN cluster nodes สำหรับ NFV Instance [uuid:%s], เพราะ %s", + "ORG_ZSTACK_STORAGE_VOLUME_10073": "ไม่สามารถเปลี่ยนสถานะ volume ได้เนื่องจากกำลังแนบกับ host %s", + "ORG_ZSTACK_NETWORK_OVN_10082": "ไม่พบ instances สำหรับ cluster configuration ใน NfvInstanceGroup[uuid:%s]", + "ORG_ZSTACK_RESOURCECONFIG_10002": "ResourceConfig [category:%s, name:%s] ไม่สามารถเชื่อมโยงกับ resourceType: %s", + "ORG_ZSTACK_RESOURCECONFIG_10001": "ไม่พบ resource[uuid: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10081": "ไม่พบไฟล์ต้นทางใน used snapshot tree ของ volume[uuid: %s]", + "ORG_ZSTACK_V2V_10028": "ไม่พบ type สำหรับ source VM [url:%s]", + "ORG_ZSTACK_RESOURCECONFIG_10000": "resources มี resource types ที่ไม่สอดคล้องกัน รายละเอียด: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10080": "ไม่สามารถ flatten shareable volume[uuid:%s]", + "ORG_ZSTACK_V2V_10029": "ไม่พบ factory สำหรับ source VM [url:%s, v2vType:%s]", + "ORG_ZSTACK_RESOURCECONFIG_10007": "global configuration [category:%s, name:%s] ไม่สามารถ bind กับ resource", + "ORG_ZSTACK_V2V_10026": "ไม่สามารถค้นหา Network[uuid:%s] เพื่อเริ่มต้น VM ปัจจุบันได้ อาจถูกลบแล้ว คำแนะนำการดำเนินการ: ยุติการทำงานของ VM นี้และสร้างใหม่", + "ORG_ZSTACK_RESOURCECONFIG_10006": "ไม่พบการกำหนดค่าส่วนกลาง[category:%s, name:%s]", + "ORG_ZSTACK_V2V_10024": "ไม่ใช่เวลาสำหรับการปิด instance", + "ORG_ZSTACK_V2V_10025": "conversionHost[uuid:%s, hostUuid:%s] ไม่ได้เชื่อมต่อ", + "ORG_ZSTACK_V2V_10022": "มีงาน v2v บางส่วนกำลังดำเนินอยู่ ไม่สามารถถอด volume[%s] จาก host[%s] ได้", + "ORG_ZSTACK_V2V_10020": "primary storage[uuid:%s] ไม่ได้อยู่ในสถานะ active และไม่ได้ถูกต่อเชื่อม", + "ORG_ZSTACK_V2V_10021": "มีงานย้ายข้อมูล V2V ที่กำลังดำเนินอยู่ โปรดตรวจสอบให้แน่ใจว่าไม่มี volume[%s] ที่ถูกต่อเชื่อมกับ host[%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10007": "iothread ต้องการ QEMU เวอร์ชัน %s หรือมากกว่า แต่ host กำลังทำงานด้วยเวอร์ชัน %s", + "ORG_ZSTACK_STORAGE_VOLUME_10009": "root volume [%s] ไม่สามารถตั้งค่า I/O thread pin ได้", + "ORG_ZSTACK_STORAGE_VOLUME_10008": "iothread ต้องการ libvirt เวอร์ชัน %s หรือมากกว่า แต่ host มีเวอร์ชัน %s", + "ORG_ZSTACK_STORAGE_VOLUME_10003": "primary storage %s ปัจจุบันไม่ใช่ประเภท Ceph และด้วยเหตุนี้จึงไม่สามารถเข้าถึงได้", + "ORG_ZSTACK_STORAGE_VOLUME_10005": "ประเภท primary storage ปัจจุบันไม่รองรับ block volume ประเภทที่รองรับ ได้แก่ %s", + "ORG_ZSTACK_STORAGE_VOLUME_10004": "Ceph ประเภท block volume ต้องระบุ access path ID และ IQN โปรดตรวจสอบให้แน่ใจว่ามีการระบุ accessPathId และ accessPathIqn ทั้งสองค่า", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10000": "การทดสอบการเชื่อมต่อ JitClientFactory ล้มเหลว", + "ORG_ZSTACK_SSO_CAS_FILTER_10000": "URL ไม่ถูกต้อง ขาด client UUID", + "ORG_ZSTACK_SSO_CAS_FILTER_10001": "ขาด instance CAS client โปรดสร้าง instance CAS client ก่อนการรวม SSO", + "ORG_ZSTACK_COMPUTE_VM_10275": "VM[uuid:%s] ไม่ได้อยู่ในสถานะ Running", + "ORG_ZSTACK_CONSOLE_10011": "console agent ไม่ได้เชื่อมต่อ อาจเกิดจากการเริ่มต้น management node โปรดรอให้ console agent เชื่อมต่อ หรือเชื่อมต่อใหม่ด้วยตนเองหากถูกตัดการเชื่อมต่อเป็นเวลานาน", + "ORG_ZSTACK_CONSOLE_10010": "vm[uuid:%s] ไม่ได้อยู่ในสถานะ %s สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_COMPUTE_VM_10273": "ไม่สามารถสร้าง template จาก root volume[uuid:%s] บน primary storage[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10270": "virtual machine ถูกลบแล้ว โปรดตรวจสอบรายละเอียดจาก instance management console", + "ORG_ZSTACK_CONSOLE_10013": "console proxy[uuid: %s, status: %s] บน agent[ip: %s] ไม่ได้เชื่อมต่อ ไม่สามารถลบได้", + "ORG_ZSTACK_CONSOLE_10012": "ไม่พบ IP ของ host สำหรับ VM[uuid:%s] VM กำลังทำงานอยู่หรือไม่???", + "ORG_ZSTACK_COMPUTE_VM_10279": "ล้มเหลวในการอัปเดต VM[uuid=%s] บน hypervisor: การแก้ไขคุณสมบัติบางอย่างล้มเหลว", + "ORG_ZSTACK_COMPUTE_VM_10278": "ล้มเหลวในการอัปเดต vm[uuid=%s] บน hypervisor", + "ORG_ZSTACK_COMPUTE_VM_10277": "ISO ที่มี UUID [uuid:%s] อยู่บน backup storage ที่เข้ากันไม่ได้กับ primary storage [uuid:%s] ที่ VM [name:%s, uuid:%s] อาศัยอยู่", + "ORG_ZSTACK_COMPUTE_VM_10276": "ไม่สามารถอัปเดตรหัสผ่าน console ของ VM[uuid:%s] VM ไม่ได้ทำงานบน host ใด", + "ORG_ZSTACK_STORAGE_VOLUME_10018": "ไม่สามารถปรับขนาด volume [%s] เนื่องจากอยู่ในสถานะ Disabled", + "ORG_ZSTACK_STORAGE_VOLUME_10017": "volume[uuid:%s] ไม่ใช่ data volume", + "ORG_ZSTACK_STORAGE_VOLUME_10019": "ต้องระบุ vmInstanceUuid หรือ instanceUuid อย่างน้อยหนึ่งรายการ", + "ORG_ZSTACK_STORAGE_VOLUME_10014": "ไม่รองรับการถ่ายภาพสแนปชอตของโวลุม[uuid:%s, uuid:%s] บนเครื่องเสมือนที่แตกต่างกัน[uuid:%s, uuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10013": "ไม่พบโวลุม[uuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10016": "สถานะของเครื่องเสมือน[uuid: %s] คือ %s ไม่อนุญาตให้สร้างสแนปชอต", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10013": "เครื่องความปลอดภัย jit ไม่พร้อมใช้งาน: การเชื่อมต่อ socket ไปยัง %s:%s ล้มเหลว", + "ORG_ZSTACK_STORAGE_VOLUME_10015": "โวลุม[uuid:%s] ไม่พร้อมใช้งาน", + "ORG_ZSTACK_STORAGE_VOLUME_10010": "ID ของ I/O thread ปัจจุบัน[%s] ไม่ตรงกับ ID ของ I/O thread ของโวลุมที่แนบ[%s][%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10012": "การตรวจสอบสแนปชอตไม่รองรับสำหรับโวลุม[uuid: %s] เครื่องเสมือนที่แนบอยู่ไม่อยู่ในสถานะใดสถานะหนึ่ง [%s, %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10011": "การตรวจสอบสแนปชอตไม่รองรับสำหรับโวลุม [UUID: %s] โวลุมควรจะแนบอยู่กับเครื่องเสมือน", + "ORG_ZSTACK_CONSOLE_10000": "ไม่พบไฟล์ private key ของ Ansible โปรดตรวจสอบให้แน่ใจว่าเส้นทางไฟล์ private key ถูกต้องและสามารถเข้าถึงได้", + "ORG_ZSTACK_COMPUTE_VM_10285": "ล้มเหลวในการถอดโวลุม [uuid=%s] จากเครื่องเสมือน [uuid=%s]", + "ORG_ZSTACK_COMPUTE_VM_10284": "ไม่อนุญาตให้ถอดโวลุมเมื่อเครื่องเสมือนอยู่ในสถานะ [%s]", + "ORG_ZSTACK_COMPUTE_VM_10283": "ISO[uuid:%s] ไม่ได้แนบอยู่กับ VirtualMachine[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10282": "ล้มเหลวในการอัปเดตเครื่องเสมือน[uuid=%s] บน hypervisor: การแก้ไขคุณสมบัติบางอย่างล้มเหลว", + "ORG_ZSTACK_CONSOLE_10004": "ล้มเหลวในการเชื่อมต่อใหม่ไปยัง console proxy สำหรับเครื่องเสมือน โปรดตรวจสอบการเชื่อมต่อเครือข่ายและให้แน่ใจว่าเครื่องเสมือนกำลังทำงานอยู่", + "ORG_ZSTACK_COMPUTE_VM_10281": "ล้มเหลวในการกำหนดค่าเครื่องเสมือน[uuid=%s] บนโหนด hypervisor", + "ORG_ZSTACK_CONSOLE_10003": "ล้มเหลวในการกำหนดค่า IP ที่ถูกแทนที่ของ console proxy [code:%d] หรือพอร์ต console proxy [code:%d]", + "ORG_ZSTACK_COMPUTE_VM_10280": "ไม่สามารถสร้างเครื่องเสมือน เครื่องเสมือนที่มีชื่อ [%s] มีอยู่แล้ว", + "ORG_ZSTACK_CONSOLE_10002": "มีกระบวนการอื่นกำลังใช้พอร์ต: %s", + "ORG_ZSTACK_CONSOLE_10001": "ID ของโหนดการจัดการไม่ถูกต้อง[%s]", + "ORG_ZSTACK_CONSOLE_10008": "ไม่สามารถตรวจสอบความพร้อมใช้งานของ console proxy ได้เนื่องจาก %s", + "ORG_ZSTACK_CONSOLE_10007": "สร้างการเชื่อมต่อ VNC: URI ที่ไม่คาดคิด: %s", + "ORG_ZSTACK_COMPUTE_VM_10288": "เครื่องเสมือนหนึ่งไม่สามารถสร้าง CD-ROM ได้ %s เครื่องเสมือนสามารถแนบ CD-ROM ได้ %s", + "ORG_ZSTACK_CONSOLE_10009": "ข้อผิดพลาดการดำเนินการ เนื่องจาก:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10029": "ไม่อนุญาตให้ดำเนินการขยายเนื่องจากโฮสต์ถูกปิดใช้งาน โปรดให้แน่ใจว่าโฮสต์ทำงานอยู่ก่อนดำเนินการนี้", + "ORG_ZSTACK_STORAGE_VOLUME_10028": "ขนาดการเพิ่มขั้นต่ำสำหรับการจัดสรรหน่วยความจำควรมากกว่า 4 MB", + "ORG_ZSTACK_STORAGE_VOLUME_10025": "คุณไม่สามารถกำหนดขีดจำกัดแบนด์วิดท์การอ่าน/เขียนและขีดจำกัดแบนด์วิดท์รวมสำหรับเครื่องเสมือนพร้อมกันได้ โปรดระบุประเภทขีดจำกัดหนึ่งประเภท", + "ORG_ZSTACK_STORAGE_VOLUME_10024": "คุณไม่สามารถกำหนดค่าขีดจำกัด IOPS การอ่าน/เขียนและขีดจำกัด IOPS รวมสำหรับอินสแตนซ์ของคุณพร้อมกันได้ โปรดระบุประเภทขีดจำกัด IOPS หนึ่งประเภท", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10023": "ข้อยกเว้นที่ไม่ได้จัดการขณะดึงคุณสมบัติด้วยการรักษาความปลอดภัย JIT เปิดใช้งาน: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10027": "ไม่สามารถลดขนาดโวลุม[uuid:%s] ของ [%s] ได้", + "ORG_ZSTACK_STORAGE_VOLUME_10026": "แบนด์วิดท์ของโวลุมไม่สามารถเป็น null ได้ โปรดระบุค่าแบนด์วิดท์ของโวลุมที่ถูกต้อง", + "ORG_ZSTACK_STORAGE_VOLUME_10021": "volume[uuid:%s] ไม่ใช่ root volume", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10022": "การดึงข้อมูล attribute ของเครื่องจักรความปลอดภัย JIT ล้มเหลว, รหัสสถานะ: %s, รายละเอียด: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10020": "ไม่พบ volume ที่มี UUID: %s และ VM Instance UUID: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10023": "ไม่สามารถกำหนดค่าทั้ง parameter set แบบเก่าและแบบใหม่พร้อมกันใน virtual machine instance", + "ORG_ZSTACK_STORAGE_VOLUME_10022": "SharedVolume ไม่รองรับการตั้งค่า bandwidth", + "ORG_ZSTACK_COMPUTE_VM_10293": "ไม่มีวิธีกำหนดขนาด image สำหรับ %s, กรุณารายงาน exception", + "ORG_ZSTACK_STORAGE_VOLUME_10035": "รองรับเฉพาะ detached volumes เท่านั้น, ใช้ SetVmBootVolumeMsg แทน", + "ORG_ZSTACK_ZWATCH_PROMETHEUS_10000": "Host[uuid:%s] ไม่พบใน cloud database", + "ORG_ZSTACK_STORAGE_VOLUME_10038": "hypervisor[%s] จำกัดให้ VM หนึ่งมี data volumes ได้สูงสุด %s volumes; VM นี้ [uuid:%s] มี data volumes ติดตั้งอยู่ %s volumes", + "ORG_ZSTACK_STORAGE_VOLUME_10032": "ไม่พบ image cache [Image UUID: %s] สำหรับการ reinitialize volume", + "ORG_ZSTACK_STORAGE_VOLUME_10031": "shared volume[uuid: %s] ได้ถูกติดตั้งกับ vm instances ที่ไม่ได้หยุดทำงาน[uuids: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10034": "volume[uuid:%s] ควรถูกติดตั้งกับ instance", + "ORG_ZSTACK_STORAGE_VOLUME_10033": "Volume [UUID: %s, name: %s] ยังคงถูกใช้งานอยู่และไม่สามารถ expunge ได้ กรุณาให้แน่ใจว่า volume ถูกลบแล้วก่อนที่จะพยายาม expunge", + "ORG_ZSTACK_STORAGE_VOLUME_10030": "ไม่อนุญาตให้ทำการขยายขนาดเนื่องจากสถานะ host ถูกปิดใช้งาน", + "ORG_ZSTACK_LOGIN_10033": "ปัจจุบันไม่มี LDAP/AD server ที่กำหนดค่าในระบบของคุณ กรุณากำหนดค่า LDAP/AD server ก่อน", + "ORG_ZSTACK_LOGIN_10032": "ไม่สามารถ bind LDAP UID %s นี้กับ virtual user ID [uuid:%s]", + "ORG_ZSTACK_LOGIN_10034": "UID นี้ถูกใช้งานอยู่แล้ว กรุณาเลือก UID อื่น", + "ORG_ZSTACK_LOGIN_10030": "Attribute ไม่ถูกต้อง Attribute[%s] จำเป็นต้องมี, แต่พบบางระเบียนที่ไม่ตรงกันใน virtual machine configuration กรุณาให้แน่ใจว่า attributes ทั้งหมดถูกระบุอย่างถูกต้องและ virtual machine resources ทั้งหมดถูกกำหนดค่าอย่างเหมาะสม", + "ORG_ZSTACK_STORAGE_CDP_10091": "ความจุสูงสุดไม่ถูกต้อง[%d], การใช้งานปัจจุบันคือ %d", + "ORG_ZSTACK_STORAGE_CDP_10089": "ไม่พบ hostname สำหรับ backup storage[uuid: %s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10009": "crypto function ถูกเปิดใช้งานแต่ resource pool[%s] สำหรับ automatic login ไม่ได้ถูกกำหนดค่า", + "ORG_ZSTACK_SSO_SAML2_10001": "Identity Provider metadata เป็น Base64 ที่ไม่ถูกต้อง (เนื้อหาที่ถอดรหัสว่างเปล่า)", + "ORG_ZSTACK_SSO_SAML2_10002": "ล้มเหลวในการถอดรหัส Identity Provider metadata จากการเข้ารหัส Base64", + "ORG_ZSTACK_SSO_SAML2_10000": "IdP metadata ไม่ได้ถูกกำหนดค่า กรุณาระบุ metadata ที่ถูกต้อง", + "ORG_ZSTACK_ZSV_10002": "ถอด sharable volume หรือ LUN device ออกก่อนดำเนินการกับ snapshot group", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10000": "ไม่มี client สำหรับ security instance[model=%s]", + "ORG_ZSTACK_ZSV_10001": "volume %s ยังคงมี snapshot groups, ไม่สามารถลบได้", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10001": "ไม่มี security machine client factory สำหรับ security machine[type=%s]", + "ORG_ZSTACK_ZSV_10000": "volume %s ยังคงมี snapshot group ที่เชื่อมโยงกับ VM %s; ดังนั้นจึงไม่สามารถติดตั้งกับ VM อื่นได้", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10002": "SecurityMachineManagerImpl: SecurityMachineEncrypt ล้มเหลวสำหรับ instance %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_HTTP_10001": "เกิดข้อผิดพลาดในการบันทึกเทมเพลต HTTP กรุณาตรวจสอบเนื้อหาของเทมเพลต: %s", + "ORG_ZSTACK_STORAGE_CDP_10097": "งานสร้าง VM ถูกยกเลิกแล้ว กรุณาตรวจสอบพารามิเตอร์ของคุณและลองใหม่อีกครั้ง", + "ORG_ZSTACK_STORAGE_CDP_10095": "ยกเลิกการย้อนกลับงาน: การดำเนินการย้อนกลับการเปลี่ยนแปลงถูกยกเลิก กรุณาตรวจสอบให้แน่ใจว่างานที่เกี่ยวข้องทั้งหมดเสร็จสิ้นแล้วก่อนที่จะพยายามย้อนกลับอีกครั้ง", + "ORG_ZSTACK_ACCESSKEY_10002": "[Account ID: %s, User ID: %s] ไม่ใช่บัญชีหรือโปรเจกต์/ผู้ใช้ IAM2 ที่ถูกต้อง", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10019": "ไม่สามารถเชื่อมต่อกับ chassis [uuid:%s] ได้ กรุณาตรวจสอบการกำหนดค่า ipmi", + "ORG_ZSTACK_ACCESSKEY_10001": "หากคาดว่าจะระบุ Access Key ต้องระบุ AccessKeyID และ AccessKeySecret พร้อมกันทั้งคู่", + "ORG_ZSTACK_ACCESSKEY_10004": "จำนวน accessKey สำหรับ [account ID: %s, user ID: %s] เกินขีดจำกัดสูงสุด", + "ORG_ZSTACK_ACCESSKEY_10000": "ไม่มีสิทธิ์ในการดำเนินการสำหรับ [accountUuid:%s, userUuid:%s]", + "ORG_ZSTACK_TEST_10008": "ฉันไม่ควรอยู่ในรายการ errs", + "ORG_ZSTACK_TEST_10009": "ฉันไม่ควรถูกระบุเป็นข้อผิดพลาดเช่นกัน", + "ORG_ZSTACK_TEST_10006": "การ deploy cloud เสร็จสมบูรณ์ตามที่วางแผนไว้", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10020": "ล้มเหลวในการโหลดข้อมูล chassis จากไฟล์ เพราะ: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10029": "มีงาน connection security machine อื่นกำลังทำงานอยู่ กรุณายกเลิกงานใหม่และรอจนกว่างานนั้นจะเสร็จสิ้น", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10026": "securityMachine ถูกปิดใช้งาน ไม่สามารถตรวจจับ heartbeat ได้ กรุณาตรวจสอบให้แน่ใจว่า securityMachine ถูกเปิดใช้งานและกำหนดค่าอย่างถูกต้อง", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10027": "การตรวจจับ heartbeat ของ instance %s ล้มเหลว", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10028": "มีข้อยกเว้นในการตรวจจับ heartbeat ของ %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10021": "decrypt data[%s] หรือ ประเภทอัลกอริทึมการเข้ารหัส[%s] เป็น null", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10022": "ประเภทอัลกอริทึมการถอดรหัสไม่ถูกต้อง: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10024": "ไม่สามารถปิดใช้งานฟังก์ชันการเข้ารหัสได้เนื่องจากมี secure virtual machine ที่ซิงค์อย่างน้อยหนึ่งตัวใน resource pool ที่ให้บริการอยู่ กรุณาตรวจสอบให้แน่ใจว่าจำนวน secure virtual machine ที่ซิงค์ลดลงเป็นศูนย์ก่อนที่จะปิดใช้งานฟังก์ชันการเข้ารหัส", + "ORG_ZSTACK_TEST_10004": "ฉันไม่ควรอยู่ในรายการข้อผิดพลาดเช่นกันเนื่องจาก %d", + "ORG_ZSTACK_TEST_10005": "โดยตั้งใจ %d", + "ORG_ZSTACK_SNS_SYSTEM_10002": "ไม่สามารถลบทรัพยากร API ได้", + "ORG_ZSTACK_TEST_10003": "ฉันไม่ควรอยู่ในรายการข้อผิดพลาด %d", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10019": "ไม่รู้จักประเภทการเข้ารหัส[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10014": "ไม่พบ model สำหรับ secret resource pool [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10015": "สถานะปัจจุบัน[%s] ไม่อนุญาตให้แก้ไขสถานะด้วยตนเอง", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10016": "ไม่สามารถปิดใช้งาน security VMs ทั้งหมดได้เมื่อฟังก์ชัน cryptographic เปิดใช้งานอยู่ กรุณาตรวจสอบให้แน่ใจว่ามี security VM อย่างน้อยหนึ่งตัวที่ใช้งานอยู่", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10017": "ตรวจสอบว่า resource pool UUID ถูกกำหนดค่าสำหรับการยืนยันตัวตนแล้ว", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10010": "ฟังก์ชัน crypto เปิดใช้งานอยู่แต่ resource pool[%s] สำหรับการป้องกันข้อมูลยังไม่ได้กำหนดค่า", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10013": "ตรวจสอบ model[%s] ประเภท[%s] client และ server availability exception", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10003": "การเชื่อมต่อ SSH ล้มเหลว โปรดตรวจสอบการตั้งค่าอินสแตนซ์คลาวด์และการกำหนดค่าเครือข่ายของคุณ", + "ORG_ZSTACK_AI_VM_10006": "ไม่พบกลุ่มอินสแตนซ์บริการโมเดลที่มี UUID: %s ล้มเหลวในการบันทึกอินสแตนซ์บริการโมเดล", + "ORG_ZSTACK_AI_VM_10007": "vm instance, config yaml หรือ service yaml มีค่าเป็น null สำหรับบริบทการ Deploy บริการโมเดล: %s", + "ORG_ZSTACK_AI_VM_10008": "deploy context หรือ virtual machine มีค่าเป็น null สำหรับอินสแตนซ์ %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10000": "ไม่สามารถจำลอง %s ไปยัง %s เกิดข้อผิดพลาด: %s", + "ORG_ZSTACK_AI_VM_10009": "ล้มเหลวในการยกเลิกงาน, %s", + "ORG_ZSTACK_SNS_SYSTEM_10000": "ไม่สามารถลบหัวข้อสัญญาณเตือนของระบบได้เนื่องจากทรัพยากรที่เกี่ยวข้อง โปรดตรวจสอบว่าทรัพยากรที่พึ่งพาทั้งหมดถูกลบออกแล้วก่อนพยายามลบอีกครั้ง", + "ORG_ZSTACK_AI_VM_10002": "ไม่พบ IP ของ VM NIC ในเครือข่าย L3 เริ่มต้น [UUID: %s] ซึ่งจำเป็นสำหรับบริการโมเดลแบบกระจาย", + "ORG_ZSTACK_SNS_SYSTEM_10001": "เฉพาะ HTTP endpoint เท่านั้นที่สามารถสมัครรับ API topic ได้; endpoint ที่ให้มา [type:%s] ไม่ใช่ HTTP endpoint ที่ถูกต้อง", + "ORG_ZSTACK_AI_VM_10003": "ModelServiceSession ไม่สามารถเป็น null ได้ โปรดตรวจสอบว่ามีการสร้าง session ที่ถูกต้องสำหรับบริการโมเดลคลาวด์", + "ORG_ZSTACK_AI_VM_10004": "ไม่สามารถแยกวิเคราะห์ YAML configuration สำหรับบริการโมเดล, service definition: %s", + "ORG_ZSTACK_AI_VM_10000": "ไม่พบ image [uuid: %s]", + "ORG_ZSTACK_AI_VM_10001": "ไม่สามารถดึง UUID จาก YAML ได้: %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10015": "เครือข่าย[%s] ถูกเพิ่มไปยังกลุ่ม HA[%s] แล้ว", + "ORG_ZSTACK_ROUTEPROTOCOL_10014": "เครือข่าย[%s] ถูกเพิ่มไปยังพื้นที่ virtual router[%s] แล้ว", + "ORG_ZSTACK_ROUTEPROTOCOL_10017": "Router ID[%s] ไม่ซ้ำกันภายในระบบคลาวด์นี้", + "ORG_ZSTACK_ROUTEPROTOCOL_10016": "Router ID[%s] ไม่เป็นไปตามรูปแบบ IPv4", + "ORG_ZSTACK_AI_VM_10011": "ไม่สามารถดึงสถานะจากอินสแตนซ์ได้เนื่องจาก instance URL ว่างเปล่า โปรดใส่ instance URL ที่ถูกต้องและลองอีกครั้ง", + "ORG_ZSTACK_HYBRID_BACKUP_10000": "%s สามารถเรียกใช้ได้เฉพาะโดยบัญชีผู้ดูแลระบบในสภาพแวดล้อมคลาวด์เท่านั้น", + "ORG_ZSTACK_EXTERNALSERVICE_CRONJOB_10001": "cron daemon ไม่ทำงานอยู่ โปรดตรวจสอบว่าได้เริ่มทำงานและกำหนดค่าอย่างถูกต้องแล้ว", + "ORG_ZSTACK_ROUTEPROTOCOL_10003": "[%s] ไม่เป็นไปตามรูปแบบที่อยู่ IPv4", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10030": "การตรวจสอบการซิงค์ token ความปลอดภัยของเครื่องทั้งหมดล้มเหลว โปรดตรวจสอบ token ความปลอดภัยและการกำหนดค่าเครื่องของคุณ", + "ORG_ZSTACK_ROUTEPROTOCOL_10008": "AreaId[%s] ได้รับการจัดเตรียมแล้ว", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10031": "การทดสอบการเชื่อมต่อ FlkSecClientFactory ล้มเหลว", + "ORG_ZSTACK_ROUTEPROTOCOL_10009": "KeyID และรหัสผ่านต้องไม่เป็นค่า null เมื่อประเภทการยืนยันตัวตนคือ %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10027": "ล้มเหลวในการสร้าง token ป้องกันข้อมูลสำหรับเครื่องความปลอดภัย %s เนื่องจาก %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10029": "ล้มเหลวในการรับผลลัพธ์การเข้ารหัสสำหรับอินสแตนซ์ความปลอดภัย %s เนื่องจาก %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10011": "ความยาวของรหัสผ่านต้องไม่เกิน 8 ไบต์เมื่อประเภทการยืนยันตัวตนคือ %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10028": "ล้มเหลวในการสร้าง HMAC token สำหรับเครื่องความปลอดภัย %s เนื่องจาก %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10010": "รหัสผ่านต้องไม่เป็นค่า null เมื่อประเภทการยืนยันตัวตนคือ %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10013": "เครือข่ายทั้งหมดควรเชื่อมโยงกับ virtual router [%s]", + "ORG_ZSTACK_ROUTEPROTOCOL_10012": "AreaId[%s] ต้องเป็นตัวระบุโซนที่ถูกต้อง", + "ORG_ZSTACK_ALIYUN_IDENTITYZONE_10000": "ไม่พบข้อมูลประจำตัวสำหรับทรัพยากรที่ร้องขอ โปรดตรวจสอบว่าคุณได้ให้ access key และ secret key ที่ถูกต้อง", + "ORG_ZSTACK_STORAGE_CDP_10005": "BackupStorage[uuid: %s] ถูกลบไปแล้ว", + "ORG_ZSTACK_STORAGE_CDP_10001": "kvmagent ไม่ตอบสนอง %d ครั้ง", + "ORG_ZSTACK_STORAGE_CDP_10004": "ไม่พบเครื่องเสมือนสำหรับ Cloud Deployment Pipeline task[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10000": "KVM agent รีสตาร์ทแล้ว โปรดตรวจสอบว่าส่งผลกระทบต่อเครื่องเสมือนของคุณหรือไม่", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10011": "เครือข่าย VXLAN ฮาร์ดแวร์สามารถสร้างได้ภายใน hardware VXLAN pool เท่านั้น", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10010": "เฉพาะเครือข่าย VXLAN ฮาร์ดแวร์เท่านั้นที่สามารถสร้างได้ภายใน hardware VXLAN pool", + "ORG_ZSTACK_STORAGE_CDP_10016": "libvirt บน host [UUID: %s] ไม่รองรับการสร้าง CDP tasks โปรดตรวจสอบเวอร์ชัน libvirt", + "ORG_ZSTACK_HYBRID_DATACENTER_10003": "Data Center [%s] ยังอยู่ในระหว่างการซิงโครไนซ์ โปรดรอ", + "ORG_ZSTACK_STORAGE_CDP_10017": "qemu บน host [UUID: %s] ไม่รองรับการสร้าง CDP tasks โปรดตรวจสอบเวอร์ชัน qemu", + "ORG_ZSTACK_HYBRID_DATACENTER_10002": "ไม่ใช่ region ที่ถูกต้องที่ระบุใน aliyun ซึ่งประกอบด้วย: %s", + "ORG_ZSTACK_STORAGE_CDP_10018": "เวอร์ชัน QEMU ที่ทำงานอยู่บน VM[uuid:%s] ไม่รองรับฟังก์ชัน mirrorBitmap โปรดตรวจสอบว่าคุณใช้เวอร์ชัน QEMU ที่เข้ากันได้", + "ORG_ZSTACK_STORAGE_CDP_10012": "query-mirror: ไม่พบ Host สำหรับ VM[uuid:%s]", + "ORG_ZSTACK_AI_EVALUATION_10000": "ไม่พบกลุ่มที่มี UUID: %s ในฐานข้อมูล", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10002": "สร้าง vxlan network bridge[%s] สำหรับ hardware device[uuid:%s, type:%s, vlan:%s] บน KVM host[uuid:%s] ล้มเหลว เพราะ %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10001": "ไม่มี SDN Controller Factory สำหรับ SDN Controller Type:%s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10000": "ไม่มี SDN controller สำหรับ VXLAN pool [uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10006": "ไม่สามารถกำหนดค่าเครือข่าย VXLAN สำหรับ VM ที่มี UUID [%s] บน destination host ที่มี UUID [%s]", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10005": "ไม่พบ SDN controller %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10003": "ตรวจสอบ bridge[%s] สำหรับ hardwareVxlan[uuid:%s, name:%s] บน KVM host[uuid:%s] ล้มเหลว, %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10009": "hardware VXLAN network pool ต้องกำหนดค่า physical interface %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10008": "hardware VXLAN network pool ไม่รองรับการสร้าง L3 networks", + "ORG_ZSTACK_HYBRID_DATACENTER_10001": "regionId [%s] ถูกสร้างไปแล้วโดย access key [%s]", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10007": "ตรวจสอบ physical network interface สำหรับ HardwareVxlanPool [uuid: %s, name: %s] บน KVM host [uuid: %s] ล้มเหลว, %s", + "ORG_ZSTACK_HYBRID_DATACENTER_10000": "dcType ไม่ใช่ประเภทที่รองรับ [%s]", + "ORG_ZSTACK_STORAGE_CDP_10027": "รูปแบบสตริงเวลาไม่ถูกต้อง: %s ควรจัดรูปแบบตาม ISO offset format เช่น %s", + "ORG_ZSTACK_STORAGE_CDP_10023": "อินสแตนซ์เครื่องเสมือนกำลังดำเนิน Continuous Data Protection (CDP) task อยู่ การแนบ volume จะเกินขนาดที่วางแผนไว้สำหรับ full backups โปรดปรับขนาด CDP task และลองอีกครั้ง", + "ORG_ZSTACK_STORAGE_CDP_10024": "VM[%s] สำหรับ volume[%s] กำลังทำงานบน Continuous Data Protection (CDP) ดังนั้นการปรับขนาดในขณะนี้ไม่สามารถทำได้", + "ORG_ZSTACK_STORAGE_CDP_10025": "งาน CDP [uuid: %s] พบการเปลี่ยนแปลงสถานะผิดปกติ จากสถานะเดิม: %s ไปยังสถานะใหม่: %s เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_CDP_10026": "งาน CDP ยังคงทำงานอยู่", + "ORG_ZSTACK_STORAGE_CDP_10022": "ไม่พบงาน CDP [uuid:%s]", + "ORG_ZSTACK_AI_EVALUATION_10001": "ไม่มีอินสแตนซ์แบ็กเอนด์ที่ตรงกันของกลุ่ม [uuid: %s, type:%s] อยู่", + "ORG_ZSTACK_AI_EVALUATION_10002": "ไม่สามารถค้นหา Model Service Instance Group VO โดยใช้ UUID ของกลุ่มบริการโมเดลที่ให้มา ซึ่งบ่งชี้ว่าไม่พบกลุ่มบริการที่เกี่ยวข้องที่รันงานประเมินผล ด้วยเหตุนี้ งานจึงยังคงอยู่ในสถานะระหว่างกลางแทนที่จะถูกทำเครื่องหมายว่าเสร็จสมบูรณ์ งานจะถูกอัปเดตเป็น 'Failed' โดยอัตโนมัติและข้อผิดพลาดจะถูกบันทึก", + "ORG_ZSTACK_LOGINCONTROL_10002": "นิพรรณกรรมกฎไม่ถูกต้อง ไม่สามารถเพิ่มกฎการควบคุมการเข้าถึงได้: %s", + "ORG_ZSTACK_LOGINCONTROL_10005": "ไม่รู้จักคีย์: %s", + "ORG_ZSTACK_LOGINCONTROL_10006": "ขาด key:value สำหรับการกำหนดค่าทรัพยากร %s", + "ORG_ZSTACK_PORTAL_APIMEDIATOR_10008": "resourceUuid[%s] ไม่ใช่ UUID ที่ถูกต้อง UUID ที่ถูกต้อง (แนะนำ v4) ควรมีรูปแบบโดยไม่มีขีดกลางและตรงกับ regex '[0-9a-f]{8}[0-9a-f]{4}[1-5][0-9a-f]{3}[89ab][0-9a-f]{3}[0-9a-f]{12}' สำหรับข้อมูลเพิ่มเติม ดูได้ที่ http://en.wikipedia.org/wiki/Universally_unique_identifier", + "ORG_ZSTACK_LOGINCONTROL_10007": "รูปแบบไม่ถูกต้องสำหรับการตั้งค่าการกำหนดค่าความแข็งแกร่งของรหัสผ่าน", + "ORG_ZSTACK_LOGINCONTROL_10008": "ค่าต่ำสุดไม่สามารถมากกว่าค่าสูงสุดได้", + "ORG_ZSTACK_STORAGE_CDP_10039": "ไม่พบพื้นที่จัดเก็บข้อมูลสำรอง [uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10034": "ประเภทงานที่ไม่คาดคิด [uuid: %s, type: %s] ในสภาพแวดล้อมการประมวลผลบนคลาวด์", + "ORG_ZSTACK_STORAGE_CDP_10035": "ไม่พบความจุสูงสุดสำหรับงาน Cloud Data Protection [uuid: %s] กรุณาอัปเดต", + "ORG_ZSTACK_STORAGE_CDP_10036": "ไม่พบความล่าช้าสูงสุดสำหรับ CDPSessionTask [uuid: %s] กรุณาอัปเดต", + "ORG_ZSTACK_STORAGE_CDP_10037": "VM [uuid: %s] ถูกยุติการทำงานไปแล้ว", + "ORG_ZSTACK_STORAGE_CDP_10031": "VM ไม่ได้ปิดอยู่ สถานะปัจจุบัน: %s", + "ORG_ZSTACK_STORAGE_CDP_10032": "วอลุมม shared [%s] ยังถูกใช้งานโดยเครื่องเสมือนอื่นอยู่", + "ORG_ZSTACK_STORAGE_CDP_10033": "ไม่พบงาน [uuid: %s]", + "ORG_ZSTACK_LOGINCONTROL_10012": "ไม่มีผู้ใช้ที่ใช้งานได้ที่มีชื่อ: %s ประเภท: %s ในสภาพแวดล้อมเสมือน", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10011": "คำขอ API ระบุประเภท IPMI chassis แต่ข้อความที่ได้รับไม่ใช่ประเภท APICreateBareMetal2ChassisHardwareInfoMsg โปรดตรวจสอบให้แน่ใจว่าประเภทข้อความตรงกับประเภท chassis ที่ระบุ", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10012": "ได้รับข้อมูลฮาร์ดแวร์สำหรับ baremetal chassis ที่ไม่รู้จัก [ipmi_addr:%s, ipmi_port:%d]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10010": "ล้มเหลวในการโหลดข้อมูล BareMetal2 IPMI chassis จากไฟล์ เนื่องจาก: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10015": "ล้มเหลวในการรีเซ็ตพลังงาน baremetal2 IPMI chassis [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10016": "ล้มเหลวในการบู๊ต IPXI ระยะไกลสำหรับอินสแตนซ์ [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10013": "ล้มเหลวในการเปิดเครื่อง baremetal2 IPMI chassis [UUID:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10014": "ล้มเหลวในการปิดเครื่อง baremetal2 IPMI chassis [uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10049": "VM [UUID: %s] ได้เริ่มต้นงาน CDP แล้ว ดังนั้นจึงไม่สามารถสร้างงานสำรองข้อมูลพร้อมกันได้", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10008": "Windows Local Disk Bare Metal instances ไม่รองรับการสร้างเครื่องเสมือนโดยอัตโนมัติ", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10009": "ไม่มี baremetal2 gateway ที่ใช้งานได้ในคลัสเตอร์ [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10006": "Cluster[uuid:%s] ไม่ใช่สภาพแวดล้อมการทำงานเสมือน BareMetal2", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10007": "Cluster[uuid:%s] ไม่ได้เปิดใช้งาน", + "ORG_ZSTACK_STORAGE_CDP_10045": "อาร์กิวเมนต์ที่จำเป็นหายไป: %s", + "ORG_ZSTACK_STORAGE_CDP_10046": "เวลาเก็บรักษาต่อวันและ RP รายวันนับจากวันไม่สามารถเท่ากันได้ โปรดตรวจสอบให้ตั้งค่าเป็นค่าที่แตกต่างกัน", + "ORG_ZSTACK_STORAGE_CDP_10047": "คาดหวัง UUID ของเครื่องเสมือนหนึ่งรายการ แต่ได้รับ %d", + "ORG_ZSTACK_STORAGE_CDP_10048": "ทรัพยากร [uuid: %s] ไม่ใช่อินสแตนซ์เครื่องเสมือน", + "ORG_ZSTACK_STORAGE_CDP_10041": "พื้นที่จัดเก็บข้อมูลสำรอง [UUID: %s] ไม่ได้เชื่อมต่อกับสภาพแวดล้อมคลาวด์ โปรดตรวจสอบให้มีการกำหนดค่าและบูรณาการอย่างถูกต้อง", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10005": "Cluster[uuid:%s] ไม่ใช่การกำหนดค่าคลัสเตอร์เซิร์ฟเวอร์แท้", + "ORG_ZSTACK_STORAGE_CDP_10042": "VM [UUID: %s] ได้สร้างงานสำรองข้อมูลแล้ว ดังนั้นจึงไม่สามารถเปิดใช้งานงาน CDP พร้อมกันได้", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10007": "ที่อยู่ IPMI และพอร์ตมีอยู่แล้ว", + "ORG_ZSTACK_STORAGE_CDP_10044": "การจัดสรรทรัพยากรเสมือนควรมากกว่าการจัดสรรทรัพยากรทางกายภาพ", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10001": "โปรดตรวจสอบสิ่งต่อไปนี้เพื่อสร้างการเชื่อมต่อกับเซิร์ฟเวอร์แท้: 1. ยืนยันว่าอินเทอร์เฟซ IPMI ทำงานอยู่ 2. ยืนยันว่าที่อยู่ IPMI พอร์ต ชื่อผู้ใช้ และรหัสผ่านถูกต้อง 3. ตรวจสอบว่า IPMI over LAN เปิดใช้งานอยู่ในการตั้งค่า BIOS", + "ORG_ZSTACK_STORAGE_CDP_10040": "พื้นที่จัดเก็บข้อมูลสำรอง[uuid: %s] ถูกปิดใช้งานในสภาพแวดล้อมคลาวด์", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10009": "แชสซีเซิร์ฟเวอร์แท้ที่มี UUID: %s ถูกกำหนดค่าให้ใช้ pxeserver ที่มี UUID: %s แต่คำขอ DHCP ถูกจัดการโดย pxeserver ที่มี UUID: %s", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10008": "ไม่มีเซิร์ฟเวอร์ PXE เซิร์ฟเวอร์แท้ที่ใช้งานได้ติดตั้งอยู่กับคลัสเตอร์[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10000": "แชสซี IPMI 2 เซิร์ฟเวอร์แท้ %s มีรายการที่มีอยู่แล้วสองรายการ", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10001": "ที่อยู่ IPMI %s ไม่ถูกต้อง", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10004": "แชสซีเซิร์ฟเวอร์แท้ที่มีที่อยู่ IPMI %s และพอร์ต %d ได้ถูกสร้างแล้ว", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10005": "Cluster[uuid:%s] ไม่มีอยู่", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10002": "ไม่สามารถสร้างการเชื่อมต่อกับโหนดเซิร์ฟเวอร์แท้ โปรดตรวจสอบ: 1. การเชื่อมต่อ IPMI ทำงานอยู่ 2. ที่อยู่ IPMI พอร์ต ชื่อผู้ใช้ และรหัสผ่านถูกต้อง 3. IPMI over LAN เปิดใช้งานอยู่ในการตั้งค่า BIOS", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10003": "แชสซี BareMetal2 ที่มีที่อยู่ IPMI %s และพอร์ต %d ได้ถูกสร้างแล้ว", + "ORG_ZSTACK_STORAGE_CDP_10056": "พบดิสก์รูทหลายรายการ: %s", + "ORG_ZSTACK_STORAGE_CDP_10058": "ไม่พบโวลูมรูทสำหรับการสำรองข้อมูล VM%s", + "ORG_ZSTACK_STORAGE_CDP_10059": "โวลูม %s รวมอยู่ในการสำรองข้อมูลแต่ถูกถอดออกจาก VM [UUID: %s] โปรดต่อกลับเข้ากับ VM หรือลบออกจากชุดการสำรองข้อมูล", + "ORG_ZSTACK_STORAGE_CDP_10053": "ไม่พบงาน Cloud Drive Provisioning สำหรับ VM[uuid: %s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10015": "ไม่สามารถเปิดเครื่องระยะไกลสำหรับแชสซีเซิร์ฟเวอร์แท้[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10054": "ไม่พบงาน CDP สำหรับ VM[uuid: %s] บน Backstore[uuid: %s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10018": "ไม่สามารถ PXE boot ระยะไกลสำหรับอินสแตนซ์[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10055": "recoverVm: ไม่พบโฮสต์[uuid: %s] สำหรับเครื่องเสมือน[uuid: %s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10017": "ไม่สามารถรีเซ็ตพลังงานระยะไกลสำหรับแชสซีเซิร์ฟเวอร์แท้[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10050": "ไม่สามารถขอ primary storage [uuid:%s] สำหรับความสามารถในการทำ volume snapshot ได้; ดูรายละเอียด [%s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10014": "ล้มเหลวในการลบ baremetal chassis %s", + "ORG_ZSTACK_STORAGE_CDP_10051": "recoverVm: ไม่ได้ระบุ host UUID และไม่พบ host เดิมสำหรับ VM[uuid: %s]", + "ORG_ZSTACK_SSHKEYPAIR_10009": "SSH key pair [uuid:%s] ไม่ได้ถูกแนบไปกับ virtual machine [uuid:%s]", + "ORG_ZSTACK_SSHKEYPAIR_10008": "SSH key pair [uuid:%s] ถูกแนบไปกับ virtual machine [uuid:] แล้ว", + "ORG_ZSTACK_SSHKEYPAIR_10007": "sshKeyPair[uuid:%s] กำลังถูกใช้งานอยู่ในปัจจุบัน", + "ORG_ZSTACK_STORAGE_CDP_10067": "ไม่พบ root volume จาก CDP backup %s:%d", + "ORG_ZSTACK_STORAGE_CDP_10068": "ไม่พบ root volume จาก CDP backup %s:%d", + "ORG_ZSTACK_SSHKEYPAIR_10011": "ประเภททรัพยากร %s ไม่รองรับการแนบ SSH key pair; ประเภทที่อนุญาตคือ %s", + "ORG_ZSTACK_SSHKEYPAIR_10010": "vmInstance[uuid:%s] ไม่อยู่ในสถานะ running", + "ORG_ZSTACK_STORAGE_CDP_10063": "ไม่พบ VM Cloud Deployment Process[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10064": "ไม่พบ VM instance สำหรับ Cloud Deployment Pipeline task[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10065": "ไม่พบบันทึก volume จาก virtual machine backup กรุณาตรวจสอบการกำหนดค่า VM และการตั้งค่า backup", + "ORG_ZSTACK_STORAGE_CDP_10066": "พบ multiple root disks จาก CDP backup %s:%d", + "ORG_ZSTACK_V2V_KVM_10003": "ขาด VM UUID ใน 'srcVmUrl'", + "ORG_ZSTACK_STORAGE_CDP_10060": "พบความไม่ตรงกันของขนาด volume[uuid: %s] อย่างไม่คาดคิด: คาดว่า %d bytes ได้รับขนาดที่แตกต่าง", + "ORG_ZSTACK_V2V_KVM_10004": "ไม่พบ root disk สำหรับ instance: %s", + "ORG_ZSTACK_STORAGE_CDP_10061": "resize volume[uuid: %s] ล้มเหลว: %s", + "ORG_ZSTACK_STORAGE_CDP_10062": "volume[uuid: %s] มี volume path ที่ไม่คาดคิด: %s", + "ORG_ZSTACK_V2V_KVM_10007": "ล้มเหลวในการทำความสะอาด KVM V2V conversion host[hostUuid:%s] เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_CDP_10078": "ไม่พบ CDP policy สำหรับ VM[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10075": "ไม่พบ recovery point ที่มี group ID %d", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10018": "ตัวแปรไม่ถูกต้อง: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10075": "NFS primary storage [uuid:%s, name:%s] ไม่พบ host clusters ที่แนบมาเพื่อดำเนินการ", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10077": "ไม่พบ host สำหรับ volume[uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10020": "ต้องการ List สำหรับทรัพยากร [%s] ที่นี่ แต่ได้รับ object เดียว", + "ORG_ZSTACK_ZBOX_10007": "zbox[name:%s] ไม่อยู่ในสถานะ Ready สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10025": "บาง actions ไม่ถูกต้องในบริบทของการจัดการ cloud resource กรุณาตรวจสอบพารามิเตอร์และลองใหม่", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10022": "ทรัพยากร [%s] ต้องถูกกำหนดค่าก่อน!", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10006": "destination host [UUID:%s] ไม่มี physical capacity เพียงพอสำหรับ primary storage [UUID:%s] เนื่องจาก threshold คือ %f แต่ available physical capacity คือ %d", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10007": "ไม่สามารถย้ายวอลุมที่มี UUID [%s] ได้ เนื่องจากวอลุมไม่อยู่ในสถานะ 'พร้อมใช้งาน'", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10008": "วอลุมข้อมูล [UUID: %s, ชื่อ: %s] ยังคงถูกต่อเชื่อมกับเครื่องเสมือน [UUID: %s] อยู่ กรุณายกเลิกการต่อเชื่อมก่อนเริ่มการย้าย", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10009": "วอลุมที่มี UUID %s เป็นวอลุมรูทของ VM ที่มี UUID %s ปัจจุบัน VM อยู่ในสถานะ %s กรุณาหยุด VM ก่อนเริ่มการย้าย", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10002": "วอลุมที่มี UUID [%s] ถูกต่อเชื่อมกับโฮสต์ที่มี UUID [%s] อยู่แล้ว", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10003": "ไม่พบพื้นที่จัดเก็บหลัก [UUID:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10004": "พื้นที่จัดเก็บหลัก [UUID:%s] ถูกปิดใช้งาน หรือไม่อนุญาตให้ย้ายข้อมูลแบบ cold migration ระหว่างการบำรุงรักษา", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10005": "โฮสต์ปลายทางที่มี UUID [%s] ไม่ได้อยู่ในพื้นที่จัดเก็บหลักท้องถิ่นที่มี UUID [%s] ซึ่งเป็นที่ตั้งของวอลุมที่มี UUID [%s]", + "ORG_ZSTACK_ZBOX_10001": "zbox[UUID:%s] ยังคงถูกใช้งานอยู่ ไม่สามารถถอดออกได้", + "ORG_ZSTACK_ZBOX_10002": "zbox[UUID:%s] ไม่อยู่ในสถานะพร้อมใช้งาน จึงไม่สามารถซิงโครไนซ์ความจุได้", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10000": "ไม่มีโฮสต์ใดที่สามารถจัดเตรียมความจุพื้นที่จัดเก็บที่ต้องการสำหรับวอลุมทั้งหมดของ VM [UUID:%s]", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10004": "บัญชี Aliyun [UUID:%s] ไม่มีอยู่", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10001": "วอลุมที่มี UUID [%s] ไม่ได้ถูกต่อเชื่อมกับพื้นที่จัดเก็บหลักท้องถิ่นใด", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10005": "หมายเลขโทรศัพท์ไม่ถูกต้อง [%s] กรุณาตรวจสอบว่ามีรูปแบบเป็น +86-12345678901", + "ORG_ZSTACK_ZBOX_10005": "zbox[UUID: %s] ดูเหมือนว่าถูกลบไปแล้ว", + "ORG_ZSTACK_ZBOX_10006": "อุปกรณ์ USB [uuid:%s] ถูกต่อเชื่อมกับ VM [uuid:%s] แล้ว จึงไม่สามารถเพิ่มลงใน Zbox ได้", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10000": "ไม่พบเทมเพลตข้อความเหตุการณ์ SMS ของ Aliyun กรุณาตรวจสอบว่าเทมเพลตถูกกำหนดค่าอย่างถูกต้องแล้วและลองใหม่", + "ORG_ZSTACK_ZBOX_10003": "สามารถลบได้เฉพาะไฟล์ภายในเส้นทางที่ติดตั้ง [mountPath: %s] บน zbox เท่านั้น แต่ [%s] ถูกส่งเข้ามา", + "ORG_ZSTACK_ZBOX_10004": "zbox[name:%s] ไม่อยู่ในสถานะพร้อมใช้งาน สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_SSHKEYPAIR_10006": "คู่คีย์ SSH %s ถูกอัปโหลดไปแล้ว", + "ORG_ZSTACK_SSHKEYPAIR_10005": "เกิดข้อผิดพลาดในการดำเนินการ เนื่องจาก: %s", + "ORG_ZSTACK_SSHKEYPAIR_10003": "คู่คีย์ SSH [uuid:%s] ไม่สามารถเชื่อมโยงกับ VM [uuid:%s] ได้เนื่องจากไม่พบคีย์", + "ORG_ZSTACK_SSHKEYPAIR_10002": "ไม่สามารถโหลดคีย์สาธารณะได้: %s, ข้อผิดพลาด: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10043": "การทดสอบการเชื่อมต่อ InfoSecClientFactory ล้มเหลว", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10044": "ปัจจุบันไม่รองรับการสร้างพูลทรัพยากร %s ในสภาพแวดล้อมนี้", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10041": "ไม่สามารถแยก distinguished name ของผู้ใช้จากคีย์สาธารณะได้: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10042": "การตรวจสอบการมีอยู่ของโทเค็นเครื่องข่ายความปลอดภัยทั้งหมดล้มเหลวสำหรับเครื่องเสมือนทั้งหมด", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10040": "ไม่สามารถแยกวิเคราะห์คีย์สาธารณะที่เข้ารหัสได้", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10058": "พื้นที่จัดเก็บหลัก NFS [uuid:%s, name:%s] ไม่พบโฮสต์ที่ใช้งานได้ในการสร้างวอลุมข้อมูล [uuid:%s, name:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10054": "vm[uuid:%s] ไม่อยู่ในสถานะ Running, Paused หรือ Stopped สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10055": "พื้นที่จัดเก็บหลักที่มี UUID:%s ไม่ได้ถูกเชื่อมโยงกับคลัสเตอร์ใด", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10050": "ไม่พบผู้ให้บริการแบ็กเอนด์ที่ใช้งานได้ โปรดตรวจสอบว่ามีผู้ให้บริการคลาวด์ที่ถูกต้องกำหนดค่าไว้และลองอีกครั้ง", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10051": "ไม่พบโฮสต์ในสถานะ Connected ที่ NFS primary storage [uuid:%s, name:%s] ถูกต่ออยู่ เพื่อย้อนกลับ volume [uuid:%s] ไปยัง snapshot [uuid:%s, name:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10052": "ไม่พบโฮสต์ในสถานะ connected ที่ NFS primary storage [uuid:%s, name:%s] ถูกต่ออยู่ เพื่อย้อนกลับ volume [uuid:%s] ไปยัง image [uuid:%s]", + "ORG_ZSTACK_IAM2_10019": "ไม่สามารถแยกวิเคราะห์นิพจน์ cron ได้ โปรดตรวจสอบว่ามีการจัดรูปแบบอย่างถูกต้องตามข้อกำหนดรูปแบบ cron มาตรฐาน", + "ORG_ZSTACK_IAM2_10018": "project[UUID: %s, name:%s] อยู่ในสถานะ %s ซึ่งไม่อนุญาตให้ดำเนินการ[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10038": "ล้มเหลวในการสร้าง data protection token %s สำหรับ security appliance %s เพราะ %s", + "ORG_ZSTACK_IAM2_10015": "องค์กรที่มี UUID %s ไม่สามารถตั้งเป็นลูกของตัวเองหรือองค์กรแม่ UUID %s ได้", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10039": "ล้มเหลวในการสร้าง HMAC token %s สำหรับ security appliance %s เพราะ %s", + "ORG_ZSTACK_IAM2_10014": "องค์กรปัจจุบัน [uuid:%s] ล้าสมัย โปรดเปิดใช้งาน", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10036": "generate-token ล้มเหลวสำหรับการจัดสรรทรัพยากรคลาวด์", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10037": "ล้มเหลวในการสร้าง activated token สำหรับ security machine %s เพราะ %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10034": "นำเข้า secret key ล้มเหลว โปรดตรวจสอบว่าคีย์กำหนดค่าถูกต้องและสามารถเข้าถึงได้ในสภาพแวดล้อมคลาวด์ของคุณ", + "ORG_ZSTACK_IAM2_10011": "virtual instance ID[uuid:%s] ไม่ถูกต้อง ไม่ว่าจะเป็น instance ไม่มีอยู่จริงหรือรหัสผ่านไม่ถูกต้อง", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10005": "รูปแบบประเภทไม่ถูกต้อง [%s]", + "ORG_ZSTACK_IAM2_10010": "ไม่พบบัญชีสำหรับ project[uuid:%s, name:%s] โปรดตรวจสอบว่าคุณมีสิทธิ์และข้อมูลประจำตัวที่ถูกต้องกำหนดค่าสำหรับสภาพแวดล้อมคลาวด์ของคุณ", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10035": "การเชื่อมต่อกับ security instance %s ล้มเหลวระหว่า�ากระบวนการสร้าง test key เพราะ %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10006": "รองรับเฉพาะทรัพยากรคลาวด์ แต่ได้รับ [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10032": "ล้มเหลวในการส่งออก secret key: %s", + "ORG_ZSTACK_IAM2_10013": "virtual ID ไม่ได้เป็นของ project", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10003": "ไม่สามารถรองรับประเภทการดำเนินการนี้: %s", + "ORG_ZSTACK_IAM2_10012": "virtual ID[name:%s] ถูกปิดใช้งานเนื่องจากการตั้งค่าการกำหนดค่า", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10030": "encryptSubjectDN ต้องไม่เป็นค่าว่าง", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10031": "ล้มเหลวในการแยกวิเคราะห์ metadata envelope สำหรับ cloud instance %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10002": "ไม่สามารถรองรับประเภททรัพยากรคลาวด์นี้: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10068": "NFS primary storage [uuid:%s, name:%s] ไม่ได้ต่อกับ cluster ใดหรือไม่มีโฮสต์ใน cluster ที่ต่ออยู่ที่เชื่อมต่อ", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10009": "ประเภทไม่ถูกต้อง: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10007": "รองรับเฉพาะ Resource หรือ Action แต่ได้รับ [%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10008": "ค่าเริ่มต้นต้องอยู่ในรูปแบบ JSON ตามที่ระบุโดย Type [%s] แต่พบ [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10029": "cipherText ต้องไม่เป็นค่าว่าง", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10027": "ล้มเหลวในการค้นหา secret key สำหรับเข้าถึงทรัพยากรที่เข้ารหัส โปรดตรวจสอบว่า secret key กำหนดค่าถูกต้องและมีสิทธิ์ที่จำเป็น", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10028": "วิเคราะห์ secret key ล้มเหลว, ข้อผิดพลาด: %s", + "ORG_ZSTACK_IAM2_10022": "อินสแตนซ์เสมือนปัจจุบัน [ID: %s] ไม่พร้อมใช้งาน กรุณาเปิดใช้งานอีกครั้ง", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10016": "การอ้างอิงตัวแปรแบบไดนามิกไม่ถูกต้อง ซึ่งต้องอยู่ในรูปแบบ ${variable:default}", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10024": "การเข้ารหัส HMAC ของไฟล์ขนาดใหญ่ล้มเหลว, รหัส: %s, รายละเอียด: %s", + "ORG_ZSTACK_IAM2_10021": "ผู้ใช้[%s] ไม่ใช่ผู้ใช้ที่ลงทะเบียนในแพลตฟอร์ม", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10017": "คำกริยาที่ระบุต้องมี '::' เพื่อระบุ namespace และ method!", + "ORG_ZSTACK_IAM2_10024": "รหัสผ่านเก่าไม่ตรงกับรหัสผ่านเดิม ไม่สามารถอัปเดตรหัสผ่านของเครื่องเสมือน [uuid:%s] ได้", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10014": "รูปแบบ JSON ไม่ถูกต้อง, สาเหตุ: %s", + "ORG_ZSTACK_IAM2_10023": "เฉพาะผู้ดูแลระบบและอินสแตนซ์เสมือนเท่านั้นที่สามารถดำเนินการอัปเดตได้", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10015": "ไม่พบ resource set ของ property file ก่อนหน้านี้!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10012": "decoder ไม่ถูกต้อง: %s!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10013": "ไม่พบ root element ใน CloudFormation template ของคุณ กรุณาตรวจสอบ definition ของ template!", + "ORG_ZSTACK_IAM2_10020": "quota[name:%s] ของ Account[uuid:%s] ไม่สามารถตั้งค่าเป็น %d ได้เนื่องจากจะเกิน quota ของ organization[uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10011": "ประเภทคือ: %s แต่คาดหวังประเภท: %s", + "ORG_ZSTACK_PCIDEVICE_10058": "โฮสต์ [%s] ไม่สามารถเข้าสู่โหมดบำรุงรักษา VM [%s] ไม่สามารถย้ายโดยอัตโนมัติเนื่องจากมีอุปกรณ์ PCI", + "ORG_ZSTACK_PCIDEVICE_10056": "ไม่สามารถเริ่มต้น VM[UUID:%s] เนื่องจากอุปกรณ์ PCI ทั้งหมด[UUIDs:%s] ไม่มีอยู่", + "ORG_ZSTACK_PCIDEVICE_10059": "อุปกรณ์ PCI [uuid:%s] ไม่สามารถต่อกับ vm [uuid:%s] ได้เนื่องจากสถานะไม่ถูกต้อง", + "ORG_ZSTACK_PCIDEVICE_10050": "กรุณาถอดอุปกรณ์ GPU ทั้งหมดออกจาก VM[%s] แล้วลองอีกครั้ง", + "ORG_ZSTACK_PCIDEVICE_10053": "อุปกรณ์ PCI ที่ระบุไม่ได้อยู่ร่วมกัน: อุปกรณ์ PCI ที่มี UUID [%s] อยู่บนโฮสต์ที่มี UUID [%s] ในขณะที่อุปกรณ์ PCI อื่นที่มี UUID [%s] อยู่บนโฮสต์ที่แตกต่างกันที่มี UUID [%s]", + "ORG_ZSTACK_PCIDEVICE_10052": "กรุณาถอดอุปกรณ์ PCI อื่นๆ ของ VM[%s] ออกแล้วลองอีกครั้ง", + "ORG_ZSTACK_PCIDEVICE_10051": "กรุณาถอดอุปกรณ์ GPU ทั้งหมดของ VM[%s] ออกแล้วลองอีกครั้ง", + "ORG_ZSTACK_PCIDEVICE_10068": "ไม่สามารถย้าย root volume [uuid:%s] ได้เนื่องจากมีอุปกรณ์ PCI ติดอยู่", + "ORG_ZSTACK_PCIDEVICE_10066": "ไม่สามารถย้าย VM[UUID:%s] เนื่องจากมีอุปกรณ์ PCI ติดอยู่", + "ORG_ZSTACK_PCIDEVICE_10061": "ไม่พบอุปกรณ์ PCI ที่มีสเปคเพียงพอ [uuid:%s] ในโฮสต์ปลายทาง [uuid:%s] สำหรับเครื่องเสมือน [uuid:%s]", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10003": "ไม่มี backup storage plugin ที่ลงทะเบียนกับ identity: %s", + "ORG_ZSTACK_PCIDEVICE_10065": "vm[%s] instance ไม่มีอยู่; ไม่สามารถ bind กับอุปกรณ์ PCI[%s] ได้", + "ORG_ZSTACK_PCIDEVICE_10064": "ไม่สามารถต่ออุปกรณ์ PCI [uuid:%s] กับ VM [uuid:%s] ได้เนื่องจากปัญหาการจัดสรรทรัพยากรของโฮสต์", + "ORG_ZSTACK_PCIDEVICE_10063": "อุปกรณ์ PCI [%s] ไม่พร้อมใช้งานทั้งหมด", + "ORG_ZSTACK_PCIDEVICE_10062": "มีปัญหากับ IOMMU group ของอุปกรณ์ PCI[uuid:%s]", + "ORG_ZSTACK_IAM2_10008": "virtualID[uuid:%s] ไม่มีอยู่ใน project[uuid:%s]", + "ORG_ZSTACK_IAM2_10009": "โปรเจกต์[name:%s] ไม่มีอยู่", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10000": "เส้นทางการติดตั้งว่างเปล่าถูกส่งคืนจากไดรเวอร์: %s", + "ORG_ZSTACK_IAM2_10004": "ล้มเหลวในการโหลดข้อมูล VirtualMachine ID จากไฟล์เพราะ\\n%s", + "ORG_ZSTACK_IAM2_10003": "มี %d ปัญหากับโค้ด", + "ORG_ZSTACK_IAM2_10006": "ล้มเหลวในการสร้างข้อมูล Virtual Machine ID จากไฟล์", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10001": "%s: สถานะสุขภาพ: %s", + "ORG_ZSTACK_IAM2_10005": "UUID [%s] มีอยู่แล้ว โปรดลอง UUID อื่น", + "ORG_ZSTACK_MEMORY_10000": "ไม่พบข้อมูลสำหรับ %s บน host[%s]", + "ORG_ZSTACK_PCIDEVICE_10036": "ไม่สามารถทำ SR-IOV virtualization สำหรับอุปกรณ์ PCI บน host [UUID:%s] ที่ถูกต่อกับ VM ได้", + "ORG_ZSTACK_PCIDEVICE_10035": "อุปกรณ์ PCI ใน host [UUID:%s] ถูกทำ SRIOV virtualization แล้ว", + "ORG_ZSTACK_PCIDEVICE_10034": "ไม่สามารถเปิดใช้งาน SRIOV สำหรับอุปกรณ์ได้เพราะ IOMMU ถูกปิดบน host [UUID:%s]", + "ORG_ZSTACK_PCIDEVICE_10033": "อุปกรณ์ pci [uuid:%s] ไม่พร้อมใช้งาน", + "ORG_ZSTACK_PCIDEVICE_10039": "อุปกรณ์ PCI [UUID:%s] ไม่มีอยู่หรือไม่ได้ถูกทำ SRIOV virtualization", + "ORG_ZSTACK_PCIDEVICE_10037": "สามารถสร้างอุปกรณ์ PCI เสมือนได้เพียง %d ตัวโดย %s domains ใน host[uuid:%s]", + "ORG_ZSTACK_STORAGE_CDP_10109": "backup storage[uuid: %s] ถูกอัปเกรดแล้ว", + "ORG_ZSTACK_STORAGE_CDP_10104": "task[uuid:%s] ถูกยกเลิกแล้ว", + "ORG_ZSTACK_STORAGE_CDP_10105": "กำลังรวมข้อมูล CDP task; โปรดอย่าเริ่มการ pickup operation", + "ORG_ZSTACK_STORAGE_CDP_10106": "CDP task[uuid:%s] เกินการใช้งาน storage: สูงสุด %d GB, ใช้ไป %d GB", + "ORG_ZSTACK_STORAGE_CDP_10107": "สถานะ VM Instance ที่ไม่คาดคิด: %s", + "ORG_ZSTACK_STORAGE_CDP_10102": "CDP task[uuid: %s] ไม่มี virtual machine ที่เกี่ยวข้อง", + "ORG_ZSTACK_PCIDEVICE_10047": "อุปกรณ์ pci [uuid:%s] ไม่ได้ถูกทำ virtualization เป็น managed devices", + "ORG_ZSTACK_PCIDEVICE_10045": "อุปกรณ์ pci [uuid:%s] ไม่สามารถทำ virtualization โดย mdev specification [uuid:%s] ได้", + "ORG_ZSTACK_PCIDEVICE_10044": "อุปกรณ์ PCI [UUID:%s] ไม่สามารถทำ virtualization เป็น MDEVs ได้ โปรดตรวจสอบว่าเปิดใช้งานและถูกถอดแล้ว", + "ORG_ZSTACK_PCIDEVICE_10049": "Host [UUID:%s] ที่อุปกรณ์ PCI [UUID:%s] ต่ออยู่ไม่ได้เชื่อมต่อ", + "ORG_ZSTACK_PCIDEVICE_10048": "อุปกรณ์ PCI ที่สร้างจาก [UUID:%s] ยังถูกต่อกับ VM instance อยู่", + "ORG_ZSTACK_STORAGE_CDP_10119": "ประเภท task ที่ไม่คาดคิด: %s", + "ORG_ZSTACK_PCIDEVICE_10043": "ไม่สามารถยกเลิกการมอบหมายอุปกรณ์ PCI[%s] ได้เพราะ virtual functions กำลังถูกใช้งาน\\nรายละเอียด:\\n%s", + "ORG_ZSTACK_PCIDEVICE_10042": "ไม่สามารถยกเลิกการสร้างอุปกรณ์ PCI[%s] ได้เพราะไม่ใช่ GPU หรือ Network Interface Controller", + "ORG_ZSTACK_PCIDEVICE_10041": "ไม่สามารถยกเลิกการสร้างอุปกรณ์ PCI เสมือนบน host [uuid:%s] ได้เพราะยังถูกต่อกับ VM อยู่", + "ORG_ZSTACK_PCIDEVICE_10040": "ไม่สามารถยกเลิกการสร้างอุปกรณ์ pci [uuid:%s] ได้เพราะ host [uuid:%s] ไม่ได้เชื่อมต่อ", + "ORG_ZSTACK_STORAGE_CDP_10117": "ไม่พบงาน CDP[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10118": "สถานะของงาน CDP[uuid: %s] เปลี่ยนแปลงผิดปกติ, สถานะเก่า: %s, สถานะใหม่: %s เนื่องจากโควตาพื้นที่จัดเก็บเต็ม, ปัจจุบัน: %d, โควตา: %d.", + "ORG_ZSTACK_STORAGE_CDP_10111": "เวอร์ชัน QEMU-img ของพื้นที่สำรองข้อมูล[UUID: %s] ต้องได้รับการอัปเกรด", + "ORG_ZSTACK_STORAGE_CDP_10112": "ไม่พบงาน Cloud Data Protection สำหรับ VM: %s", + "ORG_ZSTACK_STORAGE_CDP_10113": "ไม่มีพื้นที่สำรองข้อมูลที่กำหนดค่าสำหรับเครื่องเสมือน: %s", + "ORG_ZSTACK_STORAGE_CDP_10114": "ไม่พบ CdpBackupFactory ประเภท[%s] ในสภาพแวดล้อมคลาวด์", + "ORG_ZSTACK_STORAGE_CDP_10110": "สถาปัตยกรรมของพื้นที่สำรองข้อมูล[UUID: %s] ไม่รองรับการอัปเกรดงาน continuous data protection", + "ORG_ZSTACK_IDENTITY_10072": "ไม่สามารถอัปเดตโควตา[ชื่อ: %s] สำหรับบัญชี[ตัวระบุ: %s] ได้", + "ORG_ZSTACK_IDENTITY_10071": "ไม่พบตัวตรวจสอบการอัปเดตโควตาสำหรับโควตา[uuid:%s, ประเภท:%s]", + "ORG_ZSTACK_AI_CONTAINER_10001": "ไม่พบศูนย์โมเดลที่มี uuid %s ในสภาพแวดล้อมคลาวด์", + "ORG_ZSTACK_AI_CONTAINER_10005": "ล้มเหลวในการเรียก URL ของบริการ อาจเกิดจาก IP ของบริการเป็น null โปรดตรวจสอบการกำหนดค่าเครือข่าย Kubernetes", + "ORG_ZSTACK_AI_CONTAINER_10004": "ล้มเหลวในการสร้างบริการ Kubernetes ในสภาพแวดล้อมคลาวด์", + "ORG_ZSTACK_AI_CONTAINER_10003": "ล้มเหลวในการสร้าง Kubernetes Deployment สำหรับแอปพลิเคชัน %s ใน namespace %s เนื่องจากข้อจำกัดหรือปัญหาการกำหนดค่าของทรัพยากรคลาวด์ โปรดตรวจสอบการจัดสรรทรัพยากรและการกำหนดค่าการ deploy", + "ORG_ZSTACK_AI_CONTAINER_10009": "ไม่พบ endpoint ที่มี UUID %s ไม่สามารถซิงโครไนซ์ทรัพยากร container ในฐานข้อมูลได้", + "ORG_ZSTACK_AI_CONTAINER_10007": "ล้มเหลวในการเริ่มต้นบริการจัดเก็บข้อมูลใน Kubernetes cluster", + "ORG_ZSTACK_AI_CONTAINER_10006": "ล้มเหลวในการสร้าง network policy สำหรับ distribution model service instance %s", + "ORG_ZSTACK_TAG2_10011": "ทรัพยากร[uuid:%s] ถูกเชื่อมโยงกับ %d แท็กแล้ว และไม่สามารถเพิ่มได้อีก", + "ORG_ZSTACK_IDENTITY_10063": "คำสั่งต้องมีฟิลด์ action ที่ไม่ว่าง คำสั่งที่ไม่ถูกต้อง[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10006": "มี NFS primary storage ที่มี URL %s อยู่แล้วใน zone[uuid: %s]", + "ORG_ZSTACK_IDENTITY_10062": "คำสั่งต้องระบุฟิลด์ action คำสั่งที่ไม่ถูกต้อง[%s]", + "ORG_ZSTACK_IDENTITY_10061": "คำสั่งต้องกำหนดค่าหรือมีผลต่อสถานะ คำสั่งที่ไม่ถูกต้อง[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10008": "พบ CIDR block หลายรายการที่เชื่อมโยงกับ network interface โปรดระบุ CIDR block เดียวหรือตรวจสอบการกำหนดค่าเครือข่าย", + "ORG_ZSTACK_IDENTITY_10060": "กลุ่ม[ชื่อ: %s, uuid: %s] ไม่ได้เชื่อมโยงกับบัญชี[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10009": "CIDR block ไม่ถูกต้อง: %s", + "ORG_ZSTACK_IDENTITY_10067": "ไม่สามารถอัปเดตชื่อบัญชีผู้ดูแลระบบได้ โปรดตรวจสอบว่าคุณใช้ไวยากรณ์และพารามิเตอร์ที่ถูกต้องสำหรับการแก้ไขข้อมูลบัญชี สำหรับรายละเอียดเพิ่มเติม โปรดดูเอกสารอย่างเป็นทางการ", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10002": "ไม่พบ host ที่เชื่อมต่อใน cluster สำหรับ placement group ที่ระบุ[uuid: %s]", + "ORG_ZSTACK_IDENTITY_10066": "รหัสผ่านที่ให้ไม่ตรงกับรหัสผ่านปัจจุบันสำหรับบัญชี[UUID: %s] โปรดตรวจสอบความถูกต้องและลองอีกครั้ง", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10003": "ไม่พบ host ที่เชื่อมต่อเพื่อดำเนินการคำสั่งสำหรับ NFS primary storage[uuid:%s]", + "ORG_ZSTACK_IDENTITY_10065": "บัญชีมีชื่อที่ตรงกับ %s อยู่แล้ว", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10004": "ไม่พบ host ที่มีการเชื่อมต่อ NFS เพื่อดำเนินการคำสั่งสำหรับ NFS primary storage[uuid:%s]", + "ORG_ZSTACK_IDENTITY_10069": "บัญชี[uuid: %s, name: %s] เป็นบัญชีมาตรฐานและไม่มีสิทธิ์ในการรีเซ็ตรหัสผ่านของบัญชีอื่น[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10000": "พื้นที่เก็บข้อมูลหลัก NFS [uuid:%s] ไม่ได้เชื่อมต่อกับคลัสเตอร์คอมพิวเตอร์ใดๆ และด้วยเหตุนี้จึงไม่สามารถลบวอลุ่มรูท [uuid:%s] ของเครื่องเสมือน [uuid:%s] ได้", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10004": "รองรับเฉพาะ baremetal2 image ที่มีโหมดบูต %s เท่านั้น", + "ORG_ZSTACK_IDENTITY_10068": "เฉพาะบัญชีผู้ดูแลระบบเท่านั้นที่สามารถอัปเดตรหัสผ่านของตนเองได้", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10003": "แอตทริบิวต์ bootMode เป็นสิ่งจำเป็นสำหรับ baremetal2 images", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10002": "เฉพาะ root volume template ที่มีรูปแบบ raw/qcow2 เท่านั้นที่สามารถติดแท็กด้วย baremetal2 ได้", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10001": "อนุญาตให้มี system tag ประเภท baremetal2 ได้เพียงหนึ่งรายการเท่านั้น แต่พบ %d รายการ", + "ORG_ZSTACK_AI_CONTAINER_10012": "ไม่สามารถค้นหาชื่อ pod จาก ip %s ได้", + "ORG_ZSTACK_AI_CONTAINER_10011": "ไม่สามารถดึงที่อยู่ IP ของ pod ได้ ไม่สามารถเพิ่มรายการลงในตาราง endpoint ของ container ได้ โปรดตรวจสอบว่า pod กำลังทำงานอยู่และสามารถเข้าถึงได้", + "ORG_ZSTACK_AI_CONTAINER_10010": "คลัสเตอร์ที่มี uuid %s ไม่พบในสภาพแวดล้อมการทำให้เป็นเสมือน", + "ORG_ZSTACK_COMPUTE_VM_NUMA_10003": "ชุด CPU [%s] ไม่ถูกต้อง", + "ORG_ZSTACK_AI_CONTAINER_10016": "ไม่สามารถดึง k8s deployment %s ได้", + "ORG_ZSTACK_AI_CONTAINER_10015": "ไม่สามารถลบ Kubernetes service ได้เนื่องจาก %s", + "ORG_ZSTACK_TAG2_10008": "ต้องระบุประเภท token ทั้งหมด", + "ORG_ZSTACK_AI_CONTAINER_10014": "ไม่สามารถลบ Kubernetes deployment ได้เนื่องจาก %s", + "ORG_ZSTACK_AI_CONTAINER_10013": "ไม่สามารถเพิ่ม label %s ให้กับ pod %s ได้", + "ORG_ZSTACK_TAG2_10006": "ข้อกำหนดสี [%s] ไม่ถูกต้อง ต้องเป็นรหัสเลขฐานสิบหกที่ถูกต้อง เช่น #FF00FF", + "ORG_ZSTACK_TAG2_10007": "รูปแบบ[%s] ต้องเป็น name::{tokenName1}::{tokenName2} ... ::{tokenNameN} หรือ {tokenName1}::{tokenName2} ... ::{tokenNameN} เท่านั้น ชื่อไม่ควรมี '{}:'", + "ORG_ZSTACK_AI_CONTAINER_10019": "รูปแบบ YAML ไม่ถูกต้อง: %s", + "ORG_ZSTACK_TAG2_10004": "รูปแบบ simple tag pattern ว่างเปล่าหรือมี token ที่ไม่ถูกต้อง", + "ORG_ZSTACK_AI_CONTAINER_10018": "deployment %s ไม่มีข้อมูล instance", + "ORG_ZSTACK_TAG2_10005": "UUIDs แท็ก %s ไม่ถูกต้อง ประเภทแท็กต้องเป็นประเภท simple", + "ORG_ZSTACK_AI_CONTAINER_10017": "deployment %s ไม่มีอยู่จริง", + "ORG_ZSTACK_IDENTITY_10070": "ไม่พบ Quota[name: %s] สำหรับบัญชี[uuid: %s]", + "ORG_ZSTACK_TAG2_10002": "ไม่สามารถอัปเดตรูปแบบ simple tag pattern สำหรับข้อมูลเมตาของ cloud resource ได้", + "ORG_ZSTACK_TAG2_10003": "พบชื่อทรัพยากรซ้ำ โปรดตรวจสอบและแก้ไข", + "ORG_ZSTACK_SNS_PLATFORM_WECOM_10000": "ไม่สามารถส่งข้อความไปยัง WeCom ได้ สถานะ: %s, body: %s", + "ORG_ZSTACK_TAG2_10000": "การละเมิดความเป็นเอกลักษณ์ของแท็ก: แท็กประเภท [%s] ที่มีชื่อ [%s] มีอยู่แล้วภายใต้บัญชี [%d]", + "ORG_ZSTACK_TAG2_10001": "คุณสามารถอัปเดต token ID เท่านั้น", + "ORG_ZSTACK_PCIDEVICE_10072": "ข้อกำหนดอุปกรณ์ PCI[uuid:%s] ไม่มีอยู่จริง", + "ORG_ZSTACK_PCIDEVICE_10071": "ประเภทที่ผิดกฎหมาย[%s] สำหรับอุปกรณ์ PCI มีเพียงประเภทที่รองรับเท่านั้นที่ถูกกฎหมาย", + "ORG_ZSTACK_PCIDEVICE_10070": "อุปกรณ์ pci [uuid:%s] ไม่มีอยู่", + "ORG_ZSTACK_PCIDEVICE_10075": "อุปกรณ์ PCI [UUID:%s] ไม่มีอยู่หรือถูกปิดใช้งานสำหรับ VM [UUID:%s]", + "ORG_ZSTACK_PCIDEVICE_10073": "ประเภทที่ผิดกฎหมาย[%s] สำหรับข้อกำหนดอุปกรณ์ PCI มีเพียงประเภทที่รองรับเท่านั้นที่ถูกกฎหมาย", + "ORG_ZSTACK_AI_CONTAINER_10023": "YAML การติดตั้ง Kubernetes ไม่ถูกต้อง: %s", + "ORG_ZSTACK_AI_CONTAINER_10020": "ไม่สามารถแก้ไขการติดตั้ง Kubernetes %s เพื่อหยุด pods ทั้งหมด", + "ORG_ZSTACK_AI_CONTAINER_10025": "ไม่พบกลุ่มอินสแตนซ์บริการโมเดล %s ในฐานข้อมูล", + "ORG_ZSTACK_AI_CONTAINER_10024": "ไม่สามารถแก้ไขการติดตั้ง k8s %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10039": "สร้างโวลูมรูท[uuid:%s] จากอิมเมจแคช[path:%s] ล้มเหลวเนื่องจากข้อผิดพลาดในสภาพแวดล้อมการจำลองเสมือน", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10040": "originText หรือ certificateText ไม่สามารถเป็นค่าว่างได้", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10036": "ไม่สามารถลบ bits[%s] บนพื้นที่จัดเก็บหลัก NFS[uuid:%s], ข้อผิดพลาด: %s, จะทำความสะอาด install path, pinv.getUuid(), rsp.getError()", + "ORG_ZSTACK_NETWORK_L3_10067": "ความล้มเหลวของ DNS บนเครือข่าย Layer 3 [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10037": "ไม่สามารถย้อนกลับโวลูม[uuid:%s] ไปยังสแนปชอต[uuid:%s] บนโฮสต์ KVM[uuid:%s, ip:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10038": "ไม่สามารถย้อนกลับโวลูม[uuid:%s] ไปยังอิมเมจ[uuid:%s] บนโฮสต์ KVM[uuid:%s, ip:%s], %s", + "ORG_ZSTACK_CRYPTO_AUTH_10020": "ไม่สามารถสร้างคลาสสำหรับ %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10032": "ไม่สามารถตรวจสอบการมีอยู่ของ %s บนพื้นที่จัดเก็บหลัก NFS[uuid:%s], ข้อผิดพลาด: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10034": "ไม่สามารถสร้างโวลูมว่าง[uuid:%s, name:%s] บนโฮสต์ KVM[uuid:%s, ip:%s], เนื่องจาก %s", + "ORG_ZSTACK_CRYPTO_AUTH_10029": "ไม่พบข้อมูลใบรับรองสำหรับเครื่องเสมือน %s โปรดตรวจสอบว่าใบรับรองที่จำเป็นได้รับการกำหนดค่าและอัปโหลดไปยังสภาพแวดล้อมคลาวด์อย่างถูกต้อง", + "ORG_ZSTACK_CRYPTO_AUTH_10028": "ไม่สามารถแยกวิเคราะห์ข้อความธรรมดาในพารามิเตอร์การเข้ารหัสเป็นวัตถุ JSON: %s", + "ORG_ZSTACK_HYGON_10006": "VM[uuid:%s] ไม่พบ", + "ORG_ZSTACK_HYGON_10005": "โฮสต์ที่มี UUID %s มีเครื่องเสมือนที่ทำงานอยู่ %d เครื่องที่เปิดใช้งาน Hygon Security Features โปรดปิดเครื่องเหล่านั้นก่อน", + "ORG_ZSTACK_HYGON_10004": "โฮสต์[uuid:%s] ไม่ได้เชื่อมต่อ", + "ORG_ZSTACK_HYGON_10003": "โฮสต์[UUID:%s] ต้องการให้พารามิเตอร์ 'enableCgroupDeviceAcl' มากกว่า 0 สำหรับอุปกรณ์ mdev ของ Hygon โปรดกำหนดค่าการตั้งค่านี้ก่อนสร้างอุปกรณ์ mdev", + "ORG_ZSTACK_HYGON_10002": "โฮสต์[UUID:%s] ต้องการให้การกำหนดค่า 'reconnect.host.restart.libvirtd.service' ตั้งค่าเป็น 'true' สำหรับอุปกรณ์ mdev ของ Hygon โปรดกำหนดค่าการตั้งค่านี้ก่อนสร้างอุปกรณ์ mdev", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10017": "สร้างใบรับรองล้มเหลวสำหรับอินสแตนซ์คลาวด์ %s", + "ORG_ZSTACK_HYGON_10000": "ไม่สามารถยกเลิกการสร้างอุปกรณ์ mdev มีอุปกรณ์ mdev %d ตัวยังคงผูกกับ VMs บนโฮสต์ [uuid: %s] โปรดตรวจสอบว่า VMs ทั้งหมดที่ใช้อุปกรณ์เหล่านี้หยุดทำงานแล้ว", + "ORG_ZSTACK_NETWORK_L3_10073": "ไม่มีเส้นทางโฮสต์สำหรับ prefix[%s] บนเครือข่าย Layer 3[uuid:%s]", + "ORG_ZSTACK_NETWORK_L3_10072": "prefix [%s] ไม่ใช่ CIDR ของเครือข่าย IPv4 ที่ถูกต้อง", + "ORG_ZSTACK_NETWORK_L3_10071": "มีเส้นทางโฮสต์สำหรับ prefix[%s] บนเครือข่าย L3[uuid:%s] อยู่แล้ว", + "ORG_ZSTACK_HYGON_10009": "จัดสรรอุปกรณ์ MDEV ของ Hygon ล้มเหลวเนื่องจากการจัดสรรพร้อมกัน โปรดลองใหม่ภายหลัง", + "ORG_ZSTACK_NETWORK_L3_10070": "next-hop[%s] ไม่ใช่ที่อยู่ IPv4 ที่ถูกต้อง", + "ORG_ZSTACK_HYGON_10008": "อุปกรณ์ Hygon IOMMU Group บนโฮสต์[uuid:%s] ไม่เพียงพอ ต้องการ: %d", + "ORG_ZSTACK_HYGON_10007": "ไม่สามารถแก้ไขการตั้งค่า Hygon Security Element ขณะที่ VM[uuid:%s] อยู่ในสถานะ [%s] กรุณาหยุด VM ก่อนทำการเปลี่ยนแปลง", + "ORG_ZSTACK_TICKET_ENTITY_10001": "ปฏิเสธการดำเนินการ ตั๋วอยู่ในสถานะ %s ไม่สามารถดำเนินการ[%s] ได้", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10031": "กลุ่มความปลอดภัย [%s] ไม่มีอยู่จริง", + "ORG_ZSTACK_IDENTITY_10022": "ไม่พบทรัพยากร[UUID:%s]; UUID ทรัพยากรไม่ถูกต้องหรือทรัพยากรเป็นทรัพยากรของผู้ดูแลระบบ", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10049": "ไม่พบ backend ที่ใช้งานได้สำหรับการจัดสรรทรัพยากรคลาวด์ กรุณาตรวจสอบว่าบริการ backend ของคุณกำหนดค่าและพร้อมใช้งานอย่างถูกต้อง", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10042": "ไม่มีโฮสต์ในคลัสเตอร์[uuid:%s] พร้อมสำหรับการเชื่อมต่อ", + "ORG_ZSTACK_IDENTITY_10026": "%s ไม่ใช่ API endpoint ที่รู้จัก", + "ORG_ZSTACK_IDENTITY_10025": "ผู้ใช้ที่ระบุโดย userUuid[%s] ไม่ได้เป็นของบัญชีปัจจุบัน และบัญชีปัจจุบันขาดสิทธิ์ผู้ดูแลระบบ จึงไม่สามารถตรวจสอบสิทธิ์ของผู้ใช้ได้", + "ORG_ZSTACK_IDENTITY_10029": "ไม่พบบัญชี[uuid:%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10001": "security instance[uuid:%s] รุ่นไม่ถูกต้อง", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10037": "ประเภทอัลกอริทึม %s ไม่ถูกต้อง ประเภทที่รองรับ: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10002": "security instance [%s] ไม่สามารถเรียกใช้การซิงโครไนซ์ด้วยตนเองได้ กรุณายืนยันว่า security instance ได้ซิงโครไนซ์คีย์แล้ว!", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10038": "พูลทรัพยากร[%s] ที่ระบุสำหรับการป้องกันข้อมูลไม่มีอยู่จริง", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10000": "secretResourcePool[uuid:%s] ไม่อยู่ในสถานะที่คาดหวัง %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10032": "มีเหตุการณ์ด้านความปลอดภัยกับ IP การจัดการ [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10033": "managementIp[%s] ไม่ใช่ที่อยู่ IPv4 ที่ถูกต้อง", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10034": "ไม่สามารถสร้างการเชื่อมต่อกับ security instance %s[%s] เนื่องจาก %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10035": "หลังจากเปิดใช้งานฟังก์ชัน crypto แล้ว ควรสงวน security instance อย่างน้อยหนึ่งรายการในพูลทรัพยากรที่เกี่ยวข้อง", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10017": "ไม่สามารถสร้างไดเรกทอรี[installUrl:%s] บน KVM host[uuid:%s, ip:%s] เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10018": "ไม่มีโฮสต์ในคลัสเตอร์ที่เชื่อมต่อหรือ primary storage [uuid:%s] ที่แนบกับคลัสเตอร์ใด", + "ORG_ZSTACK_IDENTITY_10050": "toPublic ถูกตั้งค่าเป็น false accountUUIDs ไม่สามารถเป็น null หรือว่างเปล่า กรุณาตรวจสอบว่าได้ระบุ UUID แล้ว", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10019": "ไม่สามารถ ping NFS primary storage [uuid:%s] จากโฮสต์ [uuid:%s] เนื่องจากปัญหาเครือข่ายหรือไม่พร้อมใช้งาน ตัดการเชื่อมต่อโฮสต์-ps นี้", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10013": "ไม่สามารถโอน [%s] จาก SFTP backup storage [hostname:%s] ไปยัง NFS primary storage [uuid:%s, path:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10014": "ไม่สามารถอัปโหลด bits จาก NFS primary storage[uuid:%s, mountpoint:%s] ไปยัง SFTP backup storage[hostname:%s, path:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10016": "ไม่สามารถแนบ primary storage[uuid:%s, name:%s] กับ cluster[uuid:%s] ได้ KVM host ในคลัสเตอร์ใช้ qemu-img รุ่น[%s]; อย่างไรก็ตาม primary storage แนบกับคลัสเตอร์อื่นที่มี KVM host ใช้ qemu-img รุ่น[%s] รุ่น qemu-img ที่มากกว่า %s เข้ากันไม่ได้กับรุ่นที่น้อยกว่า %s ซึ่งอาจทำให้การดำเนินการ volume snapshot ล้มเหลว กรุณาหลีกเลี่ยงการแนบ primary storage กับคลัสเตอร์ที่มี Linux distribution ต่างกันเพื่อป้องกันความไม่ตรงกันของรุ่น qemu-img", + "ORG_ZSTACK_IDENTITY_10059": "ผู้ใช้[name: %s, uuid: %s] ไม่ได้เชื่อมโยงกับบัญชี[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10010": "ที่อยู่ IP [%s] ไม่ได้อยู่ใน CIDR block [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10011": "มีเครื่องเสมือนที่กำลังทำงานอยู่ %s รายการบน NFS primary storage กรุณาหยุดแล้วลองอีกครั้ง:", + "ORG_ZSTACK_IDENTITY_10057": "นโยบาย[name: %s, uuid: %s] ไม่ได้เป็นของบัญชี[uuid: %s]", + "ORG_ZSTACK_CRYPTO_AUTH_10009": "โมเดลพูลทรัพยากรลับไม่ถูกต้อง คาดว่าจะเป็น %s แต่พบ %s", + "ORG_ZSTACK_CRYPTO_AUTH_10008": "ไม่สามารถค้นหาโมเดลสำหรับพูลทรัพยากรลับ [%s]", + "ORG_ZSTACK_CRYPTO_AUTH_10006": "การดำเนินการนี้ไม่รองรับในสภาพแวดล้อมคลาว์ปัจจุบัน โปรดตรวจสอบว่าอินสแตนซ์เครื่องเสมือนของคุณรองรับการดำเนินการที่ต้องการ", + "ORG_ZSTACK_IDENTITY_10041": "ไม่สามารถสร้างกลุ่มได้ มีกลุ่มที่มีชื่อเดียวกันอยู่แล้วภายใต้บัญชี [UUID: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10028": "โฮสต์ที่เลือก [UUID:%s] สำหรับการย้ายข้อมูลจัดเก็บไม่พร้อมใช้งาน", + "ORG_ZSTACK_CRYPTO_AUTH_10016": "ไม่สามารถสร้างการเชื่อมต่อกับโหนดบริการเข้ารหัสระยะไกลได้ โปรดตรวจสอบว่าบริการทำงานอยู่และการเชื่อมต่อเครือข่ายกำหนดค่าอย่างถูกต้อง", + "ORG_ZSTACK_IDENTITY_10040": "accountName และ accountUuid ไม่สามารถเป็นค่าว่างทั้งคู่ได้ ต้องระบุอย่างน้อยหนึ่งรายการ", + "ORG_ZSTACK_CRYPTO_AUTH_10015": "การยืนยันตัวตนไม่ได้ระบุพูลทรัพยากรสำหรับจัดสรรทรัพยากร โปรดตรวจสอบว่าระบุพูลทรัพยากรอย่างถูกต้องสำหรับบริการ", + "ORG_ZSTACK_IDENTITY_10045": "ไม่สามารถลบบัญชีผู้ดูแลระบบในตัวได้ โปรดใช้บัญชีที่ไม่ใช่แบบในตัวสำหรับการลบ", + "ORG_ZSTACK_IDENTITY_10044": "บัญชี %s ถูกห้ามไม่ให้ลบตัวเอง โปรดติดต่อผู้ดูแลระบบเพื่อขอความช่วยเหลือ", + "ORG_ZSTACK_IDENTITY_10043": "ไม่สามารถสร้างบัญชีได้ มีบัญชีที่มีชื่อเดียวกันอยู่แล้ว", + "ORG_ZSTACK_IDENTITY_10042": "ไม่สามารถสร้างผู้ใช้ได้ มีผู้ใช้ที่มีชื่อเดียวกันอยู่แล้วภายใต้บัญชี [UUID: %s]", + "ORG_ZSTACK_IDENTITY_10049": "การตรวจสอบยืนยันตัวตนทั้งหมดล้มเหลว และรายการ UUID ของบัญชีที่ระบุเป็นค่าว่างหรือไม่มีข้อมูล โปรดตรวจสอบข้อมูลของคุณและตรวจสอบว่าระบุ UUID ของบัญชีที่ถูกต้อง", + "ORG_ZSTACK_IDENTITY_10048": "เซสชันของคุณเชื่อมโยงกับผู้ใช้ คุณไม่สามารถสวมบทบาทเป็นผู้ใช้อื่น [uuid:%s] ได้", + "ORG_ZSTACK_IDENTITY_10047": "เซสชันปัจจุบันเป็นเซสชันแบบบัญชี โปรดระบุ 'uuid' ของผู้ใช้ที่คุณต้องการอัปเดต", + "ORG_ZSTACK_IDENTITY_10046": "เฉพาะผู้ดูแลระบบเท่านั้นที่สามารถยุติการเข้าถึงบัญชีได้", + "ORG_ZSTACK_CRYPTO_AUTH_10019": "การรับรหัสผ่านความสมบูรณ์จากฐานข้อมูลล้มเหลวเนื่องจาก %s ไม่ได้สร้างรหัสผ่านความสมบูรณ์", + "ORG_ZSTACK_VHOST_KVM_10000": "ดิสก์ vHostUser รองรับเฉพาะโหมด virtio เท่านั้น โปรดตรวจสอบว่าแพลตฟอร์มอิมเมจมีไดรเวอร์ virtio ที่จำเป็นติดตั้งอยู่", + "ORG_ZSTACK_VHOST_KVM_10001": "ดิสก์ vhost-user ไม่รองรับโหมด virtio-scsi โปรดปิดใช้งานโหมด virtio-scsi", + "ORG_ZSTACK_NETWORK_L3_10029": "%s ไม่ใช่ที่อยู่ IPv6 ที่ถูกต้องสำหรับการกำหนดค่าทรัพยากรคลาว์", + "ORG_ZSTACK_USBDEVICE_10005": "PassThrough รองรับการใช้งานบน VM ที่ทำงานในสภาพแวดล้อมโฮสต์เท่านั้น", + "ORG_ZSTACK_ALIYUN_ECS_10019": "เฉพาะผู้ใช้ผู้ดูแลระบบเท่านั้นที่สามารถตั้งค่าพารามิเตอร์ [onlyZstack] เป็น false ได้", + "ORG_ZSTACK_STORAGE_BACKUP_10018": "ล้มเหลวในการสร้างอิมเมจจากสำรองข้อมูล %s", + "ORG_ZSTACK_ALIYUN_ECS_10018": "เฉพาะอินสแตนซ์ ECS แบบ postpaid เท่านั้นที่รองรับการลบระยะไกล ประเภทการเรียกเก็บเงินของ ECS ที่ระบุคือ: %s", + "ORG_ZSTACK_USBDEVICE_10002": "จำนวนอุปกรณ์ USB ที่ต่อกับ VM ถึงขีดจำกัดแล้ว การใช้งานปัจจุบัน: %s", + "ORG_ZSTACK_ALIYUN_ECS_10017": "ลบเฉพาะอินสแตนซ์ ECS ที่มีสถานะ Running หรือ Stopped เท่านั้น สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_NETWORK_L3_10025": "ไม่สามารถรับ IP ฟรีได้ด้วยเริ่มต้น[ip:%s] เนื่องจากเริ่มต้น[ip:%s] ไม่ใช่ที่อยู่ IPv6 ที่ถูกต้อง", + "ORG_ZSTACK_USBDEVICE_10009": "ไม่สามารถย้าย VM [uuid:%s] ได้เนื่องจากมีอุปกรณ์ USB ต่อผ่าน passthrough", + "ORG_ZSTACK_STORAGE_BACKUP_10015": "ไม่สามารถจัดสรร %s บนที่จัดเก็บข้อมูลสำรอง[uuid:%s] เนื่องจากมีพื้นที่ว่างเพียง %s เท่านั้น", + "ORG_ZSTACK_NETWORK_L3_10024": "ไม่สามารถขอ IP ฟรีได้ด้วย start[ip:%s] เนื่องจาก start[ip:%s] ไม่ใช่ IPv4 address ที่ถูกต้อง", + "ORG_ZSTACK_USBDEVICE_10008": "vm[%s] ไม่สามารถเริ่มทำงานได้เนื่องจากการเปลี่ยนเส้นทาง USB ไปยัง host ไม่ได้รับการตั้งค่า", + "ORG_ZSTACK_NETWORK_L3_10023": "ไม่สามารถขอ IP ฟรีได้ด้วย start[ip:%s] เนื่องจาก l3Network[uuid:%s] ถูกกำหนดค่าเป็นโหมด dual stack", + "ORG_ZSTACK_USBDEVICE_10007": "USB ถูกผูกกับ virtual machine [UUID:%s] อยู่แล้วและไม่สามารถผูกกับ VM อื่นได้", + "ORG_ZSTACK_STORAGE_BACKUP_10013": "primary storage[uuid:%s, type:%s] ที่จำเป็นไม่รองรับ backup storage ใดๆ", + "ORG_ZSTACK_NETWORK_L3_10022": "ipRangeUuid และ l3NetworkUuid ไม่สามารถเป็น null พร้อมกันได้; ต้องกำหนดอย่างน้อยหนึ่งรายการ", + "ORG_ZSTACK_USBDEVICE_10006": "ไม่สามารถแนบ USB device [uuid:%s] กับ VM [uuid:%s] ได้, เหตุผลที่เป็นไปได้รวมถึง: อุปกรณ์ไม่ได้เปิดใช้งานหรือถูกแนบกับ VM อื่นแล้ว, หรืออุปกรณ์และ VM ไม่ได้อยู่บน host เดียวกัน", + "ORG_ZSTACK_ALIYUN_ECS_10015": "รูปภาพถูกลบแล้ว! กรุณาตรวจสอบว่ารูปภาพถูกยุติการทำงานอย่างถูกต้องและทรัพยากรทั้งหมดถูกปล่อยแล้วก่อนการลบ", + "ORG_ZSTACK_ALIYUN_ECS_10014": "ecs image มีอยู่บนเครือข่าย remote แล้ว, ชื่อ: %s, เวลาที่สร้าง: %s", + "ORG_ZSTACK_ALIYUN_ECS_10013": "ECS image มีอยู่ทั้งบนเครือข่าย remote และ local, ECS image UUID: %s, ชื่อ: %s, เวลาที่สร้าง: %s", + "ORG_ZSTACK_NETWORK_L3_10032": "IPv6 address pool ไม่ได้รับการรองรับ; ดังนั้นการเพิ่ม IP range ไม่สามารถทำได้ กรุณาตรวจสอบว่าการกำหนดค่าเครือข่ายของคุณรองรับ IPv6 ก่อนดำเนินการต่อ", + "ORG_ZSTACK_STORAGE_BACKUP_10011": "อนุญาตให้มีระบบ tag ของ backup storage data network ได้เพียงหนึ่งรายการเท่านั้น, แต่พบ %s", + "ORG_ZSTACK_NETWORK_L3_10030": "[startIp %s, endIp %s, prefixLen %d, gateway %s] ไม่ได้แสดงถึง IPv6 range ที่ถูกต้องสำหรับการกำหนดค่า cloud networking", + "ORG_ZSTACK_STORAGE_BACKUP_10010": "การจองความจุบน backup storage nodes ทั้งหมดล้มเหลว กรุณาตรวจสอบความพร้อมของทรัพยากร backup storage ของคุณ", + "ORG_ZSTACK_USBDEVICE_10016": "คุณสามารถแนบ USB 3.0 devices ได้มากที่สุด %s รายการต่อหนึ่ง virtual machine instance", + "ORG_ZSTACK_USBDEVICE_10015": "คุณสามารถแนบ USB 2.0 device ได้มากที่สุด %s รายการต่อหนึ่ง VM instance", + "ORG_ZSTACK_NETWORK_L3_10038": "network CIDR ใหม่ [%s] แตกต่างจาก network CIDR เดิม [%s]", + "ORG_ZSTACK_USBDEVICE_10014": "คุณสามารถแนบ USB 1.0 device ได้มากที่สุด %s รายการต่อหนึ่ง VM instance", + "ORG_ZSTACK_NETWORK_L3_10037": "IP range ใหม่ [startIP:%s, endIP:%s] ทับซ้อนกับ IP range ที่มีอยู่แล้ว [startIP:%s, endIP:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10028": "volume backup [uuid:%s] ไม่พบใน storage volume [uuid:%s]", + "ORG_ZSTACK_NETWORK_L3_10036": "ipv6 prefix length ต้องเป็น %d สำหรับ Stateless-DHCP หรือ SLAAC", + "ORG_ZSTACK_NETWORK_L3_10035": "addressMode[%s] แตกต่างจาก L3Network address mode[%s]", + "ORG_ZSTACK_USBDEVICE_10019": "USB device [UUID:%s] ไม่อยู่ในสถานะ attachable เท่า %s", + "ORG_ZSTACK_NETWORK_L3_10034": "ระบบเครือข่ายปัจจุบันไม่รองรับ IPv6, ดังนั้นการเพิ่ม IP range ไม่ได้รับการสนับสนุนในขณะนี้ กรุณาตรวจสอบว่าการกำหนดค่าเครือข่ายของคุณรองรับ IPv6 ก่อนพยายามดำเนินการนี้", + "ORG_ZSTACK_USBDEVICE_10018": "USB device [UUID:%s] ถูกแนบกับ virtual machine อื่น [UUID:%s] แล้ว", + "ORG_ZSTACK_NETWORK_L3_10033": "ip range prefix length อยู่นอกช่วงที่ถูกต้อง [%d - %d]", + "ORG_ZSTACK_USBDEVICE_10017": "USB device [UUID: %s] ถูกแนบกับ VM เดียวกัน [UUID: %s] แล้ว", + "ORG_ZSTACK_STORAGE_BACKUP_10024": "Volume backup [uuid:%s] ไม่พบบน storage node [uuid:%s]", + "ORG_ZSTACK_ALIYUN_ECS_10022": "private IP มีอยู่ใน VSwitch แล้ว: %s, ถูกจัดสรรให้ ECS แล้ว: %s", + "ORG_ZSTACK_ALIYUN_ECS_10021": "%s ไม่อยู่ภายใน CIDR range: %s", + "ORG_ZSTACK_ALIYUN_ECS_10020": "ที่อยู่ IP ที่มีอยู่สำหรับ vSwitch ไม่เพียงพอ ปัจจุบัน (%d)", + "ORG_ZSTACK_USBDEVICE_10012": "ไม่สามารถย้าย VM [uuid:%s] ได้เนื่องจากมีอุปกรณ์ PCI ติดตั้งอยู่", + "ORG_ZSTACK_ALIYUN_ECS_10027": "ต้องระบุ instance offering หรือ instance type!", + "ORG_ZSTACK_USBDEVICE_10011": "ไม่สามารถย้าย root volume [uuid:%s] ได้เนื่องจากมีอุปกรณ์จัดเก็บข้อมูลติดตั้งอยู่", + "ORG_ZSTACK_ALIYUN_ECS_10026": "%s ไม่ใช่ volume type ที่ถูกต้อง ประเภทที่ถูกต้องคือ [%s]", + "ORG_ZSTACK_ALIYUN_ECS_10025": "%s ไม่ใช่ที่อยู่ IPv4 ที่ถูกต้อง", + "ORG_ZSTACK_ALIYUN_ECS_10024": "ต้องระบุ bandwidth เมื่อจัดสรรที่อยู่ IP สาธารณะ", + "ORG_ZSTACK_NETWORK_L3_10043": "%s ไม่ใช่ network CIDR mask ที่ถูกต้อง", + "ORG_ZSTACK_STORAGE_BACKUP_10023": "หนึ่งใน backup storage [UUID: %s] อยู่ในสถานะ %s ดังนั้นจึงไม่สามารถดำเนินการซิงโครไนซ์ได้", + "ORG_ZSTACK_NETWORK_L3_10042": "gateway[gatewayId] ไม่อยู่ใน subnet subnetId", + "ORG_ZSTACK_STORAGE_BACKUP_10022": "ไม่พบ Volume Backup Factory ประเภท[%s]", + "ORG_ZSTACK_NETWORK_L3_10041": "%s ไม่ใช่ network CIDR ที่ถูกต้องเนื่องจากไม่มีที่อยู่ IP ที่ใช้งานได้", + "ORG_ZSTACK_STORAGE_BACKUP_10021": "VM ปัจจุบัน[UUID: %s] ของ backup volume ไม่ใช่ VM[UUID: %s] เดิมที่ใช้สำหรับ backup อีกต่อไป", + "ORG_ZSTACK_STORAGE_BACKUP_10020": "ซิงโครไนซ์ไฟล์ metadata ของ volume backup ใน image store[uuid:%s] พบ I/O error: %s", + "ORG_ZSTACK_NETWORK_L3_10049": "l3 network [uuid %s: name %s] ไม่ใช่ public network; ดังนั้นจึงไม่สามารถเพิ่ม address pool range ได้", + "ORG_ZSTACK_NETWORK_L3_10047": "ไม่ใช่การรวมกันที่ถูกต้องของ system และ category เฉพาะบางแพลตฟอร์ม cloud computing เท่านั้นที่ถูกต้อง", + "ORG_ZSTACK_NETWORK_L3_10046": "%s ไม่ใช่ชื่อโดเมน FQDN ที่ถูกต้อง", + "ORG_ZSTACK_NETWORK_L3_10045": "ไม่รองรับ L3 network type[%s]", + "ORG_ZSTACK_NETWORK_L3_10044": "ipRangeUuids, L3NetworkUuids, และ zoneUuids ต้องมี list ที่ไม่ว่างอย่างน้อยหนึ่งรายการในแต่ละรายการ หรือค่าทั้งหมดต้องถูกตั้งค่าเป็น true", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10023": "ไม่สามารถแนบ port forwarding rule ที่มี allowed CIDR ได้เนื่องจาก vmNic[uuid:%s] มี rules ที่ซ้อนทับกับ target private port ranges[%s, %s] และมี protocol type เดียวกัน[%s] อยู่แล้ว", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10024": "ไม่สามารถแนบ port forwarding rule ได้เนื่องจาก vmNic [uuid:%s] มี rule ที่ขัดแย้งซึ่งซ้อนทับกับ target private port range [%s, %s] และมี protocol type เดียวกัน[%s]", + "ORG_ZSTACK_SNMP_10010": "ล้มเหลวในการ %s SNMP agent เนื่องจาก privacy password ไม่สามารถเว้นว่างได้", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10021": "VMNic [UUID:%s] มี port forwarding rules ที่มี VIPs แตกต่างจาก [UUID:%s] อยู่แล้ว", + "ORG_ZSTACK_ALIYUN_NAS_CORE_10000": "Primary Storage [%s] ยังคงทำงานอยู่; ดังนั้นจึงไม่สามารถลบ access group ได้", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10022": "vmNic UUID[%s] ไม่ได้รับอนุญาตให้เพิ่ม port forwarding ที่มี allowed CIDR rule เนื่องจากมี public IP ที่เกี่ยวข้องอยู่แล้ว", + "ORG_ZSTACK_NETWORK_L3_10054": "การจัดสรร IP ไม่สามารถมี network addresses หรือ broadcast addresses ได้ โปรดตรวจสอบให้แน่ใจว่า IP ที่ระบุเป็น host address ที่ถูกต้องภายใน subnet", + "ORG_ZSTACK_NETWORK_L3_10053": "gateway[gatewayId] ไม่อยู่ใน subnet subnetId/cidrBlock", + "ORG_ZSTACK_NETWORK_L3_10052": "IP range [%s ~ %s] รวม link-local addresses ซึ่งสงวนไว้สำหรับ virtualization และไม่ควรใช้", + "ORG_ZSTACK_NETWORK_L3_10051": "IP range [%s ~ %s] ประกอบด้วย E类地址 ซึ่งเป็นที่สงวนไว้", + "ORG_ZSTACK_NETWORK_L3_10050": "IP range [%s ~ %s] รวม D-class addresses ซึ่งสงวนไว้สำหรับการสื่อสารแบบ multicast", + "ORG_ZSTACK_STORAGE_BACKUP_10008": "หลังจากหักความจุสำรองไว้ ไม่มีพื้นที่เก็บข้อมูลสำรองที่ว่างงานที่มีความจุตามที่ต้องการ[%s bytes]", + "ORG_ZSTACK_STORAGE_BACKUP_10006": "พื้นที่เก็บข้อมูลสำรอง [UUID:%s] ได้ถูกเชื่อมโยงกับโซน [UUID:%s]", + "ORG_ZSTACK_NETWORK_L3_10059": "ที่อยู่ IP เริ่มต้น [%s] อยู่หลังที่อยู่ IP สิ้นสุด [%s]", + "ORG_ZSTACK_ALIYUN_ECS_10006": "ไม่สามารถถอดรหัส url ได้: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10005": "พื้นที่เก็บข้อมูลสำรองที่มี UUID:%s ยังไม่ได้ถูกแนบไปกับโซนที่มี UUID:%s", + "ORG_ZSTACK_NETWORK_L3_10058": "netmask[%s] ไม่ใช่ netmask ที่ถูกต้องและต้องระบุเพื่อหลีกเลี่ยง netmask ของช่วง IP ที่ไม่ถูกต้อง 0.0.0.0", + "ORG_ZSTACK_STORAGE_BACKUP_10004": "zoneUuids และ backupStorageUuids ต้องมีรายการที่ไม่ว่างงานอย่างน้อยหนึ่งรายการทั้งคู่ หรือทั้งคู่ถูกตั้งค่าเป็น true", + "ORG_ZSTACK_NETWORK_L3_10057": "gateway[%s] ไม่ใช่ที่อยู่ IPv4 ที่ถูกต้อง", + "ORG_ZSTACK_STORAGE_BACKUP_10003": "%s ไม่ควรเป็น null ในการกำหนดค่าเครื่องเสมือน", + "ORG_ZSTACK_NETWORK_L3_10056": "IP สิ้นสุด[%s] ไม่ใช่ที่อยู่ IPv4 ที่ถูกต้อง", + "ORG_ZSTACK_NETWORK_L3_10055": "IP เริ่มต้น[%s] ไม่ใช่ที่อยู่ IPv4 ที่ถูกต้อง", + "ORG_ZSTACK_CORE_SALT_10000": "ไม่พบ SCP ในระบบ[%s] ไม่สามารถสร้างการกำหนดค่า salt ได้", + "ORG_ZSTACK_ALIYUN_ECS_10004": "ไม่พบดิสก์ระบบสำหรับ instance: [%s], instance id คือ: [%s]", + "ORG_ZSTACK_CORE_SALT_10003": "ไม่สามารถรัน salt state[%s] บน instance[%s] ล้มเหลวหลังจาก %s ครั้งที่ลองใหม่", + "ORG_ZSTACK_ALIYUN_ECS_10003": "โซนความพร้อมใช้งานนี้ [%s] ไม่สามารถรองรับประเภท instance [%s] ได้ในขณะนี้ โปรดเลือกประเภท instance หรือโซนความพร้อมใช้งานอื่น", + "ORG_ZSTACK_ALIYUN_ECS_10002": "ไม่มีประเภท instance ที่พร้อมใช้งานในขณะนี้ โปรดกลับมาตรวจสอบในภายหลังหรือปรับเปลี่ยนข้อกำหนดของคุณ", + "ORG_ZSTACK_SNMP_10000": "การสร้าง SNMP agent ล้มเหลวเนื่องจากมีอยู่แล้ว", + "ORG_ZSTACK_SNMP_10001": "ไม่สามารถยุติบริการ SNMP agent ได้ โปรดตรวจสอบว่าได้สร้าง instance ของ SNMP agent แล้ว", + "ORG_ZSTACK_NETWORK_L3_10065": "การเพิ่มช่วง IP ปกติต้องระบุที่อยู่ IP ของ gateway", + "ORG_ZSTACK_SNMP_10002": "ไม่สามารถอัปเดตการกำหนดค่า SNMP agent ได้ โปรดตรวจสอบว่าได้สร้าง SNMP agent แล้ว", + "ORG_ZSTACK_NETWORK_L3_10064": "gateway ของช่วง IP ที่เพิ่มใหม่ %s แตกต่างจาก gateway ที่มีอยู่ %s", + "ORG_ZSTACK_SNMP_10003": "ไม่สามารถเริ่มทำงาน SNMP agent ได้ โปรดสร้าง SNMP agent ก่อน", + "ORG_ZSTACK_NETWORK_L3_10063": "gateway[%s] ไม่สามารถเป็นส่วนหนึ่งของช่วง[%s, %s] ได้", + "ORG_ZSTACK_SNMP_10004": "ไม่สามารถ %s SNMP agent ได้เนื่องจาก readCommunity ไม่สามารถว่างงานได้เมื่อ version เป็น v2c", + "ORG_ZSTACK_NETWORK_L3_10062": "endpoint [%s] ไม่อยู่ใน subnet %s/%d", + "ORG_ZSTACK_SNMP_10005": "ไม่สามารถ %s SNMP agent ได้เนื่องจาก userName ไม่สามารถว่างงานได้เมื่อ version เป็น v3", + "ORG_ZSTACK_NETWORK_L3_10061": "ไม่อนุญาตให้ใช้ CIDR blocks หลายบล็อกบนเครือข่าย L3 เดียวกัน มีช่วง IP ที่มีอยู่แล้ว [uuid:%s, CIDR:%s] ดังนั้น CIDR block ใหม่ [%s] ไม่ถูกต้อง", + "ORG_ZSTACK_SNMP_10006": "ไม่สามารถ %s SNMP agent ได้เนื่องจากอัลกอริทึมการยืนยันตัวตนไม่สามารถเป็น null ได้เมื่อไม่ได้ระบุรหัสผ่าน", + "ORG_ZSTACK_NETWORK_L3_10060": "ทับซ้อนกับช่วง IP[uuid:%s, start_ip:%s, end_ip: %s]", + "ORG_ZSTACK_SNMP_10007": "ไม่สามารถ %s SNMP agent ได้เนื่องจากรหัสผ่านการยืนยันตัวตนว่างงาน", + "ORG_ZSTACK_SNMP_10008": "ล้มเหลวในการ %s ตัวแทน SNMP เนื่องจากการกำหนดค่าเข้ารหัสข้อมูลต้องมีการยืนยันตัวตนของผู้ใช้ก่อน", + "ORG_ZSTACK_XINFINI_10019": "ล้มเหลวในการดึงรายละเอียดของโหนด %s, ตรวจสอบที่อยู่ IP และการกำหนดค่าบทบาท", + "ORG_ZSTACK_XINFINI_10018": "ไม่พบโหนดเครื่องเสมือน", + "ORG_ZSTACK_XINFINI_10017": "ไม่พบอินสแตนซ์เครื่องเสมือนที่เชื่อมต่อ กรุณาตรวจสอบว่าโหนดเชื่อมต่ออย่างถูกต้องแล้วลองใหม่อีกครั้ง", + "ORG_ZSTACK_XINFINI_10016": "โปรโตคอลที่ไม่สนับสนุน[%s] สำหรับการเชื่อมต่อที่ใช้งานอยู่", + "ORG_ZSTACK_XINFINI_10015": "ไม่สนับสนุนการรับข้อมูลปริมาณจาก [%s]", + "ORG_ZSTACK_XINFINI_10014": "โปรโตคอลการจัดเก็บที่ไม่สนับสนุน[%s]", + "ORG_ZSTACK_XINFINI_10013": "โปรโตคอลที่ไม่สนับสนุน[%s] สำหรับการปิดใช้งาน", + "ORG_ZSTACK_XINFINI_10012": "ไม่สามารถดึงรายละเอียดปริมาณ [%s] ได้, อาจเกิดจากการลบแล้ว", + "ORG_ZSTACK_XINFINI_10010": "การกำหนดค่าว่างเปล่า, ไม่สามารถค้นพบอินสแตนซ์ xinfini ได้", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10021": "IP ที่ต้องการ %s ถูกจัดสรรให้กับอินสแตนซ์อื่นแล้ว", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10022": "IP ที่ต้องการ %s อยู่นอกช่วง DHCP %s ~ %s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10020": "ล้มเหลวในการจัดสรร IP จากเครือข่ายการจัดเตรียม Baremetal2[uuid:%s]", + "ORG_ZSTACK_XINFINI_10009": "ล้มเหลวในการลบไคลเอนต์ iscsi %s", + "ORG_ZSTACK_XINFINI_10008": "ล้มเหลวในการลบการแมปปิ้งกลุ่มไคลเอนต์ปริมาณ %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10002": "มีอินสแตนซ์ BM ที่ใช้ที่อยู่ IP ที่จัดสรรจาก L2[uuid:%s]", + "ORG_ZSTACK_XINFINI_10007": "ล้มเหลวในการลบสแนปช็อตปริมาณ %s", + "ORG_ZSTACK_XINFINI_10006": "สแนปช็อต [id:%s, name:%s] มีปริมาณที่ถูกโคลน %d รายการ, ชื่อปริมาณ: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10004": "มีอินสแตนซ์ BM ที่ใช้ที่อยู่ IP ที่จัดสรรจากช่วง IP [uuid:%s]", + "ORG_ZSTACK_XINFINI_10005": "ล้มเหลวในการลบปริมาณเนื่องจาก %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10003": "มีอินสแตนซ์ BM ที่ใช้ที่อยู่ IP ที่จัดสรรจากเครือข่าย L3 [UUID:%s]", + "ORG_ZSTACK_XINFINI_10004": "ล้มเหลวในการลบ bdev %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10006": "ล้มเหลวในการเปิด/ปิดเครื่องระยะไกลเซิร์ฟเวอร์ baremetal[uuid:%s]", + "ORG_ZSTACK_XINFINI_10003": "ไม่พบ bdc ที่มี IP %s ในสภาพแวดล้อมคลาวด์", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10005": "ล้มเหลวในการจัดสรรเซิร์ฟเวอร์ PXE baremetal, ตรวจสอบว่ามีเซิร์ฟเวอร์ PXE ที่มีความจุเพียงพอแนบกับคลัสเตอร์[uuid:%s]", + "ORG_ZSTACK_XINFINI_10002": "คำขอ xinfini ล้มเหลว, ข้อความ: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10008": "ไม่พบตัวถัง baremetal [uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10009": "เครือข่ายการจัดเตรียม baremetal2 ที่มี UUID: %s แนบกับคลัสเตอร์ที่มี UUID: %s อยู่แล้ว", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10007": "ล้มเหลวในการปิดเครื่องระยะไกลตัวถัง baremetal[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10008": "ล้มเหลวในการถอดอุปกรณ์ที่จัดการออกจากเครื่องเสมือนที่ทำงานอยู่, เนื่องจาก:%s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10010": "ไม่สามารถแนบเครือข่ายจัดเตรียม Baremetal2 [uuid:%s] ไปยังคลัสเตอร์ [uuid:%s] เนื่องจากคลัสเตอร์มีเครือข่ายที่กำหนดค่าแล้ว", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10011": "ไม่สามารถแนบเครือข่ายจัดเตรียม BareMetal2 ไปยังคลัสเตอร์เนื่องจากไม่อยู่ในโซนความพร้อมใช้งานเดียวกัน", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10007": "vm[uuid:%s] ไม่สามารถเริ่มทำงานบนโฮสต์ที่มีอุปกรณ์ mdev [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10004": "ล้มเหลวในการแนบอุปกรณ์ mdev แบบไดนามิกไปยัง vm ที่กำลังทำงาน เนื่องจาก:%s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10002": "อุปกรณ์ mdev ที่มี UUID:%s ไม่สามารถแนบไปยัง VM ที่มี UUID:%s เนื่องจากสถานะไม่ถูกต้อง", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10003": "อุปกรณ์ mdev [%s] ไม่พร้อมใช้งานในสภาพแวดล้อมเสมือน", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10000": "โฮสต์ [%s] ไม่สามารถเข้าสู่โหมดบำรุงรักษาได้เนื่องจาก VM [%s] มีอุปกรณ์ MDEV ที่แนบอยู่และไม่สามารถย้ายได้โดยอัตโนมัติ", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10018": "ล้มเหลวในการอัปเดตเครือข่ายที่จัดเตรียม [uuid:%s] ในเกตเวย์ [uuid:%s]: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10009": "ตัวถัง Baremetal [UUID:%s] ไม่ได้เปิดใช้งานหรือพร้อมใช้งาน โปรดเลือกตัวอื่น", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10001": "อุปกรณ์ pci [uuid:%s] รู้จักว่าเป็น mdev แต่ไม่พบข้อกำหนดจึงยกเลิกกระบวนการ", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10016": "เครือข่ายจัดเตรียม baremetal2 ทั้งหมดไม่มีอยู่ใน %s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10014": "ไม่สามารถถอดเครือข่ายจัดเตรียม Baremetal2 [uuid:%s] เมื่อมีอินสแตนซ์ที่กำลังทำงานที่พึ่งพาเครือข่ายนั้น", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10015": "networkUuids เป็นรายการว่างเปล่า", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10012": "ไม่สามารถแนบเครือข่ายจัดเตรียม BareMetal2 ไปยังคลัสเตอร์เนื่องจากเกตเวย์ทั้งหมดที่แนบกับคลัสเตอร์ที่มีเครือข่ายจัดเตรียมเดียวกันต้องได้รับการยืนยัน โปรดตรวจสอบให้แน่ใจว่าเกตเวย์ที่เกี่ยวข้องทั้งหมดสอดคล้องกันก่อนดำเนินการต่อ", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10013": "เครือข่ายที่จัดเตรียมไม่ควรมีชื่ออินเทอร์เฟซเหมือนกับเครือข่าย l2 ที่แนบกับคลัสเตอร์อยู่แล้ว", + "ORG_ZSTACK_NETWORK_L3_10006": "ไม่สามารถจองช่วง IP ได้เนื่องจากไม่มีชุดย่อย IPv4 ที่พร้อมใช้งาน", + "ORG_ZSTACK_NETWORK_L3_10005": "ไม่สามารถจองช่วง IP ได้เนื่องจาก IP ปลายทาง [%s] น้อยกว่า IP เริ่มต้น [%s]", + "ORG_ZSTACK_NETWORK_L3_10004": "ไม่สามารถจองช่วง IP ได้เนื่องจาก IP ปลายทาง[%s] ไม่ใช่ที่อยู่ IPv6 ที่ถูกต้อง", + "ORG_ZSTACK_NETWORK_L3_10003": "ไม่สามารถจองช่วง IP ได้เนื่องจาก IP ปลายทาง[%s] ไม่ใช่ที่อยู่ IPv4 ที่ถูกต้อง", + "ORG_ZSTACK_NETWORK_L3_10002": "ไม่สามารถจองช่วง IP ได้เนื่องจากที่อยู่ IP เริ่มต้น [%s] ไม่ถูกต้อง", + "ORG_ZSTACK_NETWORK_L3_10000": "ไม่สามารถลบที่อยู่ IP ได้เนื่องจากมันถูกใช้โดยตัวควบคุมอินเทอร์เฟซเครือข่าย VM [UUID:%s]", + "ORG_ZSTACK_NETWORK_L3_10009": "ไม่สามารถจองช่วง IP ได้เนื่องจากไม่มีชุดย่อย IPv6 ที่พร้อมใช้งาน โปรดตรวจสอบการกำหนดค่าเครือข่ายหรือลองจองชุดย่อย IPv4 แทน", + "ORG_ZSTACK_KVM_10001": "ล้มเหลวในการโหลดข้อมูลโฮสต์จากไฟล์เพราะ\\n%s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10019": "อุปกรณ์ mdev ที่มี UUID: %s ไม่ได้แนบกับ VM ที่มี UUID: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10017": "VM[UUID:%s] ที่มีอุปกรณ์ SE-MDEV ไม่สามารถแนบ SE-MDEV เพิ่มเติม [%s] ได้", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10018": "IOMMU ของโฮสต์ [uuid:%s] ที่จัดการอุปกรณ์ PCI [uuid:%s] ไม่ได้กำหนดค่าเป็น [%s] หรือ [%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10015": "vm[uuid:%s] มีอุปกรณ์ mdev ที่แนบอยู่ซึ่งอยู่บนโฮสต์ต่างจากอุปกรณ์ mdev [uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10014": "vm[uuid:%s] มีอุปกรณ์ PCI ที่แนบอยู่ซึ่งอยู่บนโฮสต์ต่างจากอุปกรณ์ mdev [uuid:%s]", + "ORG_ZSTACK_NETWORK_L3_10010": "ไม่สามารถจองช่วง IP ได้เนื่องจาก IP ที่สงวนไว้ไม่อยู่ในช่วง IP ที่ระบุ[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10011": "ไม่สามารถแก้ไขสถานะของอุปกรณ์ mdev ที่กำลังแนบอยู่กับเครื่องเสมือนได้ โปรดถอดอุปกรณ์ก่อนทำการเปลี่ยนแปลง", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10007": "ไม่สามารถลบเครือข่ายการจัดเตรียม BareMetal2 [uuid:%s] ได้ เมื่อมีอินสแตนซ์ที่พึ่งพาอยู่", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10012": "ไม่สามารถแนบอุปกรณ์ mdev [uuid:%s] เข้ากับ VM ได้ กรุณาตรวจสอบว่าเปิดใช้งานแล้วและไม่ได้แนบอยู่", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10008": "ไม่สามารถแนบเครือข่ายการจัดเตรียม BareMetal2 เข้ากับคลัสเตอร์ที่ไม่ใช่ BareMetal2", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10005": "netmask ของช่วง DHCP ของเครือข่ายการจัดเตรียม baremetal2 %s ไม่ถูกต้อง", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10006": "IP เริ่มต้น %s และ IP สิ้นสุด %s ของเครือข่ายการจัดเตรียม baremetal2 ไม่ได้อยู่ใน subnet mask เดียวกัน", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10003": "ไม่สามารถอัปเดตการกำหนดค่า DHCP ของเครือข่ายที่จัดเตรียม BareMetal2 [uuid:%s] ได้ เมื่อมีอินสแตนซ์ที่พึ่งพาอยู่", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10002": "มีเครือข่ายการจัดเตรียม baremetal2 ที่มีอินเทอร์เฟซ DHCP %s อยู่แล้ว พร้อมด้วยการกำหนดค่าต่อไปนี้: IP เริ่มต้น %s, IP สิ้นสุด %s, netmask %s, และ gateway %s", + "ORG_ZSTACK_NETWORK_L3_10018": "ไม่มีช่วง IP ที่ระบุสำหรับ layer 3[%s]", + "ORG_ZSTACK_NETWORK_L3_10015": "คุณต้องอัปเดตทั้งระบบและหมวดหมู่ในการกำหนดค่าคลาวด์ของคุณ", + "ORG_ZSTACK_XINFINI_10027": "คุณลักษณะสำหรับการยกเลิกการส่งออก NVMeOF ไม่ได้รับการรองรับในปัจจุบัน", + "ORG_ZSTACK_NETWORK_L3_10014": "ไม่สามารถลบช่วง IP มาตรฐานสุดท้ายได้ เนื่องจากยังมีกลุ่มที่อยู่ IP อยู่", + "ORG_ZSTACK_XINFINI_10026": "ไม่พบเกตเวย์ที่ใช้งานอยู่สำหรับไคลเอนต์[%s]", + "ORG_ZSTACK_NETWORK_L3_10013": "ไม่สามารถตั้งค่า mtu ได้เนื่องจากเครือข่าย l2[uuid:%s] ของเครือข่าย l3 [uuid:%s] มีค่า mtu ที่เกินขีดจำกัดของเครือข่าย novlan", + "ORG_ZSTACK_XINFINI_10025": "การส่งออก NVMe over Fabrics (OF) ไม่ได้รับการรองรับในปัจจุบัน", + "ORG_ZSTACK_XINFINI_10024": "xinfini รองรับการตั้งค่าระดับ QoS ทั้งหมดเท่านั้น", + "ORG_ZSTACK_NETWORK_L3_10011": "ไม่สามารถจองช่วง IP ได้เนื่องจากช่วงใหม่ทับซ้อนกับช่วงที่มีอยู่ [%s:%s]", + "ORG_ZSTACK_XINFINI_10023": "ไม่มีกลุ่มที่มีพื้นที่เพียงพอ[%d] และสถานะสมบูรณ์", + "ORG_ZSTACK_XINFINI_10021": "ล้มเหลวในการดูรายละเอียดเครื่องเสมือนของกลุ่ม[id:%d, name:%s]", + "ORG_ZSTACK_XINFINI_10020": "ไม่พบกลุ่มทรัพยากรการคำนวณ กรุณาตรวจสอบว่าได้สร้างกลุ่มและพร้อมใช้งานแล้ว", + "ORG_ZSTACK_KVM_10010": "โฮสต์ [UUID: %s] ขาดรายละเอียดโมเดล CPU กรุณาเชื่อมต่อโฮสต์ใหม", + "ORG_ZSTACK_KVM_10011": "The reason for forcing a run must be specified.", + "ORG_ZSTACK_NETWORK_L3_10019": "ip[%s] is not within the cidr range of ip pool[uuid:%s, cidr:%s] associated with l3 network[%s]", + "ORG_ZSTACK_KVM_10012": "host[uuid:%s] has been terminated", + "ORG_ZSTACK_KVM_10002": "The operating system [OS] of host [hostname:%s, IP:%s] is invalid", + "ORG_ZSTACK_KVM_10003": "cluster[uuid:%s] already has a host with OS version [%s], but the newly added host [name:%s ip:%s] has a different OS version [%s].", + "ORG_ZSTACK_KVM_10004": "vm[uuid:%s] crashes due to kernel failure", + "ORG_ZSTACK_KVM_10005": "host[uuid: %s] memory ECC error triggered, details: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10029": "specified managed devices are not on the same host: managed device[uuid: %s] on host[uuid: %s] while managed device[uuid: %s] on host[uuid: %s]", + "ORG_ZSTACK_KVM_10006": "There are still hosts that do not have the same CPU architecture, details: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10026": "Cannot delete mdev device when it is attached to a virtual machine instance. Please detach the device before deletion.", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10027": "ไม่สามารถเริ่มต้น VM[UUID:%s] ได้ เนื่องจากไม่มีข้อกำหนด MDEV[UUIDs:%s] ครบถ้วน", + "ORG_ZSTACK_KVM_10008": "PCI Bridge ID ต้องมีค่ามากกว่า 0 และน้อยกว่า 32", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10024": "ไม่สามารถแนบอุปกรณ์ที่จัดการกับอินสแตนซ์เครื่องเสมือนที่ไม่อยู่ในสถานะหยุดทำงาน", + "ORG_ZSTACK_KVM_10009": "สถานะปัจจุบันของ VM[%s] การแก้ไข virtioSCSI ต้องการให้ VM อยู่ในสถานะ[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10025": "ประเภทอุปกรณ์ mdev [%s] ไม่ถูกต้อง อนุญาตเฉพาะอุปกรณ์เสมือนเท่านั้น", + "ORG_ZSTACK_NETWORK_L3_10021": "Cloud Instance ID[%s] ไม่ถูกต้อง", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10022": "UUID ของคลัสเตอร์, UUID ของโฮสต์, หรือ UUID ของ VM ไม่สามารถตั้งค่าพร้อมกันได้%s", + "ORG_ZSTACK_NETWORK_L3_10020": "ip[%s] อยู่ในช่วง IP[uuid:%s, startIp:%s, endIp:%s] ที่เชื่อมโยงกับเครือข่าย L3[%s] ไม่อนุญาต", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10023": "คลัสเตอร์ไม่มีอยู่หรือถูกปิดใช้งาน โปรดตรวจสอบว่าคลัสเตอร์ถูกสร้างและเปิดใช้งานอย่างถูกต้อง", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10020": "โฮสต์ที่มี UUID [%s] ที่มีอุปกรณ์ mdev พร้อม UUID [%s] ไม่ตรงกับ [%s] หรือ [%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10021": "ไม่สามารถถอดอุปกรณ์ mdev จากอินสแตนซ์ VM ได้เมื่อไม่อยู่ในสถานะหยุดทำงาน โปรดตรวจสอบว่าอินสแตนซ์ VM หยุดทำงานแล้วก่อนถอดอุปกรณ์ mdev", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10053": "ไม่มี Virtual Private Cloud (VPN) ที่กำหนดค่าบน SDN Controller [IP:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10054": "ระบบต้องการ system tag สำหรับ VPC ID โปรดระบุค่าที่ถูกต้อง", + "ORG_ZSTACK_MACVLAN_10002": "ไม่สามารถตรวจสอบอินเทอร์เฟซ VLAN[%s] สำหรับเครือข่าย L2VLAN[uuid:%s, name:%s] บน KVM host[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10051": "ไม่มีสวิตช์ที่กำหนดค่าบน sdn controller [ip:%s]", + "ORG_ZSTACK_MACVLAN_10005": "ไม่สามารถแนบบริการเครือข่ายกับเครือข่าย L3 [uuid:%s] ได้ เนื่องจากเครือข่าย L2 [uuid:%s, vSwitchType:%s] ไม่รองรับบริการเครือข่าย L3 ใดๆ สำหรับเครือข่าย L3 พื้นฐานส่วนตัว", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10052": "ไม่มี SDN switch ที่เชื่อมต่อกับ controller%s", + "ORG_ZSTACK_MACVLAN_10004": "เฉพาะ %s รองรับโหมดเครือข่าย MACVLAN", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10057": "ไม่สามารถเรียกดู logical switch สำหรับเครือข่าย layer 2 %s", + "ORG_ZSTACK_MACVLAN_10007": "ไม่สามารถแนบบริการเครือข่ายกับเครือข่าย L3 พร้อม UUID: %s ได้ เนื่องจากเครือข่าย L2 พร้อม UUID: %s รองรับเฉพาะ vRouter เป็นผู้ให้บริการเครือข่ายสำหรับเครือข่าย L3 พื้นฐานส่วนตัว", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10058": "การเรียกดู logical switch สำหรับเครือข่าย Layer 2 ล้มเหลวด้วยผลลัพธ์: %s", + "ORG_ZSTACK_MACVLAN_10006": "ไม่สามารถแนบบริการเครือข่ายกับเครือข่าย L3 พร้อม UUID: %s ได้ เนื่องจากเครือข่าย L2 พร้อม UUID: %s รองรับเฉพาะ vRouter เป็นผู้ให้บริการเครือข่ายสำหรับเครือข่าย L3 แบบ VPC และไม่รองรับ vSwitchType: %s", + "ORG_ZSTACK_MACVLAN_10009": "โฮสต์ KVM รองรับเฉพาะเครือข่าย L2 ที่มี vSwitchType ตั้งค่าเป็น OVS โปรดตรวจสอบว่าโฮสต์ของคุณเป็นประเภท KVM และ vSwitchType ถูกกำหนดค่าเป็น OVS", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10056": "ไม่สามารถเรียกดูข้อมูลพอร์ตสวิตช์ฟิสิคัลได้เนื่องจาก: %s", + "ORG_ZSTACK_MACVLAN_10008": "ไม่สามารถแนบบริการเครือข่ายกับเครือข่าย L3 [uuid:%s] ได้ เนื่องจากเครือข่าย L2 [uuid:%s, vSwitch Type:%s] รองรับเฉพาะ load balancer สำหรับเครือข่าย L3 พื้นฐานส่วนตัว", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10075": "ระบบได้ลบ volume รูทแล้วและไม่สามารถ reimaged ได้ในขณะนี้ โปรดติดต่อฝ่ายสนับสนุนเพื่อขอความช่วยเหลือ", + "ORG_ZSTACK_STORAGE_CEPH_10023": "ปัญหาอาจเกิดจาก access key ID หรือ secret access key หรือหมายเลขพอร์ต SSH ที่ไม่ถูกต้อง หรือการเชื่อมต่อเครือข่ายไม่เสถียรในสภาพแวดล้อมคลาวด์ของคุณ โปรดตรวจสอบการตั้งค่าเหล่านี้", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10050": "ไม่มี tenant บน SDN controller [IP:%s]", + "ORG_ZSTACK_STORAGE_CEPH_10020": "poolName สามารถเป็น null ได้แต่ต้องไม่เป็นสตริงว่าง", + "ORG_ZSTACK_KVM_10022": "การเชื่อมต่อ SSH ไปยังโฮสต์[%s] ชื่อผู้ใช้[%s] บนพอร์ต[%s] ล้มเหลว เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10073": "ไม่สามารถสร้างวอลุ่มว่างเปล่า[uuid:%s, name:%s] บนโฮสต์ KVM[uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_10021": "ต้องระบุ poolName เมื่อเปิดใช้งาน importImages", + "ORG_ZSTACK_KVM_10023": "โฮสต์[%s] ไม่ได้เปิดเครื่องภายใน %d วินาที เนื่องจากสาเหตุที่ไม่ทราบ โปรดตรวจสอบสถานะโฮสต์ผ่าน BMC[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10092": "ไม่ผ่านการตรวจสอบความปลอดภัยในการกู้คืน:\\n%s", + "ORG_ZSTACK_KVM_10014": "โฮสต์ %s ไม่ได้ถูกจัดการโดยโหนดการจัดการปัจจุบัน", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10000": "executeSlbGroupConfigTask ไม่รู้จักชื่อ task: %s", + "ORG_ZSTACK_MEVOCO_10049": "ไม่พบข้อมูลการกำหนดค่าสำหรับโหนด A", + "ORG_ZSTACK_STORAGE_BACKUP_10091": "พื้นที่เก็บข้อมูลสำรอง [UUID:%s] ไม่ได้เปิดใช้งานหรือกำหนดค่า", + "ORG_ZSTACK_KVM_10015": "โฮสต์ %s ไม่ได้เชื่อมต่อ ข้ามการรีสตาร์ท KVM agent", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10039": "ไม่สามารถย้ายวอลุ่มรูท [uuid:%s] เนื่องจากมีอุปกรณ์ที่ถูกจัดการต่อเชื่อมอยู่", + "ORG_ZSTACK_MEVOCO_10048": "ไม่สามารถตั้งค่าการกำหนดค่าเฉพาะที่และการกำหนดค่าคลาวด์พร้อมกันได้ โปรดระบุสภาพแวดล้อมการติดตั้งเดียว", + "ORG_ZSTACK_STORAGE_BACKUP_10090": "การสำรองข้อมูลฐานข้อมูล [uuid:%s] ยังไม่มีอยู่", + "ORG_ZSTACK_KVM_10016": "มี task ที่กำลังทำงานบนโฮสต์ %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10081": "ไม่พบไฟล์ flag [%s] บนโหนดคำนวณ [%s] เนื่องจาก: %s", + "ORG_ZSTACK_MEVOCO_10047": "ที่อยู่ IP การจัดการโฮสต์ไม่ถูกต้อง: [%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10037": "ไม่สามารถย้าย VM[UUID:%s] เนื่องจากมีอุปกรณ์ mdev ต่อเชื่อมอยู่", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10035": "ไม่พบอุปกรณ์ mdev[uuid:%s] อาจถูกลบหรือปลดปล่อยแล้ว", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10036": "อุปกรณ์ mdev ที่มี UUID: %s ไม่มีอยู่หรือถูกปิดใช้งานสำหรับ VM ที่มี UUID: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10034": "ไม่พบอุปกรณ์ mdev ที่มีสเปก [uuid:%s] เพียงพอบนโฮสต์ปลายทาง [uuid:%s] สำหรับเครื่องเสมือน [uuid:%s]", + "ORG_ZSTACK_MEVOCO_10041": "ค่าไม่ถูกต้อง[%s], ZStack ไม่สนับสนุนประเภทการจัดสรรโฮสต์นี้", + "ORG_ZSTACK_STORAGE_BACKUP_10099": "การสำรองข้อมูลฐานข้อมูล[uuid:%s] ไม่ได้เปิดใช้งานและพร้อมใช้งาน", + "ORG_ZSTACK_STORAGE_CDP_10120": "ไม่พบพื้นที่เก็บข้อมูลสำรองที่เชื่อมต่อ[uuid: %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10098": "วอลุ่ม[uuid:%s] ถูกลบแล้วและไม่อนุญาตให้เปลี่ยนแปลงสถานะ", + "ORG_ZSTACK_MEVOCO_10040": "ค่าไม่ถูกต้อง[%s], ไม่ใช่ตัวเลขทศนิยมที่ถูกต้อง", + "ORG_ZSTACK_STORAGE_CDP_10121": "การดำเนินการเกี่ยวข้องกับวอลุ่ม [UUID: %s] ที่จะสร้างสแนปช็อตประเภทเชน ด้วยเหตุนี้ คุณจึงไม่สามารถดำเนินการนี้ได้ขณะที่มี task การป้องกันข้อมูลต่อเนื่อง (CDP) ทำงานอยู่บนอินสแตนซ์เครื่องเสมือน", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10032": "ไม่สามารถระบุโฮสต์ที่เป็นไปได้เพื่อเริ่ม vm[uuid:%s], %s", + "ORG_ZSTACK_STORAGE_BACKUP_10097": "ไม่พบ object storage bucket ที่ว่าง�สำหรับการสำรองข้อมูล ข้าม job นี้%s", + "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10001": "ห้ามลบ topic ระบบออกจาก alarm ระบบ โปรดระบุ topic และ alarm UUID ที่ถูกต้อง", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10005": "ไม่พบอินเทอร์เฟซเครือข่ายสาธารณะของอินสแตนซ์ SLB", + "ORG_ZSTACK_MEVOCO_10046": "obj ไม่ใช่ instance ของ NicQos! โปรดตรวจสอบว่าประเภท object ตรงกับประเภทที่คาดหวัง", + "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10000": "alarm[uuid:%s] คือการแจ้งเตือนที่ระบบสร้างขึ้นซึ่งไม่สามารถลบได้", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10004": "งานกำหนดค่า slb instance[uuid:%s] version:%d ล้มเหลว %d ครั้ง", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10003": "ไม่พบ instance SLB ที่พร้อมใช้งานในกลุ่ม[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10094": "เวอร์ชันการสำรองข้อมูลฐานข้อมูล[%s] ไม่ตรงกับเวอร์ชันปัจจุบัน[%s]", + "ORG_ZSTACK_MACVLAN_10000": "ล้มเหลวในการสร้าง bridge สำหรับ l2VlanNetwork[uuid:%s, name:%s] บน KVM host[uuid:%s], %s", + "ORG_ZSTACK_MEVOCO_10043": "ค่า %s คือ[%s] ซึ่งขัดแย้งกับค่า %s [%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10093": "ไม่สามารถจัดสรรพอร์ตว่างสำหรับการรับฟังได้ โปรดตรวจสอบว่าพอร์ตที่ต้องการไม่ได้ถูกใช้งานโดยแอปพลิเคชันอื่น หากปัญหายังคงอยู่ ให้พิจารณาตรวจสอบการกำหนดค่าเครือข่ายหรือติดต่อฝ่ายสนับสนุนเพื่อขอความช่วยเหลือเพิ่มเติม", + "ORG_ZSTACK_MEVOCO_10060": "ตั้งค่าที่อยู่สำหรับ node A ล้มเหลว", + "ORG_ZSTACK_KVM_10030": "ตรวจสอบความจุของ host ล้มเหลว เนื่องจาก:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10082": "ไม่สามารถสร้างไฟล์ flag [%s] บน instance [%s] เนื่องจาก: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10060": "รับ logical switch ล้มเหลว: uuid: %s", + "ORG_ZSTACK_KVM_10032": "ความจุหน่วยความจำที่พร้อมใช้งานของ host [UUID: %s] คือ [%s MB] ซึ่งต่ำกว่าความจุที่สงวนไว้ [%s MB]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10083": "ไม่มี LocalStorage primary storage (state=%s, status=%s) บน cluster (%s) เมื่อ cluster มี primary storage หลายตัวติดตั้งอยู่ ระบบจะใช้ local primary storage เป็นค่าเริ่มต้น โปรดตรวจสอบสถานะและสถานะของ primary storage และตรวจสอบว่าได้ต่อกับ cluster แล้ว", + "ORG_ZSTACK_KVM_10033": "ไม่สามารถลงทะเบียน colo heartbeat สำหรับ vm[uuid:%s] บน kvm host [uuid:%s, ip:%s] เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10084": "ประเภทของ primary storage [uuid:%s] ที่เลือกไม่ใช่ local storage โปรดตรวจสอบว่าสามารถสร้างทรัพยากรบน storage ที่พร้อมใช้งานอื่นได้หรือไม่เมื่อ cluster มี local primary storage ติดตั้งอยู่", + "ORG_ZSTACK_KVM_10034": "ไม่สามารถเริ่มต้น colo synchronization virtual machine [uuid:%s] บน kvm host [uuid:%s, ip:%s] เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10085": "Cluster มี primary storage หลายตัวติดตั้งอยู่ [Local Storage (%s), other non-LocalStorage primary storage] ดังนั้นจึงไม่อนุญาตให้ระบุ primaryStorageUuidForDataVolume %s", + "ORG_ZSTACK_KVM_10024": "Host[%s] ไม่ได้ปิดเครื่องภายใน %d วินาทีด้วยเหตุผลที่ไม่ทราบ โปรดตรวจสอบสถานะของ host ผ่าน BMC[%s]", + "ORG_ZSTACK_MEVOCO_10059": "Instance นี้ไม่ได้เชื่อมโยงกับ node A", + "ORG_ZSTACK_MEVOCO_10058": "มี node บางตัวอยู่ใน factory mode; รายละเอียดของ ARPing: %s", + "ORG_ZSTACK_MEVOCO_10053": "curl bootstrap agent เสร็จสิ้น, return code: %s, stdout: %s, stderr: %s", + "ORG_ZSTACK_MEVOCO_10052": "ไม่สามารถรับผลลัพธ์ bootstrap job %s หลังจาก 900 วินาที", + "ORG_ZSTACK_MEVOCO_10050": "ไม่พบข้อมูลที่อยู่ของ node A จาก bootstrap agent", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10040": "ไม่สามารถย้าย VM[UUID:%s] เนื่องจากมีอุปกรณ์ MDEV ติดตั้งอยู่", + "ORG_ZSTACK_MEVOCO_10057": "node A อัปเดต factory mode ล้มเหลว, รายละเอียด: %s", + "ORG_ZSTACK_MEVOCO_10056": "management nodes ทั้งหมดอัปเดตเป็น factory mode ล้มเหลว, รายละเอียด: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10013": "ที่อยู่ MAC %s ไม่ถูกต้อง ควรอยู่ในรูปแบบ 6c:b3:11:1b:0b:1e", + "ORG_ZSTACK_HA_10014": "ไม่สามารถตั้งค่า FT บน VM [uuid:%s] เนื่องจากมีอุปกรณ์ USB ติดตั้งผ่าน passthrough", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10012": "baremetal PXE server [UUID:%s] ไม่ได้เปิดใช้งานและไม่ได้เชื่อมต่อ โปรดตรวจสอบสถานะ", + "ORG_ZSTACK_HA_10015": "ไม่สามารถตั้งค่า FT บน virtual machine [uuid:%s] เนื่องจากมีอุปกรณ์ mdev ติดตั้งอยู่", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10015": "ตรวจพบ UUID ของ bond ซ้ำสำหรับเครื่องเสมือน %s กรุณาตรวจสอบให้แน่ใจว่า UUID สำหรับการตั้งค่าการ bonding ไม่ซ้ำกัน", + "ORG_ZSTACK_HA_10016": "", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10014": "โหนดการจัดการไม่สามารถค้นพบโฮสต์ได้ กรุณาตรวจสอบให้แน่ใจว่าโฮสต์ได้ลงทะเบียนอย่างถูกต้องและสามารถเข้าถึงได้ภายในสภาพแวดล้อมคลาวด์", + "ORG_ZSTACK_HA_10017": "", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10057": "แชสซี baremetal [UUID: %s] ไม่มีอินเทอร์เฟซเครือข่ายที่มีที่อยู่ MAC %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10017": "", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10058": "ค่า[%s] อยู่นอกช่วงที่ถูกต้อง [0, 1]", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10016": "", + "ORG_ZSTACK_HA_10011": "โฮสต์[uuid: %s] ของพื้นที่เก็บข้อหลักท้องถิ่น[uuid: %s] ไม่มีความจุเพียงพอ[ปัจจุบัน: %s ไบต์, ต้องการ: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10059": "", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10019": "ตรวจพบ UUID ของ L3 Network ซ้ำ", + "ORG_ZSTACK_HA_10012": "", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10018": "ไม่พบโฮสต์ที่มีทรัพยากร[uuid:%s]", + "ORG_ZSTACK_HA_10013": "", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10053": "ไม่รองรับ Baremetal Network Bonding", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10054": "", + "ORG_ZSTACK_KVM_10040": "ไม่สามารถตั้งค่า FT บน VM[uuid:%s] เนื่องจากไม่อยู่ในสถานะหยุดทำงาน", + "ORG_ZSTACK_HA_10018": "", + "ORG_ZSTACK_KVM_10043": "ทรัพยากร[uuid:%s] สามารถดำเนินการได้บนโฮสต์[uuid:%s] เท่านั้น แต่โฮสต์ได้ถูกยกเลิกแล้ว", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10050": "", + "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10001": "เครือข่าย Layer 3 ที่เลือกไม่สามารถกำหนดให้กับแชสซี [UUID:%s] ได้", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10051": "", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10011": "ไม่สามารถตั้งค่า FT บน VM[uuid:%s] เนื่องจากมี data volumes ติดตั้งอยู่", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10052": "", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10010": "เครือข่าย layer 3 ที่ระบุไม่มีอยู่ กรุณาตรวจสอบชื่อเครือข่ายและลองใหม่", + "ORG_ZSTACK_KVM_10035": "", + "ORG_ZSTACK_MEVOCO_10028": "ไม่สามารถตั้งค่า FT บน VM[uuid:%s] เนื่องจากมีอุปกรณ์ PCI ติดตั้งอยู่", + "ORG_ZSTACK_STORAGE_BACKUP_10070": "", + "ORG_ZSTACK_KVM_10036": "เพื่อจัดเตรียม data volume บนพื้นที่เก็บข้อหลักท้องถิ่น คุณต้องระบุโฮสต์ที่จะสร้าง data volume โดยใช้ system tag [%s]", + "ORG_ZSTACK_MEVOCO_10027": "", + "ORG_ZSTACK_KVM_10037": "ไม่สามารถดึงอุปกรณ์บูตเริ่มต้นของ VM [UUID:%s] บน KVM host [UUID:%s, IP:%s] เนื่องจาก %s", + "ORG_ZSTACK_MEVOCO_10026": "volume IOPS[%s] ไม่ถูกต้อง ไม่ใช่ตัวเลขที่ถูกต้อง", + "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10000": "ต้องระบุ Host UUID อย่างน้อยหนึ่งรายการเมื่อสืบค้น Third-Party Prometheus Namespace โปรดตรวจสอบว่า Host UUID รวมอยู่ใน labels ของ query call parameters", + "ORG_ZSTACK_KVM_10038": "ไม่สามารถดึง device address ของ vm[uuid:%s] เนื่องจาก:%s", + "ORG_ZSTACK_MEVOCO_10025": "ค่า IOPS[%s] ไม่ถูกต้อง ต้องมากกว่าหรือเท่ากับ 1", + "ORG_ZSTACK_KVM_10039": "ไม่สามารถดึงข้อมูล virtualizer ของ host[uuid:%s] เนื่องจาก:%s", + "ORG_ZSTACK_MEVOCO_10029": "การเข้าถึงอุปกรณ์ USB จำกัดเฉพาะบัญชีผู้ดูแลระบบเท่านั้น โปรดตรวจสอบว่าคุณเข้าสู่ระบบด้วยบัญชีที่มีสิทธิ์ผู้ดูแลระบบ", + "ORG_ZSTACK_STORAGE_BACKUP_10078": "backup storage ไม่สามารถดำเนินการได้เนื่องจากสถานะเป็น %s", + "ORG_ZSTACK_MEVOCO_10020": "volume bandwidth[%s] ไม่ถูกต้อง ต้องเป็นค่าตัวเลข", + "ORG_ZSTACK_STORAGE_BACKUP_10077": "backup storage ไม่สามารถดำเนินการได้เนื่องจากสถานะเป็น %s", + "ORG_ZSTACK_STORAGE_BACKUP_10076": "backup storage [UUID: %s, Name: %s] ไม่มีความจุเพียงพอสำหรับการดาวน์โหลด image [%s] ขนาดที่ต้องการ: %s, ขนาดที่มีอยู่: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10001": "Ceph MON nodes ทั้งหมดถูกตัดการเชื่อมต่อใน Ceph backup storage [uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10075": "ขนาด image ที่ดึงมาจาก URL %s มีขนาด %d bytes ซึ่งเล็กเกินไปสำหรับ image โปรดตรวจสอบ URL อีกครั้ง", + "ORG_ZSTACK_STORAGE_BACKUP_10074": "ไม่สามารถดึง header จาก image URL %s", + "ORG_ZSTACK_STORAGE_BACKUP_10073": "ไม่สามารถดึง header จาก image URL %s: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10072": "โปรดหยุดการทำงานของ nodes อื่นๆ ก่อน!", + "ORG_ZSTACK_MEVOCO_10021": "volume bandwidth[%s] ไม่ถูกต้อง เกินค่าสูงสุดที่อนุญาต %d", + "ORG_ZSTACK_STORAGE_BACKUP_10071": "VM cluster [%%s] ไม่ได้อยู่ในตำแหน่งเดียวกันกับ primary storage cluster [%%s]", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10023": "ไม่สามารถลบ baremetal instance ที่ไม่อยู่ในสถานะ Destroyed", + "ORG_ZSTACK_HA_10005": "hosts ไม่สามารถ port scan target host[uuid:%s, ip:%s] ได้", + "ORG_ZSTACK_IDENTITY_LOGIN_10000": "วิธีการยืนยันตัวตน %s ไม่ได้รับการสนับสนุน", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10068": "cluster [UUID=%s] มี primary storages หลายตัวติดตั้งอยู่ รวมถึง LocalStorage และ non-LocalStorage primary storage คุณต้องระบุ primary storage ที่ data disk อยู่", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10003": "ไม่สามารถย้าย Image %s จาก Backend Storage %s ไปยัง Backend Storage %s สาเหตุ: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10002": "พบ trash ID (%s) บน Backup Storage [%s] สำหรับ migration install path [%s] โปรดล้างก่อนโดยใช้ 'APICleanUpTrashOnBackupStorageMsg' หากยังคงต้องการย้าย image [%s]", + "ORG_ZSTACK_HA_10000": "อาจมีการยุติการทำงานของ virtual machine instance แล้ว ข้าม health checkers", + "ORG_ZSTACK_HA_10001": "ไม่พบ virtual machine ที่มี name:[%s] และ uuid:[%s], host uuid เป็น null", + "ORG_ZSTACK_HA_10002": "ไม่พบ HAHostChecker instance ไม่สามารถทำ high availability checks ได้ โปรดตรวจสอบว่าคอมโพเนนต์ที่จำเป็นทั้งหมดถูกกำหนดค่าอย่างถูกต้อง", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10064": "การใช้งาน physical capacity ของ host [uuid:%s] เกิน threshold [%s] โปรดพิจารณาขยายหรือปรับปรุงทรัพยากร", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10067": "cluster[uuid=%s] มี primary storage หลายตัวติดตั้งอยู่ รวมถึง LocalStorage และ non-LocalStorage primary storage คุณต้องระบุว่า primary storage ใดมี root disk", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10060": "KVM host [UUID: %s] ล้มเหลวในการเพิ่มไปยัง local primary storage [UUID: %s], %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10020": "สำหรับบริการ bare metal ใน ZStack รองรับเฉพาะ ISO images เท่านั้น", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10061": "ไม่สามารถสร้าง snapshot volume ว่างเปล่า[ชื่อ:%s, path ติดตั้ง: %s] บน KVM host[uuid:%s, ip:%s], เนื่องจาก %s", + "ORG_ZSTACK_KVM_10054": "ไม่สามารถทำ volume snapshot merge ได้เมื่อ virtual machine [uuid:%s] อยู่ในสถานะ %s การดำเนินการนี้อนุญาตเฉพาะเมื่อ virtual machine อยู่ในสถานะ Running หรือ Stopped เท่านั้น", + "ORG_ZSTACK_HA_10008": "เกิดข้อยกเว้นขณะทำการ sync สถานะ self-fencer จาก host [UUID: %s], %s", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10000": "ไม่พบ folder[%s] บน cloud management server[%s]", + "ORG_ZSTACK_KVM_10055": "live volume snapshot merge ต้องการ libvirt version ที่สูงกว่า %s, version ปัจจุบันคือ %s กรุณาหยุด VM แล้วลองใหม่หรือถอด data volume ออกหากจำเป็น", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10062": "ไม่สามารถ transfer bits จาก SFTP backup storage[hostname:%s, path: %s] ไปยัง local primary storage[uuid:%s, path: %s], %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10022": "ไม่สามารถ recover baremetal instance ที่ไม่อยู่ในสถานะ Destroyed กรุณาตรวจสอบว่า instance อยู่ในสถานะ Destroyed ก่อนทำการ recover", + "ORG_ZSTACK_HA_10009": "ไม่สามารถตั้งค่า parameter %s เป็น '%s' ได้เนื่องจาก storage network ไม่พร้อมใช้งานและ high availability ต้องยังคงเปิดใช้งานอยู่", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10001": "namespace[%s] ขาด metric[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10063": "ไม่สามารถ upload bits จาก local storage[uuid:%s, path:%s] ไปยัง SFTP backup storage[hostname:%s, remotePath:%s], %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10021": "ใน ZStack Bare Metal Service รองรับเฉพาะ Image Store Backup Storage เท่านั้น", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10002": "metric[%s] ของ namespace[%s] ขาด label ชื่อ %s", + "ORG_ZSTACK_MEVOCO_10039": "ค่า[%s] ไม่ถูกต้อง, ต้องเป็น double ระหว่าง (0, 1] รวมถึง 1", + "ORG_ZSTACK_KVM_10047": "Host [UUID: %s, status: %s] ไม่ได้เชื่อมต่อ", + "ORG_ZSTACK_COMPUTE_OVS_10000": "รูปแบบการกำหนดค่า ovs CPU pinning resource:[%s] ไม่ถูกต้อง", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10001": "on purpose 1: ไม่พบ source file กรุณาตรวจสอบว่า files ที่จำเป็นถูก upload และรวมอยู่ใน project setup อย่างถูกต้อง", + "ORG_ZSTACK_MEVOCO_10037": "ค่า[%s] ไม่ถูกต้อง, ต้องเป็น floating-point number บวกที่มากกว่า 0", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10002": "on purpose: 2 - ข้อผิดพลาดนี้บ่งชี้ว่าการดำเนินการถูกยกเลิกหรือแก้ไขโดยตั้งใจระหว่างการทำงาน กรุณาตรวจสอบ input parameters และตรวจสอบว่าเป็นไปตามข้อกำหนดสำหรับ cloud computing environment", + "ORG_ZSTACK_MEVOCO_10031": "ไม่รู้จัก security code[%s] สำหรับการยืนยันตัวตน", + "ORG_ZSTACK_STORAGE_BACKUP_10089": "volume backup metadata operation ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_STORAGE_BACKUP_10087": "สร้าง volume backup metadata file บน image store[uuid:%s] ล้มเหลวเนื่องจาก IO error: %s", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10000": "on purpose: 3 Cloud instances กำลังถูกยกเลิก กรุณายืนยันการดำเนินการ", + "ORG_ZSTACK_MEVOCO_10034": "Operating system %s %s ของ host [UUID:%s] เก่าเกินไปที่จะรองรับ QoS สำหรับ network หรือ disk I/O กรุณาเลือก instance อื่นที่ไม่มี QoS configuration", + "ORG_ZSTACK_MEVOCO_10033": "%s ไม่ใช่ CIDR notation ที่ถูกต้อง", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10010": "ไม่สามารถเพิ่ม Huawei iMaster SDN controller ที่มี VLAN range [%s, %s] ไม่ถูกต้อง", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10008": "iso[uuid: %s] ถูก attach กับ vm[uuid: ], แต่ ISO file ไม่ได้อยู่บน block storage กรุณาถอดออกก่อนทำ VM migration", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10009": "fail to find block SCSI LUN for volume: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10035": "host[uuid:%s] ไม่สามารถเข้าถึง local storage[uuid:%s], อาจเนื่องจากการถูกถอด", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10013": "ไม่สามารถสร้าง Huawei iMaster NSE L3 network ที่ไม่มี logical router UUID", + "ORG_ZSTACK_MEVOCO_10093": "DeleteVolumeQos [%s] ถูกเพิกเฉยเนื่องจากสิทธิ์ของบัญชี", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10036": "ทรัพยากร[uuid:%s, type: %s] ไม่พร้อมใช้งานบน primary storage เฉพาะที่[uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10014": "ไม่สามารถสร้าง Huawei iMaster L3 network ด้วย L2 network [uuid:%s] เนื่องจากมีอยู่แล้ว", + "ORG_ZSTACK_MEVOCO_10092": "โหมด volume quality of service ไม่ถูกต้อง: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10037": "ทรัพยากร[uuid:%s, type: %s] บน primary storage เฉพาะที่[uuid:%s] แมปกับ hypervisors หลายตัว%sWithMultipleHypervisors", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10011": "ไม่สามารถเพิ่ม Huawei iMaster SDN Controller โดยไม่ระบุ VLAN range หรือ VLAN ID", + "ORG_ZSTACK_MEVOCO_10091": "ไม่มี volumes ที่แนบกับ instance นี้ โปรดแนบ volume เพื่อดำเนินการต่อ", + "ORG_ZSTACK_STORAGE_BACKUP_10058": "ไม่สามารึระบุ primary storage ที่แนบกับ cluster อื่นได้", + "ORG_ZSTACK_STORAGE_BACKUP_10057": "ต้องระบุอย่างน้อยหนึ่งในพารามิเตอร์ต่อไปนี้: L3 Network UUIDs, Zone UUID, Cluster UUID, Host UUID", + "ORG_ZSTACK_MEVOCO_10090": "ไม่สามารถสร้าง snapshot สำหรับ volumes ที่แนบกับ VMs หลายตัว", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10033": "ไม่สามารถสร้าง data volume[uuid: %s] บน primary storage เฉพาะที่[uuid:%s] เนื่องจากไม่ได้ระบุ host UUID", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10034": "ไม่มีสถานะ host ที่เปิดใช้งาน โปรดตรวจสอบความพร้อมของทรัพยากร host", + "ORG_ZSTACK_KVM_10064": "ล้มเหลวในการอัปเดต network interface สำหรับ virtual machine [vm:%s] บน KVM host [uuid:%s, ip:%s] เนื่องจาก %s", + "ORG_ZSTACK_KVM_10065": "ล้มเหลวในการแนบ nic ด้วย UUID: %s ไปยัง VM UUID: %s บน KVM host ที่มี UUID: %s และ IP: %s เนื่องจาก %s โปรดลองอีกครั้งหรือลบ device ด้วย UUID: %s ด้วยตนเอง", + "ORG_ZSTACK_KVM_10066": "ล้มเหลวในการแนบ nic ด้วย UUID: %s ไปยัง VM UUID: %s บน KVM host ที่มี UUID: %s และ IP: %s เนื่องจาก %s", + "ORG_ZSTACK_KVM_10067": "ล้มเหลวในการถอด data volume[uuid:%s, installPath:%s] จาก vm[uuid:%s, name:%s] บน KVM host[uuid:%s, ip:%s] เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10005": "port forwarding rule [uuid:%s] ถูกลบไปแล้ว", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10006": "Port forwarding rule [uuid:%s] ไม่ได้เปิดใช้งาน สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_KVM_10059": "vm[uuid:%s] ไม่อยู่ในสถานะ Running หรือ Stopped สถานะปัจจุบัน[%s]", + "ORG_ZSTACK_TICKET_10000": "ticket[uuid:%s, name:%s] สามารถอัปเดตได้หลังจากถูกยกเลิกเท่านั้น สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_TICKET_10001": "ปฏิเสธการดำเนินการ การดำเนินการต้องดำเนินการโดย account/virtual ID[uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10017": "รับ token จาก SDN controller [IP:%s] ล้มเหลวในการดึงข้อมูล", + "ORG_ZSTACK_MEVOCO_10086": "VM[uuid:%s] หยุดทำงานแล้ว โปรดลองอีกครั้งภายหลัง", + "ORG_ZSTACK_STORAGE_BACKUP_10056": "VM ปัจจุบัน[UUID: %s] ของ volume[UUID: %s] ไม่ใช่ VM[UUID: %s] ที่ใช้สำหรับ backup อีกต่อไป", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10003": "ไม่สามารถดำเนินการ map LUN to host flow ได้เนื่องจาก PS host reference metadata ว่างเปล่า โปรดตรวจสอบการกำหนดค่า host และให้แน่ใจว่า metadata ที่จำเป็นถูกกรอกข้อมูล", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10018": "รับ token จาก sdn controller [ip:%s] ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_MEVOCO_10085": "ไม่พบ snapshots จาก volume UUID [uuid: %s] อาจไม่มี snapshot chain ที่ต้องตรวจสอบ", + "ORG_ZSTACK_STORAGE_BACKUP_10055": "root volume snapshot ของ group[uuid:%s] ไม่พบ", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10000": "ไม่สามารถดำเนินการ mapping logical unit to host ได้เนื่องจาก backend device เป็น null%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10015": "ไม่สามารถลบ Huawei Logical Router [UUID:%s] ได้เนื่องจากเชื่อมโยงกับ L3 Network [UUID:%s]", + "ORG_ZSTACK_MEVOCO_10084": "ไม่พบ snapshot ล่าสุดจาก volume [uuid: %s] อาจไม่มี snapshot chain สำหรับการตรวจสอบ", + "ORG_ZSTACK_STORAGE_BACKUP_10054": "ไม่พบ backup volume สำหรับ group UUID: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10016": "ล้มเหลวในการรับ token ของ SDN controller [IP:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10001": "ไม่สามารถดำเนินการ map LUN ไปยัง host flow ได้เนื่องจาก PS host reference เป็น null กรุณาตรวจสอบว่า host reference ถูกตั้งค่าอย่างถูกต้อง", + "ORG_ZSTACK_MEVOCO_10083": "ไม่พบ snapshot ที่ระบุใน snapshot tree ของ volume [UUID: %s] อาจไม่มี snapshot chain ที่ต้องการตรวจสอบ", + "ORG_ZSTACK_STORAGE_BACKUP_10053": "resource[uuid: %s] ได้เริ่มต้น CDP task แล้ว ดังนั้นจึงไม่สามารถสร้าง backup job พร้อมกันได้", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10006": "KVM host [UUID: %s] ล้มเหลวในการเพิ่มไปยัง block primary storage [UUID: %s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10009": "port forwarding rule[uuid:%s] ไม่ได้เปิดใช้งาน สถานะปัจจุบันคือ %s กฎสามารถถูกแนบได้ก็ต่อเมื่อสถานะเปิดใช้งานเท่านั้น", + "ORG_ZSTACK_STORAGE_BACKUP_10052": "ล้มเหลวในการสร้าง backups สำหรับ VM[uuid:%s] เนื่องจากไม่อยู่ในสถานะ[%s, %s]", + "ORG_ZSTACK_MEVOCO_10089": "ไม่สามารถสร้าง snapshot สำหรับ volumes[%s] เนื่องจาก volume[UUID: %s] ถูกกำหนดไว้หลายครั้ง", + "ORG_ZSTACK_STORAGE_BACKUP_10051": "Volume[uuid:%s] ไม่ใช่ root volume", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10019": "ล้มเหลวในการลบ token ของ SDN controller [IP:%s] เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10004": "ไม่สามารถดำเนินการ volume mapping ไปยัง host flow ได้เนื่องจาก volume ID ไม่ถูกต้อง %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10007": "port forwarding rule [uuid:%s] ไม่ได้แนบกับ virtual machine network interface ใดๆ ไม่สามารถถอดได้", + "ORG_ZSTACK_MEVOCO_10088": "ไม่สามารถสร้าง snapshot สำหรับ volumes[%s] เมื่อ volume[uuid: %s] ไม่ได้แนบ", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10005": "ไม่สามารถดำเนินการ map LUN ไปยัง host flow ได้เนื่องจาก LUN type ไม่ถูกต้อง: %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10008": "port forwarding rule [uuid:%s] ได้เชื่อมโยงกับ vm nic [uuid:%s] แล้ว ไม่สามารถกำหนดใหม่ได้อีก", + "ORG_ZSTACK_MEVOCO_10087": "Running VM[uuid:%s] ไม่มี Host UUID ที่เชื่อมโยง", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10020": "ล้มเหลวในการรับ tenant ของ SDN controller [IP:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10021": "ล้มเหลวในการรับ tenant ของ SDN controller [IP:%s] เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10019": "block primary storage [uuid:%s, name:%s] ไม่พบ host ที่มีให้ใช้งานภายใน clusters ที่แนบสำหรับการสร้าง volume", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10024": "ล้มเหลวในการรับ logical switch port จาก SDN controller [IP:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10047": "ไม่สามารถแนบ data volume [uuid:%s] กับ VM [uuid:%s] ได้ ทั้ง root volume ของ VM และ data volume อยู่บน local primary storage แต่อยู่คนละ host root volume [uuid:%s] อยู่บน host [uuid:%s] ในขณะที่ data volume [uuid:%s] อยู่บน host [uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10025": "ล้มเหลวในการรับ switch port information จาก sdn controller [ip:%s] เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10048": "data volume [name: %s, UUID: %s] อยู่บน local storage [UUID: %s] แต่ host ที่ data volume อยู่ถูกลบแล้ว การกู้คืน volume นี้ไม่เป็นไปได้", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10022": "ล้มเหลวในการรับ switch device จาก SDN controller [ip:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10069": "VM กำลังสร้าง backup job อยู่ ไม่สามารถเปิดใช้งาน CDP task พร้อมกันได้ กรุณาตรวจสอบว่า backup jobs ทั้งหมดเสร็จสิ้นแล้วก่อนเปิดใช้งาน CDP", + "ORG_ZSTACK_KVM_10070": "ล้มเหลวในการ terminate virtual machine[uuid:%s name:%s] บน KVM host[uuid:%s, ip:%s] เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10049": "ไม่สามารถกู้คืน vm[uuid:%s, name:%s] ได้ root volume ของ vm อยู่บน local storage[uuid:%s] แต่ host ที่ root volume อยู่ถูกลบแล้ว", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10023": "ล้มเหลวในการรับ switch device จาก SDN controller [IP:%s] เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_BACKUP_10068": "คลัสเตอร์โฮสต์ [uuid: %s] ไม่ได้อยู่ในตำแหน่งเดียวกันกับคลัสเตอร์วอลุม [uuid: %s] กรุณาตรวจสอบให้แน่ใจว่าพื้นที่จัดเก็บหลักอยู่ในคลัสเตอร์เดียวกัน", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10020": "", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10044": "VM [Name: %s UUID: %s] มีกฎการส่งต่อพอร์ตที่มี VIP ต่างจาก VIP ที่ระบุ [UUID: %s] อยู่แล้ว", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10045": "", + "ORG_ZSTACK_KVM_10075": "การสร้างขึ้นอยู่กับแคชรูปภาพ [uuid: %s, located host uuids: [%s]] ไม่สามารถสร้างในที่อื่นได้", + "ORG_ZSTACK_KVM_10078": "", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10017": "พื้นที่จัดเก็บในเครื่องไม่รองรับการย้ายขณะทำงานสำหรับไฮเปอร์ไวเซอร์[%s]", + "ORG_ZSTACK_KVM_10069": "", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10014": "ไม่สามารถหยุด VM[uuid:%s name:%s] บนโฮสต์ kvm[uuid:%s ip:%s] เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10015": "", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10012": "โฮสต์[uuid:%s] ไม่มีความจุเพียงพอสำหรับการจัดสรร CPU[%s] และหน่วยความจำ[%s bytes]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10010": "", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10013": "ช่วงพอร์ต VIP [vipStartPort:%s, vipEndPort:%s] ทับซ้อนกับกฎเครือข่าย [uuid:%s, vipStartPort:%s, vipEndPort:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10010": "", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10028": "ไม่สามารถแนบไดรฟ์ข้อมูล[uuid:%s, installPath:%s] กับ VM[uuid:%s, name:%s] บนโฮสต์ KVM[uuid:%s, ip:%s] เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10013": "", + "ORG_ZSTACK_MEVOCO_10097": "CIDR ไม่ถูกต้อง[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10067": "", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10014": "CIDR ไม่ถูกต้อง[%s] รองรับเฉพาะที่อยู่ IPv4 เท่านั้น", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10029": "", + "ORG_ZSTACK_MEVOCO_10096": "ไม่สามารถสร้างกฎการส่งต่อพอร์ตได้ เนื่องจากช่วงพอร์ต VIP [vipStartPort:%s, vipEndPort:%s] ไม่สอดคล้องกับช่วงพอร์ตส่วนตัว [privateStartPort:%s, privateEndPort:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10066": "", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10026": "ไม่พบ SCSI LUN สำหรับรายการวอลุม:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10011": "", + "ORG_ZSTACK_MEVOCO_10095": "สำหรับการส่งต่อพอร์ตแบบช่วง ขนาดช่วงพอร์ตต้องตรงกัน ขนาดของช่วง VIP [%s, %s] ไม่ตรงกับขนาดของ [%s, %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10065": "", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10027": "เครือข่าย l3 ของแขก VM NIC และเครือข่าย l3 VIP ของกฎการส่งต่อพอร์ตเป็นเครือข่ายเดียวกัน (uuid: %s, uuid: %s)", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10012": "", + "ORG_ZSTACK_MEVOCO_10094": "ไม่สามารถรับ fabric จาก SDN controller [ip:%s] ได้", + "ORG_ZSTACK_STORAGE_BACKUP_10064": "", + "ORG_ZSTACK_STORAGE_BACKUP_10063": "สแนปช็อตต้นทางสำหรับการสำรองข้อมูล[uuid:%s]ถูกลบแล้ว ไม่สามารถย้อนกลับวอลุมได้", + "ORG_ZSTACK_MEVOCO_10099": "บัญชีที่ไม่ใช่ผู้ดูแลระบบได้รับอนุญาตให้ตั้งค่าขีดจำกัด %s รวมสำหรับทรัพยากรเสมือนเท่านั้น", + "ORG_ZSTACK_STORAGE_BACKUP_10061": "การสำรองข้อมูลวอลุม[uuid:%s]อยู่ในสถานะ %s และไม่สามารถใช้สำหรับการกู้คืนวอลุมได้", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10016": "primaryStorageUuid เป็นสิ่งจำเป็นเมื่อดาวน์โหลดแคชรูปภาพ", + "ORG_ZSTACK_MEVOCO_10098": "ไม่รู้จักประเภทขีดจำกัด Quality of Service (QoS) ที่ระบุ โปรดตรวจสอบว่าประเภทขีดจำกัด QoS ถูกกำหนดค่าอย่างถูกต้อง", + "ORG_ZSTACK_STORAGE_BACKUP_10060": "ไม่สามารถสร้าง VM จากการสำรองข้อมูลวอลุม[uuid:%s]ซึ่งไม่ใช่การสำรองข้อมูลวอลุมรูท", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10017": "VM มีวอลุมเฉพาะท้องถิ่นหลายตัวบนโฮสต์ต่างกัน [%s] โปรดตรวจสอบวอลุมเฉพาะท้องถิ่นของ VM ที่ผิดปกติ", + "ORG_ZSTACK_STORAGE_CEPH_10004": "URL การตรวจสอบไม่ถูกต้อง[%s] ชื่อโฮสต์ไม่สามารถเป็นค่าว่างได้ รูปแบบ URL การตรวจสอบที่ถูกต้องคือ %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10032": "get iMaster Logical Switch [%s] ไม่มีการตอบกลับ", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10018": "วอลุมบนโฮสต์ [Host UUID: %s] ไม่สามารถแนบไปยัง VM ได้เนื่องจาก VM มีวอลุมเฉพาะท้องถิ่นบนโฮสต์อื่น [Host UUID: %s]", + "ORG_ZSTACK_STORAGE_CEPH_10005": "URL การตรวจสอบไม่ถูกต้อง[%s] พอร์ต SSH อยู่นอกช่วงที่ถูกต้อง (1-65535) URL การตรวจสอบที่ถูกต้องควรอยู่ในรูปแบบ %s", + "ORG_ZSTACK_STORAGE_CEPH_10002": "URL การตรวจสอบไม่ถูกต้อง[%s] ส่วนประกอบ SSH username:SSH password ไม่ถูกต้อง รูปแบบ URL การตรวจสอบที่ถูกต้องคือ %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10030": "สร้าง Huawei iMaster Logical Switch [%s] ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_STORAGE_CEPH_10003": "URL การตรวจสอบไม่ถูกต้อง[%s] SSH username และ password ต้องคั่นด้วย ':' และไม่สามารถเป็นค่าว่างได้ รูปแบบ URL การตรวจสอบที่ถูกต้องคือ %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10035": "[%s] Huawei iMaster Virtual Switch Port [%s] ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10013": "คลัสเตอร์สองคลัสเตอร์ที่มี UUID %s และ %s ไม่สามารถสื่อสารภายในเครือข่าย L2 ได้เมื่อย้าย VM ที่มี UUID %s ไปยังคลัสเตอร์อื่น", + "ORG_ZSTACK_STORAGE_CEPH_10008": "Ceph pool ที่มี UUID:%s มีอยู่แล้วและถูกใช้งานที่อื่นในสภาพแวดล้อม ZStack ดังนั้นจึงไม่สามารถนำกลับมาใช้ใหม่ได้", + "ORG_ZSTACK_STORAGE_BACKUP_10038": "url ไม่ถูกต้อง[%s] ควรอยู่ในรูปแบบ hostname:/path", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10036": "get ข้อมูลพอร์ต logical switch สำหรับ logical switch[%s] ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10014": "URL[%s] ไม่ใช่เส้นทางแน่นอนที่ถูกต้องที่เริ่มต้นด้วย '/' โปรดตรวจสอบว่าเริ่มต้นด้วย 'http://' หรือ 'https://'", + "ORG_ZSTACK_STORAGE_CEPH_10009": "ไม่สามารถเพิ่ม Ceph primary storage ได้เนื่องจากปัจจุบันถูกใช้งานโดย MON hosts [%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10037": "ประเภทการ mount ไม่ถูกต้อง[%s] ควรเป็น [NFS, SSHFS, NBD]", + "ORG_ZSTACK_STORAGE_CEPH_10006": "ความล้มเหลวของการดำเนินการ: ชื่อ pool ไม่สามารถรวมอักขระ ASCII ที่พิมพ์ไม่ได้ [poolName:%s]", + "ORG_ZSTACK_KVM_10080": "เมื่อแพลตฟอร์ม VM เป็น Other จำนวน dataVolumes และ cdroms ไม่สามารถเกิน 3 ได้ ปัจจุบันคือ %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10033": "ลบ Huawei iMaster Virtual Switch [%s] ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_STORAGE_BACKUP_10036": "ระดับ [%s] ควรเป็นค่าจำนวนเต็มบวก", + "ORG_ZSTACK_STORAGE_CEPH_10007": "ความล้มเหลวในการสร้าง ชื่อ pool ซ้ำ[%s] มี pool ที่มีชื่อเดียวกันอยู่แล้ว[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10016": "โฮสต์ของเครื่องเสมือน [hostUuid:%s] แตกต่างจากวอลุม [hostUuid:%s] วอลุมไม่สามารถแนบไปยังเครื่องเสมือนได้", + "ORG_ZSTACK_STORAGE_BACKUP_10035": "[%s] ไม่ใช่ CIDR มาตรฐาน หมายถึง [%s] ใช่ไหม?", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10034": "อัปเดต Huawei iMaster Logical Switch [%s] ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10010": "โวลุมที่มี UUID [%s] เป็นโวลุมรูทของ VM ที่มี UUID [%s] ปัจจุบัน VM ยังมีโวลุมข้อมูล %s ตัวติดอยู่ กรุณาถอดออกก่อนการย้าย", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10011": "โวลุม [UUID:%s] เป็นโวลุมรูทของ VM [UUID:%s] ปัจจุบันเครื่องเสมือนยังมี ISO ติดอยู่ กรุณาถอดออกก่อนการย้าย", + "ORG_ZSTACK_KVM_10088": "ไม่สามารถตรวจสอบอินเทอร์เฟซเครือข่ายฟิสิคัล[ชื่อ: %s] บน KVM host[UUID:%s, IP:%s]", + "ORG_ZSTACK_KVM_10079": "Host[%s] การอัปเดตการกำหนดค่าช่อง Spice ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10021": "โวลุม: %s ไม่ได้ติดตั้ง ไม่สามารถสร้างแคชรูปภาพสำหรับโวลุม", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10024": "ไม่พบเส้นทางการติดตั้งสำหรับดาวน์โหลดโวลุม: %s กรุณาเตรียมให้พร้อมก่อนดำเนินการ", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10039": "ลบ Huawei iMaster NCE Logical Router[%s] ล้มเหลว เนื่องจาก %s", + "ORG_ZSTACK_MEVOCO_10064": "networkInboundBandwidthFormatError %s", + "ORG_ZSTACK_STORAGE_BACKUP_10034": "ไม่พบ Volume backup [uuid:%s] ในสื่อจัดเก็บข้อมูลใดๆ", + "ORG_ZSTACK_MEVOCO_10063": "แบนด์วิดท์อินบาวด์เครือข่ายเกินค่าสูงสุดที่อนุญาต 32 Gbps", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10025": "ไม่พบโฮสต์สำหรับดาวน์โหลดโวลุม %s", + "ORG_ZSTACK_STORAGE_BACKUP_10033": "ไม่มีสิทธิ์ในการสำรองข้อมูลโวลุมภายในกลุ่ม UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10022": "ไม่พบโฮสต์ปลายทางสำหรับโวลุม: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10037": "ลบ Huawei iMaster Virtual Switch Port [%s] ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_STORAGE_BACKUP_10032": "พบหลายดิสก์รูทภายในกลุ่ม uuid: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10023": "ไม่สามารถค้นหาโฮสต์สำหรับแมปโวลุม %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10038": "สร้าง Huawei iMaster Virtual Router[%s] ล้มเหลว เนื่องจาก %s", + "ORG_ZSTACK_MEVOCO_10061": "สถานะโหนดการจัดการไม่ใช่ %s", + "ORG_ZSTACK_STORAGE_BACKUP_10031": "โวลุมรูทหายไปภายในกลุ่ม UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10026": "ล้มเหลวในการเรียกดู host initiator reference กรุณาเชื่อมต่อโฮสต์นี้ใหม่: %s", + "ORG_ZSTACK_MEVOCO_10066": "networkOutboundBandwidthFormatError %s", + "ORG_ZSTACK_MEVOCO_10065": "แบนด์วิดท์เอาท์บาวด์เครือข่ายเกินค่าสูงสุด 32 Gbps", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10042": "สร้าง Huawei IMaster subnet[%s] ล้มเหลว เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10028": "ล้มเหลวในการดาวน์โหลดรูปภาพ[uuid:%s] ไปยังโฮสต์ทั้งหมดในที่จัดเก็บข้อมูลท้องถิ่น[uuid:%s] %s", + "ORG_ZSTACK_STORAGE_CEPH_10015": "monUrl[%s] ไม่ถูกต้อง URL ที่ถูกต้องควรอยู่ในรูปแบบ %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10043": "ลบ Huawei iMaster subnet[%s] ล้มเหลว เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_CEPH_10016": "dataVolumePoolName สามารถเป็น null ได้แต่ต้องไม่เป็นสตริงว่าง", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10040": "สร้าง Huawei iMaster virtual network link[%s] ล้มเหลว เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10041": "ลบ Huawei iMaster virtual network link[%s] ล้มเหลว เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_CEPH_10019": "ไม่สามารถเพิ่ม Ceph backup storage เนื่องจากมี Ceph backup storage ที่ใช้ mon[hostnames:%s] อยู่แล้ว", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10046": "ไม่ได้สร้างอินเทอร์เฟซเครือข่ายเสมือนใหม่ ซึ่งไม่ควรเกิดขึ้น", + "ORG_ZSTACK_MEVOCO_10082": "ล้มเหลวในการตั้งค่า I/O thread [%d] pin [%s] บนเครื่องเสมือน [%s]: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10049": "ล้มเหลวในการสร้างสำรองข้อมูลวอลุมสำหรับวอลุม[uuid:%s] เนื่องจากวอลุมที่แนบอยู่ไม่อยู่ในสถานะ[%s, %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10025": "พื้นที่จัดเก็บหลัก [UUID:%s] ถูกปิดใช้งาน ไม่อนุญาตให้ย้ายข้อมูลแบบ cold migration", + "ORG_ZSTACK_STORAGE_BACKUP_10048": "ล้มเหลวในการสร้างสำรองข้อมูลวอลุมสำหรับวอลุม[uuid:%s] เนื่องจากเครื่องเสมือนไม่อยู่ในสถานะ[%s, %s]", + "ORG_ZSTACK_STORAGE_CEPH_10017": "rootVolumePoolName สามารถเป็น null ได้ แต่ต้องไม่เป็นสตริงว่างเปล่า", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10026": "วอลุม[uuid:%s] ไม่ได้แนบอยู่กับพื้นที่จัดเก็บในเครื่องอีกต่อไป อาจถูกลบหรือถอดการเชื่อมต่อแล้ว", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10044": "ล้มเหลวในการรับข้อมูลระบบของ SDN controller [IP:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10047": "ล้มเหลวในการสร้างสำรองข้อมูลวอลุมสำหรับวอลุม[uuid:%s] เนื่องจากไม่ได้แนบอยู่กับเครื่องเสมือนใด", + "ORG_ZSTACK_STORAGE_CEPH_10018": "imageCachePoolName สามารถเป็น null ได้ แต่ต้องไม่เป็นสตริงว่างเปล่า", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10045": "ล้มเหลวในการรับข้อมูลระบบของ SDN controller [IP:%s] เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_BACKUP_10046": "ไม่สามารถสร้างสำรองข้อมูลวอลุมสำหรับวอลุมที่แชร์ได้[uuid:%s]", + "ORG_ZSTACK_KVM_10093": "ไม่สามารถเชื่อมต่อกับ KVM host[uuid:%s, ip:%s, url:%s] เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10022": "เพื่อสร้างวอลุมบนพื้นที่จัดเก็บหลักในเครื่อง คุณต้องระบุ host ที่จะสร้างวอลุมโดยใช้ system tag [%s]", + "ORG_ZSTACK_KVM_10096": "host ไม่สามารถเข้าถึงพื้นที่จัดเก็บหลักใดได้ โปรดตรวจสอบการกำหนดค่าพื้นที่จัดเก็บหรือติดต่อฝ่ายสนับสนุนเพื่อขอความช่วยเหลือ %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10023": "รูปแบบ URI ไม่ถูกต้อง ตัวอย่างที่ถูกต้องรวมถึง file://$URL, hostUuid://$HOSTUUID, หรือ volume://$VOLUMEUUID", + "ORG_ZSTACK_STORAGE_CEPH_10012": "ไม่สามารถเพิ่มโหนด Mono เดียวกันได้หลายครั้ง", + "ORG_ZSTACK_KVM_10099": "SSH port[%s] ของ host[%s] ไม่สามารถเข้าถึงได้หลังจาก %s วินาที, หมดเวลาการเชื่อมต่อ", + "ORG_ZSTACK_STORAGE_CEPH_10010": "ไม่สามารถเพิ่ม host [%s] เดียวกันเข้าไปใน cluster mons ได้", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10031": "การสำรองข้อมูล snapshots ไปยัง backup storage เป็นฟีเจอร์ที่เลิกใช้แล้วและไม่รองรับบน block primary storage", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10032": "ล้มเหลวในการค้นหา cluster สำหรับ commit volume บน ps:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10035": "primary storage UUID เป็นข้อบังคับเมื่อลบ LUN", + "ORG_ZSTACK_MEVOCO_10075": "ดิสก์ที่แชร์ได้ในปัจจุบันรองรับเฉพาะประเภท virtio-scsi", + "ORG_ZSTACK_STORAGE_BACKUP_10045": "ตรวจพบ backup storage ที่ไม่คาดคิด[type:%s,uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10036": "host UUID เป็นข้อบังคับเมื่อดึงชื่อ host initiator", + "ORG_ZSTACK_MEVOCO_10074": "Volume ที่แชร์ได้[uuid:%s] ได้ถูกแนบอยู่กับ Virtual Machine[uuid:%s] แล้ว", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10048": "ไม่ได้สร้างอินเทอร์เฟซเครือข่ายเสมือนใหม่ ไม่ควรเกิดขึ้น", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10033": "ล้มเหลวในการค้นหา host สำหรับ commit volume:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10034": "ล้มเหลวในการดาวน์โหลด[%s] จาก Backup Storage[hostname:%s] ไปยัง Block Primary Storage[uuid:%s, path:%s], %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10049": "ไม่มี SDN fabric ที่กำหนดค่าบน controller [ip:%s]", + "ORG_ZSTACK_MEVOCO_10078": "เวอร์ชันไลเซนส์ปัจจุบันไม่รองรับการแก้ไขการกำหนดค่าทรัพยากรนี้ [name:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10037": "initiatorName %s กำลังถูกใช้งานโดยโฮสต์อื่น โปรดสร้าง initiator ใหม่สำหรับโฮสต์ %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10038": "ไม่สามารถค้นหา volume template ตามชื่อ:%s", + "ORG_ZSTACK_MEVOCO_10076": "shareable volume(s) [UUID: %s] ถูกแนบแล้ว; group snapshot ไม่รองรับ", + "ORG_ZSTACK_AI_MESSAGE_10002": "ไม่สามารถยกเลิกงานสร้าง dataset ได้เนื่องจาก resource UUID[%s] หรือ model center UUID[%s] เป็น null", + "ORG_ZSTACK_AI_MESSAGE_10001": "ไม่สามารถยกเลิกงาน download ของ model service ได้เนื่องจาก resource UUID[%s] หรือ model center UUID[%s] เป็น null", + "ORG_ZSTACK_IPSEC_VYOS_10009": "การ apply ไปยัง HA group ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10013": "ไม่สามารถทำ HTTP calls ไปยัง Prometheus instances ทั้งหมดใน cloud environment ได้", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10012": "unknown data type %s สำหรับ key = %s", + "ORG_ZSTACK_ENCRYPT_10000": "failed to parse API message: cannot parse encryption parameter with type %s", + "ORG_ZSTACK_ENCRYPT_10002": "failed to parse API message: found %d encryption parameters system tags, expect 1", + "ORG_ZSTACK_IPSEC_VYOS_10001": "VYOS ไม่รองรับ AES-192 เป็น IKE Encryption Algorithm; ตัวเลือกที่มีให้คือ AES-128 และ AES-256", + "ORG_ZSTACK_IPSEC_VYOS_10000": "remote CIDR [%s] ทับซ้อนกับ Virtual Router interface CIDR [%s]", + "ORG_ZSTACK_IPSEC_VYOS_10003": "vyos ไม่รองรับ %d เป็น IKE DH Group", + "ORG_ZSTACK_IPSEC_VYOS_10002": "vyOS ไม่รองรับ AES-192 เป็น PolicyEncryptionAlgorithm; ตัวเลือกที่มีให้คือ AES-128 และ AES-256 รวมถึง 3DES", + "ORG_ZSTACK_COMPUTE_VM_10000": "state ของ VM[uuid:%s] ไม่อยู่ใน Running state; ดังนั้นการซิงโครไนซ์ clock ไม่สามารถทำได้", + "ORG_ZSTACK_COMPUTE_VM_10008": "vm[uuid:%s] เป็นส่วนหนึ่งของ cluster[uuid:%s] แต่ไม่มี hosts ที่พร้อมใช้งานใน cluster ดังนั้นการเปลี่ยน image สำหรับ vm นี้ไม่สามารถดำเนินการได้", + "ORG_ZSTACK_COMPUTE_VM_10007": "vm[uuid:%s] cluster UUID เป็น null, ไม่สามารถเปลี่ยน image สำหรับมันได้", + "ORG_ZSTACK_COMPUTE_VM_10006": "state ของ VM ไม่ใช่ Stopped: %s. การดำเนินการ 'changevmimage' ไม่สามารถทำได้", + "ORG_ZSTACK_COMPUTE_VM_10005": "xml hook ที่มี UUID: %s แนบกับ VM ที่มี UUID: %s สำเร็จแล้ว แต่ไม่สามารถ restart VM ได้ รายละเอียด: %s", + "ORG_ZSTACK_COMPUTE_VM_10004": "xml hook ที่มี UUID: %s ถูกแยกออกจาก VM ที่มี UUID: %s สำเร็จแล้ว แต่พบปัญหาระหว่างการ restart VM รายละเอียด: %s", + "ORG_ZSTACK_COMPUTE_VM_10003": "Hot-adding ไม่ได้ถูกปิดใช้งาน; โปรดตรวจสอบว่าการกำหนดค่า NUMA ถูกตั้งค่าก่อนเปิด virtual machine", + "ORG_ZSTACK_COMPUTE_VM_10011": "พารามิเตอร์ direction ต้องถูกตั้งค่าเป็น IN หรือ OUT", + "ORG_ZSTACK_COMPUTE_VM_10010": "ไม่พบ backup storage, ไม่สามารถ commit volume snapshot[psUuid:%s] เป็น image ได้, destination required PS UUID:%s", + "ORG_ZSTACK_COMPUTE_VM_10018": "การตรวจสอบ state ล้มเหลวระหว่างการดำเนินการเปลี่ยนรหัสผ่าน.%s", + "ORG_ZSTACK_COMPUTE_VM_10017": "ไม่พบ destination host ใน database โดย UUID: %s, ไม่สามารถส่งคำสั่งเปลี่ยนรหัสผ่านไปยัง host ได้!", + "ORG_ZSTACK_STORAGE_DEVICE_10036": "hba scan ล้มเหลว: %s", + "ORG_ZSTACK_COMPUTE_VM_10015": "vm [%s] มี host UUID เป็น null, ไม่สามารถซิงโครไนซ์ network quality of service ได้", + "ORG_ZSTACK_COMPUTE_VM_10014": "vm [%s] ต้องอยู่ใน state Running หรือ Paused เพื่อซิงโครไนซ์ NIC QoS settings", + "ORG_ZSTACK_STORAGE_DEVICE_10031": "vm instance[uuid: %s] host[uuid: %s] ไม่สามารถ attach scsi lun[uuid: %s] ได้", + "ORG_ZSTACK_COMPUTE_VM_10013": "outboundBandwidth ต้องตั้งค่าไม่เกิน %s", + "ORG_ZSTACK_COMPUTE_VM_10012": "inboundBandwidth ต้องตั้งค่าไม่เกิน %s Gbps", + "ORG_ZSTACK_STORAGE_DEVICE_10030": "vm instance[%s] สถานะ [%s] ไม่อยู่ในสถานะที่อนุญาตสำหรับการดำเนินการที่ระบุ[%s]", + "ORG_ZSTACK_COMPUTE_VM_10022": "ไม่สามารถตั้งค่าระดับความปลอดภัยได้เนื่องจากฟีเจอร์ความปลอดภัยถูกปิดใช้งาน โปรดตรวจสอบให้แน่ใจว่าฟีเจอร์ความปลอดภัยถูกเปิดใช้งานก่อนทำการกำหนดค่านี้", + "ORG_ZSTACK_COMPUTE_VM_10020": "จำนวน data volumes เกินขีดจำกัดที่ระบุ [num: %s] โปรดลดจำนวน data volumes ลงเมื่อสร้าง virtual machine", + "ORG_ZSTACK_STORAGE_DEVICE_10028": "SCSI LUN ที่ระบุ [WWID: %s] ไม่มีอยู่หรือถูกปิดใช้งาน", + "ORG_ZSTACK_STORAGE_DEVICE_10029": "scsi[%s] lun[wwid:%s] ถูก attach ไปยัง vm[%s] แล้ว", + "ORG_ZSTACK_STORAGE_DEVICE_10026": "พบการกำหนดค่า iSCSI ที่แตกต่างกันบน host [UUID:%s, targets:%s] และ host [UUID:%s, targets:%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10027": "พบประเภท disk ที่แตกต่างกันข้าม hosts สำหรับ LUN [serial:%s] ไม่สามารถ attach ไปยัง cluster ได้", + "ORG_ZSTACK_COMPUTE_VM_10029": "ไม่สามารถ clone VM ได้เนื่องจากมีการระบุ prefix สำหรับ network[uuid:%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10024": "ไม่พบบันทึก SCSI LUN [%(s)s] บน host [%(s)s]", + "ORG_ZSTACK_COMPUTE_VM_10028": "ไม่สามารถ clone vm ได้เนื่องจาก IPv6 address[%s] ไม่ถูกต้อง", + "ORG_ZSTACK_STORAGE_DEVICE_10025": "hypervisor type[%s] ที่ไม่คาดคิดสำหรับ virtual machine host [%s]", + "ORG_ZSTACK_COMPUTE_VM_10027": "ไม่สามารถ clone VM ได้เนื่องจากมีการระบุ netmask สำหรับ network[uuid:%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10022": "พบ NVMe targets ที่แตกต่างกันบน host[hostUuid:%s, targets:%s] และ host[hostUuid:%s, targets:%s]", + "ORG_ZSTACK_COMPUTE_VM_10026": "ไม่สามารถ clone vm ได้เนื่องจาก IP address ที่ระบุ[%s] ไม่ถูกต้อง", + "ORG_ZSTACK_STORAGE_DEVICE_10023": "SCSI LUN[%s] ถูก attach ไปยัง virtual machine [%s] แล้ว", + "ORG_ZSTACK_COMPUTE_VM_10025": "ไม่สามารถ clone VM ได้เนื่องจาก Layer 3 network[uuid:%s] ไม่พบ", + "ORG_ZSTACK_STORAGE_DEVICE_10020": "vm instance[%s] สถานะ[%s] ไม่อยู่ในสถานะที่อนุญาตสำหรับการดำเนินการ[%s]", + "ORG_ZSTACK_COMPUTE_VM_10024": "รหัสระดับความปลอดภัยที่ไม่รู้จัก[%s] ค่าที่รองรับคือ [0-7]", + "ORG_ZSTACK_STORAGE_DEVICE_10021": "vm instance[%s] ไม่สามารถ attach scsi lun[uuid: %s] บน host[uuid: %s] ได้", + "ORG_ZSTACK_COMPUTE_VM_10023": "ไม่สามารถตั้งค่าระดับความปลอดภัยสำหรับ VM ที่ไม่ได้เปิดใช้งาน [uuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10002": "Primary storage %s ปัจจุบันไม่มี third-party token กำหนดค่า จึงไม่สามารถสร้าง block volume ได้ชั่วคราว", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10001": "จัดสรร virtual resource URL ที่ไม่ถูกต้อง:%s", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10000": "การจัดสรร URL ล้มเหลว โปรดตรวจสอบให้แน่ใจว่า URL ถูกต้องและพร้อมใช้งาน หากปัญหายังคงอยู่ โปรดติดต่อฝ่ายสนับสนุนเพื่อขอความช่วยเหลือเพิ่มเติม", + "ORG_ZSTACK_STORAGE_DEVICE_10017": "scsi lun[wwid:%s] ถูก attach ไปยัง vm[%s] แล้ว", + "ORG_ZSTACK_STORAGE_DEVICE_10015": "scisLun[uuids:%s] ไม่ได้ attach กับ cluster ของ host[uuid:%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10016": "โปรด unmount block devices ทั้งหมดที่เกี่ยวข้องกับ VM[%s] แล้วลองใหม่", + "ORG_ZSTACK_STORAGE_DEVICE_10014": "scsi lun[wwid: %s] ถูก attach ไปยัง virtual machine instance %s แล้ว", + "ORG_ZSTACK_STORAGE_DEVICE_10011": "iSCSI server [UUID: %s] ไม่ได้เชื่อมโยงกับ cluster [UUID: %s]", + "ORG_ZSTACK_STORAGE_DEVICE_10012": "เซิร์ฟเวอร์ iSCSI [UUID: %s] ยังคงเชื่อมโยงกับคลัสเตอร์ [UUID: %s] อยู่", + "ORG_ZSTACK_STORAGE_DEVICE_10010": "เซิร์ฟเวอร์ iSCSI [UUID: %s] แนบอยู่กับคลัสเตอร์ [UUID: %s] แล้ว", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10008": "CIDR ท้องถิ่น และ CIDR ระยะไกลต้องเป็นช่วง Cidr ที่ถูกต้อง!", + "ORG_ZSTACK_NETWORK_SERVICE_HEADER_NFVINSTGROUP_10000": "การสอบถามสถานะคลัสเตอร์ไม่รองรับสำหรับประเภทอินสแตนซ์ NFV นี้", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10001": "VPN Gateway [%s] มีอยู่ ไม่สามารถลบจากระยะไกลได้", + "ORG_ZSTACK_STORAGE_DEVICE_10008": "เซิร์ฟเวอร์ iSCSI [IP: %s, Port: %s] มีอยู่แล้ว", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10005": "%s ไม่ใช่ที่อยู่ IPv4 ที่ถูกต้องสำหรับการกำหนดค่าการปรับใช้คลาวด์", + "ORG_ZSTACK_STORAGE_DEVICE_10009": "IP ของเซิร์ฟเวอร์ iSCSI: %s ไม่ถูกต้อง", + "ORG_ZSTACK_STORAGE_DEVICE_10006": "NVMe server ที่มี UUID: %s แนบอยู่กับคลัสเตอร์ที่มี UUID: %s แล้ว", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10007": "CIDR ระยะไกลต้องเป็นสัญลักษณ์ CIDR ที่ถูกต้อง!", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10006": "localCidr ต้องเป็น Cidr ที่ถูกต้อง!", + "ORG_ZSTACK_STORAGE_DEVICE_10004": "NVMe server [ip: %s, port: %s, transport: %s] มีอยู่ในสภาพแวดล้อมคลาวด์แล้ว", + "ORG_ZSTACK_STORAGE_DEVICE_10005": "IP ของ NVMe server: %s ไม่ถูกต้อง", + "ORG_ZSTACK_STORAGE_DEVICE_10003": "ไม่รองรับการย้าย VM[uuid:%s] พร้อมที่จัดเก็บข้อมูลแบบแชร์", + "ORG_ZSTACK_STORAGE_DEVICE_10000": "scsi lun ที่มี uuid: %s และ uuid: %s ไม่ได้ใช้โฮสต์ร่วมกัน", + "ORG_ZSTACK_STORAGE_DEVICE_10001": "scsi lun [uuid: %s] อยู่ในสถานะปิดใช้งาน", + "ORG_ZSTACK_ALIYUN_NETWORK_VPN_10000": "VPN gateway และ user gateway ต้องอยู่ใน data center เดียวกัน", + "ORG_ZSTACK_IPSEC_VYOS_10016": "สร้าง ipsec ไปยัง ha route ล้มเหลวเพราะ %s", + "ORG_ZSTACK_IPSEC_VYOS_10015": "ลบ ipsec จาก ha group ล้มเหลวเพราะ %s", + "ORG_ZSTACK_COMPUTE_BONDING_10001": "สร้าง interface บน host แล้ว", + "ORG_ZSTACK_COMPUTE_BONDING_10008": "การ์ด bonding ไม่สามารถมี interfaces ใน bond ที่มีความเร็วต่างกันบน host[%s] ได้", + "ORG_ZSTACK_COMPUTE_BONDING_10007": "ไม่สามารถมี interface[%s] ใน bond ที่ถูกทำ SRIOV virtualize ได้", + "ORG_ZSTACK_COMPUTE_BONDING_10006": "ไม่สามารถมี interfaces ใน bond ที่ถูกใช้เป็น network bridge ซึ่ง host[%s] ใช้อยู่แล้ว", + "ORG_ZSTACK_COMPUTE_BONDING_10005": "ไม่สามารถมี occupied interfaces ใน bond ที่ host[%s] ใช้อยู่แล้วได้", + "ORG_ZSTACK_IPSEC_VYOS_10012": "อัปเดต ipsec version ล้มเหลวเพราะ:vpc[%s] ไม่มีอยู่", + "ORG_ZSTACK_COMPUTE_BONDING_10009": "ไม่มี slave network interface บน host[uuid:%s]", + "ORG_ZSTACK_IPSEC_VYOS_10013": "sync ไปยัง HA group ล้มเหลวเพราะ:%s", + "ORG_ZSTACK_MEVOCO_10105": "บัญชีที่ไม่ใช่ผู้ดูแลระบบไม่สามารถตั้งค่าขีดจำกัด %s สำหรับอ่าน/เขียน เกินกว่า: %s/%s", + "ORG_ZSTACK_SIMULATOR_10002": "Instance ถูกตั้งค่าเป็นสถานะตัดการเชื่อมต่อ", + "ORG_ZSTACK_MEVOCO_10104": "บัญชีที่ไม่ใช่ผู้ดูแลระบบไม่สามารถตั้งค่า [storage limit] สำหรับเขียนเป็นไม่จำกัดได้", + "ORG_ZSTACK_MEVOCO_10103": "บัญชีที่ไม่ใช่ผู้ดูแลระบบไม่สามารถตั้งค่าขีดจำกัด I/O สำหรับการอ่านเป็นไม่จำกัดได้", + "ORG_ZSTACK_MEVOCO_10102": "บัญชีที่ไม่ใช่ผู้ดูแลระบบได้รับอนุญาตให้กำหนดค่าขีดจำกัดการอ่าน/เขียน %s เท่านั้น", + "ORG_ZSTACK_MEVOCO_10109": "host UUID ของ vm [%s] เป็นค่าว่าง ไม่สามารถซิงค์คุณภาพการให้บริการของ volume ได้", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10016": "การทดสอบการเชื่อมต่อ FiSecClientFactory ล้มเหลว", + "ORG_ZSTACK_MEVOCO_10108": "vm [%s] ต้องอยู่ในสถานะ Running หรือ Paused จึงจะสามารถซิงค์คุณภาพการให้บริการของ volume ได้", + "ORG_ZSTACK_MEVOCO_10107": "volume [%s] ไม่ได้แนบกับ virtual machine ใด (หรือ virtual machine ไม่มีอยู่) ไม่สามารถซิงค์คุณภาพการให้บริการของ volume ได้", + "ORG_ZSTACK_SIMULATOR_10004": "ข้อผิดพลาด \"on purpose\" หมายถึงการกระทำที่ตั้งใจมากกว่าความล้มเหลวของระบบ โปรดให้รายละเอียดเพิ่มเติมเกี่ยวกับวัตถุประสงค์ที่ตั้งใจเพื่อดำเนินการต่อไป", + "ORG_ZSTACK_MEVOCO_10106": "volume [%s] ไม่ได้แนบกับ virtual machine ใด ดังนั้นจึงไม่สามารถดึงคุณภาพการให้บริการ (QoS) ผ่าน forceSync ได้", + "ORG_ZSTACK_MEVOCO_10101": "บัญชีที่ไม่ใช่ผู้ดูแลระบบไม่สามารถตั้งค่าขีดจำกัด %s รวมให้มากกว่า: %s ได้", + "ORG_ZSTACK_MEVOCO_10100": "บัญชีที่ไม่ใช่ผู้ดูแลระบบไม่สามารถตั้งค่าขีดจำกัด %s รวมเป็นอนันต์ได้", + "ORG_ZSTACK_COMPUTE_BONDING_10011": "ไม่สามารถ bind กับ interface ที่กำหนดค่าด้วย VTEP IP address โปรดตรวจสอบให้แน่ใจว่า VTEP IP กำหนดค่าถูกต้องและสามารถเข้าถึงได้", + "ORG_ZSTACK_COMPUTE_BONDING_10010": "ไม่สามารถ bind กับ interface ที่ตรงกับ management network โปรดตรวจสอบให้แน่ใจว่า virtual network interface กำหนดค่าถูกต้องและตรงกับ management network ที่ระบุ %s", + "ORG_ZSTACK_COMPUTE_BONDING_10015": "การ์ด bonding ไม่สามารถมี interface[%s] ที่ถูก SR-IOV virtualize ได้", + "ORG_ZSTACK_COMPUTE_BONDING_10014": "การ์ด bonding ไม่สามารถมี interface ที่ถูกใช้เป็น network bridge ซึ่งถูกใช้งานโดย host[%s] อยู่แล้ว", + "ORG_ZSTACK_COMPUTE_BONDING_10013": "การ์ด bonding ไม่สามารถมี interface ที่ถูกใช้งานอยู่ซึ่งถูกใช้งานโดย host[%s] อยู่แล้ว", + "ORG_ZSTACK_COMPUTE_BONDING_10012": "ไม่สามารถมี interface ใน bond ที่อยู่คนละ host[%s] ได้", + "ORG_ZSTACK_COMPUTE_BONDING_10019": "[bonding] ไม่สามารถมี [%s] interface ต้องอยู่ระหว่าง 1 ถึง 2", + "ORG_ZSTACK_COMPUTE_BONDING_10018": "[การ์ด bonding] ไม่สามารถมี [จำนวน interface] ตั้งค่าเป็น [%s] ต้องเป็นตัวเลขระหว่าง [1~8]", + "ORG_ZSTACK_COMPUTE_BONDING_10017": "[%s] bonding interface ไม่สามารถระบุ xmit_hash_policy ที่แตกต่างกันได้ มีเพียง mode 802.3ad เท่านั้นที่รองรับการระบุ policy ที่แตกต่าง", + "ORG_ZSTACK_COMPUTE_BONDING_10016": "การ์ด bonding ไม่สามารถมี interface ที่มีความเร็วแตกต่างกันบน host[%s]", + "ORG_ZSTACK_MEVOCO_10113": "Volume[UUID:%s] ใช้โปรโตคอล vhost-user ซึ่งไม่สามารถใช้งานร่วมกับ native asynchronous I/O ได้ โปรดปิดใช้งาน aio.native หรือเลือกโปรโตคอล volume อื่น", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10003": "ไม่สามารถเชื่อมต่อกับ secret resource pool[uuid: %s]", + "ORG_ZSTACK_MEVOCO_10112": "เวอร์ชันไลเซนส์ปัจจุบันไม่รองรับการแก้ไขการกำหนดค่าสากลนี้ [name:%s]", + "ORG_ZSTACK_MEVOCO_10111": "ไม่สามารถแยก shareable volume ออกจาก VMInstance: [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10005": "%s client initialization ล้มเหลว: คุณสมบัติ secret resource pool ไม่ถูกต้อง", + "ORG_ZSTACK_MEVOCO_10110": "ไม่สามารถแยก shareable volume[uuid:%s] ออกจาก Instance[uuid:%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10006": "Plugin (UUID: %s) ไม่สามารถลบได้เนื่องจากเชื่อมโยงกับ secret resource pools ต่อไปนี้: [%s]", + "ORG_ZSTACK_MEDIATOR_10005": "VIP [UUID:%s] ถูก bind กับ service อื่นอยู่แล้ว [%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10007": "organization ID[uuid:%s] มี operation attributes อยู่แล้ว ไม่สามารถเพิ่ม %s", + "ORG_ZSTACK_MEDIATOR_10006": "ช่วงพอร์ตปัจจุบัน [%s, %s] ขัดแย้งกับช่วงพอร์ตของ system service [%s, %s] สำหรับ VIP [UUID: %s] โปรโตคอล: %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10008": "ไม่พบโซนที่มี uuid:%s", + "ORG_ZSTACK_MEDIATOR_10007": "ช่วงพอร์ตปัจจุบัน [%s, %s] ขัดแย้งกับช่วงพอร์ตที่ใช้งานอยู่ [%s, %s] สำหรับ VIP [UUID: %s] โปรโตคอล: %s", + "ORG_ZSTACK_COMPUTE_VM_10080": "vm[uuid:%s] มีรหัสอุปกรณ์ CD-ROM ซ้ำกัน", + "ORG_ZSTACK_COMPUTE_VM_10077": "VM[uuid:%s] ได้ติดตั้ง ISO[uuid:%s] แล้ว", + "ORG_ZSTACK_COMPUTE_VM_10074": "หน่วยความจำสำรอง[%s] เกินขนาดหน่วยความจำที่มีอยู่[%s]", + "ORG_ZSTACK_COMPUTE_VM_10073": "การตั้งค่า CPU และหน่วยความจำไม่ถูกต้อง โปรดตรวจสอบว่าค่าที่ระบุสอดคล้องกับประเภทอินสแตนซ์และความต้องการของคุณ", + "ORG_ZSTACK_COMPUTE_VM_10071": "ไม่พบโฮสต์สำหรับ vm[uuid=%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10000": "รหัสเสมือน[uuid:%s] มีแอตทริบิวต์ที่เกี่ยวข้องกับการดูแลระบบอยู่แล้ว ดังนั้นจึงไม่สามารถกำหนด %s ได้", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10000": "โซนตัวตน[%s] มีอยู่แล้ว uuid: %s", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10001": "regionId: [%s] ไม่ใช่ Aliyun และ ZStack region ที่ถูกต้อง โปรดเลือกอันอื่น", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10002": "ประเภท [%s] ไม่ตรงกับประเภทศูนย์ข้อมูลที่คาดหวัง [%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10003": "โปรเจกต์[uuid:%s] มีผู้ดูแลโปรเจกต์ที่กำหนดไว้แล้ว", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10003": "ต้องระบุ UUID ของศูนย์ข้อมูลหรือ region ID โปรดตรวจสอบพารามิเตอร์", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10004": "โปรเจกต์[uuid:%s] ไม่มีอยู่", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10004": "โซนตัวตน [%s] กำลังซิงโครไนซ์อยู่ โปรดรอ", + "ORG_ZSTACK_COMPUTE_VM_10079": "ไม่มีช่วง IP ที่พร้อมใช้งานบนเครือข่าย L3 [%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10005": "รหัสเสมือน [UUID:%s] มีแอตทริบิวต์ผู้ดำเนินการโปรเจกต์ที่กำหนดไว้แล้ว", + "ORG_ZSTACK_COMPUTE_VM_10078": "CD-ROM ทั้งหมดของ VM[UUID:%s] ได้ติดตั้ง ISO images แล้ว", + "ORG_ZSTACK_COMPUTE_VM_10090": "สร้าง volume ไม่สำเร็จเนื่องจากโฮสต์ของ VM [UUID: %s] และ primary storage ที่จัดสรร [UUID: %s] ไม่ได้เชื่อมต่อกัน", + "ORG_ZSTACK_COMPUTE_VM_10088": "สถานะปัจจุบันของ vm[%s] การแก้ไข virtio ต้องการให้ vm อยู่ในสถานะ[%s]", + "ORG_ZSTACK_COMPUTE_VM_10084": "ไม่พบ ISO [UUID:%s] ใน backup storage ที่เชื่อมต่อใดๆ ที่เกี่ยวข้องกับโซน [UUID:%s] โปรดตรวจสอบดังนี้:", + "ORG_ZSTACK_COMPUTE_VM_10083": "1. ตรวจสอบว่า backup storage ติดตั้งอยู่ในโซนที่ถูกต้องที่ VM [NAME: %s, UUID:%s] ทำงานอยู่", + "ORG_ZSTACK_COMPUTE_VM_10081": "2. ยืนยันว่า backup storage อยู่ในสถานะพร้อมใช้งาน หากไม่ใช่ ให้ลองเชื่อมต่อใหม่", + "ORG_ZSTACK_KVM_HYPERVISOR_10000": "primary storage ที่ระบุไม่มีพร้อมใช้งานเลย", + "ORG_ZSTACK_COMPUTE_VM_10099": "การสร้างต้องพึ่งพาแคชรูปภาพ[uuid:%s, ตั้งอยู่ที่ ps uuids: [%s]] ไม่สามารถสร้างในที่อื่นได้", + "ORG_ZSTACK_COMPUTE_VM_10098": "รวบรวมข้อมูล virtualization ของโฮสต์ไม่สำเร็จ", + "ORG_ZSTACK_COMPUTE_VM_10097": "ไม่สามารถเปลี่ยนเป็นเครือข่าย L3 ได้ เครือข่าย L3 [uuid:%s] เป็นของเครือข่าย L2 [uuids:%s] ที่ไม่ได้ติดตั้งกับคลัสเตอร์ใด", + "ORG_ZSTACK_COMPUTE_VM_10096": "ไม่สามารถเปลี่ยนเป็นเครือข่าย L3 ได้ เครือข่าย L3 ที่ระบุ [uuid:%s] เป็นของเครือข่าย L2 ที่แตกต่าง [uuids:%s]", + "ORG_ZSTACK_COMPUTE_VM_10094": "ไม่สามารถเปลี่ยนเป็นเครือข่าย L3 ได้ เครือข่าย L3 ที่ระบุ [uuid:%s] ไม่มีการกำหนดค่าช่วง IP", + "ORG_ZSTACK_COMPUTE_VM_10093": "ไม่สามารถเปลี่ยนเป็นเครือข่าย L3 ได้ VM [uuid: %s] ไม่ได้อยู่ในสถานะ Running หรือ Stopped สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_COMPUTE_VM_10092": "ไม่สามารถจับภาพหน้าจอของ VM [uuid:%s] ที่ไม่ได้อยู่ในสถานะ Running ได้", + "ORG_ZSTACK_MEDIATOR_10002": "ไม่สามารถแนบเครือข่าย Layer 3 ได้ CIDR ของเครือข่าย L3 [%s] ที่จะแนบทับซ้อนกับ CIDR ของเครือข่าย L3 [%s] ที่แนบอยู่กับ VM อยู่แล้ว", + "ORG_ZSTACK_MEDIATOR_10003": "VM[name:%s, UUID:%s] มีกฎ port forwarding %s ที่กำหนดค่าไว้แล้ว", + "ORG_ZSTACK_MEDIATOR_10004": "VM[name:%s, uuid:%s] มี Elastic IP addresses %s ที่แนบอยู่แล้ว", + "ORG_ZSTACK_COMPUTE_VM_10033": "ไม่สามารถโคลน VM ได้เนื่องจากขนาดของ default L3 UUIDs ไม่เท่ากับ 1", + "ORG_ZSTACK_COMPUTE_VM_10032": "ไม่สามารถโคลน VM ได้เนื่องจากสถานะ [%s] ไม่ถูกต้อง", + "ORG_ZSTACK_COMPUTE_VM_10031": "ไม่สามารถโคลน VM ได้เนื่องจากประเภท driver [%s] ไม่ถูกต้อง", + "ORG_ZSTACK_COMPUTE_VM_10030": "ไม่สามารถโคลน VM ได้เนื่องจาก NicType [%s] ไม่ถูกต้อง", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10002": "พบเส้นทาง trash ที่เกี่ยวข้อง (%s) ใน Primary Storage [%s] สำหรับ installPath ของการย้าย [%s] กรุณาทำความสะอาดก่อนโดยใช้ 'APICleanUpTrashOnPrimaryStorageMsg' หากยังคงต้องการย้าย volume [%s]", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10000": "ไม่พบ host ที่เชื่อมต่อเพื่อดำเนินการย้ายข้อมูล storage กรุณาตรวจสอบว่า host เป้าหมายพร้อมใช้งานและกำหนดค่าอย่างถูกต้องในสภาพแวดล้อม cloud", + "ORG_ZSTACK_COMPUTE_VM_10039": "การดำเนินการนี้สามารถทำได้เฉพาะบน user VM instance เท่านั้น", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10003": "volume[uuid:%s] มีการพึ่งพา image[uuid:%s] การพึ่งพาอื่นๆ รวมถึง images[%s]", + "ORG_ZSTACK_COMPUTE_VM_10038": "network interface %s ไม่ได้แนบอยู่กับ VM", + "ORG_ZSTACK_COMPUTE_VM_10037": "ทรัพยากร capacity ไม่เพียงพอสำหรับการโคลน VM ไปยัง VM [UUID: %s], volumes [UUID: %s] บน primary storage [UUID: %s] capacity ที่ต้องการคือ %s bytes ในขณะที่ capacity ที่มีอยู่คือ %s bytes", + "ORG_ZSTACK_COMPUTE_VM_10036": "การสร้าง VM แบบ fast รองรับเฉพาะการโคลน data volume บน primary storage เดียวกัน [UUID: %s] กับ VM ต้นทาง [UUID: %s] เท่านั้น", + "ORG_ZSTACK_COMPUTE_VM_10035": "การสร้าง VM แบบ fast รองรับเฉพาะการโคลน root volume บน primary storage เดียวกัน [UUID: %s] กับ VM ต้นทาง [UUID: %s] เท่านั้น", + "ORG_ZSTACK_COMPUTE_VM_10034": "การดำเนินการนี้สามารถทำได้เฉพาะบน user VM instances เท่านั้น", + "ORG_ZSTACK_COMPUTE_CLUSTER_10005": "หากประเภท cluster เป็น baremetal ประเภท hypervisor ต้องเป็น baremetal ด้วย ในทางกลับกัน หากประเภท hypervisor เป็น baremetal ประเภท cluster ต้องเป็น baremetal", + "ORG_ZSTACK_COMPUTE_CLUSTER_10008": "มี hosts ใน cluster [uuid:%s] อยู่ในสถานะ Pre-Maintenance ดังนั้นจึงไม่สามารถอัปเดต OS ได้ในขณะนี้", + "ORG_ZSTACK_COMPUTE_CLUSTER_10009": "Hosts ทั้งหมดใน cluster [uuid:%s] ไม่ได้อยู่ในสถานะ Active ดังนั้นจึงไม่สามารถอัปเดตสิทธิ์ระบบปฏิบัติการของ cluster ได้ในขณะนี้", + "ORG_ZSTACK_COMPUTE_CLUSTER_10006": "สามารถอัปเดตระบบปฏิบัติการของ virtual machines ที่ใช้ KVM ได้เท่านั้นในขณะนี้", + "ORG_ZSTACK_COMPUTE_CLUSTER_10007": "Host [UUID: %s] ไม่ได้เป็นสมาชิกของ cluster [UUID: %s] กรุณาตรวจสอบ host UUID และยืนยันว่าอยู่ใน cluster นี้", + "ORG_ZSTACK_COMPUTE_VM_10044": "ห้ามแก้ไข VM image ขณะที่ไม่ได้อยู่ในสถานะ stopped", + "ORG_ZSTACK_COMPUTE_VM_10043": "ผู้ใช้ไม่มีสิทธิ์เปลี่ยน image ของ VM %s", + "ORG_ZSTACK_COMPUTE_VM_10042": "clean traffic ไม่รองรับสำหรับ VM type [%s]", + "ORG_ZSTACK_COMPUTE_VM_10041": "MAC address [%s] ซ้ำกัน", + "ORG_ZSTACK_COMPUTE_CLUSTER_10000": "การเข้าถึง memory ไม่ควรเป็น shared หาก huge pages ถูกปิดใช้งานใน cluster [uuid: %s] กรุณาเปิดใช้งาน huge pages ก่อนโดยใช้ UpdateResourceConfig [category=%s name=%s value=%s resourceUuid=%s]", + "ORG_ZSTACK_COMPUTE_VM_10040": "การดำเนินการนี้สามารถทำได้เฉพาะเมื่อ VM [%s] อยู่ในสถานะ stopped", + "ORG_ZSTACK_COMPUTE_CLUSTER_10001": "huge pages ไม่ควรถูกปิดใช้งานหากโหมดการเข้าถึง memory ถูกตั้งค่าเป็น shared ใน cluster [uuid:%s] กรุณาอัปเดตโหมดการเข้าถึง memory ก่อนโดยใช้ UpdateResourceConfig [category=%s name=%s value=%s resourceUuid=%s]", + "ORG_ZSTACK_COMPUTE_VM_10049": "ต้องระบุ UUID หรือ Cloud Account หรือ Authentication Token %s", + "ORG_ZSTACK_COMPUTE_VM_10048": "instance[uuid:%s] ไม่สามารถเปลี่ยนเป็น image[uuid:%s] ได้", + "ORG_ZSTACK_COMPUTE_VM_10047": "vm[uuid:%s] ไม่มีเครือข่าย L3 เริ่มต้น จึงไม่สามารถเปลี่ยน image ได้", + "ORG_ZSTACK_COMPUTE_VM_10046": "ตรวจสอบให้แน่ใจว่าโฮสต์ VM [UUID:%s] ล่าสุดที่ VM อยู่นั้นมีสถานะ Running และ Connected", + "ORG_ZSTACK_COMPUTE_VM_10045": "ตรวจสอบให้แน่ใจว่าเครื่องจริงจังเก็บข้อมูลหลัก [UUID:%s] ถูกเปิดใช้งานและเชื่อมต่ออยู่", + "ORG_ZSTACK_IAM2_CONTAINER_10009": "fail to open Kubernetes configuration file: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10007": "ไม่สามารถดึงข้อมูลโปรเจกต์ที่ได้รับอนุญาตเนื่องจากเนื้อหาว่างเปล่า", + "ORG_ZSTACK_COMPUTE_VM_10055": "พารามิเตอร์ 'uuids' ต้องอ้างอิงถึง entity ของ VmInstanceVO หรือ HostVO", + "ORG_ZSTACK_IAM2_CONTAINER_10008": "fail to find Kubernetes configuration at path: %s", + "ORG_ZSTACK_COMPUTE_VM_10054": "nic id: %s ไม่มีอยู่ในการกำหนดค่าเครือข่ายเสมือน...", + "ORG_ZSTACK_IAM2_CONTAINER_10005": "ไม่สามารถดึง image tags เนื่องจากการตอบกลับเป็นค่าว่าง กรุณาตรวจสอบ image tag API endpoint และให้แน่ใจว่ากำหนดค่าอย่างถูกต้อง", + "ORG_ZSTACK_COMPUTE_VM_10053": "การ์ดเครือข่ายไม่รองรับการใช้ Quality of Service (QoS) settings พร้อมกับ Port Mirroring service", + "ORG_ZSTACK_IAM2_CONTAINER_10006": "ไม่สามารถดึง images เนื่องจากเนื้อหาว่างเปล่า.%s", + "ORG_ZSTACK_COMPUTE_VM_10052": "outbound bandwidth และ inbound bandwidth ต้องระบุอย่างน้อยหนึ่งทิศทาง", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10008": "access group ที่เชื่อมโยงอยู่แล้ว: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10003": "failed to setup containerized cluster for project[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10051": "จำนวน Monitor ต้องเป็นหนึ่งในค่าต่อไปนี้: 1, 2, หรือ 4", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10007": "nas mount target [%s] มีอยู่แล้วใน filesystem: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10004": "ไม่สามารถดึง image tags เนื่องจากเนื้อหาว่างเปล่า.%s", + "ORG_ZSTACK_COMPUTE_VM_10050": "direction ต้องกำหนดค่าภายใน (in, out), แต่เป็น %s", + "ORG_ZSTACK_IAM2_CONTAINER_10001": "failed to update quota for container %s", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10009": "access group rule [%s] มีอยู่แล้วใน access group [%s]", + "ORG_ZSTACK_IAM2_CONTAINER_10002": "failed to setup project[uuid: %s] container, because the project was not found in the database", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10003": "mount domain not valid after %d milliseconds, delete it...", + "ORG_ZSTACK_IAM2_CONTAINER_10000": "failed to update quota of project[uuid: %s] on container side due to an unexpected error", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10006": "ไม่มี NAS access groups พร้อมใช้งาน; กรุณาสร้างอย่างน้อยหนึ่งรายการ", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10005": "ไม่มี mount target [%s] ใน NAS: %s", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10000": "ไม่พบ filesystem [%%s] ใน region: %%s", + "ORG_ZSTACK_COMPUTE_VM_10059": "ไม่พบ account preference กรุณาส่งคำสั่งเปลี่ยนรหัสผ่านไปยังโฮสต์ virtual machine!", + "ORG_ZSTACK_COMPUTE_VM_10058": "ไม่พบ destination host ใน database; ไม่สามารถส่งคำสั่งเปลี่ยนรหัสผ่านไปยังโฮสต์ได้!", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10002": "primary storage [%%s] เชื่อมโยงอยู่กับ NAS นี้; กรุณาลบ primary storage ก่อนลบ NAS", + "ORG_ZSTACK_COMPUTE_VM_10057": "เฉพาะโฮสต์ที่มี UUID(s): %s เท่านั้นที่สามารถเข้าถึง data volume ได้", + "ORG_ZSTACK_COMPUTE_VM_10056": "resource[UUIDs:%s] ไม่ได้ถูกจัดการโดย account[UUID:%s]", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10001": "ระบบไฟล์ NAS มีอยู่แล้วใน datacenter: %s", + "ORG_ZSTACK_COMPUTE_VM_10063": "รหัสผ่านที่ให้มาไม่ตรงตามข้อกำหนดความซับซ้อน ต้องประกอบด้วยตัวเลขอย่างน้อย 1 ตัว ตัวอักษรใหญ่อย่างน้อย 1 ตัว ตัวอักษรเล็กอย่างน้อย 1 ตัว และอักขระพิเศษอย่างน้อย 1 ตัว", + "ORG_ZSTACK_COMPUTE_VM_10062": "ความยาวรหัสผ่านต้องอยู่ในช่วง [%s-%s ตัวอักษร]", + "ORG_ZSTACK_COMPUTE_VM_10061": "ดิสก์ไม่รองรับการแนบ ประเภทดิสก์คือ %s", + "ORG_ZSTACK_COMPUTE_VM_10060": "พารามิเตอร์ AO ของดิสก์ไม่ถูกต้อง คุณต้องตั้งค่าคุณสมบัติหนึ่งในต่อไปนี้: size, template UUID, disk offering UUID, หรือ source UUID-source type ควรระบุคุณสมบัติใดคุณสมบัติหนึ่งเท่านั้น", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10010": "access group [%s] มีอยู่แล้วใน datacenter [%s]", + "ORG_ZSTACK_COMPUTE_VM_10068": "ไม่มีประเภท network interface ที่พร้อมใช้งานบน L3 network [%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10015": "ไม่สามารถสร้าง secondary virtual machine ได้เนื่องจาก primary virtual machine อยู่ในสถานะหยุดทำงาน โปรดเริ่มต้น primary virtual machine ก่อนสร้าง secondary virtual machine", + "ORG_ZSTACK_COMPUTE_SRIOV_10014": "SR-IOV และ VFHA ไม่สามารถเปิดใช้งานพร้อมกันได้สำหรับการแนบ L3 network ไปยัง VM โปรดตรวจสอบให้แน่ใจว่าตั้งค่าตัวเลือกใดตัวเลือกหนึ่งเท่านั้น", + "ORG_ZSTACK_COMPUTE_SRIOV_10015": "ไม่สามารถเปลี่ยน virtual function network interface เป็น standard type ได้", + "ORG_ZSTACK_FAULTTOLERANCE_10013": "มี fault-tolerance garbage collection task กำลังทำงานอยู่ โปรดยกเลิก task ใหม่และรอจนกว่าจะเสร็จสิ้น", + "ORG_ZSTACK_COMPUTE_SRIOV_10016": "ไม่สามารถเปลี่ยน network interface เป็น VF type ได้ โปรดตรวจสอบให้แน่ใจว่า instance เป้าหมายรองรับ vf networking", + "ORG_ZSTACK_COMPUTE_SRIOV_10017": "vm network interface ที่มี UUID:%s ไม่มีอยู่", + "ORG_ZSTACK_FAULTTOLERANCE_10011": "ขาด fault-tolerant virtual machine group", + "ORG_ZSTACK_FAULTTOLERANCE_10010": "ไม่สามารถ migrate ft primary VM[uuid:%s] ได้", + "ORG_ZSTACK_COMPUTE_SRIOV_10019": "รองรับเฉพาะ SR-IOV", + "ORG_ZSTACK_MONITORING_MEDIA_10001": "ไม่สามารถเชื่อมต่อกับ SMTP server ที่ host: %s, port: %d ได้ โปรดตรวจสอบความถูกต้องของ smtpServer และ smtpPort", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10038": "Condition body ไม่รองรับค่า JSON null หรือ array!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10037": "รองรับเฉพาะ ZStack Template Functions ในฟิลด์ 'Condition'!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10036": "ค่าต้องเป็นประเภท boolean ในฟิลด์ 'Condition'", + "ORG_ZSTACK_MONITORING_MEDIA_10000": "ปัญหาอาจเกิดจาก access key ID หรือ secret access key ไม่ถูกต้อง หรือ IAM permissions ไม่เพียงพอสำหรับ user ที่ระบุ โปรดตรวจสอบข้อมูลประจำตัวของคุณและตรวจสอบให้แน่ใจว่า user มี permissions ที่จำเป็นใน cloud computing environment ของคุณ", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10035": "Condition key: %s รองรับเพียง 1 element ใน JSON object ของค่า แต่มี %d elements ที่ให้มา!", + "ORG_ZSTACK_FAULTTOLERANCE_10019": "ไม่สามารถทำ failover ได้ Primary VM ไม่ทราบสถานะและไม่มี fault tolerance network address โปรดตรวจสอบการตั้งค่าของคุณ", + "ORG_ZSTACK_FAULTTOLERANCE_10018": "pvm[uuid:%s] ไม่มีอยู่", + "ORG_ZSTACK_FAULTTOLERANCE_10017": "ไม่สามารถ failover vm[uuid:%s] ได้ Fault-tolerant virtual machine group ที่เกี่ยวข้องไม่มีอยู่", + "ORG_ZSTACK_COMPUTE_SRIOV_10012": "vm nic [uuid:%s] เป็นประเภท %s อยู่แล้ว ไม่จำเป็นต้องแก้ไข", + "ORG_ZSTACK_FAULTTOLERANCE_10016": "การสร้าง SVM สำเร็จ แต่เกิดข้อผิดพลาดระหว่างคำขอเริ่มต้น secondary VM โปรดตรวจสอบการตั้งค่า SVM และตรวจสอบให้แน่ใจว่าเงื่อนไขทั้งหมดสำหรับการเริ่มต้น secondary VM พร้อมใช้งาน", + "ORG_ZSTACK_COMPUTE_SRIOV_10013": "แก้ไข network interface type ของ virtual machine ได้เฉพาะเมื่อหยุดทำงานอยู่เท่านั้น", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10009": "การยืนยันตัวตนสองขั้นตอนล้มเหลวเนื่องจากไม่มีโทเค็นในแท็กระบบ msg %s", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10008": "การยืนยันตัวตนสองขั้นตอนล้มเหลวเนื่องจากข้อความไม่มีแท็กระบบ", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10004": "การยืนยันตัวตนสองขั้นตอนไม่ได้เปิดใช้งานสำหรับบัญชีของคุณ โปรดเปิดใช้งานเพื่อดำเนินการต่อ", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10001": "ประเภทบัญชีไม่รองรับ: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10026": "ไม่พบพอร์ต VM ที่ทนทานต่อความผิดพลาด", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10011": "การตรวจสอบรหัสยืนยันตัวตนสองขั้นตอนล้มเหลวสำหรับทรัพยากรเสมือน %s โปรดตรวจสอบรหัสของคุณแล้วลองอีกครั้ง", + "ORG_ZSTACK_DAHO_CORE_10003": "การสร้างงาน Daho VLL ล้มเหลว! โปรดตรวจสอบว่าไฟล์ต้นทางทั้งหมดถูกอัปโหลดอย่างถูกต้องและสามารถเข้าถึงได้ในสภาพแวดล้อมคลาวด์", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10010": "การยืนยันตัวตนสองขั้นตอนล้มเหลวเนื่องจากไม่มี secret ที่กำหนดไว้สำหรับ %s:%s", + "ORG_ZSTACK_FAULTTOLERANCE_10024": "ไม่สามารถเริ่มต้นเครื่องเสมือนรองได้เนื่องจากเครื่องเสมือนหลักอยู่ในสถานะหยุดทำงาน โปรดเริ่มต้นเครื่องเสมือนหลักก่อน", + "ORG_ZSTACK_DAHO_CORE_10004": "ไม่พบบัญชี Alibaba Cloud สำหรับ accountUuid: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10022": "ไม่พบ IP ที่ใช้งานได้จากเครือข่าย fault-tolerance ปัจจุบัน โปรดตรวจสอบว่าการกำหนดค่าทั่วไป [หมวดหมู่: Fault Tolerance, ชื่อ: fault.tolerance.network.cidr] ถูกตั้งค่าอย่างถูกต้อง และตรวจสอบว่าโฮสต์ [uuid:%s] มีที่อยู่ IP ภายในช่วง CIDR ที่ระบุ", + "ORG_ZSTACK_FAULTTOLERANCE_10021": "เกิดข้อยกเว้นที่ไม่คาดคิดระหว่างการจัดการทรัพยากรคลาวด์ โปรดตรวจสอบพารามิเตอร์อินพุตของคุณและให้แน่ใจว่าอยู่ในช่วงที่ถูกต้อง หากปัญหายังคงอยู่ ให้พิจารณาตรวจสอบการกำหนดค่าสภาพแวดล้อมการประมวลผลคลาวด์หรือติดต่อฝ่ายสนับสนุนเพื่อขอความช่วยเหลือเพิ่มเติม", + "ORG_ZSTACK_DAHO_CORE_10007": "expire policy: %s ไม่ใช่การกำหนดค่าที่ถูกต้อง", + "ORG_ZSTACK_FAULTTOLERANCE_10020": "การ fail-over ล้มเหลว VM รองไม่ทราบและไม่มีที่อยู่เครือข่าย fault tolerance ที่ใช้งานได้ โปรดตรวจสอบการกำหนดค่าของคุณ", + "ORG_ZSTACK_DAHO_CORE_10008": "vlanId[%s] มีอยู่แล้ว!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10026": "น้ำหนักของ CfnRootDecoder ต้องอยู่ระหว่าง 0-100 โดยที่ 0 บ่งชี้การถอดรหัสแบบลำดับความสำคัญและค่าเริ่มต้นคือ 50", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10025": "Parameters root body ต้องเป็นอ็อบเจ็กต์ JSON!", + "ORG_ZSTACK_COMPUTE_SRIOV_10020": "%s ไม่รองรับ SRIOV", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10024": "Type จำเป็นสำหรับ Parameters แต่ไม่พบใน %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10021": "แท็ก enableSRIOV ไม่รองรับสำหรับประเภท VM [%s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10022": "ล้มเหลวในการ pre-handle อินเทอร์เฟซเครือข่ายเสมือนก่อนการย้าย VM[uuid:%s] ไปยังโฮสต์[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10028": "หมายเลขพอร์ตที่จัดสรรน้อยกว่าที่ร้องขอสำหรับ nic [uuid: %s] บนโฮสต์ [uuid: %s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10023": "ล้มเหลวในการ post-process อินเทอร์เฟซเครือข่ายเสมือนหลังการย้าย VM[uuid:%s] ไปยังโฮสต์[uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10029": "Mapping value body ไม่รองรับ JSON array! โปรดให้แน่ใจว่าค่า mapping เป็น scalar หรือ complex type ที่แพลตฟอร์มคลาวด์ของคุณรองรับ", + "ORG_ZSTACK_FAULTTOLERANCE_10027": "ล้มเหลวในการจัดสรรพอร์ตสำหรับ nic[uuid: %s] บนโฮสต์[uuid: %s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10028": "ไม่พบข้อความ: %s สำหรับการสร้างทรัพยากร", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10030": "Mapping value body ไม่สามารถรองรับค่า null! โปรดให้แน่ใจว่า mapping value bodies ทั้งหมดถูกเริ่มต้น", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10031": "mappingName ต้องพบในผลลัพธ์ CloudFormation JSON มิฉะนั้นจะถือว่าไม่ถูกต้อง", + "ORG_ZSTACK_FAULTTOLERANCE_10037": "ไม่สามารถ fail-over VM[uuid:%s] ได้เนื่องจากกลุ่ม VM ที่ทนทานต่อความผิดพลาดไม่อยู่ในสถานะใดสถานะหนึ่งต่อไปนี้: [%s, %s]", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10005": "ไม่สามารถแนบ L2VirtualSwitchNetwork ได้เนื่องจากไม่มีโฮสต์ในคลัสเตอร์[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10036": "ไม่สามารถ fail-over VM[UUID:%s] ได้ กรุณายืนยันว่าเป็นกลุ่ม VM ที่มี fault-tolerant", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10006": "ไม่สามารถแนบ L2 Virtual Switch Network ได้ เนื่องจาก interface[%s] ควรสร้างบน host[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10035": "ไม่สามารถ fail over VM[UUID:%s] ได้ กรุณาตรวจสอบว่า failover เปิดใช้งานอยู่ใน GlobalConfig", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10007": "สามารถสร้าง layer 3 network บน virtual switch[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10034": "ไม่สามารถลบ L3 network [uuid:%s] ได้ Fault-tolerant VM [%s] ยังคงอยู่ในสถานะ [%s, %s] กรุณาหยุด fault-tolerant VMs ที่เกี่ยวข้องก่อนพยายามลบ L3 network", + "ORG_ZSTACK_FAULTTOLERANCE_10033": "image[uuid:%s] ยังคงถูกใช้งานโดย fault-tolerance VM[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10004": "ไม่พบ KVM host ที่เชื่อมต่อเพื่อดำเนินการ ดูเหมือนว่า hosts ทั้งหมดใน clusters ที่แนบกับ shared block group storage [uuid:%s] ถูกตัดการเชื่อมต่อ", + "ORG_ZSTACK_FAULTTOLERANCE_10032": "volume ที่มี index: %d ของ pvm[uuid:%s] และ svm[uuid:%s] มี cache volume ที่มีขนาดแตกต่างกัน ไม่อนุญาตให้เริ่มต้น", + "ORG_ZSTACK_FAULTTOLERANCE_10031": "volume ที่มี index: %d ของ pvm[uuid:%s] และ svm[uuid:%s] มีขนาดแตกต่างกัน ไม่อนุญาตให้เริ่มต้น", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10003": "ไม่สามารถสร้าง L2PortGroupNetwork ได้ เนื่องจาก L2VirtualSwitchNetwork[uuid:%s] มี L2PortGroupNetworks ที่มี vlanId[%s] เหมือนกันอยู่แล้ว", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10002": "KVM host ที่ volume[uuid%s] แนบอยู่สูญเสียการเชื่อมต่อกับ shared block storage group[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10030": "จำนวน volume ของ pvm[uuid:%s] และ svm[uuid:%s] ไม่ตรงกัน ไม่อนุญาตให้เริ่มต้น", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10004": "ไม่สามารถแนบ L2VirtualSwitchNetwork ได้ เนื่องจาก interface[%s] ใน cluster[uuid:%s] ถูกใช้งานอยู่แล้วโดย L2VirtualSwitchNetwork อื่น", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10001": "ไม่พบ volume สำหรับดำเนินการใน shared block group primary storage.%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10002": "ไม่มี virtual router ที่กำหนดค่าสำหรับบริการ VYOS DHCP.%s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10006": "shared volume ไม่รองรับ thin provisioning", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10001": "ไม่สามารถเพิ่ม DHCP entries ไปยัง virtual router VM[UUID:%s IP:%s] เนื่องจาก %s, DHCP entry[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10039": "การดำเนินการปัจจุบัน[API:%s] ไม่รองรับเมื่อ FT VM[UUID:%s, state:%s] ไม่อยู่ในสถานะ stopped", + "ORG_ZSTACK_FAULTTOLERANCE_10038": "ไม่สามารถ maintain host ได้เนื่องจาก FT VMs[%s] อยู่ในระหว่างการกู้คืน", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10011": "vm[uuid:%s] ไม่อยู่ในสถานะ Running, Paused หรือ Stopped สถานะปัจจุบัน[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10048": "ไม่สามารถ update ft vm[uuid:%s] platform ได้ ต้องหยุดทั้งสอง vms และตรวจสอบให้แน่ใจว่าอยู่ในสถานะ stopped ก่อนดำเนินการ", + "ORG_ZSTACK_FAULTTOLERANCE_10047": "ไม่สามารถ update ขนาด memory ของ ft vm[uuid:%s] ได้ เนื่องจากต้องหยุดทั้งสอง vms", + "ORG_ZSTACK_FAULTTOLERANCE_10046": "ไม่สามารถ update จำนวน cpu ของ ft vm[uuid:%s] ได้ ต้องหยุดทั้งสอง vms และ restart พวกมัน", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10005": "L2 network ไม่ควรมีชื่อ interface เหมือนกับ provision network ที่แนบกับ cluster อยู่แล้ว", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10004": "อย่าเพิ่ม host ไปยัง BareMetal2 cluster", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10015": "Image ที่มี UUID [uuid: %s] และชื่อ [name: %s] ไม่พบใน backup storage ใดๆ", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10003": "ต้องระบุ architecture เมื่อสร้าง BareMetal2 clusters ใหม่", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10014": "Image [UUID: %s, name: %s] ไม่พร้อมให้ดาวน์โหลดใน backup storage ใดๆ:", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10002": "1. ตรวจสอบว่า image ไม่อยู่ในสถานะ deleted", + "ORG_ZSTACK_FAULTTOLERANCE_10042": "2. ตรวจสอบว่า backup storage ที่ทำเครื่องหมายว่า Ready สำหรับ image นี้แนบกับ zone [UUID: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10013": "การรวมสแนปชอตออนไลน์ไม่รองรับสำหรับโวลุมแบบแชร์ได้[uuid: %s] บน sharedblock", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10001": "", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10012": "ไม่สามารถแนบที่เก็บข้อมูลในเครื่องไปยังคลัสเตอร์ baremetal ได้ โปรดตรวจสอบว่าคลัสเตอร์รองรับการแนบที่เก็บข้อมูลในเครื่อง", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10000": "", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10017": "โวลุม [UUID: %s] ถูกแนบไปยัง VM [UUID: %s] ซึ่งอยู่ในสถานะ %s; ดังนั้นจึงไม่สามารถรวมสแนปชอตได้", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10016": "", + "ORG_ZSTACK_FAULTTOLERANCE_10049": "ไม่สามารถแนบ Ceph บุคคลที่สามพร้อม token ไปยังคลัสเตอร์ aarch64 ได้ โปรดตรวจสอบความเข้ากันได้ของเวอร์ชัน Ceph กับสถาปัตยกรรมของคลัสเตอร์", + "ORG_ZSTACK_BAREMETAL_NETWORK_10004": "", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10000": "hosts[uuid:%s] มี disk UUID ที่เชื่อมโยงกับ shared block storage แต่ที่เก็บข้อมูลจริงแตกต่างกัน", + "ORG_ZSTACK_BAREMETAL_NETWORK_10003": "", + "ORG_ZSTACK_BAREMETAL_NETWORK_10002": "ไม่พบ host ที่เชื่อมต่อในคลัสเตอร์[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_NETWORK_10001": "", + "ORG_ZSTACK_BAREMETAL_NETWORK_10000": "การดำเนินการปัจจุบันไม่รองรับบน virtual machine ของ fault-tolerant group[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10022": "", + "ORG_ZSTACK_FAULTTOLERANCE_10058": "ที่อยู่ mac %s เป็น bond slave interface อยู่แล้ว", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10021": "", + "ORG_ZSTACK_FAULTTOLERANCE_10057": "ไม่สามารถตั้งค่า DHCP entries ที่ให้บริการโดย virtual router[uuid:%s, ip:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10020": "", + "ORG_ZSTACK_FAULTTOLERANCE_10056": "ที่อยู่ MAC %s ไม่ได้เป็นของ chassis ที่มี UUID %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10001": "", + "ORG_ZSTACK_FAULTTOLERANCE_10055": "ที่อยู่ slave %s ไม่ถูกต้อง ควรอยู่ในรูปแบบที่อยู่ MAC แยกด้วยเครื่องหมายจุลภาค เช่น 6c:b3:11:1b:0b:1e,6c:b3:11:1b:0b:1f", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10002": "", + "ORG_ZSTACK_FAULTTOLERANCE_10054": "ชื่อ bond %s มีอยู่ในการกำหนดค่า virtual network แล้ว", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10025": "", + "ORG_ZSTACK_FAULTTOLERANCE_10053": "การสร้าง BM Bonding อนุญาตเฉพาะก่อนสร้าง BM Instance", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10024": "", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10029": "ไม่พบ backup storage[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10027": "", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10005": "ไม่อนุญาตให้มีที่อยู่ MAC เหมือนกัน [%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10051": "", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10006": "eip ที่มี uuid:%s ไม่อยู่ในสถานะเปิดใช้งาน ไม่สามารถแนบกับ vm nic ได้", + "ORG_ZSTACK_FAULTTOLERANCE_10050": "การดำเนินการปัจจุบันไม่รองรับบน VM หลักที่ทนต่อความผิดพลาด[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10003": "ไม่สามารถแนบเครือข่าย L3 [uuid:%s, name:%s] ไปยัง VM [uuid:%s, name:%s] เนื่องจากเครือข่าย L3 กำลังให้บริการ Elastic IP (EIP) กับ NIC หนึ่งของ VM", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10004": "vmNic [UUID:%s] ไม่ได้แนบกับ vmInstance ดังนั้นจึงไม่สามารถดึง EIPs ที่สามารถแนบได้", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10009": "eip ที่มี uuid: %s สามารถแนบได้เฉพาะเมื่อสถานะเป็น %s แต่สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10007": "ip [uuid:%s] เชื่อมโยงกับ vm nic [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10008": "eIP ที่มี UUID: %s ได้ถูกแนบกับ VM NIC อื่นที่มี UUID: %s แล้วและไม่สามารถแนบซ้ำได้", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10033": "ไม่พบ KVM host ที่เชื่อมต่อเพื่อดำเนินการ; ดูเหมือนว่า hosts ทั้งหมดที่แนบกับ shared block storage [uuid:%s] ถูกตัดการเชื่อมต่อ", + "ORG_ZSTACK_FAULTTOLERANCE_10069": "cluster[uuid:%s] ถูกระบุแต่ถูกปิดใช้งาน; ดังนั้นไม่สามารถสร้าง VM จาก cluster นี้ได้", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10032": "ไม่พบ hosts ที่เชื่อมต่อกับ primary storage ทั้ง UUID: %s และ primary storage ที่มี UUID: %s", + "ORG_ZSTACK_FAULTTOLERANCE_10068": "zone[uuid:%s] ถูกระบุแต่ถูกปิดใช้งาน; ดังนั้นไม่สามารถสร้าง VM จาก zone นี้ได้", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10031": "ไม่พบ host ที่พร้อมใช้งานเพื่อย้าย volume[uuid: %s] บน shared block group primary storage[uuid: %s] และ [uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10030": "ไม่พบ host ที่พร้อมใช้งานเพื่อย้าย volume[uuid: %s] ระหว่าง shared block group primary storage[uuid: %s] และ [uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10037": "ไม่สามารถลดขนาด snapshot %s ได้เนื่องจากเครื่องเสมือน %s ไม่อยู่ในสถานะ Running หรือ Stopped", + "ORG_ZSTACK_FAULTTOLERANCE_10065": "ไม่สามารถเพิ่ม UUID เดิมให้กับ l3Network ได้, UUID: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10035": "ไม่สามารถลดขนาด snapshot %s ได้เนื่องจาก volume %s ไม่พร้อมใช้งาน", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10038": "ได้รับ installation path เป็น null ใน snapshot สำหรับเครื่องเสมือน %s", + "ORG_ZSTACK_ALIYUN_BACKUP_10000": "ไม่พบ storage bucket สำหรับการดำเนินการ backup โปรดตรวจสอบว่าได้กำหนดค่า bucket ที่ถูกต้องแล้ว.%s", + "ORG_ZSTACK_FAULTTOLERANCE_10062": "image[uuid:%s] มีรูปแบบ: %s, สามารถใช้ได้เฉพาะรูปแบบที่ถูกต้องเพื่อสร้าง VM", + "ORG_ZSTACK_FAULTTOLERANCE_10061": "image[uuid:%s] มีประเภทสื่อ: %s; สามารถใช้ได้เฉพาะ root volume templates เพื่อสร้าง VM", + "ORG_ZSTACK_TICKET_IAM2_API_10004": "reservation policy หนึ่งสามารถเชื่อมโยงได้กับ flow collection เดียวเท่านั้น", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10044": "ไม่พบ host ที่เชื่อมต่อเพื่อ pull snapshot บน primary storage[uuid:%s] สำหรับ volume[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10020": "vip[uuid:%s] ไม่อยู่ในสถานะที่คาดหวัง[%s], สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_SNS_PLATFORM_MICROSOFTTEAMS_10000": "ส่งข้อความไปยัง Microsoft Teams ไม่สำเร็จ สถานะ: %s, body: %s", + "ORG_ZSTACK_TICKET_IAM2_API_10003": "ต้องระบุชื่อเพื่อสร้าง flow ในสภาพแวดล้อม cloud computing", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10043": "ไม่พบ host ที่เชื่อมต่อเพื่อ commit snapshot บน primary storage[uuid:%s] สำหรับ volume[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10079": "ไม่สามารถเริ่มต้น vm[uuid:%s] ได้ มันไม่มี network interface card (NIC) แนบอยู่ โปรดแนบ NIC แล้วลองอีกครั้ง", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10042": "active installPath %s ล้มเหลว เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10041": "active children snapshot ล้มเหลว เนื่องจาก %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10023": "vmNic UUID[%s] ไม่ได้รับอนุญาตให้เพิ่ม EIP เนื่องจากมีกฎ Port Forwarding พร้อม allowed CIDR อยู่แล้ว", + "ORG_ZSTACK_FAULTTOLERANCE_10077": "เครื่องเสมือนที่ทนทานต่อความผิดพลาดในปัจจุบันอยู่ในสถานะที่ไม่รู้จักและไม่สามารถหยุดทำงานได้ กรุณาพยายามดำเนินการสลับไปยังระบบสำรองด้วยตนเอง", + "ORG_ZSTACK_TICKET_IAM2_API_10008": "", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10048": "ชื่อของทรัพยากรไม่สามารถเป็นค่าว่างได้ กรุณาระบุชื่อที่ถูกต้องสำหรับทรัพยากร", + "ORG_ZSTACK_TICKET_IAM2_API_10007": "", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10021": "แท็กขนาดเริ่มต้นการจัดเตรียมแบบบางไม่ถูกต้อง [%s]", + "ORG_ZSTACK_TICKET_IAM2_API_10006": "", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10022": "ตำแหน่งของผู้อนุมัติ %s ไม่ถูกต้อง ค่าที่ถูกต้องคือ %s", + "ORG_ZSTACK_TICKET_IAM2_API_10005": "", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10045": "เครือข่าย l3 ของ guest จาก vm nic[uuid:%s] และเครือข่าย l3 ของ vip จาก vip[uuid:%s] เป็นเครือข่ายเดียวกัน", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10049": "", + "ORG_ZSTACK_FAULTTOLERANCE_10073": "ต้องมีอย่างน้อยหนึ่ง flow เพื่อสร้าง flow collection", + "ORG_ZSTACK_FAULTTOLERANCE_10071": "", + "ORG_ZSTACK_FAULTTOLERANCE_10070": "สถานะ VM[%s] ไม่ได้รับอนุญาตให้ดำเนินการ EIP กรุณารอให้กระบวนการ VM เสร็จสิ้น", + "ORG_ZSTACK_TICKET_IAM2_API_10009": "", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10051": "ต้องมีการดำเนินการโดยผู้ดูแลระบบหรือ IAM role ในฐานะผู้อนุมัติของ workflow สุดท้าย", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10050": "", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10055": "การปิดใช้งาน installPath ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10054": "", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10053": "ขนาดเริ่มต้นการจัดเตรียมแบบบาง[%s] ไม่ถูกต้อง ต้องมีค่ามากกว่าหรือเท่ากับ %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10052": "", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10012": "defaultL3NetworkUuid[uuid:%s] ไม่พบใน l3NetworkUuids[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10059": "", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10058": "host[uuid:%s] ถูกระบุแต่สถานะการเชื่อมต่อเป็น %s ไม่สามารถสร้าง VM จากมันได้", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10013": "", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10010": "host[uuid:%s] ถูกระบุแต่ถูกปิดใช้งาน ดังนั้นจึงไม่สามารถสร้าง VM จากมันได้", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10057": "", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10011": "UUID ของผู้อนุมัติไม่สามารถเป็นค่าว่างได้", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10056": "", + "ORG_ZSTACK_TICKET_IAM2_API_10011": "thinProvisioningInitializeSize[%s] เกินขีดจำกัดสูงสุด %d", + "ORG_ZSTACK_TICKET_IAM2_API_10010": "", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10017": "เครื่องเสมือน [UUID:%s] ที่เชื่อมโยงกับ EIP ได้เชื่อมต่อกับเครือข่ายสาธารณะ [UUID:%s] อยู่แล้ว ซึ่ง VIP [UUID:%s, Name:%s, IP:%s] มีต้นกำเนิดมาจากเครือข่ายนี้", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10014": "เวอร์ชัน IP ของ VIP [%d] แตกต่างจากเวอร์ชัน IP ของ guest [%d]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10015": "VIP[%s] อยู่ภายในช่วง IP ของ guest [%s - %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10062": "พื้นที่เก็บข้อหลัก SharedBlock [uuid:%s, name:%s] ยังไม่ได้แนบกับคลัสเตอร์ compute ใดๆ หรือไม่มีโฮสต์ที่เชื่อมต่อในคลัสเตอร์ที่แนบมา", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10018": "VIP [UUID:%s] ถูกใช้งานโดยเอนทิตีบริการเครือข่ายอื่นแล้ว [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10019": "ไม่สามารถสร้าง EIP บน VIP ของระบบได้ โปรดตรวจสอบว่าคุณใช้ที่อยู่ IP สาธารณะสำหรับการเชื่อมโยง EIP", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10047": "ล้มเหลวในการดึงค่า hash ของ image เนื่องจาก:%s", + "ORG_ZSTACK_SNS_PLATFORM_FEISHU_10000": "ล้มเหลวในการส่งข้อความไปยัง FeiShu สถานะ: %s, body: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10042": "UUID ของ image store backup storage agent ได้เปลี่ยนแปลง [คาดหวัง: %s, จริง: %s] สาเหตุน่าจะเกิดจากการรีสตาร์ท agent ด้วยตนเอง โปรดออกคำสั่ง reconnect เพื่อซิงโครไนซ์สถานะ", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10000": "ล้มเหลวในการดึงข้อมูลคลัสเตอร์ Zaku ข้อผิดพลาด: %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10002": "ล้มเหลวในการดึงคลัสเตอร์ zaku [id:%s] ข้อผิดพลาด: %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10001": "ล้มเหลวในการดึงข้อมูลคลัสเตอร์ Zaku; เนื้อหาการตอบกลับเป็น null โปรดตรวจสอบพารามิเตอร์คำขอและการเชื่อมต่อเครือข่ายของคุณ", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10000": "ไม่พบโควตาสำหรับกลุ่มความปลอดภัยสำหรับโปรเจกต์ %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10004": "ล้มเหลวในการแยก action ID จากการตอบกลับ API", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10003": "ล้มเหลวในการดึงคลัสเตอร์ Zaku [id:%s] เนื้อหาการตอบกลับเป็น null", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10006": "ล้มเหลวในการแยกวิเคราะห์การตอบกลับจาก cloud: %s", + "ORG_ZSTACK_SNS_10015": "ไม่สามารถระบุ platformUuid และ endpointUuid พร้อมกันได้ โปรดตรวจสอบพารามิเตอร์นำเข้าของคุณ", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10001": "โควตากลุ่มความปลอดภัยต้องไม่น้อยกว่า 1 โปรดปรับการตั้งค่าให้มีค่าอย่างน้อย 1", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10005": "การดำเนินการแบบอะซิงโครนัสหมดเวลาหลังจาก %d วินาที", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10004": "l3Uuid ใน label ไม่สอดคล้องกับ l3Uuid ในพารามิเตอร์", + "ORG_ZSTACK_SNS_10013": "รหัสผ่านไม่สามารถเป็นค่าว่างได้", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10003": "ร้องขอ system tag จำเป็นต้องระบุกลุ่มความปลอดภัยเริ่มต้นสำหรับ VM NIC โดยการตั้งค่า system tag L3_NETWORK_SECURITY_GROUP_UUIDS_REF ด้วยรูปแบบ l3::{%s}::SecurityGroupUuids::{%s} เนื่องจากเปิดใช้งาน force security group", + "ORG_ZSTACK_SNS_10012": "ชื่อผู้ใช้ไม่สามารถเป็นค่าว่างได้", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10006": "เนื่องจากเปิดใช้งาน force security group securityGroupUuid ใน tag ต้องอยู่ภายในโปรเจกต์ [%s]", + "ORG_ZSTACK_SNS_10011": "smtpPort ไม่สามารถเป็นค่าว่างได้", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10005": "เจ้าของ [UUID: %s] ของกลุ่มความปลอดภัย [UUID: %s] อยู่ในโปรเจกต์ IAM2 อื่น", + "ORG_ZSTACK_SNS_10010": "smtpServer ไม่สามารถเป็นค่าว่างได้", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10008": "ไม่สามารถลบกลุ่มความปลอดภัยเริ่มต้น %s ได้เมื่อเปิดใช้งาน enforced security group feature", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10007": "NIC ที่แนบกับ l3Network [uuid:%s] เชื่อมโยงกับกลุ่มความปลอดภัย ก่อนถอด l3Network ออกจากกลุ่มความปลอดภัย คุณต้องถอด NIC ออกก่อน", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10039": "จำเป็นต้องมี license เชิงพาณิชย์เพื่อใช้งานบริการ ImageStore ในสภาพแวดล้อม cloud ของเรา", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10009": "กลุ่มความปลอดภัย %s นี้เชื่อมโยงกับเครื่องเสมือน กรุณายกเลิกการเชื่อมโยงก่อนดำเนินการต่อ", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10035": "พื้นที่จัดเก็บรูปภาพ [%s] ไม่สามารถเพิ่มรูปภาพได้เนื่องจากมีการใช้สำหรับรีโมตสำรองข้อมูล", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10032": "พื้นที่จัดเก็บสำรองข้อมูล[UUID:%s] ไม่มีความจุเพียงพอ[%s] ในการส่งออกรูปภาพเครื่องเสมือน", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10002": "เราเตอร์เสมือน[ชื่อ: %s, uuid: %s] ไม่สามารถซิงค์ snat%s เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10031": "ไม่พบรูปภาพ[%s] บนพื้นที่จัดเก็บสำรองข้อมูล[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10001": "เครือข่าย l3 แขก[uuid:%s, ชื่อ:%s] ต้องการบริการ SNAT จากเราเตอร์เสมือน แต่เครือข่าย l3 สาธารณะ[uuid:%s] ที่เชื่อมโยงกับข้อเสนอเราเตอร์เสมือน[uuid: %s, ชื่อ:%s] เหมือนกับเครือข่าย l3 แขก", + "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10020": "notifySugonSdn: ไม่สามารถแจ้ง Sugon SDN ของ vrouter สำหรับ VM [uuid:%s] บนโฮสต์ปลายทาง[uuid:%s], ข้อผิดพลาดคือ:%s", + "ORG_ZSTACK_SNS_10029": "ตัวระบุทรัพยากรคลาวด์ [%s] มีอยู่แล้ว", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10011": "บัญชี[%s] ไม่ได้รับอนุญาตให้ดำเนินการบนกลุ่มความปลอดภัยเริ่มต้น", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10010": "บัญชี[%s] ไม่สามารถดำเนินการบนกลุ่มความปลอดภัยเริ่มต้น[%s]", + "ORG_ZSTACK_SNS_10026": "ไม่สามารถอัปเดตที่อยู่อีเมลเป็น %s เนื่องจากมีอยู่แล้วใน endpoint [UUID:%s]", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10012": "อินเทอร์เฟซเครือข่ายของ vm [UUID: %s] สามารถเป็นส่วนหนึ่งของกลุ่มความปลอดภัยได้เพียงกลุ่มเดียว ดังนั้นจึงไม่สามารถลบออกจากกลุ่มความปลอดภัยปัจจุบัน [UUID: %s]", + "ORG_ZSTACK_SNS_10024": "ไม่สามารถเพิ่มที่อยู่อีเมลเดียวกันใน endpoint[uuid:%s]", + "ORG_ZSTACK_SNS_10023": "ไม่พบปลั๊กอิน[%s]", + "ORG_ZSTACK_SNS_10022": "ไม่สามารถสร้างแพลตฟอร์ม SNMP ด้วยที่อยู่เดียวกัน[%s:%s]", + "ORG_ZSTACK_SNS_10021": "ไม่สามารถสร้างการเชื่อมต่อเนื่องจากพารามิเตอร์เป็น null กรุณาตรวจสอบว่าพารามิเตอร์ที่จำเป็นทั้งหมดได้รับการกำหนดค่าอย่างถูกต้อง", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10029": "ไม่ได้ใช้งานประเภทเป้าหมายรีโมต: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10028": "ไม่สามารถแพ็คเกจรูปภาพที่ส่งออกเนื่องจาก %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10027": "รูปภาพบางรูป [%s] ไม่ได้ส่งออกไปยังพื้นที่จัดเก็บสำรองข้อมูล [uuid: %s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10026": "ไม่สามารถลบแพ็คเกจรูปภาพได้เนื่องจาก: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10022": "ไม่สามารถตั้งค่าความจุสูงสุดบนพื้นที่จัดเก็บรูปภาพ[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10021": "ไม่สามารถตั้งค่าความจุสูงสุดบนพื้นที่จัดเก็บรูปภาพ[uuid:%s], เนื่องจาก: %s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10019": "notifySugonSdn: ไม่สามารถแจ้ง Sugon SDN ของ vrouter สำหรับ VM [uuid:%s] บนโฮสต์ปลายทาง [uuid:%s]", + "ORG_ZSTACK_SNS_10038": "ไม่สามารถสร้าง SNS email endpoint โดยไม่ระบุที่อยู่อีเมลผู้รับ", + "ORG_ZSTACK_SNS_10037": "ชื่อผู้ใช้และรหัสผ่านต้องไม่มีทั้งคู่หรือให้มาพร้อมกัน", + "ORG_ZSTACK_SNS_10036": "หมายเลขโทรศัพท์ไม่ถูกต้อง[%s], กรุณาตรวจสอบว่าอยู่ในรูปแบบ +86-12388889999", + "ORG_ZSTACK_SNS_10035": "[%s] ไม่ใช่ที่อยู่ IP ที่ถูกต้อง", + "ORG_ZSTACK_SNS_10034": "เส้นทางพื้นที่จัดเก็บคลาวด์ไม่ถูกต้อง[%s]", + "ORG_ZSTACK_SNS_10031": "หมายเลขโทรศัพท์ [%s] ไม่มีอยู่", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10018": "ไม่มีการตอบสนองจากอินสแตนซ์คลาวด์หรือเครื่องเสมือน กรุณาตรวจสอบสถานะอินสแตนซ์และการกำหนดค่าเครือข่าย", + "ORG_ZSTACK_SNS_10030": "รายการหมายเลขโทรศัพท์ของเครื่องเสมือนว่างเปล่า กรุณาตรวจสอบและให้แน่ใจว่ามีการจัดเตรียมหมายเลขโทรศัพท์ที่จำเป็น", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10016": "ไม่สามารถดึงภาพจากที่จัดเก็บข้อมูลสำรองด้วย UUID: %s, เหตุผล: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10015": "ไม่พบไฟล์ใบรับรองสำหรับดาวน์โหลดภาพ: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10013": "ไม่สามารถเชื่อมต่อกับ SimpleHttpBackupStorage[url:%s], เนื่องจาก %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10010": "ไม่สามารถรับการตอบกลับของงาน! กรุณาตรวจสอบการตั้งค่าอินสแตนซ์และการตั้งค่าเครือข่าย", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_10000": "การสร้างต้องพึ่งพาแคชภาพ[uuid:%s, URL ตำแหน่งที่ตั้ง: [%s]] ไม่สามารถสร้างจากตำแหน่งอื่นได้", + "ORG_ZSTACK_SNS_10045": "ไม่อนุญาตให้ดำเนินการสำหรับแพลตฟอร์มเครื่องเสมือนระดับระบบ กรุณาให้แน่ใจว่าคุณกำลังแก้ไขทรัพยากรในพื้นที่ผู้ใช้", + "ORG_ZSTACK_SNS_10044": "ไม่สามารถตรวจสอบ SMS สากลได้โดยไม่ระบุหมายเลขโทรศัพท์", + "ORG_ZSTACK_SNS_10043": "userId [%s] มีอยู่แล้วในสภาพแวดล้อมคลาวด์", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10008": "ไม่สามารถล้างข้อมูลเมตาดาต้าภาพบนที่จัดเก็บข้อมูลหลัก %s, ข้อผิดพลาด: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10007": "สถานะซิงค์ล้มเหลวเนื่องจากไม่พบไฟล์ต้นทาง กรุณาให้แน่ใจว่าไฟล์ที่จำเป็นทั้งหมดมีอยู่และลองซิงค์อีกครั้ง", + "ORG_ZSTACK_SNS_10041": "หมายเลขโทรศัพท์คลาวด์[%s] มีอยู่แล้ว", + "ORG_ZSTACK_SNS_10040": "ที่อยู่อีเมลไม่ถูกต้อง[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10005": "ไม่พบโฮสต์ที่เชื่อมต่อในคลัสเตอร์ที่ที่จัดเก็บข้อมูลหลัก [uuid: %s] ถูกแนบอยู่", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10004": "ไม่สามารถยืนยันที่จัดเก็บข้อมูลสำรองที่ระบุด้วย UUIDs: %s เนื่องจากข้อผิดพลาด: %s", + "ORG_ZSTACK_MONITORING_10004": "ไม่พบประเภทสำหรับทรัพยากร[uuid:%s]", + "ORG_ZSTACK_MONITORING_10005": "ไม่พบเมตริกการตรวจวัดสำหรับทรัพยากรประเภท[%s] และรายการ[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10002": "ไม่สามารถจัดสรรที่จัดเก็บข้อมูลสำรองที่ระบุด้วย UUIDs: %s เนื่องจากข้อจำกัดของทรัพยากรหรือ UUIDs ไม่ถูกต้อง: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10000": "วิเคราะห์เวลาสร้างข้อผิดพลาด: %s", + "ORG_ZSTACK_MONITORING_10000": "ไม่พบทริกเกอร์การตรวจวัด[uuid:%s] อาจถูกลบหรือปิดใช้งานแล้ว", + "ORG_ZSTACK_MONITORING_10001": "ไม่พบการดำเนินการทริกเกอร์การตรวจวัด[uuid:%s] อาจถูกลบหรือเพิกถอนแล้ว", + "ORG_ZSTACK_MONITORING_10002": "ทรัพยากร[ประเภท:%s] ไม่มีเมตริกการตรวจวัดใดๆ", + "ORG_ZSTACK_MONITORING_10003": "ทรัพยากรที่มี UUID [%s] ไม่ได้เป็นของบัญชีที่มี UUID [%s]", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10002": "อินสแตนซ์[%s] ไม่ได้เชื่อมโยงกับกลุ่มใด", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10001": "อินสแตนซ์[%s] ถูกกำหนดให้กับกลุ่มแล้ว", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10003": "กลุ่มการตรวจวัด [%s] ไม่ได้เชื่อมโยงกับเทมเพลตการตรวจวัด", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10006": "ถึงขีดจำกัดอินสแตนซ์สำหรับกลุ่มแล้ว กรุณายุติการทำงานของอินสแตนซ์ที่มีอยู่หรือติดต่อฝ่ายสนับสนุนเพื่อเพิ่มขีดจำกัด", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10001": "เนื้อหาของเอาต์พุตไม่รองรับค่า JSON null! กรุณาให้แน่ใจว่าฟิลด์ทั้งหมดถูกกำหนดอย่างถูกต้องและไม่เป็นค่า null", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10005": "กฎเทมเพลตถึงขีดจำกัดสูงสุดของรายการ %d แล้ว พิจารณาขยายเทมเพลตของคุณหรือติดต่อฝ่ายสนับสนุนเพื่อขอความช่วยเหลือ", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10000": "เฉพาะบริการที่เป็น cloud-native เท่านั้นที่อนุญาตใน Outputs, แต่พบ %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10016": "ประเภททรัพยากรต้องเป็นสตริง!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10014": "เนื้อหารากของ Mappings ต้องเป็นออบเจกต์ JSON!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10018": "ข้อมูลเมตาของรากทรัพยากรต้องเป็นออบเจกต์ JSON!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10023": "เนื้อหาของ Parameters ไม่สนับสนุนค่า null!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10022": "ชื่อ parameter ไม่ได้รับการสนับสนุน: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10020": "paramName ต้องพบในผลลัพธ์ของ CloudFormation JSON template มิฉะนั้นจะถือว่าไม่ถูกต้อง", + "ORG_ZSTACK_ZQL_AST_VISITORS_10001": "entity ว่างเปล่า ไม่สามารถกำหนด TableName ได้", + "ORG_ZSTACK_FAULTTOLERANCE_10004": "ล้มเหลวในการจัดสรรพอร์ตบนโฮสต์[uuid: %s]", + "ORG_ZSTACK_ZQL_AST_VISITORS_10000": "เงื่อนไขการ join หายไปสำหรับตาราง %s ในคำถามของคุณ โปรดตรวจสอบว่าคุณได้ระบุเงื่อนไขการ join อย่างถูกต้อง", + "ORG_ZSTACK_ZQL_AST_VISITORS_10003": "รายการฟิลด์ว่างเปล่า ดังนั้นเราไม่สามารถดึงชื่อคอลัมน์ได้ โปรดตรวจสอบว่ารายการฟิลด์ของคุณมีข้อมูลที่จำเป็น", + "ORG_ZSTACK_ZQL_AST_VISITORS_10002": "entity ว่างเปล่า ไม่สามารถดึง columnName ได้", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10005": "Mapping body ไม่สนับสนุนค่าที่ไม่ใช่ map!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10004": "[%s] ไม่ถูกต้องใน CloudFormation Outputs!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10003": "Description ใน Outputs ต้องเป็นประเภท String!", + "ORG_ZSTACK_FAULTTOLERANCE_10009": "ไม่สามารถย้าย ft secondary VM[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10008": "ไม่สามารถเริ่มต้นเครื่องเสมือนรองได้เนื่องจากเครื่องเสมือนหลักยังคงอยู่ในสถานะหยุด โปรดตรวจสอบว่า VM หลักกำลังทำงานอยู่ก่อนเริ่มต้น VM รอง", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10009": "ค่าทรัพยากร body ไม่สนับสนุนค่า null! โปรดตรวจสอบว่าพารามิเตอร์ทรัพยากรทั้งหมดได้รับการเริ่มต้นอย่างถูกต้องก่อนการติดตั้ง", + "ORG_ZSTACK_ZQL_AST_VISITORS_10004": "ฟังก์ชันที่ระบุไม่สามารถเป็น null ได้ โปรดตรวจสอบว่าฟังก์ชันได้รับการเริ่มต้นอย่างถูกต้องก่อนการใช้งาน", + "ORG_ZSTACK_FAULTTOLERANCE_10007": "ไม่สามารถดึง host UUID ของ VM หลัก [uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10008": "ทรัพยากร %s ไม่สามารถขึ้นอยู่กับตัวเองได้ โปรดตรวจสอบการอ้างอิงตัวเองในทรัพยากร [%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10005": "จำนวนพอร์ตที่จัดสรรน้อยกว่าที่ร้องขอบนโฮสต์[uuid: %s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10006": "Mapping body ไม่สนับสนุนค่า null! โปรดตรวจสอบว่าฟิลด์ JSON ทั้งหมดได้รับการกำหนดอย่างถูกต้องและไม่เป็น null", + "ORG_ZSTACK_SNS_10009": "uuid [%%s] มีอยู่แล้วในสภาพแวดล้อมคลาวด์", + "ORG_ZSTACK_SNS_10007": "ไม่พบ SNS Application Endpoint ด้วย UUID: %s อาจถูกลบไปแล้ว", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10012": "key ที่ไม่สนับสนุน [%s] ใน resource mapping [%s]", + "ORG_ZSTACK_SNS_10006": "ไม่พบ SNSApplicationPlatform[uuid:%s] อาจถูกยกเลิกไปแล้ว", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10011": "resourceName ต้องพบในผลลัพธ์ของ template หรือไม่ถูกต้องตาม CloudFormation JSON", + "ORG_ZSTACK_SNS_10005": "ประเภท endpoint ที่ระบุ %s ไม่พบ โปรดตรวจสอบว่าได้ระบุประเภท endpoint ที่ถูกต้อง", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10010": "resource keys ที่ไม่สนับสนุน: %s", + "ORG_ZSTACK_SNS_10003": "ไม่พบ SNS Topic ด้วย UUID:%s อาจถูกลบไปแล้ว", + "ORG_ZSTACK_SNS_10002": "เอ็นพอยต์ของแอปพลิเคชันถูกปิดใช้งาน กรุณาตรวจสอบการตั้งค่าการกำหนดค่าของคุณหรือติดต่อฝ่ายสนับสนุนเพื่อขอความช่วยเหลือ", + "ORG_ZSTACK_SNS_10001": "แพลตฟอร์มของแอปพลิเคชันถูกปิดใช้งาน กรุณาติดต่อผู้ดูแลระบบของคุณเพื่อเปิดใช้งาน หรือตรวจสอบเอกสารเพื่อดูทางเลือกที่มีอยู่", + "ORG_ZSTACK_SNS_10000": "หัวข้อ %s ไม่ได้ถูกใช้งานโดยเอ็นพอยต์ที่สมัครรับข้อมูลใดๆ", + "ORG_ZSTACK_CLOUDFORMATION_10002": "รูปแบบเวอร์ชันของ ZStack Template ไม่ถูกต้อง: [%s, คาดหวังเวอร์ชันคือ %s]", + "ORG_ZSTACK_CLOUDFORMATION_10001": "เทมเพลตต้องมีตัวทำเครื่องหมาย ZStackTemplateFormatVersion", + "ORG_ZSTACK_CLOUDFORMATION_10000": "เรียกดูองค์ประกอบ null ในเนื้อหาเทมเพลต เนื้อหาเทมเพลตอาจอ้างถึงทรัพยากรคลาวด์หรือการกำหนดค่าเครื่องเสมือน โปรดตรวจสอบให้แน่ใจว่าองค์ประกอบทั้งหมดถูกกำหนดและเริ่มต้นอย่างถูกต้อง", + "ORG_ZSTACK_CLOUDFORMATION_10009": "เทมเพลต [%s] ถูกปิดใช้งานในสภาพแวดล้อมการจำลองเสมือน", + "ORG_ZSTACK_CLOUDFORMATION_10008": "ResourceStackVO [%s] ถูกลบไปแล้ว!", + "ORG_ZSTACK_CLOUDFORMATION_10007": "ResourceStackVO: [%s] ถูกยกเลิกแล้ว...", + "ORG_ZSTACK_CLOUDFORMATION_10005": "ไม่พบ UUID ของสแต็คสำหรับอินสแตนซ์ VM[%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10035": "ไม่สามารถจองความจุของโฮสต์สำหรับโฮสต์ผู้สมัครทั้งหมดได้ โปรดตรวจสอบความพร้อมของโฮสต์เป้าหมายและตรวจสอบให้แน่ใจว่ามีทรัพยากรเพียงพอที่จะตอบสนองข้อกำหนดการจอง", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10034": "[การจัดสรรโฮสต์]: %s บนโฮสต์[uuid:%s] ลองจัดสรรไปยังโฮสต์ถัดไป %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10037": "หลังจากกรอง HostAllocatorFilterExtensionPoint[%s] ส่งคืนศูนย์โฮสต์ผู้สมัคร แสดงว่า: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10036": "ไม่พบโฮสต์ที่ตรงกับเกณฑ์ที่ระบุ", + "ORG_ZSTACK_CLOUDFORMATION_10025": "คาดหวังสถานะ %s!", + "ORG_ZSTACK_EXPON_10002": "คำขอแบบเลขชี้กำลังล้มเหลว รหัส %s ข้อความ: %s", + "ORG_ZSTACK_EXPON_10003": "ไม่พบวอลุม [ชื่อ:%s] หลังจากคัดลอกสแนปช็อต", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10000": "เราเตอร์เสมือน[ชื่อ: %s, uuid: %s] ล้มเหลวในการกำหนดค่า DNS%s, %s", + "ORG_ZSTACK_CLOUDFORMATION_10022": "รีสตาร์ทรีซอร์สสแต็ครองรับเฉพาะสถานะ %s เท่านั้น!", + "ORG_ZSTACK_CLOUDFORMATION_10021": "ไม่พบรีซอร์สสแต็คที่มี uuid [%s]", + "ORG_ZSTACK_CLOUDFORMATION_10020": "ไม่พบที่อยู่ IP เริ่มต้นบนเครื่องเสมือน[%s]", + "ORG_ZSTACK_CLOUDFORMATION_10028": "templateContent และ url ต้องไม่ว่างเปล่าทั้งคู่หรือไม่ถูกตั้งค่าพร้อมกัน!", + "ORG_ZSTACK_CLOUDFORMATION_10026": "templateContent และ templateUuid ต้องไม่ว่างเปล่าทั้งคู่!", + "ORG_ZSTACK_HYBRID_ACCOUNT_10000": "keyType ไม่รองรับประเภท [%s]", + "ORG_ZSTACK_HYBRID_ACCOUNT_10002": "คีย์: [%s] ที่มีประเภท: [%s] มีอยู่แล้วสำหรับ UUID ของบัญชี: [%s]", + "ORG_ZSTACK_HYBRID_ACCOUNT_10003": "พารามิเตอร์ [accountUuid] สามารถใช้ได้เฉพาะโดยผู้ใช้ผู้ดูแลระบบเท่านั้น!", + "ORG_ZSTACK_HYBRID_ACCOUNT_10004": "คีย์: [%s] มีอยู่แล้วสำหรับ UUID ของบัญชี: [%s]", + "ORG_ZSTACK_CLOUDFORMATION_10014": "ต้องตั้งค่าเนื้อหาโดย template content หรือ URL!", + "ORG_ZSTACK_CLOUDFORMATION_10013": "ไม่สามารถลบหรืออัปเดตเทมเพลตระบบได้: %s", + "ORG_ZSTACK_CLOUDFORMATION_10012": "StackTemplateVO ถูกลบออกจากคลังเทมเพลตคลาวด์แล้ว โปรดตรวจสอบและอัปโหลดเทมเพลตใหม่", + "ORG_ZSTACK_CLOUDFORMATION_10011": "ไม่พบพารามิเตอร์สำหรับ %s ซึ่งเป็นประเภท %s กรุณาตรวจสอบพารามิเตอร์", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10002": "ไม่สามารถแนบ hardware VXLAN pool ได้เนื่องจาก: %s", + "ORG_ZSTACK_CLOUDFORMATION_10010": "ต้องระบุ templateContent!", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10003": "ไม่สามารถสร้าง L2 hardware VXLAN network โดยไม่ระบุ VLAN ID", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10000": "ไม่สามารถแนบ level 2 network ไปยัง cluster ได้เนื่องจาก host[uuid:%s] ไม่มี virtual interface[name:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10001": "ไม่สามารถแนบ hardware VXLAN pool ได้เนื่องจากไม่พบ switch port สำหรับ host[uuid:%s]", + "ORG_ZSTACK_CLOUDFORMATION_10019": "ไม่พบชื่อ l2 bridge ของ l2[%s] จาก systemTag", + "ORG_ZSTACK_CLOUDFORMATION_10018": "ต้องตั้งค่าพารามิเตอร์ filterName เป็น cloudformation:true หรือ cloudformation:false", + "ORG_ZSTACK_CLOUDFORMATION_10017": "StackTemplateVO: [%s] ถูกลบออกจาก cloud repository แล้ว...", + "ORG_ZSTACK_CLOUDFORMATION_10016": "เวอร์ชัน CloudFormation template ไม่ถูกต้อง: %s", + "ORG_ZSTACK_CLOUDFORMATION_10015": "ไม่สามารถดึงข้อมูล input สำหรับ cloud resource ได้ กรุณาตรวจสอบว่าไฟล์ต้นทางถูกอัปโหลดและกำหนดค่าอย่างถูกต้อง", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10006": "ไม่สามารถสร้าง Huawei iMaster SDN VXLAN network โดยไม่ระบุ VPC ID", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10007": "ไม่สามารถเพิ่ม vni range เนื่องจาก vni range ที่ระบุ [%d-%d] ไม่ถูกต้อง", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10004": "ไม่สามารถสร้าง Huawei iMaster SDN VXLAN network เนื่องจาก VLAN ID [%s] อยู่นอกช่วงที่อนุญาต: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10005": "ไม่สามารถสร้าง Huawei iMaster SDN VXLAN network โดยไม่มี vpcId และ tenantId", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10009": "ไม่สามารถเพิ่ม Huawei iMaster SDN Controller ไปยัง network โดยไม่ระบุ VLAN range", + "ORG_ZSTACK_NETWORK_L2_10013": "ไม่สามารถแก้ไข VLAN สำหรับ L2 Network [UUID:%s] เนื่องจากยังมี host ที่อยู่ในสถานะ connecting หรือ disconnected", + "ORG_ZSTACK_NETWORK_L2_10012": "ประเภท virtual switch ไม่รองรับ[%s]", + "ORG_ZSTACK_NETWORK_L2_10015": "ไม่สามารถแก้ไข VLAN สำหรับ l2Network[uuid:%s] เนื่องจาก network นี้ถูกแยกออก", + "ORG_ZSTACK_NETWORK_L2_10014": "ไม่สามารถแก้ไข VLAN สำหรับ l2Network[uuid:%s] เนื่องจากถูกจำกัดไว้สำหรับ KVM cluster เท่านั้น", + "ORG_ZSTACK_NETWORK_L2_10017": "vlan[%s] ไม่ถูกต้องสำหรับการกำหนดค่า cloud network", + "ORG_ZSTACK_NETWORK_L2_10016": "vlan จำเป็นสำหรับ ChangeL2NetworkVlanId ที่มีประเภท[%s]", + "ORG_ZSTACK_NETWORK_L2_10019": "vLAN ไม่ได้รับอนุญาตสำหรับ ChangeL2NetworkVlanId ที่มีประเภท[%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10000": "ไม่มี candidate host ที่มีเวอร์ชัน[%s] พร้อมสำหรับ deployment", + "ORG_ZSTACK_NETWORK_L2_10018": "มี L2 network แนบอยู่กับ cluster ที่มี virtual network ID [%s] และ physical interface [%s] แล้ว ไม่สามารถเปลี่ยน L2 network [uuid: %s] ได้", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10083": "พบ SimpleHttpBackupStorage ที่มี hostname[%s] อยู่แล้ว", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10082": "URL[%s] ไม่ถูกต้อง, URL ต้องเป็น absolute path ที่ขึ้นต้นด้วย '/'", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10080": "พาธของไฟล์มีอักขระที่ไม่ถูกต้อง: %s", + "ORG_ZSTACK_NETWORK_L2_10020": "ไม่สามารถแก้ไข l2Network [uuid:%s] ที่แนบอยู่กับ cluster ที่มี physical interface [%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10079": "URL มี path ที่ไม่ถูกต้อง [/dev หรือ /proc หรือ /sys] ซึ่งไม่รองรับในสภาพแวดล้อม cloud computing กรุณาใช้ path ที่ถูกต้องสำหรับคำขอของคุณ", + "ORG_ZSTACK_CLOUDFORMATION_10034": "templateContent และ uuid ต้องไม่ว่างทั้งคู่หรือถูกตั้งค่าทั้งคู่!", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10078": "ต้องการเส้นทางแบบ absolute ไปยังไฟล์ต้นฉบับ: %s", + "ORG_ZSTACK_NETWORK_L2_10006": "เครือข่าย L2 ที่มี UUID: %s และชื่อ: %s ถูกแนบไปยังคลัสเตอร์ที่มี UUID: %s ซึ่งเชื่อมโยงกับอินเทอร์เฟซทางกายภาพ [%s] แล้ว ไม่สามารถแนบเครือข่าย L2 ที่มี UUID: %s ได้", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10077": "ต้องการเส้นทางไฟล์ต้นฉบับเพื่อดำเนินการตรวจสอบหรือแก้ไขโค้ด โปรดระบุเส้นทางไฟล์", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10076": "พบ backup storage ซ้ำ มี image store backup storage อยู่แล้ว [hostname:%s]", + "ORG_ZSTACK_NETWORK_L2_10008": "l2Network [UUID: %s] ถูกเชื่อมโยงกับคลัสเตอร์ [UUID: %s] และไม่สามารถกำหนดใหม่ได้", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10075": "hostname[%s] ไม่ใช่ชื่อ DNS หรือที่อยู่ IP ที่ถูกต้อง", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10011": "DiskOfferingTagAllocatorExtensionPoint[%s] ส่งคืน host ผู้สมัครเป็นศูนย์", + "ORG_ZSTACK_CLOUDFORMATION_10030": "เฉพาะผู้ดูแลระบบเท่านั้นที่มีสิทธิ์เปิดใช้งานหรือปิดใช้งาน StackTemplate ของระบบ", + "ORG_ZSTACK_NETWORK_L2_10007": "มี L2 Vlan Network [uuid:%s, name:%s] ที่ถูกแนบไปยังคลัสเตอร์ [uuid:%s] ซึ่งมีอินเทอร์เฟซทางกายภาพ [%s] และ VLAN [%s] อยู่แล้ว ไม่สามารถแนบ L2 Vlan Network [uuid:%s] ได้", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10010": "InstanceOfferingTagAllocatorExtensionPoint[%s] ส่งคืน host ผู้สมัครเป็นศูนย์", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10073": "backup storage ต้นทางไม่มี image[%s]", + "ORG_ZSTACK_NETWORK_L2_10009": "ไม่สามารถแนบเครือข่าย L2 ได้เนื่องจากมีเครือข่ายอื่นที่มี vSwitch type ต่างกันบนอินเทอร์เฟซทางกายภาพ %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10072": "storage ต้นทาง[%s] ไม่มี image[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10071": "backup storage เป้าหมาย [uuid:%s] มี image [uuid:%s] อยู่แล้ว", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10070": "ลบไฟล์ metadata ของ image ไม่สำเร็จ: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10009": "backup storage [UUID: %s, type: %s] ต้องการ primary storage ที่ถูก bind แต่ยังไม่มี primary storage ที่ถูกเพิ่ม", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10001": "image ที่มี UUID [uuid:%s] และชื่อ [name:%s] ถูกลบออกจาก backup storage ทั้งหมดแล้ว", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10004": "resource binding ยังไม่รองรับ type %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10003": "ไม่พบ host ใน zones[uuids:%s] ที่แนบไปยัง backup storage ซึ่งมี image[%s] อยู่", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10005": "ไม่พบ host ที่มี available พร้อม bound resource %s", + "ORG_ZSTACK_NETWORK_L2_10011": "ไม่รองรับ l2Network type[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10003": "virtual router[uuid:%s, ip:%s] ล้มเหลวในการตั้งค่า DNS%s สำหรับ L3 Network[uuid:%s, name:%s], %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10008": "image[uuid:%s] อยู่บน backup storage[uuid:%s, type:%s] ซึ่งต้องการปฏิสัมพันธ์กับ primary storage[uuid:%s] แต่ไม่พบ host ที่เหมาะสมเพื่ออำนวยความสะดวกในการปฏิสัมพันธ์นี้", + "ORG_ZSTACK_NETWORK_L2_10010": "l2Network[uuid:%s] ยังไม่ได้ถูกแนบไปยังคลัสเตอร์[uuid:%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10007": "image[uuid:%s, name:%s] ถูกเก็บบน backup storage[uuid:%s, type:%s] ซึ่งต้องการ primary storage ของ types %s แต่ไม่พบ host ที่มี primary storage ที่เข้ากันได้", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10068": "ตรวจสอบไฟล์ metadata ของ image: %s ไม่สำเร็จ", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10066": "สร้างไฟล์ metadata ของ image: %s ไม่สำเร็จ", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10065": "สร้าง synchronization ของ metadata ของ image ไม่สำเร็จ: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10022": "ไม่พบ root volume ของ instance[uuid:%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10021": "ไม่พบโฮสต์ที่มี CPU[%s], หน่วยความจำ[%s ไบต์] ว่าง", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10000": "ไม่สามารถแนบ EIP ได้เนื่องจากไม่มีเกตเวย์สำหรับอินเทอร์เฟซเครือข่าย [uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10062": "ห้าม AddImage ใน Disaster Recovery BS: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10001": "L2Network ที่ VIP's L3Network อ้างอิงอยู่ยังไม่ได้แนบไปยังคลัสเตอร์ที่ vmNic[uuid:%s] อยู่", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10002": "ไม่สามารถผูกมากกว่า 1 EIP กับ VM NIC ที่มี UUID:%s ประเภท flat ได้", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10060": "ขาดเส้นทางอิมเมจบนอินสแตนซ์[%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10015": "ไม่พบพื้นที่จัดเก็บหลักที่พร้อมใช้งาน [สถานะ: %s, สถานะ: %s, ความจุว่าง %d ไบต์] โปรดตรวจสอบสถานะของพื้นที่จัดเก็บหลักและตรวจสอบว่าได้แนบไปยังคลัสเตอร์แล้ว", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10014": "ไม่พบโฮสต์ในคลัสเตอร์ที่แนบกับพื้นที่จัดเก็บหลัก %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10016": "ไม่พบพื้นที่จัดเก็บหลักที่พร้อมใช้งาน [สถานะ: %s หรือ %s, สถานะ: %s] โปรดตรวจสอบสถานะของพื้นที่จัดเก็บหลักและตรวจสอบว่าได้แนบไปยังคลัสเตอร์แล้ว", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10031": "ไม่พบโฮสต์ที่เปิดใช้งานในรายการโฮสต์ตัวเลือก [%s] ที่มีประเภทไฮเปอร์ไวเซอร์ [%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10030": "ไม่พบโฮสต์ที่เปิดใช้งานในรายการโฮสต์ตัวเลือก [%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10033": "ไม่พบโฮสต์ที่มีสถานะ=เปิดใช้งาน และสถานะ=เชื่อมต่อ", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10032": "ไม่พบโฮสต์ที่มีสถานะ=เปิดใช้งาน สถานะ=เชื่อมต่อ hypervisorType=%s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10012": "ไม่พบออบเจกต์ %s ในบัคเก็ต %s", + "ORG_ZSTACK_UTILS_10000": "ล้มเหลวในการสร้าง access secret สำหรับอินสแตนซ์เครื่องเสมือน %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10024": "ต้องระบุ volume UUID หรือ volume snapshot UUID", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10023": "ไม่พบโฮสต์ในคลัสเตอร์ที่แนบกับพื้นที่จัดเก็บหลัก %s ทั้งหมดซึ่ง volumes ของ VM[UUID:%s] อยู่", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10026": "หลังจากคัดออกโฮสต์ที่หลีกเลี่ยงแล้ว ไม่มีตัวเลือกเหลืออยู่ในพูล", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10025": "zoneUuids, clusterUuids และ hostUuids ต้องมีรายการที่ไม่ว่างเปล่าอย่างน้อยหนึ่งรายการ หรือค่าทั้งหมดต้องตั้งค่าเป็น true", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10015": "Aliyun EBS Backup Storage ไม่รองรับการคำนวณแฮชของอิมเมจ", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10027": "ไม่พบโฮสต์ในคลัสเตอร์ที่แนบกับ L2Networks ซึ่งมี L3Networks%s ที่เกี่ยวข้อง", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10029": "ไม่พบโฮสต์ที่เชื่อมต่อในรายการโฮสต์ตัวเลือก [%s]", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10005": "กรุณาเลือกกลยุทธ์การกระจายโหลด คุณต้องตั้งค่าประเภทอัลกอริทึม", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10008": "ไม่พบโฮสต์ที่มีเครื่องเสมือนน้อยกว่า %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10022": "บัญชี [UUID:%s] ไม่มีสิทธิ์เข้าถึงทรัพยากร [UUID:%s, type:L3NetworkVO]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10024": "เปลี่ยน IP เซิร์ฟเวอร์ DHCP เป็น [%s] แต่ได้รับ [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10025": "UUID ของ L3 Network ไม่สามารถเป็นค่าว่างได้", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10003": "การตั้งค่าผู้ให้บริการคลาวด์ไม่ถูกต้อง ค่าที่ถูกต้องคือ %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10021": "UUID ของเซสชัน/บัญชีไม่ถูกต้อง โปรดตรวจสอบและลองอีกครั้ง", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10000": "ต้องกำหนดค่า Ocean endpoint URL สำหรับ Alibaba Cloud EBS backup storage", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10017": "ไม่สามารถดำเนินการ EIP สำหรับ VM[uuid:%s, state:%s] ได้ เนื่องจากไม่พบ hostUUID", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10009": "Aliyun EBS Backup Storage ไม่รองรับการยกเลิกกระบวนการดาวน์โหลดรูปภาพ", + "ORG_ZSTACK_CORE_TIMEOUT_10000": "api timeout ไม่สามารถตั้งค่าน้อยกว่า %s มิลลิวินาที", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10002": "ไม่สามารถลบ OSS bucket [%s] ได้ เนื่องจากยังมี Aliyun EBS Backup Storage instances อยู่ โปรดตรวจสอบว่าลบ backup storage instances ที่เกี่ยวข้องทั้งหมดแล้ว", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10004": "primary storage ปัจจุบันไม่รองรับประเภทโปรโตคอลที่ระบุ โปรดตรวจสอบว่าได้เพิ่มโปรโตคอลใน storage แล้ว", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10003": "พารามิเตอร์ [protocol] เป็นค่าว่าง สำหรับ primary storage ประเภท [%s] ต้องระบุ block volume protocol", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10000": "ข้อผิดพลาดเส้นทางทรัพยากร cloud: โปรดตรวจสอบตำแหน่งและการมีอยู่ของไฟล์", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10002": "ชื่อ: [%s] มีอยู่แล้ว ชื่อ block volume ต้องไม่ซ้ำกันภายใน primary storage ประเภท [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10010": "ไม่สามารถดึง DHCPv6 server IP สำหรับ Layer 3 network [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10009": "ไม่สามารถดึง DHCPv4 server IP สำหรับ layer 3 network [uuid:%s]", + "ORG_ZSTACK_POLICYROUTE_10029": "ไม่สามารถลบ system policy route table ได้", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10005": "host[uuid:%s] ไม่ได้ถูก provision", + "ORG_ZSTACK_POLICYROUTE_10027": "ไม่สามารถลบ system-defined policy route set ได้ โปรดตรวจสอบว่า route set นี้ไม่ถูกใช้งานโดยทรัพยากรที่ใช้งานอยู่ก่อนการลบ", + "ORG_ZSTACK_POLICYROUTE_10028": "ไม่พบ virtual router instance ที่เชื่อมโยง โปรดตรวจสอบว่า virtual router ถูกกำหนดค่าอย่างถูกต้องและพร้อมใช้งาน", + "ORG_ZSTACK_POLICYROUTE_10025": "ruleSet[%s] ยังเชื่อมโยงกับ network interface card (NIC) อยู่", + "ORG_ZSTACK_POLICYROUTE_10020": "VRouter[%s] มี policy-based route table [%s] อยู่แล้ว", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10044": "สามารถแก้ไข DHCP server IP ได้เฉพาะเมื่อเปิดใช้งาน flat DHCP", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10045": "ไม่สามารถแก้ไข DHCP server IP ได้เนื่องจาก %s ไม่ใช่เจ้าของ Layer 3 network[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10046": "ไม่สามารถเปลี่ยน DHCPv4 server IP ได้เนื่องจากไม่มีการกำหนดค่า IPv4 address range", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10047": "สามารถตั้ง DHCP v4 server IP ได้เนื่องจาก IP [%s] ที่ให้มาไม่ใช่ CIDR ที่ถูกต้องสำหรับ L3 network [%s]", + "ORG_ZSTACK_IDENTITY_RBAC_10011": "operation[API:%s] ถูกปฏิเสธตามค่าเริ่มต้นด้วยเหตุผลด้านความปลอดภัย โปรดติดต่อผู้ดูแลระบบเพื่อแก้ไข", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10041": "สามารถตั้ง DHCPv6 server IP ได้เนื่องจากไม่มีการกำหนดค่า IPv6 range", + "ORG_ZSTACK_IDENTITY_RBAC_10012": "การดำเนินการถูกปฏิเสธโดย policy [name: %s uuid: %s]", + "ORG_ZSTACK_IDENTITY_RBAC_10013": "การดำเนินการถูกปฏิเสธโดย policy[name:%s, uuid:%s], ฟิลด์[%s] ไม่ได้รับอนุญาตให้แก้ไข", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10037": "ไม่สามารถลบ ip address ได้ เนื่องจาก ip [%s] เป็น DHCP server IP address", + "ORG_ZSTACK_POLICYROUTE_10018": "ไม่สามารถอัปเดต system policy route set ได้ โปรดตรวจสอบว่าคุณมีสิทธิ์ที่จำเป็นและลองอีกครั้ง", + "ORG_ZSTACK_POLICYROUTE_10019": "ไม่สามารถอัปเดต system policy-based route table ได้ โปรดตรวจสอบว่าคุณมีสิทธิ์ที่จำเป็นและลองอีกครั้ง", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10039": "สามารถตั้ง DHCPv4 server IP ได้เนื่องจากไม่มีการกำหนดค่า IPv4 address range", + "ORG_ZSTACK_POLICYROUTE_10017": "ไม่พบ Virtual Router ที่เชื่อมโยง", + "ORG_ZSTACK_POLICYROUTE_10014": "ประเภทโปรโตคอล %s ไม่ถูกต้อง", + "ORG_ZSTACK_POLICYROUTE_10015": "RuleSet[%s] มีกฎหมายเลข %s อยู่แล้ว", + "ORG_ZSTACK_POLICYROUTE_10013": "การดำเนินการล้มเหลว รูปแบบ IP รองรับเฉพาะ IPv4/IP range/CIDR แต่พบ %s", + "ORG_ZSTACK_POLICYROUTE_10010": "NextHopIp ต้องอยู่ในรูปแบบ IPv4 แต่พบ [%s]", + "ORG_ZSTACK_CORE_REST_10012": "ไม่สามารถดึงข้อมูล %s ภายใน %sms", + "ORG_ZSTACK_QUERY_10021": "field[%s] ไม่ใช่ primitive ของ inventory %s; คุณไม่สามารถระบุในพารามิเตอร์ 'fields'; valid fields คือ %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10034": "DHCP server IP [%s] มีอยู่แล้วใน L3 network [%s]", + "ORG_ZSTACK_QUERY_10020": "entity metadata class[%s] ขาด field[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10035": "DHCP server IP [%s] ต้องไม่เท่ากับ gateway IP", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10036": "DHCP server IP [%s] ไม่สามารถกำหนดค่าใน system L3 network settings", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10030": "DHCP server IP address [%s] ไม่ใช่ IPv4 address ที่ถูกต้อง", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10031": "DHCP server IP [%s] ไม่อยู่ใน CIDR ที่ระบุ [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10032": "DHCP server IP [%s] ไม่ใช่ IPv6 address ที่ถูกต้อง", + "ORG_ZSTACK_IDENTITY_RBAC_10004": "คุณไม่มีสิทธิ์ในการแก้ไข system role หรือ predefined role กรุณาติดต่อผู้ดูแลระบบเพื่อขอความช่วยเหลือ", + "ORG_ZSTACK_POLICYROUTE_10009": "DestinationCidr ต้องอยู่ในรูปแบบ CIDR แต่พบ [%s]", + "ORG_ZSTACK_IDENTITY_RBAC_10007": "permission denied, account [uuid:%s] ไม่มีสิทธิ์เข้าถึง resource [uuid:%s, type:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10027": "ไม่สามารถกำหนดค่า DHCP สำหรับ virtual machine [uuid:%s] บน destination host [uuid:%s]", + "ORG_ZSTACK_IDENTITY_RBAC_10008": "permission denied, account [uuid:%s] ไม่มีสิทธิ์จัดการ tagged resource [uuid:%s, type:%s]", + "ORG_ZSTACK_POLICYROUTE_10008": "VRouter[%s] มี rule set ชื่อ %s อยู่แล้ว", + "ORG_ZSTACK_IDENTITY_RBAC_10005": "คุณไม่มีสิทธิ์ในการลบ system role หรือ predefined role กรุณาติดต่อผู้ดูแลระบบเพื่อขอความช่วยเหลือ", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10029": "minimum IP range prefix length สำหรับ flat network คือ %d", + "ORG_ZSTACK_POLICYROUTE_10003": "l3[%s] มี attached policy route rule set อยู่แล้ว", + "ORG_ZSTACK_IDENTITY_RBAC_10009": "Account [UUID:%s] ไม่มีสิทธิ์เข้าถึง resources [UUID:%s, Type:%s]", + "ORG_ZSTACK_POLICYROUTE_10000": "ไม่สามารถแก้ไข Default route network ได้เมื่อ system policy routes เปิดใช้งานอยู่", + "ORG_ZSTACK_QUERY_10018": "condition name[%s] ไม่ถูกต้อง, ไม่พบ field ใน inventory class[%s]", + "ORG_ZSTACK_QUERY_10017": "\"value\" ของ query condition %s ไม่สามารถเป็น null สำหรับ cloud resource filtering", + "ORG_ZSTACK_QUERY_10015": "filterName ต้องอยู่ในรูปแบบ [filterType:condition(s)]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_10000": "สร้าง ocean API signature string ล้มเหลว: %s", + "ORG_ZSTACK_QUERY_10019": "condition name[%s] ไม่ถูกต้อง: field[%s] ของ inventory[%s] ถูก annotate เป็น @UnqueryableField", + "ORG_ZSTACK_ALIYUN_PANGU_10001": "appName: %s, partitionName: %s มีอยู่แล้วใน identityZone: %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10050": "ไม่สามารถตั้งค่า DHCP server IP ได้ เพราะ IP[%s] ถูกจองไว้แล้ว", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10051": "ไม่สามารถตั้งค่า DHCPv6 server IP ได้เพราะ IP[%s] ถูกใช้งานอยู่", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10053": "การจัดสรร IP ของ DHCP server ล้มเหลว.%s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10048": "ไม่สามารถเปลี่ยน DHCPv6 server IP ได้เพราะไม่มีช่วง IPv6 ที่กำหนดค่า", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10049": "ไม่สามารถตั้งค่า DHCPv6 server IP ได้เพราะ IP[%s] ไม่ใช่ CIDR ที่ถูกต้องสำหรับ L3 network [%s]", + "ORG_ZSTACK_USBDEVICE_10026": "กรุณาถอด USB devices ทั้งหมดจาก VM[%s] แล้วลองใหม่อีกครั้ง", + "ORG_ZSTACK_USBDEVICE_10025": "ไม่สามารถถอด USB device[uuid:%s] ได้ขณะที่มันถูกต่อกับ VM instance", + "ORG_ZSTACK_USBDEVICE_10024": "VM instance [uuid:%s] ไม่อยู่ในสถานะที่สามารถต่อ USB device ได้ %s", + "ORG_ZSTACK_USBDEVICE_10023": "VM instance ที่ USB device [uuid:%s] ต่ออยู่ไม่อยู่ในสถานะที่สามารถถอดได้: %s", + "ORG_ZSTACK_USBDEVICE_10022": "USB device [UUID:%s] ไม่ได้ต่อกับ virtual machine instance ใดๆ", + "ORG_ZSTACK_USBDEVICE_10021": "Host ที่ USB device [uuid:%s] เสียบอยู่ไม่อยู่ในสถานะที่ถูกต้อง [%s] หรือ status [%s]", + "ORG_ZSTACK_USBDEVICE_10020": "VM instance[UUID:%s] ไม่อยู่ในสถานะที่สามารถต่อ USB device ได้: %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10005": "L3 Network [uuid:%s] ไม่มีอยู่", + "ORG_ZSTACK_COMPUTE_SRIOV_10006": "%s เพราะไม่มี SRIOV device ที่ใช้งานได้บน l3Network [uuid:%s] ของ host [uuid:%s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10007": "ไม่สามารถเปลี่ยน VF NIC HA state ได้เพราะ VF NIC [UUID:%s] ไม่มีอยู่", + "ORG_ZSTACK_COMPUTE_SRIOV_10008": "ไม่สามารถเปลี่ยน virtual network interface card high availability state ได้เพราะ high availability state[%s] ไม่ถูกต้อง", + "ORG_ZSTACK_COMPUTE_SRIOV_10009": "L2 Network [UUID:%s] ไม่พบ", + "ORG_ZSTACK_COMPUTE_SRIOV_10000": "ล้มเหลวในการตั้งค่า VF NIC MAC บน host[uuid:%s, ip:%s] เพราะ %s", + "ORG_ZSTACK_COMPUTE_SRIOV_10001": "ล้มเหลวในการเปลี่ยน virtual network interface card HA state, error: %s", + "ORG_ZSTACK_DRS_10000": "Cluster[%s] ได้เริ่มต้น Data Replication Service", + "ORG_ZSTACK_DRS_10002": "ค่า threshold ไม่สามารถเว้นว่างได้ กรุณาแน่ใจว่าการตั้งค่า threshold กำหนดค่าอย่างถูกต้อง", + "ORG_ZSTACK_DRS_10001": "DRS ถูกปิดสำหรับ virtual machine นี้ กรุณาแน่ใจว่า DRS ถูกเปิดใช้งานเพื่อเพิ่มประสิทธิภาพการจัดสรรทรัพยากร", + "ORG_ZSTACK_DRS_10004": "threshold operator[%s] ไม่ถูกต้อง", + "ORG_ZSTACK_DRS_10003": "threshold name[%s] ไม่ถูกต้อง", + "ORG_ZSTACK_DRS_10006": "threshold value ไม่ถูกต้อง, ช่วงที่ถูกต้อง: (0, 100]", + "ORG_ZSTACK_DRS_10005": "ค่า threshold สำหรับ cloud resource monitoring ไม่สามารถเว้นว่างได้.%s", + "ORG_ZSTACK_DRS_10008": "DRG[%s] status คือ %s", + "ORG_ZSTACK_DRS_10007": "GlobalConfig ENABLE_DRS ถูกปิด", + "ORG_ZSTACK_DRS_10009": "DRS[%s] automation level ไม่ได้ตั้งค่าเป็น manual mode", + "ORG_ZSTACK_ZWATCH_FUNCTION_10012": "value[%s] ไม่ใช่ตัวเลขจำนวนเต็มที่ถูกต้อง", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10018": "ไม่สามารถดำเนินการ API ได้ Backend network [UUID:%s] เชื่อมต่อกับ VPC router [UUID:%s] ซึ่งไม่ได้เชื่อมต่อกับ front network [UUID:%s]", + "ORG_ZSTACK_ZWATCH_FUNCTION_10011": "อาร์กิวเมนต์ไม่ถูกต้อง[limit:%s] ไม่สามารถเป็นค่าลบได้", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10019": "เครือข่ายแบ็คเอนด์ [UUID:%s] ต้องเป็นเครือข่าย VPC เนื่องจากเครือข่ายแบ็คเอนด์อื่นถูกกำหนดค่าเป็นเครือข่าย VPC", + "ORG_ZSTACK_ZWATCH_FUNCTION_10010": "อาร์กิวเมนต์ที่ไม่รู้จัก[%s]", + "ORG_ZSTACK_DRS_10020": "ไม่อนุญาตให้ลบ DRS ขณะที่ VM กำลังถูกย้าย", + "ORG_ZSTACK_DRS_10011": "ดำเนินการสำเร็จ; ไม่อนุญาตให้ทำการ deploy ซ้ำ", + "ORG_ZSTACK_DRS_10010": "คำแนะนำ[%s] หมดอายุเนื่องจากไม่มีการใช้งาน", + "ORG_ZSTACK_DRS_10013": "VM[%s] ไม่ได้อยู่ในสถานะกำลังทำงาน", + "ORG_ZSTACK_DRS_10012": "VM[%s] ถูกยุติการทำงานแล้ว", + "ORG_ZSTACK_DRS_10015": "คลัสเตอร์[%s] ไม่รองรับการปรับขนาดทรัพยากรแบบไดนามิก", + "ORG_ZSTACK_DRS_10014": "VM[%s] ไม่ได้อยู่บนโฮสต์ต้นทางอีกต่อไป[%s]", + "ORG_ZSTACK_DRS_10017": "รายการ UUID ของโฮสต์ว่างเปล่า โปรดตรวจสอบให้แน่ใจว่ามี UUID ของโฮสต์อย่างน้อยหนึ่งรายการ", + "ORG_ZSTACK_DRS_10016": "ไม่สามารถสร้างอินสแตนซ์ DRDS ได้, %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10013": "เครือข่ายแบ็คเอนด์ [uuid:%s] ต้องเป็นเครือข่าย VPC เนื่องจากเครือข่าย L3 ด้านหน้าเป็นเครือข่าย VPC", + "ORG_ZSTACK_ZWATCH_FUNCTION_10005": "อาร์กิวเมนต์ไม่ถูกต้อง[start:%s] ไม่สามารถเป็นค่าลบในสภาพแวดล้อมการประมวลผลบนคลาวด์ได้", + "ORG_ZSTACK_DRS_10019": "ไม่อนุญาตให้ใช้คำแนะนำระหว่างการจัดตารางงาน", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10014": "ไม่สามารถดำเนินการ API ได้ เครือข่ายแบ็คเอนด์ [UUID:%s] ไม่ได้เชื่อมต่อกับเราเตอร์ VPC โปรดตรวจสอบให้แน่ใจว่าเครือข่ายเชื่อมต่ออย่างถูกต้องก่อนลองอีกครั้ง", + "ORG_ZSTACK_DRS_10018": "ไม่สามารถดึงข้อมูลการใช้งานโฮสต์ได้", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10015": "เครือข่ายแบ็คเอนด์เชื่อมโยงกับเราเตอร์ VPC [uuid:%s] ในขณะที่เครือข่ายด้านหน้าเชื่อมโยงกับเราเตอร์ VPC ที่แตกต่าง [uuid:%s] โปรดตรวจสอบให้แน่ใจว่าเครือข่ายทั้งสองเชื่อมโยงกับเราเตอร์ VPC เดียวกัน", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10016": "ไม่สามารถดำเนินการ API ได้ เครือข่ายแบ็คเอนด์ [uuid:%s] ต้องเป็นเครือข่าย flat ส่วนตัวเนื่องจากเครือข่าย L3 ด้านหน้าเป็นเครือข่าย flat ส่วนตัว", + "ORG_ZSTACK_ZWATCH_FUNCTION_10002": "ฟังก์ชันที่ไม่รู้จัก[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10010": "CIDR เครือข่ายแบ็คเอนด์ทับซ้อนกับ CIDR เครือข่าย L3 ด้านหน้า", + "ORG_ZSTACK_ZWATCH_FUNCTION_10008": "ค่าไม่ถูกต้อง[%s] สำหรับอาร์กิวเมนต์[%s] ในการกำหนดค่าสภาพแวดล้อมการประมวลผลบนคลาวด์", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10011": "CIDR เครือข่ายแบ็คเอนด์ [%s] ทับซ้อนกับ CIDR เครือข่าย L3 การจัดการ [%s] โปรดตรวจสอบให้แน่ใจว่าไม่มีการท", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10012": "could not execute API operation. Frontend network [UUID:%s] is not connected to the VPC router", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10001": "cannot find CEPH pool [%s] related OSD group", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10000": "required Ceph pool[uuid:%s] cannot satisfy the condition [availableSize > %d bytes], current available size %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10006": "could not create SLB instance because image [uuid:%s] has been deleted", + "ORG_ZSTACK_ZWATCH_FUNCTION_10001": "duplicate argument[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10007": "SLB instance creation failed due to reaching the maximum instance limit.", + "ORG_ZSTACK_ZWATCH_FUNCTION_10000": "missing required argument[%s] for cloud instance configuration", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10008": "ไม่สามารถสร้างกลุ่ม SLB ได้เนื่องจากประเภทเครือข่าย L3 ด้านหน้าไม่ถูกต้อง %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10009": "", + "ORG_ZSTACK_DRS_10022": "CIDR เครือข่ายด้านหน้า [%s] ทับซ้อนกับ CIDR เครือข่าย L3 การจัดการ [%s]", + "ORG_ZSTACK_DRS_10023": "", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10002": "ไม่อนุญาตให้กำหนดตำแหน่งระหว่างการย้ายเครื่องเสมือน", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10003": "", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10004": "ขาดข้อมูลการใช้งาน CPU และหน่วยความจำของโฮสต์", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10005": "", + "ORG_ZSTACK_CORE_ENCRYPT_10000": "คลาวด์ไม่สามารถลบ VIP[%s] ได้ โปรดตรวจสอบว่า SLB[uuid:%s] ถูกลบไปแล้วก่อน", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10000": "", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10001": "ไม่สามารถสร้างอินสแตนซ์ SLB ได้เนื่องจากไม่มีกลุ่ม SLB สำหรับ load balancer [uuid:%s]", + "ORG_ZSTACK_IDENTITY_10011": "", + "ORG_ZSTACK_IDENTITY_10010": "ไม่สามารถสร้างอินสแตนซ์ SLB ได้เนื่องจากไม่มีการกำหนดค่า SLB offering สำหรับกลุ่ม SLB [uuid:%s]", + "ORG_ZSTACK_IDENTITY_10016": "", + "ORG_ZSTACK_IDENTITY_10017": "ไม่สามารถสร้างอินสแตนซ์ SLB ได้เนื่องจาก UUID ของ SLB offering [uuid:%s] เป็นค่าว่าง", + "ORG_ZSTACK_IDENTITY_10001": "", + "ORG_ZSTACK_IDENTITY_10009": "ข้อผิดพลาดการเข้ารหัส : %s", + "ORG_ZSTACK_IDENTITY_10008": "", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10003": "ไม่พบ network interface ของอินสแตนซ์ SLB [uuid:%s] ที่แนบกับเครือข่าย L3 ด้านหน้าของกลุ่ม SLB [uuid:%s]", + "ORG_ZSTACK_OBSERVABILITYSERVER_10009": "", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10002": "ไม่สามารถลบ ip range [%s] ได้ โปรดลบ load balancer [uuid:%s] ก่อน", + "ORG_ZSTACK_OVF_10025": "", + "ORG_ZSTACK_OVF_10026": "รหัสผ่านเดิมไม่ตรงกับรหัสผ่านดั้งเดิม ไม่สามารถอัปเดตรหัสผ่านของผู้ใช้[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10006": "", + "ORG_ZSTACK_OVF_10023": "ผู้ใช้ที่มี UUID [%s] ไม่มีความเกี่ยวข้องกับบัญชีที่มี UUID [%s]", + "ORG_ZSTACK_OBSERVABILITYSERVER_10006": "", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10005": "โควต้า[name:%s] สำหรับบัญชี[uuid:%s] ไม่สามารถตั้งค่าเป็น %d", + "ORG_ZSTACK_OVF_10024": "", + "ORG_ZSTACK_OBSERVABILITYSERVER_10007": "บัญชี [UUID:%s] ใช้งาน [Name:%s, Usage Value:%s] เกินโควต้าที่ร้องขอ: %d", + "ORG_ZSTACK_OVF_10021": "", + "ORG_ZSTACK_OVF_10022": "เครื่องเสมือน[UUID: %s]ถูกส่งออกเป็นแพ็คเกจ OVA แล้ว[UUID: %s] โปรดลบแพ็คเกจและลองใหม่", + "ORG_ZSTACK_KVM_XMLHOOK_10001": "xml hook ที่มี UUID %s อัปเดตสำเร็จ แต่ไม่สามารถรีสตาร์ทเครื่องเสมือนที่มี UUID %s รายละเอียด: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10003": "ไม่พบเราเตอร์เสมือนสำหรับบริการ: %s, ประเภท: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10010": "เซิร์ฟเวอร์ observability ที่มี UUID: %s ไม่พร้อมใช้งาน ไม่สามารถแนบบริการได้", + "ORG_ZSTACK_OVF_10018": "ไม่สามารถอ่านไฟล์ OVF สำหรับเครื่องเสมือน %s โปรดตรวจสอบเส้นทางไฟล์และสิทธิ์", + "ORG_ZSTACK_OVF_10017": "ไม่พบแพ็คเกจ OVA[uuid: %s] ในที่เก็บเครื่องเสมือน", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10057": "ไม่พบ UUID ของกลุ่ม SLB สำหรับตัวจัดโหลด[uuid:%s,type:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_FILESYSTEM_10000": "การเต้นของหัวใจของโฮสต์[uuid:%s]ไม่ได้รับการอัปเดตเมื่อเร็วๆ นี้", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_HA_10000": "จุดขยายกลุ่ม HA ไม่ได้เริ่มต้น", + "ORG_ZSTACK_OVF_10030": "งานยาว[uuid:%s]ดำเนินการล้มเหลว", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10040": "ไม่สามารถเพิ่ม vmnic ไปยังกลุ่มเซิร์ฟเวอร์ตัวจัดโหลดได้เนื่องจากเครือข่าย l3 [uuid:%s] เชื่อมต่อกับเราเตอร์ VPC อื่น", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10041": "ไม่สามารถเพิ่ม VMNIC ไปยังกลุ่มเซิร์ฟเวอร์ตัวจัดโหลดได้เนื่องจากเครือข่าย L3 ไม่เชื่อมต่อกับอินสแตนซ์ SLB", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10046": "ไม่สามารถสร้างอินสแตนซ์ SLB ได้เนื่องจากมีอินสแตนซ์อื่น[UUID: %s, ชื่อ: %s]อยู่แล้วสำหรับกลุ่ม SLB", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10047": "ไม่สามารถสร้างอินสแตนซ์ SLB ได้เนื่องจากมีอินสแตนซ์สองรายการถูกสร้างแล้วสำหรับกลุ่ม SLB", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10001": "ล้มเหลวในการอัปโหลดบิตจากที่เก็บข้อมูล NFS [uuid:%s, path:%s] ไปยังที่เก็บภาพ[hostname:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10042": "ไม่สามารถเปลี่ยน IP มอนิเตอร์ของกลุ่ม SLB ได้เนื่องจาก IP มอนิเตอร์ไม่ถูกต้อง %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10043": "ไม่สามารถสลับกลุ่ม SLB [uuid:%s] เป็นโหมดพร้อมใช้งานสูงได้เนื่องจากสถานะอินสแตนซ์ [%s] ไม่หยุด", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10044": "ล้มเหลวในการสร้าง VIP%s บนเราเตอร์เสมือน[UUID:%s], เพราะ %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10000": "ล้มเหลวในการดาวน์โหลดบิตจากที่เก็บภาพที่เก็บข้อมูลสำรอง[hostname:%s, path: %s] ไปยังที่เก็บข้อมูล NFS หลัก[uuid:%s, path: %s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10045": "สร้างกลุ่มความสัมพันธ์สำหรับอินสแตนซ์ SLB [uuid:%s] ล้มเหลว", + "ORG_ZSTACK_IAM2_API_10011": "แอตทริบิวต์[uuid:%s]ไม่ได้เชื่อมโยงกับกลุ่มที่กำหนดไว้ใดๆ", + "ORG_ZSTACK_IAM2_API_10012": "แอตทริบิวต์[uuid:%s]ไม่ได้เชื่อมโยงกับองค์กรใดๆ", + "ORG_ZSTACK_IAM2_API_10013": "แอตทริบิวต์[uuid:%s]ไม่ได้เชื่อมโยงกับโครงการใดๆ", + "ORG_ZSTACK_IAM2_API_10014": "แอตทริบิวต์[uuid:%s]ไม่ได้เชื่อมโยงกับ ID อินสแตนซ์เสมือนใดๆ", + "ORG_ZSTACK_IAM2_API_10015": "นโยบายการเกษียณต้องถูกลบออกก่อนการดึงโครงการออกจากสถานะเกษียณ", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10039": "ไม่สามารถเพิ่ม vmnic ไปยังกลุ่มเซิร์ฟเวอร์ตัวจัดโหลดได้เนื่องจากเครือข่าย l3 [uuid:%s] เชื่อมต่อกับเราเตอร์ VPC ใดๆ", + "ORG_ZSTACK_IAM2_API_10016": "การเข้าสู่ระบบถูกห้ามเนื่องจากโครงการอยู่ในสถานะ %s", + "ORG_ZSTACK_IAM2_API_10017": "ไม่มีโควตา[name:%s] อยู่", + "ORG_ZSTACK_IAM2_API_10018": "ขีดจำกัด CPU สำหรับคอนเทนเนอร์ (%s) ควรมากกว่าจำนวน CPU ที่ร้องขอ (%s)", + "ORG_ZSTACK_IAM2_API_10019": "ขีดจำกัดขนาดหน่วยความจำสำหรับคอนเทนเนอร์ควรมากกว่าขนาดหน่วยความจำที่ร้องขอ", + "ORG_ZSTACK_OVF_10003": "ไม่พบตัวควบคุมการจัดการโวลุม โปรดตรวจสอบว่าบริการจัดการโวลุมของคุณกำหนดค่าอย่างถูกต้องและทำงานอยู่", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10007": "VipQoS สำหรับ Vip [uuid: %s] ไม่มีอยู่", + "ORG_ZSTACK_OVF_10004": "ไม่พบตัวควบคุมไดรเวอร์ CD โปรดตรวจสอบว่าไดรเวอร์การจำลองเสมือนที่จำเป็นได้รับการติดตั้งและกำหนดค่าสำหรับอินสแตนซ์ของคุณ", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10008": "ไม่สามารถลบ Quality of Service สำหรับ Virtual IP [uuid: %s] ได้ มันเชื่อมโยงกับ VPC Shared Quality of Service", + "ORG_ZSTACK_OVF_10001": "ข้อกำหนดความจุดิสก์ไม่ถูกต้อง: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10005": "ไม่สามารถตั้งค่า Quality of Service (Qos) สำหรับ VIP [UUID: %s] ได้ มันถูกแนบกับ VpcSharedQos แล้ว", + "ORG_ZSTACK_OVF_10002": "ขนาดดิสก์ที่จัดสรรไม่ถูกต้อง: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10006": "VIP QoS สำหรับ VIP [uuid: %s] พอร์ต %s ไม่มีอยู่", + "ORG_ZSTACK_OVF_10000": "ไม่พบการอ้างอิงดิสก์สำหรับดิสก์ %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10009": "ไม่พบ VIP QoS backend สำหรับ VIP [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10010": "VpcSharedQos ต้องระบุ Bandwidth", + "ORG_ZSTACK_IPSEC_10028": "เครือข่าย L3 [%s] ไม่ได้แนบกับ IPsec tunnel [UUID :%s]", + "ORG_ZSTACK_AUTOSCALING_10000": "UUIDs เครือข่าย L3 ที่ไม่ถูกต้อง[%s] สำหรับ listener ที่เชื่อมโยงกับ load balancer[%s] เครือข่ายทั้งหมดต้องแนบกับ virtual router เดียวกันกับ LB service และเป็นส่วนหนึ่งของการกำหนดค่าเครือข่าย VRouter เดียวกัน", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10011": "VPC ต้องแนบกับ L3[%s] ก่อน", + "ORG_ZSTACK_IPSEC_10029": "CIDR [%s] รวมอยู่ในการกำหนดค่า IPsec อยู่แล้ว [UUID :%s]", + "ORG_ZSTACK_AUTOSCALING_10001": "การถอด autoScalingTemplate[%s] จาก AutoScalingGroup ล้มเหลว ข้อผิดพลาดคือ %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10030": "ไม่สามารถแนบเครือข่าย L3 ที่มี UUID [%s] กับ SLB instance ได้เนื่องจากรูปแบบ IPv6 prefix [%s] ไม่ถูกต้อง", + "ORG_ZSTACK_AUTOSCALING_10003": "listener ที่มี UUID: %s กำลังถูกใช้งานโดย autoScalingVmTemplate[%s] และไม่สามารถลบได้", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10014": "VpcSharedQos ไม่สามารถแนบ VIP นี้ได้เนื่องจากมันถูกแนบกับ VpcSharedQos อื่นแล้ว", + "ORG_ZSTACK_IPSEC_10025": "เครือข่าย L3 [%s] ไม่สามารถแนบกับ IPsec [UUID:%s] ซ้ำกันได้", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10012": "พารามิเตอร์ AttachVipToVpcSharedQos ต้องระบุ VipUuids หรือ VipLists", + "ORG_ZSTACK_IPSEC_10026": "ต้องรวมเครือข่าย Layer 3 ใน APIAttachL3NetworksToIPsecConnectionMsg", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10013": "VpcSharedQos ไม่สามารถแนบ VIP นี้ได้ เนื่องจาก VIP[%s] ไม่อยู่ในเครือข่าย L3[%s]", + "ORG_ZSTACK_IPSEC_10027": "เครือข่าย L3 [%s] ไม่ใช่เครือข่าย VPC และไม่สามารถแนบหรือถอดจาก IPsec ได้", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10035": "ไม่สา�", + "ORG_ZSTACK_IPSEC_10020": "the peer address[%s] is not a valid IPv4 address", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10036": "cannot create load balancer because the VIP [uuid:%s] is already attached to a VPC router [%s]", + "ORG_ZSTACK_IPSEC_10021": "The authentication key must not contain whitespace or special characters such as %s.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10037": "cannot create load balancer because invalid SLB group [uuid:%s]", + "ORG_ZSTACK_IPSEC_10022": "IPsec VIP [%s] must not be the first or last IP address in the CIDR range associated with the public address pool type.", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10038": "ไม่สามารถเพิ่ม NIC ของเซิร์ฟเวอร์แบ็คเอนด์ไปยังกลุ่มเซิร์ฟเวอร์ [uuid:%s] ได้ เนื่องจาก UUID ของ NIC เป็นค่าว่าง", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10031": "ไม่สามารถแนบเครือข่าย L3 ที่มี UUID [%s] ไปยังอินสแตนซ์ SLB ได้ เนื่องจากต้องระบุที่อยู่ IP และคำนำหน้าใน system tags", + "ORG_ZSTACK_AUTOSCALING_10004": "อินสแตนซ์ไม่มีอยู่ในกลุ่ม scaling กรุณาตรวจสอบ instance ID และชื่อกลุ่ม scaling [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10032": "ไม่สามารถถอดเครือข่าย L3 ด้านหน้า [uuid:%s] ออกจากอินสแตนซ์ SLB ได้", + "ORG_ZSTACK_AUTOSCALING_10005": "สัญญาณเตือนที่มี UUID:%s เชื่อมโยงกับ autoScalingGroup[%s] และไม่สามารถลบได้", + "ORG_ZSTACK_IAM2_API_10020": "องค์กร[uuid:%s] เป็น Cloud Tenant และไม่สามารถมีองค์กรแม่ได้", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10033": "ไม่สามารถถอดเครือข่าย L3 สำหรับการจัดการ [uuid:%s] ออกจากอินสแตนซ์ SLB ได้", + "ORG_ZSTACK_AUTOSCALING_10006": "กฎ[%s] ถูกปิดใช้งาน", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10034": "ไม่สามารถถอด NIC [uuid:%s] ออกจากอินสแตนซ์ SLB ได้ เนื่องจากเป็น Layer 3 network interface แบ็คเอนด์ตัวสุดท้าย", + "ORG_ZSTACK_IAM2_API_10021": "องค์กรแม่ [uuid:%s] ไม่สามารถเป็นองค์กรลูก [uuid:%s] ภายในโครงสร้างองค์กรแบบซ้อนกันได้", + "ORG_ZSTACK_IAM2_API_10022": "ชื่อ ID เครื่องเสมือนซ้ำกัน[%s]", + "ORG_ZSTACK_IAM2_API_10023": "ชื่อสภาพแวดล้อมเสมือนซ้ำกัน[%s]", + "ORG_ZSTACK_IAM2_API_10024": "ชื่อโครงการไม่ถูกต้อง[%s] มีโครงการที่มีชื่อเดียวกันอยู่แล้ว", + "ORG_ZSTACK_IAM2_API_10025": "IAM2OrganizationVO[uuid:%s] ไม่มีอยู่", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10028": "ไม่สามารถแนบเครือข่าย L3 ที่มี UUID [%s] ไปยังอินสแตนซ์ SLB ได้ เนื่องจากต้องระบุที่อยู่ IP และ netmask ใน system tags", + "ORG_ZSTACK_IAM2_API_10026": "โครงการ [UUID=%s] ได้รับการเชื่อมโยงกับองค์กร [UUID=%s] แล้ว", + "ORG_ZSTACK_OBSERVABILITYSERVER_10019": "เวลาเริ่มต้นต้องน้อยกว่าเวลาสิ้นสุดสำหรับการกำหนดตารางเวลาที่ถูกต้องในสภาพแวดล้อมคลาวด์", + "ORG_ZSTACK_IAM2_API_10027": "โครงการ [UUID=%s] ไม่ได้เชื่อมโยงกับสภาพแวดล้อมคลาวด์", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10029": "ไม่สามารถแนบเครือข่าย L3 ที่มี UUID [%s] ไปยังอินสแตนซ์ SLB ได้ เนื่องจากรูปแบบ IPv6 address [%s] ไม่ถูกต้อง", + "ORG_ZSTACK_IAM2_API_10028": "องค์กร%s ไม่ได้รับอนุญาตให้เป็นองค์กรลูกขององค์กรอื่น", + "ORG_ZSTACK_IAM2_API_10029": "virtual ID [UUID: %s] ไม่ได้อยู่ในโครงการ [UUID: %s]", + "ORG_ZSTACK_OBSERVABILITYSERVER_10015": "ไม่พบ service type ของ ObservabilityServer: %s", + "ORG_ZSTACK_OVF_10015": "backup storage[UUID: %s] ไม่มีความจุที่เพียงพอสำหรับการส่งออก VM[UUID: %s] ความจุที่ต้องการคือ: %d", + "ORG_ZSTACK_OBSERVABILITYSERVER_10016": "service[uuid: %s] ที่มี type %s ไม่สามารถถอดจาก observability server[uuid: %s] ได้เนื่องจาก: %s", + "ORG_ZSTACK_OVF_10012": "ค่าการกำหนดค่า CPU 'CoresPerSocket' ไม่ถูกต้อง: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10017": "service[uuid: %s] ไม่ได้เชื่อมโยงกับ observability server[uuid: %s]", + "ORG_ZSTACK_OBSERVABILITYSERVER_10018": "เวลาเริ่มต้นและเวลาสิ้นสุดต้องระบุทั้งคู่สำหรับช่วงเวลาจัดหาอินสแตนซ์คลาวด์", + "ORG_ZSTACK_OVF_10010": "ไม่พบ Virtual CPU 'VirtualQuantity'", + "ORG_ZSTACK_OBSERVABILITYSERVER_10011": "ไม่พบ observability server instance[uuid: %s]", + "ORG_ZSTACK_OVF_10011": "ค่า CPU 'vCPU' ไม่ถูกต้อง: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10013": "service[uuid: %s] ประเภท %s ไม่สามารถแนบไปยัง observability server[uuid: %s] ได้เนื่องจาก: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10000": "VIP Quality of Service (QoS) สำหรับ IPv6 จะถูกนำมาใช้ในเร็วๆ นี้", + "ORG_ZSTACK_ALIYUN_STORAGE_SNAPSHOT_10000": "การดำเนินการนี้ได้รับอนุญาตเฉพาะเมื่อสถานะอินสแตนซ์ ECS กำลังทำงานอยู่หรือหยุดอยู่", + "ORG_ZSTACK_OVF_10009": "ไม่พบ CPU 'InstanceID' กรุณาตรวจสอบ ID อินสแตนซ์และตรวจสอบว่า CPU ถูกกำหนดอย่างถูกต้อง", + "ORG_ZSTACK_OBSERVABILITYSERVER_10020": "รูปแบบวันที่เวลาไม่ถูกต้อง คาดว่าจะเป็นรูปแบบ ISO-8601 พร้อมรายละเอียดเขตเวลาทางเลือก: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10021": "observability server [UUID: %s] ไม่ได้ใช้งานอยู่ ไม่สามารถดึงข้อมูลบริการได้", + "ORG_ZSTACK_OVF_10007": "ไม่พบ Virtual memory 'VirtualQuantity'", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10003": "SetVipQos ต้องระบุ InboundBandwidth หรือ OutboundBandwidth อย่างใดอย่างหนึ่ง", + "ORG_ZSTACK_OVF_10008": "ค่าหน่วยความจำ Virtual Machine ไม่ถูกต้อง: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10004": "ไม่สามารถตั้งค่า Quality of Service (QoS) สำหรับ Virtual IP (VIP) นี้ได้ เครือข่าย Layer 3 เพียร์บางเครือข่ายไม่ให้บริการ VIP QoS", + "ORG_ZSTACK_OVF_10005": "Ethernet Adapter: %s ไม่ได้เชื่อมต่อกับเครือข่าย", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10001": "VIP QoS สำหรับ VIP [uuid: %s] พอร์ต %s มีอยู่แล้ว", + "ORG_ZSTACK_OVF_10006": "ไม่พบ Virtual machine '%s'", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10002": "VIP Quality of Service สำหรับ VIP [uuid: %s] มีอยู่แล้ว", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10024": "ไม่สามารถสร้างกลุ่ม SLB ได้เนื่องจากประเภทอินสแตนซ์แบ็คเอนด์ไม่ถูกต้อง %s", + "ORG_ZSTACK_IPSEC_10031": "ไม่สามารถเปลี่ยนสถานะได้เนื่องจาก IPsec [uuid:%s] ไม่อยู่ในสถานะพร้อมใช้งาน", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10025": "ไม่สามารถสร้างกลุ่ม SLB ได้เนื่องจาก IP มอนิเตอร์ไม่ถูกต้อง %s", + "ORG_ZSTACK_IPSEC_10032": "ไม่สามารถเชื่อมต่อ IPsec tunnel [uuid:%s] อีกครั้งได้ กรุณาอัปเกรดเวอร์ชัน IPsec", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10026": "ไม่สามารถแนบ L3 network ที่มี UUID [%s] ไปยังอินสแตนซ์ SLB ได้เนื่องจากรูปแบบ IPv4 address ไม่ถูกต้อง [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10027": "ไม่สามารถแนบ L3 network ที่มี UUID [%s] ไปยังอินสแตนซ์ SLB ได้เนื่องจากข้อผิดพลาดรูปแบบ IPv4 netmask [%s]", + "ORG_ZSTACK_IAM2_API_10030": "การดำเนินการไม่ถูกต้อง ไม่สามารถเพิ่ม Role[%s] ได้", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10021": "เครือข่ายแบ็คเอนด์ [UUID:%s] เชื่อมต่อกับ VPC router [UUID:%s] ในขณะที่เครือข่ายแบ็คเอนด์อื่นเชื่อมต่อกับ VPC router [UUID:%s]", + "ORG_ZSTACK_IAM2_API_10031": "ไม่สามารถดำเนินการกับ virtual machine ID ที่ล้าสมัยได้: %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10022": "ไม่สามารถดำเนินการ API ได้ เครือข่ายแบ็คเอนด์ [uuid:%s] ไม่สามารถเป็นเครือข่าย VPC ได้เนื่องจากเครือข่ายแบ็คเอนด์อื่นไม่ใช่เครือข่าย VPC", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10023": "ไม่สามารถสร้างกลุ่ม SLB ได้เนื่องจากประเภทการติดตั้งไม่ถูกต้อง %s", + "ORG_ZSTACK_IPSEC_10030": "CIDR [%s] ไม่อยู่ใน CIDR ที่กำหนดไว้ของ IPsec UUID [%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10026": "ข้อผิดพลาดในการดำเนินการ: ไม่สามารถดึงการตอบกลับจากบริการ cloud computing ได้", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10028": "การสำรองข้อมูล snapshots ไปยัง backup storage เป็นฟีเจอร์ที่เลิกใช้แล้วและจะถูกนำออกในเวอร์ชันอนาคตของแพลตฟอร์ม cloud", + "ORG_ZSTACK_IAM2_API_10000": "ชื่อ attribute ไม่สามารถเป็นค่าว่างได้, ค่า[%s]", + "ORG_ZSTACK_IAM2_API_10001": "ชื่อ attribute[%s] เกินความยาวสูงสุด 2048 ตัวอักษร", + "ORG_ZSTACK_IAM2_API_10002": "ค่าของ attribute[name:%s] เกินความยาวสูงสุด 2048 ตัวอักษร", + "ORG_ZSTACK_IAM2_API_10003": "องค์กร[UUID: %s] ได้เกินขีดจำกัดที่ร้องขอสำหรับ [Name: %s, Used Value: %s]", + "ORG_ZSTACK_IAM2_API_10005": "%s ไม่ใช่ค่าที่ถูกต้องสำหรับการควบคุมการรับส่งข้อมูลเครือข่าย ค่าที่ถูกต้องคือ allow/reject ระหว่างช่วง IP เฉพาะ", + "ORG_ZSTACK_IAM2_API_10006": "ไม่สามารถลบ organizational unit เริ่มต้น[%s] ได้", + "ORG_ZSTACK_IAM2_API_10007": "ตัวระบุ template ซ้ำ[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10018": "VpcSharedQos ไม่สามารถถอด Vip นี้ได้เนื่องจาก Vpc[%s] ไม่ได้เชื่อมต่อ", + "ORG_ZSTACK_IAM2_API_10009": "ชื่อผู้ใช้ 'admin' ถูกสงวนไว้ในสภาพแวดล้อม cloud computing เพื่อแสดงถึงสิทธิ์ผู้ดูแลระบบ กรุณาเลือกชื่ออื่นสำหรับผู้ใช้ของคุณ", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10016": "พารามิเตอร์ DetachVipFromVpcSharedQos ต้องระบุ VipUuids หรือ VipLists", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10017": "VpcSharedQos ไม่สามารถถอด VIP นี้ได้ เนื่องจาก VIP[%s] ไม่ได้แนบอยู่", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10010": "ceph primary storage [uuid:%s] อาจถูกลบหรือยุติการทำงานแล้ว", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10013": "ceph primary storage [UUID: %s, name: %s] ไม่พร้อมใช้งาน เนื่องจาก Monitor [UUID: %s] รายงานความล้มเหลวในการดำเนินการ [%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10012": "มี ceph primary storage อื่นที่มี FSID เดียวกัน คุณไม่สามารถเพิ่มการกำหนดค่า ceph เดียวกันเป็น primary storage สองตัวที่แตกต่างกันได้", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10015": "ไม่สามารถสร้างการเชื่อมต่อกับ storage nodes (%s)", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10017": "monitor node [ip:%s] ส่งคืน fsid[%s] ที่แตกต่างจาก fsid[%s] ของ cluster ปัจจุบัน คุณกำลังเพิ่ม monitor node ที่ไม่ได้เป็นส่วนหนึ่งของ cluster นี้ใช่ไหม", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10016": "ไม่สามารถเพิ่ม MON node ไปยัง ceph-based primary storage solution ได้", + "ORG_ZSTACK_IAM2_API_10010": "ชื่อ[%s] ไม่ถูกต้อง มี project หรือ account ที่มีตัวระบบเดียวกันอยู่แล้ว", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10008": "ไม่สามารถเชื่อมต่อกับ ceph primary storage [UUID:%s] ไม่สามารถเชื่อมต่อกับ ceph monitors ทั้งหมดได้", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10007": "monitors ทั้งหมดไม่สามารถดำเนินการ HTTP request[%s] ได้", + "ORG_ZSTACK_ZOPS_10009": "ไม่สามารถดึง chrony sources ได้ เพราะ:%s", + "ORG_ZSTACK_ZOPS_10005": "%s ไม่สามารถเข้าถึงได้จาก %s เนื่องจาก:%s", + "ORG_ZSTACK_ZOPS_10004": "ไม่สามารถกำหนดค่า time sources '%s' ใน %s ได้ เพราะ:%s, raw: %s", + "ORG_ZSTACK_ZOPS_10007": "%s ไม่สามารถตรวจสอบสถานะสุขภาพของ Ceph cluster ได้เนื่องจาก: %s", + "ORG_ZSTACK_ZOPS_10006": "ไม่สามารถตรวจสอบว่า %s สามารถเข้าถึงได้จาก %s เนื่องจาก:%s", + "ORG_ZSTACK_ZOPS_10001": "%s ไม่ใช่ IP address ของ cloud instance ที่ถูกต้อง", + "ORG_ZSTACK_ZOPS_10003": "%s ไม่ใช่ IP address หรือ hostname ที่ถูกต้อง", + "ORG_ZSTACK_ZOPS_10002": "Internal และ external Chrony servers ไม่สามารถเป็น null พร้อมกันได้ กรุณาแน่ใจว่าทั้งสองได้รับการกำหนดค่าอย่างถูกต้อง", + "ORG_ZSTACK_ZOPS_10010": "ไม่สามารถดึง chrony sources ของ %s ได้ เนื่องจาก:%s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10001": "backup storage [UUID: %s, Name: %s, FSID: %s] ไม่ได้เป็นส่วนหนึ่งของ Ceph cluster เดียวกันกับ primary storage [UUID: %s, Name: %s, FSID: %s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10004": "ไม่สามารถบันทึก encrypted image cache ได้: %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10005": "fsid ไม่สอดคล้องกันระหว่าง primary storage [ps(%s)] และ backup storage [bs(%s)] ดังนั้นจึงห้ามการสร้าง template", + "ORG_ZSTACK_ZOPS_10019": "%s ล้มเหลวในการลบเซิร์ฟเวอร์ chrony เก่าใน zstack.properties เนื่องจาก:%s", + "ORG_ZSTACK_ZOPS_10016": "ZStone ไม่รองรับการอัปเดตเซิร์ฟเวอร์ chrony ออนไลน์ในขณะนี้ โปรดตรวจสอบให้แน่ใจว่าการเปลี่ยนแปลงทั้งหมดทำแบบออฟไลน์ก่อนการติดตั้ง", + "ORG_ZSTACK_ZOPS_10015": "%s ไม่สามารถเข้าถึงได้จากสภาพแวดล้อมเครื่องเสมือนปัจจุบัน", + "ORG_ZSTACK_ZOPS_10018": "สถานะคลัสเตอร์ CEPH ไม่สมบูรณ์ โปรดตรวจสอบสภาพแวดล้อมของคุณก่อน! %s", + "ORG_ZSTACK_ZOPS_10012": "ล้มเหลวในการตรวจสอบว่า %s สามารถเข้าถึงได้จากโฮสต์ %s เนื่องจากไม่อยู่ภายใต้การจัดการของเรา", + "ORG_ZSTACK_ZOPS_10011": "ล้มเหลวในการซิงโครไนซ์เซิร์ฟเวอร์ chrony ใน %s เนื่องจาก:%s, raw: %s", + "ORG_ZSTACK_ZOPS_10014": "%s ไม่สามารถกำหนดให้เป็นเซิร์ฟเวอร์เวลา chrony ภายนอกได้!", + "ORG_ZSTACK_ZOPS_10020": "%s ล้มเหลวในการกำหนดค่าเซิร์ฟเวอร์ chrony ใน zstack.properties เนื่องจาก:%s", + "ORG_ZSTACK_PROXY_10000": "ไม่พบการกำหนดค่า User Proxy ที่มี UUID %s", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10005": "ไม่สามารถเริ่มต้นเซิร์ฟเวอร์ USB redirection จากโฮสต์[uuid:%s]", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10004": "ไม่สามารถเริ่มต้นบริการ USB บนโฮสต์[%s] เนื่องจากโฮสต์ไม่ได้เชื่อมต่อ", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10003": "โฮสต์[%s] ได้เริ่มต้นพอร์ต USB redirection มากกว่า 64 พอร์ต", + "ORG_ZSTACK_COMPUTE_HOST_10085": "ไม่สามารถกำหนดค่าเครือข่ายการจัดการบนอินเทอร์เฟซเนื่องจากตั้งค่าเป็นโหมดกำหนดอัตโนมัติ", + "ORG_ZSTACK_COMPUTE_HOST_10084": "ไม่สามารถถอดเครือข่ายการจัดการจากอินเทอร์เฟซเนื่องจากเป็นประเภทที่กำหนดโดยอัตโนมัติ", + "ORG_ZSTACK_COMPUTE_HOST_10087": "ไม่สามารถถอดเครือข่ายการจัดการจากอินเทอร์เฟซ bonding เนื่องจากใช้การรับ IP แบบอัตโนมัติ", + "ORG_ZSTACK_COMPUTE_HOST_10081": "ไม่สามารถกำหนดค่าที่อยู่ IP สำหรับอินเทอร์เฟซ slave ของ bridge", + "ORG_ZSTACK_COMPUTE_HOST_10080": "ที่อยู่ IP ถูกกำหนดให้กับอินเทอร์เฟซอื่นแล้ว โปรดตรวจสอบให้แน่ใจว่าที่อยู่ IP ไม่ซ้ำกันในอินเทอร์เฟซเครือข่ายทั้งหมด", + "ORG_ZSTACK_COMPUTE_HOST_10083": "UUID bonding ไม่ถูกต้องสำหรับอินเทอร์เฟซเครือข่ายเสมือน %s", + "ORG_ZSTACK_COMPUTE_HOST_10089": "ประเภทบริการที่ระบุไม่ถูกต้อง โปรดตรวจสอบให้แน่ใจว่าคุณใช้ประเภทบริการที่ถูกต้องสำหรับสภาพแวดล้อมการประมวลผลบนคลาวด์", + "ORG_ZSTACK_COMPUTE_HOST_10088": "ไม่สามารถตั้งค่าเครือข่ายการจัดการบน bonding เนื่องจากเครือข่ายการจัดการใช้การกำหนดอัตโนมัติ", + "ORG_ZSTACK_COMPUTE_HOST_10090": "จำลองการปิดเครื่องเสมือน[%s] ผ่าน IPMI ล้มเหลว", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10001": "ล้มเหลวในการสร้างการเชื่อมต่อไปยังเซิร์ฟเวอร์ SMTP ที่โฮสต์: %s และพอร์ต: %d โปรดตรวจสอบความถูกต้องของการกำหนดค่า smtpServer และ smtpPort [error=%s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10002": "ไม่สามารถสร้างการเชื่อมต่อไปยังเซิร์ฟเวอร์ SMTP[เซิร์ฟเวอร์: %s, พอร์ต: %s] ภายใน 15 วินาที", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10003": "ข้อผิดพลาดการตรวจสอบเซิร์ฟเวอร์ SMTP: %s", + "ORG_ZSTACK_AI_COLLECTOR_10000": "ไม่พบบริบทการติดตั้งสำหรับการรวบรวมข้อมูล MindIE metadata ในสภาพแวดล้อมเครื่องเสมือน โปรดตรวจสอบให้แน่ใจว่าทรัพยากรคลาวด์ที่จำเป็นได้รับการกำหนดค่าอย่างถูกต้องและพร้อมใช้งาน", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10004": "ปลายทางที่ระบุถูกปิดใช้งาน โปรดตรวจสอบการกำหนดค่าปลายทางของคุณ", + "ORG_ZSTACK_AI_COLLECTOR_10001": "บริบทการติดตั้งบางรายการขาดสินค้าคงคลังเครื่องเสมือน ซึ่งทำให้ไม่สามารถรวบรวมข้อมูล MindIE metadata ได้", + "ORG_ZSTACK_COMPUTE_HOST_10096": "รีเซ็ตพลังงานโฮสต์[%s] ผ่าน IPMI ล้มเหลว", + "ORG_ZSTACK_COMPUTE_HOST_10095": "จำลองการรีเซ็ตพลังงานของเครื่องเสมือนผ่าน IPMI ล้มเหลว [%s]", + "ORG_ZSTACK_COMPUTE_HOST_10098": "โฮสต์[%s] ได้รับค่าที่ส่งกลับที่ไม่คาดคิด", + "ORG_ZSTACK_COMPUTE_HOST_10097": "ข้อมูล IPMI ไม่สมบูรณ์สำหรับ instance %s กรุณาตรวจสอบและให้รายละเอียดที่จำเป็น", + "ORG_ZSTACK_COMPUTE_HOST_10092": "การจำลองเปิดเครื่อง instance ด้วย IPMI ล้มเหลวสำหรับ host[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10091": "การปิดเครื่อง host[%s] ด้วย IPMI ล้มเหลว", + "ORG_ZSTACK_COMPUTE_HOST_10094": "การรีบูต host[%s:%d] ล้มเหลวเนื่องจาก instance ถูกปิดเครื่องอยู่แล้ว", + "ORG_ZSTACK_COMPUTE_HOST_10093": "การเปิดเครื่อง host[%s] ด้วย IPMI ล้มเหลว", + "ORG_ZSTACK_COMPUTE_HOST_10099": "host[%s] ไม่สามารถสร้างการเชื่อมต่อกับ ipmi[%s], เหตุผล:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10002": "ไม่สามารถตรวจสอบ MD5 checksum ของไฟล์ในไดเรกทอรี[%s]\\nstdout:%s\\nstderr:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10003": "ไม่สามารถตรวจสอบ MD5 checksum ของไฟล์ในโฟลเดอร์[%s] บน host[ip:%s]\\nstdout:%s\\nstderr:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10000": "ชื่อผู้ใช้ รหัสผ่าน หรือหมายเลขพอร์ตอาจไม่ถูกต้อง กรุณาตรวจสอบและลองใหม่", + "ORG_ZSTACK_COMPUTE_HOST_10065": "ไม่สามารถอัปเดตป้ายกำกับเครือข่าย host [uuid:%s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10000": "ปัญหาอาจเกิดจาก access key หรือ secret key ไม่ถูกต้อง หรือ IAM policy permission ถูกปฏิเสธ [error=%s]", + "ORG_ZSTACK_COMPUTE_HOST_10064": "ไม่สามารถลบป้ายกำกับเครือข่าย host [uuid:%s]", + "ORG_ZSTACK_COMPUTE_HOST_10067": "รูปแบบที่อยู่ IP ไม่ถูกต้อง[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10066": "host(s) [%s] ไม่ได้เชื่อมต่อ ไม่รองรับการปิดเครื่อง", + "ORG_ZSTACK_COMPUTE_HOST_10069": "ชุด IP ไม่ถูกต้อง ต้องระบุพร้อม netmask ในรูปแบบ CIDR", + "ORG_ZSTACK_COMPUTE_HOST_10068": "รูปแบบ subnet mask ไม่ถูกต้อง[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10073": "ไม่สามารถกำหนดค่า IP บน bonding slave interfaces", + "ORG_ZSTACK_COMPUTE_HOST_10070": "ไม่สามารถกำหนดค่า IP สำหรับ interface เครือข่ายการจัดการ%s", + "ORG_ZSTACK_COMPUTE_HOST_10078": "ไม่สามารถกำหนดค่า IP สำหรับ bonding interface ที่เกี่ยวข้องกับเครือข่ายการจัดการ", + "ORG_ZSTACK_COMPUTE_HOST_10077": "ระบุ interface UUID ไม่ถูกต้อง", + "ORG_ZSTACK_IMAGE_10019": "เซสชันอัปโหลดหมดอายุ กรุณาให้แน่ใจว่าเซสชันอัปโหลดใช้งานอยู่และลองใหม่", + "ORG_ZSTACK_IMAGE_10016": "ล้มเหลวเนื่องจาก management node รีบูต", + "ORG_ZSTACK_IMAGE_10015": "เส้นทาง image ไม่อยู่ในรายการที่อนุมัติ: %s", + "ORG_ZSTACK_IMAGE_10014": "instance ทั้งหมดบน server นี้ไม่สามารถเข้าถึง images ได้", + "ORG_ZSTACK_IMAGE_10013": "เส้นทาง image [%s] อยู่ในรายการดำ %s", + "ORG_ZSTACK_IMAGE_10012": "ต้องระบุ absolute path สำหรับไฟล์ต้นทาง กรุณาให้ full path ไปยังไฟล์", + "ORG_ZSTACK_IMAGE_10011": "URL ที่ให้มาต้องเริ่มต้นด้วย 'file:///', 'http://', 'https://', 'ftp://', 'sftp://', หรือ '/'", + "ORG_ZSTACK_IMAGE_10010": "ไม่มี backup storage ที่ระบุใน uuids%s พร้อมสำหรับการเพิ่ม image นี้; พวกมันไม่อยู่ในสถานะ %s หรือไม่อยู่ในสถานะ %s หรือ UUID ไม่ถูกต้อง", + "ORG_ZSTACK_IMAGE_10009": "รูปแบบ image ที่ไม่ได้รับการสนับสนุน[%s]", + "ORG_ZSTACK_IMAGE_10008": "รูปแบบที่ไม่รู้จัก[%s]", + "ORG_ZSTACK_IMAGE_10007": "ไม่สามารถใช้ ISO เป็นอิมเมจดิสก์ระบบได้", + "ORG_ZSTACK_IMAGE_10006": "volume snapshot[uuid:%s] ไม่ได้เปิดใช้งาน, สถานะคือ %s", + "ORG_ZSTACK_IMAGE_10005": "volume snapshot[uuid:%s] ไม่พร้อมใช้งาน, อยู่ในสถานะ %s", + "ORG_ZSTACK_IMAGE_10004": "volume[uuid:%s] ไม่ได้เปิดใช้งาน, สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_IMAGE_10003": "volume[uuid:%s] ไม่พร้อมใช้งาน, สถานะคือ %s", + "ORG_ZSTACK_IMAGE_10002": "สถาปัตยกรรม AArch64 ไม่รองรับฟีเจอร์แบบดั้งเดิม โปรดตรวจสอบว่าการกำหนดค่าของคุณสามารถใช้งานร่วมกับสถาปัตยกรรม AArch64 ได้", + "ORG_ZSTACK_ALIYUN_ACCOUNT_10000": "ไม่สามารถสร้างการเชื่อมต่อกับ [%s] ภายใน %d มิลลิวินาที บ่งชี้ว่าบริการ Alibaba Cloud OpenAPI ไม่สามารถเข้าถึงได้", + "ORG_ZSTACK_IMAGE_10039": "ไม่พบพื้นที่จัดเก็บสำรองที่เชื่อมต่อสำหรับ image[uuid:%s, name:%s]", + "ORG_ZSTACK_IMAGE_10038": "อิมเมจที่มี UUID [uuid:%s] และชื่อ [name:%s] ไม่ได้จัดเก็บบนพื้นที่จัดเก็บสำรองใดๆ", + "ORG_ZSTACK_IMAGE_10037": "ล้มเหลวในการสร้างเทมเพลต data volume จาก volume[uuid:%s] บนพื้นที่จัดเก็บสำรองทั้งหมด%s ดูสาเหตุของข้อผิดพลาดหนึ่งในนั้น", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10041": "คาดหวังค่าบูลีนหรือ Condition อื่น, Conditions ปัจจุบันมี: %s, แต่ได้รับ %s", + "ORG_ZSTACK_IMAGE_10036": "ล้มเหลวในการจัดสรรพื้นที่จัดเก็บสำรองทั้งหมด[uuid:%s], รายการข้อผิดพลาด: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10040": "EC2 instance เป็นค่าว่าง! โปรดตรวจสอบว่า instance ID ถูกต้องและไม่เป็นค่าว่าง", + "ORG_ZSTACK_IMAGE_10035": "ไม่พบวิธีแก้ไขพื้นที่จัดเก็บสำรองที่เหมาะสม โปรดตรวจสอบว่าการกำหนดค่าพื้นที่จัดเก็บบนคลาวด์ของคุณถูกต้องและสามารถเข้าถึงได้", + "ORG_ZSTACK_IMAGE_10034": "ล้มเหลวในการสร้างอิมเมจจาก root volume[uuid:%s] บนพื้นที่จัดเก็บสำรองทั้งหมด โปรดตรวจสอบสาเหตุของข้อผิดพลาดหนึ่งในนั้น", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10002": "ทรัพยากรไม่เพียงพอสำหรับการดาวน์โหลดอิมเมจ[uuid:%s] ระหว่างการย้ายข้อมูล volume[uuid:%s] ความจุที่ต้องการ: %s, ความจุทางกายภาพที่มีอยู่ในปัจจุบัน: %s", + "ORG_ZSTACK_IMAGE_10032": "ไม่สามารถจัดสรรพื้นที่จัดเก็บสำรองที่ระบุโดย UUIDs%s, รายการข้อผิดพลาด: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10003": "ความจุไม่เพียงพอสำหรับการย้ายข้อมูล volume [UUID: %s] ความจุที่ต้องการ: %d, ความจุทางกายภาพที่มีอยู่ในปัจจุบัน: %d", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10004": "ข้อมูลบน PS ต้นทาง[uuid: %s] ถูกทิ้งแล้วและไม่รองรับการย้อนกลับ", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10005": "ไม่รองรับการย้าย volume ที่ไม่มี snapshot บน shared block storage และไม่สามารถยกเลิกได้", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10000": "พบ trash ID (%s) ใน Primary Storage [%s] สำหรับ migrate install path [%s] โปรดล้างก่อนโดยใช้ 'APICleanUpTrashOnPrimaryStorageMsg' หากยังคงต้องการย้าย volume [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10001": "ไม่พบอิมเมจที่มี UUID:%s ในพื้นที่จัดเก็บสำรองที่เชื่อมต่อใดๆ ที่แนบกับ zone ที่มี UUID:%s โปรดตรวจสอบดังนี้:", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10039": "1. ตรวจสอบว่าพื้นที่จัดเก็บสำรองแนบกับ zone ที่มี UUID:%s อยู่", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10032": "2. ตรวจสอบว่าพื้นที่จัดเก็บสำรองอยู่ในสถานะเชื่อมต่อ; พยายามเชื่อมมต่อใหม่หากจำเป็น", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10036": "เฉพาะ methods เท่านั้นที่สามารถกำหนดภายใน Function ได้, แต่พบ %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10035": "Fn::FindInMap ไม่สามารถค้นหาทรัพยากร [%s] ภายใน Resources map!", + "ORG_ZSTACK_CORE_ERRORCODE_10007": "ไม่พบ Reference [%s]!", + "ORG_ZSTACK_CORE_ERRORCODE_10005": "functions ที่ไม่รองรับ [%s] ไม่ได้รับการรองรับใน ZStack resource template!", + "ORG_ZSTACK_IMAGE_10026": "ต้องระบุอาร์กิวเมนต์อินพุต 'regex' หรือ 'category' สำหรับการกรอง cloud resource", + "ORG_ZSTACK_CORE_ERRORCODE_10006": "elaboration code ต้องเป็นค่าตัวเลข!", + "ORG_ZSTACK_IMAGE_10025": "รูปภาพต้นทาง [%s] ไม่มีอยู่", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10051": "%s ไม่สามารถแปลงเป็น CloudString", + "ORG_ZSTACK_CORE_ERRORCODE_10003": "%s ไม่ใช่ไดเรกทอรีที่ถูกต้องหรือว่างเปล่า", + "ORG_ZSTACK_CORE_ERRORCODE_10004": "เกิดข้อผิดพลาดในการอ่านขณะประมวลผลไฟล์เทมเพลต [%s] ล้มเหลว เนื่องจาก: %s", + "ORG_ZSTACK_IMAGE_10023": "อินสแตนซ์ VM [uuid:%s] ไม่มี volume รูท", + "ORG_ZSTACK_IMAGE_10022": "อินสแตนซ์ VM [uuid:%s] ไม่มี volume ที่ต่ออยู่", + "ORG_ZSTACK_IMAGE_10021": "ที่เก็บข้อมูลสำรอง [uuid:%s] ไม่อยู่ในสถานะเชื่อมต่อ สถานะปัจจุบันคือ %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10042": "คาดหวังค่าบูลีน 'true' หรือ 'false' สำหรับออบเจกต์ แต่ได้รับ %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10046": "Fn::GetAtt ไม่พบทรัพยากรที่ระบุ [%s] ในรายการทรัพยากร!", + "ORG_ZSTACK_SSO_SAML2_SERVICE_10000": "iam2 มีผู้ใช้ที่มีชื่อเดียวกัน [%s] คาดหวังประเภท [%s] แต่พบประเภท [%s]", + "ORG_ZSTACK_COMPUTE_HOST_10119": "โฮสต์ [%s] ไม่มีอุปกรณ์ IPMI ที่กำหนดค่าหรืออุปกรณ์ IPMI ขาดที่อยู่ หลังจากกำหนดค่าที่อยู่ IPMI แล้ว โปรดเชื่อมต่อโฮสต์อีกครั้งเพื่อรีเฟรชข้อมูล IPMI", + "ORG_ZSTACK_ZQL_AST_VISITORS_PLUGIN_10000": "ต้องระบุฟิลด์ที่จะรวม", + "ORG_ZSTACK_SSO_SAML2_SERVICE_10001": "การเข้าสู่ระบบ SAML ซ้ำ [%s] สำหรับประเภท [%s]", + "ORG_ZSTACK_COMPUTE_HOST_10120": "ล้มเหลวในการย้าย VM [uuid:%s] บนโฮสต์ [uuid:%s, name:%s, ip:%s] จะพยายามปิดระบบอย่างปลอดภัย", + "ORG_ZSTACK_CORE_ERRORCODE_10001": "ไม่สามารถให้ไฟล์ต้นทางและเนื้อหา JSON ว่างเปล่าพร้อมกันได้ โปรดตรวจสอบให้แน่ใจว่ามีไฟล์ต้นทางที่ถูกต้องหรือระบุเนื้อหา JSON", + "ORG_ZSTACK_CORE_ERRORCODE_10002": "ไม่สามารถสแกนไดเรกทอรีทรัพยากรได้: %s", + "ORG_ZSTACK_CORE_ERRORCODE_10000": "ไม่มีไฟล์หรือเนื้อหาที่ให้มาสำหรับการกำหนดค่าทรัพยากรคลาวด์คอมพิวติ้ง", + "ORG_ZSTACK_COMPUTE_HOST_10124": "ความพยายามเชื่อมต่อโฮสต์ล้มเหลว คำขอ ping หมดเวลา โปรดตรวจสอบการเชื่อมต่อเครือข่ายและให้แน่ใจว่าโฮสต์ทำงานอยู่", + "ORG_ZSTACK_COMPUTE_HOST_10104": "ตรวจพบโฮสต์ที่มี IP การจัดการ [%s] สำหรับ hypervisor [%s]", + "ORG_ZSTACK_COMPUTE_HOST_10103": "คลัสเตอร์ [uuid:%s] ไม่มีประเภท hypervisor ที่กำหนด", + "ORG_ZSTACK_COMPUTE_HOST_10106": "สถาปัตยกรรมของคลัสเตอร์ [uuid:%s] คือ %s ซึ่งไม่ตรงกับสถาปัตยกรรมของโฮสต์ [name:%s, ip:%s] ที่ %s", + "ORG_ZSTACK_COMPUTE_HOST_10105": "หลังจากเชื่อมต่อ โฮสต์ [name:%s, ip:%s] ส่งคืนสถาปัตยกรรมเสมือนเป็น null", + "ORG_ZSTACK_COMPUTE_HOST_10100": "IPMI ของโฮสต์ [%s] ไม่สามารถเข้าถึงได้เนื่องจาก %s", + "ORG_ZSTACK_COMPUTE_HOST_10102": "คลัสเตอร์ [uuid:%s] ไม่มีอยู่", + "ORG_ZSTACK_SCHEDULER_10008": "ระบุหน่วยเวลาไม่ถูกต้อง: %s", + "ORG_ZSTACK_SCHEDULER_10005": "volume [%s] ไม่รองรับนโยบายการเก็บรักษา snapshot", + "ORG_ZSTACK_SCHEDULER_10006": "snapshotMaxNumber: รูปแบบไม่ถูกต้องเนื่องจาก %s", + "ORG_ZSTACK_COMPUTE_HOST_10108": "ประเภทบริการเครือข่ายโฮสต์ระบบ [%s] ไม่สามารถยกเลิกได้", + "ORG_ZSTACK_COMPUTE_HOST_10107": "ที่เก็บข้อมูลหลัก [uuid:%s] ถูกตัดการเชื่อมต่อแล้ว และโฮสต์ไม่มีทรัพยากรที่เก็บข้อมูลหลักที่ต่ออยู่อีกต่อไป", + "ORG_ZSTACK_COMPUTE_HOST_10109": "ประเภทบริการเครือข่ายโฮสต์ระบบ [%s] ไม่สามารถอัปเดตได้เนื่องจากการตั้งค่าการจำลองเสมือนที่ขัดแย้ง", + "ORG_ZSTACK_SCHEDULER_10002": "เทสก่อนหน้าไม่สำเร็จ ข้ามเทสกนี้", + "ORG_ZSTACK_COMPUTE_HOST_10114": "ไม่สามารถดูแล host[uuid:%s, status:%s] ที่ไม่ได้เชื่อมต่อ", + "ORG_ZSTACK_COMPUTE_HOST_10111": "อินสแตนซ์เซิร์ฟเวอร์ WebSSH ไม่ทำงาน โปรดตรวจสอบว่าเซิร์ฟเวอร์ SSH คลาวด์ (%s) ทำงานและกำหนดค่าอย่างถูกต้อง", + "ORG_ZSTACK_COMPUTE_HOST_10110": "มีประเภทบริการเครือข่ายโฮสต์[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10113": "managementIp[%s] ไม่ใช่ที่อยู่ IPv4 หรือชื่อโฮสต์ที่ถูกต้อง", + "ORG_ZSTACK_COMPUTE_HOST_10112": "มีโฮสต์ที่มี IP การจัดการ[%s]", + "ORG_ZSTACK_SCHEDULER_10018": "VM มีกำหนดเวลางานประเภท [%s] แล้ว", + "ORG_ZSTACK_SCHEDULER_10016": "VM ของ volume หลัก [%s] ไม่พร้อมใช้งาน โปรดตรวจสอบว่า VM มีอยู่", + "ORG_ZSTACK_SCHEDULER_10017": "snapshotGroupMaxNumber: รูปแบบไม่ถูกต้องเนื่องจาก %s", + "ORG_ZSTACK_SCHEDULER_10014": "Volume[%s] ไม่พร้อมใช้งาน โปรดตรวจสอบว่า volume มีอยู่และแนบอย่างถูกต้อง", + "ORG_ZSTACK_SCHEDULER_10015": "volume[%s] ไม่ใช่ root volume", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10068": "ไม่พบ volume ใน migrateVolumeStructs ระหว่างการย้ายระหว่าง shared block group primary storage!", + "ORG_ZSTACK_SCHEDULER_10013": "ฟิลด์[%s] ต้องไม่ว่างสำหรับการกำหนดค่าอินสแตนซ์คลาวด์", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10067": "โครงสร้างการย้าย volume ว่างเปล่าใน migrateVolumesBetweenSharedBlockGroupPrimaryStorageMsg!", + "ORG_ZSTACK_VPCFIREWALL_10027": "ruleSet[%s] มี rule ที่มีหมายเลข rule %s ที่ระบุแล้ว", + "ORG_ZSTACK_IPSEC_10006": "เครือข่าย [UUID: %s] ไม่มีบริการ IPsec เปิดใช้งาน", + "ORG_ZSTACK_VPCFIREWALL_10028": "ไม่สามารถเพิ่ม firewall rule[%d] เฉพาะโปรโตคอล TCP หรือ UDP เท่านั้นที่ใช้ port ได้", + "ORG_ZSTACK_IPSEC_10007": "remote CIDR[%s] ทับซ้อนกับ CIDRs ที่มีอยู่", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10000": "VM NICs ที่เพิ่มใหม่และ VM NICs ที่แนบอยู่ไม่ได้อยู่บน virtual router เดียวกัน อยู่บน virtual router ต่างกันที่มี UUIDs: %s และ %s", + "ORG_ZSTACK_IPSEC_10008": "remote CIDR[%s] และ remote CIDR[%s] ทับซ้อนกัน", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10001": "VM NICs ที่เพิ่มใหม่[uuids:%s] และ L3 networks[uuids:%s] ของ peer ของ load balancer[uuid: %s]'s VIP ไม่ได้อยู่บน virtual router เดียวกัน อยู่บน virtual router ต่างกันที่มี UUIDs[uuids:%s]", + "ORG_ZSTACK_IPSEC_10009": "CIDR[%s] ของ local router และ CIDR[%s] ของ remote router ทับซ้อนกัน", + "ORG_ZSTACK_IPSEC_10002": "ช่วง port ปัจจุบัน [%s, %s] ทับซ้อนกับช่วง port ที่ใช้อยู่ [%s, %s] สำหรับ VIP [uuid: %s] โปรโตคอล: UDP", + "ORG_ZSTACK_IPSEC_10003": "cidr[%s] ของ L3Network ที่แนบ[uuid:%s] ทับซ้อนกับ ipsec remote cidr[%s] ของ uuid:%s", + "ORG_ZSTACK_VPCFIREWALL_10029": "ไม่สามารถเพิ่ม firewall rule[%d] เฉพาะโปรโตคอล TCP เท่านั้นที่ใช้ TCP flags ได้", + "ORG_ZSTACK_IPSEC_10005": "ไม่พบไฟล์ source สำหรับ Java code โปรดตรวจสอบว่าไฟล์ที่จำเป็นถูกอัปโหลดและรวมอยู่ในโปรเจกต์ของคุณ", + "ORG_ZSTACK_VPCFIREWALL_10020": "ไม่สามารถแนบ default rule set ไปยัง network interface card อื่นได้", + "ORG_ZSTACK_IPSEC_10000": "ไม่พบ IPsec Connection [UUID:%s] อาจถูกลบไปแล้ว", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10006": "ต้องระบุ vmnic สำหรับการแชร์ทรัพยากร load balancer", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10073": "VM [UUID: %s] ไม่มี QMP socket เพิ่มเติมกำหนดค่าไว้ อาจเป็นเพราะ VM เริ่มทำงานโดยไม่มีการกำหนดค่า global [vm.additionalQmp] โปรดตรวจสอบว่าการกำหนดค่านี้ถูกเปิดใช้งานและรีบูต VM ใน ZStack", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10007": "ไม่พบ virtual router สำหรับ load balancer [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10072": "primary storage [UUID: %s] ได้ต่อ SCSI LUN [WWID: %s] แล้ว", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10071": "ไม่พบ hypervisor type ที่เหมาะสมสำหรับ primary storage [uuid:%s] เพื่อจัดการ image format หรือ volume format [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10004": "รีเฟรชใบรับรอง load balancer เนื่องจาก:%s", + "ORG_ZSTACK_VPCFIREWALL_10021": "ruleSet[%s] มี l3[%s] อยู่แล้ว", + "ORG_ZSTACK_SCHEDULER_10009": "trigger job[uuid: %s] ล้มเหลว เนื่องจากเกิดข้อผิดพลาดในกระบวนการ provisioning ของ virtual machine instance", + "ORG_ZSTACK_ZWATCH_MYSQL_10001": "ไม่พบ MySQL database instance [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10005": "รีเฟรช load balancer listener เนื่องจาก:%s", + "ORG_ZSTACK_VPCFIREWALL_10022": "มี rule ที่มีหมายเลข [%s] อยู่แล้ว", + "ORG_ZSTACK_SCHEDULER_10029": "ไม่สามารถเพิ่ม job[uuid:%s] ไปยัง trigger ที่ล้าสมัย[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10077": "shared volume[uuid: %s] บน shared block group primary storage ไม่สามารถปรับขนาดได้", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10076": "ไม่พบ volume[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10075": "shared block[UUID:%s, diskUUID:%s, description:%s] มีอยู่แล้วใน shared block group[UUID:%s] ใน new shared block group", + "ORG_ZSTACK_SCHEDULER_10028": "ไม่สามารถเพิ่ม job ที่มี UUID [%s] ไปยัง trigger ที่มี UUID [%s] เดียวกันซ้ำ", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10074": "ต้องระบุ disk อย่างน้อยหนึ่งตัวเมื่อเพิ่ม shared block group สำหรับ primary storage", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10079": "ไม่พบการเตรียมการของ volume[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10078": "shared volume[UUID: %s] บน shared block group primary storage ต่ออยู่กับ VM instances ที่ไม่ได้หยุดทำงาน[UUIDs: %s]", + "ORG_ZSTACK_SCHEDULER_10021": "ต้องระบุ interval เมื่อใช้ simple scheduler สำหรับการดำเนินการซ้ำมากกว่าหนึ่งครั้ง", + "ORG_ZSTACK_VPCFIREWALL_10016": "เฉพาะ TCP หรือ UDP protocols เท่านั้นที่สามารถใช้ ports ในสภาพแวดล้อม cloud computing", + "ORG_ZSTACK_VPCFIREWALL_10017": "เฉพาะ TCP protocol เท่านั้นที่สามารถใช้ TCP flags", + "ORG_ZSTACK_IPSEC_10018": "VIP[uuid:%s] ถูกใช้สำหรับ %s instance(s) แล้ว", + "ORG_ZSTACK_VPCFIREWALL_10014": "ruleSet[%s] มี rule ที่มี priority %d เดียวกันอยู่แล้ว", + "ORG_ZSTACK_IPSEC_10019": "peer address[%s] ไม่สามารถเป็น VIP address เดียวกันได้", + "ORG_ZSTACK_VPCFIREWALL_10015": "ไม่สามารถ update default rule[%s]", + "ORG_ZSTACK_IPSEC_10013": "networks ทั้งหมดภายใน IPsec Connection เดียวกันต้องเชื่อมโยงกับ Virtual Private Cloud (VPC) router เดียวกัน", + "ORG_ZSTACK_IPSEC_10014": "ไม่มี master VPC สำหรับ HA group %s", + "ORG_ZSTACK_VPCFIREWALL_10018": "ICMP protocol เป็น protocol เดียวที่สามารถใช้ ICMP types ได้ โปรดตรวจสอบว่า code ระบุ protocol ที่ถูกต้อง", + "ORG_ZSTACK_IPSEC_10015": "มี VPC[%s] ที่ใช้ IPsec plugin เวอร์ชันเก่าอยู่ โปรดอัปเกรดเพื่อสร้าง IPsec connection", + "ORG_ZSTACK_VPCFIREWALL_10019": "rule [%%s] index ไม่ถูกต้อง", + "ORG_ZSTACK_IPSEC_10016": "มี IPsec connection[uuid:%s, name:%s] ที่มี virtual router และ peer address เดียวกันอยู่แล้ว", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10080": "ใช้พื้นที่เก็บข้อมูลแบบ thick-provisioned เป็น volume แคช; การจัดสรรของ volume [%s] คือ %s", + "ORG_ZSTACK_IPSEC_10010": "", + "ORG_ZSTACK_IPSEC_10011": "เครือข่ายทั้งหมดภายใน IPsec Connection เดียวกันต้องเป็นประเภทเดียวกัน", + "ORG_ZSTACK_IPSEC_10012": "", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10084": "IPsecConnection สามารถมีเครือข่ายได้เพียง 1 สำหรับ %s", + "ORG_ZSTACK_VPCFIREWALL_10010": "", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10081": "L3Network [UUID: %s] ยังไม่ได้ต่อกับ VPC router", + "ORG_ZSTACK_SCHEDULER_10038": "", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10086": "ไม่สามารถดึง cluster UUID ของ volume %s ได้", + "ORG_ZSTACK_SCHEDULER_10039": "", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10085": "มี rule template ที่มีชื่อ %s อยู่แล้ว", + "ORG_ZSTACK_SCHEDULER_10036": "", + "ORG_ZSTACK_SCHEDULER_10037": "SCSI LUN ที่มี UUID [%s] และ WWID [%s] ติดตั้งอยู่กับ primary storage ที่มี UUID [%s] แล้ว", + "ORG_ZSTACK_SCHEDULER_10034": "", + "ORG_ZSTACK_SCHEDULER_10035": "รูปแบบ cron expression ไม่ถูกต้อง โปรดตรวจสอบให้เป็นไปตามไวยากรณ์ CRON มาตรฐาน", + "ORG_ZSTACK_SCHEDULER_10032": "", + "ORG_ZSTACK_SCHEDULER_10033": "ไม่พบ KVM host ที่เหมาะสมสำหรับ shared block group primary storage[uuid: %s]", + "ORG_ZSTACK_SCHEDULER_10030": "", + "ORG_ZSTACK_SCHEDULER_10031": "cron task ต้องเป็นไปตามรูปแบบ: \"0 0/3 17-23 * * ?\"", + "ORG_ZSTACK_VPCFIREWALL_10005": "", + "ORG_ZSTACK_VPCFIREWALL_10006": "sanlock ระบุว่า host %s ไม่สามารถติดต่อได้บน %s", + "ORG_ZSTACK_VPCFIREWALL_10003": "", + "ORG_ZSTACK_VPCFIREWALL_10004": "stopTime เกินเวลาปัจจุบันใน virtual environment โปรดตรวจสอบให้ stopTime ถูกตั้งค่าเป็นเวลาในอนาคต", + "ORG_ZSTACK_VPCFIREWALL_10001": "", + "ORG_ZSTACK_VPCFIREWALL_10000": "ต้องกำหนดค่า cron เมื่อใช้ cron scheduler", + "ORG_ZSTACK_SCHEDULER_10045": "", + "ORG_ZSTACK_SCHEDULER_10043": "Duration timeout อยู่นอกช่วงที่ถูกต้อง", + "ORG_ZSTACK_SCHEDULER_10044": "", + "ORG_ZSTACK_SCHEDULER_10041": "stopTime เกินช่วงที่ถูกต้องสำหรับรูปแบบ MySQL timestamp", + "ORG_ZSTACK_SCHEDULER_10042": "", + "ORG_ZSTACK_SCHEDULER_10040": "การกำหนดค่า Cron scheduler เพียงแค่ต้องระบุ expression ของ cron task", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10005": "กรุณาบูรณาการ zbox เข้ากับ management node สำหรับการจัดสรรทรัพยากร cloud", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10006": "ล้มเหลวในการสำรองข้อมูล database: %s", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10003": "service[%s] ไม่ได้ active", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10007": "มี external backup อื่น [UUID: %s] อยู่ในโหมด recovery", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10002": "service[%s] ไม่รองรับการ reload configuration", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10008": "ทั้ง host UUIDs และ backup storage UUIDs ว่างเปล่าทั้งคู่ คุณต้องระบุอย่างน้อยหนึ่งอย่าง", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10001": "service[%s] ไม่ได้ถูกค้นพบ", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10001": "การ recovery volume[uuids:%s] ล้มเหลว คุณสามารถเรียกใช้อีกครั้งได้โดยการเชื่อมต่อใหม่", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10000": "service[%s] ได้ลงทะเบียนแล้วและกำลัง active ในสภาพแวดล้อม cloud", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10002": "ไม่พบไฟล์ configuration สำหรับ recovery ชื่อ recover.conf ภายใต้ directory การติดตั้ง zbox backup", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10004": "Zbox ควรถูก attach ไปยัง host ก่อน", + "ORG_ZSTACK_VPCFIREWALL_10069": "ไม่พบ VPC firewall IP set template ที่มี UUID: %s อาจถูกลบไปแล้ว", + "ORG_ZSTACK_VPCFIREWALL_10063": "การ attach firewall rule set[%s] ล้มเหลวเนื่องจากข้อผิดพลาดที่เกี่ยวข้องกับการกำหนดค่า virtual network", + "ORG_ZSTACK_VPCFIREWALL_10064": "การ detach ruleSet ล้มเหลว อาจเนื่องจากการลบ", + "ORG_ZSTACK_VPCFIREWALL_10061": "การลบ firewall rule ล้มเหลวบน vRouter[%s] เนื่องจาก %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10010": "Fn::Select index อยู่นอกช่วง กรุณาตรวจสอบ JSON configuration ของคุณ!", + "ORG_ZSTACK_VPCFIREWALL_10062": "การเปลี่ยนสถานะ firewall rule บน vRouter[%s] ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_VPCFIREWALL_10067": "ไม่พบ VPC firewall ที่มี UUID: %s ที่เกี่ยวข้องกับ virtual router", + "ORG_ZSTACK_VPCFIREWALL_10068": "ไม่พบ VPC firewall rule set ที่มี UUID: %s อาจถูกลบไปแล้ว", + "ORG_ZSTACK_VPCFIREWALL_10065": "การ detach firewall rule set[%s] ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10014": "ไม่พบ parameter [%s]!", + "ORG_ZSTACK_VPCFIREWALL_10066": "ไม่พบ VPC firewall ที่มี UUID: %s อาจถูกลบไปแล้ว", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10013": "Parameter [%s] ไม่มีค่าที่ระบุหรือค่าเริ่มต้นที่พบ!", + "ORG_ZSTACK_VPCFIREWALL_10060": "การสร้าง firewall rule set[%s] ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_IMAGE_10046": "Image ที่มี UUID [uuid:%s] และ name [name:%s] ยังไม่ได้ถูกลบจาก backup storage ที่มี UUID [uuid:%s]", + "ORG_ZSTACK_IMAGE_10045": "Image ที่มี UUID [uuid:%s] และ name [name:%s] ไม่พร้อมใช้งานบน backup storage ที่มี UUID [uuid:%s]", + "ORG_ZSTACK_IMAGE_10044": "Image ที่มี UUID [uuid:%s] และ name [name:%s] ยังไม่ได้ถูกลบจาก backup storage ใดๆ", + "ORG_ZSTACK_IMAGE_10043": "Image ที่มี UUID [uuid:%s] และ name [name:%s] มีสถานะ [status:%s] บน backup storage ที่มี UUID [backup storage uuid:%s] ซึ่งไม่ใช่ Deleted", + "ORG_ZSTACK_IMAGE_10040": "การ detach iso ที่มี uuid=%s ล้มเหลว ข้อผิดพลาดคือ %s", + "ORG_ZSTACK_VPCFIREWALL_10058": "ลบกฎไฟร์วอลล์บน vRouter[%s] เนื่องจาก %s", + "ORG_ZSTACK_VPCFIREWALL_10052": "ruleset เริ่มต้น %s สามารถแนบได้เฉพาะกับ interface forward หนึ่งตัว แต่พบ interfaces ที่เกี่ยวข้องหลายตัว: %s", + "ORG_ZSTACK_VPCFIREWALL_10050": "firewall %s ที่เกี่ยวข้องกับ VPC ไม่อยู่ในสถานะ running", + "ORG_ZSTACK_VPCFIREWALL_10051": "ไม่สามารถลบ rule set [%s] ได้เนื่องจากยังแนบอยู่กับ network interface card", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10020": "ไม่พบ condition [%s] ในรายการ 'Conditions'", + "ORG_ZSTACK_VPCFIREWALL_10056": "ไม่พบ MAC address ที่เชื่อมโยงกับ l3[%s] บน vRouter[%s]", + "ORG_ZSTACK_VPCFIREWALL_10057": "สร้างกฎไฟร์วอลล์[%s] ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_VPCFIREWALL_10054": "sync configuration ไฟร์วอลล์ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_VPCFIREWALL_10055": "อัปเดต firewall rule set action ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_VPCFIREWALL_10049": "ไม่พบการเปลี่ยนแปลงใน ruleset %s", + "ORG_ZSTACK_VPCFIREWALL_10047": "ถอด firewall rule set จาก network[%s] ล้มเหลว เนื่องจาก %s", + "ORG_ZSTACK_VPCFIREWALL_10048": "พบหมายเลขกฎซ้ำกัน %s บน firewall %s, l3 %s, forward %s", + "ORG_ZSTACK_SSO_CAS_SERVICE_10002": "iam2 มี user ที่มีชื่อซ้ำกัน[%s]", + "ORG_ZSTACK_SSO_CAS_SERVICE_10003": "มีการพยายาม login ซ้ำสำหรับ user type[%s]", + "ORG_ZSTACK_SSO_CAS_SERVICE_10004": "ไม่พบ CasLogin สำหรับ type(%s)", + "ORG_ZSTACK_VPCFIREWALL_10041": "ไม่สามารถเพิ่มกฎไฟร์วอลล์ได้เนื่องจากความยาวของ description %s ไม่ถูกต้องสำหรับหมายเลขกฎ %d", + "ORG_ZSTACK_VPCFIREWALL_10040": "ไม่สามารถเพิ่มกฎไฟร์วอลล์ได้เนื่องจากไม่มี state สำหรับหมายเลขกฎ:%d", + "ORG_ZSTACK_VPCFIREWALL_10045": "กฎไฟร์วอลล์ในไฟล์ configuration มี syntax errors: %s", + "ORG_ZSTACK_VPCFIREWALL_10046": "แนบ firewall rule set[%s] ให้กับ layer 3 network[%s] ล้มเหลวเนื่องจาก %s", + "ORG_ZSTACK_VPCFIREWALL_10044": "ไฟล์ configuration สำหรับ virtual machine instance มี format error กรุณาตรวจสอบไฟล์และให้แน่ใจว่าตรงตาม schema ที่กำหนด", + "ORG_ZSTACK_VPCFIREWALL_10038": "ไม่สามารถเพิ่มกฎไฟร์วอลล์ได้เนื่องจากความยาวของ source IP: %s ไม่ถูกต้องสำหรับหมายเลขกฎ: %d", + "ORG_ZSTACK_VPCFIREWALL_10039": "ไม่สามารถเพิ่มกฎไฟร์วอลล์ได้เนื่องจากความยาวของ destination IP: %s ไม่ถูกต้องสำหรับหมายเลขกฎ: %d", + "ORG_ZSTACK_VPCFIREWALL_10036": "ไม่สามารถเพิ่มกฎไฟร์วอลล์ได้เนื่องจากหมายเลขกฎ %d ไม่ถูกต้อง", + "ORG_ZSTACK_VPCFIREWALL_10037": "ไม่สามารถเพิ่มกฎไฟร์วอลล์ได้เนื่องจากไม่มี action ที่กำหนดสำหรับ ruleNo:%d", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10002": "vyos initialization command ล้มเหลวเนื่องจาก:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10001": "ไม่สามารถสร้างการเชื่อมต่อ SSH ไปยัง virtual router[%s] ได้หลังจาก configure SSH settings", + "ORG_ZSTACK_VPCFIREWALL_10030": "ไม่สามารถเพิ่มกฎไฟร์วอลล์[%d] ได้เนื่องจากเฉพาะ protocol ICMP เท่านั้นที่รองรับ specific types", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10003": "ล้มเหลวในการเปลี่ยน firewall default action สำหรับ network interface [ip:%s, mac:%s] บน virtual router [uuid:%s] เนื่องจาก %s", + "ORG_ZSTACK_VPCFIREWALL_10031": "ไม่สามารถเพิ่มกฎไฟร์วอลล์[%d] ได้เนื่องจากเฉพาะ protocol TCP หรือ UDP เท่านั้นที่รองรับสำหรับ port-based rules", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10006": "ไม่สามารถเริ่มทำงาน DHCP server บน virtual router VM[uuid:%s] ได้เนื่องจาก %s", + "ORG_ZSTACK_ZWATCH_FUNCTION_10014": "ข้อผิดพลาดในการระบุอาร์กิวเมนต์ที่จำเป็นสำหรับประเภทอินสแตนซ์ในเทมเพลตคลาวด์ฟอร์เมชัน", + "ORG_ZSTACK_ZWATCH_FUNCTION_10013": "ตรวจพบอาร์กิวเมนต์ที่ไม่รู้จัก โปรดตรวจสอบว่าพารามิเตอร์บรรทัดคำสั่งทั้งหมดถูกต้อง และอ้างอิงเอกสารสำหรับรายการอาร์กิวเมนต์ที่รองรับ", + "ORG_ZSTACK_VPCFIREWALL_10034": "ไม่สามารถเพิ่มกฎไฟร์วอลล์[%d] เนื่องจากมีเพียงโปรโตคอล TCP ที่รองรับ TCP flags ในสภาพแวดล้อมนี้", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10007": "ไม่สามารถหยุดเซิร์ฟเวอร์ DHCP บนอินสแตนซ์เราเตอร์เสมือน [uuid:%s] เนื่องจาก %s", + "ORG_ZSTACK_VPCFIREWALL_10035": "ไม่สามารถเพิ่มกฎไฟร์วอลล์[%d] เนื่องจากเกิดข้อผิดพลาด %s" +} \ No newline at end of file diff --git a/conf/i18n/globalErrorCodeMapping/global-error-zh_CN.json b/conf/i18n/globalErrorCodeMapping/global-error-zh_CN.json new file mode 100644 index 00000000000..d9c6767a4aa --- /dev/null +++ b/conf/i18n/globalErrorCodeMapping/global-error-zh_CN.json @@ -0,0 +1,4717 @@ +{ + "ORG_ZSTACK_XINFINI_SDK_10001": "格式化 API 结果到类[%s]失败,resultString: %s, exception: %s", + "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10001": "不支持的数据中心 [%s] 类型 here!", + "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10000": "arg \u0027endpoint\u0027 必须在 %s 类型中设置", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10080": "无法决定裸金属2实例应创建在哪个区域中", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10084": "在创建裸金属实例时, neither chassisUuid nor chassisOfferingUuid 已设置", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10082": "机箱没有足够的容量容纳镜像[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10081": "所需的机箱硬盘[%s]不属于机箱[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10087": "%s 只能在裸金属实例运行时创建或删除", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10086": "%s 只能被创建或删除", + "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10000": "不符合输入格式,仅接受\u0027^[0-9,]+$\u0027\"", + "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10001": "宿主机上的虚拟机仅拥有 % 个 CPU", + "ORG_ZSTACK_ZWATCH_UTILS_10001": "资源[%s]不支持zwatch返回带with子句", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10002": "身份认证功能已启用但相应的资源池未设置,请重新启用该功能并尝试再次操作", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10003": "无法删除正在使用的资源池 %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10000": "没有可用的安全虚拟机可以激活", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10001": "无效的令牌类型 %s,仅支持 %s。", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10059": "空许可证授权节点数是必需的", + "ORG_ZSTACK_STORAGE_PRIMARY_10039": "未找到主存储[uuid:%s]", + "ORG_ZSTACK_V2V_10019": "主要存储[uuid:%s]不支持v2v迁移", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10007": "失败于通过状态事件[%s]更改卷快照[%s:%s]的状态", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10006": "无法在主存储[uuid:%s]上获取卷[uuid:%s, 安装路径:%s]的大小,因为%s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10005": "失败在主要存储[uuid:%s]上获取卷[uuid:%s, 安装路径:%s]的大小,%s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10004": "vm[uuid:%s] 没有运行、暂停或销毁、停止、正在销毁,当前状态[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_10040": "主要存储[uuid\u003d%s]不存在", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10003": "卷未找到,卷Uuid: %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10002": "快照或其后裔有引用卷[uuids:%s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10001": "无法找到卷快照[uuid:%s, name:%s],它可能在之前的操作中已被删除", + "ORG_ZSTACK_STORAGE_PRIMARY_10047": "cidr[%s] 输入格式错误", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10050": "ZSha2 显示存在另一个管理节点,但数据库中未找到该节点", + "ORG_ZSTACK_STORAGE_PRIMARY_10046": "仅允许一个主要存储 CIDR 系统标签,但获得了 %d 个", + "ORG_ZSTACK_STORAGE_PRIMARY_10049": "集群Uuid冲突,实例提供中指定的集群是%s,而创建参数中指定的集群是%s", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10052": "未找到解注册的appId!", + "ORG_ZSTACK_STORAGE_PRIMARY_10042": "请指定分配空间的目的", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10008": "无法将卷[uuid:%s]恢复至快照[uuid:%s],关联的虚拟机[uuid:%s]卷当前不在已停止状态,当前状态是%s", + "ORG_ZSTACK_STORAGE_PRIMARY_10044": "无法找到任何合格的主存储,错误信息是 %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10000": "失败更新组状态: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10050": "主存储UUID冲突,实例报价中指定的主存储为%s,创建参数中指定的主存储为%s", + "ORG_ZSTACK_V2V_10008": "不允许在网络[%s]中使用相同的MAC地址[%s]", + "ORG_ZSTACK_V2V_10009": "重复的 MAC 地址 [%s] 在网络[%s] 中", + "ORG_ZSTACK_STORAGE_PRIMARY_10052": "主存储UUID冲突,由磁盘配置指定的主存储为%s,而创建参数中指定的主存储为%s", + "ORG_ZSTACK_V2V_10006": "转换主机[uuid:%s]的底层宿主机应当是已连接状态", + "ORG_ZSTACK_V2V_10007": "转换主机[uuid:%s]无法连接到主要存储[uuid:%s]", + "ORG_ZSTACK_V2V_10004": "vm 实例[uuid:%s] 不存在或不是一个 VMware 虚拟机", + "ORG_ZSTACK_V2V_10005": "conversionHostUuid 不应为空", + "ORG_ZSTACK_V2V_10002": "v2v 转换宿主机存储路径必须是绝对路径", + "ORG_ZSTACK_V2V_10003": "无效的迁移 URL: %s", + "ORG_ZSTACK_V2V_10000": "主机[uuid:%s]的状态必须为连接状态", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10021": "无法获取内存快照,预期的虚拟机状态是[%s, %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10020": "卷快照[uuids:%s]处于禁用状态,无法还原卷至该快照", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10029": "失败取消删除任务。卷[uuid:%s]关联的虚拟机不在状态%s,离线快照删除不支持取消。", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10028": "取消删除任务失败。卷[uuid:%s]关联的虚拟机不存在,离线快照删除不支持取消。", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10027": "取消删除任务失败。卷[uuid:%s]未绑定到任何虚拟机,离线快照删除不支持取消。", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10026": "取消删除任务失败。卷[uuid:%s]不存在。", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10025": "无法找到快照[%s]的卷UUID", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10024": "不支持在不同卷上删除快照[uuid: %s, %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10023": "原始卷对于快照[uuid:%s]已被删除,无法将卷恢复到该状态", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10022": "卷快照[uuid:%s]当前状态为%s,无法将其恢复到原卷", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10018": "无法找到快照: %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10017": "主要存储[uuid:%s]不支持卷快照;无法为卷[uuid:%s]创建快照", + "ORG_ZSTACK_YUNSHAN_UTIL_10000": "URL为空,请配置云山NSP。", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10016": "无法请求主存储[uuid:%s]的卷快照功能", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10015": "无法找到主存储类型 [%s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10012": "不支持的最大快照数量 (%d) 为卷 [uuid:%s] 设置", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10027": "SanSecClientFactory 测试连接失败", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10019": "此资源类型 %s 不支持查询内存快照引用", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10007": "panguPartitionUuid [%s] 与 identityZoneUuid [%s] 不匹配", + "ORG_ZSTACK_APPLIANCEVM_10006": "Appliances VM[uuid:%s] 处于无法向 %s 发起 HTTP 调用的状态 %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10006": "panguPartitionUuid 或 identityZoneUuid 必须设置。", + "ORG_ZSTACK_AI_10120": "模型中心[uuid:%s]未找到", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10008": "无法删除身份区域 [%s],阿里云 Ebs PrimaryStorage [%s] 仍然存在,请先将其删除。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10061": "无法更改安全组规则,因为规则协议是 [%s],目标端口范围不能为空", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10060": "无法更改安全组规则,因为规则协议为 [%s],目标端口范围无法设置", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10063": "无法更改安全组规则,因为规则[%s]与数据库中uuid:%s的规则重复", + "ORG_ZSTACK_APPLIANCEVM_10000": "设置设备启动信息错误,因为:%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10062": "无法更改安全组规则,因为规则协议是 [%s],目标端口范围必须设置", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10033": "无法删除实例配置[uuid:%s],因为它被NFV实例组[%s]使用", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10001": "阿里云 EBS 当前不支持运行中 VM 的扩容。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10031": "无法在状态不是初始化时分配NfvInstGroup[uuid:%s, name:%s]。", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10000": "无法找到设备路径从卷:%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10032": "无法为不含成员的NfvInstGroup[uuid:%s, name:%s]分配资源。请在分配前先在该组中创建至少一个NFV实例。", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10003": "ISO [%s] 已经被挂载,我们必须先卸载它才能重新挂载", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10006": "无效的CPU[%s],主机[UUID:%s]不存在编号为%s的CPU", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10030": "无法为未配置VIP的NfvInstGroup[uuid:%s, name:%s]分配资源。请在分配之前为该组配置一个VIP。", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10005": "url 必须以 http:// 或 https:// 开头,但得到的是 %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10004": "阿里云海洋端点的 URL 必须设置以用于 ebs 主存储", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10019": "名称[%s]无效,名称要求:1~128个字符,支持大写和小写字母、数字、下划线和破折号;它只能以大写或小写字母开头;不允许以空格开头或结尾", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10013": "查询失败, errorType:%s, error: %s", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10012": "冲突告警规则[%s],已存在同名规则[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10018": "在集群[uuid:%s]中未找到无法使用的baremetal2网关", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10028": "NFV实例[uuid:%s]不属于组[uuid:%s,名称:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10017": "在集群[uuid:%s]中未找到裸金属2网关", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10010": "失败创建新的文件[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10029": "NfvInstGroup [uuid:%s] 未找到", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10026": "无法将最后一个成员的NFV实例[uuid:%s]从组[uuid:%s, name:%s]中分离,该组至少必须有一个成员。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10027": "无法分离最后一个运行中的成员NFV实例[uuid:%s],从组[uuid:%s, name:%s]中分离它,至少必须有一个成员处于运行状态。", + "ORG_ZSTACK_AI_10129": "意外获取到:null 从 %s 的 token: %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10024": "NFV实例 [uuid:%s] 未找到", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10016": "输入 %s 签名验证失败", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10025": "无法从组[uuid:%s, name:%s]中解绑NFV实例[uuid:%s],因为该实例未绑定。当前状态详情是%s", + "ORG_ZSTACK_STORAGE_PRIMARY_10003": "备份存储[uuid:%s]未绑定至区域[uuid:%s],主存储[uuid:%s]所属的区域是", + "ORG_ZSTACK_AI_10127": "模式必须不为空", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10011": "在集群[uuids:%s]中为裸金属2实例[uuid:%s]分配机箱失败", + "ORG_ZSTACK_AI_10128": "当前允许的值为 [\u0027%s\u0027]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10010": "在集群[uuids:%s]中为裸金属实例[uuid:%s]分配网关失败", + "ORG_ZSTACK_AI_10125": "无效的模型分类: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10004": "卷[uuid:%s]已被连接到一个%s虚机。虚机应当处于停止状态。", + "ORG_ZSTACK_AI_10126": "存储在 ModelServiceVO[uuid: %s] 中的无效 YAML:%s", + "ORG_ZSTACK_AI_10123": "无法找到模型中心[uuid: %s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10015": "分配 IP %s 超出 DHCP 范围 %s ~ %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10014": "分配的 IP 地址 %s 已被其他实例占用", + "ORG_ZSTACK_AI_10121": "没有找到模型中心,请先创建一个模型中心", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10013": "只有baremetal2集群[uuid:%s]满足机箱和网关的需求,但它们没有附加的分配网络", + "ORG_ZSTACK_STORAGE_PRIMARY_10000": "无法将ISO附件添加到已禁用的主要存储[uuid:%s]中", + "ORG_ZSTACK_AI_10122": "创建系统标签到ModelServiceInstanceGroupVO[uuid: %s]失败,因为%s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10012": "在集群[uuid:%s]中未找到裸金属2集群", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10019": "无效安装路径: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10010": "追加 volumeId: %s,但 URL 中已存在另一个 volumeId: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10012": "主机UUID [%s] 已存在于URL: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10014": "无效安装地址: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10015": "无法在宿主机上找到 devicePath: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10008": "没有找到baremetal2集群", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10002": "在宿主机[uuid:%s]中为虚拟机[uuid:%s]生成vHost User Client失败:%s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10007": "缺少信息,无法确定应使用哪个裸金属2集群", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10006": "没有为该区域[uuid:%s]附加备份存储,该区域包含ISO[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10005": "无法在任何连接的备份存储中找到图像[uuid:%s]。请检查以下内容:\n1. 如果备份存储已附加到包含虚拟机[name: %s, uuid:%s]的区域,请确认。\n2. 确认备份存储是否处于连接状态,如果不是,请尝试重新连接。", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10000": "在宿主机[uuid:%s]中删除vm[uuid:%s]的vHost User Client失败:%s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10009": "在集群[uuids:%s]中为裸金属2实例[uuid:%s]分配主存储失败", + "ORG_ZSTACK_STORAGE_PRIMARY_10014": "主要存储[uuid:%s]无法被删除,因为它仍然与集群[uuid:%s]关联。", + "ORG_ZSTACK_AI_10116": "无法找到任何服务实例组", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10000": "裸金属服务器实例[uuid:%s]要么不存在,要么未连接,无法更改其密码", + "ORG_ZSTACK_AI_10117": "无法找到 uuid [%s] 的数据集", + "ORG_ZSTACK_STORAGE_PRIMARY_10016": "无法挂载主存储为维护状态的磁盘[uuid:%s]", + "ORG_ZSTACK_AI_10114": "模型服务实例组[UUID: %s]未找到,中断等待服务启动存活检查", + "ORG_ZSTACK_AI_10115": "Either \u0027groupUuids\u0027 或 \u0027SyncAll\u0027 必须提供", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10004": "无法在任何连接的备份存储中找到图像[uuid:%s],该备份存储已连接至区域[uuid:%s]。请检查以下内容:\n1. 该备份存储是否已连接至包含虚拟机[name: %s, uuid:%s]的区域\n2. 如果备份存储未处于连接状态,请尝试重新连接", + "ORG_ZSTACK_AI_10112": "不支持的模型服务类型: %s,无法找到相关的后端处理重启操作", + "ORG_ZSTACK_AI_10113": "模型服务实例组[uuid: %s]未找到,跳过等待服务启动流程", + "ORG_ZSTACK_AI_10111": "无法找到模型服务组[uuid: %s]", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10001": "无法获取接口LLDP信息,该接口未处于接收模式", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10037": "无法找到带有 uuid [%s] 的授权节点", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10003": "获取[%s]的LLDP引用失败", + "ORG_ZSTACK_STORAGE_PRIMARY_10018": "zoneUuids, clusterUuids, primaryStorageUuids 至少有一个不能为空列表,或者全部设为 true", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10032": "未经授权的节点在升级到许可服务器之前不应存在", + "ORG_ZSTACK_STORAGE_PRIMARY_10017": "输出协议[%s]已在主存储[%s]存在,无需再次添加", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10033": "某些相关的授权节点未被删除", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10085": "安全组[uuid:%s]尚未绑定至L3网络[uuid:%s],无法解绑", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10000": "无法更改不同主机的接口的LLDP模式", + "ORG_ZSTACK_STORAGE_PRIMARY_10019": "主要存储[uuid:%s]尚未被附加到集群[uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10087": "无法删除默认规则[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10011": "无法删除状态为运行中的NfvInstGroup[uuid:%s, name:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10086": "无法删除不同安全组的规则", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10089": "第3层网络[uuid:%s]没有启用网络服务类型[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10088": "安全组[uuid:%s]已绑定至L3网络[uuid:%s], 无法再次绑定", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10010": "无法创建NFV实例,组[uuid:%s, name:%s]已有%d个成员,最大值为3", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10026": "相对时间[%s]无效,它太大了", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10025": "相对时间[%s]无效,它必须采用例如10s、1h的格式", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10008": "无法在组[uuid:%s, name:%s]处于正常模式时创建NFV实例。请先将模式更改为维护模式。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10009": "无法在组[uuid:%s, name:%s]处于%s状态时创建NFV实例", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10006": "nfv 实例 %s [uuid: %s] 位于 nfv 实例组 %s [uuid: %s] 的ha状态从 %s 更改为 %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10039": "vhost 卷不支持附加到 bareMetal2Instance 上", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10038": "nic 与 mac:%s 无法绑定到 l3Network,因为该 nic 已经被绑定", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10004": "所有节点状态都不是预期状态", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10002": "创建亲和组 для NFV 实例组 [uuid:%s] 失败", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10033": "当将L3网络附加到Baremetal2实例时,customMac是必填项", + "ORG_ZSTACK_STORAGE_PRIMARY_10024": "主要存储[uuid: %s]中包含的卷未启用或连接", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10032": "L2网络类型 %s 不被裸金属2实例支持", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10031": "仅支持裸金属2实例使用IPv版本%d的L3网络", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10031": "只有license服务器可以注销license客户端", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10030": "裸金属2实例[uuid:%s]尚未分配机箱,请启动该实例后再试一次", + "ORG_ZSTACK_STORAGE_PRIMARY_10021": "主要存储[uuid:%s]和集群[uuid:%s]不在同一区域", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10037": "MAC地址 %s 已经被使用,请尝试另一个", + "ORG_ZSTACK_STORAGE_PRIMARY_10020": "主要存储[uuid:%s]已附加到集群[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10036": "裸金属2实例[uuid:%s]运行在机箱[uuid:%s]上,而该机箱没有带有MAC地址%s的非配置网络接口卡", + "ORG_ZSTACK_STORAGE_PRIMARY_10023": "\u0027resourceUuid\u0027 和 \u0027resourceType\u0027 必须同时都设置或都不设置!", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10035": "重复的 MAC 地址 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10022": "url[%s] 被占用,它在同一集群中不能重复", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10034": "%s 不是有效的MAC地址", + "ORG_ZSTACK_AI_10130": "意外获取值:%s 从 %s,预期值为:%s", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10026": "无效的许可类型 %s", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10027": "注册许可证服务器时不应存在授权节点", + "ORG_ZSTACK_STORAGE_PRIMARY_10029": "无法在主存储[uuid:%s]预留 %s 字节空间,可用容量不足", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10093": "VM nics[uuids:%s] 不在已绑定到安全组[uuid:%s]的L3网络上", + "ORG_ZSTACK_STORAGE_PRIMARY_10028": "在扣除预留容量[%s]后,没有满足要求大小[%s 字节]的主存储可用,可能是主存储物理容量的阈值设置较低", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10096": "无法添加安全组规则,因为 remoteSecurityGroupUuids 中存在重复的 UUID: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10095": "无法添加安全组规则,因为规则不能为空或超过最大数量 %d", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10098": "无法添加安全组规则,因为远程安全组UUID冲突", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10022": "无法在正常模式下将NFV实例从[uuid:%s, name:%s]组中分离,请先切换到维护模式。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10097": "无法添加安全组规则,因为安全组[uuid:%s]不存在", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10023": "无法从状态为%s的[uuid:%s,名称:%s]组中分离NFV实例", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10020": "无法将NFV实例附加到组[uuid:%s,名称:%s]。组状态为%s,包含%d个成员。仅允许在以下情况下进行附加:组为空,或组为健康/降级且包含1-2个成员", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10099": "无法添加安全组规则,因为规则优先级必须大于 %d 或等于 %d", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10018": "无效的方向[%s],仅允许%s", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10024": "无效类型[%s],仅允许%s类型", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10019": "无法将NFV实例附加到状态为%s的[group.uuid:%s, group.name:%s]中", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10023": "无效的右侧值[%s],它必须是浮点数或双精度数", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10029": "裸金属服务器[uuid:%s]未停止,无法更改其机箱配置选项", + "ORG_ZSTACK_STORAGE_PRIMARY_10030": "在移除主要存储%s以避免问题后,集群中已没有任何候选的主要存储。请检查集群中主要存储的状态和状态。", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10022": "无效的右值[%s],它必须是大于零且小于一的浮点数或双精度数", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10017": "无法将NFV实例[uuid:%s]附加到组[uuid:%s, name:%s]。该实例已在此组中,并且集群状态为:%s。当实例处于Leader、Follower、Leaving或Joining Candidate状态时,不允许进行附加操作。", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10021": "无效参数 %s,不允许有任何参数", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10018": "无法在正常模式下将NFV实例附加到组[uuid:%s, name:%s]中,请先切换到维护模式。", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10020": "无效的右值[%s],它必须是一个数字(整数、长整数、浮点数、双精度浮点数)", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10015": "syncNfvInstGroup 只允许在维护模式下执行。当前模式: %s。请先将模式更改为维护模式。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10013": "无法在INITIALIZING状态下更改操作模式。请等待组就绪。当前状态:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_10036": "主存储标签分配扩展点[%s]返回零个主存储候选选项", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10022": "当前操作不支持本地裸金属实例", + "ORG_ZSTACK_STORAGE_PRIMARY_10035": "主存储特征分配流[%s]返回零个主存储候选者", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10021": "裸金属实例不允许更改 VM 网络接口", + "ORG_ZSTACK_STORAGE_PRIMARY_10038": "%s 无效。%s 不是有效的 ZStack UUID", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10020": "仅支持 VPC 网络,并在裸金属实例上绑定弹性 IP 地址", + "ORG_ZSTACK_STORAGE_PRIMARY_10037": "主要存储[uuid:%s]未处于连接状态,当前状态为%s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10026": "裸金属2实例[uuid:%s]正在运行但其代理未连接", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10025": "裸金属服务器[uuid:%s]未停止", + "ORG_ZSTACK_STORAGE_PRIMARY_10034": "无法找到具有用户标签[%s]的主存储。该用户标签在实例配置或磁盘配置中指定", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10024": "裸金属服务器实例[uuid:%s]未连接", + "ORG_ZSTACK_STORAGE_PRIMARY_10033": "无法找到主要存储[uuid:%s],该uuid在实例配置或磁盘配置中指定", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10023": "不支持裸金属2实例", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10051": "裸金属2机箱[uuid:%s]不存在", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10050": "不需要设置机箱 Offering UUID,因为实例已经被分配了机箱 Offering", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10021": "无法设置 VM NIC 安全组,因为安全组[uuid:%s]不属于账户[uuid:%s]或管理员", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10020": "无法设置VM网卡安全组,因为存在重复的安全组[uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10023": "无法设置 VM 网卡安全组,因为优先级无效,期望优先级[%d]和优先级[%d]连续", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10022": "无法设置VM网卡安全组,因为优先级无效,优先级期望从1开始,但实际是[%d]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10025": "无法设置VM网卡安全组,因为管理员安全组优先级[%d]必须高于用户", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10027": "无法更改安全组规则状态,因为未找到安全组[uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10026": "无法更改安全组规则状态,因为 ruleUuids 为空", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10029": "无法更改安全组规则状态,因为无需更改安全组规则状态", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10028": "无法更改安全组规则状态,因为未找到安全组规则[uuid:%s]", + "ORG_ZSTACK_ZWATCH_10004": "某些消息已过期。过期的消息不允许被修改。系统将自动清理过期的消息。请稍后操作", + "ORG_ZSTACK_ZWATCH_10003": "无效的操作类型: %s,它只支持写或删除", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10054": "裸金属2机框[UUID:%s]已经分配完毕", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10053": "裸金属2机箱[uuid:%s]未启用", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10052": "裸金属2机箱[uuid:%s]不属于机箱报价[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10059": "请勿同时设置机箱UUID和机箱配置项UUID", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10057": "集群[uuid:%s] 已指定,但其不是启用的裸金属2集群,无法从其创建裸金属2实例", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10056": "zone[uuid:%s] 指定了但尚未启用,无法从其创建裸金属实例", + "ORG_ZSTACK_AI_SERVICE_10001": "未能找到与 modelServiceUuid: %s 和 accountUuid: %s 对应的应用开发服务视图对象", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10040": "第三方 Ceph 不能与其它主存储混用", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10030": "无法更改 VM 网卡安全策略,因为入站策略和出站策略不能同时为空", + "ORG_ZSTACK_ZWATCH_10002": "无效的 zwatch 返回 with 子句: %s, %s", + "ORG_ZSTACK_ZWATCH_10001": "未知参数[%s]在zwatch返回语句中,%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10032": "无法更改 VM 网卡安全策略,因为无效的出站策略[%s]", + "ORG_ZSTACK_AI_SERVICE_10005": "无需测试的任务,请标记失败", + "ORG_ZSTACK_AI_SERVICE_10004": "无法找到服务实例为空,无法提交评估任务,请报告失败", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10031": "无法更改 VM 网卡安全策略,因为无效的入站策略[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10034": "无法更改 VM 网卡的安全策略,因为 VM 网卡[uuid:%s]没有任何安全策略", + "ORG_ZSTACK_AI_SERVICE_10003": "无法找到可用提交评估任务的服务组[uuid: %s],报告失败", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10033": "无法更改 VM 网卡安全策略,因为未找到网卡[uuid:%s]", + "ORG_ZSTACK_AI_SERVICE_10002": "模型服务实例组[uuid: %s]用于测试没有可用的URL", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10036": "无法更新安全组规则优先级,因为安全组[uuid:%s]不存在", + "ORG_ZSTACK_AI_SERVICE_10008": "所有任务未能启动", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10035": "无法更新安全组规则优先级,因为无效类型[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10038": "无法更新安全组规则优先级,因为安全组[uuid:%s]的规则数量不符", + "ORG_ZSTACK_AI_SERVICE_10006": "错误启动评估于 %s,因为 %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10037": "无法更新安全组规则优先级,因为规则为空", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10039": "无法更新安全组规则优先级,因为规则优先级[%d]无效", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10049": "不需要设置机箱 Offering UUID,因为该实例已经被分配了机箱", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10004": "获取主存储[%s]许可证信息失败,因为返回的数据中没有有效的许可证", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10044": "裸金属2网关[uuid:%s]不在集群[uuid:%s]中", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10043": "裸金属2网关[uuid:%s]不存在或未启用或未连接", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10042": "集群[uuid:%s]不是一个启用的baremetal2集群,无法在其中启动实例[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10041": "远程分配实例不支持将预置网卡绑定到bond", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10047": "裸金属2机箱报价[uuid:%s]未启用", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10046": "裸金属2机箱报价[uuid:%s]不存在", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10045": "请指定机箱 UUID 或机箱报价 UUID 以启动裸金属实例[UUID:%s]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10029": "创建快照超时,进度是 %d", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10028": "EBS 主存储现在不支持减少容量", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10073": "[image[uuid:%s] 的格式为:%s,仅可使用%s创建裸金属实例]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10072": "图像[uuid:%s]的mediaType为:%s,仅根磁盘模板可以用于创建baremetal2实例", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10041": "无法更新安全组规则优先级,因为规则[uuid:%s]不在安全组[uuid:%s]中", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10071": "[image[uuid:%s] 不处于就绪状态,无法从中创建裸金属2实例]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10040": "无法更新安全组规则优先级,因为优先级[%d]重复", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10070": "图像[uuid:%s]未启用,无法从中创建裸金属2实例", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10043": "无法更新安全组规则优先级,因为存在重复的规则UUID", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10021": "无效的快照安装路径: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10042": "无法更新安全组规则优先级,因为优先级[%d]不在安全组[uuid:%s]中", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10045": "无法更改安全组规则,因为安全组规则[%s]是默认规则,仅能设置描述和状态", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10044": "无法更改安全组规则,因为安全组规则 UUID[%s] 不存在", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10022": "阿里云EBS主存储[UUID:%s, 名称:%s]无法在附加的集群中找到可用主机以实例化卷", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10047": "无法更改安全组规则,因为安全组 %s 规则数量[%d]超出最大限制[%d]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10025": "无法从镜像:%s 中找到快照,可能该镜像已被删除", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10046": "无法更改安全组规则,因为安全组规则[%s]的优先级不能设置为默认规则优先级[%d]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10024": "不支持", + "ORG_ZSTACK_COMPUTE_CPUPINNING_10002": "无效的 cpuset [%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10049": "无法更改安全组规则,因为无效状态[%s]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10027": "在以下主机上安装 tdc 失败: [%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10048": "无法更改安全组规则,因为%s规则的最大优先级为[%d]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10026": "失败连接以下集群: [%s]", + "ORG_ZSTACK_COMPUTE_CPUPINNING_10000": "无效的CPU绑定引用[%s]。正确的示例是[1,3:3-6,^5]", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10004": "无法为目标主机[uuid:%s]上的虚拟机[uuid:%s]生成vhost用户客户端", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10077": "裸金属2集群[架构:%s]和镜像[架构:%s]不匹配", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10076": "不同启动模式:镜像与机箱/配置之间不一致", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10075": "仅支持具有启动模式 %s 的镜像创建裸金属实例", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10074": "[image[uuid:%s] 不是 baremetal2 镜像,无法从中创建 baremetal2 实例]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10079": "根卷的主要存储[%s]和数据卷的主要存储[%s]不在同一个集群中", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10078": "不是所有磁盘配置项[uuids:%s]都是启用状态,无法从它们创建裸金属2实例", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10050": "无法更改安全组规则,因为无效操作[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10062": "裸金属2机箱报价[uuid:%s]未启用,无法从其创建裸金属2实例", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10061": "裸金属2机箱[uuid:%s]不可用,无法从中创建裸金属2实例", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10060": "裸金属2机箱[UUID:%s]未启用,无法从中创建裸金属2实例", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10051": "无法更改安全组规则,因为无效协议[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10054": "无法更改安全组规则,因为设置了srcIpRange[%s],remoteSecurityGroupUuid[%s]必须为空", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10031": "阿里云 EBS 主存储只支持阿里云 EBS BS 类型,实际获取类型: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10056": "无法更改安全组规则,因为安全组规则[%s]类型为Egress,srcIpRange[%s]无法设置", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10034": "资源[uuid: %s]无法找到", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10055": "无法更改安全组规则,因为安全组规则[%s]类型为入站,目的IP范围[%s]无法设置", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10058": "无法更改安全组规则,因为远程安全组[uuid:%s]未找到", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10057": "无法更改安全组规则,因为设置了dstIpRange[%s],remoteSecurityGroupUuid[%s]必须为空", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10059": "无法更改安全组规则,因为远程安全组[uuid:%s]已被设置,srcIpRange和dstIpRange必须为空", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10066": "图像不能为空,除非机箱处于直接模式", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10065": "裸金属2网关[uuid:%s]与机箱[uuid:%s]不在同一个集群中", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10064": "裸金属2网关[uuid:%s]未连接,无法从其创建裸金属2实例", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10063": "裸金属2网关[uuid:%s]未启用,无法从其创建裸金属2实例", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10069": "机箱磁盘[%s]没有足够的容量容纳镜像[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10068": "图像[uuid:%s]不存在", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10067": "直接模式不支持选择图像", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREBLOCK_10000": "shareblock 说主机 %s 在 %s 离线", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10100": "无法添加安全组规则,因为无效的规则协议[%s],有效协议为 %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10102": "无法添加安全组规则,因为无效的规则 ipVersion[%d],有效的 ipVersions 是 %d/%d", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10101": "无法添加安全组规则,因为无效的操作[%s],有效操作为 %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10104": "无法添加安全组规则,因为允许的CIDR[%s]和目标IP范围[%s]存在冲突", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10103": "无法添加安全组规则,因为源IP范围[%s]不允许设置为出站规则", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10106": "无法添加安全组规则,因为目的IP范围[%s]不允许设置为入站规则", + "ORG_ZSTACK_COMPUTE_HOST_10041": "失败在KVM主机[uuid: %s]上检查网络绑定[%s]的VLAN ID[%s]时,%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10105": "无法添加安全组规则,因为 IP 范围[%s]和 remoteSecurityGroupUuid[%s]存在冲突", + "ORG_ZSTACK_COMPUTE_HOST_10043": "失败在KVM宿主机[uuid: %s]上检查网络接口[%s]的VLAN ID[%s]时:%s", + "ORG_ZSTACK_VPC_10048": "dns 地址 [%s] 已添加到 vpc 路由器 [uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10107": "无法添加安全组规则,因为允许的CIDR[%s]和源IP范围[%s]存在冲突", + "ORG_ZSTACK_VPC_10047": "VPC L3网络必须先绑定一个VPC路由器,才能执行与路由器相关的操作(如启动/停止VM、创建负载均衡等)。", + "ORG_ZSTACK_ALIYUN_CORE_10022": "快照任务状态已完成 %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10109": "无法添加安全组规则,因为协议类型 ALL 或 ICMP 不能设置 dstPortRange[%s]", + "ORG_ZSTACK_ALIYUN_CORE_10023": "不支持混合客户端", + "ORG_ZSTACK_ALIYUN_CORE_10021": "快照任务在 %d 毫秒内无法完成,当前进度是 %d,状态是 %s", + "ORG_ZSTACK_ALIYUN_CORE_10026": "海洋 API 终端点必须不为空", + "ORG_ZSTACK_VPC_10042": "不支持获取服务 %s 在虚拟路由器 %s 的状态", + "ORG_ZSTACK_COMPUTE_HOST_10048": "失败更新绑定IP,因为 %s", + "ORG_ZSTACK_VPC_10041": "无法将分布式路由的状态设置为虚拟路由器 %s", + "ORG_ZSTACK_ALIYUN_CORE_10024": "accessKey 和 keySecret 必须设置", + "ORG_ZSTACK_VPC_10040": "无法获取分布式路由到虚拟路由器 %s 的连接", + "ORG_ZSTACK_COMPUTE_HOST_10044": "失败为网络绑定[%s]在KVM宿主机[uuid: %s]上设置服务类型[%s]时,%s", + "ORG_ZSTACK_VPC_10045": "不支持将服务 %s 的状态更新到虚拟路由器 %s", + "ORG_ZSTACK_COMPUTE_HOST_10047": "失败更新接口IP,因为 %s", + "ORG_ZSTACK_COMPUTE_HOST_10046": "失败为网络接口[%s]在KVM宿主机[uuid: %s]上设置服务类型[%s]时,%s", + "ORG_ZSTACK_VPC_10043": "无法获取分布路由至虚拟路由器 %s 的状态", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10111": "无法添加安全组规则,因为无效的结束端口[%d],结束端口必须大于或等于开始端口[%d]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10110": "无法添加安全组规则,因为协议类型 ALL 或 ICMP 不能设置 startPort 或 endPort", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10113": "无法添加安全组规则,因为协议类型TCP/UDP必须设置dstPortRange", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10112": "无法添加安全组规则,因为目标端口范围[%s]与起始端口[%s]存在冲突", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10115": "无法添加安全组规则,因为规则[%s]与数据库中uuid:%s的规则重复", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10114": "无法添加安全组规则,因为规则[%s]和规则[%s]是重复的", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10117": "无法添加安全组规则,因为安全组 %s 规则已达到最大限制[%d]", + "ORG_ZSTACK_COMPUTE_HOST_10052": "获取主机[uuid:%s]的接口vlanIds失败: %s", + "ORG_ZSTACK_VPC_10039": "无法将 IPv6 地址段添加到三层网络[uuid:%s],因为其与虚拟路由器[vRouter uuid:%s]的 CIDR [%s]重叠", + "ORG_ZSTACK_ALIYUN_IMAGE_10002": "该操作仅支持自定义镜像", + "ORG_ZSTACK_CORE_CONFIG_10002": "无法找到 GlobalConfig[类别: %s, 名称: %s]", + "ORG_ZSTACK_VPC_10038": "无法将 IP 地址范围添加到 L3 网络[uuid:%s],因为其与虚拟路由器 vRouter [uuid:%s] 中的 CIDR [%s] 重叠", + "ORG_ZSTACK_ALIYUN_IMAGE_10003": "只有系统盘可以创建镜像", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10119": "无法添加安全组规则,因为安全组 %s 规则数量[%d]超出最大限制[%d]", + "ORG_ZSTACK_NETWORK_PLUGIN_10001": "释放不必要的arp错误,因为:%s", + "ORG_ZSTACK_VPC_10037": "dns 地址 [%s] 没有添加到 vpc 路由器 [uuid:%s]", + "ORG_ZSTACK_VPC_10036": "dns[%s] 不是IP地址", + "ORG_ZSTACK_CORE_CONFIG_10004": "不允许跳过验证", + "ORG_ZSTACK_NETWORK_PLUGIN_10000": "应用 Gratuitous ARP 错误,因为:%s", + "ORG_ZSTACK_ALIYUN_IMAGE_10001": "指示的镜像 [%s] 正在导入到数据中心 [%s] 中...", + "ORG_ZSTACK_ALIYUN_CORE_10011": "无法输入长度为0的文件作为VM镜像!", + "ORG_ZSTACK_ALIYUN_IMAGE_10006": "仅支持ImageStore备份存储", + "ORG_ZSTACK_ALIYUN_IMAGE_10007": "图像名称不能以 http:// 或 https:// 开头", + "ORG_ZSTACK_ALIYUN_IMAGE_10004": "没有连接到数据中心的OSS桶:%s", + "ORG_ZSTACK_ALIYUN_IMAGE_10005": "无法删除ecs系统镜像远程", + "ORG_ZSTACK_VPC_10031": "L2网络[uuid: %s] of L3网络[uuid: %s] 未绑定至集群[uuid: %s]", + "ORG_ZSTACK_VPC_10030": "没有与L3网络[uuid:%s]关联的IP地址范围", + "ORG_ZSTACK_ALIYUN_CORE_10016": "不是一个有效的消息!", + "ORG_ZSTACK_ALIYUN_CORE_10013": "权限拒绝:%s", + "ORG_ZSTACK_VPC_10035": "l3网络 [uuid:%s] 必须首先绑定,因为该l3网络上有vip地址", + "ORG_ZSTACK_COMPUTE_HOST_10055": "集群[uuids:%s, 虚拟化类型:%s]不存在!", + "ORG_ZSTACK_VPC_10034": "指定在消息中的静态IP[%s]与L3网络[uuid:%s]的网关IP[%s]不相等", + "ORG_ZSTACK_ALIYUN_CORE_10017": "%s 失败, 错误代码: %s, 错误信息: %s", + "ORG_ZSTACK_COMPUTE_HOST_10058": "主机[uuid:%s]无法找到", + "ORG_ZSTACK_VPC_10033": "三层网络[uuid:%s]的网关[ip:%s]已被占用", + "ORG_ZSTACK_ALIYUN_CORE_10018": "设备在 %d 毫秒内未准备好", + "ORG_ZSTACK_VPC_10032": "公网[uuid: %s] VIP[uuid: %s, ip: %s] 与三层网络[l3network uuid: %s] 不在同VPC VR[uuid: %s] 中", + "ORG_ZSTACK_COMPUTE_HOST_10019": "只支持在 vm 状态为[%s]时执行实时快照,但 vm 当前处于[%s]状态", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10120": "无法添加安全组规则,因为优先级[%d]必须连续,入站规则的最大优先级为[%d]", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10000": "获取主存储[%s]的许可证信息失败,因为没有可用的MonIP", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10001": "获取主存储[%s]的许可信息失败,因为没有返回数据", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10122": "失败将安全组规则应用到当前VM[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10002": "获取主存储[%s]的许可证信息失败,因为过期时间为空", + "ORG_ZSTACK_ALIYUN_IMAGE_10008": "未找到镜像Uuid: %s 的备份存储", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10121": "无法添加安全组规则,因为优先级[%d]必须连续,出站规则的最大优先级为[%d]", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10003": "解析主存储[%s]许可证信息中的日期格式[%s]失败", + "ORG_ZSTACK_ALIYUN_IMAGE_10009": "超出为 imageUuid: %s 所分配的备份存储空间,请手动指定", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10124": "网络服务[type:%s]在l3Network[uuid:%s]上未启用", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10123": "Failed to apply security group rules to some VMs", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10125": "失败修改规则[uuid:%s]的优先级,因为它未被找到", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10128": "网络服务[type:%s]在nic[uuid:%s]的l3Network[uuid:%s]中未启用", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10127": "vm nic[uuid:%s] 已经被附加到安全组[uuid:%s]", + "ORG_ZSTACK_ALIYUN_IMAGE_10011": "图像 [%s] �现未启用", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10129": "安全组[uuid:%s]不属于账户[uuid:%s]或管理员", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10004": "虚拟ID[uuid:%s]不在组织[uuid:%s]中", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10005": "组织[uuid:%s]已经有一个管理员", + "ORG_ZSTACK_ALIYUN_CORE_10001": "添加端点到SDK失败,原因:%s", + "ORG_ZSTACK_ALIYUN_CORE_10005": "accessKey 和 keySecret 必须设置!", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10003": "虚拟ID[uuid:%s]不存在", + "ORG_ZSTACK_COMPUTE_HOST_10028": "nic[%s] 已删除", + "ORG_ZSTACK_COMPUTE_HOST_10023": "操作错误,因为 %s", + "ORG_ZSTACK_ALIYUN_CORE_10009": "无法从消息中找到密钥/凭证", + "ORG_ZSTACK_ALIYUN_IMAGE_10010": "有效的平台:[%s] 用于阿里云镜像导入,有效值为:[%s]", + "ORG_ZSTACK_ALIYUN_CORE_10006": "区域ID必须设置!", + "ORG_ZSTACK_COMPUTE_HOST_10038": "删除虚拟机文件失败: %s", + "ORG_ZSTACK_COMPUTE_HOST_10037": "设置虚拟机配置文件失败: %s", + "ORG_ZSTACK_COMPUTE_HOST_10039": "应用内存气球失败: %s", + "ORG_ZSTACK_COMPUTE_HOST_10036": "设置 VM 主机名失败: %s", + "ORG_ZSTACK_COMPUTE_HOST_10035": "同步虚拟机端口配置失败: %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10009": "无效标签,\u0027op\u0027 字段为空或不是正则表达式和等于中的另一种情况。%s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10008": "无效标签,\u0027key\u0027字段不能为null。%s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10007": "the ValueCondition 字符串[%s]需要将\u0027value\u0027设为键", + "ORG_ZSTACK_ZWATCH_DATATYPE_10006": "标签字符串[%s]不包含有效的运算符", + "ORG_ZSTACK_COMPUTE_VM_10319": "VmInstanceDestroyVmExtensionPoint[%s] 拒绝销毁 vm[uuid:%s] 因为 %s", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10006": "卷的类型 [%s] 无效。", + "ORG_ZSTACK_COMPUTE_VM_10318": "VmInstanceRebootExtensionPoint[%s] 拒绝重启 vm[uuid:%s],因为 %s", + "ORG_ZSTACK_COMPUTE_VM_10317": "VmInstanceStartNewCreatedVmExtensionPoint[%s] 拒绝创建 vm[uuid:%s] 因为 %s", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10004": "失败在ceph ps[uuid:%s]中获取卷%s的快照ID。", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10002": "失败于检查卷 %s 在 ceph ps[uuid:%s] 中的安装路径。", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10001": "无法从ps:%s中找到指定的池[PoolName:%s]", + "ORG_ZSTACK_VPC_10006": "VIP[uuid:%s] 未找到", + "ORG_ZSTACK_VPC_10005": "因为虚拟机 [uuid:%s] 的镜像类型不是 %s,所以无法绑定 IPv6 公网 IP", + "ORG_ZSTACK_VPC_10003": "无法通过 SSH 连接到 VPC 路由器[%s],SSH 端口似乎未打开", + "ORG_ZSTACK_VPC_10009": "VmNic[uuid:%s] 未找到", + "ORG_ZSTACK_VPC_10008": "EIP[uuid:%s] 未找到", + "ORG_ZSTACK_COMPUTE_VM_10316": "无法找到虚拟机的宿主机,请先启动虚拟机[%s],然后挂载磁盘", + "ORG_ZSTACK_COMPUTE_HOST_10005": "在主机[uuid:%s]上设置同步时钟任务失败", + "ORG_ZSTACK_ZWATCH_DATATYPE_10001": "无效表达式: %s, 未找到函数", + "ORG_ZSTACK_COMPUTE_HOST_10004": "主机[uuid:%s, 名称:%s]处于状态[%s], 无法执行所需操作", + "ORG_ZSTACK_COMPUTE_VM_10315": "网关错误,预期:%s,实际获得:%s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10000": "无效函数: %s, %s", + "ORG_ZSTACK_COMPUTE_VM_10314": "ipv6 前缀长度错误,预期:%s,实际:%s", + "ORG_ZSTACK_COMPUTE_VM_10313": "IPv6 前缀长度必须设置", + "ORG_ZSTACK_VPC_10002": "三层网络[l3:uuid:%s]的网关[ip:%s]在vpc vr[uuid:%s]中已被占用", + "ORG_ZSTACK_COMPUTE_VM_10311": "网掩码错误,期望:%s,实际:%s", + "ORG_ZSTACK_COMPUTE_HOST_10000": "同步 GPU 信息失败: %s", + "ORG_ZSTACK_VPC_10001": "在 L3 网络[uuid:%s] 中不存在 IP 地址范围", + "ORG_ZSTACK_COMPUTE_VM_10310": "子网掩码必须设置", + "ORG_ZSTACK_VPC_10000": "无法从VPC VR[uuid:%s]Detach网卡", + "ORG_ZSTACK_COMPUTE_HOST_10009": "分配 PCI 设备失败[uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10051": "无效的 URI,正确的示例是 ceph://$POOLNAME/$VOLUMEUUID 或 volume://$VOLUMEUUID", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10050": "Ceph ps[uuid\u003d%s] 根池名称未找到", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10052": "删除卷链错误,继续删除", + "ORG_ZSTACK_COMPUTE_VM_10320": "VmInstanceStartExtensionPoint[%s] 拒绝启动 vm[uuid:%s],因为 %s", + "ORG_ZSTACK_COMPUTE_HOST_10013": "网络接口[name:%s]主机[uuid:%s]未找到", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10008": "加密 %s[id:%s] 错误: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_SMP_10000": "共享挂载点主存储[uuid:%s, 名称:%s]无法在附加的集群中找到任何可用主机", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10005": "不支持的操作对于EncryptColumnIntegrityFactory", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10002": "%s[%s] 完整性校验错误,因为: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10000": "%s[%s] 加密错误,因为:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10017": "无法找到任何连接的主机来执行此操作,似乎与共享挂载点存储[uuid:%s]关联的所有KVM主机均已断开连接。", + "ORG_ZSTACK_VPC_10027": "无法将L3网络附加到VPC路由器[UUID:%s],因为其状态不是运行中或已停止", + "ORG_ZSTACK_VPC_10025": "VPC网络[uuid:%s]已绑定至VPC路由器[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10013": "URL包含无效文件夹[/dev 或 /proc 或 /sys]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10042": "获取根卷[%s]的rbd图像观察者失败,%s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10041": "ceph 存储池冲突,由磁盘配置指定的 ceph 存储池为 %s,而创建参数中指定的 ceph 存储池为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10010": "卷[uuid:%s]存在引用卷[%s],在合并它们及其后代之前无法更改卷类型", + "ORG_ZSTACK_VPC_10029": "无法将L3网络附加到VPC路由器[UUID:%s],因为其状态和对端状态均未运行或停止", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10044": "无法找到 Ceph 主存储池[poolName\u003d%s]", + "ORG_ZSTACK_VPC_10020": "L3网络[uuid:%s]无法从VPC交换机[uuid:%s]解绑,因为关联的服务仍使用了VIP[%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10043": "根卷[%s]已被使用(ceph rbd镜像[%s]已有监视者),为了防止脑裂分,启动VM被禁止。", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10046": "无法为 primaryStorage[%s]分配池,用途:%s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10045": "ceph主存储池[poolName\u003d%s]可用的虚拟容量不足以满足大小%s", + "ORG_ZSTACK_VPC_10024": "只有VPC L3网络可以绑定到VPC虚拟路由器", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10047": "无法更新 Ceph 主存储 MON[uuid:%s] 的状态,因为它已被删除。此错误可以忽略。", + "ORG_ZSTACK_VPC_10023": "虚拟路由器报价[uuid: %s]的镜像不存在", + "ORG_ZSTACK_VPC_10022": "虚拟路由器报价[uuid: %s]未启用", + "ORG_ZSTACK_VPC_10021": "VPC L3网络[UUID:%s]无法从VPC路由器[UUID:%s]解绑,因为仍有VM网卡[%s]在使用中", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10006": "不支持的操作", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10005": "缺少参数,vmInstanceUuid: %s 被请求", + "ORG_ZSTACK_VPC_10017": "公共网络无法解绑", + "ORG_ZSTACK_VPC_10016": "默认路由网络无法脱离", + "ORG_ZSTACK_VPC_10015": "管理网络无法解绑", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10003": "无法找到具有连接主机-SMP连接以执行命令的存储[uuid:%s]主存储的宿主机", + "ORG_ZSTACK_VPC_10014": "虚拟路由器 [uuid:%s] 不处于状态 [%s] 或状态 [%s] 中", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10002": "无法找到连接的主机来执行命令 for smp 主机存储[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10001": "SMP 主存储[uuid:%s]未连接到任何计算集群,并且无法清除虚拟机[uuid:%s]的根卷[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10007": "无法找到具有 UUID:%s 的 VM", + "ORG_ZSTACK_VPC_10019": "无法将三层网络从uuid:%s的VPC路由器解绑,因为主从状态不一致", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10008": "无法找到具有 UUID:%s 的虚拟机设备", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10030": "无法找到备份存储以将图像 [%s] 下载到主存储 [%s],原因是没有可用的 Ready 和可访问的图像", + "ORG_ZSTACK_VPC_10018": "无法将三层网络从VPC路由器[uuid:%s]解绑,因为其状态不是运行中或已停止", + "ORG_ZSTACK_ALIYUN_CORE_10037": "镜像已在远程存在,请先使用同步。", + "ORG_ZSTACK_ALIYUN_CORE_10035": "入口在 %s 毫秒后仍然存在", + "ORG_ZSTACK_ALIYUN_CORE_10036": "无法找到EcsInstance[%s],请检查阿里云控制台以确认其是否存在", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10037": "无法找到任何与主存储[uuid:%s]连接的ceph监视器节点", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10001": "缺少参数,resourceUuid: %s, vmInstanceUuid: %s 被请求", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10002": "缺少参数,resourceUuid 是必需的", + "ORG_ZSTACK_VPC_10012": "虚拟路由器 [uuid:%s] 不是VPC路由器", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10039": "ceph 命名空间冲突,由实例配置指定的 ceph 命名空间是 %s,而创建参数中指定的是 %s", + "ORG_ZSTACK_VPC_10011": "无法更新网卡[uuid: %s]状态,由于管理网卡不支持", + "ORG_ZSTACK_ALIYUN_CORE_10039": "区域 ID[%s]不符合阿里云的要求!", + "ORG_ZSTACK_VPC_10010": "无法删除虚拟机网卡 [uuid:%s],因为该虚拟机 [uuid:%s] 的类型是设备虚拟机,请使用 API APIDetachL3NetworkFromVm", + "ORG_ZSTACK_SNMP_AGENT_10006": "失败于关闭SNMP代理会话[%s](端口%s),原因:%s", + "ORG_ZSTACK_SNMP_AGENT_10005": "失败将SNMP代理端口从%s更改到%s,原因是%s", + "ORG_ZSTACK_SNMP_AGENT_10004": "snmp[uuid:%s] 尚未创建", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10009": "ecs 实例 [%s] 的状态必须为运行中或已停止", + "ORG_ZSTACK_STORAGE_ZBS_10003": "无效的 mdsUrl[%s]。SSH用户名和密码必须用\u0027:\u0027分隔且不能为空。有效的 monUrl格式为 %s", + "ORG_ZSTACK_STORAGE_ZBS_10004": "无效的 mdsUrl[%s],主机名不能为 null。有效的 mdsUrl 格式为 %s", + "ORG_ZSTACK_STORAGE_ZBS_10002": "无效的 mdsUrl[%s],sshUsername:sshPassword 部分无效。有效的 mdsUrl 格式为 %s", + "ORG_ZSTACK_APPCENTER_10006": "%s 需要 String 类型的值,但得到错误类型", + "ORG_ZSTACK_APPCENTER_10005": "%s 需要布尔值,但得到错误类型", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10004": "磁盘 [%s] 没有挂载在任何实例上", + "ORG_ZSTACK_APPCENTER_10004": "%s 需要数值类型值,但得到错误类型", + "ORG_ZSTACK_STORAGE_ZBS_10005": "无效的 mdsUrl[%s],SSH端口大于65535或小于1。有效的 mdsUrl 格式为 %s", + "ORG_ZSTACK_APPCENTER_10003": "%s 在预参数中,但未被设置", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10006": "只有数据盘可以挂载在ECS上", + "ORG_ZSTACK_APPCENTER_10002": "filterName 必须为 appcenter:true 或 appcenter:false", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10007": "磁盘不能附加到任何ECS实例上", + "ORG_ZSTACK_SNMP_AGENT_10003": "无法在端口 %s 启动 snmp 代理[%s],原因:%s", + "ORG_ZSTACK_APPCENTER_10001": "PublishAppVO[uuid: %s] 不存在", + "ORG_ZSTACK_SNMP_AGENT_10002": "失败启动SNMP代理[%s], %s", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10001": "根磁盘无法被删除", + "ORG_ZSTACK_SNMP_AGENT_10001": "存在多个 SnmpAgentVO 实体。", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10002": "无法将磁盘的 deleteWithInstance 属性设置为 false,当磁盘的 category 属性为临时类型时", + "ORG_ZSTACK_SNMP_AGENT_10000": "无法获取 SnmpAgentImpl 实例,因为不存在 SnmpAgentVO。", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10003": "无法将磁盘的 deleteWithInstance 属性设置为 false,当磁盘的 category 属性为云且 portable 属性为 false 时", + "ORG_ZSTACK_CORE_WEBHOOK_10000": "无效的 URL[%s]", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10010": "磁盘和ecs实例必须位于同一可用区", + "ORG_ZSTACK_TEST_AOP_10001": "单元测试要求其失败", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10015": "请求参数中的大小和快照ID必须选择其中一个项以指定磁盘的大小或使用快照创建磁盘。", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10016": "不允许在根卷快照上创建磁盘", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10017": "磁盘名称或描述不能以 \u0027http://\u0027 或 \u0027https://\u0027 开头", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10011": "磁盘 [%s] 已经挂载在实例 [%s] 上", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10012": "只有数据盘可以挂载到ECS实例上", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10013": "无法在使用中挂接磁盘", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10014": "非独立磁盘只能与实例一同销毁", + "ORG_ZSTACK_STORAGE_ZBS_10021": "无效的逻辑存储池名称[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10022": "无效的资源池名称[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10020": "无效的 URI 格式: %s", + "ORG_ZSTACK_STORAGE_ZBS_10025": "不允许添加重复的 MDS[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10026": "无法找到逻辑池[%s]对应的物理池", + "ORG_ZSTACK_STORAGE_ZBS_10023": "确保至少配置一个资源池", + "ORG_ZSTACK_STORAGE_ZBS_10024": "确保至少配置一个MDS", + "ORG_ZSTACK_STORAGE_ZBS_10027": "未找到 zbs 主存储[uuid:%s]节点的 MDS[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10028": "所有 ZBS 主存储[uuid:%s] 的 MDS 都不在连接状态", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10001": "无法删除预定义预制配置模板", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10002": "无法更改预定义预配置模板的状态", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10000": "无法更新预定义预制配置模板", + "ORG_ZSTACK_MTTYDEVICE_10001": "从 mtty 设备[uuid:%s]生成的 mdev 设备仍然附加在 VM 上", + "ORG_ZSTACK_MTTYDEVICE_10000": "mtty 设备[uuid:%s]未被虚拟化为mdevs", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10004": "无法找到预配置模板VO[uuid:%s],它可能已被删除", + "ORG_ZSTACK_MTTYDEVICE_10004": "主机[uuid:%s]中包含的mtty设备[uuid:%s]未连接", + "ORG_ZSTACK_MTTYDEVICE_10003": "mtty 设备[uuid:%s]无法虚拟化为mdevs", + "ORG_ZSTACK_HYGON_KVM_10004": "从主机[uuid:%s]获取海光CCP设备信息失败:%s", + "ORG_ZSTACK_STORAGE_ZBS_10014": "ZBS 主存储[uuid:%s]可能已被删除", + "ORG_ZSTACK_STORAGE_ZBS_10015": "无法找到 KVM 主机[uuid:%s],无法部署客户端", + "ORG_ZSTACK_STORAGE_ZBS_10012": "无法连接到ZBS主存储[uuid:%s],未能连接所有MDS", + "ORG_ZSTACK_STORAGE_ZBS_10016": "附加信息为空,主要存储[uuid:%s]未就绪,跳过ping任务", + "ORG_ZSTACK_ZWATCH_DATATYPE_10010": "无效标签,\u0027value\u0027字段不能为null。%s", + "ORG_ZSTACK_STORAGE_ZBS_10017": "没有可用的足够空间的逻辑池和所需的 URL: %s", + "ORG_ZSTACK_HYGON_KVM_10003": "失败了生成海光 IPI 设备,因为:%s", + "ORG_ZSTACK_HYGON_KVM_10002": "无法反生成 mdev 设备,主机[uuid:%s]上有 %d 个 mdev 设备被 VM 使用。请先停止或迁移使用这些设备的所有 VM。", + "ORG_ZSTACK_HYGON_KVM_10001": "无法在主机[uuid:%s]上找到ccp设备(s)对应于pciBdf %s,请先同步hygon设备", + "ORG_ZSTACK_HYGON_KVM_10000": "生成海光 mdev 设备失败,因为:%s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10021": "无法查询 InfluxDB,%s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10023": "失败修改 influxdb 保留策略 \u0027%s\u0027, %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10000": "vm[uuid: %s]的存储迁移缺少足够的容量,所需容量(包括镜像缓存):%s,当前可用物理容量:%s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10024": "失败创建 influxdb 保留策略 \u0027%s\u0027, %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10001": "不支持虚拟机状态[%s]进行存储迁移", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10025": "无效的 InfluxDB 响应:%s, 列中未找到名称", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10026": "创建 InfluxDB 默认用户 \u0027%s\u0027 失败,%s", + "ORG_ZSTACK_STORAGE_MIGRATION_10004": "不支持取消 %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10005": "VM[uuid: %s] 未找到", + "ORG_ZSTACK_STORAGE_MIGRATION_10003": "不支持的存储迁移类型:从 %s 到 %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10008": "vm 块迁移失败: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10009": "目标主存储不支持当前主机的迁移操作", + "ORG_ZSTACK_STORAGE_MIGRATION_10006": "不支持虚拟机状态[%s]取消存储迁移", + "ORG_ZSTACK_STORAGE_MIGRATION_10007": "失败获取主机候选项以进行VM迁移", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10005": "无效的virtio驱动设备格式: %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10004": "从虚机[uuid:%s]detach virt-io ISO失败:不支持", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10003": "失败从虚拟机[uuid:%s]detach virtio %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10002": "失败在 mn[uuid:%s] 挂载 virtio 驱动因为读取文件[%s]的 md5 失败: %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10001": "失败在 mn[uuid:%s] 中附加 virtio 驱动,因为文件[%s]的 MD5 校验和无效", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10000": "失败在 mn[uuid:%s] 挂载 virtio 驱动因为读取文件[%s]的 md5 失败:类路径上未找到文件", + "ORG_ZSTACK_DIRECTORY_10010": "目录 %s 的类型不被支持,支持的目录类型为 %s", + "ORG_ZSTACK_SCHEDULER_VM_10001": "vm[uuid:%s] 已销毁,状态变更不允许", + "ORG_ZSTACK_STORAGE_ZBS_10040": "获取 MDS[%s] 元数据失败,您需要检查 ZBS 配置", + "ORG_ZSTACK_STORAGE_ZBS_10032": "所有元数据服务节点无法执行HTTP调用[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10036": "ZBS 主存储 MDS[%s] 版本[%s] 与管理节点[%s] 不一致,请重新连接 MDS 并检查 SSH 连接", + "ORG_ZSTACK_STORAGE_ZBS_10037": "mdsUrls 不能为 null 或空", + "ORG_ZSTACK_STORAGE_ZBS_10034": "无法从ZBS主存储MDS[%s]同步元数据,因为%s", + "ORG_ZSTACK_STORAGE_ZBS_10038": "无法从所有MDS发现逻辑池,详情:%s", + "ORG_ZSTACK_STORAGE_ZBS_10039": "无法通过SSH连接或MDS[%s]未安装zbs-tools,您需要检查SSH配置和依赖项", + "ORG_ZSTACK_DIRECTORY_10006": "检测到循环依赖,目录 %s 和目录 %s 将导致循环依赖", + "ORG_ZSTACK_DIRECTORY_10003": "名称包含不支持的字符,名称只能包含中文、英文字母、数字、空格以及以下字符:()[]@._-+", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10000": "无法找到 EventFamily[name:%s]", + "ORG_ZSTACK_DIRECTORY_10004": "所有资源区域ID必须与目录区域ID[%s]一致", + "ORG_ZSTACK_DIRECTORY_10001": "资源类型 %s 不被目录支持,允许的类型是 %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10002": "无法找到 EventFamily[name:%s, namespace:%s]", + "ORG_ZSTACK_DIRECTORY_10000": "资源 %s 已经绑定到目录 UUID[%s] ,不支持多个路径", + "ORG_ZSTACK_NAS_10002": "重复的 NasFileSystemFactory[%s, %s] 类型为[%s]", + "ORG_ZSTACK_NAS_10000": "NAS文件系统 [%s] 尚未存在", + "ORG_ZSTACK_NAS_10001": "无法找到类型为: %s 的NAS工厂", + "ORG_ZSTACK_DIRECTORY_10009": "失败创建目录,目录层级最多四层", + "ORG_ZSTACK_DIRECTORY_10008": "重复目录名称,目录[uuid: %s]与名称为%s的目录已存在", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10011": "无效查询标签[%s]。允许的标签名称为 %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10012": "存在多个名为[%s]的EventFamily,您必须指定标签[%s]", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10006": "位于的数据卷[%s]所在的虚拟机有内存快照,无法分离", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10005": "无法将磁盘卷 %s 挂载到 vmInstance %s 与内存快照组", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10004": "位于的数据卷 [%s] 所在的虚拟机有内存快照,无法删除", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10003": "该卷 %s 不存在", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10001": "具有 L3 网络[uuid: %s]的 nic 被 VolumeSnapshotGroup[uuid: %s]引用,在删除该 L3 网络之前,请先删除这个 VolumeSnapshotGroup。", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10000": "defaultL3网络Uuid不存在", + "ORG_ZSTACK_AI_10086": "ModelServiceGroup 仍被 %s 引用,无法删除", + "ORG_ZSTACK_AI_10087": "taskUuid 不能为空", + "ORG_ZSTACK_AI_10084": "系统模型[uuid: %s]无法被删除", + "ORG_ZSTACK_AI_10082": "删除模型失败,模型[uuid: %s]仍然被%s使用", + "ORG_ZSTACK_AI_10083": "模型[uuid: %s]未找到", + "ORG_ZSTACK_AI_10080": "自定义URL在部署ModelEval服务类型时需要模型字段", + "ORG_ZSTACK_AI_10081": "L3NetworkUuids %s 没有DHCP服务,必须添加静态IP系统标签以分配静态IP地址", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10007": "不支持在包含存储快照时对多个计算节点上的卷进行快照操作", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10008": "无法找到安装地址[%s]的存储空间", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10005": "未注册与身份:%s 相关的主存储插件", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10006": "不支持在类型[%s]主要存储上使用协议[%s]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10009": "无法找到块卷,仅限访问块卷路径", + "ORG_ZSTACK_CONFIGURATION_10009": "预留内存大小[%s 字节]大于内存大小[%s 字节]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10010": "未指定备份存储类型,支持主存储[uuid:%s]", + "ORG_ZSTACK_CONFIGURATION_10008": "内存大小[%s 字节]小于16MB,如此小的内存大小很可能无法启动任何现代操作系统", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10011": "无法重新初始化根卷 [%s],因为镜像 [%s] 已被删除,并且无法找到图像缓存", + "ORG_ZSTACK_MULTICAST_ROUTER_10005": "多播路由器 [uuid:%s] 没有附加到VPC路由器", + "ORG_ZSTACK_CONFIGURATION_10007": "cpu 数[%s] 小于 1", + "ORG_ZSTACK_MULTICAST_ROUTER_10006": "会合点 [%s] 不是单播地址", + "ORG_ZSTACK_CONFIGURATION_10006": "不支持的实例配置类型[%s]", + "ORG_ZSTACK_MULTICAST_ROUTER_10007": "组地址 [%s] 不是多播地址", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014": "存储不健康:%s", + "ORG_ZSTACK_MULTICAST_ROUTER_10000": "多播路由器[uuid:%s]尚未绑定到VPC路由器", + "ORG_ZSTACK_MULTICAST_ROUTER_10001": "多播已在VPC路由器uuid[:%s]上启用", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012": "无法从内部快照路径[%s]找到所属卷路径,因为正则表达式[%s]与快照路径不匹配", + "ORG_ZSTACK_MULTICAST_ROUTER_10002": "多播路由器 [uuid:%s] 的 VPC 路由已删除", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10013": "ping 外部主存储[%s]失败, %s", + "ORG_ZSTACK_CONFIGURATION_10001": "已经为实例 Offering [uuid: %s] 有一个用户数据系统标签。", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10004": "发生错误,原因: 认证响应为空", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10003": "无法找到类型(%s)的OAuth2Login", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10005": "发生错误,原因: %s 为空", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10000": "重复的 OAuth2 登录[%s, %s] 用于类型[%s]", + "ORG_ZSTACK_CONFIGURATION_10004": "不应该有一个实例 Offering 拥有超过一个系统 标签。", + "ORG_ZSTACK_CONFIGURATION_10003": "已经为磁盘 Offering [uuid: %s] 设置了一个用户数据系统标签。", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10002": "无法找到类型(%s)的OAuth2Provider", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10001": "重复的 OAuth2Provider[%s, %s] 为 name[%s]", + "ORG_ZSTACK_AI_10075": "dockerImage 对 Container 模型服务是必需的", + "ORG_ZSTACK_AI_10076": "模型中心[uuid:%s]未找到对应于模型服务[uuid:%s]的记录", + "ORG_ZSTACK_AI_10071": "vmImageUuid 是 VirtualMachine 模型服务所需的参数", + "ORG_ZSTACK_AI_10072": "vmImageUuid 不合法", + "ORG_ZSTACK_AI_10070": "模型服务类型[%s]不应该有依赖的模型服务组UUID", + "ORG_ZSTACK_MULTICAST_ROUTER_10008": "RP 地址对 [%s: %s] 已经存在于多播路由器 [uuid:%s] 中", + "ORG_ZSTACK_MULTICAST_ROUTER_10009": "RP 地址元组 [%s : %s] 不存在于多播路由器 [uuid:%s] 中", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10015": "上传用户[%s]失败:用户已存在", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10017": "获取代码响应有错误 : %s", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10016": "上传用户[%s]失败: %s", + "ORG_ZSTACK_AI_10079": "ModelEval 服务类型需要在 modelServiceGroupUuids 或 url 中指定一个现有的模型服务用于使用", + "ORG_ZSTACK_AI_10077": "在部署消息中未提供 L3 网络 UUID,且模型中心[uuid:%s] 未配置 serviceNetworkUuid 或 storageNetworkUuid", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10012": "iam2 中存在同名的用户[%s]", + "ORG_ZSTACK_AI_10078": "环境变量值不应为 null", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_SUPPLIER_EMAY_10000": "无效参数,供应商[%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10026": "获取用户名为空", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10025": "失败获取参数[%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10028": "插件 [uuid:%s] 被 oauth2 客户端 [uuids:%s] 用于第三方登录。", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10027": "本地用户已有同名用户[%s]", + "ORG_ZSTACK_AI_10097": "模型服务在组[uuid: %s]中类型不一致,预期为:%s,但发现为:%s", + "ORG_ZSTACK_AI_10098": "模型服务后端[type: %s]未找到", + "ORG_ZSTACK_AI_10095": "所有模型服务在组[uuid: %s]中必须设置服务启动运行时间", + "ORG_ZSTACK_AI_10096": "在组[uuid: %s]中未找到节点秩为0的模型服务", + "ORG_ZSTACK_AI_10093": "模型服务实例[uuid: %s]未运行且未就绪,但未找到错误代码", + "ORG_ZSTACK_AI_10094": "意外内容: %s 服务的 yaml 解析为 null", + "ORG_ZSTACK_AI_10091": "失败获取就绪状态,因为 %s", + "ORG_ZSTACK_AI_10092": "模型服务实例[uuid: %s]未运行且未就绪,因为%s", + "ORG_ZSTACK_AI_10090": "失败重载 Nginx 配置:%s", + "ORG_ZSTACK_VROUTERROUTE_10010": "目标[%s]不能同时存在黑洞路由和静态路由", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10000": "无法找到外部主存储[uuid:%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10031": "失败将 %s 到 %s,状态码:%s,响应体:%s", + "ORG_ZSTACK_VROUTERROUTE_10012": "无法为目的地:%s 添加重复的 BlackHole 路由条目", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10030": "HTTP 错误,状态码: %s,正文: %s", + "ORG_ZSTACK_VROUTERROUTE_10011": "不能输入重复的静态路由条目,目的地:%s,目标:%s,类型:%s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10003": "必需的空间[locationUrl:%s]无法满足条件[可用大小 \u003e %s 字节], 当前可用大小 %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10004": "无法找到卷[uuid:%s]安装路径", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10001": "无法连接任何外部存储", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10032": "失败将 %s 转换为 %s,IO 错误: %s", + "ORG_ZSTACK_AI_10099": "模型服务实例组[uuid: %s]未找到", + "ORG_ZSTACK_VROUTERROUTE_10001": "无法找到虚拟路由器类型[%s]的服务工厂", + "ORG_ZSTACK_VROUTERROUTE_10000": "虚拟路由器[uuid:%s]未找到", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10015": "Ceph bs[uuid\u003d%s] 池名称未找到", + "ORG_ZSTACK_VROUTERROUTE_10003": "无法找到路由表 [uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10012": "无法更新 Ceph 备份存储 mon[uuid:%s] 的状态,因为它已被删除。此错误可以忽略。", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10000": "无法找到主机调度组[uuid:%s],它可能已被删除", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10003": "主机[uuid:%s]已附属于宿主调度组[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10004": "主机集群Uuid为空", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10001": "无法找到虚拟机调度规则[uuid:%s],它可能已被删除", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10002": "无法找到虚拟机调度组[uuid:%s],它可能已被删除", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10011": "Ceph 备份存储不支持计算镜像哈希", + "ORG_ZSTACK_SNS_PLATFORM_HTTP_10000": "HTTP POST请求失败。状态:%s,响应体:%s", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10007": "图像[uuid: %s]不在备份存储[uuid:%s, 名称:%s]中", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10005": "另一个CEPH备份存储[name:%s, uuid:%s]具有相同的FSID[%s],您不能添加相同的CEPH配置作为两个不同的备份存储", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10003": "无法连接到 CEPH 备份存储[UUID:%s],未能连接所有 CEPH 监控器。", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10002": "CephMon[主机名:%s]在备份存储[唯一标识:%s]中未找到", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10009": "无法将监控器添加到ceph备份存储", + "ORG_ZSTACK_MULTICAST_ROUTER_BACKEND_10000": "多播路由器 [uuid:%s] 在启用后端多播时已被删除", + "ORG_ZSTACK_LDAP_10016": "查询 LDAP 条目失败, %s", + "ORG_ZSTACK_LDAP_10017": "查询ldap条目[过滤器: %s]失败,因为%s", + "ORG_ZSTACK_LDAP_10012": "无法连接到LDAP/AD服务器,凭证无效,请检查用户DN和密码", + "ORG_ZSTACK_LDAP_10013": "无法连接到LDAP/AD服务器,通信失败,请检查IP、端口和Base DN", + "ORG_ZSTACK_LDAP_10014": "无法连接到LDAP/AD服务器,%s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10005": "当前许可证[%s]无效,从imagestore备份存储下载时", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10004": "Ceph主存储[%s]不存在!", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10001": "图像 [uuid:%s] 已被删除", + "ORG_ZSTACK_LDAP_10010": "错误的LdapServerType[%s], 有效值:[%,%s]", + "ORG_ZSTACK_LDAP_10007": "账号[uuid:%s]未找到!!!", + "ORG_ZSTACK_LDAP_10008": "不受支持的 LDAP/AD 服务器范围", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10000": "failed to create eip[uuid:%s, name:%s, ip:%s] for vm nic[uuid:%s] on virtual router[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10001": "发现了一个虚拟路由器报价[uuid:%s]用于L3网络[uuid:%s]在区域[uuid:%s];然而,该网络的公网[uuid:%s]与EIP[uuid:%s]的不同;您可能需要使用系统标签guestL3Network::l3NetworkUuid来指定特定的虚拟路由器报价用于L3网络", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10002": "失败移除弹性公网IP[UUID:%s, 名称:%s, IP:%s] 用于虚拟机网卡[UUID:%s] 在虚拟路由器[UUID:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10004": "失败在虚拟路由器[uuid:%s]上同步弹性公网IP,%s", + "ORG_ZSTACK_AI_10004": "随机Uuid不匹配", + "ORG_ZSTACK_AI_10005": "模型中心未找到", + "ORG_ZSTACK_AI_10003": "randomUuid为空", + "ORG_ZSTACK_AI_10001": "模型中心管理IP无效", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10027": "vm[uuid:%s] 现已在 host[uuid:%s] 上运行,这与关联于 vm 调度组[uuid:%s] 的调度规则[%s]不符。", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10028": "vm[uuid:%s] 现已在 host[uuid:%s] 上运行,这与关联于 vm 调度组[uuid:%s] 的调度规则[%s]不符。", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10019": "虚拟机调度组[UUID:%s]已经关联了一个已执行的独占虚拟机或亲和虚拟机调度策略。您不能再次将任何需要执行的两种调度策略中的任何一个关联到该组。", + "ORG_ZSTACK_AI_10028": "模型服务不能为 null 或空", + "ORG_ZSTACK_AI_10029": "模型服务应使用相同的模型UUID", + "ORG_ZSTACK_AI_10026": "服务网络UUID %s 不是系统L3网络", + "ORG_ZSTACK_AI_10027": "存储网络UUID %s 不是系统L3网络", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10025": "vm[uuid:%s] 现已在主机[uuid:%s]上运行,这与关联的虚拟机调度组[uuid:%s]的调度规则不符。", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10026": "主机组[uuid:%s]不存在", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10024": "虚拟机调度组[uuid:%s]为虚拟机[uuid:%s]预留主机[uuid:%s]失败", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10007": "vm[uuid:%s] 已经绑定到 vm 调度组[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10008": "检测到不匹配的区域,vm[uuid: %s, 区域uuid: %s] 的区域与 vm 调度规则组[uuid: %s, 区域uuid: %s] 不一致", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10005": "您添加到主机调度组的主机必须启用并连接到管理节点。", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10006": "检测到不匹配的区域,主机[uuid: %s, 区域uuid: %s]的区域与宿主机调度规则组[uuid: %s, 区域uuid: %s]不同", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10009": "vm只能在状态[%s,%s]时更改其vm调度组,但vm当前处于状态[%s]", + "ORG_ZSTACK_TEMPLATECONFIG_10000": "无法找到任何 TemplateConfigs: [模板Uuid: %s]", + "ORG_ZSTACK_TICKET_API_10002": "没有定义账户系统类型[%s]", + "ORG_ZSTACK_TICKET_API_10003": "未找到匹配的票类型", + "ORG_ZSTACK_TICKET_API_10004": "未找到匹配的工单流程集合或默认的工单流程集合,请指定 flowCollectionUuid 或在系统中创建一个默认的工单流程集合", + "ORG_ZSTACK_TEMPLATECONFIG_10003": "无法找到 TemplateConfig[category: %s, name: %s, templateUuid: %s]", + "ORG_ZSTACK_TICKET_API_10005": "票据流程收集[uuid:%s]与票据类型[uuid:%s]不符", + "ORG_ZSTACK_TICKET_API_10006": "票据流程收集[uuid:%s]无效,请联系管理员进行修正", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10000": "阿里云 NAS 主存储[uuid:%s, name:%s]无法在关联的集群中找到可用主机以实例化卷", + "ORG_ZSTACK_TICKET_API_10007": "票流收集[uuid:%s]已禁用,无法使用", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10001": "阿里云NAS主存储[UUID:%s, 名称:%s]无法在关联的集群中找到可用主机以删除主存储上的位数据", + "ORG_ZSTACK_TICKET_API_10008": "无效请求。未找到 API[%s]", + "ORG_ZSTACK_TICKET_API_10009": "无效请求,无法从 apiBody 创建 API[%s],%s", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10010": "无法操作VPC VM调度组", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10011": "zoneUuid 不为空", + "ORG_ZSTACK_TEMPLATECONFIG_10005": "无法找到任何模板配置:[模板Uuid: %s]", + "ORG_ZSTACK_AI_10012": "架构图像必须不为 null 或为空", + "ORG_ZSTACK_AI_10042": "无效的 YAML 格式: %s", + "ORG_ZSTACK_AI_10043": "YAML配置和单独的参数不能同时用于更新。", + "ORG_ZSTACK_AI_10040": "服务端口不能包含重复项: %s", + "ORG_ZSTACK_AI_10041": "服务启动时间必须在 [1,65535] 范围内", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10006": "在宿主机上检查挂载路径失败: %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10005": "阿里云NAS主存储[uuid:%s,名称:%s]未附加到任何集群,或附加的集群中没有任何主机连接", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10009": "无法找到主机清理镜像缓存。", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10013": "无法将主存储附加到集群。集群中的 KVM 主机[uuid:%s, name:%s]使用的是 qemu-img 版本[%s];但主存储已附加到具有不同 KVM 主机[uuid:%s]的集群中,该主机使用的是 qemu-img 版本[%s]。qemu-img 版本大于%s与版本小于%s不兼容,这将导致卷快照操作失败。请避免将主存储附加到具有不同 Linux 发行版的集群中,以防止 qemu-img 版本不匹配。", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10014": "没有可用的主机可以下载imagecache!", + "ORG_ZSTACK_AI_10049": "CPU 架构在架构图像映射中不能为空", + "ORG_ZSTACK_AI_10046": "GPU供应商 %s 必须具有规格UUID列表", + "ORG_ZSTACK_AI_10047": "GPU 规格 UUID(s) 对于供应商 %s 在 %s 中未找到: %s", + "ORG_ZSTACK_AI_10044": "GPU供应商规范映射在架构图像映射中不能为空", + "ORG_ZSTACK_AI_10045": "GPU供应商在架构图像映射中不能为null", + "ORG_ZSTACK_AI_10031": "模型服务 UUID 不应为空", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10008": "解析 MS 包封失败: %s, %s", + "ORG_ZSTACK_AI_10032": "节点排名应位于 [0, %s) 内,但获取到的是 %s", + "ORG_ZSTACK_AI_10030": "模型服务应使用相同的区域UUID", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10003": "非法参数 %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10004": "解密数据失败", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10017": "阿里云NAS访问组[%s]不存在,可能已被删除!", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10018": "EcsVSwitchVO[%s] 不存在,可能已被删除!", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10020": "无法在主存储中找到可用的主机进行操作:%s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10021": "失败从主机[uuid:%s] ping 淘云 NAS 主存储[uuid:%s],原因:%s。断开此主机-PS连接", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10024": "无法找到任何适用于类型的[%s]的BackupStorageKvmFactory", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10025": "无法找到主机操作卷:[%s]", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10023": "NAS 主存储未挂载,请先初始化它!", + "ORG_ZSTACK_AI_10039": "服务端口必须在 [1,65535] 范围内,但获取到的是: %s", + "ORG_ZSTACK_AI_10037": "服务Livez必须以\u0027/\u0027开头,不允许有空格,长度\u003c\u003d512", + "ORG_ZSTACK_AI_10038": "服务就绪路径必须以\"/\"开头,不得包含空格,长度不得超过512字符", + "ORG_ZSTACK_AI_10035": "无效框架: %s, 有效值为: %s", + "ORG_ZSTACK_AI_10036": "无效框架: %s", + "ORG_ZSTACK_AI_10033": "无效的PCI设备编号: %s", + "ORG_ZSTACK_AI_10034": "节点排名应该唯一,但得到 %s", + "ORG_ZSTACK_ACL_10001": "%s 在访问控制列表组:%s 中与重复/重叠的 IP 条目冲突", + "ORG_ZSTACK_AI_10064": "无效的数据集结构: %s", + "ORG_ZSTACK_ACL_10000": "不支持的 IP 版本 %d", + "ORG_ZSTACK_AI_10065": "系统预设数据集不允许通过API进行更新", + "ORG_ZSTACK_AI_10062": "数据集正在被使用,无法通过API删除", + "ORG_ZSTACK_AI_10063": "updateDatasetStructs 不能为 null 或空", + "ORG_ZSTACK_AI_10060": "无法销毁虚拟机实例,因为该虚拟机实例被模型服务组[uuid: %s]使用", + "ORG_ZSTACK_ZSV_COMPUTER_VM_10000": "vm 名称 %s 已经存在", + "ORG_ZSTACK_AI_10061": "应用类型实例组的共享不允许: %s", + "ORG_ZSTACK_ACL_10009": "访问控制列表组[%s]已经拥有一个重定向规则,无法添加重定向规则", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10028": "没有可用主机可以检查挂载路径!", + "ORG_ZSTACK_ACL_10008": "访问控制列表组[%s]已经拥有IP条目,无法添加重定向规则", + "ORG_ZSTACK_ACL_10007": "访问控制列表组[%s]已经拥有重定向规则,无法添加IP条目", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10026": "无法在主节点上找到并同步卷大小:%s", + "ORG_ZSTACK_ACL_10006": "访问控制列表组[%s]不能添加超过%d个IP条目", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10027": "图像 [%s] 已被删除,无法从它重新初始化根磁盘", + "ORG_ZSTACK_SCHEDULER_SNAPSHOT_10000": "根卷[%s]的VM状态为销毁中。不允许作业状态变更", + "ORG_ZSTACK_ACL_10005": "访问控制列表组[%s]已经拥有重定向规则,无法添加IP条目", + "ORG_ZSTACK_ACL_10004": "无效的规则表达式,详细信息: %s", + "ORG_ZSTACK_ACL_10003": "IP范围[%s, %s]与访问控制列表组:%s中的[%s, %s]有重叠", + "ORG_ZSTACK_ACL_10002": "ip 格式只支持 ip/iprange/cidr,但发现 %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10031": "阿里云NAS主要存储仅支持imagestore bs类型,实际获取类型:%s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10000": "信息安全加密驱动程序加密失败", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10001": "信息安全加密驱动解密失败", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10002": "加密数据[%s]或算法类型[%s]为空", + "ORG_ZSTACK_AI_10068": "模型评估需要 ModelServiceType.ModelEval 类型的模型服务", + "ORG_ZSTACK_AI_10069": "datasetUuids 或者提示是模型评估所需的一项内容", + "ORG_ZSTACK_AI_10066": "模型服务视图对象的UUID是必需的", + "ORG_ZSTACK_AI_10067": "服务类型是必需的", + "ORG_ZSTACK_ACL_10012": "[%s]不是一个有效的URL", + "ORG_ZSTACK_AI_10053": "图像 [uuid:%s] 对于架构 %s 已禁用且无法使用", + "ORG_ZSTACK_ACL_10011": "域名[%s]无效", + "ORG_ZSTACK_AI_10054": "图像 [uuid:%s] 对于架构 %s 尚未准备好且无法使用", + "ORG_ZSTACK_ACL_10010": "域名和URL不能同时为空", + "ORG_ZSTACK_AI_10051": "至少需要为架构 %s 指定一种镜像类型(vmImageUuid 或 dockerImage)", + "ORG_ZSTACK_AI_10052": "无效的镜像 UUID 对于架构 %s: %s", + "ORG_ZSTACK_AI_10050": "无效的 CPU 架构类型在架构图像映射中:%s,支持的类型为:%s", + "ORG_ZSTACK_AI_10059": "消息中数据集数据类型过多:%s,请将类型减少为一种", + "ORG_ZSTACK_AI_10057": "创建数据集而不使用 \u0027dataset::datatype::\u0027 和 \u0027dataset::usage::scenarios::\u0027 是不允许的", + "ORG_ZSTACK_AI_10058": "至少应为一个数据集设置一种数据类型:datatype::", + "ORG_ZSTACK_AI_10055": "重复的 CPU 架构在架构图像映射中: %s", + "ORG_ZSTACK_AI_10056": "架构图像不能为空", + "ORG_ZSTACK_VMWARE_10101": "列表存储失败 for %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10051": "lun 名是必填项但获取到 null", + "ORG_ZSTACK_VMWARE_10102": "没有找到为VM: %s 对应的数据存储", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10054": "失败获取 lun:%s 的快照,id 为:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10053": "失败获取 lun:%s 的快照", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10012": "SFTP 备份存储不支持计算镜像哈希值", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10050": "发起人[%s]在XStor中已存在且未绑定到主机[%s],请确保发起人的名称是唯一的", + "ORG_ZSTACK_ALIYUN_NETWORK_10020": "只有处于运行中和已停止状态的 ECS 实例才能绑定 EIP,但当前 ECS [%s] 的状态是 [%s]。", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10016": "创建镜像元数据文件 : %s 失败", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10017": "检查镜像元数据文件: %s 失败", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10018": "图像元数据文件: %s 不存在", + "ORG_ZSTACK_ZWATCH_ALARM_10022": "重复动作[uuid:%s, 类型:%s]对于警报[uuid:%s]的操作已被记录", + "ORG_ZSTACK_ZWATCH_ALARM_10021": "动作[uuid:%s, 类型:%s] 未找到", + "ORG_ZSTACK_ZWATCH_ALARM_10020": "无效的操作类型[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10026": "重复键[%s]的值为%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10170": "无法将服务器IP添加到共享负载均衡服务器组", + "ORG_ZSTACK_ZWATCH_ALARM_10025": "指标[%s]不存在标签[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10023": "重复标签[key:%s, 操作符:%s, 值:%s]告警[uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10029": "指标[%s]仅管理员可见,当前用户不可用", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10171": "无法更改后端服务器,因为 vmincs 和 serverips 为空", + "ORG_ZSTACK_ZWATCH_ALARM_10028": "命名空间[%s]不存在度量[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10027": "命名空间[%s]不支持", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10049": "lun id 不合法", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10048": "lun映射ID是必填项,不能为空,也不能为0", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10045": "失败获取 lun %s 映射,因为:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10044": "失败检查 lun %s 会话状态,因为:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10047": "无法获取 lun 映射 id,我们只能返回失败", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10046": "失败获取 lun %s 剩余创建 lun 数量,因为:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10041": "快照ID是必填项,但获取到:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10040": "失败查询快照 %s,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10043": "失败回滚快照:%s,因为:%s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10020": "请在创建 SFTP 备份存储 %s 之前停止 VM", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10042": "失败删除快照 %s,因为 %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10023": "重复的备份存储。已存在一个 SFTP 备份存储[主机名:%s]", + "ORG_ZSTACK_LICENSE_CUBE_10000": "许可证上下文不能为 null", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10038": "失败获取存储池 %s,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10037": "失败删除 lun %s,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10039": "失败为 LUN %s 创建快照,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10034": "lun映射ID是必填项,但获取:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10033": "失败将 LUN %s 映射到主机组 %s,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10036": "lun id 是必填项,但获取到:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10035": "失败删除 lun 映射 %s,因为 %s", + "ORG_ZSTACK_ALIYUN_NETWORK_10004": "ecs 实例[%s]不存在,请检查。", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10001": "%s 从 imagestore 备份存储[主机名:%s, 路径: %s]下载数据到本地主存储[唯一标识符:%s, 路径: %s]失败, %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10002": "上传本地存储[uuid:%s, 路径:%s]至镜像存储 [主机名:%s]失败,%s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10020": "l3网络 %s 和 vpc %s 已经连接,请检查", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10000": "源虚拟机在主机[uuid: %s]上有本地数据卷,但在快速克隆API消息中尝试将虚拟机克隆到主机[%s],这对于快速克隆功能来说是不可能的。", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10000": "自动扩展规则调度作业触发器VO[uuid:%s]的状态为:%s,不允许状态变更", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10001": "自动扩展规则调度作业触发器VO[uuid:%s]正处于冷却期", + "ORG_ZSTACK_ALIYUN_NETWORK_10008": "虚拟边界: %s 已被删除", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10002": "自动扩展规则VO[uuid:%s]的状态为:%s,不允许状态变更", + "ORG_ZSTACK_ALIYUN_NETWORK_10005": "只有处于运行中和已停止状态的 ECS 实例才能解绑 EIP,但当前 ECS 实例 [%s] 的状态是 [%s]。", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10018": "CpeIp 必须是ipv4地址,但目前是%s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10017": "只有管理员可以创建连接", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10019": "cpeIp 必须是ipv4地址", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10000": "SftpBackupStorage 不支持 url[%s] 中的 scheme[%s]", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10014": "在云存储中未找到对应的vbr: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10013": "没有找到对应的虚拟机:%s", + "ORG_ZSTACK_ALIYUN_NETWORK_10010": "目标 cidr [%s] 已存在并指向另一个 instance-id [%s],请先检查或删除后再操作", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10061": "失败获取镜像缓存LUN信息", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10016": "不支持的资源类型: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10003": "失败取消下载镜像,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10060": "新的镜像缓存尚未就绪,请等待一秒,再重试一次", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10015": "在第 %s 层网络中未找到:%s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10004": "SFTP备份存储代理的UUID发生变化[预期:%s,实际:%s],最有可能是代理手动重启了。请发起重新连接以同步状态", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10010": "没有为三层网络 %s 找到相应的 CIDR", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10012": "没有找到对应的VPC: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10059": "无法找到 lun: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10055": "XStor 集群不健康,集群信息[cluster_data_state: %s, cluster_healthy_state: %s, cluster_running_state: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10058": "非法逻辑单元ID", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10057": "lun %s 在主机 %s 的会话不活跃", + "ORG_ZSTACK_HYBRID_NETWORK_10027": "CIDR 与其他虚拟交换机重叠: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10028": "无效的CidrBlock: %s,必须在\u002710.0.0.0/8\u0027, \u0027172.16.0.0/12\u0027, \u0027192.168.0.0/16\u0027范围内", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10010": "失败删除主机 %s,因为 %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10009": "在三层网络:%s 未找到相应的虚拟路由器网卡", + "ORG_ZSTACK_HYBRID_NETWORK_10029": "不存在的虚拟边界路由器: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10003": "自定义CIDR [%s] 已存在于VBR [%s] 中,它与目标CIDR [%s] 重叠,请先检查并删除后再操作。", + "ORG_ZSTACK_HYBRID_NETWORK_10020": "下一跳路由器接口属于 %s,但条目属于 %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10001": "Vbr: [%s]正处于建立连接过程中,请等待...", + "ORG_ZSTACK_HYBRID_NETWORK_10021": "没有此类VPN网关: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10000": "自定义CIDR [%s] 已存在于虚拟路由器 [%s] 中,它与目标CIDR [%s] 重叠,请先检查并删除它。", + "ORG_ZSTACK_HYBRID_NETWORK_10022": "下一跳类型 [%s] 现在不支持创建路由条目!", + "ORG_ZSTACK_HYBRID_NETWORK_10024": "虚拟边界路由器仅支持路由接口作为下一跳类型", + "ORG_ZSTACK_HYBRID_NETWORK_10026": "交换机的 CIDR [%s] 不在 VPC 的 [%s] 中", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10008": "失败将主机 %s 添加到主机组 %s 中,原因:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10005": "失败获取可用区域的子网因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10004": "失败同步访问区域因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10007": "失败查询主机 %s,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10006": "失败查询所有主机,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10001": "失败将初始化程序:%s 添加到主机,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10000": "登录 XStor 设备失败: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10002": "失败将 lun: %s 复制到 %s,因为 %s", + "ORG_ZSTACK_HYBRID_NETWORK_10038": "eip[%s] 和 ecs[%s] 应该在同一个数据中心", + "ORG_ZSTACK_VMWARE_10135": "失败将ZStack UUID设置为VCenter ManagedEntity [名称:%s, mor:%s] 因为 %s", + "ORG_ZSTACK_HYBRID_NETWORK_10039": "无法解绑弹性公网IP:[%s], 它未绑定在任何实例上", + "ORG_ZSTACK_VMWARE_10132": "没有可用的单位编号用于数据盘 %s", + "ORG_ZSTACK_VMWARE_10133": "创建分布式端口组失败,分布式交换机 [%s],%s", + "ORG_ZSTACK_VMWARE_10130": "删除虚拟磁盘[%s]失败: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10030": "无此类虚拟路由器: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10031": "本地网关不是IPv4地址: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10032": "peerGateway 不是 IPv4 地址: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10033": "peerGateway 不是子网掩码: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10034": "vlanId 不是数字: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10035": "未能将弹性公网IP绑定至ECS: [%s] ,弹性公网IP :[%s] 已经绑定至ECS:[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10036": "ecs [%s] 已经有公网IP了", + "ORG_ZSTACK_HYBRID_NETWORK_10037": "没能将弹性公网IP [%s] 挂载到ECS: [%s] ,因为ECS已经挂载了", + "ORG_ZSTACK_SSO_SERVICE_10014": "虚拟ID不存在用户名%s", + "ORG_ZSTACK_VMWARE_10129": "虚拟磁盘管理器不可用", + "ORG_ZSTACK_SSO_SERVICE_10011": "响应有错误 : %s", + "ORG_ZSTACK_SSO_SERVICE_10010": "重定向网址有误, %s", + "ORG_ZSTACK_VMWARE_10128": "没有为数据存储找到数据中心", + "ORG_ZSTACK_SSO_SERVICE_10013": "账户不存在用户名 %s", + "ORG_ZSTACK_SSO_SERVICE_10012": "生成用户信息映射配置以供 SSO 客户端 [UUID: %s] 使用时失败:未发现自定义属性映射。", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10030": "查询主机组 %s 的 lun 映射失败,原因:%s", + "ORG_ZSTACK_HYBRID_NETWORK_10005": "路由器接口必须位于同一数据中心,但 ri[%s] 位于 dc[%s],而 ri[%s] 位于 dc[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10032": "失败获取集群信息,因为 %s", + "ORG_ZSTACK_VMWARE_10121": "创建 dvPortGroup 失败:%s", + "ORG_ZSTACK_HYBRID_NETWORK_10007": "路由器接口[%s]状态不是空闲,它是%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10031": "失败查询 lun 映射 %s,因为 %s", + "ORG_ZSTACK_HYBRID_NETWORK_10009": "路由器接口[%s]已经存在连接,状态是%s", + "ORG_ZSTACK_VMWARE_10120": "dv交换机 [%s] 在 vCenter [%s] 中未找到", + "ORG_ZSTACK_GUESTTOOLS_10009": "在管理节点[uuid:%s]中为宿主机[uuid:%s]未找到合适的客户机工具ISO文件", + "ORG_ZSTACK_GUESTTOOLS_10007": "无法获取虚拟机[uuid:%s]的最新guest-tools,因为该虚拟机未运行或正在恢复中。", + "ORG_ZSTACK_ZWATCH_ALARM_10000": "无法找到事件订阅[uuid:%s],它可能已被删除", + "ORG_ZSTACK_GUESTTOOLS_10008": "无法获取虚拟机[uuid:%s]的最新guest-tools,因为它不是用户虚拟机", + "ORG_ZSTACK_GUESTTOOLS_10005": "qga状态变更失败对于vm[uuid:%s]", + "ORG_ZSTACK_GUESTTOOLS_10006": "无法为虚拟机[uuid:%s]获取最新的guest-tools,因为其宿主机类型不受支持", + "ORG_ZSTACK_GUESTTOOLS_10004": "qga上传文件失败[%s]", + "ORG_ZSTACK_GUESTTOOLS_10001": "一个错误发生在vm-%s: %s", + "ORG_ZSTACK_ZWATCH_ALARM_10002": "指标[%s]的重复间隔值不能小于1小时", + "ORG_ZSTACK_GUESTTOOLS_10002": "上传文件到虚拟机 vm-%s 失败, %s", + "ORG_ZSTACK_ZWATCH_ALARM_10001": "无法找到告警[uuid:%s],它可能已被删除", + "ORG_ZSTACK_SSO_SERVICE_10008": "令牌不存在", + "ORG_ZSTACK_AI_10109": "模型中心[uuid: %s]未找到", + "ORG_ZSTACK_SSO_SERVICE_10007": "上传管理员信息到Keycloak失败。", + "ORG_ZSTACK_ZWATCH_ALARM_10007": "该事件订阅已经具有标签[%s]", + "ORG_ZSTACK_AI_10107": "模型服务实例(主节点)带有节点排名 0 的实例在模型服务实例组[uuid: %s]中未找到", + "ORG_ZSTACK_ZWATCH_ALARM_10006": "事件没有标签[%s]", + "ORG_ZSTACK_SSO_SERVICE_10009": "%s 类型不支持", + "ORG_ZSTACK_AI_10108": "模型服务实例组 %s 未找到", + "ORG_ZSTACK_ZWATCH_ALARM_10005": "操作[uuid:%s]已绑定至事件订阅[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10027": "失败创建LUN名称:%s,错误信息:%s", + "ORG_ZSTACK_SSO_SERVICE_10004": "IdP元数据是必需的", + "ORG_ZSTACK_AI_10105": "部署模型服务回复成功,但模型服务实例UUID为空", + "ORG_ZSTACK_SSO_SERVICE_10003": "无效的授权网址: %s", + "ORG_ZSTACK_AI_10106": "模型服务实例UUID为空,无法处理模型服务实例", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10029": "lun ID 在查询 lun 映射时是必填项", + "ORG_ZSTACK_SSO_SERVICE_10006": "无效的身份提供商元数据: %s", + "ORG_ZSTACK_AI_10103": "模型服务实例组[UUID: %s]未找到,跳过创建资源以运行服务流程", + "ORG_ZSTACK_VMWARE_10118": "创建端口组失败为主机 %s:因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10028": "失败查询 lun %s,因为 %s", + "ORG_ZSTACK_AI_10104": "部署模型服务回复成功,但未找到模型服务实例组[uuid: %s]", + "ORG_ZSTACK_VMWARE_10119": "创建端口组失败,主机 %s", + "ORG_ZSTACK_AI_10101": "模型存储后端未找到,对于模型服务实例组[uuid: %s]", + "ORG_ZSTACK_VMWARE_10116": "端口组[%s]已在主机[%s]上存在,但vlanId不同(%d)", + "ORG_ZSTACK_AI_10102": "分配模型服务实例名称失败,因为 %s", + "ORG_ZSTACK_VMWARE_10117": "端口组[%s]已在主机[%s]上存在,请使用其他名称再次创建或手动删除端口组并重新关联至集群", + "ORG_ZSTACK_SSO_SERVICE_10002": "SSO客户端不是身份类型[%s],推送操作不允许。", + "ORG_ZSTACK_VMWARE_10114": "dvSwitch名称[%s]不唯一", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10024": "失败创建LUN名称:%s,无法找到根本原因", + "ORG_ZSTACK_SSO_SERVICE_10001": "SSO客户端(uuid [%s])不存在。", + "ORG_ZSTACK_AI_10100": "模型服务实例组[uuid: %s]的模型服务uuid为空", + "ORG_ZSTACK_VMWARE_10115": "主机[%s:%s]未在vCenter中找到", + "ORG_ZSTACK_VMWARE_10112": "创建 dvSwitch 失败:%s", + "ORG_ZSTACK_HYBRID_NETWORK_10016": "%s 不是一个有效的cidr", + "ORG_ZSTACK_VMWARE_10113": "获取 vCenter 集群[%s] 名称失败", + "ORG_ZSTACK_HYBRID_NETWORK_10017": "安全组规则已存在", + "ORG_ZSTACK_VMWARE_10110": "guest 工具未安装或运行中:%s", + "ORG_ZSTACK_HYBRID_NETWORK_10018": "dstCidrBlock[%s] 不是一个有效的CIDR地址", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10020": "失败更新 lun 名称: %s, 错误信息:%s", + "ORG_ZSTACK_VMWARE_10111": "上传文件到虚拟机失败:%s", + "ORG_ZSTACK_HYBRID_NETWORK_10019": "没有这样的 ECS 实例: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10010": "访问点UUID在VBR类型路由器的路由接口不可为空", + "ORG_ZSTACK_HYBRID_NETWORK_10011": "无法在VirtualBorderRouterVO中找到这样的路由器UUID[%s]", + "ORG_ZSTACK_GUESTTOOLS_10018": "无法迁移虚拟机[uuid:%s],因为存在vf nic但guesttools未运行", + "ORG_ZSTACK_ZWATCH_ALARM_10011": "事件[%s]不存在标签[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10012": "无法在VpcVirtualRouterVO中找到这样的路由器UUID[%s]", + "ORG_ZSTACK_GUESTTOOLS_10019": "无法将L3网络附加到VM[uuid:%s],因为guesttools未运行。", + "ORG_ZSTACK_ZWATCH_ALARM_10010": "命名空间[%s]不存在该事件[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10013": "不支持的路由器类型: %s", + "ORG_ZSTACK_GUESTTOOLS_10016": "无法更改VF NIC HA状态,因为未找到VF NIC[uuid:%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10014": "无法删除系统记录", + "ORG_ZSTACK_GUESTTOOLS_10017": "无法更改VF NIC HA状态,因为guesttools未运行。", + "ORG_ZSTACK_HYBRID_NETWORK_10015": "仅支持VPC内的网络规则", + "ORG_ZSTACK_GUESTTOOLS_10014": "脚本包含未对应运行时参数的占位符 %s。请通过 runtimeParams 提供这些占位符的值。", + "ORG_ZSTACK_ZWATCH_ALARM_10015": "周期字段不支持度量[name:%s]", + "ORG_ZSTACK_GUESTTOOLS_10015": "无法迁移主存储,因为 vm[uuid:%s] 挂载了 VF NIC 但 GuestTools 未运行", + "ORG_ZSTACK_ZWATCH_ALARM_10014": "周期字段不能为空对于指标 [名称:%s]", + "ORG_ZSTACK_GUESTTOOLS_10012": "encodingType 和 scriptContent 必须同时出现或同时缺失", + "ORG_ZSTACK_ZWATCH_ALARM_10013": "命名空间[%s]未找到", + "ORG_ZSTACK_GUESTTOOLS_10013": "无效的 renderParams 格式,必须是一个有效的 JSON 数组。示例:[{\"key\":\"k1\",\"value\":\"v1\"}]。错误:%s", + "ORG_ZSTACK_GUESTTOOLS_10010": "在宿主机[uuid:%s]上检查Guest Tools失败", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10019": "失败按路径查询 lun: %s, 错误信息:%s", + "ORG_ZSTACK_GUESTTOOLS_10011": "设置虚拟机[uuid: %s, name: %s]的主机名失败,因为QGA状态未运行且不存在DHCP服务", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10016": "失败添加主机组: %s, 错误信息:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10015": "失败查询主机组,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10017": "失败查询 lun : %s, 错误信息:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10012": "失败删除主机组 %s,因为 %s", + "ORG_ZSTACK_VMWARE_10105": "在主机 %s 中未找到资源池", + "ORG_ZSTACK_VMWARE_10106": "失败在搜索主机 %s 的资源池", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10014": "失败删除发起方 %s,因为 %s", + "ORG_ZSTACK_VMWARE_10103": "失败设置 ESX 虚拟机 UUID [%s:%s],因为[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10013": "主机ID是必填项,但获取到:%s", + "ORG_ZSTACK_VMWARE_10104": "模板 [%s] 未找到", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10029": "无法找到 build-app[uuid: %s],或者它处于删除状态", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10028": "无法找到镜像[%s]的imageUuid", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10027": "imageStore 没有连接", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10026": "imageStore 没有启用", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10024": "无法找到构建应用:[%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10022": "构建系统[uuid: %s]尚未绑定至区域[uuid: %s]", + "ORG_ZSTACK_CONTAINER_10040": "在任何可用集群上创建部署失败。尝试了 %d 个集群: %s", + "ORG_ZSTACK_FLOWMETER_10013": "收集器与 %s 存在重复", + "ORG_ZSTACK_FLOWMETER_10014": "未指定参数", + "ORG_ZSTACK_FLOWMETER_10015": "[%s] 不符合IP地址格式", + "ORG_ZSTACK_FLOWMETER_10016": "流收集器[%s]不存在", + "ORG_ZSTACK_GUESTTOOLS_10029": "无法从虚拟机[uuid:%s]获取guest-tools信息,因为该虚拟机未运行", + "ORG_ZSTACK_CONTAINER_10043": "失败查询服务: %s,因为 %s", + "ORG_ZSTACK_FLOWMETER_10017": "流量计[%s]不存在", + "ORG_ZSTACK_FLOWMETER_10018": "流量计[%s]不支持IPv6版本[%s]", + "ORG_ZSTACK_GUESTTOOLS_10027": "无法将guest-tools iso附加到[uuid:%s]虚拟机,因为这不是用户虚拟机", + "ORG_ZSTACK_CONTAINER_10045": "创建服务失败,因为 %s", + "ORG_ZSTACK_FLOWMETER_10019": "采集器 [%s %d] 与 %s 复制", + "ORG_ZSTACK_GUESTTOOLS_10028": "无法将Guest-Tools ISO挂载到VM[UUID:%s],因为其没有CDROM接口", + "ORG_ZSTACK_CONTAINER_10037": "无法找到任何容器集群,请检查NativeClusterVO以获取详细信息", + "ORG_ZSTACK_GUESTTOOLS_10025": "无法将guest-tools iso附加到[uuid:%s]的vm上,因为其hypervisor类型不受支持", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10057": "使用 ipmitool 关闭裸金属2机箱[uuid:%s]失败", + "ORG_ZSTACK_GUESTTOOLS_10026": "无法将guest-tools iso挂载到[uuid:%s]虚拟机上,因为该虚拟机未运行", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10058": "失败由bm代理关闭裸金属2实例[uuid:%s],因为%s", + "ORG_ZSTACK_GUESTTOOLS_10023": "更新 vm[uuid:%s] 的网络配置失败,因为 GuestTools 版本过低,无法支持此功能。", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10059": "裸金属2机箱[UUID:%s]在后再%d秒仍未关机", + "ORG_ZSTACK_GUESTTOOLS_10024": "更新虚拟机[uuid:%s]的网络配置失败,因为guesttools未运行。", + "ORG_ZSTACK_GUESTTOOLS_10021": "冲突主机名,三层网络[uuid:%s]上已有虚拟机[uuid:%s]使用主机名[%s]", + "ORG_ZSTACK_GUESTTOOLS_10022": "更新虚拟机[uuid:%s]的网络配置失败,因为该虚拟机未运行。", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10054": "失败通过网关[uuid:%s]ping裸金属实例[uuid:%s],因为%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10055": "通过网关[uuid:%s]更改裸金属2实例[uuid:%s]的密码失败,因为%s", + "ORG_ZSTACK_GUESTTOOLS_10020": "无法设置虚拟机主机名。虚拟机[UUID:%s]没有默认L3网络", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10056": "使用 ipmitool 启动裸金属2机箱[uuid:%s]失败", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10021": "无法找到构建系统 [%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10020": "构建系统[uuid: %s]已附加到区域[uuid: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10050": "未能在金属实例[uuid:%s]的网关[uuid:%s]中创建控制台代理,因为%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10051": "无法将默认网络从 l3[uuid:%s] 更改为 l3[uuid:%s] 用于裸金属实例[uuid:%s],因为 %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10018": "添加 BuildApp 失败,因为 appId[%s:%s] 与另一个 BuildApp 冲突", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10017": "无法连接到本地存储构建系统\"url:%s\",因为%s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10016": "创建 BuildApp 失败,因为 appId[%s: %s] 已被另一个 BuildApp 重复", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10015": "构建应用被禁用,因为构建系统处于“禁用”状态", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10014": "rest 调用 %s 失败,因为: %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10013": "构建应用处于 %s 状态,当前操作不被支持。", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10012": "无法找到由 UUID[%s] 构建的应用程序", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10011": "因为构建系统处于状态为 %s 的原因无法执行该操作", + "ORG_ZSTACK_CONTAINER_10031": "部署未找到: %s", + "ORG_ZSTACK_FLOWMETER_10003": "网络[%s]已添加至流量计[%s]", + "ORG_ZSTACK_FLOWMETER_10004": "虚拟路由器已添加到其他计流器中", + "ORG_ZSTACK_FLOWMETER_10005": "无效的类型参数是 %s,应该在 %s 中", + "ORG_ZSTACK_CONTAINER_10032": "失败修补部署,因为 %s", + "ORG_ZSTACK_CONTAINER_10034": "失败替换部署,因为 %s", + "ORG_ZSTACK_CONTAINER_10026": "删除服务失败,因为 %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10046": "失败在网关[uuid:%s]中销毁分配网络,因为%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10047": "裸金属2实例[uuid:%s]未找到相应的网络接口卡 provisioning nic not found for baremetal2 instance[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10048": "无法为裸金属2实例[uuid:%s]在网关[uuid:%s]创建配置信息,因为%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10049": "未能删除裸金属2实例[uuid:%s]在网关[uuid:%s]中的配置,因为%s", + "ORG_ZSTACK_IMAGEREPLICATOR_10000": "目标备份存储[uuid:%s]变得不可用", + "ORG_ZSTACK_GUESTTOOLS_10032": "无法更新虚拟机 [uuid:%s] 的guest tools状态,因为该虚拟机已被删除", + "ORG_ZSTACK_ALIYUN_OSS_10002": "域名、密钥、密秘必须全部设置", + "ORG_ZSTACK_CONTAINER_10029": "API 错误: %s", + "ORG_ZSTACK_IMAGEREPLICATOR_10001": "一个或多个备份存储[uuid:%s]已被添加到复制组[uuid:%s]中", + "ORG_ZSTACK_ALIYUN_OSS_10003": "oss桶不为空!", + "ORG_ZSTACK_GUESTTOOLS_10030": "无法从虚拟机[uuid:%s]获取guest-tools信息,因为这不是用户虚拟机", + "ORG_ZSTACK_ALIYUN_OSS_10000": "ossBucket [%s] 已经添加到数据中心 [%s] 中", + "ORG_ZSTACK_GUESTTOOLS_10031": "无效调试参数: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10045": "在网关[uuid:%s]准备提供网络时失败,因为%s", + "ORG_ZSTACK_ALIYUN_OSS_10001": "OssBucket[%s] 没有绑定。", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10010": "both exportId 和 buildAppUuid 都被设置但它们不相等", + "ORG_ZSTACK_IMAGEREPLICATOR_10002": "备份存储[uuids:%s]不是ImageStore类型", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10040": "将图像数据转换到本地磁盘失败", + "ORG_ZSTACK_IMAGEREPLICATOR_10003": "备份存储[uuids:%s]未附加到任何区域", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10041": "裸金属2实例[uuid:%s]在裸金属2机箱[uuid:%s]上转换卷失败,超时 %s 分钟后仍未完成", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10035": "获取卷[uuid:%s]的iSCSI目标iqn或网关IP从主要存储[uuid:%s]失败", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10037": "机箱:%s 磁盘缺少wwn信息,请检查机箱后再次尝试", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10031": "失败从裸金属2实例[uuid:%s]解绑分配的网络接口至绑定通过网关[uuid:%s],因为 %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10032": "裸金属2实例[uuid:%s]未连接,无法附加提供者网卡到聚合网卡", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10033": "未能将分配的网卡附加到裸金属2实例[uuid:%s](uuid:%s)上的绑定接口,因为%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10030": "裸金属2实例[uuid:%s]未连接,无法分离绑定的提供网络接口", + "ORG_ZSTACK_CONTAINER_10051": "未能为账号[uuid:%s]找到k8s客户端", + "ORG_ZSTACK_CONTAINER_10050": "集群 %s 的 kube 配置为空", + "ORG_ZSTACK_CONTAINER_10052": "失败使用kube配置文件内容: %s", + "ORG_ZSTACK_CORE_PROGRESS_10000": "参数 apiId[%s] 不是一个有效的UUID。", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10029": "删除转换卷到机箱本地磁盘配置在网关[uuid:%s]中失败,针对裸金属2实例[uuid:%s]", + "ORG_ZSTACK_CONTAINER_10056": "无法找到容器备份存储对象[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10024": "分配的 IP %s 不可用,它无法连接到网关 %s,详情:%s", + "ORG_ZSTACK_CONTAINER_10047": "获取服务[%s]的状态包失败", + "ORG_ZSTACK_CONTAINER_10049": "无法找到集群:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10027": "通过网关[uuid:%s]检查裸金属2机箱由实例[uuid:%s]时失败,因为%s", + "ORG_ZSTACK_STORAGE_CBT_10020": "意外的虚机[uuid: %s]状态: %s,预期的虚机状态是运行中。", + "ORG_ZSTACK_STORAGE_CBT_10021": "该虚拟机[uuid: %s]已创建备份任务,无法同时启用CBT任务。", + "ORG_ZSTACK_STORAGE_CBT_10016": "没有宿主机类型 for VM %s", + "ORG_ZSTACK_STORAGE_CBT_10017": "没有找到类型为[%s]的CbtBackupFactory", + "ORG_ZSTACK_STORAGE_CBT_10014": "VM [uuid: %s] 已由任务: %s 保护", + "ORG_ZSTACK_STORAGE_CBT_10015": "创建 cbt 卷失败。详细信息是: %s", + "ORG_ZSTACK_STORAGE_CBT_10018": "Cbt任务未找到[uuid: %s]", + "ORG_ZSTACK_STORAGE_CBT_10019": "Cbt任务[uuid: %s]已启用,请先禁用它。", + "ORG_ZSTACK_CONTAINER_10000": "容器备份存储不支持 %s", + "ORG_ZSTACK_CONTAINER_10002": "未找到终端节点[%s]所在的区域", + "ORG_ZSTACK_IAM2_RBAC_10006": "操作[%s]被拒绝", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10008": "获取虚网络[uuid:%s]在tf控制器失败", + "ORG_ZSTACK_IAM2_RBAC_10001": "自从项目开始强制使用安全组以来,VM操作需要系统标签", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10009": "更新 tf l2 网络[name:%s] 到 tf 控制器失败", + "ORG_ZSTACK_IAM2_RBAC_10000": "创建虚拟机实例失败,因为三层网络[uuid:%s]未绑定任何集群", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10006": "在 tf 控制器上创建 tf l2 网络[name:%s]失败", + "ORG_ZSTACK_IAM2_RBAC_10003": "项目[uuid:%s]已退役,拒绝所有操作", + "ORG_ZSTACK_IAM2_RBAC_10002": "账号[uuid:%s]的项目不存在", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10005": "获取项目[uuid:%s]在tf控制器失败", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10002": "获取 tf 控制器的默认域失败", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10003": "在 tf 控制器上为 zStack 管理员创建 tf 项目失败", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10000": "tf sdn控制器已经存在。", + "ORG_ZSTACK_STORAGE_CBT_10012": "无法找到CBT任务[uuid: %s]的资源", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10001": "从 ZStack 数据库获取默认管理员账户失败", + "ORG_ZSTACK_STORAGE_CBT_10013": "主机未找到:%s", + "ORG_ZSTACK_STORAGE_CBT_10011": "卷[uuid:%s]对于vmInstance[uuid: %s]已经导出。", + "ORG_ZSTACK_STORAGE_CBT_10006": "无法找到 cbt 任务[uuid:%s]", + "ORG_ZSTACK_STORAGE_CBT_10009": "vm[uuid: %s] 正在运行,请先停止它再尝试操作。", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10004": "参数 \u0027%s\u0027 的类型在表达式中错误,它必须是 %s 类型,但得到的是 %s", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10003": "缺少参数 \u0027%s\u0027 在表达式中", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10000": "无效表达式: %s, %s", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10001": "无效表达式: %s, 未找到表达式", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10019": "在 tf 控制器上添加 tf l3 子网[name:%s]失败,原因:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10082": "裸金属2网关[uuid:%s]未连接,无法为实例[uuid:%s]生成控制台地址", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10016": "更新 tf l3 网络[name:%s] 在 tf 控制器上失败,原因:%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10013": "删除 tf l3 网络[name:%s] 在 tf 控制器失败,原因:%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10011": "删除 tf l2 网络[uuid:%s] 在 tf 控制器失败", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10080": "准备在网关[uuid:%s]中配置分配网络[uuid:%s]失败:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10081": "裸金属服务器实例[uuid:%s]不存在,无法生成其控制台地址", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10007": "buildAppUuid 和 exportId 不能同时为 null", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10006": "both backupStorageUuid 和 hostname 都被设置,但它们不是同一主机", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10005": "找到多个主机名为 %s 的 imageStore,请使用 backupStorageUuid 代替", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10004": "无法找到主机名为:%s 的 imageStore", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10003": "both backupStorageUuid 和 hostname 都为空", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10002": "dataPath 必须以 \u0027/\u0027 开始,实际上得到了 [%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10001": "另一个构建系统[uuid: %s, 名称: %s]在本机[%s]使用了地址[%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10000": "构建应用[%s]正在导出或被导出,请先删除它", + "ORG_ZSTACK_CAS_10000": "缺失cas驱动的属性", + "ORG_ZSTACK_CAS_10002": "错误的虚拟ID[name:%s], 不存在或密码错误", + "ORG_ZSTACK_CONTAINER_10020": "删除网络策略失败,因为 %s", + "ORG_ZSTACK_CAS_10001": "不支持的 cas 驱动: %s", + "ORG_ZSTACK_CONTAINER_10022": "集群ID在创建网络策略时为空", + "ORG_ZSTACK_CAS_10003": "在CAS中不存在此类别[%s]", + "ORG_ZSTACK_CONTAINER_10024": "失败创建网络策略,因为 %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10009": "在构建导出历史中不存在该 exportId", + "ORG_ZSTACK_CONTAINER_10023": "无法通过集群ID: %s 获取 ApiClient", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10008": "buildAppUuid 和 buildSystemUuid 不能同时为 null", + "ORG_ZSTACK_CONTAINER_10015": "失败删除部署,因为 %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10079": "集群[uuid:%s]的hypervisorType不是%s", + "ORG_ZSTACK_CONTAINER_10017": "无法找到命名空间为[%s]下的pod[name:%s]", + "ORG_ZSTACK_CONTAINER_10016": "删除部署失败,但没有错误信息", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10075": "获取访问路径[iscsiPath: %s]的网关IP地址失败,块磁盘卷%s的原因是%s", + "ORG_ZSTACK_CONTAINER_10018": "失败将标签添加到Pod,因为%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10076": "失败通过网关[uuid:%s]从物理机2实例[uuid:%s]解绑磁盘[uuid:%s],因为%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10028": "在 TF 控制器上向 l3 网络 [名称:%s] 添加 DNS 失败,原因:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10077": "失败在网关[uuid:%s]销毁裸金属实例[uuid:%s]的卷[uuid:%s]时,因为%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10078": "所有主存储[uuid:%s]的ceph监视器均不在连接状态", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10072": "裸金属服务器实例[uuid:%s]未连接,无法为其附加磁盘", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10073": "无法获取外部主存储的卷LUN ID", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10025": "从 l3 网络 [名称:%s] 在 tf 控制器上删除主机路由失败,原因:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10074": "未能在网关[uuid:%s]中为物理机2实例[uuid:%s]获取卷[uuid:%s]的lunid,因为%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10022": "在 tf 控制器上向 l3 网络 [名称:%s] 添加主机路由器失败,原因:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10070": "失败通过网关[uuid:%s]将卷[uuid:%s]附加到裸金属实例[uuid:%s],因为%s", + "ORG_ZSTACK_FLOWMETER_10021": "%s 必须是数字", + "ORG_ZSTACK_LOG4J2_10001": "未知的 log4j2 追加器类型 %s", + "ORG_ZSTACK_LOG4J2_10000": "没有找到适用于 log4j2 追加器类型的工厂:%s.", + "ORG_ZSTACK_CONTAINER_10011": "未找到对应 uuid[%s] 的主机", + "ORG_ZSTACK_CONTAINER_10013": "无法找到容器管理端点VO[uuid:%s]", + "ORG_ZSTACK_CONTAINER_10012": "没有为[%s]供应商找到提供者", + "ORG_ZSTACK_CONTAINER_10004": "主机[%s]不属于终端[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10068": "失败通过网关[uuid:%s]为物理机2实例[uuid:%s]准备卷[uuid:%s],因为%s", + "ORG_ZSTACK_CONTAINER_10005": "未在终端节点[%s]找到集群", + "ORG_ZSTACK_CONTAINER_10008": "失败于为集群[%s]列出节点:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10064": "失败将网卡[uuid:%s]绑定到裸金属实例[uuid:%s]通过网关[uuid:%s],因为%s", + "ORG_ZSTACK_CONTAINER_10007": "区[%s]与终端点[%s]不相同", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10065": "裸金属2实例[uuid:%s]未连接,无法从中detach网卡", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10066": "失败通过网关[uuid:%s]从裸金属服务器实例[uuid:%s]分离网络接口[nic uuid:%s],因为%s", + "ORG_ZSTACK_CONTAINER_10009": "集群[%s]已在终端点[%s]中存在,但区域不同[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10060": "请确保所有裸金属2网关在分配网络[uuid:%s]上均已连接。", + "ORG_ZSTACK_CONFIGURATION_10011": "不支持的主要存储分配策略[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10061": "vmInstanceUuids 是空的", + "ORG_ZSTACK_CONFIGURATION_10010": "不支持的主机分配策略[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10062": "裸金属2网关[UUID:%s, 状态:%s]未连接", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10063": "裸金属2实例[uuid:%s]未连接,无法将其附加网卡", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10031": "从 to L3 网络[name:%s] 在 tf 控制器上删除 DNS 失败:%s", + "ORG_ZSTACK_STORAGE_BACKUP_10119": "installPath 和 bsUrl 都是必需的", + "ORG_ZSTACK_STORAGE_BACKUP_10118": "不允许从备份覆盖数据库", + "ORG_ZSTACK_STORAGE_BACKUP_10117": "数据库备份[uuid%s]已从备份存储[uuid:%s]导出", + "ORG_ZSTACK_STORAGE_BACKUP_10116": "数据库备份[uuid%s]尚未从备份存储[uuid:%s]导出", + "ORG_ZSTACK_STORAGE_BACKUP_10115": "当前备份存储状态[%s]不允许执行消息[%s],允许的状态为%s", + "ORG_ZSTACK_STORAGE_BACKUP_10114": "无法通过SSH密钥连接Peer节点,请检查连接", + "ORG_ZSTACK_STORAGE_BACKUP_10113": "带宽必须是正数", + "ORG_ZSTACK_STORAGE_BACKUP_10112": "缺少作业参数中的\u0027remoteRetentionValue\u0027", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10039": "VM[uuid:%s] 没有停止且不在特定主机上运行。", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10007": "无法从内置安全管理员中移除内置安全管理员角色。", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10038": "卷[uuid:%s]已被挂载到一些未停止且未在特定主机上运行的VM(s)[uuid:%s]。", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10008": "无法移除内置系统管理员角色从内置系统管理员中", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10009": "无法删除内置审计管理员。", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10003": "初始用户的名称不能被更新", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10034": "无法在主机 %s 上找到卷 %s 的复制", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10004": "%s 是保留名称,请使用其他名称", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10037": "主存储 UUID 不能为 null。", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10036": "无效的资源Uuid %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10006": "无法移除内置审计管理员角色从内置审计管理员权限。", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10042": "迷你存储[uuid:%s]在从zbox恢复位之前必须为空,请清理它。", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10001": "没有找到 fluentbit 输出类型:%s 的工厂。", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10010": "无法删除内置安全管理员。", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10041": "没有支持宿主机[%s]和备份存储类型[%s]的LocalStorageBackupStorageMediator", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10011": "无法删除内置系统管理员", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10003": "主机不能为 null", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10012": "确认您想要添加的角色具有相同的身份", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10002": "未知 fluentbit 输出类型 %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10013": "无法添加角色:%s 与身份:%s 到虚拟ID[uuid:%s]", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10005": "端口不能为 null", + "ORG_ZSTACK_APPCENTER_UTILS_10000": "无法找到原始模板 JSON 文件:%s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10004": "日志服务器 [地址: %s]不可用", + "ORG_ZSTACK_APPCENTER_UTILS_10001": "无法创建 JSON 模板", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10040": "失败执行 %s 操作,因为主机[uuid:%s]未启用且不在连接状态。", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10007": "新的配置有错误,导致服务异常。请再次检查配置参数,详情:%s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10006": "日志服务器的创建失败,可能是因为传入的新配置参数不正确导致 Fluent Bit 服务处于非活动状态。请双检查配置以确保其准确性", + "ORG_ZSTACK_STORAGE_BACKUP_10111": "缺少作业参数中的\u0027remoteRetentionType\u0027", + "ORG_ZSTACK_STORAGE_BACKUP_10110": "缺少作业参数中的\u0027retentionValue\u0027", + "ORG_ZSTACK_STORAGE_BACKUP_10129": "没有找到带有根卷UUID: %s 的VM", + "ORG_ZSTACK_STORAGE_BACKUP_10124": "在卷[uuid:%s]中未找到对应的VM", + "ORG_ZSTACK_STORAGE_BACKUP_10123": "操作不支持在共享卷上进行", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10028": "没有备份存储可以获取卷[uuid:%s]的镜像[uuid:%s]", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10005": "不能找到 JoinType", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10029": "图像[uuid: %s]没有与备份存储[uuid: %s]相关的镜像引用", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10000": "从 [%s] 的输出为空", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10001": "调用操作[%s]失败,原因: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10023": "期望在主机[%s]上执行操作,但只有主机%s已连接且启用", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10002": "操作: %s, 对角色身份: %s 不受支持", + "ORG_ZSTACK_STORAGE_BACKUP_10120": "数据库备份[uuid:%s]未启用且未就绪", + "ORG_ZSTACK_STORAGE_SNAPSHOT_REFERENCE_10000": "卷[uuid: %s]已被其他卷[%s]引用,在扁平化它们及其后代之前,无法更改安装路径", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10017": "必需的集群 %s 未绑定到主要存储 %s 以创建卷 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10016": "卷[uuid:%s]的复制网络状态运行到独立模式,但所有主机都是连接状态,请先恢复它。", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10018": "无法在所需的集群 %s 中找到可用的主机用于创建卷 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10013": "主机[uuid: %s]的迷你主存储[uuid: %s]没有足够的容量[current: %s 字节, needed: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10017": "裸金属2网关[uuid:%s]与集群[uuid:%s]不在同一个可用区中", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10012": "无法为主机[uuid: %s]预留足够的空间用于主存储[uuid: %s],物理容量不足", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10018": "无法更改依赖于它的裸金属2网关[UUID:%s]的集群,在其上有运行中的实例", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10015": "卷[uuid:%s]的复制正在同步数据,请等待直到同步完成。", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10019": "集群[%s]不是baremetal2类型", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10014": "无法找到可用的主机来调整卷[uuid: %s]在迷你存储[uuid: %s]上的大小", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10013": "集群[uuid:%s] 不存在", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10014": "集群[uuid:%s] 不是裸金属2集群", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10022": "无法在主机 %s 上分配存储同步端口:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10015": "网关[uuid:%s]不存在", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10021": "无法找到可用主机来执行命令以执行主要存储[uuid: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10016": "裸金属2网关[uuid:%s]已存在于集群[uuid:%s]中", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10010": "裸金属2网关[uuid:%s]只能绑定一个集群", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10011": "裸金属2网关[uuid:%s]未连接至集群[uuid:%s], 无需断开连接", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10012": "裸金属2网关[uuid:%s]现在只连接了一个集群,请勿断开连接", + "ORG_ZSTACK_STORAGE_BACKUP_10108": "缺少 \u0027retentionType\u0027 和 \u0027retentionValue\u0027 在作业参数中", + "ORG_ZSTACK_STORAGE_BACKUP_10107": "意外的备份存储 UUID: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10106": "作业参数 \u0027backupStorageUuids\u0027 为空", + "ORG_ZSTACK_STORAGE_BACKUP_10105": "缺少作业参数 \u0027backupStorageUuids\u0027", + "ORG_ZSTACK_STORAGE_BACKUP_10104": "缺少作业参数", + "ORG_ZSTACK_STORAGE_BACKUP_10103": "意外的任务状态: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10102": "同步任务失败。", + "ORG_ZSTACK_STORAGE_BACKUP_10101": "数据库备份[uuid:%s]在备份存储[uuid:%s]中未找到", + "ORG_ZSTACK_LOGIN_PLUGIN_10002": "缺少 LoginUserInfo 当使用插件登录时", + "ORG_ZSTACK_LOGIN_PLUGIN_10001": "未找到名为 %s 的登录插件", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10005": "迷你存储[uuid:%s, name:%s]无法在关联的集群中找到可用主机以实例化卷", + "ORG_ZSTACK_LOGIN_PLUGIN_10000": "缺少登录插件名称", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10007": "无法确定哪个主机", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10002": "主机[uuid:%s]未连接", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10014": "无法为项目[uuid:%s]添加管理员权限[uuids:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10006": "存在一个裸金属2网关具有管理IP %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10001": "仍然存在缓存卷在ps[uuid:%s]上,无法更新缓存卷url", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10015": "该操作不允许由虚拟-ID[uuid:%s]的白名单所允许", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10007": "主机具有管理IP %s", + "ORG_ZSTACK_KVM_10110": "主机[ip:%s]已被接管,因为数据库中存在标识[HostUuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10004": "资源类型 [%s] 在 APIRecoverResourceSplitBrainMsg 中无效。", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10016": "该操作被虚拟ID的黑名单[uuid:%s]拒绝", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10008": "无法将裸金属2网关[uuid:%s]附加到非裸金属2集群[uuid:%s]", + "ORG_ZSTACK_KVM_10111": "无法获取主机CPU架构,请检查用户名/密码是否正确;%s", + "ORG_ZSTACK_STORAGE_BACKUP_10109": "缺少 \u0027retentionType\u0027 在作业参数中", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10009": "裸金属2网关[uuid:%s]已连接至集群[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10002": "已经在使用管理IP %s的裸金属PXE服务器,请勿用于创建裸金属2网关", + "ORG_ZSTACK_KVM_10103": "无法连接到 KVM[ip:%s, 用户名:%s, SSH端口:%d] 执行 DNS 检查,请检查用户名/密码是否正确;%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10004": "管理IP[%s]既不是有效的IPv4地址也不是主机名", + "ORG_ZSTACK_KVM_10104": "在 %s 中无法ping通所有DNS/IP;请检查 /etc/resolv.conf 确保您的主机能够访问公共互联网", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10010": "未找到连接的主机,迷你存储失败", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10005": "无法在非裸金属2集群[uuid:%s]中添加裸金属2网关", + "ORG_ZSTACK_KVM_10105": "无法连接到 KVM[ip:%s, 用户名:%s, SSH端口:%d]以检查管理节点的连通性,请检查用户名/密码是否正确;%s", + "ORG_ZSTACK_VPC_HA_VPCHAGC_10000": "VR[uuid: %s] 没有运行", + "ORG_ZSTACK_KVM_10106": "KVM 主机[ip:%s]无法访问管理节点的回调URL。看来KVM主机无法到达管理IP[%s]。%s %s", + "ORG_ZSTACK_VPC_HA_VPCHAGC_10001": "VR[uuid: %s] 未连接", + "ORG_ZSTACK_KVM_10107": "无法检查是否主机被接管,因为 %s", + "ORG_ZSTACK_KVM_10108": "无法获取标志的时间戳,因为 %s", + "ORG_ZSTACK_KVM_10109": "主机[ip:%s]已被接管,因为接管标志[HostUuid:%s]已经存在,并且utime[%d]尚未超过主机心跳间隔[%d]", + "ORG_ZSTACK_STORAGE_BACKUP_10100": "其中一个备份存储[uuids: %s, %s]处于状态%s,无法执行同步操作", + "ORG_ZSTACK_AUTOSCALING_GROUP_10009": "实例配置[uuid:%s]已禁用,无法从中创建虚拟机", + "ORG_ZSTACK_AUTOSCALING_GROUP_10008": "一个资源无法被找到,详情:资源[uuid:%s, 类型:InstanceOfferingVO]未找到", + "ORG_ZSTACK_AUTOSCALING_GROUP_10007": "一个资源无法被找到,详情:资源[uuid:%s, 类型:AutoScalingVmTemplateVO]未找到", + "ORG_ZSTACK_AUTOSCALING_GROUP_10006": "自动扩展组[%s]将新建的VM添加到安全组失败,错误信息为%s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10005": "添加虚拟机网络接口到安全组失败,无法找到安全组[uuid\u003d%s]。", + "ORG_ZSTACK_AUTOSCALING_GROUP_10004": "自动扩展组[%s]将新建的虚拟机添加到负载均衡器失败完全,错误信息是%s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10003": "添加虚拟机网络接口到负载均衡失败,无法找到具有以下UUID的负载均衡[uuids\u003d%s]。", + "ORG_ZSTACK_AUTOSCALING_GROUP_10002": "自动扩展组[%s]创建实例完全失败,错误信息是%s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10000": "在同一伸缩组中,同一时间只能执行一个伸缩活动。", + "ORG_ZSTACK_KVM_10120": "主机[uuid:%s]的%s变更,旧值:%s,新值:%s", + "ORG_ZSTACK_KVM_10121": "主机[uuid:%s]变为关闭状态,发送通知", + "ORG_ZSTACK_KVM_10112": "主机CPU架构[%s]与集群[%s]不匹配", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10000": "无效路径字符串 %s", + "ORG_ZSTACK_KVM_10115": "主机 [uuid:%s] 无法添加到集群 [uuid:%s],因为 QEMU/Libvirt 版本不匹配", + "ORG_ZSTACK_KVM_10117": "主机 [uuid:%s] 无法添加到集群 [uuid:%s],因为 CPU 模型名称不匹配", + "ORG_ZSTACK_KVM_10119": "无法在 /proc/cpuinfo 中找到 \u0027vmx\u0027 或 \u0027svm\u0027,请确保已在其 BIOS 设置中启用虚拟化功能", + "ORG_ZSTACK_AUTOSCALING_GROUP_10019": "一个资源无法被找到,详情:资源[uuid:%s, 类型:L3NetworkVO]未找到", + "ORG_ZSTACK_AUTOSCALING_GROUP_10018": "磁盘配置项[uuids:%s]已禁用,无法从中创建虚拟机", + "ORG_ZSTACK_AUTOSCALING_GROUP_10017": "一个资源无法被找到,详情:资源[uuid:%s, 类型:DiskOfferingVO]未找到", + "ORG_ZSTACK_AUTOSCALING_GROUP_10016": "[image[uuid:%s] 是系统镜像,无法用于创建用户VM]", + "ORG_ZSTACK_AUTOSCALING_GROUP_10015": "rootDiskOfferingUuid 不能为 null 当 image mediaType 是 ISO 时", + "ORG_ZSTACK_AUTOSCALING_GROUP_10014": "图像[uuid:%s]的mediaType为:%s,仅限使用RootVolumeTemplate和ISO创建VM", + "ORG_ZSTACK_AUTOSCALING_GROUP_10013": "图像[uuid:%s]尚未就绪,无法从中创建虚机", + "ORG_ZSTACK_AUTOSCALING_GROUP_10012": "图像[uuid:%s]已禁用,无法从中创建虚机", + "ORG_ZSTACK_AUTOSCALING_GROUP_10011": "一个资源无法被找到,详情:资源[uuid:%s, 类型:ImageVO]未找到", + "ORG_ZSTACK_AUTOSCALING_GROUP_10010": "实例配置[uuid:%s, 类型:%s] 不是 UserVm 类型,无法从中创建虚拟机", + "ORG_ZSTACK_KVM_10130": "失败将磁盘附加到主机,因为:%s", + "ORG_ZSTACK_KVM_10131": "从主机分离磁盘失败,因为:%s", + "ORG_ZSTACK_KVM_10132": "vm[%s] fstrim 失败,原因:%s", + "ORG_ZSTACK_KVM_10123": "主机[%s]在%d秒内未关闭", + "ORG_ZSTACK_KVM_10125": "失败在主机[uuid:%s]上检查文件%s", + "ORG_ZSTACK_KVM_10126": "主机处于预维护状态,无法更新操作系统", + "ORG_ZSTACK_KVM_10127": "主机不在连接状态,无法更新操作系统", + "ORG_ZSTACK_COMPUTE_BONDING_10022": "需要其中一个 slaveUuids 或 slaveNames", + "ORG_ZSTACK_COMPUTE_BONDING_10021": "在主机[uuid:%s]上不存在接口[%s]", + "ORG_ZSTACK_VMWARE_10069": "实例UUID [%s] 未找到", + "ORG_ZSTACK_COMPUTE_BONDING_10020": "在从属名称中不存在该接口于主机上", + "ORG_ZSTACK_VMWARE_10067": "vm [%s] 未找到", + "ORG_ZSTACK_COMPUTE_BONDING_10026": "无法删除对应的管理网络绑定。", + "ORG_ZSTACK_VMWARE_10064": "VM未找到: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10029": "需要跳过自动扩展组活动", + "ORG_ZSTACK_COMPUTE_BONDING_10025": "无效的绑定类型[%s]", + "ORG_ZSTACK_VMWARE_10065": "失败关闭来宾:%s, %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10028": "无法找到删除的目标实例列表", + "ORG_ZSTACK_VMWARE_10062": "失败恢复虚拟机,任务状态: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10027": "实例数量超过限制", + "ORG_ZSTACK_COMPUTE_BONDING_10023": "无法将 SR-IOV 接口 [%s] 添加到 Bonding,因为选择了多个 SR-IOV 设备", + "ORG_ZSTACK_VMWARE_10063": "失败恢复虚拟机 [%s]:%s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10026": "自动扩展组[%s]销毁实例[%s]完全失败,错误信息为%s", + "ORG_ZSTACK_VMWARE_10060": "失败暂停虚拟机 [%s]: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10025": "自动扩展组[%s]未绑定任何虚拟机模板", + "ORG_ZSTACK_COMPUTE_BONDING_10029": "无法向bond[%s]添加新的接口,因为其中已包含一个启用了SR-IOV的接口", + "ORG_ZSTACK_AUTOSCALING_GROUP_10024": "自动扩展组[%s]状态错误,预期:%s状态", + "ORG_ZSTACK_COMPUTE_BONDING_10028": "不能在bond[%s]中重复绑定接口。", + "ORG_ZSTACK_AUTOSCALING_GROUP_10023": "默认L3网络UUID[uuid:%s]不在l3NetworkUuids %s 中", + "ORG_ZSTACK_SNS_PLATFORM_DINGTALK_10000": "失败向钉钉发送消息。状态: %s, 内容: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10022": "在 l3NetworkUuids 中指定的三层网络超过一个,但 defaultL3NetworkUuid 为空", + "ORG_ZSTACK_KVM_10140": "失败在KVM宿主机[uuid:%s]上为l2Network[uuid:%s, type:%s, vlan:%s]创建桥接[%s],因为%s", + "ORG_ZSTACK_COMPUTE_BONDING_10027": "无法删除绑定有VTEP IP配置的聚合网口。", + "ORG_ZSTACK_KVM_10141": "失败在KVM宿主机[uuid:%s]检查桥接[%s]对于l2VlanNetwork[uuid:%s, name:%s]时,%s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10021": "l3Network[uuid:%s] 是系统网络,无法在其上创建用户VM", + "ORG_ZSTACK_AUTOSCALING_GROUP_10020": "l3网络[uuid:%s] 已禁用,无法在其上创建虚机", + "ORG_ZSTACK_KVM_10143": "失败删除桥接[%s]对于l2网络[uuid:%s, 类型:%s, vlan:%s]在kvm主机[uuid:%s]上,因为%s", + "ORG_ZSTACK_KVM_10144": "失败启动VM,因为无法在vm.cpuMode为none时禁用vm.cpu.hypervisor.feature", + "ORG_ZSTACK_KVM_10134": "XML挂钩[%s]已在虚拟机%s上设置,请先解除绑定再删除", + "ORG_ZSTACK_KVM_10136": "XML 类型的系统挂钩不允许进行操作", + "ORG_ZSTACK_KVM_10137": "XML挂钩名称[%s]已存在", + "ORG_ZSTACK_KVM_10138": "有一个 KVM 主机具有管理 IP[%s]", + "ORG_ZSTACK_KVM_10139": "无法在 %s 上创建 VLAN 设备,因为它太长", + "ORG_ZSTACK_VMWARE_10059": "失败挂起虚拟机,任务状态: %s", + "ORG_ZSTACK_COMPUTE_BONDING_10033": "L2网络 [uuid:%s] 未找到", + "ORG_ZSTACK_BILLING_10008": "起始日期必须晚于结束日期", + "ORG_ZSTACK_COMPUTE_BONDING_10032": "不能在bond[%s]中重复分离接口。", + "ORG_ZSTACK_COMPUTE_BONDING_10031": "无法分离在链路[%s]中的接口[%s],该链路已被绑定。", + "ORG_ZSTACK_COMPUTE_BONDING_10030": "无法将 SR-IOV 接口 [%s] 添加到 Bonding 中,因为仅允许 bond 内的一个接口启用 SR-IOV", + "ORG_ZSTACK_BILLING_10005": "计费已禁用", + "ORG_ZSTACK_COMPUTE_BONDING_10037": "无法将 L2 网络附加到集群[uuid:%s]。主机[uuid:%s]上的接口[uuid:%s, name:%s]具有服务类型关联,但不包括 TenantNetwork 服务类型", + "ORG_ZSTACK_BILLING_10004": "不支持的计费资源类型 [%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10036": "无法将 L2 网络附加到集群[uuid:%s]。主机[uuid:%s]上绑定接口[uuid:%s, name:%s]具有绑定服务类型关联,但不包括租户网络服务类型", + "ORG_ZSTACK_BILLING_10003": "请设置正确的 priceUserConfig,例如:priceUserConfig:{\\nvolume:{\\npriceKeyName:\"价格键名称\"}}", + "ORG_ZSTACK_COMPUTE_BONDING_10035": "无法将 L2 网络附加到集群 [uuid:%s]:一个或多个主机上的物理接口 [%s] 被绑定使用。冲突的主机: [%s]", + "ORG_ZSTACK_VMWARE_10051": "vmUuid [%s] 在 ESX 主机 [%s] 中未找到", + "ORG_ZSTACK_BILLING_10002": "请设置正确的 priceUserConfig,例如:priceUserConfig:{\\nrootVolume:{\\npriceKeyName:\"价格键名称\"}}", + "ORG_ZSTACK_COMPUTE_BONDING_10034": "L2网络[uuid:%s]存在空的物理接口", + "ORG_ZSTACK_BILLING_10001": "dateInLong 小于 %s", + "ORG_ZSTACK_BILLING_10000": "价格键名称为 null", + "ORG_ZSTACK_VMWARE_10050": "同步与VCenter[uuid:%s],请稍后重试。", + "ORG_ZSTACK_KVM_10150": "无法从消息 %s 获取 vmUuid", + "ORG_ZSTACK_KVM_10151": "无法在主机[uuid:%s, ip:%s]上执行vm同步因为%s", + "ORG_ZSTACK_COMPUTE_BONDING_10038": "在主机[uuid:%s]上添加Linux绑定失败:%s", + "ORG_ZSTACK_KVM_10152": "The vm[%s]状态已在长时间内处于关闭状态,请检查vm是否正常", + "ORG_ZSTACK_AUTOSCALING_GROUP_10032": "不支持的 RemovalPolicy[%s] 类型", + "ORG_ZSTACK_V2V_VMWARE_10015": "在主机 %s 的 CIDR %s 中未找到可用的 IP 地址,请尝试重新连接主机以刷新 IP 地址", + "ORG_ZSTACK_KVM_10154": "失败在KVM宿主机[uuid:%s]更新桥接[%s]对于l2Network[uuid:%s, name:%s]时发生错误,%s", + "ORG_ZSTACK_V2V_VMWARE_10016": "已经有长期任务[uuid:%s]正在将虚拟机从%s转换中", + "ORG_ZSTACK_AUTOSCALING_GROUP_10030": "删除自动扩展规则[%s]的触发器失败,错误是%s", + "ORG_ZSTACK_V2V_VMWARE_10017": "更新转换主机依赖关系失败", + "ORG_ZSTACK_KVM_10146": "失败将安全组规则应用到KVM宿主机[uuid:%s],因为%s", + "ORG_ZSTACK_KVM_10147": "在 KVM 主机[uuid:%s]上检查安全组的默认规则时失败,因为%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10101": "无法指定HTTP重定向时分配重定向端口或状态码", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10009": "未能检测到心跳,代码:%s,详情:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10104": "l4[%s] 负载均衡监听器[%s] 不支持修改会话持久性状态", + "ORG_ZSTACK_IAM2SCRIPT_10010": "指定的脚本执行器不支持。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10105": "无法同时支持 HTTP 重定向和 HTTPS 以及会话保持", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10102": "在指定HTTP重定向时,不支持除HTTP以外的其他协议", + "ORG_ZSTACK_VMWARE_10048": "主机未连接", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10108": "监听器[%s]修改了会话持久性,必须指定负载均衡算法", + "ORG_ZSTACK_V2V_VMWARE_10007": "解析 URL %s 失败", + "ORG_ZSTACK_COMPUTE_BONDING_10044": "在主机[uuid:%s]上将网卡附加到Linux绑定时失败: %s", + "ORG_ZSTACK_VMWARE_10046": "无法分离网卡因为该网卡不支持在 vCenter 中热插拔", + "ORG_ZSTACK_BILLING_10019": "gpu价格必须绑定到gpu uuid %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10109": "监听器[%s] %s 算法不支持修改会话持久性,除非明确指派iphash", + "ORG_ZSTACK_V2V_VMWARE_10008": "数据中心名称不能包含这些字符 %s", + "ORG_ZSTACK_IAM2SCRIPT_10002": "脚本内容为空。", + "ORG_ZSTACK_BILLING_10018": "GPU价格必须绑定到空的GPU UUID", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10106": "监听器[%s]在HTTP模式为http-tunnel时无法修改会话持久性重写", + "ORG_ZSTACK_V2V_VMWARE_10009": "目标虚拟机名称不能包含这些字符 %s", + "ORG_ZSTACK_IAM2SCRIPT_10001": "解码脚本内容失败。", + "ORG_ZSTACK_COMPUTE_BONDING_10042": "从主机[uuid:%s]移除Linux绑定失败:%s", + "ORG_ZSTACK_VMWARE_10044": "主机CPU/软件不兼容", + "ORG_ZSTACK_BILLING_10017": "价格必须为 0.0 和 999999999.99", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10107": "监听器[%s]将会话持久性更改为iphash模式,必须指定源负载均衡算法", + "ORG_ZSTACK_VMWARE_10045": "检查与虚拟机 %s 的兼容性失败于主机 %s", + "ORG_ZSTACK_BILLING_10016": "最小资源单位是兆字节,不能是字节", + "ORG_ZSTACK_SDNCONTROLLER_10008": "sdn l2网络[uuid:%s]未连接控制器", + "ORG_ZSTACK_IAM2SCRIPT_10007": "IAM2 脚本函数未启用。", + "ORG_ZSTACK_BILLING_10015": "资源名称[%s]无效", + "ORG_ZSTACK_IAM2SCRIPT_10005": "无法读取脚本运行的结果。", + "ORG_ZSTACK_COMPUTE_BONDING_10046": "从主机[uuid:%s]分离Linux绑定的网络接口卡时失败: %s", + "ORG_ZSTACK_VMWARE_10040": "缺少目标主机UUID。", + "ORG_ZSTACK_IAM2SCRIPT_10004": "运行 iam2 脚本失败。", + "ORG_ZSTACK_VMWARE_10041": "目标主机不是 ESX 主机。", + "ORG_ZSTACK_KVM_10161": "意外的VNC端口编号[%d]对于VM [uuid:%s]", + "ORG_ZSTACK_IAM2SCRIPT_10009": "参数的数量超过限制。", + "ORG_ZSTACK_IAM2SCRIPT_10008": "脚本没有任何内容。", + "ORG_ZSTACK_SDNCONTROLLER_10000": "无法创建SDN L2网络,因为API消息中缺少systemTags里的SDN控制器UUID", + "ORG_ZSTACK_V2V_VMWARE_10003": "集群名称不能包含这些字符 %s", + "ORG_ZSTACK_SDNCONTROLLER_10002": "无法找到二层网络[uuid:%s, 虚拟交换机类型:%s]的SDN控制器", + "ORG_ZSTACK_SDNCONTROLLER_10001": "无法创建SDN L2网络,因为API消息中缺少SDN控制器UUID", + "ORG_ZSTACK_V2V_VMWARE_10006": "失败在进行虚拟机实例 %s 的迁移前停止该实例", + "ORG_ZSTACK_KVM_10157": "回复[%s]不是KVMHostAsyncHttpCallReply", + "ORG_ZSTACK_KVM_10158": "回复[%s]返回空响应", + "ORG_ZSTACK_KVM_10159": "%s 操作失败: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10040": "EcsInstance 必须处于运行中或已停止状态才能删除弹性公网IP", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10111": "监听器[%s]不支持修改空闲超时时间和cookie名称,必须指定会话持久性", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10112": "监听器[%s]在会话持久性未设置为插入时不支持修改空闲超时时间", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10110": "监听器[%s] %s 算法不支持修改会话持久性,除非明确禁用", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10115": "无效会话空闲超时[%s],它必须是一个在[%s~%s]范围内的数字", + "ORG_ZSTACK_COMPUTE_BONDING_10040": "在主机[uuid:%s]上更新Linux绑定失败: %s", + "ORG_ZSTACK_VMWARE_10039": "缺少消息中的主机UUID", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10116": "HTTP 健康检查协议必须指定其健康的检查参数 healthCheckURI", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10113": "监听器[%s]在会话持久性不为重写时不允许修改cookie名称", + "ORG_ZSTACK_VMWARE_10037": "没有找到 dvSwitch 或合格的 vSwitch", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10114": "监听器[%s]不支持在不修改cookie名称的情况下修改会话重写", + "ORG_ZSTACK_VMWARE_10038": "数据存储 %s 在 vCenter %s 中未找到", + "ORG_ZSTACK_BILLING_10009": "资源类型和资源UUID不能同时为空", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10119": "无效的健康检查目标[%s],格式应为targetCheckProtocol:port,例如:tcp:default", + "ORG_ZSTACK_SDNCONTROLLER_10015": "由于 SDN 控制器类型:%s 不在支持列表:%s 中", + "ORG_ZSTACK_SDNCONTROLLER_10014": "无法添加安全组规则,因为远程安全组 SDN 控制器 UUID[:%s] 与安全组控制器 UUID[:%s] 不同", + "ORG_ZSTACK_VMWARE_10036": "未找到集群计算资源", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10117": "HTTP 健康检查协议期望的状态码 [%s] 无效", + "ORG_ZSTACK_SDNCONTROLLER_10017": "由于 SDN 控制器已添加,因此无法添加该控制器 [IP:%s]", + "ORG_ZSTACK_VMWARE_10033": "SSL 握手与 vCenter [%s] 失败,因为使用了不安全的 TLS 1.0。如需手动在 JDK 配置中启用 TLS 1.0,请相应设置。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10118": "监听器不支持选择安全策略,其使用的协议为 [%s]", + "ORG_ZSTACK_SDNCONTROLLER_10016": "由于 IP[%s] 不是单播地址,因此无法添加 SDN 控制器", + "ORG_ZSTACK_VMWARE_10034": "SSL握手与vCenter [%s]失败,请检查端口编号[%d]。", + "ORG_ZSTACK_BILLING_10027": "计费已启用,此操作仅允许在禁用状态下执行", + "ORG_ZSTACK_SDNCONTROLLER_10019": "无法将主机[uuid:%s]添加到SDN控制器[uuid:%s],因为未指定子网掩码", + "ORG_ZSTACK_VMWARE_10031": "登录 vCenter [%s] 失败,用户 [%s] 请检查您的网络连接和凭证。", + "ORG_ZSTACK_BILLING_10026": "endDateInLong 不能早于 dateInLong", + "ORG_ZSTACK_SDNCONTROLLER_10018": "无法将主机[uuid:%s]添加到SDN控制器[uuid:%s],因为该主机已附属于SDN控制器", + "ORG_ZSTACK_VMWARE_10032": "解析响应失败来自 vCenter [%s],请检查端口编号[%d]。", + "ORG_ZSTACK_BILLING_10025": "endDateInLong 已设置,不允许修改", + "ORG_ZSTACK_BILLING_10024": "endDateInLong 和 setEndDateInLongBaseOnCurrentTime 不允许同时设置", + "ORG_ZSTACK_VMWARE_10030": "连接 %s 失败: %s", + "ORG_ZSTACK_BILLING_10023": "endDateInLong 不允许为负值", + "ORG_ZSTACK_BILLING_10022": "accountUuid/tableUuid 允许设置其中的一个", + "ORG_ZSTACK_BILLING_10021": "此 priceTable[uuid\u003d%s] 不允许删除", + "ORG_ZSTACK_BILLING_10020": "该账号[uuid\u003d%s]已绑定价格表", + "ORG_ZSTACK_LONGJOB_10007": "无法取消已成功完成的长任务", + "ORG_ZSTACK_SDNCONTROLLER_10011": "拉取租户操作仅支持 H3C VCFC V2 控制器", + "ORG_ZSTACK_LONGJOB_10008": "无法取消失败的长任务", + "ORG_ZSTACK_LONGJOB_10009": "删除长期任务仅当其成功、取消或失败时", + "ORG_ZSTACK_SDNCONTROLLER_10013": "无法将 vmnic 添加到安全组,因为它们具有不同的 SDN 控制器[nic 控制器 UUID:%s, 安全组控制器 UUID:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10012": "拉取租户数据失败: %s", + "ORG_ZSTACK_LONGJOB_10010": "仅在长期任务成功、取消或失败时重新运行", + "ORG_ZSTACK_LONGJOB_10011": "只能恢复处于暂停状态的长任务", + "ORG_ZSTACK_LONGJOB_10012": "%s 没有对应的长任务", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10122": "云无法更改负载均衡监听器,因为使用 [%s] 协议的监听器不支持选择 HTTP 版本:[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10123": "云无法更改负载均衡监听器,因为仅支持 HTTP 版本:[%s] 的 HTTPS 协议的监听器不允许更改", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10120": "监听器的协议 [%s] 不支持此健康检查:[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10121": "HTTP 健康检查协议必须指定其健康检查参数,包括 healthCheckMethod 和 healthCheckURI", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10126": "云中无法更改负载均衡监听器,因为使用 [%s] 协议的监听器不支持压缩内容", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10127": "云中未能更改负载均衡监听器,因为仅支持压缩算法[%s]", + "ORG_ZSTACK_VMWARE_10029": "登录失败,请检查您的登录参数。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10124": "云无法更改负载均衡监听器,因为仅支持 TCP 代理协议的 TCP 协议监听器不允许进行此操作", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10125": "云中无法更改负载均衡监听器,因为仅支持 TCP 代理协议 %s", + "ORG_ZSTACK_VMWARE_10027": "VCenter[uuid:%s] 未找到:", + "ORG_ZSTACK_TAG_10004": "没有系统标签与[%s]匹配,资源类型为[%s]", + "ORG_ZSTACK_SDNCONTROLLER_10026": "拉取租户操作不支持 SDN 控制器[uuid:%s, 厂商类型:%s, 厂商版本:%s]。仅 H3C VCFC V2 控制器支持此操作", + "ORG_ZSTACK_LOG_10007": "未知日志配置类型 %s", + "ORG_ZSTACK_SDNCONTROLLER_10025": "SDN控制器[uuid:%s]未找到", + "ORG_ZSTACK_TAG_10005": "验证资源类型[%s]的系统标签[%s]失败", + "ORG_ZSTACK_LOG_10006": "未知日志服务器配置类型 %s", + "ORG_ZSTACK_SDNCONTROLLER_10028": "无法更改 SDN 控制器,因为 VLAN 范围[%s]格式不正确", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10128": "无效的 IP 版本[%s],它必须是%s或%s", + "ORG_ZSTACK_LOG_10005": "该账户[uuid:%s]未被授权添加更多的日志服务器。只有管理员账号才有此权限。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10129": "无法删除默认服务器组[uuid:%s]", + "ORG_ZSTACK_LOG_10004": "访问被拒:账号[uuid:%s]无权获取管理节点日志。仅管理员账号拥有此权限。", + "ORG_ZSTACK_TAG_10008": "标签[%s]仅限管理员使用", + "ORG_ZSTACK_LOG_10003": "账号[uuid:%s]无权操作日志服务器[uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10029": "无法更改 SDN 控制器,因为 VLAN 范围[%s]与其他 VLAN 范围重叠", + "ORG_ZSTACK_LOG_10002": "没有找到类型为:%s 的工厂类", + "ORG_ZSTACK_TAG_10006": "没有匹配的系统标签 %s", + "ORG_ZSTACK_SDNCONTROLLER_10020": "无法将主机[uuid:%s]添加到SDN控制器[uuid:%s],因为vtepip被主机[uuid:%s]使用", + "ORG_ZSTACK_SDNCONTROLLER_10022": "无法将主机[uuid:%s]的SDN控制器[uuid:%s]更改为指定的主机,因为该主机尚未被添加到SDN控制器中", + "ORG_ZSTACK_TAG_10000": "重复标签[tag:%s, 类型:%s, 资源类型:%s, 资源UUID:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10021": "无法从SDN控制器[uuid:%s]移除主机[uuid:%s],因为该主机尚未被添加到SDN控制器", + "ORG_ZSTACK_SDNCONTROLLER_10024": "无法将L3网络附加到VM,因为SDN控制器[uuid:%s]中的某些租户已被删除。请先运行租户同步以更新租户状态。", + "ORG_ZSTACK_SDNCONTROLLER_10023": "无法更改 SDN 控制器[uuid:%s]的主机[uuid:%s],因为指定了子网掩码", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10000": "检查批数据完整性失败,不支持的 resourceType: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10002": "添加完整性资源失败,不支持的 resourceType: %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10002": "模板错误:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10134": "无法将后端服务器vmnic添加到serverGroup[uuid:%s],因为vmnic权重[%s]不是一个正确的数字", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10008": "获取镜像缓存[id:%s]失败:GetImageHashValueReply.hashValue为空", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10009": "验证图像缓存[%s]的一致性失败", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10000": "此类模板类型不存在:%s,", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10132": "无法将后端服务器vmnic[uuid:%s]添加到serverGroup[uuid:%s],因为vmnic uuid不存在", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10137": "无法将后端服务器的vmnic添加到serverGroup [uuid:%s],因为ip地址[ipAddress:%s]重复", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10003": "启动数据保护加密类型[%s]错误", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10138": "无法将虚拟机网卡 [uuid:%s] 添加到服务器组 [uuid:%s],因为监听器 [uuid:%s] 已经将该服务器组的网卡绑定", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10004": "快照[uuid:%s]未加密", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10135": "L3网络[uuids:%s]的vm网卡没有启用网络服务[%s]", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10005": "验证卷快照[%s]的一致性失败", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10136": "该虚拟机的网络接口[UUID:%s]已经在负载均衡服务组[UUID:%s]上存在", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10006": "加密错误: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10139": "无法将后端服务器IP添加到服务器组[uuid:%s],因为IP [ipAddress:%s] 重复", + "ORG_ZSTACK_VMWARE_10097": "VCenter[%s]未处于运行状态,当前状态:%s", + "ORG_ZSTACK_VMWARE_10098": "磁盘未找到: %s", + "ORG_ZSTACK_VMWARE_10095": "获取最近任务列表失败,详情: %s", + "ORG_ZSTACK_VMWARE_10096": "VCenter 未找到", + "ORG_ZSTACK_VMWARE_10093": "vcenter 备份存储不支持计算镜像哈希值", + "ORG_ZSTACK_VMWARE_10091": "尚未支持", + "ORG_ZSTACK_TAG_10011": "[tag[uuid:%s] 是内置系统标签,无法删除]", + "ORG_ZSTACK_TAG_10012": "参数:\u0027resourceType\u0027 不匹配 uuid", + "ORG_ZSTACK_VMWARE_10090": "图像未在BS中找到", + "ORG_ZSTACK_TAG_10010": "在标签系统中未找到资源类型[%s]", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10010": "加密图像缓存[id:%s]错误: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10011": "节点类型 %s 完整性文件[path:%s]已存在", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10012": "无效的节点类型[%s]", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10013": "无法添加完整性文件[%s.%s],现在它是一个目录。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10141": "无效的权重[serverIp:%s,weight:%s], 权重不在范围[%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10143": "服务器IP地址 [uuid:%s] 已经在负载均衡服务组 [uuid:%s] 中", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10148": "负载均衡服务器组 [%s] 不存在", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10014": "完整性文件[%s.%s]不存在", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10149": "vmnic 或 IP 为空", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10015": "主机 %s 不存在", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10146": "vmnics 均未在服务器组 [%s] 中", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10000": "外部主要存储[uuid:%s, 名称:%s]返回不健康状态: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10016": "Shell 执行失败,因为 %s", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10001": "查找活动客户端 for 体积[uuid:%s, 安装路径 %s, 客户端:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10147": "服务器IP地址均未在服务器组 [%s] 中", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10017": "添加完整性文件[%s.%s]失败,因为%s", + "ORG_ZSTACK_VMWARE_10088": "vcenter 备份存储不支持取消下载镜像", + "ORG_ZSTACK_VMWARE_10086": "%s 已经存在", + "ORG_ZSTACK_VMWARE_10085": "意外的协议: %s", + "ORG_ZSTACK_VMWARE_10082": "没有数据存储关联到 %s", + "ORG_ZSTACK_VMWARE_10083": "数据存储未找到 for %s", + "ORG_ZSTACK_VMWARE_10080": "VCenter[uuid\u003d%s] 已禁用。您只能对该VCenter执行只读操作。如果您想要对其进行配置更改,需要通过 UpdateVCenterAction {uuid\u003d%s state\u003dEnabled} 更新配置", + "ORG_ZSTACK_VMWARE_10081": "VCenter[uuid\u003d%s] 已禁用。您只能对这些 VCenter 执行只读操作。", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10021": "加密快照[uuid:%s]错误: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10151": "无法将服务器组[uuid:%s]添加到监听器[uuid:%s],因为网卡[uuid:%s]已经添加", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10152": "无法将服务器组[uuid:%s]添加到监听器[uuid:%s],因为服务器IP [%s] 已经被添加", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10150": "无法将服务器组[uuid:%s]添加到监听器[uuid:%s],因为它已经存在", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10155": "无法将服务器组[uuid:%s]添加到监听器[uuid:%s],因为UDP监听器不能将IPv4映射到IPv6后端", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10156": "无法从监听器[uuid:%s]移除服务器组[uuid:%s],因为该监听器启用了HTTP重定向到HTTPS", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10153": "无法将服务器组[uuid:%s]添加到监听器[uuid:%s],因为UDP监听器不能同时具有IPv4和IPv6 VIP", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10154": "无法将 UDP 监听器 [uuid:%s] 中的服务器组[uuid:%s]映射到 IPv4 后端", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10159": "无法找到与服务器组 [uuid:%s] 关联的负载均衡器", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10157": "无法将服务器组[uuid:%s]从监听器[uuid:%s]中移除,因为它尚未添加", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10158": "负载均衡UUID [%s] 不存在", + "ORG_ZSTACK_VMWARE_10078": "不支持", + "ORG_ZSTACK_VMWARE_10076": "失败启动VM,任务状态: %s", + "ORG_ZSTACK_VMWARE_10073": "VM [%s] 在 vCenter 中未找到", + "ORG_ZSTACK_VMWARE_10071": "失败在ESX主机[uuid\u003d%s]中找到vm[uuid\u003d%s]", + "ORG_ZSTACK_VMWARE_10072": "失败更新ESX 虚拟机[uuid\u003d%s] 配置。更多详情请参见日志。", + "ORG_ZSTACK_VMWARE_10070": "图像 [%s] 未找到", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10162": "无法将后端服务器的vmnic更改到serverGroup[uuid:%s],因为vmnic权重[%s]不是一个正确的数字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10163": "无效的负载均衡权重[vimNic:%s], 权重为空", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10160": "无法更新服务器组的后端服务器VMNIC,因为服务器组[uuid:%s]没有VMNIC [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10161": "无效的负载均衡权重[vimNic:%s, weight:%s],权重不在范围[%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10166": "无效的负载均衡权重[serverIp:%s,weight:%s], 权重不在范围[%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10167": "无法将后端服务器IP添加到serverGroup[uuid:%s],因为vmnic权重[%s]不是一个正确的数字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10164": "无法更新服务器组[uuid:%s]的后端服务器vmnic,因为vmnic uuid为空", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10165": "无法更新服务器组的后端服务器IP,因为服务器组[uuid:%s]没有IP地址[ipAddress:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10168": "无效的负载均衡权重[serverIp:%s], 权重为空", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10169": "无法将后端服务器IP添加到服务器组[uuid:%s],因为IP [ipAddress:%s] 无效", + "ORG_ZSTACK_VPC_HA_10010": "存在超过2个VPC路由器连接到HA组[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10119": "因为禁用了实例配置在线修改,虚拟机无法进行在线CPU/内存更新。请先停止虚拟机,然后再次进行CPU/内存更新", + "ORG_ZSTACK_VPC_HA_10011": "HA组管理L3网络和公共L3网络[uuid:%s]与提供的L3网络[uuid:%s]不同", + "ORG_ZSTACK_VPC_HA_10012": "VPC路由L3网络[uuid:%s]与HA组L3网络[uuid:%s]不同,请删除此路由器并重新创建。", + "ORG_ZSTACK_VPC_HA_10013": "VPC路由器已绑定到高可用组[uuid:%s]", + "ORG_ZSTACK_VPC_HA_10014": "vpc 高可用组 [uuid:%s] 不存在", + "ORG_ZSTACK_VPC_HA_10015": "存在超过一个VPC路由器附加到HA组[uuid:%s]", + "ORG_ZSTACK_VPC_HA_10016": "VPC路由器[UUID:%s]无法升级为HA路由器,因为其公网与管理网相同", + "ORG_ZSTACK_VPC_HA_10017": "创建亲和组以供高可用性组 [uuid:%s] 使用失败", + "ORG_ZSTACK_VPC_HA_10018": "实例 %s [uuid: %s] 的 VPC HA 组 %s [uuid: %s] 的 haStatus 从 %s 更改为 %s", + "ORG_ZSTACK_VPC_HA_10019": "实例[uuid: %s, 名称:%s, 类型:%s] 的 haStatus 从 %s 变更为了 %s", + "ORG_ZSTACK_VPC_HA_10009": "路由器 [uuid:%s] 没有主路由器", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10000": "nfv 实例初始化命令失败,因为:%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10002": "失败了更改NVIDIA实例VM[uuid:%s]的网络接口[ip:%s, mac:%s]防火墙默认动作,因为%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10053": "访问控制列表 groups[uuid:%s] 对 %s 的使用存在异常,但其中有访问控制列表未包含 IP 条目却有重定向规则", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10050": "负载均衡监听器[UUID:%s]无法附加超过%d个重定向规则访问控制列表组", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10051": "负载均衡监听器 [uuid:%s] 具有访问控制列表组[uuid:%s]的重定向规则", + "ORG_ZSTACK_COMPUTE_VM_10118": "虚拟机[UUID:%s]在上次迁移之后仍然处于暂停状态,请先恢复再进行迁移。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10056": "负载均衡监听器[唯一标识: %s]无法附加超过 %d 个访问控制列表组", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10008": "分离功能对于此NFV实例类型不支持", + "ORG_ZSTACK_COMPUTE_VM_10117": "该虚拟机[UUID:%s]已经在主机[UUID:%s]上运行", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10057": "服务器组[%s]未绑定至负载均衡监听器[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10007": "更新分配配置不支持此NFV实例类型", + "ORG_ZSTACK_COMPUTE_VM_10116": "当镜像介质类型为ISO时,rootDiskSize是必需的", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10054": "访问控制列表组[uuid:%s]已经存在于负载均衡监听器[uuid:%s]中", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10055": "负载均衡监听器[唯一标识:%s]仅关联了%s类型的安全访问控制列表组", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10009": "干净数据不支持此NFV实例类型", + "ORG_ZSTACK_COMPUTE_VM_10114": "当前平台 %s 尚不支持更新网卡驱动程序", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10004": "无法通过 SSH 连接到已配置 SSH 的 NFF 实例 [%s]", + "ORG_ZSTACK_COMPUTE_VM_10113": "无法为 vm[uuid:%s] 创建 CD-ROM,其状态为[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10058": "acl[%s]未绑定至负载均衡监听器[%s]", + "ORG_ZSTACK_COMPUTE_VM_10112": "[name:%s, uuid:%s] 是一个 ISO 镜像,必须设置 rootDiskSize", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10006": "失败更新NFV实例状态: %s", + "ORG_ZSTACK_COMPUTE_VM_10111": "缺少CPU/内存设置", + "ORG_ZSTACK_VPC_HA_10020": "HA组UUID为空", + "ORG_ZSTACK_COMPUTE_VM_10121": "无法减少容量当虚拟机[uuid:%s]正在运行时", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10060": "无法将虚拟机网卡绑定到负载均衡监听器,因为虚拟机网卡[uuid:%s]已绑定到默认服务器组[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10061": "无法创建监听器因为UDP监听器不能同时拥有IPv4和IPv6 VIP", + "ORG_ZSTACK_COMPUTE_VM_10129": "%s 不是一个有效的IPv4地址", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10068": "无效重定向状态 [%s], 它仅支持 %s", + "ORG_ZSTACK_COMPUTE_VM_10128": "无法在虚拟机[uuid:%s]运行时减少其内存大小", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10065": "无法将超过 %d 个访问控制列表组附加到一个监听器上", + "ORG_ZSTACK_COMPUTE_VM_10127": "无法在虚拟机[uuid:%s]运行时减少其CPU资源", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10066": "l4[%s] 负载均衡监听器[%s] 不支持分配会话持久性状态", + "ORG_ZSTACK_COMPUTE_VM_10126": "VM[%s]的状态为%s。仅允许更新CPU或内存这些状态[%s]。", + "ORG_ZSTACK_COMPUTE_VM_10125": "因为禁用了内存热插拔,虚拟机无法进行内存热插拔。请先停止虚拟机,然后再重新进行内存热插拔", + "ORG_ZSTACK_COMPUTE_VM_10124": "因为禁用了CPU热插拔,所以该VM无法进行CPU热插拔。请先停止该VM,然后再尝试进行CPU热插拔", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10069": "无效的状态码 [%s],它只支持 %s", + "ORG_ZSTACK_COMPUTE_VM_10122": "预留内存大小[%s]大于内存大小[%s]", + "ORG_ZSTACK_COMPUTE_VM_10132": "%s 不是一个有效的IPv6地址", + "ORG_ZSTACK_COMPUTE_VM_10131": "IP地址 [%s] 不在IP范围 [%s] 内", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10074": "负载均衡器[%s]监听器[%s] %s算法不支持分配会话持久性状态,除非显式分配iphash", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10075": "无效的会话持久性类型[%s],它仅支持%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10072": "无效的会话持久性状态 [%s],它仅支持 %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10073": "负载均衡器[%s]监听器[%s] %s算法不支持分配会话持久性状态,除非明确禁用", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10078": "无效会话cookie名称[%s],它必须仅包含字母、数字和下划线", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10079": "负载均衡器[%s]监听器[%s]不支持同时设置空闲超时和cookie名称", + "ORG_ZSTACK_COMPUTE_VM_10139": "IPv6 地址需要前缀", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10076": "无效会话空闲超时[%s],它必须是介于[%s~%s]之间的数字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10077": "无效的会话cookie名称[%s],它必须短于[%s]字符", + "ORG_ZSTACK_COMPUTE_VM_10137": "IPv4 地址需要一个子网掩码", + "ORG_ZSTACK_COMPUTE_VM_10136": "静态 IP [%s] 格式错误", + "ORG_ZSTACK_COMPUTE_VM_10135": "无法设置IP地址,因为未指定IP地址", + "ORG_ZSTACK_COMPUTE_VM_10134": "IP地址 [%s] 不在IP范围 [起始IP %s, 结束IP %s] 内", + "ORG_ZSTACK_COMPUTE_VM_10133": "IP地址 [%s] 已经分配给虚拟网络接口 [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10081": "负载均衡器[%s]监听器[%s]在会话持久性被禁用时不支持分配空闲超时和cookie名称", + "ORG_ZSTACK_COMPUTE_VM_10143": "无法删除虚拟机 [uuid:%s] 的静态IP [%s],因为该IP不存在", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10082": "负载均衡器[%s]监听器[%s]不支持在未分配cookie名称的情况下设置会话持久性重写", + "ORG_ZSTACK_COMPUTE_VM_10142": "该虚拟机[uuid:%s]在L3网络[uuid:%s]上没有网卡", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10080": "负载均衡器[%s]监听器[%s]不支持分配空闲超时和cookie名称,必须指定会话持久性", + "ORG_ZSTACK_COMPUTE_VM_10140": "IP地址 [%s] 已经分配给虚拟网络接口卡vmNic", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10085": "负载均衡器[%s]监听器[%s]不支持在源负载均衡算法为来源时分配其他会话持久性", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10086": "负载均衡器[%s]监听器[%s]不支持分配会话持久性IP哈希", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10083": "负载均衡器[%s]监听器[%s]不支持在未指定重写模式的情况下分配会话持久性空闲超时", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10084": "负载均衡器[%s]监听器[%s]不支持在未分配插入模式的情况下分配会话持久性cookieName", + "ORG_ZSTACK_COMPUTE_VM_10149": "不支持的图像媒体类型: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10087": "无效的最大连接数[%s],%s 大于上限阈值 %d", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10088": "冲突的负载均衡端口[%s],一个监听器[uuid:%s]已使用该端口", + "ORG_ZSTACK_COMPUTE_VM_10147": "带有内存快照的虚拟机 %s 不支持设置启动磁盘", + "ORG_ZSTACK_COMPUTE_VM_10146": "卷[uuid:%s]必须连接到虚拟机[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10145": "启动磁盘不能是可共享的。", + "ORG_ZSTACK_COMPUTE_VM_10144": "无效启动设备[%s]在启动顺序%s", + "ORG_ZSTACK_VMWARE_10024": "无法同步,在数据存储分离之前", + "ORG_ZSTACK_VMWARE_10025": "在 VCenter[uuid:%s] 上有正在运行的任务,请稍后再试。", + "ORG_ZSTACK_VMWARE_10023": "连接到 vCenter 失败: %s: %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10008": "由于未在控制器[ip:%s]上配置VNI范围,因此无法初始化SDN控制器", + "ORG_ZSTACK_VMWARE_10020": "没有可用的 VNC 端口", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10009": "无法从SDN控制器[ip:%s]获取VNI范围,因为%s", + "ORG_ZSTACK_VMWARE_10021": "[vc] 获取 vCenter %s 的服务实例失败,因为 %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10092": "云无法创建基于TCP协议的监听器,因为仅支持TCP代理协议参数", + "ORG_ZSTACK_MEVOCO_10006": "不支持为 virtio-scsi 体积[%s]设置多队列的操作。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10093": "云无法创建负载均衡监听器,因为仅支持 TCP 代理协议 %s", + "ORG_ZSTACK_MEVOCO_10005": "不支持为根磁盘[%s]设置多队列的操作。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10091": "云无法创建带有HTTPS协议的负载均衡监听器,因为仅支持HTTP版本:[h1, h2]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10010": "由于无法创建硬件 VXLAN 网络,因为 H3C 租户 UUID 是 H3C VCFC V2 控制器的必选参数", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10096": "负载均衡监听器类型为 %s 不需要证书", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10097": "负载均衡监听器 [uuid:%s] 已经有证书[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10094": "云无法创建负载均衡监听器,因为不支持 [%s] 协议下的压缩内容", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10095": "云无法创建负载均衡监听器,因为仅支持压缩算法[%s]", + "ORG_ZSTACK_MEVOCO_10007": "对于可共享的卷,唯一支持的主要存储类型是 %s,当前是 %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10015": "由于无法创建VNI范围,指定的L2网络[uuid:%s]不是一个VXLAN网络池", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10016": "无法创建 VNI 范围 [%s-%s],因为 H3C 控制器将 VNI 用作 VLAN ID,范围必须在 1-4094 内", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10017": "无法创建 VNI 范围 [%s-%s],因为该范围未被任何 SDN 控制器配置的 VNI 范围覆盖", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10098": "证书 [uuid:%s] 没有添加到负载均衡监听器 [uuid:%s] 中", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10018": "由于无法找到SDN控制器[uuid:%s],因此无法添加IPv6地址范围。当前状态:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10099": "健康检查目标 [%s] 错误,它必须是 \u0027default\u0027 或者 1~65535之间的数字", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10011": "由于指定租户在SDN控制器中不存在,因此无法创建硬件VXLAN网络", + "ORG_ZSTACK_MEVOCO_10002": "无法从null卷质量设置中找到模式", + "ORG_ZSTACK_VMWARE_10017": "L2[uuid:%s]不属于vCenter[uuid:%s]集群[uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10012": "由于无法创建 VXLAN 网络,SDN 控制器 [ip:%s] 未响应", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10013": "无法在SDN控制器[ip:%s]上创建VXLAN网络,因为%s", + "ORG_ZSTACK_MEVOCO_10000": "ZStack 已被暂停,拒绝所有非只读 API。如果您确实需要调用并了解后果,请将 \u0027%s\u0027 添加到 systemTags 中。", + "ORG_ZSTACK_VMWARE_10015": "在集群:%s 内未找到任何主机", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10014": "无法在SDN控制器[ip:%s]上删除VXLAN网络,原因:%s", + "ORG_ZSTACK_VMWARE_10016": "弹性搜索主机上的虚拟交换机/d分布式虚拟交换机未找到:%s,或位于不同弹性搜索主机上的虚拟交换机:%s 没有相同的端口组", + "ORG_ZSTACK_VMWARE_10013": "NIC驱动程序 %s 尚未支持", + "ORG_ZSTACK_VMWARE_10014": "集群[uuid:%s]和L2[uuid:%s]属于不同的DCs", + "ORG_ZSTACK_VMWARE_10011": "域名[%s]既不是有效的IPv4地址也不是有效的主机名", + "ORG_ZSTACK_VMWARE_10012": "vCenter [域名:%s] 已添加", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10019": "由于没有找到源文件,无法通过网络CIDR添加IPv6地址段,因为SDN控制器[uuid:%s]未连接。当前状态:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10000": "没有可用的裸金属2网关找到", + "ORG_ZSTACK_VMWARE_10010": "vCenter 登录用户名期望值。", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10002": "分配裸金属2网关失败", + "ORG_ZSTACK_CORE_DEBUG_10000": "任务信息未找到", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10020": "由于SDN控制器[uuid:%s]未连接,无法添加IP范围。当前状态:%s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10021": "由于通过网络CIDR添加IP范围时,SDN控制器[uuid:%s]未连接。当前状态:%s", + "ORG_ZSTACK_MEVOCO_10014": "无效的网络带宽[%s], 它不是一个数字", + "ORG_ZSTACK_MEVOCO_10019": "无效的卷带宽[%s],它必须大于1024(包括1024)", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10028": "由于无法获取租户信息,因此SDN控制器[ip:%s]未响应", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10029": "由于未配置控制器 [IP:%s] 的默认租户,因此无法初始化 SDN 控制器", + "ORG_ZSTACK_VMWARE_10009": "console密码不被[uuid:%s]上的VM支持,运行在ESXHost[%s版本的ESXI]上", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10022": "无法创建L3网络因为H3C VCFC V2软件定义网络控制器不支持L3[type:%s, category:%s]", + "ORG_ZSTACK_MEVOCO_10013": "无效的网络带宽[%s],它必须大于或等于%d", + "ORG_ZSTACK_VMWARE_10006": "失败获取 VM[%s] 根磁盘使用情况", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10023": "由于无法找到硬件VXLAN网络因为租户UUID是H3C VCFC V2控制器的必选参数", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10024": "由于未找到 H3C VCFC 控制器的 VDS UUID 系统标签,因此无法添加 H3C VCFC V1 控制器", + "ORG_ZSTACK_VMWARE_10005": "从安装路径获取虚拟机失败: %s", + "ORG_ZSTACK_VMWARE_10002": "无文件 Datacenter", + "ORG_ZSTACK_VMWARE_10000": "无虚拟磁盘管理器", + "ORG_ZSTACK_VMWARE_10001": "没有文件管理器", + "ORG_ZSTACK_VPC_HA_VYOS_10000": "失败在虚拟路由器[uuid:%s]上启用ha,%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10011": "nfv 实例[uuid:%s]处于无法向%s发起http调用的状态:%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10010": "the nfv 实例[name:%s, uuid:%s, 当前状态:%s]未运行,并且无法执行所需操作。请在它运行后再重试您的操作。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10013": "无法将网卡[ip:%s, mac:%s]添加到NFS实例[uuid:%s ip:%s]中,因为%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10012": "NFS 实例[UUID:%s]没有任何管理网卡可以向%s发起HTTP请求", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10004": "无法确定SDN控制器[%s]的集群领导者,因为%s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10005": "无法使用SDN控制器进行身份验证,因为控制器[ip:%s]未响应", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_10000": "vm[uuid:%s] 存储迁移长时间任务[uuid:%s]失败,因为管理节点被重启", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10006": "无法使用 SDN 控制器 [IP:%s] 进行身份验证,因为 %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10007": "由于无法获取VNI范围,因为SDN控制器[ip:%s]未响应", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10000": "由于在SDN控制器上创建子网失败,因此无法添加IP范围", + "ORG_ZSTACK_COMPUTE_VM_10103": "无法切换到L3网络。L3网络[uuid:%s]是系统网络,而VM是用户VM", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10015": "VmInstanceSpec 在流程数据中未找到", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10001": "无法将 IP 范围添加到 L3 网络因为 %s", + "ORG_ZSTACK_COMPUTE_VM_10102": "无法切换到L3网络。L3网络[uuid:%s]已禁用", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10014": "无法删除镜像[uuid:%s],因为它被用于nfv实例组[uuid:%s]中", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10002": "从 L3 网络删除 IP 范围因为 %s", + "ORG_ZSTACK_COMPUTE_VM_10101": "无法切换到非访客L3网络。L3网络[uuid:%s]已绑定至虚拟机[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10100": "无法切换到L3网络。L3网络[uuid:%s]已绑定至虚拟机[uuid: %s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10003": "无法确定集群领导节点,因为SDN控制器[ip:%s]未响应", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10016": "VmInventory 或 UUID 在 VmInstanceSpec 中为空", + "ORG_ZSTACK_PORTMIRROR_10008": "镜像端口服务不支持类型为[%s]的nic,因为其hypervisor类型不被支持", + "ORG_ZSTACK_PORTMIRROR_10009": "The PortMirror服务无法镜像到nic[%s]该网络接口不是某个VM的非默认接口", + "ORG_ZSTACK_ZWATCH_API_10019": "查询周期不能超过 %s", + "ORG_ZSTACK_COMPUTE_VM_10198": "无法从共享磁盘创建 VM 实例。", + "ORG_ZSTACK_PORTMIRROR_10000": "无效参数 [%s],请确保它是端口镜像网络", + "ORG_ZSTACK_COMPUTE_VM_10197": "需要设置以下属性中的一个,并且只能设置其中一个:%s", + "ORG_ZSTACK_PORTMIRROR_10001": "该网络[%s]已绑定PortMirror服务", + "ORG_ZSTACK_ZWATCH_API_10028": "账户[uuid: %s] 对资源[uuid: %s] 无访问权限", + "ORG_ZSTACK_COMPUTE_VM_10196": "无法同时设置以下属性: %s", + "ORG_ZSTACK_PORTMIRROR_10002": "端口镜像服务[%s]尚未创建", + "ORG_ZSTACK_PORTMIRROR_10003": "The nic[%s, %s] 已被服务[%s]镜像", + "ORG_ZSTACK_COMPUTE_VM_10194": "在 msg 或 image[uuid:%s] 中,至少应设置其中一个字段 architecture", + "ORG_ZSTACK_PORTMIRROR_10004": "The nic[%s] 无法为 service[%s] 进行镜像操作", + "ORG_ZSTACK_ZWATCH_API_10025": "无效标签[%s], 有效可查询标签为 %s", + "ORG_ZSTACK_COMPUTE_VM_10193": "在 msg 或 image[uuid:%s] 中,至少应设置一个 guestOsType 字段", + "ORG_ZSTACK_ZWATCH_API_10024": "指标[%s]不存在过滤器[%s]", + "ORG_ZSTACK_COMPUTE_VM_10192": "在 msg 或 image[uuid:%s] 中,platform 字段至少应设置一个", + "ORG_ZSTACK_PORTMIRROR_10007": "端口镜像服务不支持镜像网卡[%s]", + "ORG_ZSTACK_ZWATCH_API_10021": "无法在命名空间[%s]中找到指标[%s]", + "ORG_ZSTACK_COMPUTE_VM_10199": "无法从挂载的磁盘创建 VM 实例。", + "ORG_ZSTACK_PORTMIRROR_10011": "The PortMirror service can\u0027t mirror the nic[%s] to nic[%s] because the mirror network[%s] can\u0027t establish the mirror tunnel", + "ORG_ZSTACK_PORTMIRROR_10012": "端口镜像服务无法将网卡[%s]镜像到自身", + "ORG_ZSTACK_ZWATCH_API_10039": "非法 JSON 字符串,labelsJsonStr 格式无效", + "ORG_ZSTACK_PORTMIRROR_10013": "端口镜像服务在配置了QoS的网卡上无法工作", + "ORG_ZSTACK_ZWATCH_API_10038": "该命名空间[%s]中不存在指标[%s]", + "ORG_ZSTACK_PORTMIRROR_10014": "失败从hypervisor删除端口镜像会话[%s],详细信息: %s", + "ORG_ZSTACK_ZWATCH_API_10037": "在系统中未定义命名空间[%s]", + "ORG_ZSTACK_PORTMIRROR_10015": "未能从hypervisor释放端口镜像会话[%s],详细信息: %s", + "ORG_ZSTACK_ZWATCH_API_10036": "URL格式无效,开头不是http", + "ORG_ZSTACK_PORTMIRROR_10016": "无法找到会话[uuid:%s]的内部ID,主机上的会话数量过多了吗???", + "ORG_ZSTACK_ZWATCH_API_10033": "endTime[%s, %sms] 必须不得早于 startTime[%s, %sms]", + "ORG_ZSTACK_ZWATCH_API_10032": "指标[%s]的标签[%s]不包含[%s]", + "ORG_ZSTACK_ZWATCH_API_10031": "无法找到命名空间[%s]", + "ORG_ZSTACK_ZWATCH_API_10030": "如果命名空间为全部,则不支持指定指标和标签", + "ORG_ZSTACK_PORTMIRROR_10010": "The PortMirror服务无法镜像[%s]这个不是任何VM接口的网卡", + "ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10009": "从宿主机[uuid:%s]获取PCI设备信息失败", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10030": "无法从SDN控制器[ip:%s]获取默认租户,因为通信错误", + "ORG_ZSTACK_ZWATCH_API_10046": "时间间隔超过 % 天", + "ORG_ZSTACK_ZWATCH_API_10045": "endTime[%s] 不得早于 startTime[%s]", + "ORG_ZSTACK_ZWATCH_API_10044": "无效表[%s]", + "ORG_ZSTACK_ZWATCH_API_10043": "告警确认记录不存在", + "ORG_ZSTACK_ZWATCH_API_10042": "开始时间[%s]大于结束时间[%s]", + "ORG_ZSTACK_ZWATCH_API_10041": "平台[url\u003d%s]已存在", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10033": "无法删除 VXLAN 网络,因为 SDN 控制器 [ip:%s] 未响应", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10004": "操作错误,VIP %s 尚未绑定至VM", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10000": "创建端口转发规则失败[vip ip: %s, 私有 ip: %s, vip 开始端口: %s, vip 结束端口: %s, 私有 开始端口: %s, 私有 结束端口: %s],因为 %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10001": "失败取消端口转发规则 %s,因为 %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10002": "失败同步虚拟路由器[name: %s, uuid: %s]提供的端口转发规则,因为%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10003": "发现为L3Network[uuid:%s]在区域[uuid:%s]中的虚拟路由器提供程序[virtual router offering uuid:%s];然而,该网络的公共网络[uuid:%s]与PortForwarding规则[uuid:%s]的不同;您可能需要使用系统标签guestL3Network::l3NetworkUuid来指定特定的虚拟路由器提供程序", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10004": "虚拟路由器不支持端口转发范围重定向,vipPortStart 必须等于 privatePortStart,且 vipPortEnd 必须等于 privatePortEnd;但此规则的范围不符:vip 端口[%s, %s],私有端口[%s, %s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10005": "在虚拟路由器[uuid:%s]上添加端口转发规则失败,%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10006": "失败于撤销虚拟路由器[uuid:%s]上的端口转发,%s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10003": "失败了反生成 SE 设备,因为:%s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10004": "从主机[uuid:%s]获取mtty设备信息失败", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10001": "The quantity exceeded. The device[uuid: %s] required SE devices number exceeds a quantity[value: %s].", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10002": "生成安全设备失败,因为:%s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10000": "[value:%s]不是有效的部件编号。", + "ORG_ZSTACK_CORE_CLOUDBUS_10021": "消息未以修正的JSON媒体类型格式存在,%s", + "ORG_ZSTACK_COMPUTE_VDPA_10009": "仅支持 %s vdpa", + "ORG_ZSTACK_COMPUTE_VDPA_10007": "无法生成PCI设备[uuid:%s],因为另一个L2[uuid:%s]正在使用与集群连接的物理网络接口", + "ORG_ZSTACK_COMPUTE_VDPA_10006": "无法反生成PCI设备[uuid:%s],因为另一个L2[uuid:%s]正在使用与此集群连接的物理网络接口", + "ORG_ZSTACK_COMPUTE_VDPA_10005": "失败删除桥接[%s]对于l2网络[uuid:%s, type:%s]在kvm主机[uuid:%s]上,因为%s", + "ORG_ZSTACK_COMPUTE_VDPA_10004": "失败在KVM宿主机[uuid:%s]上检查桥接[%s]对于l2NoVlanNetwork[uuid:%s, name:%s]的情况,%s", + "ORG_ZSTACK_COMPUTE_VDPA_10003": "失败在KVM宿主机[uuid:%s]上为l2Network[uuid:%s, type:%s]创建桥接[%s],因为%s", + "ORG_ZSTACK_COMPUTE_VDPA_10002": "从目标主机[uuid:%s]恢复vm[uuid:%s]的vdpa", + "ORG_ZSTACK_COMPUTE_VDPA_10001": "释放vdpa给目标主机上的vm[uuid:%s][uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10152": "VM[uuid:%s] 挂载了多个 ISO 文件,请在解挂载时指定 isoUuid", + "ORG_ZSTACK_COMPUTE_VM_10151": "VM[uuid:%s] 的光驱[uuid:%s]已挂载了ISO", + "ORG_ZSTACK_COMPUTE_VM_10150": "The cdRom[uuid:%s] 不存在", + "ORG_ZSTACK_COMPUTE_VM_10159": "无法绑定L3网络。L3网络[uuid:%s]属于尚未绑定任何集群的L2网络[uuids:%s]", + "ORG_ZSTACK_COMPUTE_VM_10158": "无法绑定L3网络。L3网络[uuid:%s]属于不同的L2网络[uuids:%s]", + "ORG_ZSTACK_COMPUTE_VM_10157": "无法绑定L3网络。L3网络[uuid:%s]没有IP范围", + "ORG_ZSTACK_COMPUTE_VM_10156": "无法绑定L3网络。该虚拟机[uuid: %s]未运行或停止;当前状态为%s", + "ORG_ZSTACK_COMPUTE_VDPA_10015": "在宿主机[uuid:%s]中为虚拟机[uuid:%s]生成vdpas失败:%s", + "ORG_ZSTACK_COMPUTE_VDPA_10013": "在主机[uuid:%s]中删除vm[uuid:%s]的vdpas时失败:%s", + "ORG_ZSTACK_COMPUTE_VDPA_10012": "L2网络[uuid:%s]在主机[uuid:%s]中未进行SRIOV虚拟化", + "ORG_ZSTACK_COMPUTE_VDPA_10011": "集群[uuid:%s]不支持ovs-dpdk", + "ORG_ZSTACK_COMPUTE_VDPA_10010": "无法使用物理接口:[%s] 创建 %s,因为该物理接口已被其他类型的安全组占用。", + "ORG_ZSTACK_COMPUTE_VM_10163": "无法绑定L3网络。L3网络[uuid:%s]是系统网络,而VM是用户VM", + "ORG_ZSTACK_COMPUTE_VM_10162": "无法绑定L3网络。L3网络[uuid:%s]已禁用", + "ORG_ZSTACK_COMPUTE_VM_10161": "无法附加非客户机的L3网络。L3网络[uuid:%s]已附加到虚拟机[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10160": "无法绑定L3网络。L3网络[uuid:%s]已绑定至虚拟机[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10168": "静态IP[%s]在L3网络[uuid:%s]中已被占用", + "ORG_ZSTACK_COMPUTE_VM_10167": "静态IP[%s]不在L3网络[uuid:%s]的任何IP范围内", + "ORG_ZSTACK_COMPUTE_VM_10166": "静态IP L3 UUID[%s] 不包含在NIC L3 [%s] 中", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10009": "IAM2项目对象[唯一标识:%s]的状态不是%s,不允许状态变更", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10008": "该项目[uuid:%s, 名称:%s]已经存在一个登录过期策略", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10007": "无效的日期或时间[%s],它不能早于当前时间[%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10006": "无效支出值[%s],它应该类似于10.001的格式", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10005": "无效的支出值[%s],支出值应在0和%f之间", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10004": "无效时间[%s],它应该例如10m、1h、2d的格式", + "ORG_ZSTACK_CORE_CLOUDBUS_10001": "对于 type[%s] 类型的 webhook,字段 opaque 不能为 null", + "ORG_ZSTACK_COMPUTE_VM_10176": "无法绑定网卡。其L2网络[%s]尚未绑定到任何集群", + "ORG_ZSTACK_ZWATCH_API_10007": "dataStartTime 和 dataEndTime 不能缺失", + "ORG_ZSTACK_COMPUTE_VM_10175": "无法绑定网卡。其L3网络[uuid:%s]是系统网络,而VM是用户VM", + "ORG_ZSTACK_ZWATCH_API_10006": "dataUuid 不能为空", + "ORG_ZSTACK_COMPUTE_VM_10174": "无法绑定网卡。其L3网络[uuid:%s]已禁用", + "ORG_ZSTACK_COMPUTE_VM_10173": "无法将网卡附加到非客户机L3网络。其L3网络[uuid:%s]已附加到虚拟机[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10172": "无法绑定网卡。其L3网络[uuid:%s]已绑定至虚拟机[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10171": "无法绑定网卡。该网卡已绑定至虚拟机[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10170": "无法绑定网卡。该实例[UUID: %s]未处于运行中或停止状态;当前状态为%s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10011": "该项目[uuid:%s, 名称:%s]已有一个退役策略", + "ORG_ZSTACK_COMPUTE_VM_10179": "无法分离L3网络。该虚拟机[uuid: %s]未处于运行或停止状态;当前状态为%s", + "ORG_ZSTACK_COMPUTE_VM_10178": "无法更新网卡[uuid: %s]状态,因为不支持该类型的网卡[%s]", + "ORG_ZSTACK_CORE_UPGRADE_10000": "Api: %s 在 allowedApiListGrayscaleUpgrading: %s 中被禁止。", + "ORG_ZSTACK_CORE_UPGRADE_10003": "无法找到代理版本,在灰度升级期间不支持升级集群操作系统", + "ORG_ZSTACK_CORE_UPGRADE_10002": "禁用由 %s 卸载灰度升级 \\n 在您想要更新整个集群主机的操作系统之前。或者尝试使用特定的 hostUuid 更新集群操作系统。", + "ORG_ZSTACK_CORE_UPGRADE_10004": "主机[uuid: %s]代理版本未更新,请在更新操作系统前重新连接主机", + "ORG_ZSTACK_ZWATCH_API_10008": "数据开始时间[%s]大于数据结束时间[%s]", + "ORG_ZSTACK_COMPUTE_VM_10187": "当 imageUuid 为空时, %s", + "ORG_ZSTACK_COMPUTE_VM_10186": "缺失根磁盘", + "ORG_ZSTACK_COMPUTE_VM_10185": "意外的数据盘设置。dataDiskSizes 需要大于 0", + "ORG_ZSTACK_COMPUTE_VM_10182": "意外的根磁盘设置", + "ORG_ZSTACK_COMPUTE_VM_10181": "镜像的 mediaType 是 ISO,但缺少根磁盘设置", + "ORG_ZSTACK_COMPUTE_VM_10180": "vm[uuid:%s] 只能在运行中或已停止状态下才能挂载磁盘,当前状态是 %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10003": "无效日期[%s],它应该为 yyyy-MM-dd HH:mm:ss 格式", + "ORG_ZSTACK_ZWATCH_API_10010": "命名空间名称不能以保留的关键字 %s 开头", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10002": "无效手段[%s], 允许的手段为 %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10001": "无效值, %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10000": "无效值,未找到 \u0027at\u0027, \u0027after\u0027 或 \u0027exceed\u0027", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10030": "PXE 服务器 DHCP 接口 %s 不存在,或其没有 IP 地址。", + "ORG_ZSTACK_NETWORK_OVN_10012": "不能添加 SDN 主机,因为网卡[%s]已有IP地址[%s]", + "ORG_ZSTACK_NETWORK_OVN_10011": "无法添加 SDN 主机,因为网卡[%s]处于 SRIOV 虚拟化状态", + "ORG_ZSTACK_NETWORK_OVN_10010": "无法添加 SDN 主机,因为网卡[%s]的类型[%s]已被用于 Linux 倒换(bonding)", + "ORG_ZSTACK_NETWORK_OVN_10016": "无法添加SDN主机,因为只有KVM主机支持ovs-dpdk", + "ORG_ZSTACK_APIMEDIATOR_10000": "在同一主机上识别到多个备份存储,由主机名 %s 标识。已存在一种 SftpBackupStorage [主机名:%s]。要添加的备份存储类型是 %s。", + "ORG_ZSTACK_NETWORK_OVN_10015": "无法添加 SDN 主机,因为绑定模式[%s]不被 OVN 支持", + "ORG_ZSTACK_NETWORK_OVN_10014": "无法添加 SDN 主机,因为网卡[%s]已被用于 VXLAN VTEP 接口", + "ORG_ZSTACK_NETWORK_OVN_10013": "无法添加SDN主机,因为网卡[%s]已连接到L2网络[name:%s]", + "ORG_ZSTACK_APIMEDIATOR_10001": "在同一主机上识别到多个备份存储。已存在一个 ImageStoreBackupStorage [主机名:%s]。要添加的备份存储类型是 %s。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10031": "%s ~ %s 无法连接到 dhcp 接口 %s", + "ORG_ZSTACK_NETWORK_OVN_10019": "主机[uuid:%s]所在的集群[uuid:%s]未启用大页内存,不允许将其添加到SDN控制器", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10032": "集群[uuid:%s]和PXE服务器[uuid:%s]不属于同一区域", + "ORG_ZSTACK_NETWORK_OVN_10018": "无法添加 SDN 主机,因为子网掩码未设置", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10033": "集群[uuid:%s] 不是裸金属集群", + "ORG_ZSTACK_NETWORK_OVN_10017": "无法添加 SDN 主机,因为 VTEPIP 未设置", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10034": "裸金属 PXE 服务器[uuid:%s]已连接至集群[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10035": "裸金属 PXE 服务器[uuid:%s]与集群[uuid:%s]中的裸金属实例不兼容,现有网卡 IP %s 超出了 PXE 服务器 DHCP 范围 %s ~ %s。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10036": "裸金属 PXE 服务器[UUID: %s]未连接至集群[UUID: %s]", + "ORG_ZSTACK_STORAGE_MIGRATION_10030": "目标主存储未连接到任何具有与源集群相同L2网络的集群。", + "ORG_ZSTACK_STORAGE_MIGRATION_10033": "不支持在共享卷[uuid: %s, name: %s]已挂载时进行存储迁移", + "ORG_ZSTACK_STORAGE_MIGRATION_10034": "无法将卷从 %s 迁移至 %s。", + "ORG_ZSTACK_STORAGE_MIGRATION_10031": "该卷[uuid:%s]仍然附挂在vm[uuid:%s]上,请在迁移前先将其detach。", + "ORG_ZSTACK_STORAGE_MIGRATION_10032": "无法在虚拟机[vmuuid:%s]实例未停止时,将数据卷[uuid:%s]在共享块级主要存储之间进行迁移。", + "ORG_ZSTACK_STORAGE_MIGRATION_10035": "无法迁移卷[%s],因为卷状态为禁用", + "ORG_ZSTACK_STORAGE_MIGRATION_10036": "没有可用的主机进行块级在线迁移:%s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10019": "无法找到 SNSTextTemplate[uuid:%s],它可能已被删除", + "ORG_ZSTACK_NETWORK_OVN_10023": "无法将 vmnic 更改为 l3network[uuid:%s],因为虚机的主机[uuid:%s]未连接到 sdn 控制器[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10028": "无法连接到 %s,请检查 ZStack 管理节点与裸金属 PXE 服务器之间的网络连接", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10016": "应用程序平台/端点 [%s] 不支持用户定义的模板", + "ORG_ZSTACK_NETWORK_OVN_10022": "无法将 vmnic 更改为 l3network[uuid:%s],因为未找到 sdn 控制器[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10029": "在 %s 的 /opt/zstack-dvd 下未找到本地仓库,请先下载 zstack iso 并创建本地仓库", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10015": "无效的应用平台类型[%s]", + "ORG_ZSTACK_NETWORK_OVN_10021": "无法将L3网络附加到VM,因为VM的主机[uuid:%s]未附加到SDN控制器[uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10018": "无法找到主题[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10020": "无法将L3网络附加到VM,因为SDN控制器[uuid:%s]未找到", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10017": "参数:\\n %s 不被 ZStack 支持,可用值为:\\n %s", + "ORG_ZSTACK_NETWORK_OVN_10026": "失败将网卡 qos 同步至 ovn 控制器[uuid:%s, ip:%s],因为 %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10011": "短信模板代码应为13个字符的字符串。获取到的事件模板代码:[%s],实际长度为:[%d]。", + "ORG_ZSTACK_NETWORK_OVN_10025": "失败获取网卡 qos 至 ovn 控制器[uuid:%s, ip:%s], 因为 %s", + "ORG_ZSTACK_NETWORK_OVN_10024": "失败将nic qos设置给ovn控制器[uuid:%s, ip:%s],因为%s", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10020": "不支持的裸金属备份存储类型", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10010": "短信模板代码应为13个字符的字符串。获取到的警报模板代码:[%s],实际长度为 [%d] 个字符。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10023": "PXE 服务器 DHCP 地址范围网掩码 %s 无效。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10024": "PXE 服务器 DHCP 范围起始地址 %s 和范围结束地址 %s 不属于同一个子网。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10025": "PXE 服务器主机名为 %s 的已经存在。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10026": "已经有使用管理IP %s的金属节点网关,不要使用它来创建金属PXE服务器", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10027": "存储路径应该是一个绝对路径", + "ORG_ZSTACK_STORAGE_MIGRATION_10022": "图像[uuid:%s]不在源备份存储[uuid:%s]中", + "ORG_ZSTACK_STORAGE_MIGRATION_10023": "无法将镜像从 %s 迁移至 %s。", + "ORG_ZSTACK_STORAGE_MIGRATION_10020": "源BS和目标BS必须未被禁用。", + "ORG_ZSTACK_STORAGE_MIGRATION_10021": "图像[uuid:%s]不在就绪状态,无法迁移它。", + "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10001": "主机 %s的心跳未更新", + "ORG_ZSTACK_STORAGE_MIGRATION_10026": "卷[uuid:%s]不在就绪状态,无法迁移它。", + "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10000": "未找到主机Uuid[%s]和主要存储Uuid[%s]的主机Id", + "ORG_ZSTACK_STORAGE_MIGRATION_10027": "无法在虚机实例未停止时迁移根卷。", + "ORG_ZSTACK_STORAGE_MIGRATION_10024": "卷[uuid:%s]已处于目标池[uuid:%s]中,无法迁移。", + "ORG_ZSTACK_STORAGE_MIGRATION_10025": "源PS和目标PS必须未处于禁用或维护状态。", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10009": "阿里云短信签名的长度应在2到12个字符之间。获取到的签名: [%s] 共有 [%d] 个字符。", + "ORG_ZSTACK_STORAGE_MIGRATION_10028": "不支持挂载了共享卷的虚机[uuid:%s, name: %s]的存储迁移", + "ORG_ZSTACK_STORAGE_MIGRATION_10029": "无法迁移根卷组,因为该虚拟机实例上已挂载了数据卷。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10017": "未能挂载裸金属缓存镜像[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10019": "裸金属镜像缓存中没有足够的空间为镜像[uuid:%s]分配空间", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10011": "失败在_pxeserver[uuid:%s]上创建机箱[chassis uuid:%s]的dhcp配置", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10012": "失败在_pxeserver[uuid:%s]删除机箱[chassis uuid:%s]的dhcp配置", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10013": "裸金属 PXE 服务器代理的 UUID 发生变化[预期:%s,实际:%s],最有可能是代理被手动重启了。请发起重新连接以同步状态", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10005": "无法找到文件夹:%s 在仪表板中", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10016": "无法连接到裸金属PXE服务器\"url:%s\",因为%s", + "ORG_ZSTACK_LICENSE_10002": "许可证请求码非法", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10003": "sqlite3 执行失败,因为: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10000": "不支持的方法: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10001": "HTTP请求错误!状态码:%s, 错误:%s", + "ORG_ZSTACK_STORAGE_MIGRATION_10011": "不支持在连接的ceph备份存储中使用iso进行存储迁移", + "ORG_ZSTACK_STORAGE_MIGRATION_10015": "不支持从 [%s] 到 [%s] 的存储迁移", + "ORG_ZSTACK_STORAGE_MIGRATION_10016": "VM[uuid:%s]正在运行但主机的uuid缺失", + "ORG_ZSTACK_STORAGE_MIGRATION_10013": "不支持从 [%s] 到 [%s] 的存储迁移,涉及数据卷", + "ORG_ZSTACK_STORAGE_MIGRATION_10014": "不支持从 [%s] 到 [%s] 的存储迁移带有快照功能", + "ORG_ZSTACK_STORAGE_MIGRATION_10019": "源BS和目标BS不能相同。", + "ORG_ZSTACK_STORAGE_MIGRATION_10017": "仅支持使用 dataVolumes 参数的数据卷在线存储迁移。", + "ORG_ZSTACK_STORAGE_MIGRATION_10018": "不支持从 [%s] 到 [%s] 的在线存储迁移仅限数据卷", + "ORG_ZSTACK_NETWORK_OVN_10001": "无法将虚拟机网卡添加到安全组,因为虚拟机网卡 SDN [uuid:%s] 与安全组 SDN [uuid:%s] 不同", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10006": "创建 BM 实例 Nginx 代理在裸金属 PXE 服务器[UUID:%s]失败", + "ORG_ZSTACK_NETWORK_OVN_10000": "无法将三层网络附加到安全组,因为三层网络 SDN [uuid:%s] 与安全组 SDN [uuid:%s] 不同", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10007": "删除裸金属_pxeserver 上的 bm 实例 nginx 代理[uuid:%s] 失败", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10008": "无法启动裸金属 PXE 服务器[UUID:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10009": "失败停止裸金属 PXE 服务器[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10005": "无法创建安全组,因为 ovn 控制器[uuid:%s, 类型: %s] 未找到", + "ORG_ZSTACK_NETWORK_OVN_10004": "无法创建安全组因为指定了ovn控制器", + "ORG_ZSTACK_NETWORK_OVN_10003": "无法删除主机因为主机上有 %d 个 OVN 控制器实例", + "ORG_ZSTACK_NETWORK_OVN_10002": "无法创建L3网络因为OVN不支持L3[type:%s, category:%s]", + "ORG_ZSTACK_NETWORK_OVN_10009": "无法添加 SDN 主机,因为网卡[%s]未找到", + "ORG_ZSTACK_NETWORK_OVN_10008": "无法创建 SDN L2 网络,因为没有 SDN 控制器 UUID", + "ORG_ZSTACK_NETWORK_OVN_10007": "无法将网络服务[%s]附加到OVN网络", + "ORG_ZSTACK_GUESTTOOLS_PVPANIC_10000": "不能在此处", + "ORG_ZSTACK_NETWORK_OVN_10006": "无法将 OVN 网络服务附加到具有 vSwitchType[%s] 的网络", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10001": "在裸金属PXE服务器[UUID:%s]上初始化配置失败", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_MARKETPLACE_10000": "[市场] filterName 必须为 marketplace:true 或 marketplace:false", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10002": "在裸金属 PXE 服务器[UUID:%s]上创建 BM 实例配置失败", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10003": "删除裸金属 PXE 服务器 [uuid:%s] 的 BM 实例配置失败", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10004": "在裸金属 PXE 服务器[UUID:%s]上创建 BM 实例 NOVNC 代理失败", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10005": "删除裸金属 PXE 服务器 [uuid:%s] 上的 BM 实例 NOVNC 代理失败", + "ORG_ZSTACK_NETWORK_SERVICE_10005": "L3Network[uuid:%s] 没有启用网络服务[type:%s] 或者没有任何提供者提供此网络服务", + "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10000": "不支持的 SEND_SNS_MESSAGE 能力", + "ORG_ZSTACK_NETWORK_SERVICE_10004": "失败将网络服务[%s]应用到VM[uuid: %s]", + "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10001": "插件 %s 上发送 sns 消息失败", + "ORG_ZSTACK_NETWORK_SERVICE_10007": "提供商[%s]的网络服务必须指定", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10021": "在集群[uuid:%s]中未找到baremetal2分配网络", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10020": "在集群[uuid:%s]中未找到可用的裸金属2网关", + "ORG_ZSTACK_NETWORK_SERVICE_10001": "L3网络 [uuid: %s] 没有主机路由服务", + "ORG_ZSTACK_NETWORK_SERVICE_10000": "L3网络 [uuid: %s] 提供类型为空", + "ORG_ZSTACK_LICENSE_10019": "意外的宿主机厂商对于MINI", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10022": "裸金属2分配网络[uuid:%s]不可用,请确保其已启用", + "ORG_ZSTACK_NETWORK_SERVICE_10009": "网络服务提供商[uuid:%s]未提供服务%s", + "ORG_ZSTACK_NETWORK_OVN_10052": "失败删除主机[uuid:%s]的ovs端口,网卡信息:%s,错误:%s", + "ORG_ZSTACK_NETWORK_SERVICE_10008": "无法找到网络服务提供者[uuid:%s]或其未提供任何服务", + "ORG_ZSTACK_NETWORK_OVN_10051": "失败在宿主机[uuid:%s]删除网络接口[%s]的ovs端口,错误:%s", + "ORG_ZSTACK_NETWORK_OVN_10050": "失败将ovs端口同步至主机[uuid:%s]的网络接口[%s],错误:%s", + "ORG_ZSTACK_NETWORK_OVN_10056": "查询集群状态以验证节点被踢出错误 %s", + "ORG_ZSTACK_NETWORK_OVN_10055": "失败将QoS同步至OVN控制器[uuid:%s, ip:%s],错误:%s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORK_10000": "无法在目标主机[uuid:%s]上为虚拟机[uuid:%s]配置vxlan网络", + "ORG_ZSTACK_NETWORK_OVN_10054": "失败将所需的机柜设置为宿主机[uuid:%s]的ovs端口[lsp/%s],错误:%s", + "ORG_ZSTACK_NETWORK_OVN_10053": "失败在主机[uuid:%s]上设置所需的机柜ovs端口[%s]的lsp[%s],错误:%s", + "ORG_ZSTACK_NETWORK_OVN_10059": "失败向 ovn 控制器[uuid:%s, ip:%s]添加 dhcp 选项,因为 %s", + "ORG_ZSTACK_NETWORK_OVN_10058": "空集群状态结果来自代理", + "ORG_ZSTACK_NETWORK_OVN_10057": "获取集群状态失败: %s", + "ORG_ZSTACK_NETWORK_SERVICE_10010": "网络服务[%s]已附加到L3网络[uuid:%s]", + "ORG_ZSTACK_LICENSE_10023": "失败删除许可证书", + "ORG_ZSTACK_LICENSE_10003": "时间戳非法", + "ORG_ZSTACK_LICENSE_10004": "意外解码后的许可证文件长度:%d", + "ORG_ZSTACK_LICENSE_10005": "解码失败因为 %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10010": "在 baremetal2 集群[uuids:%s]中未找到可用的物理机机框", + "ORG_ZSTACK_NETWORK_SERVICE_10012": "网络服务不能为空", + "ORG_ZSTACK_NETWORK_SERVICE_10011": "当将DHCP服务绑定到L3网络[uuid:%s]时,分配IP地址不足。", + "ORG_ZSTACK_NETWORK_SERVICE_10014": "无法找到 NetworkServiceDhcpBackend[提供商类型: %s]", + "ORG_ZSTACK_NETWORK_OVN_10062": "失败于ping ovn控制器[uuid:%s, ip:%s], 因为%s", + "ORG_ZSTACK_NETWORK_OVN_10061": "无法向 OVN 控制器[uuid:%s, ip:%s]发送命令,NfvInstGroup[uuid:%s, name:%s]的状态为%s,仅健康的或降级的组可以接受命令", + "ORG_ZSTACK_NETWORK_OVN_10060": "ovn 控制器[uuid:%s]未连接,当前状态:%s", + "ORG_ZSTACK_NETWORK_OVN_10067": "IP [%s] 当前环境中不是一个有效的VIP。请使用NFV实例组的VIP地址。", + "ORG_ZSTACK_NETWORK_OVN_10066": "无法找到 vm[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10064": "无法找到虚拟机网卡[内部名称:%s]", + "ORG_ZSTACK_NETWORK_OVN_10069": "ping sdn控制器失败,错误:%s", + "ORG_ZSTACK_NETWORK_OVN_10068": "IP [%s] 不是任何 OVN SDN 控制器 NFV 实例组的 VIP 地址。请使用 OVN 控制器 NFV 实例组的 VIP 地址。", + "ORG_ZSTACK_CORE_10000": "未找到适用于资源Uuid[%s]的执行器", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10016": "bond 名称 %s 已经存在", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10018": "无法找到裸金属2机箱[uuid:%s]所在的集群,可能该集群不存在", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10017": "nic 与 mac:%s 已经被绑定", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10000": "验证通用短信与供应商[%s]失败", + "ORG_ZSTACK_LICENSE_10037": "MN[uuid:%s]: %s", + "ORG_ZSTACK_LICENSE_10038": "多个 MN 存在但仅提供了 %s 的许可证", + "ORG_ZSTACK_LICENSE_10039": "在MN HA环境,但仅更新了%s的许可证", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10001": "机箱的CPU架构[arch:%s]与集群的CPU架构[arch:%s]不匹配", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10000": "错误的裸金属2机箱硬件信息格式: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10003": "错误的裸金属2机箱网卡硬件信息格式: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10002": "仅支持具有启动模式 %s 的裸金属2机箱", + "ORG_ZSTACK_NETWORK_OVN_10032": "配置 OVN 集群节点失败,NfvInst[uuid:%s] 因为 %s", + "ORG_ZSTACK_NETWORK_OVN_10031": "在 NfvInstGroup[uuid:%s] 中未找到实例", + "ORG_ZSTACK_NETWORK_OVN_10038": "分离 NfvInst[uuid:%s] 未找到", + "ORG_ZSTACK_NETWORK_OVN_10035": "L2网络[uuid:%s]未连接SDN控制器", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10005": "错误的裸金属2机箱磁盘硬件信息格式: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10004": "在一个裸金属2机箱中必须且只能存在一个提供网络接口卡", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10006": "其他机箱存在具有相同MAC地址的网卡,这是不可能的", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10009": "没有可用的裸金属2机箱找到", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10008": "裸金属2机箱[uuid:%s]不存在或已被禁用", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10002": "无效供应商[%s]", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10001": "验证通用短信失败", + "ORG_ZSTACK_CORE_GC_10001": "无法触发已完成的GC任务[uuid:%s, name:%s]", + "ORG_ZSTACK_LICENSE_10046": "无法在路径 %s 上找到许可[uuid:%s, 类型:%s]文件", + "ORG_ZSTACK_LICENSE_10028": "失败删除模块许可证", + "ORG_ZSTACK_LICENSE_10029": "UKey 不受支持(架构: %s)", + "ORG_ZSTACK_NETWORK_OVN_10041": "无法将L3网络附加到安全组,因为未找到SDN控制器[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10040": "管理IP未找到,无法卸载NfvInst[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10045": "失败于启动宿主机[uuid:%s]的ovs服务,错误:%s", + "ORG_ZSTACK_NETWORK_OVN_10043": "failed to install ovs package to host[uuid:%s], error: %s", + "ORG_ZSTACK_NETWORK_OVN_10042": "无法将L3网络附加到安全组,因为SDN控制器[uuid:%s]未连接[状态:%s]", + "ORG_ZSTACK_NETWORK_OVN_10049": "失败在宿主机[uuid:%s]同步ovs端口,网卡为[%s],错误:%s", + "ORG_ZSTACK_NETWORK_OVN_10048": "失败将ovs端口添加至主机[uuid:%s]的网络接口[%s],错误:%s", + "ORG_ZSTACK_NETWORK_OVN_10047": "在主机[uuid:%s]上为网卡[%s]添加ovs端口失败,错误:%s", + "ORG_ZSTACK_LICENSE_10030": "没有本地ukey许可证更新", + "ORG_ZSTACK_LICENSE_10031": "更新本地UKey许可证: %s", + "ORG_ZSTACK_LICENSE_10032": "没有可用节点更新UKey", + "ORG_ZSTACK_GUESTTOOLS_KVM_10001": "在虚拟机[uuid:%s]中卸载Guest Tools失败", + "ORG_ZSTACK_GUESTTOOLS_KVM_10000": "从虚机[uuid:%s]获取客端工具信息失败,因为:%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10033": "PCI设备编号[%s]不是标签[%s]中的有效整数", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10034": "mdev 设备规范[uuid:%s]不存在", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10031": "PCI设备编号在标签[%s]中缺失", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10032": "PCI设备编号在标签[%s]中必须大于0", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10030": "pci 设备规格[uuid:%s]不存在,来自标签[%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10006": "从 prometheus 获取虚拟机工具状态失败:[metric\u003d%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10005": "失败从虚拟机[uuid:%s]detach客舱工具iso文件,原因:%s", + "ORG_ZSTACK_GUESTTOOLS_KVM_10004": "未能将客户机工具 ISO 挂载到 VM[uuid:%s],原因:%s", + "ORG_ZSTACK_GUESTTOOLS_KVM_10003": "下载客户工具ISO失败,因为未找到KVM宿主机[uuid:%s]", + "ORG_ZSTACK_LICENSE_10048": "许可证过期", + "ORG_ZSTACK_LICENSE_10049": "不支持:从USB-key删除许可证[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10024": "没有可用的PCI设备规格供VM[uuid:%s]使用", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10025": "PCI设备规格[UUID:%s]对于VM[UUID:%s]不可用", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10023": "获取可用于虚拟机[uuid:%s]的PCI设备规格失败:%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10020": "云实例[uuid:%s, 状态:%s]需要停止才能移除mdev设备规格[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10027": "为什么卷[uuid:%s, 安装路径:%s]不在目录%s中", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10026": "主机[uuid:%s]可能挂载了与SMP[uuid:%s]不同的存储,请检查。", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10024": "主机[uuid:%s]具有相同的挂载路径,但实际挂载了不同的存储。", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10028": "mdev 设备规格[uuid:%s] 对于虚拟机[uuid:%s] 不可用", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10029": "PCI设备规格UUID在标签[%s]中缺失", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10026": "没有可用的 mdev 设备规格供虚拟机[uuid:%s]使用", + "ORG_ZSTACK_LICENSE_10050": "混合平台许可证已处于使用中。您应该通过 DeleteLicenseAction 同时移除混合平台许可证和混合插件许可证,并且 UUID 为 [uuid\u003d%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10011": "vm[uuid:%s] 没有对应的 pci 设备规格[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10012": "vm 实例[uuid:%s, 状态:%s] 需要停止以移除pci设备规范[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10019": "vm[uuid:%s] 没有 mdev 设备规格[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10017": "vm[uuid:%s] 已经有 mdev 设备规格[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10018": "云实例[uuid:%s, 状态:%s]需要停止以设置mdev设备规格", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10015": "VM实例[uuid:%s, 状态:%s]需要停止以设置PCI设备规格", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10009": "无法找到亲和组[uuid:%s],它可能已被删除", + "ORG_ZSTACK_COMPUTE_VM_10309": "IP[%s]在L3网络[uuid:%s]不可用,原因:%s", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10006": "在该主机 [uuid: %s] 上存在属于同一亲和性组 [%s] 的其他虚拟机", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10005": "VM [uuid: %s] 已经被添加到 affinityGroup [uuid: %s] 中", + "ORG_ZSTACK_COMPUTE_VM_10307": "静态IP[%s]格式错误", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10008": "vm [uuid:%s] 不满足亲和组 [uuid:%s] 的要求", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10007": "亲和组 [uuid:%s] 预留主机 [uuid:%s] 用于vm [uuid:%s] 失败", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10003": "只能同时设置一个集群uuid、主机uuid或vm uuid", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10008": "vm[uuid:%s] 已经有pci设备配置[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10006": "VM 必须停止才能设置 PCI 设备属性: uuid\u003d%s, 状态\u003d%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10007": "非法的PCI设备类型: %s, 有效类型: %s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10004": "未找到启用的集群", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10001": "无法删除系统标签[%s]。负载均衡插件依赖于此标签,您只能更新它", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10002": "亲和组 [uuid: %s] 不存在", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10002": "nic[uuid:%s] 未找到。请修正您的系统标签[%s]中的负载均衡器信息", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10001": "VM [uuid: %s] 已经添加到亲和组 [uuid: %s] 中", + "ORG_ZSTACK_COMPUTE_VM_10303": "更新 vm[%s] 的优先级到 [%s] 失败,因为 %s", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10004": "无法操作未启用的亲和性组 [uuid: %s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10000": "无法找到负载均衡器[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10302": "VM[uuid:%s] 只能添加 %s 个光驱", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10003": "无法操作由系统创建的亲和性组", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10005": "无效的余额算法[%s],有效的算法为 %s", + "ORG_ZSTACK_COMPUTE_VM_10301": "VM[uuid:%s] 已经挂载了 ISO[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10006": "无效的不健康阈值[%s],%s 不是数字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10003": "无效的负载均衡权重[%s],%s 不在范围 [%d, %d] 内", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10000": "Vm只能在状态[%s,%s]时更改其 affinityGroup,但vm当前处于状态[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10004": "无效的负载均衡权重[%s],%s 不是数字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10009": "无效的连接空闲超时[%s],%s 不是数字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10007": "无效的健康阈值[%s], %s 不是数字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10008": "无效的健康超时[%s],%s 不是数字", + "ORG_ZSTACK_TICKET_IAM2_10002": "操作被拒绝,因为流量收集[uuid:%s]不属于项目[uuid:%s]", + "ORG_ZSTACK_TICKET_IAM2_10003": "虚拟ID[uuid:%s]不是该票据[uuid:%s, name:%s]的所有者", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10004": "kafka 主题不能为 null", + "ORG_ZSTACK_TICKET_IAM2_10000": "操作被拒绝,因为票据提交者[uuid:%s]已被删除,该票据[uuid:%s, name:%s]只能在此时被删除", + "ORG_ZSTACK_TICKET_IAM2_10001": "操作被拒绝,因为票据[uuid:%s]所关联的项目[uuid:%s]已被删除,现在只能删除该票据[uuid:%s, name:%s]", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10001": "syslog 模式不能为 null", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10000": "索引不能为 null", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10003": "洛基标签的格式需要为 key\u003dvalue", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10002": "洛基标签不能为 null", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10018": "vxlan vtep地址对 [主机uuid : %s] 和 [池uuid : %s] 已经存在", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10017": "%s: 不是ipv4", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10016": "ip[%s] l2NetworkUuid[%s] clusterUuid[%s] 该IP在本地vtep中已存在", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10021": "无法创建VNI范围,因为L2 UUID[%s]不属于VXLAN网络池", + "ORG_ZSTACK_ALIYUN_CORE_IDENTITYZONE_10000": "必须在私有阿里云中指定zoneId。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10012": "无效的进程编号[%s],%s 不是数字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10010": "无效的健康检查间隔[%s],%s 不是数字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10011": "无效的最大连接数[%s],%s 不是数字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10016": "无效的健康目标[%s],端口[%s]不是数字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10017": "失败将VIP绑定到负载均衡器,因为VIP[%s]没有IP地址", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10014": "无效的健康检查目标[%s],检查协议[%s]无效,有效协议为 %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10015": "无效的健康目标[%s],端口[%s] 不在范围[1, 65535] 内", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10018": "失败将 IPv4 公网IP绑定到负载均衡器[%s],因为负载均衡器[%s]已有IPv4公网IP", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10009": "失败在KVM宿主机[uuid:%s, 类型:%s]上实现VXLAN网络池[uuid:%s, 类型:%s],因为%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10019": "失败将 IPv6 VIP 挂载到负载均衡器 [%s],因为负载均衡器 [%s] 已经具有 IPv6 VIP", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10004": "失败在KVM宿主机[uuid:%s]上为l2Network[uuid:%s, type:%s, vni:%s]创建桥接[%s],因为%s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10003": "未能在主机[uuid: %s]上找到vtep,请重新将vxlan池[uuid: %s]附加到集群。", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10002": "找到一个主机[uuid:%s]的多个VTEP IP[%s],需要删除该主机并重新添加", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10008": "失败于KVM宿主机[uuid:%s]检查l2VxlanNetworkPool[uuid:%s, name:%s]的CIDR[%s],%s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10007": "失败删除桥接[%s]对于l2网络[uuid:%s, 类型:%s, vni:%s]在kvm主机[uuid:%s]上,因为%s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10006": "失败检查cidr[%s]对于l2VxlanNetwork[uuid:%s, name:%s]在kvm主机[uuid:%s]上,%s", + "ORG_ZSTACK_CRYPTO_CCS_10001": "用户[uuid\u003d%s]未找到", + "ORG_ZSTACK_CRYPTO_CCS_10002": "证书UUID为空且UKey系统标签不存在", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10020": "云中无法删除VIP[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10023": "服务提供商类型不匹配。负载均衡器[uuid:%s]由服务提供商[type:%s]提供,但新的服务提供商是[type:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10024": "存在使用相同端口[%s]和相同负载均衡器[uuid:%s]的监听器", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10022": "无法获取负载均衡监听器 [uuid:%s] 的服务提供商类型", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10027": "无效的网络接口 NIC:%s 权重,%d 不在范围 [%d, %d] 内", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10028": "无法获取候选 vmnic,因为负载均衡器 UUID 和服务器组 UUID 均未指定", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10026": "无效的健康检查参数[%s],格式应为 method:URI:code,例如,GET:/index.html:http_2xx", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10029": "无法获取候选项的L3网络,因为负载均衡器UUID和服务器组UUID均未指定", + "ORG_ZSTACK_CRYPTO_CCS_10008": "证书[uuid\u003d%s]未找到", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10030": "无法分离VM网络接口到负载均衡监听器[uuid:%s],因为监听器的默认服务器组已被删除", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10031": "无法创建负载均衡器,因为 VIP 和 IPv6 VIP 的参数为空", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10034": "负载均衡器VIP [%s] 不能是CIDR中具有公共地址池类型的首个或末尾IP地址", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10035": "云无法创建负载均衡器,因为参数vipUuid指向的VIP[%s]不是IPv4类型", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10032": "无法创建负载均衡器,因为VIP和IPv6 VIP的L3网络不同", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10033": "该 VIP[%s] 已被其他网络服务实体[%s]占用", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10038": "操作失败,在访问控制列表组:%s 中存在重复或重叠的 IP 条目", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10039": "操作失败,IP格式仅支持ip/iprange/cidr,但发现%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10036": "云无法创建负载均衡器,因为参数 ipv6VipUuid 指向的 VIP[%s] 不是ipv6 VIP", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10037": "操作失败,不支持的IP版本 %d", + "ORG_ZSTACK_VPC_HA_10001": "无法更新此网络服务,因为 vpc [uuid:%s] 不支持更新网络服务版本", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10025": "L2网络[uuid:%s] 不是 L2VxLAN类型", + "ORG_ZSTACK_VPC_HA_10002": "无法更新此网络服务,因为 vpc [uuid:%s] 使用了旧内核版本:[%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10024": "vlan[%s] 不是一个有效的vni", + "ORG_ZSTACK_VPC_HA_10003": "无法应用非默认公网的snat,因为多snat功能已被禁用", + "ORG_ZSTACK_VPC_HA_10004": "无法应用此 L3Network 的 snat,因为 l3 网络 [uuid:%s] 不是公共网络", + "ORG_ZSTACK_VPC_HA_10005": "无法应用此L3Network的snat,因为l3网络[uuid:%s]未绑定到vpc路由器", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10029": "系统标签 [%s] 中的 CIDR 格式错误", + "ORG_ZSTACK_VPC_HA_10006": "无效的监控IP地址 [%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10028": "错误系统标签 [%s],应该类似于:[%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10027": "需要输入一个系统标签,例如:[%s]", + "ORG_ZSTACK_VPC_HA_10008": "vpcHaRouter [uuid:%s] 已删除", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10042": "无法绑定类型访问控制列表组[%s],其IP版本与负载均衡器[%s]不同", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10031": "VXLAN网络池不支持创建L3网络", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10040": "IP范围[%s, %s]与访问控制列表组:%s中的起始IP:%s、结束IP:%s存在重叠", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10030": "重叠 vni 范围与 %s [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10045": "重定向访问控制列表组[uuid:%s]只能绑定到负载均衡监听器,必须分配服务器组", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10046": "访问控制列表组[uuid:%s]绑定到负载均衡监听器[uuid:%s]时,该监听器并非HTTPS或HTTP协议", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10043": "领域[%s], URL[%s]与访问控制列表组:%s存在重复/重叠的重定向规则", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10044": "访问控制列表 groups[uuid:%s]用于重定向,但其中有些访问控制列表没有重定向规则却包含IP条目", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10049": "访问控制列表组[uuid:%s]已附加到另一个负载均衡监听器[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10048": "访问控制列表 groups[uuid:%s] 没有重定向规则", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10001": "账户没有VIP节点", + "ORG_ZSTACK_COMPUTE_VM_10239": "CreateVmInstanceMsg 不能为 null", + "ORG_ZSTACK_COMPUTE_VM_10237": "zoneUuid 必须设置,因为该镜像[name:%s, uuid:%s]位于多个备份存储上", + "ORG_ZSTACK_COMPUTE_VM_10236": "在附加到主存储[uuids:%s]的集群中未找到二层网络", + "ORG_ZSTACK_COMPUTE_VM_10235": "主要存储[uuid:%s]在区域[uuid:%s]上未附加任何集群", + "ORG_ZSTACK_COMPUTE_VM_10234": "无法找到与备份存储[uuid:%s, type:%s]可访问的主存储", + "ORG_ZSTACK_COMPUTE_VM_10233": "该图像[uuid:%s]不在任何已附加到区域[uuid:%s]的备份存储中", + "ORG_ZSTACK_COMPUTE_VM_10232": "Spice证书不存在,请检查是否启用了spice tls", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10002": "无法在虚拟路由器网络与私有网络的IP地址重叠时创建虚拟路由器VM", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10001": "失败在KVM宿主机[uuid:%s]删除虚拟路由器启动ISO[%s]时,为UUID:%s的虚拟路由器删除[%s]失败", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10000": "无法在 KVM 主机[uuid:%s, ip:%s]上为虚拟路由器[uuid:%s]创建 VirtualRouterBootstrapIso[%s],因为 %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10005": "虚拟路由器实例提供UUID:%s的网络不能与私有L3网络UUID:%s相同", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10004": "没有找到带有uuid:%s 的虚拟路由器实例", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10009": "无法添加 IP 范围,因为 L3 网络[uuid:%s]是虚拟路由器的管理网络", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10008": "无法添加 IP 范围,因为三层网络[uuid:%s]是虚拟路由器提供的管理网络", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10007": "失败启动 vr l3[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10242": "处理创建 VM 时的 sshkeypair 失败因为 [%s]", + "ORG_ZSTACK_COMPUTE_VM_10241": "处理创建 VM 时的系统标签失败因为 [%s]", + "ORG_ZSTACK_COMPUTE_VM_10240": "实例化虚拟机的系统标签失败因为 %s", + "ORG_ZSTACK_COMPUTE_VM_10249": "cpu 核心数必须是整数", + "ORG_ZSTACK_COMPUTE_VM_10248": "cpuSockets 必须是整数", + "ORG_ZSTACK_COMPUTE_VM_10247": "无效启动设备[%s]在启动顺序中[%s]", + "ORG_ZSTACK_COMPUTE_VM_10246": "系统标签[%s]中存在主机名冲突;曾在L3网络[uuid:%s]上有一个虚拟机[uuid:%s]具有主机名[%s]", + "ORG_ZSTACK_COMPUTE_VM_10245": "只允许一个主机名系统标签,但获得了 %s 个", + "ORG_ZSTACK_COMPUTE_VM_10244": "主机名[%s]在系统标签[%s]中指定不是一个有效的域名名称", + "ORG_ZSTACK_COMPUTE_VM_10243": "无法启用此功能。该VM[uuid:%s]中有多个L3网络的网卡[nic:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10013": "更新虚拟路由器 [uuid:%s] 默认网络失败,因为 %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10012": "失败将虚拟路由器网络服务附加到l3Network[uuid:%s]。当选择端口转发时,也必须选择SNAT", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10011": "失败将虚拟路由器网络服务附加到l3Network[uuid:%s]。当选择弹性IP时,也必须选择SNAT", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10010": "无法添加图像,因为系统标签 [%s] 包含无效的虚拟机镜像类型 [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10017": "虚拟路由器[name:%s, uuid:%s, 当前状态:%s]未运行,并且无法执行所需操作。请在它运行后再重试您的操作。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10015": "失败在虚拟路由器[uuid:%s]同步vips[ips: %s]到热镜像vr时因为%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10014": "无效的 AppliancesVmType %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10000": "无法更改资源拥有者,因为资源[uuid:%s, 类型:VmInstance]已经关联了安全组", + "ORG_ZSTACK_TEST_COMPUTE_HOSTALLOCATOR_10000": "故意", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10019": "虚拟路由器[uuid:%s]没有管理网卡可以对%s发起HTTP调用", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10018": "虚拟路由器[uuid:%s]处于无法对%s进行HTTP调用的状态:%s", + "ORG_ZSTACK_COMPUTE_VM_10253": "只允许一个启动模式系统标签,但获取到了 %d 个", + "ORG_ZSTACK_COMPUTE_VM_10252": "不应该有一个VM有多个userdata系统标签。", + "ORG_ZSTACK_COMPUTE_VM_10251": "已经为虚机[uuid: %s]分配了一个用户数据系统标签。", + "ORG_ZSTACK_COMPUTE_VM_10250": "cpuThreads 必须是整数", + "ORG_ZSTACK_COMPUTE_VM_10259": "无效的 usbRedirect[%s], %s 不是 usbRedirect 标签", + "ORG_ZSTACK_COMPUTE_VM_10258": "无效的 %s[%s],值 [%s] 不是布尔值", + "ORG_ZSTACK_COMPUTE_VM_10257": "无效的 %s 标签[%s]", + "ORG_ZSTACK_COMPUTE_VM_10256": "虚拟机类型要求为[q35, pc, virt],但获取到[%s]", + "ORG_ZSTACK_COMPUTE_VM_10254": "[%s] 在系统标签 [%s] 中指定的启动模式无效", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10020": "无法将网卡[ip:%s, ip6:%s, mac:%s]添加到虚拟路由器VM[uuid:%s ip:%s],因为%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10024": "无法设置默认网络,因为l3 uuid[:%s]是管理网络", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10023": "l3 uuid[:%s] 没有绑定到虚拟路由器 [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10022": "l3 uuid[:%s] 与虚拟路由器 [uuid:%s] 的默认网络相同", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10021": "无法将服务器IP添加到负载均衡服务器组,因为共享负载均衡器没有服务提供商,请先添加vmnic", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10010": "无法创建VIP,因为无法确定VIP版本", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10012": "服务提供商 của vip[uuid:%s, name:%s, ip: %s] 已被设置为 %s", + "ORG_ZSTACK_TICKET_EXECUTOR_10001": "从事件获取值失败:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10025": "无法设置默认网络,因为 l3 uuid[:%s] 不是公共网络", + "ORG_ZSTACK_TICKET_EXECUTOR_10000": "在 API 类中未找到名称为[%s]的类", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10016": "无法设置 VM 网卡安全组,因为网卡[UUID:%s]未绑定到任何安全组", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10015": "无法设置 VM 网卡安全组,因为未找到网卡[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10007": "requiredIp[%s] 不在有效的IPv4 mediaType 中", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10018": "无法设置VM网卡安全组,因为优先级无效,优先级[%d]不能小于1", + "ORG_ZSTACK_COMPUTE_10003": "VM NIC 的出站带宽[%d]超出[8192, 32212254720]范围", + "ORG_ZSTACK_COMPUTE_VM_10264": "vm[uuid:%s, name:%s] 已被删除", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10017": "无法设置VM网卡安全组,因为安全组[UUID:%s]未找到", + "ORG_ZSTACK_COMPUTE_10004": "入站带宽[%d]超出[8192, 32212254720]范围", + "ORG_ZSTACK_COMPUTE_VM_10263": "资源[uuid:%s]是一个根磁盘,您无法更改其所有者,而是更改属于该根磁盘的虚拟机的所有者", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10009": "必需的 IP 地址 [%s] 已经被使用", + "ORG_ZSTACK_COMPUTE_10001": "VM NIC 的 l3NetworkUuid 不能为 null", + "ORG_ZSTACK_COMPUTE_VM_10262": "rootDiskOfferingUuid 在创建不使用镜像的虚拟机时不能为 null", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10008": "已经在 l3Network[uuid:%s] 上存在一个 vip[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10019": "无法设置VM NIC安全组,因为优先级重复,两个安全组%s和%s的优先级均为%d", + "ORG_ZSTACK_COMPUTE_10002": "vm 的 nic 的 l3NetworkUuid 不在 l3[%s] 中", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10003": "无法删除IP,因为IP[uuid:%s]是一个VIP", + "ORG_ZSTACK_COMPUTE_VM_10260": "无效的usbRedirect[%s],%s 不是布尔类型", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10002": "VIP 无法由此账号访问", + "ORG_ZSTACK_COMPUTE_10000": "重复的网络接口参数", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10005": "不支持的 IP 分配策略[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10004": "系统VIP不能通过API消息删除", + "ORG_ZSTACK_COMPUTE_VM_10269": "该虚拟机[UUID:%s]在L3网络[UUID:%s]上没有网卡", + "ORG_ZSTACK_COMPUTE_10007": "vm nic驱动程序 %s 还不支持", + "ORG_ZSTACK_COMPUTE_VM_10268": "获取到了主机[uuid:%s]上vm[uuid:%s]的未知状态", + "ORG_ZSTACK_COMPUTE_VM_10267": "未能检查宿主机[uuid:%s]上vm[uuid:%s]的状态,%s", + "ORG_ZSTACK_COMPUTE_10005": "vm nic 的多队列数[%d]超出了[1,256]范围", + "ORG_ZSTACK_COMPUTE_10006": "L3[uuid:%s] 虚拟机网卡状态[%s] 不是 %s 或 %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10031": "无法创建虚拟路由器报价,因为管理网络尚不支持IPv6", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10030": "管理网络[uuid:%s]不在相同的区域[uuid:%s]此配置将创建的区域是:zone[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10035": "三层网络[UUID: %s]启用了SNAT服务,无法用作管理网络", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10034": "图像[uuid:%s]的格式为%s,无法用于虚拟路由器", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10033": "image[uuid:%s]\u0027s mediaType is %s, the mediaType of a virtual router image must be %s\" 翻译成中文为:\n\n\"image[uuid:%s] 的媒体类型是 %s,虚拟路由器图像的媒体类型必须是 %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10032": "公共网络[uuid:%s]不在相同的区域[uuid:%s]此配置将创建的区域是:[uuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10087": "该镜像[uuid:%s, 名称:%s]已在所有备份存储上被删除", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10039": "管理网络[uuid:%s,网关:%s]不可达", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10038": "管理网络[uuid:%s]没有任何IP范围", + "ORG_ZSTACK_STORAGE_VOLUME_10086": "主要存储类型 [%s] 还不支持共享卷", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10037": "三层网络[uuid: %s]与[uuid: %s]具有相同的网络地址,无法用于虚拟路由器", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10036": "三层网络[UUID: %s]启用了SNAT服务,无法用作公共网络", + "ORG_ZSTACK_STORAGE_VOLUME_10088": "无法找到一个备份存储,该存储满足以下条件的镜像[uuid:%s]:1. 状态为启用 2. 状态为连接中 3. 已附加到主存储所在的区域[uuid:%s]所在区域中。", + "ORG_ZSTACK_STORAGE_VOLUME_10083": "重复的卷UUID:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10082": "无法撤销非最新快照", + "ORG_ZSTACK_STORAGE_VOLUME_10085": "获取主存储 %s 类型失败", + "ORG_ZSTACK_STORAGE_VOLUME_10092": "目标磁盘在创建过程中被清空", + "ORG_ZSTACK_STORAGE_VOLUME_10091": "主存储 UUID 冲突,由磁盘配置指定的主存储是 %s,而创建参数中指定的主存储是 %s", + "ORG_ZSTACK_STORAGE_VOLUME_10093": "there_should_not_be_more_than_one_%s_implementation.", + "ORG_ZSTACK_STORAGE_VOLUME_10096": "无法将ISO下载到主存储,因为:%s", + "ORG_ZSTACK_ZDFS_10000": "ping zdfs 失败, %s", + "ORG_ZSTACK_COMPUTE_VM_10204": "无效的 JSON 格式,原因:%s", + "ORG_ZSTACK_COMPUTE_VM_10203": "l3NetworkUuids 和 vmNicInventories 不能同时为空或同时设置", + "ORG_ZSTACK_COMPUTE_VM_10200": "卷[uuid:%s]无法满足条件[state:启用 status:就绪]", + "ORG_ZSTACK_COMPUTE_VM_10219": "因为已弃用,所以无法调用此API", + "ORG_ZSTACK_COMPUTE_VM_10218": "无法更新 VM[uuid:%s] 的控制台密码,因为当前未设置控制台密码。", + "ORG_ZSTACK_ZDFS_10002": "在存在主机名[%s]的zdfs中有问题", + "ORG_ZSTACK_ZDFS_10001": "连接 ZDFS 失败, %s", + "ORG_ZSTACK_COMPUTE_VM_10217": "无法更新 VM[uuid:%s] 的控制台密码,因为其不在“运行”状态。当前状态是 \u0027%s\u0027。", + "ORG_ZSTACK_COMPUTE_VM_10216": "控制台密码不能以 \"password\" 开头,这可能会触发 VNC 安全问题", + "ORG_ZSTACK_COMPUTE_VM_10215": "不允许挂载重复的ISO文件", + "ORG_ZSTACK_COMPUTE_VM_10214": "该图像[uuid\u003d%s]不存在", + "ORG_ZSTACK_COMPUTE_VM_10220": "CD-ROM[%s] 已是默认值", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10002": "主机名不能为null", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10000": "设施不能为 null", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10001": "无效的服务设施 %s", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10006": "日志服务器[地址: %s]不可用", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10007": "日志服务器[地址: %s:%s]不可用", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10004": "协议不能为 null", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10005": "不支持的协议 %s", + "ORG_ZSTACK_COMPUTE_VM_10228": "预期单播MAC地址,发现组播MAC地址 [%s]", + "ORG_ZSTACK_COMPUTE_VM_10227": "不允许的地址", + "ORG_ZSTACK_COMPUTE_VM_10226": "不是一个有效的MAC地址 [%s]", + "ORG_ZSTACK_COMPUTE_VM_10225": "这不是一个有效的MAC地址 [%s]", + "ORG_ZSTACK_COMPUTE_VM_10224": "cpu拓扑不正确,cpuNum[%s],配置的cpuSocket数[%s],cpuCore数[%s],cpu线程数[%s];计算得到的cpuSocket数[%s],cpuCore数[%s],cpu线程数[%s]", + "ORG_ZSTACK_COMPUTE_VM_10221": "vm[uuid:%s] 只能在运行状态时进行 fstrim,当前状态是 %s", + "ORG_ZSTACK_STORAGE_VOLUME_10046": "该磁盘[uuid:%s]不在已删除状态。此操作是用于恢复一个已删除的数据卷", + "ORG_ZSTACK_STORAGE_VOLUME_10049": "图像[uuid:%s]未启用,它的是%s", + "ORG_ZSTACK_STORAGE_VOLUME_10048": "图像[uuid:%s]不是%s,而是%s", + "ORG_ZSTACK_STORAGE_VOLUME_10042": "卷[uuid:%s]不在启用状态,当前状态为%s,无法创建快照", + "ORG_ZSTACK_STORAGE_VOLUME_10045": "卷[uuid:%s]不在Ready状态,当前状态为%s,无法创建快照", + "ORG_ZSTACK_STORAGE_VOLUME_10044": "无法获取内存快照,vm当前状态[%s],但期望状态为[%s, %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10041": "卷[uuid:%s, 类型:%s], 无法创建快照", + "ORG_ZSTACK_LOGIN_10022": "无效属性。属性[%s]是必需的,但发现有记录[%s]不匹配", + "ORG_ZSTACK_LOGIN_10024": "策略是必填字段%", + "ORG_ZSTACK_LOGIN_10023": "无效的 JSON 格式", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10007": "keyLabel %s 和 encryptResult %s 不一致", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10006": "flkSec 安全机器不健康: %s", + "ORG_ZSTACK_LOGIN_10029": "名称应使用 %s 中的值", + "ORG_ZSTACK_LOGIN_10026": "属性是必填字段 %", + "ORG_ZSTACK_LOGIN_10025": "名称是必填字段 %", + "ORG_ZSTACK_LOGIN_10028": "可选字段 % 是必填项", + "ORG_ZSTACK_LOGIN_10027": "类型是必填字段 %", + "ORG_ZSTACK_STORAGE_VOLUME_10058": "该磁盘[uuid:%s, name:%s]是根磁盘,无法挂接它", + "ORG_ZSTACK_STORAGE_VOLUME_10057": "虚拟机[uuid:%s]不支持在线挂载磁盘[%s],因为该虚拟机的镜像平台类型为其他类型", + "ORG_ZSTACK_STORAGE_VOLUME_10059": "数据卷[uuid:%s]已禁用,无法挂载", + "ORG_ZSTACK_STORAGE_VOLUME_10054": "数据卷[uuid:%s]未绑定到任何虚拟机,无法解绑", + "ORG_ZSTACK_STORAGE_VOLUME_10053": "卷[uuid:%s]的状态为[%s],仅当状态为%s或%S时才能挂载数据卷", + "ORG_ZSTACK_STORAGE_VOLUME_10056": "该卷[uuid:%s, 名称:%s, 类型:%s]无法脱离挂载", + "ORG_ZSTACK_CORE_PLUGIN_10001": "插件[%s]的名称、产品密钥和供应商不能为null", + "ORG_ZSTACK_STORAGE_VOLUME_10055": "为了分离可共享数据卷[uuid:%s],需要提供虚拟机的uuid。", + "ORG_ZSTACK_STORAGE_VOLUME_10050": "图像[uuid:%s] 不处于就绪状态,它处于%s", + "ORG_ZSTACK_STORAGE_VOLUME_10052": "卷[uuid:%s]处于状态[%s],只有在状态为%s时才能挂载数据卷", + "ORG_ZSTACK_STORAGE_VOLUME_10051": "卷[uuid:%s]是根卷,不能附加到VM上", + "ORG_ZSTACK_LOGIN_10011": "验证 dn [%s] 失败,可能已被删除", + "ORG_ZSTACK_CORE_PLUGIN_10000": "未知产品插件名称: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10069": "卷[uuid:%s, 类型:%s]无法被删除", + "ORG_ZSTACK_STORAGE_VOLUME_10068": "意外的磁盘大小设置", + "ORG_ZSTACK_STORAGE_VOLUME_10065": "无法将磁盘附加到虚拟机,没有合适的集群", + "ORG_ZSTACK_STORAGE_VOLUME_10064": "数据卷[uuid:%s]具有格式[%s],仅能附加到hypervisor[%s]类型上,但vm的hypervisor类型为[%s]。无法附加", + "ORG_ZSTACK_RESOURCECONFIG_10009": "账户无权访问资源[uuid: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10067": "不允许备份根卷,uuid:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10066": "无法将磁盘附加到在[uuid: %s]主机上运行的vm,该主机与磁盘存储[uuid: %s]断开连接", + "ORG_ZSTACK_STORAGE_VOLUME_10061": "数据卷[uuid:%s]已附加到某些VM,无法再次附加", + "ORG_ZSTACK_IAM2_ATTRIBUTE_10000": "属性[name:%s]是一个系统属性,无法更新", + "ORG_ZSTACK_NETWORK_OVN_10074": "OVN SDN 控制器[uuid:%s, name:%s] 处于断开连接状态,无法添加主机[uuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10060": "该磁盘[uuid:%s]的状态为已删除,无法执行此操作", + "ORG_ZSTACK_NETWORK_OVN_10073": "失败将逻辑交换机[uuid:%s, name:%s]添加到ovn控制器[uuid:%s, ip:%s],因为%s", + "ORG_ZSTACK_STORAGE_VOLUME_10063": "数据卷[uuid:%s]的格式[%s]不支持挂载到任何虚拟机监控程序。", + "ORG_ZSTACK_STORAGE_VOLUME_10062": "数据卷只能在状态为 [%s, %s] 时挂接,当前状态是 %s", + "ORG_ZSTACK_NETWORK_OVN_10071": "失败将逻辑交换机同步至ovn控制器[uuid:%s, ip:%s],因为%s", + "ORG_ZSTACK_LOGIN_10000": "ZStack 现在正在从数据库加载ldap组织信息,无法执行同步操作", + "ORG_ZSTACK_NETWORK_OVN_10078": "NfvInst[uuid:%s] 未找到", + "ORG_ZSTACK_NETWORK_OVN_10077": "L2网络[uuid:%s]未连接OVN控制器", + "ORG_ZSTACK_NETWORK_OVN_10076": "未能从 ovn 控制器删除逻辑交换端口[uuid:%s, ip:%s],因为 %s", + "ORG_ZSTACK_STORAGE_VOLUME_10070": "卷[uuid:%s]已处于删除状态", + "ORG_ZSTACK_LOGIN_10001": "失败同步ldap条目[], 因为 %s", + "ORG_ZSTACK_NETWORK_OVN_10075": "失败将逻辑交换机端口添加到 OVN 控制器[uuid:%s, ip:%s],因为 %s", + "ORG_ZSTACK_V2V_10037": "主机[uuid:%s]未连接", + "ORG_ZSTACK_V2V_10038": "主要存储[uuid%s]未连接", + "ORG_ZSTACK_V2V_10035": "无法为转换主机[uuid:%s]预留 %s 字节,可用容量不足", + "ORG_ZSTACK_NETWORK_OVN_10079": "NfvInstGroup[uuid:%s] 未找到", + "ORG_ZSTACK_LOGIN_10008": "验证 uid[%s] 失败,可能已被删除", + "ORG_ZSTACK_LOGIN_10007": "无法同步范围不是%s的LDAP/AD服务器", + "ORG_ZSTACK_V2V_10031": "无效的v2v服务质量系统标签", + "ORG_ZSTACK_V2V_10032": "无效的网络带宽[%s],它必须大于或等于1048576", + "ORG_ZSTACK_LOGIN_10009": "失败为 uid[%s] 创建 iam2 虚拟 id,因为 %s", + "ORG_ZSTACK_LOGIN_10004": "同步 LDAP 组织失败", + "ORG_ZSTACK_BAREMETAL2_10001": "无效的IPMI机箱配置:当提供\"provisionIp\"时,\"reboot\"必须为\"No\"", + "ORG_ZSTACK_V2V_10030": "存在一个主机Uuid为%s的版本2到版本2转换主机", + "ORG_ZSTACK_BAREMETAL2_10002": "无效的IPMI机箱配置:\u0027platform\u0027必须为\u0027Linux\u0027当提供了\u0027provisionIp\u0027时", + "ORG_ZSTACK_LOGIN_10006": "失败同步组织信息,因为 %s", + "ORG_ZSTACK_LOGIN_10005": "转换ldap条目到组织节点失败", + "ORG_ZSTACK_BAREMETAL2_10000": "无效的IPMI机箱配置:当提供了\u0027provisionIp\u0027时,\u0027provisionType\u0027必须为\u0027Direct\u0027\"", + "ORG_ZSTACK_STORAGE_VOLUME_10079": "无法分离磁盘[%s]与宿主机。它可能已被分离", + "ORG_ZSTACK_STORAGE_VOLUME_10076": "无法将磁盘[%s]挂载到主机[%s],因为该磁盘已挂载到主机[%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10075": "挂载路径必须是绝对路径", + "ORG_ZSTACK_NETWORK_OVN_10080": "NfvInstGroup[uuid:%s] 没有配置VIP", + "ORG_ZSTACK_STORAGE_VOLUME_10078": "无法将磁盘[%s]挂载到主机[%s],因为另一个磁盘占用了挂载路径[%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10077": "无法将磁盘[%s]挂载到宿主机[%s],因为磁盘[%s]占用了宿主机[%s]上的挂载路径[%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10072": "不允许更改根卷的状态,uuid:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10071": "无法删除卷[%s],因为该卷已挂载至主机[%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10074": "无法将磁盘[%s]挂载到主机[%s],因为主机[状态:%s]未连接", + "ORG_ZSTACK_NETWORK_OVN_10083": "失败于更新 NfvInst[uuid:%s] 的 OVN 集群节点,因为 %s", + "ORG_ZSTACK_STORAGE_VOLUME_10073": "不能更改卷[%s]的状态,因为该卷已挂载到主机[%s]", + "ORG_ZSTACK_NETWORK_OVN_10082": "在 NfvInstGroup[uuid:%s] 中未找到满足集群配置的实例", + "ORG_ZSTACK_RESOURCECONFIG_10002": "资源配置 [类别:%s, 名称:%s] 无法绑定到资源类型: %s", + "ORG_ZSTACK_RESOURCECONFIG_10001": "无法找到资源[uuid: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10081": "无法在卷[uuid: %s]使用的快照树中找到", + "ORG_ZSTACK_V2V_10028": "无法找到源虚拟机的类型[url:%s]", + "ORG_ZSTACK_RESOURCECONFIG_10000": "资源的 resourceTypes 不一致。详情: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10080": "无法压平可共享卷[uuid:%s]", + "ORG_ZSTACK_V2V_10029": "无法找到源VM工厂[url:%s, 虚拟化类型:%s]", + "ORG_ZSTACK_RESOURCECONFIG_10007": "全局配置[类别:%s, 名称:%s]无法绑定资源", + "ORG_ZSTACK_V2V_10026": "无法找到 L3Network[uuid:%s] 以启动当前虚拟机,它可能已被删除,操作建议:删除此虚拟机,重新创建一个新的虚拟机", + "ORG_ZSTACK_RESOURCECONFIG_10006": "没有全局配置[类别:%s, 名称:%s]找到", + "ORG_ZSTACK_V2V_10024": "不是清理的时候", + "ORG_ZSTACK_V2V_10025": "转换主机[uuid:%s, 主机Uuid:%s]未连接", + "ORG_ZSTACK_V2V_10022": "有一些从版本2到版本2的转换任务正在进行中。无法从主机[%s]detach卷[%s]", + "ORG_ZSTACK_V2V_10020": "主存储[uuid:%s]既未启用也未连接", + "ORG_ZSTACK_V2V_10021": "有一些版本为2的迁移任务正在进行中。无法将磁盘[%s]附加到主机[%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10007": "io线程需要qemu版本 \u003e\u003d %s,但主机[%s]的版本为 %s。", + "ORG_ZSTACK_STORAGE_VOLUME_10009": "根卷[%s]无法设置io线程绑定。", + "ORG_ZSTACK_STORAGE_VOLUME_10008": "io线程需要libvirt版本 \u003e\u003d %s,但主机[%s]上的版本是 %s。", + "ORG_ZSTACK_STORAGE_VOLUME_10003": "当前主要存储 %s 不是 Ceph 类型,无法获取访问路径", + "ORG_ZSTACK_STORAGE_VOLUME_10005": "当前主要存储类型不支持块卷,支持类型有%s", + "ORG_ZSTACK_STORAGE_VOLUME_10004": "Ceph 类型的块卷访问路径 ID,accessPathIqn 不能为 null", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10000": "JitClientFactory 测试连接失败", + "ORG_ZSTACK_SSO_CAS_FILTER_10000": "URL格式错误,客户端UUID缺失", + "ORG_ZSTACK_SSO_CAS_FILTER_10001": "缺少cas客户端,请在单点登录前创建cas客户端", + "ORG_ZSTACK_COMPUTE_VM_10275": "VM[uuid:%s] 的状态不是运行中。", + "ORG_ZSTACK_CONSOLE_10011": "控制台代理未连接;大多数情况下是管理节点刚刚启动,请等待控制台代理连接,或者如果长时间断开连接,您可以手动重新连接。", + "ORG_ZSTACK_CONSOLE_10010": "vm[uuid:%s] 不处于 %s 状态,当前状态是 %s", + "ORG_ZSTACK_COMPUTE_VM_10273": "从根卷[uuid:%s]在主存储[uuid:%s]上创建模板失败", + "ORG_ZSTACK_COMPUTE_VM_10270": "云主机已被删除", + "ORG_ZSTACK_CONSOLE_10013": "控制台代理[uuid: %s, 状态: %s]在代理[ip: %s]上未连接,无法删除它", + "ORG_ZSTACK_CONSOLE_10012": "无法找到VM[uuid:%s]的主机IP地址,VM运行了吗???", + "ORG_ZSTACK_COMPUTE_VM_10279": "失败在宿主机上更新虚拟机[uuid\u003d%s]:某些属性的修改失败", + "ORG_ZSTACK_COMPUTE_VM_10278": "失败在宿主机上更新虚机[uuid\u003d%s]。", + "ORG_ZSTACK_COMPUTE_VM_10277": "ISO[uuid:%s] 处于不兼容的备份存储上,而该虚拟机[name:%s, uuid:%s]位于主要存储[uuid:%s]上", + "ORG_ZSTACK_COMPUTE_VM_10276": "无法更新虚拟机[uuid:%s]的控制台密码,该虚拟机未在任何主机上运行", + "ORG_ZSTACK_STORAGE_VOLUME_10018": "无法调整卷[%s]的大小,因为卷状态为禁用", + "ORG_ZSTACK_STORAGE_VOLUME_10017": "卷[uuid:%s]不是数据卷", + "ORG_ZSTACK_STORAGE_VOLUME_10019": "至少应设置 vmInstanceUuid 或 uuid 中的一个", + "ORG_ZSTACK_STORAGE_VOLUME_10014": "不支持在不同的虚拟机[uuid:%s, uuid:%s]上对卷[uuid:%s, uuid:%s]进行快照操作", + "ORG_ZSTACK_STORAGE_VOLUME_10013": "卷[uuid:%s]未找到", + "ORG_ZSTACK_STORAGE_VOLUME_10016": "VM[%s]的状态为%s,不允许创建快照", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10013": "jit 安全机器不健康: socket 连接到 %s:%s 失败", + "ORG_ZSTACK_STORAGE_VOLUME_10015": "卷[uuid:%s]尚未就绪", + "ORG_ZSTACK_STORAGE_VOLUME_10010": "当前 I/O 线程 ID[%s] 与附加卷[%s] 的 I/O 线程[%s] 不相同。", + "ORG_ZSTACK_STORAGE_VOLUME_10012": "快照验证不支持对于卷[uuid: %s]。附加的虚拟机不在状态[%s, %s]中", + "ORG_ZSTACK_STORAGE_VOLUME_10011": "快照验证不支持对于挂载有UUID:%s的卷。卷应该挂载在VM上", + "ORG_ZSTACK_CONSOLE_10000": "Ansible 私有密钥未找到。", + "ORG_ZSTACK_COMPUTE_VM_10285": "失败于解绑VM[uuid\u003d%s]的卷[uuid\u003d%s]", + "ORG_ZSTACK_COMPUTE_VM_10284": "从卷中分离卷在虚拟机[uuid\u003d%s]处于状态[%s]时不允许", + "ORG_ZSTACK_COMPUTE_VM_10283": "ISO[uuid:%s] 没有附接到 VM[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10282": "在虚拟机[uuid\u003d%s]于宿主机上的更新失败:部分属性的修改失败", + "ORG_ZSTACK_CONSOLE_10004": "失败重连控制台代理", + "ORG_ZSTACK_COMPUTE_VM_10281": "失败在hypervisor上更新vm[uuid\u003d%s]", + "ORG_ZSTACK_CONSOLE_10003": "配置控制台代理绕过IP[code:%d]或控制台代理端口[code:%d]失败", + "ORG_ZSTACK_COMPUTE_VM_10280": "无法创建 VM,名称为 [%s] 的 VM 已经存在", + "ORG_ZSTACK_CONSOLE_10002": "其他进程正在使用该端口:%s", + "ORG_ZSTACK_CONSOLE_10001": "无效的管理节点UUID[%s]", + "ORG_ZSTACK_CONSOLE_10008": "无法检查控制台代理可用性,因为 %s", + "ORG_ZSTACK_CONSOLE_10007": "建立 VNC: 非预期的 uri: %s", + "ORG_ZSTACK_COMPUTE_VM_10288": "一个虚拟机不能创建 %s 张光盘,虚拟机只能添加 %s 张光盘", + "ORG_ZSTACK_CONSOLE_10009": "操作错误,因为:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10029": "扩展操作不允许在主机禁用时进行", + "ORG_ZSTACK_STORAGE_VOLUME_10028": "最小增加大小应大于4MB", + "ORG_ZSTACK_STORAGE_VOLUME_10025": "无法同时设置读写和总带宽限制。", + "ORG_ZSTACK_STORAGE_VOLUME_10024": "无法同时设置读写和总IOPS限制。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10023": "在使用 jit 安全机器获取属性时未处理异常:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10027": "无法缩小 [%s] 卷[uuid:%s]的大小", + "ORG_ZSTACK_STORAGE_VOLUME_10026": "磁盘带宽不能为 null,必须给出一个磁盘带宽值。", + "ORG_ZSTACK_STORAGE_VOLUME_10021": "卷[uuid:%s]不是根卷", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10022": "jit安全机器获取属性失败,状态码:%s,详情:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10020": "没有找到对应的卷[uuid:%s, vmInstanceUuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10023": "无法同时设置legacy参数和新参数", + "ORG_ZSTACK_STORAGE_VOLUME_10022": "共享卷无法设置带宽。", + "ORG_ZSTACK_COMPUTE_VM_10293": "无法获取 %s 的图像大小,请报告异常。", + "ORG_ZSTACK_STORAGE_VOLUME_10035": "仅支持分离磁盘,请使用 SetVmBootVolumeMsg 代替。", + "ORG_ZSTACK_ZWATCH_PROMETHEUS_10000": "主机[uuid:%s]在数据库中未找到", + "ORG_ZSTACK_STORAGE_VOLUME_10038": "hypervisor[%s] 对单个 VM 只允许挂载最多 %s 个数据卷;当前已挂载了 %s 个数据卷至 vm[uuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10032": "无法找到镜像缓存[imageUuid: %s]用于重新初始化卷", + "ORG_ZSTACK_STORAGE_VOLUME_10031": "共享卷[uuid: %s]已附加到未停止的虚拟机实例[uuids: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10034": "卷[uuid%s]应该已挂接。", + "ORG_ZSTACK_STORAGE_VOLUME_10033": "该磁盘[uuid:%s, name:%s]尚未删除,无法执行删除操作", + "ORG_ZSTACK_STORAGE_VOLUME_10030": "扩展操作不允许在所有主机禁用的情况下执行", + "ORG_ZSTACK_LOGIN_10033": "系统中不存在 LDAP/AD 服务器,请先添加一个 LDAP/AD 服务器。", + "ORG_ZSTACK_LOGIN_10032": "不能将此ldap uid %s 绑定到虚拟id [uuid:%s]", + "ORG_ZSTACK_LOGIN_10034": "这个 UID 已经被使用", + "ORG_ZSTACK_LOGIN_10030": "无效属性。属性[%s]是必需的,但发现有一些记录未匹配", + "ORG_ZSTACK_STORAGE_CDP_10091": "无效的最大容量[%d], 当前使用量为%d", + "ORG_ZSTACK_STORAGE_CDP_10089": "主机名未找到[用于备份存储的UUID: %s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10009": "加密功能已启用,但自动登录所需资源池[%s]未设置。", + "ORG_ZSTACK_SSO_SAML2_10001": "IdP元数据无效(Base64解码为空)。", + "ORG_ZSTACK_SSO_SAML2_10002": "从Base64解码IdP元数据失败", + "ORG_ZSTACK_SSO_SAML2_10000": "IdP元数据为空。", + "ORG_ZSTACK_ZSV_10002": "在操作快照组之前,请先分离共享卷或LUN设备", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10000": "没有为安全机器[模型\u003d%s]配置客户端", + "ORG_ZSTACK_ZSV_10001": "卷 %s 仍具有快照组,无法删除它", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10001": "没有安全机器客户端工厂用于安全机器[type\u003d%s]", + "ORG_ZSTACK_ZSV_10000": "卷 %s 仍存在针对 VM %s 的快照组,无法挂载到其他 VM", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10002": "安全机器管理器实现 安全机器加密失败", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_HTTP_10001": "HTTP 模板保存错误,请检查模板文本:%s", + "ORG_ZSTACK_STORAGE_CDP_10097": "创建虚拟机任务已取消", + "ORG_ZSTACK_STORAGE_CDP_10095": "撤销任务已取消", + "ORG_ZSTACK_ACCESSKEY_10002": "[账号ID: %s, 用户ID: %s] 不是有效的账号或IAM2项目/用户", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10019": "无法连接到机箱 [uuid:%s],请检查IPMI连接。", + "ORG_ZSTACK_ACCESSKEY_10001": "如果指定的 Accesskey 是预期的,则必须同时提供 AccesskeyId 和 AccesskeySecret。", + "ORG_ZSTACK_ACCESSKEY_10004": "访问密钥数量对于[账户ID: %s, 用户ID: %s]超过最大值", + "ORG_ZSTACK_ACCESSKEY_10000": "没有权限执行该操作 [accountUuid:%s, userUuid:%s]", + "ORG_ZSTACK_TEST_10008": "我不应该在错误列表中", + "ORG_ZSTACK_TEST_10009": "我也不应该在错误列表中。", + "ORG_ZSTACK_TEST_10006": "已完成,故意如此", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10020": "从文件加载机箱信息失败,因为:%s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10029": "另一个连接安全机器任务正在运行,请取消新的任务并等待返回", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10026": "安全机器已禁用,无法检测心跳", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10027": "%s 心跳检测失败", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10028": "%s 心跳检测异常", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10021": "解密数据[%s]或算法类型[%s]为空", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10022": "无效解密算法类型: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10024": "无法删除。在启用加密功能后,资源池中提供该服务的同步安全机器的数量至少为1台", + "ORG_ZSTACK_TEST_10004": "我也不应该出现在错误列表中%d", + "ORG_ZSTACK_TEST_10005": "故意 %d", + "ORG_ZSTACK_SNS_SYSTEM_10002": "API 主题无法被删除", + "ORG_ZSTACK_TEST_10003": "我不应该出现在错误列表 %d 中", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10019": "未知加密类型[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10014": "无法找到密钥资源池 [%s] 的模型", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10015": "当前状态[%s]不允许手动修改状态", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10016": "当加密功能启用时,无法禁用所有安全虚拟机", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10017": "检查是否为身份验证设置了资源池 UUID", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10010": "加密功能已启用但数据保护所需的资源池[%s]未设置。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10013": "检查模型[%s]类型[%s]客户端及所有服务器可用性异常", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10003": "ssh 失败", + "ORG_ZSTACK_AI_VM_10006": "无法找到模型服务实例组[uuid: %s],保存模型服务实例失败", + "ORG_ZSTACK_AI_VM_10007": "虚拟机实例、配置YAML或服务YAML为空,模型服务部署上下文:%s", + "ORG_ZSTACK_AI_VM_10008": "部署上下文或虚拟机实例 %s 为空", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10000": "无法复制 %s 到 %s,原因: %s", + "ORG_ZSTACK_AI_VM_10009": "取消任务失败,%s", + "ORG_ZSTACK_SNS_SYSTEM_10000": "系统告警主题无法被删除", + "ORG_ZSTACK_AI_VM_10002": "无法在默认L3网络[uuid: %s]中找到vm网卡的IP地址,而该地址对于分布式模型服务是必需的", + "ORG_ZSTACK_SNS_SYSTEM_10001": "只有 HTTP 终端点可以订阅 API 主题,该终端点[类型:%s]不是 HTTP 终端点", + "ORG_ZSTACK_AI_VM_10003": "模型服务会话不能为null", + "ORG_ZSTACK_AI_VM_10004": "无法从模型服务解析 YAML,服务 YAML: %s", + "ORG_ZSTACK_AI_VM_10000": "无法找到图像 [uuid: %s]", + "ORG_ZSTACK_AI_VM_10001": "无法从yaml获取imageUuid: %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10015": "The network[%s] has been added into the haGroup[%s]", + "ORG_ZSTACK_ROUTEPROTOCOL_10014": "The network[%s] has been added into the virtual router area[%s]", + "ORG_ZSTACK_ROUTEPROTOCOL_10017": "路由器ID[%s]在该系统中不是唯一的", + "ORG_ZSTACK_ROUTEPROTOCOL_10016": "路由器ID[%s]未格式化为IPv4地址", + "ORG_ZSTACK_AI_VM_10011": "无法从带有空URL的实例获取状态,报告失败", + "ORG_ZSTACK_HYBRID_BACKUP_10000": "%s 只能由管理员账号调用", + "ORG_ZSTACK_EXTERNALSERVICE_CRONJOB_10001": "crond 没有运行", + "ORG_ZSTACK_ROUTEPROTOCOL_10003": "[%s] 不符合IPv4地址格式", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10030": "检查所有安全机器令牌同步失败", + "ORG_ZSTACK_ROUTEPROTOCOL_10008": "区域ID[%s]已创建", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10031": "FlkSecClientFactory 测试连接失败", + "ORG_ZSTACK_ROUTEPROTOCOL_10009": "KeyID 和密码必须在认证类型为 %s 时不为 null", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10027": "生成安全机器 %s 的数据保护令牌因为 %s 失败", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10029": "失败获取安全机器 %s 的加密结果因为 %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10011": "当认证类型是 %s 时,密码长度最多为 8 字节", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10028": "生成安全机器 %s 的 hmac token 失败,因为 %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10010": "密码在身份验证类型为 %s 时必须不为空", + "ORG_ZSTACK_ROUTEPROTOCOL_10013": "所有网络都应位于虚拟路由器[%s]中", + "ORG_ZSTACK_ROUTEPROTOCOL_10012": "区域ID[%s]的类型必须为%s", + "ORG_ZSTACK_ALIYUN_IDENTITYZONE_10000": "没有找到身份验证信息", + "ORG_ZSTACK_STORAGE_CDP_10005": "备份存储[uuid: %s]已经删除", + "ORG_ZSTACK_STORAGE_CDP_10001": "kvm代理无响应 %d 次", + "ORG_ZSTACK_STORAGE_CDP_10004": "在 CDP 任务[uuid: %s]中未找到任何 VM", + "ORG_ZSTACK_STORAGE_CDP_10000": "KVM代理重启了", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10011": "硬件 VXLAN 网络只能在硬件 VXLAN 池中创建", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10010": "只有硬件 VXLAN 网络可以在硬件 VXLAN 池中创建", + "ORG_ZSTACK_STORAGE_CDP_10016": "主机[uuid: %s]上的libvirt不支持创建cdp任务,请检查libvirt的版本。", + "ORG_ZSTACK_HYBRID_DATACENTER_10003": "数据中心 [%s] 仍在同步过程中,请等待。", + "ORG_ZSTACK_STORAGE_CDP_10017": "主机[uuid: %s]上的qemu不支持创建cdp任务,请检查qemu的版本。", + "ORG_ZSTACK_HYBRID_DATACENTER_10002": "不在有效的阿里云区域中,包含:%s", + "ORG_ZSTACK_STORAGE_CDP_10018": "运行在虚拟机[uuid:%s]上的 QEMU 版本不支持 mirrorBitmap。", + "ORG_ZSTACK_STORAGE_CDP_10012": "查询镜像:主机未找到,VM[uuid:%s]", + "ORG_ZSTACK_AI_EVALUATION_10000": "无法在数据库中找到对应的组[uuid: %s]", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10002": "失败在KVM宿主机[uuid:%s]上为硬件Vxlan[%s, 类型:%s, VLAN:%s]创建桥接[%s],因为%s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10001": "在 SDN 控制器类型:%s 没有对应的 SDN 控制器工厂", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10000": "在 VXLAN 池 [uuid:%s] 中不存在 SDN 控制器", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10006": "无法为目标主机[uuid:%s]上的VM[uuid:%s]配置硬件VXLAN网络", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10005": "无法找到 SDN 控制器 %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10003": "失败在KVM宿主机[uuid:%s]检查桥接[%s]是否存在硬件Vxlan[uuid:%s,名称:%s],%s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10009": "硬件 VXLAN 网络池必须配置物理接口", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10008": "硬件 VXLAN 网络池不支持创建 L3 网络", + "ORG_ZSTACK_HYBRID_DATACENTER_10001": "区域ID [%s] 已由AK [%s] 创建", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10007": "未能检查物理接口对于KVM宿主机[uuid:%s, 名称:%s]上的HardwareVxlanPool[uuid:%s, 名称:%s],%s", + "ORG_ZSTACK_HYBRID_DATACENTER_10000": "dcType 不支持的类型 [%s]", + "ORG_ZSTACK_STORAGE_CDP_10027": "无效的时间字符串: %s,应为ISO时区格式,例如: %s", + "ORG_ZSTACK_STORAGE_CDP_10023": "无法挂载磁盘。VM 实例正在运行 CDP 任务。在挂载磁盘后,完整备份所需的容量将超过计划的 CDP 任务大小。请适当规划大小并重新尝试。", + "ORG_ZSTACK_STORAGE_CDP_10024": "The VM[%s] for volume[%s] is running CDP, cannot resize now.", + "ORG_ZSTACK_STORAGE_CDP_10025": "CDP任务[uuid: %s]状态异常变更,旧状态: %s,新状态: %s。原因: %s。", + "ORG_ZSTACK_STORAGE_CDP_10026": "CDP 任务仍然启用", + "ORG_ZSTACK_STORAGE_CDP_10022": "失败于查找cdp任务[uuid:%s]", + "ORG_ZSTACK_AI_EVALUATION_10001": "没有匹配的后端组[uuid: %s, type:%s]存在", + "ORG_ZSTACK_AI_EVALUATION_10002": "使用提供的 modelServiceGroupUuid 无法定位 ModelServiceInstanceGroupVO。这表明与运行评估任务的相关服务组无法被找到。因此,这些任务保持在中间状态而不是被标记为完成状态。请自动将这些任务更新为“失败”并记录错误。", + "ORG_ZSTACK_LOGINCONTROL_10002": "无效的规则表达式,添加访问控制规则失败因为:%s", + "ORG_ZSTACK_LOGINCONTROL_10005": "未识别的键: %s", + "ORG_ZSTACK_LOGINCONTROL_10006": "缺少键值对 %s", + "ORG_ZSTACK_PORTAL_APIMEDIATOR_10008": "资源Uuid[%s]不是一个有效的uuid。一个有效的uuid是去掉了\u0027-\u0027的UUID(v4推荐)。请参见http://en.wikipedia.org/wiki/Universally_unique_identifier了解UUID格式,用于验证UUID的正则表达式为\u0027[0-9a-f]{8}[0-9a-f]{4}[1-5][0-9a-f]{3}[89ab][0-9a-f]{3}[0-9a-f]{12}\u0027", + "ORG_ZSTACK_LOGINCONTROL_10007": "密码强度配置格式错误", + "ORG_ZSTACK_LOGINCONTROL_10008": "最小值不能大于最大值", + "ORG_ZSTACK_STORAGE_CDP_10039": "备份存储未找到[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10034": "意外的任务类型[uuid: %s, 类型: %s]", + "ORG_ZSTACK_STORAGE_CDP_10035": "最大容量未找到,cdp任务[uuid: %s],请更新它。", + "ORG_ZSTACK_STORAGE_CDP_10036": "最大延迟未找到对于cdp任务[uuid: %s],请更新它。", + "ORG_ZSTACK_STORAGE_CDP_10037": "VM[uuid: %s] 已删除", + "ORG_ZSTACK_STORAGE_CDP_10031": "VM 没有停止,当前状态: %s", + "ORG_ZSTACK_STORAGE_CDP_10032": "共享卷[%s]来自VM[uuid]仍被其他虚拟机使用。", + "ORG_ZSTACK_STORAGE_CDP_10033": "任务未找到[uuid: %s]", + "ORG_ZSTACK_LOGINCONTROL_10012": "没有可用的用户:%s, 类型: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10011": "API 消息的机箱类型是 IPMI,但并非是 APICreateBareMetal2ChassisHardwareInfoMsg 消息", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10012": "收到未知物理机2机箱的硬件信息[ipmi_addr:%s, ipmi_port:%d]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10010": "从文件加载裸金属2 ipmi机箱信息失败,因为:%s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10015": "失败复位裸金属2IPMI机箱[UUID:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10016": "远程 ipxe 启动机箱[uuid:%s]失败", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10013": "失败启动裸金属2 ipmi机箱[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10014": "失败关闭裸金属2IPMI机箱[UUID:%s]", + "ORG_ZSTACK_STORAGE_CDP_10049": "该虚拟机[uuid: %s]已经创建了CDP任务,无法同时创建备份作业。", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10008": "Windows本地磁盘裸金属不支持自动创建裸金属实例", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10009": "集群[uuid:%s]中无可使用的裸金属2网关", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10006": "集群[uuid:%s]不是一个BareMetal2集群。", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10007": "集群[uuid:%s]未启用。", + "ORG_ZSTACK_STORAGE_CDP_10045": "必选参数缺失: %s", + "ORG_ZSTACK_STORAGE_CDP_10046": "参数 RetentionTimePerDay 和 DailyRpSinceDay 不能相等", + "ORG_ZSTACK_STORAGE_CDP_10047": "预期输入一个VM UUID,但收到 %d 个", + "ORG_ZSTACK_STORAGE_CDP_10048": "资源 [uuid: %s] 不是虚机", + "ORG_ZSTACK_STORAGE_CDP_10041": "备份存储[uuid: %s]未连接", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10005": "集群[uuid:%s]不是一个裸金属集群。", + "ORG_ZSTACK_STORAGE_CDP_10042": "该虚拟机[uuid: %s]已创建备份任务,无法同时启用CDP任务。", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10007": "IPMI地址和端口 %s:%d 已经存在。", + "ORG_ZSTACK_STORAGE_CDP_10044": "\u0027%s\u0027(%d) 应大于 \u0027%s\u0027(%d)", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10001": "无法到达裸金属机箱,请确保:1. IPMI 连接是激活的;2. IPMI 地址、端口、用户名和密码正确;3. BIOS 中启用了 IPMI Over LAN。", + "ORG_ZSTACK_STORAGE_CDP_10040": "备份存储[uuid: %s] 已禁用", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10009": "裸金属机箱[uuid:%s]应该使用 pxeserver[uuid:%s],但实际处理 DHCP 请求的是 pxeserver[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10008": "没有可用的裸金属PXE服务器连接到集群[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10000": "裸金属 IPMI 2 节点 %s:%d 已经存在", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10001": "IPMI地址 %s 无效", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10004": "裸金属机箱的IPMI地址%s和IPMI端口%d已经创建。", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10005": "集群[uuid:%s]不存在。", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10002": "无法连接到baremetal2机箱,请确保:1. IPMI连接是激活的;2. IPMI地址、端口、用户名和密码是正确的;3. BIOS中启用了IPMI Over LAN。", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10003": "裸金属2机箱的IPMI地址%s和IPMI端口%d已经创建。", + "ORG_ZSTACK_STORAGE_CDP_10056": "多个根磁盘找到: %s", + "ORG_ZSTACK_STORAGE_CDP_10058": "从 VM 备份未找到根磁盘", + "ORG_ZSTACK_STORAGE_CDP_10059": "卷 %s 包含在备份中但已从 VM[uuid: %s] 中分离:您需要将其重新挂载或删除", + "ORG_ZSTACK_STORAGE_CDP_10053": "没有找到对应的CDP任务[uuid: %s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10015": "远程启动裸金属机箱[uuid:%s]失败", + "ORG_ZSTACK_STORAGE_CDP_10054": "CDP任务在BS[uuid: %s]上未找到[vm uuid: %s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10018": "远程pxe启动机箱[uuid:%s]失败", + "ORG_ZSTACK_STORAGE_CDP_10055": "recoverVm: 主机[uuid: %s] 未找到对应VM[uuid: %s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10017": "远程重置裸金属机箱[uuid:%s]失败", + "ORG_ZSTACK_STORAGE_CDP_10050": "无法向主存储[uuid:%s]请求卷快照功能,请查看详细信息[%s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10014": "删除裸金属机箱 %s 失败", + "ORG_ZSTACK_STORAGE_CDP_10051": "recoverVm: 没有提供主机 UUID,也无法找到原始主机,VM[uuid: %s]", + "ORG_ZSTACK_SSHKEYPAIR_10009": "The sshKeyPair[uuid:%s] 没有绑定到 vm[uuid:%s] 上。", + "ORG_ZSTACK_SSHKEYPAIR_10008": "The sshKeyPair[uuid:%s] 已经绑定在 vm[uuid:] 上。", + "ORG_ZSTACK_SSHKEYPAIR_10007": "The sshKeyPair[uuid:%s] 正在被使用。", + "ORG_ZSTACK_STORAGE_CDP_10067": "无法从CDP备份找到根卷 %s:%d", + "ORG_ZSTACK_STORAGE_CDP_10068": "根磁盘未从CDP备份中找到 %s:%d", + "ORG_ZSTACK_SSHKEYPAIR_10011": "资源类型 %s 不支持绑定 sshKeyPair,允许的类型为 %s", + "ORG_ZSTACK_SSHKEYPAIR_10010": "The vmInstance[uuid:%s] 不在运行状态。", + "ORG_ZSTACK_STORAGE_CDP_10063": "VM CDP任务[uuid: %s]未找到", + "ORG_ZSTACK_STORAGE_CDP_10064": "VM未找到 for CDP任务[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10065": "从 VM 备份中未找到卷记录", + "ORG_ZSTACK_STORAGE_CDP_10066": "多个根磁盘从CDP备份%s:%d找到", + "ORG_ZSTACK_V2V_KVM_10003": "缺失 \u0027srcVmUrl\u0027 中的 VM uuid", + "ORG_ZSTACK_STORAGE_CDP_10060": "意外的卷[uuid: %s]大小: %d", + "ORG_ZSTACK_V2V_KVM_10004": "未找到 VM: %s 的根磁盘", + "ORG_ZSTACK_STORAGE_CDP_10061": "调整卷[uuid: %s]失败:%s", + "ORG_ZSTACK_STORAGE_CDP_10062": "卷[uuid: %s]具有意外的路径: %s", + "ORG_ZSTACK_V2V_KVM_10007": "失败清理 KVM V2V 转换宿主机[宿主机UUID:%s],因为%s", + "ORG_ZSTACK_STORAGE_CDP_10078": "无法找到虚机[uuid: %s]的cdp策略", + "ORG_ZSTACK_STORAGE_CDP_10075": "没有找到与 grpId %d 对应的恢复点", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10018": "无效变量: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10075": "NFS 主存储[uuid:%s, 名称:%s]无法在关联的集群中找到主机以执行该操作", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10077": "在卷[uuid:%s]中未找到主机", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10020": "需要 List 对资源 [%s] 这里进行输出,但得到的是 %s。", + "ORG_ZSTACK_ZBOX_10007": "zbox[name:%s] 的状态不是 Ready,当前状态是 %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10025": "某些操作无效", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10022": "资源 [%s] 必须设置后再使用!", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10006": "目标主机[uuid:%s]由于主要存储[uuid:%s]的阈值为%f,可用物理容量仅为%d,因此没有足够的物理容量", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10007": "该卷[uuid:%s]不在就绪状态,无法迁移它", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10008": "数据卷[uuid:%s, 名称: %s] 仍然附加在虚拟机[uuid:%s]上。请先detach再进行迁移。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10009": "该磁盘[uuid:%s]是虚拟机[uuid:%s]的根磁盘。当前虚拟机的状态为%s,请先停止它再进行迁移。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10002": "该卷[uuid:%s]已经在主机[uuid:%s]上存在", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10003": "主要存储[uuid:%s]未找到", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10004": "主要存储[uuid:%s]已禁用或不允许冷迁移", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10005": "目标主机[UUID:%s]不属于包含卷[UUID:%s]的本地主存储[UUID:%s]所在的位置", + "ORG_ZSTACK_ZBOX_10001": "zbox[uuid:%s] 仍在使用中,无法将其弹出", + "ORG_ZSTACK_ZBOX_10002": "zbox[uuid:%s] 不处于就绪状态,无法同步容量。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10000": "无法提供所有虚拟机[uuid:%s]的卷所需的 %s 字节容量的主机", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10004": "阿里云账号[uuid:%s]不存在", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10001": "该卷[uuid:%s]未挂载在任何本地主要存储上", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10005": "无效电话号码[%s], 短消息服务号码格式应为+86-18654321234", + "ORG_ZSTACK_ZBOX_10005": "zbox[uuid: %s] 好像被移除了", + "ORG_ZSTACK_ZBOX_10006": "USB设备[UUID:%s]已附加到VM[UUID:%s],无法添加到Zbox", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10000": "阿里云短信事件文本模板未找到。", + "ORG_ZSTACK_ZBOX_10003": "只有挂载路径为 [%s] 的文件可以从 zbox 删除,但传递的是 [%s]", + "ORG_ZSTACK_ZBOX_10004": "zbox[name:%s]状态不是Ready,当前状态是%s", + "ORG_ZSTACK_SSHKEYPAIR_10006": "SSH密钥对已上传", + "ORG_ZSTACK_SSHKEYPAIR_10005": "操作错误,因为:%s", + "ORG_ZSTACK_SSHKEYPAIR_10003": "ssh 密钥对[uuid:%s]无法与虚拟机[uuid:%s]关联,因为密钥未找到", + "ORG_ZSTACK_SSHKEYPAIR_10002": "加载公钥失败:%s, err: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10043": "信息安全客户端工厂测试连接失败", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10044": "当前不支持创建 %s 资源池", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10041": "从公钥中提取主题DN失败:%s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10042": "检查所有安全机器令牌是否存在失败", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10040": "解析加密公钥失败", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10058": "NFS 主存储[uuid:%s, 名称:%s]无法找到可用的主机来创建数据卷[uuid:%s, 名称:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10054": "vm[uuid:%s] 没有运行、暂停或停止,当前状态是 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10055": "主要存储[uuid:%s]未绑定到任何集群", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10050": "找不到可用的后端", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10051": "在连接状态下未找到挂载有NFSPrimary存储[uuid:%s, name:%s]的主机,无法将卷[uuid:%s]回滚至快照[uuid:%s, name:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10052": "在连接状态下未找到挂载有 NFS 主存储[uuid:%s, name:%s]的主机,无法将卷[uuid:%s]还原为镜像[uuid:%s]", + "ORG_ZSTACK_IAM2_10019": "无法解析cron表达式", + "ORG_ZSTACK_IAM2_10018": "该项目[uuid: %s, 名称:%s]处于不允许执行[%s]操作的状态:%s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10038": "生成数据保护令牌 %s 用于安全机器 %s 失败,因为 %s", + "ORG_ZSTACK_IAM2_10015": "组织[uuid:%s]是组织[uuid:%s]的上级组织,无法将其设置为下级组织", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10039": "生成 HMAC 认证令牌 %s 为安全机器 %s 时因为 %s 失败", + "ORG_ZSTACK_IAM2_10014": "无法执行操作,因为当前组织[uuid:%s]已失效,请启用它", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10036": "生成-token失败", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10037": "生成激活令牌 для 安全机器 %s 因为 %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10034": "导入密钥失败", + "ORG_ZSTACK_IAM2_10011": "错误的虚拟ID[uuid:%s], 不存在或错误的密码", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10005": "无效的类型格式 [%s]", + "ORG_ZSTACK_IAM2_10010": "在项目[uuid:%s, name:%s]中未找到账户", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10035": "在生成测试密钥的过程中,与安全机器 %s 连接失败因为 %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10006": "仅支持云资源,但获取了 [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10032": "导出密钥失败", + "ORG_ZSTACK_IAM2_10013": "虚拟ID[name:%s]不属于该项目[name:%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10003": "无法支持此类操作类型: %s", + "ORG_ZSTACK_IAM2_10012": "虚拟ID[name:%s] 已禁用", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10030": "加密主体DN不能为null", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10031": "解析 MS 包封失败", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10002": "无法支持此类资源类型: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10068": "NFS 主存储[uuid:%s, 名称:%s]尚未挂载到任何集群,或在已挂载的集群中的主机未连接", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10009": "无效类型: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10007": "只支持 Resource 或 Action,但获取到 [%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10008": "默认值必须是由 [%s] 描述的 Json 格式,但发现的是 [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10029": "密文不能为 null", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10027": "未能找到密钥", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10028": "解析密钥失败,错误:%s", + "ORG_ZSTACK_IAM2_10022": "无法进行操作,因为当前虚拟ID[uuid:%s]已失效,请启用它", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10016": "无效的动态变量,必须包含 ${: %s}", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10024": "大文件hmac加密失败,代码:%s,详情:%s", + "ORG_ZSTACK_IAM2_10021": "用户[%s]不是平台用户", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10017": "动词必须包含 \u0027::\u0027!", + "ORG_ZSTACK_IAM2_10024": "旧密码与原始密码不匹配,无法更新虚拟ID[uuid:%s]的密码", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10014": "错误的 JSON 格式,原因: %s", + "ORG_ZSTACK_IAM2_10023": "只有管理员和虚拟ID本身可以进行更新", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10015": "无法找到设置之前的属性资源!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10012": "无效解码器: %s!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10013": "在 CloudFormation 模板中未找到根元素,请检查您的模板!", + "ORG_ZSTACK_IAM2_10020": "账号[uuid:%s]的配额[name:%s]不能为%d,否则将超出组织[uuid:%s]的配额", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10011": "类型是: %s, 但获取值: %s", + "ORG_ZSTACK_PCIDEVICE_10058": "主机 [%s] 进入维护模式失败,由于包含 PCI 设备,虚拟机 [%s] 无法自动迁移", + "ORG_ZSTACK_PCIDEVICE_10056": "失败启动虚拟机[uuid:%s]因为并非所有PCI规范[uuids:%s]都存在", + "ORG_ZSTACK_PCIDEVICE_10059": "PCI设备[uuid:%s]无法Attach到VM[uuid:%s],因为状态错误", + "ORG_ZSTACK_PCIDEVICE_10050": "请卸载所有 VM[%s] 的 GPU 设备后重新尝试", + "ORG_ZSTACK_PCIDEVICE_10053": "指定的PCI设备不在同一主机上:PCI设备[UUID:%s]位于主机[UUID:%s],而PCI设备[UUID:%s]位于主机[UUID:%s]", + "ORG_ZSTACK_PCIDEVICE_10052": "请卸载其他VM[%s]的PCI设备并重新尝试", + "ORG_ZSTACK_PCIDEVICE_10051": "请卸载所有 vm[%s] 的 vGPU 设备后重新尝试", + "ORG_ZSTACK_PCIDEVICE_10068": "无法迁移根卷[uuid:%s],因为存在已连接的PCI设备", + "ORG_ZSTACK_PCIDEVICE_10066": "无法迁移 VM[uuid:%s],因为已挂载了 PCI 设备", + "ORG_ZSTACK_PCIDEVICE_10061": "在目标主机[uuid:%s]中为虚拟机[uuid:%s]找不到足够匹配的PCI设备[uuid:%s]", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10003": "没有为身份:%s 注册备份存储插件", + "ORG_ZSTACK_PCIDEVICE_10065": "vm[%s] 不存在,无法绑定到 pci[%s]", + "ORG_ZSTACK_PCIDEVICE_10064": "无法将此PCI设备[uuid:%s]绑定到虚拟机[uuid:%s],原因是在主机上的分配失败", + "ORG_ZSTACK_PCIDEVICE_10063": "PCI设备 [%s] 并非全部可用", + "ORG_ZSTACK_PCIDEVICE_10062": "iommu组中的pci设备[%s]存在问题", + "ORG_ZSTACK_IAM2_10008": "虚拟ID[uuid:%s] 不在项目[uuid:%s] 中", + "ORG_ZSTACK_IAM2_10009": "项目[%s]不存在", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10000": "从驱动程序返回的 null 安装路径: %s", + "ORG_ZSTACK_IAM2_10004": "从文件加载虚拟ID信息失败。因为\\n%s", + "ORG_ZSTACK_IAM2_10003": "该文件存在 %d 问题。", + "ORG_ZSTACK_IAM2_10006": "从文件中构建VirtualID信息失败。", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10001": "%s: 健康状态: %s", + "ORG_ZSTACK_IAM2_10005": "UUID [%s] 已存在。请尝试一个不同的。", + "ORG_ZSTACK_MEMORY_10000": "在主机[%s]上未找到%s的数据", + "ORG_ZSTACK_PCIDEVICE_10036": "无法在主机[uuid:%s]中为附加到VM的PCI设备进行SR-IOV虚拟化", + "ORG_ZSTACK_PCIDEVICE_10035": "主机[uuid:%s]中的PCI设备已SRIOV虚拟化", + "ORG_ZSTACK_PCIDEVICE_10034": "由于主机[uuid:%s]禁用了IOMMU,因此无法为设备启用SRIOV", + "ORG_ZSTACK_PCIDEVICE_10033": "pci设备[uuid:%s]不存在", + "ORG_ZSTACK_PCIDEVICE_10039": "pci 设备[uuid:%s] 不存在或未进行 sriov 虚拟化", + "ORG_ZSTACK_PCIDEVICE_10037": "只有 %d 个虚拟 PCI 设备可以由 %ss 在宿主机[uuid:%s]中生成", + "ORG_ZSTACK_STORAGE_CDP_10109": "备份存储[uuid: %s] 已经升级", + "ORG_ZSTACK_STORAGE_CDP_10104": "任务[uuid:%s]已被删除", + "ORG_ZSTACK_STORAGE_CDP_10105": "CDP任务正在合并数据,无法拾取。", + "ORG_ZSTACK_STORAGE_CDP_10106": "CDP任务[uuid:%s]超出存储使用量:最大值%d,已用%d。", + "ORG_ZSTACK_STORAGE_CDP_10107": "意外的虚拟机状态: %s", + "ORG_ZSTACK_STORAGE_CDP_10102": "CDP任务[uuid: %s]未绑定任何VM", + "ORG_ZSTACK_PCIDEVICE_10047": "PCI设备[UUID:%s]未被虚拟化为mdevs", + "ORG_ZSTACK_PCIDEVICE_10045": "PCI设备[UUID:%s]无法由mdev规范[UUID:%s]进行虚拟化", + "ORG_ZSTACK_PCIDEVICE_10044": "PCI设备[UUID:%s]无法虚拟化为mdevs,请确保该设备已启用且未绑定。", + "ORG_ZSTACK_PCIDEVICE_10049": "主机[uuid:%s]中包含的PCI设备[uuid:%s]未连接", + "ORG_ZSTACK_PCIDEVICE_10048": "从PCI设备[uuid:%s]生成的mdev设备仍然附加在VM上", + "ORG_ZSTACK_STORAGE_CDP_10119": "意外的任务类型: %s", + "ORG_ZSTACK_PCIDEVICE_10043": "无法反生成 PCI 设备[%s],因为其 VFs 正在使用中。\\n详情:\\n%s", + "ORG_ZSTACK_PCIDEVICE_10042": "无法反生成 PCI 设备[%s],因为它不是 GPU 或网络控制器。", + "ORG_ZSTACK_PCIDEVICE_10041": "无法在宿主机 [uuid:%s] 上反生成虚拟PCI设备,因为它们仍然附加到了VM上", + "ORG_ZSTACK_PCIDEVICE_10040": "无法反生成 PCI 设备 [uuid:%s],因为主机[uuid:%s]未连接", + "ORG_ZSTACK_STORAGE_CDP_10117": "CDP任务[uuid: %s]未找到", + "ORG_ZSTACK_STORAGE_CDP_10118": "CDP任务[uuid: %s]状态异常变更,旧状态: %s,新状态: %s。因为存储配额超出,当前: %d,配额: %d。", + "ORG_ZSTACK_STORAGE_CDP_10111": "备份存储[uuid: %s] 的 QEMU-img 版本需要升级", + "ORG_ZSTACK_STORAGE_CDP_10112": "未找到针对虚机: %s 的 CDP 任务", + "ORG_ZSTACK_STORAGE_CDP_10113": "未找到 VM: %s 的 CDP 备份存储", + "ORG_ZSTACK_STORAGE_CDP_10114": "没有找到类型为[%s]的CdpBackupFactory", + "ORG_ZSTACK_STORAGE_CDP_10110": "备份存储[uuid: %s]的架构不支持升级CDP任务", + "ORG_ZSTACK_IDENTITY_10072": "无法更新配额[name: %s]对于账户[uuid: %s]", + "ORG_ZSTACK_IDENTITY_10071": "无法找到配额[uuid:%s, 类型:%s]的更新检查器", + "ORG_ZSTACK_AI_CONTAINER_10001": "模型中心中 uuid 为 %s 的模型未找到", + "ORG_ZSTACK_AI_CONTAINER_10005": "获取服务URL失败,可能是服务IP为空,请检查Kubernetes网络", + "ORG_ZSTACK_AI_CONTAINER_10004": "创建 Kubernetes 服务失败", + "ORG_ZSTACK_AI_CONTAINER_10003": "创建 Kubernetes 部署失败", + "ORG_ZSTACK_AI_CONTAINER_10009": "具有 UUID %s 的 endpoint 未找到,无法同步数据库中的容器资源", + "ORG_ZSTACK_AI_CONTAINER_10007": "在 Kubernetes 中创建存储服务失败", + "ORG_ZSTACK_AI_CONTAINER_10006": "创建网络策略以分发模型服务失败", + "ORG_ZSTACK_TAG2_10011": "资源[uuid:%s]已绑定%d个标签,不能再绑定更多", + "ORG_ZSTACK_IDENTITY_10063": "一条语句必须具有非空的操作字段。无效的语句[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10006": "在区域[uuid:%s]中存在一个NFS主存储,其URL为%s", + "ORG_ZSTACK_IDENTITY_10062": "一条语句必须包含操作字段。无效的语句[%s]", + "ORG_ZSTACK_IDENTITY_10061": "一条语句必须具有效果字段。无效的语句[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10008": "发现多个CIDR范围", + "ORG_ZSTACK_IDENTITY_10060": "[group[name: %s, uuid: %s] 不属于账户[uuid: %s]]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10009": "无效的CIDR:%s", + "ORG_ZSTACK_IDENTITY_10067": "管理员账号的名称不能被更新", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10002": "无法在集群中找到连接的主机,其中ps [uuid: %s] 已附加", + "ORG_ZSTACK_IDENTITY_10066": "旧密码与原始密码不匹配,无法更新账户[uuid: %s]的密码", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10003": "无法找到连接的主机来执行命令以执行 NFS 主机存储[uuid:%s]的操作", + "ORG_ZSTACK_IDENTITY_10065": "无法更新名称。一个账户已经叫做 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10004": "无法找到具有连接主机-NFS连接的宿主机以执行针对NFS主存储[uuid:%s]的命令", + "ORG_ZSTACK_IDENTITY_10069": "账号[uuid: %s, name: %s]是一个普通账号,它不能重置另一个账号[uuid: %s]的密码", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10000": "NFS 主存储[uuid:%s]未连接到任何计算节点,无法清除虚拟机[uuid:%s]的根卷[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10004": "仅支持以 %s 方式启动的 baremetal2 镜像", + "ORG_ZSTACK_IDENTITY_10068": "只有管理员账号可以更新其密码", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10003": "baremetal2 图像必须包含 bootMode 标签", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10002": "只有格式为raw/qcow2 的根磁盘模板可以与baremetal2绑定标签", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10001": "只允许有一个裸金属2系统标签,但获取到了 %d 个", + "ORG_ZSTACK_AI_CONTAINER_10012": "未能根据 IP 地址 %s 查找 pod 名称", + "ORG_ZSTACK_AI_CONTAINER_10011": "获取podIP地址失败,无法添加到容器端点", + "ORG_ZSTACK_AI_CONTAINER_10010": "uuid为%s的集群未找到", + "ORG_ZSTACK_COMPUTE_VM_NUMA_10003": "无效的 CPU 集 [%s]", + "ORG_ZSTACK_AI_CONTAINER_10016": "获取 k8s 部署 %s 失败", + "ORG_ZSTACK_AI_CONTAINER_10015": "失败删除 Kubernetes 服务,因为 %s", + "ORG_ZSTACK_TAG2_10008": "所有标记 %s 必须指定", + "ORG_ZSTACK_AI_CONTAINER_10014": "失败删除 Kubernetes 部署,因为 %s", + "ORG_ZSTACK_AI_CONTAINER_10013": "失败将标签 %s 添加到 Pod %s", + "ORG_ZSTACK_TAG2_10006": "无效的颜色指定[%s], 必须类似于#FF00FF", + "ORG_ZSTACK_TAG2_10007": "获取格式[%s],格式必须类似于 name::{tokenName1}::{tokenName2} ... ::{tokenNameN} 或 {tokenName1}::{tokenName2} ... ::{tokenNameN} 名称中不能包含 \u0027{}\u0027", + "ORG_ZSTACK_AI_CONTAINER_10019": "无效的 YAML 格式: %s", + "ORG_ZSTACK_TAG2_10004": "简单标签模式中没有令牌", + "ORG_ZSTACK_AI_CONTAINER_10018": "部署 %s 没有副本信息", + "ORG_ZSTACK_TAG2_10005": "非法标签UUIDs %s,标签类型必须是简单型,)", + "ORG_ZSTACK_AI_CONTAINER_10017": "部署 %s 未找到", + "ORG_ZSTACK_IDENTITY_10070": "无法找到账号[uuid: %s]的配额[name: %s]", + "ORG_ZSTACK_TAG2_10002": "无法更新简单标签模式格式", + "ORG_ZSTACK_TAG2_10003": "重复名称", + "ORG_ZSTACK_SNS_PLATFORM_WECOM_10000": "失败向企业微信发送消息。状态:%s,正文:%s", + "ORG_ZSTACK_TAG2_10000": "标签唯一性违反:A [type:%s] 类型标签名为 [name:%s] 已在账户 [accountUuid%s] 下存在", + "ORG_ZSTACK_TAG2_10001": "您只能更新令牌名称", + "ORG_ZSTACK_PCIDEVICE_10072": "pci 设备规格[uuid:%s]不存在", + "ORG_ZSTACK_PCIDEVICE_10071": "非法类型[%s]的PCI设备,只能是%s合法", + "ORG_ZSTACK_PCIDEVICE_10070": "pci 设备[uuid:%s] 不存在", + "ORG_ZSTACK_PCIDEVICE_10075": "PCI设备[uuid:%s]不存在或已禁用,虚拟机[uuid:%s]无法使用", + "ORG_ZSTACK_PCIDEVICE_10073": "非法类型[%s]用于pci设备规范,仅限%s合法", + "ORG_ZSTACK_AI_CONTAINER_10023": "无效的K8s部署YAML: %s", + "ORG_ZSTACK_AI_CONTAINER_10020": "失败将 Kubernetes 部署 %s 中的所有 Pod 删除", + "ORG_ZSTACK_AI_CONTAINER_10025": "模型服务实例组 %s 在数据库中未找到", + "ORG_ZSTACK_AI_CONTAINER_10024": "失败修补 Kubernetes 部署 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10039": "失败从缓存镜像[path:%s]创建根卷[uuid:%s]的原因是%s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10040": "originText 或 certificateText 不能为 null", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10036": "在 NFS 主存储[uuid:%s]上删除 bits[%s]失败,%s,将会清理 installPath, pinv.getUuid(), rsp.getError()", + "ORG_ZSTACK_NETWORK_L3_10067": "在 L3 网络[uuid:%s]上发生了 DNS[%s]错误", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10037": "失败在 KVM 主机[uuid:%s, ip:%s]还原卷[uuid:%s]至快照[uuid:%s]时,%s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10038": "失败在 KVM 主机[uuid:%s, ip:%s]还原卷[uuid:%s]至镜像[uuid:%s]时,%s", + "ORG_ZSTACK_CRYPTO_AUTH_10020": "无法生成 %s 类别", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10032": "失败在 NFS 主存储[uuid:%s]检查 %s 的存在性,%s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10034": "无法在 KVM 主机[uuid:%s, IP:%s]上创建空的卷[uuid:%s, 名称:%s],因为 %s", + "ORG_ZSTACK_CRYPTO_AUTH_10029": "失败找到证书信息", + "ORG_ZSTACK_CRYPTO_AUTH_10028": "解析加密参数中的纯文本到json对象失败:%s, %s", + "ORG_ZSTACK_HYGON_10006": "VM[uuid:%s] 不存在", + "ORG_ZSTACK_HYGON_10005": "主机[uuid:%s]上有%d个启用了海光安全元素的运行中虚拟机,请先停止它们", + "ORG_ZSTACK_HYGON_10004": "主机[uuid:%s]未连接", + "ORG_ZSTACK_HYGON_10003": "主机[uuid:%s]需要将\u0027enableCgroupDeviceAcl\u0027设置为大于0才能支持Hygon mdev设备。请在生成mdev设备之前设置此配置。", + "ORG_ZSTACK_HYGON_10002": "主机[uuid:%s]需要将“reconnect.host.restart.libvirtd.service”配置为“true”,才能支持Hygon mdev设备。请在生成mdev设备之前设置此配置。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10017": "生成证书失败", + "ORG_ZSTACK_HYGON_10000": "无法反生成 mdev 设备,主机 [uuid: %s] 上仍有 %d 个 mdev 设备连接到 VM。请先停止使用这些设备的所有 VM。", + "ORG_ZSTACK_NETWORK_L3_10073": "在第3层网络[uuid:%s]上不存在目的路由前缀[%s]", + "ORG_ZSTACK_NETWORK_L3_10072": "前缀 [%s] 不是 IPv4 网络 CIDR", + "ORG_ZSTACK_NETWORK_L3_10071": "在三层网络[uuid:%s]上存在前缀[%s]的主机路由", + "ORG_ZSTACK_HYGON_10009": "由于并发分配导致无法分配海光mdev设备,请重试。", + "ORG_ZSTACK_NETWORK_L3_10070": "下一跳[%s]不是一个IPv4地址", + "ORG_ZSTACK_HYGON_10008": "主机[uuid:%s]上的 Hygon mdev 设备不足。需要:%d", + "ORG_ZSTACK_HYGON_10007": "无法在虚拟机[uuid:%s]处于状态[%s]时更改Hygon安全元素设置,请先停止虚拟机", + "ORG_ZSTACK_TICKET_ENTITY_10001": "操作被拒绝。票据处于%s状态,无法执行操作[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10031": "安全机器 [%s] 不存在", + "ORG_ZSTACK_IDENTITY_10022": "无法找到资源[uuid:%s];错误的资源Uuid或该资源为管理员资源", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10049": "无法找到可用的后端", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10042": "集群[uuid:%s]中没有主机连接", + "ORG_ZSTACK_IDENTITY_10026": "%s 不是API", + "ORG_ZSTACK_IDENTITY_10025": "用户由 userUuid[%s] 指定的用户不属于当前账户,且当前账户不是管理员账户,因此没有权限检查该用户的权限", + "ORG_ZSTACK_IDENTITY_10029": "无法找到账户[uuid:%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10001": "安全机器[uuid:%s]模型不是%s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10037": "无效的 algType %s, 支持的类型: %s.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10002": "安全机器 [%s] 手动检测同步失败,请确认安全机器是否已同步密钥!", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10038": "指定的数据保护资源池[%s]不存在", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10000": "secretResourcePool[uuid:%s] 的模型不是 %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10032": "存在一个安全设备,其管理IP为[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10033": "管理IP[%s] 不符合IPV4格式", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10034": "失败连接到安全机器 %s[%s],因为 %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10035": "在启用加密功能后,相应的资源池中至少应保留一台安全主机", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10017": "无法在 KVM 主机[uuid:%s, ip:%s]上创建文件夹[installUrl:%s],因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10018": "没有连接或主要存储[uuid:%s]主机信息挂载无集群", + "ORG_ZSTACK_IDENTITY_10050": "toPublic 设置为 false,accountUuids 不能为 null 或空", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10019": "无法从主机[uuid:%s]ping nfs主存储[uuid:%s],原因:%s。断开此host-ps连接", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10013": "失败从SftpBackupStorage[hostname:%s]下载[%s]至nfs主存储[uuid:%s, path:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10014": "从 NFS 主存储 [uuid:%s, 路径:%s] 上传数据块到 SFTP 备份存储 [主机名:%s, 路径:%s] 失败,%s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10016": "无法将主存储[uuid:%s, 名称:%s]附加到集群[uuid:%s]。集群中的KVM主机使用的是qemu-img版本[%s];但主存储已附加到另一个具有KVM主机且该主机的qemu-img版本为[%s]的不同集群中。qemu-img版本大于%s的与版本小于%s的不兼容,这将导致卷快照操作失败。请避免将主存储附加到使用不同Linux发行版的集群中,以防止qemu-img版本不匹配。", + "ORG_ZSTACK_IDENTITY_10059": "[user[name: %s, uuid: %s]不属于账号[uuid: %s]]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10010": "IP地址[%s]不在CIDR[%s]范围内", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10011": "在 NFS 主存储上有 %s 个运行中的虚拟机,请停止它们后再试:\n%s", + "ORG_ZSTACK_IDENTITY_10057": "策略[name: %s, uuid: %s]不属于账户[uuid: %s]", + "ORG_ZSTACK_CRYPTO_AUTH_10009": "错误的密钥资源池模型,期望 %s,实际 %s", + "ORG_ZSTACK_CRYPTO_AUTH_10008": "未能找到模型以供秘密资源池 [%s] 使用", + "ORG_ZSTACK_CRYPTO_AUTH_10006": "操作不支持", + "ORG_ZSTACK_IDENTITY_10041": "无法创建一个组。名为 %s 的组已经在账号[uuid:%s]下存在", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10028": "选择执行存储迁移的操作主机[uuid:%s]已丢失", + "ORG_ZSTACK_CRYPTO_AUTH_10016": "连接远程加密服务器失败", + "ORG_ZSTACK_IDENTITY_10040": "accountName 和 accountUuid 不能同时为 null,您必须指定至少一个", + "ORG_ZSTACK_CRYPTO_AUTH_10015": "身份认证未指定提供服务的资源池", + "ORG_ZSTACK_IDENTITY_10045": "无法删除内置管理员账户。", + "ORG_ZSTACK_IDENTITY_10044": "账户不能删除自己", + "ORG_ZSTACK_IDENTITY_10043": "无法创建账户。一个同名的账户已存在。", + "ORG_ZSTACK_IDENTITY_10042": "无法创建用户。用户名为%s的用户已存在于账户[uuid:%s]中", + "ORG_ZSTACK_IDENTITY_10049": "所有设置为false,accountUuids不能为null或空", + "ORG_ZSTACK_IDENTITY_10048": "您以用户身份登录,无法切换至另一个用户[uuid:%s]", + "ORG_ZSTACK_IDENTITY_10047": "当前会话是一个账户会话。您需要指定要更新的用户字段 \u0027uuid\u0027", + "ORG_ZSTACK_IDENTITY_10046": "只有管理员可以删除账户。", + "ORG_ZSTACK_CRYPTO_AUTH_10019": "从数据库获取完整性密码失败,因为 [%s] 未生成完整性密码", + "ORG_ZSTACK_VHOST_KVM_10000": "vhostuser磁盘仅支持virtio模式,请检查镜像平台是否包含virtio驱动程序", + "ORG_ZSTACK_VHOST_KVM_10001": "vhost-user磁盘不支持virtio-scsi模式,请关闭virtio-scsi模式", + "ORG_ZSTACK_NETWORK_L3_10029": "%s 不是一个有效的IPv6地址", + "ORG_ZSTACK_USBDEVICE_10005": "PassThrough 只支持在运行中的主机 VM 上使用", + "ORG_ZSTACK_ALIYUN_ECS_10019": "只有管理员可以将参数 [onlyZstack] 设置为 false", + "ORG_ZSTACK_STORAGE_BACKUP_10018": "失败从备份 %s 创建镜像", + "ORG_ZSTACK_ALIYUN_ECS_10018": "只有按需计费的 ECS 支持删除远程,当前的 ECS 计费类型是: %s", + "ORG_ZSTACK_USBDEVICE_10002": "已连接到VM的USB设备数量已达上限。当前使用情况:\n\\n %s", + "ORG_ZSTACK_ALIYUN_ECS_10017": "仅删除状态为运行中或已停止的 ECS,当前是 %s", + "ORG_ZSTACK_NETWORK_L3_10025": "无法获取可用IP,因为[start[ip:%s]]不是一个正确的IPv6地址", + "ORG_ZSTACK_USBDEVICE_10009": "无法迁移_vm[uuid:%s]_因为存在通过直通连接的USB设备", + "ORG_ZSTACK_STORAGE_BACKUP_10015": "无法保留 %s 在备份存储[uuid:%s]上,它仅剩 %s 可用", + "ORG_ZSTACK_NETWORK_L3_10024": "无法获取可用IP,因为[start[ip:%s]]不是一个正确的IPv4地址", + "ORG_ZSTACK_USBDEVICE_10008": "vm[%s] 无法启动,因为 USB 重定向主机未连接", + "ORG_ZSTACK_NETWORK_L3_10023": "无法获取可用IP,因为带有UUID为%s的l3Network[%s]是双栈类型", + "ORG_ZSTACK_USBDEVICE_10007": "USB 已经绑定到其他虚拟机[UUID:%s],无法再次绑定到其他虚拟机", + "ORG_ZSTACK_STORAGE_BACKUP_10013": "必需的主要存储[uuid:%s, 类型:%s] 不支持任何备份存储。", + "ORG_ZSTACK_NETWORK_L3_10022": "ipRangeUuid 和 l3NetworkUuid 不能同时为 null;您必须设置其中一个。", + "ORG_ZSTACK_USBDEVICE_10006": "无法将 USB 设备[uuid:%s]挂载到虚拟机[uuid:%s],可能的原因包括:该设备未启用或已被挂载至其他虚拟机,或者该设备和虚拟机不在同一主机上。", + "ORG_ZSTACK_ALIYUN_ECS_10015": "图像已被删除!", + "ORG_ZSTACK_ALIYUN_ECS_10014": "ecs镜像在远程已存在,名称: %s,创建时间: %s", + "ORG_ZSTACK_ALIYUN_ECS_10013": "ecs镜像在远程和本地都存在,ecs镜像uuid: %s, 名称: %s, 创建时间: %s", + "ORG_ZSTACK_NETWORK_L3_10032": "不能添加IP范围,因为不支持IPv6地址池", + "ORG_ZSTACK_STORAGE_BACKUP_10011": "只允许一个备份存储数据网络系统标签,但获得了 %s 个", + "ORG_ZSTACK_NETWORK_L3_10030": "[startIp %s, endIp %s, prefixLen %d, gateway %s] 不是一个有效的ipv6范围", + "ORG_ZSTACK_STORAGE_BACKUP_10010": "所有备份存储的容量预留失败", + "ORG_ZSTACK_USBDEVICE_10016": "您可以将一个 VM 实例连接到最多 %s 个 USB 3.0 设备。", + "ORG_ZSTACK_USBDEVICE_10015": "您可以将一个 VM 实例连接到最多 %s 个 USB 2.0 设备。", + "ORG_ZSTACK_NETWORK_L3_10038": "新的网络CIDR [%s] 与旧的网络CIDR [%s] 不同", + "ORG_ZSTACK_USBDEVICE_10014": "您可以将最多 %s 个 USB 1.0 设备附加到一个 VM 实例上。", + "ORG_ZSTACK_NETWORK_L3_10037": "新的IP范围[startip :%s, endip :%s]与旧的IP范围[startip :%s, endip :%s]重叠", + "ORG_ZSTACK_STORAGE_BACKUP_10028": "卷备份[uuid:%s]在备份存储[uuid:%s]中未找到", + "ORG_ZSTACK_NETWORK_L3_10036": "IPv6 前缀长度必须为 %d 对于 Stateless-DHCP 或 SLAAC", + "ORG_ZSTACK_NETWORK_L3_10035": "地址模式[%s]与L3网络地址模式[%s]不同", + "ORG_ZSTACK_USBDEVICE_10019": "USB设备[UUID:%s]不在可连接状态%s", + "ORG_ZSTACK_NETWORK_L3_10034": "不能添加 IP 范围,因为系统网络尚不支持 IPv6", + "ORG_ZSTACK_USBDEVICE_10018": "USB设备[UUID:%s]已Attach至另一个VM[UUID:%s]", + "ORG_ZSTACK_NETWORK_L3_10033": "IP地址范围前缀长度超出范围[%d - %d]", + "ORG_ZSTACK_USBDEVICE_10017": "USB设备[UUID:%s]已绑定至同一VM[UUID:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10024": "卷备份[uuid:%s]在备份存储[uuid:%s]中未找到", + "ORG_ZSTACK_ALIYUN_ECS_10022": "私有IP在VPC中已存在:%s,分配给ECS:%s", + "ORG_ZSTACK_ALIYUN_ECS_10021": "%s 不在 cidr 范围内: %s", + "ORG_ZSTACK_ALIYUN_ECS_10020": "弹性网卡可用IP地址不足,当前是(%d)", + "ORG_ZSTACK_USBDEVICE_10012": "无法迁移 VM[uuid:%s],因为存在已连接的 PCI 设备", + "ORG_ZSTACK_ALIYUN_ECS_10027": "实例配置或实例类型必须设置!", + "ORG_ZSTACK_USBDEVICE_10011": "无法迁移根卷[uuid:%s],因为连接了USB设备", + "ORG_ZSTACK_ALIYUN_ECS_10026": "%s 不是有效的卷类型,有效类型为 [%s]", + "ORG_ZSTACK_ALIYUN_ECS_10025": "%s 不是 IPv4 地址", + "ORG_ZSTACK_ALIYUN_ECS_10024": "带宽必须设置后再分配公网IP", + "ORG_ZSTACK_NETWORK_L3_10043": "%s 不是一个有效的网络CIDR", + "ORG_ZSTACK_STORAGE_BACKUP_10023": "其中一个备份存储[uuid: %s]处于%s状态,无法执行同步操作", + "ORG_ZSTACK_NETWORK_L3_10042": "网关[%s]不在子网%s中", + "ORG_ZSTACK_STORAGE_BACKUP_10022": "没有找到类型为[%s]的VolumeBackupFactory", + "ORG_ZSTACK_NETWORK_L3_10041": "%s 不是一个允许的网络CIDR,因为它没有可用的IP地址范围", + "ORG_ZSTACK_STORAGE_BACKUP_10021": "当前备份卷的虚机[uuid: %s]已不再是用于备份的虚机[uuid: %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10020": "同步卷备份元数据文件在镜像存储[uuid:%s]遇到I/O错误:%s", + "ORG_ZSTACK_NETWORK_L3_10049": "l3网络[uuid %s:名称 %s]不是一个公共网络,地址池范围无法添加", + "ORG_ZSTACK_NETWORK_L3_10047": "无效的系统和类别组合,仅 %s 是有效的", + "ORG_ZSTACK_NETWORK_L3_10046": "%s 不是一个有效的域名", + "ORG_ZSTACK_NETWORK_L3_10045": "不支持的三层网络类型[%s]", + "ORG_ZSTACK_NETWORK_L3_10044": "ipRangeUuids, L3NetworkUuids, zoneUuids 至少必须有一个非空列表,或者全部设置为 true", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10023": "无法将端口转发规则与允许的CIDR绑定,因为vmNic[uuid:%s]已经存在与目标私有端口范围[%s, %s]重叠且具有相同协议类型[%s]的规则", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10024": "无法附加端口转发规则,因为 vmNic[uuid:%s] 已经有一个与目标私有端口范围[%s, %s]重叠、具有相同协议类型[%s]且具有相同允许IP范围的规则。", + "ORG_ZSTACK_SNMP_10010": "失败 to %s SNMP 代理,因为隐私密码不能为空。", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10021": "虚拟机网络接口[UUID:%s]已经存在端口转发规则,其VIP与[UUID:%s]的不同", + "ORG_ZSTACK_ALIYUN_NAS_CORE_10000": "主存储 [%s] 仍在运行,无法删除访问组", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10022": "vmNic uuid[%s] 不允许添加端口转发规则,因为 vmNic 已存在弹性公网IP", + "ORG_ZSTACK_NETWORK_L3_10054": "IP分配不能包含网络地址或广播地址", + "ORG_ZSTACK_NETWORK_L3_10053": "网关[%s]不在子网%s/%s中", + "ORG_ZSTACK_NETWORK_L3_10052": "该 IP 范围[%s ~ %s]包含保留的链路本地地址", + "ORG_ZSTACK_NETWORK_L3_10051": "该 IP 范围[%s ~ %s]包含 E 类地址,这些地址是保留的", + "ORG_ZSTACK_NETWORK_L3_10050": "该 IP 地址范围[%s ~ %s]包含 D 类地址,这些地址用于多播", + "ORG_ZSTACK_STORAGE_BACKUP_10008": "在扣除预留容量后,没有可用的备份存储空间[%s字节]", + "ORG_ZSTACK_STORAGE_BACKUP_10006": "备份存储[uuid:%s]已绑定至区域[uuid:%s]", + "ORG_ZSTACK_NETWORK_L3_10059": "开始IP[%s]在结束IP[%s]之后", + "ORG_ZSTACK_ALIYUN_ECS_10006": "解码URL失败: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10005": "备份存储[uuid:%s]尚未绑定至区域[uuid:%s]", + "ORG_ZSTACK_NETWORK_L3_10058": "netmask[%s] 不是有效的网掩码,且IP范围的网掩码不能为0.0.0.0", + "ORG_ZSTACK_STORAGE_BACKUP_10004": "zoneUuids, backupStorageUuids 至少有一个不能为空列表,或者全部设为 true", + "ORG_ZSTACK_NETWORK_L3_10057": "网关[%s]不是IPv4地址", + "ORG_ZSTACK_STORAGE_BACKUP_10003": "%s 不得为空", + "ORG_ZSTACK_NETWORK_L3_10056": "结束IP[%s]不是一个IPv4地址", + "ORG_ZSTACK_NETWORK_L3_10055": "开始IP[%s]不是一个IPv4地址", + "ORG_ZSTACK_CORE_SALT_10000": "scp 在系统[%s]中未被找到,无法设置 salt", + "ORG_ZSTACK_ALIYUN_ECS_10004": "无系统磁盘找到,ecs: [%s], ecs实例ID为: [%s]", + "ORG_ZSTACK_CORE_SALT_10003": "在系统[%s]上运行salt状态[%s]失败,连续重试了%s次后仍未成功", + "ORG_ZSTACK_ALIYUN_ECS_10003": "该区域[%s]当前无法生成实例类型[%s],请选用另一种实例类型或另一个区域", + "ORG_ZSTACK_ALIYUN_ECS_10002": "当前没有可用的实例类型。", + "ORG_ZSTACK_SNMP_10000": "创建SNMP代理失败,因为SNMP代理已经存在。", + "ORG_ZSTACK_SNMP_10001": "失败 to 停止 SNMP 代理,请先创建一个 SNMP 代理。", + "ORG_ZSTACK_NETWORK_L3_10065": "添加普通IP地址范围时必须指定网关IP地址", + "ORG_ZSTACK_SNMP_10002": "失败更新SNMP代理,请先创建一个SNMP代理。", + "ORG_ZSTACK_NETWORK_L3_10064": "新建添加的IP地址范围网关 %s 与旧网关 %s 不同", + "ORG_ZSTACK_SNMP_10003": "Failed to start SNMP代理,请先创建一个SNMP代理。", + "ORG_ZSTACK_NETWORK_L3_10063": "网关[%s]不能属于范围[%s, %s]", + "ORG_ZSTACK_SNMP_10004": "失败 to %s SNMP 代理,因为当版本为 v2c 时 readCommunity 不能为空", + "ORG_ZSTACK_NETWORK_L3_10062": "公网地址[%s]不在子网%s/%s中", + "ORG_ZSTACK_SNMP_10005": "失败 to %s SNMP 代理,因为当版本为 v3 时 userName 不能为空", + "ORG_ZSTACK_NETWORK_L3_10061": "在同一三层网络上不允许存在多个 CIDR。已存在 IP 范围[uuid:%s, CIDR:%s],新的 IP 范围[CIDR:%s] 与现有 CIDR 不重叠", + "ORG_ZSTACK_SNMP_10006": "失败 to %s SNMP 代理, 当密码不为空时认证算法不能为空。", + "ORG_ZSTACK_NETWORK_L3_10060": "重叠与IP范围[uuid:%s, 起始IP:%s, 结束IP: %s]", + "ORG_ZSTACK_SNMP_10007": "失败 to %s SNMP 代理, 因为认证密码不能为空。", + "ORG_ZSTACK_SNMP_10008": "失败 to %s SNMP代理,因为设置数据加密需要先设置用户验证。", + "ORG_ZSTACK_XINFINI_10019": "获取节点 %s 详情失败,请检查 IP 地址和角色配置", + "ORG_ZSTACK_XINFINI_10018": "无节点找到", + "ORG_ZSTACK_XINFINI_10017": "未找到连接的节点", + "ORG_ZSTACK_XINFINI_10016": "不支持的协议[%s]用于激活", + "ORG_ZSTACK_XINFINI_10015": "不支持从 [%s] 获取卷信息", + "ORG_ZSTACK_XINFINI_10014": "不支持的协议[%s]", + "ORG_ZSTACK_XINFINI_10013": "不支持的协议[%s]禁用", + "ORG_ZSTACK_XINFINI_10012": "无法获取卷[%s]的详细信息,可能已被删除", + "ORG_ZSTACK_XINFINI_10010": "空配置,无法发现xinfini", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10021": "required ip %s 已被其他实例占用", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10022": "requiredIp %s 超出 dhcp 范围 %s ~ %s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10020": "从裸金属2分配网络[uuid:%s]分配IP地址失败", + "ORG_ZSTACK_XINFINI_10009": "删除 iSCSI 客户端失败 %s", + "ORG_ZSTACK_XINFINI_10008": "删除 volume-client-group-mapping 失败 %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10002": "存在使用来自l2[uuid:%s]分配的ip地址的bm实例", + "ORG_ZSTACK_XINFINI_10007": "删除卷快照失败 %s", + "ORG_ZSTACK_XINFINI_10006": "快照 [id:%s, name:%s] 具有 %d 个克隆的卷,卷名称: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10004": "存在使用了从IP范围[uuid:%s]分配的IP地址的BM实例", + "ORG_ZSTACK_XINFINI_10005": "删除磁盘失败 %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10003": "存在使用来自L3[uuid:%s]分配的IP地址的BM实例", + "ORG_ZSTACK_XINFINI_10004": "删除块设备失败 %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10006": "远程控制 %s 裸金属机箱[uuid:%s]失败", + "ORG_ZSTACK_XINFINI_10003": "bdc与ip %s不存在。", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10005": "分配裸金属 PXE 服务器失败,请确保集群[uuid:%s]中已连接了具有足够可用容量的 PXE 服务器", + "ORG_ZSTACK_XINFINI_10002": "xinfini 请求失败,信息: %s.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10008": "裸金属机箱[uuid:%s]不存在", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10009": "裸金属2 provisioning网络[uuid:%s]已连接至集群[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10007": "远程关闭裸金属机箱[uuid:%s]失败", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10008": "热拔除运行中VM的mdev设备失败,因为:%s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10010": "无法将裸金属2提供的网络[uuid:%s]附加到集群[uuid:%s],因为该集群已经有一个了", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10011": "无法将裸金属2提供网络[uuid:%s]附加到集群[uuid:%s],因为它们不在同一个可用区中", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10007": "vm[uuid:%s] 在持有 mdev 设备[uuid:%s] 的主机上无法启动", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10004": "热插拔 mdev 设备到运行中的 VM 失败,因为:%s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10002": "mdev 设备[uuid:%s]无法Attach到vm[uuid:%s],因为状态错误", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10003": "mdev 设备 [%s]不可用", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10000": "主机 [%s] 无法进入维护模式,因为 vm[%s] 搭载了 mdev 设备且无法自动迁移", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10018": "失败在网关[uuid:%s]更新提供网络[uuid:%s]:%s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10009": "裸金属机箱[uuid:%s]未启用或不可用,请选择另一个。", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10001": "PCI设备[uuid:%s]已知为%s,但无法找到其mdev规格,因此终止。", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10016": "不在所有 %s 中存在 baremetal2 预分配网络", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10014": "无法分离依赖于它的运行中实例的裸金属2分配网络[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10015": "网络Uuid列表为空", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10012": "无法将基础架构网络[baremetal2提供网络]与集群[uuid:%s]关联,因为我们需要确保所有具有相同提供网络的集群都连接相同的网关", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10013": "provision 网络不应与已连接到集群的 L2 网络具有相同的接口名称", + "ORG_ZSTACK_NETWORK_L3_10006": "无法保留 IP 范围,因为没有可用的 IPv4 范围", + "ORG_ZSTACK_NETWORK_L3_10005": "无法保留 IP 范围,因为结束 IP[%s] 小于开始 IP[%s]", + "ORG_ZSTACK_NETWORK_L3_10004": "无法保留 IP 范围,因为结束 IP[%s] 不是 IPv6 地址", + "ORG_ZSTACK_NETWORK_L3_10003": "无法保留 IP 范围,因为结束 IP 地址[%s]不是 IPv4 地址", + "ORG_ZSTACK_NETWORK_L3_10002": "无法保留IP地址范围,因为起始IP地址[%s]无效", + "ORG_ZSTACK_NETWORK_L3_10000": "无法删除 IP 地址,因为它被 vmnic[uuid:%s] 使用", + "ORG_ZSTACK_NETWORK_L3_10009": "无法预留IP范围,因为没有IPv6范围", + "ORG_ZSTACK_KVM_10001": "从文件加载主机信息失败。因为\\n%s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10019": "mdev 设备 [uuid:%s] 没有连接到 vm[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10017": "持有 SE MDEV 设备的 VM[UUID:%s] 无法再附加更多 SE MDEV[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10018": "主机[uuid:%s]的IOMMU没有处于[%s]和[%s]状态,该主机托管了PCI设备[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10015": "vm[uuid:%s] 挂载了在不同主机上的 mdev 设备,这些设备与 mdev 设备[uuid:%s] 不同", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10014": "vm[uuid:%s] 挂载了在不同主机上的 pci 设备,而 mdev 设备[uuid:%s] 在另一个主机上", + "ORG_ZSTACK_NETWORK_L3_10010": "无法保留IP范围,因为预留的IP不在IP范围[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10011": "无法更改处于已连接状态的 mdev 设备的状态", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10007": "无法删除依赖于它的实例的裸金属2分配网络[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10012": "无法将 [uuid:%s] 的 mdev 设备附加到 VM,请确保它已启用且未被占用", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10008": "无法将裸金属2提供网络[uuid:%s]附加到非裸金属2集群[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10005": "裸金属2分配网络DHCP范围网掩码 %s 无效", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10006": "裸金属2 provisioning网络启动IP %s和结束IP %s不属于同一个子网", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10003": "无法更新依赖于它的实例的裸金属2分配网络[%s]的DHCP配置", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10002": "已经存在一个裸金属2分配网络,其中dhcpInterface \u003d %s, dhcpRangeStartIp \u003d %s, dhcpRangeEndIp \u003d %s, dhcpRangeNetmask \u003d %s, dhcpRangeGateway \u003d %s", + "ORG_ZSTACK_NETWORK_L3_10018": "在 L3[%s] 中没有 IP 地址范围", + "ORG_ZSTACK_NETWORK_L3_10015": "您必须同时更新系统和类别", + "ORG_ZSTACK_XINFINI_10027": "不支持未导出的 NVMe-over-Fabric yet", + "ORG_ZSTACK_NETWORK_L3_10014": "无法删除最后一个普通IP范围,因为仍然存在地址池", + "ORG_ZSTACK_XINFINI_10026": "未为客户端[%s]找到活动网关", + "ORG_ZSTACK_NETWORK_L3_10013": "由于 L3 网络 [uuid:%s] 的 MTU 不能大于无 VLAN 网络的 MTU,因此无法设置 mtu 值 [l2网络[uuid:%s]] 的 MTU", + "ORG_ZSTACK_XINFINI_10025": "不支持导出 NVMe-OF 目前尚未实现", + "ORG_ZSTACK_XINFINI_10024": "xinfini 只支持设置总质量等级(QoS)", + "ORG_ZSTACK_NETWORK_L3_10011": "无法保留 IP 范围,因为新范围 [%s:%s] 与旧范围重叠", + "ORG_ZSTACK_XINFINI_10023": "没有可用的具有足够空间[%d]和健康状态的资源池", + "ORG_ZSTACK_XINFINI_10021": "失败获取池[id:%d, 名称:%s] 的详细信息", + "ORG_ZSTACK_XINFINI_10020": "未找到资源池", + "ORG_ZSTACK_KVM_10010": "主机[uuid:%s]没有CPU模型信息,您可以重新连接主机以解决问题", + "ORG_ZSTACK_KVM_10011": "设置强制运行时必须说明原因", + "ORG_ZSTACK_NETWORK_L3_10019": "[%s]的IP不在IP范围[uuid:%s, CIDR:%s]中,该L3网络[%s]已关联", + "ORG_ZSTACK_KVM_10012": "主机[uuid:%s] 已被删除", + "ORG_ZSTACK_KVM_10002": "主机[name:%s, ip:%s]的操作系统[%s]无效", + "ORG_ZSTACK_KVM_10003": "集群[uuid:%s]已经存在具有操作系统版本[%s]的主机,但新增加的主机[name:%s ip:%s]具有不同的操作系统版本[%s]", + "ORG_ZSTACK_KVM_10004": "vm[uuid:%s] 因内核错误而崩溃", + "ORG_ZSTACK_KVM_10005": "主机[uuid: %s]内存ECC触发,详情: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10029": "指定的 mdev 设备不在同一主机上:mdev 设备[uuid: %s]位于主机[uuid: %s],而 mdev 设备[uuid: %s]位于主机[uuid: %s]", + "ORG_ZSTACK_KVM_10006": "仍然有主机的CPU模型不相同,详情: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10026": "无法删除已附加的 mdev 设备", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10027": "启动虚机[uuid:%s]失败,因为并非所有mdev规格[uuids:%s]都存在", + "ORG_ZSTACK_KVM_10008": "PCI 桥接需要一个大于0且小于32的值", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10024": "无法将 mdev 设备附加到未停止的虚拟机实例上", + "ORG_ZSTACK_KVM_10009": "vm 当前状态[%s],修改virtioSCSI需要vm状态[%s]\"", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10025": "非法的 mdev 设备类型 [%s],仅支持 %s 类型", + "ORG_ZSTACK_NETWORK_L3_10021": "无效 IP[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10022": "集群UUID、主机UUID或虚拟机UUID无法同时设置", + "ORG_ZSTACK_NETWORK_L3_10020": "ip[%s] 在 ip 范围[uuid:%s, startIp:%s, endIp:%s] 中,且该 ip 属于 l3 网络[%s],这不允许", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10023": "集群不存在或禁用", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10020": "持有包含mdev设备[uuid:%s]的宿主机[uuid:%s]不是[%s]和[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10021": "无法从未停止的虚拟机实例detach mdev设备", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10053": "在 SDN 控制器 [IP:%s] 上不存在 VPC", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10054": "VPC ID 的系统标签是必填项", + "ORG_ZSTACK_MACVLAN_10002": "失败检查vlan接口[%s]在kvm主机[uuid:%s]上的l2VlanNetwork[uuid:%s, name:%s],%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10051": "在 SDN 控制器 [IP:%s] 上不存在开关", + "ORG_ZSTACK_MACVLAN_10005": "无法将L2[uuid:%s]类型的网络服务附加到L3[uuid:%s],因为L2[uuid:%s, vSwitchType:%s]不支持任何公共基础L3网络服务", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10052": "在 SDN 控制器上未连接任何交换机", + "ORG_ZSTACK_MACVLAN_10004": "仅支持 %s macvlan", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10057": "获取二层网络的逻辑交换机失败", + "ORG_ZSTACK_MACVLAN_10007": "无法将网络服务附加到l3[uuid:%s],因为l2[uuid:%s, vSwitchType:%s]仅支持私有基本l3网络的vrouter网络提供者", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10058": "获取二层网络的逻辑交换机失败,原因:%s", + "ORG_ZSTACK_MACVLAN_10006": "无法将网络服务附加到l3[uuid:%s],因为l2[uuid:%s, vSwitchType:%s]仅支持v路由器网络提供商用于VPC L3网络", + "ORG_ZSTACK_MACVLAN_10009": "只有 KVM 主机支持 L2 类型为 MacVlan 的 vSwitchType", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10056": "无法获取物理交换机端口因为: %s", + "ORG_ZSTACK_MACVLAN_10008": "无法将网络服务附加到l3[uuid:%s],因为l2[uuid:%s, vSwitchType:%s]仅支持私有基础l3网络的负载均衡器", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10075": "根镜像已被删除,无法重新制作现在", + "ORG_ZSTACK_STORAGE_CEPH_10023": "问题可能是由错误的用户名或密码或SSH端口或不稳定的网络环境引起的", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10050": "在 SDN 控制器 [IP:%s] 上不存在租户", + "ORG_ZSTACK_STORAGE_CEPH_10020": "poolName 可以为 null 但不能为空字符串", + "ORG_ZSTACK_KVM_10022": "ssh 连接到主机[%s]、用户名[%s]、端口[%s]失败,因为%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10073": "无法在 KVM 主机[uuid:%s]上创建空的卷[uuid:%s, name:%s]", + "ORG_ZSTACK_STORAGE_CEPH_10021": "当 importImages 为 true 时,poolName 是必需的", + "ORG_ZSTACK_KVM_10023": "主机[%s]在%d秒内未被开启且原因不明。请检查BMC[%s]中的主机状态", + "ORG_ZSTACK_STORAGE_BACKUP_10092": "未通过恢复安全检查:\\n%s", + "ORG_ZSTACK_KVM_10014": "主机 %s 未由当前 mn 节点管理", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10000": "执行SLB组配置任务未知 taskName: %s", + "ORG_ZSTACK_MEVOCO_10049": "无法找到节点 A 配置信息", + "ORG_ZSTACK_STORAGE_BACKUP_10091": "备份存储[uuid:%s]未启用且未连接", + "ORG_ZSTACK_KVM_10015": "主机 %s 未连接,跳过以重启 KVM代理", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10039": "无法迁移根卷[uuid:%s],因为存在已连接的mdev设备", + "ORG_ZSTACK_MEVOCO_10048": "不能同时设置本地和配置", + "ORG_ZSTACK_STORAGE_BACKUP_10090": "数据库备份 [uuid:%s] 尚不存在", + "ORG_ZSTACK_KVM_10016": "运行中的任务存在于主机 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10081": "无法在主机 [%s] 上找到标志文件 [%s],原因:%s", + "ORG_ZSTACK_MEVOCO_10047": "意外的主机管理IP地址: [%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10037": "无法迁移 VM[uuid:%s],因为存在已关联的 mdev 设备", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10035": "无法找到 mdev 设备[uuid:%s],它可能已被删除", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10036": "mdev 设备[uuid:%s] 不存在或已禁用,与虚拟机[uuid:%s] 关联", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10034": "未能在目标主机[uuid:%s]中找到足够数量的mdev设备[规格:%s]以供vm[uuid:%s]使用", + "ORG_ZSTACK_MEVOCO_10041": "无效值[%s],ZStack 不支持此类主机分配类型", + "ORG_ZSTACK_STORAGE_BACKUP_10099": "数据库备份[uuid:%s]未启用且就绪", + "ORG_ZSTACK_STORAGE_CDP_10120": "无法找到连接的备份存储[uuid: %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10098": "卷[uuid:%s]已被删除,状态变更不允许", + "ORG_ZSTACK_MEVOCO_10040": "无效值[%s], 它不是一个双精度浮点数", + "ORG_ZSTACK_STORAGE_CDP_10121": "该操作涉及卷[uuid:%s]将创建链类型快照。因此,在VM实例上运行CDP任务时,您无法执行此操作。", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10032": "失败获取候选主机以启动VM[uuid:%s],%s", + "ORG_ZSTACK_STORAGE_BACKUP_10097": "未找到可用的备份存储,跳过此任务", + "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10001": "移除系统主题[uuid:%s]在系统警报[uuid:%s]中是被禁止的", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10005": "无法找到SLB实例的公共网卡", + "ORG_ZSTACK_MEVOCO_10046": "obj 不是 instanceof NicQos!", + "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10000": "报警[uuid:%s]是一个系统报警,无法删除", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10004": "负载均衡实例[uuid:%s]配置任务版本:%d,失败 %d 次", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10003": "无法在组[uuid:%s]中找到可用的SLB实例", + "ORG_ZSTACK_STORAGE_BACKUP_10094": "数据库备份版本[%s]与当前版本[%s]不符", + "ORG_ZSTACK_MACVLAN_10000": "未能在KVM宿主机[uuid:%s, 名称:%s]上实现l2VlanNetwork[uuid:%s, 名称:%s]的桥接,%s", + "ORG_ZSTACK_MEVOCO_10043": "%s 值为[%s],这与%s 值 [%s]存在冲突", + "ORG_ZSTACK_STORAGE_BACKUP_10093": "无法获取可用端口监听", + "ORG_ZSTACK_MEVOCO_10060": "在节点 A 设置地址失败", + "ORG_ZSTACK_KVM_10030": "检查主机容量失败,因为:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10082": "无法在主机 [%s] 上创建标志文件 [%s],原因:%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10060": "获取逻辑交换机失败:uuid: %s", + "ORG_ZSTACK_KVM_10032": "主机[uuid:%s]的可用内存容量[%s]低于预留容量[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10083": "在集群[%s]中不存在LocalStorage主存储[state\u003d%s,status\u003d%s],当集群挂载多个主存储时,默认使用本地主存储。请检查主存储的状态/状态,并确保它们已连接到集群。", + "ORG_ZSTACK_KVM_10033": "无法在 KVM 主机 [uuid:%s, ip:%s] 上为 VM[uuid:%s] 注册colo心跳,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10084": "选择的主要存储类型[uuid:%s]不是本地存储,请检查当集群已挂载本地主要存储时,是否可以在其他存储上创建资源。", + "ORG_ZSTACK_KVM_10034": "无法在 KVM 主机 [uuid:%s, ip:%s] 上启动colo同步虚机[uuid:%s],因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10085": "集群挂载了多个主存储[%s(%s),其他非LocalStorage主存储],无法指定数据卷的primaryStorageUuid %s", + "ORG_ZSTACK_KVM_10024": "主机[%s]在未知原因下未在%d秒内关闭。请检查BMC[%s]中的主机状态", + "ORG_ZSTACK_MEVOCO_10059": "此节点不是节点 A", + "ORG_ZSTACK_MEVOCO_10058": "某些节点在工厂模式下存在,详细信息:%s", + "ORG_ZSTACK_MEVOCO_10053": "curl启动代理程序结束,返回码:%s,标准输出:%s,标准错误:%s", + "ORG_ZSTACK_MEVOCO_10052": "无法在 900s 后获取启动作业 %s 的结果", + "ORG_ZSTACK_MEVOCO_10050": "无法从启动代理中找到节点A地址信息", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10040": "无法迁移 VM[UUID:%s],因为存在已连接的 mdev 设备", + "ORG_ZSTACK_MEVOCO_10057": "节点 A 更新工厂模式失败,详情: %s", + "ORG_ZSTACK_MEVOCO_10056": "所有管理节点更新工厂模式失败,详情: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10013": "MAC地址 %s 无效。它应该类似于 6c:b3:11:1b:0b:1e", + "ORG_ZSTACK_HA_10014": "无法将 FT 设置到包含 USB 设备直通的 VM[uuid:%s] 上", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10012": "裸金属 PXE 服务器[uuid:%s]既未启用也未连接,请检查", + "ORG_ZSTACK_HA_10015": "无法在包含[%s]的vmm上设置FT,因为已附加mdev设备", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10015": "检测到重复的 bm 绑定 UUID", + "ORG_ZSTACK_HA_10016": "管理节点无法扫描主机", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10014": "裸金属机架[uuid:%s]没有带有MAC地址%s的网卡", + "ORG_ZSTACK_HA_10017": "值[%s]小于0或大于1", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10057": "主机[uuid: %s]的本地主要存储[uuid: %s]没有足够的容量[current: %s 字节, needed: %s]", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10017": "检测到重复的三层网络UUID", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10058": "无法找到任何拥有资源[uuid:%s]的主机", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10016": "裸金属绑定不存在", + "ORG_ZSTACK_HA_10011": "无法在虚拟机[uuid:%s]上设置FT,因为该虚拟机未停止", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10059": "资源[uuid:%s]只能在主机[uuid:%s]上操作,但该主机已被删除", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10019": "选择的第3层网络无法分配给机箱[UUID:%s]", + "ORG_ZSTACK_HA_10012": "无法将 FT 设置在虚拟机[uuid:%s]上,因为仍有数据卷附加其中", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10018": "选择的三层网络不存在", + "ORG_ZSTACK_HA_10013": "无法在虚拟机[uuid:%s]上设置FT,因为已连接了PCI设备", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10053": "要在本地主存储上创建数据卷,您必须使用系统标签 [%s] 指定数据卷将要创建的主机", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10054": "主机[UUID:%s]不属于本地主要存储[UUID:%s]", + "ORG_ZSTACK_KVM_10040": "失败增加虚拟机CPU,错误详情: %s", + "ORG_ZSTACK_HA_10018": "该虚拟机[uuid:%s]的卷存储位置处于维护状态,请联系管理员解决", + "ORG_ZSTACK_KVM_10043": "无法连接到 KVM[ip:%s, 用户名:%s, SSH端口:%d] 执行 DNS 检查,请检查用户名/密码是否正确;%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10050": "无法将带有本地存储数据卷的虚拟机[uuid:%s]进行在线迁移。首先需要先分离所有数据卷。", + "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10001": "查询对象为空", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10051": "无法将具有本地存储的虚拟机[uuid:%s]在线迁移。仅支持Linux来宾操作系统。当前平台是[%s]", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10011": "裸金属机架[uuid:%s]中未找到硬件信息,请选择另一个。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10052": "无法将带有本地存储 ISO 的 VM[UUID:%s] 在线迁移。首先需要先卸载所有 ISO。", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10010": "没有对应的PXE服务器,请再次检查UUID为[%s]的裸金属机箱", + "ORG_ZSTACK_KVM_10035": "无法在 KVM 主机 [uuid:%s, ip:%s] 上配置次要 VM[uuid:%s],因为 %s", + "ORG_ZSTACK_MEVOCO_10028": "L3网络[uuid:%s]未找到。请修正您的静态IP的系统标签[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10070": "无法找到卷备份[uuid:%s]", + "ORG_ZSTACK_KVM_10036": "无法在 KVM 主机[uuid:%s, ip:%s]上配置主 VM[uuid:%s],因为%s", + "ORG_ZSTACK_MEVOCO_10027": "无效的卷 IOPS[%s] 大于 %d", + "ORG_ZSTACK_KVM_10037": "无法获取VM[uuid:%s]在KVM宿主机[uuid:%s, ip:%s]上的首次启动设备,因为%s", + "ORG_ZSTACK_MEVOCO_10026": "无效的卷IOPS[%s]不是一个数字", + "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10000": "在查询 ThirdPartyPrometheusNamespace 时,至少需要一个 HostUuid。请检查查询调用参数中是否包含 HostUuid。", + "ORG_ZSTACK_KVM_10038": "失败获取虚机[uuid:%s]的设备地址,因为:%s", + "ORG_ZSTACK_MEVOCO_10025": "无效的卷IOPS[%s],它必须大于1(包括1)", + "ORG_ZSTACK_KVM_10039": "失败获取主机[uuid:%s]的虚拟化信息,因为:%s", + "ORG_ZSTACK_MEVOCO_10029": "USB设备只能由管理员账号调用", + "ORG_ZSTACK_STORAGE_BACKUP_10078": "备份存储无法执行消息[%s],因为其状态为%s", + "ORG_ZSTACK_MEVOCO_10020": "无效的卷带宽[%s]不是一个数字", + "ORG_ZSTACK_STORAGE_BACKUP_10077": "备份存储无法执行消息[%s],因为其状态为%s", + "ORG_ZSTACK_STORAGE_BACKUP_10076": "备份存储[uuid:%s, name:%s]没有足够的容量下载图像[%s]。所需大小:%s,可用大小:%s", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10001": "所有 Ceph 主节点在 Ceph 备份存储[uuid:%s] 中断开连接", + "ORG_ZSTACK_STORAGE_BACKUP_10075": "从 URL %s 获取到的图片大小为 %d 字节,这太小了,无法作为图片,请再次检查 URL。", + "ORG_ZSTACK_STORAGE_BACKUP_10074": "获取图像 URL %s 的头部失败", + "ORG_ZSTACK_STORAGE_BACKUP_10073": "获取图片 URL %s 的头部信息失败: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10072": "请先停止其他节点!", + "ORG_ZSTACK_MEVOCO_10021": "无效的卷带宽[%s]大于%d", + "ORG_ZSTACK_STORAGE_BACKUP_10071": "虚拟机[%s]的集群不在与主存储[%s]相同的集群中", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10023": "无法清除不是处于销毁状态的裸金属实例", + "ORG_ZSTACK_HA_10005": "主机未能对故障主机[uuid:%s, ip:%s]进行端口扫描", + "ORG_ZSTACK_IDENTITY_LOGIN_10000": "不支持的登录类型 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10068": "集群[uuid\u003d%s] 挂载了多个主存储[LocalStorage,其他非LocalStorage主存储],您必须指定数据盘所在的主存储", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10003": "Failed to migrate Image %s from BS %s to BS %s. cause: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10002": "找到 trashId(%s) 在备份存储 [%s] 中用于迁移安装路径[%s]。如果您坚持要迁移镜像[%s],请先通过 \u0027APICleanUpTrashOnBackupStorageMsg\u0027 清理它。", + "ORG_ZSTACK_HA_10000": "可能该VM已被删除,跳过HA检查器", + "ORG_ZSTACK_HA_10001": "无法找到虚拟机[name:%s, uuid:%s]的宿主机,hostUuid为空", + "ORG_ZSTACK_HA_10002": "没有找到HaHostChecker,无法进行HA操作", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10064": "{主机[uuid:%s]的物理容量使用量已超出阈值[%s]}", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10067": "集群[uuid\u003d%s] 挂载了多个主存储[LocalStorage,其他非LocalStorage主存储],您必须指定根磁盘所在的主存储", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10060": "KVM 主机[uuid: %s] 无法添加到本地主存储[uuid: %s]中,%s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10020": "仅支持 ISO 镜像在 ZStack 裸金属服务中", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10061": "无法在 KVM 主机[uuid:%s, ip:%s]上创建空快照卷[name:%s, installpath: %s],因为%s", + "ORG_ZSTACK_KVM_10054": "当虚拟机[uuid:%s]处于状态%s时,无法进行卷快照合并。该操作仅允许在虚拟机处于运行中或停止状态时执行", + "ORG_ZSTACK_HA_10008": "异常发生于同步自我防护状态至宿主机[uuid: %s]时,%s", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10000": "目录[%s]在管理服务器[%s]上未找到", + "ORG_ZSTACK_KVM_10055": "实时卷快照合并需要 libvirt 版本大于 %s,当前 libvirt 版本是 %s。请停止虚拟机并重新执行该操作或如果它是数据卷则detach该卷", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10062": "从 SFTP 备份存储[主机名:%s, 路径: %s]下载数据到本地主存储[唯一标识:%s, 路径: %s]失败,%s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10022": "无法恢复处于非销毁状态的裸金属实例", + "ORG_ZSTACK_HA_10009": "The %s 无法设置为 \u0027%s\u0027,因为存储网络已失效,必须保持HA启用。", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10001": "命名空间[%s]不存在度量[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10063": "失败从本地存储[uuid:%s, 路径:%s]上传比特到SFTP备份存储[主机名:%s, 路径:%s],错误信息:%s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10021": "仅支持在裸金属服务中使用ImageStoreBackupStorage", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10002": "指标[%s]命名空间[%s]中不存在名为%s的标签", + "ORG_ZSTACK_MEVOCO_10039": "无效值[%s],它必须是一个在(0, 1]范围内的双精度数", + "ORG_ZSTACK_KVM_10047": "主机[uuid:%s, 状态:%s]未连接", + "ORG_ZSTACK_COMPUTE_OVS_10000": "ovs cpu 固定资源配置:[%s] 格式错误。", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10001": "故意为之 1", + "ORG_ZSTACK_MEVOCO_10037": "无效值[%s],它必须是一个大于0的双精度数", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10002": "故意为之 2", + "ORG_ZSTACK_MEVOCO_10031": "未知的安全级别代码[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10089": "卷备份元数据操作失败,因为 %s", + "ORG_ZSTACK_STORAGE_BACKUP_10087": "在图像存储[uuid:%s]生成卷备份元数据文件失败,因为IO错误:%s", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10000": "故意 3", + "ORG_ZSTACK_MEVOCO_10034": "主机[uuid:%s]的操作系统 %s %s 版本过于老旧,QEMU 不支持网络或磁盘 I/O 的 QoS。请选择另一个没有 QoS 配置的实例 offerings。", + "ORG_ZSTACK_MEVOCO_10033": "[%s] 不是标准CIDR", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10010": "无法添加带有无效VLAN范围[%s, %s]的华为iMaster SDN控制器", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10008": "iso[uuid: %s] 已附加到 vm[uuid: ], 但 iso 不在任何块存储上,您必须先将其detach,再迁移vm", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10009": "失败找到卷:%s 的块 SCSI LUN", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10035": "主机[uuid:%s]无法访问本地存储[uuid:%s], 可能是其已被分离", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10013": "无法创建华为iMaster L3网络,因为缺少逻辑路由器UUID", + "ORG_ZSTACK_MEVOCO_10093": "删除存储服务质量 [%s] 因账户权限忽略。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10036": "资源[uuid:%s, 类型: %s] 不在本地主存储[uuid:%s] 上", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10014": "无法创建华为iMaster L3网络,因为l2网络[uuid:%s]已经存在", + "ORG_ZSTACK_MEVOCO_10092": "无效的卷服务质量模式: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10037": "资源[uuid:%s, 类型: %s]在本地主存储[uuid:%s]上映射到多个hypervisor%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10011": "无法添加华为iMaster SDN控制器而未指定VLAN范围或VLAN范围", + "ORG_ZSTACK_MEVOCO_10091": "未找到卷", + "ORG_ZSTACK_STORAGE_BACKUP_10058": "无法指定连接不同集群的主存储。", + "ORG_ZSTACK_STORAGE_BACKUP_10057": "无法创建 VM,因为至少应设置一个字段(l3NetworkUuids、zoneUuid、clusterUuid、hostUuid)", + "ORG_ZSTACK_MEVOCO_10090": "无法为附加了多个虚拟机[%s, %s]的卷[%s]创建快照", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10033": "无法在本地主要存储[uuid: %s]上创建数据卷[uuid: %s],因为未指定主机Uuid。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10034": "没有启用主机状态,请检查主机的可用性", + "ORG_ZSTACK_KVM_10064": "失败在KVM宿主机[uuid:%s, ip:%s]更新网卡[nic:vm:%s]因为%s", + "ORG_ZSTACK_KVM_10065": "failed to attach nic[uuid:%s, vm:%s] on kvm host[uuid:%s, ip:%s], because %s, please try again or delete device[%s] by yourself", + "ORG_ZSTACK_KVM_10066": "失败在KVM宿主机[uuid:%s, ip:%s]上Attach网卡[nic:uuid:%s, vm:%s],因为%s", + "ORG_ZSTACK_KVM_10067": "失败从KVM宿主机[uuid:%s, ip:%s]卸载数据卷[uuid:%s, installPath:%s]至虚拟机[uuid:%s, name:%s],原因:%s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10005": "端口转发规则 [uuid:%s] 已删除", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10006": "端口转发规则[uuid:%s]未处于启用状态,当前状态为%s", + "ORG_ZSTACK_KVM_10059": "vm[uuid:%s]当前不是运行或停止状态,当前状态[%s]", + "ORG_ZSTACK_TICKET_10000": "票据[uuid:%s, 名称:%s]只能在取消之后才能更新,当前状态是%s", + "ORG_ZSTACK_TICKET_10001": "操作被拒绝。此操作需由账号/虚拟ID[uuid:%s]执行", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10017": "获取 SDN 控制器 [IP:%s] 的令牌失败", + "ORG_ZSTACK_MEVOCO_10086": "意外地,VM[uuid:%s] 已经不再运行,请稍后重试", + "ORG_ZSTACK_STORAGE_BACKUP_10056": "当前卷[uuid: %s]的虚拟机[uuid: %s]已不再是用于备份的虚拟机[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10003": "无法执行映射LUN到主机流程,因为PS主机引用元数据为空", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10018": "获取 SDN 控制器 [IP:%s] 的令牌失败,因为 %s", + "ORG_ZSTACK_MEVOCO_10085": "无法从卷[uuid: %s]的树[uuid: %s]中找到快照。可能是无需验证的快照链。", + "ORG_ZSTACK_STORAGE_BACKUP_10055": "根卷备份在组[uuid:%s]中未找到", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10000": "无法执行映射 LUN 到主机流程,因为后端设备为空", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10015": "无法删除华为逻辑路由器[uuid:%s],因为三层网络[uuid:%s]已绑定", + "ORG_ZSTACK_MEVOCO_10084": "无法从卷[uuid: %s]的树[uuid: %s]中找到最新的快照。可能无需验证快照链。", + "ORG_ZSTACK_STORAGE_BACKUP_10054": "未找到该组UUID: %s 的卷备份", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10016": "获取 SDN 控制器 [IP:%s] 的令牌失败", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10001": "无法执行映射LUN到主机流程,因为PS主机引用为空", + "ORG_ZSTACK_MEVOCO_10083": "无法在卷[uuid: %s]使用的快照树中找到。可能是无需验证的快照链。", + "ORG_ZSTACK_STORAGE_BACKUP_10053": "资源[uuid: %s]已经创建了CDP任务,无法同时创建备份作业。", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10006": "KVM 主机[uuid: %s] 无法添加到块主存储[uuid: %s] 中,%s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10009": "端口转发规则[uuid:%s]不在启用状态,当前状态为%s。只有在启用状态下才能附加该规则", + "ORG_ZSTACK_STORAGE_BACKUP_10052": "Failed to create backups for VM[uuid:%s], because it is not in state[%s, %s] \n失败了为VM[uuid:%s]创建备份,因为它不在状态[%s, %s]", + "ORG_ZSTACK_MEVOCO_10089": "无法为包含重复卷[uuid: %s]的卷[%s]截取快照", + "ORG_ZSTACK_STORAGE_BACKUP_10051": "卷[uuid:%s]不是根卷", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10019": "删除 SDN 控制器 [IP:%s] 的令牌失败,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10004": "无法执行映射LUN到主机流程,无效的LUN ID", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10007": "端口转发规则 rule[uuid:%s] 没有绑定到任何 VM 的网卡上,无法解除绑定", + "ORG_ZSTACK_MEVOCO_10088": "无法为挂载状态以外的卷[%s]创建快照", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10005": "无法执行映射LUN到主机流程,无效的LUN类型", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10008": "端口转发规则[uuid:%s]已绑定到VM网卡[uuid:%s],无法再次绑定", + "ORG_ZSTACK_MEVOCO_10087": "如何一个运行中的VM[uuid:%s]没有宿主机uuid?", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10020": "获取 SDN 控制器 [IP:%s] 的租户信息失败", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10021": "获取 SDN 控制器 [IP:%s] 的租户信息失败,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10019": "存储块[uuid:%s, name:%s]无法在关联的集群中找到可用主机以实例化卷", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10024": "获取 SDN 控制器 [IP:%s] 的逻辑交换机端口失败", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10047": "无法将数据卷[uuid:%s]挂载到虚拟机[uuid:%s]。两个虚拟机的根卷和数据卷都位于本地主存储上,但它们位于不同的主机上。根卷[uuid:%s]位于主机[uuid:%s]上,而数据卷[uuid:%s]位于主机[uuid:%s]上", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10025": "获取 SDN 控制器 [IP:%s] 的交换机端口失败,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10048": "数据卷[name:%s, uuid:%s]位于本地存储[uuid:%s]上;然而,包含该数据卷的主机已被删除。无法恢复此卷", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10022": "获取 SDN 控制器 [IP:%s] 的交换设备失败", + "ORG_ZSTACK_STORAGE_BACKUP_10069": "VM正在创建备份任务,无法同时启用CDP任务。", + "ORG_ZSTACK_KVM_10070": "失败在KVM宿主机[uuid:%s, ip:%s]上销毁虚拟机[uuid:%s name:%s],因为%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10049": "无法恢复虚拟机[uuid:%s, name:%s]。该虚拟机的根磁盘位于本地存储[uuid:%s];然而,托管根磁盘的主机已被删除", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10023": "获取 SDN 控制器 [IP:%s] 的交换设备失败,因为 %s", + "ORG_ZSTACK_STORAGE_BACKUP_10068": "主机[uuid: %s]的集群不在与卷[uuid: %s]主存储相同的集群中", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10020": "该虚拟机[name:%s uuid:%s]已经存在端口转发规则,其VIP与[uuid:%s]不同", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10044": "创建依赖于镜像缓存[uuid:%s, 位于主机uuid列表: [%s]], 无法在其他位置创建。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10045": "本地存储不支持针对hypervisor[%s]的在线迁移", + "ORG_ZSTACK_KVM_10075": "失败在KVM宿主机[uuid:%s, ip:%s]上停止虚拟机[uuid:%s name:%s],因为%s", + "ORG_ZSTACK_KVM_10078": "主机[uuid:%s]的容量不足以提供cpu[%s], 内存[%s字节]", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10017": "VIP端口范围[vipStartPort:%s, vipEndPort:%s]与规则[uuid:%s, vipStartPort:%s, vipEndPort:%s]重叠", + "ORG_ZSTACK_KVM_10069": "无法将数据卷[uuid:%s, installPath:%s]附加到vm[uuid:%s, name:%s]上,该vm位于kvm宿主机[uuid:%s, ip:%s]上,因为%s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10014": "无效的 CIDR[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10015": "无效的CIDR[%s],仅支持ipv4", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10012": "无法创建端口转发规则,因为公网端口范围[vipStartPort:%s, vipEndPort:%s]与私网端口范围[privateStartPort:%s, privateEndPort:%s]不兼容", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10010": "无法找到卷列表:%s 的块 SCSI LUN", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10013": "对于端口转发范围,端口范围大小必须匹配;VIP范围[%s, %s]的大小与范围[%s, %s]的大小不匹配", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10010": "来宾L3网络与端口转发规则的VIP L3网络相同[uuid:%s]和[uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10028": "获取SDN控制器[%s]的Fabric失败", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10013": "不支持在包含ceph的情况下对多个ps进行卷快照操作", + "ORG_ZSTACK_MEVOCO_10097": "未知消息版本。", + "ORG_ZSTACK_STORAGE_BACKUP_10067": "未找到可用的备份存储", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10014": "映射 LUN 到主机前失败,在将卷挂载到 VM 之前", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10029": "获取 SDN 控制器 [IP:%s] 的 fabrics 失败,因为 %s", + "ORG_ZSTACK_MEVOCO_10096": "非管理员账号不能设置带宽超过 %s", + "ORG_ZSTACK_STORAGE_BACKUP_10066": "VM 不处于停止状态: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10026": "获取 SDN 控制器 [IP:%s] 的 VPC 失败", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10011": "失败交换块 SCSI LUN 信息:%s", + "ORG_ZSTACK_MEVOCO_10095": "SetVolumeQosMsg 版本 1 已废弃,请使用版本 2", + "ORG_ZSTACK_STORAGE_BACKUP_10065": "VM未找到,带有体积备份[uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10027": "获取 SDN 控制器 [IP:%s] 的 VPC 失败,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10012": "detach volume 后清理资源失败,因为 %s", + "ORG_ZSTACK_MEVOCO_10094": "无法在主机 %s 删除虚拟机的卷服务质量,因为当前虚拟机的状态为 %s,但支持的预期状态为 [%s, %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10064": "原始卷[uuid:%s]用于备份[uuid:%s]已不再挂载至vm[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10063": "原始卷[uuid:%s]用于备份已被删除,无法将卷还原到该卷", + "ORG_ZSTACK_MEVOCO_10099": "非管理员账号仅允许设置总 %s 限制。", + "ORG_ZSTACK_STORAGE_BACKUP_10061": "卷备份[uuid:%s]处于状态%s,无法将其还原到该卷", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10016": "primaryStorageUuid 是必填项,当下载镜像缓存时", + "ORG_ZSTACK_MEVOCO_10098": "未知质量保证限值类型。", + "ORG_ZSTACK_STORAGE_BACKUP_10060": "无法从非根卷备份[uuid:%s]创建VM", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10017": "该虚拟机在不同的主机上具有多个本地卷[%s]。请检查异常的虚拟机本地卷", + "ORG_ZSTACK_STORAGE_CEPH_10004": "无效的监控URL[%s],主机名不能为空。有效的监控URL格式为%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10032": "获取 iMaster 逻辑交换机 [%s] 无响应", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10018": "主机[hostUuid:%s]上的卷无法附加到VM,因为该VM在其他主机[hostUuid:%s]上有本地卷", + "ORG_ZSTACK_STORAGE_CEPH_10005": "无效的 monUrl[%s],SSH端口大于65535或小于1。有效的 monUrl 格式为 %s", + "ORG_ZSTACK_STORAGE_CEPH_10002": "无效的 monUrl[%s],sshUsername:sshPassword 部分无效。有效的 monUrl 格式为 %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10030": "创建华为 iMaster 逻辑交换机 [%s] 失败因为 %s", + "ORG_ZSTACK_STORAGE_CEPH_10003": "无效的 monUrl[%s]。SSH用户名和密码必须用\u0027:\u0027分隔且不能为空。有效的 monUrl 格式为 %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10035": "[%s] 华为 iMaster 逻辑交换端口 [%s] 失败原因:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10013": "两个集群[uuid:%s,uuid:%s]在迁移vm[uuid:%s]到另一个集群时无法在l2网络中互相访问", + "ORG_ZSTACK_STORAGE_CEPH_10008": "Ceph 存储池[uuid:%s]已在此名称下添加到ZStack并被其他地方使用,无法重复使用该Ceph存储池。", + "ORG_ZSTACK_STORAGE_BACKUP_10038": "无效 URL[%s],应为 hostname:/path", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10036": "获取逻辑交换机端口 pf 逻辑交换机[%s]失败,因为%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10014": "URL[%s] 不是以 \u0027/\u0027 开头的绝对路径", + "ORG_ZSTACK_STORAGE_CEPH_10009": "无法添加 Ceph 主存储,已有使用 mon[主机名:%s] 的 Ceph 主存储", + "ORG_ZSTACK_STORAGE_BACKUP_10037": "无效类型[%s],应为[nfs, sshfs, nbd]", + "ORG_ZSTACK_STORAGE_CEPH_10006": "操作失败,因为池名称[poolName:%s]不能包含不可打印的ASCII字符。", + "ORG_ZSTACK_KVM_10080": "当虚拟机平台为其他时,数据卷和光驱的数量不能超过3个,当前为%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10033": "删除华为 iMaster 逻辑交换机 [%s] 失败,因为 %s", + "ORG_ZSTACK_STORAGE_BACKUP_10036": "学位 [%s] 应该是正数", + "ORG_ZSTACK_STORAGE_CEPH_10007": "创建失败,重复的 poolName[%s]。存在同名的池[uuid:%s]。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10016": "虚拟机[主机UUID:%s]的宿主机与卷[主机UUID:%s]的宿主机不同。卷无法挂载到该虚拟机。", + "ORG_ZSTACK_STORAGE_BACKUP_10035": "[%s] 不是标准的 cidr,你是指 [%s]?", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10034": "更新华为 imaster 逻辑交换机 [%s] 失败,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10010": "该磁盘[uuid:%s]是虚拟机[uuid:%s]的根磁盘。当前,该虚拟机仍挂载有 %s 个数据磁盘,请先卸载它们再进行迁移", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10011": "该磁盘[uuid:%s]是虚拟机[uuid:%s]的根磁盘。当前虚拟机仍挂载有ISO文件,请先卸载后再进行迁移", + "ORG_ZSTACK_KVM_10088": "失败在KVM宿主机[uuid:%s, ip:%s]上检查物理网络接口[name:%s]", + "ORG_ZSTACK_KVM_10079": "主机[%s]更新SPICE通道配置失败,因为%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10021": "卷:%s 未挂载,无法为卷创建镜像缓存", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10024": "失败于查找安装路径以下载卷: %s,请提前准备该路径。", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10039": "删除华为 iMaster 逻辑路由器[%s]失败,因为%s", + "ORG_ZSTACK_MEVOCO_10064": "网络入站带宽格式错误 %s", + "ORG_ZSTACK_STORAGE_BACKUP_10034": "卷备份[uuid:%s]在任何备份存储中未找到", + "ORG_ZSTACK_MEVOCO_10063": "网络入站带宽超过最大值32G bps", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10025": "失败找到主机下载卷 %s", + "ORG_ZSTACK_STORAGE_BACKUP_10033": "没有权限在 uuid: %s 组内的卷备份中操作", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10022": "无法找到目标主机 for 体积:%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10037": "删除华为 iMaster 逻辑交换端口 [%s] 失败,因为 %s", + "ORG_ZSTACK_STORAGE_BACKUP_10032": "多个根磁盘在组uuid: %s 内被找到", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10023": "失败找到与卷 %s 映射的主机", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10038": "创建华为iMaster逻辑路由器[%s]失败,因为%s", + "ORG_ZSTACK_MEVOCO_10061": "管理节点状态不是%s", + "ORG_ZSTACK_STORAGE_BACKUP_10031": "根磁盘在组uuid: %s 内缺失", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10026": "失败获取主机初始化器引用,请重新连接此主机:%s", + "ORG_ZSTACK_MEVOCO_10066": "网络出站带宽格式错误 %s", + "ORG_ZSTACK_MEVOCO_10065": "网络出站带宽超出最大值32G bps", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10042": "创建华为iMaster子网[%s]失败,因为%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10028": "下载镜像[uuid:%s]到本地存储[uuid:%s]的所有主机失败。%s", + "ORG_ZSTACK_STORAGE_CEPH_10015": "无效的 monUrl[%s]. 一个有效的 URL 格式为 %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10043": "删除华为 iMaster 子网[%s]失败,因为%s", + "ORG_ZSTACK_STORAGE_CEPH_10016": "dataVolumePoolName 可以为 null 但不能为空字符串", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10040": "创建华为iMaster逻辑链路[%s]失败,因为%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10041": "删除华为 iMaster 逻辑链路[%s]失败,因为%s", + "ORG_ZSTACK_STORAGE_CEPH_10019": "无法添加 Ceph 备份存储,当前有使用 mon[主机名:%s] 的 Ceph 备份存储", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10046": "没有新的物理交换机端口链接,这不应该发生", + "ORG_ZSTACK_MEVOCO_10082": "失败设置IO线程[%d]绑定[%s]在虚拟机[%s]上: %s。", + "ORG_ZSTACK_STORAGE_BACKUP_10049": "创建卷备份时失败,卷[uuid:%s]的关联卷不在状态[%s, %s]中", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10025": "主要存储[uuid:%s]已禁用,不允许冷迁移", + "ORG_ZSTACK_STORAGE_BACKUP_10048": "创建卷备份时失败,因为虚拟机不在状态[%s, %s]的范围内", + "ORG_ZSTACK_STORAGE_CEPH_10017": "rootVolumePoolName 可以为 null 但不能为空字符串", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10026": "卷[uuid:%s]不再在本地存储上存在,它可能已被删除", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10044": "获取 SDN 控制器 [IP:%s] 的系统信息失败", + "ORG_ZSTACK_STORAGE_BACKUP_10047": "创建卷备份时失败,因为该卷未连接到任何虚拟机[uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_10018": "imageCachePoolName 可以为 null 但不能为空字符串", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10045": "获取 SDN 控制器 [IP:%s] 的系统信息失败,因为 %s", + "ORG_ZSTACK_STORAGE_BACKUP_10046": "无法为共享卷[uuid:%s]创建卷备份", + "ORG_ZSTACK_KVM_10093": "无法连接到KVM宿主机[uuid:%s, ip:%s, url:%s],原因:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10022": "要在本地主存储上创建卷,您必须指定将使用系统标签 [%s] 创建卷的主机", + "ORG_ZSTACK_KVM_10096": "主机无法访问任何主要存储,%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10023": "无效的 URI,正确的示例是 file://$URL;hostUuid://$HOSTUUID 或 volume://$VOLUMEUUID", + "ORG_ZSTACK_STORAGE_CEPH_10012": "添加相同的 Mon 节点是不允许的", + "ORG_ZSTACK_KVM_10099": "主机[%s] SSH端口[%s]在%s秒后仍未打开,连接超时", + "ORG_ZSTACK_STORAGE_CEPH_10010": "无法在同一监控组中添加相同的主机[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10031": "备份快照到备份存储是一个已弃用的功能,不支持在块级主存储上使用", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10032": "失败在ps:%s上查找集群以处理提交卷", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10035": "主存储 UUID 在删除 LUN 时是必填项", + "ORG_ZSTACK_MEVOCO_10075": "共享磁盘目前仅支持 virtio-scsi 类型", + "ORG_ZSTACK_STORAGE_BACKUP_10045": "意外的备份存储[type:%s,uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10036": "主机UUID在获取主机初始化器名称时是必填项", + "ORG_ZSTACK_MEVOCO_10074": "可共享卷[uuid:%s]已附加到VM[uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10048": "没有找到新的物理交换机端口,这不应该发生", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10033": "失败找到宿主机以提交卷:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10034": "失败从BackupStorage[主机名:%s]下载[%s]到块主存储[uuid:%s,路径:%s], %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10049": "在 SDN 控制器 [IP:%s] 上不存在 Fabric", + "ORG_ZSTACK_MEVOCO_10078": "当前版本的许可证不支持修改此资源配置 [名称:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10037": "发起人名称 %s 被其他主机占用,请重新生成主机 %s 的发起人", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10038": "未能根据名称找到模板 LUN:%s", + "ORG_ZSTACK_MEVOCO_10076": "可共享的卷[uuid: %s]已挂载,不支持组快照。", + "ORG_ZSTACK_AI_MESSAGE_10002": "无法取消数据集创建任务,因为 resourceUuid[%s] 或 modelCenterUuid[%s] 为空", + "ORG_ZSTACK_AI_MESSAGE_10001": "无法取消模型服务下载任务,因为 resourceUuid[%s] 或 modelCenterUuid[%s] 为空", + "ORG_ZSTACK_IPSEC_VYOS_10009": "应用到高可用组失败,因为 %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10013": "失败的 HTTP 调用所有 Prometheus 实例", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10012": "未知值类型 %s, key \u003d %s", + "ORG_ZSTACK_ENCRYPT_10000": "解析API消息失败:无法解析加密参数,类型为%s", + "ORG_ZSTACK_ENCRYPT_10002": "解析API消息失败:发现%d个加密参数系统标签,预期为1个", + "ORG_ZSTACK_IPSEC_VYOS_10001": "vyos 不支持 aes-192 作为 IkeEncryptionAlgorithm,可用选项为 aes-128, aes-256, 3des", + "ORG_ZSTACK_IPSEC_VYOS_10000": "远程CIDR[%s]与虚拟路由器接口CIDR[%s]重叠", + "ORG_ZSTACK_IPSEC_VYOS_10003": "vyos 不支持将 %d 作为IKE DH组", + "ORG_ZSTACK_IPSEC_VYOS_10002": "vyos 不支持 aes-192 作为 PolicyEncryptionAlgorithm,可用选项为 aes-128、aes-256、3des", + "ORG_ZSTACK_COMPUTE_VM_10000": "VM[%s] 的状态不是运行状态,无法同步时间", + "ORG_ZSTACK_COMPUTE_VM_10008": "vm[uuid:%s] 处于集群[uuid:%s]中,但集群中没有可用的主机,无法为 vm 更换镜像", + "ORG_ZSTACK_COMPUTE_VM_10007": "vm[uuid:%s] 的集群UUID为空,无法为其更改镜像", + "ORG_ZSTACK_COMPUTE_VM_10006": "vm[uuid: %s] 的状态现在不是已停止,无法执行 \u0027changevmimage\u0027 操作", + "ORG_ZSTACK_COMPUTE_VM_10005": "xml挂钩[uuid: %s]成功附加到vm[uuid:%s],但失败重启vm。详细信息是: %s", + "ORG_ZSTACK_COMPUTE_VM_10004": "xml挂钩[uuid: %s]已成功从vm[uuid:%s]分离,但未能重启vm。详细信息是: %s", + "ORG_ZSTACK_COMPUTE_VM_10003": "热插拔未关闭,无法打开VM NUMA", + "ORG_ZSTACK_COMPUTE_VM_10011": "方向必须设置为 in 或 out", + "ORG_ZSTACK_COMPUTE_VM_10010": "无法找到备份存储,无法提交卷快照[psUuid:%s]作为镜像,目标需要PS uuid:%s", + "ORG_ZSTACK_COMPUTE_VM_10018": "状态在更改密码时不正确。", + "ORG_ZSTACK_COMPUTE_VM_10017": "未在数据库中找到目标主机的UUID:%s,无法向该主机发送修改密码命令!", + "ORG_ZSTACK_STORAGE_DEVICE_10036": "HBG扫描错误: %s", + "ORG_ZSTACK_COMPUTE_VM_10015": "vm [%s] 的 HostUuid 为空,无法同步网卡 qos", + "ORG_ZSTACK_COMPUTE_VM_10014": "vm [%s] 的状态必须为运行中或暂停中才能同步网卡 qos", + "ORG_ZSTACK_STORAGE_DEVICE_10031": "云实例[UUID: %s]主机[UUID: %s]未连接SCSI磁盘[UUID: %s]", + "ORG_ZSTACK_COMPUTE_VM_10013": "出站带宽必须设置为不超过 %s。", + "ORG_ZSTACK_COMPUTE_VM_10012": "入站带宽必须设置为不超过 %s。", + "ORG_ZSTACK_STORAGE_DEVICE_10030": "vm 实例[%s]状态[%s]不在允许的状态列表[%s]中", + "ORG_ZSTACK_COMPUTE_VM_10022": "设置安全级别失败,因为安全级别已被禁用。", + "ORG_ZSTACK_COMPUTE_VM_10020": "数据卷的数量超过了限制[num: %s],请在创建 VM 时减少数据卷的数量。", + "ORG_ZSTACK_STORAGE_DEVICE_10028": "指定的scsi lun[wwid: %s] 不存在或禁用", + "ORG_ZSTACK_STORAGE_DEVICE_10029": "scsi[%s] lun[wwid:%s] 已被挂载到vm[%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10026": "不同的 iSCSI 配置在主机[uuid:%s, targets:%s]和主机[uuid:%s, targets:%s]中被发现", + "ORG_ZSTACK_STORAGE_DEVICE_10027": "在不同的主机上发现了不同的磁盘类型,对于逻辑单元[LUN][序列:%s]无法将其附加到集群", + "ORG_ZSTACK_COMPUTE_VM_10029": "因为指定了网络[uuid:%s]的前缀,无法克隆VM", + "ORG_ZSTACK_STORAGE_DEVICE_10024": "SCSI LUN[%s] 记录在主机 [%s] 上未找到", + "ORG_ZSTACK_COMPUTE_VM_10028": "因为 IPv6 地址[%s]无效,无法克隆 VM", + "ORG_ZSTACK_STORAGE_DEVICE_10025": "意外的虚拟机类型[%s]对于主机 [%s]", + "ORG_ZSTACK_COMPUTE_VM_10027": "由于网掩码指定在网络[uuid:%s]上,因此无法克隆VM", + "ORG_ZSTACK_STORAGE_DEVICE_10022": "不同的 NVMe 目标在主机[hostUuid:%s, targets:%s]和主机[hostUuid:%s, targets:%s]中被发现", + "ORG_ZSTACK_COMPUTE_VM_10026": "因为 IP 地址[%s]无效,无法克隆 VM", + "ORG_ZSTACK_STORAGE_DEVICE_10023": "SCSI LUN[%s] 已连接至虚机[VM %s]", + "ORG_ZSTACK_COMPUTE_VM_10025": "因为 L3 网络[uuid:%s] 未找到,无法克隆 VM", + "ORG_ZSTACK_STORAGE_DEVICE_10020": "vm实例[%s]状态[%s]不在允许的状态列表[%s]中", + "ORG_ZSTACK_COMPUTE_VM_10024": "未知的安全级别代码[%s],支持的值为%s", + "ORG_ZSTACK_STORAGE_DEVICE_10021": "vm 实例[%s] 主机[uuid: %s] 未挂载scsi lun[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10023": "无法将安全级别设置为不 %s 虚拟机 [uuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10002": "当前主存储 %s 没有设置第三方令牌,暂时无法创建块卷", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10001": "无效分配的URL:%s", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10000": "分配的URL未找到", + "ORG_ZSTACK_STORAGE_DEVICE_10017": "scsi lun[wwid:%s] 已被附加到vm[%s]中", + "ORG_ZSTACK_STORAGE_DEVICE_10015": "scisLun[uuids:%s] 没有Attach到主机[uuid:%s]的集群上", + "ORG_ZSTACK_STORAGE_DEVICE_10016": "请卸载所有虚拟机[%s]的块设备后再试一次", + "ORG_ZSTACK_STORAGE_DEVICE_10014": "SCSI LUN[WWID: %s] 已被附加到虚拟机实例 %s", + "ORG_ZSTACK_STORAGE_DEVICE_10011": "iSCSI服务器[uuid: %s]未连接到集群[uuid: %s]", + "ORG_ZSTACK_STORAGE_DEVICE_10012": "iSCSI服务器[uuid: %s]仍与集群[uuid: %s]连接", + "ORG_ZSTACK_STORAGE_DEVICE_10010": "iSCSI服务器[uuid: %s]已连接至集群[uuid: %s]", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10008": "localCidr 和 remoteCidr 必须是 Cidr!", + "ORG_ZSTACK_NETWORK_SERVICE_HEADER_NFVINSTGROUP_10000": "查询集群状态不支持此NFV实例类型", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10001": "vpn网关 [%s] 已存在,无法删除远程资源", + "ORG_ZSTACK_STORAGE_DEVICE_10008": "iSCSI服务器[ip: %s, 端口: %s] 已经存在", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10005": "%s 不是一个有效的IPv4地址", + "ORG_ZSTACK_STORAGE_DEVICE_10009": "iSCSI服务器IP: %s 不合法", + "ORG_ZSTACK_STORAGE_DEVICE_10006": "NVMe服务器[uuid: %s]已连接至集群[uuid: %s]", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10007": "远程CIDR必须是CIDR格式!", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10006": "本地Cidr必须是Cidr!", + "ORG_ZSTACK_STORAGE_DEVICE_10004": "NVMe 服务器[ip: %s, 端口: %s, 传输: %s] 已经存在", + "ORG_ZSTACK_STORAGE_DEVICE_10005": "NVMe 服务器 IP: %s 不合法", + "ORG_ZSTACK_STORAGE_DEVICE_10003": "不支持将带有共享块的虚机[uuid:%s]迁移", + "ORG_ZSTACK_STORAGE_DEVICE_10000": "scsi lun[uuid: %s] 和 [uuid: %s] 没有共同的主机", + "ORG_ZSTACK_STORAGE_DEVICE_10001": "scsi 磁盘[uuid: %s]处于禁用状态", + "ORG_ZSTACK_ALIYUN_NETWORK_VPN_10000": "VPN网关和用户网关不在同一个数据中心!", + "ORG_ZSTACK_IPSEC_VYOS_10016": "创建IPsec到HA路由失败,因为 %s", + "ORG_ZSTACK_IPSEC_VYOS_10015": "删除IPsec从HA组失败因为 %s", + "ORG_ZSTACK_COMPUTE_BONDING_10001": "接口[%s]已在主机[%s]上创建", + "ORG_ZSTACK_COMPUTE_BONDING_10008": "绑定卡不能在主机[%s]上的bond中包含速度不同的接口。", + "ORG_ZSTACK_COMPUTE_BONDING_10007": "不能在已进行SRIOV虚拟化的绑定中包含接口[%s]。", + "ORG_ZSTACK_COMPUTE_BONDING_10006": "不能在一个已被用作网络桥接的绑定中包含接口,该绑定已经被主机[%s]使用。", + "ORG_ZSTACK_COMPUTE_BONDING_10005": "不能在bond中占用已由主机[%s]使用的接口。", + "ORG_ZSTACK_IPSEC_VYOS_10012": "更新IPsec版本失败,因为:VPC[%s] 不存在", + "ORG_ZSTACK_COMPUTE_BONDING_10009": "主机[uuid:%s]上不存在从属接口", + "ORG_ZSTACK_IPSEC_VYOS_10013": "同步到HA组失败,因为:%s", + "ORG_ZSTACK_MEVOCO_10105": "非管理员账号无法设置读写 %s 限制大于: %s/%s", + "ORG_ZSTACK_SIMULATOR_10002": "设置为断开连接", + "ORG_ZSTACK_MEVOCO_10104": "非管理员账号无法将写 %s 限制设为无限。", + "ORG_ZSTACK_MEVOCO_10103": "非管理员账户无法将读取限制设置为无限。", + "ORG_ZSTACK_MEVOCO_10102": "非管理员账户仅允许设置读写 %s 限制。", + "ORG_ZSTACK_MEVOCO_10109": "vm [%s] 的 HostUuid 为空,无法同步卷 qos", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10016": "FiSecClientFactory 测试连接失败", + "ORG_ZSTACK_MEVOCO_10108": "vm [%s] 的状态必须为运行中或暂停才能同步卷 qos", + "ORG_ZSTACK_MEVOCO_10107": "卷 [%s] 没有附加到任何 VM(或 VM 不存在),无法同步卷 QoS", + "ORG_ZSTACK_SIMULATOR_10004": "故意", + "ORG_ZSTACK_MEVOCO_10106": "卷 [%s] 没有附加到任何 VM,无法通过 forceSync 获取 QoS", + "ORG_ZSTACK_MEVOCO_10101": "非管理员账号无法设置总 %s 限制大于: %s", + "ORG_ZSTACK_MEVOCO_10100": "非管理员账号无法将总%s限制设为无限。", + "ORG_ZSTACK_COMPUTE_BONDING_10011": "无法绑定与配置了VTEP IP的接口对接", + "ORG_ZSTACK_COMPUTE_BONDING_10010": "无法绑定与管理网络对应的接口。", + "ORG_ZSTACK_COMPUTE_BONDING_10015": "绑定卡不能包含已sriov虚拟化的接口[%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10014": "绑定卡不能使用已被用作网络桥接的接口,该接口已经被宿主机[%s]使用", + "ORG_ZSTACK_COMPUTE_BONDING_10013": "绑定卡不能包含已被主机[%s]占用的接口", + "ORG_ZSTACK_COMPUTE_BONDING_10012": "不能在一个不在同一主机上的[%s]的绑定中包含接口。", + "ORG_ZSTACK_COMPUTE_BONDING_10019": "[%s] �onding 不可以包含 [%s] 接口,它必须是 1 到 2 之间的数字", + "ORG_ZSTACK_COMPUTE_BONDING_10018": "[%s] 汀绑定卡不能包含 [%s] 接口,它必须在 [1~8] 之间", + "ORG_ZSTACK_COMPUTE_BONDING_10017": "[%s] 汇聚网卡无法指定 [%s],仅支持 802.3ad 模式指定不同的 xmit_hash_policy", + "ORG_ZSTACK_COMPUTE_BONDING_10016": "绑定卡不能包含不同速度的接口,这在主机[%s]上存在", + "ORG_ZSTACK_MEVOCO_10113": "卷[uuid:%s] 使用了与原生AIO不兼容的vhost协议。请禁用aio.native或使用不同的卷协议", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10003": "检测秘密资源池[uuid: %s]的连接失败", + "ORG_ZSTACK_MEVOCO_10112": "当前版本的许可证不支持修改此全局配置 [名称:%s]", + "ORG_ZSTACK_MEVOCO_10111": "失败从虚拟机实例:[\\n%s] 解除绑定共享磁盘", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10005": "%s 客户端初始化失败:secretResourcePool 属性无效。", + "ORG_ZSTACK_MEVOCO_10110": "detach 共享磁盘[uuid:%s] 从 VmInstance[uuid:%s] 失败", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10006": "插件(UUID: %s)无法被删除,因为它与以下密钥资源池相关联:[%s]。", + "ORG_ZSTACK_MEDIATOR_10005": "该 VIP[%s] 已经绑定到了其他服务[%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10007": "组织ID[uuid:%s]已经具有操作属性,无法添加%s", + "ORG_ZSTACK_MEDIATOR_10006": "当前端口范围[%s, %s]与VIP[uuid: %s]的协议:%s系统服务端口范围[%s, %s]冲突", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10008": "无法找到区[uuid:%s]", + "ORG_ZSTACK_MEDIATOR_10007": "当前端口范围[%s, %s]与VIP[uuid: %s]的协议:%s使用的端口范围[%s, %s]冲突", + "ORG_ZSTACK_COMPUTE_VM_10080": "vm[uuid:%s] CD-ROM 设备ID重复", + "ORG_ZSTACK_COMPUTE_VM_10077": "VM[uuid:%s] 已挂载 ISO[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10074": "预留内存[%s]大于内存大小[%s]", + "ORG_ZSTACK_COMPUTE_VM_10073": "意外的CPU/内存设置", + "ORG_ZSTACK_COMPUTE_VM_10071": "未能找到虚拟机[uuid\u003d%s]的宿主机", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10000": "虚拟ID[uuid:%s] 已经具有与管理员相关的属性,无法添加 %s", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10000": "身份区域[%s]已存在,uuid是:%s", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10001": "regionId: [%s] 不是阿里云和ZStack定义的有效区域,请选择其他区域", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10002": "类型 [%s] 不匹配数据中心类型 [%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10003": "项目[uuid:%s]已经有一个项目管理员", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10003": "Either dataCenterUuid 或 regionId 应该被设置,请检查参数。", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10004": "项目[uuid:%s]不存在", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10004": "身份区 [%s] 仍在同步过程中,请等待。", + "ORG_ZSTACK_COMPUTE_VM_10079": "在 L3 网络 [%s] 中没有可用的 ipRange", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10005": "虚拟ID[UUID:%s]已经具有项目操作员属性", + "ORG_ZSTACK_COMPUTE_VM_10078": "所有 vm[uuid:%s] 的 CD-ROM 已挂载 ISO 文件", + "ORG_ZSTACK_COMPUTE_VM_10090": "失败Instantiate卷。因为vm的主机[uuid:%s]和分配的主要存储[uuid:%s]未连接。", + "ORG_ZSTACK_COMPUTE_VM_10088": "vm 当前状态[%s],修改virtio 需要vm 状态为[%s]", + "ORG_ZSTACK_COMPUTE_VM_10084": "无法在任何连接的备份存储中找到 ISO[uuid:%s],该备份存储已连接至zone[uuid:%s]。请检查以下内容:\n1. 备份存储是否已连接至虚拟机[name: %s, uuid:%s]运行所在的zone\n2. 如果备份存储处于断开状态,请尝试重新连接", + "ORG_ZSTACK_COMPUTE_VM_10083": "指定的主要存储中没有任何一个是可用的%s", + "ORG_ZSTACK_COMPUTE_VM_10081": "创建依赖于镜像缓存[uuid:%s, 位置ps uuids: [%s]], 无法在其他地方创建。", + "ORG_ZSTACK_KVM_HYPERVISOR_10000": "失败收集主机虚拟化信息", + "ORG_ZSTACK_COMPUTE_VM_10099": "无法切换到L3网络。L3网络[uuid:%s]属于尚未绑定任何集群的L2网络[uuids:%s]", + "ORG_ZSTACK_COMPUTE_VM_10098": "无法切换到L3网络。L3网络[uuid:%s]属于不同的L2网络[uuids:%s]", + "ORG_ZSTACK_COMPUTE_VM_10097": "无法切换到 L3 网络。L3 网络[uuid:%s]没有IP地址范围", + "ORG_ZSTACK_COMPUTE_VM_10096": "无法切换到L3网络。该虚拟机[uuid: %s]未处于运行或停止状态;当前状态为%s", + "ORG_ZSTACK_COMPUTE_VM_10094": "无法切换到L3网络,L3的l2[uuid:%s, %s]使用了不同的vswitch", + "ORG_ZSTACK_COMPUTE_VM_10093": "要么设置 l3NetworkUuids 列表,要么设置 backupStorageUuid 是必须的", + "ORG_ZSTACK_COMPUTE_VM_10092": "无法为处于非运行状态的虚拟机[uuid:%s]截取控制台屏幕截图", + "ORG_ZSTACK_MEDIATOR_10002": "无法附加 L3 网络。要附加的 L3[%s] 的 cidr 与已附加到 VM 上的 L3[%s] 存在重叠", + "ORG_ZSTACK_MEDIATOR_10003": "该虚拟机[name:%s, uuid:%s]已经存在一些端口转发规则%s", + "ORG_ZSTACK_MEDIATOR_10004": "该虚拟机[name:%s, uuid:%s]已经绑定了某些弹性IP%s", + "ORG_ZSTACK_COMPUTE_VM_10033": "由于默认l3Uuids[%s]的大小不是1,因此无法克隆VM", + "ORG_ZSTACK_COMPUTE_VM_10032": "因为状态[%s]无效,无法克隆VM", + "ORG_ZSTACK_COMPUTE_VM_10031": "因为驱动类型[%s]无效,无法克隆VM", + "ORG_ZSTACK_COMPUTE_VM_10030": "因为虚拟机网卡类型[%s]无效,无法克隆虚拟机", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10002": "发现相关垃圾路径(%s)在主存储[%s]中与迁移安装路径[%s]有关。如果您坚持要迁移卷[%s],请先通过\u0027APICleanUpTrashOnPrimaryStorageMsg\u0027清理它们。", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10000": "无法找到任何可用的主机执行存储迁移操作", + "ORG_ZSTACK_COMPUTE_VM_10039": "该操作仅允许对用户VM执行", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10003": "卷[uuid:%s]具有image[uuid:%s]依赖关系,其他依赖image[%s]", + "ORG_ZSTACK_COMPUTE_VM_10038": "The nic [%s%s] is not mounted on the VM 的翻译结果为:\n\n网络接口卡 [%s%s] 没有挂载在虚拟机上", + "ORG_ZSTACK_COMPUTE_VM_10037": "在主存储[uuid: %s]上没有足够的容量进行VM克隆到VM[uuid: %s],卷[uuid: %s]所需容量为%s字节,当前可用容量为%s字节", + "ORG_ZSTACK_COMPUTE_VM_10036": "快速创建虚拟机仅支持克隆原始虚拟机[uuid: %s]的数据磁盘到相同的主存储[uuid: %s]上", + "ORG_ZSTACK_COMPUTE_VM_10035": "快速创建虚拟机仅支持克隆原始虚拟机[uuid: %s]的根卷至相同的主存储[uuid: %s]上", + "ORG_ZSTACK_COMPUTE_VM_10034": "该操作仅允许对用户VM执行", + "ORG_ZSTACK_COMPUTE_CLUSTER_10005": "如果集群类型是裸金属,则hypervisorType也必须是裸金属,反之亦然", + "ORG_ZSTACK_COMPUTE_CLUSTER_10008": "集群[uuid:%s]中存在处于预维护状态的主机,当前无法更新集群操作系统", + "ORG_ZSTACK_COMPUTE_CLUSTER_10009": "不在集群[uuid:%s]中的所有主机都处于连接状态,无法当前更新集群操作系统权限", + "ORG_ZSTACK_COMPUTE_CLUSTER_10006": "只有 KVM 主机的操作系统可以被更新,目前如此", + "ORG_ZSTACK_COMPUTE_CLUSTER_10007": "主机[uuid: %s] 不属于该集群[uuid: %s]。请验证主机的 uuid,并确保它属于此集群。", + "ORG_ZSTACK_COMPUTE_VM_10044": "不要在VM未停止时更改镜像", + "ORG_ZSTACK_COMPUTE_VM_10043": "用户无权限更改虚拟机 %s 的镜像", + "ORG_ZSTACK_COMPUTE_VM_10042": "干净流量不支持虚拟机类型 [%s]", + "ORG_ZSTACK_COMPUTE_VM_10041": "重复的 MAC 地址 [%s]", + "ORG_ZSTACK_COMPUTE_CLUSTER_10000": "内存访问在集群[uuid:%s]禁用大页后不应共享。请先通过UpdateResourceConfig[category\u003d%s name\u003d%s value\u003d%s resourceUuid\u003d%s]启用大页。", + "ORG_ZSTACK_COMPUTE_VM_10040": "该操作仅在虚拟机 [%s] 处于停止状态时允许", + "ORG_ZSTACK_COMPUTE_CLUSTER_10001": "如果集群[uuid:%s]中的内存访问模式为共享,则不应禁用大页。请先通过UpdateResourceConfig[category\u003d%s name\u003d%s value\u003d%s resourceUuid\u003d%s]更新内存访问模式。", + "ORG_ZSTACK_COMPUTE_VM_10049": "要么设置UUID,要么设置账号,要么设置密码", + "ORG_ZSTACK_COMPUTE_VM_10048": "实例[uuid:%s]无法更改镜像为镜像[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10047": "vm[uuid:%s] 没有默认的三层网络,无法为其更改镜像", + "ORG_ZSTACK_COMPUTE_VM_10046": "请确保最后一个主机VM[uuid:%s]所在的节点是启用状态并已连接。", + "ORG_ZSTACK_COMPUTE_VM_10045": "请确保主存储VM[uuid:%s]所在的节点已启用并连接。", + "ORG_ZSTACK_IAM2_CONTAINER_10009": "失败打开kube配置文件: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10007": "获取授权项目失败,因为内容为空", + "ORG_ZSTACK_COMPUTE_VM_10055": "uuids 参数必须属于 VmInstanceVO 或 HostVO", + "ORG_ZSTACK_IAM2_CONTAINER_10008": "失败在路径: %s 未能找到 kube 配置文件", + "ORG_ZSTACK_COMPUTE_VM_10054": "nic id: %s 不存在...", + "ORG_ZSTACK_IAM2_CONTAINER_10005": "获取镜像标签失败,因为镜像标签页面为空", + "ORG_ZSTACK_COMPUTE_VM_10053": "NIC 不能同时应用 QoS 与端口镜像服务。", + "ORG_ZSTACK_IAM2_CONTAINER_10006": "获取镜像失败,因为内容为空", + "ORG_ZSTACK_COMPUTE_VM_10052": "出站带宽和入站带宽必须至少设置一个。", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10008": "附加的访问组已经是: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10003": "失败为项目[uuid: %s]设置容器集群", + "ORG_ZSTACK_COMPUTE_VM_10051": "监控编号必须为 1 或 2 或 4。", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10007": "nas 挂载目标 [%s] 已存在于文件系统: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10004": "获取镜像标签失败,因为内容为空", + "ORG_ZSTACK_COMPUTE_VM_10050": "方向必须设置为 (入, 出) 中的其中一个,但实际值是 %s", + "ORG_ZSTACK_IAM2_CONTAINER_10001": "失败更新容器 %s 的配额", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10009": "访问组规则 [%s] 已存在于访问组 [%s] 中", + "ORG_ZSTACK_IAM2_CONTAINER_10002": "设置项目[uuid: %s]容器失败,因为数据库中未找到该项目", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10003": "挂载域在%d毫秒后仍然无效,将其删除...", + "ORG_ZSTACK_IAM2_CONTAINER_10000": "在容器端更新项目[uuid: %s]的配额时发生未知错误", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10006": "不存在 NAS 访问组,请至少创建一个", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10005": "没有这样的挂载目标 [%s] 在 NAS: %s", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10000": "在区域:%s 中未找到文件系统 [%s]", + "ORG_ZSTACK_COMPUTE_VM_10059": "没有找到账户偏好设置,请向主机发送更改密码命令!", + "ORG_ZSTACK_COMPUTE_VM_10058": "不在目标主机数据库中找到记录,无法向主机发送修改密码命令!", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10002": "某些主要存储 [%s] 被使用了 NAS,无法删除直到先删除主要存储。", + "ORG_ZSTACK_COMPUTE_VM_10057": "只有主机[UUID:%s]可以访问数据卷。", + "ORG_ZSTACK_COMPUTE_VM_10056": "资源[uuids:%s]不属于账户[uuid:%s]", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10001": "nas文件系统在数据中心已存在:%s", + "ORG_ZSTACK_COMPUTE_VM_10063": "密码不符合数字、大小写英文字母和特殊字符的组合要求", + "ORG_ZSTACK_COMPUTE_VM_10062": "密码长度必须在 [%s-%s] 范围内", + "ORG_ZSTACK_COMPUTE_VM_10061": "磁盘不支持挂载。磁盘类型是 %s", + "ORG_ZSTACK_COMPUTE_VM_10060": "磁盘AO参数不正确。需要设置以下属性之一,并且只能设置其中一个:size、templateUuid、diskOfferingUuid、sourceUuid-sourceType", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10010": "访问组 [%s] 已经存在于数据中心 [%s] 中", + "ORG_ZSTACK_COMPUTE_VM_10068": "在 L3 网络 [%s] 中没有可用的 nicType", + "ORG_ZSTACK_FAULTTOLERANCE_10015": "无法创建次要VM,因为主要VM已停止", + "ORG_ZSTACK_COMPUTE_SRIOV_10014": "无法将L3网络附加到VM,因为enableSRIOV和enableVFHA不能同时设置", + "ORG_ZSTACK_COMPUTE_SRIOV_10015": "无法将vf网卡类型更改为普通类型", + "ORG_ZSTACK_FAULTTOLERANCE_10013": "另一个故障容忍的垃圾回收任务正在运行,请取消新的任务并等待返回", + "ORG_ZSTACK_COMPUTE_SRIOV_10016": "无法将NIC类型更改为VF类型", + "ORG_ZSTACK_COMPUTE_SRIOV_10017": "vm nic[uuid:%s] 不存在", + "ORG_ZSTACK_FAULTTOLERANCE_10011": "缺少容错虚拟机组", + "ORG_ZSTACK_FAULTTOLERANCE_10010": "无法迁移ft主VM[uuid:%s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10019": "仅支持 %s SRIOV", + "ORG_ZSTACK_MONITORING_MEDIA_10001": "无法连接到主机,端口: %s, %d。问题可能由不正确的smtpServer或smtpPort引起", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10038": "条件体不支持json null或数组!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10037": "仅支持在“Condition”字段中使用 ZStack 模板函数!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10036": "值必须为布尔型在\u0027条件\u0027字段中", + "ORG_ZSTACK_MONITORING_MEDIA_10000": "问题可能是由错误的用户名或密码或电子邮件权限被拒绝引起的", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10035": "条件键: %s 只支持值的 json 对象中包含 1 个元素,但得到 %d 个元素!", + "ORG_ZSTACK_FAULTTOLERANCE_10019": "无法切换主VM。主要VM未知但不存在故障转移网络地址", + "ORG_ZSTACK_FAULTTOLERANCE_10018": "pvm[uuid:%s] 不存在", + "ORG_ZSTACK_FAULTTOLERANCE_10017": "无法切换至虚拟机[uuid:%s]。相关的容错虚拟机组不存在", + "ORG_ZSTACK_COMPUTE_SRIOV_10012": "vm nic[uuid:%s] 已经是类型 %s,无需更改", + "ORG_ZSTACK_FAULTTOLERANCE_10016": "创建的 SVM 已找到,报告此启动次要 VM 请求的错误", + "ORG_ZSTACK_COMPUTE_SRIOV_10013": "只在虚拟机停止时更改 VM 网卡类型", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10009": "双因素认证失败,因为消息系统标签中没有令牌", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10008": "双因素认证失败,因为消息中不存在系统标签", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10004": "双因素认证未启用", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10001": "不支持的账户类型:%s", + "ORG_ZSTACK_FAULTTOLERANCE_10026": "非容错虚拟机端口未找到", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10011": "失败验证两步验证代码", + "ORG_ZSTACK_DAHO_CORE_10003": "创建 Daho vll 任务失败!", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10010": "双因素认证失败,因为没有为 %s:%s 设置密钥", + "ORG_ZSTACK_FAULTTOLERANCE_10024": "无法启动secondary VM,因为primary VM已停止", + "ORG_ZSTACK_DAHO_CORE_10004": "未找到与 accountUuid: %s 对应的阿里云账号", + "ORG_ZSTACK_FAULTTOLERANCE_10022": "无法从当前FT网络找到可用的IP地址。请检查全局配置[类别:FT名称:故障容错网络.CIDR]是否正确设置,并确认主机[uuid:%s]的IP地址在CIDR范围内。", + "ORG_ZSTACK_FAULTTOLERANCE_10021": "意外异常", + "ORG_ZSTACK_DAHO_CORE_10007": "过期策略:%s 无效", + "ORG_ZSTACK_FAULTTOLERANCE_10020": "无法切换主机组。备用虚拟机未知且无故障容忍网络地址可用", + "ORG_ZSTACK_DAHO_CORE_10008": "vlanId[%s] 已经存在!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10026": "CfnRootDecoder 的权重必须在 0-100 之间,0 表示优先解码,默认值为 50", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10025": "参数 root body 必须是 json 对象!", + "ORG_ZSTACK_COMPUTE_SRIOV_10020": "%s 不支持 sriov", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10024": "类型对于参数是必需的,但在 %s 中未找到", + "ORG_ZSTACK_COMPUTE_SRIOV_10021": "enableSRIOV 标签不支持的虚拟机类型 [%s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10022": "在将虚拟机[uuid:%s]迁移到宿主机[uuid:%s]之前预处理vf网卡失败", + "ORG_ZSTACK_FAULTTOLERANCE_10028": "分配的端口数量少于nic[uuid: %s]在主机[uuid: %s]上请求的数量", + "ORG_ZSTACK_COMPUTE_SRIOV_10023": "迁移虚拟机[uuid:%s]到主机[uuid:%s]后,vf nic后处理失败", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10029": "映射值体不支持json数组!", + "ORG_ZSTACK_FAULTTOLERANCE_10027": "未能为主机[uuid: %s]的网卡[nic uuid: %s]分配端口", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10028": "无法找到此类消息:%s 用于创建", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10030": "映射值体不支持 null!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10031": "mappingName 必须在结果中找到,否则无效的 cfn json。", + "ORG_ZSTACK_FAULTTOLERANCE_10037": "无法切换虚机[uuid:%s],因为容错虚机组不在[%s, %s]状态", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10005": "无法附加 L2VirtualSwitchNetwork,因为集群[uuid:%s]中没有主机", + "ORG_ZSTACK_FAULTTOLERANCE_10036": "无法切换虚机[uuid:%s],请确认这是否为容错虚机组", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10006": "无法附加 L2VirtualSwitchNetwork,因为接口[%s]应在主机[uuid:%s]上创建", + "ORG_ZSTACK_FAULTTOLERANCE_10035": "无法切换虚机[uuid:%s],请在GlobalConfig中启用故障转移功能", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10007": "无法在虚拟交换机[uuid:%s]上创建L3网络", + "ORG_ZSTACK_FAULTTOLERANCE_10034": "无法删除L3网络[uuid:%s]。容错VM[%s]处于状态[%s, %s]中仍使用该网络。在删除L3网络之前,请停止相关容错VM。", + "ORG_ZSTACK_FAULTTOLERANCE_10033": "图像[uuid:%s]仍然被容错虚拟机[fault tolerance vm uuid:%s]使用", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10004": "无法找到任何连接的主机来执行此操作,似乎与共享块组存储[uuid:%s]关联的所有KVM主机均已断开连接。", + "ORG_ZSTACK_FAULTTOLERANCE_10032": "具有索引:%d 的卷,以及 pvm[uuid:%s] 和 svm[uuid:%s] 的缓存卷大小不同,不允许启动", + "ORG_ZSTACK_FAULTTOLERANCE_10031": "卷索引为:%d 的 pvm[uuid:%s] 和 svm[uuid:%s] 有不同的大小,不允许启动", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10003": "无法创建 L2PortGroupNetwork,因为具有相同 vlanId[%s] 的 L2PortGroupNetwork 已存在于 L2VirtualSwitchNetwork[uuid:%s] 中", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10002": "KVM 主机,其中的卷[uuid%s]已与共享块组存储[uuid:%s]断开连接", + "ORG_ZSTACK_FAULTTOLERANCE_10030": "pvm[uuid:%s] 和 svm[uuid:%s] 的卷数量不匹配,不允许启动", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10004": "无法附加 L2 虚拟交换机网络,因为集群[uuid:%s]中的接口[%s]已被另一个 L2 虚拟交换机网络使用", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10001": "无法找到需要操作的共享块组主存储卷", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10002": "没有配置用于VyOS DHCP的虚拟路由器", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10006": "共享卷不支持薄分配", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10001": "无法将 DHCP 入项添加到虚拟路由器 VM[uuid:%s ip:%s],因为 %s,DHCP 入项[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10039": "当前操作[api:%s]在ft vm[uuid:%s, state:%s]未停止时不受支持", + "ORG_ZSTACK_FAULTTOLERANCE_10038": "无法维护主机,因为 ft vms[%s] 处于恢复中", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10011": "vm[uuid:%s] 没有运行、暂停或停止,当前状态[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10048": "无法更新 ft vm[uuid:%s] 的平台,需要停止两个虚拟机", + "ORG_ZSTACK_FAULTTOLERANCE_10047": "无法更新 ft vm[uuid:%s] 的内存大小,需要停止两个虚拟机", + "ORG_ZSTACK_FAULTTOLERANCE_10046": "无法更新 ft vm[uuid:%s] 的 cpu 数量,需要停止两个 vms", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10005": "L2网络不应与已连接到集群的分配网络具有相同的接口名称", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10004": "请勿将主机添加到裸金属2集群中", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10015": "该镜像[uuid: %s, 名称:%s]在任何备份存储中未找到", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10003": "创建新的裸金属2集群时,必须设置架构", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10014": "镜像[uuid:%s, name: %s]在任何备份存储上都无法下载:\n1. 检查镜像是否处于已删除状态\n2. 检查显示为就绪的备份存储是否已连接到区域[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10002": "集群类型和hypervisor类型应该全部为baremetal2或全部不为baremetal2", + "ORG_ZSTACK_FAULTTOLERANCE_10042": "无法将vm级别设置为%s,请在GlobalConfig中启用ft", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10013": "不支持在线合并共享卷[uuid: %s]的快照", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10001": "无法将本地存储附加到baremetal2集群。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10012": "该卷[UUID:%s]已挂载至处于状态%s的VM[UUID:%s]上,无法执行快照合并操作", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10000": "无法将带有令牌的第三方ceph附件添加到aarch64集群中。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10017": "主机[uuid:%s]拥有共享块的磁盘uuid,但实际存储不同。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10016": "在集群[uuid:%s]中未找到连接的主机", + "ORG_ZSTACK_FAULTTOLERANCE_10049": "当前操作不支持在ft组虚机[uuid:%s]上执行", + "ORG_ZSTACK_BAREMETAL_NETWORK_10004": "MAC地址 %s 已经是bond从设备", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10000": "无法编程由虚拟路由器[uuid:%s, ip:%s]提供的dhcp条目,%s", + "ORG_ZSTACK_BAREMETAL_NETWORK_10003": "MAC地址 %s 不属于机箱[UUID:%s]", + "ORG_ZSTACK_BAREMETAL_NETWORK_10002": "从节点地址 %s 是无效的。它应该类似于 6c:b3:11:1b:0b:1e,6c:b3:11:1b:0b:1f", + "ORG_ZSTACK_BAREMETAL_NETWORK_10001": "bond 名称 %s 已经存在", + "ORG_ZSTACK_BAREMETAL_NETWORK_10000": "创建裸金属绑定仅允许在创建裸金属实例之前进行", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10022": "无法找到备份存储[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10058": "不允许相同的 MAC 地址 [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10021": "预期状态是 %s,当前状态是", + "ORG_ZSTACK_FAULTTOLERANCE_10057": "弹性网络未设置", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10020": "不支持将薄卷转换为厚卷", + "ORG_ZSTACK_FAULTTOLERANCE_10056": "失败创建FT VM,请在GlobalConfig中启用FT", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10001": "无法找到弹性公网IP:%s 在vmNic IP中:%s", + "ORG_ZSTACK_FAULTTOLERANCE_10055": "无法迁移FT次要VM", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10002": "弹性公网IP [uuid:%s] 已删除", + "ORG_ZSTACK_FAULTTOLERANCE_10054": "无法迁移FT主VM", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10025": "QCow2 共享卷[uuid:%s] 不受支持", + "ORG_ZSTACK_FAULTTOLERANCE_10053": "当前操作不支持次要VM[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10024": "VM[uuid:%s] 从不同的主存储拥有多个 ISO 文件: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10029": "仅支持全量", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10027": "无法在共享块组主存储[uuid: %s]上找到可用主机来为卷[uuid: %s]创建快照", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10005": "Either eipUuid 或者 vipUuid 必须设置", + "ORG_ZSTACK_FAULTTOLERANCE_10051": "当前操作不支持在副VM[UUID:%s]上执行", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10006": "弹性公网IP[UUID:%s] 不处于启用状态,无法获取可绑定的VM网卡", + "ORG_ZSTACK_FAULTTOLERANCE_10050": "当前操作不支持在 ft 主机[uuid:%s]上执行", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10003": "无法将L3网络[uuid:%s, name:%s]绑定到虚拟机[uuid:%s, name:%s],因为该L3网络已为其中一个虚拟机的网卡提供EIP", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10004": "vmNic[uuid:%s] 没有绑定到 vmInstance,无法获取可绑定的弹性IP地址", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10009": "弹性公网IP[UUID: %s]只能在状态为%s时绑定,当前状态是%s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10007": "ip [uuid:%s] 已连接至vm网卡[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10008": "弹性公网IP[UUID:%s]已绑定到另一个虚拟机的网络接口[NIC UUID:%s],无法再次绑定", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10033": "无法找到任何连接的主机来执行此操作,似乎与共享块组存储[uuid:%s]关联的所有KVM主机均已断开连接", + "ORG_ZSTACK_FAULTTOLERANCE_10069": "集群[uuid:%s] 已指定但处于禁用状态,无法从其创建虚拟机", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10032": "无法找到同时连接到主存储[uuid: %s]和主存储[uuid: %s]的主机", + "ORG_ZSTACK_FAULTTOLERANCE_10068": "zone[uuid:%s] 指定了但它是禁用的,无法从它创建虚拟机", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10031": "无法在共享块组主存储[uuid: %s]和[uuid: %s]中找到可用的主机来迁移卷[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10030": "无法找到可用的目标主机以迁移卷[uuid: %s],该卷位于共享块组主存储[uuid: %s]与[uuid: %s]之间", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10037": "无法缩小快照 %s,因为虚拟机 %s 不处于运行中/停止状态", + "ORG_ZSTACK_FAULTTOLERANCE_10065": "不能在l3Network中添加相同的uuid,uuid: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10035": "无法缩小快照 %s,因为卷 %s 不可用", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10038": "在快照中获取虚拟机 %s 的安装路径为空", + "ORG_ZSTACK_ALIYUN_BACKUP_10000": "未找到备份桶", + "ORG_ZSTACK_FAULTTOLERANCE_10062": "[image[uuid:%s] 的格式为:%s,仅可使用%s创建vm]", + "ORG_ZSTACK_FAULTTOLERANCE_10061": "图像[uuid:%s]的mediaType为:%s,仅根磁盘模板可以用于创建VM", + "ORG_ZSTACK_TICKET_IAM2_API_10004": "一种票类型只能有一个匹配流程集合", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10044": "未找到连接的主机以从主存储[uuid:%s]拉取快照,用于卷[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10020": "vip[uuid:%s] 不在状态[%s]中,当前状态是%s", + "ORG_ZSTACK_SNS_PLATFORM_MICROSOFTTEAMS_10000": "发送消息到 Microsoft Teams 失败。状态: %s, 内容: %s", + "ORG_ZSTACK_TICKET_IAM2_API_10003": "创建一个流程时需要命名", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10043": "未找到连接的主机来在主要存储[uuid:%s]上提交快照,针对卷[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10079": "无法启动 VM[uuid:%s]。它没有绑定任何网卡,请绑定一个网卡后再试一次", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10042": "激活安装路径 %s 失败,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10041": "活跃子快照失败,因为 %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10023": "vmNic uuid[%s] 不允许添加弹性IP,因为该vmNic存在与允许访问规则相关的端口转发设置", + "ORG_ZSTACK_FAULTTOLERANCE_10077": "当前 ft vm 处于未知状态,无法停止它,请尝试手动进行故障转移", + "ORG_ZSTACK_TICKET_IAM2_API_10008": "名称不能为 null", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10048": "无效的 thinProvisioningInitializeSize 标签[%s]", + "ORG_ZSTACK_TICKET_IAM2_API_10007": "错误审批人标题 %s,有效值为 %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10021": "Guest L3网络和VIP L3网络的uuid:%s 和 uuid:%s 是相同的网络", + "ORG_ZSTACK_TICKET_IAM2_API_10006": "创建流集合至少需要一个流", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10022": "vm状态[%s]不允许操作弹性公网IP,可能是您应该等待虚拟机流程完成", + "ORG_ZSTACK_TICKET_IAM2_API_10005": "管理员或iam2操作是最后流程的审批者所需的操作", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10045": "deactive installPath 失败,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10049": "无效的thinProvisioningInitializeSize[%s],它必须大于或等于%s", + "ORG_ZSTACK_FAULTTOLERANCE_10073": "默认L3网络UUID[uuid:%s]不在l3NetworkUuids%s中", + "ORG_ZSTACK_FAULTTOLERANCE_10071": "主机[uuid:%s]已被指定,但其连接状态为%s,无法从其创建虚拟机", + "ORG_ZSTACK_FAULTTOLERANCE_10070": "主机[uuid:%s]被指定但已被禁用,无法从中创建虚拟机", + "ORG_ZSTACK_TICKET_IAM2_API_10009": "审批人UUID不能为空", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10051": "无效的thinProvisioningInitializeSize[%s]大于%d", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10050": "无效的thinProvisioningInitializeSize[%s],它不是一个数字", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10055": "该主机[uuid: %s]运行的环境无法调整共享块组主存储[uuid: %s]上卷[uuid: %s]的大小", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10054": "无法找到具有连接共享块的主机以执行共享块组主存储[uuid:%s]的相关命令", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10053": "无法找到可用主机来执行命令以执行共享块组主存储[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10052": "[%s]不是2的幂次", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10012": "IP地址 [uuid:%s] 不属于网卡 [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10059": "无法找到任何附加在共享块组主存储[uuid: %S]上的集群", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10058": "共享挂载点主存储[uuid:%s, name:%s]无法在附加的集群中找到任何可用主机以实例化卷", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10013": "eip[uuid:%s] 没有绑定到任何虚机网卡", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10010": "vm nic[uuid:%s] 没有与 eip[uuid:%s] 兼容的 usedIp", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10057": "卷[uuid:%s]未找到", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10011": "Guest L3网络和EIP的VIP L3网络[uuid:%s]相同[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10056": "主要存储[uuid:%s]未找到", + "ORG_ZSTACK_TICKET_IAM2_API_10011": "虚拟ID[UUID:%s]不属于项目[UUID:%s]", + "ORG_ZSTACK_TICKET_IAM2_API_10010": "无法找到IAM2VirtualIDVO[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10017": "弹性IP即将绑定的VM[UUID:%s]已经位于VIP[UUID:%s, 名称:%s, IP:%s]所属的公共网络[UUID:%s]上", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10014": "vip ipVersion [%d] 与 guestIp ipVersion [%d] 不同。", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10015": "VIP[%s]处于来宾IP范围[%s, %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10062": "共享块的主存储[uuid:%s, name:%s]未附加到任何集群,或附加集群中的主机未连接", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10018": "vip[uuid:%s] 被其他网络服务实体[%s]占用", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10019": "EIP 无法创建在系统 VIP 上", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10047": "获取图像哈希失败,因为:%s", + "ORG_ZSTACK_SNS_PLATFORM_FEISHU_10000": "失败向飞书发送消息。状态: %s, 内容: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10042": "imagestoreBackupStorage 剂量的 uuid 发生变化[预期:%s,实际:%s],最有可能是该剂量手动重启了。请发起重新连接以同步状态", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10000": "失败获取扎库集群,错误: %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10002": "失败获取扎库集群[id:%s],错误:%s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10001": "获取扎库集群失败,响应内容为空", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10000": "无法找到对应项目 %s 的安全组配额", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10004": "从响应中提取操作ID失败", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10003": "获取扎库集群[id:%s]失败,响应内容为空", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10006": "解析响应失败: %s", + "ORG_ZSTACK_SNS_10015": "platformUuid 和 endpointUuid 不能同时为空", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10001": "安全组配额不能小于1", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10005": "异步操作在 %d 秒后超时", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10004": "在标签中的 l3Uuid[%s] 与参数中的 l3Uuid[%s] 不一致", + "ORG_ZSTACK_SNS_10013": "密码不能为空", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10003": "系统标签请求。需要通过系统标签 L3_NETWORK_SECURITY_GROUP_UUIDS_REF 指定 VM NIC 的默认安全组,格式为 l3::{%s}::SecurityGroupUuids::{%s},因为强制安全组已启用", + "ORG_ZSTACK_SNS_10012": "用户名不能为空", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10006": "自从强制安全组功能启用后,标签中的 securityGroupUuid 必须属于项目[%s]", + "ORG_ZSTACK_SNS_10011": "smtpPort 不能为 null", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10005": "安全组[uuid:%s]的所有者[uuid:%s]属于另一个IAM2项目", + "ORG_ZSTACK_SNS_10010": "smtpServer 不能为 null", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10008": "默认的安全组 %s 在启用强制安全组功能时无法被删除", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10007": "在 l3Network[uuid:%s] 上的 nics 与安全组关联。在从安全组解绑 l3Network 之前,您需要先从安全组解绑 nics。", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10039": "商用许可是使用ImageStore所需的许可证类型", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10009": "这个安全组 %s 已绑定至虚拟机,请先解绑后再试", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10035": "图像存储[%s]无法添加图像,因为其用于远程备份", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10032": "备份存储[uuid:%s]没有足够的容量[%s]导出", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10002": "虚拟路由器[name: %s, uuid: %s]同步snat%s失败, %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10031": "图像[%s]未在备份存储[%s]中找到", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10001": "租户l3网络[uuid:%s, name:%s]需要虚拟路由器提供的SNAT服务,但虚拟路由器提供者[uuid: %s, name:%s]的公共l3网络[uuid:%s]与该租户l3网络相同", + "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10020": "notifySugonSdn: 向目的地主机[uuid:%s]的虚拟路由器[%s]通知 sugon sdn 失败,涉及虚拟机[uuid:%s],错误信息是:%s", + "ORG_ZSTACK_SNS_10029": "电话号码 [%s] 已经存在", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10011": "账户[%s]不允许操作默认安全组", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10010": "账户[%s]无法操作默认安全组[%s]", + "ORG_ZSTACK_SNS_10026": "无法将电子邮件地址更新为 %s,该地址已在端点[uuid:%s]中存在", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10012": "vm 的 nic[uuid:%s] 只有一个安全组,无法从安全组[uuid:%s] 中删除该 nic", + "ORG_ZSTACK_SNS_10024": "不能将相同的电子邮件地址添加到终端点[uuid:%s]", + "ORG_ZSTACK_SNS_10023": "无法找到插件[%s]", + "ORG_ZSTACK_SNS_10022": "无法创建具有相同地址[%s:%s]的SNMP平台", + "ORG_ZSTACK_SNS_10021": "无法测试连接,因为所有参数均为 null", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10029": "未实现远程目标类型: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10028": "打包导出的镜像失败,因为 %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10027": "某些图片 [%s] 在备份存储[uuid: %s] 中未导出", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10026": "删除镜像包失败,因为: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10022": "设置镜像存储[uuid:%s]的最大容量失败", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10021": "在设置图像存储[uuid:%s]的最大容量时失败,因为:%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10019": "notifySugonSdn: 向目标主机[uuid:%s]的虚拟路由器[%s]通知sugon sdn失败,涉及虚拟机[uuid:%s]", + "ORG_ZSTACK_SNS_10038": "无法创建 sns 邮件终端节点,未提供任何邮件地址", + "ORG_ZSTACK_SNS_10037": "用户名和密码必须同时全部不存在或同时存在", + "ORG_ZSTACK_SNS_10036": "无效的钉钉电话号码[%s], 钉钉电话号码格式应为+86-12388889999", + "ORG_ZSTACK_SNS_10035": "[%s] 不是一个合法的IP地址", + "ORG_ZSTACK_SNS_10034": "无效的 URL[%s]", + "ORG_ZSTACK_SNS_10031": "电话号码 [%s] 一个或多个不存在", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10018": "无响应", + "ORG_ZSTACK_SNS_10030": "电话号码列表为空", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10016": "下载镜像[URL: %s]到备份存储[UUID: %s]时失败,原因: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10015": "缺少证书文件用于下载镜像: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10013": "无法连接到 SimpleHttpBackupStorage[url:%s],因为 %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10010": "失败获取任务回复!", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_10000": "创建依赖于镜像缓存[uuid:%s, 位置url: [%s]],不能在其他地方创建。", + "ORG_ZSTACK_SNS_10045": "该操作对于系统应用程序平台不允许执行", + "ORG_ZSTACK_SNS_10044": "无法验证无任何电话号码的通用短信", + "ORG_ZSTACK_SNS_10043": "用户ID [%s] 已经存在", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10008": "在主要存储 %s 上清理镜像元数据失败,错误:%s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10007": "同步状态失败。", + "ORG_ZSTACK_SNS_10041": "电话号码[%s]已存在", + "ORG_ZSTACK_SNS_10040": "无效的电子邮件地址[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10005": "无法在集群中找到与PS [uuid: %s] 连接的主机", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10004": "无法提交由 UUIDs:%s 指定的备份存储,因为:%s", + "ORG_ZSTACK_MONITORING_10004": "无法找到资源[type:uuid:%s]的类型", + "ORG_ZSTACK_MONITORING_10005": "在资源类型[%s]和项目[%s]中未找到监控项", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10002": "无法分配由 UUIDs:%s 指定的备份存储,因为:%s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10000": "解析创建时间错误: %s", + "ORG_ZSTACK_MONITORING_10000": "无法找到监控触发器[uuid:%s],它可能已被删除", + "ORG_ZSTACK_MONITORING_10001": "无法找到监控触发动作[uuid:%s],它可能已被删除", + "ORG_ZSTACK_MONITORING_10002": "该资源[type:%s]没有任何监控项", + "ORG_ZSTACK_MONITORING_10003": "资源[uuid:%s]不属于账户[uuid:%s]", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10002": "实例[%s]不在组中", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10001": "该实例[%s]已存在于该组中", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10003": "监控组[%s]未应用监控模板", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10006": "该组内的实例已达到最大限制", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10001": "输出正文不支持json null!", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10005": "模板中的规则已达到最大限制", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10000": "只有函数可以在 Outputs 中被允许使用,但发现 %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10016": "资源类型必须是字符串!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10014": "映射根主体必须是json对象!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10018": "资源根主体必须是json对象!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10023": "参数体不支持 null!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10022": "参数名不支持: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10020": "paramName 必须在结果中找到,否则无效的 cfn json。", + "ORG_ZSTACK_ZQL_AST_VISITORS_10001": "实体为空,无法获取表名", + "ORG_ZSTACK_FAULTTOLERANCE_10004": "在主机[uuid: %s]上分配端口失败", + "ORG_ZSTACK_ZQL_AST_VISITORS_10000": "连接条件缺失", + "ORG_ZSTACK_ZQL_AST_VISITORS_10003": "字段列表为空,无法获取列名", + "ORG_ZSTACK_ZQL_AST_VISITORS_10002": "实体为空,无法获取列名", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10005": "映射体不支持非映射值!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10004": "[%s] 在 Outputs 中无效!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10003": "输出中的 Description 必须为字符串类型!", + "ORG_ZSTACK_FAULTTOLERANCE_10009": "无法迁移 ft 次级 VM[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10008": "无法启动secondary VM,因为primary VM仍然处于停止状态", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10009": "资源值体不支持 null!", + "ORG_ZSTACK_ZQL_AST_VISITORS_10004": "函数不能为 null", + "ORG_ZSTACK_FAULTTOLERANCE_10007": "无法获取主VM[uuid:%s]的hostUuid", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10008": "资源 %s 不能依赖自身,请检查 [%s] 中的 %s", + "ORG_ZSTACK_FAULTTOLERANCE_10005": "分配的端口数量少于主机[UUID: %s]上请求的数量", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10006": "映射体不支持json null!", + "ORG_ZSTACK_SNS_10009": "uuid [%s] 已经存在", + "ORG_ZSTACK_SNS_10007": "无法找到 SNSApplicationEndpoint[uuid:%s],它可能已被删除", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10012": "不支持的键 [%s] 在 Resources [%s] 中", + "ORG_ZSTACK_SNS_10006": "无法找到 SNSApplicationPlatform[uuid:%s],它可能已被删除", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10011": "资源名称必须在结果中找到,否则无效的 cfn json。", + "ORG_ZSTACK_SNS_10005": "无法找到endpointType", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10010": "不支持的 resourceKeys: %s", + "ORG_ZSTACK_SNS_10003": "无法找到 SNSTopic[uuid:%s],它可能已被删除", + "ORG_ZSTACK_SNS_10002": "应用端点已禁用", + "ORG_ZSTACK_SNS_10001": "应用平台已禁用", + "ORG_ZSTACK_SNS_10000": "该主题未被任何端点订阅", + "ORG_ZSTACK_CLOUDFORMATION_10002": "无效的ZStack模板格式版本:[%s, 预期值:%s]", + "ORG_ZSTACK_CLOUDFORMATION_10001": "模板必须包含 [ZStackTemplateFormatVersion]", + "ORG_ZSTACK_CLOUDFORMATION_10000": "在模板内容中获取空元素", + "ORG_ZSTACK_CLOUDFORMATION_10009": "模板 [%s] 选择的选项已禁用", + "ORG_ZSTACK_CLOUDFORMATION_10008": "资源堆栈VO [%s] 已经被删除!", + "ORG_ZSTACK_CLOUDFORMATION_10007": "资源堆栈VO: [%s] 已被删除...", + "ORG_ZSTACK_CLOUDFORMATION_10005": "在 vmInstance[%s] 中未找到 stackUuid", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10035": "为所有候选宿主机预留主机容量失败", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10034": "[主机分配]: 在主机[uuid:%s]上尝试下一个。%s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10037": "过滤后,HostAllocatorFilterExtensionPoint[%s] 返回零个候选主机,这意味着:%s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10036": "没有找到具有 %s 的主机", + "ORG_ZSTACK_CLOUDFORMATION_10025": "期望 %s 状态!", + "ORG_ZSTACK_EXPON_10002": "指数请求失败,代码 %s,消息: %s。", + "ORG_ZSTACK_EXPON_10003": "无法找到复制快照后的卷[name:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10000": "虚拟路由器[name: %s, uuid: %s]配置dns%s失败, %s", + "ORG_ZSTACK_CLOUDFORMATION_10022": "重启资源堆栈仅支持 %s 状态!", + "ORG_ZSTACK_CLOUDFORMATION_10021": "无法找到这样的 ResourceStackVO 由 uuid [%s]", + "ORG_ZSTACK_CLOUDFORMATION_10020": "无法在虚拟机[%s]上找到默认IP地址", + "ORG_ZSTACK_CLOUDFORMATION_10028": "templateContent 和 url 不得同时为空或同时设置!", + "ORG_ZSTACK_CLOUDFORMATION_10026": "templateContent 和 templateUuid 不得同时为空!", + "ORG_ZSTACK_HYBRID_ACCOUNT_10000": "KeyType 不支持的类型 [%s]", + "ORG_ZSTACK_HYBRID_ACCOUNT_10002": "键: [%s] 与类型: [%s] 已由 accountUuid: [%s] 存在", + "ORG_ZSTACK_HYBRID_ACCOUNT_10003": "参数 [accountUuid] 只能由管理员用户使用!", + "ORG_ZSTACK_HYBRID_ACCOUNT_10004": "键: [%s] 已由 accountUuid: [%s] 存在", + "ORG_ZSTACK_CLOUDFORMATION_10014": "内容必须通过 templateContent 或 url 设置!", + "ORG_ZSTACK_CLOUDFORMATION_10013": "无法删除或更新系统模板: %s", + "ORG_ZSTACK_CLOUDFORMATION_10012": "StackTemplateVO 已被删除...", + "ORG_ZSTACK_CLOUDFORMATION_10011": "无法找到 %s 的参数,其类型为 %s,请检查参数", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10002": "因为无法附加硬件 VXLAN 池:%s", + "ORG_ZSTACK_CLOUDFORMATION_10010": "模板内容必须设置!", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10003": "无法创建缺少VLAN ID的L2硬件vxLAN网络", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10000": "无法将二层网络附加到集群,因为主机[uuid:%s]没有名为[%s]的接口", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10001": "由于无法找到主机[uuid:%s]的交换机端口,因此无法附加硬件VXLAN池。", + "ORG_ZSTACK_CLOUDFORMATION_10019": "无法在系统标签中找到 l2[%s] 的 l2_bridge_name", + "ORG_ZSTACK_CLOUDFORMATION_10018": "[云形成] filterName 必须为 cloudformation:true 或 cloudformation:false", + "ORG_ZSTACK_CLOUDFORMATION_10017": "StackTemplateVO: [%s] 已被删除...", + "ORG_ZSTACK_CLOUDFORMATION_10016": "无效的云形成模板版本: %s", + "ORG_ZSTACK_CLOUDFORMATION_10015": "获取空内容输入", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10006": "无法创建华为iMaster SDN VXLAN网络,缺少vpcId", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10007": "由于VNI范围[%d-%d]不在有效的VNI范围内,因此无法添加VNI范围", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10004": "无法创建华为iMaster SDN VXLAN网络,因为VLAN ID [%s] 超出了范围:%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10005": "无法创建华为iMaster SDN VXLAN网络,缺少vpcId和tenantId", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10009": "无法添加华为iMaster SDN控制器而没有VLAN范围", + "ORG_ZSTACK_NETWORK_L2_10013": "无法更改 l2Network[uuid:%s] 的VLAN,因为存在处于连接中或断开连接状态的主机", + "ORG_ZSTACK_NETWORK_L2_10012": "不支持的虚拟交换机类型[%s]", + "ORG_ZSTACK_NETWORK_L2_10015": "无法更改 l2Network[uuid:%s] 的VLAN,因为此l2Network是隔离的", + "ORG_ZSTACK_NETWORK_L2_10014": "无法更改具有uuid:%s的l2Network的VLAN,因为该网络仅支持独家连接到KVM集群的L2网络", + "ORG_ZSTACK_NETWORK_L2_10017": "vlan[%s] 是无效的", + "ORG_ZSTACK_NETWORK_L2_10016": "vlan 对于 ChangeL2NetworkVlanId 类型[%s] 是必需的", + "ORG_ZSTACK_NETWORK_L2_10019": "VLAN 不允许用于类型为[%s]的 ChangeL2NetworkVlanId 操作", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10000": "没有候选主机具有版本[%s]", + "ORG_ZSTACK_NETWORK_L2_10018": "有一个 L2Network 已经附加到具有虚拟网络 ID[%s] 和物理接口[%s] 的集群上。无法更改 L2 网络[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10083": "已找到具有主机名[%s]的现有SimpleHttpBackupStorage", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10082": "无效的 URL[%s],URL 必须是以\u0027/\u0027 开始的绝对路径", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10080": "文件路径包含无效字符: %s", + "ORG_ZSTACK_NETWORK_L2_10020": "有一个 l2Network 已经附加到具有物理接口[%s]的集群上。无法更改 l2Network[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10079": "URL包含无效文件夹[/dev 或 /proc 或 /sys]", + "ORG_ZSTACK_CLOUDFORMATION_10034": "templateContent 和 uuid 不得同时为空或同时设置!", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10078": "绝对文件路径 required: %s", + "ORG_ZSTACK_NETWORK_L2_10006": "在集群[uuid:%s]中存在一个已连接的l2Network[uuid:%s,名称:%s],该网络具有物理接口[%s]。无法将l2Network[uuid:%s]进行连接", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10077": "文件路径所需", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10076": "重复的备份存储。存在一个主机名为[%s]的镜像存储备份", + "ORG_ZSTACK_NETWORK_L2_10008": "l2Network[uuid:%s] 已绑定至集群[uuid:%s],无法再次绑定", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10075": "主机名[%s]既不是有效的IPv4地址也不是一个合法的主机名", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10011": "磁盘配置标签分配扩展点[%s]返回零候选宿主机", + "ORG_ZSTACK_CLOUDFORMATION_10030": "只有管理员才能启用/禁用系统StackTemplate", + "ORG_ZSTACK_NETWORK_L2_10007": "在集群[uuid:%s]中存在一个L2Vlan网络[uuid:%s, 名称:%s],该集群具有物理接口[%s]和vlan[%s]。失败于附加L2Vlan网络[uuid:%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10010": "实例配置标签分配扩展点[%s]返回零候选宿主机", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10073": "源备份存储[%s]不包含镜像[%s]", + "ORG_ZSTACK_NETWORK_L2_10009": "无法附加 L2 网络,因为物理接口 [%s] 上已存在另一个网络 [uuid:%s],其 VPC 类型不同", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10072": "源备份存储[%s]不包含镜像[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10071": "目标备份存储[uuid:%s]已包含图像[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10070": "删除镜像元数据文件失败: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10009": "备份存储[uuid:%s, 类型:%s] 需要绑定的主要存储,然而主要存储尚未添加", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10001": "该镜像[uuid:%s, 名称:%s]已在所有备份存储中被删除", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10004": "资源绑定尚未支持类型 %syet", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10003": "在 zones[uuids:%s] 中未找到与备份存储关联的主机,该备份存储包含图像[%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10005": "没有找到绑定资源 %s 的可用主机", + "ORG_ZSTACK_NETWORK_L2_10011": "不支持的二层网络类型[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10003": "虚拟路由器[uuid:%s, ip:%s]为L3网络[uuid:%s, name:%s]配置dns%s时失败,%s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10008": "[uuid:%s] 的镜像位于需要与主存储[uuids:%s, 类型:%s]配合的备份存储[uuid:%s]上,然而并未找到适合与这些主存储配合的主机", + "ORG_ZSTACK_NETWORK_L2_10010": "l2Network[uuid:%s] 没有绑定到集群[uuid:%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10007": "该镜像[uuid:%s, name:%s]位于需要与主存储配合的备份存储[uuid:%s, type:%s]上,然而未找到适合与这些主存储配合的主机。", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10068": "检查图像元数据文件: %s 失败", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10066": "创建镜像元数据文件 : %s 失败", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10065": "创建镜像元数据文件同步 : %s 失败", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10022": "无法找到虚拟机[uuid:%s]的根磁盘", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10021": "没有主机拥有CPU[%s], 内存[%s字节]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10000": "由于无法为nic[uuid:%s]绑定EIP,因此不存在网关", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10062": "在灾难恢复BS:[%s]中禁止添加图像", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10001": "L2网络中,基于vip的L3网络尚未将vmNic[uuid:%s]所在的集群进行绑定", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10002": "不能将超过1个%s弹性公网IP绑定到扁平化网络[uuid:%s]的VM网卡上", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10060": "缺少图片路径 on bs[%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10015": "无法找到可用的主存储[state: %s, status: %s, 可用容量 %s 字节]。请检查主存储的状态/状态,并确保其已附加到集群。", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10014": "在主存储 %s 挂载的集群中未找到主机", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10016": "无法找到可用的主存储[state: %s 或 %s, 状态: %s]。请检查主存储的状态/状态,并确保其已附加到集群中", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10031": "在 [%s] 候选主机中未找到启用的主机,该候选主机具有虚拟机类型 [%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10030": "在 [%s] 候选主机中未找到启用的主机", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10033": "没有主机处于启用状态且连接状态", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10032": "没有状态为启用、连接状态且hypervisorType\u003d%s 的主机找到", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10012": "在桶 %s 中未找到对象 %s", + "ORG_ZSTACK_UTILS_10000": "生成访问密钥失败", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10024": "要么指定卷UUID,要么指定卷快照UUID", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10023": "在所有连接到主存储 %s 的集群中未找到主机,其中包含 VM[uuid:%s] 的卷", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10026": "在排除了避免使用的主机%s之后,候选中再也没有可用的主机了", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10025": "zoneUuids、clusterUuids、hostUuids 至少必须有一个非空列表,或者全部设置为 true", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10015": "阿里云 EBS 备份存储不支持计算镜像哈希值", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10027": "在集群中未找到具有连接的L2网络的主机,该L2网络包含L3网络%s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10029": "在 [%s] 候选主机中未找到已连接的主机", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10005": "选择 %s 策略,您必须设置 %s", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10008": "没有找到拥有少于 %s vms 的主机", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10022": "该账户[uuid:%s]无权访问资源[uuid:%s,类型:L3NetworkVO]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10024": "将dhcp服务器ip地址更改为[%s],但获取到的是[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10025": "L3网络UUID不能为null", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10003": "Incorrect %s settings, valid value is %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10021": "会话/账户 uuid 无效。", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10000": "阿里云海洋终端的 URL 必须设置", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10017": "无法对虚拟机[uuid:%s, 状态:%s]应用EIP操作,因为找不到该VM的hostUuid", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10009": "阿里云 EBS 备份存储不支持取消下载镜像", + "ORG_ZSTACK_CORE_TIMEOUT_10000": "API超时时间不能设置为小于%s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10002": "无法删除OSS桶[%s],阿里云Ebs备份存储[%s]仍然存在,请先将其删除。", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10004": "当前 [%s] 主存储不支持 [%s] 类型协议,请先将协议添加到存储中", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10003": "[协议] 参数为空,类型[%s] 主存储必须设置块卷协议", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10000": "路径错误", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10002": "名称:[%s] 已存在,类型为 [%s] 的主存储中不允许块卷名称重复", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10010": "无法获取第3层网络 [uuid:%s] 的dhcpv6服务器IP地址", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10009": "无法获取三层网络 [uuid:%s] 的 dhcp4 服务器 IP 地址", + "ORG_ZSTACK_POLICYROUTE_10029": "无法删除系统策略路由表", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10005": "主机[uuid:%s]未连接", + "ORG_ZSTACK_POLICYROUTE_10027": "无法删除系统策略路由集", + "ORG_ZSTACK_POLICYROUTE_10028": "无法找到相关的虚拟路由器", + "ORG_ZSTACK_POLICYROUTE_10025": "规则集[%s]仍然绑定到网卡", + "ORG_ZSTACK_POLICYROUTE_10020": "VRouter[%s] 已经有一个策略路由表 [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10044": "因为平面DHCP未启用,所以无法更改DHCP服务器IP地址", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10045": "可以更改DHCP服务器IP,因为%s不是L3网络[uuid:%s]的所有者", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10046": "因为没有 IPv4 地址范围,所以无法更改 DHCP v4 服务器 IP地址", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10047": "无法设置 DHCPv4 服务器 IP,因为 [%s] 不是 [%s] 的三层 CIDR", + "ORG_ZSTACK_IDENTITY_RBAC_10011": "操作[API:%s]默认被拒绝,请联系管理员进行修正", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10041": "无法设置DHCPv6服务器IP,因为没有IPv6地址范围", + "ORG_ZSTACK_IDENTITY_RBAC_10012": "该操作被策略[name:%s uuid:%s]拒绝", + "ORG_ZSTACK_IDENTITY_RBAC_10013": "该操作被策略[name:%s, uuid:%s]拒绝,字段[%s]不允许设置", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10037": "无法删除 IP 地址,因为 IP [%s] 是 DHCP 服务器 IP 地址", + "ORG_ZSTACK_POLICYROUTE_10018": "无法更新系统策略路由集", + "ORG_ZSTACK_POLICYROUTE_10019": "无法更新系统策略路由表", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10039": "无法设置 DHCPv4 服务器 IP 地址,因为没有 IPv4 地址范围", + "ORG_ZSTACK_POLICYROUTE_10017": "无法找到相关虚拟路由器", + "ORG_ZSTACK_POLICYROUTE_10014": "非法协议类型 %s", + "ORG_ZSTACK_POLICYROUTE_10015": "规则集[%s]已经包含一个具有规则编号%s的规则。", + "ORG_ZSTACK_POLICYROUTE_10013": "操作失败,IP格式仅支持ipv4/iprange/cidr,但发现%s", + "ORG_ZSTACK_POLICYROUTE_10010": "下一跳IP必须是ipv4格式,但发现[%s]", + "ORG_ZSTACK_CORE_REST_10012": "无法在 %sms 内回显 %s", + "ORG_ZSTACK_QUERY_10021": "字段[%s]不是库存%s中的原始类型;你无法在参数\u0027fields\u0027中指定它;有效的字段是%s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10034": "DHCP服务器IP [%s] 已存在于L3网络 [%s] 中", + "ORG_ZSTACK_QUERY_10020": "实体元类[%s]不存在字段[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10035": "DHCP服务器IP地址[%s]不能等于网关IP地址", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10036": "DHCP服务器IP地址[%s]无法配置到系统L3层", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10030": "DHCP 服务器 IP 地址 [%s] 不是 IPv4 地址", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10031": "DHCP服务器IP [%s] 不在CIDR [%s] 范围内", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10032": "DHCP 服务器 IP 地址 [%s] 不是 IPv6 地址", + "ORG_ZSTACK_IDENTITY_RBAC_10004": "无法更新系统角色或预定义角色", + "ORG_ZSTACK_POLICYROUTE_10009": "目的CIDR必须是CIDR格式,但发现[%s]", + "ORG_ZSTACK_IDENTITY_RBAC_10007": "权限拒绝,账户[uuid:%s]不是该资源[uuid:%s, type:%s]的所有者", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10027": "无法为目标主机[uuid:%s]上的vm[uuid:%s]配置dhcp", + "ORG_ZSTACK_IDENTITY_RBAC_10008": "权限被拒绝,账户[uuid:%s]不是标记资源[uuid:%s, 类型:%s]的所有者", + "ORG_ZSTACK_POLICYROUTE_10008": "VRouter[%s] 已经有一个名为 %s 的规则集", + "ORG_ZSTACK_IDENTITY_RBAC_10005": "无法删除系统或预定义角色", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10029": "扁平网络的最小IP范围前缀长度为%d", + "ORG_ZSTACK_POLICYROUTE_10003": "l3[%s] 已经关联了一个策略路由规则集", + "ORG_ZSTACK_IDENTITY_RBAC_10009": "该账户[uuid:%s]无权访问这些资源[uuid:%s, 类型:%s]", + "ORG_ZSTACK_POLICYROUTE_10000": "默认路由网络在启用系统策略路由时无法更改", + "ORG_ZSTACK_QUERY_10018": "条件名称[%s]无效,在库存类[%s]中不存在该字段", + "ORG_ZSTACK_QUERY_10017": "查询条件 %s 中的 \u0027value\u0027 不能为 null", + "ORG_ZSTACK_QUERY_10015": "filterName 必须格式化为 [filterType:condition(s)]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_10000": "生成海洋API签名字符串失败: %s", + "ORG_ZSTACK_QUERY_10019": "条件名称[%s]无效,库存[%s]中的字段[%s]被注解为@Unqueryable字段", + "ORG_ZSTACK_ALIYUN_PANGU_10001": "应用程序名: %s, 分区名: %s 已存在于身份区域: %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10050": "无法设置 DHCP 服务器 IP,因为 IP 地址 [%s] 已被使用", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10051": "无法设置DHCPv6服务器IP,因为IP[%s]已被使用", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10053": "分配 DHCP 服务器 IP 地址失败", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10048": "可以更改DHCPv6服务器IP地址,因为不存在IPv6地址范围", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10049": "无法设置DHCPv6服务器IP,因为[%s]不是[%s]的三层CIDR地址", + "ORG_ZSTACK_USBDEVICE_10026": "请卸载所有VM[%s]的USB设备并重新尝试", + "ORG_ZSTACK_USBDEVICE_10025": "无法禁用连接到虚拟机实例的USB设备[UUID:%s]", + "ORG_ZSTACK_USBDEVICE_10024": "vm 实例[uuid:%s] 不处于可附加状态%s中以供usb设备使用", + "ORG_ZSTACK_USBDEVICE_10023": "与 USB 设备[UUID:%s]关联的虚拟机实例不在可分离状态%s中", + "ORG_ZSTACK_USBDEVICE_10022": "USB设备[UUID:%s]未连接到任何虚拟机实例。", + "ORG_ZSTACK_USBDEVICE_10021": "USB 设备[uuid:%s]插入的主机处于无效状态[%s]或状态[%s]", + "ORG_ZSTACK_USBDEVICE_10020": "虚拟机实例[UUID:%s]处于%s的不可挂接状态,无法处理USB设备", + "ORG_ZSTACK_COMPUTE_SRIOV_10005": "L3网络[uuid:%s]不存在", + "ORG_ZSTACK_COMPUTE_SRIOV_10006": "%s,因为主机[uuid:%s]的l3Network[uuid:%s]上没有可用的sriov设备", + "ORG_ZSTACK_COMPUTE_SRIOV_10007": "无法更改VF NIC HA状态,因为不存在VF NIC[uuid:%s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10008": "无法更改vf nic的HA状态,因为HA状态[%s]无效", + "ORG_ZSTACK_COMPUTE_SRIOV_10009": "L2网络[uuid:%s]未找到", + "ORG_ZSTACK_COMPUTE_SRIOV_10000": "失败在主机[uuid:%s, ip:%s]上设置vf网卡mac地址,因为%s", + "ORG_ZSTACK_COMPUTE_SRIOV_10001": "失败了更改vf网卡HA状态,错误:%s", + "ORG_ZSTACK_DRS_10000": "该集群[%s]已创建DRS", + "ORG_ZSTACK_DRS_10002": "阈值不能为空", + "ORG_ZSTACK_DRS_10001": "DRS 已禁用", + "ORG_ZSTACK_DRS_10004": "非法阈值运算符[%s]", + "ORG_ZSTACK_DRS_10003": "非法的阈值名称[%s]", + "ORG_ZSTACK_DRS_10006": "非法的thresholdValue,有效范围:(0, 100]", + "ORG_ZSTACK_DRS_10005": "阈值不能为空", + "ORG_ZSTACK_DRS_10008": "DRS[%s]的状态是%s", + "ORG_ZSTACK_DRS_10007": "全局配置 ENABLE_DRS 已关闭", + "ORG_ZSTACK_DRS_10009": "DRS[%s] 的自动化级别不是手动模式", + "ORG_ZSTACK_ZWATCH_FUNCTION_10012": "value[%s] 不是整数", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10018": "无法执行 API 操作。后端网络 [uuid:%s] 已连接至 VPC 路由器 [uuid:%s],而该路由器未与前端网络 [uuid:%s] 连接", + "ORG_ZSTACK_ZWATCH_FUNCTION_10011": "无效参数[limit:%s],它不能是负数", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10019": "无法执行 API 操作。后端网络 [UUID:%s] 必须是 VPC 网络,因为其他后端网络是 VPC 网络", + "ORG_ZSTACK_ZWATCH_FUNCTION_10010": "未知参数[%s]", + "ORG_ZSTACK_DRS_10020": "删除 DRP 在虚机迁移期间不允许", + "ORG_ZSTACK_DRS_10011": "成功执行,不允许重复执行", + "ORG_ZSTACK_DRS_10010": "提示[%s]已过期", + "ORG_ZSTACK_DRS_10013": "The vm[%s]状态不是运行中", + "ORG_ZSTACK_DRS_10012": "The vm[%s] 已被删除", + "ORG_ZSTACK_DRS_10015": "该集群[%s]不支持DRS。", + "ORG_ZSTACK_DRS_10014": "The vm[%s] is no longer on the source host[%s]", + "ORG_ZSTACK_DRS_10017": "主机UUID列表为空", + "ORG_ZSTACK_DRS_10016": "无法创建DRS,%s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10013": "无法执行该 API 操作。后端网络 [UUID:%s] 必须是 VPC 网络,因为前端 L3 网络是 VPC 网络", + "ORG_ZSTACK_ZWATCH_FUNCTION_10005": "无效参数[start:%s],它不能为负数", + "ORG_ZSTACK_DRS_10019": "建议在调度时不允许使用", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10014": "无法执行API操作。后端网络[UUID:%s]未连接VPC路由器", + "ORG_ZSTACK_DRS_10018": "查询主机利用率数据失败", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10015": "无法执行 API 操作。后端网络 [uuid:%s] 已连接至 VPC 路由器 [uuid:%s],而前端网络已连接至 VPC 路由器 [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10016": "无法执行 API 操作。后端网络 [UUID:%s] 必须是私有平坦网络,因为前端 L3 网络是私有平坦网络", + "ORG_ZSTACK_ZWATCH_FUNCTION_10002": "未知函数[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10010": "无法执行 API 操作。后端网络 [uuid:%s] cidr [%s] 与前端 l3 网络[uuid:%s] cidr [%s] 存在重叠", + "ORG_ZSTACK_ZWATCH_FUNCTION_10008": "无效的参数值[%s]:[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10011": "无法执行API操作。后端网络[uuid:%s] CIDR [%s] 与管理L3网络[uuid:%s] CIDR [%s] 存在重叠", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10012": "无法执行API操作。前端网络[UUID:%s]未连接到VPC路由器", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10001": "无法找到与[%s]相关的ceph池 OSD组", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10000": "required ceph池[uuid:%s]无法满足条件 [可用大小 \u003e %s字节],当前可用大小 %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10006": "因为镜像 [uuid:%s] 已删除,无法创建 SLB 实例", + "ORG_ZSTACK_ZWATCH_FUNCTION_10001": "重复参数[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10007": "因为实例数量达到最大值,无法创建SLB实例", + "ORG_ZSTACK_ZWATCH_FUNCTION_10000": "缺少必需的参数[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10008": "因为无效的前端L3网络类型 %s 无法创建SLB组", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10009": "无法执行API操作。前端网络[uuid:%s] cidr [%s] 与管理L3网络[uuid:%s] cidr [%s] 存在重叠", + "ORG_ZSTACK_DRS_10022": "在虚拟机迁移过程中不允许调度", + "ORG_ZSTACK_DRS_10023": "缺少主机CPU、内存监控数据", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10002": "云中无法删除 VIP[%s],请先删除 UUID:%s 的 SLB", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10003": "因为无法找到负载均衡SLB组[uuid:%s],因此无法创建SLB实例", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10004": "因为未为SLB组[uuid:%s]配置SLB报价,无法创建SLB实例", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10005": "因为 SLB 产品 [uuid:%s] 的镜像 UUID 为空,无法创建 SLB 实例", + "ORG_ZSTACK_CORE_ENCRYPT_10000": "加密错误 : %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10000": "无法找到SLB实例[uuid:%s]的NIC,该实例连接至前层网络[uuid:%s]的SLB组中", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10001": "无法删除 IP 范围[%s],请先删除 UUID:%s 对应的 SLB", + "ORG_ZSTACK_IDENTITY_10011": "旧密码与原始密码不匹配,无法更新用户[uuid:%s]的密码", + "ORG_ZSTACK_IDENTITY_10010": "用户[uuid:%s]不属于账户[uuid:%s]", + "ORG_ZSTACK_IDENTITY_10016": "配额[name:%s] of 账户[uuid:%s] 不能为 %d", + "ORG_ZSTACK_IDENTITY_10017": "该账号[uuid:%s]使用的[name:%s, 使用量:%s]超出请求配额: %d", + "ORG_ZSTACK_IDENTITY_10001": "错误密码", + "ORG_ZSTACK_IDENTITY_10009": "该账号[uuid: %s]没有资源[uuid: %s]", + "ORG_ZSTACK_IDENTITY_10008": "用户组[uuid:%s]不属于账号[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10003": "失败删除VIP%s,因为%s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10009": "服务[uuid: %s]已绑定到一个可观测性服务器", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10002": "失败在虚拟路由器[uuid:%s]同步vips[ips: %s]以附加nic[uuid: %s, ip: %s],因为%s", + "ORG_ZSTACK_OVF_10025": "只有处于状态:%s 的 vm 才能被导出。", + "ORG_ZSTACK_OVF_10026": "解析 APICreateVmInstanceFromOvfMsg 中的 jsonCreateVmParam 失败", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10006": "在区域[uuid:%s]中为L3网络[uuid:%s]找到了虚拟路由器报价[uuid:%s];然而,该网络的公网[uuid:%s]与VIP[uuid:%s]的不同;您可能需要使用系统标签guestL3Network::l3NetworkUuid来指定特定的虚拟路由器报价以匹配L3网络", + "ORG_ZSTACK_OVF_10023": "导出虚拟机需要一个ImageStore备份存储,但给定的backupStorageUuid: %s 不是一个ImageStore备份存储。", + "ORG_ZSTACK_OBSERVABILITYSERVER_10006": "可观测性服务器提供[uuid: %s]未启用", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10005": "虚拟路由器[uuid:%s, 状态:%s] 未运行", + "ORG_ZSTACK_OVF_10024": "未找到带有uuid: %s 的vm进行导出", + "ORG_ZSTACK_OBSERVABILITYSERVER_10007": "可观测性服务器报价[uuid: %s]的镜像缺失", + "ORG_ZSTACK_OVF_10021": "从 OVF 创建 VM 失败,因为 VM 的根磁盘无法找到", + "ORG_ZSTACK_OVF_10022": "VM[uuid: %s] 已经导出为 OVA 包[uuid: %s],请删除该包后再试。", + "ORG_ZSTACK_KVM_XMLHOOK_10001": "xml挂钩[uuid: %s]更新成功,但未能重启vm[uuid:%s]。详细信息是:%s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10003": "无法找到服务: %s 的虚拟路由器,类型: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10010": "可观测性服务器[uuid: %s]未运行,无法附加服务", + "ORG_ZSTACK_OVF_10018": "读取 ovf 文件失败。", + "ORG_ZSTACK_OVF_10017": "ova 包[uuid: %s] 未找到。", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10057": "无法找到负载均衡器[uuid:%s,type:%s]的SLB组UUID", + "ORG_ZSTACK_STORAGE_PRIMARY_FILESYSTEM_10000": "主机[uuid:%s]的心跳未更新", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_HA_10000": "HA组扩展点为空", + "ORG_ZSTACK_OVF_10030": "长期任务[uuid:%s]执行失败", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10040": "无法将 vmnic 添加到负载均衡服务器组,因为 l3 网络[uuid:%s]连接到了不同的 vpc 路由器", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10041": "无法将 vmnic 添加到负载均衡服务器组,因为 L3 网络未连接到 SLB 实例", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10046": "因为存在另一个为SLB组创建的实例[uuid:%s, name:%s],所以无法创建SLB实例", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10047": "因为负载均衡组中已有其他2个实例创建,无法创建SLB实例", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10001": "失败从NFS[uuid:%s,路径:%s]上传位元到镜像存储[主机名:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10042": "因为无效的监控IP %s 无法更改SLB组监控IP地址", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10043": "无法将SLB组[uuid:%s]切换到HA模式,因为实例状态[%s]未停止", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10044": "failed to create vip%s on virtual router[uuid:%s], because %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10000": "从镜像存储备份存储[主机名:%s, 路径: %s]下载数据到NFS主存储[唯一标识符:%s, 路径: %s]失败,%s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10045": "为 SLB 组 [uuid:%s] 创建亲和组失败", + "ORG_ZSTACK_IAM2_API_10011": "属性[uuid:%s]不属于任何组", + "ORG_ZSTACK_IAM2_API_10012": "属性[uuid:%s]不属于任何组织", + "ORG_ZSTACK_IAM2_API_10013": "属性[uuid:%s]不属于任何项目", + "ORG_ZSTACK_IAM2_API_10014": "属性[uuid:%s] 不属于任何虚拟ID", + "ORG_ZSTACK_IAM2_API_10015": "退休策略必须在拉取项目出退休状态之前被删除", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10039": "无法将 vmnic 添加到负载均衡服务器组,因为 l3 网络 [uuid:%s] 已连接到任何 vpc 路由器", + "ORG_ZSTACK_IAM2_API_10016": "登录被禁止,因为项目处于%s状态", + "ORG_ZSTACK_IAM2_API_10017": "没有配额[name:%s]找到", + "ORG_ZSTACK_IAM2_API_10018": "容器的CPU数量限制应大于容器请求的CPU数量", + "ORG_ZSTACK_IAM2_API_10019": "容器的内存大小限制应大于容器请求的内存大小", + "ORG_ZSTACK_OVF_10003": "卷控制器未找到。", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10007": "VIP [uuid: %s] 的 VIP QoS 不存在", + "ORG_ZSTACK_OVF_10004": "CD驱动控制器未找到。", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10008": "无法删除关联在VpcSharedQos中的VIP [uuid: %s] 的QoS", + "ORG_ZSTACK_OVF_10001": "非法磁盘容量: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10005": "无法设置 VIP [uuid: %s] 的服务质量。它已被附挂在 VpcSharedQos 中", + "ORG_ZSTACK_OVF_10002": "非法磁盘占用大小: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10006": "VIP带宽保障 Vip [uuid: %s] 端口 %s 不存在", + "ORG_ZSTACK_OVF_10000": "文件引用未找到 for 磁盘 %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10009": "无法找到 VipQos 后端 for Vip [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10010": "VpcSharedQos 必须设置带宽", + "ORG_ZSTACK_IPSEC_10028": "L3网络[%s]未绑定到ipsec[uuid:%s]", + "ORG_ZSTACK_AUTOSCALING_10000": "无效的三层网络 UUID[%s]对于属于负载均衡器[%s]的监听器,所有网络必须连接到负载均衡器服务并使用相同的 vRouter 连接", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10011": "VPC 需先绑定 L3[%s]", + "ORG_ZSTACK_IPSEC_10029": "CIDR [%s] 已经在IPsec [uuid :%s] 的CIDRs中", + "ORG_ZSTACK_AUTOSCALING_10001": "从自动扩展组分离自动扩展模板[%s]失败,错误为%s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10030": "无法将三层网络 [uuid:%s] 挂载到SLB实例,因为IPv6前缀[%s]格式错误", + "ORG_ZSTACK_AUTOSCALING_10003": "监听器[uuid:%s]正被autoScalingVmTemplate[%s]使用,无法删除", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10014": "VpcSharedQos 无法绑定此 VIP,因为 VIP[%s] 已经被绑定到另一个 VpcSharedQos 中", + "ORG_ZSTACK_IPSEC_10025": "L3网络[%s]不能与ipsec[uuid:%s]绑定两次", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10012": "AttachVipToVpcSharedQos 参数必须设置 VipUuids 或 VipLists", + "ORG_ZSTACK_IPSEC_10026": "必须在APIAttachL3NetworksToIPsecConnectionMsg中包含L3网络", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10013": "VpcSharedQos 无法绑定此 Vip,因为 Vip[%s] 不在 l3[%s] 中", + "ORG_ZSTACK_IPSEC_10027": "L3网络[%s]不是VPC网络,无法绑定或解绑到IPSec", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10035": "无法创建负载均衡器,因为 VIP [uuid:%s] 已绑定其他网络服务 [%s]", + "ORG_ZSTACK_IPSEC_10020": "peerAddress[%s] 不是 IPv4 地址", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10036": "无法创建负载均衡器,因为 VIP [uuid:%s] 已绑定到 VPC 路由器 [%s]", + "ORG_ZSTACK_IPSEC_10021": "authKey 不得包含空格和特殊字符 \\\"`\\\\", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10037": "无法创建负载均衡器因为无效的SLB组 [uuid:%s]", + "ORG_ZSTACK_IPSEC_10022": "IPsec VIP [%s] 不能是 CIDR 公共地址池类型下的第一个或最后一个 IP 地址", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10038": "无法将后端服务器的vmnic添加到serverGroup[uuid:%s],因为vmnic的uuid为空", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10031": "无法将三层网络 [uuid:%s] 挂载到SLB实例,因为必须在systemTag中设置IP地址和前缀", + "ORG_ZSTACK_AUTOSCALING_10004": "该实例[%s]不在扩展组[%s]中", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10032": "无法从SLB实例detach前端L3网络[uuid:%s]", + "ORG_ZSTACK_AUTOSCALING_10005": "报警[uuid:%s]正被自动扩展组[%s]使用,无法删除", + "ORG_ZSTACK_IAM2_API_10020": "组织[uuid:%s]是一个公司,不能有上级组织", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10033": "无法将管理L3网络 [uuid:%s] 从SLB实例中分离", + "ORG_ZSTACK_AUTOSCALING_10006": "规则[%s]状态为禁用", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10034": "无法从SLB实例detach网卡[uuid:%s],因为它是最后一个后端L3网络网卡", + "ORG_ZSTACK_IAM2_API_10021": "父组织[uuid:%s]不能是子组织[uuid:%s]的子组织", + "ORG_ZSTACK_IAM2_API_10022": "重复的虚拟ID名称[%s]", + "ORG_ZSTACK_IAM2_API_10023": "重复项目名称[%s]", + "ORG_ZSTACK_IAM2_API_10024": "无效的项目名称[%s],存在同名的账户或项目", + "ORG_ZSTACK_IAM2_API_10025": "IAM2OrganizationVO[uuid:%s] 不存在", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10028": "无法将三层网络 [uuid:%s] 挂载到SLB实例,因为必须在systemTag中设置IP地址和子网掩码", + "ORG_ZSTACK_IAM2_API_10026": "该项目[uuid\u003d%s]已绑定至组织[uuid\u003d%s]", + "ORG_ZSTACK_OBSERVABILITYSERVER_10019": "开始时间必须小于结束时间", + "ORG_ZSTACK_IAM2_API_10027": "项目[uuid\u003d%s]未关联", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10029": "无法将三层网络 [uuid:%s] 挂载到 SLB 实例,因为 IPv6 地址 [%s] 格式错误", + "ORG_ZSTACK_IAM2_API_10028": "组织%s是不能作为其他组织子项的公司", + "ORG_ZSTACK_IAM2_API_10029": "虚拟ID[UUID: %s]不在项目[UUID: %s]中", + "ORG_ZSTACK_OBSERVABILITYSERVER_10015": "找不到可观测性服务类型: %s", + "ORG_ZSTACK_OVF_10015": "备份存储[uuid: %s]没有足够的可用容量用于导出虚拟机[uuid: %s],所需容量是:%d", + "ORG_ZSTACK_OBSERVABILITYSERVER_10016": "服务[uuid: %s]类型为%s不能从可观测性服务器[uuid: %s]中解绑,原因:%s", + "ORG_ZSTACK_OVF_10012": "非法 CPU \"CoresPerSocket\" 值: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10017": "服务[uuid: %s]未绑定到可观测性服务器[uuid: %s]", + "ORG_ZSTACK_OBSERVABILITYSERVER_10018": "开始时间和结束时间都必须指定", + "ORG_ZSTACK_OVF_10010": "CPU \u0027VirtualQuantity\u0027 未找到", + "ORG_ZSTACK_OBSERVABILITYSERVER_10011": "可观测性服务器报价[uuid: %s]未找到", + "ORG_ZSTACK_OVF_10011": "非法CPU「VirtualQuantity」值: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10013": "服务[uuid: %s]类型为%s不能绑定到可观测性服务器[uuid: %s],原因:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10000": "IPv6 的 VipQos 将会很快添加", + "ORG_ZSTACK_ALIYUN_STORAGE_SNAPSHOT_10000": "该操作仅允许当ECS实例状态为运行中或已停止时执行", + "ORG_ZSTACK_OVF_10009": "CPU \u0027InstanceID\u0027 未找到", + "ORG_ZSTACK_OBSERVABILITYSERVER_10020": "无效的日期时间格式。预期为带有可选时区详情的ISO-8601格式:%s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10021": "可观测性服务器[uuid: %s]未运行,无法获取服务数据", + "ORG_ZSTACK_OVF_10007": "内存 \u0027VirtualQuantity\u0027 未找到", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10003": "SetVipQos 必须设置入站带宽或出站带宽", + "ORG_ZSTACK_OVF_10008": "非法内存\u0027虚拟数量\u0027值: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10004": "无法为该 VIP 设置 QoS。并非所有对端 L3 网络提供 VIPQos 服务。", + "ORG_ZSTACK_OVF_10005": "以太网适配器: %s 没有连接到网络。", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10001": "VIP带宽保障 Vip [uuid: %s] 端口 %s 已经存在", + "ORG_ZSTACK_OVF_10006": "内存 \u0027InstanceID\u0027 未找到", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10002": "VIP QoS 对于 VIP [uuid: %s] 已经存在", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10024": "因为无效的后端类型 %s 无法创建 SLB 组", + "ORG_ZSTACK_IPSEC_10031": "无法更改状态因为IPsec [uuid:%s] 的状态不是就绪状态", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10025": "因为无效的监控IP %s无法创建SLB组", + "ORG_ZSTACK_IPSEC_10032": "无法重新连接此IPsec [uuid:%s],请升级IPsec版本", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10026": "无法将三层网络 [uuid:%s] 挂载到 SLB 实例,因为 IPv4 地址 [%s] 格式错误", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10027": "无法将三层网络 [uuid:%s] 挂载到SLB实例,因为IPv4子网掩码[%s]格式错误", + "ORG_ZSTACK_IAM2_API_10030": "非法操作,无法添加角色[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10021": "无法执行 API 操作。后端网络 [uuid:%s] 已连接至 VPC 路由器 [uuid:%s],而其他后端网络则连接至 VPC 路由器 [uuid:%s]", + "ORG_ZSTACK_IAM2_API_10031": "不能操作过时的虚拟ID: %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10022": "无法执行 API 操作。后端网络 [UUID:%s] 不能是 VPC 网络,因为其他后端网络不是 VPC 网络", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10023": "因为无效的部署类型 %s 无法创建 SLB 组", + "ORG_ZSTACK_IPSEC_10030": "CIDR [%s] 不在 IPsec [uuid :%s] 的 CIDRs 中", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10026": "操作错误,因为:获取响应失败", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10028": "备份快照到备份存储是一个已弃用的功能,将在未来的版本中移除", + "ORG_ZSTACK_IAM2_API_10000": "属性名称不能为null,值[%s]", + "ORG_ZSTACK_IAM2_API_10001": "属性名称[%s]超出最大长度2048个字符", + "ORG_ZSTACK_IAM2_API_10002": "属性[name:%s]的值[%s]超出最大长度2048个字符", + "ORG_ZSTACK_IAM2_API_10003": "The Organization[uuid: %s] 使用 [name: %s, usedValue: %s] 超过了 Request:%s。", + "ORG_ZSTACK_IAM2_API_10005": "%s 不是一个有效的值。有效值是 allow/rejection xxx 至 xxx", + "ORG_ZSTACK_IAM2_API_10006": "默认组织[%s]无法被删除", + "ORG_ZSTACK_IAM2_API_10007": "重复模板名称[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10018": "VpcSharedQos 无法解绑此 Vip,因为 Vpc[%s] 未连接", + "ORG_ZSTACK_IAM2_API_10009": "管理员是保留名称,请使用其他名称", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10016": "DetachVipFromVpcSharedQos 参数必须设置 VipUuids 或 VipLists", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10017": "VpcSharedQos 无法解绑此 Vip,因为 Vip[%s] 未绑定", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10010": "ceph 主存储[uuid:%s]可能已被删除。", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10013": "ceph 主存储[cid:%s, 名称:%s]已宕机,因为一个监控节点[uuid:%s]报告了一次操作失败[%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10012": "在另一个 CEPH 主存储[name:%s, uuid:%s] 中发现了相同的 FSID[%s],您不能将相同的 CEPH 配置添加为两个不同的主存储", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10015": "无法连接存储节点", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10017": "监控节点[mon:%s]返回的fsid[%s]与当前cep集群的fsid[%s]不同,请问是否误将不属于当前集群的监控节点添加进来?", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10016": "无法将存储节点添加到ceph主存储", + "ORG_ZSTACK_IAM2_API_10010": "无效名称[%s],已存在同名的项目或账户", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10008": "无法连接到ceph主存储[uuid:%s],未能连接所有ceph监视器。", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10007": "所有监视器无法执行HTTP调用[%s]", + "ORG_ZSTACK_ZOPS_10009": "获取 chrony 源失败,因为:%s", + "ORG_ZSTACK_ZOPS_10005": "%s 从 %s 是不可达的,因为:%s", + "ORG_ZSTACK_ZOPS_10004": "配置时间源 \u0027%s\u0027 在 %s 失败,因为:%s,原始信息:%s", + "ORG_ZSTACK_ZOPS_10007": "%s 检查 Ceph 健康状态失败,因为: %s", + "ORG_ZSTACK_ZOPS_10006": "失败检查 %s 是否可以从 %s 达到,因为:%s", + "ORG_ZSTACK_ZOPS_10001": "%s 不是一个有效的IP地址", + "ORG_ZSTACK_ZOPS_10003": "%s 不是一个有效的IP地址或域名", + "ORG_ZSTACK_ZOPS_10002": "内部和外部chrony服务器不能同时为null", + "ORG_ZSTACK_ZOPS_10010": "获取 %s 的 chrony 源失败,因为:%s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10001": "备份存储[uuid:%s, name:%s, fsid:%s] 不在与主存储[uuid:%s, name:%s, fsid:%s] 同一的 Ceph 集群中", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10004": "保存加密后创建的镜像缓存失败: %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10005": "fsid 在 ps[%s] 和 bs[%s] 之间不相同,创建模板被禁止。", + "ORG_ZSTACK_ZOPS_10019": "在 %s 中删除旧的 chrony 服务器于 zstack.properties 文件失败,因为:%s", + "ORG_ZSTACK_ZOPS_10016": "ZStone 尚不支持在线更新 chrony 服务器!", + "ORG_ZSTACK_ZOPS_10015": "%s 从 %s 是不可达的", + "ORG_ZSTACK_ZOPS_10018": "ceph 状态不健康,请首先检查您的环境!%s", + "ORG_ZSTACK_ZOPS_10012": "失败检查 %s 是否可以从主机 %s 达到,因为 %s 未由我们管理", + "ORG_ZSTACK_ZOPS_10011": "在 %s 中同步 chrony 服务器失败,因为:%s,原始:%s", + "ORG_ZSTACK_ZOPS_10014": "%s 不能设置为外部 chrony 服务器!", + "ORG_ZSTACK_ZOPS_10020": "失败在 %s 中配置 zstack.properties 的 chrony 服务器,因为:%s", + "ORG_ZSTACK_PROXY_10000": "无法找到带有uuid的UserProxyConfig", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10005": "从宿主机[UUID:%s]启动USB重定向服务器失败", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10004": "无法在宿主机[%s]启动USB服务器,因为宿主机未连接", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10003": "主机[%s]已启动超过64个USB重定向端口", + "ORG_ZSTACK_COMPUTE_HOST_10085": "无法在接口上设置管理网络,因为管理网络采用自动获取类型", + "ORG_ZSTACK_COMPUTE_HOST_10084": "无法在接口上分离管理网络,因为管理网络是自动获取类型", + "ORG_ZSTACK_COMPUTE_HOST_10087": "无法在绑定设备上分离管理网络,因为管理网络是自动获取类型", + "ORG_ZSTACK_COMPUTE_HOST_10081": "无法设置桥接从属接口的IP地址", + "ORG_ZSTACK_COMPUTE_HOST_10080": "无法设置已在其他接口上设置的IP地址", + "ORG_ZSTACK_COMPUTE_HOST_10083": "无效的绑定UUID", + "ORG_ZSTACK_COMPUTE_HOST_10089": "无效的服务类型", + "ORG_ZSTACK_COMPUTE_HOST_10088": "不能在绑定设备上设置管理网络,因为管理网络采用自动获取类型", + "ORG_ZSTACK_COMPUTE_HOST_10090": "模拟通过 IPMI 关闭主机[%s]失败。", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10001": "无法连接到主机,端口:%s,%d。问题可能由不正确的smtpServer或smtpPort引起。[error\u003d%s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10002": "无法在15秒内连接SMTP服务器[服务器: %s, 端口: %s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10003": "SMTP 服务器验证错误: %s", + "ORG_ZSTACK_AI_COLLECTOR_10000": "在 MindIE 元数据收集中未找到部署上下文", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10004": "endpoint 已禁用", + "ORG_ZSTACK_AI_COLLECTOR_10001": "某些部署上下文没有VM库存,无法收集MindIE元数据", + "ORG_ZSTACK_COMPUTE_HOST_10096": "通过IPMI重启主机[%s]失败。", + "ORG_ZSTACK_COMPUTE_HOST_10095": "模拟电源重置主机[%s]通过IPMI失败。", + "ORG_ZSTACK_COMPUTE_HOST_10098": "主机[%s]获取了意外的返回值", + "ORG_ZSTACK_COMPUTE_HOST_10097": "IPMI信息不完整。", + "ORG_ZSTACK_COMPUTE_HOST_10092": "模拟通过 IPMI 在主机[%s]上开启电源失败。", + "ORG_ZSTACK_COMPUTE_HOST_10091": "关闭主机[%s]通过IPMI失败。", + "ORG_ZSTACK_COMPUTE_HOST_10094": "重启主机[%s:%d]失败,因为主机已经关闭。", + "ORG_ZSTACK_COMPUTE_HOST_10093": "通过 IPMI 启动主机[%s]失败。", + "ORG_ZSTACK_COMPUTE_HOST_10099": "主机[%s]无法连接IPMI[%s],原因:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10002": "无法计算文件夹[%s]中文件的md5sum。\\nstdout:%s\\nstderr:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10003": "无法在主机[ip:%s]的文件夹[%s]中检查文件的md5sum。\\nstdout:%s\\nstderr:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10000": "用户名或密码或端口号码可能存在问题", + "ORG_ZSTACK_COMPUTE_HOST_10065": "失败更新主机网络标签 [uuid:%s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10000": "问题可能是由错误的用户名或密码,或者邮箱权限被拒绝引起的。[error\u003d%s]", + "ORG_ZSTACK_COMPUTE_HOST_10064": "删除主机网络标签 [uuid:%s] 失败", + "ORG_ZSTACK_COMPUTE_HOST_10067": "无效的 IP 地址格式[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10066": "主机[%s]未连接,不支持断电操作", + "ORG_ZSTACK_COMPUTE_HOST_10069": "无效的 IP 集,它必须与子网掩码一起设置", + "ORG_ZSTACK_COMPUTE_HOST_10068": "无效的网络掩码格式[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10073": "无法设置绑定从属接口的IP地址", + "ORG_ZSTACK_COMPUTE_HOST_10070": "无法设置接口的IP地址,该接口对应于管理网络", + "ORG_ZSTACK_COMPUTE_HOST_10078": "无法设置与管理网络对应的绑定接口的IP地址", + "ORG_ZSTACK_COMPUTE_HOST_10077": "无效接口UUID", + "ORG_ZSTACK_IMAGE_10019": "上传会话已过期", + "ORG_ZSTACK_IMAGE_10016": "失败的原因是管理节点重启了。", + "ORG_ZSTACK_IMAGE_10015": "图像路径不在白名单中: %s", + "ORG_ZSTACK_IMAGE_10014": "所有在该服务器上的镜像都无法使用", + "ORG_ZSTACK_IMAGE_10013": "图像路径 [%s] 在黑名单 %s 中", + "ORG_ZSTACK_IMAGE_10012": "绝对路径必须使用", + "ORG_ZSTACK_IMAGE_10011": "url 必须以 \u0027file:///\u0027、\u0027http://\u0027、\u0027https://\u0027、\u0027ftp://\u0027、\u0027sftp://\u0027 或 \u0027/\u0027 开头", + "ORG_ZSTACK_IMAGE_10010": "在 uuids%s 中未指定备份存储;可用的备份存储不在状态 %s 中或处于状态 %s 之外,或者 UUID 无效", + "ORG_ZSTACK_IMAGE_10009": "不支持的图像类型[%s]", + "ORG_ZSTACK_IMAGE_10008": "未知格式[%s]", + "ORG_ZSTACK_IMAGE_10007": "ISO 不能用作系统镜像", + "ORG_ZSTACK_IMAGE_10006": "卷快照[uuid:%s]未启用,状态为%s", + "ORG_ZSTACK_IMAGE_10005": "卷快照[uuid:%s]尚未就绪,其状态为%s", + "ORG_ZSTACK_IMAGE_10004": "卷[uuid:%s]未启用,状态为%s", + "ORG_ZSTACK_IMAGE_10003": "卷[uuid:%s] 不处于就绪状态,它的状态为%s", + "ORG_ZSTACK_IMAGE_10002": "The AArch64 架构不支持 legacy。", + "ORG_ZSTACK_ALIYUN_ACCOUNT_10000": "无法在 %d 毫秒内连接到 [%s],因此阿里云开放API不可达。", + "ORG_ZSTACK_IMAGE_10039": "未找到与镜像[uuid:%s, name:%s]关联的备份存储", + "ORG_ZSTACK_IMAGE_10038": "该镜像[uuid:%s, name:%s]未在任何备份存储中找到", + "ORG_ZSTACK_IMAGE_10037": "从卷[uuid:%s]在所有备份存储上创建数据卷模板失败%s。请查看其中一个错误的原因", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10041": "预期为 \u0027true\u0027、\u0027false\u0027 或其他条件,当前条件包括: %s,但获得 %s", + "ORG_ZSTACK_IMAGE_10036": "分配所有备份存储[uuid:%s]失败,错误列表: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10040": "元素为空!", + "ORG_ZSTACK_IMAGE_10035": "无法找到合适的备份存储", + "ORG_ZSTACK_IMAGE_10034": "从根卷[uuid:%s]在所有备份存储上创建镜像失败,请查看其中一个错误的原因", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10002": "在进行卷[uuid: %s]存储迁移时,图像[uuid: %s]的下载缺少足够的容量,所需容量:%s,当前可用物理容量:%s", + "ORG_ZSTACK_IMAGE_10032": "无法分配由UUIDs指定的备份存储%s,错误列表是:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10003": "存储迁移不足以为卷[uuid: %s]分配容量,所需容量:%s,当前可用物理容量:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10004": "来源 ps[uuid: %s] 的数据已被丢弃,不支持回滚", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10005": "在共享块设备上迁移未带快照的卷不支持取消。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10000": "找到 trashId(%s) 在主存储 [%s] 中的迁移安装路径[%s] 中。如果您坚持要迁移卷[%s],请先通过 \u0027APICleanUpTrashOnPrimaryStorageMsg\u0027 清理它。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10001": "无法在与区域[uuid:%s]连接的任何备份存储中找到图像[uuid:%s]。请检查以下内容:\n1. 备份存储是否已附接到区域[uuid:%s]\n2. 备份存储是否处于连接状态;如果未连接,请尝试重新连接它", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10039": "只有函数可以在函数中定义,但发现 %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10032": "Fn::FindInMap 无法在 Resources 中找到资源 [%s]!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10036": "未找到引用 [%s]!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10035": "不支持的功能 [%s] 在 ZStack 资源模板中!", + "ORG_ZSTACK_CORE_ERRORCODE_10007": "输入参数 \u0027regex\u0027 或 \u0027category\u0027 必须设置", + "ORG_ZSTACK_CORE_ERRORCODE_10005": "详细代码必须是数字!", + "ORG_ZSTACK_IMAGE_10026": "无法克隆镜像,因为镜像 [%s] 的状态不是就绪状态", + "ORG_ZSTACK_CORE_ERRORCODE_10006": "%s: %s\"翻译成中文为:\"%s: %s", + "ORG_ZSTACK_IMAGE_10025": "来源图像 [%s] 不存在", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10051": "%s 无法转换为 String", + "ORG_ZSTACK_CORE_ERRORCODE_10003": "%s 不存在或是一个空文件夹", + "ORG_ZSTACK_CORE_ERRORCODE_10004": "读取详细模板文件 [%s] 失败,原因:%s", + "ORG_ZSTACK_IMAGE_10023": "vm 实例[uuid:%s] 没有根磁盘", + "ORG_ZSTACK_IMAGE_10022": "vm 实例[uuid:%s] 没有磁盘", + "ORG_ZSTACK_IMAGE_10021": "备份存储[uuid:%s]当前不在连接状态,当前状态是%s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10042": "期望为该对象提供 \"true\" 或 \"false\",但收到 %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10046": "Fn::GetAtt 无法在 Resources 中找到资源 [%s]!", + "ORG_ZSTACK_SSO_SAML2_SERVICE_10000": "iam2 中存在同名用户[%s],预期类型[%s]但发现类型[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10119": "主机[%s]没有IPMI设备或IPMI没有地址。请配置IPMI地址后重新连接主机以刷新主机的IPMI信息", + "ORG_ZSTACK_ZQL_AST_VISITORS_PLUGIN_10000": "求和的字段必须指定", + "ORG_ZSTACK_SSO_SAML2_SERVICE_10001": "重复的 SAML 登录[%s, %s]类型为[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10120": "失败迁移虚拟机[uuids:%s]在主机[uuid:%s,名称:%s,IP:%s]上,将尝试停止它。", + "ORG_ZSTACK_CORE_ERRORCODE_10001": "文件或JSON内容不能同时非空", + "ORG_ZSTACK_CORE_ERRORCODE_10002": "无法扫描文件夹:%s", + "ORG_ZSTACK_CORE_ERRORCODE_10000": "非文件或JSON内容输入", + "ORG_ZSTACK_COMPUTE_HOST_10124": "主机正在连接,ping失败", + "ORG_ZSTACK_COMPUTE_HOST_10104": "存在一个主机具有管理IP[%s]用于hypervisor[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10103": "集群[uuid:%s]的虚化类型为null", + "ORG_ZSTACK_COMPUTE_HOST_10106": "集群[uuid:%s]的架构是%s,与主机[name:%s, ip:%s]的架构%s不匹配", + "ORG_ZSTACK_COMPUTE_HOST_10105": "连接后,主机[name:%s, ip:%s]返回空架构", + "ORG_ZSTACK_COMPUTE_HOST_10100": "主机IPMI[%s]不可达,因为%s", + "ORG_ZSTACK_COMPUTE_HOST_10102": "集群[uuid:%s]不存在", + "ORG_ZSTACK_SCHEDULER_10008": "无效的时间单位: %s", + "ORG_ZSTACK_SCHEDULER_10005": "该磁盘[%s]不支持快照保留", + "ORG_ZSTACK_SCHEDULER_10006": "快照最大数量 : %s 格式错误因为 %s", + "ORG_ZSTACK_COMPUTE_HOST_10108": "系统主机网络服务类型[%s]无法删除", + "ORG_ZSTACK_COMPUTE_HOST_10107": "主要存储[uuid:%s]变得断开连接,主机未附加任何已连接的主要存储", + "ORG_ZSTACK_COMPUTE_HOST_10109": "系统主机网络服务类型[%s]无法更新", + "ORG_ZSTACK_SCHEDULER_10002": "上次任务尚未完成,请跳过此任务", + "ORG_ZSTACK_COMPUTE_HOST_10114": "无法维护主机[uuid:%s, status:%s],该主机未连接", + "ORG_ZSTACK_COMPUTE_HOST_10111": "webssh 服务未运行。", + "ORG_ZSTACK_COMPUTE_HOST_10110": "主机网络服务类型[%s]出现错误", + "ORG_ZSTACK_COMPUTE_HOST_10113": "管理IP[%s]既不是有效的IPv4地址也不是主机名", + "ORG_ZSTACK_COMPUTE_HOST_10112": "存在一个主机具有管理IP[%s]", + "ORG_ZSTACK_SCHEDULER_10018": "该虚拟机已经安排了任务[jobType:%s]", + "ORG_ZSTACK_SCHEDULER_10016": "根卷[%s]的虚拟机不可用。请检查虚拟机是否存在。", + "ORG_ZSTACK_SCHEDULER_10017": "快照组最大数量 : %s 格式错误因为 %s", + "ORG_ZSTACK_SCHEDULER_10014": "该磁盘[%s]不可用。请检查磁盘是否存在。", + "ORG_ZSTACK_SCHEDULER_10015": "该卷[%s]不是根卷", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10068": "在迁移Volume结构中,migrateVolumesBetweenSharedBlockGroupPrimaryStorageMsg 消息中没有卷!", + "ORG_ZSTACK_SCHEDULER_10013": "字段[%s]不能为空", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10067": "空的迁移卷结构在迁移卷于共享块组主存储消息中!", + "ORG_ZSTACK_VPCFIREWALL_10027": "规则集[%s]已经包含一个具有规则编号%s的规则。", + "ORG_ZSTACK_IPSEC_10006": "网络 [uuid: %s] 没有 IPsec 服务", + "ORG_ZSTACK_VPCFIREWALL_10028": "无法添加防火墙规则[%d],仅TCP或UDP协议可以使用端口", + "ORG_ZSTACK_IPSEC_10007": "远程CIDR[%s]与已存在的CIDR相同", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10000": "新建添加的网卡[uuids:%s]和已绑定的网卡不在同一个虚拟路由器上,它们分别位于虚拟路由器[uuids:%s]上", + "ORG_ZSTACK_IPSEC_10008": "远程CIDR[%s]和远程CIDR[%s]重叠", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10001": "新建添加虚拟机的网络接口[uuids:%s]和负载均衡器[uuid: %s]的VIP关联的对端L3网络[uuids:%s]不在同一个虚拟路由器上,它们位于不同的虚拟路由器[uuids:%s]上", + "ORG_ZSTACK_IPSEC_10009": "本地路由器的CIDR[%s]与远程CIDR[%s]重叠", + "ORG_ZSTACK_IPSEC_10002": "当前端口范围[%s, %s]与VIP[uuid: %s]的已用端口范围[%s, %s]存在冲突,协议:UDP", + "ORG_ZSTACK_IPSEC_10003": "cidr[%s]与关联的L3Network [uuid:%s]的ipsec [uuid:%s]远程cidr[%s]重叠", + "ORG_ZSTACK_VPCFIREWALL_10029": "无法添加防火墙规则[%d],只有TCP协议可以使用TCP标志", + "ORG_ZSTACK_IPSEC_10005": "%s", + "ORG_ZSTACK_VPCFIREWALL_10020": "无法将默认规则集附加到其他网卡", + "ORG_ZSTACK_IPSEC_10000": "无法找到IPsec连接[uuid:%s],它可能已被删除", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10006": "vmnic 必须指定以共享负载均衡器", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10073": "虚拟机[uuid: %s]没有额外的QMP套接字,可能是因为启动虚拟机时未启用全局配置[vm.additionalQmp],请确保已启用并重启zstack中的虚拟机", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10007": "无法找到负载均衡器 [uuid:%s] 所对应的虚拟路由器", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10072": "主要存储[uuid: %s]已附加了scsi lun[wwid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10071": "无法找到适合的主要存储[uuid:%s]的虚机类型以处理镜像格式或卷格式[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10004": "刷新负载均衡证书,因为:%s", + "ORG_ZSTACK_VPCFIREWALL_10021": "规则集[%s]已经包含了一个l3[%s]", + "ORG_ZSTACK_SCHEDULER_10009": "触发作业[uuid: %s]失败,因为%s", + "ORG_ZSTACK_ZWATCH_MYSQL_10001": "在 MySQL 命名空间[%s]中未找到", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10005": "刷新负载均衡监听器,因为:%s", + "ORG_ZSTACK_VPCFIREWALL_10022": "已经存在一个编号为[%s]的规则", + "ORG_ZSTACK_SCHEDULER_10029": "不能将任务[uuid:%s]添加到一个无效触发器[uuid:%s]中", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10077": "共享卷[uuid: %s]在共享块组主存储上无法调整大小", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10076": "无法找到卷[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10075": "共享块[uuid:%s, 磁盘Uuid:%s, 描述:%s]已添加到新的共享块组[uuid:%s]中的共享块组中", + "ORG_ZSTACK_SCHEDULER_10028": "不能将作业[uuid:%s]两次添加到相同的触发器[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10074": "必须指定至少一个磁盘才能添加共享块组主存储", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10079": "无法找到卷[%s]的准备", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10078": "共享卷[uuid: %s]在共享块组主存储上已附加到未停止的虚拟机实例[uuids: %s]", + "ORG_ZSTACK_SCHEDULER_10021": "间隔必须在重复超过一次时使用简单调度器时设置", + "ORG_ZSTACK_VPCFIREWALL_10016": "只有TCP或UDP协议可以使用端口", + "ORG_ZSTACK_VPCFIREWALL_10017": "只有TCP协议可以使用TCP标志", + "ORG_ZSTACK_IPSEC_10018": "该 VIP[%s] 已经被用于 %s", + "ORG_ZSTACK_VPCFIREWALL_10014": "规则集[%s]已经包含一个具有规则编号%s的规则。", + "ORG_ZSTACK_IPSEC_10019": "peer地址[%s]不能与VIP地址相同", + "ORG_ZSTACK_VPCFIREWALL_10015": "无法更新默认规则[%s]", + "ORG_ZSTACK_IPSEC_10013": "所有在同一个IPsec连接中的网络必须附加到相同的VPC路由器", + "ORG_ZSTACK_IPSEC_10014": "HA组%s没有主VPC", + "ORG_ZSTACK_VPCFIREWALL_10018": "只有ICMP协议可以使用ICMP类型", + "ORG_ZSTACK_IPSEC_10015": "存在使用旧IPsec插件的VPC[%s],请升级以创建IPsec隧道", + "ORG_ZSTACK_VPCFIREWALL_10019": "规则 [%s] 编号无效", + "ORG_ZSTACK_IPSEC_10016": "已经在同一虚拟路由器和对端地址上存在IPsec连接[uuid:%s, name:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10080": "使用厚分配卷作为缓存卷。卷[%s]的准备状态为%s", + "ORG_ZSTACK_IPSEC_10010": "所有在同一IPsec连接中的网络应同属一种类型", + "ORG_ZSTACK_IPSEC_10011": "IPsec连接只能指定 %s 中的一个网络", + "ORG_ZSTACK_IPSEC_10012": "L3网络 [uuid: %s] 尚未绑定到VPC路由器", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10084": "无法获取卷 %s 的集群 UUID", + "ORG_ZSTACK_VPCFIREWALL_10010": "已经有一个名为%s的规则模板", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10081": "SCSI LUN[uuid: %s, wwid: %s] 已经挂载到主存储[uuid: %s]", + "ORG_ZSTACK_SCHEDULER_10038": "无效的cron表达式", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10086": "无法找到合适的 KVM 主机以供共享块组的主存储使用[uuid: %s]", + "ORG_ZSTACK_SCHEDULER_10039": "cron 任务必须遵循类似以下格式:\"0 0/3 17-23 * * ?\"", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10085": "sanlock 说主机 %s 在 %s 上线状态异常", + "ORG_ZSTACK_SCHEDULER_10036": "停止时间已过", + "ORG_ZSTACK_SCHEDULER_10037": "cron 必须在使用 cron 调度器时设置", + "ORG_ZSTACK_SCHEDULER_10034": "持续时间超出范围", + "ORG_ZSTACK_SCHEDULER_10035": "停止时间超出 MySQL 时间戳范围", + "ORG_ZSTACK_SCHEDULER_10032": "startTime 必须为简单调度器设置", + "ORG_ZSTACK_SCHEDULER_10033": "调度间隔必须为简单的调度器设置", + "ORG_ZSTACK_SCHEDULER_10030": "存在 [%d] 个触发器添加到了作业[uuid:%s]中,无法再添加任何触发器。", + "ORG_ZSTACK_SCHEDULER_10031": "在作业组[uuid:%s]中已添加了[%d]个触发器,无法再添加任何更多。", + "ORG_ZSTACK_VPCFIREWALL_10005": "路由器 [uuid:%s] 没有主路由器", + "ORG_ZSTACK_VPCFIREWALL_10006": "VPC路由器[uuid:%s]已经有一个防火墙。", + "ORG_ZSTACK_VPCFIREWALL_10003": "无法删除系统默认规则集", + "ORG_ZSTACK_VPCFIREWALL_10004": "无法删除系统默认规则", + "ORG_ZSTACK_VPCFIREWALL_10001": "只有系统规则集可以更改操作类型", + "ORG_ZSTACK_VPCFIREWALL_10000": "无法分离系统默认规则集", + "ORG_ZSTACK_SCHEDULER_10045": "作业组已包含 %d 个作业,仅剩 %d 个名额", + "ORG_ZSTACK_SCHEDULER_10043": "没有类型为[%s]的调度器Job工厂找到", + "ORG_ZSTACK_SCHEDULER_10044": "%d 个作业与作业组具有不同的作业类型", + "ORG_ZSTACK_SCHEDULER_10041": "开始时间必须是正整数或0", + "ORG_ZSTACK_SCHEDULER_10042": "开始时间超出范围", + "ORG_ZSTACK_SCHEDULER_10040": "cron 定时器只需指定 cron 任务", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10005": "请插入 zbox 到管理节点。", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10006": "失败备份数据库: %s", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10003": "服务[%s]未运行", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10007": "另一个外部备份[uuid: %s]正在恢复中", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10002": "服务[%s]不支持重新加载配置", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10008": "both hostUuids 和 backupStorageUuids 都为空。您必须指定其中一个或两个。", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10001": "服务[%s]未注册", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10001": "某些卷[uuids:%s]恢复失败。您可以重新连接以再次触发。", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10000": "服务[%s]已注册", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10002": "无法在 zbox 备份安装目录下找到 recover.conf。", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10004": "zbox 应该先插入到一个宿主机中。", + "ORG_ZSTACK_VPCFIREWALL_10069": "无法找到vpcFirewallIpSetTemplate[uuid:%s],它可能已被删除", + "ORG_ZSTACK_VPCFIREWALL_10063": "绑定防火墙规则集[%s]失败,因为%s", + "ORG_ZSTACK_VPCFIREWALL_10064": "解绑规则集失败,可能已被删除", + "ORG_ZSTACK_VPCFIREWALL_10061": "删除防火墙规则在vRouter[%s]上失败,因为%s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10010": "Fn::Select 超出范围,请检查您的 JSON 文件!", + "ORG_ZSTACK_VPCFIREWALL_10062": "更改 vRouter[%s] 的防火墙规则状态失败,因为 %s", + "ORG_ZSTACK_VPCFIREWALL_10067": "无法找到与uuid:%s相关的vpcFirewall相关vRouter", + "ORG_ZSTACK_VPCFIREWALL_10068": "无法找到vpcFirewallRuleSet[uuid:%s],它可能已被删除", + "ORG_ZSTACK_VPCFIREWALL_10065": "分离防火墙规则集[%s]失败,因为%s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10014": "未找到参数 [%s]!", + "ORG_ZSTACK_VPCFIREWALL_10066": "无法找到vpcFirewall[uuid:%s],它可能已被删除", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10013": "参数 [%s] 没有找到值或默认值!", + "ORG_ZSTACK_VPCFIREWALL_10060": "创建防火墙规则集[%s]失败,因为%s", + "ORG_ZSTACK_IMAGE_10046": "镜像[uuid:%s, 名称:%s]在备份存储[uuid:%s]中未被删除", + "ORG_ZSTACK_IMAGE_10045": "该镜像[uuid:%s, 名称:%s]不在备份存储[uuid:%s]中", + "ORG_ZSTACK_IMAGE_10044": "该镜像[uuid:%s, name:%s]在任何备份存储中未被删除", + "ORG_ZSTACK_IMAGE_10043": "镜像[uuid:%s, 名称:%s]\u0027的状态[%s]在备份存储[uuid:%s]上不是Deleted状态", + "ORG_ZSTACK_IMAGE_10040": "detach iso[uuid\u003d%s] from vm失败,错误信息为%s", + "ORG_ZSTACK_VPCFIREWALL_10058": "删除虚拟路由器[%s]上的防火墙,因为%s", + "ORG_ZSTACK_VPCFIREWALL_10052": "默认规则集 %s 只能附加到一个接口转发上,但发现了与之相关的 %s 个接口", + "ORG_ZSTACK_VPCFIREWALL_10050": "防火墙 %s 相关的 VPC 不在运行状态", + "ORG_ZSTACK_VPCFIREWALL_10051": "无法删除规则集[%s],因为它仍然绑定到网络接口", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10020": "无法在\u0027条件\u0027中找到条件[%s]", + "ORG_ZSTACK_VPCFIREWALL_10056": "无法在vRouter[%s]上找到相关的l3[%] MAC地址", + "ORG_ZSTACK_VPCFIREWALL_10057": "创建防火墙规则[%s]失败,因为%s", + "ORG_ZSTACK_VPCFIREWALL_10054": "同步防火墙配置失败,因为 %s", + "ORG_ZSTACK_VPCFIREWALL_10055": "更新防火墙规则集动作失败,因为 %s", + "ORG_ZSTACK_VPCFIREWALL_10049": "规则集 %s 无更改", + "ORG_ZSTACK_VPCFIREWALL_10047": "从 l3[%s] 断开防火墙规则集失败,因为 %s", + "ORG_ZSTACK_VPCFIREWALL_10048": "在防火墙[%s],三层网络[%s],转发规则[%s]中找到重复的规则编号%s", + "ORG_ZSTACK_SSO_CAS_SERVICE_10002": "iam2 中存在同名用户[%s]", + "ORG_ZSTACK_SSO_CAS_SERVICE_10003": "重复 casLogin[%s, %s] 类型为[%s]", + "ORG_ZSTACK_SSO_CAS_SERVICE_10004": "无法找到类型为(%s)的CasLogin", + "ORG_ZSTACK_VPCFIREWALL_10041": "无法添加防火墙规则,因为描述长度 %s 不符合 ruleNo:%d 的要求", + "ORG_ZSTACK_VPCFIREWALL_10040": "无法添加防火墙规则,因为不存在 ruleNo:%d 的状态", + "ORG_ZSTACK_VPCFIREWALL_10045": "配置文件中的防火墙规则有语法错误:%s", + "ORG_ZSTACK_VPCFIREWALL_10046": "将防火墙规则集[%s]应用到L3[%s]失败,因为%s", + "ORG_ZSTACK_VPCFIREWALL_10044": "配置文件格式错误", + "ORG_ZSTACK_VPCFIREWALL_10038": "无法添加防火墙规则,因为源IP长度:%s 不符合规则No:%d", + "ORG_ZSTACK_VPCFIREWALL_10039": "无法添加防火墙规则,因为目的IP长度:%s 不符合规则No:%d", + "ORG_ZSTACK_VPCFIREWALL_10036": "无法添加防火墙规则,因为规则号 %d 无效", + "ORG_ZSTACK_VPCFIREWALL_10037": "无法添加防火墙规则,因为规则No:%d没有对应的操作", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10002": "vyos 初始化命令失败,因为:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10001": "无法通过 SSH 连接到虚拟路由器[%s](配置后)", + "ORG_ZSTACK_VPCFIREWALL_10030": "无法添加防火墙规则[%d],因为只有ICMP协议可以使用ICMP类型", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10003": "无法更改虚拟路由器VM[uuid:%s]的网络接口[ip:%s, mac:%s]防火墙默认动作,因为%s", + "ORG_ZSTACK_VPCFIREWALL_10031": "无法添加防火墙规则[%d],因为只有tcp或udp协议可以使用端口", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10006": "无法在虚拟路由器 VM[uuid:%s] 上启动 DHCP 服务器,因为 %s", + "ORG_ZSTACK_ZWATCH_FUNCTION_10014": "缺少必需参数", + "ORG_ZSTACK_ZWATCH_FUNCTION_10013": "未知参数", + "ORG_ZSTACK_VPCFIREWALL_10034": "无法添加防火墙规则[%d],因为只有TCP协议可以使用TCP标志", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10007": "无法停止虚拟路由器VM[uuid:%s]上的DHCP服务器,因为%s", + "ORG_ZSTACK_VPCFIREWALL_10035": "无法添加防火墙规则[%d]因为%s" +} \ No newline at end of file diff --git a/conf/i18n/globalErrorCodeMapping/global-error-zh_TW.json b/conf/i18n/globalErrorCodeMapping/global-error-zh_TW.json new file mode 100644 index 00000000000..35f1b8c8443 --- /dev/null +++ b/conf/i18n/globalErrorCodeMapping/global-error-zh_TW.json @@ -0,0 +1,4717 @@ +{ + "ORG_ZSTACK_XINFINI_SDK_10001": "格式化 API 結果到類[%s]失敗,resultString: %s, exception: %s", + "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10001": "不支持的數据中心 [%s] 類型 here!", + "ORG_ZSTACK_ALIYUN_CORE_DATACENTER_10000": "arg 'endpoint' 必須在 %s 類型中設置", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10080": "無法决定裸金属2实例应創建在哪個區域中", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10084": "在創建裸金属实例时, neither chassisUuid nor chassisOfferingUuid 已設置", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10082": "機箱没有足够的容量容纳镜像[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10081": "所需的機箱硬碟[%s]不属於機箱[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10087": "%s 只能在裸金属实例運行时創建或刪除", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10086": "%s 只能被創建或刪除", + "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10000": "不符合輸入格式,仅接受'^[0-9,]+$'\"", + "ORG_ZSTACK_COMPUTE_EMULATORPINNING_10001": "宿主機上的虚拟機仅拥有 % 個 CPU", + "ORG_ZSTACK_ZWATCH_UTILS_10001": "資源[%s]不支持zwatch返回带with子句", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10002": "身份認證功能已啟用但相应的資源池未設置,請重新啟用該功能並嘗試再次操作", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10003": "無法刪除正在使用的資源池 %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10000": "没有可用的安全虚拟機可以激活", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_SECRETRESOURCEPOOL_10001": "無效的令牌類型 %s,仅支持 %s。", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10059": "空許可證授權節點數是必需的", + "ORG_ZSTACK_STORAGE_PRIMARY_10039": "未找到主儲儲[uuid:%s]", + "ORG_ZSTACK_V2V_10019": "主要儲儲[uuid:%s]不支持v2v迁移", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10007": "失敗於通過状态事件[%s]更改卷快照[%s:%s]的状态", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10006": "無法在主儲儲[uuid:%s]上獲取卷[uuid:%s, 安装路径:%s]的大小,因为%s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10005": "失敗在主要儲儲[uuid:%s]上獲取卷[uuid:%s, 安装路径:%s]的大小,%s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10004": "vm[uuid:%s] 没有運行、暫停或销毁、停止、正在销毁,當前状态[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_10040": "主要儲儲[uuid=%s]不儲在", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10003": "卷未找到,卷Uuid: %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10002": "快照或其後裔有引用卷[uuids:%s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10001": "無法找到卷快照[uuid:%s, name:%s],它可能在之前的操作中已被刪除", + "ORG_ZSTACK_STORAGE_PRIMARY_10047": "cidr[%s] 輸入格式錯誤誤", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10050": "ZSha2 显示儲在另一個管理節點,但數据库中未找到該節點", + "ORG_ZSTACK_STORAGE_PRIMARY_10046": "仅允許一個主要儲儲 CIDR 系統統標签,但獲得了 %d 個", + "ORG_ZSTACK_STORAGE_PRIMARY_10049": "叢叢Uuid冲突,实例提供中指定的叢叢是%s,而創建參數中指定的叢叢是%s", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10052": "未找到解注册的appId!", + "ORG_ZSTACK_STORAGE_PRIMARY_10042": "請指定分配空間的目的", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10008": "無法将卷[uuid:%s]恢复至快照[uuid:%s],關聯的虚拟機[uuid:%s]卷當前不在已停止状态,當前状态是%s", + "ORG_ZSTACK_STORAGE_PRIMARY_10044": "無法找到任何合格的主儲儲,錯誤誤信息是 %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10000": "失敗更新组状态: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10050": "主儲儲UUID冲突,实例報价中指定的主儲儲为%s,創建參數中指定的主儲儲为%s", + "ORG_ZSTACK_V2V_10008": "不允許在网络[%s]中使用相同的MAC地址[%s]", + "ORG_ZSTACK_V2V_10009": "重复的 MAC 地址 [%s] 在网络[%s] 中", + "ORG_ZSTACK_STORAGE_PRIMARY_10052": "主儲儲UUID冲突,由磁碟配置指定的主儲儲为%s,而創建參數中指定的主儲儲为%s", + "ORG_ZSTACK_V2V_10006": "转换主機[uuid:%s]的底层宿主機应當是已連接状态", + "ORG_ZSTACK_V2V_10007": "转换主機[uuid:%s]無法連接到主要儲儲[uuid:%s]", + "ORG_ZSTACK_V2V_10004": "vm 实例[uuid:%s] 不儲在或不是一個 VMware 虚拟機", + "ORG_ZSTACK_V2V_10005": "conversionHostUuid 不应为空", + "ORG_ZSTACK_V2V_10002": "v2v 转换宿主機儲儲路径必須是绝对路径", + "ORG_ZSTACK_V2V_10003": "無效的迁移 URL: %s", + "ORG_ZSTACK_V2V_10000": "主機[uuid:%s]的状态必須为連接状态", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10021": "無法獲取内儲快照,预期的虚拟機状态是[%s, %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10020": "卷快照[uuids:%s]处於禁用状态,無法还原卷至該快照", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10029": "失敗取消刪除任務。卷[uuid:%s]關聯的虚拟機不在状态%s,离线快照刪除不支持取消。", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10028": "取消刪除任務失敗。卷[uuid:%s]關聯的虚拟機不儲在,离线快照刪除不支持取消。", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10027": "取消刪除任務失敗。卷[uuid:%s]未綁定到任何虚拟機,离线快照刪除不支持取消。", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10026": "取消刪除任務失敗。卷[uuid:%s]不儲在。", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10025": "無法找到快照[%s]的卷UUID", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10024": "不支持在不同卷上刪除快照[uuid: %s, %s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10023": "原始卷对於快照[uuid:%s]已被刪除,無法将卷恢复到該状态", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10022": "卷快照[uuid:%s]當前状态为%s,無法将其恢复到原卷", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10018": "無法找到快照: %s", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10017": "主要儲儲[uuid:%s]不支持卷快照;無法为卷[uuid:%s]創建快照", + "ORG_ZSTACK_YUNSHAN_UTIL_10000": "URL为空,請配置雲山NSP。", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10016": "無法請求主儲儲[uuid:%s]的卷快照功能", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10015": "無法找到主儲儲類型 [%s]", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10012": "不支持的最大快照數量 (%d) 为卷 [uuid:%s] 設置", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10027": "SanSecClientFactory 测試連接失敗", + "ORG_ZSTACK_STORAGE_SNAPSHOT_10019": "此資源類型 %s 不支持查询内儲快照引用", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10007": "panguPartitionUuid [%s] 与 identityZoneUuid [%s] 不匹配", + "ORG_ZSTACK_APPLIANCEVM_10006": "Appliances VM[uuid:%s] 处於無法向 %s 發起 HTTP 調用的状态 %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10006": "panguPartitionUuid 或 identityZoneUuid 必須設置。", + "ORG_ZSTACK_AI_10120": "模型中心[uuid:%s]未找到", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10008": "無法刪除身份區域 [%s],阿里雲 Ebs PrimaryStorage [%s] 仍然儲在,請先将其刪除。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10061": "無法更改安全组規则,因为規则协议是 [%s],目標端口范围不能为空", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10060": "無法更改安全组規则,因为規则协议为 [%s],目標端口范围無法設置", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10063": "無法更改安全组規则,因为規则[%s]与數据库中uuid:%s的規则重复", + "ORG_ZSTACK_APPLIANCEVM_10000": "設置設备啟動信息錯誤誤,因为:%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10062": "無法更改安全组規则,因为規则协议是 [%s],目標端口范围必須設置", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10033": "無法刪除实例配置[uuid:%s],因为它被NFV实例组[%s]使用", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10001": "阿里雲 EBS 當前不支持運行中 VM 的扩容。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10031": "無法在状态不是初始化时分配NfvInstGroup[uuid:%s, name:%s]。", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10000": "無法找到設备路径从卷:%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10032": "無法为不含成員的NfvInstGroup[uuid:%s, name:%s]分配資源。請在分配前先在該组中創建至少一個NFV实例。", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10003": "ISO [%s] 已经被挂载,我们必須先卸载它才能重新挂载", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10006": "無效的CPU[%s],主機[UUID:%s]不儲在编號为%s的CPU", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10030": "無法为未配置VIP的NfvInstGroup[uuid:%s, name:%s]分配資源。請在分配之前为該组配置一個VIP。", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10005": "url 必須以 http:// 或 https:// 開头,但得到的是 %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10004": "阿里雲海洋端點的 URL 必須設置以用於 ebs 主儲儲", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10019": "名称[%s]無效,名称要求:1~128個字符,支持大寫和小寫字母、數字、下划线和破折號;它只能以大寫或小寫字母開头;不允許以空格開头或結尾", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10013": "查询失敗, errorType:%s, error: %s", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10012": "冲突告警規则[%s],已儲在同名規则[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10018": "在叢叢[uuid:%s]中未找到無法使用的baremetal2网關", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10028": "NFV实例[uuid:%s]不属於组[uuid:%s,名称:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10017": "在叢叢[uuid:%s]中未找到裸金属2网關", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10010": "失敗創建新的文件[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10029": "NfvInstGroup [uuid:%s] 未找到", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10026": "無法将最後一個成員的NFV实例[uuid:%s]从组[uuid:%s, name:%s]中分离,該组至少必須有一個成員。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10027": "無法分离最後一個運行中的成員NFV实例[uuid:%s],从组[uuid:%s, name:%s]中分离它,至少必須有一個成員处於運行状态。", + "ORG_ZSTACK_AI_10129": "意外獲取到:null 从 %s 的 token: %s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10024": "NFV实例 [uuid:%s] 未找到", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_SANSEC_10016": "輸入 %s 签名驗證失敗", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10025": "無法从组[uuid:%s, name:%s]中解綁NFV实例[uuid:%s],因为該实例未綁定。當前状态詳情是%s", + "ORG_ZSTACK_STORAGE_PRIMARY_10003": "备份儲儲[uuid:%s]未綁定至區域[uuid:%s],主儲儲[uuid:%s]所属的區域是", + "ORG_ZSTACK_AI_10127": "模式必須不为空", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10011": "在叢叢[uuids:%s]中为裸金属2实例[uuid:%s]分配機箱失敗", + "ORG_ZSTACK_AI_10128": "當前允許的值为 ['%s']", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10010": "在叢叢[uuids:%s]中为裸金属实例[uuid:%s]分配网關失敗", + "ORG_ZSTACK_AI_10125": "無效的模型分類: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10004": "卷[uuid:%s]已被連接到一個%s虚機。虚機应當处於停止状态。", + "ORG_ZSTACK_AI_10126": "儲儲在 ModelServiceVO[uuid: %s] 中的無效 YAML:%s", + "ORG_ZSTACK_AI_10123": "無法找到模型中心[uuid: %s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10015": "分配 IP %s 超出 DHCP 范围 %s ~ %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10014": "分配的 IP 地址 %s 已被其他实例占用", + "ORG_ZSTACK_AI_10121": "没有找到模型中心,請先創建一個模型中心", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10013": "只有baremetal2叢叢[uuid:%s]满足機箱和网關的需求,但它们没有附加的分配网络", + "ORG_ZSTACK_STORAGE_PRIMARY_10000": "無法将ISO附件添加到已禁用的主要儲儲[uuid:%s]中", + "ORG_ZSTACK_AI_10122": "創建系統統標签到ModelServiceInstanceGroupVO[uuid: %s]失敗,因为%s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10012": "在叢叢[uuid:%s]中未找到裸金属2叢叢", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10019": "無效安装路径: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10010": "追加 volumeId: %s,但 URL 中已儲在另一個 volumeId: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10012": "主機UUID [%s] 已儲在於URL: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10014": "無效安装地址: %s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10015": "無法在宿主機上找到 devicePath: %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10008": "没有找到baremetal2叢叢", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10002": "在宿主機[uuid:%s]中为虚拟機[uuid:%s]生成vHost User Client失敗:%s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10007": "缺少信息,無法確定应使用哪個裸金属2叢叢", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10006": "没有为該區域[uuid:%s]附加备份儲儲,該區域包含ISO[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10005": "無法在任何連接的备份儲儲中找到圖像[uuid:%s]。請检查以下内容:\n1. 如果备份儲儲已附加到包含虚拟機[name: %s, uuid:%s]的區域,請確認。\n2. 確認备份儲儲是否处於連接状态,如果不是,請嘗試重新連接。", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10000": "在宿主機[uuid:%s]中刪除vm[uuid:%s]的vHost User Client失敗:%s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10009": "在叢叢[uuids:%s]中为裸金属2实例[uuid:%s]分配主儲儲失敗", + "ORG_ZSTACK_STORAGE_PRIMARY_10014": "主要儲儲[uuid:%s]無法被刪除,因为它仍然与叢叢[uuid:%s]關聯。", + "ORG_ZSTACK_AI_10116": "無法找到任何服務实例组", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10000": "裸金属服務器实例[uuid:%s]要么不儲在,要么未連接,無法更改其密碼", + "ORG_ZSTACK_AI_10117": "無法找到 uuid [%s] 的數据叢", + "ORG_ZSTACK_STORAGE_PRIMARY_10016": "無法挂载主儲儲为维护状态的磁碟[uuid:%s]", + "ORG_ZSTACK_AI_10114": "模型服務实例组[UUID: %s]未找到,中斷等待服務啟動儲活检查", + "ORG_ZSTACK_AI_10115": "Either 'groupUuids' 或 'SyncAll' 必須提供", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10004": "無法在任何連接的备份儲儲中找到圖像[uuid:%s],該备份儲儲已連接至區域[uuid:%s]。請检查以下内容:\n1. 該备份儲儲是否已連接至包含虚拟機[name: %s, uuid:%s]的區域\n2. 如果备份儲儲未处於連接状态,請嘗試重新連接", + "ORG_ZSTACK_AI_10112": "不支持的模型服務類型: %s,無法找到相關的後端处理重啟操作", + "ORG_ZSTACK_AI_10113": "模型服務实例组[uuid: %s]未找到,跳過等待服務啟動流程", + "ORG_ZSTACK_AI_10111": "無法找到模型服務组[uuid: %s]", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10001": "無法獲取接口LLDP信息,該接口未处於接收模式", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10037": "無法找到带有 uuid [%s] 的授權節點", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10003": "獲取[%s]的LLDP引用失敗", + "ORG_ZSTACK_STORAGE_PRIMARY_10018": "zoneUuids, clusterUuids, primaryStorageUuids 至少有一個不能为空列表,或者全部設为 true", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10032": "未经授權的節點在升級到許可服務器之前不应儲在", + "ORG_ZSTACK_STORAGE_PRIMARY_10017": "輸出协议[%s]已在主儲儲[%s]儲在,無需再次添加", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10033": "某些相關的授權節點未被刪除", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10085": "安全组[uuid:%s]尚未綁定至L3网络[uuid:%s],無法解綁", + "ORG_ZSTACK_NETWORK_HOSTNETWORKINTERFACE_LLDP_10000": "無法更改不同主機的接口的LLDP模式", + "ORG_ZSTACK_STORAGE_PRIMARY_10019": "主要儲儲[uuid:%s]尚未被附加到叢叢[uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10087": "無法刪除默認規则[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10011": "無法刪除状态为運行中的NfvInstGroup[uuid:%s, name:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10086": "無法刪除不同安全组的規则", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10089": "第3层网络[uuid:%s]没有啟用网络服務類型[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10088": "安全组[uuid:%s]已綁定至L3网络[uuid:%s], 無法再次綁定", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10010": "無法創建NFV实例,组[uuid:%s, name:%s]已有%d個成員,最大值为3", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10026": "相对时間[%s]無效,它太大了", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10025": "相对时間[%s]無效,它必須采用例如10s、1h的格式", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10008": "無法在组[uuid:%s, name:%s]处於正常模式时創建NFV实例。請先将模式更改为维护模式。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10009": "無法在组[uuid:%s, name:%s]处於%s状态时創建NFV实例", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10006": "nfv 实例 %s [uuid: %s] 位於 nfv 实例组 %s [uuid: %s] 的ha状态从 %s 更改为 %s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10039": "vhost 卷不支持附加到 bareMetal2Instance 上", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10038": "nic 与 mac:%s 無法綁定到 l3Network,因为該 nic 已经被綁定", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10004": "所有節點状态都不是预期状态", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10002": "創建亲和组 для NFV 实例组 [uuid:%s] 失敗", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10033": "當将L3网络附加到Baremetal2实例时,customMac是必填项", + "ORG_ZSTACK_STORAGE_PRIMARY_10024": "主要儲儲[uuid: %s]中包含的卷未啟用或連接", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10032": "L2网络類型 %s 不被裸金属2实例支持", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10031": "仅支持裸金属2实例使用IPv版本%d的L3网络", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10031": "只有license服務器可以注销license客戶端", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10030": "裸金属2实例[uuid:%s]尚未分配機箱,請啟動該实例後再試一次", + "ORG_ZSTACK_STORAGE_PRIMARY_10021": "主要儲儲[uuid:%s]和叢叢[uuid:%s]不在同一區域", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10037": "MAC地址 %s 已经被使用,請嘗試另一個", + "ORG_ZSTACK_STORAGE_PRIMARY_10020": "主要儲儲[uuid:%s]已附加到叢叢[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10036": "裸金属2实例[uuid:%s]運行在機箱[uuid:%s]上,而該機箱没有带有MAC地址%s的非配置网络接口卡", + "ORG_ZSTACK_STORAGE_PRIMARY_10023": "'resourceUuid' 和 'resourceType' 必須同时都設置或都不設置!", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10035": "重复的 MAC 地址 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_10022": "url[%s] 被占用,它在同一叢叢中不能重复", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10034": "%s 不是有效的MAC地址", + "ORG_ZSTACK_AI_10130": "意外獲取值:%s 从 %s,预期值为:%s", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10026": "無效的許可類型 %s", + "ORG_ZSTACK_LICENSE_COMPUTE_SERVER_10027": "注册許可證服務器时不应儲在授權節點", + "ORG_ZSTACK_STORAGE_PRIMARY_10029": "無法在主儲儲[uuid:%s]预留 %s 字節空間,可用容量不足", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10093": "VM nics[uuids:%s] 不在已綁定到安全组[uuid:%s]的L3网络上", + "ORG_ZSTACK_STORAGE_PRIMARY_10028": "在扣除预留容量[%s]後,没有满足要求大小[%s 字節]的主儲儲可用,可能是主儲儲物理容量的閾值設置较低", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10096": "無法添加安全组規则,因为 remoteSecurityGroupUuids 中儲在重复的 UUID: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10095": "無法添加安全组規则,因为規则不能为空或超過最大數量 %d", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10098": "無法添加安全组規则,因为远程安全组UUID冲突", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10022": "無法在正常模式下将NFV实例从[uuid:%s, name:%s]组中分离,請先切换到维护模式。", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10097": "無法添加安全组規则,因为安全组[uuid:%s]不儲在", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10023": "無法从状态为%s的[uuid:%s,名称:%s]组中分离NFV实例", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10020": "無法将NFV实例附加到组[uuid:%s,名称:%s]。组状态为%s,包含%d個成員。仅允許在以下情况下进行附加:组为空,或组为健康/降級且包含1-2個成員", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10099": "無法添加安全组規则,因为規则优先級必須大於 %d 或等於 %d", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10018": "無效的方向[%s],仅允許%s", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10024": "無效類型[%s],仅允許%s類型", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10019": "無法将NFV实例附加到状态为%s的[group.uuid:%s, group.name:%s]中", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10023": "無效的右侧值[%s],它必須是浮點數或双精度數", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10029": "裸金属服務器[uuid:%s]未停止,無法更改其機箱配置選项", + "ORG_ZSTACK_STORAGE_PRIMARY_10030": "在移除主要儲儲%s以避免问題後,叢叢中已没有任何候選的主要儲儲。請检查叢叢中主要儲儲的状态和状态。", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10022": "無效的右值[%s],它必須是大於零且小於一的浮點數或双精度數", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10017": "無法将NFV实例[uuid:%s]附加到组[uuid:%s, name:%s]。該实例已在此组中,並且叢叢状态为:%s。當实例处於Leader、Follower、Leaving或Joining Candidate状态时,不允許进行附加操作。", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10021": "無效參數 %s,不允許有任何參數", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10018": "無法在正常模式下将NFV实例附加到组[uuid:%s, name:%s]中,請先切换到维护模式。", + "ORG_ZSTACK_MONITORING_PROMETHEUS_10020": "無效的右值[%s],它必須是一個數字(整數、長整數、浮點數、双精度浮點數)", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10015": "syncNfvInstGroup 只允許在维护模式下執行。當前模式: %s。請先将模式更改为维护模式。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINSTGROUP_10013": "無法在INITIALIZING状态下更改操作模式。請等待组就绪。當前状态:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_10036": "主儲儲標签分配扩展點[%s]返回零個主儲儲候選選项", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10022": "當前操作不支持本地裸金属实例", + "ORG_ZSTACK_STORAGE_PRIMARY_10035": "主儲儲特征分配流[%s]返回零個主儲儲候選者", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10021": "裸金属实例不允許更改 VM 网络接口", + "ORG_ZSTACK_STORAGE_PRIMARY_10038": "%s 無效。%s 不是有效的 ZStack UUID", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10020": "仅支持 VPC 网络,並在裸金属实例上綁定弹性 IP 地址", + "ORG_ZSTACK_STORAGE_PRIMARY_10037": "主要儲儲[uuid:%s]未处於連接状态,當前状态为%s", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10026": "裸金属2实例[uuid:%s]正在運行但其代理未連接", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10025": "裸金属服務器[uuid:%s]未停止", + "ORG_ZSTACK_STORAGE_PRIMARY_10034": "無法找到具有用戶標签[%s]的主儲儲。該用戶標签在实例配置或磁碟配置中指定", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10024": "裸金属服務器实例[uuid:%s]未連接", + "ORG_ZSTACK_STORAGE_PRIMARY_10033": "無法找到主要儲儲[uuid:%s],該uuid在实例配置或磁碟配置中指定", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10023": "不支持裸金属2实例", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10051": "裸金属2機箱[uuid:%s]不儲在", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10050": "不需要設置機箱 Offering UUID,因为实例已经被分配了機箱 Offering", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10021": "無法設置 VM NIC 安全组,因为安全组[uuid:%s]不属於帳戶[uuid:%s]或管理員", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10020": "無法設置VM网卡安全组,因为儲在重复的安全组[uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10023": "無法設置 VM 网卡安全组,因为优先級無效,期望优先級[%d]和优先級[%d]連續", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10022": "無法設置VM网卡安全组,因为优先級無效,优先級期望从1開始,但实际是[%d]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10025": "無法設置VM网卡安全组,因为管理員安全组优先級[%d]必須高於用戶", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10027": "無法更改安全组規则状态,因为未找到安全组[uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10026": "無法更改安全组規则状态,因为 ruleUuids 为空", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10029": "無法更改安全组規则状态,因为無需更改安全组規则状态", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10028": "無法更改安全组規则状态,因为未找到安全组規则[uuid:%s]", + "ORG_ZSTACK_ZWATCH_10004": "某些消息已過期。過期的消息不允許被修改。系統統将自動清理過期的消息。請稍後操作", + "ORG_ZSTACK_ZWATCH_10003": "無效的操作類型: %s,它只支持寫或刪除", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10054": "裸金属2機框[UUID:%s]已经分配完毕", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10053": "裸金属2機箱[uuid:%s]未啟用", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10052": "裸金属2機箱[uuid:%s]不属於機箱報价[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10059": "請勿同时設置機箱UUID和機箱配置项UUID", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10057": "叢叢[uuid:%s] 已指定,但其不是啟用的裸金属2叢叢,無法从其創建裸金属2实例", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10056": "zone[uuid:%s] 指定了但尚未啟用,無法从其創建裸金属实例", + "ORG_ZSTACK_AI_SERVICE_10001": "未能找到与 modelServiceUuid: %s 和 accountUuid: %s 对应的应用開發服務视圖对象", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10040": "第三方 Ceph 不能与其它主儲儲混用", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10030": "無法更改 VM 网卡安全策略,因为入站策略和出站策略不能同时为空", + "ORG_ZSTACK_ZWATCH_10002": "無效的 zwatch 返回 with 子句: %s, %s", + "ORG_ZSTACK_ZWATCH_10001": "未知參數[%s]在zwatch返回语句中,%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10032": "無法更改 VM 网卡安全策略,因为無效的出站策略[%s]", + "ORG_ZSTACK_AI_SERVICE_10005": "無需测試的任務,請標记失敗", + "ORG_ZSTACK_AI_SERVICE_10004": "無法找到服務实例为空,無法提交评估任務,請報告失敗", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10031": "無法更改 VM 网卡安全策略,因为無效的入站策略[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10034": "無法更改 VM 网卡的安全策略,因为 VM 网卡[uuid:%s]没有任何安全策略", + "ORG_ZSTACK_AI_SERVICE_10003": "無法找到可用提交评估任務的服務组[uuid: %s],報告失敗", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10033": "無法更改 VM 网卡安全策略,因为未找到网卡[uuid:%s]", + "ORG_ZSTACK_AI_SERVICE_10002": "模型服務实例组[uuid: %s]用於测試没有可用的URL", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10036": "無法更新安全组規则优先級,因为安全组[uuid:%s]不儲在", + "ORG_ZSTACK_AI_SERVICE_10008": "所有任務未能啟動", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10035": "無法更新安全组規则优先級,因为無效類型[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10038": "無法更新安全组規则优先級,因为安全组[uuid:%s]的規则數量不符", + "ORG_ZSTACK_AI_SERVICE_10006": "錯誤誤啟動评估於 %s,因为 %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10037": "無法更新安全组規则优先級,因为規则为空", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10039": "無法更新安全组規则优先級,因为規则优先級[%d]無效", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10049": "不需要設置機箱 Offering UUID,因为該实例已经被分配了機箱", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10004": "獲取主儲儲[%s]許可證信息失敗,因为返回的數据中没有有效的許可證", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10044": "裸金属2网關[uuid:%s]不在叢叢[uuid:%s]中", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10043": "裸金属2网關[uuid:%s]不儲在或未啟用或未連接", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10042": "叢叢[uuid:%s]不是一個啟用的baremetal2叢叢,無法在其中啟動实例[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10041": "远程分配实例不支持将预置网卡綁定到bond", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10047": "裸金属2機箱報价[uuid:%s]未啟用", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10046": "裸金属2機箱報价[uuid:%s]不儲在", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10045": "請指定機箱 UUID 或機箱報价 UUID 以啟動裸金属实例[UUID:%s]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10029": "創建快照超时,进度是 %d", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10028": "EBS 主儲儲现在不支持减少容量", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10073": "[image[uuid:%s] 的格式为:%s,仅可使用%s創建裸金属实例]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10072": "圖像[uuid:%s]的mediaType为:%s,仅根磁碟模板可以用於創建baremetal2实例", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10041": "無法更新安全组規则优先級,因为規则[uuid:%s]不在安全组[uuid:%s]中", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10071": "[image[uuid:%s] 不处於就绪状态,無法从中創建裸金属2实例]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10040": "無法更新安全组規则优先級,因为优先級[%d]重复", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10070": "圖像[uuid:%s]未啟用,無法从中創建裸金属2实例", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10043": "無法更新安全组規则优先級,因为儲在重复的規则UUID", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10021": "無效的快照安装路径: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10042": "無法更新安全组規则优先級,因为优先級[%d]不在安全组[uuid:%s]中", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10045": "無法更改安全组規则,因为安全组規则[%s]是默認規则,仅能設置描述和状态", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10044": "無法更改安全组規则,因为安全组規则 UUID[%s] 不儲在", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10022": "阿里雲EBS主儲儲[UUID:%s, 名称:%s]無法在附加的叢叢中找到可用主機以实例化卷", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10047": "無法更改安全组規则,因为安全组 %s 規则數量[%d]超出最大限制[%d]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10025": "無法从镜像:%s 中找到快照,可能該镜像已被刪除", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10046": "無法更改安全组規则,因为安全组規则[%s]的优先級不能設置为默認規则优先級[%d]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10024": "不支持", + "ORG_ZSTACK_COMPUTE_CPUPINNING_10002": "無效的 cpuset [%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10049": "無法更改安全组規则,因为無效状态[%s]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10027": "在以下主機上安装 tdc 失敗: [%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10048": "無法更改安全组規则,因为%s規则的最大优先級为[%d]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10026": "失敗連接以下叢叢: [%s]", + "ORG_ZSTACK_COMPUTE_CPUPINNING_10000": "無效的CPU綁定引用[%s]。正確的示例是[1,3:3-6,^5]", + "ORG_ZSTACK_COMPUTE_VHOSTUSER_10004": "無法为目標主機[uuid:%s]上的虚拟機[uuid:%s]生成vhost用戶客戶端", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10077": "裸金属2叢叢[架构:%s]和镜像[架构:%s]不匹配", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10076": "不同啟動模式:镜像与機箱/配置之間不一致", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10075": "仅支持具有啟動模式 %s 的镜像創建裸金属实例", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10074": "[image[uuid:%s] 不是 baremetal2 镜像,無法从中創建 baremetal2 实例]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10079": "根卷的主要儲儲[%s]和數据卷的主要儲儲[%s]不在同一個叢叢中", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10078": "不是所有磁碟配置项[uuids:%s]都是啟用状态,無法从它们創建裸金属2实例", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10050": "無法更改安全组規则,因为無效操作[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10062": "裸金属2機箱報价[uuid:%s]未啟用,無法从其創建裸金属2实例", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10061": "裸金属2機箱[uuid:%s]不可用,無法从中創建裸金属2实例", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10060": "裸金属2機箱[UUID:%s]未啟用,無法从中創建裸金属2实例", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10051": "無法更改安全组規则,因为無效协议[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10054": "無法更改安全组規则,因为設置了srcIpRange[%s],remoteSecurityGroupUuid[%s]必須为空", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10031": "阿里雲 EBS 主儲儲只支持阿里雲 EBS BS 類型,实际獲取類型: %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10056": "無法更改安全组規则,因为安全组規则[%s]類型为Egress,srcIpRange[%s]無法設置", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_PRIMARY_10034": "資源[uuid: %s]無法找到", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10055": "無法更改安全组規则,因为安全组規则[%s]類型为入站,目的IP范围[%s]無法設置", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10058": "無法更改安全组規则,因为远程安全组[uuid:%s]未找到", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10057": "無法更改安全组規则,因为設置了dstIpRange[%s],remoteSecurityGroupUuid[%s]必須为空", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10059": "無法更改安全组規则,因为远程安全组[uuid:%s]已被設置,srcIpRange和dstIpRange必須为空", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10066": "圖像不能为空,除非機箱处於直接模式", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10065": "裸金属2网關[uuid:%s]与機箱[uuid:%s]不在同一個叢叢中", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10064": "裸金属2网關[uuid:%s]未連接,無法从其創建裸金属2实例", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10063": "裸金属2网關[uuid:%s]未啟用,無法从其創建裸金属2实例", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10069": "機箱磁碟[%s]没有足够的容量容纳镜像[%s]", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10068": "圖像[uuid:%s]不儲在", + "ORG_ZSTACK_BAREMETAL2_INSTANCE_10067": "直接模式不支持選擇圖像", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREBLOCK_10000": "shareblock 說主機 %s 在 %s 离线", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10100": "無法添加安全组規则,因为無效的規则协议[%s],有效协议为 %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10102": "無法添加安全组規则,因为無效的規则 ipVersion[%d],有效的 ipVersions 是 %d/%d", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10101": "無法添加安全组規则,因为無效的操作[%s],有效操作为 %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10104": "無法添加安全组規则,因为允許的CIDR[%s]和目標IP范围[%s]儲在冲突", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10103": "無法添加安全组規则,因为源IP范围[%s]不允許設置为出站規则", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10106": "無法添加安全组規则,因为目的IP范围[%s]不允許設置为入站規则", + "ORG_ZSTACK_COMPUTE_HOST_10041": "失敗在KVM主機[uuid: %s]上检查网络綁定[%s]的VLAN ID[%s]时,%s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10105": "無法添加安全组規则,因为 IP 范围[%s]和 remoteSecurityGroupUuid[%s]儲在冲突", + "ORG_ZSTACK_COMPUTE_HOST_10043": "失敗在KVM宿主機[uuid: %s]上检查网络接口[%s]的VLAN ID[%s]时:%s", + "ORG_ZSTACK_VPC_10048": "dns 地址 [%s] 已添加到 vpc 路由器 [uuid:%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10107": "無法添加安全组規则,因为允許的CIDR[%s]和源IP范围[%s]儲在冲突", + "ORG_ZSTACK_VPC_10047": "VPC L3网络必須先綁定一個VPC路由器,才能執行与路由器相關的操作(如啟動/停止VM、創建负载均衡等)。", + "ORG_ZSTACK_ALIYUN_CORE_10022": "快照任務状态已完成 %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10109": "無法添加安全组規则,因为协议類型 ALL 或 ICMP 不能設置 dstPortRange[%s]", + "ORG_ZSTACK_ALIYUN_CORE_10023": "不支持混合客戶端", + "ORG_ZSTACK_ALIYUN_CORE_10021": "快照任務在 %d 毫秒内無法完成,當前进度是 %d,状态是 %s", + "ORG_ZSTACK_ALIYUN_CORE_10026": "海洋 API 終端點必須不为空", + "ORG_ZSTACK_VPC_10042": "不支持獲取服務 %s 在虚拟路由器 %s 的状态", + "ORG_ZSTACK_COMPUTE_HOST_10048": "失敗更新綁定IP,因为 %s", + "ORG_ZSTACK_VPC_10041": "無法将分布式路由的状态設置为虚拟路由器 %s", + "ORG_ZSTACK_ALIYUN_CORE_10024": "accessKey 和 keySecret 必須設置", + "ORG_ZSTACK_VPC_10040": "無法獲取分布式路由到虚拟路由器 %s 的連接", + "ORG_ZSTACK_COMPUTE_HOST_10044": "失敗为网络綁定[%s]在KVM宿主機[uuid: %s]上設置服務類型[%s]时,%s", + "ORG_ZSTACK_VPC_10045": "不支持将服務 %s 的状态更新到虚拟路由器 %s", + "ORG_ZSTACK_COMPUTE_HOST_10047": "失敗更新接口IP,因为 %s", + "ORG_ZSTACK_COMPUTE_HOST_10046": "失敗为网络接口[%s]在KVM宿主機[uuid: %s]上設置服務類型[%s]时,%s", + "ORG_ZSTACK_VPC_10043": "無法獲取分布路由至虚拟路由器 %s 的状态", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10111": "無法添加安全组規则,因为無效的結束端口[%d],結束端口必須大於或等於開始端口[%d]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10110": "無法添加安全组規则,因为协议類型 ALL 或 ICMP 不能設置 startPort 或 endPort", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10113": "無法添加安全组規则,因为协议類型TCP/UDP必須設置dstPortRange", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10112": "無法添加安全组規则,因为目標端口范围[%s]与起始端口[%s]儲在冲突", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10115": "無法添加安全组規则,因为規则[%s]与數据库中uuid:%s的規则重复", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10114": "無法添加安全组規则,因为規则[%s]和規则[%s]是重复的", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10117": "無法添加安全组規则,因为安全组 %s 規则已達到最大限制[%d]", + "ORG_ZSTACK_COMPUTE_HOST_10052": "獲取主機[uuid:%s]的接口vlanIds失敗: %s", + "ORG_ZSTACK_VPC_10039": "無法将 IPv6 地址段添加到三层网络[uuid:%s],因为其与虚拟路由器[vRouter uuid:%s]的 CIDR [%s]重叠", + "ORG_ZSTACK_ALIYUN_IMAGE_10002": "該操作仅支持自定义镜像", + "ORG_ZSTACK_CORE_CONFIG_10002": "無法找到 GlobalConfig[類别: %s, 名称: %s]", + "ORG_ZSTACK_VPC_10038": "無法将 IP 地址范围添加到 L3 网络[uuid:%s],因为其与虚拟路由器 vRouter [uuid:%s] 中的 CIDR [%s] 重叠", + "ORG_ZSTACK_ALIYUN_IMAGE_10003": "只有系統統碟可以創建镜像", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10119": "無法添加安全组規则,因为安全组 %s 規则數量[%d]超出最大限制[%d]", + "ORG_ZSTACK_NETWORK_PLUGIN_10001": "释放不必要的arp錯誤誤,因为:%s", + "ORG_ZSTACK_VPC_10037": "dns 地址 [%s] 没有添加到 vpc 路由器 [uuid:%s]", + "ORG_ZSTACK_VPC_10036": "dns[%s] 不是IP地址", + "ORG_ZSTACK_CORE_CONFIG_10004": "不允許跳過驗證", + "ORG_ZSTACK_NETWORK_PLUGIN_10000": "应用 Gratuitous ARP 錯誤誤,因为:%s", + "ORG_ZSTACK_ALIYUN_IMAGE_10001": "指示的镜像 [%s] 正在导入到數据中心 [%s] 中...", + "ORG_ZSTACK_ALIYUN_CORE_10011": "無法輸入長度为0的文件作为VM镜像!", + "ORG_ZSTACK_ALIYUN_IMAGE_10006": "仅支持ImageStore备份儲儲", + "ORG_ZSTACK_ALIYUN_IMAGE_10007": "圖像名称不能以 http:// 或 https:// 開头", + "ORG_ZSTACK_ALIYUN_IMAGE_10004": "没有連接到數据中心的OSS桶:%s", + "ORG_ZSTACK_ALIYUN_IMAGE_10005": "無法刪除ecs系統統镜像远程", + "ORG_ZSTACK_VPC_10031": "L2网络[uuid: %s] of L3网络[uuid: %s] 未綁定至叢叢[uuid: %s]", + "ORG_ZSTACK_VPC_10030": "没有与L3网络[uuid:%s]關聯的IP地址范围", + "ORG_ZSTACK_ALIYUN_CORE_10016": "不是一個有效的消息!", + "ORG_ZSTACK_ALIYUN_CORE_10013": "權限拒绝:%s", + "ORG_ZSTACK_VPC_10035": "l3网络 [uuid:%s] 必須首先綁定,因为該l3网络上有vip地址", + "ORG_ZSTACK_COMPUTE_HOST_10055": "叢叢[uuids:%s, 虚拟化類型:%s]不儲在!", + "ORG_ZSTACK_VPC_10034": "指定在消息中的静态IP[%s]与L3网络[uuid:%s]的网關IP[%s]不相等", + "ORG_ZSTACK_ALIYUN_CORE_10017": "%s 失敗, 錯誤誤代碼: %s, 錯誤誤信息: %s", + "ORG_ZSTACK_COMPUTE_HOST_10058": "主機[uuid:%s]無法找到", + "ORG_ZSTACK_VPC_10033": "三层网络[uuid:%s]的网關[ip:%s]已被占用", + "ORG_ZSTACK_ALIYUN_CORE_10018": "設备在 %d 毫秒内未准备好", + "ORG_ZSTACK_VPC_10032": "公网[uuid: %s] VIP[uuid: %s, ip: %s] 与三层网络[l3network uuid: %s] 不在同VPC VR[uuid: %s] 中", + "ORG_ZSTACK_COMPUTE_HOST_10019": "只支持在 vm 状态为[%s]时執行实时快照,但 vm 當前处於[%s]状态", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10120": "無法添加安全组規则,因为优先級[%d]必須連續,入站規则的最大优先級为[%d]", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10000": "獲取主儲儲[%s]的許可證信息失敗,因为没有可用的MonIP", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10001": "獲取主儲儲[%s]的許可信息失敗,因为没有返回數据", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10122": "失敗将安全组規则应用到當前VM[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10002": "獲取主儲儲[%s]的許可證信息失敗,因为過期时間为空", + "ORG_ZSTACK_ALIYUN_IMAGE_10008": "未找到镜像Uuid: %s 的备份儲儲", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10121": "無法添加安全组規则,因为优先級[%d]必須連續,出站規则的最大优先級为[%d]", + "ORG_ZSTACK_STORAGE_PRIMARY_LICENSE_10003": "解析主儲儲[%s]許可證信息中的日期格式[%s]失敗", + "ORG_ZSTACK_ALIYUN_IMAGE_10009": "超出为 imageUuid: %s 所分配的备份儲儲空間,請手動指定", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10124": "网络服務[type:%s]在l3Network[uuid:%s]上未啟用", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10123": "Failed to apply security group rules to some VMs", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10125": "失敗修改規则[uuid:%s]的优先級,因为它未被找到", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10128": "网络服務[type:%s]在nic[uuid:%s]的l3Network[uuid:%s]中未啟用", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10127": "vm nic[uuid:%s] 已经被附加到安全组[uuid:%s]", + "ORG_ZSTACK_ALIYUN_IMAGE_10011": "圖像 [%s] �现未啟用", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10129": "安全组[uuid:%s]不属於帳戶[uuid:%s]或管理員", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10004": "虚拟ID[uuid:%s]不在组织[uuid:%s]中", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10005": "组织[uuid:%s]已经有一個管理員", + "ORG_ZSTACK_ALIYUN_CORE_10001": "添加端點到SDK失敗,原因:%s", + "ORG_ZSTACK_ALIYUN_CORE_10005": "accessKey 和 keySecret 必須設置!", + "ORG_ZSTACK_IAM2_ATTRIBUTE_ORGANIZATION_10003": "虚拟ID[uuid:%s]不儲在", + "ORG_ZSTACK_COMPUTE_HOST_10028": "nic[%s] 已刪除", + "ORG_ZSTACK_COMPUTE_HOST_10023": "操作錯誤誤,因为 %s", + "ORG_ZSTACK_ALIYUN_CORE_10009": "無法从消息中找到密钥/憑證", + "ORG_ZSTACK_ALIYUN_IMAGE_10010": "有效的平台:[%s] 用於阿里雲镜像导入,有效值为:[%s]", + "ORG_ZSTACK_ALIYUN_CORE_10006": "區域ID必須設置!", + "ORG_ZSTACK_COMPUTE_HOST_10038": "刪除虚拟機文件失敗: %s", + "ORG_ZSTACK_COMPUTE_HOST_10037": "設置虚拟機配置文件失敗: %s", + "ORG_ZSTACK_COMPUTE_HOST_10039": "应用内儲气球失敗: %s", + "ORG_ZSTACK_COMPUTE_HOST_10036": "設置 VM 主機名失敗: %s", + "ORG_ZSTACK_COMPUTE_HOST_10035": "同步虚拟機端口配置失敗: %s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10009": "無效標签,'op' 字段为空或不是正则表達式和等於中的另一种情况。%s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10008": "無效標签,'key'字段不能为null。%s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10007": "the ValueCondition 字符串[%s]需要将'value'設为键", + "ORG_ZSTACK_ZWATCH_DATATYPE_10006": "標签字符串[%s]不包含有效的運算符", + "ORG_ZSTACK_COMPUTE_VM_10319": "VmInstanceDestroyVmExtensionPoint[%s] 拒绝销毁 vm[uuid:%s] 因为 %s", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10006": "卷的類型 [%s] 無效。", + "ORG_ZSTACK_COMPUTE_VM_10318": "VmInstanceRebootExtensionPoint[%s] 拒绝重啟 vm[uuid:%s],因为 %s", + "ORG_ZSTACK_COMPUTE_VM_10317": "VmInstanceStartNewCreatedVmExtensionPoint[%s] 拒绝創建 vm[uuid:%s] 因为 %s", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10004": "失敗在ceph ps[uuid:%s]中獲取卷%s的快照ID。", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10002": "失敗於检查卷 %s 在 ceph ps[uuid:%s] 中的安装路径。", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_CEPH_10001": "無法从ps:%s中找到指定的池[PoolName:%s]", + "ORG_ZSTACK_VPC_10006": "VIP[uuid:%s] 未找到", + "ORG_ZSTACK_VPC_10005": "因为虚拟機 [uuid:%s] 的镜像類型不是 %s,所以無法綁定 IPv6 公网 IP", + "ORG_ZSTACK_VPC_10003": "無法通過 SSH 連接到 VPC 路由器[%s],SSH 端口似乎未打開", + "ORG_ZSTACK_VPC_10009": "VmNic[uuid:%s] 未找到", + "ORG_ZSTACK_VPC_10008": "EIP[uuid:%s] 未找到", + "ORG_ZSTACK_COMPUTE_VM_10316": "無法找到虚拟機的宿主機,請先啟動虚拟機[%s],然後挂载磁碟", + "ORG_ZSTACK_COMPUTE_HOST_10005": "在主機[uuid:%s]上設置同步时钟任務失敗", + "ORG_ZSTACK_ZWATCH_DATATYPE_10001": "無效表達式: %s, 未找到函數", + "ORG_ZSTACK_COMPUTE_HOST_10004": "主機[uuid:%s, 名称:%s]处於状态[%s], 無法執行所需操作", + "ORG_ZSTACK_COMPUTE_VM_10315": "网關錯誤誤,预期:%s,实际獲得:%s", + "ORG_ZSTACK_ZWATCH_DATATYPE_10000": "無效函數: %s, %s", + "ORG_ZSTACK_COMPUTE_VM_10314": "ipv6 前缀長度錯誤誤,预期:%s,实际:%s", + "ORG_ZSTACK_COMPUTE_VM_10313": "IPv6 前缀長度必須設置", + "ORG_ZSTACK_VPC_10002": "三层网络[l3:uuid:%s]的网關[ip:%s]在vpc vr[uuid:%s]中已被占用", + "ORG_ZSTACK_COMPUTE_VM_10311": "网掩碼錯誤誤,期望:%s,实际:%s", + "ORG_ZSTACK_COMPUTE_HOST_10000": "同步 GPU 信息失敗: %s", + "ORG_ZSTACK_VPC_10001": "在 L3 网络[uuid:%s] 中不儲在 IP 地址范围", + "ORG_ZSTACK_COMPUTE_VM_10310": "子网掩碼必須設置", + "ORG_ZSTACK_VPC_10000": "無法从VPC VR[uuid:%s]Detach网卡", + "ORG_ZSTACK_COMPUTE_HOST_10009": "分配 PCI 設备失敗[uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10051": "無效的 URI,正確的示例是 ceph://$POOLNAME/$VOLUMEUUID 或 volume://$VOLUMEUUID", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10050": "Ceph ps[uuid=%s] 根池名称未找到", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10052": "刪除卷鏈錯誤誤,继續刪除", + "ORG_ZSTACK_COMPUTE_VM_10320": "VmInstanceStartExtensionPoint[%s] 拒绝啟動 vm[uuid:%s],因为 %s", + "ORG_ZSTACK_COMPUTE_HOST_10013": "网络接口[name:%s]主機[uuid:%s]未找到", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10008": "加密 %s[id:%s] 錯誤誤: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_SMP_10000": "共享挂载點主儲儲[uuid:%s, 名称:%s]無法在附加的叢叢中找到任何可用主機", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10005": "不支持的操作对於EncryptColumnIntegrityFactory", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10002": "%s[%s] 完整性校驗錯誤誤,因为: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_INTEGRITY_10000": "%s[%s] 加密錯誤誤,因为:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10017": "無法找到任何連接的主機来執行此操作,似乎与共享挂载點儲儲[uuid:%s]關聯的所有KVM主機均已斷開連接。", + "ORG_ZSTACK_VPC_10027": "無法将L3网络附加到VPC路由器[UUID:%s],因为其状态不是運行中或已停止", + "ORG_ZSTACK_VPC_10025": "VPC网络[uuid:%s]已綁定至VPC路由器[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10013": "URL包含無效文件夹[/dev 或 /proc 或 /sys]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10042": "獲取根卷[%s]的rbd圖像观察者失敗,%s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10041": "ceph 儲儲池冲突,由磁碟配置指定的 ceph 儲儲池为 %s,而創建參數中指定的 ceph 儲儲池为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10010": "卷[uuid:%s]儲在引用卷[%s],在合並它们及其後代之前無法更改卷類型", + "ORG_ZSTACK_VPC_10029": "無法将L3网络附加到VPC路由器[UUID:%s],因为其状态和对端状态均未運行或停止", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10044": "無法找到 Ceph 主儲儲池[poolName=%s]", + "ORG_ZSTACK_VPC_10020": "L3网络[uuid:%s]無法从VPC交换機[uuid:%s]解綁,因为關聯的服務仍使用了VIP[%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10043": "根卷[%s]已被使用(ceph rbd镜像[%s]已有监视者),为了防止脑裂分,啟動VM被禁止。", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10046": "無法为 primaryStorage[%s]分配池,用途:%s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10045": "ceph主儲儲池[poolName=%s]可用的虚拟容量不足以满足大小%s", + "ORG_ZSTACK_VPC_10024": "只有VPC L3网络可以綁定到VPC虚拟路由器", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10047": "無法更新 Ceph 主儲儲 MON[uuid:%s] 的状态,因为它已被刪除。此錯誤誤可以忽略。", + "ORG_ZSTACK_VPC_10023": "虚拟路由器報价[uuid: %s]的镜像不儲在", + "ORG_ZSTACK_VPC_10022": "虚拟路由器報价[uuid: %s]未啟用", + "ORG_ZSTACK_VPC_10021": "VPC L3网络[UUID:%s]無法从VPC路由器[UUID:%s]解綁,因为仍有VM网卡[%s]在使用中", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10006": "不支持的操作", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10005": "缺少參數,vmInstanceUuid: %s 被請求", + "ORG_ZSTACK_VPC_10017": "公共网络無法解綁", + "ORG_ZSTACK_VPC_10016": "默認路由网络無法脱离", + "ORG_ZSTACK_VPC_10015": "管理网络無法解綁", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10003": "無法找到具有連接主機-SMP連接以執行命令的儲儲[uuid:%s]主儲儲的宿主機", + "ORG_ZSTACK_VPC_10014": "虚拟路由器 [uuid:%s] 不处於状态 [%s] 或状态 [%s] 中", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10002": "無法找到連接的主機来執行命令 for smp 主機儲儲[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10001": "SMP 主儲儲[uuid:%s]未連接到任何计算叢叢,並且無法清除虚拟機[uuid:%s]的根卷[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10007": "無法找到具有 UUID:%s 的 VM", + "ORG_ZSTACK_VPC_10019": "無法将三层网络从uuid:%s的VPC路由器解綁,因为主从状态不一致", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10008": "無法找到具有 UUID:%s 的虚拟機設备", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10030": "無法找到备份儲儲以将圖像 [%s] 下载到主儲儲 [%s],原因是没有可用的 Ready 和可访问的圖像", + "ORG_ZSTACK_VPC_10018": "無法将三层网络从VPC路由器[uuid:%s]解綁,因为其状态不是運行中或已停止", + "ORG_ZSTACK_ALIYUN_CORE_10037": "镜像已在远程儲在,請先使用同步。", + "ORG_ZSTACK_ALIYUN_CORE_10035": "入口在 %s 毫秒後仍然儲在", + "ORG_ZSTACK_ALIYUN_CORE_10036": "無法找到EcsInstance[%s],請检查阿里雲控制台以確認其是否儲在", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10037": "無法找到任何与主儲儲[uuid:%s]連接的ceph监视器節點", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10001": "缺少參數,resourceUuid: %s, vmInstanceUuid: %s 被請求", + "ORG_ZSTACK_COMPUTE_VM_DEVICES_10002": "缺少參數,resourceUuid 是必需的", + "ORG_ZSTACK_VPC_10012": "虚拟路由器 [uuid:%s] 不是VPC路由器", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10039": "ceph 命名空間冲突,由实例配置指定的 ceph 命名空間是 %s,而創建參數中指定的是 %s", + "ORG_ZSTACK_VPC_10011": "無法更新网卡[uuid: %s]状态,由於管理网卡不支持", + "ORG_ZSTACK_ALIYUN_CORE_10039": "區域 ID[%s]不符合阿里雲的要求!", + "ORG_ZSTACK_VPC_10010": "無法刪除虚拟機网卡 [uuid:%s],因为該虚拟機 [uuid:%s] 的類型是設备虚拟機,請使用 API APIDetachL3NetworkFromVm", + "ORG_ZSTACK_SNMP_AGENT_10006": "失敗於關閉SNMP代理会话[%s](端口%s),原因:%s", + "ORG_ZSTACK_SNMP_AGENT_10005": "失敗将SNMP代理端口从%s更改到%s,原因是%s", + "ORG_ZSTACK_SNMP_AGENT_10004": "snmp[uuid:%s] 尚未創建", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10009": "ecs 实例 [%s] 的状态必須为運行中或已停止", + "ORG_ZSTACK_STORAGE_ZBS_10003": "無效的 mdsUrl[%s]。SSH用戶名和密碼必須用':'分隔且不能为空。有效的 monUrl格式为 %s", + "ORG_ZSTACK_STORAGE_ZBS_10004": "無效的 mdsUrl[%s],主機名不能为 null。有效的 mdsUrl 格式为 %s", + "ORG_ZSTACK_STORAGE_ZBS_10002": "無效的 mdsUrl[%s],sshUsername:sshPassword 部分無效。有效的 mdsUrl 格式为 %s", + "ORG_ZSTACK_APPCENTER_10006": "%s 需要 String 類型的值,但得到錯誤誤類型", + "ORG_ZSTACK_APPCENTER_10005": "%s 需要布尔值,但得到錯誤誤類型", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10004": "磁碟 [%s] 没有挂载在任何实例上", + "ORG_ZSTACK_APPCENTER_10004": "%s 需要數值類型值,但得到錯誤誤類型", + "ORG_ZSTACK_STORAGE_ZBS_10005": "無效的 mdsUrl[%s],SSH端口大於65535或小於1。有效的 mdsUrl 格式为 %s", + "ORG_ZSTACK_APPCENTER_10003": "%s 在预參數中,但未被設置", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10006": "只有數据碟可以挂载在ECS上", + "ORG_ZSTACK_APPCENTER_10002": "filterName 必須为 appcenter:true 或 appcenter:false", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10007": "磁碟不能附加到任何ECS实例上", + "ORG_ZSTACK_SNMP_AGENT_10003": "無法在端口 %s 啟動 snmp 代理[%s],原因:%s", + "ORG_ZSTACK_APPCENTER_10001": "PublishAppVO[uuid: %s] 不儲在", + "ORG_ZSTACK_SNMP_AGENT_10002": "失敗啟動SNMP代理[%s], %s", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10001": "根磁碟無法被刪除", + "ORG_ZSTACK_SNMP_AGENT_10001": "儲在多個 SnmpAgentVO 实体。", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10002": "無法将磁碟的 deleteWithInstance 属性設置为 false,當磁碟的 category 属性为臨时類型时", + "ORG_ZSTACK_SNMP_AGENT_10000": "無法獲取 SnmpAgentImpl 实例,因为不儲在 SnmpAgentVO。", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10003": "無法将磁碟的 deleteWithInstance 属性設置为 false,當磁碟的 category 属性为雲且 portable 属性为 false 时", + "ORG_ZSTACK_CORE_WEBHOOK_10000": "無效的 URL[%s]", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10010": "磁碟和ecs实例必須位於同一可用區", + "ORG_ZSTACK_TEST_AOP_10001": "单元测試要求其失敗", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10015": "請求參數中的大小和快照ID必須選擇其中一個项以指定磁碟的大小或使用快照創建磁碟。", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10016": "不允許在根卷快照上創建磁碟", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10017": "磁碟名称或描述不能以 'http://' 或 'https://' 開头", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10011": "磁碟 [%s] 已经挂载在实例 [%s] 上", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10012": "只有數据碟可以挂载到ECS实例上", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10013": "無法在使用中挂接磁碟", + "ORG_ZSTACK_ALIYUN_STORAGE_DISK_10014": "非独立磁碟只能与实例一同销毁", + "ORG_ZSTACK_STORAGE_ZBS_10021": "無效的逻辑儲儲池名称[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10022": "無效的資源池名称[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10020": "無效的 URI 格式: %s", + "ORG_ZSTACK_STORAGE_ZBS_10025": "不允許添加重复的 MDS[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10026": "無法找到逻辑池[%s]对应的物理池", + "ORG_ZSTACK_STORAGE_ZBS_10023": "確保至少配置一個資源池", + "ORG_ZSTACK_STORAGE_ZBS_10024": "確保至少配置一個MDS", + "ORG_ZSTACK_STORAGE_ZBS_10027": "未找到 zbs 主儲儲[uuid:%s]節點的 MDS[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10028": "所有 ZBS 主儲儲[uuid:%s] 的 MDS 都不在連接状态", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10001": "無法刪除预定义预制配置模板", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10002": "無法更改预定义预配置模板的状态", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10000": "無法更新预定义预制配置模板", + "ORG_ZSTACK_MTTYDEVICE_10001": "从 mtty 設备[uuid:%s]生成的 mdev 設备仍然附加在 VM 上", + "ORG_ZSTACK_MTTYDEVICE_10000": "mtty 設备[uuid:%s]未被虚拟化为mdevs", + "ORG_ZSTACK_BAREMETAL_PRECONFIGURATION_10004": "無法找到预配置模板VO[uuid:%s],它可能已被刪除", + "ORG_ZSTACK_MTTYDEVICE_10004": "主機[uuid:%s]中包含的mtty設备[uuid:%s]未連接", + "ORG_ZSTACK_MTTYDEVICE_10003": "mtty 設备[uuid:%s]無法虚拟化为mdevs", + "ORG_ZSTACK_HYGON_KVM_10004": "从主機[uuid:%s]獲取海光CCP設备信息失敗:%s", + "ORG_ZSTACK_STORAGE_ZBS_10014": "ZBS 主儲儲[uuid:%s]可能已被刪除", + "ORG_ZSTACK_STORAGE_ZBS_10015": "無法找到 KVM 主機[uuid:%s],無法部署客戶端", + "ORG_ZSTACK_STORAGE_ZBS_10012": "無法連接到ZBS主儲儲[uuid:%s],未能連接所有MDS", + "ORG_ZSTACK_STORAGE_ZBS_10016": "附加信息为空,主要儲儲[uuid:%s]未就绪,跳過ping任務", + "ORG_ZSTACK_ZWATCH_DATATYPE_10010": "無效標签,'value'字段不能为null。%s", + "ORG_ZSTACK_STORAGE_ZBS_10017": "没有可用的足够空間的逻辑池和所需的 URL: %s", + "ORG_ZSTACK_HYGON_KVM_10003": "失敗了生成海光 IPI 設备,因为:%s", + "ORG_ZSTACK_HYGON_KVM_10002": "無法反生成 mdev 設备,主機[uuid:%s]上有 %d 個 mdev 設备被 VM 使用。請先停止或迁移使用这些設备的所有 VM。", + "ORG_ZSTACK_HYGON_KVM_10001": "無法在主機[uuid:%s]上找到ccp設备(s)对应於pciBdf %s,請先同步hygon設备", + "ORG_ZSTACK_HYGON_KVM_10000": "生成海光 mdev 設备失敗,因为:%s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10021": "無法查询 InfluxDB,%s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10023": "失敗修改 influxdb 保留策略 '%s', %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10000": "vm[uuid: %s]的儲儲迁移缺少足够的容量,所需容量(包括镜像缓儲):%s,當前可用物理容量:%s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10024": "失敗創建 influxdb 保留策略 '%s', %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10001": "不支持虚拟機状态[%s]进行儲儲迁移", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10025": "無效的 InfluxDB 响应:%s, 列中未找到名称", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10026": "創建 InfluxDB 默認用戶 '%s' 失敗,%s", + "ORG_ZSTACK_STORAGE_MIGRATION_10004": "不支持取消 %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10005": "VM[uuid: %s] 未找到", + "ORG_ZSTACK_STORAGE_MIGRATION_10003": "不支持的儲儲迁移類型:从 %s 到 %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10008": "vm 块迁移失敗: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_10009": "目標主儲儲不支持當前主機的迁移操作", + "ORG_ZSTACK_STORAGE_MIGRATION_10006": "不支持虚拟機状态[%s]取消儲儲迁移", + "ORG_ZSTACK_STORAGE_MIGRATION_10007": "失敗獲取主機候選项以进行VM迁移", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10005": "無效的virtio驱動設备格式: %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10004": "从虚機[uuid:%s]detach virt-io ISO失敗:不支持", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10003": "失敗从虚拟機[uuid:%s]detach virtio %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10002": "失敗在 mn[uuid:%s] 挂载 virtio 驱動因为读取文件[%s]的 md5 失敗: %s", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10001": "失敗在 mn[uuid:%s] 中附加 virtio 驱動,因为文件[%s]的 MD5 校驗和無效", + "ORG_ZSTACK_COMPUTE_VM_VIRTIO_10000": "失敗在 mn[uuid:%s] 挂载 virtio 驱動因为读取文件[%s]的 md5 失敗:類路径上未找到文件", + "ORG_ZSTACK_DIRECTORY_10010": "目录 %s 的類型不被支持,支持的目录類型为 %s", + "ORG_ZSTACK_SCHEDULER_VM_10001": "vm[uuid:%s] 已销毁,状态变更不允許", + "ORG_ZSTACK_STORAGE_ZBS_10040": "獲取 MDS[%s] 元數据失敗,您需要检查 ZBS 配置", + "ORG_ZSTACK_STORAGE_ZBS_10032": "所有元數据服務節點無法執行HTTP調用[%s]", + "ORG_ZSTACK_STORAGE_ZBS_10036": "ZBS 主儲儲 MDS[%s] 版本[%s] 与管理節點[%s] 不一致,請重新連接 MDS 並检查 SSH 連接", + "ORG_ZSTACK_STORAGE_ZBS_10037": "mdsUrls 不能为 null 或空", + "ORG_ZSTACK_STORAGE_ZBS_10034": "無法从ZBS主儲儲MDS[%s]同步元數据,因为%s", + "ORG_ZSTACK_STORAGE_ZBS_10038": "無法从所有MDS發现逻辑池,詳情:%s", + "ORG_ZSTACK_STORAGE_ZBS_10039": "無法通過SSH連接或MDS[%s]未安装zbs-tools,您需要检查SSH配置和依赖项", + "ORG_ZSTACK_DIRECTORY_10006": "检测到循环依赖,目录 %s 和目录 %s 将导致循环依赖", + "ORG_ZSTACK_DIRECTORY_10003": "名称包含不支持的字符,名称只能包含中文、英文字母、數字、空格以及以下字符:()[]@._-+", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10000": "無法找到 EventFamily[name:%s]", + "ORG_ZSTACK_DIRECTORY_10004": "所有資源區域ID必須与目录區域ID[%s]一致", + "ORG_ZSTACK_DIRECTORY_10001": "資源類型 %s 不被目录支持,允許的類型是 %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10002": "無法找到 EventFamily[name:%s, namespace:%s]", + "ORG_ZSTACK_DIRECTORY_10000": "資源 %s 已经綁定到目录 UUID[%s] ,不支持多個路径", + "ORG_ZSTACK_NAS_10002": "重复的 NasFileSystemFactory[%s, %s] 類型为[%s]", + "ORG_ZSTACK_NAS_10000": "NAS文件系統統 [%s] 尚未儲在", + "ORG_ZSTACK_NAS_10001": "無法找到類型为: %s 的NAS工厂", + "ORG_ZSTACK_DIRECTORY_10009": "失敗創建目录,目录层級最多四层", + "ORG_ZSTACK_DIRECTORY_10008": "重复目录名称,目录[uuid: %s]与名称为%s的目录已儲在", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10011": "無效查询標签[%s]。允許的標签名称为 %s", + "ORG_ZSTACK_ZWATCH_INFLUXDB_10012": "儲在多個名为[%s]的EventFamily,您必須指定標签[%s]", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10006": "位於的數据卷[%s]所在的虚拟機有内儲快照,無法分离", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10005": "無法将磁碟卷 %s 挂载到 vmInstance %s 与内儲快照组", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10004": "位於的數据卷 [%s] 所在的虚拟機有内儲快照,無法刪除", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10003": "該卷 %s 不儲在", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10001": "具有 L3 网络[uuid: %s]的 nic 被 VolumeSnapshotGroup[uuid: %s]引用,在刪除該 L3 网络之前,請先刪除这個 VolumeSnapshotGroup。", + "ORG_ZSTACK_STORAGE_MEMORYSNAPSHOT_10000": "defaultL3网络Uuid不儲在", + "ORG_ZSTACK_AI_10086": "ModelServiceGroup 仍被 %s 引用,無法刪除", + "ORG_ZSTACK_AI_10087": "taskUuid 不能为空", + "ORG_ZSTACK_AI_10084": "系統統模型[uuid: %s]無法被刪除", + "ORG_ZSTACK_AI_10082": "刪除模型失敗,模型[uuid: %s]仍然被%s使用", + "ORG_ZSTACK_AI_10083": "模型[uuid: %s]未找到", + "ORG_ZSTACK_AI_10080": "自定义URL在部署ModelEval服務類型时需要模型字段", + "ORG_ZSTACK_AI_10081": "L3NetworkUuids %s 没有DHCP服務,必須添加静态IP系統統標签以分配静态IP地址", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10007": "不支持在包含儲儲快照时对多個计算節點上的卷进行快照操作", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10008": "無法找到安装地址[%s]的儲儲空間", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10005": "未注册与身份:%s 相關的主儲儲插件", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10006": "不支持在類型[%s]主要儲儲上使用协议[%s]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10009": "無法找到块卷,仅限访问块卷路径", + "ORG_ZSTACK_CONFIGURATION_10009": "预留内儲大小[%s 字節]大於内儲大小[%s 字節]", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10010": "未指定备份儲儲類型,支持主儲儲[uuid:%s]", + "ORG_ZSTACK_CONFIGURATION_10008": "内儲大小[%s 字節]小於16MB,如此小的内儲大小很可能無法啟動任何现代操作系統統", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10011": "無法重新初始化根卷 [%s],因为镜像 [%s] 已被刪除,並且無法找到圖像缓儲", + "ORG_ZSTACK_MULTICAST_ROUTER_10005": "多播路由器 [uuid:%s] 没有附加到VPC路由器", + "ORG_ZSTACK_CONFIGURATION_10007": "cpu 數[%s] 小於 1", + "ORG_ZSTACK_MULTICAST_ROUTER_10006": "会合點 [%s] 不是单播地址", + "ORG_ZSTACK_CONFIGURATION_10006": "不支持的实例配置類型[%s]", + "ORG_ZSTACK_MULTICAST_ROUTER_10007": "组地址 [%s] 不是多播地址", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10014": "儲儲不健康:%s", + "ORG_ZSTACK_MULTICAST_ROUTER_10000": "多播路由器[uuid:%s]尚未綁定到VPC路由器", + "ORG_ZSTACK_MULTICAST_ROUTER_10001": "多播已在VPC路由器uuid[:%s]上啟用", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10012": "無法从内部快照路径[%s]找到所属卷路径,因为正则表達式[%s]与快照路径不匹配", + "ORG_ZSTACK_MULTICAST_ROUTER_10002": "多播路由器 [uuid:%s] 的 VPC 路由已刪除", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10013": "ping 外部主儲儲[%s]失敗, %s", + "ORG_ZSTACK_CONFIGURATION_10001": "已经为实例 Offering [uuid: %s] 有一個用戶數据系統統標签。", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10004": "發生錯誤誤,原因: 認證响应为空", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10003": "無法找到類型(%s)的OAuth2Login", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10005": "發生錯誤誤,原因: %s 为空", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10000": "重复的 OAuth2 登录[%s, %s] 用於類型[%s]", + "ORG_ZSTACK_CONFIGURATION_10004": "不应該有一個实例 Offering 拥有超過一個系統統 標签。", + "ORG_ZSTACK_CONFIGURATION_10003": "已经为磁碟 Offering [uuid: %s] 設置了一個用戶數据系統統標签。", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10002": "無法找到類型(%s)的OAuth2Provider", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10001": "重复的 OAuth2Provider[%s, %s] 为 name[%s]", + "ORG_ZSTACK_AI_10075": "dockerImage 对 Container 模型服務是必需的", + "ORG_ZSTACK_AI_10076": "模型中心[uuid:%s]未找到对应於模型服務[uuid:%s]的记录", + "ORG_ZSTACK_AI_10071": "vmImageUuid 是 VirtualMachine 模型服務所需的參數", + "ORG_ZSTACK_AI_10072": "vmImageUuid 不合法", + "ORG_ZSTACK_AI_10070": "模型服務類型[%s]不应該有依赖的模型服務组UUID", + "ORG_ZSTACK_MULTICAST_ROUTER_10008": "RP 地址对 [%s: %s] 已经儲在於多播路由器 [uuid:%s] 中", + "ORG_ZSTACK_MULTICAST_ROUTER_10009": "RP 地址元组 [%s : %s] 不儲在於多播路由器 [uuid:%s] 中", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10015": "上传用戶[%s]失敗:用戶已儲在", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10017": "獲取代碼响应有錯誤誤 : %s", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10016": "上传用戶[%s]失敗: %s", + "ORG_ZSTACK_AI_10079": "ModelEval 服務類型需要在 modelServiceGroupUuids 或 url 中指定一個现有的模型服務用於使用", + "ORG_ZSTACK_AI_10077": "在部署消息中未提供 L3 网络 UUID,且模型中心[uuid:%s] 未配置 serviceNetworkUuid 或 storageNetworkUuid", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10012": "iam2 中儲在同名的用戶[%s]", + "ORG_ZSTACK_AI_10078": "环境变量值不应为 null", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_SUPPLIER_EMAY_10000": "無效參數,供应商[%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10026": "獲取用戶名为空", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10025": "失敗獲取參數[%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10028": "插件 [uuid:%s] 被 oauth2 客戶端 [uuids:%s] 用於第三方登录。", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10027": "本地用戶已有同名用戶[%s]", + "ORG_ZSTACK_AI_10097": "模型服務在组[uuid: %s]中類型不一致,预期为:%s,但發现为:%s", + "ORG_ZSTACK_AI_10098": "模型服務後端[type: %s]未找到", + "ORG_ZSTACK_AI_10095": "所有模型服務在组[uuid: %s]中必須設置服務啟動運行时間", + "ORG_ZSTACK_AI_10096": "在组[uuid: %s]中未找到節點秩为0的模型服務", + "ORG_ZSTACK_AI_10093": "模型服務实例[uuid: %s]未運行且未就绪,但未找到錯誤誤代碼", + "ORG_ZSTACK_AI_10094": "意外内容: %s 服務的 yaml 解析为 null", + "ORG_ZSTACK_AI_10091": "失敗獲取就绪状态,因为 %s", + "ORG_ZSTACK_AI_10092": "模型服務实例[uuid: %s]未運行且未就绪,因为%s", + "ORG_ZSTACK_AI_10090": "失敗重载 Nginx 配置:%s", + "ORG_ZSTACK_VROUTERROUTE_10010": "目標[%s]不能同时儲在黑洞路由和静态路由", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10000": "無法找到外部主儲儲[uuid:%s]", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10031": "失敗将 %s 到 %s,状态碼:%s,响应体:%s", + "ORG_ZSTACK_VROUTERROUTE_10012": "無法为目的地:%s 添加重复的 BlackHole 路由条目", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10030": "HTTP 錯誤誤,状态碼: %s,正文: %s", + "ORG_ZSTACK_VROUTERROUTE_10011": "不能輸入重复的静态路由条目,目的地:%s,目標:%s,類型:%s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10003": "必需的空間[locationUrl:%s]無法满足条件[可用大小 > %s 字節], 當前可用大小 %s", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10004": "無法找到卷[uuid:%s]安装路径", + "ORG_ZSTACK_STORAGE_ADDON_PRIMARY_10001": "無法連接任何外部儲儲", + "ORG_ZSTACK_SSO_OAUTH2_SERVICE_10032": "失敗将 %s 转换为 %s,IO 錯誤誤: %s", + "ORG_ZSTACK_AI_10099": "模型服務实例组[uuid: %s]未找到", + "ORG_ZSTACK_VROUTERROUTE_10001": "無法找到虚拟路由器類型[%s]的服務工厂", + "ORG_ZSTACK_VROUTERROUTE_10000": "虚拟路由器[uuid:%s]未找到", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10015": "Ceph bs[uuid=%s] 池名称未找到", + "ORG_ZSTACK_VROUTERROUTE_10003": "無法找到路由表 [uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10012": "無法更新 Ceph 备份儲儲 mon[uuid:%s] 的状态,因为它已被刪除。此錯誤誤可以忽略。", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10000": "無法找到主機調度组[uuid:%s],它可能已被刪除", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10003": "主機[uuid:%s]已附属於宿主調度组[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10004": "主機叢叢Uuid为空", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10001": "無法找到虚拟機調度規则[uuid:%s],它可能已被刪除", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10002": "無法找到虚拟機調度组[uuid:%s],它可能已被刪除", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10011": "Ceph 备份儲儲不支持计算镜像哈希", + "ORG_ZSTACK_SNS_PLATFORM_HTTP_10000": "HTTP POST請求失敗。状态:%s,响应体:%s", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10007": "圖像[uuid: %s]不在备份儲儲[uuid:%s, 名称:%s]中", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10005": "另一個CEPH备份儲儲[name:%s, uuid:%s]具有相同的FSID[%s],您不能添加相同的CEPH配置作为两個不同的备份儲儲", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10003": "無法連接到 CEPH 备份儲儲[UUID:%s],未能連接所有 CEPH 监控器。", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10002": "CephMon[主機名:%s]在备份儲儲[唯一標識:%s]中未找到", + "ORG_ZSTACK_STORAGE_CEPH_BACKUP_10009": "無法将监控器添加到ceph备份儲儲", + "ORG_ZSTACK_MULTICAST_ROUTER_BACKEND_10000": "多播路由器 [uuid:%s] 在啟用後端多播时已被刪除", + "ORG_ZSTACK_LDAP_10016": "查询 LDAP 条目失敗, %s", + "ORG_ZSTACK_LDAP_10017": "查询ldap条目[過滤器: %s]失敗,因为%s", + "ORG_ZSTACK_LDAP_10012": "無法連接到LDAP/AD服務器,憑證無效,請检查用戶DN和密碼", + "ORG_ZSTACK_LDAP_10013": "無法連接到LDAP/AD服務器,通信失敗,請检查IP、端口和Base DN", + "ORG_ZSTACK_LDAP_10014": "無法連接到LDAP/AD服務器,%s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10005": "當前許可證[%s]無效,从imagestore备份儲儲下载时", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10004": "Ceph主儲儲[%s]不儲在!", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_CEPH_10001": "圖像 [uuid:%s] 已被刪除", + "ORG_ZSTACK_LDAP_10010": "錯誤誤的LdapServerType[%s], 有效值:[%,%s]", + "ORG_ZSTACK_LDAP_10007": "帳號[uuid:%s]未找到!!!", + "ORG_ZSTACK_LDAP_10008": "不受支持的 LDAP/AD 服務器范围", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10000": "failed to create eip[uuid:%s, name:%s, ip:%s] for vm nic[uuid:%s] on virtual router[uuid:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10001": "發现了一個虚拟路由器報价[uuid:%s]用於L3网络[uuid:%s]在區域[uuid:%s];然而,該网络的公网[uuid:%s]与EIP[uuid:%s]的不同;您可能需要使用系統統標签guestL3Network::l3NetworkUuid来指定特定的虚拟路由器報价用於L3网络", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10002": "失敗移除弹性公网IP[UUID:%s, 名称:%s, IP:%s] 用於虚拟機网卡[UUID:%s] 在虚拟路由器[UUID:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_EIP_10004": "失敗在虚拟路由器[uuid:%s]上同步弹性公网IP,%s", + "ORG_ZSTACK_AI_10004": "随機Uuid不匹配", + "ORG_ZSTACK_AI_10005": "模型中心未找到", + "ORG_ZSTACK_AI_10003": "randomUuid为空", + "ORG_ZSTACK_AI_10001": "模型中心管理IP無效", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10027": "vm[uuid:%s] 现已在 host[uuid:%s] 上運行,这与關聯於 vm 調度组[uuid:%s] 的調度規则[%s]不符。", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10028": "vm[uuid:%s] 现已在 host[uuid:%s] 上運行,这与關聯於 vm 調度组[uuid:%s] 的調度規则[%s]不符。", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10019": "虚拟機調度组[UUID:%s]已经關聯了一個已執行的独占虚拟機或亲和虚拟機調度策略。您不能再次将任何需要執行的两种調度策略中的任何一個關聯到該组。", + "ORG_ZSTACK_AI_10028": "模型服務不能为 null 或空", + "ORG_ZSTACK_AI_10029": "模型服務应使用相同的模型UUID", + "ORG_ZSTACK_AI_10026": "服務网络UUID %s 不是系統統L3网络", + "ORG_ZSTACK_AI_10027": "儲儲网络UUID %s 不是系統統L3网络", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10025": "vm[uuid:%s] 现已在主機[uuid:%s]上運行,这与關聯的虚拟機調度组[uuid:%s]的調度規则不符。", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10026": "主機组[uuid:%s]不儲在", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10024": "虚拟機調度组[uuid:%s]为虚拟機[uuid:%s]预留主機[uuid:%s]失敗", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10007": "vm[uuid:%s] 已经綁定到 vm 調度组[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10008": "检测到不匹配的區域,vm[uuid: %s, 區域uuid: %s] 的區域与 vm 調度規则组[uuid: %s, 區域uuid: %s] 不一致", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10005": "您添加到主機調度组的主機必須啟用並連接到管理節點。", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10006": "检测到不匹配的區域,主機[uuid: %s, 區域uuid: %s]的區域与宿主機調度規则组[uuid: %s, 區域uuid: %s]不同", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10009": "vm只能在状态[%s,%s]时更改其vm調度组,但vm當前处於状态[%s]", + "ORG_ZSTACK_TEMPLATECONFIG_10000": "無法找到任何 TemplateConfigs: [模板Uuid: %s]", + "ORG_ZSTACK_TICKET_API_10002": "没有定义帳戶系統統類型[%s]", + "ORG_ZSTACK_TICKET_API_10003": "未找到匹配的票類型", + "ORG_ZSTACK_TICKET_API_10004": "未找到匹配的工单流程叢合或默認的工单流程叢合,請指定 flowCollectionUuid 或在系統統中創建一個默認的工单流程叢合", + "ORG_ZSTACK_TEMPLATECONFIG_10003": "無法找到 TemplateConfig[category: %s, name: %s, templateUuid: %s]", + "ORG_ZSTACK_TICKET_API_10005": "票据流程收叢[uuid:%s]与票据類型[uuid:%s]不符", + "ORG_ZSTACK_TICKET_API_10006": "票据流程收叢[uuid:%s]無效,請聯系統管理員进行修正", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10000": "阿里雲 NAS 主儲儲[uuid:%s, name:%s]無法在關聯的叢叢中找到可用主機以实例化卷", + "ORG_ZSTACK_TICKET_API_10007": "票流收叢[uuid:%s]已禁用,無法使用", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10001": "阿里雲NAS主儲儲[UUID:%s, 名称:%s]無法在關聯的叢叢中找到可用主機以刪除主儲儲上的位數据", + "ORG_ZSTACK_TICKET_API_10008": "無效請求。未找到 API[%s]", + "ORG_ZSTACK_TICKET_API_10009": "無效請求,無法从 apiBody 創建 API[%s],%s", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10010": "無法操作VPC VM調度组", + "ORG_ZSTACK_COMPUTE_VMSCHEDULING_10011": "zoneUuid 不为空", + "ORG_ZSTACK_TEMPLATECONFIG_10005": "無法找到任何模板配置:[模板Uuid: %s]", + "ORG_ZSTACK_AI_10012": "架构圖像必須不为 null 或为空", + "ORG_ZSTACK_AI_10042": "無效的 YAML 格式: %s", + "ORG_ZSTACK_AI_10043": "YAML配置和单独的參數不能同时用於更新。", + "ORG_ZSTACK_AI_10040": "服務端口不能包含重复项: %s", + "ORG_ZSTACK_AI_10041": "服務啟動时間必須在 [1,65535] 范围内", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10006": "在宿主機上检查挂载路径失敗: %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10005": "阿里雲NAS主儲儲[uuid:%s,名称:%s]未附加到任何叢叢,或附加的叢叢中没有任何主機連接", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10009": "無法找到主機清理镜像缓儲。", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10013": "無法将主儲儲附加到叢叢。叢叢中的 KVM 主機[uuid:%s, name:%s]使用的是 qemu-img 版本[%s];但主儲儲已附加到具有不同 KVM 主機[uuid:%s]的叢叢中,該主機使用的是 qemu-img 版本[%s]。qemu-img 版本大於%s与版本小於%s不兼容,这将导致卷快照操作失敗。請避免将主儲儲附加到具有不同 Linux 發行版的叢叢中,以防止 qemu-img 版本不匹配。", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10014": "没有可用的主機可以下载imagecache!", + "ORG_ZSTACK_AI_10049": "CPU 架构在架构圖像映像射中不能为空", + "ORG_ZSTACK_AI_10046": "GPU供应商 %s 必須具有規格UUID列表", + "ORG_ZSTACK_AI_10047": "GPU 規格 UUID(s) 对於供应商 %s 在 %s 中未找到: %s", + "ORG_ZSTACK_AI_10044": "GPU供应商規范映像射在架构圖像映像射中不能为空", + "ORG_ZSTACK_AI_10045": "GPU供应商在架构圖像映像射中不能为null", + "ORG_ZSTACK_AI_10031": "模型服務 UUID 不应为空", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10008": "解析 MS 包封失敗: %s, %s", + "ORG_ZSTACK_AI_10032": "節點排名应位於 [0, %s) 内,但獲取到的是 %s", + "ORG_ZSTACK_AI_10030": "模型服務应使用相同的區域UUID", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10003": "非法參數 %s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10004": "解密數据失敗", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10017": "阿里雲NAS访问组[%s]不儲在,可能已被刪除!", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10018": "EcsVSwitchVO[%s] 不儲在,可能已被刪除!", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10020": "無法在主儲儲中找到可用的主機进行操作:%s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10021": "失敗从主機[uuid:%s] ping 淘雲 NAS 主儲儲[uuid:%s],原因:%s。斷開此主機-PS連接", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10024": "無法找到任何适用於類型的[%s]的BackupStorageKvmFactory", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10025": "無法找到主機操作卷:[%s]", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10023": "NAS 主儲儲未挂载,請先初始化它!", + "ORG_ZSTACK_AI_10039": "服務端口必須在 [1,65535] 范围内,但獲取到的是: %s", + "ORG_ZSTACK_AI_10037": "服務Livez必須以'/'開头,不允許有空格,長度<=512", + "ORG_ZSTACK_AI_10038": "服務就绪路径必須以\"/\"開头,不得包含空格,長度不得超過512字符", + "ORG_ZSTACK_AI_10035": "無效框架: %s, 有效值为: %s", + "ORG_ZSTACK_AI_10036": "無效框架: %s", + "ORG_ZSTACK_AI_10033": "無效的PCI設备编號: %s", + "ORG_ZSTACK_AI_10034": "節點排名应該唯一,但得到 %s", + "ORG_ZSTACK_ACL_10001": "%s 在访问控制列表组:%s 中与重复/重叠的 IP 条目冲突", + "ORG_ZSTACK_AI_10064": "無效的數据叢結构: %s", + "ORG_ZSTACK_ACL_10000": "不支持的 IP 版本 %d", + "ORG_ZSTACK_AI_10065": "系統統预設數据叢不允許通過API进行更新", + "ORG_ZSTACK_AI_10062": "數据叢正在被使用,無法通過API刪除", + "ORG_ZSTACK_AI_10063": "updateDatasetStructs 不能为 null 或空", + "ORG_ZSTACK_AI_10060": "無法销毁虚拟機实例,因为該虚拟機实例被模型服務组[uuid: %s]使用", + "ORG_ZSTACK_ZSV_COMPUTER_VM_10000": "vm 名称 %s 已经儲在", + "ORG_ZSTACK_AI_10061": "应用類型实例组的共享不允許: %s", + "ORG_ZSTACK_ACL_10009": "访问控制列表组[%s]已经拥有一個重定向規则,無法添加重定向規则", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10028": "没有可用主機可以检查挂载路径!", + "ORG_ZSTACK_ACL_10008": "访问控制列表组[%s]已经拥有IP条目,無法添加重定向規则", + "ORG_ZSTACK_ACL_10007": "访问控制列表组[%s]已经拥有重定向規则,無法添加IP条目", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10026": "無法在主節點上找到並同步卷大小:%s", + "ORG_ZSTACK_ACL_10006": "访问控制列表组[%s]不能添加超過%d個IP条目", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10027": "圖像 [%s] 已被刪除,無法从它重新初始化根磁碟", + "ORG_ZSTACK_SCHEDULER_SNAPSHOT_10000": "根卷[%s]的VM状态为销毁中。不允許作业状态变更", + "ORG_ZSTACK_ACL_10005": "访问控制列表组[%s]已经拥有重定向規则,無法添加IP条目", + "ORG_ZSTACK_ACL_10004": "無效的規则表達式,詳細信息: %s", + "ORG_ZSTACK_ACL_10003": "IP范围[%s, %s]与访问控制列表组:%s中的[%s, %s]有重叠", + "ORG_ZSTACK_ACL_10002": "ip 格式只支持 ip/iprange/cidr,但發现 %s", + "ORG_ZSTACK_ALIYUN_NAS_STORAGE_PRIMARY_10031": "阿里雲NAS主要儲儲仅支持imagestore bs類型,实际獲取類型:%s", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10000": "信息安全加密驱動程序加密失敗", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10001": "信息安全加密驱動解密失敗", + "ORG_ZSTACK_TESTLIB_PREMIUM_CRYPTO_10002": "加密數据[%s]或算法類型[%s]为空", + "ORG_ZSTACK_AI_10068": "模型评估需要 ModelServiceType.ModelEval 類型的模型服務", + "ORG_ZSTACK_AI_10069": "datasetUuids 或者提示是模型评估所需的一项内容", + "ORG_ZSTACK_AI_10066": "模型服務视圖对象的UUID是必需的", + "ORG_ZSTACK_AI_10067": "服務類型是必需的", + "ORG_ZSTACK_ACL_10012": "[%s]不是一個有效的URL", + "ORG_ZSTACK_AI_10053": "圖像 [uuid:%s] 对於架构 %s 已禁用且無法使用", + "ORG_ZSTACK_ACL_10011": "域名[%s]無效", + "ORG_ZSTACK_AI_10054": "圖像 [uuid:%s] 对於架构 %s 尚未准备好且無法使用", + "ORG_ZSTACK_ACL_10010": "域名和URL不能同时为空", + "ORG_ZSTACK_AI_10051": "至少需要为架构 %s 指定一种镜像類型(vmImageUuid 或 dockerImage)", + "ORG_ZSTACK_AI_10052": "無效的镜像 UUID 对於架构 %s: %s", + "ORG_ZSTACK_AI_10050": "無效的 CPU 架构類型在架构圖像映像射中:%s,支持的類型为:%s", + "ORG_ZSTACK_AI_10059": "消息中數据叢數据類型過多:%s,請将類型减少为一种", + "ORG_ZSTACK_AI_10057": "創建數据叢而不使用 'dataset::datatype::' 和 'dataset::usage::scenarios::' 是不允許的", + "ORG_ZSTACK_AI_10058": "至少应为一個數据叢設置一种數据類型:datatype::", + "ORG_ZSTACK_AI_10055": "重复的 CPU 架构在架构圖像映像射中: %s", + "ORG_ZSTACK_AI_10056": "架构圖像不能为空", + "ORG_ZSTACK_VMWARE_10101": "列表儲儲失敗 for %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10051": "lun 名是必填项但獲取到 null", + "ORG_ZSTACK_VMWARE_10102": "没有找到为VM: %s 对应的數据儲儲", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10054": "失敗獲取 lun:%s 的快照,id 为:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10053": "失敗獲取 lun:%s 的快照", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10012": "SFTP 备份儲儲不支持计算镜像哈希值", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10050": "發起人[%s]在XStor中已儲在且未綁定到主機[%s],請確保發起人的名称是唯一的", + "ORG_ZSTACK_ALIYUN_NETWORK_10020": "只有处於運行中和已停止状态的 ECS 实例才能綁定 EIP,但當前 ECS [%s] 的状态是 [%s]。", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10016": "創建镜像元數据文件 : %s 失敗", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10017": "检查镜像元數据文件: %s 失敗", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10018": "圖像元數据文件: %s 不儲在", + "ORG_ZSTACK_ZWATCH_ALARM_10022": "重复動作[uuid:%s, 類型:%s]对於警報[uuid:%s]的操作已被记录", + "ORG_ZSTACK_ZWATCH_ALARM_10021": "動作[uuid:%s, 類型:%s] 未找到", + "ORG_ZSTACK_ZWATCH_ALARM_10020": "無效的操作類型[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10026": "重复键[%s]的值为%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10170": "無法将服務器IP添加到共享负载均衡服務器组", + "ORG_ZSTACK_ZWATCH_ALARM_10025": "指標[%s]不儲在標签[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10023": "重复標签[key:%s, 操作符:%s, 值:%s]告警[uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10029": "指標[%s]仅管理員可见,當前用戶不可用", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10171": "無法更改後端服務器,因为 vmincs 和 serverips 为空", + "ORG_ZSTACK_ZWATCH_ALARM_10028": "命名空間[%s]不儲在度量[%s]", + "ORG_ZSTACK_ZWATCH_ALARM_10027": "命名空間[%s]不支持", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10049": "lun id 不合法", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10048": "lun映像射ID是必填项,不能为空,也不能为0", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10045": "失敗獲取 lun %s 映像射,因为:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10044": "失敗检查 lun %s 会话状态,因为:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10047": "無法獲取 lun 映像射 id,我们只能返回失敗", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10046": "失敗獲取 lun %s 剩餘創建 lun 數量,因为:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10041": "快照ID是必填项,但獲取到:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10040": "失敗查询快照 %s,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10043": "失敗回滚快照:%s,因为:%s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10020": "請在創建 SFTP 备份儲儲 %s 之前停止 VM", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10042": "失敗刪除快照 %s,因为 %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10023": "重复的备份儲儲。已儲在一個 SFTP 备份儲儲[主機名:%s]", + "ORG_ZSTACK_LICENSE_CUBE_10000": "許可證上下文不能为 null", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10038": "失敗獲取儲儲池 %s,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10037": "失敗刪除 lun %s,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10039": "失敗为 LUN %s 創建快照,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10034": "lun映像射ID是必填项,但獲取:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10033": "失敗将 LUN %s 映像射到主機组 %s,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10036": "lun id 是必填项,但獲取到:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10035": "失敗刪除 lun 映像射 %s,因为 %s", + "ORG_ZSTACK_ALIYUN_NETWORK_10004": "ecs 实例[%s]不儲在,請检查。", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10001": "%s 从 imagestore 备份儲儲[主機名:%s, 路径: %s]下载數据到本地主儲儲[唯一標識符:%s, 路径: %s]失敗, %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10002": "上传本地儲儲[uuid:%s, 路径:%s]至镜像儲儲 [主機名:%s]失敗,%s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10020": "l3网络 %s 和 vpc %s 已经連接,請检查", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_LOCAL_10000": "源虚拟機在主機[uuid: %s]上有本地數据卷,但在快速克隆API消息中嘗試将虚拟機克隆到主機[%s],这对於快速克隆功能来說是不可能的。", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10000": "自動扩展規则調度作业触發器VO[uuid:%s]的状态为:%s,不允許状态变更", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10001": "自動扩展規则調度作业触發器VO[uuid:%s]正处於冷却期", + "ORG_ZSTACK_ALIYUN_NETWORK_10008": "虚拟边界: %s 已被刪除", + "ORG_ZSTACK_AUTOSCALING_GROUP_RULE_10002": "自動扩展規则VO[uuid:%s]的状态为:%s,不允許状态变更", + "ORG_ZSTACK_ALIYUN_NETWORK_10005": "只有处於運行中和已停止状态的 ECS 实例才能解綁 EIP,但當前 ECS 实例 [%s] 的状态是 [%s]。", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10018": "CpeIp 必須是ipv4地址,但目前是%s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10017": "只有管理員可以創建連接", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10019": "cpeIp 必須是ipv4地址", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10000": "SftpBackupStorage 不支持 url[%s] 中的 scheme[%s]", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10014": "在雲儲儲中未找到对应的vbr: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10013": "没有找到对应的虚拟機:%s", + "ORG_ZSTACK_ALIYUN_NETWORK_10010": "目標 cidr [%s] 已儲在並指向另一個 instance-id [%s],請先检查或刪除後再操作", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10061": "失敗獲取镜像缓儲LUN信息", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10016": "不支持的資源類型: %s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10003": "失敗取消下载镜像,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10060": "新的镜像缓儲尚未就绪,請等待一秒,再重試一次", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10015": "在第 %s 层网络中未找到:%s", + "ORG_ZSTACK_STORAGE_BACKUP_SFTP_10004": "SFTP备份儲儲代理的UUID發生变化[预期:%s,实际:%s],最有可能是代理手動重啟了。請發起重新連接以同步状态", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10010": "没有为三层网络 %s 找到相应的 CIDR", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10012": "没有找到对应的VPC: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10059": "無法找到 lun: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10055": "XStor 叢叢不健康,叢叢信息[cluster_data_state: %s, cluster_healthy_state: %s, cluster_running_state: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10058": "非法逻辑单元ID", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10057": "lun %s 在主機 %s 的会话不活跃", + "ORG_ZSTACK_HYBRID_NETWORK_10027": "CIDR 与其他虚拟交换機重叠: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10028": "無效的CidrBlock: %s,必須在'10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16'范围内", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10010": "失敗刪除主機 %s,因为 %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10009": "在三层网络:%s 未找到相应的虚拟路由器网卡", + "ORG_ZSTACK_HYBRID_NETWORK_10029": "不儲在的虚拟边界路由器: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10003": "自定义CIDR [%s] 已儲在於VBR [%s] 中,它与目標CIDR [%s] 重叠,請先检查並刪除後再操作。", + "ORG_ZSTACK_HYBRID_NETWORK_10020": "下一跳路由器接口属於 %s,但条目属於 %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10001": "Vbr: [%s]正处於建立連接過程中,請等待...", + "ORG_ZSTACK_HYBRID_NETWORK_10021": "没有此類VPN网關: %s", + "ORG_ZSTACK_ALIYUN_NETWORK_CONNECTION_10000": "自定义CIDR [%s] 已儲在於虚拟路由器 [%s] 中,它与目標CIDR [%s] 重叠,請先检查並刪除它。", + "ORG_ZSTACK_HYBRID_NETWORK_10022": "下一跳類型 [%s] 现在不支持創建路由条目!", + "ORG_ZSTACK_HYBRID_NETWORK_10024": "虚拟边界路由器仅支持路由接口作为下一跳類型", + "ORG_ZSTACK_HYBRID_NETWORK_10026": "交换機的 CIDR [%s] 不在 VPC 的 [%s] 中", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10008": "失敗将主機 %s 添加到主機组 %s 中,原因:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10005": "失敗獲取可用區域的子网因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10004": "失敗同步访问區域因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10007": "失敗查询主機 %s,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10006": "失敗查询所有主機,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10001": "失敗将初始化程序:%s 添加到主機,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10000": "登录 XStor 設备失敗: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10002": "失敗将 lun: %s 复制到 %s,因为 %s", + "ORG_ZSTACK_HYBRID_NETWORK_10038": "eip[%s] 和 ecs[%s] 应該在同一個數据中心", + "ORG_ZSTACK_VMWARE_10135": "失敗将ZStack UUID設置为VCenter ManagedEntity [名称:%s, mor:%s] 因为 %s", + "ORG_ZSTACK_HYBRID_NETWORK_10039": "無法解綁弹性公网IP:[%s], 它未綁定在任何实例上", + "ORG_ZSTACK_VMWARE_10132": "没有可用的单位编號用於數据碟 %s", + "ORG_ZSTACK_VMWARE_10133": "創建分布式端口组失敗,分布式交换機 [%s],%s", + "ORG_ZSTACK_VMWARE_10130": "刪除虚拟磁碟[%s]失敗: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10030": "無此類虚拟路由器: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10031": "本地网關不是IPv4地址: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10032": "peerGateway 不是 IPv4 地址: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10033": "peerGateway 不是子网掩碼: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10034": "vlanId 不是數字: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10035": "未能将弹性公网IP綁定至ECS: [%s] ,弹性公网IP :[%s] 已经綁定至ECS:[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10036": "ecs [%s] 已经有公网IP了", + "ORG_ZSTACK_HYBRID_NETWORK_10037": "没能将弹性公网IP [%s] 挂载到ECS: [%s] ,因为ECS已经挂载了", + "ORG_ZSTACK_SSO_SERVICE_10014": "虚拟ID不儲在用戶名%s", + "ORG_ZSTACK_VMWARE_10129": "虚拟磁碟管理器不可用", + "ORG_ZSTACK_SSO_SERVICE_10011": "响应有錯誤誤 : %s", + "ORG_ZSTACK_SSO_SERVICE_10010": "重定向网址有誤, %s", + "ORG_ZSTACK_VMWARE_10128": "没有为數据儲儲找到數据中心", + "ORG_ZSTACK_SSO_SERVICE_10013": "帳戶不儲在用戶名 %s", + "ORG_ZSTACK_SSO_SERVICE_10012": "生成用戶信息映像射配置以供 SSO 客戶端 [UUID: %s] 使用时失敗:未發现自定义属性映像射。", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10030": "查询主機组 %s 的 lun 映像射失敗,原因:%s", + "ORG_ZSTACK_HYBRID_NETWORK_10005": "路由器接口必須位於同一數据中心,但 ri[%s] 位於 dc[%s],而 ri[%s] 位於 dc[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10032": "失敗獲取叢叢信息,因为 %s", + "ORG_ZSTACK_VMWARE_10121": "創建 dvPortGroup 失敗:%s", + "ORG_ZSTACK_HYBRID_NETWORK_10007": "路由器接口[%s]状态不是空闲,它是%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10031": "失敗查询 lun 映像射 %s,因为 %s", + "ORG_ZSTACK_HYBRID_NETWORK_10009": "路由器接口[%s]已经儲在連接,状态是%s", + "ORG_ZSTACK_VMWARE_10120": "dv交换機 [%s] 在 vCenter [%s] 中未找到", + "ORG_ZSTACK_GUESTTOOLS_10009": "在管理節點[uuid:%s]中为宿主機[uuid:%s]未找到合适的客戶機工具ISO文件", + "ORG_ZSTACK_GUESTTOOLS_10007": "無法獲取虚拟機[uuid:%s]的最新guest-tools,因为該虚拟機未運行或正在恢复中。", + "ORG_ZSTACK_ZWATCH_ALARM_10000": "無法找到事件订阅[uuid:%s],它可能已被刪除", + "ORG_ZSTACK_GUESTTOOLS_10008": "無法獲取虚拟機[uuid:%s]的最新guest-tools,因为它不是用戶虚拟機", + "ORG_ZSTACK_GUESTTOOLS_10005": "qga状态变更失敗对於vm[uuid:%s]", + "ORG_ZSTACK_GUESTTOOLS_10006": "無法为虚拟機[uuid:%s]獲取最新的guest-tools,因为其宿主機類型不受支持", + "ORG_ZSTACK_GUESTTOOLS_10004": "qga上传文件失敗[%s]", + "ORG_ZSTACK_GUESTTOOLS_10001": "一個錯誤誤發生在vm-%s: %s", + "ORG_ZSTACK_ZWATCH_ALARM_10002": "指標[%s]的重复間隔值不能小於1小时", + "ORG_ZSTACK_GUESTTOOLS_10002": "上传文件到虚拟機 vm-%s 失敗, %s", + "ORG_ZSTACK_ZWATCH_ALARM_10001": "無法找到告警[uuid:%s],它可能已被刪除", + "ORG_ZSTACK_SSO_SERVICE_10008": "令牌不儲在", + "ORG_ZSTACK_AI_10109": "模型中心[uuid: %s]未找到", + "ORG_ZSTACK_SSO_SERVICE_10007": "上传管理員信息到Keycloak失敗。", + "ORG_ZSTACK_ZWATCH_ALARM_10007": "該事件订阅已经具有標签[%s]", + "ORG_ZSTACK_AI_10107": "模型服務实例(主節點)带有節點排名 0 的实例在模型服務实例组[uuid: %s]中未找到", + "ORG_ZSTACK_ZWATCH_ALARM_10006": "事件没有標签[%s]", + "ORG_ZSTACK_SSO_SERVICE_10009": "%s 類型不支持", + "ORG_ZSTACK_AI_10108": "模型服務实例组 %s 未找到", + "ORG_ZSTACK_ZWATCH_ALARM_10005": "操作[uuid:%s]已綁定至事件订阅[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10027": "失敗創建LUN名称:%s,錯誤誤信息:%s", + "ORG_ZSTACK_SSO_SERVICE_10004": "IdP元數据是必需的", + "ORG_ZSTACK_AI_10105": "部署模型服務回复成功,但模型服務实例UUID为空", + "ORG_ZSTACK_SSO_SERVICE_10003": "無效的授權网址: %s", + "ORG_ZSTACK_AI_10106": "模型服務实例UUID为空,無法处理模型服務实例", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10029": "lun ID 在查询 lun 映像射时是必填项", + "ORG_ZSTACK_SSO_SERVICE_10006": "無效的身份提供商元數据: %s", + "ORG_ZSTACK_AI_10103": "模型服務实例组[UUID: %s]未找到,跳過創建資源以運行服務流程", + "ORG_ZSTACK_VMWARE_10118": "創建端口组失敗为主機 %s:因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10028": "失敗查询 lun %s,因为 %s", + "ORG_ZSTACK_AI_10104": "部署模型服務回复成功,但未找到模型服務实例组[uuid: %s]", + "ORG_ZSTACK_VMWARE_10119": "創建端口组失敗,主機 %s", + "ORG_ZSTACK_AI_10101": "模型儲儲後端未找到,对於模型服務实例组[uuid: %s]", + "ORG_ZSTACK_VMWARE_10116": "端口组[%s]已在主機[%s]上儲在,但vlanId不同(%d)", + "ORG_ZSTACK_AI_10102": "分配模型服務实例名称失敗,因为 %s", + "ORG_ZSTACK_VMWARE_10117": "端口组[%s]已在主機[%s]上儲在,請使用其他名称再次創建或手動刪除端口组並重新關聯至叢叢", + "ORG_ZSTACK_SSO_SERVICE_10002": "SSO客戶端不是身份類型[%s],推送操作不允許。", + "ORG_ZSTACK_VMWARE_10114": "dvSwitch名称[%s]不唯一", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10024": "失敗創建LUN名称:%s,無法找到根本原因", + "ORG_ZSTACK_SSO_SERVICE_10001": "SSO客戶端(uuid [%s])不儲在。", + "ORG_ZSTACK_AI_10100": "模型服務实例组[uuid: %s]的模型服務uuid为空", + "ORG_ZSTACK_VMWARE_10115": "主機[%s:%s]未在vCenter中找到", + "ORG_ZSTACK_VMWARE_10112": "創建 dvSwitch 失敗:%s", + "ORG_ZSTACK_HYBRID_NETWORK_10016": "%s 不是一個有效的cidr", + "ORG_ZSTACK_VMWARE_10113": "獲取 vCenter 叢叢[%s] 名称失敗", + "ORG_ZSTACK_HYBRID_NETWORK_10017": "安全组規则已儲在", + "ORG_ZSTACK_VMWARE_10110": "guest 工具未安装或運行中:%s", + "ORG_ZSTACK_HYBRID_NETWORK_10018": "dstCidrBlock[%s] 不是一個有效的CIDR地址", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10020": "失敗更新 lun 名称: %s, 錯誤誤信息:%s", + "ORG_ZSTACK_VMWARE_10111": "上传文件到虚拟機失敗:%s", + "ORG_ZSTACK_HYBRID_NETWORK_10019": "没有这样的 ECS 实例: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10010": "访问點UUID在VBR類型路由器的路由接口不可为空", + "ORG_ZSTACK_HYBRID_NETWORK_10011": "無法在VirtualBorderRouterVO中找到这样的路由器UUID[%s]", + "ORG_ZSTACK_GUESTTOOLS_10018": "無法迁移虚拟機[uuid:%s],因为儲在vf nic但guesttools未運行", + "ORG_ZSTACK_ZWATCH_ALARM_10011": "事件[%s]不儲在標签[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10012": "無法在VpcVirtualRouterVO中找到这样的路由器UUID[%s]", + "ORG_ZSTACK_GUESTTOOLS_10019": "無法将L3网络附加到VM[uuid:%s],因为guesttools未運行。", + "ORG_ZSTACK_ZWATCH_ALARM_10010": "命名空間[%s]不儲在該事件[%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10013": "不支持的路由器類型: %s", + "ORG_ZSTACK_GUESTTOOLS_10016": "無法更改VF NIC HA状态,因为未找到VF NIC[uuid:%s]", + "ORG_ZSTACK_HYBRID_NETWORK_10014": "無法刪除系統統记录", + "ORG_ZSTACK_GUESTTOOLS_10017": "無法更改VF NIC HA状态,因为guesttools未運行。", + "ORG_ZSTACK_HYBRID_NETWORK_10015": "仅支持VPC内的网络規则", + "ORG_ZSTACK_GUESTTOOLS_10014": "脚本包含未对应運行时參數的占位符 %s。請通過 runtimeParams 提供这些占位符的值。", + "ORG_ZSTACK_ZWATCH_ALARM_10015": "周期字段不支持度量[name:%s]", + "ORG_ZSTACK_GUESTTOOLS_10015": "無法迁移主儲儲,因为 vm[uuid:%s] 挂载了 VF NIC 但 GuestTools 未運行", + "ORG_ZSTACK_ZWATCH_ALARM_10014": "周期字段不能为空对於指標 [名称:%s]", + "ORG_ZSTACK_GUESTTOOLS_10012": "encodingType 和 scriptContent 必須同时出现或同时缺失", + "ORG_ZSTACK_ZWATCH_ALARM_10013": "命名空間[%s]未找到", + "ORG_ZSTACK_GUESTTOOLS_10013": "無效的 renderParams 格式,必須是一個有效的 JSON 數组。示例:[{\"key\":\"k1\",\"value\":\"v1\"}]。錯誤誤:%s", + "ORG_ZSTACK_GUESTTOOLS_10010": "在宿主機[uuid:%s]上检查Guest Tools失敗", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10019": "失敗按路径查询 lun: %s, 錯誤誤信息:%s", + "ORG_ZSTACK_GUESTTOOLS_10011": "設置虚拟機[uuid: %s, name: %s]的主機名失敗,因为QGA状态未運行且不儲在DHCP服務", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10016": "失敗添加主機组: %s, 錯誤誤信息:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10015": "失敗查询主機组,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10017": "失敗查询 lun : %s, 錯誤誤信息:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10012": "失敗刪除主機组 %s,因为 %s", + "ORG_ZSTACK_VMWARE_10105": "在主機 %s 中未找到資源池", + "ORG_ZSTACK_VMWARE_10106": "失敗在搜索主機 %s 的資源池", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10014": "失敗刪除發起方 %s,因为 %s", + "ORG_ZSTACK_VMWARE_10103": "失敗設置 ESX 虚拟機 UUID [%s:%s],因为[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_VENDOR_XSTOR_10013": "主機ID是必填项,但獲取到:%s", + "ORG_ZSTACK_VMWARE_10104": "模板 [%s] 未找到", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10029": "無法找到 build-app[uuid: %s],或者它处於刪除状态", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10028": "無法找到镜像[%s]的imageUuid", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10027": "imageStore 没有連接", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10026": "imageStore 没有啟用", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10024": "無法找到构建应用:[%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10022": "构建系統統[uuid: %s]尚未綁定至區域[uuid: %s]", + "ORG_ZSTACK_CONTAINER_10040": "在任何可用叢叢上創建部署失敗。嘗試了 %d 個叢叢: %s", + "ORG_ZSTACK_FLOWMETER_10013": "收叢器与 %s 儲在重复", + "ORG_ZSTACK_FLOWMETER_10014": "未指定參數", + "ORG_ZSTACK_FLOWMETER_10015": "[%s] 不符合IP地址格式", + "ORG_ZSTACK_FLOWMETER_10016": "流收叢器[%s]不儲在", + "ORG_ZSTACK_GUESTTOOLS_10029": "無法从虚拟機[uuid:%s]獲取guest-tools信息,因为該虚拟機未運行", + "ORG_ZSTACK_CONTAINER_10043": "失敗查询服務: %s,因为 %s", + "ORG_ZSTACK_FLOWMETER_10017": "流量计[%s]不儲在", + "ORG_ZSTACK_FLOWMETER_10018": "流量计[%s]不支持IPv6版本[%s]", + "ORG_ZSTACK_GUESTTOOLS_10027": "無法将guest-tools iso附加到[uuid:%s]虚拟機,因为这不是用戶虚拟機", + "ORG_ZSTACK_CONTAINER_10045": "創建服務失敗,因为 %s", + "ORG_ZSTACK_FLOWMETER_10019": "采叢器 [%s %d] 与 %s 复制", + "ORG_ZSTACK_GUESTTOOLS_10028": "無法将Guest-Tools ISO挂载到VM[UUID:%s],因为其没有CDROM接口", + "ORG_ZSTACK_CONTAINER_10037": "無法找到任何容器叢叢,請检查NativeClusterVO以獲取詳細信息", + "ORG_ZSTACK_GUESTTOOLS_10025": "無法将guest-tools iso附加到[uuid:%s]的vm上,因为其hypervisor類型不受支持", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10057": "使用 ipmitool 關閉裸金属2機箱[uuid:%s]失敗", + "ORG_ZSTACK_GUESTTOOLS_10026": "無法将guest-tools iso挂载到[uuid:%s]虚拟機上,因为該虚拟機未運行", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10058": "失敗由bm代理關閉裸金属2实例[uuid:%s],因为%s", + "ORG_ZSTACK_GUESTTOOLS_10023": "更新 vm[uuid:%s] 的网络配置失敗,因为 GuestTools 版本過低,無法支持此功能。", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10059": "裸金属2機箱[UUID:%s]在後再%d秒仍未關機", + "ORG_ZSTACK_GUESTTOOLS_10024": "更新虚拟機[uuid:%s]的网络配置失敗,因为guesttools未運行。", + "ORG_ZSTACK_GUESTTOOLS_10021": "冲突主機名,三层网络[uuid:%s]上已有虚拟機[uuid:%s]使用主機名[%s]", + "ORG_ZSTACK_GUESTTOOLS_10022": "更新虚拟機[uuid:%s]的网络配置失敗,因为該虚拟機未運行。", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10054": "失敗通過网關[uuid:%s]ping裸金属实例[uuid:%s],因为%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10055": "通過网關[uuid:%s]更改裸金属2实例[uuid:%s]的密碼失敗,因为%s", + "ORG_ZSTACK_GUESTTOOLS_10020": "無法設置虚拟機主機名。虚拟機[UUID:%s]没有默認L3网络", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10056": "使用 ipmitool 啟動裸金属2機箱[uuid:%s]失敗", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10021": "無法找到构建系統統 [%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10020": "构建系統統[uuid: %s]已附加到區域[uuid: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10050": "未能在金属实例[uuid:%s]的网關[uuid:%s]中創建控制台代理,因为%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10051": "無法将默認网络从 l3[uuid:%s] 更改为 l3[uuid:%s] 用於裸金属实例[uuid:%s],因为 %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10018": "添加 BuildApp 失敗,因为 appId[%s:%s] 与另一個 BuildApp 冲突", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10017": "無法連接到本地儲儲构建系統統\"url:%s\",因为%s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10016": "創建 BuildApp 失敗,因为 appId[%s: %s] 已被另一個 BuildApp 重复", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10015": "构建应用被禁用,因为构建系統統处於“禁用”状态", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10014": "rest 調用 %s 失敗,因为: %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10013": "构建应用处於 %s 状态,當前操作不被支持。", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10012": "無法找到由 UUID[%s] 构建的应用程序", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10011": "因为构建系統統处於状态为 %s 的原因無法執行該操作", + "ORG_ZSTACK_CONTAINER_10031": "部署未找到: %s", + "ORG_ZSTACK_FLOWMETER_10003": "网络[%s]已添加至流量计[%s]", + "ORG_ZSTACK_FLOWMETER_10004": "虚拟路由器已添加到其他计流器中", + "ORG_ZSTACK_FLOWMETER_10005": "無效的類型參數是 %s,应該在 %s 中", + "ORG_ZSTACK_CONTAINER_10032": "失敗修补部署,因为 %s", + "ORG_ZSTACK_CONTAINER_10034": "失敗替换部署,因为 %s", + "ORG_ZSTACK_CONTAINER_10026": "刪除服務失敗,因为 %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10046": "失敗在网關[uuid:%s]中销毁分配网络,因为%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10047": "裸金属2实例[uuid:%s]未找到相应的网络接口卡 provisioning nic not found for baremetal2 instance[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10048": "無法为裸金属2实例[uuid:%s]在网關[uuid:%s]創建配置信息,因为%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10049": "未能刪除裸金属2实例[uuid:%s]在网關[uuid:%s]中的配置,因为%s", + "ORG_ZSTACK_IMAGEREPLICATOR_10000": "目標备份儲儲[uuid:%s]变得不可用", + "ORG_ZSTACK_GUESTTOOLS_10032": "無法更新虚拟機 [uuid:%s] 的guest tools状态,因为該虚拟機已被刪除", + "ORG_ZSTACK_ALIYUN_OSS_10002": "域名、密钥、密秘必須全部設置", + "ORG_ZSTACK_CONTAINER_10029": "API 錯誤誤: %s", + "ORG_ZSTACK_IMAGEREPLICATOR_10001": "一個或多個备份儲儲[uuid:%s]已被添加到复制组[uuid:%s]中", + "ORG_ZSTACK_ALIYUN_OSS_10003": "oss桶不为空!", + "ORG_ZSTACK_GUESTTOOLS_10030": "無法从虚拟機[uuid:%s]獲取guest-tools信息,因为这不是用戶虚拟機", + "ORG_ZSTACK_ALIYUN_OSS_10000": "ossBucket [%s] 已经添加到數据中心 [%s] 中", + "ORG_ZSTACK_GUESTTOOLS_10031": "無效調試參數: %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10045": "在网關[uuid:%s]准备提供网络时失敗,因为%s", + "ORG_ZSTACK_ALIYUN_OSS_10001": "OssBucket[%s] 没有綁定。", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10010": "both exportId 和 buildAppUuid 都被設置但它们不相等", + "ORG_ZSTACK_IMAGEREPLICATOR_10002": "备份儲儲[uuids:%s]不是ImageStore類型", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10040": "将圖像數据转换到本地磁碟失敗", + "ORG_ZSTACK_IMAGEREPLICATOR_10003": "备份儲儲[uuids:%s]未附加到任何區域", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10041": "裸金属2实例[uuid:%s]在裸金属2機箱[uuid:%s]上转换卷失敗,超时 %s 分钟後仍未完成", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10035": "獲取卷[uuid:%s]的iSCSI目標iqn或网關IP从主要儲儲[uuid:%s]失敗", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10037": "機箱:%s 磁碟缺少wwn信息,請检查機箱後再次嘗試", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10031": "失敗从裸金属2实例[uuid:%s]解綁分配的网络接口至綁定通過网關[uuid:%s],因为 %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10032": "裸金属2实例[uuid:%s]未連接,無法附加提供者网卡到聚合网卡", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10033": "未能将分配的网卡附加到裸金属2实例[uuid:%s](uuid:%s)上的綁定接口,因为%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10030": "裸金属2实例[uuid:%s]未連接,無法分离綁定的提供网络接口", + "ORG_ZSTACK_CONTAINER_10051": "未能为帳號[uuid:%s]找到k8s客戶端", + "ORG_ZSTACK_CONTAINER_10050": "叢叢 %s 的 kube 配置为空", + "ORG_ZSTACK_CONTAINER_10052": "失敗使用kube配置文件内容: %s", + "ORG_ZSTACK_CORE_PROGRESS_10000": "參數 apiId[%s] 不是一個有效的UUID。", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10029": "刪除转换卷到機箱本地磁碟配置在网關[uuid:%s]中失敗,针对裸金属2实例[uuid:%s]", + "ORG_ZSTACK_CONTAINER_10056": "無法找到容器备份儲儲对象[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10024": "分配的 IP %s 不可用,它無法連接到网關 %s,詳情:%s", + "ORG_ZSTACK_CONTAINER_10047": "獲取服務[%s]的状态包失敗", + "ORG_ZSTACK_CONTAINER_10049": "無法找到叢叢:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10027": "通過网關[uuid:%s]检查裸金属2機箱由实例[uuid:%s]时失敗,因为%s", + "ORG_ZSTACK_STORAGE_CBT_10020": "意外的虚機[uuid: %s]状态: %s,预期的虚機状态是運行中。", + "ORG_ZSTACK_STORAGE_CBT_10021": "該虚拟機[uuid: %s]已創建备份任務,無法同时啟用CBT任務。", + "ORG_ZSTACK_STORAGE_CBT_10016": "没有宿主機類型 for VM %s", + "ORG_ZSTACK_STORAGE_CBT_10017": "没有找到類型为[%s]的CbtBackupFactory", + "ORG_ZSTACK_STORAGE_CBT_10014": "VM [uuid: %s] 已由任務: %s 保护", + "ORG_ZSTACK_STORAGE_CBT_10015": "創建 cbt 卷失敗。詳細信息是: %s", + "ORG_ZSTACK_STORAGE_CBT_10018": "Cbt任務未找到[uuid: %s]", + "ORG_ZSTACK_STORAGE_CBT_10019": "Cbt任務[uuid: %s]已啟用,請先禁用它。", + "ORG_ZSTACK_CONTAINER_10000": "容器备份儲儲不支持 %s", + "ORG_ZSTACK_CONTAINER_10002": "未找到終端節點[%s]所在的區域", + "ORG_ZSTACK_IAM2_RBAC_10006": "操作[%s]被拒绝", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10008": "獲取虚网络[uuid:%s]在tf控制器失敗", + "ORG_ZSTACK_IAM2_RBAC_10001": "自从项目開始强制使用安全组以来,VM操作需要系統統標签", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10009": "更新 tf l2 网络[name:%s] 到 tf 控制器失敗", + "ORG_ZSTACK_IAM2_RBAC_10000": "創建虚拟機实例失敗,因为三层网络[uuid:%s]未綁定任何叢叢", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10006": "在 tf 控制器上創建 tf l2 网络[name:%s]失敗", + "ORG_ZSTACK_IAM2_RBAC_10003": "项目[uuid:%s]已退役,拒绝所有操作", + "ORG_ZSTACK_IAM2_RBAC_10002": "帳號[uuid:%s]的项目不儲在", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10005": "獲取项目[uuid:%s]在tf控制器失敗", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10002": "獲取 tf 控制器的默認域失敗", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10003": "在 tf 控制器上为 zStack 管理員創建 tf 项目失敗", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10000": "tf sdn控制器已经儲在。", + "ORG_ZSTACK_STORAGE_CBT_10012": "無法找到CBT任務[uuid: %s]的資源", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10001": "从 ZStack 數据库獲取默認管理員帳戶失敗", + "ORG_ZSTACK_STORAGE_CBT_10013": "主機未找到:%s", + "ORG_ZSTACK_STORAGE_CBT_10011": "卷[uuid:%s]对於vmInstance[uuid: %s]已经导出。", + "ORG_ZSTACK_STORAGE_CBT_10006": "無法找到 cbt 任務[uuid:%s]", + "ORG_ZSTACK_STORAGE_CBT_10009": "vm[uuid: %s] 正在運行,請先停止它再嘗試操作。", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10004": "參數 '%s' 的類型在表達式中錯誤誤,它必須是 %s 類型,但得到的是 %s", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10003": "缺少參數 '%s' 在表達式中", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10000": "無效表達式: %s, %s", + "ORG_ZSTACK_MONITORING_TRIGGER_EXPRESSION_10001": "無效表達式: %s, 未找到表達式", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10019": "在 tf 控制器上添加 tf l3 子网[name:%s]失敗,原因:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10082": "裸金属2网關[uuid:%s]未連接,無法为实例[uuid:%s]生成控制台地址", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10016": "更新 tf l3 网络[name:%s] 在 tf 控制器上失敗,原因:%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10013": "刪除 tf l3 网络[name:%s] 在 tf 控制器失敗,原因:%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10011": "刪除 tf l2 网络[uuid:%s] 在 tf 控制器失敗", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10080": "准备在网關[uuid:%s]中配置分配网络[uuid:%s]失敗:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10081": "裸金属服務器实例[uuid:%s]不儲在,無法生成其控制台地址", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10007": "buildAppUuid 和 exportId 不能同时为 null", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10006": "both backupStorageUuid 和 hostname 都被設置,但它们不是同一主機", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10005": "找到多個主機名为 %s 的 imageStore,請使用 backupStorageUuid 代替", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10004": "無法找到主機名为:%s 的 imageStore", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10003": "both backupStorageUuid 和 hostname 都为空", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10002": "dataPath 必須以 '/' 開始,实际上得到了 [%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10001": "另一個构建系統統[uuid: %s, 名称: %s]在本機[%s]使用了地址[%s]", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10000": "构建应用[%s]正在导出或被导出,請先刪除它", + "ORG_ZSTACK_CAS_10000": "缺失cas驱動的属性", + "ORG_ZSTACK_CAS_10002": "錯誤誤的虚拟ID[name:%s], 不儲在或密碼錯誤誤", + "ORG_ZSTACK_CONTAINER_10020": "刪除网络策略失敗,因为 %s", + "ORG_ZSTACK_CAS_10001": "不支持的 cas 驱動: %s", + "ORG_ZSTACK_CONTAINER_10022": "叢叢ID在創建网络策略时为空", + "ORG_ZSTACK_CAS_10003": "在CAS中不儲在此類别[%s]", + "ORG_ZSTACK_CONTAINER_10024": "失敗創建网络策略,因为 %s", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10009": "在构建导出历史中不儲在該 exportId", + "ORG_ZSTACK_CONTAINER_10023": "無法通過叢叢ID: %s 獲取 ApiClient", + "ORG_ZSTACK_APPCENTER_BUILDSYSTEM_10008": "buildAppUuid 和 buildSystemUuid 不能同时为 null", + "ORG_ZSTACK_CONTAINER_10015": "失敗刪除部署,因为 %s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10079": "叢叢[uuid:%s]的hypervisorType不是%s", + "ORG_ZSTACK_CONTAINER_10017": "無法找到命名空間为[%s]下的pod[name:%s]", + "ORG_ZSTACK_CONTAINER_10016": "刪除部署失敗,但没有錯誤誤信息", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10075": "獲取访问路径[iscsiPath: %s]的网關IP地址失敗,块磁碟卷%s的原因是%s", + "ORG_ZSTACK_CONTAINER_10018": "失敗将標签添加到Pod,因为%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10076": "失敗通過网關[uuid:%s]从物理機2实例[uuid:%s]解綁磁碟[uuid:%s],因为%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10028": "在 TF 控制器上向 l3 网络 [名称:%s] 添加 DNS 失敗,原因:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10077": "失敗在网關[uuid:%s]销毁裸金属实例[uuid:%s]的卷[uuid:%s]时,因为%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10078": "所有主儲儲[uuid:%s]的ceph监视器均不在連接状态", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10072": "裸金属服務器实例[uuid:%s]未連接,無法为其附加磁碟", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10073": "無法獲取外部主儲儲的卷LUN ID", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10025": "从 l3 网络 [名称:%s] 在 tf 控制器上刪除主機路由失敗,原因:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10074": "未能在网關[uuid:%s]中为物理機2实例[uuid:%s]獲取卷[uuid:%s]的lunid,因为%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10022": "在 tf 控制器上向 l3 网络 [名称:%s] 添加主機路由器失敗,原因:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10070": "失敗通過网關[uuid:%s]将卷[uuid:%s]附加到裸金属实例[uuid:%s],因为%s", + "ORG_ZSTACK_FLOWMETER_10021": "%s 必須是數字", + "ORG_ZSTACK_LOG4J2_10001": "未知的 log4j2 追加器類型 %s", + "ORG_ZSTACK_LOG4J2_10000": "没有找到适用於 log4j2 追加器類型的工厂:%s.", + "ORG_ZSTACK_CONTAINER_10011": "未找到对应 uuid[%s] 的主機", + "ORG_ZSTACK_CONTAINER_10013": "無法找到容器管理端點VO[uuid:%s]", + "ORG_ZSTACK_CONTAINER_10012": "没有为[%s]供应商找到提供者", + "ORG_ZSTACK_CONTAINER_10004": "主機[%s]不属於終端[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10068": "失敗通過网關[uuid:%s]为物理機2实例[uuid:%s]准备卷[uuid:%s],因为%s", + "ORG_ZSTACK_CONTAINER_10005": "未在終端節點[%s]找到叢叢", + "ORG_ZSTACK_CONTAINER_10008": "失敗於为叢叢[%s]列出節點:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10064": "失敗将网卡[uuid:%s]綁定到裸金属实例[uuid:%s]通過网關[uuid:%s],因为%s", + "ORG_ZSTACK_CONTAINER_10007": "區[%s]与終端點[%s]不相同", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10065": "裸金属2实例[uuid:%s]未連接,無法从中detach网卡", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10066": "失敗通過网關[uuid:%s]从裸金属服務器实例[uuid:%s]分离网络接口[nic uuid:%s],因为%s", + "ORG_ZSTACK_CONTAINER_10009": "叢叢[%s]已在終端點[%s]中儲在,但區域不同[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10060": "請確保所有裸金属2网關在分配网络[uuid:%s]上均已連接。", + "ORG_ZSTACK_CONFIGURATION_10011": "不支持的主要儲儲分配策略[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10061": "vmInstanceUuids 是空的", + "ORG_ZSTACK_CONFIGURATION_10010": "不支持的主機分配策略[%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10062": "裸金属2网關[UUID:%s, 状态:%s]未連接", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10063": "裸金属2实例[uuid:%s]未連接,無法将其附加网卡", + "ORG_ZSTACK_SUGONSDNCONTROLLER_CONTROLLER_10031": "从 to L3 网络[name:%s] 在 tf 控制器上刪除 DNS 失敗:%s", + "ORG_ZSTACK_STORAGE_BACKUP_10119": "installPath 和 bsUrl 都是必需的", + "ORG_ZSTACK_STORAGE_BACKUP_10118": "不允許从备份覆盖數据库", + "ORG_ZSTACK_STORAGE_BACKUP_10117": "數据库备份[uuid%s]已从备份儲儲[uuid:%s]导出", + "ORG_ZSTACK_STORAGE_BACKUP_10116": "數据库备份[uuid%s]尚未从备份儲儲[uuid:%s]导出", + "ORG_ZSTACK_STORAGE_BACKUP_10115": "當前备份儲儲状态[%s]不允許執行消息[%s],允許的状态为%s", + "ORG_ZSTACK_STORAGE_BACKUP_10114": "無法通過SSH密钥連接Peer節點,請检查連接", + "ORG_ZSTACK_STORAGE_BACKUP_10113": "带宽必須是正數", + "ORG_ZSTACK_STORAGE_BACKUP_10112": "缺少作业參數中的'remoteRetentionValue'", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10039": "VM[uuid:%s] 没有停止且不在特定主機上運行。", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10007": "無法从内置安全管理員中移除内置安全管理員角色。", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10038": "卷[uuid:%s]已被挂载到一些未停止且未在特定主機上運行的VM(s)[uuid:%s]。", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10008": "無法移除内置系統統管理員角色从内置系統統管理員中", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10009": "無法刪除内置審计管理員。", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10003": "初始用戶的名称不能被更新", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10034": "無法在主機 %s 上找到卷 %s 的复制", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10004": "%s 是保留名称,請使用其他名称", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10037": "主儲儲 UUID 不能为 null。", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10036": "無效的資源Uuid %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10006": "無法移除内置審计管理員角色从内置審计管理員權限。", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10042": "迷你儲儲[uuid:%s]在从zbox恢复位之前必須为空,請清理它。", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10001": "没有找到 fluentbit 輸出類型:%s 的工厂。", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10010": "無法刪除内置安全管理員。", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10041": "没有支持宿主機[%s]和备份儲儲類型[%s]的LocalStorageBackupStorageMediator", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10011": "無法刪除内置系統統管理員", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10003": "主機不能为 null", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10012": "確認您想要添加的角色具有相同的身份", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10002": "未知 fluentbit 輸出類型 %s", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10013": "無法添加角色:%s 与身份:%s 到虚拟ID[uuid:%s]", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10005": "端口不能为 null", + "ORG_ZSTACK_APPCENTER_UTILS_10000": "無法找到原始模板 JSON 文件:%s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10004": "日誌服務器 [地址: %s]不可用", + "ORG_ZSTACK_APPCENTER_UTILS_10001": "無法創建 JSON 模板", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10040": "失敗執行 %s 操作,因为主機[uuid:%s]未啟用且不在連接状态。", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10007": "新的配置有錯誤誤,导致服務异常。請再次检查配置參數,詳情:%s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_10006": "日誌服務器的創建失敗,可能是因为传入的新配置參數不正確导致 Fluent Bit 服務处於非活動状态。請双检查配置以確保其准確性", + "ORG_ZSTACK_STORAGE_BACKUP_10111": "缺少作业參數中的'remoteRetentionType'", + "ORG_ZSTACK_STORAGE_BACKUP_10110": "缺少作业參數中的'retentionValue'", + "ORG_ZSTACK_STORAGE_BACKUP_10129": "没有找到带有根卷UUID: %s 的VM", + "ORG_ZSTACK_STORAGE_BACKUP_10124": "在卷[uuid:%s]中未找到对应的VM", + "ORG_ZSTACK_STORAGE_BACKUP_10123": "操作不支持在共享卷上进行", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10028": "没有备份儲儲可以獲取卷[uuid:%s]的镜像[uuid:%s]", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10005": "不能找到 JoinType", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10029": "圖像[uuid: %s]没有与备份儲儲[uuid: %s]相關的镜像引用", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10000": "从 [%s] 的輸出为空", + "ORG_ZSTACK_ZQL_AST_PARSER_VISITORS_10001": "調用操作[%s]失敗,原因: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10023": "期望在主機[%s]上執行操作,但只有主機%s已連接且啟用", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10002": "操作: %s, 对角色身份: %s 不受支持", + "ORG_ZSTACK_STORAGE_BACKUP_10120": "數据库备份[uuid:%s]未啟用且未就绪", + "ORG_ZSTACK_STORAGE_SNAPSHOT_REFERENCE_10000": "卷[uuid: %s]已被其他卷[%s]引用,在扁平化它们及其後代之前,無法更改安装路径", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10017": "必需的叢叢 %s 未綁定到主要儲儲 %s 以創建卷 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10016": "卷[uuid:%s]的复制网络状态運行到独立模式,但所有主機都是連接状态,請先恢复它。", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10018": "無法在所需的叢叢 %s 中找到可用的主機用於創建卷 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10013": "主機[uuid: %s]的迷你主儲儲[uuid: %s]没有足够的容量[current: %s 字節, needed: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10017": "裸金属2网關[uuid:%s]与叢叢[uuid:%s]不在同一個可用區中", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10012": "無法为主機[uuid: %s]预留足够的空間用於主儲儲[uuid: %s],物理容量不足", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10018": "無法更改依赖於它的裸金属2网關[UUID:%s]的叢叢,在其上有運行中的实例", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10015": "卷[uuid:%s]的复制正在同步數据,請等待直到同步完成。", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10019": "叢叢[%s]不是baremetal2類型", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10014": "無法找到可用的主機来調整卷[uuid: %s]在迷你儲儲[uuid: %s]上的大小", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10013": "叢叢[uuid:%s] 不儲在", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10014": "叢叢[uuid:%s] 不是裸金属2叢叢", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10022": "無法在主機 %s 上分配儲儲同步端口:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10015": "网關[uuid:%s]不儲在", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10021": "無法找到可用主機来執行命令以執行主要儲儲[uuid: %s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10016": "裸金属2网關[uuid:%s]已儲在於叢叢[uuid:%s]中", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10010": "裸金属2网關[uuid:%s]只能綁定一個叢叢", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10011": "裸金属2网關[uuid:%s]未連接至叢叢[uuid:%s], 無需斷開連接", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10012": "裸金属2网關[uuid:%s]现在只連接了一個叢叢,請勿斷開連接", + "ORG_ZSTACK_STORAGE_BACKUP_10108": "缺少 'retentionType' 和 'retentionValue' 在作业參數中", + "ORG_ZSTACK_STORAGE_BACKUP_10107": "意外的备份儲儲 UUID: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10106": "作业參數 'backupStorageUuids' 为空", + "ORG_ZSTACK_STORAGE_BACKUP_10105": "缺少作业參數 'backupStorageUuids'", + "ORG_ZSTACK_STORAGE_BACKUP_10104": "缺少作业參數", + "ORG_ZSTACK_STORAGE_BACKUP_10103": "意外的任務状态: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10102": "同步任務失敗。", + "ORG_ZSTACK_STORAGE_BACKUP_10101": "數据库备份[uuid:%s]在备份儲儲[uuid:%s]中未找到", + "ORG_ZSTACK_LOGIN_PLUGIN_10002": "缺少 LoginUserInfo 當使用插件登录时", + "ORG_ZSTACK_LOGIN_PLUGIN_10001": "未找到名为 %s 的登录插件", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10005": "迷你儲儲[uuid:%s, name:%s]無法在關聯的叢叢中找到可用主機以实例化卷", + "ORG_ZSTACK_LOGIN_PLUGIN_10000": "缺少登录插件名称", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10007": "無法確定哪個主機", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10002": "主機[uuid:%s]未連接", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10014": "無法为项目[uuid:%s]添加管理員權限[uuids:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10006": "儲在一個裸金属2网關具有管理IP %s", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10001": "仍然儲在缓儲卷在ps[uuid:%s]上,無法更新缓儲卷url", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10015": "該操作不允許由虚拟-ID[uuid:%s]的白名单所允許", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10007": "主機具有管理IP %s", + "ORG_ZSTACK_KVM_10110": "主機[ip:%s]已被接管,因为數据库中儲在標識[HostUuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10004": "資源類型 [%s] 在 APIRecoverResourceSplitBrainMsg 中無效。", + "ORG_ZSTACK_PRIVILEGE_ADMIN_10016": "該操作被虚拟ID的黑名单[uuid:%s]拒绝", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10008": "無法将裸金属2网關[uuid:%s]附加到非裸金属2叢叢[uuid:%s]", + "ORG_ZSTACK_KVM_10111": "無法獲取主機CPU架构,請检查用戶名/密碼是否正確;%s", + "ORG_ZSTACK_STORAGE_BACKUP_10109": "缺少 'retentionType' 在作业參數中", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10009": "裸金属2网關[uuid:%s]已連接至叢叢[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10002": "已经在使用管理IP %s的裸金属PXE服務器,請勿用於創建裸金属2网關", + "ORG_ZSTACK_KVM_10103": "無法連接到 KVM[ip:%s, 用戶名:%s, SSH端口:%d] 執行 DNS 检查,請检查用戶名/密碼是否正確;%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10004": "管理IP[%s]既不是有效的IPv4地址也不是主機名", + "ORG_ZSTACK_KVM_10104": "在 %s 中無法ping通所有DNS/IP;請检查 /etc/resolv.conf 確保您的主機能够访问公共互聯网", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10010": "未找到連接的主機,迷你儲儲失敗", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_10005": "無法在非裸金属2叢叢[uuid:%s]中添加裸金属2网關", + "ORG_ZSTACK_KVM_10105": "無法連接到 KVM[ip:%s, 用戶名:%s, SSH端口:%d]以检查管理節點的連通性,請检查用戶名/密碼是否正確;%s", + "ORG_ZSTACK_VPC_HA_VPCHAGC_10000": "VR[uuid: %s] 没有運行", + "ORG_ZSTACK_KVM_10106": "KVM 主機[ip:%s]無法访问管理節點的回調URL。看来KVM主機無法到達管理IP[%s]。%s %s", + "ORG_ZSTACK_VPC_HA_VPCHAGC_10001": "VR[uuid: %s] 未連接", + "ORG_ZSTACK_KVM_10107": "無法检查是否主機被接管,因为 %s", + "ORG_ZSTACK_KVM_10108": "無法獲取標誌的时間戳,因为 %s", + "ORG_ZSTACK_KVM_10109": "主機[ip:%s]已被接管,因为接管標誌[HostUuid:%s]已经儲在,並且utime[%d]尚未超過主機心跳間隔[%d]", + "ORG_ZSTACK_STORAGE_BACKUP_10100": "其中一個备份儲儲[uuids: %s, %s]处於状态%s,無法執行同步操作", + "ORG_ZSTACK_AUTOSCALING_GROUP_10009": "实例配置[uuid:%s]已禁用,無法从中創建虚拟機", + "ORG_ZSTACK_AUTOSCALING_GROUP_10008": "一個資源無法被找到,詳情:資源[uuid:%s, 類型:InstanceOfferingVO]未找到", + "ORG_ZSTACK_AUTOSCALING_GROUP_10007": "一個資源無法被找到,詳情:資源[uuid:%s, 類型:AutoScalingVmTemplateVO]未找到", + "ORG_ZSTACK_AUTOSCALING_GROUP_10006": "自動扩展组[%s]将新建的VM添加到安全组失敗,錯誤誤信息为%s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10005": "添加虚拟機网络接口到安全组失敗,無法找到安全组[uuid=%s]。", + "ORG_ZSTACK_AUTOSCALING_GROUP_10004": "自動扩展组[%s]将新建的虚拟機添加到负载均衡器失敗完全,錯誤誤信息是%s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10003": "添加虚拟機网络接口到负载均衡失敗,無法找到具有以下UUID的负载均衡[uuids=%s]。", + "ORG_ZSTACK_AUTOSCALING_GROUP_10002": "自動扩展组[%s]創建实例完全失敗,錯誤誤信息是%s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10000": "在同一伸縮组中,同一时間只能執行一個伸縮活動。", + "ORG_ZSTACK_KVM_10120": "主機[uuid:%s]的%s变更,旧值:%s,新值:%s", + "ORG_ZSTACK_KVM_10121": "主機[uuid:%s]变为關閉状态,發送通知", + "ORG_ZSTACK_KVM_10112": "主機CPU架构[%s]与叢叢[%s]不匹配", + "ORG_ZSTACK_STORAGE_PRIMARY_MINISTORAGE_10000": "無效路径字符串 %s", + "ORG_ZSTACK_KVM_10115": "主機 [uuid:%s] 無法添加到叢叢 [uuid:%s],因为 QEMU/Libvirt 版本不匹配", + "ORG_ZSTACK_KVM_10117": "主機 [uuid:%s] 無法添加到叢叢 [uuid:%s],因为 CPU 模型名称不匹配", + "ORG_ZSTACK_KVM_10119": "無法在 /proc/cpuinfo 中找到 'vmx' 或 'svm',請確保已在其 BIOS 設置中啟用虚拟化功能", + "ORG_ZSTACK_AUTOSCALING_GROUP_10019": "一個資源無法被找到,詳情:資源[uuid:%s, 類型:L3NetworkVO]未找到", + "ORG_ZSTACK_AUTOSCALING_GROUP_10018": "磁碟配置项[uuids:%s]已禁用,無法从中創建虚拟機", + "ORG_ZSTACK_AUTOSCALING_GROUP_10017": "一個資源無法被找到,詳情:資源[uuid:%s, 類型:DiskOfferingVO]未找到", + "ORG_ZSTACK_AUTOSCALING_GROUP_10016": "[image[uuid:%s] 是系統統镜像,無法用於創建用戶VM]", + "ORG_ZSTACK_AUTOSCALING_GROUP_10015": "rootDiskOfferingUuid 不能为 null 當 image mediaType 是 ISO 时", + "ORG_ZSTACK_AUTOSCALING_GROUP_10014": "圖像[uuid:%s]的mediaType为:%s,仅限使用RootVolumeTemplate和ISO創建VM", + "ORG_ZSTACK_AUTOSCALING_GROUP_10013": "圖像[uuid:%s]尚未就绪,無法从中創建虚機", + "ORG_ZSTACK_AUTOSCALING_GROUP_10012": "圖像[uuid:%s]已禁用,無法从中創建虚機", + "ORG_ZSTACK_AUTOSCALING_GROUP_10011": "一個資源無法被找到,詳情:資源[uuid:%s, 類型:ImageVO]未找到", + "ORG_ZSTACK_AUTOSCALING_GROUP_10010": "实例配置[uuid:%s, 類型:%s] 不是 UserVm 類型,無法从中創建虚拟機", + "ORG_ZSTACK_KVM_10130": "失敗将磁碟附加到主機,因为:%s", + "ORG_ZSTACK_KVM_10131": "从主機分离磁碟失敗,因为:%s", + "ORG_ZSTACK_KVM_10132": "vm[%s] fstrim 失敗,原因:%s", + "ORG_ZSTACK_KVM_10123": "主機[%s]在%d秒内未關閉", + "ORG_ZSTACK_KVM_10125": "失敗在主機[uuid:%s]上检查文件%s", + "ORG_ZSTACK_KVM_10126": "主機处於预维护状态,無法更新操作系統統", + "ORG_ZSTACK_KVM_10127": "主機不在連接状态,無法更新操作系統統", + "ORG_ZSTACK_COMPUTE_BONDING_10022": "需要其中一個 slaveUuids 或 slaveNames", + "ORG_ZSTACK_COMPUTE_BONDING_10021": "在主機[uuid:%s]上不儲在接口[%s]", + "ORG_ZSTACK_VMWARE_10069": "实例UUID [%s] 未找到", + "ORG_ZSTACK_COMPUTE_BONDING_10020": "在从属名称中不儲在該接口於主機上", + "ORG_ZSTACK_VMWARE_10067": "vm [%s] 未找到", + "ORG_ZSTACK_COMPUTE_BONDING_10026": "無法刪除对应的管理网络綁定。", + "ORG_ZSTACK_VMWARE_10064": "VM未找到: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10029": "需要跳過自動扩展组活動", + "ORG_ZSTACK_COMPUTE_BONDING_10025": "無效的綁定類型[%s]", + "ORG_ZSTACK_VMWARE_10065": "失敗關閉来宾:%s, %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10028": "無法找到刪除的目標实例列表", + "ORG_ZSTACK_VMWARE_10062": "失敗恢复虚拟機,任務状态: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10027": "实例數量超過限制", + "ORG_ZSTACK_COMPUTE_BONDING_10023": "無法将 SR-IOV 接口 [%s] 添加到 Bonding,因为選擇了多個 SR-IOV 設备", + "ORG_ZSTACK_VMWARE_10063": "失敗恢复虚拟機 [%s]:%s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10026": "自動扩展组[%s]销毁实例[%s]完全失敗,錯誤誤信息为%s", + "ORG_ZSTACK_VMWARE_10060": "失敗暫停虚拟機 [%s]: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10025": "自動扩展组[%s]未綁定任何虚拟機模板", + "ORG_ZSTACK_COMPUTE_BONDING_10029": "無法向bond[%s]添加新的接口,因为其中已包含一個啟用了SR-IOV的接口", + "ORG_ZSTACK_AUTOSCALING_GROUP_10024": "自動扩展组[%s]状态錯誤誤,预期:%s状态", + "ORG_ZSTACK_COMPUTE_BONDING_10028": "不能在bond[%s]中重复綁定接口。", + "ORG_ZSTACK_AUTOSCALING_GROUP_10023": "默認L3网络UUID[uuid:%s]不在l3NetworkUuids %s 中", + "ORG_ZSTACK_SNS_PLATFORM_DINGTALK_10000": "失敗向钉钉發送消息。状态: %s, 内容: %s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10022": "在 l3NetworkUuids 中指定的三层网络超過一個,但 defaultL3NetworkUuid 为空", + "ORG_ZSTACK_KVM_10140": "失敗在KVM宿主機[uuid:%s]上为l2Network[uuid:%s, type:%s, vlan:%s]創建桥接[%s],因为%s", + "ORG_ZSTACK_COMPUTE_BONDING_10027": "無法刪除綁定有VTEP IP配置的聚合网口。", + "ORG_ZSTACK_KVM_10141": "失敗在KVM宿主機[uuid:%s]检查桥接[%s]对於l2VlanNetwork[uuid:%s, name:%s]时,%s", + "ORG_ZSTACK_AUTOSCALING_GROUP_10021": "l3Network[uuid:%s] 是系統統网络,無法在其上創建用戶VM", + "ORG_ZSTACK_AUTOSCALING_GROUP_10020": "l3网络[uuid:%s] 已禁用,無法在其上創建虚機", + "ORG_ZSTACK_KVM_10143": "失敗刪除桥接[%s]对於l2网络[uuid:%s, 類型:%s, vlan:%s]在kvm主機[uuid:%s]上,因为%s", + "ORG_ZSTACK_KVM_10144": "失敗啟動VM,因为無法在vm.cpuMode为none时禁用vm.cpu.hypervisor.feature", + "ORG_ZSTACK_KVM_10134": "XML挂钩[%s]已在虚拟機%s上設置,請先解除綁定再刪除", + "ORG_ZSTACK_KVM_10136": "XML 類型的系統統挂钩不允許进行操作", + "ORG_ZSTACK_KVM_10137": "XML挂钩名称[%s]已儲在", + "ORG_ZSTACK_KVM_10138": "有一個 KVM 主機具有管理 IP[%s]", + "ORG_ZSTACK_KVM_10139": "無法在 %s 上創建 VLAN 設备,因为它太長", + "ORG_ZSTACK_VMWARE_10059": "失敗挂起虚拟機,任務状态: %s", + "ORG_ZSTACK_COMPUTE_BONDING_10033": "L2网络 [uuid:%s] 未找到", + "ORG_ZSTACK_BILLING_10008": "起始日期必須晚於結束日期", + "ORG_ZSTACK_COMPUTE_BONDING_10032": "不能在bond[%s]中重复分离接口。", + "ORG_ZSTACK_COMPUTE_BONDING_10031": "無法分离在鏈路[%s]中的接口[%s],該鏈路已被綁定。", + "ORG_ZSTACK_COMPUTE_BONDING_10030": "無法将 SR-IOV 接口 [%s] 添加到 Bonding 中,因为仅允許 bond 内的一個接口啟用 SR-IOV", + "ORG_ZSTACK_BILLING_10005": "计費已禁用", + "ORG_ZSTACK_COMPUTE_BONDING_10037": "無法将 L2 网络附加到叢叢[uuid:%s]。主機[uuid:%s]上的接口[uuid:%s, name:%s]具有服務類型關聯,但不包括 TenantNetwork 服務類型", + "ORG_ZSTACK_BILLING_10004": "不支持的计費資源類型 [%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10036": "無法将 L2 网络附加到叢叢[uuid:%s]。主機[uuid:%s]上綁定接口[uuid:%s, name:%s]具有綁定服務類型關聯,但不包括租戶网络服務類型", + "ORG_ZSTACK_BILLING_10003": "請設置正確的 priceUserConfig,例如:priceUserConfig:{\\nvolume:{\\npriceKeyName:\"价格键名称\"}}", + "ORG_ZSTACK_COMPUTE_BONDING_10035": "無法将 L2 网络附加到叢叢 [uuid:%s]:一個或多個主機上的物理接口 [%s] 被綁定使用。冲突的主機: [%s]", + "ORG_ZSTACK_VMWARE_10051": "vmUuid [%s] 在 ESX 主機 [%s] 中未找到", + "ORG_ZSTACK_BILLING_10002": "請設置正確的 priceUserConfig,例如:priceUserConfig:{\\nrootVolume:{\\npriceKeyName:\"价格键名称\"}}", + "ORG_ZSTACK_COMPUTE_BONDING_10034": "L2网络[uuid:%s]儲在空的物理接口", + "ORG_ZSTACK_BILLING_10001": "dateInLong 小於 %s", + "ORG_ZSTACK_BILLING_10000": "价格键名称为 null", + "ORG_ZSTACK_VMWARE_10050": "同步与VCenter[uuid:%s],請稍後重試。", + "ORG_ZSTACK_KVM_10150": "無法从消息 %s 獲取 vmUuid", + "ORG_ZSTACK_KVM_10151": "無法在主機[uuid:%s, ip:%s]上執行vm同步因为%s", + "ORG_ZSTACK_COMPUTE_BONDING_10038": "在主機[uuid:%s]上添加Linux綁定失敗:%s", + "ORG_ZSTACK_KVM_10152": "The vm[%s]状态已在長时間内处於關閉状态,請检查vm是否正常", + "ORG_ZSTACK_AUTOSCALING_GROUP_10032": "不支持的 RemovalPolicy[%s] 類型", + "ORG_ZSTACK_V2V_VMWARE_10015": "在主機 %s 的 CIDR %s 中未找到可用的 IP 地址,請嘗試重新連接主機以刷新 IP 地址", + "ORG_ZSTACK_KVM_10154": "失敗在KVM宿主機[uuid:%s]更新桥接[%s]对於l2Network[uuid:%s, name:%s]时發生錯誤誤,%s", + "ORG_ZSTACK_V2V_VMWARE_10016": "已经有長期任務[uuid:%s]正在将虚拟機从%s转换中", + "ORG_ZSTACK_AUTOSCALING_GROUP_10030": "刪除自動扩展規则[%s]的触發器失敗,錯誤誤是%s", + "ORG_ZSTACK_V2V_VMWARE_10017": "更新转换主機依赖關系統失敗", + "ORG_ZSTACK_KVM_10146": "失敗将安全组規则应用到KVM宿主機[uuid:%s],因为%s", + "ORG_ZSTACK_KVM_10147": "在 KVM 主機[uuid:%s]上检查安全组的默認規则时失敗,因为%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10101": "無法指定HTTP重定向时分配重定向端口或状态碼", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_KOAL_10009": "未能检测到心跳,代碼:%s,詳情:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10104": "l4[%s] 负载均衡监听器[%s] 不支持修改会话持久性状态", + "ORG_ZSTACK_IAM2SCRIPT_10010": "指定的脚本執行器不支持。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10105": "無法同时支持 HTTP 重定向和 HTTPS 以及会话保持", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10102": "在指定HTTP重定向时,不支持除HTTP以外的其他协议", + "ORG_ZSTACK_VMWARE_10048": "主機未連接", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10108": "监听器[%s]修改了会话持久性,必須指定负载均衡算法", + "ORG_ZSTACK_V2V_VMWARE_10007": "解析 URL %s 失敗", + "ORG_ZSTACK_COMPUTE_BONDING_10044": "在主機[uuid:%s]上将网卡附加到Linux綁定时失敗: %s", + "ORG_ZSTACK_VMWARE_10046": "無法分离网卡因为該网卡不支持在 vCenter 中热插拔", + "ORG_ZSTACK_BILLING_10019": "gpu价格必須綁定到gpu uuid %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10109": "监听器[%s] %s 算法不支持修改会话持久性,除非明確指派iphash", + "ORG_ZSTACK_V2V_VMWARE_10008": "數据中心名称不能包含这些字符 %s", + "ORG_ZSTACK_IAM2SCRIPT_10002": "脚本内容为空。", + "ORG_ZSTACK_BILLING_10018": "GPU价格必須綁定到空的GPU UUID", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10106": "监听器[%s]在HTTP模式为http-tunnel时無法修改会话持久性重寫", + "ORG_ZSTACK_V2V_VMWARE_10009": "目標虚拟機名称不能包含这些字符 %s", + "ORG_ZSTACK_IAM2SCRIPT_10001": "解碼脚本内容失敗。", + "ORG_ZSTACK_COMPUTE_BONDING_10042": "从主機[uuid:%s]移除Linux綁定失敗:%s", + "ORG_ZSTACK_VMWARE_10044": "主機CPU/软件不兼容", + "ORG_ZSTACK_BILLING_10017": "价格必須为 0.0 和 999999999.99", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10107": "监听器[%s]将会话持久性更改为iphash模式,必須指定源负载均衡算法", + "ORG_ZSTACK_VMWARE_10045": "检查与虚拟機 %s 的兼容性失敗於主機 %s", + "ORG_ZSTACK_BILLING_10016": "最小資源单位是兆字節,不能是字節", + "ORG_ZSTACK_SDNCONTROLLER_10008": "sdn l2网络[uuid:%s]未連接控制器", + "ORG_ZSTACK_IAM2SCRIPT_10007": "IAM2 脚本函數未啟用。", + "ORG_ZSTACK_BILLING_10015": "資源名称[%s]無效", + "ORG_ZSTACK_IAM2SCRIPT_10005": "無法读取脚本運行的結果。", + "ORG_ZSTACK_COMPUTE_BONDING_10046": "从主機[uuid:%s]分离Linux綁定的网络接口卡时失敗: %s", + "ORG_ZSTACK_VMWARE_10040": "缺少目標主機UUID。", + "ORG_ZSTACK_IAM2SCRIPT_10004": "運行 iam2 脚本失敗。", + "ORG_ZSTACK_VMWARE_10041": "目標主機不是 ESX 主機。", + "ORG_ZSTACK_KVM_10161": "意外的VNC端口编號[%d]对於VM [uuid:%s]", + "ORG_ZSTACK_IAM2SCRIPT_10009": "參數的數量超過限制。", + "ORG_ZSTACK_IAM2SCRIPT_10008": "脚本没有任何内容。", + "ORG_ZSTACK_SDNCONTROLLER_10000": "無法創建SDN L2网络,因为API消息中缺少systemTags里的SDN控制器UUID", + "ORG_ZSTACK_V2V_VMWARE_10003": "叢叢名称不能包含这些字符 %s", + "ORG_ZSTACK_SDNCONTROLLER_10002": "無法找到二层网络[uuid:%s, 虚拟交换機類型:%s]的SDN控制器", + "ORG_ZSTACK_SDNCONTROLLER_10001": "無法創建SDN L2网络,因为API消息中缺少SDN控制器UUID", + "ORG_ZSTACK_V2V_VMWARE_10006": "失敗在进行虚拟機实例 %s 的迁移前停止該实例", + "ORG_ZSTACK_KVM_10157": "回复[%s]不是KVMHostAsyncHttpCallReply", + "ORG_ZSTACK_KVM_10158": "回复[%s]返回空响应", + "ORG_ZSTACK_KVM_10159": "%s 操作失敗: %s", + "ORG_ZSTACK_HYBRID_NETWORK_10040": "EcsInstance 必須处於運行中或已停止状态才能刪除弹性公网IP", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10111": "监听器[%s]不支持修改空闲超时时間和cookie名称,必須指定会话持久性", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10112": "监听器[%s]在会话持久性未設置为插入时不支持修改空闲超时时間", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10110": "监听器[%s] %s 算法不支持修改会话持久性,除非明確禁用", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10115": "無效会话空闲超时[%s],它必須是一個在[%s~%s]范围内的數字", + "ORG_ZSTACK_COMPUTE_BONDING_10040": "在主機[uuid:%s]上更新Linux綁定失敗: %s", + "ORG_ZSTACK_VMWARE_10039": "缺少消息中的主機UUID", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10116": "HTTP 健康检查协议必須指定其健康的检查參數 healthCheckURI", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10113": "监听器[%s]在会话持久性不为重寫时不允許修改cookie名称", + "ORG_ZSTACK_VMWARE_10037": "没有找到 dvSwitch 或合格的 vSwitch", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10114": "监听器[%s]不支持在不修改cookie名称的情况下修改会话重寫", + "ORG_ZSTACK_VMWARE_10038": "數据儲儲 %s 在 vCenter %s 中未找到", + "ORG_ZSTACK_BILLING_10009": "資源類型和資源UUID不能同时为空", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10119": "無效的健康检查目標[%s],格式应为targetCheckProtocol:port,例如:tcp:default", + "ORG_ZSTACK_SDNCONTROLLER_10015": "由於 SDN 控制器類型:%s 不在支持列表:%s 中", + "ORG_ZSTACK_SDNCONTROLLER_10014": "無法添加安全组規则,因为远程安全组 SDN 控制器 UUID[:%s] 与安全组控制器 UUID[:%s] 不同", + "ORG_ZSTACK_VMWARE_10036": "未找到叢叢计算資源", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10117": "HTTP 健康检查协议期望的状态碼 [%s] 無效", + "ORG_ZSTACK_SDNCONTROLLER_10017": "由於 SDN 控制器已添加,因此無法添加該控制器 [IP:%s]", + "ORG_ZSTACK_VMWARE_10033": "SSL 握手与 vCenter [%s] 失敗,因为使用了不安全的 TLS 1.0。如需手動在 JDK 配置中啟用 TLS 1.0,請相应設置。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10118": "监听器不支持選擇安全策略,其使用的协议为 [%s]", + "ORG_ZSTACK_SDNCONTROLLER_10016": "由於 IP[%s] 不是单播地址,因此無法添加 SDN 控制器", + "ORG_ZSTACK_VMWARE_10034": "SSL握手与vCenter [%s]失敗,請检查端口编號[%d]。", + "ORG_ZSTACK_BILLING_10027": "计費已啟用,此操作仅允許在禁用状态下執行", + "ORG_ZSTACK_SDNCONTROLLER_10019": "無法将主機[uuid:%s]添加到SDN控制器[uuid:%s],因为未指定子网掩碼", + "ORG_ZSTACK_VMWARE_10031": "登录 vCenter [%s] 失敗,用戶 [%s] 請检查您的网络連接和憑證。", + "ORG_ZSTACK_BILLING_10026": "endDateInLong 不能早於 dateInLong", + "ORG_ZSTACK_SDNCONTROLLER_10018": "無法将主機[uuid:%s]添加到SDN控制器[uuid:%s],因为該主機已附属於SDN控制器", + "ORG_ZSTACK_VMWARE_10032": "解析响应失敗来自 vCenter [%s],請检查端口编號[%d]。", + "ORG_ZSTACK_BILLING_10025": "endDateInLong 已設置,不允許修改", + "ORG_ZSTACK_BILLING_10024": "endDateInLong 和 setEndDateInLongBaseOnCurrentTime 不允許同时設置", + "ORG_ZSTACK_VMWARE_10030": "連接 %s 失敗: %s", + "ORG_ZSTACK_BILLING_10023": "endDateInLong 不允許为负值", + "ORG_ZSTACK_BILLING_10022": "accountUuid/tableUuid 允許設置其中的一個", + "ORG_ZSTACK_BILLING_10021": "此 priceTable[uuid=%s] 不允許刪除", + "ORG_ZSTACK_BILLING_10020": "該帳號[uuid=%s]已綁定价格表", + "ORG_ZSTACK_LONGJOB_10007": "無法取消已成功完成的長任務", + "ORG_ZSTACK_SDNCONTROLLER_10011": "拉取租戶操作仅支持 H3C VCFC V2 控制器", + "ORG_ZSTACK_LONGJOB_10008": "無法取消失敗的長任務", + "ORG_ZSTACK_LONGJOB_10009": "刪除長期任務仅當其成功、取消或失敗时", + "ORG_ZSTACK_SDNCONTROLLER_10013": "無法将 vmnic 添加到安全组,因为它们具有不同的 SDN 控制器[nic 控制器 UUID:%s, 安全组控制器 UUID:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10012": "拉取租戶數据失敗: %s", + "ORG_ZSTACK_LONGJOB_10010": "仅在長期任務成功、取消或失敗时重新運行", + "ORG_ZSTACK_LONGJOB_10011": "只能恢复处於暫停状态的長任務", + "ORG_ZSTACK_LONGJOB_10012": "%s 没有对应的長任務", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10122": "雲無法更改负载均衡监听器,因为使用 [%s] 协议的监听器不支持選擇 HTTP 版本:[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10123": "雲無法更改负载均衡监听器,因为仅支持 HTTP 版本:[%s] 的 HTTPS 协议的监听器不允許更改", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10120": "监听器的协议 [%s] 不支持此健康检查:[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10121": "HTTP 健康检查协议必須指定其健康检查參數,包括 healthCheckMethod 和 healthCheckURI", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10126": "雲中無法更改负载均衡监听器,因为使用 [%s] 协议的监听器不支持壓縮内容", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10127": "雲中未能更改负载均衡监听器,因为仅支持壓縮算法[%s]", + "ORG_ZSTACK_VMWARE_10029": "登录失敗,請检查您的登录參數。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10124": "雲無法更改负载均衡监听器,因为仅支持 TCP 代理协议的 TCP 协议监听器不允許进行此操作", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10125": "雲中無法更改负载均衡监听器,因为仅支持 TCP 代理协议 %s", + "ORG_ZSTACK_VMWARE_10027": "VCenter[uuid:%s] 未找到:", + "ORG_ZSTACK_TAG_10004": "没有系統統標签与[%s]匹配,資源類型为[%s]", + "ORG_ZSTACK_SDNCONTROLLER_10026": "拉取租戶操作不支持 SDN 控制器[uuid:%s, 厂商類型:%s, 厂商版本:%s]。仅 H3C VCFC V2 控制器支持此操作", + "ORG_ZSTACK_LOG_10007": "未知日誌配置類型 %s", + "ORG_ZSTACK_SDNCONTROLLER_10025": "SDN控制器[uuid:%s]未找到", + "ORG_ZSTACK_TAG_10005": "驗證資源類型[%s]的系統統標签[%s]失敗", + "ORG_ZSTACK_LOG_10006": "未知日誌服務器配置類型 %s", + "ORG_ZSTACK_SDNCONTROLLER_10028": "無法更改 SDN 控制器,因为 VLAN 范围[%s]格式不正確", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10128": "無效的 IP 版本[%s],它必須是%s或%s", + "ORG_ZSTACK_LOG_10005": "該帳戶[uuid:%s]未被授權添加更多的日誌服務器。只有管理員帳號才有此權限。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10129": "無法刪除默認服務器组[uuid:%s]", + "ORG_ZSTACK_LOG_10004": "访问被拒:帳號[uuid:%s]無權獲取管理節點日誌。仅管理員帳號拥有此權限。", + "ORG_ZSTACK_TAG_10008": "標签[%s]仅限管理員使用", + "ORG_ZSTACK_LOG_10003": "帳號[uuid:%s]無權操作日誌服務器[uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10029": "無法更改 SDN 控制器,因为 VLAN 范围[%s]与其他 VLAN 范围重叠", + "ORG_ZSTACK_LOG_10002": "没有找到類型为:%s 的工厂類", + "ORG_ZSTACK_TAG_10006": "没有匹配的系統統標签 %s", + "ORG_ZSTACK_SDNCONTROLLER_10020": "無法将主機[uuid:%s]添加到SDN控制器[uuid:%s],因为vtepip被主機[uuid:%s]使用", + "ORG_ZSTACK_SDNCONTROLLER_10022": "無法将主機[uuid:%s]的SDN控制器[uuid:%s]更改为指定的主機,因为該主機尚未被添加到SDN控制器中", + "ORG_ZSTACK_TAG_10000": "重复標签[tag:%s, 類型:%s, 資源類型:%s, 資源UUID:%s]", + "ORG_ZSTACK_SDNCONTROLLER_10021": "無法从SDN控制器[uuid:%s]移除主機[uuid:%s],因为該主機尚未被添加到SDN控制器", + "ORG_ZSTACK_SDNCONTROLLER_10024": "無法将L3网络附加到VM,因为SDN控制器[uuid:%s]中的某些租戶已被刪除。請先運行租戶同步以更新租戶状态。", + "ORG_ZSTACK_SDNCONTROLLER_10023": "無法更改 SDN 控制器[uuid:%s]的主機[uuid:%s],因为指定了子网掩碼", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10000": "检查批數据完整性失敗,不支持的 resourceType: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10002": "添加完整性資源失敗,不支持的 resourceType: %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10002": "模板錯誤誤:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10134": "無法将後端服務器vmnic添加到serverGroup[uuid:%s],因为vmnic權重[%s]不是一個正確的數字", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10008": "獲取镜像缓儲[id:%s]失敗:GetImageHashValueReply.hashValue为空", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10009": "驗證圖像缓儲[%s]的一致性失敗", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_MICROSOFTTEAMS_10000": "此類模板類型不儲在:%s,", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10132": "無法将後端服務器vmnic[uuid:%s]添加到serverGroup[uuid:%s],因为vmnic uuid不儲在", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10137": "無法将後端服務器的vmnic添加到serverGroup [uuid:%s],因为ip地址[ipAddress:%s]重复", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10003": "啟動數据保护加密類型[%s]錯誤誤", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10138": "無法将虚拟機网卡 [uuid:%s] 添加到服務器组 [uuid:%s],因为监听器 [uuid:%s] 已经将該服務器组的网卡綁定", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10004": "快照[uuid:%s]未加密", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10135": "L3网络[uuids:%s]的vm网卡没有啟用网络服務[%s]", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10005": "驗證卷快照[%s]的一致性失敗", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10136": "該虚拟機的网络接口[UUID:%s]已经在负载均衡服務组[UUID:%s]上儲在", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10006": "加密錯誤誤: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10139": "無法将後端服務器IP添加到服務器组[uuid:%s],因为IP [ipAddress:%s] 重复", + "ORG_ZSTACK_VMWARE_10097": "VCenter[%s]未处於運行状态,當前状态:%s", + "ORG_ZSTACK_VMWARE_10098": "磁碟未找到: %s", + "ORG_ZSTACK_VMWARE_10095": "獲取最近任務列表失敗,詳情: %s", + "ORG_ZSTACK_VMWARE_10096": "VCenter 未找到", + "ORG_ZSTACK_VMWARE_10093": "vcenter 备份儲儲不支持计算镜像哈希值", + "ORG_ZSTACK_VMWARE_10091": "尚未支持", + "ORG_ZSTACK_TAG_10011": "[tag[uuid:%s] 是内置系統統標签,無法刪除]", + "ORG_ZSTACK_TAG_10012": "參數:'resourceType' 不匹配 uuid", + "ORG_ZSTACK_VMWARE_10090": "圖像未在BS中找到", + "ORG_ZSTACK_TAG_10010": "在標签系統統中未找到資源類型[%s]", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10010": "加密圖像缓儲[id:%s]錯誤誤: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10011": "節點類型 %s 完整性文件[path:%s]已儲在", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10012": "無效的節點類型[%s]", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10013": "無法添加完整性文件[%s.%s],现在它是一個目录。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10141": "無效的權重[serverIp:%s,weight:%s], 權重不在范围[%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10143": "服務器IP地址 [uuid:%s] 已经在负载均衡服務组 [uuid:%s] 中", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10148": "负载均衡服務器组 [%s] 不儲在", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10014": "完整性文件[%s.%s]不儲在", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10149": "vmnic 或 IP 为空", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10015": "主機 %s 不儲在", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10146": "vmnics 均未在服務器组 [%s] 中", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10000": "外部主要儲儲[uuid:%s, 名称:%s]返回不健康状态: %s", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10016": "Shell 執行失敗,因为 %s", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_KVM_10001": "查找活動客戶端 for 体积[uuid:%s, 安装路径 %s, 客戶端:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10147": "服務器IP地址均未在服務器组 [%s] 中", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10017": "添加完整性文件[%s.%s]失敗,因为%s", + "ORG_ZSTACK_VMWARE_10088": "vcenter 备份儲儲不支持取消下载镜像", + "ORG_ZSTACK_VMWARE_10086": "%s 已经儲在", + "ORG_ZSTACK_VMWARE_10085": "意外的协议: %s", + "ORG_ZSTACK_VMWARE_10082": "没有數据儲儲關聯到 %s", + "ORG_ZSTACK_VMWARE_10083": "數据儲儲未找到 for %s", + "ORG_ZSTACK_VMWARE_10080": "VCenter[uuid=%s] 已禁用。您只能对該VCenter執行只读操作。如果您想要对其进行配置更改,需要通過 UpdateVCenterAction {uuid=%s state=Enabled} 更新配置", + "ORG_ZSTACK_VMWARE_10081": "VCenter[uuid=%s] 已禁用。您只能对这些 VCenter 執行只读操作。", + "ORG_ZSTACK_CRYPTO_DATACRYPTO_10021": "加密快照[uuid:%s]錯誤誤: %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10151": "無法将服務器组[uuid:%s]添加到监听器[uuid:%s],因为网卡[uuid:%s]已经添加", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10152": "無法将服務器组[uuid:%s]添加到监听器[uuid:%s],因为服務器IP [%s] 已经被添加", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10150": "無法将服務器组[uuid:%s]添加到监听器[uuid:%s],因为它已经儲在", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10155": "無法将服務器组[uuid:%s]添加到监听器[uuid:%s],因为UDP监听器不能将IPv4映像射到IPv6後端", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10156": "無法从监听器[uuid:%s]移除服務器组[uuid:%s],因为該监听器啟用了HTTP重定向到HTTPS", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10153": "無法将服務器组[uuid:%s]添加到监听器[uuid:%s],因为UDP监听器不能同时具有IPv4和IPv6 VIP", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10154": "無法将 UDP 监听器 [uuid:%s] 中的服務器组[uuid:%s]映像射到 IPv4 後端", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10159": "無法找到与服務器组 [uuid:%s] 關聯的负载均衡器", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10157": "無法将服務器组[uuid:%s]从监听器[uuid:%s]中移除,因为它尚未添加", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10158": "负载均衡UUID [%s] 不儲在", + "ORG_ZSTACK_VMWARE_10078": "不支持", + "ORG_ZSTACK_VMWARE_10076": "失敗啟動VM,任務状态: %s", + "ORG_ZSTACK_VMWARE_10073": "VM [%s] 在 vCenter 中未找到", + "ORG_ZSTACK_VMWARE_10071": "失敗在ESX主機[uuid=%s]中找到vm[uuid=%s]", + "ORG_ZSTACK_VMWARE_10072": "失敗更新ESX 虚拟機[uuid=%s] 配置。更多詳情請參见日誌。", + "ORG_ZSTACK_VMWARE_10070": "圖像 [%s] 未找到", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10162": "無法将後端服務器的vmnic更改到serverGroup[uuid:%s],因为vmnic權重[%s]不是一個正確的數字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10163": "無效的负载均衡權重[vimNic:%s], 權重为空", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10160": "無法更新服務器组的後端服務器VMNIC,因为服務器组[uuid:%s]没有VMNIC [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10161": "無效的负载均衡權重[vimNic:%s, weight:%s],權重不在范围[%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10166": "無效的负载均衡權重[serverIp:%s,weight:%s], 權重不在范围[%d, %d]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10167": "無法将後端服務器IP添加到serverGroup[uuid:%s],因为vmnic權重[%s]不是一個正確的數字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10164": "無法更新服務器组[uuid:%s]的後端服務器vmnic,因为vmnic uuid为空", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10165": "無法更新服務器组的後端服務器IP,因为服務器组[uuid:%s]没有IP地址[ipAddress:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10168": "無效的负载均衡權重[serverIp:%s], 權重为空", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10169": "無法将後端服務器IP添加到服務器组[uuid:%s],因为IP [ipAddress:%s] 無效", + "ORG_ZSTACK_VPC_HA_10010": "儲在超過2個VPC路由器連接到HA组[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10119": "因为禁用了实例配置在线修改,虚拟機無法进行在线CPU/内儲更新。請先停止虚拟機,然後再次进行CPU/内儲更新", + "ORG_ZSTACK_VPC_HA_10011": "HA组管理L3网络和公共L3网络[uuid:%s]与提供的L3网络[uuid:%s]不同", + "ORG_ZSTACK_VPC_HA_10012": "VPC路由L3网络[uuid:%s]与HA组L3网络[uuid:%s]不同,請刪除此路由器並重新創建。", + "ORG_ZSTACK_VPC_HA_10013": "VPC路由器已綁定到高可用组[uuid:%s]", + "ORG_ZSTACK_VPC_HA_10014": "vpc 高可用组 [uuid:%s] 不儲在", + "ORG_ZSTACK_VPC_HA_10015": "儲在超過一個VPC路由器附加到HA组[uuid:%s]", + "ORG_ZSTACK_VPC_HA_10016": "VPC路由器[UUID:%s]無法升級为HA路由器,因为其公网与管理网相同", + "ORG_ZSTACK_VPC_HA_10017": "創建亲和组以供高可用性组 [uuid:%s] 使用失敗", + "ORG_ZSTACK_VPC_HA_10018": "实例 %s [uuid: %s] 的 VPC HA 组 %s [uuid: %s] 的 haStatus 从 %s 更改为 %s", + "ORG_ZSTACK_VPC_HA_10019": "实例[uuid: %s, 名称:%s, 類型:%s] 的 haStatus 从 %s 变更为了 %s", + "ORG_ZSTACK_VPC_HA_10009": "路由器 [uuid:%s] 没有主路由器", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10000": "nfv 实例初始化命令失敗,因为:%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10002": "失敗了更改NVIDIA实例VM[uuid:%s]的网络接口[ip:%s, mac:%s]防火墙默認動作,因为%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10053": "访问控制列表 groups[uuid:%s] 对 %s 的使用儲在异常,但其中有访问控制列表未包含 IP 条目却有重定向規则", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10050": "负载均衡监听器[UUID:%s]無法附加超過%d個重定向規则访问控制列表组", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10051": "负载均衡监听器 [uuid:%s] 具有访问控制列表组[uuid:%s]的重定向規则", + "ORG_ZSTACK_COMPUTE_VM_10118": "虚拟機[UUID:%s]在上次迁移之後仍然处於暫停状态,請先恢复再进行迁移。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10056": "负载均衡监听器[唯一標識: %s]無法附加超過 %d 個访问控制列表组", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10008": "分离功能对於此NFV实例類型不支持", + "ORG_ZSTACK_COMPUTE_VM_10117": "該虚拟機[UUID:%s]已经在主機[UUID:%s]上運行", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10057": "服務器组[%s]未綁定至负载均衡监听器[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10007": "更新分配配置不支持此NFV实例類型", + "ORG_ZSTACK_COMPUTE_VM_10116": "當镜像介质類型为ISO时,rootDiskSize是必需的", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10054": "访问控制列表组[uuid:%s]已经儲在於负载均衡监听器[uuid:%s]中", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10055": "负载均衡监听器[唯一標識:%s]仅關聯了%s類型的安全访问控制列表组", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10009": "干净數据不支持此NFV实例類型", + "ORG_ZSTACK_COMPUTE_VM_10114": "當前平台 %s 尚不支持更新网卡驱動程序", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10004": "無法通過 SSH 連接到已配置 SSH 的 NFF 实例 [%s]", + "ORG_ZSTACK_COMPUTE_VM_10113": "無法为 vm[uuid:%s] 創建 CD-ROM,其状态为[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10058": "acl[%s]未綁定至负载均衡监听器[%s]", + "ORG_ZSTACK_COMPUTE_VM_10112": "[name:%s, uuid:%s] 是一個 ISO 镜像,必須設置 rootDiskSize", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10006": "失敗更新NFV实例状态: %s", + "ORG_ZSTACK_COMPUTE_VM_10111": "缺少CPU/内儲設置", + "ORG_ZSTACK_VPC_HA_10020": "HA组UUID为空", + "ORG_ZSTACK_COMPUTE_VM_10121": "無法减少容量當虚拟機[uuid:%s]正在運行时", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10060": "無法将虚拟機网卡綁定到负载均衡监听器,因为虚拟機网卡[uuid:%s]已綁定到默認服務器组[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10061": "無法創建监听器因为UDP监听器不能同时拥有IPv4和IPv6 VIP", + "ORG_ZSTACK_COMPUTE_VM_10129": "%s 不是一個有效的IPv4地址", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10068": "無效重定向状态 [%s], 它仅支持 %s", + "ORG_ZSTACK_COMPUTE_VM_10128": "無法在虚拟機[uuid:%s]運行时减少其内儲大小", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10065": "無法将超過 %d 個访问控制列表组附加到一個监听器上", + "ORG_ZSTACK_COMPUTE_VM_10127": "無法在虚拟機[uuid:%s]運行时减少其CPU資源", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10066": "l4[%s] 负载均衡监听器[%s] 不支持分配会话持久性状态", + "ORG_ZSTACK_COMPUTE_VM_10126": "VM[%s]的状态为%s。仅允許更新CPU或内儲这些状态[%s]。", + "ORG_ZSTACK_COMPUTE_VM_10125": "因为禁用了内儲热插拔,虚拟機無法进行内儲热插拔。請先停止虚拟機,然後再重新进行内儲热插拔", + "ORG_ZSTACK_COMPUTE_VM_10124": "因为禁用了CPU热插拔,所以該VM無法进行CPU热插拔。請先停止該VM,然後再嘗試进行CPU热插拔", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10069": "無效的状态碼 [%s],它只支持 %s", + "ORG_ZSTACK_COMPUTE_VM_10122": "预留内儲大小[%s]大於内儲大小[%s]", + "ORG_ZSTACK_COMPUTE_VM_10132": "%s 不是一個有效的IPv6地址", + "ORG_ZSTACK_COMPUTE_VM_10131": "IP地址 [%s] 不在IP范围 [%s] 内", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10074": "负载均衡器[%s]监听器[%s] %s算法不支持分配会话持久性状态,除非显式分配iphash", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10075": "無效的会话持久性類型[%s],它仅支持%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10072": "無效的会话持久性状态 [%s],它仅支持 %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10073": "负载均衡器[%s]监听器[%s] %s算法不支持分配会话持久性状态,除非明確禁用", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10078": "無效会话cookie名称[%s],它必須仅包含字母、數字和下划线", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10079": "负载均衡器[%s]监听器[%s]不支持同时設置空闲超时和cookie名称", + "ORG_ZSTACK_COMPUTE_VM_10139": "IPv6 地址需要前缀", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10076": "無效会话空闲超时[%s],它必須是介於[%s~%s]之間的數字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10077": "無效的会话cookie名称[%s],它必須短於[%s]字符", + "ORG_ZSTACK_COMPUTE_VM_10137": "IPv4 地址需要一個子网掩碼", + "ORG_ZSTACK_COMPUTE_VM_10136": "静态 IP [%s] 格式錯誤誤", + "ORG_ZSTACK_COMPUTE_VM_10135": "無法設置IP地址,因为未指定IP地址", + "ORG_ZSTACK_COMPUTE_VM_10134": "IP地址 [%s] 不在IP范围 [起始IP %s, 結束IP %s] 内", + "ORG_ZSTACK_COMPUTE_VM_10133": "IP地址 [%s] 已经分配给虚拟网络接口 [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10081": "负载均衡器[%s]监听器[%s]在会话持久性被禁用时不支持分配空闲超时和cookie名称", + "ORG_ZSTACK_COMPUTE_VM_10143": "無法刪除虚拟機 [uuid:%s] 的静态IP [%s],因为該IP不儲在", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10082": "负载均衡器[%s]监听器[%s]不支持在未分配cookie名称的情况下設置会话持久性重寫", + "ORG_ZSTACK_COMPUTE_VM_10142": "該虚拟機[uuid:%s]在L3网络[uuid:%s]上没有网卡", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10080": "负载均衡器[%s]监听器[%s]不支持分配空闲超时和cookie名称,必須指定会话持久性", + "ORG_ZSTACK_COMPUTE_VM_10140": "IP地址 [%s] 已经分配给虚拟网络接口卡vmNic", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10085": "负载均衡器[%s]监听器[%s]不支持在源负载均衡算法为来源时分配其他会话持久性", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10086": "负载均衡器[%s]监听器[%s]不支持分配会话持久性IP哈希", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10083": "负载均衡器[%s]监听器[%s]不支持在未指定重寫模式的情况下分配会话持久性空闲超时", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10084": "负载均衡器[%s]监听器[%s]不支持在未分配插入模式的情况下分配会话持久性cookieName", + "ORG_ZSTACK_COMPUTE_VM_10149": "不支持的圖像媒体類型: [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10087": "無效的最大連接數[%s],%s 大於上限閾值 %d", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10088": "冲突的负载均衡端口[%s],一個监听器[uuid:%s]已使用該端口", + "ORG_ZSTACK_COMPUTE_VM_10147": "带有内儲快照的虚拟機 %s 不支持設置啟動磁碟", + "ORG_ZSTACK_COMPUTE_VM_10146": "卷[uuid:%s]必須連接到虚拟機[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10145": "啟動磁碟不能是可共享的。", + "ORG_ZSTACK_COMPUTE_VM_10144": "無效啟動設备[%s]在啟動顺序%s", + "ORG_ZSTACK_VMWARE_10024": "無法同步,在數据儲儲分离之前", + "ORG_ZSTACK_VMWARE_10025": "在 VCenter[uuid:%s] 上有正在運行的任務,請稍後再試。", + "ORG_ZSTACK_VMWARE_10023": "連接到 vCenter 失敗: %s: %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10008": "由於未在控制器[ip:%s]上配置VNI范围,因此無法初始化SDN控制器", + "ORG_ZSTACK_VMWARE_10020": "没有可用的 VNC 端口", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10009": "無法从SDN控制器[ip:%s]獲取VNI范围,因为%s", + "ORG_ZSTACK_VMWARE_10021": "[vc] 獲取 vCenter %s 的服務实例失敗,因为 %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10092": "雲無法創建基於TCP协议的监听器,因为仅支持TCP代理协议參數", + "ORG_ZSTACK_MEVOCO_10006": "不支持为 virtio-scsi 体积[%s]設置多队列的操作。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10093": "雲無法創建负载均衡监听器,因为仅支持 TCP 代理协议 %s", + "ORG_ZSTACK_MEVOCO_10005": "不支持为根磁碟[%s]設置多队列的操作。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10091": "雲無法創建带有HTTPS协议的负载均衡监听器,因为仅支持HTTP版本:[h1, h2]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10010": "由於無法創建硬件 VXLAN 网络,因为 H3C 租戶 UUID 是 H3C VCFC V2 控制器的必選參數", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10096": "负载均衡监听器類型为 %s 不需要證书", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10097": "负载均衡监听器 [uuid:%s] 已经有證书[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10094": "雲無法創建负载均衡监听器,因为不支持 [%s] 协议下的壓縮内容", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10095": "雲無法創建负载均衡监听器,因为仅支持壓縮算法[%s]", + "ORG_ZSTACK_MEVOCO_10007": "对於可共享的卷,唯一支持的主要儲儲類型是 %s,當前是 %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10015": "由於無法創建VNI范围,指定的L2网络[uuid:%s]不是一個VXLAN网络池", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10016": "無法創建 VNI 范围 [%s-%s],因为 H3C 控制器将 VNI 用作 VLAN ID,范围必須在 1-4094 内", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10017": "無法創建 VNI 范围 [%s-%s],因为該范围未被任何 SDN 控制器配置的 VNI 范围覆盖", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10098": "證书 [uuid:%s] 没有添加到负载均衡监听器 [uuid:%s] 中", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10018": "由於無法找到SDN控制器[uuid:%s],因此無法添加IPv6地址范围。當前状态:%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10099": "健康检查目標 [%s] 錯誤誤,它必須是 'default' 或者 1~65535之間的數字", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10011": "由於指定租戶在SDN控制器中不儲在,因此無法創建硬件VXLAN网络", + "ORG_ZSTACK_MEVOCO_10002": "無法从null卷质量設置中找到模式", + "ORG_ZSTACK_VMWARE_10017": "L2[uuid:%s]不属於vCenter[uuid:%s]叢叢[uuid:%s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10012": "由於無法創建 VXLAN 网络,SDN 控制器 [ip:%s] 未响应", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10013": "無法在SDN控制器[ip:%s]上創建VXLAN网络,因为%s", + "ORG_ZSTACK_MEVOCO_10000": "ZStack 已被暫停,拒绝所有非只读 API。如果您確实需要調用並了解後果,請将 '%s' 添加到 systemTags 中。", + "ORG_ZSTACK_VMWARE_10015": "在叢叢:%s 内未找到任何主機", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10014": "無法在SDN控制器[ip:%s]上刪除VXLAN网络,原因:%s", + "ORG_ZSTACK_VMWARE_10016": "弹性搜索主機上的虚拟交换機/d分布式虚拟交换機未找到:%s,或位於不同弹性搜索主機上的虚拟交换機:%s 没有相同的端口组", + "ORG_ZSTACK_VMWARE_10013": "NIC驱動程序 %s 尚未支持", + "ORG_ZSTACK_VMWARE_10014": "叢叢[uuid:%s]和L2[uuid:%s]属於不同的DCs", + "ORG_ZSTACK_VMWARE_10011": "域名[%s]既不是有效的IPv4地址也不是有效的主機名", + "ORG_ZSTACK_VMWARE_10012": "vCenter [域名:%s] 已添加", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10019": "由於没有找到源文件,無法通過网络CIDR添加IPv6地址段,因为SDN控制器[uuid:%s]未連接。當前状态:%s", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10000": "没有可用的裸金属2网關找到", + "ORG_ZSTACK_VMWARE_10010": "vCenter 登录用戶名期望值。", + "ORG_ZSTACK_BAREMETAL2_GATEWAY_ALLOCATOR_10002": "分配裸金属2网關失敗", + "ORG_ZSTACK_CORE_DEBUG_10000": "任務信息未找到", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10020": "由於SDN控制器[uuid:%s]未連接,無法添加IP范围。當前状态:%s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10021": "由於通過网络CIDR添加IP范围时,SDN控制器[uuid:%s]未連接。當前状态:%s", + "ORG_ZSTACK_MEVOCO_10014": "無效的网络带宽[%s], 它不是一個數字", + "ORG_ZSTACK_MEVOCO_10019": "無效的卷带宽[%s],它必須大於1024(包括1024)", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10028": "由於無法獲取租戶信息,因此SDN控制器[ip:%s]未响应", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10029": "由於未配置控制器 [IP:%s] 的默認租戶,因此無法初始化 SDN 控制器", + "ORG_ZSTACK_VMWARE_10009": "console密碼不被[uuid:%s]上的VM支持,運行在ESXHost[%s版本的ESXI]上", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10022": "無法創建L3网络因为H3C VCFC V2软件定义网络控制器不支持L3[type:%s, category:%s]", + "ORG_ZSTACK_MEVOCO_10013": "無效的网络带宽[%s],它必須大於或等於%d", + "ORG_ZSTACK_VMWARE_10006": "失敗獲取 VM[%s] 根磁碟使用情况", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10023": "由於無法找到硬件VXLAN网络因为租戶UUID是H3C VCFC V2控制器的必選參數", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10024": "由於未找到 H3C VCFC 控制器的 VDS UUID 系統統標签,因此無法添加 H3C VCFC V1 控制器", + "ORG_ZSTACK_VMWARE_10005": "从安装路径獲取虚拟機失敗: %s", + "ORG_ZSTACK_VMWARE_10002": "無文件 Datacenter", + "ORG_ZSTACK_VMWARE_10000": "無虚拟磁碟管理器", + "ORG_ZSTACK_VMWARE_10001": "没有文件管理器", + "ORG_ZSTACK_VPC_HA_VYOS_10000": "失敗在虚拟路由器[uuid:%s]上啟用ha,%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10011": "nfv 实例[uuid:%s]处於無法向%s發起http調用的状态:%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10010": "the nfv 实例[name:%s, uuid:%s, 當前状态:%s]未運行,並且無法執行所需操作。請在它運行後再重試您的操作。", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10013": "無法将网卡[ip:%s, mac:%s]添加到NFS实例[uuid:%s ip:%s]中,因为%s", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10012": "NFS 实例[UUID:%s]没有任何管理网卡可以向%s發起HTTP請求", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10004": "無法確定SDN控制器[%s]的叢叢领导者,因为%s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10005": "無法使用SDN控制器进行身份驗證,因为控制器[ip:%s]未响应", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_10000": "vm[uuid:%s] 儲儲迁移長时間任務[uuid:%s]失敗,因为管理節點被重啟", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10006": "無法使用 SDN 控制器 [IP:%s] 进行身份驗證,因为 %s", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10007": "由於無法獲取VNI范围,因为SDN控制器[ip:%s]未响应", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10000": "由於在SDN控制器上創建子网失敗,因此無法添加IP范围", + "ORG_ZSTACK_COMPUTE_VM_10103": "無法切换到L3网络。L3网络[uuid:%s]是系統統网络,而VM是用戶VM", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10015": "VmInstanceSpec 在流程數据中未找到", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10001": "無法将 IP 范围添加到 L3 网络因为 %s", + "ORG_ZSTACK_COMPUTE_VM_10102": "無法切换到L3网络。L3网络[uuid:%s]已禁用", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10014": "無法刪除镜像[uuid:%s],因为它被用於nfv实例组[uuid:%s]中", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10002": "从 L3 网络刪除 IP 范围因为 %s", + "ORG_ZSTACK_COMPUTE_VM_10101": "無法切换到非访客L3网络。L3网络[uuid:%s]已綁定至虚拟機[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10100": "無法切换到L3网络。L3网络[uuid:%s]已綁定至虚拟機[uuid: %s]", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10003": "無法確定叢叢领导節點,因为SDN控制器[ip:%s]未响应", + "ORG_ZSTACK_NETWORK_SERVICE_NFVINST_10016": "VmInventory 或 UUID 在 VmInstanceSpec 中为空", + "ORG_ZSTACK_PORTMIRROR_10008": "镜像端口服務不支持類型为[%s]的nic,因为其hypervisor類型不被支持", + "ORG_ZSTACK_PORTMIRROR_10009": "The PortMirror服務無法镜像到nic[%s]該网络接口不是某個VM的非默認接口", + "ORG_ZSTACK_ZWATCH_API_10019": "查询周期不能超過 %s", + "ORG_ZSTACK_COMPUTE_VM_10198": "無法从共享磁碟創建 VM 实例。", + "ORG_ZSTACK_PORTMIRROR_10000": "無效參數 [%s],請確保它是端口镜像网络", + "ORG_ZSTACK_COMPUTE_VM_10197": "需要設置以下属性中的一個,並且只能設置其中一個:%s", + "ORG_ZSTACK_PORTMIRROR_10001": "該网络[%s]已綁定PortMirror服務", + "ORG_ZSTACK_ZWATCH_API_10028": "帳戶[uuid: %s] 对資源[uuid: %s] 無访问權限", + "ORG_ZSTACK_COMPUTE_VM_10196": "無法同时設置以下属性: %s", + "ORG_ZSTACK_PORTMIRROR_10002": "端口镜像服務[%s]尚未創建", + "ORG_ZSTACK_PORTMIRROR_10003": "The nic[%s, %s] 已被服務[%s]镜像", + "ORG_ZSTACK_COMPUTE_VM_10194": "在 msg 或 image[uuid:%s] 中,至少应設置其中一個字段 architecture", + "ORG_ZSTACK_PORTMIRROR_10004": "The nic[%s] 無法为 service[%s] 进行镜像操作", + "ORG_ZSTACK_ZWATCH_API_10025": "無效標签[%s], 有效可查询標签为 %s", + "ORG_ZSTACK_COMPUTE_VM_10193": "在 msg 或 image[uuid:%s] 中,至少应設置一個 guestOsType 字段", + "ORG_ZSTACK_ZWATCH_API_10024": "指標[%s]不儲在過滤器[%s]", + "ORG_ZSTACK_COMPUTE_VM_10192": "在 msg 或 image[uuid:%s] 中,platform 字段至少应設置一個", + "ORG_ZSTACK_PORTMIRROR_10007": "端口镜像服務不支持镜像网卡[%s]", + "ORG_ZSTACK_ZWATCH_API_10021": "無法在命名空間[%s]中找到指標[%s]", + "ORG_ZSTACK_COMPUTE_VM_10199": "無法从挂载的磁碟創建 VM 实例。", + "ORG_ZSTACK_PORTMIRROR_10011": "The PortMirror service can't mirror the nic[%s] to nic[%s] because the mirror network[%s] can't establish the mirror tunnel", + "ORG_ZSTACK_PORTMIRROR_10012": "端口镜像服務無法将网卡[%s]镜像到自身", + "ORG_ZSTACK_ZWATCH_API_10039": "非法 JSON 字符串,labelsJsonStr 格式無效", + "ORG_ZSTACK_PORTMIRROR_10013": "端口镜像服務在配置了QoS的网卡上無法工作", + "ORG_ZSTACK_ZWATCH_API_10038": "該命名空間[%s]中不儲在指標[%s]", + "ORG_ZSTACK_PORTMIRROR_10014": "失敗从hypervisor刪除端口镜像会话[%s],詳細信息: %s", + "ORG_ZSTACK_ZWATCH_API_10037": "在系統統中未定义命名空間[%s]", + "ORG_ZSTACK_PORTMIRROR_10015": "未能从hypervisor释放端口镜像会话[%s],詳細信息: %s", + "ORG_ZSTACK_ZWATCH_API_10036": "URL格式無效,開头不是http", + "ORG_ZSTACK_PORTMIRROR_10016": "無法找到会话[uuid:%s]的内部ID,主機上的会话數量過多了吗???", + "ORG_ZSTACK_ZWATCH_API_10033": "endTime[%s, %sms] 必須不得早於 startTime[%s, %sms]", + "ORG_ZSTACK_ZWATCH_API_10032": "指標[%s]的標签[%s]不包含[%s]", + "ORG_ZSTACK_ZWATCH_API_10031": "無法找到命名空間[%s]", + "ORG_ZSTACK_ZWATCH_API_10030": "如果命名空間为全部,则不支持指定指標和標签", + "ORG_ZSTACK_PORTMIRROR_10010": "The PortMirror服務無法镜像[%s]这個不是任何VM接口的网卡", + "ORG_ZSTACK_PCIDEVICE_KVMPCIDEVICEBACKEND_10009": "从宿主機[uuid:%s]獲取PCI設备信息失敗", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10030": "無法从SDN控制器[ip:%s]獲取默認租戶,因为通信錯誤誤", + "ORG_ZSTACK_ZWATCH_API_10046": "时間間隔超過 % 天", + "ORG_ZSTACK_ZWATCH_API_10045": "endTime[%s] 不得早於 startTime[%s]", + "ORG_ZSTACK_ZWATCH_API_10044": "無效表[%s]", + "ORG_ZSTACK_ZWATCH_API_10043": "告警確認记录不儲在", + "ORG_ZSTACK_ZWATCH_API_10042": "開始时間[%s]大於結束时間[%s]", + "ORG_ZSTACK_ZWATCH_API_10041": "平台[url=%s]已儲在", + "ORG_ZSTACK_SDNCONTROLLER_H3CVCFC_10033": "無法刪除 VXLAN 网络,因为 SDN 控制器 [ip:%s] 未响应", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_FLAT_10004": "操作錯誤誤,VIP %s 尚未綁定至VM", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10000": "創建端口转發規则失敗[vip ip: %s, 私有 ip: %s, vip 開始端口: %s, vip 結束端口: %s, 私有 開始端口: %s, 私有 結束端口: %s],因为 %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10001": "失敗取消端口转發規则 %s,因为 %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10002": "失敗同步虚拟路由器[name: %s, uuid: %s]提供的端口转發規则,因为%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10003": "發现为L3Network[uuid:%s]在區域[uuid:%s]中的虚拟路由器提供程序[virtual router offering uuid:%s];然而,該网络的公共网络[uuid:%s]与PortForwarding規则[uuid:%s]的不同;您可能需要使用系統統標签guestL3Network::l3NetworkUuid来指定特定的虚拟路由器提供程序", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10004": "虚拟路由器不支持端口转發范围重定向,vipPortStart 必須等於 privatePortStart,且 vipPortEnd 必須等於 privatePortEnd;但此規则的范围不符:vip 端口[%s, %s],私有端口[%s, %s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10005": "在虚拟路由器[uuid:%s]上添加端口转發規则失敗,%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_PORTFORWARDING_10006": "失敗於撤销虚拟路由器[uuid:%s]上的端口转發,%s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10003": "失敗了反生成 SE 設备,因为:%s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10004": "从主機[uuid:%s]獲取mtty設备信息失敗", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10001": "The quantity exceeded. The device[uuid: %s] required SE devices number exceeds a quantity[value: %s].", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10002": "生成安全設备失敗,因为:%s", + "ORG_ZSTACK_MTTYDEVICE_KVMMTTYDEVICEBACKEND_10000": "[value:%s]不是有效的部件编號。", + "ORG_ZSTACK_CORE_CLOUDBUS_10021": "消息未以修正的JSON媒体類型格式儲在,%s", + "ORG_ZSTACK_COMPUTE_VDPA_10009": "仅支持 %s vdpa", + "ORG_ZSTACK_COMPUTE_VDPA_10007": "無法生成PCI設备[uuid:%s],因为另一個L2[uuid:%s]正在使用与叢叢連接的物理网络接口", + "ORG_ZSTACK_COMPUTE_VDPA_10006": "無法反生成PCI設备[uuid:%s],因为另一個L2[uuid:%s]正在使用与此叢叢連接的物理网络接口", + "ORG_ZSTACK_COMPUTE_VDPA_10005": "失敗刪除桥接[%s]对於l2网络[uuid:%s, type:%s]在kvm主機[uuid:%s]上,因为%s", + "ORG_ZSTACK_COMPUTE_VDPA_10004": "失敗在KVM宿主機[uuid:%s]上检查桥接[%s]对於l2NoVlanNetwork[uuid:%s, name:%s]的情况,%s", + "ORG_ZSTACK_COMPUTE_VDPA_10003": "失敗在KVM宿主機[uuid:%s]上为l2Network[uuid:%s, type:%s]創建桥接[%s],因为%s", + "ORG_ZSTACK_COMPUTE_VDPA_10002": "从目標主機[uuid:%s]恢复vm[uuid:%s]的vdpa", + "ORG_ZSTACK_COMPUTE_VDPA_10001": "释放vdpa给目標主機上的vm[uuid:%s][uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10152": "VM[uuid:%s] 挂载了多個 ISO 文件,請在解挂载时指定 isoUuid", + "ORG_ZSTACK_COMPUTE_VM_10151": "VM[uuid:%s] 的光驱[uuid:%s]已挂载了ISO", + "ORG_ZSTACK_COMPUTE_VM_10150": "The cdRom[uuid:%s] 不儲在", + "ORG_ZSTACK_COMPUTE_VM_10159": "無法綁定L3网络。L3网络[uuid:%s]属於尚未綁定任何叢叢的L2网络[uuids:%s]", + "ORG_ZSTACK_COMPUTE_VM_10158": "無法綁定L3网络。L3网络[uuid:%s]属於不同的L2网络[uuids:%s]", + "ORG_ZSTACK_COMPUTE_VM_10157": "無法綁定L3网络。L3网络[uuid:%s]没有IP范围", + "ORG_ZSTACK_COMPUTE_VM_10156": "無法綁定L3网络。該虚拟機[uuid: %s]未運行或停止;當前状态为%s", + "ORG_ZSTACK_COMPUTE_VDPA_10015": "在宿主機[uuid:%s]中为虚拟機[uuid:%s]生成vdpas失敗:%s", + "ORG_ZSTACK_COMPUTE_VDPA_10013": "在主機[uuid:%s]中刪除vm[uuid:%s]的vdpas时失敗:%s", + "ORG_ZSTACK_COMPUTE_VDPA_10012": "L2网络[uuid:%s]在主機[uuid:%s]中未进行SRIOV虚拟化", + "ORG_ZSTACK_COMPUTE_VDPA_10011": "叢叢[uuid:%s]不支持ovs-dpdk", + "ORG_ZSTACK_COMPUTE_VDPA_10010": "無法使用物理接口:[%s] 創建 %s,因为該物理接口已被其他類型的安全组占用。", + "ORG_ZSTACK_COMPUTE_VM_10163": "無法綁定L3网络。L3网络[uuid:%s]是系統統网络,而VM是用戶VM", + "ORG_ZSTACK_COMPUTE_VM_10162": "無法綁定L3网络。L3网络[uuid:%s]已禁用", + "ORG_ZSTACK_COMPUTE_VM_10161": "無法附加非客戶機的L3网络。L3网络[uuid:%s]已附加到虚拟機[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10160": "無法綁定L3网络。L3网络[uuid:%s]已綁定至虚拟機[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10168": "静态IP[%s]在L3网络[uuid:%s]中已被占用", + "ORG_ZSTACK_COMPUTE_VM_10167": "静态IP[%s]不在L3网络[uuid:%s]的任何IP范围内", + "ORG_ZSTACK_COMPUTE_VM_10166": "静态IP L3 UUID[%s] 不包含在NIC L3 [%s] 中", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10009": "IAM2项目对象[唯一標識:%s]的状态不是%s,不允許状态变更", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10008": "該项目[uuid:%s, 名称:%s]已经儲在一個登录過期策略", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10007": "無效的日期或时間[%s],它不能早於當前时間[%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10006": "無效支出值[%s],它应該類似於10.001的格式", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10005": "無效的支出值[%s],支出值应在0和%f之間", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10004": "無效时間[%s],它应該例如10m、1h、2d的格式", + "ORG_ZSTACK_CORE_CLOUDBUS_10001": "对於 type[%s] 類型的 webhook,字段 opaque 不能为 null", + "ORG_ZSTACK_COMPUTE_VM_10176": "無法綁定网卡。其L2网络[%s]尚未綁定到任何叢叢", + "ORG_ZSTACK_ZWATCH_API_10007": "dataStartTime 和 dataEndTime 不能缺失", + "ORG_ZSTACK_COMPUTE_VM_10175": "無法綁定网卡。其L3网络[uuid:%s]是系統統网络,而VM是用戶VM", + "ORG_ZSTACK_ZWATCH_API_10006": "dataUuid 不能为空", + "ORG_ZSTACK_COMPUTE_VM_10174": "無法綁定网卡。其L3网络[uuid:%s]已禁用", + "ORG_ZSTACK_COMPUTE_VM_10173": "無法将网卡附加到非客戶機L3网络。其L3网络[uuid:%s]已附加到虚拟機[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10172": "無法綁定网卡。其L3网络[uuid:%s]已綁定至虚拟機[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10171": "無法綁定网卡。該网卡已綁定至虚拟機[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10170": "無法綁定网卡。該实例[UUID: %s]未处於運行中或停止状态;當前状态为%s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10011": "該项目[uuid:%s, 名称:%s]已有一個退役策略", + "ORG_ZSTACK_COMPUTE_VM_10179": "無法分离L3网络。該虚拟機[uuid: %s]未处於運行或停止状态;當前状态为%s", + "ORG_ZSTACK_COMPUTE_VM_10178": "無法更新网卡[uuid: %s]状态,因为不支持該類型的网卡[%s]", + "ORG_ZSTACK_CORE_UPGRADE_10000": "Api: %s 在 allowedApiListGrayscaleUpgrading: %s 中被禁止。", + "ORG_ZSTACK_CORE_UPGRADE_10003": "無法找到代理版本,在灰度升級期間不支持升級叢叢操作系統統", + "ORG_ZSTACK_CORE_UPGRADE_10002": "禁用由 %s 卸载灰度升級 \\n 在您想要更新整個叢叢主機的操作系統統之前。或者嘗試使用特定的 hostUuid 更新叢叢操作系統統。", + "ORG_ZSTACK_CORE_UPGRADE_10004": "主機[uuid: %s]代理版本未更新,請在更新操作系統統前重新連接主機", + "ORG_ZSTACK_ZWATCH_API_10008": "數据開始时間[%s]大於數据結束时間[%s]", + "ORG_ZSTACK_COMPUTE_VM_10187": "當 imageUuid 为空时, %s", + "ORG_ZSTACK_COMPUTE_VM_10186": "缺失根磁碟", + "ORG_ZSTACK_COMPUTE_VM_10185": "意外的數据碟設置。dataDiskSizes 需要大於 0", + "ORG_ZSTACK_COMPUTE_VM_10182": "意外的根磁碟設置", + "ORG_ZSTACK_COMPUTE_VM_10181": "镜像的 mediaType 是 ISO,但缺少根磁碟設置", + "ORG_ZSTACK_COMPUTE_VM_10180": "vm[uuid:%s] 只能在運行中或已停止状态下才能挂载磁碟,當前状态是 %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10003": "無效日期[%s],它应該为 yyyy-MM-dd HH:mm:ss 格式", + "ORG_ZSTACK_ZWATCH_API_10010": "命名空間名称不能以保留的關键字 %s 開头", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10002": "無效手段[%s], 允許的手段为 %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10001": "無效值, %s", + "ORG_ZSTACK_IAM2_ATTRIBUTE_PROJECT_10000": "無效值,未找到 'at', 'after' 或 'exceed'", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10030": "PXE 服務器 DHCP 接口 %s 不儲在,或其没有 IP 地址。", + "ORG_ZSTACK_NETWORK_OVN_10012": "不能添加 SDN 主機,因为网卡[%s]已有IP地址[%s]", + "ORG_ZSTACK_NETWORK_OVN_10011": "無法添加 SDN 主機,因为网卡[%s]处於 SRIOV 虚拟化状态", + "ORG_ZSTACK_NETWORK_OVN_10010": "無法添加 SDN 主機,因为网卡[%s]的類型[%s]已被用於 Linux 倒换(bonding)", + "ORG_ZSTACK_NETWORK_OVN_10016": "無法添加SDN主機,因为只有KVM主機支持ovs-dpdk", + "ORG_ZSTACK_APIMEDIATOR_10000": "在同一主機上識别到多個备份儲儲,由主機名 %s 標識。已儲在一种 SftpBackupStorage [主機名:%s]。要添加的备份儲儲類型是 %s。", + "ORG_ZSTACK_NETWORK_OVN_10015": "無法添加 SDN 主機,因为綁定模式[%s]不被 OVN 支持", + "ORG_ZSTACK_NETWORK_OVN_10014": "無法添加 SDN 主機,因为网卡[%s]已被用於 VXLAN VTEP 接口", + "ORG_ZSTACK_NETWORK_OVN_10013": "無法添加SDN主機,因为网卡[%s]已連接到L2网络[name:%s]", + "ORG_ZSTACK_APIMEDIATOR_10001": "在同一主機上識别到多個备份儲儲。已儲在一個 ImageStoreBackupStorage [主機名:%s]。要添加的备份儲儲類型是 %s。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10031": "%s ~ %s 無法連接到 dhcp 接口 %s", + "ORG_ZSTACK_NETWORK_OVN_10019": "主機[uuid:%s]所在的叢叢[uuid:%s]未啟用大页内儲,不允許将其添加到SDN控制器", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10032": "叢叢[uuid:%s]和PXE服務器[uuid:%s]不属於同一區域", + "ORG_ZSTACK_NETWORK_OVN_10018": "無法添加 SDN 主機,因为子网掩碼未設置", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10033": "叢叢[uuid:%s] 不是裸金属叢叢", + "ORG_ZSTACK_NETWORK_OVN_10017": "無法添加 SDN 主機,因为 VTEPIP 未設置", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10034": "裸金属 PXE 服務器[uuid:%s]已連接至叢叢[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10035": "裸金属 PXE 服務器[uuid:%s]与叢叢[uuid:%s]中的裸金属实例不兼容,现有网卡 IP %s 超出了 PXE 服務器 DHCP 范围 %s ~ %s。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10036": "裸金属 PXE 服務器[UUID: %s]未連接至叢叢[UUID: %s]", + "ORG_ZSTACK_STORAGE_MIGRATION_10030": "目標主儲儲未連接到任何具有与源叢叢相同L2网络的叢叢。", + "ORG_ZSTACK_STORAGE_MIGRATION_10033": "不支持在共享卷[uuid: %s, name: %s]已挂载时进行儲儲迁移", + "ORG_ZSTACK_STORAGE_MIGRATION_10034": "無法将卷从 %s 迁移至 %s。", + "ORG_ZSTACK_STORAGE_MIGRATION_10031": "該卷[uuid:%s]仍然附挂在vm[uuid:%s]上,請在迁移前先将其detach。", + "ORG_ZSTACK_STORAGE_MIGRATION_10032": "無法在虚拟機[vmuuid:%s]实例未停止时,将數据卷[uuid:%s]在共享块級主要儲儲之間进行迁移。", + "ORG_ZSTACK_STORAGE_MIGRATION_10035": "無法迁移卷[%s],因为卷状态为禁用", + "ORG_ZSTACK_STORAGE_MIGRATION_10036": "没有可用的主機进行块級在线迁移:%s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10019": "無法找到 SNSTextTemplate[uuid:%s],它可能已被刪除", + "ORG_ZSTACK_NETWORK_OVN_10023": "無法将 vmnic 更改为 l3network[uuid:%s],因为虚機的主機[uuid:%s]未連接到 sdn 控制器[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10028": "無法連接到 %s,請检查 ZStack 管理節點与裸金属 PXE 服務器之間的网络連接", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10016": "应用程序平台/端點 [%s] 不支持用戶定义的模板", + "ORG_ZSTACK_NETWORK_OVN_10022": "無法将 vmnic 更改为 l3network[uuid:%s],因为未找到 sdn 控制器[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10029": "在 %s 的 /opt/zstack-dvd 下未找到本地仓库,請先下载 zstack iso 並創建本地仓库", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10015": "無效的应用平台類型[%s]", + "ORG_ZSTACK_NETWORK_OVN_10021": "無法将L3网络附加到VM,因为VM的主機[uuid:%s]未附加到SDN控制器[uuid:%s]", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10018": "無法找到主題[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10020": "無法将L3网络附加到VM,因为SDN控制器[uuid:%s]未找到", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10017": "參數:\\n %s 不被 ZStack 支持,可用值为:\\n %s", + "ORG_ZSTACK_NETWORK_OVN_10026": "失敗将网卡 qos 同步至 ovn 控制器[uuid:%s, ip:%s],因为 %s", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10011": "短信模板代碼应为13個字符的字符串。獲取到的事件模板代碼:[%s],实际長度为:[%d]。", + "ORG_ZSTACK_NETWORK_OVN_10025": "失敗獲取网卡 qos 至 ovn 控制器[uuid:%s, ip:%s], 因为 %s", + "ORG_ZSTACK_NETWORK_OVN_10024": "失敗将nic qos設置给ovn控制器[uuid:%s, ip:%s],因为%s", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10020": "不支持的裸金属备份儲儲類型", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10010": "短信模板代碼应为13個字符的字符串。獲取到的警報模板代碼:[%s],实际長度为 [%d] 個字符。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10023": "PXE 服務器 DHCP 地址范围网掩碼 %s 無效。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10024": "PXE 服務器 DHCP 范围起始地址 %s 和范围結束地址 %s 不属於同一個子网。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10025": "PXE 服務器主機名为 %s 的已经儲在。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10026": "已经有使用管理IP %s的金属節點网關,不要使用它来創建金属PXE服務器", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10027": "儲儲路径应該是一個绝对路径", + "ORG_ZSTACK_STORAGE_MIGRATION_10022": "圖像[uuid:%s]不在源备份儲儲[uuid:%s]中", + "ORG_ZSTACK_STORAGE_MIGRATION_10023": "無法将镜像从 %s 迁移至 %s。", + "ORG_ZSTACK_STORAGE_MIGRATION_10020": "源BS和目標BS必須未被禁用。", + "ORG_ZSTACK_STORAGE_MIGRATION_10021": "圖像[uuid:%s]不在就绪状态,無法迁移它。", + "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10001": "主機 %s的心跳未更新", + "ORG_ZSTACK_STORAGE_MIGRATION_10026": "卷[uuid:%s]不在就绪状态,無法迁移它。", + "ORG_ZSTACK_STORAGE_PRIMARY_CBD_10000": "未找到主機Uuid[%s]和主要儲儲Uuid[%s]的主機Id", + "ORG_ZSTACK_STORAGE_MIGRATION_10027": "無法在虚機实例未停止时迁移根卷。", + "ORG_ZSTACK_STORAGE_MIGRATION_10024": "卷[uuid:%s]已处於目標池[uuid:%s]中,無法迁移。", + "ORG_ZSTACK_STORAGE_MIGRATION_10025": "源PS和目標PS必須未处於禁用或维护状态。", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_10009": "阿里雲短信签名的長度应在2到12個字符之間。獲取到的签名: [%s] 共有 [%d] 個字符。", + "ORG_ZSTACK_STORAGE_MIGRATION_10028": "不支持挂载了共享卷的虚機[uuid:%s, name: %s]的儲儲迁移", + "ORG_ZSTACK_STORAGE_MIGRATION_10029": "無法迁移根卷组,因为該虚拟機实例上已挂载了數据卷。", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10017": "未能挂载裸金属缓儲镜像[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10019": "裸金属镜像缓儲中没有足够的空間为镜像[uuid:%s]分配空間", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10011": "失敗在_pxeserver[uuid:%s]上創建機箱[chassis uuid:%s]的dhcp配置", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10012": "失敗在_pxeserver[uuid:%s]刪除機箱[chassis uuid:%s]的dhcp配置", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10013": "裸金属 PXE 服務器代理的 UUID 發生变化[预期:%s,实际:%s],最有可能是代理被手動重啟了。請發起重新連接以同步状态", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10005": "無法找到文件夹:%s 在仪表板中", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10016": "無法連接到裸金属PXE服務器\"url:%s\",因为%s", + "ORG_ZSTACK_LICENSE_10002": "許可證請求碼非法", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10003": "sqlite3 執行失敗,因为: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10000": "不支持的方法: %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_GRAFANA_API_10001": "HTTP請求錯誤誤!状态碼:%s, 錯誤誤:%s", + "ORG_ZSTACK_STORAGE_MIGRATION_10011": "不支持在連接的ceph备份儲儲中使用iso进行儲儲迁移", + "ORG_ZSTACK_STORAGE_MIGRATION_10015": "不支持从 [%s] 到 [%s] 的儲儲迁移", + "ORG_ZSTACK_STORAGE_MIGRATION_10016": "VM[uuid:%s]正在運行但主機的uuid缺失", + "ORG_ZSTACK_STORAGE_MIGRATION_10013": "不支持从 [%s] 到 [%s] 的儲儲迁移,涉及數据卷", + "ORG_ZSTACK_STORAGE_MIGRATION_10014": "不支持从 [%s] 到 [%s] 的儲儲迁移带有快照功能", + "ORG_ZSTACK_STORAGE_MIGRATION_10019": "源BS和目標BS不能相同。", + "ORG_ZSTACK_STORAGE_MIGRATION_10017": "仅支持使用 dataVolumes 參數的數据卷在线儲儲迁移。", + "ORG_ZSTACK_STORAGE_MIGRATION_10018": "不支持从 [%s] 到 [%s] 的在线儲儲迁移仅限數据卷", + "ORG_ZSTACK_NETWORK_OVN_10001": "無法将虚拟機网卡添加到安全组,因为虚拟機网卡 SDN [uuid:%s] 与安全组 SDN [uuid:%s] 不同", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10006": "創建 BM 实例 Nginx 代理在裸金属 PXE 服務器[UUID:%s]失敗", + "ORG_ZSTACK_NETWORK_OVN_10000": "無法将三层网络附加到安全组,因为三层网络 SDN [uuid:%s] 与安全组 SDN [uuid:%s] 不同", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10007": "刪除裸金属_pxeserver 上的 bm 实例 nginx 代理[uuid:%s] 失敗", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10008": "無法啟動裸金属 PXE 服務器[UUID:%s]", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10009": "失敗停止裸金属 PXE 服務器[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10005": "無法創建安全组,因为 ovn 控制器[uuid:%s, 類型: %s] 未找到", + "ORG_ZSTACK_NETWORK_OVN_10004": "無法創建安全组因为指定了ovn控制器", + "ORG_ZSTACK_NETWORK_OVN_10003": "無法刪除主機因为主機上有 %d 個 OVN 控制器实例", + "ORG_ZSTACK_NETWORK_OVN_10002": "無法創建L3网络因为OVN不支持L3[type:%s, category:%s]", + "ORG_ZSTACK_NETWORK_OVN_10009": "無法添加 SDN 主機,因为网卡[%s]未找到", + "ORG_ZSTACK_NETWORK_OVN_10008": "無法創建 SDN L2 网络,因为没有 SDN 控制器 UUID", + "ORG_ZSTACK_NETWORK_OVN_10007": "無法将网络服務[%s]附加到OVN网络", + "ORG_ZSTACK_GUESTTOOLS_PVPANIC_10000": "不能在此处", + "ORG_ZSTACK_NETWORK_OVN_10006": "無法将 OVN 网络服務附加到具有 vSwitchType[%s] 的网络", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10001": "在裸金属PXE服務器[UUID:%s]上初始化配置失敗", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_MARKETPLACE_10000": "[市场] filterName 必須为 marketplace:true 或 marketplace:false", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10002": "在裸金属 PXE 服務器[UUID:%s]上創建 BM 实例配置失敗", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10003": "刪除裸金属 PXE 服務器 [uuid:%s] 的 BM 实例配置失敗", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10004": "在裸金属 PXE 服務器[UUID:%s]上創建 BM 实例 NOVNC 代理失敗", + "ORG_ZSTACK_BAREMETAL_PXESERVER_10005": "刪除裸金属 PXE 服務器 [uuid:%s] 上的 BM 实例 NOVNC 代理失敗", + "ORG_ZSTACK_NETWORK_SERVICE_10005": "L3Network[uuid:%s] 没有啟用网络服務[type:%s] 或者没有任何提供者提供此网络服務", + "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10000": "不支持的 SEND_SNS_MESSAGE 能力", + "ORG_ZSTACK_NETWORK_SERVICE_10004": "失敗将网络服務[%s]应用到VM[uuid: %s]", + "ORG_ZSTACK_SNS_PLATFORM_PLUGIN_10001": "插件 %s 上發送 sns 消息失敗", + "ORG_ZSTACK_NETWORK_SERVICE_10007": "提供商[%s]的网络服務必須指定", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10021": "在叢叢[uuid:%s]中未找到baremetal2分配网络", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10020": "在叢叢[uuid:%s]中未找到可用的裸金属2网關", + "ORG_ZSTACK_NETWORK_SERVICE_10001": "L3网络 [uuid: %s] 没有主機路由服務", + "ORG_ZSTACK_NETWORK_SERVICE_10000": "L3网络 [uuid: %s] 提供類型为空", + "ORG_ZSTACK_LICENSE_10019": "意外的宿主機厂商对於MINI", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10022": "裸金属2分配网络[uuid:%s]不可用,請確保其已啟用", + "ORG_ZSTACK_NETWORK_SERVICE_10009": "网络服務提供商[uuid:%s]未提供服務%s", + "ORG_ZSTACK_NETWORK_OVN_10052": "失敗刪除主機[uuid:%s]的ovs端口,网卡信息:%s,錯誤誤:%s", + "ORG_ZSTACK_NETWORK_SERVICE_10008": "無法找到网络服務提供者[uuid:%s]或其未提供任何服務", + "ORG_ZSTACK_NETWORK_OVN_10051": "失敗在宿主機[uuid:%s]刪除网络接口[%s]的ovs端口,錯誤誤:%s", + "ORG_ZSTACK_NETWORK_OVN_10050": "失敗将ovs端口同步至主機[uuid:%s]的网络接口[%s],錯誤誤:%s", + "ORG_ZSTACK_NETWORK_OVN_10056": "查询叢叢状态以驗證節點被踢出錯誤誤 %s", + "ORG_ZSTACK_NETWORK_OVN_10055": "失敗将QoS同步至OVN控制器[uuid:%s, ip:%s],錯誤誤:%s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORK_10000": "無法在目標主機[uuid:%s]上为虚拟機[uuid:%s]配置vxlan网络", + "ORG_ZSTACK_NETWORK_OVN_10054": "失敗将所需的機柜設置为宿主機[uuid:%s]的ovs端口[lsp/%s],錯誤誤:%s", + "ORG_ZSTACK_NETWORK_OVN_10053": "失敗在主機[uuid:%s]上設置所需的機柜ovs端口[%s]的lsp[%s],錯誤誤:%s", + "ORG_ZSTACK_NETWORK_OVN_10059": "失敗向 ovn 控制器[uuid:%s, ip:%s]添加 dhcp 選项,因为 %s", + "ORG_ZSTACK_NETWORK_OVN_10058": "空叢叢状态結果来自代理", + "ORG_ZSTACK_NETWORK_OVN_10057": "獲取叢叢状态失敗: %s", + "ORG_ZSTACK_NETWORK_SERVICE_10010": "网络服務[%s]已附加到L3网络[uuid:%s]", + "ORG_ZSTACK_LICENSE_10023": "失敗刪除許可證书", + "ORG_ZSTACK_LICENSE_10003": "时間戳非法", + "ORG_ZSTACK_LICENSE_10004": "意外解碼後的許可證文件長度:%d", + "ORG_ZSTACK_LICENSE_10005": "解碼失敗因为 %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10010": "在 baremetal2 叢叢[uuids:%s]中未找到可用的物理機機框", + "ORG_ZSTACK_NETWORK_SERVICE_10012": "网络服務不能为空", + "ORG_ZSTACK_NETWORK_SERVICE_10011": "當将DHCP服務綁定到L3网络[uuid:%s]时,分配IP地址不足。", + "ORG_ZSTACK_NETWORK_SERVICE_10014": "無法找到 NetworkServiceDhcpBackend[提供商類型: %s]", + "ORG_ZSTACK_NETWORK_OVN_10062": "失敗於ping ovn控制器[uuid:%s, ip:%s], 因为%s", + "ORG_ZSTACK_NETWORK_OVN_10061": "無法向 OVN 控制器[uuid:%s, ip:%s]發送命令,NfvInstGroup[uuid:%s, name:%s]的状态为%s,仅健康的或降級的组可以接受命令", + "ORG_ZSTACK_NETWORK_OVN_10060": "ovn 控制器[uuid:%s]未連接,當前状态:%s", + "ORG_ZSTACK_NETWORK_OVN_10067": "IP [%s] 當前环境中不是一個有效的VIP。請使用NFV实例组的VIP地址。", + "ORG_ZSTACK_NETWORK_OVN_10066": "無法找到 vm[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10064": "無法找到虚拟機网卡[内部名称:%s]", + "ORG_ZSTACK_NETWORK_OVN_10069": "ping sdn控制器失敗,錯誤誤:%s", + "ORG_ZSTACK_NETWORK_OVN_10068": "IP [%s] 不是任何 OVN SDN 控制器 NFV 实例组的 VIP 地址。請使用 OVN 控制器 NFV 实例组的 VIP 地址。", + "ORG_ZSTACK_CORE_10000": "未找到适用於資源Uuid[%s]的執行器", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10016": "bond 名称 %s 已经儲在", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10018": "無法找到裸金属2機箱[uuid:%s]所在的叢叢,可能該叢叢不儲在", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10017": "nic 与 mac:%s 已经被綁定", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10000": "驗證通用短信与供应商[%s]失敗", + "ORG_ZSTACK_LICENSE_10037": "MN[uuid:%s]: %s", + "ORG_ZSTACK_LICENSE_10038": "多個 MN 儲在但仅提供了 %s 的許可證", + "ORG_ZSTACK_LICENSE_10039": "在MN HA环境,但仅更新了%s的許可證", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10001": "機箱的CPU架构[arch:%s]与叢叢的CPU架构[arch:%s]不匹配", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10000": "錯誤誤的裸金属2機箱硬件信息格式: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10003": "錯誤誤的裸金属2機箱网卡硬件信息格式: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10002": "仅支持具有啟動模式 %s 的裸金属2機箱", + "ORG_ZSTACK_NETWORK_OVN_10032": "配置 OVN 叢叢節點失敗,NfvInst[uuid:%s] 因为 %s", + "ORG_ZSTACK_NETWORK_OVN_10031": "在 NfvInstGroup[uuid:%s] 中未找到实例", + "ORG_ZSTACK_NETWORK_OVN_10038": "分离 NfvInst[uuid:%s] 未找到", + "ORG_ZSTACK_NETWORK_OVN_10035": "L2网络[uuid:%s]未連接SDN控制器", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10005": "錯誤誤的裸金属2機箱磁碟硬件信息格式: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10004": "在一個裸金属2機箱中必須且只能儲在一個提供网络接口卡", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10006": "其他機箱儲在具有相同MAC地址的网卡,这是不可能的", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10009": "没有可用的裸金属2機箱找到", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_10008": "裸金属2機箱[uuid:%s]不儲在或已被禁用", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10002": "無效供应商[%s]", + "ORG_ZSTACK_SNS_PLATFORM_UNIVERSALSMS_10001": "驗證通用短信失敗", + "ORG_ZSTACK_CORE_GC_10001": "無法触發已完成的GC任務[uuid:%s, name:%s]", + "ORG_ZSTACK_LICENSE_10046": "無法在路径 %s 上找到許可[uuid:%s, 類型:%s]文件", + "ORG_ZSTACK_LICENSE_10028": "失敗刪除模块許可證", + "ORG_ZSTACK_LICENSE_10029": "UKey 不受支持(架构: %s)", + "ORG_ZSTACK_NETWORK_OVN_10041": "無法将L3网络附加到安全组,因为未找到SDN控制器[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10040": "管理IP未找到,無法卸载NfvInst[uuid:%s]", + "ORG_ZSTACK_NETWORK_OVN_10045": "失敗於啟動宿主機[uuid:%s]的ovs服務,錯誤誤:%s", + "ORG_ZSTACK_NETWORK_OVN_10043": "failed to install ovs package to host[uuid:%s], error: %s", + "ORG_ZSTACK_NETWORK_OVN_10042": "無法将L3网络附加到安全组,因为SDN控制器[uuid:%s]未連接[状态:%s]", + "ORG_ZSTACK_NETWORK_OVN_10049": "失敗在宿主機[uuid:%s]同步ovs端口,网卡为[%s],錯誤誤:%s", + "ORG_ZSTACK_NETWORK_OVN_10048": "失敗将ovs端口添加至主機[uuid:%s]的网络接口[%s],錯誤誤:%s", + "ORG_ZSTACK_NETWORK_OVN_10047": "在主機[uuid:%s]上为网卡[%s]添加ovs端口失敗,錯誤誤:%s", + "ORG_ZSTACK_LICENSE_10030": "没有本地ukey許可證更新", + "ORG_ZSTACK_LICENSE_10031": "更新本地UKey許可證: %s", + "ORG_ZSTACK_LICENSE_10032": "没有可用節點更新UKey", + "ORG_ZSTACK_GUESTTOOLS_KVM_10001": "在虚拟機[uuid:%s]中卸载Guest Tools失敗", + "ORG_ZSTACK_GUESTTOOLS_KVM_10000": "从虚機[uuid:%s]獲取客端工具信息失敗,因为:%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10033": "PCI設备编號[%s]不是標签[%s]中的有效整數", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10034": "mdev 設备規范[uuid:%s]不儲在", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10031": "PCI設备编號在標签[%s]中缺失", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10032": "PCI設备编號在標签[%s]中必須大於0", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10030": "pci 設备規格[uuid:%s]不儲在,来自標签[%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10006": "从 prometheus 獲取虚拟機工具状态失敗:[metric=%s]", + "ORG_ZSTACK_GUESTTOOLS_KVM_10005": "失敗从虚拟機[uuid:%s]detach客舱工具iso文件,原因:%s", + "ORG_ZSTACK_GUESTTOOLS_KVM_10004": "未能将客戶機工具 ISO 挂载到 VM[uuid:%s],原因:%s", + "ORG_ZSTACK_GUESTTOOLS_KVM_10003": "下载客戶工具ISO失敗,因为未找到KVM宿主機[uuid:%s]", + "ORG_ZSTACK_LICENSE_10048": "許可證過期", + "ORG_ZSTACK_LICENSE_10049": "不支持:从USB-key刪除許可證[%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10024": "没有可用的PCI設备規格供VM[uuid:%s]使用", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10025": "PCI設备規格[UUID:%s]对於VM[UUID:%s]不可用", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10023": "獲取可用於虚拟機[uuid:%s]的PCI設备規格失敗:%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10020": "雲实例[uuid:%s, 状态:%s]需要停止才能移除mdev設备規格[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10027": "为什么卷[uuid:%s, 安装路径:%s]不在目录%s中", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10026": "主機[uuid:%s]可能挂载了与SMP[uuid:%s]不同的儲儲,請检查。", + "ORG_ZSTACK_STORAGE_PRIMARY_SMP_10024": "主機[uuid:%s]具有相同的挂载路径,但实际挂载了不同的儲儲。", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10028": "mdev 設备規格[uuid:%s] 对於虚拟機[uuid:%s] 不可用", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10029": "PCI設备規格UUID在標签[%s]中缺失", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10026": "没有可用的 mdev 設备規格供虚拟機[uuid:%s]使用", + "ORG_ZSTACK_LICENSE_10050": "混合平台許可證已处於使用中。您应該通過 DeleteLicenseAction 同时移除混合平台許可證和混合插件許可證,並且 UUID 为 [uuid=%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10011": "vm[uuid:%s] 没有对应的 pci 設备規格[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10012": "vm 实例[uuid:%s, 状态:%s] 需要停止以移除pci設备規范[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10019": "vm[uuid:%s] 没有 mdev 設备規格[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10017": "vm[uuid:%s] 已经有 mdev 設备規格[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10018": "雲实例[uuid:%s, 状态:%s]需要停止以設置mdev設备規格", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10015": "VM实例[uuid:%s, 状态:%s]需要停止以設置PCI設备規格", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10009": "無法找到亲和组[uuid:%s],它可能已被刪除", + "ORG_ZSTACK_COMPUTE_VM_10309": "IP[%s]在L3网络[uuid:%s]不可用,原因:%s", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10006": "在該主機 [uuid: %s] 上儲在属於同一亲和性组 [%s] 的其他虚拟機", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10005": "VM [uuid: %s] 已经被添加到 affinityGroup [uuid: %s] 中", + "ORG_ZSTACK_COMPUTE_VM_10307": "静态IP[%s]格式錯誤誤", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10008": "vm [uuid:%s] 不满足亲和组 [uuid:%s] 的要求", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10007": "亲和组 [uuid:%s] 预留主機 [uuid:%s] 用於vm [uuid:%s] 失敗", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10003": "只能同时設置一個叢叢uuid、主機uuid或vm uuid", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10008": "vm[uuid:%s] 已经有pci設备配置[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10006": "VM 必須停止才能設置 PCI 設备属性: uuid=%s, 状态=%s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10007": "非法的PCI設备類型: %s, 有效類型: %s", + "ORG_ZSTACK_PCIDEVICE_SPECIFICATION_10004": "未找到啟用的叢叢", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10001": "無法刪除系統統標签[%s]。负载均衡插件依赖於此標签,您只能更新它", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10002": "亲和组 [uuid: %s] 不儲在", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10002": "nic[uuid:%s] 未找到。請修正您的系統統標签[%s]中的负载均衡器信息", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10001": "VM [uuid: %s] 已经添加到亲和组 [uuid: %s] 中", + "ORG_ZSTACK_COMPUTE_VM_10303": "更新 vm[%s] 的优先級到 [%s] 失敗,因为 %s", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10004": "無法操作未啟用的亲和性组 [uuid: %s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10000": "無法找到负载均衡器[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10302": "VM[uuid:%s] 只能添加 %s 個光驱", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10003": "無法操作由系統統創建的亲和性组", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10005": "無效的餘額算法[%s],有效的算法为 %s", + "ORG_ZSTACK_COMPUTE_VM_10301": "VM[uuid:%s] 已经挂载了 ISO[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10006": "無效的不健康閾值[%s],%s 不是數字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10003": "無效的负载均衡權重[%s],%s 不在范围 [%d, %d] 内", + "ORG_ZSTACK_COMPUTE_AFFINITYGROUP_10000": "Vm只能在状态[%s,%s]时更改其 affinityGroup,但vm當前处於状态[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10004": "無效的负载均衡權重[%s],%s 不是數字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10009": "無效的連接空闲超时[%s],%s 不是數字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10007": "無效的健康閾值[%s], %s 不是數字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10008": "無效的健康超时[%s],%s 不是數字", + "ORG_ZSTACK_TICKET_IAM2_10002": "操作被拒绝,因为流量收叢[uuid:%s]不属於项目[uuid:%s]", + "ORG_ZSTACK_TICKET_IAM2_10003": "虚拟ID[uuid:%s]不是該票据[uuid:%s, name:%s]的所有者", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10004": "kafka 主題不能为 null", + "ORG_ZSTACK_TICKET_IAM2_10000": "操作被拒绝,因为票据提交者[uuid:%s]已被刪除,該票据[uuid:%s, name:%s]只能在此时被刪除", + "ORG_ZSTACK_TICKET_IAM2_10001": "操作被拒绝,因为票据[uuid:%s]所關聯的项目[uuid:%s]已被刪除,现在只能刪除該票据[uuid:%s, name:%s]", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10001": "syslog 模式不能为 null", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10000": "索引不能为 null", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10003": "洛基標签的格式需要为 key=value", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_FLUENTBIT_OUTPUT_10002": "洛基標签不能为 null", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10018": "vxlan vtep地址对 [主機uuid : %s] 和 [池uuid : %s] 已经儲在", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10017": "%s: 不是ipv4", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10016": "ip[%s] l2NetworkUuid[%s] clusterUuid[%s] 該IP在本地vtep中已儲在", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10021": "無法創建VNI范围,因为L2 UUID[%s]不属於VXLAN网络池", + "ORG_ZSTACK_ALIYUN_CORE_IDENTITYZONE_10000": "必須在私有阿里雲中指定zoneId。", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10012": "無效的进程编號[%s],%s 不是數字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10010": "無效的健康检查間隔[%s],%s 不是數字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10011": "無效的最大連接數[%s],%s 不是數字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10016": "無效的健康目標[%s],端口[%s]不是數字", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10017": "失敗将VIP綁定到负载均衡器,因为VIP[%s]没有IP地址", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10014": "無效的健康检查目標[%s],检查协议[%s]無效,有效协议为 %s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10015": "無效的健康目標[%s],端口[%s] 不在范围[1, 65535] 内", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10018": "失敗将 IPv4 公网IP綁定到负载均衡器[%s],因为负载均衡器[%s]已有IPv4公网IP", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10009": "失敗在KVM宿主機[uuid:%s, 類型:%s]上实现VXLAN网络池[uuid:%s, 類型:%s],因为%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10019": "失敗将 IPv6 VIP 挂载到负载均衡器 [%s],因为负载均衡器 [%s] 已经具有 IPv6 VIP", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10004": "失敗在KVM宿主機[uuid:%s]上为l2Network[uuid:%s, type:%s, vni:%s]創建桥接[%s],因为%s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10003": "未能在主機[uuid: %s]上找到vtep,請重新将vxlan池[uuid: %s]附加到叢叢。", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10002": "找到一個主機[uuid:%s]的多個VTEP IP[%s],需要刪除該主機並重新添加", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10008": "失敗於KVM宿主機[uuid:%s]检查l2VxlanNetworkPool[uuid:%s, name:%s]的CIDR[%s],%s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10007": "失敗刪除桥接[%s]对於l2网络[uuid:%s, 類型:%s, vni:%s]在kvm主機[uuid:%s]上,因为%s", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10006": "失敗检查cidr[%s]对於l2VxlanNetwork[uuid:%s, name:%s]在kvm主機[uuid:%s]上,%s", + "ORG_ZSTACK_CRYPTO_CCS_10001": "用戶[uuid=%s]未找到", + "ORG_ZSTACK_CRYPTO_CCS_10002": "證书UUID为空且UKey系統統標签不儲在", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10020": "雲中無法刪除VIP[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10023": "服務提供商類型不匹配。负载均衡器[uuid:%s]由服務提供商[type:%s]提供,但新的服務提供商是[type:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10024": "儲在使用相同端口[%s]和相同负载均衡器[uuid:%s]的监听器", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10022": "無法獲取负载均衡监听器 [uuid:%s] 的服務提供商類型", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10027": "無效的网络接口 NIC:%s 權重,%d 不在范围 [%d, %d] 内", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10028": "無法獲取候選 vmnic,因为负载均衡器 UUID 和服務器组 UUID 均未指定", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10026": "無效的健康检查參數[%s],格式应为 method:URI:code,例如,GET:/index.html:http_2xx", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10029": "無法獲取候選项的L3网络,因为负载均衡器UUID和服務器组UUID均未指定", + "ORG_ZSTACK_CRYPTO_CCS_10008": "證书[uuid=%s]未找到", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10030": "無法分离VM网络接口到负载均衡监听器[uuid:%s],因为监听器的默認服務器组已被刪除", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10031": "無法創建负载均衡器,因为 VIP 和 IPv6 VIP 的參數为空", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10034": "负载均衡器VIP [%s] 不能是CIDR中具有公共地址池類型的首個或末尾IP地址", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10035": "雲無法創建负载均衡器,因为參數vipUuid指向的VIP[%s]不是IPv4類型", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10032": "無法創建负载均衡器,因为VIP和IPv6 VIP的L3网络不同", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10033": "該 VIP[%s] 已被其他网络服務实体[%s]占用", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10038": "操作失敗,在访问控制列表组:%s 中儲在重复或重叠的 IP 条目", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10039": "操作失敗,IP格式仅支持ip/iprange/cidr,但發现%s", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10036": "雲無法創建负载均衡器,因为參數 ipv6VipUuid 指向的 VIP[%s] 不是ipv6 VIP", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10037": "操作失敗,不支持的IP版本 %d", + "ORG_ZSTACK_VPC_HA_10001": "無法更新此网络服務,因为 vpc [uuid:%s] 不支持更新网络服務版本", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10025": "L2网络[uuid:%s] 不是 L2VxLAN類型", + "ORG_ZSTACK_VPC_HA_10002": "無法更新此网络服務,因为 vpc [uuid:%s] 使用了旧内核版本:[%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10024": "vlan[%s] 不是一個有效的vni", + "ORG_ZSTACK_VPC_HA_10003": "無法应用非默認公网的snat,因为多snat功能已被禁用", + "ORG_ZSTACK_VPC_HA_10004": "無法应用此 L3Network 的 snat,因为 l3 网络 [uuid:%s] 不是公共网络", + "ORG_ZSTACK_VPC_HA_10005": "無法应用此L3Network的snat,因为l3网络[uuid:%s]未綁定到vpc路由器", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10029": "系統統標签 [%s] 中的 CIDR 格式錯誤誤", + "ORG_ZSTACK_VPC_HA_10006": "無效的监控IP地址 [%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10028": "錯誤誤系統統標签 [%s],应該類似於:[%s]", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10027": "需要輸入一個系統統標签,例如:[%s]", + "ORG_ZSTACK_VPC_HA_10008": "vpcHaRouter [uuid:%s] 已刪除", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10042": "無法綁定類型访问控制列表组[%s],其IP版本与负载均衡器[%s]不同", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10031": "VXLAN网络池不支持創建L3网络", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10040": "IP范围[%s, %s]与访问控制列表组:%s中的起始IP:%s、結束IP:%s儲在重叠", + "ORG_ZSTACK_NETWORK_L2_VXLAN_VXLANNETWORKPOOL_10030": "重叠 vni 范围与 %s [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10045": "重定向访问控制列表组[uuid:%s]只能綁定到负载均衡监听器,必須分配服務器组", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10046": "访问控制列表组[uuid:%s]綁定到负载均衡监听器[uuid:%s]时,該监听器並非HTTPS或HTTP协议", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10043": "领域[%s], URL[%s]与访问控制列表组:%s儲在重复/重叠的重定向規则", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10044": "访问控制列表 groups[uuid:%s]用於重定向,但其中有些访问控制列表没有重定向規则却包含IP条目", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10049": "访问控制列表组[uuid:%s]已附加到另一個负载均衡监听器[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_LB_10048": "访问控制列表 groups[uuid:%s] 没有重定向規则", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10001": "帳戶没有VIP節點", + "ORG_ZSTACK_COMPUTE_VM_10239": "CreateVmInstanceMsg 不能为 null", + "ORG_ZSTACK_COMPUTE_VM_10237": "zoneUuid 必須設置,因为該镜像[name:%s, uuid:%s]位於多個备份儲儲上", + "ORG_ZSTACK_COMPUTE_VM_10236": "在附加到主儲儲[uuids:%s]的叢叢中未找到二层网络", + "ORG_ZSTACK_COMPUTE_VM_10235": "主要儲儲[uuid:%s]在區域[uuid:%s]上未附加任何叢叢", + "ORG_ZSTACK_COMPUTE_VM_10234": "無法找到与备份儲儲[uuid:%s, type:%s]可访问的主儲儲", + "ORG_ZSTACK_COMPUTE_VM_10233": "該圖像[uuid:%s]不在任何已附加到區域[uuid:%s]的备份儲儲中", + "ORG_ZSTACK_COMPUTE_VM_10232": "Spice證书不儲在,請检查是否啟用了spice tls", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10002": "無法在虚拟路由器网络与私有网络的IP地址重叠时創建虚拟路由器VM", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10001": "失敗在KVM宿主機[uuid:%s]刪除虚拟路由器啟動ISO[%s]时,为UUID:%s的虚拟路由器刪除[%s]失敗", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10000": "無法在 KVM 主機[uuid:%s, ip:%s]上为虚拟路由器[uuid:%s]創建 VirtualRouterBootstrapIso[%s],因为 %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10005": "虚拟路由器实例提供UUID:%s的网络不能与私有L3网络UUID:%s相同", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10004": "没有找到带有uuid:%s 的虚拟路由器实例", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10009": "無法添加 IP 范围,因为 L3 网络[uuid:%s]是虚拟路由器的管理网络", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10008": "無法添加 IP 范围,因为三层网络[uuid:%s]是虚拟路由器提供的管理网络", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10007": "失敗啟動 vr l3[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10242": "处理創建 VM 时的 sshkeypair 失敗因为 [%s]", + "ORG_ZSTACK_COMPUTE_VM_10241": "处理創建 VM 时的系統統標签失敗因为 [%s]", + "ORG_ZSTACK_COMPUTE_VM_10240": "实例化虚拟機的系統統標签失敗因为 %s", + "ORG_ZSTACK_COMPUTE_VM_10249": "cpu 核心數必須是整數", + "ORG_ZSTACK_COMPUTE_VM_10248": "cpuSockets 必須是整數", + "ORG_ZSTACK_COMPUTE_VM_10247": "無效啟動設备[%s]在啟動顺序中[%s]", + "ORG_ZSTACK_COMPUTE_VM_10246": "系統統標签[%s]中儲在主機名冲突;曾在L3网络[uuid:%s]上有一個虚拟機[uuid:%s]具有主機名[%s]", + "ORG_ZSTACK_COMPUTE_VM_10245": "只允許一個主機名系統統標签,但獲得了 %s 個", + "ORG_ZSTACK_COMPUTE_VM_10244": "主機名[%s]在系統統標签[%s]中指定不是一個有效的域名名称", + "ORG_ZSTACK_COMPUTE_VM_10243": "無法啟用此功能。該VM[uuid:%s]中有多個L3网络的网卡[nic:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10013": "更新虚拟路由器 [uuid:%s] 默認网络失敗,因为 %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10012": "失敗将虚拟路由器网络服務附加到l3Network[uuid:%s]。當選擇端口转發时,也必須選擇SNAT", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10011": "失敗将虚拟路由器网络服務附加到l3Network[uuid:%s]。當選擇弹性IP时,也必須選擇SNAT", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10010": "無法添加圖像,因为系統統標签 [%s] 包含無效的虚拟機镜像類型 [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10017": "虚拟路由器[name:%s, uuid:%s, 當前状态:%s]未運行,並且無法執行所需操作。請在它運行後再重試您的操作。", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10015": "失敗在虚拟路由器[uuid:%s]同步vips[ips: %s]到热镜像vr时因为%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10014": "無效的 AppliancesVmType %s", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10000": "無法更改資源拥有者,因为資源[uuid:%s, 類型:VmInstance]已经關聯了安全组", + "ORG_ZSTACK_TEST_COMPUTE_HOSTALLOCATOR_10000": "故意", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10019": "虚拟路由器[uuid:%s]没有管理网卡可以对%s發起HTTP調用", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10018": "虚拟路由器[uuid:%s]处於無法对%s进行HTTP調用的状态:%s", + "ORG_ZSTACK_COMPUTE_VM_10253": "只允許一個啟動模式系統統標签,但獲取到了 %d 個", + "ORG_ZSTACK_COMPUTE_VM_10252": "不应該有一個VM有多個userdata系統統標签。", + "ORG_ZSTACK_COMPUTE_VM_10251": "已经为虚機[uuid: %s]分配了一個用戶數据系統統標签。", + "ORG_ZSTACK_COMPUTE_VM_10250": "cpuThreads 必須是整數", + "ORG_ZSTACK_COMPUTE_VM_10259": "無效的 usbRedirect[%s], %s 不是 usbRedirect 標签", + "ORG_ZSTACK_COMPUTE_VM_10258": "無效的 %s[%s],值 [%s] 不是布尔值", + "ORG_ZSTACK_COMPUTE_VM_10257": "無效的 %s 標签[%s]", + "ORG_ZSTACK_COMPUTE_VM_10256": "虚拟機類型要求为[q35, pc, virt],但獲取到[%s]", + "ORG_ZSTACK_COMPUTE_VM_10254": "[%s] 在系統統標签 [%s] 中指定的啟動模式無效", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10020": "無法将网卡[ip:%s, ip6:%s, mac:%s]添加到虚拟路由器VM[uuid:%s ip:%s],因为%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10024": "無法設置默認网络,因为l3 uuid[:%s]是管理网络", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10023": "l3 uuid[:%s] 没有綁定到虚拟路由器 [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10022": "l3 uuid[:%s] 与虚拟路由器 [uuid:%s] 的默認网络相同", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10021": "無法将服務器IP添加到负载均衡服務器组,因为共享负载均衡器没有服務提供商,請先添加vmnic", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10010": "無法創建VIP,因为無法確定VIP版本", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10012": "服務提供商 của vip[uuid:%s, name:%s, ip: %s] 已被設置为 %s", + "ORG_ZSTACK_TICKET_EXECUTOR_10001": "从事件獲取值失敗:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10025": "無法設置默認网络,因为 l3 uuid[:%s] 不是公共网络", + "ORG_ZSTACK_TICKET_EXECUTOR_10000": "在 API 類中未找到名称为[%s]的類", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10016": "無法設置 VM 网卡安全组,因为网卡[UUID:%s]未綁定到任何安全组", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10015": "無法設置 VM 网卡安全组,因为未找到网卡[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10007": "requiredIp[%s] 不在有效的IPv4 mediaType 中", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10018": "無法設置VM网卡安全组,因为优先級無效,优先級[%d]不能小於1", + "ORG_ZSTACK_COMPUTE_10003": "VM NIC 的出站带宽[%d]超出[8192, 32212254720]范围", + "ORG_ZSTACK_COMPUTE_VM_10264": "vm[uuid:%s, name:%s] 已被刪除", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10017": "無法設置VM网卡安全组,因为安全组[UUID:%s]未找到", + "ORG_ZSTACK_COMPUTE_10004": "入站带宽[%d]超出[8192, 32212254720]范围", + "ORG_ZSTACK_COMPUTE_VM_10263": "資源[uuid:%s]是一個根磁碟,您無法更改其所有者,而是更改属於該根磁碟的虚拟機的所有者", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10009": "必需的 IP 地址 [%s] 已经被使用", + "ORG_ZSTACK_COMPUTE_10001": "VM NIC 的 l3NetworkUuid 不能为 null", + "ORG_ZSTACK_COMPUTE_VM_10262": "rootDiskOfferingUuid 在創建不使用镜像的虚拟機时不能为 null", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10008": "已经在 l3Network[uuid:%s] 上儲在一個 vip[%s]", + "ORG_ZSTACK_NETWORK_SECURITYGROUP_10019": "無法設置VM NIC安全组,因为优先級重复,两個安全组%s和%s的优先級均为%d", + "ORG_ZSTACK_COMPUTE_10002": "vm 的 nic 的 l3NetworkUuid 不在 l3[%s] 中", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10003": "無法刪除IP,因为IP[uuid:%s]是一個VIP", + "ORG_ZSTACK_COMPUTE_VM_10260": "無效的usbRedirect[%s],%s 不是布尔類型", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10002": "VIP 無法由此帳號访问", + "ORG_ZSTACK_COMPUTE_10000": "重复的网络接口參數", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10005": "不支持的 IP 分配策略[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIP_10004": "系統統VIP不能通過API消息刪除", + "ORG_ZSTACK_COMPUTE_VM_10269": "該虚拟機[UUID:%s]在L3网络[UUID:%s]上没有网卡", + "ORG_ZSTACK_COMPUTE_10007": "vm nic驱動程序 %s 还不支持", + "ORG_ZSTACK_COMPUTE_VM_10268": "獲取到了主機[uuid:%s]上vm[uuid:%s]的未知状态", + "ORG_ZSTACK_COMPUTE_VM_10267": "未能检查宿主機[uuid:%s]上vm[uuid:%s]的状态,%s", + "ORG_ZSTACK_COMPUTE_10005": "vm nic 的多队列數[%d]超出了[1,256]范围", + "ORG_ZSTACK_COMPUTE_10006": "L3[uuid:%s] 虚拟機网卡状态[%s] 不是 %s 或 %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10031": "無法創建虚拟路由器報价,因为管理网络尚不支持IPv6", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10030": "管理网络[uuid:%s]不在相同的區域[uuid:%s]此配置将創建的區域是:zone[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10035": "三层网络[UUID: %s]啟用了SNAT服務,無法用作管理网络", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10034": "圖像[uuid:%s]的格式为%s,無法用於虚拟路由器", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10033": "image[uuid:%s]'s mediaType is %s, the mediaType of a virtual router image must be %s\" 翻译成中文为:\n\n\"image[uuid:%s] 的媒体類型是 %s,虚拟路由器圖像的媒体類型必須是 %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10032": "公共网络[uuid:%s]不在相同的區域[uuid:%s]此配置将創建的區域是:[uuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10087": "該镜像[uuid:%s, 名称:%s]已在所有备份儲儲上被刪除", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10039": "管理网络[uuid:%s,网關:%s]不可達", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10038": "管理网络[uuid:%s]没有任何IP范围", + "ORG_ZSTACK_STORAGE_VOLUME_10086": "主要儲儲類型 [%s] 还不支持共享卷", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10037": "三层网络[uuid: %s]与[uuid: %s]具有相同的网络地址,無法用於虚拟路由器", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_10036": "三层网络[UUID: %s]啟用了SNAT服務,無法用作公共网络", + "ORG_ZSTACK_STORAGE_VOLUME_10088": "無法找到一個备份儲儲,該儲儲满足以下条件的镜像[uuid:%s]:1. 状态为啟用 2. 状态为連接中 3. 已附加到主儲儲所在的區域[uuid:%s]所在區域中。", + "ORG_ZSTACK_STORAGE_VOLUME_10083": "重复的卷UUID:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10082": "無法撤销非最新快照", + "ORG_ZSTACK_STORAGE_VOLUME_10085": "獲取主儲儲 %s 類型失敗", + "ORG_ZSTACK_STORAGE_VOLUME_10092": "目標磁碟在創建過程中被清空", + "ORG_ZSTACK_STORAGE_VOLUME_10091": "主儲儲 UUID 冲突,由磁碟配置指定的主儲儲是 %s,而創建參數中指定的主儲儲是 %s", + "ORG_ZSTACK_STORAGE_VOLUME_10093": "there_should_not_be_more_than_one_%s_implementation.", + "ORG_ZSTACK_STORAGE_VOLUME_10096": "無法将ISO下载到主儲儲,因为:%s", + "ORG_ZSTACK_ZDFS_10000": "ping zdfs 失敗, %s", + "ORG_ZSTACK_COMPUTE_VM_10204": "無效的 JSON 格式,原因:%s", + "ORG_ZSTACK_COMPUTE_VM_10203": "l3NetworkUuids 和 vmNicInventories 不能同时为空或同时設置", + "ORG_ZSTACK_COMPUTE_VM_10200": "卷[uuid:%s]無法满足条件[state:啟用 status:就绪]", + "ORG_ZSTACK_COMPUTE_VM_10219": "因为已弃用,所以無法調用此API", + "ORG_ZSTACK_COMPUTE_VM_10218": "無法更新 VM[uuid:%s] 的控制台密碼,因为當前未設置控制台密碼。", + "ORG_ZSTACK_ZDFS_10002": "在儲在主機名[%s]的zdfs中有问題", + "ORG_ZSTACK_ZDFS_10001": "連接 ZDFS 失敗, %s", + "ORG_ZSTACK_COMPUTE_VM_10217": "無法更新 VM[uuid:%s] 的控制台密碼,因为其不在“運行”状态。當前状态是 '%s'。", + "ORG_ZSTACK_COMPUTE_VM_10216": "控制台密碼不能以 \"password\" 開头,这可能会触發 VNC 安全问題", + "ORG_ZSTACK_COMPUTE_VM_10215": "不允許挂载重复的ISO文件", + "ORG_ZSTACK_COMPUTE_VM_10214": "該圖像[uuid=%s]不儲在", + "ORG_ZSTACK_COMPUTE_VM_10220": "CD-ROM[%s] 已是默認值", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10002": "主機名不能为null", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10000": "設施不能为 null", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10001": "無效的服務設施 %s", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10006": "日誌服務器[地址: %s]不可用", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10007": "日誌服務器[地址: %s:%s]不可用", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10004": "协议不能为 null", + "ORG_ZSTACK_LOG4J2_APPENDER_SYSLOG_10005": "不支持的协议 %s", + "ORG_ZSTACK_COMPUTE_VM_10228": "预期单播MAC地址,發现组播MAC地址 [%s]", + "ORG_ZSTACK_COMPUTE_VM_10227": "不允許的地址", + "ORG_ZSTACK_COMPUTE_VM_10226": "不是一個有效的MAC地址 [%s]", + "ORG_ZSTACK_COMPUTE_VM_10225": "这不是一個有效的MAC地址 [%s]", + "ORG_ZSTACK_COMPUTE_VM_10224": "cpu拓扑不正確,cpuNum[%s],配置的cpuSocket數[%s],cpuCore數[%s],cpu线程數[%s];计算得到的cpuSocket數[%s],cpuCore數[%s],cpu线程數[%s]", + "ORG_ZSTACK_COMPUTE_VM_10221": "vm[uuid:%s] 只能在運行状态时进行 fstrim,當前状态是 %s", + "ORG_ZSTACK_STORAGE_VOLUME_10046": "該磁碟[uuid:%s]不在已刪除状态。此操作是用於恢复一個已刪除的數据卷", + "ORG_ZSTACK_STORAGE_VOLUME_10049": "圖像[uuid:%s]未啟用,它的是%s", + "ORG_ZSTACK_STORAGE_VOLUME_10048": "圖像[uuid:%s]不是%s,而是%s", + "ORG_ZSTACK_STORAGE_VOLUME_10042": "卷[uuid:%s]不在啟用状态,當前状态为%s,無法創建快照", + "ORG_ZSTACK_STORAGE_VOLUME_10045": "卷[uuid:%s]不在Ready状态,當前状态为%s,無法創建快照", + "ORG_ZSTACK_STORAGE_VOLUME_10044": "無法獲取内儲快照,vm當前状态[%s],但期望状态为[%s, %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10041": "卷[uuid:%s, 類型:%s], 無法創建快照", + "ORG_ZSTACK_LOGIN_10022": "無效属性。属性[%s]是必需的,但發现有记录[%s]不匹配", + "ORG_ZSTACK_LOGIN_10024": "策略是必填字段%", + "ORG_ZSTACK_LOGIN_10023": "無效的 JSON 格式", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10007": "keyLabel %s 和 encryptResult %s 不一致", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10006": "flkSec 安全機器不健康: %s", + "ORG_ZSTACK_LOGIN_10029": "名称应使用 %s 中的值", + "ORG_ZSTACK_LOGIN_10026": "属性是必填字段 %", + "ORG_ZSTACK_LOGIN_10025": "名称是必填字段 %", + "ORG_ZSTACK_LOGIN_10028": "可選字段 % 是必填项", + "ORG_ZSTACK_LOGIN_10027": "類型是必填字段 %", + "ORG_ZSTACK_STORAGE_VOLUME_10058": "該磁碟[uuid:%s, name:%s]是根磁碟,無法挂接它", + "ORG_ZSTACK_STORAGE_VOLUME_10057": "虚拟機[uuid:%s]不支持在线挂载磁碟[%s],因为該虚拟機的镜像平台類型为其他類型", + "ORG_ZSTACK_STORAGE_VOLUME_10059": "數据卷[uuid:%s]已禁用,無法挂载", + "ORG_ZSTACK_STORAGE_VOLUME_10054": "數据卷[uuid:%s]未綁定到任何虚拟機,無法解綁", + "ORG_ZSTACK_STORAGE_VOLUME_10053": "卷[uuid:%s]的状态为[%s],仅當状态为%s或%S时才能挂载數据卷", + "ORG_ZSTACK_STORAGE_VOLUME_10056": "該卷[uuid:%s, 名称:%s, 類型:%s]無法脱离挂载", + "ORG_ZSTACK_CORE_PLUGIN_10001": "插件[%s]的名称、产品密钥和供应商不能为null", + "ORG_ZSTACK_STORAGE_VOLUME_10055": "为了分离可共享數据卷[uuid:%s],需要提供虚拟機的uuid。", + "ORG_ZSTACK_STORAGE_VOLUME_10050": "圖像[uuid:%s] 不处於就绪状态,它处於%s", + "ORG_ZSTACK_STORAGE_VOLUME_10052": "卷[uuid:%s]处於状态[%s],只有在状态为%s时才能挂载數据卷", + "ORG_ZSTACK_STORAGE_VOLUME_10051": "卷[uuid:%s]是根卷,不能附加到VM上", + "ORG_ZSTACK_LOGIN_10011": "驗證 dn [%s] 失敗,可能已被刪除", + "ORG_ZSTACK_CORE_PLUGIN_10000": "未知产品插件名称: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10069": "卷[uuid:%s, 類型:%s]無法被刪除", + "ORG_ZSTACK_STORAGE_VOLUME_10068": "意外的磁碟大小設置", + "ORG_ZSTACK_STORAGE_VOLUME_10065": "無法将磁碟附加到虚拟機,没有合适的叢叢", + "ORG_ZSTACK_STORAGE_VOLUME_10064": "數据卷[uuid:%s]具有格式[%s],仅能附加到hypervisor[%s]類型上,但vm的hypervisor類型为[%s]。無法附加", + "ORG_ZSTACK_RESOURCECONFIG_10009": "帳戶無權访问資源[uuid: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10067": "不允許备份根卷,uuid:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10066": "無法将磁碟附加到在[uuid: %s]主機上運行的vm,該主機与磁碟儲儲[uuid: %s]斷開連接", + "ORG_ZSTACK_STORAGE_VOLUME_10061": "數据卷[uuid:%s]已附加到某些VM,無法再次附加", + "ORG_ZSTACK_IAM2_ATTRIBUTE_10000": "属性[name:%s]是一個系統統属性,無法更新", + "ORG_ZSTACK_NETWORK_OVN_10074": "OVN SDN 控制器[uuid:%s, name:%s] 处於斷開連接状态,無法添加主機[uuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10060": "該磁碟[uuid:%s]的状态为已刪除,無法執行此操作", + "ORG_ZSTACK_NETWORK_OVN_10073": "失敗将逻辑交换機[uuid:%s, name:%s]添加到ovn控制器[uuid:%s, ip:%s],因为%s", + "ORG_ZSTACK_STORAGE_VOLUME_10063": "數据卷[uuid:%s]的格式[%s]不支持挂载到任何虚拟機监控程序。", + "ORG_ZSTACK_STORAGE_VOLUME_10062": "數据卷只能在状态为 [%s, %s] 时挂接,當前状态是 %s", + "ORG_ZSTACK_NETWORK_OVN_10071": "失敗将逻辑交换機同步至ovn控制器[uuid:%s, ip:%s],因为%s", + "ORG_ZSTACK_LOGIN_10000": "ZStack 现在正在从數据库加载ldap组织信息,無法執行同步操作", + "ORG_ZSTACK_NETWORK_OVN_10078": "NfvInst[uuid:%s] 未找到", + "ORG_ZSTACK_NETWORK_OVN_10077": "L2网络[uuid:%s]未連接OVN控制器", + "ORG_ZSTACK_NETWORK_OVN_10076": "未能从 ovn 控制器刪除逻辑交换端口[uuid:%s, ip:%s],因为 %s", + "ORG_ZSTACK_STORAGE_VOLUME_10070": "卷[uuid:%s]已处於刪除状态", + "ORG_ZSTACK_LOGIN_10001": "失敗同步ldap条目[], 因为 %s", + "ORG_ZSTACK_NETWORK_OVN_10075": "失敗将逻辑交换機端口添加到 OVN 控制器[uuid:%s, ip:%s],因为 %s", + "ORG_ZSTACK_V2V_10037": "主機[uuid:%s]未連接", + "ORG_ZSTACK_V2V_10038": "主要儲儲[uuid%s]未連接", + "ORG_ZSTACK_V2V_10035": "無法为转换主機[uuid:%s]预留 %s 字節,可用容量不足", + "ORG_ZSTACK_NETWORK_OVN_10079": "NfvInstGroup[uuid:%s] 未找到", + "ORG_ZSTACK_LOGIN_10008": "驗證 uid[%s] 失敗,可能已被刪除", + "ORG_ZSTACK_LOGIN_10007": "無法同步范围不是%s的LDAP/AD服務器", + "ORG_ZSTACK_V2V_10031": "無效的v2v服務质量系統統標签", + "ORG_ZSTACK_V2V_10032": "無效的网络带宽[%s],它必須大於或等於1048576", + "ORG_ZSTACK_LOGIN_10009": "失敗为 uid[%s] 創建 iam2 虚拟 id,因为 %s", + "ORG_ZSTACK_LOGIN_10004": "同步 LDAP 组织失敗", + "ORG_ZSTACK_BAREMETAL2_10001": "無效的IPMI機箱配置:當提供\"provisionIp\"时,\"reboot\"必須为\"No\"", + "ORG_ZSTACK_V2V_10030": "儲在一個主機Uuid为%s的版本2到版本2转换主機", + "ORG_ZSTACK_BAREMETAL2_10002": "無效的IPMI機箱配置:'platform'必須为'Linux'當提供了'provisionIp'时", + "ORG_ZSTACK_LOGIN_10006": "失敗同步组织信息,因为 %s", + "ORG_ZSTACK_LOGIN_10005": "转换ldap条目到组织節點失敗", + "ORG_ZSTACK_BAREMETAL2_10000": "無效的IPMI機箱配置:當提供了'provisionIp'时,'provisionType'必須为'Direct'\"", + "ORG_ZSTACK_STORAGE_VOLUME_10079": "無法分离磁碟[%s]与宿主機。它可能已被分离", + "ORG_ZSTACK_STORAGE_VOLUME_10076": "無法将磁碟[%s]挂载到主機[%s],因为該磁碟已挂载到主機[%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10075": "挂载路径必須是绝对路径", + "ORG_ZSTACK_NETWORK_OVN_10080": "NfvInstGroup[uuid:%s] 没有配置VIP", + "ORG_ZSTACK_STORAGE_VOLUME_10078": "無法将磁碟[%s]挂载到主機[%s],因为另一個磁碟占用了挂载路径[%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10077": "無法将磁碟[%s]挂载到宿主機[%s],因为磁碟[%s]占用了宿主機[%s]上的挂载路径[%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10072": "不允許更改根卷的状态,uuid:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10071": "無法刪除卷[%s],因为該卷已挂载至主機[%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10074": "無法将磁碟[%s]挂载到主機[%s],因为主機[状态:%s]未連接", + "ORG_ZSTACK_NETWORK_OVN_10083": "失敗於更新 NfvInst[uuid:%s] 的 OVN 叢叢節點,因为 %s", + "ORG_ZSTACK_STORAGE_VOLUME_10073": "不能更改卷[%s]的状态,因为該卷已挂载到主機[%s]", + "ORG_ZSTACK_NETWORK_OVN_10082": "在 NfvInstGroup[uuid:%s] 中未找到满足叢叢配置的实例", + "ORG_ZSTACK_RESOURCECONFIG_10002": "資源配置 [類别:%s, 名称:%s] 無法綁定到資源類型: %s", + "ORG_ZSTACK_RESOURCECONFIG_10001": "無法找到資源[uuid: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10081": "無法在卷[uuid: %s]使用的快照树中找到", + "ORG_ZSTACK_V2V_10028": "無法找到源虚拟機的類型[url:%s]", + "ORG_ZSTACK_RESOURCECONFIG_10000": "資源的 resourceTypes 不一致。詳情: %s", + "ORG_ZSTACK_STORAGE_VOLUME_10080": "無法壓平可共享卷[uuid:%s]", + "ORG_ZSTACK_V2V_10029": "無法找到源VM工厂[url:%s, 虚拟化類型:%s]", + "ORG_ZSTACK_RESOURCECONFIG_10007": "全局配置[類别:%s, 名称:%s]無法綁定資源", + "ORG_ZSTACK_V2V_10026": "無法找到 L3Network[uuid:%s] 以啟動當前虚拟機,它可能已被刪除,操作建议:刪除此虚拟機,重新創建一個新的虚拟機", + "ORG_ZSTACK_RESOURCECONFIG_10006": "没有全局配置[類别:%s, 名称:%s]找到", + "ORG_ZSTACK_V2V_10024": "不是清理的时候", + "ORG_ZSTACK_V2V_10025": "转换主機[uuid:%s, 主機Uuid:%s]未連接", + "ORG_ZSTACK_V2V_10022": "有一些从版本2到版本2的转换任務正在进行中。無法从主機[%s]detach卷[%s]", + "ORG_ZSTACK_V2V_10020": "主儲儲[uuid:%s]既未啟用也未連接", + "ORG_ZSTACK_V2V_10021": "有一些版本为2的迁移任務正在进行中。無法将磁碟[%s]附加到主機[%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10007": "io线程需要qemu版本 >= %s,但主機[%s]的版本为 %s。", + "ORG_ZSTACK_STORAGE_VOLUME_10009": "根卷[%s]無法設置io线程綁定。", + "ORG_ZSTACK_STORAGE_VOLUME_10008": "io线程需要libvirt版本 >= %s,但主機[%s]上的版本是 %s。", + "ORG_ZSTACK_STORAGE_VOLUME_10003": "當前主要儲儲 %s 不是 Ceph 類型,無法獲取访问路径", + "ORG_ZSTACK_STORAGE_VOLUME_10005": "當前主要儲儲類型不支持块卷,支持類型有%s", + "ORG_ZSTACK_STORAGE_VOLUME_10004": "Ceph 類型的块卷访问路径 ID,accessPathIqn 不能为 null", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10000": "JitClientFactory 测試連接失敗", + "ORG_ZSTACK_SSO_CAS_FILTER_10000": "URL格式錯誤誤,客戶端UUID缺失", + "ORG_ZSTACK_SSO_CAS_FILTER_10001": "缺少cas客戶端,請在单點登录前創建cas客戶端", + "ORG_ZSTACK_COMPUTE_VM_10275": "VM[uuid:%s] 的状态不是運行中。", + "ORG_ZSTACK_CONSOLE_10011": "控制台代理未連接;大多數情况下是管理節點刚刚啟動,請等待控制台代理連接,或者如果長时間斷開連接,您可以手動重新連接。", + "ORG_ZSTACK_CONSOLE_10010": "vm[uuid:%s] 不处於 %s 状态,當前状态是 %s", + "ORG_ZSTACK_COMPUTE_VM_10273": "从根卷[uuid:%s]在主儲儲[uuid:%s]上創建模板失敗", + "ORG_ZSTACK_COMPUTE_VM_10270": "雲主機已被刪除", + "ORG_ZSTACK_CONSOLE_10013": "控制台代理[uuid: %s, 状态: %s]在代理[ip: %s]上未連接,無法刪除它", + "ORG_ZSTACK_CONSOLE_10012": "無法找到VM[uuid:%s]的主機IP地址,VM運行了吗???", + "ORG_ZSTACK_COMPUTE_VM_10279": "失敗在宿主機上更新虚拟機[uuid=%s]:某些属性的修改失敗", + "ORG_ZSTACK_COMPUTE_VM_10278": "失敗在宿主機上更新虚機[uuid=%s]。", + "ORG_ZSTACK_COMPUTE_VM_10277": "ISO[uuid:%s] 处於不兼容的备份儲儲上,而該虚拟機[name:%s, uuid:%s]位於主要儲儲[uuid:%s]上", + "ORG_ZSTACK_COMPUTE_VM_10276": "無法更新虚拟機[uuid:%s]的控制台密碼,該虚拟機未在任何主機上運行", + "ORG_ZSTACK_STORAGE_VOLUME_10018": "無法調整卷[%s]的大小,因为卷状态为禁用", + "ORG_ZSTACK_STORAGE_VOLUME_10017": "卷[uuid:%s]不是數据卷", + "ORG_ZSTACK_STORAGE_VOLUME_10019": "至少应設置 vmInstanceUuid 或 uuid 中的一個", + "ORG_ZSTACK_STORAGE_VOLUME_10014": "不支持在不同的虚拟機[uuid:%s, uuid:%s]上对卷[uuid:%s, uuid:%s]进行快照操作", + "ORG_ZSTACK_STORAGE_VOLUME_10013": "卷[uuid:%s]未找到", + "ORG_ZSTACK_STORAGE_VOLUME_10016": "VM[%s]的状态为%s,不允許創建快照", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10013": "jit 安全機器不健康: socket 連接到 %s:%s 失敗", + "ORG_ZSTACK_STORAGE_VOLUME_10015": "卷[uuid:%s]尚未就绪", + "ORG_ZSTACK_STORAGE_VOLUME_10010": "當前 I/O 线程 ID[%s] 与附加卷[%s] 的 I/O 线程[%s] 不相同。", + "ORG_ZSTACK_STORAGE_VOLUME_10012": "快照驗證不支持对於卷[uuid: %s]。附加的虚拟機不在状态[%s, %s]中", + "ORG_ZSTACK_STORAGE_VOLUME_10011": "快照驗證不支持对於挂载有UUID:%s的卷。卷应該挂载在VM上", + "ORG_ZSTACK_CONSOLE_10000": "Ansible 私有密钥未找到。", + "ORG_ZSTACK_COMPUTE_VM_10285": "失敗於解綁VM[uuid=%s]的卷[uuid=%s]", + "ORG_ZSTACK_COMPUTE_VM_10284": "从卷中分离卷在虚拟機[uuid=%s]处於状态[%s]时不允許", + "ORG_ZSTACK_COMPUTE_VM_10283": "ISO[uuid:%s] 没有附接到 VM[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10282": "在虚拟機[uuid=%s]於宿主機上的更新失敗:部分属性的修改失敗", + "ORG_ZSTACK_CONSOLE_10004": "失敗重連控制台代理", + "ORG_ZSTACK_COMPUTE_VM_10281": "失敗在hypervisor上更新vm[uuid=%s]", + "ORG_ZSTACK_CONSOLE_10003": "配置控制台代理绕過IP[code:%d]或控制台代理端口[code:%d]失敗", + "ORG_ZSTACK_COMPUTE_VM_10280": "無法創建 VM,名称为 [%s] 的 VM 已经儲在", + "ORG_ZSTACK_CONSOLE_10002": "其他进程正在使用該端口:%s", + "ORG_ZSTACK_CONSOLE_10001": "無效的管理節點UUID[%s]", + "ORG_ZSTACK_CONSOLE_10008": "無法检查控制台代理可用性,因为 %s", + "ORG_ZSTACK_CONSOLE_10007": "建立 VNC: 非预期的 uri: %s", + "ORG_ZSTACK_COMPUTE_VM_10288": "一個虚拟機不能創建 %s 张光碟,虚拟機只能添加 %s 张光碟", + "ORG_ZSTACK_CONSOLE_10009": "操作錯誤誤,因为:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10029": "扩展操作不允許在主機禁用时进行", + "ORG_ZSTACK_STORAGE_VOLUME_10028": "最小增加大小应大於4MB", + "ORG_ZSTACK_STORAGE_VOLUME_10025": "無法同时設置读寫和总带宽限制。", + "ORG_ZSTACK_STORAGE_VOLUME_10024": "無法同时設置读寫和总IOPS限制。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10023": "在使用 jit 安全機器獲取属性时未处理异常:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10027": "無法縮小 [%s] 卷[uuid:%s]的大小", + "ORG_ZSTACK_STORAGE_VOLUME_10026": "磁碟带宽不能为 null,必須给出一個磁碟带宽值。", + "ORG_ZSTACK_STORAGE_VOLUME_10021": "卷[uuid:%s]不是根卷", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_JIT_10022": "jit安全機器獲取属性失敗,状态碼:%s,詳情:%s", + "ORG_ZSTACK_STORAGE_VOLUME_10020": "没有找到对应的卷[uuid:%s, vmInstanceUuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10023": "無法同时設置legacy參數和新參數", + "ORG_ZSTACK_STORAGE_VOLUME_10022": "共享卷無法設置带宽。", + "ORG_ZSTACK_COMPUTE_VM_10293": "無法獲取 %s 的圖像大小,請報告异常。", + "ORG_ZSTACK_STORAGE_VOLUME_10035": "仅支持分离磁碟,請使用 SetVmBootVolumeMsg 代替。", + "ORG_ZSTACK_ZWATCH_PROMETHEUS_10000": "主機[uuid:%s]在數据库中未找到", + "ORG_ZSTACK_STORAGE_VOLUME_10038": "hypervisor[%s] 对单個 VM 只允許挂载最多 %s 個數据卷;當前已挂载了 %s 個數据卷至 vm[uuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_10032": "無法找到镜像缓儲[imageUuid: %s]用於重新初始化卷", + "ORG_ZSTACK_STORAGE_VOLUME_10031": "共享卷[uuid: %s]已附加到未停止的虚拟機实例[uuids: %s]", + "ORG_ZSTACK_STORAGE_VOLUME_10034": "卷[uuid%s]应該已挂接。", + "ORG_ZSTACK_STORAGE_VOLUME_10033": "該磁碟[uuid:%s, name:%s]尚未刪除,無法執行刪除操作", + "ORG_ZSTACK_STORAGE_VOLUME_10030": "扩展操作不允許在所有主機禁用的情况下執行", + "ORG_ZSTACK_LOGIN_10033": "系統統中不儲在 LDAP/AD 服務器,請先添加一個 LDAP/AD 服務器。", + "ORG_ZSTACK_LOGIN_10032": "不能将此ldap uid %s 綁定到虚拟id [uuid:%s]", + "ORG_ZSTACK_LOGIN_10034": "这個 UID 已经被使用", + "ORG_ZSTACK_LOGIN_10030": "無效属性。属性[%s]是必需的,但發现有一些记录未匹配", + "ORG_ZSTACK_STORAGE_CDP_10091": "無效的最大容量[%d], 當前使用量为%d", + "ORG_ZSTACK_STORAGE_CDP_10089": "主機名未找到[用於备份儲儲的UUID: %s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10009": "加密功能已啟用,但自動登录所需資源池[%s]未設置。", + "ORG_ZSTACK_SSO_SAML2_10001": "IdP元數据無效(Base64解碼为空)。", + "ORG_ZSTACK_SSO_SAML2_10002": "从Base64解碼IdP元數据失敗", + "ORG_ZSTACK_SSO_SAML2_10000": "IdP元數据为空。", + "ORG_ZSTACK_ZSV_10002": "在操作快照组之前,請先分离共享卷或LUN設备", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10000": "没有为安全機器[模型=%s]配置客戶端", + "ORG_ZSTACK_ZSV_10001": "卷 %s 仍具有快照组,無法刪除它", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10001": "没有安全機器客戶端工厂用於安全機器[type=%s]", + "ORG_ZSTACK_ZSV_10000": "卷 %s 仍儲在针对 VM %s 的快照组,無法挂载到其他 VM", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10002": "安全機器管理器实现 安全機器加密失敗", + "ORG_ZSTACK_ZWATCH_ALARM_SNS_TEMPLATE_HTTP_10001": "HTTP 模板保儲錯誤誤,請检查模板文本:%s", + "ORG_ZSTACK_STORAGE_CDP_10097": "創建虚拟機任務已取消", + "ORG_ZSTACK_STORAGE_CDP_10095": "撤销任務已取消", + "ORG_ZSTACK_ACCESSKEY_10002": "[帳號ID: %s, 用戶ID: %s] 不是有效的帳號或IAM2项目/用戶", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10019": "無法連接到機箱 [uuid:%s],請检查IPMI連接。", + "ORG_ZSTACK_ACCESSKEY_10001": "如果指定的 Accesskey 是预期的,则必須同时提供 AccesskeyId 和 AccesskeySecret。", + "ORG_ZSTACK_ACCESSKEY_10004": "访问密钥數量对於[帳戶ID: %s, 用戶ID: %s]超過最大值", + "ORG_ZSTACK_ACCESSKEY_10000": "没有權限執行該操作 [accountUuid:%s, userUuid:%s]", + "ORG_ZSTACK_TEST_10008": "我不应該在錯誤誤列表中", + "ORG_ZSTACK_TEST_10009": "我也不应該在錯誤誤列表中。", + "ORG_ZSTACK_TEST_10006": "已完成,故意如此", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10020": "从文件加载機箱信息失敗,因为:%s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10029": "另一個連接安全機器任務正在運行,請取消新的任務並等待返回", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10026": "安全機器已禁用,無法检测心跳", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10027": "%s 心跳检测失敗", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10028": "%s 心跳检测异常", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10021": "解密數据[%s]或算法類型[%s]为空", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10022": "無效解密算法類型: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10024": "無法刪除。在啟用加密功能後,資源池中提供該服務的同步安全機器的數量至少为1台", + "ORG_ZSTACK_TEST_10004": "我也不应該出现在錯誤誤列表中%d", + "ORG_ZSTACK_TEST_10005": "故意 %d", + "ORG_ZSTACK_SNS_SYSTEM_10002": "API 主題無法被刪除", + "ORG_ZSTACK_TEST_10003": "我不应該出现在錯誤誤列表 %d 中", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10019": "未知加密類型[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10014": "無法找到密钥資源池 [%s] 的模型", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10015": "當前状态[%s]不允許手動修改状态", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10016": "當加密功能啟用时,無法禁用所有安全虚拟機", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10017": "检查是否为身份驗證設置了資源池 UUID", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10010": "加密功能已啟用但數据保护所需的資源池[%s]未設置。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10013": "检查模型[%s]類型[%s]客戶端及所有服務器可用性异常", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10003": "ssh 失敗", + "ORG_ZSTACK_AI_VM_10006": "無法找到模型服務实例组[uuid: %s],保儲模型服務实例失敗", + "ORG_ZSTACK_AI_VM_10007": "虚拟機实例、配置YAML或服務YAML为空,模型服務部署上下文:%s", + "ORG_ZSTACK_AI_VM_10008": "部署上下文或虚拟機实例 %s 为空", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_LOKI_10000": "無法复制 %s 到 %s,原因: %s", + "ORG_ZSTACK_AI_VM_10009": "取消任務失敗,%s", + "ORG_ZSTACK_SNS_SYSTEM_10000": "系統統告警主題無法被刪除", + "ORG_ZSTACK_AI_VM_10002": "無法在默認L3网络[uuid: %s]中找到vm网卡的IP地址,而該地址对於分布式模型服務是必需的", + "ORG_ZSTACK_SNS_SYSTEM_10001": "只有 HTTP 終端點可以订阅 API 主題,該終端點[類型:%s]不是 HTTP 終端點", + "ORG_ZSTACK_AI_VM_10003": "模型服務会话不能为null", + "ORG_ZSTACK_AI_VM_10004": "無法从模型服務解析 YAML,服務 YAML: %s", + "ORG_ZSTACK_AI_VM_10000": "無法找到圖像 [uuid: %s]", + "ORG_ZSTACK_AI_VM_10001": "無法从yaml獲取imageUuid: %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10015": "The network[%s] has been added into the haGroup[%s]", + "ORG_ZSTACK_ROUTEPROTOCOL_10014": "The network[%s] has been added into the virtual router area[%s]", + "ORG_ZSTACK_ROUTEPROTOCOL_10017": "路由器ID[%s]在該系統統中不是唯一的", + "ORG_ZSTACK_ROUTEPROTOCOL_10016": "路由器ID[%s]未格式化为IPv4地址", + "ORG_ZSTACK_AI_VM_10011": "無法从带有空URL的实例獲取状态,報告失敗", + "ORG_ZSTACK_HYBRID_BACKUP_10000": "%s 只能由管理員帳號調用", + "ORG_ZSTACK_EXTERNALSERVICE_CRONJOB_10001": "crond 没有運行", + "ORG_ZSTACK_ROUTEPROTOCOL_10003": "[%s] 不符合IPv4地址格式", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10030": "检查所有安全機器令牌同步失敗", + "ORG_ZSTACK_ROUTEPROTOCOL_10008": "區域ID[%s]已創建", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10031": "FlkSecClientFactory 测試連接失敗", + "ORG_ZSTACK_ROUTEPROTOCOL_10009": "KeyID 和密碼必須在認證類型为 %s 时不为 null", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10027": "生成安全機器 %s 的數据保护令牌因为 %s 失敗", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10029": "失敗獲取安全機器 %s 的加密結果因为 %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10011": "當認證類型是 %s 时,密碼長度最多为 8 字節", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FLKSEC_10028": "生成安全機器 %s 的 hmac token 失敗,因为 %s", + "ORG_ZSTACK_ROUTEPROTOCOL_10010": "密碼在身份驗證類型为 %s 时必須不为空", + "ORG_ZSTACK_ROUTEPROTOCOL_10013": "所有网络都应位於虚拟路由器[%s]中", + "ORG_ZSTACK_ROUTEPROTOCOL_10012": "區域ID[%s]的類型必須为%s", + "ORG_ZSTACK_ALIYUN_IDENTITYZONE_10000": "没有找到身份驗證信息", + "ORG_ZSTACK_STORAGE_CDP_10005": "备份儲儲[uuid: %s]已经刪除", + "ORG_ZSTACK_STORAGE_CDP_10001": "kvm代理無响应 %d 次", + "ORG_ZSTACK_STORAGE_CDP_10004": "在 CDP 任務[uuid: %s]中未找到任何 VM", + "ORG_ZSTACK_STORAGE_CDP_10000": "KVM代理重啟了", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10011": "硬件 VXLAN 网络只能在硬件 VXLAN 池中創建", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10010": "只有硬件 VXLAN 网络可以在硬件 VXLAN 池中創建", + "ORG_ZSTACK_STORAGE_CDP_10016": "主機[uuid: %s]上的libvirt不支持創建cdp任務,請检查libvirt的版本。", + "ORG_ZSTACK_HYBRID_DATACENTER_10003": "數据中心 [%s] 仍在同步過程中,請等待。", + "ORG_ZSTACK_STORAGE_CDP_10017": "主機[uuid: %s]上的qemu不支持創建cdp任務,請检查qemu的版本。", + "ORG_ZSTACK_HYBRID_DATACENTER_10002": "不在有效的阿里雲區域中,包含:%s", + "ORG_ZSTACK_STORAGE_CDP_10018": "運行在虚拟機[uuid:%s]上的 QEMU 版本不支持 mirrorBitmap。", + "ORG_ZSTACK_STORAGE_CDP_10012": "查询镜像:主機未找到,VM[uuid:%s]", + "ORG_ZSTACK_AI_EVALUATION_10000": "無法在數据库中找到对应的组[uuid: %s]", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10002": "失敗在KVM宿主機[uuid:%s]上为硬件Vxlan[%s, 類型:%s, VLAN:%s]創建桥接[%s],因为%s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10001": "在 SDN 控制器類型:%s 没有对应的 SDN 控制器工厂", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10000": "在 VXLAN 池 [uuid:%s] 中不儲在 SDN 控制器", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10006": "無法为目標主機[uuid:%s]上的VM[uuid:%s]配置硬件VXLAN网络", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10005": "無法找到 SDN 控制器 %s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10003": "失敗在KVM宿主機[uuid:%s]检查桥接[%s]是否儲在硬件Vxlan[uuid:%s,名称:%s],%s", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10009": "硬件 VXLAN 网络池必須配置物理接口", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10008": "硬件 VXLAN 网络池不支持創建 L3 网络", + "ORG_ZSTACK_HYBRID_DATACENTER_10001": "區域ID [%s] 已由AK [%s] 創建", + "ORG_ZSTACK_SDNCONTROLLER_HARDWAREVXLAN_10007": "未能检查物理接口对於KVM宿主機[uuid:%s, 名称:%s]上的HardwareVxlanPool[uuid:%s, 名称:%s],%s", + "ORG_ZSTACK_HYBRID_DATACENTER_10000": "dcType 不支持的類型 [%s]", + "ORG_ZSTACK_STORAGE_CDP_10027": "無效的时間字符串: %s,应为ISO时區格式,例如: %s", + "ORG_ZSTACK_STORAGE_CDP_10023": "無法挂载磁碟。VM 实例正在運行 CDP 任務。在挂载磁碟後,完整备份所需的容量将超過计划的 CDP 任務大小。請适當規划大小並重新嘗試。", + "ORG_ZSTACK_STORAGE_CDP_10024": "The VM[%s] for volume[%s] is running CDP, cannot resize now.", + "ORG_ZSTACK_STORAGE_CDP_10025": "CDP任務[uuid: %s]状态异常变更,旧状态: %s,新状态: %s。原因: %s。", + "ORG_ZSTACK_STORAGE_CDP_10026": "CDP 任務仍然啟用", + "ORG_ZSTACK_STORAGE_CDP_10022": "失敗於查找cdp任務[uuid:%s]", + "ORG_ZSTACK_AI_EVALUATION_10001": "没有匹配的後端组[uuid: %s, type:%s]儲在", + "ORG_ZSTACK_AI_EVALUATION_10002": "使用提供的 modelServiceGroupUuid 無法定位 ModelServiceInstanceGroupVO。这表明与運行评估任務的相關服務组無法被找到。因此,这些任務保持在中間状态而不是被標记为完成状态。請自動将这些任務更新为“失敗”並记录錯誤誤。", + "ORG_ZSTACK_LOGINCONTROL_10002": "無效的規则表達式,添加访问控制規则失敗因为:%s", + "ORG_ZSTACK_LOGINCONTROL_10005": "未識别的键: %s", + "ORG_ZSTACK_LOGINCONTROL_10006": "缺少键值对 %s", + "ORG_ZSTACK_PORTAL_APIMEDIATOR_10008": "資源Uuid[%s]不是一個有效的uuid。一個有效的uuid是去掉了'-'的UUID(v4推荐)。請參见http://en.wikipedia.org/wiki/Universally_unique_identifier了解UUID格式,用於驗證UUID的正则表達式为'[0-9a-f]{8}[0-9a-f]{4}[1-5][0-9a-f]{3}[89ab][0-9a-f]{3}[0-9a-f]{12}'", + "ORG_ZSTACK_LOGINCONTROL_10007": "密碼强度配置格式錯誤誤", + "ORG_ZSTACK_LOGINCONTROL_10008": "最小值不能大於最大值", + "ORG_ZSTACK_STORAGE_CDP_10039": "备份儲儲未找到[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10034": "意外的任務類型[uuid: %s, 類型: %s]", + "ORG_ZSTACK_STORAGE_CDP_10035": "最大容量未找到,cdp任務[uuid: %s],請更新它。", + "ORG_ZSTACK_STORAGE_CDP_10036": "最大延迟未找到对於cdp任務[uuid: %s],請更新它。", + "ORG_ZSTACK_STORAGE_CDP_10037": "VM[uuid: %s] 已刪除", + "ORG_ZSTACK_STORAGE_CDP_10031": "VM 没有停止,當前状态: %s", + "ORG_ZSTACK_STORAGE_CDP_10032": "共享卷[%s]来自VM[uuid]仍被其他虚拟機使用。", + "ORG_ZSTACK_STORAGE_CDP_10033": "任務未找到[uuid: %s]", + "ORG_ZSTACK_LOGINCONTROL_10012": "没有可用的用戶:%s, 類型: %s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10011": "API 消息的機箱類型是 IPMI,但並非是 APICreateBareMetal2ChassisHardwareInfoMsg 消息", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10012": "收到未知物理機2機箱的硬件信息[ipmi_addr:%s, ipmi_port:%d]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10010": "从文件加载裸金属2 ipmi機箱信息失敗,因为:%s", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10015": "失敗复位裸金属2IPMI機箱[UUID:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10016": "远程 ipxe 啟動機箱[uuid:%s]失敗", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10013": "失敗啟動裸金属2 ipmi機箱[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10014": "失敗關閉裸金属2IPMI機箱[UUID:%s]", + "ORG_ZSTACK_STORAGE_CDP_10049": "該虚拟機[uuid: %s]已经創建了CDP任務,無法同时創建备份作业。", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10008": "Windows本地磁碟裸金属不支持自動創建裸金属实例", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10009": "叢叢[uuid:%s]中無可使用的裸金属2网關", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10006": "叢叢[uuid:%s]不是一個BareMetal2叢叢。", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10007": "叢叢[uuid:%s]未啟用。", + "ORG_ZSTACK_STORAGE_CDP_10045": "必選參數缺失: %s", + "ORG_ZSTACK_STORAGE_CDP_10046": "參數 RetentionTimePerDay 和 DailyRpSinceDay 不能相等", + "ORG_ZSTACK_STORAGE_CDP_10047": "预期輸入一個VM UUID,但收到 %d 個", + "ORG_ZSTACK_STORAGE_CDP_10048": "資源 [uuid: %s] 不是虚機", + "ORG_ZSTACK_STORAGE_CDP_10041": "备份儲儲[uuid: %s]未連接", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10005": "叢叢[uuid:%s]不是一個裸金属叢叢。", + "ORG_ZSTACK_STORAGE_CDP_10042": "該虚拟機[uuid: %s]已創建备份任務,無法同时啟用CDP任務。", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10007": "IPMI地址和端口 %s:%d 已经儲在。", + "ORG_ZSTACK_STORAGE_CDP_10044": "'%s'(%d) 应大於 '%s'(%d)", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10001": "無法到達裸金属機箱,請確保:1. IPMI 連接是激活的;2. IPMI 地址、端口、用戶名和密碼正確;3. BIOS 中啟用了 IPMI Over LAN。", + "ORG_ZSTACK_STORAGE_CDP_10040": "备份儲儲[uuid: %s] 已禁用", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10009": "裸金属機箱[uuid:%s]应該使用 pxeserver[uuid:%s],但实际处理 DHCP 請求的是 pxeserver[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10008": "没有可用的裸金属PXE服務器連接到叢叢[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10000": "裸金属 IPMI 2 節點 %s:%d 已经儲在", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10001": "IPMI地址 %s 無效", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10004": "裸金属機箱的IPMI地址%s和IPMI端口%d已经創建。", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10005": "叢叢[uuid:%s]不儲在。", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10002": "無法連接到baremetal2機箱,請確保:1. IPMI連接是激活的;2. IPMI地址、端口、用戶名和密碼是正確的;3. BIOS中啟用了IPMI Over LAN。", + "ORG_ZSTACK_BAREMETAL2_CHASSIS_IPMI_10003": "裸金属2機箱的IPMI地址%s和IPMI端口%d已经創建。", + "ORG_ZSTACK_STORAGE_CDP_10056": "多個根磁碟找到: %s", + "ORG_ZSTACK_STORAGE_CDP_10058": "从 VM 备份未找到根磁碟", + "ORG_ZSTACK_STORAGE_CDP_10059": "卷 %s 包含在备份中但已从 VM[uuid: %s] 中分离:您需要将其重新挂载或刪除", + "ORG_ZSTACK_STORAGE_CDP_10053": "没有找到对应的CDP任務[uuid: %s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10015": "远程啟動裸金属機箱[uuid:%s]失敗", + "ORG_ZSTACK_STORAGE_CDP_10054": "CDP任務在BS[uuid: %s]上未找到[vm uuid: %s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10018": "远程pxe啟動機箱[uuid:%s]失敗", + "ORG_ZSTACK_STORAGE_CDP_10055": "recoverVm: 主機[uuid: %s] 未找到对应VM[uuid: %s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10017": "远程重置裸金属機箱[uuid:%s]失敗", + "ORG_ZSTACK_STORAGE_CDP_10050": "無法向主儲儲[uuid:%s]請求卷快照功能,請查看詳細信息[%s]", + "ORG_ZSTACK_BAREMETAL_CHASSIS_10014": "刪除裸金属機箱 %s 失敗", + "ORG_ZSTACK_STORAGE_CDP_10051": "recoverVm: 没有提供主機 UUID,也無法找到原始主機,VM[uuid: %s]", + "ORG_ZSTACK_SSHKEYPAIR_10009": "The sshKeyPair[uuid:%s] 没有綁定到 vm[uuid:%s] 上。", + "ORG_ZSTACK_SSHKEYPAIR_10008": "The sshKeyPair[uuid:%s] 已经綁定在 vm[uuid:] 上。", + "ORG_ZSTACK_SSHKEYPAIR_10007": "The sshKeyPair[uuid:%s] 正在被使用。", + "ORG_ZSTACK_STORAGE_CDP_10067": "無法从CDP备份找到根卷 %s:%d", + "ORG_ZSTACK_STORAGE_CDP_10068": "根磁碟未从CDP备份中找到 %s:%d", + "ORG_ZSTACK_SSHKEYPAIR_10011": "資源類型 %s 不支持綁定 sshKeyPair,允許的類型为 %s", + "ORG_ZSTACK_SSHKEYPAIR_10010": "The vmInstance[uuid:%s] 不在運行状态。", + "ORG_ZSTACK_STORAGE_CDP_10063": "VM CDP任務[uuid: %s]未找到", + "ORG_ZSTACK_STORAGE_CDP_10064": "VM未找到 for CDP任務[uuid: %s]", + "ORG_ZSTACK_STORAGE_CDP_10065": "从 VM 备份中未找到卷记录", + "ORG_ZSTACK_STORAGE_CDP_10066": "多個根磁碟从CDP备份%s:%d找到", + "ORG_ZSTACK_V2V_KVM_10003": "缺失 'srcVmUrl' 中的 VM uuid", + "ORG_ZSTACK_STORAGE_CDP_10060": "意外的卷[uuid: %s]大小: %d", + "ORG_ZSTACK_V2V_KVM_10004": "未找到 VM: %s 的根磁碟", + "ORG_ZSTACK_STORAGE_CDP_10061": "調整卷[uuid: %s]失敗:%s", + "ORG_ZSTACK_STORAGE_CDP_10062": "卷[uuid: %s]具有意外的路径: %s", + "ORG_ZSTACK_V2V_KVM_10007": "失敗清理 KVM V2V 转换宿主機[宿主機UUID:%s],因为%s", + "ORG_ZSTACK_STORAGE_CDP_10078": "無法找到虚機[uuid: %s]的cdp策略", + "ORG_ZSTACK_STORAGE_CDP_10075": "没有找到与 grpId %d 对应的恢复點", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10018": "無效变量: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10075": "NFS 主儲儲[uuid:%s, 名称:%s]無法在關聯的叢叢中找到主機以執行該操作", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10077": "在卷[uuid:%s]中未找到主機", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10020": "需要 List 对資源 [%s] 这里进行輸出,但得到的是 %s。", + "ORG_ZSTACK_ZBOX_10007": "zbox[name:%s] 的状态不是 Ready,當前状态是 %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10025": "某些操作無效", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10022": "資源 [%s] 必須設置後再使用!", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10006": "目標主機[uuid:%s]由於主要儲儲[uuid:%s]的閾值为%f,可用物理容量仅为%d,因此没有足够的物理容量", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10007": "該卷[uuid:%s]不在就绪状态,無法迁移它", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10008": "數据卷[uuid:%s, 名称: %s] 仍然附加在虚拟機[uuid:%s]上。請先detach再进行迁移。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10009": "該磁碟[uuid:%s]是虚拟機[uuid:%s]的根磁碟。當前虚拟機的状态为%s,請先停止它再进行迁移。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10002": "該卷[uuid:%s]已经在主機[uuid:%s]上儲在", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10003": "主要儲儲[uuid:%s]未找到", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10004": "主要儲儲[uuid:%s]已禁用或不允許冷迁移", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10005": "目標主機[UUID:%s]不属於包含卷[UUID:%s]的本地主儲儲[UUID:%s]所在的位置", + "ORG_ZSTACK_ZBOX_10001": "zbox[uuid:%s] 仍在使用中,無法将其弹出", + "ORG_ZSTACK_ZBOX_10002": "zbox[uuid:%s] 不处於就绪状态,無法同步容量。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10000": "無法提供所有虚拟機[uuid:%s]的卷所需的 %s 字節容量的主機", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10004": "阿里雲帳號[uuid:%s]不儲在", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10001": "該卷[uuid:%s]未挂载在任何本地主要儲儲上", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10005": "無效电话號碼[%s], 短消息服務號碼格式应为+86-18654321234", + "ORG_ZSTACK_ZBOX_10005": "zbox[uuid: %s] 好像被移除了", + "ORG_ZSTACK_ZBOX_10006": "USB設备[UUID:%s]已附加到VM[UUID:%s],無法添加到Zbox", + "ORG_ZSTACK_SNS_PLATFORM_ALIYUNSMS_10000": "阿里雲短信事件文本模板未找到。", + "ORG_ZSTACK_ZBOX_10003": "只有挂载路径为 [%s] 的文件可以从 zbox 刪除,但传递的是 [%s]", + "ORG_ZSTACK_ZBOX_10004": "zbox[name:%s]状态不是Ready,當前状态是%s", + "ORG_ZSTACK_SSHKEYPAIR_10006": "SSH密钥对已上传", + "ORG_ZSTACK_SSHKEYPAIR_10005": "操作錯誤誤,因为:%s", + "ORG_ZSTACK_SSHKEYPAIR_10003": "ssh 密钥对[uuid:%s]無法与虚拟機[uuid:%s]關聯,因为密钥未找到", + "ORG_ZSTACK_SSHKEYPAIR_10002": "加载公钥失敗:%s, err: %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10043": "信息安全客戶端工厂测試連接失敗", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10044": "當前不支持創建 %s 資源池", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10041": "从公钥中提取主題DN失敗:%s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10042": "检查所有安全機器令牌是否儲在失敗", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10040": "解析加密公钥失敗", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10058": "NFS 主儲儲[uuid:%s, 名称:%s]無法找到可用的主機来創建數据卷[uuid:%s, 名称:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10054": "vm[uuid:%s] 没有運行、暫停或停止,當前状态是 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10055": "主要儲儲[uuid:%s]未綁定到任何叢叢", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10050": "找不到可用的後端", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10051": "在連接状态下未找到挂载有NFSPrimary儲儲[uuid:%s, name:%s]的主機,無法将卷[uuid:%s]回滚至快照[uuid:%s, name:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10052": "在連接状态下未找到挂载有 NFS 主儲儲[uuid:%s, name:%s]的主機,無法将卷[uuid:%s]还原为镜像[uuid:%s]", + "ORG_ZSTACK_IAM2_10019": "無法解析cron表達式", + "ORG_ZSTACK_IAM2_10018": "該项目[uuid: %s, 名称:%s]处於不允許執行[%s]操作的状态:%s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10038": "生成數据保护令牌 %s 用於安全機器 %s 失敗,因为 %s", + "ORG_ZSTACK_IAM2_10015": "组织[uuid:%s]是组织[uuid:%s]的上級组织,無法将其設置为下級组织", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10039": "生成 HMAC 認證令牌 %s 为安全機器 %s 时因为 %s 失敗", + "ORG_ZSTACK_IAM2_10014": "無法執行操作,因为當前组织[uuid:%s]已失效,請啟用它", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10036": "生成-token失敗", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10037": "生成激活令牌 для 安全機器 %s 因为 %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10034": "导入密钥失敗", + "ORG_ZSTACK_IAM2_10011": "錯誤誤的虚拟ID[uuid:%s], 不儲在或錯誤誤的密碼", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10005": "無效的類型格式 [%s]", + "ORG_ZSTACK_IAM2_10010": "在项目[uuid:%s, name:%s]中未找到帳戶", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10035": "在生成测試密钥的過程中,与安全機器 %s 連接失敗因为 %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10006": "仅支持雲資源,但獲取了 [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10032": "导出密钥失敗", + "ORG_ZSTACK_IAM2_10013": "虚拟ID[name:%s]不属於該项目[name:%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10003": "無法支持此類操作類型: %s", + "ORG_ZSTACK_IAM2_10012": "虚拟ID[name:%s] 已禁用", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10030": "加密主体DN不能为null", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10031": "解析 MS 包封失敗", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10002": "無法支持此類資源類型: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10068": "NFS 主儲儲[uuid:%s, 名称:%s]尚未挂载到任何叢叢,或在已挂载的叢叢中的主機未連接", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10009": "無效類型: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10007": "只支持 Resource 或 Action,但獲取到 [%s]", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10008": "默認值必須是由 [%s] 描述的 Json 格式,但發现的是 [%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10029": "密文不能为 null", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10027": "未能找到密钥", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10028": "解析密钥失敗,錯誤誤:%s", + "ORG_ZSTACK_IAM2_10022": "無法进行操作,因为當前虚拟ID[uuid:%s]已失效,請啟用它", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10016": "無效的動态变量,必須包含 ${: %s}", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10024": "大文件hmac加密失敗,代碼:%s,詳情:%s", + "ORG_ZSTACK_IAM2_10021": "用戶[%s]不是平台用戶", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10017": "動词必須包含 '::'!", + "ORG_ZSTACK_IAM2_10024": "旧密碼与原始密碼不匹配,無法更新虚拟ID[uuid:%s]的密碼", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10014": "錯誤誤的 JSON 格式,原因: %s", + "ORG_ZSTACK_IAM2_10023": "只有管理員和虚拟ID本身可以进行更新", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10015": "無法找到設置之前的属性資源!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10012": "無效解碼器: %s!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10013": "在 CloudFormation 模板中未找到根元素,請检查您的模板!", + "ORG_ZSTACK_IAM2_10020": "帳號[uuid:%s]的配額[name:%s]不能为%d,否则将超出组织[uuid:%s]的配額", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_10011": "類型是: %s, 但獲取值: %s", + "ORG_ZSTACK_PCIDEVICE_10058": "主機 [%s] 进入维护模式失敗,由於包含 PCI 設备,虚拟機 [%s] 無法自動迁移", + "ORG_ZSTACK_PCIDEVICE_10056": "失敗啟動虚拟機[uuid:%s]因为並非所有PCI規范[uuids:%s]都儲在", + "ORG_ZSTACK_PCIDEVICE_10059": "PCI設备[uuid:%s]無法Attach到VM[uuid:%s],因为状态錯誤誤", + "ORG_ZSTACK_PCIDEVICE_10050": "請卸载所有 VM[%s] 的 GPU 設备後重新嘗試", + "ORG_ZSTACK_PCIDEVICE_10053": "指定的PCI設备不在同一主機上:PCI設备[UUID:%s]位於主機[UUID:%s],而PCI設备[UUID:%s]位於主機[UUID:%s]", + "ORG_ZSTACK_PCIDEVICE_10052": "請卸载其他VM[%s]的PCI設备並重新嘗試", + "ORG_ZSTACK_PCIDEVICE_10051": "請卸载所有 vm[%s] 的 vGPU 設备後重新嘗試", + "ORG_ZSTACK_PCIDEVICE_10068": "無法迁移根卷[uuid:%s],因为儲在已連接的PCI設备", + "ORG_ZSTACK_PCIDEVICE_10066": "無法迁移 VM[uuid:%s],因为已挂载了 PCI 設备", + "ORG_ZSTACK_PCIDEVICE_10061": "在目標主機[uuid:%s]中为虚拟機[uuid:%s]找不到足够匹配的PCI設备[uuid:%s]", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10003": "没有为身份:%s 注册备份儲儲插件", + "ORG_ZSTACK_PCIDEVICE_10065": "vm[%s] 不儲在,無法綁定到 pci[%s]", + "ORG_ZSTACK_PCIDEVICE_10064": "無法将此PCI設备[uuid:%s]綁定到虚拟機[uuid:%s],原因是在主機上的分配失敗", + "ORG_ZSTACK_PCIDEVICE_10063": "PCI設备 [%s] 並非全部可用", + "ORG_ZSTACK_PCIDEVICE_10062": "iommu组中的pci設备[%s]儲在问題", + "ORG_ZSTACK_IAM2_10008": "虚拟ID[uuid:%s] 不在项目[uuid:%s] 中", + "ORG_ZSTACK_IAM2_10009": "项目[%s]不儲在", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10000": "从驱動程序返回的 null 安装路径: %s", + "ORG_ZSTACK_IAM2_10004": "从文件加载虚拟ID信息失敗。因为\\n%s", + "ORG_ZSTACK_IAM2_10003": "該文件儲在 %d 问題。", + "ORG_ZSTACK_IAM2_10006": "从文件中构建VirtualID信息失敗。", + "ORG_ZSTACK_STORAGE_ADDON_BACKUP_10001": "%s: 健康状态: %s", + "ORG_ZSTACK_IAM2_10005": "UUID [%s] 已儲在。請嘗試一個不同的。", + "ORG_ZSTACK_MEMORY_10000": "在主機[%s]上未找到%s的數据", + "ORG_ZSTACK_PCIDEVICE_10036": "無法在主機[uuid:%s]中为附加到VM的PCI設备进行SR-IOV虚拟化", + "ORG_ZSTACK_PCIDEVICE_10035": "主機[uuid:%s]中的PCI設备已SRIOV虚拟化", + "ORG_ZSTACK_PCIDEVICE_10034": "由於主機[uuid:%s]禁用了IOMMU,因此無法为設备啟用SRIOV", + "ORG_ZSTACK_PCIDEVICE_10033": "pci設备[uuid:%s]不儲在", + "ORG_ZSTACK_PCIDEVICE_10039": "pci 設备[uuid:%s] 不儲在或未进行 sriov 虚拟化", + "ORG_ZSTACK_PCIDEVICE_10037": "只有 %d 個虚拟 PCI 設备可以由 %ss 在宿主機[uuid:%s]中生成", + "ORG_ZSTACK_STORAGE_CDP_10109": "备份儲儲[uuid: %s] 已经升級", + "ORG_ZSTACK_STORAGE_CDP_10104": "任務[uuid:%s]已被刪除", + "ORG_ZSTACK_STORAGE_CDP_10105": "CDP任務正在合並數据,無法拾取。", + "ORG_ZSTACK_STORAGE_CDP_10106": "CDP任務[uuid:%s]超出儲儲使用量:最大值%d,已用%d。", + "ORG_ZSTACK_STORAGE_CDP_10107": "意外的虚拟機状态: %s", + "ORG_ZSTACK_STORAGE_CDP_10102": "CDP任務[uuid: %s]未綁定任何VM", + "ORG_ZSTACK_PCIDEVICE_10047": "PCI設备[UUID:%s]未被虚拟化为mdevs", + "ORG_ZSTACK_PCIDEVICE_10045": "PCI設备[UUID:%s]無法由mdev規范[UUID:%s]进行虚拟化", + "ORG_ZSTACK_PCIDEVICE_10044": "PCI設备[UUID:%s]無法虚拟化为mdevs,請確保該設备已啟用且未綁定。", + "ORG_ZSTACK_PCIDEVICE_10049": "主機[uuid:%s]中包含的PCI設备[uuid:%s]未連接", + "ORG_ZSTACK_PCIDEVICE_10048": "从PCI設备[uuid:%s]生成的mdev設备仍然附加在VM上", + "ORG_ZSTACK_STORAGE_CDP_10119": "意外的任務類型: %s", + "ORG_ZSTACK_PCIDEVICE_10043": "無法反生成 PCI 設备[%s],因为其 VFs 正在使用中。\\n詳情:\\n%s", + "ORG_ZSTACK_PCIDEVICE_10042": "無法反生成 PCI 設备[%s],因为它不是 GPU 或网络控制器。", + "ORG_ZSTACK_PCIDEVICE_10041": "無法在宿主機 [uuid:%s] 上反生成虚拟PCI設备,因为它们仍然附加到了VM上", + "ORG_ZSTACK_PCIDEVICE_10040": "無法反生成 PCI 設备 [uuid:%s],因为主機[uuid:%s]未連接", + "ORG_ZSTACK_STORAGE_CDP_10117": "CDP任務[uuid: %s]未找到", + "ORG_ZSTACK_STORAGE_CDP_10118": "CDP任務[uuid: %s]状态异常变更,旧状态: %s,新状态: %s。因为儲儲配額超出,當前: %d,配額: %d。", + "ORG_ZSTACK_STORAGE_CDP_10111": "备份儲儲[uuid: %s] 的 QEMU-img 版本需要升級", + "ORG_ZSTACK_STORAGE_CDP_10112": "未找到针对虚機: %s 的 CDP 任務", + "ORG_ZSTACK_STORAGE_CDP_10113": "未找到 VM: %s 的 CDP 备份儲儲", + "ORG_ZSTACK_STORAGE_CDP_10114": "没有找到類型为[%s]的CdpBackupFactory", + "ORG_ZSTACK_STORAGE_CDP_10110": "备份儲儲[uuid: %s]的架构不支持升級CDP任務", + "ORG_ZSTACK_IDENTITY_10072": "無法更新配額[name: %s]对於帳戶[uuid: %s]", + "ORG_ZSTACK_IDENTITY_10071": "無法找到配額[uuid:%s, 類型:%s]的更新检查器", + "ORG_ZSTACK_AI_CONTAINER_10001": "模型中心中 uuid 为 %s 的模型未找到", + "ORG_ZSTACK_AI_CONTAINER_10005": "獲取服務URL失敗,可能是服務IP为空,請检查Kubernetes网络", + "ORG_ZSTACK_AI_CONTAINER_10004": "創建 Kubernetes 服務失敗", + "ORG_ZSTACK_AI_CONTAINER_10003": "創建 Kubernetes 部署失敗", + "ORG_ZSTACK_AI_CONTAINER_10009": "具有 UUID %s 的 endpoint 未找到,無法同步數据库中的容器資源", + "ORG_ZSTACK_AI_CONTAINER_10007": "在 Kubernetes 中創建儲儲服務失敗", + "ORG_ZSTACK_AI_CONTAINER_10006": "創建网络策略以分發模型服務失敗", + "ORG_ZSTACK_TAG2_10011": "資源[uuid:%s]已綁定%d個標签,不能再綁定更多", + "ORG_ZSTACK_IDENTITY_10063": "一条语句必須具有非空的操作字段。無效的语句[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10006": "在區域[uuid:%s]中儲在一個NFS主儲儲,其URL为%s", + "ORG_ZSTACK_IDENTITY_10062": "一条语句必須包含操作字段。無效的语句[%s]", + "ORG_ZSTACK_IDENTITY_10061": "一条语句必須具有效果字段。無效的语句[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10008": "發现多個CIDR范围", + "ORG_ZSTACK_IDENTITY_10060": "[group[name: %s, uuid: %s] 不属於帳戶[uuid: %s]]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10009": "無效的CIDR:%s", + "ORG_ZSTACK_IDENTITY_10067": "管理員帳號的名称不能被更新", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10002": "無法在叢叢中找到連接的主機,其中ps [uuid: %s] 已附加", + "ORG_ZSTACK_IDENTITY_10066": "旧密碼与原始密碼不匹配,無法更新帳戶[uuid: %s]的密碼", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10003": "無法找到連接的主機来執行命令以執行 NFS 主機儲儲[uuid:%s]的操作", + "ORG_ZSTACK_IDENTITY_10065": "無法更新名称。一個帳戶已经叫做 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10004": "無法找到具有連接主機-NFS連接的宿主機以執行针对NFS主儲儲[uuid:%s]的命令", + "ORG_ZSTACK_IDENTITY_10069": "帳號[uuid: %s, name: %s]是一個普通帳號,它不能重置另一個帳號[uuid: %s]的密碼", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10000": "NFS 主儲儲[uuid:%s]未連接到任何计算節點,無法清除虚拟機[uuid:%s]的根卷[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10004": "仅支持以 %s 方式啟動的 baremetal2 镜像", + "ORG_ZSTACK_IDENTITY_10068": "只有管理員帳號可以更新其密碼", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10003": "baremetal2 圖像必須包含 bootMode 標签", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10002": "只有格式为raw/qcow2 的根磁碟模板可以与baremetal2綁定標签", + "ORG_ZSTACK_BAREMETAL2_IMAGE_10001": "只允許有一個裸金属2系統統標签,但獲取到了 %d 個", + "ORG_ZSTACK_AI_CONTAINER_10012": "未能根据 IP 地址 %s 查找 pod 名称", + "ORG_ZSTACK_AI_CONTAINER_10011": "獲取podIP地址失敗,無法添加到容器端點", + "ORG_ZSTACK_AI_CONTAINER_10010": "uuid为%s的叢叢未找到", + "ORG_ZSTACK_COMPUTE_VM_NUMA_10003": "無效的 CPU 叢 [%s]", + "ORG_ZSTACK_AI_CONTAINER_10016": "獲取 k8s 部署 %s 失敗", + "ORG_ZSTACK_AI_CONTAINER_10015": "失敗刪除 Kubernetes 服務,因为 %s", + "ORG_ZSTACK_TAG2_10008": "所有標记 %s 必須指定", + "ORG_ZSTACK_AI_CONTAINER_10014": "失敗刪除 Kubernetes 部署,因为 %s", + "ORG_ZSTACK_AI_CONTAINER_10013": "失敗将標签 %s 添加到 Pod %s", + "ORG_ZSTACK_TAG2_10006": "無效的颜色指定[%s], 必須類似於#FF00FF", + "ORG_ZSTACK_TAG2_10007": "獲取格式[%s],格式必須類似於 name::{tokenName1}::{tokenName2} ... ::{tokenNameN} 或 {tokenName1}::{tokenName2} ... ::{tokenNameN} 名称中不能包含 '{}'", + "ORG_ZSTACK_AI_CONTAINER_10019": "無效的 YAML 格式: %s", + "ORG_ZSTACK_TAG2_10004": "简单標签模式中没有令牌", + "ORG_ZSTACK_AI_CONTAINER_10018": "部署 %s 没有副本信息", + "ORG_ZSTACK_TAG2_10005": "非法標签UUIDs %s,標签類型必須是简单型,)", + "ORG_ZSTACK_AI_CONTAINER_10017": "部署 %s 未找到", + "ORG_ZSTACK_IDENTITY_10070": "無法找到帳號[uuid: %s]的配額[name: %s]", + "ORG_ZSTACK_TAG2_10002": "無法更新简单標签模式格式", + "ORG_ZSTACK_TAG2_10003": "重复名称", + "ORG_ZSTACK_SNS_PLATFORM_WECOM_10000": "失敗向企业微信發送消息。状态:%s,正文:%s", + "ORG_ZSTACK_TAG2_10000": "標签唯一性违反:A [type:%s] 類型標签名为 [name:%s] 已在帳戶 [accountUuid%s] 下儲在", + "ORG_ZSTACK_TAG2_10001": "您只能更新令牌名称", + "ORG_ZSTACK_PCIDEVICE_10072": "pci 設备規格[uuid:%s]不儲在", + "ORG_ZSTACK_PCIDEVICE_10071": "非法類型[%s]的PCI設备,只能是%s合法", + "ORG_ZSTACK_PCIDEVICE_10070": "pci 設备[uuid:%s] 不儲在", + "ORG_ZSTACK_PCIDEVICE_10075": "PCI設备[uuid:%s]不儲在或已禁用,虚拟機[uuid:%s]無法使用", + "ORG_ZSTACK_PCIDEVICE_10073": "非法類型[%s]用於pci設备規范,仅限%s合法", + "ORG_ZSTACK_AI_CONTAINER_10023": "無效的K8s部署YAML: %s", + "ORG_ZSTACK_AI_CONTAINER_10020": "失敗将 Kubernetes 部署 %s 中的所有 Pod 刪除", + "ORG_ZSTACK_AI_CONTAINER_10025": "模型服務实例组 %s 在數据库中未找到", + "ORG_ZSTACK_AI_CONTAINER_10024": "失敗修补 Kubernetes 部署 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10039": "失敗从缓儲镜像[path:%s]創建根卷[uuid:%s]的原因是%s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10040": "originText 或 certificateText 不能为 null", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10036": "在 NFS 主儲儲[uuid:%s]上刪除 bits[%s]失敗,%s,将会清理 installPath, pinv.getUuid(), rsp.getError()", + "ORG_ZSTACK_NETWORK_L3_10067": "在 L3 网络[uuid:%s]上發生了 DNS[%s]錯誤誤", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10037": "失敗在 KVM 主機[uuid:%s, ip:%s]还原卷[uuid:%s]至快照[uuid:%s]时,%s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10038": "失敗在 KVM 主機[uuid:%s, ip:%s]还原卷[uuid:%s]至镜像[uuid:%s]时,%s", + "ORG_ZSTACK_CRYPTO_AUTH_10020": "無法生成 %s 類别", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10032": "失敗在 NFS 主儲儲[uuid:%s]检查 %s 的儲在性,%s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10034": "無法在 KVM 主機[uuid:%s, IP:%s]上創建空的卷[uuid:%s, 名称:%s],因为 %s", + "ORG_ZSTACK_CRYPTO_AUTH_10029": "失敗找到證书信息", + "ORG_ZSTACK_CRYPTO_AUTH_10028": "解析加密參數中的纯文本到json对象失敗:%s, %s", + "ORG_ZSTACK_HYGON_10006": "VM[uuid:%s] 不儲在", + "ORG_ZSTACK_HYGON_10005": "主機[uuid:%s]上有%d個啟用了海光安全元素的運行中虚拟機,請先停止它们", + "ORG_ZSTACK_HYGON_10004": "主機[uuid:%s]未連接", + "ORG_ZSTACK_HYGON_10003": "主機[uuid:%s]需要将'enableCgroupDeviceAcl'設置为大於0才能支持Hygon mdev設备。請在生成mdev設备之前設置此配置。", + "ORG_ZSTACK_HYGON_10002": "主機[uuid:%s]需要将“reconnect.host.restart.libvirtd.service”配置为“true”,才能支持Hygon mdev設备。請在生成mdev設备之前設置此配置。", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10017": "生成證书失敗", + "ORG_ZSTACK_HYGON_10000": "無法反生成 mdev 設备,主機 [uuid: %s] 上仍有 %d 個 mdev 設备連接到 VM。請先停止使用这些設备的所有 VM。", + "ORG_ZSTACK_NETWORK_L3_10073": "在第3层网络[uuid:%s]上不儲在目的路由前缀[%s]", + "ORG_ZSTACK_NETWORK_L3_10072": "前缀 [%s] 不是 IPv4 网络 CIDR", + "ORG_ZSTACK_NETWORK_L3_10071": "在三层网络[uuid:%s]上儲在前缀[%s]的主機路由", + "ORG_ZSTACK_HYGON_10009": "由於並發分配导致無法分配海光mdev設备,請重試。", + "ORG_ZSTACK_NETWORK_L3_10070": "下一跳[%s]不是一個IPv4地址", + "ORG_ZSTACK_HYGON_10008": "主機[uuid:%s]上的 Hygon mdev 設备不足。需要:%d", + "ORG_ZSTACK_HYGON_10007": "無法在虚拟機[uuid:%s]处於状态[%s]时更改Hygon安全元素設置,請先停止虚拟機", + "ORG_ZSTACK_TICKET_ENTITY_10001": "操作被拒绝。票据处於%s状态,無法執行操作[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10031": "安全機器 [%s] 不儲在", + "ORG_ZSTACK_IDENTITY_10022": "無法找到資源[uuid:%s];錯誤誤的資源Uuid或該資源为管理員資源", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10049": "無法找到可用的後端", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10042": "叢叢[uuid:%s]中没有主機連接", + "ORG_ZSTACK_IDENTITY_10026": "%s 不是API", + "ORG_ZSTACK_IDENTITY_10025": "用戶由 userUuid[%s] 指定的用戶不属於當前帳戶,且當前帳戶不是管理員帳戶,因此没有權限检查該用戶的權限", + "ORG_ZSTACK_IDENTITY_10029": "無法找到帳戶[uuid:%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10001": "安全機器[uuid:%s]模型不是%s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10037": "無效的 algType %s, 支持的類型: %s.", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10002": "安全機器 [%s] 手動检测同步失敗,請確認安全機器是否已同步密钥!", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10038": "指定的數据保护資源池[%s]不儲在", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_INFOSEC_10000": "secretResourcePool[uuid:%s] 的模型不是 %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10032": "儲在一個安全設备,其管理IP为[%s]", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10033": "管理IP[%s] 不符合IPV4格式", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10034": "失敗連接到安全機器 %s[%s],因为 %s", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10035": "在啟用加密功能後,相应的資源池中至少应保留一台安全主機", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10017": "無法在 KVM 主機[uuid:%s, ip:%s]上創建文件夹[installUrl:%s],因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10018": "没有連接或主要儲儲[uuid:%s]主機信息挂载無叢叢", + "ORG_ZSTACK_IDENTITY_10050": "toPublic 設置为 false,accountUuids 不能为 null 或空", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10019": "無法从主機[uuid:%s]ping nfs主儲儲[uuid:%s],原因:%s。斷開此host-ps連接", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10013": "失敗从SftpBackupStorage[hostname:%s]下载[%s]至nfs主儲儲[uuid:%s, path:%s], %s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10014": "从 NFS 主儲儲 [uuid:%s, 路径:%s] 上传數据块到 SFTP 备份儲儲 [主機名:%s, 路径:%s] 失敗,%s", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10016": "無法将主儲儲[uuid:%s, 名称:%s]附加到叢叢[uuid:%s]。叢叢中的KVM主機使用的是qemu-img版本[%s];但主儲儲已附加到另一個具有KVM主機且該主機的qemu-img版本为[%s]的不同叢叢中。qemu-img版本大於%s的与版本小於%s的不兼容,这将导致卷快照操作失敗。請避免将主儲儲附加到使用不同Linux發行版的叢叢中,以防止qemu-img版本不匹配。", + "ORG_ZSTACK_IDENTITY_10059": "[user[name: %s, uuid: %s]不属於帳號[uuid: %s]]", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10010": "IP地址[%s]不在CIDR[%s]范围内", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10011": "在 NFS 主儲儲上有 %s 個運行中的虚拟機,請停止它们後再試:\n%s", + "ORG_ZSTACK_IDENTITY_10057": "策略[name: %s, uuid: %s]不属於帳戶[uuid: %s]", + "ORG_ZSTACK_CRYPTO_AUTH_10009": "錯誤誤的密钥資源池模型,期望 %s,实际 %s", + "ORG_ZSTACK_CRYPTO_AUTH_10008": "未能找到模型以供秘密資源池 [%s] 使用", + "ORG_ZSTACK_CRYPTO_AUTH_10006": "操作不支持", + "ORG_ZSTACK_IDENTITY_10041": "無法創建一個组。名为 %s 的组已经在帳號[uuid:%s]下儲在", + "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10028": "選擇執行儲儲迁移的操作主機[uuid:%s]已丢失", + "ORG_ZSTACK_CRYPTO_AUTH_10016": "連接远程加密服務器失敗", + "ORG_ZSTACK_IDENTITY_10040": "accountName 和 accountUuid 不能同时为 null,您必須指定至少一個", + "ORG_ZSTACK_CRYPTO_AUTH_10015": "身份認證未指定提供服務的資源池", + "ORG_ZSTACK_IDENTITY_10045": "無法刪除内置管理員帳戶。", + "ORG_ZSTACK_IDENTITY_10044": "帳戶不能刪除自己", + "ORG_ZSTACK_IDENTITY_10043": "無法創建帳戶。一個同名的帳戶已儲在。", + "ORG_ZSTACK_IDENTITY_10042": "無法創建用戶。用戶名为%s的用戶已儲在於帳戶[uuid:%s]中", + "ORG_ZSTACK_IDENTITY_10049": "所有設置为false,accountUuids不能为null或空", + "ORG_ZSTACK_IDENTITY_10048": "您以用戶身份登录,無法切换至另一個用戶[uuid:%s]", + "ORG_ZSTACK_IDENTITY_10047": "當前会话是一個帳戶会话。您需要指定要更新的用戶字段 'uuid'", + "ORG_ZSTACK_IDENTITY_10046": "只有管理員可以刪除帳戶。", + "ORG_ZSTACK_CRYPTO_AUTH_10019": "从數据库獲取完整性密碼失敗,因为 [%s] 未生成完整性密碼", + "ORG_ZSTACK_VHOST_KVM_10000": "vhostuser磁碟仅支持virtio模式,請检查镜像平台是否包含virtio驱動程序", + "ORG_ZSTACK_VHOST_KVM_10001": "vhost-user磁碟不支持virtio-scsi模式,請關閉virtio-scsi模式", + "ORG_ZSTACK_NETWORK_L3_10029": "%s 不是一個有效的IPv6地址", + "ORG_ZSTACK_USBDEVICE_10005": "PassThrough 只支持在運行中的主機 VM 上使用", + "ORG_ZSTACK_ALIYUN_ECS_10019": "只有管理員可以将參數 [onlyZstack] 設置为 false", + "ORG_ZSTACK_STORAGE_BACKUP_10018": "失敗从备份 %s 創建镜像", + "ORG_ZSTACK_ALIYUN_ECS_10018": "只有按需计費的 ECS 支持刪除远程,當前的 ECS 计費類型是: %s", + "ORG_ZSTACK_USBDEVICE_10002": "已連接到VM的USB設备數量已達上限。當前使用情况:\n\\n %s", + "ORG_ZSTACK_ALIYUN_ECS_10017": "仅刪除状态为運行中或已停止的 ECS,當前是 %s", + "ORG_ZSTACK_NETWORK_L3_10025": "無法獲取可用IP,因为[start[ip:%s]]不是一個正確的IPv6地址", + "ORG_ZSTACK_USBDEVICE_10009": "無法迁移_vm[uuid:%s]_因为儲在通過直通連接的USB設备", + "ORG_ZSTACK_STORAGE_BACKUP_10015": "無法保留 %s 在备份儲儲[uuid:%s]上,它仅剩 %s 可用", + "ORG_ZSTACK_NETWORK_L3_10024": "無法獲取可用IP,因为[start[ip:%s]]不是一個正確的IPv4地址", + "ORG_ZSTACK_USBDEVICE_10008": "vm[%s] 無法啟動,因为 USB 重定向主機未連接", + "ORG_ZSTACK_NETWORK_L3_10023": "無法獲取可用IP,因为带有UUID为%s的l3Network[%s]是双栈類型", + "ORG_ZSTACK_USBDEVICE_10007": "USB 已经綁定到其他虚拟機[UUID:%s],無法再次綁定到其他虚拟機", + "ORG_ZSTACK_STORAGE_BACKUP_10013": "必需的主要儲儲[uuid:%s, 類型:%s] 不支持任何备份儲儲。", + "ORG_ZSTACK_NETWORK_L3_10022": "ipRangeUuid 和 l3NetworkUuid 不能同时为 null;您必須設置其中一個。", + "ORG_ZSTACK_USBDEVICE_10006": "無法将 USB 設备[uuid:%s]挂载到虚拟機[uuid:%s],可能的原因包括:該設备未啟用或已被挂载至其他虚拟機,或者該設备和虚拟機不在同一主機上。", + "ORG_ZSTACK_ALIYUN_ECS_10015": "圖像已被刪除!", + "ORG_ZSTACK_ALIYUN_ECS_10014": "ecs镜像在远程已儲在,名称: %s,創建时間: %s", + "ORG_ZSTACK_ALIYUN_ECS_10013": "ecs镜像在远程和本地都儲在,ecs镜像uuid: %s, 名称: %s, 創建时間: %s", + "ORG_ZSTACK_NETWORK_L3_10032": "不能添加IP范围,因为不支持IPv6地址池", + "ORG_ZSTACK_STORAGE_BACKUP_10011": "只允許一個备份儲儲數据网络系統統標签,但獲得了 %s 個", + "ORG_ZSTACK_NETWORK_L3_10030": "[startIp %s, endIp %s, prefixLen %d, gateway %s] 不是一個有效的ipv6范围", + "ORG_ZSTACK_STORAGE_BACKUP_10010": "所有备份儲儲的容量预留失敗", + "ORG_ZSTACK_USBDEVICE_10016": "您可以将一個 VM 实例連接到最多 %s 個 USB 3.0 設备。", + "ORG_ZSTACK_USBDEVICE_10015": "您可以将一個 VM 实例連接到最多 %s 個 USB 2.0 設备。", + "ORG_ZSTACK_NETWORK_L3_10038": "新的网络CIDR [%s] 与旧的网络CIDR [%s] 不同", + "ORG_ZSTACK_USBDEVICE_10014": "您可以将最多 %s 個 USB 1.0 設备附加到一個 VM 实例上。", + "ORG_ZSTACK_NETWORK_L3_10037": "新的IP范围[startip :%s, endip :%s]与旧的IP范围[startip :%s, endip :%s]重叠", + "ORG_ZSTACK_STORAGE_BACKUP_10028": "卷备份[uuid:%s]在备份儲儲[uuid:%s]中未找到", + "ORG_ZSTACK_NETWORK_L3_10036": "IPv6 前缀長度必須为 %d 对於 Stateless-DHCP 或 SLAAC", + "ORG_ZSTACK_NETWORK_L3_10035": "地址模式[%s]与L3网络地址模式[%s]不同", + "ORG_ZSTACK_USBDEVICE_10019": "USB設备[UUID:%s]不在可連接状态%s", + "ORG_ZSTACK_NETWORK_L3_10034": "不能添加 IP 范围,因为系統統网络尚不支持 IPv6", + "ORG_ZSTACK_USBDEVICE_10018": "USB設备[UUID:%s]已Attach至另一個VM[UUID:%s]", + "ORG_ZSTACK_NETWORK_L3_10033": "IP地址范围前缀長度超出范围[%d - %d]", + "ORG_ZSTACK_USBDEVICE_10017": "USB設备[UUID:%s]已綁定至同一VM[UUID:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10024": "卷备份[uuid:%s]在备份儲儲[uuid:%s]中未找到", + "ORG_ZSTACK_ALIYUN_ECS_10022": "私有IP在VPC中已儲在:%s,分配给ECS:%s", + "ORG_ZSTACK_ALIYUN_ECS_10021": "%s 不在 cidr 范围内: %s", + "ORG_ZSTACK_ALIYUN_ECS_10020": "弹性网卡可用IP地址不足,當前是(%d)", + "ORG_ZSTACK_USBDEVICE_10012": "無法迁移 VM[uuid:%s],因为儲在已連接的 PCI 設备", + "ORG_ZSTACK_ALIYUN_ECS_10027": "实例配置或实例類型必須設置!", + "ORG_ZSTACK_USBDEVICE_10011": "無法迁移根卷[uuid:%s],因为連接了USB設备", + "ORG_ZSTACK_ALIYUN_ECS_10026": "%s 不是有效的卷類型,有效類型为 [%s]", + "ORG_ZSTACK_ALIYUN_ECS_10025": "%s 不是 IPv4 地址", + "ORG_ZSTACK_ALIYUN_ECS_10024": "带宽必須設置後再分配公网IP", + "ORG_ZSTACK_NETWORK_L3_10043": "%s 不是一個有效的网络CIDR", + "ORG_ZSTACK_STORAGE_BACKUP_10023": "其中一個备份儲儲[uuid: %s]处於%s状态,無法執行同步操作", + "ORG_ZSTACK_NETWORK_L3_10042": "网關[%s]不在子网%s中", + "ORG_ZSTACK_STORAGE_BACKUP_10022": "没有找到類型为[%s]的VolumeBackupFactory", + "ORG_ZSTACK_NETWORK_L3_10041": "%s 不是一個允許的网络CIDR,因为它没有可用的IP地址范围", + "ORG_ZSTACK_STORAGE_BACKUP_10021": "當前备份卷的虚機[uuid: %s]已不再是用於备份的虚機[uuid: %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10020": "同步卷备份元數据文件在镜像儲儲[uuid:%s]遇到I/O錯誤誤:%s", + "ORG_ZSTACK_NETWORK_L3_10049": "l3网络[uuid %s:名称 %s]不是一個公共网络,地址池范围無法添加", + "ORG_ZSTACK_NETWORK_L3_10047": "無效的系統統和類别组合,仅 %s 是有效的", + "ORG_ZSTACK_NETWORK_L3_10046": "%s 不是一個有效的域名", + "ORG_ZSTACK_NETWORK_L3_10045": "不支持的三层网络類型[%s]", + "ORG_ZSTACK_NETWORK_L3_10044": "ipRangeUuids, L3NetworkUuids, zoneUuids 至少必須有一個非空列表,或者全部設置为 true", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10023": "無法将端口转發規则与允許的CIDR綁定,因为vmNic[uuid:%s]已经儲在与目標私有端口范围[%s, %s]重叠且具有相同协议類型[%s]的規则", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10024": "無法附加端口转發規则,因为 vmNic[uuid:%s] 已经有一個与目標私有端口范围[%s, %s]重叠、具有相同协议類型[%s]且具有相同允許IP范围的規则。", + "ORG_ZSTACK_SNMP_10010": "失敗 to %s SNMP 代理,因为隐私密碼不能为空。", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10021": "虚拟機网络接口[UUID:%s]已经儲在端口转發規则,其VIP与[UUID:%s]的不同", + "ORG_ZSTACK_ALIYUN_NAS_CORE_10000": "主儲儲 [%s] 仍在運行,無法刪除访问组", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10022": "vmNic uuid[%s] 不允許添加端口转發規则,因为 vmNic 已儲在弹性公网IP", + "ORG_ZSTACK_NETWORK_L3_10054": "IP分配不能包含网络地址或广播地址", + "ORG_ZSTACK_NETWORK_L3_10053": "网關[%s]不在子网%s/%s中", + "ORG_ZSTACK_NETWORK_L3_10052": "該 IP 范围[%s ~ %s]包含保留的鏈路本地地址", + "ORG_ZSTACK_NETWORK_L3_10051": "該 IP 范围[%s ~ %s]包含 E 類地址,这些地址是保留的", + "ORG_ZSTACK_NETWORK_L3_10050": "該 IP 地址范围[%s ~ %s]包含 D 類地址,这些地址用於多播", + "ORG_ZSTACK_STORAGE_BACKUP_10008": "在扣除预留容量後,没有可用的备份儲儲空間[%s字節]", + "ORG_ZSTACK_STORAGE_BACKUP_10006": "备份儲儲[uuid:%s]已綁定至區域[uuid:%s]", + "ORG_ZSTACK_NETWORK_L3_10059": "開始IP[%s]在結束IP[%s]之後", + "ORG_ZSTACK_ALIYUN_ECS_10006": "解碼URL失敗: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10005": "备份儲儲[uuid:%s]尚未綁定至區域[uuid:%s]", + "ORG_ZSTACK_NETWORK_L3_10058": "netmask[%s] 不是有效的网掩碼,且IP范围的网掩碼不能为0.0.0.0", + "ORG_ZSTACK_STORAGE_BACKUP_10004": "zoneUuids, backupStorageUuids 至少有一個不能为空列表,或者全部設为 true", + "ORG_ZSTACK_NETWORK_L3_10057": "网關[%s]不是IPv4地址", + "ORG_ZSTACK_STORAGE_BACKUP_10003": "%s 不得为空", + "ORG_ZSTACK_NETWORK_L3_10056": "結束IP[%s]不是一個IPv4地址", + "ORG_ZSTACK_NETWORK_L3_10055": "開始IP[%s]不是一個IPv4地址", + "ORG_ZSTACK_CORE_SALT_10000": "scp 在系統統[%s]中未被找到,無法設置 salt", + "ORG_ZSTACK_ALIYUN_ECS_10004": "無系統統磁碟找到,ecs: [%s], ecs实例ID为: [%s]", + "ORG_ZSTACK_CORE_SALT_10003": "在系統統[%s]上運行salt状态[%s]失敗,連續重試了%s次後仍未成功", + "ORG_ZSTACK_ALIYUN_ECS_10003": "該區域[%s]當前無法生成实例類型[%s],請選用另一种实例類型或另一個區域", + "ORG_ZSTACK_ALIYUN_ECS_10002": "當前没有可用的实例類型。", + "ORG_ZSTACK_SNMP_10000": "創建SNMP代理失敗,因为SNMP代理已经儲在。", + "ORG_ZSTACK_SNMP_10001": "失敗 to 停止 SNMP 代理,請先創建一個 SNMP 代理。", + "ORG_ZSTACK_NETWORK_L3_10065": "添加普通IP地址范围时必須指定网關IP地址", + "ORG_ZSTACK_SNMP_10002": "失敗更新SNMP代理,請先創建一個SNMP代理。", + "ORG_ZSTACK_NETWORK_L3_10064": "新建添加的IP地址范围网關 %s 与旧网關 %s 不同", + "ORG_ZSTACK_SNMP_10003": "Failed to start SNMP代理,請先創建一個SNMP代理。", + "ORG_ZSTACK_NETWORK_L3_10063": "网關[%s]不能属於范围[%s, %s]", + "ORG_ZSTACK_SNMP_10004": "失敗 to %s SNMP 代理,因为當版本为 v2c 时 readCommunity 不能为空", + "ORG_ZSTACK_NETWORK_L3_10062": "公网地址[%s]不在子网%s/%s中", + "ORG_ZSTACK_SNMP_10005": "失敗 to %s SNMP 代理,因为當版本为 v3 时 userName 不能为空", + "ORG_ZSTACK_NETWORK_L3_10061": "在同一三层网络上不允許儲在多個 CIDR。已儲在 IP 范围[uuid:%s, CIDR:%s],新的 IP 范围[CIDR:%s] 与现有 CIDR 不重叠", + "ORG_ZSTACK_SNMP_10006": "失敗 to %s SNMP 代理, 當密碼不为空时認證算法不能为空。", + "ORG_ZSTACK_NETWORK_L3_10060": "重叠与IP范围[uuid:%s, 起始IP:%s, 結束IP: %s]", + "ORG_ZSTACK_SNMP_10007": "失敗 to %s SNMP 代理, 因为認證密碼不能为空。", + "ORG_ZSTACK_SNMP_10008": "失敗 to %s SNMP代理,因为設置數据加密需要先設置用戶驗證。", + "ORG_ZSTACK_XINFINI_10019": "獲取節點 %s 詳情失敗,請检查 IP 地址和角色配置", + "ORG_ZSTACK_XINFINI_10018": "無節點找到", + "ORG_ZSTACK_XINFINI_10017": "未找到連接的節點", + "ORG_ZSTACK_XINFINI_10016": "不支持的协议[%s]用於激活", + "ORG_ZSTACK_XINFINI_10015": "不支持从 [%s] 獲取卷信息", + "ORG_ZSTACK_XINFINI_10014": "不支持的协议[%s]", + "ORG_ZSTACK_XINFINI_10013": "不支持的协议[%s]禁用", + "ORG_ZSTACK_XINFINI_10012": "無法獲取卷[%s]的詳細信息,可能已被刪除", + "ORG_ZSTACK_XINFINI_10010": "空配置,無法發现xinfini", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10021": "required ip %s 已被其他实例占用", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10022": "requiredIp %s 超出 dhcp 范围 %s ~ %s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10020": "从裸金属2分配网络[uuid:%s]分配IP地址失敗", + "ORG_ZSTACK_XINFINI_10009": "刪除 iSCSI 客戶端失敗 %s", + "ORG_ZSTACK_XINFINI_10008": "刪除 volume-client-group-mapping 失敗 %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10002": "儲在使用来自l2[uuid:%s]分配的ip地址的bm实例", + "ORG_ZSTACK_XINFINI_10007": "刪除卷快照失敗 %s", + "ORG_ZSTACK_XINFINI_10006": "快照 [id:%s, name:%s] 具有 %d 個克隆的卷,卷名称: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10004": "儲在使用了从IP范围[uuid:%s]分配的IP地址的BM实例", + "ORG_ZSTACK_XINFINI_10005": "刪除磁碟失敗 %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10003": "儲在使用来自L3[uuid:%s]分配的IP地址的BM实例", + "ORG_ZSTACK_XINFINI_10004": "刪除块設备失敗 %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10006": "远程控制 %s 裸金属機箱[uuid:%s]失敗", + "ORG_ZSTACK_XINFINI_10003": "bdc与ip %s不儲在。", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10005": "分配裸金属 PXE 服務器失敗,請確保叢叢[uuid:%s]中已連接了具有足够可用容量的 PXE 服務器", + "ORG_ZSTACK_XINFINI_10002": "xinfini 請求失敗,信息: %s.", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10008": "裸金属機箱[uuid:%s]不儲在", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10009": "裸金属2 provisioning网络[uuid:%s]已連接至叢叢[uuid:%s]", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10007": "远程關閉裸金属機箱[uuid:%s]失敗", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10008": "热拔除運行中VM的mdev設备失敗,因为:%s", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10010": "無法将裸金属2提供的网络[uuid:%s]附加到叢叢[uuid:%s],因为該叢叢已经有一個了", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10011": "無法将裸金属2提供网络[uuid:%s]附加到叢叢[uuid:%s],因为它们不在同一個可用區中", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10007": "vm[uuid:%s] 在持有 mdev 設备[uuid:%s] 的主機上無法啟動", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10004": "热插拔 mdev 設备到運行中的 VM 失敗,因为:%s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10002": "mdev 設备[uuid:%s]無法Attach到vm[uuid:%s],因为状态錯誤誤", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10003": "mdev 設备 [%s]不可用", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10000": "主機 [%s] 無法进入维护模式,因为 vm[%s] 搭载了 mdev 設备且無法自動迁移", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10018": "失敗在网關[uuid:%s]更新提供网络[uuid:%s]:%s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10009": "裸金属機箱[uuid:%s]未啟用或不可用,請選擇另一個。", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10001": "PCI設备[uuid:%s]已知为%s,但無法找到其mdev規格,因此終止。", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10016": "不在所有 %s 中儲在 baremetal2 预分配网络", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10014": "無法分离依赖於它的運行中实例的裸金属2分配网络[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10015": "网络Uuid列表为空", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10012": "無法将基础架构网络[baremetal2提供网络]与叢叢[uuid:%s]關聯,因为我们需要確保所有具有相同提供网络的叢叢都連接相同的网關", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10013": "provision 网络不应与已連接到叢叢的 L2 网络具有相同的接口名称", + "ORG_ZSTACK_NETWORK_L3_10006": "無法保留 IP 范围,因为没有可用的 IPv4 范围", + "ORG_ZSTACK_NETWORK_L3_10005": "無法保留 IP 范围,因为結束 IP[%s] 小於開始 IP[%s]", + "ORG_ZSTACK_NETWORK_L3_10004": "無法保留 IP 范围,因为結束 IP[%s] 不是 IPv6 地址", + "ORG_ZSTACK_NETWORK_L3_10003": "無法保留 IP 范围,因为結束 IP 地址[%s]不是 IPv4 地址", + "ORG_ZSTACK_NETWORK_L3_10002": "無法保留IP地址范围,因为起始IP地址[%s]無效", + "ORG_ZSTACK_NETWORK_L3_10000": "無法刪除 IP 地址,因为它被 vmnic[uuid:%s] 使用", + "ORG_ZSTACK_NETWORK_L3_10009": "無法预留IP范围,因为没有IPv6范围", + "ORG_ZSTACK_KVM_10001": "从文件加载主機信息失敗。因为\\n%s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10019": "mdev 設备 [uuid:%s] 没有連接到 vm[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10017": "持有 SE MDEV 設备的 VM[UUID:%s] 無法再附加更多 SE MDEV[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10018": "主機[uuid:%s]的IOMMU没有处於[%s]和[%s]状态,該主機托管了PCI設备[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10015": "vm[uuid:%s] 挂载了在不同主機上的 mdev 設备,这些設备与 mdev 設备[uuid:%s] 不同", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10014": "vm[uuid:%s] 挂载了在不同主機上的 pci 設备,而 mdev 設备[uuid:%s] 在另一個主機上", + "ORG_ZSTACK_NETWORK_L3_10010": "無法保留IP范围,因为预留的IP不在IP范围[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10011": "無法更改处於已連接状态的 mdev 設备的状态", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10007": "無法刪除依赖於它的实例的裸金属2分配网络[uuid:%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10012": "無法将 [uuid:%s] 的 mdev 設备附加到 VM,請確保它已啟用且未被占用", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10008": "無法将裸金属2提供网络[uuid:%s]附加到非裸金属2叢叢[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10005": "裸金属2分配网络DHCP范围网掩碼 %s 無效", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10006": "裸金属2 provisioning网络啟動IP %s和結束IP %s不属於同一個子网", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10003": "無法更新依赖於它的实例的裸金属2分配网络[%s]的DHCP配置", + "ORG_ZSTACK_BAREMETAL2_PROVISIONNETWORK_10002": "已经儲在一個裸金属2分配网络,其中dhcpInterface = %s, dhcpRangeStartIp = %s, dhcpRangeEndIp = %s, dhcpRangeNetmask = %s, dhcpRangeGateway = %s", + "ORG_ZSTACK_NETWORK_L3_10018": "在 L3[%s] 中没有 IP 地址范围", + "ORG_ZSTACK_NETWORK_L3_10015": "您必須同时更新系統統和類别", + "ORG_ZSTACK_XINFINI_10027": "不支持未导出的 NVMe-over-Fabric yet", + "ORG_ZSTACK_NETWORK_L3_10014": "無法刪除最後一個普通IP范围,因为仍然儲在地址池", + "ORG_ZSTACK_XINFINI_10026": "未为客戶端[%s]找到活動网關", + "ORG_ZSTACK_NETWORK_L3_10013": "由於 L3 网络 [uuid:%s] 的 MTU 不能大於無 VLAN 网络的 MTU,因此無法設置 mtu 值 [l2网络[uuid:%s]] 的 MTU", + "ORG_ZSTACK_XINFINI_10025": "不支持导出 NVMe-OF 目前尚未实现", + "ORG_ZSTACK_XINFINI_10024": "xinfini 只支持設置总质量等級(QoS)", + "ORG_ZSTACK_NETWORK_L3_10011": "無法保留 IP 范围,因为新范围 [%s:%s] 与旧范围重叠", + "ORG_ZSTACK_XINFINI_10023": "没有可用的具有足够空間[%d]和健康状态的資源池", + "ORG_ZSTACK_XINFINI_10021": "失敗獲取池[id:%d, 名称:%s] 的詳細信息", + "ORG_ZSTACK_XINFINI_10020": "未找到資源池", + "ORG_ZSTACK_KVM_10010": "主機[uuid:%s]没有CPU模型信息,您可以重新連接主機以解决问題", + "ORG_ZSTACK_KVM_10011": "設置强制運行时必須說明原因", + "ORG_ZSTACK_NETWORK_L3_10019": "[%s]的IP不在IP范围[uuid:%s, CIDR:%s]中,該L3网络[%s]已關聯", + "ORG_ZSTACK_KVM_10012": "主機[uuid:%s] 已被刪除", + "ORG_ZSTACK_KVM_10002": "主機[name:%s, ip:%s]的操作系統統[%s]無效", + "ORG_ZSTACK_KVM_10003": "叢叢[uuid:%s]已经儲在具有操作系統統版本[%s]的主機,但新增加的主機[name:%s ip:%s]具有不同的操作系統統版本[%s]", + "ORG_ZSTACK_KVM_10004": "vm[uuid:%s] 因内核錯誤誤而崩溃", + "ORG_ZSTACK_KVM_10005": "主機[uuid: %s]内儲ECC触發,詳情: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10029": "指定的 mdev 設备不在同一主機上:mdev 設备[uuid: %s]位於主機[uuid: %s],而 mdev 設备[uuid: %s]位於主機[uuid: %s]", + "ORG_ZSTACK_KVM_10006": "仍然有主機的CPU模型不相同,詳情: %s", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10026": "無法刪除已附加的 mdev 設备", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10027": "啟動虚機[uuid:%s]失敗,因为並非所有mdev規格[uuids:%s]都儲在", + "ORG_ZSTACK_KVM_10008": "PCI 桥接需要一個大於0且小於32的值", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10024": "無法将 mdev 設备附加到未停止的虚拟機实例上", + "ORG_ZSTACK_KVM_10009": "vm 當前状态[%s],修改virtioSCSI需要vm状态[%s]\"", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10025": "非法的 mdev 設备類型 [%s],仅支持 %s 類型", + "ORG_ZSTACK_NETWORK_L3_10021": "無效 IP[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10022": "叢叢UUID、主機UUID或虚拟機UUID無法同时設置", + "ORG_ZSTACK_NETWORK_L3_10020": "ip[%s] 在 ip 范围[uuid:%s, startIp:%s, endIp:%s] 中,且該 ip 属於 l3 网络[%s],这不允許", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10023": "叢叢不儲在或禁用", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10020": "持有包含mdev設备[uuid:%s]的宿主機[uuid:%s]不是[%s]和[%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10021": "無法从未停止的虚拟機实例detach mdev設备", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10053": "在 SDN 控制器 [IP:%s] 上不儲在 VPC", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10054": "VPC ID 的系統統標签是必填项", + "ORG_ZSTACK_MACVLAN_10002": "失敗检查vlan接口[%s]在kvm主機[uuid:%s]上的l2VlanNetwork[uuid:%s, name:%s],%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10051": "在 SDN 控制器 [IP:%s] 上不儲在開關", + "ORG_ZSTACK_MACVLAN_10005": "無法将L2[uuid:%s]類型的网络服務附加到L3[uuid:%s],因为L2[uuid:%s, vSwitchType:%s]不支持任何公共基础L3网络服務", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10052": "在 SDN 控制器上未連接任何交换機", + "ORG_ZSTACK_MACVLAN_10004": "仅支持 %s macvlan", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10057": "獲取二层网络的逻辑交换機失敗", + "ORG_ZSTACK_MACVLAN_10007": "無法将网络服務附加到l3[uuid:%s],因为l2[uuid:%s, vSwitchType:%s]仅支持私有基本l3网络的vrouter网络提供者", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10058": "獲取二层网络的逻辑交换機失敗,原因:%s", + "ORG_ZSTACK_MACVLAN_10006": "無法将网络服務附加到l3[uuid:%s],因为l2[uuid:%s, vSwitchType:%s]仅支持v路由器网络提供商用於VPC L3网络", + "ORG_ZSTACK_MACVLAN_10009": "只有 KVM 主機支持 L2 類型为 MacVlan 的 vSwitchType", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10056": "無法獲取物理交换機端口因为: %s", + "ORG_ZSTACK_MACVLAN_10008": "無法将网络服務附加到l3[uuid:%s],因为l2[uuid:%s, vSwitchType:%s]仅支持私有基础l3网络的负载均衡器", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10075": "根镜像已被刪除,無法重新制作现在", + "ORG_ZSTACK_STORAGE_CEPH_10023": "问題可能是由錯誤誤的用戶名或密碼或SSH端口或不稳定的网络环境引起的", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10050": "在 SDN 控制器 [IP:%s] 上不儲在租戶", + "ORG_ZSTACK_STORAGE_CEPH_10020": "poolName 可以为 null 但不能为空字符串", + "ORG_ZSTACK_KVM_10022": "ssh 連接到主機[%s]、用戶名[%s]、端口[%s]失敗,因为%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10073": "無法在 KVM 主機[uuid:%s]上創建空的卷[uuid:%s, name:%s]", + "ORG_ZSTACK_STORAGE_CEPH_10021": "當 importImages 为 true 时,poolName 是必需的", + "ORG_ZSTACK_KVM_10023": "主機[%s]在%d秒内未被開啟且原因不明。請检查BMC[%s]中的主機状态", + "ORG_ZSTACK_STORAGE_BACKUP_10092": "未通過恢复安全检查:\\n%s", + "ORG_ZSTACK_KVM_10014": "主機 %s 未由當前 mn 節點管理", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10000": "執行SLB组配置任務未知 taskName: %s", + "ORG_ZSTACK_MEVOCO_10049": "無法找到節點 A 配置信息", + "ORG_ZSTACK_STORAGE_BACKUP_10091": "备份儲儲[uuid:%s]未啟用且未連接", + "ORG_ZSTACK_KVM_10015": "主機 %s 未連接,跳過以重啟 KVM代理", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10039": "無法迁移根卷[uuid:%s],因为儲在已連接的mdev設备", + "ORG_ZSTACK_MEVOCO_10048": "不能同时設置本地和配置", + "ORG_ZSTACK_STORAGE_BACKUP_10090": "數据库备份 [uuid:%s] 尚不儲在", + "ORG_ZSTACK_KVM_10016": "運行中的任務儲在於主機 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10081": "無法在主機 [%s] 上找到標誌文件 [%s],原因:%s", + "ORG_ZSTACK_MEVOCO_10047": "意外的主機管理IP地址: [%s]", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10037": "無法迁移 VM[uuid:%s],因为儲在已關聯的 mdev 設备", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10035": "無法找到 mdev 設备[uuid:%s],它可能已被刪除", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10036": "mdev 設备[uuid:%s] 不儲在或已禁用,与虚拟機[uuid:%s] 關聯", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10034": "未能在目標主機[uuid:%s]中找到足够數量的mdev設备[規格:%s]以供vm[uuid:%s]使用", + "ORG_ZSTACK_MEVOCO_10041": "無效值[%s],ZStack 不支持此類主機分配類型", + "ORG_ZSTACK_STORAGE_BACKUP_10099": "數据库备份[uuid:%s]未啟用且就绪", + "ORG_ZSTACK_STORAGE_CDP_10120": "無法找到連接的备份儲儲[uuid: %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10098": "卷[uuid:%s]已被刪除,状态变更不允許", + "ORG_ZSTACK_MEVOCO_10040": "無效值[%s], 它不是一個双精度浮點數", + "ORG_ZSTACK_STORAGE_CDP_10121": "該操作涉及卷[uuid:%s]将創建鏈類型快照。因此,在VM实例上運行CDP任務时,您無法執行此操作。", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10032": "失敗獲取候選主機以啟動VM[uuid:%s],%s", + "ORG_ZSTACK_STORAGE_BACKUP_10097": "未找到可用的备份儲儲,跳過此任務", + "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10001": "移除系統統主題[uuid:%s]在系統統警報[uuid:%s]中是被禁止的", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10005": "無法找到SLB实例的公共网卡", + "ORG_ZSTACK_MEVOCO_10046": "obj 不是 instanceof NicQos!", + "ORG_ZSTACK_ZWATCH_ALARM_SYSTEM_10000": "報警[uuid:%s]是一個系統統報警,無法刪除", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10004": "负载均衡实例[uuid:%s]配置任務版本:%d,失敗 %d 次", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_CONFIGMANAGER_10003": "無法在组[uuid:%s]中找到可用的SLB实例", + "ORG_ZSTACK_STORAGE_BACKUP_10094": "數据库备份版本[%s]与當前版本[%s]不符", + "ORG_ZSTACK_MACVLAN_10000": "未能在KVM宿主機[uuid:%s, 名称:%s]上实现l2VlanNetwork[uuid:%s, 名称:%s]的桥接,%s", + "ORG_ZSTACK_MEVOCO_10043": "%s 值为[%s],这与%s 值 [%s]儲在冲突", + "ORG_ZSTACK_STORAGE_BACKUP_10093": "無法獲取可用端口监听", + "ORG_ZSTACK_MEVOCO_10060": "在節點 A 設置地址失敗", + "ORG_ZSTACK_KVM_10030": "检查主機容量失敗,因为:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10082": "無法在主機 [%s] 上創建標誌文件 [%s],原因:%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10060": "獲取逻辑交换機失敗:uuid: %s", + "ORG_ZSTACK_KVM_10032": "主機[uuid:%s]的可用内儲容量[%s]低於预留容量[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10083": "在叢叢[%s]中不儲在LocalStorage主儲儲[state=%s,status=%s],當叢叢挂载多個主儲儲时,默認使用本地主儲儲。請检查主儲儲的状态/状态,並確保它们已連接到叢叢。", + "ORG_ZSTACK_KVM_10033": "無法在 KVM 主機 [uuid:%s, ip:%s] 上为 VM[uuid:%s] 注册colo心跳,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10084": "選擇的主要儲儲類型[uuid:%s]不是本地儲儲,請检查當叢叢已挂载本地主要儲儲时,是否可以在其他儲儲上創建資源。", + "ORG_ZSTACK_KVM_10034": "無法在 KVM 主機 [uuid:%s, ip:%s] 上啟動colo同步虚機[uuid:%s],因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10085": "叢叢挂载了多個主儲儲[%s(%s),其他非LocalStorage主儲儲],無法指定數据卷的primaryStorageUuid %s", + "ORG_ZSTACK_KVM_10024": "主機[%s]在未知原因下未在%d秒内關閉。請检查BMC[%s]中的主機状态", + "ORG_ZSTACK_MEVOCO_10059": "此節點不是節點 A", + "ORG_ZSTACK_MEVOCO_10058": "某些節點在工厂模式下儲在,詳細信息:%s", + "ORG_ZSTACK_MEVOCO_10053": "curl啟動代理程序結束,返回碼:%s,標准輸出:%s,標准錯誤誤:%s", + "ORG_ZSTACK_MEVOCO_10052": "無法在 900s 後獲取啟動作业 %s 的結果", + "ORG_ZSTACK_MEVOCO_10050": "無法从啟動代理中找到節點A地址信息", + "ORG_ZSTACK_PCIDEVICE_VIRTUAL_VFIO_MDEV_10040": "無法迁移 VM[UUID:%s],因为儲在已連接的 mdev 設备", + "ORG_ZSTACK_MEVOCO_10057": "節點 A 更新工厂模式失敗,詳情: %s", + "ORG_ZSTACK_MEVOCO_10056": "所有管理節點更新工厂模式失敗,詳情: %s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10013": "MAC地址 %s 無效。它应該類似於 6c:b3:11:1b:0b:1e", + "ORG_ZSTACK_HA_10014": "無法将 FT 設置到包含 USB 設备直通的 VM[uuid:%s] 上", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10012": "裸金属 PXE 服務器[uuid:%s]既未啟用也未連接,請检查", + "ORG_ZSTACK_HA_10015": "無法在包含[%s]的vmm上設置FT,因为已附加mdev設备", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10015": "检测到重复的 bm 綁定 UUID", + "ORG_ZSTACK_HA_10016": "管理節點無法扫描主機", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10014": "裸金属機架[uuid:%s]没有带有MAC地址%s的网卡", + "ORG_ZSTACK_HA_10017": "值[%s]小於0或大於1", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10057": "主機[uuid: %s]的本地主要儲儲[uuid: %s]没有足够的容量[current: %s 字節, needed: %s]", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10017": "检测到重复的三层网络UUID", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10058": "無法找到任何拥有資源[uuid:%s]的主機", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10016": "裸金属綁定不儲在", + "ORG_ZSTACK_HA_10011": "無法在虚拟機[uuid:%s]上設置FT,因为該虚拟機未停止", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10059": "資源[uuid:%s]只能在主機[uuid:%s]上操作,但該主機已被刪除", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10019": "選擇的第3层网络無法分配给機箱[UUID:%s]", + "ORG_ZSTACK_HA_10012": "無法将 FT 設置在虚拟機[uuid:%s]上,因为仍有數据卷附加其中", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10018": "選擇的三层网络不儲在", + "ORG_ZSTACK_HA_10013": "無法在虚拟機[uuid:%s]上設置FT,因为已連接了PCI設备", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10053": "要在本地主儲儲上創建數据卷,您必須使用系統統標签 [%s] 指定數据卷将要創建的主機", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10054": "主機[UUID:%s]不属於本地主要儲儲[UUID:%s]", + "ORG_ZSTACK_KVM_10040": "失敗增加虚拟機CPU,錯誤誤詳情: %s", + "ORG_ZSTACK_HA_10018": "該虚拟機[uuid:%s]的卷儲儲位置处於维护状态,請聯系統管理員解决", + "ORG_ZSTACK_KVM_10043": "無法連接到 KVM[ip:%s, 用戶名:%s, SSH端口:%d] 執行 DNS 检查,請检查用戶名/密碼是否正確;%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10050": "無法将带有本地儲儲數据卷的虚拟機[uuid:%s]进行在线迁移。首先需要先分离所有數据卷。", + "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10001": "查询对象为空", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10051": "無法将具有本地儲儲的虚拟機[uuid:%s]在线迁移。仅支持Linux来宾操作系統統。當前平台是[%s]", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10011": "裸金属機架[uuid:%s]中未找到硬件信息,請選擇另一個。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10052": "無法将带有本地儲儲 ISO 的 VM[UUID:%s] 在线迁移。首先需要先卸载所有 ISO。", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10010": "没有对应的PXE服務器,請再次检查UUID为[%s]的裸金属機箱", + "ORG_ZSTACK_KVM_10035": "無法在 KVM 主機 [uuid:%s, ip:%s] 上配置次要 VM[uuid:%s],因为 %s", + "ORG_ZSTACK_MEVOCO_10028": "L3网络[uuid:%s]未找到。請修正您的静态IP的系統統標签[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10070": "無法找到卷备份[uuid:%s]", + "ORG_ZSTACK_KVM_10036": "無法在 KVM 主機[uuid:%s, ip:%s]上配置主 VM[uuid:%s],因为%s", + "ORG_ZSTACK_MEVOCO_10027": "無效的卷 IOPS[%s] 大於 %d", + "ORG_ZSTACK_KVM_10037": "無法獲取VM[uuid:%s]在KVM宿主機[uuid:%s, ip:%s]上的首次啟動設备,因为%s", + "ORG_ZSTACK_MEVOCO_10026": "無效的卷IOPS[%s]不是一個數字", + "ORG_ZSTACK_ZWATCH_THIRDPARTY_ZAKU_10000": "在查询 ThirdPartyPrometheusNamespace 时,至少需要一個 HostUuid。請检查查询調用參數中是否包含 HostUuid。", + "ORG_ZSTACK_KVM_10038": "失敗獲取虚機[uuid:%s]的設备地址,因为:%s", + "ORG_ZSTACK_MEVOCO_10025": "無效的卷IOPS[%s],它必須大於1(包括1)", + "ORG_ZSTACK_KVM_10039": "失敗獲取主機[uuid:%s]的虚拟化信息,因为:%s", + "ORG_ZSTACK_MEVOCO_10029": "USB設备只能由管理員帳號調用", + "ORG_ZSTACK_STORAGE_BACKUP_10078": "备份儲儲無法執行消息[%s],因为其状态为%s", + "ORG_ZSTACK_MEVOCO_10020": "無效的卷带宽[%s]不是一個數字", + "ORG_ZSTACK_STORAGE_BACKUP_10077": "备份儲儲無法執行消息[%s],因为其状态为%s", + "ORG_ZSTACK_STORAGE_BACKUP_10076": "备份儲儲[uuid:%s, name:%s]没有足够的容量下载圖像[%s]。所需大小:%s,可用大小:%s", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10001": "所有 Ceph 主節點在 Ceph 备份儲儲[uuid:%s] 中斷開連接", + "ORG_ZSTACK_STORAGE_BACKUP_10075": "从 URL %s 獲取到的圖片大小为 %d 字節,这太小了,無法作为圖片,請再次检查 URL。", + "ORG_ZSTACK_STORAGE_BACKUP_10074": "獲取圖像 URL %s 的头部失敗", + "ORG_ZSTACK_STORAGE_BACKUP_10073": "獲取圖片 URL %s 的头部信息失敗: %s", + "ORG_ZSTACK_STORAGE_BACKUP_10072": "請先停止其他節點!", + "ORG_ZSTACK_MEVOCO_10021": "無效的卷带宽[%s]大於%d", + "ORG_ZSTACK_STORAGE_BACKUP_10071": "虚拟機[%s]的叢叢不在与主儲儲[%s]相同的叢叢中", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10023": "無法清除不是处於销毁状态的裸金属实例", + "ORG_ZSTACK_HA_10005": "主機未能对故障主機[uuid:%s, ip:%s]进行端口扫描", + "ORG_ZSTACK_IDENTITY_LOGIN_10000": "不支持的登录類型 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10068": "叢叢[uuid=%s] 挂载了多個主儲儲[LocalStorage,其他非LocalStorage主儲儲],您必須指定數据碟所在的主儲儲", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10003": "Failed to migrate Image %s from BS %s to BS %s. cause: %s", + "ORG_ZSTACK_STORAGE_MIGRATION_BACKUP_CEPH_10002": "找到 trashId(%s) 在备份儲儲 [%s] 中用於迁移安装路径[%s]。如果您坚持要迁移镜像[%s],請先通過 'APICleanUpTrashOnBackupStorageMsg' 清理它。", + "ORG_ZSTACK_HA_10000": "可能該VM已被刪除,跳過HA检查器", + "ORG_ZSTACK_HA_10001": "無法找到虚拟機[name:%s, uuid:%s]的宿主機,hostUuid为空", + "ORG_ZSTACK_HA_10002": "没有找到HaHostChecker,無法进行HA操作", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10064": "{主機[uuid:%s]的物理容量使用量已超出閾值[%s]}", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10067": "叢叢[uuid=%s] 挂载了多個主儲儲[LocalStorage,其他非LocalStorage主儲儲],您必須指定根磁碟所在的主儲儲", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10060": "KVM 主機[uuid: %s] 無法添加到本地主儲儲[uuid: %s]中,%s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10020": "仅支持 ISO 镜像在 ZStack 裸金属服務中", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10061": "無法在 KVM 主機[uuid:%s, ip:%s]上創建空快照卷[name:%s, installpath: %s],因为%s", + "ORG_ZSTACK_KVM_10054": "當虚拟機[uuid:%s]处於状态%s时,無法进行卷快照合並。該操作仅允許在虚拟機处於運行中或停止状态时執行", + "ORG_ZSTACK_HA_10008": "异常發生於同步自我防护状态至宿主機[uuid: %s]时,%s", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10000": "目录[%s]在管理服務器[%s]上未找到", + "ORG_ZSTACK_KVM_10055": "实时卷快照合並需要 libvirt 版本大於 %s,當前 libvirt 版本是 %s。請停止虚拟機並重新執行該操作或如果它是數据卷则detach該卷", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10062": "从 SFTP 备份儲儲[主機名:%s, 路径: %s]下载數据到本地主儲儲[唯一標識:%s, 路径: %s]失敗,%s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10022": "無法恢复处於非销毁状态的裸金属实例", + "ORG_ZSTACK_HA_10009": "The %s 無法設置为 '%s',因为儲儲网络已失效,必須保持HA啟用。", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10001": "命名空間[%s]不儲在度量[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10063": "失敗从本地儲儲[uuid:%s, 路径:%s]上传比特到SFTP备份儲儲[主機名:%s, 路径:%s],錯誤誤信息:%s", + "ORG_ZSTACK_BAREMETAL_INSTANCE_10021": "仅支持在裸金属服務中使用ImageStoreBackupStorage", + "ORG_ZSTACK_ZWATCH_NAMESPACE_10002": "指標[%s]命名空間[%s]中不儲在名为%s的標签", + "ORG_ZSTACK_MEVOCO_10039": "無效值[%s],它必須是一個在(0, 1]范围内的双精度數", + "ORG_ZSTACK_KVM_10047": "主機[uuid:%s, 状态:%s]未連接", + "ORG_ZSTACK_COMPUTE_OVS_10000": "ovs cpu 固定資源配置:[%s] 格式錯誤誤。", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10001": "故意为之 1", + "ORG_ZSTACK_MEVOCO_10037": "無效值[%s],它必須是一個大於0的双精度數", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10002": "故意为之 2", + "ORG_ZSTACK_MEVOCO_10031": "未知的安全級别代碼[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10089": "卷备份元數据操作失敗,因为 %s", + "ORG_ZSTACK_STORAGE_BACKUP_10087": "在圖像儲儲[uuid:%s]生成卷备份元數据文件失敗,因为IO錯誤誤:%s", + "ORG_ZSTACK_TEST_CORE_ASYNCBACKUP_10000": "故意 3", + "ORG_ZSTACK_MEVOCO_10034": "主機[uuid:%s]的操作系統統 %s %s 版本過於老旧,QEMU 不支持网络或磁碟 I/O 的 QoS。請選擇另一個没有 QoS 配置的实例 offerings。", + "ORG_ZSTACK_MEVOCO_10033": "[%s] 不是標准CIDR", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10010": "無法添加带有無效VLAN范围[%s, %s]的华为iMaster SDN控制器", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10008": "iso[uuid: %s] 已附加到 vm[uuid: ], 但 iso 不在任何块儲儲上,您必須先将其detach,再迁移vm", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10009": "失敗找到卷:%s 的块 SCSI LUN", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10035": "主機[uuid:%s]無法访问本地儲儲[uuid:%s], 可能是其已被分离", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10013": "無法創建华为iMaster L3网络,因为缺少逻辑路由器UUID", + "ORG_ZSTACK_MEVOCO_10093": "刪除儲儲服務质量 [%s] 因帳戶權限忽略。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10036": "資源[uuid:%s, 類型: %s] 不在本地主儲儲[uuid:%s] 上", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10014": "無法創建华为iMaster L3网络,因为l2网络[uuid:%s]已经儲在", + "ORG_ZSTACK_MEVOCO_10092": "無效的卷服務质量模式: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10037": "資源[uuid:%s, 類型: %s]在本地主儲儲[uuid:%s]上映像射到多個hypervisor%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10011": "無法添加华为iMaster SDN控制器而未指定VLAN范围或VLAN范围", + "ORG_ZSTACK_MEVOCO_10091": "未找到卷", + "ORG_ZSTACK_STORAGE_BACKUP_10058": "無法指定連接不同叢叢的主儲儲。", + "ORG_ZSTACK_STORAGE_BACKUP_10057": "無法創建 VM,因为至少应設置一個字段(l3NetworkUuids、zoneUuid、clusterUuid、hostUuid)", + "ORG_ZSTACK_MEVOCO_10090": "無法为附加了多個虚拟機[%s, %s]的卷[%s]創建快照", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10033": "無法在本地主要儲儲[uuid: %s]上創建數据卷[uuid: %s],因为未指定主機Uuid。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10034": "没有啟用主機状态,請检查主機的可用性", + "ORG_ZSTACK_KVM_10064": "失敗在KVM宿主機[uuid:%s, ip:%s]更新网卡[nic:vm:%s]因为%s", + "ORG_ZSTACK_KVM_10065": "failed to attach nic[uuid:%s, vm:%s] on kvm host[uuid:%s, ip:%s], because %s, please try again or delete device[%s] by yourself", + "ORG_ZSTACK_KVM_10066": "失敗在KVM宿主機[uuid:%s, ip:%s]上Attach网卡[nic:uuid:%s, vm:%s],因为%s", + "ORG_ZSTACK_KVM_10067": "失敗从KVM宿主機[uuid:%s, ip:%s]卸载數据卷[uuid:%s, installPath:%s]至虚拟機[uuid:%s, name:%s],原因:%s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10005": "端口转發規则 [uuid:%s] 已刪除", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10006": "端口转發規则[uuid:%s]未处於啟用状态,當前状态为%s", + "ORG_ZSTACK_KVM_10059": "vm[uuid:%s]當前不是運行或停止状态,當前状态[%s]", + "ORG_ZSTACK_TICKET_10000": "票据[uuid:%s, 名称:%s]只能在取消之後才能更新,當前状态是%s", + "ORG_ZSTACK_TICKET_10001": "操作被拒绝。此操作需由帳號/虚拟ID[uuid:%s]執行", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10017": "獲取 SDN 控制器 [IP:%s] 的令牌失敗", + "ORG_ZSTACK_MEVOCO_10086": "意外地,VM[uuid:%s] 已经不再運行,請稍後重試", + "ORG_ZSTACK_STORAGE_BACKUP_10056": "當前卷[uuid: %s]的虚拟機[uuid: %s]已不再是用於备份的虚拟機[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10003": "無法執行映像射LUN到主機流程,因为PS主機引用元數据为空", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10018": "獲取 SDN 控制器 [IP:%s] 的令牌失敗,因为 %s", + "ORG_ZSTACK_MEVOCO_10085": "無法从卷[uuid: %s]的树[uuid: %s]中找到快照。可能是無需驗證的快照鏈。", + "ORG_ZSTACK_STORAGE_BACKUP_10055": "根卷备份在组[uuid:%s]中未找到", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10000": "無法執行映像射 LUN 到主機流程,因为後端設备为空", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10015": "無法刪除华为逻辑路由器[uuid:%s],因为三层网络[uuid:%s]已綁定", + "ORG_ZSTACK_MEVOCO_10084": "無法从卷[uuid: %s]的树[uuid: %s]中找到最新的快照。可能無需驗證快照鏈。", + "ORG_ZSTACK_STORAGE_BACKUP_10054": "未找到該组UUID: %s 的卷备份", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10016": "獲取 SDN 控制器 [IP:%s] 的令牌失敗", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10001": "無法執行映像射LUN到主機流程,因为PS主機引用为空", + "ORG_ZSTACK_MEVOCO_10083": "無法在卷[uuid: %s]使用的快照树中找到。可能是無需驗證的快照鏈。", + "ORG_ZSTACK_STORAGE_BACKUP_10053": "資源[uuid: %s]已经創建了CDP任務,無法同时創建备份作业。", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10006": "KVM 主機[uuid: %s] 無法添加到块主儲儲[uuid: %s] 中,%s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10009": "端口转發規则[uuid:%s]不在啟用状态,當前状态为%s。只有在啟用状态下才能附加該規则", + "ORG_ZSTACK_STORAGE_BACKUP_10052": "Failed to create backups for VM[uuid:%s], because it is not in state[%s, %s] \n失敗了为VM[uuid:%s]創建备份,因为它不在状态[%s, %s]", + "ORG_ZSTACK_MEVOCO_10089": "無法为包含重复卷[uuid: %s]的卷[%s]截取快照", + "ORG_ZSTACK_STORAGE_BACKUP_10051": "卷[uuid:%s]不是根卷", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10019": "刪除 SDN 控制器 [IP:%s] 的令牌失敗,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10004": "無法執行映像射LUN到主機流程,無效的LUN ID", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10007": "端口转發規则 rule[uuid:%s] 没有綁定到任何 VM 的网卡上,無法解除綁定", + "ORG_ZSTACK_MEVOCO_10088": "無法为挂载状态以外的卷[%s]創建快照", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10005": "無法執行映像射LUN到主機流程,無效的LUN類型", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10008": "端口转發規则[uuid:%s]已綁定到VM网卡[uuid:%s],無法再次綁定", + "ORG_ZSTACK_MEVOCO_10087": "如何一個運行中的VM[uuid:%s]没有宿主機uuid?", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10020": "獲取 SDN 控制器 [IP:%s] 的租戶信息失敗", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10021": "獲取 SDN 控制器 [IP:%s] 的租戶信息失敗,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10019": "儲儲块[uuid:%s, name:%s]無法在關聯的叢叢中找到可用主機以实例化卷", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10024": "獲取 SDN 控制器 [IP:%s] 的逻辑交换機端口失敗", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10047": "無法将數据卷[uuid:%s]挂载到虚拟機[uuid:%s]。两個虚拟機的根卷和數据卷都位於本地主儲儲上,但它们位於不同的主機上。根卷[uuid:%s]位於主機[uuid:%s]上,而數据卷[uuid:%s]位於主機[uuid:%s]上", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10025": "獲取 SDN 控制器 [IP:%s] 的交换機端口失敗,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10048": "數据卷[name:%s, uuid:%s]位於本地儲儲[uuid:%s]上;然而,包含該數据卷的主機已被刪除。無法恢复此卷", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10022": "獲取 SDN 控制器 [IP:%s] 的交换設备失敗", + "ORG_ZSTACK_STORAGE_BACKUP_10069": "VM正在創建备份任務,無法同时啟用CDP任務。", + "ORG_ZSTACK_KVM_10070": "失敗在KVM宿主機[uuid:%s, ip:%s]上销毁虚拟機[uuid:%s name:%s],因为%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10049": "無法恢复虚拟機[uuid:%s, name:%s]。該虚拟機的根磁碟位於本地儲儲[uuid:%s];然而,托管根磁碟的主機已被刪除", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10023": "獲取 SDN 控制器 [IP:%s] 的交换設备失敗,因为 %s", + "ORG_ZSTACK_STORAGE_BACKUP_10068": "主機[uuid: %s]的叢叢不在与卷[uuid: %s]主儲儲相同的叢叢中", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10020": "該虚拟機[name:%s uuid:%s]已经儲在端口转發規则,其VIP与[uuid:%s]不同", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10044": "創建依赖於镜像缓儲[uuid:%s, 位於主機uuid列表: [%s]], 無法在其他位置創建。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10045": "本地儲儲不支持针对hypervisor[%s]的在线迁移", + "ORG_ZSTACK_KVM_10075": "失敗在KVM宿主機[uuid:%s, ip:%s]上停止虚拟機[uuid:%s name:%s],因为%s", + "ORG_ZSTACK_KVM_10078": "主機[uuid:%s]的容量不足以提供cpu[%s], 内儲[%s字節]", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10017": "VIP端口范围[vipStartPort:%s, vipEndPort:%s]与規则[uuid:%s, vipStartPort:%s, vipEndPort:%s]重叠", + "ORG_ZSTACK_KVM_10069": "無法将數据卷[uuid:%s, installPath:%s]附加到vm[uuid:%s, name:%s]上,該vm位於kvm宿主機[uuid:%s, ip:%s]上,因为%s", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10014": "無效的 CIDR[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10015": "無效的CIDR[%s],仅支持ipv4", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10012": "無法創建端口转發規则,因为公网端口范围[vipStartPort:%s, vipEndPort:%s]与私网端口范围[privateStartPort:%s, privateEndPort:%s]不兼容", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10010": "無法找到卷列表:%s 的块 SCSI LUN", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10013": "对於端口转發范围,端口范围大小必須匹配;VIP范围[%s, %s]的大小与范围[%s, %s]的大小不匹配", + "ORG_ZSTACK_NETWORK_SERVICE_PORTFORWARDING_10010": "来宾L3网络与端口转發規则的VIP L3网络相同[uuid:%s]和[uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10028": "獲取SDN控制器[%s]的Fabric失敗", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10013": "不支持在包含ceph的情况下对多個ps进行卷快照操作", + "ORG_ZSTACK_MEVOCO_10097": "未知消息版本。", + "ORG_ZSTACK_STORAGE_BACKUP_10067": "未找到可用的备份儲儲", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10014": "映像射 LUN 到主機前失敗,在将卷挂载到 VM 之前", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10029": "獲取 SDN 控制器 [IP:%s] 的 fabrics 失敗,因为 %s", + "ORG_ZSTACK_MEVOCO_10096": "非管理員帳號不能設置带宽超過 %s", + "ORG_ZSTACK_STORAGE_BACKUP_10066": "VM 不处於停止状态: %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10026": "獲取 SDN 控制器 [IP:%s] 的 VPC 失敗", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10011": "失敗交换块 SCSI LUN 信息:%s", + "ORG_ZSTACK_MEVOCO_10095": "SetVolumeQosMsg 版本 1 已废弃,請使用版本 2", + "ORG_ZSTACK_STORAGE_BACKUP_10065": "VM未找到,带有体积备份[uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10027": "獲取 SDN 控制器 [IP:%s] 的 VPC 失敗,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10012": "detach volume 後清理資源失敗,因为 %s", + "ORG_ZSTACK_MEVOCO_10094": "無法在主機 %s 刪除虚拟機的卷服務质量,因为當前虚拟機的状态为 %s,但支持的预期状态为 [%s, %s]", + "ORG_ZSTACK_STORAGE_BACKUP_10064": "原始卷[uuid:%s]用於备份[uuid:%s]已不再挂载至vm[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_10063": "原始卷[uuid:%s]用於备份已被刪除,無法将卷还原到該卷", + "ORG_ZSTACK_MEVOCO_10099": "非管理員帳號仅允許設置总 %s 限制。", + "ORG_ZSTACK_STORAGE_BACKUP_10061": "卷备份[uuid:%s]处於状态%s,無法将其还原到該卷", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10016": "primaryStorageUuid 是必填项,當下载镜像缓儲时", + "ORG_ZSTACK_MEVOCO_10098": "未知质量保證限值類型。", + "ORG_ZSTACK_STORAGE_BACKUP_10060": "無法从非根卷备份[uuid:%s]創建VM", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10017": "該虚拟機在不同的主機上具有多個本地卷[%s]。請检查异常的虚拟機本地卷", + "ORG_ZSTACK_STORAGE_CEPH_10004": "無效的监控URL[%s],主機名不能为空。有效的监控URL格式为%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10032": "獲取 iMaster 逻辑交换機 [%s] 無响应", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10018": "主機[hostUuid:%s]上的卷無法附加到VM,因为該VM在其他主機[hostUuid:%s]上有本地卷", + "ORG_ZSTACK_STORAGE_CEPH_10005": "無效的 monUrl[%s],SSH端口大於65535或小於1。有效的 monUrl 格式为 %s", + "ORG_ZSTACK_STORAGE_CEPH_10002": "無效的 monUrl[%s],sshUsername:sshPassword 部分無效。有效的 monUrl 格式为 %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10030": "創建华为 iMaster 逻辑交换機 [%s] 失敗因为 %s", + "ORG_ZSTACK_STORAGE_CEPH_10003": "無效的 monUrl[%s]。SSH用戶名和密碼必須用':'分隔且不能为空。有效的 monUrl 格式为 %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10035": "[%s] 华为 iMaster 逻辑交换端口 [%s] 失敗原因:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10013": "两個叢叢[uuid:%s,uuid:%s]在迁移vm[uuid:%s]到另一個叢叢时無法在l2网络中互相访问", + "ORG_ZSTACK_STORAGE_CEPH_10008": "Ceph 儲儲池[uuid:%s]已在此名称下添加到ZStack並被其他地方使用,無法重复使用該Ceph儲儲池。", + "ORG_ZSTACK_STORAGE_BACKUP_10038": "無效 URL[%s],应为 hostname:/path", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10036": "獲取逻辑交换機端口 pf 逻辑交换機[%s]失敗,因为%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10014": "URL[%s] 不是以 '/' 開头的绝对路径", + "ORG_ZSTACK_STORAGE_CEPH_10009": "無法添加 Ceph 主儲儲,已有使用 mon[主機名:%s] 的 Ceph 主儲儲", + "ORG_ZSTACK_STORAGE_BACKUP_10037": "無效類型[%s],应为[nfs, sshfs, nbd]", + "ORG_ZSTACK_STORAGE_CEPH_10006": "操作失敗,因为池名称[poolName:%s]不能包含不可打印的ASCII字符。", + "ORG_ZSTACK_KVM_10080": "當虚拟機平台为其他时,數据卷和光驱的數量不能超過3個,當前为%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10033": "刪除华为 iMaster 逻辑交换機 [%s] 失敗,因为 %s", + "ORG_ZSTACK_STORAGE_BACKUP_10036": "学位 [%s] 应該是正數", + "ORG_ZSTACK_STORAGE_CEPH_10007": "創建失敗,重复的 poolName[%s]。儲在同名的池[uuid:%s]。", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10016": "虚拟機[主機UUID:%s]的宿主機与卷[主機UUID:%s]的宿主機不同。卷無法挂载到該虚拟機。", + "ORG_ZSTACK_STORAGE_BACKUP_10035": "[%s] 不是標准的 cidr,你是指 [%s]?", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10034": "更新华为 imaster 逻辑交换機 [%s] 失敗,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10010": "該磁碟[uuid:%s]是虚拟機[uuid:%s]的根磁碟。當前,該虚拟機仍挂载有 %s 個數据磁碟,請先卸载它们再进行迁移", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10011": "該磁碟[uuid:%s]是虚拟機[uuid:%s]的根磁碟。當前虚拟機仍挂载有ISO文件,請先卸载後再进行迁移", + "ORG_ZSTACK_KVM_10088": "失敗在KVM宿主機[uuid:%s, ip:%s]上检查物理网络接口[name:%s]", + "ORG_ZSTACK_KVM_10079": "主機[%s]更新SPICE通道配置失敗,因为%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10021": "卷:%s 未挂载,無法为卷創建镜像缓儲", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10024": "失敗於查找安装路径以下载卷: %s,請提前准备該路径。", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10039": "刪除华为 iMaster 逻辑路由器[%s]失敗,因为%s", + "ORG_ZSTACK_MEVOCO_10064": "网络入站带宽格式錯誤誤 %s", + "ORG_ZSTACK_STORAGE_BACKUP_10034": "卷备份[uuid:%s]在任何备份儲儲中未找到", + "ORG_ZSTACK_MEVOCO_10063": "网络入站带宽超過最大值32G bps", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10025": "失敗找到主機下载卷 %s", + "ORG_ZSTACK_STORAGE_BACKUP_10033": "没有權限在 uuid: %s 组内的卷备份中操作", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10022": "無法找到目標主機 for 体积:%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10037": "刪除华为 iMaster 逻辑交换端口 [%s] 失敗,因为 %s", + "ORG_ZSTACK_STORAGE_BACKUP_10032": "多個根磁碟在组uuid: %s 内被找到", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10023": "失敗找到与卷 %s 映像射的主機", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10038": "創建华为iMaster逻辑路由器[%s]失敗,因为%s", + "ORG_ZSTACK_MEVOCO_10061": "管理節點状态不是%s", + "ORG_ZSTACK_STORAGE_BACKUP_10031": "根磁碟在组uuid: %s 内缺失", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10026": "失敗獲取主機初始化器引用,請重新連接此主機:%s", + "ORG_ZSTACK_MEVOCO_10066": "网络出站带宽格式錯誤誤 %s", + "ORG_ZSTACK_MEVOCO_10065": "网络出站带宽超出最大值32G bps", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10042": "創建华为iMaster子网[%s]失敗,因为%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10028": "下载镜像[uuid:%s]到本地儲儲[uuid:%s]的所有主機失敗。%s", + "ORG_ZSTACK_STORAGE_CEPH_10015": "無效的 monUrl[%s]. 一個有效的 URL 格式为 %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10043": "刪除华为 iMaster 子网[%s]失敗,因为%s", + "ORG_ZSTACK_STORAGE_CEPH_10016": "dataVolumePoolName 可以为 null 但不能为空字符串", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10040": "創建华为iMaster逻辑鏈路[%s]失敗,因为%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10041": "刪除华为 iMaster 逻辑鏈路[%s]失敗,因为%s", + "ORG_ZSTACK_STORAGE_CEPH_10019": "無法添加 Ceph 备份儲儲,當前有使用 mon[主機名:%s] 的 Ceph 备份儲儲", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10046": "没有新的物理交换機端口鏈接,这不应該發生", + "ORG_ZSTACK_MEVOCO_10082": "失敗設置IO线程[%d]綁定[%s]在虚拟機[%s]上: %s。", + "ORG_ZSTACK_STORAGE_BACKUP_10049": "創建卷备份时失敗,卷[uuid:%s]的關聯卷不在状态[%s, %s]中", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10025": "主要儲儲[uuid:%s]已禁用,不允許冷迁移", + "ORG_ZSTACK_STORAGE_BACKUP_10048": "創建卷备份时失敗,因为虚拟機不在状态[%s, %s]的范围内", + "ORG_ZSTACK_STORAGE_CEPH_10017": "rootVolumePoolName 可以为 null 但不能为空字符串", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10026": "卷[uuid:%s]不再在本地儲儲上儲在,它可能已被刪除", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10044": "獲取 SDN 控制器 [IP:%s] 的系統統信息失敗", + "ORG_ZSTACK_STORAGE_BACKUP_10047": "創建卷备份时失敗,因为該卷未連接到任何虚拟機[uuid:%s]", + "ORG_ZSTACK_STORAGE_CEPH_10018": "imageCachePoolName 可以为 null 但不能为空字符串", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10045": "獲取 SDN 控制器 [IP:%s] 的系統統信息失敗,因为 %s", + "ORG_ZSTACK_STORAGE_BACKUP_10046": "無法为共享卷[uuid:%s]創建卷备份", + "ORG_ZSTACK_KVM_10093": "無法連接到KVM宿主機[uuid:%s, ip:%s, url:%s],原因:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10022": "要在本地主儲儲上創建卷,您必須指定将使用系統統標签 [%s] 創建卷的主機", + "ORG_ZSTACK_KVM_10096": "主機無法访问任何主要儲儲,%s", + "ORG_ZSTACK_STORAGE_PRIMARY_LOCAL_10023": "無效的 URI,正確的示例是 file://$URL;hostUuid://$HOSTUUID 或 volume://$VOLUMEUUID", + "ORG_ZSTACK_STORAGE_CEPH_10012": "添加相同的 Mon 節點是不允許的", + "ORG_ZSTACK_KVM_10099": "主機[%s] SSH端口[%s]在%s秒後仍未打開,連接超时", + "ORG_ZSTACK_STORAGE_CEPH_10010": "無法在同一监控组中添加相同的主機[%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10031": "备份快照到备份儲儲是一個已弃用的功能,不支持在块級主儲儲上使用", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10032": "失敗在ps:%s上查找叢叢以处理提交卷", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10035": "主儲儲 UUID 在刪除 LUN 时是必填项", + "ORG_ZSTACK_MEVOCO_10075": "共享磁碟目前仅支持 virtio-scsi 類型", + "ORG_ZSTACK_STORAGE_BACKUP_10045": "意外的备份儲儲[type:%s,uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10036": "主機UUID在獲取主機初始化器名称时是必填项", + "ORG_ZSTACK_MEVOCO_10074": "可共享卷[uuid:%s]已附加到VM[uuid:%s]", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10048": "没有找到新的物理交换機端口,这不应該發生", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10033": "失敗找到宿主機以提交卷:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10034": "失敗从BackupStorage[主機名:%s]下载[%s]到块主儲儲[uuid:%s,路径:%s], %s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10049": "在 SDN 控制器 [IP:%s] 上不儲在 Fabric", + "ORG_ZSTACK_MEVOCO_10078": "當前版本的許可證不支持修改此資源配置 [名称:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10037": "發起人名称 %s 被其他主機占用,請重新生成主機 %s 的發起人", + "ORG_ZSTACK_STORAGE_PRIMARY_BLOCK_10038": "未能根据名称找到模板 LUN:%s", + "ORG_ZSTACK_MEVOCO_10076": "可共享的卷[uuid: %s]已挂载,不支持组快照。", + "ORG_ZSTACK_AI_MESSAGE_10002": "無法取消數据叢創建任務,因为 resourceUuid[%s] 或 modelCenterUuid[%s] 为空", + "ORG_ZSTACK_AI_MESSAGE_10001": "無法取消模型服務下载任務,因为 resourceUuid[%s] 或 modelCenterUuid[%s] 为空", + "ORG_ZSTACK_IPSEC_VYOS_10009": "应用到高可用组失敗,因为 %s", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10013": "失敗的 HTTP 調用所有 Prometheus 实例", + "ORG_ZSTACK_PREMIUM_EXTERNALSERVICE_PROMETHEUS_10012": "未知值類型 %s, key = %s", + "ORG_ZSTACK_ENCRYPT_10000": "解析API消息失敗:無法解析加密參數,類型为%s", + "ORG_ZSTACK_ENCRYPT_10002": "解析API消息失敗:發现%d個加密參數系統統標签,预期为1個", + "ORG_ZSTACK_IPSEC_VYOS_10001": "vyos 不支持 aes-192 作为 IkeEncryptionAlgorithm,可用選项为 aes-128, aes-256, 3des", + "ORG_ZSTACK_IPSEC_VYOS_10000": "远程CIDR[%s]与虚拟路由器接口CIDR[%s]重叠", + "ORG_ZSTACK_IPSEC_VYOS_10003": "vyos 不支持将 %d 作为IKE DH组", + "ORG_ZSTACK_IPSEC_VYOS_10002": "vyos 不支持 aes-192 作为 PolicyEncryptionAlgorithm,可用選项为 aes-128、aes-256、3des", + "ORG_ZSTACK_COMPUTE_VM_10000": "VM[%s] 的状态不是運行状态,無法同步时間", + "ORG_ZSTACK_COMPUTE_VM_10008": "vm[uuid:%s] 处於叢叢[uuid:%s]中,但叢叢中没有可用的主機,無法为 vm 更换镜像", + "ORG_ZSTACK_COMPUTE_VM_10007": "vm[uuid:%s] 的叢叢UUID为空,無法为其更改镜像", + "ORG_ZSTACK_COMPUTE_VM_10006": "vm[uuid: %s] 的状态现在不是已停止,無法執行 'changevmimage' 操作", + "ORG_ZSTACK_COMPUTE_VM_10005": "xml挂钩[uuid: %s]成功附加到vm[uuid:%s],但失敗重啟vm。詳細信息是: %s", + "ORG_ZSTACK_COMPUTE_VM_10004": "xml挂钩[uuid: %s]已成功从vm[uuid:%s]分离,但未能重啟vm。詳細信息是: %s", + "ORG_ZSTACK_COMPUTE_VM_10003": "热插拔未關閉,無法打開VM NUMA", + "ORG_ZSTACK_COMPUTE_VM_10011": "方向必須設置为 in 或 out", + "ORG_ZSTACK_COMPUTE_VM_10010": "無法找到备份儲儲,無法提交卷快照[psUuid:%s]作为镜像,目標需要PS uuid:%s", + "ORG_ZSTACK_COMPUTE_VM_10018": "状态在更改密碼时不正確。", + "ORG_ZSTACK_COMPUTE_VM_10017": "未在數据库中找到目標主機的UUID:%s,無法向該主機發送修改密碼命令!", + "ORG_ZSTACK_STORAGE_DEVICE_10036": "HBG扫描錯誤誤: %s", + "ORG_ZSTACK_COMPUTE_VM_10015": "vm [%s] 的 HostUuid 为空,無法同步网卡 qos", + "ORG_ZSTACK_COMPUTE_VM_10014": "vm [%s] 的状态必須为運行中或暫停中才能同步网卡 qos", + "ORG_ZSTACK_STORAGE_DEVICE_10031": "雲实例[UUID: %s]主機[UUID: %s]未連接SCSI磁碟[UUID: %s]", + "ORG_ZSTACK_COMPUTE_VM_10013": "出站带宽必須設置为不超過 %s。", + "ORG_ZSTACK_COMPUTE_VM_10012": "入站带宽必須設置为不超過 %s。", + "ORG_ZSTACK_STORAGE_DEVICE_10030": "vm 实例[%s]状态[%s]不在允許的状态列表[%s]中", + "ORG_ZSTACK_COMPUTE_VM_10022": "設置安全級别失敗,因为安全級别已被禁用。", + "ORG_ZSTACK_COMPUTE_VM_10020": "數据卷的數量超過了限制[num: %s],請在創建 VM 时减少數据卷的數量。", + "ORG_ZSTACK_STORAGE_DEVICE_10028": "指定的scsi lun[wwid: %s] 不儲在或禁用", + "ORG_ZSTACK_STORAGE_DEVICE_10029": "scsi[%s] lun[wwid:%s] 已被挂载到vm[%s]", + "ORG_ZSTACK_STORAGE_DEVICE_10026": "不同的 iSCSI 配置在主機[uuid:%s, targets:%s]和主機[uuid:%s, targets:%s]中被發现", + "ORG_ZSTACK_STORAGE_DEVICE_10027": "在不同的主機上發现了不同的磁碟類型,对於逻辑单元[LUN][序列:%s]無法将其附加到叢叢", + "ORG_ZSTACK_COMPUTE_VM_10029": "因为指定了网络[uuid:%s]的前缀,無法克隆VM", + "ORG_ZSTACK_STORAGE_DEVICE_10024": "SCSI LUN[%s] 记录在主機 [%s] 上未找到", + "ORG_ZSTACK_COMPUTE_VM_10028": "因为 IPv6 地址[%s]無效,無法克隆 VM", + "ORG_ZSTACK_STORAGE_DEVICE_10025": "意外的虚拟機類型[%s]对於主機 [%s]", + "ORG_ZSTACK_COMPUTE_VM_10027": "由於网掩碼指定在网络[uuid:%s]上,因此無法克隆VM", + "ORG_ZSTACK_STORAGE_DEVICE_10022": "不同的 NVMe 目標在主機[hostUuid:%s, targets:%s]和主機[hostUuid:%s, targets:%s]中被發现", + "ORG_ZSTACK_COMPUTE_VM_10026": "因为 IP 地址[%s]無效,無法克隆 VM", + "ORG_ZSTACK_STORAGE_DEVICE_10023": "SCSI LUN[%s] 已連接至虚機[VM %s]", + "ORG_ZSTACK_COMPUTE_VM_10025": "因为 L3 网络[uuid:%s] 未找到,無法克隆 VM", + "ORG_ZSTACK_STORAGE_DEVICE_10020": "vm实例[%s]状态[%s]不在允許的状态列表[%s]中", + "ORG_ZSTACK_COMPUTE_VM_10024": "未知的安全級别代碼[%s],支持的值为%s", + "ORG_ZSTACK_STORAGE_DEVICE_10021": "vm 实例[%s] 主機[uuid: %s] 未挂载scsi lun[uuid: %s]", + "ORG_ZSTACK_COMPUTE_VM_10023": "無法将安全級别設置为不 %s 虚拟機 [uuid:%s]", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10002": "當前主儲儲 %s 没有設置第三方令牌,暫时無法創建块卷", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10001": "無效分配的URL:%s", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_10000": "分配的URL未找到", + "ORG_ZSTACK_STORAGE_DEVICE_10017": "scsi lun[wwid:%s] 已被附加到vm[%s]中", + "ORG_ZSTACK_STORAGE_DEVICE_10015": "scisLun[uuids:%s] 没有Attach到主機[uuid:%s]的叢叢上", + "ORG_ZSTACK_STORAGE_DEVICE_10016": "請卸载所有虚拟機[%s]的块設备後再試一次", + "ORG_ZSTACK_STORAGE_DEVICE_10014": "SCSI LUN[WWID: %s] 已被附加到虚拟機实例 %s", + "ORG_ZSTACK_STORAGE_DEVICE_10011": "iSCSI服務器[uuid: %s]未連接到叢叢[uuid: %s]", + "ORG_ZSTACK_STORAGE_DEVICE_10012": "iSCSI服務器[uuid: %s]仍与叢叢[uuid: %s]連接", + "ORG_ZSTACK_STORAGE_DEVICE_10010": "iSCSI服務器[uuid: %s]已連接至叢叢[uuid: %s]", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10008": "localCidr 和 remoteCidr 必須是 Cidr!", + "ORG_ZSTACK_NETWORK_SERVICE_HEADER_NFVINSTGROUP_10000": "查询叢叢状态不支持此NFV实例類型", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10001": "vpn网關 [%s] 已儲在,無法刪除远程資源", + "ORG_ZSTACK_STORAGE_DEVICE_10008": "iSCSI服務器[ip: %s, 端口: %s] 已经儲在", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10005": "%s 不是一個有效的IPv4地址", + "ORG_ZSTACK_STORAGE_DEVICE_10009": "iSCSI服務器IP: %s 不合法", + "ORG_ZSTACK_STORAGE_DEVICE_10006": "NVMe服務器[uuid: %s]已連接至叢叢[uuid: %s]", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10007": "远程CIDR必須是CIDR格式!", + "ORG_ZSTACK_HYBRID_NETWORK_VPN_10006": "本地Cidr必須是Cidr!", + "ORG_ZSTACK_STORAGE_DEVICE_10004": "NVMe 服務器[ip: %s, 端口: %s, 传輸: %s] 已经儲在", + "ORG_ZSTACK_STORAGE_DEVICE_10005": "NVMe 服務器 IP: %s 不合法", + "ORG_ZSTACK_STORAGE_DEVICE_10003": "不支持将带有共享块的虚機[uuid:%s]迁移", + "ORG_ZSTACK_STORAGE_DEVICE_10000": "scsi lun[uuid: %s] 和 [uuid: %s] 没有共同的主機", + "ORG_ZSTACK_STORAGE_DEVICE_10001": "scsi 磁碟[uuid: %s]处於禁用状态", + "ORG_ZSTACK_ALIYUN_NETWORK_VPN_10000": "VPN网關和用戶网關不在同一個數据中心!", + "ORG_ZSTACK_IPSEC_VYOS_10016": "創建IPsec到HA路由失敗,因为 %s", + "ORG_ZSTACK_IPSEC_VYOS_10015": "刪除IPsec从HA组失敗因为 %s", + "ORG_ZSTACK_COMPUTE_BONDING_10001": "接口[%s]已在主機[%s]上創建", + "ORG_ZSTACK_COMPUTE_BONDING_10008": "綁定卡不能在主機[%s]上的bond中包含速度不同的接口。", + "ORG_ZSTACK_COMPUTE_BONDING_10007": "不能在已进行SRIOV虚拟化的綁定中包含接口[%s]。", + "ORG_ZSTACK_COMPUTE_BONDING_10006": "不能在一個已被用作网络桥接的綁定中包含接口,該綁定已经被主機[%s]使用。", + "ORG_ZSTACK_COMPUTE_BONDING_10005": "不能在bond中占用已由主機[%s]使用的接口。", + "ORG_ZSTACK_IPSEC_VYOS_10012": "更新IPsec版本失敗,因为:VPC[%s] 不儲在", + "ORG_ZSTACK_COMPUTE_BONDING_10009": "主機[uuid:%s]上不儲在从属接口", + "ORG_ZSTACK_IPSEC_VYOS_10013": "同步到HA组失敗,因为:%s", + "ORG_ZSTACK_MEVOCO_10105": "非管理員帳號無法設置读寫 %s 限制大於: %s/%s", + "ORG_ZSTACK_SIMULATOR_10002": "設置为斷開連接", + "ORG_ZSTACK_MEVOCO_10104": "非管理員帳號無法将寫 %s 限制設为無限。", + "ORG_ZSTACK_MEVOCO_10103": "非管理員帳戶無法将读取限制設置为無限。", + "ORG_ZSTACK_MEVOCO_10102": "非管理員帳戶仅允許設置读寫 %s 限制。", + "ORG_ZSTACK_MEVOCO_10109": "vm [%s] 的 HostUuid 为空,無法同步卷 qos", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_FISEC_10016": "FiSecClientFactory 测試連接失敗", + "ORG_ZSTACK_MEVOCO_10108": "vm [%s] 的状态必須为運行中或暫停才能同步卷 qos", + "ORG_ZSTACK_MEVOCO_10107": "卷 [%s] 没有附加到任何 VM(或 VM 不儲在),無法同步卷 QoS", + "ORG_ZSTACK_SIMULATOR_10004": "故意", + "ORG_ZSTACK_MEVOCO_10106": "卷 [%s] 没有附加到任何 VM,無法通過 forceSync 獲取 QoS", + "ORG_ZSTACK_MEVOCO_10101": "非管理員帳號無法設置总 %s 限制大於: %s", + "ORG_ZSTACK_MEVOCO_10100": "非管理員帳號無法将总%s限制設为無限。", + "ORG_ZSTACK_COMPUTE_BONDING_10011": "無法綁定与配置了VTEP IP的接口对接", + "ORG_ZSTACK_COMPUTE_BONDING_10010": "無法綁定与管理网络对应的接口。", + "ORG_ZSTACK_COMPUTE_BONDING_10015": "綁定卡不能包含已sriov虚拟化的接口[%s]", + "ORG_ZSTACK_COMPUTE_BONDING_10014": "綁定卡不能使用已被用作网络桥接的接口,該接口已经被宿主機[%s]使用", + "ORG_ZSTACK_COMPUTE_BONDING_10013": "綁定卡不能包含已被主機[%s]占用的接口", + "ORG_ZSTACK_COMPUTE_BONDING_10012": "不能在一個不在同一主機上的[%s]的綁定中包含接口。", + "ORG_ZSTACK_COMPUTE_BONDING_10019": "[%s] �onding 不可以包含 [%s] 接口,它必須是 1 到 2 之間的數字", + "ORG_ZSTACK_COMPUTE_BONDING_10018": "[%s] 汀綁定卡不能包含 [%s] 接口,它必須在 [1~8] 之間", + "ORG_ZSTACK_COMPUTE_BONDING_10017": "[%s] 汇聚网卡無法指定 [%s],仅支持 802.3ad 模式指定不同的 xmit_hash_policy", + "ORG_ZSTACK_COMPUTE_BONDING_10016": "綁定卡不能包含不同速度的接口,这在主機[%s]上儲在", + "ORG_ZSTACK_MEVOCO_10113": "卷[uuid:%s] 使用了与原生AIO不兼容的vhost协议。請禁用aio.native或使用不同的卷协议", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10003": "检测秘密資源池[uuid: %s]的連接失敗", + "ORG_ZSTACK_MEVOCO_10112": "當前版本的許可證不支持修改此全局配置 [名称:%s]", + "ORG_ZSTACK_MEVOCO_10111": "失敗从虚拟機实例:[\\n%s] 解除綁定共享磁碟", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10005": "%s 客戶端初始化失敗:secretResourcePool 属性無效。", + "ORG_ZSTACK_MEVOCO_10110": "detach 共享磁碟[uuid:%s] 从 VmInstance[uuid:%s] 失敗", + "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10006": "插件(UUID: %s)無法被刪除,因为它与以下密钥資源池相關聯:[%s]。", + "ORG_ZSTACK_MEDIATOR_10005": "該 VIP[%s] 已经綁定到了其他服務[%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10007": "组织ID[uuid:%s]已经具有操作属性,無法添加%s", + "ORG_ZSTACK_MEDIATOR_10006": "當前端口范围[%s, %s]与VIP[uuid: %s]的协议:%s系統統服務端口范围[%s, %s]冲突", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10008": "無法找到區[uuid:%s]", + "ORG_ZSTACK_MEDIATOR_10007": "當前端口范围[%s, %s]与VIP[uuid: %s]的协议:%s使用的端口范围[%s, %s]冲突", + "ORG_ZSTACK_COMPUTE_VM_10080": "vm[uuid:%s] CD-ROM 設备ID重复", + "ORG_ZSTACK_COMPUTE_VM_10077": "VM[uuid:%s] 已挂载 ISO[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10074": "预留内儲[%s]大於内儲大小[%s]", + "ORG_ZSTACK_COMPUTE_VM_10073": "意外的CPU/内儲設置", + "ORG_ZSTACK_COMPUTE_VM_10071": "未能找到虚拟機[uuid=%s]的宿主機", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10000": "虚拟ID[uuid:%s] 已经具有与管理員相關的属性,無法添加 %s", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10000": "身份區域[%s]已儲在,uuid是:%s", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10001": "regionId: [%s] 不是阿里雲和ZStack定义的有效區域,請選擇其他區域", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10002": "類型 [%s] 不匹配數据中心類型 [%s]", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10003": "项目[uuid:%s]已经有一個项目管理員", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10003": "Either dataCenterUuid 或 regionId 应該被設置,請检查參數。", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10004": "项目[uuid:%s]不儲在", + "ORG_ZSTACK_HYBRID_IDENTITYZONE_10004": "身份區 [%s] 仍在同步過程中,請等待。", + "ORG_ZSTACK_COMPUTE_VM_10079": "在 L3 网络 [%s] 中没有可用的 ipRange", + "ORG_ZSTACK_IAM2_ATTRIBUTE_VIRTUALID_10005": "虚拟ID[UUID:%s]已经具有项目操作員属性", + "ORG_ZSTACK_COMPUTE_VM_10078": "所有 vm[uuid:%s] 的 CD-ROM 已挂载 ISO 文件", + "ORG_ZSTACK_COMPUTE_VM_10090": "失敗Instantiate卷。因为vm的主機[uuid:%s]和分配的主要儲儲[uuid:%s]未連接。", + "ORG_ZSTACK_COMPUTE_VM_10088": "vm 當前状态[%s],修改virtio 需要vm 状态为[%s]", + "ORG_ZSTACK_COMPUTE_VM_10084": "無法在任何連接的备份儲儲中找到 ISO[uuid:%s],該备份儲儲已連接至zone[uuid:%s]。請检查以下内容:\n1. 备份儲儲是否已連接至虚拟機[name: %s, uuid:%s]運行所在的zone\n2. 如果备份儲儲处於斷開状态,請嘗試重新連接", + "ORG_ZSTACK_COMPUTE_VM_10083": "指定的主要儲儲中没有任何一個是可用的%s", + "ORG_ZSTACK_COMPUTE_VM_10081": "創建依赖於镜像缓儲[uuid:%s, 位置ps uuids: [%s]], 無法在其他地方創建。", + "ORG_ZSTACK_KVM_HYPERVISOR_10000": "失敗收叢主機虚拟化信息", + "ORG_ZSTACK_COMPUTE_VM_10099": "無法切换到L3网络。L3网络[uuid:%s]属於尚未綁定任何叢叢的L2网络[uuids:%s]", + "ORG_ZSTACK_COMPUTE_VM_10098": "無法切换到L3网络。L3网络[uuid:%s]属於不同的L2网络[uuids:%s]", + "ORG_ZSTACK_COMPUTE_VM_10097": "無法切换到 L3 网络。L3 网络[uuid:%s]没有IP地址范围", + "ORG_ZSTACK_COMPUTE_VM_10096": "無法切换到L3网络。該虚拟機[uuid: %s]未处於運行或停止状态;當前状态为%s", + "ORG_ZSTACK_COMPUTE_VM_10094": "無法切换到L3网络,L3的l2[uuid:%s, %s]使用了不同的vswitch", + "ORG_ZSTACK_COMPUTE_VM_10093": "要么設置 l3NetworkUuids 列表,要么設置 backupStorageUuid 是必須的", + "ORG_ZSTACK_COMPUTE_VM_10092": "無法为处於非運行状态的虚拟機[uuid:%s]截取控制台屏幕截圖", + "ORG_ZSTACK_MEDIATOR_10002": "無法附加 L3 网络。要附加的 L3[%s] 的 cidr 与已附加到 VM 上的 L3[%s] 儲在重叠", + "ORG_ZSTACK_MEDIATOR_10003": "該虚拟機[name:%s, uuid:%s]已经儲在一些端口转發規则%s", + "ORG_ZSTACK_MEDIATOR_10004": "該虚拟機[name:%s, uuid:%s]已经綁定了某些弹性IP%s", + "ORG_ZSTACK_COMPUTE_VM_10033": "由於默認l3Uuids[%s]的大小不是1,因此無法克隆VM", + "ORG_ZSTACK_COMPUTE_VM_10032": "因为状态[%s]無效,無法克隆VM", + "ORG_ZSTACK_COMPUTE_VM_10031": "因为驱動類型[%s]無效,無法克隆VM", + "ORG_ZSTACK_COMPUTE_VM_10030": "因为虚拟機网卡類型[%s]無效,無法克隆虚拟機", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10002": "發现相關垃圾路径(%s)在主儲儲[%s]中与迁移安装路径[%s]有關。如果您坚持要迁移卷[%s],請先通過'APICleanUpTrashOnPrimaryStorageMsg'清理它们。", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10000": "無法找到任何可用的主機執行儲儲迁移操作", + "ORG_ZSTACK_COMPUTE_VM_10039": "該操作仅允許对用戶VM執行", + "ORG_ZSTACK_STORAGE_MIGRATION_PRIMARY_NFS_10003": "卷[uuid:%s]具有image[uuid:%s]依赖關系統,其他依赖image[%s]", + "ORG_ZSTACK_COMPUTE_VM_10038": "The nic [%s%s] is not mounted on the VM 的翻译結果为:\n\n网络接口卡 [%s%s] 没有挂载在虚拟機上", + "ORG_ZSTACK_COMPUTE_VM_10037": "在主儲儲[uuid: %s]上没有足够的容量进行VM克隆到VM[uuid: %s],卷[uuid: %s]所需容量为%s字節,當前可用容量为%s字節", + "ORG_ZSTACK_COMPUTE_VM_10036": "快速創建虚拟機仅支持克隆原始虚拟機[uuid: %s]的數据磁碟到相同的主儲儲[uuid: %s]上", + "ORG_ZSTACK_COMPUTE_VM_10035": "快速創建虚拟機仅支持克隆原始虚拟機[uuid: %s]的根卷至相同的主儲儲[uuid: %s]上", + "ORG_ZSTACK_COMPUTE_VM_10034": "該操作仅允許对用戶VM執行", + "ORG_ZSTACK_COMPUTE_CLUSTER_10005": "如果叢叢類型是裸金属,则hypervisorType也必須是裸金属,反之亦然", + "ORG_ZSTACK_COMPUTE_CLUSTER_10008": "叢叢[uuid:%s]中儲在处於预维护状态的主機,當前無法更新叢叢操作系統統", + "ORG_ZSTACK_COMPUTE_CLUSTER_10009": "不在叢叢[uuid:%s]中的所有主機都处於連接状态,無法當前更新叢叢操作系統統權限", + "ORG_ZSTACK_COMPUTE_CLUSTER_10006": "只有 KVM 主機的操作系統統可以被更新,目前如此", + "ORG_ZSTACK_COMPUTE_CLUSTER_10007": "主機[uuid: %s] 不属於該叢叢[uuid: %s]。請驗證主機的 uuid,並確保它属於此叢叢。", + "ORG_ZSTACK_COMPUTE_VM_10044": "不要在VM未停止时更改镜像", + "ORG_ZSTACK_COMPUTE_VM_10043": "用戶無權限更改虚拟機 %s 的镜像", + "ORG_ZSTACK_COMPUTE_VM_10042": "干净流量不支持虚拟機類型 [%s]", + "ORG_ZSTACK_COMPUTE_VM_10041": "重复的 MAC 地址 [%s]", + "ORG_ZSTACK_COMPUTE_CLUSTER_10000": "内儲访问在叢叢[uuid:%s]禁用大页後不应共享。請先通過UpdateResourceConfig[category=%s name=%s value=%s resourceUuid=%s]啟用大页。", + "ORG_ZSTACK_COMPUTE_VM_10040": "該操作仅在虚拟機 [%s] 处於停止状态时允許", + "ORG_ZSTACK_COMPUTE_CLUSTER_10001": "如果叢叢[uuid:%s]中的内儲访问模式为共享,则不应禁用大页。請先通過UpdateResourceConfig[category=%s name=%s value=%s resourceUuid=%s]更新内儲访问模式。", + "ORG_ZSTACK_COMPUTE_VM_10049": "要么設置UUID,要么設置帳號,要么設置密碼", + "ORG_ZSTACK_COMPUTE_VM_10048": "实例[uuid:%s]無法更改镜像为镜像[uuid:%s]", + "ORG_ZSTACK_COMPUTE_VM_10047": "vm[uuid:%s] 没有默認的三层网络,無法为其更改镜像", + "ORG_ZSTACK_COMPUTE_VM_10046": "請確保最後一個主機VM[uuid:%s]所在的節點是啟用状态並已連接。", + "ORG_ZSTACK_COMPUTE_VM_10045": "請確保主儲儲VM[uuid:%s]所在的節點已啟用並連接。", + "ORG_ZSTACK_IAM2_CONTAINER_10009": "失敗打開kube配置文件: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10007": "獲取授權项目失敗,因为内容为空", + "ORG_ZSTACK_COMPUTE_VM_10055": "uuids 參數必須属於 VmInstanceVO 或 HostVO", + "ORG_ZSTACK_IAM2_CONTAINER_10008": "失敗在路径: %s 未能找到 kube 配置文件", + "ORG_ZSTACK_COMPUTE_VM_10054": "nic id: %s 不儲在...", + "ORG_ZSTACK_IAM2_CONTAINER_10005": "獲取镜像標签失敗,因为镜像標签页面为空", + "ORG_ZSTACK_COMPUTE_VM_10053": "NIC 不能同时应用 QoS 与端口镜像服務。", + "ORG_ZSTACK_IAM2_CONTAINER_10006": "獲取镜像失敗,因为内容为空", + "ORG_ZSTACK_COMPUTE_VM_10052": "出站带宽和入站带宽必須至少設置一個。", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10008": "附加的访问组已经是: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10003": "失敗为项目[uuid: %s]設置容器叢叢", + "ORG_ZSTACK_COMPUTE_VM_10051": "监控编號必須为 1 或 2 或 4。", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10007": "nas 挂载目標 [%s] 已儲在於文件系統統: %s", + "ORG_ZSTACK_IAM2_CONTAINER_10004": "獲取镜像標签失敗,因为内容为空", + "ORG_ZSTACK_COMPUTE_VM_10050": "方向必須設置为 (入, 出) 中的其中一個,但实际值是 %s", + "ORG_ZSTACK_IAM2_CONTAINER_10001": "失敗更新容器 %s 的配額", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10009": "访问组規则 [%s] 已儲在於访问组 [%s] 中", + "ORG_ZSTACK_IAM2_CONTAINER_10002": "設置项目[uuid: %s]容器失敗,因为數据库中未找到該项目", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10003": "挂载域在%d毫秒後仍然無效,将其刪除...", + "ORG_ZSTACK_IAM2_CONTAINER_10000": "在容器端更新项目[uuid: %s]的配額时發生未知錯誤誤", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10006": "不儲在 NAS 访问组,請至少創建一個", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10005": "没有这样的挂载目標 [%s] 在 NAS: %s", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10000": "在區域:%s 中未找到文件系統統 [%s]", + "ORG_ZSTACK_COMPUTE_VM_10059": "没有找到帳戶偏好設置,請向主機發送更改密碼命令!", + "ORG_ZSTACK_COMPUTE_VM_10058": "不在目標主機數据库中找到记录,無法向主機發送修改密碼命令!", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10002": "某些主要儲儲 [%s] 被使用了 NAS,無法刪除直到先刪除主要儲儲。", + "ORG_ZSTACK_COMPUTE_VM_10057": "只有主機[UUID:%s]可以访问數据卷。", + "ORG_ZSTACK_COMPUTE_VM_10056": "資源[uuids:%s]不属於帳戶[uuid:%s]", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10001": "nas文件系統統在數据中心已儲在:%s", + "ORG_ZSTACK_COMPUTE_VM_10063": "密碼不符合數字、大小寫英文字母和特殊字符的组合要求", + "ORG_ZSTACK_COMPUTE_VM_10062": "密碼長度必須在 [%s-%s] 范围内", + "ORG_ZSTACK_COMPUTE_VM_10061": "磁碟不支持挂载。磁碟類型是 %s", + "ORG_ZSTACK_COMPUTE_VM_10060": "磁碟AO參數不正確。需要設置以下属性之一,並且只能設置其中一個:size、templateUuid、diskOfferingUuid、sourceUuid-sourceType", + "ORG_ZSTACK_ALIYUN_NAS_FILESYSTEM_10010": "访问组 [%s] 已经儲在於數据中心 [%s] 中", + "ORG_ZSTACK_COMPUTE_VM_10068": "在 L3 网络 [%s] 中没有可用的 nicType", + "ORG_ZSTACK_FAULTTOLERANCE_10015": "無法創建次要VM,因为主要VM已停止", + "ORG_ZSTACK_COMPUTE_SRIOV_10014": "無法将L3网络附加到VM,因为enableSRIOV和enableVFHA不能同时設置", + "ORG_ZSTACK_COMPUTE_SRIOV_10015": "無法将vf网卡類型更改为普通類型", + "ORG_ZSTACK_FAULTTOLERANCE_10013": "另一個故障容忍的垃圾回收任務正在運行,請取消新的任務並等待返回", + "ORG_ZSTACK_COMPUTE_SRIOV_10016": "無法将NIC類型更改为VF類型", + "ORG_ZSTACK_COMPUTE_SRIOV_10017": "vm nic[uuid:%s] 不儲在", + "ORG_ZSTACK_FAULTTOLERANCE_10011": "缺少容錯誤虚拟機组", + "ORG_ZSTACK_FAULTTOLERANCE_10010": "無法迁移ft主VM[uuid:%s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10019": "仅支持 %s SRIOV", + "ORG_ZSTACK_MONITORING_MEDIA_10001": "無法連接到主機,端口: %s, %d。问題可能由不正確的smtpServer或smtpPort引起", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10038": "条件体不支持json null或數组!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10037": "仅支持在“Condition”字段中使用 ZStack 模板函數!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10036": "值必須为布尔型在'条件'字段中", + "ORG_ZSTACK_MONITORING_MEDIA_10000": "问題可能是由錯誤誤的用戶名或密碼或电子郵件權限被拒绝引起的", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10035": "条件键: %s 只支持值的 json 对象中包含 1 個元素,但得到 %d 個元素!", + "ORG_ZSTACK_FAULTTOLERANCE_10019": "無法切换主VM。主要VM未知但不儲在故障转移网络地址", + "ORG_ZSTACK_FAULTTOLERANCE_10018": "pvm[uuid:%s] 不儲在", + "ORG_ZSTACK_FAULTTOLERANCE_10017": "無法切换至虚拟機[uuid:%s]。相關的容錯誤虚拟機组不儲在", + "ORG_ZSTACK_COMPUTE_SRIOV_10012": "vm nic[uuid:%s] 已经是類型 %s,無需更改", + "ORG_ZSTACK_FAULTTOLERANCE_10016": "創建的 SVM 已找到,報告此啟動次要 VM 請求的錯誤誤", + "ORG_ZSTACK_COMPUTE_SRIOV_10013": "只在虚拟機停止时更改 VM 网卡類型", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10009": "双因素認證失敗,因为消息系統統標签中没有令牌", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10008": "双因素認證失敗,因为消息中不儲在系統統標签", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10004": "双因素認證未啟用", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10001": "不支持的帳戶類型:%s", + "ORG_ZSTACK_FAULTTOLERANCE_10026": "非容錯誤虚拟機端口未找到", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10011": "失敗驗證两步驗證代碼", + "ORG_ZSTACK_DAHO_CORE_10003": "創建 Daho vll 任務失敗!", + "ORG_ZSTACK_TWOFACTORAUTHENTICATION_10010": "双因素認證失敗,因为没有为 %s:%s 設置密钥", + "ORG_ZSTACK_FAULTTOLERANCE_10024": "無法啟動secondary VM,因为primary VM已停止", + "ORG_ZSTACK_DAHO_CORE_10004": "未找到与 accountUuid: %s 对应的阿里雲帳號", + "ORG_ZSTACK_FAULTTOLERANCE_10022": "無法从當前FT网络找到可用的IP地址。請检查全局配置[類别:FT名称:故障容錯誤网络.CIDR]是否正確設置,並確認主機[uuid:%s]的IP地址在CIDR范围内。", + "ORG_ZSTACK_FAULTTOLERANCE_10021": "意外异常", + "ORG_ZSTACK_DAHO_CORE_10007": "過期策略:%s 無效", + "ORG_ZSTACK_FAULTTOLERANCE_10020": "無法切换主機组。备用虚拟機未知且無故障容忍网络地址可用", + "ORG_ZSTACK_DAHO_CORE_10008": "vlanId[%s] 已经儲在!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10026": "CfnRootDecoder 的權重必須在 0-100 之間,0 表示优先解碼,默認值为 50", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10025": "參數 root body 必須是 json 对象!", + "ORG_ZSTACK_COMPUTE_SRIOV_10020": "%s 不支持 sriov", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10024": "類型对於參數是必需的,但在 %s 中未找到", + "ORG_ZSTACK_COMPUTE_SRIOV_10021": "enableSRIOV 標签不支持的虚拟機類型 [%s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10022": "在将虚拟機[uuid:%s]迁移到宿主機[uuid:%s]之前预处理vf网卡失敗", + "ORG_ZSTACK_FAULTTOLERANCE_10028": "分配的端口數量少於nic[uuid: %s]在主機[uuid: %s]上請求的數量", + "ORG_ZSTACK_COMPUTE_SRIOV_10023": "迁移虚拟機[uuid:%s]到主機[uuid:%s]後,vf nic後处理失敗", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10029": "映像射值体不支持json數组!", + "ORG_ZSTACK_FAULTTOLERANCE_10027": "未能为主機[uuid: %s]的网卡[nic uuid: %s]分配端口", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10028": "無法找到此類消息:%s 用於創建", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10030": "映像射值体不支持 null!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10031": "mappingName 必須在結果中找到,否则無效的 cfn json。", + "ORG_ZSTACK_FAULTTOLERANCE_10037": "無法切换虚機[uuid:%s],因为容錯誤虚機组不在[%s, %s]状态", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10005": "無法附加 L2VirtualSwitchNetwork,因为叢叢[uuid:%s]中没有主機", + "ORG_ZSTACK_FAULTTOLERANCE_10036": "無法切换虚機[uuid:%s],請確認这是否为容錯誤虚機组", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10006": "無法附加 L2VirtualSwitchNetwork,因为接口[%s]应在主機[uuid:%s]上創建", + "ORG_ZSTACK_FAULTTOLERANCE_10035": "無法切换虚機[uuid:%s],請在GlobalConfig中啟用故障转移功能", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10007": "無法在虚拟交换機[uuid:%s]上創建L3网络", + "ORG_ZSTACK_FAULTTOLERANCE_10034": "無法刪除L3网络[uuid:%s]。容錯誤VM[%s]处於状态[%s, %s]中仍使用該网络。在刪除L3网络之前,請停止相關容錯誤VM。", + "ORG_ZSTACK_FAULTTOLERANCE_10033": "圖像[uuid:%s]仍然被容錯誤虚拟機[fault tolerance vm uuid:%s]使用", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10004": "無法找到任何連接的主機来執行此操作,似乎与共享块组儲儲[uuid:%s]關聯的所有KVM主機均已斷開連接。", + "ORG_ZSTACK_FAULTTOLERANCE_10032": "具有索引:%d 的卷,以及 pvm[uuid:%s] 和 svm[uuid:%s] 的缓儲卷大小不同,不允許啟動", + "ORG_ZSTACK_FAULTTOLERANCE_10031": "卷索引为:%d 的 pvm[uuid:%s] 和 svm[uuid:%s] 有不同的大小,不允許啟動", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10003": "無法創建 L2PortGroupNetwork,因为具有相同 vlanId[%s] 的 L2PortGroupNetwork 已儲在於 L2VirtualSwitchNetwork[uuid:%s] 中", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10002": "KVM 主機,其中的卷[uuid%s]已与共享块组儲儲[uuid:%s]斷開連接", + "ORG_ZSTACK_FAULTTOLERANCE_10030": "pvm[uuid:%s] 和 svm[uuid:%s] 的卷數量不匹配,不允許啟動", + "ORG_ZSTACK_NETWORK_L2_VIRTUALSWITCH_10004": "無法附加 L2 虚拟交换機网络,因为叢叢[uuid:%s]中的接口[%s]已被另一個 L2 虚拟交换機网络使用", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10001": "無法找到需要操作的共享块组主儲儲卷", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10002": "没有配置用於VyOS DHCP的虚拟路由器", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10006": "共享卷不支持薄分配", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10001": "無法将 DHCP 入项添加到虚拟路由器 VM[uuid:%s ip:%s],因为 %s,DHCP 入项[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10039": "當前操作[api:%s]在ft vm[uuid:%s, state:%s]未停止时不受支持", + "ORG_ZSTACK_FAULTTOLERANCE_10038": "無法维护主機,因为 ft vms[%s] 处於恢复中", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10011": "vm[uuid:%s] 没有運行、暫停或停止,當前状态[%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10048": "無法更新 ft vm[uuid:%s] 的平台,需要停止两個虚拟機", + "ORG_ZSTACK_FAULTTOLERANCE_10047": "無法更新 ft vm[uuid:%s] 的内儲大小,需要停止两個虚拟機", + "ORG_ZSTACK_FAULTTOLERANCE_10046": "無法更新 ft vm[uuid:%s] 的 cpu 數量,需要停止两個 vms", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10005": "L2网络不应与已連接到叢叢的分配网络具有相同的接口名称", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10004": "請勿将主機添加到裸金属2叢叢中", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10015": "該镜像[uuid: %s, 名称:%s]在任何备份儲儲中未找到", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10003": "創建新的裸金属2叢叢时,必須設置架构", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10014": "镜像[uuid:%s, name: %s]在任何备份儲儲上都無法下载:\n1. 检查镜像是否处於已刪除状态\n2. 检查显示为就绪的备份儲儲是否已連接到區域[uuid:%s]", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10002": "叢叢類型和hypervisor類型应該全部为baremetal2或全部不为baremetal2", + "ORG_ZSTACK_FAULTTOLERANCE_10042": "無法将vm級别設置为%s,請在GlobalConfig中啟用ft", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10013": "不支持在线合並共享卷[uuid: %s]的快照", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10001": "無法将本地儲儲附加到baremetal2叢叢。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10012": "該卷[UUID:%s]已挂载至处於状态%s的VM[UUID:%s]上,無法執行快照合並操作", + "ORG_ZSTACK_BAREMETAL2_CLUSTER_10000": "無法将带有令牌的第三方ceph附件添加到aarch64叢叢中。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10017": "主機[uuid:%s]拥有共享块的磁碟uuid,但实际儲儲不同。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10016": "在叢叢[uuid:%s]中未找到連接的主機", + "ORG_ZSTACK_FAULTTOLERANCE_10049": "當前操作不支持在ft组虚機[uuid:%s]上執行", + "ORG_ZSTACK_BAREMETAL_NETWORK_10004": "MAC地址 %s 已经是bond从設备", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DHCP_10000": "無法编程由虚拟路由器[uuid:%s, ip:%s]提供的dhcp条目,%s", + "ORG_ZSTACK_BAREMETAL_NETWORK_10003": "MAC地址 %s 不属於機箱[UUID:%s]", + "ORG_ZSTACK_BAREMETAL_NETWORK_10002": "从節點地址 %s 是無效的。它应該類似於 6c:b3:11:1b:0b:1e,6c:b3:11:1b:0b:1f", + "ORG_ZSTACK_BAREMETAL_NETWORK_10001": "bond 名称 %s 已经儲在", + "ORG_ZSTACK_BAREMETAL_NETWORK_10000": "創建裸金属綁定仅允許在創建裸金属实例之前进行", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10022": "無法找到备份儲儲[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10058": "不允許相同的 MAC 地址 [%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10021": "预期状态是 %s,當前状态是", + "ORG_ZSTACK_FAULTTOLERANCE_10057": "弹性网络未設置", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10020": "不支持将薄卷转换为厚卷", + "ORG_ZSTACK_FAULTTOLERANCE_10056": "失敗創建FT VM,請在GlobalConfig中啟用FT", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10001": "無法找到弹性公网IP:%s 在vmNic IP中:%s", + "ORG_ZSTACK_FAULTTOLERANCE_10055": "無法迁移FT次要VM", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10002": "弹性公网IP [uuid:%s] 已刪除", + "ORG_ZSTACK_FAULTTOLERANCE_10054": "無法迁移FT主VM", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10025": "QCow2 共享卷[uuid:%s] 不受支持", + "ORG_ZSTACK_FAULTTOLERANCE_10053": "當前操作不支持次要VM[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10024": "VM[uuid:%s] 从不同的主儲儲拥有多個 ISO 文件: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10029": "仅支持全量", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10027": "無法在共享块组主儲儲[uuid: %s]上找到可用主機来为卷[uuid: %s]創建快照", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10005": "Either eipUuid 或者 vipUuid 必須設置", + "ORG_ZSTACK_FAULTTOLERANCE_10051": "當前操作不支持在副VM[UUID:%s]上執行", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10006": "弹性公网IP[UUID:%s] 不处於啟用状态,無法獲取可綁定的VM网卡", + "ORG_ZSTACK_FAULTTOLERANCE_10050": "當前操作不支持在 ft 主機[uuid:%s]上執行", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10003": "無法将L3网络[uuid:%s, name:%s]綁定到虚拟機[uuid:%s, name:%s],因为該L3网络已为其中一個虚拟機的网卡提供EIP", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10004": "vmNic[uuid:%s] 没有綁定到 vmInstance,無法獲取可綁定的弹性IP地址", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10009": "弹性公网IP[UUID: %s]只能在状态为%s时綁定,當前状态是%s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10007": "ip [uuid:%s] 已連接至vm网卡[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10008": "弹性公网IP[UUID:%s]已綁定到另一個虚拟機的网络接口[NIC UUID:%s],無法再次綁定", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10033": "無法找到任何連接的主機来執行此操作,似乎与共享块组儲儲[uuid:%s]關聯的所有KVM主機均已斷開連接", + "ORG_ZSTACK_FAULTTOLERANCE_10069": "叢叢[uuid:%s] 已指定但处於禁用状态,無法从其創建虚拟機", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10032": "無法找到同时連接到主儲儲[uuid: %s]和主儲儲[uuid: %s]的主機", + "ORG_ZSTACK_FAULTTOLERANCE_10068": "zone[uuid:%s] 指定了但它是禁用的,無法从它創建虚拟機", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10031": "無法在共享块组主儲儲[uuid: %s]和[uuid: %s]中找到可用的主機来迁移卷[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10030": "無法找到可用的目標主機以迁移卷[uuid: %s],該卷位於共享块组主儲儲[uuid: %s]与[uuid: %s]之間", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10037": "無法縮小快照 %s,因为虚拟機 %s 不处於運行中/停止状态", + "ORG_ZSTACK_FAULTTOLERANCE_10065": "不能在l3Network中添加相同的uuid,uuid: %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10035": "無法縮小快照 %s,因为卷 %s 不可用", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10038": "在快照中獲取虚拟機 %s 的安装路径为空", + "ORG_ZSTACK_ALIYUN_BACKUP_10000": "未找到备份桶", + "ORG_ZSTACK_FAULTTOLERANCE_10062": "[image[uuid:%s] 的格式为:%s,仅可使用%s創建vm]", + "ORG_ZSTACK_FAULTTOLERANCE_10061": "圖像[uuid:%s]的mediaType为:%s,仅根磁碟模板可以用於創建VM", + "ORG_ZSTACK_TICKET_IAM2_API_10004": "一种票類型只能有一個匹配流程叢合", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10044": "未找到連接的主機以从主儲儲[uuid:%s]拉取快照,用於卷[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10020": "vip[uuid:%s] 不在状态[%s]中,當前状态是%s", + "ORG_ZSTACK_SNS_PLATFORM_MICROSOFTTEAMS_10000": "發送消息到 Microsoft Teams 失敗。状态: %s, 内容: %s", + "ORG_ZSTACK_TICKET_IAM2_API_10003": "創建一個流程时需要命名", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10043": "未找到連接的主機来在主要儲儲[uuid:%s]上提交快照,针对卷[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10079": "無法啟動 VM[uuid:%s]。它没有綁定任何网卡,請綁定一個网卡後再試一次", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10042": "激活安装路径 %s 失敗,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10041": "活跃子快照失敗,因为 %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10023": "vmNic uuid[%s] 不允許添加弹性IP,因为該vmNic儲在与允許访问規则相關的端口转發設置", + "ORG_ZSTACK_FAULTTOLERANCE_10077": "當前 ft vm 处於未知状态,無法停止它,請嘗試手動进行故障转移", + "ORG_ZSTACK_TICKET_IAM2_API_10008": "名称不能为 null", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10048": "無效的 thinProvisioningInitializeSize 標签[%s]", + "ORG_ZSTACK_TICKET_IAM2_API_10007": "錯誤誤審批人標題 %s,有效值为 %s", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10021": "Guest L3网络和VIP L3网络的uuid:%s 和 uuid:%s 是相同的网络", + "ORG_ZSTACK_TICKET_IAM2_API_10006": "創建流叢合至少需要一個流", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10022": "vm状态[%s]不允許操作弹性公网IP,可能是您应該等待虚拟機流程完成", + "ORG_ZSTACK_TICKET_IAM2_API_10005": "管理員或iam2操作是最後流程的審批者所需的操作", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10045": "deactive installPath 失敗,因为 %s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10049": "無效的thinProvisioningInitializeSize[%s],它必須大於或等於%s", + "ORG_ZSTACK_FAULTTOLERANCE_10073": "默認L3网络UUID[uuid:%s]不在l3NetworkUuids%s中", + "ORG_ZSTACK_FAULTTOLERANCE_10071": "主機[uuid:%s]已被指定,但其連接状态为%s,無法从其創建虚拟機", + "ORG_ZSTACK_FAULTTOLERANCE_10070": "主機[uuid:%s]被指定但已被禁用,無法从中創建虚拟機", + "ORG_ZSTACK_TICKET_IAM2_API_10009": "審批人UUID不能为空", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10051": "無效的thinProvisioningInitializeSize[%s]大於%d", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10050": "無效的thinProvisioningInitializeSize[%s],它不是一個數字", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10055": "該主機[uuid: %s]運行的环境無法調整共享块组主儲儲[uuid: %s]上卷[uuid: %s]的大小", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10054": "無法找到具有連接共享块的主機以執行共享块组主儲儲[uuid:%s]的相關命令", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10053": "無法找到可用主機来執行命令以執行共享块组主儲儲[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10052": "[%s]不是2的幂次", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10012": "IP地址 [uuid:%s] 不属於网卡 [uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10059": "無法找到任何附加在共享块组主儲儲[uuid: %S]上的叢叢", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10058": "共享挂载點主儲儲[uuid:%s, name:%s]無法在附加的叢叢中找到任何可用主機以实例化卷", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10013": "eip[uuid:%s] 没有綁定到任何虚機网卡", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10010": "vm nic[uuid:%s] 没有与 eip[uuid:%s] 兼容的 usedIp", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10057": "卷[uuid:%s]未找到", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10011": "Guest L3网络和EIP的VIP L3网络[uuid:%s]相同[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10056": "主要儲儲[uuid:%s]未找到", + "ORG_ZSTACK_TICKET_IAM2_API_10011": "虚拟ID[UUID:%s]不属於项目[UUID:%s]", + "ORG_ZSTACK_TICKET_IAM2_API_10010": "無法找到IAM2VirtualIDVO[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10017": "弹性IP即将綁定的VM[UUID:%s]已经位於VIP[UUID:%s, 名称:%s, IP:%s]所属的公共网络[UUID:%s]上", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10014": "vip ipVersion [%d] 与 guestIp ipVersion [%d] 不同。", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10015": "VIP[%s]处於来宾IP范围[%s, %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10062": "共享块的主儲儲[uuid:%s, name:%s]未附加到任何叢叢,或附加叢叢中的主機未連接", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10018": "vip[uuid:%s] 被其他网络服務实体[%s]占用", + "ORG_ZSTACK_NETWORK_SERVICE_EIP_10019": "EIP 無法創建在系統統 VIP 上", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10047": "獲取圖像哈希失敗,因为:%s", + "ORG_ZSTACK_SNS_PLATFORM_FEISHU_10000": "失敗向飞书發送消息。状态: %s, 内容: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10042": "imagestoreBackupStorage 剂量的 uuid 發生变化[预期:%s,实际:%s],最有可能是該剂量手動重啟了。請發起重新連接以同步状态", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10000": "失敗獲取扎库叢叢,錯誤誤: %s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10002": "失敗獲取扎库叢叢[id:%s],錯誤誤:%s", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10001": "獲取扎库叢叢失敗,响应内容为空", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10000": "無法找到对应项目 %s 的安全组配額", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10004": "从响应中提取操作ID失敗", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10003": "獲取扎库叢叢[id:%s]失敗,响应内容为空", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10006": "解析响应失敗: %s", + "ORG_ZSTACK_SNS_10015": "platformUuid 和 endpointUuid 不能同时为空", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10001": "安全组配額不能小於1", + "ORG_ZSTACK_IAM2_CONTAINER_ZAKU_10005": "异步操作在 %d 秒後超时", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10004": "在標签中的 l3Uuid[%s] 与參數中的 l3Uuid[%s] 不一致", + "ORG_ZSTACK_SNS_10013": "密碼不能为空", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10003": "系統統標签請求。需要通過系統統標签 L3_NETWORK_SECURITY_GROUP_UUIDS_REF 指定 VM NIC 的默認安全组,格式为 l3::{%s}::SecurityGroupUuids::{%s},因为强制安全组已啟用", + "ORG_ZSTACK_SNS_10012": "用戶名不能为空", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10006": "自从强制安全组功能啟用後,標签中的 securityGroupUuid 必須属於项目[%s]", + "ORG_ZSTACK_SNS_10011": "smtpPort 不能为 null", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10005": "安全组[uuid:%s]的所有者[uuid:%s]属於另一個IAM2项目", + "ORG_ZSTACK_SNS_10010": "smtpServer 不能为 null", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10008": "默認的安全组 %s 在啟用强制安全组功能时無法被刪除", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10007": "在 l3Network[uuid:%s] 上的 nics 与安全组關聯。在从安全组解綁 l3Network 之前,您需要先从安全组解綁 nics。", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10039": "商用許可是使用ImageStore所需的許可證類型", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10009": "这個安全组 %s 已綁定至虚拟機,請先解綁後再試", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10035": "圖像儲儲[%s]無法添加圖像,因为其用於远程备份", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10032": "备份儲儲[uuid:%s]没有足够的容量[%s]导出", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10002": "虚拟路由器[name: %s, uuid: %s]同步snat%s失敗, %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10031": "圖像[%s]未在备份儲儲[%s]中找到", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_NAT_10001": "租戶l3网络[uuid:%s, name:%s]需要虚拟路由器提供的SNAT服務,但虚拟路由器提供者[uuid: %s, name:%s]的公共l3网络[uuid:%s]与該租戶l3网络相同", + "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10020": "notifySugonSdn: 向目的地主機[uuid:%s]的虚拟路由器[%s]通知 sugon sdn 失敗,涉及虚拟機[uuid:%s],錯誤誤信息是:%s", + "ORG_ZSTACK_SNS_10029": "电话號碼 [%s] 已经儲在", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10011": "帳戶[%s]不允許操作默認安全组", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10010": "帳戶[%s]無法操作默認安全组[%s]", + "ORG_ZSTACK_SNS_10026": "無法将电子郵件地址更新为 %s,該地址已在端點[uuid:%s]中儲在", + "ORG_ZSTACK_IAM2_SECURITYGROUP_10012": "vm 的 nic[uuid:%s] 只有一個安全组,無法从安全组[uuid:%s] 中刪除該 nic", + "ORG_ZSTACK_SNS_10024": "不能将相同的电子郵件地址添加到終端點[uuid:%s]", + "ORG_ZSTACK_SNS_10023": "無法找到插件[%s]", + "ORG_ZSTACK_SNS_10022": "無法創建具有相同地址[%s:%s]的SNMP平台", + "ORG_ZSTACK_SNS_10021": "無法测試連接,因为所有參數均为 null", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10029": "未实现远程目標類型: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10028": "打包导出的镜像失敗,因为 %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10027": "某些圖片 [%s] 在备份儲儲[uuid: %s] 中未导出", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10026": "刪除镜像包失敗,因为: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10022": "設置镜像儲儲[uuid:%s]的最大容量失敗", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10021": "在設置圖像儲儲[uuid:%s]的最大容量时失敗,因为:%s", + "ORG_ZSTACK_SUGONSDNCONTROLLER_NETWORK_10019": "notifySugonSdn: 向目標主機[uuid:%s]的虚拟路由器[%s]通知sugon sdn失敗,涉及虚拟機[uuid:%s]", + "ORG_ZSTACK_SNS_10038": "無法創建 sns 郵件終端節點,未提供任何郵件地址", + "ORG_ZSTACK_SNS_10037": "用戶名和密碼必須同时全部不儲在或同时儲在", + "ORG_ZSTACK_SNS_10036": "無效的钉钉电话號碼[%s], 钉钉电话號碼格式应为+86-12388889999", + "ORG_ZSTACK_SNS_10035": "[%s] 不是一個合法的IP地址", + "ORG_ZSTACK_SNS_10034": "無效的 URL[%s]", + "ORG_ZSTACK_SNS_10031": "电话號碼 [%s] 一個或多個不儲在", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10018": "無响应", + "ORG_ZSTACK_SNS_10030": "电话號碼列表为空", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10016": "下载镜像[URL: %s]到备份儲儲[UUID: %s]时失敗,原因: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10015": "缺少證书文件用於下载镜像: %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10013": "無法連接到 SimpleHttpBackupStorage[url:%s],因为 %s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10010": "失敗獲取任務回复!", + "ORG_ZSTACK_EXTERNALSTORAGE_PRIMARY_10000": "創建依赖於镜像缓儲[uuid:%s, 位置url: [%s]],不能在其他地方創建。", + "ORG_ZSTACK_SNS_10045": "該操作对於系統統应用程序平台不允許執行", + "ORG_ZSTACK_SNS_10044": "無法驗證無任何电话號碼的通用短信", + "ORG_ZSTACK_SNS_10043": "用戶ID [%s] 已经儲在", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10008": "在主要儲儲 %s 上清理镜像元數据失敗,錯誤誤:%s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10007": "同步状态失敗。", + "ORG_ZSTACK_SNS_10041": "电话號碼[%s]已儲在", + "ORG_ZSTACK_SNS_10040": "無效的电子郵件地址[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10005": "無法在叢叢中找到与PS [uuid: %s] 連接的主機", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10004": "無法提交由 UUIDs:%s 指定的备份儲儲,因为:%s", + "ORG_ZSTACK_MONITORING_10004": "無法找到資源[type:uuid:%s]的類型", + "ORG_ZSTACK_MONITORING_10005": "在資源類型[%s]和项目[%s]中未找到监控项", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10002": "無法分配由 UUIDs:%s 指定的备份儲儲,因为:%s", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10000": "解析創建时間錯誤誤: %s", + "ORG_ZSTACK_MONITORING_10000": "無法找到监控触發器[uuid:%s],它可能已被刪除", + "ORG_ZSTACK_MONITORING_10001": "無法找到监控触發動作[uuid:%s],它可能已被刪除", + "ORG_ZSTACK_MONITORING_10002": "該資源[type:%s]没有任何监控项", + "ORG_ZSTACK_MONITORING_10003": "資源[uuid:%s]不属於帳戶[uuid:%s]", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10002": "实例[%s]不在组中", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10001": "該实例[%s]已儲在於該组中", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10003": "监控组[%s]未应用监控模板", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10006": "該组内的实例已達到最大限制", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10001": "輸出正文不支持json null!", + "ORG_ZSTACK_ZWATCH_MONITORGROUP_10005": "模板中的規则已達到最大限制", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10000": "只有函數可以在 Outputs 中被允許使用,但發现 %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10016": "資源類型必須是字符串!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10014": "映像射根主体必須是json对象!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10018": "資源根主体必須是json对象!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10023": "參數体不支持 null!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10022": "參數名不支持: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10020": "paramName 必須在結果中找到,否则無效的 cfn json。", + "ORG_ZSTACK_ZQL_AST_VISITORS_10001": "实体为空,無法獲取表名", + "ORG_ZSTACK_FAULTTOLERANCE_10004": "在主機[uuid: %s]上分配端口失敗", + "ORG_ZSTACK_ZQL_AST_VISITORS_10000": "連接条件缺失", + "ORG_ZSTACK_ZQL_AST_VISITORS_10003": "字段列表为空,無法獲取列名", + "ORG_ZSTACK_ZQL_AST_VISITORS_10002": "实体为空,無法獲取列名", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10005": "映像射体不支持非映像射值!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10004": "[%s] 在 Outputs 中無效!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10003": "輸出中的 Description 必須为字符串類型!", + "ORG_ZSTACK_FAULTTOLERANCE_10009": "無法迁移 ft 次級 VM[uuid:%s]", + "ORG_ZSTACK_FAULTTOLERANCE_10008": "無法啟動secondary VM,因为primary VM仍然处於停止状态", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10009": "資源值体不支持 null!", + "ORG_ZSTACK_ZQL_AST_VISITORS_10004": "函數不能为 null", + "ORG_ZSTACK_FAULTTOLERANCE_10007": "無法獲取主VM[uuid:%s]的hostUuid", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10008": "資源 %s 不能依赖自身,請检查 [%s] 中的 %s", + "ORG_ZSTACK_FAULTTOLERANCE_10005": "分配的端口數量少於主機[UUID: %s]上請求的數量", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10006": "映像射体不支持json null!", + "ORG_ZSTACK_SNS_10009": "uuid [%s] 已经儲在", + "ORG_ZSTACK_SNS_10007": "無法找到 SNSApplicationEndpoint[uuid:%s],它可能已被刪除", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10012": "不支持的键 [%s] 在 Resources [%s] 中", + "ORG_ZSTACK_SNS_10006": "無法找到 SNSApplicationPlatform[uuid:%s],它可能已被刪除", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10011": "資源名称必須在結果中找到,否则無效的 cfn json。", + "ORG_ZSTACK_SNS_10005": "無法找到endpointType", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_DECODER_10010": "不支持的 resourceKeys: %s", + "ORG_ZSTACK_SNS_10003": "無法找到 SNSTopic[uuid:%s],它可能已被刪除", + "ORG_ZSTACK_SNS_10002": "应用端點已禁用", + "ORG_ZSTACK_SNS_10001": "应用平台已禁用", + "ORG_ZSTACK_SNS_10000": "該主題未被任何端點订阅", + "ORG_ZSTACK_CLOUDFORMATION_10002": "無效的ZStack模板格式版本:[%s, 预期值:%s]", + "ORG_ZSTACK_CLOUDFORMATION_10001": "模板必須包含 [ZStackTemplateFormatVersion]", + "ORG_ZSTACK_CLOUDFORMATION_10000": "在模板内容中獲取空元素", + "ORG_ZSTACK_CLOUDFORMATION_10009": "模板 [%s] 選擇的選项已禁用", + "ORG_ZSTACK_CLOUDFORMATION_10008": "資源堆栈VO [%s] 已经被刪除!", + "ORG_ZSTACK_CLOUDFORMATION_10007": "資源堆栈VO: [%s] 已被刪除...", + "ORG_ZSTACK_CLOUDFORMATION_10005": "在 vmInstance[%s] 中未找到 stackUuid", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10035": "为所有候選宿主機预留主機容量失敗", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10034": "[主機分配]: 在主機[uuid:%s]上嘗試下一個。%s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10037": "過滤後,HostAllocatorFilterExtensionPoint[%s] 返回零個候選主機,这意味着:%s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10036": "没有找到具有 %s 的主機", + "ORG_ZSTACK_CLOUDFORMATION_10025": "期望 %s 状态!", + "ORG_ZSTACK_EXPON_10002": "指數請求失敗,代碼 %s,消息: %s。", + "ORG_ZSTACK_EXPON_10003": "無法找到复制快照後的卷[name:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10000": "虚拟路由器[name: %s, uuid: %s]配置dns%s失敗, %s", + "ORG_ZSTACK_CLOUDFORMATION_10022": "重啟資源堆栈仅支持 %s 状态!", + "ORG_ZSTACK_CLOUDFORMATION_10021": "無法找到这样的 ResourceStackVO 由 uuid [%s]", + "ORG_ZSTACK_CLOUDFORMATION_10020": "無法在虚拟機[%s]上找到默認IP地址", + "ORG_ZSTACK_CLOUDFORMATION_10028": "templateContent 和 url 不得同时为空或同时設置!", + "ORG_ZSTACK_CLOUDFORMATION_10026": "templateContent 和 templateUuid 不得同时为空!", + "ORG_ZSTACK_HYBRID_ACCOUNT_10000": "KeyType 不支持的類型 [%s]", + "ORG_ZSTACK_HYBRID_ACCOUNT_10002": "键: [%s] 与類型: [%s] 已由 accountUuid: [%s] 儲在", + "ORG_ZSTACK_HYBRID_ACCOUNT_10003": "參數 [accountUuid] 只能由管理員用戶使用!", + "ORG_ZSTACK_HYBRID_ACCOUNT_10004": "键: [%s] 已由 accountUuid: [%s] 儲在", + "ORG_ZSTACK_CLOUDFORMATION_10014": "内容必須通過 templateContent 或 url 設置!", + "ORG_ZSTACK_CLOUDFORMATION_10013": "無法刪除或更新系統統模板: %s", + "ORG_ZSTACK_CLOUDFORMATION_10012": "StackTemplateVO 已被刪除...", + "ORG_ZSTACK_CLOUDFORMATION_10011": "無法找到 %s 的參數,其類型为 %s,請检查參數", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10002": "因为無法附加硬件 VXLAN 池:%s", + "ORG_ZSTACK_CLOUDFORMATION_10010": "模板内容必須設置!", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10003": "無法創建缺少VLAN ID的L2硬件vxLAN网络", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10000": "無法将二层网络附加到叢叢,因为主機[uuid:%s]没有名为[%s]的接口", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10001": "由於無法找到主機[uuid:%s]的交换機端口,因此無法附加硬件VXLAN池。", + "ORG_ZSTACK_CLOUDFORMATION_10019": "無法在系統統標签中找到 l2[%s] 的 l2_bridge_name", + "ORG_ZSTACK_CLOUDFORMATION_10018": "[雲形成] filterName 必須为 cloudformation:true 或 cloudformation:false", + "ORG_ZSTACK_CLOUDFORMATION_10017": "StackTemplateVO: [%s] 已被刪除...", + "ORG_ZSTACK_CLOUDFORMATION_10016": "無效的雲形成模板版本: %s", + "ORG_ZSTACK_CLOUDFORMATION_10015": "獲取空内容輸入", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10006": "無法創建华为iMaster SDN VXLAN网络,缺少vpcId", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10007": "由於VNI范围[%d-%d]不在有效的VNI范围内,因此無法添加VNI范围", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10004": "無法創建华为iMaster SDN VXLAN网络,因为VLAN ID [%s] 超出了范围:%s", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10005": "無法創建华为iMaster SDN VXLAN网络,缺少vpcId和tenantId", + "ORG_ZSTACK_NETWORK_HUAWEI_IMASTER_10009": "無法添加华为iMaster SDN控制器而没有VLAN范围", + "ORG_ZSTACK_NETWORK_L2_10013": "無法更改 l2Network[uuid:%s] 的VLAN,因为儲在处於連接中或斷開連接状态的主機", + "ORG_ZSTACK_NETWORK_L2_10012": "不支持的虚拟交换機類型[%s]", + "ORG_ZSTACK_NETWORK_L2_10015": "無法更改 l2Network[uuid:%s] 的VLAN,因为此l2Network是隔离的", + "ORG_ZSTACK_NETWORK_L2_10014": "無法更改具有uuid:%s的l2Network的VLAN,因为該网络仅支持独家連接到KVM叢叢的L2网络", + "ORG_ZSTACK_NETWORK_L2_10017": "vlan[%s] 是無效的", + "ORG_ZSTACK_NETWORK_L2_10016": "vlan 对於 ChangeL2NetworkVlanId 類型[%s] 是必需的", + "ORG_ZSTACK_NETWORK_L2_10019": "VLAN 不允許用於類型为[%s]的 ChangeL2NetworkVlanId 操作", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10000": "没有候選主機具有版本[%s]", + "ORG_ZSTACK_NETWORK_L2_10018": "有一個 L2Network 已经附加到具有虚拟网络 ID[%s] 和物理接口[%s] 的叢叢上。無法更改 L2 网络[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10083": "已找到具有主機名[%s]的现有SimpleHttpBackupStorage", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10082": "無效的 URL[%s],URL 必須是以'/' 開始的绝对路径", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10080": "文件路径包含無效字符: %s", + "ORG_ZSTACK_NETWORK_L2_10020": "有一個 l2Network 已经附加到具有物理接口[%s]的叢叢上。無法更改 l2Network[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10079": "URL包含無效文件夹[/dev 或 /proc 或 /sys]", + "ORG_ZSTACK_CLOUDFORMATION_10034": "templateContent 和 uuid 不得同时为空或同时設置!", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10078": "绝对文件路径 required: %s", + "ORG_ZSTACK_NETWORK_L2_10006": "在叢叢[uuid:%s]中儲在一個已連接的l2Network[uuid:%s,名称:%s],該网络具有物理接口[%s]。無法将l2Network[uuid:%s]进行連接", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10077": "文件路径所需", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10076": "重复的备份儲儲。儲在一個主機名为[%s]的镜像儲儲备份", + "ORG_ZSTACK_NETWORK_L2_10008": "l2Network[uuid:%s] 已綁定至叢叢[uuid:%s],無法再次綁定", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10075": "主機名[%s]既不是有效的IPv4地址也不是一個合法的主機名", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10011": "磁碟配置標签分配扩展點[%s]返回零候選宿主機", + "ORG_ZSTACK_CLOUDFORMATION_10030": "只有管理員才能啟用/禁用系統統StackTemplate", + "ORG_ZSTACK_NETWORK_L2_10007": "在叢叢[uuid:%s]中儲在一個L2Vlan网络[uuid:%s, 名称:%s],該叢叢具有物理接口[%s]和vlan[%s]。失敗於附加L2Vlan网络[uuid:%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10010": "实例配置標签分配扩展點[%s]返回零候選宿主機", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10073": "源备份儲儲[%s]不包含镜像[%s]", + "ORG_ZSTACK_NETWORK_L2_10009": "無法附加 L2 网络,因为物理接口 [%s] 上已儲在另一個网络 [uuid:%s],其 VPC 類型不同", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10072": "源备份儲儲[%s]不包含镜像[%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10071": "目標备份儲儲[uuid:%s]已包含圖像[uuid:%s]", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10070": "刪除镜像元數据文件失敗: %s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10009": "备份儲儲[uuid:%s, 類型:%s] 需要綁定的主要儲儲,然而主要儲儲尚未添加", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10001": "該镜像[uuid:%s, 名称:%s]已在所有备份儲儲中被刪除", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10004": "資源綁定尚未支持類型 %syet", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10003": "在 zones[uuids:%s] 中未找到与备份儲儲關聯的主機,該备份儲儲包含圖像[%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10005": "没有找到綁定資源 %s 的可用主機", + "ORG_ZSTACK_NETWORK_L2_10011": "不支持的二层网络類型[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_DNS_10003": "虚拟路由器[uuid:%s, ip:%s]为L3网络[uuid:%s, name:%s]配置dns%s时失敗,%s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10008": "[uuid:%s] 的镜像位於需要与主儲儲[uuids:%s, 類型:%s]配合的备份儲儲[uuid:%s]上,然而並未找到适合与这些主儲儲配合的主機", + "ORG_ZSTACK_NETWORK_L2_10010": "l2Network[uuid:%s] 没有綁定到叢叢[uuid:%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10007": "該镜像[uuid:%s, name:%s]位於需要与主儲儲配合的备份儲儲[uuid:%s, type:%s]上,然而未找到适合与这些主儲儲配合的主機。", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10068": "检查圖像元數据文件: %s 失敗", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10066": "創建镜像元數据文件 : %s 失敗", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10065": "創建镜像元數据文件同步 : %s 失敗", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10022": "無法找到虚拟機[uuid:%s]的根磁碟", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10021": "没有主機拥有CPU[%s], 内儲[%s字節]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10000": "由於無法为nic[uuid:%s]綁定EIP,因此不儲在网關", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10062": "在灾难恢复BS:[%s]中禁止添加圖像", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10001": "L2网络中,基於vip的L3网络尚未将vmNic[uuid:%s]所在的叢叢进行綁定", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10002": "不能将超過1個%s弹性公网IP綁定到扁平化网络[uuid:%s]的VM网卡上", + "ORG_ZSTACK_STORAGE_BACKUP_IMAGESTORE_10060": "缺少圖片路径 on bs[%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10015": "無法找到可用的主儲儲[state: %s, status: %s, 可用容量 %s 字節]。請检查主儲儲的状态/状态,並確保其已附加到叢叢。", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10014": "在主儲儲 %s 挂载的叢叢中未找到主機", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10016": "無法找到可用的主儲儲[state: %s 或 %s, 状态: %s]。請检查主儲儲的状态/状态,並確保其已附加到叢叢中", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10031": "在 [%s] 候選主機中未找到啟用的主機,該候選主機具有虚拟機類型 [%s]", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10030": "在 [%s] 候選主機中未找到啟用的主機", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10033": "没有主機处於啟用状态且連接状态", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10032": "没有状态为啟用、連接状态且hypervisorType=%s 的主機找到", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10012": "在桶 %s 中未找到对象 %s", + "ORG_ZSTACK_UTILS_10000": "生成访问密钥失敗", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10024": "要么指定卷UUID,要么指定卷快照UUID", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10023": "在所有連接到主儲儲 %s 的叢叢中未找到主機,其中包含 VM[uuid:%s] 的卷", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10026": "在排除了避免使用的主機%s之後,候選中再也没有可用的主機了", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10025": "zoneUuids、clusterUuids、hostUuids 至少必須有一個非空列表,或者全部設置为 true", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10015": "阿里雲 EBS 备份儲儲不支持计算镜像哈希值", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10027": "在叢叢中未找到具有連接的L2网络的主機,該L2网络包含L3网络%s", + "ORG_ZSTACK_COMPUTE_ALLOCATOR_10029": "在 [%s] 候選主機中未找到已連接的主機", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10005": "選擇 %s 策略,您必須設置 %s", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10008": "没有找到拥有少於 %s vms 的主機", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10022": "該帳戶[uuid:%s]無權访问資源[uuid:%s,類型:L3NetworkVO]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10024": "将dhcp服務器ip地址更改为[%s],但獲取到的是[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10025": "L3网络UUID不能为null", + "ORG_ZSTACK_PLUGINPREMIUM_COMPUTE_ALLOCATOR_10003": "Incorrect %s settings, valid value is %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10021": "会话/帳戶 uuid 無效。", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10000": "阿里雲海洋終端的 URL 必須設置", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10017": "無法对虚拟機[uuid:%s, 状态:%s]应用EIP操作,因为找不到該VM的hostUuid", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10009": "阿里雲 EBS 备份儲儲不支持取消下载镜像", + "ORG_ZSTACK_CORE_TIMEOUT_10000": "API超时时間不能設置为小於%s", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_BACKUP_10002": "無法刪除OSS桶[%s],阿里雲Ebs备份儲儲[%s]仍然儲在,請先将其刪除。", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10004": "當前 [%s] 主儲儲不支持 [%s] 類型协议,請先将协议添加到儲儲中", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10003": "[协议] 參數为空,類型[%s] 主儲儲必須設置块卷协议", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10000": "路径錯誤誤", + "ORG_ZSTACK_STORAGE_VOLUME_BLOCK_EXPON_10002": "名称:[%s] 已儲在,類型为 [%s] 的主儲儲中不允許块卷名称重复", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10010": "無法獲取第3层网络 [uuid:%s] 的dhcpv6服務器IP地址", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10009": "無法獲取三层网络 [uuid:%s] 的 dhcp4 服務器 IP 地址", + "ORG_ZSTACK_POLICYROUTE_10029": "無法刪除系統統策略路由表", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10005": "主機[uuid:%s]未連接", + "ORG_ZSTACK_POLICYROUTE_10027": "無法刪除系統統策略路由叢", + "ORG_ZSTACK_POLICYROUTE_10028": "無法找到相關的虚拟路由器", + "ORG_ZSTACK_POLICYROUTE_10025": "規则叢[%s]仍然綁定到网卡", + "ORG_ZSTACK_POLICYROUTE_10020": "VRouter[%s] 已经有一個策略路由表 [%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10044": "因为平面DHCP未啟用,所以無法更改DHCP服務器IP地址", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10045": "可以更改DHCP服務器IP,因为%s不是L3网络[uuid:%s]的所有者", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10046": "因为没有 IPv4 地址范围,所以無法更改 DHCP v4 服務器 IP地址", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10047": "無法設置 DHCPv4 服務器 IP,因为 [%s] 不是 [%s] 的三层 CIDR", + "ORG_ZSTACK_IDENTITY_RBAC_10011": "操作[API:%s]默認被拒绝,請聯系統管理員进行修正", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10041": "無法設置DHCPv6服務器IP,因为没有IPv6地址范围", + "ORG_ZSTACK_IDENTITY_RBAC_10012": "該操作被策略[name:%s uuid:%s]拒绝", + "ORG_ZSTACK_IDENTITY_RBAC_10013": "該操作被策略[name:%s, uuid:%s]拒绝,字段[%s]不允許設置", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10037": "無法刪除 IP 地址,因为 IP [%s] 是 DHCP 服務器 IP 地址", + "ORG_ZSTACK_POLICYROUTE_10018": "無法更新系統統策略路由叢", + "ORG_ZSTACK_POLICYROUTE_10019": "無法更新系統統策略路由表", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10039": "無法設置 DHCPv4 服務器 IP 地址,因为没有 IPv4 地址范围", + "ORG_ZSTACK_POLICYROUTE_10017": "無法找到相關虚拟路由器", + "ORG_ZSTACK_POLICYROUTE_10014": "非法协议類型 %s", + "ORG_ZSTACK_POLICYROUTE_10015": "規则叢[%s]已经包含一個具有規则编號%s的規则。", + "ORG_ZSTACK_POLICYROUTE_10013": "操作失敗,IP格式仅支持ipv4/iprange/cidr,但發现%s", + "ORG_ZSTACK_POLICYROUTE_10010": "下一跳IP必須是ipv4格式,但發现[%s]", + "ORG_ZSTACK_CORE_REST_10012": "無法在 %sms 内回显 %s", + "ORG_ZSTACK_QUERY_10021": "字段[%s]不是库儲%s中的原始類型;你無法在參數'fields'中指定它;有效的字段是%s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10034": "DHCP服務器IP [%s] 已儲在於L3网络 [%s] 中", + "ORG_ZSTACK_QUERY_10020": "实体元類[%s]不儲在字段[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10035": "DHCP服務器IP地址[%s]不能等於网關IP地址", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10036": "DHCP服務器IP地址[%s]無法配置到系統統L3层", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10030": "DHCP 服務器 IP 地址 [%s] 不是 IPv4 地址", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10031": "DHCP服務器IP [%s] 不在CIDR [%s] 范围内", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10032": "DHCP 服務器 IP 地址 [%s] 不是 IPv6 地址", + "ORG_ZSTACK_IDENTITY_RBAC_10004": "無法更新系統統角色或预定义角色", + "ORG_ZSTACK_POLICYROUTE_10009": "目的CIDR必須是CIDR格式,但發现[%s]", + "ORG_ZSTACK_IDENTITY_RBAC_10007": "權限拒绝,帳戶[uuid:%s]不是該資源[uuid:%s, type:%s]的所有者", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10027": "無法为目標主機[uuid:%s]上的vm[uuid:%s]配置dhcp", + "ORG_ZSTACK_IDENTITY_RBAC_10008": "權限被拒绝,帳戶[uuid:%s]不是標记資源[uuid:%s, 類型:%s]的所有者", + "ORG_ZSTACK_POLICYROUTE_10008": "VRouter[%s] 已经有一個名为 %s 的規则叢", + "ORG_ZSTACK_IDENTITY_RBAC_10005": "無法刪除系統統或预定义角色", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10029": "扁平网络的最小IP范围前缀長度为%d", + "ORG_ZSTACK_POLICYROUTE_10003": "l3[%s] 已经關聯了一個策略路由規则叢", + "ORG_ZSTACK_IDENTITY_RBAC_10009": "該帳戶[uuid:%s]無權访问这些資源[uuid:%s, 類型:%s]", + "ORG_ZSTACK_POLICYROUTE_10000": "默認路由网络在啟用系統統策略路由时無法更改", + "ORG_ZSTACK_QUERY_10018": "条件名称[%s]無效,在库儲類[%s]中不儲在該字段", + "ORG_ZSTACK_QUERY_10017": "查询条件 %s 中的 'value' 不能为 null", + "ORG_ZSTACK_QUERY_10015": "filterName 必須格式化为 [filterType:condition(s)]", + "ORG_ZSTACK_ALIYUN_EBS_STORAGE_10000": "生成海洋API签名字符串失敗: %s", + "ORG_ZSTACK_QUERY_10019": "条件名称[%s]無效,库儲[%s]中的字段[%s]被注解为@Unqueryable字段", + "ORG_ZSTACK_ALIYUN_PANGU_10001": "应用程序名: %s, 分區名: %s 已儲在於身份區域: %s", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10050": "無法設置 DHCP 服務器 IP,因为 IP 地址 [%s] 已被使用", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10051": "無法設置DHCPv6服務器IP,因为IP[%s]已被使用", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10053": "分配 DHCP 服務器 IP 地址失敗", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10048": "可以更改DHCPv6服務器IP地址,因为不儲在IPv6地址范围", + "ORG_ZSTACK_NETWORK_SERVICE_FLAT_10049": "無法設置DHCPv6服務器IP,因为[%s]不是[%s]的三层CIDR地址", + "ORG_ZSTACK_USBDEVICE_10026": "請卸载所有VM[%s]的USB設备並重新嘗試", + "ORG_ZSTACK_USBDEVICE_10025": "無法禁用連接到虚拟機实例的USB設备[UUID:%s]", + "ORG_ZSTACK_USBDEVICE_10024": "vm 实例[uuid:%s] 不处於可附加状态%s中以供usb設备使用", + "ORG_ZSTACK_USBDEVICE_10023": "与 USB 設备[UUID:%s]關聯的虚拟機实例不在可分离状态%s中", + "ORG_ZSTACK_USBDEVICE_10022": "USB設备[UUID:%s]未連接到任何虚拟機实例。", + "ORG_ZSTACK_USBDEVICE_10021": "USB 設备[uuid:%s]插入的主機处於無效状态[%s]或状态[%s]", + "ORG_ZSTACK_USBDEVICE_10020": "虚拟機实例[UUID:%s]处於%s的不可挂接状态,無法处理USB設备", + "ORG_ZSTACK_COMPUTE_SRIOV_10005": "L3网络[uuid:%s]不儲在", + "ORG_ZSTACK_COMPUTE_SRIOV_10006": "%s,因为主機[uuid:%s]的l3Network[uuid:%s]上没有可用的sriov設备", + "ORG_ZSTACK_COMPUTE_SRIOV_10007": "無法更改VF NIC HA状态,因为不儲在VF NIC[uuid:%s]", + "ORG_ZSTACK_COMPUTE_SRIOV_10008": "無法更改vf nic的HA状态,因为HA状态[%s]無效", + "ORG_ZSTACK_COMPUTE_SRIOV_10009": "L2网络[uuid:%s]未找到", + "ORG_ZSTACK_COMPUTE_SRIOV_10000": "失敗在主機[uuid:%s, ip:%s]上設置vf网卡mac地址,因为%s", + "ORG_ZSTACK_COMPUTE_SRIOV_10001": "失敗了更改vf网卡HA状态,錯誤誤:%s", + "ORG_ZSTACK_DRS_10000": "該叢叢[%s]已創建DRS", + "ORG_ZSTACK_DRS_10002": "閾值不能为空", + "ORG_ZSTACK_DRS_10001": "DRS 已禁用", + "ORG_ZSTACK_DRS_10004": "非法閾值運算符[%s]", + "ORG_ZSTACK_DRS_10003": "非法的閾值名称[%s]", + "ORG_ZSTACK_DRS_10006": "非法的thresholdValue,有效范围:(0, 100]", + "ORG_ZSTACK_DRS_10005": "閾值不能为空", + "ORG_ZSTACK_DRS_10008": "DRS[%s]的状态是%s", + "ORG_ZSTACK_DRS_10007": "全局配置 ENABLE_DRS 已關閉", + "ORG_ZSTACK_DRS_10009": "DRS[%s] 的自動化級别不是手動模式", + "ORG_ZSTACK_ZWATCH_FUNCTION_10012": "value[%s] 不是整數", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10018": "無法執行 API 操作。後端网络 [uuid:%s] 已連接至 VPC 路由器 [uuid:%s],而該路由器未与前端网络 [uuid:%s] 連接", + "ORG_ZSTACK_ZWATCH_FUNCTION_10011": "無效參數[limit:%s],它不能是负數", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10019": "無法執行 API 操作。後端网络 [UUID:%s] 必須是 VPC 网络,因为其他後端网络是 VPC 网络", + "ORG_ZSTACK_ZWATCH_FUNCTION_10010": "未知參數[%s]", + "ORG_ZSTACK_DRS_10020": "刪除 DRP 在虚機迁移期間不允許", + "ORG_ZSTACK_DRS_10011": "成功執行,不允許重复執行", + "ORG_ZSTACK_DRS_10010": "提示[%s]已過期", + "ORG_ZSTACK_DRS_10013": "The vm[%s]状态不是運行中", + "ORG_ZSTACK_DRS_10012": "The vm[%s] 已被刪除", + "ORG_ZSTACK_DRS_10015": "該叢叢[%s]不支持DRS。", + "ORG_ZSTACK_DRS_10014": "The vm[%s] is no longer on the source host[%s]", + "ORG_ZSTACK_DRS_10017": "主機UUID列表为空", + "ORG_ZSTACK_DRS_10016": "無法創建DRS,%s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10013": "無法執行該 API 操作。後端网络 [UUID:%s] 必須是 VPC 网络,因为前端 L3 网络是 VPC 网络", + "ORG_ZSTACK_ZWATCH_FUNCTION_10005": "無效參數[start:%s],它不能为负數", + "ORG_ZSTACK_DRS_10019": "建议在調度时不允許使用", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10014": "無法執行API操作。後端网络[UUID:%s]未連接VPC路由器", + "ORG_ZSTACK_DRS_10018": "查询主機利用率數据失敗", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10015": "無法執行 API 操作。後端网络 [uuid:%s] 已連接至 VPC 路由器 [uuid:%s],而前端网络已連接至 VPC 路由器 [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10016": "無法執行 API 操作。後端网络 [UUID:%s] 必須是私有平坦网络,因为前端 L3 网络是私有平坦网络", + "ORG_ZSTACK_ZWATCH_FUNCTION_10002": "未知函數[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10010": "無法執行 API 操作。後端网络 [uuid:%s] cidr [%s] 与前端 l3 网络[uuid:%s] cidr [%s] 儲在重叠", + "ORG_ZSTACK_ZWATCH_FUNCTION_10008": "無效的參數值[%s]:[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10011": "無法執行API操作。後端网络[uuid:%s] CIDR [%s] 与管理L3网络[uuid:%s] CIDR [%s] 儲在重叠", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10012": "無法執行API操作。前端网络[UUID:%s]未連接到VPC路由器", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10001": "無法找到与[%s]相關的ceph池 OSD组", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_CAPACITY_10000": "required ceph池[uuid:%s]無法满足条件 [可用大小 > %s字節],當前可用大小 %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10006": "因为镜像 [uuid:%s] 已刪除,無法創建 SLB 实例", + "ORG_ZSTACK_ZWATCH_FUNCTION_10001": "重复參數[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10007": "因为实例數量達到最大值,無法創建SLB实例", + "ORG_ZSTACK_ZWATCH_FUNCTION_10000": "缺少必需的參數[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10008": "因为無效的前端L3网络類型 %s 無法創建SLB组", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10009": "無法執行API操作。前端网络[uuid:%s] cidr [%s] 与管理L3网络[uuid:%s] cidr [%s] 儲在重叠", + "ORG_ZSTACK_DRS_10022": "在虚拟機迁移過程中不允許調度", + "ORG_ZSTACK_DRS_10023": "缺少主機CPU、内儲监控數据", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10002": "雲中無法刪除 VIP[%s],請先刪除 UUID:%s 的 SLB", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10003": "因为無法找到负载均衡SLB组[uuid:%s],因此無法創建SLB实例", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10004": "因为未为SLB组[uuid:%s]配置SLB報价,無法創建SLB实例", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10005": "因为 SLB 产品 [uuid:%s] 的镜像 UUID 为空,無法創建 SLB 实例", + "ORG_ZSTACK_CORE_ENCRYPT_10000": "加密錯誤誤 : %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10000": "無法找到SLB实例[uuid:%s]的NIC,該实例連接至前层网络[uuid:%s]的SLB组中", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10001": "無法刪除 IP 范围[%s],請先刪除 UUID:%s 对应的 SLB", + "ORG_ZSTACK_IDENTITY_10011": "旧密碼与原始密碼不匹配,無法更新用戶[uuid:%s]的密碼", + "ORG_ZSTACK_IDENTITY_10010": "用戶[uuid:%s]不属於帳戶[uuid:%s]", + "ORG_ZSTACK_IDENTITY_10016": "配額[name:%s] of 帳戶[uuid:%s] 不能为 %d", + "ORG_ZSTACK_IDENTITY_10017": "該帳號[uuid:%s]使用的[name:%s, 使用量:%s]超出請求配額: %d", + "ORG_ZSTACK_IDENTITY_10001": "錯誤誤密碼", + "ORG_ZSTACK_IDENTITY_10009": "該帳號[uuid: %s]没有資源[uuid: %s]", + "ORG_ZSTACK_IDENTITY_10008": "用戶组[uuid:%s]不属於帳號[uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10003": "失敗刪除VIP%s,因为%s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10009": "服務[uuid: %s]已綁定到一個可观测性服務器", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10002": "失敗在虚拟路由器[uuid:%s]同步vips[ips: %s]以附加nic[uuid: %s, ip: %s],因为%s", + "ORG_ZSTACK_OVF_10025": "只有处於状态:%s 的 vm 才能被导出。", + "ORG_ZSTACK_OVF_10026": "解析 APICreateVmInstanceFromOvfMsg 中的 jsonCreateVmParam 失敗", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10006": "在區域[uuid:%s]中为L3网络[uuid:%s]找到了虚拟路由器報价[uuid:%s];然而,該网络的公网[uuid:%s]与VIP[uuid:%s]的不同;您可能需要使用系統統標签guestL3Network::l3NetworkUuid来指定特定的虚拟路由器報价以匹配L3网络", + "ORG_ZSTACK_OVF_10023": "导出虚拟機需要一個ImageStore备份儲儲,但给定的backupStorageUuid: %s 不是一個ImageStore备份儲儲。", + "ORG_ZSTACK_OBSERVABILITYSERVER_10006": "可观测性服務器提供[uuid: %s]未啟用", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VIP_10005": "虚拟路由器[uuid:%s, 状态:%s] 未運行", + "ORG_ZSTACK_OVF_10024": "未找到带有uuid: %s 的vm进行导出", + "ORG_ZSTACK_OBSERVABILITYSERVER_10007": "可观测性服務器報价[uuid: %s]的镜像缺失", + "ORG_ZSTACK_OVF_10021": "从 OVF 創建 VM 失敗,因为 VM 的根磁碟無法找到", + "ORG_ZSTACK_OVF_10022": "VM[uuid: %s] 已经导出为 OVA 包[uuid: %s],請刪除該包後再試。", + "ORG_ZSTACK_KVM_XMLHOOK_10001": "xml挂钩[uuid: %s]更新成功,但未能重啟vm[uuid:%s]。詳細信息是:%s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10003": "無法找到服務: %s 的虚拟路由器,類型: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10010": "可观测性服務器[uuid: %s]未運行,無法附加服務", + "ORG_ZSTACK_OVF_10018": "读取 ovf 文件失敗。", + "ORG_ZSTACK_OVF_10017": "ova 包[uuid: %s] 未找到。", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10057": "無法找到负载均衡器[uuid:%s,type:%s]的SLB组UUID", + "ORG_ZSTACK_STORAGE_PRIMARY_FILESYSTEM_10000": "主機[uuid:%s]的心跳未更新", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_HA_10000": "HA组扩展點为空", + "ORG_ZSTACK_OVF_10030": "長期任務[uuid:%s]執行失敗", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10040": "無法将 vmnic 添加到负载均衡服務器组,因为 l3 网络[uuid:%s]連接到了不同的 vpc 路由器", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10041": "無法将 vmnic 添加到负载均衡服務器组,因为 L3 网络未連接到 SLB 实例", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10046": "因为儲在另一個为SLB组創建的实例[uuid:%s, name:%s],所以無法創建SLB实例", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10047": "因为负载均衡组中已有其他2個实例創建,無法創建SLB实例", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10001": "失敗从NFS[uuid:%s,路径:%s]上传位元到镜像儲儲[主機名:%s], %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10042": "因为無效的监控IP %s 無法更改SLB组监控IP地址", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10043": "無法将SLB组[uuid:%s]切换到HA模式,因为实例状态[%s]未停止", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10044": "failed to create vip%s on virtual router[uuid:%s], because %s", + "ORG_ZSTACK_STORAGE_PRIMARY_IMAGESTORE_NFS_10000": "从镜像儲儲备份儲儲[主機名:%s, 路径: %s]下载數据到NFS主儲儲[唯一標識符:%s, 路径: %s]失敗,%s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10045": "为 SLB 组 [uuid:%s] 創建亲和组失敗", + "ORG_ZSTACK_IAM2_API_10011": "属性[uuid:%s]不属於任何组", + "ORG_ZSTACK_IAM2_API_10012": "属性[uuid:%s]不属於任何组织", + "ORG_ZSTACK_IAM2_API_10013": "属性[uuid:%s]不属於任何项目", + "ORG_ZSTACK_IAM2_API_10014": "属性[uuid:%s] 不属於任何虚拟ID", + "ORG_ZSTACK_IAM2_API_10015": "退休策略必須在拉取项目出退休状态之前被刪除", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10039": "無法将 vmnic 添加到负载均衡服務器组,因为 l3 网络 [uuid:%s] 已連接到任何 vpc 路由器", + "ORG_ZSTACK_IAM2_API_10016": "登录被禁止,因为项目处於%s状态", + "ORG_ZSTACK_IAM2_API_10017": "没有配額[name:%s]找到", + "ORG_ZSTACK_IAM2_API_10018": "容器的CPU數量限制应大於容器請求的CPU數量", + "ORG_ZSTACK_IAM2_API_10019": "容器的内儲大小限制应大於容器請求的内儲大小", + "ORG_ZSTACK_OVF_10003": "卷控制器未找到。", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10007": "VIP [uuid: %s] 的 VIP QoS 不儲在", + "ORG_ZSTACK_OVF_10004": "CD驱動控制器未找到。", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10008": "無法刪除關聯在VpcSharedQos中的VIP [uuid: %s] 的QoS", + "ORG_ZSTACK_OVF_10001": "非法磁碟容量: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10005": "無法設置 VIP [uuid: %s] 的服務质量。它已被附挂在 VpcSharedQos 中", + "ORG_ZSTACK_OVF_10002": "非法磁碟占用大小: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10006": "VIP带宽保障 Vip [uuid: %s] 端口 %s 不儲在", + "ORG_ZSTACK_OVF_10000": "文件引用未找到 for 磁碟 %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10009": "無法找到 VipQos 後端 for Vip [uuid:%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10010": "VpcSharedQos 必須設置带宽", + "ORG_ZSTACK_IPSEC_10028": "L3网络[%s]未綁定到ipsec[uuid:%s]", + "ORG_ZSTACK_AUTOSCALING_10000": "無效的三层网络 UUID[%s]对於属於负载均衡器[%s]的监听器,所有网络必須連接到负载均衡器服務並使用相同的 vRouter 連接", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10011": "VPC 需先綁定 L3[%s]", + "ORG_ZSTACK_IPSEC_10029": "CIDR [%s] 已经在IPsec [uuid :%s] 的CIDRs中", + "ORG_ZSTACK_AUTOSCALING_10001": "从自動扩展组分离自動扩展模板[%s]失敗,錯誤誤为%s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10030": "無法将三层网络 [uuid:%s] 挂载到SLB实例,因为IPv6前缀[%s]格式錯誤誤", + "ORG_ZSTACK_AUTOSCALING_10003": "监听器[uuid:%s]正被autoScalingVmTemplate[%s]使用,無法刪除", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10014": "VpcSharedQos 無法綁定此 VIP,因为 VIP[%s] 已经被綁定到另一個 VpcSharedQos 中", + "ORG_ZSTACK_IPSEC_10025": "L3网络[%s]不能与ipsec[uuid:%s]綁定两次", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10012": "AttachVipToVpcSharedQos 參數必須設置 VipUuids 或 VipLists", + "ORG_ZSTACK_IPSEC_10026": "必須在APIAttachL3NetworksToIPsecConnectionMsg中包含L3网络", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10013": "VpcSharedQos 無法綁定此 Vip,因为 Vip[%s] 不在 l3[%s] 中", + "ORG_ZSTACK_IPSEC_10027": "L3网络[%s]不是VPC网络,無法綁定或解綁到IPSec", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10035": "無法創建负载均衡器,因为 VIP [uuid:%s] 已綁定其他网络服務 [%s]", + "ORG_ZSTACK_IPSEC_10020": "peerAddress[%s] 不是 IPv4 地址", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10036": "無法創建负载均衡器,因为 VIP [uuid:%s] 已綁定到 VPC 路由器 [%s]", + "ORG_ZSTACK_IPSEC_10021": "authKey 不得包含空格和特殊字符 \\\"`\\\\", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10037": "無法創建负载均衡器因为無效的SLB组 [uuid:%s]", + "ORG_ZSTACK_IPSEC_10022": "IPsec VIP [%s] 不能是 CIDR 公共地址池類型下的第一個或最後一個 IP 地址", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10038": "無法将後端服務器的vmnic添加到serverGroup[uuid:%s],因为vmnic的uuid为空", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10031": "無法将三层网络 [uuid:%s] 挂载到SLB实例,因为必須在systemTag中設置IP地址和前缀", + "ORG_ZSTACK_AUTOSCALING_10004": "該实例[%s]不在扩展组[%s]中", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10032": "無法从SLB实例detach前端L3网络[uuid:%s]", + "ORG_ZSTACK_AUTOSCALING_10005": "報警[uuid:%s]正被自動扩展组[%s]使用,無法刪除", + "ORG_ZSTACK_IAM2_API_10020": "组织[uuid:%s]是一個公司,不能有上級组织", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10033": "無法将管理L3网络 [uuid:%s] 从SLB实例中分离", + "ORG_ZSTACK_AUTOSCALING_10006": "規则[%s]状态为禁用", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10034": "無法从SLB实例detach网卡[uuid:%s],因为它是最後一個後端L3网络网卡", + "ORG_ZSTACK_IAM2_API_10021": "父组织[uuid:%s]不能是子组织[uuid:%s]的子组织", + "ORG_ZSTACK_IAM2_API_10022": "重复的虚拟ID名称[%s]", + "ORG_ZSTACK_IAM2_API_10023": "重复项目名称[%s]", + "ORG_ZSTACK_IAM2_API_10024": "無效的项目名称[%s],儲在同名的帳戶或项目", + "ORG_ZSTACK_IAM2_API_10025": "IAM2OrganizationVO[uuid:%s] 不儲在", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10028": "無法将三层网络 [uuid:%s] 挂载到SLB实例,因为必須在systemTag中設置IP地址和子网掩碼", + "ORG_ZSTACK_IAM2_API_10026": "該项目[uuid=%s]已綁定至组织[uuid=%s]", + "ORG_ZSTACK_OBSERVABILITYSERVER_10019": "開始时間必須小於結束时間", + "ORG_ZSTACK_IAM2_API_10027": "项目[uuid=%s]未關聯", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10029": "無法将三层网络 [uuid:%s] 挂载到 SLB 实例,因为 IPv6 地址 [%s] 格式錯誤誤", + "ORG_ZSTACK_IAM2_API_10028": "组织%s是不能作为其他组织子项的公司", + "ORG_ZSTACK_IAM2_API_10029": "虚拟ID[UUID: %s]不在项目[UUID: %s]中", + "ORG_ZSTACK_OBSERVABILITYSERVER_10015": "找不到可观测性服務類型: %s", + "ORG_ZSTACK_OVF_10015": "备份儲儲[uuid: %s]没有足够的可用容量用於导出虚拟機[uuid: %s],所需容量是:%d", + "ORG_ZSTACK_OBSERVABILITYSERVER_10016": "服務[uuid: %s]類型为%s不能从可观测性服務器[uuid: %s]中解綁,原因:%s", + "ORG_ZSTACK_OVF_10012": "非法 CPU \"CoresPerSocket\" 值: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10017": "服務[uuid: %s]未綁定到可观测性服務器[uuid: %s]", + "ORG_ZSTACK_OBSERVABILITYSERVER_10018": "開始时間和結束时間都必須指定", + "ORG_ZSTACK_OVF_10010": "CPU 'VirtualQuantity' 未找到", + "ORG_ZSTACK_OBSERVABILITYSERVER_10011": "可观测性服務器報价[uuid: %s]未找到", + "ORG_ZSTACK_OVF_10011": "非法CPU「VirtualQuantity」值: %s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10013": "服務[uuid: %s]類型为%s不能綁定到可观测性服務器[uuid: %s],原因:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10000": "IPv6 的 VipQos 将会很快添加", + "ORG_ZSTACK_ALIYUN_STORAGE_SNAPSHOT_10000": "該操作仅允許當ECS实例状态为運行中或已停止时執行", + "ORG_ZSTACK_OVF_10009": "CPU 'InstanceID' 未找到", + "ORG_ZSTACK_OBSERVABILITYSERVER_10020": "無效的日期时間格式。预期为带有可選时區詳情的ISO-8601格式:%s", + "ORG_ZSTACK_OBSERVABILITYSERVER_10021": "可观测性服務器[uuid: %s]未運行,無法獲取服務數据", + "ORG_ZSTACK_OVF_10007": "内儲 'VirtualQuantity' 未找到", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10003": "SetVipQos 必須設置入站带宽或出站带宽", + "ORG_ZSTACK_OVF_10008": "非法内儲'虚拟數量'值: %s", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10004": "無法为該 VIP 設置 QoS。並非所有对端 L3 网络提供 VIPQos 服務。", + "ORG_ZSTACK_OVF_10005": "以太网适配器: %s 没有連接到网络。", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10001": "VIP带宽保障 Vip [uuid: %s] 端口 %s 已经儲在", + "ORG_ZSTACK_OVF_10006": "内儲 'InstanceID' 未找到", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10002": "VIP QoS 对於 VIP [uuid: %s] 已经儲在", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10024": "因为無效的後端類型 %s 無法創建 SLB 组", + "ORG_ZSTACK_IPSEC_10031": "無法更改状态因为IPsec [uuid:%s] 的状态不是就绪状态", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10025": "因为無效的监控IP %s無法創建SLB组", + "ORG_ZSTACK_IPSEC_10032": "無法重新連接此IPsec [uuid:%s],請升級IPsec版本", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10026": "無法将三层网络 [uuid:%s] 挂载到 SLB 实例,因为 IPv4 地址 [%s] 格式錯誤誤", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10027": "無法将三层网络 [uuid:%s] 挂载到SLB实例,因为IPv4子网掩碼[%s]格式錯誤誤", + "ORG_ZSTACK_IAM2_API_10030": "非法操作,無法添加角色[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10021": "無法執行 API 操作。後端网络 [uuid:%s] 已連接至 VPC 路由器 [uuid:%s],而其他後端网络则連接至 VPC 路由器 [uuid:%s]", + "ORG_ZSTACK_IAM2_API_10031": "不能操作過时的虚拟ID: %s", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10022": "無法執行 API 操作。後端网络 [UUID:%s] 不能是 VPC 网络,因为其他後端网络不是 VPC 网络", + "ORG_ZSTACK_NETWORK_SERVICE_SLB_10023": "因为無效的部署類型 %s 無法創建 SLB 组", + "ORG_ZSTACK_IPSEC_10030": "CIDR [%s] 不在 IPsec [uuid :%s] 的 CIDRs 中", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10026": "操作錯誤誤,因为:獲取响应失敗", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10028": "备份快照到备份儲儲是一個已弃用的功能,将在未来的版本中移除", + "ORG_ZSTACK_IAM2_API_10000": "属性名称不能为null,值[%s]", + "ORG_ZSTACK_IAM2_API_10001": "属性名称[%s]超出最大長度2048個字符", + "ORG_ZSTACK_IAM2_API_10002": "属性[name:%s]的值[%s]超出最大長度2048個字符", + "ORG_ZSTACK_IAM2_API_10003": "The Organization[uuid: %s] 使用 [name: %s, usedValue: %s] 超過了 Request:%s。", + "ORG_ZSTACK_IAM2_API_10005": "%s 不是一個有效的值。有效值是 allow/rejection xxx 至 xxx", + "ORG_ZSTACK_IAM2_API_10006": "默認组织[%s]無法被刪除", + "ORG_ZSTACK_IAM2_API_10007": "重复模板名称[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10018": "VpcSharedQos 無法解綁此 Vip,因为 Vpc[%s] 未連接", + "ORG_ZSTACK_IAM2_API_10009": "管理員是保留名称,請使用其他名称", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10016": "DetachVipFromVpcSharedQos 參數必須設置 VipUuids 或 VipLists", + "ORG_ZSTACK_NETWORK_SERVICE_VIPQOS_10017": "VpcSharedQos 無法解綁此 Vip,因为 Vip[%s] 未綁定", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10010": "ceph 主儲儲[uuid:%s]可能已被刪除。", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10013": "ceph 主儲儲[cid:%s, 名称:%s]已宕機,因为一個监控節點[uuid:%s]報告了一次操作失敗[%s]", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10012": "在另一個 CEPH 主儲儲[name:%s, uuid:%s] 中發现了相同的 FSID[%s],您不能将相同的 CEPH 配置添加为两個不同的主儲儲", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10015": "無法連接儲儲節點", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10017": "监控節點[mon:%s]返回的fsid[%s]与當前cep叢叢的fsid[%s]不同,請问是否誤将不属於當前叢叢的监控節點添加进来?", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10016": "無法将儲儲節點添加到ceph主儲儲", + "ORG_ZSTACK_IAM2_API_10010": "無效名称[%s],已儲在同名的项目或帳戶", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10008": "無法連接到ceph主儲儲[uuid:%s],未能連接所有ceph监视器。", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10007": "所有监视器無法執行HTTP調用[%s]", + "ORG_ZSTACK_ZOPS_10009": "獲取 chrony 源失敗,因为:%s", + "ORG_ZSTACK_ZOPS_10005": "%s 从 %s 是不可達的,因为:%s", + "ORG_ZSTACK_ZOPS_10004": "配置时間源 '%s' 在 %s 失敗,因为:%s,原始信息:%s", + "ORG_ZSTACK_ZOPS_10007": "%s 检查 Ceph 健康状态失敗,因为: %s", + "ORG_ZSTACK_ZOPS_10006": "失敗检查 %s 是否可以从 %s 達到,因为:%s", + "ORG_ZSTACK_ZOPS_10001": "%s 不是一個有效的IP地址", + "ORG_ZSTACK_ZOPS_10003": "%s 不是一個有效的IP地址或域名", + "ORG_ZSTACK_ZOPS_10002": "内部和外部chrony服務器不能同时为null", + "ORG_ZSTACK_ZOPS_10010": "獲取 %s 的 chrony 源失敗,因为:%s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10001": "备份儲儲[uuid:%s, name:%s, fsid:%s] 不在与主儲儲[uuid:%s, name:%s, fsid:%s] 同一的 Ceph 叢叢中", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10004": "保儲加密後創建的镜像缓儲失敗: %s", + "ORG_ZSTACK_STORAGE_CEPH_PRIMARY_10005": "fsid 在 ps[%s] 和 bs[%s] 之間不相同,創建模板被禁止。", + "ORG_ZSTACK_ZOPS_10019": "在 %s 中刪除旧的 chrony 服務器於 zstack.properties 文件失敗,因为:%s", + "ORG_ZSTACK_ZOPS_10016": "ZStone 尚不支持在线更新 chrony 服務器!", + "ORG_ZSTACK_ZOPS_10015": "%s 从 %s 是不可達的", + "ORG_ZSTACK_ZOPS_10018": "ceph 状态不健康,請首先检查您的环境!%s", + "ORG_ZSTACK_ZOPS_10012": "失敗检查 %s 是否可以从主機 %s 達到,因为 %s 未由我们管理", + "ORG_ZSTACK_ZOPS_10011": "在 %s 中同步 chrony 服務器失敗,因为:%s,原始:%s", + "ORG_ZSTACK_ZOPS_10014": "%s 不能設置为外部 chrony 服務器!", + "ORG_ZSTACK_ZOPS_10020": "失敗在 %s 中配置 zstack.properties 的 chrony 服務器,因为:%s", + "ORG_ZSTACK_PROXY_10000": "無法找到带有uuid的UserProxyConfig", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10005": "从宿主機[UUID:%s]啟動USB重定向服務器失敗", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10004": "無法在宿主機[%s]啟動USB服務器,因为宿主機未連接", + "ORG_ZSTACK_USBDEVICE_KVMUSBDEVICEBACKEND_10003": "主機[%s]已啟動超過64個USB重定向端口", + "ORG_ZSTACK_COMPUTE_HOST_10085": "無法在接口上設置管理网络,因为管理网络采用自動獲取類型", + "ORG_ZSTACK_COMPUTE_HOST_10084": "無法在接口上分离管理网络,因为管理网络是自動獲取類型", + "ORG_ZSTACK_COMPUTE_HOST_10087": "無法在綁定設备上分离管理网络,因为管理网络是自動獲取類型", + "ORG_ZSTACK_COMPUTE_HOST_10081": "無法設置桥接从属接口的IP地址", + "ORG_ZSTACK_COMPUTE_HOST_10080": "無法設置已在其他接口上設置的IP地址", + "ORG_ZSTACK_COMPUTE_HOST_10083": "無效的綁定UUID", + "ORG_ZSTACK_COMPUTE_HOST_10089": "無效的服務類型", + "ORG_ZSTACK_COMPUTE_HOST_10088": "不能在綁定設备上設置管理网络,因为管理网络采用自動獲取類型", + "ORG_ZSTACK_COMPUTE_HOST_10090": "模拟通過 IPMI 關閉主機[%s]失敗。", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10001": "無法連接到主機,端口:%s,%d。问題可能由不正確的smtpServer或smtpPort引起。[error=%s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10002": "無法在15秒内連接SMTP服務器[服務器: %s, 端口: %s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10003": "SMTP 服務器驗證錯誤誤: %s", + "ORG_ZSTACK_AI_COLLECTOR_10000": "在 MindIE 元數据收叢中未找到部署上下文", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10004": "endpoint 已禁用", + "ORG_ZSTACK_AI_COLLECTOR_10001": "某些部署上下文没有VM库儲,無法收叢MindIE元數据", + "ORG_ZSTACK_COMPUTE_HOST_10096": "通過IPMI重啟主機[%s]失敗。", + "ORG_ZSTACK_COMPUTE_HOST_10095": "模拟电源重置主機[%s]通過IPMI失敗。", + "ORG_ZSTACK_COMPUTE_HOST_10098": "主機[%s]獲取了意外的返回值", + "ORG_ZSTACK_COMPUTE_HOST_10097": "IPMI信息不完整。", + "ORG_ZSTACK_COMPUTE_HOST_10092": "模拟通過 IPMI 在主機[%s]上開啟电源失敗。", + "ORG_ZSTACK_COMPUTE_HOST_10091": "關閉主機[%s]通過IPMI失敗。", + "ORG_ZSTACK_COMPUTE_HOST_10094": "重啟主機[%s:%d]失敗,因为主機已经關閉。", + "ORG_ZSTACK_COMPUTE_HOST_10093": "通過 IPMI 啟動主機[%s]失敗。", + "ORG_ZSTACK_COMPUTE_HOST_10099": "主機[%s]無法連接IPMI[%s],原因:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10002": "無法计算文件夹[%s]中文件的md5sum。\\nstdout:%s\\nstderr:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10003": "無法在主機[ip:%s]的文件夹[%s]中检查文件的md5sum。\\nstdout:%s\\nstderr:%s", + "ORG_ZSTACK_CORE_ANSIBLE_10000": "用戶名或密碼或端口號碼可能儲在问題", + "ORG_ZSTACK_COMPUTE_HOST_10065": "失敗更新主機网络標签 [uuid:%s]", + "ORG_ZSTACK_SNS_PLATFORM_EMAIL_10000": "问題可能是由錯誤誤的用戶名或密碼,或者郵箱權限被拒绝引起的。[error=%s]", + "ORG_ZSTACK_COMPUTE_HOST_10064": "刪除主機网络標签 [uuid:%s] 失敗", + "ORG_ZSTACK_COMPUTE_HOST_10067": "無效的 IP 地址格式[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10066": "主機[%s]未連接,不支持斷电操作", + "ORG_ZSTACK_COMPUTE_HOST_10069": "無效的 IP 叢,它必須与子网掩碼一起設置", + "ORG_ZSTACK_COMPUTE_HOST_10068": "無效的网络掩碼格式[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10073": "無法設置綁定从属接口的IP地址", + "ORG_ZSTACK_COMPUTE_HOST_10070": "無法設置接口的IP地址,該接口对应於管理网络", + "ORG_ZSTACK_COMPUTE_HOST_10078": "無法設置与管理网络对应的綁定接口的IP地址", + "ORG_ZSTACK_COMPUTE_HOST_10077": "無效接口UUID", + "ORG_ZSTACK_IMAGE_10019": "上传会话已過期", + "ORG_ZSTACK_IMAGE_10016": "失敗的原因是管理節點重啟了。", + "ORG_ZSTACK_IMAGE_10015": "圖像路径不在白名单中: %s", + "ORG_ZSTACK_IMAGE_10014": "所有在該服務器上的镜像都無法使用", + "ORG_ZSTACK_IMAGE_10013": "圖像路径 [%s] 在黑名单 %s 中", + "ORG_ZSTACK_IMAGE_10012": "绝对路径必須使用", + "ORG_ZSTACK_IMAGE_10011": "url 必須以 'file:///'、'http://'、'https://'、'ftp://'、'sftp://' 或 '/' 開头", + "ORG_ZSTACK_IMAGE_10010": "在 uuids%s 中未指定备份儲儲;可用的备份儲儲不在状态 %s 中或处於状态 %s 之外,或者 UUID 無效", + "ORG_ZSTACK_IMAGE_10009": "不支持的圖像類型[%s]", + "ORG_ZSTACK_IMAGE_10008": "未知格式[%s]", + "ORG_ZSTACK_IMAGE_10007": "ISO 不能用作系統統镜像", + "ORG_ZSTACK_IMAGE_10006": "卷快照[uuid:%s]未啟用,状态为%s", + "ORG_ZSTACK_IMAGE_10005": "卷快照[uuid:%s]尚未就绪,其状态为%s", + "ORG_ZSTACK_IMAGE_10004": "卷[uuid:%s]未啟用,状态为%s", + "ORG_ZSTACK_IMAGE_10003": "卷[uuid:%s] 不处於就绪状态,它的状态为%s", + "ORG_ZSTACK_IMAGE_10002": "The AArch64 架构不支持 legacy。", + "ORG_ZSTACK_ALIYUN_ACCOUNT_10000": "無法在 %d 毫秒内連接到 [%s],因此阿里雲開放API不可達。", + "ORG_ZSTACK_IMAGE_10039": "未找到与镜像[uuid:%s, name:%s]關聯的备份儲儲", + "ORG_ZSTACK_IMAGE_10038": "該镜像[uuid:%s, name:%s]未在任何备份儲儲中找到", + "ORG_ZSTACK_IMAGE_10037": "从卷[uuid:%s]在所有备份儲儲上創建數据卷模板失敗%s。請查看其中一個錯誤誤的原因", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10041": "预期为 'true'、'false' 或其他条件,當前条件包括: %s,但獲得 %s", + "ORG_ZSTACK_IMAGE_10036": "分配所有备份儲儲[uuid:%s]失敗,錯誤誤列表: %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10040": "元素为空!", + "ORG_ZSTACK_IMAGE_10035": "無法找到合适的备份儲儲", + "ORG_ZSTACK_IMAGE_10034": "从根卷[uuid:%s]在所有备份儲儲上創建镜像失敗,請查看其中一個錯誤誤的原因", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10002": "在进行卷[uuid: %s]儲儲迁移时,圖像[uuid: %s]的下载缺少足够的容量,所需容量:%s,當前可用物理容量:%s", + "ORG_ZSTACK_IMAGE_10032": "無法分配由UUIDs指定的备份儲儲%s,錯誤誤列表是:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10003": "儲儲迁移不足以为卷[uuid: %s]分配容量,所需容量:%s,當前可用物理容量:%s", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10004": "来源 ps[uuid: %s] 的數据已被丢弃,不支持回滚", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10005": "在共享块設备上迁移未带快照的卷不支持取消。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10000": "找到 trashId(%s) 在主儲儲 [%s] 中的迁移安装路径[%s] 中。如果您坚持要迁移卷[%s],請先通過 'APICleanUpTrashOnPrimaryStorageMsg' 清理它。", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_MIGRATION_10001": "無法在与區域[uuid:%s]連接的任何备份儲儲中找到圖像[uuid:%s]。請检查以下内容:\n1. 备份儲儲是否已附接到區域[uuid:%s]\n2. 备份儲儲是否处於連接状态;如果未連接,請嘗試重新連接它", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10039": "只有函數可以在函數中定义,但發现 %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10032": "Fn::FindInMap 無法在 Resources 中找到資源 [%s]!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10036": "未找到引用 [%s]!", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10035": "不支持的功能 [%s] 在 ZStack 資源模板中!", + "ORG_ZSTACK_CORE_ERRORCODE_10007": "輸入參數 'regex' 或 'category' 必須設置", + "ORG_ZSTACK_CORE_ERRORCODE_10005": "詳細代碼必須是數字!", + "ORG_ZSTACK_IMAGE_10026": "無法克隆镜像,因为镜像 [%s] 的状态不是就绪状态", + "ORG_ZSTACK_CORE_ERRORCODE_10006": "%s: %s\"翻译成中文为:\"%s: %s", + "ORG_ZSTACK_IMAGE_10025": "来源圖像 [%s] 不儲在", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10051": "%s 無法转换为 String", + "ORG_ZSTACK_CORE_ERRORCODE_10003": "%s 不儲在或是一個空文件夹", + "ORG_ZSTACK_CORE_ERRORCODE_10004": "读取詳細模板文件 [%s] 失敗,原因:%s", + "ORG_ZSTACK_IMAGE_10023": "vm 实例[uuid:%s] 没有根磁碟", + "ORG_ZSTACK_IMAGE_10022": "vm 实例[uuid:%s] 没有磁碟", + "ORG_ZSTACK_IMAGE_10021": "备份儲儲[uuid:%s]當前不在連接状态,當前状态是%s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10042": "期望为該对象提供 \"true\" 或 \"false\",但收到 %s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10046": "Fn::GetAtt 無法在 Resources 中找到資源 [%s]!", + "ORG_ZSTACK_SSO_SAML2_SERVICE_10000": "iam2 中儲在同名用戶[%s],预期類型[%s]但發现類型[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10119": "主機[%s]没有IPMI設备或IPMI没有地址。請配置IPMI地址後重新連接主機以刷新主機的IPMI信息", + "ORG_ZSTACK_ZQL_AST_VISITORS_PLUGIN_10000": "求和的字段必須指定", + "ORG_ZSTACK_SSO_SAML2_SERVICE_10001": "重复的 SAML 登录[%s, %s]類型为[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10120": "失敗迁移虚拟機[uuids:%s]在主機[uuid:%s,名称:%s,IP:%s]上,将嘗試停止它。", + "ORG_ZSTACK_CORE_ERRORCODE_10001": "文件或JSON内容不能同时非空", + "ORG_ZSTACK_CORE_ERRORCODE_10002": "無法扫描文件夹:%s", + "ORG_ZSTACK_CORE_ERRORCODE_10000": "非文件或JSON内容輸入", + "ORG_ZSTACK_COMPUTE_HOST_10124": "主機正在連接,ping失敗", + "ORG_ZSTACK_COMPUTE_HOST_10104": "儲在一個主機具有管理IP[%s]用於hypervisor[%s]", + "ORG_ZSTACK_COMPUTE_HOST_10103": "叢叢[uuid:%s]的虚化類型为null", + "ORG_ZSTACK_COMPUTE_HOST_10106": "叢叢[uuid:%s]的架构是%s,与主機[name:%s, ip:%s]的架构%s不匹配", + "ORG_ZSTACK_COMPUTE_HOST_10105": "連接後,主機[name:%s, ip:%s]返回空架构", + "ORG_ZSTACK_COMPUTE_HOST_10100": "主機IPMI[%s]不可達,因为%s", + "ORG_ZSTACK_COMPUTE_HOST_10102": "叢叢[uuid:%s]不儲在", + "ORG_ZSTACK_SCHEDULER_10008": "無效的时間单位: %s", + "ORG_ZSTACK_SCHEDULER_10005": "該磁碟[%s]不支持快照保留", + "ORG_ZSTACK_SCHEDULER_10006": "快照最大數量 : %s 格式錯誤誤因为 %s", + "ORG_ZSTACK_COMPUTE_HOST_10108": "系統統主機网络服務類型[%s]無法刪除", + "ORG_ZSTACK_COMPUTE_HOST_10107": "主要儲儲[uuid:%s]变得斷開連接,主機未附加任何已連接的主要儲儲", + "ORG_ZSTACK_COMPUTE_HOST_10109": "系統統主機网络服務類型[%s]無法更新", + "ORG_ZSTACK_SCHEDULER_10002": "上次任務尚未完成,請跳過此任務", + "ORG_ZSTACK_COMPUTE_HOST_10114": "無法维护主機[uuid:%s, status:%s],該主機未連接", + "ORG_ZSTACK_COMPUTE_HOST_10111": "webssh 服務未運行。", + "ORG_ZSTACK_COMPUTE_HOST_10110": "主機网络服務類型[%s]出现錯誤誤", + "ORG_ZSTACK_COMPUTE_HOST_10113": "管理IP[%s]既不是有效的IPv4地址也不是主機名", + "ORG_ZSTACK_COMPUTE_HOST_10112": "儲在一個主機具有管理IP[%s]", + "ORG_ZSTACK_SCHEDULER_10018": "該虚拟機已经安排了任務[jobType:%s]", + "ORG_ZSTACK_SCHEDULER_10016": "根卷[%s]的虚拟機不可用。請检查虚拟機是否儲在。", + "ORG_ZSTACK_SCHEDULER_10017": "快照组最大數量 : %s 格式錯誤誤因为 %s", + "ORG_ZSTACK_SCHEDULER_10014": "該磁碟[%s]不可用。請检查磁碟是否儲在。", + "ORG_ZSTACK_SCHEDULER_10015": "該卷[%s]不是根卷", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10068": "在迁移Volume結构中,migrateVolumesBetweenSharedBlockGroupPrimaryStorageMsg 消息中没有卷!", + "ORG_ZSTACK_SCHEDULER_10013": "字段[%s]不能为空", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10067": "空的迁移卷結构在迁移卷於共享块组主儲儲消息中!", + "ORG_ZSTACK_VPCFIREWALL_10027": "規则叢[%s]已经包含一個具有規则编號%s的規则。", + "ORG_ZSTACK_IPSEC_10006": "网络 [uuid: %s] 没有 IPsec 服務", + "ORG_ZSTACK_VPCFIREWALL_10028": "無法添加防火墙規则[%d],仅TCP或UDP协议可以使用端口", + "ORG_ZSTACK_IPSEC_10007": "远程CIDR[%s]与已儲在的CIDR相同", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10000": "新建添加的网卡[uuids:%s]和已綁定的网卡不在同一個虚拟路由器上,它们分别位於虚拟路由器[uuids:%s]上", + "ORG_ZSTACK_IPSEC_10008": "远程CIDR[%s]和远程CIDR[%s]重叠", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10001": "新建添加虚拟機的网络接口[uuids:%s]和负载均衡器[uuid: %s]的VIP關聯的对端L3网络[uuids:%s]不在同一個虚拟路由器上,它们位於不同的虚拟路由器[uuids:%s]上", + "ORG_ZSTACK_IPSEC_10009": "本地路由器的CIDR[%s]与远程CIDR[%s]重叠", + "ORG_ZSTACK_IPSEC_10002": "當前端口范围[%s, %s]与VIP[uuid: %s]的已用端口范围[%s, %s]儲在冲突,协议:UDP", + "ORG_ZSTACK_IPSEC_10003": "cidr[%s]与關聯的L3Network [uuid:%s]的ipsec [uuid:%s]远程cidr[%s]重叠", + "ORG_ZSTACK_VPCFIREWALL_10029": "無法添加防火墙規则[%d],只有TCP协议可以使用TCP標誌", + "ORG_ZSTACK_IPSEC_10005": "%s", + "ORG_ZSTACK_VPCFIREWALL_10020": "無法将默認規则叢附加到其他网卡", + "ORG_ZSTACK_IPSEC_10000": "無法找到IPsec連接[uuid:%s],它可能已被刪除", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10006": "vmnic 必須指定以共享负载均衡器", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10073": "虚拟機[uuid: %s]没有額外的QMP套接字,可能是因为啟動虚拟機时未啟用全局配置[vm.additionalQmp],請確保已啟用並重啟zstack中的虚拟機", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10007": "無法找到负载均衡器 [uuid:%s] 所对应的虚拟路由器", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10072": "主要儲儲[uuid: %s]已附加了scsi lun[wwid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10071": "無法找到适合的主要儲儲[uuid:%s]的虚機類型以处理镜像格式或卷格式[%s]", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10004": "刷新负载均衡證书,因为:%s", + "ORG_ZSTACK_VPCFIREWALL_10021": "規则叢[%s]已经包含了一個l3[%s]", + "ORG_ZSTACK_SCHEDULER_10009": "触發作业[uuid: %s]失敗,因为%s", + "ORG_ZSTACK_ZWATCH_MYSQL_10001": "在 MySQL 命名空間[%s]中未找到", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_LB_10005": "刷新负载均衡监听器,因为:%s", + "ORG_ZSTACK_VPCFIREWALL_10022": "已经儲在一個编號为[%s]的規则", + "ORG_ZSTACK_SCHEDULER_10029": "不能将任務[uuid:%s]添加到一個無效触發器[uuid:%s]中", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10077": "共享卷[uuid: %s]在共享块组主儲儲上無法調整大小", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10076": "無法找到卷[uuid: %s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10075": "共享块[uuid:%s, 磁碟Uuid:%s, 描述:%s]已添加到新的共享块组[uuid:%s]中的共享块组中", + "ORG_ZSTACK_SCHEDULER_10028": "不能将作业[uuid:%s]两次添加到相同的触發器[uuid:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10074": "必須指定至少一個磁碟才能添加共享块组主儲儲", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10079": "無法找到卷[%s]的准备", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10078": "共享卷[uuid: %s]在共享块组主儲儲上已附加到未停止的虚拟機实例[uuids: %s]", + "ORG_ZSTACK_SCHEDULER_10021": "間隔必須在重复超過一次时使用简单調度器时設置", + "ORG_ZSTACK_VPCFIREWALL_10016": "只有TCP或UDP协议可以使用端口", + "ORG_ZSTACK_VPCFIREWALL_10017": "只有TCP协议可以使用TCP標誌", + "ORG_ZSTACK_IPSEC_10018": "該 VIP[%s] 已经被用於 %s", + "ORG_ZSTACK_VPCFIREWALL_10014": "規则叢[%s]已经包含一個具有規则编號%s的規则。", + "ORG_ZSTACK_IPSEC_10019": "peer地址[%s]不能与VIP地址相同", + "ORG_ZSTACK_VPCFIREWALL_10015": "無法更新默認規则[%s]", + "ORG_ZSTACK_IPSEC_10013": "所有在同一個IPsec連接中的网络必須附加到相同的VPC路由器", + "ORG_ZSTACK_IPSEC_10014": "HA组%s没有主VPC", + "ORG_ZSTACK_VPCFIREWALL_10018": "只有ICMP协议可以使用ICMP類型", + "ORG_ZSTACK_IPSEC_10015": "儲在使用旧IPsec插件的VPC[%s],請升級以創建IPsec隧道", + "ORG_ZSTACK_VPCFIREWALL_10019": "規则 [%s] 编號無效", + "ORG_ZSTACK_IPSEC_10016": "已经在同一虚拟路由器和对端地址上儲在IPsec連接[uuid:%s, name:%s]", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10080": "使用厚分配卷作为缓儲卷。卷[%s]的准备状态为%s", + "ORG_ZSTACK_IPSEC_10010": "所有在同一IPsec連接中的网络应同属一种類型", + "ORG_ZSTACK_IPSEC_10011": "IPsec連接只能指定 %s 中的一個网络", + "ORG_ZSTACK_IPSEC_10012": "L3网络 [uuid: %s] 尚未綁定到VPC路由器", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10084": "無法獲取卷 %s 的叢叢 UUID", + "ORG_ZSTACK_VPCFIREWALL_10010": "已经有一個名为%s的規则模板", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10081": "SCSI LUN[uuid: %s, wwid: %s] 已经挂载到主儲儲[uuid: %s]", + "ORG_ZSTACK_SCHEDULER_10038": "無效的cron表達式", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10086": "無法找到合适的 KVM 主機以供共享块组的主儲儲使用[uuid: %s]", + "ORG_ZSTACK_SCHEDULER_10039": "cron 任務必須遵循類似以下格式:\"0 0/3 17-23 * * ?\"", + "ORG_ZSTACK_STORAGE_PRIMARY_SHAREDBLOCK_10085": "sanlock 說主機 %s 在 %s 上线状态异常", + "ORG_ZSTACK_SCHEDULER_10036": "停止时間已過", + "ORG_ZSTACK_SCHEDULER_10037": "cron 必須在使用 cron 調度器时設置", + "ORG_ZSTACK_SCHEDULER_10034": "持續时間超出范围", + "ORG_ZSTACK_SCHEDULER_10035": "停止时間超出 MySQL 时間戳范围", + "ORG_ZSTACK_SCHEDULER_10032": "startTime 必須为简单調度器設置", + "ORG_ZSTACK_SCHEDULER_10033": "調度間隔必須为简单的調度器設置", + "ORG_ZSTACK_SCHEDULER_10030": "儲在 [%d] 個触發器添加到了作业[uuid:%s]中,無法再添加任何触發器。", + "ORG_ZSTACK_SCHEDULER_10031": "在作业组[uuid:%s]中已添加了[%d]個触發器,無法再添加任何更多。", + "ORG_ZSTACK_VPCFIREWALL_10005": "路由器 [uuid:%s] 没有主路由器", + "ORG_ZSTACK_VPCFIREWALL_10006": "VPC路由器[uuid:%s]已经有一個防火墙。", + "ORG_ZSTACK_VPCFIREWALL_10003": "無法刪除系統統默認規则叢", + "ORG_ZSTACK_VPCFIREWALL_10004": "無法刪除系統統默認規则", + "ORG_ZSTACK_VPCFIREWALL_10001": "只有系統統規则叢可以更改操作類型", + "ORG_ZSTACK_VPCFIREWALL_10000": "無法分离系統統默認規则叢", + "ORG_ZSTACK_SCHEDULER_10045": "作业组已包含 %d 個作业,仅剩 %d 個名額", + "ORG_ZSTACK_SCHEDULER_10043": "没有類型为[%s]的調度器Job工厂找到", + "ORG_ZSTACK_SCHEDULER_10044": "%d 個作业与作业组具有不同的作业類型", + "ORG_ZSTACK_SCHEDULER_10041": "開始时間必須是正整數或0", + "ORG_ZSTACK_SCHEDULER_10042": "開始时間超出范围", + "ORG_ZSTACK_SCHEDULER_10040": "cron 定时器只需指定 cron 任務", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10005": "請插入 zbox 到管理節點。", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10006": "失敗备份數据库: %s", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10003": "服務[%s]未運行", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10007": "另一個外部备份[uuid: %s]正在恢复中", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10002": "服務[%s]不支持重新加载配置", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10008": "both hostUuids 和 backupStorageUuids 都为空。您必須指定其中一個或两個。", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10001": "服務[%s]未注册", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10001": "某些卷[uuids:%s]恢复失敗。您可以重新連接以再次触發。", + "ORG_ZSTACK_CORE_EXTERNALSERVICE_10000": "服務[%s]已注册", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10002": "無法在 zbox 备份安装目录下找到 recover.conf。", + "ORG_ZSTACK_EXTERNALBACKUP_ZBOX_10004": "zbox 应該先插入到一個宿主機中。", + "ORG_ZSTACK_VPCFIREWALL_10069": "無法找到vpcFirewallIpSetTemplate[uuid:%s],它可能已被刪除", + "ORG_ZSTACK_VPCFIREWALL_10063": "綁定防火墙規则叢[%s]失敗,因为%s", + "ORG_ZSTACK_VPCFIREWALL_10064": "解綁規则叢失敗,可能已被刪除", + "ORG_ZSTACK_VPCFIREWALL_10061": "刪除防火墙規则在vRouter[%s]上失敗,因为%s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10010": "Fn::Select 超出范围,請检查您的 JSON 文件!", + "ORG_ZSTACK_VPCFIREWALL_10062": "更改 vRouter[%s] 的防火墙規则状态失敗,因为 %s", + "ORG_ZSTACK_VPCFIREWALL_10067": "無法找到与uuid:%s相關的vpcFirewall相關vRouter", + "ORG_ZSTACK_VPCFIREWALL_10068": "無法找到vpcFirewallRuleSet[uuid:%s],它可能已被刪除", + "ORG_ZSTACK_VPCFIREWALL_10065": "分离防火墙規则叢[%s]失敗,因为%s", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10014": "未找到參數 [%s]!", + "ORG_ZSTACK_VPCFIREWALL_10066": "無法找到vpcFirewall[uuid:%s],它可能已被刪除", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10013": "參數 [%s] 没有找到值或默認值!", + "ORG_ZSTACK_VPCFIREWALL_10060": "創建防火墙規则叢[%s]失敗,因为%s", + "ORG_ZSTACK_IMAGE_10046": "镜像[uuid:%s, 名称:%s]在备份儲儲[uuid:%s]中未被刪除", + "ORG_ZSTACK_IMAGE_10045": "該镜像[uuid:%s, 名称:%s]不在备份儲儲[uuid:%s]中", + "ORG_ZSTACK_IMAGE_10044": "該镜像[uuid:%s, name:%s]在任何备份儲儲中未被刪除", + "ORG_ZSTACK_IMAGE_10043": "镜像[uuid:%s, 名称:%s]'的状态[%s]在备份儲儲[uuid:%s]上不是Deleted状态", + "ORG_ZSTACK_IMAGE_10040": "detach iso[uuid=%s] from vm失敗,錯誤誤信息为%s", + "ORG_ZSTACK_VPCFIREWALL_10058": "刪除虚拟路由器[%s]上的防火墙,因为%s", + "ORG_ZSTACK_VPCFIREWALL_10052": "默認規则叢 %s 只能附加到一個接口转發上,但發现了与之相關的 %s 個接口", + "ORG_ZSTACK_VPCFIREWALL_10050": "防火墙 %s 相關的 VPC 不在運行状态", + "ORG_ZSTACK_VPCFIREWALL_10051": "無法刪除規则叢[%s],因为它仍然綁定到网络接口", + "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10020": "無法在'条件'中找到条件[%s]", + "ORG_ZSTACK_VPCFIREWALL_10056": "無法在vRouter[%s]上找到相關的l3[%] MAC地址", + "ORG_ZSTACK_VPCFIREWALL_10057": "創建防火墙規则[%s]失敗,因为%s", + "ORG_ZSTACK_VPCFIREWALL_10054": "同步防火墙配置失敗,因为 %s", + "ORG_ZSTACK_VPCFIREWALL_10055": "更新防火墙規则叢動作失敗,因为 %s", + "ORG_ZSTACK_VPCFIREWALL_10049": "規则叢 %s 無更改", + "ORG_ZSTACK_VPCFIREWALL_10047": "从 l3[%s] 斷開防火墙規则叢失敗,因为 %s", + "ORG_ZSTACK_VPCFIREWALL_10048": "在防火墙[%s],三层网络[%s],转發規则[%s]中找到重复的規则编號%s", + "ORG_ZSTACK_SSO_CAS_SERVICE_10002": "iam2 中儲在同名用戶[%s]", + "ORG_ZSTACK_SSO_CAS_SERVICE_10003": "重复 casLogin[%s, %s] 類型为[%s]", + "ORG_ZSTACK_SSO_CAS_SERVICE_10004": "無法找到類型为(%s)的CasLogin", + "ORG_ZSTACK_VPCFIREWALL_10041": "無法添加防火墙規则,因为描述長度 %s 不符合 ruleNo:%d 的要求", + "ORG_ZSTACK_VPCFIREWALL_10040": "無法添加防火墙規则,因为不儲在 ruleNo:%d 的状态", + "ORG_ZSTACK_VPCFIREWALL_10045": "配置文件中的防火墙規则有语法錯誤誤:%s", + "ORG_ZSTACK_VPCFIREWALL_10046": "将防火墙規则叢[%s]应用到L3[%s]失敗,因为%s", + "ORG_ZSTACK_VPCFIREWALL_10044": "配置文件格式錯誤誤", + "ORG_ZSTACK_VPCFIREWALL_10038": "無法添加防火墙規则,因为源IP長度:%s 不符合規则No:%d", + "ORG_ZSTACK_VPCFIREWALL_10039": "無法添加防火墙規则,因为目的IP長度:%s 不符合規则No:%d", + "ORG_ZSTACK_VPCFIREWALL_10036": "無法添加防火墙規则,因为規则號 %d 無效", + "ORG_ZSTACK_VPCFIREWALL_10037": "無法添加防火墙規则,因为規则No:%d没有对应的操作", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10002": "vyos 初始化命令失敗,因为:%s", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10001": "無法通過 SSH 連接到虚拟路由器[%s](配置後)", + "ORG_ZSTACK_VPCFIREWALL_10030": "無法添加防火墙規则[%d],因为只有ICMP协议可以使用ICMP類型", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10003": "無法更改虚拟路由器VM[uuid:%s]的网络接口[ip:%s, mac:%s]防火墙默認動作,因为%s", + "ORG_ZSTACK_VPCFIREWALL_10031": "無法添加防火墙規则[%d],因为只有tcp或udp协议可以使用端口", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10006": "無法在虚拟路由器 VM[uuid:%s] 上啟動 DHCP 服務器,因为 %s", + "ORG_ZSTACK_ZWATCH_FUNCTION_10014": "缺少必需參數", + "ORG_ZSTACK_ZWATCH_FUNCTION_10013": "未知參數", + "ORG_ZSTACK_VPCFIREWALL_10034": "無法添加防火墙規则[%d],因为只有TCP协议可以使用TCP標誌", + "ORG_ZSTACK_NETWORK_SERVICE_VIRTUALROUTER_VYOS_10007": "無法停止虚拟路由器VM[uuid:%s]上的DHCP服務器,因为%s", + "ORG_ZSTACK_VPCFIREWALL_10035": "無法添加防火墙規则[%d]因为%s" +} \ No newline at end of file From a7d015cb0e85bbd1593efd2b3d83ab8d3ff743f2 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Thu, 29 Jan 2026 17:54:52 +0800 Subject: [PATCH 721/737] [telemetry]: Fix OpenTelemetry and Sentry init order - Thread/async: Use TelemetryFacade-injected Tracer in ThreadFacadeImpl so spans and context propagate correctly in thread-pool and async tasks (fixes missing traces when crossing threads). - Sentry init: Move Sentry setup out of Platform into SentryInitHelper; init only after TelemetryFacade builds its OpenTelemetry SDK to avoid global tracer conflict and 'already registered' with sentry-opentelemetry. - Add LazySentryExporter: create SentrySpanExporter on first export/flush after SentryInitHelper.initIfNeeded(); SentryExporterProvider now returns LazySentryExporter instead of calling Sentry.init() at provider creation. - TelemetryFacadeImpl: Do not call buildAndRegisterGlobal(); use instance tracerProvider for all spans; call SentryInitHelper.initIfNeeded() after building SDK when Sentry config is present. - Trace propagation: CloudBusImpl3, RESTFacadeImpl, TracingAspect, DispatchQueueImpl, SimpleFlowChain, RestServer keep/use trace context consistently. - Docs and config: Update TELEMETRY_SPECIFICATION.md (W3C Trace Context, CloudBus message context); telemetry.xml and TelemetryGlobalProperty adjustments; pom dependency updates (root, build, core, rest). Resolves: ZSTAC-67534 Change-Id: I7762777169796e63626d6b6f747062617a7a786e Signed-off-by: AlanJager --- build/pom.xml | 19 ++++ conf/springConfigXml/telemetry.xml | 13 ++- core/pom.xml | 18 +++- .../main/java/org/zstack/core/Platform.java | 17 --- .../zstack/core/cloudbus/CloudBusImpl3.java | 14 +-- .../org/zstack/core/rest/RESTFacadeImpl.java | 6 +- .../core/telemetry/LazySentryExporter.java | 71 ++++++++++++ .../telemetry/SentryExporterProvider.java | 58 +++------- .../core/telemetry/SentryInitHelper.java | 101 ++++++++++++++++++ .../core/telemetry/TelemetryFacadeImpl.java | 57 +++++++--- .../telemetry/TelemetryGlobalProperty.java | 9 ++ .../telemetry/TelemetryMetricsFacadeImpl.java | 6 ++ .../zstack/core/telemetry/TracingAspect.java | 6 +- .../zstack/core/thread/DispatchQueueImpl.java | 6 +- .../zstack/core/thread/ThreadFacadeImpl.java | 44 ++------ .../zstack/core/workflow/SimpleFlowChain.java | 6 +- docs/TELEMETRY_SPECIFICATION.md | 96 +++++++++++++++++ pom.xml | 29 ++++- rest/pom.xml | 9 ++ .../main/java/org/zstack/rest/RestServer.java | 7 +- 20 files changed, 442 insertions(+), 150 deletions(-) create mode 100644 core/src/main/java/org/zstack/core/telemetry/LazySentryExporter.java create mode 100644 core/src/main/java/org/zstack/core/telemetry/SentryInitHelper.java diff --git a/build/pom.xml b/build/pom.xml index 4e3d0cf35ca..bb55c36cce8 100755 --- a/build/pom.xml +++ b/build/pom.xml @@ -719,6 +719,25 @@ core ${project.version} + + io.sentry + sentry + + + io.sentry + sentry-opentelemetry-core + + + io.sentry + sentry-opentelemetry-bootstrap + + + + + + io.opentelemetry + opentelemetry-semconv + org.zstack external-service diff --git a/conf/springConfigXml/telemetry.xml b/conf/springConfigXml/telemetry.xml index 3055826edde..d6407e1ecf5 100644 --- a/conf/springConfigXml/telemetry.xml +++ b/conf/springConfigXml/telemetry.xml @@ -12,7 +12,16 @@ http://zstack.org/schema/zstack/plugin.xsd" default-init-method="init" default-destroy-method="destroy"> - - + + + + + + + + + + + diff --git a/core/pom.xml b/core/pom.xml index 6bd776ff676..701fd40f057 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -140,8 +140,8 @@ io.sentry sentry - 8.29.0 + io.opentelemetry @@ -167,6 +167,11 @@ io.opentelemetry.semconv opentelemetry-semconv + + + io.opentelemetry + opentelemetry-semconv + io.opentelemetry opentelemetry-sdk-metrics @@ -178,7 +183,16 @@ io.sentry sentry-opentelemetry-core - true + + + io.sentry + sentry-opentelemetry-bootstrap + + + + + io.opentelemetry.semconv + opentelemetry-semconv-incubating diff --git a/core/src/main/java/org/zstack/core/Platform.java b/core/src/main/java/org/zstack/core/Platform.java index a48fc6a43f8..5cff425e3da 100755 --- a/core/src/main/java/org/zstack/core/Platform.java +++ b/core/src/main/java/org/zstack/core/Platform.java @@ -1,6 +1,5 @@ package org.zstack.core; -import io.sentry.Sentry; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.LocaleUtils; import org.apache.commons.lang.RandomStringUtils; @@ -395,21 +394,6 @@ private static void prepareDefaultDbProperties() { } } - private static void setUpSentry() { - if (!CloudBusGlobalProperty.SENTRY_ON) { - logger.debug("Sentry is disabled"); - return; - } - - try { - logger.info("Initializing Sentry error tracking..."); - Sentry.init(); - logger.info("Sentry error tracking initialized successfully"); - } catch (Exception e) { - logger.warn("Failed to initialize Sentry error tracking, continuing without it", e); - } - } - private static void prepareHibernateSearchProperties() { if (!SearchGlobalProperty.SearchAutoRegister) { System.setProperty("Search.autoRegister", "false"); @@ -518,7 +502,6 @@ private static void prepareHibernateSearchProperties() { validateGlobalProperty(); prepareDefaultDbProperties(); prepareHibernateSearchProperties(); - setUpSentry(); callStaticInitMethods(); encryptedMethodsMap = getAllEncryptPassword(); writePidFile(); diff --git a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java index 7653393b7ec..93e8555b875 100755 --- a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java +++ b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java @@ -146,11 +146,7 @@ public class CloudBusImpl3 implements CloudBus, CloudBusIN { private TelemetryFacade getTelemetryFacade() { if (telemetryFacade == null && TelemetryGlobalProperty.ENABLED) { - try { - telemetryFacade = Platform.getComponentLoader().getComponent(TelemetryFacade.class); - } catch (Exception e) { - logger.trace("TelemetryFacade not available", e); - } + telemetryFacade = Platform.getComponentLoader().getComponentNoExceptionWhenNotExisting(TelemetryFacade.class); } return telemetryFacade; } @@ -910,6 +906,8 @@ public Void call() { .setSpanKind(SpanKind.CONSUMER) .setParent(parentContext != null ? parentContext : Context.current()) .setAttribute("messaging.system", "cloudbus") + .setAttribute("messaging.destination.name", serv.getId()) + .setAttribute("messaging.message.id", msg.getId()) .setAttribute("messaging.destination", serv.getId()) .setAttribute("messaging.message_id", msg.getId()) .setAttribute("messaging.message_class", msg.getClass().getName()) @@ -939,13 +937,15 @@ public Void call() { } else { replyErrorByMessageType(msg, inerr(ORG_ZSTACK_CORE_CLOUDBUS_10008, t.getMessage())); - if (CloudBusGlobalProperty.SENTRY_ON) { + // Sentry 仅由 TelemetryFacade 在注册全局 OpenTelemetry 后 init;此处只判断是否已启用 + if (CloudBusGlobalProperty.SENTRY_ON && Sentry.isEnabled()) { try { Sentry.configureScope(scopeConfig -> { scopeConfig.setExtra("message.dump", dumpMessage(msg)); scopeConfig.setTag("service.id", serv.getId()); scopeConfig.setTag("message.class", msg.getClass().getSimpleName()); }); + Sentry.captureException(t); } catch (Exception sentryEx) { logger.warn("Failed to capture exception with Sentry", sentryEx); } @@ -1392,6 +1392,8 @@ private FutureCompletion doSend(Message msg) { .spanBuilder("CloudBus Send: " + msg.getClass().getSimpleName()) .setSpanKind(SpanKind.PRODUCER) .setAttribute("messaging.system", "cloudbus") + .setAttribute("messaging.destination.name", msg.getServiceId()) + .setAttribute("messaging.message.id", msg.getId()) .setAttribute("messaging.destination", msg.getServiceId()) .setAttribute("messaging.message_id", msg.getId()) .setAttribute("messaging.message_class", msg.getClass().getName()) diff --git a/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java b/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java index 6335721ce52..516fd500ef6 100755 --- a/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java @@ -111,11 +111,7 @@ protected boolean removeEldestEntry(Map.Entry eldest) { private TelemetryFacade getTelemetryFacade() { if (telemetryFacade == null && TelemetryGlobalProperty.ENABLED) { - try { - telemetryFacade = Platform.getComponentLoader().getComponent(TelemetryFacade.class); - } catch (Exception e) { - logger.trace("TelemetryFacade not available", e); - } + telemetryFacade = Platform.getComponentLoader().getComponentNoExceptionWhenNotExisting(TelemetryFacade.class); } return telemetryFacade; } diff --git a/core/src/main/java/org/zstack/core/telemetry/LazySentryExporter.java b/core/src/main/java/org/zstack/core/telemetry/LazySentryExporter.java new file mode 100644 index 00000000000..5527332d98f --- /dev/null +++ b/core/src/main/java/org/zstack/core/telemetry/LazySentryExporter.java @@ -0,0 +1,71 @@ +package org.zstack.core.telemetry; + +import io.opentelemetry.sdk.common.CompletableResultCode; +import io.opentelemetry.sdk.trace.data.SpanData; +import io.opentelemetry.sdk.trace.export.SpanExporter; +import io.sentry.Sentry; +import io.sentry.opentelemetry.SentrySpanExporter; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import java.util.Collection; + +/** + * Creates SentrySpanExporter lazily on first export/flush/shutdown (after SentryInitHelper.initIfNeeded). + * Allows TelemetryFacadeImpl to build the OpenTelemetry SDK first, then trigger Sentry, avoiding + * Sentry/OpenTelemetry registering the global tracer first and causing "already registered". + */ +final class LazySentryExporter implements SpanExporter { + private static final CLogger logger = Utils.getLogger(LazySentryExporter.class); + private volatile SpanExporter delegate; + + private SpanExporter getDelegate() { + if (delegate != null) { + return delegate; + } + synchronized (this) { + if (delegate != null) { + return delegate; + } + if (!SentryInitHelper.initIfNeeded() || !Sentry.isEnabled()) { + logger.warn("LazySentryExporter: Sentry not initialized, spans will be dropped"); + return null; + } + try { + delegate = new SentrySpanExporter(); + logger.info("LazySentryExporter: created Sentry span exporter (first use)"); + } catch (Exception e) { + logger.error("LazySentryExporter: failed to create SentrySpanExporter: " + e.getMessage(), e); + return null; + } + } + return delegate; + } + + @Override + public CompletableResultCode export(Collection spans) { + SpanExporter d = getDelegate(); + if (d == null) { + return CompletableResultCode.ofSuccess(); + } + return d.export(spans); + } + + @Override + public CompletableResultCode flush() { + SpanExporter d = getDelegate(); + if (d == null) { + return CompletableResultCode.ofSuccess(); + } + return d.flush(); + } + + @Override + public CompletableResultCode shutdown() { + SpanExporter d = delegate; + if (d == null) { + return CompletableResultCode.ofSuccess(); + } + return d.shutdown(); + } +} diff --git a/core/src/main/java/org/zstack/core/telemetry/SentryExporterProvider.java b/core/src/main/java/org/zstack/core/telemetry/SentryExporterProvider.java index 622bcdc2b4a..80133440a27 100644 --- a/core/src/main/java/org/zstack/core/telemetry/SentryExporterProvider.java +++ b/core/src/main/java/org/zstack/core/telemetry/SentryExporterProvider.java @@ -4,12 +4,14 @@ import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; +/** + * Sentry span exporter provider. Does not call Sentry.init() or new SentrySpanExporter() here to + * avoid registering GlobalOpenTelemetry early. Returns LazySentryExporter; real exporter is + * created on first export after Sentry init; Sentry's single init is in TelemetryFacadeImpl. + */ public class SentryExporterProvider implements TelemetryExporterProvider { private static final CLogger logger = Utils.getLogger(SentryExporterProvider.class); private static final String NAME = "sentry"; - private static final String SENTRY_EXPORTER_CLASS = "io.sentry.opentelemetry.SentrySpanExporter"; - - private volatile Boolean available = null; @Override public String getName() { @@ -18,53 +20,17 @@ public String getName() { @Override public boolean isAvailable() { - if (available == null) { - synchronized (this) { - if (available == null) { - available = checkSentryAvailable(); - } - } - } - return available; - } - - private boolean checkSentryAvailable() { - try { - Class.forName(SENTRY_EXPORTER_CLASS); - return true; - } catch (ClassNotFoundException e) { - logger.debug("Sentry OpenTelemetry integration not available on classpath"); - return false; - } catch (NoClassDefFoundError e) { - logger.debug("Sentry OpenTelemetry integration class not found at runtime: " + e.getMessage()); - return false; - } catch (ExceptionInInitializerError e) { - logger.debug("Sentry OpenTelemetry integration initialization error: " + e.getMessage()); - return false; - } catch (LinkageError e) { - logger.debug("Sentry OpenTelemetry integration linkage error: " + e.getMessage()); - return false; - } + boolean configPresent = SentryInitHelper.isConfigPresent(); + logger.trace("SentryExporterProvider.isAvailable: isConfigPresent()=" + configPresent + " (no Sentry.init here)"); + return configPresent; } - + @Override public SpanExporter createExporter() { - if (!isAvailable()) { - logger.warn("Sentry exporter requested but sentry-opentelemetry-core is not on classpath"); - return null; - } - - try { - Class exporterClass = Class.forName(SENTRY_EXPORTER_CLASS); - SpanExporter exporter = (SpanExporter) exporterClass.getDeclaredConstructor().newInstance(); - logger.info("Created Sentry span exporter"); - return exporter; - } catch (Exception e) { - logger.error(String.format("Failed to create Sentry exporter: %s", e.getMessage()), e); - return null; - } + logger.trace("SentryExporterProvider.createExporter: returning LazySentryExporter (init deferred)"); + return new LazySentryExporter(); } - + @Override public int getOrder() { return 100; diff --git a/core/src/main/java/org/zstack/core/telemetry/SentryInitHelper.java b/core/src/main/java/org/zstack/core/telemetry/SentryInitHelper.java new file mode 100644 index 00000000000..0c04c95801f --- /dev/null +++ b/core/src/main/java/org/zstack/core/telemetry/SentryInitHelper.java @@ -0,0 +1,101 @@ +package org.zstack.core.telemetry; + +import io.sentry.Sentry; +import org.zstack.core.cloudbus.CloudBusGlobalProperty; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +/** + * Centralizes Sentry initialization so Platform is not coupled to Sentry. DSN and tracesSampleRate + * are resolved here and passed to Sentry.init(). The single init entry is TelemetryFacadeImpl + * (calls initIfNeeded after building the OpenTelemetry SDK). CloudBus only uses Sentry.isEnabled() + * to decide whether to report errors and does not call initIfNeeded. + */ +public final class SentryInitHelper { + private static final CLogger logger = Utils.getLogger(SentryInitHelper.class); + private static final Object INIT_LOCK = new Object(); + + private SentryInitHelper() { + } + + /** + * Initializes Sentry from config if not yet initialized; no-op if already initialized or not + * configured. Thread-safe; concurrent calls result in a single init. + * + * @return true if Sentry is available (can create SentrySpanExporter or use Sentry API) + */ + public static boolean initIfNeeded() { + if (Sentry.isEnabled()) { + logger.trace("SentryInitHelper.initIfNeeded: Sentry already enabled, return true"); + return true; + } + if (!CloudBusGlobalProperty.SENTRY_ON) { + logger.trace("SentryInitHelper.initIfNeeded: CloudBus.sentryOn=false, return false"); + return false; + } + + synchronized (INIT_LOCK) { + if (Sentry.isEnabled()) { + logger.trace("SentryInitHelper.initIfNeeded: Sentry already enabled (by another thread), return true"); + return true; + } + logger.trace("SentryInitHelper.initIfNeeded: Sentry.isEnabled()=false, CloudBus.sentryOn=true, resolving DSN"); + String dsn = resolveDsn(); + logger.trace("SentryInitHelper.initIfNeeded: resolveDsn() returned " + (dsn == null || dsn.isEmpty() ? "null/empty" : "non-empty (length=" + dsn.length() + ")")); + if (dsn == null || dsn.isEmpty()) { + logger.trace("Sentry skipped: no DSN configured (set Telemetry.sentryDsn or sentry.dsn or SENTRY_DSN to enable)"); + return false; + } + + try { + double tracesSampleRate = TelemetryGlobalProperty.SENTRY_TRACES_SAMPLE_RATE; + logger.trace("SentryInitHelper.initIfNeeded: calling Sentry.init() with tracesSampleRate=" + tracesSampleRate); + String finalDsn = dsn; + Sentry.init(options -> { + options.setDsn(finalDsn); + options.setTracesSampleRate(tracesSampleRate); + }); + logger.info("Sentry initialized (tracesSampleRate=" + tracesSampleRate + ")"); + return true; + } catch (Exception e) { + logger.warn("Failed to initialize Sentry, continuing without it: " + e.getMessage(), e); + return false; + } + } + } + + /** + * Checks only that config is present (CloudBus.sentryOn + DSN); does not call Sentry.init(). + * Used by SentryExporterProvider.isAvailable() to avoid triggering Sentry/OpenTelemetry global + * registration before buildExporters. + */ + public static boolean isConfigPresent() { + if (!CloudBusGlobalProperty.SENTRY_ON) { + return false; + } + String dsn = resolveDsn(); + return dsn != null && !dsn.trim().isEmpty(); + } + + /** + * DSN resolution order: Telemetry.sentryDsn -> sentry.dsn system property -> SENTRY_DSN env. + */ + private static String resolveDsn() { + if (TelemetryGlobalProperty.SENTRY_DSN != null && !TelemetryGlobalProperty.SENTRY_DSN.trim().isEmpty()) { + logger.trace("SentryInitHelper.resolveDsn: using Telemetry.sentryDsn (length=" + TelemetryGlobalProperty.SENTRY_DSN.trim().length() + ")"); + return TelemetryGlobalProperty.SENTRY_DSN.trim(); + } + String sysDsn = System.getProperty("sentry.dsn"); + if (sysDsn != null && !sysDsn.trim().isEmpty()) { + logger.trace("SentryInitHelper.resolveDsn: using System property sentry.dsn"); + return sysDsn.trim(); + } + String envDsn = System.getenv("SENTRY_DSN"); + if (envDsn != null && !envDsn.trim().isEmpty()) { + logger.trace("SentryInitHelper.resolveDsn: using env SENTRY_DSN"); + return envDsn.trim(); + } + logger.trace("SentryInitHelper.resolveDsn: no DSN from any source"); + return null; + } +} diff --git a/core/src/main/java/org/zstack/core/telemetry/TelemetryFacadeImpl.java b/core/src/main/java/org/zstack/core/telemetry/TelemetryFacadeImpl.java index 3713a567827..5831612acd3 100644 --- a/core/src/main/java/org/zstack/core/telemetry/TelemetryFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/telemetry/TelemetryFacadeImpl.java @@ -44,6 +44,7 @@ public class TelemetryFacadeImpl implements TelemetryFacade, Component { @Override public boolean start() { + logger.info("TelemetryFacade.start() invoked (Telemetry.enabled=" + TelemetryGlobalProperty.ENABLED + ", exporters=" + TelemetryGlobalProperty.EXPORTERS + ")"); if (!TelemetryGlobalProperty.ENABLED) { logger.info("Telemetry is disabled by configuration"); return true; @@ -51,13 +52,16 @@ public boolean start() { // Idempotency: avoid buildAndRegisterGlobal() being called when global is already registered synchronized (this) { + logger.trace("TelemetryFacade.start() inside synchronized, initialized=" + initialized); if (initialized) { logger.info("Telemetry already initialized, skipping re-initialization"); return true; } try { + logger.trace("TelemetryFacade: calling registerBuiltInProviders()"); registerBuiltInProviders(); + logger.trace("TelemetryFacade: calling initializeOpenTelemetry(), providers=" + exporterProviders.keySet()); initializeOpenTelemetry(); initialized = true; logger.info(String.format("Telemetry initialized successfully: environment=%s, exporters=%s", @@ -72,14 +76,20 @@ public boolean start() { } private void registerBuiltInProviders() { + logger.trace("TelemetryFacade: registering OtlpExporterProvider"); registerProvider(new OtlpExporterProvider()); + logger.trace("TelemetryFacade: registering SentryExporterProvider"); registerProvider(new SentryExporterProvider()); } public void registerProvider(TelemetryExporterProvider provider) { - exporterProviders.put(provider.getName().toLowerCase(Locale.ROOT), provider); - logger.debug(String.format("Registered telemetry exporter provider: %s (available=%s)", - provider.getName(), provider.isAvailable())); + String name = provider.getName().toLowerCase(Locale.ROOT); + exporterProviders.put(name, provider); + boolean available = provider.isAvailable(); + logger.trace(String.format("Registered telemetry exporter provider: %s (available=%s)", provider.getName(), available)); + if ("sentry".equals(name)) { + logger.info("Sentry exporter provider registered (available=" + available + ")"); + } } @Override @@ -89,6 +99,7 @@ public boolean stop() { } private void initializeOpenTelemetry() { + logger.trace("TelemetryFacade: building resource (serviceName=" + TelemetryGlobalProperty.SERVICE_NAME + ", environment=" + TelemetryGlobalProperty.ENVIRONMENT + ")"); Resource resource = Resource.getDefault().merge( Resource.create(Attributes.of( AttributeKey.stringKey("service.name"), TelemetryGlobalProperty.SERVICE_NAME, @@ -98,8 +109,10 @@ private void initializeOpenTelemetry() { AttributeKey.stringKey("deployment.environment"), TelemetryGlobalProperty.ENVIRONMENT))); ZStackSampler sampler = new ZStackSampler(); + logger.trace("TelemetryFacade: calling buildExporters()"); List exporters = buildExporters(); + logger.trace("TelemetryFacade: buildExporters() returned " + exporters.size() + " exporter(s)"); SdkTracerProviderBuilder tracerProviderBuilder = SdkTracerProvider.builder() .setResource(resource) @@ -124,16 +137,19 @@ private void initializeOpenTelemetry() { } tracerProvider = tracerProviderBuilder.build(); - - // Idempotency protection: buildAndRegisterGlobal() throws IllegalStateException if already registered - try { - openTelemetry = OpenTelemetrySdk.builder() - .setTracerProvider(tracerProvider) - .buildAndRegisterGlobal(); - } catch (IllegalStateException e) { - // If already registered, use existing instance - logger.warn("Global OpenTelemetry already registered, using existing instance", e); - openTelemetry = GlobalOpenTelemetry.get(); + logger.trace("TelemetryFacade: SdkTracerProvider built"); + + // Do not call buildAndRegisterGlobal() to avoid conflict with early registrants like + // sentry-opentelemetry-bootstrap. All spans are created via TelemetryFacade.getTracer()/ + // startSpan() using this instance's tracerProvider (including Sentry exporter). + openTelemetry = OpenTelemetrySdk.builder() + .setTracerProvider(tracerProvider) + .build(); + logger.trace("TelemetryFacade: OpenTelemetry SDK built (not registered globally; use our instance for Sentry)"); + + // Single Sentry init entry for CloudBus error reporting and LazySentryExporter + if (SentryInitHelper.isConfigPresent()) { + SentryInitHelper.initIfNeeded(); } defaultTracer = openTelemetry.getTracer(INSTRUMENTATION_NAME); @@ -199,6 +215,7 @@ public CompletableResultCode shutdown() { private List buildExporters() { List exporters = new ArrayList<>(); String exporterConfig = TelemetryGlobalProperty.EXPORTERS; + logger.trace("TelemetryFacade.buildExporters: Telemetry.EXPORTERS='" + exporterConfig + "', registeredProviders=" + exporterProviders.keySet()); if (exporterConfig == null || exporterConfig.trim().isEmpty()) { logger.info("No exporters configured, traces will not be exported"); @@ -206,32 +223,40 @@ private List buildExporters() { } List requestedExporters = Arrays.asList(exporterConfig.toLowerCase(Locale.ROOT).split(",")); + logger.trace("TelemetryFacade.buildExporters: requested exporter names=" + requestedExporters); for (String exporterName : requestedExporters) { String name = exporterName.trim(); if (name.isEmpty()) { continue; } + logger.trace("TelemetryFacade.buildExporters: processing exporter '" + name + "'"); TelemetryExporterProvider provider = exporterProviders.get(name); if (provider == null) { logger.warn(String.format("Unknown exporter '%s', available: %s", name, exporterProviders.keySet())); continue; } + logger.trace("TelemetryFacade.buildExporters: provider for '" + name + "' found, checking isAvailable()"); if (!provider.isAvailable()) { - logger.warn( - String.format("Exporter '%s' is not available (missing dependencies or configuration)", name)); + if ("sentry".equals(name)) { + logger.warn("Exporter 'sentry' is not available: ensure CloudBus.sentryOn=true and Telemetry.sentryDsn (or sentry.dsn) is set in zstack.properties, then restart"); + } else { + logger.warn(String.format("Exporter '%s' is not available (missing dependencies or configuration)", name)); + } continue; } SpanExporter exporter = provider.createExporter(); + logger.trace("TelemetryFacade.buildExporters: createExporter() for '" + name + "' returned " + (exporter != null ? "non-null" : "null")); if (exporter != null) { exporters.add(exporter); logger.info(String.format("Enabled exporter: %s", name)); } } + logger.trace("TelemetryFacade.buildExporters: total exporters created=" + exporters.size()); if (exporters.isEmpty()) { logger.warn("No exporters were successfully created, traces will not be exported"); } @@ -278,9 +303,11 @@ public Span startSpan(String spanName, Map attributes) { @Override public Span startSpan(String spanName, Context parentContext, Map attributes) { if (!isEnabled()) { + logger.trace("TelemetryFacade.startSpan: skipped (telemetry not enabled), name=" + spanName); return Span.getInvalid(); } + logger.trace("TelemetryFacade.startSpan: creating span name=" + spanName); SpanBuilder spanBuilder = defaultTracer.spanBuilder(spanName); if (parentContext != null) { diff --git a/core/src/main/java/org/zstack/core/telemetry/TelemetryGlobalProperty.java b/core/src/main/java/org/zstack/core/telemetry/TelemetryGlobalProperty.java index 7ef1e6ce0f8..958682ac983 100644 --- a/core/src/main/java/org/zstack/core/telemetry/TelemetryGlobalProperty.java +++ b/core/src/main/java/org/zstack/core/telemetry/TelemetryGlobalProperty.java @@ -69,6 +69,15 @@ public class TelemetryGlobalProperty { @GlobalProperty(name = "Telemetry.sentryDsn", defaultValue = "") public static String SENTRY_DSN; + /** + * Sentry traces sample rate (0.0 to 1.0). + * Must be set in Sentry.init() via options.setTracesSampleRate(), otherwise Sentry may drop + * transactions from OTel SentrySpanExporter and Performance/Traces will be empty. + * Default 1.0 for full sampling; in production consider 0.1 or lower. + */ + @GlobalProperty(name = "Telemetry.sentryTracesSampleRate", defaultValue = "1.0") + public static double SENTRY_TRACES_SAMPLE_RATE; + /** * Service name reported in traces. */ diff --git a/core/src/main/java/org/zstack/core/telemetry/TelemetryMetricsFacadeImpl.java b/core/src/main/java/org/zstack/core/telemetry/TelemetryMetricsFacadeImpl.java index 59a960cd67d..78f144db130 100644 --- a/core/src/main/java/org/zstack/core/telemetry/TelemetryMetricsFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/telemetry/TelemetryMetricsFacadeImpl.java @@ -54,12 +54,14 @@ public class TelemetryMetricsFacadeImpl implements TelemetryMetricsFacade, Compo @Override public boolean start() { + logger.trace("TelemetryMetricsFacade.start() invoked (Telemetry.enabled=" + TelemetryGlobalProperty.ENABLED + ", metricsEnabled=" + TelemetryGlobalProperty.METRICS_ENABLED + ")"); if (!TelemetryGlobalProperty.ENABLED || !TelemetryGlobalProperty.METRICS_ENABLED) { logger.info("Telemetry metrics disabled by configuration"); return true; } try { + logger.trace("TelemetryMetricsFacade: calling initializeMetrics()"); initializeMetrics(); initialized = true; logger.info(String.format("Telemetry metrics initialized on port %d", @@ -79,6 +81,7 @@ public boolean stop() { } private void initializeMetrics() { + logger.trace("TelemetryMetricsFacade.initializeMetrics: building resource (serviceName=" + TelemetryGlobalProperty.SERVICE_NAME + ", port=" + TelemetryGlobalProperty.PROMETHEUS_PORT + ")"); Resource resource = Resource.getDefault().merge( Resource.create(Attributes.of( AttributeKey.stringKey("service.name"), TelemetryGlobalProperty.SERVICE_NAME, @@ -87,13 +90,16 @@ private void initializeMetrics() { prometheusReader = PrometheusHttpServer.builder() .setPort(TelemetryGlobalProperty.PROMETHEUS_PORT) .build(); + logger.trace("TelemetryMetricsFacade.initializeMetrics: PrometheusHttpServer built on port " + TelemetryGlobalProperty.PROMETHEUS_PORT); meterProvider = SdkMeterProvider.builder() .setResource(resource) .registerMetricReader(prometheusReader) .build(); + logger.trace("TelemetryMetricsFacade.initializeMetrics: SdkMeterProvider built"); meter = meterProvider.get(INSTRUMENTATION_SCOPE); + logger.trace("TelemetryMetricsFacade.initializeMetrics: registering gauges and histograms"); registerThreadPoolGauges(); registerTaskQueueGauges(); diff --git a/core/src/main/java/org/zstack/core/telemetry/TracingAspect.java b/core/src/main/java/org/zstack/core/telemetry/TracingAspect.java index 7a266bf11df..c1107529743 100644 --- a/core/src/main/java/org/zstack/core/telemetry/TracingAspect.java +++ b/core/src/main/java/org/zstack/core/telemetry/TracingAspect.java @@ -57,11 +57,7 @@ private TelemetryFacade getTelemetryFacade() { if (telemetryFacade == null && TelemetryGlobalProperty.ENABLED) { synchronized (this) { if (telemetryFacade == null) { - try { - telemetryFacade = Platform.getComponentLoader().getComponent(TelemetryFacade.class); - } catch (Exception e) { - logger.trace("TelemetryFacade not available", e); - } + telemetryFacade = Platform.getComponentLoader().getComponentNoExceptionWhenNotExisting(TelemetryFacade.class); } } } diff --git a/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java b/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java index 0197b21575a..e298cdd787f 100755 --- a/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java +++ b/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java @@ -252,11 +252,7 @@ public DispatchQueueImpl() { private TelemetryFacade getTelemetryFacade() { if (telemetryFacade == null && TelemetryGlobalProperty.ENABLED) { - try { - telemetryFacade = Platform.getComponentLoader().getComponent(TelemetryFacade.class); - } catch (Exception e) { - logger.trace("TelemetryFacade not available", e); - } + telemetryFacade = Platform.getComponentLoader().getComponentNoExceptionWhenNotExisting(TelemetryFacade.class); } return telemetryFacade; } diff --git a/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java b/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java index 2ee713f7723..2f8d4d5b425 100755 --- a/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java @@ -6,7 +6,6 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import org.springframework.beans.factory.annotation.Autowired; -import org.zstack.core.Platform; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.jmx.JmxFacade; import org.zstack.core.telemetry.TelemetryFacade; @@ -41,47 +40,26 @@ public class ThreadFacadeImpl implements ThreadFacade, ThreadFactory, RejectedEx private JmxFacade jmxf; @Autowired private PluginRegistry pluginRegistry; - - private volatile TelemetryFacade telemetryFacade; - private volatile TelemetryMetricsFacade metricsFacade; - + @Autowired(required = false) + private TelemetryFacade telemetryFacade; + @Autowired(required = false) + private TelemetryMetricsFacade metricsFacade; + private TelemetryFacade getTelemetryFacade() { - if (telemetryFacade == null && TelemetryGlobalProperty.ENABLED) { - synchronized (this) { - if (telemetryFacade == null) { - try { - telemetryFacade = Platform.getComponentLoader().getComponent(TelemetryFacade.class); - } catch (Exception e) { - _logger.trace("TelemetryFacade not available", e); - } - } - } - } return telemetryFacade; } - + private boolean isTelemetryEnabled() { - return TelemetryGlobalProperty.ENABLED && getTelemetryFacade() != null && getTelemetryFacade().isEnabled(); + return TelemetryGlobalProperty.ENABLED && telemetryFacade != null && telemetryFacade.isEnabled(); } - + private TelemetryMetricsFacade getMetricsFacade() { - if (metricsFacade == null && TelemetryGlobalProperty.ENABLED && TelemetryGlobalProperty.METRICS_ENABLED) { - synchronized (this) { - if (metricsFacade == null) { - try { - metricsFacade = Platform.getComponentLoader().getComponent(TelemetryMetricsFacade.class); - } catch (Exception e) { - _logger.trace("TelemetryMetricsFacade not available", e); - } - } - } - } return metricsFacade; } - + private boolean isMetricsEnabled() { - return TelemetryGlobalProperty.ENABLED && TelemetryGlobalProperty.METRICS_ENABLED - && getMetricsFacade() != null && getMetricsFacade().isEnabled(); + return TelemetryGlobalProperty.ENABLED && TelemetryGlobalProperty.METRICS_ENABLED + && metricsFacade != null && metricsFacade.isEnabled(); } private void collectAndReportMetrics() { diff --git a/core/src/main/java/org/zstack/core/workflow/SimpleFlowChain.java b/core/src/main/java/org/zstack/core/workflow/SimpleFlowChain.java index dd5c326913e..a78a2172e97 100755 --- a/core/src/main/java/org/zstack/core/workflow/SimpleFlowChain.java +++ b/core/src/main/java/org/zstack/core/workflow/SimpleFlowChain.java @@ -87,11 +87,7 @@ private static TelemetryFacade getTelemetryFacade() { if (telemetryFacade == null && TelemetryGlobalProperty.ENABLED) { synchronized (SimpleFlowChain.class) { if (telemetryFacade == null) { - try { - telemetryFacade = Platform.getComponentLoader().getComponent(TelemetryFacade.class); - } catch (Exception e) { - logger.trace("TelemetryFacade not available", e); - } + telemetryFacade = Platform.getComponentLoader().getComponentNoExceptionWhenNotExisting(TelemetryFacade.class); } } } diff --git a/docs/TELEMETRY_SPECIFICATION.md b/docs/TELEMETRY_SPECIFICATION.md index 74d411f6664..884f0317daf 100644 --- a/docs/TELEMETRY_SPECIFICATION.md +++ b/docs/TELEMETRY_SPECIFICATION.md @@ -530,6 +530,8 @@ Secondary exporter for error tracking integration. **Java**: Uses reflection, optional dependency **Python**: Use `sentry-sdk[opentelemetry]` +**Sentry 展示对齐**:CloudBus 使用可搜索的 span 名(`CloudBus Send: ...`、`CloudBus Handle: ...`),便于在 Sentry Performance 中按「CloudBus Handle」等关键词搜索;同时设置 OTel/Sentry 语义属性 `messaging.destination.name`、`messaging.message.id` 及 `messaging.system`、`messaging.message_class`,便于筛选与分组。 + --- ## 7. Semantic Conventions @@ -1108,6 +1110,9 @@ def create_tracing_middleware(telemetry: ZStackAgentTelemetry): ### Management Node (zstack.properties) +**注意**:等号两边不要加空格(`key=value`),否则 key 会变成带空格的,读不到,会用默认值(如 `Telemetry.enabled` 默认 false)。 +管理节点上遥测**不会**监听 OTLP/Sentry 端口,只会向外发送;本地会监听的只有 **9464**(Prometheus /metrics)。 + ```properties # Enable/disable telemetry Telemetry.enabled=true @@ -1124,6 +1129,13 @@ Telemetry.alwaysSampleErrors=true # Exporters (comma-separated): otlp, sentry Telemetry.exporters=otlp +# Sentry DSN (when using sentry exporter). Also used by CloudBus error reporting. +# Can be set here or via -Dsentry.dsn=... or env SENTRY_DSN (no spaces around =) +# Telemetry.sentryDsn=https://your-key@your-org.ingest.sentry.io/project-id + +# Sentry traces sample rate (0.0 to 1.0). Must be set in Sentry.init() or Performance/Traces may be empty. +Telemetry.sentryTracesSampleRate=1.0 + # OTLP endpoint Telemetry.otlpEndpoint=http://jaeger:4317 @@ -1165,3 +1177,87 @@ telemetry: max_export_batch_size: 512 export_timeout_ms: 30000 ``` + +--- + +## Appendix B: Sentry 对接与测试 + +对接公司 Sentry 时按以下步骤配置和验证。 + +**配置注意**:`zstack.properties` 中等号两边**不要加空格**(`key=value`),否则 key 带空格读不到;Sentry 测试时建议 `Telemetry.exporters=otlp,sentry`、`Telemetry.sentryTracesSampleRate=1.0`(或通过该配置项设置)。使用 Sentry 时需在 **Sentry.init()** 中设置 **tracesSampleRate**,否则 Sentry 可能不接收 OTel 发去的 transaction,Performance/Traces 可能看不到数据;ZStack 已通过 `Telemetry.sentryTracesSampleRate` 传入,默认 1.0。 + +### B.1 前置条件 + +- 已拿到 Sentry 项目的 **DSN**(形如 `https://xxx@xxx.ingest.sentry.io/xxx`)。 +- 管理节点 classpath 中包含 `sentry`、`sentry-opentelemetry-core`(根 `pom.xml` 的 dependencyManagement 中已声明,build 打包时会带入 WEB-INF/lib)。**注意**:`sentry-opentelemetry-bootstrap` 已被显式排除,以避免其抢先注册 GlobalOpenTelemetry,导致与 ZStack 自建的 TracerProvider(含 Sentry exporter)冲突。 + +### B.2 配置步骤 + +**1. 配置 DSN** + +Sentry 由 `SentryInitHelper.initIfNeeded()` 在 TelemetryFacade 构建 OpenTelemetry SDK 之后调用 `Sentry.init()` 进行初始化。DSN 来源(任选其一,优先级:Telemetry.sentryDsn > sentry.dsn 系统属性 > SENTRY_DSN 环境变量): + +- **推荐** 在 `zstack.properties` 中增加(会通过 `System.getProperties().load()` 注入为系统属性): + ```properties + sentry.dsn=https://你的key@你的org.ingest.sentry.io/项目id + ``` +- 或启动 JVM 时加参数:`-Dsentry.dsn=https://...` +- 或设置环境变量:`SENTRY_DSN=https://...` + +**2. 开启 Sentry 与 Telemetry Sentry 导出** + +在 `zstack.properties` 中增加或修改: + +```properties +# 启用 Sentry(TelemetryFacade 启动时在构建 OTel SDK 后通过 SentryInitHelper.initIfNeeded() 调用 Sentry.init();必须为 true 才能把 trace 发到 Sentry) +CloudBus.sentryOn=true + +# 启用遥测并启用 sentry exporter +Telemetry.enabled=true +Telemetry.exporters=sentry + +# 可选:仅用 Sentry 时可不必配 OTLP;若同时用 OTLP 与 Sentry,可写: +# Telemetry.exporters=otlp,sentry +``` + +**3. 测试环境建议** + +本地/测试环境可提高采样率以便快速看到 trace;Sentry 端需设置 tracesSampleRate(ZStack 通过 `Telemetry.sentryTracesSampleRate` 传入,默认 1.0): + +```properties +Telemetry.environment=DEV +Telemetry.samplingRate=1.0 +Telemetry.sentryTracesSampleRate=1.0 +Telemetry.alwaysSampleErrors=true +``` + +### B.3 验证方式 + +**方式一:看启动日志** + +启动管理节点后查看日志,应出现类似: + +- `Sentry initialized (tracesSampleRate=...)`(由 SentryInitHelper 在 TelemetryFacade 构建 OTel SDK 后输出,表示 Sentry.init() 成功且已设置 tracesSampleRate)。 +- `Telemetry initialized successfully: environment=..., exporters=sentry` 或 `exporters=otlp,sentry`。 +- `Enabled exporter: sentry`(表示已启用 sentry exporter);首次有 span 导出时会出现 `LazySentryExporter: created Sentry span exporter (first use)`。 + +若出现 `Sentry exporter requested but sentry-opentelemetry-core is not on classpath` 或 exporter 不可用相关告警,说明依赖或配置有误,需检查打包/classpath 及 `CloudBus.sentryOn`、`Telemetry.sentryDsn`(或 sentry.dsn/SENTRY_DSN)。 + +**方式二:触发带错误的请求** + +- 调用一个会返回错误或抛异常的 API(例如错误参数、不存在的资源 UUID)。 +- 由于配置了 `Telemetry.alwaysSampleErrors=true`,带错误的 span 会被强制采样并导出。 +- 在 Sentry 控制台 **Issues** 或 **Performance/Traces** 中查看是否出现对应错误或 trace。 + +**方式三:DEV 环境全量采样** + +- 将 `Telemetry.environment=DEV`、`Telemetry.samplingRate=1.0` 时,所有请求都会被采样。 +- 正常调用若干 API(如列出云主机、创建/删除测试资源),然后在 Sentry 的 **Performance** / **Traces** 中查看是否有对应 trace。 + +### B.4 常见问题 + +| 现象 | 可能原因 | 处理 | +|------|----------|------| +| 控制台没有 trace/error | DSN 未生效 | 确认 `sentry.dsn` 已在 zstack.properties 或 -D/环境变量中设置,且 `CloudBus.sentryOn=true` | +| 没有 Sentry exporter | 依赖未带入 | 确认运行时 classpath 包含 `sentry-opentelemetry-core`,必要时去掉 optional 或调整打包 | +| 只有 error 没有 trace | 采样率低且请求未报错;或 Sentry 未设置 tracesSampleRate | 在测试环境用 `Telemetry.environment=DEV`、`Telemetry.samplingRate=1.0`、`Telemetry.sentryTracesSampleRate=1.0`,或故意触发错误并用 `alwaysSampleErrors=true` 验证;确认 Sentry.init() 已设置 tracesSampleRate(ZStack 通过 Telemetry.sentryTracesSampleRate 传入) | diff --git a/pom.xml b/pom.xml index b5586857c7a..29c4276b2cf 100755 --- a/pom.xml +++ b/pom.xml @@ -550,11 +550,17 @@ opentelemetry-context 1.35.0 - + io.opentelemetry.semconv opentelemetry-semconv - 1.23.1-alpha + 1.37.0 + + + + io.opentelemetry + opentelemetry-semconv + 1.30.1-alpha @@ -568,11 +574,26 @@ opentelemetry-exporter-prometheus 1.35.0-alpha - + + + io.sentry + sentry + 8.16.0 + + + io.sentry + sentry-opentelemetry-bootstrap + 8.16.0 + io.sentry sentry-opentelemetry-core - 8.0.0 + 8.16.0 + + + io.opentelemetry.semconv + opentelemetry-semconv-incubating + 1.32.0-alpha diff --git a/rest/pom.xml b/rest/pom.xml index 5f87d780fa5..5f346305937 100755 --- a/rest/pom.xml +++ b/rest/pom.xml @@ -32,6 +32,15 @@ header ${project.version} + + + io.opentelemetry + opentelemetry-api + + + io.opentelemetry + opentelemetry-context + javax.servlet javax.servlet-api diff --git a/rest/src/main/java/org/zstack/rest/RestServer.java b/rest/src/main/java/org/zstack/rest/RestServer.java index 12a823d619b..339396d3c41 100755 --- a/rest/src/main/java/org/zstack/rest/RestServer.java +++ b/rest/src/main/java/org/zstack/rest/RestServer.java @@ -159,11 +159,7 @@ public class RestServer implements Component, CloudBusEventListener { private TelemetryFacade getTelemetryFacade() { if (telemetryFacade == null && TelemetryGlobalProperty.ENABLED) { - try { - telemetryFacade = Platform.getComponentLoader().getComponent(TelemetryFacade.class); - } catch (Exception e) { - logger.trace("TelemetryFacade not available", e); - } + telemetryFacade = Platform.getComponentLoader().getComponentNoExceptionWhenNotExisting(TelemetryFacade.class); } return telemetryFacade; } @@ -738,6 +734,7 @@ void handle(HttpServletRequest req, HttpServletResponse rsp) throws IOException, .spanBuilder("API " + req.getMethod() + " " + path) .setSpanKind(SpanKind.SERVER) .setParent(parentContext) + .setAttribute("http.request.method", req.getMethod()) .setAttribute("http.method", req.getMethod()) .setAttribute("http.url", req.getRequestURL().toString()) .setAttribute("http.path", path) From 01ab7f803af010c2aba815660cc549a1a5f8f790 Mon Sep 17 00:00:00 2001 From: "haidong.pang" Date: Wed, 28 Jan 2026 05:33:30 +0000 Subject: [PATCH 722/737] [zbs]: Try to reconnect after all mds disconnected - After the ZBS primary storage agent on the MDS restarts, it may fail to start up independently due to lost firewall rules or metadata. - Redeploy by the MN is required. Resolves: ZSTAC-79447 Change-Id: I726b7467627269627779696d6e72756f75706e76 --- .../org/zstack/storage/zbs/ZbsConstants.java | 3 +- .../storage/zbs/ZbsPrimaryStorageMdsBase.java | 2 +- .../storage/zbs/ZbsStorageController.java | 109 ++++++++++++++---- .../addon/zbs/ZbsPrimaryStorageCase.groovy | 8 +- 4 files changed, 94 insertions(+), 28 deletions(-) diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java index 9d69ca21b45..8bbbfe5dc02 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java @@ -14,7 +14,8 @@ public interface ZbsConstants { String ZBS_HEARTBEAT_VOLUME_NAME = "zbs_zstack_heartbeat"; long ZBS_HEARTBEAT_VOLUME_SIZE_IN_GIGABYTE = 1; String SCHEME_PREFIX = "zbs://"; - Integer PRIMARY_STORAGE_MDS_MAXIMUM_PING_FAILURE = 3; + Integer MDS_PING_RETRY_PER_CYCLE = 3; + Integer MDS_PING_FAIL_CYCLE_THRESHOLD = 3; String VOLUME_PHYSICAL_BLOCK_SIZE = "4096"; String MEGABYTE_SUPPORTED_VERSION = "1.6.1"; String MEGABYTE_UNIT = "M"; diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java index 7f75ace1eef..bcd230bfdf7 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java @@ -319,7 +319,7 @@ public String getName() { } private void pingMds(ClusterInfo clusterInfo, final Completion completion) { - final Integer MAX_PING_CNT = ZbsConstants.PRIMARY_STORAGE_MDS_MAXIMUM_PING_FAILURE; + final Integer MAX_PING_CNT = ZbsConstants.MDS_PING_RETRY_PER_CYCLE; final List stepCount = new ArrayList<>(); for (int i = 1; i <= MAX_PING_CNT; i++) { stepCount.add(i); diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 1fce90c06e7..db06239acb3 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -62,6 +62,7 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.storage.zbs.ZbsConstants.MDS_PING_FAIL_CYCLE_THRESHOLD; import static org.zstack.storage.zbs.ZbsHelper.*; import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; @@ -88,6 +89,7 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar private Config config; private Map physicalPoolByLogicalPool = new ConcurrentHashMap<>(); + private final Map mdsConsecutivePingFailureCount = new ConcurrentHashMap<>(); public static final String DEPLOY_CLIENT_PATH = "/zbs/primarystorage/client/deploy"; public static final String GET_CAPACITY_PATH = "/zbs/primarystorage/capacity"; @@ -581,6 +583,61 @@ public void done(ErrorCodeList errorCodeList) { }); } + private void incrementMdsPingFailureCount(ZbsPrimaryStorageMdsBase mds) { + // initialize the count if absent + mdsConsecutivePingFailureCount.putIfAbsent(mds.getSelf(), 0); + // increment the count only if it is below the threshold + // avoid unbounded growth of the count + if (mdsConsecutivePingFailureCount.get(mds.getSelf()) < MDS_PING_FAIL_CYCLE_THRESHOLD) { + mdsConsecutivePingFailureCount.merge(mds.getSelf(), 1, Integer::sum); + } + } + + private void resetMdsPingFailureCount(ZbsPrimaryStorageMdsBase mds) { + mdsConsecutivePingFailureCount.remove(mds.getSelf()); + } + + private List getDisconnectedMds(List mdsBases) { + return mdsBases.stream() + .filter(m -> MdsStatus.Disconnected.equals(m.getSelf().getStatus())) + .collect(Collectors.toList()); + } + + private boolean allMdssDisconnected(List mdsBases) { + List disconnectedMds = getDisconnectedMds(mdsBases); + return disconnectedMds.size() == mdsBases.size(); + } + + private List getMdssNeedToReconnect(List mdsBases) { + List disconnectedMds = getDisconnectedMds(mdsBases); + boolean allDisconnected = allMdssDisconnected(mdsBases); + + if (disconnectedMds.isEmpty()) { + return Collections.emptyList(); + } + + // If all MDS are disconnected, try to reconnect all of them + if (allDisconnected) { + logger.info("All MDS are disconnected, ignore the ping failure count threshold and all of them need be reconnected"); + return disconnectedMds; + } + + String disconnectedMdsInfo = disconnectedMds.stream() + .map(m -> String.format("%s (Consecutive Ping Failure: %d)", + m.getSelf().getAddr(), + mdsConsecutivePingFailureCount.computeIfAbsent(m.getSelf(), k -> 0))) + .collect(Collectors.joining(", ")); + + logger.info(String.format("Some MDS are disconnected for ZBS primary storage[uuid:%s], disconnected MDS: [%s]", + self.getUuid(), disconnectedMdsInfo)); + + return disconnectedMds.stream() + .filter(m -> mdsConsecutivePingFailureCount + .computeIfAbsent(m.getSelf(), k -> 0) >= MDS_PING_FAIL_CYCLE_THRESHOLD) + .collect(Collectors.toList()); + + } + @Override public void ping(ReturnValueCompletion completion) { reloadDbInfo(); @@ -595,44 +652,36 @@ public void ping(ReturnValueCompletion completion) { @Override public void success() { m.getSelf().setStatus(MdsStatus.Connected); + resetMdsPingFailureCount(m); comp.done(); } @Override public void fail(ErrorCode errorCode) { m.getSelf().setStatus(MdsStatus.Disconnected); + incrementMdsPingFailureCount(m); comp.done(); } })).run(new WhileDoneCompletion(completion) { @Override public void done(ErrorCodeList errorCodeList) { - List disconnectedMds = mds.stream() - .filter(m -> MdsStatus.Disconnected.equals(m.getSelf().getStatus())) - .collect(Collectors.toList()); + List mdsNeedToReconnect = getMdssNeedToReconnect(mds); - if (disconnectedMds.isEmpty()) { + if (mdsNeedToReconnect.isEmpty()) { completion.success(new PingResult(addonInfo)); return; } - final boolean allDisconnected = disconnectedMds.size() == mds.size(); - String notConnectedIps = disconnectedMds.stream() - .map(ZbsPrimaryStorageMdsBase::getSelf) - .map(MdsInfo::getAddr) + String mdsNeedToReconnectInfo = mdsNeedToReconnect.stream() + .map(m -> String.format("%s (Consecutive Ping Failure: %d)", + m.getSelf().getAddr(), + mdsConsecutivePingFailureCount.get(m.getSelf()))) .collect(Collectors.joining(", ")); - // it should be covered in primary storage reconnect phase - if (allDisconnected) { - completion.success(new PingResult(addonInfo, String.format("All MDS are not connected, disconnected MDS addresses: %s", notConnectedIps))); - return; - } - - // Try to reconnect disconnected MDS, the reconnection results are recorded in addonInfo - // and will not cause the ping operation to fail. - logger.warn(String.format("Some MDS are not connected for ZBS primary storage[uuid:%s], disconnected MDS addresses: %s, try to reconnect them", - self.getUuid(), notConnectedIps)); + logger.warn(String.format("Some MDS need to reconnect for ZBS primary storage[uuid:%s], MDS : %s", + self.getUuid(), mdsNeedToReconnectInfo)); - reconnectMdss(disconnectedMds, new Completion(completion) { + reconnectMdss(mdsNeedToReconnect, new Completion(completion) { @Override public void success() { completion.success(new PingResult(addonInfo)); @@ -640,8 +689,25 @@ public void success() { @Override public void fail(ErrorCode errorCode) { - logger.warn(String.format("Some MDS are still not connected after reconnection for ZBS primary storage[uuid:%s], error: %s", - self.getUuid(), errorCode)); + List stillDisconnectedMds = getDisconnectedMds(mds); + boolean allDisconnected = allMdssDisconnected(mds); + + if (allDisconnected) { + completion.success(new PingResult(addonInfo, + String.format("All MDS are still disconnected after reconnection for ZBS primary storage[uuid:%s]", + self.getUuid()))); + return; + } + + String stillDisconnectedMdsInfo = stillDisconnectedMds.stream() + .map(m -> String.format("%s (Consecutive Ping Failure: %d)", + m.getSelf().getAddr(), + mdsConsecutivePingFailureCount.get(m.getSelf()))) + .collect(Collectors.joining(", ")); + + logger.warn(String.format("Some MDS are still disconnected after reconnection for ZBS primary storage[uuid:%s], disconnected MDS : %s, error: %s", + self.getUuid(), stillDisconnectedMdsInfo, errorCode)); + completion.success(new PingResult(addonInfo)); } }); @@ -1282,7 +1348,6 @@ public void fail(ErrorCode errorCode) { }); } - @Override public void syncAddonInfo(String addonInfo) { this.addonInfo = StringUtils.isEmpty(addonInfo) ? new AddonInfo() : JSONObjectUtil.toObject(addonInfo, AddonInfo.class); diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index 7355846a0ff..f07add523d3 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -781,7 +781,8 @@ class ZbsPrimaryStorageCase extends SubCase { Integer originalPingInterval = PrimaryStorageGlobalConfig.PING_INTERVAL.value().toInteger() PrimaryStorageGlobalConfig.PING_INTERVAL.updateValue(1) final String dbVersion = dbf.getDbVersion() - final Integer MAX_PING_CNT = ZbsConstants.PRIMARY_STORAGE_MDS_MAXIMUM_PING_FAILURE + final Integer MDS_PING_RETRY_PER_CYCLE = ZbsConstants.MDS_PING_RETRY_PER_CYCLE + final Integer MDS_PING_FAIL_CYCLE_THRESHOLD = ZbsConstants.MDS_PING_FAIL_CYCLE_THRESHOLD AtomicInteger pingFailureCount = new AtomicInteger(0) Boolean reconnectTriggered = false @@ -803,14 +804,13 @@ class ZbsPrimaryStorageCase extends SubCase { ZbsPrimaryStorageMdsBase.SyncMetadataCmd cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.SyncMetadataCmd.class) ZbsPrimaryStorageMdsBase.SyncMetadataRsp rsp = new ZbsPrimaryStorageMdsBase.SyncMetadataRsp() rsp.setExternalAddr(cmd.getAddr()) - if (cmd.getAddr().equals("127.0.1.1")) { - assert pingFailureCount.intValue().equals(MAX_PING_CNT) + if (cmd.getAddr().equals("127.0.1.1") && pingFailureCount.intValue().equals(MDS_PING_RETRY_PER_CYCLE * MDS_PING_FAIL_CYCLE_THRESHOLD)) { reconnectTriggered = true } return rsp } - sleep((MAX_PING_CNT + 1) * 1000 + 500) + sleep((MDS_PING_RETRY_PER_CYCLE * MDS_PING_FAIL_CYCLE_THRESHOLD + 1) * 1000 + 500) retryInSecs { assert reconnectTriggered } From e3b971f960b62f7264790e2ac8ce3b8d343634ca Mon Sep 17 00:00:00 2001 From: qiuyu <2094801894@qq.com> Date: Fri, 30 Jan 2026 16:57:39 +0800 Subject: [PATCH 723/737] [console]: Delete the console proxy on internal shutdown Add an implementation for an extension point for deleting the console proxy in the event of listening to the "shutdown" command executed by the VM in the console. Resolves: ZSTAC-77687 Change-Id: I6f6f7573616a767870666b7174757a786675646c --- conf/springConfigXml/ConsoleManager.xml | 1 + .../zstack/console/ConsoleManagerImpl.java | 22 ++++++++++++++- .../console/ConsoleProxyCase.groovy | 27 +++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/conf/springConfigXml/ConsoleManager.xml b/conf/springConfigXml/ConsoleManager.xml index fb023470cb2..08075821b2e 100755 --- a/conf/springConfigXml/ConsoleManager.xml +++ b/conf/springConfigXml/ConsoleManager.xml @@ -21,6 +21,7 @@ + diff --git a/console/src/main/java/org/zstack/console/ConsoleManagerImpl.java b/console/src/main/java/org/zstack/console/ConsoleManagerImpl.java index ce65fc78a39..67057da171d 100755 --- a/console/src/main/java/org/zstack/console/ConsoleManagerImpl.java +++ b/console/src/main/java/org/zstack/console/ConsoleManagerImpl.java @@ -43,7 +43,7 @@ * To change this template use File | Settings | File Templates. */ public class ConsoleManagerImpl extends AbstractService implements ConsoleManager, VmInstanceMigrateExtensionPoint, ManagementNodeChangeListener, - VmReleaseResourceExtensionPoint, SessionLogoutExtensionPoint, PostVmInstantiateResourceExtensionPoint { + VmReleaseResourceExtensionPoint, SessionLogoutExtensionPoint, PostVmInstantiateResourceExtensionPoint, KvmReportVmShutdownFromGuestEventExtensionPoint { private static CLogger logger = Utils.getLogger(ConsoleManagerImpl.class); @Autowired @@ -357,4 +357,24 @@ public void fail(ErrorCode errorCode) { public void postReleaseVmResource(VmInstanceSpec spec, Completion completion) { completion.success(); } + + @Override + public void kvmReportVmShutdownEvent(String vmUuid) { + VmInstanceVO vmvo = Q.New(VmInstanceVO.class).eq(VmInstanceVO_.uuid, vmUuid).find(); + if (vmvo == null) { + return; + } + VmInstanceInventory inv = VmInstanceInventory.valueOf(vmvo); + ConsoleBackend backend = getBackend(); + backend.deleteConsoleSession(inv, new Completion(null) { + @Override + public void success() {} + + @Override + public void fail(ErrorCode errorCode) { + logger.warn(String.format( + "failed to delete console session for vm[uuid:%s] on guest shutdown, because %s", vmUuid, errorCode)); + } + }); + } } diff --git a/test/src/test/groovy/org/zstack/test/integration/console/ConsoleProxyCase.groovy b/test/src/test/groovy/org/zstack/test/integration/console/ConsoleProxyCase.groovy index 94f1fb161d0..839cb50554a 100644 --- a/test/src/test/groovy/org/zstack/test/integration/console/ConsoleProxyCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/console/ConsoleProxyCase.groovy @@ -2,8 +2,10 @@ package org.zstack.test.integration.console import org.springframework.http.HttpEntity import org.zstack.console.ConsoleGlobalConfig +import org.zstack.header.vm.VmInstanceConstant import org.zstack.core.CoreGlobalProperty import org.zstack.core.Platform +import org.zstack.core.cloudbus.CloudBus import org.zstack.core.db.DatabaseFacade import org.zstack.core.db.Q import org.zstack.core.gc.GCStatus @@ -12,6 +14,7 @@ import org.zstack.header.console.ConsoleProxyAgentVO import org.zstack.header.console.ConsoleProxyCommands import org.zstack.header.console.ConsoleProxyVO import org.zstack.header.console.ConsoleProxyVO_ +import org.zstack.header.vm.KvmReportVmShutdownFromGuestEventMsg import org.zstack.sdk.ConsoleInventory import org.zstack.sdk.GarbageCollectorInventory import org.zstack.sdk.SessionInventory @@ -25,6 +28,7 @@ import org.zstack.utils.data.SizeUnit class ConsoleProxyCase extends SubCase { EnvSpec env DatabaseFacade dbf + CloudBus bus; @Override void setup() { @@ -34,6 +38,7 @@ class ConsoleProxyCase extends SubCase { @Override void environment() { dbf = bean(DatabaseFacade.class) + bus = bean(CloudBus.class) env = env { account { name = "test" @@ -119,6 +124,7 @@ class ConsoleProxyCase extends SubCase { @Override void test() { env.create { + testConsoleProxyCleanupOnGuestShutdown() testUpdateConsoleProxyAgent() testConsoleProxyGC() } @@ -245,6 +251,27 @@ class ConsoleProxyCase extends SubCase { } } + void testConsoleProxyCleanupOnGuestShutdown() { + VmInstanceInventory vm = env.inventoryByName("vm") + requestConsoleAccess { + vmInstanceUuid = vm.uuid + } + def consoleProxyCount = Q.New(ConsoleProxyVO.class) + .eq(ConsoleProxyVO_.vmInstanceUuid, vm.uuid) + .count() + assert consoleProxyCount == 1 + KvmReportVmShutdownFromGuestEventMsg msg = new KvmReportVmShutdownFromGuestEventMsg() + msg.vmInstanceUuid = vm.uuid + bus.makeTargetServiceIdByResourceUuid(msg, VmInstanceConstant.SERVICE_ID, vm.uuid) + bus.send(msg) + retryInSecs { + consoleProxyCount = Q.New(ConsoleProxyVO.class) + .eq(ConsoleProxyVO_.vmInstanceUuid, vm.uuid) + .count() + assert consoleProxyCount == 0 + } + } + @Override void clean() { env.delete() From 03ed221a52459aacdfc8e4f6c9df5eb4429c2eea Mon Sep 17 00:00:00 2001 From: "zhong.xian" Date: Thu, 22 Jan 2026 09:53:14 +0800 Subject: [PATCH 724/737] [sdk]: add allocatorStrategy fields to pciDeviceSpecInventory Resolves: ZSTAC-79841 Change-Id: I7a7767686c686c6d666f6b706f71726c7a646778 --- conf/db/upgrade/V5.5.6__schema.sql | 6 ++++++ .../main/java/org/zstack/sdk/GpuDeviceSpecInventory.java | 8 ++++++++ .../main/java/org/zstack/sdk/MdevDeviceSpecInventory.java | 8 ++++++++ .../java/org/zstack/sdk/UpdateMdevDeviceSpecAction.java | 3 +++ .../java/org/zstack/sdk/UpdatePciDeviceSpecAction.java | 3 +++ 5 files changed, 28 insertions(+) diff --git a/conf/db/upgrade/V5.5.6__schema.sql b/conf/db/upgrade/V5.5.6__schema.sql index 4e428984151..44d2bffce53 100644 --- a/conf/db/upgrade/V5.5.6__schema.sql +++ b/conf/db/upgrade/V5.5.6__schema.sql @@ -113,3 +113,9 @@ FROM PodVO p GROUP BY p.uuid; ALTER TABLE `zstack`.`AccessControlListEntryVO` ADD COLUMN `redirectPort` int(10) DEFAULT NULL; + +CALL ADD_COLUMN('GpuDeviceSpecVO', 'allocatorStrategy', 'varchar(32)', 1, NULL); +CALL ADD_COLUMN('MdevDeviceSpecVO', 'allocatorStrategy', 'varchar(32)', 1, NULL); + +UPDATE `zstack`.`GpuDeviceSpecVO` SET `allocatorStrategy` = 'FollowGlobal' WHERE `allocatorStrategy` IS NULL; +UPDATE `zstack`.`MdevDeviceSpecVO` SET `allocatorStrategy` = 'FollowGlobal' WHERE `allocatorStrategy` IS NULL; diff --git a/sdk/src/main/java/org/zstack/sdk/GpuDeviceSpecInventory.java b/sdk/src/main/java/org/zstack/sdk/GpuDeviceSpecInventory.java index e043f206e5b..55dca3a4d9d 100644 --- a/sdk/src/main/java/org/zstack/sdk/GpuDeviceSpecInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/GpuDeviceSpecInventory.java @@ -28,4 +28,12 @@ public java.lang.Boolean getIsolated() { return this.isolated; } + public java.lang.String allocatorStrategy; + public void setAllocatorStrategy(java.lang.String allocatorStrategy) { + this.allocatorStrategy = allocatorStrategy; + } + public java.lang.String getAllocatorStrategy() { + return this.allocatorStrategy; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/MdevDeviceSpecInventory.java b/sdk/src/main/java/org/zstack/sdk/MdevDeviceSpecInventory.java index c3b2fc5b0ea..4bb5364a115 100644 --- a/sdk/src/main/java/org/zstack/sdk/MdevDeviceSpecInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/MdevDeviceSpecInventory.java @@ -61,6 +61,14 @@ public java.lang.String getVendor() { return this.vendor; } + public java.lang.String allocatorStrategy; + public void setAllocatorStrategy(java.lang.String allocatorStrategy) { + this.allocatorStrategy = allocatorStrategy; + } + public java.lang.String getAllocatorStrategy() { + return this.allocatorStrategy; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateMdevDeviceSpecAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateMdevDeviceSpecAction.java index 15a6539ef83..4e1dea256ec 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateMdevDeviceSpecAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateMdevDeviceSpecAction.java @@ -37,6 +37,9 @@ public Result throwExceptionIfError() { @Param(required = false, validValues = {"Enabled","Disabled"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String state; + @Param(required = false, validValues = {"Dispersed","Compact","FollowGlobal","NotSet"}, maxLength = 32, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String allocatorStrategy; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/UpdatePciDeviceSpecAction.java b/sdk/src/main/java/org/zstack/sdk/UpdatePciDeviceSpecAction.java index e64f87dede8..e81e2fb7db6 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdatePciDeviceSpecAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdatePciDeviceSpecAction.java @@ -46,6 +46,9 @@ public Result throwExceptionIfError() { @Param(required = false, validValues = {"Enabled","Disabled"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String state; + @Param(required = false, validValues = {"Dispersed","Compact","FollowGlobal","NotSet"}, maxLength = 32, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String allocatorStrategy; + @Param(required = false) public java.util.List systemTags; From 56dd8bdf75b9e3caf8daa7799fba790d4b88ac6a Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Thu, 22 Jan 2026 10:28:48 +0800 Subject: [PATCH 725/737] [compute]: simplify ResourceBindingAllocatorFlow with 8-row truth tabl Refactor VM cluster binding strategy to reduce complexity from 64 combinations (6 variables) to 8 combinations (3 variables). Changes: - Simplify ResourceBindingAllocatorFlow logic with new truth table: | # | vm.ha.across.clusters | resourceBinding.strategy | Cluster Has Resources | Behavior | |---|----------------------|-------------------------|----------------------|----------| | 1-4 | true | - | - | Migrate Freely | | 5 | false | Hard | true | Migrate in Current Cluster | | 6 | false | Hard | false | Fail | | 7 | false | Soft | true | Migrate in Current Cluster | | 8 | false | Soft | false | Try Other Clusters | - Extend RESOURCE_BINDING_STRATEGY scope to ClusterVO - Remove validateAllocationScene() method (no longer distinguish manual/auto) - Silently deprecate VmSystemTags.VM_RESOURCE_BINGDING (data preserved, code ignores) - Remove VM_RESOURCE_BINGDING tag write logic in VmInstanceManagerImpl - Add ResourceBindingAllocatorFlowCase to cover all 8 truth table scenarios Resolves: ZSTAC-81445 Change-Id: I646d6e6f6d766c696578706c786e64736a6a6b62 --- .../ResourceBindingAllocatorFlow.java | 144 ++---- .../org/zstack/compute/vm/VmGlobalConfig.java | 2 +- .../compute/vm/VmInstanceManagerImpl.java | 22 +- .../ResourceBindingAllocatorFlowCase.groovy | 475 ++++++++++++++++++ 4 files changed, 529 insertions(+), 114 deletions(-) create mode 100644 test/src/test/groovy/org/zstack/test/integration/kvm/vm/migrate/ResourceBindingAllocatorFlowCase.groovy diff --git a/compute/src/main/java/org/zstack/compute/allocator/ResourceBindingAllocatorFlow.java b/compute/src/main/java/org/zstack/compute/allocator/ResourceBindingAllocatorFlow.java index 596ecd20e04..07f52a0dda4 100644 --- a/compute/src/main/java/org/zstack/compute/allocator/ResourceBindingAllocatorFlow.java +++ b/compute/src/main/java/org/zstack/compute/allocator/ResourceBindingAllocatorFlow.java @@ -1,139 +1,97 @@ package org.zstack.compute.allocator; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; -import org.springframework.util.StringUtils; import org.zstack.compute.vm.VmGlobalConfig; -import org.zstack.compute.vm.VmSystemTags; import org.zstack.core.Platform; -import org.zstack.core.componentloader.PluginRegistry; import org.zstack.header.allocator.AbstractHostAllocatorFlow; -import org.zstack.header.allocator.AllocationScene; -import org.zstack.header.allocator.ResourceBindingCollector; import org.zstack.header.allocator.ResourceBindingStrategy; +import org.zstack.header.host.HostState; +import org.zstack.header.host.HostStatus; import org.zstack.header.host.HostVO; +import org.zstack.header.vm.VmInstanceConstant; import org.zstack.resourceconfig.ResourceConfigFacade; -import java.util.*; +import java.util.List; import java.util.stream.Collectors; + import static org.zstack.utils.clouderrorcode.CloudOperationsErrorCode.*; /** - * @ Author : yh.w - * @ Date : Created in 18:11 2019/11/26 + * VM Cluster Binding Strategy Allocator + *

+ * Truth Table (3 variables, 8 combinations): + * | # | vm.ha.across.clusters | resourceBinding.strategy | Cluster Has Resources | Expected Behavior | + * |---|----------------------|-------------------------|----------------------|-------------------| + * | 1 | true | Hard | true | Migrate Freely | + * | 2 | true | Hard | false | Migrate Freely | + * | 3 | true | Soft | true | Migrate Freely | + * | 4 | true | Soft | false | Migrate Freely | + * | 5 | false | Hard | true | Migrate in Current Cluster | + * | 6 | false | Hard | false | Fail | + * | 7 | false | Soft | true | Migrate in Current Cluster | + * | 8 | false | Soft | false | Try Other Clusters | + * + * @author yh.w (original), refactored for ZSTAC-75428 */ @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class ResourceBindingAllocatorFlow extends AbstractHostAllocatorFlow { - @Autowired - protected PluginRegistry pluginRgty; @Autowired private ResourceConfigFacade rcf; - private static Map collectors = Collections.synchronizedMap(new HashMap<>()); - - private static String SPLIT = ","; - - { - List cs = pluginRgty.getExtensionList(ResourceBindingCollector.class); - for (ResourceBindingCollector collector : cs) { - collectors.put(collector.getType(), collector); - } - } - - private Map> getBindedResourcesFromTag() { - String resources = VmSystemTags.VM_RESOURCE_BINGDING - .getTokenByResourceUuid(spec.getVmInstance().getUuid(), VmSystemTags.VM_RESOURCE_BINGDING_TOKEN); - - if (StringUtils.isEmpty(resources)) { - return null; - } - - Map> resourceMap = new HashMap<>(); - for (String resource : resources.split(SPLIT)) { - String type = resource.split(":")[0]; - String uuid = resource.split(":")[1]; - List resourceList = resourceMap.computeIfAbsent(type, k -> new ArrayList<>()); - resourceList.add(uuid); - } - - return resourceMap; - } - - private boolean validateAllocationScene() { - String as = rcf.getResourceConfigValue(VmGlobalConfig.RESOURCE_BINDING_SCENE, spec.getVmInstance().getUuid(), String.class); - if (as.equals(AllocationScene.All.toString())) { - return true; - } - - if (spec.getAllocationScene() != null) { - return as.equals(spec.getAllocationScene().toString()); - } - - return false; - } - @Override public void allocate() { throwExceptionIfIAmTheFirstFlow(); - Boolean resourceConfig = rcf.getResourceConfigValue(VmGlobalConfig.VM_HA_ACROSS_CLUSTERS, spec.getVmInstance().getUuid(), Boolean.class); - if (!validateAllocationScene() || (!VmSystemTags.VM_RESOURCE_BINGDING.hasTag(spec.getVmInstance().getUuid()) && resourceConfig)) { + String vmUuid = spec.getVmInstance().getUuid(); + String currentClusterUuid = spec.getVmInstance().getClusterUuid(); + Boolean allowAcrossClusters = rcf + .getResourceConfigValue(VmGlobalConfig.VM_HA_ACROSS_CLUSTERS, vmUuid, Boolean.class); + + // Truth table #1-4: If cross-cluster is allowed, pass through (migrate freely) + if (allowAcrossClusters) { next(candidates); return; } - // get bind resources from system tag - Map> resources = getBindedResourcesFromTag(); - resources = resources != null ? resources : new HashMap<>(); - // get bind resources from config - ResourceBindingClusterCollector clusterCollector = new ResourceBindingClusterCollector(); - if (!resourceConfig) { - //remove bind cluster uuid from system tag, use current cluster uuid from config - if (resources.containsKey(clusterCollector.getType())) { - List uuids = resources.get(clusterCollector.getType()); - if (!uuids.contains(spec.getVmInstance().getClusterUuid())) { - String tag = String.format("Cluster:%s", spec.getVmInstance().getClusterUuid()); - VmSystemTags.VM_RESOURCE_BINGDING.updateTagByToken(spec.getVmInstance().getUuid(), - VmSystemTags.VM_RESOURCE_BINGDING_TOKEN, tag); - } - resources.remove(clusterCollector.getType()); - } - - resources.computeIfAbsent(clusterCollector.getType(), k -> new ArrayList<>()).add(spec.getVmInstance().getClusterUuid()); - } - - if (resources.isEmpty()) { + // Skip binding check if current cluster is null + if (StringUtils.isBlank(currentClusterUuid)) { next(candidates); return; } - List availableHost = new ArrayList<>(); - for (Map.Entry> entry : resources.entrySet()) { - ResourceBindingCollector collector = collectors.get(entry.getKey()); - if (collector == null) { - fail(Platform.operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10004, "resource binding not support type %s yet", entry.getKey())); - return; - } - availableHost.addAll(collector.collect(entry.getValue())); - } - - List filteredHost = candidates.stream() - .filter(v -> availableHost.stream().anyMatch(h -> h.getUuid().equals(v.getUuid()))) + // Truth table #5-8: Cross-cluster not allowed, check current cluster resources + // Cluster resource sufficient: Enabled + Connected hosts excluding current VM's host + List hostsInCurrentCluster = candidates.stream() + .filter(h -> currentClusterUuid.equals(h.getClusterUuid())) + .filter(h -> h.getState() == HostState.Enabled) + .filter(h -> h.getStatus() == HostStatus.Connected) .collect(Collectors.toList()); - if (CollectionUtils.isNotEmpty(filteredHost)) { - next(filteredHost); + // Check if current cluster has sufficient resources + boolean clusterHasAvailableHosts = CollectionUtils.isNotEmpty(hostsInCurrentCluster); + + if (clusterHasAvailableHosts) { + // Truth table #5, #7: Current cluster has available hosts, migrate successfully + next(hostsInCurrentCluster); return; } - if (rcf.getResourceConfigValue(VmGlobalConfig.RESOURCE_BINDING_STRATEGY, spec.getVmInstance().getUuid(), String.class) - .equals(ResourceBindingStrategy.Soft.toString())) { + // Current cluster has no resources, decide behavior based on strategy + String strategy = rcf.getResourceConfigValue(VmGlobalConfig.RESOURCE_BINDING_STRATEGY, vmUuid, String.class); + + if (ResourceBindingStrategy.Soft.toString().equals(strategy)) { + // Truth table #8: Soft strategy, try other clusters next(candidates); } else { - fail(Platform.operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10005, "no available host found with binded resource %s", resources)); + // Truth table #6: Hard strategy, fail + fail(Platform.operr(ORG_ZSTACK_COMPUTE_ALLOCATOR_10005, + "no available host found in current cluster [uuid:%s], and vm.ha.across.clusters is disabled with Hard binding strategy", + currentClusterUuid)); } } } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmGlobalConfig.java b/compute/src/main/java/org/zstack/compute/vm/VmGlobalConfig.java index b9b5cfa3ef5..dc39bce94fe 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmGlobalConfig.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmGlobalConfig.java @@ -71,7 +71,7 @@ public class VmGlobalConfig { public static GlobalConfig PCIE_PORT_NUMS = new GlobalConfig(CATEGORY, "pciePortNums"); @GlobalConfigValidation(validValues = {"Hard", "Soft"}) - @BindResourceConfig({VmInstanceVO.class}) + @BindResourceConfig({VmInstanceVO.class, ClusterVO.class}) public static GlobalConfig RESOURCE_BINDING_STRATEGY = new GlobalConfig(CATEGORY, "resourceBinding.strategy"); @GlobalConfigValidation(validValues = {"None", "Preserve","Reboot","Shutdown"}) diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java index 34f2219d193..321c7b3325d 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java @@ -1723,26 +1723,8 @@ public void beforeUpdateExtensionPoint(GlobalConfig oldConfig, String newValue) } }); - ResourceConfig resourceConfig = rcf.getResourceConfig(VmGlobalConfig.VM_HA_ACROSS_CLUSTERS.getIdentity()); - resourceConfig.installUpdateExtension(new ResourceConfigUpdateExtensionPoint() { - @Override - public void updateResourceConfig(ResourceConfig config, String resourceUuid, String resourceType, String oldValue, String newValue) { - if (!VmInstanceVO.class.getSimpleName().equals(resourceType)) - return; - // keep back-compatibility create or delete resource binding tag if needed - if (newValue.equals("false")) { - String clusterUuid = Q.New(VmInstanceVO.class).select(VmInstanceVO_.clusterUuid) - .eq(VmInstanceVO_.uuid, resourceUuid).findValue(); - String token = String.format("Cluster:%s", clusterUuid); - SystemTagCreator creator = VmSystemTags.VM_RESOURCE_BINGDING.newSystemTagCreator(resourceUuid); - creator.recreate = true; - creator.setTagByTokens(map(e(VmSystemTags.VM_RESOURCE_BINGDING_TOKEN, token))); - creator.create(); - } else { - VmSystemTags.VM_RESOURCE_BINGDING.delete(resourceUuid); - } - } - }); + // Note: VM_RESOURCE_BINGDING tag is silently deprecated (ZSTAC-75428) + // The tag data is preserved but no longer read or written by the new ResourceBindingAllocatorFlow } private void installHostnameValidator() { diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/migrate/ResourceBindingAllocatorFlowCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/migrate/ResourceBindingAllocatorFlowCase.groovy new file mode 100644 index 00000000000..94d808c4325 --- /dev/null +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/migrate/ResourceBindingAllocatorFlowCase.groovy @@ -0,0 +1,475 @@ +package org.zstack.test.integration.kvm.vm.migrate + +import org.zstack.compute.vm.VmGlobalConfig +import org.zstack.header.vm.VmInstanceState +import org.zstack.header.vm.VmInstanceVO +import org.zstack.sdk.ClusterInventory +import org.zstack.sdk.HostInventory +import org.zstack.sdk.MigrateVmAction +import org.zstack.sdk.VmInstanceInventory +import org.zstack.test.integration.kvm.KvmTest +import org.zstack.testlib.EnvSpec +import org.zstack.testlib.SubCase +import org.zstack.utils.data.SizeUnit + +/** + * Test ResourceBindingAllocatorFlow truth table (8 combinations) + * + * | # | vm.ha.across.clusters | resourceBinding.strategy | Cluster Has Resources | Expected Behavior | + * |---|----------------------|-------------------------|----------------------|-------------------| + * | 1 | true | Hard | true | Migrate Freely | + * | 2 | true | Hard | false | Migrate Freely | + * | 3 | true | Soft | true | Migrate Freely | + * | 4 | true | Soft | false | Migrate Freely | + * | 5 | false | Hard | true | Migrate in Current Cluster | + * | 6 | false | Hard | false | Fail | + * | 7 | false | Soft | true | Migrate in Current Cluster | + * | 8 | false | Soft | false | Try Other Clusters | + * + * ZSTAC-75428 + */ +class ResourceBindingAllocatorFlowCase extends SubCase { + EnvSpec env + + @Override + void clean() { + env.delete() + } + + @Override + void setup() { + useSpring(KvmTest.springSpec) + } + + @Override + void environment() { + env = env { + instanceOffering { + name = "instanceOffering" + memory = SizeUnit.GIGABYTE.toByte(8) + cpu = 4 + } + + sftpBackupStorage { + name = "sftp" + url = "/sftp" + username = "root" + password = "password" + hostname = "localhost" + + image { + name = "image1" + url = "http://zstack.org/download/test.qcow2" + } + } + + zone { + name = "zone" + description = "test" + + cluster { + name = "cluster1" + hypervisorType = "KVM" + + kvm { + name = "host1" + managementIp = "127.0.0.1" + username = "root" + password = "password" + } + + kvm { + name = "host2" + managementIp = "127.0.0.2" + username = "root" + password = "password" + } + + attachPrimaryStorage("nfs") + attachL2Network("l2") + } + + cluster { + name = "cluster2" + hypervisorType = "KVM" + + kvm { + name = "host3" + managementIp = "127.0.0.3" + username = "root" + password = "password" + } + + attachPrimaryStorage("nfs") + attachL2Network("l2") + } + + nfsPrimaryStorage { + name = "nfs" + url = "localhost:/nfs" + } + + l2NoVlanNetwork { + name = "l2" + physicalInterface = "eth0" + + l3Network { + name = "l3" + + ip { + startIp = "192.168.100.10" + endIp = "192.168.100.100" + netmask = "255.255.255.0" + gateway = "192.168.100.1" + } + } + } + + attachBackupStorage("sftp") + } + + vm { + name = "vm" + useInstanceOffering("instanceOffering") + useImage("image1") + useL3Networks("l3") + useCluster("cluster1") + useHost("host1") + } + } + } + + @Override + void test() { + env.create { + // Truth table #1-4: vm.ha.across.clusters = true + testCase1_AcrossTrue_Hard_ResourceTrue() + testCase2_AcrossTrue_Hard_ResourceFalse() + testCase3_AcrossTrue_Soft_ResourceTrue() + testCase4_AcrossTrue_Soft_ResourceFalse() + + // Truth table #5-8: vm.ha.across.clusters = false + testCase5_AcrossFalse_Hard_ResourceTrue() + testCase6_AcrossFalse_Hard_ResourceFalse() + testCase7_AcrossFalse_Soft_ResourceTrue() + testCase8_AcrossFalse_Soft_ResourceFalse() + } + } + + // #1: across=true, strategy=Hard, resource=true -> Migrate Freely + void testCase1_AcrossTrue_Hard_ResourceTrue() { + VmInstanceInventory vm = env.inventoryByName("vm") as VmInstanceInventory + HostInventory host2 = env.inventoryByName("host2") as HostInventory + HostInventory host3 = env.inventoryByName("host3") as HostInventory + + updateGlobalConfig { + category = VmGlobalConfig.CATEGORY + name = "vm.ha.across.clusters" + value = "true" + } + updateGlobalConfig { + category = VmGlobalConfig.CATEGORY + name = "resourceBinding.strategy" + value = "Hard" + } + + // Can migrate to host2 (same cluster) + migrateVm { + vmInstanceUuid = vm.uuid + hostUuid = host2.uuid + } + assert dbFindByUuid(vm.uuid, VmInstanceVO.class).hostUuid == host2.uuid + + // Can migrate to host3 (different cluster) + migrateVm { + vmInstanceUuid = vm.uuid + hostUuid = host3.uuid + } + assert dbFindByUuid(vm.uuid, VmInstanceVO.class).hostUuid == host3.uuid + + // Reset VM to host1 + resetVmToHost1(vm) + } + + // #2: across=true, strategy=Hard, resource=false -> Migrate Freely + void testCase2_AcrossTrue_Hard_ResourceFalse() { + VmInstanceInventory vm = env.inventoryByName("vm") as VmInstanceInventory + HostInventory host2 = env.inventoryByName("host2") as HostInventory + HostInventory host3 = env.inventoryByName("host3") as HostInventory + + updateGlobalConfig { + category = VmGlobalConfig.CATEGORY + name = "vm.ha.across.clusters" + value = "true" + } + updateGlobalConfig { + category = VmGlobalConfig.CATEGORY + name = "resourceBinding.strategy" + value = "Hard" + } + + // Disable host2 to simulate resource=false in current cluster + changeHostState { + uuid = host2.uuid + stateEvent = "disable" + } + + // Can still migrate to host3 (different cluster) + migrateVm { + vmInstanceUuid = vm.uuid + hostUuid = host3.uuid + } + assert dbFindByUuid(vm.uuid, VmInstanceVO.class).hostUuid == host3.uuid + + // Re-enable host2 + changeHostState { + uuid = host2.uuid + stateEvent = "enable" + } + + // Reset VM to host1 + resetVmToHost1(vm) + } + + // #3: across=true, strategy=Soft, resource=true -> Migrate Freely + void testCase3_AcrossTrue_Soft_ResourceTrue() { + VmInstanceInventory vm = env.inventoryByName("vm") as VmInstanceInventory + HostInventory host2 = env.inventoryByName("host2") as HostInventory + HostInventory host3 = env.inventoryByName("host3") as HostInventory + + updateGlobalConfig { + category = VmGlobalConfig.CATEGORY + name = "vm.ha.across.clusters" + value = "true" + } + updateGlobalConfig { + category = VmGlobalConfig.CATEGORY + name = "resourceBinding.strategy" + value = "Soft" + } + + // Can migrate to host2 (same cluster) + migrateVm { + vmInstanceUuid = vm.uuid + hostUuid = host2.uuid + } + assert dbFindByUuid(vm.uuid, VmInstanceVO.class).hostUuid == host2.uuid + + // Can migrate to host3 (different cluster) + migrateVm { + vmInstanceUuid = vm.uuid + hostUuid = host3.uuid + } + assert dbFindByUuid(vm.uuid, VmInstanceVO.class).hostUuid == host3.uuid + + // Reset VM to host1 + resetVmToHost1(vm) + } + + // #4: across=true, strategy=Soft, resource=false -> Migrate Freely + void testCase4_AcrossTrue_Soft_ResourceFalse() { + VmInstanceInventory vm = env.inventoryByName("vm") as VmInstanceInventory + HostInventory host2 = env.inventoryByName("host2") as HostInventory + HostInventory host3 = env.inventoryByName("host3") as HostInventory + + updateGlobalConfig { + category = VmGlobalConfig.CATEGORY + name = "vm.ha.across.clusters" + value = "true" + } + updateGlobalConfig { + category = VmGlobalConfig.CATEGORY + name = "resourceBinding.strategy" + value = "Soft" + } + + // Disable host2 to simulate resource=false in current cluster + changeHostState { + uuid = host2.uuid + stateEvent = "disable" + } + + // Can still migrate to host3 (different cluster) + migrateVm { + vmInstanceUuid = vm.uuid + hostUuid = host3.uuid + } + assert dbFindByUuid(vm.uuid, VmInstanceVO.class).hostUuid == host3.uuid + + // Re-enable host2 + changeHostState { + uuid = host2.uuid + stateEvent = "enable" + } + + // Reset VM to host1 + resetVmToHost1(vm) + } + + // #5: across=false, strategy=Hard, resource=true -> Migrate in Current Cluster + void testCase5_AcrossFalse_Hard_ResourceTrue() { + VmInstanceInventory vm = env.inventoryByName("vm") as VmInstanceInventory + HostInventory host2 = env.inventoryByName("host2") as HostInventory + HostInventory host3 = env.inventoryByName("host3") as HostInventory + ClusterInventory cluster1 = env.inventoryByName("cluster1") as ClusterInventory + + updateGlobalConfig { + category = VmGlobalConfig.CATEGORY + name = "vm.ha.across.clusters" + value = "false" + } + updateGlobalConfig { + category = VmGlobalConfig.CATEGORY + name = "resourceBinding.strategy" + value = "Hard" + } + + // Can migrate to host2 (same cluster) + migrateVm { + vmInstanceUuid = vm.uuid + hostUuid = host2.uuid + } + VmInstanceVO vmvo = dbFindByUuid(vm.uuid, VmInstanceVO.class) + assert vmvo.hostUuid == host2.uuid + assert vmvo.clusterUuid == cluster1.uuid + + // Cannot migrate to host3 (different cluster) + MigrateVmAction action = new MigrateVmAction() + action.vmInstanceUuid = vm.uuid + action.hostUuid = host3.uuid + action.sessionId = adminSession() + MigrateVmAction.Result ret = action.call() + assert ret.error != null + + // Reset VM to host1 + resetVmToHost1(vm) + } + + // #6: across=false, strategy=Hard, resource=false -> Fail + void testCase6_AcrossFalse_Hard_ResourceFalse() { + VmInstanceInventory vm = env.inventoryByName("vm") as VmInstanceInventory + HostInventory host2 = env.inventoryByName("host2") as HostInventory + + updateGlobalConfig { + category = VmGlobalConfig.CATEGORY + name = "vm.ha.across.clusters" + value = "false" + } + updateGlobalConfig { + category = VmGlobalConfig.CATEGORY + name = "resourceBinding.strategy" + value = "Hard" + } + + // Disable host2 to simulate resource=false in current cluster + changeHostState { + uuid = host2.uuid + stateEvent = "disable" + } + + // Migration should fail (no available host in current cluster) + MigrateVmAction action = new MigrateVmAction() + action.vmInstanceUuid = vm.uuid + action.sessionId = adminSession() + MigrateVmAction.Result ret = action.call() + assert ret.error != null + + // Re-enable host2 + changeHostState { + uuid = host2.uuid + stateEvent = "enable" + } + } + + // #7: across=false, strategy=Soft, resource=true -> Migrate in Current Cluster + void testCase7_AcrossFalse_Soft_ResourceTrue() { + VmInstanceInventory vm = env.inventoryByName("vm") as VmInstanceInventory + HostInventory host2 = env.inventoryByName("host2") as HostInventory + ClusterInventory cluster1 = env.inventoryByName("cluster1") as ClusterInventory + + updateGlobalConfig { + category = VmGlobalConfig.CATEGORY + name = "vm.ha.across.clusters" + value = "false" + } + updateGlobalConfig { + category = VmGlobalConfig.CATEGORY + name = "resourceBinding.strategy" + value = "Soft" + } + + // Can migrate to host2 (same cluster) + migrateVm { + vmInstanceUuid = vm.uuid + hostUuid = host2.uuid + } + VmInstanceVO vmvo = dbFindByUuid(vm.uuid, VmInstanceVO.class) + assert vmvo.hostUuid == host2.uuid + assert vmvo.clusterUuid == cluster1.uuid + + // Reset VM to host1 + resetVmToHost1(vm) + } + + // #8: across=false, strategy=Soft, resource=false -> Try Other Clusters + void testCase8_AcrossFalse_Soft_ResourceFalse() { + VmInstanceInventory vm = env.inventoryByName("vm") as VmInstanceInventory + HostInventory host2 = env.inventoryByName("host2") as HostInventory + HostInventory host3 = env.inventoryByName("host3") as HostInventory + ClusterInventory cluster2 = env.inventoryByName("cluster2") as ClusterInventory + + updateGlobalConfig { + category = VmGlobalConfig.CATEGORY + name = "vm.ha.across.clusters" + value = "false" + } + updateGlobalConfig { + category = VmGlobalConfig.CATEGORY + name = "resourceBinding.strategy" + value = "Soft" + } + + // Disable host2 to simulate resource=false in current cluster + changeHostState { + uuid = host2.uuid + stateEvent = "disable" + } + + // Can migrate to host3 (different cluster, soft strategy allows fallback) + migrateVm { + vmInstanceUuid = vm.uuid + hostUuid = host3.uuid + } + VmInstanceVO vmvo = dbFindByUuid(vm.uuid, VmInstanceVO.class) + assert vmvo.hostUuid == host3.uuid + assert vmvo.clusterUuid == cluster2.uuid + + // Re-enable host2 + changeHostState { + uuid = host2.uuid + stateEvent = "enable" + } + + // Reset VM to host1 + resetVmToHost1(vm) + } + + private void resetVmToHost1(VmInstanceInventory vm) { + HostInventory host1 = env.inventoryByName("host1") as HostInventory + + // Temporarily enable cross-cluster to reset + updateGlobalConfig { + category = VmGlobalConfig.CATEGORY + name = "vm.ha.across.clusters" + value = "true" + } + + VmInstanceVO vmvo = dbFindByUuid(vm.uuid, VmInstanceVO.class) + if (vmvo.hostUuid != host1.uuid) { + migrateVm { + vmInstanceUuid = vm.uuid + hostUuid = host1.uuid + } + } + } +} From 2b44646dd71724edb05158e0dd8cb4128cbd3f55 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Tue, 3 Feb 2026 00:15:06 +0800 Subject: [PATCH 726/737] [dependency]: Fix telemetry dependencies issue Related: ZSTAC-67534 Change-Id: I677475706d7a66626569706f7163616c7a6c7067 Signed-off-by: AlanJager --- build/pom.xml | 10 ++-------- core/pom.xml | 8 +------- docs/TELEMETRY_SPECIFICATION.md | 2 +- pom.xml | 4 ++-- 4 files changed, 6 insertions(+), 18 deletions(-) diff --git a/build/pom.xml b/build/pom.xml index bb55c36cce8..2b231c4b952 100755 --- a/build/pom.xml +++ b/build/pom.xml @@ -726,14 +726,8 @@ io.sentry sentry-opentelemetry-core - - - io.sentry - sentry-opentelemetry-bootstrap - - - - + + io.opentelemetry opentelemetry-semconv diff --git a/core/pom.xml b/core/pom.xml index 701fd40f057..bbe8ba68e80 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -141,7 +141,7 @@ io.sentry sentry - + io.opentelemetry @@ -183,12 +183,6 @@ io.sentry sentry-opentelemetry-core - - - io.sentry - sentry-opentelemetry-bootstrap - - io.opentelemetry.semconv diff --git a/docs/TELEMETRY_SPECIFICATION.md b/docs/TELEMETRY_SPECIFICATION.md index 884f0317daf..6f0f5398c46 100644 --- a/docs/TELEMETRY_SPECIFICATION.md +++ b/docs/TELEMETRY_SPECIFICATION.md @@ -1189,7 +1189,7 @@ telemetry: ### B.1 前置条件 - 已拿到 Sentry 项目的 **DSN**(形如 `https://xxx@xxx.ingest.sentry.io/xxx`)。 -- 管理节点 classpath 中包含 `sentry`、`sentry-opentelemetry-core`(根 `pom.xml` 的 dependencyManagement 中已声明,build 打包时会带入 WEB-INF/lib)。**注意**:`sentry-opentelemetry-bootstrap` 已被显式排除,以避免其抢先注册 GlobalOpenTelemetry,导致与 ZStack 自建的 TracerProvider(含 Sentry exporter)冲突。 +- 管理节点 classpath 中包含 `sentry`、`sentry-opentelemetry-core`、`sentry-opentelemetry-bootstrap`(根 `pom.xml` 的 dependencyManagement 中已声明,build 打包时会带入 WEB-INF/lib)。bootstrap 提供 `SentryWeakSpanStorage` 等运行时所需类。同时需使用 legacy semconv 1.23.1-alpha(`io.opentelemetry:opentelemetry-semconv`),以提供 bootstrap 所需的顶层 `io.opentelemetry.semconv.SemanticAttributes`。 ### B.2 配置步骤 diff --git a/pom.xml b/pom.xml index 29c4276b2cf..5173ad0aef2 100755 --- a/pom.xml +++ b/pom.xml @@ -556,11 +556,11 @@ opentelemetry-semconv 1.37.0 - + io.opentelemetry opentelemetry-semconv - 1.30.1-alpha + 1.23.1-alpha From 0ef0249a2511549a08b420cde8de4061a8740ae8 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 2 Feb 2026 22:07:35 +0800 Subject: [PATCH 727/737] [sdk]: Update sdk Resolves: ZSTAC-81363 Change-Id: I61646d716d666d67626a6d797a7467646d6c6579 Signed-off-by: AlanJager --- .../java/org/zstack/sdk/GetMdevDeviceCandidatesAction.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/GetMdevDeviceCandidatesAction.java b/sdk/src/main/java/org/zstack/sdk/GetMdevDeviceCandidatesAction.java index 512a7682c84..2d83911f657 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetMdevDeviceCandidatesAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetMdevDeviceCandidatesAction.java @@ -37,6 +37,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List types; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer minAvailableDevicesPerHost; + @Param(required = false) public java.util.List systemTags; From afbe3180d2f27229d9caeeae9ce5bc3010f33028 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 2 Feb 2026 21:45:41 +0800 Subject: [PATCH 728/737] [sdk]: Update sdk Resolves: ZSTAC-81296 Change-Id: I78616c656e6a6877707a716e636670636e66726a Signed-off-by: AlanJager --- .../org/zstack/sdk/DeployAppDevelopmentServiceAction.java | 3 +++ .../java/org/zstack/sdk/DeployModelEvalServiceAction.java | 3 +++ .../java/org/zstack/sdk/DeployModelServiceAction.java | 3 +++ .../sdk/MatchModelServiceTemplateWithModelAction.java | 3 +++ sdk/src/main/java/org/zstack/sdk/ModelService.java | 8 ++++++++ sdk/src/main/java/org/zstack/sdk/ZSClient.java | 4 ++++ .../utils/clouderrorcode/CloudOperationsErrorCode.java | 2 ++ 7 files changed, 26 insertions(+) diff --git a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java index 73ded5ce784..0d4ef73088b 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java @@ -91,6 +91,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Long rootDiskSize; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String projectUuid; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java index 17b8d940062..f29c06a748e 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java @@ -142,6 +142,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Long rootDiskSize; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String projectUuid; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java index 1b195ea5674..105e7083ae2 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java @@ -91,6 +91,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Long rootDiskSize; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String projectUuid; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java b/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java index 6214024011c..7c0eca70894 100644 --- a/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java @@ -100,6 +100,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Long rootDiskSize; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String projectUuid; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelService.java b/sdk/src/main/java/org/zstack/sdk/ModelService.java index cc765e67495..32cb11e9495 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelService.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelService.java @@ -204,6 +204,14 @@ public java.lang.Long getRootDiskSize() { return this.rootDiskSize; } + public java.lang.String projectUuid; + public void setProjectUuid(java.lang.String projectUuid) { + this.projectUuid = projectUuid; + } + public java.lang.String getProjectUuid() { + return this.projectUuid; + } + public SessionInventory session; public void setSession(SessionInventory session) { this.session = session; diff --git a/sdk/src/main/java/org/zstack/sdk/ZSClient.java b/sdk/src/main/java/org/zstack/sdk/ZSClient.java index 882284e45c6..650369b19ac 100755 --- a/sdk/src/main/java/org/zstack/sdk/ZSClient.java +++ b/sdk/src/main/java/org/zstack/sdk/ZSClient.java @@ -117,6 +117,10 @@ public ErrorCode deserialize(JsonElement jsonElement, Type type, JsonDeserializa if (item != null && item.isJsonObject()) { wrapper.setOpaque(context.deserialize(item, LinkedHashMap.class)); } + item = object.get("globalErrorCode"); + if (item != null && item.isJsonPrimitive()) { + wrapper.setGlobalErrorCode(item.getAsString()); + } return wrapper; } } diff --git a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java index 588e295de1f..11f846a94f3 100644 --- a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java +++ b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java @@ -10702,6 +10702,8 @@ public class CloudOperationsErrorCode { public static final String ORG_ZSTACK_AI_CONTAINER_10025 = "ORG_ZSTACK_AI_CONTAINER_10025"; + public static final String ORG_ZSTACK_AI_CONTAINER_10026 = "ORG_ZSTACK_AI_CONTAINER_10026"; + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10000 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10000"; public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10001 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10001"; From c81ebc7e6d1cdc16beb8aadd39d791162b20e7a9 Mon Sep 17 00:00:00 2001 From: "lin.ma" Date: Tue, 3 Feb 2026 18:01:38 +0800 Subject: [PATCH 729/737] [vm]: change `resourceBinding.strategy` default value to `Soft` Resolves: ZSTAC-81821 Change-Id: I72796d6675766c7977737a736c77716b70707a74 --- conf/globalConfig/vm.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/globalConfig/vm.xml b/conf/globalConfig/vm.xml index 0d4a1744e1d..a7f835c82ee 100755 --- a/conf/globalConfig/vm.xml +++ b/conf/globalConfig/vm.xml @@ -225,7 +225,7 @@ resourceBinding.strategy Strategy of resource binding - Hard + Soft vm java.lang.String From 011d3214568622b9edf2ca2fec43944a0b774369 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Tue, 3 Feb 2026 18:07:54 +0800 Subject: [PATCH 730/737] [image]: Allow suspend add image long job Resolves: ZSTAC-81931 Change-Id: I77686b62617062747564646d776173716175646b Signed-off-by: AlanJager --- .../global-error-en_US.json | 1 + .../global-error-zh_CN.json | 1 + .../java/org/zstack/image/AddImageLongJob.java | 16 ++++++++++++++++ .../clouderrorcode/CloudOperationsErrorCode.java | 2 ++ 4 files changed, 20 insertions(+) diff --git a/conf/i18n/globalErrorCodeMapping/global-error-en_US.json b/conf/i18n/globalErrorCodeMapping/global-error-en_US.json index bc347c410c5..32eb4c8f056 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-en_US.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-en_US.json @@ -2886,6 +2886,7 @@ "ORG_ZSTACK_AI_CONTAINER_10023": "Invalid Kubernetes deployment YAML: %s", "ORG_ZSTACK_AI_CONTAINER_10020": "failed to patch Kubernetes deployment %s to terminate all pods", "ORG_ZSTACK_AI_CONTAINER_10025": "model service instance group %s not found in the database", + "ORG_ZSTACK_AI_CONTAINER_10026": "Unable to get cluster info; please sync container management endpoint or wait for auto sync and retry", "ORG_ZSTACK_AI_CONTAINER_10024": "failed to patch k8s deployment %s", "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10039": "fails to create root volume[uuid:%s] from cached image[path:%s] because of an error in virtualization environment", "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10040": "originText or certificateText cannot be null", diff --git a/conf/i18n/globalErrorCodeMapping/global-error-zh_CN.json b/conf/i18n/globalErrorCodeMapping/global-error-zh_CN.json index d9c6767a4aa..84609838ddc 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-zh_CN.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-zh_CN.json @@ -2886,6 +2886,7 @@ "ORG_ZSTACK_AI_CONTAINER_10023": "无效的K8s部署YAML: %s", "ORG_ZSTACK_AI_CONTAINER_10020": "失败将 Kubernetes 部署 %s 中的所有 Pod 删除", "ORG_ZSTACK_AI_CONTAINER_10025": "模型服务实例组 %s 在数据库中未找到", + "ORG_ZSTACK_AI_CONTAINER_10026": "无法获取集群信息,请先执行同步容器管理端点或等待自动同步后再重试", "ORG_ZSTACK_AI_CONTAINER_10024": "失败修补 Kubernetes 部署 %s", "ORG_ZSTACK_STORAGE_PRIMARY_NFS_10039": "失败从缓存镜像[path:%s]创建根卷[uuid:%s]的原因是%s", "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_10040": "originText 或 certificateText 不能为 null", diff --git a/image/src/main/java/org/zstack/image/AddImageLongJob.java b/image/src/main/java/org/zstack/image/AddImageLongJob.java index b2db55f5a67..7e287e69e50 100644 --- a/image/src/main/java/org/zstack/image/AddImageLongJob.java +++ b/image/src/main/java/org/zstack/image/AddImageLongJob.java @@ -17,7 +17,9 @@ import org.zstack.header.image.*; import org.zstack.header.longjob.LongJob; import org.zstack.header.longjob.LongJobFor; +import org.zstack.header.longjob.LongJobState; import org.zstack.header.longjob.LongJobVO; +import org.zstack.header.longjob.LongJobVO_; import org.zstack.header.longjob.UseApiTimeout; import org.zstack.header.message.APIEvent; import org.zstack.header.message.MessageReply; @@ -71,6 +73,11 @@ class AddImageCompletion extends ReturnValueCompletion @Override public void success(ImageInventory image) { if (done.compareAndSet(false, true)) { + LongJobState state = Q.New(LongJobVO.class).eq(LongJobVO_.uuid, job.getUuid()).select(LongJobVO_.state).findValue(); + // Image upload long job suspend only changes job state; if upload completes while suspended, do not complete here so resume() can re-track and finish + if (state == LongJobState.Suspended) { + return; + } event.setInventory(image); job = setJobResult(job.getUuid(), event); completion.success(event); @@ -180,6 +187,15 @@ private void handleSuccess(MessageReply reply) { }); } + /** + * Image upload suspend only sets long job state to Suspended; no pause request is sent to backup storage. + * The underlying upload may still be in progress; resume() re-tracks progress and completes the job. + */ + @Override + public void suspend(LongJobVO job, ReturnValueCompletion completion) { + completion.success(Boolean.TRUE); + } + @Override public void resume(LongJobVO job, ReturnValueCompletion completion) { AddImageMsg msg = JSONObjectUtil.toObject(job.getJobData(), AddImageMsg.class); diff --git a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java index 588e295de1f..11f846a94f3 100644 --- a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java +++ b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java @@ -10702,6 +10702,8 @@ public class CloudOperationsErrorCode { public static final String ORG_ZSTACK_AI_CONTAINER_10025 = "ORG_ZSTACK_AI_CONTAINER_10025"; + public static final String ORG_ZSTACK_AI_CONTAINER_10026 = "ORG_ZSTACK_AI_CONTAINER_10026"; + public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10000 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10000"; public static final String ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10001 = "ORG_ZSTACK_CLOUDFORMATION_TEMPLATE_FUNCTION_10001"; From 0f615b60b99b0a3553f1fbb564ab8810ce4d2cc8 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Wed, 4 Feb 2026 13:08:45 +0800 Subject: [PATCH 731/737] [longjob]: Introduce long job state and progerss notification GlobalConfigImpact Resolves: ZSTAC-81237 Change-Id: I7a6f6273626e766778686d756a737771636f616d Signed-off-by: AlanJager --- conf/globalConfig/longJob.xml | 14 +++ .../core/progress/ProgressReportService.java | 11 +- .../ProgressUpdateExtensionPoint.java | 9 ++ .../LongJobProgressNotificationMessage.java | 105 ++++++++++++++++++ .../zstack/longjob/LongJobGlobalConfig.java | 3 + .../longjob/sns/LongJobTaskTracker.java | 36 ++++++ 6 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 header/src/main/java/org/zstack/header/core/progress/ProgressUpdateExtensionPoint.java create mode 100644 header/src/main/java/org/zstack/header/longjob/LongJobProgressNotificationMessage.java create mode 100644 longjob/src/main/java/org/zstack/longjob/sns/LongJobTaskTracker.java diff --git a/conf/globalConfig/longJob.xml b/conf/globalConfig/longJob.xml index 9a89c741a37..bb3611190b2 100644 --- a/conf/globalConfig/longJob.xml +++ b/conf/globalConfig/longJob.xml @@ -7,4 +7,18 @@ 259200 java.lang.Long + + longJob + progress.notification.enabled + enable long job progress notification to SNS for UI + true + java.lang.Boolean + + + longJob + progress.notification.timeliness + batch delay in seconds for long job progress notification (0 = no delay) + 1 + java.lang.Integer + \ No newline at end of file diff --git a/core/src/main/java/org/zstack/core/progress/ProgressReportService.java b/core/src/main/java/org/zstack/core/progress/ProgressReportService.java index 0ec682d80eb..edb339fbb0e 100755 --- a/core/src/main/java/org/zstack/core/progress/ProgressReportService.java +++ b/core/src/main/java/org/zstack/core/progress/ProgressReportService.java @@ -6,6 +6,7 @@ import org.springframework.transaction.annotation.Transactional; import org.zstack.core.Platform; import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.cloudbus.MessageSafe; import org.zstack.core.config.GlobalConfig; import org.zstack.core.config.GlobalConfigUpdateExtensionPoint; @@ -376,7 +377,7 @@ public static void createSubTaskProgress(String fmt, Object... args) { vo.setManagementUuid(Platform.getManagementServerId()); vo.setTaskName(ThreadContext.get(Constants.THREAD_CONTEXT_TASK_NAME)); - Platform.getComponentLoader().getComponent(DatabaseFacade.class).persist(vo); + persistProgress(vo, TaskType.Task); // use content as the subtask name ThreadContext.put(Constants.THREAD_CONTEXT_TASK_NAME, vo.getContent()); @@ -411,6 +412,14 @@ private static void persistProgress(TaskProgressVO vo, TaskType type) { } Platform.getComponentLoader().getComponent(DatabaseFacade.class).persist(vo); + + for (ProgressUpdateExtensionPoint ext : Platform.getComponentLoader().getComponent(PluginRegistry.class).getExtensionList(ProgressUpdateExtensionPoint.class)) { + try { + ext.afterProgressPersisted(vo); + } catch (Throwable t) { + logger.warn("ProgressUpdateExtensionPoint.afterProgressPersisted failed", t); + } + } } private static void taskProgress(TaskType type, String fmt, Object... args) { diff --git a/header/src/main/java/org/zstack/header/core/progress/ProgressUpdateExtensionPoint.java b/header/src/main/java/org/zstack/header/core/progress/ProgressUpdateExtensionPoint.java new file mode 100644 index 00000000000..dc9b9121af2 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/progress/ProgressUpdateExtensionPoint.java @@ -0,0 +1,9 @@ +package org.zstack.header.core.progress; + +/** + * Extension point invoked after a task progress record is persisted. + * Used to trigger downstream notifications (e.g. Long Job progress to SNS) without coupling to progress storage. + */ +public interface ProgressUpdateExtensionPoint { + void afterProgressPersisted(TaskProgressVO vo); +} diff --git a/header/src/main/java/org/zstack/header/longjob/LongJobProgressNotificationMessage.java b/header/src/main/java/org/zstack/header/longjob/LongJobProgressNotificationMessage.java new file mode 100644 index 00000000000..802f3b2b3fa --- /dev/null +++ b/header/src/main/java/org/zstack/header/longjob/LongJobProgressNotificationMessage.java @@ -0,0 +1,105 @@ +package org.zstack.header.longjob; + +import org.zstack.header.core.progress.TaskProgressInventory; +import org.zstack.header.core.progress.TaskProgressVO; + +import java.io.Serializable; + +/** + * Notification message for Long Job state change and progress update. + * Reuses LongJobInventory and TaskProgressInventory for UI consistency. + * + *

Webhook/BFF contract: the payload should include a 0-100 progress number. + * BFF uses {@link #getProgress()} (Integer) directly; full taskProgress is optional for future use. + */ +public class LongJobProgressNotificationMessage implements Serializable { + public enum EventType { + STATE_CHANGED, + PROGRESS_UPDATED + } + + private LongJobInventory longJob; + /** Latest progress 0-100, derived from type=Progress latest record content. For BFF webhook. */ + private Integer progress; + /** Full progress detail; optional, BFF current version only needs {@link #getProgress()}. */ + private TaskProgressInventory taskProgress; + private EventType eventType; + private Long timestamp; + + public LongJobInventory getLongJob() { + return longJob; + } + + public void setLongJob(LongJobInventory longJob) { + this.longJob = longJob; + } + + /** Progress 0-100 for BFF webhook; from latest type=Progress content. */ + public Integer getProgress() { + return progress; + } + + public void setProgress(Integer progress) { + this.progress = progress; + } + + /** Full task progress inventory; optional for BFF. */ + public TaskProgressInventory getTaskProgress() { + return taskProgress; + } + + public void setTaskProgress(TaskProgressInventory taskProgress) { + this.taskProgress = taskProgress; + } + + public EventType getEventType() { + return eventType; + } + + public void setEventType(EventType eventType) { + this.eventType = eventType; + } + + public Long getTimestamp() { + return timestamp; + } + + public void setTimestamp(Long timestamp) { + this.timestamp = timestamp; + } + + public static LongJobProgressNotificationMessage stateChanged(LongJobVO vo) { + LongJobProgressNotificationMessage msg = new LongJobProgressNotificationMessage(); + msg.longJob = LongJobInventory.valueOf(vo); + msg.eventType = EventType.STATE_CHANGED; + msg.timestamp = System.currentTimeMillis(); + return msg; + } + + public static LongJobProgressNotificationMessage progressUpdated(LongJobVO vo, TaskProgressVO progressVO) { + LongJobProgressNotificationMessage msg = new LongJobProgressNotificationMessage(); + msg.longJob = LongJobInventory.valueOf(vo); + int percent = parseProgressContent(progressVO.getContent()); + msg.progress = percent; + TaskProgressInventory inv = new TaskProgressInventory(progressVO); + if (progressVO.getContent() != null) { + inv.setContent(progressVO.getContent()); + } + msg.taskProgress = inv; + msg.eventType = EventType.PROGRESS_UPDATED; + msg.timestamp = System.currentTimeMillis(); + return msg; + } + + private static int parseProgressContent(String content) { + if (content == null || content.isEmpty()) { + return 0; + } + try { + int v = Integer.parseInt(content.trim()); + return Math.min(100, Math.max(0, v)); + } catch (NumberFormatException e) { + return 0; + } + } +} diff --git a/longjob/src/main/java/org/zstack/longjob/LongJobGlobalConfig.java b/longjob/src/main/java/org/zstack/longjob/LongJobGlobalConfig.java index 5d8d1af175e..58635bf08ca 100644 --- a/longjob/src/main/java/org/zstack/longjob/LongJobGlobalConfig.java +++ b/longjob/src/main/java/org/zstack/longjob/LongJobGlobalConfig.java @@ -13,4 +13,7 @@ public class LongJobGlobalConfig { @GlobalConfigValidation public static GlobalConfig LONG_JOB_DEFAULT_TIMEOUT = new GlobalConfig(CATEGORY, "longJob.api.timeout"); + + public static GlobalConfig LONG_JOB_PROGRESS_NOTIFICATION_ENABLED = new GlobalConfig(CATEGORY, "progress.notification.enabled"); + public static GlobalConfig LONG_JOB_NOTIFICATION_TIMELINESS = new GlobalConfig(CATEGORY, "progress.notification.timeliness"); } diff --git a/longjob/src/main/java/org/zstack/longjob/sns/LongJobTaskTracker.java b/longjob/src/main/java/org/zstack/longjob/sns/LongJobTaskTracker.java new file mode 100644 index 00000000000..c6155ea4faa --- /dev/null +++ b/longjob/src/main/java/org/zstack/longjob/sns/LongJobTaskTracker.java @@ -0,0 +1,36 @@ +package org.zstack.longjob.sns; + +import org.zstack.core.progress.TaskTracker; +import org.zstack.header.longjob.LongJobVO; + +/** + * Task tracker for Long Job state change and progress update notifications. + * Used by LongJobProgressNotification to receive tasks and publish to SNS. + */ +public class LongJobTaskTracker extends TaskTracker { + public static final String TASK_NAME = "longjob-progress"; + + public static final String PARAM_STATE = "state"; + public static final String PARAM_PROGRESS = "progress"; + public static final String PARAM_LONG_JOB_UUID = "longJobUuid"; + public static final String PARAM_JOB_NAME = "jobName"; + + public enum EventType { + STATE_CHANGED, + PROGRESS_UPDATED + } + + public LongJobTaskTracker(String resourceUuid) { + super(resourceUuid); + } + + @Override + protected String getResourceType() { + return LongJobVO.class.getSimpleName(); + } + + @Override + protected String getTaskName() { + return TASK_NAME; + } +} From 5cdfa2b6f2d70943be08c29fbd7f27269cb7ec0e Mon Sep 17 00:00:00 2001 From: AlanJager Date: Mon, 2 Feb 2026 22:20:40 +0800 Subject: [PATCH 732/737] [schema]: Update sdk and schema Resolves: ZSTAC-81309 Change-Id: I69716d637666776c746570766f687873756d656b Signed-off-by: AlanJager --- conf/db/upgrade/V5.5.6__schema.sql | 6 ++++++ .../sdk/ApplicationDevelopmentServiceInventory.java | 8 ++++++++ .../main/java/org/zstack/sdk/ModelServiceInventory.java | 8 ++++++++ .../zstack/sdk/UpdateModelServiceInstanceGroupAction.java | 3 +++ 4 files changed, 25 insertions(+) diff --git a/conf/db/upgrade/V5.5.6__schema.sql b/conf/db/upgrade/V5.5.6__schema.sql index 44d2bffce53..e90a902f591 100644 --- a/conf/db/upgrade/V5.5.6__schema.sql +++ b/conf/db/upgrade/V5.5.6__schema.sql @@ -119,3 +119,9 @@ CALL ADD_COLUMN('MdevDeviceSpecVO', 'allocatorStrategy', 'varchar(32)', 1, NULL) UPDATE `zstack`.`GpuDeviceSpecVO` SET `allocatorStrategy` = 'FollowGlobal' WHERE `allocatorStrategy` IS NULL; UPDATE `zstack`.`MdevDeviceSpecVO` SET `allocatorStrategy` = 'FollowGlobal' WHERE `allocatorStrategy` IS NULL; + +-- Add version column to ModelServiceVO (entity field was added without schema migration) +CALL ADD_COLUMN('ModelServiceVO', 'version', 'VARCHAR(255)', 1, NULL); + +-- Add packageVersion column to ApplicationDevelopmentServiceVO (ZSTAC-81309) +CALL ADD_COLUMN('ApplicationDevelopmentServiceVO', 'packageVersion', 'VARCHAR(255)', 1, NULL); diff --git a/sdk/src/main/java/org/zstack/sdk/ApplicationDevelopmentServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ApplicationDevelopmentServiceInventory.java index 2bf4b9169a5..4c43e386e9d 100644 --- a/sdk/src/main/java/org/zstack/sdk/ApplicationDevelopmentServiceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ApplicationDevelopmentServiceInventory.java @@ -12,6 +12,14 @@ public java.lang.String getDeploymentStatus() { return this.deploymentStatus; } + public java.lang.String packageVersion; + public void setPackageVersion(java.lang.String packageVersion) { + this.packageVersion = packageVersion; + } + public java.lang.String getPackageVersion() { + return this.packageVersion; + } + public ModelServiceInventory service; public void setService(ModelServiceInventory service) { this.service = service; diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java index 3b0d6495722..6d016f83c48 100644 --- a/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java @@ -140,6 +140,14 @@ public java.lang.String getCondaVersion() { return this.condaVersion; } + public java.lang.String version; + public void setVersion(java.lang.String version) { + this.version = version; + } + public java.lang.String getVersion() { + return this.version; + } + public java.lang.String startCommand; public void setStartCommand(java.lang.String startCommand) { this.startCommand = startCommand; diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java index 6e64701e11a..50aebded739 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java @@ -49,6 +49,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer serviceBootupTime; + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String packageVersion; + @Param(required = false) public java.util.List systemTags; From 350f51c9e3029b4dd3d6418c83d2f493483dbc03 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 6 Feb 2026 14:06:52 +0800 Subject: [PATCH 733/737] [utils]: add error code for Zaku username validation Add ORG_ZSTACK_IAM2_CONTAINER_10010 error code for username validation failure when syncing to Zaku. Resolves: ZSTAC-80568 Change-Id: Ic2824ed15efe07c37d8712719dfeff74dd2d36f3 --- .../zstack/utils/clouderrorcode/CloudOperationsErrorCode.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java index 11f846a94f3..a0f09d4f1e9 100644 --- a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java +++ b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java @@ -5024,6 +5024,8 @@ public class CloudOperationsErrorCode { public static final String ORG_ZSTACK_IAM2_CONTAINER_10009 = "ORG_ZSTACK_IAM2_CONTAINER_10009"; + public static final String ORG_ZSTACK_IAM2_CONTAINER_10010 = "ORG_ZSTACK_IAM2_CONTAINER_10010"; + public static final String ORG_ZSTACK_CORE_SALT_10000 = "ORG_ZSTACK_CORE_SALT_10000"; public static final String ORG_ZSTACK_CORE_SALT_10001 = "ORG_ZSTACK_CORE_SALT_10001"; From b06c2ecf55a1e58350822250d03599520b77b2dc Mon Sep 17 00:00:00 2001 From: "boce.wang" Date: Fri, 6 Feb 2026 17:55:49 +0800 Subject: [PATCH 734/737] [applianceVm]: use nic's own deviceId for bootstrap device name Resolves: ZSTAC-82073 Change-Id: I6868776c3d4ca7e4464e491e976573e00e465ade --- .../org/zstack/appliancevm/ApplianceVmFacadeImpl.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacadeImpl.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacadeImpl.java index 4f760dde458..a690fb7c009 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacadeImpl.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacadeImpl.java @@ -416,8 +416,7 @@ public Map prepareBootstrapInformation(VmInstanceSpec spec) { ret.put(ApplianceVmConstant.BootstrapParams.additionalNics.toString(), extraTos); List additionalNics = reduceNic(spec.getDestNics(), mgmtNic); - // if management nic is not default route nic, choose default route nic as eth1 - int deviceId = 1; + // if management nic is not default route nic, choose default route nic first if (!mto.isDefaultRoute()) { VmNicInventory defaultRouteNic = null; for (VmNicInventory nic : additionalNics) { @@ -428,7 +427,7 @@ public Map prepareBootstrapInformation(VmInstanceSpec spec) { } ApplianceVmNicTO t = new ApplianceVmNicTO(defaultRouteNic); - t.setDeviceName(String.format("eth%s", deviceId)); + t.setDeviceName(String.format("eth1")); t.setDefaultRoute(true); l3NetworkVO = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.uuid, defaultRouteNic.getL3NetworkUuid()).find(); @@ -440,14 +439,13 @@ public Map prepareBootstrapInformation(VmInstanceSpec spec) { t.setPhysicalInterface(l2NetworkVO.getPhysicalInterface()); fillVfNicBootstrapInfo(defaultRouteNic, t); t.setMtu(new MtuGetter().getMtu(l3NetworkVO.getUuid())); - deviceId ++; extraTos.add(t); additionalNics = reduceNic(additionalNics, defaultRouteNic); } for (VmNicInventory nic : additionalNics) { ApplianceVmNicTO nto = new ApplianceVmNicTO(nic); - nto.setDeviceName(String.format("eth%s", deviceId)); + nto.setDeviceName(String.format("eth%s", nic.getDeviceId())); l3NetworkVO = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.uuid, nic.getL3NetworkUuid()).find(); l2NetworkVO = Q.New(L2NetworkVO.class).eq(L2NetworkVO_.uuid, l3NetworkVO.getL2NetworkUuid()).find(); @@ -458,7 +456,6 @@ public Map prepareBootstrapInformation(VmInstanceSpec spec) { fillVfNicBootstrapInfo(nic, nto); nto.setMtu(new MtuGetter().getMtu(l3NetworkVO.getUuid())); extraTos.add(nto); - deviceId ++; } String publicKey = asf.getPublicKey(); From 2167170538c05ae799c551733f2d161254ef8585 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Sun, 8 Feb 2026 00:09:50 +0800 Subject: [PATCH 735/737] [longjob]: clean stale progress on rerun When a failed LongJob is rerun, the old apiId's TaskProgressVO records (containing 100%) were not cleaned up. The new execution would inherit stale progress data, causing the UI to show 100% immediately. Add deleteTaskProgress() for immediate hard-delete and call it before updating apiId in the rerun path. Resolves: ZSTAC-82077 Change-Id: I88a9d8089218a475fdfbe21e451f0947 - Signed-off-by: AlanJager --- .../org/zstack/core/progress/ProgressReportService.java | 8 ++++++++ .../main/java/org/zstack/longjob/LongJobManagerImpl.java | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/core/src/main/java/org/zstack/core/progress/ProgressReportService.java b/core/src/main/java/org/zstack/core/progress/ProgressReportService.java index 0ec682d80eb..abf2aee721e 100755 --- a/core/src/main/java/org/zstack/core/progress/ProgressReportService.java +++ b/core/src/main/java/org/zstack/core/progress/ProgressReportService.java @@ -177,6 +177,14 @@ public void cleanTaskProgress(String apiId) { current + TimeUnit.SECONDS.toMillis(DELETE_DELAY)).update(); } + public void deleteTaskProgress(String apiId) { + if (apiId == null) { + return; + } + + SQL.New(TaskProgressVO.class).eq(TaskProgressVO_.apiId, apiId).hardDelete(); + } + @Override public boolean stop() { return true; diff --git a/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java b/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java index 549d2c5d043..a94c190dbed 100755 --- a/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java +++ b/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java @@ -574,6 +574,13 @@ private void handle(SubmitLongJobMsg msg) { } if (vo != null) { + // clean old progress data immediately before updating apiId, + // otherwise rerun will show stale 100% progress from previous execution + String oldApiId = vo.getApiId(); + if (oldApiId != null) { + progRpt.deleteTaskProgress(oldApiId); + } + vo.setApiId(ThreadContext.getImmutableContext().get(Constants.THREAD_CONTEXT_API)); vo.setState(LongJobState.Waiting); vo.setExecuteTime(null); From 453abd66e288c7275b80a949ad9c3b2a3cbba1c5 Mon Sep 17 00:00:00 2001 From: AlanJager Date: Fri, 6 Feb 2026 11:57:53 +0800 Subject: [PATCH 736/737] [conf]: Upgrade packageVersion DBImpact Resolves: ZSTAC-81309 Change-Id: I6b7461726e6d666161666f7066686f62626c7268 --- conf/db/upgrade/V5.5.6__schema.sql | 50 ++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/conf/db/upgrade/V5.5.6__schema.sql b/conf/db/upgrade/V5.5.6__schema.sql index e90a902f591..867d747dda7 100644 --- a/conf/db/upgrade/V5.5.6__schema.sql +++ b/conf/db/upgrade/V5.5.6__schema.sql @@ -125,3 +125,53 @@ CALL ADD_COLUMN('ModelServiceVO', 'version', 'VARCHAR(255)', 1, NULL); -- Add packageVersion column to ApplicationDevelopmentServiceVO (ZSTAC-81309) CALL ADD_COLUMN('ApplicationDevelopmentServiceVO', 'packageVersion', 'VARCHAR(255)', 1, NULL); + +-- Upgrade application development service version to readable format (e.g. dify:xxx -> 1.11.1 from installPath) +-- ModelServiceVO.version: extract x.y.z from installPath last segment (e.g. dify_1.11.1 -> 1.11.1) +-- ApplicationDevelopmentServiceVO.packageVersion: sync from ModelServiceVO.version when unreadable or null +DROP PROCEDURE IF EXISTS UpgradeApplicationDevelopmentServiceVersion; + +DELIMITER $$ + +CREATE PROCEDURE UpgradeApplicationDevelopmentServiceVersion() +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'UpgradeApplicationDevelopmentServiceVersion failed.'; + END; + + START TRANSACTION; + + -- 1. ModelServiceVO: set version to readable (x.y.z) extracted from installPath for App type with unreadable version + UPDATE `zstack`.`ModelServiceVO` + SET `version` = SUBSTRING_INDEX( + SUBSTRING_INDEX( + TRIM(TRAILING '/' FROM REPLACE(REPLACE(`installPath`, 'file://', ''), 'file:', '')), + '/', -1 + ), '_', -1 + ) + WHERE `type` = 'App' + AND (`version` LIKE '%:%' OR `version` IS NULL OR `version` = '') + AND `installPath` IS NOT NULL AND TRIM(`installPath`) != '' + AND SUBSTRING_INDEX( + SUBSTRING_INDEX( + TRIM(TRAILING '/' FROM REPLACE(REPLACE(`installPath`, 'file://', ''), 'file:', '')), + '/', -1 + ), '_', -1 + ) REGEXP '^[0-9]+\\.[0-9]+'; + + -- 2. ApplicationDevelopmentServiceVO.packageVersion: sync from linked ModelServiceVO.version (join on uuid - JPA TABLE_PER_CLASS inheritance) + UPDATE `zstack`.`ApplicationDevelopmentServiceVO` a + INNER JOIN `zstack`.`ModelServiceInstanceGroupVO` g ON a.`uuid` = g.`uuid` + INNER JOIN `zstack`.`ModelServiceVO` m ON g.`modelServiceUuid` = m.`uuid` + SET a.`packageVersion` = m.`version` + WHERE (a.`packageVersion` IS NULL OR a.`packageVersion` LIKE '%:%') + AND m.`version` IS NOT NULL AND TRIM(m.`version`) != ''; + + COMMIT; +END$$ + +DELIMITER ; +CALL UpgradeApplicationDevelopmentServiceVersion(); +DROP PROCEDURE IF EXISTS UpgradeApplicationDevelopmentServiceVersion; From a2961ce6d366fe5704454569f833d5f6813bfa9d Mon Sep 17 00:00:00 2001 From: J M Date: Thu, 27 Mar 2025 18:05:51 +0800 Subject: [PATCH 737/737] [ansible]: support python3 ansible install Resolves: ZSTAC-73161 Change-Id: I6c74676f6f6b786e616972786a717777797a626f --- conf/tools/install.sh | 24 ++++++++----------- .../core/ansible/AnsibleFacadeImpl.java | 15 ++++++------ 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/conf/tools/install.sh b/conf/tools/install.sh index 2821bc9ab6d..4dd71469a18 100755 --- a/conf/tools/install.sh +++ b/conf/tools/install.sh @@ -10,7 +10,7 @@ fi pypi_path=file://$cwd/../../../static/pypi/simple usage() { - echo "usage:$0 [zstack-cli|zstack-ctl|zstack-dashboard|zstack-ui]" + echo "usage:$0 [zstack-cli|zstack-ctl|zstack-dashboard|zstack-ui|zstack-sys]" exit 1 } @@ -22,24 +22,20 @@ if [ -z $tool ]; then fi install_pip() { - pip --version | grep 7.0.3 >/dev/null || easy_install -i $pypi_path --upgrade pip + pip3.11 --version | grep 22.3.1 >/dev/null || yum install python3.11-pip } -install_virtualenv() { - virtualenv --version | grep 12.1.1 >/dev/null || pip install -i $pypi_path --ignore-installed virtualenv==12.1.1 -} cd $cwd install_pip -install_virtualenv cd /tmp if [ $tool = 'zstack-cli' ]; then CLI_VIRENV_PATH=/var/lib/zstack/virtualenv/zstackcli [ ! -z $force ] && rm -rf $CLI_VIRENV_PATH if [ ! -d "$CLI_VIRENV_PATH" ]; then - virtualenv $CLI_VIRENV_PATH --python=python2.7 + python3.11 -m venv $CLI_VIRENV_PATH if [ $? -ne 0 ]; then rm -rf $CLI_VIRENV_PATH exit 1 @@ -74,13 +70,13 @@ if [ $tool = 'zstack-cli' ]; then elif [ $tool = 'zstack-ctl' ]; then CTL_VIRENV_PATH=/var/lib/zstack/virtualenv/zstackctl - rm -rf $CTL_VIRENV_PATH && virtualenv $CTL_VIRENV_PATH --python=python2.7 || exit 1 + rm -rf $CTL_VIRENV_PATH && python3.11 -m venv $CTL_VIRENV_PATH || exit 1 . $CTL_VIRENV_PATH/bin/activate cd $cwd TMPDIR=/usr/local/zstack/ pip install -i $pypi_path --trusted-host localhost --ignore-installed zstackctl-*.tar.gz || exit 1 - TMPDIR=/usr/local/zstack/ pip install -i $pypi_path --trusted-host localhost --ignore-installed pycrypto==2.6.1 || exit 1 + TMPDIR=/usr/local/zstack/ pip install -i $pypi_path --trusted-host localhost --ignore-installed pycryptodome || exit 1 chmod +x /usr/bin/zstack-ctl - python $CTL_VIRENV_PATH/lib/python2.7/site-packages/zstackctl/generate_zstackctl_bash_completion.py + python $CTL_VIRENV_PATH/lib/python3.11/site-packages/zstackctl/generate_zstackctl_bash_completion.py elif [ $tool = 'zstack-sys' ]; then SYS_VIRENV_PATH=/var/lib/zstack/virtualenv/zstacksys @@ -95,11 +91,11 @@ elif [ $tool = 'zstack-sys' ]; then NEED_INSTALL=true fi if $NEED_INSTALL; then - rm -rf $SYS_VIRENV_PATH && virtualenv $SYS_VIRENV_PATH --python=python2.7 || exit 1 + rm -rf $SYS_VIRENV_PATH && python3.11 -m venv /var/lib/zstack/virtualenv/zstacksys || exit 1 . $SYS_VIRENV_PATH/bin/activate cd $cwd - TMPDIR=/usr/local/zstack/ pip install -i $pypi_path --trusted-host localhost --ignore-installed setuptools==39.2.0 || exit 1 - TMPDIR=/usr/local/zstack/ pip install -i $pypi_path --trusted-host localhost --ignore-installed ansible==4.10.0 || exit 1 + #TMPDIR=/usr/local/zstack/ pip install -i $pypi_path --trusted-host localhost --ignore-installed setuptools==65.5.1 || exit 1 + TMPDIR=/usr/local/zstack/ pip install -i $pypi_path --trusted-host localhost --ignore-installed ansible==9.13.0 || exit 1 cat > /usr/bin/ansible << EOF #! /bin/sh @@ -140,7 +136,7 @@ elif [ $tool = 'zstack-dashboard' ]; then UI_VIRENV_PATH=/var/lib/zstack/virtualenv/zstack-dashboard [ ! -z $force ] && rm -rf $UI_VIRENV_PATH if [ ! -d "$UI_VIRENV_PATH" ]; then - virtualenv $UI_VIRENV_PATH --python=python2.7 + python3.11 -m venv $UI_VIRENV_PATH if [ $? -ne 0 ]; then rm -rf $UI_VIRENV_PATH exit 1 diff --git a/core/src/main/java/org/zstack/core/ansible/AnsibleFacadeImpl.java b/core/src/main/java/org/zstack/core/ansible/AnsibleFacadeImpl.java index d9e40575833..dada8634e59 100755 --- a/core/src/main/java/org/zstack/core/ansible/AnsibleFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/ansible/AnsibleFacadeImpl.java @@ -136,7 +136,7 @@ void init() { "NEED_INSTALL=false; " + "if [ -d /var/lib/zstack/virtualenv/zstacksys ]; then " + ". /var/lib/zstack/virtualenv/zstacksys/bin/activate; " + - "if ! ansible --version | grep -q 'core 2.11.12'; then " + + "if ! ansible --version | grep -q 'core 2.16.14'; then " + "deactivate; " + "NEED_INSTALL=true; " + "fi; " + @@ -144,10 +144,10 @@ void init() { "NEED_INSTALL=true; "+ "fi; " + "if $NEED_INSTALL; then " + - "sudo bash -c 'rm -rf /var/lib/zstack/virtualenv/zstacksys && virtualenv /var/lib/zstack/virtualenv/zstacksys --python=python2.7; "+ + "sudo bash -c 'rm -rf /var/lib/zstack/virtualenv/zstacksys && python3.11 -m venv /var/lib/zstack/virtualenv/zstacksys; "+ ". /var/lib/zstack/virtualenv/zstacksys/bin/activate; "+ - "TMPDIR=/usr/local/zstack/ pip install -i file://%s --trusted-host localhost -I setuptools==39.2.0; "+ - "TMPDIR=/usr/local/zstack/ pip install -i file://%s --trusted-host localhost -I ansible==4.10.0'; "+ + "TMPDIR=/usr/local/zstack/ pip install -i file://%s --trusted-host localhost -I setuptools==65.5.1; "+ + "TMPDIR=/usr/local/zstack/ pip install -i file://%s --trusted-host localhost -I ansible==9.13.0'; "+ "fi" , AnsibleConstant.PYPI_REPO, AnsibleConstant.PYPI_REPO), false); @@ -252,19 +252,20 @@ private void run(Completion completion) { Map arguments = collectArguments(msg); logger.debug(String.format("start running ansible for playbook[%s]", msg.getPlayBookPath())); String executable = msg.getAnsibleExecutable() == null ? AnsibleGlobalProperty.EXECUTABLE : msg.getAnsibleExecutable(); + long timeout = TimeUnit.MILLISECONDS.toSeconds(msg.getTimeout()); try { String output; if (AnsibleGlobalProperty.DEBUG_MODE2) { - output = ShellUtils.run(String.format("bash -c '. /var/lib/zstack/virtualenv/zstacksys/bin/activate; PYTHONPATH=%s timeout %d %s %s -i %s -vvvv --private-key %s -e '\\''%s'\\' | tee -a %s", + output = ShellUtils.run(String.format("bash -c '. /var/lib/zstack/virtualenv/zstacksys/bin/activate; PYTHONPATH=%s timeout %d %s -B %s -i %s -vvvv --private-key %s -e '\\''%s'\\' | tee -a %s", AnsibleConstant.ZSTACKLIB_ROOT, timeout, executable, playBookPath, AnsibleConstant.INVENTORY_FILE, msg.getPrivateKeyFile(), JSONObjectUtil.dumpPretty(arguments), AnsibleConstant.LOG_PATH), AnsibleConstant.ROOT_DIR); } else if (AnsibleGlobalProperty.DEBUG_MODE) { - output = ShellUtils.run(String.format("bash -c '. /var/lib/zstack/virtualenv/zstacksys/bin/activate; PYTHONPATH=%s timeout %d %s %s -i %s -vvvv --private-key %s -e '\\''%s'\\'", + output = ShellUtils.run(String.format("bash -c '. /var/lib/zstack/virtualenv/zstacksys/bin/activate; PYTHONPATH=%s timeout %d %s -B %s -i %s -vvvv --private-key %s -e '\\''%s'\\'", AnsibleConstant.ZSTACKLIB_ROOT, timeout, executable, playBookPath, AnsibleConstant.INVENTORY_FILE, msg.getPrivateKeyFile(), JSONObjectUtil.dumpPretty(arguments)), AnsibleConstant.ROOT_DIR); } else { - output = ShellUtils.run(String.format("bash -c '. /var/lib/zstack/virtualenv/zstacksys/bin/activate; PYTHONPATH=%s timeout %d %s %s -i %s --private-key %s -e '\\''%s'\\'", + output = ShellUtils.run(String.format("bash -c '. /var/lib/zstack/virtualenv/zstacksys/bin/activate; PYTHONPATH=%s timeout %d %s -B %s -i %s --private-key %s -e '\\''%s'\\'", AnsibleConstant.ZSTACKLIB_ROOT, timeout, executable, playBookPath, AnsibleConstant.INVENTORY_FILE, msg.getPrivateKeyFile(), JSONObjectUtil.dumpPretty(arguments)), AnsibleConstant.ROOT_DIR); }